ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwppbmRleCBiMzc2MDA3Li5kZmVjNzU2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC00NCw5ICs0NCw5IEBACiAKIEFnYWluLCBrZWVwIGluIG1pbmQgdGhhdCB0aGlzIGxpc3QgYXNzdW1lcyB5b3UgYXJlIGFscmVhZHkKIGZ1bmN0aW9uYWxseSBydW5uaW5nIGEgTGludXggMi40IGtlcm5lbC4gIEFsc28sIG5vdCBhbGwgdG9vbHMgYXJlCi1uZWNlc3Nhcnkgb24gYWxsIHN5c3RlbXM7IG9idmlvdXNseSwgaWYgeW91IGRvbid0IGhhdmUgYW55IFBDTUNJQSAoUEMKLUNhcmQpIGhhcmR3YXJlLCBmb3IgZXhhbXBsZSwgeW91IHByb2JhYmx5IG5lZWRuJ3QgY29uY2VybiB5b3Vyc2VsZgotd2l0aCBwY21jaWEtY3MuCituZWNlc3Nhcnkgb24gYWxsIHN5c3RlbXM7IG9idmlvdXNseSwgaWYgeW91IGRvbid0IGhhdmUgYW55IElTRE4KK2hhcmR3YXJlLCBmb3IgZXhhbXBsZSwgeW91IHByb2JhYmx5IG5lZWRuJ3QgY29uY2VybiB5b3Vyc2VsZiB3aXRoCitpc2RuNGstdXRpbHMuCiAKIG8gIEdudSBDICAgICAgICAgICAgICAgICAgMi45NS4zICAgICAgICAgICAgICAgICAgIyBnY2MgLS12ZXJzaW9uCiBvICBHbnUgbWFrZSAgICAgICAgICAgICAgIDMuNzkuMSAgICAgICAgICAgICAgICAgICMgbWFrZSAtLXZlcnNpb24KQEAgLTU3LDYgKzU3LDcgQEAKIG8gIGpmc3V0aWxzICAgICAgICAgICAgICAgMS4xLjMgICAgICAgICAgICAgICAgICAgIyBmc2NrLmpmcyAtVgogbyAgcmVpc2VyZnNwcm9ncyAgICAgICAgICAzLjYuMyAgICAgICAgICAgICAgICAgICAjIHJlaXNlcmZzY2sgLVYgMj4mMXxncmVwIHJlaXNlcmZzcHJvZ3MKIG8gIHhmc3Byb2dzICAgICAgICAgICAgICAgMi42LjAgICAgICAgICAgICAgICAgICAgIyB4ZnNfZGIgLVYKK28gIHBjbWNpYXV0aWxzICAgICAgICAgICAgMDA0CiBvICBwY21jaWEtY3MgICAgICAgICAgICAgIDMuMS4yMSAgICAgICAgICAgICAgICAgICMgY2FyZG1nciAtVgogbyAgcXVvdGEtdG9vbHMgICAgICAgICAgICAzLjA5ICAgICAgICAgICAgICAgICAgICAjIHF1b3RhIC1WCiBvICBQUFAgICAgICAgICAgICAgICAgICAgIDIuNC4wICAgICAgICAgICAgICAgICAgICMgcHBwZCAtLXZlcnNpb24KQEAgLTE4NiwxMyArMTg3LDIwIEBACiB3b3JrIGNvcnJlY3RseSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgWEZTIGtlcm5lbCBjb2RlICgyLjYuMCBvcgogbGF0ZXIgaXMgcmVjb21tZW5kZWQsIGR1ZSB0byBzb21lIHNpZ25pZmljYW50IGltcHJvdmVtZW50cykuCiAKK1BDTUNJQXV0aWxzCistLS0tLS0tLS0tLQorCitQQ01DSUF1dGlscyByZXBsYWNlcyBwY21jaWEtY3MgKHNlZSBiZWxvdykuIEl0IHByb3Blcmx5IHNldHMgdXAKK1BDTUNJQSBzb2NrZXRzIGF0IHN5c3RlbSBzdGFydHVwIGFuZCBsb2FkcyB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlcworZm9yIDE2LWJpdCBQQ01DSUEgZGV2aWNlcyBpZiB0aGUga2VybmVsIGlzIG1vZHVsYXJpemVkIGFuZCB0aGUgaG90cGx1Zworc3Vic3lzdGVtIGlzIHVzZWQuCiAKIFBjbWNpYS1jcwogLS0tLS0tLS0tCiAKIFBDTUNJQSAoUEMgQ2FyZCkgc3VwcG9ydCBpcyBub3cgcGFydGlhbGx5IGltcGxlbWVudGVkIGluIHRoZSBtYWluCi1rZXJuZWwgc291cmNlLiAgUGF5IGF0dGVudGlvbiB3aGVuIHlvdSByZWNvbXBpbGUgeW91ciBrZXJuZWwgOy0pLgotQWxzbywgYmUgc3VyZSB0byB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgcGNtY2lhLWNzIHJlbGVhc2UuCitrZXJuZWwgc291cmNlLiBUaGUgInBjbWNpYXV0aWxzIiBwYWNrYWdlIChzZWUgYWJvdmUpIHJlcGxhY2VzIHBjbWNpYS1jcworZm9yIG5ld2VzdCBrZXJuZWxzLgogCiBRdW90YS10b29scwogLS0tLS0tLS0tLS0KQEAgLTM0OSw5ICszNTcsMTMgQEAKIC0tLS0tLS0tCiBvICA8ZnRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMveGZzL2Rvd25sb2FkLz4KIAorUGNtY2lhdXRpbHMKKy0tLS0tLS0tLS0tCitvICA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9wY21jaWEvPgorCiBQY21jaWEtY3MKIC0tLS0tLS0tLQotbyAgPGZ0cDovL3BjbWNpYS1jcy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BjbWNpYS1jcy9wY21jaWEtY3MtMy4xLjIxLnRhci5nej4KK28gIDxodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldC8+CiAKIFF1b3RhLXRvb2xzCiAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbGliYXRhLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbGliYXRhLnRtcGwKaW5kZXggNmRmMWRmZC4uMzc1YWU3NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xpYmF0YS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEudG1wbApAQCAtODQsNiArODQsMTQgQEAKIAlDYWxsZWQgZnJvbSBhdGFfYnVzX3Byb2JlKCkgYW5kIGF0YV9idXNfcmVzZXQoKSBlcnJvciBwYXRocywKIAlhcyB3ZWxsIGFzIHdoZW4gdW5yZWdpc3RlcmluZyBmcm9tIHRoZSBTQ1NJIG1vZHVsZSAocm1tb2QsIGhvdAogCXVucGx1ZykuCisJVGhpcyBmdW5jdGlvbiBzaG91bGQgZG8gd2hhdGV2ZXIgbmVlZHMgdG8gYmUgZG9uZSB0byB0YWtlIHRoZQorCXBvcnQgb3V0IG9mIHVzZS4gIEluIG1vc3QgY2FzZXMsIGF0YV9wb3J0X2Rpc2FibGUoKSBjYW4gYmUgdXNlZAorCWFzIHRoaXMgaG9vay4KKwk8L3BhcmE+CisJPHBhcmE+CisJQ2FsbGVkIGZyb20gYXRhX2J1c19wcm9iZSgpIG9uIGEgZmFpbGVkIHByb2JlLgorCUNhbGxlZCBmcm9tIGF0YV9idXNfcmVzZXQoKSBvbiBhIGZhaWxlZCBidXMgcmVzZXQuCisJQ2FsbGVkIGZyb20gYXRhX3Njc2lfcmVsZWFzZSgpLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CkBAIC05OCw2ICsxMDYsMTMgQEAKIAlmb3VuZC4gIFR5cGljYWxseSB1c2VkIHRvIGFwcGx5IGRldmljZS1zcGVjaWZpYyBmaXh1cHMgcHJpb3IgdG8KIAlpc3N1ZSBvZiBTRVQgRkVBVFVSRVMgLSBYRkVSIE1PREUsIGFuZCBwcmlvciB0byBvcGVyYXRpb24uCiAJPC9wYXJhPgorCTxwYXJhPgorCUNhbGxlZCBieSBhdGFfZGV2aWNlX2FkZCgpIGFmdGVyIGF0YV9kZXZfaWRlbnRpZnkoKSBkZXRlcm1pbmVzCisJYSBkZXZpY2UgaXMgcHJlc2VudC4KKwk8L3BhcmE+CisJPHBhcmE+CisJVGhpcyBlbnRyeSBtYXkgYmUgc3BlY2lmaWVkIGFzIE5VTEwgaW4gYXRhX3BvcnRfb3BlcmF0aW9ucy4KKwk8L3BhcmE+CiAKIAk8L3NlY3QyPgogCkBAIC0xMzUsNiArMTUwLDggQEAKIAlyZWdpc3RlcnMgLyBETUEgYnVmZmVycy4gIC0+dGZfcmVhZCgpIGlzIGNhbGxlZCB0byByZWFkIHRoZQogCWhhcmR3YXJlIHJlZ2lzdGVycyAvIERNQSBidWZmZXJzLCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgc2V0IG9mCiAJdGFza2ZpbGUgcmVnaXN0ZXIgdmFsdWVzLgorCU1vc3QgZHJpdmVycyBmb3IgdGFza2ZpbGUtYmFzZWQgaGFyZHdhcmUgKFBJTyBvciBNTUlPKSB1c2UKKwlhdGFfdGZfbG9hZCgpIGFuZCBhdGFfdGZfcmVhZCgpIGZvciB0aGVzZSBob29rcy4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpAQCAtMTQ3LDYgKzE2NCw4IEBACiAJPHBhcmE+CiAJY2F1c2VzIGFuIEFUQSBjb21tYW5kLCBwcmV2aW91c2x5IGxvYWRlZCB3aXRoCiAJLT50Zl9sb2FkKCksIHRvIGJlIGluaXRpYXRlZCBpbiBoYXJkd2FyZS4KKwlNb3N0IGRyaXZlcnMgZm9yIHRhc2tmaWxlLWJhc2VkIGhhcmR3YXJlIHVzZSBhdGFfZXhlY19jb21tYW5kKCkKKwlmb3IgdGhpcyBob29rLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CkBAIC0xNjEsNiArMTgwLDEwIEBACiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IGlzIE9LIHRvIHVzZSBETUEgZm9yIHRoZSBzdXBwbGllZCBQQUNLRVQKIGNvbW1hbmQuCiAJPC9wYXJhPgorCTxwYXJhPgorCVRoaXMgaG9vayBtYXkgYmUgc3BlY2lmaWVkIGFzIE5VTEwsIGluIHdoaWNoIGNhc2UgbGliYXRhIHdpbGwKKwlhc3N1bWUgdGhhdCBhdGFwaSBkbWEgY2FuIGJlIHN1cHBvcnRlZC4KKwk8L3BhcmE+CiAKIAk8L3NlY3QyPgogCkBAIC0xNzUsNiArMTk4LDE0IEBACiAJUmVhZHMgdGhlIFN0YXR1cy9BbHRTdGF0dXMvRXJyb3IgQVRBIHNoYWRvdyByZWdpc3RlciBmcm9tCiAJaGFyZHdhcmUuICBPbiBzb21lIGhhcmR3YXJlLCByZWFkaW5nIHRoZSBTdGF0dXMgcmVnaXN0ZXIgaGFzCiAJdGhlIHNpZGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uLgorCU1vc3QgZHJpdmVycyBmb3IgdGFza2ZpbGUtYmFzZWQgaGFyZHdhcmUgdXNlCisJYXRhX2NoZWNrX3N0YXR1cygpIGZvciB0aGlzIGhvb2suCisJPC9wYXJhPgorCTxwYXJhPgorCU5vdGUgdGhhdCBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGZyb20gYXRhX2RldmljZV9hZGQoKSwgYXQKKwlsZWFzdCBhIGR1bW15IGZ1bmN0aW9uIHRoYXQgY2xlYXJzIGRldmljZSBpbnRlcnJ1cHRzIG11c3QgYmUKKwlwcm92aWRlZCBmb3IgYWxsIGRyaXZlcnMsIGV2ZW4gaWYgdGhlIGNvbnRyb2xsZXIgZG9lc24ndAorCWFjdHVhbGx5IGhhdmUgYSB0YXNrZmlsZSBzdGF0dXMgcmVnaXN0ZXIuCiAJPC9wYXJhPgogCiAJPC9zZWN0Mj4KQEAgLTE4OCw3ICsyMTksMTMgQEAKIAlJc3N1ZXMgdGhlIGxvdy1sZXZlbCBoYXJkd2FyZSBjb21tYW5kKHMpIHRoYXQgY2F1c2VzIG9uZSBvZiBOCiAJaGFyZHdhcmUgZGV2aWNlcyB0byBiZSBjb25zaWRlcmVkICdzZWxlY3RlZCcgKGFjdGl2ZSBhbmQKIAlhdmFpbGFibGUgZm9yIHVzZSkgb24gdGhlIEFUQSBidXMuICBUaGlzIGdlbmVyYWxseSBoYXMgbm8KLW1lYW5pbmcgb24gRklTLWJhc2VkIGRldmljZXMuCisJbWVhbmluZyBvbiBGSVMtYmFzZWQgZGV2aWNlcy4KKwk8L3BhcmE+CisJPHBhcmE+CisJTW9zdCBkcml2ZXJzIGZvciB0YXNrZmlsZS1iYXNlZCBoYXJkd2FyZSB1c2UKKwlhdGFfc3RkX2Rldl9zZWxlY3QoKSBmb3IgdGhpcyBob29rLiAgQ29udHJvbGxlcnMgd2hpY2ggZG8gbm90CisJc3VwcG9ydCBzZWNvbmQgZHJpdmVzIG9uIGEgcG9ydCAoc3VjaCBhcyBTQVRBIGNvbnRvbGxlcnMpIHdpbGwKKwl1c2UgYXRhX25vb3BfZGV2X3NlbGVjdCgpLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CkBAIC0yMDQsNiArMjQxLDggQEAKIAlmb3IgZGV2aWNlIHByZXNlbmNlIChQQVRBIGFuZCBTQVRBKSwgdHlwaWNhbGx5IGEgc29mdCByZXNldAogCShTUlNUKSB3aWxsIGJlIHBlcmZvcm1lZC4gIERyaXZlcnMgdHlwaWNhbGx5IHVzZSB0aGUgaGVscGVyCiAJZnVuY3Rpb25zIGF0YV9idXNfcmVzZXQoKSBvciBzYXRhX3BoeV9yZXNldCgpIGZvciB0aGlzIGhvb2suCisJTWFueSBTQVRBIGRyaXZlcnMgdXNlIHNhdGFfcGh5X3Jlc2V0KCkgb3IgY2FsbCBpdCBmcm9tIHdpdGhpbgorCXRoZWlyIG93biBwaHlfcmVzZXQoKSBmdW5jdGlvbnMuCiAJPC9wYXJhPgogCiAJPC9zZWN0Mj4KQEAgLTIyNyw2ICsyNjYsMjUgQEAKIFRoZXNlIGhvb2tzIGFyZSB0eXBpY2FsbHkgZWl0aGVyIG5vLW9wcywgb3Igc2ltcGx5IG5vdCBpbXBsZW1lbnRlZCwgaW4KIEZJUy1iYXNlZCBkcml2ZXJzLgogCTwvcGFyYT4KKwk8cGFyYT4KK01vc3QgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfYm1kbWFfc2V0dXAoKSBmb3IgdGhlIGJtZG1hX3NldHVwKCkKK2hvb2suICBhdGFfYm1kbWFfc2V0dXAoKSB3aWxsIHdyaXRlIHRoZSBwb2ludGVyIHRvIHRoZSBQUkQgdGFibGUgdG8KK3RoZSBJREUgUFJEIFRhYmxlIEFkZHJlc3MgcmVnaXN0ZXIsIGVuYWJsZSBETUEgaW4gdGhlIERNQSBDb21tYW5kCityZWdpc3RlciwgYW5kIGNhbGwgZXhlY19jb21tYW5kKCkgdG8gYmVnaW4gdGhlIHRyYW5zZmVyLgorCTwvcGFyYT4KKwk8cGFyYT4KK01vc3QgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfYm1kbWFfc3RhcnQoKSBmb3IgdGhlIGJtZG1hX3N0YXJ0KCkKK2hvb2suICBhdGFfYm1kbWFfc3RhcnQoKSB3aWxsIHdyaXRlIHRoZSBBVEFfRE1BX1NUQVJUIGZsYWcgdG8gdGhlIERNQQorQ29tbWFuZCByZWdpc3Rlci4KKwk8L3BhcmE+CisJPHBhcmE+CitNYW55IGxlZ2FjeSBJREUgZHJpdmVycyB1c2UgYXRhX2JtZG1hX3N0b3AoKSBmb3IgdGhlIGJtZG1hX3N0b3AoKQoraG9vay4gIGF0YV9ibWRtYV9zdG9wKCkgY2xlYXJzIHRoZSBBVEFfRE1BX1NUQVJUIGZsYWcgaW4gdGhlIERNQQorY29tbWFuZCByZWdpc3Rlci4KKwk8L3BhcmE+CisJPHBhcmE+CitNYW55IGxlZ2FjeSBJREUgZHJpdmVycyB1c2UgYXRhX2JtZG1hX3N0YXR1cygpIGFzIHRoZSBibWRtYV9zdGF0dXMoKSBob29rLgorCTwvcGFyYT4KIAogCTwvc2VjdDI+CiAKQEAgLTI1MCw2ICszMDgsMTAgQEAKIAloZWxwZXIgZnVuY3Rpb24gYXRhX3FjX2lzc3VlX3Byb3QoKSBmb3IgdGFza2ZpbGUgcHJvdG9jb2wtYmFzZWQKIAlkaXNwYXRjaC4gIE1vcmUgYWR2YW5jZWQgZHJpdmVycyBpbXBsZW1lbnQgdGhlaXIgb3duIC0+cWNfaXNzdWUuCiAJPC9wYXJhPgorCTxwYXJhPgorCWF0YV9xY19pc3N1ZV9wcm90KCkgY2FsbHMgLT50Zl9sb2FkKCksIC0+Ym1kbWFfc2V0dXAoKSwgYW5kCisJLT5ibWRtYV9zdGFydCgpIGFzIG5lY2Vzc2FyeSB0byBpbml0aWF0ZSBhIHRyYW5zZmVyLgorCTwvcGFyYT4KIAogCTwvc2VjdDI+CiAKQEAgLTI3OSw2ICszNDEsMjEgQEAKIAliZWZvcmUgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQsIHRvIGJlIHN1cmUgaGFyZHdhcmUKIAlpcyBxdWlldC4KIAk8L3BhcmE+CisJPHBhcmE+CisJVGhlIHNlY29uZCBhcmd1bWVudCwgZGV2X2luc3RhbmNlLCBzaG91bGQgYmUgY2FzdCB0byBhIHBvaW50ZXIKKwl0byBzdHJ1Y3QgYXRhX2hvc3Rfc2V0LgorCTwvcGFyYT4KKwk8cGFyYT4KKwlNb3N0IGxlZ2FjeSBJREUgZHJpdmVycyB1c2UgYXRhX2ludGVycnVwdCgpIGZvciB0aGUKKwlpcnFfaGFuZGxlciBob29rLCB3aGljaCBzY2FucyBhbGwgcG9ydHMgaW4gdGhlIGhvc3Rfc2V0LAorCWRldGVybWluZXMgd2hpY2ggcXVldWVkIGNvbW1hbmQgd2FzIGFjdGl2ZSAoaWYgYW55KSwgYW5kIGNhbGxzCisJYXRhX2hvc3RfaW50cihhcCxxYykuCisJPC9wYXJhPgorCTxwYXJhPgorCU1vc3QgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfYm1kbWFfaXJxX2NsZWFyKCkgZm9yIHRoZQorCWlycV9jbGVhcigpIGhvb2ssIHdoaWNoIHNpbXBseSBjbGVhcnMgdGhlIGludGVycnVwdCBhbmQgZXJyb3IKKwlmbGFncyBpbiB0aGUgRE1BIHN0YXR1cyByZWdpc3Rlci4KKwk8L3BhcmE+CiAKIAk8L3NlY3QyPgogCkBAIC0yOTIsNiArMzY5LDcgQEAKIAk8cGFyYT4KIAlSZWFkIGFuZCB3cml0ZSBzdGFuZGFyZCBTQVRBIHBoeSByZWdpc3RlcnMuICBDdXJyZW50bHkgb25seSB1c2VkCiAJaWYgLT5waHlfcmVzZXQgaG9vayBjYWxsZWQgdGhlIHNhdGFfcGh5X3Jlc2V0KCkgaGVscGVyIGZ1bmN0aW9uLgorCXNjX3JlZyBpcyBvbmUgb2YgU0NSX1NUQVRVUywgU0NSX0NPTlRST0wsIFNDUl9FUlJPUiwgb3IgU0NSX0FDVElWRS4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpAQCAtMzA3LDE3ICszODUsMjkgQEAKIAktPnBvcnRfc3RhcnQoKSBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBlYWNoCiAJcG9ydCBhcmUgaW5pdGlhbGl6ZWQuICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGFsbG9jIHBlci1wb3J0CiAJRE1BIGJ1ZmZlcnMgLyB0YWJsZXMgLyByaW5ncywgZW5hYmxlIERNQSBlbmdpbmVzLCBhbmQgc2ltaWxhcgotCXRhc2tzLiAgCisJdGFza3MuICBTb21lIGRyaXZlcnMgYWxzbyB1c2UgdGhpcyBlbnRyeSBwb2ludCBhcyBhIGNoYW5jZSB0bworCWFsbG9jYXRlIGRyaXZlci1wcml2YXRlIG1lbW9yeSBmb3IgYXAtPnByaXZhdGVfZGF0YS4KKwk8L3BhcmE+CisJPHBhcmE+CisJTWFueSBkcml2ZXJzIHVzZSBhdGFfcG9ydF9zdGFydCgpIGFzIHRoaXMgaG9vayBvciBjYWxsCisJaXQgZnJvbSB0aGVpciBvd24gcG9ydF9zdGFydCgpIGhvb2tzLiAgYXRhX3BvcnRfc3RhcnQoKQorCWFsbG9jYXRlcyBzcGFjZSBmb3IgYSBsZWdhY3kgSURFIFBSRCB0YWJsZSBhbmQgcmV0dXJucy4KIAk8L3BhcmE+CiAJPHBhcmE+CiAJLT5wb3J0X3N0b3AoKSBpcyBjYWxsZWQgYWZ0ZXIgLT5ob3N0X3N0b3AoKS4gIEl0J3Mgc29sZSBmdW5jdGlvbgogCWlzIHRvIHJlbGVhc2UgRE1BL21lbW9yeSByZXNvdXJjZXMsIG5vdyB0aGF0IHRoZXkgYXJlIG5vIGxvbmdlcgotCWFjdGl2ZWx5IGJlaW5nIHVzZWQuCisJYWN0aXZlbHkgYmVpbmcgdXNlZC4gIE1hbnkgZHJpdmVycyBhbHNvIGZyZWUgZHJpdmVyLXByaXZhdGUKKwlkYXRhIGZyb20gcG9ydCBhdCB0aGlzIHRpbWUuCisJPC9wYXJhPgorCTxwYXJhPgorCU1hbnkgZHJpdmVycyB1c2UgYXRhX3BvcnRfc3RvcCgpIGFzIHRoaXMgaG9vaywgd2hpY2ggZnJlZXMgdGhlCisJUFJEIHRhYmxlLgogCTwvcGFyYT4KIAk8cGFyYT4KIAktPmhvc3Rfc3RvcCgpIGlzIGNhbGxlZCBhZnRlciBhbGwgLT5wb3J0X3N0b3AoKSBjYWxscwogaGF2ZSBjb21wbGV0ZWQuICBUaGUgaG9vayBtdXN0IGZpbmFsaXplIGhhcmR3YXJlIHNodXRkb3duLCByZWxlYXNlIERNQQogYW5kIG90aGVyIHJlc291cmNlcywgZXRjLgorCVRoaXMgaG9vayBtYXkgYmUgc3BlY2lmaWVkIGFzIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgbm90IGNhbGxlZC4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKaW5kZXggZGUzYjI1Mi4uYzNjY2E5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCkBAIC0xMywxMyArMTMsMTQgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogTWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgZm9yIGJsb2NrIGFuZCBjaGFyYWN0ZXIgZGV2aWNlcyBhcmUgYWxsb2NhdGVkCi1ieSB0aGUgTGludXggYXNzaWduZWQgbmFtZSBhbmQgbnVtYmVyIGF1dGhvcml0eSAoY3VycmVudGx5IGJldHRlcgota25vd24gYXMgSCBQZXRlciBBbnZpbikuIFRoZSBzaXRlIGlzIGh0dHA6Ly93d3cubGFuYW5hLm9yZy8uIFRoaXMKK2J5IHRoZSBMaW51eCBhc3NpZ25lZCBuYW1lIGFuZCBudW1iZXIgYXV0aG9yaXR5IChjdXJyZW50bHkgdGhpcyBpcworVG9yYmVuIE1hdGhpYXNlbikuIFRoZSBzaXRlIGlzIGh0dHA6Ly93d3cubGFuYW5hLm9yZy8uIFRoaXMKIGFsc28gZGVhbHMgd2l0aCBhbGxvY2F0aW5nIG51bWJlcnMgZm9yIGRldmljZXMgdGhhdCBhcmUgbm90IGdvaW5nIHRvCiBiZSBzdWJtaXR0ZWQgdG8gdGhlIG1haW5zdHJlYW0ga2VybmVsLgorU2VlIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcy4KIAotSWYgeW91IGRvbid0IHVzZSBhc3NpZ25lZCBudW1iZXJzIHRoZW4gd2hlbiB5b3UgZGV2aWNlIGlzIHN1Ym1pdHRlZCBpdCB3aWxsCi1nZXQgZ2l2ZW4gYW4gYXNzaWduZWQgbnVtYmVyIGV2ZW4gaWYgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB2YWx1ZXMgeW91IG1heQorSWYgeW91IGRvbid0IHVzZSBhc3NpZ25lZCBudW1iZXJzIHRoZW4gd2hlbiB5b3VyIGRldmljZSBpcyBzdWJtaXR0ZWQgaXQgd2lsbAorYmUgZ2l2ZW4gYW4gYXNzaWduZWQgbnVtYmVyIGV2ZW4gaWYgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB2YWx1ZXMgeW91IG1heQogaGF2ZSBzaGlwcGVkIHRvIGN1c3RvbWVycyBiZWZvcmUuCiAKIFdobyBUbyBTdWJtaXQgRHJpdmVycyBUbwpAQCAtMzIsNyArMzMsOCBAQAogCUlmIHRoZSBjb2RlIGFyZWEgaGFzIGEgZ2VuZXJhbCBtYWludGFpbmVyIHRoZW4gcGxlYXNlIHN1Ym1pdCBpdCB0bwogCXRoZSBtYWludGFpbmVyIGxpc3RlZCBpbiBNQUlOVEFJTkVSUyBpbiB0aGUga2VybmVsIGZpbGUuIElmIHRoZQogCW1haW50YWluZXIgZG9lcyBub3QgcmVzcG9uZCBvciB5b3UgY2Fubm90IGZpbmQgdGhlIGFwcHJvcHJpYXRlCi0JbWFpbnRhaW5lciB0aGVuIHBsZWFzZSBjb250YWN0IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisJbWFpbnRhaW5lciB0aGVuIHBsZWFzZSBjb250YWN0IHRoZSAyLjIga2VybmVsIG1haW50YWluZXI6CisJTWFyYy1DaHJpc3RpYW4gUGV0ZXJzZW4gPG0uYy5wQHdvbGstcHJvamVjdC5kZT4uCiAKIExpbnV4IDIuNDoKIAlUaGUgc2FtZSBydWxlcyBhcHBseSBhcyAyLjIuIFRoZSBmaW5hbCBjb250YWN0IHBvaW50IGZvciBMaW51eCAyLjQKQEAgLTQ4LDcgKzUwLDcgQEAKIAogTGljZW5zaW5nOglUaGUgY29kZSBtdXN0IGJlIHJlbGVhc2VkIHRvIHVzIHVuZGVyIHRoZQogCQlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gV2UgZG9uJ3QgaW5zaXN0IG9uIGFueSBraW5kCi0JCW9mIGV4Y2x1c2l2ZWx5IEdQTCBsaWNlbnNpbmcsIGFuZCBpZiB5b3Ugd2lzaCB0aGUgZHJpdmVyCisJCW9mIGV4Y2x1c2l2ZSBHUEwgbGljZW5zaW5nLCBhbmQgaWYgeW91IHdpc2ggdGhlIGRyaXZlcgogCQl0byBiZSB1c2VmdWwgdG8gb3RoZXIgY29tbXVuaXRpZXMgc3VjaCBhcyBCU0QgeW91IG1heSB3ZWxsCiAJCXdpc2ggdG8gcmVsZWFzZSB1bmRlciBtdWx0aXBsZSBsaWNlbnNlcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggYmNkZWVlMS4uNjc2MWE3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC0zNSw3ICszNSw3IEBACiAKIFRvIGNyZWF0ZSBhIHBhdGNoIGZvciBhIHNpbmdsZSBmaWxlLCBpdCBpcyBvZnRlbiBzdWZmaWNpZW50IHRvIGRvOgogCi0JU1JDVFJFRT0gbGludXgtMi40CisJU1JDVFJFRT0gbGludXgtMi42CiAJTVlGSUxFPSAgZHJpdmVycy9uZXQvbXlkcml2ZXIuYwogCiAJY2QgJFNSQ1RSRUUKQEAgLTQ4LDE3ICs0OCwxOCBAQAogb3IgdW5tb2RpZmllZCBrZXJuZWwgc291cmNlIHRyZWUsIGFuZCBnZW5lcmF0ZSBhIGRpZmYgYWdhaW5zdCB5b3VyCiBvd24gc291cmNlIHRyZWUuICBGb3IgZXhhbXBsZToKIAotCU1ZU1JDPSAvZGV2ZWwvbGludXgtMi40CisJTVlTUkM9IC9kZXZlbC9saW51eC0yLjYKIAotCXRhciB4dmZ6IGxpbnV4LTIuNC4wLXRlc3QxMS50YXIuZ3oKLQltdiBsaW51eCBsaW51eC12YW5pbGxhCi0Jd2dldCBodHRwOi8vd3d3Lm1vc2VzLnVrbGludXgubmV0L3BhdGNoZXMvZG9udGRpZmYKLQlkaWZmIC11cHJOIC1YIGRvbnRkaWZmIGxpbnV4LXZhbmlsbGEgJE1ZU1JDID4gL3RtcC9wYXRjaAotCXJtIC1mIGRvbnRkaWZmCisJdGFyIHh2ZnogbGludXgtMi42LjEyLnRhci5negorCW12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTItdmFuaWxsYQorCWRpZmYgLXVwck4gLVggbGludXgtMi42LjEyLXZhbmlsbGEvRG9jdW1lbnRhdGlvbi9kb250ZGlmZiBcCisJCWxpbnV4LTIuNi4xMi12YW5pbGxhICRNWVNSQyA+IC90bXAvcGF0Y2gKIAogImRvbnRkaWZmIiBpcyBhIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUga2VybmVsIGR1cmluZwogdGhlIGJ1aWxkIHByb2Nlc3MsIGFuZCBzaG91bGQgYmUgaWdub3JlZCBpbiBhbnkgZGlmZigxKS1nZW5lcmF0ZWQKLXBhdGNoLiAgZG9udGRpZmYgaXMgbWFpbnRhaW5lZCBieSBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KK3BhdGNoLiAgVGhlICJkb250ZGlmZiIgZmlsZSBpcyBpbmNsdWRlZCBpbiB0aGUga2VybmVsIHRyZWUgaW4KKzIuNi4xMiBhbmQgbGF0ZXIuICBGb3IgZWFybGllciBrZXJuZWwgdmVyc2lvbnMsIHlvdSBjYW4gZ2V0IGl0Citmcm9tIDxodHRwOi8vd3d3Lnhlbm90aW1lLm5ldC9saW51eC9kb2MvZG9udGRpZmY+LgogCiBNYWtlIHN1cmUgeW91ciBwYXRjaCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBmaWxlcyB3aGljaCBkbyBub3QKIGJlbG9uZyBpbiBhIHBhdGNoIHN1Ym1pc3Npb24uICBNYWtlIHN1cmUgdG8gcmV2aWV3IHlvdXIgcGF0Y2ggLWFmdGVyLQpAQCAtNjYsMTggKzY3LDIwIEBACiAKIElmIHlvdXIgY2hhbmdlcyBwcm9kdWNlIGEgbG90IG9mIGRlbHRhcywgeW91IG1heSB3YW50IHRvIGxvb2sgaW50bwogc3BsaXR0aW5nIHRoZW0gaW50byBpbmRpdmlkdWFsIHBhdGNoZXMgd2hpY2ggbW9kaWZ5IHRoaW5ncyBpbgotbG9naWNhbCBzdGFnZXMsIHRoaXMgd2lsbCBmYWNpbGl0YXRlIGVhc2llciByZXZpZXdpbmcgYnkgb3RoZXIKK2xvZ2ljYWwgc3RhZ2VzLiAgVGhpcyB3aWxsIGZhY2lsaXRhdGUgZWFzaWVyIHJldmlld2luZyBieSBvdGhlcgoga2VybmVsIGRldmVsb3BlcnMsIHZlcnkgaW1wb3J0YW50IGlmIHlvdSB3YW50IHlvdXIgcGF0Y2ggYWNjZXB0ZWQuCi1UaGVyZSBhcmUgYSBudW1iZXIgb2Ygc2NyaXB0cyB3aGljaCBjYW4gYWlkIGluIHRoaXM7CitUaGVyZSBhcmUgYSBudW1iZXIgb2Ygc2NyaXB0cyB3aGljaCBjYW4gYWlkIGluIHRoaXM6CiAKIFF1aWx0OgogaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvcXVpbHQKIAogUmFuZHkgRHVubGFwJ3MgcGF0Y2ggc2NyaXB0czoKLWh0dHA6Ly9kZXZlbG9wZXIub3NkbC5vcmcvcmRkdW5sYXAvc2NyaXB0cy9wYXRjaGluZy1zY3JpcHRzLnRnegoraHR0cDovL3d3dy54ZW5vdGltZS5uZXQvbGludXgvc2NyaXB0cy9wYXRjaGluZy1zY3JpcHRzLTAwMi50YXIuZ3oKIAogQW5kcmV3IE1vcnRvbidzIHBhdGNoIHNjcmlwdHM6Ci1odHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9wYXRjaC1zY3JpcHRzLTAuMTYKK2h0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzL3BhdGNoLXNjcmlwdHMtMC4yMAorCisKIAogMikgRGVzY3JpYmUgeW91ciBjaGFuZ2VzLgogCkBAIC0xMzIsMjEgKzEzNSw2IEBACiB1c3VhbGx5IGJlIHNlbnQgZmlyc3QgdG8gbGludXgta2VybmVsLiAgT25seSBhZnRlciB0aGUgcGF0Y2ggaXMKIGRpc2N1c3NlZCBzaG91bGQgdGhlIHBhdGNoIHRoZW4gYmUgc3VibWl0dGVkIHRvIExpbnVzLgogCi1Gb3Igc21hbGwgcGF0Y2hlcyB5b3UgbWF5IHdhbnQgdG8gQ0MgdGhlIFRyaXZpYWwgUGF0Y2ggTW9ua2V5Ci10cml2aWFsQHJ1c3Rjb3JwLmNvbS5hdSBzZXQgdXAgYnkgUnVzdHkgUnVzc2VsbDsgd2hpY2ggY29sbGVjdHMgInRyaXZpYWwiCi1wYXRjaGVzLiBUcml2aWFsIHBhdGNoZXMgbXVzdCBxdWFsaWZ5IGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBydWxlczoKLSBTcGVsbGluZyBmaXhlcyBpbiBkb2N1bWVudGF0aW9uCi0gU3BlbGxpbmcgZml4ZXMgd2hpY2ggY291bGQgYnJlYWsgZ3JlcCgxKS4KLSBXYXJuaW5nIGZpeGVzIChjbHV0dGVyaW5nIHdpdGggdXNlbGVzcyB3YXJuaW5ncyBpcyBiYWQpCi0gQ29tcGlsYXRpb24gZml4ZXMgKG9ubHkgaWYgdGhleSBhcmUgYWN0dWFsbHkgY29ycmVjdCkKLSBSdW50aW1lIGZpeGVzIChvbmx5IGlmIHRoZXkgYWN0dWFsbHkgZml4IHRoaW5ncykKLSBSZW1vdmluZyB1c2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWFjcm9zIChlZy4gY2hlY2tfcmVnaW9uKS4KLSBDb250YWN0IGRldGFpbCBhbmQgZG9jdW1lbnRhdGlvbiBmaXhlcwotIE5vbi1wb3J0YWJsZSBjb2RlIHJlcGxhY2VkIGJ5IHBvcnRhYmxlIGNvZGUgKGV2ZW4gaW4gYXJjaC1zcGVjaWZpYywKLSBzaW5jZSBwZW9wbGUgY29weSwgYXMgbG9uZyBhcyBpdCdzIHRyaXZpYWwpCi0gQW55IGZpeCBieSB0aGUgYXV0aG9yL21haW50YWluZXIgb2YgdGhlIGZpbGUuIChpZS4gcGF0Y2ggbW9ua2V5Ci0gaW4gcmUtdHJhbnNtaXNzaW9uIG1vZGUpCi0KIAogCiA1KSBTZWxlY3QgeW91ciBDQyAoZS1tYWlsIGNhcmJvbiBjb3B5KSBsaXN0LgpAQCAtMTc4LDYgKzE2Niw4IEBACiAgc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQogIEFueSBmaXggYnkgdGhlIGF1dGhvci9tYWludGFpbmVyIG9mIHRoZSBmaWxlLiAoaWUuIHBhdGNoIG1vbmtleQogIGluIHJlLXRyYW5zbWlzc2lvbiBtb2RlKQorVVJMOiA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL3J1c3R5L3RyaXZpYWwvPgorCiAKIAogCkBAIC0zMDYsNiArMjk2LDE3IEBACiBwb2ludCBvdXQgc29tZSBzcGVjaWFsIGRldGFpbCBhYm91dCB0aGUgc2lnbi1vZmYuIAogCiAKKworMTIpIE1vcmUgcmVmZXJlbmNlcyBmb3Igc3VibWl0dGluZyBwYXRjaGVzCisKK0FuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCisgIDxodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0PgorCitKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdC4iCisgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgorCisKKwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNFQ1RJT04gMiAtIEhJTlRTLCBUSVBTLCBBTkQgVFJJQ0tTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzc0LDcgKzM3NSw1IEBACiA0KSBEb24ndCBvdmVyLWRlc2lnbi4KIAogRG9uJ3QgdHJ5IHRvIGFudGljaXBhdGUgbmVidWxvdXMgZnV0dXJlIGNhc2VzIHdoaWNoIG1heSBvciBtYXkgbm90Ci1iZSB1c2VmdWw6ICAiTWFrZSBpdCBhcyBzaW1wbGUgYXMgeW91IGNhbiwgYW5kIG5vIHNpbXBsZXIiCi0KLQorYmUgdXNlZnVsOiAgIk1ha2UgaXQgYXMgc2ltcGxlIGFzIHlvdSBjYW4sIGFuZCBubyBzaW1wbGVyLiIKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGktaG90a2V5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzExNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKQEAgLTAsMCArMSwzNSBAQAorZHJpdmVyL2FjcGkvaG90a2V5LmMgaW1wbGVtZW50OgorMS4gL3Byb2MvYWNwaS9ob3RrZXkvZXZlbnRfY29uZmlnIAorKGV2ZW50IGJhc2VkIGhvdGtleSBvciBldmVudCBjb25maWcgaW50ZXJmYWNlKToKK2EuIGFkZCBhICBldmVudCBiYXNlZCBob3RrZXkoZXZlbnQpIDogCitlY2hvICIwOmJ1czo6YWN0aW9uOm1ldGhvZDpudW06bnVtIiA+IGV2ZW50X2NvbmZpZworCitiLiBkZWxldGUgYSBldmVudCBiYXNlZCBob3RrZXkoZXZlbnQpOiAKK2VjaG8gIjE6Ojo6Om51bTpudW0iID4gZXZlbnRfY29uZmlnCisKK2MuICBtb2RpZnkgYSBldmVudCBiYXNlZCBob3RrZXkoZXZlbnQpOiAgICAKK2VjaG8gIjI6YnVzOjphY3Rpb246bWV0aG9kOm51bTpudW0iID4gZXZlbnRfY29uZmlnCisKKzIuIC9wcm9jL2FjcGkvaG90a2V5L3BvbGxfY29uZmlnIAorKHBvbGxpbmcgYmFzZWQgaG90a2V5IG9yIGV2ZW50IGNvbmZpZyBpbnRlcmZhY2UpOgorYS5hZGQgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCkgOiAJCitlY2hvICIwOmJ1czptZXRob2Q6YWN0aW9uOm1ldGhvZDpudW0iID4gcG9sbF9jb25maWcKK3RoaXMgYWRkaW5nIGNvbW1hbmQgd2lsbCBjcmVhdGUgYSBwcm9jIGZpbGUgCisvcHJvYy9hY3BpL2hvdGtleS9tZXRob2QsIHdoaWNoIGlzIHVzZWQgdG8gZ2V0IAorcmVzdWx0IG9mIHBvbGxpbmcuCisKK2IuZGVsZXRlIGEgcG9sbGluZyBiYXNlZCBob3RrZXkoZXZlbnQpOiAJCitlY2hvICIxOjo6OjpudW0iID4gZXZlbnRfY29uZmlnCisKK2MubW9kaWZ5IGEgcG9sbGluZyBiYXNlZCBob3RrZXkoZXZlbnQpOiAgICAKK2VjaG8gIjI6YnVzOm1ldGhvZDphY3Rpb246bWV0aG9kOm51bSIgPiBwb2xsX2NvbmZpZworCiszLi9wcm9jL2FjcGkvaG90a2V5L2FjdGlvbiAKKyhpbnRlcmZhY2UgdG8gY2FsbCBhbWwgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBhIAorc3BlY2lmaWMgaG90a2V5KGV2ZW50KSkKK2VjaG8gImV2ZW50X251bTpldmVudF90eXBlOmV2ZW50X2FyZ3VtZW50IiA+IAorCS9wcm9jL2FjcGkvaG90a2V5L2FjdGlvbi4KK1RoZSByZXN1bHQgb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGFtbCBtZXRob2QgaXMgCithdHRhY2hlZCB0byAvcHJvYy9hY3BpL2hvdGtleS9wb2xsX21ldGhvZCwgd2hpY2ggaXMgZG55YW1pY2FsbHkKK2NyZWF0ZWQuICBQbGVhc2UgdXNlIGNvbW1hbmQgImNhdCAvcHJvYy9hY3BpL2hvdGtleS9wb2xsaW5nX21ldGhvZCIgCit0byByZXRyaWV2ZSBpdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svaW9wcmlvLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svaW9wcmlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNjZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9pb3ByaW8udHh0CkBAIC0wLDAgKzEsMTc2IEBACitCbG9jayBpbyBwcmlvcml0aWVzCis9PT09PT09PT09PT09PT09PT09CisKKworSW50cm8KKy0tLS0tCisKK1dpdGggdGhlIGludHJvZHVjdGlvbiBvZiBjZnEgdjMgKGFrYSBjZnEtdHMgb3IgdGltZSBzbGljZWQgY2ZxKSwgYmFzaWMgaW8KK3ByaW9yaXRpZXMgaXMgc3VwcG9ydGVkIGZvciByZWFkcyBvbiBmaWxlcy4gVGhpcyBlbmFibGVzIHVzZXJzIHRvIGlvIG5pY2UKK3Byb2Nlc3NlcyBvciBwcm9jZXNzIGdyb3Vwcywgc2ltaWxhciB0byB3aGF0IGhhcyBiZWVuIHBvc3NpYmxlIHRvIGNwdQorc2NoZWR1bGluZyBmb3IgYWdlcy4gVGhpcyBkb2N1bWVudCBtYWlubHkgZGV0YWlscyB0aGUgY3VycmVudCBwb3NzaWJpbGl0ZXMKK3dpdGggY2ZxLCBvdGhlciBpbyBzY2hlZHVsZXJzIGRvIG5vdCBzdXBwb3J0IGlvIHByaW9yaXRpZXMgc28gZmFyLgorCitTY2hlZHVsaW5nIGNsYXNzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitDRlEgaW1wbGVtZW50cyB0aHJlZSBnZW5lcmljIHNjaGVkdWxpbmcgY2xhc3NlcyB0aGF0IGRldGVybWluZSBob3cgaW8gaXMKK3NlcnZlZCBmb3IgYSBwcm9jZXNzLgorCitJT1BSSU9fQ0xBU1NfUlQ6IFRoaXMgaXMgdGhlIHJlYWx0aW1lIGlvIGNsYXNzLiBUaGlzIHNjaGVkdWxpbmcgY2xhc3MgaXMgZ2l2ZW4KK2hpZ2hlciBwcmlvcml0eSB0aGFuIGFueSBvdGhlciBpbiB0aGUgc3lzdGVtLCBwcm9jZXNzZXMgZnJvbSB0aGlzIGNsYXNzIGFyZQorZ2l2ZW4gZmlyc3QgYWNjZXNzIHRvIHRoZSBkaXNrIGV2ZXJ5IHRpbWUuIFRodXMgaXQgbmVlZHMgdG8gYmUgdXNlZCB3aXRoIHNvbWUKK2NhcmUsIG9uZSBpbyBSVCBwcm9jZXNzIGNhbiBzdGFydmUgdGhlIGVudGlyZSBzeXN0ZW0uIFdpdGhpbiB0aGUgUlQgY2xhc3MsCit0aGVyZSBhcmUgOCBsZXZlbHMgb2YgY2xhc3MgZGF0YSB0aGF0IGRldGVybWluZSBleGFjdGx5IGhvdyBtdWNoIHRpbWUgdGhpcworcHJvY2VzcyBuZWVkcyB0aGUgZGlzayBmb3Igb24gZWFjaCBzZXJ2aWNlLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWlnaHQgY2hhbmdlCit0byBiZSBtb3JlIGRpcmVjdGx5IG1hcHBhYmxlIHRvIHBlcmZvcm1hbmNlLCBieSBwYXNzaW5nIGluIGEgd2FudGVkIGRhdGEKK3JhdGUgaW5zdGVhZC4KKworSU9QUklPX0NMQVNTX0JFOiBUaGlzIGlzIHRoZSBiZXN0LWVmZm9ydCBzY2hlZHVsaW5nIGNsYXNzLCB3aGljaCBpcyB0aGUgZGVmYXVsdAorZm9yIGFueSBwcm9jZXNzIHRoYXQgaGFzbid0IHNldCBhIHNwZWNpZmljIGlvIHByaW9yaXR5LiBUaGUgY2xhc3MgZGF0YQorZGV0ZXJtaW5lcyBob3cgbXVjaCBpbyBiYW5kd2lkdGggdGhlIHByb2Nlc3Mgd2lsbCBnZXQsIGl0J3MgZGlyZWN0bHkgbWFwcGFibGUKK3RvIHRoZSBjcHUgbmljZSBsZXZlbHMganVzdCBtb3JlIGNvYXJzZWx5IGltcGxlbWVudGVkLiAwIGlzIHRoZSBoaWdoZXN0CitCRSBwcmlvIGxldmVsLCA3IGlzIHRoZSBsb3dlc3QuIFRoZSBtYXBwaW5nIGJldHdlZW4gY3B1IG5pY2UgbGV2ZWwgYW5kIGlvCituaWNlIGxldmVsIGlzIGRldGVybWluZWQgYXM6IGlvX25pY2UgPSAoY3B1X25pY2UgKyAyMCkgLyA1LgorCitJT1BSSU9fQ0xBU1NfSURMRTogVGhpcyBpcyB0aGUgaWRsZSBzY2hlZHVsaW5nIGNsYXNzLCBwcm9jZXNzZXMgcnVubmluZyBhdCB0aGlzCitsZXZlbCBvbmx5IGdldCBpbyB0aW1lIHdoZW4gbm8gb25lIGVsc2UgbmVlZHMgdGhlIGRpc2suIFRoZSBpZGxlIGNsYXNzIGhhcyBubworY2xhc3MgZGF0YSwgc2luY2UgaXQgZG9lc24ndCByZWFsbHkgYXBwbHkgaGVyZS4KKworVG9vbHMKKy0tLS0tCisKK1NlZSBiZWxvdyBmb3IgYSBzYW1wbGUgaW9uaWNlIHRvb2wuIFVzYWdlOgorCisjIGlvbmljZSAtYzxjbGFzcz4gLW48bGV2ZWw+IC1wPHBpZD4KKworSWYgcGlkIGlzbid0IGdpdmVuLCB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGFzc3VtZWQuIElPIHByaW9yaXR5IHNldHRpbmdzCithcmUgaW5oZXJpdGVkIG9uIGZvcmssIHNvIHlvdSBjYW4gdXNlIGlvbmljZSB0byBzdGFydCB0aGUgcHJvY2VzcyBhdCBhIGdpdmVuCitsZXZlbDoKKworIyBpb25pY2UgLWMyIC1uMCAvYmluL2xzCisKK3dpbGwgcnVuIGxzIGF0IHRoZSBiZXN0LWVmZm9ydCBzY2hlZHVsaW5nIGNsYXNzIGF0IHRoZSBoaWdoZXN0IHByaW9yaXR5LgorRm9yIGEgcnVubmluZyBwcm9jZXNzLCB5b3UgY2FuIGdpdmUgdGhlIHBpZCBpbnN0ZWFkOgorCisjIGlvbmljZSAtYzEgLW4yIC1wMTAwCisKK3dpbGwgY2hhbmdlIHBpZCAxMDAgdG8gcnVuIGF0IHRoZSByZWFsdGltZSBzY2hlZHVsaW5nIGNsYXNzLCBhdCBwcmlvcml0eSAyLgorCistLS0+IHNuaXAgaW9uaWNlLmMgdG9vbCA8LS0tCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworZXh0ZXJuIGludCBzeXNfaW9wcmlvX3NldChpbnQsIGludCwgaW50KTsKK2V4dGVybiBpbnQgc3lzX2lvcHJpb19nZXQoaW50LCBpbnQpOworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyOTAKKyNlbGlmIGRlZmluZWQoX19wcGNfXykKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyNzMKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyNzQKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyNTEKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyNTIKKyNlbGlmIGRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMTI3NAorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTEyNzUKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIGFyY2giCisjZW5kaWYKKworX3N5c2NhbGwzKGludCwgaW9wcmlvX3NldCwgaW50LCB3aGljaCwgaW50LCB3aG8sIGludCwgaW9wcmlvKTsKK19zeXNjYWxsMihpbnQsIGlvcHJpb19nZXQsIGludCwgd2hpY2gsIGludCwgd2hvKTsKKworZW51bSB7CisJSU9QUklPX0NMQVNTX05PTkUsCisJSU9QUklPX0NMQVNTX1JULAorCUlPUFJJT19DTEFTU19CRSwKKwlJT1BSSU9fQ0xBU1NfSURMRSwKK307CisKK2VudW0geworCUlPUFJJT19XSE9fUFJPQ0VTUyA9IDEsCisJSU9QUklPX1dIT19QR1JQLAorCUlPUFJJT19XSE9fVVNFUiwKK307CisKKyNkZWZpbmUgSU9QUklPX0NMQVNTX1NISUZUCTEzCisKK2NvbnN0IGNoYXIgKnRvX3ByaW9bXSA9IHsgIm5vbmUiLCAicmVhbHRpbWUiLCAiYmVzdC1lZmZvcnQiLCAiaWRsZSIsIH07CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGlvcHJpbyA9IDQsIHNldCA9IDAsIGlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwlpbnQgYywgcGlkID0gMDsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiK246YzpwOiIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ24nOgorCQkJaW9wcmlvID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOworCQkJc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWlvcHJpb19jbGFzcyA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKKwkJCXNldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwaWQgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXN3aXRjaCAoaW9wcmlvX2NsYXNzKSB7CisJCWNhc2UgSU9QUklPX0NMQVNTX05PTkU6CisJCQlpb3ByaW9fY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfUlQ6CisJCWNhc2UgSU9QUklPX0NMQVNTX0JFOgorCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX0NMQVNTX0lETEU6CisJCQlpb3ByaW8gPSA3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoImJhZCBwcmlvIGNsYXNzICVkXG4iLCBpb3ByaW9fY2xhc3MpOworCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFzZXQpIHsKKwkJaWYgKCFwaWQgJiYgYXJndltvcHRpbmRdKQorCQkJcGlkID0gc3RydG9sKGFyZ3Zbb3B0aW5kXSwgTlVMTCwgMTApOworCisJCWlvcHJpbyA9IGlvcHJpb19nZXQoSU9QUklPX1dIT19QUk9DRVNTLCBwaWQpOworCisJCXByaW50ZigicGlkPSVkLCAlZFxuIiwgcGlkLCBpb3ByaW8pOworCisJCWlmIChpb3ByaW8gPT0gLTEpCisJCQlwZXJyb3IoImlvcHJpb19nZXQiKTsKKwkJZWxzZSB7CisJCQlpb3ByaW9fY2xhc3MgPSBpb3ByaW8gPj4gSU9QUklPX0NMQVNTX1NISUZUOworCQkJaW9wcmlvID0gaW9wcmlvICYgMHhmZjsKKwkJCXByaW50ZigiJXM6IHByaW8gJWRcbiIsIHRvX3ByaW9baW9wcmlvX2NsYXNzXSwgaW9wcmlvKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpb3ByaW9fc2V0KElPUFJJT19XSE9fUFJPQ0VTUywgcGlkLCBpb3ByaW8gfCBpb3ByaW9fY2xhc3MgPDwgSU9QUklPX0NMQVNTX1NISUZUKSA9PSAtMSkgeworCQkJcGVycm9yKCJpb3ByaW9fc2V0Iik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmIChhcmd2W29wdGluZF0pCisJCQlleGVjdnAoYXJndltvcHRpbmRdLCAmYXJndltvcHRpbmRdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLS0tPiBzbmlwIGlvbmljZS5jIHRvb2wgPC0tLQorCisKK01hcmNoIDExIDIwMDUsIEplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NjaXNzLnR4dCBiL0RvY3VtZW50YXRpb24vY2Npc3MudHh0CmluZGV4IGQ1OTliZWIuLmM4ZjlhNzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Npc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2Npc3MudHh0CkBAIC0xNyw2ICsxNyw3IEBACiAJKiBTQSBQNjAwCiAJKiBTQSBQODAwCiAJKiBTQSBFNDAwCisJKiBTQSBFMzAwCiAKIElmIG5vZGVzIGFyZSBub3QgYWxyZWFkeSBjcmVhdGVkIGluIHRoZSAvZGV2L2NjaXNzIGRpcmVjdG9yeSwgcnVuIGFzIHJvb3Q6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZG9udGRpZmYgYi9Eb2N1bWVudGF0aW9uL2RvbnRkaWZmCmluZGV4IGQ0ZmRhMjUuLmI5NzRjZjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZG9udGRpZmYKKysrIGIvRG9jdW1lbnRhdGlvbi9kb250ZGlmZgpAQCAtNDEsNiArNDEsNyBAQAogQ1JFRElUUwogQ1ZTCiBDaGFuZ2VTZXQKK0ltYWdlCiBLZXJudHlwZXMKIE1PRFMudHh0CiBNb2R1bGUuc3ltdmVycwpAQCAtMTAzLDYgKzEwNCw3IEBACiBsb2dvXypfY2x1dDIyNC5jCiBsb2dvXypfbW9uby5jCiBseGRpYWxvZworbWFjaC10eXBlcy5oCiBtYWtlX3RpbWVzX2gKIG1hcAogbWF1aV9ib290LmgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKaW5kZXggYzdlZDAxYi4uYWMwNzk3ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKQEAgLTEzLDE0ICsxMywxNyBAQAogVGhlIGZyYW1ld29yayBwcm92aWRlcyBnZW5lcmljIGZ1bmN0aW9ucyAobW9zdGx5IGtlcm5lbCBBUEkgY2FsbHMpLCBzdWNoIGFzOgogCiAtIFRyYW5zcG9ydCBTdHJlYW0gVVJCIGhhbmRsaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggZHZiLWRlbXV4LWZlZWQtY29udHJvbAotICAoYnVsayBhbmQgaXNvYyAoVE9ETykgYXJlIHN1cHBvcnRlZCkKKyAgKGJ1bGsgYW5kIGlzb2MgYXJlIHN1cHBvcnRlZCkKIC0gcmVnaXN0ZXJpbmcgdGhlIGRldmljZSBmb3IgdGhlIERWQi1BUEkKIC0gcmVnaXN0ZXJpbmcgYW4gSTJDLWFkYXB0ZXIgaWYgYXBwbGljYWJsZQogLSByZW1vdGUtY29udHJvbC9pbnB1dC1kZXZpY2UgaGFuZGxpbmcKIC0gZmlybXdhcmUgcmVxdWVzdGluZyBhbmQgbG9hZGluZyAoY3VycmVudGx5IGp1c3QgZm9yIHRoZSBDeXByZXNzIFVTQgotICBjb250cm9sbGVyKQorICBjb250cm9sbGVycykKIC0gb3RoZXIgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGRyaXZlcnMgKHN1Y2ggYXMKICAgZnVuY3Rpb25zIGZvciBidWxrLWNvbnRyb2wtY29tbWFuZHMpCistIFRPRE86IGEgSTJDLWNodW5rZXIuIEl0IGNyZWF0ZXMgZGV2aWNlLXNwZWNpZmljIGNodW5rcyBvZiByZWdpc3Rlci1hY2Nlc3NlcworICBkZXBlbmRpbmcgb24gbGVuZ3RoIG9mIGEgcmVnaXN0ZXIgYW5kIHRoZSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgY2FuIGJlCisgIG11bHRpLXdyaXR0ZW4gYW5kIG11bHRpLXJlYWQuCiAKIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGFydGljdWxhciBEVkIgVVNCIGRldmljZXMgZG9lcyBqdXN0IHRoZSBjb21tdW5pY2F0aW9uCiB3aXRoIHRoZSBkZXZpY2UgdmlhIHRoZSBidXMuIFRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIERWQi1BUEktZnVuY3Rpb25hbGl0eQpAQCAtMzYsOTMgKzM5LDE4IEBACiBUT0RPOiBkeW5hbWljIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb2YgdGhlIHBpZC1maWx0ZXIgaW4gcmVnYXJkIHRvIG51bWJlciBvZgogZmVlZHMgcmVxdWVzdGVkLgogCi1TdXBwb3J0ZWQgZGV2aWNlcyBVU0IxLjEKK1N1cHBvcnRlZCBkZXZpY2VzCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotUHJvZHVjZWQgYW5kIHJlc2VsbGVkIGJ5IFR3aW5oYW46Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gVHdpbmhhbkRUViBVU0ItVGVyIERWQi1UIERldmljZSAoVlA3MDQxKQotCWh0dHA6Ly93d3cudHdpbmhhbi5jb20vcHJvZHVjdF90ZXJyZXN0cmlhbF8zLmFzcAorU2VlIHRoZSBMaW51eFRWIERWQiBXaWtpIGF0IHd3dy5saW51eHR2Lm9yZyBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mCitjYXJkcy9kcml2ZXJzL2Zpcm13YXJlczoKIAotLSBUd2luaGFuRFRWIE1hZ2ljIEJveCAoVlA3MDQxZSkKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfNC5hc3AKLQotLSBIQU1BIERWQi1UIFVTQiBkZXZpY2UKLQlodHRwOi8vd3d3LmhhbWEuZGUvcG9ydGFsL2FydGljbGVJZCoxMTA2MjAvYWN0aW9uKjI1OTgKLQotLSBDVFMgUG9ydGFibGUgKENoaW5lc2UgVGVsZXZpc2lvbiBTeXN0ZW0pICgyKQotCWh0dHA6Ly93d3cuMmN0cy50di9jdHNwb3J0YWJsZS8KLQotLSBVbmtub3duIFVTQiBEVkItVCBkZXZpY2Ugd2l0aCB2ZW5kb3IgSUQgSHlwZXItUGFsdGVrCi0KLQotUHJvZHVjZWQgYW5kIHJlc2VsbGVkIGJ5IEtXb3JsZDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEtXb3JsZCBWLVN0cmVhbSBYUEVSVCBEVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5rd29ybGQuY29tLnR3L2VuL3Byb2R1Y3QvRFZCVC1VU0IvRFZCVC1VU0IuaHRtbAotCi0tIEpldFdheSBEVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5qZXR3YXkuY29tLnR3L2V2aXNuL3Byb2R1Y3QvbGNkLXR2L0RWVC1VU0IvZHR2LXVzYi5odG0KLQotLSBBRFNUZWNoIEluc3RhbnQgVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5hZHN0ZWNoLmNvbS9wcm9kdWN0cy9QVFYtMzMzL2ludHJvL1BUVi0zMzNfaW50cm8uYXNwP3BpZD1QVFYtMzMzCi0KLQotT3RoZXJzOgotLS0tLS0tLQotLSBVbHRpbWEgRWxlY3Ryb25pYy9BcnRlYyBUMSBVU0IgVFZCT1ggKEFOMjEzNSwgQU4yMjM1LCBBTjIyMzUgd2l0aCBQYW5hc29uaWMgVHVuZXIpCi0JaHR0cDovLzgyLjE2MS4yNDYuMjQ5L3Byb2R1Y3RzLXR2Ym94Lmh0bWwKLQotLSBDb21wcm8gVmlkZW9tYXRlIERWQi1VMjAwMCAtIERWQi1UIFVTQiAoMikKLQlodHRwOi8vd3d3LmNvbXByb3VzYS5jb20vcHJvZHVjdHMvdm11MjAwMC5odG0KLQotLSBHcmFuZHRlYyBVU0IgRFZCLVQKLQlodHRwOi8vd3d3LmdyYW5kLmNvbS50dy8KLQotLSBBVmVyTWVkaWEgQXZlclRWIERWQlQgVVNCCi0JaHR0cDovL3d3dy5hdmVybWVkaWEuY29tLwotCi0tIERpQmNvbSBVU0IgRFZCLVQgcmVmZXJlbmNlIGRldmljZSAobm9uLXB1YmxpYykKLQotCi1TdXBwb3J0ZWQgZGV2aWNlcyBVU0IyLjAtb25seQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gVHdpbmhhbiBNYWdpY0JveCBJSQotCWh0dHA6Ly93d3cudHdpbmhhbi5jb20vcHJvZHVjdF90ZXJyZXN0cmlhbF83LmFzcAotCi0tIFR3aW5oYW5EVFYgQWxwaGEKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfOC5hc3AKLQotLSBEaWdpdGFsTm93IFRpbnlVU0IgMiBEVkItdCBSZWNlaXZlcgotCWh0dHA6Ly93d3cuZGlnaXRhbG5vdy5jb20uYXUvRGlnaXRhbE5vdyUyMHRpbnlVU0IyJTIwU3BlY2lmaWNhdGlvbnMuaHRtbAotCi0tIEhhbmZ0ZWsgVU1ULTAxMAotCWh0dHA6Ly93d3cuZ2xvYmFsc291cmNlcy5jb20vc2kvNjAwODgxOTc1NzA4Mi9Qcm9kdWN0RGV0YWlsL0RpZ2l0YWwtVFYvcHJvZHVjdF9pZC0xMDAwNDY1MjkKLQotCi1TdXBwb3J0ZWQgZGV2aWNlcyBVU0IyLjAgYW5kIFVTQjEuMQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gVHlwaG9vbi9ZYWt1bW8vSEFNQS9ZdWFuIERWQi1UIG1vYmlsZSBVU0IyLjAKLQlodHRwOi8vd3d3Lnlha3Vtby5kZS9wcm9kdWt0ZS9pbmRleC5waHA/cGlkPTEmYWc9RFZCLVQKLQlodHRwOi8vd3d3Lnl1YW4uY29tLnR3L2VuL3Byb2R1Y3RzL3Zkb191YjMwMC5odG1sCi0JaHR0cDovL3d3dy5oYW1hLmRlL3BvcnRhbC9hcnRpY2xlSWQqMTE0NjYzL2FjdGlvbioyNTYzCi0JaHR0cDovL3d3dy5hbnViaXNsaW5lLmNvbS9lbmdsaXNoL2FydGljbGVjLmFzcD9pZD01MDUwMiZjYXRpZD0wMDIKLQotLSBBcnRlYyBUMSBVU0IgVFZCT1ggKEZYMikgKDIpCi0KLS0gSGF1cHBhdWdlIFdpblRWIE5PVkEtVCBVU0IyCi0JaHR0cDovL3d3dy5oYXVwcGF1Z2UuY29tLwotCi0tIEtXb3JsZC9BRFNUZWNoIEluc3RhbnQgRFZCLVQgVVNCMi4wIChEaUIzMDAwTS1CKQotCi0tIERpQmNvbSBVU0IyLjAgRFZCLVQgcmVmZXJlbmNlIGRldmljZSAobm9uLXB1YmxpYykKLQotLSBBVmVyTWVkaWEgQXZlclRWIEE4MDAgRFZCLVQgVVNCMi4wCi0KLTEpIEl0IGlzIHdvcmtpbmcgYWxtb3N0IC0gd29yay1pbi1wcm9ncmVzcy4KLTIpIE5vIHRlc3QgcmVwb3J0cyByZWNlaXZlZCB5ZXQuCitodHRwOi8vd3d3LmxpbnV4dHYub3JnL3dpa2kvaW5kZXgucGhwL0RWQl9VU0IKIAogMC4gSGlzdG9yeSAmIE5ld3M6CisgIDIwMDUtMDYtMzAgLSBhZGRlZCBzdXBwb3J0IGZvciBXaWRlVmlldyBXVC0yMjBVIChUaGFua3MgdG8gU3RldmUgQ2hhbmcpCisgIDIwMDUtMDUtMzAgLSBhZGRlZCBiYXNpYyBpc29jaHJvbm91cyBzdXBwb3J0IHRvIHRoZSBkdmItdXNiLWZyYW1ld29yaworICAgICAgICAgICAgICAgYWRkZWQgc3VwcG9ydCBmb3IgQ29uZXhhbnQgSHlicmlkIHJlZmVyZW5jZSBkZXNpZ24gYW5kIE5lYnVsYSBEaWdpVFYgVVNCCiAgIDIwMDUtMDQtMTcgLSBhbGwgZGlidXNiIGRldmljZXMgcG9ydGVkIHRvIG1ha2UgdXNlIG9mIHRoZSBkdmItdXNiLWZyYW1ld29yawogICAyMDA1LTA0LTAyIC0gcmUtZW5hYmxlZCBhbmQgaW1wcm92ZWQgcmVtb3RlIGNvbnRyb2wgY29kZS4KICAgMjAwNS0wMy0zMSAtIHBvcnRlZCB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVCBVU0IyLjAgZGV2aWNlIHRvIGR2Yi11c2IuCkBAIC0xMzcsNyArNjUsNyBAQAogICAyMDA1LTAxLTMxIC0gZGlzdG9ydGVkIHN0cmVhbWluZyBpcyBnb25lIGZvciBVU0IxLjEgZGV2aWNlcwogICAyMDA1LTAxLTEzIC0gbW92ZWQgdGhlIG1pcnJvcmVkIHBpZF9maWx0ZXJfdGFibGUgYmFjayB0byBkdmItZGlidXNiCiAgICAgICAgICAgICAgLSBmaXJzdCBhbG1vc3Qgd29ya2luZyB2ZXJzaW9uIGZvciBIYW5mVGVrIFVNVC0wMTAKLSAgICAgICAgICAgICAtIGZvdW5kIG91dCwgdGhhdCBZYWt1bW8vSEFNQS9UeXBob29uIGFyZSBwcmVkZXNzb3JzIG9mIHRoZSBIYW5mVGVrIFVNVC0wMTAKKyAgICAgICAgICAgICAtIGZvdW5kIG91dCwgdGhhdCBZYWt1bW8vSEFNQS9UeXBob29uIGFyZSBwcmVkZWNlc3NvcnMgb2YgdGhlIEhhbmZUZWsgVU1ULTAxMAogICAyMDA1LTAxLTEwIC0gcmVmYWN0b3JpbmcgY29tcGxldGVkLCBub3cgZXZlcnl0aGluZyBpcyB2ZXJ5IGRlbGlnaHRmdWwKICAgICAgICAgICAgICAtIHR1bmVyIHF1aXJrcyBmb3Igc29tZSB3ZWlyZCBkZXZpY2VzIChBcnRlYyBUMSBBTjIyMzUgZGV2aWNlIGhhcyBzb21ldGltZXMgYQogICAgICAgICAgICAgICAgUGFuYXNvbmljIFR1bmVyIGFzc2VtYmxlZCkuIFR1bmVycHJvYmluZyBpbXBsZW1lbnRlZC4gVGhhbmtzIGEgbG90IHRvIEd1bm5hciBXaXR0aWNoLgpAQCAtMTg3LDI1ICsxMTUsMTMgQEAKIDEuIEhvdyB0byB1c2U/CiAxLjEuIEZpcm13YXJlCiAKLU1vc3Qgb2YgdGhlIFVTQiBkcml2ZXJzIG5lZWQgdG8gZG93bmxvYWQgYSBmaXJtd2FyZSB0byBzdGFydCB3b3JraW5nLgorTW9zdCBvZiB0aGUgVVNCIGRyaXZlcnMgbmVlZCB0byBkb3dubG9hZCBhIGZpcm13YXJlIHRvIHRoZSBkZXZpY2UgYmVmb3JlIHN0YXJ0Cit3b3JraW5nLgogCi1mb3IgVVNCMS4xIChBTjIxMzUpIHlvdSBuZWVkOiBkdmItdXNiLWRpYnVzYi01LjAuMC4xMS5mdwotZm9yIFVTQjIuMCBIYW5mVGVrOiBkdmItdXNiLXVtdC0wMTAtMDIuZncKLWZvciBVU0IyLjAgRGlCY29tOiBkdmItdXNiLWRpYnVzYi02LjAuMC44LmZ3Ci1mb3IgVVNCMi4wIEFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCMjogZHZiLXVzYi1hdmVydHYtYTgwMC0wMS5mdwotZm9yIFVTQjIuMCBUd2luaGFuRFRWIEFscGhhL01hZ2ljQm94IElJOiBkdmItdXNiLXZwNzA0NS0wMS5mdworSGF2ZSBhIGxvb2sgYXQgdGhlIFdpa2lwYWdlIGZvciB0aGUgRFZCLVVTQi1kcml2ZXJzIHRvIGZpbmQgb3V0LCB3aGljaCBmaXJtd2FyZQoreW91IG5lZWQgZm9yIHlvdXIgZGV2aWNlOgogCi1UaGUgZmlsZXMgY2FuIGJlIGZvdW5kIG9uIGh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWQvZmlybXdhcmUvIC4KLQotV2UgZG8gbm90IGhhdmUgdGhlIHBlcm1pc3Npb24gKHlldCkgdG8gcHVibGlzaCB0aGUgZm9sbG93aW5nIGZpcm13YXJlLWZpbGVzLgotWW91J2xsIG5lZWQgdG8gZXh0cmFjdCB0aGVtIGZyb20gdGhlIHdpbmRvd3MgZHJpdmVycy4KLQotWW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSAiZ2V0X2R2Yl9maXJtd2FyZSBkdmItdXNiIiB0byBnZXQgdGhlIGZpcm13YXJlOgotCi1mb3IgVVNCMS4xIChBTjIyMzUpIChhIGZldyBBcnRlYyBUMSBkZXZpY2VzKTogZHZiLXVzYi1kaWJ1c2ItYW4yMjM1LTAxLmZ3Ci1mb3IgVVNCMi4wIEhhdXBwYXVnZTogZHZiLXVzYi1ub3ZhLXQtdXNiMi0wMS5mdwotZm9yIFVTQjIuMCBBRFNUZWNoL0t3b3JsZCBVU0IyLjA6IGR2Yi11c2ItYWRzdGVjaC11c2IyLTAxLmZ3Ci1mb3IgVVNCMi4wIFlha3Vtby9UeXBob29uL0hhbWE6IGR2Yi11c2ItZHR0MjAwdS0wMS5mdworaHR0cDovL3d3dy5saW51eHR2Lm9yZy93aWtpL2luZGV4LnBocC9EVkJfVVNCCiAKIDEuMi4gQ29tcGlsaW5nCiAKQEAgLTI4OSw2ICsyMDUsOSBAQAogICAgR3VubmFyIFdpdHRpY2ggYW5kIEpvYWNoaW0gdm9uIENhcm9uIGZvciB0aGVpciB0cnVzdCBmb3IgcHJvdmlkaW5nCiAgICAgcm9vdC1zaGVsbHMgb24gdGhlaXIgbWFjaGluZXMgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIG5ldyBkZXZpY2VzLgogCisgICBBbGxhbiBUaGlyZCBhbmQgTWljaGFlbCBIdXRjaGluc29uIGZvciB0aGVpciBoZWxwIHRvIHdyaXRlIHRoZSBOZWJ1bGEKKyAgICBkaWdpdHYtZHJpdmVyLgorCiAgICBHbGVuIEhhcnJpcyBmb3IgYnJpbmdpbmcgdXAsIHRoYXQgdGhlcmUgaXMgYSBuZXcgZGlidXNiLWRldmljZSBhbmQgSml1bi1LdWVpCiAgICAgSnVuZyBmcm9tIEFWZXJNZWRpYSB3aG8ga2luZGx5IHByb3ZpZGVkIGEgc3BlY2lhbCBmaXJtd2FyZSB0byBnZXQgdGhlIGRldmljZQogICAgIHVwIGFuZCBydW5uaW5nIGluIExpbnV4LgpAQCAtMjk2LDcgKzIxNSwxMiBAQAogICAgSmVubmlmZXIgQ2hlbiwgSmVmZiBhbmQgSmFjayBmcm9tIFR3aW5oYW4gZm9yIGtpbmRseSBzdXBwb3J0aW5nIGJ5CiAJd3JpdGluZyB0aGUgdnA3MDQ1LWRyaXZlci4KIAotICAgU29tZSBndXlzIG9uIHRoZSBsaW51eC1kdmIgbWFpbGluZyBsaXN0IGZvciBlbmNvdXJhZ2luZyBtZQorICAgU3RldmUgQ2hhbmcgZnJvbSBXaWRlVmlldyBmb3IgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGZvciBuZXcgZGV2aWNlcyBhbmQKKwlmaXJtd2FyZSBmaWxlcy4KKworICAgTWljaGFlbCBQYXh0b24gZm9yIHN1Ym1pdHRpbmcgcmVtb3RlIGNvbnRyb2wga2V5bWFwcy4KKworICAgU29tZSBndXlzIG9uIHRoZSBsaW51eC1kdmIgbWFpbGluZyBsaXN0IGZvciBlbmNvdXJhZ2luZyBtZS4KIAogICAgUGV0ZXIgU2NoaWxkbWFubiA+cGV0ZXIuc2NoaWxkbWFubi1ub3NwYW0tYXQtd2ViLmRlPCBmb3IgaGlzCiAgICAgdXNlci1sZXZlbCBmaXJtd2FyZSBsb2FkZXIsIHdoaWNoIHNhdmVzIGEgbG90IG9mIHRpbWUKQEAgLTMwNSw0ICsyMjksNCBAQAogICAgVWxmIEhlcm1lbmF1IGZvciBoZWxwaW5nIG1lIG91dCB3aXRoIHRyYWRpdGlvbmFsIGNoaW5lc2UuCiAKICAgIEFuZHLpIFNtb2t0dW4gYW5kIENocmlzdGlhbiBGcvZtbWVsIGZvciBzdXBwb3J0aW5nIG1lIHdpdGgKLSAgICBoYXJkd2FyZSBhbmQgbGlzdGVuaW5nIHRvIG15IHByb2JsZW1zIHZlcnkgcGF0aWVudC4KKyAgICBoYXJkd2FyZSBhbmQgbGlzdGVuaW5nIHRvIG15IHByb2JsZW1zIHZlcnkgcGF0aWVudGx5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CmluZGV4IDNhMzI2MDcuLmU2YjhkMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKQEAgLTEsNjYgKzEsNTUgQEAKLUhvdyB0byBnZXQgdGhlIE5lYnVsYSwgUENUViBhbmQgVHdpbmhhbiBEU1QgY2FyZHMgd29ya2luZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gZ2V0IHRoZSBOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWLCBQaW5uYWNsZSBQQ1RWIFNhdCwgVHdpbmhhbiBEU1QgKyBjbG9uZXMgd29ya2luZworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhpcyBjbGFzcyBvZiBjYXJkcyBoYXMgYSBidDg3OGEgYXMgdGhlIFBDSSBpbnRlcmZhY2UsIGFuZAotcmVxdWlyZSB0aGUgYnR0diBkcml2ZXIuCisxKSBHZW5lcmFsIGluZm9ybWF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09CiAKLVBsZWFzZSBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSB3YXJuaW5nIGFib3V0IHRoZSBidHR2IG1vZHVsZQotb3B0aW9ucyBiZWxvdyBmb3IgdGhlIERTVCBjYXJkLgorVGhpcyBjbGFzcyBvZiBjYXJkcyBoYXMgYSBidDg3OGEgY2hpcCBhcyB0aGUgUENJIGludGVyZmFjZS4KK1RoZSBkaWZmZXJlbnQgY2FyZCBkcml2ZXJzIHJlcXVpcmUgdGhlIGJ0dHYgZHJpdmVyIHRvIHByb3ZpZGUgdGhlIG1lYW5zCit0byBhY2Nlc3MgdGhlIGkyYyBidXMgYW5kIHRoZSBncGlvIHBpbnMgb2YgdGhlIGJ0OHh4IGNoaXBzZXQuCiAKLTEpIEdlbmVyYWwgaW5mb3JtYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PQorMikgQ29tcGlsYXRpb24gcnVsZXMgZm9yIEtlcm5lbCA+PSAyLjYuMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZXNlIGRyaXZlcnMgcmVxdWlyZSB0aGUgYnR0diBkcml2ZXIgdG8gcHJvdmlkZSB0aGUgbWVhbnMgdG8gYWNjZXNzCi10aGUgaTJjIGJ1cyBhbmQgdGhlIGdwaW8gcGlucyBvZiB0aGUgYnQ4eHggY2hpcHNldC4KK0VuYWJsZSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiAKLUJlY2F1c2Ugb2YgdGhpcywgeW91IG5lZWQgdG8gZW5hYmxlCiAiRGV2aWNlIGRyaXZlcnMiID0+ICJNdWx0aW1lZGlhIGRldmljZXMiCi0gID0+ICJWaWRlbyBGb3IgTGludXgiID0+ICJCVDg0OCBWaWRlbyBGb3IgTGludXgiCi0KLUZ1cnRoZXJtb3JlIHlvdSBuZWVkIHRvIGVuYWJsZQorID0+ICJWaWRlbyBGb3IgTGludXgiID0+ICJCVDg0OCBWaWRlbyBGb3IgTGludXgiCiAiRGV2aWNlIGRyaXZlcnMiID0+ICJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzIgotICA9PiAiRFZCIGZvciBMaW51eCIgIkRWQiBDb3JlIFN1cHBvcnQiICJOZWJ1bGEvUGlubmFjbGUgUENUVi9Ud2luSGFuIFBDSSBDYXJkcyIKKyA9PiAiRFZCIGZvciBMaW51eCIgIkRWQiBDb3JlIFN1cHBvcnQiICJOZWJ1bGEvUGlubmFjbGUgUENUVi9Ud2luSGFuIFBDSSBDYXJkcyIKIAotMikgTG9hZGluZyBNb2R1bGVzCi09PT09PT09PT09PT09PT09PT0KKzMpIExvYWRpbmcgTW9kdWxlcywgZGVzY3JpYmVkIGJ5IHR3byBhcHByb2FjaGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBJbiBnZW5lcmFsIHlvdSBuZWVkIHRvIGxvYWQgdGhlIGJ0dHYgZHJpdmVyLCB3aGljaCB3aWxsIGhhbmRsZSB0aGUgZ3BpbyBhbmQKLWkyYyBjb21tdW5pY2F0aW9uIGZvciB1cywgcGx1cyB0aGUgY29tbW9uIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLgotVGhlIGZyb250ZW5kcyBmb3IgTmVidWxhIChueHQ2MDAwKSwgUGlubmFjbGUgUENUViAoY3gyNDExMCkgYW5kCi1Ud2luSGFuIChkc3QpIGFyZSBsb2FkZWQgYXV0b21hdGljYWxseSBieSB0aGUgZHZiLWJ0OHh4IGRldmljZSBkcml2ZXIuCitpMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlciwKK3doaWNoIGlzIGNhbGxlZCB0aGUgYmFja2VuZC4KK1RoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSBEaWdpVFYgKG54dDYwMDApLCBQaW5uYWNsZSBQQ1RWIFNhdCAoY3gyNDExMCksCitUd2luSGFuIERTVCArIGNsb25lcyAoZHN0IGFuZCBkc3QtY2EpIGFyZSBsb2FkZWQgYXV0b21hdGljYWxseSBieSB0aGUgYmFja2VuZC4KK0ZvciBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgVHdpbkhhbiBEU1QgKyBjbG9uZXMgc2VlIC9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQuCiAKLTNhKSBOZWJ1bGEgLyBQaW5uYWNsZSBQQ1RWCiszYSkgVGhlIG1hbnVhbCBhcHByb2FjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9hZGluZyBtb2R1bGVzOgorbW9kcHJvYmUgYnR0dgorbW9kcHJvYmUgZHZiLWJ0OHh4CisKK1VubG9hZGluZyBtb2R1bGVzOgorbW9kcHJvYmUgLXIgZHZiLWJ0OHh4Cittb2Rwcm9iZSAtciBidHR2CisKKzNiKSBUaGUgYXV0b21hdGljIGFwcHJvYWNoCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAkIG1vZHByb2JlIGJ0dHYgKG5vcm1hbGx5IGJ0dHYgaXMgYmVpbmcgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkga21vZCkKLSAgICQgbW9kcHJvYmUgZHZiLWJ0OHh4IChvciBqdXN0IHBsYWNlIGR2Yi1idDh4eCBpbiAvZXRjL21vZHVsZXMgZm9yIGF1dG9tYXRpYyBsb2FkaW5nKQorSWYgbm90IGFscmVhZHkgZG9uZSBieSBpbnN0YWxsYXRpb24sIHBsYWNlIGEgbGluZSBlaXRoZXIgaW4KKy9ldGMvbW9kdWxlcy5jb25mIG9yIGluIC9ldGMvbW9kcHJvYmUuY29uZiBjb250YWluaW5nIHRoaXMgdGV4dDoKK2FsaWFzIGNoYXItbWFqb3ItODEJYnR0dgogCitUaGVuIHBsYWNlIGEgbGluZSBpbiAvZXRjL21vZHVsZXMgY29udGFpbmluZyB0aGlzIHRleHQ6CitkdmItYnQ4eHgKIAotM2IpIFR3aW5IYW4gYW5kIENsb25lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgJCBtb2Rwcm9iZSBidHR2IGkyY19odz0xIGNhcmQ9MHg3MQotICAgJCBtb2Rwcm9iZSBkdmItYnQ4eHgKLSAgICQgbW9kcHJvYmUgZHN0Ci0KLVRoZSB2YWx1ZSAweDcxIHdpbGwgb3ZlcnJpZGUgdGhlIFBDSSB0eXBlIGRldGVjdGlvbiBmb3IgZHZiLWJ0OHh4LAotd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBUd2luSGFuIGNhcmRzLgotCi1JZiB5b3UncmUgaGF2aW5nIGFuIG9sZGVyIGNhcmQgKGJsdWUgY29sb3IgY2lyY3VpdCkgYW5kIGNhcmQ9MHg3MSBsb2NrcwoteW91ciBtYWNoaW5lLCB0cnkgdXNpbmcgMHg2OCwgdG9vLiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGFzayBvbiB0aGUKLW1haWxpbmcgbGlzdC4KLQotVGhlIERTVCBtb2R1bGUgdGFrZXMgYSBjb3VwbGUgb2YgdXNlZnVsIHBhcmFtZXRlcnM6Ci0KLWEuIHZlcmJvc2UgdGFrZXMgdmFsdWVzIDAgdG8gNS4gVGhlc2UgdmFsdWVzIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSBsZXZlbC4KLWIuIGRlYnVnIHRha2VzIHZhbHVlcyAwIGFuZCAxLiBZb3UgY2FuIGVpdGhlciBkaXNhYmxlIG9yIGVuYWJsZSBkZWJ1Z2dpbmcuCi1jLiBkc3RfYWRkb25zIHRha2VzIHZhbHVlcyAwIGFuZCAweDIwOgotLSBBIHZhbHVlIG9mIDAgbWVhbnMgaXQgaXMgYSBGVEEgY2FyZC4KLS0gQSB2YWx1ZSBvZiAweDIwIG1lYW5zIGl0IGhhcyBhIENvbmRpdGlvbmFsIEFjY2VzcyBzbG90LgotCi1UaGUgYXV0b2RldGVjdGVkIHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgInJlc3BvbnNlIHN0cmluZyIKLW9mIHRoZSBjYXJkLCB3aGljaCB5b3UgY2FuIHNlZSBpbiB5b3VyIGxvZ3M6Ci1lLmcuOiBkc3RfZ2V0X2RldmljZV9pZDogUmVjb2duaXplIFtEU1RNQ0ldCitSZWJvb3QgeW91ciBzeXN0ZW0gYW5kIGhhdmUgZnVuIQogCiAtLQogQXV0aG9yczogUmljaGFyZCBXYWxrZXIsIEphbWllIEhvbmFuLCBNaWNoYWVsIEh1bm9sZCwgTWFudSBBYnJhaGFtLCBVd2UgQnVnbGEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAxZDIyN2VlLi44YjE0MzBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0xMDMsMTEgKzEwMywxMSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoYXQ6CXJlZ2lzdGVyX3NlcmlhbC91bnJlZ2lzdGVyX3NlcmlhbAotV2hlbjoJRGVjZW1iZXIgMjAwNQorV2hlbjoJU2VwdGVtYmVyIDIwMDUKIFdoeToJVGhpcyBpbnRlcmZhY2UgZG9lcyBub3QgYWxsb3cgc2VyaWFsIHBvcnRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdAogCWEgc3RydWN0IGRldmljZSwgYW5kIGFzIHN1Y2ggZG9lcyBub3QgYWxsb3cgY29ycmVjdCBwb3dlciBtYW5hZ2VtZW50CiAJb2Ygc3VjaCBwb3J0cy4gIDgyNTAtYmFzZWQgcG9ydHMgc2hvdWxkIHVzZSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQKLQlhbmQgc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQgaW5zdGVhZC4KKwlhbmQgc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQsIG9yIHBsYXRmb3JtIGRldmljZXMgaW5zdGVhZC4KIFdobzoJUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTksMyArMTE5LDE5IEBACiAJd2lsbCBiZSBhdmFpbGFibGUgdW50aWwgcmVtb3ZhbCBvZiBvbGQgbmFtZXMuCiBXaG86CUdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPgogCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJUENNQ0lBIGNvbnRyb2wgaW9jdGwgKG5lZWRlZCBmb3IgcGNtY2lhLWNzIFtjYXJkbWdyLCBjYXJkY3RsXSkKK1doZW46CU5vdmVtYmVyIDIwMDUKK0ZpbGVzOglkcml2ZXJzL3BjbWNpYS86IHBjbWNpYV9pb2N0bC5jCitXaHk6CVdpdGggdGhlIDE2LWJpdCBQQ01DSUEgc3Vic3lzdGVtIG5vdyBiZWhhdmluZyAoYWxtb3N0KSBsaWtlIGEKKwlub3JtYWwgaG90cGx1Z2dhYmxlIGJ1cywgYW5kIHdpdGggaXQgdXNpbmcgdGhlIGRlZmF1bHQga2VybmVsCisJaW5mcmFzdHJ1Y3R1cmUgKGhvdHBsdWcsIGRyaXZlciBjb3JlLCBzeXNmcykga2VlcGluZyB0aGUgUENNQ0lBCisJY29udHJvbCBpb2N0bCBuZWVkZWQgYnkgY2FyZG1nciBhbmQgY2FyZGN0bCBmcm9tIHBjbWNpYS1jcyBpcworCXVubmVjZXNzYXJ5LCBhbmQgbWFrZXMgZnVydGhlciBjbGVhbnVwcyBhbmQgaW50ZWdyYXRpb24gb2YgdGhlCisJUENNQ0lBIHN1YnN5c3RlbSBpbnRvIHRoZSBMaW51eCBrZXJuZWwgZGV2aWNlIGRyaXZlciBtb2RlbCBtb3JlCisJZGlmZmljdWx0LiBUaGUgZmVhdHVyZXMgcHJvdmlkZWQgYnkgY2FyZG1nciBhbmQgY2FyZGN0bCBhcmUgZWl0aGVyCisJaGFuZGxlZCBieSB0aGUga2VybmVsIGl0c2VsZiBub3cgb3IgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3CisJcGNtY2lhdXRpbHMgcGFja2FnZSBhdmFpbGFibGUgYXQKKwlodHRwOi8va2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL3BjbWNpYS8KK1dobzoJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pbm90aWZ5LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1MDE5MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKQEAgLTAsMCArMSwxNTEgQEAKKwkJCQkgICBpbm90aWZ5CisJICAgIGEgcG93ZXJmdWwgeWV0IHNpbXBsZSBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtCisKKworCitEb2N1bWVudCBzdGFydGVkIDE1IE1hciAyMDA1IGJ5IFJvYmVydCBMb3ZlIDxybWxAbm92ZWxsLmNvbT4KKworCisoaSkgVXNlciBJbnRlcmZhY2UKKworSW5vdGlmeSBpcyBjb250cm9sbGVkIGJ5IGEgc2V0IG9mIHRocmVlIHN5c3RlbSBjYWxscyBhbmQgbm9ybWFsIGZpbGUgSS9PIG9uIGEKK3JldHVybmVkIGZpbGUgZGVzY3JpcHRvci4KKworRmlyc3Qgc3RlcCBpbiB1c2luZyBpbm90aWZ5IGlzIHRvIGluaXRpYWxpc2UgYW4gaW5vdGlmeSBpbnN0YW5jZToKKworCWludCBmZCA9IGlub3RpZnlfaW5pdCAoKTsKKworRWFjaCBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB1bmlxdWUsIG9yZGVyZWQgcXVldWUuCisKK0NoYW5nZSBldmVudHMgYXJlIG1hbmFnZWQgYnkgIndhdGNoZXMiLiAgQSB3YXRjaCBpcyBhbiAob2JqZWN0LG1hc2spIHBhaXIgd2hlcmUKK3RoZSBvYmplY3QgaXMgYSBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgdGhlIG1hc2sgaXMgYSBiaXQgbWFzayBvZiBvbmUgb3IgbW9yZQoraW5vdGlmeSBldmVudHMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIHJlY2VpdmUuICBTZWUgPGxpbnV4L2lub3RpZnkuaD4KK2ZvciB2YWxpZCBldmVudHMuICBBIHdhdGNoIGlzIHJlZmVyZW5jZWQgYnkgYSB3YXRjaCBkZXNjcmlwdG9yLCBvciB3ZC4KKworV2F0Y2hlcyBhcmUgYWRkZWQgdmlhIGEgcGF0aCB0byB0aGUgZmlsZS4KKworV2F0Y2hlcyBvbiBhIGRpcmVjdG9yeSB3aWxsIHJldHVybiBldmVudHMgb24gYW55IGZpbGVzIGluc2lkZSBvZiB0aGUgZGlyZWN0b3J5LgorCitBZGRpbmcgYSB3YXRjaCBpcyBzaW1wbGU6CisKKwlpbnQgd2QgPSBpbm90aWZ5X2FkZF93YXRjaCAoZmQsIHBhdGgsIG1hc2spOworCitXaGVyZSAiZmQiIGlzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBpbm90aWZ5X2luaXQoKSwgcGF0aCBpcyB0aGUgcGF0aCB0byB0aGUKK29iamVjdCB0byB3YXRjaCwgYW5kIG1hc2sgaXMgdGhlIHdhdGNoIG1hc2sgKHNlZSA8bGludXgvaW5vdGlmeS5oPikuCisKK1lvdSBjYW4gdXBkYXRlIGFuIGV4aXN0aW5nIHdhdGNoIGluIHRoZSBzYW1lIG1hbm5lciwgYnkgcGFzc2luZyBpbiBhIG5ldyBtYXNrLgorCitBbiBleGlzdGluZyB3YXRjaCBpcyByZW1vdmVkIHZpYQorCisJaW50IHJldCA9IGlub3RpZnlfcm1fd2F0Y2ggKGZkLCB3ZCk7CisKK0V2ZW50cyBhcmUgcHJvdmlkZWQgaW4gdGhlIGZvcm0gb2YgYW4gaW5vdGlmeV9ldmVudCBzdHJ1Y3R1cmUgdGhhdCBpcyByZWFkKDIpCitmcm9tIGEgZ2l2ZW4gaW5vdGlmeSBpbnN0YW5jZS4gIFRoZSBmaWxlbmFtZSBpcyBvZiBkeW5hbWljIGxlbmd0aCBhbmQgZm9sbG93cwordGhlIHN0cnVjdC4gSXQgaXMgb2Ygc2l6ZSBsZW4uICBUaGUgZmlsZW5hbWUgaXMgcGFkZGVkIHdpdGggbnVsbCBieXRlcyB0bworZW5zdXJlIHByb3BlciBhbGlnbm1lbnQuICBUaGlzIHBhZGRpbmcgaXMgcmVmbGVjdGVkIGluIGxlbi4KKworWW91IGNhbiBzbHVycCBtdWx0aXBsZSBldmVudHMgYnkgcGFzc2luZyBhIGxhcmdlIGJ1ZmZlciwgZm9yIGV4YW1wbGUKKworCXNpemVfdCBsZW4gPSByZWFkIChmZCwgYnVmLCBCVUZfTEVOKTsKKworV2hlcmUgImJ1ZiIgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mICJpbm90aWZ5X2V2ZW50IiBzdHJ1Y3R1cmVzIGF0IGxlYXN0CitCVUZfTEVOIGJ5dGVzIGluIHNpemUuICBUaGUgYWJvdmUgZXhhbXBsZSB3aWxsIHJldHVybiBhcyBtYW55IGV2ZW50cyBhcyBhcmUKK2F2YWlsYWJsZSBhbmQgZml0IGluIEJVRl9MRU4uCisKK0VhY2ggaW5vdGlmeSBpbnN0YW5jZSBmZCBpcyBhbHNvIHNlbGVjdCgpLSBhbmQgcG9sbCgpLWFibGUuCisKK1lvdSBjYW4gZmluZCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBldmVudCBxdWV1ZSB2aWEgdGhlIHN0YW5kYXJkIEZJT05SRUFECitpb2N0bCBvbiB0aGUgZmQgcmV0dXJuZWQgYnkgaW5vdGlmeV9pbml0KCkuCisKK0FsbCB3YXRjaGVzIGFyZSBkZXN0cm95ZWQgYW5kIGNsZWFuZWQgdXAgb24gY2xvc2UuCisKKworKGlpKQorCitQcm90b3R5cGVzOgorCisJaW50IGlub3RpZnlfaW5pdCAodm9pZCk7CisJaW50IGlub3RpZnlfYWRkX3dhdGNoIChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTMyIG1hc2spOworCWludCBpbm90aWZ5X3JtX3dhdGNoIChpbnQgZmQsIF9fdTMyIG1hc2spOworCisKKyhpaWkpIEludGVybmFsIEtlcm5lbCBJbXBsZW1lbnRhdGlvbgorCitFYWNoIGlub3RpZnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGlub3RpZnlfZGV2aWNlIHN0cnVjdHVyZS4KKworRWFjaCB3YXRjaCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5vdGlmeV93YXRjaCBzdHJ1Y3R1cmUuICBXYXRjaGVzIGFyZSBjaGFpbmVkCitvZmYgb2YgZWFjaCBhc3NvY2lhdGVkIGRldmljZSBhbmQgZWFjaCBhc3NvY2lhdGVkIGlub2RlLgorCitTZWUgZnMvaW5vdGlmeS5jIGZvciB0aGUgbG9ja2luZyBhbmQgbGlmZXRpbWUgcnVsZXMuCisKKworKGl2KSBSYXRpb25hbGUKKworUTogV2hhdCBpcyB0aGUgZGVzaWduIGRlY2lzaW9uIGJlaGluZCBub3QgdHlpbmcgdGhlIHdhdGNoIHRvIHRoZSBvcGVuIGZkIG9mCisgICB0aGUgd2F0Y2hlZCBvYmplY3Q/CisKK0E6IFdhdGNoZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhbiBvcGVuIGlub3RpZnkgZGV2aWNlLCBub3QgYW4gb3BlbiBmaWxlLgorICAgVGhpcyBzb2x2ZXMgdGhlIHByaW1hcnkgcHJvYmxlbSB3aXRoIGRub3RpZnk6IGtlZXBpbmcgdGhlIGZpbGUgb3BlbiBwaW5zCisgICB0aGUgZmlsZSBhbmQgdGh1cywgd29yc2UsIHBpbnMgdGhlIG1vdW50LiAgRG5vdGlmeSBpcyB0aGVyZWZvcmUgaW5mZWFzaWJsZQorICAgZm9yIHVzZSBvbiBhIGRlc2t0b3Agc3lzdGVtIHdpdGggcmVtb3ZhYmxlIG1lZGlhIGFzIHRoZSBtZWRpYSBjYW5ub3QgYmUKKyAgIHVubW91bnRlZC4gIFdhdGNoaW5nIGEgZmlsZSBzaG91bGQgbm90IHJlcXVpcmUgdGhhdCBpdCBiZSBvcGVuLgorCitROiBXaGF0IGlzIHRoZSBkZXNpZ24gZGVjaXNpb24gYmVoaW5kIHVzaW5nIGFuLWZkLXBlci1pbnN0YW5jZSBhcyBvcHBvc2VkIHRvCisgICBhbiBmZC1wZXItd2F0Y2g/CisKK0E6IEFuIGZkLXBlci13YXRjaCBxdWlja2x5IGNvbnN1bWVzIG1vcmUgZmlsZSBkZXNjcmlwdG9ycyB0aGFuIGFyZSBhbGxvd2VkLAorICAgbW9yZSBmZCdzIHRoYW4gYXJlIGZlYXNpYmxlIHRvIG1hbmFnZSwgYW5kIG1vcmUgZmQncyB0aGFuIGFyZSBvcHRpbWFsbHkKKyAgIHNlbGVjdCgpLWFibGUuICBZZXMsIHJvb3QgY2FuIGJ1bXAgdGhlIHBlci1wcm9jZXNzIGZkIGxpbWl0IGFuZCB5ZXMsIHVzZXJzCisgICBjYW4gdXNlIGVwb2xsLCBidXQgcmVxdWlyaW5nIGJvdGggaXMgYSBzaWxseSBhbmQgZXh0cmFuZW91cyByZXF1aXJlbWVudC4KKyAgIEEgd2F0Y2ggY29uc3VtZXMgbGVzcyBtZW1vcnkgdGhhbiBhbiBvcGVuIGZpbGUsIHNlcGFyYXRpbmcgdGhlIG51bWJlcgorICAgc3BhY2VzIGlzIHRodXMgc2Vuc2libGUuICBUaGUgY3VycmVudCBkZXNpZ24gaXMgd2hhdCB1c2VyLXNwYWNlIGRldmVsb3BlcnMKKyAgIHdhbnQ6IFVzZXJzIGluaXRpYWxpemUgaW5vdGlmeSwgb25jZSwgYW5kIGFkZCBuIHdhdGNoZXMsIHJlcXVpcmluZyBidXQgb25lCisgICBmZCBhbmQgbm8gdHdpZGRsaW5nIHdpdGggZmQgbGltaXRzLiAgSW5pdGlhbGl6aW5nIGFuIGlub3RpZnkgaW5zdGFuY2UgdHdvCisgICB0aG91c2FuZCB0aW1lcyBpcyBzaWxseS4gIElmIHdlIGNhbiBpbXBsZW1lbnQgdXNlci1zcGFjZSdzIHByZWZlcmVuY2VzIAorICAgY2xlYW5seS0tYW5kIHdlIGNhbiwgdGhlIGlkciBsYXllciBtYWtlcyBzdHVmZiBsaWtlIHRoaXMgdHJpdmlhbC0tdGhlbiB3ZSAKKyAgIHNob3VsZC4KKworICAgVGhlcmUgYXJlIG90aGVyIGdvb2QgYXJndW1lbnRzLiAgV2l0aCBhIHNpbmdsZSBmZCwgdGhlcmUgaXMgYSBzaW5nbGUKKyAgIGl0ZW0gdG8gYmxvY2sgb24sIHdoaWNoIGlzIG1hcHBlZCB0byBhIHNpbmdsZSBxdWV1ZSBvZiBldmVudHMuICBUaGUgc2luZ2xlCisgICBmZCByZXR1cm5zIGFsbCB3YXRjaCBldmVudHMgYW5kIGFsc28gYW55IHBvdGVudGlhbCBvdXQtb2YtYmFuZCBkYXRhLiAgSWYKKyAgIGV2ZXJ5IGZkIHdhcyBhIHNlcGFyYXRlIHdhdGNoLAorCisgICAtIFRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBnZXQgZXZlbnQgb3JkZXJpbmcuICBFdmVudHMgb24gZmlsZSBmb28gYW5kCisgICAgIGZpbGUgYmFyIHdvdWxkIHBvcCBwb2xsKCkgb24gYm90aCBmZCdzLCBidXQgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIHRlbGwKKyAgICAgd2hpY2ggaGFwcGVuZWQgZmlyc3QuICBBIHNpbmdsZSBxdWV1ZSB0cml2aWFsbHkgZ2l2ZXMgeW91IG9yZGVyaW5nLiAgU3VjaAorICAgICBvcmRlcmluZyBpcyBjcnVjaWFsIHRvIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyBzdWNoIGFzIEJlYWdsZS4gIEltYWdpbmUKKyAgICAgIm12IGEgYiA7IG12IGIgYSIgZXZlbnRzIHdpdGhvdXQgb3JkZXJpbmcuCisKKyAgIC0gV2UnZCBoYXZlIHRvIG1haW50YWluIG4gZmQncyBhbmQgbiBpbnRlcm5hbCBxdWV1ZXMgd2l0aCBzdGF0ZSwKKyAgICAgdmVyc3VzIGp1c3Qgb25lLiAgSXQgaXMgYSBsb3QgbWVzc2llciBpbiB0aGUga2VybmVsLiAgQSBzaW5nbGUsIGxpbmVhcgorICAgICBxdWV1ZSBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtYWtlcyBzZW5zZS4KKworICAgLSBVc2VyLXNwYWNlIGRldmVsb3BlcnMgcHJlZmVyIHRoZSBjdXJyZW50IEFQSS4gIFRoZSBCZWFnbGUgZ3V5cywgZm9yCisgICAgIGV4YW1wbGUsIGxvdmUgaXQuICBUcnVzdCBtZSwgSSBhc2tlZC4gIEl0IGlzIG5vdCBhIHN1cnByaXNlOiBXaG8nZCB3YW50CisgICAgIHRvIG1hbmFnZSBhbmQgYmxvY2sgb24gMTAwMCBmZCdzIHZpYSBzZWxlY3Q/CisKKyAgIC0gTm8gd2F5IHRvIGdldCBvdXQgb2YgYmFuZCBkYXRhLgorCisgICAtIDEwMjQgaXMgc3RpbGwgdG9vIGxvdy4gIDstKQorCisgICBXaGVuIHlvdSB0YWxrIGFib3V0IGRlc2lnbmluZyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gdGhhdAorICAgc2NhbGVzIHRvIDEwMDBzIG9mIGRpcmVjdG9yaWVzLCBqdWdnbGluZyAxMDAwcyBvZiBmZCdzIGp1c3QgZG9lcyBub3Qgc2VlbQorICAgdGhlIHJpZ2h0IGludGVyZmFjZS4gIEl0IGlzIHRvbyBoZWF2eS4KKworICAgQWRkaXRpb25hbGx5LCBpdCBfaXNfIHBvc3NpYmxlIHRvICBtb3JlIHRoYW4gb25lIGluc3RhbmNlICBhbmQKKyAgIGp1Z2dsZSBtb3JlIHRoYW4gb25lIHF1ZXVlIGFuZCB0aHVzIG1vcmUgdGhhbiBvbmUgYXNzb2NpYXRlZCBmZC4gIFRoZXJlCisgICBuZWVkIG5vdCBiZSBhIG9uZS1mZC1wZXItcHJvY2VzcyBtYXBwaW5nOyBpdCBpcyBvbmUtZmQtcGVyLXF1ZXVlIGFuZCBhCisgICBwcm9jZXNzIGNhbiBlYXNpbHkgd2FudCBtb3JlIHRoYW4gb25lIHF1ZXVlLgorCitROiBXaHkgdGhlIHN5c3RlbSBjYWxsIGFwcHJvYWNoPworCitBOiBUaGUgcG9vciB1c2VyLXNwYWNlIGludGVyZmFjZSBpcyB0aGUgc2Vjb25kIGJpZ2dlc3QgcHJvYmxlbSB3aXRoIGRub3RpZnkuCisgICBTaWduYWxzIGFyZSBhIHRlcnJpYmxlLCB0ZXJyaWJsZSBpbnRlcmZhY2UgZm9yIGZpbGUgbm90aWZpY2F0aW9uLiAgT3IgZm9yCisgICBhbnl0aGluZywgZm9yIHRoYXQgbWF0dGVyLiAgVGhlIGlkZWFsIHNvbHV0aW9uLCBmcm9tIGFsbCBwZXJzcGVjdGl2ZXMsIGlzIGEKKyAgIGZpbGUgZGVzY3JpcHRvci1iYXNlZCBvbmUgdGhhdCBhbGxvd3MgYmFzaWMgZmlsZSBJL08gYW5kIHBvbGwvc2VsZWN0LgorICAgT2J0YWluaW5nIHRoZSBmZCBhbmQgbWFuYWdpbmcgdGhlIHdhdGNoZXMgY291bGQgaGF2ZSBiZWVuIGRvbmUgZWl0aGVyIHZpYSBhCisgICBkZXZpY2UgZmlsZSBvciBhIGZhbWlseSBvZiBuZXcgc3lzdGVtIGNhbGxzLiAgV2UgZGVjaWRlZCB0byBpbXBsZW1lbnQgYQorICAgZmFtaWx5IG9mIHN5c3RlbSBjYWxscyBiZWNhdXNlIHRoYXQgaXMgdGhlIHByZWZmZXJlZCBhcHByb2FjaCBmb3IgbmV3IGtlcm5lbAorICAgaW50ZXJmYWNlcy4gIFRoZSBvbmx5IHJlYWwgZGlmZmVyZW5jZSB3YXMgd2hldGhlciB3ZSB3YW50ZWQgdG8gdXNlIG9wZW4oMikKKyAgIGFuZCBpb2N0bCgyKSBvciBhIGNvdXBsZSBvZiBuZXcgc3lzdGVtIGNhbGxzLiAgU3lzdGVtIGNhbGxzIGJlYXQgaW9jdGxzLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dAppbmRleCBmODliNDQwLi5lZWY0YWNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKQEAgLTIxLDcgKzIxLDcgQEAKID09PT09PT09CiAKIExpbnV4LU5URlMgY29tZXMgd2l0aCBhIG51bWJlciBvZiB1c2VyLXNwYWNlIHByb2dyYW1zIGtub3duIGFzIG50ZnNwcm9ncy4KLVRoZXNlIGluY2x1ZGUgbWtudGZzLCBhIGZ1bGwtZmVhdHVyZWQgbnRmcyBmaWxlIHN5c3RlbSBmb3JtYXQgdXRpbGl0eSwKK1RoZXNlIGluY2x1ZGUgbWtudGZzLCBhIGZ1bGwtZmVhdHVyZWQgbnRmcyBmaWxlc3lzdGVtIGZvcm1hdCB1dGlsaXR5LAogbnRmc3VuZGVsZXRlIHVzZWQgZm9yIHJlY292ZXJpbmcgZmlsZXMgdGhhdCB3ZXJlIHVuaW50ZW50aW9uYWxseSBkZWxldGVkCiBmcm9tIGFuIE5URlMgdm9sdW1lIGFuZCBudGZzcmVzaXplIHdoaWNoIGlzIHVzZWQgdG8gcmVzaXplIGFuIE5URlMgcGFydGl0aW9uLgogU2VlIHRoZSB3ZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KQEAgLTE0OSw3ICsxNDksMTQgQEAKIAkJCW5hbWUsIGlmIGl0IGV4aXN0cy4gIElmIGNhc2Vfc2Vuc2l0aXZlLCB5b3Ugd2lsbCBuZWVkCiAJCQl0byBwcm92aWRlIHRoZSBjb3JyZWN0IGNhc2Ugb2YgdGhlIHNob3J0IGZpbGUgbmFtZS4KIAotZXJyb3JzPW9wdAkJV2hhdCB0byBkbyB3aGVuIGNyaXRpY2FsIGZpbGUgc3lzdGVtIGVycm9ycyBhcmUgZm91bmQuCitkaXNhYmxlX3NwYXJzZT08Qk9PTD4JSWYgZGlzYWJsZV9zcGFyc2UgaXMgc3BlY2lmaWVkLCBjcmVhdGlvbiBvZiBzcGFyc2UKKwkJCXJlZ2lvbnMsIGkuZS4gaG9sZXMsIGluc2lkZSBmaWxlcyBpcyBkaXNhYmxlZCBmb3IgdGhlCisJCQl2b2x1bWUgKGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBtb3VudCBvbmx5KS4gIEJ5CisJCQlkZWZhdWx0LCBjcmVhdGlvbiBvZiBzcGFyc2UgcmVnaW9ucyBpcyBlbmFibGVkLCB3aGljaAorCQkJaXMgY29uc2lzdGVudCB3aXRoIHRoZSBiZWhhdmlvdXIgb2YgdHJhZGl0aW9uYWwgVW5peAorCQkJZmlsZXN5c3RlbXMuCisKK2Vycm9ycz1vcHQJCVdoYXQgdG8gZG8gd2hlbiBjcml0aWNhbCBmaWxlc3lzdGVtIGVycm9ycyBhcmUgZm91bmQuCiAJCQlGb2xsb3dpbmcgdmFsdWVzIGNhbiBiZSB1c2VkIGZvciAib3B0IjoKIAkJCSAgY29udGludWU6IERFRkFVTFQsIHRyeSB0byBjbGVhbi11cCBhcyBtdWNoIGFzCiAJCQkJICAgIHBvc3NpYmxlLCBlLmcuIG1hcmtpbmcgYSBjb3JydXB0IGlub2RlIGFzCkBAIC00MzIsNiArNDM5LDI0IEBACiAKIE5vdGUsIGEgdGVjaG5pY2FsIENoYW5nZUxvZyBhaW1lZCBhdCBrZXJuZWwgaGFja2VycyBpcyBpbiBmcy9udGZzL0NoYW5nZUxvZy4KIAorMi4xLjIzOgorCS0gU3RhbXAgdGhlIHVzZXIgc3BhY2Ugam91cm5hbCwgYWthIHRyYW5zYWN0aW9uIGxvZywgYWthICRVc25Kcm5sLCBpZgorCSAgaXQgaXMgcHJlc2VudCBhbmQgYWN0aXZlIHRodXMgdGVsbGluZyBXaW5kb3dzIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcKKwkgIHRoZSB0cmFuc2FjdGlvbiBsb2cgdGhhdCBjaGFuZ2VzIGNhbiBoYXZlIGhhcHBlbmVkIG9uIHRoZSB2b2x1bWUKKwkgIHdoaWNoIGFyZSBub3QgcmVjb3JkZWQgaW4gJFVzbkpybmwuCisJLSBEZXRlY3QgdGhlIGNhc2Ugd2hlbiBXaW5kb3dzIGhhcyBiZWVuIGhpYmVybmF0ZWQgKHN1c3BlbmRlZCB0byBkaXNrKQorCSAgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UgZG8gbm90IGFsbG93IChyZSltb3VudGluZyByZWFkLXdyaXRlIHRvCisJICBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiB3aGVuIHlvdSBib290IGJhY2sgaW50byB0aGUgc3VzcGVuZGVkCisJICBXaW5kb3dzIHNlc3Npb24uCisJLSBJbXBsZW1lbnQgZXh0ZW5zaW9uIG9mIHJlc2lkZW50IGZpbGVzIHVzaW5nIHRoZSBub3JtYWwgZmlsZSB3cml0ZQorCSAgY29kZSBwYXRocywgaS5lLiBtb3N0IHZlcnkgc21hbGwgZmlsZXMgY2FuIGJlIGV4dGVuZGVkIHRvIGJlIGEgbGl0dGxlCisJICBiaXQgYmlnZ2VyIGJ1dCBub3QgYnkgbXVjaC4KKwktIEFkZCBuZXcgbW91bnQgb3B0aW9uICJkaXNhYmxlX3NwYXJzZSIuICAoU2VlIGxpc3Qgb2YgbW91bnQgb3B0aW9ucworCSAgYWJvdmUgZm9yIGRldGFpbHMuKQorCS0gSW1wcm92ZSBoYW5kbGluZyBvZiBudGZzIHZvbHVtZXMgd2l0aCBlcnJvcnMgYW5kIHN0cmFuZ2UgYm9vdCBzZWN0b3JzCisJICBpbiBwYXJ0aWN1bGFyLgorCS0gRml4IHZhcmlvdXMgYnVncyBpbmNsdWRpbmcgYSBuYXN0eSBkZWFkbG9jayB0aGF0IGFwcGVhcmVkIGluIHJlY2VudAorCSAga2VybmVscyAoYXJvdW5kIDIuNi4xMS0yLjYuMTIgdGltZWZyYW1lKS4KIDIuMS4yMjoKIAktIEltcHJvdmUgaGFuZGxpbmcgb2YgbnRmcyB2b2x1bWVzIHdpdGggZXJyb3JzLgogCS0gRml4IHZhcmlvdXMgYnVncyBhbmQgcmFjZSBjb25kaXRpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyMSBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDIxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDI1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDI1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAzMSBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAzMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAzMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDMxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG05MjQwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG05MjQwCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FzYjEwMCBiL0RvY3VtZW50YXRpb24vaHdtb24vYXNiMTAwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hc2IxMDAKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYXNiMTAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9kczE2MjEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzMTYyMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZHMxNjIxCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2RzMTYyMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZnNjaGVyIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mc2NoZXIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2ZzY2hlcgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9mc2NoZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2dsNTE4c20gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2dsNTE4c20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2dsNTE4c20KcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vZ2w1MThzbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvaXQ4NyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvaXQ4NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTYzIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTYzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTYzCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtNjMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG03NQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTc3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc4CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODAKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG04MApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04MwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTg1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTg1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODcKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG04NwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG05MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG05MApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkyIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkyCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtOTIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDE2MTkgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MTkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDE2MTkKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbWF4MTYxOQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvcGM4NzM2MCBiL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzM2MApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvcGM4NzM2MApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3MzYwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zaXM1NTk1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9zaXM1NTk1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zaXM1NTk1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3NpczU1OTUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3Ntc2M0N2IzOTcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N2IzOTcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3Ntc2M0N2IzOTcKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3YjM5NwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvc21zYzQ3bTEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zbXNjNDdtMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL3N5c2ZzLWludGVyZmFjZQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3VzZXJzcGFjZS10b29scyBiL0RvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy91c2Vyc3BhY2UtdG9vbHMKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy92aWE2ODZhIGIvRG9jdW1lbnRhdGlvbi9od21vbi92aWE2ODZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy92aWE2ODZhCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3ZpYTY4NmEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4MzYyN2hmIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzNjI3aGYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4Mzc4MWQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc4MWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4Mzc4MWQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzbDc4NXRzIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg1dHMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4M2w3ODV0cwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg1dHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUgYi9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1CmluZGV4IGI0ZmI0OWIuLmIwMjAwMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NQpAQCAtMiwxMCArMiwxMCBAQAogPT09PT09PT09PT09PT09PT09PT09CiAKIFN1cHBvcnRlZCBjaGlwczoKLSAgKiBNYXhpbSBtYXg2ODc0LCBtYXg2ODc1Ci0gICAgUHJlZml4ZXM6ICdtYXg2ODc1JworICAqIE1heGltIE1BWDY4NzQsIE1BWDY4NzUKKyAgICBQcmVmaXg6ICdtYXg2ODc1JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiAweDUwLCAweDUyCi0gICAgRGF0YXNoZWV0czoKKyAgICBEYXRhc2hlZXQ6CiAgICAgICAgIGh0dHA6Ly9wZGZzZXJ2Lm1heGltLWljLmNvbS9lbi9kcy9NQVg2ODc0LU1BWDY4NzUucGRmCiAKIEF1dGhvcjogQmVuIEdhcmRuZXIgPGJnYXJkbmVyQHdhYnRlYy5jb20+CkBAIC0yMywxNCArMjMsMjYgQEAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQogCi1UaGUgTUFYSU0gbWF4Njg3NSBpcyBhIEVFUFJPTS1wcm9ncmFtbWFibGUgcG93ZXItc3VwcGx5IHNlcXVlbmNlci9zdXBlcnZpc29yLgorVGhlIE1heGltIE1BWDY4NzUgaXMgYW4gRUVQUk9NLXByb2dyYW1tYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyL3N1cGVydmlzb3IuCiBJdCBwcm92aWRlcyB0aW1lZCBvdXRwdXRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB3YXRjaGRvZywgaWYgcHJvcGVybHkgd2lyZWQuCiBJdCBhbHNvIHByb3ZpZGVzIDUxMiBieXRlcyBvZiB1c2VyIEVFUFJPTS4KIAotQXQgcmVzZXQsIHRoZSBtYXg2ODc1IHJlYWRzIHRoZSBjb25maWd1cmF0aW9uIGVlcHJvbSBpbnRvIGl0cyBjb25maWd1cmF0aW9uCitBdCByZXNldCwgdGhlIE1BWDY4NzUgcmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24gRUVQUk9NIGludG8gaXRzIGNvbmZpZ3VyYXRpb24KIHJlZ2lzdGVycy4gIFRoZSBjaGlwIHRoZW4gYmVnaW5zIHRvIG9wZXJhdGUgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZXMgaW4gdGhlCiByZWdpc3RlcnMuCiAKK1RoZSBNYXhpbSBNQVg2ODc0IGlzIGEgc2ltaWxhciwgbW9zdGx5IGNvbXBhdGlibGUgZGV2aWNlLCB3aXRoIG1vcmUgaW50cHV0cworYW5kIG91dHB1dHM6CisKKyAgICAgICAgICAgICB2aW4gICAgIGdwaSAgICB2b3V0CitNQVg2ODc0ICAgICAgICA2ICAgICAgIDQgICAgICAgOAorTUFYNjg3NSAgICAgICAgNCAgICAgICAzICAgICAgIDUKKworTUFYNjg3NCBjaGlwcyBjYW4gaGF2ZSBmb3VyIGRpZmZlcmVudCBhZGRyZXNzZXMgKGFzIG9wcG9zZWQgdG8gb25seSB0d28gZm9yCit0aGUgTUFYNjg3NSkuIFRoZSBhZGRpdGlvbmFsIGFkZHJlc3NlcyAoMHg1NCBhbmQgMHg1NikgYXJlIG5vdCBwcm9iZWQgYnkKK3RoaXMgZHJpdmVyIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgcHJvYmUgbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBpZgorbmVlZGVkLgorCiBTZWUgdGhlIGRhdGFzaGVldCBmb3IgZGV0YWlscyBvbiBob3cgdG8gcHJvZ3JhbSB0aGUgRUVQUk9NLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2kyYy9kZXYtaW50ZXJmYWNlCmluZGV4IDA5ZDZjZGEuLmI4NDlhZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZQpAQCAtMTQsOSArMTQsMTIgQEAKID09PT09PT09PQogCiBTbyBsZXQncyBzYXkgeW91IHdhbnQgdG8gYWNjZXNzIGFuIGkyYyBhZGFwdGVyIGZyb20gYSBDIHByb2dyYW0uIFRoZQotZmlyc3QgdGhpbmcgdG8gZG8gaXMgYCNpbmNsdWRlIDxsaW51eC9pMmMuaD4iIGFuZCAiI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4uIAotWWVzLCBJIGtub3csIHlvdSBzaG91bGQgbmV2ZXIgaW5jbHVkZSBrZXJuZWwgaGVhZGVyIGZpbGVzLCBidXQgdW50aWwgZ2xpYmMgCi1rbm93cyBhYm91dCBpMmMsIHRoZXJlIGlzIG5vdCBtdWNoIGNob2ljZS4KK2ZpcnN0IHRoaW5nIHRvIGRvIGlzICIjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPiIuIFBsZWFzZSBub3RlIHRoYXQKK3RoZXJlIGFyZSB0d28gZmlsZXMgbmFtZWQgImkyYy1kZXYuaCIgb3V0IHRoZXJlLCBvbmUgaXMgZGlzdHJpYnV0ZWQKK3dpdGggdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSBrZXJuZWwKK2RyaXZlciBjb2RlLCB0aGUgb3RoZXIgb25lIGlzIGRpc3RyaWJ1dGVkIHdpdGggbG1fc2Vuc29ycyBhbmQgaXMKK21lYW50IHRvIGJlIGluY2x1ZGVkIGZyb20gdXNlci1zcGFjZSBwcm9ncmFtcy4gWW91IG9idmlvdXNseSB3YW50Cit0aGUgc2Vjb25kIG9uZSBoZXJlLgogCiBOb3csIHlvdSBoYXZlIHRvIGRlY2lkZSB3aGljaCBhZGFwdGVyIHlvdSB3YW50IHRvIGFjY2Vzcy4gWW91IHNob3VsZAogaW5zcGVjdCAvc3lzL2NsYXNzL2kyYy1kZXYvIHRvIGRlY2lkZSB0aGlzLiBBZGFwdGVyIG51bWJlcnMgYXJlIGFzc2lnbmVkCkBAIC03OCw3ICs4MSw3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGUgZm9sbG93aW5nIElPQ1RMcyBhcmUgZGVmaW5lZCBhbmQgZnVsbHkgc3VwcG9ydGVkIAotKHNlZSBhbHNvIGkyYy1kZXYuaCBhbmQgaTJjLmgpOgorKHNlZSBhbHNvIGkyYy1kZXYuaCk6CiAKIGlvY3RsKGZpbGUsSTJDX1NMQVZFLGxvbmcgYWRkcikKICAgQ2hhbmdlIHNsYXZlIGFkZHJlc3MuIFRoZSBhZGRyZXNzIGlzIHBhc3NlZCBpbiB0aGUgNyBsb3dlciBiaXRzIG9mIHRoZQpAQCAtOTcsMTAgKzEwMCwxMCBAQAogaW9jdGwoZmlsZSxJMkNfRlVOQ1MsdW5zaWduZWQgbG9uZyAqZnVuY3MpCiAgIEdldHMgdGhlIGFkYXB0ZXIgZnVuY3Rpb25hbGl0eSBhbmQgcHV0cyBpdCBpbiAqZnVuY3MuCiAKLWlvY3RsKGZpbGUsSTJDX1JEV1Isc3RydWN0IGkyY19pb2N0bF9yZHdyX2RhdGEgKm1zZ3NldCkKK2lvY3RsKGZpbGUsSTJDX1JEV1Isc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgKm1zZ3NldCkKIAogICBEbyBjb21iaW5lZCByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGhvdXQgc3RvcCBpbiBiZXR3ZWVuLgotICBUaGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGkyY19pb2N0bF9yZHdyX2RhdGEgeworICBUaGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgewogCiAgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnczsgIC8qIHB0ciB0byBhcnJheSBvZiBzaW1wbGUgbWVzc2FnZXMgKi8KICAgICAgIGludCBubXNnczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGV4Y2hhbmdlICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMgYi9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKaW5kZXggZjQ4MmRhZS4uOTE2NjRiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwpAQCAtMjcsNyArMjcsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZvb19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJGb28gdmVyc2lvbiAyLjMgZHJpdmVyIiwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0ZPTywgLyogZnJvbSBpMmMtaWQuaCwgb3B0aW9uYWwgKi8KIAkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSAmZm9vX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gJmZvb19kZXRhY2hfY2xpZW50LApAQCAtMzcsMTIgKzM2LDYgQEAKIFRoZSBuYW1lIGNhbiBiZSBjaG9zZW4gZnJlZWx5LCBhbmQgbWF5IGJlIHVwdG8gNDAgY2hhcmFjdGVycyBsb25nLiBQbGVhc2UKIHVzZSBzb21ldGhpbmcgZGVzY3JpcHRpdmUgaGVyZS4KIAotSWYgdXNlZCwgdGhlIGlkIHNob3VsZCBiZSBhIHVuaXF1ZSBJRC4gVGhlIHJhbmdlIDB4ZjAwMCB0byAweGZmZmYgaXMKLXJlc2VydmVkIGZvciBsb2NhbCB1c2UsIGFuZCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhvc2UgdW50aWwgeW91IHN0YXJ0Ci1kaXN0cmlidXRpbmcgdGhlIGRyaXZlciwgYXQgd2hpY2ggdGltZSB5b3Ugc2hvdWxkIGNvbnRhY3QgdGhlIGkyYyBhdXRob3JzCi10byBnZXQgeW91ciBvd24gSUQocykuIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHlvdSBkb24ndCBuZWVkIGFuIElECi1hdCBhbGwgc28geW91IGNhbiBqdXN0IG9taXQgaXQuCi0KIERvbid0IHdvcnJ5IGFib3V0IHRoZSBmbGFncyBmaWVsZDsganVzdCBwdXQgSTJDX0RGX05PVElGWSBpbnRvIGl0LiBUaGlzCiBtZWFucyB0aGF0IHlvdXIgZHJpdmVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBuZXcgYWRhcHRlcnMgYXJlIGZvdW5kLgogVGhpcyBpcyBhbG1vc3QgYWx3YXlzIHdoYXQgeW91IHdhbnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0NzUwMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dApAQCAtMCwwICsxLDY5IEBACitVU0VSU1BBQ0UgVkVSQlMgQUNDRVNTCisKKyAgVGhlIGliX3V2ZXJicyBtb2R1bGUsIGJ1aWx0IGJ5IGVuYWJsaW5nIENPTkZJR19JTkZJTklCQU5EX1VTRVJfVkVSQlMsCisgIGVuYWJsZXMgZGlyZWN0IHVzZXJzcGFjZSBhY2Nlc3MgdG8gSUIgaGFyZHdhcmUgdmlhICJ2ZXJicywiIGFzCisgIGRlc2NyaWJlZCBpbiBjaGFwdGVyIDExIG9mIHRoZSBJbmZpbmlCYW5kIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uLgorCisgIFRvIHVzZSB0aGUgdmVyYnMsIHRoZSBsaWJpYnZlcmJzIGxpYnJhcnksIGF2YWlsYWJsZSBmcm9tCisgIDxodHRwOi8vb3BlbmliLm9yZy8+LCBpcyByZXF1aXJlZC4gIGxpYmlidmVyYnMgY29udGFpbnMgYQorICBkZXZpY2UtaW5kZXBlbmRlbnQgQVBJIGZvciB1c2luZyB0aGUgaWJfdXZlcmJzIGludGVyZmFjZS4KKyAgbGliaWJ2ZXJicyBhbHNvIHJlcXVpcmVzIGFwcHJvcHJpYXRlIGRldmljZS1kZXBlbmRlbnQga2VybmVsIGFuZAorICB1c2Vyc3BhY2UgZHJpdmVyIGZvciB5b3VyIEluZmluaUJhbmQgaGFyZHdhcmUuICBGb3IgZXhhbXBsZSwgdG8gdXNlCisgIGEgTWVsbGFub3ggSENBLCB5b3Ugd2lsbCBuZWVkIHRoZSBpYl9tdGhjYSBrZXJuZWwgbW9kdWxlIGFuZCB0aGUKKyAgbGlibXRoY2EgdXNlcnNwYWNlIGRyaXZlciBiZSBpbnN0YWxsZWQuCisKK1VzZXIta2VybmVsIGNvbW11bmljYXRpb24KKworICBVc2Vyc3BhY2UgY29tbXVuaWNhdGVzIHdpdGggdGhlIGtlcm5lbCBmb3Igc2xvdyBwYXRoLCByZXNvdXJjZQorICBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgdmlhIHRoZSAvZGV2L2luZmluaWJhbmQvdXZlcmJzTiBjaGFyYWN0ZXIKKyAgZGV2aWNlcy4gIEZhc3QgcGF0aCBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgcGVyZm9ybWVkIGJ5IHdyaXRpbmcKKyAgZGlyZWN0bHkgdG8gaGFyZHdhcmUgcmVnaXN0ZXJzIG1tYXAoKWVkIGludG8gdXNlcnNwYWNlLCB3aXRoIG5vCisgIHN5c3RlbSBjYWxsIG9yIGNvbnRleHQgc3dpdGNoIGludG8gdGhlIGtlcm5lbC4KKworICBDb21tYW5kcyBhcmUgc2VudCB0byB0aGUga2VybmVsIHZpYSB3cml0ZSgpcyBvbiB0aGVzZSBkZXZpY2UgZmlsZXMuCisgIFRoZSBBQkkgaXMgZGVmaW5lZCBpbiBkcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmguCisgIFRoZSBzdHJ1Y3RzIGZvciBjb21tYW5kcyB0aGF0IHJlcXVpcmUgYSByZXNwb25zZSBmcm9tIHRoZSBrZXJuZWwKKyAgY29udGFpbiBhIDY0LWJpdCBmaWVsZCB1c2VkIHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG91dHB1dCBidWZmZXIuCisgIFN0YXR1cyBpcyByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgd3JpdGUoKQorICBzeXN0ZW0gY2FsbC4KKworUmVzb3VyY2UgbWFuYWdlbWVudAorCisgIFNpbmNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBhbGwgSUIgcmVzb3VyY2VzIGlzIGRvbmUgYnkKKyAgY29tbWFuZHMgcGFzc2VkIHRocm91Z2ggYSBmaWxlIGRlc2NyaXB0b3IsIHRoZSBrZXJuZWwgY2FuIGtlZXAgdHJhY2sKKyAgb2Ygd2hpY2ggcmVzb3VyY2VzIGFyZSBhdHRhY2hlZCB0byBhIGdpdmVuIHVzZXJzcGFjZSBjb250ZXh0LiAgVGhlCisgIGliX3V2ZXJicyBtb2R1bGUgbWFpbnRhaW5zIGlkciB0YWJsZXMgdGhhdCBhcmUgdXNlZCB0byB0cmFuc2xhdGUKKyAgYmV0d2VlbiBrZXJuZWwgcG9pbnRlcnMgYW5kIG9wYXF1ZSB1c2Vyc3BhY2UgaGFuZGxlcywgc28gdGhhdCBrZXJuZWwKKyAgcG9pbnRlcnMgYXJlIG5ldmVyIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGFuZCB1c2Vyc3BhY2UgY2Fubm90IHRyaWNrCisgIHRoZSBrZXJuZWwgaW50byBmb2xsb3dpbmcgYSBib2d1cyBwb2ludGVyLgorCisgIFRoaXMgYWxzbyBhbGxvd3MgdGhlIGtlcm5lbCB0byBjbGVhbiB1cCB3aGVuIGEgcHJvY2VzcyBleGl0cyBhbmQKKyAgcHJldmVudCBvbmUgcHJvY2VzcyBmcm9tIHRvdWNoaW5nIGFub3RoZXIgcHJvY2VzcydzIHJlc291cmNlcy4KKworTWVtb3J5IHBpbm5pbmcKKworICBEaXJlY3QgdXNlcnNwYWNlIEkvTyByZXF1aXJlcyB0aGF0IG1lbW9yeSByZWdpb25zIHRoYXQgYXJlIHBvdGVudGlhbAorICBJL08gdGFyZ2V0cyBiZSBrZXB0IHJlc2lkZW50IGF0IHRoZSBzYW1lIHBoeXNpY2FsIGFkZHJlc3MuICBUaGUKKyAgaWJfdXZlcmJzIG1vZHVsZSBtYW5hZ2VzIHBpbm5pbmcgYW5kIHVucGlubmluZyBtZW1vcnkgcmVnaW9ucyB2aWEKKyAgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgcHV0X3BhZ2UoKSBjYWxscy4gIEl0IGFsc28gYWNjb3VudHMgZm9yIHRoZQorICBhbW91bnQgb2YgbWVtb3J5IHBpbm5lZCBpbiB0aGUgcHJvY2VzcydzIGxvY2tlZF92bSwgYW5kIGNoZWNrcyB0aGF0CisgIHVucHJpdmlsZWdlZCBwcm9jZXNzZXMgZG8gbm90IGV4Y2VlZCB0aGVpciBSTElNSVRfTUVNTE9DSyBsaW1pdC4KKworICBQYWdlcyB0aGF0IGFyZSBwaW5uZWQgbXVsdGlwbGUgdGltZXMgYXJlIGNvdW50ZWQgZWFjaCB0aW1lIHRoZXkgYXJlCisgIHBpbm5lZCwgc28gdGhlIHZhbHVlIG9mIGxvY2tlZF92bSBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlIG9mIHRoZQorICBudW1iZXIgb2YgcGFnZXMgcGlubmVkIGJ5IGEgcHJvY2Vzcy4KKworL2RldiBmaWxlcworCisgIFRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGRldmljZSBmaWxlcyBhdXRvbWF0aWNhbGx5IHdpdGgKKyAgdWRldiwgYSBydWxlIGxpa2UKKworICAgIEtFUk5FTD0idXZlcmJzKiIsIE5BTUU9ImluZmluaWJhbmQvJWsiCisKKyAgY2FuIGJlIHVzZWQuICBUaGlzIHdpbGwgY3JlYXRlIGRldmljZSBub2RlcyBuYW1lZAorCisgICAgL2Rldi9pbmZpbmliYW5kL3V2ZXJiczAKKworICBhbmQgc28gb24uICBTaW5jZSB0aGUgSW5maW5pQmFuZCB1c2Vyc3BhY2UgdmVyYnMgc2hvdWxkIGJlIHNhZmUgZm9yCisgIHVzZSBieSBub24tcHJpdmlsZWdlZCBwcm9jZXNzZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gYWRkIGFuCisgIGFwcHJvcHJpYXRlIE1PREUgb3IgR1JPVVAgdG8gdGhlIHVkZXYgcnVsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZjQ0YmI1NS4uYTk5OGE4YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAlJQS0zMglJQS0zMiBha2EgaTM4NiBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJQS02NAlJQS02NCBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJT1NDSEVECU1vcmUgdGhhbiBvbmUgSS9PIHNjaGVkdWxlciBpcyBlbmFibGVkLgotCUlQX1BOUAlJUCBEQ0hQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgorCUlQX1BOUAlJUCBESENQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgogCUlTQVBOUAlJU0EgUG5QIGNvZGUgaXMgZW5hYmxlZC4KIAlJU0ROCUFwcHJvcHJpYXRlIElTRE4gc3VwcG9ydCBpcyBlbmFibGVkLgogCUpPWQlBcHByb3ByaWF0ZSBqb3lzdGljayBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC02MjIsNiArNjIyLDE3IEBACiAJaXBzPQkJW0hXLFNDU0ldIEFkYXB0ZWMgLyBJQk0gU2VydmVSQUlEIGNvbnRyb2xsZXIKIAkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL2lwcy5jLgogCisJaXJxZml4dXAJW0hXXQorCQkJV2hlbiBhbiBpbnRlcnJ1cHQgaXMgbm90IGhhbmRsZWQgc2VhcmNoIGFsbCBoYW5kbGVycworCQkJZm9yIGl0LiBJbnRlbmRlZCB0byBnZXQgc3lzdGVtcyB3aXRoIGJhZGx5IGJyb2tlbgorCQkJZmlybXdhcmUgcnVubmluZy4KKworCWlycXBvbGwJCVtIV10KKwkJCVdoZW4gYW4gaW50ZXJydXB0IGlzIG5vdCBoYW5kbGVkIHNlYXJjaCBhbGwgaGFuZGxlcnMKKwkJCWZvciBpdC4gQWxzbyBjaGVjayBhbGwgaGFuZGxlcnMgZWFjaCB0aW1lcgorCQkJaW50ZXJydXB0LiBJbnRlbmRlZCB0byBnZXQgc3lzdGVtcyB3aXRoIGJhZGx5IGJyb2tlbgorCQkJZmlybXdhcmUgcnVubmluZy4KKwogCWlzYXBucD0JCVtJU0FQTlBdCiAJCQlGb3JtYXQ6IDxSRFA+LCA8cmVzZXQ+LCA8cGNpX3NjYW4+LCA8dmVyYm9zaXR5PgogCkBAIC03NDcsNiArNzU4LDkgQEAKIAltYXhjcHVzPQlbU01QXSBNYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQJYW4gU01QIGtlcm5lbAogCQkJc2hvdWxkIG1ha2UgdXNlIG9mCiAKKwltYXhfYWRkcj1bS01HXQlbS05MLEJPT1QsaWE2NF0gQWxsIHBoeXNpY2FsIG1lbW9yeSBncmVhdGVyIHRoYW4gb3IKKwkJCWVxdWFsIHRvIHRoaXMgcGh5c2ljYWwgYWRkcmVzcyBpcyBpZ25vcmVkLgorCiAJbWF4X2x1bnM9CVtTQ1NJXSBNYXhpbXVtIG51bWJlciBvZiBMVU5zIHRvIHByb2JlCiAJCQlTaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyXjMyLTEuCiAKQEAgLTEwMzAsNiArMTA0NCwxMCBAQAogCQlpcnFtYXNrPTB4TU1NTQkJW0lBLTMyXSBTZXQgYSBiaXQgbWFzayBvZiBJUlFzIGFsbG93ZWQgdG8gYmUgYXNzaWduZWQKIAkJCQkJYXV0b21hdGljYWxseSB0byBQQ0kgZGV2aWNlcy4gWW91IGNhbiBtYWtlIHRoZSBrZXJuZWwKIAkJCQkJZXhjbHVkZSBJUlFzIG9mIHlvdXIgSVNBIGNhcmRzIHRoaXMgd2F5LgorCQlwaXJxYWRkcj0weEFBQUFBCVtJQS0zMl0gU3BlY2lmeSB0aGUgcGh5c2ljYWwgYWRkcmVzcworCQkJCQlvZiB0aGUgUElSUSB0YWJsZSAobm9ybWFsbHkgZ2VuZXJhdGVkCisJCQkJCWJ5IHRoZSBCSU9TKSBpZiBpdCBpcyBvdXRzaWRlIHRoZQorCQkJCQlGMDAwMGgtMTAwMDAwaCByYW5nZS4KIAkJbGFzdGJ1cz1OCQlbSUEtMzJdIFNjYW4gYWxsIGJ1c2VzIHRpbGwgYnVzICNOLiBDYW4gYmUgdXNlZnVsCiAJCQkJCWlmIHRoZSBrZXJuZWwgaXMgdW5hYmxlIHRvIGZpbmQgeW91ciBzZWNvbmRhcnkgYnVzZXMKIAkJCQkJYW5kIHlvdSB3YW50IHRvIHRlbGwgaXQgZXhwbGljaXRseSB3aGljaCBvbmVzIHRoZXkgYXJlLgpAQCAtMTExNSw3ICsxMTMzLDcgQEAKIAkJCVNlZSBEb2N1bWVudGF0aW9uL3JhbWRpc2sudHh0LgogCiAJcHNtb3VzZS5wcm90bz0gIFtIVyxNT1VTRV0gSGlnaGVzdCBQUzIgbW91c2UgcHJvdG9jb2wgZXh0ZW5zaW9uIHRvCi0JCQlwcm9iZSBmb3IgKGJhcmV8aW1wc3xleHBzKS4KKwkJCXByb2JlIGZvciAoYmFyZXxpbXBzfGV4cHN8bGlmZWJvb2t8YW55KS4KIAlwc21vdXNlLnJhdGU9CVtIVyxNT1VTRV0gU2V0IGRlc2lyZWQgbW91c2UgcmVwb3J0IHJhdGUsIGluIHJlcG9ydHMKIAkJCXBlciBzZWNvbmQuCiAJcHNtb3VzZS5yZXNldGFmdGVyPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RtZmUudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RtZmUudHh0CmluZGV4IGMwZTgzOTguLjA0NjM2MzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kbWZlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZG1mZS50eHQKQEAgLTEsNTkgKzEsNjUgQEAKLSAgZG1mZS5jOiBWZXJzaW9uIDEuMjggICAgICAgIDAxLzE4LzIwMDAKK0Rhdmljb20gRE05MTAyKEEpL0RNOTEzMi9ETTk4MDEgZmFzdCBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogCi0gICAgICAgIEEgRGF2aWNvbSBETTkxMDIoQSkvRE05MTMyL0RNOTgwMSBmYXN0IGV0aGVybmV0IGRyaXZlciBmb3IgTGludXguIAotICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgIFN0ZW4gV2FuZworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgICBQdWJsaWMgTGljZW5zZQorYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKK29mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogCi0gICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAgICAgICAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKIAotICBBLiBDb21waWxlciBjb21tYW5kOgorVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsIHN1cHBvcnQgZm9yIERhdmljb20gRE05MTAyKEEpL0RNOTEzMi9ETTk4MDEgZXRoZXJuZXQgY2FyZHMgKCBDTkVUCisxMC8xMDAgZXRoZXJuZXQgY2FyZHMgdXNlcyBEYXZpY29tIGNoaXBzZXQgdG9vLCBzbyB0aGlzIGRyaXZlciBzdXBwb3J0cyBDTkVUIGNhcmRzIHRvbyApLklmIHlvdQorZGlkbid0IGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBsb2FkIGl0c2VsZiBvbiBib290IGFuZCBwcmludCBhCitsaW5lIHNpbWlsYXIgdG8gOgogCi0gICAgIEEtMTogRm9yIG5vcm1hbCBzaW5nbGUgb3IgbXVsdGlwbGUgcHJvY2Vzc29yIGtlcm5lbAotICAgICAgICAgICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgCi0gICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtYyBkbWZlLmMiCisJZG1mZTogRGF2aWNvbSBETTl4eHggbmV0IGRyaXZlciwgdmVyc2lvbiAxLjM2LjQgKDIwMDItMDEtMTcpCiAKLSAgICAgQS0yOiBGb3Igc2luZ2xlIG9yIG11bHRpcGxlIHByb2Nlc3NvciB3aXRoIGtlcm5lbCBtb2R1bGUgdmVyc2lvbiBmdW5jdGlvbgotICAgICAgICAgICJnY2MgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAKLSAgICAgICAgICAgIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIGRtZmUuYyIKK0lmIHlvdSBjb21waWxlZCB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91IGhhdmUgdG8gbG9hZCBpdCBvbiBib290LllvdSBjYW4gbG9hZCBpdCB3aXRoIGNvbW1hbmQgOgorCisJaW5zbW9kIGRtZmUKKworVGhpcyB3YXkgaXQgd2lsbCBhdXRvZGV0ZWN0IHRoZSBkZXZpY2UgbW9kZS5UaGlzIGlzIHRoZSBzdWdnZXN0ZWQgd2F5IHRvIGxvYWQgdGhlIG1vZHVsZS5PciB5b3UgY2FuIHBhc3MKK2EgbW9kZT0gc2V0dGluZyB0byBtb2R1bGUgd2hpbGUgbG9hZGluZywgbGlrZSA6CisKKwlpbnNtb2QgZG1mZSBtb2RlPTAgIyBGb3JjZSAxME0gSGFsZiBEdXBsZXgKKwlpbnNtb2QgZG1mZSBtb2RlPTEgIyBGb3JjZSAxMDBNIEhhbGYgRHVwbGV4CisJaW5zbW9kIGRtZmUgbW9kZT00ICMgRm9yY2UgMTBNIEZ1bGwgRHVwbGV4CisJaW5zbW9kIGRtZmUgbW9kZT01ICMgRm9yY2UgMTAwTSBGdWxsIER1cGxleAorCitOZXh0IHlvdSBzaG91bGQgY29uZmlndXJlIHlvdXIgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCBhIGNvbW1hbmQgc2ltaWxhciB0byA6CisKKwlpZmNvbmZpZyBldGgwIDE3Mi4yMi4zLjE4CisgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl4KKwkJICAgICBZb3VyIElQIEFkcmVzcworCitUaGVuIHlvdSBtYXkgaGF2ZSB0byBtb2RpZnkgdGhlIGRlZmF1bHQgcm91dGluZyB0YWJsZSB3aXRoIGNvbW1hbmQgOgorCisJcm91dGUgYWRkIGRlZmF1bHQgZXRoMAogCiAKLSAgQi4gVGhlIGZvbGxvd2luZyBzdGVwcyB0ZWFjaCB5b3UgaG93IHRvIGFjdGl2YXRlIGEgRE05MTAyIGJvYXJkOgotCi0gICAgICAgIDEuIFVzZWQgdGhlIHVwcGVyIGNvbXBpbGVyIGNvbW1hbmQgdG8gY29tcGlsZSBkbWZlLmMKLQotICAgICAgICAyLiBJbnNlcnQgZG1mZSBtb2R1bGUgaW50byBrZXJuZWwKLSAgICAgICAgICAgImluc21vZCBkbWZlIiAgICAgICAgOztBdXRvIERldGVjdGlvbiBNb2RlIChTdWdnZXN0KQotICAgICAgICAgICAiaW5zbW9kIGRtZmUgbW9kZT0wIiA7O0ZvcmNlIDEwTSBIYWxmIER1cGxleAotICAgICAgICAgICAiaW5zbW9kIGRtZmUgbW9kZT0xIiA7O0ZvcmNlIDEwME0gSGFsZiBEdXBsZXgKLSAgICAgICAgICAgImluc21vZCBkbWZlIG1vZGU9NCIgOztGb3JjZSAxME0gRnVsbCBEdXBsZXgKLSAgICAgICAgICAgImluc21vZCBkbWZlIG1vZGU9NSIgOztGb3JjZSAxMDBNIEZ1bGwgRHVwbGV4Ci0KLSAgICAgICAgMy4gQ29uZmlnIGEgZG05MTAyIG5ldHdvcmsgaW50ZXJmYWNlCi0gICAgICAgICAgICJpZmNvbmZpZyBldGgwIDE3Mi4yMi4zLjE4IgotICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXiBZb3VyIElQIGFkZHJlc3MKLQotICAgICAgICA0LiBBY3RpdmF0ZSB0aGUgSVAgcm91dGluZyB0YWJsZS4gRm9yIHNvbWUgZGlzdHJpYnV0aW9ucywgaXQgaXMgbm90Ci0gICAgICAgICAgIG5lY2Vzc2FyeS4gWW91IGNhbiB0eXBlICJyb3V0ZSIgdG8gY2hlY2suCi0KLSAgICAgICAgICAgInJvdXRlIGFkZCBkZWZhdWx0IGV0aDAiCitOb3cgeW91ciBldGhlcm5ldCBjYXJkIHNob3VsZCBiZSB1cCBhbmQgcnVubmluZy4KIAogCi0gICAgICAgIDUuIFdlbGwgZG9uZS4gWW91ciBETTkxMDIgYWRhcHRlciBpcyBub3cgYWN0aXZhdGVkLgorVE9ETzoKKworSW1wbGVtZW50IHBjaV9kcml2ZXI6OnN1c3BlbmQoKSBhbmQgcGNpX2RyaXZlcjo6cmVzdW1lKCkgcG93ZXIgbWFuYWdlbWVudCBtZXRob2RzLgorQ2hlY2sgb24gNjQgYml0IGJveGVzLgorQ2hlY2sgYW5kIGZpeCBvbiBiaWcgZW5kaWFuIGJveGVzLgorVGVzdCBhbmQgbWFrZSBzdXJlIFBDSSBsYXRlbmN5IGlzIG5vdyBjb3JyZWN0IGZvciBhbGwgY2FzZXMuCiAKIAotICAgQy4gT2JqZWN0IGZpbGVzIGRlc2NyaXB0aW9uOgotICAgICAgICAxLiBkbWZlX3JoNjEubzogICAgICAgCUZvciBSZWRoYXQgNi4xCitBdXRob3JzOgogCi0gICAgICAgIElmIHlvdSBjYW4gbWFrZSBzdXJlIHlvdXIga2VybmVsIHZlcnNpb24sIHlvdSBjYW4gcmVuYW1lCi0gICAgICAgIHRvIGRtZmUubyBhbmQgZGlyZWN0bHkgdXNlIGl0IHdpdGhvdXQgcmUtY29tcGlsaW5nLgorU3RlbiBXYW5nIDxzdGVuX3dhbmdAZGF2aWNvbS5jb20udHcgPiAgIDogT3JpZ2luYWwgQXV0aG9yCitUb2JpYXMgUmluZ3N0cm9tIDx0b3JpQHVuaGFwcHkubWluZS5udT4gOiBDdXJyZW50IE1haW50YWluZXIKIAorQ29udHJpYnV0b3JzOgogCi0gIEF1dGhvcjogU3RlbiBXYW5nLCA4ODYtMy01Nzk4Nzk3LTg1MTcsIEUtbWFpbDogc3Rlbl93YW5nQGRhdmljb20uY29tLnR3CitNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4KK0FsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CitKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CitWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpYl90cmllLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9maWJfdHJpZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZDBjNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9maWJfdHJpZS50eHQKQEAgLTAsMCArMSwxNDUgQEAKKwkJCUxDLXRyaWUgaW1wbGVtZW50YXRpb24gbm90ZXMuCisKK05vZGUgdHlwZXMKKy0tLS0tLS0tLS0KK2xlYWYgCisJQW4gZW5kIG5vZGUgd2l0aCBkYXRhLiBUaGlzIGhhcyBhIGNvcHkgb2YgdGhlIHJlbGV2YW50IGtleSwgYWxvbmcKKwl3aXRoICdobGlzdCcgd2l0aCByb3V0aW5nIHRhYmxlIGVudHJpZXMgc29ydGVkIGJ5IHByZWZpeCBsZW5ndGguCisJU2VlIHN0cnVjdCBsZWFmIGFuZCBzdHJ1Y3QgbGVhZl9pbmZvLgorCit0cmllIG5vZGUgb3IgdG5vZGUKKwlBbiBpbnRlcm5hbCBub2RlLCBob2xkaW5nIGFuIGFycmF5IG9mIGNoaWxkIChsZWFmIG9yIHRub2RlKSBwb2ludGVycywKKwlpbmRleGVkCXRocm91Z2ggYSBzdWJzZXQgb2YgdGhlIGtleS4gU2VlIExldmVsIENvbXByZXNzaW9uLgorCitBIGZldyBjb25jZXB0cyBleHBsYWluZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQml0cyAodG5vZGUpIAorCVRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUga2V5IHNlZ21lbnQgdXNlZCBmb3IgaW5kZXhpbmcgaW50byB0aGUKKwljaGlsZCBhcnJheSAtIHRoZSAiY2hpbGQgaW5kZXgiLiBTZWUgTGV2ZWwgQ29tcHJlc3Npb24uCisKK1BvcyAodG5vZGUpCisJVGhlIHBvc2l0aW9uIChpbiB0aGUga2V5KSBvZiB0aGUga2V5IHNlZ21lbnQgdXNlZCBmb3IgaW5kZXhpbmcgaW50bworCXRoZSBjaGlsZCBhcnJheS4gU2VlIFBhdGggQ29tcHJlc3Npb24uCisKK1BhdGggQ29tcHJlc3Npb24gLyBza2lwcGVkIGJpdHMKKwlBbnkgZ2l2ZW4gdG5vZGUgaXMgbGlua2VkIHRvIGZyb20gdGhlIGNoaWxkIGFycmF5IG9mIGl0cyBwYXJlbnQsIHVzaW5nCisJYSBzZWdtZW50IG9mIHRoZSBrZXkgc3BlY2lmaWVkIGJ5IHRoZSBwYXJlbnQncyAicG9zIiBhbmQgImJpdHMiIAorCUluIGNlcnRhaW4gY2FzZXMsIHRoaXMgdG5vZGUncyBvd24gInBvcyIgd2lsbCBub3QgYmUgaW1tZWRpYXRlbHkKKwlhZGphY2VudCB0byB0aGUgcGFyZW50IChwb3MrYml0cyksIGJ1dCB0aGVyZSB3aWxsIGJlIHNvbWUgYml0cworCWluIHRoZSBrZXkgc2tpcHBlZCBvdmVyIGJlY2F1c2UgdGhleSByZXByZXNlbnQgYSBzaW5nbGUgcGF0aCB3aXRoIG5vCisJZGV2aWF0aW9ucy4gVGhlc2UgInNraXBwZWQgYml0cyIgY29uc3RpdHV0ZSBQYXRoIENvbXByZXNzaW9uLgorCU5vdGUgdGhhdCB0aGUgc2VhcmNoIGFsZ29yaXRobSB3aWxsIHNpbXBseSBza2lwIG92ZXIgdGhlc2UgYml0cyB3aGVuCisJc2VhcmNoaW5nLCBtYWtpbmcgaXQgbmVjZXNzYXJ5IHRvIHNhdmUgdGhlIGtleXMgaW4gdGhlIGxlYXZlcyB0bworCXZlcmlmeSB0aGF0IHRoZXkgYWN0dWFsbHkgZG8gbWF0Y2ggdGhlIGtleSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4KKworTGV2ZWwgQ29tcHJlc3Npb24gLyBjaGlsZCBhcnJheXMKKwl0aGUgdHJpZSBpcyBrZXB0IGxldmVsIGJhbGFuY2VkIG1vdmluZywgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUKKwljaGlsZHJlbiBvZiBhIGZ1bGwgY2hpbGQgKHNlZSAiZnVsbF9jaGlsZHJlbiIpIHVwIG9uZSBsZXZlbCwgc28gdGhhdAorCWluc3RlYWQgb2YgYSBwdXJlIGJpbmFyeSB0cmVlLCBlYWNoIGludGVybmFsIG5vZGUgKCJ0bm9kZSIpIG1heQorCWNvbnRhaW4gYW4gYXJiaXRyYXJpbHkgbGFyZ2UgYXJyYXkgb2YgbGlua3MgdG8gc2V2ZXJhbCBjaGlsZHJlbi4KKwlDb252ZXJzZWx5LCBhIHRub2RlIHdpdGggYSBtb3N0bHkgZW1wdHkJY2hpbGQgYXJyYXkgKHNlZSBlbXB0eV9jaGlsZHJlbikKKwltYXkgYmUgImhhbHZlZCIsIGhhdmluZyBzb21lIG9mIGl0cyBjaGlsZHJlbiBtb3ZlZCBkb3dud2FyZHMgb25lIGxldmVsLAorCWluIG9yZGVyIHRvIGF2b2lkIGV2ZXItaW5jcmVhc2luZyBjaGlsZCBhcnJheXMuCisKK2VtcHR5X2NoaWxkcmVuCisJdGhlIG51bWJlciBvZiBwb3NpdGlvbnMgaW4gdGhlIGNoaWxkIGFycmF5IG9mIGEgZ2l2ZW4gdG5vZGUgdGhhdCBhcmUKKwlOVUxMLgorCitmdWxsX2NoaWxkcmVuCisJdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiBhIGdpdmVuIHRub2RlIHRoYXQgYXJlbid0IHBhdGggY29tcHJlc3NlZC4KKwkoaW4gb3RoZXIgd29yZHMsIHRoZXkgYXJlbid0IE5VTEwgb3IgbGVhdmVzIGFuZCB0aGVpciAicG9zIiBpcyBlcXVhbAorCXRvIHRoaXMJdG5vZGUncyAicG9zIisiYml0cyIpLgorCisJKFRoZSB3b3JkICJmdWxsIiBoZXJlIGlzIHVzZWQgbW9yZSBpbiB0aGUgc2Vuc2Ugb2YgImNvbXBsZXRlIiB0aGFuCisJYXMgdGhlIG9wcG9zaXRlIG9mICJlbXB0eSIsIHdoaWNoIG1pZ2h0IGJlIGEgdGFkIGNvbmZ1c2luZy4pCisKK0NvbW1lbnRzCistLS0tLS0tLS0KKworV2UgaGF2ZSB0cmllZCB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgYXMgY2xvc2UgdG8gZmliX2hhc2ggYXMgCitwb3NzaWJsZSB0byBhbGxvdyB2ZXJpZmljYXRpb24gYW5kIGhlbHAgdXAgcmV2aWV3aW5nLiAKKworZmliX2ZpbmRfbm9kZSgpCisJQSBnb29kIHN0YXJ0IGZvciB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZS4gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGEKKwlzdHJhaWdodGZvcndhcmQgdHJpZSBsb29rdXAuCisKK2ZpYl9pbnNlcnRfbm9kZSgpCisJSW5zZXJ0cyBhIG5ldyBsZWFmIG5vZGUgaW4gdGhlIHRyaWUuIFRoaXMgaXMgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbgorCWZpYl9maW5kX25vZGUoKS4gSW5zZXJ0aW5nIGEgbmV3IG5vZGUgbWVhbnMgd2UgbWlnaHQgaGF2ZSB0byBydW4gdGhlCisJbGV2ZWwgY29tcHJlc3Npb24gYWxnb3JpdGhtIG9uIHBhcnQgb2YgdGhlIHRyaWUuCisKK3RyaWVfbGVhZl9yZW1vdmUoKQorCUxvb2tzIHVwIGEga2V5LCBkZWxldGVzIGl0IGFuZCBydW5zIHRoZSBsZXZlbCBjb21wcmVzc2lvbiBhbGdvcml0aG0uCisKK3RyaWVfcmViYWxhbmNlKCkKKwlUaGUga2V5IGZ1bmN0aW9uIGZvciB0aGUgZHluYW1pYyB0cmllIGFmdGVyIGFueSBjaGFuZ2UgaW4gdGhlIHRyaWUKKwlpdCBpcyBydW4gdG8gb3B0aW1pemUgYW5kIHJlb3JnYW5pemUuIFR0IHdpbGwgd2FsayB0aGUgdHJpZSB1cHdhcmRzIAorCXRvd2FyZHMgdGhlIHJvb3QgZnJvbSBhIGdpdmVuIHRub2RlLCBkb2luZyBhIHJlc2l6ZSgpIGF0IGVhY2ggc3RlcCAKKwl0byBpbXBsZW1lbnQgbGV2ZWwgY29tcHJlc3Npb24uCisKK3Jlc2l6ZSgpCisJQW5hbHl6ZXMgYSB0bm9kZSBhbmQgb3B0aW1pemVzIHRoZSBjaGlsZCBhcnJheSBzaXplIGJ5IGVpdGhlciBpbmZsYXRpbmcKKwlvciBzaHJpbmtpbmcgaXQgcmVwZWF0ZWRseSB1bnRpbCBpdCBmdWxsZmlsbHMgdGhlIGNyaXRlcmlhIGZvciBvcHRpbWFsCisJbGV2ZWwgY29tcHJlc3Npb24uIFRoaXMgcGFydCBmb2xsb3dzIHRoZSBvcmlnaW5hbCBwYXBlciBwcmV0dHkgY2xvc2VseQorCWFuZCB0aGVyZSBtYXkgYmUgc29tZSByb29tIGZvciBleHBlcmltZW50YXRpb24gaGVyZS4KKworaW5mbGF0ZSgpCisJRG91YmxlcyB0aGUgc2l6ZSBvZiB0aGUgY2hpbGQgYXJyYXkgd2l0aGluIGEgdG5vZGUuIFVzZWQgYnkgcmVzaXplKCkuCisKK2hhbHZlKCkKKwlIYWx2ZXMgdGhlIHNpemUgb2YgdGhlIGNoaWxkIGFycmF5IHdpdGhpbiBhIHRub2RlIC0gdGhlIGludmVyc2Ugb2YKKwlpbmZsYXRlKCkuIFVzZWQgYnkgcmVzaXplKCk7CisKK2ZuX3RyaWVfaW5zZXJ0KCksIGZuX3RyaWVfZGVsZXRlKCksIGZuX3RyaWVfc2VsZWN0X2RlZmF1bHQoKQorCVRoZSByb3V0ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLiBTaG91bGQgY29uZm9ybSBwcmV0dHkgY2xvc2VseSB0byB0aGUKKwljb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyBpbiBmaWJfaGFzaC4KKworZm5fdHJpZV9mbHVzaCgpCisJVGhpcyB3YWxrcyB0aGUgZnVsbCB0cmllICh1c2luZyBuZXh0bGVhZigpKSBhbmQgc2VhcmNoZXMgZm9yIGVtcHR5CisJbGVhdmVzIHdoaWNoIGhhdmUgdG8gYmUgcmVtb3ZlZC4KKworZm5fdHJpZV9kdW1wKCkKKwlEdW1wcyB0aGUgcm91dGluZyB0YWJsZSBvcmRlcmVkIGJ5IHByZWZpeCBsZW5ndGguIFRoaXMgaXMgc29tZXdoYXQKKwlzbG93ZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBmaWJfaGFzaCBmdW5jdGlvbiwgYXMgd2UgaGF2ZSB0byB3YWxrIHRoZQorCWVudGlyZSB0cmllIGZvciBlYWNoIHByZWZpeCBsZW5ndGguIEluIGNvbXBhcmlzb24sIGZpYl9oYXNoIGlzIG9yZ2FuaXplZAorCWFzIG9uZSAiem9uZSIvaGFzaCBwZXIgcHJlZml4IGxlbmd0aC4KKworTG9ja2luZworLS0tLS0tLQorCitmaWJfbG9jayBpcyB1c2VkIGZvciBhbiBSVy1sb2NrIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgaXMgZG9uZSBpbiBmaWJfaGFzaC4KK0hvd2V2ZXIsIHRoZSBmdW5jdGlvbnMgYXJlIHNvbWV3aGF0IHNlcGFyYXRlZCBmb3Igb3RoZXIgcG9zc2libGUgbG9ja2luZworc2NlbmFyaW9zLiBJdCBtaWdodCBjb25jZWl2YWJseSBiZSBwb3NzaWJsZSB0byBydW4gdHJpZV9yZWJhbGFuY2UgdmlhIFJDVQordG8gYXZvaWQgcmVhZF9sb2NrIGluIHRoZSBmbl90cmllX2xvb2t1cCgpIGZ1bmN0aW9uLgorCitNYWluIGxvb2t1cCBtZWNoYW5pc20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm5fdHJpZV9sb29rdXAoKSBpcyB0aGUgbWFpbiBsb29rdXAgZnVuY3Rpb24uCisKK1RoZSBsb29rdXAgaXMgaW4gaXRzIHNpbXBsZXN0IGZvcm0ganVzdCBsaWtlIGZpYl9maW5kX25vZGUoKS4gV2UgZGVzY2VuZCB0aGUKK3RyaWUsIGtleSBzZWdtZW50IGJ5IGtleSBzZWdtZW50LCB1bnRpbCB3ZSBmaW5kIGEgbGVhZi4gY2hlY2tfbGVhZigpIGRvZXMKK3RoZSBmaWJfc2VtYW50aWNfbWF0Y2ggaW4gdGhlIGxlYWYncyBzb3J0ZWQgcHJlZml4IGhsaXN0LgorCitJZiB3ZSBmaW5kIGEgbWF0Y2gsIHdlIGFyZSBkb25lLgorCitJZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gsIHdlIGVudGVyIHByZWZpeCBtYXRjaGluZyBtb2RlLiBUaGUgcHJlZml4IGxlbmd0aCwKK3N0YXJ0aW5nIG91dCBhdCB0aGUgc2FtZSBhcyB0aGUga2V5IGxlbmd0aCwgaXMgcmVkdWNlZCBvbmUgc3RlcCBhdCBhIHRpbWUsCithbmQgd2UgYmFja3RyYWNrIHVwd2FyZHMgdGhyb3VnaCB0aGUgdHJpZSB0cnlpbmcgdG8gZmluZCBhIGxvbmdlc3QgbWF0Y2hpbmcKK3ByZWZpeC4gVGhlIGdvYWwgaXMgYWx3YXlzIHRvIHJlYWNoIGEgbGVhZiBhbmQgZ2V0IGEgcG9zaXRpdmUgcmVzdWx0IGZyb20gdGhlCitmaWJfc2VtYW50aWNfbWF0Y2ggbWVjaGFuaXNtLgorCitJbnNpZGUgZWFjaCB0bm9kZSwgdGhlIHNlYXJjaCBmb3IgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXggY29uc2lzdHMgb2Ygc2VhcmNoaW5nCit0aHJvdWdoIHRoZSBjaGlsZCBhcnJheSwgY2hvcHBpbmcgb2ZmICh6ZXJvaW5nKSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgIjEiIG9mCit0aGUgY2hpbGQgaW5kZXggdW50aWwgd2UgZmluZCBhIG1hdGNoIG9yIHRoZSBjaGlsZCBpbmRleCBjb25zaXN0cyBvZiBub3RoaW5nIGJ1dAoremVyb3MuCisKK0F0IHRoaXMgcG9pbnQgd2UgYmFja3RyYWNrICh0LT5zdGF0cy5iYWNrdHJhY2srKykgdXAgdGhlIHRyaWUsIGNvbnRpbnVpbmcgdG8KK2Nob3Agb2ZmIHBhcnQgb2YgdGhlIGtleSBpbiBvcmRlciB0byBmaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHByZWZpeC4KKworQXQgdGhpcyBwb2ludCB3ZSB3aWxsIHJlcGVhdGVkbHkgZGVzY2VuZCBzdWJ0cmllcyB0byBsb29rIGZvciBhIG1hdGNoLCBhbmQgdGhlcmUKK2FyZSBzb21lIG9wdGltaXphdGlvbnMgYXZhaWxhYmxlIHRoYXQgY2FuIHByb3ZpZGUgdXMgd2l0aCAic2hvcnRjdXRzIiB0byBhdm9pZAorZGVzY2VuZGluZyBpbnRvIGRlYWQgZW5kcy4gTG9vayBmb3IgIkhMX09QVElNSVpFIiBzZWN0aW9ucyBpbiB0aGUgY29kZS4KKworVG8gYWxsZXZpYXRlIGFueSBkb3VidHMgYWJvdXQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSByb3V0ZSBzZWxlY3Rpb24gcHJvY2VzcywKK2EgbmV3IG5ldGxpbmsgb3BlcmF0aW9uIGhhcyBiZWVuIGFkZGVkLiBMb29rIGZvciBORVRMSU5LX0ZJQl9MT09LVVAsIHdoaWNoCitnaXZlcyB1c2VybGFuZCBhY2Nlc3MgdG8gZmliX2xvb2t1cCgpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0IGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTFjMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0CkBAIC0wLDAgKzEsNjMgQEAKK01hdGNoaW5nIG9mIFBDTUNJQSBkZXZpY2VzIHRvIGRyaXZlcnMgaXMgZG9uZSB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUKK2ZvbGxvd2luZyBjcml0ZXJpYToKKworLSBtYW51ZmFjdG9yIElECistIGNhcmQgSUQKKy0gcHJvZHVjdCBJRCBzdHJpbmdzIF9hbmRfIGhhc2hlcyBvZiB0aGVzZSBzdHJpbmdzCistIGZ1bmN0aW9uIElECistIGRldmljZSBmdW5jdGlvbiAoYWN0dWFsIGFuZCBwc2V1ZG8pCisKK1lvdSBzaG91bGQgdXNlIHRoZSBoZWxwZXJzIGluIGluY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oIGZvciBnZW5lcmF0aW5nIHRoZQorc3RydWN0IHBjbWNpYV9kZXZpY2VfaWRbXSBlbnRyaWVzIHdoaWNoIG1hdGNoIGRldmljZXMgdG8gZHJpdmVycy4KKworSWYgeW91IHdhbnQgdG8gbWF0Y2ggcHJvZHVjdCBJRCBzdHJpbmdzLCB5b3UgYWxzbyBuZWVkIHRvIHBhc3MgdGhlIGNyYzMyCitoYXNoZXMgb2YgdGhlIHN0cmluZyB0byB0aGUgbWFjcm8sIGUuZy4gaWYgeW91IHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3QgSUQKK3N0cmluZyAxLCB5b3UgbmVlZCB0byB1c2UKKworUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgic29tZV9zdHJpbmciLCAweChoYXNoX29mX3NvbWVfc3RyaW5nKSksCisKK0lmIHRoZSBoYXNoIGlzIGluY29ycmVjdCwgdGhlIGtlcm5lbCB3aWxsIGluZm9ybSB5b3UgYWJvdXQgdGhpcyBpbiAiZG1lc2ciCit1cG9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiwgYW5kIHRlbGwgeW91IG9mIHRoZSBjb3JyZWN0IGhhc2guCisKK1lvdSBjYW4gZGV0ZXJtaW5lIHRoZSBoYXNoIG9mIHRoZSBwcm9kdWN0IElEIHN0cmluZ3MgYnkgY2F0dGluZyB0aGUgZmlsZQorIm1vZGFsaWFzIiBpbiB0aGUgc3lzZnMgZGlyZWN0b3J5IG9mIHRoZSBQQ01DSUEgZGV2aWNlLiBJdCBnZW5lcmF0ZXMgYSBzdHJpbmcKK2luIHRoZSBmb2xsb3dpbmcgZm9ybToKK3BjbWNpYTptMDE0OWNDMUFCZjA2cGZuMDBmbjAwcGE3MjVCODQyRHBiRjFFRkVFODRwYzA4NzdCNjI3cGQwMDAwMDAwMAorCitUaGUgaGV4IHZhbHVlIGFmdGVyICJwYSIgaXMgdGhlIGhhc2ggb2YgcHJvZHVjdCBJRCBzdHJpbmcgMSwgYWZ0ZXIgInBiIiBmb3IKK3N0cmluZyAyIGFuZCBzbyBvbi4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhpcyBzbWFsbCB0b29sIHRvIGRldGVybWluZSB0aGUgY3JjMzIgaGFzaC4KK3NpbXBseSBwYXNzIHRoZSBzdHJpbmcgeW91IHdhbnQgdG8gZXZhbHVhdGUgYXMgYXJndW1lbnQgdG8gdGhpcyBwcm9ncmFtLAorZS5nLgorJCAuL2NyYzMyaGFzaCAiRHVhbCBTcGVlZCIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogY3JjMzJoYXNoLmMgLSBkZXJpdmVkIGZyb20gbGludXgvbGliL2NyYzMyLmMsIEdOVSBHUEwgdjIgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3Vuc2lnbmVkIGludCBjcmMzMih1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjcmMgPSAwOworCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gMHhlZGI4ODMyMCA6IDApOworCX0KKwlyZXR1cm4gY3JjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCWlmIChhcmdjICE9IDIpIHsKKwkJcHJpbnRmKCJubyBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXN1bHQgPSBjcmMzMihhcmd2WzFdLCBzdHJsZW4oYXJndlsxXSkpOworCXByaW50ZigiMHgleFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dCBiL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNjYzYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLWNoYW5nZXMudHh0CkBAIC0wLDAgKzEsNTggQEAKK1RoaXMgZmlsZSBkZXRhaWxzIGNoYW5nZXMgaW4gMi42IHdoaWNoIGFmZmVjdCBQQ01DSUEgY2FyZCBkcml2ZXIgYXV0aG9yczoKKworKiBldmVudCBoYW5kbGVyIGluaXRpYWxpemF0aW9uIGluIHN0cnVjdCBwY21jaWFfZHJpdmVyIChhcyBvZiAyLjYuMTMpCisgICBUaGUgZXZlbnQgaGFuZGxlciBpcyBub3RpZmllZCBvZiBhbGwgZXZlbnRzLCBhbmQgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYXMgdGhlIGV2ZW50KCkgY2FsbGJhY2sgaW4gdGhlIGRyaXZlcidzIHN0cnVjdCBwY21jaWFfZHJpdmVyLgorCisqIHBjbWNpYS92ZXJzaW9uLmggc2hvdWxkIG5vdCBiZSB1c2VkIChhcyBvZiAyLjYuMTMpCisgICBUaGlzIGZpbGUgd2lsbCBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCisKKyogaW4ta2VybmVsIGRldmljZTwtPmRyaXZlciBtYXRjaGluZyAoYXMgb2YgMi42LjEzKQorICAgUENNQ0lBIGRldmljZXMgYW5kIHRoZWlyIGNvcnJlY3QgZHJpdmVycyBjYW4gbm93IGJlIG1hdGNoZWQgaW4KKyAgIGtlcm5lbHNwYWNlLiBTZWUgJ2RldmljZXRhYmxlLnR4dCcgZm9yIGRldGFpbHMuCisKKyogRGV2aWNlIG1vZGVsIGludGVncmF0aW9uIChhcyBvZiAyLjYuMTEpCisgICBBIHN0cnVjdCBwY21jaWFfZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGV2aWNlIG1vZGVsIGNvcmUsCisgICBhbmQgY2FuIGJlIHVzZWQgKGUuZy4gZm9yIFNFVF9ORVRERVZfREVWKSBieSB1c2luZworICAgaGFuZGxlX3RvX2RldihjbGllbnRfaGFuZGxlX3QgKiBoYW5kbGUpLgorCisqIENvbnZlcnQgaW50ZXJuYWwgSS9PIHBvcnQgYWRkcmVzc2VzIHRvIHVuc2lnbmVkIGxvbmcgKGFzIG9mIDIuNi4xMSkKKyAgIGlvYWRkcl90IHNob3VsZCBiZSByZXBsYWNlZCBieSBraW9fYWRkcl90IGluIFBDTUNJQSBjYXJkIGRyaXZlcnMuCisKKyogaXJxX21hc2sgYW5kIGlycV9saXN0IHBhcmFtZXRlcnMgKGFzIG9mIDIuNi4xMSkKKyAgIFRoZSBpcnFfbWFzayBhbmQgaXJxX2xpc3QgcGFyYW1ldGVycyBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgaW4KKyAgIFBDTUNJQSBjYXJkIGRyaXZlcnMuIEluc3RlYWQsIGl0IGlzIHRoZSBqb2Igb2YgdGhlIFBDTUNJQSBjb3JlIHRvCisgICBkZXRlcm1pbmUgd2hpY2ggSVJRIHNob3VsZCBiZSB1c2VkLiBUaGVyZWZvcmUsIGxpbmstPmlycS5JUlFJbmZvMgorICAgaXMgaWdub3JlZC4KKworKiBjbGllbnQtPlBlbmRpbmdFdmVudHMgaXMgZ29uZSAoYXMgb2YgMi42LjExKQorICAgY2xpZW50LT5QZW5kaW5nRXZlbnRzIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKKyogY2xpZW50LT5BdHRyaWJ1dGVzIGFyZSBnb25lIChhcyBvZiAyLjYuMTEpCisgICBjbGllbnQtPkF0dHJpYnV0ZXMgaXMgdW51c2VkLCB0aGVyZWZvcmUgaXQgaXMgcmVtb3ZlZCBmcm9tIGFsbAorICAgUENNQ0lBIGNhcmQgZHJpdmVycworCisqIGNvcmUgZnVuY3Rpb25zIG5vIGxvbmdlciBhdmFpbGFibGUgKGFzIG9mIDIuNi4xMSkKKyAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBzb3VyY2UKKyAgIGJlY2F1c2UgdGhleSBhcmUgdW51c2VkIGJ5IGFsbCBpbi1rZXJuZWwgZHJpdmVycywgYW5kIG5vIGV4dGVybmFsCisgICBkcml2ZXIgd2FzIHJlcG9ydGVkIHRvIHJlbHkgb24gdGhlbToKKwlwY21jaWFfZ2V0X2ZpcnN0X3JlZ2lvbigpCisJcGNtY2lhX2dldF9uZXh0X3JlZ2lvbigpCisJcGNtY2lhX21vZGlmeV93aW5kb3coKQorCXBjbWNpYV9zZXRfZXZlbnRfbWFzaygpCisJcGNtY2lhX2dldF9maXJzdF93aW5kb3coKQorCXBjbWNpYV9nZXRfbmV4dF93aW5kb3coKQorCisqIGRldmljZSBsaXN0IGl0ZXJhdGlvbiB1cG9uIG1vZHVsZSByZW1vdmFsIChhcyBvZiAyLjYuMTApCisgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGl0ZXJhdGUgb24gdGhlIGRyaXZlcidzIGludGVybmFsCisgICBjbGllbnQgbGlzdCBhbmQgY2FsbCB0aGUgLT5kZXRhY2goKSBmdW5jdGlvbiB1cG9uIG1vZHVsZSByZW1vdmFsLgorCisqIFJlc291cmNlIG1hbmFnZW1lbnQuIChhcyBvZiAyLjYuOCkKKyAgIEFsdGhvdWdoIHRoZSBQQ01DSUEgc3Vic3lzdGVtIHdpbGwgYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBjYXJkcywKKyAgIGl0IG5vIGxvbmdlciBtYXJrcyB0aGVzZSByZXNvdXJjZXMgYnVzeS4gVGhpcyBtZWFucyB0aGF0IGRyaXZlcgorICAgYXV0aG9ycyBhcmUgbm93IHJlc3BvbnNpYmxlIGZvciBjbGFpbWluZyB5b3VyIHJlc291cmNlcyBhcyBwZXIKKyAgIG90aGVyIGRyaXZlcnMgaW4gTGludXguIFlvdSBzaG91bGQgdXNlIHJlcXVlc3RfcmVnaW9uKCkgdG8gbWFyaworICAgeW91ciBJTyByZWdpb25zIGluLXVzZSwgYW5kIHJlcXVlc3RfbWVtX3JlZ2lvbigpIHRvIG1hcmsgeW91cgorICAgbWVtb3J5IHJlZ2lvbnMgaW4tdXNlLiBUaGUgbmFtZSBhcmd1bWVudCBzaG91bGQgYmUgYSBwb2ludGVyIHRvCisgICB5b3VyIGRyaXZlciBuYW1lLiBFZywgZm9yIHBjbmV0X2NzLCBuYW1lIHNob3VsZCBwb2ludCB0byB0aGUKKyAgIHN0cmluZyAicGNuZXRfY3MiLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAppbmRleCA4ODFhMzdlLi43YTRhNTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dApAQCAtMTE3LDYgKzExNyw3IEBACiBNZWRpb24gTUQ0MjIwCQkJPz8/ICgqKQogU2Ftc3VuZyBQMzUJCQl2YmV0b29sIG5lZWRlZCAoNikKIFNoYXJwIFBDLUFSMTAgKEFUSSByYWdlKQlub25lICgxKQorU29ueSBWYWlvIFBDRy1DMVZSWC9LCQlzM19iaW9zICgyKQogU29ueSBWYWlvIFBDRy1GNDAzCQk/Pz8gKCopCiBTb255IFZhaW8gUENHLU41MDVTTgkJPz8/ICgqKQogU29ueSBWYWlvIHZnbi1zMjYwCQlYIG9yIGJvb3QtcmFkZW9uIGNhbiBpbml0IGl0ICg1KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvZHJpdmVyIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvZHJpdmVyCmluZGV4IGU5YzAxNzguLmFjN2VhYmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2RyaXZlcgorKysgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9kcml2ZXIKQEAgLTEwNyw4ICsxMDcsOCBAQAogCWluZGljYXRlIHRoYXQgdGhlIHNpZ25hbCBpcyBwZXJtYW5lbnRseSBhY3RpdmUuICBJZiBSSSBpcwogCW5vdCBhdmFpbGFibGUsIHRoZSBzaWduYWwgc2hvdWxkIG5vdCBiZSBpbmRpY2F0ZWQgYXMgYWN0aXZlLgogCi0JTG9ja2luZzogbm9uZS4KLQlJbnRlcnJ1cHRzOiBjYWxsZXIgZGVwZW5kZW50LgorCUxvY2tpbmc6IHBvcnQtPmxvY2sgdGFrZW4uCisJSW50ZXJydXB0czogbG9jYWxseSBkaXNhYmxlZC4KIAlUaGlzIGNhbGwgbXVzdCBub3Qgc2xlZXAKIAogICBzdG9wX3R4KHBvcnQsdHR5X3N0b3ApCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi9zbjljMTAyLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3NuOWMxMDIudHh0CmluZGV4IGNmOWExMTguLjNmOGExMTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3NuOWMxMDIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3NuOWMxMDIudHh0CkBAIC0yOTcsNiArMjk3LDcgQEAKIDB4MGM0NSAgICAgMHg2MDJhCiAweDBjNDUgICAgIDB4NjAyYgogMHgwYzQ1ICAgICAweDYwMmMKKzB4MGM0NSAgICAgMHg2MDJkCiAweDBjNDUgICAgIDB4NjAzMAogMHgwYzQ1ICAgICAweDYwODAKIDB4MGM0NSAgICAgMHg2MDgyCkBAIC0zMzMsNiArMzM0LDcgQEAKIC0tLS0tICAgICAgIC0tLS0tLS0tLS0tLQogSFY3MTMxRCAgICAgSHluaXggU2VtaWNvbmR1Y3RvciwgSW5jLgogTUktMDM0MyAgICAgTWljcm9uIFRlY2hub2xvZ3ksIEluYy4KK09WNzYzMCAgICAgIE9tbmlWaXNpb24gVGVjaG5vbG9naWVzLCBJbmMuCiBQQVMxMDZCICAgICBQaXhBcnQgSW1hZ2luZywgSW5jLgogUEFTMjAyQkNCICAgUGl4QXJ0IEltYWdpbmcsIEluYy4KIFRBUzUxMTBDMUIgIFRhaXdhbiBBZHZhbmNlZCBTZW5zb3IgQ29ycG9yYXRpb24KQEAgLTQ3MCw5ICs0NzIsMTEgQEAKIC0gTHVjYSBDYXBlbGxvIGZvciB0aGUgZG9uYXRpb24gb2YgYSB3ZWJjYW07CiAtIEpvYW8gUm9kcmlnbyBGdXphcm8sIEpvYW8gTGltaXJpbywgQ2xhdWRpbyBGaWxobyBhbmQgQ2FpbyBCZWdvdHRpIGZvciB0aGUKICAgZG9uYXRpb24gb2YgYSB3ZWJjYW07CistIEpvbiBIb2xsc3Ryb20gZm9yIHRoZSBkb25hdGlvbiBvZiBhIHdlYmNhbTsKIC0gQ2FybG9zIEVkdWFyZG8gTWVkYWdsaWEgRHlvbmlzaW8sIHdobyBhZGRlZCB0aGUgc3VwcG9ydCBmb3IgdGhlIFBBUzIwMkJDQgogICBpbWFnZSBzZW5zb3I7CiAtIFN0ZWZhbm8gTW96emksIHdobyBkb25hdGVkIDQ1IEVVOworLSBBbmRyZXcgUGVhcmNlIGZvciB0aGUgZG9uYXRpb24gb2YgYSB3ZWJjYW07CiAtIEJlcnRyaWsgU2lra2VuLCB3aG8gcmV2ZXJzZS1lbmdpbmVlcmVkIGFuZCBkb2N1bWVudGVkIHRoZSBIdWZmbWFuIGNvbXByZXNzaW9uCiAgIGFsZ29yaXRobSB1c2VkIGluIHRoZSBTTjlDMTB4IGNvbnRyb2xsZXJzIGFuZCBpbXBsZW1lbnRlZCB0aGUgZmlyc3QgZGVjb2RlcjsKIC0gTWl6dW5vIFRha2FmdW1pIGZvciB0aGUgZG9uYXRpb24gb2YgYSB3ZWJjYW07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dAppbmRleCAyZjg0MzFmLi5mMTg5NmVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQKQEAgLTEwMSw2ICsxMDEsMTMgQEAKICAgb3IgMyBhbmQgMiBwb3NpdGlvbnMsIGNvcnJlc3BvbmRpbmdseS4KIC0gVVJCIFN0YXR1cy4gVGhpcyBmaWVsZCBtYWtlcyBubyBzZW5zZSBmb3Igc3VibWlzc2lvbnMsIGJ1dCBpcyBwcmVzZW50CiAgIHRvIGhlbHAgc2NyaXB0cyB3aXRoIHBhcnNpbmcuIEluIGVycm9yIGNhc2UsIGl0IGNvbnRhaW5zIHRoZSBlcnJvciBjb2RlLgorICBJbiBjYXNlIG9mIGEgc2V0dXAgcGFja2V0LCBpdCBjb250YWlucyBhIFNldHVwIFRhZy4gSWYgc2NyaXB0cyByZWFkIGEgbnVtYmVyCisgIGluIHRoaXMgZmllbGQsIHRoZSBwcm9jZWVkIHRvIHJlYWQgRGF0YSBMZW5ndGguIE90aGVyd2lzZSwgdGhleSByZWFkCisgIHRoZSBzZXR1cCBwYWNrZXQgYmVmb3JlIHJlYWRpbmcgdGhlIERhdGEgTGVuZ3RoLgorLSBTZXR1cCBwYWNrZXQsIGlmIHByZXNlbnQsIGNvbnNpc3RzIG9mIDUgd29yZHM6IG9uZSBvZiBlYWNoIGZvciBibVJlcXVlc3RUeXBlLAorICBiUmVxdWVzdCwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgsIGFzIHNwZWNpZmllZCBieSB0aGUgVVNCIFNwZWNpZmljYXRpb24gMi4wLgorICBUaGVzZSB3b3JkcyBhcmUgc2FmZSB0byBkZWNvZGUgaWYgU2V0dXAgVGFnIHdhcyAncycuIE90aGVyd2lzZSwgdGhlIHNldHVwCisgIHBhY2tldCB3YXMgcHJlc2VudCwgYnV0IG5vdCBjYXB0dXJlZCwgYW5kIHRoZSBmaWVsZHMgY29udGFpbiBmaWxsZXIuCiAtIERhdGEgTGVuZ3RoLiBUaGlzIGlzIHRoZSBhY3R1YWwgbGVuZ3RoIGluIHRoZSBVUkIuCiAtIERhdGEgdGFnLiBUaGUgdXNibW9uIG1heSBub3QgYWx3YXlzIGNhcHR1cmUgZGF0YSwgZXZlbiBpZiBsZW5ndGggaXMgbm9uemVyby4KICAgT25seSBpZiB0YWcgaXMgJz0nLCB0aGUgZGF0YSB3b3JkcyBhcmUgcHJlc2VudC4KQEAgLTEyNSwyNSArMTMyLDMxIEBACiAJCQlTdHJpbmcgZGF0YV9zdHIgPSBzdC5uZXh0VG9rZW4oKTsKIAkJCWludCBsZW4gPSBkYXRhX3N0ci5sZW5ndGgoKSAvIDI7CiAJCQlpbnQgaTsKKwkJCWludCBiOwkvLyBieXRlIGlzIHNpZ25lZCwgYXBwYXJlbnRseT8hIFhYWAogCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGF0YVtkYXRhX2xlbl0gPSBCeXRlLnBhcnNlQnl0ZSgKLQkJCQkgICAgZGF0YV9zdHIuc3Vic3RyaW5nKGkqMiwgaSoyICsgMiksCi0JCQkJICAgIDE2KTsKKwkJCQkvLyBkYXRhW2RhdGFfbGVuXSA9IEJ5dGUucGFyc2VCeXRlKAorCQkJCS8vICAgICBkYXRhX3N0ci5zdWJzdHJpbmcoaSoyLCBpKjIgKyAyKSwKKwkJCQkvLyAgICAgMTYpOworCQkJCWIgPSBJbnRlZ2VyLnBhcnNlSW50KAorCQkJCSAgICAgZGF0YV9zdHIuc3Vic3RyaW5nKGkqMiwgaSoyICsgMiksCisJCQkJICAgICAxNik7CisJCQkJaWYgKGIgPj0gMTI4KQorCQkJCQliICo9IC0xOworCQkJCWRhdGFbZGF0YV9sZW5dID0gKGJ5dGUpIGI7CiAJCQkJZGF0YV9sZW4rKzsKIAkJCX0KIAkJfQogCX0KIH0KIAotVGhpcyBmb3JtYXQgaXMgb2J2aW91c2x5IGRlZmljaWVudC4gRm9yIGV4YW1wbGUsIHRoZSBzZXR1cCBwYWNrZXQgZm9yIGNvbnRyb2wKLXRyYW5zZmVycyBpcyBub3QgZGVsaXZlcmVkLiBUaGlzIHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUuCitUaGlzIGZvcm1hdCBtYXkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgogCiBFeGFtcGxlczoKIAotQW4gaW5wdXQgY29udHJvbCB0cmFuc2ZlciB0byBnZXQgYSBwb3J0IHN0YXR1czoKK0FuIGlucHV0IGNvbnRyb2wgdHJhbnNmZXIgdG8gZ2V0IGEgcG9ydCBzdGF0dXMuCiAKLWQ3NGZmOWEwIDI2NDAyODgxOTYgUyBDaTowMDE6MDAgLTExNSA0IDwKLWQ3NGZmOWEwIDI2NDAyODgyMDIgQyBDaTowMDE6MDAgMCA0ID0gMDEwMTAxMDAKK2Q1ZWE4OWEwIDM1NzU5MTQ1NTUgUyBDaTowMDE6MDAgcyBhMyAwMCAwMDAwIDAwMDMgMDAwNCA0IDwKK2Q1ZWE4OWEwIDM1NzU5MTQ1NjAgQyBDaTowMDE6MDAgMCA0ID0gMDEwNTAwMDAKIAogQW4gb3V0cHV0IGJ1bGsgdHJhbnNmZXIgdG8gc2VuZCBhIFNDU0kgY29tbWFuZCAweDVFIGluIGEgMzEtYnl0ZSBCdWxrIHdyYXBwZXIKIHRvIGEgc3RvcmFnZSBkZXZpY2UgYXQgYWRkcmVzcyA1OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKaW5kZXggNGIzZDhmNi4uNDQxNDA3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCkBAIC0xLDM5OSArMSwxNiBAQAotPEhUTUw+PEhFQUQ+Ci08VElUTEU+VmlkZW80TGludXggS2VybmVsIEFQSSBSZWZlcmVuY2UgdjAuMToxOTk5MDQzMDwvVElUTEU+Ci08L0hFQUQ+Ci08ISBSZXZpc2lvbiBIaXN0b3J5OiA+Ci08ISAgIDQvMzAvMTk5OSAtIEZyZWQgR2xlYXNvbiAoZnJlZGdAd2F2YS5jb20pPgotPCEgRG9jdW1lbnRlZCBleHRlbnNpb25zIGZvciB0aGUgUmFkaW8gRGF0YSBTeXN0ZW0gKFJEUykgZXh0ZW5zaW9ucyA+Ci08Qk9EWSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxIMz5EZXZpY2VzPC9IMz4KLVZpZGVvNExpbnV4IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgc2V0cyBvZiBkZXZpY2UgZmlsZXMuIFRoZXNlIGxpdmUgb24gdGhlCi1jaGFyYWN0ZXIgZGV2aWNlIGZvcm1lcmx5IGtub3duIGFzICIvZGV2L2J0dHYiLiAvZGV2L2J0dHYgc2hvdWxkIGJlIGEKLXN5bWxpbmsgdG8gL2Rldi92aWRlbzAgZm9yIG1vc3QgcGVvcGxlLiAKLTxQPgotPFRBQkxFPgotPFRSPjxUSD5EZXZpY2UgTmFtZTwvVEg+PFRIPk1pbm9yIFJhbmdlPC9USD48VEg+RnVuY3Rpb248L1RIPgotPFRSPjxURD4vZGV2L3ZpZGVvPC9URD48VEQ+MC02MzwvVEQ+PFREPlZpZGVvIENhcHR1cmUgSW50ZXJmYWNlPC9URD4KLTxUUj48VEQ+L2Rldi9yYWRpbzwvVEQ+PFREPjY0LTEyNzwvVEQ+PFREPkFNL0ZNIFJhZGlvIERldmljZXM8L1REPgotPFRSPjxURD4vZGV2L3Z0eDwvVEQ+PFREPjE5Mi0yMjM8L1REPjxURD5UZWxldGV4dCBJbnRlcmZhY2UgQ2hpcHM8L1REPgotPFRSPjxURD4vZGV2L3ZiaTwvVEQ+PFREPjIyNC0yMzk8L1REPjxURD5SYXcgVkJJIERhdGEgKEludGVyY2FzdC90ZWxldGV4dCk8L1REPgotPC9UQUJMRT4KLTxQPgotVmlkZW80TGludXggcHJvZ3JhbXMgb3BlbiBhbmQgc2NhbiB0aGUgZGV2aWNlcyB0byBmaW5kIHdoYXQgdGhleSBhcmUgbG9va2luZwotZm9yLiBDYXBhYmlsaXR5IHF1ZXJpZXMgZGVmaW5lIHdoYXQgZWFjaCBpbnRlcmZhY2Ugc3VwcG9ydHMuIFRoZSAKLWRlc2NyaWJlZCBBUEkgaXMgb25seSBkZWZpbmVkIGZvciB2aWRlbyBjYXB0dXJlIGNhcmRzLiBUaGUgcmVsZXZhbnQgc3Vic2V0Ci1hcHBsaWVzIHRvIHJhZGlvIGNhcmRzLiBUZWxldGV4dCBpbnRlcmZhY2VzIHRhbGsgdGhlIGV4aXN0aW5nIFZUWCBBUEkuCi08UD4KLTxIMz5DYXBhYmlsaXR5IFF1ZXJ5IElvY3RsPC9IMz4KLVRoZSA8Qj5WSURJT0NHQ0FQPC9CPiBpb2N0bCBjYWxsIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBjYXBhYmlsaXR5Ci1pbmZvcm1hdGlvbiBmb3IgYSB2aWRlbyBkZXZpY2UuIFRoZSA8Yj5zdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eTwvYj4gb2JqZWN0Ci1wYXNzZWQgdG8gdGhlIGlvY3RsIGlzIGNvbXBsZXRlZCBhbmQgcmV0dXJuZWQuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLWluZm9ybWF0aW9uCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+bmFtZVszMl08L2I+PFREPkNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIGludGVyZmFjZTwvVEQ+Ci08VFI+PFREPjxiPnR5cGU8L2I+PFREPlR5cGUgb2YgaW50ZXJmYWNlPC9URD4KLTxUUj48VEQ+PGI+Y2hhbm5lbHM8L2I+PFREPk51bWJlciBvZiByYWRpby90diBjaGFubmVscyBpZiBhcHByb3ByaWF0ZTwvVEQ+Ci08VFI+PFREPjxiPmF1ZGlvczwvYj48VEQ+TnVtYmVyIG9mIGF1ZGlvIGRldmljZXMgaWYgYXBwcm9wcmlhdGU8L1REPgotPFRSPjxURD48Yj5tYXh3aWR0aDwvYj48VEQ+TWF4aW11bSBjYXB0dXJlIHdpZHRoIGluIHBpeGVsczwvVEQ+Ci08VFI+PFREPjxiPm1heGhlaWdodDwvYj48VEQ+TWF4aW11bSBjYXB0dXJlIGhlaWdodCBpbiBwaXhlbHM8L1REPgotPFRSPjxURD48Yj5taW53aWR0aDwvYj48VEQ+TWluaW11bSBjYXB0dXJlIHdpZHRoIGluIHBpeGVsczwvVEQ+Ci08VFI+PFREPjxiPm1pbmhlaWdodDwvYj48VEQ+TWluaW11bSBjYXB0dXJlIGhlaWdodCBpbiBwaXhlbHM8L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIHR5cGUgZmllbGQgbGlzdHMgdGhlIGNhcGFiaWxpdHkgZmxhZ3MgZm9yIHRoZSBkZXZpY2UuIFRoZXNlIGFyZQotYXMgZm9sbG93cwotPFA+Ci08VEFCTEU+Ci08VFI+PFRIPk5hbWU8L1RIPjxUSD5EZXNjcmlwdGlvbjwvVEg+Ci08VFI+PFREPjxiPlZJRF9UWVBFX0NBUFRVUkU8L2I+PFREPkNhbiBjYXB0dXJlIHRvIG1lbW9yeTwvVEQ+Ci08VFI+PFREPjxiPlZJRF9UWVBFX1RVTkVSPC9iPjxURD5IYXMgYSB0dW5lciBvZiBzb21lIGZvcm08L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9URUxFVEVYVDwvYj48VEQ+SGFzIHRlbGV0ZXh0IGNhcGFiaWxpdHk8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9PVkVSTEFZPC9iPjxURD5DYW4gb3ZlcmxheSBpdHMgaW1hZ2Ugb250byB0aGUgZnJhbWUgYnVmZmVyPC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfQ0hST01BS0VZPC9iPjxURD5PdmVybGF5IGlzIENocm9tYWtleWVkPC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfQ0xJUFBJTkc8L2I+PFREPk92ZXJsYXkgY2xpcHBpbmcgaXMgc3VwcG9ydGVkPC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfRlJBTUVSQU08L2I+PFREPk92ZXJsYXkgb3ZlcndyaXRlcyBmcmFtZSBidWZmZXIgbWVtb3J5PC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfU0NBTEVTPC9iPjxURD5UaGUgaGFyZHdhcmUgc3VwcG9ydHMgaW1hZ2Ugc2NhbGluZzwvVEQ+Ci08VFI+PFREPjxiPlZJRF9UWVBFX01PTk9DSFJPTUU8L2I+PFREPkltYWdlIGNhcHR1cmUgaXMgZ3JleSBzY2FsZSBvbmx5PC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfU1VCQ0FQVFVSRTwvYj48VEQ+Q2FwdHVyZSBjYW4gYmUgb2Ygb25seSBwYXJ0IG9mIHRoZSBpbWFnZTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgbWluaW11bSBhbmQgbWF4aW11bSBzaXplcyBsaXN0ZWQgZm9yIGEgY2FwdHVyZSBkZXZpY2UgZG8gbm90IGltcGx5IGFsbAotdGhhdCBhbGwgaGVpZ2h0L3dpZHRoIHJhdGlvcyBvciBzaXplcyB3aXRoaW4gdGhlIHJhbmdlIGFyZSBwb3NzaWJsZS4gQQotcmVxdWVzdCB0byBzZXQgYSBzaXplIHdpbGwgYmUgaG9ub3VyZWQgYnkgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIGNhcHR1cmUKLXNpemUgd2hvc2UgY2FwdHVyZSBpcyBubyBsYXJnZSB0aGFuIHRoZSByZXF1ZXN0ZWQgcmVjdGFuZ2xlIGluIGVpdGhlcgotZGlyZWN0aW9uLiBGb3IgZXhhbXBsZSB0aGUgcXVpY2tjYW0gaGFzIDMgZml4ZWQgc2V0dGluZ3MuIAotPFA+Ci08SDM+RnJhbWUgQnVmZmVyPC9IMz4KLUNhcHR1cmUgY2FyZHMgdGhhdCBkcm9wIGRhdGEgZGlyZWN0bHkgb250byB0aGUgZnJhbWUgYnVmZmVyIG11c3QgYmUgdG9sZCB0aGUKLWJhc2UgYWRkcmVzcyBvZiB0aGUgZnJhbWUgYnVmZmVyLCBpdHMgc2l6ZSBhbmQgb3JnYW5pc2F0aW9uLiBUaGlzIGlzIGEgCi1wcml2aWxlZ2VkIGlvY3RsIGFuZCBvbmUgdGhhdCBldmVudHVhbGx5IFggaXRzZWxmIHNob3VsZCBzZXQuCi08UD4KLVRoZSA8Yj5WSURJT0NTRkJVRjwvYj4gaW9jdGwgc2V0cyB0aGUgZnJhbWUgYnVmZmVyIHBhcmFtZXRlcnMgZm9yIGEgY2FwdHVyZQotY2FyZC4gSWYgdGhlIGNhcmQgZG9lcyBub3QgZG8gZGlyZWN0IHdyaXRlcyB0byB0aGUgZnJhbWUgYnVmZmVyIHRoZW4gdGhpcwotaW9jdGwgd2lsbCBiZSB1bnN1cHBvcnRlZC4gVGhlIDxiPlZJRElPQ0dGQlVGPC9iPiBpb2N0bCByZXR1cm5zIHRoZQotY3VycmVudGx5IHVzZWQgcGFyYW1ldGVycy4gVGhlIHN0cnVjdHVyZSB1c2VkIGluIGJvdGggY2FzZXMgaXMgYSAKLTxiPnN0cnVjdCB2aWRlb19idWZmZXI8L2I+LgotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPnZvaWQgKmJhc2U8L2I+PC9URD48VEQ+QmFzZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXI8L1REPgotPFRSPjxURD48Yj5pbnQgaGVpZ2h0PC9iPjwvVEQ+PFREPkhlaWdodCBvZiB0aGUgZnJhbWUgYnVmZmVyPC9URD4KLTxUUj48VEQ+PGI+aW50IHdpZHRoPC9iPjwvVEQ+PFREPldpZHRoIG9mIHRoZSBmcmFtZSBidWZmZXI8L1REPgotPFRSPjxURD48Yj5pbnQgZGVwdGg8L2I+PC9URD48VEQ+RGVwdGggb2YgdGhlIGZyYW1lIGJ1ZmZlcjwvVEQ+Ci08VFI+PFREPjxiPmludCBieXRlc3BlcmxpbmU8L2I+PC9URD48VEQ+TnVtYmVyIG9mIGJ5dGVzIG9mIG1lbW9yeSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0d28gYWRqYWNlbnQgbGluZXM8L1REPgotPC9UQUJMRT4KLTxQPgotTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyByZWZsZWN0IHRoZSBwaHlzaWNhbCBsYXlvdXQgb2YgdGhlIGZyYW1lIGJ1ZmZlci4gCi1UaGUgdmlzaWJsZSBhcmVhIG1heSBiZSBzbWFsbGVyLiBJbiBmYWN0IHVuZGVyIFhGcmVlODYgdGhpcyBpcyBjb21tb25seSB0aGUKLWNhc2UuIFhGcmVlODYgREdBIGNhbiBwcm92aWRlIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGlzIGlvY3RsLgotU2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE5VTEwgaW5kaWNhdGVzIHRoZXJlIGlzIG5vIHBoeXNpY2FsIGZyYW1lIGJ1ZmZlcgotYWNjZXNzLgotPFA+Ci08SDM+Q2FwdHVyZSBXaW5kb3dzPC9IMz4KLVRoZSBjYXB0dXJlIGFyZWEgaXMgZGVzY3JpYmVkIGJ5IGEgPGI+c3RydWN0IHZpZGVvX3dpbmRvdzwvYj4uIFRoaXMgZGVmaW5lcwotYSBjYXB0dXJlIGFyZWEgYW5kIHRoZSBjbGlwcGluZyBpbmZvcm1hdGlvbiBpZiByZWxldmFudC4gVGhlIAotPGI+VklESU9DR1dJTjwvYj4gaW9jdGwgcmVjb3ZlcnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYW5kIHRoZSAKLTxiPlZJRElPQ1NXSU48L2I+IHNldHMgbmV3IHZhbHVlcy4gQSBzdWNjZXNzZnVsIGNhbGwgdG8gPGI+VklESU9DU1dJTjwvYj4gCi1pbmRpY2F0ZXMgdGhhdCBhIHN1aXRhYmxlIHNldCBvZiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjaG9zZW4uIFRoZXkgZG8gbm90Ci1pbmRpY2F0ZSB0aGF0IGV4YWN0bHkgd2hhdCB3YXMgcmVxdWVzdGVkIHdhcyBncmFudGVkLiBUaGUgcHJvZ3JhbSBzaG91bGQKLWNhbGwgPGI+VklESU9DR1dJTjwvYj4gdG8gY2hlY2sgaWYgdGhlIG5lYXJlc3QgbWF0Y2ggd2FzIHN1aXRhYmxlLiBUaGUKLTxiPnN0cnVjdCB2aWRlb193aW5kb3c8L2I+IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzLgotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPng8L2I+PFREPlRoZSBYIGNvLW9yZGluYXRlIHNwZWNpZmllZCBpbiBYIHdpbmRvd3MgZm9ybWF0LjwvVEQ+Ci08VFI+PFREPjxiPnk8L2I+PFREPlRoZSBZIGNvLW9yZGluYXRlIHNwZWNpZmllZCBpbiBYIHdpbmRvd3MgZm9ybWF0LjwvVEQ+Ci08VFI+PFREPjxiPndpZHRoPC9iPjxURD5UaGUgd2lkdGggb2YgdGhlIGltYWdlIGNhcHR1cmUuPC9URD4KLTxUUj48VEQ+PGI+aGVpZ2h0PC9iPjxURD5UaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBjYXB0dXJlLjwvVEQ+Ci08VFI+PFREPjxiPmNocm9tYWtleTwvYj48VEQ+QSBob3N0IG9yZGVyIFJHQjMyIHZhbHVlIGZvciB0aGUgY2hyb21hIGtleS48L1REPgotPFRSPjxURD48Yj5mbGFnczwvYj48VEQ+QWRkaXRpb25hbCBjYXB0dXJlIGZsYWdzLjwvVEQ+Ci08VFI+PFREPjxiPmNsaXBzPC9iPjxURD5BIGxpc3Qgb2YgY2xpcHBpbmcgcmVjdGFuZ2xlcy4gPGVtPihTZXQgb25seSk8L2VtPjwvVEQ+Ci08VFI+PFREPjxiPmNsaXBjb3VudDwvYj48VEQ+VGhlIG51bWJlciBvZiBjbGlwcGluZyByZWN0YW5nbGVzLiA8ZW0+KFNldCBvbmx5KTwvZW0+PC9URD4KLTwvVEFCTEU+Ci08UD4KLUNsaXBwaW5nIHJlY3RhbmdsZXMgYXJlIHBhc3NlZCBhcyBhbiBhcnJheS4gRWFjaCBjbGlwIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcKLWZpZWxkcyBhdmFpbGFibGUgdG8gdGhlIHVzZXIuCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+eDwvYj48L1REPjxURD5YIGNvLW9yZGluYXRlIG9mIHJlY3RhbmdsZSB0byBza2lwPC9URD4KLTxUUj48VEQ+PGI+eTwvYj48L1REPjxURD5ZIGNvLW9yZGluYXRlIG9mIHJlY3RhbmdsZSB0byBza2lwPC9URD4KLTxUUj48VEQ+PGI+d2lkdGg8L2I+PC9URD48VEQ+V2lkdGggb2YgcmVjdGFuZ2xlIHRvIHNraXA8L1REPgotPFRSPjxURD48Yj5oZWlnaHQ8L2I+PC9URD48VEQ+SGVpZ2h0IG9mIHJlY3RhbmdsZSB0byBza2lwPC9URD4KLTwvVEFCTEU+Ci08UD4KLU1lcmVseSBzZXR0aW5nIHRoZSB3aW5kb3cgZG9lcyBub3QgZW5hYmxlIGNhcHR1cmluZy4gT3ZlcmxheSBjYXB0dXJpbmcKLShpLmUuIFBDSS1QQ0kgdHJhbnNmZXIgdG8gdGhlIGZyYW1lIGJ1ZmZlciBvZiB0aGUgdmlkZW8gY2FyZCkKLWlzIGFjdGl2YXRlZCBieSBwYXNzaW5nIHRoZSA8Yj5WSURJT0NDQVBUVVJFPC9iPiBpb2N0bCBhIHZhbHVlIG9mIDEsIGFuZAotZGlzYWJsZWQgYnkgcGFzc2luZyBpdCBhIHZhbHVlIG9mIDAuIAotPFA+Ci1Tb21lIGNhcHR1cmUgZGV2aWNlcyBjYW4gY2FwdHVyZSBhIHN1YmZpZWxkIG9mIHRoZSBpbWFnZSB0aGV5IGFjdHVhbGx5IHNlZS4KLVRoaXMgaXMgaW5kaWNhdGVkIHdoZW4gVklERU9fVFlQRV9TVUJDQVBUVVJFIGlzIGRlZmluZWQuCi1UaGUgdmlkZW9fY2FwdHVyZSBkZXNjcmliZXMgdGhlIHRpbWUgYW5kIHNwZWNpYWwgc3ViZmllbGRzIHRvIGNhcHR1cmUuCi1UaGUgdmlkZW9fY2FwdHVyZSBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHMuCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+eDwvYj48L1REPjxURD5YIGNvLW9yZGluYXRlIG9mIHNvdXJjZSByZWN0YW5nbGUgdG8gZ3JhYjwvVEQ+Ci08VFI+PFREPjxiPnk8L2I+PC9URD48VEQ+WSBjby1vcmRpbmF0ZSBvZiBzb3VyY2UgcmVjdGFuZ2xlIHRvIGdyYWI8L1REPgotPFRSPjxURD48Yj53aWR0aDwvYj48L1REPjxURD5XaWR0aCBvZiBzb3VyY2UgcmVjdGFuZ2xlIHRvIGdyYWI8L1REPgotPFRSPjxURD48Yj5oZWlnaHQ8L2I+PC9URD48VEQ+SGVpZ2h0IG9mIHNvdXJjZSByZWN0YW5nbGUgdG8gZ3JhYjwvVEQ+Ci08VFI+PFREPjxiPmRlY2ltYXRpb248L2I+PC9URD48VEQ+RGVjaW1hdGlvbiB0byBhcHBseTwvVEQ+Ci08VFI+PFREPjxiPmZsYWdzPC9iPjwvVEQ+PFREPkZsYWcgc2V0dGluZ3MgZm9yIGdyYWJiaW5nPC9URD4KLTwvVEFCTEU+Ci1UaGUgYXZhaWxhYmxlIGZsYWdzIGFyZQotPFA+Ci08VEFCTEU+Ci08VFI+PFRIPk5hbWU8L1RIPjxUSD5EZXNjcmlwdGlvbjwvVEg+Ci08VFI+PFREPjxiPlZJREVPX0NBUFRVUkVfT0REPC9iPjxURD5DYXB0dXJlIG9ubHkgb2RkIGZyYW1lczwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX0NBUFRVUkVfRVZFTjwvYj48VEQ+Q2FwdHVyZSBvbmx5IGV2ZW4gZnJhbWVzPC9URD4KLTwvVEFCTEU+Ci08UD4KLTxIMz5WaWRlbyBTb3VyY2VzPC9IMz4KLUVhY2ggdmlkZW80bGludXggdmlkZW8gb3IgYXVkaW8gZGV2aWNlIGNhcHR1cmVzIGZyb20gb25lIG9yIG1vcmUgCi1zb3VyY2UgPGI+Y2hhbm5lbHM8L2I+LiBFYWNoIGNoYW5uZWwgY2FuIGJlIHF1ZXJpZXMgd2l0aCB0aGUgCi08Yj5WRElPQ0dDSEFOPC9iPiBpb2N0bCBjYWxsLiBCZWZvcmUgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB0aGUgY2FsbGVyCi1tdXN0IHNldCB0aGUgY2hhbm5lbCBmaWVsZCB0byB0aGUgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIHF1ZXJpZWQuIE9uIHJldHVybgotdGhlIDxiPnN0cnVjdCB2aWRlb19jaGFubmVsPC9iPiBpcyBmaWxsZWQgaW4gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLW5hdHVyZSBvZiB0aGUgY2hhbm5lbCBpdHNlbGYuCi08UD4KLVRoZSA8Yj5WSURJT0NTQ0hBTjwvYj4gaW9jdGwgdGFrZXMgYW4gaW50ZWdlciBhcmd1bWVudCBhbmQgc3dpdGNoZXMgdGhlCi1jYXB0dXJlIHRvIHRoaXMgaW5wdXQuIEl0IGlzIG5vdCBkZWZpbmVkIHdoZXRoZXIgcGFyYW1ldGVycyBzdWNoIGFzIGNvbG91cgotc2V0dGluZ3Mgb3IgdHVuaW5nIGFyZSBtYWludGFpbmVkIGFjcm9zcyBhIGNoYW5uZWwgc3dpdGNoLiBUaGUgY2FsbGVyIHNob3VsZAotbWFpbnRhaW4gc2V0dGluZ3MgYXMgZGVzaXJlZCBmb3IgZWFjaCBjaGFubmVsLiAoVGhpcyBpcyByZWFzb25hYmxlIGFzIAotZGlmZmVyZW50IHZpZGVvIGlucHV0cyBtYXkgaGF2ZSBkaWZmZXJlbnQgcHJvcGVydGllcykuCi08UD4KLVRoZSA8Yj5zdHJ1Y3QgdmlkZW9fY2hhbm5lbDwvYj4gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZwotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPmNoYW5uZWw8L2I+PC9URD48VEQ+VGhlIGNoYW5uZWwgbnVtYmVyPC9URD4KLTxUUj48VEQ+PGI+bmFtZTwvYj48L1REPjxURD5UaGUgaW5wdXQgbmFtZSAtIHByZWZlcmFibHkgcmVmbGVjdGluZyB0aGUgbGFiZWwKLW9uIHRoZSBjYXJkIGlucHV0IGl0c2VsZjwvVEQ+Ci08VFI+PFREPjxiPnR1bmVyczwvYj48L1REPjxURD5OdW1iZXIgb2YgdHVuZXJzIGZvciB0aGlzIGlucHV0PC9URD4KLTxUUj48VEQ+PGI+ZmxhZ3M8L2I+PC9URD48VEQ+UHJvcGVydGllcyB0aGUgdHVuZXIgaGFzPC9URD4KLTxUUj48VEQ+PGI+dHlwZTwvYj48L1REPjxURD5JbnB1dCB0eXBlIChpZiBrbm93bik8L1REPgotPFRSPjxURD48Yj5ub3JtPC9iPjxURD5UaGUgbm9ybSBmb3IgdGhpcyBjaGFubmVsPC9URD4KLTwvVEFCTEU+Ci08UD4KLVRoZSBmbGFncyBkZWZpbmVkIGFyZQotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPlZJREVPX1ZDX1RVTkVSPC9iPjxURD5DaGFubmVsIGhhcyB0dW5lcnMuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVkNfQVVESU88L2I+PFREPkNoYW5uZWwgaGFzIGF1ZGlvLjwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1ZDX05PUk08L2I+PFREPkNoYW5uZWwgaGFzIG5vcm0gc2V0dGluZy48L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIHR5cGVzIGRlZmluZWQgYXJlCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fVFlQRV9UVjwvYj48VEQ+VGhlIGlucHV0IGlzIGEgVFYgaW5wdXQuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFlQRV9DQU1FUkE8L2I+PFREPlRoZSBpbnB1dCBpcyBhIGNhbWVyYS48L1REPgotPC9UQUJMRT4KLTxQPgotPEgzPkltYWdlIFByb3BlcnRpZXM8L0gzPgotVGhlIGltYWdlIHByb3BlcnRpZXMgb2YgdGhlIHBpY3R1cmUgY2FuIGJlIHF1ZXJpZWQgd2l0aCB0aGUgPGI+VklESU9DR1BJQ1Q8L2I+Ci1pb2N0bCB3aGljaCBmaWxscyBpbiBhIDxiPnN0cnVjdCB2aWRlb19waWN0dXJlPC9iPi4gVGhlIDxiPlZJRElPQ1NQSUNUPC9iPiAKLWlvY3RsIGFsbG93cyB2YWx1ZXMgdG8gYmUgY2hhbmdlZC4gQWxsIHZhbHVlcyBleGNlcHQgZm9yIHRoZSBwYWxldHRlIHR5cGUKLWFyZSBzY2FsZWQgYmV0d2VlbiAwLTY1NTM1LiAKLTxQPgotVGhlIDxiPnN0cnVjdCB2aWRlb19waWN0dXJlPC9iPiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcwotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPmJyaWdodG5lc3M8L2I+PFREPlBpY3R1cmUgYnJpZ2h0bmVzczwvVEQ+Ci08VFI+PFREPjxiPmh1ZTwvYj48VEQ+UGljdHVyZSBodWUgKGNvbG91ciBvbmx5KTwvVEQ+Ci08VFI+PFREPjxiPmNvbG91cjwvYj48VEQ+UGljdHVyZSBjb2xvdXIgKGNvbG91ciBvbmx5KTwvVEQ+Ci08VFI+PFREPjxiPmNvbnRyYXN0PC9iPjxURD5QaWN0dXJlIGNvbnRyYXN0PC9URD4KLTxUUj48VEQ+PGI+d2hpdGVuZXNzPC9iPjxURD5UaGUgd2hpdGVuZXNzIChncmV5c2NhbGUgb25seSk8L1REPgotPFRSPjxURD48Yj5kZXB0aDwvYj48VEQ+VGhlIGNhcHR1cmUgZGVwdGggKG1heSBuZWVkIHRvIG1hdGNoIHRoZSBmcmFtZSBidWZmZXIgZGVwdGgpPC9URD4KLTxUUj48VEQ+PGI+cGFsZXR0ZTwvYj48VEQ+UmVwb3J0cyB0aGUgcGFsZXR0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGltYWdlPC9URD4KLTwvVEFCTEU+Ci08UD4KLVRoZSBmb2xsb3dpbmcgcGFsZXR0ZXMgYXJlIGRlZmluZWQKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX0dSRVk8L2I+PFREPkxpbmVhciBpbnRlbnNpdHkgZ3JleSBzY2FsZSAoMjU1IGlzIGJyaWdodGVzdCkuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9ISTI0MDwvYj48VEQ+VGhlIEJUODQ4IDhiaXQgY29sb3VyIGN1YmUuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9SR0I1NjU8L2I+PFREPlJHQjU2NSBwYWNrZWQgaW50byAxNiBiaXQgd29yZHMuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9SR0I1NTU8L2I+PFREPlJHVjU1NSBwYWNrZWQgaW50byAxNiBiaXQgd29yZHMsIHRvcCBiaXQgdW5kZWZpbmVkLjwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfUkdCMjQ8L2I+PFREPlJHQjg4OCBwYWNrZWQgaW50byAyNGJpdCB3b3Jkcy48L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1JHQjMyPC9iPjxURD5SR0I4ODggcGFja2VkIGludG8gdGhlIGxvdyAzIGJ5dGVzIG9mIDMyYml0IHdvcmRzLiBUaGUgdG9wIDhiaXRzIGFyZSB1bmRlZmluZWQuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9ZVVY0MjI8L2I+PFREPlZpZGVvIHN0eWxlIFlVVjQyMiAtIDhiaXRzIHBhY2tlZCA0Yml0cyBZIDJiaXRzIFUgMmJpdHMgVjwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfWVVZVjwvYj48VEQ+RGVzY3JpYmUgbWU8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1VZVlk8L2I+PFREPkRlc2NyaWJlIG1lPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9ZVVY0MjA8L2I+PFREPllVVjQyMCBjYXB0dXJlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9ZVVY0MTE8L2I+PFREPllVVjQxMSBjYXB0dXJlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9SQVc8L2I+PFREPlJBVyBjYXB0dXJlIChCVDg0OCk8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1lVVjQyMlA8L2I+PFREPllVViA0OjI6MiBQbGFuYXI8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1lVVjQxMVA8L2I+PFREPllVViA0OjE6MSBQbGFuYXI8L1REPgotPC9UQUJMRT4KLTxQPgotPEgzPlR1bmluZzwvSDM+Ci1FYWNoIHZpZGVvIGlucHV0IGNoYW5uZWwgY2FuIGhhdmUgb25lIG9yIG1vcmUgdHVuZXJzIGFzc29jaWF0ZWQgd2l0aCBpdC4gTWFueQotZGV2aWNlcyB3aWxsIG5vdCBoYXZlIHR1bmVycy4gVFYgY2FyZHMgYW5kIHJhZGlvIGNhcmRzIHdpbGwgaGF2ZSBvbmUgb3IgbW9yZQotdHVuZXJzIGF0dGFjaGVkLgotPFA+Ci1UdW5lcnMgYXJlIGRlc2NyaWJlZCBieSBhIDxiPnN0cnVjdCB2aWRlb190dW5lcjwvYj4gd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5Ci10aGUgPGI+VklESU9DR1RVTkVSPC9iPiBpb2N0bC4gRmlsbCBpbiB0aGUgdHVuZXIgbnVtYmVyIGluIHRoZSBzdHJ1Y3R1cmUKLXRoZW4gcGFzcyB0aGUgc3RydWN0dXJlIHRvIHRoZSBpb2N0bCB0byBoYXZlIHRoZSBkYXRhIGZpbGxlZCBpbi4gVGhlIAotdHVuZXIgY2FuIGJlIHN3aXRjaGVkIHVzaW5nIDxiPlZJRElPQ1NUVU5FUjwvYj4gd2hpY2ggdGFrZXMgYW4gaW50ZWdlciBhcmd1bWVudAotZ2l2aW5nIHRoZSB0dW5lciB0byB1c2UuIEEgc3RydWN0IHR1bmVyIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcwotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPnR1bmVyPC9iPjxURD5OdW1iZXIgb2YgdGhlIHR1bmVyPC9URD4KLTxUUj48VEQ+PGI+bmFtZTwvYj48VEQ+Q2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgdHVuZXIgKGVnIEZNL0FNL1RWKTwvVEQ+Ci08VFI+PFREPjxiPnJhbmdlbG93PC9iPjxURD5Mb3dlc3QgdHVuYWJsZSBmcmVxdWVuY3k8L1REPgotPFRSPjxURD48Yj5yYW5nZWhpZ2g8L2I+PFREPkhpZ2hlc3QgdHVuYWJsZSBmcmVxdWVuY3k8L1REPgotPFRSPjxURD48Yj5mbGFnczwvYj48VEQ+RmxhZ3MgZGVzY3JpYmluZyB0aGUgdHVuZXI8L1REPgotPFRSPjxURD48Yj5tb2RlPC9iPjxURD5UaGUgdmlkZW8gc2lnbmFsIG1vZGUgaWYgcmVsZXZhbnQ8L1REPgotPFRSPjxURD48Yj5zaWduYWw8L2I+PFREPlNpZ25hbCBzdHJlbmd0aCBpZiBrbm93biAtIGJldHdlZW4gMC02NTUzNTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgZm9sbG93aW5nIGZsYWdzIGV4aXN0Ci08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfUEFMPC9iPjxURD5QQUwgdHVuaW5nIGlzIHN1cHBvcnRlZDwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1RVTkVSX05UU0M8L2I+PFREPk5UU0MgdHVuaW5nIGlzIHN1cHBvcnRlZDwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1RVTkVSX1NFQ0FNPC9iPjxURD5TRUNBTSB0dW5pbmcgaXMgc3VwcG9ydGVkPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfTE9XPC9iPjxURD5GcmVxdWVuY3kgaXMgaW4gYSBsb3dlciByYW5nZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1RVTkVSX05PUk08L2I+PFREPlRoZSBub3JtIGZvciB0aGlzIHR1bmVyIGlzIHNldHRhYmxlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfU1RFUkVPX09OPC9iPjxURD5UaGUgdHVuZXIgaXMgc2VlaW5nIHN0ZXJlbyBhdWRpbzwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1RVTkVSX1JEU19PTjwvYj48VEQ+VGhlIHR1bmVyIGlzIHNlZWluZyBhIFJEUyBkYXRhc3RyZWFtPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfTUJTX09OPC9iPjxURD5UaGUgdHVuZXIgaXMgc2VlaW5nIGEgTUJTIGRhdGFzdHJlYW08L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIGZvbGxvd2luZyBtb2RlcyBhcmUgZGVmaW5lZAotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPlZJREVPX01PREVfUEFMPC9iPjxURD5UaGUgdHVuZXIgaXMgaW4gUEFMIG1vZGU8L1REPgotPFRSPjxURD48Yj5WSURFT19NT0RFX05UU0M8L2I+PFREPlRoZSB0dW5lciBpcyBpbiBOVFNDIG1vZGU8L1REPgotPFRSPjxURD48Yj5WSURFT19NT0RFX1NFQ0FNPC9iPjxURD5UaGUgdHVuZXIgaXMgaW4gU0VDQU0gbW9kZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX01PREVfQVVUTzwvYj48VEQ+VGhlIHR1bmVyIGF1dG8gc3dpdGNoZXMsIG9yIG1vZGUgZG9lcyBub3QgYXBwbHk8L1REPgotPC9UQUJMRT4KLTxQPgotVHVuaW5nIGZyZXF1ZW5jaWVzIGFyZSBhbiB1bnNpZ25lZCAzMmJpdCB2YWx1ZSBpbiAxLzE2dGggTUh6IG9yIGlmIHRoZQotPGI+VklERU9fVFVORVJfTE9XPC9iPiBmbGFnIGlzIHNldCB0aGV5IGFyZSBpbiAxLzE2dGggS0h6LiBUaGUgY3VycmVudAotZnJlcXVlbmN5IGlzIG9idGFpbmVkIGFzIGFuIHVuc2lnbmVkIGxvbmcgdmlhIHRoZSA8Yj5WSURJT0NHRlJFUTwvYj4gaW9jdGwgYW5kCi1zZXQgYnkgdGhlIDxiPlZJRElPQ1NGUkVRPC9iPiBpb2N0bC4KLTxQPgotPEgzPkF1ZGlvPC9IMz4KLVRWIGFuZCBSYWRpbyBkZXZpY2VzIGhhdmUgb25lIG9yIG1vcmUgYXVkaW8gaW5wdXRzIHRoYXQgbWF5IGJlIHNlbGVjdGVkLiAKLVRoZSBhdWRpbyBwcm9wZXJ0aWVzIGFyZSBxdWVyaWVkIGJ5IHBhc3NpbmcgYSA8Yj5zdHJ1Y3QgdmlkZW9fYXVkaW88L2I+IHRvIDxiPlZJRElPQ0dBVURJTzwvYj4gaW9jdGwuIFRoZQotPGI+VklESU9DU0FVRElPPC9iPiBpb2N0bCBzZXRzIGF1ZGlvIHByb3BlcnRpZXMuCi08UD4KLVRoZSBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHMKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5hdWRpbzwvYj48VEQ+VGhlIGNoYW5uZWwgbnVtYmVyPC9URD4KLTxUUj48VEQ+PGI+dm9sdW1lPC9iPjxURD5UaGUgdm9sdW1lIGxldmVsPC9URD4KLTxUUj48VEQ+PGI+YmFzczwvYj48VEQ+VGhlIGJhc3MgbGV2ZWw8L1REPgotPFRSPjxURD48Yj50cmVibGU8L2I+PFREPlRoZSB0cmVibGUgbGV2ZWw8L1REPgotPFRSPjxURD48Yj5mbGFnczwvYj48VEQ+RmxhZ3MgZGVzY3JpYmluZyB0aGUgYXVkaW8gY2hhbm5lbDwvVEQ+Ci08VFI+PFREPjxiPm5hbWU8L2I+PFREPkNhbm9uaWNhbCBuYW1lIGZvciB0aGUgYXVkaW8gaW5wdXQ8L1REPgotPFRSPjxURD48Yj5tb2RlPC9iPjxURD5UaGUgbW9kZSB0aGUgYXVkaW8gaW5wdXQgaXMgaW48L1REPgotPFRSPjxURD48Yj5iYWxhbmNlPC9iPjxURD5UaGUgbGVmdC9yaWdodCBiYWxhbmNlPC9URD4KLTxUUj48VEQ+PGI+c3RlcDwvYj48VEQ+QWN0dWFsIHN0ZXAgdXNlZCBieSB0aGUgaGFyZHdhcmU8L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgZGVmaW5lZAotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPlZJREVPX0FVRElPX01VVEU8L2I+PFREPlRoZSBhdWRpbyBpcyBtdXRlZDwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX0FVRElPX01VVEFCTEU8L2I+PFREPkF1ZGlvIG11dGluZyBpcyBzdXBwb3J0ZWQ8L1REPgotPFRSPjxURD48Yj5WSURFT19BVURJT19WT0xVTUU8L2I+PFREPlRoZSB2b2x1bWUgaXMgY29udHJvbGxhYmxlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fQVVESU9fQkFTUzwvYj48VEQ+VGhlIGJhc3MgaXMgY29udHJvbGxhYmxlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fQVVESU9fVFJFQkxFPC9iPjxURD5UaGUgdHJlYmxlIGlzIGNvbnRyb2xsYWJsZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX0FVRElPX0JBTEFOQ0U8L2I+PFREPlRoZSBiYWxhbmNlIGlzIGNvbnRyb2xsYWJsZTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgZm9sbG93aW5nIGRlY29kaW5nIG1vZGVzIGFyZSBkZWZpbmVkCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fU09VTkRfTU9OTzwvYj48VEQ+TW9ubyBzaWduYWw8L1REPgotPFRSPjxURD48Yj5WSURFT19TT1VORF9TVEVSRU88L2I+PFREPlN0ZXJlbyBzaWduYWwgKE5JQ0FNIGZvciBUVik8L1REPgotPFRSPjxURD48Yj5WSURFT19TT1VORF9MQU5HMTwvYj48VEQ+RXVyb3BlYW4gVFYgYWx0ZXJuYXRlIGxhbmd1YWdlIDE8L1REPgotPFRSPjxURD48Yj5WSURFT19TT1VORF9MQU5HMjwvYj48VEQ+RXVyb3BlYW4gVFYgYWx0ZXJuYXRlIGxhbmd1YWdlIDI8L1REPgotPC9UQUJMRT4KLTxQPgotPEgzPlJlYWRpbmcgSW1hZ2VzPC9IMz4KLUVhY2ggY2FsbCB0byB0aGUgPGI+cmVhZDwvYj4gc3lzY2FsbCByZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBpbWFnZQotZnJvbSB0aGUgZGV2aWNlLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNldCBmb3JtYXQgYW5kIHNpemUgKHVzaW5nCi10aGUgVklESU9DU1BJQ1QgYW5kIFZJRElPQ1NXSU4gaW9jdGxzKSBhbmQgdGhlbiB0byBwYXNzIGEgc3VpdGFibGUKLXNpemUgYnVmZmVyIGFuZCBsZW5ndGggdG8gdGhlIGZ1bmN0aW9uLiBOb3QgYWxsIGRldmljZXMgd2lsbCBzdXBwb3J0Ci1yZWFkIG9wZXJhdGlvbnMuCi08UD4KLUEgc2Vjb25kIHdheSB0byBoYW5kbGUgaW1hZ2UgY2FwdHVyZSBpcyB2aWEgdGhlIG1tYXAgaW50ZXJmYWNlIGlmIHN1cHBvcnRlZC4KLVRvIHVzZSB0aGUgbW1hcCBpbnRlcmZhY2UgYSB1c2VyIGZpcnN0IHNldHMgdGhlIGRlc2lyZWQgaW1hZ2Ugc2l6ZSBhbmQgZGVwdGgKLXByb3BlcnRpZXMuIE5leHQgdGhlIFZJRElPQ0dNQlVGIGlvY3RsIGlzIGlzc3VlZC4gVGhpcyByZXBvcnRzIHRoZSBzaXplCi1vZiBidWZmZXIgdG8gbW1hcCBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlciBmb3IgZWFjaCBmcmFtZS4gVGhlCi1udW1iZXIgb2YgZnJhbWVzIHN1cHBvcnRlZCBpcyBkZXZpY2UgZGVwZW5kZW50IGFuZCBtYXkgb25seSBiZSBvbmUuIAotPFA+Ci1UaGUgdmlkZW9fbWJ1ZiBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHMKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5zaXplPC9iPjxURD5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hcDwvVEQ+Ci08VFI+PFREPjxiPmZyYW1lczwvYj48VEQ+VGhlIG51bWJlciBvZiBmcmFtZXM8L1REPgotPFRSPjxURD48Yj5vZmZzZXRzPC9iPjxURD5UaGUgb2Zmc2V0IG9mIGVhY2ggZnJhbWU8L1REPgotPC9UQUJMRT4KLTxQPgotT25jZSB0aGUgbW1hcCBoYXMgYmVlbiBtYWRlIHRoZSBWSURJT0NNQ0FQVFVSRSBpb2N0bCBzdGFydHMgdGhlCi1jYXB0dXJlIHRvIGEgZnJhbWUgdXNpbmcgdGhlIGZvcm1hdCBhbmQgaW1hZ2Ugc2l6ZSBzcGVjaWZpZWQgaW4gdGhlCi12aWRlb19tbWFwICh3aGljaCBzaG91bGQgbWF0Y2ggb3IgYmUgYmVsb3cgdGhlIGluaXRpYWwgcXVlcnkgc2l6ZSkuCi1XaGVuIHRoZSBWSURJT0NNQ0FQVFVSRSBpb2N0bCByZXR1cm5zIHRoZSBmcmFtZSBpcyA8ZW0+bm90PC9lbT4KLWNhcHR1cmVkIHlldCwgdGhlIGRyaXZlciBqdXN0IGluc3RydWN0ZWQgdGhlIGhhcmR3YXJlIHRvIHN0YXJ0IHRoZQotY2FwdHVyZS4gIFRoZSBhcHBsaWNhdGlvbiBoYXMgdG8gdXNlIHRoZSBWSURJT0NTWU5DIGlvY3RsIHRvIHdhaXQKLXVudGlsIHRoZSBjYXB0dXJlIG9mIGEgZnJhbWUgaXMgZmluaXNoZWQuICBWSURJT0NTWU5DIHRha2VzIHRoZSBmcmFtZQotbnVtYmVyIHlvdSB3YW50IHRvIHdhaXQgZm9yIGFzIGFyZ3VtZW50LgotPHA+Ci1JdCBpcyBhbGxvd2VkIHRvIGNhbGwgVklESU9DTUNBUFRVUkUgbXVsdGlwbGUgdGltZXMgKHdpdGggZGlmZmVyZW50Ci1mcmFtZSBudW1iZXJzIGluIHZpZGVvX21tYXAtPmZyYW1lIG9mIGNvdXJzZSkgYW5kIHRodXMgaGF2ZSBtdWx0aXBsZQotb3V0c3RhbmRpbmcgY2FwdHVyZSByZXF1ZXN0cy4gIEEgc2ltcGxlIHdheSBkbyB0byBkb3VibGUtYnVmZmVyaW5nCi11c2luZyB0aGlzIGZlYXR1cmUgbG9va3MgbGlrZSB0aGlzOgotPHByZT4KLS8qIHNldHVwIGV2ZXJ5dGhpbmcgKi8KLVZJRElPQ01DQVBUVVJFKDApCi13aGlsZSAod2hhdGV2ZXIpIHsKLSAgIFZJRElPQ01DQVBUVVJFKDEpCi0gICBWSURJT0NTWU5DKDApCi0gICAvKiBwcm9jZXNzIGZyYW1lIDAgd2hpbGUgdGhlIGhhcmR3YXJlIGNhcHR1cmVzIGZyYW1lIDEgKi8KLSAgIFZJRElPQ01DQVBUVVJFKDApCi0gICBWSURJT0NTWU5DKDEpCi0gICAvKiBwcm9jZXNzIGZyYW1lIDEgd2hpbGUgdGhlIGhhcmR3YXJlIGNhcHR1cmVzIGZyYW1lIDAgKi8KLX0KLTwvcHJlPgotTm90ZSB0aGF0IHlvdSBhcmUgPGVtPm5vdDwvZW0+IGxpbWl0ZWQgdG8gb25seSB0d28gZnJhbWVzLiAgVGhlIEFQSQotYWxsb3dzIHVwIHRvIDMyIGZyYW1lcywgdGhlIFZJRElPQ0dNQlVGIGlvY3RsIHJldHVybnMgdGhlIG51bWJlciBvZgotZnJhbWVzIHRoZSBkcml2ZXIgZ3JhbnRlZC4gIFRodXMgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgZGVlcGVyIHF1ZXVlcwotdG8gYXZvaWQgbG9vc2luZyBmcmFtZXMgb24gbG9hZCBwZWFrcy4KLTxwPgotV2hpbGUgY2FwdHVyaW5nIHRvIG1lbW9yeSB0aGUgZHJpdmVyIHdpbGwgbWFrZSBhICJiZXN0IGVmZm9ydCIgYXR0ZW1wdAotdG8gY2FwdHVyZSB0byBzY3JlZW4gYXMgd2VsbCBpZiByZXF1ZXN0ZWQuIFRoaXMgbm9ybWFsbHkgbWVhbnMgYWxsCi1mcmFtZXMgdGhhdCAibWlzcyIgbWVtb3J5IG1hcHBlZCBjYXB0dXJlIHdpbGwgZ28gdG8gdGhlIGRpc3BsYXkuCi08UD4KLUEgZmluYWwgaW9jdGwgZXhpc3RzIHRvIGFsbG93IGEgZGV2aWNlIHRvIG9idGFpbiByZWxhdGVkIGRldmljZXMgaWYgYQotZHJpdmVyIGhhcyBtdWx0aXBsZSBjb21wb25lbnRzIChmb3IgZXhhbXBsZSB2aWRlbzAgbWF5IG5vdCBiZSBhc3NvY2lhdGVkCi13aXRoIHZiaTAgd2hpY2ggd291bGQgY2F1c2UgYW4gaW50ZXJjYXN0IGRpc3BsYXkgcHJvZ3JhbSB0byBtYWtlIGEgYmFkCi1taXN0YWtlKS4gVGhlIFZJRElPQ0dVTklUIGlvY3RsIHJlcG9ydHMgdGhlIHVuaXQgbnVtYmVycyBvZiB0aGUgYXNzb2NpYXRlZAotZGV2aWNlcyBpZiBhbnkgZXhpc3QuIFRoZSB2aWRlb191bml0IHN0cnVjdHVyZSBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHMuCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+dmlkZW88L2I+PFREPlZpZGVvIGNhcHR1cmUgZGV2aWNlPC9URD4KLTxUUj48VEQ+PGI+dmJpPC9iPjxURD5WQkkgY2FwdHVyZSBkZXZpY2U8L1REPgotPFRSPjxURD48Yj5yYWRpbzwvYj48VEQ+UmFkaW8gZGV2aWNlPC9URD4KLTxUUj48VEQ+PGI+YXVkaW88L2I+PFREPkF1ZGlvIG1peGVyPC9URD4KLTxUUj48VEQ+PGI+dGVsZXRleHQ8L2I+PFREPlRlbGV0ZXh0IGRldmljZTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci08SDM+UkRTIERhdGFzdHJlYW1zPC9IMz4KLUZvciByYWRpbyBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdCwgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSBSYWRpbyBEYXRhCi1TeXN0ZW0gKFJEUykgZGF0YSBieSBtZWFucyBvZiBhIHJlYWQoKSBvbiB0aGUgZGV2aWNlLiAgVGhlIGRhdGEgaXMgcGFja2VkIGluCi1ncm91cHMgb2YgdGhyZWUsIGFzIGZvbGxvd3M6Ci08VEFCTEU+Ci08VFI+PFREPkZpcnN0IE9jdGV0PC9URD48VEQ+TGVhc3QgU2lnbmlmaWNhbnQgQnl0ZSBvZiBSRFMgQmxvY2s8L1REPjwvVFI+Ci08VFI+PFREPlNlY29uZCBPY3RldDwvVEQ+PFREPk1vc3QgU2lnbmlmaWNhbnQgQnl0ZSBvZiBSRFMgQmxvY2sKLTxUUj48VEQ+VGhpcmQgT2N0ZXQ8L1REPjxURD5CaXQgNzo8L1REPjxURD5FcnJvciBiaXQuICBJbmRpY2F0ZXMgdGhhdAotYW4gdW5jb3JyZWN0YWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVjZXB0aW9uIG9mIHRoaXMgYmxvY2suPC9URD48L1RSPgotPFRSPjxURD4mbmJzcDs8L1REPjxURD5CaXQgNjo8L1REPjxURD5Db3JyZWN0ZWQgYml0LiAgSW5kaWNhdGVzIHRoYXQgIAotYW4gZXJyb3Igd2FzIGNvcnJlY3RlZCBmb3IgdGhpcyBkYXRhIGJsb2NrLjwvVEQ+PC9UUj4KLTxUUj48VEQ+Jm5ic3A7PC9URD48VEQ+Qml0cyA1LTM6PC9URD48VEQ+UmVjZWl2ZWQgT2Zmc2V0LiAgSW5kaWNhdGVzIHRoZSAgCi1vZmZzZXQgcmVjZWl2ZWQgYnkgdGhlIHN5bmMgc3lzdGVtLjwvVEQ+PC9UUj4KLTxUUj48VEQ+Jm5ic3A7PC9URD48VEQ+Qml0cyAyLTA6PC9URD48VEQ+T2Zmc2V0IE5hbWUuICBJbmRpY2F0ZXMgdGhlICAKLW9mZnNldCBhcHBsaWVkIHRvIHRoaXMgZGF0YS48L1REPjwvVFI+Ci08L1RBQkxFPgotPC9CT0RZPgotPC9IVE1MPgorPFRJVExFPlY0TCBBUEk8L1RJVExFPgorPEgxPlZpZGVvIEZvciBMaW51eCBBUElzPC9IMT4KKzx0YWJsZSBib3JkZXI9MD4KKzx0cj4KKzx0ZD4KKzxBIEhSRUY9aHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvdmlkZW80bGludXgvQVBJL1Y0TDFfQVBJLmh0bWw+CitWNEwgb3JpZ2luYWwgQVBJPC9hPgorPC90ZD48dGQ+CitPYnNvbGV0ZWQgYnkgVjRMMiBBUEkKKzwvdGQ+PC90cj48dHI+PHRkPgorPEEgSFJFRj1odHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy92aWRlbzRsaW51eC9BUEkvVjRMMl9BUEkuaHRtbD4KK1Y0TDIgQVBJPC9hPgorPC90ZD48dGQ+CitTaG91bGQgYmUgdXNlZCBmb3IgbmV3IHByb2plY3RzCis8L3RkPjwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CmluZGV4IGFlZWFmZWMuLjYyYTEyYTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKQEAgLTEsNCArMSw0IEBACi1jYXJkPTAgLSAgKioqIFVOS05PV04vR0VORVJJQyAqKiogCitjYXJkPTAgLSAgKioqIFVOS05PV04vR0VORVJJQyAqKioKIGNhcmQ9MSAtIE1JUk8gUENUVgogY2FyZD0yIC0gSGF1cHBhdWdlIChidDg0OCkKIGNhcmQ9MyAtIFNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKaW5kZXggMjE2ZjcwNS4uNmQ0NDk1OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OApAQCAtMTMsMTcgKzEzLDE5IEBACiBjYXJkPTEyIC0gQVNVUyBQVlItNDE2CiBjYXJkPTEzIC0gTVNJIFRWLUBueXdoZXJlCiBjYXJkPTE0IC0gS1dvcmxkL1ZTdHJlYW0gWFBlcnQgRFZCLVQKLWNhcmQ9MTUgLSBEVklDTyBGdXNpb25IRFRWIERWQi1UMQorY2FyZD0xNSAtIERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQxCiBjYXJkPTE2IC0gS1dvcmxkIExUVjg4M1JGCi1jYXJkPTE3IC0gRFZpQ08gLSBGdXNpb25IRFRWIDMgR29sZAorY2FyZD0xNyAtIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEKIGNhcmQ9MTggLSBIYXVwcGF1Z2UgTm92YS1UIERWQi1UCiBjYXJkPTE5IC0gQ29uZXhhbnQgRFZCLVQgcmVmZXJlbmNlIGRlc2lnbgogY2FyZD0yMCAtIFByb3ZpZGVvIFBWMjU5Ci1jYXJkPTIxIC0gRFZJQ08gRnVzaW9uSERUViBEVkItVCBQbHVzCitjYXJkPTIxIC0gRFZpQ08gRnVzaW9uSERUViBEVkItVCBQbHVzCiBjYXJkPTIyIC0gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UCiBjYXJkPTIzIC0gcGNIRFRWIEhEMzAwMCBIRFRWCiBjYXJkPTI0IC0gSGF1cHBhdWdlIFdpblRWIDI4eHh4IChSb3NseW4pIG1vZGVscwogY2FyZD0yNSAtIERpZ2l0YWwtTG9naWMgTUlDUk9TUEFDRSBFbnRlcnRhaW5tZW50IENlbnRlciAoTUVDKQogY2FyZD0yNiAtIElPREFUQSBHVi9CQ1RWN0UKIGNhcmQ9MjcgLSBQaXhlbFZpZXcgUGxheVRWIFVsdHJhIFBybyAoU3RlcmVvKQotY2FyZD0yOCAtIERWaUNPIC0gRnVzaW9uSERUViAzIEdvbGQtVAorY2FyZD0yOCAtIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVQKK2NhcmQ9MjkgLSBBRFMgVGVjaCBJbnN0YW50IFRWIERWQi1UIFBDSQorY2FyZD0zMCAtIFRlcnJhVGVjIENpbmVyZ3kgMTQwMCBEVkItVApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IGQ1ZWQ5NWQuLjFiNWEzYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTEsMTAgKzEsMTAgQEAKLSAgMCAtPiBVTktOT1dOL0dFTkVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDAgLT4gVU5LTk9XTi9HRU5FUklDCiAgIDEgLT4gUHJvdGV1cyBQcm8gW3BoaWxpcHMgcmVmZXJlbmNlIGRlc2lnbl0gICBbMTEzMToyMDAxLDExMzE6MjAwMV0KICAgMiAtPiBMaWZlVmlldyBGbHlWSURFTzMwMDAgICAgICAgICAgICAgICAgICAgIFs1MTY4OjAxMzgsNGU0MjowMTM4XQogICAzIC0+IExpZmVWaWV3IEZseVZJREVPMjAwMCAgICAgICAgICAgICAgICAgICAgWzUxNjg6MDEzOF0KICAgNCAtPiBFTVBSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMTMxOjY3NTJdCiAgIDUgLT4gU0tOZXQgTW9uc3RlciBUViAgICAgICAgICAgICAgICAgICAgICAgICBbMTEzMTo0ZTg1XQotICA2IC0+IFRldmlvbiBNRCA5NzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgNiAtPiBUZXZpb24gTUQgOTcxNwogICA3IC0+IEtOQyBPbmUgVFYtU3RhdGlvbiBSRFMgLyBUeXBob29uIFRWIFR1bmVyIFJEUyBbMTEzMTpmZTAxLDE4OTQ6ZmUwMV0KICAgOCAtPiBUZXJyYXRlYyBDaW5lcmd5IDQwMCBUViAgICAgICAgICAgICAgICAgIFsxNTNCOjExNDJdCiAgIDkgLT4gTWVkaW9uIDUwNDQKQEAgLTM0LDYgKzM0LDcgQEAKICAzMyAtPiBBVmVyTWVkaWEgRFZEIEVaTWFrZXIgICAgICAgICAgICAgICAgICAgIFsxNDYxOjEwZmZdCiAgMzQgLT4gTm92YWwgUHJpbWUgVFYgNzEzMwogIDM1IC0+IEF2ZXJNZWRpYSBBdmVyVFYgU3R1ZGlvIDMwNSAgICAgICAgICAgICAgWzE0NjE6MjExNV0KKyAzNiAtPiBVUE1PU1QgUFVSUExFIFRWICAgICAgICAgICAgICAgICAgICAgICAgIFsxMmFiOjA4MDBdCiAgMzcgLT4gSXRlbXMgTXVjaFRWIFBsdXMgLyBJVC0wMDUKICAzOCAtPiBUZXJyYXRlYyBDaW5lcmd5IDIwMCBUViAgICAgICAgICAgICAgICAgIFsxNTNCOjExNTJdCiAgMzkgLT4gTGlmZVZpZXcgRmx5VFYgUGxhdGludW0gTWluaSAgICAgICAgICAgICBbNTE2ODowMjEyXQpAQCAtNDMsMTQgKzQ0LDIxIEBACiAgNDMgLT4gOlpvbGlkIFhwZXJ0IFRWNzEzNAogIDQ0IC0+IEVtcGlyZSBQQ0kgVFYtUmFkaW8gTEUKICA0NSAtPiBBdmVybWVkaWEgQVZlclRWIFN0dWRpbyAzMDcgICAgICAgICAgICAgIFsxNDYxOjk3MTVdCi0gNDYgLT4gQVZlck1lZGlhIENhcmRidXMgVFYvUmFkaW8gICAgICAgICAgICAgICBbMTQ2MTpkNmVlXQorIDQ2IC0+IEFWZXJNZWRpYSBDYXJkYnVzIFRWL1JhZGlvIChFNTAwKSAgICAgICAgWzE0NjE6ZDZlZV0KICA0NyAtPiBUZXJyYXRlYyBDaW5lcmd5IDQwMCBtb2JpbGUgICAgICAgICAgICAgIFsxNTNiOjExNjJdCiAgNDggLT4gVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYgTUszICAgICAgICAgICAgICBbMTUzQjoxMTU4XQogIDQ5IC0+IENvbXBybyBWaWRlb01hdGUgR29sZCsgUGFsICAgICAgICAgICAgICAgWzE4NWI6YzIwMF0KICA1MCAtPiBQaW5uYWNsZSBQQ1RWIDMwMGkgRFZCLVQgKyBQQUwgICAgICAgICAgIFsxMWJkOjAwMmRdCiAgNTEgLT4gUHJvVmlkZW8gUFY5NTIgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTU0MDo5NTI0XQogIDUyIC0+IEF2ZXJNZWRpYSBBdmVyVFYvMzA1ICAgICAgICAgICAgICAgICAgICAgWzE0NjE6MjEwOF0KKyA1MyAtPiBBU1VTIFRWLUZNIDcxMzUgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NDVdCiAgNTQgLT4gTGlmZVZpZXcgRmx5VFYgUGxhdGludW0gRk0gICAgICAgICAgICAgICBbNTE2ODowMjE0LDE0ODk6MDIxNF0KLSA1NSAtPiBMaWZlVmlldyBGbHlEVkItVCBEVU8gICAgICAgICAgICAgICAgICAgIFs1MTY4OjAzMDZdCisgNTUgLT4gTGlmZVZpZXcgRmx5RFZCLVQgRFVPICAgICAgICAgICAgICAgICAgICBbNTE2ODowNTAyLDUxNjg6MDMwNl0KICA1NiAtPiBBdmVybWVkaWEgQVZlclRWIDMwNyAgICAgICAgICAgICAgICAgICAgIFsxNDYxOmE3MGFdCiAgNTcgLT4gQXZlcm1lZGlhIEFWZXJUViBHTyAwMDcgRk0gICAgICAgICAgICAgICBbMTQ2MTpmMzFmXQorIDU4IC0+IEFEUyBUZWNoIEluc3RhbnQgVFYgKHNhYTcxMzUpICAgICAgICAgICAgWzE0MjE6MDM1MCwxNDIxOjAzNzBdCisgNTkgLT4gS3dvcmxkL1RldmlvbiBWLVN0cmVhbSBYcGVydCBUViBQVlI3MTM0CisgNjAgLT4gVHlwaG9vbiBEVkItVCBEdW8gRGlnaXRhbC9BbmFsb2cgQ2FyZGJ1cyBbNGU0MjowNTAyXQorIDYxIC0+IFBoaWxpcHMgVE9VR0ggRFZCLVQgcmVmZXJlbmNlIGRlc2lnbiAgICAgWzExMzE6MjAwNF0KKyA2MiAtPiBDb21wcm8gVmlkZW9NYXRlIFRWIEdvbGQrSUkKKyA2MyAtPiBLd29ybGQgWHBlcnQgVFYgUFZSNzEzNApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lciBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKaW5kZXggYWViOGRmOC4uZDFiOWQyMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCkBAIC01Niw2ICs1Niw5IEBACiB0dW5lcj01NSAtIExHIFBBTCAoVEFQRSBzZXJpZXMpCiB0dW5lcj01NiAtIFBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KQogdHVuZXI9NTcgLSBQaGlsaXBzIEZRMTIzNkEgTUs0Ci10dW5lcj01OCAtIFltZWMgVFZpc2lvbiBUVkYtODUzMU1GCit0dW5lcj01OCAtIFltZWMgVFZpc2lvbiBUVkYtODUzMU1GLzg4MzFNRi84NzMxTUYKIHR1bmVyPTU5IC0gWW1lYyBUVmlzaW9uIFRWRi01NTMzTUYKIHR1bmVyPTYwIC0gVGhvbXNvbiBERFQgNzYxMSAoQVRTQy9OVFNDKQordHVuZXI9NjEgLSBUZW5hIFRORjk1MzMtRC9JRi9UTkY5NTMzLUIvREYKK3R1bmVyPTYyIC0gUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8KK3R1bmVyPTYzIC0gUGhpbGlwcyBGTUQxMjE2TUUgTUszIEh5YnJpZCBUdW5lcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLnNhYTcxMzQKaW5kZXggMWE0NDZjNi4uMWY3ODhlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5zYWE3MTM0CkBAIC01Nyw2ICs1NywxNSBAQAogIC0gMjQuNTc2TUh6IC0+IC5hdWRpb19jbG9jaz0weDIwMDAwMAogKHh0YWwgKiAuYXVkaW9fY2xvY2sgPSA1MTUzOTYwMCkKIAorU29tZSBkZXRhaWxzIGFib3V0IDMwLzM0LzM1OgorCisgLSBzYWE3MTMwIC0gbG93LXByaWNlIGNoaXAsIGRvZXNuJ3QgaGF2ZSBtdXRlLCB0aGF0IGlzIHdoeSBhbGwgdGhvc2UKKyBjYXJkcyBzaG91bGQgaGF2ZSAubXV0ZSBmaWVsZCBkZWZpbmVkIGluIHRoZWlyIHR1bmVyIHN0cnVjdHVyZS4KKworIC0gc2FhNzEzNCAtIHVzdWFsIGNoaXAKKworIC0gc2FhNzEzMy8zNSAtIHNhYTcxMzUgaXMgcHJvYmFibHkgYSBtYXJrZXRpbmcgZGVjaXNpb24sIHNpbmNlIGFsbCB0aG9zZQorIGNoaXBzIGlkZW50aWZpZXMgaXRzZWxmIGFzIDMzIG9uIHBjaS4KIAogQ3JlZGl0cwogPT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NhcmRzIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NhcmRzCmluZGV4IDdmOGM3ZWIuLjhmMTk0MWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DYXJkcworKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMKQEAgLTIwLDcgKzIwLDcgQEAKIGRlY29kZXJzLCBFRVBST01zLCB0ZWxldGV4dCBkZWNvZGVycyAuLi4KIAogCi1VbnN1cHBvcnRlZCBDYXJkczogCitVbnN1cHBvcnRlZCBDYXJkczoKIC0tLS0tLS0tLS0tLS0tLS0tLQogCiBDYXJkcyB3aXRoIFpvcmFuIChaUikgb3IgUGhpbGlwcyAoU0FBKSBvciBJU0EgYXJlIG5vdCBzdXBwb3J0ZWQgYnkKQEAgLTUwLDExICs1MCwxMSBAQAogTWlyby9QaW5uYWNsZSBQQ1RWCiAtLS0tLS0tLS0tLS0tLS0tLS0KIAotLSBCdDg0OCAKLSAgc29tZSAoYWxsPz8pIGNvbWUgd2l0aCAyIGNyeXN0YWxzIGZvciBQQUwvU0VDQU0gYW5kIE5UU0MgCistIEJ0ODQ4CisgIHNvbWUgKGFsbD8/KSBjb21lIHdpdGggMiBjcnlzdGFscyBmb3IgUEFML1NFQ0FNIGFuZCBOVFNDCiAtIFBBTCwgU0VDQU0gb3IgTlRTQyBUViB0dW5lciAoUGhpbGlwcyBvciBURU1JQykKIC0gTVNQMzR4eCBzb3VuZCBkZWNvZGVyIG9uIGFkZCBvbiBib2FyZAotICBkZWNvZGVyIGlzIHN1cHBvcnRlZCBidXQgQUZBSUsgZG9lcyBub3QgeWV0IHdvcmsgCisgIGRlY29kZXIgaXMgc3VwcG9ydGVkIGJ1dCBBRkFJSyBkb2VzIG5vdCB5ZXQgd29yawogICAob3RoZXIgc291bmQgTVVYIHNldHRpbmcgaW4gR1BJTyBwb3J0IG5lZWRlZD8/PyBzb21lYm9keSB3aG8gZml4ZWQgdGhpcz8/PykKIC0gMSB0dW5lciwgMSBjb21wb3NpdGUgYW5kIDEgUy1WSFMgaW5wdXQKIC0gdHVuZXIgdHlwZSBpcyBhdXRvZGV0ZWN0ZWQKQEAgLTcwLDcgKzcwLDcgQEAKIEhhdXBwYXVnZSBXaW4vVFYgcGNpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIEhhdXBwYXVnZSBjYXJkcyB3aXRoIGRpZmZlcmVudCAKK1RoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgSGF1cHBhdWdlIGNhcmRzIHdpdGggZGlmZmVyZW50CiB0dW5lcnMgKFRWK1JhZGlvIC4uLiksIHRlbGV0ZXh0IGRlY29kZXJzLgogTm90ZSB0aGF0IGV2ZW4gY2FyZHMgd2l0aCBzYW1lIG1vZGVsIG51bWJlcnMgaGF2ZSAoZGVwZW5kaW5nIG9uIHRoZSByZXZpc2lvbikKIGRpZmZlcmVudCBjaGlwcyBvbiBpdC4KQEAgLTgwLDIyICs4MCwyMiBAQAogLSBQQUwsIFNFQ0FNLCBOVFNDIG9yIHR1bmVyIHdpdGggb3Igd2l0aG91dCBSYWRpbyBzdXBwb3J0CiAKIGUuZy46Ci0gIFBBTDogCisgIFBBTDoKICAgVERBNTczNzogVkhGLCBoeXBlcmJhbmQgYW5kIFVIRiBtaXhlci9vc2NpbGxhdG9yIGZvciBUViBhbmQgVkNSIDMtYmFuZCB0dW5lcnMKICAgVFNBNTUyMjogMS40IEdIeiBJMkMtYnVzIGNvbnRyb2xsZWQgc3ludGhlc2l6ZXIsIEkyQyAweGMyLTB4YzMKLSAgCisKICAgTlRTQzoKICAgVERBNTczMTogVkhGLCBoeXBlcmJhbmQgYW5kIFVIRiBtaXhlci9vc2NpbGxhdG9yIGZvciBUViBhbmQgVkNSIDMtYmFuZCB0dW5lcnMKICAgVFNBNTUxODogbm8gZGF0YXNoZWV0IGF2YWlsYWJsZSBvbiBQaGlsaXBzIHNpdGUKLS0gUGhpbGlwcyBTQUE1MjQ2IG9yIFNBQTUyODQgKCBvciBubykgVGVsZXRleHQgZGVjb2RlciBjaGlwCQorLSBQaGlsaXBzIFNBQTUyNDYgb3IgU0FBNTI4NCAoIG9yIG5vKSBUZWxldGV4dCBkZWNvZGVyIGNoaXAKICAgd2l0aCBidWZmZXIgUkFNIChlLmcuIFdpbmJvbmQgVzI0MjU3QVMtMzU6IDMyS3g4IENNT1Mgc3RhdGljIFJBTSkKICAgU0FBNTI0NiAoSTJDIDB4MjIpIGlzIHN1cHBvcnRlZAotLSAyNTYgYnl0ZXMgRUVQUk9NOiBNaWNyb2NoaXAgMjRMQzAyQiBvciBQaGlsaXBzIDg1ODJFMlkgCistIDI1NiBieXRlcyBFRVBST006IE1pY3JvY2hpcCAyNExDMDJCIG9yIFBoaWxpcHMgODU4MkUyWQogICB3aXRoIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KICAgSTJDIGFkZHJlc3MgMHhhMCAoMjRMQzAyQiBhbHNvIHJlc3BvbmRzIHRvIDB4YTItMHhhZikKIC0gMSB0dW5lciwgMSBjb21wb3NpdGUgYW5kIChkZXBlbmRpbmcgb24gbW9kZWwpIDEgUy1WSFMgaW5wdXQKIC0gMTQwNTJCOiBtdXggZm9yIHNlbGVjdGlvbiBvZiBzb3VuZCBzb3VyY2UKLS0gc291bmQgZGVjb2RlcjogVERBOTgwMCwgTVNQMzR4eCAoc3RlcmVvIGNhcmRzKSAKKy0gc291bmQgZGVjb2RlcjogVERBOTgwMCwgTVNQMzR4eCAoc3RlcmVvIGNhcmRzKQogCiAKIEFza2V5IENQSC1TZXJpZXMKQEAgLTEwOCwxNyArMTA4LDE3IEBACiAgICAgQ1BIMDV4OiBCVDg3OCB3aXRoIEZNCiAgICAgQ1BIMDZ4OiBCVDg3OCAody9vIEZNKQogICAgIENQSDA3eDogQlQ4NzggY2FwdHVyZSBvbmx5Ci0gCisKICAgVFYgc3RhbmRhcmRzOgogICAgICBDUEgweDA6IE5UU0MtTS9NCiAgICAgIENQSDB4MTogUEFMLUIvRwogICAgICBDUEgweDI6IFBBTC1JL0kKICAgICAgQ1BIMHgzOiBQQUwtRC9LCi0gICAgIENQSDB4NDogU0VDQU0tTC9MIAotICAgICBDUEgweDU6IFNFQ0FNLUIvRyAKLSAgICAgQ1BIMHg2OiBTRUNBTS1EL0sgCi0gICAgIENQSDB4NzogUEFMLU4vTiAKLSAgICAgQ1BIMHg4OiBQQUwtQi9IIAorICAgICBDUEgweDQ6IFNFQ0FNLUwvTAorICAgICBDUEgweDU6IFNFQ0FNLUIvRworICAgICBDUEgweDY6IFNFQ0FNLUQvSworICAgICBDUEgweDc6IFBBTC1OL04KKyAgICAgQ1BIMHg4OiBQQUwtQi9ICiAgICAgIENQSDB4OTogUEFMLU0vTQogCiAgIENQSDAzeCB3YXMgb2Z0ZW4gc29sZCBhcyAiVFYgY2FwdHVyZXIiLgpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAiVGhlIEZseVZpZGVvMjAwMCBhbmQgRmx5VmlkZW8yMDAwcyBwcm9kdWN0IG5hbWUgaGF2ZSByZW5hbWVkIHRvIEZseVZpZGVvOTguIgogICAgICAgVGhlaXIgQnQ4eDggY2FyZHMgYXJlIGxpc3RlZCBhcyBkaXNjb250aW51ZWQuCiAgICAgICBGbHl2aWRlbyAyMDAwUyB3YXMgcHJvYmFibHkgc29sZCBhcyBGbHl2aWRlbyAzMDAwIGluIHNvbWUgY29udHJpZXMoRXVyb3BlPykuCi0gICAgICBUaGUgbmV3IEZseXZpZGVvIDIwMDAvMzAwMCBhcmUgU0FBNzEzMC9TQUE3MTM0IGJhc2VkLiAKKyAgICAgIFRoZSBuZXcgRmx5dmlkZW8gMjAwMC8zMDAwIGFyZSBTQUE3MTMwL1NBQTcxMzQgYmFzZWQuCiAKICAgIkZseXZpZGVvIElJIiBoYWQgYmVlbiB0aGUgbmFtZSBmb3IgdGhlIDg0OCBjYXJkcywgbm93YWRheXMgKGluIEdlcm1hbnkpCiAgIHRoaXMgbmFtZSBpcyByZS11c2VkIGZvciBMUjUwIFJldi5XLgpAQCAtMjM1LDEyICsyMzUsMTIgQEAKICAgIE11bHRpbWVkaWEgVFYgcGFja2FnZXMgKGNhcmQgKyBzb2Z0d2FyZSBwYWNrKToKICAgIFBpeGVsVmlldyBQbGF5IFRWIFRoZWF0ZXIgLSAoTW9kZWw6IFBWLU00MjAwKSA9ICBQaXhlbFZpZXcgUGxheSBUViBwcm8gKyBTb2Z0d2FyZQogICAgUGl4ZWxWaWV3IFBsYXkgVFYgUEFLIC0gICAgIChNb2RlbDogUFYtQlQ4NzhQKyBSRVYgNEUpCi0gICBQaXhlbFZpZXcgUGxheSBUVi9WQ1IgLSAgICAgKE1vZGVsOiBQVi1NMzIwMCBSRVYgNEMgLyA4RCAvIDEwQSApIAorICAgUGl4ZWxWaWV3IFBsYXkgVFYvVkNSIC0gICAgIChNb2RlbDogUFYtTTMyMDAgUkVWIDRDIC8gOEQgLyAxMEEgKQogICAgUGl4ZWxWaWV3IFN0dWRpbyBQQUsgLSAgICAgIChNb2RlbDogICAgTTIyMDAgUkVWIDRDIC8gOEQgLyAxMEEgKQogICAgUGl4ZWxWaWV3IFBvd2VyU3R1ZGlvIFBBSyAtIChNb2RlbDogUFYtTTM2MDAgUkVWIDRFKQogICAgUGl4ZWxWaWV3IERpZ2l0YWxWQ1IgUEFLIC0gIChNb2RlbDogUFYtTTI0MDAgUkVWIDRDIC8gOEQgLyAxMEEgKQogCi0gICBQaXhlbFZpZXcgUGxheVRWIFBBSyBJSSAoVFYvRk0gY2FyZCArIHVzYiBjYW1lcmEpICBQVi1NMzgwMCAKKyAgIFBpeGVsVmlldyBQbGF5VFYgUEFLIElJIChUVi9GTSBjYXJkICsgdXNiIGNhbWVyYSkgIFBWLU0zODAwCiAgICBQaXhlbFZpZXcgUGxheVRWIFhQIFBWLU00NzAwLFBWLU00NzAwKHcvRk0pCiAgICBQaXhlbFZpZXcgUGxheVRWIERWUiBQVi1NNDYwMCAgcGFja2FnZSBjb250ZW50czpQaXhlbFZpZXcgUGxheVRWIHBybywgd2luZHZyICYgdmlkZW9NYWlsIHMvdwogCkBAIC0yNTQsNyArMjU0LDcgQEAKIAogICAgRFRWMzAwMCBQVi1EVFYzMDAwUCsgRFZCLVMgQ0kgPSBUd2luaGFuIFZQLTEwMzAKICAgIERUVjIwMDAgRFZCLVMgPSBUd2luaGFuIFZQLTEwMjAKLSAgIAorCiAgICBWaWRlbyBDb25mZXJlbmNpbmc6CiAgICBQaXhlbFZpZXcgTWVldGluZyBQQUsgLSAoTW9kZWw6IFBWLUJUODc4UCkKICAgIFBpeGVsVmlldyBNZWV0aW5nIFBBSyBMaXRlIC0gKE1vZGVsOiBQVi1CVDg3OFApCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogICAgbmV3ZXIgQ2FyZHMgaGF2ZSBzYWE3MTM0LCBidXQgbW9kZWwgbmFtZSBzdGF5ZWQgdGhlIHNhbWU/CiAKLVByb3ZpZGVvIAorUHJvdmlkZW8KIC0tLS0tLS0tCiAgIFBWOTUxIG9yIFBWLTk1MSAoYWxzbyBhcmUgc29sZCBhczoKICAgIEJvZWRlciBUVi1GTSBWaWRlbyBDYXB0dXJlIENhcmQKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgQVZlclRWCiAgICBBVmVyVFYgU3RlcmVvCiAgICBBVmVyVFYgU3R1ZGlvICh3L0ZNKQotICAgQVZlck1lZGlhIFRWOTggd2l0aCBSZW1vdGUgCisgICBBVmVyTWVkaWEgVFY5OCB3aXRoIFJlbW90ZQogICAgQVZlck1lZGlhIFRWL0ZNOTggU3RlcmVvCiAgICBBVmVyTWVkaWEgVFZDQU05OAogICAgVFZDYXB0dXJlIChCdDg0OCkKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgKDEpIERhdWdodGVyYm9hcmQgTUI2OC1BIHdpdGggVERBOTgyMFQgYW5kIFREQTk4NDBUCiAgICAoMikgU29ueSBORTQxUyBzb2xkZXJlZCAoc3RlcmVvIHNvdW5kPykKICAgICgzKSBEYXVnaHRlcmJvYXJkIE0xMTgtQSB3LyBwaWMgMTZjNTQgYW5kIDQgTUh6IHF1YXJ0egotIAorCiAgICBVUyBzaXRlIGhhcyBkaWZmZXJlbnQgZHJpdmVycyBmb3IgKGFzIG9mIDA5LzIwMDIpOgogICAgRVogQ2FwdHVyZS9JbnRlckNhbSBQQ0kgKEJULTg0OCBjaGlwKQogICAgRVogQ2FwdHVyZS9JbnRlckNhbSBQQ0kgKEJULTg3OCBjaGlwKQpAQCAtNDM3LDcgKzQzNyw3IEBACiAgICBUZXJyYSBUVmFsdWVSYWRpbywgICAgICAgICAgICAgIkxSMTAyIFJldi5DIiBwcmludGVkIG9uIHRoZSBQQ0IKICAgIFRlcnJhIFRWL1JhZGlvKyBWZXJzaW9uIDEuMCwgICAiODAtQ1AyODMwMTAwLTAiIFRUVFYzIHByaW50ZWQgb24gdGhlIFBDQiwKIAkJCQkgICAgICJDUEgwMTAtRTgzIiBvbiB0aGUgYmFjaywgU0FBNjU4OFQsIFREQTk4NzNICi0gICBUZXJyYSBUVmFsdWUgVmVyc2lvbiBCVDg3OCwgICAgIjgwLUNQMjgzMDExMC0wIFRUVFY0IiBwcmludGVkIG9uIHRoZSBQQ0IsIAorICAgVGVycmEgVFZhbHVlIFZlcnNpb24gQlQ4NzgsICAgICI4MC1DUDI4MzAxMTAtMCBUVFRWNCIgcHJpbnRlZCBvbiB0aGUgUENCLAogCQkJCSAgICAgIkNQSDAxMS1EODMiIG9uIGJhY2sKICAgIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIDEuMCAgICAgICAiY2ViMTA1LlBDQiIgKHJlYWxseSBpZGVudGljYWwgdG8gVGVycmEgVFYrIFZlcnNpb24gMS4wKQogICAgVGVycmEgVFZhbHVlIE5ldyBSZXZpc2lvbgkgICJMUjEwMiBSZWMuQyIKQEAgLTUyOCw3ICs1MjgsNyBAQAogICAgS1ctNjA2UlNGCiAgICBLVy02MDdBIChjYXB0dXJlIG9ubHkpCiAgICBLVy02MDggKFpvcmFuIGNhcHR1cmUgb25seSkKLSAKKwogSU9EQVRBIChqcCkKIC0tLS0tLQogICAgR1YtQkNUVi9QQ0kKQEAgLTU0MiwxNSArNTQyLDE1IEBACiAtLS0tLS0tCiAgICBXaW5EVlIJPSBLd29ybGQgIktXLVRWTDg3OFJGIgogCi13d3cuc2lnbWFjb20uY28ua3IgCit3d3cuc2lnbWFjb20uY28ua3IKIC0tLS0tLS0tLS0tLS0tLS0tLQotICAgU2lnbWEgQ3liZXIgVFYgSUkgCisgICBTaWdtYSBDeWJlciBUViBJSQogCiB3d3cuc2FzZW0uY28ua3IKIC0tLS0tLS0tLS0tLS0tLQogICAgTGl0dGUgT25BaXIgVFYKIAotaGFtYSAKK2hhbWEKIC0tLS0KICAgIFRWL1JhZGlvLVR1bmVyIENhcmQsIFBDSSAoTW9kZWwgNDQ2NzcpID0gQ1BIMDUxCiAKQEAgLTYzOCw3ICs2MzgsNyBAQAogCiBKZXR3YXkgKHd3dy5qZXR3YXkuY29tLnR3KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIEpXLVRWIDg3OE0gCisgICBKVy1UViA4NzhNCiAgICBKVy1UViA4NzggID0gS1dvcmxkIEtXLVRWODc4UkYKIAogR2FsYXhpcwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgIDgwOSBNeVZpZGVvCiAgIDg3MiBNeVRWMkdvIEZNCiAKLSAKKwogICA1NDYgV2luVFYgTm92YS1TIENJCiAgIDU0MyBXaW5UViBOb3ZhCiAgIDkwNyBOb3ZhLVMgVVNCCkBAIC03MzksNyArNzM5LDcgQEAKICAgODMyIE15VFYyR28KICAgODY5IE15VFYyR28tRk0KICAgODA1IE15VmlkZW8gKFVTQikKLSAgCisKIAogTWF0cml4LVZpc2lvbgogLS0tLS0tLS0tLS0tLQpAQCAtNzY0LDcgKzc2NCw3IEBACiAgICBJbnRlcnZpc2lvbiBJVi01NTAgKGJ0OHg4KQogICAgSW50ZXJ2aXNpb24gSVYtMTAwICh6b3JhbikKICAgIEludGVydmlzaW9uIElWLTEwMDAgKGJ0OHg4KQotICAgCisKIEFzb25pYyAod3d3LmFzb25pYy5jb20uY24pICh3ZWJzaXRlIGRvd24pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2t5RXllIHR2IDg3OApAQCAtODA0LDExICs4MDQsMTEgQEAKIAogSlRULyBKdXN0eSBDb3JwLmh0dHA6Ly93d3cuanVzdHkuY28uanAvICh3d3cuanR0LmNvbS5qcCB3ZWJzaXRlIGRvd24pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIEpUVC0wMiAoSlRUIFRWKSAiVFYgd2F0Y2htYXRlIHBybyIgKGJ0ODQ4KSAKKyAgIEpUVC0wMiAoSlRUIFRWKSAiVFYgd2F0Y2htYXRlIHBybyIgKGJ0ODQ4KQogCiBBRFMgd3d3LmFkc3RlY2guY29tCiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBDaGFubmVsIFN1cmZlciBUViAoIENIWC05NTAgKSAKKyAgIENoYW5uZWwgU3VyZmVyIFRWICggQ0hYLTk1MCApCiAgICBDaGFubmVsIFN1cmZlciBUVitGTSAoIENIWC05NjBGTSApCiAKIEFWRUMgd3d3LnByb2NoaXBzLmNvbQpAQCAtODc0LDcgKzg3NCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZhbGNvbiBTZXJpZXMgKGNhcHR1cmUgb25seSkKICBJbiBVU0E6IGh0dHA6Ly93d3cudGhlaW1hZ2luZ3NvdXJjZS5jb20vCi0gICBERkcvTEMxCQorICAgREZHL0xDMQogCiB3d3cuc2tuZXQtd2ViLmNvLmpwCiAtLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04OTAsNyArODkwLDcgQEAKICAgIEN5YmVyTWFpbCBYdHJlbWUKICAgVGhlc2UgYXJlIEZseXZpZGVvCiAKLVZDUiAoaHR0cDovL3d3dy52Y3JpbmMuY29tLykgCitWQ1IgKGh0dHA6Ly93d3cudmNyaW5jLmNvbS8pCiAtLS0KICAgVmlkZW8gQ2F0Y2hlciAxNgogCkBAIC05MjAsNyArOTIwLDcgQEAKICAgICBTREkgU2lsayAyMDAgU0RJIElucHV0IENhcmQKIAogd3d3LmV1cmVzeXMuY29tCi0gICAgUElDT0xPIHNlcmllcyAKKyAgICBQSUNPTE8gc2VyaWVzCiAKIFBNQy9QYWNlCiB3d3cucGFjZWNvbS5jby51ayB3ZWJzaXRlIGNsb3NlZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ub3QtaW4tY3gyMzg4eC1kYXRhc2hlZXQudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ub3QtaW4tY3gyMzg4eC1kYXRhc2hlZXQudHh0CmluZGV4IDk2YjYzOGIuLmVkYmZlNzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbm90LWluLWN4MjM4OHgtZGF0YXNoZWV0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L25vdC1pbi1jeDIzODh4LWRhdGFzaGVldC50eHQKQEAgLTM0LDQgKzM0LDggQEAKICAgMjogSEFDVEVYVAogICAxOiBIU0ZNVAogCisweDQ3IGlzIHRoZSBzeW5jIGJ5dGUgZm9yIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtIHBhY2tldHMuCitEYXRhc2hlZXQgaW5jb3JyZWN0bHkgc3RhdGVzIHRvIHVzZSA0NyBkZWNpbWFsLiAxODggaXMgdGhlIGxlbmd0aC4KK0FsbCBEVkIgY29tcGxpYW50IGZyb250ZW5kcyBvdXRwdXQgcGFja2V0cyB3aXRoIHRoaXMgc3RhcnQgY29kZS4KKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGEwYjBkNTkuLjQ4YWE2ZDMgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0zNzAsNiArMzcwLDEwIEBACiBXOglodHRwOi8vYXRtZWx3bGFuZHJpdmVyLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKIAorQVVESVQgU1VCU1lTVEVNCitMOglsaW51eC1hdWRpdEByZWRoYXQuY29tIChzdWJzY3JpYmVycy1vbmx5KQorUzoJTWFpbnRhaW5lZAorCiBBWC4yNSBORVRXT1JLIExBWUVSCiBQOglSYWxmIEJhZWNobGUKIE06CXJhbGZAbGludXgtbWlwcy5vcmcKQEAgLTUxMiwxMSArNTE2LDExIEBACiBTOglTdXBwb3J0ZWQKIAogQlRUViBWSURFTzRMSU5VWCBEUklWRVIKLVA6CUdlcmQgS25vcnIKLU06CWtyYXhlbEBieXRlc2V4Lm9yZworUDoJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiCitNOgltY2hlaGFiQGJydHVyYm8uY29tLmJyCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KLVc6CWh0dHA6Ly9ieXRlc2V4Lm9yZy9idHR2LwotUzoJT3JwaGFuCitXOglodHRwOi8vbGludXh0di5vcmcKK1M6CU1haW50YWluZWQKIAogQlVTTE9HSUMgU0NTSSBEUklWRVIKIFA6CUxlb25hcmQgTi4gWnVia29mZgpAQCAtMTE0OSw3ICsxMTUzLDcgQEAKIAogSU5GSU5JQkFORCBTVUJTWVNURU0KIFA6CVJvbGFuZCBEcmVpZXIKLU06CXJvbGFuZEB0b3BzcGluLmNvbQorTToJcm9sYW5kZEBjaXNjby5jb20KIFA6CVNlYW4gSGVmdHkKIE06CW1zaGVmdHlAaWNoaXBzLmludGVsLmNvbQogUDoJSGFsIFJvc2Vuc3RvY2sKQEAgLTExNjUsNiArMTE2OSwxMiBAQAogTDoJbGludXgtam95c3RpY2tAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6CiBTOglNYWludGFpbmVkCiAKK0lOT1RJRlkKK1A6CUpvaG4gTWNDdXRjaGFuIGFuZCBSb2JlcnQgTG92ZQorTToJdHRiQHRlbnRhY2xlLmRocy5vcmcgYW5kIHJtbEBub3ZlbGwuY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKIElOVEVMIDgxMC84MTUgRlJBTUVCVUZGRVIgRFJJVkVSCiBQOiAgICAgIEFudG9uaW5vIERhcGxhcwogTTogICAgICBhZGFwbGFzQHBvbC5uZXQKQEAgLTEyMzYsNyArMTI0Niw3IEBACiAKIElSREEgU1VCU1lTVEVNCiBQOglKZWFuIFRvdXJyaWxoZXMKLUw6CWlyZGEtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0CitMOglpcmRhLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKIFc6CWh0dHA6Ly9pcmRhLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKIApAQCAtMTgwMyw4ICsxODEzLDkgQEAKIFM6CU1haW50YWluZWQKIAogUENNQ0lBIFNVQlNZU1RFTQorUDoJTGludXggUENNQ0lBIFRlYW0KIEw6CWh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGNtY2lhCi1TOglVbm1haW50YWluZWQKK1M6CU1haW50YWluZWQKIAogUENORVQzMiBORVRXT1JLIERSSVZFUgogUDoJVGhvbWFzIEJvZ2VuZPZyZmVyCkBAIC0yMTYxLDcgKzIxNzIsNyBAQAogUDoJRGF2aWQgUy4gTWlsbGVyCiBNOglkYXZlbUBkYXZlbWxvZnQubmV0CiBQOglFZGRpZSBDLiBEb3N0Ci1NOgllY2RAc2t5bmV0LmJlCitNOgllY2RAYnJhaW5haWQuZGUKIFA6CUpha3ViIEplbGluZWsKIE06CWpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3oKIFA6CUFudG9uIEJsYW5jaGFyZApAQCAtMjQxNSw2ICsyNDI2LDEyIEBACiBMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKK1VTQiBPUFRJT04tQ0FSRCBEUklWRVIKK1A6CU1hdHRoaWFzIFVybGljaHMKK006CXNtdXJmQHNtdXJmLm5vcmlzLmRlCitMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitTOglNYWludGFpbmVkCisKIFVTQiBPVjUxMSBEUklWRVIKIFA6CU1hcmsgTWNDbGVsbGFuZAogTToJbW1jY2xlbGxAYmlnZm9vdC5jb20KQEAgLTI2MjUsMTAgKzI2NDIsMTEgQEAKIFM6CU1haW50YWluZWQKIAogVklERU8gRk9SIExJTlVYCi1QOglHZXJkIEtub3JyCi1NOglrcmF4ZWxAYnl0ZXNleC5vcmcKK1A6CU1hdXJvIENhcnZhbGhvIENoZWhhYgorTToJbWNoZWhhYkBicnR1cmJvLmNvbS5icgogTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCi1TOglPcnBoYW4KK1c6CWh0dHA6Ly9saW51eHR2Lm9yZworUzoJTWFpbnRhaW5lZAogCiBXMSBEQUxMQVMnUyAxLVdJUkUgQlVTCiBQOglFdmdlbml5IFBvbHlha292CmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDFmZGFjZTcuLmNmMzRhNmIgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2Ci1TVUJMRVZFTCA9IDEyCi1FWFRSQVZFUlNJT04gPQorU1VCTEVWRUwgPSAxMworRVhUUkFWRVJTSU9OID0tcmMzCiBOQU1FPVdvb3p5IE51bWJhdAogCiAjICpET0NVTUVOVEFUSU9OKgpAQCAtNzkyLDYgKzc5Miw5IEBACiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChARCkgJEAKICUubzogJS5jIHNjcmlwdHMgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKEBEKSAkQAorJS5rbzogc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgJChidWlsZCk9JChARCkgJChAOi5rbz0ubykKKwkkKFEpJChNQUtFKSAtclIgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKICUvOiAgICAgIHNjcmlwdHMgcHJlcGFyZSBGT1JDRQogCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgJChidWlsZCk9JChARCkKICUubHN0OiAlLmMgc2NyaXB0cyBGT1JDRQpAQCAtMTAzMyw2ICsxMDM2LDcgQEAKIAlAZWNobyAgJyAgbW9kdWxlc19pbnN0YWxsIC0gSW5zdGFsbCBhbGwgbW9kdWxlcycKIAlAZWNobyAgJyAgZGlyLyAgICAgICAgICAgIC0gQnVpbGQgYWxsIGZpbGVzIGluIGRpciBhbmQgYmVsb3cnCiAJQGVjaG8gICcgIGRpci9maWxlLltvaXNdICAtIEJ1aWxkIHNwZWNpZmllZCB0YXJnZXQgb25seScKKwlAZWNobyAgJyAgZGlyL2ZpbGUua28gICAgIC0gQnVpbGQgbW9kdWxlIGluY2x1ZGluZyBmaW5hbCBsaW5rJwogCUBlY2hvICAnICBycG0JCSAgLSBCdWlsZCBhIGtlcm5lbCBhcyBhbiBSUE0gcGFja2FnZScKIAlAZWNobyAgJyAgdGFncy9UQUdTCSAgLSBHZW5lcmF0ZSB0YWdzIGZpbGUgZm9yIGVkaXRvcnMnCiAJQGVjaG8gICcgIGNzY29wZQkgIC0gR2VuZXJhdGUgY3Njb3BlIGluZGV4JwpAQCAtMTE0OSw3ICsxMTUzLDcgQEAKICMod2hpY2ggaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UgSU1ITykgdG8gYXZvaWQgdW5uZWVkZWQgY2x1dHRlciBpbiB0aGUgYmlnIHRhZ3MgZmlsZS4KICNBZGRpbmcgJChzcmN0cmVlKSBhZGRzIGFib3V0IDIwTSBvbiBpMzg2IHRvIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZmlsZSEKIAotaWZlcSAoJChLQlVJTERfT1VUUFVUKSwpCitpZmVxICgkKHNyYyksJChvYmopKQogX19zcmN0cmVlID0KIGVsc2UKIF9fc3JjdHJlZSA9ICQoc3JjdHJlZSkvCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL0tjb25maWcgYi9hcmNoL2FscGhhL0tjb25maWcKaW5kZXggYzU3MzlkNi4uMDgzYzVkZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9LY29uZmlnCisrKyBiL2FyY2gvYWxwaGEvS2NvbmZpZwpAQCAtNTk2LDYgKzU5Niw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2lycV9hbHBoYS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKaW5kZXggZTZkZWQzMy4uOWQzNGNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKQEAgLTU1LDYgKzU1LDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJICB7CiAJCWxvbmcgY3B1OworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCXNtcF9wZXJjcHVfdGltZXJfaW50ZXJydXB0KHJlZ3MpOwogCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCWlmIChjcHUgIT0gYm9vdF9jcHVpZCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKaW5kZXggZmQ3YmQxNy4uNmY1MDlhNiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbm8sIGNvZGU7CiAKLQlpZiAocmVncy0+cHMgPT0gMCkgeworCWlmICgocmVncy0+cHMgJiB+SVBMX01BWCkgPT0gMCkgewogCQlpZiAodHlwZSA9PSAxKSB7CiAJCQljb25zdCB1bnNpZ25lZCBpbnQgKmRhdGEKIAkJCSAgPSAoY29uc3QgdW5zaWduZWQgaW50ICopIHJlZ3MtPnBjOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggYzhkOTRkYy4uN2JjNGE1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0yMjMsNyArMjIzLDkgQEAKIAogc291cmNlICJhcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnIgorc291cmNlICJhcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyIKKworc291cmNlICJhcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWciCiAKQEAgLTM2MSw2ICszNjMsMTEgQEAKIAkgIEFsdGVybmF0aXZlbHksIGlmIHlvdSB3YW50IGR5bmFtaWMgdGljayBhdXRvbWF0aWNhbGx5IGVuYWJsZWQKIAkgIGR1cmluZyBib290LCBwYXNzICJkeW50aWNrPWVuYWJsZSIgdmlhIHRoZSBrZXJuZWwgY29tbWFuZCBzdHJpbmcuCiAKKwkgIFBsZWFzZSBub3RlIHRoYXQgZHluYW1pYyB0aWNrIG1heSBhZmZlY3QgdGhlIGFjY3VyYWN5IG9mCisJICB0aW1la2VlcGluZyBvbiBzb21lIHBsYXRmb3JtcyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorCSAgQ3VycmVudGx5IGF0IGxlYXN0IE9NQVAgcGxhdGZvcm0gaXMga25vd24gdG8gaGF2ZSBhY2N1cmF0ZQorCSAgdGltZWtlZXBpbmcgd2l0aCBkeW5hbWljIHRpY2suCisKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlib29sCiAJZGVmYXVsdCAoQVJDSF9MSDdBNDBYICYmICFMSDdBNDBYX0NPTlRJR01FTSkKQEAgLTUwOSw3ICs1MTYsNyBAQAogCiBlbmRtZW51CiAKLWlmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IpCitpZiAoQVJDSF9TQTExMDAgfHwgQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfT01BUDEpCiAKIG1lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKIApAQCAtNjkzLDYgKzcwMCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogbWVudSAiRGV2aWNlIERyaXZlcnMiCiAKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCkBAIC03MjUsNyArNzM0LDcgQEAKIAogc291cmNlICJkcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL0tjb25maWciCiAKQEAgLTczNyw2ICs3NDYsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgorCiAjc291cmNlICJkcml2ZXJzL2wzL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9taXNjL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDgzMzA0OTUuLjY3ZjE0NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC01Niw3ICs1Niw3IEBACiB0dW5lLSQoQ09ORklHX0NQVV9WNikJCTo9LW10dW5lPXN0cm9uZ2FybQogCiAjIE5lZWQgLVVhcm0gZm9yIGdjYyA8IDMueAotQ0ZMQUdTX0FCSQk6PSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorQ0ZMQUdTX0FCSQk6PSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKIENGTEFHUwkJKz0kKENGTEFHU19BQkkpICQoYXJjaC15KSAkKHR1bmUteSkgJChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKSAtbXNvZnQtZmxvYXQgLVVhcm0KIEFGTEFHUwkJKz0kKENGTEFHU19BQkkpICQoYXJjaC15KSAkKHR1bmUteSkgLW1zb2Z0LWZsb2F0CiAKQEAgLTkxLDcgKzkxLDggQEAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QM1hYKQkgICA6PSBpb3AzeHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQNFhYKQkgICA6PSBpeHA0eHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQMjAwMCkgICAgOj0gaXhwMjAwMAotIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVAxKQkgICA6PSBvbWFwMQorICBpbmNkaXItJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1MzQzI0MTApCSAgIDo9IHMzYzI0MTAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTEg3QTQwWCkJICAgOj0gbGg3YTQweAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9WRVJTQVRJTEUpICA6PSB2ZXJzYXRpbGUKQEAgLTE0Miw2ICsxNDMsOSBAQAogY29yZS0kKENPTkZJR19GUEVfRkFTVEZQRSkJKz0gJChGQVNURlBFX09CSikKIGNvcmUtJChDT05GSUdfVkZQKQkJKz0gYXJjaC9hcm0vdmZwLwogCisjIElmIHdlIGhhdmUgYSBjb21tb24gcGxhdGZvcm0gZGlyZWN0b3J5LCB0aGVuIGluY2x1ZGUgaXQgaW4gdGhlIGJ1aWxkLgorY29yZS0kKENPTkZJR19BUkNIX09NQVApCSs9IGFyY2gvYXJtL3BsYXQtb21hcC8KKwogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkgICAgICArPSBhcmNoL2FybS9vcHJvZmlsZS8KIGRyaXZlcnMtJChDT05GSUdfQVJDSF9DTFBTNzUwMCkJKz0gZHJpdmVycy9hY29ybi9jaGFyLwogZHJpdmVycy0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBkcml2ZXJzL2Fjb3JuL2NoYXIvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFyay5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2hhcmsuUwppbmRleCA4NDhmNjBlLi4wODljNTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFyay5TCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJrLlMKQEAgLTYzLDggKzYzLDggQEAKIAogCQltb3YJcGMsIHIyCiAKLV9fY29weV90YXJnZXQ6CS5sb25nCTB4MDg1MDgwMDAKLV9fY29weV9lbmQ6CS5sb25nCTB4MDg2MDgwMDAKK19fY29weV90YXJnZXQ6CS5sb25nCTB4MDg1MDdGRkMKK19fY29weV9lbmQ6CS5sb25nCTB4MDg2MDdGRkMKIAkJCiAJCS53b3JkCV9zdGFydAogCQkud29yZAlfX2Jzc19zdGFydApAQCAtNzMsOSArNzMsMTAgQEAKIF9fdGVtcF9zdGFjazoJLnNwYWNlIDEyOAogCiBfX21tdV9vZmY6Ci0JCWFkcglyMCwgX19vZndfZGF0YQorCQlhZHIJcjAsIF9fb2Z3X2RhdGEJCQlAIHJlYWQgdGhlIDEuIGVudHJ5IG9mIHRoZSBtZW1vcnkgbWFwCiAJCWxkcglyMCwgW3IwLCAjNF0KIAkJb3JyCXIwLCByMCwgIzB4MDA2MDAwMDAKKwkJc3ViCXIwLCByMCwgIzQKIAkKIAkJbGRyCXIxLCBfX2NvcHlfZW5kCiAJCWxkcglyMywgX19jb3B5X3RhcmdldApAQCAtODksMjAgKzkwLDQzIEBACiAgKiBmcm9tIDB4MDg1MDAwMDAgdG8gMHgwODUwODAwMCBpZiB3ZSBoYXZlIG9ubHkgOE1CCiAgKi8KIAorLyogQXMgd2UgZ2V0IG1vcmUgMi42LWtlcm5lbHMgaXQgZ2V0cyBtb3JlIGFuZCBtb3JlCisgKiB1bmNvbWZvcnRhYmxlIHRvIGJlIGJvdW5kIHRvIGtlcm5lbCBpbWFnZXMgb2YgMU1CIG9ubHkuCisgKiBTbyB3ZSBhZGQgYSBsb29wIGhlcmUsIHRvIGJlIGFibGUgdG8gY29weSBzb21lIG1vcmUuCisgKiBBbGV4YW5kZXIgU2NodWx6IDIwMDUtMDctMTcKKyAqLworCisJCW1vdglyNCwgIzMJCQkJQCBIb3cgbWFueSBtZWdhYnl0ZXMgdG8gY29weQorCisKK19fTW92ZUNvZGU6CXN1YglyNCwgcjQsICMxCiAJCiBfX0NvcHk6CQlsZHIJcjIsIFtyMF0sICMtNAogCQlzdHIJcjIsIFtyMV0sICMtNAogCQl0ZXEJcjEsIHIzCiAJCWJuZQlfX0NvcHkKKworCQkvKiBUaGUgZmlybXdhcmUgbWFwcyB1cyBpbiBibG9ja3Mgb2YgMSBNQiwgdGhlIG5leHQgYmxvY2sgaXMKKwkJICAgX2JlbG93XyB0aGUgbGFzdCBvbmUuIFNvIG91ciBkZWNyZW1lbnRpbmcgc291cmNlIHBvaW50ZXIKKwkJICAgaXN0IHJpZ2h0IGhlcmUsIGJ1dCB0aGUgZGVzdGluYXRpb24gcG9pbnRlciBtdXN0IGJlIGluY3JlYXNlZAorCQkgICBieSAyIE1CICovCisJCWFkZAlyMSwgcjEsICMweDAwMjAwMDAwCisJCWFkZAlyMywgcjMsICMweDAwMTAwMDAwCisKKwkJdGVxCXI0LCAjMAorCQlibmUJX19Nb3ZlQ29kZQorCisKIAkJLyogYW5kIGp1bXAgdG8gaXQgKi8KLQkJYWRyCXIyLCBfX2dvX29uCi0JCWFkcglyMCwgX19vZndfZGF0YQorCQlhZHIJcjIsIF9fZ29fb24JCQlAIHdoZXJlIHdlIHdhbnQgdG8ganVtcAorCQlhZHIJcjAsIF9fb2Z3X2RhdGEJCQlAIHJlYWQgdGhlIDEuIGVudHJ5IG9mIHRoZSBtZW1vcnkgbWFwCiAJCWxkcglyMCwgW3IwLCAjNF0KLQkJc3ViCXIyLCByMiwgcjAKLQkJc3ViCXIyLCByMiwgIzB4MDA1MDAwMDAKLQkJbGRyCXIwLCBfX2NvcHlfdGFyZ2V0CisJCXN1YglyMiwgcjIsIHIwCQkJQCB3ZSBhcmUgbWFwcGVkIGFkZCAwZTUwIG5vdywgc3ViIHRoYXQgKC0wZTAwKQorCQlzdWIJcjIsIHIyLCAjMHgwMDUwMDAwMAkJQCAtMDA1MAorCQlsZHIJcjAsIF9fY29weV90YXJnZXQJCUAgYW5kIGFkZCAwODUwIDgwMDAgaW5zdGVhZAorCQlhZGQJcjAsIHIwLCAjNAogCQlhZGQJcjIsIHIyLCByMAotCQltb3YJcGMsIHIyCisJCW1vdglwYywgcjIJCQkJQCBhbmQganVtcCB0aGVyZQogCiBfX2dvX29uOgogCQlhZHIJc3AsIF9fdGVtcF9zdGFjawpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9iYXN0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcKaW5kZXggMmQ5ODVlOS4uMzVlM2E5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9iYXN0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2Jhc3RfZGVmY29uZmlnCkBAIC01NjEsNyArNTYxLDYgQEAKICMKIENPTkZJR19TRVJJQUxfUzNDMjQxMD15CiBDT05GSUdfU0VSSUFMX1MzQzI0MTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX0JBU1RfU0lPPXkKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CiBDT05GSUdfVU5JWDk4X1BUWVM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKaW5kZXggYjhjNTFlZS4uZjY3Y2EwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDYKLSMgU2F0IEp1biAyNSAwMDo1NzoyOSAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIFRodSBKdWwgIDcgMTY6NDE6MjEgMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKQEAgLTEzNyw2ICsxMzcsNyBAQAogIwogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKQEAgLTM0NSwxMCArMzQ2LDkgQEAKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQpAQCAtMzYzLDE3ICszNjMsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotCi0jCi0jIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKLSMKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KLUNPTkZJR19UQ1BfQ09OR19IVENQPW0KLSMgQ09ORklHX1RDUF9DT05HX0hTVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1ZFR0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtOTMxLDQgKzkyMiwzIEBACiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKLSMgQ09ORklHX1RFWFRTRUFSQ0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZwppbmRleCAzY2ZiZTJlLi41YzZjOTI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1naXQ2Ci0jIFNhdCBKdW4gMjUgMDA6NTg6MzggMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjAxIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMzgsNiArMTM4LDcgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CkBAIC0zNDYsMTAgKzM0Nyw5IEBACiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM2NCwxNyArMzY0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLQotIwotIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCi0jCisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQklDPXkKLUNPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCi1DT05GSUdfVENQX0NPTkdfSFRDUD1tCi0jIENPTkZJR19UQ1BfQ09OR19IU1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19IWUJMQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19WRUdBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTkzMiw0ICs5MjMsMyBAQAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1pMSUJfREVGTEFURT15Ci0jIENPTkZJR19URVhUU0VBUkNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcKaW5kZXggNWM4N2U4ZS4uNmRjNDBmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItZ2l0NgotIyBTYXQgSnVuIDI1IDAwOjU5OjM1IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzIKKyMgVGh1IEp1bCAgNyAxNjo0OTowOCAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQpAQCAtMTM4LDYgKzEzOCw3IEBACiAjCiAjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMzQ2LDEwICszNDcsOSBAQAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CkBAIC0zNjQsMTcgKzM2NCw4IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSVBfVENQRElBRz15CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotCi0jCi0jIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKLSMKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KLUNPTkZJR19UQ1BfQ09OR19IVENQPW0KLSMgQ09ORklHX1RDUF9DT05HX0hTVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1ZFR0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtOTMzLDQgKzkyNCwzIEBACiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKLSMgQ09ORklHX1RFWFRTRUFSQ0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAwX2RlZmNvbmZpZwppbmRleCAzY2I1NjFhLi5kMmJiMGI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1naXQ2Ci0jIFNhdCBKdW4gMjUgMDE6MDA6MjcgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjIwIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMzgsNiArMTM4LDcgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CkBAIC0zNDYsMTAgKzM0Nyw5IEBACiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM2NCwxNyArMzY0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLQotIwotIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCi0jCisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQklDPXkKLUNPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCi1DT05GSUdfVENQX0NPTkdfSFRDUD1tCi0jIENPTkZJR19UQ1BfQ09OR19IU1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19IWUJMQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19WRUdBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTkzMiw0ICs5MjMsMyBAQAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1pMSUJfREVGTEFURT15Ci0jIENPTkZJR19URVhUU0VBUkNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcKaW5kZXggYjFlMTYyZi4uMmQ2Zjk2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItZ2l0NgotIyBTYXQgSnVuIDI1IDAxOjAxOjE4IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzIKKyMgVGh1IEp1bCAgNyAxNjo0OToxMyAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQpAQCAtMTM4LDYgKzEzOCw3IEBACiAjCiAjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMzQ2LDEwICszNDcsOSBAQAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CkBAIC0zNjQsMTcgKzM2NCw4IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgVENQIGNvbmdlc3Rpb24gY29udHJvbAotIworIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX1RDUF9DT05HX0JJQz15Ci1DT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9bQotQ09ORklHX1RDUF9DT05HX0hUQ1A9bQotIyBDT05GSUdfVENQX0NPTkdfSFNUQ1AgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfVkVHQVMgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC05MzMsNCArOTI0LDMgQEAKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKIENPTkZJR19aTElCX0RFRkxBVEU9eQotIyBDT05GSUdfVEVYVFNFQVJDSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKaW5kZXggNGU1OGQ5My4uMjQ5NTUyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwpAQCAtMSwxNCArMSwxMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAxNzo1Mjo0MSAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIEZyaSBKdWwgIDggMDQ6NDk6MzQgMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKIENPTkZJR19VSUQxNj15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTcsNiArMTYsNyBAQAogQ09ORklHX0NMRUFOX0NPTVBJTEU9eQogQ09ORklHX0JST0tFTl9PTl9TTVA9eQogQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zMyw4ICszMyw5IEBACiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15CkBAIC04MiwxMCArODMsMjggQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAKICMKICMgVEkgT01BUCBJbXBsZW1lbnRhdGlvbnMKICMKK0NPTkZJR19BUkNIX09NQVBfT1RHPXkKK0NPTkZJR19BUkNIX09NQVAxPXkKKyMgQ09ORklHX0FSQ0hfT01BUDIgaXMgbm90IHNldAorCisjCisjIE9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zCisjCisjIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUyBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9NVVg9eQorIyBDT05GSUdfT01BUF9NVVhfREVCVUcgaXMgbm90IHNldAorQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTPXkKKyMgQ09ORklHX09NQVBfTVBVX1RJTUVSIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQXzMyS19USU1FUj15CitDT05GSUdfT01BUF8zMktfVElNRVJfSFo9MTI4CitDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMT15CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMgaXMgbm90IHNldAogCiAjCiAjIE9NQVAgQ29yZSBUeXBlCkBAIC05Myw3ICsxMTIsNiBAQAogIyBDT05GSUdfQVJDSF9PTUFQNzMwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfT01BUDE1MTAgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfT01BUDE2WFg9eQotQ09ORklHX0FSQ0hfT01BUF9PVEc9eQogCiAjCiAjIE9NQVAgQm9hcmQgVHlwZQpAQCAtMTAxLDIxICsxMTksMTQgQEAKICMgQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IgaXMgbm90IHNldAogQ09ORklHX01BQ0hfT01BUF9IMj15CiAjIENPTkZJR19NQUNIX09NQVBfSDMgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9PTUFQX0g0IGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfT01BUF9PU0sgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9PTUFQX0dFTkVSSUMgaXMgbm90IHNldAogCiAjCi0jIE9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zCisjIE9NQVAgQ1BVIFNwZWVkCiAjCi1DT05GSUdfT01BUF9NVVg9eQotIyBDT05GSUdfT01BUF9NVVhfREVCVUcgaXMgbm90IHNldAotQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTPXkKLUNPTkZJR19PTUFQX01QVV9USU1FUj15Ci0jIENPTkZJR19PTUFQXzMyS19USU1FUiBpcyBub3Qgc2V0Ci1DT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMT15Ci0jIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9DTE9DS1NfU0VUX0JZX0JPT1RMT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9BUk1fMjE2TUhaIGlzIG5vdCBzZXQKIENPTkZJR19PTUFQX0FSTV8xOTJNSFo9eQogIyBDT05GSUdfT01BUF9BUk1fMTY4TUhaIGlzIG5vdCBzZXQKICMgQ09ORklHX09NQVBfQVJNXzEyME1IWiBpcyBub3Qgc2V0CkBAIC0xNDUsNiArMTU2LDcgQEAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19JU0FfRE1BX0FQST15CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydApAQCAtMTU0LDcgKzE2NiwxNiBAQAogIwogIyBLZXJuZWwgRmVhdHVyZXMKICMKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CitDT05GSUdfTk9fSURMRV9IWj15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCkBAIC0xNjcsNiArMTg4LDIyIEBACiAjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKIAogIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorCisjCiAjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgogIwogCkBAIC0yMDIsNyArMjM5LDYgQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfRFJJVkVSPXkKIAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCkBAIC0yOTIsNyArMzI4LDYgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldApAQCAtMzI3LDYgKzM2Miw3IEBACiAjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKIAogIwogIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKQEAgLTM1Niw2ICszOTIsNyBAQAogIwogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTM3NSwxMiArNDEyLDEyIEBACiAjCiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CkBAIC0zOTUsNiArNDMyLDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JUF9UQ1BESUFHPXkKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtNDQyLDYgKzQ4MSw3IEBACiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9eQogQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCkBAIC01MTgsNyArNTU4LDYgQEAKIENPTkZJR19TRVJJT19TRVJQT1JUPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCkBAIC01NjcsMTMgKzYwNiwxMSBAQAogIwogIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKICMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTYwNCw3ICs2NDEsOSBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldApAQCAtNjIwLDYgKzY1OSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldApAQCAtNjI3LDE1ICs2NjcsMjEgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKIAogIwogIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CiAjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAogQ09ORklHX0lTUDEzMDFfT01BUD15CitDT05GSUdfVFBTNjUwMTA9eQorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNjYzLDggKzcwOSwxMCBAQAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU09GVF9DVVJTT1IgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogQ09ORklHX0ZCX01PREVfSEVMUEVSUz15CiAjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NywxMSArNzI1LDEzIEBACiBDT05GSUdfRk9OVF84eDg9eQogQ09ORklHX0ZPTlRfOHgxNj15CiAjIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF83eDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0CiAKICMKICMgTG9nbyBjb25maWd1cmF0aW9uCkBAIC03MjksMTQgKzc3OSwxNCBAQAogIwogQ09ORklHX1VTQl9HQURHRVQ9eQogIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CiAjIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyWFggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfU0ExMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0dBREdFVF9PTUFQPXkKIENPTkZJR19VU0JfT01BUD15CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0VUSD15CkBAIC03NTUsNiArODA1LDcgQEAKICMKIENPTkZJR19FWFQyX0ZTPXkKICMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KQkQgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldApAQCAtNzkxLDcgKzg0Miw2IEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CkBAIC04MjgsMTIgKzg3OCwxNCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX0xPQ0tEPXkKIENPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQpAQCAtOTAzLDI0ICs5NTUsMTEgQEAKICMgS2VybmVsIGhhY2tpbmcKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci1DT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfRVJST1JTPXkKLUNPTkZJR19ERUJVR19MTD15Ci0jIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbW5pbWV0ZXJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbW5pbWV0ZXJfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZkYjRhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21uaW1ldGVyX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgotIyBTdW4gTWFyIDI3IDIxOjMxOjQ1IDIwMDUKLSMKLUNPTkZJR19BUk09eQotQ09ORklHX01NVT15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS01PRD15Ci0KLSMKLSMgU3lzdGVtIFR5cGUKLSMKLSMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9TQTExMDA9eQotIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLQotIwotIyBTQTExeDAgSW1wbGVtZW50YXRpb25zCi0jCi0jIENPTkZJR19TQTExMDBfQVNTQUJFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfQ0VSRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfQ09MTElFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9IMzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfSDM2MDAgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9CQURHRTQgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX1NBMTEwMD15Ci1DT05GSUdfQ1BVXzMydjQ9eQotQ09ORklHX0NQVV9BQlJUX0VWND15Ci1DT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQotQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfVExCX1Y0V0I9eQotQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQotCi0jCi0jIFByb2Nlc3NvciBGZWF0dXJlcwotIwotCi0jCi0jIEJ1cyBzdXBwb3J0Ci0jCi1DT05GSUdfSVNBPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi1DT05GSUdfUENDQVJEPXkKLSMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUENNQ0lBPXkKLQotIwotIyBQQy1jYXJkIGJyaWRnZXMKLSMKLUNPTkZJR19JODIzNjU9eQotIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0Ci1DT05GSUdfUENNQ0lBX1NBMTEwMD15Ci1DT05GSUdfUENDQVJEX05PTlNUQVRJQz15Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19ESVNDT05USUdNRU09eQotIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0ia2VlcGluaXRyZCBtZW09MTZNIHJvb3Q9L2Rldi9yYW0gcmFtZGlzaz04MTkyIGluaXRyZD0weGQwMDAwMDAwLDRNIgotIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCi0jCi0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCi0jCi0KLSMKLSMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCi0jCi0jIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAotIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0JJTkZNVF9BT1VUPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLSMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9OQkQ9bQotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi1DT05GSUdfSURFPXkKLUNPTkZJR19CTEtfREVWX0lERT15Ci0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi0jIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURJU0s9eQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ1MgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUj15Ci0jIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAotIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotQ09ORklHX05FVF9SQURJTz15Ci0KLSMKLSMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKLSMKLSMgQ09ORklHX1NUUklQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVkVMQU4gaXMgbm90IHNldAotQ09ORklHX1BDTUNJQV9XQVZFTEFOPXkKLSMgQ09ORklHX1BDTUNJQV9ORVRXQVZFIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyA4MDIuMTEgRnJlcXVlbmN5IEhvcHBpbmcgY2FyZHMgc3VwcG9ydAotIwotIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydAotIwotIyBDT05GSUdfSEVSTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQKLSMKLUNPTkZJR19BSVJPX0NTPXkKLUNPTkZJR19QQ01DSUFfV0wzNTAxPXkKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUX1BDTUNJQT15Ci1DT05GSUdfUENNQ0lBXzNDNTg5PXkKLSMgQ09ORklHX1BDTUNJQV8zQzU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ01DSUFfRk1WSjE4WCBpcyBub3Qgc2V0Ci1DT05GSUdfUENNQ0lBX1BDTkVUPXkKLSMgQ09ORklHX1BDTUNJQV9OTUNMQU4gaXMgbm90IHNldAotIyBDT05GSUdfUENNQ0lBX1NNQzkxQzkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15Ci0jIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9TQTExMDA9eQotQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19EUk0gaXMgbm90IHNldAotCi0jCi0jIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GQj15Ci1DT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKLUNPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQotQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQotQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotQ09ORklHX0ZCX1NBMTEwMD15Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLUNPTkZJR19GT05UUz15Ci1DT05GSUdfRk9OVF84eDg9eQotIyBDT05GSUdfRk9OVF84eDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0IgaXMgbm90IHNldAotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBYRlMgc3VwcG9ydAotIwotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgotIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKLUNPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCmluZGV4IDk4YjcyZmYuLjk2YTc5NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZwpAQCAtNTcwLDcgKzU3MCw2IEBACiAjCiBDT05GSUdfU0VSSUFMX1MzQzI0MTA9eQogQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9CQVNUX1NJTz15CiBDT05GSUdfU0VSSUFMX0NPUkU9eQogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQogQ09ORklHX1VOSVg5OF9QVFlTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2hhcmtfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKaW5kZXggMWQ5YmNiYi4uMjcxODIzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKQEAgLTEsMjIgKzEsMjEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMjM6NTk6MTQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDMKKyMgU2F0IEp1bCAxNiAxNToyMTo0NyAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1VJRDE2PXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCiAjCiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKLSMgQ09ORklHX0NMRUFOX0NPTVBJTEUgaXMgbm90IHNldAotQ09ORklHX0JST0tFTj15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzMsNyArMzIsMTAgQEAKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgxLDYgKzgzLDcgQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwMywxMCArMTA2LDEyIEBACiAjCiBDT05GSUdfSVNBPXkKIENPTkZJR19JU0FfRE1BPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfSE9TVF9WSUE4MkM1MDU9eQogQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CiAjIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0xMTYsNyArMTIxLDkgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU0gaXMgbm90IHNldAogQ09ORklHX0xFRFM9eQogQ09ORklHX0xFRFNfVElNRVI9eQogIyBDT05GSUdfTEVEU19DUFUgaXMgbm90IHNldApAQCAtMTYzLDYgKzE3MCw3IEBACiAjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKQEAgLTE3Miw4ICsxODAsOCBAQAogIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKICMKLUNPTkZJR19QQVJQT1JUPXkKLUNPTkZJR19QQVJQT1JUX1BDPXkKK0NPTkZJR19QQVJQT1JUPW0KK0NPTkZJR19QQVJQT1JUX1BDPW0KICMgQ09ORklHX1BBUlBPUlRfU0VSSUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBUlBPUlRfUENfRklGTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8gaXMgbm90IHNldApAQCAtMTg5LDcgKzE5Nyw2IEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CkBAIC0yMjksNyArMjM2LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRElTSz15CiAjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9bQogIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lERUZMT1BQWT15CiAjIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldApAQCAtMjYxLDYgKzI2OCw3IEBACiBDT05GSUdfQkxLX0RFVl9TUj1tCiAjIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQ0hSX0RFVl9TRz1tCisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CiAKICMKICMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCkBAIC0yOTAsMTcgKzI5OCwxNCBAQAogIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTjIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NQUUZDVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CkBAIC0zMTQsMTEgKzMxOSw4IEBACiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUEFTMTYgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9QQ0kyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUENJMjIyMEkgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9QU0kyNDBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9RTEEyWFhYPW0KQEAgLTMyNyw2ICszMjksNyBAQAogIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1lNNTNDNDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKQEAgLTM0NCw2ICszNDcsOCBAQAogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTM2NSw3ICszNzAsNiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKQEAgLTM4MCw3ICszODQsNyBAQAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtNDM5LDYgKzQ0Myw3IEBACiAjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAogCiAjCkBAIC00ODMsOSArNDg4LDExIEBACiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKQEAgLTU2OSw3ICs1NzYsNiBAQAogQ09ORklHX1NFUklPX0xJQlBTMj15CiAjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAogIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKIAogIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwpAQCAtNTkyLDYgKzU5OCw3IEBACiAjCiBDT05GSUdfU0VSSUFMX0NPUkU9eQogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNjUzLDYgKzY2MCw3IEBACiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKIENPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CkBAIC02NzQsNyArNjgyLDcgQEAKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtODA4LDcgKzgxNiw3IEBACiAjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKLUNPTkZJR19JU085NjYwX0ZTPXkKK0NPTkZJR19JU085NjYwX0ZTPW0KIENPTkZJR19KT0xJRVQ9eQogIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CkBAIC04MTYsOSArODI0LDkgQEAKICMKICMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwogIwotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQogQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwogQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgogIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CkBAIC04MzMsNyArODQxLDYgQEAKICMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTg1NywxMyArODY0LDE0IEBACiAjCiAjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCiAjCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfU1VOUlBDPXkKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz1tCiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldApAQCAtODk1LDEyICs5MDMsMTIgQEAKICMKICMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICMKLUNPTkZJR19OTFM9eQorQ09ORklHX05MUz1tCiBDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLUNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KICMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTX0NPREVQQUdFXzg1MD15CitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCiAjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CkBAIC05MjEsNyArOTI5LDcgQEAKICMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCiAjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CkBAIC05NDUsMTEgKzk1MywyMiBAQAogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCmluZGV4IDRjMzhiZDguLjgzNWQ0NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCkBAIC0zMCw5ICszMCw2IEBACiBleHRlcm4gdm9pZCBfX21vZHNpMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fbXVsZGkzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX191Y21wZGkyKHZvaWQpOwotZXh0ZXJuIHZvaWQgX191ZGl2ZGkzKHZvaWQpOwotZXh0ZXJuIHZvaWQgX191bW9kZGkzKHZvaWQpOwotZXh0ZXJuIHZvaWQgX191ZGl2bW9kZGk0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX191ZGl2c2kzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX191bW9kc2kzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19kb19kaXY2NCh2b2lkKTsKQEAgLTQ0LDcgKzQxLDEwIEBACiAgKiBUaGlzIGhhcyBhIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9uOyBpdCBkb2Vzbid0CiAgKiBtb2RpZnkgYW55IG9mIHRoZSB1c3VhbCByZWdpc3RlcnMsIGV4Y2VwdCBmb3IgTFIuCiAgKi8KKyNkZWZpbmUgRVhQT1JUX0NSQ19BTElBUyhzeW0pIF9fQ1JDX1NZTUJPTChzeW0sICIiKQorCiAjZGVmaW5lIEVYUE9SVF9TWU1CT0xfQUxJQVMoc3ltLG9yaWcpCQlcCisgRVhQT1JUX0NSQ19BTElBUyhzeW0pCQkJCVwKICBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCBfX2tzeW10YWJfIyNzeW0JXAogICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWIiKSkpID0JXAogICAgIHsgKHVuc2lnbmVkIGxvbmcpJm9yaWcsICNzeW0gfTsKQEAgLTEzNCw5ICsxMzQsNiBAQAogRVhQT1JUX1NZTUJPTChfX21vZHNpMyk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKIEVYUE9SVF9TWU1CT0woX191Y21wZGkyKTsKLUVYUE9SVF9TWU1CT0woX191ZGl2ZGkzKTsKLUVYUE9SVF9TWU1CT0woX191bW9kZGkzKTsKLUVYUE9SVF9TWU1CT0woX191ZGl2bW9kZGk0KTsKIEVYUE9SVF9TWU1CT0woX191ZGl2c2kzKTsKIEVYUE9SVF9TWU1CT0woX191bW9kc2kzKTsKIEVYUE9SVF9TWU1CT0woX19kb19kaXY2NCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwppbmRleCBiZDQ4MjNjLi4xMTU1Y2YwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKQEAgLTM0NCw5ICszNDQsOSBAQAogCXN0cglyNiwgW3IwXQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfREVCVUdfTEwKIAliaWMJcjcsIHI3LCAjMHgwYwkJCUAgdHVybiBvZmYgY2FjaGVhYmxlCiAJCQkJCQlAIGFuZCBidWZmZXJhYmxlIGJpdHMKLSNpZmRlZiBDT05GSUdfREVCVUdfTEwKIAkvKgogCSAqIE1hcCBpbiBJTyBzcGFjZSBmb3Igc2VyaWFsIGRlYnVnZ2luZy4KIAkgKiBUaGlzIGFsbG93cyBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBvdXRwdXQKQEAgLTM3MiwyOCArMzcyLDI0IEBACiAJdGVxCXIxLCAjTUFDSF9UWVBFX05FVFdJTkRFUgogCXRlcW5lCXIxLCAjTUFDSF9UWVBFX0NBVFMKIAlibmUJMWYKLQlhZGQJcjAsIHI0LCAjMHgzZmMwCQkJQCBmZjAwMDAwMAotCW1vdglyMywgIzB4N2MwMDAwMDAKLQlvcnIJcjMsIHIzLCByNwotCXN0cglyMywgW3IwXSwgIzQKLQlhZGQJcjMsIHIzLCAjMSA8PCAyMAotCXN0cglyMywgW3IwXSwgIzQKKwlhZGQJcjAsIHI0LCAjMHhmZjAwMDAwMCA+PiAxOAorCW9ycglyMywgcjcsICMweDdjMDAwMDAwCisJc3RyCXIzLCBbcjBdCiAxOgogI2VuZGlmCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9SUEMKIAkvKgogCSAqIE1hcCBpbiBzY3JlZW4gYXQgMHgwMjAwMDAwMCAmIFNDUkVFTjJfQkFTRQogCSAqIFNpbWlsYXIgcmVhc29ucyBoZXJlIC0gZm9yIGRlYnVnLiAgVGhpcyBpcwogCSAqIG9ubHkgZm9yIEFjb3JuIFJpc2NQQyBhcmNoaXRlY3R1cmVzLgogCSAqLwotCWFkZAlyMCwgcjQsICMweDgwCQkJQCAwMjAwMDAwMAotCW1vdglyMywgIzB4MDIwMDAwMDAKLQlvcnIJcjMsIHIzLCByNworCWFkZAlyMCwgcjQsICMweDAyMDAwMDAwID4+IDE4CisJb3JyCXIzLCByNywgIzB4MDIwMDAwMDAKIAlzdHIJcjMsIFtyMF0KLQlhZGQJcjAsIHI0LCAjMHgzNjAwCQkJQCBkODAwMDAwMAorCWFkZAlyMCwgcjQsICMweGQ4MDAwMDAwID4+IDE4CiAJc3RyCXIzLCBbcjBdCiAjZW5kaWYKKyNlbmRpZgogCW1vdglwYywgbHIKIAkubHRvcmcKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOGYxNDZhNC4uYmJlYTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKIGV4dGVybiBjb25zdCBjaGFyICpwcm9jZXNzb3JfbW9kZXNbXTsKIGV4dGVybiB2b2lkIHNldHVwX21tX2Zvcl9yZWJvb3QoY2hhciBtb2RlKTsKQEAgLTg1LDggKzg2LDEwIEBACiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaGx0X2NvdW50ZXIpCisJaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaGx0X2NvdW50ZXIpIHsKKwkJdGltZXJfZHluX3JlcHJvZ3JhbSgpOwogCQlhcmNoX2lkbGUoKTsKKwl9CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IDhjZjczM2QuLmM5YjY5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0zNTksNyArMzU5LDggQEAKIAkgICAgICAiSSIgKG9mZnNldG9mKHN0cnVjdCBzdGFjaywgYWJ0WzBdKSksCiAJICAgICAgIkkiIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBVTkRfTU9ERSksCiAJICAgICAgIkkiIChvZmZzZXRvZihzdHJ1Y3Qgc3RhY2ssIHVuZFswXSkpLAotCSAgICAgICJJIiAoUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUpKTsKKwkgICAgICAiSSIgKFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFKQorCSAgICA6ICJyMTQiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKiBfX2luaXQgc2V0dXBfbWFjaGluZSh1bnNpZ25lZCBpbnQgbnIpCkBAIC03MzYsOCArNzM3LDggQEAKIAlpZiAobWRlc2MtPnNvZnRfcmVib290KQogCQlyZWJvb3Rfc2V0dXAoInMiKTsKIAotCWlmIChtZGVzYy0+cGFyYW1fb2Zmc2V0KQotCQl0YWdzID0gcGh5c190b192aXJ0KG1kZXNjLT5wYXJhbV9vZmZzZXQpOworCWlmIChtZGVzYy0+Ym9vdF9wYXJhbXMpCisJCXRhZ3MgPSBwaHlzX3RvX3ZpcnQobWRlc2MtPmJvb3RfcGFyYW1zKTsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSB0aGUgb2xkIHN0eWxlIHBhcmFtZXRlcnMsIGNvbnZlcnQgdGhlbSB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCmluZGV4IDA3ZGRlZWQuLjVlNDM1ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm4gMDsKIAotCWlmICh0cnlfdG9fZnJlZXplKDApKQorCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCWdvdG8gbm9fc2lnbmFsOwogCiAJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1NJTkdMRVNURVApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggMzQ4OTI3NS4uMjk1ZTBhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtMzYsNyArMzYsNyBAQAogICogVGhlIHByZXNlbnQgYml0bWFzayBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BVIGlzIHBoeXNpY2FsbHkgcHJlc2VudC4KICAqIFRoZSBvbmxpbmUgYml0bWFzayBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BVIGlzIHVwIGFuZCBydW5uaW5nLgogICovCi1jcHVtYXNrX3QgY3B1X3ByZXNlbnRfbWFzazsKK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwOwogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOwogCiAvKgpAQCAtNzgsNyArNzgsNyBAQAogc3RhdGljIHN0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgKiB2b2xhdGlsZSBzbXBfY2FsbF9mdW5jdGlvbl9kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhzbXBfY2FsbF9mdW5jdGlvbl9sb2NrKTsKIAotaW50IF9faW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoraW50IF9fY3B1aW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKIAlwZ2RfdCAqcGdkOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgKiBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgQ1BVIGJvb3QgZW50cnkuICBXZSdyZSB1c2luZyB0aGlzIENQVXMKICAqIGlkbGUgdGhyZWFkIHN0YWNrLCBidXQgYSBzZXQgb2YgdGVtcG9yYXJ5IHBhZ2UgdGFibGVzLgogICovCi1hc21saW5rYWdlIHZvaWQgX19pbml0IHNlY29uZGFyeV9zdGFydF9rZXJuZWwodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBfX2NwdWluaXQgc2Vjb25kYXJ5X3N0YXJ0X2tlcm5lbCh2b2lkKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gJmluaXRfbW07CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKQEAgLTIwOSw3ICsyMDksNyBAQAogICogQ2FsbGVkIGJ5IGJvdGggYm9vdCBhbmQgc2Vjb25kYXJpZXMgdG8gbW92ZSBnbG9iYWwgZGF0YSBpbnRvCiAgKiBwZXItcHJvY2Vzc29yIHN0b3JhZ2UuCiAgKi8KLXZvaWQgX19pbml0IHNtcF9zdG9yZV9jcHVfaW5mbyh1bnNpZ25lZCBpbnQgY3B1aWQpCit2b2lkIF9fY3B1aW5pdCBzbXBfc3RvcmVfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdWlkKQogewogCXN0cnVjdCBjcHVpbmZvX2FybSAqY3B1X2luZm8gPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1aWQpOwogCkBAIC0yMzUsNyArMjM1LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JY3B1X3NldChjcHUsIGNwdV9wcmVzZW50X21hc2spOworCWNwdV9zZXQoY3B1LCBjcHVfcG9zc2libGVfbWFwKTsKKwljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKIAljcHVfc2V0KGNwdSwgY3B1X29ubGluZV9tYXApOwogfQogCkBAIC0zNTUsNyArMzU2LDcgQEAKIAogCXNlcV9wdXRzKHAsICJJUEk6Iik7CiAKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpCiAJCXNlcV9wcmludGYocCwgIiAlMTBsdSIsIHBlcl9jcHUoaXBpX2RhdGEsIGNwdSkuaXBpX2NvdW50KTsKIAogCXNlcV9wdXRjKHAsICdcbicpOwpAQCAtNTAyLDMgKzUwMywxMjYgQEAKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKworc3RhdGljIGludAorb25fZWFjaF9jcHVfbWFzayh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqaW5mbywgaW50IHJldHJ5LCBpbnQgd2FpdCwKKwkJIGNwdW1hc2tfdCBtYXNrKQoreworCWludCByZXQgPSAwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlyZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUoZnVuYywgaW5mbywgcmV0cnksIHdhaXQsIG1hc2spOworCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKSkKKwkJZnVuYyhpbmZvKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRMQiBvcGVyYXRpb25zCisgKi8KK3N0cnVjdCB0bGJfYXJncyB7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp0YV92bWE7CisJdW5zaWduZWQgbG9uZyB0YV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHRhX2VuZDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlfZmx1c2hfdGxiX2FsbCh2b2lkICppZ25vcmVkKQoreworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwaV9mbHVzaF90bGJfbW0odm9pZCAqYXJnKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gKHN0cnVjdCBtbV9zdHJ1Y3QgKilhcmc7CisKKwlsb2NhbF9mbHVzaF90bGJfbW0obW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXBpX2ZsdXNoX3RsYl9wYWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGxiX2FyZ3MgKnRhID0gKHN0cnVjdCB0bGJfYXJncyAqKWFyZzsKKworCWxvY2FsX2ZsdXNoX3RsYl9wYWdlKHRhLT50YV92bWEsIHRhLT50YV9zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlfZmx1c2hfdGxiX2tlcm5lbF9wYWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGxiX2FyZ3MgKnRhID0gKHN0cnVjdCB0bGJfYXJncyAqKWFyZzsKKworCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZSh0YS0+dGFfc3RhcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXBpX2ZsdXNoX3RsYl9yYW5nZSh2b2lkICphcmcpCit7CisJc3RydWN0IHRsYl9hcmdzICp0YSA9IChzdHJ1Y3QgdGxiX2FyZ3MgKilhcmc7CisKKwlsb2NhbF9mbHVzaF90bGJfcmFuZ2UodGEtPnRhX3ZtYSwgdGEtPnRhX3N0YXJ0LCB0YS0+dGFfZW5kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwaV9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGxiX2FyZ3MgKnRhID0gKHN0cnVjdCB0bGJfYXJncyAqKWFyZzsKKworCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodGEtPnRhX3N0YXJ0LCB0YS0+dGFfZW5kKTsKK30KKwordm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit7CisJb25fZWFjaF9jcHUoaXBpX2ZsdXNoX3RsYl9hbGwsIE5VTEwsIDEsIDEpOworfQorCit2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwljcHVtYXNrX3QgbWFzayA9IG1tLT5jcHVfdm1fbWFzazsKKworCW9uX2VhY2hfY3B1X21hc2soaXBpX2ZsdXNoX3RsYl9tbSwgbW0sIDEsIDEsIG1hc2spOworfQorCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVhZGRyKQoreworCWNwdW1hc2tfdCBtYXNrID0gdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2s7CisJc3RydWN0IHRsYl9hcmdzIHRhOworCisJdGEudGFfdm1hID0gdm1hOworCXRhLnRhX3N0YXJ0ID0gdWFkZHI7CisKKwlvbl9lYWNoX2NwdV9tYXNrKGlwaV9mbHVzaF90bGJfcGFnZSwgJnRhLCAxLCAxLCBtYXNrKTsKK30KKwordm9pZCBmbHVzaF90bGJfa2VybmVsX3BhZ2UodW5zaWduZWQgbG9uZyBrYWRkcikKK3sKKwlzdHJ1Y3QgdGxiX2FyZ3MgdGE7CisKKwl0YS50YV9zdGFydCA9IGthZGRyOworCisJb25fZWFjaF9jcHUoaXBpX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZSwgJnRhLCAxLCAxKTsKK30KKwordm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwljcHVtYXNrX3QgbWFzayA9IHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrOworCXN0cnVjdCB0bGJfYXJncyB0YTsKKworCXRhLnRhX3ZtYSA9IHZtYTsKKwl0YS50YV9zdGFydCA9IHN0YXJ0OworCXRhLnRhX2VuZCA9IGVuZDsKKworCW9uX2VhY2hfY3B1X21hc2soaXBpX2ZsdXNoX3RsYl9yYW5nZSwgJnRhLCAxLCAxLCBtYXNrKTsKK30KKwordm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCB0bGJfYXJncyB0YTsKKworCXRhLnRhX3N0YXJ0ID0gc3RhcnQ7CisJdGEudGFfZW5kID0gZW5kOworCisJb25fZWFjaF9jcHUoaXBpX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UsICZ0YSwgMSwgMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwppbmRleCAwNjA1NGM5Li4xYjdmY2Q1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKQEAgLTQyNCwxNSArNDI0LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFJlcHJvZ3JhbSB0aGUgc3lzdGVtIHRpbWVyIGZvciBhdCBsZWFzdCB0aGUgY2FsY3VsYXRlZCB0aW1lIGludGVydmFsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGlkbGUgdGhyZWFkIHdpdGggSVJRcyBkaXNhYmxlZCwKKyAqIGltbWVkaWF0ZWx5IGJlZm9yZSBzbGVlcGluZy4KKyAqLwogdm9pZCB0aW1lcl9keW5fcmVwcm9ncmFtKHZvaWQpCiB7CiAJc3RydWN0IGR5bl90aWNrX3RpbWVyICpkeW5fdGljayA9IHN5c3RlbV90aW1lci0+ZHluX3RpY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCWlmIChkeW5fdGljay0+c3RhdGUgJiBEWU5fVElDS19FTkFCTEVEKQogCQlkeW5fdGljay0+cmVwcm9ncmFtKG5leHRfdGltZXJfaW50ZXJydXB0KCkgLSBqaWZmaWVzKTsKLQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHRpbWVyX3Nob3dfZHluX3RpY2soc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwppbmRleCAyZmIwYTRjLi5kNTcxYzM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMjMwLDE2ICsyMzAsOCBAQAogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKLXZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyKQotewotCWlmICh1c2VyX21vZGUocmVncykpCi0gICAgCQlyZXR1cm47Ci0KLSAgICAJZGllKHN0ciwgcmVncywgZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgbm90aWZ5X2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdpbmZvX3QgKmluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGVyciwgdW5zaWduZWQgbG9uZyB0cmFwKQordm9pZCBub3RpZnlfZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdpbmZvICppbmZvLAorCQl1bnNpZ25lZCBsb25nIGVyciwgdW5zaWduZWQgbG9uZyB0cmFwKQogewogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnI7CkBAIC0yNTYsMTYgKzI0OCwyMCBAQAogCiB2b2lkIHJlZ2lzdGVyX3VuZGVmX2hvb2soc3RydWN0IHVuZGVmX2hvb2sgKmhvb2spCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1bmRlZl9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGQoJmhvb2stPm5vZGUsICZ1bmRlZl9ob29rKTsKLQlzcGluX3VubG9ja19pcnEoJnVuZGVmX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuZGVmX2xvY2ssIGZsYWdzKTsKIH0KIAogdm9pZCB1bnJlZ2lzdGVyX3VuZGVmX2hvb2soc3RydWN0IHVuZGVmX2hvb2sgKmhvb2spCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1bmRlZl9sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJmhvb2stPm5vZGUpOwotCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5kZWZfbG9jaywgZmxhZ3MpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fdW5kZWZpbnN0cihzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9NYWtlZmlsZSBiL2FyY2gvYXJtL2xpYi9NYWtlZmlsZQppbmRleCBjMGU2NTgzLi44NzI1ZDYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw3IEBACiAJCSAgIHN0cm5sZW5fdXNlci5vIHN0cmNoci5vIHN0cnJjaHIubyB0ZXN0Y2hhbmdlYml0Lm8gIFwKIAkJICAgdGVzdGNsZWFyYml0Lm8gdGVzdHNldGJpdC5vIHVhY2Nlc3MubyBnZXR1c2VyLm8gICAgXAogCQkgICBwdXR1c2VyLm8gYXNobGRpMy5vIGFzaHJkaTMubyBsc2hyZGkzLm8gbXVsZGkzLm8gICBcCi0JCSAgIHVjbXBkaTIubyB1ZGl2ZGkzLm8gbGliMWZ1bmNzLm8gZGl2NjQubwkgICAgICBcCisJCSAgIHVjbXBkaTIubyBsaWIxZnVuY3MubyBkaXY2NC5vCSAgICAgICAgICAgICAgXAogCQkgICBpby1yZWFkc2IubyBpby13cml0ZXNiLm8gaW8tcmVhZHNsLm8gaW8td3JpdGVzbC5vCiAKIGlmZXEgKCQoQ09ORklHX0NQVV8zMnYzKSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2JpdG9wcy5oIGIvYXJjaC9hcm0vbGliL2JpdG9wcy5oCmluZGV4IDRhODNhYjYuLjY5NzZlNjBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvYml0b3BzLmgKKysrIGIvYXJjaC9hcm0vbGliL2JpdG9wcy5oCkBAIC0xLDMgKzEsMzMgQEAKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCS5tYWNybwliaXRvcCwgaW5zdHIKKwltb3YJcjIsICMxCisJYW5kCXIzLCByMCwgIzcJCUAgR2V0IGJpdCBvZmZzZXQKKwlhZGQJcjEsIHIxLCByMCwgbHNyICMzCUAgR2V0IGJ5dGUgb2Zmc2V0CisJbW92CXIzLCByMiwgbHNsIHIzCisxOglsZHJleGIJcjIsIFtyMV0KKwlcaW5zdHIJcjIsIHIyLCByMworCXN0cmV4YglyMCwgcjIsIFtyMV0KKwljbXBuZQlyMCwgIzAKKwlibmUJMWIKKwltb3YJcGMsIGxyCisJLmVuZG0KKworCS5tYWNybwl0ZXN0b3AsIGluc3RyLCBzdG9yZQorCWFuZAlyMywgcjAsICM3CQlAIEdldCBiaXQgb2Zmc2V0CisJbW92CXIyLCAjMQorCWFkZAlyMSwgcjEsIHIwLCBsc3IgIzMJQCBHZXQgYnl0ZSBvZmZzZXQKKwltb3YJcjMsIHIyLCBsc2wgcjMJCUAgY3JlYXRlIG1hc2sKKzE6CWxkcmV4YglyMiwgW3IxXQorCWFuZHMJcjAsIHIyLCByMwkJQCBzYXZlIG9sZCB2YWx1ZSBvZiBiaXQKKwlcaW5zdHIJaXAsIHIyLCByMwkJCUAgdG9nZ2xlIGJpdAorCXN0cmV4YglyMiwgaXAsIFtyMV0KKwljbXAJcjIsICMwCisJYm5lCTFiCisJY21wCXIwLCAjMAorCW1vdm5lCXIwLCAjMQorMjoJbW92CXBjLCBscgorCS5lbmRtCisjZWxzZQogCS5tYWNybwliaXRvcCwgaW5zdHIKIAlhbmQJcjIsIHIwLCAjNwogCW1vdglyMywgIzEKQEAgLTMxLDMgKzYxLDQgQEAKIAltb3ZlcQlyMCwgIzAKIAltb3YJcGMsIGxyCiAJLmVuZG0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2lvLXNoYXJrLmMgYi9hcmNoL2FybS9saWIvaW8tc2hhcmsuYwppbmRleCAxMDhkNDU3Li44MjQyNTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvaW8tc2hhcmsuYworKysgYi9hcmNoL2FybS9saWIvaW8tc2hhcmsuYwpAQCAtMTEsNzMgKzExLDMgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLXZvaWQgcHJpbnRfd2FybmluZyh2b2lkKQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgImlucz8vb3V0cz8gbm90IGltcGxlbWVudGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlXG4iKTsKLX0KLQotdm9pZCBpbnNsKHVuc2lnbmVkIGludCBwb3J0LCB2b2lkICp0bywgaW50IGxlbikKLXsKLQlwcmludF93YXJuaW5nKCk7Ci19Ci0KLXZvaWQgaW5zYih1bnNpZ25lZCBpbnQgcG9ydCwgdm9pZCAqdG8sIGludCBsZW4pCi17Ci0JcHJpbnRfd2FybmluZygpOwotfQotCi12b2lkIG91dHNsKHVuc2lnbmVkIGludCBwb3J0LCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQotewotCXByaW50X3dhcm5pbmcoKTsKLX0KLQotdm9pZCBvdXRzYih1bnNpZ25lZCBpbnQgcG9ydCwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKLXsKLQlwcmludF93YXJuaW5nKCk7Ci19Ci0KLS8qIHRoZXNlIHNob3VsZCBiZSBpbiBhc3NlbWJsZXIgYWdhaW4gKi8KLQotLyoKLSAqIFB1cnBvc2U6IHJlYWQgYSBibG9jayBvZiBkYXRhIGZyb20gYSBoYXJkd2FyZSByZWdpc3RlciB0byBtZW1vcnkuCi0gKiBQcm90byAgOiBpbnN3KGludCBmcm9tX3BvcnQsIHZvaWQgKnRvLCBpbnQgbGVuX2luX3dvcmRzKTsKLSAqIFByb3RvICA6IGluc3diKGludCBmcm9tX3BvcnQsIHZvaWQgKnRvLCBpbnQgbGVuX2luX2J5dGVzKTsKLSAqIE5vdGVzICA6IGluY3JlbWVudCB0bwotICovCi0KLXZvaWQgaW5zdyh1bnNpZ25lZCBpbnQgcG9ydCwgdm9pZCAqdG8sIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCSgodW5zaWduZWQgc2hvcnQgKikgdG8pW2ldID0gaW53KHBvcnQpOwotfQotCi12b2lkIGluc3diKHVuc2lnbmVkIGludCBwb3J0LCB2b2lkICp0bywgaW50IGxlbikKLXsKLQlpbnN3KHBvcnQsIHRvLCBsZW4gPj4gMik7Ci19Ci0KLS8qCi0gKiBQdXJwb3NlOiB3cml0ZSBhIGJsb2NrIG9mIGRhdGEgZnJvbSBtZW1vcnkgdG8gYSBoYXJkd2FyZSByZWdpc3Rlci4KLSAqIFByb3RvICA6IG91dHN3KGludCB0b19yZWcsIHZvaWQgKmZyb20sIGludCBsZW5faW5fd29yZHMpOwotICogUHJvdG8gIDogb3V0c3diKGludCB0b19yZWcsIHZvaWQgKmZyb20sIGludCBsZW5faW5fYnl0ZXMpOwotICogTm90ZXMgIDogaW5jcmVtZW50cyBmcm9tCi0gKi8KLQotdm9pZCBvdXRzdyh1bnNpZ25lZCBpbnQgcG9ydCwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJb3V0dygoKHVuc2lnbmVkIHNob3J0ICopIGZyb20pW2ldLCBwb3J0KTsKLX0KLQotdm9pZCBvdXRzd2IodW5zaWduZWQgaW50IHBvcnQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCi17Ci0Jb3V0c3cocG9ydCwgZnJvbSwgbGVuID4+IDIpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2xvbmdsb25nLmggYi9hcmNoL2FybS9saWIvbG9uZ2xvbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhZTY0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9saWIvbG9uZ2xvbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKiBsb25nbG9uZy5oIC0tIGJhc2VkIG9uIGNvZGUgZnJvbSBnY2MtMi45NS4zCi0KLSAgIGRlZmluaXRpb25zIGZvciBtaXhlZCBzaXplIDMyLzY0IGJpdCBhcml0aG1ldGljLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBkZWZpbml0aW9uIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIGRlZmluaXRpb24gZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEJvcnJvd2VkIGZyb20gR0NDIDIuOTUuMywgSSBNb2x0b24gMjkvMDcvMDEgKi8KLQotI2lmbmRlZiBTSV9UWVBFX1NJWkUKLSNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCi0jZW5kaWYKLQotI2RlZmluZSBfX0JJVFM0IChTSV9UWVBFX1NJWkUgLyA0KQotI2RlZmluZSBfX2xsX0IgKDFMIDw8IChTSV9UWVBFX1NJWkUgLyAyKSkKLSNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgodTMyKSAodCkgJSBfX2xsX0IpCi0jZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkgKCh1MzIpICh0KSAvIF9fbGxfQikKLQotLyogRGVmaW5lIGF1eGlsaWFyeSBhc20gbWFjcm9zLgotCi0gICAxKSB1bXVsX3BwbW0oaGlnaF9wcm9kLCBsb3dfcHJvZCwgbXVsdGlwbGVyLCBtdWx0aXBsaWNhbmQpCi0gICBtdWx0aXBsaWVzIHR3byB1MzIgaW50ZWdlcnMgTVVMVElQTEVSIGFuZCBNVUxUSVBMSUNBTkQsCi0gICBhbmQgZ2VuZXJhdGVzIGEgdHdvLXBhcnQgdTMyIHByb2R1Y3QgaW4gSElHSF9QUk9EIGFuZAotICAgTE9XX1BST0QuCi0KLSAgIDIpIF9fdW11bHNpZGkzKGEsYikgbXVsdGlwbGllcyB0d28gdTMyIGludGVnZXJzIEEgYW5kIEIsCi0gICBhbmQgcmV0dXJucyBhIHU2NCBwcm9kdWN0LiAgVGhpcyBpcyBqdXN0IGEgdmFyaWFudCBvZiB1bXVsX3BwbW0uCi0KLSAgIDMpIHVkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0b3IsIGxvd19udW1lcmF0b3IsCi0gICBkZW5vbWluYXRvcikgZGl2aWRlcyBhIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXIsIGNvbXBvc2VkIGJ5IHRoZQotICAgaW50ZWdlcnMgSElHSF9OVU1FUkFUT1IgYW5kIExPV19OVU1FUkFUT1IsIGJ5IERFTk9NSU5BVE9SIGFuZAotICAgcGxhY2VzIHRoZSBxdW90aWVudCBpbiBRVU9USUVOVCBhbmQgdGhlIHJlbWFpbmRlciBpbiBSRU1BSU5ERVIuCi0gICBISUdIX05VTUVSQVRPUiBtdXN0IGJlIGxlc3MgdGhhbiBERU5PTUlOQVRPUiBmb3IgY29ycmVjdCBvcGVyYXRpb24uCi0gICBJZiwgaW4gYWRkaXRpb24sIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsCi0gICB0aGVuIHRoZSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgotCi0gICA0KSBzZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAotICAgZGVub21pbmF0b3IpLiAgTGlrZSB1ZGl2X3Fybm5kIGJ1dCB0aGUgbnVtYmVycyBhcmUgc2lnbmVkLiAgVGhlCi0gICBxdW90aWVudCBpcyByb3VuZGVkIHRvd2FyZHMgMC4KLQotICAgNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20KLSAgIHRoZSBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBYCi0gICBuZWVkcyB0byBiZSBzaGlmdGVkIGxlZnQgdG8gc2V0IHRoZSBtc2IuICBVbmRlZmluZWQgZm9yIFggPT0gMC4KLQotICAgNikgYWRkX3NzYWFhYShoaWdoX3N1bSwgbG93X3N1bSwgaGlnaF9hZGRlbmRfMSwgbG93X2FkZGVuZF8xLAotICAgaGlnaF9hZGRlbmRfMiwgbG93X2FkZGVuZF8yKSBhZGRzIHR3byB0d28td29yZCB1bnNpZ25lZCBpbnRlZ2VycywKLSAgIGNvbXBvc2VkIGJ5IEhJR0hfQURERU5EXzEgYW5kIExPV19BRERFTkRfMSwgYW5kIEhJR0hfQURERU5EXzIgYW5kCi0gICBMT1dfQURERU5EXzIgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9TVU0gYW5kCi0gICBMT1dfU1VNLiAgT3ZlcmZsb3cgKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgaXMKLSAgIGxvc3QuCi0KLSAgIDcpIHN1Yl9kZG1tc3MoaGlnaF9kaWZmZXJlbmNlLCBsb3dfZGlmZmVyZW5jZSwgaGlnaF9taW51ZW5kLAotICAgbG93X21pbnVlbmQsIGhpZ2hfc3VidHJhaGVuZCwgbG93X3N1YnRyYWhlbmQpIHN1YnRyYWN0cyB0d28KLSAgIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXJzLCBjb21wb3NlZCBieSBISUdIX01JTlVFTkRfMSBhbmQKLSAgIExPV19NSU5VRU5EXzEsIGFuZCBISUdIX1NVQlRSQUhFTkRfMiBhbmQgTE9XX1NVQlRSQUhFTkRfMgotICAgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9ESUZGRVJFTkNFIGFuZAotICAgTE9XX0RJRkZFUkVOQ0UuICBPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCi0gICBhbmQgaXMgbG9zdC4KLQotICAgSWYgYW55IG9mIHRoZXNlIG1hY3JvcyBhcmUgbGVmdCB1bmRlZmluZWQgZm9yIGEgcGFydGljdWxhciBDUFUsCi0gICBDIG1hY3JvcyBhcmUgdXNlZC4gICovCi0KLSNpZiBkZWZpbmVkIChfX2FybV9fKQotI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKLSAgX19hc21fXyAoImFkZHMJJTEsICU0LCAlNQkJCQkJXG5cCi0JYWRjCSUwLCAlMiwgJTMiCQkJCQkJXAotCSAgIDogIj1yIiAoKHUzMikgKHNoKSksCQkJCQlcCi0JICAgICAiPSZyIiAoKHUzMikgKHNsKSkJCQkJCVwKLQkgICA6ICIlciIgKCh1MzIpIChhaCkpLAkJCQkJXAotCSAgICAgInJJIiAoKHUzMikgKGJoKSksCQkJCQlcCi0JICAgICAiJXIiICgodTMyKSAoYWwpKSwJCQkJCVwKLQkgICAgICJySSIgKCh1MzIpIChibCkpKQotI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKLSAgX19hc21fXyAoInN1YnMJJTEsICU0LCAlNQkJCQkJXG5cCi0Jc2JjCSUwLCAlMiwgJTMiCQkJCQkJXAotCSAgIDogIj1yIiAoKHUzMikgKHNoKSksCQkJCQlcCi0JICAgICAiPSZyIiAoKHUzMikgKHNsKSkJCQkJCVwKLQkgICA6ICJyIiAoKHUzMikgKGFoKSksCQkJCQlcCi0JICAgICAickkiICgodTMyKSAoYmgpKSwJCQkJCVwKLQkgICAgICJyIiAoKHUzMikgKGFsKSksCQkJCQlcCi0JICAgICAickkiICgodTMyKSAoYmwpKSkKLSNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAote3JlZ2lzdGVyIHUzMiBfX3QwLCBfX3QxLCBfX3QyOwkJCQkJXAotICBfX2FzbV9fICgiJUAgSW5saW5lZCB1bXVsX3BwbW0JCQkJCVxuXAotCW1vdgklMiwgJTUsIGxzciAjMTYJCQkJCQlcblwKLQltb3YJJTAsICU2LCBsc3IgIzE2CQkJCQkJXG5cCi0JYmljCSUzLCAlNSwgJTIsIGxzbCAjMTYJCQkJCVxuXAotCWJpYwklNCwgJTYsICUwLCBsc2wgIzE2CQkJCQlcblwKLQltdWwJJTEsICUzLCAlNAkJCQkJCVxuXAotCW11bAklNCwgJTIsICU0CQkJCQkJXG5cCi0JbXVsCSUzLCAlMCwgJTMJCQkJCQlcblwKLQltdWwJJTAsICUyLCAlMAkJCQkJCVxuXAotCWFkZHMJJTMsICU0LCAlMwkJCQkJCVxuXAotCWFkZGNzCSUwLCAlMCwgIzY1NTM2CQkJCQkJXG5cCi0JYWRkcwklMSwgJTEsICUzLCBsc2wgIzE2CQkJCQlcblwKLQlhZGMJJTAsICUwLCAlMywgbHNyICMxNiIJCQkJCVwKLQkgICA6ICI9JnIiICgodTMyKSAoeGgpKSwJCQkJCVwKLQkgICAgICI9ciIgKCh1MzIpICh4bCkpLAkJCQkJXAotCSAgICAgIj0mciIgKF9fdDApLCAiPSZyIiAoX190MSksICI9ciIgKF9fdDIpCQkJXAotCSAgIDogInIiICgodTMyKSAoYSkpLAkJCQkJXAotCSAgICAgInIiICgodTMyKSAoYikpKTt9Ci0jZGVmaW5lIFVNVUxfVElNRSAyMAotI2RlZmluZSBVRElWX1RJTUUgMTAwCi0jZW5kaWYJCQkJLyogX19hcm1fXyAqLwotCi0jZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKLSAgKHtESXVuaW9uIF9fdzsJCQkJCQkJXAotICAgIHVtdWxfcHBtbSAoX193LnMuaGlnaCwgX193LnMubG93LCB1LCB2KTsJCQkJXAotICAgIF9fdy5sbDsgfSkKLQotI2RlZmluZSBfX3VkaXZfcXJubmRfYyhxLCByLCBuMSwgbjAsIGQpIFwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICB1MzIgX19kMSwgX19kMCwgX19xMSwgX19xMDsJCQkJCVwKLSAgICB1MzIgX19yMSwgX19yMCwgX19tOwkJCQkJCVwKLSAgICBfX2QxID0gX19sbF9oaWdocGFydCAoZCk7CQkJCQkJXAotICAgIF9fZDAgPSBfX2xsX2xvd3BhcnQgKGQpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3IxID0gKG4xKSAlIF9fZDE7CQkJCQkJCVwKLSAgICBfX3ExID0gKG4xKSAvIF9fZDE7CQkJCQkJCVwKLSAgICBfX20gPSAodTMyKSBfX3ExICogX19kMDsJCQkJCVwKLSAgICBfX3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IxIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IxID49IChkKSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi9cCi0JICBpZiAoX19yMSA8IF9fbSkJCQkJCQlcCi0JICAgIF9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIF9fcjEgLT0gX19tOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX19yMCA9IF9fcjEgJSBfX2QxOwkJCQkJCQlcCi0gICAgX19xMCA9IF9fcjEgLyBfX2QxOwkJCQkJCQlcCi0gICAgX19tID0gKHUzMikgX19xMCAqIF9fZDA7CQkJCQlcCi0gICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IwID49IChkKSkJCQkJCQlcCi0JICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCi0JICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgKHEpID0gKHUzMikgX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCVwKLSAgICAocikgPSBfX3IwOwkJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCi0jZGVmaW5lIHVkaXZfcXJubmQgX191ZGl2X3Fybm5kX2MKLQotI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgdTMyIF9feHIgPSAoeCk7CQkJCQkJCVwKLSAgICB1MzIgX19hOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgaWYgKFNJX1RZUEVfU0laRSA8PSAzMikJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fYSA9IF9feHIgPCAoKHUzMikxPDwyKl9fQklUUzQpCQkJCVwKLQkgID8gKF9feHIgPCAoKHUzMikxPDxfX0JJVFM0KSA/IDAgOiBfX0JJVFM0KQkJXAotCSAgOiAoX194ciA8ICgodTMyKTE8PDMqX19CSVRTNCkgPyAgMipfX0JJVFM0IDogMypfX0JJVFM0KTsJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBlbHNlCQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCWZvciAoX19hID0gU0lfVFlQRV9TSVpFIC0gODsgX19hID4gMDsgX19hIC09IDgpCQkJXAotCSAgaWYgKCgoX194ciA+PiBfX2EpICYgMHhmZikgIT0gMCkJCQkJXAotCSAgICBicmVhazsJCQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAoY291bnQpID0gU0lfVFlQRV9TSVpFIC0gKF9fY2x6X3RhYltfX3hyID4+IF9fYV0gKyBfX2EpOwkJXAotICB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3VkaXZkaTMuYyBiL2FyY2gvYXJtL2xpYi91ZGl2ZGkzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDNiZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbGliL3VkaXZkaTMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKiBNb3JlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSBHQ0Mgb3V0cHV0IGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICovCi0vKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KLS8qIENvcHlyaWdodCAoQykgMTk4OSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMsCi0gICBzb21lIG9mIHdoaWNoIGFyZSBjb21waWxlZCB3aXRoIEdDQywgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAotICAgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUKLSAgIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotICAgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAqLwotLyogc3VwcG9ydCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbC4gYmFzZWQgb24gY29kZSBmcm9tIGdjYy0yLjk1LjMgKi8KLS8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLwotCi0jaW5jbHVkZSAiZ2NjbGliLmgiCi0jaW5jbHVkZSAibG9uZ2xvbmcuaCIKLQotc3RhdGljIGNvbnN0IHU4IF9fY2x6X3RhYltdID0gewotCTAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCi0JICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKLQkgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAotCSAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0JICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0JOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQkgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQk4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAotCSAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAotCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCi0JICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCi0JOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQkgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLX07Ci0KLXU2NCBfX3VkaXZtb2RkaTQodTY0IG4sIHU2NCBkLCB1NjQgKiBycCkKLXsKLQlESXVuaW9uIHd3OwotCURJdW5pb24gbm4sIGRkOwotCURJdW5pb24gcnI7Ci0JdTMyIGQwLCBkMSwgbjAsIG4xLCBuMjsKLQl1MzIgcTAsIHExOwotCXUzMiBiLCBibTsKLQotCW5uLmxsID0gbjsKLQlkZC5sbCA9IGQ7Ci0KLQlkMCA9IGRkLnMubG93OwotCWQxID0gZGQucy5oaWdoOwotCW4wID0gbm4ucy5sb3c7Ci0JbjEgPSBubi5zLmhpZ2g7Ci0KLQlpZiAoZDEgPT0gMCkgewotCQlpZiAoZDAgPiBuMSkgewotCQkJLyogMHEgPSBubiAvIDBEICovCi0KLQkJCWNvdW50X2xlYWRpbmdfemVyb3MoYm0sIGQwKTsKLQotCQkJaWYgKGJtICE9IDApIHsKLQkJCQkvKiBOb3JtYWxpemUsIGkuZS4gbWFrZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCi0JCQkJICAgZGVub21pbmF0b3Igc2V0LiAgKi8KLQotCQkJCWQwID0gZDAgPDwgYm07Ci0JCQkJbjEgPSAobjEgPDwgYm0pIHwgKG4wID4+IChTSV9UWVBFX1NJWkUgLSBibSkpOwotCQkJCW4wID0gbjAgPDwgYm07Ci0JCQl9Ci0KLQkJCXVkaXZfcXJubmQocTAsIG4wLCBuMSwgbjAsIGQwKTsKLQkJCXExID0gMDsKLQotCQkJLyogUmVtYWluZGVyIGluIG4wID4+IGJtLiAgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIHFxID0gTk4gLyAwZCAqLwotCi0JCQlpZiAoZDAgPT0gMCkKLQkJCQlkMCA9IDEgLyBkMDsJLyogRGl2aWRlIGludGVudGlvbmFsbHkgYnkgemVyby4gICovCi0KLQkJCWNvdW50X2xlYWRpbmdfemVyb3MoYm0sIGQwKTsKLQotCQkJaWYgKGJtID09IDApIHsKLQkJCQkvKiBGcm9tIChuMSA+PSBkMCkgL1wgKHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBkMCBpcyBzZXQpLAotCQkJCSAgIGNvbmNsdWRlICh0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgbjEgaXMgc2V0KSAvXCAodGhlCi0JCQkJICAgbGVhZGluZyBxdW90aWVudCBkaWdpdCBxMSA9IDEpLgotCi0JCQkJICAgVGhpcyBzcGVjaWFsIGNhc2UgaXMgbmVjZXNzYXJ5LCBub3QgYW4gb3B0aW1pemF0aW9uLgotCQkJCSAgIChTaGlmdHMgY291bnRzIG9mIFNJX1RZUEVfU0laRSBhcmUgdW5kZWZpbmVkLikgICovCi0KLQkJCQluMSAtPSBkMDsKLQkJCQlxMSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIE5vcm1hbGl6ZS4gICovCi0KLQkJCQliID0gU0lfVFlQRV9TSVpFIC0gYm07Ci0KLQkJCQlkMCA9IGQwIDw8IGJtOwotCQkJCW4yID0gbjEgPj4gYjsKLQkJCQluMSA9IChuMSA8PCBibSkgfCAobjAgPj4gYik7Ci0JCQkJbjAgPSBuMCA8PCBibTsKLQotCQkJCXVkaXZfcXJubmQocTEsIG4xLCBuMiwgbjEsIGQwKTsKLQkJCX0KLQotCQkJLyogbjEgIT0gZDAuLi4gICovCi0KLQkJCXVkaXZfcXJubmQocTAsIG4wLCBuMSwgbjAsIGQwKTsKLQotCQkJLyogUmVtYWluZGVyIGluIG4wID4+IGJtLiAgKi8KLQkJfQotCi0JCWlmIChycCAhPSAwKSB7Ci0JCQlyci5zLmxvdyA9IG4wID4+IGJtOwotCQkJcnIucy5oaWdoID0gMDsKLQkJCSpycCA9IHJyLmxsOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGQxID4gbjEpIHsKLQkJCS8qIDAwID0gbm4gLyBERCAqLwotCi0JCQlxMCA9IDA7Ci0JCQlxMSA9IDA7Ci0KLQkJCS8qIFJlbWFpbmRlciBpbiBuMW4wLiAgKi8KLQkJCWlmIChycCAhPSAwKSB7Ci0JCQkJcnIucy5sb3cgPSBuMDsKLQkJCQlyci5zLmhpZ2ggPSBuMTsKLQkJCQkqcnAgPSByci5sbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIDBxID0gTk4gLyBkZCAqLwotCi0JCQljb3VudF9sZWFkaW5nX3plcm9zKGJtLCBkMSk7Ci0JCQlpZiAoYm0gPT0gMCkgewotCQkJCS8qIEZyb20gKG4xID49IGQxKSAvXCAodGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGQxIGlzIHNldCksCi0JCQkJICAgY29uY2x1ZGUgKHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBuMSBpcyBzZXQpIC9cICh0aGUKLQkJCQkgICBxdW90aWVudCBkaWdpdCBxMCA9IDAgb3IgMSkuCi0KLQkJCQkgICBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWNlc3NhcnksIG5vdCBhbiBvcHRpbWl6YXRpb24uICAqLwotCi0JCQkJLyogVGhlIGNvbmRpdGlvbiBvbiB0aGUgbmV4dCBsaW5lIHRha2VzIGFkdmFudGFnZSBvZiB0aGF0Ci0JCQkJICAgbjEgPj0gZDEgKHRydWUgZHVlIHRvIHByb2dyYW0gZmxvdykuICAqLwotCQkJCWlmIChuMSA+IGQxIHx8IG4wID49IGQwKSB7Ci0JCQkJCXEwID0gMTsKLQkJCQkJc3ViX2RkbW1zcyhuMSwgbjAsIG4xLCBuMCwgZDEsIGQwKTsKLQkJCQl9IGVsc2UKLQkJCQkJcTAgPSAwOwotCi0JCQkJcTEgPSAwOwotCi0JCQkJaWYgKHJwICE9IDApIHsKLQkJCQkJcnIucy5sb3cgPSBuMDsKLQkJCQkJcnIucy5oaWdoID0gbjE7Ci0JCQkJCSpycCA9IHJyLmxsOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdTMyIG0xLCBtMDsKLQkJCQkvKiBOb3JtYWxpemUuICAqLwotCi0JCQkJYiA9IFNJX1RZUEVfU0laRSAtIGJtOwotCi0JCQkJZDEgPSAoZDEgPDwgYm0pIHwgKGQwID4+IGIpOwotCQkJCWQwID0gZDAgPDwgYm07Ci0JCQkJbjIgPSBuMSA+PiBiOwotCQkJCW4xID0gKG4xIDw8IGJtKSB8IChuMCA+PiBiKTsKLQkJCQluMCA9IG4wIDw8IGJtOwotCi0JCQkJdWRpdl9xcm5uZChxMCwgbjEsIG4yLCBuMSwgZDEpOwotCQkJCXVtdWxfcHBtbShtMSwgbTAsIHEwLCBkMCk7Ci0KLQkJCQlpZiAobTEgPiBuMSB8fCAobTEgPT0gbjEgJiYgbTAgPiBuMCkpIHsKLQkJCQkJcTAtLTsKLQkJCQkJc3ViX2RkbW1zcyhtMSwgbTAsIG0xLCBtMCwgZDEsIGQwKTsKLQkJCQl9Ci0KLQkJCQlxMSA9IDA7Ci0KLQkJCQkvKiBSZW1haW5kZXIgaW4gKG4xbjAgLSBtMW0wKSA+PiBibS4gICovCi0JCQkJaWYgKHJwICE9IDApIHsKLQkJCQkJc3ViX2RkbW1zcyhuMSwgbjAsIG4xLCBuMCwgbTEsIG0wKTsKLQkJCQkJcnIucy5sb3cgPSAobjEgPDwgYikgfCAobjAgPj4gYm0pOwotCQkJCQlyci5zLmhpZ2ggPSBuMSA+PiBibTsKLQkJCQkJKnJwID0gcnIubGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jd3cucy5sb3cgPSBxMDsKLQl3dy5zLmhpZ2ggPSBxMTsKLQlyZXR1cm4gd3cubGw7Ci19Ci0KLXU2NCBfX3VkaXZkaTModTY0IG4sIHU2NCBkKQotewotCXJldHVybiBfX3VkaXZtb2RkaTQobiwgZCwgKHU2NCAqKSAwKTsKLX0KLQotdTY0IF9fdW1vZGRpMyh1NjQgdSwgdTY0IHYpCi17Ci0JdTY0IHc7Ci0KLQkodm9pZClfX3VkaXZtb2RkaTQodSwgdiwgJncpOwotCi0JcmV0dXJuIHc7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1YThiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxIEBACisJenJlbGFkZHIteSA6PSAweGYwMDA4MDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2FhZWQyMDAwLmMgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2FhZWQyMDAwLmMKaW5kZXggNTQxN2NhMy4uYzlkODk5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9hYWVkMjAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvYWFlZDIwMDAuYwpAQCAtNDAsOSArNDAsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChBQUVEMjAwMCwgIkFnaWxlbnQgQUFFRC0yMDAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EiKQotCUJPT1RfTUVNKDB4ZjAwMDAwMDAsIFBJT19CQVNFLCBWSU9fQkFTRSkKLQlNQVBJTyhhYWVkMjAwMF9tYXBfaW8pCi0JSU5JVElSUShhYWVkMjAwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EgKi8KKwkucGh5c19yYW0JPSAweGYwMDAwMDAwLAorCS5waHlzX2lvCT0gUElPX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChWSU9fQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gYWFlZDIwMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGFhZWQyMDAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmYWFlYzIwMDBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwppbmRleCBmYzE0NWIzLi5hZWNlMGNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtMTI4LDggKzEyOCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGFhZWMyMDAwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiQUFFQy0yMDAwIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBhYWVjMjAwMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBhYWVjMjAwMF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgYWFlYzIwMDBfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCmluZGV4IGMxMDY3MDQuLmRjNzNmZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKQEAgLTU5LDExICs1OSwxMyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEFVVENQVTEyLCAiYXV0cm9uaXggYXV0Y3B1MTIiKQotCU1BSU5UQUlORVIoIlRob21hcyBHbGVpeG5lciIpCi0gICAgICAgIEJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAyMDAwMCkKLQlNQVBJTyhhdXRjcHUxMl9tYXBfaW8pCi0JSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBUaG9tYXMgR2xlaXhuZXIgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDIwMDAwLAorCS5tYXBfaW8JCT0gYXV0Y3B1MTJfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKaW5kZXggNzY2NGY5Yy4uYTQ2YzgyYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYwpAQCAtNDksMTAgKzQ5LDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ0RCODk3MTIsICJDaXJydXMtQ0RCODk3MTIiKQotCU1BSU5UQUlORVIoIlJheSBMZWh0aW5pZW1pIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGZmMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oY2RiODk3MTJfbWFwX2lvKQotCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogUmF5IExlaHRpbmllbWkgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gY2RiODk3MTJfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCmluZGV4IGU0MDkzYmUuLjc4MGQ5MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKQEAgLTUzLDEwICs1MywxMiBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoQ0VJVkEsICJDRUlWQS9Qb2xhcm9pZCBQaG90byBNQVggRGlnaXRhbCBQaWN0dXJlIEZyYW1lIikKLQlNQUlOVEFJTkVSKCJSb2IgU2NvdHQiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhjZWl2YV9tYXBfaW8pCi0JSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBSb2IgU2NvdHQgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gY2VpdmFfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCmluZGV4IDljYTIxY2IuLmM4M2YzZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKQEAgLTM3LDEyICszNywxNCBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoQ0xFUDcyMTIsICJDaXJydXMgTG9naWMgNzIxMi83MzEyIikKLQlNQUlOVEFJTkVSKCJOb2JvZHkiKQotICAgICAgICBCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGZmMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JRklYVVAoZml4dXBfY2xlcDczMTIpCi0JTUFQSU8oY2xwczcxMXhfbWFwX2lvKQotCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTm9ib2R5ICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZmMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuZml4dXAJCT0gZml4dXBfY2xlcDczMTIsCisJLm1hcF9pbwkJPSBjbHBzNzExeF9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCmluZGV4IGM2YzQ2MzIuLjI1NWM5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYwpAQCAtNTEsMTEgKzUxLDEzIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRURCNzIxMSwgIkNMLUVEQjcyMTEgKEVQNzIxMSBldmFsIGJvYXJkKSIpCi0JTUFJTlRBSU5FUigiSm9uIE1jQ2xpbnRvY2siKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAyMDEwMCkJLyogMHhjMDAwMDAwMCAtIDB4YzAwMWZmZmYgY2FuIGJlIHZpZGVvIFJBTSAqLwotCUZJWFVQKGZpeHVwX2VkYjcyMTEpCi0JTUFQSU8oZWRiNzIxMV9tYXBfaW8pCi0JSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBKb24gTWNDbGludG9jayAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMjAxMDAsCS8qIDB4YzAwMDAwMDAgLSAweGMwMDFmZmZmIGNhbiBiZSB2aWRlbyBSQU0gKi8KKwkuZml4dXAJCT0gZml4dXBfZWRiNzIxMSwKKwkubWFwX2lvCQk9IGVkYjcyMTFfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IGMxYzViOGUuLmY4M2E1OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTc1LDExICs3NSwxMyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEZPUlRVTkVULCAiQVJNLUZvcnR1TmV0IikKLQlNQUlOVEFJTkVSKCJGb3J0dU5ldCBJbmMuIikKLSAgICAgICAgQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMDAwKQotCUZJWFVQKGZvcnR1bmV0X2ZpeHVwKQotCU1BUElPKGNscHM3MTF4X21hcF9pbykKLQlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEZvcnR1TmV0IEluYy4gKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMDAwLAorCS5maXh1cAkJPSBmb3J0dW5ldF9maXh1cCwKKwkubWFwX2lvCQk9IGNscHM3MTF4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwppbmRleCAyOTI2OWRmLi41YmRiOTBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCkBAIC03OSwxMiArNzksMTQgQEAKIH0KIAogTUFDSElORV9TVEFSVChQNzIwVCwgIkFSTS1Qcm9zcGVjdG9yNzIwVCIpCi0JTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCUZJWFVQKGZpeHVwX3A3MjB0KQotCU1BUElPKHA3MjB0X21hcF9pbykKLQlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5maXh1cAkJPSBmaXh1cF9wNzIwdCwKKwkubWFwX2lvCQk9IHA3MjB0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYwppbmRleCAzODNkNGUwLi4xYTIzZjBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYwpAQCAtNTcsOCArNTcsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjbHBzNzExeF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkNMUFM3MTF4IFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBwNzIwdF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBwNzIwdF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2xwczcxMXhfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwppbmRleCAwYmM3ZGE0Li4xMTJmMWQ2OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKQEAgLTI5OCw4ICsyOTgsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjbHBzNzUwMF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkNMUFM3NTAwIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBjbHBzNzUwMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBjbHBzNzUwMF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtMzY2LDExICszNjYsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTFBTNzUwMCwgIkNMLVBTNzUwMCIpCi0JTUFJTlRBSU5FUigiUGhpbGlwIEJsdW5kZWxsIikKLQlCT09UX01FTSgweDEwMDAwMDAwLCAweDAzMDAwMDAwLCAweGUwMDAwMDAwKQotCU1BUElPKGNscHM3NTAwX21hcF9pbykKLQlJTklUSVJRKGNscHM3NTAwX2luaXRfaXJxKQotCQkuaW5pdF9tYWNoaW5lCT0gY2xwczc1MDBfaW5pdCwKLQkJLnRpbWVyCQk9ICZjbHBzNzUwMF90aW1lciwKKwkvKiBNYWludGFpbmVyOiBQaGlsaXAgQmx1bmRlbGwgKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHgwMzAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGNscHM3NTAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBjbHBzNzUwMF9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gY2xwczc1MDBfaW5pdCwKKwkudGltZXIJCT0gJmNscHM3NTAwX3RpbWVyLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKaW5kZXggZWYzNjJkNC4uMjNjNGRhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCkBAIC0xNzMsOCArMTczLDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZWJzYTExMF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkVCU0ExMTAgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGVic2ExMTBfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gZWJzYTExMF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtMjMzLDEzICsyMzMsMTUgQEAKIGFyY2hfaW5pdGNhbGwoZWJzYTExMF9pbml0KTsKIAogTUFDSElORV9TVEFSVChFQlNBMTEwLCAiRUJTQTExMCIpCi0JTUFJTlRBSU5FUigiUnVzc2VsbCBLaW5nIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCAweGUwMDAwMDAwLCAweGUwMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDA0MDApCi0JRElTQUJMRV9QQVJQT1JUKDApCi0JRElTQUJMRV9QQVJQT1JUKDIpCi0JU09GVF9SRUJPT1QKLQlNQVBJTyhlYnNhMTEwX21hcF9pbykKLQlJTklUSVJRKGVic2ExMTBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZTAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDQwMCwKKwkucmVzZXJ2ZV9scDAJPSAxLAorCS5yZXNlcnZlX2xwMgk9IDEsCisJLnNvZnRfcmVib290CT0gMSwKKwkubWFwX2lvCQk9IGVic2ExMTBfbWFwX2lvLAorCS5pbml0X2lycQk9IGVic2ExMTBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlYnNhMTEwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvYXJjaC5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMKaW5kZXggMWI0MDM0MC4uN2RhYTAyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMKQEAgLTYzLDEwICs2MywxMiBAQAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgZXB4YTEwZGJfdGltZXI7CiAKIE1BQ0hJTkVfU1RBUlQoQ0FNRUxPVCwgIkFsdGVyYSBFcHhhMTBkYiIpCi0JTUFJTlRBSU5FUigiQWx0ZXJhIENvcnBvcmF0aW9uIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCAweDdmZmZjMDAwLCAweGZmZmZjMDAwKQotCU1BUElPKGVweGExMGRiX21hcF9pbykKLQlJTklUSVJRKGVweGExMGRiX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEFsdGVyYSBDb3Jwb3JhdGlvbiAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDdmZmZjMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZmZmYzAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gZXB4YTEwZGJfbWFwX2lvLAorCS5pbml0X2lycQk9IGVweGExMGRiX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXB4YTEwZGJfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jCmluZGV4IDFiOTkxZjMuLjRiMTA4NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jCkBAIC01Niw4ICs1Niw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGVweGExMGRiX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiRXhjYWxpYnVyIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBlcHhhMTBkYl90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBlcHhhMTBkYl90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKaW5kZXggZDFjZWQ4Ni4uNDliODk4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCkBAIC04NCwxMiArODQsMTQgQEAKIH0KIAogTUFDSElORV9TVEFSVChDQVRTLCAiQ2hhbGljZS1DQVRTIikKLQlNQUlOVEFJTkVSKCJQaGlsaXAgQmx1bmRlbGwiKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIERDMjEyODVfQVJNQ1NSX0JBU0UsIDB4ZmUwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlTT0ZUX1JFQk9PVAotCUZJWFVQKGZpeHVwX2NhdHMpCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFBoaWxpcCBCbHVuZGVsbCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLnNvZnRfcmVib290CT0gMSwKKwkuZml4dXAJCT0gZml4dXBfY2F0cywKKwkubWFwX2lvCQk9IGZvb3RicmlkZ2VfbWFwX2lvLAorCS5pbml0X2lycQk9IGZvb3RicmlkZ2VfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpc2FfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYwppbmRleCBlMTU0MTkxLi41NDhhNzkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYwpAQCAtMjgsMTEgKzI4LDEzIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ08yODUsICJjby1FQlNBMjg1IikKLQlNQUlOVEFJTkVSKCJNYXJrIHZhbiBEb2VzYnVyZyIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgREMyMTI4NV9BUk1DU1JfQkFTRSwgMHg3Y2YwMDAwMCkKLQlGSVhVUChmaXh1cF9jb2Vic2EyODUpCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1hcmsgdmFuIERvZXNidXJnICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IERDMjEyODVfQVJNQ1NSX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKCgweDdjZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmZpeHVwCQk9IGZpeHVwX2NvZWJzYTI4NSwKKwkubWFwX2lvCQk9IGZvb3RicmlkZ2VfbWFwX2lvLAorCS5pbml0X2lycQk9IGZvb3RicmlkZ2VfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZmb290YnJpZGdlX3RpbWVyLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKaW5kZXggZGE1YjliNy4uMTRhNjJkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBmb290YnJpZGdlX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiVGltZXIxIHRpbWVyIHRpY2siLAogCS5oYW5kbGVyCT0gdGltZXIxX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYwppbmRleCBkMDkzMWY1Li4xYzM3NjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKQEAgLTEzLDEyICsxMywxNSBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKEVCU0EyODUsICJFQlNBMjg1IikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmciKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIERDMjEyODVfQVJNQ1NSX0JBU0UsIDB4ZmUwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlWSURFTygweDAwMGEwMDAwLCAweDAwMGJmZmZmKQotCU1BUElPKGZvb3RicmlkZ2VfbWFwX2lvKQotCUlOSVRJUlEoZm9vdGJyaWRnZV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcgKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gREMyMTI4NV9BUk1DU1JfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmUwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS52aWRlb19zdGFydAk9IDB4MDAwYTAwMDAsCisJLnZpZGVvX2VuZAk9IDB4MDAwYmZmZmYsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwppbmRleCBhNGZlZmEwLi5jMWQ3NGY3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwpAQCAtNzIsNyArNzIsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXNhX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSVNBIHRpbWVyIHRpY2siLAogCS5oYW5kbGVyCT0gaXNhX3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCmluZGV4IDFlMWRmZDcuLjc3NWY4NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKQEAgLTY0NywxNCArNjQ3LDE3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTkVUV0lOREVSLCAiUmViZWwtTmV0V2luZGVyIikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmcvUmViZWwuY29tIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweGZlMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JVklERU8oMHgwMDBhMDAwMCwgMHgwMDBiZmZmZikKLQlESVNBQkxFX1BBUlBPUlQoMCkKLQlESVNBQkxFX1BBUlBPUlQoMikKLQlGSVhVUChmaXh1cF9uZXR3aW5kZXIpCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZy9SZWJlbC5jb20gKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gREMyMTI4NV9BUk1DU1JfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmUwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS52aWRlb19zdGFydAk9IDB4MDAwYTAwMDAsCisJLnZpZGVvX2VuZAk9IDB4MDAwYmZmZmYsCisJLnJlc2VydmVfbHAwCT0gMSwKKwkucmVzZXJ2ZV9scDIJPSAxLAorCS5maXh1cAkJPSBmaXh1cF9uZXR3aW5kZXIsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXNhX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKaW5kZXggNDE1MDg2ZC4uMDE0NmI4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKQEAgLTEzLDExICsxMywxMyBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKFBFUlNPTkFMX1NFUlZFUiwgIkNvbXBhcS1QZXJzb25hbFNlcnZlciIpCi0JTUFJTlRBSU5FUigiSmFtZXkgSGlja3MgLyBHZW9yZ2UgRnJhbmNlIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweGZlMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZSAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAxLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMS5jCmluZGV4IDc0MzY1NjguLmFmOWU0YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDEuYwpAQCAtNDEsOCArNDEsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBoNzIwMV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gImg3MjAxIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBoNzIwMV90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBoNzIwMV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKaW5kZXggMjFiOGZiNi4uNTkzYjZhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCkBAIC0xNzEsOCArMTcxLDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaDcyMDJfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJoNzIwMiBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gaDcyMDJfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaDcyMDJfdGltZXJfaW50ZXJydXB0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKaW5kZXggOWIyNGI5Yi4uZmE1OWU5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKQEAgLTMwLDEwICszMCwxMiBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKEg3MjAxLCAiSHluaXggR01TMzBDNzIwMSIpCi0JTUFJTlRBSU5FUigiUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCIpCi0JQk9PVF9NRU0oMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAxMDAwKQotCU1BUElPKGg3MjB4X21hcF9pbykKLQlJTklUSVJRKGg3MjB4X2luaXRfaXJxKQotCS50aW1lciA9ICZoNzIwMV90aW1lciwKKwkvKiBNYWludGFpbmVyOiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4ICovCisJLnBoeXNfcmFtCT0gMHg0MDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGYwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMTAwMCwKKwkubWFwX2lvCQk9IGg3MjB4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBoNzIweF9pbml0X2lycSwKKwkudGltZXIJCT0gJmg3MjAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKaW5kZXggMzQ1NmEwMC4uZGI5MDc4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKQEAgLTcxLDExICs3MSwxMyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEg3MjAyLCAiSHluaXggSE1TMzBDNzIwMiIpCi0JTUFJTlRBSU5FUigiUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCIpCi0JQk9PVF9NRU0oMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweDQwMDAwMTAwKQotCU1BUElPKGg3MjB4X21hcF9pbykKLQlJTklUSVJRKGg3MjAyX2luaXRfaXJxKQotCS50aW1lciA9ICZoNzIwMl90aW1lciwKLQlJTklUX01BQ0hJTkUoaW5pdF9ldmFsX2g3MjAyKQorCS8qIE1haW50YWluZXI6IFJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXggKi8KKwkucGh5c19yYW0JPSAweDQwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDQwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDcyMHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGg3MjAyX2luaXRfaXJxLAorCS50aW1lcgkJPSAmaDcyMDJfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGluaXRfZXZhbF9oNzIwMiwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCmluZGV4IDYyNWRkMDEuLjVkMjU0MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCkBAIC03OCwxMSArNzgsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChNWDFBRFMsICJNb3Rvcm9sYSBNWDFBRFMiKQotCU1BSU5UQUlORVIoIlNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgiKQotCUJPT1RfTUVNKDB4MDgwMDAwMDAsIDB4MDAyMDAwMDAsIDB4ZTAyMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwODAwMDEwMCkKLQlNQVBJTyhteDFhZHNfbWFwX2lvKQotCUlOSVRJUlEoaW14X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXggKi8KKwkucGh5c19yYW0JPSAweDA4MDAwMDAwLAorCS5waHlzX2lvCT0gMHgwMDIwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAyMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDA4MDAwMTAwLAorCS5tYXBfaW8JCT0gbXgxYWRzX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpbXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpbXhfdGltZXIsCi0JSU5JVF9NQUNISU5FKG14MWFkc19pbml0KQorCS5pbml0X21hY2hpbmUJPSBteDFhZHNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKaW5kZXggMTFmMWU1Ni4uZWE4MDViZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYwpAQCAtNzIsOCArNzIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpbXhfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJpLk1YIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBpbXhfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaW14X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwppbmRleCBiZDFlNWUzLi5kYWNiZjUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvY20uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KQEAgLTE1NiwxNiArMTU3LDYgQEAKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKCh4KSAvIFRJQ0tTX1BFUl91U0VDKQogI2VuZGlmCiAKLS8qCi0gKiBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwotICovCi10eXBlZGVmIHN0cnVjdCBUaW1lclN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBUaW1lckxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDb250cm9sOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDbGVhcjsKLX0gVGltZXJTdHJ1Y3RfdDsKLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfcmVsb2FkOwogCiAvKgpAQCAtMTc0LDcgKzE2NSw2IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgaW50ZWdyYXRvcl9nZXR0aW1lb2Zmc2V0KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKIAl1bnNpZ25lZCBsb25nIHRpY2tzMSwgdGlja3MyLCBzdGF0dXM7CiAKIAkvKgpAQCAtMTgzLDExICsxNzMsMTEgQEAKIAkgKiBhbiBpbnRlcnJ1cHQuICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgZW5zdXJpbmcgdGhhdCB0aGUKIAkgKiBjb3VudGVyIGhhcyBub3QgcmVsb2FkZWQgYmV0d2VlbiBvdXIgdHdvIHJlYWRzLgogCSAqLwotCXRpY2tzMiA9IHRpbWVyMS0+VGltZXJWYWx1ZSAmIDB4ZmZmZjsKKwl0aWNrczIgPSByZWFkbChUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKSAmIDB4ZmZmZjsKIAlkbyB7CiAJCXRpY2tzMSA9IHRpY2tzMjsKIAkJc3RhdHVzID0gX19yYXdfcmVhZGwoVkFfSUNfQkFTRSArIElSUV9SQVdfU1RBVFVTKTsKLQkJdGlja3MyID0gdGltZXIxLT5UaW1lclZhbHVlICYgMHhmZmZmOworCQl0aWNrczIgPSByZWFkbChUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKSAmIDB4ZmZmZjsKIAl9IHdoaWxlICh0aWNrczIgPiB0aWNrczEpOwogCiAJLyoKQEAgLTIxMywxNCArMjAzLDEyIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QKIGludGVncmF0b3JfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKLQogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCiAJLyoKIAkgKiBjbGVhciB0aGUgaW50ZXJydXB0CiAJICovCi0JdGltZXIxLT5UaW1lckNsZWFyID0gMTsKKwl3cml0ZWwoMSwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9JTlRDTFIpOwogCiAJLyoKIAkgKiB0aGUgY2xvY2sgdGljayByb3V0aW5lcyBhcmUgb25seSBwcm9jZXNzZWQgb24gdGhlCkBAIC0yNDcsOCArMjM1LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaW50ZWdyYXRvcl90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkludGVncmF0b3IgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGludGVncmF0b3JfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaW50ZWdyYXRvcl90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtMjU2LDMyICsyNDQsMjkgQEAKICAqLwogdm9pZCBfX2luaXQgaW50ZWdyYXRvcl90aW1lX2luaXQodW5zaWduZWQgbG9uZyByZWxvYWQsIHVuc2lnbmVkIGludCBjdHJsKQogewotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMCA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIwX1ZBX0JBU0U7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjIgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMl9WQV9CQVNFOwotCXVuc2lnbmVkIGludCB0aW1lcl9jdHJsID0gMHg4MCB8IDB4NDA7CS8qIHBlcmlvZGljICovCisJdW5zaWduZWQgaW50IHRpbWVyX2N0cmwgPSBUSU1FUl9DVFJMX0VOQUJMRSB8IFRJTUVSX0NUUkxfUEVSSU9ESUM7CiAKIAl0aW1lcl9yZWxvYWQgPSByZWxvYWQ7CiAJdGltZXJfY3RybCB8PSBjdHJsOwogCiAJaWYgKHRpbWVyX3JlbG9hZCA+IDB4MTAwMDAwKSB7CiAJCXRpbWVyX3JlbG9hZCA+Pj0gODsKLQkJdGltZXJfY3RybCB8PSAweDA4OyAvKiAvMjU2ICovCisJCXRpbWVyX2N0cmwgfD0gVElNRVJfQ1RSTF9ESVYyNTY7CiAJfSBlbHNlIGlmICh0aW1lcl9yZWxvYWQgPiAweDAxMDAwMCkgewogCQl0aW1lcl9yZWxvYWQgPj49IDQ7Ci0JCXRpbWVyX2N0cmwgfD0gMHgwNDsgLyogLzE2ICovCisJCXRpbWVyX2N0cmwgfD0gVElNRVJfQ1RSTF9ESVYxNjsKIAl9CiAKIAkvKgogCSAqIEluaXRpYWxpc2UgdG8gYSBrbm93biBzdGF0ZSAoYWxsIHRpbWVycyBvZmYpCiAJICovCi0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSAwOwotCXRpbWVyMS0+VGltZXJDb250cm9sID0gMDsKLQl0aW1lcjItPlRpbWVyQ29udHJvbCA9IDA7CisJd3JpdGVsKDAsIFRJTUVSMF9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CisJd3JpdGVsKDAsIFRJTUVSMV9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CisJd3JpdGVsKDAsIFRJTUVSMl9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CiAKLQl0aW1lcjEtPlRpbWVyTG9hZCAgICA9IHRpbWVyX3JlbG9hZDsKLQl0aW1lcjEtPlRpbWVyVmFsdWUgICA9IHRpbWVyX3JlbG9hZDsKLQl0aW1lcjEtPlRpbWVyQ29udHJvbCA9IHRpbWVyX2N0cmw7CisJd3JpdGVsKHRpbWVyX3JlbG9hZCwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9MT0FEKTsKKwl3cml0ZWwodGltZXJfcmVsb2FkLCBUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKTsKKwl3cml0ZWwodGltZXJfY3RybCwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9DVFJMKTsKIAogCS8qCiAJICogTWFrZSBpcnFzIGhhcHBlbiBmb3IgdGhlIHN5c3RlbSB0aW1lcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggOTFiYTlmZC4uMzZlMmI2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC0yOTIsMTEgKzI5MiwxMyBAQAogfTsKIAogTUFDSElORV9TVEFSVChJTlRFR1JBVE9SLCAiQVJNLUludGVncmF0b3IiKQotCU1BSU5UQUlORVIoIkFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQiKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIDB4MTYwMDAwMDAsIDB4ZjE2MDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlNQVBJTyhhcF9tYXBfaW8pCi0JSU5JVElSUShhcF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4MTYwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGYxNjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IGFwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBhcF9pbml0X2lycSwKIAkudGltZXIJCT0gJmFwX3RpbWVyLAotCUlOSVRfTUFDSElORShhcF9pbml0KQorCS5pbml0X21hY2hpbmUJPSBhcF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IGUwYTAxZWUuLjU2OWYzMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNTMyLDExICs1MzIsMTMgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoQ0lOVEVHUkFUT1IsICJBUk0tSW50ZWdyYXRvckNQIikKLQlNQUlOVEFJTkVSKCJBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCAweDE2MDAwMDAwLCAweGYxNjAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaW50Y3BfbWFwX2lvKQotCUlOSVRJUlEoaW50Y3BfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDE2MDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpbnRjcF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaW50Y3BfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjcF90aW1lciwKLQlJTklUX01BQ0hJTkUoaW50Y3BfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gaW50Y3BfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BsYXRzbXAuYwppbmRleCBlYWQxNWRmLi5hZWNmNDdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wbGF0c21wLmMKQEAgLTI3LDEyICsyNywxMiBAQAogICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5CiAgKiBib290ICJob2xkaW5nIHBlbiIKICAqLwotdm9sYXRpbGUgaW50IF9faW5pdGRhdGEgcGVuX3JlbGVhc2UgPSAtMTsKLXVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwaHlzX3Blbl9yZWxlYXNlID0gMDsKK3ZvbGF0aWxlIGludCBfX2NwdWluaXRkYXRhIHBlbl9yZWxlYXNlID0gLTE7Cit1bnNpZ25lZCBsb25nIF9fY3B1aW5pdGRhdGEgcGh5c19wZW5fcmVsZWFzZSA9IDA7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYm9vdF9sb2NrKTsKIAotdm9pZCBfX2luaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJLyoKIAkgKiB0aGUgcHJpbWFyeSBjb3JlIG1heSBoYXZlIHVzZWQgYSAiY3Jvc3MgY2FsbCIgc29mdCBpbnRlcnJ1cHQKQEAgLTYxLDcgKzYxLDcgQEAKIAlzcGluX3VubG9jaygmYm9vdF9sb2NrKTsKIH0KIAotaW50IF9faW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKQEAgLTE3NCwxMSArMTc0LDEzIEBACiAJCW1heF9jcHVzID0gbmNvcmVzOwogCiAJLyoKLQkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hc2sgLSB0aGlzIHRlbGxzIHVzIHdoaWNoIENQVXMgc2hvdWxkCi0JICogYmUgcHJlc2VudC4KKwkgKiBJbml0aWFsaXNlIHRoZSBwb3NzaWJsZS9wcmVzZW50IG1hcHMuCisJICogY3B1X3Bvc3NpYmxlX21hcCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzIHdoaWNoIG1heSBiZSBwcmVzZW50CisJICogY3B1X3ByZXNlbnRfbWFwIGRlc2NyaWJlcyB0aGUgc2V0IG9mIENQVXMgcG9wdWxhdGVkCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspIHsKLQkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXNrKTsKKwkJY3B1X3NldChpLCBjcHVfcG9zc2libGVfbWFwKTsKKwkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXApOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCmluZGV4IGJmMjNlMGYuLjBmOTIxYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCkBAIC0xNDYsMjMgKzE0NiwyNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTgwMzIxKQogTUFDSElORV9TVEFSVChJUTgwMzIxLCAiSW50ZWwgSVE4MDMyMSIpCi0JTUFJTlRBSU5FUigiSW50ZWwgQ29ycG9yYXRpb24iKQotCUJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJUTgwMzIxX1VBUlQsIElRODAzMjFfVUFSVCkKLQlNQVBJTyhpcTgwMzIxX21hcF9pbykKLQlJTklUSVJRKGlvcDMyMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3Jwb3JhdGlvbiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVE4MDMyMV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoSVE4MDMyMV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpcTgwMzIxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpb3AzMjFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb3AzMjFfdGltZXIsCi0gICAgQk9PVF9QQVJBTVMoMHhhMDAwMDEwMCkKLQlJTklUX01BQ0hJTkUoaW9wMzJ4X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzJ4X2luaXQsCiBNQUNISU5FX0VORAogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTMxMjQ0KQogTUFDSElORV9TVEFSVChJUTMxMjQ0LCAiSW50ZWwgSVEzMTI0NCIpCi0gICAgTUFJTlRBSU5FUigiSW50ZWwgQ29ycC4iKQotICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJUTMxMjQ0X1VBUlQsIElRMzEyNDRfVUFSVCkKLSAgICBNQVBJTyhpcTMxMjQ0X21hcF9pbykKLSAgICBJTklUSVJRKGlvcDMyMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVEzMTI0NF9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoSVEzMTI0NF9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpcTMxMjQ0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpb3AzMjFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb3AzMjFfdGltZXIsCi0gICAgQk9PVF9QQVJBTVMoMHhhMDAwMDEwMCkKLQlJTklUX01BQ0hJTkUoaW9wMzJ4X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzJ4X2luaXQsCiBNQUNISU5FX0VORAogI2Vsc2UKICNlcnJvciBObyBtYWNoaW5lIGRlc2NyaXB0b3IgZGVmaW5lZCBmb3IgdGhpcyBJT1AzWFggaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jCmluZGV4IDliN2RkNjQuLmQ1M2FmMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwpAQCAtODYsNyArODYsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaW9wMzIxX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSU9QMzIxIFRpbWVyIFRpY2siLAogCS5oYW5kbGVyCT0gaW9wMzIxX3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGlvcDMyMV90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jCmluZGV4IDYyMmU3OTEuLmZjNzRiNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jCkBAIC0xNDgsMjYgKzE0OCwyOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTgwMzMxKQogTUFDSElORV9TVEFSVChJUTgwMzMxLCAiSW50ZWwgSVE4MDMzMSIpCi0gICAgTUFJTlRBSU5FUigiSW50ZWwgQ29ycC4iKQotICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCAweGZlZmZmMDAwLCAweGZmZmZmMDAwKSAvLyB2aXJ0dWFsLCBwaHlzaWNhbAotICAgIC8vQk9PVF9NRU0oUEhZU19PRkZTRVQsIElPUDMzMV9VQVJUMF9WSVJULCBJT1AzMzFfVUFSVDBfUEhZUykKLSAgICBNQVBJTyhpcTgwMzMxX21hcF9pbykKLSAgICBJTklUSVJRKGlvcDMzMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gMHhmZWZmZjAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmZmZmYwMDApID4+IDE4KSAmIDB4ZmZmYywgLy8gdmlydHVhbCwgcGh5c2ljYWwKKwkubWFwX2lvCQk9IGlxODAzMzFfbWFwX2lvLAorCS5pbml0X2lycQk9IGlvcDMzMV9pbml0X2lycSwKIAkudGltZXIJCT0gJmlvcDMzMV90aW1lciwKLSAgICBCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGlvcDMzeF9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzN4X2luaXQsCiBNQUNISU5FX0VORAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lRODAzMzIpCiBNQUNISU5FX1NUQVJUKElRODAzMzIsICJJbnRlbCBJUTgwMzMyIikKLSAgICBNQUlOVEFJTkVSKCJJbnRlbCBDb3JwLiIpCi0gICAgQk9PVF9NRU0oUEhZU19PRkZTRVQsIDB4ZmVmZmYwMDAsIDB4ZmZmZmYwMDApIC8vIHZpcnR1YWwsIHBoeXNpY2FsCi0gICAgLy9CT09UX01FTShQSFlTX09GRlNFVCwgSU9QMzMxX1VBUlQwX1ZJUlQsIElPUDMzMV9VQVJUMF9QSFlTKQotICAgIE1BUElPKGlxODAzMzJfbWFwX2lvKQotICAgIElOSVRJUlEoaW9wMzMxX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSAweGZlZmZmMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZmZmZjAwMCkgPj4gMTgpICYgMHhmZmZjLCAvLyB2aXJ0dWFsLCBwaHlzaWNhbAorCS5tYXBfaW8JCT0gaXE4MDMzMl9tYXBfaW8sCisJLmluaXRfaXJxCT0gaW9wMzMxX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaW9wMzMxX3RpbWVyLAotICAgIEJPT1RfUEFSQU1TKDB4MDEwMCkKLQlJTklUX01BQ0hJTkUoaW9wMzN4X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBpb3AzM3hfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYwppbmRleCBlMDE2OTY3Li4xYTZkOWQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvcDMzMV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIklPUDMzMSBUaW1lciBUaWNrIiwKIAkuaGFuZGxlcgk9IGlvcDMzMV90aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpb3AzMzFfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKaW5kZXggMGVlMzRhYy4uNDViMTg2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KQEAgLTEwMyw2ICsxMDMsMTEgQEAKIAkJLmxlbmd0aAkJPSBJWFAyMDAwX1BDSV9DU1JfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCiAJfSwgeworCQkudmlydHVhbAk9IElYUDIwMDBfTVNGX1ZJUlRfQkFTRSwKKwkJLnBoeXNpY2FsCT0gSVhQMjAwMF9NU0ZfUEhZU19CQVNFLAorCQkubGVuZ3RoCQk9IElYUDIwMDBfTVNGX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sIHsKIAkJLnZpcnR1YWwJPSBJWFAyMDAwX1BDSV9JT19WSVJUX0JBU0UsCiAJCS5waHlzaWNhbAk9IElYUDIwMDBfUENJX0lPX1BIWVNfQkFTRSwKIAkJLmxlbmd0aAkJPSBJWFAyMDAwX1BDSV9JT19TSVpFLApAQCAtMTIwLDE5ICsxMjUsNiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IGl4cDIwMDBfc2VyaWFsX3BvcnQgPSB7Ci0JLm1lbWJhc2UJPSAoY2hhciAqKShJWFAyMDAwX1VBUlRfVklSVF9CQVNFICsgMyksCi0JLm1hcGJhc2UJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFICsgMywKLQkuaXJxCQk9IElSUV9JWFAyMDAwX1VBUlQsCi0JLmZsYWdzCQk9IFVQRl9TS0lQX1RFU1QsCi0JLmlvdHlwZQkJPSBVUElPX01FTSwKLQkucmVnc2hpZnQJPSAyLAotCS51YXJ0Y2xrCT0gNTAwMDAwMDAsCi0JLmxpbmUJCT0gMCwKLQkudHlwZQkJPSBQT1JUX1hTQ0FMRSwKLQkuZmlmb3NpemUJPSAxNgotfTsKLQogdm9pZCBfX2luaXQgaXhwMjAwMF9tYXBfaW8odm9pZCkKIHsKIAlleHRlcm4gdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKQEAgLTE1MiwxMiArMTQ0LDUwIEBACiAJfQogCiAJaW90YWJsZV9pbml0KGl4cDIwMDBfaW9fZGVzYywgQVJSQVlfU0laRShpeHAyMDAwX2lvX2Rlc2MpKTsKLQllYXJseV9zZXJpYWxfc2V0dXAoJml4cDIwMDBfc2VyaWFsX3BvcnQpOwogCiAJLyogU2V0IHNsb3dwb3J0IHRvIDgtYml0IG1vZGUuICAqLwogCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfU0xPV1BPUlRfRlJNLCAxKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2VyaWFsIHBvcnQgc3VwcG9ydCBmb3IgSVhQMjAwMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGl4cDIwMDBfc2VyaWFsX3BvcnRbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKKwkJLm1lbWJhc2UJPSAoY2hhciAqKShJWFAyMDAwX1VBUlRfVklSVF9CQVNFICsgMyksCisJCS5pcnEJCT0gSVJRX0lYUDIwMDBfVUFSVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSA1MDAwMDAwMCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXhwMjAwMF91YXJ0X3Jlc291cmNlID0geworCS5zdGFydAkJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5lbmQJCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSArIDB4ZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeHAyMDAwX3NlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQkJPSBpeHAyMDAwX3NlcmlhbF9wb3J0LAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZpeHAyMDAwX3VhcnRfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBpeHAyMDAwX3VhcnRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaXhwMjAwMF9zZXJpYWxfZGV2aWNlKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGltZXItdGljayBmdW5jdGlvbnMgZm9yIElYUDIwMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTk0LDggKzIyNCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGl4cDIwMDBfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJJWFAyMDAwIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBpeHAyMDAwX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IGl4cDIwMDBfdGltZXJfaW50ZXJydXB0LAogfTsKIAogdm9pZCBfX2luaXQgaXhwMjAwMF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyB0aWNrX3JhdGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwppbmRleCBmM2EyOTFiLi45YWE1NGRlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCkBAIC0yMTksMTcgKzIxOSwyMCBAQAogc3RhdGljIHZvaWQgX19pbml0IGVucDI2MTFfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZW5wMjYxMV9kZXZpY2VzLCBBUlJBWV9TSVpFKGVucDI2MTFfZGV2aWNlcykpOworCWl4cDIwMDBfdWFydF9pbml0KCk7CiB9CiAKIAogTUFDSElORV9TVEFSVChFTlAyNjExLCAiUmFkaXN5cyBFTlAtMjYxMSBQQ0kgbmV0d29yayBwcm9jZXNzb3IgYm9hcmQiKQotCU1BSU5UQUlORVIoIkxlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwgSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKGl4cDIwMDBfbWFwX2lvKQotCUlOSVRJUlEoaXhwMjAwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5tYXBfaW8JCT0gaXhwMjAwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwMjAwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVucDI2MTFfdGltZXIsCi0JSU5JVF9NQUNISU5FKGVucDI2MTFfaW5pdF9tYWNoaW5lKQorCS5pbml0X21hY2hpbmUJPSBlbnAyNjExX2luaXRfbWFjaGluZSwKIE1BQ0hJTkVfRU5ECiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwppbmRleCBkZjNmZjI2Li5mZDI4MGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwpAQCAtMTY4LDEyICsxNjgsMTQgQEAKIH0KIAogTUFDSElORV9TVEFSVChJWERQMjQwMCwgIkludGVsIElYRFAyNDAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLCBJWFAyMDAwX1VBUlRfVklSVF9CQVNFKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaXhkcDJ4MDBfbWFwX2lvKQotCUlOSVRJUlEoaXhkcDI0MDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpeGRwMngwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhkcDI0MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMjQwMF90aW1lciwKLQlJTklUX01BQ0hJTkUoaXhkcDJ4MDBfaW5pdF9tYWNoaW5lKQorCS5pbml0X21hY2hpbmUJPSBpeGRwMngwMF9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IGFlYzEzYzcuLmY5MDczYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC00MiwxMiArNDIsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCi0KLXZvaWQgaXhkcDI0MDBfaW5pdF9pcnEodm9pZCkKLXsKLQlpeGRwMngwMF9pbml0X2lycShJWERQMjgwMF9DUExEX0lOVF9TVEFULCBJWERQMjgwMF9DUExEX0lOVF9NQVNLLCBJWERQMjQwMF9OUl9JUlFTKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElYRFAyODAwIHRpbWVyIHRpY2sKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjkwLDEyICsyODQsMTQgQEAKIH0KIAogTUFDSElORV9TVEFSVChJWERQMjgwMCwgIkludGVsIElYRFAyODAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLCBJWFAyMDAwX1VBUlRfVklSVF9CQVNFKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaXhkcDJ4MDBfbWFwX2lvKQotCUlOSVRJUlEoaXhkcDI4MDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpeGRwMngwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhkcDI4MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMjgwMF90aW1lciwKLQlJTklUX01BQ0hJTkUoaXhkcDJ4MDBfaW5pdF9tYWNoaW5lKQorCS5pbml0X21hY2hpbmUJPSBpeGRwMngwMF9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCmluZGV4IDVlNDM4MDcuLmE0MzM2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCkBAIC0zMDMsNSArMzAzLDYgQEAKIAlncGlvX2xpbmVfY29uZmlnKElYRFAyWDAwX0dQSU9fSTJDX0VOQUJMRSwgR1BJT19PVVQpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoaXhkcDJ4MDBfZGV2aWNlcywgQVJSQVlfU0laRShpeGRwMngwMF9kZXZpY2VzKSk7CisJaXhwMjAwMF91YXJ0X2luaXQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwppbmRleCBlOTRkYWNlLi40MzQ0N2RhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwpAQCAtMzcwLDMwICszNzAsMzUgQEAKIAkJKCgqSVhEUDJYMDFfQ1BMRF9GTEFTSF9SRUcgJiBJWERQMlgwMV9DUExEX0ZMQVNIX0JBTktfTUFTSykgKyAxKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGl4ZHAyeDAxX2RldmljZXMsIEFSUkFZX1NJWkUoaXhkcDJ4MDFfZGV2aWNlcykpOworCWl4cDIwMDBfdWFydF9pbml0KCk7CiB9CiAKIAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyNDAxCiBNQUNISU5FX1NUQVJUKElYRFAyNDAxLCAiSW50ZWwgSVhEUDI0MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsIElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlNQVBJTyhpeGRwMngwMV9tYXBfaW8pCi0JSU5JVElSUShpeGRwMngwMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChJWFAyMDAwX1VBUlRfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IGl4ZHAyeDAxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeGRwMngwMV9pbml0X2lycSwKIAkudGltZXIJCT0gJml4ZHAyeDAxX3RpbWVyLAotCUlOSVRfTUFDSElORShpeGRwMngwMV9pbml0X21hY2hpbmUpCisJLmluaXRfbWFjaGluZQk9IGl4ZHAyeDAxX2luaXRfbWFjaGluZSwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyODAxCiBNQUNISU5FX1NUQVJUKElYRFAyODAxLCAiSW50ZWwgSVhEUDI4MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsIElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlNQVBJTyhpeGRwMngwMV9tYXBfaW8pCi0JSU5JVElSUShpeGRwMngwMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChJWFAyMDAwX1VBUlRfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IGl4ZHAyeDAxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeGRwMngwMV9pbml0X2lycSwKIAkudGltZXIJCT0gJml4ZHAyeDAxX3RpbWVyLAotCUlOSVRfTUFDSElORShpeGRwMngwMV9pbml0X21hY2hpbmUpCisJLmluaXRfbWFjaGluZQk9IGl4ZHAyeDAxX2luaXRfbWFjaGluZSwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCmluZGV4IGFhOTJlMzcuLjJiNTQ0MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKQEAgLTQ1Myw4ICs0NTMsOCBAQAogCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQ09NTUFORCwgMiwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKIAogCXJlc1swXS5uYW1lID0gIlBDSSBJL08gU3BhY2UiOwotCXJlc1swXS5zdGFydCA9IDB4MDAwMDEwMDA7Ci0JcmVzWzBdLmVuZCA9IDB4ZmZmZjAwMDA7CisJcmVzWzBdLnN0YXJ0ID0gMHgwMDAwMDAwMDsKKwlyZXNbMF0uZW5kID0gMHgwMDAwZmZmZjsKIAlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwogCiAJcmVzWzFdLm5hbWUgPSAiUENJIE1lbW9yeSBTcGFjZSI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IGYzOWU4NDA4Li4wNDQ5MGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtMjk4LDggKzI5OCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGl4cDR4eF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIklYUDR4eCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gaXhwNHh4X3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IGl4cDR4eF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaXhwNHh4X3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKaW5kZXggOGEwNWExMi4uNGZmNDM5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKQEAgLTU2LDIxICs1NiwyNCBAQAogCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBjb3lvdGVfdWFydF9kYXRhID0gewotCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKLQkubWVtYmFzZQk9IChjaGFyICopSVhQNFhYX1VBUlQyX0JBU0VfVklSVCArIFJFR19PRkZTRVQsCi0JLmlycQkJPSBJUlFfSVhQNFhYX1VBUlQyLAotCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCS5yZWdzaGlmdAk9IDIsCi0JLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBjb3lvdGVfdWFydF9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKKwkJLmlycQkJPSBJUlFfSVhQNFhYX1VBUlQyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9LAorCXsgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNveW90ZV91YXJ0ID0gewogCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKIAkuaWQJCT0gMCwKIAkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmNveW90ZV91YXJ0X2RhdGEsCisJCS5wbGF0Zm9ybV9kYXRhCT0gY295b3RlX3VhcnRfZGF0YSwKIAl9LAogCS5udW1fcmVzb3VyY2VzCT0gMSwKIAkucmVzb3VyY2UJPSAmY295b3RlX3VhcnRfcmVzb3VyY2UsCkBAIC04NywxMCArOTAsMTAgQEAKIAkqSVhQNFhYX0VYUF9DUzEgPSAqSVhQNFhYX0VYUF9DUzA7CiAKIAlpZiAobWFjaGluZV9pc19peGRwZzQyNSgpKSB7Ci0JCWNveW90ZV91YXJ0X2RhdGEubWVtYmFzZSA9CisJCWNveW90ZV91YXJ0X2RhdGFbMF0ubWVtYmFzZSA9CiAJCQkoY2hhciopKElYUDRYWF9VQVJUMV9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VUKTsKLQkJY295b3RlX3VhcnRfZGF0YS5tYXBiYXNlID0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUzsKLQkJY295b3RlX3VhcnRfZGF0YS5pcnEgPSBJUlFfSVhQNFhYX1VBUlQxOworCQljb3lvdGVfdWFydF9kYXRhWzBdLm1hcGJhc2UgPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTOworCQljb3lvdGVfdWFydF9kYXRhWzBdLmlycSA9IElSUV9JWFA0WFhfVUFSVDE7CiAJfQogCiAKQEAgLTEwMCwxNCArMTAzLDE1IEBACiAKICNpZmRlZiBDT05GSUdfQVJDSF9BRElfQ09ZT1RFCiBNQUNISU5FX1NUQVJUKEFESV9DT1lPVEUsICJBREkgRW5naW5lZXJpbmcgQ295b3RlIikKLSAgICAgICAgTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCi0gICAgICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCi0gICAgICAgICAgICAgICAgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQotICAgICAgICBNQVBJTyhjb3lvdGVfbWFwX2lvKQotICAgICAgICBJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGNveW90ZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotICAgICAgICBCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGNveW90ZV9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gY295b3RlX2luaXQsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKQEAgLTExNywxNCArMTIxLDE1IEBACiAgKi8KICNpZmRlZiBDT05GSUdfTUFDSF9JWERQRzQyNQogTUFDSElORV9TVEFSVChJWERQRzQyNSwgIkludGVsIElYRFBHNDI1IikKLSAgICAgICAgTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCi0gICAgICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCi0gICAgICAgICAgICAgICAgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQotICAgICAgICBNQVBJTyhjb3lvdGVfbWFwX2lvKQotICAgICAgICBJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGNveW90ZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotICAgICAgICBCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGNveW90ZV9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gY295b3RlX2luaXQsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCmluZGV4IGU3N2M4NmUuLjhiYTFjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwpAQCAtMTQwLDE0ICsxNDAsMTUgQEAKIAogCiBNQUNISU5FX1NUQVJUKEdUV1g1NzE1LCAiR2VtdGVrIEdUV1g1NzE1IChMaW5rc3lzIFdSVjU0RykiKQotICAgICAgICBNQUlOVEFJTkVSKCJHZW9yZ2UgSm9zZXBoIikKLSAgICAgICAgQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCi0gICAgICAgICAgICAgICAgSVhQNFhYX1VBUlQyX0JBU0VfVklSVCkKLSAgICAgICAgTUFQSU8oZ3R3eDU3MTVfbWFwX2lvKQotICAgICAgICBJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKLQkJICAudGltZXIJCT0gJml4cDR4eF90aW1lciwKLSAgICAgICAgQk9PVF9QQVJBTVMoMHgwMTAwKQotICAgICAgICBJTklUX01BQ0hJTkUoZ3R3eDU3MTVfaW5pdCkKKwkvKiBNYWludGFpbmVyOiBHZW9yZ2UgSm9zZXBoICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQNFhYX1VBUlQyX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gZ3R3eDU3MTVfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKKwkudGltZXIJCT0gJml4cDR4eF90aW1lciwKKwkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGd0d3g1NzE1X2luaXQsCiBNQUNISU5FX0VORAogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwppbmRleCA3NzM0NmMxLi5jMmJhNzU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCkBAIC05NSw3ICs5NSw4IEBACiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCiAJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKLQl9CisJfSwKKwl7IH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwNDI1X3VhcnQgPSB7CkBAIC0xMjgsMzYgKzEyOSwzOSBAQAogfQogCiBNQUNISU5FX1NUQVJUKElYRFA0MjUsICJJbnRlbCBJWERQNDI1IERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAotCQlJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0JTUFQSU8oaXhkcDQyNV9tYXBfaW8pCi0JSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpeGRwNDI1X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JQk9PVF9QQVJBTVMoMHgwMTAwKQotCUlOSVRfTUFDSElORShpeGRwNDI1X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKElYRFA0NjUsICJJbnRlbCBJWERQNDY1IERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAotCQlJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0JTUFQSU8oaXhkcDQyNV9tYXBfaW8pCi0JSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpeGRwNDI1X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JQk9PVF9QQVJBTVMoMHgwMTAwKQotCUlOSVRfTUFDSElORShpeGRwNDI1X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKElYQ0RQMTEwMCwgIkludGVsIElYQ0RQMTEwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCi0JTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCi0JQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKLQkJSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQotCU1BUElPKGl4ZHA0MjVfbWFwX2lvKQotCUlOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gaXhkcDQyNV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCUJPT1RfUEFSQU1TKDB4MDEwMCkKLQlJTklUX01BQ0hJTkUoaXhkcDQyNV9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAogTUFDSElORV9FTkQKIAogLyoKQEAgLTE2OCwxNCArMTcyLDE1IEBACiAgKi8KICNpZmRlZiBDT05GSUdfQVJDSF9BVklMQQogTUFDSElORV9TVEFSVChBVklMQSwgIkdhdGV3b3JrcyBBdmlsYSBOZXR3b3JrIFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PiIpCi0JQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKLQkJSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQotCU1BUElPKGl4ZHA0MjVfbWFwX2lvKQotCUlOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+ICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQlCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGl4ZHA0MjVfaW5pdCkKKwkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYwppbmRleCA2MDZjYTk1Li4yYTdmZWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYwpAQCAtODEsOSArODEsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChMNzIwMCwgIkxpbmtVcCBTeXN0ZW1zIEw3MjAwIikKLQlNQUlOVEFJTkVSKCJTdGV2ZSBIaWxsIC8gU2NvdHQgTWNDb25uZWxsIikKLQlCT09UX01FTSgweGYwMDAwMDAwLCAweDgwMDQwMDAwLCAweGQwMDAwMDAwKQotCU1BUElPKGw3MjAwX21hcF9pbykKLQlJTklUSVJRKGw3MjAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFN0ZXZlIEhpbGwgLyBTY290dCBNY0Nvbm5lbGwgKi8KKwkucGh5c19yYW0JPSAweGYwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDA0MDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGw3MjAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBsNzIwMF9pbml0X2lycSwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCmluZGV4IGJlNWQxN2YuLmNiM2RjZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYwpAQCAtMTAyLDEwICsxMDIsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVCAoS0VWN0E0MDAsICJTaGFycCBLRVY3YTQwMCIpCi0JTUFJTlRBSU5FUiAoIk1hcmMgU2luZ2VyIikKLQlCT09UX01FTSAoMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgaW9fcDJ2ICgweDgwMDAwMDAwKSkKLQlCT09UX1BBUkFNUyAoMHhjMDAwMDEwMCkKLQlNQVBJTyAoa2V2N2E0MDBfbWFwX2lvKQotCUlOSVRJUlEgKGxoN2E0MDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTWFyYyBTaW5nZXIgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydiAoMHg4MDAwMDAwMCkpPj4xOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGtldjdhNDAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBsaDdhNDAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmbGg3YTQweF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gtbHBkN2E0MHguYwppbmRleCBjODIzNDQ3Li42ZWI2MWExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMKQEAgLTI2MCwxMyArMjYwLDE1IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTFBEN0E0MDAKIAogTUFDSElORV9TVEFSVCAoTFBEN0E0MDAsICJMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50IExQRDdBNDAwLTEwIikKLQlNQUlOVEFJTkVSICgiTWFyYyBTaW5nZXIiKQotCUJPT1RfTUVNICgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCBpb19wMnYgKDB4ODAwMDAwMDApKQotCUJPT1RfUEFSQU1TICgweGMwMDAwMTAwKQotCU1BUElPIChscGQ3YTQwMF9tYXBfaW8pCi0JSU5JVElSUSAobGg3YTQwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNYXJjIFNpbmdlciAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoaW9fcDJ2ICgweDgwMDAwMDAwKSk+PjE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gbHBkN2E0MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGxoN2E0MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZsaDdhNDB4X3RpbWVyLAotCUlOSVRfTUFDSElORSAobHBkN2E0MHhfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gbHBkN2E0MHhfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKICNlbmRpZgpAQCAtMjc0LDEzICsyNzYsMTUgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9MUEQ3QTQwNAogCiBNQUNISU5FX1NUQVJUIChMUEQ3QTQwNCwgIkxvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQgTFBEN0E0MDQtMTAiKQotCU1BSU5UQUlORVIgKCJNYXJjIFNpbmdlciIpCi0JQk9PVF9NRU0gKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIGlvX3AydiAoMHg4MDAwMDAwMCkpCi0JQk9PVF9QQVJBTVMgKDB4YzAwMDAxMDApCi0JTUFQSU8gKGxwZDdhNDAwX21hcF9pbykKLQlJTklUSVJRIChsaDdhNDA0X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1hcmMgU2luZ2VyICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKChpb19wMnYgKDB4ODAwMDAwMDApKT4+MTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBscGQ3YTQwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gbGg3YTQwNF9pbml0X2lycSwKIAkudGltZXIJCT0gJmxoN2E0MHhfdGltZXIsCi0JSU5JVF9NQUNISU5FIChscGQ3YTQweF9pbml0KQorCS5pbml0X21hY2hpbmUJPSBscGQ3YTQweF9pbml0LAogTUFDSElORV9FTkQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYwppbmRleCA1MWUxYzgxLi5iZTM3N2UzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC90aW1lLmMKQEAgLTUzLDggKzUzLDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbGg3YTQweF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkxIQTc0MHggVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGxoN2E0MHhfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gbGg3YTQweF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgbGg3YTQweF90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQyZWZhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLWlmIEFSQ0hfT01BUAotCi1tZW51ICJUSSBPTUFQIEltcGxlbWVudGF0aW9ucyIKLQotY29tbWVudCAiT01BUCBDb3JlIFR5cGUiCi0KLWNvbmZpZyBBUkNIX09NQVA3MzAKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUAotCWJvb2wgIk9NQVA3MzAgQmFzZWQgU3lzdGVtIgotCXNlbGVjdCBBUkNIX09NQVBfT1RHCi0KLWNvbmZpZyBBUkNIX09NQVAxNTEwCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IHkKLQlib29sICJPTUFQMTUxMCBCYXNlZCBTeXN0ZW0iCi0KLWNvbmZpZyBBUkNIX09NQVAxNlhYCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlib29sICJPTUFQMTZYWCBCYXNlZCBTeXN0ZW0iCi0Jc2VsZWN0IEFSQ0hfT01BUF9PVEcKLQotY29uZmlnIEFSQ0hfT01BUF9PVEcKLQlib29sCi0KLWNvbW1lbnQgIk9NQVAgQm9hcmQgVHlwZSIKLQotY29uZmlnIE1BQ0hfT01BUF9JTk5PVkFUT1IKLQlib29sICJUSSBJbm5vdmF0b3IiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgKLQloZWxwCi0gICAgICAgICAgVEkgT01BUCAxNTEwIG9yIDE2MTAgSW5ub3ZhdG9yIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91Ci0gICAgICAgICAgaGF2ZSBzdWNoIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX09NQVBfSDIKLQlib29sICJUSSBIMiBTdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotICAgIAloZWxwCi0JICBUSSBPTUFQIDE2MTAvMTYxMUIgSDIgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9PTUFQX0gzCi0JYm9vbCAiVEkgSDMgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLSAgICAJaGVscAotCSAgVEkgT01BUCAxNzEwIEgzIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAotCSAgYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9INAotCWJvb2wgIlRJIEg0IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0gICAgCWhlbHAKLQkgIFRJIE9NQVAgMTYxMCBINCBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKLQkgIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX09NQVBfT1NLCi0JYm9vbCAiVEkgT1NLIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0gICAgCWhlbHAKLQkgIFRJIE9NQVAgNTkxMiBPU0sgKE9NQVAgU3RhcnRlciBLaXQpIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUKLSAgICAgICAgICBpZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX09NQVBfUEVSU0VVUzIKLQlib29sICJUSSBQZXJzZXVzMiIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDczMAotICAgIAloZWxwCi0JICBTdXBwb3J0IGZvciBUSSBPTUFQIDczMCBQZXJzZXVzMiBib2FyZC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9WT0lDRUJMVUUKLQlib29sICJWb2ljZWJsdWUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgVm9pY2VibHVlIEdTTS9Wb0lQIGdhdGV3YXkuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAotCSAgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX05FVFNUQVIKLQlib29sICJOZXRTdGFyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMAotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIE5ldFN0YXIgUEJYLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9HRU5FUklDCi0JYm9vbCAiR2VuZXJpYyBPTUFQIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYCi0JaGVscAotICAgICAgICAgIFN1cHBvcnQgZm9yIGdlbmVyaWMgT01BUC0xNTEwLCAxNjEwIG9yIDE3MTAgYm9hcmQgd2l0aAotICAgICAgICAgIG5vIEZQR0EuIENhbiBiZSB1c2VkIGFzIHRlbXBsYXRlIGZvciBwb3J0aW5nIExpbnV4IHRvCi0gICAgICAgICAgY3VzdG9tIE9NQVAgYm9hcmRzLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgY3VzdG9tCi0gICAgICAgICAgYm9hcmQuCi0KLWNvbW1lbnQgIk9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zIgotCi0jY29uZmlnIE9NQVBfQk9PVF9UQUcKLSMJYm9vbCAiT01BUCBib290bG9hZGVyIGluZm9ybWF0aW9uIHBhc3NpbmciCi0jICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfT01BUAotIyAgICAgICAgZGVmYXVsdCBuCi0jICAgICAgICBoZWxwCi0jICAgICAgICAgIFNheSBZLCBpZiB5b3UgaGF2ZSBhIGJvb3Rsb2FkZXIgd2hpY2ggcGFzc2VzIGluZm9ybWF0aW9uCi0jICAgICAgICAgIGFib3V0IHlvdXIgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFsIGNvbmZpZ3VyYXRpb24uCi0KLWNvbmZpZyBPTUFQX01VWAotCWJvb2wgIk9NQVAgbXVsdGlwbGV4aW5nIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCi0JZGVmYXVsdCB5Ci0gICAgICAgIGhlbHAKLSAgICAgICAgICBQaW4gbXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIE9NQVAgYm9hcmRzLiBJZiB5b3VyIGJvb3Rsb2FkZXIKLSAgICAgICAgICBzZXRzIHRoZSBtdWx0aXBsZXhpbmcgY29ycmVjdGx5LCBzYXkgTi4gT3RoZXJ3aXNlLCBvciBpZiB1bnN1cmUsCi0gICAgICAgICAgc2F5IFkuCi0KLWNvbmZpZyBPTUFQX01VWF9ERUJVRwotCWJvb2wgIk11bHRpcGxleGluZyBkZWJ1ZyBvdXRwdXQiCi0gICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKLSAgICAgICAgZGVmYXVsdCBuCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBNYWtlcyB0aGUgbXVsdGlwbGV4aW5nIGZ1bmN0aW9ucyBwcmludCBvdXQgYSBsb3Qgb2YgZGVidWcgaW5mby4KLSAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgb2YgdGhlCi0gICAgICAgICAgbXVsdGlwbGV4aW5nIHJlZ2lzdGVycy4KLQotY29uZmlnIE9NQVBfTVVYX1dBUk5JTkdTCi0JYm9vbCAiV2FybiBhYm91dCBwaW5zIHRoZSBib290bG9hZGVyIGRpZG4ndCBzZXQgdXAiCi0gICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIGhlbHAKLQkgIENob29zZSBZIGhlcmUgdG8gd2FybiB3aGVuZXZlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24gbG9naWMgbmVlZHMKLQkgIHRvIGNoYW5nZSB0aGUgcGluIG11bHRpcGxleGluZyBzZXR1cC4gIFdoZW4gdGhlcmUgYXJlIG5vIHdhcm5pbmdzCi0JICBwcmludGVkLCBpdCdzIHNhZmUgdG8gZGVzZWxlY3QgT01BUF9NVVggZm9yIHlvdXIgcHJvZHVjdC4KLQotY2hvaWNlCi0gICAgICAgIHByb21wdCAiU3lzdGVtIHRpbWVyIgotCWRlZmF1bHQgT01BUF9NUFVfVElNRVIKLQotY29uZmlnIE9NQVBfTVBVX1RJTUVSCi0JYm9vbCAiVXNlIG1wdSB0aW1lciIKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBPTUFQIG1wdSB0aW1lci4gVGhpcwotCSAgdGltZXIgcHJvdmlkZXMgbW9yZSBpbnRyYS10aWNrIHJlc29sdXRpb24gdGhhbiB0aGUgMzJLSHogdGltZXIsCi0JICBidXQgY29uc3VtZXMgbW9yZSBwb3dlci4KLQotY29uZmlnIE9NQVBfMzJLX1RJTUVSCi0JYm9vbCAiVXNlIDMyS0h6IHRpbWVyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIE9NQVAgMzJLSHogdGltZXIuCi0JICBUaGlzIHRpbWVyIHNhdmVzIHBvd2VyIGNvbXBhcmVkIHRvIHRoZSBPTUFQX01QVV9USU1FUiwgYW5kIGhhcwotCSAgc3VwcG9ydCBmb3Igbm8gdGljayBkdXJpbmcgaWRsZS4gVGhlIDMyS0h6IHRpbWVyIHByb3ZpZGVzIGxlc3MKLQkgIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIE9NQVBfTVBVX1RJTUVSLiBUaGUgMzJLSHogdGltZXIgaXMKLQkgIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgT01BUC0xNnh4LgotCi1lbmRjaG9pY2UKLQotY29uZmlnIE9NQVBfMzJLX1RJTUVSX0haCi0gICAgICAgaW50ICJLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IGZvciAzMktIeiB0aW1lciIKLSAgICAgICByYW5nZSAzMiAxMDI0Ci0gICAgICAgZGVwZW5kcyBvbiBPTUFQXzMyS19USU1FUgotICAgICAgIGRlZmF1bHQgIjEyOCIKLSAgICAgICBoZWxwCi0JICBLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgMzI3NjgsCi0JICBzdWNoIGFzIDY0IG9yIDEyOC4KLQotY2hvaWNlCi0JcHJvbXB0ICJMb3ctbGV2ZWwgZGVidWcgY29uc29sZSBVQVJUIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQCi0JZGVmYXVsdCBPTUFQX0xMX0RFQlVHX1VBUlQxCi0KLWNvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQxCi0JYm9vbCAiVUFSVDEiCi0KLWNvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQyCi0JYm9vbCAiVUFSVDIiCi0KLWNvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQzCi0JYm9vbCAiVUFSVDMiCi0KLWVuZGNob2ljZQotCi1jb25maWcgT01BUF9BUk1fMTk1TUhaCi0JYm9vbCAiT01BUCBBUk0gMTk1IE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVA3MzAKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDE5NU1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBPTUFQX0FSTV8xOTJNSFoKLQlib29sICJPTUFQIEFSTSAxOTIgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDE5Mk1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBPTUFQX0FSTV8xODJNSFoKLQlib29sICJPTUFQIEFSTSAxODIgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDczMAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTgyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzE2OE1IWgotCWJvb2wgIk9NQVAgQVJNIDE2OCBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTY4TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzEyME1IWgotCWJvb2wgIk9NQVAgQVJNIDEyMCBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTIwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzYwTUhaCi0JYm9vbCAiT01BUCBBUk0gNjAgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzAKLSAgICAgICAgZGVmYXVsdCB5Ci0JaGVscAotICAgICAgICAgIEVuYWJsZSA2ME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IFkuCi0KLWNvbmZpZyBPTUFQX0FSTV8zME1IWgotCWJvb2wgIk9NQVAgQVJNIDMwIE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAzME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWVuZG1lbnUKLQotZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhZmIxMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgotIwotCi0jIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBjb21tb24ubyB0aW1lLm8gaXJxLm8gZG1hLm8gY2xvY2subyBtdXgubyBncGlvLm8gbWNic3AubyB1c2Iubwotb2JqLW0gOj0KLW9iai1uIDo9Ci1vYmotICA6PQotbGVkLXkgOj0gbGVkcy5vCi0KLSMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAotb2JqLSQoQ09ORklHX01BQ0hfT01BUF9IMikgKz0gYm9hcmQtaDIubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGJvYXJkLWlubm92YXRvci5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0dFTkVSSUMpICs9IGJvYXJkLWdlbmVyaWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikgKz0gYm9hcmQtcGVyc2V1czIubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUF9PU0spICs9IGJvYXJkLW9zay5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0gzKSArPSBib2FyZC1oMy5vCi1vYmotJChDT05GSUdfTUFDSF9WT0lDRUJMVUUpICs9IGJvYXJkLXZvaWNlYmx1ZS5vCi1vYmotJChDT05GSUdfTUFDSF9ORVRTVEFSKSArPSBib2FyZC1uZXRzdGFyLm8KLQotIyBPQ1BJIGludGVyY29ubmVjdCBzdXBwb3J0IGZvciAxNzEwLCAxNjEwIGFuZCA1OTEyCi1vYmotJChDT05GSUdfQVJDSF9PTUFQMTZYWCkgKz0gb2NwaS5vCi0KLSMgTEVEcyBzdXBwb3J0Ci1sZWQtJChDT05GSUdfTUFDSF9PTUFQX0gyKSArPSBsZWRzLWgycDItZGVidWcubwotbGVkLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGxlZHMtaW5ub3ZhdG9yLm8KLWxlZC0kKENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIpICs9IGxlZHMtaDJwMi1kZWJ1Zy5vCi1vYmotJChDT05GSUdfTEVEUykgKz0gJChsZWQteSkKLQotIyBQb3dlciBNYW5hZ2VtZW50Ci1vYmotJChDT05GSUdfUE0pICs9IHBtLm8gc2xlZXAubwotCi1pZmVxICgkKENPTkZJR19BUkNIX09NQVAxNTEwKSx5KQotIyBJbm5vdmF0b3ItMTUxMCBGUEdBCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gZnBnYS5vCi1lbmRpZgotCi0jIGtnZGIgc3VwcG9ydAotb2JqLSQoQ09ORklHX0tHREJfU0VSSUFMKQkrPSBrZ2RiLXNlcmlhbC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWNkZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmMKLSAqCi0gKiBDb2RlIGNvbW1vbiB0byBhbGwgT01BUCBtYWNoaW5lcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+Ci0KLSNpbmNsdWRlICJjbG9jay5oIgotCi0jZGVmaW5lIERFQlVHIDEKLQotc3RydWN0IG9tYXBfaWQgewotCXUxNglqdGFnX2lkOwkvKiBVc2VkIHRvIGRldGVybWluZSBPTUFQIHR5cGUgKi8KLQl1OAlkaWVfcmV2OwkvKiBQcm9jZXNzb3IgcmV2aXNpb24gKi8KLQl1MzIJb21hcF9pZDsJLyogT01BUCByZXZpc2lvbiAqLwotCXUzMgl0eXBlOwkJLyogQ3B1IGlkIGJpdHMgWzMxOjA4XSwgY3B1IGNsYXNzIGJpdHMgWzA3OjAwXSAqLwotfTsKLQotLyogUmVnaXN0ZXIgdmFsdWVzIHRvIGRldGVjdCB0aGUgT01BUCB2ZXJzaW9uICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaWQgb21hcF9pZHNbXSBfX2luaXRkYXRhID0gewotCXsgLmp0YWdfaWQgPSAweDM1NWYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAwMDAsIC50eXBlID0gMHgwNzMwMDEwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMzAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNDcwLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzEwMTAwLCAudHlwZSA9IDB4MTUxMDAwMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAwMDAsIC50eXBlID0gMHgxNjEwMDAwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTEwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MywgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMDBjMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjEwMGQwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjYxMywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDMwMCwgLnR5cGUgPSAweDE2MTBlZjAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjEzLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMzAwLCAudHlwZSA9IDB4MTYxMGVmMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjExMDAwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU4YywgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTEwYjAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNThjLCAuZGllX3JldiA9IDB4MywgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMTBjMDB9LAotCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjA0MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDQwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwNTAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMzAwMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMzMDEwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzMwMTAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAotfTsKLQotLyoKLSAqIEdldCBPTUFQIHR5cGUgZnJvbSBQUk9EX0lELgotICogMTcxMCBoYXMgdGhlIFBST0RfSUQgaW4gYml0cyAxNTowMCwgbm90IGluIDE2OjAxIGFzIGRvY3VtZW50ZWQgaW4gVFJNLgotICogMTUxMCBQUk9EX0lEIGlzIGVtcHR5LCBhbmQgMTYxMCBQUk9EX0lEIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gKiBVbmRvY3VtZW50ZWQgcmVnaXN0ZXIgaW4gVEVTVCBCTE9DSyBpcyB1c2VkIGFzIGZhbGxiYWNrOyBUaGlzIHNlZW1zIHRvCi0gKiB3b3JrIG9uIDE1MTAsIDE2MTAgJiAxNzEwLiBUaGUgb2ZmaWNpYWwgd2F5IGhvcGVmdWxseSB3aWxsIHdvcmsgaW4gZnV0dXJlCi0gKiBwcm9jZXNzb3JzLgotICovCi1zdGF0aWMgdTE2IF9faW5pdCBvbWFwX2dldF9qdGFnX2lkKHZvaWQpCi17Ci0JdTMyIHByb2RfaWQsIG9tYXBfaWQ7Ci0KLQlwcm9kX2lkID0gb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSk7Ci0Jb21hcF9pZCA9IG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpOwotCi0JLyogQ2hlY2sgZm9yIHVudXNhYmxlIE9NQVBfUFJPRFVDVElPTl9JRF8xIG9uIDE2MTFCLzU5MTIgYW5kIDczMCAqLwotCWlmICgoKHByb2RfaWQgPj4gMjApID09IDApIHx8IChwcm9kX2lkID09IG9tYXBfaWQpKQotCQlwcm9kX2lkID0gMDsKLQllbHNlCi0JCXByb2RfaWQgJj0gMHhmZmZmOwotCi0JaWYgKHByb2RfaWQpCi0JCXJldHVybiBwcm9kX2lkOwotCi0JLyogVXNlIE9NQVAzMl9JRF8xIGFzIGZhbGxiYWNrICovCi0JcHJvZF9pZCA9ICgob21hcF9pZCA+PiAxMikgJiAweGZmZmYpOwotCi0JcmV0dXJuIHByb2RfaWQ7Ci19Ci0KLS8qCi0gKiBHZXQgT01BUCByZXZpc2lvbiBmcm9tIERJRV9SRVYuCi0gKiBFYXJseSAxNzEwIHByb2Nlc3NvcnMgbWF5IGhhdmUgYnJva2VuIE9NQVBfRElFX0lELCBpdCBjb250YWlucyBQUk9EX0lELgotICogVW5kb2N1bWVudGVkIHJlZ2lzdGVyIGluIHRoZSBURVNUIEJMT0NLIGlzIHVzZWQgYXMgZmFsbGJhY2suCi0gKiBSRVZJU0lUOiBUaGlzIGRvZXMgbm90IHNlZW0gdG8gd29yayBvbiAxNTEwCi0gKi8KLXN0YXRpYyB1OCBfX2luaXQgb21hcF9nZXRfZGllX3Jldih2b2lkKQotewotCXUzMiBkaWVfcmV2OwotCi0JZGllX3JldiA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSk7Ci0KLQkvKiBDaGVjayBmb3IgYnJva2VuIE9NQVBfRElFX0lEIG9uIGVhcmx5IDE3MTAgKi8KLQlpZiAoKChkaWVfcmV2ID4+IDEyKSAmIDB4ZmZmZikgPT0gb21hcF9nZXRfanRhZ19pZCgpKQotCQlkaWVfcmV2ID0gMDsKLQotCWRpZV9yZXYgPSAoZGllX3JldiA+PiAxNykgJiAweGY7Ci0JaWYgKGRpZV9yZXYpCi0JCXJldHVybiBkaWVfcmV2OwotCi0JZGllX3JldiA9IChvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKSA+PiAyOCkgJiAweGY7Ci0KLQlyZXR1cm4gZGllX3JldjsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfY2hlY2tfcmV2aXNpb24odm9pZCkKLXsKLQlpbnQgaTsKLQl1MTYganRhZ19pZDsKLQl1OCBkaWVfcmV2OwotCXUzMiBvbWFwX2lkOwotCXU4IGNwdV90eXBlOwotCi0JanRhZ19pZCA9IG9tYXBfZ2V0X2p0YWdfaWQoKTsKLQlkaWVfcmV2ID0gb21hcF9nZXRfZGllX3JldigpOwotCW9tYXBfaWQgPSBvbWFwX3JlYWRsKE9NQVAzMl9JRF8wKTsKLQotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJPTUFQX0RJRV9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMCkpOwotCXByaW50aygiT01BUF9ESUVfSURfMTogMHglMDh4IERJRV9SRVY6ICVpXG4iLAotCQlvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpLAotCSAgICAgICAob21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSA+PiAxNykgJiAweGYpOwotCXByaW50aygiT01BUF9QUk9EVUNUSU9OX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMCkpOwotCXByaW50aygiT01BUF9QUk9EVUNUSU9OX0lEXzE6IDB4JTA4eCBKVEFHX0lEOiAweCUwNHhcbiIsCi0JCW9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpLAotCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSAmIDB4ZmZmZik7Ci0JcHJpbnRrKCJPTUFQMzJfSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVAzMl9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQMzJfSURfMTogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKSk7Ci0JcHJpbnRrKCJKVEFHX0lEOiAweCUwNHggRElFX1JFVjogJWlcbiIsIGp0YWdfaWQsIGRpZV9yZXYpOwotI2VuZGlmCi0KLQlzeXN0ZW1fc2VyaWFsX2hpZ2ggPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzApOwotCXN5c3RlbV9zZXJpYWxfbG93ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKLQotCS8qIEZpcnN0IGNoZWNrIG9ubHkgdGhlIG1ham9yIHZlcnNpb24gaW4gYSBzYWZlIHdheSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7Ci0JCWlmIChqdGFnX2lkID09IChvbWFwX2lkc1tpXS5qdGFnX2lkKSkgewotCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIENoZWNrIGlmIHdlIGNhbiBmaW5kIHRoZSBkaWUgcmV2aXNpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgewotCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkICYmIGRpZV9yZXYgPT0gb21hcF9pZHNbaV0uZGllX3JldikgewotCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIEZpbmFsbHkgY2hlY2sgYWxzbyB0aGUgb21hcF9pZCAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7Ci0JCWlmIChqdGFnX2lkID09IG9tYXBfaWRzW2ldLmp0YWdfaWQKLQkJICAgICYmIGRpZV9yZXYgPT0gb21hcF9pZHNbaV0uZGllX3JldgotCQkgICAgJiYgb21hcF9pZCA9PSBvbWFwX2lkc1tpXS5vbWFwX2lkKSB7Ci0JCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogQWRkIHRoZSBjcHUgY2xhc3MgaW5mbyAoN3h4LCAxNXh4LCAxNnh4LCAyNHh4KSAqLwotCWNwdV90eXBlID0gc3lzdGVtX3JldiA+PiAyNDsKLQotCXN3aXRjaCAoY3B1X3R5cGUpIHsKLQljYXNlIDB4MDc6Ci0JCXN5c3RlbV9yZXYgfD0gMHgwNzsKLQkJYnJlYWs7Ci0JY2FzZSAweDE1OgotCQlzeXN0ZW1fcmV2IHw9IDB4MTU7Ci0JCWJyZWFrOwotCWNhc2UgMHgxNjoKLQljYXNlIDB4MTc6Ci0JCXN5c3RlbV9yZXYgfD0gMHgxNjsKLQkJYnJlYWs7Ci0JY2FzZSAweDI0OgotCQlzeXN0ZW1fcmV2IHw9IDB4MjQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5rbm93biBPTUFQIGNwdSB0eXBlOiAweCUwMnhcbiIsIGNwdV90eXBlKTsKLQl9Ci0KLQlwcmludGsoIk9NQVAlMDR4Iiwgc3lzdGVtX3JldiA+PiAxNik7Ci0JaWYgKChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZikKLQkJcHJpbnRrKCIleCIsIChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZik7Ci0JcHJpbnRrKCIgcmV2aXNpb24gJWkgaGFuZGxlZCBhcyAlMDJ4eHggaWQ6ICUwOHglMDh4XG4iLAotCSAgICAgICBkaWVfcmV2LCBzeXN0ZW1fcmV2ICYgMHhmZiwgc3lzdGVtX3NlcmlhbF9sb3csCi0JICAgICAgIHN5c3RlbV9zZXJpYWxfaGlnaCk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPTUFQIEkvTyBtYXBwaW5nCi0gKgotICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQotICogZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVkIGhlcmUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgSU9fVklSVCwgICAgICAJSU9fUEhZUywgICAgICAgICAgICAgSU9fU0laRSwgICAgICAgIAkgICBNVF9ERVZJQ0UgfSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA3MzBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0geyBPTUFQNzMwX0RTUF9CQVNFLCAgICBPTUFQNzMwX0RTUF9TVEFSVCwgICAgT01BUDczMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCi0geyBPTUFQNzMwX0RTUFJFR19CQVNFLCBPTUFQNzMwX0RTUFJFR19TVEFSVCwgT01BUDczMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCi0geyBPTUFQNzMwX1NSQU1fQkFTRSwgICBPTUFQNzMwX1NSQU1fU1RBUlQsICAgT01BUDczMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KLX07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNTEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE1MTBfRFNQX0JBU0UsICAgIE9NQVAxNTEwX0RTUF9TVEFSVCwgICAgT01BUDE1MTBfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE1MTBfRFNQUkVHX0JBU0UsIE9NQVAxNTEwX0RTUFJFR19TVEFSVCwgT01BUDE1MTBfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotIHsgT01BUDE1MTBfU1JBTV9CQVNFLCAgIE9NQVAxNTEwX1NSQU1fU1RBUlQsICAgT01BUDE1MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Ci19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMTYxMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSB7IE9NQVAxNlhYX0RTUF9CQVNFLCAgICBPTUFQMTZYWF9EU1BfU1RBUlQsICAgIE9NQVAxNlhYX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNlhYX0RTUFJFR19CQVNFLCBPTUFQMTZYWF9EU1BSRUdfU1RBUlQsIE9NQVAxNlhYX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNlhYX1NSQU1fQkFTRSwgICBPTUFQMTZYWF9TUkFNX1NUQVJULCAgIE9NQVAxNjEwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwNTkxMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSB7IE9NQVAxNlhYX0RTUF9CQVNFLCAgICBPTUFQMTZYWF9EU1BfU1RBUlQsICAgIE9NQVAxNlhYX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNlhYX0RTUFJFR19CQVNFLCBPTUFQMTZYWF9EU1BSRUdfU1RBUlQsIE9NQVAxNlhYX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLS8qCi0gKiBUaGUgT01BUDU5MTIgaGFzIDI1MGtCeXRlIGludGVybmFsIFNSQU0uIEJlY2F1c2UgdGhlIG1hcHBpbmcgaXMgYmFzZWVkIG9uIHBhZ2UKLSAqIHNpemUgKDRrQnl0ZSksIGl0IHNlZW1zIHRoYXQgdGhlIGxhc3QgMmtCeXRlICg9MHg4MDApIG9mIHRoZSAyNTBrQnl0ZSBhcmUgbm90IG1hcHBlZC4KLSAqIEFkZCBhZGRpdGlvbmFsIDJrQnl0ZSAoMHg4MDApIHNvIHRoYXQgdGhlIGxhc3QgcGFnZSBpcyBtYXBwZWQgYW5kIHRoZSBsYXN0IDJrQnl0ZQotICogY2FuIGJlIHVzZWQuCi0gKi8KLSB7IE9NQVAxNlhYX1NSQU1fQkFTRSwgICBPTUFQMTZYWF9TUkFNX1NUQVJULCAgIE9NQVA1OTEyX1NSQU1fU0laRSArIDB4ODAwLCAgIE1UX0RFVklDRSB9Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgX29tYXBfbWFwX2lvKHZvaWQpCi17Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCi0JLyogV2UgaGF2ZSB0byBpbml0aWFsaXplIHRoZSBJTyBzcGFjZSBtYXBwaW5nIGJlZm9yZSB3ZSBjYW4gcnVuCi0JICogY3B1X2lzX29tYXB4eHgoKSBtYWNyb3MuICovCi0JaW90YWJsZV9pbml0KG9tYXBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwX2lvX2Rlc2MpKTsKLQlvbWFwX2NoZWNrX3JldmlzaW9uKCk7Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi0JaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXA3MzBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNzMwX2lvX2Rlc2MpKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDE1MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTUxMF9pb19kZXNjKSk7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXAxNjEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE2MTBfaW9fZGVzYykpOwotCX0KLQlpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXA1OTEyX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDU5MTJfaW9fZGVzYykpOwotCX0KLSNlbmRpZgotCi0JLyogUkVWSVNJVDogUmVmZXIgdG8gT01BUDU5MTAgRXJyYXRhLCBBZHZpc29yeSBTWVNfMTogIlRpbWVvdXQgQWJvcnQKLQkgKiBvbiBhIFBvc3RlZCBXcml0ZSBpbiB0aGUgVElQQiBCcmlkZ2UiLgotCSAqLwotCW9tYXBfd3JpdGV3KDB4MCwgTVBVX1BVQkxJQ19USVBCX0NOVEwpOwotCW9tYXBfd3JpdGV3KDB4MCwgTVBVX1BSSVZBVEVfVElQQl9DTlRMKTsKLQotCS8qIE11c3QgaW5pdCBjbG9ja3MgZWFybHkgdG8gYXNzdXJlIHRoYXQgdGltZXIgaW50ZXJydXB0IHdvcmtzCi0JICovCi0JY2xrX2luaXQoKTsKLX0KLQotLyoKLSAqIFRoaXMgc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmcm9tIGJvYXJkIHNwZWNpZmljIGluaXQKLSAqLwotdm9pZCBvbWFwX21hcF9pbyh2b2lkKQotewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCV9vbWFwX21hcF9pbygpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbWFwX3NlcmlhbF9pbihzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnVwLAotCQkJCQkgIGludCBvZmZzZXQpCi17Ci0Jb2Zmc2V0IDw8PSB1cC0+cmVnc2hpZnQ7Ci0JcmV0dXJuICh1bnNpZ25lZCBpbnQpX19yYXdfcmVhZGIodXAtPm1lbWJhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9zZXJpYWxfb3V0cChzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnAsIGludCBvZmZzZXQsCi0JCQkJICAgIGludCB2YWx1ZSkKLXsKLQlvZmZzZXQgPDw9IHAtPnJlZ3NoaWZ0OwotCV9fcmF3X3dyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KLS8qCi0gKiBJbnRlcm5hbCBVQVJUcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGZvciB0aGUgODI1MCBhdXRvY29uZmlnIHRvIHdvcmsKLSAqIHByb3Blcmx5LiBOb3RlIHRoYXQgdGhlIFRYIHdhdGVybWFyayBpbml0aWFsaXphdGlvbiBtYXkgbm90IGJlIG5lZWRlZAotICogb25jZSB0aGUgODI1MC5jIHdhdGVybWFyayBoYW5kbGluZyBjb2RlIGlzIG1lcmdlZC4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc2VyaWFsX3Jlc2V0KHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCkKLXsKLQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9NRFIxLCAweDA3KTsJLyogZGlzYWJsZSBVQVJUICovCi0Jb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfU0NSLCAweDA4KTsJLyogVFggd2F0ZXJtYXJrICovCi0Jb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfTURSMSwgMHgwMCk7CS8qIGVuYWJsZSBVQVJUICovCi0KLQlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX1NZU0MsIDB4MDEpOwotCQl3aGlsZSAoIShvbWFwX3NlcmlhbF9pbihwLCBVQVJUX09NQVBfU1lTQykgJiAweDAxKSk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7Ci0JewotCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDFfQkFTRSksCi0JCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUMV9CQVNFLAotCQkuaXJxCQk9IElOVF9VQVJUMSwKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAotCX0sCi0JewotCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDJfQkFTRSksCi0JCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUMl9CQVNFLAotCQkuaXJxCQk9IElOVF9VQVJUMiwKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAotCX0sCi0JewotCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDNfQkFTRSksCi0JCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUM19CQVNFLAotCQkuaXJxCQk9IElOVF9VQVJUMywKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAotCX0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKLQkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCi0JfSwKLX07Ci0KLS8qCi0gKiBOb3RlIHRoYXQgb24gSW5ub3ZhdG9yLTE1MTAgVUFSVDIgcGlucyBjb25mbGljdCB3aXRoIFVTQjIuCi0gKiBCeSBkZWZhdWx0IFVBUlQyIGRvZXMgbm90IHdvcmsgb24gSW5ub3ZhdG9yLTE1MTAgaWYgeW91IGhhdmUKLSAqIFVTQiBPSENJIGVuYWJsZWQuIFRvIHVzZSBVQVJUMiwgeW91IG11c3QgZGlzYWJsZSBVU0IyIGZpcnN0LgotICovCi12b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9pbml0KGludCBwb3J0c1tPTUFQX01BWF9OUl9QT1JUU10pCi17Ci0JaW50IGk7Ci0KLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS5yZWdzaGlmdCA9IDA7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLnJlZ3NoaWZ0ID0gMDsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0uaXJxID0gSU5UXzczMF9VQVJUX01PREVNXzE7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLmlycSA9IElOVF83MzBfVUFSVF9NT0RFTV9JUkRBXzI7Ci0JfQotCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OwotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsyXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE9NQVBfTUFYX05SX1BPUlRTOyBpKyspIHsKLQkJdW5zaWduZWQgY2hhciByZWc7Ci0KLQkJaWYgKHBvcnRzW2ldID09IDApIHsKLQkJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldLm1lbWJhc2UgPSAwOwotCQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0ubWFwYmFzZSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXN3aXRjaCAoaSkgewotCQljYXNlIDA6Ci0JCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCQlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOwotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9SVFMpOwotCQkJCWlmIChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkpIHsKLQkJCQkJcmVnID0gZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUE9XRVIpOwotCQkJCQlyZWcgfD0gT01BUDE1MTBfRlBHQV9QQ1JfQ09NMV9FTjsKLQkJCQkJZnBnYV93cml0ZShyZWcsIE9NQVAxNTEwX0ZQR0FfUE9XRVIpOwotCQkJCQl1ZGVsYXkoMTApOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCQlvbWFwX2NmZ19yZWcoVUFSVDJfVFgpOwotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOwotCQkJCWlmIChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkpIHsKLQkJCQkJcmVnID0gZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUE9XRVIpOwotCQkJCQlyZWcgfD0gT01BUDE1MTBfRlBHQV9QQ1JfQ09NMl9FTjsKLQkJCQkJZnBnYV93cml0ZShyZWcsIE9NQVAxNTEwX0ZQR0FfUE9XRVIpOwotCQkJCQl1ZGVsYXkoMTApOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCQlvbWFwX2NmZ19yZWcoVUFSVDNfVFgpOwotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19SWCk7Ci0JCQl9Ci0JCQlpZiAoY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJCQljbGtfZW5hYmxlKGNsa19nZXQoMCwgInVhcnQzX2NrIikpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJb21hcF9zZXJpYWxfcmVzZXQoJnNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNlcmlhbF9kZXZpY2UpOwotfQotYXJjaF9pbml0Y2FsbChvbWFwX2luaXQpOwotCi0jZGVmaW5lIE5PX0xFTkdUSF9DSEVDSyAweGZmZmZmZmZmCi0KLWV4dGVybiBpbnQgb21hcF9ib290bG9hZGVyX3RhZ19sZW47Ci1leHRlcm4gdTggb21hcF9ib290bG9hZGVyX3RhZ1tdOwotCi1zdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpvbWFwX2JvYXJkX2NvbmZpZzsKLWludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gMDsKLQotc3RhdGljIGNvbnN0IHZvaWQgKmdldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IHNraXAsIHNpemVfdCAqbGVuX291dCkKLXsKLQlzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpraW5mbyA9IE5VTEw7Ci0JaW50IGk7Ci0KLSNpZmRlZiBDT05GSUdfT01BUF9CT09UX1RBRwotCXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqaW5mbyA9IE5VTEw7Ci0KLQlpZiAob21hcF9ib290bG9hZGVyX3RhZ19sZW4gPiA0KQotCQlpbmZvID0gKHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqKSBvbWFwX2Jvb3Rsb2FkZXJfdGFnOwotCXdoaWxlIChpbmZvICE9IE5VTEwpIHsKLQkJdTggKm5leHQ7Ci0KLQkJaWYgKGluZm8tPnRhZyA9PSB0YWcpIHsKLQkJCWlmIChza2lwID09IDApCi0JCQkJYnJlYWs7Ci0JCQlza2lwLS07Ci0JCX0KLQotCQlpZiAoKGluZm8tPmxlbiAmIDB4MDMpICE9IDApIHsKLQkJCS8qIFdlIGJhaWwgb3V0IHRvIGF2b2lkIGFuIGFsaWdubWVudCBmYXVsdCAqLwotCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIHBlcmlwaGVyYWwgY29uZmlnOiBMZW5ndGggKCVkKSBub3Qgd29yZC1hbGlnbmVkICh0YWcgJTA0eClcbiIsCi0JCQkgICAgICAgaW5mby0+bGVuLCBpbmZvLT50YWcpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbmV4dCA9ICh1OCAqKSBpbmZvICsgc2l6ZW9mKCppbmZvKSArIGluZm8tPmxlbjsKLQkJaWYgKG5leHQgPj0gb21hcF9ib290bG9hZGVyX3RhZyArIG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuKQotCQkJaW5mbyA9IE5VTEw7Ci0JCWVsc2UKLQkJCWluZm8gPSAoc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICopIG5leHQ7Ci0JfQotCWlmIChpbmZvICE9IE5VTEwpIHsKLQkJLyogQ2hlY2sgdGhlIGxlbmd0aCBhcyBhIGxhbWUgYXR0ZW1wdCB0byBjaGVjayBmb3IKLQkJICogYmluYXJ5IGluY29uc2lzdGFuY3kuICovCi0JCWlmIChsZW4gIT0gTk9fTEVOR1RIX0NIRUNLKSB7Ci0JCQkvKiBXb3JkLWFsaWduIGxlbiAqLwotCQkJaWYgKGxlbiAmIDB4MDMpCi0JCQkJbGVuID0gKGxlbiArIDMpICYgfjB4MDM7Ci0JCQlpZiAoaW5mby0+bGVuICE9IGxlbikgewotCQkJCXByaW50ayhLRVJOX0VSUiAiT01BUCBwZXJpcGhlcmFsIGNvbmZpZzogTGVuZ3RoIG1pc21hdGNoIHdpdGggdGFnICV4ICh3YW50ICVkLCBnb3QgJWQpXG4iLAotCQkJCSAgICAgICB0YWcsIGxlbiwgaW5mby0+bGVuKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlpZiAobGVuX291dCAhPSBOVUxMKQotCQkJKmxlbl9vdXQgPSBpbmZvLT5sZW47Ci0JCXJldHVybiBpbmZvLT5kYXRhOwotCX0KLSNlbmRpZgotCS8qIFRyeSB0byBmaW5kIHRoZSBjb25maWcgZnJvbSB0aGUgYm9hcmQtc3BlY2lmaWMgc3RydWN0dXJlcwotCSAqIGluIHRoZSBrZXJuZWwuICovCi0JZm9yIChpID0gMDsgaSA8IG9tYXBfYm9hcmRfY29uZmlnX3NpemU7IGkrKykgewotCQlpZiAob21hcF9ib2FyZF9jb25maWdbaV0udGFnID09IHRhZykgewotCQkJa2luZm8gPSAmb21hcF9ib2FyZF9jb25maWdbaV07Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoa2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGtpbmZvLT5kYXRhOwotfQotCi1jb25zdCB2b2lkICpfX29tYXBfZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgbnIpCi17Ci0gICAgICAgIHJldHVybiBnZXRfY29uZmlnKHRhZywgbGVuLCBuciwgTlVMTCk7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fb21hcF9nZXRfY29uZmlnKTsKLQotY29uc3Qgdm9pZCAqb21hcF9nZXRfdmFyX2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgKmxlbikKLXsKLSAgICAgICAgcmV0dXJuIGdldF9jb25maWcodGFnLCBOT19MRU5HVEhfQ0hFQ0ssIDAsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X3Zhcl9jb25maWcpOwotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwX2FkZF9zZXJpYWxfY29uc29sZSh2b2lkKQotewotCWNvbnN0IHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnICppbmZvOwotCi0JaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19VQVJULCBzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyk7Ci0JaWYgKGluZm8gIT0gTlVMTCAmJiBpbmZvLT5jb25zb2xlX3VhcnQpIHsKLQkJc3RhdGljIGNoYXIgc3BlZWRbMTFdLCAqb3B0ID0gTlVMTDsKLQotCQlpZiAoaW5mby0+Y29uc29sZV9zcGVlZCkgewotCQkJc25wcmludGYoc3BlZWQsIHNpemVvZihzcGVlZCksICIldSIsIGluZm8tPmNvbnNvbGVfc3BlZWQpOwotCQkJb3B0ID0gc3BlZWQ7Ci0JCX0KLQkJcmV0dXJuIGFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5UyIsIGluZm8tPmNvbnNvbGVfdWFydCAtIDEsIG9wdCk7Ci0JfQotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChvbWFwX2FkZF9zZXJpYWxfY29uc29sZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwOGFjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZwpAQCAtMCwwICsxLDE0NCBAQAorY29tbWVudCAiT01BUCBDb3JlIFR5cGUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisKK2NvbmZpZyBBUkNIX09NQVA3MzAKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKwlib29sICJPTUFQNzMwIEJhc2VkIFN5c3RlbSIKKwlzZWxlY3QgQVJDSF9PTUFQX09URworCitjb25maWcgQVJDSF9PTUFQMTUxMAorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCWRlZmF1bHQgeQorCWJvb2wgIk9NQVAxNTEwIEJhc2VkIFN5c3RlbSIKKworY29uZmlnIEFSQ0hfT01BUDE2WFgKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKwlib29sICJPTUFQMTZ4eCBCYXNlZCBTeXN0ZW0iCisJc2VsZWN0IEFSQ0hfT01BUF9PVEcKKworY29tbWVudCAiT01BUCBCb2FyZCBUeXBlIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCitjb25maWcgTUFDSF9PTUFQX0lOTk9WQVRPUgorCWJvb2wgIlRJIElubm92YXRvciIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCkKKwloZWxwCisgICAgICAgICAgVEkgT01BUCAxNTEwIG9yIDE2MTAgSW5ub3ZhdG9yIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91CisgICAgICAgICAgaGF2ZSBzdWNoIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfSDIKKwlib29sICJUSSBIMiBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNlhYCisgICAgCWhlbHAKKwkgIFRJIE9NQVAgMTYxMC8xNjExQiBIMiBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKKwkgIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfSDMKKwlib29sICJUSSBIMyBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNlhYCisgICAgCWhlbHAKKwkgIFRJIE9NQVAgMTcxMCBIMyBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKKwkgIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfT1NLCisJYm9vbCAiVEkgT1NLIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE2WFgKKyAgICAJaGVscAorCSAgVEkgT01BUCA1OTEyIE9TSyAoT01BUCBTdGFydGVyIEtpdCkgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZQorICAgICAgICAgIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9QRVJTRVVTMgorCWJvb2wgIlRJIFBlcnNldXMyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVA3MzAKKyAgICAJaGVscAorCSAgU3VwcG9ydCBmb3IgVEkgT01BUCA3MzAgUGVyc2V1czIgYm9hcmQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAorCSAgYSBib2FyZC4KKworY29uZmlnIE1BQ0hfVk9JQ0VCTFVFCisJYm9vbCAiVm9pY2VibHVlIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNTEwCisJaGVscAorCSAgU3VwcG9ydCBmb3IgVm9pY2VibHVlIEdTTS9Wb0lQIGdhdGV3YXkuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUKKwkgIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfTkVUU1RBUgorCWJvb2wgIk5ldFN0YXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE1MTAKKwloZWxwCisJICBTdXBwb3J0IGZvciBOZXRTdGFyIFBCWC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfR0VORVJJQworCWJvb2wgIkdlbmVyaWMgT01BUCBib2FyZCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCkKKwloZWxwCisgICAgICAgICAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBPTUFQLTE1MTAsIDE2MTAgb3IgMTcxMCBib2FyZCB3aXRoCisgICAgICAgICAgbm8gRlBHQS4gQ2FuIGJlIHVzZWQgYXMgdGVtcGxhdGUgZm9yIHBvcnRpbmcgTGludXggdG8KKyAgICAgICAgICBjdXN0b20gT01BUCBib2FyZHMuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjdXN0b20KKyAgICAgICAgICBib2FyZC4KKworY29tbWVudCAiT01BUCBDUFUgU3BlZWQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisKK2NvbmZpZyBPTUFQX0NMT0NLU19TRVRfQllfQk9PVExPQURFUgorCWJvb2wgIk9NQVAgY2xvY2tzIHNldCBieSBib290bG9hZGVyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBvdmVycmlkaW5nIHRoZSBjbG9jaworCSAgZnJlcXVlbmNpZXMgcHJvZ3JhbW1lZCBieSBib290bG9hZGVyIGZvciBNUFUsIERTUCwgTU1VcywgVEMsCisJICBpbnRlcm5hbCBMQ0QgY29udHJvbGxlciBhbmQgTVBVIHBlcmlwaGVyYWxzLgorCitjb25maWcgT01BUF9BUk1fMjE2TUhaCisJYm9vbCAiT01BUCBBUk0gMjE2IE1IeiBDUFUgKDE3MTAgb25seSkiCisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNlhYCisgICAgICAgIGhlbHAKKyAgICAgICAgICBFbmFibGUgMjE2IE1IeiBjbG9jayBmb3IgT01BUDE3MTAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTk1TUhaCisJYm9vbCAiT01BUCBBUk0gMTk1IE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDczMAorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTk1TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE5Mk1IWgorCWJvb2wgIk9NQVAgQVJNIDE5MiBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNlhYCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxOTJNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTgyTUhaCisJYm9vbCAiT01BUCBBUk0gMTgyIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDczMAorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTgyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE2OE1IWgorCWJvb2wgIk9NQVAgQVJNIDE2OCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMCkKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDE2OE1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xNTBNSFoKKwlib29sICJPTUFQIEFSTSAxNTAgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTUxMAorCWhlbHAKKwkgIEVuYWJsZSAxNTBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTIwTUhaCisJYm9vbCAiT01BUCBBUk0gMTIwIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwKQorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTIwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzYwTUhaCisJYm9vbCAiT01BUCBBUk0gNjAgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzApCisgICAgICAgIGRlZmF1bHQgeQorCWhlbHAKKyAgICAgICAgICBFbmFibGUgNjBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgT01BUF9BUk1fMzBNSFoKKwlib29sICJPTUFQIEFSTSAzMCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMCkKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDMwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NmZkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKQEAgLTAsMCArMSwzMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBDb21tb24gc3VwcG9ydAorb2JqLXkgOj0gaW8ubyBpZC5vIGlycS5vIHRpbWUubyBzZXJpYWwubworbGVkLXkgOj0gbGVkcy5vCisKKyMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAorb2JqLSQoQ09ORklHX01BQ0hfT01BUF9IMikJCSs9IGJvYXJkLWgyLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKQkrPSBib2FyZC1pbm5vdmF0b3Iubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9HRU5FUklDKQkJKz0gYm9hcmQtZ2VuZXJpYy5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKQkrPSBib2FyZC1wZXJzZXVzMi5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQX09TSykJCSs9IGJvYXJkLW9zay5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQX0gzKQkJKz0gYm9hcmQtaDMubworb2JqLSQoQ09ORklHX01BQ0hfVk9JQ0VCTFVFKQkJKz0gYm9hcmQtdm9pY2VibHVlLm8KK29iai0kKENPTkZJR19NQUNIX05FVFNUQVIpCQkrPSBib2FyZC1uZXRzdGFyLm8KKworaWZlcSAoJChDT05GSUdfQVJDSF9PTUFQMTUxMCkseSkKKyMgSW5ub3ZhdG9yLTE1MTAgRlBHQQorb2JqLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpCSs9IGZwZ2EubworZW5kaWYKKworIyBMRURzIHN1cHBvcnQKK2xlZC0kKENPTkZJR19NQUNIX09NQVBfSDIpCQkrPSBsZWRzLWgycDItZGVidWcubworbGVkLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpCSs9IGxlZHMtaW5ub3ZhdG9yLm8KK2xlZC0kKENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIpCSs9IGxlZHMtaDJwMi1kZWJ1Zy5vCitsZWQtJChDT05GSUdfTUFDSF9PTUFQX09TSykJCSs9IGxlZHMtb3NrLm8KK29iai0kKENPTkZJR19MRURTKQkJCSs9ICQobGVkLXkpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZS5ib290CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZS5ib290CnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlLmJvb3QKaW5kZXggZmVlMWE2YS4uMjkyZDU2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZS5ib290CkBAIC0xLDQgKzEsMyBAQAogICAgenJlbGFkZHIteQkJOj0gMHgxMDAwODAwMAogcGFyYW1zX3BoeXMteQkJOj0gMHgxMDAwMDEwMAogaW5pdHJkX3BoeXMteQkJOj0gMHgxMDgwMDAwMAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWdlbmVyaWMuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKaW5kZXggMjEwMmEyYy4uMTIyNzk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwogICoKICAqIE1vZGlmaWVkIGZyb20gYm9hcmQtaW5ub3ZhdG9yMTUxMC5jCiAgKgpAQCAtMjYsOCArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogc3RhdGljIGludCBfX2luaXRkYXRhIGdlbmVyaWNfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKIApAQCAtODQsMTUgKzgzLDE3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKQogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDE1MTAvMTYxMC8xNzEwIikKLQlNQUlOVEFJTkVSKCJUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKG9tYXBfZ2VuZXJpY19tYXBfaW8pCi0JSU5JVElSUShvbWFwX2dlbmVyaWNfaW5pdF9pcnEpCi0JSU5JVF9NQUNISU5FKG9tYXBfZ2VuZXJpY19pbml0KQorCS8qIE1haW50YWluZXI6IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+ICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IG9tYXBfZ2VuZXJpY19tYXBfaW8sCisJLmluaXRfaXJxCT0gb21hcF9nZW5lcmljX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwX2dlbmVyaWNfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwppbmRleCAxZjA2NzgzLi5mNDk4M2VlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwogICoKICAqIEJvYXJkIHNwZWNpZmljIGluaXRzIGZvciBPTUFQLTE2MTAgSDIKICAqCkBAIC0zNSw4ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKIApAQCAtMTcyLDE2ICsxNzEsMTggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGgyX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJb21hcF9zZXJpYWxfaW5pdChoMl9zZXJpYWxfcG9ydHMpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfSDIsICJUSS1IMiIpCi0JTUFJTlRBSU5FUigiSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKGgyX21hcF9pbykKLQlJTklUSVJRKGgyX2luaXRfaXJxKQotCUlOSVRfTUFDSElORShoMl9pbml0KQorCS8qIE1haW50YWluZXI6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDJfbWFwX2lvLAorCS5pbml0X2lycQk9IGgyX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBoMl9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IDQ4NmE1YTAuLjdjZDQxOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIE9NQVAxNzEwIEgzIHNwZWNpZmljIGNvZGUuCiAgKgpAQCAtMzcsOCArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKIApAQCAtMTkwLDE2ICsxODksMTggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGgzX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJb21hcF9zZXJpYWxfaW5pdChoM19zZXJpYWxfcG9ydHMpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfSDMsICJUSSBPTUFQMTcxMCBIMyBib2FyZCIpCi0JTUFJTlRBSU5FUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhoM19tYXBfaW8pCi0JSU5JVElSUShoM19pbml0X2lycSkKLQlJTklUX01BQ0hJTkUoaDNfaW5pdCkKKwkvKiBNYWludGFpbmVyOiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLm1hcF9pbwkJPSBoM19tYXBfaW8sCisJLmluaXRfaXJxCT0gaDNfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGgzX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWlubm92YXRvci5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCmluZGV4IDU3Y2Y0ZGEuLjkxZGU2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwogICoKICAqIEJvYXJkIHNwZWNpZmljIGluaXRzIGZvciBPTUFQLTE1MTAgYW5kIE9NQVAtMTYxMCBJbm5vdmF0b3IKICAqCkBAIC0zMyw4ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogc3RhdGljIGludCBfX2luaXRkYXRhIGlubm92YXRvcl9zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDF9OwogCkBAIC0yNTIsNyArMjUxLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGlubm92YXRvcl9tYXBfaW8odm9pZCkKIHsKLQlvbWFwX21hcF9pbygpOworCW9tYXBfbWFwX2NvbW1vbl9pbygpOwogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKQEAgLTI3MCwxMSArMjY5LDEzIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9JTk5PVkFUT1IsICJUSS1Jbm5vdmF0b3IiKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhpbm5vdmF0b3JfbWFwX2lvKQotCUlOSVRJUlEoaW5ub3ZhdG9yX2luaXRfaXJxKQotCUlOSVRfTUFDSElORShpbm5vdmF0b3JfaW5pdCkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IGlubm92YXRvcl9tYXBfaW8sCisJLmluaXRfaXJxCT0gaW5ub3ZhdG9yX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBpbm5vdmF0b3JfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1uZXRzdGFyLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jCmluZGV4IDU0YWNiZDIuLjY3NTBiMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1uZXRzdGFyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKQEAgLTI2LDggKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogZXh0ZXJuIHZvaWQgX19pbml0IG9tYXBfaW5pdF90aW1lKHZvaWQpOwogZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKQEAgLTEwMCw3ICs5OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBuZXRzdGFyX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJb21hcF9zZXJpYWxfaW5pdChvbWFwX3NlcmlhbF9wb3J0cyk7CiB9CiAKQEAgLTE0MSwxMSArMTQwLDEzIEBACiBwb3N0Y29yZV9pbml0Y2FsbChuZXRzdGFyX2xhdGVfaW5pdCk7CiAKIE1BQ0hJTkVfU1RBUlQoTkVUU1RBUiwgIk5ldFN0YXIgT01BUDU5MTAiKQotCU1BSU5UQUlORVIoIkxhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhuZXRzdGFyX21hcF9pbykKLQlJTklUSVJRKG5ldHN0YXJfaW5pdF9pcnEpCi0JSU5JVF9NQUNISU5FKG5ldHN0YXJfaW5pdCkKLQkudGltZXIgPSAmb21hcF90aW1lciwKKwkvKiBNYWludGFpbmVyOiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+ICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IG5ldHN0YXJfbWFwX2lvLAorCS5pbml0X2lycQk9IG5ldHN0YXJfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG5ldHN0YXJfaW5pdCwKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtb3NrLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKaW5kZXggYTk1MWZjOC4uNjg0NGU1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCiAgKgogICogQm9hcmQgc3BlY2lmaWMgaW5pdCBmb3IgT01BUDU5MTIgT1NLCiAgKgpAQCAtMzksOCArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvc2s1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogeyBPTUFQX09TS19OT1JfRkxBU0hfQkFTRSwgT01BUF9PU0tfTk9SX0ZMQVNIX1NUQVJULCBPTUFQX09TS19OT1JfRkxBU0hfU0laRSwKQEAgLTE1MywxNyArMTUyLDE5IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIAlpb3RhYmxlX2luaXQob3NrNTkxMl9pb19kZXNjLCBBUlJBWV9TSVpFKG9zazU5MTJfaW9fZGVzYykpOwogCW9tYXBfc2VyaWFsX2luaXQob3NrX3NlcmlhbF9wb3J0cyk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9PU0ssICJUSS1PU0siKQotCU1BSU5UQUlORVIoIkRpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKG9za19tYXBfaW8pCi0JSU5JVElSUShvc2tfaW5pdF9pcnEpCi0JSU5JVF9NQUNISU5FKG9za19pbml0KQorCS8qIE1haW50YWluZXI6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLm1hcF9pbwkJPSBvc2tfbWFwX2lvLAorCS5pbml0X2lycQk9IG9za19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gb3NrX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggNjQ1MTVhZS4uMjEzMzE3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKICAqCiAgKiBNb2RpZmllZCBmcm9tIGJvYXJkLWdlbmVyaWMuYwogICoKQEAgLTI3LDggKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8YXNtL2FyY2gvY29tbW9uLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKQEAgLTE0MCw3ICsxMzksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9tYXBfaW8odm9pZCkKIHsKLQlvbWFwX21hcF9pbygpOworCW9tYXBfbWFwX2NvbW1vbl9pbygpOwogCWlvdGFibGVfaW5pdChvbWFwX3BlcnNldXMyX2lvX2Rlc2MsCiAJCSAgICAgQVJSQVlfU0laRShvbWFwX3BlcnNldXMyX2lvX2Rlc2MpKTsKIApAQCAtMTc5LDExICsxNzgsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX1BFUlNFVVMyLCAiT01BUDczMCBQZXJzZXVzMiIpCi0JTUFJTlRBSU5FUigiS2V2aW4gSGlsbWFuIDxramhAaGlsbWFuLm9yZz4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhvbWFwX3BlcnNldXMyX21hcF9pbykKLQlJTklUSVJRKG9tYXBfcGVyc2V1czJfaW5pdF9pcnEpCi0JSU5JVF9NQUNISU5FKG9tYXBfcGVyc2V1czJfaW5pdCkKKwkvKiBNYWludGFpbmVyOiBLZXZpbiBIaWxtYW4gPGtqaEBoaWxtYW4ub3JnPiAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLm1hcF9pbwkJPSBvbWFwX3BlcnNldXMyX21hcF9pbywKKwkuaW5pdF9pcnEJPSBvbWFwX3BlcnNldXMyX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwX3BlcnNldXMyX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCmluZGV4IGYxYTViZmYuLmU0MjI4MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwogICoKICAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCiAgKgpAQCAtMzEsOCArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogZXh0ZXJuIHZvaWQgb21hcF9pbml0X3RpbWUodm9pZCk7CiBleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwpAQCAtMTcwLDcgKzE2OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIAlvbWFwX3NlcmlhbF9pbml0KG9tYXBfc2VyaWFsX3BvcnRzKTsKIH0KIApAQCAtMjQ2LDExICsyNDUsMTMgQEAKIEVYUE9SVF9TWU1CT0wodm9pY2VibHVlX3dkdF9waW5nKTsKIAogTUFDSElORV9TVEFSVChWT0lDRUJMVUUsICJWb2ljZUJsdWUgT01BUDU5MTAiKQotCU1BSU5UQUlORVIoIkxhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyh2b2ljZWJsdWVfbWFwX2lvKQotCUlOSVRJUlEodm9pY2VibHVlX2luaXRfaXJxKQotCUlOSVRfTUFDSElORSh2b2ljZWJsdWVfaW5pdCkKLQkudGltZXIgPSAmb21hcF90aW1lciwKKwkvKiBNYWludGFpbmVyOiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+ICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IHZvaWNlYmx1ZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gdm9pY2VibHVlX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSB2b2ljZWJsdWVfaW5pdCwKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2ZwZ2EuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvZnBnYS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmMzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKKyAqCisgKiBPTUFQMSBDUFUgaWRlbnRpZmljYXRpb24gY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3Qgb21hcF9pZCB7CisJdTE2CWp0YWdfaWQ7CS8qIFVzZWQgdG8gZGV0ZXJtaW5lIE9NQVAgdHlwZSAqLworCXU4CWRpZV9yZXY7CS8qIFByb2Nlc3NvciByZXZpc2lvbiAqLworCXUzMglvbWFwX2lkOwkvKiBPTUFQIHJldmlzaW9uICovCisJdTMyCXR5cGU7CQkvKiBDcHUgaWQgYml0cyBbMzE6MDhdLCBjcHUgY2xhc3MgYml0cyBbMDc6MDBdICovCit9OworCisvKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeyAuanRhZ19pZCA9IDB4MzU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMTAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI0NzAsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMTAxMDAsIC50eXBlID0gMHgxNTEwMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDE2MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjEwMGMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTAwZDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjEzLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMzAwLCAudHlwZSA9IDB4MTYxMGVmMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTEwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNThjLCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMTBiMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDQwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA1MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMzMDAwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzMwMTAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCit9OworCisvKgorICogR2V0IE9NQVAgdHlwZSBmcm9tIFBST0RfSUQuCisgKiAxNzEwIGhhcyB0aGUgUFJPRF9JRCBpbiBiaXRzIDE1OjAwLCBub3QgaW4gMTY6MDEgYXMgZG9jdW1lbnRlZCBpbiBUUk0uCisgKiAxNTEwIFBST0RfSUQgaXMgZW1wdHksIGFuZCAxNjEwIFBST0RfSUQgZG9lcyBub3QgbWFrZSBzZW5zZS4KKyAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiBURVNUIEJMT0NLIGlzIHVzZWQgYXMgZmFsbGJhY2s7IFRoaXMgc2VlbXMgdG8KKyAqIHdvcmsgb24gMTUxMCwgMTYxMCAmIDE3MTAuIFRoZSBvZmZpY2lhbCB3YXkgaG9wZWZ1bGx5IHdpbGwgd29yayBpbiBmdXR1cmUKKyAqIHByb2Nlc3NvcnMuCisgKi8KK3N0YXRpYyB1MTYgX19pbml0IG9tYXBfZ2V0X2p0YWdfaWQodm9pZCkKK3sKKwl1MzIgcHJvZF9pZCwgb21hcF9pZDsKKworCXByb2RfaWQgPSBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKTsKKwlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMSk7CisKKwkvKiBDaGVjayBmb3IgdW51c2FibGUgT01BUF9QUk9EVUNUSU9OX0lEXzEgb24gMTYxMUIvNTkxMiBhbmQgNzMwICovCisJaWYgKCgocHJvZF9pZCA+PiAyMCkgPT0gMCkgfHwgKHByb2RfaWQgPT0gb21hcF9pZCkpCisJCXByb2RfaWQgPSAwOworCWVsc2UKKwkJcHJvZF9pZCAmPSAweGZmZmY7CisKKwlpZiAocHJvZF9pZCkKKwkJcmV0dXJuIHByb2RfaWQ7CisKKwkvKiBVc2UgT01BUDMyX0lEXzEgYXMgZmFsbGJhY2sgKi8KKwlwcm9kX2lkID0gKChvbWFwX2lkID4+IDEyKSAmIDB4ZmZmZik7CisKKwlyZXR1cm4gcHJvZF9pZDsKK30KKworLyoKKyAqIEdldCBPTUFQIHJldmlzaW9uIGZyb20gRElFX1JFVi4KKyAqIEVhcmx5IDE3MTAgcHJvY2Vzc29ycyBtYXkgaGF2ZSBicm9rZW4gT01BUF9ESUVfSUQsIGl0IGNvbnRhaW5zIFBST0RfSUQuCisgKiBVbmRvY3VtZW50ZWQgcmVnaXN0ZXIgaW4gdGhlIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjay4KKyAqIFJFVklTSVQ6IFRoaXMgZG9lcyBub3Qgc2VlbSB0byB3b3JrIG9uIDE1MTAKKyAqLworc3RhdGljIHU4IF9faW5pdCBvbWFwX2dldF9kaWVfcmV2KHZvaWQpCit7CisJdTMyIGRpZV9yZXY7CisKKwlkaWVfcmV2ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKKworCS8qIENoZWNrIGZvciBicm9rZW4gT01BUF9ESUVfSUQgb24gZWFybHkgMTcxMCAqLworCWlmICgoKGRpZV9yZXYgPj4gMTIpICYgMHhmZmZmKSA9PSBvbWFwX2dldF9qdGFnX2lkKCkpCisJCWRpZV9yZXYgPSAwOworCisJZGllX3JldiA9IChkaWVfcmV2ID4+IDE3KSAmIDB4ZjsKKwlpZiAoZGllX3JldikKKwkJcmV0dXJuIGRpZV9yZXY7CisKKwlkaWVfcmV2ID0gKG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpID4+IDI4KSAmIDB4ZjsKKworCXJldHVybiBkaWVfcmV2OworfQorCit2b2lkIF9faW5pdCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpCit7CisJaW50IGk7CisJdTE2IGp0YWdfaWQ7CisJdTggZGllX3JldjsKKwl1MzIgb21hcF9pZDsKKwl1OCBjcHVfdHlwZTsKKworCWp0YWdfaWQgPSBvbWFwX2dldF9qdGFnX2lkKCk7CisJZGllX3JldiA9IG9tYXBfZ2V0X2RpZV9yZXYoKTsKKwlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMCk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiT01BUF9ESUVfSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzApKTsKKwlwcmludGsoIk9NQVBfRElFX0lEXzE6IDB4JTA4eCBESUVfUkVWOiAlaVxuIiwKKwkJb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSwKKwkgICAgICAgKG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSkgPj4gMTcpICYgMHhmKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzApKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8xOiAweCUwOHggSlRBR19JRDogMHglMDR4XG4iLAorCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSwKKwkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSkgJiAweGZmZmYpOworCXByaW50aygiT01BUDMyX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMCkpOworCXByaW50aygiT01BUDMyX0lEXzE6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMSkpOworCXByaW50aygiSlRBR19JRDogMHglMDR4IERJRV9SRVY6ICVpXG4iLCBqdGFnX2lkLCBkaWVfcmV2KTsKKyNlbmRpZgorCisJc3lzdGVtX3NlcmlhbF9oaWdoID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKTsKKwlzeXN0ZW1fc2VyaWFsX2xvdyA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSk7CisKKwkvKiBGaXJzdCBjaGVjayBvbmx5IHRoZSBtYWpvciB2ZXJzaW9uIGluIGEgc2FmZSB3YXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSAob21hcF9pZHNbaV0uanRhZ19pZCkpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZmluZCB0aGUgZGllIHJldmlzaW9uICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKKwkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZCAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGaW5hbGx5IGNoZWNrIGFsc28gdGhlIG9tYXBfaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkCisJCSAgICAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYKKwkJICAgICYmIG9tYXBfaWQgPT0gb21hcF9pZHNbaV0ub21hcF9pZCkgeworCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgY3B1IGNsYXNzIGluZm8gKDd4eCwgMTV4eCwgMTZ4eCwgMjR4eCkgKi8KKwljcHVfdHlwZSA9IHN5c3RlbV9yZXYgPj4gMjQ7CisKKwlzd2l0Y2ggKGNwdV90eXBlKSB7CisJY2FzZSAweDA3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MDc7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJc3lzdGVtX3JldiB8PSAweDE1OworCQlicmVhazsKKwljYXNlIDB4MTY6CisJY2FzZSAweDE3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MTY7CisJCWJyZWFrOworCWNhc2UgMHgyNDoKKwkJc3lzdGVtX3JldiB8PSAweDI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gT01BUCBjcHUgdHlwZTogMHglMDJ4XG4iLCBjcHVfdHlwZSk7CisJfQorCisJcHJpbnRrKCJPTUFQJTA0eCIsIHN5c3RlbV9yZXYgPj4gMTYpOworCWlmICgoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpCisJCXByaW50aygiJXgiLCAoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpOworCXByaW50aygiIHJldmlzaW9uICVpIGhhbmRsZWQgYXMgJTAyeHh4IGlkOiAlMDh4JTA4eFxuIiwKKwkgICAgICAgZGllX3Jldiwgc3lzdGVtX3JldiAmIDB4ZmYsIHN5c3RlbV9zZXJpYWxfbG93LAorCSAgICAgICBzeXN0ZW1fc2VyaWFsX2hpZ2gpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ZGYwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYworICoKKyAqIE9NQVAxIEkvTyBtYXBwaW5nIGNvZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorCitleHRlcm4gaW50IGNsa19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKTsKKworLyoKKyAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKKyAqIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlZCBoZXJlLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBJT19WSVJULCAgICAgIAlJT19QSFlTLCAgICAgICAgICAgICBJT19TSVpFLCAgICAgICAgCSAgIE1UX0RFVklDRSB9LAorfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDczMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IE9NQVA3MzBfRFNQX0JBU0UsICAgIE9NQVA3MzBfRFNQX1NUQVJULCAgICBPTUFQNzMwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKyB7IE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NUQVJULCBPTUFQNzMwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IE9NQVA3MzBfU1JBTV9CQVNFLCAgIE9NQVA3MzBfU1JBTV9TVEFSVCwgICBPTUFQNzMwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE1MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTUxMF9EU1BfQkFTRSwgICAgT01BUDE1MTBfRFNQX1NUQVJULCAgICBPTUFQMTUxMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTUxMF9EU1BSRUdfQkFTRSwgT01BUDE1MTBfRFNQUkVHX1NUQVJULCBPTUFQMTUxMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisgeyBPTUFQMTUxMF9TUkFNX0JBU0UsICAgT01BUDE1MTBfU1JBTV9TVEFSVCwgICBPTUFQMTUxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNjEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDE2MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorLyoKKyAqIFRoZSBPTUFQNTkxMiBoYXMgMjUwa0J5dGUgaW50ZXJuYWwgU1JBTS4gQmVjYXVzZSB0aGUgbWFwcGluZyBpcyBiYXNlZWQgb24gcGFnZQorICogc2l6ZSAoNGtCeXRlKSwgaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCAya0J5dGUgKD0weDgwMCkgb2YgdGhlIDI1MGtCeXRlIGFyZSBub3QgbWFwcGVkLgorICogQWRkIGFkZGl0aW9uYWwgMmtCeXRlICgweDgwMCkgc28gdGhhdCB0aGUgbGFzdCBwYWdlIGlzIG1hcHBlZCBhbmQgdGhlIGxhc3QgMmtCeXRlCisgKiBjYW4gYmUgdXNlZC4KKyAqLworIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDU5MTJfU1JBTV9TSVpFICsgMHg4MDAsICAgTVRfREVWSUNFIH0KK307CisjZW5kaWYKKworc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfb21hcF9tYXBfaW8odm9pZCkKK3sKKwlpbml0aWFsaXplZCA9IDE7CisKKwkvKiBXZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIElPIHNwYWNlIG1hcHBpbmcgYmVmb3JlIHdlIGNhbiBydW4KKwkgKiBjcHVfaXNfb21hcHh4eCgpIG1hY3Jvcy4gKi8KKwlpb3RhYmxlX2luaXQob21hcF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfaW9fZGVzYykpOworCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDczMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3MzBfaW9fZGVzYykpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDE2MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTYxMF9pb19kZXNjKSk7CisJfQorCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNTkxMl9pb19kZXNjKSk7CisJfQorI2VuZGlmCisKKwkvKiBSRVZJU0lUOiBSZWZlciB0byBPTUFQNTkxMCBFcnJhdGEsIEFkdmlzb3J5IFNZU18xOiAiVGltZW91dCBBYm9ydAorCSAqIG9uIGEgUG9zdGVkIFdyaXRlIGluIHRoZSBUSVBCIEJyaWRnZSIuCisJICovCisJb21hcF93cml0ZXcoMHgwLCBNUFVfUFVCTElDX1RJUEJfQ05UTCk7CisJb21hcF93cml0ZXcoMHgwLCBNUFVfUFJJVkFURV9USVBCX0NOVEwpOworCisJLyogTXVzdCBpbml0IGNsb2NrcyBlYXJseSB0byBhc3N1cmUgdGhhdCB0aW1lciBpbnRlcnJ1cHQgd29ya3MKKwkgKi8KKwljbGtfaW5pdCgpOworfQorCisvKgorICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAorICovCit2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKQoreworCWlmICghaW5pdGlhbGl6ZWQpCisJCV9vbWFwX21hcF9pbygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKaW5kZXggZjAxYzk5Mi4uYTExYjZkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKQEAgLTU2LDYgKzU2LDcgQEAKIHN0cnVjdCBvbWFwX2lycV9iYW5rIHsKIAl1bnNpZ25lZCBsb25nIGJhc2VfcmVnOwogCXVuc2lnbmVkIGxvbmcgdHJpZ2dlcl9tYXA7CisJdW5zaWduZWQgbG9uZyB3YWtlX2VuYWJsZTsKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2JhbmtfY291bnQgPSAwOwpAQCAtMTA1LDYgKzEwNiwxOSBAQAogCW9tYXBfYWNrX2lycShpcnEpOwogfQogCitzdGF0aWMgaW50IG9tYXBfd2FrZV9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFfYmFua3NbYmFua10ud2FrZV9lbmFibGUgfD0gSVJRX0JJVChpcnEpOworCWVsc2UKKwkJaXJxX2JhbmtzW2JhbmtdLndha2VfZW5hYmxlICY9IH5JUlFfQklUKGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworCiAvKgogICogQWxsb3dzIHR1bmluZyB0aGUgSVJRIHR5cGUgYW5kIHByaW9yaXR5CiAgKgpAQCAtMTQ1LDcgKzE1OSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDE2MTBfaXJxX2JhbmtzW10gPSB7CiAJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMV9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4YjNmZWZlOGYgfSwKIAl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhmZGI3YzFmZCB9LAotCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MTAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZmN2ZmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgxMDAsCS50cmlnZ2VyX21hcCA9IDB4ZmZmZmI3ZmYgfSwKIAl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDIwMCwJLnRyaWdnZXJfbWFwID0gMHhmZmZmZmZmZiB9LAogfTsKICNlbmRpZgpAQCAtMTU0LDYgKzE2OCw3IEBACiAJLmFjayAgICA9IG9tYXBfbWFza19hY2tfaXJxLAogCS5tYXNrICAgPSBvbWFwX21hc2tfaXJxLAogCS51bm1hc2sgPSBvbWFwX3VubWFza19pcnEsCisJLndha2UJPSBvbWFwX3dha2VfaXJxLAogfTsKIAogdm9pZCBfX2luaXQgb21hcF9pbml0X2lycSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKaW5kZXggNmU5ODI5MC4uZWMwZDgyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaDJwMi1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9sZWRzLWlubm92YXRvci5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9sZWRzLW9zay5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKaW5kZXggZjUxNzdmNC4uNGEwZThiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCkBAIC0xMjksMTQgKzEyOSwxMSBAQAogCiAjaWZkZWYJQ09ORklHX0ZCX09NQVAKIAotI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCiAJY2FzZSBsZWRfdGltZXI6CiAJCWh3X2xlZF9zdGF0ZSBePSBUSU1FUl9MRUQ7CiAJCW1pc3RyYWxfc2V0bGVkKCk7CiAJCWJyZWFrOwotI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTEVEU19DUFUKIAljYXNlIGxlZF9pZGxlX3N0YXJ0OgogCQlod19sZWRfc3RhdGUgfD0gSURMRV9MRUQ7CiAJCW1pc3RyYWxfc2V0bGVkKCk7CkBAIC0xNDYsNyArMTQzLDYgQEAKIAkJaHdfbGVkX3N0YXRlICY9IH5JRExFX0xFRDsKIAkJbWlzdHJhbF9zZXRsZWQoKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19GQl9PTUFQICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLmggYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGU1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCisgKgorICogT01BUDEgQ1BVIGlkZW50aWZpY2F0aW9uIGNvZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKworc3RhdGljIHN0cnVjdCBjbGsgKiB1YXJ0MV9jayA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGNsayAqIHVhcnQyX2NrID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICogdWFydDNfY2sgPSBOVUxMOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbWFwX3NlcmlhbF9pbihzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnVwLAorCQkJCQkgIGludCBvZmZzZXQpCit7CisJb2Zmc2V0IDw8PSB1cC0+cmVnc2hpZnQ7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19yYXdfcmVhZGIodXAtPm1lbWJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9zZXJpYWxfb3V0cChzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnAsIGludCBvZmZzZXQsCisJCQkJICAgIGludCB2YWx1ZSkKK3sKKwlvZmZzZXQgPDw9IHAtPnJlZ3NoaWZ0OworCV9fcmF3X3dyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7Cit9CisKKy8qCisgKiBJbnRlcm5hbCBVQVJUcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGZvciB0aGUgODI1MCBhdXRvY29uZmlnIHRvIHdvcmsKKyAqIHByb3Blcmx5LiBOb3RlIHRoYXQgdGhlIFRYIHdhdGVybWFyayBpbml0aWFsaXphdGlvbiBtYXkgbm90IGJlIG5lZWRlZAorICogb25jZSB0aGUgODI1MC5jIHdhdGVybWFyayBoYW5kbGluZyBjb2RlIGlzIG1lcmdlZC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc2VyaWFsX3Jlc2V0KHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCkKK3sKKwlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9NRFIxLCAweDA3KTsJLyogZGlzYWJsZSBVQVJUICovCisJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfU0NSLCAweDA4KTsJLyogVFggd2F0ZXJtYXJrICovCisJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfTURSMSwgMHgwMCk7CS8qIGVuYWJsZSBVQVJUICovCisKKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX1NZU0MsIDB4MDEpOworCQl3aGlsZSAoIShvbWFwX3NlcmlhbF9pbihwLCBVQVJUX09NQVBfU1lTQykgJiAweDAxKSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDFfQkFTRSksCisJCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUMV9CQVNFLAorCQkuaXJxCQk9IElOVF9VQVJUMSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCX0sCisJeworCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDJfQkFTRSksCisJCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUMl9CQVNFLAorCQkuaXJxCQk9IElOVF9VQVJUMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCX0sCisJeworCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDNfQkFTRSksCisJCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUM19CQVNFLAorCQkuaXJxCQk9IElOVF9VQVJUMywKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKKy8qCisgKiBOb3RlIHRoYXQgb24gSW5ub3ZhdG9yLTE1MTAgVUFSVDIgcGlucyBjb25mbGljdCB3aXRoIFVTQjIuCisgKiBCeSBkZWZhdWx0IFVBUlQyIGRvZXMgbm90IHdvcmsgb24gSW5ub3ZhdG9yLTE1MTAgaWYgeW91IGhhdmUKKyAqIFVTQiBPSENJIGVuYWJsZWQuIFRvIHVzZSBVQVJUMiwgeW91IG11c3QgZGlzYWJsZSBVU0IyIGZpcnN0LgorICovCit2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9pbml0KGludCBwb3J0c1tPTUFQX01BWF9OUl9QT1JUU10pCit7CisJaW50IGk7CisKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS5yZWdzaGlmdCA9IDA7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLnJlZ3NoaWZ0ID0gMDsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0uaXJxID0gSU5UXzczMF9VQVJUX01PREVNXzE7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLmlycSA9IElOVF83MzBfVUFSVF9NT0RFTV9JUkRBXzI7CisJfQorCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsyXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE9NQVBfTUFYX05SX1BPUlRTOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciByZWc7CisKKwkJaWYgKHBvcnRzW2ldID09IDApIHsKKwkJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldLm1lbWJhc2UgPSBOVUxMOworCQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0ubWFwYmFzZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQl1YXJ0MV9jayA9IGNsa19nZXQoTlVMTCwgInVhcnQxX2NrIik7CisJCQlpZiAoSVNfRVJSKHVhcnQxX2NrKSkKKwkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDFfY2tcbiIpOworCQkJZWxzZSB7CisJCQkJY2xrX3VzZSh1YXJ0MV9jayk7CisJCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQkJCQljbGtfc2V0X3JhdGUodWFydDFfY2ssIDEyMDAwMDAwKTsKKwkJCX0KKwkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9UWCk7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQxX1JUUyk7CisJCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgeworCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00xX0VOOworCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCQkJCXVkZWxheSgxMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXVhcnQyX2NrID0gY2xrX2dldChOVUxMLCAidWFydDJfY2siKTsKKwkJCWlmIChJU19FUlIodWFydDJfY2spKQorCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0Ml9ja1xuIik7CisJCQllbHNlIHsKKwkJCQljbGtfdXNlKHVhcnQyX2NrKTsKKwkJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCQkJCWNsa19zZXRfcmF0ZSh1YXJ0Ml9jaywgMTIwMDAwMDApOworCQkJCWVsc2UKKwkJCQkJY2xrX3NldF9yYXRlKHVhcnQyX2NrLCA0ODAwMDAwMCk7CisJCQl9CisJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDJfVFgpOworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOworCQkJCWlmIChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkpIHsKKwkJCQkJcmVnID0gZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUE9XRVIpOworCQkJCQlyZWcgfD0gT01BUDE1MTBfRlBHQV9QQ1JfQ09NMl9FTjsKKwkJCQkJZnBnYV93cml0ZShyZWcsIE9NQVAxNTEwX0ZQR0FfUE9XRVIpOworCQkJCQl1ZGVsYXkoMTApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl1YXJ0M19jayA9IGNsa19nZXQoTlVMTCwgInVhcnQzX2NrIik7CisJCQlpZiAoSVNfRVJSKHVhcnQzX2NrKSkKKwkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDNfY2tcbiIpOworCQkJZWxzZSB7CisJCQkJY2xrX3VzZSh1YXJ0M19jayk7CisJCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQkJCQljbGtfc2V0X3JhdGUodWFydDNfY2ssIDEyMDAwMDAwKTsKKwkJCX0KKwkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCW9tYXBfc2VyaWFsX3Jlc2V0KCZzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKK30KK2FyY2hfaW5pdGNhbGwob21hcF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvdGltZS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYwppbmRleCA0MjA1ZmRjLi5kNTQwNTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCkBAIC0xLDEwICsxLDEwIEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL3RpbWUuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKICAqCiAgKiBPTUFQIFRpbWVycwogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgotICogUGFydGlhbCB0aW1lciByZXdyaXRlIGFuZCBhZGRpdGlvbmFsIFZTVCB0aW1lciBzdXBwb3J0IGJ5CisgKiBQYXJ0aWFsIHRpbWVyIHJld3JpdGUgYW5kIGFkZGl0aW9uYWwgZHluYW1pYyB0aWNrIHRpbWVyIHN1cHBvcnQgYnkKICAqIFRvbnkgTGluZGdlbiA8dG9ueUBhdG9taWRlLmNvbT4gYW5kCiAgKiBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KICAqCkBAIC01OCwxNyArNTgsOSBAQAogICogTVBVIHRpbWVyCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2RlZmluZSBPTUFQX01QVV9USU1FUjFfQkFTRQkJKDB4ZmZmZWM1MDApCi0jZGVmaW5lIE9NQVBfTVBVX1RJTUVSMl9CQVNFCQkoMHhmZmZlYzYwMCkKLSNkZWZpbmUgT01BUF9NUFVfVElNRVIzX0JBU0UJCSgweGZmZmVjNzAwKQogI2RlZmluZSBPTUFQX01QVV9USU1FUl9CQVNFCQlPTUFQX01QVV9USU1FUjFfQkFTRQogI2RlZmluZSBPTUFQX01QVV9USU1FUl9PRkZTRVQJCTB4MTAwCiAKLSNkZWZpbmUgTVBVX1RJTUVSX0ZSRUUJCQkoMSA8PCA2KQotI2RlZmluZSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFCQkoMSA8PCA1KQotI2RlZmluZSBNUFVfVElNRVJfQVIJCQkoMSA8PCAxKQotI2RlZmluZSBNUFVfVElNRVJfU1QJCQkoMSA8PCAwKQotCiAvKiBjeWNsZXMgdG8gbnNlYyBjb252ZXJzaW9ucyB0YWtlbiBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jLAogICogY29udmVydGVkIHRvIHVzZSBrSHogYnkgS2V2aW4gSGlsbWFuICovCiAvKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKQEAgLTE4OCw4ICsxODAsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBvbWFwX21wdV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIm1wdSB0aW1lciIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7CkBAIC0yMDMsNyArMTk1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXBfbXB1X3RpbWVyMV9pcnEgPSB7CiAJLm5hbWUJCT0gIm1wdSB0aW1lcjEgb3ZlcmZsb3ciLAogCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBvbWFwX21wdV90aW1lcjFfaW50ZXJydXB0CisJLmhhbmRsZXIJPSBvbWFwX21wdV90aW1lcjFfaW50ZXJydXB0LAogfTsKIAogc3RhdGljIF9faW5pdCB2b2lkIG9tYXBfaW5pdF9tcHVfdGltZXIodm9pZCkKQEAgLTI1NSwxMyArMjQ3LDE5IEBACiAjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RDUgkJMHgwNAogCiAjZGVmaW5lIE9NQVBfMzJLX1RJQ0tTX1BFUl9IWgkJKDMyNzY4IC8gSFopCisjaWYgKDMyNzY4ICUgSFopICE9IDAKKy8qIFdlIGNhbm5vdCBpZ25vcmUgbW9kdWxvLgorICogUG90ZW50aWFsIGVycm9yIGNhbiBiZSBhcyBoaWdoIGFzIHNldmVyYWwgcGVyY2VudC4KKyAqLworI2RlZmluZSBPTUFQXzMyS19USUNLX01PRFVMTwkJKDMyNzY4ICUgSFopCitzdGF0aWMgdW5zaWduZWQgbW9kdWxvX2NvdW50ID0gMDsgLyogQ291bnRzIDEvSFogdW5pdHMgKi8KKyNlbmRpZgogCiAvKgogICogVFJNIHNheXMgMSAvIEhaID0gKCBUVlIgKyAxKSAvIDMyNzY4LCBzbyBUUlYgPSAoMzI3NjggLyBIWikgLSAxCiAgKiBzbyB3aXRoIEhaID0gMTAwLCBUVlIgPSAzMjcuNjguCiAgKi8KICNkZWZpbmUgT01BUF8zMktfVElNRVJfVElDS19QRVJJT0QJKCgzMjc2OCAvIEhaKSAtIDEpCi0jZGVmaW5lIE1BWF9TS0lQX0pJRkZJRVMJCTI1CiAjZGVmaW5lIFRJTUVSXzMyS19TWU5DSFJPTklaRUQJCTB4ZmZmYmM0MTAKIAogI2RlZmluZSBKSUZGSUVTX1RPX0hXX1RJQ0tTKG5yX2ppZmZpZXMsIGNsb2NrX3JhdGUpCQkJXApAQCAtMzMyLDYgKzMzMCwxOSBAQAogCW5vdyA9IG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCgpOwogCiAJd2hpbGUgKG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA+PSBPTUFQXzMyS19USUNLU19QRVJfSFopIHsKKyNpZmRlZiBPTUFQXzMyS19USUNLX01PRFVMTworCQkvKiBNb2R1bG8gYWRkaXRpb24gbWF5IHB1dCBvbWFwXzMya19sYXN0X3RpY2sgYWhlYWQgb2Ygbm93CisJCSAqIGFuZCBjYXVzZSB1bndhbnRlZCByZXBldGl0aW9uIG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA9PSB+MCkpCisJCQlicmVhazsKKworCQltb2R1bG9fY291bnQgKz0gT01BUF8zMktfVElDS19NT0RVTE87CisJCWlmIChtb2R1bG9fY291bnQgPiBIWikgeworCQkJKytvbWFwXzMya19sYXN0X3RpY2s7CisJCQltb2R1bG9fY291bnQgLT0gSFo7CisJCX0KKyNlbmRpZgogCQlvbWFwXzMya19sYXN0X3RpY2sgKz0gT01BUF8zMktfVElDS1NfUEVSX0haOwogCQl0aW1lcl90aWNrKHJlZ3MpOwogCX0KQEAgLTM0NywxNCArMzU4LDU1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKy8qCisgKiBQcm9ncmFtcyB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgbmVlZGVkLiBDYWxsZWQgd2hlbiBkeW5hbWljIHRpY2sgaXMKKyAqIGVuYWJsZWQsIGFuZCB0byByZXByb2dyYW0gdGhlIHRpY2tzIHRvIHNraXAgZnJvbSBwbV9pZGxlLiBOb3RlIHRoYXQKKyAqIHdlIGNhbiBrZWVwIHRoZSB0aW1lciBjb250aW51b3VzLCBhbmQgZG9uJ3QgbmVlZCB0byBzZXQgaXQgdG8gcnVuIGluCisgKiBvbmUtc2hvdCBtb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIHdpbGwgZ2V0IHJlcHJvZ3JhbW1lZCBhZ2FpbgorICogYWZ0ZXIgbmV4dCBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgb21hcF8zMmtfdGltZXJfcmVwcm9ncmFtKHVuc2lnbmVkIGxvbmcgbmV4dF90aWNrKQoreworCW9tYXBfMzJrX3RpbWVyX3N0YXJ0KEpJRkZJRVNfVE9fSFdfVElDS1MobmV4dF90aWNrLCAzMjc2OCkgKyAxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF8zMmtfdGltZXJfaXJxOworZXh0ZXJuIHN0cnVjdCB0aW1lcl91cGRhdGVfaGFuZGxlciB0aW1lcl91cGRhdGU7CisKK3N0YXRpYyBpbnQgb21hcF8zMmtfdGltZXJfZW5hYmxlX2R5bl90aWNrKHZvaWQpCit7CisJLyogTm8gbmVlZCB0byByZXByb2dyYW0gdGltZXIsIGp1c3QgdXNlIHRoZSBuZXh0IGludGVycnVwdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfMzJrX3RpbWVyX2Rpc2FibGVfZHluX3RpY2sodm9pZCkKK3sKKwlvbWFwXzMya190aW1lcl9zdGFydChPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHluX3RpY2tfdGltZXIgb21hcF9keW5fdGlja190aW1lciA9IHsKKwkuZW5hYmxlCQk9IG9tYXBfMzJrX3RpbWVyX2VuYWJsZV9keW5fdGljaywKKwkuZGlzYWJsZQk9IG9tYXBfMzJrX3RpbWVyX2Rpc2FibGVfZHluX3RpY2ssCisJLnJlcHJvZ3JhbQk9IG9tYXBfMzJrX3RpbWVyX3JlcHJvZ3JhbSwKKwkuaGFuZGxlcgk9IG9tYXBfMzJrX3RpbWVyX2ludGVycnVwdCwKK307CisjZW5kaWYJLyogQ09ORklHX05PX0lETEVfSFogKi8KKwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF8zMmtfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICIzMktIeiB0aW1lciIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IG9tYXBfMzJrX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IG9tYXBfMzJrX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyBfX2luaXQgdm9pZCBvbWFwX2luaXRfMzJrX3RpbWVyKHZvaWQpCiB7CisKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgorCW9tYXBfdGltZXIuZHluX3RpY2sgPSAmb21hcF9keW5fdGlja190aW1lcjsKKyNlbmRpZgorCiAJc2V0dXBfaXJxKElOVF9PU19USU1FUiwgJm9tYXBfMzJrX3RpbWVyX2lycSk7CiAJb21hcF90aW1lci5vZmZzZXQgID0gb21hcF8zMmtfdGltZXJfZ2V0dGltZW9mZnNldDsKIAlvbWFwXzMya19sYXN0X3RpY2sgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKQEAgLTM2Nyw3ICs0MTksNyBAQAogICogVGltZXIgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi12b2lkIF9faW5pdCBvbWFwX3RpbWVyX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3RpbWVyX2luaXQodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01QVV9USU1FUikKIAlvbWFwX2luaXRfbXB1X3RpbWVyKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCmluZGV4IGM0ZTZkMjUuLmVmYzJmNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCkBAIC0yNCwzICsyNCw3IEBACiAKICMgTWlzYyBmZWF0dXJlcwogb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8KKworaWZlcSAoJChDT05GSUdfUFhBMjd4KSx5KQorb2JqLSQoQ09ORklHX1BNKSArPSBzdGFuZGJ5Lm8KK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCBmNjkxY2Y3Li44NmI4NjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTI4NywzNCArMjg3LDQwIEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9DT1JHSQogTUFDSElORV9TVEFSVChDT1JHSSwgIlNIQVJQIENvcmdpIikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JRklYVVAoZml4dXBfY29yZ2kpCi0JTUFQSU8oY29yZ2lfbWFwX2lvKQotCUlOSVRJUlEoY29yZ2lfaW5pdF9pcnEpCi0JLmluaXRfbWFjaGluZSA9IGNvcmdpX2luaXQsCi0JLnRpbWVyID0gJnB4YV90aW1lciwKKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuZml4dXAJCT0gZml4dXBfY29yZ2ksCisJLm1hcF9pbwkJPSBjb3JnaV9tYXBfaW8sCisJLmluaXRfaXJxCT0gY29yZ2lfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNvcmdpX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTUFDSF9TSEVQSEVSRAogTUFDSElORV9TVEFSVChTSEVQSEVSRCwgIlNIQVJQIFNoZXBoZXJkIikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JRklYVVAoZml4dXBfY29yZ2kpCi0JTUFQSU8oY29yZ2lfbWFwX2lvKQotCUlOSVRJUlEoY29yZ2lfaW5pdF9pcnEpCi0JLmluaXRfbWFjaGluZSA9IGNvcmdpX2luaXQsCi0JLnRpbWVyID0gJnB4YV90aW1lciwKKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuZml4dXAJCT0gZml4dXBfY29yZ2ksCisJLm1hcF9pbwkJPSBjb3JnaV9tYXBfaW8sCisJLmluaXRfaXJxCT0gY29yZ2lfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNvcmdpX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTUFDSF9IVVNLWQogTUFDSElORV9TVEFSVChIVVNLWSwgIlNIQVJQIEh1c2t5IikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JRklYVVAoZml4dXBfY29yZ2kpCi0JTUFQSU8oY29yZ2lfbWFwX2lvKQotCUlOSVRJUlEoY29yZ2lfaW5pdF9pcnEpCi0JLmluaXRfbWFjaGluZSA9IGNvcmdpX2luaXQsCi0JLnRpbWVyID0gJnB4YV90aW1lciwKKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuZml4dXAJCT0gZml4dXBfY29yZ2ksCisJLm1hcF9pbwkJPSBjb3JnaV9tYXBfaW8sCisJLmluaXRfaXJxCT0gY29yZ2lfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNvcmdpX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKaW5kZXggYzVhNjZiZi4uMzg2ZTEwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKQEAgLTE4MSwxMCArMTgxLDEyIEBACiAKIAogTUFDSElORV9TVEFSVChQWEFfSURQLCAiVmlicmVuIFBYQTI1NSBJRFAiKQotCU1BSU5UQUlORVIoIlZpYnJlbiBUZWNobm9sb2dpZXMiKQotCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKLQlNQVBJTyhpZHBfbWFwX2lvKQotCUlOSVRJUlEoaWRwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFZpYnJlbiBUZWNobm9sb2dpZXMgKi8KKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGlkcF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaWRwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotCUlOSVRfTUFDSElORShpZHBfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gaWRwX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IGYyYzllMGQuLjYzMDk4NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTI2OCwxMCArMjY4LDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTFVCQk9DSywgIkludGVsIERCUFhBMjUwIERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgTHViYm9jaykiKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiIpCi0JQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQotCU1BUElPKGx1YmJvY2tfbWFwX2lvKQotCUlOSVRJUlEobHViYm9ja19pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGx1YmJvY2tfbWFwX2lvLAorCS5pbml0X2lycQk9IGx1YmJvY2tfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCi0JSU5JVF9NQUNISU5FKGx1YmJvY2tfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gbHViYm9ja19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKaW5kZXggOTg5NmFmYy4uODI3YjdiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKQEAgLTM0NSwxMCArMzQ1LDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTUFJTlNUT05FLCAiSW50ZWwgSENEREJCVkEwIERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgTWFpbnN0b25lKSIpCi0JTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuIikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JTUFQSU8obWFpbnN0b25lX21hcF9pbykKLQlJTklUSVJRKG1haW5zdG9uZV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IG1haW5zdG9uZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gbWFpbnN0b25lX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotCUlOSVRfTUFDSElORShtYWluc3RvbmVfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gbWFpbnN0b25lX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwppbmRleCBiNmM3NDZlLi4wZTRmNmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwpAQCAtMTgwLDEwICsxODAsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChQT09ETEUsICJTSEFSUCBQb29kbGUiKQotCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKLQlGSVhVUChmaXh1cF9wb29kbGUpCi0JTUFQSU8ocG9vZGxlX21hcF9pbykKLQlJTklUSVJRKHB4YV9pbml0X2lycSkKLQkudGltZXIgPSAmcHhhX3RpbWVyLAotCS5pbml0X21hY2hpbmUgPSBwb29kbGVfaW5pdCwKKwkucGh5c19yYW0JPSAweGEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuZml4dXAJCT0gZml4dXBfcG9vZGxlLAorCS5tYXBfaW8JCT0gcG9vZGxlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGFfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IHBvb2RsZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKaW5kZXggODkzOTY0Zi4uOWE3OTFiMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKQEAgLTEyNiw2ICsxMjYsNyBAQAogewogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIFBNX1NVU1BFTkRfTUVNOgorCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzOCw3ICsxMzksMTAgQEAKIAlleHRlcm4gdm9pZCBweGFfY3B1X3N1c3BlbmQodW5zaWduZWQgaW50KTsKIAlleHRlcm4gdm9pZCBweGFfY3B1X3Jlc3VtZSh2b2lkKTsKIAotCUNLRU4gPSBDS0VOMjJfTUVNQyB8IENLRU45X09TVElNRVI7CisJaWYgKHN0YXRlID09IFBNX1NVU1BFTkRfU1RBTkRCWSkKKwkJQ0tFTiA9IENLRU4yMl9NRU1DIHwgQ0tFTjlfT1NUSU1FUiB8IENLRU4xNl9MQ0QgfENLRU4wX1BXTTA7CisJZWxzZQorCQlDS0VOID0gQ0tFTjIyX01FTUMgfCBDS0VOOV9PU1RJTUVSOwogCiAJLyogZW5zdXJlIHZvbHRhZ2UtY2hhbmdlIHNlcXVlbmNlciBub3QgaW5pdGlhdGVkLCB3aGljaCBoYW5ncyAqLwogCVBDRlIgJj0gflBDRlJfRlZDOwpAQCAtMTQ3LDYgKzE1MSw5IEBACiAJUEVEUiA9IDB4REYxMkZFMUI7CiAKIAlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBQTV9TVVNQRU5EX1NUQU5EQlk6CisJCXB4YV9jcHVfc3RhbmRieSgpOworCQlicmVhazsKIAljYXNlIFBNX1NVU1BFTkRfTUVNOgogCQkvKiBzZXQgcmVzdW1lIHJldHVybiBhZGRyZXNzICovCiAJCVBTUFIgPSB2aXJ0X3RvX3BoeXMocHhhX2NwdV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3RhbmRieS5TIGIvYXJjaC9hcm0vbWFjaC1weGEvc3RhbmRieS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2YyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zdGFuZGJ5LlMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFBYQTI3eCBzdGFuZGJ5IG1vZGUKKyAqCisgKiBBdXRob3I6IERhdmlkIEJ1cnJhZ2UKKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworCQkudGV4dAorCitFTlRSWShweGFfY3B1X3N0YW5kYnkpCisJbGRyCXIwLCA9UFNTUgorCW1vdglyMSwgIyhQU1NSX1BIIHwgUFNTUl9TVFMpCisJbW92CXIyLCAjMgorCW1vdglyMywgI1VOQ0FDSEVEX1BIWVNfMAlAIFJlYWQgbWVtIGNvbnRleHQgaW4uCisJbGRyCWlwLCBbcjNdCisJYgkxZgorCisJLmFsaWduCTUKKzE6CW1jcglwMTQsIDAsIHIyLCBjNywgYzAsIDAJQCBwdXQgdGhlIHN5c3RlbSBpbnRvIFN0YW5kYnkKKwlzdHIJcjEsIFtyMF0JCUAgbWFrZSBzdXJlIFBTU1JfUEgvU1RTIGFyZSBjbGVhcgorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwppbmRleCA0NzNmYjYxLi42ZTUyMDIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCkBAIC0xMDUsOCArMTA1LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcHhhX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiUFhBIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBweGFfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gcHhhX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBweGFfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwppbmRleCA0MzcxMDY4Li5hMTAyNjg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwpAQCAtMTYzLDEyICsxNjMsMTQgQEAKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGlvY190aW1lcjsKIAogTUFDSElORV9TVEFSVChSSVNDUEMsICJBY29ybi1SaXNjUEMiKQotCU1BSU5UQUlORVIoIlJ1c3NlbGwgS2luZyIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHgwMzAwMDAwMCwgMHhlMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCURJU0FCTEVfUEFSUE9SVCgwKQotCURJU0FCTEVfUEFSUE9SVCgxKQotCU1BUElPKHJwY19tYXBfaW8pCi0JSU5JVElSUShycGNfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4MDMwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkucmVzZXJ2ZV9scDAJPSAxLAorCS5yZXNlcnZlX2xwMQk9IDEsCisJLm1hcF9pbwkJPSBycGNfbWFwX2lvLAorCS5pbml0X2lycQk9IHJwY19pbml0X2lycSwKIAkudGltZXIJCT0gJmlvY190aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCmluZGV4IDUzNGRmMGMuLmQ0ZDAzZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCkBAIC0xNTQsNiArMTU0LDExIEBACiAJICB0aGUgQ1JDIGRhdGEgYmxvY2sgd2lsbCB0YWtlIG1vcmUgbWVtb3J5LCBidXQgd2lsIGlkZW50aWZ5IGFueQogCSAgZmF1bHRzIHdpdGggYmV0dGVyIHByZWNpc2lvbi4KIAorY29uZmlnIFBNX1NJTVRFQworCWJvb2wKKwlkZXBlbmRzIG9uIFBNICYmIChBUkNIX0JBU1QgfHwgTUFDSF9WUjEwMDApCisJZGVmYXVsdCB5CisKIGNvbmZpZyBTM0MyNDEwX0xPV0xFVkVMX1VBUlRfUE9SVAogCWludCAiUzNDMjQxMCBVQVJUIHRvIHVzZSBmb3IgbG93LWxldmVsIG1lc3NhZ2VzIgogCWRlZmF1bHQgMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDdjMzc5YWEuLmY5OWI2ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKICMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0CiAKIG9iai0kKENPTkZJR19QTSkJICAgKz0gcG0ubyBzbGVlcC5vCitvYmotJChDT05GSUdfUE1fU0lNVEVDKQkgICArPSBwbS1zaW10ZWMubwogCiAjIFMzQzI0NDAgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYwppbmRleCA2NDc5MmY2Li40NjY0YmQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKQEAgLTk2LDggKzk2LDggQEAKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfbGNkX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHMzY19sY2RfcmVzb3VyY2UsCiAJLmRldiAgICAgICAgICAgICAgPSB7Ci0JCS5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX2xjZF9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKKwkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2xjZF9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKaW5kZXggYzdjMjg4OS4uNjVmZWFmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYwpAQCAtNDM2LDcgKzQzNiw3IEBACiAKIAlidWYgPSBrbWVtX2NhY2hlX2FsbG9jKGRtYV9rbWVtLCBHRlBfQVRPTUlDKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBvdXQgb2YgbWVtb3J5ICglZCBhbGxvYylcbiIsCisJCXByX2RlYnVnKCIlczogb3V0IG9mIG1lbW9yeSAoJWxkIGFsbG9jKVxuIiwKIAkJCSBfX0ZVTkNUSU9OX18sIHNpemVvZigqYnVmKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYwppbmRleCBiNjY4YzQ4Li5jZjlmNDZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCkBAIC00MCw4ICs0MCwxMSBAQAogICogICAwNC1Ob3YtMjAwNCAgQmVuIERvb2tzCiAgKgkJICBGaXggc3RhbmRhcmQgSVJRIHdha2UgZm9yIEVJTlQwLi40IGFuZCBSVEMKICAqCi0gKiAgIDIyLUZlYi0yMDA0ICBCZW4gRG9va3MKKyAqICAgMjItRmViLTIwMDUgIEJlbiBEb29rcwogICoJCSAgRml4ZWQgZWRnZS10cmlnZ2VyaW5nIG9uIEFEQyBJUlEKKyAqCisgKiAgIDI4LUp1bi0yMDA1ICBCZW4gRG9va3MKKyAqCQkgIE1hcmsgSVJRX0xDRCB2YWxpZAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM2Niw3ICszNjksNiBAQAogI2RlZmluZSBJTlRNU0tfVUFSVDEJICgxVUwgPDwgKElSUV9VQVJUMSAtIElSUV9FSU5UMCkpCiAjZGVmaW5lIElOVE1TS19VQVJUMgkgKDFVTCA8PCAoSVJRX1VBUlQyIC0gSVJRX0VJTlQwKSkKICNkZWZpbmUgSU5UTVNLX0FEQ1BBUkVOVCAoMVVMIDw8IChJUlFfQURDUEFSRU5UIC0gSVJRX0VJTlQwKSkKLSNkZWZpbmUgSU5UTVNLX0xDRAkgKDFVTCA8PCAoSVJRX0xDRCAtIElSUV9FSU5UMCkpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogczNjX2lycXN1Yl9tYXNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudGJpdCwKQEAgLTcxNiw3ICs3MTgsNiBAQAogCQljYXNlIElSUV9VQVJUMDoKIAkJY2FzZSBJUlFfVUFSVDE6CiAJCWNhc2UgSVJRX1VBUlQyOgotCQljYXNlIElSUV9MQ0Q6CiAJCWNhc2UgSVJRX0FEQ1BBUkVOVDoKIAkJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFfbGV2ZWxfY2hpcCk7CiAJCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2xldmVsX0lSUSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKaW5kZXggZjNlOTcwMC4uMjA2Nzc4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwpAQCAtMjcsNiArMjcsOCBAQAogICogICAgIDEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKICAqICAgICAxNC1NYXItMjAwNiBCSkQgIFVwZGF0ZWQgZm9yIF9faW9tZW0gY2hhbmdlcwogICogICAgIDIyLUp1bi0yMDA2IEJKRCAgQWRkZWQgRE05MDAwIHBsYXRmb3JtIGluZm9ybWF0aW9uCisgKiAgICAgMjgtSnVuLTIwMDYgQkpEICBNb3ZlZCBwbSBmdW5jdGlvbmFsaXR5IG91dCB0byBjb21tb24gY29kZQorICogICAgIDE3LUp1bC0yMDA2IEJKRCAgQ2hhbmdlZCB0byBwbGF0Zm9ybSBkZXZpY2UgZm9yIFN1cGVySU8gMTY1NTBzCiAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02MywxMSArNjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKwogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAiZGV2cy5oIgogI2luY2x1ZGUgImNwdS5oIgogI2luY2x1ZGUgInVzYi1zaW10ZWMuaCIKLSNpbmNsdWRlICJwbS5oIgogCiAjZGVmaW5lIENPUFlSSUdIVCAiLCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcyIKIApAQCAtMzUxLDYgKzM1NCwzOSBAQAogCX0KIH07CiAKKy8qIHNlcmlhbCBkZXZpY2VzICovCisKKyNkZWZpbmUgU0VSSUFMX0JBU0UgIChTM0MyNDEwX0NTMiArIEJBU1RfUEFfU1VQRVJJTykKKyNkZWZpbmUgU0VSSUFMX0ZMQUdTIChVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQIHwgVVBGX1NIQVJFX0lSUSkKKyNkZWZpbmUgU0VSSUFMX0NMSyAgICgxODQzMjAwKQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGJhc3Rfc2lvX2RhdGFbXSA9IHsKKwlbMF0gPSB7CisJCS5tYXBiYXNlCT0gU0VSSUFMX0JBU0UgKyAweDJmOCwKKwkJLmlycQkJPSBJUlFfUENTRVJJQUwxLAorCQkuZmxhZ3MJCT0gU0VSSUFMX0ZMQUdTLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAwLAorCQkudWFydGNsawk9IFNFUklBTF9DTEssCisJfSwKKwlbMV0gPSB7CisJCS5tYXBiYXNlCT0gU0VSSUFMX0JBU0UgKyAweDNmOCwKKwkJLmlycQkJPSBJUlFfUENTRVJJQUwyLAorCQkuZmxhZ3MJCT0gU0VSSUFMX0ZMQUdTLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAwLAorCQkudWFydGNsawk9IFNFUklBTF9DTEssCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJhc3Rfc2lvID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSAwLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmYmFzdF9zaW9fZGF0YSwKKwl9LAorfTsKIAogLyogU3RhbmRhcmQgQkFTVCBkZXZpY2VzICovCiAKQEAgLTM2NCw2ICs0MDAsNyBAQAogCSZzM2NfZGV2aWNlX25hbmQsCiAJJmJhc3RfZGV2aWNlX25vciwKIAkmYmFzdF9kZXZpY2VfZG05aywKKwkmYmFzdF9zaW8sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqYmFzdF9jbG9ja3NbXSA9IHsKQEAgLTQwNSw0NCArNDQyLDE0IEBACiAJdXNiX3NpbXRlY19pbml0KCk7CiB9CiAKLXZvaWQgX19pbml0IGJhc3RfaW5pdF9pcnEodm9pZCkKLXsKLQlzM2MyNHh4X2luaXRfaXJxKCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotLyogYmFzdF9pbml0X21hY2hpbmUKLSAqCi0gKiBlbmFibGUgdGhlIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZvciB0aGUgRUIyNDEwSVRYCi0qLwotCi1zdGF0aWMgX19pbml0IHZvaWQgYmFzdF9pbml0X21hY2hpbmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGdzdGF0dXM0OwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQkFTVCBQb3dlciBNYW5hbmdlbWVudCIgQ09QWVJJR0hUICJcbiIpOwotCi0JZ3N0YXR1czQgID0gKF9fcmF3X3JlYWRsKFMzQzI0MTBfQkFOS0NPTjcpICYgMHgzKSA8PCAzMDsKLQlnc3RhdHVzNCB8PSAoX19yYXdfcmVhZGwoUzNDMjQxMF9CQU5LQ09ONikgJiAweDMpIDw8IDI4OwotCWdzdGF0dXM0IHw9IChfX3Jhd19yZWFkbChTM0MyNDEwX0JBTktTSVpFKSAmIFMzQzI0MTBfQkFOS1NJWkVfTUFTSyk7Ci0KLQlfX3Jhd193cml0ZWwoZ3N0YXR1czQsIFMzQzI0MTBfR1NUQVRVUzQpOwotCi0JczNjMjQxMF9wbV9pbml0KCk7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIGJhc3RfaW5pdF9tYWNoaW5lIE5VTEwKLSNlbmRpZgotCiAKIE1BQ0hJTkVfU1RBUlQoQkFTVCwgIlNpbXRlYy1CQVNUIikKLSAgICAgTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKLSAgICAgTUFQSU8oYmFzdF9tYXBfaW8pCi0gICAgIElOSVRJUlEoYmFzdF9pbml0X2lycSkKLQkuaW5pdF9tYWNoaW5lCT0gYmFzdF9pbml0X21hY2hpbmUsCisJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkubWFwX2lvCQk9IGJhc3RfbWFwX2lvLAorCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCmluZGV4IDI5MjRhZmMuLmVhNGZiMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwpAQCAtMTE3LDEwICsxMTcsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMTk0MCwgIklQQVEtSDE5NDAiKQotICAgICBNQUlOVEFJTkVSKCJCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+IikKLSAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKLSAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQotICAgICBNQVBJTyhoMTk0MF9tYXBfaW8pCi0gICAgIElOSVRJUlEoaDE5NDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkubWFwX2lvCQk9IGgxOTQwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBoMTk0MF9pbml0X2lycSwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYwppbmRleCBiZDE1OTk4Li43OTA0NGQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYwpAQCAtMTM3LDEwICsxMzcsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChOMzAsICJBY2VyLU4zMCIpCi0gICAgIE1BSU5UQUlORVIoIkNocmlzdGVyIFdlaW5pZ2VsIDxjaHJpc3RlckB3ZWluaWdlbC5zZT4sIEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCi0KKwkvKiBNYWludGFpbmVyOiBDaHJpc3RlciBXZWluaWdlbCA8Y2hyaXN0ZXJAd2VpbmlnZWwuc2U+LCBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gbjMwX2luaXQsCiAJLmluaXRfaXJxCT0gbjMwX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW5leGNvZGVyLmMKaW5kZXggNzA0ODdiZi4uZDI0YzI0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uZXhjb2Rlci5jCkBAIC0xNDcsOSArMTQ3LDExIEBACiAKIAogTUFDSElORV9TVEFSVChORVhDT0RFUl8yNDQwLCAiTmV4VmlzaW9uIC0gTmV4Y29kZXIgMjQ0MCIpCi0gICAgIE1BSU5UQUlORVIoIkd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PiIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKwkvKiBNYWludGFpbmVyOiBHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dj4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBuZXhjb2Rlcl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKaW5kZXggNjdkOGNlOC4uZDkwMWVkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYwpAQCAtMTE1LDkgKzExNSwxMSBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoT1RPTSwgIk5leCBWaXNpb24gLSBPdG9tIDEuMSIpCi0gICAgIE1BSU5UQUlORVIoIkd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PiIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKwkvKiBNYWludGFpbmVyOiBHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dj4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBvdG9tMTFfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYwppbmRleCBmOGQzYTk3Li5hNzNkNjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYwpAQCAtMTMxLDExICsxMzEsMTMgQEAKICNlbmRpZgogCiBNQUNISU5FX1NUQVJUKFJYMzcxNSwgIklQQVEtUlgzNzE1IikKLSAgICAgTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKLSAgICAgTUFQSU8ocngzNzE1X21hcF9pbykKLSAgICAgSU5JVElSUShyeDM3MTVfaW5pdF9pcnEpCi0gICAgIElOSVRfTUFDSElORShyeDM3MTVfaW5pdF9tYWNoaW5lKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLm1hcF9pbwkJPSByeDM3MTVfbWFwX2lvLAorCS5pbml0X2lycQk9IHJ4MzcxNV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gcngzNzE1X2luaXRfbWFjaGluZSwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKaW5kZXggYzFhNGExNC4uNjdlOTAzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCkBAIC0xMTIsMTEgKzExMiwxMyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREsyNDEwLCAiU01ESzI0MTAiKSAvKiBAVE9ETzogcmVxdWVzdCBhIG5ldyBpZGVudGlmaWVyIGFuZCBzd2l0Y2gKIAkJCQkgICAgKiB0byBTTURLMjQxMCAqLwotICAgICBNQUlOVEFJTkVSKCJKb25hcyBEaWV0c2NoZSIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKLSAgICAgTUFQSU8oc21kazI0MTBfbWFwX2lvKQotICAgICBJTklUSVJRKHNtZGsyNDEwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEpvbmFzIERpZXRzY2hlICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5tYXBfaW8JCT0gc21kazI0MTBfbWFwX2lvLAorCS5pbml0X2lycQk9IHNtZGsyNDEwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQ0MC5jCmluZGV4IDc4NTcxNzYuLjM1NzUyMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0NDAuYwpAQCAtMTI0LDkgKzEyNCwxMSBAQAogfQogCiBNQUNISU5FX1NUQVJUKFMzQzI0NDAsICJTTURLMjQ0MCIpCi0JTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiIpCi0JQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKLQlCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCisJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKIAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWRrMjQ0MF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCmluZGV4IDc2YmUwNzQuLjkyNGU4NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCkBAIC0zNzEsMTYgKzM3MSwxNCBAQAogCXVzYl9zaW10ZWNfaW5pdCgpOwogfQogCi12b2lkIF9faW5pdCB2cjEwMDBfaW5pdF9pcnEodm9pZCkKLXsKLQlzM2MyNHh4X2luaXRfaXJxKCk7Ci19CiAKIE1BQ0hJTkVfU1RBUlQoVlIxMDAwLCAiVGhvcmNvbS1WUjEwMDAiKQotICAgICBNQUlOVEFJTkVSKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+IikKLSAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKLSAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQotICAgICBNQVBJTyh2cjEwMDBfbWFwX2lvKQotICAgICBJTklUSVJRKHZyMTAwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+ICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5tYXBfaW8JCT0gdnIxMDAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNzk4OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYwpAQCAtMCwwICsxLDY1IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBQb3dlciBNYW5hZ2VtZW50IGhlbHBlcnMgZm9yIFNpbXRlYyBTM0MyNFhYIGltcGxlbWVudGF0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1tZW0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJwbS5oIgorCisjZGVmaW5lIENPUFlSSUdIVCAiLCAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MiCisKKy8qIHBtX3NpbXRlY19pbml0CisgKgorICogZW5hYmxlIHRoZSBwb3dlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucworKi8KKworc3RhdGljIF9faW5pdCBpbnQgcG1fc2ltdGVjX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGdzdGF0dXM0OworCisJLyogY2hlY2sgd2hpY2ggbWFjaGluZSB3ZSBhcmUgcnVubmluZyBvbiAqLworCisJaWYgKCFtYWNoaW5lX2lzX2Jhc3QoKSAmJiAhbWFjaGluZV9pc192cjEwMDAoKSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJTaW10ZWMgQm9hcmQgUG93ZXIgTWFuYW5nZW1lbnQiIENPUFlSSUdIVCAiXG4iKTsKKworCWdzdGF0dXM0ICA9IChfX3Jhd19yZWFkbChTM0MyNDEwX0JBTktDT043KSAmIDB4MykgPDwgMzA7CisJZ3N0YXR1czQgfD0gKF9fcmF3X3JlYWRsKFMzQzI0MTBfQkFOS0NPTjYpICYgMHgzKSA8PCAyODsKKwlnc3RhdHVzNCB8PSAoX19yYXdfcmVhZGwoUzNDMjQxMF9CQU5LU0laRSkgJiBTM0MyNDEwX0JBTktTSVpFX01BU0spOworCisJX19yYXdfd3JpdGVsKGdzdGF0dXM0LCBTM0MyNDEwX0dTVEFUVVM0KTsKKworCXJldHVybiBzM2MyNDEwX3BtX2luaXQoKTsKK30KKworYXJjaF9pbml0Y2FsbChwbV9zaW10ZWNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3RpbWUuYwppbmRleCAxNzlmMGUwLi43NjVhM2E5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMKQEAgLTEzNyw4ICsxMzcsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzM2MyNDEwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiUzNDMjQxMCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gczNjMjQxMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBzM2MyNDEwX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKaW5kZXggYmVkZjg4Zi4uNGQ0ZDMwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwpAQCAtNDMxLDExICs0MzEsMTMgQEAKIAogCiBNQUNISU5FX1NUQVJUKEFTU0FCRVQsICJJbnRlbC1Bc3NhYmV0IikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JRklYVVAoZml4dXBfYXNzYWJldCkKLQlNQVBJTyhhc3NhYmV0X21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5maXh1cAkJPSBmaXh1cF9hc3NhYmV0LAorCS5tYXBfaW8JCT0gYXNzYWJldF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBhc3NhYmV0X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwppbmRleCA2YTYwYjQ5Li5iNjE2OWNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwpAQCAtMjg1LDkgKzI4NSwxMSBAQAogfQogCiBNQUNISU5FX1NUQVJUKEJBREdFNCwgIkhld2xldHQtUGFja2FyZCBMYWJvcmF0b3JpZXMgQmFkZ2VQQUQgNCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGJhZGdlNF9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGJhZGdlNF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYwppbmRleCBmOGVkZGU1Li4wYWE5MThlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jZXJmLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2VyZi5jCkBAIC0xMjMsMTAgKzEyMywxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKENFUkYsICJJbnRyaW5zeWMgQ2VyZkJvYXJkL0NlcmZDdWJlIikKLQlNQUlOVEFJTkVSKCJzdXBwb3J0QGludHJpbnN5Yy5jb20iKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JTUFQSU8oY2VyZl9tYXBfaW8pCi0JSU5JVElSUShjZXJmX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IHN1cHBvcnRAaW50cmluc3ljLmNvbSAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gY2VyZl9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2VyZl9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gY2VyZl9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMKaW5kZXggOTkyODc4OS4uOGNiNjkxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMKQEAgLTE4NCw5ICsxODQsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChDT0xMSUUsICJTaGFycC1Db2xsaWUiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JTUFQSU8oY29sbGllX21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGNvbGxpZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBjb2xsaWVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKaW5kZXggOGQyYTg5YS4uMDRjOTRhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYwpAQCAtMjcxLDggKzI3MSw3IEBACiAJICovCiAJc2RyYW1fc2V0X3JlZnJlc2goMik7CiAJaWYgKCFpcnFzX2Rpc2FibGVkKCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDIwICogSFogLyAxMDAwKTsKKwkJbXNsZWVwKDIwKTsKIAl9IGVsc2UgewogCQltZGVsYXkoMjApOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCmluZGV4IDg0Yzg2NTQuLmU3YWEyNjgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKQEAgLTM4MCwxMCArMzgwLDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDMxMDAsICJDb21wYXEgaVBBUSBIMzEwMCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGgzMTAwX21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDMxMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaDN4eHhfbWFjaF9pbml0LAogTUFDSElORV9FTkQKQEAgLTQ5NiwxMCArNDk4LDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDM2MDAsICJDb21wYXEgaVBBUSBIMzYwMCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGgzNjAwX21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDM2MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaDN4eHhfbWFjaF9pbml0LAogTUFDSElORV9FTkQKQEAgLTcyNyw3ICs3MzEsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaDM4MDBfaXJxID0gewogCS5uYW1lCQk9ICJoMzgwMF9hc2ljIiwKIAkuaGFuZGxlcgk9IGgzODAwX0lSUV9kZW11eCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKIH07CiAKIHUzMiBrcGlvX2ludF9zaGFkb3cgPSAwOwpAQCAtODgxLDEwICs4ODUsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMzgwMCwgIkNvbXBhcSBpUEFRIEgzODAwIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oaDM4MDBfbWFwX2lvKQotCUlOSVRJUlEoaDM4MDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGgzODAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBoMzgwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaDN4eHhfbWFjaF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYwppbmRleCA1NzA4NDE3Li41MDJkNjVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jCkBAIC0xOTEsMTAgKzE5MSwxMiBAQAogICovCiAKIE1BQ0hJTkVfU1RBUlQoSEFDS0tJVCwgIkhhY2tLaXQgQ3B1IEJvYXJkIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oaGFja2tpdF9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGhhY2traXRfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaGFja2tpdF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwppbmRleCA2YmU3ODI5Li5lZWUzY2JjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCkBAIC05Nyw5ICs5NywxMSBAQAogfQogCiBNQUNISU5FX1NUQVJUKEpPUk5BREE3MjAsICJIUCBKb3JuYWRhIDcyMCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGpvcm5hZGE3MjBfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBqb3JuYWRhNzIwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCmluZGV4IDUxYzA4Y2MuLjg3MGI0ODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKQEAgLTQxLDkgKzQxLDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTEFSVCwgIkxBUlQiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhsYXJ0X21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gbGFydF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwppbmRleCA1NjA2YmQ3Li5lMTdiNThmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCkBAIC0xNDYsOSArMTQ2LDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUExFQiwgIlBMRUIiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JTUFQSU8ocGxlYl9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBwbGViX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZSAgID0gcGxlYl9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYwppbmRleCBlZGRkZDU1Li40M2EwMDM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCkBAIC03NiwxMCArNzYsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChTSEFOTk9OLCAiU2hhbm5vbiAoQUtBOiBUdXhzY3JlZW4pIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oc2hhbm5vbl9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IHNoYW5ub25fbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gc2hhbm5vbl9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMKaW5kZXggOGQxMTNkNi4uNzc5Nzg1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMKQEAgLTIxNSwxMCArMjE1LDEyIEBACiAKIAogTUFDSElORV9TVEFSVChTSU1QQUQsICJTaW1wYWQiKQotCU1BSU5UQUlORVIoIkhvbGdlciBGcmV5dGhlciIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLSAgICAgICAgQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhzaW1wYWRfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEhvbGdlciBGcmV5dGhlciAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBzaW1wYWRfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKaW5kZXggMTliMGMwZi4uMGVlYjM2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwpAQCAtOTksOCArOTksOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzYTExMDBfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJTQTExeHggVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IHNhMTEwMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBzYTExMDBfdGltZXJfaW50ZXJydXB0LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHNhMTEwMF90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCmluZGV4IGE5YmM1ZDAuLmU3MzdlYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAJCS5pb2Jhc2UJCT0gMHgzZjgsCiAJCS5pcnEJCT0gNCwKIAkJLnVhcnRjbGsJPSAxODQzMjAwLAotCQkucmVnc2hpZnQJPSAyLAorCQkucmVnc2hpZnQJPSAwLAogCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKIAl9LApAQCAtMzIsNyArMzIsNyBAQAogCQkuaW9iYXNlCQk9IDB4MmY4LAogCQkuaXJxCQk9IDMsCiAJCS51YXJ0Y2xrCT0gMTg0MzIwMCwKLQkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnJlZ3NoaWZ0CT0gMCwKIAkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCiAJfSwKQEAgLTg0LDggKzg0LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc2hhcmtfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJTaGFyayBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gc2hhcmtfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gc2hhcmtfdGltZXJfaW50ZXJydXB0LAogfTsKIAogLyoKQEAgLTEwNSwxMCArMTA1LDEyIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKFNIQVJLLCAiU2hhcmsiKQotCU1BSU5UQUlORVIoIkFsZXhhbmRlciBTY2h1bHoiKQotCUJPT1RfTUVNKDB4MDgwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ZTAwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwODAwMzAwMCkKLQlNQVBJTyhzaGFya19tYXBfaW8pCi0JSU5JVElSUShzaGFya19pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBBbGV4YW5kZXIgU2NodWx6ICovCisJLnBoeXNfcmFtCT0gMHgwODAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwODAwMzAwMCwKKwkubWFwX2lvCQk9IHNoYXJrX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzaGFya19pbml0X2lycSwKIAkudGltZXIJCT0gJnNoYXJrX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCA2YTdjYmVhLi5mMDFjMGY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2NsY2QuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3QzMDcuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTc4OCwzOCArNzg5LDI1IEBACiAgKi8KICNkZWZpbmUgVElNRVJfSU5URVJWQUwJKFRJQ0tTX1BFUl91U0VDICogbVNFQ18xMCkKICNpZiBUSU1FUl9JTlRFUlZBTCA+PSAweDEwMDAwMAotI2RlZmluZSBUSU1FUl9SRUxPQUQJKFRJTUVSX0lOVEVSVkFMID4+IDgpCQkvKiBEaXZpZGUgYnkgMjU2ICovCi0jZGVmaW5lIFRJTUVSX0NUUkwJMHg4OAkJCQkvKiBFbmFibGUsIENsb2NrIC8gMjU2ICovCisjZGVmaW5lIFRJTUVSX1JFTE9BRAkoVElNRVJfSU5URVJWQUwgPj4gOCkKKyNkZWZpbmUgVElNRVJfRElWSVNPUgkoVElNRVJfQ1RSTF9ESVYyNTYpCiAjZGVmaW5lIFRJQ0tTMlVTRUNTKHgpCSgyNTYgKiAoeCkgLyBUSUNLU19QRVJfdVNFQykKICNlbGlmIFRJTUVSX0lOVEVSVkFMID49IDB4MTAwMDAKICNkZWZpbmUgVElNRVJfUkVMT0FECShUSU1FUl9JTlRFUlZBTCA+PiA0KQkJLyogRGl2aWRlIGJ5IDE2ICovCi0jZGVmaW5lIFRJTUVSX0NUUkwJMHg4NAkJCQkvKiBFbmFibGUsIENsb2NrIC8gMTYgKi8KKyNkZWZpbmUgVElNRVJfRElWSVNPUgkoVElNRVJfQ1RSTF9ESVYxNikKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKDE2ICogKHgpIC8gVElDS1NfUEVSX3VTRUMpCiAjZWxzZQogI2RlZmluZSBUSU1FUl9SRUxPQUQJKFRJTUVSX0lOVEVSVkFMKQotI2RlZmluZSBUSU1FUl9DVFJMCTB4ODAJCQkJLyogRW5hYmxlICovCisjZGVmaW5lIFRJTUVSX0RJVklTT1IJKFRJTUVSX0NUUkxfRElWMSkKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKCh4KSAvIFRJQ0tTX1BFUl91U0VDKQogI2VuZGlmCiAKLSNkZWZpbmUgVElNRVJfQ1RSTF9JRQkoMSA8PCA1KQkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0KLS8qCi0gKiBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwotICovCi10eXBlZGVmIHN0cnVjdCBUaW1lclN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBUaW1lckxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDb250cm9sOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDbGVhcjsKLX0gVGltZXJTdHJ1Y3RfdDsKLQogLyoKICAqIFJldHVybnMgbnVtYmVyIG9mIG1zIHNpbmNlIGxhc3QgY2xvY2sgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKICAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmZzZXQoKQogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZXJzYXRpbGVfZ2V0dGltZW9mZnNldCh2b2lkKQogewotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMCA9IChUaW1lclN0cnVjdF90ICopVElNRVIwX1ZBX0JBU0U7CiAJdW5zaWduZWQgbG9uZyB0aWNrczEsIHRpY2tzMiwgc3RhdHVzOwogCiAJLyoKQEAgLTgyOCwxMSArODE2LDExIEBACiAJICogYW4gaW50ZXJydXB0LiAgV2UgZ2V0IGFyb3VuZCB0aGlzIGJ5IGVuc3VyaW5nIHRoYXQgdGhlCiAJICogY291bnRlciBoYXMgbm90IHJlbG9hZGVkIGJldHdlZW4gb3VyIHR3byByZWFkcy4KIAkgKi8KLQl0aWNrczIgPSB0aW1lcjAtPlRpbWVyVmFsdWUgJiAweGZmZmY7CisJdGlja3MyID0gcmVhZGwoVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9WQUxVRSkgJiAweGZmZmY7CiAJZG8gewogCQl0aWNrczEgPSB0aWNrczI7CiAJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKFZBX0lDX0JBU0UgKyBWSUNfSVJRX1JBV19TVEFUVVMpOwotCQl0aWNrczIgPSB0aW1lcjAtPlRpbWVyVmFsdWUgJiAweGZmZmY7CisJCXRpY2tzMiA9IHJlYWRsKFRJTUVSMF9WQV9CQVNFICsgVElNRVJfVkFMVUUpICYgMHhmZmZmOwogCX0gd2hpbGUgKHRpY2tzMiA+IHRpY2tzMSk7CiAKIAkvKgpAQCAtODU5LDEyICs4NDcsMTAgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjAgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMF9WQV9CQVNFOwotCiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CiAKIAkvLyAuLi5jbGVhciB0aGUgaW50ZXJydXB0Ci0JdGltZXIwLT5UaW1lckNsZWFyID0gMTsKKwl3cml0ZWwoMSwgVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9JTlRDTFIpOwogCiAJdGltZXJfdGljayhyZWdzKTsKIApAQCAtODc1LDggKzg2MSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHZlcnNhdGlsZV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIlZlcnNhdGlsZSBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gdmVyc2F0aWxlX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtODg0LDMxICs4NzAsMzIgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHZlcnNhdGlsZV90aW1lcl9pbml0KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIwID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjBfVkFfQkFTRTsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjEgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMV9WQV9CQVNFOwotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMiA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIyX1ZBX0JBU0U7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIzID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjNfVkFfQkFTRTsKKwl1MzIgdmFsOwogCiAJLyogCiAJICogc2V0IGNsb2NrIGZyZXF1ZW5jeTogCiAJICoJVkVSU0FUSUxFX1JFRkNMSyBpcyAzMktIegogCSAqCVZFUlNBVElMRV9USU1DTEsgaXMgMU1IegogCSAqLwotCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSB8PSAKLQkgICgoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVIxX0VuU2VsKSB8IChWRVJTQVRJTEVfVElNQ0xLIDw8IFZFUlNBVElMRV9USU1FUjJfRW5TZWwpIHwgCi0JICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSM19FblNlbCkgfCAoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVI0X0VuU2VsKSk7CisJdmFsID0gcmVhZGwoSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSk7CisJd3JpdGVsKChWRVJTQVRJTEVfVElNQ0xLIDw8IFZFUlNBVElMRV9USU1FUjFfRW5TZWwpIHwKKwkgICAgICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSMl9FblNlbCkgfCAKKwkgICAgICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSM19FblNlbCkgfAorCSAgICAgICAoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVI0X0VuU2VsKSB8IHZhbCwKKwkgICAgICAgSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSk7CiAKIAkvKgogCSAqIEluaXRpYWxpc2UgdG8gYSBrbm93biBzdGF0ZSAoYWxsIHRpbWVycyBvZmYpCiAJICovCi0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSAwOwotCXRpbWVyMS0+VGltZXJDb250cm9sID0gMDsKLQl0aW1lcjItPlRpbWVyQ29udHJvbCA9IDA7Ci0JdGltZXIzLT5UaW1lckNvbnRyb2wgPSAwOworCXdyaXRlbCgwLCBUSU1FUjBfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjFfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjJfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjNfVkFfQkFTRSArIFRJTUVSX0NUUkwpOwogCi0JdGltZXIwLT5UaW1lckxvYWQgICAgPSBUSU1FUl9SRUxPQUQ7Ci0JdGltZXIwLT5UaW1lclZhbHVlICAgPSBUSU1FUl9SRUxPQUQ7Ci0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSBUSU1FUl9DVFJMIHwgMHg0MCB8IFRJTUVSX0NUUkxfSUU7ICAvKiBwZXJpb2RpYyArIElFICovCisJd3JpdGVsKFRJTUVSX1JFTE9BRCwgVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9MT0FEKTsKKwl3cml0ZWwoVElNRVJfUkVMT0FELCBUSU1FUjBfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKTsKKwl3cml0ZWwoVElNRVJfRElWSVNPUiB8IFRJTUVSX0NUUkxfRU5BQkxFIHwgVElNRVJfQ1RSTF9QRVJJT0RJQyB8CisJICAgICAgIFRJTUVSX0NUUkxfSUUsIFRJTUVSMF9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CiAKIAkvKiAKIAkgKiBNYWtlIGlycXMgaGFwcGVuIGZvciB0aGUgc3lzdGVtIHRpbWVyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCmluZGV4IGQzMzIwODQuLjhiMGIzYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCkBAIC0zNSwxMSArMzUsMTMgQEAKICNpbmNsdWRlICJjb3JlLmgiCiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX0FCLCAiQVJNLVZlcnNhdGlsZSBBQiIpCi0JTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxMDFmMTAwMCwgMHhmMTFmMTAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKHZlcnNhdGlsZV9tYXBfaW8pCi0JSU5JVElSUSh2ZXJzYXRpbGVfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDEwMWYxMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTFmMTAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2lycQk9IHZlcnNhdGlsZV9pbml0X2lycSwKIAkudGltZXIJCT0gJnZlcnNhdGlsZV90aW1lciwKLQlJTklUX01BQ0hJTkUodmVyc2F0aWxlX2luaXQpCisJLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKaW5kZXggMjcwMjA5OS4uN2MzMDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKQEAgLTk5LDExICs5OSwxMyBAQAogYXJjaF9pbml0Y2FsbCh2ZXJzYXRpbGVfcGJfaW5pdCk7CiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX1BCLCAiQVJNLVZlcnNhdGlsZSBQQiIpCi0JTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxMDFmMTAwMCwgMHhmMTFmMTAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKHZlcnNhdGlsZV9tYXBfaW8pCi0JSU5JVElSUSh2ZXJzYXRpbGVfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDEwMWYxMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTFmMTAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2lycQk9IHZlcnNhdGlsZV9pbml0X2lycSwKIAkudGltZXIJCT0gJnZlcnNhdGlsZV90aW1lciwKLQlJTklUX01BQ0hJTkUodmVyc2F0aWxlX2luaXQpCisJLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDk1NjA2YjQuLmFmYmJlYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKICMgQVJNOTI1VAogY29uZmlnIENQVV9BUk05MjVUCi0gCWJvb2wgIlN1cHBvcnQgQVJNOTI1VCBwcm9jZXNzb3IiIGlmIEFSQ0hfT01BUAorIAlib29sICJTdXBwb3J0IEFSTTkyNVQgcHJvY2Vzc29yIiBpZiBBUkNIX09NQVAxCiAgCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMAogIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMTUxMAogCXNlbGVjdCBDUFVfMzJ2NApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYmxvY2tvcHMuYyBiL2FyY2gvYXJtL21tL2Jsb2Nrb3BzLmMKaW5kZXggODA2YzZlZS4uNGY1ZWUyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vYmxvY2tvcHMuYworKysgYi9hcmNoL2FybS9tbS9ibG9ja29wcy5jCkBAIC0yNSwxMyArMjUsMTQgQEAKIHsKIAlhc20oCiAJImFkZAlyMSwgcjAsICUwCQkJCQkJCVxuXAorCXN1YglyMSwgcjEsICUxCQkJCQkJCVxuXAogMToJLndvcmQJMHhlYzQwMWYwZQlAIG1jcnIJcDE1LCAwLCByMCwgcjEsIGMxNCwgMAlAIGJsb2NraW5nCVxuXAogCW1vdglyMCwgIzAJCQkJCQkJCVxuXAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCQkJCQlcblwKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJCQkJCVxuXAogCW1vdglwYywgbHIiCiAJOgotCTogIkkiIChQQUdFX1NJWkUpKTsKKwk6ICJJIiAoUEFHRV9TSVpFKSwgIkkiIChMMV9DQUNIRV9CWVRFUykpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggZTI1YjRmZC4uNjViZmU4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC0zNzIsNDkgKzM3Miw1MCBAQAogc3RhdGljIHN0cnVjdCBmc3JfaW5mbyB7CiAJaW50CSgqZm4pKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCWludAlzaWc7CisJaW50CWNvZGU7CiAJY29uc3QgY2hhciAqbmFtZTsKIH0gZnNyX2luZm9bXSA9IHsKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBzdGFuZGFyZCBBUk12MyBhbmQgQVJNdjQgYWJvcnRzLiAgQVJNdjUKIAkgKiBkZWZpbmVzIHRoZXNlIHRvIGJlICJwcmVjaXNlIiBhYm9ydHMuCiAJICovCi0JeyBkb19iYWQsCQlTSUdTRUdWLCAidmVjdG9yIGV4Y2VwdGlvbiIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdJTEwsCSAiYWxpZ25tZW50IGV4Y2VwdGlvbiIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdLSUxMLCAidGVybWluYWwgZXhjZXB0aW9uIgkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0lMTCwJICJhbGlnbm1lbnQgZXhjZXB0aW9uIgkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCi0JeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgInNlY3Rpb24gdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbGluZWZldGNoIgkgICB9LAotCXsgZG9fcGFnZV9mYXVsdCwJU0lHU0VHViwgInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIgfSwKLQl7IGRvX2JhZCwJCVNJR1NFR1YsICJzZWN0aW9uIGRvbWFpbiBmYXVsdCIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIgfSwKLQl7IGRvX2JhZCwJCVNJR1NFR1YsICJwYWdlIGRvbWFpbiBmYXVsdCIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gdHJhbnNsYXRpb24iICAgfSwKLQl7IGRvX3NlY3RfZmF1bHQsCVNJR1NFR1YsICJzZWN0aW9uIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gdHJhbnNsYXRpb24iICAgfSwKLQl7IGRvX3BhZ2VfZmF1bHQsCVNJR1NFR1YsICJwYWdlIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdTRUdWLCAwLAkJInZlY3RvciBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHS0lMTCwgMCwJCSJ0ZXJtaW5hbCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCisJeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgU0VHVl9NQVBFUlIsCSJzZWN0aW9uIHRyYW5zbGF0aW9uIGZhdWx0IgkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCisJeyBkb19wYWdlX2ZhdWx0LAlTSUdTRUdWLCBTRUdWX01BUEVSUiwJInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIGRvbWFpbiBmYXVsdCIJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJwYWdlIGRvbWFpbiBmYXVsdCIJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIHRyYW5zbGF0aW9uIgkgICB9LAorCXsgZG9fc2VjdF9mYXVsdCwJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIHRyYW5zbGF0aW9uIgkgICB9LAorCXsgZG9fcGFnZV9mYXVsdCwJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJwYWdlIHBlcm1pc3Npb24gZmF1bHQiCQkgICB9LAogCS8qCiAJICogVGhlIGZvbGxvd2luZyBhcmUgImltcHJlY2lzZSIgYWJvcnRzLCB3aGljaCBhcmUgc2lnbmFsbGVkIGJ5IGJpdAogCSAqIDEwIG9mIHRoZSBGU1IsIGFuZCBtYXkgbm90IGJlIHJlY292ZXJhYmxlLiAgVGhlc2UgYXJlIG9ubHkKIAkgKiBzdXBwb3J0ZWQgaWYgdGhlIENQVSBhYm9ydCBoYW5kbGVyIHN1cHBvcnRzIGJpdCAxMC4KIAkgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDE2IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAxNyIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMTgiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDE5IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAibG9jayBhYm9ydCIJCQkgICB9LCAvKiB4c2NhbGUgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDIxIgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0IgkgICB9LCAvKiB4c2NhbGUgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDIzIgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAiZGNhY2hlIHBhcml0eSBlcnJvciIJCSAgIH0sIC8qIHhzY2FsZSAqLwotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMjUiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI2IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyNyIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMjgiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI5IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAzMCIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMzEiCQkJICAgfQorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDE2IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMTciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAxOCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDE5IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJImxvY2sgYWJvcnQiCQkJICAgfSwgLyogeHNjYWxlICovCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjEiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIEJVU19PQkpFUlIsCSJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiCSAgIH0sIC8qIHhzY2FsZSAqLworCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDIzIgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJImRjYWNoZSBwYXJpdHkgZXJyb3IiCQkgICB9LCAvKiB4c2NhbGUgKi8KKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyNSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI2IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyOCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI5IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMzAiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAzMSIJCQkgICB9CiB9OwogCiB2b2lkIF9faW5pdApAQCAtNDM1LDE1ICs0MzYsMTkgQEAKIGRvX0RhdGFBYm9ydCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gZnNyX2luZm8gKyAoZnNyICYgMTUpICsgKChmc3IgJiAoMSA8PCAxMCkpID4+IDYpOworCXN0cnVjdCBzaWdpbmZvIGluZm87CiAKIAlpZiAoIWluZi0+Zm4oYWRkciwgZnNyLCByZWdzKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fQUxFUlQgIlVuaGFuZGxlZCBmYXVsdDogJXMgKDB4JTAzeCkgYXQgMHglMDhseFxuIiwKIAkJaW5mLT5uYW1lLCBmc3IsIGFkZHIpOwotCWZvcmNlX3NpZyhpbmYtPnNpZywgY3VycmVudCk7Ci0Jc2hvd19wdGUoY3VycmVudC0+bW0sIGFkZHIpOwotCWRpZV9pZl9rZXJuZWwoIk9vcHMiLCByZWdzLCAwKTsKKworCWluZm8uc2lfc2lnbm8gPSBpbmYtPnNpZzsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2NvZGUgID0gaW5mLT5jb2RlOworCWluZm8uc2lfYWRkciAgPSAodm9pZCBfX3VzZXIgKilhZGRyOworCW5vdGlmeV9kaWUoIiIsIHJlZ3MsICZpbmZvLCBmc3IsIDApOwogfQogCiBhc21saW5rYWdlIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBjMDg3MTBiLi5lZGZmYTQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAltZW10YWJsZV9pbml0KG1pKTsKIAlpZiAobWRlc2MtPm1hcF9pbykKIAkJbWRlc2MtPm1hcF9pbygpOwotCWZsdXNoX3RsYl9hbGwoKTsKKwlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAKIAkvKgogCSAqIGluaXRpYWxpc2UgdGhlIHpvbmVzIHdpdGhpbiBlYWNoIG5vZGUKQEAgLTUyMiw2ICs1MjIsNjkgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyAlcyBtZW1vcnk6ICVkS1xuIiwgcywgc2l6ZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnJlZV9tZW1tYXAoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJc3RydWN0IHBhZ2UgKnN0YXJ0X3BnLCAqZW5kX3BnOworCXVuc2lnbmVkIGxvbmcgcGcsIHBnZW5kOworCisJLyoKKwkgKiBDb252ZXJ0IHN0YXJ0X3Bmbi9lbmRfcGZuIHRvIGEgc3RydWN0IHBhZ2UgcG9pbnRlci4KKwkgKi8KKwlzdGFydF9wZyA9IHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7CisJZW5kX3BnID0gcGZuX3RvX3BhZ2UoZW5kX3Bmbik7CisKKwkvKgorCSAqIENvbnZlcnQgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLCBhbmQKKwkgKiByb3VuZCBzdGFydCB1cHdhcmRzIGFuZCBlbmQgZG93bndhcmRzLgorCSAqLworCXBnID0gUEFHRV9BTElHTihfX3BhKHN0YXJ0X3BnKSk7CisJcGdlbmQgPSBfX3BhKGVuZF9wZykgJiBQQUdFX01BU0s7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBmcmVlIHBhZ2VzIGJldHdlZW4gdGhlc2UsCisJICogZnJlZSB0aGUgc2VjdGlvbiBvZiB0aGUgbWVtbWFwIGFycmF5LgorCSAqLworCWlmIChwZyA8IHBnZW5kKQorCQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIHBnLCBwZ2VuZCAtIHBnKTsKK30KKworLyoKKyAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlIHRoZSB1bnVzZWQgYXJlYSBvZiB0aGUgbWVtb3J5IG1hcC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfdW51c2VkX21lbW1hcF9ub2RlKGludCBub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJdW5zaWduZWQgbG9uZyBiYW5rX3N0YXJ0LCBwcmV2X2JhbmtfZW5kID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qCisJICogW0ZJWE1FXSBUaGlzIHJlbGllcyBvbiBlYWNoIGJhbmsgYmVpbmcgaW4gYWRkcmVzcyBvcmRlci4gIFRoaXMKKwkgKiBtYXkgbm90IGJlIHRoZSBjYXNlLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGhhcyBwcm92aWRlZCB0aGUKKwkgKiBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykgeworCQlpZiAobWktPmJhbmtbaV0uc2l6ZSA9PSAwIHx8IG1pLT5iYW5rW2ldLm5vZGUgIT0gbm9kZSkKKwkJCWNvbnRpbnVlOworCisJCWJhbmtfc3RhcnQgPSBtaS0+YmFua1tpXS5zdGFydCA+PiBQQUdFX1NISUZUOworCQlpZiAoYmFua19zdGFydCA8IHByZXZfYmFua19lbmQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTUVNOiB1bm9yZGVyZWQgbWVtb3J5IGJhbmtzLiAgIgorCQkJCSJOb3QgZnJlZWluZyBtZW1tYXAuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UgaGFkIGEgcHJldmlvdXMgYmFuaywgYW5kIHRoZXJlIGlzIGEgc3BhY2UKKwkJICogYmV0d2VlbiB0aGUgY3VycmVudCBiYW5rIGFuZCB0aGUgcHJldmlvdXMsIGZyZWUgaXQuCisJCSAqLworCQlpZiAocHJldl9iYW5rX2VuZCAmJiBwcmV2X2JhbmtfZW5kICE9IGJhbmtfc3RhcnQpCisJCQlmcmVlX21lbW1hcChub2RlLCBwcmV2X2JhbmtfZW5kLCBiYW5rX3N0YXJ0KTsKKworCQlwcmV2X2JhbmtfZW5kID0gKG1pLT5iYW5rW2ldLnN0YXJ0ICsKKwkJCQkgbWktPmJhbmtbaV0uc2l6ZSkgPj4gUEFHRV9TSElGVDsKKwl9Cit9CisKIC8qCiAgKiBtZW1faW5pdCgpIG1hcmtzIHRoZSBmcmVlIGFyZWFzIGluIHRoZSBtZW1fbWFwIGFuZCB0ZWxscyB1cyBob3cgbXVjaAogICogbWVtb3J5IGlzIGZyZWUuICBUaGlzIGlzIGRvbmUgYWZ0ZXIgdmFyaW91cyBwYXJ0cyBvZiB0aGUgc3lzdGVtIGhhdmUKQEAgLTU0MCwxNiArNjAzLDEyIEBACiAJbWF4X21hcG5yICAgPSB2aXJ0X3RvX3BhZ2UoaGlnaF9tZW1vcnkpIC0gbWVtX21hcDsKICNlbmRpZgogCi0JLyoKLQkgKiBXZSBtYXkgaGF2ZSBub24tY29udGlndW91cyBtZW1vcnkuCi0JICovCi0JaWYgKG1lbWluZm8ubnJfYmFua3MgIT0gMSkKLQkJY3JlYXRlX21lbW1hcF9ob2xlcygmbWVtaW5mbyk7Ci0KIAkvKiB0aGlzIHdpbGwgcHV0IGFsbCB1bnVzZWQgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7CiAKKwkJZnJlZV91bnVzZWRfbWVtbWFwX25vZGUobm9kZSwgJm1lbWluZm8pOworCiAJCWlmIChwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzICE9IDApCiAJCQl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtX25vZGUocGdkYXQpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tLWFybXYuYyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwppbmRleCAyYzJiOTNkLi5iMTlmMDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS1hcm12LmMKKysrIGIvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCkBAIC0xNjksNyArMTY5LDE0IEBACiAKIAltZW16ZXJvKG5ld19wZ2QsIEZJUlNUX0tFUk5FTF9QR0RfTlIgKiBzaXplb2YocGdkX3QpKTsKIAorCS8qCisJICogQ29weSBvdmVyIHRoZSBrZXJuZWwgYW5kIElPIFBHRCBlbnRyaWVzCisJICovCiAJaW5pdF9wZ2QgPSBwZ2Rfb2Zmc2V0X2soMCk7CisJbWVtY3B5KG5ld19wZ2QgKyBGSVJTVF9LRVJORUxfUEdEX05SLCBpbml0X3BnZCArIEZJUlNUX0tFUk5FTF9QR0RfTlIsCisJCSAgICAgICAoUFRSU19QRVJfUEdEIC0gRklSU1RfS0VSTkVMX1BHRF9OUikgKiBzaXplb2YocGdkX3QpKTsKKworCWNsZWFuX2RjYWNoZV9hcmVhKG5ld19wZ2QsIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwogCiAJaWYgKCF2ZWN0b3JzX2hpZ2goKSkgewogCQkvKgpAQCAtMTk4LDE0ICsyMDUsNiBAQAogCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJfQogCi0JLyoKLQkgKiBDb3B5IG92ZXIgdGhlIGtlcm5lbCBhbmQgSU8gUEdEIGVudHJpZXMKLQkgKi8KLQltZW1jcHkobmV3X3BnZCArIEZJUlNUX0tFUk5FTF9QR0RfTlIsIGluaXRfcGdkICsgRklSU1RfS0VSTkVMX1BHRF9OUiwKLQkJICAgICAgIChQVFJTX1BFUl9QR0QgLSBGSVJTVF9LRVJORUxfUEdEX05SKSAqIHNpemVvZihwZ2RfdCkpOwotCi0JY2xlYW5fZGNhY2hlX2FyZWEobmV3X3BnZCwgUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7Ci0KIAlyZXR1cm4gbmV3X3BnZDsKIAogbm9fcHRlOgpAQCAtNDAwLDcgKzM5OSw3IEBACiAJCWVjY19tYXNrID0gMDsKIAl9CiAKLQlpZiAoY3B1X2FyY2ggPD0gQ1BVX0FSQ0hfQVJNdjUpIHsKKwlpZiAoY3B1X2FyY2ggPD0gQ1BVX0FSQ0hfQVJNdjVURUopIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX3R5cGVzKTsgaSsrKSB7CiAJCQlpZiAobWVtX3R5cGVzW2ldLnByb3RfbDEpCiAJCQkJbWVtX3R5cGVzW2ldLnByb3RfbDEgfD0gUE1EX0JJVDQ7CkBAIC01ODUsNyArNTg0LDcgQEAKIAkJcG1kdmFsID0gKGkgPDwgUEdESVJfU0hJRlQpIHwKIAkJCSBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX0FQX1JFQUQgfAogCQkJIFBNRF9UWVBFX1NFQ1Q7Ci0JCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NSkKKwkJaWYgKGNwdV9hcmNoIDw9IENQVV9BUkNIX0FSTXY1VEVKKQogCQkJcG1kdmFsIHw9IFBNRF9CSVQ0OwogCQlwbWQgPSBwbWRfb2ZmKHBnZCwgaSA8PCBQR0RJUl9TSElGVCk7CiAJCXBtZFswXSA9IF9fcG1kKHBtZHZhbCk7CkBAIC02ODMsNyArNjgyLDcgQEAKIAl9CiAKIAlmbHVzaF9jYWNoZV9hbGwoKTsKLQlmbHVzaF90bGJfYWxsKCk7CisJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCiAJdG9wX3BtZCA9IHBtZF9vZmZfaygweGZmZmYwMDAwKTsKIH0KQEAgLTY5OCw3NSArNjk3LDMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKIAkJY3JlYXRlX21hcHBpbmcoaW9fZGVzYyArIGkpOwogfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWZyZWVfbWVtbWFwKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCXN0cnVjdCBwYWdlICpzdGFydF9wZywgKmVuZF9wZzsKLQl1bnNpZ25lZCBsb25nIHBnLCBwZ2VuZDsKLQotCS8qCi0JICogQ29udmVydCBzdGFydF9wZm4vZW5kX3BmbiB0byBhIHN0cnVjdCBwYWdlIHBvaW50ZXIuCi0JICovCi0Jc3RhcnRfcGcgPSBwZm5fdG9fcGFnZShzdGFydF9wZm4pOwotCWVuZF9wZyA9IHBmbl90b19wYWdlKGVuZF9wZm4pOwotCi0JLyoKLQkgKiBDb252ZXJ0IHRvIHBoeXNpY2FsIGFkZHJlc3NlcywgYW5kCi0JICogcm91bmQgc3RhcnQgdXB3YXJkcyBhbmQgZW5kIGRvd253YXJkcy4KLQkgKi8KLQlwZyA9IFBBR0VfQUxJR04oX19wYShzdGFydF9wZykpOwotCXBnZW5kID0gX19wYShlbmRfcGcpICYgUEFHRV9NQVNLOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgZnJlZSBwYWdlcyBiZXR3ZWVuIHRoZXNlLAotCSAqIGZyZWUgdGhlIHNlY3Rpb24gb2YgdGhlIG1lbW1hcCBhcnJheS4KLQkgKi8KLQlpZiAocGcgPCBwZ2VuZCkKLQkJZnJlZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLCBwZywgcGdlbmQgLSBwZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3VudXNlZF9tZW1tYXBfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pKQotewotCXVuc2lnbmVkIGxvbmcgYmFua19zdGFydCwgcHJldl9iYW5rX2VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQkvKgotCSAqIFtGSVhNRV0gVGhpcyByZWxpZXMgb24gZWFjaCBiYW5rIGJlaW5nIGluIGFkZHJlc3Mgb3JkZXIuICBUaGlzCi0JICogbWF5IG5vdCBiZSB0aGUgY2FzZSwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgdGhlCi0JICogaW5mb3JtYXRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKLQkJaWYgKG1pLT5iYW5rW2ldLnNpemUgPT0gMCB8fCBtaS0+YmFua1tpXS5ub2RlICE9IG5vZGUpCi0JCQljb250aW51ZTsKLQotCQliYW5rX3N0YXJ0ID0gbWktPmJhbmtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJaWYgKGJhbmtfc3RhcnQgPCBwcmV2X2JhbmtfZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIk1FTTogdW5vcmRlcmVkIG1lbW9yeSBiYW5rcy4gICIKLQkJCQkiTm90IGZyZWVpbmcgbWVtbWFwLlxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHdlIGhhZCBhIHByZXZpb3VzIGJhbmssIGFuZCB0aGVyZSBpcyBhIHNwYWNlCi0JCSAqIGJldHdlZW4gdGhlIGN1cnJlbnQgYmFuayBhbmQgdGhlIHByZXZpb3VzLCBmcmVlIGl0LgotCQkgKi8KLQkJaWYgKHByZXZfYmFua19lbmQgJiYgcHJldl9iYW5rX2VuZCAhPSBiYW5rX3N0YXJ0KQotCQkJZnJlZV9tZW1tYXAobm9kZSwgcHJldl9iYW5rX2VuZCwgYmFua19zdGFydCk7Ci0KLQkJcHJldl9iYW5rX2VuZCA9IFBBR0VfQUxJR04obWktPmJhbmtbaV0uc3RhcnQgKwotCQkJCQkgICBtaS0+YmFua1tpXS5zaXplKSA+PiBQQUdFX1NISUZUOwotCX0KLX0KLQotLyoKLSAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlCi0gKiB0aGUgdW51c2VkIGFyZWEgb2YgdGhlIG1lbW9yeSBtYXAuCi0gKi8KLXZvaWQgX19pbml0IGNyZWF0ZV9tZW1tYXBfaG9sZXMoc3RydWN0IG1lbWluZm8gKm1pKQotewotCWludCBub2RlOwotCi0JZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKLQkJZnJlZV91bnVzZWRfbWVtbWFwX25vZGUobm9kZSwgbWkpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCAxZjMyNTIzLi41YzBhZTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtNDQ1LDE0ICs0NDUsMTQgQEAKIAkvKgogCSAqICBSCiAJICogLlJWSSBaRlJTIEJMRFAgV0NBTQotCSAqIC4wLjEgMTAwMSAuLjExIDAxMDEJLyogRklYTUU6IHdoeSBubyBWIGJpdD8gKi8KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCiAJICovCiAJLnR5cGUJYXJtMTAyMF9jcjFfY2xlYXIsICNvYmplY3QKIAkudHlwZQlhcm0xMDIwX2NyMV9zZXQsICNvYmplY3QKIGFybTEwMjBfY3IxX2NsZWFyOgogCS53b3JkCTB4NTkzZgogYXJtMTAyMF9jcjFfc2V0OgotCS53b3JkCTB4MTkzNQorCS53b3JkCTB4MzkzNQogCiAJX19JTklUREFUQQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKaW5kZXggMTQyYTJjMi4uZDY5Mzg5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwpAQCAtNDI3LDE0ICs0MjcsMTQgQEAKIAkvKgogCSAqICBSCiAJICogLlJWSSBaRlJTIEJMRFAgV0NBTQotCSAqIC4wLjEgMTAwMSAuLjExIDAxMDEJLyogRklYTUU6IHdoeSBubyBWIGJpdD8gKi8KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCiAJICovCiAJLnR5cGUJYXJtMTAyMGVfY3IxX2NsZWFyLCAjb2JqZWN0CiAJLnR5cGUJYXJtMTAyMGVfY3IxX3NldCwgI29iamVjdAogYXJtMTAyMGVfY3IxX2NsZWFyOgogCS53b3JkCTB4NWYzZgogYXJtMTAyMGVfY3IxX3NldDoKLQkud29yZAkweDE5MzUKKwkud29yZAkweDM5MzUKIAogCV9fSU5JVERBVEEKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IGUzZDg1MTAuLjM1MmRiOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCW1jcglwMTUsIDAsIHI0LCBjMiwgYzAsIDEJCUAgbG9hZCBUVEIxCiAjaWZkZWYgQ09ORklHX1ZGUAogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDIKLQlvcnIJcjAsIHIwLCAjKDMgPDwgMjApCisJb3JyCXIwLCByMCwgIygweGYgPDwgMjApCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMgkJQCBFbmFibGUgZnVsbCBhY2Nlc3MgdG8gVkZQCiAjZW5kaWYKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIHJlYWQgY29udHJvbCByZWdpc3RlcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTEuaCBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmgKaW5kZXggNDVjYzY1NC4uZTRhNjFhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbndmcGUvZnBhMTEuaAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcGExMS5oCkBAIC0yOSw5ICsyOSw3IEBACiAgKiBzdGFjayt0YXNrIHN0cnVjdC4gIFVzZSB0aGUgc2FtZSBtZXRob2QgYXMgJ2N1cnJlbnQnIHVzZXMgdG8KICAqIHJlYWNoIHRoZW0uCiAgKi8KLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnVzZXJfcmVnaXN0ZXJzIGFzbSgic2wiKTsKLQotI2RlZmluZSBHRVRfVVNFUlJFRygpICh1c2VyX3JlZ2lzdGVycykKKyNkZWZpbmUgR0VUX1VTRVJSRUcoKSAoKHN0cnVjdCBwdF9yZWdzICopKFRIUkVBRF9TVEFSVF9TUCArICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfdGhyZWFkX2luZm8oKSkgLSAxKQogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMgYi9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5jCmluZGV4IGE4MDZmZWEuLjEyODg1ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgImZwYTExLmgiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKIC8qIFhYWCAqLwpAQCAtMTMzLDcgKzEzMiw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcKIAkgICAgICAgIk5XRlBFOiAlc1slZF0gdGFrZXMgZXhjZXB0aW9uICUwOHggYXQgJXAgZnJvbSAlMDhseFxuIiwKIAkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmbGFncywKLQkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBHRVRfVVNFUlJFRygpWzE1XSk7CisJICAgICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwgR0VUX1VTRVJSRUcoKS0+QVJNX3BjKTsKICNlbmRpZgogCiAJLyogS2VlcCBTb2Z0RmxvYXQgZXhjZXB0aW9uIGZsYWdzIHVwIHRvIGRhdGUuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuaW5sIGIvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuaW5sCmluZGV4IGU1ZjU5ZTkuLjJjMzlhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmlubAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5pbmwKQEAgLTI4LDggKzI4LDggQEAKIAkgICBmb3IgdGhpcyBpbiB0aGlzIHJvdXRpbmUuICBMREYvU1RGIGluc3RydWN0aW9ucyB3aXRoIFJuID0gUEMKIAkgICBkZXBlbmQgb24gdGhlIFBDIGJlaW5nIGNvcnJlY3QsIGFzIHRoZXkgdXNlIFBDKzggaW4gdGhlaXIKIAkgICBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gKi8KLQl1bnNpZ25lZCBsb25nICp1c2VyUmVnaXN0ZXJzID0gR0VUX1VTRVJSRUcoKTsKLQl1bnNpZ25lZCBpbnQgdmFsID0gdXNlclJlZ2lzdGVyc1tuUmVnXTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IEdFVF9VU0VSUkVHKCk7CisJdW5zaWduZWQgaW50IHZhbCA9IHJlZ3MtPnVyZWdzW25SZWddOwogCWlmIChSRUdfUEMgPT0gblJlZykKIAkJdmFsIC09IDQ7CiAJcmV0dXJuIHZhbDsKQEAgLTM4LDggKzM4LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogd3JpdGVSZWdpc3Rlcihjb25zdCB1bnNpZ25lZCBpbnQgblJlZywgY29uc3QgdW5zaWduZWQgbG9uZyB2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyAqdXNlclJlZ2lzdGVycyA9IEdFVF9VU0VSUkVHKCk7Ci0JdXNlclJlZ2lzdGVyc1tuUmVnXSA9IHZhbDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IEdFVF9VU0VSUkVHKCk7CisJcmVncy0+dXJlZ3NbblJlZ10gPSB2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkQ1BTUih2b2lkKQpAQCAtNjMsMTIgKzYzLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZUNvbmRpdGlvbkNvZGVzKGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFsKQogewotCXVuc2lnbmVkIGxvbmcgKnVzZXJSZWdpc3RlcnMgPSBHRVRfVVNFUlJFRygpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gR0VUX1VTRVJSRUcoKTsKIAl1bnNpZ25lZCBsb25nIHJ2YWw7CiAJLyoKIAkgKiBPcGVyYXRlIGRpcmVjdGx5IG9uIHVzZXJSZWdpc3RlcnMgc2luY2UKIAkgKiB0aGUgQ1BTUiBtYXkgYmUgdGhlIFBDIHJlZ2lzdGVyIGl0c2VsZi4KIAkgKi8KLQlydmFsID0gdXNlclJlZ2lzdGVyc1tSRUdfQ1BTUl0gJiB+Q0NfTUFTSzsKLQl1c2VyUmVnaXN0ZXJzW1JFR19DUFNSXSA9IHJ2YWwgfCAodmFsICYgQ0NfTUFTSyk7CisJcnZhbCA9IHJlZ3MtPkFSTV9jcHNyICYgfkNDX01BU0s7CisJcmVncy0+QVJNX2Nwc3IgPSBydmFsIHwgKHZhbCAmIENDX01BU0spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCBiYTFhNmU5Li44ZmZiNTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtNiw2ICs2LDYgQEAKIAkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAogCQl0aW1lcl9pbnQubyApCiAKLW9wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgaW5pdC5vCitvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIGluaXQubyBiYWNrdHJhY2Uubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1hTQ0FMRSkJCSs9IGNvbW1vbi5vIG9wX21vZGVsX3hzY2FsZS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvYmFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1OGQzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQXJtIHNwZWNpZmljIGJhY2t0cmFjaW5nIGNvZGUgZm9yIG9wcm9maWxlCisgKgorICogQ29weXJpZ2h0IDIwMDUgT3BlbmVkaGFuZCBMdGQuCisgKgorICogQXV0aG9yOiBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBpMzg2IG9wcm9maWxlIGJhY2t0cmFjZSBjb2RlIGJ5IEpvaG4gTGV2b24sIERhdmlkIFNtaXRoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBUaGUgcmVnaXN0ZXJzIHdlJ3JlIGludGVyZXN0ZWQgaW4gYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlCisgKiBsZW5ndGggc2F2ZWQgcmVnaXN0ZXIgc3RydWN0dXJlLiBUaGUgZnAgcG9pbnRzIGF0IHRoZSBlbmQgb2YgdGhpcworICogc3RydWN0dXJlIHNvIHRoZSBhZGRyZXNzIG9mIHRoaXMgc3RydWN0IGlzOgorICogKHN0cnVjdCBmcmFtZV90YWlsICopKHh4eC0+ZnApLTEKKyAqLworc3RydWN0IGZyYW1lX3RhaWwgeworCXN0cnVjdCBmcmFtZV90YWlsICpmcDsKKwl1bnNpZ25lZCBsb25nIHNwOworCXVuc2lnbmVkIGxvbmcgbHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorc3RhdGljIHN0cnVjdCBmcmFtZV90YWlsKiBrZXJuZWxfYmFja3RyYWNlKHN0cnVjdCBmcmFtZV90YWlsICp0YWlsKQoreworCW9wcm9maWxlX2FkZF90cmFjZSh0YWlsLT5scik7CisKKwkvKiBmcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKSAqLworCWlmICh0YWlsID49IHRhaWwtPmZwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB0YWlsLT5mcC0xOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfdGFpbCogdXNlcl9iYWNrdHJhY2Uoc3RydWN0IGZyYW1lX3RhaWwgKnRhaWwpCit7CisJc3RydWN0IGZyYW1lX3RhaWwgYnVmdGFpbDsKKworCS8qIGhhcmR3YXJlIHB0ZSBtaWdodCBub3QgYmUgdmFsaWQgZHVlIHRvIGRpcnR5L2FjY2Vzc2VkIGJpdCBlbXVsYXRpb24KKwkgKiBzbyB3ZSB1c2UgY29weV9mcm9tX3VzZXIgYW5kIGJlbmVmaXQgZnJvbSBleGNlcHRpb24gZml4dXBzICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZ0YWlsLCB0YWlsLCBzaXplb2Yoc3RydWN0IGZyYW1lX3RhaWwpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlvcHJvZmlsZV9hZGRfdHJhY2UoYnVmdGFpbC5scik7CisKKwkvKiBmcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKSAqLworCWlmICh0YWlsID49IGJ1ZnRhaWwuZnApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGJ1ZnRhaWwuZnAtMTsKK30KKworLyogQ29tcGFyZSB0d28gYWRkcmVzc2VzIGFuZCBzZWUgaWYgdGhleSdyZSBvbiB0aGUgc2FtZSBwYWdlICovCisjZGVmaW5lIENNUF9BRERSX0VRVUFMKHgseSxvZmZzZXQpICgoKCh1bnNpZ25lZCBsb25nKSB4KSA+PiBQQUdFX1NISUZUKSBcCisJPT0gKCgoKHVuc2lnbmVkIGxvbmcpIHkpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZUKSkKKworLyogY2hlY2sgdGhhdCB0aGUgcGFnZShzKSBjb250YWluaW5nIHRoZSBmcmFtZSB0YWlsIGFyZSBwcmVzZW50ICovCitzdGF0aWMgaW50IHBhZ2VzX3ByZXNlbnQoc3RydWN0IGZyYW1lX3RhaWwgKnRhaWwpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07CisKKwlpZiAoIWNoZWNrX3VzZXJfcGFnZV9yZWFkYWJsZShtbSwgKHVuc2lnbmVkIGxvbmcpdGFpbCkpCisJCXJldHVybiAwOworCisJaWYgKENNUF9BRERSX0VRVUFMKHRhaWwsIHRhaWwsIDgpKQorCQlyZXR1cm4gMTsKKworCWlmICghY2hlY2tfdXNlcl9wYWdlX3JlYWRhYmxlKG1tLCAoKHVuc2lnbmVkIGxvbmcpdGFpbCkgKyA4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHwgICAgICAgICAgICAgfCAvXCBIaWdoZXIgYWRkcmVzc2VzCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLSBzdGFjayBiYXNlIChhZGRyZXNzIG9mIGN1cnJlbnRfdGhyZWFkX2luZm8pCisgKiB8IHRocmVhZCBpbmZvIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICBzdGFjayAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gc2F2ZWQgcmVncy0+QVJNX2ZwIHZhbHVlIGlmIHZhbGlkIChmcmFtZV90YWlsIGFkZHJlc3MpCisgKiAuICAgICAgICAgICAgIC4KKyAqIC0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3QgcHRfcmVncyBzdG9yZWQgb24gc3RhY2sgKHN0cnVjdCBwdF9yZWdzICopCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gJWVzcAorICogfCAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgIHwgXC8gTG93ZXIgYWRkcmVzc2VzCisgKgorICogVGh1cywgJnB0X3JlZ3MgPC0+IHN0YWNrIGJhc2UgcmVzdHJpY3RzIHRoZSB2YWxpZChpc2gpIGZwIHZhbHVlcworICovCitzdGF0aWMgaW50IHZhbGlkX2tlcm5lbF9zdGFjayhzdHJ1Y3QgZnJhbWVfdGFpbCAqdGFpbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0YWlsYWRkciA9ICh1bnNpZ25lZCBsb25nKXRhaWw7CisJdW5zaWduZWQgbG9uZyBzdGFjayA9ICh1bnNpZ25lZCBsb25nKXJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja19iYXNlID0gKHN0YWNrICYgfihUSFJFQURfU0laRSAtIDEpKSArIFRIUkVBRF9TSVpFOworCisJcmV0dXJuICh0YWlsYWRkciA+IHN0YWNrKSAmJiAodGFpbGFkZHIgPCBzdGFja19iYXNlKTsKK30KKwordm9pZCBhcm1fYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzIGNvbnN0ICpyZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJc3RydWN0IGZyYW1lX3RhaWwgKnRhaWw7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHJlc3MgPSAwOworCisJdGFpbCA9ICgoc3RydWN0IGZyYW1lX3RhaWwgKikgcmVncy0+QVJNX2ZwKSAtIDE7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwkJd2hpbGUgKGRlcHRoLS0gJiYgdGFpbCAmJiB2YWxpZF9rZXJuZWxfc3RhY2sodGFpbCwgcmVncykpIHsKKwkJCXRhaWwgPSBrZXJuZWxfYmFja3RyYWNlKHRhaWwpOworCQl9CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChkZXB0aC0tICYmIHRhaWwgJiYgISgodW5zaWduZWQgbG9uZykgdGFpbCAmIDMpKSB7CisJCWlmICgoIUNNUF9BRERSX0VRVUFMKGxhc3RfYWRkcmVzcywgdGFpbCwgMCkKKwkJCXx8ICFDTVBfQUREUl9FUVVBTChsYXN0X2FkZHJlc3MsIHRhaWwsIDgpKQorCQkJCSYmICFwYWdlc19wcmVzZW50KHRhaWwpKQorCQkJcmV0dXJuOworCQlsYXN0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgdGFpbDsKKwkJdGFpbCA9IHVzZXJfYmFja3RyYWNlKHRhaWwpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jCmluZGV4IGNjZTNkMzAuLmQzMTVhM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL2luaXQuYworKysgYi9hcmNoL2FybS9vcHJvZmlsZS9pbml0LmMKQEAgLTIwLDYgKzIwLDggQEAKIAlyZXQgPSBwbXVfaW5pdChvcHMsICZvcF94c2NhbGVfc3BlYyk7CiAjZW5kaWYKIAorCW9wcy0+YmFja3RyYWNlID0gYXJtX2JhY2t0cmFjZTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL29wX2FybV9tb2RlbC5oIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKaW5kZXggMmQ0Y2FmNC4uMjE0OGQwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKQEAgLTI0LDYgKzI0LDggQEAKIGV4dGVybiBzdHJ1Y3Qgb3BfYXJtX21vZGVsX3NwZWMgb3BfeHNjYWxlX3NwZWM7CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgYXJtX2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CisKIGV4dGVybiBpbnQgX19pbml0IHBtdV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMsIHN0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyAqc3BlYyk7CiBleHRlcm4gdm9pZCBwbXVfZXhpdCh2b2lkKTsKICNlbmRpZiAvKiBPUF9BUk1fTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUzNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKK2lmIEFSQ0hfT01BUAorCittZW51ICJUSSBPTUFQIEltcGxlbWVudGF0aW9ucyIKKworY29uZmlnIEFSQ0hfT01BUF9PVEcKKwlib29sCisKK2Nob2ljZQorCXByb21wdCAiT01BUCBTeXN0ZW0gVHlwZSIKKwlkZWZhdWx0IEFSQ0hfT01BUDEKKworY29uZmlnIEFSQ0hfT01BUDEKKwlib29sICJUSSBPTUFQMSIKKworY29uZmlnIEFSQ0hfT01BUDIKKwlib29sICJUSSBPTUFQMiIKKworZW5kY2hvaWNlCisKK2NvbW1lbnQgIk9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zIgorCitjb25maWcgT01BUF9SRVNFVF9DTE9DS1MKKwlib29sICJSZXNldCB1bnVzZWQgY2xvY2tzIGR1cmluZyBib290IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gcmVzZXQgdW51c2VkIGNsb2NrcyBkdXJpbmcgYm9vdC4KKwkgIFRoaXMgb3B0aW9uIHNhdmVzIHBvd2VyLCBidXQgYXNzdW1lcyBhbGwgZHJpdmVycyBhcmUKKwkgIHVzaW5nIHRoZSBjbG9jayBmcmFtZXdvcmsuIEJyb2tlbiBkcml2ZXJzIHRoYXQgZG8gbm90CisJICB5ZXQgdXNlIGNsb2NrIGZyYW1ld29yayBtYXkgbm90IHdvcmsgd2l0aCB0aGlzIG9wdGlvbi4KKwkgIElmIHlvdSBhcmUgYm9vdGluZyBmcm9tIGFub3RoZXIgb3BlcmF0aW5nIHN5c3RlbSwgeW91CisJICBwcm9iYWJseSBkbyBub3Qgd2FudCB0aGlzIG9wdGlvbiBlbmFibGVkIHVudGlsIHlvdXIKKwkgIGRldmljZSBkcml2ZXJzIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBPTUFQX01VWAorCWJvb2wgIk9NQVAgbXVsdGlwbGV4aW5nIHN1cHBvcnQiCisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCB5CisgICAgICAgIGhlbHAKKyAgICAgICAgICBQaW4gbXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIE9NQVAgYm9hcmRzLiBJZiB5b3VyIGJvb3Rsb2FkZXIKKyAgICAgICAgICBzZXRzIHRoZSBtdWx0aXBsZXhpbmcgY29ycmVjdGx5LCBzYXkgTi4gT3RoZXJ3aXNlLCBvciBpZiB1bnN1cmUsCisgICAgICAgICAgc2F5IFkuCisKK2NvbmZpZyBPTUFQX01VWF9ERUJVRworCWJvb2wgIk11bHRpcGxleGluZyBkZWJ1ZyBvdXRwdXQiCisgICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKKyAgICAgICAgZGVmYXVsdCBuCisgICAgICAgIGhlbHAKKyAgICAgICAgICBNYWtlcyB0aGUgbXVsdGlwbGV4aW5nIGZ1bmN0aW9ucyBwcmludCBvdXQgYSBsb3Qgb2YgZGVidWcgaW5mby4KKyAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAgbXVsdGlwbGV4aW5nIHJlZ2lzdGVycy4KKworY29uZmlnIE9NQVBfTVVYX1dBUk5JTkdTCisJYm9vbCAiV2FybiBhYm91dCBwaW5zIHRoZSBib290bG9hZGVyIGRpZG4ndCBzZXQgdXAiCisgICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIGhlbHAKKwkgIENob29zZSBZIGhlcmUgdG8gd2FybiB3aGVuZXZlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24gbG9naWMgbmVlZHMKKwkgIHRvIGNoYW5nZSB0aGUgcGluIG11bHRpcGxleGluZyBzZXR1cC4gIFdoZW4gdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisJICBwcmludGVkLCBpdCdzIHNhZmUgdG8gZGVzZWxlY3QgT01BUF9NVVggZm9yIHlvdXIgcHJvZHVjdC4KKworY2hvaWNlCisgICAgICAgIHByb21wdCAiU3lzdGVtIHRpbWVyIgorCWRlZmF1bHQgT01BUF9NUFVfVElNRVIKKworY29uZmlnIE9NQVBfTVBVX1RJTUVSCisJYm9vbCAiVXNlIG1wdSB0aW1lciIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBPTUFQIG1wdSB0aW1lci4gVGhpcworCSAgdGltZXIgcHJvdmlkZXMgbW9yZSBpbnRyYS10aWNrIHJlc29sdXRpb24gdGhhbiB0aGUgMzJLSHogdGltZXIsCisJICBidXQgY29uc3VtZXMgbW9yZSBwb3dlci4KKworY29uZmlnIE9NQVBfMzJLX1RJTUVSCisJYm9vbCAiVXNlIDMyS0h6IHRpbWVyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIE9NQVAgMzJLSHogdGltZXIuCisJICBUaGlzIHRpbWVyIHNhdmVzIHBvd2VyIGNvbXBhcmVkIHRvIHRoZSBPTUFQX01QVV9USU1FUiwgYW5kIGhhcworCSAgc3VwcG9ydCBmb3Igbm8gdGljayBkdXJpbmcgaWRsZS4gVGhlIDMyS0h6IHRpbWVyIHByb3ZpZGVzIGxlc3MKKwkgIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIE9NQVBfTVBVX1RJTUVSLiBUaGUgMzJLSHogdGltZXIgaXMKKwkgIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgT01BUC0xNnh4LgorCitlbmRjaG9pY2UKKworY29uZmlnIE9NQVBfMzJLX1RJTUVSX0haCisgICAgICAgaW50ICJLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IGZvciAzMktIeiB0aW1lciIKKyAgICAgICByYW5nZSAzMiAxMDI0CisgICAgICAgZGVwZW5kcyBvbiBPTUFQXzMyS19USU1FUgorICAgICAgIGRlZmF1bHQgIjEyOCIKKyAgICAgICBoZWxwCisJICBLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgMzI3NjgsCisJICBzdWNoIGFzIDY0IG9yIDEyOC4KKworY2hvaWNlCisJcHJvbXB0ICJMb3ctbGV2ZWwgZGVidWcgY29uc29sZSBVQVJUIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCBPTUFQX0xMX0RFQlVHX1VBUlQxCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQxCisJYm9vbCAiVUFSVDEiCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQyCisJYm9vbCAiVUFSVDIiCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQzCisJYm9vbCAiVUFSVDMiCisKK2VuZGNob2ljZQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxZTExYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIENvbW1vbiBzdXBwb3J0CitvYmoteSA6PSBjb21tb24ubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCitvYmotbSA6PQorb2JqLW4gOj0KK29iai0gIDo9CisKKyMgT0NQSSBpbnRlcmNvbm5lY3Qgc3VwcG9ydCBmb3IgMTcxMCwgMTYxMCBhbmQgNTkxMgorb2JqLSQoQ09ORklHX0FSQ0hfT01BUDE2WFgpICs9IG9jcGkubworCisjIFBvd2VyIE1hbmFnZW1lbnQKK29iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCisKK29iai0kKENPTkZJR19DUFVfRlJFUSkgKz0gY3B1LW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwpzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKaW5kZXggZTkxMTg2Yi4uNTlkOTFiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCisgKiAgbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIGNvcnBvcmF0aW9uCiAgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CkBAIC0yNSw2ICsyNiw4IEBACiBzdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tmd19sb2NrKTsKIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrKTsKKy8qIFVBUlQgY2xvY2sgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2V0X3VhcnRfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogLyogRXh0ZXJuYWwgY2xvY2sgKE1DTEsgJiBCQ0xLKSBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbnQgc2V0X2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIHN0YXRpYyBsb25nIHJvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKQEAgLTM0LDcgKzM3LDcgQEAKIHN0YXRpYyBsb25nIHJvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CiB2b2lkIGNsa19zZXRkcGxsKF9fdTE2LCBfX3UxNik7CiAKLXN0cnVjdCBtcHVfcmF0ZSByYXRlX3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IG1wdV9yYXRlIHJhdGVfdGFibGVbXSA9IHsKIAkvKiBNUFUgTUh6LCB4dGFsIE1IeiwgZHBsbDEgTUh6LCBDS0NUTCwgRFBMTF9DVEwKIAkgKiBhcm1kaXYsIGRzcGRpdiwgZHNwbW11LCB0Y2RpdiwgcGVyZGl2LCBsY2RkaXYKIAkgKi8KQEAgLTQ4LDcgKzUxLDcgQEAKIAl7IDE5MjAwMDAwMCwgMTkyMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI1MTAgfSwgLyogMS8xLzIvMi84LzggKi8KIAl7IDE5MjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI4MTAgfSwgLyogMS8xLzIvMi84LzggKi8KIAl7ICA5NjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTVmLCAweDI4MTAgfSwgLyogMi8yLzIvMi84LzggKi8KLQl7ICA0ODAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwY2NmLCAweDI4MTAgfSwgLyogNC80LzQvNC84LzggKi8KKwl7ICA0ODAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwYmFmLCAweDI4MTAgfSwgLyogNC84LzQvNC84LzggKi8KIAl7ICAyNDAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwZmZmLCAweDI4MTAgfSwgLyogOC84LzgvOC84LzggKi8KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE4Mk1IWikKQEAgLTU4LDcgKzYxLDcgQEAKIAl7IDE2ODAwMDAwMCwgMTIwMDAwMDAsIDE2ODAwMDAwMCwgMHgwMTBmLCAweDI3MTAgfSwgLyogMS8xLzEvMi84LzggKi8KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE1ME1IWikKLQl7IDE1MDAwMDAwMCwgMTIwMDAwMDAsIDE1MDAwMDAwMCwgMHgxNTBhLCAweDJjYjAgfSwgLyogMC8wLzEvMS8yLzIgKi8KKwl7IDE1MDAwMDAwMCwgMTIwMDAwMDAsIDE1MDAwMDAwMCwgMHgwMTBhLCAweDJjYjAgfSwgLyogMS8xLzEvMi80LzQgKi8KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzEyME1IWikKIAl7IDEyMDAwMDAwMCwgMTIwMDAwMDAsIDEyMDAwMDAwMCwgMHgwMTBhLCAweDI1MTAgfSwgLyogMS8xLzEvMi80LzQgKi8KQEAgLTc2LDE5ICs3OSwxMSBAQAogfTsKIAogCi1zdGF0aWMgdm9pZCBja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCi17Ci0JaW50IGRzb3I7Ci0KLQkvKiBDYWxjdWxhdGUgZGl2aXNvciBlbmNvZGVkIGFzIDItYml0IGV4cG9uZW50ICovCi0JZHNvciA9IDEgPDwgKDMgJiAob21hcF9yZWFkdyhBUk1fQ0tDVEwpID4+IGNsay0+cmF0ZV9vZmZzZXQpKTsKLQlpZiAodW5saWtlbHkoY2xrLT5yYXRlID09IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcikpCi0JCXJldHVybjsgLyogTm8gY2hhbmdlLCBxdWljayBleGl0ICovCi0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkc29yOwotCi0JaWYgKHVubGlrZWx5KGNsay0+ZmxhZ3MgJiBSQVRFX1BST1BBR0FURVMpKQotCQlwcm9wYWdhdGVfcmF0ZShjbGspOwotfQorc3RhdGljIHZvaWQgY2tjdGxfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKTsKK2ludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBfX2Nsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspOworaW50IF9fY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspOwogCiAKIHN0YXRpYyB2b2lkIGZvbGxvd3BhcmVudF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCkBAIC0xMDIsNiArOTcsMTQgQEAKIAljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIDE0OwogfQogCitzdGF0aWMgdm9pZCB1YXJ0X3JlY2FsYyhzdHJ1Y3QgY2xrICogY2xrKQoreworCXVuc2lnbmVkIGludCB2YWwgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJaWYgKHZhbCAmIGNsay0+ZW5hYmxlX2JpdCkKKwkJY2xrLT5yYXRlID0gNDgwMDAwMDA7CisJZWxzZQorCQljbGstPnJhdGUgPSAxMjAwMDAwMDsKK30KIAogc3RhdGljIHN0cnVjdCBjbGsgY2tfcmVmID0gewogCS5uYW1lCQk9ICJja19yZWYiLApAQCAtMTM4LDcgKzE0MSw3IEBACiBzdGF0aWMgc3RydWN0IGNsayBhcm1wZXJfY2sgPSB7CiAJLm5hbWUJCT0gImFybXBlcl9jayIsCiAJLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNzMwIHwgQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CiAJCQkgIFJBVEVfQ0tDVEwsCiAJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKIAkuZW5hYmxlX2JpdAk9IEVOX1BFUkNLLApAQCAtMTg1LDcgKzE4OCw3IEBACiBzdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTZ4eCA9IHsKIAkubmFtZQkJPSAiYXJtaW50aF9jayIsCiAJLnBhcmVudAkJPSAmYXJtX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogCS8qIE5vdGU6IE9uIDE2eHggdGhlIGZyZXF1ZW5jeSBjYW4gYmUgZGl2aWRlZCBieSAyIGJ5IHByb2dyYW1taW5nCiAJICogQVJNX0NLQ1RMOkFSTV9JTlRIQ0tfU0VMKDE0KSB0byAxCkBAIC0yMTQsNiArMjE3LDM4IEBACiAJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHNwcGVyX2NrID0geworCS5uYW1lCQk9ICJkc3BwZXJfY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9DS0NUTCB8IERTUF9ET01BSU5fQ0xPQ0sgfCBWSVJUVUFMX0lPX0FERFJFU1MsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1BFUkNLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX1BFUkRJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKKwkvLy5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcHhvcl9jayA9IHsKKwkubmFtZQkJPSAiZHNweG9yX2NrIiwKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBEU1BfRE9NQUlOX0NMT0NLIHwgVklSVFVBTF9JT19BRERSRVNTLAorCS5lbmFibGVfcmVnCT0gRFNQX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9YT1JQQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcHRpbV9jayA9IHsKKwkubmFtZQkJPSAiZHNwdGltX2NrIiwKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBEU1BfRE9NQUlOX0NMT0NLIHwgVklSVFVBTF9JT19BRERSRVNTLAorCS5lbmFibGVfcmVnCT0gRFNQX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9EU1BUSU1DSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgdGNfY2sgPSB7CiAJLm5hbWUJCT0gInRjX2NrIiwKIAkucGFyZW50CQk9ICZja19kcGxsMSwKQEAgLTIyNiw3ICsyNjEsNyBAQAogc3RhdGljIHN0cnVjdCBjbGsgYXJtaW50aF9jazE1MTAgPSB7CiAJLm5hbWUJCT0gImFybWludGhfY2siLAogCS5wYXJlbnQJCT0gJnRjX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogCS8qIE5vdGU6IE9uIDE1MTAgdGhlIGZyZXF1ZW5jeSBmb2xsb3dzIFRDX0NLCiAJICoKQEAgLTIzNyw3ICsyNzIsNyBAQAogc3RhdGljIHN0cnVjdCBjbGsgdGlwYl9jayA9IHsKIAkubmFtZQkJPSAidGlicF9jayIsCiAJLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yNzEsMTQgKzMwNiwxNSBAQAogc3RhdGljIHN0cnVjdCBjbGsgZG1hX2NrID0gewogCS5uYW1lCQk9ICJkbWFfY2siLAogCS5wYXJlbnQJCT0gJnRjX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9sY2RmcmVlX2NrID0gewogCS5uYW1lCQk9ICJkbWFfbGNkZnJlZV9jayIsCiAJLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0zMDMsMTQgKzMzOSwxNCBAQAogc3RhdGljIHN0cnVjdCBjbGsgcmhlYTFfY2sgPSB7CiAJLm5hbWUJCT0gInJoZWExX2NrIiwKIAkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHJoZWEyX2NrID0gewogCS5uYW1lCQk9ICJyaGVhMl9jayIsCiAJLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0zMjUsNDMgKzM2MSw1NSBAQAogCS5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxX2NrID0geworc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfMTUxMCA9IHsKKwkubmFtZQkJPSAidWFydDFfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEVOQUJMRV9SRUdfMzJCSVQgfCBBTFdBWVNfRU5BQkxFRCwKKwkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKKwkuZW5hYmxlX2JpdAk9IDI5LAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCisJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCisJLnJlY2FsYwkJPSAmdWFydF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV8xNnh4ID0gewogCS5uYW1lCQk9ICJ1YXJ0MV9jayIsCiAJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCiAJLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKIAkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKIAkuZW5hYmxlX2JpdAk9IDI5LAotCS8qIChPbmx5IG9uIDE1MTApCi0JICogVGhlICJlbmFibGUgYml0IiBhY3R1YWxseSBjaG9vc2VzIGJldHdlZW4gNDhNSHogYW5kIDEyTUh6LgotCSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfY2sgPSB7CiAJLm5hbWUJCT0gInVhcnQyX2NrIiwKIAkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KLQkucmF0ZQkJPSA0ODAwMDAwMCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgRU5BQkxFX1JFR18zMkJJVCwKIAkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKLQkuZW5hYmxlX2JpdAk9IDMwLAotCS8qIChmb3IgYm90aCAxNTEwIGFuZCAxNnh4KQotCSAqIFRoZSAiZW5hYmxlIGJpdCIgYWN0dWFsbHkgY2hvb3NlcyBiZXR3ZWVuIDQ4TUh6IGFuZCAxMk1Iei8zMmtIei4KLQkgKi8KKwkuZW5hYmxlX2JpdAk9IDMwLAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCisJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCisJLnJlY2FsYwkJPSAmdWFydF9yZWNhbGMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0M19jayA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzXzE1MTAgPSB7CisJLm5hbWUJCT0gInVhcnQzX2NrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBFTkFCTEVfUkVHXzMyQklUIHwgQUxXQVlTX0VOQUJMRUQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAzMSwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLworCS5zZXRfcmF0ZQk9ICZzZXRfdWFydF9yYXRlLAorCS5yZWNhbGMJCT0gJnVhcnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDNfMTZ4eCA9IHsKIAkubmFtZQkJPSAidWFydDNfY2siLAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwogCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKLQkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCiAJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCiAJLmVuYWJsZV9iaXQJPSAzMSwKLQkvKiAoT25seSBvbiAxNTEwKQotCSAqIFRoZSAiZW5hYmxlIGJpdCIgYWN0dWFsbHkgY2hvb3NlcyBiZXR3ZWVuIDQ4TUh6IGFuZCAxMk1Iei4KLQkgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9jbGtvID0gewkvKiA2IE1IeiBvdXRwdXQgb24gVzRfVVNCX0NMS08gKi8KQEAgLTQ4MCw2ICs1MjgsOSBAQAogCS8qIENLX0dFTjIgY2xvY2tzICovCiAJJmRzcF9jaywKIAkmZHNwbW11X2NrLAorCSZkc3BwZXJfY2ssCisJJmRzcHhvcl9jaywKKwkmZHNwdGltX2NrLAogCS8qIENLX0dFTjMgY2xvY2tzICovCiAJJnRjX2NrLAogCSZ0aXBiX2NrLApAQCAtNDk0LDkgKzU0NSwxMSBAQAogCSZyaGVhMl9jaywKIAkmbGNkX2NrLAogCS8qIFVMUEQgY2xvY2tzICovCi0JJnVhcnQxX2NrLAorCSZ1YXJ0MV8xNTEwLAorCSZ1YXJ0MV8xNnh4LAogCSZ1YXJ0Ml9jaywKLQkmdWFydDNfY2ssCisJJnVhcnQzXzE1MTAsCisJJnVhcnQzXzE2eHgsCiAJJnVzYl9jbGtvLAogCSZ1c2JfaGhjX2NrMTUxMCwgJnVzYl9oaGNfY2sxNnh4LAogCSZtY2xrXzE1MTAsICAmbWNsa18xNnh4LApAQCAtNTQ3LDE0ICs2MDAsMzQgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCV9fY2xrX3VzZSgmYXBpX2NrKTsKKwl9CisKIAlpZiAoY2xrLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKLQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDMyIHw9ICgxIDw8IGNsay0+ZW5hYmxlX2JpdCk7Ci0JCW9tYXBfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQlpZiAoY2xrLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykgeworCQkJcmVndmFsMzIgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCV9fcmF3X3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCW9tYXBfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQl9CiAJfSBlbHNlIHsKLQkJcmVndmFsMTYgPSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDE2IHw9ICgxIDw8IGNsay0+ZW5hYmxlX2JpdCk7Ci0JCW9tYXBfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOworCQlpZiAoY2xrLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykgeworCQkJcmVndmFsMTYgPSBfX3Jhd19yZWFkdyhjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMTYgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCV9fcmF3X3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3ZhbDE2ID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMTYgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCW9tYXBfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOworCQl9CisJfQorCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCV9fY2xrX3VudXNlKCZhcGlfY2spOwogCX0KIAogCXJldHVybiAwOwpAQCAtNTY5LDE0ICs2NDIsMzQgQEAKIAlpZiAoY2xrLT5lbmFibGVfcmVnID09IDApCiAJCXJldHVybjsKIAorCWlmIChjbGstPmZsYWdzICYgRFNQX0RPTUFJTl9DTE9DSykgeworCQlfX2Nsa191c2UoJmFwaV9jayk7CisJfQorCiAJaWYgKGNsay0+ZmxhZ3MgJiBFTkFCTEVfUkVHXzMyQklUKSB7Ci0JCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOwotCQlyZWd2YWwzMiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKLQkJb21hcF93cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJCWlmIChjbGstPmZsYWdzICYgVklSVFVBTF9JT19BRERSRVNTKSB7CisJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwzMiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCV9fcmF3X3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgJj0gfigxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlvbWFwX3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfQogCX0gZWxzZSB7Ci0JCXJlZ3ZhbDE2ID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpOwotCQlyZWd2YWwxNiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKLQkJb21hcF93cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCWlmIChjbGstPmZsYWdzICYgVklSVFVBTF9JT19BRERSRVNTKSB7CisJCQlyZWd2YWwxNiA9IF9fcmF3X3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwxNiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCV9fcmF3X3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3ZhbDE2ID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMTYgJj0gfigxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlvbWFwX3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfQorCX0KKworCWlmIChjbGstPmZsYWdzICYgRFNQX0RPTUFJTl9DTE9DSykgeworCQlfX2Nsa191bnVzZSgmYXBpX2NrKTsKIAl9CiB9CiAKQEAgLTc2Niw2ICs4NTksMzMgQEAKIAlyZXR1cm4gZHNvcl9leHA7CiB9CiAKKworc3RhdGljIHZvaWQgY2tjdGxfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKQoreworCWludCBkc29yOworCisJLyogQ2FsY3VsYXRlIGRpdmlzb3IgZW5jb2RlZCBhcyAyLWJpdCBleHBvbmVudCAqLworCWlmIChjbGstPmZsYWdzICYgRFNQX0RPTUFJTl9DTE9DSykgeworCQkvKiBUaGUgY2xvY2sgY29udHJvbCBiaXRzIGFyZSBpbiBEU1AgZG9tYWluLAorCQkgKiBzbyBhcGlfY2sgaXMgbmVlZGVkIGZvciBhY2Nlc3MuCisJCSAqIE5vdGUgdGhhdCBEU1BfQ0tDVEwgdmlydCBhZGRyID0gcGh5cyBhZGRyLCBzbworCQkgKiB3ZSBtdXN0IHVzZSBfX3Jhd19yZWFkdygpIGluc3RlYWQgb2Ygb21hcF9yZWFkdygpLgorCQkgKi8KKwkJX19jbGtfdXNlKCZhcGlfY2spOworCQlkc29yID0gMSA8PCAoMyAmIChfX3Jhd19yZWFkdyhEU1BfQ0tDVEwpID4+IGNsay0+cmF0ZV9vZmZzZXQpKTsKKwkJX19jbGtfdW51c2UoJmFwaV9jayk7CisJfSBlbHNlIHsKKwkJZHNvciA9IDEgPDwgKDMgJiAob21hcF9yZWFkdyhBUk1fQ0tDVEwpID4+IGNsay0+cmF0ZV9vZmZzZXQpKTsKKwl9CisJaWYgKHVubGlrZWx5KGNsay0+cmF0ZSA9PSBjbGstPnBhcmVudC0+cmF0ZSAvIGRzb3IpKQorCQlyZXR1cm47IC8qIE5vIGNoYW5nZSwgcXVpY2sgZXhpdCAqLworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcjsKKworCWlmICh1bmxpa2VseShjbGstPmZsYWdzICYgUkFURV9QUk9QQUdBVEVTKSkKKwkJcHJvcGFnYXRlX3JhdGUoY2xrKTsKK30KKworCiBsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewogCWludCBkc29yX2V4cDsKQEAgLTgyNiw2ICs5NDYsOSBAQAogCWlmICghcHRyLT5yYXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghcHRyLT5yYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICh1bmxpa2VseShja19kcGxsMS5yYXRlID09IDApKSB7CiAJCW9tYXBfd3JpdGV3KHB0ci0+ZHBsbGN0bF92YWwsIERQTExfQ1RMKTsKIAkJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7CkBAIC05MjEsNiArMTA0NCwyMyBAQAogCXJldHVybiBkc29yOwogfQogCisvKiBPbmx5IG5lZWRlZCBvbiAxNTEwICovCitzdGF0aWMgaW50IHNldF91YXJ0X3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJaWYgKHJhdGUgPT0gMTIwMDAwMDApCisJCXZhbCAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwllbHNlIGlmIChyYXRlID09IDQ4MDAwMDAwKQorCQl2YWwgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCW9tYXBfd3JpdGVsKHZhbCwgY2xrLT5lbmFibGVfcmVnKTsKKwljbGstPnJhdGUgPSByYXRlOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgc2V0X2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewpAQCAtOTg1LDcgKzExMjUsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwogCi0KKyNpZmRlZiBDT05GSUdfT01BUF9SRVNFVF9DTE9DS1MKKy8qCisgKiBSZXNldHMgc29tZSBjbG9ja3MgdGhhdCBtYXkgYmUgbGVmdCBvbiBmcm9tIGJvb3Rsb2FkZXIsCisgKiBidXQgbGVhdmVzIHNlcmlhbCBjbG9ja3Mgb24uIFNlZSBhbHNvIG9tYXBfbGF0ZV9jbGtfcmVzZXQoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfZWFybHlfY2xrX3Jlc2V0KHZvaWQpCit7CisJLy9vbWFwX3dyaXRlbCgweDMgPDwgMjksIE1PRF9DT05GX0NUUkxfMCk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwX2Vhcmx5X2Nsa19yZXNldCgpCXt9CisjZW5kaWYKIAogaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQogewpAQCAtOTkzLDYgKzExNDQsOCBAQAogCWNvbnN0IHN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyAqaW5mbzsKIAlpbnQgY3J5c3RhbF90eXBlID0gMDsgLyogRGVmYXVsdCAxMiBNSHogKi8KIAorCW9tYXBfZWFybHlfY2xrX3Jlc2V0KCk7CisKIAlmb3IgKGNsa3AgPSBvbmNoaXBfY2xrczsgY2xrcCA8IG9uY2hpcF9jbGtzK0FSUkFZX1NJWkUob25jaGlwX2Nsa3MpOyBjbGtwKyspIHsKIAkJaWYgKCgoKmNsa3ApLT5mbGFncyAmQ0xPQ0tfSU5fT01BUDE1MTApICYmIGNwdV9pc19vbWFwMTUxMCgpKSB7CiAJCQljbGtfcmVnaXN0ZXIoKmNsa3ApOwpAQCAtMTAyMyw5ICsxMTc2LDQyIEBACiAJCWNrX3JlZi5yYXRlID0gMTkyMDAwMDA7CiAjZW5kaWYKIAorCXByaW50aygiQ2xvY2tzOiBBUk1fU1lTU1Q6IDB4JTA0eCBEUExMX0NUTDogMHglMDR4IEFSTV9DS0NUTDogMHglMDR4XG4iLAorCSAgICAgICBvbWFwX3JlYWR3KEFSTV9TWVNTVCksIG9tYXBfcmVhZHcoRFBMTF9DVEwpLAorCSAgICAgICBvbWFwX3JlYWR3KEFSTV9DS0NUTCkpOworCiAJLyogV2Ugd2FudCB0byBiZSBpbiBzeW5jcm9ub3VzIHNjYWxhYmxlIG1vZGUgKi8KIAlvbWFwX3dyaXRldygweDEwMDAsIEFSTV9TWVNTVCk7CiAKKyNpZmRlZiBDT05GSUdfT01BUF9DTE9DS1NfU0VUX0JZX0JPT1RMT0FERVIKKwkvKiBVc2UgdmFsdWVzIHNldCBieSBib290bG9hZGVyLiBEZXRlcm1pbmUgUExMIHJhdGUgYW5kIHJlY2FsY3VsYXRlCisJICogZGVwZW5kZW50IGNsb2NrcyBhcyBpZiBrZXJuZWwgaGFkIGNoYW5nZWQgUExMIG9yIGRpdmlzb3JzLgorCSAqLworCXsKKwkJdW5zaWduZWQgcGxsX2N0bF92YWwgPSBvbWFwX3JlYWR3KERQTExfQ1RMKTsKKworCQlja19kcGxsMS5yYXRlID0gY2tfcmVmLnJhdGU7IC8qIEJhc2UgeHRhbCByYXRlICovCisJCWlmIChwbGxfY3RsX3ZhbCAmIDB4MTApIHsKKwkJCS8qIFBMTCBlbmFibGVkLCBhcHBseSBtdWx0aXBsaWVyIGFuZCBkaXZpc29yICovCisJCQlpZiAocGxsX2N0bF92YWwgJiAweGY4MCkKKwkJCQlja19kcGxsMS5yYXRlICo9IChwbGxfY3RsX3ZhbCAmIDB4ZjgwKSA+PiA3OworCQkJY2tfZHBsbDEucmF0ZSAvPSAoKHBsbF9jdGxfdmFsICYgMHg2MCkgPj4gNSkgKyAxOworCQl9IGVsc2UgeworCQkJLyogUExMIGRpc2FibGVkLCBhcHBseSBieXBhc3MgZGl2aXNvciAqLworCQkJc3dpdGNoIChwbGxfY3RsX3ZhbCAmIDB4YykgeworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJY2FzZSAweDQ6CisJCQkJY2tfZHBsbDEucmF0ZSAvPSAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlja19kcGxsMS5yYXRlIC89IDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcHJvcGFnYXRlX3JhdGUoJmNrX2RwbGwxKTsKKyNlbHNlCiAJLyogRmluZCB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZnJlcXVlbmN5IGFuZCBlbmFibGUgaXQgKi8KIAlpZiAoc2VsZWN0X3RhYmxlX3JhdGUoJnZpcnR1YWxfY2tfbXB1LCB+MCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTeXN0ZW0gZnJlcXVlbmNpZXMgbm90IHNldC4gQ2hlY2sgeW91ciBjb25maWcuXG4iKTsKQEAgLTEwMzQsMTIgKzEyMjAsMTMgQEAKIAkJb21hcF93cml0ZXcoMHgxMDA1LCBBUk1fQ0tDVEwpOwogCQlja19kcGxsMS5yYXRlID0gNjAwMDAwMDA7CiAJCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogJWxkLyVsZC8lbGRcbiIsCi0JCSAgICAgICBja19yZWYucmF0ZSwgY2tfZHBsbDEucmF0ZSwgYXJtX2NrLnJhdGUpOwogCX0KLQorI2VuZGlmCiAJLyogQ2FjaGUgcmF0ZXMgZm9yIGNsb2NrcyBjb25uZWN0ZWQgdG8gY2tfcmVmIChub3QgZHBsbDEpICovCiAJcHJvcGFnYXRlX3JhdGUoJmNrX3JlZik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoeHRhbC9EUExMMS9NUFUpOiAlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCisJICAgICAgIGNrX3JlZi5yYXRlIC8gMTAwMDAwMCwgKGNrX3JlZi5yYXRlIC8gMTAwMDAwKSAlIDEwLAorCSAgICAgICBja19kcGxsMS5yYXRlLCBhcm1fY2sucmF0ZSk7CiAKICNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyCiAJLyogU2VsZWN0IHNsaWNlciBvdXRwdXQgYXMgT01BUCBpbnB1dCBjbG9jayAqLwpAQCAtMTA3NCwzICsxMjYxLDYzIEBACiAKIAlyZXR1cm4gMDsKIH0KKworCisjaWZkZWYgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfbGF0ZV9jbGtfcmVzZXQodm9pZCkKK3sKKwkvKiBUdXJuIG9mZiBhbGwgdW51c2VkIGNsb2NrcyAqLworCXN0cnVjdCBjbGsgKnA7CisJX191MzIgcmVndmFsMzI7CisKKwlvbWFwX3dyaXRldygwLCBTT0ZUX1JFUV9SRUcpOworCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRzIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CisJCWlmIChwLT51c2Vjb3VudCA+IDAgfHwgKHAtPmZsYWdzICYgQUxXQVlTX0VOQUJMRUQpIHx8CisJCQlwLT5lbmFibGVfcmVnID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBBc3N1bWUgbm8gRFNQIGNsb2NrcyBoYXZlIGJlZW4gYWN0aXZhdGVkIGJ5IGJvb3Rsb2FkZXIgKi8KKwkJaWYgKHAtPmZsYWdzICYgRFNQX0RPTUFJTl9DTE9DSykKKwkJCWNvbnRpbnVlOworCisJCS8qIElzIHRoZSBjbG9jayBhbHJlYWR5IGRpc2FibGVkPyAqLworCQlpZiAocC0+ZmxhZ3MgJiBFTkFCTEVfUkVHXzMyQklUKSB7CisJCQlpZiAocC0+ZmxhZ3MgJiBWSVJUVUFMX0lPX0FERFJFU1MpCisJCQkJcmVndmFsMzIgPSBfX3Jhd19yZWFkbChwLT5lbmFibGVfcmVnKTsKKwkJCWVsc2UKKwkJCQlyZWd2YWwzMiA9IG9tYXBfcmVhZGwocC0+ZW5hYmxlX3JlZyk7CisJCX0gZWxzZSB7CisJCQlpZiAocC0+ZmxhZ3MgJiBWSVJUVUFMX0lPX0FERFJFU1MpCisJCQkJcmVndmFsMzIgPSBfX3Jhd19yZWFkdyhwLT5lbmFibGVfcmVnKTsKKwkJCWVsc2UKKwkJCQlyZWd2YWwzMiA9IG9tYXBfcmVhZHcocC0+ZW5hYmxlX3JlZyk7CisJCX0KKworCQlpZiAoKHJlZ3ZhbDMyICYgKDEgPDwgcC0+ZW5hYmxlX2JpdCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBGSVhNRTogVGhpcyBjbG9jayBzZWVtcyB0byBiZSBuZWNlc3NhcnkgYnV0IG5vLW9uZQorCQkgKiBoYXMgYXNrZWQgZm9yIGl0cyBhY3RpdmF0aW9uLiAqLworCQlpZiAocCA9PSAmdGMyX2NrICAgICAgICAgLy8gRklYOiBwbS5jIChTUkFNKSwgQ0NQLCBDYW1lcmEKKwkJICAgIHx8IHAgPT0gJmNrX2RwbGwxb3V0IC8vIEZJWDogU29TU0ksIFNTUgorCQkgICAgfHwgcCA9PSAmYXJtX2dwaW9fY2sgLy8gRklYOiBHUElPIGNvZGUgZm9yIDE1MTAKKwkJICAgICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRklYTUU6IENsb2NrIFwiJXNcIiBzZWVtcyB1bnVzZWRcbiIsCisJCQkgICAgICAgcC0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGluZyB1bnVzZWQgY2xvY2sgXCIlc1wiLi4uICIsIHAtPm5hbWUpOworCQlfX2Nsa19kaXNhYmxlKHApOworCQlwcmludGsoIiBkb25lXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChvbWFwX2xhdGVfY2xrX3Jlc2V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9jbG9jay5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suaAppbmRleCAwOGMwZGRkLi5hODllMWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmgKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suaAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgY29ycG9yYXRpb24KICAqICBXcml0dGVuIGJ5IFR1dWtrYSBUaWtrYW5lbiA8dHV1a2thLnRpa2thbmVuQGVsZWt0cm9iaXQuY29tPgpAQCAtNTIsNiArNTIsOCBAQAogI2RlZmluZSBDTE9DS19JTl9PTUFQMTZYWAk2NAogI2RlZmluZSBDTE9DS19JTl9PTUFQMTUxMAkxMjgKICNkZWZpbmUgQ0xPQ0tfSU5fT01BUDczMAkyNTYKKyNkZWZpbmUgRFNQX0RPTUFJTl9DTE9DSwk1MTIKKyNkZWZpbmUgVklSVFVBTF9JT19BRERSRVNTCTEwMjQKIAogLyogQVJNX0NLQ1RMIGJpdCBzaGlmdHMgKi8KICNkZWZpbmUgQ0tDVExfUEVSRElWX09GRlNFVAkwCkBAIC02Myw2ICs2NSw4IEBACiAvKiNkZWZpbmUgQVJNX1RJTVhPCQkxMiovCiAjZGVmaW5lIEVOX0RTUENLCQkxMwogLyojZGVmaW5lIEFSTV9JTlRIQ0tfU0VMCTE0Ki8gLyogRGl2aWRlLWJ5LTIgZm9yIG1wdSBpbnRoX2NrICovCisvKiBEU1BfQ0tDVEwgYml0IHNoaWZ0cyAqLworI2RlZmluZSBDS0NUTF9EU1BQRVJESVZfT0ZGU0VUCTAKIAogLyogQVJNX0lETEVDVDEgYml0IHNoaWZ0cyAqLwogLyojZGVmaW5lIElETFdEVF9BUk0JMCovCkBAIC05Niw2ICsxMDAsOSBAQAogI2RlZmluZSBFTl9UQzFfQ0sJMgogI2RlZmluZSBFTl9UQzJfQ0sJNAogCisvKiBEU1BfSURMRUNUMiBiaXQgc2hpZnRzICgwLDEsMiBhcmUgc2FtZSBhcyBmb3IgQVJNX0lETEVDVDIpICovCisjZGVmaW5lIEVOX0RTUFRJTUNLCTUKKwogLyogVmFyaW91cyByZWdpc3RlciBkZWZpbmVzIGZvciBjbG9jayBjb250cm9scyBzY2F0dGVyZWQgYXJvdW5kIE9NQVAgY2hpcCAqLwogI2RlZmluZSBVU0JfTUNMS19FTl9CSVQJCTQJLyogSW4gVUxQRF9DTEtDX0NUUkwgKi8KICNkZWZpbmUgVVNCX0hPU1RfSEhDX1VIT1NUX0VOCTkJLyogSW4gTU9EX0NPTkZfQ1RSTF8wICovCkBAIC0xMDMsNyArMTEwLDggQEAKICNkZWZpbmUgQ09NX1VMUERfUExMX0NMS19SRVEJMQkvKiBJbiBDT01fQ0xLX0RJVl9DVFJMX1NFTCAqLwogI2RlZmluZSBTV0RfQ0xLX0RJVl9DVFJMX1NFTAkweGZmZmUwODc0CiAjZGVmaW5lIENPTV9DTEtfRElWX0NUUkxfU0VMCTB4ZmZmZTA4NzgKLQorI2RlZmluZSBTT0ZUX1JFUV9SRUcJCTB4ZmZmZTA4MzQKKyNkZWZpbmUgU09GVF9SRVFfUkVHMgkJMHhmZmZlMDg4MAogCiBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5NjdhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYworICoKKyAqIENvZGUgY29tbW9uIHRvIGFsbCBPTUFQIG1hY2hpbmVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisKKyNkZWZpbmUgTk9fTEVOR1RIX0NIRUNLIDB4ZmZmZmZmZmYKKworZXh0ZXJuIGludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKK2V4dGVybiB1OCBvbWFwX2Jvb3Rsb2FkZXJfdGFnW107CisKK3N0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKm9tYXBfYm9hcmRfY29uZmlnOworaW50IG9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSAwOworCitzdGF0aWMgY29uc3Qgdm9pZCAqZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgc2tpcCwgc2l6ZV90ICpsZW5fb3V0KQoreworCXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKmtpbmZvID0gTlVMTDsKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19PTUFQX0JPT1RfVEFHCisJc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICppbmZvID0gTlVMTDsKKworCWlmIChvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbiA+IDQpCisJCWluZm8gPSAoc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICopIG9tYXBfYm9vdGxvYWRlcl90YWc7CisJd2hpbGUgKGluZm8gIT0gTlVMTCkgeworCQl1OCAqbmV4dDsKKworCQlpZiAoaW5mby0+dGFnID09IHRhZykgeworCQkJaWYgKHNraXAgPT0gMCkKKwkJCQlicmVhazsKKwkJCXNraXAtLTsKKwkJfQorCisJCWlmICgoaW5mby0+bGVuICYgMHgwMykgIT0gMCkgeworCQkJLyogV2UgYmFpbCBvdXQgdG8gYXZvaWQgYW4gYWxpZ25tZW50IGZhdWx0ICovCisJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAgcGVyaXBoZXJhbCBjb25maWc6IExlbmd0aCAoJWQpIG5vdCB3b3JkLWFsaWduZWQgKHRhZyAlMDR4KVxuIiwKKwkJCSAgICAgICBpbmZvLT5sZW4sIGluZm8tPnRhZyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQluZXh0ID0gKHU4ICopIGluZm8gKyBzaXplb2YoKmluZm8pICsgaW5mby0+bGVuOworCQlpZiAobmV4dCA+PSBvbWFwX2Jvb3Rsb2FkZXJfdGFnICsgb21hcF9ib290bG9hZGVyX3RhZ19sZW4pCisJCQlpbmZvID0gTlVMTDsKKwkJZWxzZQorCQkJaW5mbyA9IChzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKikgbmV4dDsKKwl9CisJaWYgKGluZm8gIT0gTlVMTCkgeworCQkvKiBDaGVjayB0aGUgbGVuZ3RoIGFzIGEgbGFtZSBhdHRlbXB0IHRvIGNoZWNrIGZvcgorCQkgKiBiaW5hcnkgaW5jb25zaXN0YW5jeS4gKi8KKwkJaWYgKGxlbiAhPSBOT19MRU5HVEhfQ0hFQ0spIHsKKwkJCS8qIFdvcmQtYWxpZ24gbGVuICovCisJCQlpZiAobGVuICYgMHgwMykKKwkJCQlsZW4gPSAobGVuICsgMykgJiB+MHgwMzsKKwkJCWlmIChpbmZvLT5sZW4gIT0gbGVuKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIHBlcmlwaGVyYWwgY29uZmlnOiBMZW5ndGggbWlzbWF0Y2ggd2l0aCB0YWcgJXggKHdhbnQgJWQsIGdvdCAlZClcbiIsCisJCQkJICAgICAgIHRhZywgbGVuLCBpbmZvLT5sZW4pOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCWlmIChsZW5fb3V0ICE9IE5VTEwpCisJCQkqbGVuX291dCA9IGluZm8tPmxlbjsKKwkJcmV0dXJuIGluZm8tPmRhdGE7CisJfQorI2VuZGlmCisJLyogVHJ5IHRvIGZpbmQgdGhlIGNvbmZpZyBmcm9tIHRoZSBib2FyZC1zcGVjaWZpYyBzdHJ1Y3R1cmVzCisJICogaW4gdGhlIGtlcm5lbC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsgaSsrKSB7CisJCWlmIChvbWFwX2JvYXJkX2NvbmZpZ1tpXS50YWcgPT0gdGFnKSB7CisJCQlraW5mbyA9ICZvbWFwX2JvYXJkX2NvbmZpZ1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChraW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4ga2luZm8tPmRhdGE7Cit9CisKK2NvbnN0IHZvaWQgKl9fb21hcF9nZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBucikKK3sKKyAgICAgICAgcmV0dXJuIGdldF9jb25maWcodGFnLCBsZW4sIG5yLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0woX19vbWFwX2dldF9jb25maWcpOworCitjb25zdCB2b2lkICpvbWFwX2dldF92YXJfY29uZmlnKHUxNiB0YWcsIHNpemVfdCAqbGVuKQoreworICAgICAgICByZXR1cm4gZ2V0X2NvbmZpZyh0YWcsIE5PX0xFTkdUSF9DSEVDSywgMCwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9nZXRfdmFyX2NvbmZpZyk7CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IG9tYXBfc2VyaWFsX2NvbnNvbGVfY29uZmlnICppbmZvOworCisJaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19TRVJJQUxfQ09OU09MRSwKKwkJCSAgICAgICBzdHJ1Y3Qgb21hcF9zZXJpYWxfY29uc29sZV9jb25maWcpOworCWlmIChpbmZvICE9IE5VTEwgJiYgaW5mby0+Y29uc29sZV91YXJ0KSB7CisJCXN0YXRpYyBjaGFyIHNwZWVkWzExXSwgKm9wdCA9IE5VTEw7CisKKwkJaWYgKGluZm8tPmNvbnNvbGVfc3BlZWQpIHsKKwkJCXNucHJpbnRmKHNwZWVkLCBzaXplb2Yoc3BlZWQpLCAiJXUiLCBpbmZvLT5jb25zb2xlX3NwZWVkKTsKKwkJCW9wdCA9IHNwZWVkOworCQl9CisJCXJldHVybiBhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBpbmZvLT5jb25zb2xlX3VhcnQgLSAxLCBvcHQpOworCX0KKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwob21hcF9hZGRfc2VyaWFsX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NwdS1vbWFwLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlhYWMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NwdS1vbWFwLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL2NwdS1vbWFwLmMKKyAqCisgKiAgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGZvciBPTUFQCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiAgQmFzZWQgb24gY3B1LXNhMTExMC5jLCBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorCisvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgU0RSQU0gdGltaW5nIGNoYW5nZXMgKi8KKworaW50IG9tYXBfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjbGsgKiBtcHVfY2xrOworCisJaWYgKHBvbGljeS0+Y3B1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCW1wdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJtcHUiKTsKKwlpZiAoSVNfRVJSKG1wdV9jbGspKQorCQlyZXR1cm4gUFRSX0VSUihtcHVfY2xrKTsKKwlwb2xpY3ktPm1pbiA9IGNsa19yb3VuZF9yYXRlKG1wdV9jbGssIHBvbGljeS0+bWluICogMTAwMCkgLyAxMDAwOworCXBvbGljeS0+bWF4ID0gY2xrX3JvdW5kX3JhdGUobXB1X2NsaywgcG9saWN5LT5tYXggKiAxMDAwKSAvIDEwMDA7CisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKwkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CisJY2xrX3B1dChtcHVfY2xrKTsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgb21hcF9nZXRzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjbGsgKiBtcHVfY2xrOworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCisJbXB1X2NsayA9IGNsa19nZXQoTlVMTCwgIm1wdSIpOworCWlmIChJU19FUlIobXB1X2NsaykpCisJCXJldHVybiAwOworCXJhdGUgPSBjbGtfZ2V0X3JhdGUobXB1X2NsaykgLyAxMDAwOworCWNsa19wdXQobXB1X2Nsayk7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIGludCBvbWFwX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJICAgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwlzdHJ1Y3QgY2xrICogbXB1X2NsazsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwlpbnQgcmV0ID0gMDsKKworCW1wdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJtcHUiKTsKKwlpZiAoSVNfRVJSKG1wdV9jbGspKQorCQlyZXR1cm4gUFRSX0VSUihtcHVfY2xrKTsKKworCWZyZXFzLm9sZCA9IG9tYXBfZ2V0c3BlZWQoMCk7CisJZnJlcXMubmV3ID0gY2xrX3JvdW5kX3JhdGUobXB1X2NsaywgdGFyZ2V0X2ZyZXEgKiAxMDAwKSAvIDEwMDA7CisJZnJlcXMuY3B1ID0gMDsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJcmV0ID0gY2xrX3NldF9yYXRlKG1wdV9jbGssIHRhcmdldF9mcmVxICogMTAwMCk7CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJY2xrX3B1dChtcHVfY2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNsayAqIG1wdV9jbGs7CisKKwltcHVfY2xrID0gY2xrX2dldChOVUxMLCAibXB1Iik7CisJaWYgKElTX0VSUihtcHVfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIobXB1X2Nsayk7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gb21hcF9nZXRzcGVlZCgwKTsKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IGNsa19yb3VuZF9yYXRlKG1wdV9jbGssIDApIC8gMTAwMDsKKwlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgPSBjbGtfcm91bmRfcmF0ZShtcHVfY2xrLCAyMTYwMDAwMDApIC8gMTAwMDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCWNsa19wdXQobXB1X2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBvbWFwX2RyaXZlciA9IHsKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9TVElDS1ksCisJLnZlcmlmeQkJPSBvbWFwX3ZlcmlmeV9zcGVlZCwKKwkudGFyZ2V0CQk9IG9tYXBfdGFyZ2V0LAorCS5nZXQJCT0gb21hcF9nZXRzcGVlZCwKKwkuaW5pdAkJPSBvbWFwX2NwdV9pbml0LAorCS5uYW1lCQk9ICJvbWFwIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZvbWFwX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF9jcHVmcmVxX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9kbWEuYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCmluZGV4IDdhOWViZTguLmMwYTVjMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vb21hcC9kbWEuYworICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCiAgKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CkBAIC03OTQsMTAgKzc5NCw2IEBACiAJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKIAkvKiBBbHdheXMgc2V0IHRoZSBzb3VyY2UgcG9ydCBhcyBTRFJBTSBmb3Igbm93Ki8KIAl3ICY9IH4oMHgwMyA8PCA2KTsKLQlpZiAobGNkX2RtYS5leHRfY3RybCkKLQkJdyB8PSAxIDw8IDg7Ci0JZWxzZQotCQl3ICY9IH4oMSA8PCA4KTsKIAlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQogCQl3IHw9IDEgPDwgMTsgICAgICAgICAgICAvKiBCbG9jayBpbnRlcnJ1cHQgZW5hYmxlICovCiAJZWxzZQpAQCAtODg5LDkgKzg4NSwxNSBAQAogCSAqLwogCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQogCQlyZXR1cm47CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCXcgfD0gMSA8PCA4OworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisKIAl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CiAJdyB8PSAxIDw8IDc7CiAJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCiAJbGNkX2RtYS5hY3RpdmUgPSAxOwogfQogCkBAIC05MjIsMTAgKzkyNCwxOSBAQAogCiB2b2lkIG9tYXBfc3RvcF9sY2RfZG1hKHZvaWQpCiB7CisJdTE2IHc7CisKIAlsY2RfZG1hLmFjdGl2ZSA9IDA7Ci0JaWYgKCFlbmFibGVfMTUxMF9tb2RlICYmIGxjZF9kbWEuZXh0X2N0cmwpCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpICYgfigxIDw8IDcpLAotCQkJICAgIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwlpZiAoZW5hYmxlXzE1MTBfbW9kZSB8fCAhbGNkX2RtYS5leHRfY3RybCkKKwkJcmV0dXJuOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCXcgJj0gfigxIDw8IDcpOworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJdyAmPSB+KDEgPDwgOCk7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKIH0KIAogLyoKQEAgLTk3Miw2ICs5ODMsMjUgQEAKIAkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7CiB9CiAKK2ludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpCit7CisJaW50IGxjaDsKKworCS8qIENoZWNrIGlmIExDRCBETUEgaXMgcnVubmluZyAqLworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJaWYgKG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpICYgT01BUF9ETUFfQ0NSX0VOKQorCQkJcmV0dXJuIDE7CisKKwlmb3IgKGxjaCA9IDA7IGxjaCA8IGRtYV9jaGFuX2NvdW50OyBsY2grKykgeworCQl1MTYgdzsKKworCQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DQ1IobGNoKSk7CisJCWlmICh3ICYgT01BUF9ETUFfQ0NSX0VOKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXRfZG1hKHZvaWQpCiB7CiAJaW50IGNoLCByOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2dwaW8uYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwppbmRleCA5MDQ1ZGZkLi4xYzg1YjRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCiAgKgogICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIE9NQVAgR1BJTwogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9tY2JzcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCmluZGV4IDdjNGFkNzcuLjQzNTY3ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL29tYXAvbWNic3AuYworICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KICAqIEF1dGhvcjogU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgpAQCAtNjYsNiArNjYsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX21jYnNwIG1jYnNwW09NQVBfTUFYX01DQlNQX0NPVU5UXTsKIHN0YXRpYyBzdHJ1Y3QgY2xrICptY2JzcF9kc3BfY2sgPSAwOwogc3RhdGljIHN0cnVjdCBjbGsgKm1jYnNwX2FwaV9jayA9IDA7CitzdGF0aWMgc3RydWN0IGNsayAqbWNic3BfZHNweG9yX2NrID0gMDsKIAogCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2R1bXBfcmVnKHU4IGlkKQpAQCAtMTc1LDcgKzE3Niw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgewogCQlpZiAoaWQgPiBPTUFQX01BWF9NQ0JTUF9DT1VOVCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGRvZXNuJ3QgZXhpc3RcbiIsIGlkICsgMSk7CiAJCQlyZXR1cm4gLTE7CkBAIC0xOTEsMTUgKzE5MiwxMiBAQAogCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2RzcF9yZXF1ZXN0KHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7Ci0JCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KEFSTV9SU1RDVDEpIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSksCi0JCQkgICAgQVJNX1JTVENUMSk7Ci0JCWNsa19lbmFibGUobWNic3BfZHNwX2NrKTsKLQkJY2xrX2VuYWJsZShtY2JzcF9hcGlfY2spOworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgeworCQljbGtfdXNlKG1jYnNwX2RzcF9jayk7CisJCWNsa191c2UobWNic3BfYXBpX2NrKTsKIAogCQkvKiBlbmFibGUgMTJNSHogY2xvY2sgdG8gbWNic3AgMSAmIDMgKi8KLQkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KERTUF9JRExFQ1QyKSB8ICgxIDw8IEVOX1hPUlBDSyksCi0JCQkgICAgIERTUF9JRExFQ1QyKTsKKwkJY2xrX3VzZShtY2JzcF9kc3B4b3JfY2spOwogCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoRFNQX1JTVENUMikgfCAxIHwgMSA8PCAxLAogCQkJICAgICBEU1BfUlNUQ1QyKTsKIAl9CkBAIC0yMDcsMTAgKzIwNSwxMyBAQAogCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2RzcF9mcmVlKHZvaWQpCiB7Ci0JLyogVXNlbGVzcyBmb3Igbm93ICovCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWNsa191bnVzZShtY2JzcF9kc3B4b3JfY2spOworCQljbGtfdW51c2UobWNic3BfZHNwX2NrKTsKKwkJY2xrX3VudXNlKG1jYnNwX2FwaV9jayk7CisJfQogfQogCi0KIGludCBvbWFwX21jYnNwX3JlcXVlc3QodW5zaWduZWQgaW50IGlkKQogewogCWludCBlcnI7CkBAIC0zNTAsNiArMzUxLDczIEBACiB9CiAKIAorLyogcG9sbGVkIG1jYnNwIGkvbyBvcGVyYXRpb25zICovCitpbnQgb21hcF9tY2JzcF9wb2xsd3JpdGUodW5zaWduZWQgaW50IGlkLCB1MTYgYnVmKQoreworCXUzMiBiYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisJd3JpdGV3KGJ1ZiwgYmFzZSArIE9NQVBfTUNCU1BfUkVHX0RYUjEpOworCS8qIGlmIGZyYW1lIHN5bmMgZXJyb3IgLSBjbGVhciB0aGUgZXJyb3IgKi8KKwlpZiAocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKSAmIFhTWU5DX0VSUikgeworCQkvKiBjbGVhciBlcnJvciAqLworCQl3cml0ZXcocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKSAmICh+WFNZTkNfRVJSKSwKKwkJICAgICAgIGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMik7CisJCS8qIHJlc2VuZCAqLworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJLyogd2FpdCBmb3IgdHJhbnNtaXQgY29uZmlybWF0aW9uICovCisJCWludCBhdHRlbXBzID0gMDsKKwkJd2hpbGUgKCEocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKSAmIFhSRFkpKSB7CisJCQlpZiAoYXR0ZW1wcysrID4gMTAwMCkgeworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYKKwkJCQkgICAgICAgKH5YUlNUKSwKKwkJCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpIHwKKwkJCQkgICAgICAgKFhSU1QpLAorCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpOworCQkJCXVkZWxheSgxMCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIgQ291bGQgbm90IHdyaXRlIHRvIE1jQlNQIFJlZ2lzdGVyXG4iKTsKKwkJCQlyZXR1cm4gLTI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBvbWFwX21jYnNwX3BvbGxyZWFkKHVuc2lnbmVkIGludCBpZCwgdTE2ICogYnVmKQoreworCXUzMiBiYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisJLyogaWYgZnJhbWUgc3luYyBlcnJvciAtIGNsZWFyIHRoZSBlcnJvciAqLworCWlmIChyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpICYgUlNZTkNfRVJSKSB7CisJCS8qIGNsZWFyIGVycm9yICovCisJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpICYgKH5SU1lOQ19FUlIpLAorCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKTsKKwkJLyogcmVzZW5kICovCisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQkvKiB3YWl0IGZvciByZWNpZXZlIGNvbmZpcm1hdGlvbiAqLworCQlpbnQgYXR0ZW1wcyA9IDA7CisJCXdoaWxlICghKHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSkgJiBSUkRZKSkgeworCQkJaWYgKGF0dGVtcHMrKyA+IDEwMDApIHsKKwkJCQl3cml0ZXcocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKSAmCisJCQkJICAgICAgICh+UlJTVCksCisJCQkJICAgICAgIGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSk7CisJCQkJdWRlbGF5KDEwKTsKKwkJCQl3cml0ZXcocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKSB8CisJCQkJICAgICAgIChSUlNUKSwKKwkJCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiIENvdWxkIG5vdCByZWFkIGZyb20gTWNCU1AgUmVnaXN0ZXJcbiIpOworCQkJCXJldHVybiAtMjsKKwkJCX0KKwkJfQorCX0KKwkqYnVmID0gcmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX0RSUjEpOworCXJldHVybiAwOworfQorCiAvKgogICogSVJRIGJhc2VkIHdvcmQgdHJhbnNtaXNzaW9uLgogICovCkBAIC02MjUsMTAgKzY5MywxNSBAQAogCQlyZXR1cm4gUFRSX0VSUihtY2JzcF9kc3BfY2spOwogCX0KIAltY2JzcF9hcGlfY2sgPSBjbGtfZ2V0KDAsICJhcGlfY2siKTsKLQlpZiAoSVNfRVJSKG1jYnNwX2RzcF9jaykpIHsKKwlpZiAoSVNfRVJSKG1jYnNwX2FwaV9jaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtY2JzcDogY291bGQgbm90IGFjcXVpcmUgYXBpX2NrIGhhbmRsZS5cbiIpOwogCQlyZXR1cm4gUFRSX0VSUihtY2JzcF9hcGlfY2spOwogCX0KKwltY2JzcF9kc3B4b3JfY2sgPSBjbGtfZ2V0KDAsICJkc3B4b3JfY2siKTsKKwlpZiAoSVNfRVJSKG1jYnNwX2RzcHhvcl9jaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtY2JzcDogY291bGQgbm90IGFjcXVpcmUgZHNweG9yX2NrIGhhbmRsZS5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihtY2JzcF9kc3B4b3JfY2spOworCX0KIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKIAlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewpAQCAtNjQzLDcgKzcxNiw3IEBACiAJfQogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKIAkJbWNic3BfaW5mbyA9IG1jYnNwXzE2MTA7CiAJCW1jYnNwX2NvdW50ID0gQVJSQVlfU0laRShtY2JzcF8xNjEwKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL211eC5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKaW5kZXggYmNmM2M2ZS4uZWE3Yjk1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL211eC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwogICoKICAqIFV0aWxpdHkgdG8gc2V0IHRoZSBPbWFwIE1VWCBhbmQgUFVMTF9EV04gcmVnaXN0ZXJzIGZyb20gYSB0YWJsZSBpbiBtdXguaAogICoKQEAgLTUzLDE5ICs1MywxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljZmcgPSAmcmVnX2NmZ190YWJsZVtyZWdfY2ZnXTsKLQotCS8qCi0JICogV2UgZG8gYSBwcmV0dHkgbG9uZyBzZWN0aW9uIGhlcmUgd2l0aCBsb2NrIG9uLCBidXQgcGluIG11eGluZwotCSAqIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBkcml2ZXIgaW5pdCBmb3IgZWFjaCBkcml2ZXIsIHNvIGl0J3Mgbm90IHRpbWUKLQkgKiBjcml0aWNhbC4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOworCWNmZyA9IChyZWdfY2ZnX3NldCAqKSZyZWdfY2ZnX3RhYmxlW3JlZ19jZmddOwogCiAJLyogQ2hlY2sgdGhlIG11eCByZWdpc3RlciBpbiBxdWVzdGlvbiAqLwogCWlmIChjZmctPm11eF9yZWcpIHsKIAkJdW5zaWduZWQJdG1wMSwgdG1wMjsKIAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOwogCQlyZWdfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5tdXhfcmVnKTsKIAogCQkvKiBUaGUgbXV4IHJlZ2lzdGVycyBhbHdheXMgc2VlbSB0byBiZSAzIGJpdHMgbG9uZyAqLwpAQCAtODAsMTEgKzc0LDEzIEBACiAJCQl3YXJuID0gMTsKIAogCQlvbWFwX3dyaXRlbChyZWcsIGNmZy0+bXV4X3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgcHVsbCB1cCBvciBwdWxsIGRvd24gc2VsZWN0aW9uIG9uIDE2MTAgKi8KIAlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CiAJCWlmIChjZmctPnB1X3BkX3JlZyAmJiBjZmctPnB1bGxfdmFsKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOwogCQkJcHVfcGRfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5wdV9wZF9yZWcpOwogCQkJbWFzayA9IDEgPDwgY2ZnLT5wdWxsX2JpdDsKIApAQCAtMTAwLDExICs5NiwxMyBAQAogCQkJCXB1X3BkID0gcHVfcGRfb3JpZyAmIH5tYXNrOwogCQkJfQogCQkJb21hcF93cml0ZWwocHVfcGQsIGNmZy0+cHVfcGRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAkJfQogCX0KIAogCS8qIENoZWNrIGZvciBhbiBhc3NvY2lhdGVkIHB1bGwgZG93biByZWdpc3RlciAqLwogCWlmIChjZmctPnB1bGxfcmVnKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7CiAJCXB1bGxfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5wdWxsX3JlZyk7CiAJCW1hc2sgPSAxIDw8IGNmZy0+cHVsbF9iaXQ7CiAKQEAgLTEyMSw2ICsxMTksNyBAQAogCQl9CiAKIAkJb21hcF93cml0ZWwocHVsbCwgY2ZnLT5wdWxsX3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAl9CiAKIAlpZiAod2FybikgewpAQCAtMTQ5LDggKzE0OCw2IEBACiAJfQogI2VuZGlmCiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVhfRVJST1JTCiAJcmV0dXJuIHdhcm4gPyAtRVRYVEJTWSA6IDA7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwppbmRleCBjOWNlZDEzLi4yZWRlMmVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYworICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwogICoKICAqIE1pbmltYWwgT0NQIGJ1cyBzdXBwb3J0IGZvciBvbWFwMTZ4eAogICoKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvcG0uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9wbS5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvcG0uYwppbmRleCAwMGZhYzE1Li5lNjUzNmIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvcG0uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvcG0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvcG0uYworICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKICAqCiAgKiBPTUFQIFBvd2VyIE1hbmFnZW1lbnQgUm91dGluZXMKICAqCkBAIC00MSw3ICs0MSw5IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCiAjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDE2eHguaD4KICNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgpAQCAtODAsMTMgKzgyLDEzIEBACiAJCXJldHVybjsKIAl9CiAJbWFzazMyID0gb21hcF9yZWFkbChBUk1fU1lTU1QpOwotCWxvY2FsX2ZpcV9lbmFibGUoKTsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQXzMyS19USU1FUikgJiYgZGVmaW5lZChDT05GSUdfTk9fSURMRV9IWikKLQkvKiBPdmVycmlkZSB0aW1lciB0byB1c2UgVlNUIGZvciB0aGUgbmV4dCBjeWNsZSAqLwotCW9tYXBfMzJrX3RpbWVyX25leHRfdnN0X2ludGVycnVwdCgpOwotI2VuZGlmCisJLyoKKwkgKiBTaW5jZSBhbiBpbnRlcnJ1cHQgbWF5IHNldCB1cCBhIHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvCisJICogcmVwcm9ncmFtIHRoZSBoYXJkd2FyZSB0aW1lciB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKwkgKiBSZS1lbmFibGUgaW50ZXJydXB0cyBvbmx5IGFmdGVyIHJldHVybmluZyBmcm9tIGlkbGUuCisJICovCisJdGltZXJfZHluX3JlcHJvZ3JhbSgpOwogCiAJaWYgKChtYXNrMzIgJiBEU1BfSURMRSkgPT0gMCkgewogCQlfX2FzbV9fIHZvbGF0aWxlICgibWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNCIpOwpAQCAtMTAyLDYgKzEwNCw4IEBACiAKIAkJZnVuY19wdHIoKTsKIAl9CisJbG9jYWxfZmlxX2VuYWJsZSgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TCmluZGV4IDRkNDI2ZDEuLjI3OTQ5MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUwogICoKICAqIExvdy1sZXZlbCBPTUFQMTUxMC8xNjEwIHNsZWVwL3dha2VVcCBzdXBwb3J0CiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC91c2IuYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCmluZGV4IDZlODA1ZDQuLjI1YmM0YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC91c2IuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIC0tIHBsYXRmb3JtIGxldmVsIFVTQiBpbml0aWFsaXphdGlvbgorICogYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jIC0tIHBsYXRmb3JtIGxldmVsIFVTQiBpbml0aWFsaXphdGlvbgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICoKQEAgLTQxLDcgKzQxLDYgQEAKIAogLyogVGhlc2Ugcm91dGluZXMgc2hvdWxkIGhhbmRsZSB0aGUgc3RhbmRhcmQgY2hpcC1zcGVjaWZpYyBtb2RlcwogICogZm9yIHVzYjAvMS8yIHBvcnRzLCBjb3ZlcmluZyBiYXNpYyBtdXggYW5kIHRyYW5zY2VpdmVyIHNldHVwLgotICogQ2FsbCBvbWFwX3VzYl9pbml0KCkgb25jZSwgZnJvbSBJTklUX01BQ0hJTkUoKS4KICAqCiAgKiBTb21lIGJvYXJkLSouYyBmaWxlcyB3aWxsIG5lZWQgdG8gc2V0IHVwIGFkZGl0aW9uYWwgbXV4IG9wdGlvbnMsCiAgKiBsaWtlIGZvciBzdXNwZW5kIGhhbmRsaW5nLCB2YnVzIHNlbnNpbmcsIEdQSU9zLCBhbmQgdGhlIEQrIHB1bGx1cC4KQEAgLTI4OCw4ICsyODcsOCBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1ZGNfcmVzb3VyY2VzW10gPSB7CiAJLyogb3JkZXIgaXMgc2lnbmlmaWNhbnQhICovCiAJewkJLyogcmVnaXN0ZXJzICovCi0JCS5zdGFydAkJPSBJT19BRERSRVNTKFVEQ19CQVNFKSwKLQkJLmVuZAkJPSBJT19BRERSRVNTKFVEQ19CQVNFICsgMHhmZiksCisJCS5zdGFydAkJPSBVRENfQkFTRSwKKwkJLmVuZAkJPSBVRENfQkFTRSArIDB4ZmYsCiAJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIAl9LCB7CQkvKiBnZW5lcmFsIElSUSAqLwogCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyAyMCwKQEAgLTMyNyw3ICszMjYsNyBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0CT0gT01BUF9PSENJX0JBU0UsCi0JCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYsCisJCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKQEAgLTM1NSw4ICszNTQsOCBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvdGdfcmVzb3VyY2VzW10gPSB7CiAJLyogb3JkZXIgaXMgc2lnbmlmaWNhbnQhICovCiAJewotCQkuc3RhcnQJCT0gSU9fQUREUkVTUyhPVEdfQkFTRSksCi0JCS5lbmQJCT0gSU9fQUREUkVTUyhPVEdfQkFTRSArIDB4ZmYpLAorCQkuc3RhcnQJCT0gT1RHX0JBU0UsCisJCS5lbmQJCT0gT1RHX0JBU0UgKyAweGZmLAogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgewogCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyA4LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggMzBjMWRmYi4uNmQzYTc5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCkBAIC02LDcgKzYsNyBAQAogIyBUbyBhZGQgYW4gZW50cnkgaW50byB0aGlzIGRhdGFiYXNlLCBwbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vYXJtL1JFQURNRSwKICMgb3IgY29udGFjdCBybWtAYXJtLmxpbnV4Lm9yZy51awogIwotIyBMYXN0IHVwZGF0ZTogVGh1IE1hciAyNCAxNDozNDo1MCAyMDA1CisjIExhc3QgdXBkYXRlOiBUaHUgSnVuIDIzIDIwOjE5OjMzIDIwMDUKICMKICMgbWFjaGluZV9pc194eHgJQ09ORklHX3h4eHgJCU1BQ0hfVFlQRV94eHgJCW51bWJlcgogIwpAQCAtMjQzLDcgKzI0Myw3IEBACiBqYXNwZXIJCQlBUkNIX0pBU1BFUgkJSkFTUEVSCQkJMjMyCiBkc2MyNQkJCUFSQ0hfRFNDMjUJCURTQzI1CQkJMjMzCiBvbWFwX2lubm92YXRvcgkJTUFDSF9PTUFQX0lOTk9WQVRPUglPTUFQX0lOTk9WQVRPUgkJMjM0Ci1yYW1zZXMJCQlBUkNIX1JBTVNFUwkJUkFNU0VTCQkJMjM1CittbmNpCQkJQVJDSF9SQU1TRVMJCVJBTVNFUwkJCTIzNQogczI4eAkJCUFSQ0hfUzI4WAkJUzI4WAkJCTIzNgogbXBvcnQzCQkJQVJDSF9NUE9SVDMJCU1QT1JUMwkJCTIzNwogcHhhX2VhZ2xlMjUwCQlBUkNIX1BYQV9FQUdMRTI1MAlQWEFfRUFHTEUyNTAJCTIzOApAQCAtMzIzLDcgKzMyMyw3IEBACiBuaW1icmEyMTAJCUFSQ0hfTklNQlJBMjEwCQlOSU1CUkEyMTAJCTMxMgogaGhwX2Q5NXh4CQlBUkNIX0hIUF9EOTVYWAkJSEhQX0Q5NVhYCQkzMTMKIGxhYmFybQkJCUFSQ0hfTEFCQVJNCQlMQUJBUk0JCQkzMTQKLW04MjV4eAkJCUFSQ0hfTTgyNVhYCQlNODI1WFgJCQkzMTUKK2NvbWNlcnRvCQlBUkNIX004MjVYWAkJTTgyNVhYCQkJMzE1CiBtNzEwMAkJCVNBMTEwMF9NNzEwMAkJTTcxMDAJCQkzMTYKIG5pcGMyCQkJQVJDSF9OSVBDMgkJTklQQzIJCQkzMTcKIGZ1NzIwMgkJCUFSQ0hfRlU3MjAyCQlGVTcyMDIJCQkzMTgKQEAgLTcyNCwzICs3MjQsNjYgQEAKIG9tYXBfY29tZXQzCQlNQUNIX0NPTUVUMwkJQ09NRVQzCQkJNzE2CiBvbWFwX2NvbWV0NAkJTUFDSF9DT01FVDQJCUNPTUVUNAkJCTcxNwogY3NiNjI1CQkJTUFDSF9DU0I2MjUJCUNTQjYyNQkJCTcxOAorZm9ydHVuZXQyCQlNQUNIX0ZPUlRVTkVUMgkJRk9SVFVORVQyCQk3MTkKK3M1aDIyMDAJCQlNQUNIX1M1SDIyMDAJCVM1SDIyMDAJCQk3MjAKK29wdG9ybTkyMAkJTUFDSF9PUFRPUk05MjAJCU9QVE9STTkyMAkJNzIxCithZHNiaXRzeXhiCQlNQUNIX0FEU0JJVFNZWEIJCUFEU0JJVFNZWEIJCTcyMgorYWRzc3BoZXJlCQlNQUNIX0FEU1NQSEVSRQkJQURTU1BIRVJFCQk3MjMKK2Fkc3BvcnRhbAkJTUFDSF9BRFNQT1JUQUwJCUFEU1BPUlRBTAkJNzI0CitsbjI0MTBzYmMJCU1BQ0hfTE4yNDEwU0JDCQlMTjI0MTBTQkMJCTcyNQorY2IzcnVmYwkJCU1BQ0hfQ0IzUlVGQwkJQ0IzUlVGQwkJCTcyNgorbXAydXNiCQkJTUFDSF9NUDJVU0IJCU1QMlVTQgkJCTcyNworbnRucDQyNWMJCU1BQ0hfTlROUDQyNUMJCU5UTlA0MjVDCQk3MjgKK2NvbGlicmkJCQlNQUNIX0NPTElCUkkJCUNPTElCUkkJCQk3MjkKK3BjbTcyMjAJCQlNQUNIX1BDTTcyMjAJCVBDTTcyMjAJCQk3MzAKK2dhdGV3YXk3MDAxCQlNQUNIX0dBVEVXQVk3MDAxCUdBVEVXQVk3MDAxCQk3MzEKK3BjbTAyNwkJCU1BQ0hfUENNMDI3CQlQQ00wMjcJCQk3MzIKK2NtcHhhCQkJTUFDSF9DTVBYQQkJQ01QWEEJCQk3MzMKK2FudWJpcwkJCU1BQ0hfQU5VQklTCQlBTlVCSVMJCQk3MzQKK2l0ZTgxNTIJCQlNQUNIX0lURTgxNTIJCUlURTgxNTIJCQk3MzUKK2xwYzN4eHgJCQlNQUNIX0xQQzNYWFgJCUxQQzNYWFgJCQk3MzYKK3B1cHBldGVlcgkJTUFDSF9QVVBQRVRFRVIJCVBVUFBFVEVFUgkJNzM3Cit2dDAwMQkJCU1BQ0hfTUFDSF9WQURBVEVDSAlNQUNIX1ZBREFURUNICQk3MzgKK2U1NzAJCQlNQUNIX0U1NzAJCUU1NzAJCQk3MzkKK3g1MAkJCU1BQ0hfWDUwCQlYNTAJCQk3NDAKK3JlY29uCQkJTUFDSF9SRUNPTgkJUkVDT04JCQk3NDEKK3hib2FyZGdwOAkJTUFDSF9YQk9BUkRHUDgJCVhCT0FSREdQOAkJNzQyCitmcGljMgkJCU1BQ0hfRlBJQzIJCUZQSUMyCQkJNzQzCitha2l0YQkJCU1BQ0hfQUtJVEEJCUFLSVRBCQkJNzQ0CithODEJCQlNQUNIX0E4MQkJQTgxCQkJNzQ1Citzdm1fc2MyNXgJCU1BQ0hfU1ZNX1NDMjVYCQlTVk1fU0MyNVgJCTc0NgordnQwMjAJCQlNQUNIX1ZBREFURUNIMDIwCVZBREFURUNIMDIwCQk3NDcKK3RsaQkJCU1BQ0hfVExJCQlUTEkJCQk3NDgKK2VkYjkzMTVsYwkJTUFDSF9FREI5MzE1TEMJCUVEQjkzMTVMQwkJNzQ5CitwYXNzZWMJCQlNQUNIX1BBU1NFQwkJUEFTU0VDCQkJNzUwCitkc190aWdlcgkJTUFDSF9EU19USUdFUgkJRFNfVElHRVIJCTc1MQorZTMxMAkJCU1BQ0hfRTMxMAkJRTMxMAkJCTc1MgorZTMzMAkJCU1BQ0hfRTMzMAkJRTMzMAkJCTc1MworcnQzMDAwCQkJTUFDSF9SVDMwMDAJCVJUMzAwMAkJCTc1NAorbm9raWE3NzAJCU1BQ0hfTk9LSUE3NzAJCU5PS0lBNzcwCQk3NTUKK3BueDAxMDYJCQlNQUNIX1BOWDAxMDYJCVBOWDAxMDYJCQk3NTYKK2h4MjF4eAkJCU1BQ0hfSFgyMVhYCQlIWDIxWFgJCQk3NTcKK2ZhcmFkYXkJCQlNQUNIX0ZBUkFEQVkJCUZBUkFEQVkJCQk3NTgKK3NiYzkzMTIJCQlNQUNIX1NCQzkzMTIJCVNCQzkzMTIJCQk3NTkKK2JhdG1hbgkJCU1BQ0hfQkFUTUFOCQlCQVRNQU4JCQk3NjAKK2pwZDIwMQkJCU1BQ0hfSlBEMjAxCQlKUEQyMDEJCQk3NjEKK21pcHNhCQkJTUFDSF9NSVBTQQkJTUlQU0EJCQk3NjIKK2thY29tCQkJTUFDSF9LQUNPTQkJS0FDT00JCQk3NjMKK3N3YXJjb2NwdQkJTUFDSF9TV0FSQ09DUFUJCVNXQVJDT0NQVQkJNzY0Citzd2FyY29kc2wJCU1BQ0hfU1dBUkNPRFNMCQlTV0FSQ09EU0wJCTc2NQorYmx1ZWFuZ2VsCQlNQUNIX0JMVUVBTkdFTAkJQkxVRUFOR0VMCQk3NjYKK2hhaXJ5Z3JhbWEJCU1BQ0hfSEFJUllHUkFNQQkJSEFJUllHUkFNQQkJNzY3CitiYW5mZgkJCU1BQ0hfQkFORkYJCUJBTkZGCQkJNzY4CitjYXJtZXZhCQkJTUFDSF9DQVJNRVZBCQlDQVJNRVZBCQkJNzY5CitzYW0yNTUJCQlNQUNIX1NBTTI1NQkJU0FNMjU1CQkJNzcwCitwcG0xMAkJCU1BQ0hfUFBNMTAJCVBQTTEwCQkJNzcxCitlZGI5MzE1YQkJTUFDSF9FREI5MzE1QQkJRURCOTMxNUEJCTc3Mgorc3Vuc2V0CQkJTUFDSF9TVU5TRVQJCVNVTlNFVAkJCTc3Mworc3RhcmdhdGUyCQlNQUNIX1NUQVJHQVRFMgkJU1RBUkdBVEUyCQk3NzQKK2ludGVsbW90ZTIJCU1BQ0hfSU5URUxNT1RFMgkJSU5URUxNT1RFMgkJNzc1Cit0cml6ZXBzNAkJTUFDSF9UUklaRVBTNAkJVFJJWkVQUzQJCTc3NgorbWFpbnN0b25lMgkJTUFDSF9NQUlOU1RPTkUyCQlNQUlOU1RPTkUyCQk3NzcKK2V6X2l4cDQyeAkJTUFDSF9FWl9JWFA0MlgJCUVaX0lYUDQyWAkJNzc4Cit0YXB3YXZlX3pvZGlhYwkJTUFDSF9UQVBXQVZFX1pPRElBQwlUQVBXQVZFX1pPRElBQwkJNzc5Cit1bml2ZXJzYWxtZXRlcgkJTUFDSF9VTklWRVJTQUxNRVRFUglVTklWRVJTQUxNRVRFUgkJNzgwCitoaWNvYXJtOQkJTUFDSF9ISUNPQVJNOQkJSElDT0FSTTkJCTc4MQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcC5oIGIvYXJjaC9hcm0vdmZwL3ZmcC5oCmluZGV4IDU1YTAyYmMuLjRiOTc5NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC92ZnAuaAorKysgYi9hcmNoL2FybS92ZnAvdmZwLmgKQEAgLTExNyw3ICsxMTcsMTMgQEAKIAlpZiAobmggPj0gbSkKIAkJcmV0dXJuIH4wVUxMOwogCW1oID0gbSA+PiAzMjsKLQl6ID0gKG1oIDw8IDMyIDw9IG5oKSA/IDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCA6IChuaCAvIG1oKSA8PCAzMjsKKwlpZiAobWggPDwgMzIgPD0gbmgpIHsKKwkJeiA9IDB4ZmZmZmZmZmYwMDAwMDAwMFVMTDsKKwl9IGVsc2UgeworCQl6ID0gbmg7CisJCWRvX2Rpdih6LCBtaCk7CisJCXogPDw9IDMyOworCX0KIAltdWw2NHRvMTI4KCZ0ZXJtaCwgJnRlcm1sLCBtLCB6KTsKIAlzdWIxMjgoJnJlbWgsICZyZW1sLCBuaCwgbmwsIHRlcm1oLCB0ZXJtbCk7CiAJbWwgPSBtIDw8IDMyOwpAQCAtMTI2LDcgKzEzMiwxMiBAQAogCQlhZGQxMjgoJnJlbWgsICZyZW1sLCByZW1oLCByZW1sLCBtaCwgbWwpOwogCX0KIAlyZW1oID0gKHJlbWggPDwgMzIpIHwgKHJlbWwgPj4gMzIpOwotCXogfD0gKG1oIDw8IDMyIDw9IHJlbWgpID8gMHhmZmZmZmZmZiA6IHJlbWggLyBtaDsKKwlpZiAobWggPDwgMzIgPD0gcmVtaCkgeworCQl6IHw9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJZG9fZGl2KHJlbWgsIG1oKTsKKwkJeiB8PSByZW1oOworCX0KIAlyZXR1cm4gejsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jIGIvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jCmluZGV4IGZhMzA1M2UuLmI4MDFjZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYworKysgYi9hcmNoL2FybS92ZnAvdmZwZG91YmxlLmMKQEAgLTMyLDYgKzMyLDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS92ZnAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCmluZGV4IDNhZWVkZDIuLjIyZjNkYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYworKysgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IDA7CiAJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSA2OwogCi0JZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgY3VycmVudCk7CisJc2VuZF9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCBjdXJyZW50KTsKIH0KIAogc3RhdGljIHZvaWQgdmZwX3BhbmljKGNoYXIgKnJlYXNvbikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBzaW5nbGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBzaW5nbGUuYwppbmRleCA2ODQ5ZmUzLi4xNGRkNjk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwc2luZ2xlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcHNpbmdsZS5jCkBAIC0zMiw2ICszMiw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdmZwLmg+CiAKQEAgLTMwMyw3ICszMDUsMTEgQEAKIAkJaWYgKHogPD0gYSkKIAkJCXJldHVybiAoczMyKWEgPj4gMTsKIAl9Ci0JcmV0dXJuICh1MzIpKCgodTY0KWEgPDwgMzEpIC8geikgKyAoeiA+PiAxKTsKKwl7CisJCXU2NCB2ID0gKHU2NClhIDw8IDMxOworCQlkb19kaXYodiwgeik7CisJCXJldHVybiB2ICsgKHogPj4gMSk7CisJfQogfQogCiBzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZnNxcnQoaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQpAQCAtMTEwNyw3ICsxMTEzLDExIEBACiAJCXZzbi5zaWduaWZpY2FuZCA+Pj0gMTsKIAkJdnNkLmV4cG9uZW50Kys7CiAJfQotCXZzZC5zaWduaWZpY2FuZCA9ICgodTY0KXZzbi5zaWduaWZpY2FuZCA8PCAzMikgLyB2c20uc2lnbmlmaWNhbmQ7CisJeworCQl1NjQgc2lnbmlmaWNhbmQgPSAodTY0KXZzbi5zaWduaWZpY2FuZCA8PCAzMjsKKwkJZG9fZGl2KHNpZ25pZmljYW5kLCB2c20uc2lnbmlmaWNhbmQpOworCQl2c2Quc2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZDsKKwl9CiAJaWYgKCh2c2Quc2lnbmlmaWNhbmQgJiAweDNmKSA9PSAwKQogCQl2c2Quc2lnbmlmaWNhbmQgfD0gKCh1NjQpdnNtLnNpZ25pZmljYW5kICogdnNkLnNpZ25pZmljYW5kICE9ICh1NjQpdnNuLnNpZ25pZmljYW5kIDw8IDMyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9LY29uZmlnIGIvYXJjaC9hcm0yNi9LY29uZmlnCmluZGV4IGRjMGMxOTMuLjFmMDM3MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvS2NvbmZpZworKysgYi9hcmNoL2FybTI2L0tjb25maWcKQEAgLTE4Myw2ICsxODMsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wYXJwb3J0L0tjb25maWciCkBAIC0xOTMsNyArMTk1LDcgQEAKIAogc291cmNlICJkcml2ZXJzL21kL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pZGUvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL0tjb25maWcgYi9hcmNoL2NyaXMvS2NvbmZpZwppbmRleCBmODQ4ZTM3Li5lNTk3OWQ2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvS2NvbmZpZwpAQCAtMTIyLDYgKzEyMiw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogIyBicmluZyBpbiBFVFJBWCBidWlsdC1pbiBkcml2ZXJzCiBtZW51ICJEcml2ZXJzIGZvciBidWlsdC1pbiBpbnRlcmZhY2VzIgogc291cmNlIGFyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcKQEAgLTE0OSw3ICsxNTEsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvS2NvbmZpZyBiL2FyY2gvZnJ2L0tjb25maWcKaW5kZXggYzkzZjk1MS4uZWM4NWMwZCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvS2NvbmZpZworKysgYi9hcmNoL2Zydi9LY29uZmlnCkBAIC0zNDYsNiArMzQ2LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvZGVmY29uZmlnIGIvYXJjaC9mcnYvZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTRjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2Zydi9kZWZjb25maWcKQEAgLTAsMCArMSw2MjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMS44CisjIEZyaSBNYXkgMTMgMTc6MTY6MDMgMjAwNQorIworQ09ORklHX0ZSVj15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0hBUkRJUlFTIGlzIG5vdCBzZXQKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorIyBDT05GSUdfS09CSkVDVF9VRVZFTlQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgRnVqaXRzdSBGUi1WIHN5c3RlbSBzZXR1cAorIworQ09ORklHX01NVT15CitDT05GSUdfRlJWX09VVE9GTElORV9BVE9NSUNfT1BTPXkKK0NPTkZJR19ISUdITUVNPXkKK0NPTkZJR19ISUdIUFRFPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX0ZSVl9ERUZMX0NBQ0hFX1dCQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSVl9ERUZMX0NBQ0hFX1dCRUhJTkQgaXMgbm90IHNldAorQ09ORklHX0ZSVl9ERUZMX0NBQ0hFX1dUSFJVPXkKKyMgQ09ORklHX0ZSVl9ERUZMX0NBQ0hFX0RJU0FCTEVEIGlzIG5vdCBzZXQKKworIworIyBDUFUgY29yZSBzdXBwb3J0CisjCitDT05GSUdfQ1BVX0ZSNDUxPXkKK0NPTkZJR19DUFVfRlI0NTFfQ09NUElMRT15CitDT05GSUdfRlJWX0wxX0NBQ0hFX1NISUZUPTUKK0NPTkZJR19NQjkzMDkxX1ZESz15CisjIENPTkZJR19NQjkzMDkzX1BESyBpcyBub3Qgc2V0CitDT05GSUdfTUI5MzA5MF9NQjAwPXkKKyMgQ09ORklHX01COTMwOTFfTk9fTUIgaXMgbm90IHNldAorIyBDT05GSUdfR1BSRUxfREFUQV84IGlzIG5vdCBzZXQKK0NPTkZJR19HUFJFTF9EQVRBXzQ9eQorIyBDT05GSUdfR1BSRUxfREFUQV9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9OQU1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZvcm1hdHMKKyMKKyMgQ09ORklHX0JJTkZNVF9FTEYgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEZfRkRQSUM9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JLX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfS0dEQk9FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9SWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CitDT05GSUdfTkUyS19QQ0k9eQorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTEKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CisjIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVI0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfR0RCU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMKaW5kZXggMjQ2MjJkOC4uYWY5ODFiZCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jCkBAIC02MCw3ICs2MCw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3ZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogfQogCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL0tjb25maWcgYi9hcmNoL2g4MzAwL0tjb25maWcKaW5kZXggNjJhODllOC4uMjY2OThhNCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnCisrKyBiL2FyY2gvaDgzMDAvS2NvbmZpZwpAQCAtNTUsNiArNTUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9tdGQvS2NvbmZpZyIKQEAgLTY1LDcgKzY3LDcgQEAKIAogc291cmNlICJhcmNoL2g4MzAwL0tjb25maWcuaWRlIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiAjCiAjIGlucHV0IC0gaW5wdXQvam95c3RpY2sgZGVwZW5kcyBvbiBpdC4gQXMgZG9lcyBVU0IuCkBAIC0xNzksNiArMTgxLDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3VzYi9LY29uZmlnIgogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvS2NvbmZpZyBiL2FyY2gvaTM4Ni9LY29uZmlnCmluZGV4IDZjMDIzMzYuLmE4MDFkOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9LY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnCkBAIC0xMjg1LDYgKzEyODUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCA0YTE3OTU2Li42ODM1ZjZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jCisrKyBiL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMKQEAgLTcwLDcgKzcwLDggQEAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKIHsKLQl1bnNpZ25lZCBpbnQgaSwgYywgc3osIHNldHVwX3NlY3RvcnM7CisJdW5zaWduZWQgaW50IGksIHN6LCBzZXR1cF9zZWN0b3JzOworCWludCBjOwogCXUzMiBzeXNfc2l6ZTsKIAlieXRlIG1ham9yX3Jvb3QsIG1pbm9yX3Jvb3Q7CiAJc3RydWN0IHN0YXQgc2I7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggZWU3NWNiMi4uNWUyOTFhMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMiwzICsyLDcgQEAKIG9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gZWFybHlxdWlyay5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXAubwogCitpZm5lcSAoJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpLCkKK29iai15CQkJCSs9IGNzdGF0ZS5vCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCA5ZjYzYWUwLi5iNzgwOGE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTE1OSw5ICsxNTksMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRwotc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCisvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KK3N0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpwY2lfbW1jZmdfY29uZmlnOworaW50IHBjaV9tbWNmZ19jb25maWdfbnVtOworCitpbnQgX19pbml0IGFjcGlfcGFyc2VfbWNmZyh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKm1jZmc7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBjb25maWdfc2l6ZTsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3MiwxOCArMTc4LDM4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChtY2ZnLT5iYXNlX3Jlc2VydmVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1NQ09ORklHIG5vdCBpbiBsb3cgNEdCIG9mIG1lbW9yeVxuIik7CisJLyogaG93IG1hbnkgY29uZmlnIHN0cnVjdHVyZXMgZG8gd2UgaGF2ZSAqLworCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKKwlpID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnKTsKKwl3aGlsZSAoaSA+PSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcpKSB7CisJCSsrcGNpX21tY2ZnX2NvbmZpZ19udW07CisJCWkgLT0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnKTsKKwl9OworCWlmIChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1NQ09ORklHIGhhcyBubyBlbnRyaWVzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcGNpX21tY2ZnX2Jhc2VfYWRkciA9IG1jZmctPmJhc2VfYWRkcmVzczsKKwljb25maWdfc2l6ZSA9IHBjaV9tbWNmZ19jb25maWdfbnVtICogc2l6ZW9mKCpwY2lfbW1jZmdfY29uZmlnKTsKKwlwY2lfbW1jZmdfY29uZmlnID0ga21hbGxvYyhjb25maWdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2lfbW1jZmdfY29uZmlnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiTm8gbWVtb3J5IGZvciBNQ0ZHIGNvbmZpZyB0YWJsZXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkocGNpX21tY2ZnX2NvbmZpZywgJm1jZmctPmNvbmZpZywgY29uZmlnX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CisJCWlmIChtY2ZnLT5jb25maWdbaV0uYmFzZV9yZXNlcnZlZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CiAKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lCWFjcGlfcGFyc2VfbWNmZyBOVUxMCi0jZW5kaWYgLyogIUNPTkZJR19QQ0lfTU1DT05GSUcgKi8KKyNlbmRpZiAvKiBDT05GSUdfUENJX01NQ09ORklHICovCiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIHN0YXRpYyBpbnQgX19pbml0CkBAIC01MDcsNiArNTMzLDIyIEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCitpbnQKK2FjcGlfcmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTY0IHBoeXNfYWRkciwgdTMyIGdzaV9iYXNlKQoreworCS8qIFRCRCAqLworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChhY3BpX3JlZ2lzdGVyX2lvYXBpYyk7CisKK2ludAorYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKK3sKKwkvKiBUQkQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyk7CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAogYWNwaV9zY2FuX3JzZHAgKAogCXVuc2lnbmVkIGxvbmcJCXN0YXJ0LApAQCAtMTEyMyw3ICsxMTY1LDYgQEAKIAlhY3BpX3Byb2Nlc3NfbWFkdCgpOwogCiAJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIGFjcGlfcGFyc2VfaHBldCk7Ci0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMwMzZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEludGVsIENvcnBvcmF0aW9uCisgKiAJVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+CisgKiAJLSBBZGRlZCBfUERDIGZvciBTTVAgQy1zdGF0ZXMgb24gSW50ZWwgQ1BVcworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorCitzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2ludGVsX3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIKKwkJCQkJCSpwb3cpCit7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJdTMyICpidWY7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwZGMuIEl0IHdpbGwgYmUgdXNlZCBsYXRlci4gKi8KKwlvYmpfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX29iamVjdF9saXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmpfbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW9iaiA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCWtmcmVlKG9ial9saXN0KTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IGttYWxsb2MoMTIsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlrZnJlZShvYmopOworCQlrZnJlZShvYmpfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwlidWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKKwlidWZbMV0gPSAxOworCWJ1ZlsyXSA9IEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVA7CisKKwlvYmotPnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCW9iai0+YnVmZmVyLmxlbmd0aCA9IDEyOworCW9iai0+YnVmZmVyLnBvaW50ZXIgPSAodTggKikgYnVmOworCW9ial9saXN0LT5jb3VudCA9IDE7CisJb2JqX2xpc3QtPnBvaW50ZXIgPSBvYmo7CisJcG93LT5wZGMgPSBvYmpfbGlzdDsKKworCXJldHVybjsKK30KKworLyogSW5pdGlhbGl6ZSBfUERDIGRhdGEgYmFzZWQgb24gdGhlIENQVSB2ZW5kb3IgKi8KK3ZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csCisJCQkJICAgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKworCXBvdy0+cGRjID0gTlVMTDsKKwlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKQorCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2ludGVsX3BkYyhwb3cpOworCisJcmV0dXJuOworfQorCitFWFBPUlRfU1lNQk9MKGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKTsKKworLyoKKyAqIEluaXRpYWxpemUgYm1fZmxhZ3MgYmFzZWQgb24gdGhlIENQVSBjYWNoZSBwcm9wZXJ0aWVzCisgKiBPbiBTTVAgaXQgZGVwZW5kcyBvbiBjYWNoZSBjb25maWd1cmF0aW9uCisgKiAtIFdoZW4gY2FjaGUgaXMgbm90IHNoYXJlZCBhbW9uZyBhbGwgQ1BVcywgd2UgZmx1c2ggY2FjaGUKKyAqICAgYmVmb3JlIGVudGVyaW5nIEMzLgorICogLSBXaGVuIGNhY2hlIGlzIHNoYXJlZCBhbW9uZyBhbGwgQ1BVcywgd2UgdXNlIGJtX2NoZWNrCisgKiAgIG1lY2hhbmlzbSBhcyBpbiBVUCBjYXNlCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IGFmdGVyIGFsbCB0aGUgQ1BVcyBhcmUgb25saW5lCisgKi8KK3ZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjayhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZmxhZ3MgKmZsYWdzLAorCQkJCQl1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgY3B1OworCisJZmxhZ3MtPmJtX2NoZWNrID0gMDsKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKKwkJZmxhZ3MtPmJtX2NoZWNrID0gMTsKKwllbHNlIGlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHsKKwkJLyoKKwkJICogVG9kYXkgYWxsIENQVXMgdGhhdCBzdXBwb3J0IEMzIHNoYXJlIGNhY2hlLgorCQkgKiBUQkQ6IFRoaXMgbmVlZHMgdG8gbG9vayBhdCBjYWNoZSBzaGFyZWQgbWFwLCBvbmNlCisJCSAqIG11bHRpLWNvcmUgZGV0ZWN0aW9uIHBhdGNoIG1ha2VzIHRvIHRoZSBiYXNlLgorCQkgKi8KKwkJZmxhZ3MtPmJtX2NoZWNrID0gMTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjayk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMKaW5kZXggMzlkMzI0OC4uNDRkODg2YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtNzQsOCArNzQsOSBAQAogCW1vdncJJWF4LCVmcwogCW1vdncJJDB4MGUwMCArICdpJywgJWZzOigweDEyKQogCQotCSMgbmVlZCBhIGdkdAotCWxnZHQJcmVhbF9zYXZlX2dkdCAtIHdha2V1cF9jb2RlCisJIyBuZWVkIGEgZ2R0IC0tIHVzZSBsZ2R0bCB0byBmb3JjZSAzMi1iaXQgb3BlcmFuZHMsIGluIGNhc2UKKwkjIHRoZSBHRFQgaXMgbG9jYXRlZCBwYXN0IDE2IG1lZ2FieXRlcy4KKwlsZ2R0bAlyZWFsX3NhdmVfZ2R0IC0gd2FrZXVwX2NvZGUKIAogCW1vdmwJcmVhbF9zYXZlX2NyMCAtIHdha2V1cF9jb2RlLCAlZWF4CiAJbW92bAklZWF4LCAlY3IwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCmluZGV4IDkzZGY5MGIuLmJkMWRiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KIApAQCAtODc5LDcgKzg4MCw2IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCiB7Ci0JZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdW5zaWduZWQgaW50IGNvdW50OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggZDQ4Y2U5Mi4uMDY0MjExZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMjgsMTAgKzIyOCwxMCBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKICNpbmNsdWRlICJpb19wb3J0cy5oIgogCi1leHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIApAQCAtMTE2OCw4ICsxMTY4LDcgQEAKIHN0YXRpYyB2b2lkIHJlaW5pdF90aW1lcih2b2lkKQogewogI2lmZGVmIElOSVRfVElNRVJfQUZURVJfU1VTUEVORAotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKIAkvKiBzZXQgdGhlIGNsb2NrIHRvIDEwMCBIeiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCAyMjAzYTlkLi40NTUzZmZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtNDM1LDYgKzQzNSwxMSBAQAogCWlmIChjID09ICZib290X2NwdV9kYXRhKQogCQlzeXNlbnRlcl9zZXR1cCgpOwogCWVuYWJsZV9zZXBfY3B1KCk7CisKKwlpZiAoYyA9PSAmYm9vdF9jcHVfZGF0YSkKKwkJbXRycl9icF9pbml0KCk7CisJZWxzZQorCQltdHJyX2FwX2luaXQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfSFQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKaW5kZXggMWE0OWFkYi4uZTg2ZWE0OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiAJLyogZGV0ZWN0IHdoaWNoIGNvbXBhbmlvbiBjaGlwIGlzIHVzZWQgKi8KIAl3aGlsZSAoKGd4X3BjaSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGd4X3BjaSkpICE9IE5VTEwpIHsKLQkJaWYgKChwY2lfbWF0Y2hfZGV2aWNlIChneF9jaGlwc2V0X3RibCwgZ3hfcGNpKSkgIT0gTlVMTCkgeworCQlpZiAoKHBjaV9tYXRjaF9pZChneF9jaGlwc2V0X3RibCwgZ3hfcGNpKSkgIT0gTlVMTCkgewogCQkJcmV0dXJuIGd4X3BjaTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCmluZGV4IDdkY2JmNzAuLjMyN2E1NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKIAlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwogCWFyZzBfYnVmWzFdID0gMTsKLQlhcmcwX2J1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCB8IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX01TUjsKKwlhcmcwX2J1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUF9NU1I7CiAKIAlwLnBkYyA9ICZhcmdfbGlzdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKaW5kZXggOTZhNzVkMC4uYTJjMzNjMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0yNSw3ICsyNSw3IEBACiAvKgogICogQWxpZ25tZW50IGF0IHdoaWNoIG1vdnNsIGlzIHByZWZlcnJlZCBmb3IgYnVsayBtZW1vcnkgY29waWVzLgogICovCi1zdHJ1Y3QgbW92c2xfbWFzayBtb3ZzbF9tYXNrOworc3RydWN0IG1vdnNsX21hc2sgbW92c2xfbWFzayBfX3JlYWRfbW9zdGx5OwogI2VuZGlmCiAKIHZvaWQgX19kZXZpbml0IGVhcmx5X2ludGVsX3dvcmthcm91bmQoc3RydWN0IGNwdWluZm9feDg2ICpjKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwppbmRleCA2NGQ5MWY3Li4xNjlhYzhlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtNjcsMTMgKzY3LDYgQEAKIAltdHJyX3N0YXRlLmVuYWJsZWQgPSAobG8gJiAweGMwMCkgPj4gMTA7CiB9CiAKLS8qICBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJ1Y3QgbXRycl9zdGF0ZSAgKi8KLXZvaWQgX19pbml0IGZpbmFsaXplX210cnJfc3RhdGUodm9pZCkKLXsKLQlrZnJlZShtdHJyX3N0YXRlLnZhcl9yYW5nZXMpOwotCW10cnJfc3RhdGUudmFyX3JhbmdlcyA9IE5VTEw7Ci19Ci0KIC8qICBTb21lIEJJT1MncyBhcmUgZnVja2VkIGFuZCBkb24ndCBzZXQgYWxsIE1UUlJzIHRoZSBzYW1lISAgKi8KIHZvaWQgX19pbml0IG10cnJfc3RhdGVfd2Fybih2b2lkKQogewpAQCAtMzM0LDYgKzMyNyw5IEBACiAqLwogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cjsKKworCXZyID0gJm10cnJfc3RhdGUudmFyX3Jhbmdlc1tyZWddOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXByZXBhcmVfc2V0KCk7CkBAIC0zNDIsMTEgKzMzOCwxNSBAQAogCQkvKiBUaGUgaW52YWxpZCBiaXQgaXMga2VwdCBpbiB0aGUgbWFzaywgc28gd2Ugc2ltcGx5IGNsZWFyIHRoZQogCQkgICByZWxldmFudCBtYXNrIHJlZ2lzdGVyIHRvIGRpc2FibGUgYSByYW5nZS4gKi8KIAkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKHJlZyksIDAsIDApOworCQltZW1zZXQodnIsIDAsIHNpemVvZihzdHJ1Y3QgbXRycl92YXJfcmFuZ2UpKTsKIAl9IGVsc2UgewotCQltdHJyX3dybXNyKE1UUlJwaHlzQmFzZV9NU1IocmVnKSwgYmFzZSA8PCBQQUdFX1NISUZUIHwgdHlwZSwKLQkJICAgICAgKGJhc2UgJiBzaXplX2FuZF9tYXNrKSA+PiAoMzIgLSBQQUdFX1NISUZUKSk7Ci0JCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHg4MDAsCi0JCSAgICAgICgtc2l6ZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKKwkJdnItPmJhc2VfbG8gPSBiYXNlIDw8IFBBR0VfU0hJRlQgfCB0eXBlOworCQl2ci0+YmFzZV9oaSA9IChiYXNlICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCk7CisJCXZyLT5tYXNrX2xvID0gLXNpemUgPDwgUEFHRV9TSElGVCB8IDB4ODAwOworCQl2ci0+bWFza19oaSA9ICgtc2l6ZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpOworCisJCW10cnJfd3Jtc3IoTVRSUnBoeXNCYXNlX01TUihyZWcpLCB2ci0+YmFzZV9sbywgdnItPmJhc2VfaGkpOworCQltdHJyX3dybXNyKE1UUlJwaHlzTWFza19NU1IocmVnKSwgdnItPm1hc2tfbG8sIHZyLT5tYXNrX2hpKTsKIAl9CiAKIAlwb3N0X3NldCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwppbmRleCBkNjZiMDllLi43NjRjYWM2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtMzMyLDYgKzMzMiw4IEBACiAKIAllcnJvciA9IC1FSU5WQUw7CiAKKwkvKiBObyBDUFUgaG90cGx1ZyB3aGVuIHdlIGNoYW5nZSBNVFJSIGVudHJpZXMgKi8KKwlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJLyogIFNlYXJjaCBmb3IgZXhpc3RpbmcgTVRSUiAgKi8KIAlkb3duKCZtYWluX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgKytpKSB7CkBAIC0zNzIsNiArMzc0LDcgQEAKIAllcnJvciA9IGk7CiAgb3V0OgogCXVwKCZtYWluX2xvY2spOworCXVubG9ja19jcHVfaG90cGx1ZygpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDYxLDYgKzQ2NCw4IEBACiAJCXJldHVybiAtRU5YSU87CiAKIAltYXggPSBudW1fdmFyX3JhbmdlczsKKwkvKiBObyBDUFUgaG90cGx1ZyB3aGVuIHdlIGNoYW5nZSBNVFJSIGVudHJpZXMgKi8KKwlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJZG93bigmbWFpbl9sb2NrKTsKIAlpZiAocmVnIDwgMCkgewogCQkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLwpAQCAtNTAxLDYgKzUwNiw3IEBACiAJZXJyb3IgPSByZWc7CiAgb3V0OgogCXVwKCZtYWluX2xvY2spOworCXVubG9ja19jcHVfaG90cGx1ZygpOwogCXJldHVybiBlcnJvcjsKIH0KIC8qKgpAQCAtNTQ0LDIxICs1NTAsOSBAQAogCWNlbnRhdXJfaW5pdF9tdHJyKCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X290aGVyX2NwdXModm9pZCkKLXsKLQlpZiAodXNlX2ludGVsKCkpCi0JCWdldF9tdHJyX3N0YXRlKCk7Ci0KLQkvKiBicmluZyB1cCB0aGUgb3RoZXIgcHJvY2Vzc29ycyAqLwotCXNldF9tdHJyKH4wVSwwLDAsMCk7Ci0KLQlpZiAodXNlX2ludGVsKCkpIHsKLQkJZmluYWxpemVfbXRycl9zdGF0ZSgpOwotCQltdHJyX3N0YXRlX3dhcm4oKTsKLQl9Ci19Ci0KLQorLyogVGhlIHN1c3BlbmQvcmVzdW1lIG1ldGhvZHMgYXJlIG9ubHkgZm9yIENQVSB3aXRob3V0IE1UUlIuIENQVSB1c2luZyBnZW5lcmljCisgKiBNVFJSIGRyaXZlciBkb2Vzbid0IHJlcXVpcmUgdGhpcworICovCiBzdHJ1Y3QgbXRycl92YWx1ZSB7CiAJbXRycl90eXBlCWx0eXBlOwogCXVuc2lnbmVkIGxvbmcJbGJhc2U7CkBAIC02MTEsMTMgKzYwNSwxMyBAQAogCiAKIC8qKgotICogbXRycl9pbml0IC0gaW5pdGlhbGl6ZSBtdHJycyBvbiB0aGUgYm9vdCBDUFUKKyAqIG10cnJfYnBfaW5pdCAtIGluaXRpYWxpemUgbXRycnMgb24gdGhlIGJvb3QgQ1BVCiAgKgogICogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZWFybHk7IGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIENQVXMgYXJlIAogICogaW5pdGlhbGl6ZWQgKGkuZS4gYmVmb3JlIHNtcF9pbml0KCkpLgogICogCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IG10cnJfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgbXRycl9icF9pbml0KHZvaWQpCiB7CiAJaW5pdF9pZnMoKTsKIApAQCAtNjc0LDEyICs2NjgsNDggQEAKIAlpZiAobXRycl9pZikgewogCQlzZXRfbnVtX3Zhcl9yYW5nZXMoKTsKIAkJaW5pdF90YWJsZSgpOwotCQlpbml0X290aGVyX2NwdXMoKTsKLQotCQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywKLQkJCQkJICAgICAgJm10cnJfc3lzZGV2X2RyaXZlcik7CisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCWdldF9tdHJyX3N0YXRlKCk7CiAJfQotCXJldHVybiAtRU5YSU87CiB9CiAKLXN1YnN5c19pbml0Y2FsbChtdHJyX2luaXQpOwordm9pZCBtdHJyX2FwX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtdHJyX2lmIHx8ICF1c2VfaW50ZWwoKSkKKwkJcmV0dXJuOworCS8qCisJICogSWRlYWxseSB3ZSBzaG91bGQgaG9sZCBtYWluX2xvY2sgaGVyZSB0byBhdm9pZCBtdHJyIGVudHJpZXMgY2hhbmdlZCwKKwkgKiBidXQgdGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIGluIGNwdSBib290IHRpbWUsIGhvbGRpbmcgdGhlIGxvY2sKKwkgKiBicmVha3MgaXQuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaW4gdHdvIGNhc2VzOiAxLnZlcnkgZWFyaWx5IHRpbWUKKwkgKiBvZiBzb2Z0d2FyZSByZXN1bWUsIHdoZW4gdGhlcmUgYWJzb2x1dGVseSBpc24ndCBtdHJyIGVudHJ5IGNoYW5nZXM7CisJICogMi5jcHUgaG90YWRkIHRpbWUuIFdlIGxldCBtdHJyX2FkZC9kZWxfcGFnZSBob2xkIGNwdWhvdHBsdWcgbG9jayB0bworCSAqIHByZXZlbnQgbXRyciBlbnRyeSBjaGFuZ2VzCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJbXRycl9pZi0+c2V0X2FsbCgpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtdHJyX2luaXRfZmluaWFsaXplKHZvaWQpCit7CisJaWYgKCFtdHJyX2lmKQorCQlyZXR1cm4gMDsKKwlpZiAodXNlX2ludGVsKCkpCisJCW10cnJfc3RhdGVfd2FybigpOworCWVsc2UgeworCQkvKiBUaGUgQ1BVcyBoYXZlbid0IE1UUlIgYW5kIHNlZW1lcyBub3Qgc3VwcG9ydCBTTVAuIFRoZXkgaGF2ZQorCQkgKiBzcGVjaWZpYyBkcml2ZXJzLCB3ZSB1c2UgYSB0cmlja3kgbWV0aG9kIHRvIHN1cHBvcnQKKwkJICogc3VzcGVuZC9yZXN1bWUgZm9yIHRoZW0uCisJCSAqIFRCRDogaXMgdGhlcmUgYW55IHN5c3RlbSB3aXRoIHN1Y2ggQ1BVIHdoaWNoIHN1cHBvcnRzCisJCSAqIHN1c3BlbmQvcmVzdW1lPyAgaWYgbm8sIHdlIHNob3VsZCByZW1vdmUgdGhlIGNvZGUuCisJCSAqLworCQlzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLAorCQkJJm10cnJfc3lzZGV2X2RyaXZlcik7CisJfQorCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKG10cnJfaW5pdF9maW5pYWxpemUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAppbmRleCBkZTEzNTEyLi45OWM5ZjI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApAQCAtOTEsNyArOTEsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV92YXJfcmFuZ2VzOwogCi12b2lkIGZpbmFsaXplX210cnJfc3RhdGUodm9pZCk7CiB2b2lkIG10cnJfc3RhdGVfd2Fybih2b2lkKTsKIGNoYXIgKm10cnJfYXR0cmliX3RvX3N0cihpbnQgeCk7CiB2b2lkIG10cnJfd3Jtc3IodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2kzODcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCmluZGV4IGI4MTcxNjguLmQ3NTUyNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCkBAIC04MiwxNyArODIsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2ZwdV9iZWdpbik7CiAKLXZvaWQgcmVzdG9yZV9mcHUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKLXsKLQlpZiAoIGNwdV9oYXNfZnhzciApIHsKLQkJYXNtIHZvbGF0aWxlKCAiZnhyc3RvciAlMCIKLQkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnhzYXZlKSApOwotCX0gZWxzZSB7Ci0JCWFzbSB2b2xhdGlsZSggImZyc3RvciAlMCIKLQkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnNhdmUpICk7Ci0JfQotfQotCiAvKgogICogRlBVIHRhZyB3b3JkIGNvbnZlcnNpb25zLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDM1ZWI4ZTIuLjY1NzhmNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KIApAQCAtMTU2Niw3ICsxNTY3LDYgQEAKIAogdm9pZCAvKl9faW5pdCovIHByaW50X1BJQyh2b2lkKQogewotCWV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOwogCXVuc2lnbmVkIGludCB2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMzc2MmY2Yi4uYTZkOGM0NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTEyNyw0OCArMTI3LDIzIEBACiAJCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSZwLT5haW5zbi5pbnNuOwogfQogCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgICphcmNoX2dldF9rcHJvYmVfdGFzayh2b2lkICpwdHIpCi17Ci0JcmV0dXJuICgoc3RydWN0IHRocmVhZF9pbmZvICopICgoKHVuc2lnbmVkIGxvbmcpIHB0cikgJgotCQkJCQkofihUSFJFQURfU0laRSAtMSkpKSktPnRhc2s7Ci19Ci0KIHZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyAqc2FyYSA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKLQlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKLQlzdGF0aWMgdm9pZCAqb3JpZ19yZXRfYWRkcjsKKyAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CiAKLQkvKgotCSAqIFNhdmUgdGhlIHJldHVybiBhZGRyZXNzIHdoZW4gdGhlIHJldHVybiBwcm9iZSBoaXRzCi0JICogdGhlIGZpcnN0IHRpbWUsIGFuZCB1c2UgaXQgdG8gcG9wdWxhdGUgdGhlIChrcnByb2JlCi0JICogaW5zdGFuY2UpLT5yZXRfYWRkciBmb3Igc3Vic2VxdWVudCByZXR1cm4gcHJvYmVzIGF0Ci0JICogdGhlIHNhbWUgYWRkcnJlc3Mgc2luY2Ugc3RhY2sgYWRkcmVzcyB3b3VsZCBoYXZlCi0JICogdGhlIGtyZXRwcm9iZV90cmFtcG9saW5lIGJ5IHRoZW4uCi0JICovCi0JaWYgKCgodm9pZCopICpzYXJhKSAhPSBrcmV0cHJvYmVfdHJhbXBvbGluZSkKLQkJb3JpZ19yZXRfYWRkciA9ICh2b2lkKikgKnNhcmE7CisgICAgICAgIGlmICgocmkgPSBnZXRfZnJlZV9ycF9pbnN0KHJwKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJpLT5ycCA9IHJwOworICAgICAgICAgICAgICAgIHJpLT50YXNrID0gY3VycmVudDsKKwkJcmktPnJldF9hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSAqc2FyYTsKIAotCWlmICgocmkgPSBnZXRfZnJlZV9ycF9pbnN0KHJwKSkgIT0gTlVMTCkgewotCQlyaS0+cnAgPSBycDsKLQkJcmktPnN0YWNrX2FkZHIgPSBzYXJhOwotCQlyaS0+cmV0X2FkZHIgPSBvcmlnX3JldF9hZGRyOwotCQlhZGRfcnBfaW5zdChyaSk7CiAJCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyIHdpdGggdHJhbXBvbGluZSBhZGRyICovCiAJCSpzYXJhID0gKHVuc2lnbmVkIGxvbmcpICZrcmV0cHJvYmVfdHJhbXBvbGluZTsKLQl9IGVsc2UgewotCQlycC0+bm1pc3NlZCsrOwotCX0KLX0KIAotdm9pZCBhcmNoX2twcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspCi17Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jd2hpbGUgKChyaSA9IGdldF9ycF9pbnN0X3Rzayh0aykpICE9IE5VTEwpIHsKLQkJKigodW5zaWduZWQgbG9uZyAqKShyaS0+c3RhY2tfYWRkcikpID0KLQkJCQkJKHVuc2lnbmVkIGxvbmcpIHJpLT5yZXRfYWRkcjsKLQkJcmVjeWNsZV9ycF9pbnN0KHJpKTsKLQl9CisgICAgICAgICAgICAgICAgYWRkX3JwX2luc3QocmkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJwLT5ubWlzc2VkKys7CisgICAgICAgIH0KIH0KIAogLyoKQEAgLTI4NiwzNiArMjYxLDU5IEBACiAgKi8KIGludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKSAmcmVncy0+ZXNwKSAtIDE7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisgICAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSh1bnNpZ25lZCBsb25nKSZrcmV0cHJvYmVfdHJhbXBvbGluZTsKIAotCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHNhcmEpOwotCWhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHRzayk7CisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmksIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCWlmIChyaS0+c3RhY2tfYWRkciA9PSBzYXJhICYmIHJpLT5ycCkgewotCQkJaWYgKHJpLT5ycC0+aGFuZGxlcikKLQkJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQorCS8qCisJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KKwkgKgorCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgorCSAqICAgICAtIGluc3RhbmNlcyBhcmUgYWx3YXlzIGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisJICogICAgIC0gd2hlbiBtdWx0aXBsZSByZXR1cm4gcHJvYmVzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZQorICAgICAgICAgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLXZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCS8qIFJBIGFscmVhZHkgcG9wcGVkICovCi0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKSZyZWdzLT5lc3ApIC0gMTsKKwkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpCisJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwogCi0Jd2hpbGUgKChyaSA9IGdldF9ycF9pbnN0KHNhcmEpKSkgewotCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CisJCW9yaWdfcmV0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CiAJCXJlY3ljbGVfcnBfaW5zdChyaSk7CisKKwkJaWYgKG9yaWdfcmV0X2FkZHJlc3MgIT0gdHJhbXBvbGluZV9hZGRyZXNzKQorCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgcmV0dXJuIGFkZHJlc3MuIEFueSBvdGhlcgorCQkJICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sgYXJlIGZvcgorCQkJICogb3RoZXIgY2FsbHMgZGVlcGVyIG9uIHRoZSBjYWxsIHN0YWNrCisJCQkgKi8KKwkJCWJyZWFrOwogCX0KLQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisKKwlCVUdfT04oIW9yaWdfcmV0X2FkZHJlc3MgfHwgKG9yaWdfcmV0X2FkZHJlc3MgPT0gdHJhbXBvbGluZV9hZGRyZXNzKSk7CisJcmVncy0+ZWlwID0gb3JpZ19yZXRfYWRkcmVzczsKKworCXVubG9ja19rcHJvYmVzKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlLCB3ZSBhcmUgdGVsbGluZworICAgICAgICAgKiBrcHJvYmVfaGFuZGxlcigpIHRoYXQgd2UgaGF2ZSBoYW5kbGVkIHVubG9ja2luZworICAgICAgICAgKiBhbmQgcmUtZW5hYmxpbmcgcHJlZW1wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOwogfQogCiAvKgpAQCAtNDAzLDggKzQwMSw3IEBACiAJCWN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIDApOwogCX0KIAotCWlmIChjdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyICE9IHRyYW1wb2xpbmVfcG9zdF9oYW5kbGVyKQotCQlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKIAlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX3NhdmVkX2VmbGFnczsKIAogCS8qUmVzdG9yZSBiYWNrIHRoZSBvcmlnaW5hbCBzYXZlZCBrcHJvYmVzIHZhcmlhYmxlcyBhbmQgY29udGludWUuICovCkBAIC01MzQsMyArNTMxLDEzIEBACiAJfQogCXJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSB0cmFtcG9saW5lX3AgPSB7CisJLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopICZrcmV0cHJvYmVfdHJhbXBvbGluZSwKKwkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKK307CisKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCA1ZjhjZmE2Li5kOTQ5MjA1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNjE3LDYgKzYxNywzMyBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIHRoZSBjb250ZXh0IHN3aXRjaCBmcm9tIHByZXYgdG8gbmV4dAorICogaGFzIHRvIHR3ZWFrIHRoZSBUU0MgZGlzYWJsZSBiaXQgaW4gdGhlIGNyNC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfdHNjKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLAorCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqcHJldiwgKm5leHQ7CisKKwkvKgorCSAqIGdjYyBzaG91bGQgZWxpbWluYXRlIHRoZSAtPnRocmVhZF9pbmZvIGRlcmVmZXJlbmNlIGlmCisJICogaGFzX3NlY3VyZV9jb21wdXRpbmcgcmV0dXJucyAwIGF0IGNvbXBpbGUgdGltZSAoU0VDQ09NUD1uKS4KKwkgKi8KKwlwcmV2ID0gcHJldl9wLT50aHJlYWRfaW5mbzsKKwluZXh0ID0gbmV4dF9wLT50aHJlYWRfaW5mbzsKKworCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSB8fCBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgeworCQkvKiBzbG93IHBhdGggaGVyZSAqLworCQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKKwkJICAgICFoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgeworCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOworCQl9IGVsc2UgaWYgKCFoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgorCQkJICAgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpCisJCQl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IFg4Nl9DUjRfVFNEKTsKKwl9Cit9CisKKy8qCiAgKglzd2l0Y2hfdG8oeCx5bikgc2hvdWxkIHN3aXRjaCB0YXNrcyBmcm9tIHggdG8geS4KICAqCiAgKiBXZSBmc2F2ZS9md2FpdCBzbyB0aGF0IGFuIGV4Y2VwdGlvbiBnb2VzIG9mZiBhdCB0aGUgcmlnaHQgdGltZQpAQCAtNjczLDI4ICs3MDAsMzQgQEAKIAogCS8qCiAJICogUmVzdG9yZSAlZnMgYW5kICVncyBpZiBuZWVkZWQuCisJICoKKwkgKiBHbGliYyBub3JtYWxseSBtYWtlcyAlZnMgYmUgemVybywgYW5kICVncyBpcyBvbmUgb2YKKwkgKiB0aGUgVExTIHNlZ21lbnRzLgogCSAqLwotCWlmICh1bmxpa2VseShwcmV2LT5mcyB8IHByZXYtPmdzIHwgbmV4dC0+ZnMgfCBuZXh0LT5ncykpIHsKKwlpZiAodW5saWtlbHkocHJldi0+ZnMgfCBuZXh0LT5mcykpCiAJCWxvYWRzZWdtZW50KGZzLCBuZXh0LT5mcyk7CisKKwlpZiAocHJldi0+Z3MgfCBuZXh0LT5ncykKIAkJbG9hZHNlZ21lbnQoZ3MsIG5leHQtPmdzKTsKLQl9CiAKIAkvKgogCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycwogCSAqLwogCWlmICh1bmxpa2VseShuZXh0LT5kZWJ1Z3JlZ1s3XSkpIHsKLQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1swXSwgMCk7Ci0JCXNldF9kZWJ1Z3JlZyhjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbMV0sIDEpOwotCQlzZXRfZGVidWdyZWcoY3VycmVudC0+dGhyZWFkLmRlYnVncmVnWzJdLCAyKTsKLQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1szXSwgMyk7CisJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1swXSwgMCk7CisJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1sxXSwgMSk7CisJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1syXSwgMik7CisJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1szXSwgMyk7CiAJCS8qIG5vIDQgYW5kIDUgKi8KLQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1s2XSwgNik7Ci0JCXNldF9kZWJ1Z3JlZyhjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10sIDcpOworCQlzZXRfZGVidWdyZWcobmV4dC0+ZGVidWdyZWdbNl0sIDYpOworCQlzZXRfZGVidWdyZWcobmV4dC0+ZGVidWdyZWdbN10sIDcpOwogCX0KIAogCWlmICh1bmxpa2VseShwcmV2LT5pb19iaXRtYXBfcHRyIHx8IG5leHQtPmlvX2JpdG1hcF9wdHIpKQogCQloYW5kbGVfaW9fYml0bWFwKG5leHQsIHRzcyk7CiAKKwlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CisKIAlyZXR1cm4gcHJldl9wOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKaW5kZXggNzMwNjM1My4uYWY0ZGU1OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtMTQxNCw3ICsxNDE0LDcgQEAKICAgIFRoaXMgcnVucyBiZWZvcmUgU01QIGlzIGluaXRpYWxpemVkIHRvIGF2b2lkIFNNUCBwcm9ibGVtcyB3aXRoCiAgICBzZWxmIG1vZGlmeWluZyBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdCBhc3N5bWV0cmljIHN5c3RlbXMgd2hlcmUKICAgIEFQcyBoYXZlIGxlc3MgY2FwYWJpbGl0aWVzIHRoYW4gdGhlIGJvb3QgcHJvY2Vzc29yIGFyZSBub3QgaGFuZGxlZC4gCi0gICBJbiB0aGlzIGNhc2UgYm9vdCB3aXRoICJub3JlcGxhY2VtZW50Ii4gKi8gCisgICBUb3VnaC4gTWFrZSBzdXJlIHlvdSBkaXNhYmxlIHN1Y2ggZmVhdHVyZXMgYnkgaGFuZC4gKi8gCiB2b2lkIGFwcGx5X2FsdGVybmF0aXZlcyh2b2lkICpzdGFydCwgdm9pZCAqZW5kKSAKIHsgCiAJc3RydWN0IGFsdF9pbnN0ciAqYTsgCkBAIC0xNDQyLDI0ICsxNDQyLDEyIEBACiAJfQogfSAKIAotc3RhdGljIGludCBub19yZXBsYWNlbWVudCBfX2luaXRkYXRhID0gMDsgCi0gCiB2b2lkIF9faW5pdCBhbHRlcm5hdGl2ZV9pbnN0cnVjdGlvbnModm9pZCkKIHsKIAlleHRlcm4gc3RydWN0IGFsdF9pbnN0ciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOwotCWlmIChub19yZXBsYWNlbWVudCkgCi0JCXJldHVybjsKIAlhcHBseV9hbHRlcm5hdGl2ZXMoX19hbHRfaW5zdHJ1Y3Rpb25zLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbm9yZXBsYWNlbWVudF9zZXR1cChjaGFyICpzKQoteyAKLSAgICAgbm9fcmVwbGFjZW1lbnQgPSAxOyAKLSAgICAgcmV0dXJuIDA7IAotfSAKLQotX19zZXR1cCgibm9yZXBsYWNlbWVudCIsIG5vcmVwbGFjZW1lbnRfc2V0dXApOyAKLQogc3RhdGljIGNoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfTUNBCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGQ2NmJmNDguLjhhYzhlOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC02OCwyMSArNjgsMjEgQEAKICNlbmRpZgogCiAvKiBQYWNrYWdlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KLWludCBwaHlzX3Byb2NfaWRbTlJfQ1BVU10gPSB7WzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEfTsKK2ludCBwaHlzX3Byb2NfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OwogRVhQT1JUX1NZTUJPTChwaHlzX3Byb2NfaWQpOwogCiAvKiBDb3JlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KLWludCBjcHVfY29yZV9pZFtOUl9DUFVTXSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OworaW50IGNwdV9jb3JlX2lkW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7WzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEfTsKIEVYUE9SVF9TWU1CT0woY3B1X2NvcmVfaWQpOwogCi1jcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdOworY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChjcHVfc2libGluZ19tYXApOwogCi1jcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOworY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChjcHVfY29yZV9tYXApOwogCiAvKiBiaXRtYXAgb2Ygb25saW5lIGNwdXMgKi8KLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CiAKIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKQEAgLTEwMCw3ICsxMDAsNyBAQAogc3RydWN0IGNwdWluZm9feDg2IGNwdV9kYXRhW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CiBFWFBPUlRfU1lNQk9MKGNwdV9kYXRhKTsKIAotdTggeDg2X2NwdV90b19hcGljaWRbTlJfQ1BVU10gPQordTggeDg2X2NwdV90b19hcGljaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9CiAJCQl7IFswIC4uLiBOUl9DUFVTLTFdID0gMHhmZiB9OwogRVhQT1JUX1NZTUJPTCh4ODZfY3B1X3RvX2FwaWNpZCk7CiAKQEAgLTU1MCwxMCArNTUwLDEwIEBACiAjaWZkZWYgQ09ORklHX05VTUEKIAogLyogd2hpY2ggbG9naWNhbCBDUFVzIGFyZSBvbiB3aGljaCBub2RlcyAqLwotY3B1bWFza190IG5vZGVfMl9jcHVfbWFza1tNQVhfTlVNTk9ERVNdID0KK2NwdW1hc2tfdCBub2RlXzJfY3B1X21hc2tbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5ID0KIAkJCQl7IFswIC4uLiBNQVhfTlVNTk9ERVMtMV0gPSBDUFVfTUFTS19OT05FIH07CiAvKiB3aGljaCBub2RlIGVhY2ggbG9naWNhbCBDUFUgaXMgb24gKi8KLWludCBjcHVfMl9ub2RlW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IDAgfTsKK2ludCBjcHVfMl9ub2RlW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gMCB9OwogRVhQT1JUX1NZTUJPTChjcHVfMl9ub2RlKTsKIAogLyogc2V0IHVwIGEgbWFwcGluZyBiZXR3ZWVuIGNwdSBhbmQgbm9kZS4gKi8KQEAgLTU4MSw3ICs1ODEsNyBAQAogCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAotdTggY3B1XzJfbG9naWNhbF9hcGljaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwordTggY3B1XzJfbG9naWNhbF9hcGljaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CiAKIHN0YXRpYyB2b2lkIG1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggNDQyYTZlOS4uNDY4NTAwYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTI4OSwzICsyODksOCBAQAogCS5sb25nIHN5c19hZGRfa2V5CiAJLmxvbmcgc3lzX3JlcXVlc3Rfa2V5CiAJLmxvbmcgc3lzX2tleWN0bAorCS5sb25nIHN5c19pb3ByaW9fc2V0CisJLmxvbmcgc3lzX2lvcHJpb19nZXQJCS8qIDI5MCAqLworCS5sb25nIHN5c19pbm90aWZ5X2luaXQKKwkubG9uZyBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gKKwkubG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwppbmRleCBlNjhkOWZkLi4wZWU5ZGVlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwpAQCAtNjgsNyArNjgsOCBAQAogCiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIAotZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisKIGludCBwaXRfbGF0Y2hfYnVnZ3k7ICAgICAgICAgICAgICAvKiBleHRlcm4gKi8KIAogI2luY2x1ZGUgImRvX3RpbWVyLmgiCkBAIC04NSwxMCArODYsMTIgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIAorI2luY2x1ZGUgPGFzbS9pODI1My5oPgorCiBERUZJTkVfU1BJTkxPQ0soaTgyNTNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKGk4MjUzX2xvY2spOwogCi1zdHJ1Y3QgdGltZXJfb3B0cyAqY3VyX3RpbWVyID0gJnRpbWVyX25vbmU7CitzdHJ1Y3QgdGltZXJfb3B0cyAqY3VyX3RpbWVyIF9fcmVhZF9tb3N0bHkgPSAmdGltZXJfbm9uZTsKIAogLyoKICAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvY2sgdGhhdCBpcyBvd25lZCBieSB0aGUgQ1BVIGFuZCBob2xkcyB0aGUgaW5kZXgKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwppbmRleCBmNmYxMjA2Li4xMzg5MmE2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfY3ljbG9uZS5jCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSAiaW9fcG9ydHMuaCIKKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KIAotZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKyNpbmNsdWRlICJpb19wb3J0cy5oIgogCiAvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KIHN0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKaW5kZXggZDc2NmUwOS4uZWY4ZGFjNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKICNpbmNsdWRlIDxhc20vaHBldC5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3VzZWNfcXVvdGllbnQ7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwpAQCAtMTgwLDcgKzE4MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX2hwZXQgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSA9IAkJImhwZXQiLAogCS5tYXJrX29mZnNldCA9CQltYXJrX29mZnNldF9ocGV0LAogCS5nZXRfb2Zmc2V0ID0JCWdldF9vZmZzZXRfaHBldCwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKaW5kZXggOTY3ZDU0NS4uMDZkZTAzNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKQEAgLTE1LDkgKzE1LDggQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KIAotZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7Ci1leHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogI2luY2x1ZGUgImRvX3RpbWVyLmgiCiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIApAQCAtMTY2LDcgKzE2NSw2IEBACiAKIHZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCiB7Ci0JZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKaW5kZXggZjQ2ZTYyNS4uOGY0ZTRkNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCiAKICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgogCiAjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfdXNlY19xdW90aWVudDsKQEAgLTM1LDggKzM2LDYgQEAKIAogaW50IHRzY19kaXNhYmxlIF9fZGV2aW5pdGRhdGEgPSAwOwogCi1leHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwotCiBzdGF0aWMgaW50IHVzZV90c2M7CiAvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KIHN0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggN2UwMWE1Mi4uNzYxOTcyZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNTcsNiArNTcsOSBAQAogCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAgIH0KIAorICAvKiByYXJlbHkgY2hhbmdlZCBkYXRhIGxpa2UgY3B1IG1hcHMgKi8KKyAgLiA9IEFMSUdOKDMyKTsKKyAgLmRhdGEucmVhZF9tb3N0bHkgOiBBVChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSAtIExPQURfT0ZGU0VUKSB7ICooLmRhdGEucmVhZF9tb3N0bHkpIH0KICAgX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCiAKICAgLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsJLyogaW5pdF90YXNrICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12aXN3cy9yZWJvb3QuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3JlYm9vdC5jCmluZGV4IDNhODFlOTAuLjk1ZTQ2NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3JlYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3JlYm9vdC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgInBpaXg0LmgiCiAKIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9iYXNpYy5jCmluZGV4IDYwMmFlYTIuLjg2ODAwODAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9iYXNpYy5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9iYXNpYy5jCkBAIC0zMCwxMSArMzAsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgogCiAvKgogICogUG93ZXIgb2ZmIGZ1bmN0aW9uLCBpZiBhbnkKICAqLwogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CiAKIGludCB2b3lhZ2VyX2xldmVsID0gMDsKIApAQCAtMTgyLDcgKzE4NCw2IEBACiAJCSAqIGFuZCBzd2lmdGx5IGludHJvZHVjZSBpdCB0byBzb21ldGhpbmcgc2hhcnAgYW5kCiAJCSAqIHBvaW50eS4gICovCiAJCV9fdTE2IHZhbDsKLQkJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAogCQlzcGluX2xvY2soJmk4MjUzX2xvY2spOwogCQkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwppbmRleCA4Yzg1Mjc1Li4wZTFmNDIwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiB0aGUgdm95YWdlciBoYWwgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eQogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00MCw2ICs0MSw3IEBACiAvKiBwZXIgQ1BVIGRhdGEgc3RydWN0dXJlIChmb3IgL3Byb2MvY3B1aW5mbyBldCBhbCksIHZpc2libGUgZXh0ZXJuYWxseQogICogaW5kZXhlZCBwaHlzaWNhbGx5ICovCiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKK0VYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwogCiAvKiBwaHlzaWNhbCBJRCBvZiB0aGUgQ1BVIHVzZWQgdG8gYm9vdCB0aGUgc3lzdGVtICovCiB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOwpAQCAtNzIsNiArNzQsNyBAQAogLyogQml0bWFzayBvZiBjdXJyZW50bHkgb25saW5lIENQVXMgLSB1c2VkIGJ5IHNldHVwLmMgZm9yCiAgICAvcHJvYy9jcHVpbmZvLCB2aXNpYmxlIGV4dGVybmFsbHkgYnV0IHN0aWxsIHBoeXNpY2FsICovCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CiAKIC8qIEJpdG1hc2sgb2YgQ1BVcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0gLSBleHBvcnRlZCBieSBpMzg2X3N5bXMuYywgdXNlZAogICogYnkgc2NoZWR1bGVyIGJ1dCBpbmRleGVkIHBoeXNpY2FsbHkgKi8KQEAgLTIzOCw2ICsyNDEsNyBAQAogLyogVGhpcyBpcyBmb3IgdGhlIG5ldyBkeW5hbWljIENQVSBib290IGNvZGUgKi8KIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcCA9IENQVV9NQVNLX05PTkU7CiBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwID0gQ1BVX01BU0tfTk9ORTsKK0VYUE9SVF9TWU1CT0woY3B1X2NhbGxvdXRfbWFwKTsKIAogLyogVGhlIHBlciBwcm9jZXNzb3IgSVJRIG1hc2tzICh0aGVzZSBhcmUgdXN1YWxseSBrZXB0IGluIHN5bmMpICovCiBzdGF0aWMgX191MTYgdmljX2lycV9tYXNrW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CkBAIC05NzgsNiArOTgyLDcgQEAKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CitFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKIAogLyogZW5hYmxlIHRoZSByZXF1ZXN0ZWQgSVJRcyAqLwogc3RhdGljIHZvaWQKQEAgLTExMDksNiArMTExNCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogCiAvKiBTb3JyeSBhYm91dCB0aGUgbmFtZS4gIEluIGFuIEFQSUMgYmFzZWQgc3lzdGVtLCB0aGUgQVBJQ3MKICAqIHRoZW1zZWx2ZXMgYXJlIHByb2dyYW1tZWQgdG8gc2VuZCBhIHRpbWVyIGludGVycnVwdC4gIFRoaXMgaXMgdXNlZApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2lvcmVtYXAuYyBiL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKaW5kZXggNmIyNWFmYy4uZjM3OWI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2lvcmVtYXAuYworKysgYi9hcmNoL2kzODYvbW0vaW9yZW1hcC5jCkBAIC0yMjgsNyArMjI4LDggQEAKIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqcDsKLQlpZiAoKHZvaWQgX19mb3JjZSAqKSBhZGRyIDw9IGhpZ2hfbWVtb3J5KSAKKworCWlmICgodm9pZCBfX2ZvcmNlICopYWRkciA8PSBoaWdoX21lbW9yeSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTI0MSw5ICsyNDIsMTAgQEAKIAkJcmV0dXJuOwogCiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCXAgPSBfX3JlbW92ZV92bV9hcmVhKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBhZGRyKSk7CisJcCA9IF9fcmVtb3ZlX3ZtX2FyZWEoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKSk7CiAJaWYgKCFwKSB7IAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb3VubWFwOiBiYWQgYWRkcmVzcyAlcFxuIiwgYWRkcik7CisJCWR1bXBfc3RhY2soKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYyBiL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKaW5kZXggNzIwOTc1ZS4uNzBiY2Q1MyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0yNSw3ICsyNSw4IEBACiAKIGludCBwY2lfcm91dGVpcnE7CiBpbnQgcGNpYmlvc19sYXN0X2J1cyA9IC0xOwotc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1cyA9IE5VTEw7Cit1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKK3N0cnVjdCBwY2lfYnVzICpwY2lfcm9vdF9idXM7CiBzdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfb3BzOwogCiBzdGF0aWMgaW50IHBjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKQEAgLTEzMyw3ICsxMzQsNyBAQAogCiAJcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c251bSk7CiAKLQlyZXR1cm4gcGNpX3NjYW5fYnVzKGJ1c251bSwgJnBjaV9yb290X29wcywgTlVMTCk7CisJcmV0dXJuIHBjaV9zY2FuX2J1c19wYXJlbnRlZChOVUxMLCBidXNudW0sICZwY2lfcm9vdF9vcHMsIE5VTEwpOwogfQogCiBleHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKQEAgLTE2NCw2ICsxNjUsNyBAQAogCWlmICgocGNpX3Byb2JlICYgUENJX0JJT1NfU09SVCkgJiYgIShwY2lfcHJvYmUgJiBQQ0lfTk9fU09SVCkpCiAJCXBjaWJpb3Nfc29ydCgpOwogI2VuZGlmCisJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwogCXJldHVybiAwOwogfQogCkBAIC0xODgsNiArMTkwLDkgQEAKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYmlvc2lycSIpKSB7CiAJCXBjaV9wcm9iZSB8PSBQQ0lfQklPU19JUlFfU0NBTjsKIAkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJwaXJxYWRkcj0iLCA5KSkgeworCQlwaXJxX3RhYmxlX2FkZHIgPSBzaW1wbGVfc3RydG91bChzdHIrOSwgTlVMTCwgMCk7CisJCXJldHVybiBOVUxMOwogCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19QQ0lfRElSRUNUCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2kzODYuYyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCmluZGV4IGMyMDVlYTcuLjkzYTM2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCkBAIC0xMDYsMTEgKzEwNiwxNiBAQAogCQlpZiAoKGRldiA9IGJ1cy0+c2VsZikpIHsKIAkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgewogCQkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCQkJCWlmICghci0+c3RhcnQpCisJCQkJaWYgKCFyLT5mbGFncykKIAkJCQkJY29udGludWU7CiAJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKLQkJCQlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkKKwkJCQlpZiAoIXItPnN0YXJ0IHx8ICFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQgb2YgYnJpZGdlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQkvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcmVnaW9uLgorCQkJCQkgICBJbnZhbGlkYXRlIHRoZSByZXNvdXJjZSB0byBwcmV2ZW50IGNoaWxkCisJCQkJCSAgIHJlc291cmNlIGFsbG9jYXRpb25zIGluIHRoaXMgcmFuZ2UuICovCisJCQkJCXItPmZsYWdzID0gMDsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcGNpYmlvc19hbGxvY2F0ZV9idXNfcmVzb3VyY2VzKCZidXMtPmNoaWxkcmVuKTsKQEAgLTIyNyw3ICsyMzIsNyBAQAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkX2NtZCA9IGNtZDsKLQlmb3IoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCWZvcihpZHggPSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwogCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2lycS5jIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwppbmRleCA4MzQ1OGY4Li43NjZiMTA0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2lycS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKQEAgLTU4LDYgKzU4LDM1IEBACiBpbnQgKCpwY2liaW9zX2VuYWJsZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYpID0gTlVMTDsKIAogLyoKKyAqICBDaGVjayBwYXNzZWQgYWRkcmVzcyBmb3IgdGhlIFBDSSBJUlEgUm91dGluZyBUYWJsZSBzaWduYXR1cmUKKyAqICBhbmQgcGVyZm9ybSBjaGVja3N1bSB2ZXJpZmljYXRpb24uCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKiBwaXJxX2NoZWNrX3JvdXRpbmdfdGFibGUodTggKmFkZHIpCit7CisJc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpydDsKKwlpbnQgaTsKKwl1OCBzdW07CisKKwlydCA9IChzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKikgYWRkcjsKKwlpZiAocnQtPnNpZ25hdHVyZSAhPSBQSVJRX1NJR05BVFVSRSB8fAorCSAgICBydC0+dmVyc2lvbiAhPSBQSVJRX1ZFUlNJT04gfHwKKwkgICAgcnQtPnNpemUgJSAxNiB8fAorCSAgICBydC0+c2l6ZSA8IHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpKQorCQlyZXR1cm4gTlVMTDsKKwlzdW0gPSAwOworCWZvciAoaT0wOyBpIDwgcnQtPnNpemU7IGkrKykKKwkJc3VtICs9IGFkZHJbaV07CisJaWYgKCFzdW0pIHsKKwkJREJHKCJQQ0k6IEludGVycnVwdCBSb3V0aW5nIFRhYmxlIGZvdW5kIGF0IDB4JXBcbiIsIHJ0KTsKKwkJcmV0dXJuIHJ0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisKKy8qCiAgKiAgU2VhcmNoIDB4ZjAwMDAgLS0gMHhmZmZmZiBmb3IgdGhlIFBDSSBJUlEgUm91dGluZyBUYWJsZS4KICAqLwogCkBAIC02NSwyMyArOTQsMTcgQEAKIHsKIAl1OCAqYWRkcjsKIAlzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnJ0OwotCWludCBpOwotCXU4IHN1bTsKIAotCWZvcihhZGRyID0gKHU4ICopIF9fdmEoMHhmMDAwMCk7IGFkZHIgPCAodTggKikgX192YSgweDEwMDAwMCk7IGFkZHIgKz0gMTYpIHsKLQkJcnQgPSAoc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICopIGFkZHI7Ci0JCWlmIChydC0+c2lnbmF0dXJlICE9IFBJUlFfU0lHTkFUVVJFIHx8Ci0JCSAgICBydC0+dmVyc2lvbiAhPSBQSVJRX1ZFUlNJT04gfHwKLQkJICAgIHJ0LT5zaXplICUgMTYgfHwKLQkJICAgIHJ0LT5zaXplIDwgc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSkpCi0JCQljb250aW51ZTsKLQkJc3VtID0gMDsKLQkJZm9yKGk9MDsgaTxydC0+c2l6ZTsgaSsrKQotCQkJc3VtICs9IGFkZHJbaV07Ci0JCWlmICghc3VtKSB7Ci0JCQlEQkcoIlBDSTogSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgZm91bmQgYXQgMHglcFxuIiwgcnQpOworCWlmIChwaXJxX3RhYmxlX2FkZHIpIHsKKwkJcnQgPSBwaXJxX2NoZWNrX3JvdXRpbmdfdGFibGUoKHU4ICopIF9fdmEocGlycV90YWJsZV9hZGRyKSk7CisJCWlmIChydCkKIAkJCXJldHVybiBydDsKLQkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IFBJUlEgdGFibGUgTk9UIGZvdW5kIGF0IHBpcnFhZGRyXG4iKTsKKwl9CisJZm9yKGFkZHIgPSAodTggKikgX192YSgweGYwMDAwKTsgYWRkciA8ICh1OCAqKSBfX3ZhKDB4MTAwMDAwKTsgYWRkciArPSAxNikgeworCQlydCA9IHBpcnFfY2hlY2tfcm91dGluZ190YWJsZShhZGRyKTsKKwkJaWYgKHJ0KQorCQkJcmV0dXJuIHJ0OwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEwMjgsMjQgKzEwNTEsMjggQEAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2lycV9pbml0KTsKIAogCi1zdGF0aWMgdm9pZCBwaXJxX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyB2b2lkIHBpcnFfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qCiAJICogIElmIGFueSBJU0FQblAgZGV2aWNlIHJlcG9ydHMgYW4gSVJRIGluIGl0cyBsaXN0IG9mIHBvc3NpYmxlCiAJICogIElSUSdzLCB3ZSB0cnkgdG8gYXZvaWQgYXNzaWduaW5nIGl0IHRvIFBDSSBkZXZpY2VzLgogCSAqLwotCWlmIChpcnEgPCAxNikKLQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwOworCWlmIChpcnEgPCAxNikgeworCQlpZiAoYWN0aXZlKQorCQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwMDsKKwkJZWxzZQorCQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwOworCX0KIH0KIAotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3ZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfUENJCiAJaWYgKCFhY3BpX25vaXJxKQotCQlhY3BpX3BlbmFsaXplX2lzYV9pcnEoaXJxKTsKKwkJYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGlycSwgYWN0aXZlKTsKIAllbHNlCiAjZW5kaWYKLQkJcGlycV9wZW5hbGl6ZV9pc2FfaXJxKGlycSk7CisJCXBpcnFfcGVuYWxpemVfaXNhX2lycShpcnEsIGFjdGl2ZSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlycV9lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC9pMzg2L3BjaS9sZWdhY3kuYwppbmRleCAxNDkyZTM3Li4xNDlhOTU4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvbGVnYWN5LmMKQEAgLTQ1LDYgKzQ1LDggQEAKIAogCXByaW50aygiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CiAJcGNpX3Jvb3RfYnVzID0gcGNpYmlvc19zY2FuX3Jvb3QoMCk7CisJaWYgKHBjaV9yb290X2J1cykKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhwY2lfcm9vdF9idXMpOwogCiAJcGNpYmlvc19maXh1cF9wZWVyX2JyaWRnZXMoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCmluZGV4IDAyMWE1MGEuLjYwZjBlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKQEAgLTExLDExICsxMSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgInBjaS5oIgogCi0vKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KLXUzMiBwY2lfbW1jZmdfYmFzZV9hZGRyOwotCiAjZGVmaW5lIG1tY2ZnX3ZpcnRfYWRkciAoKHZvaWQgX19pb21lbSAqKSBmaXhfdG9fdmlydChGSVhfUENJRV9NQ0ZHKSkKIAogLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbGFzdCBNTUNPTkZJRyBkZXZpY2UgYWNjZXNzZWQgKi8KQEAgLTI0LDEwICsyMiwzMSBAQAogLyoKICAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggTU1DT05GSUcgYWNjZXNzZXMKICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UoaW50IGJ1cywgaW50IGRldmZuKQorc3RhdGljIHUzMiBnZXRfYmFzZV9hZGRyKHVuc2lnbmVkIGludCBzZWcsIGludCBidXMpCiB7Ci0JdTMyIGRldl9iYXNlID0gcGNpX21tY2ZnX2Jhc2VfYWRkciB8IChidXMgPDwgMjApIHwgKGRldmZuIDw8IDEyKTsKKwlpbnQgY2ZnX251bSA9IC0xOworCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpjZmc7CisKKwl3aGlsZSAoMSkgeworCQkrK2NmZ19udW07CisJCWlmIChjZmdfbnVtID49IHBjaV9tbWNmZ19jb25maWdfbnVtKSB7CisJCQkvKiBzb21ldGhpbmcgYmFkIGlzIGdvaW5nIG9uLCBubyBjZmcgdGFibGUgaXMgZm91bmQuICovCisJCQkvKiBzbyB3ZSBmYWxsIGJhY2sgdG8gdGhlIG9sZCB3YXkgd2UgdXNlZCB0byBkbyB0aGlzICovCisJCQkvKiBhbmQganVzdCByZWx5IG9uIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBjb3JyZWN0LiAqLworCQkJcmV0dXJuIHBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzOworCQl9CisJCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2NmZ19udW1dOworCQlpZiAoY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgIT0gc2VnKQorCQkJY29udGludWU7CisJCWlmICgoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw9IGJ1cykgJiYKKwkJICAgIChjZmctPmVuZF9idXNfbnVtYmVyID49IGJ1cykpCisJCQlyZXR1cm4gY2ZnLT5iYXNlX2FkZHJlc3M7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UodW5zaWduZWQgaW50IHNlZywgaW50IGJ1cywgaW50IGRldmZuKQoreworCXUzMiBkZXZfYmFzZSA9IGdldF9iYXNlX2FkZHIoc2VnLCBidXMpIHwgKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpOwogCWlmIChkZXZfYmFzZSAhPSBtbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSkgewogCQltbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSA9IGRldl9iYXNlOwogCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX1BDSUVfTUNGRywgZGV2X2Jhc2UpOwpAQCAtNDQsNyArNjMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwogCi0JcGNpX2V4cF9zZXRfZGV2X2Jhc2UoYnVzLCBkZXZmbik7CisJcGNpX2V4cF9zZXRfZGV2X2Jhc2Uoc2VnLCBidXMsIGRldmZuKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgpAQCAtNzMsNyArOTIsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwogCi0JcGNpX2V4cF9zZXRfZGV2X2Jhc2UoYnVzLCBkZXZmbik7CisJcGNpX2V4cF9zZXRfZGV2X2Jhc2Uoc2VnLCBidXMsIGRldmZuKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgpAQCAtMTAxLDcgKzEyMCwxMSBAQAogewogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJZ290byBvdXQ7Ci0JaWYgKCFwY2lfbW1jZmdfYmFzZV9hZGRyKQorCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisJaWYgKChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZyA9PSBOVUxMKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MgPT0gMCkpCiAJCWdvdG8gb3V0OwogCiAJLyogS2x1ZGdlIGZvciBub3cuIERvbid0IHVzZSBtbWNvbmZpZyBvbiBBTUQgc3lzdGVtcyBiZWNhdXNlCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL251bWEuYyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCmluZGV4IDllMzY5NTQuLmFkYmUxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCkBAIC0xMTUsNiArMTE1LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlwY2lfcm9vdF9idXMgPSBwY2liaW9zX3NjYW5fcm9vdCgwKTsKKwlpZiAocGNpX3Jvb3RfYnVzKQorCQlwY2lfYnVzX2FkZF9kZXZpY2VzKHBjaV9yb290X2J1cyk7CiAJaWYgKG51bV9vbmxpbmVfbm9kZXMoKSA+IDEpCiAJCWZvcl9lYWNoX29ubGluZV9ub2RlKHF1YWQpIHsKIAkJCWlmIChxdWFkID09IDApCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3BjaS5oIGIvYXJjaC9pMzg2L3BjaS9wY2kuaAppbmRleCBhOGZjODBjLi5hODBmMGY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL3BjaS5oCisrKyBiL2FyY2gvaTM4Ni9wY2kvcGNpLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgUENJX0FTU0lHTl9BTExfQlVTU0VTCTB4NDAwMAogCiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9wcm9iZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKIAogLyogcGNpLWkzODYuYyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3Zpc3dzLmMgYi9hcmNoL2kzODYvcGNpL3Zpc3dzLmMKaW5kZXggNmE5MjQ4Ny4uMzE0YzkzMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS92aXN3cy5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYwpAQCAtMjEsNyArMjEsNyBAQAogCiBpbnQgKCpwY2liaW9zX2VuYWJsZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYpID0gJnBjaV92aXN3c19lbmFibGVfaXJxOwogCi12b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkge30KK3ZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKSB7fQogCiAKIHVuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvY3B1LmMgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKaW5kZXggMGU2YjQ1Yi4uYzU0N2MxYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwpAQCAtMTM3LDYgKzEzNyw3IEBACiAKIAlmaXhfcHJvY2Vzc29yX2NvbnRleHQoKTsKIAlkb19mcHVfZW5kKCk7CisJbXRycl9hcF9pbml0KCk7CiB9CiAKIHZvaWQgcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggMDFiNzhlNy4uY2JiM2UwYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTIyMCwxMyArMjIwLDYgQEAKIAlkZXBlbmRzIG9uICFJQTY0X0hQX1NJTQogCWRlZmF1bHQgeQogCi1jb25maWcgSUE2NF9TR0lfU05fU0lNCi0JYm9vbCAiU0dJIE1lZHVzYSBTaW11bGF0b3IgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIElBNjRfU0dJX1NOMiB8fCBJQTY0X0dFTkVSSUMKLQloZWxwCi0JICBJZiB5b3UgYXJlIGNvbXBpbGluZyBhIGtlcm5lbCB0aGF0IHdpbGwgcnVuIHVuZGVyIFNHSSdzIElBLTY0Ci0JICBzaW11bGF0b3IgKE1lZHVzYSkgdGhlbiBzYXkgWSwgb3RoZXJ3aXNlIHNheSBOLgotCiBjb25maWcgSUE2NF9TR0lfU05fWFAKIAl0cmlzdGF0ZSAiU3VwcG9ydCBjb21tdW5pY2F0aW9uIGJldHdlZW4gU0dJIFNTSXMiCiAJc2VsZWN0IElBNjRfVU5DQUNIRURfQUxMT0NBVE9SCkBAIC00MjMsNiArNDE2LDggQEAKIAogZW5kaWYKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCmluZGV4IDQ4N2QyZTMuLjA0ZDBiMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZwpAQCAtODEsNyArODEsNiBAQAogQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRT15CiAjIENPTkZJR19JQTY0X0NZQ0xPTkUgaXMgbm90IHNldAogQ09ORklHX0lPU0FQSUM9eQotQ09ORklHX0lBNjRfU0dJX1NOX1NJTT15CiBDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xOAogQ09ORklHX1NNUD15CiBDT05GSUdfTlJfQ1BVUz01MTIKQEAgLTk5LDcgKzk4LDcgQEAKICMgRmlybXdhcmUgRHJpdmVycwogIwogQ09ORklHX0VGSV9WQVJTPXkKLSMgQ09ORklHX0VGSV9QQ0RQIGlzIG5vdCBzZXQKK0NPTkZJR19FRklfUENEUD15CiBDT05GSUdfQklORk1UX0VMRj15CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTY1MCw3ICs2NDksNyBAQAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19WR0FfQ09OU09MRT15CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCA0N2Y0NTM0Li43MzQ1NGVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLTIwMDUwNjIxCi0jIFR1ZSBKdW4gMjEgMTQ6MDM6MjQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMS0yMDA1MDYyOQorIyBXZWQgSnVuIDI5IDE1OjI4OjEyIDIwMDUKICMKIAogIwpAQCAtODAsMTggKzgwLDI5IEBACiAjIENPTkZJR19JQTY0X1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0I9eQogIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKIENPTkZJR19JQTY0X0wxX0NBQ0hFX1NISUZUPTcKICMgQ09ORklHX05VTUEgaXMgbm90IHNldAogQ09ORklHX1ZJUlRVQUxfTUVNX01BUD15CiBDT05GSUdfSE9MRVNfSU5fWk9ORT15CiBDT05GSUdfSUE2NF9DWUNMT05FPXkKIENPTkZJR19JT1NBUElDPXkKKyMgQ09ORklHX0lBNjRfU0dJX1NOX1hQIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE4CiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTQKIENPTkZJR19IT1RQTFVHX0NQVT15CiAjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfSUEzMl9TVVBQT1JUPXkKIENPTkZJR19DT01QQVQ9eQpAQCAtMjU3LDYgKzI2OCw3IEBACiAjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9QSUlYPXkKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CkBAIC0zOTUsNiArNDA3LDcgQEAKIENPTkZJR19JTkVUPXkKIENPTkZJR19JUF9NVUxUSUNBU1Q9eQogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiAjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKQEAgLTQwNyw2ICs0MjAsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lQX1RDUERJQUc9eQogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC01OTgsOSArNjEzLDcgQEAKICMgQ09ORklHX0dBTUVQT1JUX05TNTU4IGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0w0IGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0VNVTEwSzEgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlRfVk9SVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0ZNODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX0NTNDYxWCBpcyBub3Qgc2V0CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTYyOSw3ICs2NDIsNiBAQAogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQogIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKIAogIwpAQCAtNzQzLDYgKzc1NSw3IEBACiBDT05GSUdfVVNCX0VIQ0lfSENEPW0KICMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD1tCiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKQEAgLTc3OSw5ICs3OTIsMTEgQEAKICMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKQEAgLTgzOCw3ICs4NTMsNyBAQAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFVTQiBBVE0vRFNMIGRyaXZlcnMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CiAjCiAKICMKQEAgLTg1NywxMiArODcyLDE3IEBACiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKQEAgLTkyMiw3ICs5NDIsNiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1hBVFRSPXkKQEAgLTk1MywxNSArOTcyLDE4IEBACiAjCiBDT05GSUdfTkZTX0ZTPW0KIENPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKIENPTkZJR19ORlNfRElSRUNUSU89eQogQ09ORklHX05GU0Q9bQogQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU0RfVjQ9eQogQ09ORklHX05GU0RfVENQPXkKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQogQ09ORklHX1NVTlJQQ19HU1M9bQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCkBAIC0xMDY5LDYgKzEwOTEsNyBAQAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKICMgQ09ORklHX0lBNjRfR1JBTlVMRV82NE1CIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfUFJJTlRfSEFaQVJEUyBpcyBub3Qgc2V0CkBAIC0xMDkwLDcgKzExMTMsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01ENT1tCitDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKaW5kZXggMjFkNmY5Yi4uYjc3NTVlNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEwCi0jIFdlZCBEZWMgMjkgMDk6MDU6NDggMjAwNAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMS0yMDA1MDYyOQorIyBXZWQgSnVuIDI5IDE1OjMxOjExIDIwMDUKICMKIAogIwpAQCAtMTIsNiArMTIsNyBAQAogQ09ORklHX0JST0tFTj15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CiBDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTI0LDIzICsyNSwyNiBAQAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE3CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCiBDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKIENPTkZJR19DQ19BTElHTl9MT09QUz0wCiBDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTU5LDEyICs2MywxNSBAQAogQ09ORklHXzY0QklUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OPXkKIENPTkZJR19FRkk9eQogQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19JQTY0X0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9ESUcgaXMgbm90IHNldAogQ09ORklHX0lBNjRfSFBfWlgxPXkKKyMgQ09ORklHX0lBNjRfSFBfWlgxX1NXSU9UTEIgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9TR0lfU04yIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfSFBfU0lNIGlzIG5vdCBzZXQKICMgQ09ORklHX0lUQU5JVU0gaXMgbm90IHNldApAQCAtNzMsMjIgKzgwLDM2IEBACiAjIENPTkZJR19JQTY0X1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0I9eQogIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKIENPTkZJR19JQTY0X0wxX0NBQ0hFX1NISUZUPTcKICMgQ09ORklHX05VTUEgaXMgbm90IHNldAogQ09ORklHX1ZJUlRVQUxfTUVNX01BUD15CitDT05GSUdfSE9MRVNfSU5fWk9ORT15CiAjIENPTkZJR19JQTY0X0NZQ0xPTkUgaXMgbm90IHNldAogQ09ORklHX0lPU0FQSUM9eQorIyBDT05GSUdfSUE2NF9TR0lfU05fWFAgaXMgbm90IHNldAogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTgKIENPTkZJR19TTVA9eQogQ09ORklHX05SX0NQVVM9MTYKICMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19JQTMyX1NVUFBPUlQ9eQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQogQ09ORklHX1BFUkZNT049eQogQ09ORklHX0lBNjRfUEFMSU5GTz15CitDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUT15CiAKICMKICMgRmlybXdhcmUgRHJpdmVycwpAQCAtMTIwLDYgKzE0MSw3IEBACiBDT05GSUdfQUNQSV9QT1dFUj15CiBDT05GSUdfQUNQSV9QQ0k9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX0FDUElfQ09OVEFJTkVSIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEpCkBAIC0xMjksNiArMTUxLDcgQEAKICMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CiBDT05GSUdfUENJX05BTUVTPXkKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydApAQCAtMTM4LDcgKzE2MSw2IEBACiBDT05GSUdfSE9UUExVR19QQ0lfQUNQST15CiAjIENPTkZJR19IT1RQTFVHX1BDSV9BQ1BJX0lCTSBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX1BDSUUgaXMgbm90IHNldAogIyBDT05GSUdfSE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0CiAKICMKQEAgLTE0NywxMCArMTY5LDYgQEAKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi0KLSMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMTg0LDYgKzIwMiw3IEBACiAjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKICMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CkBAIC0yMDMsNiArMjIyLDcgQEAKIENPTkZJR19JT1NDSEVEX0FTPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKIENPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTI0Niw2ICsyNjYsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CkBAIC0yNzUsNiArMjk2LDcgQEAKIENPTkZJR19CTEtfREVWX1NSPXkKIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CiBDT05GSUdfQ0hSX0RFVl9TRz15CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CiAKICMKICMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCkBAIC0yODgsNiArMzEwLDcgQEAKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz15CiAjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKQEAgLTMwMywxMyArMzI2LDEwIEBACiAjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ1BRRkNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0VBVEFfUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKQEAgLTMxOSw4ICszMzksNiBAQAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1BDSTIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9QQ0kyMjIwSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQpAQCAtMzMxLDcgKzM0OSw3IEBACiAjIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTYzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtMzQ0LDkgKzM2Miw5IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19GVVNJT049eQotQ09ORklHX0ZVU0lPTl9NQVhfU0dFPTQwCi0jIENPTkZJR19GVVNJT05fQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMzY4LDEyICszODYsMTIgQEAKICMKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CkBAIC0zODYsNiArNDA0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogCiAjCiAjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCkBAIC00MDUsOCArNDI1LDYgQEAKIENPTkZJR19JUF9ORl9BUlBUQUJMRVM9eQogIyBDT05GSUdfSVBfTkZfQVJQRklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX0FSUF9NQU5HTEUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfQ09NUEFUX0lQQ0hBSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTVBBVF9JUEZXQURNIGlzIG5vdCBzZXQKIAogIwogIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKQEAgLTQ4Myw3ICs1MDEsNiBAQAogIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMD15Ci0jIENPTkZJR19FMTAwX05BUEkgaXMgbm90IHNldAogIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKICMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAogIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldApAQCAtNTA1LDkgKzUyMiwxMSBAQAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPXkKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtNTY1LDE4ICs1ODQsNiBAQAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCiAjCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0KLSMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKQEAgLTU4Niw2ICs1OTMsMTYgQEAKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCiAjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CkBAIC02MDMsNyArNjIwLDYgQEAKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKICMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CiAKICMKQEAgLTYxMSw2ICs2MjcsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTY0NCw2ICs2NjEsMTIgQEAKICMgQ09ORklHX0RSTV9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC02NjgsNiArNjkxLDcgQEAKICMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKQEAgLTY5MSwxMCArNzE1LDE0IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKQEAgLTcwNSwyMSArNzMzLDI5IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKIAogIwogIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CiAjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNzQ2LDYgKzc4Miw3IEBACiAjCiAjIFZpZGVvIEFkYXB0ZXJzCiAjCisjIENPTkZJR19UVU5FUl9NVUxUSV9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fQlQ4NDggaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fQ1BJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19TQUE1MjQ2QSBpcyBub3Qgc2V0CkBAIC03NzgsNiArODE1LDExIEBACiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKIENPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKIENPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CkBAIC03ODUsNiArODI3LDcgQEAKICMgQ09ORklHX0ZCX0NZQkVSMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BU0lMSUFOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9JTVNUVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9OVklESUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQVRST1ggaXMgbm90IHNldAogIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0CkBAIC04MDEsNiArODQ0LDcgQEAKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTgyMCw2ICs4NjQsNyBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIFNvdW5kCkBAIC04NjksNiArOTE0LDggQEAKICMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAogIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldApAQCAtODc2LDYgKzkyMyw3IEBACiAjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldApAQCAtODkzLDEzICs5NDEsMTQgQEAKICMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAogCiAjCiAjIFVTQiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9VU0JfVVNYMlkgaXMgbm90IHNldAogCiAjCiAjIE9wZW4gU291bmQgU3lzdGVtCkBAIC05MDksNiArOTU4LDggQEAKICMKICMgVVNCIHN1cHBvcnQKICMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CiBDT05GSUdfVVNCPXkKICMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CiAKQEAgLTkyMCw4ICs5NzEsNiBAQAogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKQEAgLTkyOSw3ICs5NzgsMTAgQEAKIENPTkZJR19VU0JfRUhDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX1VTQl9VSENJX0hDRD15CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIApAQCAtOTQ3LDEyICs5OTksMTEgQEAKICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9SV19ERVRFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0hQODIwMGUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CkBAIC05NjYsOSArMTAxNywxMSBAQAogQ09ORklHX1VTQl9ISURERVY9eQogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKQEAgLTk3OCw3ICsxMDMxLDYgQEAKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9IUFVTQlNDU0kgaXMgbm90IHNldAogCiAjCiAjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTk5Miw2ICsxMDQ0LDcgQEAKICMgQ09ORklHX1VTQl9TRTQwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU045QzEwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RWNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QV0MgaXMgbm90IHNldAogCiAjCiAjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCkBAIC0xMDAxLDYgKzEwNTQsNyBAQAogIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CiAKICMKICMgVVNCIHBvcnQgZHJpdmVycwpAQCAtMTAxNiw3ICsxMDcwLDYgQEAKICMKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RJR0wgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldApAQCAtMTAyNSw5ICsxMDc4LDExIEBACiAjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogCiAjCi0jIFVTQiBBVE0vRFNMIGRyaXZlcnMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CiAjCiAKICMKQEAgLTEwNDEsMTIgKzEwOTYsMjIgQEAKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKQEAgLTEwNTYsNiArMTEyMSwxMCBAQAogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIwogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwODksNyArMTE1OCw2IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15CiBDT05GSUdfVE1QRlNfWEFUVFI9eQpAQCAtMTEyMCwxNSArMTE4OCwxOCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogQ09ORklHX05GU0Q9eQogQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQpAQCAtMTIwOSw2ICsxMjgwLDggQEAKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiAKICMKICMgUHJvZmlsaW5nIHN1cHBvcnQKQEAgLTEyMTgsMTQgKzEyOTEsMTggQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19LUFJPQkVTPXkKIENPTkZJR19JQTY0X0dSQU5VTEVfMTZNQj15CiAjIENPTkZJR19JQTY0X0dSQU5VTEVfNjRNQiBpcyBub3Qgc2V0CiBDT05GSUdfSUE2NF9QUklOVF9IQVpBUkRTPXkKQEAgLTEyNTIsNiArMTMyOSw3IEBACiAjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19ERVM9eQogIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCmluZGV4IGI4ZGI2ZTMuLjExOTU3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMTU2LDEwICsxNTYsMTMgQEAKICovCiAjZGVmaW5lIERFTEFZRURfUkVTT1VSQ0VfQ05UCTY0CiAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9TWDIwMDBfSU9DCTB4MTJlYworCiAjZGVmaW5lIFpYMV9JT0NfSUQJKChQQ0lfREVWSUNFX0lEX0hQX1pYMV9JT0MgPDwgMTYpIHwgUENJX1ZFTkRPUl9JRF9IUCkKICNkZWZpbmUgWlgyX0lPQ19JRAkoKFBDSV9ERVZJQ0VfSURfSFBfWlgyX0lPQyA8PCAxNikgfCBQQ0lfVkVORE9SX0lEX0hQKQogI2RlZmluZSBSRU9fSU9DX0lECSgoUENJX0RFVklDRV9JRF9IUF9SRU9fSU9DIDw8IDE2KSB8IFBDSV9WRU5ET1JfSURfSFApCiAjZGVmaW5lIFNYMTAwMF9JT0NfSUQJKChQQ0lfREVWSUNFX0lEX0hQX1NYMTAwMF9JT0MgPDwgMTYpIHwgUENJX1ZFTkRPUl9JRF9IUCkKKyNkZWZpbmUgU1gyMDAwX0lPQ19JRAkoKFBDSV9ERVZJQ0VfSURfSFBfU1gyMDAwX0lPQyA8PCAxNikgfCBQQ0lfVkVORE9SX0lEX0hQKQogCiAjZGVmaW5lIFpYMV9JT0NfT0ZGU0VUCTB4MTAwMAkvKiBBQ1BJIHJlcG9ydHMgU0JBLCB3ZSB3YW50IElPQyAqLwogCkBAIC0xNzI2LDYgKzE3MjksNyBAQAogCXsgWlgxX0lPQ19JRCwgInp4MSIsIGlvY196eDFfaW5pdCB9LAogCXsgWlgyX0lPQ19JRCwgInp4MiIsIE5VTEwgfSwKIAl7IFNYMTAwMF9JT0NfSUQsICJzeDEwMDAiLCBOVUxMIH0sCisJeyBTWDIwMDBfSU9DX0lELCAic3gyMDAwIiwgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpb2MgKiBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCmluZGV4IGFlODRhMTAxLi4wNjM5ZWMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBzaW1ldGhfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGZkLCBpLCBlcnI7CisJaW50IGZkLCBpLCBlcnIsIHJjOwogCiAJLyoKIAkgKiBYWFggRml4IG1lCkBAIC0yMjgsNyArMjI4LDkgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlkZXYtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwlpZiAoKHJjID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pKSA8IDApCisJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkZXYtPmlycSA9IHJjOwogCiAJLyoKIAkgKiBhdHRhY2ggdGhlIGludGVycnVwdCBpbiB0aGUgc2ltdWxhdG9yLCB0aGlzIGRvZXMgZW5hYmxlIGludGVycnVwdHMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCmluZGV4IDc4NmU3MDcuLjdkY2I4NTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KQEAgLTE0OSwxMiArMTUwLDE3IEBACiAJCQkJc2Vlbl9lc2MgPSAyOwogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIGlmICggc2Vlbl9lc2MgPT0gMiApIHsKLQkJCQlpZiAoIGNoID09ICdQJyApIHNob3dfc3RhdGUoKTsJCS8qIEYxIGtleSAqLwotI2lmZGVmIENPTkZJR19LREIKLQkJCQlpZiAoIGNoID09ICdTJyApCi0JCQkJCWtkYihLREJfUkVBU09OX0tFWUJPQVJELCAwLCAoa2RiX2VmcmFtZV90KSByZWdzKTsKKwkJCQlpZiAoIGNoID09ICdQJyApIC8qIEYxICovCisJCQkJCXNob3dfc3RhdGUoKTsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJCQlpZiAoIGNoID09ICdTJyApIHsgLyogRjQgKi8KKwkJCQkJZG8KKwkJCQkJCWNoID0gaWE2NF9zc2MoMCwgMCwgMCwgMCwKKwkJCQkJCQkgICAgICBTU0NfR0VUQ0hBUik7CisJCQkJCXdoaWxlICghY2gpOworCQkJCQloYW5kbGVfc3lzcnEoY2gsIHJlZ3MsIE5VTEwpOworCQkJCX0KICNlbmRpZgotCiAJCQkJc2Vlbl9lc2MgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtOTc2LDcgKzk4Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogc2ltcnNfaW5pdCAodm9pZCkKIHsKLQlpbnQJCQlpOworCWludAkJCWksIHJjOwogCXN0cnVjdCBzZXJpYWxfc3RhdGUJKnN0YXRlOwogCiAJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJocHNpbSIpKQpAQCAtMTAxMSw3ICsxMDE3LDEwIEBACiAJCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUX1VOS05PV04pIGNvbnRpbnVlOwogCiAJCWlmICghc3RhdGUtPmlycSkgewotCQkJc3RhdGUtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwkJCWlmICgocmMgPSBhc3NpZ25faXJxX3ZlY3RvcihBVVRPX0FTU0lHTikpIDwgMCkKKwkJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwkJCXN0YXRlLT5pcnEgPSByYzsKIAkJCWlhNjRfc3NjX2Nvbm5lY3RfaXJxKEtFWUJPQVJEX0lOVFIsIHN0YXRlLT5pcnEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGIyZTJmNjUuLmUxZmI2OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX0lPU0FQSUMpCQkrPSBpb3NhcGljLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gZG9tYWluLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCiBvYmotJChDT05GSUdfUEVSRk1PTikJCSs9IHBlcmZtb25fZGVmYXVsdF9zbXBsLm8KIG9iai0kKENPTkZJR19JQTY0X0NZQ0xPTkUpCSs9IGN5Y2xvbmUubwogb2JqLSQoQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZKQkrPSBtY2FfcmVjb3ZlcnkubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCA3MmRmZDllLi45NjA5ZjI0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtMTEsNiArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMSBKZW5uYSBIYWxsIDxqZW5uYS5zLmhhbGxAaW50ZWwuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwMSBUYWtheW9zaGkgS29jaGkgPHQta29jaGlAYnEuanAubmVjLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgRXJpY2ggRm9jaHQgPGVmb2NodEBlc3MubmVjLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwNCBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CiAgKgogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqCkBAIC02Nyw2ICs2OCwxMSBAQAogdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAxOwogdW5zaWduZWQgY2hhciBhY3BpX2xlZ2FjeV9kZXZpY2VzOwogCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgYWNwaV9tYWR0X3JldjsKKwordW5zaWduZWQgaW50IGFjcGlfY3BlaV9vdmVycmlkZTsKK3Vuc2lnbmVkIGludCBhY3BpX2NwZWlfcGh5c19jcHVpZDsKKwogI2RlZmluZSBNQVhfU0FQSUNTIDI1NgogdTE2IGlhNjRfYWNwaWlkX3RvX3NhcGljaWRbTUFYX1NBUElDU10gPQogCXsgWzAgLi4uIE1BWF9TQVBJQ1MgLSAxXSA9IC0xIH07CkBAIC0yMzYsOSArMjQyLDcgQEAKIAlpZiAoQkFEX01BRFRfRU5UUlkoaW9zYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpb3NhcGljX2luaXQoaW9zYXBpYy0+YWRkcmVzcywgaW9zYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKLQotCXJldHVybiAwOworCXJldHVybiBpb3NhcGljX2luaXQoaW9zYXBpYy0+YWRkcmVzcywgaW9zYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKIH0KIAogCkBAIC0yNjcsMTAgKzI3MSw1NiBAQAogCQkJCQkJKHBsaW50c3JjLT5mbGFncy50cmlnZ2VyID09IDEpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CiAKIAlwbGF0Zm9ybV9pbnRyX2xpc3RbcGxpbnRzcmMtPnR5cGVdID0gdmVjdG9yOworCWlmIChhY3BpX21hZHRfcmV2ID4gMSkgeworCQlhY3BpX2NwZWlfb3ZlcnJpZGUgPSBwbGludHNyYy0+cGxpbnRfZmxhZ3MuY3BlaV9vdmVycmlkZV9mbGFnOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgcGh5c2ljYWwgaWQsIHNvIHdlIGNhbiBjaGVjayB3aGVuIGl0cyBiZWluZyByZW1vdmVkCisJICovCisJYWNwaV9jcGVpX3BoeXNfY3B1aWQgPSAoKHBsaW50c3JjLT5pZCA8PCA4KSB8IChwbGludHNyYy0+ZWlkKSkgJiAweGZmZmY7CisKIAlyZXR1cm4gMDsKIH0KIAogCit1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCkKK3sKKwlleHRlcm4gaW50IGNwZV92ZWN0b3I7CisKKwkvKgorCSAqIE9ubHkgaWYgQ1BFSSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBvdmVycmlkZSBmbGFnCisJICogaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGF0IGl0cyByZS10YXJnZXR0YWJsZQorCSAqIGlmIHdlIGFyZSBpbiBwb2xsaW5nIG1vZGUuCisJICovCisJaWYgKGNwZV92ZWN0b3IgPiAwICYmICFhY3BpX2NwZWlfb3ZlcnJpZGUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGludCBpc19jcHVfY3BlaV90YXJnZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbG9naWNhbF9pZDsKKworCWxvZ2ljYWxfaWQgPSBjcHVfbG9naWNhbF9pZChhY3BpX2NwZWlfcGh5c19jcHVpZCk7CisKKwlpZiAobG9naWNhbF9pZCA9PSBjcHUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2NwZWlfdGFyZ2V0X2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWFjcGlfY3BlaV9waHlzX2NwdWlkID0gY3B1X3BoeXNpY2FsX2lkKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGludCBnZXRfY3BlaV90YXJnZXRfY3B1KHZvaWQpCit7CisJcmV0dXJuIGFjcGlfY3BlaV9waHlzX2NwdWlkOworfQorCiBzdGF0aWMgaW50IF9faW5pdAogYWNwaV9wYXJzZV9pbnRfc3JjX292ciAoCiAJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0zMjgsNiArMzc4LDggQEAKIAogCWFjcGlfbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fdmEocGh5c19hZGRyKTsKIAorCWFjcGlfbWFkdF9yZXYgPSBhY3BpX21hZHQtPmhlYWRlci5yZXZpc2lvbjsKKwogCS8qIHJlbWVtYmVyIHRoZSB2YWx1ZSBmb3IgcmVmZXJlbmNlIGFmdGVyIGZyZWVfaW5pdG1lbSgpICovCiAjaWZkZWYgQ09ORklHX0lUQU5JVU0KIAloYXNfODI1OSA9IDE7IC8qIEZpcm13YXJlIG9uIG9sZCBJdGFuaXVtIHN5c3RlbXMgaXMgYnJva2VuICovCkBAIC02NDIsOSArNjk0LDExIEBACiAJCQlpZiAoc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdICE9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0gc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOwogCX0KLQlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKICMgZW5kaWYKICNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKKwlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKKyNlbmRpZgogCS8qIE1ha2UgYm9vdC11cCBsb29rIHByZXR0eSAqLwogCXByaW50ayhLRVJOX0lORk8gIiVkIENQVXMgYXZhaWxhYmxlLCAlZCBDUFVzIHRvdGFsXG4iLCBhdmFpbGFibGVfY3B1cywgdG90YWxfY3B1cyk7CiAJcmV0dXJuIDA7CkBAIC03NzIsNyArODI2LDcgQEAKICAKIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgX19kZXZpbml0CiBhY3BpX21hcF9pb3NhcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZXB0aCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKQEAgLTgyNSw0ICs4NzksMjggQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKworaW50CithY3BpX3JlZ2lzdGVyX2lvYXBpYyAoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaW9zYXBpY19pbml0KHBoeXNfYWRkciwgZ3NpX2Jhc2UpKSkKKwkJcmV0dXJuIGVycjsKKworI2lmIENPTkZJR19BQ1BJX05VTUEKKwlhY3BpX21hcF9pb3NhcGljKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7CisjZW5kaWYgLyogQ09ORklHX0FDUElfTlVNQSAqLworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfcmVnaXN0ZXJfaW9hcGljKTsKKworaW50CithY3BpX3VucmVnaXN0ZXJfaW9hcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKK3sKKwlyZXR1cm4gaW9zYXBpY19yZW1vdmUoZ3NpX2Jhc2UpOworfQorRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfaW9hcGljKTsKKwogI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JPT1QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCBiMWQ1ZDNkLi5iYjlhNTA2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC00NzAsMTggKzQ3MCw2IEBACiAJYnIuY29uZC5zcHRrLm1hbnkgYjcKIEVORChsb2FkX3N3aXRjaF9zdGFjaykKIAotR0xPQkFMX0VOVFJZKF9faWE2NF9zeXNjYWxsKQotCS5yZWdzdGsgNiwwLDAsMAotCW1vdiByMTU9aW41CQkJCS8vIHB1dCBzeXNjYWxsIG51bWJlciBpbiBwbGFjZQotCWJyZWFrIF9fQlJFQUtfU1lTQ0FMTAotCW1vdmwgcjI9ZXJybm8KLQljbXAuZXEgcDYscDc9LTEscjEwCi0JOzsKLShwNikJc3Q0IFtyMl09cjgKLShwNikJbW92IHI4PS0xCi0JYnIucmV0LnNwdGsubWFueSBycAotRU5EKF9faWE2NF9zeXNjYWxsKQotCiBHTE9CQUxfRU5UUlkoZXhlY3ZlKQogCW1vdiByMTU9X19OUl9leGVjdmUJCQkvLyBwdXQgc3lzY2FsbCBudW1iZXIgaW4gcGxhY2UKIAlicmVhayBfX0JSRUFLX1NZU0NBTEwKQEAgLTYzNyw3ICs2MjUsNyBAQAogICoJICAgICAgcjgtcjExOiByZXN0b3JlZCAoc3lzY2FsbCByZXR1cm4gdmFsdWUocykpCiAgKgkJIHIxMjogcmVzdG9yZWQgKHVzZXItbGV2ZWwgc3RhY2sgcG9pbnRlcikKICAqCQkgcjEzOiByZXN0b3JlZCAodXNlci1sZXZlbCB0aHJlYWQgcG9pbnRlcikKLSAqCQkgcjE0OiBjbGVhcmVkCisgKgkJIHIxNDogc2V0IHRvIF9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYwogICoJCSByMTU6IHJlc3RvcmVkIChzeXNjYWxsICMpCiAgKgkgICAgIHIxNi1yMTc6IGNsZWFyZWQKICAqCQkgcjE4OiB1c2VyLWxldmVsIGI2CkBAIC02NTgsNyArNjQ2LDcgQEAKICAqCQkgIHByOiByZXN0b3JlZCAodXNlci1sZXZlbCBwcikKICAqCQkgIGIwOiByZXN0b3JlZCAodXNlci1sZXZlbCBycCkKICAqCSAgICAgICAgICBiNjogcmVzdG9yZWQKLSAqCQkgIGI3OiBjbGVhcmVkCisgKgkJICBiNzogc2V0IHRvIF9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYwogICoJICAgICBhci51bmF0OiByZXN0b3JlZCAodXNlci1sZXZlbCBhci51bmF0KQogICoJICAgICAgYXIucGZzOiByZXN0b3JlZCAodXNlci1sZXZlbCBhci5wZnMpCiAgKgkgICAgICBhci5yc2M6IHJlc3RvcmVkICh1c2VyLWxldmVsIGFyLnJzYykKQEAgLTcwNCw3MiArNjkyLDc5IEBACiAJOzsKIChwNikJbGQ0IHIzMT1bcjE4XQkJCQkvLyBsb2FkIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MKIAlsZDggcjE5PVtyMl0sUFQoQjYpLVBUKExPQURSUykJCS8vIGxvYWQgYXIucnNjIHZhbHVlIGZvciAibG9hZHJzIgotCW1vdiBiNz1yMAkJLy8gY2xlYXIgYjcKKwlub3AuaSAwCiAJOzsKLQlsZDggcjIzPVtyM10sUFQoUjExKS1QVChBUl9CU1BTVE9SRSkJLy8gbG9hZCBhci5ic3BzdG9yZSAobWF5IGJlIGdhcmJhZ2UpCisJbW92IHIxNj1hci5ic3AJCQkJLy8gTTIgIGdldCBleGlzdGluZyBiYWNraW5nIHN0b3JlIHBvaW50ZXIKIAlsZDggcjE4PVtyMl0sUFQoUjkpLVBUKEI2KQkJLy8gbG9hZCBiNgogKHA2KQlhbmQgcjE1PVRJRl9XT1JLX01BU0sscjMxCQkvLyBhbnkgd29yayBvdGhlciB0aGFuIFRJRl9TWVNDQUxMX1RSQUNFPwogCTs7Ci0JbW92IHIxNj1hci5ic3AJCQkJLy8gTTIgIGdldCBleGlzdGluZyBiYWNraW5nIHN0b3JlIHBvaW50ZXIKKwlsZDggcjIzPVtyM10sUFQoUjExKS1QVChBUl9CU1BTVE9SRSkJLy8gbG9hZCBhci5ic3BzdG9yZSAobWF5IGJlIGdhcmJhZ2UpCiAocDYpCWNtcDQubmUudW5jIHA2LHAwPXIxNSwgcjAJCS8vIGFueSBzcGVjaWFsIHdvcmsgcGVuZGluZz8KIChwNikJYnIuY29uZC5zcG50IC53b3JrX3BlbmRpbmdfc3lzY2FsbAogCTs7CiAJLy8gc3RhcnQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBzYXZlZCBvbiB0aGUga2VybmVsIHN0YWNrIChzdHJ1Y3QgcHRfcmVncyk6CiAJbGQ4IHI5PVtyMl0sUFQoQ1JfSVBTUiktUFQoUjkpCiAJbGQ4IHIxMT1bcjNdLFBUKENSX0lJUCktUFQoUjExKQotCW1vdiBmNj1mMAkJLy8gY2xlYXIgZjYKKyhwTm9uU3lzKSBicmVhayAwCQkvLyAgICAgIGJ1ZyBjaGVjazogd2Ugc2hvdWxkbid0IGJlIGhlcmUgaWYgcE5vblN5cyBpcyBUUlVFIQogCTs7CiAJaW52YWxhCQkJLy8gTTB8MSBpbnZhbGlkYXRlIEFMQVQKLQlyc20gcHNyLmkgfCBwc3IuaWMJLy8gTTIgaW5pdGlhdGUgdHVybmluZyBvZmYgb2YgaW50ZXJydXB0IGFuZCBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbgotCW1vdiBmOT1mMAkJLy8gY2xlYXIgZjkKKwlyc20gcHNyLmkgfCBwc3IuaWMJLy8gTTIgICB0dXJuIG9mZiBpbnRlcnJ1cHRzIGFuZCBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbgorCWNtcC5lcSBwOSxwMD1yMCxyMAkvLyBBICAgIHNldCBwOSB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCByZXN0b3JlIGNyLmlmcwogCi0JbGQ4IHIyOT1bcjJdLDE2CQkvLyBsb2FkIGNyLmlwc3IKLQlsZDggcjI4PVtyM10sMTYJCQkvLyBsb2FkIGNyLmlpcAotCW1vdiBmOD1mMAkJLy8gY2xlYXIgZjgKKwlsZDggcjI5PVtyMl0sMTYJCS8vIE0wfDEgbG9hZCBjci5pcHNyCisJbGQ4IHIyOD1bcjNdLDE2CQkvLyBNMHwxIGxvYWQgY3IuaWlwCisJbW92IHIyMj1yMAkJLy8gQSAgICBjbGVhciByMjIKIAk7OwogCWxkOCByMzA9W3IyXSwxNgkJLy8gTTB8MSBsb2FkIGNyLmlmcwogCWxkOCByMjU9W3IzXSwxNgkJLy8gTTB8MSBsb2FkIGFyLnVuYXQKLQljbXAuZXEgcDkscDA9cjAscjAJLy8gc2V0IHA5IHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHJlc3RvcmUgY3IuaWZzCi0JOzsKLQlsZDggcjI2PVtyMl0sUFQoQjApLVBUKEFSX1BGUykJLy8gTTB8MSBsb2FkIGFyLnBmcwotKHBLU3RrKQltb3YgcjIyPXBzcgkJLy8gTTIgcmVhZCBQU1Igbm93IHRoYXQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKLQltb3YgZjEwPWYwCQkvLyBjbGVhciBmMTAKLQk7OwotCWxkOCByMjE9W3IyXSxQVChBUl9STkFUKS1QVChCMCkgLy8gbG9hZCBiMAotCWxkOCByMjc9W3IzXSxQVChQUiktUFQoQVJfUlNDKQkvLyBsb2FkIGFyLnJzYwotCW1vdiBmMTE9ZjAJCS8vIGNsZWFyIGYxMQotCTs7Ci0JbGQ4IHIyND1bcjJdLFBUKEFSX0ZQU1IpLVBUKEFSX1JOQVQpCS8vIGxvYWQgYXIucm5hdCAobWF5IGJlIGdhcmJhZ2UpCi0JbGQ4IHIzMT1bcjNdLFBUKFIxKS1QVChQUikJCS8vIGxvYWQgcHJlZGljYXRlcwogKHBVU3RrKSBhZGQgcjE0PUlBNjRfVEFTS19USFJFQURfT05fVVNUQUNLX09GRlNFVCxyMTMKIAk7OwotCWxkOCByMjA9W3IyXSxQVChSMTIpLVBUKEFSX0ZQU1IpCS8vIGxvYWQgYXIuZnBzcgotCWxkOC5maWxsIHIxPVtyM10sMTYJLy8gbG9hZCByMQotKHBVU3RrKSBtb3YgcjE3PTEKKwlsZDggcjI2PVtyMl0sUFQoQjApLVBUKEFSX1BGUykJLy8gTTB8MSBsb2FkIGFyLnBmcworKHBLU3RrKQltb3YgcjIyPXBzcgkJCS8vIE0yICAgcmVhZCBQU1Igbm93IHRoYXQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwlub3AgMAogCTs7Ci0Jc3Jsei5kCQkJLy8gTTAgIGVuc3VyZSBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbiBpcyBvZmYKLQlsZDguZmlsbCByMTM9W3IzXSwxNgotCW1vdiBmNz1mMAkJLy8gY2xlYXIgZjcKKwlsZDggcjIxPVtyMl0sUFQoQVJfUk5BVCktUFQoQjApIC8vIE0wfDEgbG9hZCBiMAorCWxkOCByMjc9W3IzXSxQVChQUiktUFQoQVJfUlNDKQkvLyBNMHwxIGxvYWQgYXIucnNjCisJbW92IGY2PWYwCQkJLy8gRiAgICBjbGVhciBmNgogCTs7Ci0JbGQ4LmZpbGwgcjEyPVtyMl0JLy8gcmVzdG9yZSByMTIgKHNwKQotCW1vdi5tIGFyLnNzZD1yMAkJLy8gTTIgY2xlYXIgYXIuc3NkCi0JbW92IHIyMj1yMAkJLy8gY2xlYXIgcjIyCisJbGQ4IHIyND1bcjJdLFBUKEFSX0ZQU1IpLVBUKEFSX1JOQVQpCS8vIE0wfDEgbG9hZCBhci5ybmF0IChtYXkgYmUgZ2FyYmFnZSkKKwlsZDggcjMxPVtyM10sUFQoUjEpLVBUKFBSKQkJLy8gTTB8MSBsb2FkIHByZWRpY2F0ZXMKKwltb3YgZjc9ZjAJCQkJLy8gRiAgICBjbGVhciBmNworCTs7CisJbGQ4IHIyMD1bcjJdLFBUKFIxMiktUFQoQVJfRlBTUikJLy8gTTB8MSBsb2FkIGFyLmZwc3IKKwlsZDguZmlsbCByMT1bcjNdLDE2CQkJLy8gTTB8MSBsb2FkIHIxCisocFVTdGspIG1vdiByMTc9MQkJCQkvLyBBCisJOzsKKyhwVVN0aykgc3QxIFtyMTRdPXIxNwkJCQkvLyBNMnwzCisJbGQ4LmZpbGwgcjEzPVtyM10sMTYJCQkvLyBNMHwxCisJbW92IGY4PWYwCQkJCS8vIEYgICAgY2xlYXIgZjgKKwk7OworCWxkOC5maWxsIHIxMj1bcjJdCQkJLy8gTTB8MSByZXN0b3JlIHIxMiAoc3ApCisJbGQ4LmZpbGwgcjE1PVtyM10JCQkvLyBNMHwxIHJlc3RvcmUgcjE1CisJbW92IGI2PXIxOAkJCQkvLyBJMCAgIHJlc3RvcmUgYjYKIAotCWxkOC5maWxsIHIxNT1bcjNdCS8vIHJlc3RvcmUgcjE1Ci0ocFVTdGspIHN0MSBbcjE0XT1yMTcKLQlhZGRsIHIzPVRISVNfQ1BVKGlhNjRfcGh5c19zdGFja2VkX3NpemVfcDgpLHIwCi0JOzsKLShwVVN0aykJbGQ0IHIxNz1bcjNdCQkvLyByMTcgPSBjcHVfZGF0YS0+cGh5c19zdGFja2VkX3NpemVfcDgKLQltb3YubSBhci5jc2Q9cjAJCS8vIE0yIGNsZWFyIGFyLmNzZAotCW1vdiBiNj1yMTgJCS8vIEkwICByZXN0b3JlIGI2Ci0JOzsKLQltb3YgcjE0PXIwCQkvLyBjbGVhciByMTQKLQlzaHIudSByMTg9cjE5LDE2CS8vIEkwfDEgZ2V0IGJ5dGUgc2l6ZSBvZiBleGlzdGluZyAiZGlydHkiIHBhcnRpdGlvbgotKHBLU3RrKSBici5jb25kLmRwbnQubWFueSBza2lwX3Jic19zd2l0Y2gKKwlhZGRsIHIxNz1USElTX0NQVShpYTY0X3BoeXNfc3RhY2tlZF9zaXplX3A4KSxyMCAvLyBBCisJbW92IGY5PWYwCQkJCQkvLyBGICAgIGNsZWFyIGY5CisocEtTdGspIGJyLmNvbmQuZHBudC5tYW55IHNraXBfcmJzX3N3aXRjaAkJLy8gQgogCi0JbW92Lm0gYXIuY2N2PXIwCQkvLyBjbGVhciBhci5jY3YKLShwTm9uU3lzKSBici5jb25kLmRwbnQubWFueSBkb250X3ByZXNlcnZlX2N1cnJlbnRfZnJhbWUKLQlici5jb25kLnNwdGsubWFueSByYnNfc3dpdGNoCisJc3Jsei5kCQkJCS8vIE0wICAgZW5zdXJlIGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9mZiAoZm9yIGNvdmVyKQorCXNoci51IHIxOD1yMTksMTYJCS8vIEkwfDEgZ2V0IGJ5dGUgc2l6ZSBvZiBleGlzdGluZyAiZGlydHkiIHBhcnRpdGlvbgorCWNvdmVyCQkJCS8vIEIgICAgYWRkIGN1cnJlbnQgZnJhbWUgaW50byBkaXJ0eSBwYXJ0aXRpb24gJiBzZXQgY3IuaWZzCisJOzsKKyhwVVN0aykgbGQ0IHIxNz1bcjE3XQkJCS8vIE0wfDEgcjE3ID0gY3B1X2RhdGEtPnBoeXNfc3RhY2tlZF9zaXplX3A4CisJbW92IHIxOT1hci5ic3AJCQkvLyBNMiAgIGdldCBuZXcgYmFja2luZyBzdG9yZSBwb2ludGVyCisJbW92IGYxMD1mMAkJCS8vIEYgICAgY2xlYXIgZjEwCisKKwlub3AubSAwCisJbW92bCByMTQ9X19rZXJuZWxfc3lzY2FsbF92aWFfZXBjIC8vIFgKKwk7OworCW1vdi5tIGFyLmNzZD1yMAkJCS8vIE0yICAgY2xlYXIgYXIuY3NkCisJbW92Lm0gYXIuY2N2PXIwCQkJLy8gTTIgICBjbGVhciBhci5jY3YKKwltb3YgYjc9cjE0CQkJLy8gSTAgICBjbGVhciBiNyAoaGludCB3aXRoIF9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYykKKworCW1vdi5tIGFyLnNzZD1yMAkJCS8vIE0yICAgY2xlYXIgYXIuc3NkCisJbW92IGYxMT1mMAkJCS8vIEYgICAgY2xlYXIgZjExCisJYnIuY29uZC5zcHRrLm1hbnkgcmJzX3N3aXRjaAkvLyBCCiBFTkQoaWE2NF9sZWF2ZV9zeXNjYWxsKQogCiAjaWZkZWYgQ09ORklHX0lBMzJfU1VQUE9SVApAQCAtODg1LDcgKzg4MCw3IEBACiAJbGRmLmZpbGwgZjc9W3IyXSxQVChGMTEpLVBUKEY3KQogCWxkZi5maWxsIGY4PVtyM10sMzIKIAk7OwotCXNybHouaQkJCS8vIGVuc3VyZSBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbiBpcyBvZmYKKwlzcmx6LmQJLy8gZW5zdXJlIHRoYXQgaW50ZXIuIGNvbGxlY3Rpb24gaXMgb2ZmIChWSFBUIGlzIGRvbid0IGNhcmUsIHNpbmNlIHRleHQgaXMgcGlubmVkKQogCW1vdiBhci5jY3Y9cjE1CiAJOzsKIAlsZGYuZmlsbCBmMTE9W3IyXQpAQCAtOTQ1LDExICs5NDAsMTAgQEAKIAkgKiBOT1RFOiBhbGxvYywgbG9hZHJzLCBhbmQgY292ZXIgY2FuJ3QgYmUgcHJlZGljYXRlZC4KIAkgKi8KIChwTm9uU3lzKSBici5jb25kLmRwbnQgZG9udF9wcmVzZXJ2ZV9jdXJyZW50X2ZyYW1lCi0KLXJic19zd2l0Y2g6CiAJY292ZXIJCQkJLy8gYWRkIGN1cnJlbnQgZnJhbWUgaW50byBkaXJ0eSBwYXJ0aXRpb24gYW5kIHNldCBjci5pZnMKIAk7OwogCW1vdiByMTk9YXIuYnNwCQkJLy8gZ2V0IG5ldyBiYWNraW5nIHN0b3JlIHBvaW50ZXIKK3Jic19zd2l0Y2g6CiAJc3ViIHIxNj1yMTYscjE4CQkJLy8ga3JicyA9IG9sZCBic3AgLSBzaXplIG9mIGRpcnR5IHBhcnRpdGlvbgogCWNtcC5uZSBwOSxwMD1yMCxyMAkJLy8gY2xlYXIgcDkgdG8gc2tpcCByZXN0b3JlIG9mIGNyLmlmcwogCTs7CkBAIC0xMDI0LDE0ICsxMDE4LDE0IEBACiAJbW92IGxvYzU9MAogCW1vdiBsb2M2PTAKIAltb3YgbG9jNz0wCi0ocFJlY3Vyc2UpIGJyLmNhbGwuc3B0ay5mZXcgYjA9cnNlX2NsZWFyX2ludmFsaWQKKyhwUmVjdXJzZSkgYnIuY2FsbC5kcHRrLmZldyBiMD1yc2VfY2xlYXJfaW52YWxpZAogCTs7CiAJbW92IGxvYzg9MAogCW1vdiBsb2M5PTAKIAljbXAubmUgcFJldHVybixwMD1yMCxpbjEJLy8gaWYgcmVjdXJzaW9uIGNvdW50ICE9IDAsIHdlIG5lZWQgdG8gZG8gYSBici5yZXQKIAltb3YgbG9jMTA9MAogCW1vdiBsb2MxMT0wCi0ocFJldHVybikgYnIucmV0LnNwdGsubWFueSBiMAorKHBSZXR1cm4pIGJyLnJldC5kcHRrLm1hbnkgYjAKICNlbmRpZiAvKiAhQ09ORklHX0lUQU5JVU0gKi8KICMJdW5kZWYgcFJlY3Vyc2UKICMJdW5kZWYgcFJldHVybgpAQCAtMTI1NSw3ICsxMjQ5LDcgQEAKICAJc3RmLnNwaWxsIFtyMTddPWYxMQogCWFkZHMgb3V0MD0xNixzcAkJCQkvLyBvdXQwID0gJnNpZ3NjcmF0Y2gKIAlici5jYWxsLnNwdGsubWFueSBycD1pYTY0X3J0X3NpZ3JldHVybgotLnJldDE5OgkucmVzdG9yZSBzcCAwCisucmV0MTk6CS5yZXN0b3JlIHNwLDAKIAlhZGRzIHNwPTE2LHNwCiAJOzsKIAlsZDggcjk9W3NwXQkJCQkvLyBsb2FkIG5ldyBhci51bmF0CkBAIC0xNTc3LDggKzE1NzEsOCBAQAogCWRhdGE4IHN5c19hZGRfa2V5CiAJZGF0YTggc3lzX3JlcXVlc3Rfa2V5CiAJZGF0YTggc3lzX2tleWN0bAotCWRhdGE4IHN5c19uaV9zeXNjYWxsCi0JZGF0YTggc3lzX25pX3N5c2NhbGwJCQkvLyAxMjc1CisJZGF0YTggc3lzX2lvcHJpb19zZXQKKwlkYXRhOCBzeXNfaW9wcmlvX2dldAkJCS8vIDEyNzUKIAlkYXRhOCBzeXNfc2V0X3pvbmVfcmVjbGFpbQogCWRhdGE4IHN5c19uaV9zeXNjYWxsCiAJZGF0YTggc3lzX25pX3N5c2NhbGwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKaW5kZXggOTYyYjZjNC4uN2Q3Njg0YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKQEAgLTUzMSw5MyArNTMxLDExNCBAQAogCS5hbHRycCBiNgogCS5ib2R5CiAJLyoKLQkgKiBXZSBnZXQgaGVyZSBmb3Igc3lzY2FsbHMgdGhhdCBkb24ndCBoYXZlIGEgbGlnaHR3ZWlnaHQgaGFuZGxlci4gIEZvciB0aG9zZSwgd2UKLQkgKiBuZWVkIHRvIGJ1YmJsZSBkb3duIGludG8gdGhlIGtlcm5lbCBhbmQgdGhhdCByZXF1aXJlcyBzZXR0aW5nIHVwIGEgbWluaW1hbAotCSAqIHB0X3JlZ3Mgc3RydWN0dXJlLCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBDUFUgc3RhdGUgbW9yZSBvciBsZXNzIGFzIGlmIGFuCi0JICogaW50ZXJydXB0aW9uIGhhZCBvY2N1cnJlZC4gIFRvIG1ha2Ugc3lzY2FsbC1yZXN0YXJ0cyB3b3JrLCB3ZSBzZXR1cCBwdF9yZWdzCi0JICogc3VjaCB0aGF0IGNyX2lpcCBwb2ludHMgdG8gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpbiBzeXNjYWxsX3ZpYV9icmVhay4KLQkgKiBEZWNyZW1lbnRpbmcgdGhlIElQIGhlbmNlIHdpbGwgcmVzdGFydCB0aGUgc3lzY2FsbCB2aWEgYnJlYWsgYW5kIG5vdAotCSAqIGRlY3JlbWVudGluZyBJUCB3aWxsIHJldHVybiB1cyB0byB0aGUgY2FsbGVyLCBhcyB1c3VhbC4gIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZQotCSAqIHRoZSB2YWx1ZSBvZiBwc3IucHAgcmF0aGVyIHRoYW4gaW5pdGlhbGl6aW5nIGl0IGZyb20gZGNyLnBwLiAgVGhpcyBtYWtlcyBpdAotCSAqIHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZzeXNjYWxsIGV4ZWN1dGlvbiBmcm9tIG90aGVyIHByaXZpbGVnZWQgZXhlY3V0aW9uLgorCSAqIFdlIGdldCBoZXJlIGZvciBzeXNjYWxscyB0aGF0IGRvbid0IGhhdmUgYSBsaWdodHdlaWdodAorCSAqIGhhbmRsZXIuICBGb3IgdGhvc2UsIHdlIG5lZWQgdG8gYnViYmxlIGRvd24gaW50byB0aGUga2VybmVsCisJICogYW5kIHRoYXQgcmVxdWlyZXMgc2V0dGluZyB1cCBhIG1pbmltYWwgcHRfcmVncyBzdHJ1Y3R1cmUsCisJICogYW5kIGluaXRpYWxpemluZyB0aGUgQ1BVIHN0YXRlIG1vcmUgb3IgbGVzcyBhcyBpZiBhbgorCSAqIGludGVycnVwdGlvbiBoYWQgb2NjdXJyZWQuICBUbyBtYWtlIHN5c2NhbGwtcmVzdGFydHMgd29yaywKKwkgKiB3ZSBzZXR1cCBwdF9yZWdzIHN1Y2ggdGhhdCBjcl9paXAgcG9pbnRzIHRvIHRoZSBzZWNvbmQKKwkgKiBpbnN0cnVjdGlvbiBpbiBzeXNjYWxsX3ZpYV9icmVhay4gIERlY3JlbWVudGluZyB0aGUgSVAKKwkgKiBoZW5jZSB3aWxsIHJlc3RhcnQgdGhlIHN5c2NhbGwgdmlhIGJyZWFrIGFuZCBub3QKKwkgKiBkZWNyZW1lbnRpbmcgSVAgd2lsbCByZXR1cm4gdXMgdG8gdGhlIGNhbGxlciwgYXMgdXN1YWwuCisJICogTm90ZSB0aGF0IHdlIHByZXNlcnZlIHRoZSB2YWx1ZSBvZiBwc3IucHAgcmF0aGVyIHRoYW4KKwkgKiBpbml0aWFsaXppbmcgaXQgZnJvbSBkY3IucHAuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisJICogZGlzdGluZ3Vpc2ggZnN5c2NhbGwgZXhlY3V0aW9uIGZyb20gb3RoZXIgcHJpdmlsZWdlZAorCSAqIGV4ZWN1dGlvbi4KIAkgKgogCSAqIE9uIGVudHJ5OgotCSAqCS0gbm9ybWFsIGZzeXNjYWxsIGhhbmRsZXIgcmVnaXN0ZXIgdXNhZ2UsIGV4Y2VwdCB0aGF0IHdlIGFsc28gaGF2ZToKKwkgKgktIG5vcm1hbCBmc3lzY2FsbCBoYW5kbGVyIHJlZ2lzdGVyIHVzYWdlLCBleGNlcHQKKwkgKgkgIHRoYXQgd2UgYWxzbyBoYXZlOgogCSAqCS0gcjE4OiBhZGRyZXNzIG9mIHN5c2NhbGwgZW50cnkgcG9pbnQKIAkgKgktIHIyMTogYXIuZnBzcgogCSAqCS0gcjI2OiBhci5wZnMKIAkgKgktIHIyNzogYXIucnNjCiAJICoJLSByMjk6IHBzcgorCSAqCisJICogV2UgdXNlZCB0byBjbGVhciBzb21lIFBTUiBiaXRzIGhlcmUgYnV0IHRoYXQgcmVxdWlyZXMgc2xvdworCSAqIHNlcmlhbGl6YXRpb24uICBGb3J0dW50ZWx5LCB0aGF0IGlzbid0IHJlYWxseSBuZWNlc3NhcnkuCisJICogVGhlIHJhdGlvbmFsZSBpcyBhcyBmb2xsb3dzOiB3ZSB1c2VkIHRvIGNsZWFyIGJpdHMKKwkgKiB+UFNSX1BSRVNFUlZFRF9CSVRTIGluIFBTUi5MLiAgU2luY2UKKwkgKiBQU1JfUFJFU0VSVkVEX0JJVFM9PVBTUi57VVAsTUZMLE1GSCxQSyxEVCxQUCxTUCxSVCxJQ30sIHdlCisJICogZW5kZWQgdXAgY2xlYXJpbmcgUFNSLntCRSxBQyxJLERGTCxERkgsREksREIsU0ksVEJ9LgorCSAqIEhvd2V2ZXIsCisJICoKKwkgKiBQU1IuQkUgOiBhbHJlYWR5IGlzIHR1cm5lZCBvZmYgaW4gX19rZXJuZWxfc3lzY2FsbF92aWFfZXBjKCkKKwkgKiBQU1IuQUMgOiBkb24ndCBjYXJlIChrZXJuZWwgbm9ybWFsbHkgdHVybnMgUFNSLkFDIG9uKQorCSAqIFBTUi5JICA6IGFscmVhZHkgdHVybmVkIG9mZiBieSB0aGUgdGltZSBmc3lzX2J1YmJsZV9kb3duIGdldHMKKwkgKgkgICAgaW52b2tlZAorCSAqIFBTUi5ERkw6IGFsd2F5cyAwIChrZXJuZWwgbmV2ZXIgdHVybnMgaXQgb24pCisJICogUFNSLkRGSDogZG9uJ3QgY2FyZSAtLS0ga2VybmVsIG5ldmVyIHRvdWNoZXMgZjMyLWYxMjcgb24gaXRzIG93bgorCSAqCSAgICBpbml0aWF0aXZlCisJICogUFNSLkRJIDogYWx3YXlzIDAgKGtlcm5lbCBuZXZlciB0dXJucyBpdCBvbikKKwkgKiBQU1IuU0kgOiBhbHdheXMgMCAoa2VybmVsIG5ldmVyIHR1cm5zIGl0IG9uKQorCSAqIFBTUi5EQiA6IGRvbid0IGNhcmUgLS0tIGtlcm5lbCBuZXZlciBlbmFibGVzIGtlcm5lbC1sZXZlbAorCSAqCSAgICBicmVha3BvaW50cworCSAqIFBTUi5UQiA6IG11c3QgYmUgMCBhbHJlYWR5OyBpZiBpdCB3YXNuJ3QgemVybyBvbiBlbnRyeSB0bworCSAqICAgICAgICAgIF9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYywgdGhlIGJyYW5jaCB0byBmc3lzX2J1YmJsZV9kb3duCisJICogICAgICAgICAgd2lsbCB0cmlnZ2VyIGEgdGFrZW4gYnJhbmNoOyB0aGUgdGFrZW4tdHJhcC1oYW5kbGVyIHRoZW4KKwkgKiAgICAgICAgICBjb252ZXJ0cyB0aGUgc3lzY2FsbCBpbnRvIGEgYnJlYWstYmFzZWQgc3lzdGVtLWNhbGwuCiAJICovCi0jCWRlZmluZSBQU1JfUFJFU0VSVkVEX0JJVFMJKElBNjRfUFNSX1VQIHwgSUE2NF9QU1JfTUZMIHwgSUE2NF9QU1JfTUZIIHwgSUE2NF9QU1JfUEsgXAotCQkJCQkgfCBJQTY0X1BTUl9EVCB8IElBNjRfUFNSX1BQIHwgSUE2NF9QU1JfU1AgfCBJQTY0X1BTUl9SVCBcCi0JCQkJCSB8IElBNjRfUFNSX0lDKQogCS8qCi0JICogUmVhZGluZyBwc3IubCBnaXZlcyB1cyBvbmx5IGJpdHMgMC0zMSwgcHNyLml0LCBhbmQgcHNyLm1jLiAgVGhlIHJlc3Qgd2UgaGF2ZQotCSAqIHRvIHN5bnRoZXNpemUuCisJICogUmVhZGluZyBwc3IubCBnaXZlcyB1cyBvbmx5IGJpdHMgMC0zMSwgcHNyLml0LCBhbmQgcHNyLm1jLgorCSAqIFRoZSByZXN0IHdlIGhhdmUgdG8gc3ludGhlc2l6ZS4KIAkgKi8KLSMJZGVmaW5lIFBTUl9PTkVfQklUUwkJKCgzIDw8IElBNjRfUFNSX0NQTDBfQklUKSB8ICgweDEgPDwgSUE2NF9QU1JfUklfQklUKSBcCisjCWRlZmluZSBQU1JfT05FX0JJVFMJCSgoMyA8PCBJQTY0X1BTUl9DUEwwX0JJVCkJXAorCQkJCQkgfCAoMHgxIDw8IElBNjRfUFNSX1JJX0JJVCkJXAogCQkJCQkgfCBJQTY0X1BTUl9CTiB8IElBNjRfUFNSX0kpCiAKLQlpbnZhbGEKLQltb3ZsIHI4PVBTUl9PTkVfQklUUworCWludmFsYQkJCQkJLy8gTTB8MQorCW1vdmwgcjE0PWlhNjRfcmV0X2Zyb21fc3lzY2FsbAkJLy8gWAogCi0JbW92IHIyNT1hci51bmF0CQkJLy8gc2F2ZSBhci51bmF0ICg1IGN5YykKLQltb3ZsIHI5PVBTUl9QUkVTRVJWRURfQklUUworCW5vcC5tIDAKKwltb3ZsIHIyOD1fX2tlcm5lbF9zeXNjYWxsX3ZpYV9icmVhawkvLyBYCWNyZWF0ZSBjci5paXAKKwk7OwogCi0JbW92IGFyLnJzYz0wCQkJLy8gc2V0IGVuZm9yY2VkIGxhenkgbW9kZSwgcGwgMCwgbGl0dGxlLWVuZGlhbiwgbG9hZHJzPTAKLQltb3ZsIHIyOD1fX2tlcm5lbF9zeXNjYWxsX3ZpYV9icmVhaworCW1vdiByMj1yMTYJCQkJLy8gQSAgICBnZXQgdGFzayBhZGRyIHRvIGFkZGwtYWRkcmVzc2FibGUgcmVnaXN0ZXIKKwlhZGRzIHIxNj1JQTY0X1RBU0tfVEhSRUFEX09OX1VTVEFDS19PRkZTRVQscjE2IC8vIEEKKwltb3YgcjMxPXByCQkJCS8vIEkwICAgc2F2ZSBwciAoMiBjeWMpCiAJOzsKLQltb3YgcjIzPWFyLmJzcHN0b3JlCQkvLyBzYXZlIGFyLmJzcHN0b3JlICgxMiBjeWMpCi0JbW92IHIzMT1wcgkJCS8vIHNhdmUgcHIgKDIgY3ljKQotCW1vdiByMjA9cjEJCQkvLyBzYXZlIGNhbGxlcidzIGdwIGluIHIyMAorCXN0MSBbcjE2XT1yMAkJCQkvLyBNMnwzIGNsZWFyIGN1cnJlbnQtPnRocmVhZC5vbl91c3RhY2sgZmxhZworCWFkZGwgcjIyPUlBNjRfUkJTX09GRlNFVCxyMgkJLy8gQSAgICBjb21wdXRlIGJhc2Ugb2YgUkJTCisJYWRkIHIzPVRJX0ZMQUdTK0lBNjRfVEFTS19TSVpFLHIyCS8vIEEKIAk7OwotCW1vdiByMj1yMTYJCQkvLyBjb3B5IGN1cnJlbnQgdGFzayBhZGRyIHRvIGFkZGwtYWRkcmVzc2FibGUgcmVnaXN0ZXIKLQlhbmQgcjk9cjkscjI5Ci0JbW92IHIxOT1iNgkJCS8vIHNhdmUgYjYgKDIgY3ljKQorCWxkNCByMz1bcjNdCQkJCS8vIE0wfDEgcjMgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzCisJbGZldGNoLmZhdWx0LmV4Y2wubnQxIFtyMjJdCQkvLyBNMHwxIHByZWZldGNoIHJlZ2lzdGVyIGJhY2tpbmctc3RvcmUKKwlub3AuaSAwCiAJOzsKLQltb3YgcHNyLmw9cjkJCQkvLyBzbGFtIHRoZSBkb29yICgxNyBjeWMgdG8gc3Jsei5pKQotCW9yIHIyOT1yOCxyMjkJCQkvLyBjb25zdHJ1Y3QgY3IuaXBzciB2YWx1ZSB0byBzYXZlCi0JYWRkbCByMjI9SUE2NF9SQlNfT0ZGU0VULHIyCS8vIGNvbXB1dGUgYmFzZSBvZiBSQlMKKwltb3YgYXIucnNjPTAJCQkJLy8gTTIgICBzZXQgZW5mb3JjZWQgbGF6eSBtb2RlLCBwbCAwLCBMRSwgbG9hZHJzPTAKKwlub3AubSAwCisJbm9wLmkgMAogCTs7Ci0JLy8gR0FTIHJlcG9ydHMgYSBzcHVyaW91cyBSQVcgaGF6YXJkIG9uIHRoZSByZWFkIG9mIGFyLnJuYXQgYmVjYXVzZSBpdCB0aGlua3MKLQkvLyB3ZSBtYXkgYmUgcmVhZGluZyBhci5pdGMgYWZ0ZXIgd3JpdGluZyB0byBwc3IubC4gIEF2b2lkIHRoYXQgbWVzc2FnZSB3aXRoCi0JLy8gdGhpcyBkaXJlY3RpdmU6Ci0JZHZfc2VyaWFsaXplX2RhdGEKLQltb3YubSByMjQ9YXIucm5hdAkJLy8gcmVhZCBhci5ybmF0ICg1IGN5YyBsYXQpCi0JbGZldGNoLmZhdWx0LmV4Y2wubnQxIFtyMjJdCi0JYWRkcyByMTY9SUE2NF9UQVNLX1RIUkVBRF9PTl9VU1RBQ0tfT0ZGU0VULHIyCisJbW92IHIyMz1hci5ic3BzdG9yZQkJCS8vIE0yICgxMiBjeWMpIHNhdmUgYXIuYnNwc3RvcmUKKwltb3YubSByMjQ9YXIucm5hdAkJCS8vIE0yICg1IGN5YykgcmVhZCBhci5ybmF0IChkdWFsLWlzc3VlcyEpCisJbm9wLmkgMAorCTs7CisJbW92IGFyLmJzcHN0b3JlPXIyMgkJCS8vIE0yICg2IGN5Yykgc3dpdGNoIHRvIGtlcm5lbCBSQlMKKwltb3ZsIHI4PVBTUl9PTkVfQklUUwkJCS8vIFgKKwk7OworCW1vdiByMjU9YXIudW5hdAkJCQkvLyBNMiAoNSBjeWMpIHNhdmUgYXIudW5hdAorCW1vdiByMTk9YjYJCQkJLy8gSTAgICBzYXZlIGI2ICgyIGN5YykKKwltb3YgcjIwPXIxCQkJCS8vIEEgICAgc2F2ZSBjYWxsZXIncyBncCBpbiByMjAKKwk7OworCW9yIHIyOT1yOCxyMjkJCQkJLy8gQSAgICBjb25zdHJ1Y3QgY3IuaXBzciB2YWx1ZSB0byBzYXZlCisJbW92IGI2PXIxOAkJCQkvLyBJMCAgIGNvcHkgc3lzY2FsbCBlbnRyeS1wb2ludCB0byBiNiAoNyBjeWMpCisJYWRkbCByMT1JQTY0X1NUS19PRkZTRVQtSUE2NF9QVF9SRUdTX1NJWkUscjIgLy8gQSBjb21wdXRlIGJhc2Ugb2YgbWVtb3J5IHN0YWNrCiAKLQkvLyBlbnN1cmUgcHJldmlvdXMgaW5zbiBncm91cCBpcyBpc3N1ZWQgYmVmb3JlIHdlIHN0YWxsIGZvciBzcmx6Lmk6CisJbW92IHIxOD1hci5ic3AJCQkJLy8gTTIgICBzYXZlIChrZXJuZWwpIGFyLmJzcCAoMTIgY3ljKQorCWNtcC5uZSBwS1N0ayxwVVN0az1yMCxyMAkJLy8gQSAgICBzZXQgcEtTdGsgPC0gMCwgcFVTdGsgPC0gMQorCWJyLmNhbGwuc3B0ay5tYW55IGI3PWlhNjRfc3lzY2FsbF9zZXR1cAkvLyBCCiAJOzsKLQlzcmx6LmkJCQkJLy8gZW5zdXJlIG5ldyBwc3IubCBoYXMgYmVlbiBlc3RhYmxpc2hlZAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8vLy8vLy8vLyBmcm9tIHRoaXMgcG9pbnQgb24sIGV4ZWN1dGlvbiBpcyBub3QgaW50ZXJydXB0aWJsZSBhbnltb3JlCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlhZGRsIHIxPUlBNjRfU1RLX09GRlNFVC1JQTY0X1BUX1JFR1NfU0laRSxyMgkvLyBjb21wdXRlIGJhc2Ugb2YgbWVtb3J5IHN0YWNrCi0JY21wLm5lIHBLU3RrLHBVU3RrPXIwLHIwCS8vIHNldCBwS1N0ayA8LSAwLCBwVVN0ayA8LSAxCisJbW92IGFyLnJzYz0weDMJCQkJLy8gTTIgICBzZXQgZWFnZXIgbW9kZSwgcGwgMCwgTEUsIGxvYWRycz0wCisJbW92IHJwPXIxNAkJCQkvLyBJMCAgIHNldCB0aGUgcmVhbCByZXR1cm4gYWRkcgorCWFuZCByMz1fVElGX1NZU0NBTExfVFJBQ0VBVURJVCxyMwkvLyBBCiAJOzsKLQlzdDEgW3IxNl09cjAJCQkvLyBjbGVhciBjdXJyZW50LT50aHJlYWQub25fdXN0YWNrIGZsYWcKLQltb3YgYXIuYnNwc3RvcmU9cjIyCQkvLyBzd2l0Y2ggdG8ga2VybmVsIFJCUwotCW1vdiBiNj1yMTgJCQkvLyBjb3B5IHN5c2NhbGwgZW50cnktcG9pbnQgdG8gYjYgKDcgY3ljKQotCWFkZCByMz1USV9GTEFHUytJQTY0X1RBU0tfU0laRSxyMgotCTs7Ci0JbGQ0IHIzPVtyM10JCQkJLy8gcjIgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzCi0JbW92IHIxOD1hci5ic3AJCQkvLyBzYXZlIChrZXJuZWwpIGFyLmJzcCAoMTIgY3ljKQotCW1vdiBhci5yc2M9MHgzCQkJLy8gc2V0IGVhZ2VyIG1vZGUsIHBsIDAsIGxpdHRsZS1lbmRpYW4sIGxvYWRycz0wCi0JYnIuY2FsbC5zcHRrLm1hbnkgYjc9aWE2NF9zeXNjYWxsX3NldHVwCi0JOzsKLQlzc20gcHNyLmkKLQltb3ZsIHIyPWlhNjRfcmV0X2Zyb21fc3lzY2FsbAotCTs7Ci0JbW92IHJwPXIyCQkJCS8vIHNldCB0aGUgcmVhbCByZXR1cm4gYWRkcgotCWFuZCByMz1fVElGX1NZU0NBTExfVFJBQ0VBVURJVCxyMwotCTs7Ci0JY21wLmVxIHA4LHAwPXIzLHIwCisJc3NtIHBzci5pCQkJCS8vIE0yICAgd2UncmUgb24ga2VybmVsIHN0YWNrcyBub3csIHJlZW5hYmxlIGlycXMKKwljbXAuZXEgcDgscDA9cjMscjAJCQkvLyBBCisocDEwKQlici5jb25kLnNwbnQubWFueSBpYTY0X3JldF9mcm9tX3N5c2NhbGwJLy8gQiAgICByZXR1cm4gaWYgYmFkIGNhbGwtZnJhbWUgb3IgcjE1IGlzIGEgTmFUCiAKLShwMTApCWJyLmNvbmQuc3BudC5tYW55IGlhNjRfcmV0X2Zyb21fc3lzY2FsbAkvLyBwMTA9PXRydWUgbWVhbnMgb3V0IHJlZ2lzdGVycyBhcmUgbW9yZSB0aGFuIDgKLShwOCkJYnIuY2FsbC5zcHRrLm1hbnkgYjY9YjYJCS8vIGlnbm9yZSB0aGlzIHJldHVybiBhZGRyCi0JYnIuY29uZC5zcHRrIGlhNjRfdHJhY2Vfc3lzY2FsbAorCW5vcC5tIDAKKyhwOCkJYnIuY2FsbC5zcHRrLm1hbnkgYjY9YjYJCQkvLyBCICAgIChpZ25vcmUgcmV0dXJuIGFkZHJlc3MpCisJYnIuY29uZC5zcG50IGlhNjRfdHJhY2Vfc3lzY2FsbAkJLy8gQgogRU5EKGZzeXNfYnViYmxlX2Rvd24pCiAKIAkucm9kYXRhCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2dhdGUuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCmluZGV4IGZhY2Y3NWEuLjg2OTQ4Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCkBAIC03MiwzOCArNzIsNDAgQEAKIAkgKiBidW5kbGUgZ2V0IGV4ZWN1dGVkLiAgVGhlIHJlbWFpbmluZyBjb2RlIG11c3QgYmUgc2FmZSBldmVuIGlmCiAJICogdGhleSBkbyBub3QgZ2V0IGV4ZWN1dGVkLgogCSAqLwotCWFkZHMgcjE3PS0xMDI0LHIxNQotCW1vdiByMTA9MAkJCQkvLyBkZWZhdWx0IHRvIHN1Y2Nlc3NmdWwgc3lzY2FsbCBleGVjdXRpb24KLQllcGMKKwlhZGRzIHIxNz0tMTAyNCxyMTUJCQkvLyBBCisJbW92IHIxMD0wCQkJCS8vIEEgICAgZGVmYXVsdCB0byBzdWNjZXNzZnVsIHN5c2NhbGwgZXhlY3V0aW9uCisJZXBjCQkJCQkvLyBCCWNhdXNlcyBzcGxpdC1pc3N1ZQogfQogCTs7Ci0JcnNtIHBzci5iZSAvLyBub3RlOiBvbiBNY0tpbmxleSAicnNtIHBzci5iZS9zcmx6LmQiIGlzIHNsaWdodGx5IGZhc3RlciB0aGFuICJydW0gcHNyLmJlIgotCUxPQURfRlNZU0NBTExfVEFCTEUocjE0KQorCXJzbSBwc3IuYmUgfCBwc3IuaQkJCS8vIE0yICg1IGN5YyB0byBzcmx6LmQpCisJTE9BRF9GU1lTQ0FMTF9UQUJMRShyMTQpCQkvLyBYCisJOzsKKwltb3YgcjE2PUlBNjRfS1IoQ1VSUkVOVCkJCS8vIE0yICgxMiBjeWMpCisJc2hsYWRkIHIxOD1yMTcsMyxyMTQJCQkvLyBBCisJbW92IHIxOT1OUl9zeXNjYWxscy0xCQkJLy8gQQorCTs7CisJbGZldGNoIFtyMThdCQkJCS8vIE0wfDEKKwltb3YgcjI5PXBzcgkJCQkvLyBNMiAoMTIgY3ljKQorCS8vIElmIHIxNyBpcyBhIE5hVCwgcDYgd2lsbCBiZSB6ZXJvCisJY21wLmdldSBwNixwNz1yMTkscjE3CQkJLy8gQSAgICAoc3lzbnIgPiAwICYmIHN5c25yIDwgMTAyNCtOUl9zeXNjYWxscyk/CisJOzsKKwltb3YgcjIxPWFyLmZwc3IJCQkJLy8gTTIgKDEyIGN5YykKKwl0bmF0Lm56IHAxMCxwOT1yMTUJCQkvLyBJMAorCW1vdi5pIHIyNj1hci5wZnMJCQkvLyBJMCAod291bGQgc3RhbGwgYW55aG93IGR1ZSB0byBzcmx6LmQuLi4pCisJOzsKKwlzcmx6LmQJCQkJCS8vIE0wIChmb3JjZXMgc3BsaXQtaXNzdWUpIGVuc3VyZSBQU1IuQkU9PTAKKyhwNikJbGQ4IHIxOD1bcjE4XQkJCQkvLyBNMHwxCisJbm9wLmkgMAorCTs7CisJbm9wLm0gMAorKHA2KQl0Yml0LnoudW5jIHA4LHAwPXIxOCwwCQkJLy8gSTAgKGR1YWwtaXNzdWVzIHdpdGggIm1vdiBiNz1yMTgiISkKKwlub3AuaSAwCisJOzsKKyhwOCkJc3NtIHBzci5pCisocDYpCW1vdiBiNz1yMTgJCQkJLy8gSTAKKyhwOCkJYnIuZHB0ay5tYW55IGI3CQkJCS8vIEIKIAotCW1vdiByMTY9SUE2NF9LUihDVVJSRU5UKQkJLy8gMTIgY3ljbGUgcmVhZCBsYXRlbmN5Ci0JdG5hdC5ueiBwMTAscDk9cjE1Ci0JbW92IHIxOT1OUl9zeXNjYWxscy0xCi0JOzsKLQlzaGxhZGQgcjE4PXIxNywzLHIxNAotCi0Jc3Jsei5kCi0JY21wLm5lIHA4LHAwPXIwLHIwCQkJLy8gcDggPC0gRkFMU0UKLQkvKiBOb3RlOiBpZiByMTcgaXMgYSBOYVQsIHA2IHdpbGwgYmUgc2V0IHRvIHplcm8uICAqLwotCWNtcC5nZXUgcDYscDc9cjE5LHIxNwkJCS8vIChzeXNjYWxsID4gMCAmJiBzeXNjYWxsIDwgMTAyNCtOUl9zeXNjYWxscyk/Ci0JOzsKLShwNikJbGQ4IHIxOD1bcjE4XQotCW1vdiByMjE9YXIuZnBzcgotCWFkZCByMTQ9LTgscjE0CQkJCS8vIHIxNCA8LSBhZGRyIG9mIGZzeXNfYnViYmxlX2Rvd24gZW50cnkKLQk7OwotKHA2KQltb3YgYjc9cjE4Ci0ocDYpCXRiaXQueiBwOCxwMD1yMTgsMAotKHA4KQlici5kcHRrLm1hbnkgYjcKLQotKHA2KQlyc20gcHNyLmkKLQltb3YgcjI3PWFyLnJzYwotCW1vdiByMjY9YXIucGZzCi0JOzsKLQltb3YgcjI5PXBzcgkJCQkvLyByZWFkIHBzciAoMTIgY3ljIGxvYWQgbGF0ZW5jeSkKKwltb3YgcjI3PWFyLnJzYwkJCQkvLyBNMiAoMTIgY3ljKQogLyoKICAqIGJybC5jb25kIGRvZXNuJ3Qgd29yayBhcyBpbnRlbmRlZCBiZWNhdXNlIHRoZSBsaW5rZXIgd291bGQgY29udmVydCB0aGlzIGJyYW5jaAogICogaW50byBhIGJyYW5jaCB0byBhIFBMVC4gIFBlcmhhcHMgdGhlcmUgd2lsbCBiZSBhIHdheSB0byBhdm9pZCB0aGlzIHdpdGggc29tZQpAQCAtMTExLDYgKzExMyw4IEBACiAgKiBpbnN0ZWFkLgogICovCiAjaWZkZWYgQ09ORklHX0lUQU5JVU0KKyhwNikJYWRkIHIxND0tOCxyMTQJCQkJLy8gcjE0IDwtIGFkZHIgb2YgZnN5c19idWJibGVfZG93biBlbnRyeQorCTs7CiAocDYpCWxkOCByMTQ9W3IxNF0JCQkJLy8gcjE0IDwtIGZzeXNfYnViYmxlX2Rvd24KIAk7OwogKHA2KQltb3YgYjc9cjE0CkBAIC0xMTgsNyArMTIyLDcgQEAKICNlbHNlCiAJQlJMX0NPTkRfRlNZU19CVUJCTEVfRE9XTihwNikKICNlbmRpZgotCisJc3NtIHBzci5pCiAJbW92IHIxMD0tMQogKHAxMCkJbW92IHI4PUVJTlZBTAogKHA5KQltb3Ygcjg9RU5PU1lTCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCmluZGV4IDdiYmYwMTkuLjAxNTcyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCkBAIC01OCw5ICs1OCw2IEBACiBFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcik7CiAKLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci1FWFBPUlRfU1lNQk9MKF9faWE2NF9zeXNjYWxsKTsKLQogLyogZnJvbSBhcmNoL2lhNjQvbGliICovCiBleHRlcm4gdm9pZCBfX2RpdnNpMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fdWRpdnNpMyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKaW5kZXggODhiMDE0My4uNzkzNmI2MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKQEAgLTEyOSwxNCArMTI5LDEzIEBACiAJY2hhciBfX2lvbWVtCSphZGRyOwkJLyogYmFzZSBhZGRyZXNzIG9mIElPU0FQSUMgKi8KIAl1bnNpZ25lZCBpbnQgCWdzaV9iYXNlOwkvKiBmaXJzdCBHU0kgYXNzaWduZWQgdG8gdGhpcyBJT1NBUElDICovCiAJdW5zaWduZWQgc2hvcnQgCW51bV9ydGU7CS8qIG51bWJlciBvZiBSVEUgaW4gdGhpcyBJT1NBUElDICovCisJaW50CQlydGVzX2ludXNlOwkvKiAjIG9mIFJURXMgaW4gdXNlIG9uIHRoaXMgSU9TQVBJQyAqLwogI2lmZGVmIENPTkZJR19OVU1BCiAJdW5zaWduZWQgc2hvcnQJbm9kZTsJCS8qIG51bWEgbm9kZSBhc3NvY2lhdGlvbiB2aWEgcHhtICovCiAjZW5kaWYKIH0gaW9zYXBpY19saXN0c1tOUl9JT1NBUElDU107CiAKLXN0YXRpYyBpbnQgbnVtX2lvc2FwaWM7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBjYXRfY29tcGF0IF9faW5pdGRhdGE7CS8qIDgyNTkgY29tcGF0aWJpbGl0eSBmbGFnICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwY2F0X2NvbXBhdCBfX2RldmluaXRkYXRhOwkvKiA4MjU5IGNvbXBhdGliaWxpdHkgZmxhZyAqLwogCiBzdGF0aWMgaW50IGlvc2FwaWNfa21hbGxvY19vazsKIHN0YXRpYyBMSVNUX0hFQUQoZnJlZV9ydGVfbGlzdCk7CkBAIC0xNDksNyArMTQ4LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1faW9zYXBpYzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5SX0lPU0FQSUNTOyBpKyspIHsKIAkJaWYgKCh1bnNpZ25lZCkgKGdzaSAtIGlvc2FwaWNfbGlzdHNbaV0uZ3NpX2Jhc2UpIDwgaW9zYXBpY19saXN0c1tpXS5udW1fcnRlKQogCQkJcmV0dXJuIGk7CiAJfQpAQCAtNDkwLDggKzQ4OSw2IEBACiAJCQl9CiAJCX0KIAl9Ci0JaWYgKHZlY3RvciA8IDApCi0JCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKIAogCXJldHVybiB2ZWN0b3I7CiB9CkBAIC01MDcsNiArNTA0LDggQEAKIAogCWlmICghbGlzdF9lbXB0eSgmaW9zYXBpY19pbnRyX2luZm9bdmVjdG9yXS5ydGVzKSkgewogCQluZXdfdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCQlpZiAobmV3X3ZlY3RvciA8IDApCisJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXByaW50ayhLRVJOX0lORk8gIlJlYXNzaWduaW5nIHZlY3RvciAlZCB0byAlZFxuIiwgdmVjdG9yLCBuZXdfdmVjdG9yKTsKIAkJbWVtY3B5KCZpb3NhcGljX2ludHJfaW5mb1tuZXdfdmVjdG9yXSwgJmlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0sCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGlvc2FwaWNfaW50cl9pbmZvKSk7CkBAIC01OTgsNiArNTk3LDcgQEAKIAkJcnRlLT5yZWZjbnQrKzsKIAkJbGlzdF9hZGRfdGFpbCgmcnRlLT5ydGVfbGlzdCwgJmlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0ucnRlcyk7CiAJCWlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0uY291bnQrKzsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0ucnRlc19pbnVzZSsrOwogCX0KIAllbHNlIGlmICh2ZWN0b3JfaXNfc2hhcmVkKHZlY3RvcikpIHsKIAkJc3RydWN0IGlvc2FwaWNfaW50cl9pbmZvICppbmZvID0gJmlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl07CkBAIC03MzQsOSArNzM0LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9zYXBpY19sb2NrLCBmbGFncyk7CiAKIAkvKiBJZiB2ZWN0b3IgaXMgcnVubmluZyBvdXQsIHdlIHRyeSB0byBmaW5kIGEgc2hhcmFibGUgdmVjdG9yICovCi0JdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyhBVVRPX0FTU0lHTik7Ci0JaWYgKHZlY3RvciA8IDApCisJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCWlmICh2ZWN0b3IgPCAwKSB7CiAJCXZlY3RvciA9IGlvc2FwaWNfZmluZF9zaGFyYWJsZV92ZWN0b3IodHJpZ2dlciwgcG9sYXJpdHkpOworCQlpZiAodmVjdG9yIDwgMCkKKwkJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NwKHZlY3RvciktPmxvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJmlvc2FwaWNfbG9jayk7CkBAIC03NzgsNyArNzgxLDcgQEAKIGlvc2FwaWNfdW5yZWdpc3Rlcl9pbnRyICh1bnNpZ25lZCBpbnQgZ3NpKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGlycSwgdmVjdG9yOworCWludCBpcnEsIHZlY3RvciwgaW5kZXg7CiAJaXJxX2Rlc2NfdCAqaWRlc2M7CiAJdTMyIGxvdzMyOwogCXVuc2lnbmVkIGxvbmcgdHJpZ2dlciwgcG9sYXJpdHk7CkBAIC04MTksNiArODIyLDkgQEAKIAkJbGlzdF9kZWwoJnJ0ZS0+cnRlX2xpc3QpOwogCQlpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLmNvdW50LS07CiAJCWlvc2FwaWNfZnJlZV9ydGUocnRlKTsKKwkJaW5kZXggPSBmaW5kX2lvc2FwaWMoZ3NpKTsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0ucnRlc19pbnVzZS0tOworCQlXQVJOX09OKGlvc2FwaWNfbGlzdHNbaW5kZXhdLnJ0ZXNfaW51c2UgPCAwKTsKIAogCQl0cmlnZ2VyCSA9IGlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0udHJpZ2dlcjsKIAkJcG9sYXJpdHkgPSBpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLnBvbGFyaXR5OwpAQCAtODgxLDYgKzg4Nyw4IEBACiAJCWJyZWFrOwogCSAgICAgIGNhc2UgQUNQSV9JTlRFUlJVUFRfSU5JVDoKIAkJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCQlpZiAodmVjdG9yIDwgMCkKKwkJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJZGVsaXZlcnkgPSBJT1NBUElDX0lOSVQ7CiAJCWJyZWFrOwogCSAgICAgIGNhc2UgQUNQSV9JTlRFUlJVUFRfQ1BFSToKQEAgLTk1MiwzMCArOTYwLDg2IEBACiAJfQogfQogCi12b2lkIF9faW5pdAorc3RhdGljIGlubGluZSBpbnQKK2lvc2FwaWNfYWxsb2MgKHZvaWQpCit7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlJfSU9TQVBJQ1M7IGluZGV4KyspCisJCWlmICghaW9zYXBpY19saXN0c1tpbmRleF0uYWRkcikKKwkJCXJldHVybiBpbmRleDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgaW9zYXBpY1xuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW9zYXBpY19mcmVlIChpbnQgaW5kZXgpCit7CisJbWVtc2V0KCZpb3NhcGljX2xpc3RzW2luZGV4XSwgMCwgc2l6ZW9mKGlvc2FwaWNfbGlzdHNbMF0pKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lvc2FwaWNfY2hlY2tfZ3NpX3JhbmdlICh1bnNpZ25lZCBpbnQgZ3NpX2Jhc2UsIHVuc2lnbmVkIGludCB2ZXIpCit7CisJaW50IGluZGV4OworCXVuc2lnbmVkIGludCBnc2lfZW5kLCBiYXNlLCBlbmQ7CisKKwkvKiBjaGVjayBnc2kgcmFuZ2UgKi8KKwlnc2lfZW5kID0gZ3NpX2Jhc2UgKyAoKHZlciA+PiAxNikgJiAweGZmKTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOUl9JT1NBUElDUzsgaW5kZXgrKykgeworCQlpZiAoIWlvc2FwaWNfbGlzdHNbaW5kZXhdLmFkZHIpCisJCQljb250aW51ZTsKKworCQliYXNlID0gaW9zYXBpY19saXN0c1tpbmRleF0uZ3NpX2Jhc2U7CisJCWVuZCAgPSBiYXNlICsgaW9zYXBpY19saXN0c1tpbmRleF0ubnVtX3J0ZSAtIDE7CisKKwkJaWYgKGdzaV9iYXNlIDwgYmFzZSAmJiBnc2lfZW5kIDwgYmFzZSkKKwkJCWNvbnRpbnVlOy8qIE9LICovCisKKwkJaWYgKGdzaV9iYXNlID4gZW5kICYmIGdzaV9lbmQgPiBlbmQpCisJCQljb250aW51ZTsgLyogT0sgKi8KKworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IF9fZGV2aW5pdAogaW9zYXBpY19pbml0ICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgaW50IGdzaV9iYXNlKQogewotCWludCBudW1fcnRlOworCWludCBudW1fcnRlLCBlcnIsIGluZGV4OwogCXVuc2lnbmVkIGludCBpc2FfaXJxLCB2ZXI7CiAJY2hhciBfX2lvbWVtICphZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlhZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIDApOwotCXZlciA9IGlvc2FwaWNfdmVyc2lvbihhZGRyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9zYXBpY19sb2NrLCBmbGFncyk7CisJeworCQlhZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIDApOworCQl2ZXIgPSBpb3NhcGljX3ZlcnNpb24oYWRkcik7CiAKLQkvKgotCSAqIFRoZSBNQVhfUkVESVIgcmVnaXN0ZXIgaG9sZHMgdGhlIGhpZ2hlc3QgaW5wdXQgcGluCi0JICogbnVtYmVyIChzdGFydGluZyBmcm9tIDApLgotCSAqIFdlIGFkZCAxIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgbnVtYmVyIG9mIHBpbnMgKD0gUlRFcykKLQkgKi8KLQludW1fcnRlID0gKCh2ZXIgPj4gMTYpICYgMHhmZikgKyAxOworCQlpZiAoKGVyciA9IGlvc2FwaWNfY2hlY2tfZ3NpX3JhbmdlKGdzaV9iYXNlLCB2ZXIpKSkgeworCQkJaW91bm1hcChhZGRyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIGVycjsKKwkJfQogCi0JaW9zYXBpY19saXN0c1tudW1faW9zYXBpY10uYWRkciA9IGFkZHI7Ci0JaW9zYXBpY19saXN0c1tudW1faW9zYXBpY10uZ3NpX2Jhc2UgPSBnc2lfYmFzZTsKLQlpb3NhcGljX2xpc3RzW251bV9pb3NhcGljXS5udW1fcnRlID0gbnVtX3J0ZTsKKwkJLyoKKwkJICogVGhlIE1BWF9SRURJUiByZWdpc3RlciBob2xkcyB0aGUgaGlnaGVzdCBpbnB1dCBwaW4KKwkJICogbnVtYmVyIChzdGFydGluZyBmcm9tIDApLgorCQkgKiBXZSBhZGQgMSBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgZm9yIG51bWJlciBvZiBwaW5zICg9IFJURXMpCisJCSAqLworCQludW1fcnRlID0gKCh2ZXIgPj4gMTYpICYgMHhmZikgKyAxOworCisJCWluZGV4ID0gaW9zYXBpY19hbGxvYygpOworCQlpb3NhcGljX2xpc3RzW2luZGV4XS5hZGRyID0gYWRkcjsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0uZ3NpX2Jhc2UgPSBnc2lfYmFzZTsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0ubnVtX3J0ZSA9IG51bV9ydGU7CiAjaWZkZWYgQ09ORklHX05VTUEKLQlpb3NhcGljX2xpc3RzW251bV9pb3NhcGljXS5ub2RlID0gTUFYX05VTU5PREVTOworCQlpb3NhcGljX2xpc3RzW2luZGV4XS5ub2RlID0gTUFYX05VTU5PREVTOwogI2VuZGlmCi0JbnVtX2lvc2FwaWMrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9zYXBpY19sb2NrLCBmbGFncyk7CiAKIAlpZiAoKGdzaV9iYXNlID09IDApICYmIHBjYXRfY29tcGF0KSB7CiAJCS8qCkBAIC05ODYsMTAgKzEwNTAsNDMgQEAKIAkJZm9yIChpc2FfaXJxID0gMDsgaXNhX2lycSA8IDE2OyArK2lzYV9pcnEpCiAJCQlpb3NhcGljX292ZXJyaWRlX2lzYV9pcnEoaXNhX2lycSwgaXNhX2lycSwgSU9TQVBJQ19QT0xfSElHSCwgSU9TQVBJQ19FREdFKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVRworaW50Citpb3NhcGljX3JlbW92ZSAodW5zaWduZWQgaW50IGdzaV9iYXNlKQoreworCWludCBpbmRleCwgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOworCXsKKwkJaW5kZXggPSBmaW5kX2lvc2FwaWMoZ3NpX2Jhc2UpOworCQlpZiAoaW5kZXggPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gSU9TQVBJQyBmb3IgR1NJIGJhc2UgJXVcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBnc2lfYmFzZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChpb3NhcGljX2xpc3RzW2luZGV4XS5ydGVzX2ludXNlKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSU9TQVBJQyBmb3IgR1NJIGJhc2UgJXUgaXMgYnVzeVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGdzaV9iYXNlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaW91bm1hcChpb3NhcGljX2xpc3RzW2luZGV4XS5hZGRyKTsKKwkJaW9zYXBpY19mcmVlKGluZGV4KTsKKwl9Cisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUcgKi8KKwogI2lmZGVmIENPTkZJR19OVU1BCi12b2lkIF9faW5pdAordm9pZCBfX2RldmluaXQKIG1hcF9pb3NhcGljX3RvX25vZGUodW5zaWduZWQgaW50IGdzaV9iYXNlLCBpbnQgbm9kZSkKIHsKIAlpbnQgaW5kZXg7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKaW5kZXggNGZlNjBjNy4uNmM0ZDU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwpAQCAtNjMsMzAgKzYzLDE5IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpYTY0X3ZlY3Rvcl9tYXNrW0JJVFNfVE9fTE9OR1MoSUE2NF9OVU1fREVWSUNFX1ZFQ1RPUlMpXTsKIAogaW50Ci1hc3NpZ25faXJxX3ZlY3Rvcl9ub3BhbmljIChpbnQgaXJxKQorYXNzaWduX2lycV92ZWN0b3IgKGludCBpcnEpCiB7CiAJaW50IHBvcywgdmVjdG9yOwogIGFnYWluOgogCXBvcyA9IGZpbmRfZmlyc3RfemVyb19iaXQoaWE2NF92ZWN0b3JfbWFzaywgSUE2NF9OVU1fREVWSUNFX1ZFQ1RPUlMpOwogCXZlY3RvciA9IElBNjRfRklSU1RfREVWSUNFX1ZFQ1RPUiArIHBvczsKIAlpZiAodmVjdG9yID4gSUE2NF9MQVNUX0RFVklDRV9WRUNUT1IpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9TUEM7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQocG9zLCBpYTY0X3ZlY3Rvcl9tYXNrKSkKIAkJZ290byBhZ2FpbjsKIAlyZXR1cm4gdmVjdG9yOwogfQogCi1pbnQKLWFzc2lnbl9pcnFfdmVjdG9yIChpbnQgaXJxKQotewotCWludCB2ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3Rvcl9ub3BhbmljKGlycSk7Ci0KLQlpZiAodmVjdG9yIDwgMCkKLQkJcGFuaWMoImFzc2lnbl9pcnFfdmVjdG9yOiBvdXQgb2YgaW50ZXJydXB0IHZlY3RvcnMhIik7Ci0KLQlyZXR1cm4gdmVjdG9yOwotfQotCiB2b2lkCiBmcmVlX2lycV92ZWN0b3IgKGludCB2ZWN0b3IpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2l2dC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUwppbmRleCAyYmMwODVhLi4zYmIzYTEzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2l2dC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKQEAgLTEsNyArMSw3IEBACiAvKgogICogYXJjaC9pYTY0L2tlcm5lbC9pdnQuUwogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAxLCAyMDAzIEhld2xldHQtUGFja2FyZCBDbworICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEsIDIwMDMsIDIwMDUgSGV3bGV0dC1QYWNrYXJkIENvCiAgKglTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CiAgKglEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLTIwMDMgSW50ZWwgQ28KQEAgLTY5Miw4MiArNjkyLDExOCBAQAogCSAqIHRvIHByZXZlbnQgbGVha2luZyBiaXRzIGZyb20ga2VybmVsIHRvIHVzZXIgbGV2ZWwuCiAJICovCiAJREJHX0ZBVUxUKDExKQotCW1vdiByMTY9SUE2NF9LUihDVVJSRU5UKQkJLy8gcjE2ID0gY3VycmVudCB0YXNrOyAxMiBjeWNsZSByZWFkIGxhdC4KLQltb3YgcjE3PWNyLmlpbQotCW1vdiByMTg9X19JQTY0X0JSRUFLX1NZU0NBTEwKLQltb3YgcjIxPWFyLmZwc3IKLQltb3YgcjI5PWNyLmlwc3IKLQltb3YgcjE5PWI2Ci0JbW92IHIyNT1hci51bmF0Ci0JbW92IHIyNz1hci5yc2MKLQltb3YgcjI2PWFyLnBmcwotCW1vdiByMjg9Y3IuaWlwCi0JbW92IHIzMT1wcgkJCQkvLyBwcmVwYXJlIHRvIHNhdmUgcHJlZGljYXRlcwotCW1vdiByMjA9cjEKKwltb3YubSByMTY9SUE2NF9LUihDVVJSRU5UKQkJLy8gTTIgcjE2IDwtIGN1cnJlbnQgdGFzayAoMTIgY3ljKQorCW1vdiByMjk9Y3IuaXBzcgkJCQkvLyBNMiAoMTIgY3ljKQorCW1vdiByMzE9cHIJCQkJLy8gSTAgKDIgY3ljKQorCisJbW92IHIxNz1jci5paW0JCQkJLy8gTTIgKDIgY3ljKQorCW1vdi5tIHIyNz1hci5yc2MJCQkvLyBNMiAoMTIgY3ljKQorCW1vdiByMTg9X19JQTY0X0JSRUFLX1NZU0NBTEwJCS8vIEEKKworCW1vdi5tIGFyLnJzYz0wCQkJCS8vIE0yCisJbW92Lm0gcjIxPWFyLmZwc3IJCQkvLyBNMiAoMTIgY3ljKQorCW1vdiByMTk9YjYJCQkJLy8gSTAgKDIgY3ljKQogCTs7CisJbW92Lm0gcjIzPWFyLmJzcHN0b3JlCQkJLy8gTTIgKDEyIGN5YykKKwltb3YubSByMjQ9YXIucm5hdAkJCS8vIE0yICg1IGN5YykKKwltb3YuaSByMjY9YXIucGZzCQkJLy8gSTAgKDIgY3ljKQorCisJaW52YWxhCQkJCQkvLyBNMHwxCisJbm9wLm0gMAkJCQkJLy8gTQorCW1vdiByMjA9cjEJCQkJLy8gQQkJCXNhdmUgcjEKKworCW5vcC5tIDAKKwltb3ZsIHIzMD1zeXNfY2FsbF90YWJsZQkJCS8vIFgKKworCW1vdiByMjg9Y3IuaWlwCQkJCS8vIE0yICgyIGN5YykKKwljbXAuZXEgcDAscDc9cjE4LHIxNwkJCS8vIEkwIGlzIHRoaXMgYSBzeXN0ZW0gY2FsbD8KKyhwNykJYnIuY29uZC5zcG50IG5vbl9zeXNjYWxsCQkvLyBCICBubyAtPgorCS8vCisJLy8gRnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBhcmUgZGVmaW5pdGVseSBvbiB0aGUgc3lzY2FsbC1wYXRoCisJLy8gYW5kIHdlIGNhbiB1c2UgKG5vbi1iYW5rZWQpIHNjcmF0Y2ggcmVnaXN0ZXJzLgorCS8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCW1vdiByMT1yMTYJCQkJLy8gQSAgICBtb3ZlIHRhc2stcG9pbnRlciB0byAiYWRkbCItYWRkcmVzc2FibGUgcmVnCisJbW92IHIyPXIxNgkJCQkvLyBBICAgIHNldHVwIHIyIGZvciBpYTY0X3N5c2NhbGxfc2V0dXAKKwlhZGQgcjk9VElfRkxBR1MrSUE2NF9UQVNLX1NJWkUscjE2CS8vIEEJcjkgPSAmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncworCiAJYWRkcyByMTY9SUE2NF9UQVNLX1RIUkVBRF9PTl9VU1RBQ0tfT0ZGU0VULHIxNgotCWNtcC5lcSBwMCxwNz1yMTgscjE3CQkJLy8gaXMgdGhpcyBhIHN5c3RlbSBjYWxsPyAocDcgPC0gZmFsc2UsIGlmIHNvKQotKHA3KQlici5jb25kLnNwbnQgbm9uX3N5c2NhbGwKLQk7OwotCWxkMSByMTc9W3IxNl0JCQkJLy8gbG9hZCBjdXJyZW50LT50aHJlYWQub25fdXN0YWNrIGZsYWcKLQlzdDEgW3IxNl09cjAJCQkJLy8gY2xlYXIgY3VycmVudC0+dGhyZWFkLm9uX3VzdGFjayBmbGFnCi0JYWRkIHIxPS1JQTY0X1RBU0tfVEhSRUFEX09OX1VTVEFDS19PRkZTRVQscjE2CS8vIHNldCByMSBmb3IgTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU5fVklSVAotCTs7Ci0JaW52YWxhCi0KLQkvKiBhZGp1c3QgcmV0dXJuIGFkZHJlc3Mgc28gd2Ugc2tpcCBvdmVyIHRoZSBicmVhayBpbnN0cnVjdGlvbjogKi8KLQotCWV4dHIudSByOD1yMjksNDEsMgkJCS8vIGV4dHJhY3QgZWkgZmllbGQgZnJvbSBjci5pcHNyCi0JOzsKLQljbXAuZXEgcDYscDc9MixyOAkJCS8vIGlzci5laT09Mj8KLQltb3YgcjI9cjEJCQkJLy8gc2V0dXAgcjIgZm9yIGlhNjRfc3lzY2FsbF9zZXR1cAotCTs7Ci0ocDYpCW1vdiByOD0wCQkJCS8vIGNsZWFyIGVpIHRvIDAKLShwNikJYWRkcyByMjg9MTYscjI4CQkJCS8vIHN3aXRjaCBjci5paXAgdG8gbmV4dCBidW5kbGUgY3IuaXBzci5laSB3cmFwcGVkCi0ocDcpCWFkZHMgcjg9MSxyOAkJCQkvLyBpbmNyZW1lbnQgZWkgdG8gbmV4dCBzbG90Ci0JOzsKLQljbXAuZXEgcEtTdGsscFVTdGs9cjAscjE3CQkvLyBhcmUgd2UgaW4ga2VybmVsIG1vZGUgYWxyZWFkeT8KLQlkZXAgcjI5PXI4LHIyOSw0MSwyCQkJLy8gaW5zZXJ0IG5ldyBlaSBpbnRvIGNyLmlwc3IKLQk7OwotCi0JLy8gc3dpdGNoIGZyb20gdXNlciB0byBrZXJuZWwgUkJTOgotCU1JTlNUQVRFX1NUQVJUX1NBVkVfTUlOX1ZJUlQKLQlici5jYWxsLnNwdGsubWFueSBiNz1pYTY0X3N5c2NhbGxfc2V0dXAKLQk7OwotCU1JTlNUQVRFX0VORF9TQVZFX01JTl9WSVJUCQkvLyBzd2l0Y2ggdG8gYmFuayAxCi0Jc3NtIHBzci5pYyB8IFBTUl9ERUZBVUxUX0JJVFMKLQk7OwotCXNybHouaQkJCQkJLy8gZ3VhcmFudGVlIHRoYXQgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24gaXMgb24KKwlhZGRzIHIxNT0tMTAyNCxyMTUJCQkvLyBBICAgIHN1YnRyYWN0IDEwMjQgZnJvbSBzeXNjYWxsIG51bWJlcgogCW1vdiByMz1OUl9zeXNjYWxscyAtIDEKIAk7OwotKHAxNSkJc3NtIHBzci5pCQkJCS8vIHJlc3RvcmUgcHNyLmkKLQkvLyBwMTA9PXRydWUgbWVhbnMgb3V0IHJlZ2lzdGVycyBhcmUgbW9yZSB0aGFuIDggb3IgcjE1J3MgTmF0IGlzIHRydWUKLShwMTApCWJyLmNvbmQuc3BudC5tYW55IGlhNjRfcmV0X2Zyb21fc3lzY2FsbAotCTs7Ci0JbW92bCByMTY9c3lzX2NhbGxfdGFibGUKKwlsZDEuYmlhcyByMTc9W3IxNl0JCQkvLyBNMHwxIHIxNyA9IGN1cnJlbnQtPnRocmVhZC5vbl91c3RhY2sgZmxhZworCWxkNCByOT1bcjldCQkJCS8vIE0wfDEgcjkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzCisJZXh0ci51IHI4PXIyOSw0MSwyCQkJLy8gSTAgICBleHRyYWN0IGVpIGZpZWxkIGZyb20gY3IuaXBzcgogCi0JYWRkcyByMTU9LTEwMjQscjE1CQkJLy8gcjE1IGNvbnRhaW5zIHRoZSBzeXNjYWxsIG51bWJlci0tLXN1YnRyYWN0IDEwMjQKLQltb3ZsIHIyPWlhNjRfcmV0X2Zyb21fc3lzY2FsbAorCXNobGFkZCByMzA9cjE1LDMscjMwCQkJLy8gQSAgICByMzAgPSBzeXNfY2FsbF90YWJsZSArIDgqKHN5c2NhbGwtMTAyNCkKKwlhZGRsIHIyMj1JQTY0X1JCU19PRkZTRVQscjEJCS8vIEEgICAgY29tcHV0ZSBiYXNlIG9mIFJCUworCWNtcC5sZXUgcDYscDc9cjE1LHIzCQkJLy8gQSAgICBzeXNjYWxsIG51bWJlciBpbiByYW5nZT8KIAk7OwotCXNobGFkZCByMjA9cjE1LDMscjE2CQkJLy8gcjIwID0gc3lzX2NhbGxfdGFibGUgKyA4KihzeXNjYWxsLTEwMjQpCi0JY21wLmxldSBwNixwNz1yMTUscjMJCQkvLyAoc3lzY2FsbCA+IDAgJiYgc3lzY2FsbCA8IDEwMjQgKyBOUl9zeXNjYWxscykgPwotCW1vdiBycD1yMgkJCQkvLyBzZXQgdGhlIHJlYWwgcmV0dXJuIGFkZHIKLQk7OwotKHA2KQlsZDggcjIwPVtyMjBdCQkJCS8vIGxvYWQgYWRkcmVzcyBvZiBzeXNjYWxsIGVudHJ5IHBvaW50Ci0ocDcpCW1vdmwgcjIwPXN5c19uaV9zeXNjYWxsCiAKLQlhZGQgcjI9VElfRkxBR1MrSUE2NF9UQVNLX1NJWkUscjEzCisJbGZldGNoLmZhdWx0LmV4Y2wubnQxIFtyMjJdCQkvLyBNMHwxIHByZWZldGNoIFJCUworKHA2KQlsZDggcjMwPVtyMzBdCQkJCS8vIE0wfDEgbG9hZCBhZGRyZXNzIG9mIHN5c2NhbGwgZW50cnkgcG9pbnQKKwl0bmF0Lm56Lm9yIHA3LHAwPXIxNQkJCS8vIEkwCWlzIHN5c2NhbGwgbnIgYSBOYVQ/CisKKwltb3YubSBhci5ic3BzdG9yZT1yMjIJCQkvLyBNMiAgIHN3aXRjaCB0byBrZXJuZWwgUkJTCisJY21wLmVxIHA4LHA5PTIscjgJCQkvLyBBICAgIGlzci5laT09Mj8KIAk7OwotCWxkNCByMj1bcjJdCQkJCS8vIHIyID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncworCisocDgpCW1vdiByOD0wCQkJCS8vIEEgICAgY2xlYXIgZWkgdG8gMAorKHA3KQltb3ZsIHIzMD1zeXNfbmlfc3lzY2FsbAkJCS8vIFgKKworKHA4KQlhZGRzIHIyOD0xNixyMjgJCQkJLy8gQSAgICBzd2l0Y2ggY3IuaWlwIHRvIG5leHQgYnVuZGxlCisocDkpCWFkZHMgcjg9MSxyOAkJCQkvLyBBICAgIGluY3JlbWVudCBlaSB0byBuZXh0IHNsb3QKKwlub3AuaSAwCiAJOzsKLQlhbmQgcjI9X1RJRl9TWVNDQUxMX1RSQUNFQVVESVQscjIJLy8gbWFzayB0cmFjZSBvciBhdWRpdAorCisJbW92Lm0gcjI1PWFyLnVuYXQJCQkvLyBNMiAoNSBjeWMpCisJZGVwIHIyOT1yOCxyMjksNDEsMgkJCS8vIEkwICAgaW5zZXJ0IG5ldyBlaSBpbnRvIGNyLmlwc3IKKwlhZGRzIHIxNT0xMDI0LHIxNQkJCS8vIEEgICAgcmVzdG9yZSBvcmlnaW5hbCBzeXNjYWxsIG51bWJlcgorCS8vCisJLy8gSWYgYW55IG9mIHRoZSBhYm92ZSBsb2FkcyBtaXNzIGluIEwxRCwgd2UnbGwgc3RhbGwgaGVyZSB1bnRpbAorCS8vIHRoZSBkYXRhIGFycml2ZXMuCisJLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJc3QxIFtyMTZdPXIwCQkJCS8vIE0yfDMgY2xlYXIgY3VycmVudC0+dGhyZWFkLm9uX3VzdGFjayBmbGFnCisJbW92IGI2PXIzMAkJCQkvLyBJMCAgIHNldHVwIHN5c2NhbGwgaGFuZGxlciBicmFuY2ggcmVnIGVhcmx5CisJY21wLmVxIHBLU3RrLHBVU3RrPXIwLHIxNwkJLy8gQSAgICB3ZXJlIHdlIG9uIGtlcm5lbCBzdGFja3MgYWxyZWFkeT8KKworCWFuZCByOT1fVElGX1NZU0NBTExfVFJBQ0VBVURJVCxyOQkvLyBBICAgIG1hc2sgdHJhY2Ugb3IgYXVkaXQKKwltb3YgcjE4PWFyLmJzcAkJCQkvLyBNMiAoMTIgY3ljKQorKHBLU3RrKQlici5jb25kLnNwbnQgLmJyZWFrX2ZpeHVwCQkvLyBCCXdlJ3JlIGFscmVhZHkgaW4ga2VybmVsLW1vZGUgLS0gZml4IHVwIFJCUwogCTs7Ci0JY21wLmVxIHA4LHAwPXIyLHIwCi0JbW92IGI2PXIyMAorLmJhY2tfZnJvbV9icmVha19maXh1cDoKKyhwVVN0aykJYWRkbCByMT1JQTY0X1NUS19PRkZTRVQtSUE2NF9QVF9SRUdTX1NJWkUscjEgLy8gQSAgICBjb21wdXRlIGJhc2Ugb2YgbWVtb3J5IHN0YWNrCisJY21wLmVxIHAxNCxwMD1yOSxyMAkJCS8vIEEgICAgYXJlIHN5c2NhbGxzIGJlaW5nIHRyYWNlZC9hdWRpdGVkPworCWJyLmNhbGwuc3B0ay5tYW55IGI3PWlhNjRfc3lzY2FsbF9zZXR1cAkvLyBCCisxOgorCW1vdiBhci5yc2M9MHgzCQkJCS8vIE0yICAgc2V0IGVhZ2VyIG1vZGUsIHBsIDAsIExFLCBsb2FkcnM9MAorCW5vcCAwCisJYnN3LjEJCQkJCS8vIEIgKDYgY3ljKSByZWdzIGFyZSBzYXZlZCwgc3dpdGNoIHRvIGJhbmsgMQogCTs7Ci0ocDgpCWJyLmNhbGwuc3B0ay5tYW55IGI2PWI2CQkJLy8gaWdub3JlIHRoaXMgcmV0dXJuIGFkZHIKLQlici5jb25kLnNwdGsgaWE2NF90cmFjZV9zeXNjYWxsCisKKwlzc20gcHNyLmljIHwgUFNSX0RFRkFVTFRfQklUUwkJLy8gTTIJbm93IGl0J3Mgc2FmZSB0byByZS1lbmFibGUgaW50ci4tY29sbGVjdGlvbgorCW1vdmwgcjM9aWE2NF9yZXRfZnJvbV9zeXNjYWxsCQkvLyBYCisJOzsKKworCXNybHouaQkJCQkJLy8gTTAgICBlbnN1cmUgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24gaXMgb24KKwltb3YgcnA9cjMJCQkJLy8gSTAgICBzZXQgdGhlIHJlYWwgcmV0dXJuIGFkZHIKKyhwMTApCWJyLmNvbmQuc3BudC5tYW55IGlhNjRfcmV0X2Zyb21fc3lzY2FsbAkvLyBCICAgIHJldHVybiBpZiBiYWQgY2FsbC1mcmFtZSBvciByMTUgaXMgYSBOYVQKKworKHAxNSkJc3NtIHBzci5pCQkJCS8vIE0yICAgcmVzdG9yZSBwc3IuaQorKHAxNCkJYnIuY2FsbC5zcHRrLm1hbnkgYjY9YjYJCQkvLyBCICAgIGludm9rZSBzeXNjYWxsLWhhbmRrZXIgKGlnbm9yZSByZXR1cm4gYWRkcikKKwlici5jb25kLnNwbnQubWFueSBpYTY0X3RyYWNlX3N5c2NhbGwJLy8gQglkbyBzeXNjYWxsLXRyYWNpbmcgdGhpbmdhbWFnaWMKIAkvLyBOT1QgUkVBQ0hFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPbiBlbnRyeSwgd2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lZCB0aGF0IHdlJ3JlIGNvbWluZyBmcm9tIHVzZXItc3BhY2UuCisJLy8gRm9yIHRoZSByYXJlIGNhc2VzIHdoZXJlIGEgc3lzdGVtLWNhbGwgaXMgZG9uZSBmcm9tIHdpdGhpbiB0aGUga2VybmVsLAorCS8vIHdlIGZpeCB0aGluZ3MgdXAgYXQgdGhpcyBwb2ludDoKKy5icmVha19maXh1cDoKKwlhZGQgcjE9LUlBNjRfUFRfUkVHU19TSVpFLHNwCQkvLyBBICAgIGFsbG9jYXRlIHNwYWNlIGZvciBwdF9yZWdzIHN0cnVjdHVyZQorCW1vdiBhci5ybmF0PXIyNAkJCQkvLyBNMglyZXN0b3JlIGtlcm5lbCdzIEFSLlJOQVQKKwk7OworCW1vdiBhci5ic3BzdG9yZT1yMjMJCQkvLyBNMglyZXN0b3JlIGtlcm5lbCdzIEFSLkJTUFNUT1JFCisJYnIuY29uZC5zcHRrIC5iYWNrX2Zyb21fYnJlYWtfZml4dXAKIEVORChicmVha19mYXVsdCkKIAogCS5vcmcgaWE2NF9pdnQrMHgzMDAwCkBAIC04NDIsOCArODc4LDYgQEAKIAkgKgktIHIzMTogc2F2ZWQgcHIKIAkgKgktICBiMDogb3JpZ2luYWwgY29udGVudHMgKHRvIGJlIHNhdmVkKQogCSAqIE9uIGV4aXQ6Ci0JICoJLSBleGVjdXRpbmcgb24gYmFuayAxIHJlZ2lzdGVycwotCSAqCS0gcHNyLmljIGVuYWJsZWQsIGludGVycnVwdHMgcmVzdG9yZWQKIAkgKgktICBwMTA6IFRSVUUgaWYgc3lzY2FsbCBpcyBpbnZva2VkIHdpdGggbW9yZSB0aGFuIDggb3V0CiAJICoJCXJlZ2lzdGVycyBvciByMTUncyBOYXQgaXMgdHJ1ZQogCSAqCS0gIHIxOiBrZXJuZWwncyBncApAQCAtODUxLDggKzg4NSwxMSBAQAogCSAqCS0gIHI4OiAtRUlOVkFMIGlmIHAxMCBpcyB0cnVlCiAJICoJLSByMTI6IHBvaW50cyB0byBrZXJuZWwgc3RhY2sKIAkgKgktIHIxMzogcG9pbnRzIHRvIGN1cnJlbnQgdGFzaworCSAqCS0gcjE0OiBwcmVzZXJ2ZWQgKHNhbWUgYXMgb24gZW50cnkpCisJICoJLSBwMTM6IHByZXNlcnZlZAogCSAqCS0gcDE1OiBUUlVFIGlmIGludGVycnVwdHMgbmVlZCB0byBiZSByZS1lbmFibGVkCiAJICoJLSBhci5mcHNyOiBzZXQgdG8ga2VybmVsIHNldHRpbmdzCisJICoJLSAgYjY6IHByZXNlcnZlZCAoc2FtZSBhcyBvbiBlbnRyeSkKIAkgKi8KIEdMT0JBTF9FTlRSWShpYTY0X3N5c2NhbGxfc2V0dXApCiAjaWYgUFQoQjYpICE9IDAKQEAgLTkyMCwxMCArOTU3LDEwIEBACiAocDEzKQltb3YgaW41PS0xCiAJOzsKIAlzdDggW3IxNl09cjIxLFBUKFI4KS1QVChBUl9GUFNSKQkvLyBzYXZlIGFyLmZwc3IKLQl0bmF0Lm56IHAxNCxwMD1pbjYKKwl0bmF0Lm56IHAxMyxwMD1pbjYKIAljbXAubHQgcDEwLHA5PXIxMSxyOAkvLyBmcmFtZSBzaXplIGNhbid0IGJlIG1vcmUgdGhhbiBsb2NhbCs4CiAJOzsKLQlzdGY4IFtyMTZdPWYxCQkvLyBlbnN1cmUgcHRfcmVncy5yOCAhPSAwIChzZWUgaGFuZGxlX3N5c2NhbGxfZXJyb3IpCisJbW92IHI4PTEKIChwOSkJdG5hdC5ueiBwMTAscDA9cjE1CiAJYWRkcyByMTI9LTE2LHIxCQkvLyBzd2l0Y2ggdG8ga2VybmVsIG1lbW9yeSBzdGFjayAod2l0aCAxNiBieXRlcyBvZiBzY3JhdGNoKQogCkBAIC05MzQsOSArOTcxLDkgQEAKIAltb3YgcjEzPXIyCQkJCS8vIGVzdGFibGlzaCBgY3VycmVudCcKIAltb3ZsIHIxPV9fZ3AJCQkJLy8gZXN0YWJsaXNoIGtlcm5lbCBnbG9iYWwgcG9pbnRlcgogCTs7Ci0ocDE0KQltb3YgaW42PS0xCisJc3Q4IFtyMTZdPXI4CQkvLyBlbnN1cmUgcHRfcmVncy5yOCAhPSAwIChzZWUgaGFuZGxlX3N5c2NhbGxfZXJyb3IpCisocDEzKQltb3YgaW42PS0xCiAocDgpCW1vdiBpbjc9LTEKLQlub3AuaSAwCiAKIAljbXAuZXEgcFN5cyxwTm9uU3lzPXIwLHIwCQkvLyBzZXQgcFN5cz0xLCBwTm9uU3lzPTAKIAltb3ZsIHIxNz1GUFNSX0RFRkFVTFQKQEAgLTEwMDcsNiArMTA0NCw4IEBACiAJRkFVTFQoMTcpCiAKIEVOVFJZKG5vbl9zeXNjYWxsKQorCW1vdiBhci5yc2M9cjI3CQkJLy8gcmVzdG9yZSBhci5yc2MgYmVmb3JlIFNBVkVfTUlOX1dJVEhfQ09WRVIKKwk7OwogCVNBVkVfTUlOX1dJVEhfQ09WRVIKIAogCS8vIFRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgcmVhc29uIGZvciB0aGlzIGNvZGUgdG8gYmUgaGVyZSwgb3RoZXIgdGhhbiB0aGF0CkBAIC0xMjA0LDYgKzEyNDMsMjUgQEAKIC8vIDB4NTYwMCBFbnRyeSAyNiAoc2l6ZSAxNiBidW5kbGVzKSBOYXQgQ29uc3VtcHRpb24gKDExLDIzLDM3LDUwKQogRU5UUlkobmF0X2NvbnN1bXB0aW9uKQogCURCR19GQVVMVCgyNikKKworCW1vdiByMTY9Y3IuaXBzcgorCW1vdiByMTc9Y3IuaXNyCisJbW92IHIzMT1wcgkJCQkvLyBzYXZlIFBSCisJOzsKKwlhbmQgcjE4PTB4ZixyMTcJCQkJLy8gcjE4ID0gY3IuaXBzci5jb2RlezM6MH0KKwl0Yml0LnogcDYscDA9cjE3LElBNjRfSVNSX05BX0JJVAorCTs7CisJY21wLm5lLm9yIHA2LHAwPUlBNjRfSVNSX0NPREVfTEZFVENILHIxOAorCWRlcCByMTY9LTEscjE2LElBNjRfUFNSX0VEX0JJVCwxCisocDYpCWJyLmNvbmQuc3BudCAxZgkJLy8gYnJhbmNoIGlmIChjci5pc3ByLm5hID09IDAgfHwgY3IuaXBzci5jb2RlezM6MH0gIT0gTEZFVENIKQorCTs7CisJbW92IGNyLmlwc3I9cjE2CQkvLyBzZXQgY3IuaXBzci5uYQorCW1vdiBwcj1yMzEsLTEKKwk7OworCXJmaQorCisxOgltb3YgcHI9cjMxLC0xCisJOzsKIAlGQVVMVCgyNikKIEVORChuYXRfY29uc3VtcHRpb24pCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggNTk3ODgyMy4uODg0ZjVjZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiBleHRlcm4gdm9pZCBqcHJvYmVfaW5zdF9yZXR1cm4odm9pZCk7CiAKQEAgLTI2MywxMyArMjY0LDMzIEBACiAJfQogfQogCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhZGRyIGlzIGluIHRoZSBJbnRlcnJ1cHQgVmVjdG9yIFRhYmxlICovCitzdGF0aWMgaW5saW5lIGludCBpbl9pdnRfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpX19zdGFydF9pdnRfdGV4dAorCQkmJiBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpX19lbmRfaXZ0X3RleHQpOworfQorCiBzdGF0aWMgaW50IHZhbGlkX2twcm9iZV9hZGRyKGludCB0ZW1wbGF0ZSwgaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAoKHNsb3QgPiAyKSB8fCAoKGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bMV0gPT0gTCkgJiYgc2xvdCA+IDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0dGVtcHRpbmcgdG8gaW5zZXJ0IHVuYWxpZ25lZCBrcHJvYmUgYXQgMHglbHhcbiIsCi0JCQkJYWRkcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0dGVtcHRpbmcgdG8gaW5zZXJ0IHVuYWxpZ25lZCBrcHJvYmUgIgorCQkJCSJhdCAweCVseFxuIiwgYWRkcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworIAlpZiAoaW5faXZ0X2Z1bmN0aW9ucyhhZGRyKSkgeworIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiS3Byb2JlcyBjYW4ndCBiZSBpbnNlcnRlZCBpbnNpZGUgIgorCQkJCSJJVlQgZnVuY3Rpb25zIGF0IDB4JWx4XG4iLCBhZGRyKTsKKyAJCXJldHVybiAtRUlOVkFMOworIAl9CisKKwlpZiAoc2xvdCA9PSAxICYmIGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bMV0gIT0gTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnNlcnRpbmcga3Byb2JlcyBvbiBzbG90ICMxICIKKwkJICAgICAgICJpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5MCw2ICszMTEsOTQgQEAKIAljdXJyZW50X2twcm9iZSA9IHA7CiB9CiAKK3N0YXRpYyB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpCit7Cit9CisKKy8qCisgKiBBdCB0aGlzIHBvaW50IHRoZSB0YXJnZXQgZnVuY3Rpb24gaGFzIGJlZW4gdHJpY2tlZCBpbnRvCisgKiByZXR1cm5pbmcgaW50byBvdXIgdHJhbXBvbGluZS4gIExvb2t1cCB0aGUgYXNzb2NpYXRlZCBpbnN0YW5jZQorICogYW5kIHRoZW46CisgKiAgICAtIGNhbGwgdGhlIGhhbmRsZXIgZnVuY3Rpb24KKyAqICAgIC0gY2xlYW51cCBieSBtYXJraW5nIHRoZSBpbnN0YW5jZSBhcyB1bnVzZWQKKyAqICAgIC0gbG9uZyBqdW1wIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHJldHVybiBhZGRyZXNzCisgKi8KK2ludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkgPSBOVUxMOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPQorCQkoKHN0cnVjdCBmbnB0ciAqKWtyZXRwcm9iZV90cmFtcG9saW5lKS0+aXA7CisKKyAgICAgICAgaGVhZCA9IGtyZXRwcm9iZV9pbnN0X3RhYmxlX2hlYWQoY3VycmVudCk7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCisJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoZW4gb25lIHJldHVybgorCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCisJICoKKwkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKKwkgKiAgICAgLSBpbnN0YW5jZXMgYXJlIGFsd2F5cyBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdAorCSAqICAgICAtIHdoZW4gbXVsdGlwbGUgcmV0dXJuIHByb2JlcyBhcmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUKKwkgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKwkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpCisJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOworCisJCW9yaWdfcmV0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CisJCXJlY3ljbGVfcnBfaW5zdChyaSk7CisKKwkJaWYgKG9yaWdfcmV0X2FkZHJlc3MgIT0gdHJhbXBvbGluZV9hZGRyZXNzKQorCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgcmV0dXJuIGFkZHJlc3MuIEFueSBvdGhlcgorCQkJICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sgYXJlIGZvcgorCQkJICogb3RoZXIgY2FsbHMgZGVlcGVyIG9uIHRoZSBjYWxsIHN0YWNrCisJCQkgKi8KKwkJCWJyZWFrOworCX0KKworCUJVR19PTighb3JpZ19yZXRfYWRkcmVzcyB8fCAob3JpZ19yZXRfYWRkcmVzcyA9PSB0cmFtcG9saW5lX2FkZHJlc3MpKTsKKwlyZWdzLT5jcl9paXAgPSBvcmlnX3JldF9hZGRyZXNzOworCisJdW5sb2NrX2twcm9iZXMoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUsIHdlIGFyZSB0ZWxsaW5nCisgICAgICAgICAqIGtwcm9iZV9oYW5kbGVyKCkgdGhhdCB3ZSBoYXZlIGhhbmRsZWQgdW5sb2NraW5nCisgICAgICAgICAqIGFuZCByZS1lbmFibGluZyBwcmVlbXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CisKKwlpZiAoKHJpID0gZ2V0X2ZyZWVfcnBfaW5zdChycCkpICE9IE5VTEwpIHsKKwkJcmktPnJwID0gcnA7CisJCXJpLT50YXNrID0gY3VycmVudDsKKwkJcmktPnJldF9hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKXJlZ3MtPmIwOworCisJCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyIHdpdGggdHJhbXBvbGluZSBhZGRyICovCisJCXJlZ3MtPmIwID0gKChzdHJ1Y3QgZm5wdHIgKilrcmV0cHJvYmVfdHJhbXBvbGluZSktPmlwOworCisJCWFkZF9ycF9pbnN0KHJpKTsKKwl9IGVsc2UgeworCQlycC0+bm1pc3NlZCsrOworCX0KK30KKwogaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgcC0+YWRkcjsKQEAgLTQ5Miw4ICs2MDEsOCBAQAogCWlmIChwLT5wcmVfaGFuZGxlciAmJiBwLT5wcmVfaGFuZGxlcihwLCByZWdzKSkKIAkJLyoKIAkJICogT3VyIHByZS1oYW5kbGVyIGlzIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIHRoYXQgd2UganVzdAotCQkgKiBkbyBhIHJldHVybi4gIFRoaXMgaXMgaGFuZGxpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlCi0JCSAqIHByZS1oYW5kbGVyIGlzIHJlYWxseSBvdXIgc3BlY2lhbCBqcHJvYmUgcHJlLWhhbmRsZXIuCisJCSAqIGRvIGEgcmV0dXJuLiAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSBqcHJvYmUgcHJlLWhhbmRsZXIKKwkJICogYW5kIHRoZSBrcmV0cHJvYmUgdHJhbXBvbGluZQogCQkgKi8KIAkJcmV0dXJuIDE7CiAKQEAgLTU5OSwzICs3MDgsMTQgQEAKIAkqcmVncyA9IGpwcm9iZV9zYXZlZF9yZWdzOwogCXJldHVybiAxOwogfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSB0cmFtcG9saW5lX3AgPSB7CisJLnByZV9oYW5kbGVyID0gdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyCit9OworCitpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCit7CisJdHJhbXBvbGluZV9wLmFkZHIgPQorCQkoa3Byb2JlX29wY29kZV90ICopKChzdHJ1Y3QgZm5wdHIgKilrcmV0cHJvYmVfdHJhbXBvbGluZSktPmlwOworCXJldHVybiByZWdpc3Rlcl9rcHJvYmUoJnRyYW1wb2xpbmVfcCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwppbmRleCA3MzZlMzI4Li40ZWJiZjM5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FDUEkKIAotc3RhdGljIGludCBjcGVfdmVjdG9yID0gLTE7CitpbnQgY3BlX3ZlY3RvciA9IC0xOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QKIGlhNjRfbWNhX2NwZV9pbnRfaGFuZGxlciAoaW50IGNwZV9pcnEsIHZvaWQgKmFyZywgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbnVtYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9udW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4Y2U2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbnVtYS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIGlhNjQga2VybmVsIE5VTUEgc3BlY2lmaWMgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgRXJpY2ggRm9jaHQgPGVmb2NodEBlc3MubmVjLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqICAgSmVzc2UgQmFybmVzIDxqYmFybmVzQHNnaS5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKK3U4IGNwdV90b19ub2RlX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworRVhQT1JUX1NZTUJPTChjcHVfdG9fbm9kZV9tYXApOworCitjcHVtYXNrX3Qgbm9kZV90b19jcHVfbWFza1tNQVhfTlVNTk9ERVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CisKKy8qKgorICogYnVpbGRfY3B1X3RvX25vZGVfbWFwIC0gc2V0dXAgY3B1IHRvIG5vZGUgYW5kIG5vZGUgdG8gY3B1bWFzayBhcnJheXMKKyAqCisgKiBCdWlsZCBjcHUgdG8gbm9kZSBtYXBwaW5nIGFuZCBpbml0aWFsaXplIHRoZSBwZXIgbm9kZSBjcHUgbWFza3MgdXNpbmcKKyAqIGluZm8gZnJvbSB0aGUgbm9kZV9jcHVpZCBhcnJheSBoYW5kZWQgdG8gdXMgYnkgQUNQSS4KKyAqLwordm9pZCBfX2luaXQgYnVpbGRfY3B1X3RvX25vZGVfbWFwKHZvaWQpCit7CisJaW50IGNwdSwgaSwgbm9kZTsKKworCWZvcihub2RlPTA7IG5vZGUgPCBNQVhfTlVNTk9ERVM7IG5vZGUrKykKKwkJY3B1c19jbGVhcihub2RlX3RvX2NwdV9tYXNrW25vZGVdKTsKKworCWZvcihjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgeworCQlub2RlID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpCisJCQlpZiAoY3B1X3BoeXNpY2FsX2lkKGNwdSkgPT0gbm9kZV9jcHVpZFtpXS5waHlzX2lkKSB7CisJCQkJbm9kZSA9IG5vZGVfY3B1aWRbaV0ubmlkOworCQkJCWJyZWFrOworCQkJfQorCQljcHVfdG9fbm9kZV9tYXBbY3B1XSA9IChub2RlID49IDApID8gbm9kZSA6IDA7CisJCWlmIChub2RlID49IDApCisJCQljcHVfc2V0KGNwdSwgbm9kZV90b19jcHVfbWFza1tub2RlXSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCA2NDA3YmZmLi5iOGViYjhlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlYmI3MWYzLi5lNDg0OTEwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdS5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgpAQCAtMTk1LDYgKzE5Niw3IEBACiB2b2lkCiBkZWZhdWx0X2lkbGUgKHZvaWQpCiB7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCiAJCWlmIChjYW5fZG9fcGFsX2hhbHQpCiAJCQlzYWZlX2hhbHQoKTsKQEAgLTcwNyw2ICs3MDksMTMgQEAKIHZvaWQKIGZsdXNoX3RocmVhZCAodm9pZCkKIHsKKwkvKgorCSAqIFJlbW92ZSBmdW5jdGlvbi1yZXR1cm4gcHJvYmUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKwkgKiBhbmQgcHV0IHRoZW0gYmFjayBvbiB0aGUgZnJlZSBsaXN0LiBEbyBub3QgaW5zZXJ0IGFuIGV4aXQgcHJvYmUgZm9yCisJICogdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBiZSBkaXNhYmxlZCBieSBrcHJvYmVfZmx1c2hfdGFzayBpZiB5b3UgZG8uCisJICovCisJa3Byb2JlX2ZsdXNoX3Rhc2soY3VycmVudCk7CisKIAkvKiBkcm9wIGZsb2F0aW5nLXBvaW50IGFuZCBkZWJ1Zy1yZWdpc3RlciBzdGF0ZSBpZiBpdCBleGlzdHM6ICovCiAJY3VycmVudC0+dGhyZWFkLmZsYWdzICY9IH4oSUE2NF9USFJFQURfRlBIX1ZBTElEIHwgSUE2NF9USFJFQURfREJHX1ZBTElEKTsKIAlpYTY0X2Ryb3BfZnB1KGN1cnJlbnQpOwpAQCAtNzIxLDYgKzczMCwxNCBAQAogdm9pZAogZXhpdF90aHJlYWQgKHZvaWQpCiB7CisKKwkvKgorCSAqIFJlbW92ZSBmdW5jdGlvbi1yZXR1cm4gcHJvYmUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKwkgKiBhbmQgcHV0IHRoZW0gYmFjayBvbiB0aGUgZnJlZSBsaXN0LiBEbyBub3QgaW5zZXJ0IGFuIGV4aXQgcHJvYmUgZm9yCisJICogdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBiZSBkaXNhYmxlZCBieSBrcHJvYmVfZmx1c2hfdGFzayBpZiB5b3UgZG8uCisJICovCisJa3Byb2JlX2ZsdXNoX3Rhc2soY3VycmVudCk7CisKIAlpYTY0X2Ryb3BfZnB1KGN1cnJlbnQpOwogI2lmZGVmIENPTkZJR19QRVJGTU9OCiAgICAgICAgLyogaWYgbmVlZGVkLCBzdG9wIG1vbml0b3JpbmcgYW5kIGZsdXNoIHN0YXRlIHRvIHBlcmZtb24gY29udGV4dCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNmQ1N2FlYi4uYmJiOGJjNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3B0cmFjZS5jCkBAIC03MjUsMTIgKzcyNSwzMiBAQAogCQkJYnJlYWs7CiAJfQogCisJLyoKKwkgKiBOb3RlOiBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwsIHRoZSB0YXJnZXQgdGFzayBpcyBibG9ja2VkCisJICogaW4gbm90aWZ5X3Jlc3VtZV91c2VyKCkgYW5kIGJ5IGNsZWFybGluZyBQUkVEX0xFQVZFX1NZU0NBTEwKKwkgKiAoYWthLCAicEx2U3lzIikgd2UgcmVkaXJlY3QgZXhlY3V0aW9uIGZyb20KKwkgKiAud29ya19wZW5kaW5nX3N5c2NhbGxfZW5kIHRvIC53b3JrX3Byb2Nlc3NlZF9rZXJuZWwuCisJICovCiAJdW53X2dldF9wcigmcHJldl9pbmZvLCAmcHIpOwotCXByICY9IH4oMVVMIDw8IFBSRURfU1lTQ0FMTCk7CisJcHIgJj0gfigoMVVMIDw8IFBSRURfU1lTQ0FMTCkgfCAoMVVMIDw8IFBSRURfTEVBVkVfU1lTQ0FMTCkpOwogCXByIHw9ICAoMVVMIDw8IFBSRURfTk9OX1NZU0NBTEwpOwogCXVud19zZXRfcHIoJnByZXZfaW5mbywgcHIpOwogCiAJcHQtPmNyX2lmcyA9ICgxVUwgPDwgNjMpIHwgY2ZtOworCS8qCisJICogQ2xlYXIgdGhlIG1lbW9yeSB0aGF0IGlzIE5PVCB3cml0dGVuIG9uIHN5c2NhbGwtZW50cnkgdG8KKwkgKiBlbnN1cmUgd2UgZG8gbm90IGxlYWsga2VybmVsLXN0YXRlIHRvIHVzZXIgd2hlbiBleGVjdXRpb24KKwkgKiByZXN1bWVzLgorCSAqLworCXB0LT5yMiA9IDA7CisJcHQtPnIzID0gMDsKKwlwdC0+cjE0ID0gMDsKKwltZW1zZXQoJnB0LT5yMTYsIDAsIDE2KjgpOwkvKiBjbGVhciByMTYtcjMxICovCisJbWVtc2V0KCZwdC0+ZjYsIDAsIDYqMTYpOwkvKiBjbGVhciBmNi1mMTEgKi8KKwlwdC0+YjcgPSAwOworCXB0LT5hcl9jY3YgPSAwOworCXB0LT5hcl9jc2QgPSAwOworCXB0LT5hcl9zc2QgPSAwOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggZDE0NjkyZS4uODRmODlkYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjAsNiArMjAsNyBAQAogICogMDIvMDEvMDAgUi5TZXRoCWZpeGVkIGdldF9jcHVpbmZvIGZvciBTTVAKICAqIDAxLzA3Lzk5IFMuRXJhbmlhbglhZGRlZCB0aGUgc3VwcG9ydCBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50CiAgKiAwNi8yNC85OSBXLkRydW1tb25kCWFkZGVkIGJvb3RfY3B1X2RhdGEuCisgKiAwNS8yOC8wNSBaLiBNZW55aGFydAlEeW5hbWljIHN0cmlkZSBzaXplIGZvciAiZmx1c2hfaWNhY2hlX3JhbmdlKCkiCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwLDYgKzQxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KQEAgLTcyLDYgKzc1LDggQEAKIHVuc2lnbmVkIGxvbmcgaWE2NF9jeWNsZXNfcGVyX3VzZWM7CiBzdHJ1Y3QgaWE2NF9ib290X3BhcmFtICppYTY0X2Jvb3RfcGFyYW07CiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87Cit1bnNpZ25lZCBsb25nIHZnYV9jb25zb2xlX2lvYmFzZTsKK3Vuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfbWVtYmFzZTsKIAogdW5zaWduZWQgbG9uZyBpYTY0X21heF9jYWNoZWxpbmVfc2l6ZTsKIHVuc2lnbmVkIGxvbmcgaWE2NF9pb2Jhc2U7CS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgSS9PIGFjY2Vzc2VzICovCkBAIC04MSw2ICs4NiwxMyBAQAogdW5zaWduZWQgaW50IG51bV9pb19zcGFjZXM7CiAKIC8qCisgKiAiZmx1c2hfaWNhY2hlX3JhbmdlKCkiIG5lZWRzIHRvIGtub3cgd2hhdCBwcm9jZXNzb3IgZGVwZW5kZW50IHN0cmlkZSBzaXplIHRvIHVzZQorICogd2hlbiBpdCBtYWtlcyBpLWNhY2hlKHMpIGNvaGVyZW50IHdpdGggZC1jYWNoZXMuCisgKi8KKyNkZWZpbmUJSV9DQUNIRV9TVFJJREVfU0hJRlQJNQkvKiBTYWZlc3Qgd2F5IHRvIGdvOiAzMiBieXRlcyBieSAzMiBieXRlcyAqLwordW5zaWduZWQgbG9uZyBpYTY0X2lfY2FjaGVfc3RyaWRlX3NoaWZ0ID0gfjA7CisKKy8qCiAgKiBUaGUgbWVyZ2VfbWFzayB2YXJpYWJsZSBuZWVkcyB0byBiZSBzZXQgdG8gKG1heChpb21tdV9wYWdlX3NpemUoaW9tbXUpKSAtIDEpLiAgVGhpcwogICogbWFzayBzcGVjaWZpZXMgYSBtYXNrIG9mIGFkZHJlc3MgYml0cyB0aGF0IG11c3QgYmUgMCBpbiBvcmRlciBmb3IgdHdvIGJ1ZmZlcnMgdG8gYmUKICAqIG1lcmdlYWJsZSBieSB0aGUgSS9PIE1NVSAoaS5lLiwgdGhlIGVuZCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBidWZmZXIgYW5kIHRoZSBzdGFydApAQCAtMjczLDIzICsyODUsMjUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAogZWFybHlfY29uc29sZV9zZXR1cCAoY2hhciAqY21kbGluZSkKIHsKKwlpbnQgZWFybHljb25zID0gMDsKKwogI2lmZGVmIENPTkZJR19TRVJJQUxfU0dJX0wxX0NPTlNPTEUKIAl7CiAJCWV4dGVybiBpbnQgc25fc2VyaWFsX2NvbnNvbGVfZWFybHlfc2V0dXAodm9pZCk7CiAJCWlmICghc25fc2VyaWFsX2NvbnNvbGVfZWFybHlfc2V0dXAoKSkKLQkJCXJldHVybiAwOworCQkJZWFybHljb25zKys7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VGSV9QQ0RQCiAJaWYgKCFlZmlfc2V0dXBfcGNkcF9jb25zb2xlKGNtZGxpbmUpKQotCQlyZXR1cm4gMDsKKwkJZWFybHljb25zKys7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQogCWlmICghZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjbWRsaW5lKSkKLQkJcmV0dXJuIDA7CisJCWVhcmx5Y29ucysrOwogI2VuZGlmCiAKLQlyZXR1cm4gLTE7CisJcmV0dXJuIChlYXJseWNvbnMpID8gMCA6IC0xOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTYyMiw2ICs2MzYsMTIgQEAKIAkvKiBzdGFydF9rZXJuZWwoKSByZXF1aXJlcyB0aGlzLi4uICovCiB9CiAKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG1heC4gY2FjaGUgbGluZSBzaXplLgorICoKKyAqIEluIGFkZGl0aW9uLCB0aGUgbWluaW11bSBvZiB0aGUgaS1jYWNoZSBzdHJpZGUgc2l6ZXMgaXMgY2FsY3VsYXRlZCBmb3IKKyAqICJmbHVzaF9pY2FjaGVfcmFuZ2UoKSIuCisgKi8KIHN0YXRpYyB2b2lkCiBnZXRfbWF4X2NhY2hlbGluZV9zaXplICh2b2lkKQogewpAQCAtNjM1LDYgKzY1NSw4IEBACiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogaWE2NF9wYWxfY2FjaGVfc3VtbWFyeSgpIGZhaWxlZCAoc3RhdHVzPSVsZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICBtYXggPSBTTVBfQ0FDSEVfQllURVM7CisJCS8qIFNhZmVzdCBzZXR1cCBmb3IgImZsdXNoX2ljYWNoZV9yYW5nZSgpIiAqLworCQlpYTY0X2lfY2FjaGVfc3RyaWRlX3NoaWZ0ID0gSV9DQUNIRV9TVFJJREVfU0hJRlQ7CiAJCWdvdG8gb3V0OwogICAgICAgICB9CiAKQEAgLTY0MywxNCArNjY1LDMxIEBACiAJCQkJCQkgICAgJmNjaSk7CiAJCWlmIChzdGF0dXMgIT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbyhsPSVsdSkgZmFpbGVkIChzdGF0dXM9JWxkKVxuIiwKKwkJCSAgICAgICAiJXM6IGlhNjRfcGFsX2NhY2hlX2NvbmZpZ19pbmZvKGw9JWx1LCAyKSBmYWlsZWQgKHN0YXR1cz0lbGQpXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXywgbCwgc3RhdHVzKTsKIAkJCW1heCA9IFNNUF9DQUNIRV9CWVRFUzsKKwkJCS8qIFRoZSBzYWZlc3Qgc2V0dXAgZm9yICJmbHVzaF9pY2FjaGVfcmFuZ2UoKSIgKi8KKwkJCWNjaS5wY2NpX3N0cmlkZSA9IElfQ0FDSEVfU1RSSURFX1NISUZUOworCQkJY2NpLnBjY2lfdW5pZmllZCA9IDE7CiAJCX0KIAkJbGluZV9zaXplID0gMSA8PCBjY2kucGNjaV9saW5lX3NpemU7CiAJCWlmIChsaW5lX3NpemUgPiBtYXgpCiAJCQltYXggPSBsaW5lX3NpemU7Ci0gICAgICAgIH0KKwkJaWYgKCFjY2kucGNjaV91bmlmaWVkKSB7CisJCQlzdGF0dXMgPSBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbyhsLAorCQkJCQkJICAgIC8qIGNhY2hlX3R5cGUgKGluc3RydWN0aW9uKT0gKi8gMSwKKwkJCQkJCSAgICAmY2NpKTsKKwkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogaWE2NF9wYWxfY2FjaGVfY29uZmlnX2luZm8obD0lbHUsIDEpIGZhaWxlZCAoc3RhdHVzPSVsZClcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgbCwgc3RhdHVzKTsKKwkJCQkvKiBUaGUgc2FmZXN0IHNldHVwIGZvciAiZmx1c2hfaWNhY2hlX3JhbmdlKCkiICovCisJCQkJY2NpLnBjY2lfc3RyaWRlID0gSV9DQUNIRV9TVFJJREVfU0hJRlQ7CisJCQl9CisJCX0KKwkJaWYgKGNjaS5wY2NpX3N0cmlkZSA8IGlhNjRfaV9jYWNoZV9zdHJpZGVfc2hpZnQpCisJCQlpYTY0X2lfY2FjaGVfc3RyaWRlX3NoaWZ0ID0gY2NpLnBjY2lfc3RyaWRlOworCX0KICAgb3V0OgogCWlmIChtYXggPiBpYTY0X21heF9jYWNoZWxpbmVfc2l6ZSkKIAkJaWE2NF9tYXhfY2FjaGVsaW5lX3NpemUgPSBtYXg7CkBAIC03NzksNiArODE4LDcgQEAKIAkvKiBzaXplIG9mIHBoeXNpY2FsIHN0YWNrZWQgcmVnaXN0ZXIgcGFydGl0aW9uIHBsdXMgOCBieXRlczogKi8KIAlfX2dldF9jcHVfdmFyKGlhNjRfcGh5c19zdGFja2VkX3NpemVfcDgpID0gbnVtX3BoeXNfc3RhY2tlZCo4ICsgODsKIAlwbGF0Zm9ybV9jcHVfaW5pdCgpOworCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jCmluZGV4IGVkZDlmMDcuLmI4YTBhN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYwpAQCAtMTQzLDYgKzE0Myw3IEBACiAKIAkJX19jb3B5X2Zyb21fdXNlcihjdXJyZW50LT50aHJlYWQuZnBoLCAmc2MtPnNjX2ZyWzMyXSwgOTYqMTYpOwogCQlwc3ItPm1maCA9IDA7CS8qIGRyb3Agc2lnbmFsIGhhbmRsZXIncyBmcGggY29udGVudHMuLi4gKi8KKwkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWlmIChwc3ItPmRmaCkKIAkJCWlhNjRfZHJvcF9mcHUoY3VycmVudCk7CiAJCWVsc2UgewpAQCAtMTUwLDYgKzE1MSw3IEBACiAJCQlfX2lhNjRfbG9hZF9mcHUoY3VycmVudC0+dGhyZWFkLmZwaCk7CiAJCQlpYTY0X3NldF9sb2NhbF9mcHVfb3duZXIoY3VycmVudCk7CiAJCX0KKwkJcHJlZW1wdF9lbmFibGUoKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCmluZGV4IGI0OWQ0ZGQuLjAxNjZhOTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwpAQCAtMjMxLDEzICsyMzEsMTYgQEAKIHZvaWQKIHNtcF9mbHVzaF90bGJfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXByZWVtcHRfZGlzYWJsZSgpOwogCS8qIHRoaXMgaGFwcGVucyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGEgc2luZ2xlLXRocmVhZGVkIGZvcmsoKTogICovCiAJaWYgKGxpa2VseShtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0gJiYgYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPT0gMSkpCiAJewogCQlsb2NhbF9maW5pc2hfZmx1c2hfdGxiX21tKG1tKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuOwogCX0KIAorCXByZWVtcHRfZW5hYmxlKCk7CiAJLyoKIAkgKiBXZSBjb3VsZCBvcHRpbWl6ZSB0aGlzIGZ1cnRoZXIgYnkgdXNpbmcgbW0tPmNwdV92bV9tYXNrIHRvIHRyYWNrIHdoaWNoIENQVXMKIAkgKiBoYXZlIGJlZW4gcnVubmluZyBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhpcyBpcyB3b3J0aCB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggNjIzYjBhNS4uN2Q3MmMwZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKQEAgLTUyNSw0NyArNTI1LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfTlVNQQotCi0vKiBvbiB3aGljaCBub2RlIGlzIGVhY2ggbG9naWNhbCBDUFUgKG9uZSBjYWNoZWxpbmUgZXZlbiBmb3IgNjQgQ1BVcykgKi8KLXU4IGNwdV90b19ub2RlX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotRVhQT1JUX1NZTUJPTChjcHVfdG9fbm9kZV9tYXApOwotLyogd2hpY2ggbG9naWNhbCBDUFVzIGFyZSBvbiB3aGljaCBub2RlcyAqLwotY3B1bWFza190IG5vZGVfdG9fY3B1X21hc2tbTUFYX05VTU5PREVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotCi0vKgotICogQnVpbGQgY3B1IHRvIG5vZGUgbWFwcGluZyBhbmQgaW5pdGlhbGl6ZSB0aGUgcGVyIG5vZGUgY3B1IG1hc2tzLgotICovCi12b2lkIF9faW5pdAotYnVpbGRfY3B1X3RvX25vZGVfbWFwICh2b2lkKQotewotCWludCBjcHUsIGksIG5vZGU7Ci0KLQlmb3Iobm9kZT0wOyBub2RlPE1BWF9OVU1OT0RFUzsgbm9kZSsrKQotCQljcHVzX2NsZWFyKG5vZGVfdG9fY3B1X21hc2tbbm9kZV0pOwotCWZvcihjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgewotCQkvKgotCQkgKiBBbGwgSXRhbml1bSBOVU1BIHBsYXRmb3JtcyBJIGtub3cgdXNlIEFDUEksIHNvIG1heWJlIHdlCi0JCSAqIGNhbiBkcm9wIHRoaXMgaWZkZWYgY29tcGxldGVseS4gICAgICAgICAgICAgICAgICAgIFtFRl0KLQkJICovCi0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCQlub2RlID0gLTE7Ci0JCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpCi0JCQlpZiAoY3B1X3BoeXNpY2FsX2lkKGNwdSkgPT0gbm9kZV9jcHVpZFtpXS5waHlzX2lkKSB7Ci0JCQkJbm9kZSA9IG5vZGVfY3B1aWRbaV0ubmlkOwotCQkJCWJyZWFrOwotCQkJfQotI2Vsc2UKLSMJCWVycm9yIEZpeG1lOiBEdW5ubyBob3cgdG8gYnVpbGQgQ1BVLXRvLW5vZGUgbWFwLgotI2VuZGlmCi0JCWNwdV90b19ub2RlX21hcFtjcHVdID0gKG5vZGUgPj0gMCkgPyBub2RlIDogMDsKLQkJaWYgKG5vZGUgPj0gMCkKLQkJCWNwdV9zZXQoY3B1LCBub2RlX3RvX2NwdV9tYXNrW25vZGVdKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwotCiAvKgogICogQ3ljbGUgdGhyb3VnaCB0aGUgQVBzIHNlbmRpbmcgV2FrZXVwIElQSXMgdG8gYm9vdCBlYWNoLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggZjFhYWZkNC4uOTJmZjQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMzYsNiArMzYsMTUgQEAKIAlwYXJlbnQgPSAmc3lzZnNfbm9kZXNbY3B1X3RvX25vZGUobnVtKV07CiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAorI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKwkvKgorCSAqIElmIENQRUkgY2Fubm90IGJlIHJlLXRhcmdldHRlZCwgYW5kIHRoaXMgaXMKKwkgKiBDUEVJIHRhcmdldCwgdGhlbiBkb250IGNyZWF0ZSB0aGUgY29udHJvbCBmaWxlCisJICovCisJaWYgKCFjYW5fY3BlaV9yZXRhcmdldCgpICYmIGlzX2NwdV9jcGVpX3RhcmdldChudW0pKQorCQlzeXNmc19jcHVzW251bV0uY3B1Lm5vX2NvbnRyb2wgPSAxOworI2VuZGlmCisKIAlyZXR1cm4gcmVnaXN0ZXJfY3B1KCZzeXNmc19jcHVzW251bV0uY3B1LCBudW0sIHBhcmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwppbmRleCBlN2U1MjBkLi40NDQwYzgzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCkBAIC05MCwxNCArOTAsMTYgQEAKIAkJLmxvY2tfb3duZXJfZGVwdGggPQkwCiAJfTsKIAlzdGF0aWMgaW50IGRpZV9jb3VudGVyOworCWludCBjcHUgPSBnZXRfY3B1KCk7CiAKLQlpZiAoZGllLmxvY2tfb3duZXIgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJaWYgKGRpZS5sb2NrX293bmVyICE9IGNwdSkgewogCQljb25zb2xlX3ZlcmJvc2UoKTsKIAkJc3Bpbl9sb2NrX2lycSgmZGllLmxvY2spOwotCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllLmxvY2tfb3duZXIgPSBjcHU7CiAJCWRpZS5sb2NrX293bmVyX2RlcHRoID0gMDsKIAkJYnVzdF9zcGlubG9ja3MoMSk7CiAJfQorCXB1dF9jcHUoKTsKIAogCWlmICgrK2RpZS5sb2NrX293bmVyX2RlcHRoIDwgMykgewogCQlwcmludGsoIiVzWyVkXTogJXMgJWxkIFslZF1cbiIsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjlmMGRiNC4uYTY3NmU3OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtOCw2ICs4LDExIEBACiAjZGVmaW5lIExPQURfT0ZGU0VUCShLRVJORUxfU1RBUlQgLSBLRVJORUxfVFJfUEFHRV9TSVpFKQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CiAKKyNkZWZpbmUgSVZUX1RFWFQJCQkJCQkJXAorCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X2l2dF90ZXh0KSA9IC47CQkJXAorCQkqKC50ZXh0Lml2dCkJCQkJCQlcCisJCVZNTElOVVhfU1lNQk9MKF9fZW5kX2l2dF90ZXh0KSA9IC47CisKIE9VVFBVVF9GT1JNQVQoImVsZjY0LWlhNjQtbGl0dGxlIikKIE9VVFBVVF9BUkNIKGlhNjQpCiBFTlRSWShwaHlzX3N0YXJ0KQpAQCAtMzksNyArNDQsNyBAQAogCiAgIC50ZXh0IDogQVQoQUREUigudGV4dCkgLSBMT0FEX09GRlNFVCkKICAgICB7Ci0JKigudGV4dC5pdnQpCisJSVZUX1RFWFQKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvZmx1c2guUyBiL2FyY2gvaWE2NC9saWIvZmx1c2guUwppbmRleCBhMWFmOTE0Li4zZTJjZmEyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2ZsdXNoLlMKKysrIGIvYXJjaC9pYTY0L2xpYi9mbHVzaC5TCkBAIC0zLDM3ICszLDU5IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEsIDIwMDUgSGV3bGV0dC1QYWNrYXJkIENvCiAgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKgorICogMDUvMjgvMDUgWm9sdGFuIE1lbnloYXJ0CUR5bmFtaWMgc3RyaWRlIHNpemUKICAqLworCiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKwogCiAJLyoKIAkgKiBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsZW5kKQotCSAqCU11c3QgZmx1c2ggcmFuZ2UgZnJvbSBzdGFydCB0byBlbmQtMSBidXQgbm90aGluZyBlbHNlIChuZWVkIHRvCisJICoKKwkgKglNYWtlIGktY2FjaGUocykgY29oZXJlbnQgd2l0aCBkLWNhY2hlcy4KKwkgKgorCSAqCU11c3QgZGVhbCB3aXRoIHJhbmdlIGZyb20gc3RhcnQgdG8gZW5kLTEgYnV0IG5vdGhpbmcgZWxzZSAobmVlZCB0bwogCSAqCWJlIGNhcmVmdWwgbm90IHRvIHRvdWNoIGFkZHJlc3NlcyB0aGF0IG1heSBiZSB1bm1hcHBlZCkuCisJICoKKwkgKglOb3RlOiAiaW4wIiBhbmQgImluMSIgYXJlIHByZXNlcnZlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogCSAqLwogR0xPQkFMX0VOVFJZKGZsdXNoX2ljYWNoZV9yYW5nZSkKKwogCS5wcm9sb2d1ZQotCWFsbG9jIHIyPWFyLnBmcywyLDAsMCwwCi0Jc3ViIHI4PWluMSxpbjAsMQorCWFsbG9jCXIyPWFyLnBmcywyLDAsMCwwCisJbW92bAlyMz1pYTY0X2lfY2FjaGVfc3RyaWRlX3NoaWZ0CisgCW1vdglyMjE9MQogCTs7Ci0Jc2hyLnUgcjg9cjgsNQkJCS8vIHdlIGZsdXNoIDMyIGJ5dGVzIHBlciBpdGVyYXRpb24KLQkuc2F2ZSBhci5sYywgcjMKLQltb3YgcjM9YXIubGMJCQkvLyBzYXZlIGFyLmxjCisJbGQ4CXIyMD1bcjNdCQkvLyByMjA6IHN0cmlkZSBzaGlmdAorCXN1YglyMjI9aW4xLHIwLDEJCS8vIGxhc3QgYnl0ZSBhZGRyZXNzCisJOzsKKwlzaHIudQlyMjM9aW4wLHIyMAkJLy8gc3RhcnQgLyAoc3RyaWRlIHNpemUpCisJc2hyLnUJcjIyPXIyMixyMjAJCS8vIChsYXN0IGJ5dGUgYWRkcmVzcykgLyAoc3RyaWRlIHNpemUpCisJc2hsCXIyMT1yMjEscjIwCQkvLyByMjE6IHN0cmlkZSBzaXplIG9mIHRoZSBpLWNhY2hlKHMpCisJOzsKKwlzdWIJcjg9cjIyLHIyMwkJLy8gbnVtYmVyIG9mIHN0cmlkZXMgLSAxCisJc2hsCXIyND1yMjMscjIwCQkvLyByMjQ6IGFkZHJlc3NlcyBmb3IgImZjLmkiID0KKwkJCQkJLy8JInN0YXJ0IiByb3VuZGVkIGRvd24gdG8gc3RyaWRlIGJvdW5kYXJ5CisJLnNhdmUJYXIubGMscjMKKwltb3YJcjM9YXIubGMJCS8vIHNhdmUgYXIubGMKIAk7OwogCiAJLmJvZHkKLQotCW1vdiBhci5sYz1yOAorCW1vdglhci5sYz1yOAogCTs7Ci0uTG9vcDoJZmMuaSBpbjAJCQkvLyBpc3N1YWJsZSBvbiBNMiBvbmx5Ci0JYWRkIGluMD0zMixpbjAKKwkvKgorCSAqIDMyIGJ5dGUgYWxpZ25lZCBsb29wLCBldmVuIG51bWJlciBvZiAoYWN0dWFsbHkgMikgYnVuZGxlcworCSAqLworLkxvb3A6CWZjLmkJcjI0CQkJLy8gaXNzdWFibGUgb24gTTAgb25seQorCWFkZAlyMjQ9cjIxLHIyNAkJLy8gd2UgZmx1c2ggInN0cmlkZSBzaXplIiBieXRlcyBwZXIgaXRlcmF0aW9uCisJbm9wLmkJMAogCWJyLmNsb29wLnNwdGsuZmV3IC5Mb29wCiAJOzsKIAlzeW5jLmkKIAk7OwogCXNybHouaQogCTs7Ci0JbW92IGFyLmxjPXIzCQkJLy8gcmVzdG9yZSBhci5sYworCW1vdglhci5sYz1yMwkJLy8gcmVzdG9yZSBhci5sYwogCWJyLnJldC5zcHRrLm1hbnkgcnAKIEVORChmbHVzaF9pY2FjaGVfcmFuZ2UpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKaW5kZXggZjNmZDUyOC4uYjVjOTBlNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwpAQCAtNDQsMTUwICs0NCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGVhcmx5X25vZGVfZGF0YSBtZW1fZGF0YVtNQVhfTlVNTk9ERVNdIF9faW5pdGRhdGE7Ci0KLS8qKgotICogcmVhc3NpZ25fY3B1X29ubHlfbm9kZXMgLSBjYWxsZWQgZnJvbSBmaW5kX21lbW9yeSB0byBtb3ZlIENQVS1vbmx5IG5vZGVzIHRvIGEgbWVtb3J5IG5vZGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbW92ZSBub2RlcyB3aXRoIG9ubHkgQ1BVcyAobm8gbWVtb3J5KQotICogdG8gYSBub2RlIHdpdGggbWVtb3J5IHdoaWNoIGlzIGF0IHRoZSBtaW5pbXVtIG51bWFfc2xpdCBkaXN0YW5jZS4KLSAqIEFueSByZWFzc2lnbWVudHMgd2lsbCByZXN1bHQgaW4gdGhlIGNvbXByZXNzaW9uIG9mIHRoZSBub2RlcwotICogYW5kIHJlbnVtYmVyaW5nIHRoZSBuaWQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLgotICogVGhlIHN0YXRpYyBkZWNsYXJhdGlvbnMgYmVsb3cgYXJlIHRvIGF2b2lkIGxhcmdlIHN0YWNrIHNpemUgd2hpY2gKLSAqIG1ha2VzIHRoZSBjb2RlIG5vdCByZS1lbnRyYW50LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhc3NpZ25fY3B1X29ubHlfbm9kZXModm9pZCkKLXsKLQlzdHJ1Y3Qgbm9kZV9tZW1ibGtfcyAqcDsKLQlpbnQgaSwgaiwgaywgbm5vZGUsIG5pZCwgY3B1LCBjcHVuaWQsIHB4bTsKLQl1OCBjc2xpdCwgc2xpdDsKLQlzdGF0aWMgREVDTEFSRV9CSVRNQVAobm9kZXNfd2l0aF9tZW0sIE1BWF9OVU1OT0RFUykgX19pbml0ZGF0YTsKLQlzdGF0aWMgdTggbnVtYV9zbGl0X2ZpeFtNQVhfTlVNTk9ERVMgKiBNQVhfTlVNTk9ERVNdIF9faW5pdGRhdGE7Ci0Jc3RhdGljIGludCBub2RlX2ZsaXBbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOwotCXN0YXRpYyBpbnQgb2xkX25pZF9tYXBbTlJfQ1BVU10gX19pbml0ZGF0YTsKLQotCWZvciAobm5vZGUgPSAwLCBwID0gJm5vZGVfbWVtYmxrWzBdOyBwIDwgJm5vZGVfbWVtYmxrW251bV9ub2RlX21lbWJsa3NdOyBwKyspCi0JCWlmICghdGVzdF9iaXQocC0+bmlkLCAodm9pZCAqKSBub2Rlc193aXRoX21lbSkpIHsKLQkJCXNldF9iaXQocC0+bmlkLCAodm9pZCAqKSBub2Rlc193aXRoX21lbSk7Ci0JCQlubm9kZSsrOwotCQl9Ci0KLQkvKgotCSAqIEFsbCBuaWRzIHdpdGggbWVtb3J5LgotCSAqLwotCWlmIChubm9kZSA9PSBudW1fb25saW5lX25vZGVzKCkpCi0JCXJldHVybjsKLQotCS8qCi0JICogQ2hhbmdlIG5pZHMgYW5kIGF0dGVtcHQgdG8gbWlncmF0ZSBDUFUtb25seSBub2RlcwotCSAqIHRvIHRoZSBiZXN0IG51bWFfc2xpdCAoY2xvc2VzdCBuZWlnaGJvcikgcG9zc2libGUuCi0JICogRm9yIHJlYXNzaWduZWQgQ1BVIG5vZGVzIGEgbmlkIGNhbid0IGJlIGFycml2ZWQgYXQKLQkgKiB1bnRpbCBhZnRlciB0aGlzIGxvb3AgYmVjYXVzZSB0aGUgdGFyZ2V0IG5pZCdzIG5ldwotCSAqIGlkZW50aXR5IG1pZ2h0IG5vdCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgeWV0LiBTbwotCSAqIG5ldyBuaWQgdmFsdWVzIGFyZSBmYWJyaWNhdGVkIGFib3ZlIG51bV9vbmxpbmVfbm9kZXMoKSBhbmQKLQkgKiBtYXBwZWQgYmFjayBsYXRlciB0byB0aGVpciB0cnVlIHZhbHVlLgotCSAqLwotCS8qIE1DRCAtIFRoaXMgY29kZSBpcyBhIGJpdCBjb21wbGljYXRlZCwgYnV0IG1heSBiZSB1bm5lY2Vzc2FyeSBub3cuCi0JICogV2UgY2FuIG5vdyBoYW5kbGUgbXVjaCBtb3JlIGludGVyZXN0aW5nIG5vZGUtbnVtYmVyaW5nLgotCSAqIFRoZSBvbGQgcmVxdWlyZW1lbnQgdGhhdCAwIDw9IG5pZCA8PSBudW1ub2RlcyA8PSBNQVhfTlVNTk9ERVMKLQkgKiBhbmQgdGhhdCB0aGVyZSBiZSBubyBob2xlcyBpbiB0aGUgbnVtYmVyaW5nIDAuLm51bW5vZGVzCi0JICogaGFzIGJlY29tZSBzaW1wbHkgMCA8PSBuaWQgPD0gTUFYX05VTU5PREVTLgotCSAqLwotCW5pZCA9IDA7Ci0JZm9yX2VhY2hfb25saW5lX25vZGUoaSkgIHsKLQkJaWYgKHRlc3RfYml0KGksICh2b2lkICopIG5vZGVzX3dpdGhfbWVtKSkgewotCQkJLyoKLQkJCSAqIFNhdmUgb3JpZ2luYWwgbmlkIHZhbHVlIGZvciBudW1hX3NsaXQKLQkJCSAqIGZpeHVwIGFuZCBub2RlX2NwdWlkIHJlYXNzaWdubWVudHMuCi0JCQkgKi8KLQkJCW5vZGVfZmxpcFtuaWRdID0gaTsKLQotCQkJaWYgKGkgPT0gbmlkKSB7Ci0JCQkJbmlkKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAocCA9ICZub2RlX21lbWJsa1swXTsgcCA8ICZub2RlX21lbWJsa1tudW1fbm9kZV9tZW1ibGtzXTsgcCsrKQotCQkJCWlmIChwLT5uaWQgPT0gaSkKLQkJCQkJcC0+bmlkID0gbmlkOwotCi0JCQljcHVuaWQgPSBuaWQ7Ci0JCQluaWQrKzsKLQkJfSBlbHNlCi0JCQljcHVuaWQgPSBNQVhfTlVNTk9ERVM7Ci0KLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKLQkJCWlmIChub2RlX2NwdWlkW2NwdV0ubmlkID09IGkpIHsKLQkJCQkvKgotCQkJCSAqIEZvciBub2RlcyBub3QgYmVpbmcgcmVhc3NpZ25lZCBqdXN0Ci0JCQkJICogZml4IHRoZSBjcHUncyBuaWQgYW5kIHJldmVyc2UgcHhtIG1hcAotCQkJCSAqLwotCQkJCWlmIChjcHVuaWQgPCBNQVhfTlVNTk9ERVMpIHsKLQkJCQkJcHhtID0gbmlkX3RvX3B4bV9tYXBbaV07Ci0JCQkJCXB4bV90b19uaWRfbWFwW3B4bV0gPQotCQkJCQkgICAgICAgICAgbm9kZV9jcHVpZFtjcHVdLm5pZCA9IGNwdW5pZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBGb3Igbm9kZXMgYmVpbmcgcmVhc3NpZ25lZCwgZmluZCBiZXN0IG5vZGUgYnkKLQkJCQkgKiBudW1hX3NsaXQgaW5mb3JtYXRpb24gYW5kIHRoZW4gbWFrZSBhIHRlbXBvcmFyeQotCQkJCSAqIG5pZCB2YWx1ZSBiYXNlZCBvbiBjdXJyZW50IG5pZCBhbmQgbnVtX29ubGluZV9ub2RlcygpLgotCQkJCSAqLwotCQkJCXNsaXQgPSAweGZmOwotCQkJCWsgPSAyKm51bV9vbmxpbmVfbm9kZXMoKTsKLQkJCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShqKSB7Ci0JCQkJCWlmIChpID09IGopCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZWxzZSBpZiAodGVzdF9iaXQoaiwgKHZvaWQgKikgbm9kZXNfd2l0aF9tZW0pKSB7Ci0JCQkJCQljc2xpdCA9IG51bWFfc2xpdFtpICogbnVtX29ubGluZV9ub2RlcygpICsgal07Ci0JCQkJCQlpZiAoY3NsaXQgPCBzbGl0KSB7Ci0JCQkJCQkJayA9IG51bV9vbmxpbmVfbm9kZXMoKSArIGo7Ci0JCQkJCQkJc2xpdCA9IGNzbGl0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyogc2F2ZSBvbGQgbmlkIG1hcCBzbyB3ZSBjYW4gdXBkYXRlIHRoZSBweG0gKi8KLQkJCQlvbGRfbmlkX21hcFtjcHVdID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKLQkJCQlub2RlX2NwdWlkW2NwdV0ubmlkID0gazsKLQkJCX0KLQl9Ci0KLQkvKgotCSAqIEZpeHVwIHRlbXBvcmFyeSBuaWQgdmFsdWVzIGZvciBDUFUtb25seSBub2Rlcy4KLQkgKi8KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQotCQlpZiAobm9kZV9jcHVpZFtjcHVdLm5pZCA9PSAoMipudW1fb25saW5lX25vZGVzKCkpKSB7Ci0JCQlweG0gPSBuaWRfdG9fcHhtX21hcFtvbGRfbmlkX21hcFtjcHVdXTsKLQkJCXB4bV90b19uaWRfbWFwW3B4bV0gPSBub2RlX2NwdWlkW2NwdV0ubmlkID0gbm5vZGUgLSAxOwotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IG5ub2RlOyBpKyspIHsKLQkJCQlpZiAobm9kZV9mbGlwW2ldICE9IChub2RlX2NwdWlkW2NwdV0ubmlkIC0gbnVtX29ubGluZV9ub2RlcygpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlweG0gPSBuaWRfdG9fcHhtX21hcFtvbGRfbmlkX21hcFtjcHVdXTsKLQkJCQlweG1fdG9fbmlkX21hcFtweG1dID0gbm9kZV9jcHVpZFtjcHVdLm5pZCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCS8qCi0JICogRml4IG51bWFfc2xpdCBieSBjb21wcmVzc2luZyBmcm9tIGxhcmdlcgotCSAqIG5pZCBhcnJheSB0byByZWR1Y2VkIG5pZCBhcnJheS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbm5vZGU7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IG5ub2RlOyBqKyspCi0JCQludW1hX3NsaXRfZml4W2kgKiBubm9kZSArIGpdID0KLQkJCQludW1hX3NsaXRbbm9kZV9mbGlwW2ldICogbnVtX29ubGluZV9ub2RlcygpICsgbm9kZV9mbGlwW2pdXTsKLQotCW1lbWNweShudW1hX3NsaXQsIG51bWFfc2xpdF9maXgsIHNpemVvZiAobnVtYV9zbGl0KSk7Ci0KLQlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOwotCWZvciAoaSA9IDA7IGkgPCBubm9kZTsgaSsrKQotCQlub2RlX3NldF9vbmxpbmUoaSk7Ci0KLQlyZXR1cm47Ci19CitzdGF0aWMgbm9kZW1hc2tfdCBtZW1vcnlfbGVzc19tYXNrIF9faW5pdGRhdGE7CiAKIC8qCiAgKiBUbyBwcmV2ZW50IGNhY2hlIGFsaWFzaW5nIGVmZmVjdHMsIGFsaWduIHBlci1ub2RlIHN0cnVjdHVyZXMgc28gdGhhdCB0aGV5CkBAIC0yMzMsMjggKzkwLDYgQEAKIH0KIAogLyoqCi0gKiBlYXJseV9ucl9waHlzX2NwdXNfbm9kZSAtIHJldHVybiBudW1iZXIgb2YgcGh5c2ljYWwgY3B1cyBvbiBhIGdpdmVuIG5vZGUKLSAqIEBub2RlOiBub2RlIHRvIGNoZWNrCi0gKgotICogQ291bnQgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjcHVzIG9uIEBub2RlLiAgVGhlc2UgYXJlIGNwdXMgdGhhdCBhY3R1YWxseQotICogZXhpc3QuICBXZSBjYW4ndCB1c2UgbnJfY3B1c19ub2RlKCkgeWV0IGJlY2F1c2UKLSAqIGFjcGlfYm9vdF9pbml0KCkgKHdoaWNoIGJ1aWxkcyB0aGUgbm9kZV90b19jcHVfbWFzayBhcnJheSkgaGFzbid0IGJlZW4KLSAqIGNhbGxlZCB5ZXQuCi0gKi8KLXN0YXRpYyBpbnQgZWFybHlfbnJfcGh5c19jcHVzX25vZGUoaW50IG5vZGUpCi17Ci0JaW50IGNwdSwgbiA9IDA7Ci0KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQotCQlpZiAobm9kZSA9PSBub2RlX2NwdWlkW2NwdV0ubmlkKQotCQkJaWYgKChjcHUgPT0gMCkgfHwgbm9kZV9jcHVpZFtjcHVdLnBoeXNfaWQpCi0JCQkJbisrOwotCi0JcmV0dXJuIG47Ci19Ci0KLQotLyoqCiAgKiBlYXJseV9ucl9jcHVzX25vZGUgLSByZXR1cm4gbnVtYmVyIG9mIGNwdXMgb24gYSBnaXZlbiBub2RlCiAgKiBAbm9kZTogbm9kZSB0byBjaGVjawogICoKQEAgLTI2Miw3ICs5Nyw3IEBACiAgKiBhY3BpX2Jvb3RfaW5pdCgpICh3aGljaCBidWlsZHMgdGhlIG5vZGVfdG9fY3B1X21hc2sgYXJyYXkpIGhhc24ndCBiZWVuCiAgKiBjYWxsZWQgeWV0LiAgTm90ZSB0aGF0IG5vZGUgMCB3aWxsIGFsc28gY291bnQgYWxsIG5vbi1leGlzdGVudCBjcHVzLgogICovCi1zdGF0aWMgaW50IGVhcmx5X25yX2NwdXNfbm9kZShpbnQgbm9kZSkKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X25yX2NwdXNfbm9kZShpbnQgbm9kZSkKIHsKIAlpbnQgY3B1LCBuID0gMDsKIApAQCAtMjc0LDYgKzEwOSw4NSBAQAogfQogCiAvKioKKyAqIGNvbXB1dGVfcGVybm9kZXNpemUgLSBjb21wdXRlIHNpemUgb2YgcGVybm9kZSBkYXRhCisgKiBAbm9kZTogdGhlIG5vZGUgaWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBjb21wdXRlX3Blcm5vZGVzaXplKGludCBub2RlKQoreworCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUgPSAwLCBjcHVzOworCisJY3B1cyA9IGVhcmx5X25yX2NwdXNfbm9kZShub2RlKTsKKwlwZXJub2Rlc2l6ZSArPSBQRVJDUFVfUEFHRV9TSVpFICogY3B1czsKKwlwZXJub2Rlc2l6ZSArPSBub2RlICogTDFfQ0FDSEVfQllURVM7CisJcGVybm9kZXNpemUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOworCXBlcm5vZGVzaXplICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWE2NF9ub2RlX2RhdGEpKTsKKwlwZXJub2Rlc2l6ZSA9IFBBR0VfQUxJR04ocGVybm9kZXNpemUpOworCXJldHVybiBwZXJub2Rlc2l6ZTsKK30KKworLyoqCisgKiBwZXJfY3B1X25vZGVfc2V0dXAgLSBzZXR1cCBwZXItY3B1IGFyZWFzIG9uIGVhY2ggbm9kZQorICogQGNwdV9kYXRhOiBwZXItY3B1IGFyZWEgb24gdGhpcyBub2RlCisgKiBAbm9kZTogbm9kZSB0byBzZXR1cAorICoKKyAqIENvcHkgdGhlIHN0YXRpYyBwZXItY3B1IGRhdGEgaW50byB0aGUgcmVnaW9uIHdlIGp1c3Qgc2V0IGFzaWRlIGFuZCB0aGVuCisgKiBzZXR1cCBfX3Blcl9jcHVfb2Zmc2V0IGZvciBlYWNoIENQVSBvbiB0aGlzIG5vZGUuICBSZXR1cm4gYSBwb2ludGVyIHRvCisgKiB0aGUgZW5kIG9mIHRoZSBhcmVhLgorICovCitzdGF0aWMgdm9pZCAqcGVyX2NwdV9ub2RlX3NldHVwKHZvaWQgKmNwdV9kYXRhLCBpbnQgbm9kZSkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNwdTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJaWYgKG5vZGUgPT0gbm9kZV9jcHVpZFtjcHVdLm5pZCkgeworCQkJbWVtY3B5KF9fdmEoY3B1X2RhdGEpLCBfX3BoeXNfcGVyX2NwdV9zdGFydCwKKwkJCSAgICAgICBfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0KTsKKwkJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IChjaGFyKilfX3ZhKGNwdV9kYXRhKSAtCisJCQkJX19wZXJfY3B1X3N0YXJ0OworCQkJY3B1X2RhdGEgKz0gUEVSQ1BVX1BBR0VfU0laRTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBjcHVfZGF0YTsKK30KKworLyoqCisgKiBmaWxsX3Blcm5vZGUgLSBpbml0aWFsaXplIHBlcm5vZGUgZGF0YS4KKyAqIEBub2RlOiB0aGUgbm9kZSBpZC4KKyAqIEBwZXJub2RlOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHBlcm5vZGUgZGF0YQorICogQHBlcm5vZGVzaXplOiBzaXplIG9mIHRoZSBwZXJub2RlIGRhdGEKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGZpbGxfcGVybm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyBwZXJub2RlLAorCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUpCit7CisJdm9pZCAqY3B1X2RhdGE7CisJaW50IGNwdXMgPSBlYXJseV9ucl9jcHVzX25vZGUobm9kZSk7CisJc3RydWN0IGJvb3RtZW1fZGF0YSAqYmRwID0gJm1lbV9kYXRhW25vZGVdLmJvb3RtZW1fZGF0YTsKKworCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfYWRkciA9IHBlcm5vZGU7CisJbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9zaXplID0gcGVybm9kZXNpemU7CisJbWVtc2V0KF9fdmEocGVybm9kZSksIDAsIHBlcm5vZGVzaXplKTsKKworCWNwdV9kYXRhID0gKHZvaWQgKilwZXJub2RlOworCXBlcm5vZGUgKz0gUEVSQ1BVX1BBR0VfU0laRSAqIGNwdXM7CisJcGVybm9kZSArPSBub2RlICogTDFfQ0FDSEVfQllURVM7CisKKwltZW1fZGF0YVtub2RlXS5wZ2RhdCA9IF9fdmEocGVybm9kZSk7CisJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7CisKKwltZW1fZGF0YVtub2RlXS5ub2RlX2RhdGEgPSBfX3ZhKHBlcm5vZGUpOworCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHN0cnVjdCBpYTY0X25vZGVfZGF0YSkpOworCisJbWVtX2RhdGFbbm9kZV0ucGdkYXQtPmJkYXRhID0gYmRwOworCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOworCisJY3B1X2RhdGEgPSBwZXJfY3B1X25vZGVfc2V0dXAoY3B1X2RhdGEsIG5vZGUpOworCisJcmV0dXJuOworfQorCisvKioKICAqIGZpbmRfcGVybm9kZV9zcGFjZSAtIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVtb3J5IG1hcCBhbmQgcGVyLW5vZGUgc3RydWN0dXJlcwogICogQHN0YXJ0OiBwaHlzaWNhbCBzdGFydCBvZiByYW5nZQogICogQGxlbjogbGVuZ3RoIG9mIHJhbmdlCkBAIC0zMDQsOSArMjE4LDggQEAKIHN0YXRpYyBpbnQgX19pbml0IGZpbmRfcGVybm9kZV9zcGFjZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgICAgIGludCBub2RlKQogewotCXVuc2lnbmVkIGxvbmcgZXBmbiwgY3B1LCBjcHVzLCBwaHlzX2NwdXM7CisJdW5zaWduZWQgbG9uZyBlcGZuOwogCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUgPSAwLCBwZXJub2RlLCBwYWdlcywgbWFwc2l6ZTsKLQl2b2lkICpjcHVfZGF0YTsKIAlzdHJ1Y3QgYm9vdG1lbV9kYXRhICpiZHAgPSAmbWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhOwogCiAJZXBmbiA9IChzdGFydCArIGxlbikgPj4gUEFHRV9TSElGVDsKQEAgLTMyOSw0OSArMjQyLDEyIEBACiAJICogQ2FsY3VsYXRlIHRvdGFsIHNpemUgbmVlZGVkLCBpbmNsLiB3aGF0J3MgbmVjZXNzYXJ5CiAJICogZm9yIGdvb2QgYWxpZ25tZW50IGFuZCBhbGlhcyBwcmV2ZW50aW9uLgogCSAqLwotCWNwdXMgPSBlYXJseV9ucl9jcHVzX25vZGUobm9kZSk7Ci0JcGh5c19jcHVzID0gZWFybHlfbnJfcGh5c19jcHVzX25vZGUobm9kZSk7Ci0JcGVybm9kZXNpemUgKz0gUEVSQ1BVX1BBR0VfU0laRSAqIGNwdXM7Ci0JcGVybm9kZXNpemUgKz0gbm9kZSAqIEwxX0NBQ0hFX0JZVEVTOwotCXBlcm5vZGVzaXplICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihwZ19kYXRhX3QpKTsKLQlwZXJub2Rlc2l6ZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IGlhNjRfbm9kZV9kYXRhKSk7Ci0JcGVybm9kZXNpemUgPSBQQUdFX0FMSUdOKHBlcm5vZGVzaXplKTsKKwlwZXJub2Rlc2l6ZSA9IGNvbXB1dGVfcGVybm9kZXNpemUobm9kZSk7CiAJcGVybm9kZSA9IE5PREVEQVRBX0FMSUdOKHN0YXJ0LCBub2RlKTsKIAogCS8qIElzIHRoaXMgcmFuZ2UgYmlnIGVub3VnaCBmb3Igd2hhdCB3ZSB3YW50IHRvIHN0b3JlIGhlcmU/ICovCi0JaWYgKHN0YXJ0ICsgbGVuID4gKHBlcm5vZGUgKyBwZXJub2Rlc2l6ZSArIG1hcHNpemUpKSB7Ci0JCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfYWRkciA9IHBlcm5vZGU7Ci0JCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfc2l6ZSA9IHBlcm5vZGVzaXplOwotCQltZW1zZXQoX192YShwZXJub2RlKSwgMCwgcGVybm9kZXNpemUpOwotCi0JCWNwdV9kYXRhID0gKHZvaWQgKilwZXJub2RlOwotCQlwZXJub2RlICs9IFBFUkNQVV9QQUdFX1NJWkUgKiBjcHVzOwotCQlwZXJub2RlICs9IG5vZGUgKiBMMV9DQUNIRV9CWVRFUzsKLQotCQltZW1fZGF0YVtub2RlXS5wZ2RhdCA9IF9fdmEocGVybm9kZSk7Ci0JCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOwotCi0JCW1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YSA9IF9fdmEocGVybm9kZSk7Ci0JCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHN0cnVjdCBpYTY0X25vZGVfZGF0YSkpOwotCi0JCW1lbV9kYXRhW25vZGVdLnBnZGF0LT5iZGF0YSA9IGJkcDsKLQkJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7Ci0KLQkJLyoKLQkJICogQ29weSB0aGUgc3RhdGljIHBlci1jcHUgZGF0YSBpbnRvIHRoZSByZWdpb24gd2UKLQkJICoganVzdCBzZXQgYXNpZGUgYW5kIHRoZW4gc2V0dXAgX19wZXJfY3B1X29mZnNldAotCQkgKiBmb3IgZWFjaCBDUFUgb24gdGhpcyBub2RlLgotCQkgKi8KLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJaWYgKG5vZGUgPT0gbm9kZV9jcHVpZFtjcHVdLm5pZCkgewotCQkJCW1lbWNweShfX3ZhKGNwdV9kYXRhKSwgX19waHlzX3Blcl9jcHVfc3RhcnQsCi0JCQkJICAgICAgIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOwotCQkJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IChjaGFyKilfX3ZhKGNwdV9kYXRhKSAtCi0JCQkJCV9fcGVyX2NwdV9zdGFydDsKLQkJCQljcHVfZGF0YSArPSBQRVJDUFVfUEFHRV9TSVpFOwotCQkJfQotCQl9Ci0JfQorCWlmIChzdGFydCArIGxlbiA+IChwZXJub2RlICsgcGVybm9kZXNpemUgKyBtYXBzaXplKSkKKwkJZmlsbF9wZXJub2RlKG5vZGUsIHBlcm5vZGUsIHBlcm5vZGVzaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDExLDYgKzI4Nyw5IEBACiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQlwZ19kYXRhX3QgKnBkcCA9IG1lbV9kYXRhW25vZGVdLnBnZGF0OwogCisJCWlmIChub2RlX2lzc2V0KG5vZGUsIG1lbW9yeV9sZXNzX21hc2spKQorCQkJY29udGludWU7CisKIAkJYmRwID0gcGRwLT5iZGF0YTsKIAogCQkvKiBGaXJzdCB0aGUgYm9vdG1lbV9tYXAgaXRzZWxmICovCkBAIC00MzYsOCArMzE1LDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGluaXRpYWxpemVfcGVybm9kZV9kYXRhKHZvaWQpCiB7Ci0JaW50IGNwdSwgbm9kZTsKIAlwZ19kYXRhX3QgKnBnZGF0X2xpc3RbTUFYX05VTU5PREVTXTsKKwlpbnQgY3B1LCBub2RlOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKIAkJcGdkYXRfbGlzdFtub2RlXSA9IG1lbV9kYXRhW25vZGVdLnBnZGF0OwpAQCAtNDQ3LDEyICszMjYsOTkgQEAKIAkJbWVtY3B5KG1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YS0+cGdfZGF0YV9wdHJzLCBwZ2RhdF9saXN0LAogCQkgICAgICAgc2l6ZW9mKHBnZGF0X2xpc3QpKTsKIAl9Ci0KKyNpZmRlZiBDT05GSUdfU01QCiAJLyogU2V0IHRoZSBub2RlX2RhdGEgcG9pbnRlciBmb3IgZWFjaCBwZXItY3B1IHN0cnVjdCAqLwogCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKIAkJbm9kZSA9IG5vZGVfY3B1aWRbY3B1XS5uaWQ7CiAJCXBlcl9jcHUoY3B1X2luZm8sIGNwdSkubm9kZV9kYXRhID0gbWVtX2RhdGFbbm9kZV0ubm9kZV9kYXRhOwogCX0KKyNlbHNlCisJeworCQlzdHJ1Y3QgY3B1aW5mb19pYTY0ICpjcHUwX2NwdV9pbmZvOworCQljcHUgPSAwOworCQlub2RlID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKKwkJY3B1MF9jcHVfaW5mbyA9IChzdHJ1Y3QgY3B1aW5mb19pYTY0ICopKF9fcGh5c19wZXJfY3B1X3N0YXJ0ICsKKwkJCSgoY2hhciAqKSZwZXJfY3B1X19jcHVfaW5mbyAtIF9fcGVyX2NwdV9zdGFydCkpOworCQljcHUwX2NwdV9pbmZvLT5ub2RlX2RhdGEgPSBtZW1fZGF0YVtub2RlXS5ub2RlX2RhdGE7CisJfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK30KKworLyoqCisgKiBtZW1vcnlfbGVzc19ub2RlX2FsbG9jIC0gKiBhdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgYmVzdCBOVU1BIHNsaXQKKyAqIAlub2RlIGJ1dCBmYWxsIGJhY2sgdG8gYW55IG90aGVyIG5vZGUgd2hlbiBfX2FsbG9jX2Jvb3RtZW1fbm9kZSBmYWlscworICoJZm9yIGJlc3QuCisgKiBAbmlkOiBub2RlIGlkCisgKiBAcGVybm9kZXNpemU6IHNpemUgb2YgdGhpcyBub2RlJ3MgcGVybm9kZSBkYXRhCisgKiBAYWxpZ246IGFsaWdubWVudCB0byB1c2UgZm9yIHRoaXMgbm9kZSdzIHBlcm5vZGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgKm1lbW9yeV9sZXNzX25vZGVfYWxsb2MoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBwZXJub2Rlc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGFsaWduKQoreworCXZvaWQgKnB0ciA9IE5VTEw7CisJdTggYmVzdCA9IDB4ZmY7CisJaW50IGJlc3Rub2RlID0gLTEsIG5vZGU7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisJCWlmIChub2RlX2lzc2V0KG5vZGUsIG1lbW9yeV9sZXNzX21hc2spKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKG5vZGVfZGlzdGFuY2UobmlkLCBub2RlKSA8IGJlc3QpIHsKKwkJCWJlc3QgPSBub2RlX2Rpc3RhbmNlKG5pZCwgbm9kZSk7CisJCQliZXN0bm9kZSA9IG5vZGU7CisJCX0KKwl9CisKKwlwdHIgPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShtZW1fZGF0YVtiZXN0bm9kZV0ucGdkYXQsCisJCXBlcm5vZGVzaXplLCBhbGlnbiwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKKworCWlmICghcHRyKQorCQlwYW5pYygiTk8gbWVtb3J5IGZvciBtZW1vcnkgbGVzcyBub2RlXG4iKTsKKwlyZXR1cm4gcHRyOworfQorCisvKioKKyAqIHBnZGF0X2luc2VydCAtIGluc2VydCB0aGUgcGdkYXQgaW50byBnbG9iYWwgcGdkYXRfbGlzdAorICogQHBnZGF0OiB0aGUgcGdkYXQgZm9yIGEgbm9kZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBnZGF0X2luc2VydChwZ19kYXRhX3QgKnBnZGF0KQoreworCXBnX2RhdGFfdCAqcHJldiA9IE5VTEwsICpuZXh0OworCisJZm9yX2VhY2hfcGdkYXQobmV4dCkKKwkJaWYgKHBnZGF0LT5ub2RlX2lkIDwgbmV4dC0+bm9kZV9pZCkKKwkJCWJyZWFrOworCQllbHNlCisJCQlwcmV2ID0gbmV4dDsKKworCWlmIChwcmV2KSB7CisJCXByZXYtPnBnZGF0X25leHQgPSBwZ2RhdDsKKwkJcGdkYXQtPnBnZGF0X25leHQgPSBuZXh0OworCX0gZWxzZSB7CisJCXBnZGF0LT5wZ2RhdF9uZXh0ID0gcGdkYXRfbGlzdDsKKwkJcGdkYXRfbGlzdCA9IHBnZGF0OworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBtZW1vcnlfbGVzc19ub2RlcyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIENQVSBvbmx5IG5vZGVzIHBlcm5vZGUKKyAqCWluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbWVtb3J5X2xlc3Nfbm9kZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBlcm5vZGVzaXplOworCXZvaWQgKnBlcm5vZGU7CisJaW50IG5vZGU7CisKKwlmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykgeworCQlwZXJub2Rlc2l6ZSA9IGNvbXB1dGVfcGVybm9kZXNpemUobm9kZSk7CisJCXBlcm5vZGUgPSBtZW1vcnlfbGVzc19ub2RlX2FsbG9jKG5vZGUsIHBlcm5vZGVzaXplLAorCQkJKG5vZGUpID8gKG5vZGUgKiBQRVJDUFVfUEFHRV9TSVpFKSA6ICgxMDI0KjEwMjQpKTsKKwkJZmlsbF9wZXJub2RlKG5vZGUsIF9fcGEocGVybm9kZSksIHBlcm5vZGVzaXplKTsKKwl9CisKKwlyZXR1cm47CiB9CiAKIC8qKgpAQCAtNDcyLDE2ICs0MzgsMTkgQEAKIAkJbm9kZV9zZXRfb25saW5lKDApOwogCX0KIAorCW5vZGVzX29yKG1lbW9yeV9sZXNzX21hc2ssIG1lbW9yeV9sZXNzX21hc2ssIG5vZGVfb25saW5lX21hcCk7CiAJbWluX2xvd19wZm4gPSAtMTsKIAltYXhfbG93X3BmbiA9IDA7CiAKLQlpZiAobnVtX29ubGluZV9ub2RlcygpID4gMSkKLQkJcmVhc3NpZ25fY3B1X29ubHlfbm9kZXMoKTsKLQogCS8qIFRoZXNlIGFjdHVhbGx5IGVuZCB1cCBnZXR0aW5nIGNhbGxlZCBieSBjYWxsX3Blcm5vZGVfbWVtb3J5KCkgKi8KIAllZmlfbWVtbWFwX3dhbGsoZmlsdGVyX3JzdmRfbWVtb3J5LCBidWlsZF9ub2RlX21hcHMpOwogCWVmaV9tZW1tYXBfd2FsayhmaWx0ZXJfcnN2ZF9tZW1vcnksIGZpbmRfcGVybm9kZV9zcGFjZSk7CiAKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKQorCQlpZiAobWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhLm5vZGVfbG93X3BmbikgeworCQkJbm9kZV9jbGVhcihub2RlLCBtZW1vcnlfbGVzc19tYXNrKTsKKwkJCW1lbV9kYXRhW25vZGVdLm1pbl9wZm4gPSB+MFVMOworCQl9CiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBib290IG1lbW9yeSBtYXBzIGluIHJldmVyc2Ugb3JkZXIgc2luY2UgdGhhdCdzCiAJICogd2hhdCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgZXhwZWN0cwpAQCAtNDkyLDE3ICs0NjEsMTQgQEAKIAogCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQogCQkJY29udGludWU7CisJCWVsc2UgaWYgKG5vZGVfaXNzZXQobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykpCisJCQljb250aW51ZTsKIAogCQliZHAgPSAmbWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhOwogCQlwZXJub2RlID0gbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9hZGRyOwogCQlwZXJub2Rlc2l6ZSA9IG1lbV9kYXRhW25vZGVdLnBlcm5vZGVfc2l6ZTsKIAkJbWFwID0gcGVybm9kZSArIHBlcm5vZGVzaXplOwogCi0JCS8qIFNhbml0eSBjaGVjay4uLiAqLwotCQlpZiAoIXBlcm5vZGUpCi0JCQlwYW5pYygicGVybm9kZSBzcGFjZSBmb3Igbm9kZSAlZCAiCi0JCQkgICAgICAiY291bGQgbm90IGJlIGFsbG9jYXRlZCEiLCBub2RlKTsKLQogCQlpbml0X2Jvb3RtZW1fbm9kZShtZW1fZGF0YVtub2RlXS5wZ2RhdCwKIAkJCQkgIG1hcD4+UEFHRV9TSElGVCwKIAkJCQkgIGJkcC0+bm9kZV9ib290X3N0YXJ0Pj5QQUdFX1NISUZULApAQCAtNTEyLDYgKzQ3OCw3IEBACiAJZWZpX21lbW1hcF93YWxrKGZpbHRlcl9yc3ZkX21lbW9yeSwgZnJlZV9ub2RlX2Jvb3RtZW0pOwogCiAJcmVzZXJ2ZV9wZXJub2RlX3NwYWNlKCk7CisJbWVtb3J5X2xlc3Nfbm9kZXMoKTsKIAlpbml0aWFsaXplX3Blcm5vZGVfZGF0YSgpOwogCiAJbWF4X3BmbiA9IG1heF9sb3dfcGZuOwpAQCAtNTE5LDYgKzQ4Niw3IEBACiAJZmluZF9pbml0cmQoKTsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIC8qKgogICogcGVyX2NwdV9pbml0IC0gc2V0dXAgcGVyLWNwdSB2YXJpYWJsZXMKICAqCkBAIC01MjksMTUgKzQ5NywxNSBAQAogewogCWludCBjcHU7CiAKLQlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApIHsKLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJcGVyX2NwdShsb2NhbF9wZXJfY3B1X29mZnNldCwgY3B1KSA9Ci0JCQkJX19wZXJfY3B1X29mZnNldFtjcHVdOwotCQl9Ci0JfQorCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkKKwkJcmV0dXJuIF9fcGVyX2NwdV9zdGFydCArIF9fcGVyX2NwdV9vZmZzZXRbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCisJCXBlcl9jcHUobG9jYWxfcGVyX2NwdV9vZmZzZXQsIGNwdSkgPSBfX3Blcl9jcHVfb2Zmc2V0W2NwdV07CiAKIAlyZXR1cm4gX19wZXJfY3B1X3N0YXJ0ICsgX19wZXJfY3B1X29mZnNldFtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoqCiAgKiBzaG93X21lbSAtIGdpdmUgc2hvcnQgc3VtbWFyeSBvZiBtZW1vcnkgc3RhdHMKQEAgLTY4MCwxMiArNjQ4LDEzIEBACiAKIAltYXhfZG1hID0gdmlydF90b19waHlzKCh2b2lkICopIE1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKIAotCS8qIHNvIG1pbigpIHdpbGwgd29yayBpbiBjb3VudF9ub2RlX3BhZ2VzICovCi0JZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKLQkJbWVtX2RhdGFbbm9kZV0ubWluX3BmbiA9IH4wVUw7Ci0KIAllZmlfbWVtbWFwX3dhbGsoZmlsdGVyX3JzdmRfbWVtb3J5LCBjb3VudF9ub2RlX3BhZ2VzKTsKIAorCXZtYWxsb2NfZW5kIC09IFBBR0VfQUxJR04obWF4X2xvd19wZm4gKiBzaXplb2Yoc3RydWN0IHBhZ2UpKTsKKwl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSB2bWFsbG9jX2VuZDsKKwllZmlfbWVtbWFwX3dhbGsoY3JlYXRlX21lbV9tYXBfcGFnZV90YWJsZSwgTlVMTCk7CisJcHJpbnRrKCJWaXJ0dWFsIG1lbV9tYXAgc3RhcnRzIGF0IDB4JXBcbiIsIHZtZW1fbWFwKTsKKwogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJbWVtc2V0KHpvbmVzX3NpemUsIDAsIHNpemVvZih6b25lc19zaXplKSk7CiAJCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CkBAIC03MTksMTUgKzY4OCw2IEBACiAJCQkJIG1lbV9kYXRhW25vZGVdLm51bV9kbWFfcGh5c3BhZ2VzKTsKIAkJfQogCi0JCWlmIChub2RlID09IDApIHsKLQkJCXZtYWxsb2NfZW5kIC09Ci0JCQkJUEFHRV9BTElHTihtYXhfbG93X3BmbiAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpOwotCQkJdm1lbV9tYXAgPSAoc3RydWN0IHBhZ2UgKikgdm1hbGxvY19lbmQ7Ci0KLQkJCWVmaV9tZW1tYXBfd2FsayhjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlLCBOVUxMKTsKLQkJCXByaW50aygiVmlydHVhbCBtZW1fbWFwIHN0YXJ0cyBhdCAweCVwXG4iLCB2bWVtX21hcCk7Ci0JCX0KLQogCQlwZm5fb2Zmc2V0ID0gbWVtX2RhdGFbbm9kZV0ubWluX3BmbjsKIAogCQlOT0RFX0RBVEEobm9kZSktPm5vZGVfbWVtX21hcCA9IHZtZW1fbWFwICsgcGZuX29mZnNldDsKQEAgLTczNSw1ICs2OTUsMTEgQEAKIAkJCQkgICAgcGZuX29mZnNldCwgemhvbGVzX3NpemUpOwogCX0KIAorCS8qCisJICogTWFrZSBtZW1vcnkgbGVzcyBub2RlcyBiZWNvbWUgYSBtZW1iZXIgb2YgdGhlIGtub3duIG5vZGVzLgorCSAqLworCWZvcl9lYWNoX25vZGVfbWFzayhub2RlLCBtZW1vcnlfbGVzc19tYXNrKQorCQlwZ2RhdF9pbnNlcnQobWVtX2RhdGFbbm9kZV0ucGdkYXQpOworCiAJemVyb19wYWdlX21lbW1hcF9wdHIgPSB2aXJ0X3RvX3BhZ2UoaWE2NF9pbXZhKGVtcHR5X3plcm9fcGFnZSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggNGViMmY1Mi4uNjVmOTk1OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC01OTcsNyArNTk3LDggQEAKIAlrY2xpc3RfYWRkKCZrY29yZV9rZXJuZWwsIF9zdGV4dCwgX2VuZCAtIF9zdGV4dCk7CiAKIAlmb3JfZWFjaF9wZ2RhdChwZ2RhdCkKLQkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnZGF0KTsKKwkJaWYgKHBnZGF0LT5iZGF0YS0+bm9kZV9ib290bWVtX21hcCkKKwkJCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYWxsX2Jvb3RtZW1fbm9kZShwZ2RhdCk7CiAKIAlyZXNlcnZlZF9wYWdlcyA9IDA7CiAJZWZpX21lbW1hcF93YWxrKGNvdW50X3Jlc2VydmVkX3BhZ2VzLCAmcmVzZXJ2ZWRfcGFnZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggZTNmYzRlZC4uNTRkOWVkNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC0xNTcsNiArMTU3LDcgQEAKIAogCW1lbXNldChjb250cm9sbGVyLCAwLCBzaXplb2YoKmNvbnRyb2xsZXIpKTsKIAljb250cm9sbGVyLT5zZWdtZW50ID0gc2VnOworCWNvbnRyb2xsZXItPm5vZGUgPSAtMTsKIAlyZXR1cm4gY29udHJvbGxlcjsKIH0KIApAQCAtMjg4LDYgKzI4OSw3IEBACiAJdW5zaWduZWQgaW50IHdpbmRvd3MgPSAwOwogCXN0cnVjdCBwY2lfYnVzICpwYnVzOwogCWNoYXIgKm5hbWU7CisJaW50IHB4bTsKIAogCWNvbnRyb2xsZXIgPSBhbGxvY19wY2lfY29udHJvbGxlcihkb21haW4pOwogCWlmICghY29udHJvbGxlcikKQEAgLTI5NSwxMCArMjk3LDE2IEBACiAKIAljb250cm9sbGVyLT5hY3BpX2hhbmRsZSA9IGRldmljZS0+aGFuZGxlOwogCisJcHhtID0gYWNwaV9nZXRfcHhtKGNvbnRyb2xsZXItPmFjcGlfaGFuZGxlKTsKKyNpZmRlZiBDT05GSUdfTlVNQQorCWlmIChweG0gPj0gMCkKKwkJY29udHJvbGxlci0+bm9kZSA9IHB4bV90b19uaWRfbWFwW3B4bV07CisjZW5kaWYKKwogCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIGNvdW50X3dpbmRvdywKIAkJCSZ3aW5kb3dzKTsKLQljb250cm9sbGVyLT53aW5kb3cgPSBrbWFsbG9jKHNpemVvZigqY29udHJvbGxlci0+d2luZG93KSAqIHdpbmRvd3MsCi0JCQlHRlBfS0VSTkVMKTsKKwljb250cm9sbGVyLT53aW5kb3cgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpjb250cm9sbGVyLT53aW5kb3cpICogd2luZG93cywKKwkJCUdGUF9LRVJORUwsIGNvbnRyb2xsZXItPm5vZGUpOwogCWlmICghY29udHJvbGxlci0+d2luZG93KQogCQlnb3RvIG91dDI7CiAKQEAgLTMxMiw3ICszMjAsNyBAQAogCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIGFkZF93aW5kb3csCiAJCQkmaW5mbyk7CiAKLQlwYnVzID0gcGNpX3NjYW5fYnVzKGJ1cywgJnBjaV9yb290X29wcywgY29udHJvbGxlcik7CisJcGJ1cyA9IHBjaV9zY2FuX2J1c19wYXJlbnRlZChOVUxMLCBidXMsICZwY2lfcm9vdF9vcHMsIGNvbnRyb2xsZXIpOwogCWlmIChwYnVzKQogCQlwY2liaW9zX3NldHVwX3Jvb3Rfd2luZG93cyhwYnVzLCBjb250cm9sbGVyKTsKIApAQCAtMzczLDYgKzM4MSwyNSBAQAogCXJlcy0+ZW5kID0gcmVnaW9uLT5lbmQgKyBvZmZzZXQ7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzX3ZhbGlkX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpZHgpCit7CisJdW5zaWduZWQgaW50IGksIHR5cGVfbWFzayA9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmRldnIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCisJaWYgKCFkZXYtPmJ1cykKKwkJcmV0dXJuIDA7CisJZm9yIChpPTA7IGk8UENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpidXNyID0gZGV2LT5idXMtPnJlc291cmNlW2ldOworCisJCWlmICghYnVzciB8fCAoKGJ1c3ItPmZsYWdzIF4gZGV2ci0+ZmxhZ3MpICYgdHlwZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGRldnItPnN0YXJ0KSAmJiAoZGV2ci0+c3RhcnQgPj0gYnVzci0+c3RhcnQpICYmCisJCQkJKGRldnItPmVuZCA8PSBidXNyLT5lbmQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKQEAgLTM4Niw3ICs0MTMsOCBAQAogCQlyZWdpb24uc3RhcnQgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OwogCQlyZWdpb24uZW5kID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQ7CiAJCXBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKGRldiwgJmRldi0+cmVzb3VyY2VbaV0sICZyZWdpb24pOwotCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKKwkJaWYgKChpc192YWxpZF9yZXNvdXJjZShkZXYsIGkpKSkKKwkJCXBjaV9jbGFpbV9yZXNvdXJjZShkZXYsIGkpOwogCX0KIH0KIApAQCAtMzk4LDYgKzQyNiwxMCBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKKwlpZiAoYi0+c2VsZikgeworCQlwY2lfcmVhZF9icmlkZ2VfYmFzZXMoYik7CisJCXBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhiLT5zZWxmKTsKKwl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZiLT5kZXZpY2VzLCBidXNfbGlzdCkKIAkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldik7CiAKQEAgLTQxOCwxOCArNDUwLDI0IEBACiAJdTE2IGNtZCwgb2xkX2NtZDsKIAlpbnQgaWR4OwogCXN0cnVjdCByZXNvdXJjZSAqcjsKKwl1bnNpZ25lZCBsb25nIHR5cGVfbWFzayA9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKSB7CisJZm9yIChpZHg9MDsgaWR4PFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgewogCQkvKiBPbmx5IHNldCB1cCB0aGUgZGVzaXJlZCByZXNvdXJjZXMuICAqLwogCQlpZiAoIShtYXNrICYgKDEgPDwgaWR4KSkpCiAJCQljb250aW51ZTsKIAogCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJaWYgKCEoci0+ZmxhZ3MgJiB0eXBlX21hc2spKQorCQkJY29udGludWU7CisJCWlmICgoaWR4ID09IFBDSV9ST01fUkVTT1VSQ0UpICYmCisJCQkJKCEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpKSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoIXItPnN0YXJ0ICYmIHItPmVuZCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLApAQCAtNDQxLDggKzQ3OSw2IEBACiAJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQogCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKIAl9Ci0JaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CiAJaWYgKGNtZCAhPSBvbGRfY21kKSB7CiAJCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmggYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAppbmRleCA4NjhlN2VjLi41ODBhMWMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAorKysgYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaApAQCAtOCw2ICs4LDggQEAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX1hUQUxLX0hVQkRFVl9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9YVEFMS19IVUJERVZfSAogCisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgorCiAjZGVmaW5lIEhVQl9XSURHRVRfSURfTUFYIDB4ZgogI2RlZmluZSBERVZfUEVSX1dJREdFVCAoMioyKjgpCiAjZGVmaW5lIElJT19JVFRFX1dJREdFVF9CSVRTICAgIDQgICAgICAgLyogc2l6ZSBvZiB3aWRnZXQgZmllbGQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggOWUwN2Y1NC4uYTY2NDliYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTksMjEgKzksMjggQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CisjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgorI2luY2x1ZGUgPGFzbS9zbi9pby5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCi0jaW5jbHVkZSA8YXNtL3NuL2dlby5oPgotI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgotI2luY2x1ZGUgPGFzbS9zbi9pby5oPgogI2luY2x1ZGUgPGFzbS9zbi9zaW11bGF0b3IuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3Rpb2NhX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgogCi1jaGFyIG1hc3Rlcl9iYXNlaW9fd2lkOwogbmFzaWRfdCBtYXN0ZXJfbmFzaWQgPSBJTlZBTElEX05BU0lEOwkvKiBQYXJ0aXRpb24gTWFzdGVyICovCiAKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNuX3N5c2RhdGFfbGlzdDsKKworLyogc3lzZGF0YSBsaXN0IHN0cnVjdCAqLworc3RydWN0IHN5c2RhdGFfZWwgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdm9pZCAqc3lzZGF0YTsKK307CisKIHN0cnVjdCBzbGFiX2luZm8gewogCXN0cnVjdCBodWJkZXZfaW5mbyBodWJkZXY7CiB9OwpAQCAtNTQsNyArNjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCAqCi1zbl9kZWZhdWx0X3BjaV9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpzb2Z0KQorc25fZGVmYXVsdF9wY2lfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqc29mdCwgc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyKQogewogCXJldHVybiBOVUxMOwogfQpAQCAtMTM4LDIzICsxNDUsNiBAQAogfQogCiAvKgotICogc25fYWxsb2NfcGNpX3N5c2RhdGEoKSAtIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYSBwY2kgY29udHJvbGxlcgotICoJd2hpY2ggaXMgZXhwZWN0ZWQgYXMgdGhlIHBjaV9kZXYgYW5kIHBjaV9idXMgc3lzZGF0YSBieSB0aGUgTGludXgKLSAqCVBDSSBpbmZyYXN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnNuX2FsbG9jX3BjaV9zeXNkYXRhKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfc3lzZGF0YTsKLQotCXBjaV9zeXNkYXRhID0ga21hbGxvYyhzaXplb2YoKnBjaV9zeXNkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2lfc3lzZGF0YSkKLQkJQlVHKCk7Ci0KLQltZW1zZXQocGNpX3N5c2RhdGEsIDAsIHNpemVvZigqcGNpX3N5c2RhdGEpKTsKLQlyZXR1cm4gcGNpX3N5c2RhdGE7Ci19Ci0KLS8qCiAgKiBzbl9maXh1cF9pb25vZGVzKCkgLSBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEhVQiBkYXRhIHN0cmN1dHVyZSBmb3IgCiAgKgllYWNoIG5vZGUgaW4gdGhlIHN5c3RlbS4KICAqLwpAQCAtMjIxLDIyICsyMTEsMzQgQEAKIAogfQogCit2b2lkIHNuX3BjaV91bmZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2ID0gU05fUENJREVWX0lORk8oZGV2KS0+aG9zdF9wY2lfZGV2OworCisJc25faXJxX3VuZml4dXAoZGV2KTsKKwlwY2lfZGV2X3B1dChob3N0X3BjaV9kZXYpOworCXBjaV9kZXZfcHV0KGRldik7Cit9CisKIC8qCiAgKiBzbl9wY2lfZml4dXBfc2xvdCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBzbG90J3MgcmVzb3VyY2VzCiAgKiBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4gIFJlc291cmNlcyBhY3F1aXJlZAogICogZnJvbSBvdXIgUENJIHByb3ZpZGVyIGluY2x1ZGUgUElPIG1hcHMgdG8gQkFSIHNwYWNlIGFuZCBpbnRlcnJ1cHQKICAqIG9iamVjdHMuCiAgKi8KLXN0YXRpYyB2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IGlkeDsKIAlpbnQgc2VnbWVudCA9IDA7Ci0JdWludDY0X3Qgc2l6ZTsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOwotCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXY7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiczsKKyAJc3RydWN0IHBjaV9idXMgKmhvc3RfcGNpX2J1czsKKyAJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKKyAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKyAJdW5zaWduZWQgbG9uZyBzaXplOworIAl1bnNpZ25lZCBpbnQgYnVzX25vLCBkZXZmbjsKIAorCXBjaV9kZXZfZ2V0KGRldik7IC8qIGZvciB0aGUgc3lzZGF0YSBwb2ludGVyICovCiAJZGV2LT5zeXNkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaWRldl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKFNOX1BDSURFVl9JTkZPKGRldikgPD0gMCkKIAkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCkBAIC0yNTMsNyArMjU1LDcgQEAKIAkJCQkgICAgICh1NjQpIF9fcGEoU05fUENJREVWX0lORk8oZGV2KSksCiAJCQkJICAgICAodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7CiAJaWYgKHN0YXR1cykKLQkJQlVHKCk7CQkvKiBDYW5ub3QgZ2V0IHBsYXRmb3JtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gaW5mb3JtYXRpb24gKi8KKwkJQlVHKCk7IC8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiAqLwogCiAJLyogQ29weSBvdmVyIFBJTyBNYXBwZWQgQWRkcmVzc2VzICovCiAJZm9yIChpZHggPSAwOyBpZHggPD0gUENJX1JPTV9SRVNPVVJDRTsgaWR4KyspIHsKQEAgLTI3NSwxNSArMjc3LDIxIEBACiAJCQlkZXYtPnJlc291cmNlW2lkeF0ucGFyZW50ID0gJmlvbWVtX3Jlc291cmNlOwogCX0KIAotCS8qIHNldCB1cCBob3N0IGJ1cyBsaW5rYWdlcyAqLwotCWJzID0gU05fUENJQlVTX0JVU1NPRlQoZGV2LT5idXMpOwotCWhvc3RfcGNpX2RldiA9Ci0JICAgIHBjaV9maW5kX3Nsb3QoU05fUENJREVWX0lORk8oZGV2KS0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgPj4gMzIsCi0JCQkgIFNOX1BDSURFVl9JTkZPKGRldiktPgotCQkJICBwZGlfc2xvdF9ob3N0X2hhbmRsZSAmIDB4ZmZmZmZmZmYpOworCS8qCisJICogVXNpbmcgdGhlIFBST01zIHZhbHVlcyBmb3IgdGhlIFBDSSBob3N0IGJ1cywgZ2V0IHRoZSBMaW51eAorIAkgKiBQQ0kgaG9zdF9wY2lfZGV2IHN0cnVjdCBhbmQgc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzCisgCSAqLworCisgCWJ1c19ubyA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbG90X2hvc3RfaGFuZGxlID4+IDMyOworIAlkZXZmbiA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZjsKKyAJaG9zdF9wY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoZGV2LT5idXMpLCBidXNfbm8pOworIAlob3N0X3BjaV9kZXYgPSBwY2lfZ2V0X3Nsb3QoaG9zdF9wY2lfYnVzLCBkZXZmbik7CisKKwlTTl9QQ0lERVZfSU5GTyhkZXYpLT5ob3N0X3BjaV9kZXYgPSBob3N0X3BjaV9kZXY7CiAJU05fUENJREVWX0lORk8oZGV2KS0+cGRpX2hvc3RfcGNpZGV2X2luZm8gPQotCSAgICBTTl9QQ0lERVZfSU5GTyhob3N0X3BjaV9kZXYpOworCSAgICAJCQkJCVNOX1BDSURFVl9JTkZPKGhvc3RfcGNpX2Rldik7CiAJU05fUENJREVWX0lORk8oZGV2KS0+cGRpX2xpbnV4X3BjaWRldiA9IGRldjsKKwlicyA9IFNOX1BDSUJVU19CVVNTT0ZUKGRldi0+YnVzKTsKIAlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfcGNpYnVzX2luZm8gPSBiczsKIAogCWlmIChicyAmJiBicy0+YnNfYXNpY190eXBlIDwgUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKQEAgLTI5Nyw2ICszMDUsOSBAQAogCQlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8gPSBzbl9pcnFfaW5mbzsKIAkJZGV2LT5pcnEgPSBTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8tPmlycV9pcnE7CiAJCXNuX2lycV9maXh1cChkZXYsIHNuX2lycV9pbmZvKTsKKwl9IGVsc2UgeworCQlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8gPSBOVUxMOworCQlrZnJlZShzbl9pcnFfaW5mbyk7CiAJfQogfQogCkBAIC0zMDQsNTUgKzMxNSw1NyBAQAogICogc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoKSAtIFRoaXMgcm91dGluZSBzZXRzIHVwIGEgYnVzJ3MgcmVzb3VyY2VzCiAgKiBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4KICAqLwotc3RhdGljIHZvaWQgc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0pCit2b2lkIHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGludCBzZWdtZW50LCBpbnQgYnVzbnVtLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCWludCBzdGF0dXMgPSAwOwogCWludCBuYXNpZCwgY25vZGU7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CiAJdm9pZCAqcHJvdmlkZXJfc29mdDsKIAlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKIAotCXN0YXR1cyA9Ci0JICAgIHNhbF9nZXRfcGNpYnVzX2luZm8oKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzbnVtLAotCQkJCSh1NjQpIGlhNjRfdHBhKCZwcm9tX2J1c3NvZnRfcHRyKSk7Ci0JaWYgKHN0YXR1cyA+IDApIHsKLQkJcmV0dXJuOwkJLyogYnVzICMgZG9lcyBub3QgZXhpc3QgKi8KLQl9Ci0KKyAJc3RhdHVzID0gc2FsX2dldF9wY2lidXNfaW5mbygodTY0KSBzZWdtZW50LCAodTY0KSBidXNudW0sCisgCQkJCSAgICAgKHU2NCkgaWE2NF90cGEoJnByb21fYnVzc29mdF9wdHIpKTsKKyAJaWYgKHN0YXR1cyA+IDApCisJCXJldHVybjsJCS8qYnVzICMgZG9lcyBub3QgZXhpc3QgKi8KIAlwcm9tX2J1c3NvZnRfcHRyID0gX192YShwcm9tX2J1c3NvZnRfcHRyKTsKLQljb250cm9sbGVyID0gc25fYWxsb2NfcGNpX3N5c2RhdGEoKTsKLQkvKiBjb250cm9sbGVyIG5vbi16ZXJvIGlzIEJVRydkIGluIHNuX2FsbG9jX3BjaV9zeXNkYXRhICovCiAKLQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKKyAJY29udHJvbGxlciA9IGtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisgCWlmICghY29udHJvbGxlcikKKyAJCUJVRygpOworCiAJaWYgKGJ1cyA9PSBOVUxMKSB7Ci0JCXJldHVybjsJCS8qIGVycm9yLCBvciBidXMgYWxyZWFkeSBzY2FubmVkICovCisgCQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKKyAJCWlmIChidXMgPT0gTlVMTCkKKyAJCQlyZXR1cm47CS8qIGVycm9yLCBvciBidXMgYWxyZWFkeSBzY2FubmVkICovCisgCQlidXMtPnN5c2RhdGEgPSBOVUxMOwogCX0KIAorCWlmIChidXMtPnN5c2RhdGEpCisJCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBzeXNkYXRhIGFscmVhZHkgYWxsb2MnZCAqLworCiAJLyoKIAkgKiBQZXItcHJvdmlkZXIgZml4dXAuICBDb3BpZXMgdGhlIGNvbnRlbnRzIGZyb20gcHJvbSB0byBsb2NhbAogCSAqIGFyZWEgYW5kIGxpbmtzIFNOX1BDSUJVU19CVVNTT0ZUKCkuCiAJICovCiAKLQlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID49IFBDSUlPX0FTSUNfTUFYX1RZUEVTKSB7CisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA+PSBQQ0lJT19BU0lDX01BWF9UWVBFUykKIAkJcmV0dXJuOwkJLyogdW5zdXBwb3J0ZWQgYXNpYyB0eXBlICovCi0JfQorCisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfUFBCKQorCQlnb3RvIGVycm9yX3JldHVybjsgLyogbm8gZnVydGhlciBmaXh1cCBuZWNlc3NhcnkgKi8KIAogCXByb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW3Byb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZV07Ci0JaWYgKHByb3ZpZGVyID09IE5VTEwpIHsKKwlpZiAocHJvdmlkZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwkJLyogbm8gcHJvdmlkZXIgcmVnaXN0ZXJkIGZvciB0aGlzIGFzaWMgKi8KLQl9CiAKIAlwcm92aWRlcl9zb2Z0ID0gTlVMTDsKLQlpZiAocHJvdmlkZXItPmJ1c19maXh1cCkgewotCQlwcm92aWRlcl9zb2Z0ID0gKCpwcm92aWRlci0+YnVzX2ZpeHVwKSAocHJvbV9idXNzb2Z0X3B0cik7Ci0JfQorCWlmIChwcm92aWRlci0+YnVzX2ZpeHVwKQorCQlwcm92aWRlcl9zb2Z0ID0gKCpwcm92aWRlci0+YnVzX2ZpeHVwKSAocHJvbV9idXNzb2Z0X3B0ciwgY29udHJvbGxlcik7CiAKLQlpZiAocHJvdmlkZXJfc29mdCA9PSBOVUxMKSB7CisJaWYgKHByb3ZpZGVyX3NvZnQgPT0gTlVMTCkKIAkJcmV0dXJuOwkJLyogZml4dXAgZmFpbGVkIG9yIG5vdCBhcHBsaWNhYmxlICovCi0JfQogCiAJLyoKIAkgKiBHZW5lcmljIGJ1cyBmaXh1cCBnb2VzIGhlcmUuICBEb24ndCByZWZlcmVuY2UgcHJvbV9idXNzb2Z0X3B0cgpAQCAtMzYxLDEyICszNzQsNjMgQEAKIAogCWJ1cy0+c3lzZGF0YSA9IGNvbnRyb2xsZXI7CiAJUENJX0NPTlRST0xMRVIoYnVzKS0+cGxhdGZvcm1fZGF0YSA9IHByb3ZpZGVyX3NvZnQ7Ci0KIAluYXNpZCA9IE5BU0lEX0dFVChTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic19iYXNlKTsKIAljbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOwogCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKIAlTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic194d2lkZ2V0X2luZm8gPQogCSAgICAmKGh1YmRldl9pbmZvLT5oZGlfeHdpZGdldF9pbmZvW1NOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX3hpZF0pOworCisJLyoKKwkgKiBJZiB0aGUgbm9kZSBpbmZvcm1hdGlvbiB3ZSBvYnRhaW5lZCBkdXJpbmcgdGhlIGZpeHVwIHBoYXNlIGlzIGludmFsaWQKKwkgKiB0aGVuIHNldCBjb250cm9sbGVyLT5ub2RlIHRvIC0xICh1bmRldGVybWluZWQpCisJICovCisJaWYgKGNvbnRyb2xsZXItPm5vZGUgPj0gbnVtX29ubGluZV9ub2RlcygpKSB7CisJCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqYiA9IFNOX1BDSUJVU19CVVNTT0ZUKGJ1cyk7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlIEFTSUM9JXUgWElEPSV1IFBCVVNOVU09JWx1IgorCQkJCSAgICAiTF9JTz0lbHggTF9NRU09JWx4IEJBU0U9JWx4XG4iLAorCQkJYi0+YnNfYXNpY190eXBlLCBiLT5ic194aWQsIGItPmJzX3BlcnNpc3RfYnVzbnVtLAorCQkJYi0+YnNfbGVnYWN5X2lvLCBiLT5ic19sZWdhY3lfbWVtLCBiLT5ic19iYXNlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib24gbm9kZSAlZCBidXQgb25seSAlZCBub2RlcyBvbmxpbmUuIgorCQkJIkFzc29jaWF0aW9uIHNldCB0byB1bmRldGVybWluZWQuXG4iLAorCQkJY29udHJvbGxlci0+bm9kZSwgbnVtX29ubGluZV9ub2RlcygpKTsKKwkJY29udHJvbGxlci0+bm9kZSA9IC0xOworCX0KKwlyZXR1cm47CisKK2Vycm9yX3JldHVybjoKKworCWtmcmVlKGNvbnRyb2xsZXIpOworCXJldHVybjsKK30KKwordm9pZCBzbl9idXNfc3RvcmVfc3lzZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OworCisJZWxlbWVudCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGVtZW50KSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWVsZW1lbnQtPnN5c2RhdGEgPSBkZXYtPnN5c2RhdGE7CisJbGlzdF9hZGQoJmVsZW1lbnQtPmVudHJ5LCAmc25fc3lzZGF0YV9saXN0KTsKK30KKwordm9pZCBzbl9idXNfZnJlZV9zeXNkYXRhKHZvaWQpCit7CisJc3RydWN0IHN5c2RhdGFfZWwgKmVsZW1lbnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworc25fc3lzZGF0YV9mcmVlX3N0YXJ0OgorCWxpc3RfZm9yX2VhY2gobGlzdCwgJnNuX3N5c2RhdGFfbGlzdCkgeworCQllbGVtZW50ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3lzZGF0YV9lbCwgZW50cnkpOworCQlsaXN0X2RlbCgmZWxlbWVudC0+ZW50cnkpOworCQlrZnJlZShlbGVtZW50LT5zeXNkYXRhKTsKKwkJa2ZyZWUoZWxlbWVudCk7CisJCWdvdG8gc25fc3lzZGF0YV9mcmVlX3N0YXJ0OworCX0KKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0zODQsNyArNDQ4LDcgQEAKIAlleHRlcm4gdm9pZCByZWdpc3Rlcl9zbl9wcm9jZnModm9pZCk7CiAjZW5kaWYKIAotCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikgfHwgSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKSkKKwlpZiAoIWlhNjRfcGxhdGZvcm1faXMoInNuMiIpIHx8IElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTQwMywyMCArNDY3LDE3IEBACiAJICovCiAJaWE2NF9tYXhfaW9tbXVfbWVyZ2VfbWFzayA9IH5QQUdFX01BU0s7CiAJc25fZml4dXBfaW9ub2RlcygpOwotCXNuX2lycSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyAqKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOwotCWlmIChzbl9pcnEgPD0gMCkKLQkJQlVHKCk7CQkvKiBDYW5ubyBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkuICovCi0JbWVtc2V0KHNuX2lycSwgMCwgc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyAqKSAqIE5SX0lSUVMpOwotCisJc25faXJxX2xoX2luaXQoKTsKKwlJTklUX0xJU1RfSEVBRCgmc25fc3lzZGF0YV9saXN0KTsKIAlzbl9pbml0X2NwZWlfdGltZXIoKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcmVnaXN0ZXJfc25fcHJvY2ZzKCk7CiAjZW5kaWYKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlVTRVNfVE9fU0NBTjsgaSsrKSB7Ci0JCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKDAsIGkpOwotCX0KKwkvKiBidXNzZXMgYXJlIG5vdCBrbm93biB5ZXQgLi4uICovCisJZm9yIChpID0gMDsgaSA8IFBDSV9CVVNFU19UT19TQ0FOOyBpKyspCisJCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKDAsIGksIE5VTEwpOwogCiAJLyoKIAkgKiBHZW5lcmljIExpbnV4IFBDSSBMYXllciBoYXMgY3JlYXRlZCB0aGUgcGNpX2J1cyBhbmQgcGNpX2RldiAKQEAgLTQyNSw5ICs0ODYsOCBAQAogCSAqLwogCiAJd2hpbGUgKChwY2lfZGV2ID0KLQkJcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSAhPSBOVUxMKSB7CisJCXBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSAhPSBOVUxMKQogCQlzbl9wY2lfZml4dXBfc2xvdChwY2lfZGV2KTsKLQl9CiAKIAlzbl9pb2lmX2luaXRlZCA9IDE7CS8qIHNuIEkvTyBpbmZyYXN0cnVjdHVyZSBub3cgaW5pdGlhbGl6ZWQgKi8KIApAQCAtNDY5LDMgKzUyOSw4IEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChzbl9wY2lfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHNuX3BjaV9maXh1cF9zbG90KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX3VuZml4dXBfc2xvdCk7CitFWFBPUlRfU1lNQk9MKHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKTsKK0VYUE9SVF9TWU1CT0woc25fYnVzX3N0b3JlX3N5c2RhdGEpOworRVhQT1JUX1NZTUJPTChzbl9idXNfZnJlZV9zeXNkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKaW5kZXggZmVjNmQ4Yi4uN2NlM2NkYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKQEAgLTksMTIgKzksMTYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdmdhLmg+CiAjaW5jbHVkZSA8YXNtL3NuL25vZGVwZGEuaD4KICNpbmNsdWRlIDxhc20vc24vc2ltdWxhdG9yLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BkYS5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbl9jcHVpZC5oPgogI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgogCisjZGVmaW5lIElTX0xFR0FDWV9WR0FfSU9QT1JUKHApIFwKKwkoKChwKSA+PSAweDNiMCAmJiAocCkgPD0gMHgzYmIpIHx8ICgocCkgPj0gMHgzYzAgJiYgKHApIDw9IDB4M2RmKSkKKwogLyoqCiAgKiBzbl9pb19hZGRyIC0gY29udmVydCBhbiBpbi9vdXQgcG9ydCB0byBhbiBpL28gYWRkcmVzcwogICogQHBvcnQ6IHBvcnQgdG8gY29udmVydApAQCAtMjYsNiArMzAsOCBAQAogdm9pZCAqc25faW9fYWRkcih1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKCFJU19SVU5OSU5HX09OX1NJTVVMQVRPUigpKSB7CisJCWlmIChJU19MRUdBQ1lfVkdBX0lPUE9SVChwb3J0KSkKKwkJCXBvcnQgKz0gdmdhX2NvbnNvbGVfaW9iYXNlOwogCQkvKiBPbiBzbjIsIGxlZ2FjeSBJL08gcG9ydHMgZG9uJ3QgcG9pbnQgYXQgYW55dGhpbmcgKi8KIAkJaWYgKHBvcnQgPCAoNjQgKiAxMDI0KSkKIAkJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggMGY0ZTgxMzguLjg0ZDI3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwpAQCAtOSwxMyArOSwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCiAjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogCkBAIC0yNSw3ICsyNSw4IEBACiAKIGV4dGVybiBpbnQgc25fZm9yY2VfaW50ZXJydXB0X2ZsYWc7CiBleHRlcm4gaW50IHNuX2lvaWZfaW5pdGVkOwotc3RydWN0IHNuX2lycV9pbmZvICoqc25faXJxOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKipzbl9pcnFfbGg7CitzdGF0aWMgc3BpbmxvY2tfdCBzbl9pcnFfaW5mb19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOyAvKiBub24tSVJRIGxvY2sgKi8KIAogc3RhdGljIGlubGluZSB1aW50NjRfdCBzbl9pbnRyX2FsbG9jKG5hc2lkX3QgbG9jYWxfbmFzaWQsIGludCBsb2NhbF93aWRnZXQsCiAJCQkJICAgICB1NjQgc25faXJxX2luZm8sCkBAIC0xMDEsNyArMTAyLDcgQEAKIAkJbmFzaWQgPSBnZXRfbmFzaWQoKTsKIAkJZXZlbnRfb2NjdXJyZWQgPSBIVUJfTCgodWludDY0X3QgKikgR0xPQkFMX01NUl9BRERSCiAJCQkJICAgICAgIChuYXNpZCwgU0hfRVZFTlRfT0NDVVJSRUQpKTsKLQkJLyogSWYgdGhlIFVBUlQgYml0IGlzIHNldCBoZXJlLCB3ZSBtYXkgaGF2ZSByZWNlaXZlZCBhbiAKKwkJLyogSWYgdGhlIFVBUlQgYml0IGlzIHNldCBoZXJlLCB3ZSBtYXkgaGF2ZSByZWNlaXZlZCBhbgogCQkgKiBpbnRlcnJ1cHQgZnJvbSB0aGUgVUFSVCB0aGF0IHRoZSBkcml2ZXIgbWlzc2VkLiAgVG8KIAkJICogbWFrZSBzdXJlLCB3ZSBJUEkgb3Vyc2VsdmVzIHRvIGZvcmNlIHVzIHRvIGxvb2sgYWdhaW4uCiAJCSAqLwpAQCAtMTE1LDgyICsxMTYsODQgQEAKIAkJZm9yY2VfaW50ZXJydXB0KGlycSk7CiB9CiAKK3N0YXRpYyB2b2lkIHNuX2lycV9pbmZvX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKTsKKwogc3RhdGljIHZvaWQgc25fc2V0X2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKIHsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvID0gc25faXJxW2lycV07Ci0Jc3RydWN0IHNuX2lycV9pbmZvICp0bXBfc25faXJxX2luZm87CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbywgKnNuX2lycV9pbmZvX3NhZmU7CiAJaW50IGNwdWlkLCBjcHVwaHlzOwotCW5hc2lkX3QgdF9uYXNpZDsJLyogbmFzaWQgdG8gdGFyZ2V0ICovCi0JaW50IHRfc2xpY2U7CQkvKiBzbGljZSB0byB0YXJnZXQgKi8KLQotCS8qIGFsbG9jYXRlIGEgdGVtcCBzbl9pcnFfaW5mbyBzdHJ1Y3QgdG8gZ2V0IG5ldyB0YXJnZXQgaW5mbyAqLwotCXRtcF9zbl9pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCp0bXBfc25faXJxX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtcF9zbl9pcnFfaW5mbykKLQkJcmV0dXJuOwogCiAJY3B1aWQgPSBmaXJzdF9jcHUobWFzayk7CiAJY3B1cGh5cyA9IGNwdV9waHlzaWNhbF9pZChjcHVpZCk7Ci0JdF9uYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdWlkKTsKLQl0X3NsaWNlID0gY3B1aWRfdG9fc2xpY2UoY3B1aWQpOwogCi0Jd2hpbGUgKHNuX2lycV9pbmZvKSB7Ci0JCWludCBzdGF0dXM7Ci0JCWludCBsb2NhbF93aWRnZXQ7Ci0JCXVpbnQ2NF90IGJyaWRnZSA9ICh1aW50NjRfdCkgc25faXJxX2luZm8tPmlycV9icmlkZ2U7Ci0JCW5hc2lkX3QgbG9jYWxfbmFzaWQgPSBOQVNJRF9HRVQoYnJpZGdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCisJCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KSB7CisJCXVpbnQ2NF90IGJyaWRnZTsKKwkJaW50IGxvY2FsX3dpZGdldCwgc3RhdHVzOworCQluYXNpZF90IGxvY2FsX25hc2lkOworCQlzdHJ1Y3Qgc25faXJxX2luZm8gKm5ld19pcnFfaW5mbzsKIAotCQlpZiAoIWJyaWRnZSkKLQkJCWJyZWFrOwkvKiBpcnEgaXMgbm90IGEgZGV2aWNlIGludGVycnVwdCAqLworCQluZXdfaXJxX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19pcnFfaW5mbyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW1lbWNweShuZXdfaXJxX2luZm8sIHNuX2lycV9pbmZvLCBzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSk7CisKKwkJYnJpZGdlID0gKHVpbnQ2NF90KSBuZXdfaXJxX2luZm8tPmlycV9icmlkZ2U7CisJCWlmICghYnJpZGdlKSB7CisJCQlrZnJlZShuZXdfaXJxX2luZm8pOworCQkJYnJlYWs7IC8qIGlycSBpcyBub3QgYSBkZXZpY2UgaW50ZXJydXB0ICovCisJCX0KKworCQlsb2NhbF9uYXNpZCA9IE5BU0lEX0dFVChicmlkZ2UpOwogCiAJCWlmIChsb2NhbF9uYXNpZCAmIDEpCiAJCQlsb2NhbF93aWRnZXQgPSBUSU9fU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKIAkJZWxzZQogCQkJbG9jYWxfd2lkZ2V0ID0gU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKIAotCQkvKiBGcmVlIHRoZSBvbGQgUFJPTSBzbl9pcnFfaW5mbyBzdHJ1Y3R1cmUgKi8KLQkJc25faW50cl9mcmVlKGxvY2FsX25hc2lkLCBsb2NhbF93aWRnZXQsIHNuX2lycV9pbmZvKTsKKwkJLyogRnJlZSB0aGUgb2xkIFBST00gbmV3X2lycV9pbmZvIHN0cnVjdHVyZSAqLworCQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgbmV3X2lycV9pbmZvKTsKKwkJLyogVXBkYXRlIGtlcm5lbHMgbmV3X2lycV9pbmZvIHdpdGggbmV3IHRhcmdldCBpbmZvICovCisJCXVucmVnaXN0ZXJfaW50cl9wZGEobmV3X2lycV9pbmZvKTsKIAotCQkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIHNuX2lycV9pbmZvIHN0cnVjdCAqLworCQkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIG5ld19pcnFfaW5mbyBzdHJ1Y3QgKi8KIAkJc3RhdHVzID0gc25faW50cl9hbGxvYyhsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LAotCQkJCSAgICAgICBfX3BhKHRtcF9zbl9pcnFfaW5mbyksIGlycSwgdF9uYXNpZCwKLQkJCQkgICAgICAgdF9zbGljZSk7CisJCQkJICAgICAgIF9fcGEobmV3X2lycV9pbmZvKSwgaXJxLAorCQkJCSAgICAgICBjcHVpZF90b19uYXNpZChjcHVpZCksCisJCQkJICAgICAgIGNwdWlkX3RvX3NsaWNlKGNwdWlkKSk7CiAKLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQkvKiBVcGRhdGUga2VybmVscyBzbl9pcnFfaW5mbyB3aXRoIG5ldyB0YXJnZXQgaW5mbyAqLwotCQkJdW5yZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7Ci0JCQlzbl9pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1aWQ7Ci0JCQlzbl9pcnFfaW5mby0+aXJxX25hc2lkID0gdF9uYXNpZDsKLQkJCXNuX2lycV9pbmZvLT5pcnFfc2xpY2UgPSB0X3NsaWNlOwotCQkJc25faXJxX2luZm8tPmlycV94dGFsa2FkZHIgPQotCQkJICAgIHRtcF9zbl9pcnFfaW5mby0+aXJxX3h0YWxrYWRkcjsKLQkJCXNuX2lycV9pbmZvLT5pcnFfY29va2llID0gdG1wX3NuX2lycV9pbmZvLT5pcnFfY29va2llOwotCQkJcmVnaXN0ZXJfaW50cl9wZGEoc25faXJxX2luZm8pOworCQkvKiBTQUwgY2FsbCBmYWlsZWQgKi8KKwkJaWYgKHN0YXR1cykgeworCQkJa2ZyZWUobmV3X2lycV9pbmZvKTsKKwkJCWJyZWFrOworCQl9CiAKLQkJCWlmIChJU19QQ0lfQlJJREdFX0FTSUMoc25faXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkpIHsKLQkJCQlwY2licl9jaGFuZ2VfZGV2aWNlc19pcnEoc25faXJxX2luZm8pOwotCQkJfQorCQluZXdfaXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdWlkOworCQlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwogCi0JCQlzbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvLT5pcnFfbmV4dDsKKwkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhuZXdfaXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkpCisJCQlwY2licl9jaGFuZ2VfZGV2aWNlc19pcnEobmV3X2lycV9pbmZvKTsKKworCQlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCQlsaXN0X3JlcGxhY2VfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCwgJm5ld19pcnFfaW5mby0+bGlzdCk7CisJCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwkJY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOwogCiAjaWZkZWYgQ09ORklHX1NNUAotCQkJc2V0X2lycV9hZmZpbml0eV9pbmZvKChpcnEgJiAweGZmKSwgY3B1cGh5cywgMCk7CisJCXNldF9pcnFfYWZmaW5pdHlfaW5mbygoaXJxICYgMHhmZiksIGNwdXBoeXMsIDApOwogI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlicmVhazsJLyogc25wX2FmZmluaXR5IGZhaWxlZCB0aGUgaW50cl9hbGxvYyAqLwotCQl9CiAJfQotCWtmcmVlKHRtcF9zbl9pcnFfaW5mbyk7CiB9CiAKIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9zbiA9IHsKLQkiU04gaHViIiwKLQlzbl9zdGFydHVwX2lycSwKLQlzbl9zaHV0ZG93bl9pcnEsCi0Jc25fZW5hYmxlX2lycSwKLQlzbl9kaXNhYmxlX2lycSwKLQlzbl9hY2tfaXJxLAotCXNuX2VuZF9pcnEsCi0Jc25fc2V0X2FmZmluaXR5X2lycQorCS50eXBlbmFtZQk9ICJTTiBodWIiLAorCS5zdGFydHVwCT0gc25fc3RhcnR1cF9pcnEsCisJLnNodXRkb3duCT0gc25fc2h1dGRvd25faXJxLAorCS5lbmFibGUJCT0gc25fZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IHNuX2Rpc2FibGVfaXJxLAorCS5hY2sJCT0gc25fYWNrX2lycSwKKwkuZW5kCQk9IHNuX2VuZF9pcnEsCisJLnNldF9hZmZpbml0eQk9IHNuX3NldF9hZmZpbml0eV9pcnEKIH07CiAKIHVuc2lnbmVkIGludCBzbl9sb2NhbF92ZWN0b3JfdG9faXJxKHU4IHZlY3RvcikKQEAgLTIzMSwxOSArMjM0LDE4IEBACiAJc3RydWN0IHNuX2lycV9pbmZvICp0bXBfaXJxX2luZm87CiAJaW50IGksIGZvdW5kbWF0Y2g7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKHBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSA9PSBpcnEpIHsKIAkJZm91bmRtYXRjaCA9IDA7Ci0JCWZvciAoaSA9IHBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSAtIDE7IGk7IGktLSkgewotCQkJdG1wX2lycV9pbmZvID0gc25faXJxW2ldOwotCQkJd2hpbGUgKHRtcF9pcnFfaW5mbykgeworCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fbGFzdF9pcnEgLSAxOworCQkgICAgIGkgJiYgIWZvdW5kbWF0Y2g7IGktLSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodG1wX2lycV9pbmZvLAorCQkJCQkJc25faXJxX2xoW2ldLAorCQkJCQkJbGlzdCkgewogCQkJCWlmICh0bXBfaXJxX2luZm8tPmlycV9jcHVpZCA9PSBjcHUpIHsKLQkJCQkJZm91bmRtYXRjaCsrOworCQkJCQlmb3VuZG1hdGNoID0gMTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXRtcF9pcnFfaW5mbyA9IHRtcF9pcnFfaW5mby0+aXJxX25leHQ7Ci0JCQl9Ci0JCQlpZiAoZm91bmRtYXRjaCkgewotCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSA9IGk7CkBAIC0yNTEsNjAgKzI1MywyNyBAQAogCiAJaWYgKHBkYWNwdShjcHUpLT5zbl9maXJzdF9pcnEgPT0gaXJxKSB7CiAJCWZvdW5kbWF0Y2ggPSAwOwotCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fZmlyc3RfaXJxICsgMTsgaSA8IE5SX0lSUVM7IGkrKykgewotCQkJdG1wX2lycV9pbmZvID0gc25faXJxW2ldOwotCQkJd2hpbGUgKHRtcF9pcnFfaW5mbykgeworCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fZmlyc3RfaXJxICsgMTsKKwkJICAgICBpIDwgTlJfSVJRUyAmJiAhZm91bmRtYXRjaDsgaSsrKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0bXBfaXJxX2luZm8sCisJCQkJCQlzbl9pcnFfbGhbaV0sCisJCQkJCQlsaXN0KSB7CiAJCQkJaWYgKHRtcF9pcnFfaW5mby0+aXJxX2NwdWlkID09IGNwdSkgewotCQkJCQlmb3VuZG1hdGNoKys7CisJCQkJCWZvdW5kbWF0Y2ggPSAxOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdG1wX2lycV9pbmZvID0gdG1wX2lycV9pbmZvLT5pcnFfbmV4dDsKLQkJCX0KLQkJCWlmIChmb3VuZG1hdGNoKSB7Ci0JCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJcGRhY3B1KGNwdSktPnNuX2ZpcnN0X2lycSA9ICgoaSA9PSBOUl9JUlFTKSA/IDAgOiBpKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2FsbG9jKG5hc2lkX3QgbG9jYWxfbmFzaWQsIGludCBsb2NhbF93aWRnZXQsIGludCBpcnEsCi0JCQkJIG5hc2lkX3QgbmFzaWQsIGludCBzbGljZSkKK3N0YXRpYyB2b2lkIHNuX2lycV9pbmZvX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Ci0JaW50IHN0YXR1czsKIAotCXNuX2lycV9pbmZvID0ga21hbGxvYyhzaXplb2YoKnNuX2lycV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNuX2lycV9pbmZvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtc2V0KHNuX2lycV9pbmZvLCAweDAsIHNpemVvZigqc25faXJxX2luZm8pKTsKLQotCXN0YXR1cyA9Ci0JICAgIHNuX2ludHJfYWxsb2MobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgX19wYShzbl9pcnFfaW5mbyksIGlycSwKLQkJCSAgbmFzaWQsIHNsaWNlKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJa2ZyZWUoc25faXJxX2luZm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm4gc25faXJxX2luZm87Ci0JfQotfQotCi12b2lkIHNuX2lycV9mcmVlKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCi17Ci0JdWludDY0X3QgYnJpZGdlID0gKHVpbnQ2NF90KSBzbl9pcnFfaW5mby0+aXJxX2JyaWRnZTsKLQluYXNpZF90IGxvY2FsX25hc2lkID0gTkFTSURfR0VUKGJyaWRnZSk7Ci0JaW50IGxvY2FsX3dpZGdldDsKLQotCWlmIChsb2NhbF9uYXNpZCAmIDEpCS8qIHRpbyBjaGVjayAqLwotCQlsb2NhbF93aWRnZXQgPSBUSU9fU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKLQllbHNlCi0JCWxvY2FsX3dpZGdldCA9IFNXSU5fV0lER0VUTlVNKGJyaWRnZSk7Ci0KLQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgc25faXJxX2luZm8pOwotCisJc25faXJxX2luZm8gPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHNuX2lycV9pbmZvLCByY3UpOwogCWtmcmVlKHNuX2lycV9pbmZvKTsKIH0KIApAQCAtMzE0LDMwICsyODMsNTQgQEAKIAlpbnQgc2xpY2UgPSBzbl9pcnFfaW5mby0+aXJxX3NsaWNlOwogCWludCBjcHUgPSBuYXNpZF9zbGljZV90b19jcHVpZChuYXNpZCwgc2xpY2UpOwogCisJcGNpX2Rldl9nZXQocGNpX2Rldik7CiAJc25faXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdTsKIAlzbl9pcnFfaW5mby0+aXJxX3BjaWlvaW5mbyA9IFNOX1BDSURFVl9JTkZPKHBjaV9kZXYpOwogCiAJLyogbGluayBpdCBpbnRvIHRoZSBzbl9pcnFbaXJxXSBsaXN0ICovCi0Jc25faXJxX2luZm8tPmlycV9uZXh0ID0gc25faXJxW3NuX2lycV9pbmZvLT5pcnFfaXJxXTsKLQlzbl9pcnFbc25faXJxX2luZm8tPmlycV9pcnFdID0gc25faXJxX2luZm87CisJc3Bpbl9sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwlsaXN0X2FkZF9yY3UoJnNuX2lycV9pbmZvLT5saXN0LCBzbl9pcnFfbGhbc25faXJxX2luZm8tPmlycV9pcnFdKTsKKwlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7CiAKIAkodm9pZClyZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7CiB9CiAKK3ZvaWQgc25faXJxX3VuZml4dXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKworCS8qIE9ubHkgY2xlYW51cCBJUlEgc3R1ZmYgaWYgdGhpcyBkZXZpY2UgaGFzIGEgaG9zdCBidXMgY29udGV4dCAqLworCWlmICghU05fUENJREVWX0JVU1NPRlQocGNpX2RldikpCisJCXJldHVybjsKKworCXNuX2lycV9pbmZvID0gU05fUENJREVWX0lORk8ocGNpX2RldiktPnBkaV9zbl9pcnFfaW5mbzsKKwlpZiAoIXNuX2lycV9pbmZvIHx8ICFzbl9pcnFfaW5mby0+aXJxX2lycSkgeworCQlrZnJlZShzbl9pcnFfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwl1bnJlZ2lzdGVyX2ludHJfcGRhKHNuX2lycV9pbmZvKTsKKwlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCWxpc3RfZGVsX3JjdSgmc25faXJxX2luZm8tPmxpc3QpOworCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwljYWxsX3JjdSgmc25faXJxX2luZm8tPnJjdSwgc25faXJxX2luZm9fZnJlZSk7CisJcGNpX2Rldl9wdXQocGNpX2Rldik7Cit9CisKIHN0YXRpYyB2b2lkIGZvcmNlX2ludGVycnVwdChpbnQgaXJxKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CiAKIAlpZiAoIXNuX2lvaWZfaW5pdGVkKQogCQlyZXR1cm47Ci0Jc25faXJxX2luZm8gPSBzbl9pcnFbaXJxXTsKLQl3aGlsZSAoc25faXJxX2luZm8pIHsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzbl9pcnFfaW5mbywgc25faXJxX2xoW2lycV0sIGxpc3QpIHsKIAkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlKSAmJgotCQkgICAgKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlICE9IE5VTEwpKSB7CisJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpCiAJCQlwY2licl9mb3JjZV9pbnRlcnJ1cHQoc25faXJxX2luZm8pOwotCQl9Ci0JCXNuX2lycV9pbmZvID0gc25faXJxX2luZm8tPmlycV9uZXh0OwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyoKQEAgLTQwMiwxOSArMzk1LDQxIEBACiAKIHZvaWQgc25fbGJfaW50X3dhcl9jaGVjayh2b2lkKQogeworCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CiAJaW50IGk7CiAKIAlpZiAoIXNuX2lvaWZfaW5pdGVkIHx8IHBkYS0+c25fZmlyc3RfaXJxID09IDApCiAJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSBwZGEtPnNuX2ZpcnN0X2lycTsgaSA8PSBwZGEtPnNuX2xhc3RfaXJxOyBpKyspIHsKLQkJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyA9IHNuX2lycVtpXTsKLQkJd2hpbGUgKHNuX2lycV9pbmZvKSB7Ci0JCQkvKiBPbmx5IGNhbGwgZm9yIFBDSSBicmlkZ2VzIHRoYXQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzbl9pcnFfaW5mbywgc25faXJxX2xoW2ldLCBsaXN0KSB7CisJCQkvKgorCQkJICogT25seSBjYWxsIGZvciBQQ0kgYnJpZGdlcyB0aGF0IGFyZSBmdWxseQorCQkJICogaW5pdGlhbGl6ZWQuCisJCQkgKi8KIAkJCWlmIChJU19QQ0lfQlJJREdFX0FTSUMoc25faXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkgJiYKLQkJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpIHsKKwkJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpCiAJCQkJc25fY2hlY2tfaW50cihpLCBzbl9pcnFfaW5mbyk7Ci0JCQl9Ci0JCQlzbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvLT5pcnFfbmV4dDsKIAkJfQogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwordm9pZCBzbl9pcnFfbGhfaW5pdCh2b2lkKQoreworCWludCBpOworCisJc25faXJxX2xoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCAqKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCWlmICghc25faXJxX2xoKQorCQlwYW5pYygiU04gUENJIElOSVQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFBDSSBpbml0XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc25faXJxX2xoW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCQlpZiAoIXNuX2lycV9saFtpXSkKKwkJCXBhbmljKCJTTiBQQ0kgSU5JVDogRmFpbGVkIElSUSBtZW1vcnkgYWxsb2NhdGlvblxuIik7CisKKwkJSU5JVF9MSVNUX0hFQUQoc25faXJxX2xoW2ldKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCA0NGJmYzdmLi43YzdmZTQ0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS92Z2EuaD4KICNpbmNsdWRlIDxhc20vc24vYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wZGEuaD4KQEAgLTk1LDYgKzk2LDcgQEAKIEVYUE9SVF9TWU1CT0woc25fY29oZXJlbmN5X2lkKTsKIHU4IHNuX3JlZ2lvbl9zaXplOwogRVhQT1JUX1NZTUJPTChzbl9yZWdpb25fc2l6ZSk7CitpbnQgc25fcHJvbV90eXBlOwkvKiAwPWhhcmR3YXJlLCAxPW1lZHVzYS9yZWFscHJvbSwgMj1tZWR1c2EvZmFrZXByb20gKi8KIAogc2hvcnQgcGh5c2ljYWxfbm9kZV9tYXBbTUFYX1BIWVNOT0RFX0lEXTsKIApAQCAtMjY4LDE5ICsyNzAsMjIgQEAKIHsKIAlsb25nIHN0YXR1cywgdGlja3NfcGVyX3NlYywgZHJpZnQ7CiAJaW50IHB4bTsKLQlpbnQgbWFqb3IgPSBzbl9zYWxfcmV2X21ham9yKCksIG1pbm9yID0gc25fc2FsX3Jldl9taW5vcigpOworCXUzMiB2ZXJzaW9uID0gc25fc2FsX3JldigpOwogCWV4dGVybiB2b2lkIHNuX2NwdV9pbml0KHZvaWQpOwogCiAJaWE2NF9zbl9wbGF0X3NldF9lcnJvcl9oYW5kbGluZ19mZWF0dXJlcygpOwogCi0JLyoKLQkgKiBJZiB0aGUgZ2VuZXJpYyBjb2RlIGhhcyBlbmFibGVkIHZnYSBjb25zb2xlIHN1cHBvcnQgLSBsZXRzCi0JICogZ2V0IHJpZCBvZiBpdCBhZ2Fpbi4gVGhpcyBpcyBhIGtsdWRnZSBmb3IgdGhlIGZhY3QgdGhhdCBBQ1BJCi0JICogY3VycnRlbnRseSBoYXMgbm8gd2F5IG9mIGluZm9ybWluZyB1cyBpZiBsZWdhY3kgVkdBIGlzIGF2YWlsYWJsZQotCSAqIG9yIG5vdC4KLQkgKi8KICNpZiBkZWZpbmVkKENPTkZJR19WVCkgJiYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpCi0JaWYgKGNvbnN3aXRjaHAgPT0gJnZnYV9jb24pIHsKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIHByaW1hcnkgdmdhIGFkYXB0ZXIgaWRlbnRpZmllZCB0aHJvdWdoIHRoZQorCSAqIEVGSSBQQ0RQIHRhYmxlLCBtYWtlIGl0IHRoZSBwcmVmZXJyZWQgY29uc29sZS4gIE90aGVyd2lzZQorCSAqIHplcm8gb3V0IGNvbnN3aXRjaHAuCisJICovCisKKwlpZiAodmdhX2NvbnNvbGVfbWVtYmFzZSkgeworCQkvKiB1c2FibGUgdmdhIC4uLiBtYWtlIHR0eTAgdGhlIHByZWZlcnJlZCBkZWZhdWx0IGNvbnNvbGUgKi8KKwkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHkiLCAwLCBOVUxMKTsKKwl9IGVsc2UgewogCQlwcmludGsoS0VSTl9ERUJVRyAiU0dJOiBEaXNhYmxpbmcgVkdBIGNvbnNvbGVcbiIpOwogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCiAJCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwpAQCAtMzAzLDIyICszMDgsMjEgQEAKIAkgKiBzdXBwb3J0IGhlcmUgc28gd2UgZG9uJ3QgaGF2ZSB0byBsaXN0ZW4gdG8gZmFpbGVkIGtleWJvYXJkIHByb2JlCiAJICogbWVzc2FnZXMuCiAJICovCi0JaWYgKChtYWpvciA8IDIgfHwgKG1ham9yID09IDIgJiYgbWlub3IgPD0gOSkpICYmCi0JICAgIGFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCkgeworCWlmICh2ZXJzaW9uIDw9IDB4MDIwOSAmJiBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGxlZ2FjeSBrZXlib2FyZCBzdXBwb3J0IGFzIHByb20gIgogCQkgICAgICAgImlzIHRvbyBvbGQgYW5kIGRvZXNuJ3QgcHJvdmlkZSBGQURUXG4iKTsKIAkJYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMDsKIAl9CiAKLQlwcmludGsoIlNHSSBTQUwgdmVyc2lvbiAleC4lMDJ4XG4iLCBtYWpvciwgbWlub3IpOworCXByaW50aygiU0dJIFNBTCB2ZXJzaW9uICV4LiUwMnhcbiIsIHZlcnNpb24gPj4gOCwgdmVyc2lvbiAmIDB4MDBGRik7CiAKIAkvKgogCSAqIENvbmZpcm0gdGhlIFNBTCB3ZSdyZSBydW5uaW5nIG9uIGlzIHJlY2VudCBlbm91Z2guLi4KIAkgKi8KLQlpZiAoKG1ham9yIDwgU05fU0FMX01JTl9NQUpPUikgfHwgKG1ham9yID09IFNOX1NBTF9NSU5fTUFKT1IgJiYKLQkJCQkJICAgbWlub3IgPCBTTl9TQUxfTUlOX01JTk9SKSkgeworCWlmICh2ZXJzaW9uIDwgU05fU0FMX01JTl9WRVJTSU9OKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVGhpcyBrZXJuZWwgbmVlZHMgU0dJIFNBTCB2ZXJzaW9uID49ICIKLQkJICAgICAgICIleC4lMDJ4XG4iLCBTTl9TQUxfTUlOX01BSk9SLCBTTl9TQUxfTUlOX01JTk9SKTsKKwkJICAgICAgICIleC4lMDJ4XG4iLCBTTl9TQUxfTUlOX1ZFUlNJT04gPj4gOCwKKwkJICAgICAgICBTTl9TQUxfTUlOX1ZFUlNJT04gJiAweDAwRkYpOwogCQlwYW5pYygiUFJPTSB2ZXJzaW9uIHRvbyBvbGRcbiIpOwogCX0KIApAQCAtMzUwLDcgKzM1NCw3IEBACiAKIAlpYTY0X21hcmtfaWRsZSA9ICZzbmlkbGU7CiAKLQkvKiAKKwkvKgogCSAqIEZvciB0aGUgYm9vdGNwdSwgd2UgZG8gdGhpcyBoZXJlLiBBbGwgb3RoZXIgY3B1cyB3aWxsIG1ha2UgdGhlCiAJICogY2FsbCBhcyBwYXJ0IG9mIGNwdV9pbml0IGluIHNsYXZlIGNwdSBpbml0aWFsaXphdGlvbi4KIAkgKi8KQEAgLTM5Nyw3ICs0MDEsNyBAQAogCQlub2RlcGRhaW5kcltjbm9kZV0gPQogCQkgICAgYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShjbm9kZSksIHNpemVvZihub2RlcGRhX3QpKTsKIAkJbWVtc2V0KG5vZGVwZGFpbmRyW2Nub2RlXSwgMCwgc2l6ZW9mKG5vZGVwZGFfdCkpOwotCQltZW1zZXQobm9kZXBkYWluZHJbY25vZGVdLT5waHlzX2NwdWlkLCAtMSwgCisJCW1lbXNldChub2RlcGRhaW5kcltjbm9kZV0tPnBoeXNfY3B1aWQsIC0xLAogCQkgICAgc2l6ZW9mKG5vZGVwZGFpbmRyW2Nub2RlXS0+cGh5c19jcHVpZCkpOwogCX0KIApAQCAtNDI3LDcgKzQzMSw3IEBACiAJfQogCiAJLyoKLQkgKiBJbml0aWFsaXplIHRoZSBwZXIgbm9kZSBodWJkZXYuICBUaGlzIGluY2x1ZGVzIElPIE5vZGVzIGFuZCAKKwkgKiBJbml0aWFsaXplIHRoZSBwZXIgbm9kZSBodWJkZXYuICBUaGlzIGluY2x1ZGVzIElPIE5vZGVzIGFuZAogCSAqIGhlYWRsZXNzL21lbWxlc3Mgbm9kZXMuCiAJICovCiAJZm9yIChjbm9kZSA9IDA7IGNub2RlIDwgbnVtaW9ub2RlczsgY25vZGUrKykgewpAQCAtNDU1LDYgKzQ1OSwxNCBAQAogCWludCBpOwogCXN0YXRpYyBpbnQgd2Fyc19oYXZlX2JlZW5fY2hlY2tlZDsKIAorCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCAmJiBJU19NRURVU0EoKSkgeworCQlpZiAoaWE2NF9zbl9pc19mYWtlX3Byb20oKSkKKwkJCXNuX3Byb21fdHlwZSA9IDI7CisJCWVsc2UKKwkJCXNuX3Byb21fdHlwZSA9IDE7CisJCXByaW50aygiUnVubmluZyBvbiBtZWR1c2Egd2l0aCAlcyBQUk9NXG4iLCAoc25fcHJvbV90eXBlID09IDEpID8gInJlYWwiIDogImZha2UiKTsKKwl9CisKIAltZW1zZXQocGRhLCAwLCBzaXplb2YocGRhKSk7CiAJaWYgKGlhNjRfc25fZ2V0X3NuX2luZm8oMCwgJnNuX2h1Yl9pbmZvLT5zaHViMiwgJnNuX2h1Yl9pbmZvLT5uYXNpZF9iaXRtYXNrLCAmc25faHViX2luZm8tPm5hc2lkX3NoaWZ0LAogCQkJCSZzbl9zeXN0ZW1fc2l6ZSwgJnNuX3NoYXJpbmdfZG9tYWluX3NpemUsICZzbl9wYXJ0aXRpb25faWQsCkBAIC01MjAsNyArNTMyLDcgQEAKIAkgKi8KIAl7CiAJCXU2NCBwaW8xW10gPSB7U0gxX1BJT19XUklURV9TVEFUVVNfMCwgMCwgU0gxX1BJT19XUklURV9TVEFUVVNfMSwgMH07Ci0JCXU2NCBwaW8yW10gPSB7U0gyX1BJT19XUklURV9TVEFUVVNfMCwgU0gyX1BJT19XUklURV9TVEFUVVNfMSwgCisJCXU2NCBwaW8yW10gPSB7U0gyX1BJT19XUklURV9TVEFUVVNfMCwgU0gyX1BJT19XUklURV9TVEFUVVNfMSwKIAkJCVNIMl9QSU9fV1JJVEVfU1RBVFVTXzIsIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzN9OwogCQl1NjQgKnBpbzsKIAkJcGlvID0gaXNfc2h1YjEoKSA/IHBpbzEgOiBwaW8yOwpAQCAtNTUyLDYgKzU2NCwxMCBAQAogCWludCBuYXNpZCA9IDA7CiAJbGJvYXJkX3QgKmJyZDsKIAorCS8qIGZha2Vwcm9tIGRvZXMgbm90IHN1cHBvcnQga2xncmFwaCAqLworCWlmIChJU19SVU5OSU5HX09OX0ZBS0VfUFJPTSgpKQorCQlyZXR1cm47CisKIAkvKiBTZXR1cCBpb25vZGVzIHdpdGggbWVtb3J5ICovCiAJZm9yIChuYXNpZCA9IDA7IG5hc2lkIDwgTUFYX1BIWVNOT0RFX0lEOyBuYXNpZCArPSAyKSB7CiAJCWNoYXIgKmtsZ3JhcGhfaGVhZGVyOwpAQCAtNTYzLDggKzU3OSw2IEBACiAJCWNub2RlaWQgPSAtMTsKIAkJa2xncmFwaF9oZWFkZXIgPSBfX3ZhKGlhNjRfc25fZ2V0X2tsY29uZmlnX2FkZHIobmFzaWQpKTsKIAkJaWYgKCFrbGdyYXBoX2hlYWRlcikgewotCQkJaWYgKElTX1JVTk5JTkdfT05fU0lNVUxBVE9SKCkpCi0JCQkJY29udGludWU7CiAJCQlCVUcoKTsJLyogQWxsIG5vZGVzIG11c3QgaGF2ZSBrbGNvbmZpZyB0YWJsZXMhICovCiAJCX0KIAkJY25vZGVpZCA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOwpAQCAtNjMwLDggKzY0NCw4IEBACiBuYXNpZF9zbGljZV90b19jcHVpZChpbnQgbmFzaWQsIGludCBzbGljZSkKIHsKIAlsb25nIGNwdTsKLQkKLQlmb3IgKGNwdT0wOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgCisKKwlmb3IgKGNwdT0wOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKIAkJaWYgKGNwdWlkX3RvX25hc2lkKGNwdSkgPT0gbmFzaWQgJiYKIAkJCQkJY3B1aWRfdG9fc2xpY2UoY3B1KSA9PSBzbGljZSkKIAkJCXJldHVybiBjcHU7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9wdGNfZGVhZGxvY2suUyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3B0Y19kZWFkbG9jay5TCmluZGV4IDc5NDczMTIuLjk2Y2I3MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3B0Y19kZWFkbG9jay5TCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3B0Y19kZWFkbG9jay5TCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vc2h1Yl9tbXIuaD4KIAogI2RlZmluZSBERUFETE9DS0JJVAlTSF9QSU9fV1JJVEVfU1RBVFVTX1dSSVRFX0RFQURMT0NLX1NIRlQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwppbmRleCBhMDg3YjI3Li4yNTRmZTE1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCkBAIC04LDEyICs4LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgpAQCAtMjA0LDggKzIwNCw4IEBACiAJY3hfZGV2LT5kZXYucGFyZW50ID0gTlVMTDsKIAljeF9kZXYtPmRldi5idXMgPSAmdGlvY3hfYnVzX3R5cGU7CiAJY3hfZGV2LT5kZXYucmVsZWFzZSA9IHRpb2N4X2J1c19yZWxlYXNlOwotCXNucHJpbnRmKGN4X2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZC4weCV4IiwKLQkJIGN4X2Rldi0+Y3hfaWQubmFzaWQsIGN4X2Rldi0+Y3hfaWQucGFydF9udW0pOworCXNucHJpbnRmKGN4X2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZCIsCisJCSBjeF9kZXYtPmN4X2lkLm5hc2lkKTsKIAlkZXZpY2VfcmVnaXN0ZXIoJmN4X2Rldi0+ZGV2KTsKIAlnZXRfZGV2aWNlKCZjeF9kZXYtPmRldik7CiAKQEAgLTIzNiw3ICsyMzYsNiBAQAogICovCiBzdGF0aWMgaW50IGN4X2RldmljZV9yZWxvYWQoc3RydWN0IGN4X2RldiAqY3hfZGV2KQogewotCWRldmljZV9yZW1vdmVfZmlsZSgmY3hfZGV2LT5kZXYsICZkZXZfYXR0cl9jeGRldl9jb250cm9sKTsKIAljeF9kZXZpY2VfdW5yZWdpc3RlcihjeF9kZXYpOwogCXJldHVybiBjeF9kZXZpY2VfcmVnaXN0ZXIoY3hfZGV2LT5jeF9pZC5uYXNpZCwgY3hfZGV2LT5jeF9pZC5wYXJ0X251bSwKIAkJCQkgIGN4X2Rldi0+Y3hfaWQubWZnX251bSwgY3hfZGV2LT5odWJkZXYpOwpAQCAtMzgzLDYgKzM4Miw3IEBACiAJc3dpdGNoICh0aW9jeF9idGNoYXJfZ2V0KG5hc2lkKSkgewogCWNhc2UgTDFfQlJJQ0tUWVBFX1NBOgogCWNhc2UgTDFfQlJJQ0tUWVBFX0FUSEVOQToKKwljYXNlIEwxX0JSSUNLVFlQRV9EQVlUT05BOgogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00MDksNyArNDA5LDcgQEAKIAkJdWludDY0X3QgY3hfaWQ7CiAKIAkJY3hfaWQgPQotCQkgICAgKih2b2xhdGlsZSBpbnQzMl90ICopKFRJT19TV0lOX0JBU0UobmFzaWQsIFRJT0NYX0NPUkVMRVQpICsKKwkJICAgICoodm9sYXRpbGUgdWludDY0X3QgKikoVElPX1NXSU5fQkFTRShuYXNpZCwgVElPQ1hfQ09SRUxFVCkgKwogCQkJCQkgIFdJREdFVF9JRCk7CiAJCXBhcnRfbnVtID0gWFdJREdFVF9QQVJUX05VTShjeF9pZCk7CiAJCW1mZ19udW0gPSBYV0lER0VUX01GR19OVU0oY3hfaWQpOwpAQCAtNDU4LDYgKzQ1OCwxMCBAQAogCiAJc3dpdGNoIChuKSB7CiAJY2FzZSAxOgorCQl0aW9fY29yZWxldF9yZXNldChjeF9kZXYtPmN4X2lkLm5hc2lkLCBUSU9DWF9DT1JFTEVUKTsKKwkJdGlvY3hfcmVsb2FkKGN4X2Rldik7CisJCWJyZWFrOworCWNhc2UgMjoKIAkJdGlvY3hfcmVsb2FkKGN4X2Rldik7CiAJCWJyZWFrOwogCWNhc2UgMzoKQEAgLTQ3Nyw2ICs0ODEsOSBAQAogCWNub2RlaWRfdCBjbm9kZWlkOwogCWludCBmb3VuZF90aW9jeF9kZXZpY2UgPSAwOwogCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlidXNfcmVnaXN0ZXIoJnRpb2N4X2J1c190eXBlKTsKIAogCWZvciAoY25vZGVpZCA9IDA7IGNub2RlaWQgPCBNQVhfQ09NUEFDVF9OT0RFUzsgY25vZGVpZCsrKSB7CkBAIC01MzcsNyArNTQ0LDcgQEAKIAlidXNfdW5yZWdpc3RlcigmdGlvY3hfYnVzX3R5cGUpOwogfQogCi1tb2R1bGVfaW5pdCh0aW9jeF9pbml0KTsKK3N1YnN5c19pbml0Y2FsbCh0aW9jeF9pbml0KTsKIG1vZHVsZV9leGl0KHRpb2N4X2V4aXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKaW5kZXggNmQwMmRhYy4uOTQ2OThiZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYwpAQCAtNzIsNyArNzIsNyBAQAogZW51bSB4cGNfcmV0dmFsCiB4cGNfc2V0dXBfaW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBjcHVpZDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7CiAJcGFydGlkX3QgcGFydGlkID0gWFBDX1BBUlRJRChwYXJ0KTsKIApAQCAtMjIzLDkgKzIyMyw5IEBACiAJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLm9wZW5jbG9zZV9hcmdzX3BhID0KIAkJCQkJX19wYShwYXJ0LT5sb2NhbF9vcGVuY2xvc2VfYXJncyk7CiAJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLklQSV9hbW9fcGEgPSBfX3BhKHBhcnQtPmxvY2FsX0lQSV9hbW9fdmEpOwotCXhwY192YXJzX3BhcnRbcGFydGlkXS5JUElfbmFzaWQgPSBjcHVpZF90b19uYXNpZChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXhwY192YXJzX3BhcnRbcGFydGlkXS5JUElfcGh5c19jcHVpZCA9Ci0JCQkJCWNwdV9waHlzaWNhbF9pZChzbXBfcHJvY2Vzc29yX2lkKCkpOworCWNwdWlkID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsJLyogYW55IENQVSBpbiB0aGlzIHBhcnRpdGlvbiB3aWxsIGRvICovCisJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLklQSV9uYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdWlkKTsKKwl4cGNfdmFyc19wYXJ0W3BhcnRpZF0uSVBJX3BoeXNfY3B1aWQgPSBjcHVfcGh5c2ljYWxfaWQoY3B1aWQpOwogCXhwY192YXJzX3BhcnRbcGFydGlkXS5uY2hhbm5lbHMgPSBwYXJ0LT5uY2hhbm5lbHM7CiAJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLm1hZ2ljID0gWFBDX1ZQX01BR0lDMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCmluZGV4IDE3N2RkYjcuLmQ1ODBhZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zMDgsOCArMzA5LDcgQEAKIAkJCSJwYXJ0aXRpb24gJWRcbiIsIFhQQ19QQVJUSUQocGFydCkpOwogCiAJCS8qIHdhaXQgYSAxLzQgb2YgYSBzZWNvbmQgb3Igc28gKi8KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJKHZvaWQpIHNjaGVkdWxlX3RpbWVvdXQoMC4yNSAqIEhaKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjUwKTsKIAogCQlpZiAocGFydC0+YWN0X3N0YXRlID09IFhQQ19QX0RFQUNUSVZBVElORykgewogCQkJcmV0dXJuIHBhcnQtPnJlYXNvbjsKQEAgLTg0MSw5ICs4NDEsNyBAQAogCWRvd24oJnhwY19kaXNjb3ZlcnlfZXhpdGVkKTsKIAogCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzY2hlZHVsZV90aW1lb3V0KDAuMyAqIEhaKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDMwMCk7CiAKIAogCS8qIHdhaXQgZm9yIGFsbCBwYXJ0aXRpb25zIHRvIGJlY29tZSBpbmFjdGl2ZSAqLwpAQCAtODYwLDEyICs4NTgsOCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKGFjdGl2ZV9wYXJ0X2NvdW50KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCgwLjMgKiBIWik7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQl9Ci0KKwkJaWYgKGFjdGl2ZV9wYXJ0X2NvdW50KQorCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMzAwKTsKIAl9IHdoaWxlIChhY3RpdmVfcGFydF9jb3VudCA+IDApOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKaW5kZXggNWRhOWJkYi4uMGU0YjlhZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKQEAgLTExLDkgKzExLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAKICNkZWZpbmUgU0dfRU5UX1ZJUlRfQUREUkVTUyhzZykJKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldCkKICNkZWZpbmUgU0dfRU5UX1BIWVNfQUREUkVTUyhTRykJdmlydF90b19waHlzKFNHX0VOVF9WSVJUX0FERFJFU1MoU0cpKQpAQCAtNzgsNiArNzksNyBAQAogewogCXZvaWQgKmNwdWFkZHI7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJaW50IG5vZGU7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciAqcHJvdmlkZXIgPSBTTl9QQ0lERVZfQlVTUFJPVklERVIocGRldik7CiAKQEAgLTg1LDEwICs4NywxOSBAQAogCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgbWVtb3J5LgotCSAqIEZJWE1FOiBXZSBzaG91bGQgYmUgZG9pbmcgYWxsb2NfcGFnZXNfbm9kZSBmb3IgdGhlIG5vZGUgY2xvc2VzdAotCSAqICAgICAgICB0byB0aGUgUENJIGRldmljZS4KIAkgKi8KLQlpZiAoIShjcHVhZGRyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIGdldF9vcmRlcihzaXplKSkpKQorCW5vZGUgPSBwY2lidXNfdG9fbm9kZShwZGV2LT5idXMpOworCWlmIChsaWtlbHkobm9kZSA+PTApKSB7CisJCXN0cnVjdCBwYWdlICpwID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfQVRPTUlDLCBnZXRfb3JkZXIoc2l6ZSkpOworCisJCWlmIChsaWtlbHkocCkpCisJCQljcHVhZGRyID0gcGFnZV9hZGRyZXNzKHApOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJY3B1YWRkciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBnZXRfb3JkZXIoc2l6ZSkpOworCisJaWYgKHVubGlrZWx5KCFjcHVhZGRyKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAltZW1zZXQoY3B1YWRkciwgMHgwLCBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfYXRlLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jCmluZGV4IDBlNDdiY2U4Li5kMTY0N2I4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfYXRlLmMKQEAgLTgsOSArOCw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCiAKIGludCBwY2licl9pbnZhbGlkYXRlX2F0ZSA9IDA7CS8qIGJ5IGRlZmF1bHQgZG9uJ3QgaW52YWxpZGF0ZSBBVEUgb24gZnJlZSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwppbmRleCA2NGFmMmIyLi5iMDU4ZGMyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKQEAgLTgsMTggKzgsMTcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgogI2luY2x1ZGUgPGFzbS9zbi9nZW8uaD4KLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCi0jaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgotI2luY2x1ZGUgInBjaS90aW9jcC5oIgotI2luY2x1ZGUgInBjaS9waWMuaCIKLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJwY2kvdGlvY3AuaCIKKyNpbmNsdWRlIDxhc20vc24vcGljLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi90aW9jcC5oPgogI2luY2x1ZGUgInRpby5oIgotI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKKyNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKIAogZXh0ZXJuIGludCBzbl9pb2lmX2luaXRlZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IDM4OTM5OTkuLmI5NWU5MjggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKQEAgLTYsMTggKzYsNTEgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgotI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgorI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogCitpbnQKK3NhbF9wY2licl9zbG90X2VuYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsIHZvaWQgKnJlc3ApCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CisJdWludDY0X3QgYnVzbnVtOworCisJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CisJcmV0X3N0dWZmLnYwID0gMDsKKworCWJ1c251bSA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW07CisJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgKHU2NCkgU05fU0FMX0lPSUZfU0xPVF9FTkFCTEUsICh1NjQpIGJ1c251bSwKKwkJCSh1NjQpIGRldmljZSwgKHU2NCkgcmVzcCwgMCwgMCwgMCwgMCk7CisKKwlyZXR1cm4gKGludClyZXRfc3R1ZmYudjA7Cit9CisKK2ludAorc2FsX3BjaWJyX3Nsb3RfZGlzYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsIGludCBhY3Rpb24sCisJCSAgICAgICB2b2lkICpyZXNwKQoreworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOworCXVpbnQ2NF90IGJ1c251bTsKKworCXJldF9zdHVmZi5zdGF0dXMgPSAwOworCXJldF9zdHVmZi52MCA9IDA7CisKKwlidXNudW0gPSBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtOworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsICh1NjQpIFNOX1NBTF9JT0lGX1NMT1RfRElTQUJMRSwKKwkJCSh1NjQpIGJ1c251bSwgKHU2NCkgZGV2aWNlLCAodTY0KSBhY3Rpb24sCisJCQkodTY0KSByZXNwLCAwLCAwLCAwKTsKKworCXJldHVybiAoaW50KXJldF9zdHVmZi52MDsKK30KIAogc3RhdGljIGludCBzYWxfcGNpYnJfZXJyb3JfaW50ZXJydXB0KHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCkKIHsKQEAgLTUyLDcgKzg1LDcgQEAKIH0KIAogdm9pZCAqCi1wY2licl9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnQpCitwY2licl9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnQsIHN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcikKIHsKIAlpbnQgbmFzaWQsIGNub2RlLCBqOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CkBAIC0xMjUsNiArMTU4LDE0IEBACiAJbWVtc2V0KHNvZnQtPnBiaV9pbnRfYXRlX3Jlc291cmNlLmF0ZSwgMCwKICAJICAgICAgIChzb2Z0LT5wYmlfaW50X2F0ZV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSkpOwogCisJaWYgKHByb21fYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DUCkKKwkJLyoKKwkJICogVElPIFBDSSBCcmlkZ2Ugd2l0aCBubyBjbG9zZXN0IG5vZGUgaW5mb3JtYXRpb24uCisJCSAqIEZJWE1FOiBGaW5kIGFub3RoZXIgd2F5IHRvIGRldGVybWluZSB0aGUgY2xvc2VzdCBub2RlCisJCSAqLworCQljb250cm9sbGVyLT5ub2RlID0gLTE7CisJZWxzZQorCQljb250cm9sbGVyLT5ub2RlID0gY25vZGU7CiAJcmV0dXJuIHNvZnQ7CiB9CiAKQEAgLTE4OCwzICsyMjksNiBAQAogCiAJcmV0dXJuIDA7CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNhbF9wY2licl9zbG90X2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzYWxfcGNpYnJfc2xvdF9kaXNhYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcmVnLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jCmluZGV4IDg2NWMxMWMuLjIxNDI2ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcmVnLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9yZWcuYwpAQCAtNiwxMyArNiwxMyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvdGlvY3AuaCIKLSNpbmNsdWRlICJwY2kvcGljLmgiCi0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSA8YXNtL3NuL3BpYy5oPgorI2luY2x1ZGUgPGFzbS9zbi90aW9jcC5oPgogCiB1bmlvbiBicl9wdHIgewogCXN0cnVjdCB0aW9jcCB0aW87CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKaW5kZXggOGRhZTllYi4uNWQ3NmE3NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJaWYgKCFjdF9hZGRyKQogCQlyZXR1cm4gMDsKIAotCWJ1c19hZGRyID0gKGRtYV9hZGRyX3QpIChjdF9hZGRyICYgMHhmZmZmZmZmZmZmZmYpOworCWJ1c19hZGRyID0gKGRtYV9hZGRyX3QpIChjdF9hZGRyICYgMHhmZmZmZmZmZmZmZmZVTCk7CiAJbm9kZV91cHBlciA9IGN0X2FkZHIgPj4gNDg7CiAKIAlpZiAobm9kZV91cHBlciA+IDY0KSB7CkBAIC00NjQsNyArNDY0LDcgQEAKICAqIEZvciBtYXBwaW5ncyBjcmVhdGVkIHVzaW5nIHRoZSBkaXJlY3QgbW9kZXMgKDY0IG9yIDQ4KSB0aGVyZSBhcmUgbm8KICAqIHJlc291cmNlcyB0byByZWxlYXNlLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogdGlvY2FfZG1hX3VubWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBpbnQgZGlyKQogewogCWludCBpLCBlbnRyeTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogICogVGhlIG1hcHBpbmcgbW9kZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSBkZXZpY2VzIGRtYV9tYXNrLiAgQXMgYSBsYXN0IHJlc29ydAogICogdXNlIHRoZSBHQVJUIG1hcHBlZCBtb2RlLgogICovCi11aW50NjRfdAorc3RhdGljIHVpbnQ2NF90CiB0aW9jYV9kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50NjRfdCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCiB7CiAJdWludDY0X3QgbWFwYWRkcjsKQEAgLTU4MCw4ICs1ODAsOCBAQAogICogT24gc3VjY2Vzc2Z1bCBzZXR1cCwgcmV0dXJucyB0aGUga2VybmVsIHZlcnNpb24gb2YgdGlvY2FfY29tbW9uIGJhY2sgdG8KICAqIHRoZSBjYWxsZXIuCiAgKi8KLXZvaWQgKgotdGlvY2FfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0KQorc3RhdGljIHZvaWQgKgordGlvY2FfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCiB7CiAJc3RydWN0IHRpb2NhX2NvbW1vbiAqdGlvY2FfY29tbW9uOwogCXN0cnVjdCB0aW9jYV9rZXJuZWwgKnRpb2NhX2tlcm47CkBAIC01ODksOCArNTg5LDcgQEAKIAogCS8qIHNhbml0eSBjaGVjayBwcm9tIHJldiAqLwogCi0JaWYgKHNuX3NhbF9yZXZfbWFqb3IoKSA8IDQgfHwKLQkgICAgKHNuX3NhbF9yZXZfbWFqb3IoKSA9PSA0ICYmIHNuX3NhbF9yZXZfbWlub3IoKSA8IDYpKSB7CisJaWYgKHNuX3NhbF9yZXYoKSA8IDB4MDQwNikgewogCQlwcmludGsKIAkJICAgIChLRVJOX0VSUiAiJXM6ICBTR0kgcHJvbSByZXYgNC4wNiBvciBncmVhdGVyIHJlcXVpcmVkICIKIAkJICAgICAiZm9yIHRpb2NhIHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC02NDcsNiArNjQ2LDggQEAKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgU0dJX1RJT0NBX0VSUk9SLAogCQkgICAgICAgKGludCl0aW9jYV9jb21tb24tPmNhX2NvbW1vbi5ic19wZXJzaXN0X2J1c251bSk7CiAKKwkvKiBTZXR1cCBsb2NhbGl0eSBpbmZvcm1hdGlvbiAqLworCWNvbnRyb2xsZXItPm5vZGUgPSB0aW9jYV9rZXJuLT5jYV9jbG9zZXN0X25vZGU7CiAJcmV0dXJuIHRpb2NhX2NvbW1vbjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL0tjb25maWcgYi9hcmNoL20zMnIvS2NvbmZpZwppbmRleCA0MmNhOGEzLi43NzcyOTUxIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvS2NvbmZpZworKysgYi9hcmNoL20zMnIvS2NvbmZpZwpAQCAtMzU5LDYgKzM1OSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbTMyNzAwdXQuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbTMyNzAwdXQuYwppbmRleCBiMDE0ZTJjLi5hMTQ2YjI0IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX20zMjcwMHV0LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tMzI3MDB1dC5jCkBAIC0zLDggKzMsOCBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBNMzI3MDBVVCBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDIgCUhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBUYWtlbyBUYWthaGFzaGkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgVGFrZW8gVGFrYWhhc2hpCiAgKgogICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKICAqICBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCWljdV9kYXRhW00zMlJfSVJRX0lOVDJdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDAxOwogCWVuYWJsZV9tMzI3MDB1dF9pcnEoTTMyUl9JUlFfSU5UMik7CiAKLS8vI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX00zMlJfQVIpCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTTMyUl9BUikKIAkvKgogCSAqIElOVDMjIGlzIHVzZWQgZm9yIEFSCiAJICovCkBAIC00NDUsOSArNDQ1LDExIEBACiAJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UM10uZGVwdGggPSAxOwogCWljdV9kYXRhW00zMlJfSVJRX0lOVDNdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDEwOwogCWRpc2FibGVfbTMyNzAwdXRfaXJxKE0zMlJfSVJRX0lOVDMpOwotLy8jZW5kaWYJLyogQ09ORklHX1ZJREVPX00zMlJfQVIgKi8KKyNlbmRpZgkvKiBDT05GSUdfVklERU9fTTMyUl9BUiAqLwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKQorCiAjZGVmaW5lIExBTl9JT1NUQVJUICAgICAweDMwMAogI2RlZmluZSBMQU5fSU9FTkQgICAgICAgMHgzMjAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewpAQCAtNDY5LDEwICs0NzEsNTUgQEAKIAkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSAgICAgICA9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MTA2MDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MTA3M0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxMDQwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDQwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczFkMTN4eHhmYl9kZXZpY2UpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jCmluZGV4IGFhZjhlNTYuLjRlNzA5ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMKQEAgLTMsMTQgKzMsMTUgQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIFJlbmVzYXMgTUFQUEkgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bworICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbTMyci5oPgpAQCAtMTU4LDMgKzE1OSw0OSBAQAogCWRpc2FibGVfbWFwcGlfaXJxKE0zMlJfSVJRX0lOVDIpOwogI2VuZGlmIC8qIENPTkZJR19NMzJSUENDICovCiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MTAyMDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MTAzM0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxMDAwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDAwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMi5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTIuYwppbmRleCAzOGQ1ZTlhLi5hMWQ4MDE1IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMi5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkyLmMKQEAgLTMsOCArMyw4IEBACiAgKgogICogIFNldHVwIHJvdXRpbmVzIGZvciBSZW5lc2FzIE1BUFBJLUlJKE0zQS1aQTM2KSBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTMuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkzLmMKaW5kZXggM2Q2MGE4NS4uYTc2NDEyZSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTMuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMy5jCkBAIC0zLDggKzMsOCBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBNQVBQSS1JSUkoTTNBLTIxNzApIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0xNzgsNiArMTc4LDggQEAKICNlbmRpZiAvKiBDT05GSUdfTTMyUl9DRkMgKi8KIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKKwogI2RlZmluZSBMQU5fSU9TVEFSVCAgICAgMHgzMDAKICNkZWZpbmUgTEFOX0lPRU5EICAgICAgIDB4MzIwCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTIwMCw5ICsyMDIsNTUgQEAKIAkucmVzb3VyY2UgICAgICAgPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MWQ2MDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MWQ3M0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxZDQwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxZDQwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczFkMTN4eHhmYl9kZXZpY2UpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vYWtzMzJyLmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYwppbmRleCBkNjU2NjQwLi40NWFkZDViIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYwpAQCAtMyw4ICszLDggQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIE9BS1MzMlIgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTEzOSw1ICsxMzksNCBAQAogCWljdV9kYXRhW00zMlJfSVJRX1NJTzFfU10uaWN1Y3IgPSAwOwogCWRpc2FibGVfb2FrczMycl9pcnEoTTMyUl9JUlFfU0lPMV9TKTsKICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX00zMlJfU0lPICovCi0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29wc3B1dC5jCmluZGV4IDg2ZjRjZjIuLmYwMzAxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vcHNwdXQuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIFJlbmVzYXMgT1BTUFVUIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA0CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUKICAqIAlIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAogICogICAgICBIaXRvc2hpIFlhbWFtb3RvLCBUYWtlbyBUYWthaGFzaGksIE1hbW9ydSBTYWt1Z2F3YQogICoKQEAgLTQzOSw3ICs0MzksNyBAQAogCWljdV9kYXRhW00zMlJfSVJRX0lOVDJdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDAxOwogCWVuYWJsZV9vcHNwdXRfaXJxKE0zMlJfSVJRX0lOVDIpOwogCi0vLyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19NMzJSX0FSKQorI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX00zMlJfQVIpCiAJLyoKIAkgKiBJTlQzIyBpcyB1c2VkIGZvciBBUgogCSAqLwpAQCAtNDQ5LDkgKzQ0OSwxMSBAQAogCWlycV9kZXNjW00zMlJfSVJRX0lOVDNdLmRlcHRoID0gMTsKIAlpY3VfZGF0YVtNMzJSX0lSUV9JTlQzXS5pY3VjciA9IE0zMlJfSUNVQ1JfSUVOfE0zMlJfSUNVQ1JfSVNNT0QxMDsKIAlkaXNhYmxlX29wc3B1dF9pcnEoTTMyUl9JUlFfSU5UMyk7Ci0vLyNlbmRpZgkvKiBDT05GSUdfVklERU9fTTMyUl9BUiAqLworI2VuZGlmIC8qIENPTkZJR19WSURFT19NMzJSX0FSICovCiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCisKICNkZWZpbmUgTEFOX0lPU1RBUlQgICAgIDB4MzAwCiAjZGVmaW5lIExBTl9JT0VORCAgICAgICAweDMyMAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CkBAIC00NzMsMTAgKzQ3NSw1NSBAQAogCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlICAgICAgID0gc21jOTF4X3Jlc291cmNlcywKIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgorI2luY2x1ZGUgPGFzbS9zMWQxMzgwNi5oPgorCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgczFkMTN4eHhmYl9kYXRhID0geworCS5pbml0cmVncwkJPSBzMWQxM3h4eGZiX2luaXRyZWdzLAorCS5pbml0cmVnc3NpemUJCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX2luaXRyZWdzKSwKKwkucGxhdGZvcm1faW5pdF92aWRlbwk9IE5VTEwsCisjaWZkZWYgQ09ORklHX1BNCisJLnBsYXRmb3JtX3N1c3BlbmRfdmlkZW8JPSBOVUxMLAorCS5wbGF0Zm9ybV9yZXN1bWVfdmlkZW8JPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgxMDYwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDczRkZGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAweDEwNDAwMDAwVUwsCisJCS5lbmQgICAgPSAweDEwNDAwMUZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzMWQxM3h4eGZiX2RldmljZSA9IHsKKwkubmFtZQkJPSBTMURfREVWSUNFTkFNRSwKKwkuaWQJCT0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzMWQxM3h4eGZiX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzMWQxM3h4eGZiX3Jlc291cmNlcywKK307CisjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1faW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFgpCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwocGxhdGZvcm1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDY5MWEyNDYuLjE3OGM0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC00NTAsNiArNDUwLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogbWVudSAiQ2hhcmFjdGVyIGRldmljZXMiCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9LY29uZmlnIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwppbmRleCBkYmZjZGM4Li4xMTdmMTgzIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9LY29uZmlnCisrKyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKQEAgLTU3NSw2ICs1NzUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IGJkOWRlN2IuLmI1NzgyMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xNjQwLDYgKzE2NDAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYwppbmRleCA1MDgwMjZhLi42NWVlMTUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm4gMTsKIAotCWlmICh0cnlfdG9fZnJlZXplKDApKQorCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCWdvdG8gbm9fc2lnbmFsOwogCiAJaWYgKCFvbGRzZXQpCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9LY29uZmlnIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwppbmRleCBjZTMyN2M3Li4xYzJkODc0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9LY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL0tjb25maWcKQEAgLTE5MCw2ICsxOTAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9jb25maWdzLzcxMl9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzLzcxMl9kZWZjb25maWcKaW5kZXggODcyMDg1ZC4uNmVmYWE5MiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy83MTJfZGVmY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvNzEyX2RlZmNvbmZpZwpAQCAtNTA2LDcgKzUwNiw3IEBACiAjCiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTgKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xNwogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9hNTAwX2RlZmNvbmZpZyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYTUwMF9kZWZjb25maWcKaW5kZXggZDI4ZWJmYS4uMzBmYzAzZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy9hNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2E1MDBfZGVmY29uZmlnCkBAIC02NjIsNyArNjYyLDcgQEAKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ1M9bQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTgKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xNwogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9iMTgwX2RlZmNvbmZpZyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYjE4MF9kZWZjb25maWcKaW5kZXggMTcwMGQ3YS4uNDZjOTUxMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy9iMTgwX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2IxODBfZGVmY29uZmlnCkBAIC01MTQsNyArNTE0LDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTEzCiBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQogQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQogQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzMwMDBfZGVmY29uZmlnCmluZGV4IGIyNzk4MDEuLjY3YWNhNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzMwMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzMwMDBfZGVmY29uZmlnCkBAIC02NjEsNyArNjYxLDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTEzCiBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQogQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQogQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9kZWZjb25maWcKaW5kZXggZWJkNjMwMS4uZmRhZTIxYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9kZWZjb25maWcKQEAgLTUxNyw3ICs1MTcsNyBAQAogIwogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MTMKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMgYi9hcmNoL3BwYy84eHhfaW8vZW5ldC5jCmluZGV4IDRlYTcxNTguLmVjZTZhOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMKKysrIGIvYXJjaC9wcGMvOHh4X2lvL2VuZXQuYwpAQCAtNzE0LDE3ICs3MTQsMjUgQEAKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+UENfRU5FVF9MQks7CS8qIERpc2FibGUgTG9vcGJhY2sgKi8KICNlbmRpZgkvKiBQQ19FTkVUX0xCSyAqLwogCisjaWZkZWYgUEVfRU5FVF9UQ0xLCisJLyogQ29uZmlndXJlIHBvcnQgRSBmb3IgVENMSyBhbmQgUkNMSy4KKwkqLworCWNwLT5jcF9wZXBhciB8PSAgKFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CisJY3AtPmNwX3BlZGlyICY9IH4oUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLKTsKKwljcC0+Y3BfcGVzbyAgJj0gfihQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOworI2Vsc2UKKwkvKiBDb25maWd1cmUgcG9ydCBBIGZvciBUQ0xLIGFuZCBSQ0xLLgorCSovCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gIChQQV9FTkVUX1RDTEsgfCBQQV9FTkVUX1JDTEspOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4oUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKKyNlbmRpZgorCiAJLyogQ29uZmlndXJlIHBvcnQgQyBwaW5zIHRvIGVuYWJsZSBDTFNOIGFuZCBSRU5BLgogCSovCiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfihQQ19FTkVUX0NMU04gfCBQQ19FTkVUX1JFTkEpOwogCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGlyICY9IH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3NvICB8PSAgKFBDX0VORVRfQ0xTTiB8IFBDX0VORVRfUkVOQSk7CiAKLQkvKiBDb25maWd1cmUgcG9ydCBBIGZvciBUQ0xLIGFuZCBSQ0xLLgotCSovCi0JaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gIChQQV9FTkVUX1RDTEsgfCBQQV9FTkVUX1JDTEspOwotCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4oUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKLQogCS8qIENvbmZpZ3VyZSBTZXJpYWwgSW50ZXJmYWNlIGNsb2NrIHJvdXRpbmcuCiAJICogRmlyc3QsIGNsZWFyIGFsbCBTQ0MgYml0cyB0byB6ZXJvLCB0aGVuIHNldCB0aGUgb25lcyB3ZSB3YW50LgogCSAqLwpAQCAtODk2LDE0ICs5MDQsMTggQEAKIAkvKiBJdCBpcyBub3cgT0sgdG8gZW5hYmxlIHRoZSBFdGhlcm5ldCB0cmFuc21pdHRlci4KIAkgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYm9hcmQgaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMgaGVyZS4KIAkgKi8KLSNpZiAgICghZGVmaW5lZCAoUEJfRU5FVF9URU5BKSAmJiAgZGVmaW5lZCAoUENfRU5FVF9URU5BKSkKKyNpZiAgICghZGVmaW5lZCAoUEJfRU5FVF9URU5BKSAmJiAgZGVmaW5lZCAoUENfRU5FVF9URU5BKSAmJiAhZGVmaW5lZCAoUEVfRU5FVF9URU5BKSkKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciB8PSAgUENfRU5FVF9URU5BOwogCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGlyICY9IH5QQ19FTkVUX1RFTkE7Ci0jZWxpZiAoIGRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBDX0VORVRfVEVOQSkpCisjZWxpZiAoIGRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBDX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBFX0VORVRfVEVOQSkpCiAJY3AtPmNwX3BicGFyIHw9IFBCX0VORVRfVEVOQTsKIAljcC0+Y3BfcGJkaXIgfD0gUEJfRU5FVF9URU5BOworI2VsaWYgKCAhZGVmaW5lZCAoUEJfRU5FVF9URU5BKSAmJiAhZGVmaW5lZCAoUENfRU5FVF9URU5BKSAmJiBkZWZpbmVkIChQRV9FTkVUX1RFTkEpKQorCWNwLT5jcF9wZXBhciB8PSAgUEVfRU5FVF9URU5BOworCWNwLT5jcF9wZWRpciAmPSB+UEVfRU5FVF9URU5BOworCWNwLT5jcF9wZXNvICB8PSAgUEVfRU5FVF9URU5BOwogI2Vsc2UKLSNlcnJvciBDb25maWd1cmF0aW9uIEVycm9yOiBkZWZpbmUgZXhhY3RseSBPTkUgb2YgUEJfRU5FVF9URU5BLCBQQ19FTkVUX1RFTkEKKyNlcnJvciBDb25maWd1cmF0aW9uIEVycm9yOiBkZWZpbmUgZXhhY3RseSBPTkUgb2YgUEJfRU5FVF9URU5BLCBQQ19FTkVUX1RFTkEsIFBFX0VORVRfVEVOQQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19SUFhMSVRFKSB8fCBkZWZpbmVkKENPTkZJR19SUFhDTEFTU0lDKQpAQCAtOTM2LDYgKzk0OCwyOSBAQAogCSooKHZvbGF0aWxlIHVpbnQgKilCQ1NSMSkgJj0gfkJDU1IxX0VUSEVOOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisKKwkvKiBEZWFzc2VydCBQSFkgcmVzZXQgYW5kIGVuYWJsZSB0aGUgUEhZLgorCSAqLworCXsKKwkJdm9sYXRpbGUgdWludCBfX2lvbWVtICpiY3NyID0gaW9yZW1hcChCQ1NSX0FERFIsIEJDU1JfU0laRSk7CisJCXVpbnQgdG1wOworCisJCXRtcCA9IGluX2JlMzIoYmNzciArIDEgLyogQkNTUjEgKi8pOworCQl0bXAgfD0gQkNTUjFfRVRIRU47CisJCW91dF9iZTMyKGJjc3IgKyAxLCB0bXApOworCQl0bXAgPSBpbl9iZTMyKGJjc3IgKyA0IC8qIEJDU1I0ICovKTsKKwkJdG1wIHw9IEJDU1I0X0VUSDEwX1JTVDsKKwkJb3V0X2JlMzIoYmNzciArIDQsIHRtcCk7CisJCWlvdW5tYXAoYmNzcik7CisJfQorCisJLyogT24gTVBDODg1QURTIFNDQyBldGhlcm5ldCBQSFkgZGVmYXVsdHMgdG8gdGhlIGZ1bGwgZHVwbGV4IG1vZGUKKwkgKiB1cG9uIHJlc2V0LiBTQ0MgaXMgc2V0IHRvIGhhbGYgZHVwbGV4IGJ5IGRlZmF1bHQuIFNvIHRoaXMKKwkgKiBpbmNvbnNpc3RlbmN5IHNob3VsZCBiZSBiZXR0ZXIgZml4ZWQgYnkgdGhlIHNvZnR3YXJlLgorCSAqLworI2VuZGlmCisKIAlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWVwOwogI2lmIDAKIAlkZXYtPm5hbWUgPSAiQ1BNX0VORVQiOwpAQCAtOTY5LDMgKzEwMDQsNCBAQAogfQogCiBtb2R1bGVfaW5pdChzY2NfZW5ldF9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvS2NvbmZpZyBiL2FyY2gvcHBjL0tjb25maWcKaW5kZXggYTc4MzVjZC4uYjgzM2NiYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvS2NvbmZpZworKysgYi9hcmNoL3BwYy9LY29uZmlnCkBAIC0yODQsNiArMjg0LDkgQEAKIAogbWVudSAiUGxhdGZvcm0gb3B0aW9ucyIKIAorY29uZmlnIEZBRFMKKwlib29sCisKIGNob2ljZQogCXByb21wdCAiOHh4IE1hY2hpbmUgVHlwZSIKIAlkZXBlbmRzIG9uIDh4eApAQCAtMzk5LDggKzQwMiwyNSBAQAogCSAgMjZNQiBEUkFNLCA0TUIgZmxhc2gsIEV0aGVybmV0LCBhIDE2Sy1nYXRlIEZQR0EsIFVTQiwgYW4gTENEL3ZpZGVvCiAJICBjb250cm9sbGVyLCBhbmQgdHdvIFJTMjMyIHBvcnRzLgogCi1jb25maWcgRkFEUworY29uZmlnIE1QQzhYWEZBRFMKIAlib29sICJGQURTIgorCXNlbGVjdCBGQURTCisKK2NvbmZpZyBNUEM4NlhBRFMKKwlib29sICJNUEM4NlhBRFMiCisJaGVscAorCSAgTVBDODZ4IEFwcGxpY2F0aW9uIERldmVsb3BtZW50IFN5c3RlbSBieSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKwkgIFRoZSBNUEM4NnhBRFMgaXMgbWVhbnQgdG8gc2VydmUgYXMgYSBwbGF0Zm9ybSBmb3Igcy93IGFuZCBoL3cKKwkgIGRldmVsb3BtZW50IGFyb3VuZCB0aGUgTVBDODZYIHByb2Nlc3NvciBmYW1pbGllcy4KKwlzZWxlY3QgRkFEUworCitjb25maWcgTVBDODg1QURTCisJYm9vbCAiTVBDODg1QURTIgorCWhlbHAKKwkgIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIE1QQzg4NSBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBTeXN0ZW0gKEFEUykuCisJICBBbHNvIGtub3duIGFzIERVRVQuCisJICBUaGUgTVBDODg1QURTIGlzIG1lYW50IHRvIHNlcnZlIGFzIGEgcGxhdGZvcm0gZm9yIHMvdyBhbmQgaC93CisJICBkZXZlbG9wbWVudCBhcm91bmQgdGhlIE1QQzg4NSBwcm9jZXNzb3IgZmFtaWx5LgogCiBjb25maWcgVFFNODIzTAogCWJvb2wgIlRRTTgyM0wiCkBAIC0xMzM1LDYgKzEzNTUsOCBAQAogCWRlcGVuZHMgb24gQURWQU5DRURfT1BUSU9OUyAmJiA4eHgKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzL01ha2VmaWxlIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKaW5kZXggYzlhYzVmNS4uNTMyZTdlZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKQEAgLTYsMTIgKzYsMTcgQEAKIAogZXh0cmEteQkJOj0gdm1saW51eC5iaW4gdm1saW51eC5negogCisjIHR3byBtYWtlIHByb2Nlc3NlcyBtYXkgd3JpdGUgdG8gdm1saW51eC5neiBhdCB0aGUgc2FtZSB0aW1lIHdpdGggbWFrZSAtagorcXVpZXRfY21kX215Z3ppcCA9IEdaSVAgICAgJEAKK2NtZF9teWd6aXAgPSBnemlwIC1mIC05IDwgJDwgPiAkQC4kJCQkICYmIG12ICRALiQkJCQgJEAKKworCiBPQkpDT1BZRkxBR1Nfdm1saW51eC5iaW4gOj0gLU8gYmluYXJ5CiAkKG9iaikvdm1saW51eC5iaW46IHZtbGludXggRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQogCiAkKG9iaikvdm1saW51eC5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKKwkkKGNhbGwgaWZfY2hhbmdlZCxteWd6aXApCiAKIHF1aWV0X2NtZF91aW1hZ2UgPSBVSU1BR0UgICRACiAgICAgICBjbWRfdWltYWdlID0gJChDT05GSUdfU0hFTEwpICQoTUtJTUFHRSkgLUEgcHBjIC1PIGxpbnV4IC1UIGtlcm5lbCBcCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL21wYzg2eF9hZHNfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9tcGM4NnhfYWRzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNjNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvY29uZmlncy9tcGM4NnhfYWRzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDYzMyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjNAorIyBUdWUgSnVuIDE0IDEzOjM2OjM1IDIwMDUKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CitDT05GSUdfUFBDPXkKK0NPTkZJR19QUEMzMj15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfQ0xFQU5fQ09NUElMRSBpcyBub3Qgc2V0CitDT05GSUdfQlJPS0VOPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CisjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKK0NPTkZJR19USU5ZX1NITUVNPXkKK0NPTkZJR19CQVNFX1NNQUxMPTEKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yCisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKK0NPTkZJR184eHg9eQorIyBDT05GSUdfRTUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERURCT09UPXkKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEU9eQorCisjCisjIFBsYXRmb3JtIG9wdGlvbnMKKyMKK0NPTkZJR19GQURTPXkKKyMgQ09ORklHX1JQWExJVEUgaXMgbm90IHNldAorIyBDT05GSUdfUlBYQ0xBU1NJQyBpcyBub3Qgc2V0CisjIENPTkZJR19CU0VJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4WFhGQURTIGlzIG5vdCBzZXQKK0NPTkZJR19NUEM4NlhBRFM9eQorIyBDT05GSUdfVFFNODIzTCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTBMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg1NUwgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODYwTCBpcyBub3Qgc2V0CisjIENPTkZJR19GUFM4NTBMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRDgyM1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lWTVM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lWTUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTTg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19IRVJNRVNfUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDVV9FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5URUMgaXMgbm90IHNldAorIyBDT05GSUdfTUJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkNFUFQgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9RU1BBTiBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19DT05TSVNURU5UX1NUQVJUPTB4ZmYxMDAwMDAKK0NPTkZJR19DT05TSVNURU5UX1NJWkU9MHgwMDIwMDAwMAorQ09ORklHX0JPT1RfTE9BRD0weDAwNDAwMDAwCisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX0lQVjY9bQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19PQUtORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ1BNPXkKK0NPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0M0IGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ1BNX1NNQzE9eQorIyBDT05GSUdfU0VSSUFMX0NQTV9TTUMyIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIE1QQzh4eCBDUE0gT3B0aW9ucworIworQ09ORklHX1NDQ19FTkVUPXkKK0NPTkZJR19TQ0MxX0VORVQ9eQorIyBDT05GSUdfU0NDMl9FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDQzNfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUNfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkVUX0JJR19CVUZGRVJTIGlzIG5vdCBzZXQKKworIworIyBHZW5lcmljIE1QQzh4eCBPcHRpb25zCisjCisjIENPTkZJR184eHhfQ09QWUJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfOHh4X0NQVTYgaXMgbm90IHNldAorQ09ORklHX05PX1VDT0RFX1BBVENIPXkKKyMgQ09ORklHX1VTQl9TT0ZfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9VQ09ERV9QQVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1BJX1NNQzFfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODg1YWRzX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODg1YWRzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZmOTRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvY29uZmlncy9tcGM4ODVhZHNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNjIyIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmM2CisjIFRodSBKdW4gIDkgMjE6MTc6MjkgMjAwNQorIworQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19IQVZFX0RFQ19MT0NLPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CisjIENPTkZJR19DTEVBTl9DT01QSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19CUk9LRU49eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvcgorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSNCBpcyBub3Qgc2V0CitDT05GSUdfOHh4PXkKKyMgQ09ORklHX0U1MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEQk9PVD15CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCisjIENPTkZJR19SUFhMSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQWENMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfQlNFSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkFEUyBpcyBub3Qgc2V0CitDT05GSUdfTVBDODg1QURTPXkKKyMgQ09ORklHX1RRTTgyM0wgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg2MEwgaXMgbm90IHNldAorIyBDT05GSUdfRlBTODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEQ4MjNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1TOCBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1MMjQgaXMgbm90IHNldAorIyBDT05GSUdfU004NTAgaXMgbm90IHNldAorIyBDT05GSUdfSEVSTUVTX1BSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUDg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19MV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ1VfRSBpcyBub3Qgc2V0CisjIENPTkZJR19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOVEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01CWCBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5DRVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfRE9NQUlOUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfUVNQQU4gaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19PQUtORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD15CisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz15CitDT05GSUdfUFBQX1NZTkNfVFRZPXkKK0NPTkZJR19QUFBfREVGTEFURT15CisjIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ1BNPXkKK0NPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0M0IGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ1BNX1NNQzE9eQorQ09ORklHX1NFUklBTF9DUE1fU01DMj15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CisjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBNUEM4eHggQ1BNIE9wdGlvbnMKKyMKK0NPTkZJR19TQ0NfRU5FVD15CisjIENPTkZJR19TQ0MxX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfU0NDMl9FTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19TQ0MzX0VORVQ9eQorIyBDT05GSUdfRkVDX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfRU5FVF9CSUdfQlVGRkVSUyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucworIworQ09ORklHXzh4eF9DT1BZQkFDSz15CitDT05GSUdfOHh4X0NQVTY9eQorQ09ORklHX05PX1VDT0RFX1BBVENIPXkKKyMgQ09ORklHX1VTQl9TT0ZfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9VQ09ERV9QQVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1BJX1NNQzFfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9eQorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggODRkNjVhOC4uYTcyNzg3NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0yOCw2ICsyOCwxMiBAQAogY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOwogY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiAKKy8qCisgKiBQcm92aWRlIGEgZHVtbXkgY3Jhc2hfbm90ZXMgZGVmaW5pdGlvbiB3aGlsZSBjcmFzaCBkdW1wIGFycml2ZXMgdG8gcHBjLgorICogVGhpcyBwcmV2ZW50cyBicmVha2FnZSBvZiBjcmFzaF9ub3RlcyBhdHRyaWJ1dGUgaW4ga2VybmVsL2tzeXNmcy5jLgorICovCit2b2lkICpjcmFzaF9ub3RlcyA9IE5VTEw7CisKIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewogCWlmIChwcGNfbWQubWFjaGluZV9zaHV0ZG93bikKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IGI2YTYzYTQuLjE5MWE4ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwpAQCAtMTQ0OSwzICsxNDQ5LDUgQEAKIAkubG9uZyBzeXNfcmVxdWVzdF9rZXkJCS8qIDI3MCAqLwogCS5sb25nIHN5c19rZXljdGwKIAkubG9uZyBzeXNfd2FpdGlkCisJLmxvbmcgc3lzX2lvcHJpb19zZXQKKwkubG9uZyBzeXNfaW9wcmlvX2dldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IDZkN2I5MmQuLjcwY2ZiNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTE0OTUsNyArMTQ5NSw3IEBACiAJCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX01FTTsKIAl9IGVsc2UgewotCQlpb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQ7CisJCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtIF9fX0lPX0JBU0U7CiAJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OwogCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKIAl9CkBAIC0xNTIyLDcgKzE1MjIsNyBAQAogCiAJCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCi0JCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIF9JT19CQVNFOworCQkJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CiAJCXJldHVybiBycDsKIAl9CiAKQEAgLTE3MzksNiArMTczOSwyMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3ZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKwkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAorCQkJICB1NjQgKnN0YXJ0LCB1NjQgKmVuZCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCisJaWYgKGhvc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJb2Zmc2V0ID0gX19fSU9fQkFTRSAtIGhvc2UtPmlvX2Jhc2VfdmlydCArIGhvc2UtPmlvX2Jhc2VfcGh5czsKKworCSpzdGFydCA9IHJzcmMtPnN0YXJ0ICsgb2Zmc2V0OworCSplbmQgPSByc3JjLT5lbmQgKyBvZmZzZXQ7Cit9CisKIHZvaWQgX19pbml0CiBwY2lfaW5pdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJCSAgaW50IGZsYWdzLCBjaGFyICpuYW1lKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9wcGMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IDdmZjY5YzQuLjliMmFkNDggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTM0LDkgKzM0LDkgQEAKIAogCW1yCXI4LCByMAogCW9yaSAgICAgcjgsIHI4LCBNU1JfUkl8TVNSX01FCi0JbXRzcHIJU1JSMSwgcjgKKwltdHNwcglTUFJOX1NSUjEsIHI4CiAJYWRkaQlyOCwgcjQsIDFmIC0gcmVsb2NhdGVfbmV3X2tlcm5lbAotCW10c3ByCVNSUjAsIHI4CisJbXRzcHIJU1BSTl9TUlIwLCByOAogCXN5bmMKIAlyZmkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKaW5kZXggNzM1ODY2NS4uYmY0ZGRjYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCkBAIC04OSw2ICs4OSw5IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHdhbGxfamlmZmllczsKIAorLyogdXNlZCBmb3IgdGltZXpvbmUgb2Zmc2V0ICovCitzdGF0aWMgbG9uZyB0aW1lem9uZV9vZmZzZXQ7CisKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiAKIEVYUE9SVF9TWU1CT0wocnRjX2xvY2spOwpAQCAtMTcwLDcgKzE3Myw3IEBACiAJCSAgICAgeHRpbWUudHZfc2VjIC0gbGFzdF9ydGNfdXBkYXRlID49IDY1OSAmJgogCQkgICAgIGFicygoeHRpbWUudHZfbnNlYyAvIDEwMDApIC0gKDEwMDAwMDAtMTAwMDAwMC9IWikpIDwgNTAwMDAwL0haICYmCiAJCSAgICAgamlmZmllcyAtIHdhbGxfamlmZmllcyA9PSAxKSB7Ci0JCSAgCWlmIChwcGNfbWQuc2V0X3J0Y190aW1lKHh0aW1lLnR2X3NlYysxICsgdGltZV9vZmZzZXQpID09IDApCisJCSAgCWlmIChwcGNfbWQuc2V0X3J0Y190aW1lKHh0aW1lLnR2X3NlYysxICsgdGltZXpvbmVfb2Zmc2V0KSA9PSAwKQogCQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYysxOwogCQkJZWxzZQogCQkJCS8qIFRyeSBhZ2FpbiBvbmUgbWludXRlIGxhdGVyICovCkBAIC0yODYsNyArMjg5LDcgQEAKIAl1bnNpZ25lZCBvbGRfc3RhbXAsIHN0YW1wLCBlbGFwc2VkOwogCiAgICAgICAgIGlmIChwcGNfbWQudGltZV9pbml0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgdGltZV9vZmZzZXQgPSBwcGNfbWQudGltZV9pbml0KCk7CisgICAgICAgICAgICAgICAgdGltZXpvbmVfb2Zmc2V0ID0gcHBjX21kLnRpbWVfaW5pdCgpOwogCiAJaWYgKF9fVVNFX1JUQygpKSB7CiAJCS8qIDYwMSBwcm9jZXNzb3I6IGRlYyBjb3VudHMgZG93biBieSAxMjggZXZlcnkgMTI4bnMgKi8KQEAgLTMzMSwxMCArMzM0LDEwIEBACiAJc2V0X2RlYyh0Yl90aWNrc19wZXJfamlmZnkpOwogCiAJLyogSWYgcGxhdGZvcm0gcHJvdmlkZWQgYSB0aW1lem9uZSAocG1hYyksIHdlIGNvcnJlY3QgdGhlIHRpbWUgKi8KLSAgICAgICAgaWYgKHRpbWVfb2Zmc2V0KSB7Ci0JCXN5c190ei50el9taW51dGVzd2VzdCA9IC10aW1lX29mZnNldCAvIDYwOworICAgICAgICBpZiAodGltZXpvbmVfb2Zmc2V0KSB7CisJCXN5c190ei50el9taW51dGVzd2VzdCA9IC10aW1lem9uZV9vZmZzZXQgLyA2MDsKIAkJc3lzX3R6LnR6X2RzdHRpbWUgPSAwOwotCQl4dGltZS50dl9zZWMgLT0gdGltZV9vZmZzZXQ7CisJCXh0aW1lLnR2X3NlYyAtPSB0aW1lem9uZV9vZmZzZXQ7CiAgICAgICAgIH0KICAgICAgICAgc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9pbml0LmMgYi9hcmNoL3BwYy9tbS9pbml0LmMKaW5kZXggMzM0ZWY0MS4uNjE2NGEyYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vaW5pdC5jCisrKyBiL2FyY2gvcHBjL21tL2luaXQuYwpAQCAtNjA2LDkgKzYwNiwxOSBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAJCWlmICghUGFnZVJlc2VydmVkKHBhZ2UpCiAJCSAgICAmJiAhdGVzdF9iaXQoUEdfYXJjaF8xLCAmcGFnZS0+ZmxhZ3MpKSB7Ci0JCQlpZiAodm1hLT52bV9tbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCisJCQlpZiAodm1hLT52bV9tbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pIHsKKyNpZmRlZiBDT05GSUdfOHh4CisJCQkvKiBPbiA4eHgsIGNhY2hlIGNvbnRyb2wgaW5zdHJ1Y3Rpb25zIChwYXJ0aWN1bGFybHkgCisJCSAJICogImRjYnN0IiBmcm9tIGZsdXNoX2RjYWNoZV9pY2FjaGUpIGZhdWx0IGFzIHdyaXRlIAorCQkJICogb3BlcmF0aW9uIGlmIHRoZXJlIGlzIGFuIHVucG9wdWxhdGVkIFRMQiBlbnRyeSAKKwkJCSAqIGZvciB0aGUgYWRkcmVzcyBpbiBxdWVzdGlvbi4gVG8gd29ya2Fyb3VuZCB0aGF0LCAKKwkJCSAqIHdlIGludmFsaWRhdGUgdGhlIFRMQiBoZXJlLCB0aHVzIGF2b2lkaW5nIGRjYnN0IAorCQkJICogbWlzYmVoYXZpb3VyLgorCQkJICovCisJCQkJX3RsYmllKGFkZHJlc3MpOworI2VuZGlmCiAJCQkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKCh2b2lkICopIGFkZHJlc3MpOwotCQkJZWxzZQorCQkJfSBlbHNlCiAJCQkJZmx1c2hfZGNhY2hlX2ljYWNoZV9wYWdlKHBhZ2UpOwogCQkJc2V0X2JpdChQR19hcmNoXzEsICZwYWdlLT5mbGFncyk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCmluZGV4IGRkZDJlOWEuLmY3NjFmZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYwpAQCAtMTExLDggKzExMSw4IEBACiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIAorCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9GRUMpOwogCWlmIChwZGF0YSkgewotCQlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfRkVDKTsKIAkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gMDsKIAkJcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJCXBkYXRhLT5waHlpZCA9IDM7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZmFkcy5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2ZhZHMuaAppbmRleCA2MzJiODE3Li5iNjBjNTY0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZmFkcy5oCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9mYWRzLmgKQEAgLTMsNyArMywxOCBAQAogICogdGhlIE1vdG9yb2xhIDg2MFQgRkFEUyBib2FyZC4gIENvcGllZCBmcm9tIHRoZSBNQlggc3R1ZmYuCiAgKgogICogQ29weXJpZ2h0IChjKSAxOTk4IERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpCisgKgorICogQWRkZWQgTVBDODZYQURTIHN1cHBvcnQuCisgKiBUaGUgTVBDODZ4QURTIG1hbnVhbCBzYXlzIHRoZSBib2FyZCAiaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBNUEM4eHhGQURTCisgKiBmb3IgU1cgcG9pbnQgb2YgdmlldyIuIFRoaXMgaXMgOTklIGNvcnJlY3QuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkCisgKiAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLworCiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTTV9GQURTX0hfXwogI2RlZmluZSBfX0FTTV9GQURTX0hfXwpAQCAtMTIsMTggKzIzLDQ1IEBACiAKICNpbmNsdWRlIDxhc20vcHBjYm9vdC5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODZYQURTKQorCisvKiBVLUJvb3QgbWFwcyBCQ1NSIHRvIDB4ZmYwODAwMDAgKi8KKyNkZWZpbmUgQkNTUl9BRERSCQkoKHVpbnQpMHhmZjA4MDAwMCkKKworLyogTVBDODZYQURTIGhhcyBvbmUgbW9yZSBDUExEIGFuZCBhbiBhZGRpdGlvbmFsIEJDU1IuCisgKi8KKyNkZWZpbmUgQ0ZHX1BIWURFVl9BRERSCQkoKHVpbnQpMHhmZjBhMDAwMCkKKyNkZWZpbmUgQkNTUjUJCQkoKHVpbnQpKENGR19QSFlERVZfQUREUiArIDB4MzAwKSkKKworI2RlZmluZSBCQ1NSNV9UMV9SU1QJCTB4MTAKKyNkZWZpbmUgQkNTUjVfQVRNMTU1X1JTVAkweDA4CisjZGVmaW5lIEJDU1I1X0FUTTI1X1JTVAkJMHgwNAorI2RlZmluZSBCQ1NSNV9NSUkxX0VOCQkweDAyCisjZGVmaW5lIEJDU1I1X01JSTFfUlNUCQkweDAxCisKKy8qIFRoZXJlIGlzIG5vIFBIWSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUEhZX0lOVEVSUlVQVAkoLTEpCisKKyNlbHNlIC8qIEZBRFMgKi8KKwogLyogTWVtb3J5IG1hcCBpcyBjb25maWd1cmVkIGJ5IHRoZSBQUk9NIHN0YXJ0dXAuCiAgKiBJIHRyaWVkIHRvIGZvbGxvdyB0aGUgRkFEUyBtYW51YWwsIGFsdGhvdWdoIHRoZSBzdGFydHVwIFBST00KICAqIGRpY3RhdGVzIHRoaXMgYW5kIHdlIHNpbXBseSBoYXZlIHRvIG1vdmUgc29tZSBvZiB0aGUgcGh5c2ljYWwKICAqIGFkZHJlc3NlcyBmb3IgTGludXguCiAgKi8KICNkZWZpbmUgQkNTUl9BRERSCQkoKHVpbnQpMHhmZjAxMDAwMCkKKworLyogUEhZIGxpbmsgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBQSFlfSU5URVJSVVBUCVNJVV9JUlEyCisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODZYQURTICovCisKICNkZWZpbmUgQkNTUl9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCi0jZGVmaW5lCUJDU1IwCQkJKCh1aW50KTB4ZmYwMTAwMDApCi0jZGVmaW5lCUJDU1IxCQkJKCh1aW50KTB4ZmYwMTAwMDQpCi0jZGVmaW5lCUJDU1IyCQkJKCh1aW50KTB4ZmYwMTAwMDgpCi0jZGVmaW5lCUJDU1IzCQkJKCh1aW50KTB4ZmYwMTAwMGMpCi0jZGVmaW5lCUJDU1I0CQkJKCh1aW50KTB4ZmYwMTAwMTApCisjZGVmaW5lIEJDU1IwCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDAwKSkKKyNkZWZpbmUgQkNTUjEJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDQpKQorI2RlZmluZSBCQ1NSMgkJCSgodWludCkoQkNTUl9BRERSICsgMHgwOCkpCisjZGVmaW5lIEJDU1IzCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDBjKSkKKyNkZWZpbmUgQkNTUjQJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MTApKQogCiAjZGVmaW5lIElNQVBfQUREUgkJKCh1aW50KTB4ZmYwMDAwMDApCiAjZGVmaW5lIElNQVBfU0laRQkJKCh1aW50KSg2NCAqIDEwMjQpKQpAQCAtMzQsOCArNzIsMTcgQEAKIC8qIEJpdHMgb2YgaW50ZXJlc3QgaW4gdGhlIEJDU1JzLgogICovCiAjZGVmaW5lIEJDU1IxX0VUSEVOCQkoKHVpbnQpMHgyMDAwMDAwMCkKKyNkZWZpbmUgQkNTUjFfSVJEQUVOCQkoKHVpbnQpMHgxMDAwMDAwMCkKICNkZWZpbmUgQkNTUjFfUlMyMzJFTl8xCQkoKHVpbnQpMHgwMTAwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDRU4JCSgodWludCkweDAwODAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWQ0MwCQkoKHVpbnQpMHgwMDQwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQMAkJKCh1aW50KTB4MDAyMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUDEJCSgodWludCkweDAwMTAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFBfTUFTSwkoQkNTUjFfUENDVlBQMCB8IEJDU1IxX1BDQ1ZQUDEpCiAjZGVmaW5lIEJDU1IxX1JTMjMyRU5fMgkJKCh1aW50KTB4MDAwNDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQzEJCSgodWludCkweDAwMDEwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWQ0NfTUFTSwkoQkNTUjFfUENDVkNDMCB8IEJDU1IxX1BDQ1ZDQzEpCisKICNkZWZpbmUgQkNTUjRfRVRITE9PUAkJKCh1aW50KTB4ODAwMDAwMDApCS8qIEVFU1QgTG9vcGJhY2sgKi8KICNkZWZpbmUgQkNTUjRfRUVGRFgJCSgodWludCkweDQwMDAwMDAwKQkvKiBFRVNUIEZEWCBlbmFibGUgKi8KICNkZWZpbmUgQkNTUjRfRkVUSF9FTgkJKCh1aW50KTB4MDgwMDAwMDApCS8qIFBIWSBlbmFibGUgKi8KQEAgLTQ0LDE0ICs5MSw2NCBAQAogI2RlZmluZSBCQ1NSNF9GRVRIRkRFCQkoKHVpbnQpMHgwMjAwMDAwMCkJLyogUEhZIEZEWCBhZHZlcnRpc2UgKi8KICNkZWZpbmUgQkNTUjRfRkVUSFJTVAkJKCh1aW50KTB4MDAyMDAwMDApCS8qIFBIWSBSZXNldCAqLwogCisvKiBJT19CQVNFIGRlZmluaXRpb24gZm9yIHBjbWNpYS4KKyAqLworI2RlZmluZSBfSU9fQkFTRQkweDgwMDAwMDAwCisjZGVmaW5lIF9JT19CQVNFX1NJWkUJMHgxMDAwCisKKyNpZmRlZiBDT05GSUdfSURFCisjZGVmaW5lIE1BWF9IV0lGUyAxCisjZW5kaWYKKwogLyogSW50ZXJydXB0IGxldmVsIGFzc2lnbm1lbnRzLgogICovCiAjZGVmaW5lIEZFQ19JTlRFUlJVUFQJU0lVX0xFVkVMMQkvKiBGRUMgaW50ZXJydXB0ICovCi0jZGVmaW5lIFBIWV9JTlRFUlJVUFQJU0lVX0lSUTIJLyogUEhZIGxpbmsgY2hhbmdlIGludGVycnVwdCAqLwogCiAvKiBXZSBkb24ndCB1c2UgdGhlIDgyNTkuCiAgKi8KICNkZWZpbmUgTlJfODI1OV9JTlRTCTAKIAorLyogQ1BNIEV0aGVybmV0IHRocm91Z2ggU0NDMSBvciBTQ0MyICovCisKKyNpZmRlZiBDT05GSUdfU0NDMV9FTkVUCQkvKiBQcm9iYWJseSA4NjAgdmFyaWFudCAqLworLyogQml0cyBpbiBwYXJhbGxlbCBJL08gcG9ydCByZWdpc3RlcnMgdGhhdCBoYXZlIHRvIGJlIHNldC9jbGVhcmVkCisgKiB0byBjb25maWd1cmUgdGhlIHBpbnMgZm9yIFNDQzEgdXNlLgorICogVENMSyAtIENMSzEsIFJDTEsgLSBDTEsyLgorICovCisjZGVmaW5lIFBBX0VORVRfUlhECSgodXNob3J0KTB4MDAwMSkKKyNkZWZpbmUgUEFfRU5FVF9UWEQJKCh1c2hvcnQpMHgwMDAyKQorI2RlZmluZSBQQV9FTkVUX1RDTEsJKCh1c2hvcnQpMHgwMTAwKQorI2RlZmluZSBQQV9FTkVUX1JDTEsJKCh1c2hvcnQpMHgwMjAwKQorI2RlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDEwMDApCisjZGVmaW5lIFBDX0VORVRfQ0xTTgkoKHVzaG9ydCkweDAwMTApCisjZGVmaW5lIFBDX0VORVRfUkVOQQkoKHVzaG9ydCkweDAwMjApCisKKy8qIENvbnRyb2wgYml0cyBpbiB0aGUgU0lDUiB0byByb3V0ZSBUQ0xLIChDTEsxKSBhbmQgUkNMSyAoQ0xLMikgdG8KKyAqIFNDQzEuICBBbHNvLCBtYWtlIHN1cmUgR1IxIChiaXQgMjQpIGFuZCBTQzEgKGJpdCAyNSkgYXJlIHplcm8uCisgKi8KKyNkZWZpbmUgU0lDUl9FTkVUX01BU0sJKCh1aW50KTB4MDAwMDAwZmYpCisjZGVmaW5lIFNJQ1JfRU5FVF9DTEtSVAkoKHVpbnQpMHgwMDAwMDAyYykKKyNlbmRpZiAvKiBDT05GSUdfU0NDMV9FTkVUICovCisKKyNpZmRlZiBDT05GSUdfU0NDMl9FTkVUCQkvKiBQcm9iYWJseSA4MjMvODUwIHZhcmlhbnQgKi8KKy8qIEJpdHMgaW4gcGFyYWxsZWwgSS9PIHBvcnQgcmVnaXN0ZXJzIHRoYXQgaGF2ZSB0byBiZSBzZXQvY2xlYXJlZAorICogdG8gY29uZmlndXJlIHRoZSBwaW5zIGZvciBTQ0MxIHVzZS4KKyAqIFRDTEsgLSBDTEsxLCBSQ0xLIC0gQ0xLMi4KKyAqLworI2RlZmluZSBQQV9FTkVUX1JYRAkoKHVzaG9ydCkweDAwMDQpCisjZGVmaW5lIFBBX0VORVRfVFhECSgodXNob3J0KTB4MDAwOCkKKyNkZWZpbmUgUEFfRU5FVF9UQ0xLCSgodXNob3J0KTB4MDQwMCkKKyNkZWZpbmUgUEFfRU5FVF9SQ0xLCSgodXNob3J0KTB4MDIwMCkKKyNkZWZpbmUgUEJfRU5FVF9URU5BCSgodWludCkweDAwMDAyMDAwKQorI2RlZmluZSBQQ19FTkVUX0NMU04JKCh1c2hvcnQpMHgwMDQwKQorI2RlZmluZSBQQ19FTkVUX1JFTkEJKCh1c2hvcnQpMHgwMDgwKQorCisvKiBDb250cm9sIGJpdHMgaW4gdGhlIFNJQ1IgdG8gcm91dGUgVENMSyBhbmQgUkNMSyB0bworICogU0NDMi4gIEFsc28sIG1ha2Ugc3VyZSBHUjEgKGJpdCAyNCkgYW5kIFNDMSAoYml0IDI1KSBhcmUgemVyby4KKyAqLworI2RlZmluZSBTSUNSX0VORVRfTUFTSwkoKHVpbnQpMHgwMDAwZmYwMCkKKyNkZWZpbmUgU0lDUl9FTkVUX0NMS1JUCSgodWludCkweDAwMDAyZTAwKQorI2VuZGlmIC8qIENPTkZJR19TQ0MyX0VORVQgKi8KKwogI2VuZGlmIC8qIF9fQVNNX0ZBRFNfSF9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkcy5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzg2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODg1YWRzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIEEgY29sbGVjdGlvbiBvZiBzdHJ1Y3R1cmVzLCBhZGRyZXNzZXMsIGFuZCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB0aGUgRnJlZXNjYWxlIE1QQzg4NUFEUyBib2FyZC4KKyAqIENvcGllZCBmcm9tIHRoZSBGQURTIHN0dWZmLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQKKyAqICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fQVNNX01QQzg4NUFEU19IX18KKyNkZWZpbmUgX19BU01fTVBDODg1QURTX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vcHBjYm9vdC5oPgorCisvKiBVLUJvb3QgbWFwcyBCQ1NSIHRvIDB4ZmYwODAwMDAgKi8KKyNkZWZpbmUgQkNTUl9BRERSCQkoKHVpbnQpMHhmZjA4MDAwMCkKKyNkZWZpbmUgQkNTUl9TSVpFCQkoKHVpbnQpMzIpCisjZGVmaW5lIEJDU1IwCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDAwKSkKKyNkZWZpbmUgQkNTUjEJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDQpKQorI2RlZmluZSBCQ1NSMgkJCSgodWludCkoQkNTUl9BRERSICsgMHgwOCkpCisjZGVmaW5lIEJDU1IzCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDBjKSkKKyNkZWZpbmUgQkNTUjQJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MTApKQorCisjZGVmaW5lIENGR19QSFlERVZfQUREUgkJKCh1aW50KTB4ZmYwYTAwMDApCisjZGVmaW5lIEJDU1I1CQkJKCh1aW50KShDRkdfUEhZREVWX0FERFIgKyAweDMwMCkpCisKKyNkZWZpbmUgSU1BUF9BRERSCQkoKHVpbnQpMHhmZjAwMDAwMCkKKyNkZWZpbmUgSU1BUF9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCisKKyNkZWZpbmUgUENNQ0lBX01FTV9BRERSCQkoKHVpbnQpMHhmZjAyMDAwMCkKKyNkZWZpbmUgUENNQ0lBX01FTV9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCisKKy8qIEJpdHMgb2YgaW50ZXJlc3QgaW4gdGhlIEJDU1JzLgorICovCisjZGVmaW5lIEJDU1IxX0VUSEVOCQkoKHVpbnQpMHgyMDAwMDAwMCkKKyNkZWZpbmUgQkNTUjFfSVJEQUVOCQkoKHVpbnQpMHgxMDAwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUlMyMzJFTl8xCQkoKHVpbnQpMHgwMTAwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDRU4JCSgodWludCkweDAwODAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWQ0MwCQkoKHVpbnQpMHgwMDQwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQMAkJKCh1aW50KTB4MDAyMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUDEJCSgodWludCkweDAwMTAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFBfTUFTSwkoQkNTUjFfUENDVlBQMCB8IEJDU1IxX1BDQ1ZQUDEpCisjZGVmaW5lIEJDU1IxX1JTMjMyRU5fMgkJKCh1aW50KTB4MDAwNDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQzEJCSgodWludCkweDAwMDEwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWQ0NfTUFTSwkoQkNTUjFfUENDVkNDMCB8IEJDU1IxX1BDQ1ZDQzEpCisKKyNkZWZpbmUgQkNTUjRfRVRIMTBfUlNUCQkoKHVpbnQpMHg4MDAwMDAwMCkJLyogMTBCYXNlLVQgUEhZIHJlc2V0Ki8KKyNkZWZpbmUgQkNTUjRfVVNCX0xPX1NQRAkoKHVpbnQpMHgwNDAwMDAwMCkKKyNkZWZpbmUgQkNTUjRfVVNCX1ZDQwkJKCh1aW50KTB4MDIwMDAwMDApCisjZGVmaW5lIEJDU1I0X1VTQl9GVUxMX1NQRAkoKHVpbnQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgQkNTUjRfVVNCX0VOCQkoKHVpbnQpMHgwMDAyMDAwMCkKKworI2RlZmluZSBCQ1NSNV9NSUkyX0VOCQkweDQwCisjZGVmaW5lIEJDU1I1X01JSTJfUlNUCQkweDIwCisjZGVmaW5lIEJDU1I1X1QxX1JTVAkJMHgxMAorI2RlZmluZSBCQ1NSNV9BVE0xNTVfUlNUCTB4MDgKKyNkZWZpbmUgQkNTUjVfQVRNMjVfUlNUCQkweDA0CisjZGVmaW5lIEJDU1I1X01JSTFfRU4JCTB4MDIKKyNkZWZpbmUgQkNTUjVfTUlJMV9SU1QJCTB4MDEKKworLyogSW50ZXJydXB0IGxldmVsIGFzc2lnbm1lbnRzICovCisjZGVmaW5lIFBIWV9JTlRFUlJVUFQJU0lVX0lSUTcJLyogUEhZIGxpbmsgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBTSVVfSU5UX0ZFQzEJU0lVX0xFVkVMMQkvKiBGRUMxIGludGVycnVwdCAqLworI2RlZmluZSBTSVVfSU5UX0ZFQzIJU0lVX0xFVkVMMwkvKiBGRUMyIGludGVycnVwdCAqLworI2RlZmluZSBGRUNfSU5URVJSVVBUCVNJVV9JTlRfRkVDMQkvKiBGRUMgaW50ZXJydXB0ICovCisKKy8qIFdlIGRvbid0IHVzZSB0aGUgODI1OSAqLworI2RlZmluZSBOUl84MjU5X0lOVFMJMAorCisvKiBDUE0gRXRoZXJuZXQgdGhyb3VnaCBTQ0MzICovCisjZGVmaW5lIFBBX0VORVRfUlhECSgodXNob3J0KTB4MDA0MCkKKyNkZWZpbmUgUEFfRU5FVF9UWEQJKCh1c2hvcnQpMHgwMDgwKQorI2RlZmluZSBQRV9FTkVUX1RDTEsJKCh1aW50KTB4MDAwMDQwMDApCisjZGVmaW5lIFBFX0VORVRfUkNMSwkoKHVpbnQpMHgwMDAwODAwMCkKKyNkZWZpbmUgUEVfRU5FVF9URU5BCSgodWludCkweDAwMDAwMDEwKQorI2RlZmluZSBQQ19FTkVUX0NMU04JKCh1c2hvcnQpMHgwNDAwKQorI2RlZmluZSBQQ19FTkVUX1JFTkEJKCh1c2hvcnQpMHgwODAwKQorCisvKiBDb250cm9sIGJpdHMgaW4gdGhlIFNJQ1IgdG8gcm91dGUgVENMSyAoQ0xLNSkgYW5kIFJDTEsgKENMSzYpIHRvCisgKiBTQ0MzLiAgQWxzbywgbWFrZSBzdXJlIEdSMyAoYml0IDgpIGFuZCBTQzMgKGJpdCA5KSBhcmUgemVybyAqLworI2RlZmluZSBTSUNSX0VORVRfTUFTSwkoKHVpbnQpMHgwMGZmMDAwMCkKKyNkZWZpbmUgU0lDUl9FTkVUX0NMS1JUCSgodWludCkweDAwMmMwMDAwKQorCisjZW5kaWYgLyogX19BU01fTVBDODg1QURTX0hfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYwppbmRleCA1ZmRkNGY2Li5jMDYwNTI0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfY3B1ZnJlcS5jCkBAIC00NTIsNyArNDUyLDcgQEAKIAlyZXR1cm4gb2Zmc2V0OwogfQogCi1zdGF0aWMgaW50IF9fcG1hYyBwbWFjX2NwdWZyZXFfc3VzcGVuZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdTMyIHN0YXRlKQorc3RhdGljIGludCBfX3BtYWMgcG1hY19jcHVmcmVxX3N1c3BlbmQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHBtX21lc3NhZ2VfdCBwbXNnKQogewogCS8qIE9rLCB0aGlzIGNvdWxkIGJlIG1hZGUgYSBiaXQgc21hcnRlciwgYnV0IGxldCdzIGJlIHJvYnVzdCBmb3Igbm93LiBXZQogCSAqIGFsd2F5cyBmb3JjZSBhIHNwZWVkIGNoYW5nZSB0byBoaWdoIHNwZWVkIGJlZm9yZSBzbGVlcCwgdG8gbWFrZSBzdXJlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc2xlZXAuUwppbmRleCBmNDU5YWRlLi4wMTZhNzQ2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkuc2VjdGlvbiAudGV4dAogCS5hbGlnbgk1CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTUFDX1BCT09LKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKQogCiAvKiBUaGlzIGdldHMgY2FsbGVkIGJ5IHZpYS1wbXUuYyBsYXRlIGR1cmluZyB0aGUgc2xlZXAgcHJvY2Vzcy4KICAqIFRoZSBQTVUgd2FzIGFscmVhZHkgc2VuZCB0aGUgc2xlZXAgY29tbWFuZCBhbmQgd2lsbCBzaHV0IHVzIGRvd24KQEAgLTM4Miw3ICszODIsNyBAQAogCWlzeW5jCiAJcmZpCiAKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QTUFDX1BCT09LKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QTSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVEpICovCiAKIAkuc2VjdGlvbiAuZGF0YQogCS5iYWxpZ24JTDFfQ0FDSEVfTElORV9TSVpFCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY190aW1lLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY190aW1lLmMKaW5kZXggZGU2MGNjYy4uNzc4Y2U0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfdGltZS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3RpbWUuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyoKICAqIFJlc2V0IHRoZSB0aW1lIGFmdGVyIGEgc2xlZXAuCiAgKi8KQEAgLTIzOCw3ICsyMzgsNyBAQAogc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgdGltZV9zbGVlcF9ub3RpZmllciBfX3BtYWNkYXRhID0gewogCXRpbWVfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9NSVNDLAogfTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAvKgogICogUXVlcnkgdGhlIE9GIGFuZCBnZXQgdGhlIGRlY3IgZnJlcXVlbmN5LgpAQCAtMjUxLDkgKzI1MSw5IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CiAJdW5zaWduZWQgaW50IGZyZXEsICpmcDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZ0aW1lX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAJLyogV2UgYXNzdW1lIE1hY1JJU0MyIG1hY2hpbmVzIGhhdmUgY29ycmVjdCBkZXZpY2UtdHJlZQogCSAqIGNhbGlicmF0aW9uLiBUaGF0J3MgYmV0dGVyIHNpbmNlIHRoZSBWSUEgaXRzZWxmIHNlZW1zCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvc2FuZHBvaW50LmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvc2FuZHBvaW50LmMKaW5kZXggNzBlNThmNC4uOGIxNDljMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3NhbmRwb2ludC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9zYW5kcG9pbnQuYwpAQCAtMzI0LDYgKzMyNCw3IEBACiAJCQlwZGF0YVsxXS5pcnEgPSAwOwogCQkJcGRhdGFbMV0ubWFwYmFzZSA9IDA7CiAJCX0KKwl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJNb3Rvcm9sYSBTUFMgU2FuZHBvaW50IFRlc3QgUGxhdGZvcm1cbiIpOwogCXByaW50ayhLRVJOX0lORk8gIlBvcnQgYnkgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAoc291cmNlQG12aXN0YS5jb20pXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMgYi9hcmNoL3BwYy9zeXNsaWIvaXBpYy5jCmluZGV4IDU4MGVkNjUuLjhmMDFlMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2lwaWMuYwpAQCAtNzksNyArNzksNyBAQAogCQkucHJpb19tYXNrID0gNywKIAl9LAogCVsxN10gPSB7Ci0JCS5wZW5kCT0gSVBJQ19TSVBOUl9ILAorCQkucGVuZAk9IElQSUNfU0VQTlIsCiAJCS5tYXNrCT0gSVBJQ19TRU1TUiwKIAkJLnByaW8JPSBJUElDX1NNUFJSX0EsCiAJCS5mb3JjZQk9IElQSUNfU0VGQ1IsCkBAIC04Nyw3ICs4Nyw3IEBACiAJCS5wcmlvX21hc2sgPSA1LAogCX0sCiAJWzE4XSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQSwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKQEAgLTk1LDcgKzk1LDcgQEAKIAkJLnByaW9fbWFzayA9IDYsCiAJfSwKIAlbMTldID0gewotCQkucGVuZAk9IElQSUNfU0lQTlJfSCwKKwkJLnBlbmQJPSBJUElDX1NFUE5SLAogCQkubWFzawk9IElQSUNfU0VNU1IsCiAJCS5wcmlvCT0gSVBJQ19TTVBSUl9BLAogCQkuZm9yY2UJPSBJUElDX1NFRkNSLApAQCAtMTAzLDcgKzEwMyw3IEBACiAJCS5wcmlvX21hc2sgPSA3LAogCX0sCiAJWzIwXSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQiwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKQEAgLTExMSw3ICsxMTEsNyBAQAogCQkucHJpb19tYXNrID0gNCwKIAl9LAogCVsyMV0gPSB7Ci0JCS5wZW5kCT0gSVBJQ19TSVBOUl9ILAorCQkucGVuZAk9IElQSUNfU0VQTlIsCiAJCS5tYXNrCT0gSVBJQ19TRU1TUiwKIAkJLnByaW8JPSBJUElDX1NNUFJSX0IsCiAJCS5mb3JjZQk9IElQSUNfU0VGQ1IsCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJLnByaW9fbWFzayA9IDUsCiAJfSwKIAlbMjJdID0gewotCQkucGVuZAk9IElQSUNfU0lQTlJfSCwKKwkJLnBlbmQJPSBJUElDX1NFUE5SLAogCQkubWFzawk9IElQSUNfU0VNU1IsCiAJCS5wcmlvCT0gSVBJQ19TTVBSUl9CLAogCQkuZm9yY2UJPSBJUElDX1NFRkNSLApAQCAtMTI3LDcgKzEyNyw3IEBACiAJCS5wcmlvX21hc2sgPSA2LAogCX0sCiAJWzIzXSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQiwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYyBiL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYwppbmRleCA0OWMwZTM0Li4xZWI0ZjcyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29mX2RldmljZS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKQEAgLTE1LDIwICsxNiwyMCBAQAogICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGFuIG9mX2RldmljZSBwcmVzZW50IGluIHRoZQogICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLgogICovCi1jb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaGVzLAorY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAogCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCiB7CiAJaWYgKCFkZXYtPm5vZGUpCiAJCXJldHVybiBOVUxMOwotCXdoaWxlIChtYXRjaGVzLT5uYW1lIHx8IG1hdGNoZXMtPnR5cGUgfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZSkgeworCXdoaWxlIChtYXRjaGVzLT5uYW1lWzBdIHx8IG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkgewogCQlpbnQgbWF0Y2ggPSAxOwotCQlpZiAobWF0Y2hlcy0+bmFtZSAmJiBtYXRjaGVzLT5uYW1lICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPm5hbWVbMF0pCiAJCQltYXRjaCAmPSBkZXYtPm5vZGUtPm5hbWUKIAkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPm5hbWUsIGRldi0+bm9kZS0+bmFtZSk7Ci0JCWlmIChtYXRjaGVzLT50eXBlICYmIG1hdGNoZXMtPnR5cGUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+dHlwZVswXSkKIAkJCW1hdGNoICY9IGRldi0+bm9kZS0+dHlwZQogCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgZGV2LT5ub2RlLT50eXBlKTsKLQkJaWYgKG1hdGNoZXMtPmNvbXBhdGlibGUgJiYgbWF0Y2hlcy0+Y29tcGF0aWJsZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQogCQkJbWF0Y2ggJj0gZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5ub2RlLAogCQkJCW1hdGNoZXMtPmNvbXBhdGlibGUpOwogCQlpZiAobWF0Y2gpCkBAIC00Miw3ICs0Myw3IEBACiB7CiAJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBvZl9kcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KTsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CiAKIAlpZiAoIW1hdGNoZXMpCiAJCXJldHVybiAwOwpAQCAtNzUsNyArNzYsNyBAQAogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2OwogCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldjsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKaW5kZXggYjQ1ZDgyNi4uYWQzOWI4NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKQEAgLTM3MCw4ICszNzAsOSBAQAogCS8qIEluaXRpYWxpemUgSVBJIGludGVycnVwdHMgKi8KIAlpZiAoIHBwY19tZC5wcm9ncmVzcyApIHBwY19tZC5wcm9ncmVzcygib3BlbnBpYzogaXBpIiwweDNiYik7CiAJZm9yIChpID0gMDsgaSA8IE9QRU5QSUNfTlVNX0lQSTsgaSsrKSB7Ci0JCS8qIERpc2FibGVkLCBQcmlvcml0eSAxMC4uMTMgKi8KLQkJb3BlbnBpY19pbml0aXBpKGksIDEwK2ksIE9QRU5QSUNfVkVDX0lQSStpK29mZnNldCk7CisJCS8qIERpc2FibGVkLCBpbmNyZWFzZWQgcHJpb3JpdGllcyAxMC4uMTMgKi8KKwkJb3BlbnBpY19pbml0aXBpKGksIE9QRU5QSUNfUFJJT1JJVFlfSVBJX0JBU0UraSwKKwkJCQlPUEVOUElDX1ZFQ19JUEkraStvZmZzZXQpOwogCQkvKiBJUElzIGFyZSBwZXItQ1BVICovCiAJCWlycV9kZXNjW09QRU5QSUNfVkVDX0lQSStpK29mZnNldF0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogCQlpcnFfZGVzY1tPUEVOUElDX1ZFQ19JUEkraStvZmZzZXRdLmhhbmRsZXIgPSAmb3Blbl9waWNfaXBpOwpAQCAtMzk5LDggKzQwMCw5IEBACiAJCWlmIChzZW5zZSAmIElSUV9TRU5TRV9NQVNLKQogCQkJaXJxX2Rlc2NbaStvZmZzZXRdLnN0YXR1cyA9IElSUV9MRVZFTDsKIAotCQkvKiBFbmFibGVkLCBQcmlvcml0eSA4ICovCi0JCW9wZW5waWNfaW5pdGlycShpLCA4LCBpK29mZnNldCwgKHNlbnNlICYgSVJRX1BPTEFSSVRZX01BU0spLAorCQkvKiBFbmFibGVkLCBEZWZhdWx0IHByaW9yaXR5ICovCisJCW9wZW5waWNfaW5pdGlycShpLCBPUEVOUElDX1BSSU9SSVRZX0RFRkFVTFQsIGkrb2Zmc2V0LAorCQkJCShzZW5zZSAmIElSUV9QT0xBUklUWV9NQVNLKSwKIAkJCQkoc2Vuc2UgJiBJUlFfU0VOU0VfTUFTSykpOwogCQkvKiBQcm9jZXNzb3IgMCAqLwogCQlvcGVucGljX21hcGlycShpLCBDUFVfTUFTS19DUFUwLCBDUFVfTUFTS19OT05FKTsKQEAgLTY1Niw2ICs2NTgsMTggQEAKIH0KIAogLyoKKyAqIENoYW5nZSB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0CisgKi8KK3ZvaWQgX19pbml0CitvcGVucGljX3NldF9pcnFfcHJpb3JpdHkodV9pbnQgaXJxLCB1X2ludCBwcmkpCit7CisJY2hlY2tfYXJnX2lycShpcnEpOworCW9wZW5waWNfc2FmZV93cml0ZWZpZWxkKCZJU1JbaXJxIC0gb3Blbl9waWNfaXJxX29mZnNldF0tPlZlY3Rvcl9Qcmlvcml0eSwKKwkJCQlPUEVOUElDX1BSSU9SSVRZX01BU0ssCisJCQkJcHJpIDw8IE9QRU5QSUNfUFJJT1JJVFlfU0hJRlQpOworfQorCisvKgogICogSW5pdGFsaXplIHRoZSBpbnRlcnJ1cHQgc291cmNlIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYW4gTk1JLgogICogVGhpcyByYWlzZXMgdGhlIGludGVycnVwdCdzIHByaW9yaXR5IGZyb20gOCB0byA5LgogICoKQEAgLTY2NSw5ICs2NzksNyBAQAogb3BlbnBpY19pbml0X25taV9pcnEodV9pbnQgaXJxKQogewogCWNoZWNrX2FyZ19pcnEoaXJxKTsKLQlvcGVucGljX3NhZmVfd3JpdGVmaWVsZCgmSVNSW2lycSAtIG9wZW5fcGljX2lycV9vZmZzZXRdLT5WZWN0b3JfUHJpb3JpdHksCi0JCQkJT1BFTlBJQ19QUklPUklUWV9NQVNLLAotCQkJCTkgPDwgT1BFTlBJQ19QUklPUklUWV9TSElGVCk7CisJb3BlbnBpY19zZXRfaXJxX3ByaW9yaXR5KGlycSwgT1BFTlBJQ19QUklPUklUWV9OTUkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfcGljLmMKaW5kZXggMDU2ODZmYS4uNDAwODYyMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X3BpYy5jCkBAIC0xMTAsNiArMTEwLDEwIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwcGM0eHhfcGljX2ltcGxfaW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKQorCS8qIERpc2FibGUgNDQwR1AgY29tcGF0aWJpbGl0eSBtb2RlIGlmIGl0IHdhcyBlbmFibGVkIGluIGZpcm13YXJlICovCisJU0RSX1dSSVRFKERDUk5fU0RSX01GUiwgU0RSX1JFQUQoRENSTl9TRFJfTUZSKSAmIH5EQ1JOX1NEUl9NRlJfUENNKTsKKyNlbmRpZgogCS8qIENvbmZpZ3VyZSBCYXNlIFVJQyAqLwogCW10ZGNyKERDUk5fVUlDX0NSKFVJQ0IpLCAwKTsKIAltdGRjcihEQ1JOX1VJQ19UUihVSUNCKSwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L0tjb25maWcgYi9hcmNoL3BwYzY0L0tjb25maWcKaW5kZXggZjgwNGYyNS4uZmRkOGFmYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9LY29uZmlnCisrKyBiL2FyY2gvcHBjNjQvS2NvbmZpZwpAQCAtNDI5LDYgKzQyOSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZQppbmRleCBkM2UxZDZhLi42ODNiMmQ0IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGM2NC9ib290L01ha2VmaWxlCkBAIC01Miw3ICs1Miw3IEBACiBzcmMtc2VjID0gJChmb3JlYWNoIHNlY3Rpb24sICQoMSksICQocGF0c3Vic3QgJSwkKG9iaikva2VybmVsLSUuYywgJChzZWN0aW9uKSkpCiBnei1zZWMgID0gJChmb3JlYWNoIHNlY3Rpb24sICQoMSksICQocGF0c3Vic3QgJSwkKG9iaikva2VybmVsLSUuZ3osICQoc2VjdGlvbikpKQogCi1ob3N0cHJvZ3MteQkJOj0gcGlnZ3kgYWRkbm90ZSBhZGRSYW1EaXNrCitob3N0cHJvZ3MteQkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrCiB0YXJnZXRzIAkJKz0gekltYWdlIHpJbWFnZS5pbml0cmQgaW1hZ2VzaXplLmMgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgc3JjLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXApAQCAtNzgsOSArNzgsNiBAQAogcXVpZXRfY21kX2FkZG5vdGUgPSBBREROT1RFICRAIAogICAgICAgY21kX2FkZG5vdGUgPSAkKENST1NTMzJMRCkgJChCT09UTEZMQUdTKSAtbyAkQCAkKG9iai1ib290KSAmJiAkKG9iaikvYWRkbm90ZSAkQAogCi1xdWlldF9jbWRfcGlnZ3kgPSBQSUdHWSAgICRACi0gICAgICBjbWRfcGlnZ3kgPSAkKG9iaikvcGlnZ3liYWNrICQoQDoubz0pIDwgJDwgfCAkKENST1NTMzJBUykgLW8gJEAKLQogJChjYWxsIGd6LXNlYywgJChyZXF1aXJlZCkpOiAkKG9iaikva2VybmVsLSUuZ3o6ICUgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jIGIvYXJjaC9wcGM2NC9ib290L21haW4uYwppbmRleCBkYTEyZWEyLi4xOTlkOTgwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcHBjNjQvYm9vdC9tYWluLmMKQEAgLTE3LDcgKzE3LDYgQEAKIAogZXh0ZXJuIHZvaWQgKmZpbmRkZXZpY2UoY29uc3QgY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0cHJvcCh2b2lkICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgcHJpbnRrKGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiB2b2lkIGd1bnppcCh2b2lkICosIGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKik7CkBAIC0xNDcsMTAgKzE0NiwxMCBAQAogCQl9CiAJCWExID0gaW5pdHJkLmFkZHI7CiAJCWEyID0gaW5pdHJkLnNpemU7Ci0JCXByaW50ZigiaW5pdGlhbCByYW1kaXNrIG1vdmluZyAweCVseCA8LSAweCVseCAoJWx4IGJ5dGVzKVxuXHIiLAorCQlwcmludGYoImluaXRpYWwgcmFtZGlzayBtb3ZpbmcgMHglbHggPC0gMHglbHggKDB4JWx4IGJ5dGVzKVxuXHIiLAogCQkgICAgICAgaW5pdHJkLmFkZHIsICh1bnNpZ25lZCBsb25nKV9pbml0cmRfc3RhcnQsIGluaXRyZC5zaXplKTsKIAkJbWVtbW92ZSgodm9pZCAqKWluaXRyZC5hZGRyLCAodm9pZCAqKV9pbml0cmRfc3RhcnQsIGluaXRyZC5zaXplKTsKLQkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodTMyICopaW5pdHJkLmFkZHIpKTsKKwkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodW5zaWduZWQgbG9uZyAqKWluaXRyZC5hZGRyKSk7CiAJfQogCiAJLyogRXZlbnR1YWxseSBndW56aXAgdGhlIGtlcm5lbCAqLwpAQCAtMjAxLDkgKzIwMCw2IEBACiAKIAlmbHVzaF9jYWNoZSgodm9pZCAqKXZtbGludXguYWRkciwgdm1saW51eC5zaXplKTsKIAotCWlmIChhMSkKLQkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodTMyICopaW5pdHJkLmFkZHIpKTsKLQogCWtlcm5lbF9lbnRyeSA9IChrZXJuZWxfZW50cnlfdCl2bWxpbnV4LmFkZHI7CiAjaWZkZWYgREVCVUcKIAlwcmludGYoICJrZXJuZWw6XG5cciIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvYm9vdC9ta25vdGUuYyBiL2FyY2gvcHBjNjQvYm9vdC9ta25vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwY2MxZC4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvbWtub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBDb3J0IERvdWdhbiAxOTk5LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogR2VuZXJhdGUgYSBub3RlIHNlY3Rpb24gYXMgcGVyIHRoZSBDSFJQIHNwZWNpZmljYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIFBMKHgpIHByaW50ZigiJWMlYyVjJWMiLCAoKHgpPj4yNCkmMHhmZiwgKCh4KT4+MTYpJjB4ZmYsICgoeCk+PjgpJjB4ZmYsICh4KSYweGZmICk7Ci0KLWludCBtYWluKHZvaWQpCi17Ci0vKiBoZWFkZXIgKi8KLQkvKiBuYW1lc3ogKi8KLQlQTChzdHJsZW4oIlBvd2VyUEMiKSsxKTsKLQkvKiBkZXNjcnN6ICovCi0JUEwoNio0KTsKLQkvKiB0eXBlICovCi0JUEwoMHgxMjc1KTsKLQkvKiBuYW1lICovCi0JcHJpbnRmKCJQb3dlclBDIik7IHByaW50ZigiJWMiLCAwKTsKLQkKLS8qIGRlc2NyaXB0b3IgKi8KLQkvKiByZWFsLW1vZGUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiByZWFsLWJhc2UgKi8KLQlQTCgweDAwYzAwMDAwKTsKLQkvKiByZWFsLXNpemUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiB2aXJ0LWJhc2UgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiB2aXJ0LXNpemUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiBsb2FkLWJhc2UgKi8KLQlQTCgweDQwMDApOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9ib290L3BpZ2d5YmFjay5jIGIvYXJjaC9wcGM2NC9ib290L3BpZ2d5YmFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVjN2E4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjNjQvYm9vdC9waWdneWJhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMSBJQk0gQ29ycCAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotZXh0ZXJuIGxvbmcgY2VfZXhlY19jb25maWdbXTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQgaSwgY250LCBwb3MsIGxlbjsKLQl1bnNpZ25lZCBpbnQgY2tzdW0sIHZhbDsKLQl1bnNpZ25lZCBjaGFyICpscDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls4MTkyXTsKLQljaGFyICp2YXJuYW1lOwotCWlmIChhcmdjICE9IDIpCi0JewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBuYW1lIDxpbi1maWxlID5vdXQtZmlsZVxuIiwKLQkJCWFyZ3ZbMF0pOwotCQlleGl0KDEpOwotCX0KLQotCXZhcm5hbWUgPSBzdHJyY2hyKGFyZ3ZbMV0sICcvJyk7Ci0JaWYgKHZhcm5hbWUpCi0JCXZhcm5hbWUrKzsKLQllbHNlCi0JCXZhcm5hbWUgPSBhcmd2WzFdOwotCi0JZnByaW50ZihzdGRvdXQsICIjXG4iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiMgTWlzY2VsbGFuZW91cyBkYXRhIHN0cnVjdHVyZXM6XG4iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiMgV0FSTklORyAtIHRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCFcbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiI1xuIik7Ci0JZnByaW50ZihzdGRvdXQsICJcbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiXHQuZGF0YVxuIik7Ci0JZnByaW50ZihzdGRvdXQsICJcdC5nbG9ibCAlc19kYXRhXG4iLCB2YXJuYW1lKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiVzX2RhdGE6XG4iLCB2YXJuYW1lKTsKLQlwb3MgPSAwOwotCWNrc3VtID0gMDsKLQl3aGlsZSAoKGxlbiA9IHJlYWQoMCwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkKLQl7Ci0JCWNudCA9IDA7Ci0JCWxwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7Ci0JCWxlbiA9IChsZW4gKyAzKSAmIH4zOyAgLyogUm91bmQgdXAgdG8gbG9uZ3dvcmRzICovCi0JCWZvciAoaSA9IDA7ICBpIDwgbGVuOyAgaSArPSA0KQotCQl7Ci0JCQlpZiAoY250ID09IDApCi0JCQl7Ci0JCQkJZnByaW50ZihzdGRvdXQsICJcdC5sb25nXHQiKTsKLQkJCX0KLQkJCWZwcmludGYoc3Rkb3V0LCAiMHglMDJYJTAyWCUwMlglMDJYIiwgbHBbMF0sIGxwWzFdLCBscFsyXSwgbHBbM10pOwotCQkJdmFsID0gKih1bnNpZ25lZCBsb25nICopbHA7Ci0JCQlja3N1bSBePSB2YWw7Ci0JCQlscCArPSA0OwotCQkJaWYgKCsrY250ID09IDQpCi0JCQl7Ci0JCQkJY250ID0gMDsKLQkJCQlmcHJpbnRmKHN0ZG91dCwgIiAjICV4IFxuIiwgcG9zK2ktMTIpOwotCQkJCWZmbHVzaChzdGRvdXQpOwotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJZnByaW50ZihzdGRvdXQsICIsIik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNudCkKLQkJewotCQkJZnByaW50ZihzdGRvdXQsICIwXG4iKTsKLQkJfQotCQlwb3MgKz0gbGVuOwotCX0KLQlmcHJpbnRmKHN0ZG91dCwgIlx0Lmdsb2JsICVzX2xlblxuIiwgdmFybmFtZSk7Ci0JZnByaW50ZihzdGRvdXQsICIlc19sZW46XHQubG9uZ1x0MHgleFxuIiwgdmFybmFtZSwgcG9zKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlmY2xvc2Uoc3Rkb3V0KTsKLQlmcHJpbnRmKHN0ZGVyciwgImNrc3VtID0gJXhcbiIsIGNrc3VtKTsKLQlleGl0KDApOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2Jvb3QvcHJvbS5jIGIvYXJjaC9wcGM2NC9ib290L3Byb20uYwppbmRleCBkNTIxOGIxLi41ZTQ4YjgwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvcHJvbS5jCisrKyBiL2FyY2gvcHBjNjQvYm9vdC9wcm9tLmMKQEAgLTQwLDcgKzQwLDcgQEAKIGludCBnZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwgaW50IGJ1Zmxlbik7CiB2b2lkIGNocnBib290KGludCBhMSwgaW50IGEyLCB2b2lkICpwcm9tKTsJLyogaW4gbWFpbi5jICovCiAKLXZvaWQgcHJpbnRrKGNoYXIgKmZtdCwgLi4uKTsKK2ludCBwcmludGYoY2hhciAqZm10LCAuLi4pOwogCiAvKiB0aGVyZSBpcyBubyBjb252ZW5pZW50IGhlYWRlciB0byBnZXQgdGhpcyBmcm9tLi4uICAtLSBwYXVsdXMgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHN0cmxlbihjb25zdCBjaGFyICopOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCWNhc2UgMToKIAkJCXJldHVybiBjaDsKIAkJY2FzZSAtMToKLQkJCXByaW50aygicmVhZChzdGRpbikgcmV0dXJuZWQgLTFcclxuIik7CisJCQlwcmludGYoInJlYWQoc3RkaW4pIHJldHVybmVkIC0xXHJcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtNjI3LDE4ICs2MjcsNiBAQAogCiBzdGF0aWMgY2hhciBzcHJpbnRfYnVmWzEwMjRdOwogCi12b2lkCi1wcmludGsoY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQluID0gdnNwcmludGYoc3ByaW50X2J1ZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0Jd3JpdGUoc3Rkb3V0LCBzcHJpbnRfYnVmLCBuKTsKLX0KLQogaW50CiBwcmludGYoY2hhciAqZm10LCAuLi4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9JdExwUXVldWUuYyBiL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCmluZGV4IGNkZWEwMGQuLjQyMzE4NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEl0THBRdWV1ZS5jCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAgSUJNIENvcnBvcmF0aW9uCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0xMSwxNTYgKzExLDI1MiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0THBRdWV1ZS5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBFdmVudC5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2Q2FsbEV2ZW50Lmg+CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBzZXRfaW5Vc2UoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKLXsKLQlpbnQgdDsKLQl1MzIgKiBpblVzZVAgPSAmKGxwUXVldWUtPnhJblVzZVdvcmQpOworLyoKKyAqIFRoZSBMcFF1ZXVlIGlzIHVzZWQgdG8gcGFzcyBldmVudCBkYXRhIGZyb20gdGhlIGh5cGVydmlzb3IgdG8KKyAqIHRoZSBwYXJ0aXRpb24uICBUaGlzIGlzIHdoZXJlIEkvTyBpbnRlcnJ1cHQgZXZlbnRzIGFyZSBjb21tdW5pY2F0ZWQuCisgKgorICogSXQgaXMgd3JpdHRlbiB0byBieSB0aGUgaHlwZXJ2aXNvciBzbyBjYW5ub3QgZW5kIHVwIGluIHRoZSBCU1MuCisgKi8KK3N0cnVjdCBodmxwZXZlbnRfcXVldWUgaHZscGV2ZW50X3F1ZXVlIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiXG5cCi0xOglsd2FyeAklMCwwLCUyCQlcblwKLQljbXB3aQkwLCUwLDAJCVxuXAotCWxpCSUwLDAJCVxuXAotCWJuZS0JMmYJCVxuXAotCWFkZGkJJTAsJTAsMQkJXG5cCi0Jc3R3Y3guCSUwLDAsJTIJCVxuXAotCWJuZS0JMWIJCVxuXAotMjoJZWllaW8iCi0JOiAiPSZyIiAodCksICI9bSIgKGxwUXVldWUtPnhJblVzZVdvcmQpCi0JOiAiciIgKGluVXNlUCksICJtIiAobHBRdWV1ZS0+eEluVXNlV29yZCkKLQk6ICJjYyIpOworREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZ1tIdkxwRXZlbnRfVHlwZV9OdW1UeXBlc10sIGh2bHBldmVudF9jb3VudHMpOwogCi0JcmV0dXJuIHQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2xlYXJfaW5Vc2UoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKLXsKLQlscFF1ZXVlLT54SW5Vc2VXb3JkID0gMDsKLX0KK3N0YXRpYyBjaGFyICpldmVudF90eXBlc1tIdkxwRXZlbnRfVHlwZV9OdW1UeXBlc10gPSB7CisJIkh5cGVydmlzb3IiLAorCSJNYWNoaW5lIEZhY2lsaXRpZXMiLAorCSJTZXNzaW9uIE1hbmFnZXIiLAorCSJTUEQgSS9PIiwKKwkiVmlydHVhbCBCdXMiLAorCSJQQ0kgSS9PIiwKKwkiUklPIEkvTyIsCisJIlZpcnR1YWwgTGFuIiwKKwkiVmlydHVhbCBJL08iCit9OwogCiAvKiBBcnJheSBvZiBMcEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zICovCiBleHRlcm4gTHBFdmVudEhhbmRsZXIgbHBFdmVudEhhbmRsZXJbSHZMcEV2ZW50X1R5cGVfTnVtVHlwZXNdOwotdW5zaWduZWQgbG9uZyBJdExwUXVldWVJblByb2Nlc3MgPSAwOwogCi1zdHJ1Y3QgSHZMcEV2ZW50ICogSXRMcFF1ZXVlX2dldE5leHRMcEV2ZW50KCBzdHJ1Y3QgSXRMcFF1ZXVlICogbHBRdWV1ZSApCitzdGF0aWMgc3RydWN0IEh2THBFdmVudCAqIGdldF9uZXh0X2h2bHBldmVudCh2b2lkKQogewotCXN0cnVjdCBIdkxwRXZlbnQgKiBuZXh0THBFdmVudCA9IAotCQkoc3RydWN0IEh2THBFdmVudCAqKWxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHI7Ci0JaWYgKCBuZXh0THBFdmVudC0+eEZsYWdzLnhWYWxpZCApIHsKKwlzdHJ1Y3QgSHZMcEV2ZW50ICogZXZlbnQ7CisJZXZlbnQgPSAoc3RydWN0IEh2THBFdmVudCAqKWh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyOworCisJaWYgKGV2ZW50LT54RmxhZ3MueFZhbGlkKSB7CiAJCS8qIHJtYigpIG5lZWRlZCBvbmx5IGZvciB3ZWFrbHkgY29uc2lzdGVudCBtYWNoaW5lcyAocmVnYXR0YSkgKi8KIAkJcm1iKCk7CiAJCS8qIFNldCBwb2ludGVyIHRvIG5leHQgcG90ZW50aWFsIGV2ZW50ICovCi0JCWxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHIgKz0gKChuZXh0THBFdmVudC0+eFNpemVNaW51czEgKwotCQkJCSAgICAgIExwRXZlbnRBbGlnbiApIC8KLQkJCQkgICAgICBMcEV2ZW50QWxpZ24gKSAqCi0JCQkJICAgICAgTHBFdmVudEFsaWduOworCQlodmxwZXZlbnRfcXVldWUueFNsaWNDdXJFdmVudFB0ciArPSAoKGV2ZW50LT54U2l6ZU1pbnVzMSArCisJCQkJTHBFdmVudEFsaWduKSAvIExwRXZlbnRBbGlnbikgKiBMcEV2ZW50QWxpZ247CisKIAkJLyogV3JhcCB0byBiZWdpbm5pbmcgaWYgbm8gcm9vbSBhdCBlbmQgKi8KLQkJaWYgKGxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHIgPiBscFF1ZXVlLT54U2xpY0xhc3RWYWxpZEV2ZW50UHRyKQotCQkJbHBRdWV1ZS0+eFNsaWNDdXJFdmVudFB0ciA9IGxwUXVldWUtPnhTbGljRXZlbnRTdGFja1B0cjsKKwkJaWYgKGh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyID4KKwkJCQlodmxwZXZlbnRfcXVldWUueFNsaWNMYXN0VmFsaWRFdmVudFB0cikgeworCQkJaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHIgPQorCQkJCWh2bHBldmVudF9xdWV1ZS54U2xpY0V2ZW50U3RhY2tQdHI7CisJCX0KKwl9IGVsc2UgeworCQlldmVudCA9IE5VTEw7CiAJfQotCWVsc2UgCi0JCW5leHRMcEV2ZW50ID0gTlVMTDsKIAotCXJldHVybiBuZXh0THBFdmVudDsKKwlyZXR1cm4gZXZlbnQ7CiB9CiAKLWludCBJdExwUXVldWVfaXNMcEludFBlbmRpbmcoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNwcmVhZF9scGV2ZW50cyA9IE5SX0NQVVM7CisKK2ludCBodmxwZXZlbnRfaXNfcGVuZGluZyh2b2lkKQogewotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCBIdkxwRXZlbnQgKiBuZXh0THBFdmVudDsKLQlpZiAoIGxwUXVldWUgKSB7Ci0JCW5leHRMcEV2ZW50ID0gKHN0cnVjdCBIdkxwRXZlbnQgKilscFF1ZXVlLT54U2xpY0N1ckV2ZW50UHRyOwotCQlyZXR2YWwgPSBuZXh0THBFdmVudC0+eEZsYWdzLnhWYWxpZCB8IGxwUXVldWUtPnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nOwotCX0KLQlyZXR1cm4gcmV0dmFsOworCXN0cnVjdCBIdkxwRXZlbnQgKm5leHRfZXZlbnQ7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID49IHNwcmVhZF9scGV2ZW50cykKKwkJcmV0dXJuIDA7CisKKwluZXh0X2V2ZW50ID0gKHN0cnVjdCBIdkxwRXZlbnQgKilodmxwZXZlbnRfcXVldWUueFNsaWNDdXJFdmVudFB0cjsKKworCXJldHVybiBuZXh0X2V2ZW50LT54RmxhZ3MueFZhbGlkIHwKKwkJaHZscGV2ZW50X3F1ZXVlLnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nOwogfQogCi12b2lkIEl0THBRdWV1ZV9jbGVhclZhbGlkKCBzdHJ1Y3QgSHZMcEV2ZW50ICogZXZlbnQgKQorc3RhdGljIHZvaWQgaHZscGV2ZW50X2NsZWFyX3ZhbGlkKHN0cnVjdCBIdkxwRXZlbnQgKiBldmVudCkKIHsKLQkvKiBDbGVhciB0aGUgdmFsaWQgYml0IG9mIHRoZSBldmVudAotCSAqIEFsc28gY2xlYXIgYml0cyB3aXRoaW4gdGhpcyBldmVudCB0aGF0IG1pZ2h0Ci0JICogbG9vayBsaWtlIHZhbGlkIGJpdHMgKG9uIDY0LWJ5dGUgYm91bmRhcmllcykKLSAgIAkgKi8KLQl1bnNpZ25lZCBleHRyYSA9ICgoIGV2ZW50LT54U2l6ZU1pbnVzMSArIExwRXZlbnRBbGlnbiApIC8KLQkJCQkJCSBMcEV2ZW50QWxpZ24gKSAtIDE7Ci0Jc3dpdGNoICggZXh0cmEgKSB7Ci0JICBjYXNlIDM6Ci0JICAgKChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50KzMqTHBFdmVudEFsaWduKSktPnhGbGFncy54VmFsaWQ9MDsKLQkgIGNhc2UgMjoKLQkgICAoKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQrMipMcEV2ZW50QWxpZ24pKS0+eEZsYWdzLnhWYWxpZD0wOwotCSAgY2FzZSAxOgotCSAgICgoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCsxKkxwRXZlbnRBbGlnbikpLT54RmxhZ3MueFZhbGlkPTA7Ci0JICBjYXNlIDA6Ci0JICAgOwkKKwkvKiBUZWxsIHRoZSBIeXBlcnZpc29yIHRoYXQgd2UncmUgZG9uZSB3aXRoIHRoaXMgZXZlbnQuCisJICogQWxzbyBjbGVhciBiaXRzIHdpdGhpbiB0aGlzIGV2ZW50IHRoYXQgbWlnaHQgbG9vayBsaWtlIHZhbGlkIGJpdHMuCisJICogaWUuIG9uIDY0LWJ5dGUgYm91bmRhcmllcy4KKwkgKi8KKwlzdHJ1Y3QgSHZMcEV2ZW50ICp0bXA7CisJdW5zaWduZWQgZXh0cmEgPSAoKGV2ZW50LT54U2l6ZU1pbnVzMSArIExwRXZlbnRBbGlnbikgLworCQkJCQkJIExwRXZlbnRBbGlnbikgLSAxOworCisJc3dpdGNoIChleHRyYSkgeworCWNhc2UgMzoKKwkJdG1wID0gKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQgKyAzICogTHBFdmVudEFsaWduKTsKKwkJdG1wLT54RmxhZ3MueFZhbGlkID0gMDsKKwljYXNlIDI6CisJCXRtcCA9IChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50ICsgMiAqIExwRXZlbnRBbGlnbik7CisJCXRtcC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJY2FzZSAxOgorCQl0bXAgPSAoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCArIDEgKiBMcEV2ZW50QWxpZ24pOworCQl0bXAtPnhGbGFncy54VmFsaWQgPSAwOwogCX0KKwogCW1iKCk7CisKIAlldmVudC0+eEZsYWdzLnhWYWxpZCA9IDA7CiB9CiAKLXVuc2lnbmVkIEl0THBRdWV1ZV9wcm9jZXNzKCBzdHJ1Y3QgSXRMcFF1ZXVlICogbHBRdWV1ZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQordm9pZCBwcm9jZXNzX2h2bHBldmVudHMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgbnVtSW50c1Byb2Nlc3NlZCA9IDA7Ci0Jc3RydWN0IEh2THBFdmVudCAqIG5leHRMcEV2ZW50OworCXN0cnVjdCBIdkxwRXZlbnQgKiBldmVudDsKIAogCS8qIElmIHdlIGhhdmUgcmVjdXJzZWQsIGp1c3QgcmV0dXJuICovCi0JaWYgKCAhc2V0X2luVXNlKCBscFF1ZXVlICkgKQotCQlyZXR1cm4gMDsKLQkKLQlpZiAoSXRMcFF1ZXVlSW5Qcm9jZXNzID09IDApCi0JCUl0THBRdWV1ZUluUHJvY2VzcyA9IDE7Ci0JZWxzZQotCQlCVUcoKTsKKwlpZiAoIXNwaW5fdHJ5bG9jaygmaHZscGV2ZW50X3F1ZXVlLmxvY2spKQorCQlyZXR1cm47CiAKIAlmb3IgKDs7KSB7Ci0JCW5leHRMcEV2ZW50ID0gSXRMcFF1ZXVlX2dldE5leHRMcEV2ZW50KCBscFF1ZXVlICk7Ci0JCWlmICggbmV4dExwRXZlbnQgKSB7Ci0JCQkvKiBDb3VudCBldmVudHMgdG8gcmV0dXJuIHRvIGNhbGxlcgotCQkJICogYW5kIGNvdW50IHByb2Nlc3NlZCBldmVudHMgaW4gbHBRdWV1ZQotIAkJCSAqLwotCQkJKytudW1JbnRzUHJvY2Vzc2VkOwotCQkJbHBRdWV1ZS0+eExwSW50Q291bnQrKzsJCQotCQkJLyogQ2FsbCBhcHByb3ByaWF0ZSBoYW5kbGVyIGhlcmUsIHBhc3NpbmcgCisJCWV2ZW50ID0gZ2V0X25leHRfaHZscGV2ZW50KCk7CisJCWlmIChldmVudCkgeworCQkJLyogQ2FsbCBhcHByb3ByaWF0ZSBoYW5kbGVyIGhlcmUsIHBhc3NpbmcKIAkJCSAqIGEgcG9pbnRlciB0byB0aGUgTHBFdmVudC4gIFRoZSBoYW5kbGVyCiAJCQkgKiBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZSBMcEV2ZW50IGlmIGl0CiAJCQkgKiBuZWVkcyBpdCBpbiBhIGJvdHRvbSBoYWxmLiAocGVyaGFwcyBmb3IKIAkJCSAqIGFuIEFDSykKLQkJCSAqCQotCQkJICogIEhhbmRsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgQUNLIHByb2Nlc3NpbmcgCisJCQkgKgorCQkJICogIEhhbmRsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgQUNLIHByb2Nlc3NpbmcKIAkJCSAqCiAJCQkgKiBUaGUgSHlwZXJ2aXNvciBndWFyYW50ZWVzIHRoYXQgTHBFdmVudHMgd2lsbAogCQkJICogb25seSBiZSBkZWxpdmVyZWQgd2l0aCB0eXBlcyB0aGF0IHdlIGhhdmUKIAkJCSAqIHJlZ2lzdGVyZWQgZm9yLCBzbyBubyB0eXBlIGNoZWNrIGlzIG5lY2Vzc2FyeQogCQkJICogaGVyZSEKLSAgCQkJICovCi0JCQlpZiAoIG5leHRMcEV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICkKLQkJCQlscFF1ZXVlLT54THBJbnRDb3VudEJ5VHlwZVtuZXh0THBFdmVudC0+eFR5cGVdKys7Ci0JCQlpZiAoIG5leHRMcEV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICYmCi0JCQkgICAgIGxwRXZlbnRIYW5kbGVyW25leHRMcEV2ZW50LT54VHlwZV0gKSAKLQkJCQlscEV2ZW50SGFuZGxlcltuZXh0THBFdmVudC0+eFR5cGVdKG5leHRMcEV2ZW50LCByZWdzKTsKKwkJCSAqLworCQkJaWYgKGV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzKQorCQkJCV9fZ2V0X2NwdV92YXIoaHZscGV2ZW50X2NvdW50cylbZXZlbnQtPnhUeXBlXSsrOworCQkJaWYgKGV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICYmCisJCQkJCWxwRXZlbnRIYW5kbGVyW2V2ZW50LT54VHlwZV0pCisJCQkJbHBFdmVudEhhbmRsZXJbZXZlbnQtPnhUeXBlXShldmVudCwgcmVncyk7CiAJCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5leHBlY3RlZCBMcCBFdmVudCB0eXBlPSVkXG4iLCBuZXh0THBFdmVudC0+eFR5cGUgKTsKLQkJCQotCQkJSXRMcFF1ZXVlX2NsZWFyVmFsaWQoIG5leHRMcEV2ZW50ICk7Ci0JCX0gZWxzZSBpZiAoIGxwUXVldWUtPnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nICkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJVbmV4cGVjdGVkIExwIEV2ZW50IHR5cGU9JWRcbiIsIGV2ZW50LT54VHlwZSApOworCisJCQlodmxwZXZlbnRfY2xlYXJfdmFsaWQoZXZlbnQpOworCQl9IGVsc2UgaWYgKGh2bHBldmVudF9xdWV1ZS54UGxpY092ZXJmbG93SW50UGVuZGluZykKIAkJCS8qCiAJCQkgKiBObyBtb3JlIHZhbGlkIGV2ZW50cy4gSWYgb3ZlcmZsb3cgZXZlbnRzIGFyZQogCQkJICogcGVuZGluZyBwcm9jZXNzIHRoZW0KIAkJCSAqLwotCQkJSHZDYWxsRXZlbnRfZ2V0T3ZlcmZsb3dMcEV2ZW50cyggbHBRdWV1ZS0+eEluZGV4KTsKKwkJCUh2Q2FsbEV2ZW50X2dldE92ZXJmbG93THBFdmVudHMoaHZscGV2ZW50X3F1ZXVlLnhJbmRleCk7CiAJCWVsc2UKIAkJCWJyZWFrOwogCX0KIAotCUl0THBRdWV1ZUluUHJvY2VzcyA9IDA7Ci0JbWIoKTsKLQljbGVhcl9pblVzZSggbHBRdWV1ZSApOwotCi0JZ2V0X3BhY2EoKS0+bHBldmVudF9jb3VudCArPSBudW1JbnRzUHJvY2Vzc2VkOwotCi0JcmV0dXJuIG51bUludHNQcm9jZXNzZWQ7CisJc3Bpbl91bmxvY2soJmh2bHBldmVudF9xdWV1ZS5sb2NrKTsKIH0KKworc3RhdGljIGludCBzZXRfc3ByZWFkX2xwZXZlbnRzKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7CisKKwkvKgorCSAqIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIHNoYXJlIGluIHByb2Nlc3NpbmcKKwkgKiBscCBldmVudHMuCisJICovCisJaWYgKCggdmFsID4gMCkgJiYgKHZhbCA8PSBOUl9DUFVTKSkgeworCQlzcHJlYWRfbHBldmVudHMgPSB2YWw7CisJCXByaW50aygibHBldmVudCBwcm9jZXNzaW5nIHNwcmVhZCBvdmVyICVsZCBwcm9jZXNzb3JzXG4iLCB2YWwpOworCX0gZWxzZSB7CisJCXByaW50aygiaW52YWxpZCBzcHJlYWRfbHBldmVudHMgJWxkXG4iLCB2YWwpOworCX0KKworCXJldHVybiAxOworfQorX19zZXR1cCgic3ByZWFkX2xwZXZlbnRzPSIsIHNldF9zcHJlYWRfbHBldmVudHMpOworCit2b2lkIHNldHVwX2h2bHBldmVudF9xdWV1ZSh2b2lkKQoreworCXZvaWQgKmV2ZW50U3RhY2s7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgcGFnZSBmb3IgdGhlIEV2ZW50IFN0YWNrLiBUaGUgSHlwZXJ2aXNvciBuZWVkcyB0aGUKKwkgKiBhYnNvbHV0ZSByZWFsIGFkZHJlc3MsIHNvIHdlIHN1YnRyYWN0IG91dCB0aGUgS0VSTkVMQkFTRSBhbmQgYWRkCisJICogaW4gdGhlIGFic29sdXRlIHJlYWwgYWRkcmVzcyBvZiB0aGUga2VybmVsIGxvYWQgYXJlYS4KKwkgKi8KKwlldmVudFN0YWNrID0gYWxsb2NfYm9vdG1lbV9wYWdlcyhMcEV2ZW50U3RhY2tTaXplKTsKKwltZW1zZXQoZXZlbnRTdGFjaywgMCwgTHBFdmVudFN0YWNrU2l6ZSk7CisKKwkvKiBJbnZva2UgdGhlIGh5cGVydmlzb3IgdG8gaW5pdGlhbGl6ZSB0aGUgZXZlbnQgc3RhY2sgKi8KKwlIdkNhbGxFdmVudF9zZXRMcEV2ZW50U3RhY2soMCwgZXZlbnRTdGFjaywgTHBFdmVudFN0YWNrU2l6ZSk7CisKKwlodmxwZXZlbnRfcXVldWUueFNsaWNFdmVudFN0YWNrUHRyID0gKGNoYXIgKilldmVudFN0YWNrOworCWh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyID0gKGNoYXIgKilldmVudFN0YWNrOworCWh2bHBldmVudF9xdWV1ZS54U2xpY0xhc3RWYWxpZEV2ZW50UHRyID0gKGNoYXIgKilldmVudFN0YWNrICsKKwkJCQkJKExwRXZlbnRTdGFja1NpemUgLSBMcEV2ZW50TWF4U2l6ZSk7CisJaHZscGV2ZW50X3F1ZXVlLnhJbmRleCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19scGV2ZW50c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgY3B1LCBpOworCXVuc2lnbmVkIGxvbmcgc3VtOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV90b3RhbHNbTlJfQ1BVU107CisKKwkvKiBGSVhNRTogZG8gd2UgY2FyZSB0aGF0IHRoZXJlJ3Mgbm8gbG9ja2luZyBoZXJlPyAqLworCXN1bSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJY3B1X3RvdGFsc1tjcHVdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzOyBpKyspIHsKKwkJCWNwdV90b3RhbHNbY3B1XSArPSBwZXJfY3B1KGh2bHBldmVudF9jb3VudHMsIGNwdSlbaV07CisJCX0KKwkJc3VtICs9IGNwdV90b3RhbHNbY3B1XTsKKwl9CisKKwlzZXFfcHJpbnRmKG0sICJMcEV2ZW50UXVldWUgMFxuIik7CisJc2VxX3ByaW50ZihtLCAiICBldmVudHMgcHJvY2Vzc2VkOlx0JWx1XG4iLCBzdW0pOworCisJZm9yIChpID0gMDsgaSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzOyArK2kpIHsKKwkJc3VtID0gMDsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCXN1bSArPSBwZXJfY3B1KGh2bHBldmVudF9jb3VudHMsIGNwdSlbaV07CisJCX0KKworCQlzZXFfcHJpbnRmKG0sICIgICAgJS0yMHMgJTEwbHVcbiIsIGV2ZW50X3R5cGVzW2ldLCBzdW0pOworCX0KKworCXNlcV9wcmludGYobSwgIlxuICBldmVudHMgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NvcjpcbiIpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc2VxX3ByaW50ZihtLCAiICAgIENQVSUwMmQgICUxMGx1XG4iLCBjcHUsIGNwdV90b3RhbHNbY3B1XSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19scGV2ZW50c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2xwZXZlbnRzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2xwZXZlbnRzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcHJvY19scGV2ZW50c19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xwZXZlbnRzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImlTZXJpZXMvbHBldmVudHMiLCBTX0lGUkVHfFNfSVJVR08sIE5VTEwpOworCWlmIChlKQorCQllLT5wcm9jX2ZvcHMgPSAmcHJvY19scGV2ZW50c19vcGVyYXRpb25zOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKHByb2NfbHBldmVudHNfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL0xwYXJEYXRhLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9McGFyRGF0YS5jCmluZGV4IGJhZGM1YTQuLjZmZmNmNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL0xwYXJEYXRhLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvTHBhckRhdGEuYwpAQCAtMjgsMTMgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vaVNlcmllcy9Jb0hyaVByb2Nlc3NvclZwZC5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0U3BDb21tQXJlYS5oPgogCi0vKiBUaGUgTHBRdWV1ZSBpcyB1c2VkIHRvIHBhc3MgZXZlbnQgZGF0YSBmcm9tIHRoZSBoeXBlcnZpc29yIHRvCi0gKiB0aGUgcGFydGl0aW9uLiAgVGhpcyBpcyB3aGVyZSBJL08gaW50ZXJydXB0IGV2ZW50cyBhcmUgY29tbXVuaWNhdGVkLgotICovCi0KLS8qIE1heSBiZSBmaWxsZWQgaW4gYnkgdGhlIGh5cGVydmlzb3Igc28gY2Fubm90IGVuZCB1cCBpbiB0aGUgQlNTICovCi1zdHJ1Y3QgSXRMcFF1ZXVlIHhJdExwUXVldWUgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKTsKLQogCiAvKiBUaGUgSHZSZWxlYXNlRGF0YSBpcyB0aGUgcm9vdCBvZiB0aGUgaW5mb3JtYXRpb24gc2hhcmVkIGJldHdlZW4gCiAgKiB0aGUgaHlwZXJ2aXNvciBhbmQgTGludXguICAKQEAgLTIwMCw3ICsxOTMsNyBAQAogCQkwLDAsMCwJCQkvKiAxMyAtIDE1ICovCiAJCXNpemVvZihzdHJ1Y3QgSW9IcmlQcm9jZXNzb3JWcGQpLC8qIDE2IGxlbmd0aCBvZiBQcm9jIFZwZCAqLwogCQkwLDAsMCwwLDAsMCwJCS8qIDE3IC0gMjIgICovCi0JCXNpemVvZihzdHJ1Y3QgSXRMcFF1ZXVlKSwvKiAgICAgMjMgbGVuZ3RoIG9mIExwIFF1ZXVlICovCisJCXNpemVvZihzdHJ1Y3QgaHZscGV2ZW50X3F1ZXVlKSwJLyogMjMgbGVuZ3RoIG9mIExwIFF1ZXVlICovCiAJCTAsMAkJCS8qIDI0IC0gMjUgKi8KIAkJfSwKIAkueFNsaWNWcGRBZHJzID0gewkJCS8qIFZQRCBhZGRyZXNzZXMgKi8KQEAgLTIxOCw3ICsyMTEsNyBAQAogCQkwLDAsMCwJCQkvKiAxMyAtIDE1ICovCiAJCSZ4SW9IcmlQcm9jZXNzb3JWcGQsCS8qICAgICAgMTYgUHJvYyBWcGQgKi8KIAkJMCwwLDAsMCwwLDAsCQkvKiAxNyAtIDIyICovCi0JCSZ4SXRMcFF1ZXVlLAkJLyogICAgICAyMyBMcCBRdWV1ZSAqLworCQkmaHZscGV2ZW50X3F1ZXVlLAkvKiAgICAgIDIzIExwIFF1ZXVlICovCiAJCTAsMAogCX0KIH07CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKaW5kZXggNDJmYzA4Yy4uMDQ4MmMwNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMzEsMTAgKzMxLDEzIEBACiAJICovCiAJbWZzcHIJcjAsU1BSTl9QVlIKIAlzcndpCXIwLHIwLDE2Ci0JY21wd2kJY3IwLHIwLDB4MzkKLQljbXB3aQljcjEscjAsMHgzYwotCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjErZXEKKwljbXB3aQlyMCwweDM5CisJYmVxCTFmCisJY21wd2kJcjAsMHgzYworCWJlcQkxZgorCWNtcHdpCXIwLDB4NDQKIAlibmVscgorMToKIAogCS8qIE1ha2Ugc3VyZSBISUQ0OnJtX2NpIGlzIG9mZiBiZWZvcmUgTU1VIGlzIHR1cm5lZCBvZmYsIHRoYXQgbGFyZ2UKIAkgKiBwYWdlcyBhcmUgZW5hYmxlZCB3aXRoIEhJRDQ6NjEgYW5kIGNsZWFyIEhJRDU6RENCWl9zaXplIGFuZApAQCAtMTMzLDEyICsxMzYsMTQgQEAKIAkvKiBXZSBvbmx5IGRlYWwgd2l0aCA5NzAgZm9yIG5vdyAqLwogCW1mc3ByCXIwLFNQUk5fUFZSCiAJc3J3aQlyMCxyMCwxNgotCWNtcHdpCWNyMCxyMCwweDM5Ci0JY21wd2kJY3IxLHIwLDB4M2MKLQljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCi0JYm5lCTFmCisJY21wd2kJcjAsMHgzOQorCWJlcQkxZgorCWNtcHdpCXIwLDB4M2MKKwliZXEJMWYKKwljbXB3aQlyMCwweDQ0CisJYm5lCTJmCiAKLQkvKiBTYXZlIEhJRDAsMSw0IGFuZCA1ICovCisxOgkvKiBTYXZlIEhJRDAsMSw0IGFuZCA1ICovCiAJbWZzcHIJcjMsU1BSTl9ISUQwCiAJc3RkCXIzLENTX0hJRDAocjUpCiAJbWZzcHIJcjMsU1BSTl9ISUQxCkBAIC0xNDgsNyArMTUzLDcgQEAKIAltZnNwcglyMyxTUFJOX0hJRDUKIAlzdGQJcjMsQ1NfSElENShyNSkKIAkKLTE6CisyOgogCW10Y3IJcjcKIAlibHIKIApAQCAtMTY1LDEyICsxNzAsMTQgQEAKIAkvKiBXZSBvbmx5IGRlYWwgd2l0aCA5NzAgZm9yIG5vdyAqLwogCW1mc3ByCXIwLFNQUk5fUFZSCiAJc3J3aQlyMCxyMCwxNgotCWNtcHdpCWNyMCxyMCwweDM5Ci0JY21wd2kJY3IxLHIwLDB4M2MKLQljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCi0JYm5lCTFmCisJY21wd2kJcjAsMHgzOQorCWJlcQkxZgorCWNtcHdpCXIwLDB4M2MKKwliZXEJMWYKKwljbXB3aQlyMCwweDQ0CisJYm5lbHIKIAotCS8qIEJlZm9yZSBhY2Nlc3NpbmcgbWVtb3J5LCB3ZSBtYWtlIHN1cmUgcm1fY2kgaXMgY2xlYXIgKi8KKzE6CS8qIEJlZm9yZSBhY2Nlc3NpbmcgbWVtb3J5LCB3ZSBtYWtlIHN1cmUgcm1fY2kgaXMgY2xlYXIgKi8KIAlsaQlyMCwwCiAJbWZzcHIJcjMsU1BSTl9ISUQ0CiAJcmxkaW1pCXIzLHIwLDQwLDIzCS8qIGNsZWFyIGJpdCAyMyAocm1fY2kpICovCkBAIC0yMjMsNiArMjMwLDUgQEAKIAltdHNwcglTUFJOX0hJRDUscjMKIAlzeW5jCiAJaXN5bmMKLTE6CiAJYmxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDFkMTYyYzcuLjc3Y2VjNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvY3B1dGFibGUuYwpAQCAtNDksMTYwICs0OSwyMzQgQEAKICNlbmRpZgogCiBzdHJ1Y3QgY3B1X3NwZWMJY3B1X3NwZWNzW10gPSB7Ci0gICAgewkvKiBQb3dlcjMgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDQwMDAwMCwgIlBPV0VSMyAoNjMwKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzgsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXIzKyAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwNDEwMDAwLCAiUE9XRVIzICg2MzArKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzgsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogTm9ydGhzdGFyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzMzAwMDAsICJSUzY0LUlJIChub3J0aHN0YXIpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUHVsc2FyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzNDAwMDAsICJSUzY0LUlJSSAocHVsc2FyKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIEktc3RhciAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzYwMDAwLCAiUlM2NC1JSUkgKGljZXN0YXIpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUy1zdGFyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzNzAwMDAsICJSUzY0LUlWIChzc3RhcikiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjMsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBQb3dlcjQgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDM1MDAwMCwgIlBPV0VSNCAoZ3ApIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXI0KyAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzgwMDAwLCAiUE9XRVI0KyAoZ3EpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUFBDOTcwICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzOTAwMDAsICJQUEM5NzAiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAotCQkgICAgQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcHBjOTcwLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUFBDOTcwRlggKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDNjMDAwMCwgIlBQQzk3MEZYIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJICAgIENQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3BwYzk3MCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBvd2VyNSAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwM2EwMDAwLCAiUE9XRVI1IChncikiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKLQkJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8Ci0JCSAgICBDUFVfRlRSX01NQ1JBX1NJSFYsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXI1ICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzYjAwMDAsICJQT1dFUjUgKGdzKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfAotCQkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwKLQkJICAgIENQVV9GVFJfTU1DUkFfU0lIViwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjQsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBCRSBERDEueCAgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDcwMDAwMCwgIkJyb2FkYmFuZCBFbmdpbmUiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAotCQkgICAgQ1BVX0ZUUl9TTVQsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X2JlLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogZGVmYXVsdCBtYXRjaCAqLwotCSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAiUE9XRVI0IChjb21wYXRpYmxlKSIsCi0gIAkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjQsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0KKwl7CS8qIFBvd2VyMyAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwNDAwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSMyAoNjMwKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcyA9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyMysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDQxMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCspIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKKwkJCUNQVV9GVFJfUE1DOCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogTm9ydGhzdGFyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzMzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSSAobm9ydGhzdGFyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQdWxzYXIgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM0MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJSUzY0LUlJSSAocHVsc2FyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBJLXN0YXIgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM2MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJSUzY0LUlJSSAoaWNlc3RhcikiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAorCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUy1zdGFyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzNzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JViAoc3N0YXIpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKKwkJCUNQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyNCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMzUwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNCAoZ3ApIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyNCsgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM4MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQrIChncSkiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUFBDOTcwICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzOTAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUFBDOTcwIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKKwkJCUNQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0IHwKKwkJCVBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUFBDOTcwRlggKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNjMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQUEM5NzBGWCIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBQQzk3ME1QICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA0NDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUFBDOTcwTVAiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAorCQkJQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjUgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNhMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUgKGdyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfAorCQkJQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwKKwkJCUNQVV9GVFJfTU1DUkFfU0lIViwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUG93ZXI1ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzYjAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI1IChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKKwkJCUNQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8CisJCQlDUFVfRlRSX01NQ1JBX1NJSFYsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIEJFIEREMS54ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA3MDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiQnJvYWRiYW5kIEVuZ2luZSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX1NNVCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X2JlLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KKwkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQgKGNvbXBhdGlibGUpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9CiB9OwogCiBmaXJtd2FyZV9mZWF0dXJlX3QgZmlybXdhcmVfZmVhdHVyZXNfdGFibGVbRklSTVdBUkVfTUFYX0ZFQVRVUkVTXSA9IHsKLSAgICB7RldfRkVBVFVSRV9QRlQsCQkiaGNhbGwtcGZ0In0sCi0gICAge0ZXX0ZFQVRVUkVfVENFLAkJImhjYWxsLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQUkcwLAkJImhjYWxsLXNwcmcwIn0sCi0gICAge0ZXX0ZFQVRVUkVfREFCUiwJCSJoY2FsbC1kYWJyIn0sCi0gICAge0ZXX0ZFQVRVUkVfQ09QWSwJCSJoY2FsbC1jb3B5In0sCi0gICAge0ZXX0ZFQVRVUkVfQVNSLAkJImhjYWxsLWFzciJ9LAotICAgIHtGV19GRUFUVVJFX0RFQlVHLAkJImhjYWxsLWRlYnVnIn0sCi0gICAge0ZXX0ZFQVRVUkVfUEVSRiwJCSJoY2FsbC1wZXJmIn0sCi0gICAge0ZXX0ZFQVRVUkVfRFVNUCwJCSJoY2FsbC1kdW1wIn0sCi0gICAge0ZXX0ZFQVRVUkVfSU5URVJSVVBULAkiaGNhbGwtaW50ZXJydXB0In0sCi0gICAge0ZXX0ZFQVRVUkVfTUlHUkFURSwJImhjYWxsLW1pZ3JhdGUifSwKLSAgICB7RldfRkVBVFVSRV9QRVJGTU9OLAkiaGNhbGwtcGVyZm1vbiJ9LAotICAgIHtGV19GRUFUVVJFX0NSUSwgICAgCSJoY2FsbC1jcnEifSwKLSAgICB7RldfRkVBVFVSRV9WSU8sCSAgICAgICAgImhjYWxsLXZpbyJ9LAotICAgIHtGV19GRUFUVVJFX1JETUEsCSAgICAgICAgImhjYWxsLXJkbWEifSwKLSAgICB7RldfRkVBVFVSRV9MTEFOLAkgICAgICAgICJoY2FsbC1sTEFOIn0sCi0gICAge0ZXX0ZFQVRVUkVfQlVMSywgICAJImhjYWxsLWJ1bGsifSwKLSAgICB7RldfRkVBVFVSRV9YREFCUiwgIAkiaGNhbGwteGRhYnIifSwKLSAgICB7RldfRkVBVFVSRV9NVUxUSVRDRSwJImhjYWxsLW11bHRpLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQTFBBUiwJICAgICAgICAiaGNhbGwtc3BscGFyIn0sCisJe0ZXX0ZFQVRVUkVfUEZULAkJImhjYWxsLXBmdCJ9LAorCXtGV19GRUFUVVJFX1RDRSwJCSJoY2FsbC10Y2UifSwKKwl7RldfRkVBVFVSRV9TUFJHMCwJCSJoY2FsbC1zcHJnMCJ9LAorCXtGV19GRUFUVVJFX0RBQlIsCQkiaGNhbGwtZGFiciJ9LAorCXtGV19GRUFUVVJFX0NPUFksCQkiaGNhbGwtY29weSJ9LAorCXtGV19GRUFUVVJFX0FTUiwJCSJoY2FsbC1hc3IifSwKKwl7RldfRkVBVFVSRV9ERUJVRywJCSJoY2FsbC1kZWJ1ZyJ9LAorCXtGV19GRUFUVVJFX1BFUkYsCQkiaGNhbGwtcGVyZiJ9LAorCXtGV19GRUFUVVJFX0RVTVAsCQkiaGNhbGwtZHVtcCJ9LAorCXtGV19GRUFUVVJFX0lOVEVSUlVQVCwJCSJoY2FsbC1pbnRlcnJ1cHQifSwKKwl7RldfRkVBVFVSRV9NSUdSQVRFLAkJImhjYWxsLW1pZ3JhdGUifSwKKwl7RldfRkVBVFVSRV9QRVJGTU9OLAkJImhjYWxsLXBlcmZtb24ifSwKKwl7RldfRkVBVFVSRV9DUlEsCQkiaGNhbGwtY3JxIn0sCisJe0ZXX0ZFQVRVUkVfVklPLAkJImhjYWxsLXZpbyJ9LAorCXtGV19GRUFUVVJFX1JETUEsCQkiaGNhbGwtcmRtYSJ9LAorCXtGV19GRUFUVVJFX0xMQU4sCQkiaGNhbGwtbExBTiJ9LAorCXtGV19GRUFUVVJFX0JVTEssCQkiaGNhbGwtYnVsayJ9LAorCXtGV19GRUFUVVJFX1hEQUJSLAkJImhjYWxsLXhkYWJyIn0sCisJe0ZXX0ZFQVRVUkVfTVVMVElUQ0UsCQkiaGNhbGwtbXVsdGktdGNlIn0sCisJe0ZXX0ZFQVRVUkVfU1BMUEFSLAkJImhjYWxsLXNwbHBhciJ9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwppbmRleCA2NzVjMjcwLi45M2ViY2FjMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwpAQCAtMzA4LDYgKzMwOCw3IEBACiBsYWJlbCMjX3BTZXJpZXM6CQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCVwKIAltdHNwcglTUFJHMSxyMTM7CQkvKiBzYXZlIHIxMyAqLwlcCisJUlVOTEFUQ0hfT04ocjEzKTsJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbikKIAogI2RlZmluZSBTVERfRVhDRVBUSU9OX0lTRVJJRVMobiwgbGFiZWwsIGFyZWEpCQlcCkBAIC0zMTUsNiArMzE2LDcgQEAKIGxhYmVsIyNfaVNlcmllczoJCQkJCVwKIAlITVRfTUVESVVNOwkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCVwKKwlSVU5MQVRDSF9PTihyMTMpOwkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzEoYXJlYSk7CQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzI7CQkJXAogCWIJbGFiZWwjI19jb21tb24KQEAgLTMyNCw2ICszMjYsNyBAQAogbGFiZWwjI19pU2VyaWVzOgkJCQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCQkJXAorCVJVTkxBVENIX09OKHIxMyk7CQkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18xKFBBQ0FfRVhHRU4pOwkJCQlcCiAJbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJCQkJXAogCWNtcHdpCTAscjEwLDA7CQkJCQkJXApAQCAtMzkzLDYgKzM5Niw3IEBACiBfbWFjaGluZV9jaGVja19wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCisJUlVOTEFUQ0hfT04ocjEzKQogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uKQogCiAJLiA9IDB4MzAwCkBAIC00MTksNiArNDIzLDcgQEAKIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMKKwlSVU5MQVRDSF9PTihyMTMpCiAJbWZzcHIJcjEzLFNQUkczCQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCiAJc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQkvKiBzYXZlIHI5IC0gcjEyICovCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMChyMTMpCkBAIC00MzksNiArNDQ0LDcgQEAKIGluc3RydWN0aW9uX2FjY2Vzc19zbGJfcFNlcmllczoKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCisJUlVOTEFUQ0hfT04ocjEzKQogCW1mc3ByCXIxMyxTUFJHMwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwogCXN0ZAlyOSxQQUNBX0VYU0xCK0VYX1I5KHIxMykJLyogc2F2ZSByOSAtIHIxMiAqLwogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQpAQCAtNDY0LDYgKzQ3MCw3IEBACiAJLmdsb2JsCXN5c3RlbV9jYWxsX3BTZXJpZXMKIHN5c3RlbV9jYWxsX3BTZXJpZXM6CiAJSE1UX01FRElVTQorCVJVTkxBVENIX09OKHI5KQogCW1yCXI5LHIxMwogCW1mbXNyCXIxMAogCW1mc3ByCXIxMyxTUFJHMwpAQCAtNzA3LDExICs3MTQsMTMgQEAKIHN5c3RlbV9yZXNldF9md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgc3lzdGVtX3Jlc2V0X2NvbW1vbikKIAkuZ2xvYmwgbWFjaGluZV9jaGVja19md25taQogbWFjaGluZV9jaGVja19md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWE1DLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKIAogCS8qCkBAIC04NDgsNiArODU3LDcgQEAKIAkuYWxpZ24JNwogCS5nbG9ibCBkYXRhX2FjY2Vzc19jb21tb24KIGRhdGFfYWNjZXNzX2NvbW1vbjoKKwlSVU5MQVRDSF9PTihyMTApCQkvKiBJdCB3b250IGZpdCBpbiB0aGUgMHgzMDAgaGFuZGxlciAqLwogCW1mc3ByCXIxMCxEQVIKIAlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKIAltZnNwcglyMTAsRFNJU1IKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2h2Y29uc29sZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKaW5kZXggYzcyZmI4Zi4uMTM4ZTEyOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIC8qKgogICogaHZjX2dldF9jaGFycyAtIHJldHJpZXZlIGNoYXJhY3RlcnMgZnJvbSBmaXJtd2FyZSBmb3IgZGVub3RlZCB2dGVybSBhZGF0cGVyCkBAIC00MiwyOSArNDEsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGdvdDsKIAogCWlmIChwbHBhcl9oY2FsbChIX0dFVF9URVJNX0NIQVIsIHZ0ZXJtbm8sIDAsIDAsIDAsICZnb3QsCi0JCSh1bnNpZ25lZCBsb25nICopYnVmLCAodW5zaWduZWQgbG9uZyAqKWJ1ZisxKSA9PSBIX1N1Y2Nlc3MpIHsKLQkJLyoKLQkJICogV29yayBhcm91bmQgYSBIViBidWcgd2hlcmUgaXQgZ2l2ZXMgdXMgYSBudWxsCi0JCSAqIGFmdGVyIGV2ZXJ5IFxyLiAgLS0gcGF1bHVzCi0JCSAqLwotCQlpZiAoZ290ID4gMCkgewotCQkJaW50IGk7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZ290OyArK2kpIHsKLQkJCQlpZiAoYnVmW2ldID09IDAgJiYgYnVmW2ktMV0gPT0gJ1xyJykgewotCQkJCQktLWdvdDsKLQkJCQkJaWYgKGkgPCBnb3QpCi0JCQkJCQltZW1tb3ZlKCZidWZbaV0sICZidWZbaSsxXSwKLQkJCQkJCQlnb3QgLSBpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJKHVuc2lnbmVkIGxvbmcgKilidWYsICh1bnNpZ25lZCBsb25nICopYnVmKzEpID09IEhfU3VjY2VzcykKIAkJcmV0dXJuIGdvdDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIEVYUE9SVF9TWU1CT0woaHZjX2dldF9jaGFycyk7CiAKKwogLyoqCiAgKiBodmNfcHV0X2NoYXJzOiBzZW5kIGNoYXJhY3RlcnMgdG8gZmlybXdhcmUgZm9yIGRlbm90ZWQgdnRlcm0gYWRhcHRlcgogICogQHZ0ZXJtbm86IFRoZSB2dGVybW5vIG9yIHVuaXRfYWRkcmVzcyBvZiB0aGUgYWRhcHRlciBmcm9tIHdoaWNoIHRoZSBkYXRhCkBAIC04OCwzNCArNzIsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGh2Y19wdXRfY2hhcnMpOwotCi0vKgotICogV2UgaG9wZS9hc3N1bWUgdGhhdCB0aGUgZmlyc3QgdnR5IGZvdW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBjb25zb2xlCi0gKiBkZXZpY2UuCi0gKi8KLWludCBodmNfZmluZF92dHlzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICp2dHk7Ci0JaW50IG51bV9mb3VuZCA9IDA7Ci0KLQlmb3IgKHZ0eSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2dHkiKTsgdnR5ICE9IE5VTEw7Ci0JCQl2dHkgPSBvZl9maW5kX25vZGVfYnlfbmFtZSh2dHksICJ2dHkiKSkgewotCQl1aW50MzJfdCAqdnRlcm1ubzsKLQotCQkvKiBXZSBoYXZlIHN0YXRpY2FsbHkgZGVmaW5lZCBzcGFjZSBmb3Igb25seSBhIGNlcnRhaW4gbnVtYmVyIG9mCi0JCSAqIGNvbnNvbGUgYWRhcHRlcnMuICovCi0JCWlmIChudW1fZm91bmQgPj0gTUFYX05SX0hWQ19DT05TT0xFUykKLQkJCWJyZWFrOwotCi0JCXZ0ZXJtbm8gPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAicmVnIiwgTlVMTCk7Ci0JCWlmICghdnRlcm1ubykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZSh2dHksICJodnRlcm0xIikpIHsKLQkJCWh2Y19pbnN0YW50aWF0ZSgqdnRlcm1ubywgbnVtX2ZvdW5kKTsKLQkJCSsrbnVtX2ZvdW5kOwotCQl9Ci0JfQotCi0JcmV0dXJuIG51bV9mb3VuZDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfaHRhYi5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKaW5kZXggYWE5ZThmZC4uYjAyNTBhZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKQEAgLTM4LDExICszOCwxMiBAQAogfQogCiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwgdW5zaWduZWQgbG9uZyB2YSwKLQkJCSB1bnNpZ25lZCBsb25nIHBycG4sIGludCBzZWNvbmRhcnksCi0JCQkgdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsIGludCBib2x0ZWQsIGludCBsYXJnZSkKKwkJCQl1bnNpZ25lZCBsb25nIHBycG4sIHVuc2lnbmVkIGxvbmcgdmZsYWdzLAorCQkJCXVuc2lnbmVkIGxvbmcgcmZsYWdzKQogewogCWxvbmcgc2xvdDsKLQlIUFRFIGxocHRlOworCWhwdGVfdCBsaHB0ZTsKKwlpbnQgc2Vjb25kYXJ5ID0gMDsKIAogCS8qCiAJICogVGhlIGh5cGVydmlzb3IgdHJpZXMgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkuCkBAIC01MCwxMyArNTEsMTMgQEAKIAkgKiBpdCBtZWFucyB3ZSBoYXZlIGFscmVhZHkgdHJpZWQgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnksCiAJICogc28gd2UgcmV0dXJuIGZhaWx1cmUgaW1tZWRpYXRlbHkuCiAJICovCi0JaWYgKHNlY29uZGFyeSkKKwlpZiAodmZsYWdzICYgSFBURV9WX1NFQ09OREFSWSkKIAkJcmV0dXJuIC0xOwogCiAJaVNlcmllc19obG9jayhocHRlX2dyb3VwKTsKIAogCXNsb3QgPSBIdkNhbGxIcHRfZmluZFZhbGlkKCZsaHB0ZSwgdmEgPj4gUEFHRV9TSElGVCk7Ci0JQlVHX09OKGxocHRlLmR3MC5kdzAudik7CisJQlVHX09OKGxocHRlLnYgJiBIUFRFX1ZfVkFMSUQpOwogCiAJaWYgKHNsb3QgPT0gLTEpCXsgLyogTm8gYXZhaWxhYmxlIGVudHJ5IGZvdW5kIGluIGVpdGhlciBncm91cCAqLwogCQlpU2VyaWVzX2h1bmxvY2soaHB0ZV9ncm91cCk7CkBAIC02NCwxOSArNjUsMTMgQEAKIAl9CiAKIAlpZiAoc2xvdCA8IDApIHsJCS8qIE1TQiBzZXQgbWVhbnMgc2Vjb25kYXJ5IGdyb3VwICovCisJCXZmbGFncyB8PSBIUFRFX1ZfVkFMSUQ7CiAJCXNlY29uZGFyeSA9IDE7CiAJCXNsb3QgJj0gMHg3ZmZmZmZmZmZmZmZmZmZmOwogCX0KIAotCWxocHRlLmR3MS5kd29yZDEgICAgICA9IDA7Ci0JbGhwdGUuZHcxLmR3MS5ycG4gICAgID0gcGh5c1Jwbl90b19hYnNScG4ocHJwbik7Ci0JbGhwdGUuZHcxLmZsYWdzLmZsYWdzID0gaHB0ZWZsYWdzOwotCi0JbGhwdGUuZHcwLmR3b3JkMCAgICAgID0gMDsKLQlsaHB0ZS5kdzAuZHcwLmF2cG4gICAgPSB2YSA+PiAyMzsKLQlsaHB0ZS5kdzAuZHcwLmggICAgICAgPSBzZWNvbmRhcnk7Ci0JbGhwdGUuZHcwLmR3MC5ib2x0ZWQgID0gYm9sdGVkOwotCWxocHRlLmR3MC5kdzAudiAgICAgICA9IDE7CisJbGhwdGUudiA9ICh2YSA+PiAyMykgPDwgSFBURV9WX0FWUE5fU0hJRlQgfCB2ZmxhZ3MgfCBIUFRFX1ZfVkFMSUQ7CisJbGhwdGUuciA9IChwaHlzUnBuX3RvX2Fic1JwbihwcnBuKSA8PCBIUFRFX1JfUlBOX1NISUZUKSB8IHJmbGFnczsKIAogCS8qIE5vdyBmaWxsIGluIHRoZSBhY3R1YWwgSFBURSAqLwogCUh2Q2FsbEhwdF9hZGRWYWxpZGF0ZShzbG90LCBzZWNvbmRhcnksICZsaHB0ZSk7CkBAIC04OCwyMCArODMsMTcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaVNlcmllc19ocHRlX2dldHdvcmQwKHVuc2lnbmVkIGxvbmcgc2xvdCkKIHsKLQl1bnNpZ25lZCBsb25nIGR3b3JkMDsKLQlIUFRFIGhwdGU7CisJaHB0ZV90IGhwdGU7CiAKIAlIdkNhbGxIcHRfZ2V0KCZocHRlLCBzbG90KTsKLQlkd29yZDAgPSBocHRlLmR3MC5kd29yZDA7Ci0KLQlyZXR1cm4gZHdvcmQwOworCXJldHVybiBocHRlLnY7CiB9CiAKIHN0YXRpYyBsb25nIGlTZXJpZXNfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdF9vZmZzZXQ7CiAJaW50IGk7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAogCS8qIFBpY2sgYSByYW5kb20gc2xvdCB0byBzdGFydCBhdCAqLwogCXNsb3Rfb2Zmc2V0ID0gbWZ0YigpICYgMHg3OwpAQCAtMTA5LDEwICsxMDEsOSBAQAogCWlTZXJpZXNfaGxvY2soaHB0ZV9ncm91cCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFBURVNfUEVSX0dST1VQOyBpKyspIHsKLQkJbGhwdGUuZHcwLmR3b3JkMCA9IAotCQkJaVNlcmllc19ocHRlX2dldHdvcmQwKGhwdGVfZ3JvdXAgKyBzbG90X29mZnNldCk7CisJCWhwdGVfdiA9IGlTZXJpZXNfaHB0ZV9nZXR3b3JkMChocHRlX2dyb3VwICsgc2xvdF9vZmZzZXQpOwogCi0JCWlmICghbGhwdGUuZHcwLmR3MC5ib2x0ZWQpIHsKKwkJaWYgKCEgKGhwdGVfdiAmIEhQVEVfVl9CT0xURUQpKSB7CiAJCQlIdkNhbGxIcHRfaW52YWxpZGF0ZVNldFN3Qml0c0dldChocHRlX2dyb3VwICsgCiAJCQkJCQkJIHNsb3Rfb2Zmc2V0LCAwLCAwKTsKIAkJCWlTZXJpZXNfaHVubG9jayhocHRlX2dyb3VwKTsKQEAgLTEzNywxMyArMTI4LDEzIEBACiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfdXBkYXRlcHAodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIG5ld3BwLAogCQkJCSAgdW5zaWduZWQgbG9uZyB2YSwgaW50IGxhcmdlLCBpbnQgbG9jYWwpCiB7Ci0JSFBURSBocHRlOworCWhwdGVfdCBocHRlOwogCXVuc2lnbmVkIGxvbmcgYXZwbiA9IHZhID4+IDIzOwogCiAJaVNlcmllc19obG9jayhzbG90KTsKIAogCUh2Q2FsbEhwdF9nZXQoJmhwdGUsIHNsb3QpOwotCWlmICgoaHB0ZS5kdzAuZHcwLmF2cG4gPT0gYXZwbikgJiYgKGhwdGUuZHcwLmR3MC52KSkgeworCWlmICgoSFBURV9WX0FWUE5fVkFMKGhwdGUudikgPT0gYXZwbikgJiYgKGhwdGUudiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJLyoKIAkJICogSHlwZXJ2aXNvciBleHBlY3RzIGJpdHMgYXMgTlBQUCwgd2hpY2ggaXMKIAkJICogZGlmZmVyZW50IGZyb20gaG93IHRoZXkgYXJlIG1hcHBlZCBpbiBvdXIgUFAuCkBAIC0xNjcsNyArMTU4LDcgQEAKICAqLwogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2cG4pCiB7Ci0JSFBURSBocHRlOworCWhwdGVfdCBocHRlOwogCWxvbmcgc2xvdDsKIAogCS8qCkBAIC0xNzcsNyArMTY4LDcgQEAKIAkgKiAweDgwMDAwMDAweHh4eHh4eHggOiBFbnRyeSBmb3VuZCBpbiBzZWNvbmRhcnkgZ3JvdXAsIHNsb3QgeAogCSAqLwogCXNsb3QgPSBIdkNhbGxIcHRfZmluZFZhbGlkKCZocHRlLCB2cG4pOyAKLQlpZiAoaHB0ZS5kdzAuZHcwLnYpIHsKKwlpZiAoaHB0ZS52ICYgSFBURV9WX1ZBTElEKSB7CiAJCWlmIChzbG90IDwgMCkgewogCQkJc2xvdCAmPSAweDdmZmZmZmZmZmZmZmZmZmY7CiAJCQlzbG90ID0gLXNsb3Q7CkBAIC0yMTIsNyArMjAzLDcgQEAKIHN0YXRpYyB2b2lkIGlTZXJpZXNfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICAgaW50IGxhcmdlLCBpbnQgbG9jYWwpCiB7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIGF2cG4gPSB2YSA+PiAyMzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMjAsOSArMjExLDkgQEAKIAogCWlTZXJpZXNfaGxvY2soc2xvdCk7CiAKLQlsaHB0ZS5kdzAuZHdvcmQwID0gaVNlcmllc19ocHRlX2dldHdvcmQwKHNsb3QpOworCWhwdGVfdiA9IGlTZXJpZXNfaHB0ZV9nZXR3b3JkMChzbG90KTsKIAkKLQlpZiAoKGxocHRlLmR3MC5kdzAuYXZwbiA9PSBhdnBuKSAmJiBsaHB0ZS5kdzAuZHcwLnYpCisJaWYgKChIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KSA9PSBhdnBuKSAmJiAoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSkKIAkJSHZDYWxsSHB0X2ludmFsaWRhdGVTZXRTd0JpdHNHZXQoc2xvdCwgMCwgMCk7CiAKIAlpU2VyaWVzX2h1bmxvY2soc2xvdCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3Byb2MuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCmluZGV4IDM1NmJkOTkuLjBmZTMxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCkBAIC00MCw1MCArNDAsNiBAQAogfQogY29yZV9pbml0Y2FsbChpc2VyaWVzX3Byb2NfY3JlYXRlKTsKIAotc3RhdGljIGNoYXIgKmV2ZW50X3R5cGVzWzldID0gewotCSJIeXBlcnZpc29yXHRcdCIsCi0JIk1hY2hpbmUgRmFjaWxpdGllc1x0IiwKLQkiU2Vzc2lvbiBNYW5hZ2VyXHQiLAotCSJTUEQgSS9PXHRcdCIsCi0JIlZpcnR1YWwgQnVzXHRcdCIsCi0JIlBDSSBJL09cdFx0IiwKLQkiUklPIEkvT1x0XHQiLAotCSJWaXJ0dWFsIExhblx0XHQiLAotCSJWaXJ0dWFsIEkvT1x0XHQiCi19OwotCi1zdGF0aWMgaW50IHByb2NfbHBldmVudHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlzZXFfcHJpbnRmKG0sICJMcEV2ZW50UXVldWUgMFxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiICBldmVudHMgcHJvY2Vzc2VkOlx0JWx1XG4iLAotCQkgICAodW5zaWduZWQgbG9uZyl4SXRMcFF1ZXVlLnhMcEludENvdW50KTsKLQotCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCi0JCXNlcV9wcmludGYobSwgIiAgICAlcyAlMTBsdVxuIiwgZXZlbnRfdHlwZXNbaV0sCi0JCQkgICAodW5zaWduZWQgbG9uZyl4SXRMcFF1ZXVlLnhMcEludENvdW50QnlUeXBlW2ldKTsKLQotCXNlcV9wcmludGYobSwgIlxuICBldmVudHMgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NvcjpcbiIpOwotCi0JZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQlzZXFfcHJpbnRmKG0sICIgICAgQ1BVJTAyZCAgJTEwdVxuIiwgaSwgcGFjYVtpXS5scGV2ZW50X2NvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByb2NfbHBldmVudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19scGV2ZW50c19zaG93LCBOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19scGV2ZW50c19vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHByb2NfbHBldmVudHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RhcnRUaXRhbiA9IDA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGFydFRiID0gMDsKIApAQCAtMTQ4LDEwICsxMDQsNiBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKIAotCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiaVNlcmllcy9scGV2ZW50cyIsIFNfSUZSRUd8U19JUlVHTywgTlVMTCk7Ci0JaWYgKGUpCi0JCWUtPnByb2NfZm9wcyA9ICZwcm9jX2xwZXZlbnRzX29wZXJhdGlvbnM7Ci0KIAllID0gY3JlYXRlX3Byb2NfZW50cnkoImlTZXJpZXMvdGl0YW5Ub2QiLCBTX0lGUkVHfFNfSVJVR08sIE5VTEwpOwogCWlmIChlKQogCQllLT5wcm9jX2ZvcHMgPSAmcHJvY190aXRhbnRvZF9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19zZXR1cC5jCmluZGV4IDg2OTY2Y2UuLmE2NDllZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3NldHVwLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgpAQCAtNTA0LDcgKzUwMyw3IEBACiAKIAkvKiBGaWxsIGluIHRoZSBoYXNoZWQgcGFnZSB0YWJsZSBoYXNoIG1hc2sgKi8KIAludW1fcHRlZ3MgPSBocHRTaXplUGFnZXMgKgotCQkoUEFHRV9TSVpFIC8gKHNpemVvZihIUFRFKSAqIEhQVEVTX1BFUl9HUk9VUCkpOworCQkoUEFHRV9TSVpFIC8gKHNpemVvZihocHRlX3QpICogSFBURVNfUEVSX0dST1VQKSk7CiAJaHRhYl9oYXNoX21hc2sgPSBudW1fcHRlZ3MgLSAxOwogCiAJLyoKQEAgLTYxOSwyNSArNjE4LDIzIEBACiBzdGF0aWMgdm9pZCBpU2VyaWVzX21ha2VfcHRlKHVuc2lnbmVkIGxvbmcgdmEsIHVuc2lnbmVkIGxvbmcgcGEsCiAJCQkgICAgIGludCBtb2RlKQogewotCUhQVEUgbG9jYWxfaHB0ZSwgcmhwdGU7CisJaHB0ZV90IGxvY2FsX2hwdGUsIHJocHRlOwogCXVuc2lnbmVkIGxvbmcgaGFzaCwgdnBuOwogCWxvbmcgc2xvdDsKIAogCXZwbiA9IHZhID4+IFBBR0VfU0hJRlQ7CiAJaGFzaCA9IGhwdF9oYXNoKHZwbiwgMCk7CiAKLQlsb2NhbF9ocHRlLmR3MS5kd29yZDEgPSBwYSB8IG1vZGU7Ci0JbG9jYWxfaHB0ZS5kdzAuZHdvcmQwID0gMDsKLQlsb2NhbF9ocHRlLmR3MC5kdzAuYXZwbiA9IHZhID4+IDIzOwotCWxvY2FsX2hwdGUuZHcwLmR3MC5ib2x0ZWQgPSAxOwkJLyogYm9sdGVkICovCi0JbG9jYWxfaHB0ZS5kdzAuZHcwLnYgPSAxOworCWxvY2FsX2hwdGUuciA9IHBhIHwgbW9kZTsKKwlsb2NhbF9ocHRlLnYgPSAoKHZhID4+IDIzKSA8PCBIUFRFX1ZfQVZQTl9TSElGVCkKKwkJfCBIUFRFX1ZfQk9MVEVEIHwgSFBURV9WX1ZBTElEOwogCiAJc2xvdCA9IEh2Q2FsbEhwdF9maW5kVmFsaWQoJnJocHRlLCB2cG4pOwogCWlmIChzbG90IDwgMCkgewogCQkvKiBNdXN0IGZpbmQgc3BhY2UgaW4gcHJpbWFyeSBncm91cCAqLwogCQlwYW5pYygiaGFzaF9wYWdlOiBocHRlIGFscmVhZHkgZXhpc3RzXG4iKTsKIAl9Ci0JSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHNsb3QsIDAsIChIUFRFICopJmxvY2FsX2hwdGUgKTsKKwlIdkNhbGxIcHRfYWRkVmFsaWRhdGUoc2xvdCwgMCwgJmxvY2FsX2hwdGUpOwogfQogCiAvKgpAQCAtNjQ3LDcgKzY0NCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwYTsKIAl1bnNpZ25lZCBsb25nIG1vZGVfcncgPSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0NPSEVSRU5UIHwgUFBfUldYWDsKLQlIUFRFIGhwdGU7CisJaHB0ZV90IGhwdGU7CiAKIAlmb3IgKHBhID0gc2FkZHI7IHBhIDwgZWFkZHIgO3BhICs9IFBBR0VfU0laRSkgewogCQl1bnNpZ25lZCBsb25nIGVhID0gKHVuc2lnbmVkIGxvbmcpX192YShwYSk7CkBAIC02NjAsNyArNjU3LDcgQEAKIAkJaWYgKCFpbl9rZXJuZWxfdGV4dChlYSkpCiAJCQltb2RlX3J3IHw9IEhXX05PX0VYRUM7CiAKLQkJaWYgKGhwdGUuZHcwLmR3MC52KSB7CisJCWlmIChocHRlLnYgJiBIUFRFX1ZfVkFMSUQpIHsKIAkJCS8qIEhQVEUgZXhpc3RzLCBzbyBqdXN0IGJvbHQgaXQgKi8KIAkJCUh2Q2FsbEhwdF9zZXRTd0JpdHMoc2xvdCwgMHgxMCwgMCk7CiAJCQkvKiBBbmQgbWFrZSBzdXJlIHRoZSBwcCBiaXRzIGFyZSBjb3JyZWN0ICovCkBAIC02NzYsNyArNjczLDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGlTZXJpZXNfc2V0dXBfYXJjaCh2b2lkKQogewotCXZvaWQgKmV2ZW50U3RhY2s7CiAJdW5zaWduZWQgcHJvY0l4ID0gZ2V0X3BhY2EoKS0+bHBwYWNhLmR5bl9odl9waHlzX3Byb2NfaW5kZXg7CiAKIAkvKiBBZGQgYW4gZXllIGNhdGNoZXIgYW5kIHRoZSBzeXN0ZW1jZmcgbGF5b3V0IHZlcnNpb24gbnVtYmVyICovCkBAIC02ODUsMjQgKzY4MSw3IEBACiAJc3lzdGVtY2ZnLT52ZXJzaW9uLm1pbm9yID0gU1lTVEVNQ0ZHX01JTk9SOwogCiAJLyogU2V0dXAgdGhlIExwIEV2ZW50IFF1ZXVlICovCi0KLQkvKiBBbGxvY2F0ZSBhIHBhZ2UgZm9yIHRoZSBFdmVudCBTdGFjawotCSAqIFRoZSBoeXBlcnZpc29yIHdhbnRzIHRoZSBhYnNvbHV0ZSByZWFsIGFkZHJlc3MsIHNvCi0JICogd2Ugc3VidHJhY3Qgb3V0IHRoZSBLRVJORUxCQVNFIGFuZCBhZGQgaW4gdGhlCi0JICogYWJzb2x1dGUgcmVhbCBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgbG9hZCBhcmVhCi0JICovCi0JZXZlbnRTdGFjayA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoTHBFdmVudFN0YWNrU2l6ZSk7Ci0JbWVtc2V0KGV2ZW50U3RhY2ssIDAsIExwRXZlbnRTdGFja1NpemUpOwotCi0JLyogSW52b2tlIHRoZSBoeXBlcnZpc29yIHRvIGluaXRpYWxpemUgdGhlIGV2ZW50IHN0YWNrICovCi0JSHZDYWxsRXZlbnRfc2V0THBFdmVudFN0YWNrKDAsIGV2ZW50U3RhY2ssIExwRXZlbnRTdGFja1NpemUpOwotCi0JLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gb3VyIExwIEV2ZW50IFF1ZXVlICovCi0JeEl0THBRdWV1ZS54U2xpY0V2ZW50U3RhY2tQdHIgPSAoY2hhciAqKWV2ZW50U3RhY2s7Ci0JeEl0THBRdWV1ZS54U2xpY0N1ckV2ZW50UHRyID0gKGNoYXIgKilldmVudFN0YWNrOwotCXhJdExwUXVldWUueFNsaWNMYXN0VmFsaWRFdmVudFB0ciA9IChjaGFyICopZXZlbnRTdGFjayArCi0JCQkJCShMcEV2ZW50U3RhY2tTaXplIC0gTHBFdmVudE1heFNpemUpOwotCXhJdExwUXVldWUueEluZGV4ID0gMDsKKwlzZXR1cF9odmxwZXZlbnRfcXVldWUoKTsKIAogCS8qIENvbXB1dGUgcHJvY2Vzc29yIGZyZXF1ZW5jeSAqLwogCXByb2NGcmVxSHogPSAoKDFVTCA8PCAzNCkgKiAxMDAwMDAwKSAvCkBAIC04NTMsMjcgKzgzMiw5MSBAQAogCiBsYXRlX2luaXRjYWxsKGlTZXJpZXNfc3JjX2luaXQpOwogCi1zdGF0aWMgaW50IHNldF9zcHJlYWRfbHBldmVudHMoY2hhciAqc3RyKQorc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfaVNlcmllc19ldmVudHModm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworCWFzbSB2b2xhdGlsZSAoImxpIDAsMHg1NTU1OyBzYyIgOiA6IDogInIwIiwgInIzIik7Cit9CisKK3N0YXRpYyB2b2lkIHlpZWxkX3NoYXJlZF9wcm9jZXNzb3Iodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRiOworCisJSHZDYWxsX3NldEVuYWJsZWRJbnRlcnJ1cHRzKEh2Q2FsbF9NYXNrSVBJIHwKKwkJCQkgICAgSHZDYWxsX01hc2tMcEV2ZW50IHwKKwkJCQkgICAgSHZDYWxsX01hc2tMcFByb2QgfAorCQkJCSAgICBIdkNhbGxfTWFza1RpbWVvdXQpOworCisJdGIgPSBnZXRfdGIoKTsKKwkvKiBDb21wdXRlIGZ1dHVyZSB0YiB2YWx1ZSB3aGVuIHlpZWxkIHNob3VsZCBleHBpcmUgKi8KKwlIdkNhbGxfeWllbGRQcm9jZXNzb3IoSHZDYWxsX1lpZWxkVGltZWQsIHRiK3RiX3RpY2tzX3Blcl9qaWZmeSk7CiAKIAkvKgotCSAqIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIHNoYXJlIGluIHByb2Nlc3NpbmcKLQkgKiBscCBldmVudHMuCisJICogVGhlIGRlY3JlbWVudGVyIHN0b3BzIGR1cmluZyB0aGUgeWllbGQuICBGb3JjZSBhIGZha2UgZGVjcmVtZW50ZXIKKwkgKiBoZXJlIGFuZCBsZXQgdGhlIHRpbWVyX2ludGVycnVwdCBjb2RlIHNvcnQgb3V0IHRoZSBhY3R1YWwgdGltZS4KIAkgKi8KLQlpZiAoKCB2YWwgPiAwKSAmJiAodmFsIDw9IE5SX0NQVVMpKSB7Ci0JCWZvciAoaSA9IDE7IGkgPCB2YWw7ICsraSkKLQkJCXBhY2FbaV0ubHBxdWV1ZV9wdHIgPSBwYWNhWzBdLmxwcXVldWVfcHRyOworCWdldF9wYWNhKCktPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMTsKKwlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7Cit9CiAKLQkJcHJpbnRrKCJscGV2ZW50IHByb2Nlc3Npbmcgc3ByZWFkIG92ZXIgJWxkIHByb2Nlc3NvcnNcbiIsIHZhbCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJpbnZhbGlkIHNwcmVhZF9scGV2ZW50cyAlbGRcbiIsIHZhbCk7CitzdGF0aWMgaW50IGlzZXJpZXNfc2hhcmVkX2lkbGUodm9pZCkKK3sKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFodmxwZXZlbnRfaXNfcGVuZGluZygpKSB7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisKKwkJCS8qIFJlY2hlY2sgd2l0aCBpcnFzIG9mZiAqLworCQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKKwkJCQl5aWVsZF9zaGFyZWRfcHJvY2Vzc29yKCk7CisKKwkJCUhNVF9tZWRpdW0oKTsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJfQorCisJCXBwYzY0X3J1bmxhdGNoX29uKCk7CisKKwkJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7CisKKwkJc2NoZWR1bGUoKTsKIAl9CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KLV9fc2V0dXAoInNwcmVhZF9scGV2ZW50cz0iLCBzZXRfc3ByZWFkX2xwZXZlbnRzKTsKKworc3RhdGljIGludCBpc2VyaWVzX2RlZGljYXRlZF9pZGxlKHZvaWQpCit7CisJbG9uZyBvbGR2YWw7CisKKwl3aGlsZSAoMSkgeworCQlvbGR2YWwgPSB0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKTsKKworCQlpZiAoIW9sZHZhbCkgeworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisKKwkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKwkJCQlITVRfbG93KCk7CisKKwkJCQlpZiAoaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkgeworCQkJCQlITVRfbWVkaXVtKCk7CisJCQkJCXBwYzY0X3J1bmxhdGNoX29uKCk7CisJCQkJCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKKwkJCQl9CisJCQl9CisKKwkJCUhNVF9tZWRpdW0oKTsKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCX0gZWxzZSB7CisJCQlzZXRfbmVlZF9yZXNjaGVkKCk7CisJCX0KKworCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiAwOworfQogCiAjaWZuZGVmIENPTkZJR19QQ0kKIHZvaWQgX19pbml0IGlTZXJpZXNfaW5pdF9JUlEodm9pZCkgeyB9CkBAIC05MDAsNSArOTQzLDEzIEBACiAJcHBjX21kLmdldF9ydGNfdGltZSA9IGlTZXJpZXNfZ2V0X3J0Y190aW1lOwogCXBwY19tZC5jYWxpYnJhdGVfZGVjciA9IGlTZXJpZXNfY2FsaWJyYXRlX2RlY3I7CiAJcHBjX21kLnByb2dyZXNzID0gaVNlcmllc19wcm9ncmVzczsKKworCWlmIChnZXRfcGFjYSgpLT5scHBhY2Euc2hhcmVkX3Byb2MpIHsKKwkJcHBjX21kLmlkbGVfbG9vcCA9IGlzZXJpZXNfc2hhcmVkX2lkbGU7CisJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKKwl9IGVsc2UgeworCQlwcGNfbWQuaWRsZV9sb29wID0gaXNlcmllc19kZWRpY2F0ZWRfaWRsZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVkaWNhdGVkIGlkbGUgbG9vcFxuIik7CisJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlLmMKaW5kZXggYmRmMTNiNC4uOTU0Mzk1ZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lkbGUuYwpAQCAtMjAsMTA5ICsyMCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkNhbGwuaD4KLSNpbmNsdWRlIDxhc20vaVNlcmllcy9JdExwUXVldWUuaD4KLSNpbmNsdWRlIDxhc20vcGxwYXJfd3JhcHBlcnMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtY2ZnLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIAogZXh0ZXJuIHZvaWQgcG93ZXI0X2lkbGUodm9pZCk7CiAKLXN0YXRpYyBpbnQgKCppZGxlX2xvb3ApKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhZaWVsZFRpbWUgPSAwOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWluWWllbGRUaW1lID0gMHhmZmZmZmZmZmZmZmZmZmZmVUw7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKHZvaWQpCi17Ci0JYXNtIHZvbGF0aWxlICgibGkgMCwweDU1NTU7IHNjIiA6IDogOiAicjAiLCAicjMiKTsKLX0KLQotc3RhdGljIHZvaWQgeWllbGRfc2hhcmVkX3Byb2Nlc3Nvcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdGI7Ci0JdW5zaWduZWQgbG9uZyB5aWVsZFRpbWU7Ci0KLQlIdkNhbGxfc2V0RW5hYmxlZEludGVycnVwdHMoSHZDYWxsX01hc2tJUEkgfAotCQkJCSAgICBIdkNhbGxfTWFza0xwRXZlbnQgfAotCQkJCSAgICBIdkNhbGxfTWFza0xwUHJvZCB8Ci0JCQkJICAgIEh2Q2FsbF9NYXNrVGltZW91dCk7Ci0KLQl0YiA9IGdldF90YigpOwotCS8qIENvbXB1dGUgZnV0dXJlIHRiIHZhbHVlIHdoZW4geWllbGQgc2hvdWxkIGV4cGlyZSAqLwotCUh2Q2FsbF95aWVsZFByb2Nlc3NvcihIdkNhbGxfWWllbGRUaW1lZCwgdGIrdGJfdGlja3NfcGVyX2ppZmZ5KTsKLQotCXlpZWxkVGltZSA9IGdldF90YigpIC0gdGI7Ci0JaWYgKHlpZWxkVGltZSA+IG1heFlpZWxkVGltZSkKLQkJbWF4WWllbGRUaW1lID0geWllbGRUaW1lOwotCi0JaWYgKHlpZWxkVGltZSA8IG1pbllpZWxkVGltZSkKLQkJbWluWWllbGRUaW1lID0geWllbGRUaW1lOwotCQotCS8qCi0JICogVGhlIGRlY3JlbWVudGVyIHN0b3BzIGR1cmluZyB0aGUgeWllbGQuICBGb3JjZSBhIGZha2UgZGVjcmVtZW50ZXIKLQkgKiBoZXJlIGFuZCBsZXQgdGhlIHRpbWVyX2ludGVycnVwdCBjb2RlIHNvcnQgb3V0IHRoZSBhY3R1YWwgdGltZS4KLQkgKi8KLQlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDE7Ci0JcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOwotfQotCi1zdGF0aWMgaW50IGlTZXJpZXNfaWRsZSh2b2lkKQotewotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2E7Ci0JbG9uZyBvbGR2YWw7Ci0KLQkvKiBlbnN1cmUgaVNlcmllcyBydW4gbGlnaHQgd2lsbCBiZSBvdXQgd2hlbiBpZGxlICovCi0JcHBjNjRfcnVubGF0Y2hfb2ZmKCk7Ci0KLQlscGFjYSA9IGdldF9wYWNhKCk7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAobHBhY2EtPmxwcGFjYS5zaGFyZWRfcHJvYykgewotCQkJaWYgKEl0THBRdWV1ZV9pc0xwSW50UGVuZGluZyhscGFjYS0+bHBxdWV1ZV9wdHIpKQotCQkJCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKLQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJeWllbGRfc2hhcmVkX3Byb2Nlc3NvcigpOwotCQl9IGVsc2UgewotCQkJb2xkdmFsID0gdGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCk7Ci0KLQkJCWlmICghb2xkdmFsKSB7Ci0JCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0KLQkJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQkJCUhNVF9tZWRpdW0oKTsKLQkJCQkJaWYgKEl0THBRdWV1ZV9pc0xwSW50UGVuZGluZyhscGFjYS0+bHBxdWV1ZV9wdHIpKQotCQkJCQkJcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOwotCQkJCQlITVRfbG93KCk7Ci0JCQkJfQotCi0JCQkJSE1UX21lZGl1bSgpOwotCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCQl9IGVsc2UgewotCQkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKLQkJCX0KLQkJfQotCi0JCXBwYzY0X3J1bmxhdGNoX29uKCk7Ci0JCXNjaGVkdWxlKCk7Ci0JCXBwYzY0X3J1bmxhdGNoX29mZigpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW50IGRlZmF1bHRfaWRsZSh2b2lkKQoraW50IGRlZmF1bHRfaWRsZSh2b2lkKQogewogCWxvbmcgb2xkdmFsOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC0xMzQsNyArNDMsOCBAQAogCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKIAkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKLQkJCQliYXJyaWVyKCk7CisJCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisKIAkJCQkvKgogCQkJCSAqIEdvIGludG8gbG93IHRocmVhZCBwcmlvcml0eSBhbmQgcG9zc2libHkKIAkJCQkgKiBsb3cgcG93ZXIgbW9kZS4KQEAgLTE0OSw2ICs1OSw3IEBACiAJCQlzZXRfbmVlZF9yZXNjaGVkKCk7CiAJCX0KIAorCQlwcGM2NF9ydW5sYXRjaF9vbigpOwogCQlzY2hlZHVsZSgpOwogCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCiAJCQljcHVfZGllKCk7CkBAIC0xNTcsMTI3ICs2OCwxOSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0KLURFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzbXRfc25vb3plX2RlbGF5KTsKLQotaW50IGRlZGljYXRlZF9pZGxlKHZvaWQpCitpbnQgbmF0aXZlX2lkbGUodm9pZCkKIHsKLQlsb25nIG9sZHZhbDsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKSwgKnBwYWNhOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfc25vb3plOwotCXVuc2lnbmVkIGxvbmcgKnNtdF9zbm9vemVfZGVsYXkgPSAmX19nZXRfY3B1X3ZhcihzbXRfc25vb3plX2RlbGF5KTsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JcHBhY2EgPSAmcGFjYVtjcHUgXiAxXTsKLQogCXdoaWxlICgxKSB7Ci0JCS8qCi0JCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKLQkJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgotCQkgKi8KLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMTsKKwkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CiAKLQkJb2xkdmFsID0gdGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCk7Ci0JCWlmICghb2xkdmFsKSB7Ci0JCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQkJCXN0YXJ0X3Nub296ZSA9IF9fZ2V0X3RiKCkgKwotCQkJCSpzbXRfc25vb3plX2RlbGF5ICogdGJfdGlja3NfcGVyX3VzZWM7Ci0JCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKSB7Ci0JCQkJLyoKLQkJCQkgKiBHbyBpbnRvIGxvdyB0aHJlYWQgcHJpb3JpdHkgYW5kIHBvc3NpYmx5Ci0JCQkJICogbG93IHBvd2VyIG1vZGUuCi0JCQkJICovCi0JCQkJSE1UX2xvdygpOwotCQkJCUhNVF92ZXJ5X2xvdygpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJcG93ZXI0X2lkbGUoKTsKIAotCQkJCWlmICgqc210X3Nub296ZV9kZWxheSA9PSAwIHx8Ci0JCQkJICAgIF9fZ2V0X3RiKCkgPCBzdGFydF9zbm9vemUpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSE1UX21lZGl1bSgpOwotCi0JCQkJaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgewotCQkJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JCQkJCS8qCi0JCQkJCSAqIFdlIGFyZSBhYm91dCB0byBzbGVlcCB0aGUgdGhyZWFkCi0JCQkJCSAqIGFuZCBzbyB3b250IGJlIHBvbGxpbmcgYW55Ci0JCQkJCSAqIG1vcmUuCi0JCQkJCSAqLwotCQkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCi0JCQkJCS8qCi0JCQkJCSAqIFNNVCBkeW5hbWljIG1vZGUuIENlZGUgd2lsbCByZXN1bHQKLQkJCQkJICogaW4gdGhpcyB0aHJlYWQgZ29pbmcgZG9ybWFudCwgaWYgdGhlCi0JCQkJCSAqIHBhcnRuZXIgdGhyZWFkIGlzIHN0aWxsIGRvaW5nIHdvcmsuCi0JCQkJCSAqIFRocmVhZCB3YWtlcyB1cCBpZiBwYXJ0bmVyIGdvZXMgaWRsZSwKLQkJCQkJICogYW4gaW50ZXJydXB0IGlzIHByZXNlbnRlZCwgb3IgYSBwcm9kCi0JCQkJCSAqIG9jY3Vycy4gIFJldHVybmluZyBmcm9tIHRoZSBjZWRlCi0JCQkJCSAqIGVuYWJsZXMgZXh0ZXJuYWwgaW50ZXJydXB0cy4KLQkJCQkJICovCi0JCQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJCQljZWRlX3Byb2Nlc3NvcigpOwotCQkJCQllbHNlCi0JCQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogR2l2ZSB0aGUgSFYgYW4gb3Bwb3J0dW5pdHkgYXQgdGhlCi0JCQkJCSAqIHByb2Nlc3Nvciwgc2luY2Ugd2UgYXJlIG5vdCBkb2luZwotCQkJCQkgKiBhbnkgd29yay4KLQkJCQkJICovCi0JCQkJCXBvbGxfcGVuZGluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCQkJc2NoZWR1bGUoKTsKIAkJfQogCi0JCUhNVF9tZWRpdW0oKTsKLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQotCQkJY3B1X2RpZSgpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGFyZWRfaWRsZSh2b2lkKQotewotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQl3aGlsZSAoMSkgewotCQkvKgotCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCi0JCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KLQkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7Ci0KLQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgewotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCQkJLyoKLQkJCSAqIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gdGhlIGh5cGVydmlzb3IuICBXZSByZXR1cm4gaWYKLQkJCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNoIGFyZSBkcml2ZW4gcHJpb3IKLQkJCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlciAKLQkJCSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cwotCQkJICogYXJlIGVuYWJsZWQuCi0JCQkgKgotCQkJICogQ2hlY2sgbmVlZF9yZXNjaGVkKCkgYWdhaW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCi0JCQkgKiB0byBhdm9pZCBhIHJhY2UuCi0JCQkgKi8KLQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJY2VkZV9wcm9jZXNzb3IoKTsKLQkJCWVsc2UKLQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCX0KLQotCQlITVRfbWVkaXVtKCk7Ci0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7Ci0JCXNjaGVkdWxlKCk7CiAJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpICYmCiAJCSAgICBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCiAJCQljcHVfZGllKCk7CkBAIC0yODYsMjkgKzg5LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KLQotc3RhdGljIGludCBuYXRpdmVfaWRsZSh2b2lkKQotewotCXdoaWxlKDEpIHsKLQkJLyogY2hlY2sgQ1BVIHR5cGUgaGVyZSAqLwotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJcG93ZXI0X2lkbGUoKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKQotCQkJc2NoZWR1bGUoKTsKLQotCQlpZiAoY3B1X2lzX29mZmxpbmUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgJiYKLQkJICAgIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJCWNwdV9kaWUoKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KLQogdm9pZCBjcHVfaWRsZSh2b2lkKQogewotCWlkbGVfbG9vcCgpOworCUJVR19PTihOVUxMID09IHBwY19tZC5pZGxlX2xvb3ApOworCXBwY19tZC5pZGxlX2xvb3AoKTsKIH0KIAogaW50IHBvd2Vyc2F2ZV9uYXA7CkBAIC0zNDIsNDIgKzEyNiwzIEBACiB9CiBfX2luaXRjYWxsKHJlZ2lzdGVyX3Bvd2Vyc2F2ZV9uYXBfc3lzY3RsKTsKICNlbmRpZgotCi1pbnQgaWRsZV9zZXR1cCh2b2lkKQotewotCS8qCi0JICogTW92ZSB0aGF0IGp1bmsgdG8gZWFjaCBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlLCBldmVudHVhbGx5IGRlZmluZQotCSAqIGEgcFNlcmllc19pZGxlIGZvciBzaGFyZWQgcHJvY2Vzc29yIHN0dWZmCi0JICovCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWRsZV9sb29wID0gaVNlcmllc19pZGxlOwotCXJldHVybiAxOwotI2Vsc2UKLQlpZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKLQlpZiAoc3lzdGVtY2ZnLT5wbGF0Zm9ybSAmIFBMQVRGT1JNX1BTRVJJRVMpIHsKLQkJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikgewotCQkJaWYgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykgewotCQkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKLQkJCQlpZGxlX2xvb3AgPSBzaGFyZWRfaWRsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVkaWNhdGVkIGlkbGUgbG9vcFxuIik7Ci0JCQkJaWRsZV9sb29wID0gZGVkaWNhdGVkX2lkbGU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7Ci0JCQlpZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChzeXN0ZW1jZmctPnBsYXRmb3JtID09IFBMQVRGT1JNX1BPV0VSTUFDIHx8Ci0JICAgIHN5c3RlbWNmZy0+cGxhdGZvcm0gPT0gUExBVEZPUk1fTUFQTEUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgbmF0aXZlL05BUCBpZGxlIGxvb3BcbiIpOwotCQlpZGxlX2xvb3AgPSBuYXRpdmVfaWRsZTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCi0KLQlyZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2lycS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaXJxLmMKaW5kZXggM2RlZmM4Yy4uZjQxYWZlNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaXJxLmMKQEAgLTY2LDcgKzY2LDYgQEAKIGludCBkaXN0cmlidXRlX2lycXMgPSAxOwogaW50IF9faXJxX29mZnNldF92YWx1ZTsKIGludCBwcGNfc3B1cmlvdXNfaW50ZXJydXB0czsKLXVuc2lnbmVkIGxvbmcgbHBldmVudF9jb3VudDsKIHU2NCBwcGM2NF9pbnRlcnJ1cHRfY29udHJvbGxlcjsKIAogaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCkBAIC0yNDUsNyArMjQ0LDcgQEAKIAogCQlzcGluX2xvY2soJmRlc2MtPmxvY2spOwogCQlpZiAoIW5vaXJxZGVidWcpCi0JCQlub3RlX2ludGVycnVwdChpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOworCQkJbm90ZV9pbnRlcnJ1cHQoaXJxLCBkZXNjLCBhY3Rpb25fcmV0LCByZWdzKTsKIAkJaWYgKGxpa2VseSghKGRlc2MtPnN0YXR1cyAmIElSUV9QRU5ESU5HKSkpCiAJCQlicmVhazsKIAkJZGVzYy0+c3RhdHVzICY9IH5JUlFfUEVORElORzsKQEAgLTI2OSw3ICsyNjgsNiBAQAogdm9pZCBkb19JUlEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYTsKLQlzdHJ1Y3QgSXRMcFF1ZXVlICpscHE7CiAKIAlpcnFfZW50ZXIoKTsKIApAQCAtMjk1LDkgKzI5Myw4IEBACiAJCWlTZXJpZXNfc21wX21lc3NhZ2VfcmVjdihyZWdzKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCWxwcSA9IGxwYWNhLT5scHF1ZXVlX3B0cjsKLQlpZiAobHBxICYmIEl0THBRdWV1ZV9pc0xwSW50UGVuZGluZyhscHEpKQotCQlscGV2ZW50X2NvdW50ICs9IEl0THBRdWV1ZV9wcm9jZXNzKGxwcSwgcmVncyk7CisJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCXByb2Nlc3NfaHZscGV2ZW50cyhyZWdzKTsKIAogCWlycV9leGl0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYwppbmRleCA3ODJjZTNlLi5hM2Q1MTk1IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogCitzdGF0aWMgREVDTEFSRV9NVVRFWChrcHJvYmVfbXV0ZXgpOworCiBzdGF0aWMgc3RydWN0IGtwcm9iZSAqY3VycmVudF9rcHJvYmU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBrcHJvYmVfc3RhdHVzLCBrcHJvYmVfc2F2ZWRfbXNyOwogc3RhdGljIHN0cnVjdCBrcHJvYmUgKmtwcm9iZV9wcmV2OwpAQCAtNTQsNiArNTYsMTUgQEAKIAkJcHJpbnRrKCJDYW5ub3QgcmVnaXN0ZXIgYSBrcHJvYmUgb24gcmZpZCBvciBtdG1zcmRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KKworCS8qIGluc24gbXVzdCBiZSBvbiBhIHNwZWNpYWwgZXhlY3V0YWJsZSBwYWdlIG9uIHBwYzY0ICovCisJaWYgKCFyZXQpIHsKKwkJdXAoJmtwcm9iZV9tdXRleCk7CisJCXAtPmFpbnNuLmluc24gPSBnZXRfaW5zbl9zbG90KCk7CisJCWRvd24oJmtwcm9iZV9tdXRleCk7CisJCWlmICghcC0+YWluc24uaW5zbikKKwkJCXJldCA9IC1FTk9NRU07CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc5LDE2ICs5MCwyMiBAQAogCiB2b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogeworCXVwKCZrcHJvYmVfbXV0ZXgpOworCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOworCWRvd24oJmtwcm9iZV9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJa3Byb2JlX29wY29kZV90IGluc24gPSAqcC0+YWluc24uaW5zbjsKKwogCXJlZ3MtPm1zciB8PSBNU1JfU0U7Ci0JLypzaW5nbGUgc3RlcCBpbmxpbmUgaWYgaXQgYSBicmVha3BvaW50IGluc3RydWN0aW9uKi8KLQlpZiAocC0+b3Bjb2RlID09IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pCisKKwkvKiBzaW5nbGUgc3RlcCBpbmxpbmUgaWYgaXQgaXMgYSB0cmFwIHZhcmlhbnQgKi8KKwlpZiAoSVNfVFcoaW5zbikgfHwgSVNfVEQoaW5zbikgfHwgSVNfVFdJKGluc24pIHx8IElTX1RESShpbnNuKSkKIAkJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIAllbHNlCi0JCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKSZwLT5haW5zbi5pbnNuOworCQlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZylwLT5haW5zbi5pbnNuOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wcmV2aW91c19rcHJvYmUodm9pZCkKQEAgLTEwNSw2ICsxMjIsMjMgQEAKIAlrcHJvYmVfc2F2ZWRfbXNyID0ga3Byb2JlX3NhdmVkX21zcl9wcmV2OwogfQogCit2b2lkIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOworCisJaWYgKChyaSA9IGdldF9mcmVlX3JwX2luc3QocnApKSAhPSBOVUxMKSB7CisJCXJpLT5ycCA9IHJwOworCQlyaS0+dGFzayA9IGN1cnJlbnQ7CisJCXJpLT5yZXRfYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKilyZWdzLT5saW5rOworCisJCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyIHdpdGggdHJhbXBvbGluZSBhZGRyICovCisJCXJlZ3MtPmxpbmsgPSAodW5zaWduZWQgbG9uZylrcmV0cHJvYmVfdHJhbXBvbGluZTsKKwkJYWRkX3JwX2luc3QocmkpOworCX0gZWxzZSB7CisJCXJwLT5ubWlzc2VkKys7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIGludCBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICpwOwpAQCAtMTk1LDYgKzIyOSw3OCBAQAogfQogCiAvKgorICogRnVuY3Rpb24gcmV0dXJuIHByb2JlIHRyYW1wb2xpbmU6CisgKiAJLSBpbml0X2twcm9iZXMoKSBlc3RhYmxpc2hlcyBhIHByb2JlcG9pbnQgaGVyZQorICogCS0gV2hlbiB0aGUgcHJvYmVkIGZ1bmN0aW9uIHJldHVybnMsIHRoaXMgcHJvYmUKKyAqIAkJY2F1c2VzIHRoZSBoYW5kbGVycyB0byBmaXJlCisgKi8KK3ZvaWQga3JldHByb2JlX3RyYW1wb2xpbmVfaG9sZGVyKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCIuZ2xvYmFsIGtyZXRwcm9iZV90cmFtcG9saW5lXG4iCisJCQkia3JldHByb2JlX3RyYW1wb2xpbmU6XG4iCisJCQkibm9wXG4iKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBwcm9iZSBhdCBrcmV0cHJvYmUgdHJhbXBvbGluZSBpcyBoaXQKKyAqLworaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKyAgICAgICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CisJdW5zaWduZWQgbG9uZyBvcmlnX3JldF9hZGRyZXNzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRyYW1wb2xpbmVfYWRkcmVzcyA9KHVuc2lnbmVkIGxvbmcpJmtyZXRwcm9iZV90cmFtcG9saW5lOworCisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgorCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgorCSAqCisJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CisJICogICAgIC0gaW5zdGFuY2VzIGFyZSBhbHdheXMgaW5zZXJ0ZWQgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKKwkgKiAgICAgLSB3aGVuIG11bHRpcGxlIHJldHVybiBwcm9iZXMgYXJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzYW1lCisgICAgICAgICAqICAgICAgIGZ1bmN0aW9uLCB0aGUgZmlyc3QgaW5zdGFuY2UncyByZXRfYWRkciB3aWxsIHBvaW50IHRvIHRoZQorCSAqICAgICAgIHJlYWwgcmV0dXJuIGFkZHJlc3MsIGFuZCBhbGwgdGhlIHJlc3Qgd2lsbCBwb2ludCB0bworCSAqICAgICAgIGtyZXRwcm9iZV90cmFtcG9saW5lCisJICovCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyaSwgbm9kZSwgdG1wLCBoZWFkLCBobGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChyaS0+dGFzayAhPSBjdXJyZW50KQorCQkJLyogYW5vdGhlciB0YXNrIGlzIHNoYXJpbmcgb3VyIGhhc2ggYnVja2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworCQlpZiAocmktPnJwICYmIHJpLT5ycC0+aGFuZGxlcikKKwkJCXJpLT5ycC0+aGFuZGxlcihyaSwgcmVncyk7CisKKwkJb3JpZ19yZXRfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKKwkJcmVjeWNsZV9ycF9pbnN0KHJpKTsKKworCQlpZiAob3JpZ19yZXRfYWRkcmVzcyAhPSB0cmFtcG9saW5lX2FkZHJlc3MpCisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgcmVhbCByZXR1cm4gYWRkcmVzcy4gQW55IG90aGVyCisJCQkgKiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzayBhcmUgZm9yCisJCQkgKiBvdGhlciBjYWxscyBkZWVwZXIgb24gdGhlIGNhbGwgc3RhY2sKKwkJCSAqLworCQkJYnJlYWs7CisJfQorCisJQlVHX09OKCFvcmlnX3JldF9hZGRyZXNzIHx8IChvcmlnX3JldF9hZGRyZXNzID09IHRyYW1wb2xpbmVfYWRkcmVzcykpOworCXJlZ3MtPm5pcCA9IG9yaWdfcmV0X2FkZHJlc3M7CisKKwl1bmxvY2tfa3Byb2JlcygpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlLCB3ZSBhcmUgdGVsbGluZworICAgICAgICAgKiBrcHJvYmVfaGFuZGxlcigpIHRoYXQgd2UgaGF2ZSBoYW5kbGVkIHVubG9ja2luZworICAgICAgICAgKiBhbmQgcmUtZW5hYmxpbmcgcHJlZW1wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworfQorCisvKgogICogQ2FsbGVkIGFmdGVyIHNpbmdsZS1zdGVwcGluZy4gIHAtPmFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCiAgKiBpbnN0cnVjdGlvbiB3aG9zZSBmaXJzdCBieXRlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAiYnJlYWtwb2ludCIKICAqIGluc3RydWN0aW9uLiAgVG8gYXZvaWQgdGhlIFNNUCBwcm9ibGVtcyB0aGF0IGNhbiBvY2N1ciB3aGVuIHdlCkBAIC0yMDUsOSArMzExLDEwIEBACiBzdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGluc24gPSAqcC0+YWluc24uaW5zbjsKIAogCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7Ci0JcmV0ID0gZW11bGF0ZV9zdGVwKHJlZ3MsIHAtPmFpbnNuLmluc25bMF0pOworCXJldCA9IGVtdWxhdGVfc3RlcChyZWdzLCBpbnNuKTsKIAlpZiAocmV0ID09IDApCiAJCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgKyA0OwogfQpAQCAtMzMxLDMgKzQzOCwxMyBAQAogCW1lbWNweShyZWdzLCAmanByb2JlX3NhdmVkX3JlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwogCXJldHVybiAxOwogfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSB0cmFtcG9saW5lX3AgPSB7CisJLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopICZrcmV0cHJvYmVfdHJhbXBvbGluZSwKKwkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKK307CisKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3NldHVwLmMKaW5kZXggZGE4OTAwYi4uYmI1NWI1YSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9zZXR1cC5jCkBAIC0xNzcsNiArMTc3LDggQEAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBuYXRpdmUvTkFQIGlkbGUgbG9vcFxuIik7CiB9CiAKIC8qIApAQCAtMjk3LDQgKzI5OSw1IEBACiAgICAgICAgCS5nZXRfcnRjX3RpbWUJCT0gbWFwbGVfZ2V0X3J0Y190aW1lLAogICAgICAgCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwkJPSBtYXBsZV9wcm9ncmVzcywKKwkuaWRsZV9sb29wCQk9IG5hdGl2ZV9pZGxlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21mLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9tZi5jCmluZGV4IGQ5OGJlYmYuLmVmNGEzMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21mLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWYuYwpAQCAtODAxLDEwICs4MDEsOCBAQAogCQlyZXR1cm4gcmM7CiAJLyogV2UgbmVlZCB0byBwb2xsIGhlcmUgYXMgd2UgYXJlIG5vdCB5ZXQgdGFraW5nIGludGVycnVwdHMgKi8KIAl3aGlsZSAocnRjX2RhdGEuYnVzeSkgewotCQlleHRlcm4gdW5zaWduZWQgbG9uZyBscGV2ZW50X2NvdW50OwotCQlzdHJ1Y3QgSXRMcFF1ZXVlICpscHEgPSBnZXRfcGFjYSgpLT5scHF1ZXVlX3B0cjsKLQkJaWYgKGxwcSAmJiBJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBxKSkKLQkJCWxwZXZlbnRfY291bnQgKz0gSXRMcFF1ZXVlX3Byb2Nlc3MobHBxLCBOVUxMKTsKKwkJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCQlwcm9jZXNzX2h2bHBldmVudHMoTlVMTCk7CiAJfQogCXJldHVybiBydGNfc2V0X3RtKHJ0Y19kYXRhLnJjLCBydGNfZGF0YS5jZV9tc2cuY2VfbXNnLCB0bSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMKaW5kZXggZjNkZWEwYy4uNTlmNGY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUwpAQCAtMTEyNCw5ICsxMTI0LDExIEBACiAJLmxsb25nIC5jb21wYXRfc3lzX21xX2dldHNldGF0dHIKIAkubGxvbmcgLmNvbXBhdF9zeXNfa2V4ZWNfbG9hZAogCS5sbG9uZyAuc3lzMzJfYWRkX2tleQotCS5sbG9uZyAuc3lzMzJfcmVxdWVzdF9rZXkKKwkubGxvbmcgLnN5czMyX3JlcXVlc3Rfa2V5CS8qIDI3MCAqLwogCS5sbG9uZyAuY29tcGF0X3N5c19rZXljdGwKIAkubGxvbmcgLmNvbXBhdF9zeXNfd2FpdGlkCisJLmxsb25nIC5zeXMzMl9pb3ByaW9fc2V0CisJLmxsb25nIC5zeXMzMl9pb3ByaW9fZ2V0CiAKIAkuYmFsaWduIDgKIF9HTE9CQUwoc3lzX2NhbGxfdGFibGUpCkBAIC0xNDAzLDMgKzE0MDUsNSBAQAogCS5sbG9uZyAuc3lzX3JlcXVlc3Rfa2V5CQkvKiAyNzAgKi8KIAkubGxvbmcgLnN5c19rZXljdGwKIAkubGxvbmcgLnN5c193YWl0aWQKKwkubGxvbmcgLnN5c19pb3ByaW9fc2V0CisJLmxsb25nIC5zeXNfaW9wcmlvX2dldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbnZyYW0uYyBiL2FyY2gvcHBjNjQva2VybmVsL252cmFtLmMKaW5kZXggNGU3MTc4MS4uNGZiMWE5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbnZyYW0uYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9udnJhbS5jCkBAIC0zMzgsOSArMzM4LDggQEAKICAqLwogc3RhdGljIGludCBudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uKHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHA7Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqcGFydCA9IE5VTEw7Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqbmV3X3BhcnQgPSBOVUxMOworCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQ7CisJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqbmV3X3BhcnQ7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqZnJlZV9wYXJ0ID0gTlVMTDsKIAlpbnQgc2VxX2luaXRbMl0gPSB7IDAsIDAgfTsKIAlsb2ZmX3QgdG1wX2luZGV4OwpAQCAtMzQ5LDggKzM0OCw3IEBACiAJCiAJLyogRmluZCBhIGZyZWUgcGFydGl0aW9uIHRoYXQgd2lsbCBnaXZlIHVzIHRoZSBtYXhpbXVtIG5lZWRlZCBzaXplIAogCSAgIElmIGNhbid0IGZpbmQgb25lIHRoYXQgd2lsbCBnaXZlIHVzIHRoZSBtaW5pbXVtIHNpemUgbmVlZGVkICovCi0JbGlzdF9mb3JfZWFjaChwLCAmbnZyYW1fcGFydC0+cGFydGl0aW9uKSB7Ci0JCXBhcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0LCAmbnZyYW1fcGFydC0+cGFydGl0aW9uLCBwYXJ0aXRpb24pIHsKIAkJaWYgKHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX0ZSRUUpCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCA2NmJkNWFiNy4uYjgwZTgxOSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIApAQCAtMTUsMjAgKzE2LDIwIEBACiAgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZfZGV2aWNlIHByZXNlbnQgaW4gdGhlCiAgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCiAgKi8KLWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqIG9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoZXMsCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKIAkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KQogewogCWlmICghZGV2LT5ub2RlKQogCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAobWF0Y2hlcy0+bmFtZSB8fCBtYXRjaGVzLT50eXBlIHx8IG1hdGNoZXMtPmNvbXBhdGlibGUpIHsKKwl3aGlsZSAobWF0Y2hlcy0+bmFtZVswXSB8fCBtYXRjaGVzLT50eXBlWzBdIHx8IG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pIHsKIAkJaW50IG1hdGNoID0gMTsKLQkJaWYgKG1hdGNoZXMtPm5hbWUgJiYgbWF0Y2hlcy0+bmFtZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT5uYW1lWzBdKQogCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT5uYW1lCiAJCQkJJiYgIXN0cmNtcChtYXRjaGVzLT5uYW1lLCBkZXYtPm5vZGUtPm5hbWUpOwotCQlpZiAobWF0Y2hlcy0+dHlwZSAmJiBtYXRjaGVzLT50eXBlICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPnR5cGVbMF0pCiAJCQltYXRjaCAmPSBkZXYtPm5vZGUtPnR5cGUKIAkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPnR5cGUsIGRldi0+bm9kZS0+dHlwZSk7Ci0JCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlICYmIG1hdGNoZXMtPmNvbXBhdGlibGUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkKIAkJCW1hdGNoICY9IGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+bm9kZSwKIAkJCQltYXRjaGVzLT5jb21wYXRpYmxlKTsKIAkJaWYgKG1hdGNoKQpAQCAtNDIsNyArNDMsNyBAQAogewogCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogb2ZfZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBvZl9kcnYtPm1hdGNoX3RhYmxlOwogCiAJaWYgKCFtYXRjaGVzKQogCQlyZXR1cm4gMDsKQEAgLTc1LDcgKzc2LDcgQEAKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydjsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXY7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAogCWRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2xwYXIuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCmluZGV4IDY1MzQ4MTIuLjc0ZGQxNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCkBAIC0yNzcsMzEgKzI3NywyMCBAQAogCiBsb25nIHBTZXJpZXNfbHBhcl9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBsb25nIHBycG4sCi0JCQkgICAgICBpbnQgc2Vjb25kYXJ5LCB1bnNpZ25lZCBsb25nIGhwdGVmbGFncywKLQkJCSAgICAgIGludCBib2x0ZWQsIGludCBsYXJnZSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCB1bnNpZ25lZCBsb25nIHJmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGFycG4gPSBwaHlzUnBuX3RvX2Fic1JwbihwcnBuKTsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHNsb3Q7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCXVuc2lnbmVkIGxvbmcgZHVtbXkwLCBkdW1teTE7CiAKLQkvKiBGaWxsIGluIHRoZSBsb2NhbCBIUFRFIHdpdGggYWJzb2x1dGUgcnBuLCBhdnBuIGFuZCBmbGFncyAqLwotCWxocHRlLmR3MS5kd29yZDEgICAgICA9IDA7Ci0JbGhwdGUuZHcxLmR3MS5ycG4gICAgID0gYXJwbjsKLQlsaHB0ZS5kdzEuZmxhZ3MuZmxhZ3MgPSBocHRlZmxhZ3M7CisJaHB0ZV92ID0gKCh2YSA+PiAyMykgPDwgSFBURV9WX0FWUE5fU0hJRlQpIHwgdmZsYWdzIHwgSFBURV9WX1ZBTElEOworCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfTEFSR0UpCisJCWhwdGVfdiAmPSB+KDFVTCA8PCBIUFRFX1ZfQVZQTl9TSElGVCk7CiAKLQlsaHB0ZS5kdzAuZHdvcmQwICAgICAgPSAwOwotCWxocHRlLmR3MC5kdzAuYXZwbiAgICA9IHZhID4+IDIzOwotCWxocHRlLmR3MC5kdzAuaCAgICAgICA9IHNlY29uZGFyeTsKLQlsaHB0ZS5kdzAuZHcwLmJvbHRlZCAgPSBib2x0ZWQ7Ci0JbGhwdGUuZHcwLmR3MC52ICAgICAgID0gMTsKLQotCWlmIChsYXJnZSkgewotCQlsaHB0ZS5kdzAuZHcwLmwgPSAxOwotCQlsaHB0ZS5kdzAuZHcwLmF2cG4gJj0gfjB4MVVMOwotCX0KKwlocHRlX3IgPSAoYXJwbiA8PCBIUFRFX1JfUlBOX1NISUZUKSB8IHJmbGFnczsKIAogCS8qIE5vdyBmaWxsIGluIHRoZSBhY3R1YWwgSFBURSAqLwogCS8qIFNldCBDRUMgY29va2llIHRvIDAgICAgICAgICAqLwpAQCAtMzEyLDExICszMDEsMTEgQEAKIAlmbGFncyA9IDA7CiAKIAkvKiBYWFggd2h5IGlzIHRoaXMgaGVyZT8gLSBBbnRvbiAqLwotCWlmIChocHRlZmxhZ3MgJiAoX1BBR0VfR1VBUkRFRHxfUEFHRV9OT19DQUNIRSkpCi0JCWxocHRlLmR3MS5mbGFncy5mbGFncyAmPSB+X1BBR0VfQ09IRVJFTlQ7CisJaWYgKHJmbGFncyAmIChfUEFHRV9HVUFSREVEfF9QQUdFX05PX0NBQ0hFKSkKKwkJaHB0ZV9yICY9IH5fUEFHRV9DT0hFUkVOVDsKIAotCWxwYXJfcmMgPSBwbHBhcl9oY2FsbChIX0VOVEVSLCBmbGFncywgaHB0ZV9ncm91cCwgbGhwdGUuZHcwLmR3b3JkMCwKLQkJCSAgICAgIGxocHRlLmR3MS5kd29yZDEsICZzbG90LCAmZHVtbXkwLCAmZHVtbXkxKTsKKwlscGFyX3JjID0gcGxwYXJfaGNhbGwoSF9FTlRFUiwgZmxhZ3MsIGhwdGVfZ3JvdXAsIGhwdGVfdiwKKwkJCSAgICAgIGhwdGVfciwgJnNsb3QsICZkdW1teTAsICZkdW1teTEpOwogCiAJaWYgKHVubGlrZWx5KGxwYXJfcmMgPT0gSF9QVEVHX0Z1bGwpKQogCQlyZXR1cm4gLTE7CkBAIC0zMzIsNyArMzIxLDcgQEAKIAkvKiBCZWNhdXNlIG9mIGlTZXJpZXMsIHdlIGhhdmUgdG8gcGFzcyBkb3duIHRoZSBzZWNvbmRhcnkKIAkgKiBidWNrZXQgYml0IGhlcmUgYXMgd2VsbAogCSAqLwotCXJldHVybiAoc2xvdCAmIDcpIHwgKHNlY29uZGFyeSA8PCAzKTsKKwlyZXR1cm4gKHNsb3QgJiA3KSB8ICghISh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKSA8PCAzKTsKIH0KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhwU2VyaWVzX2xwYXJfdGxiaWVfbG9jayk7CkBAIC00MjcsMjIgKzQxNiwxOCBAQAogCXVuc2lnbmVkIGxvbmcgaGFzaDsKIAl1bnNpZ25lZCBsb25nIGksIGo7CiAJbG9uZyBzbG90OwotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyBkd29yZDA7Ci0JCUhwdGVfZHdvcmQwIGR3MDsKLQl9IGhwdGVfZHcwOwotCUhwdGVfZHdvcmQwIGR3MDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAogCWhhc2ggPSBocHRfaGFzaCh2cG4sIDApOwogCiAJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewogCQlzbG90ID0gKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKiBIUFRFU19QRVJfR1JPVVA7CiAJCWZvciAoaSA9IDA7IGkgPCBIUFRFU19QRVJfR1JPVVA7IGkrKykgewotCQkJaHB0ZV9kdzAuZHdvcmQwID0gcFNlcmllc19scGFyX2hwdGVfZ2V0d29yZDAoc2xvdCk7Ci0JCQlkdzAgPSBocHRlX2R3MC5kdzA7CisJCQlocHRlX3YgPSBwU2VyaWVzX2xwYXJfaHB0ZV9nZXR3b3JkMChzbG90KTsKIAotCQkJaWYgKChkdzAuYXZwbiA9PSAodnBuID4+IDExKSkgJiYgZHcwLnYgJiYKLQkJCSAgICAoZHcwLmggPT0gaikpIHsKKwkJCWlmICgoSFBURV9WX0FWUE5fVkFMKGhwdGVfdikgPT0gKHZwbiA+PiAxMSkpCisJCQkgICAgJiYgKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkKKwkJCSAgICAmJiAoISEoaHB0ZV92ICYgSFBURV9WX1NFQ09OREFSWSkgPT0gaikpIHsKIAkJCQkvKiBIUFRFIG1hdGNoZXMgKi8KIAkJCQlpZiAoaikKIAkJCQkJc2xvdCA9IC1zbG90OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jCmluZGV4IDQ0ZDlhZjcuLjViZWM5NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NldHVwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtODIsNiArODMsOSBAQAogZXh0ZXJuIHZvaWQgcFNlcmllc19zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQgcFNlcmllc19tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKK3N0YXRpYyBpbnQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKTsKK3N0YXRpYyBpbnQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKTsKKwogc3RhdGljIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIGNocnBfaW50X2Fja19zcGVjaWFsOwogc3RydWN0IG1waWMgKnBTZXJpZXNfbXBpYzsKIApAQCAtMjI5LDYgKzIzMywyMCBAQAogCiAJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikKIAkJdnBhX2luaXQoYm9vdF9jcHVpZCk7CisKKwkvKiBDaG9vc2UgYW4gaWRsZSBsb29wICovCisJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikgeworCQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CisJCQlwcGNfbWQuaWRsZV9sb29wID0gcHNlcmllc19zaGFyZWRfaWRsZTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOworCQkJcHBjX21kLmlkbGVfbG9vcCA9IHBzZXJpZXNfZGVkaWNhdGVkX2lkbGU7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7CisJCXBwY19tZC5pZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7CisJfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwU2VyaWVzX2luaXRfcGFuZWwodm9pZCkKQEAgLTQxOCw2ICs0MzYsMTQ0IEBACiAJcmV0dXJuIDE7CiB9CiAKK0RFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzbXRfc25vb3plX2RlbGF5KTsKKworc3RhdGljIGlubGluZSB2b2lkIGRlZGljYXRlZF9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IHBhY2Ffc3RydWN0ICpwcGFjYSA9ICZwYWNhW2NwdSBeIDFdOworCisJLyogT25seSBzbGVlcCBpZiB0aGUgb3RoZXIgdGhyZWFkIGlzIG5vdCBpZGxlICovCisJaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJCS8qCisJCSAqIFdlIGFyZSBhYm91dCB0byBzbGVlcCB0aGUgdGhyZWFkIGFuZCBzbyB3b250IGJlIHBvbGxpbmcgYW55CisJCSAqIG1vcmUuCisJCSAqLworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCisJCS8qCisJCSAqIFNNVCBkeW5hbWljIG1vZGUuIENlZGUgd2lsbCByZXN1bHQgaW4gdGhpcyB0aHJlYWQgZ29pbmcKKwkJICogZG9ybWFudCwgaWYgdGhlIHBhcnRuZXIgdGhyZWFkIGlzIHN0aWxsIGRvaW5nIHdvcmsuICBUaHJlYWQKKwkJICogd2FrZXMgdXAgaWYgcGFydG5lciBnb2VzIGlkbGUsIGFuIGludGVycnVwdCBpcyBwcmVzZW50ZWQsIG9yCisJCSAqIGEgcHJvZCBvY2N1cnMuICBSZXR1cm5pbmcgZnJvbSB0aGUgY2VkZSBlbmFibGVzIGV4dGVybmFsCisJCSAqIGludGVycnVwdHMuCisJCSAqLworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJY2VkZV9wcm9jZXNzb3IoKTsKKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEdpdmUgdGhlIEhWIGFuIG9wcG9ydHVuaXR5IGF0IHRoZSBwcm9jZXNzb3IsIHNpbmNlIHdlIGFyZQorCQkgKiBub3QgZG9pbmcgYW55IHdvcmsuCisJCSAqLworCQlwb2xsX3BlbmRpbmcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKQoreworCWxvbmcgb2xkdmFsOworCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7CisJdW5zaWduZWQgbG9uZyAqc210X3Nub296ZV9kZWxheSA9ICZfX2dldF9jcHVfdmFyKHNtdF9zbm9vemVfZGVsYXkpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQorCQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCisJCSAqLworCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAxOworCisJCW9sZHZhbCA9IHRlc3RfYW5kX2NsZWFyX3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpOworCQlpZiAoIW9sZHZhbCkgeworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisKKwkJCXN0YXJ0X3Nub296ZSA9IF9fZ2V0X3RiKCkgKworCQkJCSpzbXRfc25vb3plX2RlbGF5ICogdGJfdGlja3NfcGVyX3VzZWM7CisKKwkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKKwkJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKworCQkJCS8qCisJCQkJICogR28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQorCQkJCSAqIGxvdyBwb3dlciBtb2RlLgorCQkJCSAqLworCQkJCUhNVF9sb3coKTsKKwkJCQlITVRfdmVyeV9sb3coKTsKKworCQkJCWlmICgqc210X3Nub296ZV9kZWxheSAhPSAwICYmCisJCQkJICAgIF9fZ2V0X3RiKCkgPiBzdGFydF9zbm9vemUpIHsKKwkJCQkJSE1UX21lZGl1bSgpOworCQkJCQlkZWRpY2F0ZWRfaWRsZV9zbGVlcChjcHUpOworCQkJCX0KKworCQkJfQorCisJCQlITVRfbWVkaXVtKCk7CisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQl9IGVsc2UgeworCQkJc2V0X25lZWRfcmVzY2hlZCgpOworCQl9CisKKwkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKworCQlzY2hlZHVsZSgpOworCisJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKKwkJCWNwdV9kaWUoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKQoreworCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCisJCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KKwkJICovCisJCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisKKwkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCXBwYzY0X3J1bmxhdGNoX29mZigpOworCisJCQkvKgorCQkJICogWWllbGQgdGhlIHByb2Nlc3NvciB0byB0aGUgaHlwZXJ2aXNvci4gIFdlIHJldHVybiBpZgorCQkJICogYW4gZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycyAod2hpY2ggYXJlIGRyaXZlbiBwcmlvcgorCQkJICogdG8gcmV0dXJuaW5nIGhlcmUpIG9yIGlmIGEgcHJvZCBvY2N1cnMgZnJvbSBhbm90aGVyCisJCQkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhlcmUsIGV4dGVybmFsIGludGVycnVwdHMKKwkJCSAqIGFyZSBlbmFibGVkLgorCQkJICoKKwkJCSAqIENoZWNrIG5lZWRfcmVzY2hlZCgpIGFnYWluIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCQkJICogdG8gYXZvaWQgYSByYWNlLgorCQkJICovCisJCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJCWNlZGVfcHJvY2Vzc29yKCk7CisJCQllbHNlCisJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCQlITVRfbWVkaXVtKCk7CisJCX0KKworCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAwOworCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCisJCXNjaGVkdWxlKCk7CisKKwkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQorCQkJY3B1X2RpZSgpOworCX0KKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgbWFjaGRlcF9jYWxscyBfX2luaXRkYXRhIHBTZXJpZXNfbWQgPSB7CiAJLnByb2JlCQkJPSBwU2VyaWVzX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IHBTZXJpZXNfc2V0dXBfYXJjaCwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BhY2FEYXRhLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jCmluZGV4IGEzZTA5NzVjLi42MzE2MTg4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BhY2FEYXRhLmMKQEAgLTQyLDIxICs0Miw3IEBACiAgKiBwcm9jZXNzb3JzLiAgVGhlIHByb2Nlc3NvciBWUEQgYXJyYXkgbmVlZHMgb25lIGVudHJ5IHBlciBwaHlzaWNhbAogICogcHJvY2Vzc29yIChub3QgdGhyZWFkKS4KICAqLwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotI2RlZmluZSBFWFRSQV9JTklUUyhudW1iZXIsIGxwcSkJCQkJCSAgICBcCi0JLmxwcGFjYV9wdHIgPSAmcGFjYVtudW1iZXJdLmxwcGFjYSwJCQkJICAgIFwKLQkubHBxdWV1ZV9wdHIgPSAobHBxKSwJCS8qICZ4SXRMcFF1ZXVlLCAqLwkJICAgIFwKLQkucmVnX3NhdmVfcHRyID0gJnBhY2FbbnVtYmVyXS5yZWdfc2F2ZSwJCQkJICAgIFwKLQkucmVnX3NhdmUgPSB7CQkJCQkJCSAgICBcCi0JCS54RGVzYyA9IDB4ZDM5N2Q5ZTIsCS8qICJMcFJTIiAqLwkJCSAgICBcCi0JCS54U2l6ZSA9IHNpemVvZihzdHJ1Y3QgSXRMcFJlZ1NhdmUpCQkJICAgIFwKLQl9LAotI2Vsc2UKLSNkZWZpbmUgRVhUUkFfSU5JVFMobnVtYmVyLCBscHEpCi0jZW5kaWYKLQotI2RlZmluZSBQQUNBSU5JVERBVEEobnVtYmVyLHN0YXJ0LGxwcSxhc3JyLGFzcnYpCQkJICAgIFwKLXsJCQkJCQkJCQkgICAgXAorI2RlZmluZSBQQUNBX0lOSVRfQ09NTU9OKG51bWJlciwgc3RhcnQsIGFzcnIsIGFzcnYpCQkJICAgIFwKIAkubG9ja190b2tlbiA9IDB4ODAwMCwJCQkJCQkgICAgXAogCS5wYWNhX2luZGV4ID0gKG51bWJlciksCQkvKiBQYWNhIEluZGV4ICovCQkgICAgXAogCS5kZWZhdWx0X2RlY3IgPSAweDAwZmYwMDAwLAkvKiBJbml0aWFsIERlY3IgKi8JCSAgICBcCkBAIC03NCwxNDcgKzYwLDc5IEBACiAJCS5lbmRfb2ZfcXVhbnR1bSA9IDB4ZmZmZmZmZmZmZmZmZmZmZnVsLAkJCSAgICBcCiAJCS5zbGJfY291bnQgPSA2NCwJCQkJCSAgICBcCiAJfSwJCQkJCQkJCSAgICBcCi0JRVhUUkFfSU5JVFMoKG51bWJlciksIChscHEpKQkJCQkJICAgIFwKKworI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworI2RlZmluZSBQQUNBX0lOSVRfSVNFUklFUyhudW1iZXIpCQkJCQkgICAgXAorCS5scHBhY2FfcHRyID0gJnBhY2FbbnVtYmVyXS5scHBhY2EsCQkJCSAgICBcCisJLnJlZ19zYXZlX3B0ciA9ICZwYWNhW251bWJlcl0ucmVnX3NhdmUsCQkJCSAgICBcCisJLnJlZ19zYXZlID0gewkJCQkJCQkgICAgXAorCQkueERlc2MgPSAweGQzOTdkOWUyLAkvKiAiTHBSUyIgKi8JCQkgICAgXAorCQkueFNpemUgPSBzaXplb2Yoc3RydWN0IEl0THBSZWdTYXZlKQkJCSAgICBcCisJfQorCisjZGVmaW5lIFBBQ0FfSU5JVChudW1iZXIpCQkJCQkJICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBBQ0FfSU5JVF9DT01NT04obnVtYmVyLCAwLCAwLCAwKQkJCQkgICAgXAorCVBBQ0FfSU5JVF9JU0VSSUVTKG51bWJlcikJCQkJCSAgICBcCiB9CiAKLXN0cnVjdCBwYWNhX3N0cnVjdCBwYWNhW10gPSB7Ci0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JUEFDQUlOSVREQVRBKCAwLCAxLCAmeEl0THBRdWV1ZSwgMCwgU1RBQjBfVklSVF9BRERSKSwKKyNkZWZpbmUgQk9PVENQVV9QQUNBX0lOSVQobnVtYmVyKQkJCQkJICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBBQ0FfSU5JVF9DT01NT04obnVtYmVyLCAxLCAwLCBTVEFCMF9WSVJUX0FERFIpCQkJICAgIFwKKwlQQUNBX0lOSVRfSVNFUklFUyhudW1iZXIpCQkJCQkgICAgXAorfQorCiAjZWxzZQotCVBBQ0FJTklUREFUQSggMCwgMSwgTlVMTCwgU1RBQjBfUEhZU19BRERSLCBTVEFCMF9WSVJUX0FERFIpLAorI2RlZmluZSBQQUNBX0lOSVQobnVtYmVyKQkJCQkJCSAgICBcCit7CQkJCQkJCQkJICAgIFwKKwlQQUNBX0lOSVRfQ09NTU9OKG51bWJlciwgMCwgMCwgMCkJCQkJICAgIFwKK30KKworI2RlZmluZSBCT09UQ1BVX1BBQ0FfSU5JVChudW1iZXIpCQkJCQkgICAgXAorewkJCQkJCQkJCSAgICBcCisJUEFDQV9JTklUX0NPTU1PTihudW1iZXIsIDEsIFNUQUIwX1BIWVNfQUREUiwgU1RBQjBfVklSVF9BRERSKQkgICAgXAorfQogI2VuZGlmCisKK3N0cnVjdCBwYWNhX3N0cnVjdCBwYWNhW10gPSB7CisJQk9PVENQVV9QQUNBX0lOSVQoMCksCiAjaWYgTlJfQ1BVUyA+IDEKLQlQQUNBSU5JVERBVEEoIDEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSggMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKCAzLCAwLCBOVUxMLCAwLCAwKSwKKwlQQUNBX0lOSVQoICAxKSwgUEFDQV9JTklUKCAgMiksIFBBQ0FfSU5JVCggIDMpLAogI2lmIE5SX0NQVVMgPiA0Ci0JUEFDQUlOSVREQVRBKCA0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoIDUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSggNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKCA3LCAwLCBOVUxMLCAwLCAwKSwKKwlQQUNBX0lOSVQoICA0KSwgUEFDQV9JTklUKCAgNSksIFBBQ0FfSU5JVCggIDYpLCBQQUNBX0lOSVQoICA3KSwKICNpZiBOUl9DUFVTID4gOAotCVBBQ0FJTklUREFUQSggOCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKCA5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxMSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDE1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxNywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDE4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyMCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDIxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyMywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDI0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDI3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyOSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDMwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMzEsIDAsIE5VTEwsIDAsIDApLAorCVBBQ0FfSU5JVCggIDgpLCBQQUNBX0lOSVQoICA5KSwgUEFDQV9JTklUKCAxMCksIFBBQ0FfSU5JVCggMTEpLAorCVBBQ0FfSU5JVCggMTIpLCBQQUNBX0lOSVQoIDEzKSwgUEFDQV9JTklUKCAxNCksIFBBQ0FfSU5JVCggMTUpLAorCVBBQ0FfSU5JVCggMTYpLCBQQUNBX0lOSVQoIDE3KSwgUEFDQV9JTklUKCAxOCksIFBBQ0FfSU5JVCggMTkpLAorCVBBQ0FfSU5JVCggMjApLCBQQUNBX0lOSVQoIDIxKSwgUEFDQV9JTklUKCAyMiksIFBBQ0FfSU5JVCggMjMpLAorCVBBQ0FfSU5JVCggMjQpLCBQQUNBX0lOSVQoIDI1KSwgUEFDQV9JTklUKCAyNiksIFBBQ0FfSU5JVCggMjcpLAorCVBBQ0FfSU5JVCggMjgpLCBQQUNBX0lOSVQoIDI5KSwgUEFDQV9JTklUKCAzMCksIFBBQ0FfSU5JVCggMzEpLAogI2lmIE5SX0NQVVMgPiAzMgotCVBBQ0FJTklUREFUQSgzMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDMzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMzQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzNSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDM2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMzcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzOCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDM5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0MSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0NCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQ1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0NywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQ4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1MCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDUxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1MywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDU0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1NiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDU3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1OSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDYwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNjEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2MiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDYzLCAwLCBOVUxMLCAwLCAwKSwKKwlQQUNBX0lOSVQoIDMyKSwgUEFDQV9JTklUKCAzMyksIFBBQ0FfSU5JVCggMzQpLCBQQUNBX0lOSVQoIDM1KSwKKwlQQUNBX0lOSVQoIDM2KSwgUEFDQV9JTklUKCAzNyksIFBBQ0FfSU5JVCggMzgpLCBQQUNBX0lOSVQoIDM5KSwKKwlQQUNBX0lOSVQoIDQwKSwgUEFDQV9JTklUKCA0MSksIFBBQ0FfSU5JVCggNDIpLCBQQUNBX0lOSVQoIDQzKSwKKwlQQUNBX0lOSVQoIDQ0KSwgUEFDQV9JTklUKCA0NSksIFBBQ0FfSU5JVCggNDYpLCBQQUNBX0lOSVQoIDQ3KSwKKwlQQUNBX0lOSVQoIDQ4KSwgUEFDQV9JTklUKCA0OSksIFBBQ0FfSU5JVCggNTApLCBQQUNBX0lOSVQoIDUxKSwKKwlQQUNBX0lOSVQoIDUyKSwgUEFDQV9JTklUKCA1MyksIFBBQ0FfSU5JVCggNTQpLCBQQUNBX0lOSVQoIDU1KSwKKwlQQUNBX0lOSVQoIDU2KSwgUEFDQV9JTklUKCA1NyksIFBBQ0FfSU5JVCggNTgpLCBQQUNBX0lOSVQoIDU5KSwKKwlQQUNBX0lOSVQoIDYwKSwgUEFDQV9JTklUKCA2MSksIFBBQ0FfSU5JVCggNjIpLCBQQUNBX0lOSVQoIDYzKSwKICNpZiBOUl9DUFVTID4gNjQKLQlQQUNBSU5JVERBVEEoNjQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2NSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDY2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNjcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2OCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDY5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3MSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDcyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3NCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDc1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3NywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDc4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4MCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDgxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4MywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDg0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4NiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDg3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4OSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDkwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5MiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDkzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5NSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDk2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5OCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDk5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTAwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTAxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTAyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTAzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTA5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTEwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTExLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTEyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTEzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTE5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTIwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTIxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTIyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTIzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTI0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTI1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTI2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTI3LCAwLCBOVUxMLCAwLCAwKSwKKwlQQUNBX0lOSVQoIDY0KSwgUEFDQV9JTklUKCA2NSksIFBBQ0FfSU5JVCggNjYpLCBQQUNBX0lOSVQoIDY3KSwKKwlQQUNBX0lOSVQoIDY4KSwgUEFDQV9JTklUKCA2OSksIFBBQ0FfSU5JVCggNzApLCBQQUNBX0lOSVQoIDcxKSwKKwlQQUNBX0lOSVQoIDcyKSwgUEFDQV9JTklUKCA3MyksIFBBQ0FfSU5JVCggNzQpLCBQQUNBX0lOSVQoIDc1KSwKKwlQQUNBX0lOSVQoIDc2KSwgUEFDQV9JTklUKCA3NyksIFBBQ0FfSU5JVCggNzgpLCBQQUNBX0lOSVQoIDc5KSwKKwlQQUNBX0lOSVQoIDgwKSwgUEFDQV9JTklUKCA4MSksIFBBQ0FfSU5JVCggODIpLCBQQUNBX0lOSVQoIDgzKSwKKwlQQUNBX0lOSVQoIDg0KSwgUEFDQV9JTklUKCA4NSksIFBBQ0FfSU5JVCggODYpLCBQQUNBX0lOSVQoIDg3KSwKKwlQQUNBX0lOSVQoIDg4KSwgUEFDQV9JTklUKCA4OSksIFBBQ0FfSU5JVCggOTApLCBQQUNBX0lOSVQoIDkxKSwKKwlQQUNBX0lOSVQoIDkyKSwgUEFDQV9JTklUKCA5MyksIFBBQ0FfSU5JVCggOTQpLCBQQUNBX0lOSVQoIDk1KSwKKwlQQUNBX0lOSVQoIDk2KSwgUEFDQV9JTklUKCA5NyksIFBBQ0FfSU5JVCggOTgpLCBQQUNBX0lOSVQoIDk5KSwKKwlQQUNBX0lOSVQoMTAwKSwgUEFDQV9JTklUKDEwMSksIFBBQ0FfSU5JVCgxMDIpLCBQQUNBX0lOSVQoMTAzKSwKKwlQQUNBX0lOSVQoMTA0KSwgUEFDQV9JTklUKDEwNSksIFBBQ0FfSU5JVCgxMDYpLCBQQUNBX0lOSVQoMTA3KSwKKwlQQUNBX0lOSVQoMTA4KSwgUEFDQV9JTklUKDEwOSksIFBBQ0FfSU5JVCgxMTApLCBQQUNBX0lOSVQoMTExKSwKKwlQQUNBX0lOSVQoMTEyKSwgUEFDQV9JTklUKDExMyksIFBBQ0FfSU5JVCgxMTQpLCBQQUNBX0lOSVQoMTE1KSwKKwlQQUNBX0lOSVQoMTE2KSwgUEFDQV9JTklUKDExNyksIFBBQ0FfSU5JVCgxMTgpLCBQQUNBX0lOSVQoMTE5KSwKKwlQQUNBX0lOSVQoMTIwKSwgUEFDQV9JTklUKDEyMSksIFBBQ0FfSU5JVCgxMjIpLCBQQUNBX0lOSVQoMTIzKSwKKwlQQUNBX0lOSVQoMTI0KSwgUEFDQV9JTklUKDEyNSksIFBBQ0FfSU5JVCgxMjYpLCBQQUNBX0lOSVQoMTI3KSwKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKaW5kZXggNTgwNjc2Zi4uYWU2ZjU3OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCQkqb2Zmc2V0ICs9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwogCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CiAJfSBlbHNlIHsKLQkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0OworCQlpb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKIAkJKm9mZnNldCArPSBpb19vZmZzZXQ7CiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwogCX0KQEAgLTM3OCw3ICszNzgsNyBAQAogCiAJCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCi0JCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKKwkJICAgICAgIAkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKIAkJcmV0dXJuIHJwOwogCX0KIApAQCAtOTQ0LDQgKzk0NCwyMiBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfcmVhZF9pcnFfbGluZSk7CiAKK3ZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKwkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAorCQkJICB1NjQgKnN0YXJ0LCB1NjQgKmVuZCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9IHBjaV9pb19iYXNlIC0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0ICsKKwkJCWhvc2UtPmlvX2Jhc2VfcGh5czsKKworCSpzdGFydCA9IHJzcmMtPnN0YXJ0ICsgb2Zmc2V0OworCSplbmQgPSByc3JjLT5lbmQgKyBvZmZzZXQ7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYwppbmRleCA2Y2YwM2QzLi4zMDEzY2RiIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NldHVwLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19zZXR1cC5jCkBAIC0xODYsNiArMTg2LDggQEAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBuYXRpdmUvTkFQIGlkbGUgbG9vcFxuIik7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NTSQpAQCAtNTA3LDUgKzUwOSw2IEBACiAgICAgICAJLmNhbGlicmF0ZV9kZWNyCQk9IHBtYWNfY2FsaWJyYXRlX2RlY3IsCiAJLmZlYXR1cmVfY2FsbAkJPSBwbWFjX2RvX2ZlYXR1cmVfY2FsbCwKIAkucHJvZ3Jlc3MJCT0gcG1hY19wcm9ncmVzcywKLQkuY2hlY2tfbGVnYWN5X2lvcG9ydAk9IHBtYWNfY2hlY2tfbGVnYWN5X2lvcG9ydAorCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gcG1hY19jaGVja19sZWdhY3lfaW9wb3J0LAorCS5pZGxlX2xvb3AJCT0gbmF0aXZlX2lkbGUsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBiMjMwYTYzLi43MDU3NDJmIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNzUsNiArNzUsNyBAQAogRVhQT1JUX1NZTUJPTChnaXZldXBfYWx0aXZlYyk7CiAjZW5kaWYKIEVYUE9SVF9TWU1CT0woX19mbHVzaF9pY2FjaGVfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChmbHVzaF9kY2FjaGVfcmFuZ2UpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGFiYTg5NTUuLmY3Y2FlMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zMDcsNiArMzA4LDggQEAKIAogdm9pZCBleGl0X3RocmVhZCh2b2lkKQogeworCWtwcm9iZV9mbHVzaF90YXNrKGN1cnJlbnQpOworCiAjaWZuZGVmIENPTkZJR19TTVAKIAlpZiAobGFzdF90YXNrX3VzZWRfbWF0aCA9PSBjdXJyZW50KQogCQlsYXN0X3Rhc2tfdXNlZF9tYXRoID0gTlVMTDsKQEAgLTMyMSw2ICszMjQsNyBAQAogewogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAorCWtwcm9iZV9mbHVzaF90YXNrKGN1cnJlbnQpOwogCWlmICh0LT5mbGFncyAmIF9USUZfQUJJX1BFTkRJTkcpCiAJCXQtPmZsYWdzIF49IChfVElGX0FCSV9QRU5ESU5HIHwgX1RJRl8zMkJJVCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGQ1ZTQ4NjYuLmQxYjMzZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvc2V0dXAuYwpAQCAtOTYsNyArOTYsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcga2xpbWl0OwogCiBleHRlcm4gdm9pZCBtbV9pbml0X3BwYzY0KHZvaWQpOwotZXh0ZXJuIGludCAgaWRsZV9zZXR1cCh2b2lkKTsKIGV4dGVybiB2b2lkIHN0YWJfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIHN0YWIpOwogZXh0ZXJuIHZvaWQgaHRhYl9pbml0aWFsaXplKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9kZXZ0cmVlKHZvaWQgKmZsYXRfZHQpOwpAQCAtMTA4MSw4ICsxMDgwLDExIEBACiAKIAlwcGNfbWQuc2V0dXBfYXJjaCgpOwogCi0JLyogU2VsZWN0IHRoZSBjb3JyZWN0IGlkbGUgbG9vcCBmb3IgdGhlIHBsYXRmb3JtLiAqLwotCWlkbGVfc2V0dXAoKTsKKwkvKiBVc2UgdGhlIGRlZmF1bHQgaWRsZSBsb29wIGlmIHRoZSBwbGF0Zm9ybSBoYXNuJ3QgcHJvdmlkZWQgb25lLiAqLworCWlmIChOVUxMID09IHBwY19tZC5pZGxlX2xvb3ApIHsKKwkJcHBjX21kLmlkbGVfbG9vcCA9IGRlZmF1bHRfaWRsZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOworCX0KIAogCXBhZ2luZ19pbml0KCk7CiAJcHBjNjRfYm9vdF9tc2coMHgxNSwgIlNldHVwIERvbmUiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKaW5kZXggMTE4NDM2ZS4uMjA2NjE5MCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTMwLDQ3ICszMCwyNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L21zZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NobS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91aW8uaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpb19hYmkuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KIAotI2luY2x1ZGUgPG5ldC9zY20uaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcGMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwY2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtY2ZnLmg+CkBAIC0zNTAsOCArMzI5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLS8qIFRoZXNlIGFyZSBoZXJlIGp1c3QgaW4gY2FzZSBzb21lIG9sZCBzcGFyYzMyIGJpbmFyeSBjYWxscyBpdC4gKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9wYXVzZSh2b2lkKQogewogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwpAQCAtMzYwLDggKzMzNyw2IEBACiAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAotCi0KIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdHMzMihzdHJ1Y3QgdGltZXNwZWMgKm8sIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCiB7CiAJbG9uZyB1c2VjOwpAQCAtODQ3LDE2ICs4MjIsNiBAQAogfQogCiAKLS8qIE5vdGU6IGl0IGlzIG5lY2Vzc2FyeSB0byB0cmVhdCB3aGljaCBhbmQgd2hvIGFzIHVuc2lnbmVkIGludHMsCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNhc3QgdG8gYSBzaWduZWQgaW50IHRvIGluc3VyZSB0aGF0IHRoZSAKLSAqIHByb3BlciBjb252ZXJzaW9uIChzaWduIGV4dGVuc2lvbikgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduZWQgaW50IChtc3IgaW4gMzItYml0IG1vZGUpCi0gKiBhbmQgdGhlIHJlZ2lzdGVyIHJlcHJlc2VudGF0aW9uIG9mIGEgc2lnbmVkIGludCAobXNyIGluIDY0LWJpdCBtb2RlKSBpcyBwZXJmb3JtZWQuCi0gKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9nZXRwcmlvcml0eSh1MzIgd2hpY2gsIHUzMiB3aG8pCi17Ci0JcmV0dXJuIHN5c19nZXRwcmlvcml0eSgoaW50KXdoaWNoLCAoaW50KXdobyk7Ci19Ci0KIAogLyogTm90ZTogaXQgaXMgbmVjZXNzYXJ5IHRvIHRyZWF0IHBpZCBhcyBhbiB1bnNpZ25lZCBpbnQsCiAgKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNhc3QgdG8gYSBzaWduZWQgaW50IHRvIGluc3VyZSB0aGF0IHRoZSAKQEAgLTEwNDgsNiArMTAxMywxMSBAQAogCXJldHVybiBzeXNfc2V0cGdpZCgoaW50KXBpZCwgKGludClwZ2lkKTsKIH0KIAorbG9uZyBzeXMzMl9nZXRwcmlvcml0eSh1MzIgd2hpY2gsIHUzMiB3aG8pCit7CisJLyogc2lnbiBleHRlbmQgd2hpY2ggYW5kIHdobyAqLworCXJldHVybiBzeXNfZ2V0cHJpb3JpdHkoKGludCl3aGljaCwgKGludCl3aG8pOworfQogCiBsb25nIHN5czMyX3NldHByaW9yaXR5KHUzMiB3aGljaCwgdTMyIHdobywgdTMyIG5pY2V2YWwpCiB7CkBAIC0xMDU1LDYgKzEwMjUsMTggQEAKIAlyZXR1cm4gc3lzX3NldHByaW9yaXR5KChpbnQpd2hpY2gsIChpbnQpd2hvLCAoaW50KW5pY2V2YWwpOwogfQogCitsb25nIHN5czMyX2lvcHJpb19nZXQodTMyIHdoaWNoLCB1MzIgd2hvKQoreworCS8qIHNpZ24gZXh0ZW5kIHdoaWNoIGFuZCB3aG8gKi8KKwlyZXR1cm4gc3lzX2lvcHJpb19nZXQoKGludCl3aGljaCwgKGludCl3aG8pOworfQorCitsb25nIHN5czMyX2lvcHJpb19zZXQodTMyIHdoaWNoLCB1MzIgd2hvLCB1MzIgaW9wcmlvKQoreworCS8qIHNpZ24gZXh0ZW5kIHdoaWNoLCB3aG8gYW5kIGlvcHJpbyAqLworCXJldHVybiBzeXNfaW9wcmlvX3NldCgoaW50KXdoaWNoLCAoaW50KXdobywgKGludClpb3ByaW8pOworfQorCiAvKiBOb3RlOiBpdCBpcyBuZWNlc3NhcnkgdG8gdHJlYXQgbmV3bWFzayBhcyBhbiB1bnNpZ25lZCBpbnQsCiAgKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNhc3QgdG8gYSBzaWduZWQgaW50IHRvIGluc3VyZSB0aGF0IHRoZSAKICAqIHByb3BlciBjb252ZXJzaW9uIChzaWduIGV4dGVuc2lvbikgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduZWQgaW50IChtc3IgaW4gMzItYml0IG1vZGUpCkBAIC0xMjczLDggKzEyNTUsNiBAQAogCQkJICAgICAodTY0KWxlbl9oaWdoIDw8IDMyIHwgbGVuX2xvdywgYWR2aWNlKTsKIH0KIAotZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBzeXNfdGltZXJfY3JlYXRlKGNsb2NraWRfdCwgc2lnZXZlbnRfdCBfX3VzZXIgKiwgdGltZXJfdCBfX3VzZXIgKik7Ci0KIGxvbmcgcHBjMzJfdGltZXJfY3JlYXRlKGNsb2NraWRfdCBjbG9jaywKIAkJCXN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICpldjMyLAogCQkJdGltZXJfdCBfX3VzZXIgKnRpbWVyX2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c2ZzLmMKaW5kZXggYzhmYTY1Ni4uMDJiOGFjNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0xMTIsNyArMTEyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGhpZDA7CiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiAJdW5zaWduZWQgbG9uZyBzZXQsIHJlc2V0OwotCWludCByZXQ7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAKIAkvKiBPbmx5IG5lZWQgdG8gZW5hYmxlIHRoZW0gb25jZSAqLwpAQCAtMTQ1LDExICsxNDQsNyBAQAogCWNhc2UgUExBVEZPUk1fUFNFUklFU19MUEFSOgogCQlzZXQgPSAxVUwgPDwgNjM7CiAJCXJlc2V0ID0gMDsKLQkJcmV0ID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfUEVSRk1PTiwgc2V0LCByZXNldCk7Ci0JCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIgIkhfUEVSRk1PTiBjYWxsIG9uIGNwdSAldSAiCi0JCQkgICAgICAgInJldHVybmVkICVkXG4iLAotCQkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgcmV0KTsKKwkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfUEVSRk1PTiwgc2V0LCByZXNldCk7CiAJCWJyZWFrOwogI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogCkBAIC0xNjEsMTMgKzE1Niw2IEBACiAJLyogaW5zdHJ1Y3QgaHlwZXJ2aXNvciB0byBtYWludGFpbiBQTUNzICovCiAJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikKIAkJZ2V0X3BhY2EoKS0+bHBwYWNhLnBtY3JlZ3NfaW5fdXNlID0gMTsKLQotCS8qCi0JICogT24gU01UIG1hY2hpbmVzIHdlIGhhdmUgdG8gc2V0IHRoZSBydW4gbGF0Y2ggaW4gdGhlIGN0cmwgcmVnaXN0ZXIKLQkgKiBpbiBvcmRlciB0byBtYWtlIFBNQzYgc3Bpbi4KLQkgKi8KLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKLQkJcHBjNjRfcnVubGF0Y2hfb24oKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KIH0KIApAQCAtNDAwLDcgKzM4OCwxMiBAQAogCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CiAKICNpZmRlZiBDT05GSUdfTlVNQQotCQlwYXJlbnQgPSAmbm9kZV9kZXZpY2VzW2NwdV90b19ub2RlKGNwdSldOworCQkvKiBUaGUgbm9kZSB0byB3aGljaCBhIGNwdSBiZWxvbmdzIGNhbid0IGJlIGtub3duCisJCSAqIHVudGlsIHRoZSBjcHUgaXMgbWFkZSBwcmVzZW50LgorCQkgKi8KKwkJcGFyZW50ID0gTlVMTDsKKwkJaWYgKGNwdV9wcmVzZW50KGNwdSkpCisJCQlwYXJlbnQgPSAmbm9kZV9kZXZpY2VzW2NwdV90b19ub2RlKGNwdSldOwogI2VuZGlmCiAJCS8qCiAJCSAqIEZvciBub3csIHdlIGp1c3Qgc2VlIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgbWFraW5nCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggMjM0OGE3NS4uOTA5NDYyZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYwpAQCAtOTEsNiArOTEsNyBAQAogdW5zaWduZWQgICAgICB0Yl90b191czsKIHVuc2lnbmVkIGxvbmcgcHJvY2Vzc29yX2ZyZXE7CiBERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOworRVhQT1JUX1NZTUJPTF9HUEwocnRjX2xvY2spOwogCiB1bnNpZ25lZCBsb25nIHRiX3RvX25zX3NjYWxlOwogdW5zaWduZWQgbG9uZyB0Yl90b19uc19zaGlmdDsKQEAgLTk4LDcgKzk5LDYgQEAKIHN0cnVjdCBnZXR0aW1lb2ZkYXlfc3RydWN0IGRvX2d0b2Q7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHdhbGxfamlmZmllczsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxwZXZlbnRfY291bnQ7CiBleHRlcm4gaW50IHNtcF90Yl9zeW5jaHJvbml6ZWQ7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwpAQCAtMzY2LDExICszNjYsOCBAQAogCXNldF9kZWMobmV4dF9kZWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JewotCQlzdHJ1Y3QgSXRMcFF1ZXVlICpscHEgPSBscGFjYS0+bHBxdWV1ZV9wdHI7Ci0JCWlmIChscHEgJiYgSXRMcFF1ZXVlX2lzTHBJbnRQZW5kaW5nKGxwcSkpCi0JCQlscGV2ZW50X2NvdW50ICs9IEl0THBRdWV1ZV9wcm9jZXNzKGxwcSwgcmVncyk7Ci0JfQorCWlmIChodmxwZXZlbnRfaXNfcGVuZGluZygpKQorCQlwcm9jZXNzX2h2bHBldmVudHMocmVncyk7CiAjZW5kaWYKIAogLyogY29sbGVjdCBwdXJyIHJlZ2lzdGVyIHZhbHVlcyBvZnRlbiwgZm9yIGFjY3VyYXRlIGNhbGN1bGF0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKaW5kZXggMTEyOTBjOS4uNmY4N2E5MSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCkBAIC00MCw5ICs0MCw5IEBACiAgIC5nY2NfZXhjZXB0X3RhYmxlCTogeyAqKC5nY2NfZXhjZXB0X3RhYmxlKSB9CiAgIC5maXh1cAkJOiB7ICooLmZpeHVwKSB9CiAKLSAgLmdvdCBBTElHTig0KQkJOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotCiAgIC5keW5hbWljCQk6IHsgKiguZHluYW1pYykgfQkJOnRleHQJOmR5bmFtaWMKKyAgLmdvdCA6IHsgKiguZ290KSB9CisgIC5wbHQgOiB7ICooLnBsdCkgfQogCiAgIF9lbmQgPSAuOwogICBfX2VuZCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L21tL2hhc2hfbG93LlMgYi9hcmNoL3BwYzY0L21tL2hhc2hfbG93LlMKaW5kZXggYzIzZDQ2OS4uZmJmZjI0OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9tbS9oYXNoX2xvdy5TCisrKyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUwpAQCAtMTcwLDkgKzE3MCw3IEBACiAJLyogQ2FsbCBwcGNfbWQuaHB0ZV9pbnNlcnQgKi8KIAlsZAlyNyxTVEtfUEFSTShyNCkocjEpCS8qIFJldHJlaXZlIG5ldyBwcCBiaXRzICovCiAJbXIJcjQscjI5CQkJLyogUmV0cmVpdmUgdmEgKi8KLQlsaQlyNiwwCQkJLyogcHJpbWFyeSBzbG90ICovCi0JbGkJcjgsMAkJCS8qIG5vdCBib2x0ZWQgYW5kIG5vdCBsYXJnZSAqLwotCWxpCXI5LDAKKwlsaQlyNiwwCQkJLyogbm8gdmZsYWdzICovCiBfR0xPQkFMKGh0YWJfY2FsbF9ocHRlX2luc2VydDEpCiAJYmwJLgkJCS8qIFdpbGwgYmUgcGF0Y2hlZCBieSBodGFiX2ZpbmlzaF9pbml0KCkgKi8KIAljbXBkaQkwLHIzLDAKQEAgLTE5Miw5ICsxOTAsNyBAQAogCS8qIENhbGwgcHBjX21kLmhwdGVfaW5zZXJ0ICovCiAJbGQJcjcsU1RLX1BBUk0ocjQpKHIxKQkvKiBSZXRyZWl2ZSBuZXcgcHAgYml0cyAqLwogCW1yCXI0LHIyOQkJCS8qIFJldHJlaXZlIHZhICovCi0JbGkJcjYsMQkJCS8qIHNlY29uZGFyeSBzbG90ICovCi0JbGkJcjgsMAkJCS8qIG5vdCBib2x0ZWQgYW5kIG5vdCBsYXJnZSAqLwotCWxpCXI5LDAKKwlsaQlyNixIUFRFX1ZfU0VDT05EQVJZQGwJLyogc2Vjb25kYXJ5IHNsb3QgKi8KIF9HTE9CQUwoaHRhYl9jYWxsX2hwdGVfaW5zZXJ0MikKIAlibAkuCQkJLyogV2lsbCBiZSBwYXRjaGVkIGJ5IGh0YWJfZmluaXNoX2luaXQoKSAqLwogCWNtcGRpCTAscjMsMApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9oYXNoX25hdGl2ZS5jIGIvYXJjaC9wcGM2NC9tbS9oYXNoX25hdGl2ZS5jCmluZGV4IDRmZWMwNTguLmE2YWJkM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaGFzaF9uYXRpdmUuYworKysgYi9hcmNoL3BwYzY0L21tL2hhc2hfbmF0aXZlLmMKQEAgLTI3LDkgKzI3LDkgQEAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhuYXRpdmVfdGxiaWVfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfbG9ja19ocHRlKEhQVEUgKmhwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9sb2NrX2hwdGUoaHB0ZV90ICpocHRlcCkKIHsKLQl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT5kdzAuZHdvcmQwOworCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAmaHB0ZXAtPnY7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSFBURV9MT0NLX0JJVCwgd29yZCkpCkBAIC0zOSwzMiArMzksMjggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoSFBURSAqaHB0ZXApCitzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX3VubG9ja19ocHRlKGhwdGVfdCAqaHB0ZXApCiB7Ci0JdW5zaWduZWQgbG9uZyAqd29yZCA9ICZocHRlcC0+ZHcwLmR3b3JkMDsKKwl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCiAJYXNtIHZvbGF0aWxlKCJsd3N5bmMiOjo6Im1lbW9yeSIpOwogCWNsZWFyX2JpdChIUFRFX0xPQ0tfQklULCB3b3JkKTsKIH0KIAogbG9uZyBuYXRpdmVfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLCB1bnNpZ25lZCBsb25nIHZhLAotCQkJdW5zaWduZWQgbG9uZyBwcnBuLCBpbnQgc2Vjb25kYXJ5LAotCQkJdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsIGludCBib2x0ZWQsIGludCBsYXJnZSkKKwkJCXVuc2lnbmVkIGxvbmcgcHJwbiwgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsCisJCQl1bnNpZ25lZCBsb25nIHJmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGFycG4gPSBwaHlzUnBuX3RvX2Fic1JwbihwcnBuKTsKLQlIUFRFICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIGhwdGVfZ3JvdXA7Ci0JSHB0ZV9kd29yZDAgZHcwOwotCUhQVEUgbGhwdGU7CisJaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIGhwdGVfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBocHRlX3YsIGhwdGVfcjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBIUFRFU19QRVJfR1JPVVA7IGkrKykgewotCQlkdzAgPSBocHRlcC0+ZHcwLmR3MDsKLQotCQlpZiAoIWR3MC52KSB7CisJCWlmICghIChocHRlcC0+diAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJCS8qIHJldHJ5IHdpdGggbG9jayBoZWxkICovCiAJCQluYXRpdmVfbG9ja19ocHRlKGhwdGVwKTsKLQkJCWR3MCA9IGhwdGVwLT5kdzAuZHcwOwotCQkJaWYgKCFkdzAudikKKwkJCWlmICghIChocHRlcC0+diAmIEhQVEVfVl9WQUxJRCkpCiAJCQkJYnJlYWs7CiAJCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCQl9CkBAIC03NSw1NiArNzEsNDUgQEAKIAlpZiAoaSA9PSBIUFRFU19QRVJfR1JPVVApCiAJCXJldHVybiAtMTsKIAotCWxocHRlLmR3MS5kd29yZDEgICAgICA9IDA7Ci0JbGhwdGUuZHcxLmR3MS5ycG4gICAgID0gYXJwbjsKLQlsaHB0ZS5kdzEuZmxhZ3MuZmxhZ3MgPSBocHRlZmxhZ3M7CisJaHB0ZV92ID0gKHZhID4+IDIzKSA8PCBIUFRFX1ZfQVZQTl9TSElGVCB8IHZmbGFncyB8IEhQVEVfVl9WQUxJRDsKKwlpZiAodmZsYWdzICYgSFBURV9WX0xBUkdFKQorCQl2YSAmPSB+KDFVTCA8PCBIUFRFX1ZfQVZQTl9TSElGVCk7CisJaHB0ZV9yID0gKGFycG4gPDwgSFBURV9SX1JQTl9TSElGVCkgfCByZmxhZ3M7CiAKLQlsaHB0ZS5kdzAuZHdvcmQwICAgICAgPSAwOwotCWxocHRlLmR3MC5kdzAuYXZwbiAgICA9IHZhID4+IDIzOwotCWxocHRlLmR3MC5kdzAuaCAgICAgICA9IHNlY29uZGFyeTsKLQlsaHB0ZS5kdzAuZHcwLmJvbHRlZCAgPSBib2x0ZWQ7Ci0JbGhwdGUuZHcwLmR3MC52ICAgICAgID0gMTsKLQotCWlmIChsYXJnZSkgewotCQlsaHB0ZS5kdzAuZHcwLmwgPSAxOwotCQlsaHB0ZS5kdzAuZHcwLmF2cG4gJj0gfjB4MVVMOwotCX0KLQotCWhwdGVwLT5kdzEuZHdvcmQxID0gbGhwdGUuZHcxLmR3b3JkMTsKLQorCWhwdGVwLT5yID0gaHB0ZV9yOwogCS8qIEd1YXJhbnRlZSB0aGUgc2Vjb25kIGR3b3JkIGlzIHZpc2libGUgYmVmb3JlIHRoZSB2YWxpZCBiaXQgKi8KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7Ci0KIAkvKgogCSAqIE5vdyBzZXQgdGhlIGZpcnN0IGR3b3JkIGluY2x1ZGluZyB0aGUgdmFsaWQgYml0CiAJICogTk9URTogdGhpcyBhbHNvIHVubG9ja3MgdGhlIGhwdGUKIAkgKi8KLQlocHRlcC0+ZHcwLmR3b3JkMCA9IGxocHRlLmR3MC5kd29yZDA7CisJaHB0ZXAtPnYgPSBocHRlX3Y7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKIAotCXJldHVybiBpIHwgKHNlY29uZGFyeSA8PCAzKTsKKwlyZXR1cm4gaSB8ICghISh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKSA8PCAzKTsKIH0KIAogc3RhdGljIGxvbmcgbmF0aXZlX2hwdGVfcmVtb3ZlKHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCkKIHsKLQlIUFRFICpocHRlcDsKLQlIcHRlX2R3b3JkMCBkdzA7CisJaHB0ZV90ICpocHRlcDsKIAlpbnQgaTsKIAlpbnQgc2xvdF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBocHRlX3Y7CiAKIAkvKiBwaWNrIGEgcmFuZG9tIGVudHJ5IHRvIHN0YXJ0IGF0ICovCiAJc2xvdF9vZmZzZXQgPSBtZnRiKCkgJiAweDc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFBURVNfUEVSX0dST1VQOyBpKyspIHsKIAkJaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBocHRlX2dyb3VwICsgc2xvdF9vZmZzZXQ7Ci0JCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCQlocHRlX3YgPSBocHRlcC0+djsKIAotCQlpZiAoZHcwLnYgJiYgIWR3MC5ib2x0ZWQpIHsKKwkJaWYgKChocHRlX3YgJiBIUFRFX1ZfVkFMSUQpICYmICEoaHB0ZV92ICYgSFBURV9WX0JPTFRFRCkpIHsKIAkJCS8qIHJldHJ5IHdpdGggbG9jayBoZWxkICovCiAJCQluYXRpdmVfbG9ja19ocHRlKGhwdGVwKTsKLQkJCWR3MCA9IGhwdGVwLT5kdzAuZHcwOwotCQkJaWYgKGR3MC52ICYmICFkdzAuYm9sdGVkKQorCQkJaHB0ZV92ID0gaHB0ZXAtPnY7CisJCQlpZiAoKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkKKwkJCSAgICAmJiAhKGhwdGVfdiAmIEhQVEVfVl9CT0xURUQpKQogCQkJCWJyZWFrOwogCQkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJfQpAQCAtMTM3LDE1ICsxMjIsMTUgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogSW52YWxpZGF0ZSB0aGUgaHB0ZS4gTk9URTogdGhpcyBhbHNvIHVubG9ja3MgaXQgKi8KLQlocHRlcC0+ZHcwLmR3b3JkMCA9IDA7CisJaHB0ZXAtPnYgPSAwOwogCiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHBfYml0KHVuc2lnbmVkIGxvbmcgcHAsIEhQVEUgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BwX2JpdCh1bnNpZ25lZCBsb25nIHBwLCBocHRlX3QgKmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBvbGQ7Ci0JdW5zaWduZWQgbG9uZyAqcCA9ICZhZGRyLT5kdzEuZHdvcmQxOworCXVuc2lnbmVkIGxvbmcgKnAgPSAmYWRkci0+cjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSIxOglsZGFyeAklMCwwLCUzXG5cCkBAIC0xNjMsMTEgKzE0OCwxMSBAQAogICovCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9maW5kKHVuc2lnbmVkIGxvbmcgdnBuKQogewotCUhQVEUgKmhwdGVwOworCWhwdGVfdCAqaHB0ZXA7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXVuc2lnbmVkIGxvbmcgaSwgajsKIAlsb25nIHNsb3Q7Ci0JSHB0ZV9kd29yZDAgZHcwOworCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCiAJaGFzaCA9IGhwdF9oYXNoKHZwbiwgMCk7CiAKQEAgLTE3NSwxMCArMTYwLDExIEBACiAJCXNsb3QgPSAoaGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqIEhQVEVTX1BFUl9HUk9VUDsKIAkJZm9yIChpID0gMDsgaSA8IEhQVEVTX1BFUl9HUk9VUDsgaSsrKSB7CiAJCQlocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7Ci0JCQlkdzAgPSBocHRlcC0+ZHcwLmR3MDsKKwkJCWhwdGVfdiA9IGhwdGVwLT52OwogCi0JCQlpZiAoKGR3MC5hdnBuID09ICh2cG4gPj4gMTEpKSAmJiBkdzAudiAmJgotCQkJICAgIChkdzAuaCA9PSBqKSkgeworCQkJaWYgKChIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KSA9PSAodnBuID4+IDExKSkKKwkJCSAgICAmJiAoaHB0ZV92ICYgSFBURV9WX1ZBTElEKQorCQkJICAgICYmICggISEoaHB0ZV92ICYgSFBURV9WX1NFQ09OREFSWSkgPT0gaikpIHsKIAkJCQkvKiBIUFRFIG1hdGNoZXMgKi8KIAkJCQlpZiAoaikKIAkJCQkJc2xvdCA9IC1zbG90OwpAQCAtMTk1LDIwICsxODEsMjEgQEAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgdW5zaWduZWQgbG9uZyB2YSwgaW50IGxhcmdlLCBpbnQgbG9jYWwpCiB7Ci0JSFBURSAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBzbG90OwotCUhwdGVfZHdvcmQwIGR3MDsKKwlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIGF2cG4gPSB2YSA+PiAyMzsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChsYXJnZSkKLQkJYXZwbiAmPSB+MHgxVUw7CisJCWF2cG4gJj0gfjE7CiAKIAluYXRpdmVfbG9ja19ocHRlKGhwdGVwKTsKIAotCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCWhwdGVfdiA9IGhwdGVwLT52OwogCiAJLyogRXZlbiBpZiB3ZSBtaXNzLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlIFRMQiAqLwotCWlmICgoZHcwLmF2cG4gIT0gYXZwbikgfHwgIWR3MC52KSB7CisJaWYgKChIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KSAhPSBhdnBuKQorCSAgICB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJcmV0ID0gLTE7CiAJfSBlbHNlIHsKQEAgLTI0NCw3ICsyMzEsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdnNpZCwgdmEsIHZwbiwgZmxhZ3MgPSAwOwogCWxvbmcgc2xvdDsKLQlIUFRFICpocHRlcDsKKwlocHRlX3QgKmhwdGVwOwogCWludCBsb2NrX3RsYmllID0gIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0xPQ0tMRVNTX1RMQklFKTsKIAogCXZzaWQgPSBnZXRfa2VybmVsX3ZzaWQoZWEpOwpAQCAtMjY5LDI2ICsyNTYsMjcgQEAKIHN0YXRpYyB2b2lkIG5hdGl2ZV9ocHRlX2ludmFsaWRhdGUodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIHZhLAogCQkJCSAgICBpbnQgbGFyZ2UsIGludCBsb2NhbCkKIHsKLQlIUFRFICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7Ci0JSHB0ZV9kd29yZDAgZHcwOworCWhwdGVfdCAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBzbG90OworCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCXVuc2lnbmVkIGxvbmcgYXZwbiA9IHZhID4+IDIzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxvY2tfdGxiaWUgPSAhY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTE9DS0xFU1NfVExCSUUpOwogCiAJaWYgKGxhcmdlKQotCQlhdnBuICY9IH4weDFVTDsKKwkJYXZwbiAmPSB+MTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAluYXRpdmVfbG9ja19ocHRlKGhwdGVwKTsKIAotCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCWhwdGVfdiA9IGhwdGVwLT52OwogCiAJLyogRXZlbiBpZiB3ZSBtaXNzLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlIFRMQiAqLwotCWlmICgoZHcwLmF2cG4gIT0gYXZwbikgfHwgIWR3MC52KSB7CisJaWYgKChIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KSAhPSBhdnBuKQorCSAgICB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAl9IGVsc2UgewogCQkvKiBJbnZhbGlkYXRlIHRoZSBocHRlLiBOT1RFOiB0aGlzIGFsc28gdW5sb2NrcyBpdCAqLwotCQlocHRlcC0+ZHcwLmR3b3JkMCA9IDA7CisJCWhwdGVwLT52ID0gMDsKIAl9CiAKIAkvKiBJbnZhbGlkYXRlIHRoZSB0bGIgKi8KQEAgLTMxNSw4ICszMDMsOCBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2hwdGVfY2xlYXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNsb3QsIHNsb3RzLCBmbGFnczsKLQlIUFRFICpocHRlcCA9IGh0YWJfYWRkcmVzczsKLQlIcHRlX2R3b3JkMCBkdzA7CisJaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHB0ZWdfY291bnQ7CiAKIAlwdGVnX2NvdW50ID0gaHRhYl9oYXNoX21hc2sgKyAxOwpAQCAtMzM2LDExICszMjQsMTEgQEAKIAkJICogcnVubmluZywgIHJpZ2h0PyAgYW5kIGZvciBjcmFzaCBkdW1wLCB3ZSBwcm9iYWJseQogCQkgKiBkb24ndCB3YW50IHRvIHdhaXQgZm9yIGEgbWF5YmUgYmFkIGNwdS4KIAkJICovCi0JCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCQlocHRlX3YgPSBocHRlcC0+djsKIAotCQlpZiAoZHcwLnYpIHsKLQkJCWhwdGVwLT5kdzAuZHdvcmQwID0gMDsKLQkJCXRsYmllKHNsb3QydmEoZHcwLmF2cG4sIGR3MC5sLCBkdzAuaCwgc2xvdCksIGR3MC5sKTsKKwkJaWYgKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkgeworCQkJaHB0ZXAtPnYgPSAwOworCQkJdGxiaWUoc2xvdDJ2YShocHRlX3YsIHNsb3QpLCBocHRlX3YgJiBIUFRFX1ZfTEFSR0UpOwogCQl9CiAJfQogCkBAIC0zNTMsOCArMzQxLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHZzaWQsIHZwbiwgdmEsIGhhc2gsIHNlY29uZGFyeSwgc2xvdCwgZmxhZ3MsIGF2cG47CiAJaW50IGksIGo7Ci0JSFBURSAqaHB0ZXA7Ci0JSHB0ZV9kd29yZDAgZHcwOworCWhwdGVfdCAqaHB0ZXA7CisJdW5zaWduZWQgbG9uZyBocHRlX3Y7CiAJc3RydWN0IHBwYzY0X3RsYl9iYXRjaCAqYmF0Y2ggPSAmX19nZXRfY3B1X3ZhcihwcGM2NF90bGJfYmF0Y2gpOwogCiAJLyogWFhYIGZpeCBmb3IgbGFyZ2UgcHRlcyAqLwpAQCAtMzkwLDE0ICszNzgsMTUgQEAKIAogCQluYXRpdmVfbG9ja19ocHRlKGhwdGVwKTsKIAotCQlkdzAgPSBocHRlcC0+ZHcwLmR3MDsKKwkJaHB0ZV92ID0gaHB0ZXAtPnY7CiAKIAkJLyogRXZlbiBpZiB3ZSBtaXNzLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlIFRMQiAqLwotCQlpZiAoKGR3MC5hdnBuICE9IGF2cG4pIHx8ICFkdzAudikgeworCQlpZiAoKEhQVEVfVl9BVlBOX1ZBTChocHRlX3YpICE9IGF2cG4pCisJCSAgICB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJCW5hdGl2ZV91bmxvY2tfaHB0ZShocHRlcCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBJbnZhbGlkYXRlIHRoZSBocHRlLiBOT1RFOiB0aGlzIGFsc28gdW5sb2NrcyBpdCAqLwotCQkJaHB0ZXAtPmR3MC5kd29yZDAgPSAwOworCQkJaHB0ZXAtPnYgPSAwOwogCQl9CiAKIAkJaisrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9oYXNoX3V0aWxzLmMgYi9hcmNoL3BwYzY0L21tL2hhc2hfdXRpbHMuYwppbmRleCAxNjQ3YjFjLi42MjNiNWQxIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2hhc2hfdXRpbHMuYworKysgYi9hcmNoL3BwYzY0L21tL2hhc2hfdXRpbHMuYwpAQCAtNzUsOCArNzUsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZGFydF90YWJsZWJhc2U7CiAjZW5kaWYgLyogQ09ORklHX1UzX0RBUlQgKi8KIAotSFBURQkJKmh0YWJfYWRkcmVzczsKLXVuc2lnbmVkIGxvbmcJaHRhYl9oYXNoX21hc2s7CitocHRlX3QgKmh0YWJfYWRkcmVzczsKK3Vuc2lnbmVkIGxvbmcgaHRhYl9oYXNoX21hc2s7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9TRFIxOwogCkBAIC05NywxMSArOTcsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgaW50IHN0ZXA7CiAJdW5zaWduZWQgbG9uZyB0bXBfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHZmbGFnczsKIAotCWlmIChsYXJnZSkKKwlpZiAobGFyZ2UpIHsKIAkJc3RlcCA9IDE2Kk1COwotCWVsc2UKKwkJdmZsYWdzID0gSFBURV9WX0JPTFRFRCB8IEhQVEVfVl9MQVJHRTsKKwl9IGVsc2UgewogCQlzdGVwID0gNCpLQjsKKwkJdmZsYWdzID0gSFBURV9WX0JPTFRFRDsKKwl9CiAKIAlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSBzdGVwKSB7CiAJCXVuc2lnbmVkIGxvbmcgdnBuLCBoYXNoLCBocHRlZzsKQEAgLTEyOSwxMiArMTMzLDEyIEBACiAJCWlmIChzeXN0ZW1jZmctPnBsYXRmb3JtICYgUExBVEZPUk1fTFBBUikKIAkJCXJldCA9IHBTZXJpZXNfbHBhcl9ocHRlX2luc2VydChocHRlZywgdmEsCiAJCQkJdmlydF90b19hYnMoYWRkcikgPj4gUEFHRV9TSElGVCwKLQkJCQkwLCB0bXBfbW9kZSwgMSwgbGFyZ2UpOworCQkJCXZmbGFncywgdG1wX21vZGUpOwogCQllbHNlCiAjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAJCQlyZXQgPSBuYXRpdmVfaHB0ZV9pbnNlcnQoaHB0ZWcsIHZhLAogCQkJCXZpcnRfdG9fYWJzKGFkZHIpID4+IFBBR0VfU0hJRlQsCi0JCQkJMCwgdG1wX21vZGUsIDEsIGxhcmdlKTsKKwkJCQl2ZmxhZ3MsIHRtcF9tb2RlKTsKIAogCQlpZiAocmV0ID09IC0xKSB7CiAJCQlwcGM2NF90ZXJtaW5hdGVfbXNnKDB4MjAsICJjcmVhdGVfcHRlX21hcHBpbmciKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcHBjNjQvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBmZGNmZTk3Li5mOTUyNDYwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9wcGM2NC9tbS9odWdldGxicGFnZS5jCkBAIC01ODMsNyArNTgzLDcgQEAKIAlwdGVfdCAqcHRlcDsKIAl1bnNpZ25lZCBsb25nIHZhLCB2cG47CiAJcHRlX3Qgb2xkX3B0ZSwgbmV3X3B0ZTsKLQl1bnNpZ25lZCBsb25nIGhwdGVmbGFncywgcHJwbjsKKwl1bnNpZ25lZCBsb25nIHJmbGFncywgcHJwbjsKIAlsb25nIHNsb3Q7CiAJaW50IGVyciA9IDE7CiAKQEAgLTYyNiw5ICs2MjYsOSBAQAogCW9sZF9wdGUgPSAqcHRlcDsKIAluZXdfcHRlID0gb2xkX3B0ZTsKIAotCWhwdGVmbGFncyA9IDB4MiB8ICghIChwdGVfdmFsKG5ld19wdGUpICYgX1BBR0VfUlcpKTsKKwlyZmxhZ3MgPSAweDIgfCAoISAocHRlX3ZhbChuZXdfcHRlKSAmIF9QQUdFX1JXKSk7CiAgCS8qIF9QQUdFX0VYRUMgLT4gSFdfTk9fRVhFQyBzaW5jZSBpdCdzIGludmVydGVkICovCi0JaHB0ZWZsYWdzIHw9ICgocHRlX3ZhbChuZXdfcHRlKSAmIF9QQUdFX0VYRUMpID8gMCA6IEhXX05PX0VYRUMpOworCXJmbGFncyB8PSAoKHB0ZV92YWwobmV3X3B0ZSkgJiBfUEFHRV9FWEVDKSA/IDAgOiBIV19OT19FWEVDKTsKIAogCS8qIENoZWNrIGlmIHB0ZSBhbHJlYWR5IGhhcyBhbiBocHRlIChjYXNlIDIpICovCiAJaWYgKHVubGlrZWx5KHB0ZV92YWwob2xkX3B0ZSkgJiBfUEFHRV9IQVNIUFRFKSkgewpAQCAtNjQxLDcgKzY0MSw3IEBACiAJCXNsb3QgPSAoaGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqIEhQVEVTX1BFUl9HUk9VUDsKIAkJc2xvdCArPSAocHRlX3ZhbChvbGRfcHRlKSAmIF9QQUdFX0dST1VQX0lYKSA+PiAxMjsKIAotCQlpZiAocHBjX21kLmhwdGVfdXBkYXRlcHAoc2xvdCwgaHB0ZWZsYWdzLCB2YSwgMSwgbG9jYWwpID09IC0xKQorCQlpZiAocHBjX21kLmhwdGVfdXBkYXRlcHAoc2xvdCwgcmZsYWdzLCB2YSwgMSwgbG9jYWwpID09IC0xKQogCQkJcHRlX3ZhbChvbGRfcHRlKSAmPSB+X1BBR0VfSFBURUZMQUdTOwogCX0KIApAQCAtNjYxLDEwICs2NjEsMTAgQEAKIAogCQkvKiBBZGQgaW4gV0lNRyBiaXRzICovCiAJCS8qIFhYWCBXZSBzaG91bGQgc3RvcmUgdGhlc2UgaW4gdGhlIHB0ZSAqLwotCQlocHRlZmxhZ3MgfD0gX1BBR0VfQ09IRVJFTlQ7CisJCXJmbGFncyB8PSBfUEFHRV9DT0hFUkVOVDsKIAotCQlzbG90ID0gcHBjX21kLmhwdGVfaW5zZXJ0KGhwdGVfZ3JvdXAsIHZhLCBwcnBuLCAwLAotCQkJCQkgIGhwdGVmbGFncywgMCwgMSk7CisJCXNsb3QgPSBwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZV9ncm91cCwgdmEsIHBycG4sCisJCQkJCSAgSFBURV9WX0xBUkdFLCByZmxhZ3MpOwogCiAJCS8qIFByaW1hcnkgaXMgZnVsbCwgdHJ5IHRoZSBzZWNvbmRhcnkgKi8KIAkJaWYgKHVubGlrZWx5KHNsb3QgPT0gLTEpKSB7CkBAIC02NzIsNyArNjcyLDcgQEAKIAkJCWhwdGVfZ3JvdXAgPSAoKH5oYXNoICYgaHRhYl9oYXNoX21hc2spICoKIAkJCQkgICAgICBIUFRFU19QRVJfR1JPVVApICYgfjB4N1VMOyAKIAkJCXNsb3QgPSBwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZV9ncm91cCwgdmEsIHBycG4sCi0JCQkJCQkgIDEsIGhwdGVmbGFncywgMCwgMSk7CisJCQkJCQkgIEhQVEVfVl9MQVJHRSwgcmZsYWdzKTsKIAkJCWlmIChzbG90ID09IC0xKSB7CiAJCQkJaWYgKG1mdGIoKSAmIDB4MSkKIAkJCQkJaHB0ZV9ncm91cCA9ICgoaGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqIEhQVEVTX1BFUl9HUk9VUCkgJiB+MHg3VUw7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L21tL2luaXQuYyBiL2FyY2gvcHBjNjQvbW0vaW5pdC5jCmluZGV4IGI1MGIzYTQuLmU1OGEyNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvcHBjNjQvbW0vaW5pdC5jCkBAIC0xODAsOSArMTgwLDEwIEBACiAJCWhwdGVnID0gKChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQKTsKIAogCQkvKiBQYW5pYyBpZiBhIHB0ZSBncnB1cCBpcyBmdWxsICovCi0JCWlmIChwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZWcsIHZhLCBwYSA+PiBQQUdFX1NISUZULCAwLAotCQkJCSAgICAgICBfUEFHRV9OT19DQUNIRXxfUEFHRV9HVUFSREVEfFBQX1JXWFgsCi0JCQkJICAgICAgIDEsIDApID09IC0xKSB7CisJCWlmIChwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZWcsIHZhLCBwYSA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgICBIUFRFX1ZfQk9MVEVELAorCQkJCSAgICAgICBfUEFHRV9OT19DQUNIRXxfUEFHRV9HVUFSREVEfFBQX1JXWFgpCisJCSAgICA9PSAtMSkgewogCQkJcGFuaWMoIm1hcF9pb19wYWdlOiBjb3VsZCBub3QgaW5zZXJ0IG1hcHBpbmciKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggNjYwMGVlOC4uNDc3YWMyNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTQ2NSw2ICs0NjUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIGNvbmZpZyBQQ01DSUEKIAlib29sCiAJZGVmYXVsdCBuCkBAIC00NzUsNyArNDc3LDcgQEAKIAogc291cmNlICJkcml2ZXJzL3MzOTAvS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwppbmRleCA2MTQwNTYyLi4xODYxMGNlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYWR2aXNlLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXBjLmg+CkBAIC0xMDQzLDMgKzEwNDQsNDAgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKy8qCisgKiAzMSBiaXQgZW11bGF0aW9uIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzeXNfZmFkdmlzZTY0L2ZhZHZpc2U2NF82NC4KKyAqIFRoZXNlIG5lZWQgdG8gcmV3cml0ZSB0aGUgYWR2aXNlIHZhbHVlcyBmb3IgUE9TSVhfRkFEVl97RE9OVE5FRUQsTk9SRVVTRX0KKyAqIGJlY2F1c2UgdGhlIDMxIGJpdCB2YWx1ZXMgZGlmZmVyIGZyb20gdGhlIDY0IGJpdCB2YWx1ZXMuCisgKi8KKworYXNtbGlua2FnZSBsb25nCitzeXMzMl9mYWR2aXNlNjQoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBpbnQgYWR2aXNlKQoreworCWlmIChhZHZpc2UgPT0gNCkKKwkJYWR2aXNlID0gUE9TSVhfRkFEVl9ET05UTkVFRDsKKwllbHNlIGlmIChhZHZpc2UgPT0gNSkKKwkJYWR2aXNlID0gUE9TSVhfRkFEVl9OT1JFVVNFOworCXJldHVybiBzeXNfZmFkdmlzZTY0KGZkLCBvZmZzZXQsIGxlbiwgYWR2aXNlKTsKK30KKworc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIHsKKwlpbnQgZmQ7CisJbG9uZyBsb25nIG9mZnNldDsKKwlsb25nIGxvbmcgbGVuOworCWludCBhZHZpY2U7Cit9OworCithc21saW5rYWdlIGxvbmcKK3N5czMyX2ZhZHZpc2U2NF82NChzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICphcmdzKQoreworCXN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBhOworCisJaWYgKCBjb3B5X2Zyb21fdXNlcigmYSwgYXJncywgc2l6ZW9mKGEpKSApCisJCXJldHVybiAtRUZBVUxUOworCWlmIChhLmFkdmljZSA9PSA0KQorCQlhLmFkdmljZSA9IFBPU0lYX0ZBRFZfRE9OVE5FRUQ7CisJZWxzZSBpZiAoYS5hZHZpY2UgPT0gNSkKKwkJYS5hZHZpY2UgPSBQT1NJWF9GQURWX05PUkVVU0U7CisJcmV0dXJuIHN5c19mYWR2aXNlNjRfNjQoYS5mZCwgYS5vZmZzZXQsIGEubGVuLCBhLmFkdmljZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggYmY1Mjk3My4uNzk5YTk4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMTI1MSwxMiArMTI1MSwxMiBAQAogCW9yCSVyMywlcjQJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKIAlsbGdmcgklcjQsJXI1CQkJIyBzaXplX3QgKHVuc2lnbmVkIGxvbmcpCiAJbGdmcgklcjUsJXI2CQkJIyBpbnQKLQlqZwlzeXNfZmFkdmlzZTY0CisJamcJc3lzMzJfZmFkdmlzZTY0CiAKIAkuZ2xvYmwJc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIKIHN5czMyX2ZhZHZpc2U2NF82NF93cmFwcGVyOgogCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyAqCi0JamcJczM5MF9mYWR2aXNlNjRfNjQKKwlqZwlzeXMzMl9mYWR2aXNlNjRfNjQKIAogCS5nbG9ibAlzeXMzMl9jbG9ja19zZXR0aW1lX3dyYXBwZXIKIHN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcjoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCBhN2M4YmZjLi5hZGM4MTA5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC03ODQsNiArNzg0LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L0tjb25maWcgYi9hcmNoL3NoNjQvS2NvbmZpZwppbmRleCA3MDhlNTk3My4uNGMzZTUzMyAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L0tjb25maWcKKysrIGIvYXJjaC9zaDY0L0tjb25maWcKQEAgLTI2OCw2ICsyNjgsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMjYyZTEzZC4uYWNhMDI4YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjY4LDY4ICsyNjgsMTQgQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAotY29uZmlnIFBSSU5URVIKLQl0cmlzdGF0ZSAiUGFyYWxsZWwgcHJpbnRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gUEFSUE9SVAotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgcHJpbnRlciB0byB0aGUgcGFyYWxsZWwgcG9ydCBvZiB5b3VyIExpbnV4Ci0JICBib3ggKGFzIG9wcG9zZWQgdG8gdXNpbmcgYSBzZXJpYWwgcHJpbnRlcjsgaWYgdGhlIGNvbm5lY3RvciBhdCB0aGUKLQkgIHByaW50ZXIgaGFzIDkgb3IgMjUgaG9sZXMgWyJmZW1hbGUiXSwgdGhlbiBpdCdzIHNlcmlhbCksIHNheSBZLgotCSAgQWxzbyByZWFkIHRoZSBQcmludGluZy1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCi0KLQkgIEl0IGlzIHBvc3NpYmxlIHRvIHNoYXJlIG9uZSBwYXJhbGxlbCBwb3J0IGFtb25nIHNldmVyYWwgZGV2aWNlcwotCSAgKGUuZy4gcHJpbnRlciBhbmQgWklQIGRyaXZlKSBhbmQgaXQgaXMgc2FmZSB0byBjb21waWxlIHRoZQotCSAgY29ycmVzcG9uZGluZyBkcml2ZXJzIGludG8gdGhlIGtlcm5lbC4gIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhpcwotCSAgZHJpdmVyIGFzIGEgbW9kdWxlIGhvd2V2ZXIsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vcGFycG9ydC50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBscC4KLQotCSAgSWYgeW91IGhhdmUgc2V2ZXJhbCBwYXJhbGxlbCBwb3J0cywgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIHBvcnRzIHRvCi0JICB1c2Ugd2l0aCB0aGUgImxwIiBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbi4gIChUcnkgIm1hbiBib290cGFyYW0iCi0JICBvciBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBib290IGxvYWRlciAoc2lsbykgYWJvdXQgaG93IHRvIHBhc3MKLQkgIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuKSAgVGhlIHN5bnRheCBvZiB0aGUgImxwIiBjb21tYW5kCi0JICBsaW5lIG9wdGlvbiBjYW4gYmUgZm91bmQgaW4gPGZpbGU6ZHJpdmVycy9jaGFyL2xwLmM+LgotCi0JICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlIExQX05PCi0JICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8gaW4gcGFycG9ydC5oLgotCi1zb3VyY2UgIm1tL0tjb25maWciCi0KLWVuZG1lbnUKLQotc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3ZpZGVvL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9tdGQvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3NlcmlhbC9LY29uZmlnIgotCiBpZiAhU1VONAogc291cmNlICJkcml2ZXJzL3NidXMvY2hhci9LY29uZmlnIgogZW5kaWYKIAotc291cmNlICJkcml2ZXJzL2Jsb2NrL0tjb25maWciCi0KLSMgRG9uJ3QgZnJpZ2h0ZW4gYSBjb21tb24gU0J1cyB1c2VyCi1pZiBQQ0kKLQotc291cmNlICJkcml2ZXJzL2lkZS9LY29uZmlnIgotCi1lbmRpZgotCi1zb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvc2NzaS9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvZmM0L0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9tZC9LY29uZmlnIgotCi1zb3VyY2UgIm5ldC9LY29uZmlnIgotCiAjIFRoaXMgb25lIG11c3QgYmUgYmVmb3JlIHRoZSBmaWxlc3lzdGVtIGNvbmZpZ3MuIC1EYXZlTQogCiBtZW51ICJVbml4OTggUFRZIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggOTI4ZmZlYi4uMDI1ZjQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUwpAQCAtNTcsMTEgKzU3LDExIEBACiAvKjE4MCovCS5sb25nIHN5c19mbGlzdHhhdHRyLCBzeXNfcmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIsIHN5c19zaWdwZW5kaW5nLCBzeXNfbmlfc3lzY2FsbAogLyoxODUqLwkubG9uZyBzeXNfc2V0cGdpZCwgc3lzX2ZyZW1vdmV4YXR0ciwgc3lzX3RraWxsLCBzeXNfZXhpdF9ncm91cCwgc3lzX25ld3VuYW1lCiAvKjE5MCovCS5sb25nIHN5c19pbml0X21vZHVsZSwgc3lzX3BlcnNvbmFsaXR5LCBzcGFyY19yZW1hcF9maWxlX3BhZ2VzLCBzeXNfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3RsCi0vKjE5NSovCS5sb25nIHN5c19lcG9sbF93YWl0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRwcGlkLCBzcGFyY19zaWdhY3Rpb24sIHN5c19zZ2V0bWFzaworLyoxOTUqLwkubG9uZyBzeXNfZXBvbGxfd2FpdCwgc3lzX2lvcHJpb19zZXQsIHN5c19nZXRwcGlkLCBzcGFyY19zaWdhY3Rpb24sIHN5c19zZ2V0bWFzawogLyoyMDAqLwkubG9uZyBzeXNfc3NldG1hc2ssIHN5c19zaWdzdXNwZW5kLCBzeXNfbmV3bHN0YXQsIHN5c191c2VsaWIsIG9sZF9yZWFkZGlyCiAvKjIwNSovCS5sb25nIHN5c19yZWFkYWhlYWQsIHN5c19zb2NrZXRjYWxsLCBzeXNfc3lzbG9nLCBzeXNfbG9va3VwX2Rjb29raWUsIHN5c19mYWR2aXNlNjQKIC8qMjEwKi8JLmxvbmcgc3lzX2ZhZHZpc2U2NF82NCwgc3lzX3Rna2lsbCwgc3lzX3dhaXRwaWQsIHN5c19zd2Fwb2ZmLCBzeXNfc3lzaW5mbwotLyoyMTUqLwkubG9uZyBzeXNfaXBjLCBzeXNfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FkanRpbWV4CisvKjIxNSovCS5sb25nIHN5c19pcGMsIHN5c19zaWdyZXR1cm4sIHN5c19jbG9uZSwgc3lzX2lvcHJpb19nZXQsIHN5c19hZGp0aW1leAogLyoyMjAqLwkubG9uZyBzeXNfc2lncHJvY21hc2ssIHN5c19uaV9zeXNjYWxsLCBzeXNfZGVsZXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwsIHN5c19nZXRwZ2lkCiAvKjIyNSovCS5sb25nIHN5c19iZGZsdXNoLCBzeXNfc3lzZnMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NldGZzdWlkMTYsIHN5c19zZXRmc2dpZDE2CiAvKjIzMCovCS5sb25nIHN5c19zZWxlY3QsIHN5c190aW1lLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zdGltZSwgc3lzX3N0YXRmczY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IGUyYjA1MGUuLjlhZmQyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC00Myw2ICs0MywyNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIFNFQ0NPTVAKKwlib29sICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCisJZGVwZW5kcyBvbiBQUk9DX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBrZXJuZWwgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIG51bWJlciBjcnVuY2hpbmcgYXBwbGljYXRpb25zCisJICB0aGF0IG1heSBuZWVkIHRvIGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIGR1cmluZyB0aGVpcgorCSAgZXhlY3V0aW9uLiBCeSB1c2luZyBwaXBlcyBvciBvdGhlciB0cmFuc3BvcnRzIG1hZGUgYXZhaWxhYmxlIHRvCisJICB0aGUgcHJvY2VzcyBhcyBmaWxlIGRlc2NyaXB0b3JzIHN1cHBvcnRpbmcgdGhlIHJlYWQvd3JpdGUKKwkgIHN5c2NhbGxzLCBpdCdzIHBvc3NpYmxlIHRvIGlzb2xhdGUgdGhvc2UgYXBwbGljYXRpb25zIGluCisJICB0aGVpciBvd24gYWRkcmVzcyBzcGFjZSB1c2luZyBzZWNjb21wLiBPbmNlIHNlY2NvbXAgaXMKKwkgIGVuYWJsZWQgdmlhIC9wcm9jLzxwaWQ+L3NlY2NvbXAsIGl0IGNhbm5vdCBiZSBkaXNhYmxlZAorCSAgYW5kIHRoZSB0YXNrIGlzIG9ubHkgYWxsb3dlZCB0byBleGVjdXRlIGEgZmV3IHNhZmUgc3lzY2FsbHMKKwkgIGRlZmluZWQgYnkgZWFjaCBzZWNjb21wIG1vZGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuIE9ubHkgZW1iZWRkZWQgc2hvdWxkIHNheSBOIGhlcmUuCisKK3NvdXJjZSBrZXJuZWwvS2NvbmZpZy5oegorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC00NDQsNiArNDYzLDI0IEBACiAJICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlIExQX05PCiAJICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8gaW4gcGFycG9ydC5oLgogCitjb25maWcgUFBERVYKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXJzIgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFNheWluZyBZIHRvIHRoaXMgYWRkcyBzdXBwb3J0IGZvciAvZGV2L3BhcnBvcnQgZGV2aWNlIG5vZGVzLiAgVGhpcworCSAgaXMgbmVlZGVkIGZvciBwcm9ncmFtcyB0aGF0IHdhbnQgcG9ydGFibGUgYWNjZXNzIHRvIHRoZSBwYXJhbGxlbAorCSAgcG9ydCwgZm9yIGluc3RhbmNlIGRldmljZWlkICh3aGljaCBkaXNwbGF5cyBQbHVnLWFuZC1QbGF5IGRldmljZQorCSAgSURzKS4KKworCSAgVGhpcyBpcyB0aGUgcGFyYWxsZWwgcG9ydCBlcXVpdmFsZW50IG9mIFNDU0kgZ2VuZXJpYyBzdXBwb3J0IChzZykuCisJICBJdCBpcyBzYWZlIHRvIHNheSBOIHRvIHRoaXMgLS0gaXQgaXMgbm90IG5lZWRlZCBmb3Igbm9ybWFsIHByaW50aW5nCisJICBvciBwYXJhbGxlbCBwb3J0IENELVJPTS9kaXNrIHN1cHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBwZGV2LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgRU5WQ1RSTAogCXRyaXN0YXRlICJTVU5XLCBlbnZjdHJsIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKQEAgLTQ4OCw2ICs1MjUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy92aWRlby9LY29uZmlnIgpAQCAtNTE0LDcgKzU1Myw3IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgogCkBAIC02MTAsNiArNjQ5LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKKwogc291cmNlICJmcy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYwppbmRleCBhMDcxNmNjLi44ODUyYzIwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KIAotLyogVGhpcyBjYW5ub3QgYmUgc3RhdGljLCBhcyBpdCBpcyByZWZlcmVuY2VkIGluIGVudHJ5LlMgKi8KKy8qIFRoaXMgY2Fubm90IGJlIHN0YXRpYywgYXMgaXQgaXMgcmVmZXJlbmNlZCBpbiBpcnEuYyAqLwogdm9pZCBfX2lvbWVtICphdXhpb19yZWdpc3RlciA9IE5VTEw7CiAKIGVudW0gYXV4aW9fdHlwZSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfYmFja2VuZC5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX2JhY2tlbmQuUwppbmRleCBiNzNhM2M4Li41Mzg1MjI4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfYmFja2VuZC5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHRsYl9iYWNrZW5kLlMKQEAgLTE2LDcgKzE2LDcgQEAKICNlbGlmIFBBR0VfU0hJRlQgPT0gMTkKICNkZWZpbmUgU1pfQklUUwkJX1BBR0VfU1o1MTJLCiAjZWxpZiBQQUdFX1NISUZUID09IDIyCi0jZGVmaW5lIFNaX0JJVFMJCV9QQUdFX1NaNE0KKyNkZWZpbmUgU1pfQklUUwkJX1BBR0VfU1o0TUIKICNlbmRpZgogCiAjZGVmaW5lIFZBTElEX1NaX0JJVFMJKF9QQUdFX1ZBTElEIHwgU1pfQklUUykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwppbmRleCBhNDdmMmQwLi44ODMzMmYwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8YXNtL2VzdGF0ZS5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogCi0vKiAjZGVmaW5lIFNZU0NBTExfVFJBQ0lORwkxICovCi0KICNkZWZpbmUgY3VycHRyICAgICAgZzYKIAogI2RlZmluZSBOUl9TWVNDQUxMUyAyODQgICAgICAvKiBFYWNoIE9TIGlzIGRpZmZlcmVudC4uLiAqLwpAQCAtMjcxLDggKzI2OSw5IEBACiAJZm11bGQJCSVmMCwgJWYyLCAlZjI2CiAJZmFkZGQJCSVmMCwgJWYyLCAlZjI4CiAJZm11bGQJCSVmMCwgJWYyLCAlZjMwCisJbWVtYmFyCQkjU3luYwogCWIscHQJCSV4Y2MsIGZwZGlzX2V4aXQKLQkgbWVtYmFyCQkjU3luYworCSBub3AKIDI6CWFuZGNjCQklZzUsIEZQUlNfRFUsICVnMAogCWJuZSxwdAkJJWljYywgM2YKIAkgZnplcm8JCSVmMzIKQEAgLTMwMSw4ICszMDAsOSBAQAogCWZtdWxkCQklZjMyLCAlZjM0LCAlZjU4CiAJZmFkZGQJCSVmMzIsICVmMzQsICVmNjAKIAlmbXVsZAkJJWYzMiwgJWYzNCwgJWY2MgorCW1lbWJhcgkJI1N5bmMKIAliYSxwdAkJJXhjYywgZnBkaXNfZXhpdAotCSBtZW1iYXIJCSNTeW5jCisJIG5vcAogMzoJbW92CQlTRUNPTkRBUllfQ09OVEVYVCwgJWczCiAJYWRkCQklZzYsIFRJX0ZQUkVHUywgJWcxCiAJbGR4YQkJWyVnM10gQVNJX0RNTVUsICVnNQpAQCAtNTUxLDEzICs1NTEsMTEgQEAKIAlzbGx4CQklZzMsIDUsICVnMwogCW9yCQklZzIsICVsbyhpdmVjdG9yX3RhYmxlKSwgJWcyCiAJYWRkCQklZzIsICVnMywgJWczCi0JbGR4CQlbJWczICsgMHgwOF0sICVnMgkvKiBpcnFfaW5mbyAqLwogCWxkdWIJCVslZzMgKyAweDA0XSwgJWc0CS8qIHBpbCAqLwotCWJyeixwbgkJJWcyLCBkb19pdmVjX3NwdXJpb3VzCi0JIG1vdgkJMSwgJWcyCi0KKwltb3YJCTEsICVnMgogCXNsbHgJCSVnMiwgJWc0LCAlZzIKIAlzbGx4CQklZzQsIDIsICVnNAorCiAJbGR1dwkJWyVnNiArICVnNF0sICVnNQkvKiBnNSA9IGlycV93b3JrKGNwdSwgcGlsKSAqLwogCXN0dwkJJWc1LCBbJWczICsgMHgwMF0JLyogYnVja2V0LT5pcnFfY2hhaW4gPSBnNSAqLwogCXN0dwkJJWczLCBbJWc2ICsgJWc0XQkvKiBpcnFfd29yayhjcHUsIHBpbCkgPSBidWNrZXQgKi8KQEAgLTU2NSw5ICs1NjMsOSBAQAogCXJldHJ5CiBkb19pdmVjX3hjYWxsOgogCW1vdgkJMHg1MCwgJWcxCi0KIAlsZHhhCQlbJWcxICsgJWcwXSBBU0lfSU5UUl9SLCAlZzEKIAlzcmwJCSVnMywgMCwgJWczCisKIAltb3YJCTB4NjAsICVnNwogCWxkeGEJCVslZzcgKyAlZzBdIEFTSV9JTlRSX1IsICVnNwogCXN0eGEJCSVnMCwgWyVnMF0gQVNJX0lOVFJfUkVDRUlWRQpAQCAtNTc5LDE5ICs1NzcsNiBAQAogMToJam1wbAkJJWczLCAlZzAKIAkgbm9wCiAKLWRvX2l2ZWNfc3B1cmlvdXM6Ci0Jc3R3CQklZzMsIFslZzYgKyAweDAwXQkvKiBpcnFfd29yayhjcHUsIDApID0gYnVja2V0ICovCi0JcmRwcgkJJXBzdGF0ZSwgJWc1Ci0KLQl3cnByCQklZzUsIFBTVEFURV9JRyB8IFBTVEFURV9BRywgJXBzdGF0ZQotCXNldGhpCQklaGkoMTA5ZiksICVnNwotCWJhLHB0CQkleGNjLCBldHJhcAotMTA5Ogkgb3IJCSVnNywgJWxvKDEwOWIpLCAlZzcKLQljYWxsCQljYXRjaF9kaXNhYmxlZF9pdmVjCi0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQliYSxwdAkJJXhjYywgcnRyYXAKLQkgY2xyCQklbDYKLQogCS5nbG9ibAkJc2F2ZV9hbHRlcm5hdGVfZ2xvYmFscwogc2F2ZV9hbHRlcm5hdGVfZ2xvYmFsczogLyogJW8wID0gc2F2ZV9hcmVhICovCiAJcmRwcgkJJXBzdGF0ZSwgJW81CkBAIC02OTksMTE2ICs2ODQsNiBAQAogCWJhLHB0CQkleGNjLCBydHJhcAogCSBjbHIJCSVsNgogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfRkQKLQkuZ2xvYmwJCWZsb3BweV9oYXJkaW50Ci1mbG9wcHlfaGFyZGludDoKLQl3cgkJJWcwLCAoMSA8PCAxMSksICVjbGVhcl9zb2Z0aW50Ci0Jc2V0aGkJCSVoaShkb2luZ19wZG1hKSwgJWcxCi0JbGQJCVslZzEgKyAlbG8oZG9pbmdfcGRtYSldLCAlZzIKLQlicnoscG4JCSVnMiwgZmxvcHB5X2Rvc29mdGludAotCSBzZXRoaQkJJWhpKGZkY19zdGF0dXMpLCAlZzMKLQlsZHgJCVslZzMgKyAlbG8oZmRjX3N0YXR1cyldLCAlZzMKLQlzZXRoaQkJJWhpKHBkbWFfdmFkZHIpLCAlZzUKLQlsZHgJCVslZzUgKyAlbG8ocGRtYV92YWRkcildLCAlZzQKLQlzZXRoaQkJJWhpKHBkbWFfc2l6ZSksICVnNQotCWxkeAkJWyVnNSArICVsbyhwZG1hX3NpemUpXSwgJWc1Ci0KLW5leHRfYnl0ZToKLQlsZHViYQkJWyVnM10gQVNJX1BIWVNfQllQQVNTX0VDX0UsICVnNwotCWFuZGNjCQklZzcsIDB4ODAsICVnMAotCWJlLHBuCQklaWNjLCBmbG9wcHlfZmlmb19lbXB0aWVkCi0JIGFuZGNjCQklZzcsIDB4MjAsICVnMAotCWJlLHBuCQklaWNjLCBmbG9wcHlfb3ZlcnJ1bgotCSBhbmRjYwkJJWc3LCAweDQwLCAlZzAKLQliZSxwbgkJJWljYywgZmxvcHB5X3dyaXRlCi0JIHN1YgkJJWc1LCAxLCAlZzUKLQotCWluYwkJJWczCi0JbGR1YmEJCVslZzNdIEFTSV9QSFlTX0JZUEFTU19FQ19FLCAlZzcKLQlkZWMJCSVnMwotCW9yY2MJCSVnMCwgJWc1LCAlZzAKLQlzdGIJCSVnNywgWyVnNF0KLQlibmUscG4JCSV4Y2MsIG5leHRfYnl0ZQotCSBhZGQJCSVnNCwgMSwgJWc0Ci0KLQliLHB0CQkleGNjLCBmbG9wcHlfdGRvbmUKLQkgbm9wCi0KLWZsb3BweV93cml0ZToKLQlsZHViCQlbJWc0XSwgJWc3Ci0Jb3JjYwkJJWcwLCAlZzUsICVnMAotCWluYwkJJWczCi0Jc3RiYQkJJWc3LCBbJWczXSBBU0lfUEhZU19CWVBBU1NfRUNfRQotCWRlYwkJJWczCi0JYm5lLHBuCQkleGNjLCBuZXh0X2J5dGUKLQkgYWRkCQklZzQsIDEsICVnNAotCi1mbG9wcHlfdGRvbmU6Ci0Jc2V0aGkJCSVoaShwZG1hX3ZhZGRyKSwgJWcxCi0Jc3R4CQklZzQsIFslZzEgKyAlbG8ocGRtYV92YWRkcildCi0Jc2V0aGkJCSVoaShwZG1hX3NpemUpLCAlZzEKLQlzdHgJCSVnNSwgWyVnMSArICVsbyhwZG1hX3NpemUpXQotCXNldGhpCQklaGkoYXV4aW9fcmVnaXN0ZXIpLCAlZzEKLQlsZHgJCVslZzEgKyAlbG8oYXV4aW9fcmVnaXN0ZXIpXSwgJWc3Ci0JbGR1YmEJCVslZzddIEFTSV9QSFlTX0JZUEFTU19FQ19FLCAlZzUKLQlvcgkJJWc1LCBBVVhJT19BVVgxX0ZUQ05ULCAlZzUKLS8qCWFuZG4JCSVnNSwgQVVYSU9fQVVYMV9NQVNLLCAlZzUgKi8KLQlzdGJhCQklZzUsIFslZzddIEFTSV9QSFlTX0JZUEFTU19FQ19FCi0JYW5kbgkJJWc1LCBBVVhJT19BVVgxX0ZUQ05ULCAlZzUKLS8qCWFuZG4JCSVnNSwgQVVYSU9fQVVYMV9NQVNLLCAlZzUgKi8KLQotCW5vcDsgbm9wOyAgbm9wOyBub3A7ICBub3A7IG5vcDsKLQlub3A7IG5vcDsgIG5vcDsgbm9wOyAgbm9wOyBub3A7Ci0KLQlzdGJhCQklZzUsIFslZzddIEFTSV9QSFlTX0JZUEFTU19FQ19FCi0Jc2V0aGkJCSVoaShkb2luZ19wZG1hKSwgJWcxCi0JYixwdAkJJXhjYywgZmxvcHB5X2Rvc29mdGludAotCSBzdAkJJWcwLCBbJWcxICsgJWxvKGRvaW5nX3BkbWEpXQotCi1mbG9wcHlfZmlmb19lbXB0aWVkOgotCXNldGhpCQklaGkocGRtYV92YWRkciksICVnMQotCXN0eAkJJWc0LCBbJWcxICsgJWxvKHBkbWFfdmFkZHIpXQotCXNldGhpCQklaGkocGRtYV9zaXplKSwgJWcxCi0Jc3R4CQklZzUsIFslZzEgKyAlbG8ocGRtYV9zaXplKV0KLQlzZXRoaQkJJWhpKGlycV9hY3Rpb24pLCAlZzEKLQlvcgkJJWcxLCAlbG8oaXJxX2FjdGlvbiksICVnMQotCWxkeAkJWyVnMSArICgxMSA8PCAzKV0sICVnMwkJISBpcnFhY3Rpb25bZmxvcHB5X2lycV0KLQlsZHgJCVslZzMgKyAweDA4XSwgJWc0CQkhIGFjdGlvbi0+ZmxhZ3M+PjQ4PT1pbm8KLQlzZXRoaQkJJWhpKGl2ZWN0b3JfdGFibGUpLCAlZzMKLQlzcmx4CQklZzQsIDQ4LCAlZzQKLQlvcgkJJWczLCAlbG8oaXZlY3Rvcl90YWJsZSksICVnMwotCXNsbHgJCSVnNCwgNSwgJWc0Ci0JbGR4CQlbJWczICsgJWc0XSwgJWc0CQkhICZpdmVjdG9yX3RhYmxlW2lub10KLQlsZHgJCVslZzQgKyAweDEwXSwgJWc0CQkhIGJ1Y2tldC0+aWNscgotCXN0d2EJCSVnMCwgWyVnNF0gQVNJX1BIWVNfQllQQVNTX0VDX0UJISBJQ0xSX0lETEUKLQltZW1iYXIJCSNTeW5jCQkJCSEgcHJvYmFibHkgbm90IG5lZWRlZC4uLgotCXJldHJ5Ci0KLWZsb3BweV9vdmVycnVuOgotCXNldGhpCQklaGkocGRtYV92YWRkciksICVnMQotCXN0eAkJJWc0LCBbJWcxICsgJWxvKHBkbWFfdmFkZHIpXQotCXNldGhpCQklaGkocGRtYV9zaXplKSwgJWcxCi0Jc3R4CQklZzUsIFslZzEgKyAlbG8ocGRtYV9zaXplKV0KLQlzZXRoaQkJJWhpKGRvaW5nX3BkbWEpLCAlZzEKLQlzdAkJJWcwLCBbJWcxICsgJWxvKGRvaW5nX3BkbWEpXQotCi1mbG9wcHlfZG9zb2Z0aW50OgotCXJkcHIJCSVwaWwsICVnMgotCXdycHIJCSVnMCwgMTUsICVwaWwKLQlzZXRoaQkJJWhpKDEwOWYpLCAlZzcKLQliLHB0CQkleGNjLCBldHJhcF9pcnEKLTEwOToJIG9yCQklZzcsICVsbygxMDliKSwgJWc3Ci0KLQltb3YJCTExLCAlbzAKLQltb3YJCTAsICVvMQotCWNhbGwJCXNwYXJjX2Zsb3BweV9pcnEKLQkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMgotCi0JYixwdAkJJXhjYywgcnRyYXBfaXJxCi0JIG5vcAotCi0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfRkQgKi8KLQogCS8qIFhYWCBIZXJlIGlzIHN0dWZmIHdlIHN0aWxsIG5lZWQgdG8gd3JpdGUuLi4gLURhdmVNIFhYWCAqLwogCS5nbG9ibAkJbmV0YnNkX3N5c2NhbGwKIG5ldGJzZF9zeXNjYWxsOgpAQCAtMTY3NywxMSArMTU1MiwxMiBAQAogCQlub3AKIAkJLmFsaWduCQkzMgogMToJCWxkeAkJWyVjdXJwdHIgKyBUSV9GTEFHU10sICVsNQotCQlhbmRjYwkJJWw1LCBfVElGX1NZU0NBTExfVFJBQ0UsICVnMAorCQlhbmRjYwkJJWw1LCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAkJYmUscHQJCSVpY2MsIHJ0cmFwCiAJCSBjbHIJCSVsNgorCQlhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkJIG5vcAorCQkgbW92CQkxLCAlbzEKIAogCQliYSxwdAkJJXhjYywgcnRyYXAKIAkJIGNscgkJJWw2CkBAIC0xNzI0LDExICsxNjAwLDExIEBACiAJCWJhLHB0CQkleGNjLCBzcGFyY19kb19mb3JrCiAJCSBhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8yCiByZXRfZnJvbV9zeXNjYWxsOgotCQkvKiBDbGVhciBTUEFSQ19GTEFHX05FV0NISUxELCBzd2l0Y2hfdG8gbGVhdmVzIHRocmVhZC5mbGFncyBpbgotCQkgKiAlbzcgZm9yIHVzLiAgQ2hlY2sgcGVyZm9ybWFuY2UgY291bnRlciBzdHVmZiB0b28uCisJCS8qIENsZWFyIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+bmV3X2NoaWxkLCBhbmQKKwkJICogY2hlY2sgcGVyZm9ybWFuY2UgY291bnRlciBzdHVmZiB0b28uCiAJCSAqLwotCQlhbmRuCQklbzcsIF9USUZfTkVXQ0hJTEQsICVsMAotCQlzdHgJCSVsMCwgWyVnNiArIFRJX0ZMQUdTXQorCQlzdGIJCSVnMCwgWyVnNiArIFRJX05FV19DSElMRF0KKwkJbGR4CQlbJWc2ICsgVElfRkxBR1NdLCAlbDAKIAkJY2FsbAkJc2NoZWR1bGVfdGFpbAogCQkgbW92CQklZzcsICVvMAogCQlhbmRjYwkJJWwwLCBfVElGX1BFUkZDVFIsICVnMApAQCAtMTc2NSwxOCArMTY0MSwyMCBAQAogCSBvcgkJJWw3LCAlbG8oc3lzX25pX3N5c2NhbGwpLCAlbDcKIAogbGludXhfc3lzY2FsbF90cmFjZTMyOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCXNybAkJJWkwLCAwLCAlbzAKLQltb3YJCSVpNCwgJW80CisJc3JsCQklaTQsIDAsICVvNAogCXNybAkJJWkxLCAwLCAlbzEKIAlzcmwJCSVpMiwgMCwgJW8yCiAJYixwdAkJJXhjYywgMmYKIAkgc3JsCQklaTMsIDAsICVvMwogCiBsaW51eF9zeXNjYWxsX3RyYWNlOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCW1vdgkJJWkwLCAlbzAKIAltb3YJCSVpMSwgJW8xCiAJbW92CQklaTIsICVvMgpAQCAtMTc5NCwxMSArMTY3Miw2IEBACiAJYmdldSxwbgkJJXhjYywgbGludXhfc3BhcmNfbmlfc3lzY2FsbAkJISBDVEkKIAkgc3JsCQklaTAsIDAsICVvMAkJCQkhIElFVTAKIAlzbGwJCSVnMSwgMiwgJWw0CQkJCSEgSUVVMAlHcm91cAotI2lmZGVmIFNZU0NBTExfVFJBQ0lORwotCWNhbGwJCXN5c2NhbGxfdHJhY2VfZW50cnkKLQkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCXNybAkJJWkwLCAwLCAlbzAKLSNlbmRpZgogCXNybAkJJWk0LCAwLCAlbzQJCQkJISBJRVUxCiAJbGR1dwkJWyVsNyArICVsNF0sICVsNwkJCSEgTG9hZAogCXNybAkJJWkxLCAwLCAlbzEJCQkJISBJRVUwCUdyb3VwCkBAIC0xODA2LDcgKzE2NzksNyBAQAogCiAJc3JsCQklaTUsIDAsICVvNQkJCQkhIElFVTEKIAlzcmwJCSVpMiwgMCwgJW8yCQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTAJR3JvdXAKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UzMgkJISBDVEkKIAkgbW92CQklaTAsICVsNQkJCQkhIElFVTEKIAljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE4MjIsMTEgKzE2OTUsNiBAQAogCWJnZXUscG4JCSV4Y2MsIGxpbnV4X3NwYXJjX25pX3N5c2NhbGwJCSEgQ1RJCiAJIG1vdgkJJWkwLCAlbzAJCQkJISBJRVUwCiAJc2xsCQklZzEsIDIsICVsNAkJCQkhIElFVTAJR3JvdXAKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQljYWxsCQlzeXNjYWxsX3RyYWNlX2VudHJ5Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVpMCwgJW8wCi0jZW5kaWYKIAltb3YJCSVpMSwgJW8xCQkJCSEgSUVVMQogCWxkdXcJCVslbDcgKyAlbDRdLCAlbDcJCQkhIExvYWQKIDQ6CW1vdgkJJWkyLCAlbzIJCQkJISBJRVUwCUdyb3VwCkBAIC0xODM0LDcgKzE3MDIsNyBAQAogCiAJbW92CQklaTMsICVvMwkJCQkhIElFVTEKIAltb3YJCSVpNCwgJW80CQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTEJR3JvdXArMSBidWJibGUKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UJCSEgQ1RJCUdyb3VwCiAJIG1vdgkJJWkwLCAlbDUJCQkJISBJRVUwCiAyOgljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE4NDMsMTIgKzE3MTEsNiBAQAogCiAzOglzdHgJCSVvMCwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9JMF0KIHJldF9zeXNfY2FsbDoKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQltb3YJCSVvMCwgJW8xCi0JY2FsbAkJc3lzY2FsbF90cmFjZV9leGl0Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVvMSwgJW8wCi0jZW5kaWYKIAlsZHgJCVslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFNUQVRFXSwgJWczCiAJbGR4CQlbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdLCAlbDEgISBwYyA9IG5wYwogCXNyYQkJJW8wLCAwLCAlbzAKQEAgLTE4NTgsMTcgKzE3MjAsMTYgQEAKIAkvKiBDaGVjayBpZiBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCkKIAkgKiB3YXMgaW52b2tlZC4KIAkgKi8KLQlsZHgJCVslY3VycHRyICsgVElfRkxBR1NdLCAlbDAKLQlhbmRjYwkJJWwwLCBfVElGX1NZU0NBTExfU1VDQ0VTUywgJWcwCi0JYmUscHQJCSVpY2MsIDFmCi0JIGFuZG4JCSVsMCwgX1RJRl9TWVNDQUxMX1NVQ0NFU1MsICVsMAorCWxkdWIJCVslY3VycHRyICsgVElfU1lTX05PRVJST1JdLCAlbDAKKwlicnoscHQJCSVsMCwgMWYKKwkgbm9wCiAJYmEscHQJCSV4Y2MsIDgwZgotCSBzdHgJCSVsMCwgWyVjdXJwdHIgKyBUSV9GTEFHU10KKwkgc3RiCQklZzAsIFslY3VycHRyICsgVElfU1lTX05PRVJST1JdCiAKIDE6CiAJY21wCQklbzAsIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0sKIAliZ2V1LHBuCQkleGNjLCAxZgotCSBhbmRjYwkJJWwwLCBfVElGX1NZU0NBTExfVFJBQ0UsICVsNgkKKwkgYW5kY2MJCSVsMCwgKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NFQ0NPTVB8X1RJRl9TWVNDQUxMX0FVRElUKSwgJWw2CiA4MDoKIAkvKiBTeXN0ZW0gY2FsbCBzdWNjZXNzLCBjbGVhciBDYXJyeSBjb25kaXRpb24gY29kZS4gKi8KIAlhbmRuCQklZzMsICVnMiwgJWczCkBAIC0xODgzLDcgKzE3NDQsNyBAQAogCS8qIFN5c3RlbSBjYWxsIGZhaWx1cmUsIHNldCBDYXJyeSBjb25kaXRpb24gY29kZS4KIAkgKiBBbHNvLCBnZXQgYWJzKGVycm5vKSB0byByZXR1cm4gdG8gdGhlIHByb2Nlc3MuCiAJICovCi0JYW5kY2MJCSVsMCwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlbDYJCisJYW5kY2MJCSVsMCwgKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NFQ0NPTVB8X1RJRl9TWVNDQUxMX0FVRElUKSwgJWw2CQogCXN1YgkJJWcwLCAlbzAsICVvMAogCW9yCQklZzMsICVnMiwgJWczCiAJc3R4CQklbzAsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfSTBdCkBAIC0xODk2LDggKzE3NTcsOSBAQAogCWIscHQJCSV4Y2MsIHJ0cmFwCiAJIHN0eAkJJWwyLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdCiBsaW51eF9zeXNjYWxsX3RyYWNlMjoKKwlhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJY2FsbAkJc3lzY2FsbF90cmFjZQotCSBub3AKKwkgbW92CQkxLCAlbzEKIAlzdHgJCSVsMSwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UUENdCiAJYmEscHQJCSV4Y2MsIHJ0cmFwCiAJIHN0eAkJJWwyLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwppbmRleCA0ZGNiOGFmLi5jOWI2OTE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBkaXN0cmlidXRlX2lycXModm9pZCk7CkBAIC03MCwzMSArNzEsNyBAQAogc3RydWN0IGlycV93b3JrX3N0cnVjdCBfX2lycV93b3JrW05SX0NQVVNdOwogI2RlZmluZSBpcnFfd29yayhfX2NwdSwgX19waWwpCSYoX19pcnFfd29ya1soX19jcHUpXS5pcnFfd29ya2xpc3RzWyhfX3BpbCldKQogCi0jaWZkZWYgQ09ORklHX1BDSQotLyogVGhpcyBpcyBhIHRhYmxlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyB1c2VkIHRvIGRlYWwgd2l0aCBJQkZfRE1BX1NZTkMuCi0gKiBJdCBpcyB1c2VkIGZvciBQQ0kgb25seSB0byBzeW5jaHJvbml6ZSBETUEgdHJhbnNmZXJzIHdpdGggSVJRIGRlbGl2ZXJ5Ci0gKiBmb3IgZGV2aWNlcyBiZWhpbmQgYnVzc2VzIG90aGVyIHRoYW4gQVBCIG9uIFNhYnJlIHN5c3RlbXMuCi0gKgotICogQ3VycmVudGx5IHRoZXNlIHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUganVzdCBjb25maWcgc3BhY2UgYWNjZXNzZXMKLSAqIHRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGZvciB0aGF0IGRldmljZS4KLSAqLwotdW5zaWduZWQgbG9uZyBwY2lfZG1hX3dzeW5jOwotdW5zaWduZWQgbG9uZyBkbWFfc3luY19yZWdfdGFibGVbMjU2XTsKLXVuc2lnbmVkIGNoYXIgZG1hX3N5bmNfcmVnX3RhYmxlX2VudHJ5ID0gMDsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIGJhc2VkIHVwb24gY29kZSBpbiB0aGUgMzItYml0IFNwYXJjIGtlcm5lbCB3cml0dGVuIG1vc3RseSBieQotICogRGF2aWQgUmVkbWFuIChkamhyQHRhZHBvbGUuY28udWspLgotICovCi0jZGVmaW5lIE1BWF9TVEFUSUNfQUxMT0MJNAotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc3RhdGljX2lycWFjdGlvbltNQVhfU1RBVElDX0FMTE9DXTsKLXN0YXRpYyBpbnQgc3RhdGljX2lycV9jb3VudDsKLQotLyogVGhpcyBpcyBleHBvcnRlZCBzbyB0aGF0IGZhc3QgSVJRIGhhbmRsZXJzIGNhbiBnZXQgYXQgaXQuLi4gLURhdmVNICovCi1zdHJ1Y3QgaXJxYWN0aW9uICppcnFfYWN0aW9uW05SX0lSUVMrMV0gPSB7Ci0JICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICwgTlVMTCwgTlVMTCwKLQkgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgLCBOVUxMLCBOVUxMCi19Oworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKmlycV9hY3Rpb25bTlJfSVJRUysxXTsKIAogLyogVGhpcyBvbmx5IHN5bmNocm9uaXplcyBlbnRpdGllcyB3aGljaCBtb2RpZnkgSVJRIGhhbmRsZXIKICAqIHN0YXRlIGFuZCBzb21lIHNlbGVjdGVkIHVzZXItbGV2ZWwgc3BvdHMgdGhhdCB3YW50IHRvCkBAIC0yNDAsMTcgKzIxNywyMiBAQAogICogdGhlIENQVSAldGljayByZWdpc3RlciBhbmQgbm90IGJ5IHNvbWUgbm9ybWFsIHZlY3RvcmVkIGludGVycnVwdAogICogc291cmNlLiAgVG8gaGFuZGxlIHRoaXMgc3BlY2lhbCBjYXNlLCB3ZSB1c2UgdGhpcyBkdW1teSBJTk8gYnVja2V0LgogICovCitzdGF0aWMgc3RydWN0IGlycV9kZXNjIHBpbDBfZHVtbXlfZGVzYzsKIHN0YXRpYyBzdHJ1Y3QgaW5vX2J1Y2tldCBwaWwwX2R1bW15X2J1Y2tldCA9IHsKLQkwLAkvKiBpcnFfY2hhaW4gKi8KLQkwLAkvKiBwaWwgKi8KLQkwLAkvKiBwZW5kaW5nICovCi0JMCwJLyogZmxhZ3MgKi8KLQkwLAkvKiBfX3VudXNlZCAqLwotCU5VTEwsCS8qIGlycV9pbmZvICovCi0JMFVMLAkvKiBpY2xyICovCi0JMFVMLAkvKiBpbWFwICovCisJLmlycV9pbmZvCT0JJnBpbDBfZHVtbXlfZGVzYywKIH07CiAKK3N0YXRpYyB2b2lkIGJ1aWxkX2lycV9lcnJvcihjb25zdCBjaGFyICptc2csIHVuc2lnbmVkIGludCBpbm8sIGludCBwaWwsIGludCBpbm9maXh1cCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGljbHIsIHVuc2lnbmVkIGxvbmcgaW1hcCwKKwkJCSAgICBzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0KQoreworCXByb21fcHJpbnRmKCJJUlE6IElOTyAlMDR4ICglZDolMDE2bHg6JTAxNmx4KSAtLT4gIgorCQkgICAgIiglZDolZDolMDE2bHg6JTAxNmx4KSwgaGFsdGluZy4uLlxuIiwKKwkJICAgIGlubywgYnVja2V0LT5waWwsIGJ1Y2tldC0+aWNsciwgYnVja2V0LT5pbWFwLAorCQkgICAgcGlsLCBpbm9maXh1cCwgaWNsciwgaW1hcCk7CisJcHJvbV9oYWx0KCk7Cit9CisKIHVuc2lnbmVkIGludCBidWlsZF9pcnEoaW50IHBpbCwgaW50IGlub2ZpeHVwLCB1bnNpZ25lZCBsb25nIGljbHIsIHVuc2lnbmVkIGxvbmcgaW1hcCkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0OwpAQCAtMjc5LDI4ICsyNjEsMzUgQEAKIAkJcHJvbV9oYWx0KCk7CiAJfQogCisJYnVja2V0ID0gJml2ZWN0b3JfdGFibGVbaW5vXTsKKwlpZiAoYnVja2V0LT5mbGFncyAmIElCRl9BQ1RJVkUpCisJCWJ1aWxkX2lycV9lcnJvcigiSVJROiBUcnlpbmcgdG8gYnVpbGQgYWN0aXZlIElOTyBidWNrZXQuXG4iLAorCQkJCWlubywgcGlsLCBpbm9maXh1cCwgaWNsciwgaW1hcCwgYnVja2V0KTsKKworCWlmIChidWNrZXQtPmlycV9pbmZvKSB7CisJCWlmIChidWNrZXQtPmltYXAgIT0gaW1hcCB8fCBidWNrZXQtPmljbHIgIT0gaWNscikKKwkJCWJ1aWxkX2lycV9lcnJvcigiSVJROiBUcnlpbmcgdG8gcmVpbml0IElOTyBidWNrZXQuXG4iLAorCQkJCQlpbm8sIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXAsIGJ1Y2tldCk7CisKKwkJZ290byBvdXQ7CisJfQorCisJYnVja2V0LT5pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYyksIEdGUF9BVE9NSUMpOworCWlmICghYnVja2V0LT5pcnFfaW5mbykgeworCQlwcm9tX3ByaW50ZigiSVJROiBFcnJvciwga21hbGxvYyhpcnFfZGVzYykgZmFpbGVkLlxuIik7CisJCXByb21faGFsdCgpOworCX0KKwltZW1zZXQoYnVja2V0LT5pcnFfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYykpOworCiAJLyogT2ssIGxvb2tzIGdvb2QsIHNldCBpdCB1cC4gIERvbid0IHRvdWNoIHRoZSBpcnFfY2hhaW4gb3IKIAkgKiB0aGUgcGVuZGluZyBmbGFnLgogCSAqLwotCWJ1Y2tldCA9ICZpdmVjdG9yX3RhYmxlW2lub107Ci0JaWYgKChidWNrZXQtPmZsYWdzICYgSUJGX0FDVElWRSkgfHwKLQkgICAgKGJ1Y2tldC0+aXJxX2luZm8gIT0gTlVMTCkpIHsKLQkJLyogVGhpcyBpcyBhIGdyb3NzIGZhdGFsIGVycm9yIGlmIGl0IGhhcHBlbnMgaGVyZS4gKi8KLQkJcHJvbV9wcmludGYoIklSUTogVHJ5aW5nIHRvIHJlaW5pdCBJTk8gYnVja2V0LCBmYXRhbCBlcnJvci5cbiIpOwotCQlwcm9tX3ByaW50ZigiSVJROiBSZXF1ZXN0IElOTyAlMDR4ICglZDolZDolMDE2bHg6JTAxNmx4KVxuIiwKLQkJCSAgICBpbm8sIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXApOwotCQlwcm9tX3ByaW50ZigiSVJROiBFeGlzdGluZyAoJWQ6JTAxNmx4OiUwMTZseClcbiIsCi0JCQkgICAgYnVja2V0LT5waWwsIGJ1Y2tldC0+aWNsciwgYnVja2V0LT5pbWFwKTsKLQkJcHJvbV9wcmludGYoIklSUTogQ2Fubm90IGNvbnRpbnVlLCBoYWx0aW5nLi4uXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQogCWJ1Y2tldC0+aW1hcCAgPSBpbWFwOwogCWJ1Y2tldC0+aWNsciAgPSBpY2xyOwogCWJ1Y2tldC0+cGlsICAgPSBwaWw7CiAJYnVja2V0LT5mbGFncyA9IDA7CiAKLQlidWNrZXQtPmlycV9pbmZvID0gTlVMTDsKLQorb3V0OgogCXJldHVybiBfX2lycShidWNrZXQpOwogfQogCkBAIC0zMTgsMjYgKzMwNyw2NSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByICUwLCAweDAsICUlcHN0YXRlIiA6IDogInIiIChwc3RhdGUpKTsKIH0KIAorc3RhdGljIGludCBjaGVja19pcnFfc2hhcmluZyhpbnQgcGlsLCB1bnNpZ25lZCBsb25nIGlycWZsYWdzKQoreworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiwgKnRtcDsKKworCWFjdGlvbiA9ICooaXJxX2FjdGlvbiArIHBpbCk7CisJaWYgKGFjdGlvbikgeworCQlpZiAoKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkgJiYgKGlycWZsYWdzICYgU0FfU0hJUlEpKSB7CisJCQlmb3IgKHRtcCA9IGFjdGlvbjsgdG1wLT5uZXh0OyB0bXAgPSB0bXAtPm5leHQpCisJCQkJOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2lycV9hY3Rpb24oaW50IHBpbCwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQoreworCXN0cnVjdCBpcnFhY3Rpb24gKipwcCA9IGlycV9hY3Rpb24gKyBwaWw7CisKKwl3aGlsZSAoKnBwKQorCQlwcCA9ICYoKCpwcCktPm5leHQpOworCSpwcCA9IGFjdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKmdldF9hY3Rpb25fc2xvdChzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0KQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGJ1Y2tldC0+aXJxX2luZm87CisJaW50IG1heF9pcnEsIGk7CisKKwltYXhfaXJxID0gMTsKKwlpZiAoYnVja2V0LT5mbGFncyAmIElCRl9QQ0kpCisJCW1heF9pcnEgPSBNQVhfSVJRX0RFU0NfQUNUSU9OOworCWZvciAoaSA9IDA7IGkgPCBtYXhfaXJxOyBpKyspIHsKKwkJc3RydWN0IGlycWFjdGlvbiAqcCA9ICZkZXNjLT5hY3Rpb25baV07CisJCXUzMiBtYXNrID0gKDEgPDwgaSk7CisKKwkJaWYgKGRlc2MtPmFjdGlvbl9hY3RpdmVfbWFzayAmIG1hc2spCisJCQljb250aW51ZTsKKworCQlkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2sgfD0gbWFzazsKKwkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCiBpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCiAJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sICp0bXAgPSBOVUxMOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gX19idWNrZXQoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwZW5kaW5nID0gMDsKIAotCWlmICgoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkgJiYKLQkgICAgKGJ1Y2tldCA8ICZpdmVjdG9yX3RhYmxlWzBdIHx8Ci0JICAgICBidWNrZXQgPj0gJml2ZWN0b3JfdGFibGVbTlVNX0lWRUNTXSkpIHsKLQkJdW5zaWduZWQgaW50ICpjYWxsZXI7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlJWk3LCAlMCIgOiAiPXIiIChjYWxsZXIpKTsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicmVxdWVzdF9pcnE6IE9sZCBzdHlsZSBJUlEgcmVnaXN0cnkgYXR0ZW1wdCAiCi0JCSAgICAgICAiZnJvbSAlcCwgaXJxICUwOHguXG4iLCBjYWxsZXIsIGlycSk7CisJaWYgKHVubGlrZWx5KCFoYW5kbGVyKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQkKLQlpZiAoIWhhbmRsZXIpCi0JICAgIHJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KCFidWNrZXQtPmlycV9pbmZvKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpICYmIChpcnFmbGFncyAmIFNBX1NBTVBMRV9SQU5ET00pKSB7CiAJCS8qCkBAIC0zNTUsOTMgKzM4MywyMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwogCi0JYWN0aW9uID0gKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pOwotCWlmIChhY3Rpb24pIHsKLQkJaWYgKChhY3Rpb24tPmZsYWdzICYgU0FfU0hJUlEpICYmIChpcnFmbGFncyAmIFNBX1NISVJRKSkKLQkJCWZvciAodG1wID0gYWN0aW9uOyB0bXAtPm5leHQ7IHRtcCA9IHRtcC0+bmV4dCkKLQkJCQk7Ci0JCWVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWFjdGlvbiA9IE5VTEw7CQkvKiBPciBlbHNlISAqLworCWlmIChjaGVja19pcnFfc2hhcmluZyhidWNrZXQtPnBpbCwgaXJxZmxhZ3MpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCS8qIElmIHRoaXMgaXMgZmxhZ2dlZCBhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0aGVuIHdlIHVzZSBvdXIKLQkgKiBwcml2YXRlIHN0cnVjdCB3aGljaCBpcyBuZXZlciBmcmVlZC4KLQkgKi8KLQlpZiAoaXJxZmxhZ3MgJiBTQV9TVEFUSUNfQUxMT0MpIHsKLQkgICAgaWYgKHN0YXRpY19pcnFfY291bnQgPCBNQVhfU1RBVElDX0FMTE9DKQotCQlhY3Rpb24gPSAmc3RhdGljX2lycWFjdGlvbltzdGF0aWNfaXJxX2NvdW50KytdOwotCSAgICBlbHNlCi0JCXByaW50aygiUmVxdWVzdCBmb3IgSVJRJWQgKCVzKSBTQV9TVEFUSUNfQUxMT0MgZmFpbGVkICIKLQkJICAgICAgICJ1c2luZyBrbWFsbG9jXG4iLCBpcnEsIG5hbWUpOwotCX0JCi0JaWYgKGFjdGlvbiA9PSBOVUxMKQotCSAgICBhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFhY3Rpb24pLAotCQkJCQkJIEdGUF9BVE9NSUMpOwotCQorCWFjdGlvbiA9IGdldF9hY3Rpb25fc2xvdChidWNrZXQpOwogCWlmICghYWN0aW9uKSB7IAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGJ1Y2tldCA9PSAmcGlsMF9kdW1teV9idWNrZXQpIHsKLQkJYnVja2V0LT5pcnFfaW5mbyA9IGFjdGlvbjsKLQkJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOwotCX0gZWxzZSB7Ci0JCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9BQ1RJVkUpICE9IDApIHsKLQkJCXZvaWQgKm9yaWcgPSBidWNrZXQtPmlycV9pbmZvOwotCQkJdm9pZCAqKnZlY3RvciA9IE5VTEw7Ci0KLQkJCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9QQ0kpID09IDApIHsKLQkJCQlwcmludGsoIklSUTogVHJ5aW5nIHRvIHNoYXJlIG5vbi1QQ0kgYnVja2V0LlxuIik7Ci0JCQkJZ290byBmcmVlX2FuZF9lYnVzeTsKLQkJCX0KLQkJCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9NVUxUSSkgPT0gMCkgewotCQkJCXZlY3RvciA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiA0LCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAodmVjdG9yID09IE5VTEwpCi0JCQkJCWdvdG8gZnJlZV9hbmRfZW5vbWVtOwotCi0JCQkJLyogV2UgbWlnaHQgaGF2ZSBzbGVwdC4gKi8KLQkJCQlpZiAoKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfTVVMVEkpICE9IDApIHsKLQkJCQkJaW50IGVudDsKLQotCQkJCQlrZnJlZSh2ZWN0b3IpOwotCQkJCQl2ZWN0b3IgPSAodm9pZCAqKilidWNrZXQtPmlycV9pbmZvOwotCQkJCQlmb3IoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQkJCWlmICh2ZWN0b3JbZW50XSA9PSBOVUxMKSB7Ci0JCQkJCQkJdmVjdG9yW2VudF0gPSBhY3Rpb247Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVudCA9PSA0KQotCQkJCQkJZ290byBmcmVlX2FuZF9lYnVzeTsKLQkJCQl9IGVsc2UgewotCQkJCQl2ZWN0b3JbMF0gPSBvcmlnOwotCQkJCQl2ZWN0b3JbMV0gPSBhY3Rpb247Ci0JCQkJCXZlY3RvclsyXSA9IE5VTEw7Ci0JCQkJCXZlY3RvclszXSA9IE5VTEw7Ci0JCQkJCWJ1Y2tldC0+aXJxX2luZm8gPSB2ZWN0b3I7Ci0JCQkJCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX01VTFRJOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGVudDsKLQotCQkJCXZlY3RvciA9ICh2b2lkICoqKW9yaWc7Ci0JCQkJZm9yIChlbnQgPSAwOyBlbnQgPCA0OyBlbnQrKykgewotCQkJCQlpZiAodmVjdG9yW2VudF0gPT0gTlVMTCkgewotCQkJCQkJdmVjdG9yW2VudF0gPSBhY3Rpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50ID09IDQpCi0JCQkJCWdvdG8gZnJlZV9hbmRfZWJ1c3k7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWNrZXQtPmlycV9pbmZvID0gYWN0aW9uOwotCQkJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOwotCQl9CisJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOworCXBlbmRpbmcgPSAwOworCWlmIChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSB7CiAJCXBlbmRpbmcgPSBidWNrZXQtPnBlbmRpbmc7CiAJCWlmIChwZW5kaW5nKQogCQkJYnVja2V0LT5wZW5kaW5nID0gMDsKQEAgLTQ1NSwxMCArNDEwLDcgQEAKIAlwdXRfaW5vX2luX2lycWFjdGlvbihhY3Rpb24sIGlycSk7CiAJcHV0X3NtcGFmZl9pbl9pcnFhY3Rpb24oYWN0aW9uLCBDUFVfTUFTS19OT05FKTsKIAotCWlmICh0bXApCi0JCXRtcC0+bmV4dCA9IGFjdGlvbjsKLQllbHNlCi0JCSooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKSA9IGFjdGlvbjsKKwlhcHBlbmRfaXJxX2FjdGlvbihidWNrZXQtPnBpbCwgYWN0aW9uKTsKIAogCWVuYWJsZV9pcnEoaXJxKTsKIApAQCAtNDY3LDE0NyArNDE5LDEwMyBAQAogCQlhdG9taWNfYnVja2V0X2luc2VydChidWNrZXQpOwogCQlzZXRfc29mdGludCgxIDw8IGJ1Y2tldC0+cGlsKTsKIAl9CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQlpZiAoKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpICYmICghKGlycWZsYWdzICYgU0FfU1RBVElDX0FMTE9DKSkpCisKKwlpZiAoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkKIAkJcmVnaXN0ZXJfaXJxX3Byb2MoX19pcnFfaW5vKGlycSkpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWRpc3RyaWJ1dGVfaXJxcygpOwogI2VuZGlmCiAJcmV0dXJuIDA7Ci0KLWZyZWVfYW5kX2VidXN5OgotCWtmcmVlKGFjdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FQlVTWTsKLQotZnJlZV9hbmRfZW5vbWVtOgotCWtmcmVlKGFjdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9pcnEpOwogCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiAqdW5saW5rX2lycV9hY3Rpb24odW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSBfX2J1Y2tldChpcnEpOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiwgKipwcDsKKworCXBwID0gaXJxX2FjdGlvbiArIGJ1Y2tldC0+cGlsOworCWFjdGlvbiA9ICpwcDsKKwlpZiAodW5saWtlbHkoIWFjdGlvbikpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KCFhY3Rpb24tPmhhbmRsZXIpKSB7CisJCXByaW50aygiRnJlZWluZyBmcmVlIElSUSAlZFxuIiwgYnVja2V0LT5waWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAoYWN0aW9uICYmIGFjdGlvbi0+ZGV2X2lkICE9IGRldl9pZCkgeworCQlwcCA9ICZhY3Rpb24tPm5leHQ7CisJCWFjdGlvbiA9ICpwcDsKKwl9CisKKwlpZiAobGlrZWx5KGFjdGlvbikpCisJCSpwcCA9IGFjdGlvbi0+bmV4dDsKKworCXJldHVybiBhY3Rpb247Cit9CisKIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKLQlzdHJ1Y3QgaXJxYWN0aW9uICp0bXAgPSBOVUxMOworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gX19idWNrZXQoaXJxKSwgKmJwOwogCi0JaWYgKChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSAmJgotCSAgICAoYnVja2V0IDwgJml2ZWN0b3JfdGFibGVbMF0gfHwKLQkgICAgIGJ1Y2tldCA+PSAmaXZlY3Rvcl90YWJsZVtOVU1fSVZFQ1NdKSkgewotCQl1bnNpZ25lZCBpbnQgKmNhbGxlcjsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUlaTcsICUwIiA6ICI9ciIgKGNhbGxlcikpOwotCQlwcmludGsoS0VSTl9DUklUICJmcmVlX2lycTogT2xkIHN0eWxlIElSUSByZW1vdmFsIGF0dGVtcHQgIgotCQkgICAgICAgImZyb20gJXAsIGlycSAlMDh4LlxuIiwgY2FsbGVyLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCQogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAotCWFjdGlvbiA9ICooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKTsKLQlpZiAoIWFjdGlvbi0+aGFuZGxlcikgewotCQlwcmludGsoIkZyZWVpbmcgZnJlZSBJUlEgJWRcbiIsIGJ1Y2tldC0+cGlsKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZGV2X2lkKSB7Ci0JCWZvciAoIDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKLQkJCWlmIChhY3Rpb24tPmRldl9pZCA9PSBkZXZfaWQpCi0JCQkJYnJlYWs7Ci0JCQl0bXAgPSBhY3Rpb247Ci0JCX0KLQkJaWYgKCFhY3Rpb24pIHsKLQkJCXByaW50aygiVHJ5aW5nIHRvIGZyZWUgZnJlZSBzaGFyZWQgSVJRICVkXG4iLCBidWNrZXQtPnBpbCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSBpZiAoYWN0aW9uLT5mbGFncyAmIFNBX1NISVJRKSB7Ci0JCXByaW50aygiVHJ5aW5nIHRvIGZyZWUgc2hhcmVkIElSUSAlZCB3aXRoIE5VTEwgZGV2aWNlIElEXG4iLCBidWNrZXQtPnBpbCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TVEFUSUNfQUxMT0MpIHsKLQkJcHJpbnRrKCJBdHRlbXB0IHRvIGZyZWUgc3RhdGljYWxseSBhbGxvY2F0ZWQgSVJRICVkICglcylcbiIsCi0JCSAgICAgICBidWNrZXQtPnBpbCwgYWN0aW9uLT5uYW1lKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYWN0aW9uICYmIHRtcCkKLQkJdG1wLT5uZXh0ID0gYWN0aW9uLT5uZXh0OwotCWVsc2UKLQkJKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pID0gYWN0aW9uLT5uZXh0OworCWFjdGlvbiA9IHVubGlua19pcnFfYWN0aW9uKGlycSwgZGV2X2lkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwogCisJaWYgKHVubGlrZWx5KCFhY3Rpb24pKQorCQlyZXR1cm47CisKIAlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAorCWJ1Y2tldCA9IF9fYnVja2V0KGlycSk7CiAJaWYgKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpIHsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gYnVja2V0LT5pcnFfaW5mbzsKIAkJdW5zaWduZWQgbG9uZyBpbWFwID0gYnVja2V0LT5pbWFwOwotCQl2b2lkICoqdmVjdG9yLCAqb3JpZzsKLQkJaW50IGVudDsKKwkJaW50IGVudCwgaTsKIAotCQlvcmlnID0gYnVja2V0LT5pcnFfaW5mbzsKLQkJdmVjdG9yID0gKHZvaWQgKiopb3JpZzsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JUlFfREVTQ19BQ1RJT047IGkrKykgeworCQkJc3RydWN0IGlycWFjdGlvbiAqcCA9ICZkZXNjLT5hY3Rpb25baV07CiAKLQkJaWYgKChidWNrZXQtPmZsYWdzICYgSUJGX01VTFRJKSAhPSAwKSB7Ci0JCQlpbnQgb3RoZXIgPSAwOwotCQkJdm9pZCAqb3JwaGFuID0gTlVMTDsKLQkJCWZvciAoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQlpZiAodmVjdG9yW2VudF0gPT0gYWN0aW9uKQotCQkJCQl2ZWN0b3JbZW50XSA9IE5VTEw7Ci0JCQkJZWxzZSBpZiAodmVjdG9yW2VudF0gIT0gTlVMTCkgewotCQkJCQlvcnBoYW4gPSB2ZWN0b3JbZW50XTsKLQkJCQkJb3RoZXIrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIE9ubHkgZnJlZSB3aGVuIG5vIG90aGVyIHNoYXJlZCBpcnEKLQkJCSAqIHVzZXMgdGhpcyBidWNrZXQuCi0JCQkgKi8KLQkJCWlmIChvdGhlcikgewotCQkJCWlmIChvdGhlciA9PSAxKSB7Ci0JCQkJCS8qIENvbnZlcnQgYmFjayB0byBub24tc2hhcmVkIGJ1Y2tldC4gKi8KLQkJCQkJYnVja2V0LT5pcnFfaW5mbyA9IG9ycGhhbjsKLQkJCQkJYnVja2V0LT5mbGFncyAmPSB+KElCRl9NVUxUSSk7Ci0JCQkJCWtmcmVlKHZlY3Rvcik7Ci0JCQkJfQotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9IGVsc2UgewotCQkJYnVja2V0LT5pcnFfaW5mbyA9IE5VTEw7Ci0JCX0KLQotCQkvKiBUaGlzIHVuaXF1ZSBpbnRlcnJ1cHQgc291cmNlIGlzIG5vdyBpbmFjdGl2ZS4gKi8KLQkJYnVja2V0LT5mbGFncyAmPSB+SUJGX0FDVElWRTsKLQotCQkvKiBTZWUgaWYgYW55IG90aGVyIGJ1Y2tldHMgc2hhcmUgdGhpcyBidWNrZXQncyBJTUFQCi0JCSAqIGFuZCBhcmUgc3RpbGwgYWN0aXZlLgotCQkgKi8KLQkJZm9yIChlbnQgPSAwOyBlbnQgPCBOVU1fSVZFQ1M7IGVudCsrKSB7Ci0JCQlicCA9ICZpdmVjdG9yX3RhYmxlW2VudF07Ci0JCQlpZiAoYnAgIT0gYnVja2V0CSYmCi0JCQkgICAgYnAtPmltYXAgPT0gaW1hcAkmJgotCQkJICAgIChicC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKQorCQkJaWYgKHAgPT0gYWN0aW9uKSB7CisJCQkJZGVzYy0+YWN0aW9uX2FjdGl2ZV9tYXNrICY9IH4oMSA8PCBpKTsKIAkJCQlicmVhazsKKwkJCX0KIAkJfQogCi0JCS8qIE9ubHkgZGlzYWJsZSB3aGVuIG5vIG90aGVyIHN1Yi1pcnEgbGV2ZWxzIG9mCi0JCSAqIHRoZSBzYW1lIElNQVAgYXJlIGFjdGl2ZS4KLQkJICovCi0JCWlmIChlbnQgPT0gTlVNX0lWRUNTKQotCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJaWYgKCFkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2spIHsKKwkJCS8qIFRoaXMgdW5pcXVlIGludGVycnVwdCBzb3VyY2UgaXMgbm93IGluYWN0aXZlLiAqLworCQkJYnVja2V0LT5mbGFncyAmPSB+SUJGX0FDVElWRTsKKworCQkJLyogU2VlIGlmIGFueSBvdGhlciBidWNrZXRzIHNoYXJlIHRoaXMgYnVja2V0J3MgSU1BUAorCQkJICogYW5kIGFyZSBzdGlsbCBhY3RpdmUuCisJCQkgKi8KKwkJCWZvciAoZW50ID0gMDsgZW50IDwgTlVNX0lWRUNTOyBlbnQrKykgeworCQkJCXN0cnVjdCBpbm9fYnVja2V0ICpicCA9ICZpdmVjdG9yX3RhYmxlW2VudF07CisJCQkJaWYgKGJwICE9IGJ1Y2tldAkmJgorCQkJCSAgICBicC0+aW1hcCA9PSBpbWFwCSYmCisJCQkJICAgIChicC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogT25seSBkaXNhYmxlIHdoZW4gbm8gb3RoZXIgc3ViLWlycSBsZXZlbHMgb2YKKwkJCSAqIHRoZSBzYW1lIElNQVAgYXJlIGFjdGl2ZS4KKwkJCSAqLworCQkJaWYgKGVudCA9PSBOVU1fSVZFQ1MpCisJCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJfQogCX0KIAotb3V0OgotCWtmcmVlKGFjdGlvbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTY0Niw5OSArNTU0LDU1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi12b2lkIGNhdGNoX2Rpc2FibGVkX2l2ZWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBwcm9jZXNzX2J1Y2tldChpbnQgaXJxLCBzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IF9fYnVja2V0KCppcnFfd29yayhjcHUsIDApKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBicC0+aXJxX2luZm87CisJdW5zaWduZWQgY2hhciBmbGFncyA9IGJwLT5mbGFnczsKKwl1MzIgYWN0aW9uX21hc2ssIGk7CisJaW50IHJhbmRvbTsKIAotCS8qIFdlIGNhbiBhY3R1YWxseSBzZWUgdGhpcyBvbiBVbHRyYS9QQ0kgUENJIGNhcmRzLCB3aGljaCBhcmUgYnJpZGdlcwotCSAqIHRvIG90aGVyIGRldmljZXMuICBIZXJlIGEgc2luZ2xlIElNQVAgZW5hYmxlZCBwb3RlbnRpYWxseSBtdWx0aXBsZQotCSAqIHVuaXF1ZSBpbnRlcnJ1cHQgc291cmNlcyAod2hpY2ggZWFjaCBkbyBoYXZlIGEgdW5pcXVlIElDTFIgcmVnaXN0ZXIuCi0JICoKLQkgKiBTbyB3aGF0IHdlIGRvIGlzIGp1c3QgcmVnaXN0ZXIgdGhhdCB0aGUgSVZFQyBhcnJpdmVkLCB3aGVuIHJlZ2lzdGVyZWQKLQkgKiBmb3IgcmVhbCB0aGUgcmVxdWVzdF9pcnEoKSBjb2RlIHdpbGwgY2hlY2sgdGhlIGJpdCBhbmQgc2lnbmFsCi0JICogYSBsb2NhbCBDUFUgaW50ZXJydXB0IGZvciBpdC4KLQkgKi8KLSNpZiAwCi0JcHJpbnRrKCJJVkVDOiBTcHVyaW91cyBpbnRlcnJ1cHQgdmVjdG9yICgleCkgcmVjZWl2ZWQgYXQgKCUwMTZseClcbiIsCi0JICAgICAgIGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdLCByZWdzLT50cGMpOwotI2VuZGlmCi0JKmlycV93b3JrKGNwdSwgMCkgPSAwOwotCWJ1Y2tldC0+cGVuZGluZyA9IDE7Ci19CisJYnAtPmZsYWdzIHw9IElCRl9JTlBST0dSRVNTOwogCi0vKiBUdW5lIHRoaXMuLi4gKi8KLSNkZWZpbmUgRk9SV0FSRF9WT0xVTUUJCTEyCi0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWRpcmVjdF9pbnRyKGludCBjcHUsIHN0cnVjdCBpbm9fYnVja2V0ICpicCkKLXsKLQkvKiBPaywgaGVyZSBpcyB3aGF0IGlzIGdvaW5nIG9uOgotCSAqIDEpIFJldGFyZ2V0aW5nIElSUXMgb24gU3RhcmZpcmUgaXMgdmVyeQotCSAqICAgIGV4cGVuc2l2ZSBzbyBqdXN0IGZvcmdldCBhYm91dCBpdCBvbiB0aGVtLgotCSAqIDIpIE1vdmluZyBhcm91bmQgdmVyeSBoaWdoIHByaW9yaXR5IGludGVycnVwdHMKLQkgKiAgICBpcyBhIGxvc2luZyBnYW1lLgotCSAqIDMpIElmIHRoZSBjdXJyZW50IGNwdSBpcyBpZGxlLCBpbnRlcnJ1cHRzIGFyZQotCSAqICAgIHVzZWZ1bCB3b3JrLCBzbyBrZWVwIHRoZW0gaGVyZS4gIEJ1dCBkbyBub3QKLQkgKiAgICBwYXNzIHRvIG91ciBuZWlnaGJvdXIgaWYgaGUgaXMgbm90IHZlcnkgaWRsZS4KLQkgKiA0KSBJZiBzeXNhZG1pbiBleHBsaWNpdGx5IGFza3MgZm9yIGRpcmVjdGVkIGludHJzLAotCSAqICAgIEp1c3QgRG8gSXQuCi0JICovCi0Jc3RydWN0IGlycWFjdGlvbiAqYXAgPSBicC0+aXJxX2luZm87Ci0JY3B1bWFza190IGNwdV9tYXNrOwotCXVuc2lnbmVkIGludCBidWRkeSwgdGlja3M7Ci0KLQljcHVfbWFzayA9IGdldF9zbXBhZmZfaW5faXJxYWN0aW9uKGFwKTsKLQljcHVzX2FuZChjcHVfbWFzaywgY3B1X21hc2ssIGNwdV9vbmxpbmVfbWFwKTsKLQlpZiAoY3B1c19lbXB0eShjcHVfbWFzaykpCi0JCWNwdV9tYXNrID0gY3B1X29ubGluZV9tYXA7Ci0KLQlpZiAodGhpc19pc19zdGFyZmlyZSAhPSAwIHx8Ci0JICAgIGJwLT5waWwgPj0gMTAgfHwgY3VycmVudC0+cGlkID09IDApCisJaWYgKHVubGlrZWx5KCEoZmxhZ3MgJiBJQkZfQUNUSVZFKSkpIHsKKwkJYnAtPnBlbmRpbmcgPSAxOwogCQlnb3RvIG91dDsKLQotCS8qICdjcHUnIGlzIHRoZSBNSUQgKGllLiBVUEFJRCksIGNhbGN1bGF0ZSB0aGUgTUlECi0JICogb2Ygb3VyIGJ1ZGR5LgotCSAqLwotCWJ1ZGR5ID0gY3B1ICsgMTsKLQlpZiAoYnVkZHkgPj0gTlJfQ1BVUykKLQkJYnVkZHkgPSAwOwotCi0JdGlja3MgPSAwOwotCXdoaWxlICghY3B1X2lzc2V0KGJ1ZGR5LCBjcHVfbWFzaykpIHsKLQkJaWYgKCsrYnVkZHkgPj0gTlJfQ1BVUykKLQkJCWJ1ZGR5ID0gMDsKLQkJaWYgKCsrdGlja3MgPiBOUl9DUFVTKSB7Ci0JCQlwdXRfc21wYWZmX2luX2lycWFjdGlvbihhcCwgQ1BVX01BU0tfTk9ORSk7Ci0JCQlnb3RvIG91dDsKLQkJfQogCX0KIAotCWlmIChidWRkeSA9PSBjcHUpCi0JCWdvdG8gb3V0OworCWlmIChkZXNjLT5wcmVfaGFuZGxlcikKKwkJZGVzYy0+cHJlX2hhbmRsZXIoYnAsCisJCQkJICBkZXNjLT5wcmVfaGFuZGxlcl9hcmcxLAorCQkJCSAgZGVzYy0+cHJlX2hhbmRsZXJfYXJnMik7CiAKLQkvKiBWb28tZG9vIHByb2dyYW1taW5nLiAqLwotCWlmIChjcHVfZGF0YShidWRkeSkuaWRsZV92b2x1bWUgPCBGT1JXQVJEX1ZPTFVNRSkKLQkJZ290byBvdXQ7CisJYWN0aW9uX21hc2sgPSBkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2s7CisJcmFuZG9tID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lSUV9ERVNDX0FDVElPTjsgaSsrKSB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKnAgPSAmZGVzYy0+YWN0aW9uW2ldOworCQl1MzIgbWFzayA9ICgxIDw8IGkpOwogCi0JLyogVGhpcyBqdXN0IHNvIGhhcHBlbnMgdG8gYmUgY29ycmVjdCBvbiBDaGVldGFoCi0JICogYXQgdGhlIG1vbWVudC4KLQkgKi8KLQlidWRkeSA8PD0gMjY7CisJCWlmICghKGFjdGlvbl9tYXNrICYgbWFzaykpCisJCQljb250aW51ZTsKIAotCS8qIFB1c2ggaXQgdG8gb3VyIGJ1ZGR5LiAqLwotCXVwYV93cml0ZWwoYnVkZHkgfCBJTUFQX1ZBTElELCBicC0+aW1hcCk7CisJCWFjdGlvbl9tYXNrICY9IH5tYXNrOwogCisJCWlmIChwLT5oYW5kbGVyKF9faXJxKGJwKSwgcC0+ZGV2X2lkLCByZWdzKSA9PSBJUlFfSEFORExFRCkKKwkJCXJhbmRvbSB8PSBwLT5mbGFnczsKKworCQlpZiAoIWFjdGlvbl9tYXNrKQorCQkJYnJlYWs7CisJfQorCWlmIChicC0+cGlsICE9IDApIHsKKwkJdXBhX3dyaXRlbChJQ0xSX0lETEUsIGJwLT5pY2xyKTsKKwkJLyogVGVzdCBhbmQgYWRkIGVudHJvcHkgKi8KKwkJaWYgKHJhbmRvbSAmIFNBX1NBTVBMRV9SQU5ET00pCisJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKKwl9CiBvdXQ6Ci0JcmV0dXJuOworCWJwLT5mbGFncyAmPSB+SUJGX0lOUFJPR1JFU1M7CiB9CiAKLSNlbmRpZgotCiB2b2lkIGhhbmRsZXJfaXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBpbm9fYnVja2V0ICpicCwgKm5icDsKKwlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnA7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogI2lmbmRlZiBDT05GSUdfU01QCkBAIC03NTYsOCArNjIwLDYgQEAKIAkJY2xlYXJfc29mdGludChjbHJfbWFzayk7CiAJfQogI2Vsc2UKLQlpbnQgc2hvdWxkX2ZvcndhcmQgPSAwOwotCiAJY2xlYXJfc29mdGludCgxIDw8IGlycSk7CiAjZW5kaWYKIApAQCAtNzcyLDIwMCArNjM0LDc3IEBACiAjZWxzZQogCWJwID0gX19idWNrZXQoeGNoZzMyKGlycV93b3JrKGNwdSwgaXJxKSwgMCkpOwogI2VuZGlmCi0JZm9yICggOyBicCAhPSBOVUxMOyBicCA9IG5icCkgewotCQl1bnNpZ25lZCBjaGFyIGZsYWdzID0gYnAtPmZsYWdzOwotCQl1bnNpZ25lZCBjaGFyIHJhbmRvbSA9IDA7CisJd2hpbGUgKGJwKSB7CisJCXN0cnVjdCBpbm9fYnVja2V0ICpuYnAgPSBfX2J1Y2tldChicC0+aXJxX2NoYWluKTsKIAotCQluYnAgPSBfX2J1Y2tldChicC0+aXJxX2NoYWluKTsKIAkJYnAtPmlycV9jaGFpbiA9IDA7Ci0KLQkJYnAtPmZsYWdzIHw9IElCRl9JTlBST0dSRVNTOwotCi0JCWlmICgoZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKSB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCQkJaWYgKChmbGFncyAmIElCRl9ETUFfU1lOQykgIT0gMCkgewotCQkJCXVwYV9yZWFkbChkbWFfc3luY19yZWdfdGFibGVbYnAtPnN5bmN0YWJfZW50XSk7Ci0JCQkJdXBhX3JlYWRxKHBjaV9kbWFfd3N5bmMpOwotCQkJfQotI2VuZGlmCi0JCQlpZiAoKGZsYWdzICYgSUJGX01VTFRJKSA9PSAwKSB7Ci0JCQkJc3RydWN0IGlycWFjdGlvbiAqYXAgPSBicC0+aXJxX2luZm87Ci0JCQkJaW50IHJldDsKLQotCQkJCXJldCA9IGFwLT5oYW5kbGVyKF9faXJxKGJwKSwgYXAtPmRldl9pZCwgcmVncyk7Ci0JCQkJaWYgKHJldCA9PSBJUlFfSEFORExFRCkKLQkJCQkJcmFuZG9tIHw9IGFwLT5mbGFnczsKLQkJCX0gZWxzZSB7Ci0JCQkJdm9pZCAqKnZlY3RvciA9ICh2b2lkICoqKWJwLT5pcnFfaW5mbzsKLQkJCQlpbnQgZW50OwotCQkJCWZvciAoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQkJc3RydWN0IGlycWFjdGlvbiAqYXAgPSB2ZWN0b3JbZW50XTsKLQkJCQkJaWYgKGFwICE9IE5VTEwpIHsKLQkJCQkJCWludCByZXQ7Ci0KLQkJCQkJCXJldCA9IGFwLT5oYW5kbGVyKF9faXJxKGJwKSwKLQkJCQkJCQkJICBhcC0+ZGV2X2lkLAotCQkJCQkJCQkgIHJlZ3MpOwotCQkJCQkJaWYgKHJldCA9PSBJUlFfSEFORExFRCkKLQkJCQkJCQlyYW5kb20gfD0gYXAtPmZsYWdzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyogT25seSB0aGUgZHVtbXkgYnVja2V0IGxhY2tzIElNQVAvSUNMUi4gKi8KLQkJCWlmIChicC0+cGlsICE9IDApIHsKLSNpZmRlZiBDT05GSUdfU01QCi0JCQkJaWYgKHNob3VsZF9mb3J3YXJkKSB7Ci0JCQkJCXJlZGlyZWN0X2ludHIoY3B1LCBicCk7Ci0JCQkJCXNob3VsZF9mb3J3YXJkID0gMDsKLQkJCQl9Ci0jZW5kaWYKLQkJCQl1cGFfd3JpdGVsKElDTFJfSURMRSwgYnAtPmljbHIpOwotCi0JCQkJLyogVGVzdCBhbmQgYWRkIGVudHJvcHkgKi8KLQkJCQlpZiAocmFuZG9tICYgU0FfU0FNUExFX1JBTkRPTSkKLQkJCQkJYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGlycSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYnAtPnBlbmRpbmcgPSAxOwotCi0JCWJwLT5mbGFncyAmPSB+SUJGX0lOUFJPR1JFU1M7CisJCXByb2Nlc3NfYnVja2V0KGlycSwgYnAsIHJlZ3MpOworCQlicCA9IG5icDsKIAl9CiAJaXJxX2V4aXQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0ZECi1leHRlcm4gdm9pZCBmbG9wcHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9jb29raWUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBmbG9wcHlfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTs7CiAKLXZvaWQgc3BhcmNfZmxvcHB5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfY29va2llLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKy8qIFhYWCBObyBlYXN5IHdheSB0byBpbmNsdWRlIGFzbS9mbG9wcHkuaCBYWFggKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyICpwZG1hX3ZhZGRyOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGRtYV9zaXplOworZXh0ZXJuIHZvbGF0aWxlIGludCBkb2luZ19wZG1hOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmRjX3N0YXR1czsKKworaXJxcmV0dXJuX3Qgc3BhcmNfZmxvcHB5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfY29va2llLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24gPSAqKGlycSArIGlycV9hY3Rpb24pOwotCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQ7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAobGlrZWx5KGRvaW5nX3BkbWEpKSB7CisJCXZvaWQgX19pb21lbSAqc3RhdCA9ICh2b2lkIF9faW9tZW0gKikgZmRjX3N0YXR1czsKKwkJdW5zaWduZWQgY2hhciAqdmFkZHIgPSBwZG1hX3ZhZGRyOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBwZG1hX3NpemU7CisJCXU4IHZhbDsKIAotCWlycV9lbnRlcigpOwotCWtzdGF0X3RoaXNfY3B1LmlycXNbaXJxXSsrOworCQl3aGlsZSAoc2l6ZSkgeworCQkJdmFsID0gcmVhZGIoc3RhdCk7CisJCQlpZiAodW5saWtlbHkoISh2YWwgJiAweDgwKSkpIHsKKwkJCQlwZG1hX3ZhZGRyID0gdmFkZHI7CisJCQkJcGRtYV9zaXplID0gc2l6ZTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlpZiAodW5saWtlbHkoISh2YWwgJiAweDIwKSkpIHsKKwkJCQlwZG1hX3ZhZGRyID0gdmFkZHI7CisJCQkJcGRtYV9zaXplID0gc2l6ZTsKKwkJCQlkb2luZ19wZG1hID0gMDsKKwkJCQlnb3RvIG1haW5faW50ZXJydXB0OworCQkJfQorCQkJaWYgKHZhbCAmIDB4NDApIHsKKwkJCQkvKiByZWFkICovCisJCQkJKnZhZGRyKysgPSByZWFkYihzdGF0ICsgMSk7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSA9ICp2YWRkcisrOwogCi0JKihpcnFfd29yayhjcHUsIGlycSkpID0gMDsKLQlidWNrZXQgPSBnZXRfaW5vX2luX2lycWFjdGlvbihhY3Rpb24pICsgaXZlY3Rvcl90YWJsZTsKKwkJCQkvKiB3cml0ZSAqLworCQkJCXdyaXRlYihkYXRhLCBzdGF0ICsgMSk7CisJCQl9CisJCQlzaXplLS07CisJCX0KIAotCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0lOUFJPR1JFU1M7CisJCXBkbWFfdmFkZHIgPSB2YWRkcjsKKwkJcGRtYV9zaXplID0gc2l6ZTsKIAotCWZsb3BweV9pbnRlcnJ1cHQoaXJxLCBkZXZfY29va2llLCByZWdzKTsKLQl1cGFfd3JpdGVsKElDTFJfSURMRSwgYnVja2V0LT5pY2xyKTsKKwkJLyogU2VuZCBUZXJtaW5hbCBDb3VudCBwdWxzZSB0byBmbG9wcHkgY29udHJvbGxlci4gKi8KKwkJdmFsID0gcmVhZGIoYXV4aW9fcmVnaXN0ZXIpOworCQl2YWwgfD0gQVVYSU9fQVVYMV9GVENOVDsKKwkJd3JpdGViKHZhbCwgYXV4aW9fcmVnaXN0ZXIpOworCQl2YWwgJj0gQVVYSU9fQVVYMV9GVENOVDsKKwkJd3JpdGViKHZhbCwgYXV4aW9fcmVnaXN0ZXIpOwogCi0JYnVja2V0LT5mbGFncyAmPSB+SUJGX0lOUFJPR1JFU1M7CisJCWRvaW5nX3BkbWEgPSAwOworCX0KIAotCWlycV9leGl0KCk7CittYWluX2ludGVycnVwdDoKKwlyZXR1cm4gZmxvcHB5X2ludGVycnVwdChpcnEsIGRldl9jb29raWUsIHJlZ3MpOwogfQorRVhQT1JUX1NZTUJPTChzcGFyY19mbG9wcHlfaXJxKTsKICNlbmRpZgogCi0vKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdGhhdCB0aGUgYnJhbmNoIGxpZXMgYmVmb3JlIHRoZSBwbGFjZSB3ZQotICogYXJlIGJyYW5jaGluZyB0by4gIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGEgdHJhcCB2ZWN0b3IuLi4KLSAqIFlvdSBoYXZlIGJlZW4gd2FybmVkLgotICovCi0jZGVmaW5lIFNQQVJDX0JSQU5DSChkZXN0X2FkZHIsIGluc3RfYWRkcikgXAotICAgICAgICAgICgweDEwODAwMDAwIHwgKCgoKGRlc3RfYWRkciktKGluc3RfYWRkcikpPj4yKSYweDNmZmZmZikpCi0KLSNkZWZpbmUgU1BBUkNfTk9QICgweDAxMDAwMDAwKQotCi1zdGF0aWMgdm9pZCBpbnN0YWxsX2Zhc3RfaXJxKHVuc2lnbmVkIGludCBjcHVfaXJxLAotCQkJICAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X3R0YWJsZV90bDA7Ci0JdW5zaWduZWQgbG9uZyB0dGVudCA9ICh1bnNpZ25lZCBsb25nKSAmc3BhcmM2NF90dGFibGVfdGwwOwotCXVuc2lnbmVkIGludCAqaW5zbnM7Ci0KLQl0dGVudCArPSAweDgyMDsKLQl0dGVudCArPSAoY3B1X2lycSAtIDEpIDw8IDU7Ci0JaW5zbnMgPSAodW5zaWduZWQgaW50ICopIHR0ZW50OwotCWluc25zWzBdID0gU1BBUkNfQlJBTkNIKCgodW5zaWduZWQgbG9uZykgaGFuZGxlciksCi0JCQkJKCh1bnNpZ25lZCBsb25nKSZpbnNuc1swXSkpOwotCWluc25zWzFdID0gU1BBUkNfTk9QOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtZW1iYXIgI1N0b3JlU3RvcmU7IGZsdXNoICUwIiA6IDogInIiICh0dGVudCkpOwotfQotCi1pbnQgcmVxdWVzdF9mYXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQkgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247Ci0Jc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IF9fYnVja2V0KGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIE5vIHBpbDAgZHVtbXkgYnVja2V0cyBhbGxvd2VkIGhlcmUuICovCi0JaWYgKGJ1Y2tldCA8ICZpdmVjdG9yX3RhYmxlWzBdIHx8Ci0JICAgIGJ1Y2tldCA+PSAmaXZlY3Rvcl90YWJsZVtOVU1fSVZFQ1NdKSB7Ci0JCXVuc2lnbmVkIGludCAqY2FsbGVyOwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YgJSVpNywgJTAiIDogIj1yIiAoY2FsbGVyKSk7Ci0JCXByaW50ayhLRVJOX0NSSVQgInJlcXVlc3RfZmFzdF9pcnE6IE9sZCBzdHlsZSBJUlEgcmVnaXN0cnkgYXR0ZW1wdCAiCi0JCSAgICAgICAiZnJvbSAlcCwgaXJxICUwOHguXG4iLCBjYWxsZXIsIGlycSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0JCi0JCi0JaWYgKCFoYW5kbGVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgoYnVja2V0LT5waWwgPT0gMCkgfHwgKGJ1Y2tldC0+cGlsID09IDE0KSkgewotCQlwcmludGsoInJlcXVlc3RfZmFzdF9pcnE6IFRyeWluZyB0byByZWdpc3RlciBzaGFyZWQgSVJRIDAgb3IgMTQuXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0KLQlhY3Rpb24gPSAqKGJ1Y2tldC0+cGlsICsgaXJxX2FjdGlvbik7Ci0JaWYgKGFjdGlvbikgewotCQlpZiAoYWN0aW9uLT5mbGFncyAmIFNBX1NISVJRKQotCQkJcGFuaWMoIlRyeWluZyB0byByZWdpc3RlciBmYXN0IGlycSB3aGVuIGFscmVhZHkgc2hhcmVkLlxuIik7Ci0JCWlmIChpcnFmbGFncyAmIFNBX1NISVJRKQotCQkJcGFuaWMoIlRyeWluZyB0byByZWdpc3RlciBmYXN0IGlycSBhcyBzaGFyZWQuXG4iKTsKLQkJcHJpbnRrKCJyZXF1ZXN0X2Zhc3RfaXJxOiBUcnlpbmcgdG8gcmVnaXN0ZXIgeWV0IGFscmVhZHkgb3duZWQuXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyoKLQkgKiBXZSBkbyBub3QgY2hlY2sgZm9yIFNBX1NBTVBMRV9SQU5ET00gaW4gdGhpcyBwYXRoLiBOZWl0aGVyIGRvIHdlCi0JICogc3VwcG9ydCBzbXAgaW50ciBhZmZpbml0eSBpbiB0aGlzIHBhdGguCi0JICovCi0JaWYgKGlycWZsYWdzICYgU0FfU1RBVElDX0FMTE9DKSB7Ci0JCWlmIChzdGF0aWNfaXJxX2NvdW50IDwgTUFYX1NUQVRJQ19BTExPQykKLQkJCWFjdGlvbiA9ICZzdGF0aWNfaXJxYWN0aW9uW3N0YXRpY19pcnFfY291bnQrK107Ci0JCWVsc2UKLQkJCXByaW50aygiUmVxdWVzdCBmb3IgSVJRJWQgKCVzKSBTQV9TVEFUSUNfQUxMT0MgZmFpbGVkICIKLQkJCSAgICAgICAidXNpbmcga21hbGxvY1xuIiwgYnVja2V0LT5waWwsIG5hbWUpOwotCX0KLQlpZiAoYWN0aW9uID09IE5VTEwpCi0JCWFjdGlvbiA9IChzdHJ1Y3QgaXJxYWN0aW9uICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlycWFjdGlvbiksCi0JCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmICghYWN0aW9uKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaW5zdGFsbF9mYXN0X2lycShidWNrZXQtPnBpbCwgaGFuZGxlcik7Ci0KLQlidWNrZXQtPmlycV9pbmZvID0gYWN0aW9uOwotCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0FDVElWRTsKLQotCWFjdGlvbi0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JYWN0aW9uLT5mbGFncyA9IGlycWZsYWdzOwotCWFjdGlvbi0+ZGV2X2lkID0gTlVMTDsKLQlhY3Rpb24tPm5hbWUgPSBuYW1lOwotCWFjdGlvbi0+bmV4dCA9IE5VTEw7Ci0JcHV0X2lub19pbl9pcnFhY3Rpb24oYWN0aW9uLCBpcnEpOwotCXB1dF9zbXBhZmZfaW5faXJxYWN0aW9uKGFjdGlvbiwgQ1BVX01BU0tfTk9ORSk7Ci0KLQkqKGJ1Y2tldC0+cGlsICsgaXJxX2FjdGlvbikgPSBhY3Rpb247Ci0JZW5hYmxlX2lycShpcnEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0JZGlzdHJpYnV0ZV9pcnFzKCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQogLyogV2UgcmVhbGx5IGRvbid0IG5lZWQgdGhlc2UgYXQgYWxsIG9uIHRoZSBTcGFyYy4gIFdlIG9ubHkgaGF2ZQogICogc3R1YnMgaGVyZSBiZWNhdXNlIHRoZXkgYXJlIGV4cG9ydGVkIHRvIG1vZHVsZXMuCiAgKi8KQEAgLTEwMzAsNyArNzY5LDEwIEBACiAJICovCiAJZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgTlJfSVJRUzsgbGV2ZWwrKykgewogCQlzdHJ1Y3QgaXJxYWN0aW9uICpwID0gaXJxX2FjdGlvbltsZXZlbF07Ci0JCWlmIChsZXZlbCA9PSAxMikgY29udGludWU7CisKKwkJaWYgKGxldmVsID09IDEyKQorCQkJY29udGludWU7CisKIAkJd2hpbGUocCkgewogCQkJY3B1ID0gcmV0YXJnZXRfb25lX2lycShwLCBjcHUpOwogCQkJcCA9IHAtPm5leHQ7CkBAIC0xMDQwLDggKzc4MiwxNCBAQAogfQogI2VuZGlmCiAKK3N0cnVjdCBzdW41X3RpbWVyIHsKKwl1NjQJY291bnQwOworCXU2NAlsaW1pdDA7CisJdTY0CWNvdW50MTsKKwl1NjQJbGltaXQxOworfTsKIAotc3RydWN0IHN1bjVfdGltZXIgKnByb21fdGltZXJzOworc3RhdGljIHN0cnVjdCBzdW41X3RpbWVyICpwcm9tX3RpbWVyczsKIHN0YXRpYyB1NjQgcHJvbV9saW1pdDAsIHByb21fbGltaXQxOwogCiBzdGF0aWMgdm9pZCBtYXBfcHJvbV90aW1lcnModm9pZCkKQEAgLTEwOTcsMTggKzg0NSw2IEBACiAJOiAiZzEiLCAiZzIiKTsKIH0KIAotdm9pZCBlbmFibGVfcHJvbV90aW1lcih2b2lkKQotewotCWlmICghcHJvbV90aW1lcnMpCi0JCXJldHVybjsKLQotCS8qIFNldCBpdCB0byB3aGF0ZXZlciB3YXMgdGhlcmUgYmVmb3JlLiAqLwotCXByb21fdGltZXJzLT5saW1pdDEgPSBwcm9tX2xpbWl0MTsKLQlwcm9tX3RpbWVycy0+Y291bnQxID0gMDsKLQlwcm9tX3RpbWVycy0+bGltaXQwID0gcHJvbV9saW1pdDA7Ci0JcHJvbV90aW1lcnMtPmNvdW50MCA9IDA7Ci19Ci0KIHZvaWQgaW5pdF9pcnF3b3JrX2N1cmNwdSh2b2lkKQogewogCXJlZ2lzdGVyIHN0cnVjdCBpcnFfd29ya19zdHJ1Y3QgKndvcmtwIGFzbSgibzIiKTsKQEAgLTExNzUsNyArOTExLDggQEAKIAkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJwID0gaXZlY3Rvcl90YWJsZSArIChsb25nKWRhdGE7Ci0Jc3RydWN0IGlycWFjdGlvbiAqYXAgPSBicC0+aXJxX2luZm87CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gYnAtPmlycV9pbmZvOworCXN0cnVjdCBpcnFhY3Rpb24gKmFwID0gZGVzYy0+YWN0aW9uOwogCWNwdW1hc2tfdCBtYXNrOwogCWludCBsZW47CiAKQEAgLTExOTMsMTEgKzkzMCwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldF9pbnRyX2FmZmluaXR5KGludCBpcnEsIGNwdW1hc2tfdCBod19hZmYpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJwID0gaXZlY3Rvcl90YWJsZSArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBicC0+aXJxX2luZm87CisJc3RydWN0IGlycWFjdGlvbiAqYXAgPSBkZXNjLT5hY3Rpb247CiAKIAkvKiBVc2VycyBzcGVjaWZ5IGFmZmluaXR5IGluIHRlcm1zIG9mIGh3IGNwdSBpZHMuCiAJICogQXMgc29vbiBhcyB3ZSBkbyB0aGlzLCBoYW5kbGVyX2lycSgpIG1pZ2h0IHNlZSBhbmQgdGFrZSBhY3Rpb24uCiAJICovCi0JcHV0X3NtcGFmZl9pbl9pcnFhY3Rpb24oKHN0cnVjdCBpcnFhY3Rpb24gKilicC0+aXJxX2luZm8sIGh3X2FmZik7CisJcHV0X3NtcGFmZl9pbl9pcnFhY3Rpb24oYXAsIGh3X2FmZik7CiAKIAkvKiBNaWdyYXRpb24gaXMgc2ltcGx5IGRvbmUgYnkgdGhlIG5leHQgY3B1IHRvIHNlcnZpY2UgdGhpcwogCSAqIGludGVycnVwdC4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYmRhYzYzMS4uYmJmMTFmOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTQzMywzICs0MzMsOCBAQAogCXJldHVybiAwOwogfQogCisvKiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KK2ludCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCA1MzQzMjBlLi45MWFiNDY2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwpAQCAtMTMwMyw4ICsxMzAzLDcgQEAKIHsKIAl1NjQgdG1wOwogCi0JLyogUFJPTSBzZXRzIHRoZSBJUlEgcmV0cnkgdmFsdWUgdG9vIGxvdywgaW5jcmVhc2UgaXQuICovCi0JcHN5Y2hvX3dyaXRlKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JUlFfUkVUUlksIDB4ZmYpOworCXBzeWNob193cml0ZShwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSVJRX1JFVFJZLCA1KTsKIAogCS8qIEVuYWJsZSBhcmJpdGVyIGZvciBhbGwgUENJIHNsb3RzLiAqLwogCXRtcCA9IHBzeWNob19yZWFkKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lBX0NUUkwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKaW5kZXggNTNkMzMzYi4uNTJiZjM0MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCkBAIC01OTUsNiArNTk1LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogV2hlbiBhIGRldmljZSBsaXZlcyBiZWhpbmQgYSBicmlkZ2UgZGVlcGVyIGluIHRoZSBQQ0kgYnVzIHRvcG9sb2d5CisgKiB0aGFuIEFQQiwgYSBzcGVjaWFsIHNlcXVlbmNlIG11c3QgcnVuIHRvIG1ha2Ugc3VyZSBhbGwgcGVuZGluZyBETUEKKyAqIHRyYW5zZmVycyBhdCB0aGUgdGltZSBvZiBJUlEgZGVsaXZlcnkgYXJlIHZpc2libGUgaW4gdGhlIGNvaGVyZW5jeQorICogZG9tYWluIGJ5IHRoZSBjcHUuICBUaGlzIHNlcXVlbmNlIGlzIHRvIHBlcmZvcm0gYSByZWFkIG9uIHRoZSBmYXIKKyAqIHNpZGUgb2YgdGhlIG5vbi1BUEIgYnJpZGdlLCB0aGVuIHBlcmZvcm0gYSByZWFkIG9mIFNhYnJlJ3MgRE1BCisgKiB3cml0ZS1zeW5jIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCBzYWJyZV93c3luY19oYW5kbGVyKHN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQsIHZvaWQgKl9hcmcxLCB2b2lkICpfYXJnMikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IF9hcmcxOworCXVuc2lnbmVkIGxvbmcgc3luY19yZWcgPSAodW5zaWduZWQgbG9uZykgX2FyZzI7CisJdTE2IF91bnVzZWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfVkVORE9SX0lELCAmX3VudXNlZCk7CisJc2FicmVfcmVhZChzeW5jX3JlZyk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNhYnJlX2lycV9idWlsZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAJCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgaW5vKQpAQCAtNjM5LDI0ICs2NTYsMTQgQEAKIAlpZiAocGRldikgewogCQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKIAotCQkvKiBXaGVuIGEgZGV2aWNlIGxpdmVzIGJlaGluZCBhIGJyaWRnZSBkZWVwZXIgaW4gdGhlCi0JCSAqIFBDSSBidXMgdG9wb2xvZ3kgdGhhbiBBUEIsIGEgc3BlY2lhbCBzZXF1ZW5jZSBtdXN0Ci0JCSAqIHJ1biB0byBtYWtlIHN1cmUgYWxsIHBlbmRpbmcgRE1BIHRyYW5zZmVycyBhdCB0aGUKLQkJICogdGltZSBvZiBJUlEgZGVsaXZlcnkgYXJlIHZpc2libGUgaW4gdGhlIGNvaGVyZW5jeQotCQkgKiBkb21haW4gYnkgdGhlIGNwdS4gIFRoaXMgc2VxdWVuY2UgaXMgdG8gcGVyZm9ybQotCQkgKiBhIHJlYWQgb24gdGhlIGZhciBzaWRlIG9mIHRoZSBub24tQVBCIGJyaWRnZSwgdGhlbgotCQkgKiBwZXJmb3JtIGEgcmVhZCBvZiBTYWJyZSdzIERNQSB3cml0ZS1zeW5jIHJlZ2lzdGVyLgotCQkgKgotCQkgKiBDdXJyZW50bHksIHRoZSBQQ0lfQ09ORklHIHJlZ2lzdGVyIGZvciB0aGUgZGV2aWNlCi0JCSAqIGlzIHVzZWQgZm9yIHRoaXMgcmVhZCBmcm9tIHRoZSBmYXIgc2lkZSBvZiB0aGUgYnJpZGdlLgotCQkgKi8KIAkJaWYgKHBkZXYtPmJ1cy0+bnVtYmVyICE9IHBjcC0+cGJtLT5wY2lfZmlyc3RfYnVzbm8pIHsKLQkJCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0RNQV9TWU5DOwotCQkJYnVja2V0LT5zeW5jdGFiX2VudCA9IGRtYV9zeW5jX3JlZ190YWJsZV9lbnRyeSsrOwotCQkJZG1hX3N5bmNfcmVnX3RhYmxlW2J1Y2tldC0+c3luY3RhYl9lbnRdID0KLQkJCQkodW5zaWduZWQgbG9uZykgc2FicmVfcGNpX2NvbmZpZ19ta2FkZHIoCi0JCQkJCXBjcC0+cGJtLAotCQkJCQlwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4sIFBDSV9DT01NQU5EKTsKKwkJCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwID0gcGNwLT5wYm0tPnBhcmVudDsKKwkJCXN0cnVjdCBpcnFfZGVzYyAqZCA9IGJ1Y2tldC0+aXJxX2luZm87CisKKwkJCWQtPnByZV9oYW5kbGVyID0gc2FicmVfd3N5bmNfaGFuZGxlcjsKKwkJCWQtPnByZV9oYW5kbGVyX2FyZzEgPSBwZGV2OworCQkJZC0+cHJlX2hhbmRsZXJfYXJnMiA9ICh2b2lkICopCisJCQkJcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgU0FCUkVfV1JTWU5DOwogCQl9CiAJfQogCXJldHVybiBfX2lycShidWNrZXQpOwpAQCAtMTYyNiwxMCArMTYzMyw5IEBACiAJICovCiAJcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1swXS5waHlzX2FkZHI7CiAJcC0+cGJtX0IuY29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1swXS5waHlzX2FkZHI7Ci0JcGNpX2RtYV93c3luYyA9IHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX1dSU1lOQzsKIAotCXByaW50aygiUENJOiBGb3VuZCBTQUJSRSwgbWFpbiByZWdzIGF0ICUwMTZseCwgd3N5bmMgYXQgJTAxNmx4XG4iLAotCSAgICAgICBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MsIHBjaV9kbWFfd3N5bmMpOworCXByaW50aygiUENJOiBGb3VuZCBTQUJSRSwgbWFpbiByZWdzIGF0ICUwMTZseFxuIiwKKwkgICAgICAgcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzKTsKIAogCS8qIENsZWFyIGludGVycnVwdHMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYwppbmRleCA1NzUzMTc1Li42YTE4MmJiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdXBhLmg+CisjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgogCiAjaW5jbHVkZSAicGNpX2ltcGwuaCIKICNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKQEAgLTMyNiw2ICszMjcsNDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCB0b21hdGlsbG9fd3N5bmNfaGFuZGxlcihzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0LCB2b2lkICpfYXJnMSwgdm9pZCAqX2FyZzIpCit7CisJdW5zaWduZWQgbG9uZyBzeW5jX3JlZyA9ICh1bnNpZ25lZCBsb25nKSBfYXJnMjsKKwl1NjQgbWFzayA9IDEgPDwgKF9faXJxX2lubyhfX2lycShidWNrZXQpKSAmIElNQVBfSU5PKTsKKwl1NjQgdmFsOworCWludCBsaW1pdDsKKworCXNjaGl6b193cml0ZShzeW5jX3JlZywgbWFzayk7CisKKwlsaW1pdCA9IDEwMDAwMDsKKwl2YWwgPSAwOworCXdoaWxlICgtLWxpbWl0KSB7CisJCXZhbCA9IHNjaGl6b19yZWFkKHN5bmNfcmVnKTsKKwkJaWYgKCEodmFsICYgbWFzaykpCisJCQlicmVhazsKKwl9CisJaWYgKGxpbWl0IDw9IDApIHsKKwkJcHJpbnRrKCJ0b21hdGlsbG9fd3N5bmNfaGFuZGxlcjogRE1BIHdvbid0IHN5bmMgWyVseDolbHhdXG4iLAorCQkgICAgICAgdmFsLCBtYXNrKTsKKwl9CisKKwlpZiAoX2FyZzEpIHsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FjaGVsaW5lWzY0XQorCQkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDY0KSkpOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZCAlJWZwcnMsICUwXG5cdCIKKwkJCQkgICAgICJvciAlMCwgJTQsICUxXG5cdCIKKwkJCQkgICAgICJ3ciAlMSwgMHgwLCAlJWZwcnNcblx0IgorCQkJCSAgICAgInN0ZGEgJSVmMCwgWyU1XSAlNlxuXHQiCisJCQkJICAgICAid3IgJTAsIDB4MCwgJSVmcHJzXG5cdCIKKwkJCQkgICAgICJtZW1iYXIgI1N5bmMiCisJCQkJICAgICA6ICI9JnIiIChtYXNrKSwgIj0mciIgKHZhbCkKKwkJCQkgICAgIDogIjAiIChtYXNrKSwgIjEiICh2YWwpLAorCQkJCSAgICAgImkiIChGUFJTX0ZFRiksICJyIiAoJmNhY2hlbGluZVswXSksCisJCQkJICAgICAiaSIgKEFTSV9CTEtfQ09NTUlUX1ApKTsKKwl9Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NoaXpvX2lycV9idWlsZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAJCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBpbm8pCkBAIC0zNjksNiArNDA4LDE1IEBACiAJYnVja2V0ID0gX19idWNrZXQoYnVpbGRfaXJxKHBpbCwgaWduX2ZpeHVwLCBpY2xyLCBpbWFwKSk7CiAJYnVja2V0LT5mbGFncyB8PSBJQkZfUENJOwogCisJaWYgKHBkZXYgJiYgcGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pIHsKKwkJc3RydWN0IGlycV9kZXNjICpwID0gYnVja2V0LT5pcnFfaW5mbzsKKworCQlwLT5wcmVfaGFuZGxlciA9IHRvbWF0aWxsb193c3luY19oYW5kbGVyOworCQlwLT5wcmVfaGFuZGxlcl9hcmcxID0gKChwYm0tPmNoaXBfdmVyc2lvbiA8PSA0KSA/CisJCQkJICAgICAgICh2b2lkICopIDEgOiAodm9pZCAqKSAwKTsKKwkJcC0+cHJlX2hhbmRsZXJfYXJnMiA9ICh2b2lkICopIHBibS0+c3luY19yZWc7CisJfQorCiAJcmV0dXJuIF9faXJxKGJ1Y2tldCk7CiB9CiAKQEAgLTg4NSw2ICs5MzMsNyBAQAogCiAjZGVmaW5lIFNDSElaT19QQ0lfQ1RSTAkJKDB4MjAwMFVMKQogI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9CVVNfVU5VUwkoMVVMIDw8IDYzVUwpIC8qIFNhZmFyaSAqLworI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9EVE9fSU5UCSgxVUwgPDwgNjFVTCkgLyogVG9tYXRpbGxvICovCiAjZGVmaW5lIFNDSElaT19QQ0lDVFJMX0FSQl9QUklPICgweDFmZiA8PCA1MlVMKSAvKiBUb21hdGlsbG8gKi8KICNkZWZpbmUgU0NISVpPX1BDSUNUUkxfRVNMQ0sJKDFVTCA8PCA1MVVMKSAvKiBTYWZhcmkgKi8KICNkZWZpbmUgU0NISVpPX1BDSUNUUkxfRVJSU0xPVAkoN1VMIDw8IDQ4VUwpIC8qIFNhZmFyaSAqLwpAQCAtMTg4NywzNyArMTkzNiwyNyBAQAogewogCXU2NCB0bXA7CiAKLQkvKiBTZXQgSVJRIHJldHJ5IHRvIGluZmluaXR5LiAqLwotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9JUlFfUkVUUlksCi0JCSAgICAgU0NISVpPX0lSUV9SRVRSWV9JTkYpOworCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9JUlFfUkVUUlksIDUpOwogCi0JLyogRW5hYmxlIGFyYml0ZXIgZm9yIGFsbCBQQ0kgc2xvdHMuICBBbHNvLCBkaXNhYmxlIFBDSSBpbnRlcnZhbAotCSAqIHRpbWVyIHNvIHRoYXQgRFRPIChEaXNjYXJkIFRpbWVPdXRzKSBhcmUgbm90IHJlcG9ydGVkIGJlY2F1c2UKLQkgKiBzb21lIFNjaGl6byByZXZpc2lvbnMgcmVwb3J0IHRoZW0gZXJyb25lb3VzbHkuCi0JICovCiAJdG1wID0gc2NoaXpvX3JlYWQocGJtLT5wYm1fcmVncyArIFNDSElaT19QQ0lfQ1RSTCk7Ci0JaWYgKHBibS0+Y2hpcF90eXBlID09IFBCTV9DSElQX1RZUEVfU0NISVpPX1BMVVMgJiYKLQkgICAgcGJtLT5jaGlwX3ZlcnNpb24gPT0gMHg1ICYmCi0JICAgIHBibS0+Y2hpcF9yZXZpc2lvbiA9PSAweDEpCi0JCXRtcCB8PSAweDBmOwotCWVsc2UKLQkJdG1wIHw9IDB4ZmY7CiAKLQl0bXAgJj0gflNDSElaT19QQ0lDVFJMX1BUTzsKKwkvKiBFbmFibGUgYXJiaXRlciBmb3IgYWxsIFBDSSBzbG90cy4gICovCisJdG1wIHw9IDB4ZmY7CisKIAlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gJiYKIAkgICAgcGJtLT5jaGlwX3ZlcnNpb24gPj0gMHgyKQogCQl0bXAgfD0gMHgzVUwgPDwgU0NISVpPX1BDSUNUUkxfUFRPX1NISUZUOwotCWVsc2UKLQkJdG1wIHw9IDB4MVVMIDw8IFNDSElaT19QQ0lDVFJMX1BUT19TSElGVDsKIAogCWlmICghcHJvbV9nZXRib29sKHBibS0+cHJvbV9ub2RlLCAibm8tYnVzLXBhcmtpbmciKSkKIAkJdG1wIHw9IFNDSElaT19QQ0lDVFJMX1BBUks7CisJZWxzZQorCQl0bXAgJj0gflNDSElaT19QQ0lDVFJMX1BBUks7CiAKIAlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gJiYKIAkgICAgcGJtLT5jaGlwX3ZlcnNpb24gPD0gMHgxKQotCQl0bXAgfD0gKDFVTCA8PCA2MSk7CisJCXRtcCB8PSBTQ0hJWk9fUENJQ1RSTF9EVE9fSU5UOwogCWVsc2UKLQkJdG1wICY9IH4oMVVMIDw8IDYxKTsKKwkJdG1wICY9IH5TQ0hJWk9fUENJQ1RSTF9EVE9fSU5UOwogCiAJaWYgKHBibS0+Y2hpcF90eXBlID09IFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKQogCQl0bXAgfD0gKFNDSElaT19QQ0lDVFJMX01STV9QUkVGIHwKQEAgLTIwMTUsNiArMjA1NCw5IEBACiAJcGJtLT5wYm1fcmVncyA9IHByX3JlZ3NbMF0ucGh5c19hZGRyOwogCXBibS0+Y29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1sxXS5waHlzX2FkZHIgLSAweDEwMDAwVUw7CiAKKwlpZiAoY2hpcF90eXBlID09IFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKQorCQlwYm0tPnN5bmNfcmVnID0gcHJfcmVnc1szXS5waHlzX2FkZHIgKyAweDFhMThVTDsKKwogCXNwcmludGYocGJtLT5uYW1lLAogCQkoY2hpcF90eXBlID09IFBCTV9DSElQX1RZUEVfVE9NQVRJTExPID8KIAkJICJUT01BVElMTE8lZCBQQk0lYyIgOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCmluZGV4IDUyZjE0ZTMuLjUzMzEwNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCiAKKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNyw3ICsxOSw2IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KIAotI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGEwY2QyYjIuLmNmZmIxYzggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC02MjEsOCArNjIxLDggQEAKIAltZW1jcHkoY2hpbGRfdHJhcF9mcmFtZSwgKCgoc3RydWN0IHNwYXJjX3N0YWNrZiAqKXJlZ3MpLTEpLCAoVFJBQ0VSRUdfU1orU1RBQ0tGUkFNRV9TWikpOwogCiAJdC0+ZmxhZ3MgPSAodC0+ZmxhZ3MgJiB+KCgweGZmVUwgPDwgVElfRkxBR19DV1BfU0hJRlQpIHwgKDB4ZmZVTCA8PCBUSV9GTEFHX0NVUlJFTlRfRFNfU0hJRlQpKSkgfAotCQlfVElGX05FV0NISUxEIHwKIAkJKCgocmVncy0+dHN0YXRlICsgMSkgJiBUU1RBVEVfQ1dQKSA8PCBUSV9GTEFHX0NXUF9TSElGVCk7CisJdC0+bmV3X2NoaWxkID0gMTsKIAl0LT5rc3AgPSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkX3RyYXBfZnJhbWUpIC0gU1RBQ0tfQklBUzsKIAl0LT5rcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKShjaGlsZF90cmFwX2ZyYW1lK3NpemVvZihzdHJ1Y3Qgc3BhcmNfc3RhY2tmKSk7CiAJdC0+ZnBzYXZlZFswXSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA4MGE3NmUyLi4yM2FkODM5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAKICNpbmNsdWRlIDxhc20vYXNpLmg+CkBAIC02MjgsMTUgKzYzMCwyNyBAQAogCXVubG9ja19rZXJuZWwoKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc3lzY2FsbF9leGl0X3ApCiB7Ci0jaWZkZWYgREVCVUdfUFRSQUNFCi0JcHJpbnRrKCIlcyBbJWRdOiBzeXNjYWxsX3RyYWNlXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotI2VuZGlmCi0JaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKLQkJcmV0dXJuOworCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCisJc2VjdXJlX2NvbXB1dGluZyhyZWdzLT51X3JlZ3NbVVJFR19HMV0pOworCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpICYmIHN5c2NhbGxfZXhpdF9wKSB7CisJCXVuc2lnbmVkIGxvbmcgdHN0YXRlID0gcmVncy0+dHN0YXRlOworCQlpbnQgcmVzdWx0ID0gQVVESVRTQ19TVUNDRVNTOworCisJCWlmICh1bmxpa2VseSh0c3RhdGUgJiAoVFNUQVRFX1hDQVJSWSB8IFRTVEFURV9JQ0FSUlkpKSkKKwkJCXJlc3VsdCA9IEFVRElUU0NfRkFJTFVSRTsKKworCQlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudCwgcmVzdWx0LCByZWdzLT51X3JlZ3NbVVJFR19JMF0pOworCX0KKwogCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OworCisJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJZ290byBvdXQ7CisKIAlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfCAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkKIAkJCQkgPyAweDgwIDogMCkpOwogCkBAIC02NDUsMTIgKzY1OSwyMCBAQAogCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCiAJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAogCSAqLwotI2lmZGVmIERFQlVHX1BUUkFDRQotCXByaW50aygiJXMgWyVkXTogc3lzY2FsbF90cmFjZSBleGl0PSAleFxuIiwgY3VycmVudC0+Y29tbSwKLQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5leGl0X2NvZGUpOwotI2VuZGlmCiAJaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgewotCQlzZW5kX3NpZyAoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKIAkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKIAl9CisKK291dDoKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkgJiYgIXN5c2NhbGxfZXhpdF9wKQorCQlhdWRpdF9zeXNjYWxsX2VudHJ5KGN1cnJlbnQsCisJCQkJICAgICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgPworCQkJCSAgICAgQVVESVRfQVJDSF9TUEFSQyA6CisJCQkJICAgICBBVURJVF9BUkNIX1NQQVJDNjQpLAorCQkJCSAgICByZWdzLT51X3JlZ3NbVVJFR19HMV0sCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSwKKwkJCQkgICAgcmVncy0+dV9yZWdzW1VSRUdfSTFdLAorCQkJCSAgICByZWdzLT51X3JlZ3NbVVJFR19JMl0sCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0kzXSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NlbWFwaG9yZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZW1hcGhvcmUuYwppbmRleCA2MzQ5NmM0Li5hODA5ZTYzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NlbWFwaG9yZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTMyLDggKzMyLDkgQEAKICIJYWRkCSUxLCAlNCwgJTFcbiIKICIJY2FzCVslM10sICUwLCAlMVxuIgogIgljbXAJJTAsICUxXG4iCisiCW1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJYm5lLHBuCSUlaWNjLCAxYlxuIgotIgkgbWVtYmFyICNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgorIgkgbm9wXG4iCiAJOiAiPSZyIiAob2xkX2NvdW50KSwgIj0mciIgKHRtcCksICI9bSIgKHNlbS0+Y291bnQpCiAJOiAiciIgKCZzZW0tPmNvdW50KSwgInIiIChpbmNyKSwgIm0iIChzZW0tPmNvdW50KQogCTogImNjIik7CkBAIC03MSw4ICs3Miw5IEBACiAiCWNtcAklJWcxLCAlJWc3XG4iCiAiCWJuZSxwbgklJWljYywgMWJcbiIKICIJIGFkZGNjCSUlZzcsIDEsICUlZzBcbiIKKyIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibGUscG4JJSVpY2MsIDNmXG4iCi0iCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKICIyOlxuIgogIgkuc3Vic2VjdGlvbiAyXG4iCiAiMzoJbW92CSUwLCAlJWcxXG4iCkBAIC0xMjgsOCArMTMwLDkgQEAKICIJY21wCSUlZzEsICUlZzdcbiIKICIJYm5lLHBuCSUlaWNjLCAxYlxuIgogIgkgY21wCSUlZzcsIDFcbiIKKyIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibCxwbgklJWljYywgM2ZcbiIKLSIJIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIjI6XG4iCiAiCS5zdWJzZWN0aW9uIDJcbiIKICIzOgltb3YJJTAsICUlZzFcbiIKQEAgLTIzMyw4ICsyMzYsOSBAQAogIgljbXAJJSVnMSwgJSVnN1xuIgogIglibmUscG4JJSVpY2MsIDFiXG4iCiAiCSBjbXAJJSVnNywgMVxuIgorIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJsLHBuCSUlaWNjLCAzZlxuIgotIgkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgorIgkgbm9wXG4iCiAiMjpcbiIKICIJLnN1YnNlY3Rpb24gMlxuIgogIjM6CW1vdgklMiwgJSVnMVxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKaW5kZXggZTViOWM3YS4uYjliNDI0OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCkBAIC00NSw4ICs0NSw4IEBACiAvKiBQbGVhc2UgZG9uJ3QgbWFrZSB0aGlzIHN0dWZmIGluaXRkYXRhISEhICAtLURhdmVNICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciBib290X2NwdV9pZDsKIAotY3B1bWFza190IGNwdV9vbmxpbmVfbWFwID0gQ1BVX01BU0tfTk9ORTsKLWNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcCA9IENQVV9NQVNLX05PTkU7CitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgX19yZWFkX21vc3RseSA9IENQVV9NQVNLX05PTkU7CitjcHVtYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXAgX19yZWFkX21vc3RseSA9IENQVV9NQVNLX05PTkU7CiBzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzazsKIHN0YXRpYyBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOwogCkBAIC0xMzcsNyArMTM3LDcgQEAKIAkvKiBDbGVhciB0aGlzIG9yIHdlIHdpbGwgZGllIGluc3RhbnRseSB3aGVuIHdlCiAJICogc2NoZWR1bGUgYmFjayB0byB0aGlzIGlkbGVyLi4uCiAJICovCi0JY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FV0NISUxEKTsKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPm5ld19jaGlsZCA9IDA7CiAKIAkvKiBBdHRhY2ggdG8gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgaW5pdF90YXNrLiAqLwogCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJcGFuaWMoIlNNUCBib2xpeGVkXG4iKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aWNrX29mZnNldDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGlja19vZmZzZXQgX19yZWFkX21vc3RseTsKIAogLyogVGhpcyB0aWNrIHJlZ2lzdGVyIHN5bmNocm9uaXphdGlvbiBzY2hlbWUgaXMgdGFrZW4gZW50aXJlbHkgZnJvbQogICogdGhlIGlhNjQgcG9ydCwgc2VlIGFyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGZvciBkZXRhaWxzIGFuZCBjcmVkaXQuCkBAIC0xMTkzLDggKzExOTMsOCBAQAogewogfQogCi11bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9iYXNlOwotdW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfc2hpZnQ7Cit1bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9iYXNlIF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9zaGlmdCBfX3JlYWRfbW9zdGx5OwogCiBFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9iYXNlKTsKIEVYUE9SVF9TWU1CT0woX19wZXJfY3B1X3NoaWZ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggZTc4Y2M1My4uOTIwMmQ5MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTc5LDcgKzc5LDcgQEAKIGV4dGVybiB2b2lkIHJ0cmFwKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgc29sYXJpc19zeXNjYWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKTsKK2V4dGVybiB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiwgaW50KTsKIGV4dGVybiB1MzIgc3Vub3Nfc3lzX3RhYmxlW10sIHN5c19jYWxsX3RhYmxlMzJbXTsKIGV4dGVybiB2b2lkIHRsMF9zb2xhcmlzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3lzX3NpZ3N1c3BlbmQodm9pZCk7CkBAIC0yMjcsNyArMjI3LDYgQEAKIAogRVhQT1JUX1NZTUJPTChtb3N0ZWtfbG9jayk7CiBFWFBPUlRfU1lNQk9MKG1zdGs0OHQwMl9yZWdzKTsKLUVYUE9SVF9TWU1CT0wocmVxdWVzdF9mYXN0X2lycSk7CiAjaWZkZWYgQ09ORklHX1NVTl9BVVhJTwogRVhQT1JUX1NZTUJPTChhdXhpb19zZXRfbGVkKTsKIEVYUE9SVF9TWU1CT0woYXV4aW9fc2V0X2x0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMKaW5kZXggNWE5NWU5OC4uNWY5ZTRmYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXMzMi5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzMzIuUwpAQCAtMTM1LDYgKzEzNSw4IEBACiBTSUdOMyhzeXMzMl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpciwgJW8wLCAlbzEsICVvMikKIFNJR04xKHN5czMyX2dldHBlZXJuYW1lLCBzeXNfZ2V0cGVlcm5hbWUsICVvMCkKIFNJR04xKHN5czMyX2dldHNvY2tuYW1lLCBzeXNfZ2V0c29ja25hbWUsICVvMCkKK1NJR04yKHN5czMyX2lvcHJpb19nZXQsIHN5c19pb3ByaW9fZ2V0LCAlbzAsICVvMSkKK1NJR04zKHN5czMyX2lvcHJpb19zZXQsIHN5c19pb3ByaW9fc2V0LCAlbzAsICVvMSwgJW8yKQogCiAJLmdsb2JsCQlzeXMzMl9tbWFwMgogc3lzMzJfbW1hcDI6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCmluZGV4IGE1ZTM2YTQuLmJjZWI5MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCkBAIC01OSwxMSArNTksMTEgQEAKIC8qMTgwKi8JLndvcmQgc3lzMzJfZmxpc3R4YXR0ciwgc3lzX3JlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyLCBjb21wYXRfc3lzX3NpZ3BlbmRpbmcsIHN5c19uaV9zeXNjYWxsCiAJLndvcmQgc3lzMzJfc2V0cGdpZCwgc3lzMzJfZnJlbW92ZXhhdHRyLCBzeXMzMl90a2lsbCwgc3lzMzJfZXhpdF9ncm91cCwgc3BhcmM2NF9uZXd1bmFtZQogLyoxOTAqLwkud29yZCBzeXMzMl9pbml0X21vZHVsZSwgc3BhcmM2NF9wZXJzb25hbGl0eSwgc3lzX3JlbWFwX2ZpbGVfcGFnZXMsIHN5czMyX2Vwb2xsX2NyZWF0ZSwgc3lzMzJfZXBvbGxfY3RsCi0JLndvcmQgc3lzMzJfZXBvbGxfd2FpdCwgc3lzX25pc19zeXNjYWxsLCBzeXNfZ2V0cHBpZCwgc3lzMzJfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKKwkud29yZCBzeXMzMl9lcG9sbF93YWl0LCBzeXMzMl9pb3ByaW9fc2V0LCBzeXNfZ2V0cHBpZCwgc3lzMzJfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKIC8qMjAwKi8JLndvcmQgc3lzMzJfc3NldG1hc2ssIHN5c19zaWdzdXNwZW5kLCBjb21wYXRfc3lzX25ld2xzdGF0LCBzeXNfdXNlbGliLCBjb21wYXRfc3lzX29sZF9yZWFkZGlyCiAJLndvcmQgc3lzMzJfcmVhZGFoZWFkLCBzeXMzMl9zb2NrZXRjYWxsLCBzeXMzMl9zeXNsb2csIHN5czMyX2xvb2t1cF9kY29va2llLCBzeXMzMl9mYWR2aXNlNjQKIC8qMjEwKi8JLndvcmQgc3lzMzJfZmFkdmlzZTY0XzY0LCBzeXMzMl90Z2tpbGwsIHN5czMyX3dhaXRwaWQsIHN5c19zd2Fwb2ZmLCBzeXMzMl9zeXNpbmZvCi0JLndvcmQgc3lzMzJfaXBjLCBzeXMzMl9zaWdyZXR1cm4sIHN5c19jbG9uZSwgc3lzX25pc19zeXNjYWxsLCBzeXMzMl9hZGp0aW1leAorCS53b3JkIHN5czMyX2lwYywgc3lzMzJfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5czMyX2lvcHJpb19nZXQsIHN5czMyX2FkanRpbWV4CiAvKjIyMCovCS53b3JkIHN5czMyX3NpZ3Byb2NtYXNrLCBzeXNfbmlfc3lzY2FsbCwgc3lzMzJfZGVsZXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwsIHN5czMyX2dldHBnaWQKIAkud29yZCBzeXMzMl9iZGZsdXNoLCBzeXMzMl9zeXNmcywgc3lzX25pc19zeXNjYWxsLCBzeXMzMl9zZXRmc3VpZDE2LCBzeXMzMl9zZXRmc2dpZDE2CiAvKjIzMCovCS53b3JkIHN5czMyX3NlbGVjdCwgY29tcGF0X3N5c190aW1lLCBzeXNfbmlzX3N5c2NhbGwsIGNvbXBhdF9zeXNfc3RpbWUsIGNvbXBhdF9zeXNfc3RhdGZzNjQKQEAgLTEyNSwxMSArMTI1LDExIEBACiAvKjE4MCovCS53b3JkIHN5c19mbGlzdHhhdHRyLCBzeXNfcmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIsIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pX3N5c2NhbGwKIAkud29yZCBzeXNfc2V0cGdpZCwgc3lzX2ZyZW1vdmV4YXR0ciwgc3lzX3RraWxsLCBzeXNfZXhpdF9ncm91cCwgc3BhcmM2NF9uZXd1bmFtZQogLyoxOTAqLwkud29yZCBzeXNfaW5pdF9tb2R1bGUsIHNwYXJjNjRfcGVyc29uYWxpdHksIHN5c19yZW1hcF9maWxlX3BhZ2VzLCBzeXNfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3RsCi0JLndvcmQgc3lzX2Vwb2xsX3dhaXQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2dldHBwaWQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NnZXRtYXNrCisJLndvcmQgc3lzX2Vwb2xsX3dhaXQsIHN5c19pb3ByaW9fc2V0LCBzeXNfZ2V0cHBpZCwgc3lzX25pc19zeXNjYWxsLCBzeXNfc2dldG1hc2sKIC8qMjAwKi8JLndvcmQgc3lzX3NzZXRtYXNrLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uZXdsc3RhdCwgc3lzX3VzZWxpYiwgc3lzX25pc19zeXNjYWxsCiAJLndvcmQgc3lzX3JlYWRhaGVhZCwgc3lzX3NvY2tldGNhbGwsIHN5c19zeXNsb2csIHN5c19sb29rdXBfZGNvb2tpZSwgc3lzX2ZhZHZpc2U2NAogLyoyMTAqLwkud29yZCBzeXNfZmFkdmlzZTY0XzY0LCBzeXNfdGdraWxsLCBzeXNfd2FpdHBpZCwgc3lzX3N3YXBvZmYsIHN5c19zeXNpbmZvCi0JLndvcmQgc3lzX2lwYywgc3lzX25pc19zeXNjYWxsLCBzeXNfY2xvbmUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FkanRpbWV4CisJLndvcmQgc3lzX2lwYywgc3lzX25pc19zeXNjYWxsLCBzeXNfY2xvbmUsIHN5c19pb3ByaW9fZ2V0LCBzeXNfYWRqdGltZXgKIC8qMjIwKi8JLndvcmQgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlfc3lzY2FsbCwgc3lzX2RlbGV0ZV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsLCBzeXNfZ2V0cGdpZAogCS53b3JkIHN5c19iZGZsdXNoLCBzeXNfc3lzZnMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NldGZzdWlkLCBzeXNfc2V0ZnNnaWQKIC8qMjMwKi8JLndvcmQgc3lzX3NlbGVjdCwgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zdGltZSwgc3lzX3N0YXRmczY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IDcxYjRlMzguLjM2MmI5YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC03Myw3ICs3Myw3IEBACiAJLmdldF90aWNrCT0gZHVtbXlfZ2V0X3RpY2ssCiB9OwogCi1zdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyAqdGlja19vcHMgPSAmZHVtbXlfdGlja19vcHM7CitzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyAqdGlja19vcHMgX19yZWFkX21vc3RseSA9ICZkdW1teV90aWNrX29wczsKIAogI2RlZmluZSBUSUNLX1BSSVZfQklUCSgxVUwgPDwgNjMpCiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBuZXdfdGljazsKIH0KIAotc3RhdGljIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHRpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyB0aWNrX29wZXJhdGlvbnMgX19yZWFkX21vc3RseSA9IHsKIAkuaW5pdF90aWNrCT0JdGlja19pbml0X3RpY2ssCiAJLmdldF90aWNrCT0JdGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQl0aWNrX2dldF9jb21wYXJlLApAQCAtMjc2LDcgKzI3Niw3IEBACiAJcmV0dXJuIG5ld19jb21wYXJlOwogfQogCi1zdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgc3RpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBzdGlja19vcGVyYXRpb25zIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmluaXRfdGljawk9CXN0aWNrX2luaXRfdGljaywKIAkuZ2V0X3RpY2sJPQlzdGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQlzdGlja19nZXRfY29tcGFyZSwKQEAgLTQyMiw3ICs0MjIsNyBAQAogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBoYnRpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBoYnRpY2tfb3BlcmF0aW9ucyBfX3JlYWRfbW9zdGx5ID0gewogCS5pbml0X3RpY2sJPQloYnRpY2tfaW5pdF90aWNrLAogCS5nZXRfdGljawk9CWhidGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQloYnRpY2tfZ2V0X2NvbXBhcmUsCkBAIC00MzcsMTAgKzQzNyw5IEBACiAgKiBOT1RFOiBPbiBTVU41IHN5c3RlbXMgdGhlIHRpY2tlciBpbnRlcnJ1cHQgY29tZXMgaW4gdXNpbmcgMgogICogICAgICAgaW50ZXJydXB0cywgb25lIGF0IGxldmVsMTQgYW5kIG9uZSB3aXRoIHNvZnRpbnQgYml0IDAuCiAgKi8KLXVuc2lnbmVkIGxvbmcgdGltZXJfdGlja19vZmZzZXQ7Ci11bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tfY29tcGFyZTsKK3Vuc2lnbmVkIGxvbmcgdGltZXJfdGlja19vZmZzZXQgX19yZWFkX21vc3RseTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfdGlja3NfcGVyX25zZWNfcXVvdGllbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrc19wZXJfbnNlY19xdW90aWVudCBfX3JlYWRfbW9zdGx5OwogCiAjZGVmaW5lIFRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKIApAQCAtNDY0LDcgKzQ2Myw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aWNrcywgcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgdGlja3MsIGNvbXBhcmUsIHBzdGF0ZTsKIAogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCkBAIC00ODMsMTQgKzQ4MiwxNCBAQAogCQkJCSAgICAgOiAiPXIiIChwc3RhdGUpCiAJCQkJICAgICA6ICJpIiAoUFNUQVRFX0lFKSk7CiAKLQkJdGltZXJfdGlja19jb21wYXJlID0gdGlja19vcHMtPmFkZF9jb21wYXJlKHRpbWVyX3RpY2tfb2Zmc2V0KTsKKwkJY29tcGFyZSA9IHRpY2tfb3BzLT5hZGRfY29tcGFyZSh0aW1lcl90aWNrX29mZnNldCk7CiAJCXRpY2tzID0gdGlja19vcHMtPmdldF90aWNrKCk7CiAKIAkJLyogUmVzdG9yZSBQU1RBVEVfSUUuICovCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUwLCAweDAsICUlcHN0YXRlIgogCQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCiAJCQkJICAgICA6ICJyIiAocHN0YXRlKSk7Ci0JfSB3aGlsZSAodGltZV9hZnRlcl9lcSh0aWNrcywgdGltZXJfdGlja19jb21wYXJlKSk7CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcSh0aWNrcywgY29tcGFyZSkpOwogCiAJdGltZXJfY2hlY2tfcnRjKCk7CiAKQEAgLTUwNiwxMSArNTA1LDYgQEAKIAogCWRvX3RpbWVyKHJlZ3MpOwogCi0JLyoKLQkgKiBPbmx5IGtlZXAgdGltZXJfdGlja19vZmZzZXQgdXB0b2RhdGUsIGJ1dCBkb24ndCBzZXQgVElDS19DTVBSLgotCSAqLwotCXRpbWVyX3RpY2tfY29tcGFyZSA9IHRpY2tfb3BzLT5nZXRfY29tcGFyZSgpICsgdGltZXJfdGlja19vZmZzZXQ7Ci0KIAl0aW1lcl9jaGVja19ydGMoKTsKIAogCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CkBAIC05NzMsNyArOTY3LDcgQEAKIAlpbnQgZXJyOwogCiAJLyogUmVnaXN0ZXIgSVJRIGhhbmRsZXIuICovCi0JZXJyID0gcmVxdWVzdF9pcnEoYnVpbGRfaXJxKDAsIDAsIDBVTCwgMFVMKSwgY2Z1bmMsIFNBX1NUQVRJQ19BTExPQywKKwllcnIgPSByZXF1ZXN0X2lycShidWlsZF9pcnEoMCwgMCwgMFVMLCAwVUwpLCBjZnVuYywgMCwKIAkJCSAgInRpbWVyIiwgTlVMTCk7CiAKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhbXBvbGluZS5TCmluZGV4IDJjOGY5MzQuLjNhMTQ1ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhbXBvbGluZS5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhbXBvbGluZS5TCkBAIC05OCw4ICs5OCw5IEBACiAKIAlzZXRoaQkJJWhpKHByb21fZW50cnlfbG9jayksICVnMgogMToJbGRzdHViCQlbJWcyICsgJWxvKHByb21fZW50cnlfbG9jayldLCAlZzEKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJybnoscG4JCSVnMSwgMWIKLQkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKKwkgbm9wCiAKIAlzZXRoaQkJJWhpKHAxMjc1YnVmKSwgJWcyCiAJb3IJCSVnMiwgJWxvKHAxMjc1YnVmKSwgJWcyCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggYTlmNDU5Ni4uMTAwYjAxMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjEyNSw2ICsyMTI1LDggQEAKIAkgICAgVElfUENSICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgcGNyX3JlZykgfHwKIAkgICAgVElfQ0VFX1NUVUZGICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgY2VlX3N0dWZmKSB8fAogCSAgICBUSV9QUkVfQ09VTlQgIT0gb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBwcmVlbXB0X2NvdW50KSB8fAorCSAgICBUSV9ORVdfQ0hJTEQgIT0gb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBuZXdfY2hpbGQpIHx8CisJICAgIFRJX1NZU19OT0VSUk9SICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgc3lzY2FsbF9ub2Vycm9yKSB8fAogCSAgICBUSV9GUFJFR1MgIT0gb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBmcHJlZ3MpIHx8CiAJICAgIChUSV9GUFJFR1MgJiAoNjQgLSAxKSkpCiAJCXRocmVhZF9pbmZvX29mZnNldHNfYXJlX2JvbGl4ZWRfZGF2ZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDM4MmZkNjcuLjk1MDQyM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMyLDYgKzMyLDggQEAKICAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9CiAgIC4gPSBBTElHTig2NCk7CiAgIC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkIDogeyAqKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSB9CisgIC4gPSBBTElHTig2NCk7CisgIC5kYXRhLnJlYWRfbW9zdGx5IDogeyAqKC5kYXRhLnJlYWRfbW9zdGx5KSB9CiAgIF9lZGF0YSAgPSAgLjsKICAgUFJPVklERSAoZWRhdGEgPSAuKTsKICAgLmZpeHVwICAgOiB7ICooLmZpeHVwKSB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMgYi9hcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMKaW5kZXggZGE5YjUyMC4uYmFmZDJmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9VMW1lbWNweS5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvVTFtZW1jcHkuUwpAQCAtODcsMTQgKzg3LDE3IEBACiAjZGVmaW5lIExPT1BfQ0hVTkszKHNyYywgZGVzdCwgbGVuLCBicmFuY2hfZGVzdCkJCVwKIAlNQUlOX0xPT1BfQ0hVTksoc3JjLCBkZXN0LCBmMzIsIGY0OCwgbGVuLCBicmFuY2hfZGVzdCkKIAorI2RlZmluZSBET19TWU5DCQkJbWVtYmFyCSNTeW5jOwogI2RlZmluZSBTVE9SRV9TWU5DKGRlc3QsIGZzcmMpCQkJCVwKIAlFWF9TVChTVE9SRV9CTEsoJWZzcmMsICVkZXN0KSk7CQkJXAotCWFkZAkJCSVkZXN0LCAweDQwLCAlZGVzdDsKKwlhZGQJCQklZGVzdCwgMHg0MCwgJWRlc3Q7CVwKKwlET19TWU5DCiAKICNkZWZpbmUgU1RPUkVfSlVNUChkZXN0LCBmc3JjLCB0YXJnZXQpCQkJXAogCUVYX1NUKFNUT1JFX0JMSyglZnNyYywgJWRlc3QpKTsJCQlcCiAJYWRkCQkJJWRlc3QsIDB4NDAsICVkZXN0OwlcCi0JYmEscHQJCQkleGNjLCB0YXJnZXQ7CisJYmEscHQJCQkleGNjLCB0YXJnZXQ7CQlcCisJIG5vcDsKIAogI2RlZmluZSBGSU5JU0hfVklTQ0hVTksoZGVzdCwgZjAsIGYxLCBsZWZ0KQlcCiAJc3ViY2MJCQklbGVmdCwgOCwgJWxlZnQ7XApAQCAtMjM5LDE3ICsyNDIsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjQ4CiAxOglGUkVHX0ZST0IoZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzMixmMzQsZjM2LGYzOCxmNDAsZjQyLGY0NCxmNDYsZjApCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MGYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDBmKQogMjoJRlJFR19GUk9CKGYzMixmMzQsZjM2LGYzOCxmNDAsZjQyLGY0NCxmNDYsZjApCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDhmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ4ZikKIDM6CUZSRUdfRlJPQihmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1NmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTZmKQogCiAxOglGUkVHX0ZST0IoZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMjYwLDE3ICsyNjMsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMiwgJWY0LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjE4LGYyMCxmMjIsZjI0LGYyNixmMjgsZjMwLGYzMixmMzQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NixmMCwgZjIpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MWYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDFmKQogMjoJRlJFR19GUk9CKGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NixmMCwgZjIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYyLCBmNCwgZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDlmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ5ZikKIDM6CUZSRUdfRlJPQihmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjE4LGYyMCxmMjIsZjI0LGYyNixmMjgsZjMwLGYzMixmMzQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1N2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTdmKQogCiAxOglGUkVHX0ZST0IoZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjApCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMjgxLDE3ICsyODQsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmNCwgJWY2LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjIwLGYyMixmMjQsZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDJmKQogMjoJRlJFR19GUk9CKGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTBmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDUwZikKIDM6CUZSRUdfRlJPQihmNCwgZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4LGYyMCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjIwLGYyMixmMjQsZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1OGYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNThmKQogCiAxOglGUkVHX0ZST0IoZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4LGYyMCxmMjIpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzAyLDE3ICszMDUsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmNiwgJWY4LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzOCxmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0M2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDNmKQogMjoJRlJFR19GUk9CKGYzOCxmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTFmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDUxZikKIDM6CUZSRUdfRlJPQihmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1OWYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTlmKQogCiAxOglGUkVHX0ZST0IoZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzIzLDE3ICszMjYsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmOCwgJWYxMCwgJWY0OAogMToJRlJFR19GUk9CKGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwKQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYsIGY4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDRmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ0ZikKIDI6CUZSRUdfRlJPQihmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYsIGY4KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCkKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDUyZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA1MmYpCiAzOglGUkVHX0ZST0IoZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNjBmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDYwZikKIAogMToJRlJFR19GUk9CKGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2KQogCUxPT1BfQ0hVTksxKG8xLCBvMCwgR0xPQkFMX1NQQVJFLCAxZikKQEAgLTM0NCwxNyArMzQ3LDE3IEBACiAJYmEscHQJCSV4Y2MsIDFiKzQKIAkgZmFsaWduZGF0YQklZjEwLCAlZjEyLCAlZjQ4CiAxOglGUkVHX0ZST0IoZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDVmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ1ZikKIDI6CUZSRUdfRlJPQihmNDIsZjQ0LGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1M2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTNmKQogMzoJRlJFR19GUk9CKGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MikKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDYxZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA2MWYpCiAKIDE6CUZSRUdfRlJPQihmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCkKIAlMT09QX0NIVU5LMShvMSwgbzAsIEdMT0JBTF9TUEFSRSwgMWYpCkBAIC0zNjUsMTcgKzM2OCwxNyBAQAogCWJhLHB0CQkleGNjLCAxYis0CiAJIGZhbGlnbmRhdGEJJWYxMiwgJWYxNCwgJWY0OAogMToJRlJFR19GUk9CKGYyOCxmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmNDQsZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMikKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ2ZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA0NmYpCiAyOglGUkVHX0ZST0IoZjQ0LGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTRmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDU0ZikKIDM6CUZSRUdfRlJPQihmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MixmNDQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA2MmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNjJmKQogCiAxOglGUkVHX0ZST0IoZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCxmMzApCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzg2LDE3ICszODksMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMTQsICVmMTYsICVmNDgKIDE6CUZSRUdfRlJPQihmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0N2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDdmKQogMjoJRlJFR19GUk9CKGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCkKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDU1ZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA1NWYpCiAzOglGUkVHX0ZST0IoZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCxmMzApCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNjNmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDYzZikKIAogNDA6CUZJTklTSF9WSVNDSFVOSyhvMCwgZjAsICBmMiwgIGczKQogNDE6CUZJTklTSF9WSVNDSFVOSyhvMCwgZjIsICBmNCwgIGczKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9WSVNzYXZlLlMgYi9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUwppbmRleCA2NWUzMjhkLi40ZTE4OTg5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUworKysgYi9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUwpAQCAtNzIsNyArNzIsMTEgQEAKIAogCXN0ZGEJCSVmNDgsIFslZzMgKyAlZzFdIEFTSV9CTEtfUAogNToJbWVtYmFyCQkjU3luYwotCWptcGwJCSVnNyArICVnMCwgJWcwCisJYmEscHQJCSV4Y2MsIDgwZgorCSBub3AKKworCS5hbGlnbgkJMzIKKzgwOglqbXBsCQklZzcgKyAlZzAsICVnMAogCSBub3AKIAogNjoJbGR1YgkJWyVnMyArIFRJX0ZQU0FWRURdLCAlbzUKQEAgLTg3LDggKzkxLDExIEBACiAJc3RkYQkJJWYzMiwgWyVnMiArICVnMV0gQVNJX0JMS19QCiAJc3RkYQkJJWY0OCwgWyVnMyArICVnMV0gQVNJX0JMS19QCiAJbWVtYmFyCQkjU3luYwotCWptcGwJCSVnNyArICVnMCwgJWcwCisJYmEscHQJCSV4Y2MsIDgwZgorCSBub3AKIAorCS5hbGlnbgkJMzIKKzgwOglqbXBsCQklZzcgKyAlZzAsICVnMAogCSBub3AKIAogCS5hbGlnbgkJMzIKQEAgLTEyNiw2ICsxMzMsMTAgQEAKIAlzdGRhCQklZjAsIFslZzIgKyAlZzFdIEFTSV9CTEtfUAogCXN0ZGEJCSVmMTYsIFslZzMgKyAlZzFdIEFTSV9CTEtfUAogCW1lbWJhcgkJI1N5bmMKKwliYSxwdAkJJXhjYywgNGYKKwkgbm9wCisKKwkuYWxpZ24JCTMyCiA0OglhbmQJCSVvNSwgRlBSU19EVSwgJW81CiAJam1wbAkJJWc3ICsgJWcwLCAlZzAKIAkgd3IJCSVvNSwgRlBSU19GRUYsICVmcHJzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TIGIvYXJjaC9zcGFyYzY0L2xpYi9hdG9taWMuUwppbmRleCBlNTI4YjhkLi5mYWY4N2MzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvYXRvbWljLlMKQEAgLTcsMTggKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KIAotCS8qIE9uIFNNUCB3ZSBuZWVkIHRvIHVzZSBtZW1vcnkgYmFycmllcnMgdG8gZW5zdXJlCi0JICogY29ycmVjdCBtZW1vcnkgb3BlcmF0aW9uIG9yZGVyaW5nLCBub3AgdGhlc2Ugb3V0Ci0JICogZm9yIHVuaXByb2Nlc3Nvci4KLQkgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZAotI2RlZmluZSBBVE9NSUNfUE9TVF9CQVJSSUVSCW1lbWJhciAjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKLSNlbHNlCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUglub3AKLSNkZWZpbmUgQVRPTUlDX1BPU1RfQkFSUklFUglub3AKLSNlbmRpZgotCiAJLnRleHQKIAogCS8qIFR3byB2ZXJzaW9ucyBvZiB0aGUgYXRvbWljIHJvdXRpbmVzLCBvbmUgdGhhdApAQCAtNTIsNiArNDAsMjQgQEAKIAkgbm9wCiAJLnNpemUJYXRvbWljX3N1YiwgLi1hdG9taWNfc3ViCiAKKwkvKiBPbiBTTVAgd2UgbmVlZCB0byB1c2UgbWVtb3J5IGJhcnJpZXJzIHRvIGVuc3VyZQorCSAqIGNvcnJlY3QgbWVtb3J5IG9wZXJhdGlvbiBvcmRlcmluZywgbm9wIHRoZXNlIG91dAorCSAqIGZvciB1bmlwcm9jZXNzb3IuCisJICovCisjaWZkZWYgQ09ORklHX1NNUAorCisjZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZDsKKyNkZWZpbmUgQVRPTUlDX1BPU1RfQkFSUklFUglcCisJYmEscHQgJXhjYywgODBiOwlcCisJbWVtYmFyICNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCis4MDoJcmV0bAorCSBub3AKKyNlbHNlCisjZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgorI2RlZmluZSBBVE9NSUNfUE9TVF9CQVJSSUVSCisjZW5kaWYKKwogCS5nbG9ibAlhdG9taWNfYWRkX3JldAogCS50eXBlCWF0b21pY19hZGRfcmV0LCNmdW5jdGlvbgogYXRvbWljX2FkZF9yZXQ6IC8qICVvMCA9IGluY3JlbWVudCwgJW8xID0gYXRvbWljX3B0ciAqLwpAQCAtNjIsOSArNjgsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJWljYywgMWIKIAkgYWRkCSVnNywgJW8wLCAlZzcKKwlzcmEJJWc3LCAwLCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBzcmEJJWc3LCAwLCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljX2FkZF9yZXQsIC4tYXRvbWljX2FkZF9yZXQKIAogCS5nbG9ibAlhdG9taWNfc3ViX3JldApAQCAtNzcsOSArODQsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJWljYywgMWIKIAkgc3ViCSVnNywgJW8wLCAlZzcKKwlzcmEJJWc3LCAwLCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBzcmEJJWc3LCAwLCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljX3N1Yl9yZXQsIC4tYXRvbWljX3N1Yl9yZXQKIAogCS5nbG9ibAlhdG9taWM2NF9hZGQKQEAgLTExOCw5ICsxMjYsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJXhjYywgMWIKIAkgYWRkCSVnNywgJW8wLCAlZzcKKwltb3YJJWc3LCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBtb3YJJWc3LCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljNjRfYWRkX3JldCwgLi1hdG9taWM2NF9hZGRfcmV0CiAKIAkuZ2xvYmwJYXRvbWljNjRfc3ViX3JldApAQCAtMTMzLDcgKzE0Miw4IEBACiAJY21wCSVnMSwgJWc3CiAJYm5lLHBuCSV4Y2MsIDFiCiAJIHN1YgklZzcsICVvMCwgJWc3CisJbW92CSVnNywgJW8wCiAJQVRPTUlDX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92CSVnNywgJW8wCisJIG5vcAogCS5zaXplCWF0b21pYzY0X3N1Yl9yZXQsIC4tYXRvbWljNjRfc3ViX3JldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9iaXRvcHMuUyBiL2FyY2gvc3BhcmM2NC9saWIvYml0b3BzLlMKaW5kZXggODg2ZGNkMi4uMzFhZmJmZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9iaXRvcHMuUworKysgYi9hcmNoL3NwYXJjNjQvbGliL2JpdG9wcy5TCkBAIC03LDE5ICs3LDI1IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogCisJLnRleHQKKwogCS8qIE9uIFNNUCB3ZSBuZWVkIHRvIHVzZSBtZW1vcnkgYmFycmllcnMgdG8gZW5zdXJlCiAJICogY29ycmVjdCBtZW1vcnkgb3BlcmF0aW9uIG9yZGVyaW5nLCBub3AgdGhlc2Ugb3V0CiAJICogZm9yIHVuaXByb2Nlc3Nvci4KIAkgKi8KKwogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgQklUT1BfUFJFX0JBUlJJRVIJbWVtYmFyICNTdG9yZUxvYWQgfCAjTG9hZExvYWQKLSNkZWZpbmUgQklUT1BfUE9TVF9CQVJSSUVSCW1lbWJhciAjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKLSNlbHNlCi0jZGVmaW5lIEJJVE9QX1BSRV9CQVJSSUVSCW5vcAotI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIJbm9wCi0jZW5kaWYKKyNkZWZpbmUgQklUT1BfUE9TVF9CQVJSSUVSCVwKKwliYSxwdAkleGNjLCA4MGI7CVwKKwltZW1iYXIgI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAKLQkudGV4dAorODA6CXJldGwKKwkgbm9wCisjZWxzZQorI2RlZmluZSBCSVRPUF9QUkVfQkFSUklFUgorI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIKKyNlbmRpZgogCiAJLmdsb2JsCXRlc3RfYW5kX3NldF9iaXQKIAkudHlwZQl0ZXN0X2FuZF9zZXRfYml0LCNmdW5jdGlvbgpAQCAtMzcsMTAgKzQzLDExIEBACiAJY21wCSVnNywgJWcxCiAJYm5lLHBuCSV4Y2MsIDFiCiAJIGFuZAklZzcsICVvMiwgJWcyCi0JQklUT1BfUE9TVF9CQVJSSUVSCiAJY2xyCSVvMAorCW1vdnJuZQklZzIsIDEsICVvMAorCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92cm5lCSVnMiwgMSwgJW8wCisJIG5vcAogCS5zaXplCXRlc3RfYW5kX3NldF9iaXQsIC4tdGVzdF9hbmRfc2V0X2JpdAogCiAJLmdsb2JsCXRlc3RfYW5kX2NsZWFyX2JpdApAQCAtNTksMTAgKzY2LDExIEBACiAJY21wCSVnNywgJWcxCiAJYm5lLHBuCSV4Y2MsIDFiCiAJIGFuZAklZzcsICVvMiwgJWcyCi0JQklUT1BfUE9TVF9CQVJSSUVSCiAJY2xyCSVvMAorCW1vdnJuZQklZzIsIDEsICVvMAorCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92cm5lCSVnMiwgMSwgJW8wCisJIG5vcAogCS5zaXplCXRlc3RfYW5kX2NsZWFyX2JpdCwgLi10ZXN0X2FuZF9jbGVhcl9iaXQKIAogCS5nbG9ibAl0ZXN0X2FuZF9jaGFuZ2VfYml0CkBAIC04MSwxMCArODksMTEgQEAKIAljbXAJJWc3LCAlZzEKIAlibmUscG4JJXhjYywgMWIKIAkgYW5kCSVnNywgJW8yLCAlZzIKLQlCSVRPUF9QT1NUX0JBUlJJRVIKIAljbHIJJW8wCisJbW92cm5lCSVnMiwgMSwgJW8wCisJQklUT1BfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBtb3ZybmUJJWcyLCAxLCAlbzAKKwkgbm9wCiAJLnNpemUJdGVzdF9hbmRfY2hhbmdlX2JpdCwgLi10ZXN0X2FuZF9jaGFuZ2VfYml0CiAKIAkuZ2xvYmwJc2V0X2JpdApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwppbmRleCBjNDIxZTBjLi5mMDMzNDRjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYworKysgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwpAQCAtMjUyLDggKzI1Miw5IEBACiAiCQlhbmRuCSUlZzEsICUlZzMsICUlZzdcbiIKICIJCWNhc3gJWyUwXSwgJSVnMSwgJSVnN1xuIgogIgkJY21wCSUlZzEsICUlZzdcbiIKKyIJCW1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJCWJuZSxwbgklJXhjYywgMWJcbiIKLSIJCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgorIgkJIG5vcCIKIAkJOiAvKiBubyBvdXRwdXRzICovCiAJCTogInIiICgmKHJ3LT5sb2NrKSkKIAkJOiAiZzMiLCAiZzEiLCAiZzciLCAiY2MiLCAibWVtb3J5Iik7CkBAIC0zNTEsOCArMzUyLDkgQEAKICIJCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgogIgkJY2FzeAlbJTBdLCAlJWcxLCAlJWc3XG4iCiAiCQljbXAJJSVnMSwgJSVnN1xuIgorIgkJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIgkJYm5lLHBuCSUleGNjLCAxYlxuIgotIgkJIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUiCisiCQkgbm9wIgogCQk6IC8qIG5vIG91dHB1dHMgKi8KIAkJOiAiciIgKCYocnctPmxvY2spKQogCQk6ICJnMyIsICJnMSIsICJnNyIsICJjYyIsICJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvZGVjX2FuZF9sb2NrLlMgYi9hcmNoL3NwYXJjNjQvbGliL2RlY19hbmRfbG9jay5TCmluZGV4IDdlNmZkYWUuLjhlZTI4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVjX2FuZF9sb2NrLlMKKysrIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWNfYW5kX2xvY2suUwpAQCAtNDgsOCArNDgsOSBAQAogI2VuZGlmCiB0b196ZXJvOgogCWxkc3R1YglbJW8xXSwgJWczCisJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJybnoscG4JJWczLCBzcGluX29uX2xvY2sKLQkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIGxvb3AyOgljYXMJWyVvMF0sICVnMiwgJWc3CQkvKiBBU1NFUlQoZzcgPT0gMCkgKi8KIAljbXAJJWcyLCAlZzcKIApAQCAtNzEsOCArNzIsOSBAQAogCSBub3AKIHNwaW5fb25fbG9jazoKIAlsZHViCVslbzFdLCAlZzMKKwltZW1iYXIJI0xvYWRMb2FkCiAJYnJueixwdAklZzMsIHNwaW5fb25fbG9jawotCSBtZW1iYXIJI0xvYWRMb2FkCisJIG5vcAogCWJhLHB0CSV4Y2MsIHRvX3plcm8KIAkgbm9wCiAJbm9wCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL3J3c2VtLlMgYi9hcmNoL3NwYXJjNjQvbGliL3J3c2VtLlMKaW5kZXggMTc0ZmY3Yi4uNzVmMGU2YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9yd3NlbS5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvcndzZW0uUwpAQCAtMTcsOCArMTcsOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgYWRkCQklZzcsIDEsICVnNwogCWNtcAkJJWc3LCAwCisJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlibCxwbgkJJWljYywgM2YKLQkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKKwkgbm9wCiAyOgogCXJldGwKIAkgbm9wCkBAIC01Nyw4ICs1OCw5IEBACiAJY21wCQklZzMsICVnNwogCWJuZSxwbgkJJWljYywgMWIKIAkgY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJuZSxwbgkJJWljYywgM2YKLQkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKKwkgbm9wCiAyOglyZXRsCiAJIG5vcAogMzoKQEAgLTk3LDggKzk5LDkgQEAKIAljbXAJCSVnMSwgJWc3CiAJYm5lLHBuCQklaWNjLCAxYgogCSBjbXAJCSVnNywgMAorCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAJYmwscG4JCSVpY2MsIDNmCi0JIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCisJIG5vcAogMjoJcmV0bAogCSBub3AKIDM6CXNldGhpCQklaGkoUldTRU1fQUNUSVZFX01BU0spLCAlZzEKQEAgLTEyNiw4ICsxMjksOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgc3ViCQklZzcsICVnMSwgJWc3CiAJY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJsLHBuCQklaWNjLCAzZgotCSBtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIDI6CiAJcmV0bAogCSBub3AKQEAgLTE1MSw4ICsxNTUsOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgc3ViCQklZzcsICVnMSwgJWc3CiAJY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJsLHBuCQklaWNjLCAzZgotCSBtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIDI6CiAJcmV0bAogCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKaW5kZXggM2ZmZWU3Yi4uNTJlOTM3NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKQEAgLTM0LDIyICszNCw2IEBACiBleHRlcm4gc3RydWN0IHNwYXJjX3BoeXNfYmFua3Mgc3BfYmFua3NbU1BBUkNfUEhZU19CQU5LU107CiAKIC8qCi0gKiBUbyBkZWJ1ZyBrZXJuZWwgZHVyaW5nIHN5c2NhbGwgZW50cnkuCi0gKi8KLXZvaWQgc3lzY2FsbF90cmFjZV9lbnRyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGVudHJ5OiAlc1slZF0vY3B1JWQ6ICVkXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNtcF9wcm9jZXNzb3JfaWQoKSwgKGludCkgcmVncy0+dV9yZWdzW1VSRUdfRzFdKTsKLX0KLQotLyoKLSAqIFRvIGRlYnVnIGtlcm5lbCBkdXJpbmcgc3lzY2FsbCBleGl0LgotICovCi12b2lkIHN5c2NhbGxfdHJhY2VfZXhpdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGV4aXQ6ICVzWyVkXS9jcHUlZDogJWRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAoaW50KSByZWdzLT51X3JlZ3NbVVJFR19HMV0pOwotfQotCi0vKgogICogVG8gZGVidWcga2VybmVsIHRvIGNhdGNoIGFjY2Vzc2VzIHRvIGNlcnRhaW4gdmlydHVhbC9waHlzaWNhbCBhZGRyZXNzZXMuCiAgKiBNb2RlID0gMCBzZWxlY3RzIHBoeXNpY2FsIHdhdGNocG9pbnRzLCBtb2RlID0gMSBzZWxlY3RzIHZpcnR1YWwgd2F0Y2hwb2ludHMuCiAgKiBmbGFncyA9IFZNX1JFQUQgd2F0Y2hlcyBtZW1yZWFkIGFjY2Vzc2VzLCBmbGFncyA9IFZNX1dSSVRFIHdhdGNoZXMgbWVtd3JpdGUgYWNjZXNzZXMuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwppbmRleCA5YzUyMjIwLi44ZmM0MTNjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKQEAgLTEzNiw4ICsxMzYsOSBAQAogCQkJICAgICAib3IJJSVnMSwgJTAsICUlZzFcblx0IgogCQkJICAgICAiY2FzeAlbJTJdLCAlJWc3LCAlJWcxXG5cdCIKIAkJCSAgICAgImNtcAklJWc3LCAlJWcxXG5cdCIKKwkJCSAgICAgIm1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcblx0IgogCQkJICAgICAiYm5lLHBuCSUleGNjLCAxYlxuXHQiCi0JCQkgICAgICIgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZSIKKwkJCSAgICAgIiBub3AiCiAJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLwogCQkJICAgICA6ICJyIiAobWFzayksICJyIiAobm9uX2NwdV9iaXRzKSwgInIiICgmcGFnZS0+ZmxhZ3MpCiAJCQkgICAgIDogImcxIiwgImc3Iik7CkBAIC0xNTcsOCArMTU4LDkgQEAKIAkJCSAgICAgIiBhbmRuCSUlZzcsICUxLCAlJWcxXG5cdCIKIAkJCSAgICAgImNhc3gJWyUyXSwgJSVnNywgJSVnMVxuXHQiCiAJCQkgICAgICJjbXAJJSVnNywgJSVnMVxuXHQiCisJCQkgICAgICJtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG5cdCIKIAkJCSAgICAgImJuZSxwbgklJXhjYywgMWJcblx0IgotCQkJICAgICAiIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKwkJCSAgICAgIiBub3BcbiIKIAkJCSAgICAgIjI6IgogCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCSAgICAgOiAiciIgKGNwdSksICJyIiAobWFzayksICJyIiAoJnBhZ2UtPmZsYWdzKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TIGIvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKaW5kZXggN2EwOTM0My4uMzYzNzcwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKKysrIGIvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKQEAgLTcyLDYgKzcyLDcgQEAKIAlmbHVzaAkJJWc2CiAJcmV0bAogCSB3cnByCQklZzcsIDB4MCwgJXBzdGF0ZQorCW5vcAogCiAJLmFsaWduCQkzMgogCS5nbG9ibAkJX19mbHVzaF90bGJfa2VybmVsX3JhbmdlCkBAIC0yNDksNyArMjUwLDcgQEAKIAlyZXRsCiAJIHdycHIJCSVnNywgMHgwLCAlcHN0YXRlCiAKLV9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZzoJLyogMjIgaW5zbnMgKi8KK19fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZzoJLyogMjMgaW5zbnMgKi8KIAkvKiAlbzAgPSBjb250ZXh0LCAlbzEgPSBuciwgJW8yID0gdmFkZHJzW10gKi8KIAlyZHByCQklcHN0YXRlLCAlZzcKIAlzbGx4CQklbzEsIDMsICVvMQpAQCAtMjY2LDggKzI2Nyw5IEBACiAJIGFuZG4JCSVvMywgMSwgJW8zCiAJc3R4YQkJJWcwLCBbJW8zXSBBU0lfSU1NVV9ERU1BUAogMjoJc3R4YQkJJWcwLCBbJW8zXSBBU0lfRE1NVV9ERU1BUAkKKwltZW1iYXIJCSNTeW5jCiAJYnJueixwdAkJJW8xLCAxYgotCSBtZW1iYXIJCSNTeW5jCisJIG5vcAogCXN0eGEJCSVnMiwgWyVvNF0gQVNJX0RNTVUKIAlmbHVzaAkJJWc2CiAJd3JwcgkJJWcwLCAwLCAldGwKQEAgLTMxNiw3ICszMTgsNyBAQAogCXNldGhpCQklaGkoX19jaGVldGFoX2ZsdXNoX3RsYl9wZW5kaW5nKSwgJW8xCiAJb3IJCSVvMSwgJWxvKF9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZyksICVvMQogCWNhbGwJCWNoZWV0YWhfcGF0Y2hfb25lCi0JIG1vdgkJMjIsICVvMgorCSBtb3YJCTIzLCAlbzIKIAogI2lmZGVmIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRQogCXNldGhpCQklaGkoX19mbHVzaF9kY2FjaGVfcGFnZSksICVvMApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TCmluZGV4IDBjYzlkYWQuLjRiNmFlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2VudHJ5NjQuUworKysgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9lbnRyeTY0LlMKQEAgLTI0LDggKzI0LDkgQEAKIAogCS50ZXh0CiBzb2xhcmlzX3N5c2NhbGxfdHJhY2U6CisJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkgbm9wCisJIG1vdgkJMCwgJW8xCiAJc3JsCQklaTAsIDAsICVvMAogCW1vdgkJJWk0LCAlbzQKIAlzcmwJCSVpMSwgMCwgJW8xCkBAIC0xNTksOCArMTYwLDEwIEBACiAJIHN0eAkJJWwyLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdICFucGMgPSBucGMrNCAKIAogc29sYXJpc19zeXNjYWxsX3RyYWNlMjoKKwlhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJY2FsbAkJc3lzY2FsbF90cmFjZQotCSBhZGQJCSVsMSwgMHg0LCAlbDIJCQkvKiBucGMgPSBucGMrNCAqLworCSBtb3YJCTEsICVvMQorCWFkZAkJJWwxLCAweDQsICVsMgkJCS8qIG5wYyA9IG5wYys0ICovCiAJYW5kY2MJCSVsMSwgMSwgJWcwCiAJYm5lLHBuCQklaWNjLCAyYgogCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZyBiL2FyY2gvdW0vS2NvbmZpZwppbmRleCA5NDY5ZTc3Li5mOTQ1NDQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcKKysrIGIvYXJjaC91bS9LY29uZmlnCkBAIC0xMjgsNyArMTI4LDYgQEAKIAogY29uZmlnIEhQUEZTCiAJdHJpc3RhdGUgIkhvbmV5UG90IFByb2NGUyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEJST0tFTgogCWhlbHAKIAlocHBmcyAoSG9uZXlQb3QgUHJvY0ZTKSBpcyBhIGZpbGVzeXN0ZW0gd2hpY2ggYWxsb3dzIFVNTCAvcHJvYwogCWVudHJpZXMgdG8gYmUgb3ZlcnJpZGRlbiwgcmVtb3ZlZCwgb3IgZmFicmljYXRlZCBmcm9tIHRoZSBob3N0LgpAQCAtMTQxLDggKzE0MCw5IEBACiAJWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSBhcmUgc2V0dGluZyB1cCBhIFVNTCBob25leXBvdC4gIE90aGVyd2lzZSwKIAlpdCBpcyBzYWZlIHRvIHNheSAnTicgaGVyZS4KIAotCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSBhc2sgZm9yIGl0IHRvIGJlIGZpeGVkLiBJbiB0aGlzCi0JbW9tZW50LCBpdCBkb2VzIG5vdCB3b3JrIG9uIDIuNiAoaXQgd29ya3Mgc29tZWhvdyBvbiAyLjQpLgorCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zLCBzaW5jZSBpdCdzCisJZ2V0dGluZyBmaXhlZC4gSW4gdGhpcyBtb21lbnQsIGl0IGlzIGV4cGVyaW1lbnRhbCBvbiAyLjYgKGl0IHdvcmtzIG9uCisJMi40KS4KIAogY29uZmlnIE1DT05TT0xFCiAJYm9vbCAiTWFuYWdlbWVudCBjb25zb2xlIgpAQCAtMjc1LDYgKzI3NSw4IEBACiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19jaGFyIgpAQCAtMjg3LDcgKzI4OSw3IEBACiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnX25ldCIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWdfaTM4NiBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CmluZGV4IGU0MWYzNzQuLjI3YzE4YTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ19pMzg2CisrKyBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CkBAIC0xOSw2ICsxOSwxOCBAQAogCW1lbW9yeS4gIEFsbCB0aGUgbWVtb3J5IHRoYXQgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHdpbGwgYmUgdHJlYXRlZAogCWFzIGhpZ2ggbWVtb3J5LgogCitjb25maWcgU1RVQl9DT0RFCisJaGV4CisJZGVmYXVsdCAweGJmZmZlMDAwCisKK2NvbmZpZyBTVFVCX0RBVEEKKwloZXgKKwlkZWZhdWx0IDB4YmZmZmYwMDAKKworY29uZmlnIFNUVUJfU1RBUlQKKwloZXgKKwlkZWZhdWx0IFNUVUJfQ09ERQorCiBjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUwogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZ19uZXQgYi9hcmNoL3VtL0tjb25maWdfbmV0CmluZGV4IDFjMmY5YTcuLmZhMmFiMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ19uZXQKKysrIGIvYXJjaC91bS9LY29uZmlnX25ldApAQCAtMTM1LDcgKzEzNSw3IEBACiAKIGNvbmZpZyBVTUxfTkVUX1BDQVAKIAlib29sICJwY2FwIHRyYW5zcG9ydCIKLQlkZXBlbmRzIG9uIFVNTF9ORVQgJiYgQlJPS0VOCisJZGVwZW5kcyBvbiBVTUxfTkVUICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAlUaGUgcGNhcCB0cmFuc3BvcnQgbWFrZXMgYSBwY2FwIHBhY2tldCBzdHJlYW0gb24gdGhlIGhvc3QgbG9vawogCWxpa2UgYW4gZXRoZXJuZXQgZGV2aWNlIGluc2lkZSBVTUwuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFraW5nIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnX3g4Nl82NCBiL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQKaW5kZXggZjE2MmY1MC4uNzM1YTA0NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnX3g4Nl82NAorKysgYi9hcmNoL3VtL0tjb25maWdfeDg2XzY0CkBAIC0xNCw2ICsxNCwxOCBAQAogICAgICAgIGJvb2wKICAgICAgICBkZWZhdWx0IHkKIAorY29uZmlnIFNUVUJfQ09ERQorCWhleAorCWRlZmF1bHQgMHg3ZmJmZmZlMDAwCisKK2NvbmZpZyBTVFVCX0RBVEEKKwloZXgKKwlkZWZhdWx0IDB4N2ZiZmZmZjAwMAorCitjb25maWcgU1RVQl9TVEFSVAorCWhleAorCWRlZmF1bHQgU1RVQl9DT0RFCisKIGNvbmZpZyBBUkNIX0hBU19TQ19TSUdOQUxTCiAJYm9vbAogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggM2YwNzM5MC4uZWI0YWM0MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC01MSwyNSArNTEsMjYgQEAKIGVuZGlmCiBTWVNfRElSCQk6PSAkKEFSQ0hfRElSKS9pbmNsdWRlL3N5c2RlcC0kKFNVQkFSQ0gpCiAKLWluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCisjIC1Edm1hcD1rZXJuZWxfdm1hcCBhZmZlY3RzIGV2ZXJ5dGhpbmcsIGFuZCBwcmV2ZW50cyBhbnl0aGluZyBmcm9tCisjIHJlZmVyZW5jaW5nIHRoZSBsaWJwY2FwLm8gc3ltYm9sIHNvIG5hbWVkLgogCi1jb3JlLXkgKz0gJChTVUJBUkNIX0NPUkUpCi1saWJzLXkgKz0gJChTVUJBUkNIX0xJQlMpCitDRkxBR1MgKz0gJChDRkxBR1MteSkgLURfX2FyY2hfdW1fXyAtRFNVQkFSQ0g9XCIkKFNVQkFSQ0gpXCIgXAorCSQoQVJDSF9JTkNMVURFKSAkKE1PREVfSU5DTFVERSkgLUR2bWFwPWtlcm5lbF92bWFwCisKK1VTRVJfQ0ZMQUdTIDo9ICQocGF0c3Vic3QgLUklLCwkKENGTEFHUykpCitVU0VSX0NGTEFHUyA6PSAkKHBhdHN1YnN0IC1EX19LRVJORUxfXywsJChVU0VSX0NGTEFHUykpICQoQVJDSF9JTkNMVURFKSBcCisJJChNT0RFX0lOQ0xVREUpCiAKICMgLURlcnJubz1rZXJuZWxfZXJybm8gLSBUaGlzIHR1cm5zIGFsbCBrZXJuZWwgcmVmZXJlbmNlcyB0byBlcnJubyBpbnRvCiAjIGtlcm5lbF9lcnJubyB0byBzZXBhcmF0ZSB0aGVtIGZyb20gdGhlIGxpYmMgZXJybm8uICBUaGlzIGFsbG93cyAtZm5vLWNvbW1vbgogIyBpbiBDRkxBR1MuICBPdGhlcndpc2UsIGl0IHdvdWxkIGNhdXNlIGxkIHRvIGNvbXBsYWluIGFib3V0IHRoZSB0d28gZGlmZmVyZW50CiAjIGVycm5vcy4KIAotQ0ZMQUdTICs9ICQoQ0ZMQUdTLXkpIC1EX19hcmNoX3VtX18gLURTVUJBUkNIPVwiJChTVUJBUkNIKVwiIFwKLQkkKEFSQ0hfSU5DTFVERSkgJChNT0RFX0lOQ0xVREUpCi0KLVVTRVJfQ0ZMQUdTIDo9ICQocGF0c3Vic3QgLUklLCwkKENGTEFHUykpCi1VU0VSX0NGTEFHUyA6PSAkKHBhdHN1YnN0IC1EX19LRVJORUxfXywsJChVU0VSX0NGTEFHUykpICQoQVJDSF9JTkNMVURFKSBcCi0JJChNT0RFX0lOQ0xVREUpICQoQVJDSF9VU0VSX0NGTEFHUykKIENGTEFHUyArPSAtRGVycm5vPWtlcm5lbF9lcnJubyAtRHNpZ3Byb2NtYXNrPWtlcm5lbF9zaWdwcm9jbWFzawogQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby11bml0LWF0LWEtdGltZSwpCiAKK2luY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCisKICNUaGlzIHdpbGwgYWRqdXN0ICpGTEFHUyBhY2NvcmRpbmdseSB0byB0aGUgcGxhdGZvcm0uCiBpbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtb3MtJChPUykKIApAQCAtMTE2LDE4ICsxMTcsMTkgQEAKIFNUQUNLX1NJWkUgOj0gJChzaGVsbCBlY2hvICQkWyA0MDk2ICogKDEgPDwgJChDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSkgXSApCiAKIGlmbmRlZiBTVEFSVAotICBTVEFSVCA9ICQkKCgkKFRPUF9BRERSKSAtICQoU0laRSkpKQorICBTVEFSVCA9ICQoc2hlbGwgZWNobyAkJFsgJChUT1BfQUREUikgLSAkKFNJWkUpIF0gKQogZW5kaWYKIAotQ1BQRkxBR1Nfdm1saW51eC5sZHMgPSAkKHNoZWxsIGVjaG8gLVUkKFNVQkFSQ0gpIFwKK0NQUEZMQUdTX3ZtbGludXgubGRzID0gLVUkKFNVQkFSQ0gpIFwKIAktRFNUQVJUPSQoU1RBUlQpIC1ERUxGX0FSQ0g9JChFTEZfQVJDSCkgXAotCS1ERUxGX0ZPUk1BVD1cIiQoRUxGX0ZPUk1BVClcIiAkKENQUF9NT0RFLXkpIFwKLQktREtFUk5FTF9TVEFDS19TSVpFPSQoU1RBQ0tfU0laRSkgLURTVUJBUkNIPSQoU1VCQVJDSCkpCisJLURFTEZfRk9STUFUPSIkKEVMRl9GT1JNQVQpIiAkKENQUF9NT0RFLXkpIFwKKwktREtFUk5FTF9TVEFDS19TSVpFPSQoU1RBQ0tfU0laRSkgXAorCS1EVU5NQVBfUEFUSD1hcmNoL3VtL3N5cy0kKFNVQkFSQ0gpL3VubWFwX2Zpbi5vCiAKICNUaGUgd3JhcHBlcnMgd2lsbCBzZWxlY3Qgd2hldGhlciB1c2luZyAibWFsbG9jIiBvciB0aGUga2VybmVsIGFsbG9jYXRvci4KIExJTktfV1JBUFMgPSAtV2wsLS13cmFwLG1hbGxvYyAtV2wsLS13cmFwLGZyZWUgLVdsLC0td3JhcCxjYWxsb2MKIAotQ0ZMQUdTX3ZtbGludXggPSAkKExJTksteSkgJChMSU5LX1dSQVBTKQorQ0ZMQUdTX3ZtbGludXggOj0gJChMSU5LLXkpICQoTElOS19XUkFQUykKIGRlZmluZSBjbWRfdm1saW51eF9fCiAJJChDQykgJChDRkxBR1Nfdm1saW51eCkgLW8gJEAgXAogCS1XbCwtVCwkKHZtbGludXgtbGRzKSAkKHZtbGludXgtaW5pdCkgXApAQCAtMTQwLDcgKzE0Miw4IEBACiAjV2hlbiBjbGVhbmluZyB3ZSBkb24ndCBpbmNsdWRlIC5jb25maWcsIHNvIHdlIGRvbid0IGluY2x1ZGUKICNUVCBvciBza2FzIG1ha2VmaWxlcyBhbmQgZG9uJ3QgY2xlYW4gc2thc19wdHJlZ3MuaC4KIENMRUFOX0ZJTEVTICs9IGxpbnV4IHguaSBnbW9uLm91dCAkKEFSQ0hfRElSKS9pbmNsdWRlL3VtbC1jb25maWcuaCBcCi0JJChHRU5fSEVBREVSUykgJChBUkNIX0RJUikvaW5jbHVkZS9za2FzX3B0cmVncy5oCisJJChHRU5fSEVBREVSUykgJChBUkNIX0RJUikvaW5jbHVkZS9za2FzX3B0cmVncy5oIFwKKwkkKEFSQ0hfRElSKS9pbmNsdWRlL3VzZXJfY29uc3RhbnRzLmgKIAogTVJQUk9QRVJfRklMRVMgKz0gJChTWU1MSU5LX0hFQURFUlMpICQoQVJDSF9TWU1MSU5LUykgXAogCSQoYWRkcHJlZml4ICQoQVJDSF9ESVIpL2tlcm5lbC8sJChLRVJOX1NZTUxJTktTKSkgJChBUkNIX0RJUikvb3MgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2IGIvYXJjaC91bS9NYWtlZmlsZS1pMzg2CmluZGV4IDI5ZTE4MmQuLjkzZDA4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgorKysgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKQEAgLTEsNCArMSw0IEBACi1TVUJBUkNIX0NPUkUgOj0gYXJjaC91bS9zeXMtaTM4Ni8gYXJjaC9pMzg2L2NyeXB0by8KK2NvcmUteSArPSBhcmNoL3VtL3N5cy1pMzg2LyBhcmNoL2kzODYvY3J5cHRvLwogCiBUT1BfQUREUiA6PSAkKENPTkZJR19UT1BfQUREUikKIApAQCAtOCwyMSArOCwzMiBAQAogICBlbmRpZgogZW5kaWYKIAotQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLVUkKFNVQkFSQ0gpCi1BUkNIX1VTRVJfQ0ZMQUdTIDo9CitMREZMQUdTCQkJKz0gLW0gZWxmX2kzODYKK0VMRl9BUkNICQk6PSAkKFNVQkFSQ0gpCitFTEZfRk9STUFUIAkJOj0gZWxmMzItJChTVUJBUkNIKQorT0JKQ09QWUZMQUdTICAJCTo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAuY29tbWVudCAtUworCitpZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKK2lmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQorQ0ZMQUdTCQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorVVNFUl9DRkxBR1MJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKK0hPU1RDRkxBR1MJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKK0hPU1RMREZMQUdTCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCitBRkxBR1MJCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCitMSU5LLXkJCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCitVTUxfT0JKQ09QWUZMQUdTCSs9IC1GICQoRUxGX0ZPUk1BVCkKKworZXhwb3J0IExERkxBR1MgSE9TVENGTEFHUyBIT1NUTERGTEFHUyBVTUxfT0JKQ09QWUZMQUdTCitlbmRpZgorZW5kaWYKKworQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLVUkKFNVQkFSQ0gpICQoU1RVQl9DRkxBR1MpCiAKIGlmbmVxICgkKENPTkZJR19HUFJPRikseSkKIEFSQ0hfQ0ZMQUdTICs9IC1EVU1fRkFTVENBTEwKIGVuZGlmCiAKLUVMRl9BUkNIIDo9ICQoU1VCQVJDSCkKLUVMRl9GT1JNQVQgOj0gZWxmMzItJChTVUJBUkNIKQotCi1PQkpDT1BZRkxBR1MgIDo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAuY29tbWVudCAtUwotCi1TWVNfVVRJTF9ESVIJOj0gJChBUkNIX0RJUikvc3lzLWkzODYvdXRpbAotCi1TWVNfSEVBREVSUyA6PSAkKFNZU19ESVIpL3NjLmggJChTWVNfRElSKS90aHJlYWQuaAorU1lTX0hFQURFUlMJOj0gJChTWVNfRElSKS9zYy5oICQoU1lTX0RJUikvdGhyZWFkLmgKIAogcHJlcGFyZTogJChTWVNfSEVBREVSUykKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAppbmRleCAzMjE0NDU2Li5hYTJmNzE3IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAorKysgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NApAQCAtMSwxMSArMSwxMyBAQAogIyBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgUGF0aHNjYWxlLCBJbmMKICMgUmVsZWFzZWQgdW5kZXIgdGhlIEdQTAogCi1TVUJBUkNIX0xJQlMgOj0gYXJjaC91bS9zeXMteDg2XzY0LworbGlicy15ICs9IGFyY2gvdW0vc3lzLXg4Nl82NC8KIFNUQVJUIDo9IDB4NjAwMDAwMDAKIAotQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLWZuby1idWlsdGluCi1BUkNIX1VTRVJfQ0ZMQUdTIDo9IC1EX194ODZfNjRfXworI1dlICN1bmRlZiBfX3g4Nl82NF9fIGZvciBrZXJuZWxzcGFjZSwgbm90IGZvciB1c2Vyc3BhY2Ugd2hlcmUKKyNpdCdzIG5lZWRlZCBmb3IgaGVhZGVycyB0byB3b3JrIQorQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLWZuby1idWlsdGluICQoU1RVQl9DRkxBR1MpCitVU0VSX0NGTEFHUyArPSAtZm5vLWJ1aWx0aW4KIAogRUxGX0FSQ0ggOj0gaTM4Njp4ODYtNjQKIEVMRl9GT1JNQVQgOj0gZWxmNjQteDg2LTY0CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RlZmNvbmZpZyBiL2FyY2gvdW0vZGVmY29uZmlnCmluZGV4IDQwNjdjM2EuLjgwZDMwZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZGVmY29uZmlnCisrKyBiL2FyY2gvdW0vZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMy1za2FzMy12OS1wcmUyCi0jIFN1biBBcHIgMjQgMTk6NDY6MTAgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjNi1tbTEKKyMgVHVlIEp1biAxNCAxODoyMjoyMSAyMDA1CiAjCiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfVU1MPXkKQEAgLTEzLDIzICsxMywzMiBAQAogIwogIyBVTUwtc3BlY2lmaWMgb3B0aW9ucwogIwotQ09ORklHX01PREVfVFQ9eQorIyBDT05GSUdfTU9ERV9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFUSUNfTElOSyBpcyBub3Qgc2V0CiBDT05GSUdfTU9ERV9TS0FTPXkKIENPTkZJR19VTUxfWDg2PXkKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19UT1BfQUREUj0weGMwMDAwMDAwCiAjIENPTkZJR18zX0xFVkVMX1BHVEFCTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19TVFVCX0NPREU9MHhiZmZmZTAwMAorQ09ORklHX1NUVUJfREFUQT0weGJmZmZmMDAwCitDT05GSUdfU1RVQl9TVEFSVD0weGJmZmZlMDAwCiBDT05GSUdfQVJDSF9IQVNfU0NfU0lHTkFMUz15CiBDT05GSUdfQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUE9eQotQ09ORklHX0xEX1NDUklQVF9TVEFUSUM9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX0xEX1NDUklQVF9EWU49eQogQ09ORklHX05FVD15CiBDT05GSUdfQklORk1UX0VMRj15CiBDT05GSUdfQklORk1UX01JU0M9bQotQ09ORklHX0hPU1RGUz15CisjIENPTkZJR19IT1NURlMgaXMgbm90IHNldAogQ09ORklHX01DT05TT0xFPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPU1RfMkdfMkcgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKIENPTkZJR19ORVNUX0xFVkVMPTAKIENPTkZJR19LRVJORUxfSEFMRl9HSUdTPTEKICMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldApAQCAtNjMsNiArNzIsOCBAQAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgxLDYgKzkyLDcgQEAKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LTU9EPXkKIApAQCAtMTE1LDYgKzEyNyw3IEBACiBDT05GSUdfU09VTkQ9bQogQ09ORklHX0hPU1RBVURJTz1tCiBDT05GSUdfVU1MX1JBTkRPTT15CisjIENPTkZJR19NTUFQUEVSIGlzIG5vdCBzZXQKIAogIwogIyBCbG9jayBkZXZpY2VzCkBAIC0xNzYsNiArMTg5LDE3IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSVBfVENQRElBRz15CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorCisjCisjIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKKyMKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPXkKK0NPTkZJR19UQ1BfQ09OR19IVENQPXkKKyMgQ09ORklHX1RDUF9DT05HX0hTVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX1ZFR0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtMjA2LDExICsyMzAsMTUgQEAKICMgTmV0d29yayB0ZXN0aW5nCiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREJPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKQEAgLTIyNyw2ICsyNTUsNyBAQAogIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUF9ERUZMQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUF9CU0RDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9NUFBFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKIENPTkZJR19TTElQPW0KICMgQ09ORklHX1NMSVBfQ09NUFJFU1NFRCBpcyBub3Qgc2V0CkBAIC0yNDAsMTAgKzI2OSwxMiBAQAogIwogQ09ORklHX0VYVDJfRlM9eQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUjRfRlMgaXMgbm90IHNldAogQ09ORklHX1JFSVNFUkZTX0ZTPXkKICMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CkBAIC0yNTYsNiArMjg3LDcgQEAKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CiBDT05GSUdfUVVPVEE9eQogIyBDT05GSUdfUUZNVF9WMSBpcyBub3Qgc2V0CiAjIENPTkZJR19RRk1UX1YyIGlzIG5vdCBzZXQKQEAgLTI2NSw2ICsyOTcsMTIgQEAKIENPTkZJR19BVVRPRlM0X0ZTPW0KIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogQ09ORklHX0lTTzk2NjBfRlM9bQpAQCAtMjkxLDYgKzMyOSw4IEBACiAjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKQEAgLTMxOSw2ICszNTksNyBAQAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTQwNCwxNCArNDQ1LDE1IEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TTEFCPXkKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX1BUX1BST1hZPXkKKyMgQ09ORklHX0dQUk9GIGlzIG5vdCBzZXQKICMgQ09ORklHX0dDT1YgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ0FMTF9ERUJVRyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvTWFrZWZpbGUgYi9hcmNoL3VtL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggYjJkZTk5MS4uZDZjMzFhOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vZHJpdmVycy9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNiBAQAogc2xpcnAtb2JqcyA6PSBzbGlycF9rZXJuLm8gc2xpcnBfdXNlci5vCiBkYWVtb24tb2JqcyA6PSBkYWVtb25fa2Vybi5vIGRhZW1vbl91c2VyLm8KIG1jYXN0LW9ianMgOj0gbWNhc3Rfa2Vybi5vIG1jYXN0X3VzZXIubwotI3BjYXAtb2JqcyA6PSBwY2FwX2tlcm4ubyBwY2FwX3VzZXIubyAkKFBDQVApCiBuZXQtb2JqcyA6PSBuZXRfa2Vybi5vIG5ldF91c2VyLm8KIG1jb25zb2xlLW9ianMgOj0gbWNvbnNvbGVfa2Vybi5vIG1jb25zb2xlX3VzZXIubwogaG9zdGF1ZGlvLW9ianMgOj0gaG9zdGF1ZGlvX2tlcm4ubwpAQCAtMTgsNiArMTcsMTcgQEAKIHBvcnQtb2JqcyA6PSBwb3J0X2tlcm4ubyBwb3J0X3VzZXIubwogaGFyZGRvZy1vYmpzIDo9IGhhcmRkb2dfa2Vybi5vIGhhcmRkb2dfdXNlci5vCiAKK0xERkxBR1NfcGNhcC5vIDo9IC1yICQoc2hlbGwgJChDQykgJChDRkxBR1MpIC1wcmludC1maWxlLW5hbWU9bGlicGNhcC5hKQorCiskKG9iaikvcGNhcC5vOiAkKG9iaikvcGNhcF9rZXJuLm8gJChvYmopL3BjYXBfdXNlci5vCisJJChMRCkgLXIgLWRwIC1vICRAICReICQoTERGTEFHUykgJChMREZMQUdTX3BjYXAubykKKyNYWFg6IFRoZSBjYWxsIGJlbG93IGRvZXMgbm90IHdvcmsgYmVjYXVzZSB0aGUgZmxhZ3MgYXJlIGFkZGVkIGJlZm9yZSB0aGUKKyMgb2JqZWN0IG5hbWUsIHNvIG5vdGhpbmcgZnJvbSB0aGUgbGlicmFyeSBnZXRzIGxpbmtlZC4KKyMkKGNhbGwgaWZfY2hhbmdlZCxsZCkKKworIyBXaGVuIHRoZSBhYm92ZSBpcyBmaXhlZCwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGlzIHRvbyEKKyN0YXJnZXRzIDo9ICQob2JqKS9wY2FwLm8KKwogb2JqLXkgOj0gc3RkaW9fY29uc29sZS5vIGZkLm8gY2hhbl9rZXJuLm8gY2hhbl91c2VyLm8gbGluZS5vCiBvYmotJChDT05GSUdfU1NMKSArPSBzc2wubwogb2JqLSQoQ09ORklHX1NUREVSUl9DT05TT0xFKSArPSBzdGRlcnJfY29uc29sZS5vCkBAIC0yNiw3ICszNiw3IEBACiBvYmotJChDT05GSUdfVU1MX05FVF9TTElSUCkgKz0gc2xpcnAubyBzbGlwX2NvbW1vbi5vCiBvYmotJChDT05GSUdfVU1MX05FVF9EQUVNT04pICs9IGRhZW1vbi5vIAogb2JqLSQoQ09ORklHX1VNTF9ORVRfTUNBU1QpICs9IG1jYXN0Lm8gCi0jb2JqLSQoQ09ORklHX1VNTF9ORVRfUENBUCkgKz0gcGNhcC5vICQoUENBUCkKK29iai0kKENPTkZJR19VTUxfTkVUX1BDQVApICs9IHBjYXAubwogb2JqLSQoQ09ORklHX1VNTF9ORVQpICs9IG5ldC5vIAogb2JqLSQoQ09ORklHX01DT05TT0xFKSArPSBtY29uc29sZS5vCiBvYmotJChDT05GSUdfTU1BUFBFUikgKz0gbW1hcHBlcl9rZXJuLm8gCkBAIC00MSw2ICs1MSw3IEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OKSArPSBjb3dfdXNlci5vCiBvYmotJChDT05GSUdfVU1MX1JBTkRPTSkgKz0gcmFuZG9tLm8KIAotVVNFUl9PQkpTIDo9IGZkLm8gbnVsbC5vIHB0eS5vIHR0eS5vIHh0ZXJtLm8gc2xpcF9jb21tb24ubworIyBwY2FwX3VzZXIubyBtdXN0IGJlIGFkZGVkIGV4cGxpY2l0bHkuCitVU0VSX09CSlMgOj0gZmQubyBudWxsLm8gcHR5Lm8gdHR5Lm8geHRlcm0ubyBzbGlwX2NvbW1vbi5vIHBjYXBfdXNlci5vCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCAyYmI0YzRmLi5lMGZkZmZhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTY2MywxMSArNjYzLDE1IEBACiAJcmV0dXJuIGRyaXZlcjsKIH0KIAorc3RhdGljIHNwaW5sb2NrX3Qgd2luY2hfaGFuZGxlcl9sb2NrOworTElTVF9IRUFEKHdpbmNoX2hhbmRsZXJzKTsKKwogdm9pZCBsaW5lc19pbml0KHN0cnVjdCBsaW5lICpsaW5lcywgaW50IG5saW5lcykKIHsKIAlzdHJ1Y3QgbGluZSAqbGluZTsKIAlpbnQgaTsKIAorCXNwaW5fbG9ja19pbml0KCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWZvcihpID0gMDsgaSA8IG5saW5lczsgaSsrKXsKIAkJbGluZSA9ICZsaW5lc1tpXTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxpbmUtPmNoYW5fbGlzdCk7CkBAIC03MjQsMzEgKzcyOCwzMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotREVDTEFSRV9NVVRFWCh3aW5jaF9oYW5kbGVyX3NlbSk7Ci1MSVNUX0hFQUQod2luY2hfaGFuZGxlcnMpOwotCiB2b2lkIHJlZ2lzdGVyX3dpbmNoX2lycShpbnQgZmQsIGludCB0dHlfZmQsIGludCBwaWQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaDsKIAotCWRvd24oJndpbmNoX2hhbmRsZXJfc2VtKTsKIAl3aW5jaCA9IGttYWxsb2Moc2l6ZW9mKCp3aW5jaCksIEdGUF9LRVJORUwpOwogCWlmICh3aW5jaCA9PSBOVUxMKSB7CiAJCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0ga21hbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KKwogCSp3aW5jaCA9ICgoc3RydWN0IHdpbmNoKSB7IC5saXN0ICAJPSBMSVNUX0hFQURfSU5JVCh3aW5jaC0+bGlzdCksCiAJCQkJICAgLmZkICAJPSBmZCwKIAkJCQkgICAudHR5X2ZkIAk9IHR0eV9mZCwKIAkJCQkgICAucGlkICAJPSBwaWQsCiAJCQkJICAgLnR0eSAJPSB0dHkgfSk7CisKKwlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9hZGQoJndpbmNoLT5saXN0LCAmd2luY2hfaGFuZGxlcnMpOworCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOworCiAJaWYodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKIAkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAKIAkJCSAgIndpbmNoIiwgd2luY2gpIDwgMCkKIAkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtNzU2LDcgKzc1OSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwogCXN0cnVjdCB3aW5jaCAqd2luY2gsICpmb3VuZCA9IE5VTEw7CiAKLQlkb3duKCZ3aW5jaF9oYW5kbGVyX3NlbSk7CisJc3Bpbl9sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWxpc3RfZm9yX2VhY2goZWxlLCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwogICAgICAgICAgICAgICAgIGlmKHdpbmNoLT50dHkgPT0gdHR5KXsKQEAgLTc2NCwyMCArNzY3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZihmb3VuZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCQlnb3RvIGVycjsKKworCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKICAgICAgICAgaWYod2luY2gtPnBpZCAhPSAtMSkKICAgICAgICAgICAgICAgICBvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CiAKICAgICAgICAgZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7Ci0gICAgICAgIGxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CiAgICAgICAgIGtmcmVlKHdpbmNoKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKKworCXJldHVybjsKK2VycjoKKwlzcGluX3VubG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIH0KIAorLyogWFhYOiBObyBsb2NrIGFzIGl0J3MgYW4gZXhpdGNhbGwuLi4gaXMgdGhpcyB2YWxpZD8gRGVwZW5kaW5nIG9uIGNsZWFudXAKKyAqIG9yZGVyLi4uIGFyZSB3ZSBzdXJlIHRoYXQgbm90aGluZyBlbHNlIGlzIGRvbmUgb24gdGhlIGxpc3Q/ICovCiBzdGF0aWMgdm9pZCB3aW5jaF9jbGVhbnVwKHZvaWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwpAQCAtNzg2LDYgKzc5NCw5IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAJCWlmKHdpbmNoLT5mZCAhPSAtMSl7CisJCQkvKiBXaHkgaXMgdGhpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgZnJlZV9pcnEoKSwKKwkJCSAqIHdoaWNoIGRlYWN0aXZhdGVzIFNJR0lPPyBUaGlzIHNlYXJjaGVzIHRoZSBGRAorCQkJICogc29tZXdoZXJlIGVsc2UgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbGlzdC4uLiAqLwogCQkJZGVhY3RpdmF0ZV9mZCh3aW5jaC0+ZmQsIFdJTkNIX0lSUSk7CiAJCQlvc19jbG9zZV9maWxlKHdpbmNoLT5mZCk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9tZW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9tZW0uaAppbmRleCAxMGM0NmMzLi45OWQzYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbWVtLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL21lbS5oCkBAIC0xMyw2ICsxMyw3IEBACiBleHRlcm4gaW50IGlzX3JlbWFwcGVkKHZvaWQgKnZpcnQpOwogZXh0ZXJuIGludCBwaHlzbWVtX3JlbW92ZV9tYXBwaW5nKHZvaWQgKnZpcnQpOwogZXh0ZXJuIHZvaWQgcGh5c21lbV9mb3JnZXRfZGVzY3JpcHRvcihpbnQgZmQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG9fcGh5cyh2b2lkICp2aXJ0KTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaCBiL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaAppbmRleCA4NzQ0YWJiLi4wYTM1ZTZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvcmVnaXN0ZXJzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3JlZ2lzdGVycy5oCkBAIC0xNCw2ICsxNCw3IEBACiBleHRlcm4gdm9pZCBzYXZlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCByZXN0b3JlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBpbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKK2V4dGVybiB2b2lkIGdldF9zYWZlX3JlZ2lzdGVycyh1bnNpZ25lZCBsb25nICogcmVncyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCmluZGV4IGVjYTgwNjYuLjg5OWFhNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCkBAIC0yMCwxMSArMjAsMjQgQEAKICNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczX09GRlNFVCBQVF9PRkZTRVQoRURYKQogI2RlZmluZSBQVF9TWVNDQUxMX0FSRzRfT0ZGU0VUIFBUX09GRlNFVChFU0kpCiAjZGVmaW5lIFBUX1NZU0NBTExfQVJHNV9PRkZTRVQgUFRfT0ZGU0VUKEVESSkKKyNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc2X09GRlNFVCBQVF9PRkZTRVQoRUJQKQogCiAjZGVmaW5lIFBUX1NZU0NBTExfUkVUX09GRlNFVCBQVF9PRkZTRVQoRUFYKQogCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9OUiBFQVggLyogVGhpcyBpcyB1c2VkIGJlZm9yZSBhIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkcxIEVCWAorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBFQ1gKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzMgRURYCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkc0IEVTSQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBFREkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgRUJQCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBFSVAKKyNkZWZpbmUgUkVHU19TUF9JTkRFWCBVRVNQCisKICNkZWZpbmUgUFRfSVBfT0ZGU0VUIFBUX09GRlNFVChFSVApCiAjZGVmaW5lIFBUX0lQKHJlZ3MpICgocmVncylbRUlQXSkKKyNkZWZpbmUgUFRfU1BfT0ZGU0VUIFBUX09GRlNFVChVRVNQKQogI2RlZmluZSBQVF9TUChyZWdzKSAoKHJlZ3MpW1VFU1BdKQogCiAjaWZuZGVmIEZSQU1FX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9zdHViLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjk5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgRUFYCisjZGVmaW5lIFNUVUJfTU1BUF9OUiBfX05SX21tYXAyCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pICgobykgPj4gUEFHRV9TSElGVCkKKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDIobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMikKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVieDsgIiA6IDogImciIChhcmcxKSA6ICIlZWJ4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYXg7ICIgOiA6ICJnIiAoc3lzY2FsbCkgOiAiJWVheCIpOworCV9fYXNtX18oImludCAkMHg4MDsiIDogOiA6ICIlZWF4Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlYXgsICUwOyAiIDogIj1nIiAocmV0KSA6KTsKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDMobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZWR4OyAiIDogOiAiZyIgKGFyZzMpIDogIiVlZHgiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMihzeXNjYWxsLCBhcmcxLCBhcmcyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw0KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0KQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZXNpOyAiIDogOiAiZyIgKGFyZzQpIDogIiVlc2kiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMyhzeXNjYWxsLCBhcmcxLCBhcmcyLCBhcmczKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw2KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0LCBsb25nIGFyZzUsIGxvbmcgYXJnNikKK3sKKwlsb25nIHJldDsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlZWF4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYng7ICIgOiA6ICJnIiAoYXJnMSkgOiAiJWVieCIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVkeDsgIiA6IDogImciIChhcmczKSA6ICIlZWR4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlc2k7ICIgOiA6ICJnIiAoYXJnNCkgOiAiJWVzaSIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWRpOyAiIDogOiAiZyIgKGFyZzUpIDogIiVlZGkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJSVlYnAgOyBtb3ZsICUxLCAlJWVicDsgIgorCQkiaW50ICQweDgwOyBwb3BsICUlZWJwIDsgIgorCQkibW92bCAlJWVheCwgJTA7ICIgOiAiPWciIChyZXQpIDogImciIChhcmc2KSA6ICIlZWF4Iik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQoreworCV9fYXNtKCJpbnQzIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZV91c2VyLmgKaW5kZXggMzE3Mjk5Ny4uMTI4ZmFmMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2VfdXNlci5oCkBAIC01NSw2ICs1NSwyMCBAQAogI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQogI2VuZGlmCiAKKy8qIFRoZXNlIGFyZSBiZWZvcmUgdGhlIHN5c3RlbSBjYWxsLCBzbyB0aGUgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBSQVgKKyAqIHJhdGhlciB0aGFuIE9SSUdfUkFYLCBhbmQgYXJnNCBpcyBSMTAgcmF0aGVyIHRoYW4gUkNYCisgKi8KKyNkZWZpbmUgUkVHU19TWVNDQUxMX05SIFBUX0lOREVYKFJBWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzEgUFRfSU5ERVgoUkRJKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBQVF9JTkRFWChSU0kpCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIFBUX0lOREVYKFJEWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzQgUFRfSU5ERVgoUjEwKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBQVF9JTkRFWChSOCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgUFRfSU5ERVgoUjkpCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBQVF9JTkRFWChSSVApCisjZGVmaW5lIFJFR1NfU1BfSU5ERVggUFRfSU5ERVgoUlNQKQorCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk5MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3R1Yi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgUFRfSU5ERVgoUkFYKQorI2RlZmluZSBTVFVCX01NQVBfTlIgX19OUl9tbWFwCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pIChvKQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyKQoreworCWxvbmcgcmV0OworCisJX19hc21fXygibW92cSAlMCwgJSVyc2k7ICIgOiA6ICJnIiAoYXJnMikgOiAiJXJzaSIpOworCV9fYXNtX18oIm1vdnEgJTAsICUlcmRpOyAiIDogOiAiZyIgKGFyZzEpIDogIiVyZGkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlcmF4Iik7CisJX19hc21fXygic3lzY2FsbDsiIDogOiA6ICIlcmF4IiwgIiVyMTEiLCAiJXJjeCIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmF4LCAlMDsgIiA6ICI9ZyIgKHJldCkgOik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwzKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMykKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJkeDsgIiA6IDogImciIChhcmczKSA6ICIlcmR4Iik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDIoc3lzY2FsbCwgYXJnMSwgYXJnMikpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCkKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXIxMDsgIiA6IDogImciIChhcmc0KSA6ICIlcjEwIik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDMoc3lzY2FsbCwgYXJnMSwgYXJnMiwgYXJnMykpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCwgbG9uZyBhcmc1LCBsb25nIGFyZzYpCit7CisJX19hc21fXygibW92cSAlMCwgJSVyOTsgIiA6IDogImciIChhcmc2KSA6ICIlcjkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXI4OyAiIDogOiAiZyIgKGFyZzUpIDogIiVyOCIpOworCXJldHVybihzdHViX3N5c2NhbGw0KHN5c2NhbGwsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYXBfbXlzZWxmKHZvaWQpCit7CisJX19hc20oImludDMiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmgKaW5kZXggZjY0ZWY3Ny4uMTdkN2VmMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RpbWVfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90aW1lX3VzZXIuaApAQCAtMTAsNiArMTAsNyBAQAogZXh0ZXJuIHZvaWQgc3dpdGNoX3RpbWVycyhpbnQgdG9fcmVhbCk7CiBleHRlcm4gdm9pZCBpZGxlX3NsZWVwKGludCBzZWNzKTsKIGV4dGVybiB2b2lkIGVuYWJsZV90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHByZXBhcmVfdGltZXIodm9pZCAqIHB0cik7CiBleHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGltZV9sb2NrKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGltZV91bmxvY2sodW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGxiLmggYi9hcmNoL3VtL2luY2x1ZGUvdGxiLmgKaW5kZXggZGExMDk3Mi4uYzZmOTYyOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RsYi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90bGIuaApAQCAtMzcsMzEgKzM3LDI1IEBACiBleHRlcm4gdm9pZCBtcHJvdGVjdF9rZXJuZWxfdm0oaW50IHcpOwogZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpOwogZXh0ZXJuIHZvaWQgZml4X3JhbmdlX2NvbW1vbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsIGludCBkYXRhLAotCQkJICAgICB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CiBleHRlcm4gaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIGV4dGVybiBpbnQgYWRkX21tYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkgICAgaW50IHIsIGludCB3LCBpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAotCQkgICAgaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLQkJICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAorICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogZXh0ZXJuIGludCBhZGRfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCSAgICAgIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwgaW50IGxhc3RfZmlsbGVkLAotCQkgICAgICBpbnQgZGF0YSwgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogZXh0ZXJuIGludCBhZGRfbXByb3RlY3QodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAogCQkJaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLQkJCWludCBsYXN0X2ZpbGxlZCwgaW50IGRhdGEsCi0JCQl2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RfZmlsbGVkLCB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKICNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDcxNWIwODMuLjM5NDJhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTY3LDYgKzY3LDEyIEBACiAgICAgKiguc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQogICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwogICAgICooLmdudS53YXJuaW5nKQorCisgICAgLiA9IEFMSUdOKDQwOTYpOworICAgIF9fc3lzY2FsbF9zdHViX3N0YXJ0ID0gLjsKKyAgICAqKC5fX3N5c2NhbGxfc3R1YiopCisgICAgX19zeXNjYWxsX3N0dWJfZW5kID0gLjsKKyAgICAuID0gQUxJR04oNDA5Nik7CiAgIH0gPTB4OTA5MDkwOTAKICAgLmZpbmkgICAgICAgICAgIDogewogICAgIEtFRVAgKCooLmZpbmkpKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IDQyMGU2ZDUuLmEyNGUzYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTM1Myw2ICszNTMsOCBAQAogCiAjZGVmaW5lIFBGTl9VUCh4KSAoKCh4KSArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUKQogCitleHRlcm4gaW50IF9fc3lzY2FsbF9zdHViX3N0YXJ0LCBfX2JpbmFyeV9zdGFydDsKKwogdm9pZCBzZXR1cF9waHlzbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9lbmQsCiAJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGhpZ2htZW0pCiB7CkBAIC0zNzEsNiArMzczLDEyIEBACiAJCWV4aXQoMSk7CiAJfQogCisJLyogU3BlY2lhbCBrbHVkZ2UgLSBUaGlzIHBhZ2Ugd2lsbCBiZSBtYXBwZWQgaW4gdG8gdXNlcnNwYWNlIHByb2Nlc3NlcworCSAqIGZyb20gcGh5c21lbV9mZCwgc28gaXQgbmVlZHMgdG8gYmUgd3JpdHRlbiBvdXQgdGhlcmUuCisJICovCisJb3Nfc2Vla19maWxlKHBoeXNtZW1fZmQsIF9fcGEoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSk7CisJb3Nfd3JpdGVfZmlsZShwaHlzbWVtX2ZkLCAmX19zeXNjYWxsX3N0dWJfc3RhcnQsIFBBR0VfU0laRSk7CisKIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0ocGZuLCBwZm4gKyBkZWx0YSk7CiAJZnJlZV9ib290bWVtKF9fcGEocmVzZXJ2ZV9lbmQpICsgYm9vdG1hcF9zaXplLAogCQkgICAgIGxlbiAtIGJvb3RtYXBfc2l6ZSAtIHJlc2VydmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDFiNWVmM2UuLmM0NWE2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKICNpbmNsdWRlICJtb2RlLmgiCisjaW5jbHVkZSAidGVtcGZpbGUuaCIKICNpZmRlZiBVTUxfQ09ORklHX01PREVfU0tBUwogI2luY2x1ZGUgInNrYXMuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgpAQCAtMzU4LDExICszNTksMTYgQEAKIAkJa2lsbCh0YXJnZXQsIFNJR0lPKTsKIH0KIAoraW50IHB0cmFjZV9mYXVsdGluZm8gPSAwOworaW50IHByb2NfbW0gPSAxOworCitleHRlcm4gdm9pZCAqX19zeXNjYWxsX3N0dWJfc3RhcnQsIF9fc3lzY2FsbF9zdHViX2VuZDsKKwogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KHZvaWQpCiB7CiAJc3RydWN0IHB0cmFjZV9mYXVsdGluZm8gZmk7Ci0JaW50IHBpZCwgbiwgcmV0ID0gMTsKKwlpbnQgcGlkLCBuOwogCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgdGhlIHNrYXMzIHBhdGNoIGluIHRoZSBob3N0Li4uIik7CiAJcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgpOwpAQCAtMzc0LDMzICszODAsMzEgQEAKIAkJZWxzZSB7CiAJCQlwZXJyb3IoIm5vdCBmb3VuZCIpOwogCQl9Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CisJCXB0cmFjZV9mYXVsdGluZm8gPSAxOwogCQlwcmludGYoImZvdW5kXG4iKTsKIAl9CiAKIAlpbml0X3JlZ2lzdGVycyhwaWQpOwogCXN0b3BfcHRyYWNlZF9jaGlsZChwaWQsIDEsIDEpOwotCi0JcmV0dXJuKHJldCk7CiB9CiAKIGludCBjYW5fZG9fc2thcyh2b2lkKQogewotCWludCByZXQgPSAxOwotCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgL3Byb2MvbW0uLi4iKTsKIAlpZiAob3NfYWNjZXNzKCIvcHJvYy9tbSIsIE9TX0FDQ19XX09LKSA8IDApIHsKKwkJcHJvY19tbSA9IDA7CiAJCXByaW50Zigibm90IGZvdW5kXG4iKTsKLQkJcmV0ID0gMDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CiAJCXByaW50ZigiZm91bmRcbiIpOwogCX0KIAotCXJldCA9IGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KCk7CiBvdXQ6Ci0JcmV0dXJuIHJldDsKKwljaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCgpOworCXJldHVybiAxOwogfQogI2Vsc2UKIGludCBjYW5fZG9fc2thcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKaW5kZXggZmY2OWM0Yi4uZDI5NmQ1NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCkBAIC0zLDExICszLDE0IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgOj0gZXhlY19rZXJuLm8gbWVtLm8gbWVtX3VzZXIubyBtbXUubyBwcm9jZXNzLm8gcHJvY2Vzc19rZXJuLm8gXAorb2JqLXkgOj0gY2xvbmUubyBleGVjX2tlcm4ubyBtZW0ubyBtZW1fdXNlci5vIG1tdS5vIHByb2Nlc3MubyBwcm9jZXNzX2tlcm4ubyBcCiAJc3lzY2FsbF9rZXJuLm8gc3lzY2FsbF91c2VyLm8gdGxiLm8gdHJhcF91c2VyLm8gdWFjY2Vzcy5vIFwKIAogc3ViZGlyLSA6PSB1dGlsCiAKLVVTRVJfT0JKUyA6PSBwcm9jZXNzLm8KK1VTRVJfT0JKUyA6PSBwcm9jZXNzLm8gY2xvbmUubwogCiBpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcworCisjIGNsb25lLm8gaXMgaW4gdGhlIHN0dWIsIHNvIGl0IGNhbid0IGJlIGJ1aWx0IHdpdGggcHJvZmlsaW5nCiskKG9iaikvY2xvbmUubyA6IGNfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1NWYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9jbG9uZS5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKworLyogVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIGFueQorICogZXh0cmFuZW91cyBnY2MgZmxhZ3MgKC1wZywgLWZwcm9maWxlLWFyY3MsIC1mdGVzdC1jb3ZlcmFnZSkgZGlzYWJsZWQKKyAqLwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX2Nsb25lX2hhbmRsZXIodm9pZCkKK3sKKwlsb25nIGVycjsKKwlzdHJ1Y3Qgc3R1Yl9kYXRhICpmcm9tID0gKHN0cnVjdCBzdHViX2RhdGEgKikgVU1MX0NPTkZJR19TVFVCX0RBVEE7CisKKwllcnIgPSBzdHViX3N5c2NhbGwyKF9fTlJfY2xvbmUsIENMT05FX1BBUkVOVCB8IENMT05FX0ZJTEVTIHwgU0lHQ0hMRCwKKwkJCSAgICBVTUxfQ09ORklHX1NUVUJfREFUQSArIFBBR0VfU0laRSAvIDIgLQorCQkJICAgIHNpemVvZih2b2lkICopKTsKKwlpZihlcnIgIT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw0KF9fTlJfcHRyYWNlLCBQVFJBQ0VfVFJBQ0VNRSwgMCwgMCwgMCk7CisJaWYoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHN0dWJfc3lzY2FsbDMoX19OUl9zZXRpdGltZXIsIElUSU1FUl9WSVJUVUFMLAorCQkJICAgIChsb25nKSAmZnJvbS0+dGltZXIsIDApOworCWlmKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw2KFNUVUJfTU1BUF9OUiwgVU1MX0NPTkZJR19TVFVCX0RBVEEsIFBBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfRklYRUQgfCBNQVBfU0hBUkVELAorCQkJICAgIGZyb20tPmZkLCBmcm9tLT5vZmZzZXQpOworIG91dDoKKwkvKiBzYXZlIGN1cnJlbnQgcmVzdWx0LiBQYXJlbnQ6IHBpZDsgY2hpbGQ6IHJldGNvZGUgb2YgbW1hcCAqLworCWZyb20tPmVyciA9IGVycjsKKwl0cmFwX215c2VsZigpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvZXhlY19rZXJuLmMKaW5kZXggYzZiNGQ1ZC4uNzdlZDdiYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2V4ZWNfa2Vybi5jCkBAIC0xOCw3ICsxOCw3IEBACiB2b2lkIGZsdXNoX3RocmVhZF9za2FzKHZvaWQpCiB7CiAJZm9yY2VfZmx1c2hfYWxsKCk7Ci0Jc3dpdGNoX21tX3NrYXMoY3VycmVudC0+bW0tPmNvbnRleHQuc2thcy5tbV9mZCk7CisgICAgICAgIHN3aXRjaF9tbV9za2FzKCZjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkKTsKIH0KIAogdm9pZCBzdGFydF90aHJlYWRfc2thcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlaXAsIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvbW1faWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX01NX0lEX0gKKyNkZWZpbmUgX19NTV9JRF9ICisKK3N0cnVjdCBtbV9pZCB7CisJdW5pb24geworCQlpbnQgbW1fZmQ7CisJCWludCBwaWQ7CisJfSB1OworCXVuc2lnbmVkIGxvbmcgc3RhY2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbXUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKaW5kZXggNGNkNjBkNy4uMjc4YjcyZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKQEAgLTYsMTAgKzYsMTUgQEAKICNpZm5kZWYgX19TS0FTX01NVV9ICiAjZGVmaW5lIF9fU0tBU19NTVVfSAogCisjaW5jbHVkZSAibW1faWQuaCIKKwogc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgewotCWludCBtbV9mZDsKKwlzdHJ1Y3QgbW1faWQgaWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlX3RhYmxlOwogfTsKIAorZXh0ZXJuIHZvaWQgc3dpdGNoX21tX3NrYXMoc3RydWN0IG1tX2lkICogbW1faWRwKTsKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaAppbmRleCA5NmI1MWRiLi5kOTgzZWE4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmgKQEAgLTYsOSArNiwxMSBAQAogI2lmbmRlZiBfX1NLQVNfSAogI2RlZmluZSBfX1NLQVNfSAogCisjaW5jbHVkZSAibW1faWQuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCiAKIGV4dGVybiBpbnQgdXNlcnNwYWNlX3BpZFtdOworZXh0ZXJuIGludCBwcm9jX21tLCBwdHJhY2VfZmF1bHRpbmZvOwogCiBleHRlcm4gdm9pZCBzd2l0Y2hfdGhyZWFkcyh2b2lkICptZSwgdm9pZCAqbmV4dCk7CiBleHRlcm4gdm9pZCB0aHJlYWRfd2FpdCh2b2lkICpzdywgdm9pZCAqZmIpOwpAQCAtMjIsMTYgKzI0LDE4IEBACiBleHRlcm4gdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCk7CiBleHRlcm4gdm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIoaW50IHNpZyk7CiBleHRlcm4gdm9pZCBoYW5kbGVfc3lzY2FsbCh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBtYXAoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsCi0JCWludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCk7Ci1leHRlcm4gaW50IHVubWFwKGludCBmZCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBwcm90ZWN0KGludCBmZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgCi0JCSAgIGludCByLCBpbnQgdywgaW50IHgpOworZXh0ZXJuIGludCBtYXAoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IHBoeXNfZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpOworZXh0ZXJuIGludCB1bm1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2V4dGVybiBpbnQgcHJvdGVjdChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgpOwogZXh0ZXJuIHZvaWQgdXNlcl9zaWduYWwoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MsIGludCBwaWQpOwogZXh0ZXJuIGludCBuZXdfbW0oaW50IGZyb20pOwotZXh0ZXJuIHZvaWQgc3RhcnRfdXNlcnNwYWNlKGludCBjcHUpOworZXh0ZXJuIGludCBzdGFydF91c2Vyc3BhY2UodW5zaWduZWQgbG9uZyBzdHViX3N0YWNrKTsKK2V4dGVybiBpbnQgY29weV9jb250ZXh0X3NrYXMwKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBwaWQpOwogZXh0ZXJuIHZvaWQgZ2V0X3NrYXNfZmF1bHRpbmZvKGludCBwaWQsIHN0cnVjdCBmYXVsdGluZm8gKiBmaSk7CiBleHRlcm4gbG9uZyBleGVjdXRlX3N5c2NhbGxfc2thcyh2b2lkICpyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3R1Yl9zdGFjayh2b2lkKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaCBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVkOTJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3N0dWItZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TVFVCX0RBVEFfSAorI2RlZmluZSBfX1NUVUJfREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdHJ1Y3Qgc3R1Yl9kYXRhIHsKKwlsb25nIG9mZnNldDsKKwlpbnQgZmQ7CisJc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKwlsb25nIGVycjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW0uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtLmMKaW5kZXggNDM4ZGIyZi4uMTQ3NDY2ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbS5jCkBAIC01LDcgKzUsOSBAQAogCiAjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCiAjaW5jbHVkZSAibGludXgvbW0uaCIKKyNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCisjaW5jbHVkZSAic2thcy5oIgogCiB1bnNpZ25lZCBsb25nIHNldF90YXNrX3NpemVzX3NrYXMoaW50IGFyZywgdW5zaWduZWQgbG9uZyAqaG9zdF9zaXplX291dCwgCiAJCQkJICB1bnNpZ25lZCBsb25nICp0YXNrX3NpemVfb3V0KQpAQCAtMTgsNyArMjAsOSBAQAogCSp0YXNrX3NpemVfb3V0ID0gQ09ORklHX0hPU1RfVEFTS19TSVpFOwogI2Vsc2UKIAkqaG9zdF9zaXplX291dCA9IHRvcDsKLQkqdGFza19zaXplX291dCA9IHRvcDsKKwlpZiAocHJvY19tbSAmJiBwdHJhY2VfZmF1bHRpbmZvKQorCQkqdGFza19zaXplX291dCA9IHRvcDsKKwllbHNlICp0YXNrX3NpemVfb3V0ID0gQ09ORklHX1NUVUJfU1RBUlQgJiBQR0RJUl9NQVNLOwogI2VuZGlmCiAJcmV0dXJuKCgodW5zaWduZWQgbG9uZykgc2V0X3Rhc2tfc2l6ZXNfc2thcykgJiB+MHhmZmZmZmYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jCmluZGV4IDEzMTBiZjEuLmIwOTgwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbV91c2VyLmMKQEAgLTMsMTAwICszLDE3MSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAicHJvY19tbS5oIgorI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKyNpbmNsdWRlICJza2FzLmgiCiAKLXZvaWQgbWFwKGludCBmZCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAotCSBpbnQgeCwgaW50IHBoeXNfZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpCitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNjYWxsX3N0dWIsIF9fc3lzY2FsbF9zdHViX3N0YXJ0OworCitleHRlcm4gdm9pZCB3YWl0X3N0dWJfZG9uZShpbnQgcGlkLCBpbnQgc2lnLCBjaGFyICogZm5hbWUpOworCitzdGF0aWMgbG9uZyBydW5fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgaW50IHN5c2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHByb2NfbW1fb3AgbWFwOwotCWludCBwcm90LCBuOworICAgICAgICBpbnQgbiwgcGlkID0gbW1faWRwLT51LnBpZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZWdzW01BWF9SRUdfTlJdOwogCi0JcHJvdCA9IChyID8gUFJPVF9SRUFEIDogMCkgfCAodyA/IFBST1RfV1JJVEUgOiAwKSB8IAotCQkoeCA/IFBST1RfRVhFQyA6IDApOworICAgICAgICBnZXRfc2FmZV9yZWdpc3RlcnMocmVncyk7CisgICAgICAgIHJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKSAmc3lzY2FsbF9zdHViIC0KKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CisgICAgICAgIC8qIFhYWCBEb24ndCBoYXZlIGEgZGVmaW5lIGZvciBzdGFydGluZyBhIHN5c2NhbGwgKi8KKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfTlJdID0gc3lzY2FsbDsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHMV0gPSBhcmdzWzBdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkcyXSA9IGFyZ3NbMV07CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzNdID0gYXJnc1syXTsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHNF0gPSBhcmdzWzNdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkc1XSA9IGFyZ3NbNF07CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzZdID0gYXJnc1s1XTsKKyAgICAgICAgbiA9IHB0cmFjZV9zZXRyZWdzKHBpZCwgcmVncyk7CisgICAgICAgIGlmKG4gPCAwKXsKKyAgICAgICAgICAgICAgICBwcmludGsoInJ1bl9zeXNjYWxsX3N0dWIgOiBQVFJBQ0VfU0VUUkVHUyBmYWlsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIG4pOworICAgICAgICAgICAgICAgIHJldHVybihuKTsKKyAgICAgICAgfQogCi0JbWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTU1BUCwKLQkJCQkgICAgIC51IAk9IAotCQkJCSAgICAgeyAubW1hcAk9IAotCQkJCSAgICAgICB7IC5hZGRyIAkJPSB2aXJ0LAotCQkJCQkgLmxlbgkJPSBsZW4sCi0JCQkJCSAucHJvdAkJPSBwcm90LAotCQkJCQkgLmZsYWdzCQk9IE1BUF9TSEFSRUQgfCAKLQkJCQkJICAgICAgICAgICAgICAgICAgTUFQX0ZJWEVELAotCQkJCQkgLmZkCQk9IHBoeXNfZmQsCi0JCQkJCSAub2Zmc2V0CT0gb2Zmc2V0Ci0JCQkJICAgICAgIH0gfSB9ICk7Ci0JbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtYXAsIHNpemVvZihtYXApKTsKLQlpZihuICE9IHNpemVvZihtYXApKSAKLQkJcHJpbnRrKCJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLW4pOworICAgICAgICB3YWl0X3N0dWJfZG9uZShwaWQsIDAsICJydW5fc3lzY2FsbF9zdHViIik7CisKKyAgICAgICAgcmV0dXJuKCooKHVuc2lnbmVkIGxvbmcgKikgbW1faWRwLT5zdGFjaykpOwogfQogCi1pbnQgdW5tYXAoaW50IGZkLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK2ludCBtYXAoc3RydWN0IG1tX2lkICptbV9pZHAsIHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBsZW4sCisgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIGludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KQogewotCXN0cnVjdCBwcm9jX21tX29wIHVubWFwOwotCWludCBuOworICAgICAgICBpbnQgcHJvdCwgbjsKIAotCXVubWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTVVOTUFQLAotCQkJCSAgICAgICAudSAJPSAKLQkJCQkgICAgICAgeyAubXVubWFwCT0gCi0JCQkJCSB7IC5hZGRyIAk9ICh1bnNpZ25lZCBsb25nKSBhZGRyLAotCQkJCQkgICAubGVuCQk9IGxlbiB9IH0gfSApOwotCW4gPSBvc193cml0ZV9maWxlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpOwotCWlmKG4gIT0gc2l6ZW9mKHVubWFwKSkgewotCQlpZihuIDwgMCkKLQkJCXJldHVybihuKTsKLQkJZWxzZSBpZihuID4gMCkKLQkJCXJldHVybigtRUlPKTsKLQl9CisgICAgICAgIHByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgICAgICh4ID8gUFJPVF9FWEVDIDogMCk7CiAKLQlyZXR1cm4oMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIG1hcDsKKyAgICAgICAgICAgICAgICBpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7CisgICAgICAgICAgICAgICAgbWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJCT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm1tYXAJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5hZGRyCT0gdmlydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCT0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm90CT0gcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MJPSBNQVBfU0hBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklYRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZkCT0gcGh5c19mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0PSBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9IH0gKTsKKyAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJm1hcCwgc2l6ZW9mKG1hcCkpOworICAgICAgICAgICAgICAgIGlmKG4gIT0gc2l6ZW9mKG1hcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm1hcCA6IC9wcm9jL21tIG1hcCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9uZyByZXM7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IHZpcnQsIGxlbiwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgcGh5c19mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1BUF9PRkZTRVQob2Zmc2V0KSB9OworCisgICAgICAgICAgICAgICAgcmVzID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIFNUVUJfTU1BUF9OUiwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYoKHZvaWQgKikgcmVzID09IE1BUF9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm1tYXAgc3R1YiBmYWlsZWQsIGVycm5vID0gJWRcbiIsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKIH0KIAotaW50IHByb3RlY3QoaW50IGZkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIAotCSAgICBpbnQgeCwgaW50IG11c3Rfc3VjY2VlZCkKK2ludCB1bm1hcChzdHJ1Y3QgbW1faWQgKm1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0Jc3RydWN0IHByb2NfbW1fb3AgcHJvdGVjdDsKLQlpbnQgcHJvdCwgbjsKKyAgICAgICAgaW50IG47CiAKLQlwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwgCi0JCSh4ID8gUFJPVF9FWEVDIDogMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIHVubWFwOworICAgICAgICAgICAgICAgIGludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKyAgICAgICAgICAgICAgICB1bm1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTVVOTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudQk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm11bm1hcAk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuYWRkcgk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4JCT0gbGVuIH0gfSB9ICk7CisgICAgICAgICAgICAgICAgbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZ1bm1hcCwgc2l6ZW9mKHVubWFwKSk7CisgICAgICAgICAgICAgICAgaWYobiAhPSBzaXplb2YodW5tYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKG4pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC1FSU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyAodW5zaWduZWQgbG9uZykgYWRkciwgbGVuLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH07CiAKLQlwcm90ZWN0ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTVBST1RFQ1QsCi0JCQkJICAgICAgIC51IAk9IAotCQkJCSAgICAgICB7IC5tcHJvdGVjdAk9IAotCQkJCQkgeyAuYWRkciAJPSAodW5zaWduZWQgbG9uZykgYWRkciwKLQkJCQkJICAgLmxlbgkJPSBsZW4sCi0JCQkJCSAgIC5wcm90CT0gcHJvdCB9IH0gfSApOworICAgICAgICAgICAgICAgIHJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX211bm1hcCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibXVubWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCByZXMpOworICAgICAgICB9CiAKLQluID0gb3Nfd3JpdGVfZmlsZShmZCwgJnByb3RlY3QsIHNpemVvZihwcm90ZWN0KSk7Ci0JaWYobiAhPSBzaXplb2YocHJvdGVjdCkpIHsKLQkJaWYobiA9PSAwKSByZXR1cm4oMCk7CisgICAgICAgIHJldHVybigwKTsKK30KIAotCQlpZihtdXN0X3N1Y2NlZWQpCi0JCQlwYW5pYygicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLW4pOworaW50IHByb3RlY3Qoc3RydWN0IG1tX2lkICptbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJICAgIGludCByLCBpbnQgdywgaW50IHgpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIHByb3RlY3Q7CisgICAgICAgIGludCBwcm90LCBuOwogCi0JCXJldHVybigtRUlPKTsKLQl9CisgICAgICAgIHByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgICAgICh4ID8gUFJPVF9FWEVDIDogMCk7CiAKLQlyZXR1cm4oMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIGludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NUFJPVEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudQk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAubXByb3RlY3QJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuYWRkcgk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCT0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvdAk9IHByb3QgfSB9IH0gKTsKKworICAgICAgICAgICAgICAgIG4gPSBvc193cml0ZV9maWxlKGZkLCAmcHJvdGVjdCwgc2l6ZW9mKHByb3RlY3QpKTsKKyAgICAgICAgICAgICAgICBpZihuICE9IHNpemVvZihwcm90ZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJwcm90ZWN0IGZhaWxlZCwgZXJyID0gJWQiLCAtbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgYWRkciwgbGVuLCBwcm90LCAwLCAwLCAwIH07CisKKyAgICAgICAgICAgICAgICByZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tcHJvdGVjdCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJtcHJvdGVjdCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybigwKTsKIH0KIAogdm9pZCBiZWZvcmVfbWVtX3NrYXModW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYwppbmRleCA2Y2I5YTZkLi5kMjMyZGFhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKQEAgLTMsNDYgKzMsMTQzIEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCiAjaW5jbHVkZSAibGludXgvbGlzdC5oIgogI2luY2x1ZGUgImxpbnV4L3NwaW5sb2NrLmgiCiAjaW5jbHVkZSAibGludXgvc2xhYi5oIgorI2luY2x1ZGUgImxpbnV4L2Vycm5vLmgiCisjaW5jbHVkZSAibGludXgvbW0uaCIKICNpbmNsdWRlICJhc20vY3VycmVudC5oIgogI2luY2x1ZGUgImFzbS9zZWdtZW50LmgiCiAjaW5jbHVkZSAiYXNtL21tdS5oIgorI2luY2x1ZGUgImFzbS9wZ2FsbG9jLmgiCisjaW5jbHVkZSAiYXNtL3BndGFibGUuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInNrYXMuaCIKIAorZXh0ZXJuIGludCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworc3RhdGljIGludCBpbml0X3N0dWJfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHByb2MsCisJCQkgdW5zaWduZWQgbG9uZyBrZXJuZWwpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcGdkID0gcGdkX29mZnNldChtbSwgcHJvYyk7CisJcHVkID0gcHVkX2FsbG9jKG1tLCBwZ2QsIHByb2MpOworCWlmICghcHVkKQorCQlnb3RvIG91dDsKKworCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBwcm9jKTsKKwlpZiAoIXBtZCkKKwkJZ290byBvdXRfcG1kOworCisJcHRlID0gcHRlX2FsbG9jX21hcChtbSwgcG1kLCBwcm9jKTsKKwlpZiAoIXB0ZSkKKwkJZ290byBvdXRfcHRlOworCisJLyogVGhlcmUncyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBza2FzMCBzdHViIHBhZ2VzLCBzdGFjaworCSAqIHJhbmRvbWl6YXRpb24sIGFuZCB0aGUgQlVHIGF0IHRoZSBlbmQgb2YgZXhpdF9tbWFwLiAgZXhpdF9tbWFwCisgICAgICAgICAqIGNoZWNrcyB0aGF0IHRoZSBudW1iZXIgb2YgcGFnZSB0YWJsZXMgZnJlZWQgaXMgdGhlIHNhbWUgYXMgaGFkCisgICAgICAgICAqIGJlZW4gYWxsb2NhdGVkLiAgSWYgdGhlIHN0YWNrIGlzIG9uIHRoZSBsYXN0IHBhZ2UgdGFibGUgcGFnZSwKKwkgKiB0aGVuIHRoZSBzdGFjayBwdGUgcGFnZSB3aWxsIGJlIGZyZWVkLCBhbmQgaWYgbm90LCBpdCB3b24ndC4gIFRvCisJICogYXZvaWQgaGF2aW5nIHRvIGtub3cgd2hlcmUgdGhlIHN0YWNrIGlzLCBvciBpZiB0aGUgcHJvY2VzcyBtYXBwZWQKKwkgKiBzb21ldGhpbmcgYXQgdGhlIHRvcCBvZiBpdHMgYWRkcmVzcyBzcGFjZSBmb3Igc29tZSBvdGhlciByZWFzb24sCisJICogd2Ugc2V0IFRBU0tfU0laRSB0byBlbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IHBhZ2UgdGFibGUuCisJICogVGhpcyBrZWVwcyBleGl0X21tYXAgb2ZmIHRoZSBsYXN0IHBhZ2UsIGJ1dCBpbnRyb2R1Y2VzIGEgbGVhaworCSAqIG9mIHRoYXQgcGFnZS4gIFNvLCB3ZSBoYW5nIG9udG8gaXQgaGVyZSBhbmQgZnJlZSBpdCBpbgorCSAqIGRlc3Ryb3lfY29udGV4dF9za2FzLgorCSAqLworCisgICAgICAgIG1tLT5jb250ZXh0LnNrYXMubGFzdF9wYWdlX3RhYmxlID0gcG1kX3BhZ2Vfa2VybmVsKCpwbWQpOworCisJKnB0ZSA9IG1rX3B0ZSh2aXJ0X3RvX3BhZ2Uoa2VybmVsKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCkpOworCSpwdGUgPSBwdGVfbWtleGVjKCpwdGUpOworCSpwdGUgPSBwdGVfd3Jwcm90ZWN0KCpwdGUpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlyZXR1cm4oMCk7CisKKyBvdXRfcG1kOgorCXB1ZF9mcmVlKHB1ZCk7Cisgb3V0X3B0ZToKKwlwbWRfZnJlZShwbWQpOworIG91dDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcmV0dXJuKC1FTk9NRU0pOworfQorCiBpbnQgaW5pdF9uZXdfY29udGV4dF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaW50IGZyb207CisJc3RydWN0IG1tX3N0cnVjdCAqY3VyX21tID0gY3VycmVudC0+bW07CisJc3RydWN0IG1tX2lkICpjdXJfbW1faWQgPSAmY3VyX21tLT5jb250ZXh0LnNrYXMuaWQ7CisJc3RydWN0IG1tX2lkICptbV9pZCA9ICZtbS0+Y29udGV4dC5za2FzLmlkOworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisJaW50IGZyb20sIHJldDsKIAotCWlmKChjdXJyZW50LT5tbSAhPSBOVUxMKSAmJiAoY3VycmVudC0+bW0gIT0gJmluaXRfbW0pKQotCQlmcm9tID0gY3VycmVudC0+bW0tPmNvbnRleHQuc2thcy5tbV9mZDsKLQllbHNlIGZyb20gPSAtMTsKKwlpZihwcm9jX21tKXsKKwkJaWYoKGN1cl9tbSAhPSBOVUxMKSAmJiAoY3VyX21tICE9ICZpbml0X21tKSkKKwkJCWZyb20gPSBjdXJfbW0tPmNvbnRleHQuc2thcy5pZC51Lm1tX2ZkOworCQllbHNlIGZyb20gPSAtMTsKIAotCW1tLT5jb250ZXh0LnNrYXMubW1fZmQgPSBuZXdfbW0oZnJvbSk7Ci0JaWYobW0tPmNvbnRleHQuc2thcy5tbV9mZCA8IDApewotCQlwcmludGsoImluaXRfbmV3X2NvbnRleHRfc2thcyAtIG5ld19tbSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgICBtbS0+Y29udGV4dC5za2FzLm1tX2ZkKTsKLQkJcmV0dXJuKG1tLT5jb250ZXh0LnNrYXMubW1fZmQpOworCQlyZXQgPSBuZXdfbW0oZnJvbSk7CisJCWlmKHJldCA8IDApeworCQkJcHJpbnRrKCJpbml0X25ld19jb250ZXh0X3NrYXMgLSBuZXdfbW0gZmFpbGVkLCAiCisJCQkgICAgICAgImVycm5vID0gJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1tX2lkLT51Lm1tX2ZkID0gcmV0OworCX0KKwllbHNlIHsKKwkJLyogVGhpcyB6ZXJvcyB0aGUgZW50cnkgdGhhdCBwZ2RfYWxsb2MgZGlkbid0LCBuZWVkZWQgc2luY2UKKwkJICogd2UgYXJlIGFib3V0IHRvIHJlaW5pdGlhbGl6ZSBpdCwgYW5kIHdhbnQgbW0ubnJfcHRlcyB0bworCQkgKiBiZSBhY2N1cmF0ZS4KKwkJICovCisJCW1tLT5wZ2RbVVNFUl9QVFJTX1BFUl9QR0RdID0gX19wZ2QoMCk7CisKKwkJcmV0ID0gaW5pdF9zdHViX3B0ZShtbSwgQ09ORklHX1NUVUJfQ09ERSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CisJCWlmKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IC1FTk9NRU07CisJCXN0YWNrID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZihzdGFjayA9PSAwKQorCQkJZ290byBvdXQ7CisJCW1tX2lkLT5zdGFjayA9IHN0YWNrOworCisJCXJldCA9IGluaXRfc3R1Yl9wdGUobW0sIENPTkZJR19TVFVCX0RBVEEsIHN0YWNrKTsKKwkJaWYocmV0KQorCQkJZ290byBvdXRfZnJlZTsKKworCQltbS0+bnJfcHRlcy0tOworCisJCWlmKChjdXJfbW0gIT0gTlVMTCkgJiYgKGN1cl9tbSAhPSAmaW5pdF9tbSkpCisJCQltbV9pZC0+dS5waWQgPSBjb3B5X2NvbnRleHRfc2thczAoc3RhY2ssCisJCQkJCQkJICBjdXJfbW1faWQtPnUucGlkKTsKKwkJZWxzZSBtbV9pZC0+dS5waWQgPSBzdGFydF91c2Vyc3BhY2Uoc3RhY2spOwogCX0KIAotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWZyZWVfcGFnZShtbV9pZC0+c3RhY2spOworIG91dDoKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGRlc3Ryb3lfY29udGV4dF9za2FzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCW9zX2Nsb3NlX2ZpbGUobW0tPmNvbnRleHQuc2thcy5tbV9mZCk7Ci19CisJc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgKm1tdSA9ICZtbS0+Y29udGV4dC5za2FzOwogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLworCWlmKHByb2NfbW0pCisJCW9zX2Nsb3NlX2ZpbGUobW11LT5pZC51Lm1tX2ZkKTsKKwllbHNlIHsKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3MobW11LT5pZC51LnBpZCwgMSk7CisJCWZyZWVfcGFnZShtbXUtPmlkLnN0YWNrKTsKKwkJZnJlZV9wYWdlKG1tdS0+bGFzdF9wYWdlX3RhYmxlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCmluZGV4IDc3M2NkMmIuLmJhNjcxZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAyLSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtMTMsNyArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgogI2luY2x1ZGUgInRpbWVfdXNlci5oIgpAQCAtMjEsMTMgKzIzLDE4IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAic2thcy5oIgorI2luY2x1ZGUgInN0dWItZGF0YS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCiAjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJzeXNkZXAvc3R1Yi5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAicHJvY19tbS5oIgogI2luY2x1ZGUgInNrYXNfcHRyYWNlLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCiAjaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogCiBpbnQgaXNfc2thc193aW5jaChpbnQgcGlkLCBpbnQgZmQsIHZvaWQgKmRhdGEpCkBAIC0zOSwyMCArNDYsNTUgQEAKIAlyZXR1cm4oMSk7CiB9CiAKK3ZvaWQgd2FpdF9zdHViX2RvbmUoaW50IHBpZCwgaW50IHNpZywgY2hhciAqIGZuYW1lKQoreworICAgICAgICBpbnQgbiwgc3RhdHVzLCBlcnI7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICggc2lnICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcHRyYWNlKFBUUkFDRV9DT05ULCBwaWQsIDAsIHNpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCIlcyA6IGNvbnRpbnVlIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGVycm5vKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lnID0gMDsKKworICAgICAgICAgICAgICAgIENBVENIX0VJTlRSKG4gPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CisgICAgICAgIH0gd2hpbGUoKG4gPj0gMCkgJiYgV0lGU1RPUFBFRChzdGF0dXMpICYmCisgICAgICAgICAgICAgICAgKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHVlRBTFJNKSk7CisKKyAgICAgICAgaWYoKG4gPCAwKSB8fCAhV0lGU1RPUFBFRChzdGF0dXMpIHx8CisgICAgICAgICAgIChXU1RPUFNJRyhzdGF0dXMpICE9IFNJR1VTUjEgJiYgV1NUT1BTSUcoc3RhdHVzICE9IFNJR1RSQVApKSl7CisgICAgICAgICAgICAgICAgcGFuaWMoIiVzIDogZmFpbGVkIHRvIHdhaXQgZm9yIFNJR1VTUjEvU0lHVFJBUCwgIgorICAgICAgICAgICAgICAgICAgICAgICJwaWQgPSAlZCwgbiA9ICVkLCBlcnJubyA9ICVkLCBzdGF0dXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBwaWQsIG4sIGVycm5vLCBzdGF0dXMpOworICAgICAgICB9Cit9CisKIHZvaWQgZ2V0X3NrYXNfZmF1bHRpbmZvKGludCBwaWQsIHN0cnVjdCBmYXVsdGluZm8gKiBmaSkKIHsKLQlpbnQgZXJyOworICAgICAgICBpbnQgZXJyOwogCi0gICAgICAgIGVyciA9IHB0cmFjZShQVFJBQ0VfRkFVTFRJTkZPLCBwaWQsIDAsIGZpKTsKLQlpZihlcnIpCi0gICAgICAgICAgICAgICAgcGFuaWMoImdldF9za2FzX2ZhdWx0aW5mbyAtIFBUUkFDRV9GQVVMVElORk8gZmFpbGVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKyAgICAgICAgaWYocHRyYWNlX2ZhdWx0aW5mbyl7CisgICAgICAgICAgICAgICAgZXJyID0gcHRyYWNlKFBUUkFDRV9GQVVMVElORk8sIHBpZCwgMCwgZmkpOworICAgICAgICAgICAgICAgIGlmKGVycikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJnZXRfc2thc19mYXVsdGluZm8gLSBQVFJBQ0VfRkFVTFRJTkZPIGZhaWxlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKIAotICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KLSAgICAgICAgaWYgKHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykgPCBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykpCi0gICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopZmkgKyBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykgLQotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKTsKKyAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSA8IHNpemVvZihzdHJ1Y3QgZmF1bHRpbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKWZpICsgc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHdhaXRfc3R1Yl9kb25lKHBpZCwgU0lHU0VHViwgImdldF9za2FzX2ZhdWx0aW5mbyIpOworCisgICAgICAgICAgICAgICAgLyogZmF1bHRpbmZvIGlzIHByZXBhcmVkIGJ5IHRoZSBzdHViLXNlZ3YtaGFuZGxlciBhdCBzdGFydCBvZgorICAgICAgICAgICAgICAgICAqIHRoZSBzdHViIHN0YWNrIHBhZ2UuIFdlIGp1c3QgaGF2ZSB0byBjb3B5IGl0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1lbWNweShmaSwgKHZvaWQgKiljdXJyZW50X3N0dWJfc3RhY2soKSwgc2l6ZW9mKCpmaSkpOworICAgICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9zZWd2KGludCBwaWQsIHVuaW9uIHVtbF9wdF9yZWdzICogcmVncykKQEAgLTkxLDExICsxMzMsNTYgQEAKIAloYW5kbGVfc3lzY2FsbChyZWdzKTsKIH0KIAotc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqYXJnKQorZXh0ZXJuIGludCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqc3RhY2spCiB7Ci0JaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoMCk7Ci0JZW5hYmxlX3RpbWVyKCk7CisJdm9pZCAqYWRkcjsKKwogCXB0cmFjZShQVFJBQ0VfVFJBQ0VNRSwgMCwgMCwgMCk7CisKKwlpbml0X25ld190aHJlYWRfc2lnbmFscygxKTsKKwllbmFibGVfdGltZXIoKTsKKworCWlmKCFwcm9jX21tKXsKKwkJLyogVGhpcyBoYXMgYSBwdGUsIGJ1dCBpdCBjYW4ndCBiZSBtYXBwZWQgaW4gd2l0aCB0aGUgdXN1YWwKKwkJICogdGxiX2ZsdXNoIG1lY2hhbmlzbSBiZWNhdXNlIHRoaXMgaXMgcGFydCBvZiB0aGF0IG1lY2hhbmlzbQorCQkgKi8KKwkJaW50IGZkOworCQlfX3U2NCBvZmZzZXQ7CisKKwkJZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygmX19zeXNjYWxsX3N0dWJfc3RhcnQpLCAmb2Zmc2V0KTsKKwkJYWRkciA9IG1tYXA2NCgodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfQ09ERSwgcGFnZV9zaXplKCksCisJCQkgICAgICBQUk9UX0VYRUMsIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZCwgb2Zmc2V0KTsKKwkJaWYoYWRkciA9PSBNQVBfRkFJTEVEKXsKKwkJCXByaW50aygibWFwcGluZyBtbWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGVycm5vKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZihzdGFjayAhPSBOVUxMKXsKKwkJCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoc3RhY2spLCAmb2Zmc2V0KTsKKwkJCWFkZHIgPSBtbWFwKCh2b2lkICopIFVNTF9DT05GSUdfU1RVQl9EQVRBLCBwYWdlX3NpemUoKSwKKwkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkgICAgTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwgZmQsIG9mZnNldCk7CisJCQlpZihhZGRyID09IE1BUF9GQUlMRUQpeworCQkJCXByaW50aygibWFwcGluZyBzZWdmYXVsdCBzdGFjayBmYWlsZWQsICIKKwkJCQkgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9CisJfQorCWlmKCFwdHJhY2VfZmF1bHRpbmZvICYmIChzdGFjayAhPSBOVUxMKSl7CisJCXVuc2lnbmVkIGxvbmcgdiA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBzdHViX3NlZ3ZfaGFuZGxlciAtCisJCQkJICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0OworCisJCXNldF9zaWdzdGFjaygodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfREFUQSwgcGFnZV9zaXplKCkpOworCQlzZXRfaGFuZGxlcihTSUdTRUdWLCAodm9pZCAqKSB2LCBTQV9PTlNUQUNLLAorCQkJICAgIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLAorCQkJICAgIFNJR1VTUjEsIC0xKTsKKwl9CisKIAlvc19zdG9wX3Byb2Nlc3Mob3NfZ2V0cGlkKCkpOwogCXJldHVybigwKTsKIH0KQEAgLTEwNSwxMSArMTkyLDExIEBACiAjZGVmaW5lIE5SX0NQVVMgMQogaW50IHVzZXJzcGFjZV9waWRbTlJfQ1BVU107CiAKLXZvaWQgc3RhcnRfdXNlcnNwYWNlKGludCBjcHUpCitpbnQgc3RhcnRfdXNlcnNwYWNlKHVuc2lnbmVkIGxvbmcgc3R1Yl9zdGFjaykKIHsKIAl2b2lkICpzdGFjazsKIAl1bnNpZ25lZCBsb25nIHNwOwotCWludCBwaWQsIHN0YXR1cywgbjsKKwlpbnQgcGlkLCBzdGF0dXMsIG4sIGZsYWdzOwogCiAJc3RhY2sgPSBtbWFwKE5VTEwsIFBBR0VfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKIAkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKQEAgLTExNyw4ICsyMDQsOSBAQAogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogbW1hcCBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CiAJc3AgPSAodW5zaWduZWQgbG9uZykgc3RhY2sgKyBQQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKTsKIAotCXBpZCA9IGNsb25lKHVzZXJzcGFjZV90cmFtcCwgKHZvaWQgKikgc3AsIAotCQkgICAgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsIE5VTEwpOworCWZsYWdzID0gQ0xPTkVfRklMRVMgfCBTSUdDSExEOworCWlmKHByb2NfbW0pIGZsYWdzIHw9IENMT05FX1ZNOworCXBpZCA9IGNsb25lKHVzZXJzcGFjZV90cmFtcCwgKHZvaWQgKikgc3AsIGZsYWdzLCAodm9pZCAqKSBzdHViX3N0YWNrKTsKIAlpZihwaWQgPCAwKQogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogY2xvbmUgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwogCkBAIC0xNDAsNyArMjI4LDcgQEAKIAlpZihtdW5tYXAoc3RhY2ssIFBBR0VfU0laRSkgPCAwKQogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogbXVubWFwIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCi0JdXNlcnNwYWNlX3BpZFtjcHVdID0gcGlkOworCXJldHVybihwaWQpOwogfQogCiB2b2lkIHVzZXJzcGFjZSh1bmlvbiB1bWxfcHRfcmVncyAqcmVncykKQEAgLTE3NCw3ICsyNjIsOSBAQAogCQlpZihXSUZTVE9QUEVEKHN0YXR1cykpewogCQkgIAlzd2l0Y2goV1NUT1BTSUcoc3RhdHVzKSl7CiAJCQljYXNlIFNJR1NFR1Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9zZWd2KHBpZCwgcmVncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFBUUkFDRV9GVUxMX0ZBVUxUSU5GTyB8fCAhcHRyYWNlX2ZhdWx0aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3NpZ25hbChTSUdTRUdWLCByZWdzLCBwaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGhhbmRsZV9zZWd2KHBpZCwgcmVncyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNJR1RSQVAgKyAweDgwOgogCQkJICAgICAgICBoYW5kbGVfdHJhcChwaWQsIHJlZ3MsIGxvY2FsX3VzaW5nX3N5c2VtdSk7CkBAIC0xOTQsNiArMjg0LDcgQEAKIAkJCSAgICAgICAgcHJpbnRrKCJ1c2Vyc3BhY2UgLSBjaGlsZCBzdG9wcGVkIHdpdGggc2lnbmFsICIKIAkJCQkgICAgICAgIiVkXG4iLCBXU1RPUFNJRyhzdGF0dXMpKTsKIAkJCX0KKwkJCXBpZCA9IHVzZXJzcGFjZV9waWRbMF07CiAJCQlpbnRlcnJ1cHRfZW5kKCk7CiAKIAkJCS8qIEF2b2lkIC1FUkVTVEFSVFNZUyBoYW5kbGluZyBpbiBob3N0ICovCkBAIC0yMDcsNiArMjk4LDY3IEBACiAjZGVmaW5lIElOSVRfSk1QX0hBTFQgMwogI2RlZmluZSBJTklUX0pNUF9SRUJPT1QgNAogCisKK2ludCBjb3B5X2NvbnRleHRfc2thczAodW5zaWduZWQgbG9uZyBuZXdfc3RhY2ssIGludCBwaWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrID0gY3VycmVudF9zdHViX3N0YWNrKCk7CisJc3RydWN0IHN0dWJfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIGN1cnJlbnRfc3RhY2s7CisJc3RydWN0IHN0dWJfZGF0YSAqY2hpbGRfZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIG5ld19zdGFjazsKKwlfX3U2NCBuZXdfb2Zmc2V0OworCWludCBuZXdfZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygodm9pZCAqKW5ld19zdGFjayksICZuZXdfb2Zmc2V0KTsKKworCS8qIHByZXBhcmUgb2Zmc2V0IGFuZCBmZCBvZiBjaGlsZCdzIHN0YWNrIGFzIGFyZ3VtZW50IGZvciBwYXJlbnQncworCSAqIGFuZCBjaGlsZCdzIG1tYXAyIGNhbGxzCisJICovCisJKmRhdGEgPSAoKHN0cnVjdCBzdHViX2RhdGEpIHsgLm9mZnNldAk9IE1NQVBfT0ZGU0VUKG5ld19vZmZzZXQpLAorCQkJCSAgICAgIC5mZAk9IG5ld19mZCwKKwkJCQkgICAgICAudGltZXIJPSAoKHN0cnVjdCBpdGltZXJ2YWwpCisJCQkJCSAgICAgICAgICAgeyB7IDAsIDEwMDAwMDAgLyBoeigpIH0sCisJCQkJCQkgICAgIHsgMCwgMTAwMDAwMCAvIGh6KCkgfX0pfSk7CisJZ2V0X3NhZmVfcmVnaXN0ZXJzKHJlZ3MpOworCisJLyogU2V0IHBhcmVudCdzIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gc3RhcnQgb2YgY2xvbmUtc3R1YiAqLworCXJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisJCQkJKHVuc2lnbmVkIGxvbmcpIHN0dWJfY2xvbmVfaGFuZGxlciAtCisJCQkJKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKwlyZWdzW1JFR1NfU1BfSU5ERVhdID0gVU1MX0NPTkZJR19TVFVCX0RBVEEgKyBQQUdFX1NJWkUgLQorCQlzaXplb2Yodm9pZCAqKTsKKwllcnIgPSBwdHJhY2Vfc2V0cmVncyhwaWQsIHJlZ3MpOworCWlmKGVyciA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgOiBQVFJBQ0VfU0VUUkVHUyBmYWlsZWQsICIKKwkJICAgICAgInBpZCA9ICVkLCBlcnJubyA9ICVkXG4iLCBwaWQsIGVycm5vKTsKKworCS8qIHNldCBhIHdlbGwga25vd24gcmV0dXJuIGNvZGUgZm9yIGRldGVjdGlvbiBvZiBjaGlsZCB3cml0ZSBmYWlsdXJlICovCisJY2hpbGRfZGF0YS0+ZXJyID0gMTIzNDU2Nzg7CisKKwkvKiBXYWl0LCB1bnRpbCBwYXJlbnQgaGFzIGZpbmlzaGVkIGl0cyB3b3JrOiByZWFkIGNoaWxkJ3MgcGlkIGZyb20KKwkgKiBwYXJlbnQncyBzdGFjaywgYW5kIGNoZWNrLCBpZiBiYWQgcmVzdWx0LgorCSAqLworCXdhaXRfc3R1Yl9kb25lKHBpZCwgMCwgImNvcHlfY29udGV4dF9za2FzMCIpOworCisJcGlkID0gZGF0YS0+ZXJyOworCWlmKHBpZCA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgLSBzdHViLXBhcmVudCByZXBvcnRzIGVycm9yICVkXG4iLAorCQkgICAgICBwaWQpOworCisJLyogV2FpdCwgdW50aWwgY2hpbGQgaGFzIGZpbmlzaGVkIHRvbzogcmVhZCBjaGlsZCdzIHJlc3VsdCBmcm9tCisJICogY2hpbGQncyBzdGFjayBhbmQgY2hlY2sgaXQuCisJICovCisJd2FpdF9zdHViX2RvbmUocGlkLCAtMSwgImNvcHlfY29udGV4dF9za2FzMCIpOworCWlmIChjaGlsZF9kYXRhLT5lcnIgIT0gVU1MX0NPTkZJR19TVFVCX0RBVEEpCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgLSBzdHViLWNoaWxkIHJlcG9ydHMgZXJyb3IgJWRcbiIsCisJCSAgICAgIGNoaWxkX2RhdGEtPmVycik7CisKKwlpZiAocHRyYWNlKFBUUkFDRV9PTERTRVRPUFRJT05TLCBwaWQsIE5VTEwsCisJCSAgICh2b2lkICopUFRSQUNFX09fVFJBQ0VTWVNHT09EKSA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgOiBQVFJBQ0VfU0VUT1BUSU9OUyBmYWlsZWQsICIKKwkJICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKworCXJldHVybiBwaWQ7Cit9CisKIHZvaWQgbmV3X3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqKnN3aXRjaF9idWZfcHRyLCB2b2lkICoqZm9ya19idWZfcHRyLAogCQl2b2lkICgqaGFuZGxlcikoaW50KSkKIHsKQEAgLTMzNCwyMSArNDg2LDE5IEBACiAJc2lnbG9uZ2ptcChpbml0aWFsX2ptcGJ1ZiwgSU5JVF9KTVBfUkVCT09UKTsKIH0KIAotdm9pZCBzd2l0Y2hfbW1fc2thcyhpbnQgbW1fZmQpCit2b2lkIHN3aXRjaF9tbV9za2FzKHN0cnVjdCBtbV9pZCAqbW1faWRwKQogewogCWludCBlcnI7CiAKICN3YXJuaW5nIG5lZWQgY3B1IHBpZCBpbiBzd2l0Y2hfbW1fc2thcwotCWVyciA9IHB0cmFjZShQVFJBQ0VfU1dJVENIX01NLCB1c2Vyc3BhY2VfcGlkWzBdLCAwLCBtbV9mZCk7Ci0JaWYoZXJyKQotCQlwYW5pYygic3dpdGNoX21tX3NrYXMgLSBQVFJBQ0VfU1dJVENIX01NIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJICAgICAgZXJybm8pOwotfQotCi12b2lkIGtpbGxfb2ZmX3Byb2Nlc3Nlc19za2FzKHZvaWQpCi17Ci0jd2FybmluZyBuZWVkIHRvIGxvb3Agb3ZlciB1c2Vyc3BhY2VfcGlkcyBpbiBraWxsX29mZl9wcm9jZXNzZXNfc2thcwotCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHVzZXJzcGFjZV9waWRbMF0sIDEpOworCWlmKHByb2NfbW0peworCQllcnIgPSBwdHJhY2UoUFRSQUNFX1NXSVRDSF9NTSwgdXNlcnNwYWNlX3BpZFswXSwgMCwKKwkJCSAgICAgbW1faWRwLT51Lm1tX2ZkKTsKKwkJaWYoZXJyKQorCQkJcGFuaWMoInN3aXRjaF9tbV9za2FzIC0gUFRSQUNFX1NXSVRDSF9NTSBmYWlsZWQsICIKKwkJCSAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJfQorCWVsc2UgdXNlcnNwYWNlX3BpZFswXSA9IG1tX2lkcC0+dS5waWQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYwppbmRleCAwYTdiOGFhLi5jYmFiYWIxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKQEAgLTE3NSw5ICsxNzUsMTIgQEAKIAlyZXR1cm4oMCk7CiB9CiAKK2V4dGVybiBpbnQgdXNlcnNwYWNlX3BpZFtdOworCiBpbnQgc3RhcnRfdW1sX3NrYXModm9pZCkKIHsKLQlzdGFydF91c2Vyc3BhY2UoMCk7CisJaWYocHJvY19tbSkKKwkJdXNlcnNwYWNlX3BpZFswXSA9IHN0YXJ0X3VzZXJzcGFjZSgwKTsKIAogCWluaXRfbmV3X3RocmVhZF9zaWduYWxzKDEpOwogCkBAIC0xOTksMyArMjAyLDMxIEBACiAjd2FybmluZyBOZWVkIHRvIGxvb2sgdXAgdXNlcnNwYWNlX3BpZCBieSBjcHUKIAlyZXR1cm4odXNlcnNwYWNlX3BpZFswXSk7CiB9CisKK3ZvaWQga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXModm9pZCkKK3sKKwlpZihwcm9jX21tKQorI3dhcm5pbmcgbmVlZCB0byBsb29wIG92ZXIgdXNlcnNwYWNlX3BpZHMgaW4ga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXMKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3ModXNlcnNwYWNlX3BpZFswXSwgMSk7CisJZWxzZSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwkJaW50IHBpZCwgbWU7CisKKwkJbWUgPSBvc19nZXRwaWQoKTsKKwkJZm9yX2VhY2hfcHJvY2VzcyhwKXsKKwkJCWlmKHAtPm1tID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXBpZCA9IHAtPm1tLT5jb250ZXh0LnNrYXMuaWQudS5waWQ7CisJCQlvc19raWxsX3B0cmFjZWRfcHJvY2VzcyhwaWQsIDEpOworCQl9CisJfQorfQorCit1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3R1Yl9zdGFjayh2b2lkKQoreworCWlmKGN1cnJlbnQtPm1tID09IE5VTEwpCisJCXJldHVybigwKTsKKworCXJldHVybihjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkLnN0YWNrKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3RsYi5jCmluZGV4IGI4YzVlNzE3Li42MjMwOTk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlICJsaW51eC9zdGRkZWYuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L21tLmgiCiAjaW5jbHVkZSAiYXNtL3BhZ2UuaCIKICNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgpAQCAtMTcsNyArMTgsNyBAQAogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidGxiLmgiCiAKLXN0YXRpYyB2b2lkIGRvX29wcyhpbnQgZmQsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBsYXN0KQorc3RhdGljIHZvaWQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKm9wOwogCWludCBpOwpAQCAtMjYsMTggKzI3LDE4IEBACiAJCW9wID0gJm9wc1tpXTsKIAkJc3dpdGNoKG9wLT50eXBlKXsKIAkJY2FzZSBNTUFQOgotCQkJbWFwKGZkLCBvcC0+dS5tbWFwLmFkZHIsIG9wLT51Lm1tYXAubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCZtbXUtPnNrYXMuaWQsIG9wLT51Lm1tYXAuYWRkciwgb3AtPnUubW1hcC5sZW4sCiAJCQkgICAgb3AtPnUubW1hcC5yLCBvcC0+dS5tbWFwLncsIG9wLT51Lm1tYXAueCwKIAkJCSAgICBvcC0+dS5tbWFwLmZkLCBvcC0+dS5tbWFwLm9mZnNldCk7CiAJCQlicmVhazsKIAkJY2FzZSBNVU5NQVA6Ci0JCQl1bm1hcChmZCwgKHZvaWQgKikgb3AtPnUubXVubWFwLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bm1hcCgmbW11LT5za2FzLmlkLCAodm9pZCAqKSBvcC0+dS5tdW5tYXAuYWRkciwKIAkJCSAgICAgIG9wLT51Lm11bm1hcC5sZW4pOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBST1RFQ1Q6Ci0JCQlwcm90ZWN0KGZkLCBvcC0+dS5tcHJvdGVjdC5hZGRyLCBvcC0+dS5tcHJvdGVjdC5sZW4sCi0JCQkJb3AtPnUubXByb3RlY3Quciwgb3AtPnUubXByb3RlY3QudywKLQkJCQlvcC0+dS5tcHJvdGVjdC54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3QoJm1tdS0+c2thcy5pZCwgb3AtPnUubXByb3RlY3QuYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnUubXByb3RlY3QubGVuLCBvcC0+dS5tcHJvdGVjdC5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tcHJvdGVjdC53LCBvcC0+dS5tcHJvdGVjdC54KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCJVbmtub3duIG9wIHR5cGUgJWQgaW4gZG9fb3BzXG4iLCBvcC0+dHlwZSk7CkBAIC00NiwxMiArNDcsMTUgQEAKIAl9CiB9CiAKK2V4dGVybiBpbnQgcHJvY19tbTsKKwogc3RhdGljIHZvaWQgZml4X3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSkKIHsKLSAgICAgICAgaW50IGZkID0gbW0tPmNvbnRleHQuc2thcy5tbV9mZDsKKyAgICAgICAgaWYoIXByb2NfbW0gJiYgKGVuZF9hZGRyID4gQ09ORklHX1NUVUJfU1RBUlQpKQorICAgICAgICAgICAgICAgIGVuZF9hZGRyID0gQ09ORklHX1NUVUJfU1RBUlQ7CiAKLSAgICAgICAgZml4X3JhbmdlX2NvbW1vbihtbSwgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGZvcmNlLCBmZCwgZG9fb3BzKTsKKyAgICAgICAgZml4X3JhbmdlX2NvbW1vbihtbSwgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGZvcmNlLCBkb19vcHMpOwogfQogCiB2b2lkIF9fZmx1c2hfdGxiX29uZV9za2FzKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTY5LDE3ICs3MywyMCBAQAogCiB2b2lkIGZsdXNoX3RsYl9tbV9za2FzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGxvbmcgZW5kOworCiAJLyogRG9uJ3QgYm90aGVyIGZsdXNoaW5nIGlmIHRoaXMgYWRkcmVzcyBzcGFjZSBpcyBhYm91dCB0byBiZQogICAgICAgICAgKiBkZXN0cm95ZWQuCiAgICAgICAgICAqLwogICAgICAgICBpZihhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBmaXhfcmFuZ2UobW0sIDAsIGhvc3RfdGFza19zaXplLCAwKTsKLSAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24oc3RhcnRfdm0sIGVuZF92bSk7CisJZW5kID0gcHJvY19tbSA/IHRhc2tfc2l6ZSA6IENPTkZJR19TVFVCX1NUQVJUOworICAgICAgICBmaXhfcmFuZ2UobW0sIDAsIGVuZCwgMCk7CiB9CiAKIHZvaWQgZm9yY2VfZmx1c2hfYWxsX3NrYXModm9pZCkKIHsKLSAgICAgICAgZml4X3JhbmdlKGN1cnJlbnQtPm1tLCAwLCBob3N0X3Rhc2tfc2l6ZSwgMSk7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwcm9jX21tID8gdGFza19zaXplIDogQ09ORklHX1NUVUJfU1RBUlQ7CisgICAgICAgIGZpeF9yYW5nZShjdXJyZW50LT5tbSwgMCwgZW5kLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RpbWUuYyBiL2FyY2gvdW0va2VybmVsL3RpbWUuYwppbmRleCBmODI5YjMwLi5jNDBiNjExIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGltZS5jCkBAIC00OCw2ICs0OCwxMyBAQAogCXNldF9pbnRlcnZhbChJVElNRVJfVklSVFVBTCk7CiB9CiAKK3ZvaWQgcHJlcGFyZV90aW1lcih2b2lkICogcHRyKQoreworCWludCB1c2VjID0gMTAwMDAwMC9oeigpOworCSooc3RydWN0IGl0aW1lcnZhbCAqKXB0ciA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIHVzZWMgfSwKKwkJCQkJCQkgeyAwLCB1c2VjIH19KTsKK30KKwogdm9pZCBkaXNhYmxlX3RpbWVyKHZvaWQpCiB7CiAJc3RydWN0IGl0aW1lcnZhbCBkaXNhYmxlID0gKChzdHJ1Y3QgaXRpbWVydmFsKSB7IHsgMCwgMCB9LCB7IDAsIDAgfX0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC90bGIuYwppbmRleCBlZGE0NzdlLi44M2VjOGQ0NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdGxiLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGxiLmMKQEAgLTE4LDEzICsxOCwxNSBAQAogI2RlZmluZSBBRERfUk9VTkQobiwgaW5jKSAoKChuKSArIChpbmMpKSAmIH4oKGluYykgLSAxKSkKIAogdm9pZCBmaXhfcmFuZ2VfY29tbW9uKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgaW50IGZvcmNlLCBpbnQgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgaW50IGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKQogewogICAgICAgICBwZ2RfdCAqbnBnZDsKICAgICAgICAgcHVkX3QgKm5wdWQ7CiAgICAgICAgIHBtZF90ICpucG1kOwogICAgICAgICBwdGVfdCAqbnB0ZTsKKyAgICAgICAgdW5pb24gbW1fY29udGV4dCAqbW11ID0gJm1tLT5jb250ZXh0OwogICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKICAgICAgICAgaW50IHIsIHcsIHg7CiAgICAgICAgIHN0cnVjdCBob3N0X3ZtX29wIG9wc1sxNl07CkBAIC00MCw3ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZF9hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9yY2UgfHwgcGdkX25ld3BhZ2UoKm5wZ2QpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIGVuZCAtIGFkZHIsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnZF9ta3VwdG9kYXRlKCpucGdkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1LDcgKzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwdWRfbmV3cGFnZSgqbnB1ZCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVkX21rdXB0b2RhdGUoKm5wdWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzAsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmRfYWRkcjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcmNlIHx8IHBtZF9uZXdwYWdlKCpucG1kKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4ID0gYWRkX211bm1hcChhZGRyLCBlbmQgLSBhZGRyLCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19vcHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWRfbWt1cHRvZGF0ZSgqbnBtZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC05MywyMSArOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbW1hcChhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZV92YWwoKm5wdGUpICYgUEFHRV9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSwgciwgdywgeCwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIFBBR0VfU0laRSwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSBpZihwdGVfbmV3cHJvdCgqbnB0ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tcHJvdGVjdChhZGRyLCBQQUdFX1NJWkUsIHIsIHcsIHgsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CiAKICAgICAgICAgICAgICAgICAqbnB0ZSA9IHB0ZV9ta3VwdG9kYXRlKCpucHRlKTsKICAgICAgICAgICAgICAgICBhZGRyICs9IFBBR0VfU0laRTsKICAgICAgICAgfQotICAgICAgICAoKmRvX29wcykoZGF0YSwgb3BzLCBvcF9pbmRleCk7CisgICAgICAgICgqZG9fb3BzKShtbXUsIG9wcywgb3BfaW5kZXgpOwogfQogCiBpbnQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0xOTUsNTEgKzE5Nyw2IEBACiAgICAgICAgIHJldHVybih1cGRhdGVkKTsKIH0KIAotdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotICAgICAgICBhZGRyZXNzICY9IFBBR0VfTUFTSzsKLSAgICAgICAgZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQotewotICAgICAgICBmbHVzaF90bGJfbW0oY3VycmVudC0+bW0pOwotfQotICAKLXZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfa2VybmVsX3JhbmdlX3R0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uLCBzdGFydCwgZW5kKTsKLX0KLQotdm9pZCBmbHVzaF90bGJfa2VybmVsX3ZtKHZvaWQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFKGZsdXNoX3RsYl9rZXJuZWxfdm1fdHQoKSwKLSAgICAgICAgICAgICAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24oc3RhcnRfdm0sIGVuZF92bSkpOwotfQotCi12b2lkIF9fZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0gICAgICAgIENIT09TRV9NT0RFX1BST0MoX19mbHVzaF90bGJfb25lX3R0LCBfX2ZsdXNoX3RsYl9vbmVfc2thcywgYWRkcik7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCAKLSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFX1BST0MoZmx1c2hfdGxiX3JhbmdlX3R0LCBmbHVzaF90bGJfcmFuZ2Vfc2thcywgdm1hLCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOwotfQotCi12b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfbW1fdHQsIGZsdXNoX3RsYl9tbV9za2FzLCBtbSk7Ci19Ci0KLXZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFKGZvcmNlX2ZsdXNoX2FsbF90dCgpLCBmb3JjZV9mbHVzaF9hbGxfc2thcygpKTsKLX0KLQogcGdkX3QgKnBnZF9vZmZzZXRfcHJvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogICAgICAgICByZXR1cm4ocGdkX29mZnNldChtbSwgYWRkcmVzcykpOwpAQCAtMjcwLDkgKzIyNyw5IEBACiB9CiAKIGludCBhZGRfbW1hcCh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLSAgICAgaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLSAgICAgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQorICAgICAgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKKyAgICAgICAgICAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKyAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCiB7CiAgICAgICAgIF9fdTY0IG9mZnNldDsKIAlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKQEAgLTI5Miw3ICsyNDksNyBAQAogCX0KIAogCWlmKGluZGV4ID09IGxhc3RfZmlsbGVkKXsKLQkJKCpkb19vcHMpKGRhdGEsIG9wcywgbGFzdF9maWxsZWQpOworCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKIAkJaW5kZXggPSAtMTsKIAl9CiAKQEAgLTMxMCw4ICsyNjcsOCBAQAogfQogCiBpbnQgYWRkX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLAotCSAgICAgICBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwgaW50IGRhdGEsCi0JICAgICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSkKKwkgICAgICAgaW50IGluZGV4LCBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKwkgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQogewogCXN0cnVjdCBob3N0X3ZtX29wICpsYXN0OwogCkBAIC0zMjUsNyArMjgyLDcgQEAKIAl9CiAKIAlpZihpbmRleCA9PSBsYXN0X2ZpbGxlZCl7Ci0JCSgqZG9fb3BzKShkYXRhLCBvcHMsIGxhc3RfZmlsbGVkKTsKKwkJKCpkb19vcHMpKG1tdSwgb3BzLCBsYXN0X2ZpbGxlZCk7CiAJCWluZGV4ID0gLTE7CiAJfQogCkBAIC0zMzcsOCArMjk0LDkgQEAKIH0KIAogaW50IGFkZF9tcHJvdGVjdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4LAotCQkgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LCBpbnQgbGFzdF9maWxsZWQsIGludCBkYXRhLAotCQkgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQorICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwKKyAgICAgICAgICAgICAgICAgdW5pb24gbW1fY29udGV4dCAqbW11LAorICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKmxhc3Q7CiAKQEAgLTM1NCw3ICszMTIsNyBAQAogCX0KIAogCWlmKGluZGV4ID09IGxhc3RfZmlsbGVkKXsKLQkJKCpkb19vcHMpKGRhdGEsIG9wcywgbGFzdF9maWxsZWQpOworCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKIAkJaW5kZXggPSAtMTsKIAl9CiAKQEAgLTM2NywzICszMjUsNDkgQEAKIAkJCQkJCSAgICAgIC54CT0geCB9IH0gfSk7CiAJcmV0dXJuKGluZGV4KTsKIH0KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworICAgICAgICBhZGRyZXNzICY9IFBBR0VfTUFTSzsKKyAgICAgICAgZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQoreworICAgICAgICBmbHVzaF90bGJfbW0oY3VycmVudC0+bW0pOworfQorCit2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisgICAgICAgIENIT09TRV9NT0RFX1BST0MoZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV90dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbiwgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2tlcm5lbF92bSh2b2lkKQoreworICAgICAgICBDSE9PU0VfTU9ERShmbHVzaF90bGJfa2VybmVsX3ZtX3R0KCksCisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHN0YXJ0X3ZtLCBlbmRfdm0pKTsKK30KKwordm9pZCBfX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKF9fZmx1c2hfdGxiX29uZV90dCwgX19mbHVzaF90bGJfb25lX3NrYXMsIGFkZHIpOworfQorCit2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfcmFuZ2VfdHQsIGZsdXNoX3RsYl9yYW5nZV9za2FzLCB2bWEsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKGZsdXNoX3RsYl9tbV90dCwgZmx1c2hfdGxiX21tX3NrYXMsIG1tKTsKK30KKwordm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCkKK3sKKyAgICAgICAgQ0hPT1NFX01PREUoZm9yY2VfZmx1c2hfYWxsX3R0KCksIGZvcmNlX2ZsdXNoX2FsbF9za2FzKCkpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC90bGIuYyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCmluZGV4IDIwMzIxNmEuLjJlZWZiNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ0bGIuaCIKIAotc3RhdGljIHZvaWQgZG9fb3BzKGludCB1bnVzZWQsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBsYXN0KQorc3RhdGljIHZvaWQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKm9wOwogCWludCBpOwpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgICAgIHBhbmljKCJmaXhfcmFuZ2UgZml4aW5nIHdyb25nIGFkZHJlc3Mgc3BhY2UsIGN1cnJlbnQgPSAweCVwIiwKICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKIAotICAgICAgICBmaXhfcmFuZ2VfY29tbW9uKG1tLCBzdGFydF9hZGRyLCBlbmRfYWRkciwgZm9yY2UsIDAsIGRvX29wcyk7CisgICAgICAgIGZpeF9yYW5nZV9jb21tb24obW0sIHN0YXJ0X2FkZHIsIGVuZF9hZGRyLCBmb3JjZSwgZG9fb3BzKTsKIH0KIAogYXRvbWljX3Qgdm1jaGFuZ2Vfc2VxID0gQVRPTUlDX0lOSVQoMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKaW5kZXggNjFkZmQ0Zi4uYjAzMzI2ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUwpAQCAtMTYsOCArMTYsOCBAQAogICBfX2JpbmFyeV9zdGFydCA9IC47CiAKICNpZmRlZiBNT0RFX1RUCi0gIC5yZW1hcF9kYXRhIDogeyBhcmNoL3VtL3N5cy1TVUJBUkNIL3VubWFwX2Zpbi5vICguZGF0YSAuYnNzKSB9Ci0gIC5yZW1hcCA6IHsgYXJjaC91bS9zeXMtU1VCQVJDSC91bm1hcF9maW4ubyAoLnRleHQpIH0KKyAgLnJlbWFwX2RhdGEgOiB7IFVOTUFQX1BBVEggKC5kYXRhIC5ic3MpIH0KKyAgLnJlbWFwIDogeyBVTk1BUF9QQVRIICgudGV4dCkgfQogCiAgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwogI2VuZGlmCkBAIC0zMCw2ICszMCw3IEBACiAJX2Vpbml0dGV4dCA9IC47CiAgIH0KICAgLiA9IEFMSUdOKDQwOTYpOworCiAgIC50ZXh0ICAgICAgOgogICB7CiAgICAgKigudGV4dCkKQEAgLTM5LDYgKzQwLDEyIEBACiAgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCiAgICAgKiguZ251Lndhcm5pbmcpCiAgICAgKiguZ251LmxpbmtvbmNlLnQqKQorCisgICAgLiA9IEFMSUdOKDQwOTYpOworICAgIF9fc3lzY2FsbF9zdHViX3N0YXJ0ID0gLjsKKyAgICAqKC5fX3N5c2NhbGxfc3R1YiopCisgICAgX19zeXNjYWxsX3N0dWJfZW5kID0gLjsKKyAgICAuID0gQUxJR04oNDA5Nik7CiAgIH0KIAogICAjaW5jbHVkZSAiYXNtL2NvbW1vbi5sZHMuUyIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3JlZ2lzdGVycy5jCmluZGV4IDlhMGFkMDkuLjMxMjVkMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYwpAQCAtMTIxLDYgKzEyMSwxMSBAQAogCQkgICAgICBlcnIpOwogfQogCit2b2lkIGdldF9zYWZlX3JlZ2lzdGVycyh1bnNpZ25lZCBsb25nICpyZWdzKQoreworCW1lbWNweShyZWdzLCBleGVjX3JlZ3MsIEhPU1RfRlJBTUVfU0laRSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Cit9CisKIC8qCiAgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KICAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCmluZGV4IDYyODZjOTcuLjQ0NDM4ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvcmVnaXN0ZXJzLmMKQEAgLTY5LDYgKzY5LDExIEBACiAJCSAgICAgIGVycik7CiB9CiAKK3ZvaWQgZ2V0X3NhZmVfcmVnaXN0ZXJzKHVuc2lnbmVkIGxvbmcgKnJlZ3MpCit7CisJbWVtY3B5KHJlZ3MsIGV4ZWNfcmVncywgSE9TVF9GUkFNRV9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKK30KKwogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgogICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CmRpZmYgLS1naXQgYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMgYi9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKaW5kZXggNzQ1OWQwOS4uMTdmMzA1YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCisrKyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpAQCAtMTYsNiArMTYsMTEgQEAKIGVuZGVmCiAKIAorIyBUaGUgc3R1YnMgYW5kIHVubWFwLm8gY2FuJ3QgdHJ5IHRvIGNhbGwgbWNvdW50IG9yIHVwZGF0ZSBiYXNpYyBibG9jayBkYXRhCitkZWZpbmUgdW5wcm9maWxlCisJJChwYXRzdWJzdCAtcGcsLCQocGF0c3Vic3QgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlLCwkKDEpKSkKK2VuZGVmCisKIHF1aWV0X2NtZF9tYWtlX2xpbmsgPSBTWU1MSU5LICRACiBjbWRfbWFrZV9saW5rICAgICAgID0gbG4gLXNmICQoc3JjdHJlZSkvYXJjaC8kKFNVQkFSQ0gpLyQoJChub3RkaXIgJEApLWRpcikvJChub3RkaXIgJEApICRACiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS51bm1hcCBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS51bm1hcAppbmRleCAzN2E4Zjk3Li44MDJkMDI3IDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUudW5tYXAKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnVubWFwCkBAIC0xMiw4ICsxMiw4IEBACiAKIHF1aWV0X2NtZF93cmFwbGQgPSBMRCAgICAgICRACiBkZWZpbmUgY21kX3dyYXBsZAotCSQoTEQpIC1yIC1vICQob2JqKS91bm1hcF90bXAubyAkPCAkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9bGliYy5hKTsgXAotCSQoT0JKQ09QWSkgJChvYmopL3VubWFwX3RtcC5vICRAIC1HIHN3aXRjaGVyb28KKwkkKExEKSAkKExERkxBR1MpIC1yIC1vICQob2JqKS91bm1hcF90bXAubyAkPCAkKHNoZWxsICQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtZmlsZS1uYW1lPWxpYmMuYSk7IFwKKwkkKE9CSkNPUFkpICQoVU1MX09CSkNPUFlGTEFHUykgJChvYmopL3VubWFwX3RtcC5vICRAIC1HIHN3aXRjaGVyb28KIGVuZGVmCiAKICQob2JqKS91bm1hcF9maW4ubyA6ICQob2JqKS91bm1hcC5vIEZPUkNFCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQppbmRleCAwOTViY2RiLi43N2MzYzRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmoteSA9IGJpdG9wcy5vIGJ1Z3MubyBjaGVja3N1bS5vIGRlbGF5Lm8gZmF1bHQubyBrc3ltcy5vIGxkdC5vIHB0cmFjZS5vIFwKLQlwdHJhY2VfdXNlci5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIHNpZ2NvbnRleHQubyBzeXNjYWxscy5vIHN5c3JxLm8gXAotCXN5c19jYWxsX3RhYmxlLm8KKwlwdHJhY2VfdXNlci5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIHNpZ2NvbnRleHQubyBzdHViLm8gc3R1Yl9zZWd2Lm8gXAorCXN5c2NhbGxzLm8gc3lzcnEubyBzeXNfY2FsbF90YWJsZS5vCiAKIG9iai0kKENPTkZJR19ISUdITUVNKSArPSBoaWdobWVtLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubwpAQCAtMTYsNiArMTYsMTQgQEAKIGhpZ2htZW0uYy1kaXIgPSBtbQogbW9kdWxlLmMtZGlyID0ga2VybmVsCiAKK1NUVUJfQ0ZMQUdTID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoY2FsbCB1bnByb2ZpbGUsJChVU0VSX0NGTEFHUykpCisKKyMgX2NmbGFncyB3b3JrcyB3aXRoIGtlcm5lbCBmaWxlcywgbm90IHdpdGggdXNlcnNwYWNlIG9uZXMsIGJ1dCBjX2ZsYWdzIGRvZXMsCisjIHdoeSBhc2sgd2h5PworJChvYmopL3N0dWJfc2Vndi5vIDogY19mbGFncyA9ICQoU1RVQl9DRkxBR1MpCisKKyQob2JqKS9zdHViLm8gOiBhX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKKwogc3ViZGlyLSA6PSB1dGlsCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnVubWFwCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jIGIvYXJjaC91bS9zeXMtaTM4Ni9sZHQuYwppbmRleCBkYzc1NWIwLi5iZDNjMzRhIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMKQEAgLTQsOTYgKzQsMTA2IEBACiAgKi8KIAogI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgorI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCiAjaW5jbHVkZSAibGludXgvc2xhYi5oIgorI2luY2x1ZGUgImxpbnV4L3R5cGVzLmgiCiAjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKICNpbmNsdWRlICJhc20vcHRyYWNlLmgiCisjaW5jbHVkZSAiYXNtL3NtcC5oIgorI2luY2x1ZGUgImFzbS9sZHQuaCIKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgogI2luY2x1ZGUgImtlcm4uaCIKKyNpbmNsdWRlICJtb2RlX2tlcm4uaCIKIAogI2lmZGVmIENPTkZJR19NT0RFX1RUCisKIGV4dGVybiBpbnQgbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCk7CiAKLS8qIFhYWCB0aGlzIG5lZWRzIGNvcHlfdG9fdXNlciBhbmQgY29weV9mcm9tX3VzZXIgKi8KLQotaW50IHN5c19tb2RpZnlfbGR0X3R0KGludCBmdW5jLCB2b2lkIF9fdXNlciAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKK3N0YXRpYyBpbnQgZG9fbW9kaWZ5X2xkdF90dChpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcHRyLCBieXRlY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJldHVybiBtb2RpZnlfbGR0KGZ1bmMsIHB0ciwgYnl0ZWNvdW50KTsKIH0KKwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTU9ERV9TS0FTCi1leHRlcm4gaW50IHVzZXJzcGFjZV9waWRbXTsKIAorI2luY2x1ZGUgInNrYXMuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgogCi1pbnQgc3lzX21vZGlmeV9sZHRfc2thcyhpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCitzdGF0aWMgaW50IGRvX21vZGlmeV9sZHRfc2thcyhpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKIHsKIAlzdHJ1Y3QgcHRyYWNlX2xkdCBsZHQ7Ci0Jdm9pZCAqYnVmOwotCWludCByZXMsIG47CisJdTMyIGNwdTsKKwlpbnQgcmVzOwogCi0JYnVmID0ga21hbGxvYyhieXRlY291bnQsIEdGUF9LRVJORUwpOwotCWlmKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4oLUVOT01FTSk7CisJbGR0ID0gKChzdHJ1Y3QgcHRyYWNlX2xkdCkgeyAuZnVuYwk9IGZ1bmMsCisJCQkJICAgICAucHRyCT0gcHRyLAorCQkJCSAgICAgLmJ5dGVjb3VudCA9IGJ5dGVjb3VudCB9KTsKIAotCXJlcyA9IDA7CisJY3B1ID0gZ2V0X2NwdSgpOworCXJlcyA9IHB0cmFjZShQVFJBQ0VfTERULCB1c2Vyc3BhY2VfcGlkW2NwdV0sIDAsICh1bnNpZ25lZCBsb25nKSAmbGR0KTsKKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gcmVzOworfQorI2VuZGlmCisKK2ludCBzeXNfbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCit7CisJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCWludCByZXMgPSAwOworCXZvaWQgKmJ1ZiA9IE5VTEw7CisJdm9pZCAqcCA9IE5VTEw7IC8qIFdoYXQgd2UgcGFzcyB0byBob3N0LiAqLwogCiAJc3dpdGNoKGZ1bmMpewogCWNhc2UgMToKLQljYXNlIDB4MTE6Ci0JCXJlcyA9IGNvcHlfZnJvbV91c2VyKGJ1ZiwgcHRyLCBieXRlY291bnQpOwotCQlicmVhazsKLQl9CisJY2FzZSAweDExOiAvKiB3cml0ZV9sZHQgKi8KKwkJLyogRG8gdGhpcyBjaGVjayBub3cgdG8gYXZvaWQgb3ZlcmZsb3dzLiAqLworCQlpZiAoYnl0ZWNvdW50ICE9IHNpemVvZihzdHJ1Y3QgdXNlcl9kZXNjKSkgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQlpZihyZXMgIT0gMCl7Ci0JCXJlcyA9IC1FRkFVTFQ7CisJCWlmKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBwdHIsIHNpemVvZihpbmZvKSkpIHsKKwkJCXJlcyA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXAgPSAmaW5mbzsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWNhc2UgMjogLyogcmVhZF9sZHQgKi8KKworCQkvKiBUaGUgdXNlIG9mIGluZm8gYXZvaWRzIGttYWxsb2Mgb24gdGhlIHdyaXRlIGNhc2UsIG5vdCBvbiB0aGUKKwkJICogcmVhZCBvbmUuICovCisJCWJ1ZiA9IGttYWxsb2MoYnl0ZWNvdW50LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlwID0gYnVmOworCWRlZmF1bHQ6CisJCXJlcyA9IC1FTk9TWVM7CiAJCWdvdG8gb3V0OwogCX0KIAotCWxkdCA9ICgoc3RydWN0IHB0cmFjZV9sZHQpIHsgLmZ1bmMJPSBmdW5jLAotCQkJCSAgICAgLnB0cgk9IGJ1ZiwKLQkJCQkgICAgIC5ieXRlY291bnQgPSBieXRlY291bnQgfSk7Ci0jd2FybmluZyBOZWVkIHRvIGxvb2sgdXAgdXNlcnNwYWNlX3BpZCBieSBjcHUKLQlyZXMgPSBwdHJhY2UoUFRSQUNFX0xEVCwgdXNlcnNwYWNlX3BpZFswXSwgMCwgKHVuc2lnbmVkIGxvbmcpICZsZHQpOworCXJlcyA9IENIT09TRV9NT0RFX1BST0MoZG9fbW9kaWZ5X2xkdF90dCwgZG9fbW9kaWZ5X2xkdF9za2FzLCBmdW5jLAorCQkJCXAsIGJ5dGVjb3VudCk7CiAJaWYocmVzIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2goZnVuYyl7CiAJY2FzZSAwOgogCWNhc2UgMjoKLQkJbiA9IHJlczsKLQkJcmVzID0gY29weV90b191c2VyKHB0ciwgYnVmLCBuKTsKLQkJaWYocmVzICE9IDApCisJCS8qIE1vZGlmeV9sZHQgd2FzIGZvciByZWFkaW5nIGFuZCByZXR1cm5lZCB0aGUgbnVtYmVyIG9mIHJlYWQKKwkJICogYnl0ZXMuKi8KKwkJaWYoY29weV90b191c2VyKHB0ciwgcCwgcmVzKSkKIAkJCXJlcyA9IC1FRkFVTFQ7Ci0JCWVsc2UgCi0JCQlyZXMgPSBuOwogCQlicmVhazsKIAl9CiAKLSBvdXQ6CitvdXQ6CiAJa2ZyZWUoYnVmKTsKLQlyZXR1cm4ocmVzKTsKKwlyZXR1cm4gcmVzOwogfQotI2VuZGlmCi0KLWludCBzeXNfbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCi17Ci0JcmV0dXJuKENIT09TRV9NT0RFX1BST0Moc3lzX21vZGlmeV9sZHRfdHQsIHN5c19tb2RpZnlfbGR0X3NrYXMsIGZ1bmMsIAotCQkJCXB0ciwgYnl0ZWNvdW50KSk7Ci19Ci0KLQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViLlMgYi9hcmNoL3VtL3N5cy1pMzg2L3N0dWIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjJjNzBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViLlMKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgorCisJLmdsb2JsIHN5c2NhbGxfc3R1YgorLnNlY3Rpb24gLl9fc3lzY2FsbF9zdHViLCAieCIKK3N5c2NhbGxfc3R1YjoKKwlpbnQgCSQweDgwCisJbW92CSVlYXgsIFVNTF9DT05GSUdfU1RVQl9EQVRBCisJaW50MwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MTQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLl9fc3lzY2FsbF9zdHViIikpKQorc3R1Yl9zZWd2X2hhbmRsZXIoaW50IHNpZykKK3sKKwlzdHJ1Y3Qgc2lnY29udGV4dCAqc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgKikgKCZzaWcgKyAxKTsKKworCUdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFVNTF9DT05GSUdfU1RVQl9EQVRBKSwKKwkJCSAgICAgIHNjKTsKKworCV9fYXNtX18oIm1vdmwgJTAsICUlZWF4IDsgaW50ICQweDgwIjogOiAiZyIgKF9fTlJfZ2V0cGlkKSk7CisJX19hc21fXygibW92bCAlJWVheCwgJSVlYnggOyBtb3ZsICUwLCAlJWVheCA7IG1vdmwgJTEsICUlZWN4IDsiCisJCSJpbnQgJDB4ODAiOiA6ICJnIiAoX19OUl9raWxsKSwgImciIChTSUdVU1IxKSk7CisJLyogUG9wIHRoZSBmcmFtZSBwb2ludGVyIGFuZCByZXR1cm4gYWRkcmVzcyBzaW5jZSB3ZSBuZWVkIHRvIGxlYXZlCisJICogdGhlIHN0YWNrIGluIGl0cyBvcmlnaW5hbCBmb3JtIHdoZW4gd2UgZG8gdGhlIHNpZ3JldHVybiBoZXJlLCBieQorCSAqIGhhbmQuCisJICovCisJX19hc21fXygicG9wbCAlJWVheCA7IHBvcGwgJSVlYXggOyBwb3BsICUlZWF4IDsgbW92bCAlMCwgJSVlYXggOyAiCisJCSJpbnQgJDB4ODAiIDogOiAiZyIgKF9fTlJfc2lncmV0dXJuKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMKaW5kZXggMTM2ODc1Mi4uMWIwYWQwZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvdW5tYXAuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAlpZihtdW5tYXAodG8sIHNpemUpIDwgMCl7CiAJCXJldHVybigtMSk7CiAJfQotCWlmKG1tYXAyKHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgIT0gdG8peworCWlmKG1tYXAyKHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgPT0gKHZvaWQqKSAtMSApewogCQlyZXR1cm4oLTEpOwogCX0KIAlpZihtdW5tYXAoZnJvbSwgc2l6ZSkgPCAwKXsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQppbmRleCAyYmM2ZjY4Li43NDg4MjA2IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogCiAjWFhYOiB3aHkgaW50byBsaWIteT8KIGxpYi15ID0gYml0b3BzLm8gYnVncy5vIGNzdW0tcGFydGlhbC5vIGRlbGF5Lm8gZmF1bHQubyBtZW0ubyBtZW1jcHkubyBcCi0JcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWdjb250ZXh0Lm8gc2lnbmFsLm8gXAotCXN5c2NhbGxzLm8gc3lzcnEubyB0aHVuay5vIHN5c2NhbGxfdGFibGUubworCXB0cmFjZS5vIHB0cmFjZV91c2VyLm8gc2VtYXBob3JlLm8gc2lnY29udGV4dC5vIHNpZ25hbC5vIHN0dWIubyBcCisJc3R1Yl9zZWd2Lm8gc3lzY2FsbHMubyBzeXNjYWxsX3RhYmxlLm8gc3lzcnEubyB0aHVuay5vCiAKIG9iai15IDo9IGtzeW1zLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyB1bV9tb2R1bGUubwpAQCAtMjgsNiArMjgsMTQgQEAKIHRodW5rLlMtZGlyID0gbGliCiBtb2R1bGUuYy1kaXIgPSBrZXJuZWwKIAorU1RVQl9DRkxBR1MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKKworIyBfY2ZsYWdzIHdvcmtzIHdpdGgga2VybmVsIGZpbGVzLCBub3Qgd2l0aCB1c2Vyc3BhY2Ugb25lcywgYnV0IGNfZmxhZ3MgZG9lcywKKyMgd2h5IGFzayB3aHk/CiskKG9iaikvc3R1Yl9zZWd2Lm8gOiBjX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKKworJChvYmopL3N0dWIubyA6IGFfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQorCiBzdWJkaXItIDo9IHV0aWwKIAogaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUudW5tYXAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaWduYWwuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaWduYWwuYwppbmRleCA3M2E3OTI2Li44ZmRhZWQwIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3NpZ25hbC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikKIAkJcm91bmRfZG93bihzdGFja190b3AgLSBzaXplb2Yoc3RydWN0IHJ0X3NpZ2ZyYW1lKSwgMTYpIC0gODsKLQkoKHVuc2lnbmVkIGNoYXIgKikgZnJhbWUpIC09IDEyODsKKyAgICAgICAgZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lICopICgodW5zaWduZWQgbG9uZykgZnJhbWUgLSAxMjgpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcCwgc2l6ZW9mKHN0cnVjdCBfZnBzdGF0ZSkpKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViLlMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisKKwkuZ2xvYmwgc3lzY2FsbF9zdHViCisuc2VjdGlvbiAuX19zeXNjYWxsX3N0dWIsICJ4Igorc3lzY2FsbF9zdHViOgorCXN5c2NhbGwKKwkvKiBXZSBkb24ndCBoYXZlIDY0LWJpdCBjb25zdGFudHMsIHNvIHRoaXMgY29uc3RydWN0cyB0aGUgYWRkcmVzcworCSAqIHdlIG5lZWQuCisJICovCisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBID4+IDMyKSwgJXJieAorCXNhbHEJJDMyLCAlcmJ4CisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBICYgMHhmZmZmZmZmZiksICVyY3gKKwlvcgklcmN4LCAlcmJ4CisJbW92cQklcmF4LCAoJXJieCkKKwlpbnQzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZDFmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgorI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQoreworCXN0cnVjdCB1Y29udGV4dCAqdWM7CisKKwlfX2FzbV9fKCJtb3ZxICUlcmR4LCAlMCIgOiAiPWciICh1YykgOik7CisgICAgICAgIEdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFVNTF9DT05GSUdfU1RVQl9EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Yy0+dWNfbWNvbnRleHQpOworCisJX19hc21fXygibW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIjogOiAiZyIgKF9fTlJfZ2V0cGlkKSk7CisJX19hc21fXygibW92cSAlJXJheCwgJSVyZGkgOyBtb3ZxICUwLCAlJXJheCA7IG1vdnEgJTEsICUlcnNpIDsiCisJCSJzeXNjYWxsIjogOiAiZyIgKF9fTlJfa2lsbCksICJnIiAoU0lHVVNSMSkpOworCS8qIFR3byBwb3BxcyB0byByZXN0b3JlIHRoZSBzdGFjayB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgZW50ZXJpbmcKKwkgKiB0aGUgaGFuZGxlciwgb25lIHBvcHMgdGhlIHJldHVybiBhZGRyZXNzLCB0aGUgb3RoZXIgcG9wcyB0aGUgZnJhbWUKKwkgKiBwb2ludGVyLgorCSAqLworCV9fYXNtX18oInBvcHEgJSVyYXggOyBwb3BxICUlcmF4IDsgbW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIiA6IDogImciCisJCShfX05SX3J0X3NpZ3JldHVybikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3VubWFwLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYwppbmRleCBiYzcwOTRjLi5mNGE0YmZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYwpAQCAtMTUsNyArMTUsNyBAQAogCWlmKG11bm1hcCh0bywgc2l6ZSkgPCAwKXsKIAkJcmV0dXJuKC0xKTsKIAl9Ci0JaWYobW1hcCh0bywgc2l6ZSwgcHJvdCwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgZmQsIDApICE9IHRvKXsKKwlpZihtbWFwKHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgPT0gKHZvaWQqKSAtMSl7CiAJCXJldHVybigtMSk7CiAJfQogCWlmKG11bm1hcChmcm9tLCBzaXplKSA8IDApewpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL0tjb25maWcgYi9hcmNoL3Y4NTAvS2NvbmZpZwppbmRleCAyN2ZlYmQ2Li44OWMwNTNiIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvS2NvbmZpZworKysgYi9hcmNoL3Y4NTAvS2NvbmZpZwpAQCAtMjUwLDYgKzI1MCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKQEAgLTI4Myw3ICsyODUsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGJiZDM0MjkuLmMzNjZhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Y4NTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEsOCArMSw4IEBACiAvKgogICogYXJjaC92ODUwL3ZtbGludXgubGRzLlMgLS0ga2VybmVsIGxpbmtlciBzY3JpcHQgZm9yIHY4NTAgcGxhdGZvcm1zCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMiwwMywwNCAgTkVDIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLDAzLDA0ICBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMDMsMDQsMDUgIE5FQyBFbGVjdHJvbmljcyBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoQykgMjAwMiwwMywwNCwwNSAgTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtNjEsNiArNjEsNyBAQAogCQkJKihfX2tjcmN0YWJfZ3BsKQkJCQkgICAgICBcCiAJCV9fX3N0b3BfX19rY3JjdGFiX2dwbCA9IC47CQkJCSAgICAgIFwKIAkJLyogQnVpbHQtaW4gbW9kdWxlIHBhcmFtZXRlcnMgKi8JCQkgICAgICBcCisJCS4gPSBBTElHTiAoNCkgOwkJCQkJCSAgICAgIFwKIAkJX19fc3RhcnRfX19wYXJhbSA9IC47CQkJCQkgICAgICBcCiAJCSooX19wYXJhbSkJCQkJCQkgICAgICBcCiAJCV9fX3N0b3BfX19wYXJhbSA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMgYi9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMKaW5kZXggZDMwOGI3Mi4uZmE1ODcyNiAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYwpAQCAtMTM4LDcgKzEzOCw4IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCisJCQkJCSAgdW5zaWduZWQgY2hhciAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IGQwOTQzN2IuLjRiODMyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtNTE1LDYgKzUxNSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlIGRyaXZlcnMvS2NvbmZpZwogCiBzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggOGE3Mzc5NC4uNDI4OTE1NiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTY1LDcgKzY1LDkgQEAKIGhlYWQteSA6PSBhcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5vIGFyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQubyBhcmNoL3g4Nl82NC9rZXJuZWwvaW5pdF90YXNrLm8KIAogbGlicy15IAkJCQkJKz0gYXJjaC94ODZfNjQvbGliLwotY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIGFyY2gveDg2XzY0L21tLworY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvbW0vIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvY3J5cHRvLwogY29yZS0kKENPTkZJR19JQTMyX0VNVUxBVElPTikJCSs9IGFyY2gveDg2XzY0L2lhMzIvCiBkcml2ZXJzLSQoQ09ORklHX1BDSSkJCQkrPSBhcmNoL3g4Nl82NC9wY2kvCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC94ODZfNjQvb3Byb2ZpbGUvCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9jcnlwdG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZDIwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMgCisjIHg4Nl82NC9jcnlwdG8vTWFrZWZpbGUgCisjIAorIyBBcmNoLXNwZWNpZmljIENyeXB0b0FQSSBtb2R1bGVzLgorIyAKKworb2JqLSQoQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0KSArPSBhZXMteDg2XzY0Lm8KKworYWVzLXg4Nl82NC15IDo9IGFlcy14ODZfNjQtYXNtLm8gYWVzLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2NyeXB0by9hZXMteDg2XzY0LWFzbS5TIGIvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy14ODZfNjQtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzY2JiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMteDg2XzY0LWFzbS5TCkBAIC0wLDAgKzEsMTg2IEBACisvKiBBRVMgKFJpam5kYWVsKSBpbXBsZW1lbnRhdGlvbiAoRklQUyBQVUIgMTk3KSBmb3IgeDg2XzY0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJlYXMgU3RlaW5tZXR6LCA8YXN0QGRvbWR2LmRlPgorICoKKyAqIExpY2Vuc2U6CisgKiBUaGlzIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBoZWFkZXIgZG93biB0byBhbmQKKyAqIGluY2x1ZGluZyB0aGlzIHNlbnRlbmNlIGlzIHJldGFpbmVkIGluIGZ1bGwuCisgKi8KKworLmV4dGVybiBhZXNfZnRfdGFiCisuZXh0ZXJuIGFlc19pdF90YWIKKy5leHRlcm4gYWVzX2ZsX3RhYgorLmV4dGVybiBhZXNfaWxfdGFiCisKKy50ZXh0CisKKyNkZWZpbmUgUjEJJXJheAorI2RlZmluZSBSMUUJJWVheAorI2RlZmluZSBSMVgJJWF4CisjZGVmaW5lIFIxSAklYWgKKyNkZWZpbmUgUjFMCSVhbAorI2RlZmluZSBSMgklcmJ4CisjZGVmaW5lIFIyRQklZWJ4CisjZGVmaW5lIFIyWAklYngKKyNkZWZpbmUgUjJICSViaAorI2RlZmluZSBSMkwJJWJsCisjZGVmaW5lIFIzCSVyY3gKKyNkZWZpbmUgUjNFCSVlY3gKKyNkZWZpbmUgUjNYCSVjeAorI2RlZmluZSBSM0gJJWNoCisjZGVmaW5lIFIzTAklY2wKKyNkZWZpbmUgUjQJJXJkeAorI2RlZmluZSBSNEUJJWVkeAorI2RlZmluZSBSNFgJJWR4CisjZGVmaW5lIFI0SAklZGgKKyNkZWZpbmUgUjRMCSVkbAorI2RlZmluZSBSNQklcnNpCisjZGVmaW5lIFI1RQklZXNpCisjZGVmaW5lIFI2CSVyZGkKKyNkZWZpbmUgUjZFCSVlZGkKKyNkZWZpbmUgUjcJJXJicAorI2RlZmluZSBSN0UJJWVicAorI2RlZmluZSBSOAklcjgKKyNkZWZpbmUgUjkJJXI5CisjZGVmaW5lIFIxMAklcjEwCisjZGVmaW5lIFIxMQklcjExCisKKyNkZWZpbmUgcHJvbG9ndWUoRlVOQyxCQVNFLEIxMjgsQjE5MixyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExKSBcCisJLmdsb2JhbAlGVU5DOwkJCVwKKwkudHlwZQlGVU5DLEBmdW5jdGlvbjsJCVwKKwkuYWxpZ24JODsJCQlcCitGVU5DOgltb3ZxCXIxLHIyOwkJCVwKKwltb3ZxCXIzLHI0OwkJCVwKKwlsZWFxCUJBU0UrNTIocjgpLHI5OwkJXAorCW1vdnEJcjEwLHIxMTsJCVwKKwltb3ZsCShyNykscjUgIyMgRTsJCVwKKwltb3ZsCTQocjcpLHIxICMjIEU7CQlcCisJbW92bAk4KHI3KSxyNiAjIyBFOwkJXAorCW1vdmwJMTIocjcpLHI3ICMjIEU7CQlcCisJbW92bAkocjgpLHIxMCAjIyBFOwkJXAorCXhvcmwJLTQ4KHI5KSxyNSAjIyBFOwlcCisJeG9ybAktNDQocjkpLHIxICMjIEU7CVwKKwl4b3JsCS00MChyOSkscjYgIyMgRTsJXAorCXhvcmwJLTM2KHI5KSxyNyAjIyBFOwlcCisJY21wbAkkMjQscjEwICMjIEU7CQlcCisJamIJQjEyODsJCQlcCisJbGVhcQkzMihyOSkscjk7CQlcCisJamUJQjE5MjsJCQlcCisJbGVhcQkzMihyOSkscjk7CisKKyNkZWZpbmUgZXBpbG9ndWUocjEscjIscjMscjQscjUscjYscjcscjgscjkpIFwKKwltb3ZxCXIxLHIyOwkJCVwKKwltb3ZxCXIzLHI0OwkJCVwKKwltb3ZsCXI1ICMjIEUsKHI5KTsJCVwKKwltb3ZsCXI2ICMjIEUsNChyOSk7CQlcCisJbW92bAlyNyAjIyBFLDgocjkpOwkJXAorCW1vdmwJcjggIyMgRSwxMihyOSk7CQlcCisJcmV0OworCisjZGVmaW5lIHJvdW5kKFRBQixPRkZTRVQscjEscjIscjMscjQscjUscjYscjcscjgscmEscmIscmMscmQpIFwKKwltb3Z6YmwJcjIgIyMgSCxyNSAjIyBFOwlcCisJbW92emJsCXIyICMjIEwscjYgIyMgRTsJXAorCW1vdmwJVEFCKzEwMjQoLHI1LDQpLHI1ICMjIEU7XAorCW1vdncJcjQgIyMgWCxyMiAjIyBYOwlcCisJbW92bAlUQUIoLHI2LDQpLHI2ICMjIEU7CVwKKwlyb2xsCSQxNixyMiAjIyBFOwkJXAorCXNocmwJJDE2LHI0ICMjIEU7CQlcCisJbW92emJsCXI0ICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyNCAjIyBMLHI0ICMjIEU7CVwKKwl4b3JsCU9GRlNFVChyOCkscmEgIyMgRTsJXAorCXhvcmwJT0ZGU0VUKzQocjgpLHJiICMjIEU7CVwKKwl4b3JsCVRBQiszMDcyKCxyNyw0KSxyNSAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyNCw0KSxyNiAjIyBFO1wKKwltb3Z6YmwJcjEgIyMgTCxyNyAjIyBFOwlcCisJbW92emJsCXIxICMjIEgscjQgIyMgRTsJXAorCW1vdmwJVEFCKzEwMjQoLHI0LDQpLHI0ICMjIEU7XAorCW1vdncJcjMgIyMgWCxyMSAjIyBYOwlcCisJcm9sbAkkMTYscjEgIyMgRTsJCVwKKwlzaHJsCSQxNixyMyAjIyBFOwkJXAorCXhvcmwJVEFCKCxyNyw0KSxyNSAjIyBFOwlcCisJbW92emJsCXIzICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyMyAjIyBMLHIzICMjIEU7CVwKKwl4b3JsCVRBQiszMDcyKCxyNyw0KSxyNCAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyMyw0KSxyNSAjIyBFO1wKKwltb3Z6YmwJcjEgIyMgSCxyNyAjIyBFOwlcCisJbW92emJsCXIxICMjIEwscjMgIyMgRTsJXAorCXNocmwJJDE2LHIxICMjIEU7CQlcCisJeG9ybAlUQUIrMzA3MigscjcsNCkscjYgIyMgRTtcCisJbW92bAlUQUIrMjA0OCgscjMsNCkscjMgIyMgRTtcCisJbW92emJsCXIxICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyMSAjIyBMLHIxICMjIEU7CVwKKwl4b3JsCVRBQisxMDI0KCxyNyw0KSxyNiAjIyBFO1wKKwl4b3JsCVRBQigscjEsNCkscjMgIyMgRTsJXAorCW1vdnpibAlyMiAjIyBILHIxICMjIEU7CVwKKwltb3Z6YmwJcjIgIyMgTCxyNyAjIyBFOwlcCisJc2hybAkkMTYscjIgIyMgRTsJCVwKKwl4b3JsCVRBQiszMDcyKCxyMSw0KSxyMyAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyNyw0KSxyNCAjIyBFO1wKKwltb3Z6YmwJcjIgIyMgSCxyMSAjIyBFOwlcCisJbW92emJsCXIyICMjIEwscjIgIyMgRTsJXAorCXhvcmwJT0ZGU0VUKzgocjgpLHJjICMjIEU7CVwKKwl4b3JsCU9GRlNFVCsxMihyOCkscmQgIyMgRTsJXAorCXhvcmwJVEFCKzEwMjQoLHIxLDQpLHIzICMjIEU7XAorCXhvcmwJVEFCKCxyMiw0KSxyNCAjIyBFOworCisjZGVmaW5lIG1vdmVfcmVncyhyMSxyMixyMyxyNCkgXAorCW1vdmwJcjMgIyMgRSxyMSAjIyBFOwlcCisJbW92bAlyNCAjIyBFLHIyICMjIEU7CisKKyNkZWZpbmUgZW50cnkoRlVOQyxCQVNFLEIxMjgsQjE5MikgXAorCXByb2xvZ3VlKEZVTkMsQkFTRSxCMTI4LEIxOTIsUjIsUjgsUjcsUjksUjEsUjMsUjQsUjYsUjEwLFI1LFIxMSkKKworI2RlZmluZSByZXR1cm4gZXBpbG9ndWUoUjgsUjIsUjksUjcsUjUsUjYsUjMsUjQsUjExKQorCisjZGVmaW5lIGVuY3J5cHRfcm91bmQoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjEsUjIsUjMsUjQsUjUsUjYsUjcsUjEwLFI1LFI2LFIzLFI0KSBcCisJbW92ZV9yZWdzKFIxLFIyLFI1LFI2KQorCisjZGVmaW5lIGVuY3J5cHRfZmluYWwoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjEsUjIsUjMsUjQsUjUsUjYsUjcsUjEwLFI1LFI2LFIzLFI0KQorCisjZGVmaW5lIGRlY3J5cHRfcm91bmQoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjIsUjEsUjQsUjMsUjYsUjUsUjcsUjEwLFI1LFI2LFIzLFI0KSBcCisJbW92ZV9yZWdzKFIxLFIyLFI1LFI2KQorCisjZGVmaW5lIGRlY3J5cHRfZmluYWwoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjIsUjEsUjQsUjMsUjYsUjUsUjcsUjEwLFI1LFI2LFIzLFI0KQorCisvKiB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKSAqLworCisJZW50cnkoYWVzX2VuY3J5cHQsMCxlbmMxMjgsZW5jMTkyKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtOTYpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC04MCkKK2VuYzE5MjoJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC02NCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTQ4KQorZW5jMTI4OgllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTMyKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtMTYpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCAgMCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDE2KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgMzIpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCA0OCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDY0KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgODApCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCA5NikKKwllbmNyeXB0X2ZpbmFsKGFlc19mbF90YWIsMTEyKQorCXJldHVybgorCisvKiB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKSAqLworCisJZW50cnkoYWVzX2RlY3J5cHQsMjQwLGRlYzEyOCxkZWMxOTIpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC05NikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTgwKQorZGVjMTkyOglkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTY0KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtNDgpCitkZWMxMjg6CWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtMzIpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC0xNikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsICAwKQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgMTYpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCAzMikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDQ4KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgNjQpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCA4MCkKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDk2KQorCWRlY3J5cHRfZmluYWwoYWVzX2lsX3RhYiwxMTIpCisJcmV0dXJuCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIEFFUyBDaXBoZXIgQWxnb3JpdGhtLgorICoKKyAqIEJhc2VkIG9uIEJyaWFuIEdsYWRtYW4ncyBjb2RlLgorICoKKyAqIExpbnV4IGRldmVsb3BlcnM6CisgKiAgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgorICogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgorICogIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KKyAqICBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8gMi41IEFQSSkuCisgKiAgQW5kcmVhcyBTdGVpbm1ldHogPGFzdEBkb21kdi5kZT4gKGFkYXB0ZWQgdG8geDg2XzY0IGFzc2VtYmxlcikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCBEciBCcmlhbiBHbGFkbWFuIDxicmdAZ2xhZG1hbi5tZS51az4sIFdvcmNlc3RlciwgVUsuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBTb21lIGNoYW5nZXMgZnJvbSB0aGUgR2xhZG1hbiB2ZXJzaW9uOgorICAgIHMvUklKTkRBRUwoZV9rZXkpL0VfS0VZL2cKKyAgICBzL1JJSk5EQUVMKGRfa2V5KS9EX0tFWS9nCisqLworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQUVTX01JTl9LRVlfU0laRQkxNgorI2RlZmluZSBBRVNfTUFYX0tFWV9TSVpFCTMyCisKKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUJCTE2CisKKy8qCisgKiAjZGVmaW5lIGJ5dGUoeCwgbnIpICgodW5zaWduZWQgY2hhcikoKHgpID4+IChucio4KSkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggYnl0ZShjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4geCA+PiAobiA8PCAzKTsKK30KKworI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCBfX2xlMzIgKikoeCkpCisKK3N0cnVjdCBhZXNfY3R4Cit7CisJdTMyIGtleV9sZW5ndGg7CisJdTMyIEVbNjBdOworCXUzMiBEWzYwXTsKK307CisKKyNkZWZpbmUgRV9LRVkgY3R4LT5FCisjZGVmaW5lIERfS0VZIGN0eC0+RAorCitzdGF0aWMgdTggcG93X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggbG9nX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggc2J4X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggaXNiX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyIHJjb190YWJbMTBdOwordTMyIGFlc19mdF90YWJbNF1bMjU2XTsKK3UzMiBhZXNfaXRfdGFiWzRdWzI1Nl07CisKK3UzMiBhZXNfZmxfdGFiWzRdWzI1Nl07Cit1MzIgYWVzX2lsX3RhYls0XVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4IGZfbXVsdCh1OCBhLCB1OCBiKQoreworCXU4IGFhID0gbG9nX3RhYlthXSwgY2MgPSBhYSArIGxvZ190YWJbYl07CisKKwlyZXR1cm4gcG93X3RhYltjYyArIChjYyA8IGFhID8gMSA6IDApXTsKK30KKworI2RlZmluZSBmZl9tdWx0KGEsIGIpIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQorCisjZGVmaW5lIGxzX2JveCh4KQkJCQlcCisJKGFlc19mbF90YWJbMF1bYnl0ZSh4LCAwKV0gXgkJXAorCSBhZXNfZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCVwKKwkgYWVzX2ZsX3RhYlsyXVtieXRlKHgsIDIpXSBeCQlcCisJIGFlc19mbF90YWJbM11bYnl0ZSh4LCAzKV0pCisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZW5fdGFicyh2b2lkKQoreworCXUzMiBpLCB0OworCXU4IHAsIHE7CisKKwkvKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMioqOCkgZmluaXRlIGZpZWxkIHdpdGgKKwkgICAweDAxMWIgYXMgbW9kdWxhciBwb2x5bm9taWFsIC0gdGhlIHNpbXBsZXN0IHByaW1pdGl2ZQorCSAgIHJvb3QgaXMgMHgwMywgdXNlZCBoZXJlIHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMgKi8KKworCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMjU2OyArK2kpIHsKKwkJcG93X3RhYltpXSA9ICh1OClwOworCQlsb2dfdGFiW3BdID0gKHU4KWk7CisKKwkJcCBePSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7CisJfQorCisJbG9nX3RhYlsxXSA9IDA7CisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDEwOyArK2kpIHsKKwkJcmNvX3RhYltpXSA9IHA7CisKKwkJcCA9IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IChpID8gcG93X3RhYlsyNTUgLSBsb2dfdGFiW2ldXSA6IDApOworCQlxID0gKChwID4+IDcpIHwgKHAgPDwgMSkpIF4gKChwID4+IDYpIHwgKHAgPDwgMikpOworCQlwIF49IDB4NjMgXiBxIF4gKChxID4+IDYpIHwgKHEgPDwgMikpOworCQlzYnhfdGFiW2ldID0gcDsKKwkJaXNiX3RhYltwXSA9ICh1OClpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlwID0gc2J4X3RhYltpXTsKKworCQl0ID0gcDsKKwkJYWVzX2ZsX3RhYlswXVtpXSA9IHQ7CisJCWFlc19mbF90YWJbMV1baV0gPSByb2wzMih0LCA4KTsKKwkJYWVzX2ZsX3RhYlsyXVtpXSA9IHJvbDMyKHQsIDE2KTsKKwkJYWVzX2ZsX3RhYlszXVtpXSA9IHJvbDMyKHQsIDI0KTsKKworCQl0ID0gKCh1MzIpZmZfbXVsdCgyLCBwKSkgfAorCQkgICAgKCh1MzIpcCA8PCA4KSB8CisJCSAgICAoKHUzMilwIDw8IDE2KSB8ICgodTMyKWZmX211bHQoMywgcCkgPDwgMjQpOworCisJCWFlc19mdF90YWJbMF1baV0gPSB0OworCQlhZXNfZnRfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19mdF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19mdF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisKKwkJcCA9IGlzYl90YWJbaV07CisKKwkJdCA9IHA7CisJCWFlc19pbF90YWJbMF1baV0gPSB0OworCQlhZXNfaWxfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19pbF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19pbF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisKKwkJdCA9ICgodTMyKWZmX211bHQoMTQsIHApKSB8CisJCSAgICAoKHUzMilmZl9tdWx0KDksIHApIDw8IDgpIHwKKwkJICAgICgodTMyKWZmX211bHQoMTMsIHApIDw8IDE2KSB8CisJCSAgICAoKHUzMilmZl9tdWx0KDExLCBwKSA8PCAyNCk7CisKKwkJYWVzX2l0X3RhYlswXVtpXSA9IHQ7CisJCWFlc19pdF90YWJbMV1baV0gPSByb2wzMih0LCA4KTsKKwkJYWVzX2l0X3RhYlsyXVtpXSA9IHJvbDMyKHQsIDE2KTsKKwkJYWVzX2l0X3RhYlszXVtpXSA9IHJvbDMyKHQsIDI0KTsKKwl9Cit9CisKKyNkZWZpbmUgc3Rhcl94KHgpICgoKHgpICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXiAoKCgoeCkgJiAweDgwODA4MDgwKSA+PiA3KSAqIDB4MWIpCisKKyNkZWZpbmUgaW1peF9jb2woeSwgeCkJCQlcCisJdSAgICA9IHN0YXJfeCh4KTsJCVwKKwl2ICAgID0gc3Rhcl94KHUpOwkJXAorCXcgICAgPSBzdGFyX3godik7CQlcCisJdCAgICA9IHcgXiAoeCk7CQkJXAorCSh5KSAgPSB1IF4gdiBeIHc7CQlcCisJKHkpIF49IHJvcjMyKHUgXiB0LCAgOCkgXglcCisJICAgICAgIHJvcjMyKHYgXiB0LCAxNikgXglcCisJICAgICAgIHJvcjMyKHQsIDI0KQorCisvKiBpbml0aWFsaXNlIHRoZSBrZXkgc2NoZWR1bGUgZnJvbSB0aGUgdXNlciBzdXBwbGllZCBrZXkgKi8KKworI2RlZmluZSBsb29wNChpKQkJCQkJXAorewkJCQkJCQlcCisJdCA9IHJvcjMyKHQsICA4KTsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07CVwKKwl0IF49IEVfS0VZWzQgKiBpXTsgICAgIEVfS0VZWzQgKiBpICsgNF0gPSB0OwlcCisJdCBePSBFX0tFWVs0ICogaSArIDFdOyBFX0tFWVs0ICogaSArIDVdID0gdDsJXAorCXQgXj0gRV9LRVlbNCAqIGkgKyAyXTsgRV9LRVlbNCAqIGkgKyA2XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzQgKiBpICsgM107IEVfS0VZWzQgKiBpICsgN10gPSB0OwlcCit9CisKKyNkZWZpbmUgbG9vcDYoaSkJCQkJCVwKK3sJCQkJCQkJXAorCXQgPSByb3IzMih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOwlcCisJdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZdID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0OwlcCisJdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OwlcCisJdCBePSBFX0tFWVs2ICogaSArIDVdOyBFX0tFWVs2ICogaSArIDExXSA9IHQ7CVwKK30KKworI2RlZmluZSBsb29wOChpKQkJCQkJXAorewkJCQkJCQlcCisJdCA9IHJvcjMyKHQsICA4KTsgOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsJXAorCXQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7CVwKKwl0IF49IEVfS0VZWzggKiBpICsgM107IEVfS0VZWzggKiBpICsgMTFdID0gdDsJXAorCXQgID0gRV9LRVlbOCAqIGkgKyA0XSBeIGxzX2JveCh0KTsJCVwKKwlFX0tFWVs4ICogaSArIDEyXSA9IHQ7CQkJCVwKKwl0IF49IEVfS0VZWzggKiBpICsgNV07IEVfS0VZWzggKiBpICsgMTNdID0gdDsJXAorCXQgXj0gRV9LRVlbOCAqIGkgKyA2XTsgRV9LRVlbOCAqIGkgKyAxNF0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDddOyBFX0tFWVs4ICogaSArIDE1XSA9IHQ7CVwKK30KKworc3RhdGljIGludCBhZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbiwKKwkJICAgICAgIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGksIGosIHQsIHUsIHYsIHc7CisKKwlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJRF9LRVlba2V5X2xlbiArIDI0XSA9IEVfS0VZWzBdID0gdTMyX2luKGluX2tleSk7CisJRF9LRVlba2V5X2xlbiArIDI1XSA9IEVfS0VZWzFdID0gdTMyX2luKGluX2tleSArIDQpOworCURfS0VZW2tleV9sZW4gKyAyNl0gPSBFX0tFWVsyXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKKwlEX0tFWVtrZXlfbGVuICsgMjddID0gRV9LRVlbM10gPSB1MzJfaW4oaW5fa2V5ICsgMTIpOworCisJc3dpdGNoIChrZXlfbGVuKSB7CisJY2FzZSAxNjoKKwkJdCA9IEVfS0VZWzNdOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKwkJCWxvb3A0KGkpOworCQlicmVhazsKKworCWNhc2UgMjQ6CisJCUVfS0VZWzRdID0gdTMyX2luKGluX2tleSArIDE2KTsKKwkJdCA9IEVfS0VZWzVdID0gdTMyX2luKGluX2tleSArIDIwKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJCWxvb3A2IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlFX0tFWVs0XSA9IHUzMl9pbihpbl9rZXkgKyAxNik7CisJCUVfS0VZWzVdID0gdTMyX2luKGluX2tleSArIDIwKTsKKwkJRV9LRVlbNl0gPSB1MzJfaW4oaW5fa2V5ICsgMjQpOworCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4oaW5fa2V5ICsgMjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQorCQkJbG9vcDgoaSk7CisJCWJyZWFrOworCX0KKworCURfS0VZWzBdID0gRV9LRVlba2V5X2xlbiArIDI0XTsKKwlEX0tFWVsxXSA9IEVfS0VZW2tleV9sZW4gKyAyNV07CisJRF9LRVlbMl0gPSBFX0tFWVtrZXlfbGVuICsgMjZdOworCURfS0VZWzNdID0gRV9LRVlba2V5X2xlbiArIDI3XTsKKworCWZvciAoaSA9IDQ7IGkgPCBrZXlfbGVuICsgMjQ7ICsraSkgeworCQlqID0ga2V5X2xlbiArIDI0IC0gKGkgJiB+MykgKyAoaSAmIDMpOworCQlpbWl4X2NvbChEX0tFWVtqXSwgRV9LRVlbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pOworZXh0ZXJuIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKTsKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJhZXMiLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhZXNfY3R4KSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQkJPQl7CisJCS5jaXBoZXIgPSB7CisJCQkuY2lhX21pbl9rZXlzaXplCT0JQUVTX01JTl9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlBRVNfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJICAgCT0gCWFlc19zZXRfa2V5LAorCQkJLmNpYV9lbmNyeXB0CSAJPQlhZXNfZW5jcnlwdCwKKwkJCS5jaWFfZGVjcnlwdAkgIAk9CWFlc19kZWNyeXB0CisJCX0KKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZXNfaW5pdCh2b2lkKQoreworCWdlbl90YWJzKCk7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWVzX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCittb2R1bGVfaW5pdChhZXNfaW5pdCk7Cittb2R1bGVfZXhpdChhZXNfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUmlqbmRhZWwgKEFFUykgQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9zeXNjYWxsMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMKaW5kZXggMDFkOGRiMS4uODE2YTNiOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9zeXNjYWxsMzIuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c2NhbGwzMi5jCkBAIC01Nyw2ICs1Nyw3IEBACiAJaW50IG5wYWdlcyA9IChWU1lTQ0FMTDMyX0VORCAtIFZTWVNDQUxMMzJfQkFTRSkgPj4gUEFHRV9TSElGVDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCWludCByZXQ7CiAKIAl2bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CiAJaWYgKCF2bWEpCkBAIC03OCw3ICs3OSwxMSBAQAogCXZtYS0+dm1fbW0gPSBtbTsKIAogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JaW5zZXJ0X3ZtX3N0cnVjdChtbSwgdm1hKTsKKwlpZiAoKHJldCA9IGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSkpKSB7CisJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7CisJCXJldHVybiByZXQ7CisJfQogCW1tLT50b3RhbF92bSArPSBucGFnZXM7CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwppbmRleCAxNTcxOTBkLi5kMjA2ZDdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKQEAgLTEwNjQsNyArMTA2NCw2IEBACiAKIHZvaWQgX19hcGljZGVidWdpbml0IHByaW50X1BJQyh2b2lkKQogewotCWV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOwogCXVuc2lnbmVkIGludCB2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDRlNjgwZjguLjVjNmRjNzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgpAQCAtNTEsOCArNTEsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1c19wcmV2LCBrcHJvYmVfb2xkX3JmbGFnc19wcmV2LCBrcHJvYmVfc2F2ZWRfcmZsYWdzX3ByZXY7CiBzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CiBzdGF0aWMgbG9uZyAqanByb2JlX3NhdmVkX3JzcDsKLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCk7Ci1zdGF0aWMgdm9pZCBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpOwogdm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKTsKIAogLyogY29weSBvZiB0aGUga2VybmVsIHN0YWNrIGF0IHRoZSBwcm9iZSBmaXJlIHRpbWUgKi8KQEAgLTI3NCw0OCArMjcyLDIzIEBACiAJCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CiB9CiAKLXN0cnVjdCB0YXNrX3N0cnVjdCAgKmFyY2hfZ2V0X2twcm9iZV90YXNrKHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKCgodW5zaWduZWQgbG9uZykgcHRyKSAmCi0JCQkJCSh+KFRIUkVBRF9TSVpFIC0xKSkpKS0+dGFzazsKLX0KLQogdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nICpzYXJhID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5yc3A7Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jc3RhdGljIHZvaWQgKm9yaWdfcmV0X2FkZHI7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwogCi0JLyoKLQkgKiBTYXZlIHRoZSByZXR1cm4gYWRkcmVzcyB3aGVuIHRoZSByZXR1cm4gcHJvYmUgaGl0cwotCSAqIHRoZSBmaXJzdCB0aW1lLCBhbmQgdXNlIGl0IHRvIHBvcHVsYXRlIHRoZSAoa3Jwcm9iZQotCSAqIGluc3RhbmNlKS0+cmV0X2FkZHIgZm9yIHN1YnNlcXVlbnQgcmV0dXJuIHByb2JlcyBhdAotCSAqIHRoZSBzYW1lIGFkZHJyZXNzIHNpbmNlIHN0YWNrIGFkZHJlc3Mgd291bGQgaGF2ZQotCSAqIHRoZSBrcmV0cHJvYmVfdHJhbXBvbGluZSBieSB0aGVuLgotCSAqLwotCWlmICgoKHZvaWQqKSAqc2FyYSkgIT0ga3JldHByb2JlX3RyYW1wb2xpbmUpCi0JCW9yaWdfcmV0X2FkZHIgPSAodm9pZCopICpzYXJhOworICAgICAgICBpZiAoKHJpID0gZ2V0X2ZyZWVfcnBfaW5zdChycCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByaS0+cnAgPSBycDsKKyAgICAgICAgICAgICAgICByaS0+dGFzayA9IGN1cnJlbnQ7CisJCXJpLT5yZXRfYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgKnNhcmE7CiAKLQlpZiAoKHJpID0gZ2V0X2ZyZWVfcnBfaW5zdChycCkpICE9IE5VTEwpIHsKLQkJcmktPnJwID0gcnA7Ci0JCXJpLT5zdGFja19hZGRyID0gc2FyYTsKLQkJcmktPnJldF9hZGRyID0gb3JpZ19yZXRfYWRkcjsKLQkJYWRkX3JwX2luc3QocmkpOwogCQkvKiBSZXBsYWNlIHRoZSByZXR1cm4gYWRkciB3aXRoIHRyYW1wb2xpbmUgYWRkciAqLwogCQkqc2FyYSA9ICh1bnNpZ25lZCBsb25nKSAma3JldHByb2JlX3RyYW1wb2xpbmU7Ci0JfSBlbHNlIHsKLQkJcnAtPm5taXNzZWQrKzsKLQl9Ci19CiAKLXZvaWQgYXJjaF9rcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCXdoaWxlICgocmkgPSBnZXRfcnBfaW5zdF90c2sodGspKSAhPSBOVUxMKSB7Ci0JCSooKHVuc2lnbmVkIGxvbmcgKikocmktPnN0YWNrX2FkZHIpKSA9Ci0JCQkJCSh1bnNpZ25lZCBsb25nKSByaS0+cmV0X2FkZHI7Ci0JCXJlY3ljbGVfcnBfaW5zdChyaSk7Ci0JfQorICAgICAgICAgICAgICAgIGFkZF9ycF9pbnN0KHJpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBycC0+bm1pc3NlZCsrOworICAgICAgICB9CiB9CiAKIC8qCkBAIC00MjgsMzYgKzQwMSw1OSBAQAogICovCiBpbnQgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXVuc2lnbmVkIGxvbmcgKnNhcmEgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcCAtIDE7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisgICAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSh1bnNpZ25lZCBsb25nKSZrcmV0cHJvYmVfdHJhbXBvbGluZTsKIAotCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHNhcmEpOwotCWhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHRzayk7CisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmksIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCWlmIChyaS0+c3RhY2tfYWRkciA9PSBzYXJhICYmIHJpLT5ycCkgewotCQkJaWYgKHJpLT5ycC0+aGFuZGxlcikKLQkJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQorCS8qCisJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KKwkgKgorCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgorCSAqICAgICAtIGluc3RhbmNlcyBhcmUgYWx3YXlzIGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisJICogICAgIC0gd2hlbiBtdWx0aXBsZSByZXR1cm4gcHJvYmVzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZQorICAgICAgICAgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLXZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCS8qIFJBIGFscmVhZHkgcG9wcGVkICovCi0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcCkgLSAxOworCQlpZiAocmktPnJwICYmIHJpLT5ycC0+aGFuZGxlcikKKwkJCXJpLT5ycC0+aGFuZGxlcihyaSwgcmVncyk7CiAKLQl3aGlsZSAoKHJpID0gZ2V0X3JwX2luc3Qoc2FyYSkpKSB7Ci0JCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKKwkJb3JpZ19yZXRfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKIAkJcmVjeWNsZV9ycF9pbnN0KHJpKTsKKworCQlpZiAob3JpZ19yZXRfYWRkcmVzcyAhPSB0cmFtcG9saW5lX2FkZHJlc3MpCisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgcmVhbCByZXR1cm4gYWRkcmVzcy4gQW55IG90aGVyCisJCQkgKiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzayBhcmUgZm9yCisJCQkgKiBvdGhlciBjYWxscyBkZWVwZXIgb24gdGhlIGNhbGwgc3RhY2sKKwkJCSAqLworCQkJYnJlYWs7CiAJfQotCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKworCUJVR19PTighb3JpZ19yZXRfYWRkcmVzcyB8fCAob3JpZ19yZXRfYWRkcmVzcyA9PSB0cmFtcG9saW5lX2FkZHJlc3MpKTsKKwlyZWdzLT5yaXAgPSBvcmlnX3JldF9hZGRyZXNzOworCisJdW5sb2NrX2twcm9iZXMoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUsIHdlIGFyZSB0ZWxsaW5nCisgICAgICAgICAqIGtwcm9iZV9oYW5kbGVyKCkgdGhhdCB3ZSBoYXZlIGhhbmRsZWQgdW5sb2NraW5nCisgICAgICAgICAqIGFuZCByZS1lbmFibGluZyBwcmVlbXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC01NTAsOCArNTQ2LDcgQEAKIAkJY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgMCk7CiAJfQogCi0JaWYgKGN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIgIT0gdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIpCi0JCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOwogCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfcmZsYWdzOwogCiAJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2F2ZWQga3Byb2JlcyB2YXJpYWJsZXMgYW5kIGNvbnRpbnVlLiAqLwpAQCAtNjgyLDExMSArNjc3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBrcHJvYmUtPmFpbnNuLmluc24gcG9pbnRzIHRvIHRoZSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBzaW5nbGUtc3RlcHBlZC4KLSAqIEJ5IGRlZmF1bHQgb24geDg2XzY0LCBwYWdlcyB3ZSBnZXQgZnJvbSBrbWFsbG9jIG9yIHZtYWxsb2MgYXJlIG5vdAotICogZXhlY3V0YWJsZS4gIFNpbmdsZS1zdGVwcGluZyBhbiBpbnN0cnVjdGlvbiBvbiBzdWNoIGEgcGFnZSB5aWVsZHMgYW4KLSAqIG9vcHMuICBTbyBpbnN0ZWFkIG9mIHN0b3JpbmcgdGhlIGluc3RydWN0aW9uIGNvcGllcyBpbiB0aGVpciByZXNwZWN0aXZlCi0gKiBrcHJvYmUgb2JqZWN0cywgd2UgYWxsb2NhdGUgYSBwYWdlLCBtYXAgaXQgZXhlY3V0YWJsZSwgYW5kIHN0b3JlIGFsbCB0aGUKLSAqIGluc3RydWN0aW9uIGNvcGllcyB0aGVyZS4gIChXZSBjYW4gYWxsb2NhdGUgYWRkaXRpb25hbCBwYWdlcyBpZiBzb21lYm9keQotICogaW5zZXJ0cyBhIGh1Z2UgbnVtYmVyIG9mIHByb2Jlcy4pICBFYWNoIHBhZ2UgY2FuIGhvbGQgdXAgdG8gSU5TTlNfUEVSX1BBR0UKLSAqIGluc3RydWN0aW9uIHNsb3RzLCBlYWNoIG9mIHdoaWNoIGlzIE1BWF9JTlNOX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkKLSAqIGJ5dGVzLgotICovCi0jZGVmaW5lIElOU05TX1BFUl9QQUdFIChQQUdFX1NJWkUvKE1BWF9JTlNOX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKQotc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgewotCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OwotCWtwcm9iZV9vcGNvZGVfdCAqaW5zbnM7CQkvKiBwYWdlIG9mIGluc3RydWN0aW9uIHNsb3RzICovCi0JY2hhciBzbG90X3VzZWRbSU5TTlNfUEVSX1BBR0VdOwotCWludCBudXNlZDsKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlIHRyYW1wb2xpbmVfcCA9IHsKKwkuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgJmtyZXRwcm9iZV90cmFtcG9saW5lLAorCS5wcmVfaGFuZGxlciA9IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcgogfTsKIAotc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGtwcm9iZV9pbnNuX3BhZ2VzOwotCi0vKioKLSAqIGdldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCi0gKiBXZSBhbGxvY2F0ZSBhbiBleGVjdXRhYmxlIHBhZ2UgaWYgdGhlcmUncyBubyByb29tIG9uIGV4aXN0aW5nIG9uZXMuCi0gKi8KLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKIHsKLQlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0KLQlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgewotCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7Ci0JCWlmIChraXAtPm51c2VkIDwgSU5TTlNfUEVSX1BBR0UpIHsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IElOU05TX1BFUl9QQUdFOyBpKyspIHsKLQkJCQlpZiAoIWtpcC0+c2xvdF91c2VkW2ldKSB7Ci0JCQkJCWtpcC0+c2xvdF91c2VkW2ldID0gMTsKLQkJCQkJa2lwLT5udXNlZCsrOwotCQkJCQlyZXR1cm4ga2lwLT5pbnNucyArIChpKk1BWF9JTlNOX1NJWkUpOwotCQkJCX0KLQkJCX0KLQkJCS8qIFN1cnByaXNlISAgTm8gdW51c2VkIHNsb3RzLiAgRml4IGtpcC0+bnVzZWQuICovCi0JCQlraXAtPm51c2VkID0gSU5TTlNfUEVSX1BBR0U7Ci0JCX0KLQl9Ci0KLQkvKiBBbGwgb3V0IG9mIHNwYWNlLiAgTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwYWdlLiBVc2Ugc2xvdCAwLiovCi0Ja2lwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtpcCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKgotCSAqIEZvciB0aGUgJXJpcC1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQgZml4dXBzIHRvIGJlIGRvYWJsZSwgd2UKLQkgKiBuZWVkIG91ciBpbnN0cnVjdGlvbiBjb3B5IHRvIGJlIHdpdGhpbiArLy0gMkdCIG9mIGFueSBkYXRhIGl0Ci0JICogbWlnaHQgYWNjZXNzIHZpYSAlcmlwLiAgVGhhdCBpcywgd2l0aGluIDJHQiBvZiB3aGVyZSB0aGUKLQkgKiBrZXJuZWwgaW1hZ2UgYW5kIGxvYWRlZCBtb2R1bGUgaW1hZ2VzIHJlc2lkZS4gIFNvIHdlIGFsbG9jYXRlCi0JICogYSBwYWdlIGluIHRoZSBtb2R1bGUgbG9hZGluZyBhcmVhLgotCSAqLwotCWtpcC0+aW5zbnMgPSBtb2R1bGVfYWxsb2MoUEFHRV9TSVpFKTsKLQlpZiAoIWtpcC0+aW5zbnMpIHsKLQkJa2ZyZWUoa2lwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOSVRfSExJU1RfTk9ERSgma2lwLT5obGlzdCk7Ci0JaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsICZrcHJvYmVfaW5zbl9wYWdlcyk7Ci0JbWVtc2V0KGtpcC0+c2xvdF91c2VkLCAwLCBJTlNOU19QRVJfUEFHRSk7Ci0Ja2lwLT5zbG90X3VzZWRbMF0gPSAxOwotCWtpcC0+bnVzZWQgPSAxOwotCXJldHVybiBraXAtPmluc25zOwotfQotCi0vKioKLSAqIGZyZWVfaW5zbl9zbG90KCkgLSBGcmVlIGluc3RydWN0aW9uIHNsb3Qgb2J0YWluZWQgZnJvbSBnZXRfaW5zbl9zbG90KCkuCi0gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCkKLXsKLQlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0KLQlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgewotCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7Ci0JCWlmIChraXAtPmluc25zIDw9IHNsb3QKLQkJICAgICYmIHNsb3QgPCBraXAtPmluc25zKyhJTlNOU19QRVJfUEFHRSpNQVhfSU5TTl9TSVpFKSkgewotCQkJaW50IGkgPSAoc2xvdCAtIGtpcC0+aW5zbnMpIC8gTUFYX0lOU05fU0laRTsKLQkJCWtpcC0+c2xvdF91c2VkW2ldID0gMDsKLQkJCWtpcC0+bnVzZWQtLTsKLQkJCWlmIChraXAtPm51c2VkID09IDApIHsKLQkJCQkvKgotCQkJCSAqIFBhZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIEZyZWUgaXQgdW5sZXNzCi0JCQkJICogaXQncyB0aGUgbGFzdCBvbmUuICBXZSBrZWVwIHRoZSBsYXN0IG9uZQotCQkJCSAqIHNvIGFzIG5vdCB0byBoYXZlIHRvIHNldCBpdCB1cCBhZ2FpbiB0aGUKLQkJCQkgKiBuZXh0IHRpbWUgc29tZWJvZHkgaW5zZXJ0cyBhIHByb2JlLgotCQkJCSAqLwotCQkJCWhsaXN0X2RlbCgma2lwLT5obGlzdCk7Ci0JCQkJaWYgKGhsaXN0X2VtcHR5KCZrcHJvYmVfaW5zbl9wYWdlcykpIHsKLQkJCQkJSU5JVF9ITElTVF9OT0RFKCZraXAtPmhsaXN0KTsKLQkJCQkJaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsCi0JCQkJCQkma3Byb2JlX2luc25fcGFnZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZHVsZV9mcmVlKE5VTEwsIGtpcC0+aW5zbnMpOwotCQkJCQlrZnJlZShraXApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCX0KKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMWQ5MTI3MS4uNzU3N2Y5ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00ODIsNiArNDgyLDMzIEBACiB9CiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0CisgKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCisJCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKKworCS8qCisJICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKKwkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgorCSAqLworCXByZXYgPSBwcmV2X3AtPnRocmVhZF9pbmZvOworCW5leHQgPSBuZXh0X3AtPnRocmVhZF9pbmZvOworCisJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpIHx8IGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCS8qIHNsb3cgcGF0aCBoZXJlICovCisJCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgorCQkgICAgIWhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCQl3cml0ZV9jcjQocmVhZF9jcjQoKSAmIH5YODZfQ1I0X1RTRCk7CisJCX0gZWxzZSBpZiAoIWhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpICYmCisJCQkgICBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkKKwkJCXdyaXRlX2NyNChyZWFkX2NyNCgpIHwgWDg2X0NSNF9UU0QpOworCX0KK30KKworLyoKICAqIFRoaXMgc3BlY2lhbCBtYWNybyBjYW4gYmUgdXNlZCB0byBsb2FkIGEgZGVidWdnaW5nIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgbG9hZGRlYnVnKHRocmVhZCxyKSBzZXRfZGVidWcodGhyZWFkLT5kZWJ1Z3JlZyAjIyByLCByKQpAQCAtNTk5LDYgKzYyNiw4IEBACiAJCX0KIAl9CiAKKwlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CisKIAlyZXR1cm4gcHJldl9wOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGIwMmQ5MjEuLjVmZDAzMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC0xMDc2LDYgKzEwNzYsMTAgQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRQogCW1jaGVja19pbml0KGMpOwogI2VuZGlmCisJaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEpCisJCW10cnJfYnBfaW5pdCgpOworCWVsc2UKKwkJbXRycl9hcF9pbml0KCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlpZiAoYyAhPSAmYm9vdF9jcHVfZGF0YSkKIAkJbnVtYV9hZGRfY3B1KGMgLSBjcHVfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmQuYwppbmRleCA2YzBmNDAyZS4uMDYxMjY0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCkBAIC0xMTksNiArMTE5LDcgQEAKIAlmaXhfcHJvY2Vzc29yX2NvbnRleHQoKTsKIAogCWRvX2ZwdV9lbmQoKTsKKwltdHJyX2FwX2luaXQoKTsKIH0KIAogdm9pZCByZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3MzM4OWY1Li4yYTk0ZjliIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNTYsMTAgKzU2LDE0IEBACiAgIC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewogCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAgIH0KKyAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKKyAgCSooLmRhdGEucmVhZF9tb3N0bHkpCisgIH0KIAogI2RlZmluZSBWU1lTQ0FMTF9BRERSICgtMTAqMTAyNCoxMDI0KQotI2RlZmluZSBWU1lTQ0FMTF9QSFlTX0FERFIgKChMT0FEQUREUiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgKyBTSVpFT0YoLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpICsgNDA5NSkgJiB+KDQwOTUpKQotI2RlZmluZSBWU1lTQ0FMTF9WSVJUX0FERFIgKChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSArIFNJWkVPRiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgKyA0MDk1KSAmIH4oNDA5NSkpCisjZGVmaW5lIFZTWVNDQUxMX1BIWVNfQUREUiAoKExPQURBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSArIFNJWkVPRiguZGF0YS5yZWFkX21vc3RseSkgKyA0MDk1KSAmIH4oNDA5NSkpCisjZGVmaW5lIFZTWVNDQUxMX1ZJUlRfQUREUiAoKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpICsgU0laRU9GKC5kYXRhLnJlYWRfbW9zdGx5KSArIDQwOTUpICYgfig0MDk1KSkKIAogI2RlZmluZSBWTE9BRF9PRkZTRVQgKFZTWVNDQUxMX0FERFIgLSBWU1lTQ0FMTF9QSFlTX0FERFIpCiAjZGVmaW5lIFZMT0FEKHgpIChBRERSKHgpIC0gVkxPQURfT0ZGU0VUKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvcGNpL21tY29uZmlnLmMgYi9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYwppbmRleCBiNjkzYzIzLi42NTdlODhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYwpAQCAtNywyNSArNyw1MCBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJwY2kuaCIKIAogI2RlZmluZSBNTUNPTkZJR19BUEVSX1NJWkUgKDI1NioxMDI0KjEwMjQpCiAKLS8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNTUNPTkZJRyBhcGVydHVyZS4gIFNldCBmcm9tIEFDUEkgdGFibGVzLiAqLwotdTMyIHBjaV9tbWNmZ19iYXNlX2FkZHI7Ci0KIC8qIFN0YXRpYyB2aXJ0dWFsIG1hcHBpbmcgb2YgdGhlIE1NQ09ORklHIGFwZXJ0dXJlICovCi1jaGFyICpwY2lfbW1jZmdfdmlydDsKK3N0cnVjdCBtbWNmZ192aXJ0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnX2NvbmZpZyAqY2ZnOworCWNoYXIgKnZpcnQ7Cit9Oworc3RhdGljIHN0cnVjdCBtbWNmZ192aXJ0ICpwY2lfbW1jZmdfdmlydDsKIAotc3RhdGljIGlubGluZSBjaGFyICpwY2lfZGV2X2Jhc2UodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKQorc3RhdGljIGNoYXIgKmdldF92aXJ0KHVuc2lnbmVkIGludCBzZWcsIGludCBidXMpCiB7Ci0JcmV0dXJuIHBjaV9tbWNmZ192aXJ0ICsgKChidXMgPDwgMjApIHwgKGRldmZuIDw8IDEyKSk7CisJaW50IGNmZ19udW0gPSAtMTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnX2NvbmZpZyAqY2ZnOworCisJd2hpbGUgKDEpIHsKKwkJKytjZmdfbnVtOworCQlpZiAoY2ZnX251bSA+PSBwY2lfbW1jZmdfY29uZmlnX251bSkgeworCQkJLyogc29tZXRoaW5nIGJhZCBpcyBnb2luZyBvbiwgbm8gY2ZnIHRhYmxlIGlzIGZvdW5kLiAqLworCQkJLyogc28gd2UgZmFsbCBiYWNrIHRvIHRoZSBvbGQgd2F5IHdlIHVzZWQgdG8gZG8gdGhpcyAqLworCQkJLyogYW5kIGp1c3QgcmVseSBvbiB0aGUgZmlyc3QgZW50cnkgdG8gYmUgY29ycmVjdC4gKi8KKwkJCXJldHVybiBwY2lfbW1jZmdfdmlydFswXS52aXJ0OworCQl9CisJCWNmZyA9IHBjaV9tbWNmZ192aXJ0W2NmZ19udW1dLmNmZzsKKwkJaWYgKGNmZy0+cGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyICE9IHNlZykKKwkJCWNvbnRpbnVlOworCQlpZiAoKGNmZy0+c3RhcnRfYnVzX251bWJlciA8PSBidXMpICYmCisJCSAgICAoY2ZnLT5lbmRfYnVzX251bWJlciA+PSBidXMpKQorCQkJcmV0dXJuIHBjaV9tbWNmZ192aXJ0W2NmZ19udW1dLnZpcnQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnBjaV9kZXZfYmFzZSh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisKKwlyZXR1cm4gZ2V0X3ZpcnQoc2VnLCBidXMpICsgKChidXMgPDwgMjApIHwgKGRldmZuIDw8IDEyKSk7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX21tY2ZnX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKIAkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQogewotCWNoYXIgKmFkZHIgPSBwY2lfZGV2X2Jhc2UoYnVzLCBkZXZmbik7IAorCWNoYXIgKmFkZHIgPSBwY2lfZGV2X2Jhc2Uoc2VnLCBidXMsIGRldmZuKTsKIAogCWlmICh1bmxpa2VseSghdmFsdWUgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ4LDcgKzczLDcgQEAKIHN0YXRpYyBpbnQgcGNpX21tY2ZnX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCiAJCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKIHsKLQljaGFyICphZGRyID0gcGNpX2Rldl9iYXNlKGJ1cyxkZXZmbik7CisJY2hhciAqYWRkciA9IHBjaV9kZXZfYmFzZShzZWcsIGJ1cywgZGV2Zm4pOwogCiAJaWYgKHVubGlrZWx5KChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NSw5ICsxMDAsMTUgQEAKIAogc3RhdGljIGludCBfX2luaXQgcGNpX21tY2ZnX2luaXQodm9pZCkKIHsKKwlpbnQgaTsKKwogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFwY2lfbW1jZmdfYmFzZV9hZGRyKQorCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisJaWYgKChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZyA9PSBOVUxMKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MgPT0gMCkpCiAJCXJldHVybiAwOwogCiAJLyogS2x1ZGdlIGZvciBub3cuIERvbid0IHVzZSBtbWNvbmZpZyBvbiBBTUQgc3lzdGVtcyBiZWNhdXNlCkBAIC04OCwxMyArMTE5LDIyIEBACiAJCXJldHVybiAwOyAKIAogCS8qIFJFRC1QRU4gaTM4NiBkb2Vzbid0IGRvIF9ub2NhY2hlIHJpZ2h0IG5vdyAqLwotCXBjaV9tbWNmZ192aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19iYXNlX2FkZHIsIE1NQ09ORklHX0FQRVJfU0laRSk7Ci0JaWYgKCFwY2lfbW1jZmdfdmlydCkgeyAKLQkJcHJpbnRrKCJQQ0k6IENhbm5vdCBtYXAgbW1jb25maWcgYXBlcnR1cmVcbiIpOworCXBjaV9tbWNmZ192aXJ0ID0ga21hbGxvYyhzaXplb2YoKnBjaV9tbWNmZ192aXJ0KSAqIHBjaV9tbWNmZ19jb25maWdfbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAocGNpX21tY2ZnX3ZpcnQgPT0gTlVMTCkgeworCQlwcmludGsoIlBDSTogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1tY29uZmlnIHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm4gMDsKLQl9CQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07ICsraSkgeworCQlwY2lfbW1jZmdfdmlydFtpXS5jZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tpXTsKKwkJcGNpX21tY2ZnX3ZpcnRbaV0udmlydCA9IGlvcmVtYXBfbm9jYWNoZShwY2lfbW1jZmdfY29uZmlnW2ldLmJhc2VfYWRkcmVzcywgTU1DT05GSUdfQVBFUl9TSVpFKTsKKwkJaWYgKCFwY2lfbW1jZmdfdmlydFtpXS52aXJ0KSB7CisJCQlwcmludGsoIlBDSTogQ2Fubm90IG1hcCBtbWNvbmZpZyBhcGVydHVyZSBmb3Igc2VnbWVudCAlZFxuIiwKKwkJCSAgICAgICBwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50X2dyb3VwX251bWJlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIE1NQ09ORklHIGF0ICV4XG4iLCBwY2lfbW1jZmdfY29uZmlnW2ldLmJhc2VfYWRkcmVzcyk7CisJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBNTUNPTkZJRyBhdCAleFxuIiwgcGNpX21tY2ZnX2Jhc2VfYWRkcik7CiAJcmF3X3BjaV9vcHMgPSAmcGNpX21tY2ZnOwogCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgJiB+UENJX1BST0JFX01BU0spIHwgUENJX1BST0JFX01NQ09ORjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvS2NvbmZpZyBiL2FyY2gveHRlbnNhL0tjb25maWcKaW5kZXggM2U4OTc2Ny4uMmI2MjU3YiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvS2NvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCkBAIC0xMzIsNyArMTMyLDcgQEAKIGNvbmZpZyBHRU5FUklDX0NBTElCUkFURV9ERUxBWQogCWJvb2wgIkF1dG8gY2FsaWJyYXRpb24gb2YgdGhlIEJvZ29NSVBTIHZhbHVlIgogCS0tLWhlbHAtLS0KLQkgIFRoZSBCb2dvTUlQUyB2YWx1ZSBjYW4gZWFzaWx5IGRlcml2ZWQgZnJvbSB0aGUgQ1BVIGZyZXF1ZW5jeS4KKwkgIFRoZSBCb2dvTUlQUyB2YWx1ZSBjYW4gZWFzaWx5IGJlIGRlcml2ZWQgZnJvbSB0aGUgQ1BVIGZyZXF1ZW5jeS4KIAogY29uZmlnIENNRExJTkVfQk9PTAogCWJvb2wgIkRlZmF1bHQgYm9vdGxvYWRlciBrZXJuZWwgYXJndW1lbnRzIgpAQCAtMTU4LDYgKzE1OCw4IEBACiAJZGVwZW5kcyBvbiBYVEVOU0FfUExBVEZPUk1fSVNTCiAJZGVmYXVsdCB5CiAKK3NvdXJjZSAibW0vS2NvbmZpZyIKKwogZW5kbWVudQogCiBtZW51ICJCdXMgb3B0aW9ucyIKQEAgLTIyNiw2ICsyMjgsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL01ha2VmaWxlCmluZGV4IDRmYTI3NDUuLjI3ODQ3ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL01ha2VmaWxlCkBAIC0yMSwyMyArMjEsMTcgQEAKIAogIyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uCiAKLXBsYXRmb3JtLXkJCQkJCTo9IGNvbW1vbgogcGxhdGZvcm0tJChDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCkJOj0geHQyMDAwCiBwbGF0Zm9ybS0kKENPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTKQkJOj0gaXNzCiAKIFBMQVRGT1JNID0gJChwbGF0Zm9ybS15KQogZXhwb3J0IFBMQVRGT1JNCiAKLSNMREZMQUdTX3ZtbGludXgJCTo9IC1UJCh3b3JkIDEsJChMSU5LU0NSSVBUKSkKLUFGTEFHU192bWxpbnV4Lmxkcy5vCTo9IC1VeHRlbnNhCi1DUFBGTEFHUwkJKz0gLUlhcmNoL3h0ZW5zYSAtSWluY2x1ZGUvYXNtICAtbWxvbmdjYWxscyAgLWcKLUFGTEFHUwkJCSs9IC1JYXJjaC94dGVuc2EgLUlpbmNsdWRlL2FzbQotQ1BQCQkJPSAkKENDKSAtRSAkKENGTEFHUykKK0NQUEZMQUdTCSs9ICQoaWYgJChLQlVJTERfU1JDKSwtSSQoc3JjdHJlZSkvaW5jbHVkZS9hc20teHRlbnNhLykKK0NQUEZMQUdTCSs9IC1JaW5jbHVkZS9hc20KK0NGTEFHUwkJKz0gLXBpcGUgLW1sb25nY2FsbHMKIAotY2ZsYWdzLXkJKz0gLUlhcmNoL3h0ZW5zYSAtcGlwZSAtbWxvbmdjYWxscwotCi0KLUtCVUlMRF9ERUZDT05GSUcgOj0gY29tbW9uX2RlZmNvbmZpZworS0JVSUxEX0RFRkNPTkZJRyA6PSBpc3NfZGVmY29uZmlnCiAKICMgcmFtZGlzay9pbml0cmQgc3VwcG9ydAogIyBZb3UgbmVlZCBhIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSwgbmFtZWQgcmFtZGlzay5neiBpbgpAQCAtNjIsMzAgKzU2LDM2IEBACiBMSUJHQ0MgOj0gJChzaGVsbCAkKENDKSAkKENGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCiAKIGhlYWQteQkJOj0gYXJjaC94dGVuc2Eva2VybmVsL2hlYWQubwotY29yZS15CQkrPSBhcmNoL3h0ZW5zYS9rZXJuZWwvIFwKLQkJICAgYXJjaC94dGVuc2EvbW0vIGFyY2gveHRlbnNhL3BsYXRmb3JtLSQoUExBVEZPUk0pLworY29yZS15CQkrPSBhcmNoL3h0ZW5zYS9rZXJuZWwvIGFyY2gveHRlbnNhL21tLworaWZuZXEgKCQoUExBVEZPUk0pLCkKK2NvcmUteQkJKz0gYXJjaC94dGVuc2EvcGxhdGZvcm0tJChQTEFURk9STSkvCitlbmRpZgogbGlicy15CQkrPSBhcmNoL3h0ZW5zYS9saWIvICQoTElCR0NDKQogCi1ib290CTo9IGFyY2gveHRlbnNhL2Jvb3QKK2Jvb3QJCTo9IGFyY2gveHRlbnNhL2Jvb3QKKworYXJjaGluYwkJOj0gaW5jbHVkZS9hc20teHRlbnNhCiAKIGFyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBcCi0JYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLmMgXAotCWluY2x1ZGUvYXNtLXh0ZW5zYS8ucGxhdGZvcm0KKwlhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyAkKGFyY2hpbmMpLy5wbGF0Zm9ybQogCiBpbmNsdWRlL2FzbS14dGVuc2Evb2Zmc2V0cy5oOiBhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMucwogCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKIAotcHJlcGFyZTogaW5jbHVkZS9hc20teHRlbnNhLy5wbGF0Zm9ybSBpbmNsdWRlL2FzbS14dGVuc2Evb2Zmc2V0cy5oCitwcmVwYXJlOiAkKGFyY2hpbmMpLy5wbGF0Zm9ybSAkKGFyY2hpbmMpL29mZnNldHMuaAogCiAjIFVwZGF0ZSBtYWNoaW5lIGNwdSBhbmQgcGxhdGZvcm0gc3ltbGlua3MgaWYgc29tZXRoaW5nIHdoaWNoIGFmZmVjdHMKICMgdGhlbSBjaGFuZ2VkLgogCi1pbmNsdWRlL2FzbS14dGVuc2EvLnBsYXRmb3JtOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKQotCUBlY2hvICcgIFNldHRpbmcgdXAgY3B1ICgkKENQVSkpIGFuZCBwbGF0Zm9ybSAoJChQTEFURk9STSkpIHN5bWxpbmtzJwotCSQoUSlybSAtZiBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0KLQkkKFEpcm0gLWYgaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWcKLQkkKFEpKGNkIGluY2x1ZGUvYXNtLXh0ZW5zYS87IGxuIC1zZiBwbGF0Zm9ybS0kKFBMQVRGT1JNKSBwbGF0Zm9ybSkKLQkkKFEpKGNkIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2E7IGxuIC1zZiBjb25maWctJChDUFUpIGNvbmZpZykKKyQoYXJjaGluYykvLnBsYXRmb3JtOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKwlAZWNobyAnICBTWU1MSU5LICQoYXJjaGluYykveHRlbnNhL2NvbmZpZyAtPiAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWctJChDUFUpJworCSQoUSlta2RpciAtcCAkKGFyY2hpbmMpCisJJChRKW1rZGlyIC1wICQoYXJjaGluYykveHRlbnNhCisJJChRKWxuIC1mc24gJChzcmN0cmVlKS8kKGFyY2hpbmMpL3h0ZW5zYS9jb25maWctJChDUFUpICQoYXJjaGluYykveHRlbnNhL2NvbmZpZworCUBlY2hvICcgIFNZTUxJTksgJChhcmNoaW5jKS9wbGF0Zm9ybSAtPiAkKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pJworCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS9wbGF0Zm9ybS0kKFBMQVRGT1JNKSAkKGFyY2hpbmMpL3BsYXRmb3JtCisJQHRvdWNoICRACisKIAogYWxsOiB6SW1hZ2UKIApAQCAtOTQsNyArOTQsOSBAQAogekltYWdlIHpJbWFnZS5pbml0cmQ6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICRACiAKLUNMRUFOX0ZJTEVTCSs9IGFyY2gveHRlbnNhL3ZtbGludXgubGRzIGluY2x1ZGUvYXNtLXh0ZW5zYS9vZmZzZXQuaAorQ0xFQU5fRklMRVMJKz0gYXJjaC94dGVuc2Evdm1saW51eC5sZHMgJChhcmNoaW5jKS9vZmZzZXQuaCBcCisJCSAgICQoYXJjaGluYykvcGxhdGZvcm0gJChhcmNoaW5jKS94dGVuc2EvY29uZmlnIFwKKwkJICAgJChhcmNoaW5jKS8ucGxhdGZvcm0KIAogZGVmaW5lIGFyY2hoZWxwCiAgIEBlY2hvICcqIHpJbWFnZSAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gveHRlbnNhL2Jvb3QvaW1hZ2VzL3pJbWFnZS4qKScKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9ib290L01ha2VmaWxlCmluZGV4IDI2MGY0NTYuLjgyMGIzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9NYWtlZmlsZQpAQCAtMTEsMjEgKzExLDE5IEBACiBDRkxBR1MgCQkrPSAtZm5vLWJ1aWx0aW4gLUlhcmNoLyQoQVJDSCkvYm9vdC9pbmNsdWRlCiBIT1NURkxBR1MJKz0gLUlhcmNoLyQoQVJDSCkvYm9vdC9pbmNsdWRlCiAKLUJJR19FTkRJQU4JOj0gJChzaGVsbCBlY2hvIC1lICJcI2lmZGVmIF9fWFRFTlNBX0VMX19cbmludCBsaXR0bGU7XG5cI2Vsc2VcbmludCBiaWc7XG5cI2VuZGlmIiB8ICQoQ0MpIC1FIC18Z3JlcCAtYyBiaWcpCi0KK0JJR19FTkRJQU4JOj0gJChzaGVsbCBlY2hvIC1lIF9fWFRFTlNBX0VCX18gfCAkKENDKSAtRSAtIHwgZ3JlcCAtdiAiXCMiKQogCiBleHBvcnQgQ0ZMQUdTCiBleHBvcnQgQUZMQUdTCiBleHBvcnQgQklHX0VORElBTgogCitzdWJkaXIteQk6PSBsaWIKKwogIyBTdWJkaXJzIGZvciB0aGUgYm9vdCBsb2FkZXIocykKIAogYm9vdGRpci0kKENPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTKQkgKz0gYm9vdC1lbGYKIGJvb3RkaXItJChDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCkgKz0gYm9vdC1yZWRib290IGJvb3QtZWxmCiAKLXN1YmRpci15CTo9IGxpYi8KLQotc3ViZGlyLXkJKz0gYm9vdC1lbGYvIGJvb3QtcmVkYm9vdC8KIAogekltYWdlIHpJbWFnZS5pbml0cmQgSW1hZ2UgSW1hZ2UuaW5pdHJkOiAkKGJvb3RkaXIteSkKIApAQCAtMzMsNSArMzEsMyBAQAogCSAgICAgICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LXByb2dzKSkKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvJEAgJChNQUtFQ01ER09BTFMpCiAKLQotCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9NYWtlZmlsZQppbmRleCBmNmVmNmEzLi43MzRkYjdmIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvTWFrZWZpbGUKQEAgLTI3LDcgKzI3LDcgQEAKIAkJLS1zZXQtc2VjdGlvbi1mbGFncyBpbWFnZT1jb250ZW50cyxhbGxvYyxsb2FkLGxvYWQsZGF0YSBcCiAJCSQoT0JKUykgJEAudG1wCiAJJChMRCkgJChMREZMQUdTKSAkKExERkxBR1Nfdm1saW51eCkgXAotCQktVCBhcmNoLyQoQVJDSCkvYm9vdC9ib290LWVsZi9ib290LmxkIFwKKwkJLVQgJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvYm9vdC9ib290LWVsZi9ib290LmxkIFwKIAkJLW8gYXJjaC8kKEFSQ0gpL2Jvb3QvJEAuZWxmICRALnRtcAogCXJtIC1mICRALnRtcCB2bWxpbnV4LnRtcAogCkBAIC00MSw3ICs0MSw3IEBACiAJCS0tc2V0LXNlY3Rpb24tZmxhZ3MgaW1hZ2U9Y29udGVudHMsYWxsb2MsbG9hZCxsb2FkLGRhdGEgXAogCQkkKE9CSlMpICRALnRtcAogCSQoTEQpICQoTERGTEFHUykgJChMREZMQUdTX3ZtbGludXgpIFwKLQkJLVQgYXJjaC8kKEFSQ0gpL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZCBcCisJCS1UICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZCBcCiAJCS1vIGFyY2gvJChBUkNIKS9ib290LyRALmVsZiAkQC50bXAKIAlybSAtZiAkQC50bXAgdm1saW51eC50bXAKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9NYWtlZmlsZQppbmRleCBjYThhNjhiLi5mNTMyNjJjIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9NYWtlZmlsZQpAQCAtMTIsMjQgKzEyLDI0IEBACiBPQkpDT1BZX0FSR1MgCTo9IC1PIGVsZjMyLXh0ZW5zYS1sZQogZW5kaWYKIAotTERfQVJHUwk9IC1UICQob2JqKS9ib290LmxkCitMRF9BUkdTCT0gLVQgJChzcmN0cmVlKS8kKG9iaikvYm9vdC5sZAogCiBib290LXkJOj0gYm9vdHN0cmFwLm8KIAogT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoYm9vdC15KSkKLUxJQlMJOj0gYXJjaC8kKEFSQ0gpL2Jvb3QvbGliL2xpYi5hIGFyY2gvJChBUkNIKS9saWIvbGliLmEKK0xJQlMJOj0gYXJjaC94dGVuc2EvYm9vdC9saWIvbGliLmEgYXJjaC94dGVuc2EvbGliL2xpYi5hCiAKIExJQkdDQyA6PSAkKHNoZWxsICQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKIAogekltYWdlOiB2bWxpbnV4ICQoT0JKUykgJChMSUJTKQogCSQoT0JKQ09QWSkgLS1zdHJpcC1hbGwgLVIgLmNvbW1lbnQgLVIgLnh0Lmluc24gLU8gYmluYXJ5IFwKLQkJJChUT1BESVIpL3ZtbGludXggdm1saW51eC50bXAKKwkJdm1saW51eCB2bWxpbnV4LnRtcAogCWd6aXAgLXZmOSB2bWxpbnV4LnRtcAogCSQoT0JKQ09QWSkgJChPQkpDT1BZX0FSR1MpIC1SIC5jb21tZW50IFwKIAkJLS1hZGQtc2VjdGlvbiBpbWFnZT12bWxpbnV4LnRtcC5neiBcCiAJCS0tc2V0LXNlY3Rpb24tZmxhZ3MgaW1hZ2U9Y29udGVudHMsYWxsb2MsbG9hZCxsb2FkLGRhdGEgXAogCQkkKE9CSlMpICRALnRtcAogCSQoTEQpICQoTERfQVJHUykgLW8gJEAuZWxmICRALnRtcCAkKExJQlMpIC1ML3h0ZW5zYS1lbGYvbGliICQoTElCR0NDKQotCSQoT0JKQ09QWSkgLVMgLU8gYmluYXJ5ICRALmVsZiBhcmNoLyQoQVJDSCkvYm9vdC9pbWFnZXMvJEAucmVkYm9vdAotIwlybSAtZiAkQC50bXAgJEAuZWxmIHZtbGludXgudG1wLmd6CisJJChPQkpDT1BZKSAtUyAtTyBiaW5hcnkgJEAuZWxmIGFyY2gvJChBUkNIKS9ib290LyRALnJlZGJvb3QKKwlybSAtZiAkQC50bXAgJEAuZWxmIHZtbGludXgudG1wLmd6CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvaW5jbHVkZS96bGliLmggYi9hcmNoL3h0ZW5zYS9ib290L2luY2x1ZGUvemxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI5YjYyLi4wMDAwMDAwCi0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvaW5jbHVkZS96bGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIEJLIElkOiBTQ0NTL3MuemxpYi5oIDEuOCAwNS8xOC8wMSAxNToxNzoyMyBjb3J0Ci0gKi8KLS8qCi0gKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHpsaWIuaCBhbmQgemNvbmYuaCBmcm9tIHRoZSB6bGliLTAuOTUKLSAqIGRpc3RyaWJ1dGlvbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLCB3aXRoIHNvbWUgYWRkaXRpb25zCi0gKiBieSBQYXVsIE1hY2tlcnJhcyB0byBhaWQgaW4gaW1wbGVtZW50aW5nIERlZmxhdGUgY29tcHJlc3Npb24gYW5kCi0gKiBkZWNvbXByZXNzaW9uIGZvciBQUFAgcGFja2V0cy4KLSAqLwotCi0vKgotICogID09RklMRVZFUlNJT04gOTYwMTIyPT0KLSAqCi0gKiBUaGlzIG1hcmtlciBpcyB1c2VkIGJ5IHRoZSBMaW51eCBpbnN0YWxsYXRpb24gc2NyaXB0IHRvIGRldGVybWluZQotICogd2hldGhlciBhbiB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGFscmVhZHkgaW5zdGFsbGVkLgotICovCi0KLS8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICB2ZXJzaW9uIDAuOTUsIEF1ZyAxNnRoLCAxOTk1LgotCi0gIENvcHlyaWdodCAoQykgMTk5NSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKLSAgZ3ppcEBwcmVwLmFpLm1pdC5lZHUgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotICovCi0KLSNpZm5kZWYgX1pMSUJfSAotI2RlZmluZSBfWkxJQl9ICi0KLS8qICNpbmNsdWRlICJ6Y29uZi5oIiAqLwkvKiBpbmNsdWRlZCBkaXJlY3RseSBoZXJlICovCi0KLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBGcm9tOiB6Y29uZi5oLHYgMS4xMiAxOTk1LzA1LzAzIDE3OjI3OjEyIGpsb3VwIEV4cCAqLwotCi0vKgotICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8KLSAgYWRkIGF0IGxlYXN0IGEgaGFuZGxlciBmb3IgU0lHU0VHViB3aGVuIGRlY29tcHJlc3Npbmc7IHRoZSBsaWJyYXJ5IGNoZWNrcwotICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGlucHV0IGRhdGEgd2hlbmV2ZXIgcG9zc2libGUgYnV0IG1heSBnbyBudXRzCi0gIGZvciBzb21lIGZvcm1zIG9mIGNvcnJ1cHRlZCBpbnB1dC4KLSAqLwotCi0vKgotICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKLSAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KLSAqIENvbXBpbGUgd2l0aCAtRFVOQUxJR05FRF9PSyBpZiBpdCBpcyBPSyB0byBhY2Nlc3Mgc2hvcnRzIG9yIGludHMKLSAqIGF0IGFkZHJlc3NlcyB3aGljaCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlaXIgc2l6ZS4KLSAqIFVuZGVyIERPUywgLURGQVI9ZmFyIG9yIC1ERkFSPV9fZmFyIG1heSBiZSBuZWVkZWQuCi0gKi8KLQotI2lmbmRlZiBTVERDCi0jICBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYJX19NV0VSS1NfXyAvKiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yIGRlY2xhcmVzIGZpbGVubygpIGluIHVuaXguaCAqLwotIyAgaW5jbHVkZSA8dW5peC5oPgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEZBUgotIyAgZGVmaW5lIEZBUgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIgKi8KLSNpZm5kZWYgTUFYX1dCSVRTCi0jICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCi0jZW5kaWYKLQotLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6Ci0gICAgICAgICAgICAxIDw8ICh3aW5kb3dCaXRzKzIpICAgKyAgMSA8PCAobWVtTGV2ZWwrOSkKLSB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKLSBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQotIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAotICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCi0gT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KLQotICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCi0gdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcwotIGZvciBzbWFsbCBvYmplY3RzLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0jICBpZmRlZiBTVERDCi0jICAgIGRlZmluZSBPRihhcmdzKSAgYXJncwotIyAgZWxzZQotIyAgICBkZWZpbmUgT0YoYXJncykgICgpCi0jICBlbmRpZgotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KLQotdHlwZWRlZiBCeXRlIEZBUiBCeXRlZjsKLXR5cGVkZWYgY2hhciBGQVIgY2hhcmY7Ci10eXBlZGVmIGludCBGQVIgaW50ZjsKLXR5cGVkZWYgdUludCBGQVIgdUludGY7Ci10eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0KLSNpZmRlZiBTVERDCi0gICB0eXBlZGVmIHZvaWQgRkFSICp2b2lkcGY7Ci0gICB0eXBlZGVmIHZvaWQgICAgICp2b2lkcDsKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgRkFSICp2b2lkcGY7Ci0gICB0eXBlZGVmIEJ5dGUgICAgICp2b2lkcDsKLSNlbmRpZgotCi0vKiBlbmQgb2Ygb3JpZ2luYWwgemNvbmYuaCAqLwotCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMC45NVAiCi0KLS8qCi0gICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCi0gIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCi0gIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCi0gIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIG1heSBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCi0gIHN0cmVhbSBpbnRlcmZhY2UuCi0KLSAgICAgRm9yIGNvbXByZXNzaW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgdGhlIG91dHB1dCBidWZmZXIgYW5kCi0gIG1heSBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIGlucHV0IGJ1ZmZlciBmb3Igb3B0aW1pemF0aW9uLiBGb3IgZGVjb21wcmVzc2lvbiwKLSAgdGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBtYXkgb3B0aW9uYWxseSBwcm92aWRlCi0gIHRoZSBvdXRwdXQgYnVmZmVyIGZvciBvcHRpbWl6YXRpb24uCi0KLSAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKLSAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQotICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0Ci0gIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCi0qLwotCi10eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKLXR5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzLCB1SW50IG5ieXRlcykpOwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewotICAgIEJ5dGVmICAgICpuZXh0X2luOyAgLyogbmV4dCBpbnB1dCBieXRlICovCi0gICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KLSAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCi0KLSAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KLSAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIHZvaWRwICAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLwotCi0gICAgQnl0ZSAgICAgZGF0YV90eXBlOyAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqLwotCi19IHpfc3RyZWFtOwotCi0vKgotICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzCi0gICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKLSAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKLSAgIG9wYXF1ZSBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCi0KLSAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQotICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCi0gICBvcGFxdWUgdmFsdWUuCi0KLSAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCi0gICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQotICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCi0gICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKLSAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgotICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKLSAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCi0gICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCi0KLSAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgotICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKLSAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KLSAgIGEgc2luZ2xlIHN0ZXApLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCi0KLSNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKLSNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEKLSNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDIKLSNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDMgLyogZXhwZXJpbWVudGFsOiBwYXJ0aWFsX2ZsdXNoICsgYnl0ZSBhbGlnbiAqLwotI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAotI2RlZmluZSBaX1BBQ0tFVF9GTFVTSAk1Ci0vKiBTZWUgZGVmbGF0ZSgpIGJlbG93IGZvciB0aGUgdXNhZ2Ugb2YgdGhlc2UgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKLSNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKLSNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQotI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCi0jZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKLSNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQotI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCi0vKiBlcnJvciBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKLSNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKLSNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCi0vKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KLQotI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQotI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgotI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAotCi0jZGVmaW5lIFpfQklOQVJZICAgMAotI2RlZmluZSBaX0FTQ0lJICAgIDEKLSNkZWZpbmUgWl9VTktOT1dOICAyCi0vKiBVc2VkIHRvIHNldCB0aGUgZGF0YV90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLwotCi1leHRlcm4gY2hhciAqemxpYl92ZXJzaW9uOwotLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJfdmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KLSAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCi0gICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCi0KLWV4dGVybiBpbnQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtICpzdHJtKSk7Ci0vKgotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuICBJZiB6YWxsb2MgYW5kCi0gICB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24KLSAgIGZ1bmN0aW9ucy4KLQotICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLgotICAgaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkKLSAgIGluZmxhdGUoKS4KLSovCi0KLQotZXh0ZXJuIGludCBpbmZsYXRlIE9GKCh6X3N0cmVhbSAqc3RybSwgaW50IGZsdXNoKSk7Ci0vKgotICBQZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCi0gICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZwotICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgotCi0gIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKLSAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBhbHdheXMgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUKLSAgICAodW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIpLgotCi0gIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCi0gIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCi0gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKLSAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAotICBjYWxsIG9mIGluZmxhdGUoKS4KLQotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCBvciBaX1BBQ0tFVF9GTFVTSCwKLSAgaW5mbGF0ZSBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGUKLSAgZmx1c2hpbmcgYmVoYXZpb3Igb2YgaW5mbGF0ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciB2YWx1ZXMgb2YgdGhlIGZsdXNoCi0gIHBhcmFtZXRlciBvdGhlciB0aGFuIFpfUEFSVElBTF9GTFVTSCwgWl9QQUNLRVRfRkxVU0ggb3IgWl9GSU5JU0gsIGJ1dCB0aGUKLSAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlCi0gIGFueXdheS4gIEZvciBaX1BBQ0tFVF9GTFVTSCwgaW5mbGF0ZSBjaGVja3MgdGhhdCBvbmNlIGFsbCB0aGUgaW5wdXQgZGF0YQotICBoYXMgYmVlbiBjb25zdW1lZCwgaXQgaXMgZXhwZWN0aW5nIHRvIHNlZSB0aGUgbGVuZ3RoIGZpZWxkIG9mIGEgc3RvcmVkCi0gIGJsb2NrOyBpZiBub3QsIGl0IHJldHVybnMgWl9EQVRBX0VSUk9SLgotCi0gICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KLSAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKLSAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwotICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKLSAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKLSAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAotICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKLSAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICi0gIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciByb3V0aW5lCi0gIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgotCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKLSAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlCi0gIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbgotICBwcm9kdWNlZCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQsIFpfU1RSRUFNX0VSUk9SIGlmCi0gIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQKLSAgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIG5vCi0gIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIKLSAgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBJbiB0aGUgWl9EQVRBX0VSUk9SIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbgotICBjYWxsIGluZmxhdGVTeW5jIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jay4gICovCi0KLQotZXh0ZXJuIGludCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbSAqc3RybSkpOwotLyoKLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKLSAgIHBlbmRpbmcgb3V0cHV0LgotCi0gICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKLSAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQotICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2YW5jZWQgZnVuY3Rpb25zICovCi0KLWV4dGVybiBpbnQgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbSAqc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKLS8qCi0gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKLSAgIGZpZWxkcyBuZXh0X291dCwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwotICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgKHRoZSB2YWx1ZSAxNiB3aWxsIGJlIGFsbG93ZWQgc29vbikuIFRoZQotICAgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0KLSAgIHdpdGggYSBsYXJnZXIgd2luZG93IHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoCi0gICB0aGUgZXJyb3IgY29kZSBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgotCi0gICAgIElmIG5leHRfb3V0IGlzIG5vdCBudWxsLCB0aGUgbGlicmFyeSB3aWxsIHVzZSB0aGlzIGJ1ZmZlciBmb3IgdGhlIGhpc3RvcnkKLSAgIGJ1ZmZlcjsgdGhlIGJ1ZmZlciBtdXN0IGVpdGhlciBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIG91dHB1dAotICAgZGF0YSwgb3IgaGF2ZSBhdCBsZWFzdCAxPDx3aW5kb3dCaXRzIGJ5dGVzLiAgSWYgbmV4dF9vdXQgaXMgbnVsbCwgdGhlCi0gICBsaWJyYXJ5IHdpbGwgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgKGFuZCBsZWF2ZSBuZXh0X291dCBudWxsKS4gbmV4dF9pbgotICAgbmVlZCBub3QgYmUgcHJvdmlkZWQgaGVyZSBidXQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIHRoZQotICAgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KLQotICAgICBJZiB0aGUgaGlzdG9yeSBidWZmZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBuZXh0X291dCBtdXN0Ci0gICBuZXZlciBiZSBjaGFuZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBzaW5jZSB0aGUgZGVjb21wcmVzc29yIG1haW50YWlucwotICAgaGlzdG9yeSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhpcyBidWZmZXIgZnJvbSBjYWxsIHRvIGNhbGw7IHRoZSBhcHBsaWNhdGlvbgotICAgY2FuIG9ubHkgcmVzZXQgbmV4dF9vdXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBidWZmZXIgd2hlbgotICAgYXZhaWxfb3V0IGlzIHplcm8gYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gY29uc3VtZWQuCi0KLSAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzCi0gICBub3QgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcwotICAgd2luZG93Qml0cyA8IDgpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4KLSAgIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieQotICAgaW5mbGF0ZSgpLgotKi8KLQotZXh0ZXJuIGludCBpbmZsYXRlU3luYyBPRigoel9zdHJlYW0gKnN0cm0pKTsKLS8qCi0gICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgdGhlIHNwZWNpYWwgbWFya2VyIChzZWUgZGVmbGF0ZSgpCi0gIGFib3ZlKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbCBhdmFpbGFibGUgaW5wdXQgaXMgc2tpcHBlZC4gTm8gb3V0cHV0Ci0gIGlzIHByb3ZpZGVkLgotCi0gICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIHRoZSBzcGVjaWFsIG1hcmtlciBoYXMgYmVlbiBmb3VuZCwgWl9CVUZfRVJST1IKLSAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBtYXJrZXIgaGFzIGJlZW4gZm91bmQsCi0gIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCi0gIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCi0gIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKLSAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCi0qLwotCi1leHRlcm4gaW50IGluZmxhdGVSZXNldCBPRigoel9zdHJlYW0gKnN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KLQotICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCi0qLwotCi1leHRlcm4gaW50IGluZmxhdGVJbmNvbXAgT0YoKHpfc3RyZWFtICpzdHJtKSk7Ci0vKgotICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGRhdGEgYXQgbmV4dF9pbiAoYXZhaWxfaW4gYnl0ZXMpIHRvIHRoZSBvdXRwdXQKLSAgIGhpc3Rvcnkgd2l0aG91dCBwZXJmb3JtaW5nIGFueSBvdXRwdXQuICBUaGVyZSBtdXN0IGJlIG5vIHBlbmRpbmcgb3V0cHV0LAotICAgYW5kIHRoZSBkZWNvbXByZXNzb3IgbXVzdCBiZSBleHBlY3RpbmcgdG8gc2VlIHRoZSBzdGFydCBvZiBhIGJsb2NrLgotICAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGVjb21wcmVzc2luZyBhIHN0b3JlZCBibG9jawotICAgY29udGFpbmluZyB0aGUgZGF0YSBhdCBuZXh0X2luIChleGNlcHQgdGhhdCB0aGUgZGF0YSBpcyBub3Qgb3V0cHV0KS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBpcyBleHBvcnRlZAotICAgYW55d2F5IGJlY2F1c2UgaXQgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0qLwotCi1leHRlcm4gdUxvbmcgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0KLS8qCi0gICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKLSAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KLSAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKLSAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgotCi0gICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLQotICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewotICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOwotICAgICB9Ci0gICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKLSovCi0KLSNpZm5kZWYgX1pfVVRJTF9ICi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9aTElCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvbGliL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvYm9vdC9saWIvTWFrZWZpbGUKaW5kZXggYzBhNzRkYy4uOWU3M2JiOCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9saWIvTWFrZWZpbGUKQEAgLTIsNSArMiwxNiBAQAogIyBNYWtlZmlsZSBmb3Igc29tZSBsaWJzIG5lZWRlZCBieSB6SW1hZ2UuCiAjCiAKK3psaWIJOj0gaW5mYmxvY2suYyBpbmZjb2Rlcy5jIGluZmZhc3QuYyBpbmZsYXRlLmMgaW5mdHJlZXMuYyBpbmZ1dGlsLmMKIAotbGliLXkgOj0gemxpYi5vIHptZW0ubworbGliLXkJKz0gJCh6bGliOi5jPS5vKSB6bWVtLm8KKworRVhUUkFfQ0ZMQUdTCSs9IC1JbGliL3psaWJfaW5mbGF0ZQorCitxdWlldF9jbWRfY29weV96bGliID0gQ09QWSAgICAkQAorICAgICAgY21kX2NvcHlfemxpYiA9IGNhdCAkPCA+ICRACisKKyQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSk6ICQob2JqKS8lOiAkKHNyY3RyZWUpL2xpYi96bGliX2luZmxhdGUvJQorCSQoY2FsbCBjbWQsY29weV96bGliKQorCitjbGVhbi1maWxlcwk6PSAkKHpsaWIpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2xpYi9tZW1jcHkuUyBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL21lbWNweS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI5ZjVkLi4wMDAwMDAwCi0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvbGliL21lbWNweS5TCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqICBhcmNoL3h0ZW5zYS9saWIvbWVtY3B5LlMKLSAqCi0gKiAgQU5TSSBDIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5Ci0gKgotICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqICBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiAgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNkZWZpbmUgX0FTTUxBTkdVQUdFCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+Ci0KLS50ZXh0Ci0uYWxpZ24JNAotLmdsb2JhbAliY29weQotLnR5cGUgICBiY29weSxAZnVuY3Rpb24KLWJjb3B5OgotICAgICAgICBtb3ZpICAgIGExNCwgeHRoYWxfYmNvcHkgICAgICAgIC8vIGExNCBzYWZlIHRvIHVzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgY2FsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB1c2VkIGNhbGw0IG9yIGNhbGw4IChjYW4ndCBoYXZlIHVzZWQgY2FsbDEyKQotICAgICAgICBqeCAgICAgIGExNCAgICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgQ29yZSBIQUwgZG8gdGhlIHdvcmsKLQotLnRleHQKLS5hbGlnbgk0Ci0uZ2xvYmFsCW1lbWNweQotLnR5cGUgICBtZW1jcHksQGZ1bmN0aW9uCi1tZW1jcHk6Ci0uZ2xvYmFsCW1lbW1vdmUKLS50eXBlICAgbWVtbW92ZSxAZnVuY3Rpb24KLW1lbW1vdmU6Ci0gICAgICAgIG1vdmkgICAgYTE0LCB4dGhhbF9tZW1jcHkgICAgICAvLyBhMTQgc2FmZSB0byB1c2UgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGNhbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdXNlZCBjYWxsNCBvciBjYWxsOCAoY2FuJ3QgaGF2ZSB1c2VkIGNhbGwxMikKLSAgICAgICAganggICAgICBhMTQgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIENvcmUgSEFMIGRvIHRoZSB3b3JrCi0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvbGliL3psaWIuYyBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL3psaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4NTlmNi4uMDAwMDAwMAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2xpYi96bGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUwICswLDAgQEAKLS8qCi0gKiBCSyBJZDogU0NDUy9zLnpsaWIuYyAxLjggMDUvMTgvMDEgMTU6MTc6MjQgY29ydAotICovCi0vKgotICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB2YXJpb3VzIC5oIGFuZCAuYyBmaWxlcyBmcm9tIHRoZSB6bGliLTAuOTUKLSAqIGRpc3RyaWJ1dGlvbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLCB3aXRoIHNvbWUgYWRkaXRpb25zCi0gKiBieSBQYXVsIE1hY2tlcnJhcyB0byBhaWQgaW4gaW1wbGVtZW50aW5nIERlZmxhdGUgY29tcHJlc3Npb24gYW5kCi0gKiBkZWNvbXByZXNzaW9uIGZvciBQUFAgcGFja2V0cy4gIFNlZSB6bGliLmggZm9yIGNvbmRpdGlvbnMgb2YKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLgotICoKLSAqIENoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbmNsdWRlOgotICogLSBjaGFuZ2VkIGZ1bmN0aW9ucyBub3QgdXNlZCBvdXRzaWRlIHRoaXMgZmlsZSB0byAibG9jYWwiCi0gKiAtIGFkZGVkIG1pbkNvbXByZXNzaW9uIHBhcmFtZXRlciB0byBkZWZsYXRlSW5pdDIKLSAqIC0gYWRkZWQgWl9QQUNLRVRfRkxVU0ggKHNlZSB6bGliLmggZm9yIGRldGFpbHMpCi0gKiAtIGFkZGVkIGluZmxhdGVJbmNvbXAKLSAqCi0gKi8KLQotLyorKysrKyovCi0vKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLS8qIEZyb206IHp1dGlsLmgsdiAxLjkgMTk5NS8wNS8wMyAxNzoyNzoxMiBqbG91cCBFeHAgKi8KLQotI2RlZmluZSBfWl9VVElMX0gKLQotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmbmRlZiBsb2NhbAotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotI2VuZGlmCi0vKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KLQotI2RlZmluZSBGQVIKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Ci10eXBlZGVmIHVjaCBGQVIgdWNoZjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwotdHlwZWRlZiB1c2ggRkFSIHVzaGY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKLQotZXh0ZXJuIGNoYXIgKnpfZXJybXNnW107IC8qIGluZGV4ZWQgYnkgMS16bGliX2Vycm9yICovCi0KLSNkZWZpbmUgRVJSX1JFVFVSTihzdHJtLGVycikgcmV0dXJuIChzdHJtLT5tc2c9el9lcnJtc2dbMS1lcnJdLCBlcnIpCi0vKiBUbyBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3RhdGUgaXMga25vd24gdG8gYmUgdmFsaWQgKi8KLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwJKCh2b2lkICopIDApCi0jZW5kaWYKLQotICAgICAgICAvKiBjb21tb24gY29uc3RhbnRzICovCi0KLSNkZWZpbmUgREVGTEFURUQgICA4Ci0KLSNpZm5kZWYgREVGX1dCSVRTCi0jICBkZWZpbmUgREVGX1dCSVRTIE1BWF9XQklUUwotI2VuZGlmCi0vKiBkZWZhdWx0IHdpbmRvd0JpdHMgZm9yIGRlY29tcHJlc3Npb24uIE1BWF9XQklUUyBpcyBmb3IgY29tcHJlc3Npb24gb25seSAqLwotCi0jaWYgTUFYX01FTV9MRVZFTCA+PSA4Ci0jICBkZWZpbmUgREVGX01FTV9MRVZFTCA4Ci0jZWxzZQotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKLSNlbmRpZgotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotCi0jZGVmaW5lIFNUT1JFRF9CTE9DSyAwCi0jZGVmaW5lIFNUQVRJQ19UUkVFUyAxCi0jZGVmaW5lIERZTl9UUkVFUyAgICAyCi0vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLwotCi0jZGVmaW5lIE1JTl9NQVRDSCAgMwotI2RlZmluZSBNQVhfTUFUQ0ggIDI1OAotLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqLwotCi0gICAgICAgICAvKiBmdW5jdGlvbnMgKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2RlZmluZSB6bWVtY3B5IG1lbWNweQotI2RlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pCW1lbXNldChkZXN0LCAwLCBsZW4pCi0KLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCi0jaWZkZWYgREVCVUdfWkxJQgotIyAgaW5jbHVkZSA8c3RkaW8uaD4KLSMgIGlmbmRlZiB2ZXJib3NlCi0jICAgIGRlZmluZSB2ZXJib3NlIDAKLSMgIGVuZGlmCi0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KLSMgIGRlZmluZSBUcmFjZSh4KSBmcHJpbnRmIHgKLSMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh2ZXJib3NlKSBmcHJpbnRmIHggO30KLSMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAodmVyYm9zZT4xKSBmcHJpbnRmIHggO30KLSMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHZlcmJvc2UgJiYgKGMpKSBmcHJpbnRmIHggO30KLSMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh2ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KLSNlbHNlCi0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQotIyAgZGVmaW5lIFRyYWNlKHgpCi0jICBkZWZpbmUgVHJhY2V2KHgpCi0jICBkZWZpbmUgVHJhY2V2dih4KQotIyAgZGVmaW5lIFRyYWNlYyhjLHgpCi0jICBkZWZpbmUgVHJhY2VjdihjLHgpCi0jZW5kaWYKLQotCi10eXBlZGVmIHVMb25nICgqY2hlY2tfZnVuYykgT0YoKHVMb25nIGNoZWNrLCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwotCi0vKiB2b2lkcGYgemNhbGxvYyBPRigodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpKTsgKi8KLS8qIHZvaWQgICB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7ICovCi0KLSNkZWZpbmUgWkFMTE9DKHN0cm0sIGl0ZW1zLCBzaXplKSBcCi0gICAgICAgICAgICgqKChzdHJtKS0+emFsbG9jKSkoKHN0cm0pLT5vcGFxdWUsIChpdGVtcyksIChzaXplKSkKLSNkZWZpbmUgWkZSRUUoc3RybSwgYWRkciwgc2l6ZSkJXAotCSAgICgqKChzdHJtKS0+emZyZWUpKSgoc3RybSktPm9wYXF1ZSwgKHZvaWRwZikoYWRkciksIChzaXplKSkKLSNkZWZpbmUgVFJZX0ZSRUUocywgcCwgbikge2lmIChwKSBaRlJFRShzLCBwLCBuKTt9Ci0KLS8qIGRlZmxhdGUuaCAtLSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZQotICogQ29weXJpZ2h0IChDKSAxOTk1IEplYW4tbG91cCBHYWlsbHkKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyorKysrKyovCi0vKiBpbmZibG9jay5oIC0tIGhlYWRlciB0byB1c2UgaW5mYmxvY2suYwotICogQ29weXJpZ2h0IChDKSAxOTk1IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlOwotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgRkFSIGluZmxhdGVfYmxvY2tzX3N0YXRlZjsKLQotbG9jYWwgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICogaW5mbGF0ZV9ibG9ja3NfbmV3IE9GKCgKLSAgICB6X3N0cmVhbSAqeiwKLSAgICBjaGVja19mdW5jIGMsICAgICAgICAgICAgICAgLyogY2hlY2sgZnVuY3Rpb24gKi8KLSAgICB1SW50IHcpKTsgICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgKi8KLQotbG9jYWwgaW50IGluZmxhdGVfYmxvY2tzIE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbSAqLAotICAgIGludCkpOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIHJldHVybiBjb2RlICovCi0KLWxvY2FsIHZvaWQgaW5mbGF0ZV9ibG9ja3NfcmVzZXQgT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtICosCi0gICAgdUxvbmdmICopKTsgICAgICAgICAgICAgICAgICAvKiBjaGVjayB2YWx1ZSBvbiBvdXRwdXQgKi8KLQotbG9jYWwgaW50IGluZmxhdGVfYmxvY2tzX2ZyZWUgT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtICosCi0gICAgdUxvbmdmICopKTsgICAgICAgICAgICAgICAgICAvKiBjaGVjayB2YWx1ZSBvbiBvdXRwdXQgKi8KLQotbG9jYWwgaW50IGluZmxhdGVfYWRkaGlzdG9yeSBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW0gKikpOwotCi1sb2NhbCBpbnQgaW5mbGF0ZV9wYWNrZXRfZmx1c2ggT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqKSk7Ci0KLS8qKysrKysqLwotLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLS8qIEh1ZmZtYW4gY29kZSBsb29rdXAgdGFibGUgZW50cnktLXRoaXMgZW50cnkgaXMgZm91ciBieXRlcyBmb3IgbWFjaGluZXMKLSAgIHRoYXQgaGF2ZSAxNi1iaXQgcG9pbnRlcnMgKGUuZy4gUEMncyBpbiB0aGUgc21hbGwgb3IgbWVkaXVtIG1vZGVsKS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgRkFSIGluZmxhdGVfaHVmdDsKLQotc3RydWN0IGluZmxhdGVfaHVmdF9zIHsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBCeXRlIEV4b3A7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KLSAgICAgIEJ5dGUgQml0czsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCi0gICAgfSB3aGF0OwotICAgIHVJbnQgTmFsbG9jOwkvKiBudW1iZXIgb2YgdGhlc2UgYWxsb2NhdGVkIGhlcmUgKi8KLSAgICBCeXRlZiAqcGFkOyAgICAgICAgIC8qIHBhZCBzdHJ1Y3R1cmUgdG8gYSBwb3dlciBvZiAyICg0IGJ5dGVzIGZvciAqLwotICB9IHdvcmQ7ICAgICAgICAgICAgICAgLyogIDE2LWJpdCwgOCBieXRlcyBmb3IgMzItYml0IG1hY2hpbmVzKSAqLwotICB1bmlvbiB7Ci0gICAgdUludCBCYXNlOyAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgb3IgZGlzdGFuY2UgYmFzZSAqLwotICAgIGluZmxhdGVfaHVmdCAqTmV4dDsgLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCi0gIH0gbW9yZTsKLX07Ci0KLSNpZmRlZiBERUJVR19aTElCCi0gIGxvY2FsIHVJbnQgaW5mbGF0ZV9odWZ0czsKLSNlbmRpZgotCi1sb2NhbCBpbnQgaW5mbGF0ZV90cmVlc19iaXRzIE9GKCgKLSAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogMTkgY29kZSBsZW5ndGhzICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgdHJlZSBkZXNpcmVkL2FjdHVhbCBkZXB0aCAqLwotICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBiaXRzIHRyZWUgcmVzdWx0ICovCi0gICAgel9zdHJlYW0gKikpOyAgICAgICAgICAgICAgIC8qIGZvciB6YWxsb2MsIHpmcmVlIGZ1bmN0aW9ucyAqLwotCi1sb2NhbCBpbnQgaW5mbGF0ZV90cmVlc19keW5hbWljIE9GKCgKLSAgICB1SW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCi0gICAgdUludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLwotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiB0aGF0IG1hbnkgKHRvdGFsKSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0gICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRyZWUgcmVzdWx0ICovCi0gICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGRpc3RhbmNlIHRyZWUgcmVzdWx0ICovCi0gICAgel9zdHJlYW0gKikpOyAgICAgICAgICAgICAgIC8qIGZvciB6YWxsb2MsIHpmcmVlIGZ1bmN0aW9ucyAqLwotCi1sb2NhbCBpbnQgaW5mbGF0ZV90cmVlc19maXhlZCBPRigoCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqKSk7ICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotCi1sb2NhbCBpbnQgaW5mbGF0ZV90cmVlc19mcmVlIE9GKCgKLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogdGFibGVzIHRvIGZyZWUgKi8KLSAgICB6X3N0cmVhbSAqKSk7ICAgICAgICAgICAgICAgLyogZm9yIHpmcmVlIGZ1bmN0aW9uICovCi0KLQotLyorKysrKyovCi0vKiBpbmZjb2Rlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mY29kZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Ci10eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIEZBUiBpbmZsYXRlX2NvZGVzX3N0YXRlZjsKLQotbG9jYWwgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmluZmxhdGVfY29kZXNfbmV3IE9GKCgKLSAgICB1SW50LCB1SW50LAotICAgIGluZmxhdGVfaHVmdCAqLCBpbmZsYXRlX2h1ZnQgKiwKLSAgICB6X3N0cmVhbSAqKSk7Ci0KLWxvY2FsIGludCBpbmZsYXRlX2NvZGVzIE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbSAqLAotICAgIGludCkpOwotCi1sb2NhbCB2b2lkIGluZmxhdGVfY29kZXNfZnJlZSBPRigoCi0gICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbSAqKSk7Ci0KLQotLyorKysrKyovCi0vKiBpbmZsYXRlLmMgLS0gemxpYiBpbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIGluZmxhdGUgcHJpdmF0ZSBzdGF0ZSAqLwotc3RydWN0IGludGVybmFsX3N0YXRlIHsKLQotICAvKiBtb2RlICovCi0gIGVudW0gewotICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCi0gICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCi0gICAgICBCTE9DS1MsICAgLyogZGVjb21wcmVzc2luZyBibG9ja3MgKi8KLSAgICAgIENIRUNLNCwgICAvKiBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBDSEVDSzMsICAgLyogdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMiwgICAvKiB0d28gY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMSwgICAvKiBvbmUgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRE9ORSwgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lICovCi0gICAgICBCQUR9ICAgICAgLyogZ290IGFuIGVycm9yLS1zdGF5IGhlcmUgKi8KLSAgICBtb2RlOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0KLSAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLSAgdW5pb24gewotICAgIHVJbnQgbWV0aG9kOyAgICAgICAgLyogaWYgRkxBR1MsIG1ldGhvZCBieXRlICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVMb25nIHdhczsgICAgICAgICAgICAgICAgLyogY29tcHV0ZWQgY2hlY2sgdmFsdWUgKi8KLSAgICAgIHVMb25nIG5lZWQ7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGNoZWNrIHZhbHVlICovCi0gICAgfSBjaGVjazsgICAgICAgICAgICAvKiBpZiBDSEVDSywgY2hlY2sgdmFsdWVzIHRvIGNvbXBhcmUgKi8KLSAgICB1SW50IG1hcmtlcjsgICAgICAgIC8qIGlmIEJBRCwgaW5mbGF0ZVN5bmMncyBtYXJrZXIgYnl0ZXMgY291bnQgKi8KLSAgfSBzdWI7ICAgICAgICAvKiBzdWJtb2RlICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICBpbnQgIG5vd3JhcDsgICAgICAgICAgLyogZmxhZyBmb3Igbm8gd3JhcHBlciAqLwotICB1SW50IHdiaXRzOyAgICAgICAgICAgLyogbG9nMih3aW5kb3cgc2l6ZSkgICg4Li4xNSwgZGVmYXVsdHMgdG8gMTUpICovCi0gIGluZmxhdGVfYmxvY2tzX3N0YXRlZgotICAgICpibG9ja3M7ICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLwotCi19OwotCi0KLWludCBpbmZsYXRlUmVzZXQoeikKLXpfc3RyZWFtICp6OwotewotICB1TG9uZyBjOwotCi0gIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICB6LT50b3RhbF9pbiA9IHotPnRvdGFsX291dCA9IDA7Ci0gIHotPm1zZyA9IFpfTlVMTDsKLSAgei0+c3RhdGUtPm1vZGUgPSB6LT5zdGF0ZS0+bm93cmFwID8gQkxPQ0tTIDogTUVUSE9EOwotICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCAmYyk7Ci0gIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwotICByZXR1cm4gWl9PSzsKLX0KLQotCi1pbnQgaW5mbGF0ZUVuZCh6KQotel9zdHJlYW0gKno7Ci17Ci0gIHVMb25nIGM7Ci0KLSAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCB8fCB6LT56ZnJlZSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICBpZiAoei0+c3RhdGUtPmJsb2NrcyAhPSBaX05VTEwpCi0gICAgaW5mbGF0ZV9ibG9ja3NfZnJlZSh6LT5zdGF0ZS0+YmxvY2tzLCB6LCAmYyk7Ci0gIFpGUkVFKHosIHotPnN0YXRlLCBzaXplb2Yoc3RydWN0IGludGVybmFsX3N0YXRlKSk7Ci0gIHotPnN0YXRlID0gWl9OVUxMOwotICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLWludCBpbmZsYXRlSW5pdDIoeiwgdykKLXpfc3RyZWFtICp6OwotaW50IHc7Ci17Ci0gIC8qIGluaXRpYWxpemUgc3RhdGUgKi8KLSAgaWYgKHogPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLS8qICBpZiAoei0+emFsbG9jID09IFpfTlVMTCkgei0+emFsbG9jID0gemNhbGxvYzsgKi8KLS8qICBpZiAoei0+emZyZWUgPT0gWl9OVUxMKSB6LT56ZnJlZSA9IHpjZnJlZTsgKi8KLSAgaWYgKCh6LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopCi0gICAgICAgWkFMTE9DKHosMSxzaXplb2Yoc3RydWN0IGludGVybmFsX3N0YXRlKSkpID09IFpfTlVMTCkKLSAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gIHotPnN0YXRlLT5ibG9ja3MgPSBaX05VTEw7Ci0KLSAgLyogaGFuZGxlIHVuZG9jdW1lbnRlZCBub3dyYXAgb3B0aW9uIChubyB6bGliIGhlYWRlciBvciBjaGVjaykgKi8KLSAgei0+c3RhdGUtPm5vd3JhcCA9IDA7Ci0gIGlmICh3IDwgMCkKLSAgewotICAgIHcgPSAtIHc7Ci0gICAgei0+c3RhdGUtPm5vd3JhcCA9IDE7Ci0gIH0KLQotICAvKiBzZXQgd2luZG93IHNpemUgKi8KLSAgaWYgKHcgPCA4IHx8IHcgPiAxNSkKLSAgewotICAgIGluZmxhdGVFbmQoeik7Ci0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICB9Ci0gIHotPnN0YXRlLT53Yml0cyA9ICh1SW50KXc7Ci0KLSAgLyogY3JlYXRlIGluZmxhdGVfYmxvY2tzIHN0YXRlICovCi0gIGlmICgoei0+c3RhdGUtPmJsb2NrcyA9Ci0gICAgICAgaW5mbGF0ZV9ibG9ja3NfbmV3KHosIHotPnN0YXRlLT5ub3dyYXAgPyBaX05VTEwgOiBhZGxlcjMyLCAxIDw8IHcpKQotICAgICAgPT0gWl9OVUxMKQotICB7Ci0gICAgaW5mbGF0ZUVuZCh6KTsKLSAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gIH0KLSAgVHJhY2UoKHN0ZGVyciwgImluZmxhdGU6IGFsbG9jYXRlZFxuIikpOwotCi0gIC8qIHJlc2V0IHN0YXRlICovCi0gIGluZmxhdGVSZXNldCh6KTsKLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotaW50IGluZmxhdGVJbml0KHopCi16X3N0cmVhbSAqejsKLXsKLSAgcmV0dXJuIGluZmxhdGVJbml0Mih6LCBERUZfV0JJVFMpOwotfQotCi0KLSNkZWZpbmUgTkVFREJZVEUge2lmKHotPmF2YWlsX2luPT0wKWdvdG8gZW1wdHk7cj1aX09LO30KLSNkZWZpbmUgTkVYVEJZVEUgKHotPmF2YWlsX2luLS0sei0+dG90YWxfaW4rKywqei0+bmV4dF9pbisrKQotCi1pbnQgaW5mbGF0ZSh6LCBmKQotel9zdHJlYW0gKno7Ci1pbnQgZjsKLXsKLSAgaW50IHI7Ci0gIHVJbnQgYjsKLQotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+bmV4dF9pbiA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICByID0gWl9CVUZfRVJST1I7Ci0gIHdoaWxlICgxKSBzd2l0Y2ggKHotPnN0YXRlLT5tb2RlKQotICB7Ci0gICAgY2FzZSBNRVRIT0Q6Ci0gICAgICBORUVEQllURQotICAgICAgaWYgKCgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPSBORVhUQllURSkgJiAweGYpICE9IERFRkxBVEVEKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKHotPnN0YXRlLT5zdWIubWV0aG9kID4+IDQpICsgOCA+IHotPnN0YXRlLT53Yml0cykKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9ICJpbnZhbGlkIHdpbmRvdyBzaXplIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IEZMQUc7Ci0gICAgY2FzZSBGTEFHOgotICAgICAgTkVFREJZVEUKLSAgICAgIGlmICgoYiA9IE5FWFRCWVRFKSAmIDB4MjApCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICB6LT5tc2cgPSAiaW52YWxpZCByZXNlcnZlZCBiaXQiOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoKHotPnN0YXRlLT5zdWIubWV0aG9kIDw8IDgpICsgYikgJSAzMSkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9ICJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBoZWFkZXIgb2tcbiIpKTsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gQkxPQ0tTOwotICAgIGNhc2UgQkxPQ0tTOgotICAgICAgciA9IGluZmxhdGVfYmxvY2tzKHotPnN0YXRlLT5ibG9ja3MsIHosIHIpOwotICAgICAgaWYgKGYgPT0gWl9QQUNLRVRfRkxVU0ggJiYgei0+YXZhaWxfaW4gPT0gMCAmJiB6LT5hdmFpbF9vdXQgIT0gMCkKLQkgIHIgPSBpbmZsYXRlX3BhY2tldF9mbHVzaCh6LT5zdGF0ZS0+YmxvY2tzKTsKLSAgICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChyICE9IFpfU1RSRUFNX0VORCkKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgICByID0gWl9PSzsKLSAgICAgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHotPnN0YXRlLT5ibG9ja3MsIHosICZ6LT5zdGF0ZS0+c3ViLmNoZWNrLndhcyk7Ci0gICAgICBpZiAoei0+c3RhdGUtPm5vd3JhcCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0s0OwotICAgIGNhc2UgQ0hFQ0s0OgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCA9ICh1TG9uZylORVhUQllURSA8PCAyNDsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0szOwotICAgIGNhc2UgQ0hFQ0szOgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgMTY7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMjsKLSAgICBjYXNlIENIRUNLMjoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDg7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMTsKLSAgICBjYXNlIENIRUNLMToKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFOwotCi0gICAgICBpZiAoei0+c3RhdGUtPnN1Yi5jaGVjay53YXMgIT0gei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gImluY29ycmVjdCBkYXRhIGNoZWNrIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOwotICAgIGNhc2UgRE9ORToKLSAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0gICAgY2FzZSBCQUQ6Ci0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLQotIGVtcHR5OgotICBpZiAoZiAhPSBaX1BBQ0tFVF9GTFVTSCkKLSAgICByZXR1cm4gcjsKLSAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICByZXR1cm4gWl9EQVRBX0VSUk9SOwotfQotCi0vKgotICogVGhpcyBzdWJyb3V0aW5lIGFkZHMgdGhlIGRhdGEgYXQgbmV4dF9pbi9hdmFpbF9pbiB0byB0aGUgb3V0cHV0IGhpc3RvcnkKLSAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgb3V0cHV0LiAgVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSAiY2F1Z2h0IHVwIjsKLSAqIGkuZS4gbm8gcGVuZGluZyBvdXRwdXQgKGhlbmNlIHMtPnJlYWQgZXF1YWxzIHMtPndyaXRlKSwgYW5kIHRoZSBzdGF0ZSBtdXN0Ci0gKiBiZSBCTE9DS1MgKGkuZS4gd2Ugc2hvdWxkIGJlIHdpbGxpbmcgdG8gc2VlIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZgotICogQkxPQ0tTKS4gIE9uIGV4aXQsIHRoZSBvdXRwdXQgd2lsbCBhbHNvIGJlIGNhdWdodCB1cCwgYW5kIHRoZSBjaGVja3N1bQotICogd2lsbCBoYXZlIGJlZW4gdXBkYXRlZCBpZiBuZWVkIGJlLgotICovCi0KLWludCBpbmZsYXRlSW5jb21wKHopCi16X3N0cmVhbSAqejsKLXsKLSAgICBpZiAoei0+c3RhdGUtPm1vZGUgIT0gQkxPQ0tTKQotCXJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgcmV0dXJuIGluZmxhdGVfYWRkaGlzdG9yeSh6LT5zdGF0ZS0+YmxvY2tzLCB6KTsKLX0KLQotCi1pbnQgaW5mbGF0ZVN5bmMoeikKLXpfc3RyZWFtICp6OwotewotICB1SW50IG47ICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBsb29rIGF0ICovCi0gIEJ5dGVmICpwOyAgICAgLyogcG9pbnRlciB0byBieXRlcyAqLwotICB1SW50IG07ICAgICAgIC8qIG51bWJlciBvZiBtYXJrZXIgYnl0ZXMgZm91bmQgaW4gYSByb3cgKi8KLSAgdUxvbmcgciwgdzsgICAvKiB0ZW1wb3JhcmllcyB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KLQotICAvKiBzZXQgdXAgKi8KLSAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCkKLSAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIGlmICh6LT5zdGF0ZS0+bW9kZSAhPSBCQUQpCi0gIHsKLSAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDA7Ci0gIH0KLSAgaWYgKChuID0gei0+YXZhaWxfaW4pID09IDApCi0gICAgcmV0dXJuIFpfQlVGX0VSUk9SOwotICBwID0gei0+bmV4dF9pbjsKLSAgbSA9IHotPnN0YXRlLT5zdWIubWFya2VyOwotCi0gIC8qIHNlYXJjaCAqLwotICB3aGlsZSAobiAmJiBtIDwgNCkKLSAgewotICAgIGlmICgqcCA9PSAoQnl0ZSkobSA8IDIgPyAwIDogMHhmZikpCi0gICAgICBtKys7Ci0gICAgZWxzZSBpZiAoKnApCi0gICAgICBtID0gMDsKLSAgICBlbHNlCi0gICAgICBtID0gNCAtIG07Ci0gICAgcCsrLCBuLS07Ci0gIH0KLQotICAvKiByZXN0b3JlICovCi0gIHotPnRvdGFsX2luICs9IHAgLSB6LT5uZXh0X2luOwotICB6LT5uZXh0X2luID0gcDsKLSAgei0+YXZhaWxfaW4gPSBuOwotICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IG07Ci0KLSAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBvbiBhIG5ldyBibG9jayAqLwotICBpZiAobSAhPSA0KQotICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIHIgPSB6LT50b3RhbF9pbjsgIHcgPSB6LT50b3RhbF9vdXQ7Ci0gIGluZmxhdGVSZXNldCh6KTsKLSAgei0+dG90YWxfaW4gPSByOyAgei0+dG90YWxfb3V0ID0gdzsKLSAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7Ci0gIHJldHVybiBaX09LOwotfQotCi0jdW5kZWYgTkVFREJZVEUKLSN1bmRlZiBORVhUQllURQotCi0vKisrKysrKi8KLS8qIGluZnV0aWwuaCAtLSB0eXBlcyBhbmQgbWFjcm9zIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBpbmZsYXRlIGJsb2NrcyBzZW1pLXByaXZhdGUgc3RhdGUgKi8KLXN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB7Ci0KLSAgLyogbW9kZSAqLwotICBlbnVtIHsKLSAgICAgIFRZUEUsICAgICAvKiBnZXQgdHlwZSBiaXRzICgzLCBpbmNsdWRpbmcgZW5kIGJpdCkgKi8KLSAgICAgIExFTlMsICAgICAvKiBnZXQgbGVuZ3RocyBmb3Igc3RvcmVkICovCi0gICAgICBTVE9SRUQsICAgLyogcHJvY2Vzc2luZyBzdG9yZWQgYmxvY2sgKi8KLSAgICAgIFRBQkxFLCAgICAvKiBnZXQgdGFibGUgbGVuZ3RocyAqLwotICAgICAgQlRSRUUsICAgIC8qIGdldCBiaXQgbGVuZ3RocyB0cmVlIGZvciBhIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgIERUUkVFLCAgICAvKiBnZXQgbGVuZ3RoLCBkaXN0YW5jZSB0cmVlcyBmb3IgYSBkeW5hbWljIGJsb2NrICovCi0gICAgICBDT0RFUywgICAgLyogcHJvY2Vzc2luZyBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCi0gICAgICBEUlksICAgICAgLyogb3V0cHV0IHJlbWFpbmluZyB3aW5kb3cgYnl0ZXMgKi8KLSAgICAgIERPTkVCLCAgICAgLyogZmluaXNoZWQgbGFzdCBibG9jaywgZG9uZSAqLwotICAgICAgQkFEQn0gICAgICAvKiBnb3QgYSBkYXRhIGVycm9yLS1zdHVjayBoZXJlICovCi0gICAgbW9kZTsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGVfYmxvY2sgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVuaW9uIHsKLSAgICB1SW50IGxlZnQ7ICAgICAgICAgIC8qIGlmIFNUT1JFRCwgYnl0ZXMgbGVmdCB0byBjb3B5ICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVJbnQgdGFibGU7ICAgICAgICAgICAgICAgLyogdGFibGUgbGVuZ3RocyAoMTQgYml0cykgKi8KLSAgICAgIHVJbnQgaW5kZXg7ICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBibGVucyAob3IgYm9yZGVyKSAqLwotICAgICAgdUludGYgKmJsZW5zOyAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBjb2RlcyAqLwotICAgICAgdUludCBiYjsgICAgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIHRyZWUgZGVwdGggKi8KLSAgICAgIGluZmxhdGVfaHVmdCAqdGI7ICAgICAgICAgLyogYml0IGxlbmd0aCBkZWNvZGluZyB0cmVlICovCi0gICAgICBpbnQgbmJsZW5zOwkJLyogIyBlbGVtZW50cyBhbGxvY2F0ZWQgYXQgYmxlbnMgKi8KLSAgICB9IHRyZWVzOyAgICAgICAgICAgIC8qIGlmIERUUkVFLCBkZWNvZGluZyBpbmZvIGZvciB0cmVlcyAqLwotICAgIHN0cnVjdCB7Ci0gICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7ICAgIC8qIHRyZWVzIHRvIGZyZWUgKi8KLSAgICAgIGluZmxhdGVfY29kZXNfc3RhdGVmCi0gICAgICAgICAqY29kZXM7Ci0gICAgfSBkZWNvZGU7ICAgICAgICAgICAvKiBpZiBDT0RFUywgY3VycmVudCBzdGF0ZSAqLwotICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLwotICB1SW50IGxhc3Q7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGJpdGs7ICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIHVMb25nIGJpdGI7ICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIEJ5dGVmICp3aW5kb3c7ICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICBCeXRlZiAqZW5kOyAgICAgICAgICAgLyogb25lIGJ5dGUgYWZ0ZXIgc2xpZGluZyB3aW5kb3cgKi8KLSAgQnl0ZWYgKnJlYWQ7ICAgICAgICAgIC8qIHdpbmRvdyByZWFkIHBvaW50ZXIgKi8KLSAgQnl0ZWYgKndyaXRlOyAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIGNoZWNrX2Z1bmMgY2hlY2tmbjsgICAvKiBjaGVjayBmdW5jdGlvbiAqLwotICB1TG9uZyBjaGVjazsgICAgICAgICAgLyogY2hlY2sgb24gb3V0cHV0ICovCi0KLX07Ci0KLQotLyogZGVmaW5lcyBmb3IgaW5mbGF0ZSBpbnB1dC9vdXRwdXQgKi8KLS8qICAgdXBkYXRlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSNkZWZpbmUgVVBEQklUUyB7cy0+Yml0Yj1iO3MtPmJpdGs9azt9Ci0jZGVmaW5lIFVQRElOIHt6LT5hdmFpbF9pbj1uO3otPnRvdGFsX2luKz1wLXotPm5leHRfaW47ei0+bmV4dF9pbj1wO30KLSNkZWZpbmUgVVBET1VUIHtzLT53cml0ZT1xO30KLSNkZWZpbmUgVVBEQVRFIHtVUERCSVRTIFVQRElOIFVQRE9VVH0KLSNkZWZpbmUgTEVBVkUge1VQREFURSByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLHoscik7fQotLyogICBnZXQgYnl0ZXMgYW5kIGJpdHMgKi8KLSNkZWZpbmUgTE9BRElOIHtwPXotPm5leHRfaW47bj16LT5hdmFpbF9pbjtiPXMtPmJpdGI7az1zLT5iaXRrO30KLSNkZWZpbmUgTkVFREJZVEUge2lmKG4pcj1aX09LO2Vsc2UgTEVBVkV9Ci0jZGVmaW5lIE5FWFRCWVRFIChuLS0sKnArKykKLSNkZWZpbmUgTkVFREJJVFMoaikge3doaWxlKGs8KGopKXtORUVEQllURTtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319Ci0jZGVmaW5lIERVTVBCSVRTKGopIHtiPj49KGopO2stPShqKTt9Ci0vKiAgIG91dHB1dCBieXRlcyAqLwotI2RlZmluZSBXQVZBSUwgKHE8cy0+cmVhZD9zLT5yZWFkLXEtMTpzLT5lbmQtcSkKLSNkZWZpbmUgTE9BRE9VVCB7cT1zLT53cml0ZTttPVdBVkFJTDt9Ci0jZGVmaW5lIFdSQVAge2lmKHE9PXMtPmVuZCYmcy0+cmVhZCE9cy0+d2luZG93KXtxPXMtPndpbmRvdzttPVdBVkFJTDt9fQotI2RlZmluZSBGTFVTSCB7VVBET1VUIHI9aW5mbGF0ZV9mbHVzaChzLHoscik7IExPQURPVVR9Ci0jZGVmaW5lIE5FRURPVVQge2lmKG09PTApe1dSQVAgaWYobT09MCl7RkxVU0ggV1JBUCBpZihtPT0wKSBMRUFWRX19cj1aX09LO30KLSNkZWZpbmUgT1VUQllURShhKSB7KnErKz0oQnl0ZSkoYSk7bS0tO30KLS8qICAgbG9hZCBsb2NhbCBwb2ludGVycyAqLwotI2RlZmluZSBMT0FEIHtMT0FESU4gTE9BRE9VVH0KLQotLyoKLSAqIFRoZSBJQk0gMTUwIGZpcm13YXJlIG11bmdlcyB0aGUgZGF0YSByaWdodCBhZnRlciBfZXRleHRbXS4gIFRoaXMKLSAqIHByb3RlY3RzIGl0LiAtLSBDb3J0Ci0gKi8KLWxvY2FsIHVJbnQgcHJvdGVjdF9tYXNrW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCAsMCAsMCAsMH07Ci0vKiBBbmQnaW5nIHdpdGggbWFza1tuXSBtYXNrcyB0aGUgbG93ZXIgbiBiaXRzICovCi1sb2NhbCB1SW50IGluZmxhdGVfbWFza1tdID0gewotICAgIDB4MDAwMCwKLSAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKLSAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgotfTsKLQotLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLwotbG9jYWwgaW50IGluZmxhdGVfZmx1c2ggT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtICosCi0gICAgaW50KSk7Ci0KLS8qKysrKysqLwotLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi1sb2NhbCBpbnQgaW5mbGF0ZV9mYXN0IE9GKCgKLSAgICB1SW50LAotICAgIHVJbnQsCi0gICAgaW5mbGF0ZV9odWZ0ICosCi0gICAgaW5mbGF0ZV9odWZ0ICosCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW0gKikpOwotCi0KLS8qKysrKysqLwotLyogaW5mYmxvY2suYyAtLSBpbnRlcnByZXQgYW5kIHByb2Nlc3MgYmxvY2sgdHlwZXMgdG8gbGFzdCBibG9jawotICogQ29weXJpZ2h0IChDKSAxOTk1IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBUYWJsZSBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCi1sb2NhbCB1SW50IGJvcmRlcltdID0geyAvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0KLS8qCi0gICBOb3RlcyBiZXlvbmQgdGhlIDEuOTNhIGFwcG5vdGUudHh0OgotCi0gICAxLiBEaXN0YW5jZSBwb2ludGVycyBuZXZlciBwb2ludCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0Ci0gICAgICBzdHJlYW0uCi0gICAyLiBEaXN0YW5jZSBwb2ludGVycyBjYW4gcG9pbnQgYmFjayBhY3Jvc3MgYmxvY2tzLCB1cCB0byAzMmsgYXdheS4KLSAgIDMuIFRoZXJlIGlzIGFuIGltcGxpZWQgbWF4aW11bSBvZiA3IGJpdHMgZm9yIHRoZSBiaXQgbGVuZ3RoIHRhYmxlIGFuZAotICAgICAgMTUgYml0cyBmb3IgdGhlIGFjdHVhbCBkYXRhLgotICAgNC4gSWYgb25seSBvbmUgY29kZSBleGlzdHMsIHRoZW4gaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LiAgKFplcm8KLSAgICAgIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgcGVyaGFwcyBhIGxpdHRsZSBjb25mdXNpbmcuKSAgSWYgdHdvCi0gICAgICBjb2RlcyBleGlzdCwgdGhleSBhcmUgY29kZWQgdXNpbmcgb25lIGJpdCBlYWNoICgwIGFuZCAxKS4KLSAgIDUuIFRoZXJlIGlzIG5vIHdheSBvZiBzZW5kaW5nIHplcm8gZGlzdGFuY2UgY29kZXMtLWEgZHVtbXkgbXVzdCBiZQotICAgICAgc2VudCBpZiB0aGVyZSBhcmUgbm9uZS4gIChIaXN0b3J5OiBhIHByZSAyLjAgdmVyc2lvbiBvZiBQS1pJUCB3b3VsZAotICAgICAgc3RvcmUgYmxvY2tzIHdpdGggbm8gZGlzdGFuY2UgY29kZXMsIGJ1dCB0aGlzIHdhcyBkaXNjb3ZlcmVkIHRvIGJlCi0gICAgICB0b28gaGFyc2ggYSBjcml0ZXJpb24uKSAgVmFsaWQgb25seSBmb3IgMS45M2EuICAyLjA0YyBkb2VzIGFsbG93Ci0gICAgICB6ZXJvIGRpc3RhbmNlIGNvZGVzLCB3aGljaCBpcyBzZW50IGFzIG9uZSBjb2RlIG9mIHplcm8gYml0cyBpbgotICAgICAgbGVuZ3RoLgotICAgNi4gVGhlcmUgYXJlIHVwIHRvIDI4NiBsaXRlcmFsL2xlbmd0aCBjb2Rlcy4gIENvZGUgMjU2IHJlcHJlc2VudHMgdGhlCi0gICAgICBlbmQtb2YtYmxvY2suICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgc3RhdGljIGxlbmd0aCB0cmVlIGRlZmluZXMKLSAgICAgIDI4OCBjb2RlcyBqdXN0IHRvIGZpbGwgb3V0IHRoZSBIdWZmbWFuIGNvZGVzLiAgQ29kZXMgMjg2IGFuZCAyODcKLSAgICAgIGNhbm5vdCBiZSB1c2VkIHRob3VnaCwgc2luY2UgdGhlcmUgaXMgbm8gbGVuZ3RoIGJhc2Ugb3IgZXh0cmEgYml0cwotICAgICAgZGVmaW5lZCBmb3IgdGhlbS4gIFNpbWlsYXJpbHksIHRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBjb2Rlcy4KLSAgICAgIEhvd2V2ZXIsIHN0YXRpYyB0cmVlcyBkZWZpbmUgMzIgY29kZXMgKGFsbCA1IGJpdHMpIHRvIGZpbGwgb3V0IHRoZQotICAgICAgSHVmZm1hbiBjb2RlcywgYnV0IHRoZSBsYXN0IHR3byBoYWQgYmV0dGVyIG5vdCBzaG93IHVwIGluIHRoZSBkYXRhLgotICAgNy4gVW56aXAgY2FuIGNoZWNrIGR5bmFtaWMgSHVmZm1hbiBibG9ja3MgZm9yIGNvbXBsZXRlIGNvZGUgc2V0cy4KLSAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhhdCBhIHNpbmdsZSBjb2RlIHdvdWxkIG5vdCBiZSBjb21wbGV0ZSAoc2VlICM0KS4KLSAgIDguIFRoZSBmaXZlIGJpdHMgZm9sbG93aW5nIHRoZSBibG9jayB0eXBlIGlzIHJlYWxseSB0aGUgbnVtYmVyIG9mCi0gICAgICBsaXRlcmFsIGNvZGVzIHNlbnQgbWludXMgMjU3LgotICAgOS4gTGVuZ3RoIGNvZGVzIDgsMTYsMTYgYXJlIGludGVycHJldGVkIGFzIDEzIGxlbmd0aCBjb2RlcyBvZiA4IGJpdHMKLSAgICAgICgxKzYrNikuICBUaGVyZWZvcmUsIHRvIG91dHB1dCB0aHJlZSB0aW1lcyB0aGUgbGVuZ3RoLCB5b3Ugb3V0cHV0Ci0gICAgICB0aHJlZSBjb2RlcyAoMSsxKzEpLCB3aGVyZWFzIHRvIG91dHB1dCBmb3VyIHRpbWVzIHRoZSBzYW1lIGxlbmd0aCwKLSAgICAgIHlvdSBvbmx5IG5lZWQgdHdvIGNvZGVzICgxKzMpLiAgSG1tLgotICAxMC4gSW4gdGhlIHRyZWUgcmVjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLCBDb2RlID0gQ29kZSArIEluY3JlbWVudAotICAgICAgb25seSBpZiBCaXRMZW5ndGgoaSkgaXMgbm90IHplcm8uICAoUHJldHR5IG9idmlvdXMuKQotICAxMS4gQ29ycmVjdGlvbjogNCBCaXRzOiAjIG9mIEJpdCBMZW5ndGggY29kZXMgLSA0ICAgICAoNCAtIDE5KQotICAxMi4gTm90ZTogbGVuZ3RoIGNvZGUgMjg0IGNhbiByZXByZXNlbnQgMjI3LTI1OCwgYnV0IGxlbmd0aCBjb2RlIDI4NQotICAgICAgcmVhbGx5IGlzIDI1OC4gIFRoZSBsYXN0IGxlbmd0aCBkZXNlcnZlcyBpdHMgb3duLCBzaG9ydCBjb2RlCi0gICAgICBzaW5jZSBpdCBnZXRzIHVzZWQgYSBsb3QgaW4gdmVyeSByZWR1bmRhbnQgZmlsZXMuICBUaGUgbGVuZ3RoCi0gICAgICAyNTggaXMgc3BlY2lhbCBzaW5jZSAyNTggLSAzICh0aGUgbWluIG1hdGNoIGxlbmd0aCkgaXMgMjU1LgotICAxMy4gVGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGJpdCBsZW5ndGhzIGFyZSByZWFkIGFzIGEKLSAgICAgIHNpbmdsZSBzdHJlYW0gb2YgbGVuZ3Rocy4gIEl0IGlzIHBvc3NpYmxlIChhbmQgYWR2YW50YWdlb3VzKSBmb3IKLSAgICAgIGEgcmVwZWF0IGNvZGUgKDE2LCAxNywgb3IgMTgpIHRvIGdvIGFjcm9zcyB0aGUgYm91bmRhcnkgYmV0d2VlbgotICAgICAgdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCi0gKi8KLQotCi1sb2NhbCB2b2lkIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIGMpCi1pbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci16X3N0cmVhbSAqejsKLXVMb25nZiAqYzsKLXsKLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQotICAgICpjID0gcy0+Y2hlY2s7Ci0gIGlmIChzLT5tb2RlID09IEJUUkVFIHx8IHMtPm1vZGUgPT0gRFRSRUUpCi0gICAgWkZSRUUoeiwgcy0+c3ViLnRyZWVzLmJsZW5zLCBzLT5zdWIudHJlZXMubmJsZW5zICogc2l6ZW9mKHVJbnQpKTsKLSAgaWYgKHMtPm1vZGUgPT0gQ09ERVMpCi0gIHsKLSAgICBpbmZsYXRlX2NvZGVzX2ZyZWUocy0+c3ViLmRlY29kZS5jb2Rlcywgeik7Ci0gICAgaW5mbGF0ZV90cmVlc19mcmVlKHMtPnN1Yi5kZWNvZGUudGQsIHopOwotICAgIGluZmxhdGVfdHJlZXNfZnJlZShzLT5zdWIuZGVjb2RlLnRsLCB6KTsKLSAgfQotICBzLT5tb2RlID0gVFlQRTsKLSAgcy0+Yml0ayA9IDA7Ci0gIHMtPmJpdGIgPSAwOwotICBzLT5yZWFkID0gcy0+d3JpdGUgPSBzLT53aW5kb3c7Ci0gIGlmIChzLT5jaGVja2ZuICE9IFpfTlVMTCkKLSAgICBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikoMEwsIFpfTlVMTCwgMCk7Ci0gIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyByZXNldFxuIikpOwotfQotCi0KLWxvY2FsIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqaW5mbGF0ZV9ibG9ja3NfbmV3KHosIGMsIHcpCi16X3N0cmVhbSAqejsKLWNoZWNrX2Z1bmMgYzsKLXVJbnQgdzsKLXsKLSAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotCi0gIGlmICgocyA9IChpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKilaQUxMT0MKLSAgICAgICAoeiwxLHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUpKSkgPT0gWl9OVUxMKQotICAgIHJldHVybiBzOwotICBpZiAoKHMtPndpbmRvdyA9IChCeXRlZiAqKVpBTExPQyh6LCAxLCB3KSkgPT0gWl9OVUxMKQotICB7Ci0gICAgWkZSRUUoeiwgcywgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSkpOwotICAgIHJldHVybiBaX05VTEw7Ci0gIH0KLSAgcy0+ZW5kID0gcy0+d2luZG93ICsgdzsKLSAgcy0+Y2hlY2tmbiA9IGM7Ci0gIHMtPm1vZGUgPSBUWVBFOwotICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgYWxsb2NhdGVkXG4iKSk7Ci0gIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosICZzLT5jaGVjayk7Ci0gIHJldHVybiBzOwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX2Jsb2NrcyhzLCB6LCByKQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotel9zdHJlYW0gKno7Ci1pbnQgcjsKLXsKLSAgdUludCB0OyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0KLSAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCi0gIExPQUQKLQotICAvKiBwcm9jZXNzIGlucHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KLSAgd2hpbGUgKDEpIHN3aXRjaCAocy0+bW9kZSkKLSAgewotICAgIGNhc2UgVFlQRToKLSAgICAgIE5FRURCSVRTKDMpCi0gICAgICB0ID0gKHVJbnQpYiAmIDc7Ci0gICAgICBzLT5sYXN0ID0gdCAmIDE7Ci0gICAgICBzd2l0Y2ggKHQgPj4gMSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgKi8KLSAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICBzLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICBEVU1QQklUUygzKQotICAgICAgICAgIHQgPSBrICYgNzsgICAgICAgICAgICAgICAgICAgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KLSAgICAgICAgICBEVU1QQklUUyh0KQotICAgICAgICAgIHMtPm1vZGUgPSBMRU5TOyAgICAgICAgICAgICAgIC8qIGdldCBsZW5ndGggb2Ygc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgKi8KLSAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgYmwsIGJkOwotICAgICAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOwotCi0gICAgICAgICAgICBpbmZsYXRlX3RyZWVzX2ZpeGVkKCZibCwgJmJkLCAmdGwsICZ0ZCk7Ci0gICAgICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopOwotICAgICAgICAgICAgaWYgKHMtPnN1Yi5kZWNvZGUuY29kZXMgPT0gWl9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgICAgIExFQVZFCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLT5zdWIuZGVjb2RlLnRsID0gWl9OVUxMOyAgLyogZG9uJ3QgdHJ5IHRvIGZyZWUgdGhlc2UgKi8KLSAgICAgICAgICAgIHMtPnN1Yi5kZWNvZGUudGQgPSBaX05VTEw7Ci0gICAgICAgICAgfQotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IENPREVTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgKi8KLSAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICBzLT5tb2RlID0gVEFCTEU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxsZWdhbCAqLwotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IEJBREI7Ci0gICAgICAgICAgei0+bXNnID0gImludmFsaWQgYmxvY2sgdHlwZSI7Ci0gICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRU5TOgotICAgICAgTkVFREJJVFMoMzIpCi0gICAgICBpZiAoKCh+YikgPj4gMTYpICE9IChiICYgMHhmZmZmKSkKLSAgICAgIHsKLSAgICAgICAgcy0+bW9kZSA9IEJBREI7Ci0gICAgICAgIHotPm1zZyA9ICJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKLSAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIHMtPnN1Yi5sZWZ0ID0gKHVJbnQpYiAmIDB4ZmZmZjsKLSAgICAgIGIgPSBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogZHVtcCBiaXRzICovCi0gICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsIHMtPnN1Yi5sZWZ0KSk7Ci0gICAgICBzLT5tb2RlID0gcy0+c3ViLmxlZnQgPyBTVE9SRUQgOiBUWVBFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVE9SRUQ6Ci0gICAgICBpZiAobiA9PSAwKQotICAgICAgICBMRUFWRQotICAgICAgTkVFRE9VVAotICAgICAgdCA9IHMtPnN1Yi5sZWZ0OwotICAgICAgaWYgKHQgPiBuKSB0ID0gbjsKLSAgICAgIGlmICh0ID4gbSkgdCA9IG07Ci0gICAgICB6bWVtY3B5KHEsIHAsIHQpOwotICAgICAgcCArPSB0OyAgbiAtPSB0OwotICAgICAgcSArPSB0OyAgbSAtPSB0OwotICAgICAgaWYgKChzLT5zdWIubGVmdCAtPSB0KSAhPSAwKQotICAgICAgICBicmVhazsKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZCwgJWx1IHRvdGFsIG91dFxuIiwKLSAgICAgICAgICAgICAgei0+dG90YWxfb3V0ICsgKHEgPj0gcy0+cmVhZCA/IHEgLSBzLT5yZWFkIDoKLSAgICAgICAgICAgICAgKHMtPmVuZCAtIHMtPnJlYWQpICsgKHEgLSBzLT53aW5kb3cpKSkpOwotICAgICAgcy0+bW9kZSA9IHMtPmxhc3QgPyBEUlkgOiBUWVBFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUJMRToKLSAgICAgIE5FRURCSVRTKDE0KQotICAgICAgcy0+c3ViLnRyZWVzLnRhYmxlID0gdCA9ICh1SW50KWIgJiAweDNmZmY7Ci0jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECi0gICAgICBpZiAoKHQgJiAweDFmKSA+IDI5IHx8ICgodCA+PiA1KSAmIDB4MWYpID4gMjkpCi0gICAgICB7Ci0gICAgICAgIHMtPm1vZGUgPSBCQURCOwotICAgICAgICB6LT5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwotICAgICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgICBMRUFWRQotICAgICAgfQotI2VuZGlmCi0gICAgICB0ID0gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpOwotICAgICAgaWYgKHQgPCAxOSkKLSAgICAgICAgdCA9IDE5OwotICAgICAgaWYgKChzLT5zdWIudHJlZXMuYmxlbnMgPSAodUludGYqKVpBTExPQyh6LCB0LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCi0gICAgICB7Ci0gICAgICAgIHIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIHMtPnN1Yi50cmVlcy5uYmxlbnMgPSB0OwotICAgICAgRFVNUEJJVFMoMTQpCi0gICAgICBzLT5zdWIudHJlZXMuaW5kZXggPSAwOwotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotICAgICAgcy0+bW9kZSA9IEJUUkVFOwotICAgIGNhc2UgQlRSRUU6Ci0gICAgICB3aGlsZSAocy0+c3ViLnRyZWVzLmluZGV4IDwgNCArIChzLT5zdWIudHJlZXMudGFibGUgPj4gMTApKQotICAgICAgewotICAgICAgICBORUVEQklUUygzKQotICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbYm9yZGVyW3MtPnN1Yi50cmVlcy5pbmRleCsrXV0gPSAodUludCliICYgNzsKLSAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgIH0KLSAgICAgIHdoaWxlIChzLT5zdWIudHJlZXMuaW5kZXggPCAxOSkKLSAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2JvcmRlcltzLT5zdWIudHJlZXMuaW5kZXgrK11dID0gMDsKLSAgICAgIHMtPnN1Yi50cmVlcy5iYiA9IDc7Ci0gICAgICB0ID0gaW5mbGF0ZV90cmVlc19iaXRzKHMtPnN1Yi50cmVlcy5ibGVucywgJnMtPnN1Yi50cmVlcy5iYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnN1Yi50cmVlcy50Yiwgeik7Ci0gICAgICBpZiAodCAhPSBaX09LKQotICAgICAgewotICAgICAgICByID0gdDsKLSAgICAgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgICAgIHMtPm1vZGUgPSBCQURCOwotICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgYml0cyB0cmVlIG9rXG4iKSk7Ci0gICAgICBzLT5tb2RlID0gRFRSRUU7Ci0gICAgY2FzZSBEVFJFRToKLSAgICAgIHdoaWxlICh0ID0gcy0+c3ViLnRyZWVzLnRhYmxlLAotICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA8IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSkKLSAgICAgIHsKLSAgICAgICAgaW5mbGF0ZV9odWZ0ICpoOwotICAgICAgICB1SW50IGksIGosIGM7Ci0KLSAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy5iYjsKLSAgICAgICAgTkVFREJJVFModCkKLSAgICAgICAgaCA9IHMtPnN1Yi50cmVlcy50YiArICgodUludCliICYgaW5mbGF0ZV9tYXNrW3RdKTsKLSAgICAgICAgdCA9IGgtPndvcmQud2hhdC5CaXRzOwotICAgICAgICBjID0gaC0+bW9yZS5CYXNlOwotICAgICAgICBpZiAoYyA8IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbcy0+c3ViLnRyZWVzLmluZGV4KytdID0gYzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGMgPT0gMTYuLjE4ICovCi0gICAgICAgIHsKLSAgICAgICAgICBpID0gYyA9PSAxOCA/IDcgOiBjIC0gMTQ7Ci0gICAgICAgICAgaiA9IGMgPT0gMTggPyAxMSA6IDM7Ci0gICAgICAgICAgTkVFREJJVFModCArIGkpCi0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBqICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbaV07Ci0gICAgICAgICAgRFVNUEJJVFMoaSkKLSAgICAgICAgICBpID0gcy0+c3ViLnRyZWVzLmluZGV4OwotICAgICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7Ci0gICAgICAgICAgaWYgKGkgKyBqID4gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpIHx8Ci0gICAgICAgICAgICAgIChjID09IDE2ICYmIGkgPCAxKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzLT5tb2RlID0gQkFEQjsKLSAgICAgICAgICAgIHotPm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBMRUFWRQotICAgICAgICAgIH0KLSAgICAgICAgICBjID0gYyA9PSAxNiA/IHMtPnN1Yi50cmVlcy5ibGVuc1tpIC0gMV0gOiAwOwotICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tpKytdID0gYzsKLSAgICAgICAgICB9IHdoaWxlICgtLWopOwotICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZmxhdGVfdHJlZXNfZnJlZShzLT5zdWIudHJlZXMudGIsIHopOwotICAgICAgcy0+c3ViLnRyZWVzLnRiID0gWl9OVUxMOwotICAgICAgewotICAgICAgICB1SW50IGJsLCBiZDsKLSAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOwotICAgICAgICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKLQotICAgICAgICBibCA9IDk7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KLSAgICAgICAgYmQgPSA2OyAgICAgICAgIC8qIG11c3QgYmUgPD0gOSBmb3IgbG9va2FoZWFkIGFzc3VtcHRpb25zICovCi0gICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7Ci0gICAgICAgIHQgPSBpbmZsYXRlX3RyZWVzX2R5bmFtaWMoMjU3ICsgKHQgJiAweDFmKSwgMSArICgodCA+PiA1KSAmIDB4MWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVucywgJmJsLCAmYmQsICZ0bCwgJnRkLCB6KTsKLSAgICAgICAgaWYgKHQgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ID09ICh1SW50KVpfREFUQV9FUlJPUikKLSAgICAgICAgICAgIHMtPm1vZGUgPSBCQURCOwotICAgICAgICAgIHIgPSB0OwotICAgICAgICAgIExFQVZFCi0gICAgICAgIH0KLSAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0cmVlcyBva1xuIikpOwotICAgICAgICBpZiAoKGMgPSBpbmZsYXRlX2NvZGVzX25ldyhibCwgYmQsIHRsLCB0ZCwgeikpID09IFpfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGluZmxhdGVfdHJlZXNfZnJlZSh0ZCwgeik7Ci0gICAgICAgICAgaW5mbGF0ZV90cmVlc19mcmVlKHRsLCB6KTsKLSAgICAgICAgICByID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgTEVBVkUKLSAgICAgICAgfQotICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMsIHMtPnN1Yi50cmVlcy5uYmxlbnMgKiBzaXplb2YodUludCkpOwotICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gYzsKLSAgICAgICAgcy0+c3ViLmRlY29kZS50bCA9IHRsOwotICAgICAgICBzLT5zdWIuZGVjb2RlLnRkID0gdGQ7Ci0gICAgICB9Ci0gICAgICBzLT5tb2RlID0gQ09ERVM7Ci0gICAgY2FzZSBDT0RFUzoKLSAgICAgIFVQREFURQotICAgICAgaWYgKChyID0gaW5mbGF0ZV9jb2RlcyhzLCB6LCByKSkgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgICByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLCB6LCByKTsKLSAgICAgIHIgPSBaX09LOwotICAgICAgaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOwotICAgICAgaW5mbGF0ZV90cmVlc19mcmVlKHMtPnN1Yi5kZWNvZGUudGQsIHopOwotICAgICAgaW5mbGF0ZV90cmVlc19mcmVlKHMtPnN1Yi5kZWNvZGUudGwsIHopOwotICAgICAgTE9BRAotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBlbmQsICVsdSB0b3RhbCBvdXRcbiIsCi0gICAgICAgICAgICAgIHotPnRvdGFsX291dCArIChxID49IHMtPnJlYWQgPyBxIC0gcy0+cmVhZCA6Ci0gICAgICAgICAgICAgIChzLT5lbmQgLSBzLT5yZWFkKSArIChxIC0gcy0+d2luZG93KSkpKTsKLSAgICAgIGlmICghcy0+bGFzdCkKLSAgICAgIHsKLSAgICAgICAgcy0+bW9kZSA9IFRZUEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGsgPiA3KSAgICAgICAgICAgICAgLyogcmV0dXJuIHVudXNlZCBieXRlLCBpZiBhbnkgKi8KLSAgICAgIHsKLSAgICAgICAgQXNzZXJ0KGsgPCAxNiwgImluZmxhdGVfY29kZXMgZ3JhYmJlZCB0b28gbWFueSBieXRlcyIpCi0gICAgICAgIGsgLT0gODsKLSAgICAgICAgbisrOwotICAgICAgICBwLS07ICAgICAgICAgICAgICAgICAgICAvKiBjYW4gYWx3YXlzIHJldHVybiBvbmUgKi8KLSAgICAgIH0KLSAgICAgIHMtPm1vZGUgPSBEUlk7Ci0gICAgY2FzZSBEUlk6Ci0gICAgICBGTFVTSAotICAgICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCi0gICAgICAgIExFQVZFCi0gICAgICBzLT5tb2RlID0gRE9ORUI7Ci0gICAgY2FzZSBET05FQjoKLSAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgQkFEQjoKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGRlZmF1bHQ6Ci0gICAgICByID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICBMRUFWRQotICB9Ci19Ci0KLQotbG9jYWwgaW50IGluZmxhdGVfYmxvY2tzX2ZyZWUocywgeiwgYykKLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtICp6OwotdUxvbmdmICpjOwotewotICBpbmZsYXRlX2Jsb2Nrc19yZXNldChzLCB6LCBjKTsKLSAgWkZSRUUoeiwgcy0+d2luZG93LCBzLT5lbmQgLSBzLT53aW5kb3cpOwotICBaRlJFRSh6LCBzLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlKSk7Ci0gIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyBmcmVlZFxuIikpOwotICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAqIFRoaXMgc3Vicm91dGluZSBhZGRzIHRoZSBkYXRhIGF0IG5leHRfaW4vYXZhaWxfaW4gdG8gdGhlIG91dHB1dCBoaXN0b3J5Ci0gKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG91dHB1dC4gIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgImNhdWdodCB1cCI7Ci0gKiBpLmUuIG5vIHBlbmRpbmcgb3V0cHV0IChoZW5jZSBzLT5yZWFkIGVxdWFscyBzLT53cml0ZSksIGFuZCB0aGUgc3RhdGUgbXVzdAotICogYmUgQkxPQ0tTIChpLmUuIHdlIHNob3VsZCBiZSB3aWxsaW5nIHRvIHNlZSB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YKLSAqIEJMT0NLUykuICBPbiBleGl0LCB0aGUgb3V0cHV0IHdpbGwgYWxzbyBiZSBjYXVnaHQgdXAsIGFuZCB0aGUgY2hlY2tzdW0KLSAqIHdpbGwgaGF2ZSBiZWVuIHVwZGF0ZWQgaWYgbmVlZCBiZS4KLSAqLwotbG9jYWwgaW50IGluZmxhdGVfYWRkaGlzdG9yeShzLCB6KQotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotel9zdHJlYW0gKno7Ci17Ci0gICAgdUxvbmcgYjsgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8gIC8qIE5PVCBVU0VEIEhFUkUgKi8KLSAgICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovIC8qIE5PVCBVU0VEIEhFUkUgKi8KLSAgICB1SW50IHQ7ICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KLSAgICBCeXRlZiAqcDsgICAgICAgICAgICAgLyogaW5wdXQgZGF0YSBwb2ludGVyICovCi0gICAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLwotICAgIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgICB1SW50IG07ICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gZW5kIG9mIHdpbmRvdyBvciByZWFkIHBvaW50ZXIgKi8KLQotICAgIGlmIChzLT5yZWFkICE9IHMtPndyaXRlKQotCXJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAocy0+bW9kZSAhPSBUWVBFKQotCXJldHVybiBaX0RBVEFfRVJST1I7Ci0KLSAgICAvKiB3ZSdyZSByZWFkeSB0byByb2NrICovCi0gICAgTE9BRAotICAgIC8qIHdoaWxlIHRoZXJlIGlzIGlucHV0IHJlYWR5LCBjb3B5IHRvIG91dHB1dCBidWZmZXIsIG1vdmluZwotICAgICAqIHBvaW50ZXJzIGFzIG5lZWRlZC4KLSAgICAgKi8KLSAgICB3aGlsZSAobikgewotCXQgPSBuOyAgLyogaG93IG1hbnkgdG8gZG8gKi8KLQkvKiBpcyB0aGVyZSByb29tIHVudGlsIGVuZCBvZiBidWZmZXI/ICovCi0JaWYgKHQgPiBtKSB0ID0gbTsKLQkvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLQlpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCi0JICAgIHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgdCk7Ci0Jem1lbWNweShxLCBwLCB0KTsKLQlxICs9IHQ7Ci0JcCArPSB0OwotCW4gLT0gdDsKLQl6LT50b3RhbF9vdXQgKz0gdDsKLQlzLT5yZWFkID0gcTsgICAgLyogZHJhZyByZWFkIHBvaW50ZXIgZm9yd2FyZCAqLwotLyogICAgICBXUkFQICAqLyAJLyogZXhwYW5kIFdSQVAgbWFjcm8gYnkgaGFuZCB0byBoYW5kbGUgcy0+cmVhZCAqLwotCWlmIChxID09IHMtPmVuZCkgewotCSAgICBzLT5yZWFkID0gcSA9IHMtPndpbmRvdzsKLQkgICAgbSA9IFdBVkFJTDsKLQl9Ci0gICAgfQotICAgIFVQREFURQotICAgIHJldHVybiBaX09LOwotfQotCi0KLS8qCi0gKiBBdCB0aGUgZW5kIG9mIGEgRGVmbGF0ZS1jb21wcmVzc2VkIFBQUCBwYWNrZXQsIHdlIGV4cGVjdCB0byBoYXZlIHNlZW4KLSAqIGEgYHN0b3JlZCcgYmxvY2sgdHlwZSB2YWx1ZSBidXQgbm90IHRoZSAoemVybykgbGVuZ3RoIGJ5dGVzLgotICovCi1sb2NhbCBpbnQgaW5mbGF0ZV9wYWNrZXRfZmx1c2gocykKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci17Ci0gICAgaWYgKHMtPm1vZGUgIT0gTEVOUykKLQlyZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIHMtPm1vZGUgPSBUWVBFOwotICAgIHJldHVybiBaX09LOwotfQotCi0KLS8qKysrKysqLwotLyogaW5mdHJlZXMuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KLSNkZWZpbmUgYmFzZSBtb3JlLkJhc2UKLSNkZWZpbmUgbmV4dCBtb3JlLk5leHQKLSNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAotI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCi0KLQotbG9jYWwgaW50IGh1ZnRfYnVpbGQgT0YoKAotICAgIHVJbnRmICosICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAqLwotICAgIHVJbnQsICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mICJzaW1wbGUiIGNvZGVzICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAvKiBsaXN0IG9mIGJhc2UgdmFsdWVzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAvKiBsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiBGQVIqLC8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgIC8qIG1heGltdW0gbG9va3VwIGJpdHMgKHJldHVybnMgYWN0dWFsKSAqLwotICAgIHpfc3RyZWFtICopKTsgICAgICAgLyogZm9yIHphbGxvYyBmdW5jdGlvbiAqLwotCi1sb2NhbCB2b2lkcGYgZmFsbG9jIE9GKCgKLSAgICB2b2lkcGYsICAgICAgICAgICAgIC8qIG9wYXF1ZSBwb2ludGVyIChub3QgdXNlZCkgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpdGVtcyAqLwotICAgIHVJbnQpKTsgICAgICAgICAgICAgLyogc2l6ZSBvZiBpdGVtICovCi0KLWxvY2FsIHZvaWQgZmZyZWUgT0YoKAotICAgIHZvaWRwZiBxLCAgICAgICAgICAgLyogb3BhcXVlIHBvaW50ZXIgKG5vdCB1c2VkKSAqLwotICAgIHZvaWRwZiBwLCAgICAgICAgICAgLyogd2hhdCB0byBmcmVlIChub3QgdXNlZCkgKi8KLSAgICB1SW50IG4pKTsJCS8qIG51bWJlciBvZiBieXRlcyAobm90IHVzZWQpICovCi0KLS8qIFRhYmxlcyBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCi1sb2NhbCB1SW50IGNwbGVuc1tdID0geyAvKiBDb3B5IGxlbmd0aHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKLSAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OwotICAgICAgICAvKiBhY3R1YWxseSBsZW5ndGhzIC0gMjsgYWxzbyBzZWUgbm90ZSAjMTMgYWJvdmUgYWJvdXQgMjU4ICovCi1sb2NhbCB1SW50IGNwbGV4dFtdID0geyAvKiBFeHRyYSBiaXRzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCi0gICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDAsIDE5MiwgMTkyfTsgLyogMTkyPT1pbnZhbGlkICovCi1sb2NhbCB1SW50IGNwZGlzdFtdID0geyAvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCi0gICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKLSAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAotICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKLWxvY2FsIHVJbnQgY3BkZXh0W10gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCi0gICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAotICAgICAgICAxMiwgMTIsIDEzLCAxM307Ci0KLS8qCi0gICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgotICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKLSAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKLSAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAotICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCi0gICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQotICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCi0gICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKLSAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcwotICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCi0KLSAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cwotICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLwotICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKLSAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bwotICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKLSAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgotICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAotICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKLSAgIHVzZWQuCi0KLSAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCi0gICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQotICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKLSAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCi0gICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCi0gICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCi0gICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAotICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KLSAqLwotCi0KLS8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1TG9uZy4gKi8KLSNkZWZpbmUgQk1BWCAxNSAgICAgICAgIC8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAqLwotI2RlZmluZSBOX01BWCAyODggICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgY29kZXMgaW4gYW55IHNldCAqLwotCi0jaWZkZWYgREVCVUdfWkxJQgotICB1SW50IGluZmxhdGVfaHVmdHM7Ci0jZW5kaWYKLQotbG9jYWwgaW50IGh1ZnRfYnVpbGQoYiwgbiwgcywgZCwgZSwgdCwgbSwgenMpCi11SW50ZiAqYjsgICAgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KLXVJbnQgbjsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSBOX01BWCkgKi8KLXVJbnQgczsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzaW1wbGUtdmFsdWVkIGNvZGVzICgwLi5zLTEpICovCi11SW50ZiAqZDsgICAgICAgICAgICAgICAvKiBsaXN0IG9mIGJhc2UgdmFsdWVzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi11SW50ZiAqZTsgICAgICAgICAgICAgICAvKiBsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdDsgIC8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KLXVJbnRmICptOyAgICAgICAgICAgICAgIC8qIG1heGltdW0gbG9va3VwIGJpdHMsIHJldHVybnMgYWN0dWFsICovCi16X3N0cmVhbSAqenM7ICAgICAgICAgICAvKiBmb3IgemFsbG9jIGZ1bmN0aW9uICovCi0vKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgotICAgdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCi0gICBpZiB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcwotICAgY2FzZSksIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYWxsIHplcm8gbGVuZ3RoIGNvZGVzIG9yIGFuCi0gICBvdmVyLXN1YnNjcmliZWQgc2V0IG9mIGxlbmd0aHMpLCBvciBaX01FTV9FUlJPUiBpZiBub3QgZW5vdWdoIG1lbW9yeS4gKi8KLXsKLQotICB1SW50IGE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBjb2RlcyBvZiBsZW5ndGggayAqLwotICB1SW50IGNbQk1BWCsxXTsgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIGNvdW50IHRhYmxlICovCi0gIHVJbnQgZjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgcmVwZWF0cyBpbiB0YWJsZSBldmVyeSBmIGVudHJpZXMgKi8KLSAgaW50IGc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLwotICBpbnQgaDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBsZXZlbCAqLwotICByZWdpc3RlciB1SW50IGk7ICAgICAgICAgICAgICAvKiBjb3VudGVyLCBjdXJyZW50IGNvZGUgKi8KLSAgcmVnaXN0ZXIgdUludCBqOyAgICAgICAgICAgICAgLyogY291bnRlciAqLwotICByZWdpc3RlciBpbnQgazsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUgKi8KLSAgaW50IGw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBwZXIgdGFibGUgKHJldHVybmVkIGluIG0pICovCi0gIHJlZ2lzdGVyIHVJbnRmICpwOyAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byBjW10sIGJbXSwgb3IgdltdICovCi0gIGluZmxhdGVfaHVmdCAqcTsgICAgICAgICAgICAgIC8qIHBvaW50cyB0byBjdXJyZW50IHRhYmxlICovCi0gIHN0cnVjdCBpbmZsYXRlX2h1ZnRfcyByOyAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBzdHJ1Y3R1cmUgYXNzaWdubWVudCAqLwotICBpbmZsYXRlX2h1ZnQgKnVbQk1BWF07ICAgICAgICAvKiB0YWJsZSBzdGFjayAqLwotICB1SW50IHZbTl9NQVhdOyAgICAgICAgICAgICAgICAvKiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLwotICByZWdpc3RlciBpbnQgdzsgICAgICAgICAgICAgICAvKiBiaXRzIGJlZm9yZSB0aGlzIHRhYmxlID09IChsICogaCkgKi8KLSAgdUludCB4W0JNQVgrMV07ICAgICAgICAgICAgICAgLyogYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjayAqLwotICB1SW50ZiAqeHA7ICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGludG8geCAqLwotICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KLSAgdUludCB6OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLwotCi0KLSAgLyogR2VuZXJhdGUgY291bnRzIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KLSAgcCA9IGM7Ci0jZGVmaW5lIEMwICpwKysgPSAwOwotI2RlZmluZSBDMiBDMCBDMCBDMCBDMAotI2RlZmluZSBDNCBDMiBDMiBDMiBDMgotICBDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBjW10tLWFzc3VtZSBCTUFYKzEgaXMgMTYgKi8KLSAgcCA9IGI7ICBpID0gbjsKLSAgZG8gewotICAgIGNbKnArK10rKzsgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWCAqLwotICB9IHdoaWxlICgtLWkpOwotICBpZiAoY1swXSA9PSBuKSAgICAgICAgICAgICAgICAvKiBudWxsIGlucHV0LS1hbGwgemVybyBsZW5ndGggY29kZXMgKi8KLSAgewotICAgICp0ID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsKLSAgICAqbSA9IDA7Ci0gICAgcmV0dXJuIFpfT0s7Ci0gIH0KLQotCi0gIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGgsIGJvdW5kICptIGJ5IHRob3NlICovCi0gIGwgPSAqbTsKLSAgZm9yIChqID0gMTsgaiA8PSBCTUFYOyBqKyspCi0gICAgaWYgKGNbal0pCi0gICAgICBicmVhazsKLSAgayA9IGo7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBjb2RlIGxlbmd0aCAqLwotICBpZiAoKHVJbnQpbCA8IGopCi0gICAgbCA9IGo7Ci0gIGZvciAoaSA9IEJNQVg7IGk7IGktLSkKLSAgICBpZiAoY1tpXSkKLSAgICAgIGJyZWFrOwotICBnID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCi0gIGlmICgodUludClsID4gaSkKLSAgICBsID0gaTsKLSAgKm0gPSBsOwotCi0KLSAgLyogQWRqdXN0IGxhc3QgbGVuZ3RoIGNvdW50IHRvIGZpbGwgb3V0IGNvZGVzLCBpZiBuZWVkZWQgKi8KLSAgZm9yICh5ID0gMSA8PCBqOyBqIDwgaTsgaisrLCB5IDw8PSAxKQotICAgIGlmICgoeSAtPSBjW2pdKSA8IDApCi0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICBpZiAoKHkgLT0gY1tpXSkgPCAwKQotICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIGNbaV0gKz0geTsKLQotCi0gIC8qIEdlbmVyYXRlIHN0YXJ0aW5nIG9mZnNldHMgaW50byB0aGUgdmFsdWUgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0gIHhbMV0gPSBqID0gMDsKLSAgcCA9IGMgKyAxOyAgeHAgPSB4ICsgMjsKLSAgd2hpbGUgKC0taSkgeyAgICAgICAgICAgICAgICAgLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCi0gICAgKnhwKysgPSAoaiArPSAqcCsrKTsKLSAgfQotCi0KLSAgLyogTWFrZSBhIHRhYmxlIG9mIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RocyAqLwotICBwID0gYjsgIGkgPSAwOwotICBkbyB7Ci0gICAgaWYgKChqID0gKnArKykgIT0gMCkKLSAgICAgIHZbeFtqXSsrXSA9IGk7Ci0gIH0gd2hpbGUgKCsraSA8IG4pOwotCi0KLSAgLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCi0gIHhbMF0gPSBpID0gMDsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCi0gIHAgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLwotICBoID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyB0YWJsZXMgeWV0LS1sZXZlbCAtMSAqLwotICB3ID0gLWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGRlY29kZWQgPT0gKGwgKiBoKSAqLwotICB1WzBdID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsgICAgICAgIC8qIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KLSAgcSA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7ICAgLyogZGl0dG8gKi8KLSAgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl0dG8gKi8KLQotICAvKiBnbyB0aHJvdWdoIHRoZSBiaXQgbGVuZ3RocyAoayBhbHJlYWR5IGlzIGJpdHMgaW4gc2hvcnRlc3QgY29kZSkgKi8KLSAgZm9yICg7IGsgPD0gZzsgaysrKQotICB7Ci0gICAgYSA9IGNba107Ci0gICAgd2hpbGUgKGEtLSkKLSAgICB7Ci0gICAgICAvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLwotICAgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KLSAgICAgIHdoaWxlIChrID4gdyArIGwpCi0gICAgICB7Ci0gICAgICAgIGgrKzsKLSAgICAgICAgdyArPSBsOyAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgdGFibGUgYWx3YXlzIGwgYml0cyAqLwotCi0gICAgICAgIC8qIGNvbXB1dGUgbWluaW11bSBzaXplIHRhYmxlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsIGJpdHMgKi8KLSAgICAgICAgeiA9ICh6ID0gZyAtIHcpID4gKHVJbnQpbCA/IGwgOiB6OyAgICAgIC8qIHRhYmxlIHNpemUgdXBwZXIgbGltaXQgKi8KLSAgICAgICAgaWYgKChmID0gMSA8PCAoaiA9IGsgLSB3KSkgPiBhICsgMSkgICAgIC8qIHRyeSBhIGstdyBiaXQgdGFibGUgKi8KLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZSAqLwotICAgICAgICAgIGYgLT0gYSArIDE7ICAgICAgICAgICAvKiBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyBsZWZ0ICovCi0gICAgICAgICAgeHAgPSBjICsgazsKLSAgICAgICAgICBpZiAoaiA8IHopCi0gICAgICAgICAgICB3aGlsZSAoKytqIDwgeikgICAgIC8qIHRyeSBzbWFsbGVyIHRhYmxlcyB1cCB0byB6IGJpdHMgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChmIDw8PSAxKSA8PSAqKyt4cCkKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogZW5vdWdoIGNvZGVzIHRvIHVzZSB1cCBqIGJpdHMgKi8KLSAgICAgICAgICAgICAgZiAtPSAqeHA7ICAgICAgICAgLyogZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHogPSAxIDw8IGo7ICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJpZXMgZm9yIGotYml0IHRhYmxlICovCi0KLSAgICAgICAgLyogYWxsb2NhdGUgYW5kIGxpbmsgaW4gbmV3IHRhYmxlICovCi0gICAgICAgIGlmICgocSA9IChpbmZsYXRlX2h1ZnQgKilaQUxMT0MKLSAgICAgICAgICAgICAoenMseiArIDEsc2l6ZW9mKGluZmxhdGVfaHVmdCkpKSA9PSBaX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaCkKLSAgICAgICAgICAgIGluZmxhdGVfdHJlZXNfZnJlZSh1WzBdLCB6cyk7Ci0gICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOyAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCi0gICAgICAgIH0KLQlxLT53b3JkLk5hbGxvYyA9IHogKyAxOwotI2lmZGVmIERFQlVHX1pMSUIKLSAgICAgICAgaW5mbGF0ZV9odWZ0cyArPSB6ICsgMTsKLSNlbmRpZgotICAgICAgICAqdCA9IHEgKyAxOyAgICAgICAgICAgICAvKiBsaW5rIHRvIGxpc3QgZm9yIGh1ZnRfZnJlZSgpICovCi0gICAgICAgICoodCA9ICYocS0+bmV4dCkpID0gWl9OVUxMOwotICAgICAgICB1W2hdID0gKytxOyAgICAgICAgICAgICAvKiB0YWJsZSBzdGFydHMgYWZ0ZXIgbGluayAqLwotCi0gICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCi0gICAgICAgIGlmIChoKQotICAgICAgICB7Ci0gICAgICAgICAgeFtoXSA9IGk7ICAgICAgICAgICAgIC8qIHNhdmUgcGF0dGVybiBmb3IgYmFja2luZyB1cCAqLwotICAgICAgICAgIHIuYml0cyA9IChCeXRlKWw7ICAgICAvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KLSAgICAgICAgICByLmV4b3AgPSAoQnl0ZSlqOyAgICAgLyogYml0cyBpbiB0aGlzIHRhYmxlICovCi0gICAgICAgICAgci5uZXh0ID0gcTsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhpcyB0YWJsZSAqLwotICAgICAgICAgIGogPSBpID4+ICh3IC0gbCk7ICAgICAvKiAoZ2V0IGFyb3VuZCBUdXJibyBDIGJ1ZykgKi8KLSAgICAgICAgICB1W2gtMV1bal0gPSByOyAgICAgICAgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlICovCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogc2V0IHVwIHRhYmxlIGVudHJ5IGluIHIgKi8KLSAgICAgIHIuYml0cyA9IChCeXRlKShrIC0gdyk7Ci0gICAgICBpZiAocCA+PSB2ICsgbikKLSAgICAgICAgci5leG9wID0gMTI4ICsgNjQ7ICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCi0gICAgICBlbHNlIGlmICgqcCA8IHMpCi0gICAgICB7Ci0gICAgICAgIHIuZXhvcCA9IChCeXRlKSgqcCA8IDI1NiA/IDAgOiAzMiArIDY0KTsgICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgKi8KLSAgICAgICAgci5iYXNlID0gKnArKzsgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgci5leG9wID0gKEJ5dGUpZVsqcCAtIHNdICsgMTYgKyA2NDsgLyogbm9uLXNpbXBsZS0tbG9vayB1cCBpbiBsaXN0cyAqLwotICAgICAgICByLmJhc2UgPSBkWypwKysgLSBzXTsKLSAgICAgIH0KLQotICAgICAgLyogZmlsbCBjb2RlLWxpa2UgZW50cmllcyB3aXRoIHIgKi8KLSAgICAgIGYgPSAxIDw8IChrIC0gdyk7Ci0gICAgICBmb3IgKGogPSBpID4+IHc7IGogPCB6OyBqICs9IGYpCi0gICAgICAgIHFbal0gPSByOwotCi0gICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KLSAgICAgIGZvciAoaiA9IDEgPDwgKGsgLSAxKTsgaSAmIGo7IGogPj49IDEpCi0gICAgICAgIGkgXj0gajsKLSAgICAgIGkgXj0gajsKLQotICAgICAgLyogYmFja3VwIG92ZXIgZmluaXNoZWQgdGFibGVzICovCi0gICAgICB3aGlsZSAoKGkgJiAoKDEgPDwgdykgLSAxKSkgIT0geFtoXSkKLSAgICAgIHsKLSAgICAgICAgaC0tOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgbmVlZCB0byB1cGRhdGUgcSAqLwotICAgICAgICB3IC09IGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBSZXR1cm4gWl9CVUZfRVJST1IgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCi0gIHJldHVybiB5ICE9IDAgJiYgZyAhPSAxID8gWl9CVUZfRVJST1IgOiBaX09LOwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX3RyZWVzX2JpdHMoYywgYmIsIHRiLCB6KQotdUludGYgKmM7ICAgICAgICAgICAgICAgLyogMTkgY29kZSBsZW5ndGhzICovCi11SW50ZiAqYmI7ICAgICAgICAgICAgICAvKiBiaXRzIHRyZWUgZGVzaXJlZC9hY3R1YWwgZGVwdGggKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdGI7IC8qIGJpdHMgdHJlZSByZXN1bHQgKi8KLXpfc3RyZWFtICp6OyAgICAgICAgICAgIC8qIGZvciB6ZnJlZSBmdW5jdGlvbiAqLwotewotICBpbnQgcjsKLQotICByID0gaHVmdF9idWlsZChjLCAxOSwgMTksICh1SW50ZiopWl9OVUxMLCAodUludGYqKVpfTlVMTCwgdGIsIGJiLCB6KTsKLSAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgIHotPm1zZyA9ICJvdmVyc3Vic2NyaWJlZCBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOwotICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SKQotICB7Ci0gICAgaW5mbGF0ZV90cmVlc19mcmVlKCp0Yiwgeik7Ci0gICAgei0+bXNnID0gImluY29tcGxldGUgZHluYW1pYyBiaXQgbGVuZ3RocyB0cmVlIjsKLSAgICByID0gWl9EQVRBX0VSUk9SOwotICB9Ci0gIHJldHVybiByOwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMobmwsIG5kLCBjLCBibCwgYmQsIHRsLCB0ZCwgeikKLXVJbnQgbmw7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLwotdUludCBuZDsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi11SW50ZiAqYzsgICAgICAgICAgICAgICAvKiB0aGF0IG1hbnkgKHRvdGFsKSBjb2RlIGxlbmd0aHMgKi8KLXVJbnRmICpibDsgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi11SW50ZiAqYmQ7ICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdGw7IC8qIGxpdGVyYWwvbGVuZ3RoIHRyZWUgcmVzdWx0ICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRkOyAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotel9zdHJlYW0gKno7ICAgICAgICAgICAgLyogZm9yIHpmcmVlIGZ1bmN0aW9uICovCi17Ci0gIGludCByOwotCi0gIC8qIGJ1aWxkIGxpdGVyYWwvbGVuZ3RoIHRyZWUgKi8KLSAgaWYgKChyID0gaHVmdF9idWlsZChjLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgdGwsIGJsLCB6KSkgIT0gWl9PSykKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9ICJvdmVyc3Vic2NyaWJlZCBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKLSAgICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SKQotICAgIHsKLSAgICAgIGluZmxhdGVfdHJlZXNfZnJlZSgqdGwsIHopOwotICAgICAgei0+bXNnID0gImluY29tcGxldGUgbGl0ZXJhbC9sZW5ndGggdHJlZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIC8qIGJ1aWxkIGRpc3RhbmNlIHRyZWUgKi8KLSAgaWYgKChyID0gaHVmdF9idWlsZChjICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgdGQsIGJkLCB6KSkgIT0gWl9PSykKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9ICJvdmVyc3Vic2NyaWJlZCBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKLSAgICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SKSB7Ci0jaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgIHIgPSBaX09LOwotICAgIH0KLSNlbHNlCi0gICAgICBpbmZsYXRlX3RyZWVzX2ZyZWUoKnRkLCB6KTsKLSAgICAgIHotPm1zZyA9ICJpbmNvbXBsZXRlIGxpdGVyYWwvbGVuZ3RoIHRyZWUiOwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICB9Ci0gICAgaW5mbGF0ZV90cmVlc19mcmVlKCp0bCwgeik7Ci0gICAgcmV0dXJuIHI7Ci0jZW5kaWYKLSAgfQotCi0gIC8qIGRvbmUgKi8KLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotLyogYnVpbGQgZml4ZWQgdGFibGVzIG9ubHkgb25jZS0ta2VlcCB0aGVtIGhlcmUgKi8KLWxvY2FsIGludCBmaXhlZF9sb2NrID0gMDsKLWxvY2FsIGludCBmaXhlZF9idWlsdCA9IDA7Ci0jZGVmaW5lIEZJWEVESCA1MzAgICAgICAvKiBudW1iZXIgb2YgaHVmdHMgdXNlZCBieSBmaXhlZCB0YWJsZXMgKi8KLWxvY2FsIHVJbnQgZml4ZWRfbGVmdCA9IEZJWEVESDsKLWxvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF9tZW1bRklYRURIXTsKLWxvY2FsIHVJbnQgZml4ZWRfYmw7Ci1sb2NhbCB1SW50IGZpeGVkX2JkOwotbG9jYWwgaW5mbGF0ZV9odWZ0ICpmaXhlZF90bDsKLWxvY2FsIGluZmxhdGVfaHVmdCAqZml4ZWRfdGQ7Ci0KLQotbG9jYWwgdm9pZHBmIGZhbGxvYyhxLCBuLCBzKQotdm9pZHBmIHE7ICAgICAgICAvKiBvcGFxdWUgcG9pbnRlciAobm90IHVzZWQpICovCi11SW50IG47ICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zICovCi11SW50IHM7ICAgICAgICAgLyogc2l6ZSBvZiBpdGVtICovCi17Ci0gIEFzc2VydChzID09IHNpemVvZihpbmZsYXRlX2h1ZnQpICYmIG4gPD0gZml4ZWRfbGVmdCwKLSAgICAgICAgICJpbmZsYXRlX3RyZWVzIGZhbGxvYyBvdmVyZmxvdyIpOwotICBpZiAocSkgcysrOyAvKiB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCi0gIGZpeGVkX2xlZnQgLT0gbjsKLSAgcmV0dXJuICh2b2lkcGYpKGZpeGVkX21lbSArIGZpeGVkX2xlZnQpOwotfQotCi0KLWxvY2FsIHZvaWQgZmZyZWUocSwgcCwgbikKLXZvaWRwZiBxOwotdm9pZHBmIHA7Ci11SW50IG47Ci17Ci0gIEFzc2VydCgwLCAiaW5mbGF0ZV90cmVlcyBmZnJlZSBjYWxsZWQhIik7Ci0gIGlmIChxKSBxID0gcDsgLyogdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX3RyZWVzX2ZpeGVkKGJsLCBiZCwgdGwsIHRkKQotdUludGYgKmJsOyAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi11SW50ZiAqYmQ7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRsOyAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdGQ7ICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotewotICAvKiBidWlsZCBmaXhlZCB0YWJsZXMgaWYgbm90IGJ1aWx0IGFscmVhZHktLWxvY2sgb3V0IG90aGVyIGluc3RhbmNlcyAqLwotICB3aGlsZSAoKytmaXhlZF9sb2NrID4gMSkKLSAgICBmaXhlZF9sb2NrLS07Ci0gIGlmICghZml4ZWRfYnVpbHQpCi0gIHsKLSAgICBpbnQgazsgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLwotICAgIHVuc2lnbmVkIGNbMjg4XTsgICAgLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KLSAgICB6X3N0cmVhbSB6OyAgICAgICAgIC8qIGZvciBmYWxsb2MgZnVuY3Rpb24gKi8KLQotICAgIC8qIHNldCB1cCBmYWtlIHpfc3RyZWFtIGZvciBtZW1vcnkgcm91dGluZXMgKi8KLSAgICB6LnphbGxvYyA9IGZhbGxvYzsKLSAgICB6LnpmcmVlID0gZmZyZWU7Ci0gICAgei5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgICAvKiBsaXRlcmFsIHRhYmxlICovCi0gICAgZm9yIChrID0gMDsgayA8IDE0NDsgaysrKQotICAgICAgY1trXSA9IDg7Ci0gICAgZm9yICg7IGsgPCAyNTY7IGsrKykKLSAgICAgIGNba10gPSA5OwotICAgIGZvciAoOyBrIDwgMjgwOyBrKyspCi0gICAgICBjW2tdID0gNzsKLSAgICBmb3IgKDsgayA8IDI4ODsgaysrKQotICAgICAgY1trXSA9IDg7Ci0gICAgZml4ZWRfYmwgPSA3OwotICAgIGh1ZnRfYnVpbGQoYywgMjg4LCAyNTcsIGNwbGVucywgY3BsZXh0LCAmZml4ZWRfdGwsICZmaXhlZF9ibCwgJnopOwotCi0gICAgLyogZGlzdGFuY2UgdGFibGUgKi8KLSAgICBmb3IgKGsgPSAwOyBrIDwgMzA7IGsrKykKLSAgICAgIGNba10gPSA1OwotICAgIGZpeGVkX2JkID0gNTsKLSAgICBodWZ0X2J1aWxkKGMsIDMwLCAwLCBjcGRpc3QsIGNwZGV4dCwgJmZpeGVkX3RkLCAmZml4ZWRfYmQsICZ6KTsKLQotICAgIC8qIGRvbmUgKi8KLSAgICBmaXhlZF9idWlsdCA9IDE7Ci0gIH0KLSAgZml4ZWRfbG9jay0tOwotICAqYmwgPSBmaXhlZF9ibDsKLSAgKmJkID0gZml4ZWRfYmQ7Ci0gICp0bCA9IGZpeGVkX3RsOwotICAqdGQgPSBmaXhlZF90ZDsKLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotbG9jYWwgaW50IGluZmxhdGVfdHJlZXNfZnJlZSh0LCB6KQotaW5mbGF0ZV9odWZ0ICp0OyAgICAgICAgLyogdGFibGUgdG8gZnJlZSAqLwotel9zdHJlYW0gKno7ICAgICAgICAgICAgLyogZm9yIHpmcmVlIGZ1bmN0aW9uICovCi0vKiBGcmVlIHRoZSBtYWxsb2MnZWQgdGFibGVzIGJ1aWx0IGJ5IGh1ZnRfYnVpbGQoKSwgd2hpY2ggbWFrZXMgYSBsaW5rZWQKLSAgIGxpc3Qgb2YgdGhlIHRhYmxlcyBpdCBtYWRlLCB3aXRoIHRoZSBsaW5rcyBpbiBhIGR1bW15IGZpcnN0IGVudHJ5IG9mCi0gICBlYWNoIHRhYmxlLiAqLwotewotICByZWdpc3RlciBpbmZsYXRlX2h1ZnQgKnAsICpxOwotCi0gIC8qIEdvIHRocm91Z2ggbGlua2VkIGxpc3QsIGZyZWVpbmcgZnJvbSB0aGUgbWFsbG9jZWQgKHRbLTFdKSBhZGRyZXNzLiAqLwotICBwID0gdDsKLSAgd2hpbGUgKHAgIT0gWl9OVUxMKQotICB7Ci0gICAgcSA9ICgtLXApLT5uZXh0OwotICAgIFpGUkVFKHosIHAsIHAtPndvcmQuTmFsbG9jICogc2l6ZW9mKGluZmxhdGVfaHVmdCkpOwotICAgIHAgPSBxOwotICB9Ci0gIHJldHVybiBaX09LOwotfQotCi0vKisrKysrKi8KLS8qIGluZmNvZGVzLmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGJhc2UgbW9yZS5CYXNlCi0jZGVmaW5lIG5leHQgbW9yZS5OZXh0Ci0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0vKiBpbmZsYXRlIGNvZGVzIHByaXZhdGUgc3RhdGUgKi8KLXN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIHsKLQotICAvKiBtb2RlICovCi0gIGVudW0geyAgICAgICAgLyogd2FpdGluZyBmb3IgImk6Ij1pbnB1dCwgIm86Ij1vdXRwdXQsICJ4OiI9bm90aGluZyAqLwotICAgICAgU1RBUlQsICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0gICAgICBMRU4sICAgICAgLyogaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0ICovCi0gICAgICBMRU5FWFQsICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIERJU1QsICAgICAvKiBpOiBnZXQgZGlzdGFuY2UgbmV4dCAqLwotICAgICAgRElTVEVYVCwgIC8qIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEgKi8KLSAgICAgIENPUFksICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIExJVCwgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBXQVNILCAgICAgLyogbzogZ290IGVvYiwgcG9zc2libHkgc3RpbGwgb3V0cHV0IHdhaXRpbmcgKi8KLSAgICAgIEVORCwgICAgICAvKiB4OiBnb3QgZW9iIGFuZCBhbGwgZGF0YSBmbHVzaGVkICovCi0gICAgICBCQURDT0RFfSAgLyogeDogZ290IGVycm9yICovCi0gICAgbW9kZTsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGVfY29kZXMgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVJbnQgbGVuOwotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIGluZmxhdGVfaHVmdCAqdHJlZTsgICAgICAgLyogcG9pbnRlciBpbnRvIHRyZWUgKi8KLSAgICAgIHVJbnQgbmVlZDsgICAgICAgICAgICAgICAgLyogYml0cyBuZWVkZWQgKi8KLSAgICB9IGNvZGU7ICAgICAgICAgICAgIC8qIGlmIExFTiBvciBESVNULCB3aGVyZSBpbiB0cmVlICovCi0gICAgdUludCBsaXQ7ICAgICAgICAgICAvKiBpZiBMSVQsIGxpdGVyYWwgKi8KLSAgICBzdHJ1Y3QgewotICAgICAgdUludCBnZXQ7ICAgICAgICAgICAgICAgICAvKiBiaXRzIHRvIGdldCBmb3IgZXh0cmEgKi8KLSAgICAgIHVJbnQgZGlzdDsgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IGZyb20gKi8KLSAgICB9IGNvcHk7ICAgICAgICAgICAgIC8qIGlmIEVYVCBvciBDT1BZLCB3aGVyZSBhbmQgaG93IG11Y2ggKi8KLSAgfSBzdWI7ICAgICAgICAgICAgICAgIC8qIHN1Ym1vZGUgKi8KLQotICAvKiBtb2RlIGluZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIEJ5dGUgbGJpdHM7ICAgICAgICAgICAvKiBsdHJlZSBiaXRzIGRlY29kZWQgcGVyIGJyYW5jaCAqLwotICBCeXRlIGRiaXRzOyAgICAgICAgICAgLyogZHRyZWUgYml0cyBkZWNvZGVyIHBlciBicmFuY2ggKi8KLSAgaW5mbGF0ZV9odWZ0ICpsdHJlZTsgICAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGgvZW9iIHRyZWUgKi8KLSAgaW5mbGF0ZV9odWZ0ICpkdHJlZTsgICAgICAgICAgLyogZGlzdGFuY2UgdHJlZSAqLwotCi19OwotCi0KLWxvY2FsIGluZmxhdGVfY29kZXNfc3RhdGVmICppbmZsYXRlX2NvZGVzX25ldyhibCwgYmQsIHRsLCB0ZCwgeikKLXVJbnQgYmwsIGJkOwotaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOwotel9zdHJlYW0gKno7Ci17Ci0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotCi0gIGlmICgoYyA9IChpbmZsYXRlX2NvZGVzX3N0YXRlZiAqKQotICAgICAgIFpBTExPQyh6LDEsc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlKSkpICE9IFpfTlVMTCkKLSAgewotICAgIGMtPm1vZGUgPSBTVEFSVDsKLSAgICBjLT5sYml0cyA9IChCeXRlKWJsOwotICAgIGMtPmRiaXRzID0gKEJ5dGUpYmQ7Ci0gICAgYy0+bHRyZWUgPSB0bDsKLSAgICBjLT5kdHJlZSA9IHRkOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgbmV3XG4iKSk7Ci0gIH0KLSAgcmV0dXJuIGM7Ci19Ci0KLQotbG9jYWwgaW50IGluZmxhdGVfY29kZXMocywgeiwgcikKLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtICp6OwotaW50IHI7Ci17Ci0gIHVJbnQgajsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KLSAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0gIEJ5dGVmICpmOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGNvcHkgc3RyaW5ncyBmcm9tICovCi0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjID0gcy0+c3ViLmRlY29kZS5jb2RlczsgIC8qIGNvZGVzIHN0YXRlICovCi0KLSAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCi0gIExPQUQKLQotICAvKiBwcm9jZXNzIGlucHV0IGFuZCBvdXRwdXQgYmFzZWQgb24gY3VycmVudCBzdGF0ZSAqLwotICB3aGlsZSAoMSkgc3dpdGNoIChjLT5tb2RlKQotICB7ICAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KLSAgICBjYXNlIFNUQVJUOiAgICAgICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0jaWZuZGVmIFNMT1cKLSAgICAgIGlmIChtID49IDI1OCAmJiBuID49IDEwKQotICAgICAgewotICAgICAgICBVUERBVEUKLSAgICAgICAgciA9IGluZmxhdGVfZmFzdChjLT5sYml0cywgYy0+ZGJpdHMsIGMtPmx0cmVlLCBjLT5kdHJlZSwgcywgeik7Ci0gICAgICAgIExPQUQKLSAgICAgICAgaWYgKHIgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGMtPm1vZGUgPSByID09IFpfU1RSRUFNX0VORCA/IFdBU0ggOiBCQURDT0RFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYgLyogIVNMT1cgKi8KLSAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5sYml0czsKLSAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5sdHJlZTsKLSAgICAgIGMtPm1vZGUgPSBMRU47Ci0gICAgY2FzZSBMRU46ICAgICAgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KLSAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbal0pOwotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7Ci0gICAgICBpZiAoZSA9PSAwKSAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+c3ViLmxpdCA9IHQtPmJhc2U7Ci0gICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdC0+YmFzZSA+PSAweDIwICYmIHQtPmJhc2UgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICAgYy0+bW9kZSA9IExJVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29weS5nZXQgPSBlICYgMTU7Ci0gICAgICAgIGMtPmxlbiA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBMRU5FWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdC0+bmV4dDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZSAmIDMyKSAgICAgICAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLwotICAgICAgewotICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICBjLT5tb2RlID0gV0FTSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjLT5tb2RlID0gQkFEQ09ERTsgICAgICAgIC8qIGludmFsaWQgY29kZSAqLwotICAgICAgei0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgTEVBVkUKLSAgICBjYXNlIExFTkVYVDogICAgICAgIC8qIGk6IGdldHRpbmcgbGVuZ3RoIGV4dHJhIChoYXZlIGJhc2UpICovCi0gICAgICBqID0gYy0+c3ViLmNvcHkuZ2V0OwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIGMtPmxlbiArPSAodUludCliICYgaW5mbGF0ZV9tYXNrW2pdOwotICAgICAgRFVNUEJJVFMoaikKLSAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5kYml0czsKLSAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5kdHJlZTsKLSAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBjLT5sZW4pKTsKLSAgICAgIGMtPm1vZGUgPSBESVNUOwotICAgIGNhc2UgRElTVDogICAgICAgICAgLyogaTogZ2V0IGRpc3RhbmNlIG5leHQgKi8KLSAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbal0pOwotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb3B5LmdldCA9IGUgJiAxNTsKLSAgICAgICAgYy0+c3ViLmNvcHkuZGlzdCA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBESVNURVhUOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoZSAmIDY0KSA9PSAwKSAgICAgICAgLyogbmV4dCB0YWJsZSAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29kZS5uZWVkID0gZTsKLSAgICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IHQtPm5leHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgIExFQVZFCi0gICAgY2FzZSBESVNURVhUOiAgICAgICAvKiBpOiBnZXR0aW5nIGRpc3RhbmNlIGV4dHJhICovCi0gICAgICBqID0gYy0+c3ViLmNvcHkuZ2V0OwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIGMtPnN1Yi5jb3B5LmRpc3QgKz0gKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXTsKLSAgICAgIERVTVBCSVRTKGopCi0gICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBjLT5zdWIuY29weS5kaXN0KSk7Ci0gICAgICBjLT5tb2RlID0gQ09QWTsKLSAgICBjYXNlIENPUFk6ICAgICAgICAgIC8qIG86IGNvcHlpbmcgYnl0ZXMgaW4gd2luZG93LCB3YWl0aW5nIGZvciBzcGFjZSAqLwotI2lmbmRlZiBfX1RVUkJPQ19fIC8qIFR1cmJvIEMgYnVnIGZvciBmb2xsb3dpbmcgZXhwcmVzc2lvbiAqLwotICAgICAgZiA9ICh1SW50KShxIC0gcy0+d2luZG93KSA8IGMtPnN1Yi5jb3B5LmRpc3QgPwotICAgICAgICAgIHMtPmVuZCAtIChjLT5zdWIuY29weS5kaXN0IC0gKHEgLSBzLT53aW5kb3cpKSA6Ci0gICAgICAgICAgcSAtIGMtPnN1Yi5jb3B5LmRpc3Q7Ci0jZWxzZQotICAgICAgZiA9IHEgLSBjLT5zdWIuY29weS5kaXN0OwotICAgICAgaWYgKCh1SW50KShxIC0gcy0+d2luZG93KSA8IGMtPnN1Yi5jb3B5LmRpc3QpCi0gICAgICAgIGYgPSBzLT5lbmQgLSAoYy0+c3ViLmNvcHkuZGlzdCAtIChxIC0gcy0+d2luZG93KSk7Ci0jZW5kaWYKLSAgICAgIHdoaWxlIChjLT5sZW4pCi0gICAgICB7Ci0gICAgICAgIE5FRURPVVQKLSAgICAgICAgT1VUQllURSgqZisrKQotICAgICAgICBpZiAoZiA9PSBzLT5lbmQpCi0gICAgICAgICAgZiA9IHMtPndpbmRvdzsKLSAgICAgICAgYy0+bGVuLS07Ci0gICAgICB9Ci0gICAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExJVDogICAgICAgICAgIC8qIG86IGdvdCBsaXRlcmFsLCB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgKi8KLSAgICAgIE5FRURPVVQKLSAgICAgIE9VVEJZVEUoYy0+c3ViLmxpdCkKLSAgICAgIGMtPm1vZGUgPSBTVEFSVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0FTSDogICAgICAgICAgLyogbzogZ290IGVvYiwgcG9zc2libHkgbW9yZSBvdXRwdXQgKi8KLSAgICAgIEZMVVNICi0gICAgICBpZiAocy0+cmVhZCAhPSBzLT53cml0ZSkKLSAgICAgICAgTEVBVkUKLSAgICAgIGMtPm1vZGUgPSBFTkQ7Ci0gICAgY2FzZSBFTkQ6Ci0gICAgICByID0gWl9TVFJFQU1fRU5EOwotICAgICAgTEVBVkUKLSAgICBjYXNlIEJBRENPREU6ICAgICAgIC8qIHg6IGdvdCBlcnJvciAqLwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgIExFQVZFCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgIExFQVZFCi0gIH0KLX0KLQotCi1sb2NhbCB2b2lkIGluZmxhdGVfY29kZXNfZnJlZShjLCB6KQotaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmM7Ci16X3N0cmVhbSAqejsKLXsKLSAgWkZSRUUoeiwgYywgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlKSk7Ci0gIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgZnJlZVxuIikpOwotfQotCi0vKisrKysrKi8KLS8qIGluZmxhdGVfdXRpbC5jIC0tIGRhdGEgYW5kIHJvdXRpbmVzIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIGNvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBzbGlkaW5nIHdpbmRvdyB0byB0aGUgb3V0cHV0IGFyZWEgKi8KLWxvY2FsIGludCBpbmZsYXRlX2ZsdXNoKHMsIHosIHIpCi1pbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Ci16X3N0cmVhbSAqejsKLWludCByOwotewotICB1SW50IG47Ci0gIEJ5dGVmICpwLCAqcTsKLQotICAvKiBsb2NhbCBjb3BpZXMgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyAqLwotICBwID0gei0+bmV4dF9vdXQ7Ci0gIHEgPSBzLT5yZWFkOwotCi0gIC8qIGNvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXMgZmFyIGFzIGVuZCBvZiB3aW5kb3cgKi8KLSAgbiA9ICh1SW50KSgocSA8PSBzLT53cml0ZSA/IHMtPndyaXRlIDogcy0+ZW5kKSAtIHEpOwotICBpZiAobiA+IHotPmF2YWlsX291dCkgbiA9IHotPmF2YWlsX291dDsKLSAgaWYgKG4gJiYgciA9PSBaX0JVRl9FUlJPUikgciA9IFpfT0s7Ci0KLSAgLyogdXBkYXRlIGNvdW50ZXJzICovCi0gIHotPmF2YWlsX291dCAtPSBuOwotICB6LT50b3RhbF9vdXQgKz0gbjsKLQotICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQotICAgIHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgbik7Ci0KLSAgLyogY29weSBhcyBmYXIgYXMgZW5kIG9mIHdpbmRvdyAqLwotICB6bWVtY3B5KHAsIHEsIG4pOwotICBwICs9IG47Ci0gIHEgKz0gbjsKLQotICAvKiBzZWUgaWYgbW9yZSB0byBjb3B5IGF0IGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KLSAgaWYgKHEgPT0gcy0+ZW5kKQotICB7Ci0gICAgLyogd3JhcCBwb2ludGVycyAqLwotICAgIHEgPSBzLT53aW5kb3c7Ci0gICAgaWYgKHMtPndyaXRlID09IHMtPmVuZCkKLSAgICAgIHMtPndyaXRlID0gcy0+d2luZG93OwotCi0gICAgLyogY29tcHV0ZSBieXRlcyB0byBjb3B5ICovCi0gICAgbiA9ICh1SW50KShzLT53cml0ZSAtIHEpOwotICAgIGlmIChuID4gei0+YXZhaWxfb3V0KSBuID0gei0+YXZhaWxfb3V0OwotICAgIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOwotCi0gICAgLyogdXBkYXRlIGNvdW50ZXJzICovCi0gICAgei0+YXZhaWxfb3V0IC09IG47Ci0gICAgei0+dG90YWxfb3V0ICs9IG47Ci0KLSAgICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLSAgICBpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCi0gICAgICBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikocy0+Y2hlY2ssIHEsIG4pOwotCi0gICAgLyogY29weSAqLwotICAgIHptZW1jcHkocCwgcSwgbik7Ci0gICAgcCArPSBuOwotICAgIHEgKz0gbjsKLSAgfQotCi0gIC8qIHVwZGF0ZSBwb2ludGVycyAqLwotICB6LT5uZXh0X291dCA9IHA7Ci0gIHMtPnJlYWQgPSBxOwotCi0gIC8qIGRvbmUgKi8KLSAgcmV0dXJuIHI7Ci19Ci0KLQotLyorKysrKyovCi0vKiBpbmZmYXN0LmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzIGZhc3QKLSAqIENvcHlyaWdodCAoQykgMTk5NSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KLSNkZWZpbmUgYmFzZSBtb3JlLkJhc2UKLSNkZWZpbmUgbmV4dCBtb3JlLk5leHQKLSNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAotI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCi0KLS8qIG1hY3JvcyBmb3IgYml0IGlucHV0IHdpdGggbm8gY2hlY2tpbmcgYW5kIGZvciByZXR1cm5pbmcgdW51c2VkIGJ5dGVzICovCi0jZGVmaW5lIEdSQUJCSVRTKGopIHt3aGlsZShrPChqKSl7Ynw9KCh1TG9uZylORVhUQllURSk8PGs7ays9ODt9fQotI2RlZmluZSBVTkdSQUIge24rPShjPWs+PjMpO3AtPWM7ayY9Nzt9Ci0KLS8qIENhbGxlZCB3aXRoIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHdyaXRlIGluIHdpbmRvdyBhdCBsZWFzdCAyNTgKLSAgICh0aGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoKSBhbmQgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGF2YWlsYWJsZQotICAgYXQgbGVhc3QgdGVuLiAgVGhlIHRlbiBieXRlcyBhcmUgc2l4IGJ5dGVzIGZvciB0aGUgbG9uZ2VzdCBsZW5ndGgvCi0gICBkaXN0YW5jZSBwYWlyIHBsdXMgZm91ciBieXRlcyBmb3Igb3ZlcmxvYWRpbmcgdGhlIGJpdCBidWZmZXIuICovCi0KLWxvY2FsIGludCBpbmZsYXRlX2Zhc3QoYmwsIGJkLCB0bCwgdGQsIHMsIHopCi11SW50IGJsLCBiZDsKLWluZmxhdGVfaHVmdCAqdGwsICp0ZDsKLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLXpfc3RyZWFtICp6OwotewotICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KLSAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0gIHVJbnQgbWw7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsaXRlcmFsL2xlbmd0aCB0cmVlICovCi0gIHVJbnQgbWQ7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBkaXN0YW5jZSB0cmVlICovCi0gIHVJbnQgYzsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBjb3B5ICovCi0gIHVJbnQgZDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgZnJvbSAqLwotICBCeXRlZiAqcjsgICAgICAgICAgICAgLyogY29weSBzb3VyY2UgcG9pbnRlciAqLwotCi0gIC8qIGxvYWQgaW5wdXQsIG91dHB1dCwgYml0IHZhbHVlcyAqLwotICBMT0FECi0KLSAgLyogaW5pdGlhbGl6ZSBtYXNrcyAqLwotICBtbCA9IGluZmxhdGVfbWFza1tibF07Ci0gIG1kID0gaW5mbGF0ZV9tYXNrW2JkXTsKLQotICAvKiBkbyB1bnRpbCBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBzcGFjZSBmb3IgZmFzdCBsb29wICovCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBjYWxsZWQgd2l0aCBtID49IDI1OCAmJiBuID49IDEwICovCi0gICAgLyogZ2V0IGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBHUkFCQklUUygyMCkgICAgICAgICAgICAgICAgLyogbWF4IGJpdHMgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1SW50KWIgJiBtbCkpLT5leG9wKSA9PSAwKQotICAgIHsKLSAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICBUcmFjZXZ2KChzdGRlcnIsIHQtPmJhc2UgPj0gMHgyMCAmJiB0LT5iYXNlIDwgMHg3ZiA/Ci0gICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgKiBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICpxKysgPSAoQnl0ZSl0LT5iYXNlOwotICAgICAgbS0tOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGRvIHsKLSAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICBpZiAoZSAmIDE2KQotICAgICAgewotICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyBmb3IgbGVuZ3RoICovCi0gICAgICAgIGUgJj0gMTU7Ci0gICAgICAgIGMgPSB0LT5iYXNlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pOwotICAgICAgICBEVU1QQklUUyhlKQotICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgICogbGVuZ3RoICV1XG4iLCBjKSk7Ci0KLSAgICAgICAgLyogZGVjb2RlIGRpc3RhbmNlIGJhc2Ugb2YgYmxvY2sgdG8gY29weSAqLwotICAgICAgICBHUkFCQklUUygxNSk7ICAgICAgICAgICAvKiBtYXggYml0cyBmb3IgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICBlID0gKHQgPSB0ZCArICgodUludCliICYgbWQpKS0+ZXhvcDsKLSAgICAgICAgZG8gewotICAgICAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICAgICAgaWYgKGUgJiAxNikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyB0byBhZGQgdG8gZGlzdGFuY2UgYmFzZSAqLwotICAgICAgICAgICAgZSAmPSAxNTsKLSAgICAgICAgICAgIEdSQUJCSVRTKGUpICAgICAgICAgLyogZ2V0IGV4dHJhIGJpdHMgKHVwIHRvIDEzKSAqLwotICAgICAgICAgICAgZCA9IHQtPmJhc2UgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tlXSk7Ci0gICAgICAgICAgICBEVU1QQklUUyhlKQotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGRpc3RhbmNlICV1XG4iLCBkKSk7Ci0KLSAgICAgICAgICAgIC8qIGRvIHRoZSBjb3B5ICovCi0gICAgICAgICAgICBtIC09IGM7Ci0gICAgICAgICAgICBpZiAoKHVJbnQpKHEgLSBzLT53aW5kb3cpID49IGQpICAgICAvKiBvZmZzZXQgYmVmb3JlIGRlc3QgKi8KLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBqdXN0IGNvcHkgKi8KLSAgICAgICAgICAgICAgciA9IHEgLSBkOwotICAgICAgICAgICAgICAqcSsrID0gKnIrKzsgIGMtLTsgICAgICAgIC8qIG1pbmltdW0gY291bnQgaXMgdGhyZWUsICovCi0gICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOyAgICAgICAgLyogIHNvIHVucm9sbCBsb29wIGEgbGl0dGxlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSBvZmZzZXQgYWZ0ZXIgZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZSA9IGQgLSAocSAtIHMtPndpbmRvdyk7ICAvKiBieXRlcyBmcm9tIG9mZnNldCB0byBlbmQgKi8KLSAgICAgICAgICAgICAgciA9IHMtPmVuZCAtIGU7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIG9mZnNldCAqLwotICAgICAgICAgICAgICBpZiAoYyA+IGUpICAgICAgICAgICAgICAgIC8qIGlmIHNvdXJjZSBjcm9zc2VzLCAqLwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyAtPSBlOyAgICAgICAgICAgICAgICAgLyogY29weSB0byBlbmQgb2Ygd2luZG93ICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1lKTsKLSAgICAgICAgICAgICAgICByID0gcy0+d2luZG93OyAgICAgICAgICAvKiBjb3B5IHJlc3QgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgYWxsIG9yIHdoYXQncyBsZWZ0ICovCi0gICAgICAgICAgICAgICpxKysgPSAqcisrOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgoZSAmIDY0KSA9PSAwKQotICAgICAgICAgICAgZSA9ICh0ID0gdC0+bmV4dCArICgodUludCliICYgaW5mbGF0ZV9tYXNrW2VdKSktPmV4b3A7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHotPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgVU5HUkFCCi0gICAgICAgICAgICBVUERBVEUKLSAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKGUgJiA2NCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKChlID0gKHQgPSB0LT5uZXh0ICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pKS0+ZXhvcCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0LT5iYXNlID49IDB4MjAgJiYgdC0+YmFzZSA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICAqIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICAgICAqcSsrID0gKEJ5dGUpdC0+YmFzZTsKLSAgICAgICAgICBtLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUgJiAzMikKLSAgICAgIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICBVTkdSQUIKLSAgICAgICAgVVBEQVRFCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHotPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICBVTkdSQUIKLSAgICAgICAgVVBEQVRFCi0gICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoMSk7Ci0gIH0gd2hpbGUgKG0gPj0gMjU4ICYmIG4gPj0gMTApOwotCi0gIC8qIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0LS1yZXN0b3JlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSAgVU5HUkFCCi0gIFVQREFURQotICByZXR1cm4gWl9PSzsKLX0KLQotCi0vKisrKysrKi8KLS8qIHp1dGlsLmMgLS0gdGFyZ2V0IGRlcGVuZGVudCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NSBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEZyb206IHp1dGlsLmMsdiAxLjggMTk5NS8wNS8wMyAxNzoyNzoxMiBqbG91cCBFeHAgKi8KLQotY2hhciAqemxpYl92ZXJzaW9uID0gWkxJQl9WRVJTSU9OOwotCi1jaGFyICp6X2Vycm1zZ1tdID0gewotInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgMSAqLwotIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgMCAqLwotImZpbGUgZXJyb3IiLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAoLTEpICovCi0ic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICgtMikgKi8KLSJkYXRhIGVycm9yIiwgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgKC0zKSAqLwotImluc3VmZmljaWVudCBtZW1vcnkiLCAvKiBaX01FTV9FUlJPUiAgICAoLTQpICovCi0iYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICgtNSkgKi8KLSIifTsKLQotCi0vKisrKysrKi8KLS8qIGFkbGVyMzIuYyAtLSBjb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEZyb206IGFkbGVyMzIuYyx2IDEuNiAxOTk1LzA1LzAzIDE3OjI3OjA4IGpsb3VwIEV4cCAqLwotCi0jZGVmaW5lIEJBU0UgNjU1MjFMIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCi0jZGVmaW5lIE5NQVggNTU1MgotLyogTk1BWCBpcyB0aGUgbGFyZ2VzdCBuIHN1Y2ggdGhhdCAyNTVuKG4rMSkvMiArIChuKzEpKEJBU0UtMSkgPD0gMl4zMi0xICovCi0KLSNkZWZpbmUgRE8xKGJ1ZikgIHtzMSArPSAqYnVmKys7IHMyICs9IHMxO30KLSNkZWZpbmUgRE8yKGJ1ZikgIERPMShidWYpOyBETzEoYnVmKTsKLSNkZWZpbmUgRE80KGJ1ZikgIERPMihidWYpOyBETzIoYnVmKTsKLSNkZWZpbmUgRE84KGJ1ZikgIERPNChidWYpOyBETzQoYnVmKTsKLSNkZWZpbmUgRE8xNihidWYpIERPOChidWYpOyBETzgoYnVmKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCi0gICAgdUxvbmcgYWRsZXI7Ci0gICAgQnl0ZWYgKmJ1ZjsKLSAgICB1SW50IGxlbjsKLXsKLSAgICB1bnNpZ25lZCBsb25nIHMxID0gYWRsZXIgJiAweGZmZmY7Ci0gICAgdW5zaWduZWQgbG9uZyBzMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7Ci0gICAgaW50IGs7Ci0KLSAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDFMOwotCi0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgayA9IGxlbiA8IE5NQVggPyBsZW4gOiBOTUFYOwotICAgICAgICBsZW4gLT0gazsKLSAgICAgICAgd2hpbGUgKGsgPj0gMTYpIHsKLSAgICAgICAgICAgIERPMTYoYnVmKTsKLSAgICAgICAgICAgIGsgLT0gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGsgIT0gMCkgZG8gewotICAgICAgICAgICAgRE8xKGJ1Zik7Ci0gICAgICAgIH0gd2hpbGUgKC0tayk7Ci0gICAgICAgIHMxICU9IEJBU0U7Ci0gICAgICAgIHMyICU9IEJBU0U7Ci0gICAgfQotICAgIHJldHVybiAoczIgPDwgMTYpIHwgczE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2xpYi96bWVtLmMgYi9hcmNoL3h0ZW5zYS9ib290L2xpYi96bWVtLmMKaW5kZXggNzg0OGYxMi4uZDk4NjJhYSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9saWIvem1lbS5jCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL3ptZW0uYwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSA8bGludXgvemxpYi5oPgogCiAvKiBiaXRzIHRha2VuIGZyb20gcHBjICovCiAKQEAgLTksMTEgKzksMTAgQEAKICAgZm9yICg7Oyk7CiB9CiAKLXZvaWQgKnphbGxvYyh2b2lkICp4LCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3ZvaWQgKnphbGxvYyh1bnNpZ25lZCBzaXplKQogewogICAgICAgICB2b2lkICpwID0gYXZhaWxfcmFtOwogCi0gICAgICAgIHNpemUgKj0gaXRlbXM7CiAgICAgICAgIHNpemUgPSAoc2l6ZSArIDcpICYgLTg7CiAgICAgICAgIGF2YWlsX3JhbSArPSBzaXplOwogICAgICAgICBpZiAoYXZhaWxfcmFtID4gZW5kX2F2YWlsKSB7CkBAIC0yNCwxMSArMjMsNiBAQAogICAgICAgICByZXR1cm4gcDsKIH0KIAotdm9pZCB6ZnJlZSh2b2lkICp4LCB2b2lkICphZGRyLCB1bnNpZ25lZCBuYikKLXsKLX0KLQotCiAjZGVmaW5lIEhFQURfQ1JDICAgICAgICAyCiAjZGVmaW5lIEVYVFJBX0ZJRUxEICAgICA0CiAjZGVmaW5lIE9SSUdfTkFNRSAgICAgICA4CkBAIC00Myw3ICszNyw2IEBACiAJaW50IHIsIGksIGZsYWdzOwogCiAgICAgICAgIC8qIHNraXAgaGVhZGVyICovCi0KICAgICAgICAgaSA9IDEwOwogICAgICAgICBmbGFncyA9IHNyY1szXTsKICAgICAgICAgaWYgKHNyY1syXSAhPSBERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgewpAQCAtNjUsOSArNTgsOCBAQAogICAgICAgICAgICAgICAgIGV4aXQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHMuemFsbG9jID0gemFsbG9jOwotICAgICAgICBzLnpmcmVlID0gemZyZWU7Ci0gICAgICAgIHIgPSBpbmZsYXRlSW5pdDIoJnMsIC1NQVhfV0JJVFMpOworCXMud29ya3NwYWNlID0gemFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOworICAgICAgICByID0gemxpYl9pbmZsYXRlSW5pdDIoJnMsIC1NQVhfV0JJVFMpOwogICAgICAgICBpZiAociAhPSBaX09LKSB7CiAgICAgICAgICAgICAgICAgLy9wdXRzKCJpbmZsYXRlSW5pdDIgcmV0dXJuZWQgIik7IHB1dGhleChyKTsgcHV0cygiXG4iKTsKICAgICAgICAgICAgICAgICBleGl0KCk7CkBAIC03NiwxMiArNjgsMTIgQEAKICAgICAgICAgcy5hdmFpbF9pbiA9ICpsZW5wIC0gaTsKICAgICAgICAgcy5uZXh0X291dCA9IGRzdDsKICAgICAgICAgcy5hdmFpbF9vdXQgPSBkc3RsZW47Ci0gICAgICAgIHIgPSBpbmZsYXRlKCZzLCBaX0ZJTklTSCk7CisgICAgICAgIHIgPSB6bGliX2luZmxhdGUoJnMsIFpfRklOSVNIKTsKICAgICAgICAgaWYgKHIgIT0gWl9PSyAmJiByICE9IFpfU1RSRUFNX0VORCkgewogICAgICAgICAgICAgICAgIC8vcHV0cygiaW5mbGF0ZSByZXR1cm5lZCAiKTsgcHV0aGV4KHIpOyBwdXRzKCJcbiIpOwogICAgICAgICAgICAgICAgIGV4aXQoKTsKICAgICAgICAgfQogICAgICAgICAqbGVucCA9IHMubmV4dF9vdXQgLSAodW5zaWduZWQgY2hhciAqKSBkc3Q7Ci0gICAgICAgIGluZmxhdGVFbmQoJnMpOworICAgICAgICB6bGliX2luZmxhdGVFbmQoJnMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDg0MGNkOWEuLjdjZDFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMKaW5kZXggZDI5YTgxNi4uMDk4ODdjOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYwpAQCAtNTcsNTAgKzU3LDYgQEAKIAogc3RhdGljIGludCBwY2lfYnVzX2NvdW50OwogCi1zdGF0aWMgdm9pZCBwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiogZGV2KTsKLQotI2lmIDAgLy8gRklYTUUKLXN0cnVjdCBwY2lfZml4dXAgcGNpYmlvc19maXh1cHNbXSA9IHsKLQl7IERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpYmlvc19maXh1cF9yZXNvdXJjZXMgfSwKLQl7IDAgfQotfTsKLSNlbmRpZgotCi12b2lkCi1wY2liaW9zX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCi0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc291cmNlKQotewotCXUzMiBuZXcsIGNoZWNrLCBtYXNrOwotCWludCByZWc7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfY3RybCA9IGRldi0+c3lzZGF0YTsKLQotCW5ldyA9IHJlcy0+c3RhcnQ7Ci0JaWYgKHBjaV9jdHJsICYmIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCW5ldyAtPSBwY2lfY3RybC0+aW9fc3BhY2UuYmFzZTsKLQl9Ci0JbmV3IHw9IChyZXMtPmZsYWdzICYgUENJX1JFR0lPTl9GTEFHX01BU0spOwotCWlmIChyZXNvdXJjZSA8IDYpIHsKLQkJcmVnID0gUENJX0JBU0VfQUREUkVTU18wICsgNCpyZXNvdXJjZTsKLQl9IGVsc2UgaWYgKHJlc291cmNlID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKLQkJcmVzLT5mbGFncyB8PSBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFOwotCQlyZWcgPSBkZXYtPnJvbV9iYXNlX3JlZzsKLQl9IGVsc2UgewotCS8qIFNvbWVib2R5IG1pZ2h0IGhhdmUgYXNrZWQgYWxsb2NhdGlvbiBvZiBhIG5vbi1zdGFuZGFyZCByZXNvdXJjZSAqLwotCQlyZXR1cm47Ci0JfQotCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgbmV3KTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcsICZjaGVjayk7Ci0JbWFzayA9IChuZXcgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSA/Ci0JCVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyA6IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7Ci0KLQlpZiAoKG5ldyBeIGNoZWNrKSAmIG1hc2spIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEVycm9yIHdoaWxlIHVwZGF0aW5nIHJlZ2lvbiAiCi0JCSAgICAgICAiJXMvJWQgKCUwOHggIT0gJTA4eClcbiIsIGRldi0+c2xvdF9uYW1lLCByZXNvdXJjZSwKLQkJICAgICAgIG5ldywgY2hlY2spOwotCX0KLX0KLQogLyoKICAqIFdlIG5lZWQgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIGBtaXJyb3JlZCcgVkdBIHBvcnRzCiAgKiBhbmQgb3RoZXIgc3RyYW5nZSBJU0EgaGFyZHdhcmUsIHNvIHdlIGFsd2F5cyB3YW50IHRoZQpAQCAtMTI1LDcgKzgxLDcgQEAKIAogCQlpZiAoc2l6ZSA+IDB4MTAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogSS9PIFJlZ2lvbiAlcy8lZCB0b28gbGFyZ2UiCi0JCQkgICAgICAgIiAoJWxkIGJ5dGVzKVxuIiwgZGV2LT5zbG90X25hbWUsCisJCQkgICAgICAgIiAoJWxkIGJ5dGVzKVxuIiwgcGNpX25hbWUoZGV2KSwKIAkJCSAgICAgICBkZXYtPnJlc291cmNlIC0gcmVzLCBzaXplKTsKIAkJfQogCkBAIC0xNDksNyArMTA1LDcgQEAKIAkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CiAJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7CiAJCQlwcmludGsgKEtFUk5fRVJSICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2UgIgotCQkJCSJvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBkZXYtPnNsb3RfbmFtZSk7CisJCQkJIm9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKQEAgLTE2MSw3ICsxMTcsNyBAQAogCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwogCWlmIChjbWQgIT0gb2xkX2NtZCkgewogCQlwcmludGsoIlBDSTogRW5hYmxpbmcgZGV2aWNlICVzICglMDR4IC0+ICUwNHgpXG4iLAotCQkJZGV2LT5zbG90X25hbWUsIG9sZF9jbWQsIGNtZCk7CisJCQlwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yOTMsNyArMjQ5LDcgQEAKIAkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CiAJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCi0JCQkgICAgICAgIm9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIGRldi0+c2xvdF9uYW1lKTsKKwkJCSAgICAgICAib2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQpAQCAtMzAzLDcgKzI1OSw3IEBACiAJfQogCWlmIChjbWQgIT0gb2xkX2NtZCkgewogCQlwcmludGsoIlBDSTogRW5hYmxpbmcgZGV2aWNlICVzICglMDR4IC0+ICUwNHgpXG4iLAotCQkgICAgICAgZGV2LT5zbG90X25hbWUsIG9sZF9jbWQsIGNtZCk7CisJCSAgICAgICBwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiAKQEAgLTMyNSw0NyArMjgxLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLQotc3RhdGljIHZvaWQKLXBjaWJpb3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfY3RybCA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilkZXYtPnN5c2RhdGE7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLQlpZiAoIXBjaV9jdHJsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTm8gcGNpX2N0cmwgZm9yIFBDSSBkZXYgJXMhXG4iLGRldi0+c2xvdF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKLQkJaWYgKCFyZXMtPnN0YXJ0IHx8ICFyZXMtPmZsYWdzKQotCQkJY29udGludWU7Ci0JCWlmIChyZXMtPmVuZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlEQkcoIlBDSTolcyBSZXNvdXJjZSAlZCBbJTA4bHgtJTA4bHhdIGlzIHVuYXNzaWduZWRcbiIsCi0JCQkgICAgZGV2LT5zbG90X25hbWUsIGksIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKLQkJCXJlcy0+ZW5kIC09IHJlcy0+c3RhcnQ7Ci0JCQlyZXMtPnN0YXJ0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW9mZnNldCA9IDA7Ci0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSBwY2lfY3RybC0+aW9fc3BhY2UuYmFzZTsKLQkJZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIHBjaV9jdHJsLT5tZW1fc3BhY2UuYmFzZTsKLQotCQlpZiAob2Zmc2V0ICE9IDApIHsKLQkJCXJlcy0+c3RhcnQgKz0gb2Zmc2V0OwotCQkJcmVzLT5lbmQgKz0gb2Zmc2V0OwotI2lmZGVmIERFQlVHCi0JCQlwcmludGsoIkZpeHVwIHJlcyAlZCAoJWx4KSBvZiBkZXYgJXM6ICVseCAtPiAlbHhcbiIsCi0JCQkgICAgICAgaSwgcmVzLT5mbGFncywgZGV2LT5zbG90X25hbWUsCi0JCQkgICAgICAgcmVzLT5zdGFydCAtIG9mZnNldCwgcmVzLT5zdGFydCk7Ci0jZW5kaWYKLQkJfQotCX0KLX0KLQogLyoKICAqIFBsYXRmb3JtIHN1cHBvcnQgZm9yIC9wcm9jL2J1cy9wY2kvWC9ZIG1tYXAoKXMsCiAgKiBtb2RlbGxlZCBvbiB0aGUgc3BhcmM2NCBpbXBsZW1lbnRhdGlvbiBieSBEYXZlIE1pbGxlci4KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCA5ZWYwN2E0Li4yNjU5ZWZkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMjM5LDcgKzI0MCw3IEBACiAJY2FzZSBQVFJBQ0VfQ09OVDogLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCiAJewogCQlyZXQgPSAtRUlPOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPiBfTlNJRykKKwkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCiAJCQlicmVhazsKIAkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCiAJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CkBAIC0yNjksNyArMjcwLDcgQEAKIAogCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CiAJCXJldCA9IC1FSU87Ci0JCWlmICgodW5zaWduZWQgbG9uZykgZGF0YSA+IF9OU0lHKQorCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKIAkJCWJyZWFrOwogCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKIAkJY2hpbGQtPnB0cmFjZSB8PSBQVF9TSU5HTEVTVEVQOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYwppbmRleCBhYmM4ZWQ2Li5mMjBjNjQ5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYwpAQCAtNDIsMTIgKzQyLDkgQEAKICNpbmNsdWRlIDxhc20vbW1hbi5oPgogI2luY2x1ZGUgPGFzbS9zaG1wYXJhbS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2lwYy5oPgogCiBleHRlcm4gdm9pZCBkb19zeXNjYWxsX3RyYWNlKHZvaWQpOwogdHlwZWRlZiBpbnQgKCpzeXNjYWxsX3QpKHZvaWQgKmEwLC4uLik7Ci1leHRlcm4gaW50ICgqZG9fc3lzY2FsbHMpKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzeXNjYWxsX3QgZnVuLAotCQkJCSAgICAgaW50IG5hcmcpOwogZXh0ZXJuIHN5c2NhbGxfdCBzeXNfY2FsbF90YWJsZVtdOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3lzX25hcmdfdGFibGVbXTsKIApAQCAtNzIsMTAgKzY5LDggQEAKIC8qCiAgKiBDb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMuCiAgKi8KLQotc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAgCQkJICAgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQorbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCisJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKIAlpbnQgZXJyb3IgPSAtRUJBREY7CiAJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKQEAgLTk3LDI5ICs5Miw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi11bnNpZ25lZCBsb25nIG9sZF9tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbiwgaW50IHByb3QsCi0JCSAgICAgICBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KQotewotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwotfQotCi1sb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7Ci19Ci0KLWludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5hcmVnWzFdLCByZWdzLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotaW50IHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gZG9fZm9yayhDTE9ORV9WRk9SS3xDTE9ORV9WTXxTSUdDSExELCByZWdzLT5hcmVnWzFdLAotCQkgICAgICAgcmVncywgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KIGludCBzeXNfY2xvbmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKQEAgLTE2MiwzMCArMTM0LDYgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotaW50IHN5c19vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgKiBuYW1lKQotewotCWludCBlcnJvcjsKLQotCWlmICghbmFtZSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLG5hbWUsc2l6ZW9mKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnN5c25hbWUsJnN5c3RlbV91dHNuYW1lLnN5c25hbWUsX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19wdXRfdXNlcigwLG5hbWUtPnN5c25hbWUrX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPm5vZGVuYW1lLCZzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSxfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX3B1dF91c2VyKDAsbmFtZS0+bm9kZW5hbWUrX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnJlbGVhc2UsJnN5c3RlbV91dHNuYW1lLnJlbGVhc2UsX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19wdXRfdXNlcigwLG5hbWUtPnJlbGVhc2UrX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnZlcnNpb24sJnN5c3RlbV91dHNuYW1lLnZlcnNpb24sX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19wdXRfdXNlcigwLG5hbWUtPnZlcnNpb24rX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPm1hY2hpbmUsJnN5c3RlbV91dHNuYW1lLm1hY2hpbmUsX19PTERfVVRTX0xFTik7Ci0JZXJyb3IgLT0gX19wdXRfdXNlcigwLG5hbWUtPm1hY2hpbmUrX19PTERfVVRTX0xFTik7Ci0KLQlyZXR1cm4gZXJyb3IgPyAtRUZBVUxUIDogMDsKLX0KLQotCiAvKgogICogQnVpbGQgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIGJ1aWx0aW4gInBvb3IgbWFuJ3Mgc3RyYWNlIi4KICAqLwpAQCAtMzE5LDEwMCArMjY3LDMgQEAKIAlyZWdzLT5hcmVnWzJdID0gcmVzOwogCWRvX3N5c2NhbGxfdHJhY2UoKTsKIH0KLQotLyoKLSAqIHN5c19pcGMoKSBpcyB0aGUgZGUtbXVsdGlwbGV4ZXIgZm9yIHRoZSBTeXNWIElQQyBjYWxscy4uCi0gKgotICogVGhpcyBpcyByZWFsbHkgaG9ycmlibHkgdWdseS4KLSAqLwotCi1pbnQgc3lzX2lwYyAodWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsCi0JCQlpbnQgdGhpcmQsIHZvaWQgX191c2VyICpwdHIsIGxvbmcgZmlmdGgpCi17Ci0JaW50IHZlcnNpb24sIHJldDsKLQotCXZlcnNpb24gPSBjYWxsID4+IDE2OyAvKiBoYWNrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0JY2FsbCAmPSAweGZmZmY7Ci0JcmV0ID0gLUVOT1NZUzsKLQotCXN3aXRjaCAoY2FsbCkgewotCWNhc2UgU0VNT1A6Ci0JCXJldCA9IHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLAotCQkJCSAgICAgc2Vjb25kLCBOVUxMKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFTVRJTUVET1A6Ci0JCXJldCA9IHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLAotCQkJCSAgICAgIHNlY29uZCwgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKSBmaWZ0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU1HRVQ6Ci0JCXJldCA9IHN5c19zZW1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFTUNUTDogewotCQl1bmlvbiBzZW11biBmb3VydGg7Ci0KLQkJaWYgKHB0ciAmJiAhZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCAqX191c2VyICopIHB0cikpCi0JCQlyZXQgPSBzeXNfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm91cnRoKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgTVNHU05EOgotCQlyZXQgPSBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyKikgcHRyLAotCQkJCSAgc2Vjb25kLCB0aGlyZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU0dSQ1Y6Ci0JCXN3aXRjaCAodmVyc2lvbikgewotCQljYXNlIDA6IHsKLQkJCXN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKLQotCQkJaWYgKHB0ciAmJiAhY29weV9mcm9tX3VzZXIoJnRtcCwKLQkJCQkJICAgKHN0cnVjdCBpcGNfa2x1ZGdlICopIHB0ciwKLQkJCQkJICAgc2l6ZW9mICh0bXApKSkKLQkJCQlyZXQgPSBzeXNfbXNncmN2IChmaXJzdCwgdG1wLm1zZ3AsIHNlY29uZCwKLQkJCQkJCSAgdG1wLm1zZ3R5cCwgdGhpcmQpOwotCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJZGVmYXVsdDoKLQkJCXJldCA9IHN5c19tc2dyY3YgKGZpcnN0LCAoc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKikgcHRyLAotCQkJCQkgIHNlY29uZCwgMCwgdGhpcmQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE1TR0dFVDoKLQkJcmV0ID0gc3lzX21zZ2dldCAoKGtleV90KSBmaXJzdCwgc2Vjb25kKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR0NUTDoKLQkJcmV0ID0gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIqKSBwdHIpOwotCQlicmVhazsKLQotCWNhc2UgU0hNQVQ6IHsKLQkJdWxvbmcgcmFkZHI7Ci0JCXJldCA9IGRvX3NobWF0IChmaXJzdCwgKGNoYXIgX191c2VyICopIHB0ciwgc2Vjb25kLCAmcmFkZHIpOwotCi0JCWlmICghcmV0KQotCQkJcmV0ID0gcHV0X3VzZXIgKHJhZGRyLCAodWxvbmcgX191c2VyICopIHRoaXJkKTsKLQotCQlicmVhazsKLQkJfQotCi0JY2FzZSBTSE1EVDoKLQkJcmV0ID0gc3lzX3NobWR0ICgoY2hhciBfX3VzZXIgKilwdHIpOwotCQlicmVhazsKLQotCWNhc2UgU0hNR0VUOgotCQlyZXQgPSBzeXNfc2htZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSE1DVEw6Ci0JCXJldCA9IHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsIChzdHJ1Y3Qgc2htaWRfZHMgX191c2VyKikgcHRyKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5oIGIvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmgKaW5kZXggNWIzZjc1Zi4uMjE2YzEwYSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmgKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmgKQEAgLTI1LDQxICsyNSw0MCBAQAogICovCiAKIFNZU0NBTEwoMCwgMCkJCSAgICAgICAgICAgICAgICAvKiAwMCAqLwotCiBTWVNDQUxMKHN5c19leGl0LCAxKQotU1lTQ0FMTChzeXNfZm9yaywgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19yZWFkLCAzKQogU1lTQ0FMTChzeXNfd3JpdGUsIDMpCiBTWVNDQUxMKHN5c19vcGVuLCAzKQkJCS8qIDA1ICovCiBTWVNDQUxMKHN5c19jbG9zZSwgMSkKLVNZU0NBTEwoc3lzX3dhaXRwaWQsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQogU1lTQ0FMTChzeXNfY3JlYXQsIDIpCiBTWVNDQUxMKHN5c19saW5rLCAyKQogU1lTQ0FMTChzeXNfdW5saW5rLCAxKQkJCS8qIDEwICovCiBTWVNDQUxMKHN5c19leGVjdmUsIDApCiBTWVNDQUxMKHN5c19jaGRpciwgMSkKLVNZU0NBTEwoc3lzX3RpbWUsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQogU1lTQ0FMTChzeXNfbWtub2QsIDMpCiBTWVNDQUxMKHN5c19jaG1vZCwgMikJCQkvKiAxNSAqLwogU1lTQ0FMTChzeXNfbGNob3duLCAzKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3N0YXQsIDIpCitTWVNDQUxMKHN5c19uZXdzdGF0LCAyKQogU1lTQ0FMTChzeXNfbHNlZWssIDMpCiBTWVNDQUxMKHN5c19nZXRwaWQsIDApCQkJLyogMjAgKi8KIFNZU0NBTEwoc3lzX21vdW50LCA1KQotU1lTQ0FMTChzeXNfb2xkdW1vdW50LCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKIFNZU0NBTEwoc3lzX3NldHVpZCwgMSkKIFNZU0NBTEwoc3lzX2dldHVpZCwgMCkKLVNZU0NBTEwoc3lzX3N0aW1lLCAxKQkJCS8qIDI1ICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQkJLyogMjUgKi8KIFNZU0NBTEwoc3lzX3B0cmFjZSwgNCkKLVNZU0NBTEwoc3lzX2FsYXJtLCAxKQotU1lTQ0FMTChzeXNfZnN0YXQsIDIpCi1TWVNDQUxMKHN5c19wYXVzZSwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCitTWVNDQUxMKHN5c19uZXdmc3RhdCwgMikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c191dGltZSwgMikJCQkvKiAzMCAqLwogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19hY2Nlc3MsIDIpCi1TWVNDQUxMKHN5c19uaWNlLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAzNSAqLwogU1lTQ0FMTChzeXNfc3luYywgMCkKIFNZU0NBTEwoc3lzX2tpbGwsIDIpCkBAIC03Myw3ICs3Miw3IEBACiBTWVNDQUxMKHN5c19icmssIDEpCQkJLyogNDUgKi8KIFNZU0NBTEwoc3lzX3NldGdpZCwgMSkKIFNZU0NBTEwoc3lzX2dldGdpZCwgMCkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiB3YXMgc2lnbmFsKDIpICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfZ2V0ZXVpZCwgMCkKIFNZU0NBTEwoc3lzX2dldGVnaWQsIDApCQkJLyogNTAgKi8KIFNZU0NBTEwoc3lzX2FjY3QsIDEpCkBAIC04NCwyMSArODMsMjEgQEAKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDIpCiBTWVNDQUxMKHN5c19zZXRwZ2lkLCAyKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX29sZHVuYW1lLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX3VtYXNrLCAxKQkJCS8qIDYwICovCiBTWVNDQUxMKHN5c19jaHJvb3QsIDEpCiBTWVNDQUxMKHN5c191c3RhdCwgMikKIFNZU0NBTEwoc3lzX2R1cDIsIDIpCiBTWVNDQUxMKHN5c19nZXRwcGlkLCAwKQotU1lTQ0FMTChzeXNfZ2V0cGdycCwgMCkJCQkvKiA2NSAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDY1ICovCiBTWVNDQUxMKHN5c19zZXRzaWQsIDApCiBTWVNDQUxMKHN5c19zaWdhY3Rpb24sIDMpCi1TWVNDQUxMKHN5c19zZ2V0bWFzaywgMCkKLVNZU0NBTEwoc3lzX3NzZXRtYXNrLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCiBTWVNDQUxMKHN5c19zZXRyZXVpZCwgMikJCS8qIDcwICovCiBTWVNDQUxMKHN5c19zZXRyZWdpZCwgMikKIFNZU0NBTEwoc3lzX3NpZ3N1c3BlbmQsIDApCi1TWVNDQUxMKHN5c19zaWdwZW5kaW5nLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKIFNZU0NBTEwoc3lzX3NldGhvc3RuYW1lLCAyKQogU1lTQ0FMTChzeXNfc2V0cmxpbWl0LCAyKQkJLyogNzUgKi8KIFNZU0NBTEwoc3lzX2dldHJsaW1pdCwgMikKQEAgLTEwNywxNSArMTA2LDE1IEBACiBTWVNDQUxMKHN5c19zZXR0aW1lb2ZkYXksIDIpCiBTWVNDQUxMKHN5c19nZXRncm91cHMsIDIpCQkvKiA4MCAqLwogU1lTQ0FMTChzeXNfc2V0Z3JvdXBzLCAyKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCSAvKiBvbGRfc2VsZWN0ICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfc3ltbGluaywgMikKLVNZU0NBTEwoc3lzX2xzdGF0LCAyKQorU1lTQ0FMTChzeXNfbmV3bHN0YXQsIDIpCiBTWVNDQUxMKHN5c19yZWFkbGluaywgMykJCS8qIDg1ICovCiBTWVNDQUxMKHN5c191c2VsaWIsIDEpCiBTWVNDQUxMKHN5c19zd2Fwb24sIDIpCiBTWVNDQUxMKHN5c19yZWJvb3QsIDMpCi1TWVNDQUxMKG9sZF9yZWFkZGlyLCAzKQotU1lTQ0FMTChvbGRfbW1hcCwgNikJCQkvKiA5MCAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMykKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDYpCQkvKiA5MCAqLwogU1lTQ0FMTChzeXNfbXVubWFwLCAyKQogU1lTQ0FMTChzeXNfdHJ1bmNhdGUsIDIpCiBTWVNDQUxMKHN5c19mdHJ1bmNhdGUsIDIpCkBAIC0xMjcsNyArMTI2LDcgQEAKIFNZU0NBTEwoc3lzX3N0YXRmcywgMikKIFNZU0NBTEwoc3lzX2ZzdGF0ZnMsIDIpCQkJLyogMTAwICovCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQotU1lTQ0FMTChzeXNfc29ja2V0Y2FsbCwgMikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDIpCiBTWVNDQUxMKHN5c19zeXNsb2csIDMpCiBTWVNDQUxMKHN5c19zZXRpdGltZXIsIDMpCiBTWVNDQUxMKHN5c19nZXRpdGltZXIsIDIpCQkvKiAxMDUgKi8KQEAgLTEzNywzMiArMTM2LDMyIEBACiBTWVNDQUxMKHN5c191bmFtZSwgMSkKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAxMTAgKi8KIFNZU0NBTEwoc3lzX3ZoYW5ndXAsIDApCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogd2FzIHN5c19pZGxlKCkgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfd2FpdDQsIDQpCiBTWVNDQUxMKHN5c19zd2Fwb2ZmLCAxKQkJCS8qIDExNSAqLwogU1lTQ0FMTChzeXNfc3lzaW5mbywgMSkKLVNZU0NBTEwoc3lzX2lwYywgNSkgICAJCQkvKiA2IHJlYWxseSwgYnV0IGdsaWJjIHVzZXMgb25seSA1KSAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX2ZzeW5jLCAxKQogU1lTQ0FMTChzeXNfc2lncmV0dXJuLCAwKQogU1lTQ0FMTChzeXNfY2xvbmUsIDApCQkJLyogMTIwICovCiBTWVNDQUxMKHN5c19zZXRkb21haW5uYW1lLCAyKQogU1lTQ0FMTChzeXNfbmV3dW5hbWUsIDEpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKSAJCS8qIHN5c19tb2RpZnlfbGR0ICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfYWRqdGltZXgsIDEpCiBTWVNDQUxMKHN5c19tcHJvdGVjdCwgMykJCS8qIDEyNSAqLwotU1lTQ0FMTChzeXNfc2lncHJvY21hc2ssIDMpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAyKQkJLyogb2xkIHN5c19jcmVhdGVfbW9kdWxlICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKIFNZU0NBTEwoc3lzX2luaXRfbW9kdWxlLCAyKQogU1lTQ0FMTChzeXNfZGVsZXRlX21vZHVsZSwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCQkvKiBvbGQgc3lzX2dldF9rZXJuZWxfc3lzbSAqLwkvKiAxMzAgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCQkvKiAxMzAgKi8KIFNZU0NBTEwoc3lzX3F1b3RhY3RsLCAwKQogU1lTQ0FMTChzeXNfZ2V0cGdpZCwgMSkKIFNZU0NBTEwoc3lzX2ZjaGRpciwgMSkKIFNZU0NBTEwoc3lzX2JkZmx1c2gsIDIpCiBTWVNDQUxMKHN5c19zeXNmcywgMykJCQkvKiAxMzUgKi8KIFNZU0NBTEwoc3lzX3BlcnNvbmFsaXR5LCAxKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIGZvciBhZnNfc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX3NldGZzdWlkLCAxKQogU1lTQ0FMTChzeXNfc2V0ZnNnaWQsIDEpCiBTWVNDQUxMKHN5c19sbHNlZWssIDUpCQkJLyogMTQwICovCkBAIC0yMTIsNyArMjExLDcgQEAKIFNZU0NBTEwoc3lzX3NvY2tldHBhaXIsIDQpCiBTWVNDQUxMKHN5c19zZXRyZXN1aWQsIDMpCQkvKiAxODUgKi8KIFNZU0NBTEwoc3lzX2dldHJlc3VpZCwgMykKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDUpCQkvKiBvbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgNSkKIFNZU0NBTEwoc3lzX3BvbGwsIDMpCiBTWVNDQUxMKHN5c19uZnNzZXJ2Y3RsLCAzKQogU1lTQ0FMTChzeXNfc2V0cmVzZ2lkLCAzKQkJLyogMTkwICovCkBAIC0yMzUsNyArMjM0LDcgQEAKIFNZU0NBTEwoc3lzX3NlbmRmaWxlLCA0KQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCi1TWVNDQUxMKHN5c19tbWFwMiwgNikJCQkvKiAyMTAgKi8KK1NZU0NBTEwoc3lzX21tYXAsIDYpCQkJLyogMjEwICovCiBTWVNDQUxMKHN5c190cnVuY2F0ZTY0LCAyKQogU1lTQ0FMTChzeXNfZnRydW5jYXRlNjQsIDIpCiBTWVNDQUxMKHN5c19zdGF0NjQsIDIpCkBAIC0yNDUsNCArMjQ0LDQgQEAKIFNZU0NBTEwoc3lzX21pbmNvcmUsIDMpCiBTWVNDQUxMKHN5c19tYWR2aXNlLCAzKQogU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCwgMykKLVNZU0NBTEwoc3lzX3Zmb3JrLCAwKQkJCS8qIDIyMCAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDIyMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwppbmRleCA4MDQyNDZlLi4yMjVkNjRkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdGltZXguaD4KQEAgLTQ4OCw4ICs0ODksNyBAQAogCiAJaWYgKHBhbmljX29uX29vcHMpIHsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDUgKiBIWik7CisJCXNzbGVlcCg1KTsKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOwogCX0KIAlkb19leGl0KGVycik7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDQ3NmIyYjUuLjVlZDcxZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC05MCwxMCArOTAsMTAgQEAKICAgICAqKC5saXRlcmFsIC50ZXh0KQogICAgICooLnNyb20udGV4dCkKICAgICBWTUxJTlVYX1NZTUJPTChfX3NjaGVkX3RleHRfc3RhcnQpID0gLjsKLSAgICAqKC5zY2hlZC50ZXh0LmxpdGVyYWwgLnNjaGVkLnRleHQpCisgICAgKiguc2NoZWQubGl0ZXJhbCAuc2NoZWQudGV4dCkKICAgICBWTUxJTlVYX1NZTUJPTChfX3NjaGVkX3RleHRfZW5kKSA9IC47CiAgICAgVk1MSU5VWF9TWU1CT0woX19sb2NrX3RleHRfc3RhcnQpID0gLjsKLSAgICAqKC5zcGlubG9jay50ZXh0LmxpdGVyYWwgLnNwaW5sb2NrLnRleHQpCisgICAgKiguc3BpbmxvY2subGl0ZXJhbCAuc3BpbmxvY2sudGV4dCkKICAgICBWTUxJTlVYX1NZTUJPTChfX2xvY2tfdGV4dF9lbmQpID0gLjsKIAogICB9CkBAIC0xNjQsNyArMTY0LDcgQEAKICAgX19pbml0X2JlZ2luID0gLjsKICAgLmluaXQudGV4dCA6IHsKICAgCV9zaW5pdHRleHQgPSAuOwotCSooLmluaXQudGV4dC5saXRlcmFsKSAqKC5pbml0LnRleHQpCisJKiguaW5pdC5saXRlcmFsKSAqKC5pbml0LnRleHQpCiAJX2Vpbml0dGV4dCA9IC47CiAgIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCA5MGQ2MDg5Li4yNTZjMGIxIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIGNvbmZpZyBDUllQVE9fQUVTCiAJdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyIKLQlkZXBlbmRzIG9uIENSWVBUTyAmJiAhKChYODYgfHwgVU1MX1g4NikgJiYgITY0QklUKQorCWRlcGVuZHMgb24gQ1JZUFRPICYmICEoWDg2IHx8IFVNTF9YODYpCiAJaGVscAogCSAgQUVTIGNpcGhlciBhbGdvcml0aG1zIChGSVBTLTE5NykuIEFFUyB1c2VzIHRoZSBSaWpuZGFlbCAKIAkgIGFsZ29yaXRobS4KQEAgLTE4NCw2ICsxODQsMjYgQEAKIAogCSAgU2VlIDxodHRwOi8vY3NyYy5uaXN0Lmdvdi9lbmNyeXB0aW9uL2Flcy8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCitjb25maWcgQ1JZUFRPX0FFU19YODZfNjQKKwl0cmlzdGF0ZSAiQUVTIGNpcGhlciBhbGdvcml0aG1zICh4ODZfNjQpIgorCWRlcGVuZHMgb24gQ1JZUFRPICYmICgoWDg2IHx8IFVNTF9YODYpICYmIDY0QklUKQorCWhlbHAKKwkgIEFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoRklQUy0xOTcpLiBBRVMgdXNlcyB0aGUgUmlqbmRhZWwgCisJICBhbGdvcml0aG0uCisKKwkgIFJpam5kYWVsIGFwcGVhcnMgdG8gYmUgY29uc2lzdGVudGx5IGEgdmVyeSBnb29kIHBlcmZvcm1lciBpbgorCSAgYm90aCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBjb21wdXRpbmcgCisJICBlbnZpcm9ubWVudHMgcmVnYXJkbGVzcyBvZiBpdHMgdXNlIGluIGZlZWRiYWNrIG9yIG5vbi1mZWVkYmFjayAKKwkgIG1vZGVzLiBJdHMga2V5IHNldHVwIHRpbWUgaXMgZXhjZWxsZW50LCBhbmQgaXRzIGtleSBhZ2lsaXR5IGlzIAorCSAgZ29vZC4gUmlqbmRhZWwncyB2ZXJ5IGxvdyBtZW1vcnkgcmVxdWlyZW1lbnRzIG1ha2UgaXQgdmVyeSB3ZWxsIAorCSAgc3VpdGVkIGZvciByZXN0cmljdGVkLXNwYWNlIGVudmlyb25tZW50cywgaW4gd2hpY2ggaXQgYWxzbyAKKwkgIGRlbW9uc3RyYXRlcyBleGNlbGxlbnQgcGVyZm9ybWFuY2UuIFJpam5kYWVsJ3Mgb3BlcmF0aW9ucyBhcmUgCisJICBhbW9uZyB0aGUgZWFzaWVzdCB0byBkZWZlbmQgYWdhaW5zdCBwb3dlciBhbmQgdGltaW5nIGF0dGFja3MuCQorCisJICBUaGUgQUVTIHNwZWNpZmllcyB0aHJlZSBrZXkgc2l6ZXM6IDEyOCwgMTkyIGFuZCAyNTYgYml0cwkgIAorCisJICBTZWUgPGh0dHA6Ly9jc3JjLm5pc3QuZ292L2VuY3J5cHRpb24vYWVzLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKIGNvbmZpZyBDUllQVE9fQ0FTVDUKIAl0cmlzdGF0ZSAiQ0FTVDUgKENBU1QtMTI4KSBjaXBoZXIgYWxnb3JpdGhtIgogCWRlcGVuZHMgb24gQ1JZUFRPCmRpZmYgLS1naXQgYS9jcnlwdG8vYXBpLmMgYi9jcnlwdG8vYXBpLmMKaW5kZXggMzk0MTY5YS4uYjQ3Mjg4MSAxMDA2NDQKLS0tIGEvY3J5cHRvL2FwaS5jCisrKyBiL2NyeXB0by9hcGkuYwpAQCAtMTMsOSArMTMsMTIgQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTMzLDcgKzM2LDcgQEAKIAltb2R1bGVfcHV0KGFsZy0+Y3JhX21vZHVsZSk7CiB9CiAKLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBjcnlwdG9fYWxnICpxLCAqYWxnID0gTlVMTDsKIApAQCAtNTQsNiArNTcsMTMgQEAKIAlyZXR1cm4gYWxnOwogfQogCisvKiBBIGZhciBtb3JlIGludGVsbGlnZW50IHZlcnNpb24gb2YgdGhpcyBpcyBwbGFubmVkLiAgRm9yIG5vdywganVzdAorICogdHJ5IGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoY3J5cHRvX2FsZ19sb29rdXAobmFtZSksIG5hbWUpOworfQorCiBzdGF0aWMgaW50IGNyeXB0b19pbml0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKIHsKIAl0Zm0tPmNydF9mbGFncyA9IDA7CkBAIC0xMTcsMjAgKzEyNyw0NiBAQAogCX0KIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKworCXN3aXRjaCAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCWRlZmF1bHQ6CisJCUJVRygpOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQlsZW4gPSBjcnlwdG9fY2lwaGVyX2N0eHNpemUoYWxnLCBmbGFncyk7CisJCWJyZWFrOworCQkKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCWxlbiA9IGNyeXB0b19kaWdlc3RfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgorCQlsZW4gPSBjcnlwdG9fY29tcHJlc3NfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbiArIGFsZy0+Y3JhX2FsaWdubWFzazsKK30KKwogc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOwogCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJdW5zaWduZWQgaW50IHRmbV9zaXplOwogCiAJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOwogCWlmIChhbGcgPT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JCi0JdGZtID0ga21hbGxvYyhzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplLCBHRlBfS0VSTkVMKTsKKworCXRmbV9zaXplID0gc2l6ZW9mKCp0Zm0pICsgY3J5cHRvX2N0eHNpemUoYWxnLCBmbGFncyk7CisJdGZtID0ga21hbGxvYyh0Zm1fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRmbSA9PSBOVUxMKQogCQlnb3RvIG91dF9wdXQ7CiAKLQltZW1zZXQodGZtLCAwLCBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplKTsKKwltZW1zZXQodGZtLCAwLCB0Zm1fc2l6ZSk7CiAJCiAJdGZtLT5fX2NydF9hbGcgPSBhbGc7CiAJCkBAIC0xNTUsOCArMTkxLDE0IEBACiAKIHZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOwotCWludCBzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCWludCBzaXplOworCisJaWYgKHVubGlrZWx5KCF0Zm0pKQorCQlyZXR1cm47CisKKwlhbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKIAogCWNyeXB0b19leGl0X29wcyh0Zm0pOwogCWNyeXB0b19hbGdfcHV0KGFsZyk7CkBAIC0xNjgsNiArMjEwLDEyIEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGNyeXB0b19hbGcgKnE7CisKKwlpZiAoYWxnLT5jcmFfYWxpZ25tYXNrICYgKGFsZy0+Y3JhX2FsaWdubWFzayArIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhbGctPmNyYV9hbGlnbm1hc2sgPiBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOwogCQogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAkKZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIuYyBiL2NyeXB0by9jaXBoZXIuYwppbmRleCBmNDM0Y2U3Li44ZGE2NDQzIDEwMDY0NAotLS0gYS9jcnlwdG8vY2lwaGVyLmMKKysrIGIvY3J5cHRvL2NpcGhlci5jCkBAIC00LDYgKzQsNyBAQAogICogQ2lwaGVyIG9wZXJhdGlvbnMuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKQEAgLTIyLDEwICsyMyw2IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgogCi10eXBlZGVmIHZvaWQgKGNyeXB0Zm5fdCkodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKTsKLXR5cGVkZWYgdm9pZCAocHJvY2ZuX3QpKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosCi0gICAgICAgICAgICAgICAgICAgICAgICB1OCosIGNyeXB0Zm5fdCwgdm9pZCAqKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHhvcl82NCh1OCAqYSwgY29uc3QgdTggKmIpCiB7CiAJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOwpAQCAtMzksNjMgKzM2LDcwIEBACiAJKCh1MzIgKilhKVsyXSBePSAoKHUzMiAqKWIpWzJdOwogCSgodTMyICopYSlbM10gXj0gKCh1MzIgKiliKVszXTsKIH0KLSAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHJlcGFyZV9zcmMoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IGJzaXplLAotCQkJCXZvaWQgKnRtcCwgaW50IGluX3BsYWNlKQotewotCXZvaWQgKnNyYyA9IHdhbGstPmRhdGE7Ci0JaW50IG4gPSBic2l6ZTsKIAotCWlmICh1bmxpa2VseShzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMod2FsaywgYnNpemUpKSkgeworc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdF9zbG93KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICppbiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICpvdXQsIHVuc2lnbmVkIGludCBic2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhkZXNjLT50Zm0pOworCXU4IGJ1ZmZlcltic2l6ZSAqIDIgKyBhbGlnbm1hc2tdOworCXU4ICpzcmMgPSAodTggKilBTElHTigodW5zaWduZWQgbG9uZylidWZmZXIsIGFsaWdubWFzayArIDEpOworCXU4ICpkc3QgPSBzcmMgKyBic2l6ZTsKKwl1bnNpZ25lZCBpbnQgbjsKKworCW4gPSBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyYywgaW4sIGJzaXplLCAwKTsKKwlzY2F0dGVyd2Fsa19hZHZhbmNlKGluLCBuKTsKKworCWRlc2MtPnByZm4oZGVzYywgZHN0LCBzcmMsIGJzaXplKTsKKworCW4gPSBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKGRzdCwgb3V0LCBic2l6ZSwgMSk7CisJc2NhdHRlcndhbGtfYWR2YW5jZShvdXQsIG4pOworCisJcmV0dXJuIGJzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdF9mYXN0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICppbiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICpvdXQsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKnRtcCkKK3sKKwl1OCAqc3JjLCAqZHN0OworCisJc3JjID0gaW4tPmRhdGE7CisJZHN0ID0gc2NhdHRlcndhbGtfc2FtZWJ1Zihpbiwgb3V0KSA/IHNyYyA6IG91dC0+ZGF0YTsKKworCWlmICh0bXApIHsKKwkJbWVtY3B5KHRtcCwgaW4tPmRhdGEsIG5ieXRlcyk7CiAJCXNyYyA9IHRtcDsKLQkJbiA9IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Moc3JjLCB3YWxrLCBic2l6ZSwgMCk7Ci0JfQotCXNjYXR0ZXJ3YWxrX2FkdmFuY2Uod2Fsaywgbik7Ci0JcmV0dXJuIHNyYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpwcmVwYXJlX2RzdChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgYnNpemUsCi0JCQkJdm9pZCAqdG1wLCBpbnQgaW5fcGxhY2UpCi17Ci0Jdm9pZCAqZHN0ID0gd2Fsay0+ZGF0YTsKLQotCWlmICh1bmxpa2VseShzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMod2FsaywgYnNpemUpKSB8fCBpbl9wbGFjZSkKIAkJZHN0ID0gdG1wOwotCXJldHVybiBkc3Q7Ci19CisJfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfc3JjKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBic2l6ZSwKLQkJCQl2b2lkICpzcmMsIGludCBpbl9wbGFjZSkKLXsKLX0KKwluYnl0ZXMgPSBkZXNjLT5wcmZuKGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfZHN0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBic2l6ZSwKLQkJCQl2b2lkICpkc3QsIGludCBpbl9wbGFjZSkKLXsKLQlpbnQgbiA9IGJzaXplOworCWlmICh0bXApCisJCW1lbWNweShvdXQtPmRhdGEsIHRtcCwgbmJ5dGVzKTsKIAotCWlmICh1bmxpa2VseShzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMod2FsaywgYnNpemUpKSkKLQkJbiA9IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3MoZHN0LCB3YWxrLCBic2l6ZSwgMSk7Ci0JZWxzZSBpZiAoaW5fcGxhY2UpCi0JCW1lbWNweSh3YWxrLT5kYXRhLCBkc3QsIGJzaXplKTsKLQlzY2F0dGVyd2Fsa19hZHZhbmNlKHdhbGssIG4pOworCXNjYXR0ZXJ3YWxrX2FkdmFuY2UoaW4sIG5ieXRlcyk7CisJc2NhdHRlcndhbGtfYWR2YW5jZShvdXQsIG5ieXRlcyk7CisKKwlyZXR1cm4gbmJ5dGVzOwogfQogCiAvKiAKICAqIEdlbmVyaWMgZW5jcnlwdC9kZWNyeXB0IHdyYXBwZXIgZm9yIGNpcGhlcnMsIGhhbmRsZXMgb3BlcmF0aW9ucyBhY3Jvc3MKICAqIG11bHRpcGxlIHBhZ2UgYm91bmRhcmllcyBieSB1c2luZyB0ZW1wb3JhcnkgYmxvY2tzLiAgSW4gdXNlciBjb250ZXh0LAotICogdGhlIGtlcm5lbCBpcyBnaXZlbiBhIGNoYW5jZSB0byBzY2hlZHVsZSB1cyBvbmNlIHBlciBibG9jay4KKyAqIHRoZSBrZXJuZWwgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc2NoZWR1bGUgdXMgb25jZSBwZXIgcGFnZS4KICAqLwotc3RhdGljIGludCBjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorc3RhdGljIGludCBjcnlwdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKIAkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCBjcnlwdGZuX3QgY3JmbiwKLSAgICAgICAgICAgICAgICAgcHJvY2ZuX3QgcHJmbiwgdm9pZCAqaW5mbykKKwkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IHNjYXR0ZXJfd2FsayB3YWxrX2luLCB3YWxrX291dDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwogCWNvbnN0IHVuc2lnbmVkIGludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCXU4IHRtcF9zcmNbYnNpemVdOwotCXU4IHRtcF9kc3RbYnNpemVdOworCXVuc2lnbmVkIGludCBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKTsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlciA9IDA7CiAKIAlpZiAoIW5ieXRlcykKIAkJcmV0dXJuIDA7CkBAIC0xMDksNjQgKzExMywxNDQgQEAKIAlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19vdXQsIGRzdCk7CiAKIAlmb3IoOzspIHsKLQkJdTggKnNyY19wLCAqZHN0X3A7Ci0JCWludCBpbl9wbGFjZTsKKwkJdW5zaWduZWQgaW50IG4gPSBuYnl0ZXM7CisJCXU4ICp0bXAgPSBOVUxMOworCisJCWlmICghc2NhdHRlcndhbGtfYWxpZ25lZCgmd2Fsa19pbiwgYWxpZ25tYXNrKSB8fAorCQkgICAgIXNjYXR0ZXJ3YWxrX2FsaWduZWQoJndhbGtfb3V0LCBhbGlnbm1hc2spKSB7CisJCQlpZiAoIWJ1ZmZlcikgeworCQkJCWJ1ZmZlciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIWJ1ZmZlcikKKwkJCQkJbiA9IDA7CisJCQl9CisJCQl0bXAgPSAodTggKilidWZmZXI7CisJCX0KIAogCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfaW4sIDApOwogCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfb3V0LCAxKTsKIAotCQlpbl9wbGFjZSA9IHNjYXR0ZXJ3YWxrX3NhbWVidWYoJndhbGtfaW4sICZ3YWxrX291dCk7CisJCW4gPSBzY2F0dGVyd2Fsa19jbGFtcCgmd2Fsa19pbiwgbik7CisJCW4gPSBzY2F0dGVyd2Fsa19jbGFtcCgmd2Fsa19vdXQsIG4pOwogCi0JCWRvIHsKLQkJCXNyY19wID0gcHJlcGFyZV9zcmMoJndhbGtfaW4sIGJzaXplLCB0bXBfc3JjLAotCQkJCQkgICAgaW5fcGxhY2UpOwotCQkJZHN0X3AgPSBwcmVwYXJlX2RzdCgmd2Fsa19vdXQsIGJzaXplLCB0bXBfZHN0LAotCQkJCQkgICAgaW5fcGxhY2UpOworCQlpZiAobGlrZWx5KG4gPj0gYnNpemUpKQorCQkJbiA9IGNyeXB0X2Zhc3QoZGVzYywgJndhbGtfaW4sICZ3YWxrX291dCwgbiwgdG1wKTsKKwkJZWxzZQorCQkJbiA9IGNyeXB0X3Nsb3coZGVzYywgJndhbGtfaW4sICZ3YWxrX291dCwgYnNpemUpOwogCi0JCQlwcmZuKHRmbSwgZHN0X3AsIHNyY19wLCBjcmZuLCBpbmZvKTsKLQotCQkJY29tcGxldGVfc3JjKCZ3YWxrX2luLCBic2l6ZSwgc3JjX3AsIGluX3BsYWNlKTsKLQkJCWNvbXBsZXRlX2RzdCgmd2Fsa19vdXQsIGJzaXplLCBkc3RfcCwgaW5fcGxhY2UpOwotCi0JCQluYnl0ZXMgLT0gYnNpemU7Ci0JCX0gd2hpbGUgKG5ieXRlcyAmJgotCQkJICFzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMoJndhbGtfaW4sIGJzaXplKSAmJgotCQkJICFzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMoJndhbGtfb3V0LCBic2l6ZSkpOworCQluYnl0ZXMgLT0gbjsKIAogCQlzY2F0dGVyd2Fsa19kb25lKCZ3YWxrX2luLCAwLCBuYnl0ZXMpOwogCQlzY2F0dGVyd2Fsa19kb25lKCZ3YWxrX291dCwgMSwgbmJ5dGVzKTsKIAogCQlpZiAoIW5ieXRlcykKLQkJCXJldHVybiAwOworCQkJYnJlYWs7CiAKIAkJY3J5cHRvX3lpZWxkKHRmbSk7CiAJfQorCisJaWYgKGJ1ZmZlcikKKwkJZnJlZV9wYWdlKGJ1ZmZlcik7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2JjX3Byb2Nlc3NfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAotCQkJCWNyeXB0Zm5fdCBmbiwgdm9pZCAqaW5mbykKK3N0YXRpYyBpbnQgY3J5cHRfaXZfdW5hbGlnbmVkKHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXU4ICppdiA9IGluZm87CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGRlc2MtPnRmbTsKKwl1bnNpZ25lZCBsb25nIGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pOworCXU4ICppdiA9IGRlc2MtPmluZm87CiAKLQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGl2LCBzcmMpOwotCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgaXYpOwotCW1lbWNweShpdiwgZHN0LCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJaWYgKHVubGlrZWx5KCgodW5zaWduZWQgbG9uZylpdiAmIGFsaWdubWFzaykpKSB7CisJCXVuc2lnbmVkIGludCBpdnNpemUgPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKKwkJdTggYnVmZmVyW2l2c2l6ZSArIGFsaWdubWFza107CisJCXU4ICp0bXAgPSAodTggKilBTElHTigodW5zaWduZWQgbG9uZylidWZmZXIsIGFsaWdubWFzayArIDEpOworCQlpbnQgZXJyOworCisJCWRlc2MtPmluZm8gPSBtZW1jcHkodG1wLCBpdiwgaXZzaXplKTsKKwkJZXJyID0gY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisJCW1lbWNweShpdiwgdG1wLCBpdnNpemUpOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIGNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCi1zdGF0aWMgdm9pZCBjYmNfcHJvY2Vzc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQkJY3J5cHRmbl90IGZuLCB2b2lkICppbmZvKQorc3RhdGljIHVuc2lnbmVkIGludCBjYmNfcHJvY2Vzc19lbmNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1OCAqaXYgPSBpbmZvOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOworCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwogCi0JZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwotCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soZHN0LCBpdik7Ci0JbWVtY3B5KGl2LCBzcmMsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXU4ICppdiA9IGRlc2MtPmluZm87CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJZG8geworCQl4b3IoaXYsIHNyYyk7CisJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgaXYpOworCQltZW1jcHkoaXYsIGRzdCwgYnNpemUpOworCisJCXNyYyArPSBic2l6ZTsKKwkJZHN0ICs9IGJzaXplOworCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisKKwlyZXR1cm4gZG9uZTsKIH0KIAotc3RhdGljIHZvaWQgZWNiX3Byb2Nlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgdTggKnNyYywKLQkJCWNyeXB0Zm5fdCBmbiwgdm9pZCAqaW5mbykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2JjX3Byb2Nlc3NfZGVjcnlwdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOworCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCisJdTggc3RhY2tbc3JjID09IGRzdCA/IGJzaXplIDogMF07CisJdTggKmJ1ZiA9IHN0YWNrOworCXU4ICoqZHN0X3AgPSBzcmMgPT0gZHN0ID8gJmJ1ZiA6ICZkc3Q7CisKKwl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXU4ICppdiA9IGRlc2MtPmluZm87CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJZG8geworCQl1OCAqdG1wX2RzdCA9ICpkc3RfcDsKKworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCB0bXBfZHN0LCBzcmMpOworCQl4b3IodG1wX2RzdCwgaXYpOworCQltZW1jcHkoaXYsIHNyYywgYnNpemUpOworCQlpZiAodG1wX2RzdCAhPSBkc3QpCisJCQltZW1jcHkoZHN0LCB0bXBfZHN0LCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCQlkc3QgKz0gYnNpemU7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDwgbmJ5dGVzKTsKKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGVjYl9wcm9jZXNzKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CisJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKKwl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7CisKKwlkbyB7CisJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKKworCQlzcmMgKz0gYnNpemU7CisJCWRzdCArPSBic2l6ZTsKKwl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPCBuYnl0ZXMpOworCisJcmV0dXJuIGRvbmU7CiB9CiAKIHN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCkBAIC0xODUsOSArMjY5LDE0IEBACiAJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkgICAgICAgICAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JICAgICAgICAgICAgIGVjYl9wcm9jZXNzLCBOVUxMKTsKKwlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgY2lwaGVyX2FsZyAqY2lwaGVyID0gJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOworCisJZGVzYy50Zm0gPSB0Zm07CisJZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdDsKKwlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0X2VjYiA/OiBlY2JfcHJvY2VzczsKKworCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZWNiX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTE5NSw5ICsyODQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCSAgICAgICAgICAgICBlY2JfcHJvY2VzcywgTlVMTCk7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9lY2IgPzogZWNiX3Byb2Nlc3M7CisKKwlyZXR1cm4gY3J5cHQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGNiY19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0yMDUsOSArMjk5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZW5jcnlwdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZW5jcnlwdDsKKwlkZXNjLmluZm8gPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2OworCisJcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjE1LDkgKzMxNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCSAgICAgICAgICAgICBjYmNfcHJvY2Vzc19lbmNyeXB0LCBpdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZW5jcnlwdDsKKwlkZXNjLmluZm8gPSBpdjsKKworCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0yMjUsOSArMzMxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZGVjcnlwdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKKwlkZXNjLmluZm8gPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2OworCisJcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjM1LDkgKzM0NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCSAgICAgICAgICAgICBjYmNfcHJvY2Vzc19kZWNyeXB0LCBpdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKKwlkZXNjLmluZm8gPSBpdjsKKworCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IG5vY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTMwNiw2ICs0MjQsOCBAQAogCX0KIAkKIAlpZiAob3BzLT5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfQ0JDKSB7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ247CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAkgICAgCQogCSAgICAJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgewogCSAgICAJY2FzZSA4OgpAQCAtMzI1LDkgKzQ0NSwxMSBAQAogCSAgICAJfQogCSAgICAJCiAJCW9wcy0+Y2l0X2l2c2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCSAgICAJb3BzLT5jaXRfaXYgPSBrbWFsbG9jKG9wcy0+Y2l0X2l2c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvcHMtPmNpdF9pdiA9PSBOVUxMKQotCQkJcmV0ID0gLUVOT01FTTsKKwkJYWxpZ24gPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKSArIDE7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZyljcnlwdG9fdGZtX2N0eCh0Zm0pOworCQlhZGRyID0gQUxJR04oYWRkciwgYWxpZ24pOworCQlhZGRyICs9IEFMSUdOKHRmbS0+X19jcnRfYWxnLT5jcmFfY3R4c2l6ZSwgYWxpZ24pOworCQlvcHMtPmNpdF9pdiA9ICh2b2lkICopYWRkcjsKIAl9CiAKIG91dDoJCkBAIC0zMzYsNiArNDU4LDQgQEAKIAogdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JaWYgKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpCi0JCWtmcmVlKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Rlcy5jIGIvY3J5cHRvL2Rlcy5jCmluZGV4IDFjN2U2ZGUuLmEzYzg2M2QgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kZXMuYworKysgYi9jcnlwdG8vZGVzLmMKQEAgLTEsMTggKzEsOSBAQAotLyogCisvKgogICogQ3J5cHRvZ3JhcGhpYyBBUEkuCiAgKgogICogREVTICYgVHJpcGxlIERFUyBFREUgQ2lwaGVyIEFsZ29yaXRobXMuCiAgKgotICogT3JpZ2luYWxseSByZWxlYXNlZCBhcyBkZXNjb3JlIGJ5IERhbmEgTC4gSG93IDxob3dAaXNsLnN0YW5mb3JkLmVkdT4uCi0gKiBNb2RpZmllZCBieSBSYWltYXIgRmFsa2UgPHJmMTNAaW5mLnR1LWRyZXNkZW4uZGU+IGZvciB0aGUgTGludXgtS2VybmVsLgotICogRGVyaXZlZCBmcm9tIENyeXB0b2FwaSBhbmQgTmV0dGxlIGltcGxlbWVudGF0aW9ucywgYWRhcHRlZCBmb3IgaW4tcGxhY2UKLSAqIHNjYXR0ZXJsaXN0IGludGVyZmFjZS4gIENoYW5nZWQgTEdQTCB0byBHUEwgcGVyIHNlY3Rpb24gMyBvZiB0aGUgTEdQTC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTIgRGFuYSBMLiBIb3cuCi0gKiBDb3B5cmlnaHQgKGMpIFJhaW1hciBGYWxrZSA8cmYxM0BpbmYudHUtZHJlc2Rlbi5kZT4gCi0gKiBDb3B5cmlnaHQgKGMpIEdpc2xlIFPmbGVuc21pbmRlIDxnaXNsZUBpaS51aWIubm8+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTmllbHMgTfZsbGVyLgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhZyBBcm5lIE9zdmlrIDxkYUBvc3Zpay5ubz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIwLDExICsxMSwxMSBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAKICNkZWZpbmUgREVTX0tFWV9TSVpFCQk4CkBAIC0zNSwxMTU3ICsyNiw4MjYgQEAKICNkZWZpbmUgREVTM19FREVfRVhQS0VZX1dPUkRTCSgzICogREVTX0VYUEtFWV9XT1JEUykKICNkZWZpbmUgREVTM19FREVfQkxPQ0tfU0laRQlERVNfQkxPQ0tfU0laRQogCi0jZGVmaW5lIFJPUihkLGMsbykJKChkKSA9IChkKSA+PiAoYykgfCAoZCkgPDwgKG8pKQorI2RlZmluZSBST0woeCwgcikgKCh4KSA9IHJvbDMyKCh4KSwgKHIpKSkKKyNkZWZpbmUgUk9SKHgsIHIpICgoeCkgPSByb3IzMigoeCksIChyKSkpCiAKIHN0cnVjdCBkZXNfY3R4IHsKLQl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTMyIGV4cGtleVtERVNfRVhQS0VZX1dPUkRTXTsKIH07CiAKIHN0cnVjdCBkZXMzX2VkZV9jdHggewotCXU4IGl2W0RFU19CTE9DS19TSVpFXTsKIAl1MzIgZXhwa2V5W0RFUzNfRURFX0VYUEtFWV9XT1JEU107CiB9OwogCi1zdGF0aWMgY29uc3QgdTMyIGRlc19rZXltYXBbXSA9IHsKLQkweDAyMDgwMDA4LCAweDAyMDgyMDAwLCAweDAwMDAyMDA4LCAweDAwMDAwMDAwLAotCTB4MDIwMDIwMDAsIDB4MDAwODAwMDgsIDB4MDIwODAwMDAsIDB4MDIwODIwMDgsCi0JMHgwMDAwMDAwOCwgMHgwMjAwMDAwMCwgMHgwMDA4MjAwMCwgMHgwMDAwMjAwOCwKLQkweDAwMDgyMDA4LCAweDAyMDAyMDA4LCAweDAyMDAwMDA4LCAweDAyMDgwMDAwLAotCTB4MDAwMDIwMDAsIDB4MDAwODIwMDgsIDB4MDAwODAwMDgsIDB4MDIwMDIwMDAsCi0JMHgwMjA4MjAwOCwgMHgwMjAwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDA4MjAwMCwKLQkweDAyMDAwMDAwLCAweDAwMDgwMDAwLCAweDAyMDAyMDA4LCAweDAyMDgwMDA4LAotCTB4MDAwODAwMDAsIDB4MDAwMDIwMDAsIDB4MDIwODIwMDAsIDB4MDAwMDAwMDgsCi0JMHgwMDA4MDAwMCwgMHgwMDAwMjAwMCwgMHgwMjAwMDAwOCwgMHgwMjA4MjAwOCwKLQkweDAwMDAyMDA4LCAweDAyMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDgyMDAwLAotCTB4MDIwODAwMDgsIDB4MDIwMDIwMDgsIDB4MDIwMDIwMDAsIDB4MDAwODAwMDgsCi0JMHgwMjA4MjAwMCwgMHgwMDAwMDAwOCwgMHgwMDA4MDAwOCwgMHgwMjAwMjAwMCwKLQkweDAyMDgyMDA4LCAweDAwMDgwMDAwLCAweDAyMDgwMDAwLCAweDAyMDAwMDA4LAotCTB4MDAwODIwMDAsIDB4MDAwMDIwMDgsIDB4MDIwMDIwMDgsIDB4MDIwODAwMDAsCi0JMHgwMDAwMDAwOCwgMHgwMjA4MjAwMCwgMHgwMDA4MjAwOCwgMHgwMDAwMDAwMCwKLQkweDAyMDAwMDAwLCAweDAyMDgwMDA4LCAweDAwMDAyMDAwLCAweDAwMDgyMDA4LAorLyogTG9va3VwIHRhYmxlcyBmb3Iga2V5IGV4cGFuc2lvbiAqLwogCi0JMHgwODAwMDAwNCwgMHgwMDAyMDAwNCwgMHgwMDAwMDAwMCwgMHgwODAyMDIwMCwKLQkweDAwMDIwMDA0LCAweDAwMDAwMjAwLCAweDA4MDAwMjA0LCAweDAwMDIwMDAwLAotCTB4MDAwMDAyMDQsIDB4MDgwMjAyMDQsIDB4MDAwMjAyMDAsIDB4MDgwMDAwMDAsCi0JMHgwODAwMDIwMCwgMHgwODAwMDAwNCwgMHgwODAyMDAwMCwgMHgwMDAyMDIwNCwKLQkweDAwMDIwMDAwLCAweDA4MDAwMjA0LCAweDA4MDIwMDA0LCAweDAwMDAwMDAwLAotCTB4MDAwMDAyMDAsIDB4MDAwMDAwMDQsIDB4MDgwMjAyMDAsIDB4MDgwMjAwMDQsCi0JMHgwODAyMDIwNCwgMHgwODAyMDAwMCwgMHgwODAwMDAwMCwgMHgwMDAwMDIwNCwKLQkweDAwMDAwMDA0LCAweDAwMDIwMjAwLCAweDAwMDIwMjA0LCAweDA4MDAwMjAwLAotCTB4MDAwMDAyMDQsIDB4MDgwMDAwMDAsIDB4MDgwMDAyMDAsIDB4MDAwMjAyMDQsCi0JMHgwODAyMDIwMCwgMHgwMDAyMDAwNCwgMHgwMDAwMDAwMCwgMHgwODAwMDIwMCwKLQkweDA4MDAwMDAwLCAweDAwMDAwMjAwLCAweDA4MDIwMDA0LCAweDAwMDIwMDAwLAotCTB4MDAwMjAwMDQsIDB4MDgwMjAyMDQsIDB4MDAwMjAyMDAsIDB4MDAwMDAwMDQsCi0JMHgwODAyMDIwNCwgMHgwMDAyMDIwMCwgMHgwMDAyMDAwMCwgMHgwODAwMDIwNCwKLQkweDA4MDAwMDA0LCAweDA4MDIwMDAwLCAweDAwMDIwMjA0LCAweDAwMDAwMDAwLAotCTB4MDAwMDAyMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAyMDQsIDB4MDgwMjAyMDAsCi0JMHgwODAyMDAwMCwgMHgwMDAwMDIwNCwgMHgwMDAwMDAwNCwgMHgwODAyMDAwNCwKLQotCTB4ODAwNDAxMDAsIDB4MDEwMDAxMDAsIDB4ODAwMDAwMDAsIDB4ODEwNDAxMDAsCi0JMHgwMDAwMDAwMCwgMHgwMTA0MDAwMCwgMHg4MTAwMDEwMCwgMHg4MDA0MDAwMCwKLQkweDAxMDQwMTAwLCAweDgxMDAwMDAwLCAweDAxMDAwMDAwLCAweDgwMDAwMTAwLAotCTB4ODEwMDAwMDAsIDB4ODAwNDAxMDAsIDB4MDAwNDAwMDAsIDB4MDEwMDAwMDAsCi0JMHg4MTA0MDAwMCwgMHgwMDA0MDEwMCwgMHgwMDAwMDEwMCwgMHg4MDAwMDAwMCwKLQkweDAwMDQwMTAwLCAweDgxMDAwMTAwLCAweDAxMDQwMDAwLCAweDAwMDAwMTAwLAotCTB4ODAwMDAxMDAsIDB4MDAwMDAwMDAsIDB4ODAwNDAwMDAsIDB4MDEwNDAxMDAsCi0JMHgwMTAwMDEwMCwgMHg4MTA0MDAwMCwgMHg4MTA0MDEwMCwgMHgwMDA0MDAwMCwKLQkweDgxMDQwMDAwLCAweDgwMDAwMTAwLCAweDAwMDQwMDAwLCAweDgxMDAwMDAwLAotCTB4MDAwNDAxMDAsIDB4MDEwMDAxMDAsIDB4ODAwMDAwMDAsIDB4MDEwNDAwMDAsCi0JMHg4MTAwMDEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDEwMCwgMHg4MDA0MDAwMCwKLQkweDAwMDAwMDAwLCAweDgxMDQwMDAwLCAweDAxMDQwMTAwLCAweDAwMDAwMTAwLAotCTB4MDEwMDAwMDAsIDB4ODEwNDAxMDAsIDB4ODAwNDAxMDAsIDB4MDAwNDAwMDAsCi0JMHg4MTA0MDEwMCwgMHg4MDAwMDAwMCwgMHgwMTAwMDEwMCwgMHg4MDA0MDEwMCwKLQkweDgwMDQwMDAwLCAweDAwMDQwMTAwLCAweDAxMDQwMDAwLCAweDgxMDAwMTAwLAotCTB4ODAwMDAxMDAsIDB4MDEwMDAwMDAsIDB4ODEwMDAwMDAsIDB4MDEwNDAxMDAsCi0KLQkweDA0MDEwODAxLCAweDAwMDAwMDAwLCAweDAwMDEwODAwLCAweDA0MDEwMDAwLAotCTB4MDQwMDAwMDEsIDB4MDAwMDA4MDEsIDB4MDQwMDA4MDAsIDB4MDAwMTA4MDAsCi0JMHgwMDAwMDgwMCwgMHgwNDAxMDAwMSwgMHgwMDAwMDAwMSwgMHgwNDAwMDgwMCwKLQkweDAwMDEwMDAxLCAweDA0MDEwODAwLCAweDA0MDEwMDAwLCAweDAwMDAwMDAxLAotCTB4MDAwMTAwMDAsIDB4MDQwMDA4MDEsIDB4MDQwMTAwMDEsIDB4MDAwMDA4MDAsCi0JMHgwMDAxMDgwMSwgMHgwNDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDAwMSwKLQkweDA0MDAwODAxLCAweDAwMDEwODAxLCAweDA0MDEwODAwLCAweDA0MDAwMDAxLAotCTB4MDQwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMDA4MDEsIDB4MDQwMTA4MDEsCi0JMHgwMDAxMDAwMSwgMHgwNDAxMDgwMCwgMHgwNDAwMDgwMCwgMHgwMDAxMDgwMSwKLQkweDA0MDEwODAxLCAweDAwMDEwMDAxLCAweDA0MDAwMDAxLCAweDAwMDAwMDAwLAotCTB4MDQwMDAwMDAsIDB4MDAwMDA4MDEsIDB4MDAwMTAwMDAsIDB4MDQwMTAwMDEsCi0JMHgwMDAwMDgwMCwgMHgwNDAwMDAwMCwgMHgwMDAxMDgwMSwgMHgwNDAwMDgwMSwKLQkweDA0MDEwODAwLCAweDAwMDAwODAwLCAweDAwMDAwMDAwLCAweDA0MDAwMDAxLAotCTB4MDAwMDAwMDEsIDB4MDQwMTA4MDEsIDB4MDAwMTA4MDAsIDB4MDQwMTAwMDAsCi0JMHgwNDAxMDAwMSwgMHgwMDAxMDAwMCwgMHgwMDAwMDgwMSwgMHgwNDAwMDgwMCwKLQkweDA0MDAwODAxLCAweDAwMDAwMDAxLCAweDA0MDEwMDAwLCAweDAwMDEwODAwLAotCi0JMHgwMDAwMDQwMCwgMHgwMDAwMDAyMCwgMHgwMDEwMDAyMCwgMHg0MDEwMDAwMCwKLQkweDQwMTAwNDIwLCAweDQwMDAwNDAwLCAweDAwMDAwNDIwLCAweDAwMDAwMDAwLAotCTB4MDAxMDAwMDAsIDB4NDAxMDAwMjAsIDB4NDAwMDAwMjAsIDB4MDAxMDA0MDAsCi0JMHg0MDAwMDAwMCwgMHgwMDEwMDQyMCwgMHgwMDEwMDQwMCwgMHg0MDAwMDAyMCwKLQkweDQwMTAwMDIwLCAweDAwMDAwNDAwLCAweDQwMDAwNDAwLCAweDQwMTAwNDIwLAotCTB4MDAwMDAwMDAsIDB4MDAxMDAwMjAsIDB4NDAxMDAwMDAsIDB4MDAwMDA0MjAsCi0JMHg0MDEwMDQwMCwgMHg0MDAwMDQyMCwgMHgwMDEwMDQyMCwgMHg0MDAwMDAwMCwKLQkweDQwMDAwNDIwLCAweDQwMTAwNDAwLCAweDAwMDAwMDIwLCAweDAwMTAwMDAwLAotCTB4NDAwMDA0MjAsIDB4MDAxMDA0MDAsIDB4NDAxMDA0MDAsIDB4NDAwMDAwMjAsCi0JMHgwMDAwMDQwMCwgMHgwMDAwMDAyMCwgMHgwMDEwMDAwMCwgMHg0MDEwMDQwMCwKLQkweDQwMTAwMDIwLCAweDQwMDAwNDIwLCAweDAwMDAwNDIwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMjAsIDB4NDAxMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAxMDAwMjAsCi0JMHgwMDAwMDAwMCwgMHg0MDEwMDAyMCwgMHgwMDEwMDAyMCwgMHgwMDAwMDQyMCwKLQkweDQwMDAwMDIwLCAweDAwMDAwNDAwLCAweDQwMTAwNDIwLCAweDAwMTAwMDAwLAotCTB4MDAxMDA0MjAsIDB4NDAwMDAwMDAsIDB4NDAwMDA0MDAsIDB4NDAxMDA0MjAsCi0JMHg0MDEwMDAwMCwgMHgwMDEwMDQyMCwgMHgwMDEwMDQwMCwgMHg0MDAwMDQwMCwKLQotCTB4MDA4MDAwMDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwNDAsIDB4MDA4MDEwNDIsCi0JMHgwMDgwMTAwMiwgMHgwMDgwMDA0MCwgMHgwMDAwMTA0MiwgMHgwMDgwMTAwMCwKLQkweDAwMDAxMDAwLCAweDAwMDAwMDAyLCAweDAwODAwMDAyLCAweDAwMDAxMDQwLAotCTB4MDA4MDAwNDIsIDB4MDA4MDEwMDIsIDB4MDA4MDEwNDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMTA0MCwgMHgwMDgwMDAwMCwgMHgwMDAwMTAwMiwgMHgwMDAwMDA0MiwKLQkweDAwODAwMDQwLCAweDAwMDAxMDQyLCAweDAwMDAwMDAwLCAweDAwODAwMDAyLAotCTB4MDAwMDAwMDIsIDB4MDA4MDAwNDIsIDB4MDA4MDEwNDIsIDB4MDAwMDEwMDIsCi0JMHgwMDgwMTAwMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MiwgMHgwMDgwMTA0MCwKLQkweDAwODAxMDQwLCAweDAwODAwMDQyLCAweDAwMDAxMDAyLCAweDAwODAxMDAwLAotCTB4MDAwMDEwMDAsIDB4MDAwMDAwMDIsIDB4MDA4MDAwMDIsIDB4MDA4MDAwNDAsCi0JMHgwMDgwMDAwMCwgMHgwMDAwMTA0MCwgMHgwMDgwMTA0MiwgMHgwMDAwMDAwMCwKLQkweDAwMDAxMDQyLCAweDAwODAwMDAwLCAweDAwMDAwMDQwLCAweDAwMDAxMDAyLAotCTB4MDA4MDAwNDIsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAsIDB4MDA4MDEwNDIsCi0JMHgwMDgwMTAwMiwgMHgwMDgwMTA0MCwgMHgwMDAwMDA0MiwgMHgwMDAwMTAwMCwKLQkweDAwMDAxMDQwLCAweDAwODAxMDAyLCAweDAwODAwMDQwLCAweDAwMDAwMDQyLAotCTB4MDAwMDAwMDIsIDB4MDAwMDEwNDIsIDB4MDA4MDEwMDAsIDB4MDA4MDAwMDIsCi0KLQkweDEwNDAwMDAwLCAweDAwNDA0MDEwLCAweDAwMDAwMDEwLCAweDEwNDAwMDEwLAotCTB4MTAwMDQwMDAsIDB4MDA0MDAwMDAsIDB4MTA0MDAwMTAsIDB4MDAwMDQwMTAsCi0JMHgwMDQwMDAxMCwgMHgwMDAwNDAwMCwgMHgwMDQwNDAwMCwgMHgxMDAwMDAwMCwKLQkweDEwNDA0MDEwLCAweDEwMDAwMDEwLCAweDEwMDAwMDAwLCAweDEwNDA0MDAwLAotCTB4MDAwMDAwMDAsIDB4MTAwMDQwMDAsIDB4MDA0MDQwMTAsIDB4MDAwMDAwMTAsCi0JMHgxMDAwMDAxMCwgMHgxMDQwNDAxMCwgMHgwMDAwNDAwMCwgMHgxMDQwMDAwMCwKLQkweDEwNDA0MDAwLCAweDAwNDAwMDEwLCAweDEwMDA0MDEwLCAweDAwNDA0MDAwLAotCTB4MDAwMDQwMTAsIDB4MDAwMDAwMDAsIDB4MDA0MDAwMDAsIDB4MTAwMDQwMTAsCi0JMHgwMDQwNDAxMCwgMHgwMDAwMDAxMCwgMHgxMDAwMDAwMCwgMHgwMDAwNDAwMCwKLQkweDEwMDAwMDEwLCAweDEwMDA0MDAwLCAweDAwNDA0MDAwLCAweDEwNDAwMDEwLAotCTB4MDAwMDAwMDAsIDB4MDA0MDQwMTAsIDB4MDAwMDQwMTAsIDB4MTA0MDQwMDAsCi0JMHgxMDAwNDAwMCwgMHgwMDQwMDAwMCwgMHgxMDQwNDAxMCwgMHgxMDAwMDAwMCwKLQkweDEwMDA0MDEwLCAweDEwNDAwMDAwLCAweDAwNDAwMDAwLCAweDEwNDA0MDEwLAotCTB4MDAwMDQwMDAsIDB4MDA0MDAwMTAsIDB4MTA0MDAwMTAsIDB4MDAwMDQwMTAsCi0JMHgwMDQwMDAxMCwgMHgwMDAwMDAwMCwgMHgxMDQwNDAwMCwgMHgxMDAwMDAxMCwKLQkweDEwNDAwMDAwLCAweDEwMDA0MDEwLCAweDAwMDAwMDEwLCAweDAwNDA0MDAwLAotCi0JMHgwMDIwODA4MCwgMHgwMDAwODAwMCwgMHgyMDIwMDAwMCwgMHgyMDIwODA4MCwKLQkweDAwMjAwMDAwLCAweDIwMDA4MDgwLCAweDIwMDA4MDAwLCAweDIwMjAwMDAwLAotCTB4MjAwMDgwODAsIDB4MDAyMDgwODAsIDB4MDAyMDgwMDAsIDB4MjAwMDAwODAsCi0JMHgyMDIwMDA4MCwgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMCwgMHgyMDAwODAwMCwKLQkweDAwMDA4MDAwLCAweDIwMDAwMDAwLCAweDAwMjAwMDgwLCAweDAwMDA4MDgwLAotCTB4MjAyMDgwODAsIDB4MDAyMDgwMDAsIDB4MjAwMDAwODAsIDB4MDAyMDAwODAsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDA4MCwgMHgwMDAwODA4MCwgMHgyMDIwODAwMCwKLQkweDAwMDAwMDgwLCAweDIwMjAwMDgwLCAweDIwMjA4MDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MjAyMDgwODAsIDB4MDAyMDAwODAsIDB4MjAwMDgwMDAsCi0JMHgwMDIwODA4MCwgMHgwMDAwODAwMCwgMHgyMDAwMDA4MCwgMHgwMDIwMDA4MCwKLQkweDIwMjA4MDAwLCAweDAwMDAwMDgwLCAweDAwMDA4MDgwLCAweDIwMjAwMDAwLAotCTB4MjAwMDgwODAsIDB4MjAwMDAwMDAsIDB4MjAyMDAwMDAsIDB4MDAyMDgwMDAsCi0JMHgyMDIwODA4MCwgMHgwMDAwODA4MCwgMHgwMDIwODAwMCwgMHgyMDIwMDA4MCwKLQkweDAwMjAwMDAwLCAweDIwMDAwMDgwLCAweDIwMDA4MDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDgwMDAsIDB4MDAyMDAwMDAsIDB4MjAyMDAwODAsIDB4MDAyMDgwODAsCi0JMHgyMDAwMDAwMCwgMHgyMDIwODAwMCwgMHgwMDAwMDA4MCwgMHgyMDAwODA4MCwKK3N0YXRpYyBjb25zdCB1OCBwYzFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDEwLCAweDEwLCAweDUwLCAweDE0LAorCTB4MDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4MTQsIDB4NTAsIDB4NTQsIDB4NTQsCisJMHgwMiwgMHgwMiwgMHg0MiwgMHgwNiwgMHgxMiwgMHgxMiwgMHg1MiwgMHgxNiwKKwkweDA2LCAweDQyLCAweDQ2LCAweDQ2LCAweDE2LCAweDUyLCAweDU2LCAweDU2LAorCTB4ODAsIDB4MDgsIDB4YzAsIDB4MGMsIDB4OTAsIDB4MTgsIDB4ZDAsIDB4MWMsCisJMHg4NCwgMHg0OCwgMHhjNCwgMHg0YywgMHg5NCwgMHg1OCwgMHhkNCwgMHg1YywKKwkweDgyLCAweDBhLCAweGMyLCAweDBlLCAweDkyLCAweDFhLCAweGQyLCAweDFlLAorCTB4ODYsIDB4NGEsIDB4YzYsIDB4NGUsIDB4OTYsIDB4NWEsIDB4ZDYsIDB4NWUsCisJMHgyMCwgMHgyMCwgMHg2MCwgMHgyNCwgMHgzMCwgMHgzMCwgMHg3MCwgMHgzNCwKKwkweDI0LCAweDYwLCAweDY0LCAweDY0LCAweDM0LCAweDcwLCAweDc0LCAweDc0LAorCTB4MjIsIDB4MjIsIDB4NjIsIDB4MjYsIDB4MzIsIDB4MzIsIDB4NzIsIDB4MzYsCisJMHgyNiwgMHg2MiwgMHg2NiwgMHg2NiwgMHgzNiwgMHg3MiwgMHg3NiwgMHg3NiwKKwkweGEwLCAweDI4LCAweGUwLCAweDJjLCAweGIwLCAweDM4LCAweGYwLCAweDNjLAorCTB4YTQsIDB4NjgsIDB4ZTQsIDB4NmMsIDB4YjQsIDB4NzgsIDB4ZjQsIDB4N2MsCisJMHhhMiwgMHgyYSwgMHhlMiwgMHgyZSwgMHhiMiwgMHgzYSwgMHhmMiwgMHgzZSwKKwkweGE2LCAweDZhLCAweGU2LCAweDZlLCAweGI2LCAweDdhLCAweGY2LCAweDdlLAorCTB4MDgsIDB4ODAsIDB4NDgsIDB4ODQsIDB4MTgsIDB4OTAsIDB4NTgsIDB4OTQsCisJMHgwYywgMHhjMCwgMHg0YywgMHhjNCwgMHgxYywgMHhkMCwgMHg1YywgMHhkNCwKKwkweDBhLCAweDgyLCAweDRhLCAweDg2LCAweDFhLCAweDkyLCAweDVhLCAweDk2LAorCTB4MGUsIDB4YzIsIDB4NGUsIDB4YzYsIDB4MWUsIDB4ZDIsIDB4NWUsIDB4ZDYsCisJMHg4OCwgMHg4OCwgMHhjOCwgMHg4YywgMHg5OCwgMHg5OCwgMHhkOCwgMHg5YywKKwkweDhjLCAweGM4LCAweGNjLCAweGNjLCAweDljLCAweGQ4LCAweGRjLCAweGRjLAorCTB4OGEsIDB4OGEsIDB4Y2EsIDB4OGUsIDB4OWEsIDB4OWEsIDB4ZGEsIDB4OWUsCisJMHg4ZSwgMHhjYSwgMHhjZSwgMHhjZSwgMHg5ZSwgMHhkYSwgMHhkZSwgMHhkZSwKKwkweDI4LCAweGEwLCAweDY4LCAweGE0LCAweDM4LCAweGIwLCAweDc4LCAweGI0LAorCTB4MmMsIDB4ZTAsIDB4NmMsIDB4ZTQsIDB4M2MsIDB4ZjAsIDB4N2MsIDB4ZjQsCisJMHgyYSwgMHhhMiwgMHg2YSwgMHhhNiwgMHgzYSwgMHhiMiwgMHg3YSwgMHhiNiwKKwkweDJlLCAweGUyLCAweDZlLCAweGU2LCAweDNlLCAweGYyLCAweDdlLCAweGY2LAorCTB4YTgsIDB4YTgsIDB4ZTgsIDB4YWMsIDB4YjgsIDB4YjgsIDB4ZjgsIDB4YmMsCisJMHhhYywgMHhlOCwgMHhlYywgMHhlYywgMHhiYywgMHhmOCwgMHhmYywgMHhmYywKKwkweGFhLCAweGFhLCAweGVhLCAweGFlLCAweGJhLCAweGJhLCAweGZhLCAweGJlLAorCTB4YWUsIDB4ZWEsIDB4ZWUsIDB4ZWUsIDB4YmUsIDB4ZmEsIDB4ZmUsIDB4ZmUKIH07CiAKLXN0YXRpYyBjb25zdCB1OCByb3RvcnNbXSA9IHsKLQkzNCwgMTMsICA1LCA0NiwgNDcsIDE4LCAzMiwgNDEsIDExLCA1MywgMzMsIDIwLAotCTE0LCAzNiwgMzAsIDI0LCA0OSwgIDIsIDE1LCAzNywgNDIsIDUwLCAgMCwgMjEsCi0JMzgsIDQ4LCAgNiwgMjYsIDM5LCAgNCwgNTIsIDI1LCAxMiwgMjcsIDMxLCA0MCwKLQkxLCAxNywgMjgsIDI5LCAyMywgNTEsIDM1LCAgNywgIDMsIDIyLCAgOSwgNDMsCi0KLQk0MSwgMjAsIDEyLCA1MywgNTQsIDI1LCAzOSwgNDgsIDE4LCAzMSwgNDAsIDI3LAotCTIxLCA0MywgMzcsICAwLCAgMSwgIDksIDIyLCA0NCwgNDksICAyLCAgNywgMjgsCi0JNDUsIDU1LCAxMywgMzMsIDQ2LCAxMSwgIDYsIDMyLCAxOSwgMzQsIDM4LCA0NywKLQk4LCAyNCwgMzUsIDM2LCAzMCwgIDMsIDQyLCAxNCwgMTAsIDI5LCAxNiwgNTAsCi0KLQk1NSwgMzQsIDI2LCAzOCwgMTEsIDM5LCA1MywgIDUsIDMyLCA0NSwgNTQsIDQxLAotCTM1LCAgMiwgNTEsIDE0LCAxNSwgMjMsIDM2LCAgMywgIDgsIDE2LCAyMSwgNDIsCi0JNiwgMTIsIDI3LCA0NywgMzEsIDI1LCAyMCwgNDYsIDMzLCA0OCwgNTIsICA0LAotCTIyLCAgNywgNDksIDUwLCA0NCwgMTcsICAxLCAyOCwgMjQsIDQzLCAzMCwgIDksCi0KLQkxMiwgNDgsIDQwLCA1MiwgMjUsIDUzLCAzOCwgMTksIDQ2LCAgNiwgMTEsIDU1LAotCTQ5LCAxNiwgMTAsIDI4LCAyOSwgMzcsIDUwLCAxNywgMjIsIDMwLCAzNSwgIDEsCi0JMjAsIDI2LCA0MSwgIDQsIDQ1LCAzOSwgMzQsIDMxLCA0NywgIDUsIDEzLCAxOCwKLQkzNiwgMjEsICA4LCAgOSwgIDMsICAwLCAxNSwgNDIsICA3LCAgMiwgNDQsIDIzLAotCi0JMjYsICA1LCA1NCwgMTMsIDM5LCAzOCwgNTIsIDMzLCAzMSwgMjAsIDI1LCAxMiwKLQk4LCAzMCwgMjQsIDQyLCA0MywgNTEsICA5LCAgMCwgMzYsIDQ0LCA0OSwgMTUsCi0JMzQsIDQwLCA1NSwgMTgsICA2LCA1MywgNDgsIDQ1LCAgNCwgMTksIDI3LCAzMiwKLQk1MCwgMzUsIDIyLCAyMywgMTcsIDE0LCAyOSwgIDEsIDIxLCAxNiwgIDMsIDM3LAotCi0JNDAsIDE5LCAxMSwgMjcsIDUzLCA1MiwgMTMsIDQ3LCA0NSwgMzQsIDM5LCAyNiwKLQkyMiwgNDQsICA3LCAgMSwgIDIsIDEwLCAyMywgMTQsIDUwLCAgMywgIDgsIDI5LAotCTQ4LCA1NCwgMTIsIDMyLCAyMCwgMzgsICA1LCAgNiwgMTgsIDMzLCA0MSwgNDYsCi0JOSwgNDksIDM2LCAzNywgIDAsIDI4LCA0MywgMTUsIDM1LCAzMCwgMTcsIDUxLAotCi0JNTQsIDMzLCAyNSwgNDEsIDM4LCAxMywgMjcsICA0LCAgNiwgNDgsIDUzLCA0MCwKLQkzNiwgIDMsIDIxLCAxNSwgMTYsIDI0LCAzNywgMjgsICA5LCAxNywgMjIsIDQzLAotCTUsIDExLCAyNiwgNDYsIDM0LCA1MiwgMTksIDIwLCAzMiwgNDcsIDU1LCAzMSwKLQkyMywgIDgsIDUwLCA1MSwgMTQsIDQyLCAgMiwgMjksIDQ5LCA0NCwgIDAsIDEwLAotCi0JMTEsIDQ3LCAzOSwgNTUsIDUyLCAyNywgNDEsIDE4LCAyMCwgIDUsIDM4LCA1NCwKLQk1MCwgMTcsIDM1LCAyOSwgMzAsICA3LCA1MSwgNDIsIDIzLCAgMCwgMzYsICAyLAotCTE5LCAyNSwgNDAsIDMxLCA0OCwgMTMsIDMzLCAzNCwgNDYsICA0LCAxMiwgNDUsCi0JMzcsIDIyLCAgOSwgMTAsIDI4LCAgMSwgMTYsIDQzLCAgOCwgIDMsIDE0LCAyNCwKLQotCTE4LCA1NCwgNDYsICA1LCAgNiwgMzQsIDQ4LCAyNSwgMjcsIDEyLCA0NSwgIDQsCi0JMiwgMjQsIDQyLCAzNiwgMzcsIDE0LCAgMywgNDksIDMwLCAgNywgNDMsICA5LAotCTI2LCAzMiwgNDcsIDM4LCA1NSwgMjAsIDQwLCA0MSwgNTMsIDExLCAxOSwgNTIsCi0JNDQsIDI5LCAxNiwgMTcsIDM1LCAgOCwgMjMsIDUwLCAxNSwgMTAsIDIxLCAgMCwKLQotCTMyLCAxMSwgMzEsIDE5LCAyMCwgNDgsICA1LCAzOSwgNDEsIDI2LCAgNiwgMTgsCi0JMTYsICA3LCAgMSwgNTAsIDUxLCAyOCwgMTcsICA4LCA0NCwgMjEsICAyLCAyMywKLQk0MCwgNDYsICA0LCA1MiwgMTIsIDM0LCA1NCwgNTUsIDM4LCAyNSwgMzMsIDEzLAotCTMsIDQzLCAzMCwgIDAsIDQ5LCAyMiwgMzcsICA5LCAyOSwgMjQsIDM1LCAxNCwKLQotCTQ2LCAyNSwgNDUsIDMzLCAzNCwgIDUsIDE5LCA1MywgNTUsIDQwLCAyMCwgMzIsCi0JMzAsIDIxLCAxNSwgIDksIDEwLCA0MiwgIDAsIDIyLCAgMywgMzUsIDE2LCAzNywKLQk1NCwgMzEsIDE4LCAxMywgMjYsIDQ4LCAxMSwgMTIsIDUyLCAzOSwgNDcsIDI3LAotCTE3LCAgMiwgNDQsIDE0LCAgOCwgMzYsIDUxLCAyMywgNDMsICA3LCA0OSwgMjgsCi0KLQkzMSwgMzksICA2LCA0NywgNDgsIDE5LCAzMywgMzgsIDEyLCA1NCwgMzQsIDQ2LAotCTQ0LCAzNSwgMjksIDIzLCAyNCwgIDEsIDE0LCAzNiwgMTcsIDQ5LCAzMCwgNTEsCi0JMTEsIDQ1LCAzMiwgMjcsIDQwLCAgNSwgMjUsIDI2LCAxMywgNTMsICA0LCA0MSwKLQkwLCAxNiwgIDMsIDI4LCAyMiwgNTAsIDEwLCAzNywgIDIsIDIxLCAgOCwgNDIsCi0KLQk0NSwgNTMsIDIwLCAgNCwgIDUsIDMzLCA0NywgNTIsIDI2LCAxMSwgNDgsIDMxLAotCTMsIDQ5LCA0MywgMzcsICA3LCAxNSwgMjgsIDUwLCAgMCwgIDgsIDQ0LCAxMCwKLQkyNSwgIDYsIDQ2LCA0MSwgNTQsIDE5LCAzOSwgNDAsIDI3LCAzOCwgMTgsIDU1LAotCTE0LCAzMCwgMTcsIDQyLCAzNiwgIDksIDI0LCA1MSwgMTYsIDM1LCAyMiwgIDEsCi0KLQk2LCAzOCwgMzQsIDE4LCAxOSwgNDcsICA0LCAxMywgNDAsIDI1LCAgNSwgNDUsCi0JMTcsICA4LCAgMiwgNTEsIDIxLCAyOSwgNDIsICA5LCAxNCwgMjIsICAzLCAyNCwKLQkzOSwgMjAsIDMxLCA1NSwgMTEsIDMzLCA1MywgNTQsIDQxLCA1MiwgMzIsIDEyLAotCTI4LCA0NCwgIDAsICAxLCA1MCwgMjMsICA3LCAxMCwgMzAsIDQ5LCAzNiwgMTUsCi0KLQkyMCwgNTIsIDQ4LCAzMiwgMzMsICA0LCAxOCwgMjcsIDU0LCAzOSwgMTksICA2LAotCTAsIDIyLCAxNiwgMTAsIDM1LCA0MywgIDEsIDIzLCAyOCwgMzYsIDE3LCAgNywKLQk1MywgMzQsIDQ1LCAxMiwgMjUsIDQ3LCAzOCwgMTEsIDU1LCAxMywgNDYsIDI2LAotCTQyLCAgMywgMTQsIDE1LCAgOSwgMzcsIDIxLCAyNCwgNDQsICA4LCA1MCwgMjksCi0KLQkyNywgIDYsIDU1LCAzOSwgNDAsIDExLCAyNSwgMzQsICA0LCA0NiwgMjYsIDEzLAotCTcsIDI5LCAyMywgMTcsIDQyLCA1MCwgIDgsIDMwLCAzNSwgNDMsIDI0LCAxNCwKLQkzMSwgNDEsIDUyLCAxOSwgMzIsIDU0LCA0NSwgMTgsICA1LCAyMCwgNTMsIDMzLAotCTQ5LCAxMCwgMjEsIDIyLCAxNiwgNDQsIDI4LCAgMCwgNTEsIDE1LCAgMiwgMzYsCitzdGF0aWMgY29uc3QgdTggcnNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAyLCAweDAyLCAweDgyLCAweDgyLAorCTB4MDQsIDB4MDQsIDB4ODQsIDB4ODQsIDB4MDYsIDB4MDYsIDB4ODYsIDB4ODYsCisJMHgwOCwgMHgwOCwgMHg4OCwgMHg4OCwgMHgwYSwgMHgwYSwgMHg4YSwgMHg4YSwKKwkweDBjLCAweDBjLCAweDhjLCAweDhjLCAweDBlLCAweDBlLCAweDhlLCAweDhlLAorCTB4MTAsIDB4MTAsIDB4OTAsIDB4OTAsIDB4MTIsIDB4MTIsIDB4OTIsIDB4OTIsCisJMHgxNCwgMHgxNCwgMHg5NCwgMHg5NCwgMHgxNiwgMHgxNiwgMHg5NiwgMHg5NiwKKwkweDE4LCAweDE4LCAweDk4LCAweDk4LCAweDFhLCAweDFhLCAweDlhLCAweDlhLAorCTB4MWMsIDB4MWMsIDB4OWMsIDB4OWMsIDB4MWUsIDB4MWUsIDB4OWUsIDB4OWUsCisJMHgyMCwgMHgyMCwgMHhhMCwgMHhhMCwgMHgyMiwgMHgyMiwgMHhhMiwgMHhhMiwKKwkweDI0LCAweDI0LCAweGE0LCAweGE0LCAweDI2LCAweDI2LCAweGE2LCAweGE2LAorCTB4MjgsIDB4MjgsIDB4YTgsIDB4YTgsIDB4MmEsIDB4MmEsIDB4YWEsIDB4YWEsCisJMHgyYywgMHgyYywgMHhhYywgMHhhYywgMHgyZSwgMHgyZSwgMHhhZSwgMHhhZSwKKwkweDMwLCAweDMwLCAweGIwLCAweGIwLCAweDMyLCAweDMyLCAweGIyLCAweGIyLAorCTB4MzQsIDB4MzQsIDB4YjQsIDB4YjQsIDB4MzYsIDB4MzYsIDB4YjYsIDB4YjYsCisJMHgzOCwgMHgzOCwgMHhiOCwgMHhiOCwgMHgzYSwgMHgzYSwgMHhiYSwgMHhiYSwKKwkweDNjLCAweDNjLCAweGJjLCAweGJjLCAweDNlLCAweDNlLCAweGJlLCAweGJlLAorCTB4NDAsIDB4NDAsIDB4YzAsIDB4YzAsIDB4NDIsIDB4NDIsIDB4YzIsIDB4YzIsCisJMHg0NCwgMHg0NCwgMHhjNCwgMHhjNCwgMHg0NiwgMHg0NiwgMHhjNiwgMHhjNiwKKwkweDQ4LCAweDQ4LCAweGM4LCAweGM4LCAweDRhLCAweDRhLCAweGNhLCAweGNhLAorCTB4NGMsIDB4NGMsIDB4Y2MsIDB4Y2MsIDB4NGUsIDB4NGUsIDB4Y2UsIDB4Y2UsCisJMHg1MCwgMHg1MCwgMHhkMCwgMHhkMCwgMHg1MiwgMHg1MiwgMHhkMiwgMHhkMiwKKwkweDU0LCAweDU0LCAweGQ0LCAweGQ0LCAweDU2LCAweDU2LCAweGQ2LCAweGQ2LAorCTB4NTgsIDB4NTgsIDB4ZDgsIDB4ZDgsIDB4NWEsIDB4NWEsIDB4ZGEsIDB4ZGEsCisJMHg1YywgMHg1YywgMHhkYywgMHhkYywgMHg1ZSwgMHg1ZSwgMHhkZSwgMHhkZSwKKwkweDYwLCAweDYwLCAweGUwLCAweGUwLCAweDYyLCAweDYyLCAweGUyLCAweGUyLAorCTB4NjQsIDB4NjQsIDB4ZTQsIDB4ZTQsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4ZTYsCisJMHg2OCwgMHg2OCwgMHhlOCwgMHhlOCwgMHg2YSwgMHg2YSwgMHhlYSwgMHhlYSwKKwkweDZjLCAweDZjLCAweGVjLCAweGVjLCAweDZlLCAweDZlLCAweGVlLCAweGVlLAorCTB4NzAsIDB4NzAsIDB4ZjAsIDB4ZjAsIDB4NzIsIDB4NzIsIDB4ZjIsIDB4ZjIsCisJMHg3NCwgMHg3NCwgMHhmNCwgMHhmNCwgMHg3NiwgMHg3NiwgMHhmNiwgMHhmNiwKKwkweDc4LCAweDc4LCAweGY4LCAweGY4LCAweDdhLCAweDdhLCAweGZhLCAweGZhLAorCTB4N2MsIDB4N2MsIDB4ZmMsIDB4ZmMsIDB4N2UsIDB4N2UsIDB4ZmUsIDB4ZmUKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBwYXJpdHlbXSA9IHsKLQk4LDEsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMiw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDMsCi0JMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LAotCTAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCwwLDgsOCwwLDAsOCw4LDAsOCwwLDAsOCwKLQk4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsCi0JMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LAotCTgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCwKLQk4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsCi0JNCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDUsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsNiw4LAorc3RhdGljIGNvbnN0IHUzMiBwYzJbMTAyNF0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDQwMDAwLCAweDAwMDAwMDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDAwLAorCTB4MDA0MDAwMDAsIDB4MDAwMDAwMDgsIDB4MDAwMDA4MDAsIDB4NDAwMDAwMDAsCisJMHgwMDQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgwNDAwMDgwMCwgMHg0MDEwMDAwMCwKKwkweDAwMDAwNDAwLCAweDAwMDAwMDIwLCAweDA4MDAwMDAwLCAweDAwMDAwMTAwLAorCTB4MDAwNDA0MDAsIDB4MDAwMDAwMjAsIDB4MGMwMDAwMDAsIDB4MDAxMDAxMDAsCisJMHgwMDQwMDQwMCwgMHgwMDAwMDAyOCwgMHgwODAwMDgwMCwgMHg0MDAwMDEwMCwKKwkweDAwNDQwNDAwLCAweDAwMDAwMDI4LCAweDBjMDAwODAwLCAweDQwMTAwMTAwLAorCTB4ODAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDA4MDAwMDAsCisJMHg4MDA0MDAwMCwgMHgwMDAwMDAxMCwgMHgwNDAwMDAwMCwgMHgwMDkwMDAwMCwKKwkweDgwNDAwMDAwLCAweDAwMDAwMDE4LCAweDAwMDAwODAwLCAweDQwODAwMDAwLAorCTB4ODA0NDAwMDAsIDB4MDAwMDAwMTgsIDB4MDQwMDA4MDAsIDB4NDA5MDAwMDAsCisJMHg4MDAwMDQwMCwgMHgwMDAwMDAzMCwgMHgwODAwMDAwMCwgMHgwMDgwMDEwMCwKKwkweDgwMDQwNDAwLCAweDAwMDAwMDMwLCAweDBjMDAwMDAwLCAweDAwOTAwMTAwLAorCTB4ODA0MDA0MDAsIDB4MDAwMDAwMzgsIDB4MDgwMDA4MDAsIDB4NDA4MDAxMDAsCisJMHg4MDQ0MDQwMCwgMHgwMDAwMDAzOCwgMHgwYzAwMDgwMCwgMHg0MDkwMDEwMCwKKwkweDEwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMjAwMDAwLCAweDAwMDAxMDAwLAorCTB4MTAwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MDQyMDAwMDAsIDB4MDAxMDEwMDAsCisJMHgxMDQwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDIwMDgwMCwgMHg0MDAwMTAwMCwKKwkweDEwNDQwMDAwLCAweDAwMDAwMDA4LCAweDA0MjAwODAwLCAweDQwMTAxMDAwLAorCTB4MTAwMDA0MDAsIDB4MDAwMDAwMjAsIDB4MDgyMDAwMDAsIDB4MDAwMDExMDAsCisJMHgxMDA0MDQwMCwgMHgwMDAwMDAyMCwgMHgwYzIwMDAwMCwgMHgwMDEwMTEwMCwKKwkweDEwNDAwNDAwLCAweDAwMDAwMDI4LCAweDA4MjAwODAwLCAweDQwMDAxMTAwLAorCTB4MTA0NDA0MDAsIDB4MDAwMDAwMjgsIDB4MGMyMDA4MDAsIDB4NDAxMDExMDAsCisJMHg5MDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDIwMDAwMCwgMHgwMDgwMTAwMCwKKwkweDkwMDQwMDAwLCAweDAwMDAwMDEwLCAweDA0MjAwMDAwLCAweDAwOTAxMDAwLAorCTB4OTA0MDAwMDAsIDB4MDAwMDAwMTgsIDB4MDAyMDA4MDAsIDB4NDA4MDEwMDAsCisJMHg5MDQ0MDAwMCwgMHgwMDAwMDAxOCwgMHgwNDIwMDgwMCwgMHg0MDkwMTAwMCwKKwkweDkwMDAwNDAwLCAweDAwMDAwMDMwLCAweDA4MjAwMDAwLCAweDAwODAxMTAwLAorCTB4OTAwNDA0MDAsIDB4MDAwMDAwMzAsIDB4MGMyMDAwMDAsIDB4MDA5MDExMDAsCisJMHg5MDQwMDQwMCwgMHgwMDAwMDAzOCwgMHgwODIwMDgwMCwgMHg0MDgwMTEwMCwKKwkweDkwNDQwNDAwLCAweDAwMDAwMDM4LCAweDBjMjAwODAwLCAweDQwOTAxMTAwLAorCTB4MDAwMDAyMDAsIDB4MDAwODAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsCisJMHgwMDA0MDIwMCwgMHgwMDA4MDAwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDAwNCwKKwkweDAwNDAwMjAwLCAweDAwMDgwMDA4LCAweDAwMDAwODAwLCAweDQwMDAwMDA0LAorCTB4MDA0NDAyMDAsIDB4MDAwODAwMDgsIDB4MDQwMDA4MDAsIDB4NDAxMDAwMDQsCisJMHgwMDAwMDYwMCwgMHgwMDA4MDAyMCwgMHgwODAwMDAwMCwgMHgwMDAwMDEwNCwKKwkweDAwMDQwNjAwLCAweDAwMDgwMDIwLCAweDBjMDAwMDAwLCAweDAwMTAwMTA0LAorCTB4MDA0MDA2MDAsIDB4MDAwODAwMjgsIDB4MDgwMDA4MDAsIDB4NDAwMDAxMDQsCisJMHgwMDQ0MDYwMCwgMHgwMDA4MDAyOCwgMHgwYzAwMDgwMCwgMHg0MDEwMDEwNCwKKwkweDgwMDAwMjAwLCAweDAwMDgwMDEwLCAweDAwMDAwMDAwLCAweDAwODAwMDA0LAorCTB4ODAwNDAyMDAsIDB4MDAwODAwMTAsIDB4MDQwMDAwMDAsIDB4MDA5MDAwMDQsCisJMHg4MDQwMDIwMCwgMHgwMDA4MDAxOCwgMHgwMDAwMDgwMCwgMHg0MDgwMDAwNCwKKwkweDgwNDQwMjAwLCAweDAwMDgwMDE4LCAweDA0MDAwODAwLCAweDQwOTAwMDA0LAorCTB4ODAwMDA2MDAsIDB4MDAwODAwMzAsIDB4MDgwMDAwMDAsIDB4MDA4MDAxMDQsCisJMHg4MDA0MDYwMCwgMHgwMDA4MDAzMCwgMHgwYzAwMDAwMCwgMHgwMDkwMDEwNCwKKwkweDgwNDAwNjAwLCAweDAwMDgwMDM4LCAweDA4MDAwODAwLCAweDQwODAwMTA0LAorCTB4ODA0NDA2MDAsIDB4MDAwODAwMzgsIDB4MGMwMDA4MDAsIDB4NDA5MDAxMDQsCisJMHgxMDAwMDIwMCwgMHgwMDA4MDAwMCwgMHgwMDIwMDAwMCwgMHgwMDAwMTAwNCwKKwkweDEwMDQwMjAwLCAweDAwMDgwMDAwLCAweDA0MjAwMDAwLCAweDAwMTAxMDA0LAorCTB4MTA0MDAyMDAsIDB4MDAwODAwMDgsIDB4MDAyMDA4MDAsIDB4NDAwMDEwMDQsCisJMHgxMDQ0MDIwMCwgMHgwMDA4MDAwOCwgMHgwNDIwMDgwMCwgMHg0MDEwMTAwNCwKKwkweDEwMDAwNjAwLCAweDAwMDgwMDIwLCAweDA4MjAwMDAwLCAweDAwMDAxMTA0LAorCTB4MTAwNDA2MDAsIDB4MDAwODAwMjAsIDB4MGMyMDAwMDAsIDB4MDAxMDExMDQsCisJMHgxMDQwMDYwMCwgMHgwMDA4MDAyOCwgMHgwODIwMDgwMCwgMHg0MDAwMTEwNCwKKwkweDEwNDQwNjAwLCAweDAwMDgwMDI4LCAweDBjMjAwODAwLCAweDQwMTAxMTA0LAorCTB4OTAwMDAyMDAsIDB4MDAwODAwMTAsIDB4MDAyMDAwMDAsIDB4MDA4MDEwMDQsCisJMHg5MDA0MDIwMCwgMHgwMDA4MDAxMCwgMHgwNDIwMDAwMCwgMHgwMDkwMTAwNCwKKwkweDkwNDAwMjAwLCAweDAwMDgwMDE4LCAweDAwMjAwODAwLCAweDQwODAxMDA0LAorCTB4OTA0NDAyMDAsIDB4MDAwODAwMTgsIDB4MDQyMDA4MDAsIDB4NDA5MDEwMDQsCisJMHg5MDAwMDYwMCwgMHgwMDA4MDAzMCwgMHgwODIwMDAwMCwgMHgwMDgwMTEwNCwKKwkweDkwMDQwNjAwLCAweDAwMDgwMDMwLCAweDBjMjAwMDAwLCAweDAwOTAxMTA0LAorCTB4OTA0MDA2MDAsIDB4MDAwODAwMzgsIDB4MDgyMDA4MDAsIDB4NDA4MDExMDQsCisJMHg5MDQ0MDYwMCwgMHgwMDA4MDAzOCwgMHgwYzIwMDgwMCwgMHg0MDkwMTEwNCwKKwkweDAwMDAwMDAyLCAweDAwMDAyMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDAxLAorCTB4MDAwNDAwMDIsIDB4MDAwMDIwMDAsIDB4MjQwMDAwMDAsIDB4MDAxMDAwMDEsCisJMHgwMDQwMDAwMiwgMHgwMDAwMjAwOCwgMHgyMDAwMDgwMCwgMHg0MDAwMDAwMSwKKwkweDAwNDQwMDAyLCAweDAwMDAyMDA4LCAweDI0MDAwODAwLCAweDQwMTAwMDAxLAorCTB4MDAwMDA0MDIsIDB4MDAwMDIwMjAsIDB4MjgwMDAwMDAsIDB4MDAwMDAxMDEsCisJMHgwMDA0MDQwMiwgMHgwMDAwMjAyMCwgMHgyYzAwMDAwMCwgMHgwMDEwMDEwMSwKKwkweDAwNDAwNDAyLCAweDAwMDAyMDI4LCAweDI4MDAwODAwLCAweDQwMDAwMTAxLAorCTB4MDA0NDA0MDIsIDB4MDAwMDIwMjgsIDB4MmMwMDA4MDAsIDB4NDAxMDAxMDEsCisJMHg4MDAwMDAwMiwgMHgwMDAwMjAxMCwgMHgyMDAwMDAwMCwgMHgwMDgwMDAwMSwKKwkweDgwMDQwMDAyLCAweDAwMDAyMDEwLCAweDI0MDAwMDAwLCAweDAwOTAwMDAxLAorCTB4ODA0MDAwMDIsIDB4MDAwMDIwMTgsIDB4MjAwMDA4MDAsIDB4NDA4MDAwMDEsCisJMHg4MDQ0MDAwMiwgMHgwMDAwMjAxOCwgMHgyNDAwMDgwMCwgMHg0MDkwMDAwMSwKKwkweDgwMDAwNDAyLCAweDAwMDAyMDMwLCAweDI4MDAwMDAwLCAweDAwODAwMTAxLAorCTB4ODAwNDA0MDIsIDB4MDAwMDIwMzAsIDB4MmMwMDAwMDAsIDB4MDA5MDAxMDEsCisJMHg4MDQwMDQwMiwgMHgwMDAwMjAzOCwgMHgyODAwMDgwMCwgMHg0MDgwMDEwMSwKKwkweDgwNDQwNDAyLCAweDAwMDAyMDM4LCAweDJjMDAwODAwLCAweDQwOTAwMTAxLAorCTB4MTAwMDAwMDIsIDB4MDAwMDIwMDAsIDB4MjAyMDAwMDAsIDB4MDAwMDEwMDEsCisJMHgxMDA0MDAwMiwgMHgwMDAwMjAwMCwgMHgyNDIwMDAwMCwgMHgwMDEwMTAwMSwKKwkweDEwNDAwMDAyLCAweDAwMDAyMDA4LCAweDIwMjAwODAwLCAweDQwMDAxMDAxLAorCTB4MTA0NDAwMDIsIDB4MDAwMDIwMDgsIDB4MjQyMDA4MDAsIDB4NDAxMDEwMDEsCisJMHgxMDAwMDQwMiwgMHgwMDAwMjAyMCwgMHgyODIwMDAwMCwgMHgwMDAwMTEwMSwKKwkweDEwMDQwNDAyLCAweDAwMDAyMDIwLCAweDJjMjAwMDAwLCAweDAwMTAxMTAxLAorCTB4MTA0MDA0MDIsIDB4MDAwMDIwMjgsIDB4MjgyMDA4MDAsIDB4NDAwMDExMDEsCisJMHgxMDQ0MDQwMiwgMHgwMDAwMjAyOCwgMHgyYzIwMDgwMCwgMHg0MDEwMTEwMSwKKwkweDkwMDAwMDAyLCAweDAwMDAyMDEwLCAweDIwMjAwMDAwLCAweDAwODAxMDAxLAorCTB4OTAwNDAwMDIsIDB4MDAwMDIwMTAsIDB4MjQyMDAwMDAsIDB4MDA5MDEwMDEsCisJMHg5MDQwMDAwMiwgMHgwMDAwMjAxOCwgMHgyMDIwMDgwMCwgMHg0MDgwMTAwMSwKKwkweDkwNDQwMDAyLCAweDAwMDAyMDE4LCAweDI0MjAwODAwLCAweDQwOTAxMDAxLAorCTB4OTAwMDA0MDIsIDB4MDAwMDIwMzAsIDB4MjgyMDAwMDAsIDB4MDA4MDExMDEsCisJMHg5MDA0MDQwMiwgMHgwMDAwMjAzMCwgMHgyYzIwMDAwMCwgMHgwMDkwMTEwMSwKKwkweDkwNDAwNDAyLCAweDAwMDAyMDM4LCAweDI4MjAwODAwLCAweDQwODAxMTAxLAorCTB4OTA0NDA0MDIsIDB4MDAwMDIwMzgsIDB4MmMyMDA4MDAsIDB4NDA5MDExMDEsCisJMHgwMDAwMDIwMiwgMHgwMDA4MjAwMCwgMHgyMDAwMDAwMCwgMHgwMDAwMDAwNSwKKwkweDAwMDQwMjAyLCAweDAwMDgyMDAwLCAweDI0MDAwMDAwLCAweDAwMTAwMDA1LAorCTB4MDA0MDAyMDIsIDB4MDAwODIwMDgsIDB4MjAwMDA4MDAsIDB4NDAwMDAwMDUsCisJMHgwMDQ0MDIwMiwgMHgwMDA4MjAwOCwgMHgyNDAwMDgwMCwgMHg0MDEwMDAwNSwKKwkweDAwMDAwNjAyLCAweDAwMDgyMDIwLCAweDI4MDAwMDAwLCAweDAwMDAwMTA1LAorCTB4MDAwNDA2MDIsIDB4MDAwODIwMjAsIDB4MmMwMDAwMDAsIDB4MDAxMDAxMDUsCisJMHgwMDQwMDYwMiwgMHgwMDA4MjAyOCwgMHgyODAwMDgwMCwgMHg0MDAwMDEwNSwKKwkweDAwNDQwNjAyLCAweDAwMDgyMDI4LCAweDJjMDAwODAwLCAweDQwMTAwMTA1LAorCTB4ODAwMDAyMDIsIDB4MDAwODIwMTAsIDB4MjAwMDAwMDAsIDB4MDA4MDAwMDUsCisJMHg4MDA0MDIwMiwgMHgwMDA4MjAxMCwgMHgyNDAwMDAwMCwgMHgwMDkwMDAwNSwKKwkweDgwNDAwMjAyLCAweDAwMDgyMDE4LCAweDIwMDAwODAwLCAweDQwODAwMDA1LAorCTB4ODA0NDAyMDIsIDB4MDAwODIwMTgsIDB4MjQwMDA4MDAsIDB4NDA5MDAwMDUsCisJMHg4MDAwMDYwMiwgMHgwMDA4MjAzMCwgMHgyODAwMDAwMCwgMHgwMDgwMDEwNSwKKwkweDgwMDQwNjAyLCAweDAwMDgyMDMwLCAweDJjMDAwMDAwLCAweDAwOTAwMTA1LAorCTB4ODA0MDA2MDIsIDB4MDAwODIwMzgsIDB4MjgwMDA4MDAsIDB4NDA4MDAxMDUsCisJMHg4MDQ0MDYwMiwgMHgwMDA4MjAzOCwgMHgyYzAwMDgwMCwgMHg0MDkwMDEwNSwKKwkweDEwMDAwMjAyLCAweDAwMDgyMDAwLCAweDIwMjAwMDAwLCAweDAwMDAxMDA1LAorCTB4MTAwNDAyMDIsIDB4MDAwODIwMDAsIDB4MjQyMDAwMDAsIDB4MDAxMDEwMDUsCisJMHgxMDQwMDIwMiwgMHgwMDA4MjAwOCwgMHgyMDIwMDgwMCwgMHg0MDAwMTAwNSwKKwkweDEwNDQwMjAyLCAweDAwMDgyMDA4LCAweDI0MjAwODAwLCAweDQwMTAxMDA1LAorCTB4MTAwMDA2MDIsIDB4MDAwODIwMjAsIDB4MjgyMDAwMDAsIDB4MDAwMDExMDUsCisJMHgxMDA0MDYwMiwgMHgwMDA4MjAyMCwgMHgyYzIwMDAwMCwgMHgwMDEwMTEwNSwKKwkweDEwNDAwNjAyLCAweDAwMDgyMDI4LCAweDI4MjAwODAwLCAweDQwMDAxMTA1LAorCTB4MTA0NDA2MDIsIDB4MDAwODIwMjgsIDB4MmMyMDA4MDAsIDB4NDAxMDExMDUsCisJMHg5MDAwMDIwMiwgMHgwMDA4MjAxMCwgMHgyMDIwMDAwMCwgMHgwMDgwMTAwNSwKKwkweDkwMDQwMjAyLCAweDAwMDgyMDEwLCAweDI0MjAwMDAwLCAweDAwOTAxMDA1LAorCTB4OTA0MDAyMDIsIDB4MDAwODIwMTgsIDB4MjAyMDA4MDAsIDB4NDA4MDEwMDUsCisJMHg5MDQ0MDIwMiwgMHgwMDA4MjAxOCwgMHgyNDIwMDgwMCwgMHg0MDkwMTAwNSwKKwkweDkwMDAwNjAyLCAweDAwMDgyMDMwLCAweDI4MjAwMDAwLCAweDAwODAxMTA1LAorCTB4OTAwNDA2MDIsIDB4MDAwODIwMzAsIDB4MmMyMDAwMDAsIDB4MDA5MDExMDUsCisJMHg5MDQwMDYwMiwgMHgwMDA4MjAzOCwgMHgyODIwMDgwMCwgMHg0MDgwMTEwNSwKKwkweDkwNDQwNjAyLCAweDAwMDgyMDM4LCAweDJjMjAwODAwLCAweDQwOTAxMTA1LAorCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMDAwLCAweDEwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwODAsIDB4MDAwMDEwMDAsCisJMHgwMjAwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDA4MDA4MCwgMHgxMDAwMTAwMCwKKwkweDAwMDA0MDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDQwLCAweDAwMDQwMDAwLAorCTB4MDAwMDQwMDAsIDB4MDAwMDAwMDgsIDB4MDAwODAwNDAsIDB4MTAwNDAwMDAsCisJMHgwMjAwNDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDBjMCwgMHgwMDA0MTAwMCwKKwkweDAyMDA0MDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMGMwLCAweDEwMDQxMDAwLAorCTB4MDAwMjAwMDAsIDB4MDAwMDgwMDAsIDB4MDgwMDAwMDAsIDB4MDAyMDAwMDAsCisJMHgwMDAyMDAwMCwgMHgwMDAwODAwOCwgMHgwODA4MDAwMCwgMHgxMDIwMDAwMCwKKwkweDAyMDIwMDAwLCAweDAwMDA4MDAwLCAweDA4MDAwMDgwLCAweDAwMjAxMDAwLAorCTB4MDIwMjAwMDAsIDB4MDAwMDgwMDgsIDB4MDgwODAwODAsIDB4MTAyMDEwMDAsCisJMHgwMDAyNDAwMCwgMHgwMDAwODAwMCwgMHgwODAwMDA0MCwgMHgwMDI0MDAwMCwKKwkweDAwMDI0MDAwLCAweDAwMDA4MDA4LCAweDA4MDgwMDQwLCAweDEwMjQwMDAwLAorCTB4MDIwMjQwMDAsIDB4MDAwMDgwMDAsIDB4MDgwMDAwYzAsIDB4MDAyNDEwMDAsCisJMHgwMjAyNDAwMCwgMHgwMDAwODAwOCwgMHgwODA4MDBjMCwgMHgxMDI0MTAwMCwKKwkweDAwMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAyMDAwLCAweDAwMDAwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDEwMDAwMDgsIDB4MDAwODIwMDAsIDB4MTAwMDAwMjAsCisJMHgwMjAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMjA4MCwgMHgwMDAwMTAyMCwKKwkweDAyMDAwMDAwLCAweDAxMDAwMDA4LCAweDAwMDgyMDgwLCAweDEwMDAxMDIwLAorCTB4MDAwMDQwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDIwNDAsIDB4MDAwNDAwMjAsCisJMHgwMDAwNDAwMCwgMHgwMTAwMDAwOCwgMHgwMDA4MjA0MCwgMHgxMDA0MDAyMCwKKwkweDAyMDA0MDAwLCAweDAxMDAwMDAwLCAweDAwMDAyMGMwLCAweDAwMDQxMDIwLAorCTB4MDIwMDQwMDAsIDB4MDEwMDAwMDgsIDB4MDAwODIwYzAsIDB4MTAwNDEwMjAsCisJMHgwMDAyMDAwMCwgMHgwMTAwODAwMCwgMHgwODAwMjAwMCwgMHgwMDIwMDAyMCwKKwkweDAwMDIwMDAwLCAweDAxMDA4MDA4LCAweDA4MDgyMDAwLCAweDEwMjAwMDIwLAorCTB4MDIwMjAwMDAsIDB4MDEwMDgwMDAsIDB4MDgwMDIwODAsIDB4MDAyMDEwMjAsCisJMHgwMjAyMDAwMCwgMHgwMTAwODAwOCwgMHgwODA4MjA4MCwgMHgxMDIwMTAyMCwKKwkweDAwMDI0MDAwLCAweDAxMDA4MDAwLCAweDA4MDAyMDQwLCAweDAwMjQwMDIwLAorCTB4MDAwMjQwMDAsIDB4MDEwMDgwMDgsIDB4MDgwODIwNDAsIDB4MTAyNDAwMjAsCisJMHgwMjAyNDAwMCwgMHgwMTAwODAwMCwgMHgwODAwMjBjMCwgMHgwMDI0MTAyMCwKKwkweDAyMDI0MDAwLCAweDAxMDA4MDA4LCAweDA4MDgyMGMwLCAweDEwMjQxMDIwLAorCTB4MDAwMDA0MDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwMDAsIDB4MDAwMDAwMDQsCisJMHgwMDAwMDQwMCwgMHgwNDAwMDAwOCwgMHgwMDE4MDAwMCwgMHgxMDAwMDAwNCwKKwkweDAyMDAwNDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDgwLCAweDAwMDAxMDA0LAorCTB4MDIwMDA0MDAsIDB4MDQwMDAwMDgsIDB4MDAxODAwODAsIDB4MTAwMDEwMDQsCisJMHgwMDAwNDQwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDA0MCwgMHgwMDA0MDAwNCwKKwkweDAwMDA0NDAwLCAweDA0MDAwMDA4LCAweDAwMTgwMDQwLCAweDEwMDQwMDA0LAorCTB4MDIwMDQ0MDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwYzAsIDB4MDAwNDEwMDQsCisJMHgwMjAwNDQwMCwgMHgwNDAwMDAwOCwgMHgwMDE4MDBjMCwgMHgxMDA0MTAwNCwKKwkweDAwMDIwNDAwLCAweDA0MDA4MDAwLCAweDA4MTAwMDAwLCAweDAwMjAwMDA0LAorCTB4MDAwMjA0MDAsIDB4MDQwMDgwMDgsIDB4MDgxODAwMDAsIDB4MTAyMDAwMDQsCisJMHgwMjAyMDQwMCwgMHgwNDAwODAwMCwgMHgwODEwMDA4MCwgMHgwMDIwMTAwNCwKKwkweDAyMDIwNDAwLCAweDA0MDA4MDA4LCAweDA4MTgwMDgwLCAweDEwMjAxMDA0LAorCTB4MDAwMjQ0MDAsIDB4MDQwMDgwMDAsIDB4MDgxMDAwNDAsIDB4MDAyNDAwMDQsCisJMHgwMDAyNDQwMCwgMHgwNDAwODAwOCwgMHgwODE4MDA0MCwgMHgxMDI0MDAwNCwKKwkweDAyMDI0NDAwLCAweDA0MDA4MDAwLCAweDA4MTAwMGMwLCAweDAwMjQxMDA0LAorCTB4MDIwMjQ0MDAsIDB4MDQwMDgwMDgsIDB4MDgxODAwYzAsIDB4MTAyNDEwMDQsCisJMHgwMDAwMDQwMCwgMHgwNTAwMDAwMCwgMHgwMDEwMjAwMCwgMHgwMDAwMDAyNCwKKwkweDAwMDAwNDAwLCAweDA1MDAwMDA4LCAweDAwMTgyMDAwLCAweDEwMDAwMDI0LAorCTB4MDIwMDA0MDAsIDB4MDUwMDAwMDAsIDB4MDAxMDIwODAsIDB4MDAwMDEwMjQsCisJMHgwMjAwMDQwMCwgMHgwNTAwMDAwOCwgMHgwMDE4MjA4MCwgMHgxMDAwMTAyNCwKKwkweDAwMDA0NDAwLCAweDA1MDAwMDAwLCAweDAwMTAyMDQwLCAweDAwMDQwMDI0LAorCTB4MDAwMDQ0MDAsIDB4MDUwMDAwMDgsIDB4MDAxODIwNDAsIDB4MTAwNDAwMjQsCisJMHgwMjAwNDQwMCwgMHgwNTAwMDAwMCwgMHgwMDEwMjBjMCwgMHgwMDA0MTAyNCwKKwkweDAyMDA0NDAwLCAweDA1MDAwMDA4LCAweDAwMTgyMGMwLCAweDEwMDQxMDI0LAorCTB4MDAwMjA0MDAsIDB4MDUwMDgwMDAsIDB4MDgxMDIwMDAsIDB4MDAyMDAwMjQsCisJMHgwMDAyMDQwMCwgMHgwNTAwODAwOCwgMHgwODE4MjAwMCwgMHgxMDIwMDAyNCwKKwkweDAyMDIwNDAwLCAweDA1MDA4MDAwLCAweDA4MTAyMDgwLCAweDAwMjAxMDI0LAorCTB4MDIwMjA0MDAsIDB4MDUwMDgwMDgsIDB4MDgxODIwODAsIDB4MTAyMDEwMjQsCisJMHgwMDAyNDQwMCwgMHgwNTAwODAwMCwgMHgwODEwMjA0MCwgMHgwMDI0MDAyNCwKKwkweDAwMDI0NDAwLCAweDA1MDA4MDA4LCAweDA4MTgyMDQwLCAweDEwMjQwMDI0LAorCTB4MDIwMjQ0MDAsIDB4MDUwMDgwMDAsIDB4MDgxMDIwYzAsIDB4MDAyNDEwMjQsCisJMHgwMjAyNDQwMCwgMHgwNTAwODAwOCwgMHgwODE4MjBjMCwgMHgxMDI0MTAyNCwKKwkweDAwMDAwODAwLCAweDAwMDEwMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDEwLAorCTB4MDAwMDA4MDAsIDB4MDAwMTAwMDgsIDB4MjAwODAwMDAsIDB4MTAwMDAwMTAsCisJMHgwMjAwMDgwMCwgMHgwMDAxMDAwMCwgMHgyMDAwMDA4MCwgMHgwMDAwMTAxMCwKKwkweDAyMDAwODAwLCAweDAwMDEwMDA4LCAweDIwMDgwMDgwLCAweDEwMDAxMDEwLAorCTB4MDAwMDQ4MDAsIDB4MDAwMTAwMDAsIDB4MjAwMDAwNDAsIDB4MDAwNDAwMTAsCisJMHgwMDAwNDgwMCwgMHgwMDAxMDAwOCwgMHgyMDA4MDA0MCwgMHgxMDA0MDAxMCwKKwkweDAyMDA0ODAwLCAweDAwMDEwMDAwLCAweDIwMDAwMGMwLCAweDAwMDQxMDEwLAorCTB4MDIwMDQ4MDAsIDB4MDAwMTAwMDgsIDB4MjAwODAwYzAsIDB4MTAwNDEwMTAsCisJMHgwMDAyMDgwMCwgMHgwMDAxODAwMCwgMHgyODAwMDAwMCwgMHgwMDIwMDAxMCwKKwkweDAwMDIwODAwLCAweDAwMDE4MDA4LCAweDI4MDgwMDAwLCAweDEwMjAwMDEwLAorCTB4MDIwMjA4MDAsIDB4MDAwMTgwMDAsIDB4MjgwMDAwODAsIDB4MDAyMDEwMTAsCisJMHgwMjAyMDgwMCwgMHgwMDAxODAwOCwgMHgyODA4MDA4MCwgMHgxMDIwMTAxMCwKKwkweDAwMDI0ODAwLCAweDAwMDE4MDAwLCAweDI4MDAwMDQwLCAweDAwMjQwMDEwLAorCTB4MDAwMjQ4MDAsIDB4MDAwMTgwMDgsIDB4MjgwODAwNDAsIDB4MTAyNDAwMTAsCisJMHgwMjAyNDgwMCwgMHgwMDAxODAwMCwgMHgyODAwMDBjMCwgMHgwMDI0MTAxMCwKKwkweDAyMDI0ODAwLCAweDAwMDE4MDA4LCAweDI4MDgwMGMwLCAweDEwMjQxMDEwLAorCTB4MDAwMDA4MDAsIDB4MDEwMTAwMDAsIDB4MjAwMDIwMDAsIDB4MDAwMDAwMzAsCisJMHgwMDAwMDgwMCwgMHgwMTAxMDAwOCwgMHgyMDA4MjAwMCwgMHgxMDAwMDAzMCwKKwkweDAyMDAwODAwLCAweDAxMDEwMDAwLCAweDIwMDAyMDgwLCAweDAwMDAxMDMwLAorCTB4MDIwMDA4MDAsIDB4MDEwMTAwMDgsIDB4MjAwODIwODAsIDB4MTAwMDEwMzAsCisJMHgwMDAwNDgwMCwgMHgwMTAxMDAwMCwgMHgyMDAwMjA0MCwgMHgwMDA0MDAzMCwKKwkweDAwMDA0ODAwLCAweDAxMDEwMDA4LCAweDIwMDgyMDQwLCAweDEwMDQwMDMwLAorCTB4MDIwMDQ4MDAsIDB4MDEwMTAwMDAsIDB4MjAwMDIwYzAsIDB4MDAwNDEwMzAsCisJMHgwMjAwNDgwMCwgMHgwMTAxMDAwOCwgMHgyMDA4MjBjMCwgMHgxMDA0MTAzMCwKKwkweDAwMDIwODAwLCAweDAxMDE4MDAwLCAweDI4MDAyMDAwLCAweDAwMjAwMDMwLAorCTB4MDAwMjA4MDAsIDB4MDEwMTgwMDgsIDB4MjgwODIwMDAsIDB4MTAyMDAwMzAsCisJMHgwMjAyMDgwMCwgMHgwMTAxODAwMCwgMHgyODAwMjA4MCwgMHgwMDIwMTAzMCwKKwkweDAyMDIwODAwLCAweDAxMDE4MDA4LCAweDI4MDgyMDgwLCAweDEwMjAxMDMwLAorCTB4MDAwMjQ4MDAsIDB4MDEwMTgwMDAsIDB4MjgwMDIwNDAsIDB4MDAyNDAwMzAsCisJMHgwMDAyNDgwMCwgMHgwMTAxODAwOCwgMHgyODA4MjA0MCwgMHgxMDI0MDAzMCwKKwkweDAyMDI0ODAwLCAweDAxMDE4MDAwLCAweDI4MDAyMGMwLCAweDAwMjQxMDMwLAorCTB4MDIwMjQ4MDAsIDB4MDEwMTgwMDgsIDB4MjgwODIwYzAsIDB4MTAyNDEwMzAsCisJMHgwMDAwMGMwMCwgMHgwNDAxMDAwMCwgMHgyMDEwMDAwMCwgMHgwMDAwMDAxNCwKKwkweDAwMDAwYzAwLCAweDA0MDEwMDA4LCAweDIwMTgwMDAwLCAweDEwMDAwMDE0LAorCTB4MDIwMDBjMDAsIDB4MDQwMTAwMDAsIDB4MjAxMDAwODAsIDB4MDAwMDEwMTQsCisJMHgwMjAwMGMwMCwgMHgwNDAxMDAwOCwgMHgyMDE4MDA4MCwgMHgxMDAwMTAxNCwKKwkweDAwMDA0YzAwLCAweDA0MDEwMDAwLCAweDIwMTAwMDQwLCAweDAwMDQwMDE0LAorCTB4MDAwMDRjMDAsIDB4MDQwMTAwMDgsIDB4MjAxODAwNDAsIDB4MTAwNDAwMTQsCisJMHgwMjAwNGMwMCwgMHgwNDAxMDAwMCwgMHgyMDEwMDBjMCwgMHgwMDA0MTAxNCwKKwkweDAyMDA0YzAwLCAweDA0MDEwMDA4LCAweDIwMTgwMGMwLCAweDEwMDQxMDE0LAorCTB4MDAwMjBjMDAsIDB4MDQwMTgwMDAsIDB4MjgxMDAwMDAsIDB4MDAyMDAwMTQsCisJMHgwMDAyMGMwMCwgMHgwNDAxODAwOCwgMHgyODE4MDAwMCwgMHgxMDIwMDAxNCwKKwkweDAyMDIwYzAwLCAweDA0MDE4MDAwLCAweDI4MTAwMDgwLCAweDAwMjAxMDE0LAorCTB4MDIwMjBjMDAsIDB4MDQwMTgwMDgsIDB4MjgxODAwODAsIDB4MTAyMDEwMTQsCisJMHgwMDAyNGMwMCwgMHgwNDAxODAwMCwgMHgyODEwMDA0MCwgMHgwMDI0MDAxNCwKKwkweDAwMDI0YzAwLCAweDA0MDE4MDA4LCAweDI4MTgwMDQwLCAweDEwMjQwMDE0LAorCTB4MDIwMjRjMDAsIDB4MDQwMTgwMDAsIDB4MjgxMDAwYzAsIDB4MDAyNDEwMTQsCisJMHgwMjAyNGMwMCwgMHgwNDAxODAwOCwgMHgyODE4MDBjMCwgMHgxMDI0MTAxNCwKKwkweDAwMDAwYzAwLCAweDA1MDEwMDAwLCAweDIwMTAyMDAwLCAweDAwMDAwMDM0LAorCTB4MDAwMDBjMDAsIDB4MDUwMTAwMDgsIDB4MjAxODIwMDAsIDB4MTAwMDAwMzQsCisJMHgwMjAwMGMwMCwgMHgwNTAxMDAwMCwgMHgyMDEwMjA4MCwgMHgwMDAwMTAzNCwKKwkweDAyMDAwYzAwLCAweDA1MDEwMDA4LCAweDIwMTgyMDgwLCAweDEwMDAxMDM0LAorCTB4MDAwMDRjMDAsIDB4MDUwMTAwMDAsIDB4MjAxMDIwNDAsIDB4MDAwNDAwMzQsCisJMHgwMDAwNGMwMCwgMHgwNTAxMDAwOCwgMHgyMDE4MjA0MCwgMHgxMDA0MDAzNCwKKwkweDAyMDA0YzAwLCAweDA1MDEwMDAwLCAweDIwMTAyMGMwLCAweDAwMDQxMDM0LAorCTB4MDIwMDRjMDAsIDB4MDUwMTAwMDgsIDB4MjAxODIwYzAsIDB4MTAwNDEwMzQsCisJMHgwMDAyMGMwMCwgMHgwNTAxODAwMCwgMHgyODEwMjAwMCwgMHgwMDIwMDAzNCwKKwkweDAwMDIwYzAwLCAweDA1MDE4MDA4LCAweDI4MTgyMDAwLCAweDEwMjAwMDM0LAorCTB4MDIwMjBjMDAsIDB4MDUwMTgwMDAsIDB4MjgxMDIwODAsIDB4MDAyMDEwMzQsCisJMHgwMjAyMGMwMCwgMHgwNTAxODAwOCwgMHgyODE4MjA4MCwgMHgxMDIwMTAzNCwKKwkweDAwMDI0YzAwLCAweDA1MDE4MDAwLCAweDI4MTAyMDQwLCAweDAwMjQwMDM0LAorCTB4MDAwMjRjMDAsIDB4MDUwMTgwMDgsIDB4MjgxODIwNDAsIDB4MTAyNDAwMzQsCisJMHgwMjAyNGMwMCwgMHgwNTAxODAwMCwgMHgyODEwMjBjMCwgMHgwMDI0MTAzNCwKKwkweDAyMDI0YzAwLCAweDA1MDE4MDA4LCAweDI4MTgyMGMwLCAweDEwMjQxMDM0CiB9OwogCisvKiBTLWJveCBsb29rdXAgdGFibGVzICovCiAKLXN0YXRpYyB2b2lkIGRlc19zbWFsbF9maXBzX2VuY3J5cHQodTMyICpleHBrZXksIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgY29uc3QgdTMyIFMxWzY0XSA9IHsKKwkweDAxMDEwNDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMDAwLCAweDAxMDEwNDA0LAorCTB4MDEwMTAwMDQsIDB4MDAwMTA0MDQsIDB4MDAwMDAwMDQsIDB4MDAwMTAwMDAsCisJMHgwMDAwMDQwMCwgMHgwMTAxMDQwMCwgMHgwMTAxMDQwNCwgMHgwMDAwMDQwMCwKKwkweDAxMDAwNDA0LCAweDAxMDEwMDA0LCAweDAxMDAwMDAwLCAweDAwMDAwMDA0LAorCTB4MDAwMDA0MDQsIDB4MDEwMDA0MDAsIDB4MDEwMDA0MDAsIDB4MDAwMTA0MDAsCisJMHgwMDAxMDQwMCwgMHgwMTAxMDAwMCwgMHgwMTAxMDAwMCwgMHgwMTAwMDQwNCwKKwkweDAwMDEwMDA0LCAweDAxMDAwMDA0LCAweDAxMDAwMDA0LCAweDAwMDEwMDA0LAorCTB4MDAwMDAwMDAsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMDAwMDAsCisJMHgwMDAxMDAwMCwgMHgwMTAxMDQwNCwgMHgwMDAwMDAwNCwgMHgwMTAxMDAwMCwKKwkweDAxMDEwNDAwLCAweDAxMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAwNDAwLAorCTB4MDEwMTAwMDQsIDB4MDAwMTAwMDAsIDB4MDAwMTA0MDAsIDB4MDEwMDAwMDQsCisJMHgwMDAwMDQwMCwgMHgwMDAwMDAwNCwgMHgwMTAwMDQwNCwgMHgwMDAxMDQwNCwKKwkweDAxMDEwNDA0LCAweDAwMDEwMDA0LCAweDAxMDEwMDAwLCAweDAxMDAwNDA0LAorCTB4MDEwMDAwMDQsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMTA0MDAsCisJMHgwMDAwMDQwNCwgMHgwMTAwMDQwMCwgMHgwMTAwMDQwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDEwMDA0LCAweDAwMDEwNDAwLCAweDAwMDAwMDAwLCAweDAxMDEwMDA0Cit9OworCitzdGF0aWMgY29uc3QgdTMyIFMyWzY0XSA9IHsKKwkweDgwMTA4MDIwLCAweDgwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMTA4MDIwLAorCTB4MDAxMDAwMDAsIDB4MDAwMDAwMjAsIDB4ODAxMDAwMjAsIDB4ODAwMDgwMjAsCisJMHg4MDAwMDAyMCwgMHg4MDEwODAyMCwgMHg4MDEwODAwMCwgMHg4MDAwMDAwMCwKKwkweDgwMDA4MDAwLCAweDAwMTAwMDAwLCAweDAwMDAwMDIwLCAweDgwMTAwMDIwLAorCTB4MDAxMDgwMDAsIDB4MDAxMDAwMjAsIDB4ODAwMDgwMjAsIDB4MDAwMDAwMDAsCisJMHg4MDAwMDAwMCwgMHgwMDAwODAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAwMCwKKwkweDAwMTAwMDIwLCAweDgwMDAwMDIwLCAweDAwMDAwMDAwLCAweDAwMTA4MDAwLAorCTB4MDAwMDgwMjAsIDB4ODAxMDgwMDAsIDB4ODAxMDAwMDAsIDB4MDAwMDgwMjAsCisJMHgwMDAwMDAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAyMCwgMHgwMDEwMDAwMCwKKwkweDgwMDA4MDIwLCAweDgwMTAwMDAwLCAweDgwMTA4MDAwLCAweDAwMDA4MDAwLAorCTB4ODAxMDAwMDAsIDB4ODAwMDgwMDAsIDB4MDAwMDAwMjAsIDB4ODAxMDgwMjAsCisJMHgwMDEwODAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwODAwMCwgMHg4MDAwMDAwMCwKKwkweDAwMDA4MDIwLCAweDgwMTA4MDAwLCAweDAwMTAwMDAwLCAweDgwMDAwMDIwLAorCTB4MDAxMDAwMjAsIDB4ODAwMDgwMjAsIDB4ODAwMDAwMjAsIDB4MDAxMDAwMjAsCisJMHgwMDEwODAwMCwgMHgwMDAwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDAwODAyMCwKKwkweDgwMDAwMDAwLCAweDgwMTAwMDIwLCAweDgwMTA4MDIwLCAweDAwMTA4MDAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFMzWzY0XSA9IHsKKwkweDAwMDAwMjA4LCAweDA4MDIwMjAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDA4LAorCTB4MDgwMDAyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjAyMDgsIDB4MDgwMDAyMDAsCisJMHgwMDAyMDAwOCwgMHgwODAwMDAwOCwgMHgwODAwMDAwOCwgMHgwMDAyMDAwMCwKKwkweDA4MDIwMjA4LCAweDAwMDIwMDA4LCAweDA4MDIwMDAwLCAweDAwMDAwMjA4LAorCTB4MDgwMDAwMDAsIDB4MDAwMDAwMDgsIDB4MDgwMjAyMDAsIDB4MDAwMDAyMDAsCisJMHgwMDAyMDIwMCwgMHgwODAyMDAwMCwgMHgwODAyMDAwOCwgMHgwMDAyMDIwOCwKKwkweDA4MDAwMjA4LCAweDAwMDIwMjAwLCAweDAwMDIwMDAwLCAweDA4MDAwMjA4LAorCTB4MDAwMDAwMDgsIDB4MDgwMjAyMDgsIDB4MDAwMDAyMDAsIDB4MDgwMDAwMDAsCisJMHgwODAyMDIwMCwgMHgwODAwMDAwMCwgMHgwMDAyMDAwOCwgMHgwMDAwMDIwOCwKKwkweDAwMDIwMDAwLCAweDA4MDIwMjAwLCAweDA4MDAwMjAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAyMDAsIDB4MDAwMjAwMDgsIDB4MDgwMjAyMDgsIDB4MDgwMDAyMDAsCisJMHgwODAwMDAwOCwgMHgwMDAwMDIwMCwgMHgwMDAwMDAwMCwgMHgwODAyMDAwOCwKKwkweDA4MDAwMjA4LCAweDAwMDIwMDAwLCAweDA4MDAwMDAwLCAweDA4MDIwMjA4LAorCTB4MDAwMDAwMDgsIDB4MDAwMjAyMDgsIDB4MDAwMjAyMDAsIDB4MDgwMDAwMDgsCisJMHgwODAyMDAwMCwgMHgwODAwMDIwOCwgMHgwMDAwMDIwOCwgMHgwODAyMDAwMCwKKwkweDAwMDIwMjA4LCAweDAwMDAwMDA4LCAweDA4MDIwMDA4LCAweDAwMDIwMjAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM0WzY0XSA9IHsKKwkweDAwODAyMDAxLCAweDAwMDAyMDgxLCAweDAwMDAyMDgxLCAweDAwMDAwMDgwLAorCTB4MDA4MDIwODAsIDB4MDA4MDAwODEsIDB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsCisJMHgwMDAwMDAwMCwgMHgwMDgwMjAwMCwgMHgwMDgwMjAwMCwgMHgwMDgwMjA4MSwKKwkweDAwMDAwMDgxLCAweDAwMDAwMDAwLCAweDAwODAwMDgwLCAweDAwODAwMDAxLAorCTB4MDAwMDAwMDEsIDB4MDAwMDIwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDIwMDEsCisJMHgwMDAwMDA4MCwgMHgwMDgwMDAwMCwgMHgwMDAwMjAwMSwgMHgwMDAwMjA4MCwKKwkweDAwODAwMDgxLCAweDAwMDAwMDAxLCAweDAwMDAyMDgwLCAweDAwODAwMDgwLAorCTB4MDAwMDIwMDAsIDB4MDA4MDIwODAsIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsCisJMHgwMDgwMDA4MCwgMHgwMDgwMDAwMSwgMHgwMDgwMjAwMCwgMHgwMDgwMjA4MSwKKwkweDAwMDAwMDgxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwODAyMDAwLAorCTB4MDAwMDIwODAsIDB4MDA4MDAwODAsIDB4MDA4MDAwODEsIDB4MDAwMDAwMDEsCisJMHgwMDgwMjAwMSwgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MSwgMHgwMDAwMDA4MCwKKwkweDAwODAyMDgxLCAweDAwMDAwMDgxLCAweDAwMDAwMDAxLCAweDAwMDAyMDAwLAorCTB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsIDB4MDA4MDIwODAsIDB4MDA4MDAwODEsCisJMHgwMDAwMjAwMSwgMHgwMDAwMjA4MCwgMHgwMDgwMDAwMCwgMHgwMDgwMjAwMSwKKwkweDAwMDAwMDgwLCAweDAwODAwMDAwLCAweDAwMDAyMDAwLCAweDAwODAyMDgwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM1WzY0XSA9IHsKKwkweDAwMDAwMTAwLCAweDAyMDgwMTAwLCAweDAyMDgwMDAwLCAweDQyMDAwMTAwLAorCTB4MDAwODAwMDAsIDB4MDAwMDAxMDAsIDB4NDAwMDAwMDAsIDB4MDIwODAwMDAsCisJMHg0MDA4MDEwMCwgMHgwMDA4MDAwMCwgMHgwMjAwMDEwMCwgMHg0MDA4MDEwMCwKKwkweDQyMDAwMTAwLCAweDQyMDgwMDAwLCAweDAwMDgwMTAwLCAweDQwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4NDAwODAwMDAsIDB4NDAwODAwMDAsIDB4MDAwMDAwMDAsCisJMHg0MDAwMDEwMCwgMHg0MjA4MDEwMCwgMHg0MjA4MDEwMCwgMHgwMjAwMDEwMCwKKwkweDQyMDgwMDAwLCAweDQwMDAwMTAwLCAweDAwMDAwMDAwLCAweDQyMDAwMDAwLAorCTB4MDIwODAxMDAsIDB4MDIwMDAwMDAsIDB4NDIwMDAwMDAsIDB4MDAwODAxMDAsCisJMHgwMDA4MDAwMCwgMHg0MjAwMDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwKKwkweDQwMDAwMDAwLCAweDAyMDgwMDAwLCAweDQyMDAwMTAwLCAweDQwMDgwMTAwLAorCTB4MDIwMDAxMDAsIDB4NDAwMDAwMDAsIDB4NDIwODAwMDAsIDB4MDIwODAxMDAsCisJMHg0MDA4MDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwgMHg0MjA4MDAwMCwKKwkweDQyMDgwMTAwLCAweDAwMDgwMTAwLCAweDQyMDAwMDAwLCAweDQyMDgwMTAwLAorCTB4MDIwODAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwODAwMDAsIDB4NDIwMDAwMDAsCisJMHgwMDA4MDEwMCwgMHgwMjAwMDEwMCwgMHg0MDAwMDEwMCwgMHgwMDA4MDAwMCwKKwkweDAwMDAwMDAwLCAweDQwMDgwMDAwLCAweDAyMDgwMTAwLCAweDQwMDAwMTAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM2WzY0XSA9IHsKKwkweDIwMDAwMDEwLCAweDIwNDAwMDAwLCAweDAwMDA0MDAwLCAweDIwNDA0MDEwLAorCTB4MjA0MDAwMDAsIDB4MDAwMDAwMTAsIDB4MjA0MDQwMTAsIDB4MDA0MDAwMDAsCisJMHgyMDAwNDAwMCwgMHgwMDQwNDAxMCwgMHgwMDQwMDAwMCwgMHgyMDAwMDAxMCwKKwkweDAwNDAwMDEwLCAweDIwMDA0MDAwLCAweDIwMDAwMDAwLCAweDAwMDA0MDEwLAorCTB4MDAwMDAwMDAsIDB4MDA0MDAwMTAsIDB4MjAwMDQwMTAsIDB4MDAwMDQwMDAsCisJMHgwMDQwNDAwMCwgMHgyMDAwNDAxMCwgMHgwMDAwMDAxMCwgMHgyMDQwMDAxMCwKKwkweDIwNDAwMDEwLCAweDAwMDAwMDAwLCAweDAwNDA0MDEwLCAweDIwNDA0MDAwLAorCTB4MDAwMDQwMTAsIDB4MDA0MDQwMDAsIDB4MjA0MDQwMDAsIDB4MjAwMDAwMDAsCisJMHgyMDAwNDAwMCwgMHgwMDAwMDAxMCwgMHgyMDQwMDAxMCwgMHgwMDQwNDAwMCwKKwkweDIwNDA0MDEwLCAweDAwNDAwMDAwLCAweDAwMDA0MDEwLCAweDIwMDAwMDEwLAorCTB4MDA0MDAwMDAsIDB4MjAwMDQwMDAsIDB4MjAwMDAwMDAsIDB4MDAwMDQwMTAsCisJMHgyMDAwMDAxMCwgMHgyMDQwNDAxMCwgMHgwMDQwNDAwMCwgMHgyMDQwMDAwMCwKKwkweDAwNDA0MDEwLCAweDIwNDA0MDAwLCAweDAwMDAwMDAwLCAweDIwNDAwMDEwLAorCTB4MDAwMDAwMTAsIDB4MDAwMDQwMDAsIDB4MjA0MDAwMDAsIDB4MDA0MDQwMTAsCisJMHgwMDAwNDAwMCwgMHgwMDQwMDAxMCwgMHgyMDAwNDAxMCwgMHgwMDAwMDAwMCwKKwkweDIwNDA0MDAwLCAweDIwMDAwMDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM3WzY0XSA9IHsKKwkweDAwMjAwMDAwLCAweDA0MjAwMDAyLCAweDA0MDAwODAyLCAweDAwMDAwMDAwLAorCTB4MDAwMDA4MDAsIDB4MDQwMDA4MDIsIDB4MDAyMDA4MDIsIDB4MDQyMDA4MDAsCisJMHgwNDIwMDgwMiwgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNDAwMDAwMiwKKwkweDAwMDAwMDAyLCAweDA0MDAwMDAwLCAweDA0MjAwMDAyLCAweDAwMDAwODAyLAorCTB4MDQwMDA4MDAsIDB4MDAyMDA4MDIsIDB4MDAyMDAwMDIsIDB4MDQwMDA4MDAsCisJMHgwNDAwMDAwMiwgMHgwNDIwMDAwMCwgMHgwNDIwMDgwMCwgMHgwMDIwMDAwMiwKKwkweDA0MjAwMDAwLCAweDAwMDAwODAwLCAweDAwMDAwODAyLCAweDA0MjAwODAyLAorCTB4MDAyMDA4MDAsIDB4MDAwMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDAyMDA4MDAsCisJMHgwNDAwMDAwMCwgMHgwMDIwMDgwMCwgMHgwMDIwMDAwMCwgMHgwNDAwMDgwMiwKKwkweDA0MDAwODAyLCAweDA0MjAwMDAyLCAweDA0MjAwMDAyLCAweDAwMDAwMDAyLAorCTB4MDAyMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDQwMDA4MDAsIDB4MDAyMDAwMDAsCisJMHgwNDIwMDgwMCwgMHgwMDAwMDgwMiwgMHgwMDIwMDgwMiwgMHgwNDIwMDgwMCwKKwkweDAwMDAwODAyLCAweDA0MDAwMDAyLCAweDA0MjAwODAyLCAweDA0MjAwMDAwLAorCTB4MDAyMDA4MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDQyMDA4MDIsCisJMHgwMDAwMDAwMCwgMHgwMDIwMDgwMiwgMHgwNDIwMDAwMCwgMHgwMDAwMDgwMCwKKwkweDA0MDAwMDAyLCAweDA0MDAwODAwLCAweDAwMDAwODAwLCAweDAwMjAwMDAyCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM4WzY0XSA9IHsKKwkweDEwMDAxMDQwLCAweDAwMDAxMDAwLCAweDAwMDQwMDAwLCAweDEwMDQxMDQwLAorCTB4MTAwMDAwMDAsIDB4MTAwMDEwNDAsIDB4MDAwMDAwNDAsIDB4MTAwMDAwMDAsCisJMHgwMDA0MDA0MCwgMHgxMDA0MDAwMCwgMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwKKwkweDEwMDQxMDAwLCAweDAwMDQxMDQwLCAweDAwMDAxMDAwLCAweDAwMDAwMDQwLAorCTB4MTAwNDAwMDAsIDB4MTAwMDAwNDAsIDB4MTAwMDEwMDAsIDB4MDAwMDEwNDAsCisJMHgwMDA0MTAwMCwgMHgwMDA0MDA0MCwgMHgxMDA0MDA0MCwgMHgxMDA0MTAwMCwKKwkweDAwMDAxMDQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDEwMDQwMDQwLAorCTB4MTAwMDAwNDAsIDB4MTAwMDEwMDAsIDB4MDAwNDEwNDAsIDB4MDAwNDAwMDAsCisJMHgwMDA0MTA0MCwgMHgwMDA0MDAwMCwgMHgxMDA0MTAwMCwgMHgwMDAwMTAwMCwKKwkweDAwMDAwMDQwLCAweDEwMDQwMDQwLCAweDAwMDAxMDAwLCAweDAwMDQxMDQwLAorCTB4MTAwMDEwMDAsIDB4MDAwMDAwNDAsIDB4MTAwMDAwNDAsIDB4MTAwNDAwMDAsCisJMHgxMDA0MDA0MCwgMHgxMDAwMDAwMCwgMHgwMDA0MDAwMCwgMHgxMDAwMTA0MCwKKwkweDAwMDAwMDAwLCAweDEwMDQxMDQwLCAweDAwMDQwMDQwLCAweDEwMDAwMDQwLAorCTB4MTAwNDAwMDAsIDB4MTAwMDEwMDAsIDB4MTAwMDEwNDAsIDB4MDAwMDAwMDAsCisJMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwgMHgwMDA0MTAwMCwgMHgwMDAwMTA0MCwKKwkweDAwMDAxMDQwLCAweDAwMDQwMDQwLCAweDEwMDAwMDAwLCAweDEwMDQxMDAwCit9OworCisvKiBFbmNyeXB0aW9uIGNvbXBvbmVudHM6IElQLCBGUCwgYW5kIHJvdW5kIGZ1bmN0aW9uICovCisKKyNkZWZpbmUgSVAoTCwgUiwgVCkJCVwKKwlST0woUiwgNCk7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmMGYwZjBmMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST0woUiwgMTIpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZmZmZjAwMDA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDE0KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGNjY2NjY2NjOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCA2KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGZmMDBmZjAwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPUihSLCA3KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGFhYWFhYWFhOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChMLCAxKTsKKworI2RlZmluZSBGUChMLCBSLCBUKQkJXAorCVJPUihMLCAxKTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGFhYWFhYWFhOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCA3KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGZmMDBmZjAwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPUihSLCA2KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGNjY2NjY2NjOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCAxNCk7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmZmZmMDAwMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST1IoUiwgMTIpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZjBmMGYwZjA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDQpOworCisjZGVmaW5lIFJPVU5EKEwsIFIsIEEsIEIsIEssIGQpCQkJCQlcCisJQiA9IEtbMF07CQkJQSA9IEtbMV07CUsgKz0gZDsJXAorCUIgXj0gUjsJCQkJQSBePSBSOwkJCVwKKwlCICY9IDB4M2YzZjNmM2Y7CQlST1IoQSwgNCk7CQlcCisJTCBePSBTOFsweGZmICYgQl07CQlBICY9IDB4M2YzZjNmM2Y7CVwKKwlMIF49IFM2WzB4ZmYgJiAoQiA+PiA4KV07CUIgPj49IDE2OwkJXAorCUwgXj0gUzdbMHhmZiAmIEFdOwkJCQkJXAorCUwgXj0gUzVbMHhmZiAmIChBID4+IDgpXTsJQSA+Pj0gMTY7CQlcCisJTCBePSBTNFsweGZmICYgQl07CQkJCQlcCisJTCBePSBTMlsweGZmICYgKEIgPj4gOCldOwkJCQlcCisJTCBePSBTM1sweGZmICYgQV07CQkJCQlcCisJTCBePSBTMVsweGZmICYgKEEgPj4gOCldOworCisvKgorICogUEMyIGxvb2t1cCB0YWJsZXMgYXJlIG9yZ2FuaXplZCBhcyAyIGNvbnNlY3V0aXZlIHNldHMgb2YgNCBpbnRlcmxlYXZlZAorICogdGFibGVzIG9mIDEyOCBlbGVtZW50cy4gIE9uZSBzZXQgaXMgZm9yIENfaSBhbmQgdGhlIG90aGVyIGZvciBEX2ksIHdoaWxlCisgKiB0aGUgNCBpbnRlcmxlYXZlZCB0YWJsZXMgY29ycmVzcG9uZCB0byBmb3VyIDctYml0IHN1YnNldHMgb2YgQ19pIG9yIERfaS4KKyAqCisgKiBBZnRlciBQQzEgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGEsYixjLGQgY29udGFpbnMgYSA3IGJpdCBzdWJzZXQgb2YgQ19pCisgKiBvciBEX2kgaW4gYml0cyA3LTEgKGJpdCAwIGJlaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCkuCisgKi8KKworI2RlZmluZSBUMSh4KSBwdFsyICogKHgpICsgMF0KKyNkZWZpbmUgVDIoeCkgcHRbMiAqICh4KSArIDFdCisjZGVmaW5lIFQzKHgpIHB0WzIgKiAoeCkgKyAyXQorI2RlZmluZSBUNCh4KSBwdFsyICogKHgpICsgM10KKworI2RlZmluZSBQQzIoYSwgYiwgYywgZCkgKFQ0KGQpIHwgVDMoYykgfCBUMihiKSB8IFQxKGEpKQorCisvKgorICogRW5jcnlwdGlvbiBrZXkgZXhwYW5zaW9uCisgKgorICogUkZDMjQ1MTogV2VhayBrZXkgY2hlY2tzIFNIT1VMRCBiZSBwZXJmb3JtZWQuCisgKgorICogRklQUyA3NDoKKyAqCisgKiAgIEtleXMgaGF2aW5nIGR1YWxzIGFyZSBrZXlzIHdoaWNoIHByb2R1Y2UgYWxsIHplcm9zLCBhbGwgb25lcywgb3IKKyAqICAgYWx0ZXJuYXRpbmcgemVyby1vbmUgcGF0dGVybnMgaW4gdGhlIEMgYW5kIEQgcmVnaXN0ZXJzIGFmdGVyIFBlcm11dGVkCisgKiAgIENob2ljZSAxIGhhcyBvcGVyYXRlZCBvbiB0aGUga2V5LgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWtleSh1MzIgKnBlLCBjb25zdCB1OCAqaykKIHsKLQl1MzIgeCwgeSwgejsKLQkKLQl4ICA9IHNyY1s3XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzZdOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNV07Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s0XTsKLQl5ICA9IHNyY1szXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzJdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMV07Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1swXTsKLQl6ICA9ICgoeCA+PiAwMDQpIF4geSkgJiAweDBGMEYwRjBGTDsKLQl4IF49IHogPDwgMDA0OwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMjApIF4geCkgJiAweDAwMDBGRkZGTDsKLQl5IF49IHogPDwgMDIwOwotCXggXj0gejsKLQl6ICA9ICgoeCA+PiAwMDIpIF4geSkgJiAweDMzMzMzMzMzTDsKLQl4IF49IHogPDwgMDAyOwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMTApIF4geCkgJiAweDAwRkYwMEZGTDsKLQl5IF49IHogPDwgMDEwOwotCXggXj0gejsKLQl4ICA9IHggPj4gMSB8IHggPDwgMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPj4gMSB8IHkgPDwgMzE7Ci0JeiAgPSBleHBrZXlbMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzJdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzNdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs0XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs1XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbN107Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzhdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzldOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTNdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTVdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTddOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxOF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTldOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjFdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjNdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjVdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjddOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyOF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjldOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVszMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMzFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl4ICA9IHggPDwgMSB8IHggPj4gMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPDwgMSB8IHkgPj4gMzE7Ci0JeiAgPSAoKHggPj4gMDEwKSBeIHkpICYgMHgwMEZGMDBGRkw7Ci0JeCBePSB6IDw8IDAxMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDAyKSBeIHgpICYgMHgzMzMzMzMzM0w7Ci0JeSBePSB6IDw8IDAwMjsKLQl4IF49IHo7Ci0JeiAgPSAoKHggPj4gMDIwKSBeIHkpICYgMHgwMDAwRkZGRkw7Ci0JeCBePSB6IDw8IDAyMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDA0KSBeIHgpICYgMHgwRjBGMEYwRkw7Ci0JeSBePSB6IDw8IDAwNDsKLQl4IF49IHo7Ci0JZHN0WzBdID0geDsKLQl4ID4+PSA4OwotCWRzdFsxXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbMl0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzNdID0geDsKLQlkc3RbNF0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzVdID0geTsKLQl5ID4+PSA4OwotCWRzdFs2XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbN10gPSB5OwotfQorCS8qIEsmUjogbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzICovCisJdW5zaWduZWQgbG9uZyBhLCBiLCBjLCBkLCB3OworCWNvbnN0IHUzMiAqcHQgPSBwYzI7CiAKLXN0YXRpYyB2b2lkIGRlc19zbWFsbF9maXBzX2RlY3J5cHQodTMyICpleHBrZXksIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17Ci0JdTMyIHgsIHksIHo7Ci0JCi0JeCAgPSBzcmNbN107Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s2XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzVdOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNF07Ci0JeSAgPSBzcmNbM107Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1syXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzFdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMF07Ci0JeiAgPSAoKHggPj4gMDA0KSBeIHkpICYgMHgwRjBGMEYwRkw7Ci0JeCBePSB6IDw8IDAwNDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDIwKSBeIHgpICYgMHgwMDAwRkZGRkw7Ci0JeSBePSB6IDw8IDAyMDsKLQl4IF49IHo7Ci0JeiAgPSAoKHggPj4gMDAyKSBeIHkpICYgMHgzMzMzMzMzM0w7Ci0JeCBePSB6IDw8IDAwMjsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDEwKSBeIHgpICYgMHgwMEZGMDBGRkw7Ci0JeSBePSB6IDw8IDAxMDsKLQl4IF49IHo7Ci0JeCAgPSB4ID4+IDEgfCB4IDw8IDMxOwotCXogID0gKHggXiB5KSAmIDB4NTU1NTU1NTVMOwotCXkgXj0gejsKLQl4IF49IHo7Ci0JeSAgPSB5ID4+IDEgfCB5IDw8IDMxOwotCXogID0gZXhwa2V5WzMxXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMzBdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI5XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjhdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI3XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjZdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI1XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjRdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIzXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjJdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIxXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjBdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE5XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMThdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE3XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTZdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE1XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTRdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzEzXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTJdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzExXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTBdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzldOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs4XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs3XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzRdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzNdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyXTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeCAgPSB4IDw8IDEgfCB4ID4+IDMxOwotCXogID0gKHggXiB5KSAmIDB4NTU1NTU1NTVMOwotCXkgXj0gejsKLQl4IF49IHo7Ci0JeSAgPSB5IDw8IDEgfCB5ID4+IDMxOwotCXogID0gKCh4ID4+IDAxMCkgXiB5KSAmIDB4MDBGRjAwRkZMOwotCXggXj0geiA8PCAwMTA7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAwMikgXiB4KSAmIDB4MzMzMzMzMzNMOwotCXkgXj0geiA8PCAwMDI7Ci0JeCBePSB6OwotCXogID0gKCh4ID4+IDAyMCkgXiB5KSAmIDB4MDAwMEZGRkZMOwotCXggXj0geiA8PCAwMjA7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAwNCkgXiB4KSAmIDB4MEYwRjBGMEZMOwotCXkgXj0geiA8PCAwMDQ7Ci0JeCBePSB6OwotCWRzdFswXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbMV0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzJdID0geDsKLQl4ID4+PSA4OwotCWRzdFszXSA9IHg7Ci0JZHN0WzRdID0geTsKLQl5ID4+PSA4OwotCWRzdFs1XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbNl0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzddID0geTsKKwlkID0ga1s0XTsgZCAmPSAweDBlOyBkIDw8PSA0OyBkIHw9IGtbMF0gJiAweDFlOyBkID0gcGMxW2RdOworCWMgPSBrWzVdOyBjICY9IDB4MGU7IGMgPDw9IDQ7IGMgfD0ga1sxXSAmIDB4MWU7IGMgPSBwYzFbY107CisJYiA9IGtbNl07IGIgJj0gMHgwZTsgYiA8PD0gNDsgYiB8PSBrWzJdICYgMHgxZTsgYiA9IHBjMVtiXTsKKwlhID0ga1s3XTsgYSAmPSAweDBlOyBhIDw8PSA0OyBhIHw9IGtbM10gJiAweDFlOyBhID0gcGMxW2FdOworCisJcGVbMTUgKiAyICsgMF0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsxNCAqIDIgKyAwXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbMTMgKiAyICsgMF0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWzEyICogMiArIDBdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsxMSAqIDIgKyAwXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbMTAgKiAyICsgMF0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA5ICogMiArIDBdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgOCAqIDIgKyAwXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA3ICogMiArIDBdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgNiAqIDIgKyAwXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDUgKiAyICsgMF0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA0ICogMiArIDBdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgMyAqIDIgKyAwXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDIgKiAyICsgMF0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyAxICogMiArIDBdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07CisJcGVbIDAgKiAyICsgMF0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBDaGVjayBpZiBmaXJzdCBoYWxmIGlzIHdlYWsgKi8KKwl3ICA9IChhIF4gYykgfCAoYiBeIGQpIHwgKHJzW2FdIF4gYykgfCAoYiBeIHJzW2RdKTsKKworCS8qIFNraXAgdG8gbmV4dCB0YWJsZSBzZXQgKi8KKwlwdCArPSA1MTI7CisKKwlkID0ga1swXTsgZCAmPSAweGUwOyBkID4+PSA0OyBkIHw9IGtbNF0gJiAweGYwOyBkID0gcGMxW2QgKyAxXTsKKwljID0ga1sxXTsgYyAmPSAweGUwOyBjID4+PSA0OyBjIHw9IGtbNV0gJiAweGYwOyBjID0gcGMxW2MgKyAxXTsKKwliID0ga1syXTsgYiAmPSAweGUwOyBiID4+PSA0OyBiIHw9IGtbNl0gJiAweGYwOyBiID0gcGMxW2IgKyAxXTsKKwlhID0ga1szXTsgYSAmPSAweGUwOyBhID4+PSA0OyBhIHw9IGtbN10gJiAweGYwOyBhID0gcGMxW2EgKyAxXTsKKworCS8qIENoZWNrIGlmIHNlY29uZCBoYWxmIGlzIHdlYWsgKi8KKwl3IHw9IChhIF4gYykgfCAoYiBeIGQpIHwgKHJzW2FdIF4gYykgfCAoYiBeIHJzW2RdKTsKKworCXBlWzE1ICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07CisJcGVbMTQgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWzEzICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsxMiAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbMTEgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWzEwICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgOSAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDggKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsKKwlwZVsgNyAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDYgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyA1ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgNCAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDMgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyAyICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgMSAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOworCXBlWyAwICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOworCisJLyogRml4dXA6IDI0MTMgNTc2OCAtPiAxMzU3IDI0NjggKi8KKwlmb3IgKGQgPSAwOyBkIDwgMTY7ICsrZCkgeworCQlhID0gcGVbMiAqIGRdOworCQliID0gcGVbMiAqIGQgKyAxXTsKKwkJYyA9IGEgXiBiOworCQljICY9IDB4ZmZmZjAwMDA7CisJCWEgXj0gYzsKKwkJYiBePSBjOworCQlST0woYiwgMTgpOworCQlwZVsyICogZF0gPSBhOworCQlwZVsyICogZCArIDFdID0gYjsKKwl9CisKKwkvKiBaZXJvIGlmIHdlYWsga2V5ICovCisJcmV0dXJuIHc7CiB9CiAKIC8qCi0gKiBSRkMyNDUxOiBXZWFrIGtleSBjaGVja3MgU0hPVUxEIGJlIHBlcmZvcm1lZC4KKyAqIERlY3J5cHRpb24ga2V5IGV4cGFuc2lvbgorICoKKyAqIE5vIHdlYWsga2V5IGNoZWNraW5nIGlzIHBlcmZvcm1lZCwgYXMgdGhpcyBpcyBvbmx5IHVzZWQgYnkgdHJpcGxlIERFUworICoKICAqLwotc3RhdGljIGludCBzZXRrZXkodTMyICpleHBrZXksIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgdm9pZCBka2V5KHUzMiAqcGUsIGNvbnN0IHU4ICprKQogewotCWNvbnN0IHU4ICprOwotCXU4ICpiMCwgKmIxOwotCXUzMiBuLCB3OwotCXU4IGJpdHMwWzU2XSwgYml0czFbNTZdOworCS8qIEsmUjogbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzICovCisJdW5zaWduZWQgbG9uZyBhLCBiLCBjLCBkOworCWNvbnN0IHUzMiAqcHQgPSBwYzI7CiAKLQluICA9IHBhcml0eVtrZXlbMF1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVsxXV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzJdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbM11dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVs0XV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzVdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbNl1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVs3XV07Ci0JdyA9IDB4ODg4ODg4ODhMOwotCQotCWlmICgoKmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpCi0JICAgICYmICEoKG4gLSAodyA+PiAzKSkgJiB3KSkgeyAgLyogMSBpbiAxMF4xMCBrZXlzIHBhc3NlcyB0aGlzIHRlc3QgKi8KLQkJaWYgKG4gPCAweDQxNDE1MTUxKSB7Ci0JCQlpZiAobiA8IDB4MzEzMTIxMjEpIHsKLQkJCQlpZiAobiA8IDB4MTQxNDE1MTUpIHsKLQkJCQkJLyogMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHgxMTExMTExMSkgZ290byB3ZWFrOwotCQkJCQkvKiAwMSAxRiAwMSAxRiAwMSAwRSAwMSAwRSAqLwotCQkJCQlpZiAobiA9PSAweDEzMTMxMjEyKSBnb3RvIHdlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogMDEgRTAgMDEgRTAgMDEgRjEgMDEgRjEgKi8KLQkJCQkJaWYgKG4gPT0gMHgxNDE0MTUxNSkgZ290byB3ZWFrOwotCQkJCQkvKiAwMSBGRSAwMSBGRSAwMSBGRSAwMSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDE2MTYxNjE2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobiA8IDB4MzQzNDI1MjUpIHsKLQkJCQkJLyogMUYgMDEgMUYgMDEgMEUgMDEgMEUgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHgzMTMxMjEyMSkgZ290byB3ZWFrOwotCQkJCQkvKiAxRiAxRiAxRiAxRiAwRSAwRSAwRSAwRSAoPykgKi8KLQkJCQkJaWYgKG4gPT0gMHgzMzMzMjIyMikgZ290byB3ZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIDFGIEUwIDFGIEUwIDBFIEYxIDBFIEYxICovCi0JCQkJCWlmIChuID09IDB4MzQzNDI1MjUpIGdvdG8gd2VhazsKLQkJCQkJLyogMUYgRkUgMUYgRkUgMEUgRkUgMEUgRkUgKi8KLQkJCQkJaWYgKG4gPT0gMHgzNjM2MjYyNikgZ290byB3ZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChuIDwgMHg2MTYxNjE2MSkgewotCQkJCWlmIChuIDwgMHg0NDQ0NTU1NSkgewotCQkJCQkvKiBFMCAwMSBFMCAwMSBGMSAwMSBGMSAwMSAqLwotCQkJCQlpZiAobiA9PSAweDQxNDE1MTUxKSBnb3RvIHdlYWs7Ci0JCQkJCS8qIEUwIDFGIEUwIDFGIEYxIDBFIEYxIDBFICovCi0JCQkJCWlmIChuID09IDB4NDM0MzUyNTIpIGdvdG8gd2VhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBFMCBFMCBFMCBFMCBGMSBGMSBGMSBGMSAoPykgKi8KLQkJCQkJaWYgKG4gPT0gMHg0NDQ0NTU1NSkgZ290byB3ZWFrOwotCQkJCQkvKiBFMCBGRSBFMCBGRSBGMSBGRSBGMSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDQ2NDY1NjU2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobiA8IDB4NjQ2NDY1NjUpIHsKLQkJCQkJLyogRkUgMDEgRkUgMDEgRkUgMDEgRkUgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHg2MTYxNjE2MSkgZ290byB3ZWFrOwotCQkJCQkvKiBGRSAxRiBGRSAxRiBGRSAwRSBGRSAwRSAqLwotCQkJCQlpZiAobiA9PSAweDYzNjM2MjYyKSBnb3RvIHdlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRkUgRTAgRkUgRTAgRkUgRjEgRkUgRjEgKi8KLQkJCQkJaWYgKG4gPT0gMHg2NDY0NjU2NSkgZ290byB3ZWFrOwotCQkJCQkvKiBGRSBGRSBGRSBGRSBGRSBGRSBGRSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDY2NjY2NjY2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCWdvdG8gbm90X3dlYWs7Ci13ZWFrOgotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7Ci0JCXJldHVybiAtRUlOVkFMOworCWQgPSBrWzRdOyBkICY9IDB4MGU7IGQgPDw9IDQ7IGQgfD0ga1swXSAmIDB4MWU7IGQgPSBwYzFbZF07CisJYyA9IGtbNV07IGMgJj0gMHgwZTsgYyA8PD0gNDsgYyB8PSBrWzFdICYgMHgxZTsgYyA9IHBjMVtjXTsKKwliID0ga1s2XTsgYiAmPSAweDBlOyBiIDw8PSA0OyBiIHw9IGtbMl0gJiAweDFlOyBiID0gcGMxW2JdOworCWEgPSBrWzddOyBhICY9IDB4MGU7IGEgPDw9IDQ7IGEgfD0ga1szXSAmIDB4MWU7IGEgPSBwYzFbYV07CisKKwlwZVsgMCAqIDJdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07CisJcGVbIDEgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDIgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDMgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDQgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDUgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDYgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDcgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA4ICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA5ICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzEwICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzExICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzEyICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzEzICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzE0ICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsKKwlwZVsxNSAqIDJdID0gUEMyKGIsIGMsIGQsIGEpOworCisJLyogU2tpcCB0byBuZXh0IHRhYmxlIHNldCAqLworCXB0ICs9IDUxMjsKKworCWQgPSBrWzBdOyBkICY9IDB4ZTA7IGQgPj49IDQ7IGQgfD0ga1s0XSAmIDB4ZjA7IGQgPSBwYzFbZCArIDFdOworCWMgPSBrWzFdOyBjICY9IDB4ZTA7IGMgPj49IDQ7IGMgfD0ga1s1XSAmIDB4ZjA7IGMgPSBwYzFbYyArIDFdOworCWIgPSBrWzJdOyBiICY9IDB4ZTA7IGIgPj49IDQ7IGIgfD0ga1s2XSAmIDB4ZjA7IGIgPSBwYzFbYiArIDFdOworCWEgPSBrWzNdOyBhICY9IDB4ZTA7IGEgPj49IDQ7IGEgfD0ga1s3XSAmIDB4ZjA7IGEgPSBwYzFbYSArIDFdOworCisJcGVbIDAgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsgMSAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDIgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWyAzICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgNCAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDUgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA2ICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgNyAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA4ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgOSAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTAgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzExICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsxMiAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbMTMgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzE0ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07CisJcGVbMTUgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBGaXh1cDogMjQxMyA1NzY4IC0+IDEzNTcgMjQ2OCAqLworCWZvciAoZCA9IDA7IGQgPCAxNjsgKytkKSB7CisJCWEgPSBwZVsyICogZF07CisJCWIgPSBwZVsyICogZCArIDFdOworCQljID0gYSBeIGI7CisJCWMgJj0gMHhmZmZmMDAwMDsKKwkJYSBePSBjOworCQliIF49IGM7CisJCVJPTChiLCAxOCk7CisJCXBlWzIgKiBkXSA9IGE7CisJCXBlWzIgKiBkICsgMV0gPSBiOwogCX0KLQotbm90X3dlYWs6Ci0KLQkvKiBleHBsb2RlIHRoZSBiaXRzICovCi0JbiA9IDU2OwotCWIwID0gYml0czA7Ci0JYjEgPSBiaXRzMTsKLQkKLQlkbyB7Ci0JCXcgPSAoMjU2IHwgKmtleSsrKSA8PCAyOwotCQlkbyB7Ci0JCQktLW47Ci0JCQliMVtuXSA9IDggJiB3OwotCQkJdyA+Pj0gMTsKLQkJCWIwW25dID0gNCAmIHc7Ci0JCX0gd2hpbGUgKCB3ID49IDE2ICk7Ci0JfSB3aGlsZSAoIG4gKTsKLQkKLQkvKiBwdXQgdGhlIGJpdHMgaW4gdGhlIGNvcnJlY3QgcGxhY2VzICovCi0JbiA9IDE2OwotCWsgPSByb3RvcnM7Ci0JCi0JZG8gewotCQl3ICAgPSAoYjFba1sgMCAgIF1dIHwgYjBba1sgMSAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgMiAgIF1dIHwgYjBba1sgMyAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sgNCAgIF1dIHwgYjBba1sgNSAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sgNiAgIF1dIHwgYjBba1sgNyAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgOCAgIF1dIHwgYjBba1sgOSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxMCAgIF1dIHwgYjBba1sxMSAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxMiAgIF1dIHwgYjBba1sxMyAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sxNCAgIF1dIHwgYjBba1sxNSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxNiAgIF1dIHwgYjBba1sxNyAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxOCAgIF1dIHwgYjBba1sxOSAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1syMCAgIF1dIHwgYjBba1syMSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1syMiAgIF1dIHwgYjBba1syMyAgIF1dOwotCQlleHBrZXlbMF0gPSB3OwotCQkKLQkJdyAgID0gKGIxW2tbIDArMjRdXSB8IGIwW2tbIDErMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbIDIrMjRdXSB8IGIwW2tbIDMrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbIDQrMjRdXSB8IGIwW2tbIDUrMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbIDYrMjRdXSB8IGIwW2tbIDcrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbIDgrMjRdXSB8IGIwW2tbIDkrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMTArMjRdXSB8IGIwW2tbMTErMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbMTIrMjRdXSB8IGIwW2tbMTMrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbMTQrMjRdXSB8IGIwW2tbMTUrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMTYrMjRdXSB8IGIwW2tbMTcrMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbMTgrMjRdXSB8IGIwW2tbMTkrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbMjArMjRdXSB8IGIwW2tbMjErMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMjIrMjRdXSB8IGIwW2tbMjMrMjRdXTsKLQkJCi0JCVJPUih3LCA0LCAyOCk7ICAgICAgLyogY291bGQgYmUgZWxpbWluYXRlZCAqLwotCQlleHBrZXlbMV0gPSB3OwotCi0JCWsgKz0gNDg7Ci0JCWV4cGtleSArPSAyOwotCX0gd2hpbGUgKC0tbik7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkZXNfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKLQlyZXR1cm4gc2V0a2V5KCgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXksIGtleSwga2V5bGVuLCBmbGFncyk7CisJc3RydWN0IGRlc19jdHggKmRjdHggPSBjdHg7CisJdTMyIHRtcFtERVNfRVhQS0VZX1dPUkRTXTsKKwlpbnQgcmV0OworCisJLyogRXhwYW5kIHRvIHRtcCAqLworCXJldCA9IGVrZXkodG1wLCBrZXkpOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAwKSAmJiAoKmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpKSB7CisJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSB0byBvdXRwdXQgKi8KKwltZW1jcHkoZGN0eC0+ZXhwa2V5LCB0bXAsIHNpemVvZihkY3R4LT5leHBrZXkpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCgoKHN0cnVjdCBkZXNfY3R4ICopY3R4KS0+ZXhwa2V5LCBkc3QsIHNyYyk7CisJY29uc3QgdTMyICpLID0gKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleTsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAyKTsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJfQorCUZQKFIsIEwsIEEpOworCisJZFswXSA9IGNwdV90b19sZTMyKFIpOworCWRbMV0gPSBjcHVfdG9fbGUzMihMKTsKIH0KIAogc3RhdGljIHZvaWQgZGVzX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCWRlc19zbWFsbF9maXBzX2RlY3J5cHQoKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleSwgZHN0LCBzcmMpOworCWNvbnN0IHUzMiAqSyA9ICgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXkgKyBERVNfRVhQS0VZX1dPUkRTIC0gMjsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJCVJPVU5EKFIsIEwsIEEsIEIsIEssIC0yKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCi0vKiAKKy8qCiAgKiBSRkMyNDUxOgogICoKICAqICAgRm9yIERFUy1FREUzLCB0aGVyZSBpcyBubyBrbm93biBuZWVkIHRvIHJlamVjdCB3ZWFrIG9yCkBAIC0xMTk5LDQ0ICs4NTksODYgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgZGVzM19lZGVfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCisJCQkgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogewotCXVuc2lnbmVkIGludCBpLCBvZmY7CisJY29uc3QgdTMyICpLID0gKGNvbnN0IHUzMiAqKWtleTsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCXUzMiAqZXhwa2V5ID0gZGN0eC0+ZXhwa2V5OwogCi0JaWYgKCEobWVtY21wKGtleSwgJmtleVtERVNfS0VZX1NJWkVdLCBERVNfS0VZX1NJWkUpICYmIAotCSAgICBtZW1jbXAoJmtleVtERVNfS0VZX1NJWkVdLCAma2V5W0RFU19LRVlfU0laRSAqIDJdLAotCSAgICAJCQkJCURFU19LRVlfU0laRSkpKSB7Ci0KKwlpZiAodW5saWtlbHkoISgoS1swXSBeIEtbMl0pIHwgKEtbMV0gXiBLWzNdKSkgfHwKKwkJICAgICAhKChLWzJdIF4gS1s0XSkgfCAoS1szXSBeIEtbNV0pKSkpCisJewogCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQotCWZvciAoaSA9IDAsIG9mZiA9IDA7IGkgPCAzOyBpKyssIG9mZiArPSBERVNfRVhQS0VZX1dPUkRTLAotCQkJCQkJCWtleSArPSBERVNfS0VZX1NJWkUpIHsKLQkJaW50IHJldCA9IHNldGtleSgmZGN0eC0+ZXhwa2V5W29mZl0sIGtleSwgREVTX0tFWV9TSVpFLCBmbGFncyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9CQorCisJZWtleShleHBrZXksIGtleSk7IGV4cGtleSArPSBERVNfRVhQS0VZX1dPUkRTOyBrZXkgKz0gREVTX0tFWV9TSVpFOworCWRrZXkoZXhwa2V5LCBrZXkpOyBleHBrZXkgKz0gREVTX0VYUEtFWV9XT1JEUzsga2V5ICs9IERFU19LRVlfU0laRTsKKwlla2V5KGV4cGtleSwga2V5KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2VkZV9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OwotCQotCWRlc19zbWFsbF9maXBzX2VuY3J5cHQoZGN0eC0+ZXhwa2V5LCBkc3QsIHNyYyk7Ci0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFNdLCBkc3QsIGRzdCk7Ci0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFMgKiAyXSwgZHN0LCBkc3QpOworCWNvbnN0IHUzMiAqSyA9IGRjdHgtPmV4cGtleTsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAyKTsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAyKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2VkZV9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCWNvbnN0IHUzMiAqSyA9IGRjdHgtPmV4cGtleSArIERFUzNfRURFX0VYUEtFWV9XT1JEUyAtIDI7CisJY29uc3QgX19sZTMyICpzID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKKwlfX2xlMzIgKmQgPSAoX19sZTMyICopZHN0OworCXUzMiBMLCBSLCBBLCBCOworCWludCBpOwogCi0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFMgKiAyXSwgZHN0LCBzcmMpOwotCWRlc19zbWFsbF9maXBzX2VuY3J5cHQoJmRjdHgtPmV4cGtleVtERVNfRVhQS0VZX1dPUkRTXSwgZHN0LCBkc3QpOwotCWRlc19zbWFsbF9maXBzX2RlY3J5cHQoZGN0eC0+ZXhwa2V5LCBkc3QsIGRzdCk7CisJTCA9IGxlMzJfdG9fY3B1KHNbMF0pOworCVIgPSBsZTMyX3RvX2NwdShzWzFdKTsKKworCUlQKEwsIFIsIEEpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgLTIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAtMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgLTIpOworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgLTIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAtMik7CisJfQorCUZQKFIsIEwsIEEpOworCisJZFswXSA9IGNwdV90b19sZTMyKFIpOworCWRbMV0gPSBjcHVfdG9fbGUzMihMKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlc19hbGcgPSB7CkBAIC0xMjQ5LDcgKzk1MSw3IEBACiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CiAJLmNpYV9taW5fa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKIAkuY2lhX21heF9rZXlzaXplCT0JREVTX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CQk9IAlkZXNfc2V0a2V5LAorCS5jaWFfc2V0a2V5CQk9CWRlc19zZXRrZXksCiAJLmNpYV9lbmNyeXB0CQk9CWRlc19lbmNyeXB0LAogCS5jaWFfZGVjcnlwdAkJPQlkZXNfZGVjcnlwdCB9IH0KIH07CkBAIC0xMjY0LDkgKzk2Niw5IEBACiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CiAJLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfRURFX0tFWV9TSVpFLAogCS5jaWFfbWF4X2tleXNpemUJPQlERVMzX0VERV9LRVlfU0laRSwKLQkuY2lhX3NldGtleQkgICAJPSAJZGVzM19lZGVfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkgCT0JZGVzM19lZGVfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQJICAJPQlkZXMzX2VkZV9kZWNyeXB0IH0gfQorCS5jaWFfc2V0a2V5CQk9CWRlczNfZWRlX3NldGtleSwKKwkuY2lhX2VuY3J5cHQJCT0JZGVzM19lZGVfZW5jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JZGVzM19lZGVfZGVjcnlwdCB9IH0KIH07CiAKIE1PRFVMRV9BTElBUygiZGVzM19lZGUiKTsKQEAgLTEyNzQsNyArOTc2LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKIAlpbnQgcmV0ID0gMDsKLQkKKwogCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKQEAgLTEyODIsNyArOTg0LDcgQEAKIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzX2VkZV9hbGcpOwogCWlmIChyZXQgPCAwKQogCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOwotb3V0OgkKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjk3LDMgKzk5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiREVTICYgVHJpcGxlIERFUyBFREUgQ2lwaGVyIEFsZ29yaXRobXMiKTsKK01PRFVMRV9BVVRIT1IoIkRhZyBBcm5lIE9zdmlrIDxkYUBvc3Zpay5ubz4iKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9obWFjLmMgYi9jcnlwdG8vaG1hYy5jCmluZGV4IDg0N2RmOTIuLmRhMDQ1NmIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9obWFjLmMKKysrIGIvY3J5cHRvL2htYWMuYwpAQCAtNDksOCArNDksNyBAQAogCiB2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9obWFjX2Jsb2NrKQotCQlrZnJlZSh0Zm0tPmNydF9kaWdlc3QuZGl0X2htYWNfYmxvY2spOworCWtmcmVlKHRmbS0+Y3J0X2RpZ2VzdC5kaXRfaG1hY19ibG9jayk7CiB9CiAKIHZvaWQgY3J5cHRvX2htYWNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbikKZGlmZiAtLWdpdCBhL2NyeXB0by9pbnRlcm5hbC5oIGIvY3J5cHRvL2ludGVybmFsLmgKaW5kZXggOTY0YjlhNi4uMzc1MTViZSAxMDA2NDQKLS0tIGEvY3J5cHRvL2ludGVybmFsLmgKKysrIGIvY3J5cHRvL2ludGVybmFsLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogCiBleHRlcm4gZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdOwpAQCAtNDIsMjAgKzQyLDYgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gKHZvaWQgKikmdGZtWzFdOwotfQotCi1zdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0Ci0gKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShjcnlwdG9fYWxnX2xvb2t1cChuYW1lKSwgbmFtZSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKQEAgLTc2LDYgKzYyLDMzIEBACiB7IH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fZGlnZXN0X2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKKwkJCQkJCSBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAorCQkJCQkJIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gYWxnLT5jcmFfY3R4c2l6ZTsKKwkKKwlzd2l0Y2ggKGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0spIHsKKwljYXNlIENSWVBUT19URk1fTU9ERV9DQkM6CisJCWxlbiA9IEFMSUdOKGxlbiwgKHVuc2lnbmVkIGxvbmcpYWxnLT5jcmFfYWxpZ25tYXNrICsgMSk7CisJCWxlbiArPSBhbGctPmNyYV9ibG9ja3NpemU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jb21wcmVzc19jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCisJCQkJCQkgICBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7Cit9CisKIGludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKIGludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKIGludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NjYXR0ZXJ3YWxrLmMgYi9jcnlwdG8vc2NhdHRlcndhbGsuYwppbmRleCA1MGM5NDYxLi40N2FjOTBlIDEwMDY0NAotLS0gYS9jcnlwdG8vc2NhdHRlcndhbGsuYworKysgYi9jcnlwdG8vc2NhdHRlcndhbGsuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiBpbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCiAJCQkgICBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KQogewotCWRvIHsKKwl3aGlsZSAobmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSkgewogCQltZW1jcHlfZGlyKGJ1Ziwgd2Fsay0+ZGF0YSwgd2Fsay0+bGVuX3RoaXNfcGFnZSwgb3V0KTsKIAkJYnVmICs9IHdhbGstPmxlbl90aGlzX3BhZ2U7CiAJCW5ieXRlcyAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCXNjYXR0ZXJ3YWxrX3VubWFwKHdhbGssIG91dCk7CiAJCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgMSk7CiAJCXNjYXR0ZXJ3YWxrX21hcCh3YWxrLCBvdXQpOwotCX0gd2hpbGUgKG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UpOworCX0KIAogCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCBuYnl0ZXMsIG91dCk7CiAJcmV0dXJuIG5ieXRlczsKZGlmZiAtLWdpdCBhL2NyeXB0by9zY2F0dGVyd2Fsay5oIGIvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKaW5kZXggMDJhYTU2Yy4uZTc5OTI1YyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKKysrIGIvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogCSAgICAgICB3YWxrX2luLT5vZmZzZXQgPT0gd2Fsa19vdXQtPm9mZnNldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCi0JCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2F0dGVyd2Fsa19jbGFtcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2U7CisJcmV0dXJuIG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UgPyB3YWxrLT5sZW5fdGhpc19wYWdlIDogbmJ5dGVzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NhdHRlcndhbGtfYWR2YW5jZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLApAQCAtNTUsNiArNTUsMTIgQEAKIAl3YWxrLT5sZW5fdGhpc19zZWdtZW50IC09IG5ieXRlczsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2NhdHRlcndhbGtfYWxpZ25lZChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGFsaWdubWFzaykKK3sKKwlyZXR1cm4gISh3YWxrLT5vZmZzZXQgJiBhbGlnbm1hc2spOworfQorCiB2b2lkIHNjYXR0ZXJ3YWxrX3N0YXJ0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOwogaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KTsKIHZvaWQgc2NhdHRlcndhbGtfbWFwKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NlcnBlbnQuYyBiL2NyeXB0by9zZXJwZW50LmMKaW5kZXggN2QxNTJlOC4uM2NmMmM1MCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NlcnBlbnQuYworKysgYi9jcnlwdG8vc2VycGVudC5jCkBAIC0yMTAsNyArMjEwLDYgQEAKIAl4NCBePSB4MjsKIAogc3RydWN0IHNlcnBlbnRfY3R4IHsKLQl1OCBpdltTRVJQRU5UX0JMT0NLX1NJWkVdOwogCXUzMiBleHBrZXlbU0VSUEVOVF9FWFBLRVlfV09SRFNdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IGFlZDRhOWIuLmNlY2FiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTI4LDcgKzI4LDcgQEAKIAogc291cmNlICJkcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgogCkBAIC00NCw2ICs0NCw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy93MS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCAzMTY3YmU1Li4xMjZhODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTUyLDYgKzUyLDcgQEAKIG9iai0kKENPTkZJR19JMk8pCQkrPSBtZXNzYWdlLwogb2JqLSQoQ09ORklHX0kyQykJCSs9IGkyYy8KIG9iai0kKENPTkZJR19XMSkJCSs9IHcxLworb2JqLSQoQ09ORklHX0hXTU9OKQkJKz0gaHdtb24vCiBvYmotJChDT05GSUdfUEhPTkUpCQkrPSB0ZWxlcGhvbnkvCiBvYmotJChDT05GSUdfTUQpCQkrPSBtZC8KIG9iai0kKENPTkZJR19CVCkJCSs9IGJsdWV0b290aC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggODZjNTI1Mi4uOTg2NDEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAjCiAKIG1lbnUgIkFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBNCiAJZGVwZW5kcyBvbiAhWDg2X1ZJU1dTCiAJZGVwZW5kcyBvbiAhSUE2NF9IUF9TSU0KIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CkBAIC00OCw3ICs0OSw2IEBACiAKIGNvbmZpZyBBQ1BJX0lOVEVSUFJFVEVSCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCB5CiAKIGlmIEFDUElfSU5URVJQUkVURVIKQEAgLTc5LDYgKzc5LDE0IEBACiAJZGVwZW5kcyBvbiBBQ1BJX1NMRUVQICYmIFBST0NfRlMKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFDUElfU0xFRVBfUFJPQ19TTEVFUAorCWJvb2wgIi9wcm9jL2FjcGkvc2xlZXAgKGRlcHJlY2F0ZWQpIgorCWRlcGVuZHMgb24gQUNQSV9TTEVFUF9QUk9DX0ZTCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgQ3JlYXRlIC9wcm9jL2FjcGkvc2xlZXAKKwkgIERlcHJlY2F0ZWQgYnkgL3N5cy9wb3dlci9zdGF0ZQorCiBjb25maWcgQUNQSV9BQwogCXRyaXN0YXRlICJBQyBBZGFwdGVyIgogCWRlcGVuZHMgb24gWDg2CkBAIC05OSw3ICsxMDcsNiBAQAogCiBjb25maWcgQUNQSV9CVVRUT04KIAl0cmlzdGF0ZSAiQnV0dG9uIgotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgcmVnaXN0ZXJzIGZvciBldmVudHMgYmFzZWQgb24gYnV0dG9ucywgc3VjaCBhcyB0aGUKQEAgLTExMSw3ICsxMTgsNiBAQAogY29uZmlnIEFDUElfVklERU8KIAl0cmlzdGF0ZSAiVmlkZW8iCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgbQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGltcGxlbWVudCB0aGUgQUNQSSBFeHRlbnNpb25zIEZvciBEaXNwbGF5IEFkYXB0ZXJzCkBAIC0xMjIsOSArMTI4LDE3IEBACiAJICBOb3RlIHRoYXQgdGhpcyBpcyBhbiByZWYuIGltcGxlbWVudGF0aW9uIG9ubHkuICBJdCBtYXkgb3IgbWF5IG5vdCB3b3JrCiAJICBmb3IgeW91ciBpbnRlZ3JhdGVkIHZpZGVvIGRldmljZS4KIAorY29uZmlnIEFDUElfSE9US0VZCisJdHJpc3RhdGUgIkdlbmVyaWMgSG90a2V5IgorCWRlcGVuZHMgb24gQUNQSV9JTlRFUlBSRVRFUgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KKwlkZWZhdWx0IG0KKwloZWxwCisJQUNQSSBnZW5lcmljIGhvdGtleQorCiBjb25maWcgQUNQSV9GQU4KIAl0cmlzdGF0ZSAiRmFuIgotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBBQ1BJIGZhbiBkZXZpY2VzLCBhbGxvd2luZyB1c2VyLW1vZGUgCkBAIC0xMzIsNyArMTQ2LDYgQEAKIAogY29uZmlnIEFDUElfUFJPQ0VTU09SCiAJdHJpc3RhdGUgIlByb2Nlc3NvciIKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgbQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGluc3RhbGxzIEFDUEkgYXMgdGhlIGlkbGUgaGFuZGxlciBmb3IgTGludXgsIGFuZCB1c2VzCkBAIC0xNDIsNyArMTU1LDYgQEAKIGNvbmZpZyBBQ1BJX0hPVFBMVUdfQ1BVCiAJYm9vbCAiUHJvY2Vzc29yIEhvdHBsdWcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUiAmJiBIT1RQTFVHX0NQVSAmJiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCXNlbGVjdCBBQ1BJX0NPTlRBSU5FUgogCWRlZmF1bHQgbgogCSAtLS1oZWxwLS0tCkBAIC0yNjIsNyArMjc0LDYgQEAKIAogY29uZmlnIEFDUElfREVCVUcKIAlib29sICJEZWJ1ZyBTdGF0ZW1lbnRzIgotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhlIEFDUEkgZHJpdmVyIGNhbiBvcHRpb25hbGx5IHJlcG9ydCBlcnJvcnMgd2l0aCBhIGdyZWF0IGRlYWwKQEAgLTI3MSw3ICsyODIsNiBAQAogCiBjb25maWcgQUNQSV9CVVMKIAlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IHkKIAogY29uZmlnIEFDUElfRUMKQEAgLTI4NSwxNyArMjk1LDE0IEBACiAKIGNvbmZpZyBBQ1BJX1BPV0VSCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBBQ1BJX1BDSQogCWJvb2wKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgUENJCiAKIGNvbmZpZyBBQ1BJX1NZU1RFTQogCWJvb2wKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHdpbGwgZW5hYmxlIHlvdXIgc3lzdGVtIHRvIHNodXQgZG93biB1c2luZyBBQ1BJLCBhbmQKQEAgLTMyNyw4ICszMzQsMTMgQEAKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgKEFDUElfSE9UUExVR19NRU1PUlkgfHwgQUNQSV9IT1RQTFVHX0NQVSB8fCBBQ1BJX0hPVFBMVUdfSU8pCiAJIC0tLWhlbHAtLS0KLQkgCVRoaXMgaXMgdGhlIEFDUEkgZ2VuZXJpYyBjb250YWluZXIgZHJpdmVyIHdoaWNoIHN1cHBvcnRzCi0JCUFDUEkwMDA0LCBQTlAwQTA1IGFuZCBQTlAwQTA2IGRldmljZXMKKwkgIFRoaXMgYWxsb3dzIF9waHlzaWNhbF8gaW5zZXJ0aW9uIGFuZCByZW1vdmFsIG9mIENQVXMgYW5kIG1lbW9yeS4KKwkgIFRoaXMgY2FuIGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIG9uIE5VTUEgbWFjaGluZXMgdGhhdCBzdXBwb3J0CisJICBBQ1BJIGJhc2VkIHBoeXNpY2FsIGhvdHBsdWcgb2Ygbm9kZXMsIG9yIG5vbi1OVU1BIG1hY2hpbmVzIHRoYXQKKwkgIHN1cHBvcnQgcGh5c2ljYWwgY3B1L21lbW9yeSBob3QtcGx1Zy4KKworCSAgSWYgb25lIHNlbGVjdHMgIm0iLCB0aGlzIGRyaXZlciBjYW4gYmUgbG9hZGVkIHdpdGgKKwkgICJtb2Rwcm9iZSBhY3BpX2NvbnRhaW5lciIuCiAKIGNvbmZpZyBBQ1BJX0hPVFBMVUdfTUVNT1JZCiAJdHJpc3RhdGUgIk1lbW9yeSBIb3RwbHVnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IDY1YzkyZTIuLmFkNjdlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTM2LDEzICszNiwxNCBAQAogZW5kaWYKIAogb2JqLSQoQ09ORklHX0FDUElfQlVTKQkJKz0gc2xlZXAvCi1vYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBidXMubworb2JqLSQoQ09ORklHX0FDUElfQlVTKQkJKz0gYnVzLm8gZ2x1ZS5vCiBvYmotJChDT05GSUdfQUNQSV9BQykgCQkrPSBhYy5vCiBvYmotJChDT05GSUdfQUNQSV9CQVRURVJZKQkrPSBiYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19BQ1BJX0JVVFRPTikJKz0gYnV0dG9uLm8KIG9iai0kKENPTkZJR19BQ1BJX0VDKQkJKz0gZWMubwogb2JqLSQoQ09ORklHX0FDUElfRkFOKQkJKz0gZmFuLm8KLW9iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vCitvYmotJChDT05GSUdfQUNQSV9WSURFTykJKz0gdmlkZW8ubyAKK29iai0kKENPTkZJR19BQ1BJX0hPVEtFWSkJKz0gaG90a2V5Lm8KIG9iai0kKENPTkZJR19BQ1BJX1BDSSkJCSs9IHBjaV9yb290Lm8gcGNpX2xpbmsubyBwY2lfaXJxLm8gcGNpX2JpbmQubwogb2JqLSQoQ09ORklHX0FDUElfUE9XRVIpCSs9IHBvd2VyLm8KIG9iai0kKENPTkZJR19BQ1BJX1BST0NFU1NPUikJKz0gcHJvY2Vzc29yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwppbmRleCBhNzVjYjU2Li5hNTYwYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCkBAIC0xMjA0LDYgKzEyMDQsMTAgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpeworCQlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOwkKKwl9CiAJYXN1c19wcm9jX2RpciA9IHByb2NfbWtkaXIoUFJPQ19BU1VTLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIWFzdXNfcHJvY19kaXIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJBc3VzIEFDUEk6IFVuYWJsZSB0byBjcmVhdGUgL3Byb2MgZW50cnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IDRlZGZmMTcuLmQ3N2MyMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTIxMiw2ICsyMTIsMTIgQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiRGV2aWNlIGlzIG5vdCBwb3dlciBtYW5hZ2VhYmxlXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CisJLyoKKwkgKiBHZXQgZGV2aWNlJ3MgY3VycmVudCBwb3dlciBzdGF0ZSBpZiBpdCdzIHVua25vd24KKwkgKiBUaGlzIG1lYW5zIGRldmljZSBwb3dlciBzdGF0ZSBpc24ndCBpbml0aWFsaXplZCBvciBwcmV2aW91cyBzZXR0aW5nIGZhaWxlZAorCSAqLworCWlmIChkZXZpY2UtPnBvd2VyLnN0YXRlID09IEFDUElfU1RBVEVfVU5LTk9XTikKKwkJYWNwaV9idXNfZ2V0X3Bvd2VyKGRldmljZS0+aGFuZGxlLCAmZGV2aWNlLT5wb3dlci5zdGF0ZSk7CiAJaWYgKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIGlzIGFscmVhZHkgYXQgRCVkXG4iLCBzdGF0ZSkpOwogCQlyZXR1cm5fVkFMVUUoMCk7CkBAIC0yMzEsNyArMjM3LDcgQEAKIAkgKiBPbiB0cmFuc2l0aW9ucyB0byBhIGhpZ2gtcG93ZXJlZCBzdGF0ZSB3ZSBmaXJzdCBhcHBseSBwb3dlciAodmlhCiAJICogcG93ZXIgcmVzb3VyY2VzKSB0aGVuIGV2YWx1dGUgX1BTeC4gIENvbnZlcnNseSBmb3IgdHJhbnNpdGlvbnMgdG8KIAkgKiBhIGxvd2VyLXBvd2VyZWQgc3RhdGUuCi0JICovIAorCSAqLwogCWlmIChzdGF0ZSA8IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKIAkJaWYgKGRldmljZS0+cG93ZXIuZmxhZ3MucG93ZXJfcmVzb3VyY2VzKSB7CiAJCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX3RyYW5zaXRpb24oZGV2aWNlLCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKaW5kZXggZWM0NDMwZS4uMGY0NWQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwpAQCAtMjYsOSArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCkBAIC0zNiw5ICszMyw2IEBACiAjZGVmaW5lIEFDUElfQlVUVE9OX0NPTVBPTkVOVAkJMHgwMDA4MDAwMAogI2RlZmluZSBBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRQkJIkFDUEkgQnV0dG9uIERyaXZlciIKICNkZWZpbmUgQUNQSV9CVVRUT05fQ0xBU1MJCSJidXR0b24iCi0jZGVmaW5lIEFDUElfQlVUVE9OX0ZJTEVfSU5GTwkJImluZm8iCi0jZGVmaW5lIEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKLSNkZWZpbmUgQUNQSV9CVVRUT05fVFlQRV9VTktOT1dOCTB4MDAKICNkZWZpbmUgQUNQSV9CVVRUT05fTk9USUZZX1NUQVRVUwkweDgwCiAKICNkZWZpbmUgQUNQSV9CVVRUT05fU1VCQ0xBU1NfUE9XRVIJInBvd2VyIgpAQCAtNzAsOCArNjQsNiBAQAogCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2J1dHRvbl9yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYnV0dG9uX2RyaXZlciA9IHsKIAkubmFtZSA9CQlBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRSwKQEAgLTkwLDE4NyArODIsNiBAQAogCXVuc2lnbmVkIGxvbmcJCXB1c2hlZDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYnV0dG9uX2luZm9fZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYnV0dG9uX3N0YXRlX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9idXR0b25fZGlyOwotCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKikgc2VxLT5wcml2YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25faW5mb19zZXFfc2hvdyIpOwotCi0JaWYgKCFidXR0b24gfHwgIWJ1dHRvbi0+ZGV2aWNlKQotCQlyZXR1cm5fVkFMVUUoMCk7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgInR5cGU6ICAgICAgICAgICAgICAgICAgICAlc1xuIiwgCi0JCWFjcGlfZGV2aWNlX25hbWUoYnV0dG9uLT5kZXZpY2UpKTsKLQotCXJldHVybl9WQUxVRSgwKTsKLX0KLQotc3RhdGljIGludCBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYnV0dG9uX2luZm9fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCQotc3RhdGljIGludCBhY3BpX2J1dHRvbl9zdGF0ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBzZXEtPnByaXZhdGU7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93Iik7Ci0KLQlpZiAoIWJ1dHRvbiB8fCAhYnV0dG9uLT5kZXZpY2UpCi0JCXJldHVybl9WQUxVRSgwKTsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihidXR0b24tPmhhbmRsZSwiX0xJRCIsTlVMTCwmc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgIHVuc3VwcG9ydGVkXG4iKTsKLQl9Ci0JZWxzZXsKLQkJc2VxX3ByaW50ZihzZXEsICJzdGF0ZTogICAgICAlc1xuIiwgKHN0YXRlID8gIm9wZW4iIDogImNsb3NlZCIpKTsgCi0JfQotCi0JcmV0dXJuX1ZBTFVFKDApOwotfQotCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotc3RhdGljIGludAotYWNwaV9idXR0b25fYWRkX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9hZGRfZnMiKTsKLQotCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCi0JCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQotCWJ1dHRvbiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQotCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCQllbnRyeSA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfUE9XRVIsIAotCQkJCWFjcGlfYnV0dG9uX2Rpcik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQkJZW50cnkgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX1NMRUVQLCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQlicmVhazsKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfTElEOgotCQkJZW50cnkgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCwgCi0JCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBlbnRyeSk7Ci0JaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKLQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JLyogJ2luZm8nIFtSXSAqLwotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9JTkZPLAotCQlTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0JaWYgKCFlbnRyeSkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKLQllbHNlIHsKLQkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX2J1dHRvbl9pbmZvX2ZvcHM7Ci0JCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKLQl9Ci0KLQkvKiBzaG93IGxpZCBzdGF0ZSBbUl0gKi8KLQlpZiAoYnV0dG9uLT50eXBlID09IEFDUElfQlVUVE9OX1RZUEVfTElEKSB7Ci0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9TVEFURSwKLQkJCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQkJaWYgKCFlbnRyeSkKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCQlBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKLQkJZWxzZSB7Ci0JCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYnV0dG9uX3N0YXRlX2ZvcHM7Ci0JCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQkJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCQl9Ci0JfQotCi0JcmV0dXJuX1ZBTFVFKDApOwotfQotCi0KLXN0YXRpYyBpbnQKLWFjcGlfYnV0dG9uX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCi17Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fcmVtb3ZlX2ZzIik7Ci0KLQlidXR0b24gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JaWYgKGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7Ci0JCWlmIChidXR0b24tPnR5cGUgPT0gQUNQSV9CVVRUT05fVFlQRV9MSUQpCi0JCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX1NUQVRFLAotCQkJCQkgICAgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9JTkZPLAotCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCi0JCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPnBhcmVudCk7Ci0KLQotCQlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgewotCQkJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSOgotCQkJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKLQkJCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUiwgCi0JCQkJCWFjcGlfYnV0dG9uX2Rpcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVA6Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX1NVQkNMQVNTX1NMRUVQLCAKLQkJCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fU1VCQ0xBU1NfTElELCAKLQkJCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJCQlicmVhazsKLQkJfQotCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuX1ZBTFVFKDApOwotfQotCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMTAsOCArMTIxLDcgQEAKIAkKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQiKTsKIAotCWlmICghYnV0dG9uKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJQlVHX09OKCFidXR0b24pOwogCiAJYWNwaV9idXR0b25fbm90aWZ5KGJ1dHRvbi0+aGFuZGxlLCBBQ1BJX0JVVFRPTl9OT1RJRllfU1RBVFVTLCBidXR0b24pOwogCkBAIC0zMjcsMTAgKzEzNyw2IEBACiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwogCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKIAotCXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBvd2VyX2J1dHRvbjsKLQlzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpzbGVlcF9idXR0b247Ci0Jc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqbGlkX2J1dHRvbjsKLQogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2FkZCIpOwogCiAJaWYgKCFkZXZpY2UpCkBAIC0zOTEsNDIgKzE5Nyw2IEBACiAJCWdvdG8gZW5kOwogCX0KIAotCS8qCi0JICogRW5zdXJlIG9ubHkgb25lIGJ1dHRvbiBvZiBlYWNoIHR5cGUgaXMgdXNlZC4KLQkgKi8KLQlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgewotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUjoKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgotCQlpZiAoIXBvd2VyX2J1dHRvbikKLQkJCXBvd2VyX2J1dHRvbiA9IGRldmljZTsKLQkJZWxzZSB7Ci0JCQlrZnJlZShidXR0b24pOwotCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQlpZiAoIXNsZWVwX2J1dHRvbikKLQkJCXNsZWVwX2J1dHRvbiA9IGRldmljZTsKLQkJZWxzZSB7Ci0JCQlrZnJlZShidXR0b24pOwotCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6Ci0JCWlmICghbGlkX2J1dHRvbikKLQkJCWxpZF9idXR0b24gPSBkZXZpY2U7Ci0JCWVsc2UgewotCQkJa2ZyZWUoYnV0dG9uKTsKLQkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXN1bHQgPSBhY3BpX2J1dHRvbl9hZGRfZnMoZGV2aWNlKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKLQogCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7CiAJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKIAkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKApAQCAtNDcwLDcgKzI0MCw2IEBACiAKIGVuZDoKIAlpZiAocmVzdWx0KSB7Ci0JCWFjcGlfYnV0dG9uX3JlbW92ZV9mcyhkZXZpY2UpOwogCQlrZnJlZShidXR0b24pOwogCX0KIApAQCAtNTExLDggKzI4MCw2IEBACiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCiAJCQkiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAotCWFjcGlfYnV0dG9uX3JlbW92ZV9mcyhkZXZpY2UpOwkKLQogCWtmcmVlKGJ1dHRvbik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CkBAIC01MjYsMjEgKzI5MywxNCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25faW5pdCIpOwogCi0JYWNwaV9idXR0b25fZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7Ci0JaWYgKCFhY3BpX2J1dHRvbl9kaXIpCi0JCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLQlhY3BpX2J1dHRvbl9kaXItPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KIAlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfYnV0dG9uX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyB2b2lkIF9fZXhpdAogYWNwaV9idXR0b25fZXhpdCAodm9pZCkKIHsKQEAgLTU0OCwxMSArMzA4LDggQEAKIAogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2J1dHRvbl9kcml2ZXIpOwogCi0JcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwotCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogbW9kdWxlX2luaXQoYWNwaV9idXR0b25faW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX2J1dHRvbl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYyBiL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYwppbmRleCA1YTBhZGJmLi45NzAxM2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oKmRldmljZSk7CisJcmVzdWx0ID0gYWNwaV9idXNfc3RhcnQoKmRldmljZSk7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwppbmRleCAyNzc5MjExLi44NDE5Mzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCkBAIC01MywxMyArNTMsMjAgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzZmllbGQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAorCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZAogICoKLSAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gVGhlIG9wY29kZSB0byBiZSBleGVjdXRlZAotICogICAgICAgICAgICAgIE9wZXJhbmRzICAgICAgICAgICAgLSBMaXN0IG9mIG9wZXJhbmRzIGZvciB0aGUgb3Bjb2RlCisgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AgKGNyZWF0ZV94WEZpZWxkKQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNzAsNyArNzcsNyBAQAogICogICAgICAgICAgICAgIGNyZWF0ZV93b3JkX2ZpZWxkX29wLAogICogICAgICAgICAgICAgIGNyZWF0ZV9kd29yZF9maWVsZF9vcCwKICAqICAgICAgICAgICAgICBjcmVhdGVfcXdvcmRfZmllbGRfb3AsCi0gKiAgICAgICAgICAgICAgY3JlYXRlX2ZpZWxkX29wICAgICAoYWxsIG9mIHdoaWNoIGRlZmluZSBmaWVsZHMgaW4gYnVmZmVycykKKyAqICAgICAgICAgICAgICBjcmVhdGVfZmllbGRfb3AgICAgIChhbGwgb2Ygd2hpY2ggZGVmaW5lIGEgZmllbGQgaW4gYSBidWZmZXIpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTE5LDcgKzEyNiw4IEBACiAJCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRTsKIAkJfQogCQllbHNlIHsKLQkJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwgQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKKwkJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwKKwkJCQkJQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKIAkJfQogCiAJCS8qCkBAIC0xMzQsMTYgKzE0MiwxNiBAQAogCQl9CiAJfQogCi0JLyogV2UgY291bGQgcHV0IHRoZSByZXR1cm5lZCBvYmplY3QgKE5vZGUpIG9uIHRoZSBvYmplY3Qgc3RhY2sgZm9yIGxhdGVyLCBidXQKLQkgKiBmb3Igbm93LCB3ZSB3aWxsIHB1dCBpdCBpbiB0aGUgIm9wIiBvYmplY3QgdGhhdCB0aGUgcGFyc2VyIHVzZXMsIHNvIHdlCi0JICogY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKKwkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IgbGF0ZXIsCisJICogYnV0IGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywKKwkgKiBzbyB3ZSBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQogCSAqLwogCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CiAKIAkvKgotCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcyBqdXN0IGNyZWF0ZWQgYW5kCi0JICogd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4gIE90aGVyd2lzZSwgdGhpcyB3YXMgYSBsb29rdXAgb2YgYW4KLQkgKiBleGlzdGluZyBub2RlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0IGFnYWluLgorCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcyBqdXN0IGNyZWF0ZWQKKwkgKiBhbmQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4gIE90aGVyd2lzZSwgdGhpcyB3YXMgYSBsb29rdXAKKwkgKiBvZiBhbiBleGlzdGluZyBub2RlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0IGFnYWluLgogCSAqLwogCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKIAlpZiAob2JqX2Rlc2MpIHsKQEAgLTIwNSw3ICsyMTMsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgKIAlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvLAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCkBAIC0yMzgsNyArMjQ2LDggQEAKIAkJCQkJICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKIAogCQkJaWYgKHBvc2l0aW9uID4gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkJIkJpdCBvZmZzZXQgd2l0aGluIGZpZWxkIHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIikpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1VQUE9SVCk7CiAJCQl9CiAKQEAgLTI1MCwxMiArMjU5LDE1IEBACiAKIAkJCS8qCiAJCQkgKiBHZXQgYSBuZXcgYWNjZXNzX3R5cGUgYW5kIGFjY2Vzc19hdHRyaWJ1dGUgLS0gdG8gYmUgdXNlZCBmb3IgYWxsCi0JCQkgKiBmaWVsZCB1bml0cyB0aGF0IGZvbGxvdywgdW50aWwgZmllbGQgZW5kIG9yIGFub3RoZXIgYWNjZXNzX2FzIGtleXdvcmQuCisJCQkgKiBmaWVsZCB1bml0cyB0aGF0IGZvbGxvdywgdW50aWwgZmllbGQgZW5kIG9yIGFub3RoZXIgYWNjZXNzX2FzCisJCQkgKiBrZXl3b3JkLgogCQkJICoKLQkJCSAqIEluIGZpZWxkX2ZsYWdzLCBwcmVzZXJ2ZSB0aGUgZmxhZyBiaXRzIG90aGVyIHRoYW4gdGhlIEFDQ0VTU19UWVBFIGJpdHMKKwkJCSAqIEluIGZpZWxkX2ZsYWdzLCBwcmVzZXJ2ZSB0aGUgZmxhZyBiaXRzIG90aGVyIHRoYW4gdGhlCisJCQkgKiBBQ0NFU1NfVFlQRSBiaXRzCiAJCQkgKi8KLQkJCWluZm8tPmZpZWxkX2ZsYWdzID0gKHU4KSAoKGluZm8tPmZpZWxkX2ZsYWdzICYgfihBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSykpIHwKLQkJCQkJICAoKHU4KSAoKHUzMikgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA+PiA4KSkpOworCQkJaW5mby0+ZmllbGRfZmxhZ3MgPSAodTgpCisJCQkJKChpbmZvLT5maWVsZF9mbGFncyAmIH4oQU1MX0ZJRUxEX0FDQ0VTU19UWVBFX01BU0spKSB8CisJCQkJKCh1OCkgKCh1MzIpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPj4gOCkpKTsKIAogCQkJaW5mby0+YXR0cmlidXRlID0gKHU4KSAoYXJnLT5jb21tb24udmFsdWUuaW50ZWdlcik7CiAJCQlicmVhazsKQEAgLTI2Nyw3ICsyNzksOCBAQAogCiAJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKIAkJCQkJICAoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLAotCQkJCQkgIGluZm8tPmZpZWxkX3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkJCSAgaW5mby0+ZmllbGRfdHlwZSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCQkgIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAogCQkJCQkgIHdhbGtfc3RhdGUsICZpbmZvLT5maWVsZF9ub2RlKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SICgoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLCBzdGF0dXMpOwpAQCAtMjk1LDggKzMwOCw5IEBACiAJCQkJCSArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CiAKIAkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkZpZWxkIFslNC40c10gYml0IG9mZnNldCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIsCi0JCQkJCQkoY2hhciAqKSAmaW5mby0+ZmllbGRfbm9kZS0+bmFtZSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJCSJGaWVsZCBbJTQuNHNdIGJpdCBvZmZzZXQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iLAorCQkJCQkoY2hhciAqKSAmaW5mby0+ZmllbGRfbm9kZS0+bmFtZSkpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1VQUE9SVCk7CiAJCQl9CiAKQEAgLTMwNiw3ICszMjAsOCBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVhcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVhcbiIsCiAJCQkJYXJnLT5jb21tb24uYW1sX29wY29kZSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CiAJCX0KQEAgLTQzNSw3ICs0NTAsOCBAQAogCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCiAJCQkJCSAgKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwKIAkJCQkJICB0eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsCi0JCQkJCSAgQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwgQUNQSV9OU19FUlJPUl9JRl9GT1VORCwKKwkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfAorCQkJCQkgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQsCiAJCQkJCSAgd2Fsa19zdGF0ZSwgJm5vZGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCmluZGV4IGI0ZDI2NGQuLmQ3NzkwZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCkBAIC00OSwxMiArNDksMjEgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzaW5pdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfb25lX29iamVjdCAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfb25lX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBOb2RlCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgIC0gTm9kZSBmb3IgdGhlIG9iamVjdAogICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAtIEN1cnJlbnQgbmVzdGluZyBsZXZlbAogICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBvaW50cyB0byBhIGluaXQgaW5mbyBzdHJ1Y3QKICAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgLSBOb3QgdXNlZApAQCAtNzAsNyArNzksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0ICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKQEAgLTEwNSw3ICsxMTQsOCBAQAogCiAJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24gKG9ial9oYW5kbGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJSZWdpb24gJXAgWyU0LjRzXSAtIEluaXQgZmFpbHVyZSwgJXNcbiIsCiAJCQkJb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJfQpAQCAtMTE4LDggKzEyOCwxMCBAQAogCiAJCWluZm8tPm1ldGhvZF9jb3VudCsrOwogCi0JCS8qIFByaW50IGEgZG90IGZvciBlYWNoIG1ldGhvZCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50IHRoZSBlbnRpcmUgcGF0aG5hbWUgKi8KLQorCQkvKgorCQkgKiBQcmludCBhIGRvdCBmb3IgZWFjaCBtZXRob2QgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBwcmludAorCQkgKiB0aGUgZW50aXJlIHBhdGhuYW1lCisJCSAqLwogCQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5JVF9OQU1FUykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULCAiLiIpKTsKIAkJfQpAQCAtMTQwLDcgKzE1Miw4IEBACiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2RzX3BhcnNlX21ldGhvZCAob2JqX2hhbmRsZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTWV0aG9kICVwIFslNC40c10gLSBwYXJzZSBmYWlsdXJlLCAlc1xuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJNZXRob2QgJXAgWyU0LjRzXSAtIHBhcnNlIGZhaWx1cmUsICVzXG4iLAogCQkJCW9ial9oYW5kbGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2hhbmRsZSksCiAJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAKQEAgLTE1NCw3ICsxNjcsOCBAQAogCQkgKiBmb3IgZXZlcnkgZXhlY3V0aW9uIHNpbmNlIHRoZXJlIGlzbid0IG11Y2ggb3ZlcmhlYWQKIAkJICovCiAJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlIChvYmpfaGFuZGxlKTsKLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5vYmplY3QtPm1ldGhvZC5vd25pbmdfaWQpOworCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKAorCQkJKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfaGFuZGxlKS0+b2JqZWN0LT5tZXRob2Qub3duaW5nX2lkKTsKIAkJYnJlYWs7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKaW5kZXggOWYwNDU2Yy4uOWZjM2Y0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCkBAIC0xNTMsMTIgKzE1MywxMSBAQAogCS8qCiAJICogUGFyc2UgdGhlIG1ldGhvZCwgZmlyc3QgcGFzcwogCSAqCi0JICogVGhlIGZpcnN0IHBhc3MgbG9hZCBpcyB3aGVyZSBuZXdseSBkZWNsYXJlZCBuYW1lZCBvYmplY3RzIGFyZQotCSAqIGFkZGVkIGludG8gdGhlIG5hbWVzcGFjZS4gIEFjdHVhbCBldmFsdWF0aW9uIG9mCi0JICogdGhlIG5hbWVkIG9iamVjdHMgKHdoYXQgd291bGQgYmUgY2FsbGVkIGEgInNlY29uZAotCSAqIHBhc3MiKSBoYXBwZW5zIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUKLQkgKiBtZXRob2Qgc28gdGhhdCBvcGVyYW5kcyB0byB0aGUgbmFtZWQgb2JqZWN0cyBjYW4KLQkgKiB0YWtlIG9uIGR5bmFtaWMgcnVuLXRpbWUgdmFsdWVzLgorCSAqIFRoZSBmaXJzdCBwYXNzIGxvYWQgaXMgd2hlcmUgbmV3bHkgZGVjbGFyZWQgbmFtZWQgb2JqZWN0cyBhcmUgYWRkZWQgaW50bworCSAqIHRoZSBuYW1lc3BhY2UuICBBY3R1YWwgZXZhbHVhdGlvbiBvZiB0aGUgbmFtZWQgb2JqZWN0cyAod2hhdCB3b3VsZCBiZQorCSAqIGNhbGxlZCBhICJzZWNvbmQgcGFzcyIpIGhhcHBlbnMgZHVyaW5nIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIHRoZQorCSAqIG1ldGhvZCBzbyB0aGF0IG9wZXJhbmRzIHRvIHRoZSBuYW1lZCBvYmplY3RzIGNhbiB0YWtlIG9uIGR5bmFtaWMKKwkgKiBydW4tdGltZSB2YWx1ZXMuCiAJICovCiAJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCmluZGV4IGYzMWQwOTUuLmY3OTk4MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYwpAQCAtNTIsNiArNTIsMjkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzbXRoZGF0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKK2FjcGlfb2JqZWN0X3R5cGUKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisjZW5kaWYKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyLDggKzg1LDggQEAKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaG9sZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzCi0gKiAgICAgICAgICAgICAgYW5kIGxvY2Fscy4gIFRoZSBkYXRhIHN0cnVjdCBpcyBhbiBhcnJheSBvZiBOVEVzIGZvciBlYWNoLgotICogICAgICAgICAgICAgIFRoaXMgYWxsb3dzIHJlZl9vZiBhbmQgZGVfcmVmX29mIHRvIHdvcmsgcHJvcGVybHkgZm9yIHRoZXNlCisgKiAgICAgICAgICAgICAgYW5kIGxvY2Fscy4gIFRoZSBkYXRhIHN0cnVjdCBpcyBhbiBhcnJheSBvZiBuYW1lc3BhY2Ugbm9kZXMgZm9yCisgKiAgICAgICAgICAgICAgZWFjaCAtIHRoaXMgYWxsb3dzIHJlZl9vZiBhbmQgZGVfcmVmX29mIHRvIHdvcmsgcHJvcGVybHkgZm9yIHRoZXNlCiAgKiAgICAgICAgICAgICAgc3BlY2lhbCBkYXRhIHR5cGVzLgogICoKICAqIE5PVEVTOiAgICAgICB3YWxrX3N0YXRlIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBieSB0aGUKQEAgLTkyLDcgKzExNSw4IEBACiAJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5uYW1lLmludGVnZXIgfD0gKGkgPDwgMjQpOwogCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0uZGVzY3JpcHRvciAgID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CiAJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS50eXBlICAgICAgICAgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0uZmxhZ3MgICAgICAgID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8IEFOT0JKX01FVEhPRF9BUkc7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyAgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKKwkJCQkgIEFOT0JKX01FVEhPRF9BUkc7CiAJfQogCiAJLyogSW5pdCB0aGUgbWV0aG9kIGxvY2FscyAqLwpAQCAtMTA0LDcgKzEyOCw4IEBACiAJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5uYW1lLmludGVnZXIgfD0gKGkgPDwgMjQpOwogCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZGVzY3JpcHRvciAgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKIAkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLnR5cGUgICAgICAgID0gQUNQSV9UWVBFX0FOWTsKLQkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLmZsYWdzICAgICAgID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8IEFOT0JKX01FVEhPRF9MT0NBTDsKKwkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLmZsYWdzICAgICAgID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8CisJCQkJIEFOT0JKX01FVEhPRF9MT0NBTDsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKQEAgLTE5OCwxNSArMjIzLDE4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIAotCS8qIENvcHkgcGFzc2VkIHBhcmFtZXRlcnMgaW50byB0aGUgbmV3IG1ldGhvZCBzdGFjayBmcmFtZSAgKi8KKwkvKiBDb3B5IHBhc3NlZCBwYXJhbWV0ZXJzIGludG8gdGhlIG5ldyBtZXRob2Qgc3RhY2sgZnJhbWUgKi8KIAotCXdoaWxlICgoaW5kZXggPCBBQ1BJX01FVEhPRF9OVU1fQVJHUykgJiYgKGluZGV4IDwgbWF4X3BhcmFtX2NvdW50KSAmJiBwYXJhbXNbaW5kZXhdKSB7CisJd2hpbGUgKChpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTKSAmJgorCQkgICAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICAgICAgJiYKKwkJCXBhcmFtc1tpbmRleF0pIHsKIAkJLyoKIAkJICogQSB2YWxpZCBwYXJhbWV0ZXIuCiAJCSAqIFN0b3JlIHRoZSBhcmd1bWVudCBpbiB0aGUgbWV0aG9kL3dhbGsgZGVzY3JpcHRvci4KIAkJICogRG8gbm90IGNvcHkgdGhlIGFyZyBpbiBvcmRlciB0byBpbXBsZW1lbnQgY2FsbCBieSByZWZlcmVuY2UKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlIChBTUxfQVJHX09QLCBpbmRleCwgcGFyYW1zW2luZGV4XSwgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlIChBTUxfQVJHX09QLCBpbmRleCwKKwkJCQkgcGFyYW1zW2luZGV4XSwgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtMjI0LDExICsyNTIsMTMgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlCiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKLSAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHdob3NlIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHdob3NlIHR5cGUgdG8gZ2V0CiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG5vZGUgaXMgcmV0dXJuZWQuCiAgKgotICogUkVUVVJOOiAgICAgIEdldCB0aGUgTm9kZSBhc3NvY2lhdGVkIHdpdGggYSBsb2NhbCBvciBhcmcuCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBub2RlCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgTm9kZSBhc3NvY2lhdGVkIHdpdGggYSBsb2NhbCBvciBhcmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjQ5LDcgKzI3OSw4IEBACiAJY2FzZSBBTUxfTE9DQUxfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkxvY2FsIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKIAkJCQlpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKIAkJfQpAQCAtMjYyLDcgKzI5Myw4IEBACiAJY2FzZSBBTUxfQVJHX09QOgogCiAJCWlmIChpbmRleCA+IEFDUElfTUVUSE9EX01BWF9BUkcpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCiAJCQkJaW5kZXgsIEFDUElfTUVUSE9EX01BWF9BUkcpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfSU5ERVgpOwogCQl9CkBAIC0yODYsNyArMzE4LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZQogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBnZXQKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHRvIGdldAogICogICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3RhY2sgZW50cnkKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAogICoKQEAgLTI5Nyw3ICszMjksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LApAQCAtMzQwLDY4ICszNzIsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB3aG9zZSB0eXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgRGF0YSB0eXBlIG9mIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIEFyZyBvciBMb2NhbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfb2JqZWN0X3R5cGUKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdDsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX21ldGhvZF9kYXRhX2dldF90eXBlIik7Ci0KLQotCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KLQotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9WQUxVRSAoKEFDUElfVFlQRV9OT1RfRk9VTkQpKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG9iamVjdCAqLwotCi0Jb2JqZWN0ID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKLQlpZiAoIW9iamVjdCkgewotCQkvKiBVbmluaXRpYWxpemVkIGxvY2FsL2FyZywgcmV0dXJuIFRZUEVfQU5ZICovCi0KLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX1RZUEVfQU5ZKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG9iamVjdCB0eXBlICovCi0KLQlyZXR1cm5fVkFMVUUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmplY3QpKTsKLX0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlCiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKICAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGdldAogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgKmRlc3RfZGVzYyAgICAgICAgICAtIFB0ciB0byBEZXNjcmlwdG9yIGludG8gd2hpY2ggc2VsZWN0ZWQgQXJnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExvY2FsIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQKKyAqICAgICAgICAgICAgICBkZXN0X2Rlc2MgICAgICAgICAgIC0gV2hlcmUgQXJnIG9yIExvY2FsIHZhbHVlIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB2YWx1ZSBvZiBzZWxlY3RlZCBBcmcgb3IgTG9jYWwgZnJvbSB0aGUgbWV0aG9kIGZyYW1lCi0gKiAgICAgICAgICAgICAgYXQgdGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBtZXRob2Qgc3RhY2suCisgKiBERVNDUklQVElPTjogUmV0cmlldmUgdmFsdWUgb2Ygc2VsZWN0ZWQgQXJnIG9yIExvY2FsIGZvciB0aGlzIG1ldGhvZAogICogICAgICAgICAgICAgIFVzZWQgb25seSBpbiBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoKS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDY3LDE0ICs0NDcsMTYgQEAKIAkJZWxzZSBzd2l0Y2ggKG9wY29kZSkgewogCQljYXNlIEFNTF9BUkdfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5pbml0aWFsaXplZCBBcmdbJWRdIGF0IG5vZGUgJXBcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiVW5pbml0aWFsaXplZCBBcmdbJWRdIGF0IG5vZGUgJXBcbiIsCiAJCQkJaW5kZXgsIG5vZGUpKTsKIAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfVU5JTklUSUFMSVpFRF9BUkcpOwogCiAJCWNhc2UgQU1MX0xPQ0FMX09QOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVuaW5pdGlhbGl6ZWQgTG9jYWxbJWRdIGF0IG5vZGUgJXBcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcFxuIiwKIAkJCQlpbmRleCwgbm9kZSkpOwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9VTklOSVRJQUxJWkVEX0xPQ0FMKTsKQEAgLTUwNiwxMiArNDg4LDEyIEBACiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIHRoZSBlbnRyeSBhdCBPcGNvZGU6SW5kZXggb24gdGhlIG1ldGhvZCBzdGFjay4gIEluc2VydHMKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgdGhlIGVudHJ5IGF0IE9wY29kZTpJbmRleC4gIEluc2VydHMKICAqICAgICAgICAgICAgICBhIG51bGwgaW50byB0aGUgc3RhY2sgc2xvdCBhZnRlciB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LApAQCAtNTYyLDcgKzU0NCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwKICAqCiAgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSB3aGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgdG8gc2V0CisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB0byBzZXQKICAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQogICoKQEAgLTY1MSwxOSArNjMzLDIwIEBACiAJCSAqLwogCQlpZiAob3Bjb2RlID09IEFNTF9BUkdfT1ApIHsKIAkJCS8qCi0JCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IGlzIHRoZSBjb3JyZWN0IHR5cGUuICBUaGlzIG1heSBiZSBvdmVya2lsbCwgYnV0Ci0JCQkgKiBpdCBpcyBoZXJlIGJlY2F1c2UgcmVmZXJlbmNlcyB3ZXJlIE5TIG5vZGVzIGluIHRoZSBwYXN0LiAgTm93IHRoZXkgYXJlCi0JCQkgKiBvcGVyYW5kIG9iamVjdHMgb2YgdHlwZSBSZWZlcmVuY2UuCisJCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IGlzIHRoZSBjb3JyZWN0IHR5cGUuICBUaGlzIG1heSBiZQorCQkJICogb3ZlcmtpbGwsIGJ1dGl0IGlzIGhlcmUgYmVjYXVzZSByZWZlcmVuY2VzIHdlcmUgTlMgbm9kZXMgaW4KKwkJCSAqICB0aGUgcGFzdC4gIE5vdyB0aGV5IGFyZSBvcGVyYW5kIG9iamVjdHMgb2YgdHlwZSBSZWZlcmVuY2UuCiAJCQkgKi8KIAkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGN1cnJlbnRfb2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSB3aGlsZSBzdG9yaW5nIHRvIG1ldGhvZCBhcmc6IFslc11cbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGN1cnJlbnRfb2JqX2Rlc2MpKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkJIkludmFsaWQgZGVzY3JpcHRvciB0eXBlIHdoaWxlIHN0b3JpbmcgdG8gbWV0aG9kIGFyZzogWyVzXVxuIiwKKwkJCQkJYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChjdXJyZW50X29ial9kZXNjKSkpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIAogCQkJLyoKLQkJCSAqIElmIHdlIGhhdmUgYSB2YWxpZCByZWZlcmVuY2Ugb2JqZWN0IHRoYXQgY2FtZSBmcm9tIHJlZl9vZigpLCBkbyB0aGUKLQkJCSAqIGluZGlyZWN0IHN0b3JlCisJCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIG9iamVjdCB0aGF0IGNhbWUgZnJvbSByZWZfb2YoKSwKKwkJCSAqIGRvIHRoZSBpbmRpcmVjdCBzdG9yZQogCQkJICovCiAJCQlpZiAoKGN1cnJlbnRfb2JqX2Rlc2MtPmNvbW1vbi50eXBlID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpICYmCiAJCQkJKGN1cnJlbnRfb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX1JFRl9PRl9PUCkpIHsKQEAgLTcxMywzICs2OTYsNTUgQEAKIH0KIAogCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgd2hvc2UgdHlwZSB0byBnZXQKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBEYXRhIHR5cGUgb2YgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgQXJnIG9yIExvY2FsCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgTG9jYWwgb3IgQXJnCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9vYmplY3RfdHlwZQorYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKKworCisJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLworCisJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZBTFVFICgoQUNQSV9UWVBFX05PVF9GT1VORCkpOworCX0KKworCS8qIEdldCB0aGUgb2JqZWN0ICovCisKKwlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCWlmICghb2JqZWN0KSB7CisJCS8qIFVuaW5pdGlhbGl6ZWQgbG9jYWwvYXJnLCByZXR1cm4gVFlQRV9BTlkgKi8KKworCQlyZXR1cm5fVkFMVUUgKEFDUElfVFlQRV9BTlkpOworCX0KKworCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgKi8KKworCXJldHVybl9WQUxVRSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKaW5kZXggZWI4YWY0Ny4uYmZiYWU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCkBAIC01Miw5ICs1MiwxNSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNvYmplY3QiKQogCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzY19wdHIpOworCiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0CiAgKgpAQCAtNjcsOSArNzMsOSBAQAogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIHBhcnNlciBPcCBvYmplY3QgdG8gdGhlIGVxdWl2YWxlbnQgbmFtZXNwYWNlIG9iamVjdAogICogICAgICAgICAgICAgIFNpbXBsZSBvYmplY3RzIGFyZSBhbnkgb2JqZWN0cyBvdGhlciB0aGFuIGEgcGFja2FnZSBvYmplY3QhCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTkwLDkgKzk2LDExIEBACiAJCSAqIE90aGVyd2lzZSwgZ28gYWhlYWQgYW5kIGxvb2sgaXQgdXAgbm93CiAJCSAqLwogCQlpZiAoIW9wLT5jb21tb24ubm9kZSkgewotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIG9wLT5jb21tb24udmFsdWUuc3RyaW5nLAorCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJCSAgb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCiAJCQkJCSAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCBOVUxMLAorCQkJCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAorCQkJCQkgIE5VTEwsCiAJCQkJCSAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmKG9wLT5jb21tb24ubm9kZSkpOwogCiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0xMDQsMTIgKzExMiwxNCBAQAogCiAJLyogQ3JlYXRlIGFuZCBpbml0IHRoZSBpbnRlcm5hbCBBQ1BJIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSktPm9iamVjdF90eXBlKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCisJCQkgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGUpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwgJm9ial9kZXNjKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKHdhbGtfc3RhdGUsIG9wLCBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMjAsNyArMTMwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iagogICoKQEAgLTEzNCw3ICsxNDQsNyBAQAogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIHBhcnNlciBPcCBwYWNrYWdlIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudAogICogICAgICAgICAgICAgIG5hbWVzcGFjZSBvYmplY3QKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmogKApAQCAtMjI5LDcgKzIzOSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqCiAgKgpAQCAtMjQzLDcgKzI1Myw3IEBACiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIHBhY2thZ2Ugb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50CiAgKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmogKApAQCAtMzMxLDExICszNDEsMTIgQEAKIAkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApIHsKIAkJCS8qIE9iamVjdCAocGFja2FnZSBvciBidWZmZXIpIGlzIGFscmVhZHkgYnVpbHQgKi8KIAotCQkJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0gPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBhcmctPmNvbW1vbi5ub2RlKTsKKwkJCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldID0KKwkJCQlBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBhcmctPmNvbW1vbi5ub2RlKTsKIAkJfQogCQllbHNlIHsKIAkJCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBhcmcsCi0JCQkJCSAgJm9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKKwkJCQkJICZvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSk7CiAJCX0KIAogCQlpKys7CkBAIC0zNDgsNyArMzU5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX25vZGUKICAqCkBAIC0zNjAsNyArMzcxLDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIHRoZSBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZXNwYWNlIG5vZGUKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2NyZWF0ZV9ub2RlICgKQEAgLTM5Miw3ICs0MDMsOCBAQAogCiAJLyogQnVpbGQgYW4gaW50ZXJuYWwgb2JqZWN0IGZvciB0aGUgYXJndW1lbnQocykgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywgJm9ial9kZXNjKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCAod2Fsa19zdGF0ZSwgb3AtPmNvbW1vbi52YWx1ZS5hcmcsCisJCQkgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC00MTQsNyArNDI2LDcgQEAKICNlbmRpZiAvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcAogICoKQEAgLTQyOSw3ICs0NDEsNyBAQAogICogICAgICAgICAgICAgIGFzc29jaWF0ZWQgYXJndW1lbnRzLiAgVGhlIG5hbWVzcGFjZSBvYmplY3QgaXMgYSBtb3JlIGNvbXBhY3QKICAqICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgT3AgYW5kIGl0cyBhcmd1bWVudHMuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICgKQEAgLTQ2Miw3ICs0NzQsOCBAQAogCQkvKgogCQkgKiBEZWZlciBldmFsdWF0aW9uIG9mIEJ1ZmZlciB0ZXJtX2FyZyBvcGVyYW5kCiAJCSAqLwotCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgICAgID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgICAgID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAJCW9ial9kZXNjLT5idWZmZXIuYW1sX3N0YXJ0ID0gb3AtPm5hbWVkLmRhdGE7CiAJCW9ial9kZXNjLT5idWZmZXIuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CiAJCWJyZWFrOwpAQCAtNDczLDcgKzQ4Niw4IEBACiAJCS8qCiAJCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgUGFja2FnZSB0ZXJtX2FyZyBvcGVyYW5kCiAJCSAqLwotCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlICAgICA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwkJb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAkJb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX3N0YXJ0ID0gb3AtPm5hbWVkLmRhdGE7CiAJCW9ial9kZXNjLT5wYWNrYWdlLmFtbF9sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOwogCQlicmVhazsKQEAgLTQ4Niw5ICs1MDAsMTAgQEAKIAkJCS8qCiAJCQkgKiBSZXNvbHZlIEFNTCBDb25zdGFudHMgaGVyZSAtIEFORCBPTkxZIEhFUkUhCiAJCQkgKiBBbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KLQkJCSAqIFdlIG1hcmsgdGhlIGludGVnZXIgd2l0aCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdCBzdGFydGVkIGxpZmUKLQkJCSAqIGFzIGEgY29uc3RhbnQgLS0gc28gdGhhdCBzdG9yZXMgdG8gY29uc3RhbnRzIHdpbGwgcGVyZm9ybSBhcyBleHBlY3RlZCAobm9vcCkuCi0JCQkgKiAoemVyb19vcCBpcyB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIG9wdGlvbmFsIHRhcmdldCBvcGVyYW5kcy4pCisJCQkgKiBXZSBtYXJrIHRoZSBpbnRlZ2VyIHdpdGggYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQgc3RhcnRlZAorCQkJICogbGlmZSBhcyBhIGNvbnN0YW50IC0tIHNvIHRoYXQgc3RvcmVzIHRvIGNvbnN0YW50cyB3aWxsIHBlcmZvcm0KKwkJCSAqIGFzIGV4cGVjdGVkIChub29wKS4gemVyb19vcCBpcyB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIG9wdGlvbmFsCisJCQkgKiB0YXJnZXQgb3BlcmFuZHMuCiAJCQkgKi8KIAkJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgPSBBT1BPQkpfQU1MX0NPTlNUQU5UOwogCkBAIC01MjEsNyArNTM2LDggQEAKIAogCQkJZGVmYXVsdDoKIAotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVhcbiIsIG9wY29kZSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVhcbiIsIG9wY29kZSkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC01MzUsNyArNTUxLDggQEAKIAogCiAJCWRlZmF1bHQ6Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gSW50ZWdlciB0eXBlICVYXG4iLCBvcF9pbmZvLT50eXBlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gSW50ZWdlciB0eXBlICVYXG4iLAorCQkJCW9wX2luZm8tPnR5cGUpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQlicmVhazsKIAkJfQpAQCAtNTcwLDggKzU4NywxMCBAQAogCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgPSBvcGNvZGUgLSBBTUxfTE9DQUxfT1A7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfTE9DQUxfT1AsIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LAotCQkJCQkgd2Fsa19zdGF0ZSwgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAoQU1MX0xPQ0FMX09QLAorCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCSB3YWxrX3N0YXRlLAorCQkJCQkgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwogI2VuZGlmCiAJCQlicmVhazsKIApAQCAtNTg0LDggKzYwMywxMCBAQAogCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgPSBvcGNvZGUgLSBBTUxfQVJHX09QOwogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAoQU1MX0FSR19PUCwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCi0JCQkJCSB3YWxrX3N0YXRlLCAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfQVJHX09QLAorCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCSB3YWxrX3N0YXRlLAorCQkJCQkgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwogI2VuZGlmCiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKaW5kZXggNWM5ODdhMC4uYmExM2JjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCkBAIC01NCwxMiArNTQsMzEgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzb3Bjb2RlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZV9ub2RlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aCwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29wY29kZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpidWZmZXJfZGVzYywKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvZmZzZXRfZGVzYywKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsZW5ndGhfZGVzYywKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXN1bHRfZGVzYyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cwogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgICAgIC0gUGFyZW50IE5TIG5vZGUKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgICAgIC0gT2JqZWN0IE5TIG5vZGUKKyAqICAgICAgICAgICAgICBzY29wZV9ub2RlICAgICAgICAgIC0gUGFyZW50IE5TIG5vZGUKICAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgICAgIC0gTGVuZ3RoIG9mIGV4ZWN1dGFibGUgQU1MCiAgKiAgICAgICAgICAgICAgYW1sX3N0YXJ0ICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIEFNTAogICoKQEAgLTY3LDkgKzg2LDkgQEAKICAqCiAgKiBERVNDUklQVElPTjogTGF0ZSAoZGVmZXJyZWQpIGV4ZWN1dGlvbiBvZiByZWdpb24gb3IgZmllbGQgYXJndW1lbnRzCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCkBAIC0xNjIsNyArMTgxLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMKICAqCkBAIC0xNzMsNyArMTkyLDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgYnVmZmVyX2ZpZWxkIEJ1ZmZlciBhbmQgSW5kZXguIFRoaXMgaW1wbGVtZW50cyB0aGUgbGF0ZQogICogICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgdGhlc2UgZmllbGQgYXR0cmlidXRlcy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzICgKQEAgLTIwOCw3ICsyMjcsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cwogICoKQEAgLTIxOSw3ICsyMzgsNyBAQAogICogREVTQ1JJUFRJT046IEdldCBCdWZmZXIgbGVuZ3RoIGFuZCBpbml0aWFsaXplciBieXRlIGxpc3QuICBUaGlzIGltcGxlbWVudHMKICAqICAgICAgICAgICAgICB0aGUgbGF0ZSBldmFsdWF0aW9uIG9mIHRoZXNlIGF0dHJpYnV0ZXMuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoCkBAIC0yNTUsNyArMjc0LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzCiAgKgpAQCAtMjY2LDcgKzI4NSw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IFBhY2thZ2UgbGVuZ3RoIGFuZCBpbml0aWFsaXplciBieXRlIGxpc3QuICBUaGlzIGltcGxlbWVudHMKICAqICAgICAgICAgICAgICB0aGUgbGF0ZSBldmFsdWF0aW9uIG9mIHRoZXNlIGF0dHJpYnV0ZXMuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMgKApAQCAtMzUzLDE3ICszNzIsMTcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gQSB2YWxpZCByZWdpb24gT3Agb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgIC0gUmVnaW9uIG5hbWVzcGFjZSBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBGcm9udCBlbmQgdG8gZXZfaW5pdGlhbGl6ZV9yZWdpb24KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uICgKQEAgLTM4Miw3ICs0MDEsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZAogICoKQEAgLTM5MCwxNiArNDA5LDE2IEBACiAgKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgIC0gYnVmZmVyX2ZpZWxkIG9iamVjdAogICogICAgICAgICAgICAgIGJ1ZmZlcl9kZXNjICAgICAtIEhvc3QgQnVmZmVyCiAgKiAgICAgICAgICAgICAgb2Zmc2V0X2Rlc2MgICAgIC0gT2Zmc2V0IGludG8gYnVmZmVyCi0gKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgIC0gTGVuZ3RoIG9mIGZpZWxkIChDUkVBVEVfRklFTERfT1Agb25seSkKLSAqICAgICAgICAgICAgICBSZXN1bHQgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0CisgKiAgICAgICAgICAgICAgbGVuZ3RoX2Rlc2MgICAgIC0gTGVuZ3RoIG9mIGZpZWxkIChDUkVBVEVfRklFTERfT1Agb25seSkKKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgLSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIGFjdHVhbCBpbml0aWFsaXphdGlvbiBvZiBhIGJ1ZmZlciBmaWVsZAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtNDM1LDggKzQ1NCwxMCBAQAogCSAqIGFmdGVyIHJlc29sdXRpb24gaW4gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKCkuCiAJICovCiAJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAocmVzdWx0X2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiKCVzKSBkZXN0aW5hdGlvbiBub3QgYSBOUyBOb2RlIFslc11cbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKGFtbF9vcGNvZGUpLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKHJlc3VsdF9kZXNjKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiKCVzKSBkZXN0aW5hdGlvbiBub3QgYSBOUyBOb2RlIFslc11cbiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKGFtbF9vcGNvZGUpLAorCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAocmVzdWx0X2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNDUyLDkgKzQ3MywxOCBAQAogCiAJCS8qIE9mZnNldCBpcyBpbiBiaXRzLCBjb3VudCBpcyBpbiBiaXRzICovCiAKKwkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CiAJCWJpdF9vZmZzZXQgPSBvZmZzZXQ7CiAJCWJpdF9jb3VudCAgPSAodTMyKSBsZW5ndGhfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CisKKwkJLyogTXVzdCBoYXZlIGEgdmFsaWQgKD4wKSBiaXQgY291bnQgKi8KKworCQlpZiAoYml0X2NvdW50ID09IDApIHsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJBdHRlbXB0IHRvIGNyZWF0ZV9maWVsZCBvZiBsZW5ndGggMFxuIikpOworCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9DUkVBVEVfQklUX0ZJRUxEX09QOgpAQCAtNTI3LDcgKzU1Nyw4IEBACiAKIAkvKgogCSAqIEluaXRpYWxpemUgYXJlYXMgb2YgdGhlIGZpZWxkIG9iamVjdCB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGZpZWxkcwotCSAqIEZvciBmaWVsZF9mbGFncywgdXNlIExPQ0tfUlVMRSA9IDAgKE5PX0xPQ0spLCBVUERBVEVfUlVMRSA9IDAgKFVQREFURV9QUkVTRVJWRSkKKwkgKiBGb3IgZmllbGRfZmxhZ3MsIHVzZSBMT0NLX1JVTEUgPSAwIChOT19MT0NLKSwKKwkgKiBVUERBVEVfUlVMRSA9IDAgKFVQREFURV9QUkVTRVJWRSkKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCAob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLCAwLAogCQkJICBiaXRfb2Zmc2V0LCBiaXRfY291bnQpOwpAQCAtNTM5LDggKzU3MCw4IEBACiAKIAkvKiBSZWZlcmVuY2UgY291bnQgZm9yIGJ1ZmZlcl9kZXNjIGluaGVyaXRzIG9ial9kZXNjIGNvdW50ICovCiAKLQlidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9ICh1MTYpIChidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCArCi0JCQkgIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKKwlidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9ICh1MTYpCisJCShidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCArIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKIAogCiBjbGVhbnVwOgpAQCAtNTY5LDcgKzYwMCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzCiAgKgpAQCAtNTgxLDcgKzYxMiw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IGJ1ZmZlcl9maWVsZCBCdWZmZXIgYW5kIEluZGV4CiAgKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gYWNwaV9kc19leGVjX2VuZF9vcCBkdXJpbmcgYnVmZmVyX2ZpZWxkIHBhcnNlIHRyZWUgd2FsawogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMgKApAQCAtNjU2LDcgKzY4Nyw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzCiAgKgpAQCAtNjY4LDcgKzY5OSw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IHJlZ2lvbiBhZGRyZXNzIGFuZCBsZW5ndGgKICAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBvcF9yZWdpb24gcGFyc2UgdHJlZSB3YWxrCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyAoCkBAIC02ODYsNyArNzE3LDggQEAKIAogCiAJLyoKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggZmllbGRzIG9mIHRoZSBvcF9yZWdpb24gZGVjbGFyYXRpb24KKwkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggZmllbGRzIG9mIHRoZQorCSAqIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbgogCSAqLwogCW5vZGUgPSAgb3AtPmNvbW1vbi5ub2RlOwogCkBAIC03MDcsNyArNzM5LDggQEAKIAogCS8qIFJlc29sdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvcGVyYW5kcyB0byBudW1iZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKG9wLT5jb21tb24uYW1sX29wY29kZSwgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCSBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTczNiw3ICs3NjksOCBAQAogCSAqLwogCW9wZXJhbmRfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDJdOwogCi0Jb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkgIG9wZXJhbmRfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRfZGVzYyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAicmduX29iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLApAQCAtNzUyLDcgKzc4Niw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMKICAqCkBAIC03NjUsNyArNzk5LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIG9wZXJhbmRzIGFuZCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGRhdGEgb2JqZWN0IHR5cGVzOgogICogICAgICAgICAgICAgIEJ1ZmZlciwgUGFja2FnZS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMgKApAQCAtODMwLDcgKzg2NCw3IEBACiAKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCS8qCi0JCSAqIFJldHVybiB0aGUgb2JqZWN0IGluIHRoZSB3YWxrX3N0YXRlLCB1bmxlc3MgdGhlIHBhcmVudCBpcyBhIHBhY2thZ2UgLS0KKwkJICogUmV0dXJuIHRoZSBvYmplY3QgaW4gdGhlIHdhbGtfc3RhdGUsIHVubGVzcyB0aGUgcGFyZW50IGlzIGEgcGFja2FnZSAtCiAJCSAqIGluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBhcnNlIHRyZWUKIAkJICogZm9yIHRoZSBwYWNrYWdlLgogCQkgKi8KQEAgLTk4OCw3ICsxMDIyLDggQEAKIAkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJIltXSElMRV9PUF0gdGVybWluYXRpb24hIE9wPSVwXG4iLG9wKSk7CiAKIAkJLyogUG9wIHRoaXMgY29udHJvbCBzdGF0ZSBhbmQgZnJlZSBpdCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKaW5kZXggNDYyYzVkOC4uOTYxMzM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwpAQCAtMTAwLDcgKzEwMCw2IEBACiAKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4KQEAgLTIwNSw3ICsyMDQsNyBAQAogCSAqIE5PVEU6IHRoaXMgaXMgb3B0aW9uYWwgYmVjYXVzZSB0aGUgQVNMIGxhbmd1YWdlIGRvZXMgbm90IGFjdHVhbGx5CiAJICogc3VwcG9ydCB0aGlzIGJlaGF2aW9yLgogCSAqLwotCWFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlLCBUUlVFKTsKKwkodm9pZCkgYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUsIFRSVUUpOwogCiAJLyoKIAkgKiBOb3cgZGV0ZXJtaW5lIGlmIHRoZSBwYXJlbnQgd2lsbCB1c2UgdGhlIHJlc3VsdApAQCAtMjE5LDggKzIxOCw5IEBACiAJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1NDT1BFX09QKSkgewogCQkvKiBObyBwYXJlbnQsIHRoZSByZXR1cm4gdmFsdWUgY2Fubm90IHBvc3NpYmx5IGJlIHVzZWQgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIkF0IE1ldGhvZCBsZXZlbCwgcmVzdWx0IG9mIFslc10gbm90IHVzZWRcbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSkpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkiQXQgTWV0aG9kIGxldmVsLCByZXN1bHQgb2YgWyVzXSBub3QgdXNlZFxuIiwKKwkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKSk7CiAJCXJldHVybl9WQUxVRSAoRkFMU0UpOwogCX0KIApAQCAtMjI4LDcgKzIyOCw4IEBACiAKIAlwYXJlbnRfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCWlmIChwYXJlbnRfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIHBhcmVudCBvcGNvZGUuIE9wPSVwXG4iLCBvcCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJVbmtub3duIHBhcmVudCBvcGNvZGUuIE9wPSVwXG4iLCBvcCkpOwogCQlyZXR1cm5fVkFMVUUgKEZBTFNFKTsKIAl9CiAKQEAgLTMwOSwxNyArMzEwLDE5IEBACiAKIAogcmVzdWx0X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJSZXN1bHQgb2YgWyVzXSB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAotCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKSwgb3ApKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJIlJlc3VsdCBvZiBbJXNdIHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKSwgb3ApKTsKIAogCXJldHVybl9WQUxVRSAoVFJVRSk7CiAKIAogcmVzdWx0X25vdF91c2VkOgotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiUmVzdWx0IG9mIFslc10gbm90IHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkiUmVzdWx0IG9mIFslc10gbm90IHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKSwgb3ApKTsKIAogCXJldHVybl9WQUxVRSAoRkFMU0UpOwogfQpAQCAtNTIyLDcgKzUyNSw4IEBACiAJCWlmICgod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgJiYKIAkJCSh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpICYmCiAJCQkoYXJnX2luZGV4ICE9IDApKSB7Ci0JCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpOworCQkJb2JqX2Rlc2MgPSBBQ1BJX0NBU1RfUFRSICgKKwkJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpOwogCQkJc3RhdHVzID0gQUVfT0s7CiAJCX0KIAkJZWxzZSAgICAvKiBBbGwgb3RoZXIgb3Bjb2RlcyAqLyB7CkBAIC01NjUsNyArNTY5LDggQEAKIAkJCQkJICogaW5kaWNhdGUgdGhpcyB0byB0aGUgaW50ZXJwcmV0ZXIsIHNldCB0aGUKIAkJCQkJICogb2JqZWN0IHRvIHRoZSByb290CiAJCQkJCSAqLwotCQkJCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAoCisJCQkJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CiAJCQkJCXN0YXR1cyA9IEFFX09LOwogCQkJCX0KIAkJCQllbHNlIHsKQEAgLTYxMiw3ICs2MTcsOCBAQAogCQkJICovCiAJCQlvcGNvZGUgPSBBTUxfWkVST19PUDsgICAgICAgLyogSGFzIG5vIGFyZ3VtZW50cyEgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJOdWxsIG5hbWVwYXRoOiBBcmc9JXBcbiIsIGFyZykpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJIk51bGwgbmFtZXBhdGg6IEFyZz0lcFxuIiwgYXJnKSk7CiAJCX0KIAkJZWxzZSB7CiAJCQlvcGNvZGUgPSBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlOwpAQCAtNjQyLDcgKzY0OCw4IEBACiAJCQkJICogT25seSBlcnJvciBpcyB1bmRlcmZsb3csIGFuZCB0aGlzIGluZGljYXRlcwogCQkJCSAqIGEgbWlzc2luZyBvciBudWxsIG9wZXJhbmQhCiAJCQkJICovCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJNaXNzaW5nIG9yIG51bGwgb3BlcmFuZCwgJXNcbiIsCisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCSJNaXNzaW5nIG9yIG51bGwgb3BlcmFuZCwgJXNcbiIsCiAJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJCX0KQEAgLTY1Nyw4ICs2NjQsOCBAQAogCiAJCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgb2JqZWN0ICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAod2Fsa19zdGF0ZSwgYXJnLAotCQkJCQkgb3Bjb2RlLCAmb2JqX2Rlc2MpOworCQkJc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICgKKwkJCQkJIHdhbGtfc3RhdGUsIGFyZywgb3Bjb2RlLCAmb2JqX2Rlc2MpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjIChvYmpfZGVzYyk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCmluZGV4IDIwNzFhMGQuLjEwZjcxMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKQEAgLTczLDExICs3MywxMyBAQAogCQkJICBhY3BpX2V4X29wY29kZV8zQV8xVF8xUiwKIAkJCSAgYWNwaV9leF9vcGNvZGVfNkFfMFRfMVJ9OwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCisgKiAgICAgICAgICAgICAgcmVzdWx0X29iaiAgICAgIC0gaWYgbm9uLXplcm8sIHBvcCByZXN1bHQgZnJvbSByZXN1bHQgc3RhY2sKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTI0LDcgKzEyNiw4IEBACiAJfQogCiAJaWYgKCFvYmpfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHByZWRpY2F0ZSBvYmpfZGVzYz0lcCBTdGF0ZT0lcFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTm8gcHJlZGljYXRlIG9ial9kZXNjPSVwIFN0YXRlPSVwXG4iLAogCQkJb2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKQEAgLTE5Nyw3ICsyMDAsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY19iZWdpbl9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBvdXRfb3AgICAgICAgICAgLSBSZXR1cm4gb3AgaWYgYSBuZXcgb25lIGlzIGNyZWF0ZWQKKyAqICAgICAgICAgICAgICBvdXRfb3AgICAgICAgICAgLSBXaGVyZSB0byByZXR1cm4gb3AgaWYgYSBuZXcgb25lIGlzIGNyZWF0ZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjMzLDcgKzIzNiw4IEBACiAJCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKIAogCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGUpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKIAkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlKSwgb3ApKTsKIAogCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwpAQCAtMjk3LDExICszMDEsMTAgQEAKIAogCQlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlID09IEFDUElfV0FMS19NRVRIT0QpIHsKIAkJCS8qCi0JCQkgKiBGb3VuZCBhIG5hbWVkIG9iamVjdCBkZWNsYXJhdGlvbiBkdXJpbmcgbWV0aG9kCi0JCQkgKiBleGVjdXRpb247ICB3ZSBtdXN0IGVudGVyIHRoaXMgb2JqZWN0IGludG8gdGhlCi0JCQkgKiBuYW1lc3BhY2UuICBUaGUgY3JlYXRlZCBvYmplY3QgaXMgdGVtcG9yYXJ5IGFuZAotCQkJICogd2lsbCBiZSBkZWxldGVkIHVwb24gY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uCi0JCQkgKiBvZiB0aGlzIG1ldGhvZC4KKwkJCSAqIEZvdW5kIGEgbmFtZWQgb2JqZWN0IGRlY2xhcmF0aW9uIGR1cmluZyBtZXRob2QgZXhlY3V0aW9uOworCQkJICogd2UgbXVzdCBlbnRlciB0aGlzIG9iamVjdCBpbnRvIHRoZSBuYW1lc3BhY2UuICBUaGUgY3JlYXRlZAorCQkJICogb2JqZWN0IGlzIHRlbXBvcmFyeSBhbmQgd2lsbCBiZSBkZWxldGVkIHVwb24gY29tcGxldGlvbiBvZgorCQkJICogdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZC4KIAkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcCAod2Fsa19zdGF0ZSwgTlVMTCk7CiAJCX0KQEAgLTMzOCw4ICszNDEsNiBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY19lbmRfb3AKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdGhhdCBoYXMgYmVlbiBqdXN0IGJlZW4gY29tcGxldGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3cgYmVlbiBldmFsdWF0ZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTM4OSw3ICszOTAsNyBAQAogCS8qIERlY29kZSB0aGUgT3Bjb2RlIENsYXNzICovCiAKIAlzd2l0Y2ggKG9wX2NsYXNzKSB7Ci0JY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6ICAgIC8qIGNvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gLS0gZG8gbm90aGluZyAqLworCWNhc2UgQU1MX0NMQVNTX0FSR1VNRU5UOiAgICAvKiBjb25zdGFudHMsIGxpdGVyYWxzLCBldGMuIC0gZG8gbm90aGluZyAqLwogCQlicmVhazsKIAogCkBAIC00MTcsMTIgKzQxOCwxMiBAQAogCQkJLyogUmVzb2x2ZSBhbGwgb3BlcmFuZHMgKi8KIAogCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJCSAgJih3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0xXSksCi0JCQkJCSAgd2Fsa19zdGF0ZSk7CisJCQkJCSAmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSwKKwkJCQkJIHdhbGtfc3RhdGUpOwogCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkJCUFDUElfRFVNUF9PUEVSQU5EUyAoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpLAotCQkJCQkJICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsICJhZnRlciBleF9yZXNvbHZlX29wZXJhbmRzIik7CisJCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpLAorCQkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsICJhZnRlciBleF9yZXNvbHZlX29wZXJhbmRzIik7CiAJCQl9CiAJCX0KIApAQCAtNTA2LDcgKzUwNyw4IEBACiAJCQlpZiAoKG9wLT5hc2wucGFyZW50KSAmJgogCQkJICAgKChvcC0+YXNsLnBhcmVudC0+YXNsLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8CiAJCQkJKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PSBBTUxfVkFSX1BBQ0tBR0VfT1ApKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiTWV0aG9kIFJlZmVyZW5jZSBpbiBhIFBhY2thZ2UsIE9wPSVwXG4iLCBvcCkpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkiTWV0aG9kIFJlZmVyZW5jZSBpbiBhIFBhY2thZ2UsIE9wPSVwXG4iLCBvcCkpOwogCQkJCW9wLT5jb21tb24ubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcC0+YXNsLnZhbHVlLmFyZy0+YXNsLm5vZGUtPm9iamVjdDsKIAkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9wLT5hc2wudmFsdWUuYXJnLT5hc2wubm9kZS0+b2JqZWN0KTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKQEAgLTU4MywxMyArNTg1LDE1IEBACiAJCQljYXNlIEFNTF9OQU1FX09QOgogCiAJCQkJLyoKLQkJCQkgKiBQdXQgdGhlIE5vZGUgb24gdGhlIG9iamVjdCBzdGFjayAoQ29udGFpbnMgdGhlIEFDUEkgTmFtZSBvZgotCQkJCSAqIHRoaXMgb2JqZWN0KQorCQkJCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lCisJCQkJICogb2YgdGhpcyBvYmplY3QpCiAJCQkJICovCiAJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGU7CiAJCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKIAotCQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZSwgb3AtPmNvbW1vbi5wYXJlbnQpOworCQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUgKHdhbGtfc3RhdGUsCisJCQkJCQkgb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlLAorCQkJCQkJIG9wLT5jb21tb24ucGFyZW50KTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTYwMCw3ICs2MDQsNyBAQAogCQkJY2FzZSBBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUDoKIAogCQkJCXN0YXR1cyA9IGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgb3AsCi0JCQkJCQkgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlKSk7CisJCQkJCQkgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUpKTsKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKQEAgLTYwOSw3ICs2MTMsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQkvKiBEb25lIHdpdGggdGhpcyByZXN1bHQgc3RhdGUgKE5vdyB0aGF0IG9wZXJhbmQgc3RhY2sgaXMgYnVpbHQpICovCisJCQkvKiBEb25lIHdpdGggcmVzdWx0IHN0YXRlIChOb3cgdGhhdCBvcGVyYW5kIHN0YWNrIGlzIGJ1aWx0KSAqLwogCiAJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtNjIwLDggKzYyNCw3IEBACiAJCQkgKiBJZiBhIHJlc3VsdCBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20gYWJvdmUsIHB1c2ggaXQgb24gdGhlCiAJCQkgKiBjdXJyZW50IHJlc3VsdCBzdGFjawogCQkJICovCi0JCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpICYmCi0JCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCQkJaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKIAkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wdXNoICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNjU0LDcgKzY1Nyw4IEBACiAKIAkJY2FzZSBBTUxfVFlQRV9VTkRFRklORUQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwXG4iLCBvcCkpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIlVuZGVmaW5lZCBvcGNvZGUgdHlwZSBPcD0lcFxuIiwgb3ApKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0lNUExFTUVOVEVEKTsKIAogCkBAIC03MDksMTMgKzcxMywxNCBAQAogCQlzdGF0dXMgPSBhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciAoc3RhdHVzLAogCQkJCSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+bmFtZS5pbnRlZ2VyLCB3YWxrX3N0YXRlLT5vcGNvZGUsCiAJCQkJIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQsIE5VTEwpOwotCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOworCQkodm9pZCkgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkvKiBCcmVhayB0byBkZWJ1Z2dlciB0byBkaXNwbGF5IHJlc3VsdCAqLwogCi0JCUFDUElfREVCVUdHRVJfRVhFQyAoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKKwkJCQkgd2Fsa19zdGF0ZSkpOwogCiAJCS8qCiAJCSAqIERlbGV0ZSB0aGUgcmVzdWx0IG9wIGlmIGFuZCBvbmx5IGlmOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCmluZGV4IDA2ZDc1ODYuLjFhYzE5N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKQEAgLTc5LDIwICs3OSwyMyBAQAogCiAJc3dpdGNoIChwYXNzX251bWJlcikgewogCWNhc2UgMToKLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICAgPSBBQ1BJX1BBUlNFX0xPQURfUEFTUzEgfCBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCQkJICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKIAkJd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDFfYmVnaW5fb3A7CiAJCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDFfZW5kX29wOwogCQlicmVhazsKIAogCWNhc2UgMjoKLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICAgPSBBQ1BJX1BBUlNFX0xPQURfUEFTUzEgfCBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCQkJICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKIAkJd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3A7CiAJCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDJfZW5kX29wOwogCQlicmVhazsKIAogCWNhc2UgMzoKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgfD0gQUNQSV9QQVJTRV9FWEVDVVRFICB8IEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgfD0gQUNQSV9QQVJTRV9FWEVDVVRFICB8CisJCQkJICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKIAkJd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfZXhlY19iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19leGVjX2VuZF9vcDsKICNlbmRpZgpAQCAtMTExLDggKzExNCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMV9iZWdpbl9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiByZWFjaGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBldmFsdWF0ZWQgeWV0LgorICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xNDYsNyArMTQ4LDggQEAKICNpZiAwCiAJCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAogCQkJCSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQ09OVFJPTCkpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIlxuXG4qKipFWEVDVVRBQkxFIE9QQ09ERSAlcyoqKlxuXG4iLCB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lKTsKKwkJCQlhY3BpX29zX3ByaW50ZiAoIlxuXG4qKipFWEVDVVRBQkxFIE9QQ09ERSAlcyoqKlxuXG4iLAorCQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lKTsKIAkJCQkqb3V0X29wID0gb3A7CiAJCQkJcmV0dXJuIChBRV9DVFJMX1NLSVApOwogCQkJfQpAQCAtMTkxLDcgKzE5NCw4IEBACiAJCQkgKi8KIAkJCWFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QgKHBhdGgpOwogCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAotCQkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkgICB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKIAkJfQogI2VuZGlmCiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTIyNCwxMCArMjI4LDEyIEBACiAJCQkgKiAgTmFtZSAoREVCLCAwKQogCQkJICogIFNjb3BlIChERUIpIHsgLi4uIH0KIAkJCSAqCi0JCQkgKiBOb3RlOiBzaWxlbnRseSBjaGFuZ2UgdGhlIHR5cGUgaGVyZS4gIE9uIHRoZSBzZWNvbmQgcGFzcywgd2Ugd2lsbCByZXBvcnQgYSB3YXJuaW5nCisJCQkgKiBOb3RlOiBzaWxlbnRseSBjaGFuZ2UgdGhlIHR5cGUgaGVyZS4gIE9uIHRoZSBzZWNvbmQgcGFzcywgd2Ugd2lsbCByZXBvcnQKKwkJCSAqIGEgd2FybmluZwogCQkJICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAorCQkJCSJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCiAJCQkJcGF0aCwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChub2RlLT50eXBlKSkpOwogCiAJCQlub2RlLT50eXBlID0gQUNQSV9UWVBFX0FOWTsKQEAgLTIzOCw3ICsyNDQsOCBAQAogCiAJCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIGFuIGVycm9yICovCiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKVxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKVxuIiwKIAkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpLCBwYXRoKSk7CiAKIAkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CkBAIC0yNDksNyArMjU2LDggQEAKIAlkZWZhdWx0OgogCiAJCS8qCi0JCSAqIEZvciBhbGwgb3RoZXIgbmFtZWQgb3Bjb2Rlcywgd2Ugd2lsbCBlbnRlciB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UuCisJCSAqIEZvciBhbGwgb3RoZXIgbmFtZWQgb3Bjb2Rlcywgd2Ugd2lsbCBlbnRlciB0aGUgbmFtZSBpbnRvCisJCSAqIHRoZSBuYW1lc3BhY2UuCiAJCSAqCiAJCSAqIFNldHVwIHRoZSBzZWFyY2ggZmxhZ3MuCiAJCSAqIFNpbmNlIHdlIGFyZSBlbnRlcmluZyBhIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCB3ZSBkbyBub3Qgd2FudCB0bwpAQCAtMjc5LDE0ICsyODcsMTYgQEAKIAkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKIAkJfQogCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiWyVzXSBCb3RoIEZpbmQgb3IgQ3JlYXRlIGFsbG93ZWRcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkiWyVzXSBCb3RoIEZpbmQgb3IgQ3JlYXRlIGFsbG93ZWRcbiIsCiAJCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpKSk7CiAJCX0KIAogCQkvKgogCQkgKiBFbnRlciB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UuICBXZSBlbnRlciB0aGUgbmFtZQotCQkgKiBhcyB3ZSBnbyBkb3dud2FyZCBpbiB0aGUgcGFyc2UgdHJlZS4gIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0IGludm9sdmUKLQkJICogYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlIHBhcnNlIHRyZWUgbGF0ZXIuCisJCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQKKwkJICogaW52b2x2ZSBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUKKwkJICogcGFyc2UgdHJlZSBsYXRlci4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLCBvYmplY3RfdHlwZSwKIAkJCQkgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgZmxhZ3MsIHdhbGtfc3RhdGUsICYobm9kZSkpOwpAQCAtMzM1LDggKzM0NSw2IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMV9lbmRfb3AKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdGhhdCBoYXMgYmVlbiBqdXN0IGJlZW4gY29tcGxldGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3cgYmVlbiBldmFsdWF0ZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTM4Myw3ICszOTEsOSBAQAogCiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3JlZ2lvbiAob3AtPm5hbWVkLmRhdGEsIG9wLT5uYW1lZC5sZW5ndGgsCi0JCQkJICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpICgob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24udmFsdWUuaW50ZWdlciksIHdhbGtfc3RhdGUpOworCQkJCSAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKQorCQkJCQkJICgob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24udmFsdWUuaW50ZWdlciksCisJCQkJCQkgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQpAQCAtMzk0LDcgKzQwNCw4IEBACiAJCS8qIEZvciBOYW1lIG9wY29kZSwgZ2V0IHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZSBhcmd1bWVudCAqLwogCiAJCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgewotCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi5hbWxfb3Bjb2RlKSktPm9iamVjdF90eXBlOworCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAorCQkJCShvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi5hbWxfb3Bjb2RlKSktPm9iamVjdF90eXBlOwogCQkJb3AtPmNvbW1vbi5ub2RlLT50eXBlID0gKHU4KSBvYmplY3RfdHlwZTsKIAkJfQogCX0KQEAgLTQ0OCw4ICs0NTksNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfYmVnaW5fb3AKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdGhhdCBoYXMgYmVlbiBqdXN0IGJlZW4gcmVhY2hlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrOyAgQXJndW1lbnRzIGhhdmUgbm90IGJlZW4gZXZhbHVhdGVkIHlldC4KKyAqICAgICAgICAgICAgICBvdXRfb3AgICAgICAgICAgLSBXaGVyIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00NzgsMTQgKzQ4OCwyMCBAQAogCWlmIChvcCkgewogCQkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgTmFtZXNwYWNlIG9wY29kZXMgaGVyZSAqLwogCi0JCWlmICgoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OU09QQ09ERSkgJiYgKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgfHwKKwkJaWYgKCghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT1BDT0RFKSAmJgorCQkJICAod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSB8fAogCQkJKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpKSkgeworCQkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKKwkJCQkod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0NPTlRST0wpKSB7CisJCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJCQkiRW5jb3VudGVyZWQgZXhlY3V0YWJsZSBjb2RlIGF0IG1vZHVsZSBsZXZlbCwgWyVzXVxuIiwKKwkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpKTsKKwkJCX0KIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCQl9CiAKLQkJLyoKLQkJICogR2V0IHRoZSBuYW1lIHdlIGFyZSBnb2luZyB0byBlbnRlciBvciBsb29rdXAgaW4gdGhlIG5hbWVzcGFjZQotCQkgKi8KKwkJLyogR2V0IHRoZSBuYW1lIHdlIGFyZSBnb2luZyB0byBlbnRlciBvciBsb29rdXAgaW4gdGhlIG5hbWVzcGFjZSAqLworCiAJCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgewogCQkJLyogRm9yIE5hbWVwYXRoIG9wLCBnZXQgdGhlIHBhdGggc3RyaW5nICovCiAKQEAgLTUyOCwyMSArNTQ0LDI1IEBACiAJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgogCiAJCS8qCi0JCSAqIFRoZSBuYW1lX3BhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuIERvbid0IGVudGVyIHRoZQotCQkgKiBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAgZm9yIHVzZSBsYXRlcgorCQkgKiBUaGUgbmFtZV9wYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgorCQkgKiBEb24ndCBlbnRlciB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwCisJCSAqIGZvciB1c2UgbGF0ZXIuCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkgIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQlicmVhazsKIAogCWNhc2UgQU1MX1NDT1BFX09QOgogCiAJCS8qCi0JCSAqIFRoZSBQYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LiAgRG9uJ3QgZW50ZXIgdGhlCi0JCSAqIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cCBmb3IgdXNlIGxhdGVyCisJCSAqIFRoZSBQYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgorCQkgKiBEb24ndCBlbnRlciB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwCisJCSAqIGZvciB1c2UgbGF0ZXIuCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkgIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAjaWZkZWYgX0FDUElfQVNMX0NPTVBJTEVSCiAJCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewpAQCAtNTgyLDcgKzYwMiw4IEBACiAJCQkgKiAgU2NvcGUgKERFQikgeyAuLi4gfQogCQkJICovCiAKLQkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLAorCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJCSJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCiAJCQkJYnVmZmVyX3B0ciwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChub2RlLT50eXBlKSkpOwogCiAJCQlub2RlLT50eXBlID0gQUNQSV9UWVBFX0FOWTsKQEAgLTU5Myw3ICs2MTQsOCBAQAogCiAJCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIGFuIGVycm9yICovCiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXVxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXVxuIiwKIAkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpLCBidWZmZXJfcHRyKSk7CiAKIAkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CkBAIC02MjEsOCArNjQzLDkgQEAKIAogCQkvKgogCQkgKiBFbnRlciB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UuICBXZSBlbnRlciB0aGUgbmFtZQotCQkgKiBhcyB3ZSBnbyBkb3dud2FyZCBpbiB0aGUgcGFyc2UgdHJlZS4gIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0IGludm9sdmUKLQkJICogYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlIHBhcnNlIHRyZWUgbGF0ZXIuCisJCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQKKwkJICogaW52b2x2ZSBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUKKwkJICogcGFyc2UgdHJlZSBsYXRlci4KIAkJICoKIAkJICogTm90ZTogTmFtZSBtYXkgYWxyZWFkeSBleGlzdCBpZiB3ZSBhcmUgZXhlY3V0aW5nIGEgZGVmZXJyZWQgb3Bjb2RlLgogCQkgKi8KQEAgLTYzNSw3ICs2NTgsOCBAQAogCQl9CiAKIAkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsIG9iamVjdF90eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX05PX1VQU0VBUkNILCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwKKwkJCQkgIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQlicmVhazsKIAl9CiAKQEAgLTY3OCw4ICs3MDIsNiBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfZW5kX29wCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIE9wIHRoYXQgaGFzIGJlZW4ganVzdCBiZWVuIGNvbXBsZXRlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrOyAgQXJndW1lbnRzIGhhdmUgbm93IGJlZW4gZXZhbHVhdGVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC03MzgsNyArNzYwLDggQEAKIAogCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KIAotCWlmIChhY3BpX25zX29wZW5zX3Njb3BlIChvYmplY3RfdHlwZSkgJiYgKG9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX01FVEhPRENBTExfT1ApKSB7CisJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSAmJgorCSAgIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9NRVRIT0RDQUxMX09QKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCiAJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9iamVjdF90eXBlKSwgb3ApKTsKIApAQCAtODAzLDcgKzgyNiw3IEBACiAJCWNhc2UgQU1MX0lOREVYX0ZJRUxEX09QOgogCiAJCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCAob3AsIChhY3BpX2hhbmRsZSkgYXJnLT5jb21tb24ubm9kZSwKLQkJCQkJICAgd2Fsa19zdGF0ZSk7CisJCQkJCSB3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0JBTktfRklFTERfT1A6CkBAIC04ODQsMTQgKzkwNywxNiBAQAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KIAkJY2FzZSBBTUxfUkVHSU9OX09QOgogCQkJLyoKLQkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQgYXJndW1lbnQgaXMgdGhlIHNwYWNlX2lkLgotCQkJICogKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgQU1MIG9mIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb3BlcmFuZHMpCisJCQkgKiBUaGUgb3BfcmVnaW9uIGlzIG5vdCBmdWxseSBwYXJzZWQgYXQgdGhpcyB0aW1lLiBPbmx5IHZhbGlkCisJCQkgKiBhcmd1bWVudCBpcyB0aGUgc3BhY2VfaWQuIChXZSBtdXN0IHNhdmUgdGhlIGFkZHJlc3Mgb2YgdGhlCisJCQkgKiBBTUwgb2YgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcykKIAkJCSAqLwogCQkJLyoKIAkJCSAqIElmIHdlIGhhdmUgYSB2YWxpZCByZWdpb24sIGluaXRpYWxpemUgaXQKIAkJCSAqIE5hbWVzcGFjZSBpcyBOT1QgbG9ja2VkIGF0IHRoaXMgcG9pbnQuCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24gKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSksIEZBTFNFKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24gKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSksCisJCQkJCSBGQUxTRSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJLyoKIAkJCQkgKiAgSWYgQUVfTk9UX0VYSVNUIGlzIHJldHVybmVkLCBpdCBpcyBub3QgZmF0YWwKQEAgLTk0MiwxNSArOTY3LDE2IEBACiAJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJCS8qCiAJCQkgKiBNYWtlIHN1cmUgdGhhdCB3aGF0IHdlIGZvdW5kIGlzIGluZGVlZCBhIG1ldGhvZAotCQkJICogV2UgZGlkbid0IHNlYXJjaCBmb3IgYSBtZXRob2Qgb24gcHVycG9zZSwgdG8gc2VlIGlmIHRoZSBuYW1lIHdvdWxkIHJlc29sdmUKKwkJCSAqIFdlIGRpZG4ndCBzZWFyY2ggZm9yIGEgbWV0aG9kIG9uIHB1cnBvc2UsIHRvIHNlZSBpZiB0aGUgbmFtZQorCQkJICogd291bGQgcmVzb2x2ZQogCQkJICovCiAJCQlpZiAobmV3X25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX01FVEhPRCkgewogCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQl9CiAKLQkJCS8qIFdlIGNvdWxkIHB1dCB0aGUgcmV0dXJuZWQgb2JqZWN0IChOb2RlKSBvbiB0aGUgb2JqZWN0IHN0YWNrIGZvciBsYXRlciwgYnV0Ci0JCQkgKiBmb3Igbm93LCB3ZSB3aWxsIHB1dCBpdCBpbiB0aGUgIm9wIiBvYmplY3QgdGhhdCB0aGUgcGFyc2VyIHVzZXMsIHNvIHdlCi0JCQkgKiBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQorCQkJLyogV2UgY291bGQgcHV0IHRoZSByZXR1cm5lZCBvYmplY3QgKE5vZGUpIG9uIHRoZSBvYmplY3Qgc3RhY2sgZm9yCisJCQkgKiBsYXRlciwgYnV0IGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZQorCQkJICogcGFyc2VyIHVzZXMsIHNvIHdlIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlCiAJCQkgKi8KIAkJCW9wLT5jb21tb24ubm9kZSA9IG5ld19ub2RlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwppbmRleCA2NWY0NTYxLi4yMWY0NTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKQEAgLTUwLDE0ICs1MCwxMyBAQAogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN3c2NvcGUiKQogCiAKLSNkZWZpbmUgU1RBQ0tfUE9QKGhlYWQpIGhlYWQKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyCiAgKgotICogUEFSQU1FVEVSUzogIE5vbmUKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUG9wIChhbmQgZnJlZSkgZXZlcnl0aGluZyBvbiB0aGUgc2NvcGUgc3RhY2sgZXhjZXB0IHRoZQogICogICAgICAgICAgICAgIHJvb3Qgc2NvcGUgb2JqZWN0ICh3aGljaCByZW1haW5zIGF0IHRoZSBzdGFjayB0b3AuKQpAQCAtODAsNyArNzksOCBAQAogCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvID0gc2NvcGVfaW5mby0+c2NvcGUubmV4dDsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKKwkJCSJQb3BwZWQgb2JqZWN0IHR5cGUgKCVzKVxuIiwKKwkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOwogCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzY29wZV9pbmZvKTsKIAl9CiB9CkBAIC05MCw4ICs5MCwxMSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gKICAqCi0gKiBQQVJBTUVURVJTOiAgKk5vZGUsICAgICAgICAgICAgICAtIE5hbWUgdG8gYmUgbWFkZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgVHlwZSwgICAgICAgICAgICAgICAtIFR5cGUgb2YgZnJhbWUgYmVpbmcgcHVzaGVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZSB0byBiZSBtYWRlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFB1c2ggdGhlIGN1cnJlbnQgc2NvcGUgb24gdGhlIHNjb3BlIHN0YWNrLCBhbmQgbWFrZSB0aGUKICAqICAgICAgICAgICAgICBwYXNzZWQgTm9kZSBjdXJyZW50LgpAQCAtMTIxLDcgKzEyNCw4IEBACiAJLyogTWFrZSBzdXJlIG9iamVjdCB0eXBlIGlzIHZhbGlkICovCiAKIAlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKHR5cGUpKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiZHNfc2NvcGVfc3RhY2tfcHVzaDogSW52YWxpZCBvYmplY3QgdHlwZTogMHglWFxuIiwgdHlwZSkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkiZHNfc2NvcGVfc3RhY2tfcHVzaDogSW52YWxpZCBvYmplY3QgdHlwZTogMHglWFxuIiwgdHlwZSkpOwogCX0KIAogCS8qIEFsbG9jYXRlIGEgbmV3IHNjb3BlIG9iamVjdCAqLwpAQCAtMTcwLDE2ICsxNzQsMTEgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19zY29wZV9zdGFja19wb3AKICAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIFRoZSB0eXBlIG9mIGZyYW1lIHRvIGJlIGZvdW5kCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQogICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgdGhlIHNjb3BlIHN0YWNrIHVudGlsIGEgZnJhbWUgb2YgdGhlIHJlcXVlc3RlZCB0eXBlCi0gKiAgICAgICAgICAgICAgaXMgZm91bmQuCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogUkVUVVJOOiAgICAgIENvdW50IG9mIGZyYW1lcyBwb3BwZWQuICBJZiBubyBmcmFtZSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKLSAqICAgICAgICAgICAgICB3YXMgZm91bmQsIHRoZSBjb3VudCBpcyByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBhbmQKLSAqICAgICAgICAgICAgICB0aGUgc2NvcGUgc3RhY2sgaXMgZW1wdGllZCAod2hpY2ggc2V0cyB0aGUgY3VycmVudCBzY29wZQotICogICAgICAgICAgICAgIHRvIHRoZSByb290KS4gIElmIHRoZSBzY29wZSBzdGFjayB3YXMgZW1wdHkgYXQgZW50cnksIHRoZQotICogICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGEgbm8tb3AgYW5kIHJldHVybnMgMC4KKyAqIERFU0NSSVBUSU9OOiBQb3AgdGhlIHNjb3BlIHN0YWNrIG9uY2UuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKaW5kZXggZTU1NWIzZi4uOWNkM2RiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCkBAIC01MCw2NyArNTAsMzEgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzd3N0YXRlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfaW5zZXJ0Ci0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gcHVzaAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGVyZSB0byBpbnNlcnQgdGhlIG9iamVjdAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc2VydCBhbiBvYmplY3Qgb250byB0aGlzIHdhbGsncyByZXN1bHQgc3RhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX3Jlc3VsdF9pbnNlcnQgKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKK2FjcGlfc3RhdHVzCithY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX3Jlc3VsdF9pbnNlcnQiKTsKK2FjcGlfc3RhdHVzCithY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCit2b2lkICoKK2FjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKyNlbmRpZgogCi0Jc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwotCWlmICghc3RhdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsCi0JCQl3YWxrX3N0YXRlKSk7Ci0JCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKLQl9Ci0KLQlpZiAoaW5kZXggPj0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkluZGV4IG91dCBvZiByYW5nZTogJVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBPYmplY3QhIEluZGV4PSVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQlpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleF0gPSBvYmplY3Q7Ci0Jc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMrKzsKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAotCQlvYmplY3QsIG9iamVjdCA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIG9iamVjdCkgOiAiTlVMTCIsCi0JCXdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCB3YWxrX3N0YXRlLT5jdXJyZW50X3Jlc3VsdCkpOwotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE3OCw3ICsxNDIsNiBAQAogCiAjZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9wb3AKQEAgLTIyNywxNSArMTkwLDE4IEBACiAJCQkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4IC0xXTsKIAkJCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleCAtMV0gPSBOVUxMOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJCSpvYmplY3QsICgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpIDogIk5VTEwiLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCQkiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJCSpvYmplY3QsCisJCQkJKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCkgOiAiTlVMTCIsCiAJCQkJKHUzMikgaW5kZXggLTEsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOwogCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiB9CiAKQEAgLTI3NCw3ICsyNDAsOCBAQAogCX0KIAogCWlmICghc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsCisJCQl3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQogCkBAIC0yOTMsNyArMjYwLDggQEAKIAkvKiBDaGVjayBmb3IgYSB2YWxpZCByZXN1bHQgb2JqZWN0ICovCiAKIAlpZiAoISpvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAogCQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsICh1MzIpIGluZGV4KSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQpAQCAtMzQ0LDcgKzMxMiw4IEBACiAJfQogCiAJaWYgKCFvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTnVsbCBPYmplY3QhIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCiAJCQlvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQpAQCAtNDM5LDQzICs0MDgsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENsZWFyIHRoZSBvYmplY3Qgc3RhY2sgYnkgZGVsZXRpbmcgYWxsIG9iamVjdHMgdGhhdCBhcmUgb24gaXQuCi0gKiAgICAgICAgICAgICAgU2hvdWxkIGJlIHVzZWQgd2l0aCBncmVhdCBjYXJlLCBpZiBhdCBhbGwhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX29ial9zdGFja19kZWxldGVfYWxsIiwgd2Fsa19zdGF0ZSk7Ci0KLQotCS8qIFRoZSBzdGFjayBzaXplIGlzIGNvbmZpZ3VyYWJsZSwgYnV0IGZpeGVkICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9PQkpfTlVNX09QRVJBTkRTOyBpKyspIHsKLQkJaWYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKLQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcHVzaAogICoKICAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIHB1c2gKQEAgLTUxNyw2NyArNDQ5LDYgQEAKIH0KIAogCi0jaWYgMAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBwb3BfY291bnQgICAgICAgICAgIC0gTnVtYmVyIG9mIG9iamVjdHMvZW50cmllcyB0byBwb3AKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgdGhpcyB3YWxrJ3Mgb2JqZWN0IHN0YWNrLiAgT2JqZWN0cyBvbiB0aGUgc3RhY2sgYXJlIE5PVAotICogICAgICAgICAgICAgIGRlbGV0ZWQgYnkgdGhpcyByb3V0aW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCi17Ci0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QiKTsKLQotCi0JLyogQ2hlY2sgZm9yIHN0YWNrIHVuZGVyZmxvdyAqLwotCi0JaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk1pc3Npbmcgb3BlcmFuZC9zdGFjayBlbXB0eSEgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotCQkqb2JqZWN0ID0gTlVMTDsKLQkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7Ci0JfQotCi0JLyogUG9wIHRoZSBzdGFjayAqLwotCi0Jd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLS07Ci0KLQkvKiBDaGVjayBmb3IgYSB2YWxpZCBvcGVyYW5kICovCi0KLQlpZiAoIXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotCQkqb2JqZWN0ID0gTlVMTDsKLQkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7Ci0JfQotCi0JLyogR2V0IG9wZXJhbmQgYW5kIHNldCBzdGFjayBlbnRyeSB0byBudWxsICovCi0KLQkqb2JqZWN0ID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc107Ci0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkgICpvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpLAotCQkJICB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKLQotCXJldHVybiAoQUVfT0spOwotfQotI2VuZGlmCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wCkBAIC02ODAsNDggKzU1MSw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBJbmRleCAgICAgICAgICAgICAgIC0gU3RhY2sgaW5kZXggd2hvc2UgdmFsdWUgaXMgZGVzaXJlZC4gIEJhc2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChpbmRleD0wID09IHRvcCkKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBhbiBvYmplY3QgZnJvbSB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBJbmRleCBtdXN0Ci0gKiAgICAgICAgICAgICAgYmUgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQgKgotYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCi17Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX29ial9zdGFja19nZXRfdmFsdWUiLCB3YWxrX3N0YXRlKTsKLQotCi0JLyogQ2FuJ3QgZG8gaXQgaWYgdGhlIHN0YWNrIGlzIGVtcHR5ICovCi0KLQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7Ci0JfQotCi0JLyogb3IgaWYgdGhlIGluZGV4IGlzIHBhc3QgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKi8KLQotCWlmIChpbmRleCA+ICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAodTMyKSAxKSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQlyZXR1cm5fUFRSICh3YWxrX3N0YXRlLT5vcGVyYW5kc1soYWNwaV9uYXRpdmVfdWludCkod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMSkgLQotCQkJICBpbmRleF0pOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlCiAgKgogICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgICAgICAtIEdldCBjdXJyZW50IGFjdGl2ZSBzdGF0ZSBmb3IgdGhpcyBUaHJlYWQKQEAgLTc1NywxMSArNTg2LDExIEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gU3RhdGUgdG8gcHVzaAotICogICAgICAgICAgICAgIHdhbGtfbGlzdCAgICAgICAtIFRoZSBsaXN0IHRoYXQgb3ducyB0aGUgd2FsayBzdGFjaworICogICAgICAgICAgICAgIFRocmVhZCAgICAgICAgICAtIFRocmVhZCBzdGF0ZSBvYmplY3QKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBQbGFjZSB0aGUgd2Fsa19zdGF0ZSBhdCB0aGUgaGVhZCBvZiB0aGUgc3RhdGUgbGlzdC4KKyAqIERFU0NSSVBUSU9OOiBQbGFjZSB0aGUgVGhyZWFkIHN0YXRlIGF0IHRoZSBoZWFkIG9mIHRoZSBzdGF0ZSBsaXN0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTc4NCw5ICs2MTMsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3BvcF93YWxrX3N0YXRlCiAgKgotICogUEFSQU1FVEVSUzogIHdhbGtfbGlzdCAgICAgICAtIFRoZSBsaXN0IHRoYXQgb3ducyB0aGUgd2FsayBzdGFjaworICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKICAqCi0gKiBSRVRVUk46ICAgICAgQSB3YWxrX3N0YXRlIG9iamVjdCBwb3BwZWQgZnJvbSB0aGUgc3RhY2sKKyAqIFJFVFVSTjogICAgICBBIHdhbGtfc3RhdGUgb2JqZWN0IHBvcHBlZCBmcm9tIHRoZSB0aHJlYWQncyBzdGFjawogICoKICAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYW5kIHJldHVybiB0aGUgd2Fsa3N0YXRlIG9iamVjdCB0aGF0IGlzIGF0IHRoZSBoZWFkIG9mCiAgKiAgICAgICAgICAgICAgdGhlIHdhbGsgc3RhY2sgZm9yIHRoZSBnaXZlbiB3YWxrIGxpc3QuICBOVUxMIGluZGljYXRlcyB0aGF0CkBAIC04MTQsNyArNjQzLDcgQEAKIAkJLyoKIAkJICogRG9uJ3QgY2xlYXIgdGhlIE5FWFQgZmllbGQsIHRoaXMgc2VydmVzIGFzIGFuIGluZGljYXRvcgogCQkgKiB0aGF0IHRoZXJlIGlzIGEgcGFyZW50IFdBTEsgU1RBVEUKLQkJICogICAgIE5POiB3YWxrX3N0YXRlLT5OZXh0ID0gTlVMTDsKKwkJICogRG8gTm90OiB3YWxrX3N0YXRlLT5OZXh0ID0gTlVMTDsKIAkJICovCiAJfQogCkBAIC04MjYsNyArNjU1LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBPcmlnaW4gICAgICAgICAgLSBTdGFydGluZyBwb2ludCBmb3IgdGhpcyB3YWxrCisgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gSUQgZm9yIG9iamVjdCBjcmVhdGlvbgorICogICAgICAgICAgICAgIE9yaWdpbiAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIHdhbGsKKyAqICAgICAgICAgICAgICBtdGhfZGVzYyAgICAgICAgLSBNZXRob2Qgb2JqZWN0CiAgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgbmV3IHdhbGsgc3RhdGUuCkBAIC04OTYsOCArNzI3LDcgQEAKICAqICAgICAgICAgICAgICBtZXRob2Rfbm9kZSAgICAgLSBDb250cm9sIG1ldGhvZCBOUyBub2RlLCBpZiBhbnkKICAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgLSBTdGFydCBvZiBBTUwKICAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgLSBMZW5ndGggb2YgQU1MCi0gKiAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgIC0gTWV0aG9kIGFyZ3MsIGlmIGFueQotICogICAgICAgICAgICAgIHJldHVybl9vYmpfZGVzYyAtIFdoZXJlIHRvIHN0b3JlIGEgcmV0dXJuIG9iamVjdCwgaWYgYW55CisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHBhcmFtcywgZXRjLikKICAqICAgICAgICAgICAgICBwYXNzX251bWJlciAgICAgLSAxLCAyLCBvciAzCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtOTMxLDcgKzc2MSw3IEBACiAKIAkvKiBUaGUgbmV4dF9vcCBvZiB0aGUgbmV4dF93YWxrIHdpbGwgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kICovCiAKLQl3YWxrX3N0YXRlLT5uZXh0X29wICAgICAgICAgICAgID0gTlVMTDsKKwl3YWxrX3N0YXRlLT5uZXh0X29wID0gTlVMTDsKIAogCWlmIChpbmZvKSB7CiAJCWlmIChpbmZvLT5wYXJhbWV0ZXJfdHlwZSA9PSBBQ1BJX1BBUkFNX0dQRSkgewpAQCAtOTM5LDggKzc2OSw4IEBACiAJCQkJCSAgIGluZm8tPnBhcmFtZXRlcnMpOwogCQl9CiAJCWVsc2UgewotCQkJd2Fsa19zdGF0ZS0+cGFyYW1zICAgICAgICAgICAgICA9IGluZm8tPnBhcmFtZXRlcnM7Ci0JCQl3YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MgID0gJmluZm8tPnJldHVybl9vYmplY3Q7CisJCQl3YWxrX3N0YXRlLT5wYXJhbXMgICAgICAgICAgPSBpbmZvLT5wYXJhbWV0ZXJzOworCQkJd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjID0gJmluZm8tPnJldHVybl9vYmplY3Q7CiAJCX0KIAl9CiAKQEAgLTk2NCw3ICs3OTQsOCBAQAogCiAJCS8qIEluaXQgdGhlIG1ldGhvZCBhcmd1bWVudHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyAod2Fsa19zdGF0ZS0+cGFyYW1zLCBBQ1BJX01FVEhPRF9OVU1fQVJHUywgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzICh3YWxrX3N0YXRlLT5wYXJhbXMsCisJCQkJIEFDUElfTUVUSE9EX05VTV9BUkdTLCB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0xMDMxLDEyICs4NjIsMTQgQEAKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+ZGF0YV90eXBlICE9IEFDUElfREVTQ19UWVBFX1dBTEspIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXAgaXMgbm90IGEgdmFsaWQgd2FsayBzdGF0ZVxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc2NvcGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCB3YWxrIHN0aWxsIGhhcyBhIHNjb3BlIGxpc3RcbiIsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCB3YWxrIHN0aWxsIGhhcyBhIHNjb3BlIGxpc3RcbiIsCisJCQl3YWxrX3N0YXRlKSk7CiAJfQogCiAJLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgbGlua2VkIGNvbnRyb2wgc3RhdGVzICovCkBAIC0xMDc4LDcgKzkxMSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQdXJnZSB0aGUgZ2xvYmFsIHN0YXRlIG9iamVjdCBjYWNoZS4gIFVzZWQgZHVyaW5nIHN1YnN5c3RlbQogICogICAgICAgICAgICAgIHRlcm1pbmF0aW9uLgpAQCAtMTA5OCwzICs5MzEsMjAwIEBACiAjZW5kaWYKIAogCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X2luc2VydAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIHB1c2gKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hlcmUgdG8gaW5zZXJ0IHRoZSBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbnNlcnQgYW4gb2JqZWN0IG9udG8gdGhpcyB3YWxrJ3MgcmVzdWx0IHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfcmVzdWx0X2luc2VydCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKworCisJQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X2luc2VydCIpOworCisKKwlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CisJaWYgKCFzdGF0ZSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKKwkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOworCX0KKworCWlmIChpbmRleCA+PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoIW9iamVjdCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIE9iamVjdCEgSW5kZXg9JVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSA9IG9iamVjdDsKKwlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cysrOworCisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCisJCW9iamVjdCwgb2JqZWN0ID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KSA6ICJOVUxMIiwKKwkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENsZWFyIHRoZSBvYmplY3Qgc3RhY2sgYnkgZGVsZXRpbmcgYWxsIG9iamVjdHMgdGhhdCBhcmUgb24gaXQuCisgKiAgICAgICAgICAgICAgU2hvdWxkIGJlIHVzZWQgd2l0aCBncmVhdCBjYXJlLCBpZiBhdCBhbGwhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX29ial9zdGFja19kZWxldGVfYWxsIiwgd2Fsa19zdGF0ZSk7CisKKworCS8qIFRoZSBzdGFjayBzaXplIGlzIGNvbmZpZ3VyYWJsZSwgYnV0IGZpeGVkICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9PQkpfTlVNX09QRVJBTkRTOyBpKyspIHsKKwkJaWYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKSB7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKKwkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgcG9wcGVkIG9iamVjdAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBvcCB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBPYmplY3RzIG9uIHRoZSBzdGFjayBhcmUgTk9UCisgKiAgICAgICAgICAgICAgZGVsZXRlZCBieSB0aGlzIHJvdXRpbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOworCisKKwkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCisKKwlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTWlzc2luZyBvcGVyYW5kL3N0YWNrIGVtcHR5ISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCSpvYmplY3QgPSBOVUxMOworCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisKKwkvKiBQb3AgdGhlIHN0YWNrICovCisKKwl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMtLTsKKworCS8qIENoZWNrIGZvciBhIHZhbGlkIG9wZXJhbmQgKi8KKworCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10pIHsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCSpvYmplY3QgPSBOVUxMOworCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisKKwkvKiBHZXQgb3BlcmFuZCBhbmQgc2V0IHN0YWNrIGVudHJ5IHRvIG51bGwgKi8KKworCSpvYmplY3QgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXTsKKwl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CisKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCSAgKm9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCksCisJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlCisgKgorICogUEFSQU1FVEVSUzogIEluZGV4ICAgICAgICAgICAgICAgLSBTdGFjayBpbmRleCB3aG9zZSB2YWx1ZSBpcyBkZXNpcmVkLiAgQmFzZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGluZGV4PTAgPT0gdG9wKQorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIG9wZXJhbmQKKyAqCisgKiBERVNDUklQVElPTjogUmV0cmlldmUgYW4gb2JqZWN0IGZyb20gdGhpcyB3YWxrJ3Mgb3BlcmFuZCBzdGFjay4gIEluZGV4IG11c3QKKyAqICAgICAgICAgICAgICBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqCithY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3sKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2dldF92YWx1ZSIsIHdhbGtfc3RhdGUpOworCisKKwkvKiBDYW4ndCBkbyBpdCBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgKi8KKworCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgeworCQlyZXR1cm5fUFRSIChOVUxMKTsKKwl9CisKKwkvKiBvciBpZiB0aGUgaW5kZXggaXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBzdGFjayAqLworCisJaWYgKGluZGV4ID4gKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtICh1MzIpIDEpKSB7CisJCXJldHVybl9QVFIgKE5VTEwpOworCX0KKworCXJldHVybl9QVFIgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWyhhY3BpX25hdGl2ZV91aW50KSh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxKSAtCisJCQkgIGluZGV4XSk7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGZkZjE0M2IuLmZjYTQxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KQEAgLTQ5LDE3ICs1MCwxOSBAQAogCiAjZGVmaW5lIEFDUElfRUNfRkxBR19PQkYJMHgwMQkvKiBPdXRwdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX0lCRgkweDAyCS8qIElucHV0IGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEFDUElfRUNfRkxBR19CVVJTVAkweDEwCS8qIGJ1cnN0IG1vZGUgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX1NDSQkweDIwCS8qIEVDLVNDSSBvY2N1cnJlZCAqLwogCiAjZGVmaW5lIEFDUElfRUNfRVZFTlRfT0JGCTB4MDEJLyogT3V0cHV0IGJ1ZmZlciBmdWxsICovCiAjZGVmaW5lIEFDUElfRUNfRVZFTlRfSUJFCTB4MDIJLyogSW5wdXQgYnVmZmVyIGVtcHR5ICovCiAKLSNkZWZpbmUgQUNQSV9FQ19VREVMQVkJCTEwMAkvKiBQb2xsIEAgMTAwdXMgaW5jcmVtZW50cyAqLwotI2RlZmluZSBBQ1BJX0VDX1VERUxBWV9DT1VOVAkxMDAwCS8qIFdhaXQgMTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KKyNkZWZpbmUgQUNQSV9FQ19ERUxBWQkJNTAJLyogV2FpdCA1MG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLwogI2RlZmluZSBBQ1BJX0VDX1VERUxBWV9HTEsJMTAwMAkvKiBXYWl0IDFtcyBtYXguIHRvIGdldCBnbG9iYWwgbG9jayAqLwogCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9SRUFECTB4ODAKICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1dSSVRFCTB4ODEKKyNkZWZpbmUgQUNQSV9FQ19CVVJTVF9FTkFCTEUJMHg4MgorI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0RJU0FCTEUJMHg4MwogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfUVVFUlkJMHg4NAogCiBzdGF0aWMgaW50IGFjcGlfZWNfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CkBAIC04Nyw3ICs5MCwxMSBAQAogCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwljb21tYW5kX2FkZHI7CiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWRhdGFfYWRkcjsKIAl1bnNpZ25lZCBsb25nCQkJZ2xvYmFsX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJCWxvY2s7CisJdW5zaWduZWQgaW50CQkJZXhwZWN0X2V2ZW50OworCWF0b21pY190CQkJbGVhdmluZ19idXJzdDsgLyogMCA6IE5vLCAxIDogWWVzLCAyOiBhYm9ydCovCisJYXRvbWljX3QJCQlwZW5kaW5nX2dwZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCQlzZW07CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXdhaXQ7CiB9OwogCiAvKiBJZiB3ZSBmaW5kIGFuIEVDIHZpYSB0aGUgRUNEVCwgd2UgbmVlZCB0byBrZWVwIGEgcHRyIHRvIGl0cyBjb250ZXh0ICovCkBAIC0xMDAsNDIgKzEwNywxMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV9lY193YWl0ICgKLQlzdHJ1Y3QgYWNwaV9lYwkJKmVjLAotCXU4CQkJZXZlbnQpCitzdGF0aWMgaW5saW5lIHUzMiBhY3BpX2VjX3JlYWRfc3RhdHVzKHN0cnVjdCBhY3BpX2VjICplYykKIHsKLQl1MzIJCQlhY3BpX2VjX3N0YXR1cyA9IDA7Ci0JdTMyCQkJaSA9IEFDUElfRUNfVURFTEFZX0NPVU5UOworCXUzMglzdGF0dXMgPSAwOwogCi0JaWYgKCFlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBQb2xsIHRoZSBFQyBzdGF0dXMgcmVnaXN0ZXIgd2FpdGluZyBmb3IgdGhlIGV2ZW50IHRvIG9jY3VyLiAqLwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgotCQlkbyB7Ci0JCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywgJmVjLT5zdGF0dXNfYWRkcik7Ci0JCQlpZiAoYWNwaV9lY19zdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfT0JGKQotCQkJCXJldHVybiAwOwotCQkJdWRlbGF5KEFDUElfRUNfVURFTEFZKTsKLQkJfSB3aGlsZSAoLS1pPjApOwotCQlicmVhazsKLQljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgotCQlkbyB7Ci0JCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywgJmVjLT5zdGF0dXNfYWRkcik7Ci0JCQlpZiAoIShhY3BpX2VjX3N0YXR1cyAmIEFDUElfRUNfRkxBR19JQkYpKQotCQkJCXJldHVybiAwOwotCQkJdWRlbGF5KEFDUElfRUNfVURFTEFZKTsKLQkJfSB3aGlsZSAoLS1pPjApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FOworCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnN0YXR1cywgJmVjLT5zdGF0dXNfYWRkcik7CisJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBhY3BpX2VjX3dhaXQoc3RydWN0IGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJaW50CXJlc3VsdCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3dhaXQiKTsKKworCWVjLT5leHBlY3RfZXZlbnQgPSBldmVudDsKKwlzbXBfbWIoKTsKKworCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGVjLT53YWl0LAorCQkJCQkhZWMtPmV4cGVjdF9ldmVudCwKKwkJCQkJbXNlY3NfdG9famlmZmllcyhBQ1BJX0VDX0RFTEFZKSk7CisJCisJZWMtPmV4cGVjdF9ldmVudCA9IDA7CisJc21wX21iKCk7CisKKwlpZiAocmVzdWx0IDwgMCl7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIiByZXN1bHQgID0gJWQgIiwgcmVzdWx0KSk7CisJCXJldHVybl9WQUxVRShyZXN1bHQpOworCX0KKworCS8qCisJICogVmVyaWZ5IHRoYXQgdGhlIGV2ZW50IGluIHF1ZXN0aW9uIGhhcyBhY3R1YWxseSBoYXBwZW5lZCBieQorCSAqIHF1ZXJ5aW5nIEVDIHN0YXR1cy4gRG8gdGhlIGNoZWNrIGV2ZW4gaWYgb3BlcmF0aW9uIHRpbWVkLW91dAorCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRpZCBub3QgbWlzcyBpbnRlcnJ1cHQuCisJICovCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6CisJCWlmIChhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19PQkYpCisJCQlyZXR1cm5fVkFMVUUoMCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKKwkJaWYgKH5hY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19JQkYpCisJCQlyZXR1cm5fVkFMVUUoMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybl9WQUxVRSgtRVRJTUUpOworfQorCisKKworc3RhdGljIGludAorYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlICgKKwlzdHJ1Y3QgYWNwaV9lYwkJKmVjKQoreworCXUzMgkJCXRtcCA9IDA7CisJaW50CQkJc3RhdHVzID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZSIpOworCisJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CisJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmCisJCSEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSl7CisJCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQlVSU1RfRU5BQkxFLCAmZWMtPmNvbW1hbmRfYWRkcik7CisJCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOworCQlpZiAoc3RhdHVzKXsKKwkJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwkJfQorCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ0bXAsICZlYy0+ZGF0YV9hZGRyKTsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlpZih0bXAgIT0gMHg5MCApIHsvKiBCdXJzdCBBQ0sgYnl0ZSovCisJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCX0KKwl9CisKKwlhdG9taWNfc2V0KCZlYy0+bGVhdmluZ19idXJzdCAsIDApOworCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIGludAorYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlICgKKwlzdHJ1Y3QgYWNwaV9lYwkJKmVjKQoreworCWludAkJCXN0YXR1cyA9MDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSIpOworCisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAxKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpeworCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0RJU0FCTEUsICZlYy0+Y29tbWFuZF9hZGRyKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0ZMQUdfSUJGKTsKKwkJaWYgKHN0YXR1cyl7CisJCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCItLS0tLS0tPndhaXQgZmFpbFxuIikpOworCQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCQl9CisJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwkJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CisJfQorCisJcmV0dXJuX1ZBTFVFKDApOworfQogCiBzdGF0aWMgaW50CiBhY3BpX2VjX3JlYWQgKApAQCAtMTQzLDE2ICsyMTksMTUgQEAKIAl1OAkJCWFkZHJlc3MsCiAJdTMyCQkJKmRhdGEpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXUzMgkJCWdsayA9IDA7CisJaW50CQkJc3RhdHVzID0gMDsKKwl1MzIJCQlnbGs7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlYWQiKTsKIAogCWlmICghZWMgfHwgIWRhdGEpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAorcmV0cnk6CiAJKmRhdGEgPSAwOwogCiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewpAQCAtMTYwLDMyICsyMzUsNTAgQEAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKworCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOworCWRvd24oJmVjLT5zZW0pOworCisJaWYoYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKSkKKwkJZ290byBlbmQ7CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUkVBRCwgJmVjLT5jb21tYW5kX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChyZXN1bHQpCisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCWlmIChzdGF0dXMpIHsKIAkJZ290byBlbmQ7CisJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgYWRkcmVzcywgJmVjLT5kYXRhX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwotCWlmIChyZXN1bHQpCisJc3RhdHVzPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwlpZiAoc3RhdHVzKXsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCQlnb3RvIGVuZDsKLQorCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgZGF0YSwgJmVjLT5kYXRhX2FkZHIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlYWQgWyUwMnhdIGZyb20gYWRkcmVzcyBbJTAyeF1cbiIsCiAJCSpkYXRhLCBhZGRyZXNzKSk7Ci0KKwkKIGVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCWFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZShlYyk7CisJdXAoJmVjLT5zZW0pOwogCiAJaWYgKGVjLT5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CiAKLQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKKwlpZihhdG9taWNfcmVhZCgmZWMtPmxlYXZpbmdfYnVyc3QpID09IDIpeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFib3J0ZWQsIHJldHJ5IC4uLlxuIikpOworCQl3aGlsZShhdG9taWNfcmVhZCgmZWMtPnBlbmRpbmdfZ3BlKSl7CisJCQltc2xlZXAoMSk7CQorCQl9CisJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAogCkBAIC0xOTUsNDkgKzI4OCw4MCBAQAogCXU4CQkJYWRkcmVzcywKIAl1OAkJCWRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXUzMgkJCWdsayA9IDA7CisJaW50CQkJc3RhdHVzID0gMDsKKwl1MzIJCQlnbGs7CisJdTMyCQkJdG1wOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY193cml0ZSIpOwogCiAJaWYgKCFlYykKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCityZXRyeToKIAlpZiAoZWMtPmdsb2JhbF9sb2NrKSB7CiAJCXN0YXR1cyA9IGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX0VDX1VERUxBWV9HTEssICZnbGspOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7CisJZG93bigmZWMtPnNlbSk7CisKKwlpZihhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOworCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJgorCQkhKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpeworCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwgJmVjLT5jb21tYW5kX2FkZHIpOworCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZW5kOworCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ0bXAsICZlYy0+ZGF0YV9hZGRyKTsKKwkJaWYodG1wICE9IDB4OTAgKSAvKiBCdXJzdCBBQ0sgYnl0ZSovCisJCQlnb3RvIGVuZDsKKwl9CisJLypOb3cgd2UgYXJlIGluIGJ1cnN0IG1vZGUqLwogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLCAmZWMtPmNvbW1hbmRfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJaWYgKHN0YXR1cyl7CiAJCWdvdG8gZW5kOworCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+ZGF0YV9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWlmIChzdGF0dXMpeworCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJCWdvdG8gZW5kOworCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGRhdGEsICZlYy0+ZGF0YV9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIGVuZDsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIldyb3RlIFslMDJ4XSB0byBhZGRyZXNzIFslMDJ4XVxuIiwKIAkJZGF0YSwgYWRkcmVzcykpOwogCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworCXVwKCZlYy0+c2VtKTsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJaWYoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKKwkJd2hpbGUoYXRvbWljX3JlYWQoJmVjLT5wZW5kaW5nX2dwZSkpeworCQkJbXNsZWVwKDEpOwkKKwkJfQorCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCWdvdG8gcmV0cnk7CisJfQorCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIC8qCkBAIC0yODksMTYgKzQxMywxMyBAQAogCXN0cnVjdCBhY3BpX2VjCQkqZWMsCiAJdTMyCQkJKmRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXUzMgkJCWdsayA9IDA7CisJaW50CQkJc3RhdHVzID0gMDsKKwl1MzIJCQlnbGs7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3F1ZXJ5Iik7CiAKIAlpZiAoIWVjIHx8ICFkYXRhKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7Ci0KIAkqZGF0YSA9IDA7CiAKIAlpZiAoZWMtPmdsb2JhbF9sb2NrKSB7CkBAIC0zMDcsMjkgKzQyOCwzOSBAQAogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAorCWRvd24oJmVjLT5zZW0pOworCWlmKGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZShlYykpCisJCWdvdG8gZW5kOwogCS8qCiAJICogUXVlcnkgdGhlIEVDIHRvIGZpbmQgb3V0IHdoaWNoIF9ReHggbWV0aG9kIHdlIG5lZWQgdG8gZXZhbHVhdGUuCiAJICogTm90ZSB0aGF0IHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcXVlcnkgY2F1c2VzIHRoZSBBQ1BJX0VDX1NDSQogCSAqIGJpdCB0byBiZSBjbGVhcmVkIChhbmQgdGh1cyBjbGVhcmluZyB0aGUgaW50ZXJydXB0IHNvdXJjZSkuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7Ci0KIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksICZlYy0+Y29tbWFuZF9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOworCWlmIChzdGF0dXMpeworCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJCWdvdG8gZW5kOwotCQorCX0KKwogCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgZGF0YSwgJmVjLT5kYXRhX2FkZHIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAlpZiAoISpkYXRhKQotCQlyZXN1bHQgPSAtRU5PREFUQTsKKwkJc3RhdHVzID0gLUVOT0RBVEE7CiAKIGVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCWFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZShlYyk7CisJdXAoJmVjLT5zZW0pOwogCiAJaWYgKGVjLT5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CiAKLQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKKwlpZihhdG9taWNfcmVhZCgmZWMtPmxlYXZpbmdfYnVyc3QpID09IDIpeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFib3J0ZWQsIHJldHJ5IC4uLlxuIikpOworCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCXN0YXR1cyA9IC1FTk9EQVRBOworCX0KKwlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAogCkBAIC0zNDcsNDIgKzQ3OCwyOSBAQAogCXZvaWQJCQkqZWNfY3h0KQogewogCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSAoc3RydWN0IGFjcGlfZWMgKikgZWNfY3h0OwotCXUzMgkJCXZhbHVlID0gMDsKLQl1bnNpZ25lZCBsb25nCQlmbGFncyA9IDA7CisJdTMyCQkJdmFsdWU7CisJaW50CQkJcmVzdWx0ID0gLUVOT0RBVEE7CiAJc3RhdGljIGNoYXIJCW9iamVjdF9uYW1lWzVdID0geydfJywnUScsJzAnLCcwJywnXDAnfTsKIAljb25zdCBjaGFyCQloZXhbXSA9IHsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLAogCQkJCSAgICAgICAgICc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRid9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19ncGVfcXVlcnkiKTsKIAotCWlmICghZWNfY3h0KQotCQlnb3RvIGVuZDsJCisJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX1NDSSkKKwkJcmVzdWx0ID0gYWNwaV9lY19xdWVyeShlYywgJnZhbHVlKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOwotCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnZhbHVlLCAmZWMtPmNvbW1hbmRfYWRkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFRCRDogSW1wbGVtZW50IGFzeW5jaCBldmVudHMhCi0JICogTk9URTogQWxsIHdlIGNhcmUgYWJvdXQgYXJlIEVDLVNDSSdzLiAgT3RoZXIgRUMgZXZlbnRzIGFyZQotCSAqIGhhbmRsZWQgdmlhIHBvbGxpbmcgKHl1Y2shKS4gIFRoaXMgaXMgYmVjYXVzZSBzb21lIHN5c3RlbXMKLQkgKiB0cmVhdCBFQy1TQ0lzIGFzIGxldmVsICh2ZXJzdXMgRURHRSEpIHRyaWdnZXJlZCwgcHJldmVudGluZwotCSAqICBhIHB1cmVseSBpbnRlcnJ1cHQtZHJpdmVuIGFwcHJvYWNoIChncnVtYmxlLCBncnVtYmxlKS4KLQkgKi8KLQlpZiAoISh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpKQorCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwogCi0JaWYgKGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSkpCi0JCWdvdG8gZW5kOwotCQogCW9iamVjdF9uYW1lWzJdID0gaGV4WygodmFsdWUgPj4gNCkgJiAweDBGKV07CiAJb2JqZWN0X25hbWVbM10gPSBoZXhbKHZhbHVlICYgMHgwRildOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXZhbHVhdGluZyAlc1xuIiwgb2JqZWN0X25hbWUpKTsKIAogCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKLQotZW5kOgotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKK2VuZDoJCisJYXRvbWljX2RlYygmZWMtPnBlbmRpbmdfZ3BlKTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB1MzIKQEAgLTM5MCw2ICs1MDgsNyBAQAogCXZvaWQJCQkqZGF0YSkKIHsKIAlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJdTMyCQkJdmFsdWU7CiAJc3RydWN0IGFjcGlfZWMJCSplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKSBkYXRhOwogCiAJaWYgKCFlYykKQEAgLTM5NywxMyArNTE2LDQxIEBACiAKIAlhY3BpX2Rpc2FibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX0lTUik7CiAKLQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKLQkJYWNwaV9lY19ncGVfcXVlcnksIGVjKTsKKwl2YWx1ZSA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwogCi0JaWYgKHN0YXR1cyA9PSBBRV9PSykKLQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Ci0JZWxzZQotCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJaWYoKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikgJiYKKwkJISh2YWx1ZSAmIEFDUElfRUNfRkxBR19CVVJTVCkgJiYKKwkJCShhdG9taWNfcmVhZCgmZWMtPmxlYXZpbmdfYnVyc3QpID09IDApKSB7IAorCS8qCisJICogdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgZGlzYWJsZXMgCisJICogYnVyc3QgbW9kZSBmb3IgYW55IHJlYXNvbiBvdGhlciAKKwkgKiB0aGFuIHRoZSBidXJzdCBkaXNhYmxlIGNvbW1hbmQKKwkgKiB0byBwcm9jZXNzIGNyaXRpY2FsIGV2ZW50LgorCSAqLworCQlhdG9taWNfc2V0KCZlYy0+bGVhdmluZ19idXJzdCAsIDIpOyAvKiBibG9jayBjdXJyZW50IHBlbmRpbmcgdHJhbnNhY3Rpb24KKwkJCQkJYW5kIHJldHJ5ICovCisJCXdha2VfdXAoJmVjLT53YWl0KTsKKwl9ZWxzZSB7CisJCWlmICgoZWMtPmV4cGVjdF9ldmVudCA9PSBBQ1BJX0VDX0VWRU5UX09CRiAmJgorCQkJCSh2YWx1ZSAmIEFDUElfRUNfRkxBR19PQkYpKSB8fAorCSAgICAJCQkoZWMtPmV4cGVjdF9ldmVudCA9PSBBQ1BJX0VDX0VWRU5UX0lCRSAmJgorCQkJCSEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkpIHsKKwkJCWVjLT5leHBlY3RfZXZlbnQgPSAwOworCQkJd2FrZV91cCgmZWMtPndhaXQpOworCQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7CisJCX0KKwl9CisKKwlpZiAodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKXsKKwkJYXRvbWljX2FkZCgxLCAmZWMtPnBlbmRpbmdfZ3BlKSA7CisJCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAorCQkJCQkJYWNwaV9lY19ncGVfcXVlcnksIGVjKTsKKwkJcmV0dXJuIHN0YXR1cyA9PSBBRV9PSyA/CisJCUFDUElfSU5URVJSVVBUX0hBTkRMRUQgOiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKKwl9IAorCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9JU1IpOworCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPworCQlBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MjEsMTAgKzU2OCw4IEBACiAJICogVGhlIEVDIG9iamVjdCBpcyBpbiB0aGUgaGFuZGxlciBjb250ZXh0IGFuZCBpcyBuZWVkZWQKIAkgKiB3aGVuIGNhbGxpbmcgdGhlIGFjcGlfZWNfc3BhY2VfaGFuZGxlci4KIAkgKi8KLQlpZihmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSAKLQkJKnJldHVybl9jb250ZXh0ID0gTlVMTDsKLQllbHNlIAotCQkqcmV0dXJuX2NvbnRleHQgPSBoYW5kbGVyX2NvbnRleHQ7CisJKnJldHVybl9jb250ZXh0ICA9IChmdW5jdGlvbiAhPSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSA/CisJCQkJCQloYW5kbGVyX2NvbnRleHQgOiBOVUxMOwogCiAJcmV0dXJuIEFFX09LOwogfQpAQCAtNDQxLDcgKzU4Niw3IEBACiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gTlVMTDsKLQl1MzIJCQl0ZW1wID0gMDsKKwl1NjQJCQl0ZW1wID0gKnZhbHVlOwogCWFjcGlfaW50ZWdlcgkJZl92ID0gMDsKIAlpbnQgCQkJaSA9IDA7CiAKQEAgLTQ1MCwxMCArNTk1LDkgQEAKIAlpZiAoKGFkZHJlc3MgPiAweEZGKSB8fCAhdmFsdWUgfHwgIWhhbmRsZXJfY29udGV4dCkKIAkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOwogCi0JaWYoYml0X3dpZHRoICE9IDgpIHsKKwlpZiAoYml0X3dpZHRoICE9IDggJiYgYWNwaV9zdHJpY3QpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImFjcGlfZWNfc3BhY2VfaGFuZGxlcjogYml0X3dpZHRoIHNob3VsZCBiZSA4XG4iKTsKLQkJaWYgKGFjcGlfc3RyaWN0KQotCQkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fVkFMVUUoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJZWMgPSAoc3RydWN0IGFjcGlfZWMgKikgaGFuZGxlcl9jb250ZXh0OwpAQCAtNDYxLDExICs2MDUsMTEgQEAKIG5leHRfYnl0ZToKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6Ci0JCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgKHU4KSBhZGRyZXNzLCAmdGVtcCk7Ci0JCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIHRlbXA7CisJCXRlbXAgPSAwOworCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgKHUzMiAqKSZ0ZW1wKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1dSSVRFOgotCQlyZXN1bHQgPSBhY3BpX2VjX3dyaXRlKGVjLCAodTgpIGFkZHJlc3MsICh1OCkgKnZhbHVlKTsKKwkJcmVzdWx0ID0gYWNwaV9lY193cml0ZShlYywgKHU4KSBhZGRyZXNzLCAodTgpIHRlbXApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXN1bHQgPSAtRUlOVkFMOwpAQCAtNDc0LDE5ICs2MTgsMTggQEAKIAl9CiAKIAliaXRfd2lkdGggLT0gODsKLQlpZihiaXRfd2lkdGgpewotCi0JCWlmKGZ1bmN0aW9uID09IEFDUElfUkVBRCkKLQkJCWZfdiB8PSAoYWNwaV9pbnRlZ2VyKSAoKnZhbHVlKSA8PCA4Kmk7Ci0JCWlmKGZ1bmN0aW9uID09IEFDUElfV1JJVEUpCi0JCQkoKnZhbHVlKSA+Pj04OyAKKwlpZiAoYml0X3dpZHRoKSB7CisJCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpCisJCQlmX3YgfD0gdGVtcCA8PCA4ICogaTsKKwkJaWYgKGZ1bmN0aW9uID09IEFDUElfV1JJVEUpCisJCQl0ZW1wID4+PSA4OwogCQlpKys7CisJCWFkZHJlc3MrKzsKIAkJZ290byBuZXh0X2J5dGU7CiAJfQogCi0KLQlpZihmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpewotCQlmX3YgfD0gKGFjcGlfaW50ZWdlcikgKCp2YWx1ZSkgPDwgOCppOworCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpIHsKKwkJZl92IHw9IHRlbXAgPDwgOCAqIGk7CiAJCSp2YWx1ZSA9IGZfdjsKIAl9CiAKQEAgLTUwNSw4ICs2NDgsNiBAQAogCWRlZmF1bHQ6CiAJCXJldHVybl9WQUxVRShBRV9PSyk7CiAJfQotCQotCiB9CiAKIApAQCAtNTMzLDYgKzY3NCw3IEBACiAJCSh1MzIpIGVjLT5zdGF0dXNfYWRkci5hZGRyZXNzLCAodTMyKSBlYy0+ZGF0YV9hZGRyLmFkZHJlc3MpOwogCXNlcV9wcmludGYoc2VxLCAidXNlIGdsb2JhbCBsb2NrOiAgICAgICAgICVzXG4iLAogCQllYy0+Z2xvYmFsX2xvY2s/InllcyI6Im5vIik7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCiBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwpAQCAtNTU1LDcgKzY5Nyw3IEBACiBhY3BpX2VjX2FkZF9mcyAoCiAJc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkX2ZzIik7CiAKQEAgLTYwNiw5ICs3NDgsOSBAQAogYWNwaV9lY19hZGQgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCWludAkJCXJlc3VsdDsKKwlhY3BpX3N0YXR1cwkJc3RhdHVzOworCXN0cnVjdCBhY3BpX2VjCQkqZWM7CiAJdW5zaWduZWQgbG9uZwkJdWlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19hZGQiKTsKQEAgLTYyMyw3ICs3NjUsMTAgQEAKIAogCWVjLT5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKIAllYy0+dWlkID0gLTE7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjLT5sb2NrKTsKKyAJYXRvbWljX3NldCgmZWMtPnBlbmRpbmdfZ3BlLCAwKTsKKyAJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAxKTsKKyAJaW5pdF9NVVRFWCgmZWMtPnNlbSk7CisgCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT53YWl0KTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CkBAIC02MzcsNyArNzgyLDcgQEAKIAlpZiAoZWNfZWNkdCAmJiBlY19lY2R0LT51aWQgPT0gdWlkKSB7CiAJCWFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihBQ1BJX1JPT1RfT0JKRUNULAogCQkJQUNQSV9BRFJfU1BBQ0VfRUMsICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwotCQorCiAJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZV9iaXQsICZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKIAogCQlrZnJlZShlY19lY2R0KTsKQEAgLTY3Nyw3ICs4MjIsNyBAQAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAogCWludAkJCXR5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfZWMJCSplYyA9IE5VTEw7CisJc3RydWN0IGFjcGlfZWMJCSplYzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVtb3ZlIik7CiAKQEAgLTczMiw4ICs4NzcsOCBAQAogYWNwaV9lY19zdGFydCAoCiAJc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCWFjcGlfc3RhdHVzCQlzdGF0dXM7CisJc3RydWN0IGFjcGlfZWMJCSplYzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfc3RhcnQiKTsKIApAQCAtNzg5LDggKzkzNCw4IEBACiAJc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCiAJaW50CQkJdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZWMJCSplYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMJCXN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9lYwkJKmVjOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19zdG9wIik7CiAKQEAgLTgzMiw3ICs5NzcsNiBAQAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjX2VjZHQtPmdwZV9iaXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKLQlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+bG9jayk7CiAJZWNfZWNkdC0+Z2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmhhbmRsZSA9IGhhbmRsZTsKIApAQCAtODkwLDcgKzEwMzQsNyBAQAogCWFjcGlfc3RhdHVzCQlzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAJKmVjZHRfcHRyOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywgCisJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKIAkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikgJmVjZHRfcHRyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtOTA1LDExICsxMDQ5LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZWMpKTsKIAorIAlpbml0X01VVEVYKCZlY19lY2R0LT5zZW0pOworIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT53YWl0KTsKIAllY19lY2R0LT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5zdGF0dXNfYWRkciA9IGVjZHRfcHRyLT5lY19jb250cm9sOwogCWVjX2VjZHQtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhOwogCWVjX2VjZHQtPmdwZV9iaXQgPSBlY2R0X3B0ci0+Z3BlX2JpdDsKLQlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+bG9jayk7CiAJLyogdXNlIHRoZSBHTCBqdXN0IHRvIGJlIHNhZmUgKi8KIAllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7CiAJZWNfZWNkdC0+dWlkID0gZWNkdF9wdHItPnVpZDsKQEAgLTk3OCw3ICsxMTIzLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19pbml0ICh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50CQkJcmVzdWx0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19pbml0Iik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKaW5kZXggMmEyMTM2MC4uZGQzYTcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKQEAgLTQ3LDYgKzQ3LDE2IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2ZXZlbnQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplICgKKwl2b2lkKTsKKworc3RhdGljIHUzMgorYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01Niw3ICs2Niw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIGV2ZW50cy4KKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIEFDUEkgZXZlbnRzIChGaXhlZCwgR1BFKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTc4LDkgKzg4LDkgQEAKIAl9CiAKIAkvKgotCSAqIEluaXRpYWxpemUgdGhlIEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzLiBUaGlzIGlzCi0JICogZG9uZSBwcmlvciB0byBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tCi0JICogb2NjdXJyaW5nIGJlZm9yZSBoYW5kZXJzIGFyZSBpbnN0YWxsZWQuCisJICogSW5pdGlhbGl6ZSB0aGUgRml4ZWQgYW5kIEdlbmVyYWwgUHVycG9zZSBFdmVudHMuIFRoaXMgaXMgZG9uZSBwcmlvciB0bworCSAqIGVuYWJsaW5nIFNDSXMgdG8gcHJldmVudCBpbnRlcnJ1cHRzIGZyb20gb2NjdXJyaW5nIGJlZm9yZSB0aGUgaGFuZGxlcnMgYXJlCisJICogaW5zdGFsbGVkLgogCSAqLwogCXN0YXR1cyA9IGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0xNjEsNyArMTcxLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKAogCXZvaWQpCiB7CkBAIC0xODAsNyArMTkwLDggQEAKIAkJLyogRW5hYmxlIHRoZSBmaXhlZCBldmVudCAqLwogCiAJCWlmIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLmVuYWJsZV9yZWdpc3Rlcl9pZCAhPSAweEZGKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQsCisJCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoCisJCQkJCSBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLmVuYWJsZV9yZWdpc3Rlcl9pZCwKIAkJCQkJIDAsIEFDUElfTVRYX0xPQ0spOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCXJldHVybiAoc3RhdHVzKTsKQEAgLTIwMCw3ICsyMTEsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBJTlRFUlJVUFRfSEFORExFRCBvciBJTlRFUlJVUFRfTk9UX0hBTkRMRUQKICAqCi0gKiBERVNDUklQVElPTjogQ2hlY2tzIHRoZSBQTSBzdGF0dXMgcmVnaXN0ZXIgZm9yIGZpeGVkIGV2ZW50cworICogREVTQ1JJUFRJT046IENoZWNrcyB0aGUgUE0gc3RhdHVzIHJlZ2lzdGVyIGZvciBhY3RpdmUgZml4ZWQgZXZlbnRzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjIxLDggKzIzMiwxMCBAQAogCSAqIFJlYWQgdGhlIGZpeGVkIGZlYXR1cmUgc3RhdHVzIGFuZCBlbmFibGUgcmVnaXN0ZXJzLCBhcyBhbGwgdGhlIGNhc2VzCiAJICogZGVwZW5kIG9uIHRoZWlyIHZhbHVlcy4gIElnbm9yZSBlcnJvcnMgaGVyZS4KIAkgKi8KLQkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAmZml4ZWRfc3RhdHVzKTsKLQkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAmZml4ZWRfZW5hYmxlKTsKKwkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJICZmaXhlZF9zdGF0dXMpOworCSh2b2lkKSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCisJCQkgJmZpeGVkX2VuYWJsZSk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTlRFUlJVUFRTLAogCQkiRml4ZWQgRXZlbnQgQmxvY2s6IEVuYWJsZSAlMDhYIFN0YXR1cyAlMDhYXG4iLApAQCAtMjU5LDcgKzI3Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCitzdGF0aWMgdTMyCiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IDExOGQ3MmEuLjA4MTEyMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTQ4LDYgKzQ4LDEyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2Z3BlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kICgKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTMzNSw4ICszNDEsMTAgQEAKIAkJCWdwZV9ibG9jayA9IGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tpXTsKIAkJCWlmIChncGVfYmxvY2spIHsKIAkJCQlpZiAoKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgJiYKLQkJCQkJKGdwZV9udW1iZXIgPCBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJCQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7CisJCQkJCShncGVfbnVtYmVyIDwgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJCQkJCQkoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgeworCQkJCQlyZXR1cm4gKCZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtCisJCQkJCQlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC00MzcsNyArNDQ1LDcgQEAKIAkJCQkiUmVhZCBHUEUgUmVnaXN0ZXIgYXQgR1BFJVg6IFN0YXR1cz0lMDJYLCBFbmFibGU9JTAyWFxuIiwKIAkJCQlncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyLCBzdGF0dXNfcmVnLCBlbmFibGVfcmVnKSk7CiAKLQkJCS8qIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFjdGl2ZSBhdCBhbGwgaW4gdGhpcyByZWdpc3RlciAqLworCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgYWN0aXZlIGF0IGFsbCBpbiB0aGlzIHJlZ2lzdGVyICovCiAKIAkJCWVuYWJsZWRfc3RhdHVzX2J5dGUgPSAodTgpIChzdGF0dXNfcmVnICYgZW5hYmxlX3JlZyk7CiAJCQlpZiAoIWVuYWJsZWRfc3RhdHVzX2J5dGUpIHsKQEAgLTQ1Nyw4ICs0NjUsOCBAQAogCQkJCQkgKiBvciBtZXRob2QuCiAJCQkJCSAqLwogCQkJCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZ3BlX2Rpc3BhdGNoICgKLQkJCQkJCQkgICZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXSwKLQkJCQkJCQkgICh1MzIpIGogKyBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKTsKKwkJCQkJCSZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXSwKKwkJCQkJCSh1MzIpIGogKyBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUyMyw3ICs1MzEsOCBAQAogCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgR1BFIGluZm8gZm9yIHRoaXMgbGV2ZWwgLSB3ZSBjb3B5IHRoZQogCSAqIGluZm8gdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdpdGggcmVtb3ZlX2hhbmRsZXIvcmVtb3ZlX2Jsb2NrLgogCSAqLwotCUFDUElfTUVNQ1BZICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLCBzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CisJQUNQSV9NRU1DUFkgKCZsb2NhbF9ncGVfZXZlbnRfaW5mbywgZ3BlX2V2ZW50X2luZm8sCisJCXNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC01MzQsNyArNTQzLDggQEAKIAkgKiBNdXN0IGNoZWNrIGZvciBjb250cm9sIG1ldGhvZCB0eXBlIGRpc3BhdGNoIG9uZSBtb3JlCiAJICogdGltZSB0byBhdm9pZCByYWNlIHdpdGggZXZfZ3BlX2luc3RhbGxfaGFuZGxlcgogCSAqLwotCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKKwlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KKwkJCUFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkgewogCQkvKgogCQkgKiBJbnZva2UgdGhlIEdQRSBNZXRob2QgKF9MeHgsIF9FeHgpIGkuZS4sIGV2YWx1YXRlIHRoZSBfTHh4L19FeHgKIAkJICogY29udHJvbCBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIEdQRQpAQCAtNTUzLDcgKzU2Myw4IEBACiAJCX0KIAl9CiAKLQlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PSBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PQorCQkJQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCS8qCiAJCSAqIEdQRSBpcyBsZXZlbC10cmlnZ2VyZWQsIHdlIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBhZnRlcgogCQkgKiBoYW5kbGluZyB0aGUgZXZlbnQuCkBAIC01NzUsNyArNTg2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfZGlzcGF0Y2gKICAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gIC0gaW5mbyBmb3IgdGhpcyBHUEUKKyAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgLSBJbmZvIGZvciB0aGlzIEdQRQogICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIE51bWJlciByZWxhdGl2ZSB0byB0aGUgcGFyZW50IEdQRSBibG9jawogICoKICAqIFJFVFVSTjogICAgICBJTlRFUlJVUFRfSEFORExFRCBvciBJTlRFUlJVUFRfTk9UX0hBTkRMRUQKQEAgLTYwMiwxMCArNjEzLDEyIEBACiAJICogSWYgZWRnZS10cmlnZ2VyZWQsIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBub3cuICBOb3RlIHRoYXQKIAkgKiBsZXZlbC10cmlnZ2VyZWQgZXZlbnRzIGFyZSBjbGVhcmVkIGFmdGVyIHRoZSBHUEUgaXMgc2VydmljZWQuCiAJICovCi0JaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09IEFDUElfR1BFX0VER0VfVFJJR0dFUkVEKSB7CisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJCQlBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgewogCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdXG4iLAogCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgZ3BlX251bWJlcikpOwogCQkJcmV0dXJuX1ZBTFVFIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KQEAgLTYzOSw3ICs2NTIsOCBAQAogCiAJCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGNsZWFyIGxldmVsLXRyaWdnZXJlZCBldmVudHMuICovCiAKLQkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09IEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgeworCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KKwkJCQlBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKIAkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlIChncGVfZXZlbnRfaW5mbyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKQEAgLTcwNCw3ICs3MTgsNiBAQAogCiAKICNpZmRlZiBBQ1BJX0dQRV9OT1RJRllfQ0hFQ0sKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRCRDogTk9UIFVTRUQsIFBST1RPVFlQRSBPTkxZIEFORCBXSUxMIFBST0JBQkxZIEJFIFJFTU9WRUQKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKaW5kZXggMDBkOTgxZi4uODQxODZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYwpAQCAtNDgsNiArNDgsMzkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZncGVibGsiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9zYXZlX21ldGhvZF9pbmZvICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmpfZGVzYywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKgorYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0ICgKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sgKAorCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzICgKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTU1LDcgKzE4OCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzCiAgKgpAQCAtMTkwLDcgKzIyMyw4IEBACiAJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7CiAJCQlncGVfZXZlbnRfaW5mbyA9ICZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXTsKIAotCQkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PSBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CisJCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCQkJCUFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKIAkJCQlBQ1BJX01FTV9GUkVFIChncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7CiAJCQkJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBOVUxMOwogCQkJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsKQEAgLTQ3MSw3ICs1MDUsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9nZXRfZ3BlX3hydXB0X2Jsb2NrIik7CiAKIAotCS8qIE5vIG5lZWQgZm9yIHNwaW4gbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzIGhlcmUgKi8KKwkvKiBObyBuZWVkIGZvciBsb2NrIHNpbmNlIHdlIGFyZSBub3QgY2hhbmdpbmcgYW55IGxpc3QgZWxlbWVudHMgaGVyZSAqLwogCiAJbmV4dF9ncGVfeHJ1cHQgPSBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwogCXdoaWxlIChuZXh0X2dwZV94cnVwdCkgewpAQCAtNjE5LDcgKzY1Myw3IEBACiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGZvciB0aGlzIGludGVycnVwdCB3aXRoIGxvY2sgKi8KKwkvKiBJbnN0YWxsIHRoZSBuZXcgYmxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCB3aXRoIGxvY2sgKi8KIAogCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKIAlpZiAoZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkKSB7CkBAIC03NTYsMTAgKzc5MCwxMiBAQAogCSAqIHBlciByZWdpc3Rlci4gIEluaXRpYWxpemF0aW9uIHRvIHplcm9zIGlzIHN1ZmZpY2llbnQuCiAJICovCiAJZ3BlX2V2ZW50X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJICAgKChhY3BpX3NpemUpIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKgorCQkJICAgKChhY3BpX3NpemUpIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgorCQkJICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKIAkJCSAgIHNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfZXZlbnRfaW5mbyB0YWJsZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIGdwZV9ldmVudF9pbmZvIHRhYmxlXG4iKSk7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KQEAgLTg5OSw3ICs5MzUsOCBAQAogCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgPSBncGVfYmxvY2tfYmFzZV9udW1iZXI7CiAJZ3BlX2Jsb2NrLT5ub2RlICAgICAgICAgICA9IGdwZV9kZXZpY2U7CiAKLQlBQ1BJX01FTUNQWSAoJmdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcywgZ3BlX2Jsb2NrX2FkZHJlc3MsIHNpemVvZiAoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzKSk7CisJQUNQSV9NRU1DUFkgKCZncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MsIGdwZV9ibG9ja19hZGRyZXNzLAorCQlzaXplb2YgKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykpOwogCiAJLyogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIHN1Yi1zdHJ1Y3R1cmVzICovCiAKQEAgLTEwNjEsOCArMTA5OCw5IEBACiAKIAkJLyogSW5zdGFsbCBHUEUgQmxvY2sgMCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLCAmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLAotCQkJCSByZWdpc3Rlcl9jb3VudDAsIDAsIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOworCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwKKwkJCQkgJmFjcGlfZ2JsX0ZBRFQtPnhncGUwX2JsaywgcmVnaXN0ZXJfY291bnQwLCAwLAorCQkJCSBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdKTsKIAogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKApAQCAtMTA5NCw4ICsxMTMyLDkgQEAKIAkJZWxzZSB7CiAJCQkvKiBJbnN0YWxsIEdQRSBCbG9jayAxICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLCAmYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLAotCQkJCQkgcmVnaXN0ZXJfY291bnQxLCBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCisJCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwKKwkJCQkJICZhY3BpX2dibF9GQURULT54Z3BlMV9ibGssIHJlZ2lzdGVyX2NvdW50MSwKKwkJCQkJIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSwKIAkJCQkJIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMV0pOwogCiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0xMTA5LDcgKzExNDgsNyBAQAogCQkJICogc3BhY2UuIEhvd2V2ZXIsIEdQRTAgYWx3YXlzIHN0YXJ0cyBhdCBHUEUgbnVtYmVyIHplcm8uCiAJCQkgKi8KIAkJCWdwZV9udW1iZXJfbWF4ID0gYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlICsKLQkJCQkJICAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKKwkJCQkJICAoKHJlZ2lzdGVyX2NvdW50MSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYwppbmRleCAyNTQ4ZWZhLi42NTllOTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKQEAgLTUwLDYgKzUwLDM1IEBACiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldm1pc2MiKQogCiAKKyNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAorc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKmFjcGlfbm90aWZ5X3ZhbHVlX25hbWVzW10gPQoreworCSJCdXMgQ2hlY2siLAorCSJEZXZpY2UgQ2hlY2siLAorCSJEZXZpY2UgV2FrZSIsCisJIkVqZWN0IHJlcXVlc3QiLAorCSJEZXZpY2UgQ2hlY2sgTGlnaHQiLAorCSJGcmVxdWVuY3kgTWlzbWF0Y2giLAorCSJCdXMgTW9kZSBNaXNtYXRjaCIsCisJIlBvd2VyIEZhdWx0IgorfTsKKyNlbmRpZgorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCithY3BpX2V2X25vdGlmeV9kaXNwYXRjaCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCithY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKK3N0YXRpYyB1MzIKK2FjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0CkBAIC05OCwyMCArMTI3LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0KLXsKLQkiQnVzIENoZWNrIiwKLQkiRGV2aWNlIENoZWNrIiwKLQkiRGV2aWNlIFdha2UiLAotCSJFamVjdCByZXF1ZXN0IiwKLQkiRGV2aWNlIENoZWNrIExpZ2h0IiwKLQkiRnJlcXVlbmN5IE1pc21hdGNoIiwKLQkiQnVzIE1vZGUgTWlzbWF0Y2giLAotCSJQb3dlciBGYXVsdCIKLX07Ci0jZW5kaWYKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCkBAIC0xMjgsOSArMTQzLDEwIEBACiAKIAkvKgogCSAqIEZvciB2YWx1ZSAzIChFamVjdGlvbiBSZXF1ZXN0KSwgc29tZSBkZXZpY2UgbWV0aG9kIG1heSBuZWVkIHRvIGJlIHJ1bi4KLQkgKiBGb3IgdmFsdWUgMiAoRGV2aWNlIFdha2UpIGlmIF9QUlcgZXhpc3RzLCB0aGUgX1BTMCBtZXRob2QgbWF5IG5lZWQgdG8gYmUgcnVuLgorCSAqIEZvciB2YWx1ZSAyIChEZXZpY2UgV2FrZSkgaWYgX1BSVyBleGlzdHMsIHRoZSBfUFMwIG1ldGhvZCBtYXkgbmVlZAorCSAqICAgdG8gYmUgcnVuLgogCSAqIEZvciB2YWx1ZSAweDgwIChTdGF0dXMgQ2hhbmdlKSBvbiB0aGUgcG93ZXIgYnV0dG9uIG9yIHNsZWVwIGJ1dHRvbiwKLQkgKiBpbml0aWF0ZSBzb2Z0LW9mZiBvciBzbGVlcCBvcGVyYXRpb24/CisJICogICBpbml0aWF0ZSBzb2Z0LW9mZiBvciBzbGVlcCBvcGVyYXRpb24/CiAJICovCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKIAkJIkRpc3BhdGNoaW5nIE5vdGlmeSglWCkgb24gbm9kZSAlcFxuIiwgbm90aWZ5X3ZhbHVlLCBub2RlKSk7CkBAIC0xNDAsOCArMTU2LDkgQEAKIAkJCQlhY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tub3RpZnlfdmFsdWVdKSk7CiAJfQogCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTm90aWZ5IHZhbHVlOiAweCUyLjJYICoqRGV2aWNlIFNwZWNpZmljKipcbiIsCi0JCQkJbm90aWZ5X3ZhbHVlKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCQkiTm90aWZ5IHZhbHVlOiAweCUyLjJYICoqRGV2aWNlIFNwZWNpZmljKipcbiIsCisJCQlub3RpZnlfdmFsdWUpKTsKIAl9CiAKIAkvKiBHZXQgdGhlIG5vdGlmeSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5TIE5vZGUgKi8KQEAgLTIxMCw3ICsyMjcsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaAogICoKLSAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgICAgICAgLSBUbyBiZSBwYXNzc2VkIHRvIHRoZSBub3RpZnkgaGFuZGxlcgorICogUEFSQU1FVEVSUzogIENvbnRleHQgICAgICAgICAtIFRvIGJlIHBhc3NlZCB0byB0aGUgbm90aWZ5IGhhbmRsZXIKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZS4KICAqCkBAIC0yMTksNyArMjM2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEFDUElfU1lTVEVNX1hGQUNFCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQogYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCiB7CkBAIC0yMzQsNyArMjUxLDggQEAKIAogCS8qCiAJICogV2Ugd2lsbCBpbnZva2UgYSBnbG9iYWwgbm90aWZ5IGhhbmRsZXIgaWYgaW5zdGFsbGVkLgotCSAqIFRoaXMgaXMgZG9uZSBfYmVmb3JlXyB3ZSBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciBhdHRhY2hlZCB0byB0aGUgZGV2aWNlLgorCSAqIFRoaXMgaXMgZG9uZSBfYmVmb3JlXyB3ZSBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciBhdHRhY2hlZAorCSAqIHRvIHRoZSBkZXZpY2UuCiAJICovCiAJaWYgKG5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkgewogCQkvKiBHbG9iYWwgc3lzdGVtIG5vdGlmaWNhdGlvbiBoYW5kbGVyICovCkBAIC0yNTYsMTUgKzI3NCwxNyBAQAogCS8qIEludm9rZSB0aGUgc3lzdGVtIGhhbmRsZXIgZmlyc3QsIGlmIHByZXNlbnQgKi8KIAogCWlmIChnbG9iYWxfaGFuZGxlcikgewotCQlnbG9iYWxfaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLCBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLCBnbG9iYWxfY29udGV4dCk7CisJCWdsb2JhbF9oYW5kbGVyIChub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsIG5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUsCisJCQlnbG9iYWxfY29udGV4dCk7CiAJfQogCiAJLyogTm93IGludm9rZSB0aGUgcGVyLWRldmljZSBoYW5kbGVyLCBpZiBwcmVzZW50ICovCiAKIAloYW5kbGVyX29iaiA9IG5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmo7CiAJaWYgKGhhbmRsZXJfb2JqKSB7Ci0JCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLCBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAotCQkJCSAgaGFuZGxlcl9vYmotPm5vdGlmeS5jb250ZXh0KTsKKwkJaGFuZGxlcl9vYmotPm5vdGlmeS5oYW5kbGVyIChub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsCisJCQlub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAorCQkJaGFuZGxlcl9vYmotPm5vdGlmeS5jb250ZXh0KTsKIAl9CiAKIAkvKiBBbGwgZG9uZSB3aXRoIHRoZSBpbmZvIG9iamVjdCAqLwpAQCAtMzcwLDcgKzM5MCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIgKHZvaWQpCithY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlciAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIApAQCAtMzgwLDcgKzQwMSw3IEBACiAKIAlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gVFJVRTsKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoQUNQSV9FVkVOVF9HTE9CQUwsCi0JCQkgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwgTlVMTCk7CisJCQkgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyLCBOVUxMKTsKIAogCS8qCiAJICogSWYgdGhlIGdsb2JhbCBsb2NrIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcGxhdGZvcm0sIHRoZSBhdHRlbXB0CkBAIC00MzMsOCArNDU0LDEwIEBACiAKIAlhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQrKzsKIAotCS8qIElmIHdlIChPUyBzaWRlIHZzLiBCSU9TIHNpZGUpIGhhdmUgdGhlIGhhcmR3YXJlIGxvY2sgYWxyZWFkeSwgd2UgYXJlIGRvbmUgKi8KLQorCS8qCisJICogSWYgd2UgKE9TIHNpZGUgdnMuIEJJT1Mgc2lkZSkgaGF2ZSB0aGUgaGFyZHdhcmUgbG9jayBhbHJlYWR5LAorCSAqIHdlIGFyZSBkb25lCisJICovCiAJaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KQEAgLTQ4MCw3ICs1MDMsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAodm9pZCkKK2FjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoCisJdm9pZCkKIHsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBGQUxTRTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwpAQCAtNDkwLDcgKzUxNCw4IEBACiAKIAogCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50KSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJDYW5ub3QgcmVsZWFzZSBIVyBHbG9iYWwgTG9jaywgaXQgaGFzIG5vdCBiZWVuIGFjcXVpcmVkXG4iKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKAorCQkJIkNhbm5vdCByZWxlYXNlIEhXIEdsb2JhbCBMb2NrLCBpdCBoYXMgbm90IGJlZW4gYWNxdWlyZWRcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfQUNRVUlSRUQpOwogCX0KIApAQCAtNTE1LDcgKzU0MCw4IEBACiAJICogcmVnaXN0ZXIKIAkgKi8KIAlpZiAocGVuZGluZykgewotCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwgMSwgQUNQSV9NVFhfTE9DSyk7CisJCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19SRUxFQVNFLAorCQkJCSAxLCBBQ1BJX01UWF9MT0NLKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC01MzUsNyArNTYxLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfZXZfdGVybWluYXRlICh2b2lkKQorYWNwaV9ldl90ZXJtaW5hdGUgKAorCXZvaWQpCiB7CiAJYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwpAQCAtNTU1LDcgKzU4Miw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9GSVhFRF9FVkVOVFM7IGkrKykgewogCQkJc3RhdHVzID0gYWNwaV9kaXNhYmxlX2V2ZW50ICgodTMyKSBpLCAwKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBkaXNhYmxlIGZpeGVkIGV2ZW50ICVkXG4iLCAodTMyKSBpKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCSJDb3VsZCBub3QgZGlzYWJsZSBmaXhlZCBldmVudCAlZFxuIiwgKHUzMikgaSkpOwogCQkJfQogCQl9CiAKQEAgLTU2Nyw3ICs1OTUsOCBAQAogCiAJCXN0YXR1cyA9IGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlclxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkNvdWxkIG5vdCByZW1vdmUgU0NJIGhhbmRsZXJcbiIpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCmluZGV4IDc3MjM0MjcuLmExZDcyNzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCkBAIC01OCw2ICs1OCwyMiBAQAogCQkJIEFDUElfQURSX1NQQUNFX1BDSV9DT05GSUcsCiAJCQkgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRX07CiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X3JlZ19ydW4gKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNzksOCArMTk1LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QKICAqCi0gKiBQQVJBTUVURVJTOiAgcmVnaW9uX29iaiAgICAgICAgICAtIE9iamVjdCBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gUGFzc2VkIHRvIF9SRUc6ICBPbiAoMSkgb3IgT2ZmICgwKQorICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBSZWdpb24gb2JqZWN0CisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFBhc3NlZCB0byBfUkVHOiBPbiAoMSkgb3IgT2ZmICgwKQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zMjMsMTQgKzMzOSwxNiBAQAogCQlpZiAoIXJlZ2lvbl9zZXR1cCkgewogCQkJLyogTm8gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgZXhpdCB3aXRoIGVycm9yICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gaW5pdCByb3V0aW5lIGZvciByZWdpb24oJXApIFslc11cbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiTm8gaW5pdCByb3V0aW5lIGZvciByZWdpb24oJXApIFslc11cbiIsCiAJCQkJcmVnaW9uX29iaiwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKIAkJfQogCiAJCS8qCi0JCSAqIFdlIG11c3QgZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgcmVnaW9uIHNldHVwIHdpbGwgcG90ZW50aWFsbHkKLQkJICogZXhlY3V0ZSBjb250cm9sIG1ldGhvZHMgKGUuZy4sIF9SRUcgbWV0aG9kIGZvciB0aGlzIHJlZ2lvbikKKwkJICogV2UgbXVzdCBleGl0IHRoZSBpbnRlcnByZXRlciBiZWNhdXNlIHRoZSByZWdpb24KKwkJICogc2V0dXAgd2lsbCBwb3RlbnRpYWxseSBleGVjdXRlIGNvbnRyb2wgbWV0aG9kcworCQkgKiAoZS5nLiwgX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uKQogCQkgKi8KIAkJYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOwogCkBAIC02MjEsNyArNjM5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2luc3RhbGxfaGFuZGxlciAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCkBAIC04NDgsNyArODY2LDggQEAKIAkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGFuZGxlciA9PSBoYW5kbGVyKSB7CiAJCQkJCS8qCiAJCQkJCSAqIEl0IGlzIChyZWxhdGl2ZWx5KSBPSyB0byBhdHRlbXB0IHRvIGluc3RhbGwgdGhlIFNBTUUKLQkJCQkJICogaGFuZGxlciB0d2ljZS4gVGhpcyBjYW4gZWFzaWx5IGhhcHBlbiB3aXRoIFBDSV9Db25maWcgc3BhY2UuCisJCQkJCSAqIGhhbmRsZXIgdHdpY2UuIFRoaXMgY2FuIGVhc2lseSBoYXBwZW4KKwkJCQkJICogd2l0aCBQQ0lfQ29uZmlnIHNwYWNlLgogCQkJCQkgKi8KIAkJCQkJc3RhdHVzID0gQUVfU0FNRV9IQU5ETEVSOwogCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTEwMTEsNyArMTAzMCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9ldl9yZWdfcnVuICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwppbmRleCA0OTgzYTMzLi45NWJjMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCkBAIC02MSw3ICs2MSw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcsIGEgbm9wIGZvciBub3cKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHN5c3RlbV9tZW1vcnkgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTExNSw3ICsxMTUsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRG8gYW55IHByZXAgd29yayBmb3IgcmVnaW9uIGhhbmRsaW5nCisgKiBERVNDUklQVElPTjogU2V0dXAgYSBJTyBvcGVyYXRpb24gcmVnaW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTQ0LDE0ICsxNDQsMTQgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cAogICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgLSBSZWdpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCiAgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFN0YXJ0IG9yIHN0b3AKICAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gQWRkcmVzcyBzcGFjZSBoYW5kbGVyIGNvbnRleHQKICAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUmVnaW9uIHNwZWNpZmljIGNvbnRleHQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IFNldHVwIGEgUENJX0NvbmZpZyBvcGVyYXRpb24gcmVnaW9uCiAgKgogICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIG5vdCBsb2NrZWQKICAqCkBAIC0zMjQsNyArMzI0LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IFNldHVwIGEgcGNpX2JBUiBvcGVyYXRpb24gcmVnaW9uCiAgKgogICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIG5vdCBsb2NrZWQKICAqCkBAIC0zNTUsNyArMzU1LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IFNldHVwIGEgQ01PUyBvcGVyYXRpb24gcmVnaW9uCiAgKgogICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIG5vdCBsb2NrZWQKICAqCkBAIC0zODYsNyArMzg2LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IERlZmF1bHQgcmVnaW9uIGluaXRpYWxpemF0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCmluZGV4IDQ2YjMxOTkuLmYzMTIzYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKQEAgLTQ5LDYgKzQ5LDEyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2c2NpIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyIEFDUElfU1lTVEVNX1hGQUNFCithY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyICgKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE0Niw3ICsxNTIsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdTMyCi1hY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKHZvaWQpCithY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKAorCXZvaWQpCiB7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKIApAQCAtMTgwLDcgKzE4Nyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIgKHZvaWQpCithY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlciAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwppbmRleCAwYmZlYzEwLi40MDkyZDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwpAQCAtNjQsNiArNjQsNyBAQAogICogREVTQ1JJUFRJT046IFNhdmVzIHRoZSBwb2ludGVyIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyICgKQEAgLTQ1Nyw3ICs0NTgsOCBAQAogCS8qIFJvb3QgT2JqZWN0ICovCiAKIAlpZiAoZGV2aWNlID09IEFDUElfUk9PVF9PQkpFQ1QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlJlbW92aW5nIG5vdGlmeSBoYW5kbGVyIGZvciBST09UIG9iamVjdC5cbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKKwkJCSJSZW1vdmluZyBub3RpZnkgaGFuZGxlciBmb3IgUk9PVCBvYmplY3QuXG4iKSk7CiAKIAkJaWYgKCgoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSAmJgogCQkJICAhYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSAgICAgIHx8CkBAIC01NjQsOCArNTY2LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9udW1iZXIgICAgICAtIFRoZSBHUEUgbnVtYmVyIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgIC0gR1BFIGJsb2NrIChOVUxMID09IEZBRFQgR1BFcykKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBOYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIEdQRSAoTlVMTCBmb3IgRkFEVAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgR1BFcykKKyAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBUaGUgR1BFIG51bWJlciB3aXRoaW4gdGhlIEdQRSBibG9jawogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFdoZXRoZXIgdGhpcyBHUEUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLSBvciBsZXZlbC10cmlnZ2VyZWQgaW50ZXJydXB0LgogICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKQEAgLTY2Miw4ICs2NjUsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcgogICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfbnVtYmVyICAgICAgLSBUaGUgZXZlbnQgdG8gcmVtb3ZlIGEgaGFuZGxlcgotICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAtIEdQRSBibG9jayAoTlVMTCA9PSBGQURUIEdQRXMpCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBHUEUgKE5VTEwgZm9yIEZBRFQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIEdQRXMpCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gVGhlIGV2ZW50IHRvIHJlbW92ZSBhIGhhbmRsZXIKICAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNzY2LDcgKzc3MCw4IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrCiAgKgogICogUEFSQU1FVEVSUzogIFRpbWVvdXQgICAgICAgICAtIEhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0Ci0gKiAgICAgICAgICAgICAgb3V0X2hhbmRsZSAgICAgIC0gQSBoYW5kbGUgdG8gdGhlIGxvY2sgaWYgYWNxdWlyZWQKKyAqICAgICAgICAgICAgICBIYW5kbGUgICAgICAgICAgLSBXaGVyZSB0aGUgaGFuZGxlIHRvIHRoZSBsb2NrIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGFjcXVpcmVkKQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC04MTIsNyArODE3LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFJlbGVhc2UgdGhlIEFDUEkgR2xvYmFsIExvY2sKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBBQ1BJIEdsb2JhbCBMb2NrLiBUaGUgaGFuZGxlIG11c3QgYmUgdmFsaWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCmluZGV4IGZhOGQ1ZjIuLmYzMzdkYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKQEAgLTY0LDcgKzY0LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZSAodm9pZCkKK2FjcGlfZW5hYmxlICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTkxLDcgKzkyLDggQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJUcmFuc2l0aW9uIHRvIEFDUEkgbW9kZSBzdWNjZXNzZnVsXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCisJCQkiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTEwNiwxMiArMTA4LDEzIEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIExFR0FDWSBtb2RlLgorICogREVTQ1JJUFRJT046IFRyYW5zZmVycyB0aGUgc3lzdGVtIGludG8gTEVHQUNZIChub24tQUNQSSkgbW9kZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kaXNhYmxlICh2b2lkKQorYWNwaV9kaXNhYmxlICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTEyNSw3ICsxMjgsOCBAQAogCX0KIAogCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gQUNQSV9TWVNfTU9ERV9MRUdBQ1kpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwgIlN5c3RlbSBpcyBhbHJlYWR5IGluIGxlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwKKwkJCSJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBsZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7CiAJfQogCWVsc2UgewogCQkvKiBUcmFuc2l0aW9uIHRvIExFR0FDWSBtb2RlICovCkBAIC0xMzMsNyArMTM3LDggQEAKIAkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZSAoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOwogCiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGV4aXQgQUNQSSBtb2RlIHRvIGxlZ2FjeSBtb2RlIikpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkNvdWxkIG5vdCBleGl0IEFDUEkgbW9kZSB0byBsZWdhY3kgbW9kZSIpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCkBAIC0yMTQsNyArMjE5LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCisgKiBERVNDUklQVElPTjogU2V0IHRoZSB0eXBlIG9mIGFuIGluZGl2aWR1YWwgR1BFCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNTE5LDEzICs1MjQsMTIgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZXZlbnRfc3RhdHVzCiAgKgogICogUEFSQU1FVEVSUzogIEV2ZW50ICAgICAgICAgICAtIFRoZSBmaXhlZCBldmVudAotICogICAgICAgICAgICAgIEV2ZW50IFN0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAorICogICAgICAgICAgICAgIGV2ZW50X3N0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNTcxLDcgKzU3NSw3IEBACiAgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UKICAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKICAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgLSBDYWxsZWQgZnJvbSBhbiBJU1Igb3Igbm90Ci0gKiAgICAgICAgICAgICAgRXZlbnQgU3RhdHVzICAgIC0gV2hlcmUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudCB3aWxsCisgKiAgICAgICAgICAgICAgZXZlbnRfc3RhdHVzICAgIC0gV2hlcmUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudCB3aWxsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC03NzUsNCArNzc5LDUgQEAKIAkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfYmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYwppbmRleCBhYzNjMDYxLi43MzRiMmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYwpAQCAtNTQsNiArNTQsMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGNvbmZpZyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X2FkZF90YWJsZSAoCisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGUsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRkYl9oYW5kbGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzAsNyArNzgsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfYWRkX3RhYmxlICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZSwKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwKQEAgLTk1LDEwICsxMDMsMTAgQEAKIAogCUFDUElfTUVNU0VUICgmdGFibGVfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CiAKLQl0YWJsZV9pbmZvLnR5cGUgICAgICAgID0gQUNQSV9UQUJMRV9TU0RUOwotCXRhYmxlX2luZm8ucG9pbnRlciAgICAgPSB0YWJsZTsKLQl0YWJsZV9pbmZvLmxlbmd0aCAgICAgID0gKGFjcGlfc2l6ZSkgdGFibGUtPmxlbmd0aDsKLQl0YWJsZV9pbmZvLmFsbG9jYXRpb24gID0gQUNQSV9NRU1fQUxMT0NBVEVEOworCXRhYmxlX2luZm8udHlwZSAgICAgID0gQUNQSV9UQUJMRV9TU0RUOworCXRhYmxlX2luZm8ucG9pbnRlciAgID0gdGFibGU7CisJdGFibGVfaW5mby5sZW5ndGggICAgPSAoYWNwaV9zaXplKSB0YWJsZS0+bGVuZ3RoOworCXRhYmxlX2luZm8uYWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKIAogCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSAoJnRhYmxlX2luZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTIyNiwxMSArMjM0LDEwIEBACiAJCQlzdGFydF9ub2RlID0gcGFyZW50X25vZGU7CiAJCX0KIAotCQkvKgotCQkgKiBGaW5kIHRoZSBub2RlIHJlZmVyZW5jZWQgYnkgdGhlIHBhcmFtZXRlcl9wYXRoX3N0cmluZwotCQkgKi8KKwkJLyogRmluZCB0aGUgbm9kZSByZWZlcmVuY2VkIGJ5IHRoZSBwYXJhbWV0ZXJfcGF0aF9zdHJpbmcgKi8KKwogCQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLCBzdGFydF9ub2RlLAotCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgJnBhcmFtZXRlcl9ub2RlKTsKKwkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyYW1ldGVyX25vZGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTI0OCw3ICsyNTUsOCBAQAogCWlmIChwYXJhbWV0ZXJfbm9kZSkgewogCQkvKiBTdG9yZSB0aGUgcGFyYW1ldGVyIGRhdGEgaW50byB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIG9iamVjdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKG9wZXJhbmRbNV0sIEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHBhcmFtZXRlcl9ub2RlKSwKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAob3BlcmFuZFs1XSwKKwkJCQkgQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgcGFyYW1ldGVyX25vZGUpLAogCQkJCSB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJKHZvaWQpIGFjcGlfZXhfdW5sb2FkX3RhYmxlIChkZGJfaGFuZGxlKTsKQEAgLTM3MSw3ICszNzksOCBAQAogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLCBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOworCQl0YWJsZV9wdHIgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCisJCQkJICBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOwogCiAJCSAvKiBTYW5pdHkgY2hlY2sgdGhlIHRhYmxlIGxlbmd0aCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCmluZGV4IGRmN2JhMTIuLjk3ODU2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCkBAIC01MCw2ICs1MCwxNSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4Y29udnJ0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyCithY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAorCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTUsOSArMTI0LDggQEAKIAkgKi8KIAlyZXN1bHQgPSAwOwogCi0JLyoKLQkgKiBTdHJpbmcgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgdGhhbiBCdWZmZXIgY29udmVyc2lvbgotCSAqLworCS8qIFN0cmluZyBjb252ZXJzaW9uIGlzIGRpZmZlcmVudCB0aGFuIEJ1ZmZlciBjb252ZXJzaW9uICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKQEAgLTE2OCw5ICsxNzYsOCBAQAogCQlicmVhazsKIAl9CiAKLQkvKgotCSAqIENyZWF0ZSBhIG5ldyBpbnRlZ2VyCi0JICovCisJLyogQ3JlYXRlIGEgbmV3IGludGVnZXIgKi8KKwogCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CiAJaWYgKCFyZXR1cm5fZGVzYykgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CkBAIC0yNTEsNyArMjU4LDggQEAKIAkJICogQVNML0FNTCBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgbnVsbCBiZWluZyB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3CiAJCSAqIGJ1ZmZlci4KIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoKGFjcGlfc2l6ZSkgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKKwkJCQkgIChhY3BpX3NpemUpIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtMjkxLDcgKzI5OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCitzdGF0aWMgdTMyCiBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCkBAIC0zNTcsOCArMzY1LDkgQEAKIAogCWNhc2UgMTY6CiAKLQkJaGV4X2xlbmd0aCA9IEFDUElfTVVMXzIgKGRhdGFfd2lkdGgpOyAvKiAyIGFzY2lpIGhleCBjaGFycyBwZXIgZGF0YSBieXRlICovCisJCS8qIGhleF9sZW5ndGg6IDIgYXNjaWkgaGV4IGNoYXJzIHBlciBkYXRhIGJ5dGUgKi8KIAorCQloZXhfbGVuZ3RoID0gQUNQSV9NVUxfMiAoZGF0YV93aWR0aCk7CiAJCWZvciAoaSA9IDAsIGogPSAoaGV4X2xlbmd0aC0xKTsgaSA8IGhleF9sZW5ndGg7IGkrKywgai0tKSB7CiAJCQkvKiBHZXQgb25lIGhleCBkaWdpdCwgbW9zdCBzaWduaWZpY2FudCBkaWdpdHMgZmlyc3QgKi8KIApAQCAtNDc1LDcgKzQ4NCw3IEBACiAJCS8qIFNldHVwIHN0cmluZyBsZW5ndGgsIGJhc2UsIGFuZCBzZXBhcmF0b3IgKi8KIAogCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDogLyogVXNlZCBieSB0b19kZWNpbWFsX3N0cmluZyBvcGVyYXRvciAqLworCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9ERUNJTUFMOiAvKiBVc2VkIGJ5IHRvX2RlY2ltYWxfc3RyaW5nICovCiAJCQkvKgogCQkJICogRnJvbSBBQ1BJOiAiSWYgRGF0YSBpcyBhIGJ1ZmZlciwgaXQgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIG9mCiAJCQkgKiBkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKQEAgLTUwOSw3ICs1MTgsNyBAQAogCQkJc3RyaW5nX2xlbmd0aCA9IChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCAqIDMpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfSEVYOiAgICAgLyogVXNlZCBieSB0b19oZXhfc3RyaW5nIG9wZXJhdG9yICovCisJCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWDogICAgIC8qIFVzZWQgYnkgdG9faGV4X3N0cmluZyAqLwogCQkJLyoKIAkJCSAqIEZyb20gQUNQSTogIklmIERhdGEgaXMgYSBidWZmZXIsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgogCQkJICogaGV4YWRlY2ltYWwgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMuIgpAQCAtNTMwLDkgKzUzOSw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9TVFJJTkdfTElNSVQpOwogCQl9CiAKLQkJLyoKLQkJICogQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgYW5kIHN0cmluZyBidWZmZXIKLQkJICovCisJCS8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyICovCisKIAkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwpAQCAtNTUxLDggKzU1OSwxMCBAQAogCQkJKm5ld19idWYrKyA9IHNlcGFyYXRvcjsgLyogZWFjaCBzZXBhcmF0ZWQgYnkgYSBjb21tYSBvciBzcGFjZSAqLwogCQl9CiAKLQkJLyogTnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAob3ZlcndyaXRlcyBmaW5hbCBjb21tYS9zcGFjZSBmcm9tIGFib3ZlKSAqLwotCisJCS8qCisJCSAqIE51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcKKwkJICogKG92ZXJ3cml0ZXMgZmluYWwgY29tbWEvc3BhY2UgZnJvbSBhYm92ZSkKKwkJICovCiAJCW5ld19idWYtLTsKIAkJKm5ld19idWYgPSAwOwogCQlicmVhazsKQEAgLTY0NSw3ICs2NTUsNiBAQAogCiAKIAkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCiAJCQkvKgogCQkJICogVGhlIG9wZXJhbmQgbXVzdCBiZSBhIFN0cmluZy4gIFdlIGNhbiBjb252ZXJ0IGFuCiAJCQkgKiBJbnRlZ2VyIG9yIEJ1ZmZlciBpZiBuZWNlc3NhcnkKQEAgLTY1Niw3ICs2NjUsNiBAQAogCiAKIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCiAJCQkvKgogCQkJICogVGhlIG9wZXJhbmQgbXVzdCBiZSBhIEJ1ZmZlci4gIFdlIGNhbiBjb252ZXJ0IGFuCiAJCQkgKiBJbnRlZ2VyIG9yIFN0cmluZyBpZiBuZWNlc3NhcnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKaW5kZXggZDk0YzI2MC4uODEyY2RjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9hbGlhcwogICoKQEAgLTY1LDcgKzY1LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG5hbWVkIGFsaWFzCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfYWxpYXMgKApAQCAtMTQwLDggKzE0MCw3IEBACiAJCSAqIHRhcmdldCBub2RlIG9yIHRoZSBhbGlhcyBOb2RlCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKGFsaWFzX25vZGUsCi0JCQkJIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAodGFyZ2V0X25vZGUpLAotCQkJCSB0YXJnZXRfbm9kZS0+dHlwZSk7CisJCQkJIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAodGFyZ2V0X25vZGUpLCB0YXJnZXRfbm9kZS0+dHlwZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTUxLDcgKzE1MCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9ldmVudAogICoKQEAgLTE2MSw3ICsxNjAsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgZXZlbnQgb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfZXZlbnQgKApAQCAtMTg1LDcgKzE4NCw3IEBACiAJICogdGhhdCB0aGUgZXZlbnQgaXMgY3JlYXRlZCBpbiBhbiB1bnNpZ25hbGxlZCBzdGF0ZQogCSAqLwogCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoQUNQSV9OT19VTklUX0xJTUlULCAwLAotCQkJICAgJm9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUpOworCQkJICZvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0xOTMsNyArMTkyLDcgQEAKIAkvKiBBdHRhY2ggb2JqZWN0IHRvIHRoZSBOb2RlICovCiAKIAlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKLQkJCSAgIG9ial9kZXNjLCBBQ1BJX1RZUEVfRVZFTlQpOworCQkJIG9ial9kZXNjLCBBQ1BJX1RZUEVfRVZFTlQpOwogCiBjbGVhbnVwOgogCS8qCkBAIC0yMDUsNyArMjA0LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX211dGV4CiAgKgpAQCAtMjE3LDcgKzIxNiw3IEBACiAgKgogICogICAgICAgICAgICAgIE11dGV4IChOYW1lWzBdLCBzeW5jX2xldmVsWzFdKQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX211dGV4ICgKQEAgLTI2NywyMCArMjY2LDIwIEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9yZWdpb24KICAqCiAgKiBQQVJBTUVURVJTOiAgYW1sX3N0YXJ0ICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBkZWNsYXJhdGlvbiBBTUwKICAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgICAgIC0gTWF4IGxlbmd0aCBvZiB0aGUgZGVjbGFyYXRpb24gQU1MCi0gKiAgICAgICAgICAgICAgT3BlcmFuZHMgICAgICAgICAgICAtIExpc3Qgb2Ygb3BlcmFuZHMgZm9yIHRoZSBvcGNvZGUKKyAqICAgICAgICAgICAgICByZWdpb25fc3BhY2UgICAgICAgIC0gc3BhY2VfaUQgZm9yIHRoZSByZWdpb24KICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbiByZWdpb24gb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfcmVnaW9uICgKQEAgLTMyMSw3ICszMjAsNyBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJSZWdpb24gVHlwZSAtICVzICglWClcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fc3BhY2UpLCByZWdpb25fc3BhY2UpKTsKKwkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9zcGFjZSksIHJlZ2lvbl9zcGFjZSkpOwogCiAJLyogQ3JlYXRlIHRoZSByZWdpb24gZGVzY3JpcHRvciAqLwogCkBAIC0zNjAsNyArMzU5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbgogICoKQEAgLTM3MCw3ICszNjksNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgZGF0YV90YWJsZV9yZWdpb24gb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uICgKQEAgLTQ1NSw3ICs0NTQsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yCiAgKgpAQCAtNDY3LDcgKzQ2Niw3IEBACiAgKgogICogICAgICAgICAgICAgIFByb2Nlc3NvciAoTmFtZVswXSwgY3B1X2lEWzFdLCBwYmxvY2tfYWRkclsyXSwgcGJsb2NrX2xlbmd0aFszXSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3IgKApAQCAtNDg4LDkgKzQ4Nyw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIHByb2Nlc3NvciBvYmplY3QgZnJvbSB0aGUgb3BlcmFuZHMKLQkgKi8KKwkvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzICovCisKIAlvYmpfZGVzYy0+cHJvY2Vzc29yLnByb2NfaWQgPSAodTgpICAgICAgICAgIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CiAJb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzID0gKGFjcGlfaW9fYWRkcmVzcykgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKIAlvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCA9ICh1OCkgICAgICAgICAgIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWU7CkBAIC01MDcsNyArNTA1LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlCiAgKgpAQCAtNTE5LDcgKzUxNyw3IEBACiAgKgogICogICAgICAgICAgICAgIHBvd2VyX3Jlc291cmNlIChOYW1lWzBdLCBzeXN0ZW1fbGV2ZWxbMV0sIHJlc291cmNlX29yZGVyWzJdKQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlICgKQEAgLTU1NSwxMCArNTUzLDEwIEBACiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQotCiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZAogICoKQEAgLTU3MCw3ICs1NjgsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgbWV0aG9kIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX21ldGhvZCAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKaW5kZXggZTJmN2MzMi4uNDA4NTAwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYwpAQCAtNTEsMjMgKzUxLDQ4IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhkdW1wIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKK3N0YXRpYyB2b2lkCithY3BpX2V4X291dF9zdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKKworc3RhdGljIHZvaWQKK2FjcGlfZXhfb3V0X3BvaW50ZXIgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKKworc3RhdGljIHZvaWQKK2FjcGlfZXhfb3V0X2ludGVnZXIgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworCitzdGF0aWMgdm9pZAorYWNwaV9leF9vdXRfYWRkcmVzcyAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCisJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICB2YWx1ZSk7CisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKwogCiAvKgogICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdXNlZCBmb3IgZGVidWcgb3V0cHV0IG9ubHkKICAqLwogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfb3BlcmFuZAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgdG8gYmUgZHVtcGVkCisgKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgIC0gUG9pbnRlciB0byBlbnRyeSB0byBiZSBkdW1wZWQKKyAqICAgICAgICAgICAgICBEZXB0aCAgICAgICAgICAgLSBDdXJyZW50IG5lc3RpbmcgZGVwdGgKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIGFuIG9wZXJhbmQgb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX2V4X2R1bXBfb3BlcmFuZCAoCkBAIC04Niw5ICsxMTEsOCBAQAogCX0KIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJLyoKLQkJICogVGhpcyBjb3VsZCBiZSBhIG51bGwgZWxlbWVudCBvZiBhIHBhY2thZ2UKLQkJICovCisJCS8qIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlICovCisKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk51bGwgT2JqZWN0IERlc2NyaXB0b3JcbiIpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTExNyw2ICsxNDEsOCBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJXAgIiwgb2JqX2Rlc2MpKTsKIAl9CiAKKwkvKiBEZWNvZGUgb2JqZWN0IHR5cGUgKi8KKwogCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIApAQCAtMjc0LDcgKzMwMCw5IEBACiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCWFjcGlfb3NfcHJpbnRmICgiU3RyaW5nIGxlbmd0aCAlWCBAICVwICIsCi0JCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKKwkJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoLAorCQkJb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKKwogCQlhY3BpX3V0X3ByaW50X3N0cmluZyAob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCBBQ1BJX1VJTlQ4X01BWCk7CiAJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKIAkJYnJlYWs7CkBAIC0yOTAsMTAgKzMxOCwxMyBAQAogCiAJCWFjcGlfb3NfcHJpbnRmICgKIAkJCSJyZWdpb25fZmllbGQ6IEJpdHM9JVggYWNjX3dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKLQkJCW9ial9kZXNjLT5maWVsZC5iaXRfbGVuZ3RoLCBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQlvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwKKwkJCW9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKIAkJCW9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSywKIAkJCW9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLLAotCQkJb2JqX2Rlc2MtPmZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsIG9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJCW9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJb2JqX2Rlc2MtPmZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCiAJCWFjcGlfZXhfZHVtcF9vcGVyYW5kIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiwgZGVwdGgrMSk7CiAJCWJyZWFrOwogCkBAIC0zMDgsMTMgKzMzOSwxNSBAQAogCiAJCWFjcGlfb3NfcHJpbnRmICgKIAkJCSJidWZmZXJfZmllbGQ6ICVYIGJpdHMgYXQgYnl0ZSAlWCBiaXQgJVggb2YgXG4iLAotCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iaXRfbGVuZ3RoLCBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCiAJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwogCiAJCWlmICghb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiKk5VTEwqIFxuIikpOwogCQl9Ci0JCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJZWxzZSBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaikgIT0KKwkJCQkgQUNQSV9UWVBFX0JVRkZFUikgewogCQkJYWNwaV9vc19wcmludGYgKCIqbm90IGEgQnVmZmVyKiBcbiIpOwogCQl9CiAJCWVsc2UgewpAQCAtMzMxLDEwICszNjQsMTAgQEAKIAogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAotCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkiTWV0aG9kKCVYKSBAICVwOiVYXG4iLAorCQlhY3BpX29zX3ByaW50ZiAoIk1ldGhvZCglWCkgQCAlcDolWFxuIiwKIAkJCW9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCi0JCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKKwkJCW9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKIApAQCAtMzc5LDcgKzQxMiw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfb3BlcmFuZHMKICAqCkBAIC0zOTMsNyArNDI2LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogRHVtcCB0aGUgb2JqZWN0IHN0YWNrCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX2V4X2R1bXBfb3BlcmFuZHMgKApAQCAtNDQxLDEwICs0NzQsOSBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3V0KgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3V0KiBmdW5jdGlvbnMKICAqCiAgKiBQQVJBTUVURVJTOiAgVGl0bGUgICAgICAgICAgICAgICAtIERlc2NyaXB0aXZlIHRleHQKICAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgZGlzcGxheWVkCkBAIC00NTMsOSArNDg1LDkgQEAKICAqICAgICAgICAgICAgICByZWR1Y2UgdGhlIG51bWJlciBvZiBmb3JtYXQgc3RyaW5ncyByZXF1aXJlZCBhbmQga2VlcHMgdGhlbQogICogICAgICAgICAgICAgIGFsbCBpbiBvbmUgcGxhY2UgZm9yIGVhc3kgbW9kaWZpY2F0aW9uLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfZXhfb3V0X3N0cmluZyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpCkBAIC00NjMsNyArNDk1LDcgQEAKIAlhY3BpX29zX3ByaW50ZiAoIiUyMHMgOiAlc1xuIiwgdGl0bGUsIHZhbHVlKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfZXhfb3V0X3BvaW50ZXIgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQpAQCAtNDcxLDcgKzUwMyw3IEBACiAJYWNwaV9vc19wcmludGYgKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9pbnRlZ2VyICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQpAQCAtNDc5LDcgKzUxMSw3IEBACiAJYWNwaV9vc19wcmludGYgKCIlMjBzIDogJVhcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9hZGRyZXNzICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKIAlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIHZhbHVlKQpAQCAtNDkzLDE2ICs1MjUsMTYgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9ub2RlCiAgKgogICogUEFSQU1FVEVSUzogICpOb2RlICAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheQorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5IGlmIFRSVUUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcHMgdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuLk5vZGUKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfZXhfZHVtcF9ub2RlICgKQEAgLTUzMSwxNiArNTYzLDE2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IKICAqCiAgKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5CisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkgaWYgVFJVRQogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgbWVtYmVycyBvZiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgZ2l2ZW4uCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKApAQCAtNTUzLDYgKzU4NSwxMCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yIik7CiAKIAorCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCiAJaWYgKCFmbGFncykgewogCQlpZiAoISgoQUNQSV9MVl9PQkpFQ1RTICYgYWNwaV9kYmdfbGV2ZWwpICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewogCQkJcmV0dXJuX1ZPSUQ7CkBAIC03NDcsMTEgKzc4MywxNyBAQAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAogCQlhY3BpX2V4X291dF9pbnRlZ2VyICgidGFyZ2V0X3R5cGUiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlKTsKLQkJYWNwaV9leF9vdXRfc3RyaW5nICgiT3Bjb2RlIiwgICAgICAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpLT5uYW1lKTsKKwkJYWNwaV9leF9vdXRfc3RyaW5nICgiT3Bjb2RlIiwgICAgICAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICgKKwkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSktPm5hbWUpOwogCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiT2Zmc2V0IiwgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7CiAJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJvYmpfZGVzYyIsICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKIAkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5vZGUiLCAgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKTsKIAkJYWNwaV9leF9vdXRfcG9pbnRlciAoIldoZXJlIiwgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7CisKKwkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7CisJCQlhY3BpX29zX3ByaW50ZiAoIlxuUmVmZXJlbmNlZCBPYmplY3Q6XG4iKTsKKwkJCWFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsIGZsYWdzKTsKKwkJfQogCQlicmVhazsKIAogCkBAIC03ODgsNiArODMwLDUgQEAKIH0KIAogI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwppbmRleCBiZTdmMjEyLi4yMmM4ZmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKQEAgLTEyMCw4ICsxMjAsOCBAQAogCQkgKiBOb3RlOiBTbWJ1cyBwcm90b2NvbCB2YWx1ZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbgogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uIChvYmpfZGVzYywgMCwKLQkJCQkgIEFDUElfQ0FTVF9QVFIgKGFjcGlfaW50ZWdlciwgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSwKLQkJCQkgIEFDUElfUkVBRCB8IChvYmpfZGVzYy0+ZmllbGQuYXR0cmlidXRlIDw8IDE2KSk7CisJCQkJIEFDUElfQ0FTVF9QVFIgKGFjcGlfaW50ZWdlciwgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSwKKwkJCQkgQUNQSV9SRUFEIHwgKG9ial9kZXNjLT5maWVsZC5hdHRyaWJ1dGUgPDwgMTYpKTsKIAkJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrIChsb2NrZWQpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTk2LDYgKzE5Niw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBDb250YWlucyBkYXRhIHRvIHdyaXRlCiAgKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBuYW1lZCBmaWVsZAorICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkLCBpZiBhbnkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjUwLDEyICsyNTEsMTUgQEAKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewogCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyLCBmb3VuZCB0eXBlICVzXG4iLAogCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJaWYgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwgQUNQSV9TTUJVU19CVUZGRVJfU0laRSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyIG9mIGxlbmd0aCAlWCwgZm91bmQgbGVuZ3RoICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyIG9mIGxlbmd0aCAlWCwgZm91bmQgbGVuZ3RoICVYXG4iLAogCQkJCUFDUElfU01CVVNfQlVGRkVSX1NJWkUsIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JVRkZFUl9MSU1JVCk7CiAJCX0KIApAQCAtMjY1LDE0ICsyNjksMTYgQEAKIAkJfQogCiAJCWJ1ZmZlciA9IGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJQUNQSV9NRU1DUFkgKGJ1ZmZlciwgc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKKwkJQUNQSV9NRU1DUFkgKGJ1ZmZlciwgc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CiAKIAkJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCiAKIAkJbG9ja2VkID0gYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKIAogCQkvKgotCQkgKiBQZXJmb3JtIHRoZSB3cml0ZSAocmV0dXJucyBzdGF0dXMgYW5kIHBlcmhhcHMgZGF0YSBpbiB0aGUgc2FtZSBidWZmZXIpCisJCSAqIFBlcmZvcm0gdGhlIHdyaXRlIChyZXR1cm5zIHN0YXR1cyBhbmQgcGVyaGFwcyBkYXRhIGluIHRoZQorCQkgKiBzYW1lIGJ1ZmZlcikKIAkJICogTm90ZTogU01CdXMgcHJvdG9jb2wgdHlwZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbi4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAob2JqX2Rlc2MsIDAsCkBAIC0yODQsOSArMjkwLDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCS8qCi0JICogR2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuCi0JICovCisJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCQlidWZmZXIgPSAmc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWU7CkBAIC0zMTQsNyArMzE5LDggQEAKIAkgKiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgogCSAqLwogCW5ld19idWZmZXIgPSBOVUxMOwotCXJlcXVpcmVkX2xlbmd0aCA9IEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKKwlyZXF1aXJlZF9sZW5ndGggPSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKAorCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKIAogCWlmIChsZW5ndGggPCByZXF1aXJlZF9sZW5ndGgpIHsKIAkJLyogV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgYnVmZmVyICovCkBAIC0zMzgsNiArMzQ0LDcgQEAKIAkJImZpZWxkX3dyaXRlIFtGUk9NXTogT2JqICVwICglczolWCksIEJ1ZiAlcCwgYnl0ZV9sZW4gJVhcbiIsCiAJCXNvdXJjZV9kZXNjLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpLAogCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpLCBidWZmZXIsIGxlbmd0aCkpOworCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkiZmllbGRfd3JpdGUgW1RPXTogIE9iaiAlcCAoJXM6JVgpLCBiaXRfbGVuICVYLCBiaXRfb2ZmICVYLCBieXRlX29mZiAlWFxuIiwKIAkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwppbmRleCA5ZDBmOWQyLi4zYzJmODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKQEAgLTUyLDEyICs1MiwzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4ZmxkaW8iKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9maWVsZF9kYXR1bV9pbyAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfd3JpdGUpOworCitzdGF0aWMgdTgKK2FjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfc2V0dXBfcmVnaW9uICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3NldHVwX3JlZ2lvbgogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQgb3Igd3JpdHRlbgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZCBvciB3cml0dGVuCiAgKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBCeXRlIG9mZnNldCBvZiB0aGlzIGRhdHVtIHdpdGhpbiB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCBmaWVsZAogICoKQEAgLTY5LDcgKzg4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3NldHVwX3JlZ2lvbiAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKQEAgLTEyNyw5ICsxNDYsOSBAQAogCSAqIGxlbmd0aCBvZiBvbmUgZmllbGQgZGF0dW0gKGFjY2VzcyB3aWR0aCkgbXVzdCBmaXQgd2l0aGluIHRoZSByZWdpb24uCiAJICogKFJlZ2lvbiBsZW5ndGggaXMgc3BlY2lmaWVkIGluIGJ5dGVzKQogCSAqLwotCWlmIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCA8IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQKLQkJCSAgICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQKLQkJCSAgICsgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpIHsKKwlpZiAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCSAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0ICsKKwkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKSB7CiAJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKIAkJCS8qCiAJCQkgKiBTbGFjayBtb2RlIG9ubHk6ICBXZSB3aWxsIGdvIGFoZWFkIGFuZCBhbGxvdyBhY2Nlc3MgdG8gdGhpcwpAQCAtMTU1LDcgKzE3NCw4IEBACiAJCQkJIkZpZWxkIFslNC40c10gYWNjZXNzIHdpZHRoICglZCBieXRlcykgdG9vIGxhcmdlIGZvciByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKVxuIiwKIAkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSksCiAJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAorCQkJCXJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CiAJCX0KIAogCQkvKgpAQCAtMTY3LDcgKzE4Nyw4IEBACiAJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSksCiAJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCiAJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKwkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwKKwkJCXJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUkVHSU9OX0xJTUlUKTsKIAl9CkBAIC0xODAsMTAgKzIwMSwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjY2Vzc19yZWdpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkCiAgKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBCeXRlIG9mZnNldCBvZiB0aGlzIGRhdHVtIHdpdGhpbiB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCBmaWVsZAotICogICAgICAgICAgICAgICpWYWx1ZSAgICAgICAgICAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdmFsdWUgKG11c3QgYXQgbGVhc3QKKyAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHZhbHVlIChtdXN0IGF0IGxlYXN0CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiBhY3BpX2ludGVnZXIpCiAgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIGZsYWcgcGx1cyBvdGhlciByZWdpb24tCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgZmxhZ3MKQEAgLTIyNiw5ICsyNDcsOSBAQAogCSAqIDMpIFRoZSBjdXJyZW50IG9mZnNldCBpbnRvIHRoZSBmaWVsZAogCSAqLwogCXJnbl9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqOwotCWFkZHJlc3MgPSByZ25fZGVzYy0+cmVnaW9uLmFkZHJlc3MKLQkJCSArIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldAotCQkJICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQ7CisJYWRkcmVzcyA9IHJnbl9kZXNjLT5yZWdpb24uYWRkcmVzcyArCisJCQkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCSBmaWVsZF9kYXR1bV9ieXRlX29mZnNldDsKIAogCWlmICgoZnVuY3Rpb24gJiBBQ1BJX0lPX01BU0spID09IEFDUElfUkVBRCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsICJbUkVBRF0iKSk7CkBAIC0yNDksNyArMjcwLDggQEAKIAkvKiBJbnZva2UgdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3Nfc3BhY2Uvb3BfcmVnaW9uIGhhbmRsZXIgKi8KIAogCXN0YXR1cyA9IGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAocmduX2Rlc2MsIGZ1bmN0aW9uLAotCQkJICBhZGRyZXNzLCBBQ1BJX01VTF84IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSwgdmFsdWUpOworCQkJIGFkZHJlc3MsCisJCQkgQUNQSV9NVUxfOCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCksIHZhbHVlKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfSU1QTEVNRU5URUQpIHsKQEAgLTI3NCw3ICsyOTYsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93CiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgICAgIC0gUmVnaXN0ZXIoRmllbGQpIHRvIGJlIHdyaXR0ZW4KKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIFJlZ2lzdGVyKEZpZWxkKSB0byBiZSB3cml0dGVuCiAgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKICAqCiAgKiBSRVRVUk46ICAgICAgVFJVRSBpZiB2YWx1ZSBvdmVyZmxvd3MgdGhlIGZpZWxkLCBGQUxTRSBvdGhlcndpc2UKQEAgLTI4Nyw3ICszMDksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4CitzdGF0aWMgdTgKIGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUpCkBAIC0zMTksMTAgKzM0MSwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvCiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAogICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKLSAqICAgICAgICAgICAgICAqVmFsdWUgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHZhbHVlIChtdXN0IGJlIDY0IGJpdHMpCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBiZSA2NCBiaXRzKQogICogICAgICAgICAgICAgIHJlYWRfd3JpdGUgICAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBmbGFnCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtMzMzLDcgKzM1NSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9leF9maWVsZF9kYXR1bV9pbyAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKQEAgLTM1MCw3ICszNzIsOSBAQAogCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewogCQlpZiAoIXZhbHVlKSB7CiAJCQlsb2NhbF92YWx1ZSA9IDA7Ci0JCQl2YWx1ZSA9ICZsb2NhbF92YWx1ZTsgLyogVG8gc3VwcG9ydCByZWFkcyB3aXRob3V0IHNhdmluZyByZXR1cm4gdmFsdWUgKi8KKworCQkJLyogVG8gc3VwcG9ydCByZWFkcyB3aXRob3V0IHNhdmluZyByZXR1cm4gdmFsdWUgKi8KKwkJCXZhbHVlID0gJmxvY2FsX3ZhbHVlOwogCQl9CiAKIAkJLyogQ2xlYXIgdGhlIGVudGlyZSByZXR1cm4gYnVmZmVyIGZpcnN0LCBbVmVyeSBJbXBvcnRhbnQhXSAqLwpAQCAtMzYzLDggKzM4NywxMCBAQAogCSAqCiAJICogYnVmZmVyX2ZpZWxkIC0gUmVhZC93cml0ZSBmcm9tL3RvIGEgQnVmZmVyCiAJICogcmVnaW9uX2ZpZWxkIC0gUmVhZC93cml0ZSBmcm9tL3RvIGEgT3BlcmF0aW9uIFJlZ2lvbi4KLQkgKiBiYW5rX2ZpZWxkICAtIFdyaXRlIHRvIGEgQmFuayBSZWdpc3RlciwgdGhlbiByZWFkL3dyaXRlIGZyb20vdG8gYW4gb3BfcmVnaW9uCi0JICogaW5kZXhfZmllbGQgLSBXcml0ZSB0byBhbiBJbmRleCBSZWdpc3RlciwgdGhlbiByZWFkL3dyaXRlIGZyb20vdG8gYSBEYXRhIFJlZ2lzdGVyCisJICogYmFua19maWVsZCAgLSBXcml0ZSB0byBhIEJhbmsgUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGFuCisJICogICAgICAgICAgICAgICBvcGVyYXRpb25fcmVnaW9uCisJICogaW5kZXhfZmllbGQgLSBXcml0ZSB0byBhbiBJbmRleCBSZWdpc3RlciwgdGhlbiByZWFkL3dyaXRlIGZyb20vdG8gYQorCSAqICAgICAgICAgICAgICAgRGF0YSBSZWdpc3RlcgogCSAqLwogCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKQEAgLTM4NCwxOSArNDEwLDIwIEBACiAJCQkgKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBidWZmZXIuCiAJCQkgKiBMZW5ndGggaXMgdGhlIGZpZWxkIHdpZHRoIGluIGJ5dGVzLgogCQkJICovCi0JCQlBQ1BJX01FTUNQWSAodmFsdWUsIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIucG9pbnRlcgotCQkJCQkgICsgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0Ci0JCQkJCSAgKyBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKKwkJCUFDUElfTUVNQ1BZICh2YWx1ZSwKKwkJCQkob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIgKworCQkJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKworCQkJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKIAkJfQogCQllbHNlIHsKIAkJCS8qCiAJCQkgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSB0YXJnZXQgYnVmZmVyLgogCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KIAkJCSAqLwotCQkJQUNQSV9NRU1DUFkgKChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIucG9pbnRlcgotCQkJCQkrIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldAotCQkJCQkrIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJQUNQSV9NRU1DUFkgKChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIucG9pbnRlciArCisJCQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkJCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAogCQkJCQl2YWx1ZSwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CiAJCX0KIApAQCAtNDA2LDggKzQzMywxMCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAotCQkvKiBFbnN1cmUgdGhhdCB0aGUgYmFua192YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZiB0aGUgcmVnaXN0ZXIgKi8KLQorCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgYmFua192YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZgorCQkgKiB0aGUgcmVnaXN0ZXIKKwkJICovCiAJCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93IChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiwKIAkJCQkgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUkVHSVNURVJfTElNSVQpOwpAQCAtNDQ1LDggKzQ3NCwxMCBAQAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCiAKLQkJLyogRW5zdXJlIHRoYXQgdGhlIGluZGV4X3ZhbHVlIGlzIG5vdCBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mIHRoZSByZWdpc3RlciAqLwotCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBpbmRleF92YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZgorCQkgKiB0aGUgcmVnaXN0ZXIKKwkJICovCiAJCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93IChvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAogCQkJCSAgKGFjcGlfaW50ZWdlcikgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUkVHSVNURVJfTElNSVQpOwpAQCAtNDk2LDE0ICs1MjcsMTYgQEAKIAogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsICJWYWx1ZSBSZWFkICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAotCQkJCQkgICBBQ1BJX0ZPUk1BVF9VSU5UNjQgKCp2YWx1ZSksCi0JCQkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKKwkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKCp2YWx1ZSksCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOwogCQl9CiAJCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELCAiVmFsdWUgV3JpdHRlbiAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQkJICAgQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAotCQkJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCisJCQkJIlZhbHVlIFdyaXR0ZW4gJTguOFglOC44WCwgV2lkdGggJWRcbiIsCisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJfQogCX0KIApAQCAtNTE1LDggKzU0OCwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHNldAotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBzdG9yZQorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgd3JpdHRlbgorICogICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICAgIC0gYml0bWFzayB3aXRoaW4gZmllbGQgZGF0dW0KKyAqICAgICAgICAgICAgICBmaWVsZF92YWx1ZSAgICAgICAgICAgICAtIFZhbHVlIHRvIHdyaXRlCisgKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBPZmZzZXQgb2YgZGF0dW0gd2l0aGluIGZpZWxkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY4OSw3ICs3MjQsOCBAQAogCQkvKiBNZXJnZSB3aXRoIHByZXZpb3VzIGRhdHVtIGlmIG5lY2Vzc2FyeSAqLwogCiAJCW1lcmdlZF9kYXR1bSB8PSByYXdfZGF0dW0gPDwKLQkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQkJKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAogCQlpZiAoaSA9PSBkYXR1bV9jb3VudCkgewogCQkJYnJlYWs7CkBAIC03MDcsNyArNzQzLDggQEAKIAogCS8qIE1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIHRoZSBsYXN0IGRhdHVtICovCiAKLQlidWZmZXJfdGFpbF9iaXRzID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICUgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOworCWJ1ZmZlcl90YWlsX2JpdHMgPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggJQorCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOwogCWlmIChidWZmZXJfdGFpbF9iaXRzKSB7CiAJCW1lcmdlZF9kYXR1bSAmPSBBQ1BJX01BU0tfQklUU19BQk9WRSAoYnVmZmVyX3RhaWxfYml0cyk7CiAJfQpAQCAtNzkxLDcgKzgyOCw4IEBACiAJCS8qIFdyaXRlIG1lcmdlZCBkYXR1bSB0byB0aGUgdGFyZ2V0IGZpZWxkICovCiAKIAkJbWVyZ2VkX2RhdHVtICY9IG1hc2s7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsIG1hc2ssIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKKwkJc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlIChvYmpfZGVzYywgbWFzaywKKwkJCQkgbWVyZ2VkX2RhdHVtLCBmaWVsZF9vZmZzZXQpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTgwMCw3ICs4MzgsOCBAQAogCiAJCWZpZWxkX29mZnNldCArPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoOwogCQltZXJnZWRfZGF0dW0gPSByYXdfZGF0dW0gPj4KLQkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQkJKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAkJbWFzayA9IEFDUElfSU5URUdFUl9NQVg7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKQEAgLTgxOSw3ICs4NTgsOCBAQAogCS8qIE1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIHRoZSBsYXN0IGRhdHVtICovCiAKIAlidWZmZXJfdGFpbF9iaXRzID0gKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCArCi0JCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpICUgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOworCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSAlCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOwogCWlmIChidWZmZXJfdGFpbF9iaXRzKSB7CiAJCW1hc2sgJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUgKGJ1ZmZlcl90YWlsX2JpdHMpOwogCX0KQEAgLTgyNyw3ICs4NjcsOCBAQAogCS8qIFdyaXRlIHRoZSBsYXN0IGRhdHVtIHRvIHRoZSBmaWVsZCAqLwogCiAJbWVyZ2VkX2RhdHVtICY9IG1hc2s7Ci0Jc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlIChvYmpfZGVzYywgbWFzaywgbWVyZ2VkX2RhdHVtLCBmaWVsZF9vZmZzZXQpOworCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsCisJCQkgbWFzaywgbWVyZ2VkX2RhdHVtLCBmaWVsZF9vZmZzZXQpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCmluZGV4IGI1NDJkY2QuLjAyMmYyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKQEAgLTEzOSw4ICsxMzksOSBAQAogCXJlZmVyZW5jZV9vYmotPnJlZmVyZW5jZS5vYmplY3QgPSByZWZlcmVuY2VkX29iajsKIAkqcmV0dXJuX2Rlc2MgPSByZWZlcmVuY2Vfb2JqOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCi0JCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCAqcmV0dXJuX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkiT2JqZWN0ICVwIFR5cGUgWyVzXSwgcmV0dXJuaW5nIFJlZmVyZW5jZSAlcFxuIiwKKwkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgKnJldHVybl9kZXNjKSk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTQ1Niw3ICs0NTcsNyBAQAogCQlyZXR1cm4gKGludGVnZXIwICogaW50ZWdlcjEpOwogCiAKLQljYXNlIEFNTF9TSElGVF9MRUZUX09QOiAgICAgICAgIC8qIHNoaWZ0X2xlZnQgKE9wZXJhbmQsIHNoaWZ0X2NvdW50LCBSZXN1bHQpICovCisJY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDogICAgICAgICAvKiBzaGlmdF9sZWZ0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCA8PCBpbnRlZ2VyMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmluZGV4IDY4YzRiYjEuLmMzY2I3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwpAQCAtNDksNiArNDksMTMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG11dGV4IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9saW5rX211dGV4ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTYsNyArNjMsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIHVubGlua2VkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUmVtb3ZlIGEgbXV0ZXggZnJvbSB0aGUgImFjcXVpcmVkX211dGV4IiBsaXN0CiAgKgpAQCAtOTIsMTYgKzk5LDE2IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbGlua19tdXRleAogICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIGxpbmtlZAotICogICAgICAgICAgICAgIGxpc3RfaGVhZCAgICAgICAgICAgLSBoZWFkIG9mIHRoZSAiYWNxdWlyZWRfbXV0ZXgiIGxpc3QKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBUaGUgbXV0ZXggdG8gYmUgbGlua2VkCisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCBleGVjdXRpbmcgdGhyZWFkIG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IEFkZCBhIG11dGV4IHRvIHRoZSAiYWNxdWlyZWRfbXV0ZXgiIGxpc3QgZm9yIHRoaXMgd2FsawogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X2xpbmtfbXV0ZXggKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCkKQEAgLTEzMiw4ICsxMzksOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgICAgICAtIFRoZSAndGltZSB0byBkZWxheScgb2JqZWN0IGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgICAgICAtIFRpbWVvdXQgaW50ZWdlcgorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBNdXRleCBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2QgZXhlY3V0aW9uIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE2MSw3ICsxNjksNyBAQAogCiAJaWYgKCF3YWxrX3N0YXRlLT50aHJlYWQpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IGFjcXVpcmUgTXV0ZXggWyU0LjRzXSwgbnVsbCB0aHJlYWQgaW5mb1xuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCX0KIApAQCAtMTcwLDggKzE3OCw5IEBACiAJICogbXV0ZXguICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBzb21lIGRlYWRsb2NrIHByZXZlbnRpb24KIAkgKi8KIAlpZiAod2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPiBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLAorCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTVVURVhfT1JERVIpOwogCX0KIApAQCAtMTgwLDggKzE4OSwxMCBAQAogCWlmIChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKSB7CiAJCS8qIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2ssIGFsbG93IGFsbCB0aHJlYWRzICovCiAKLQkJaWYgKChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkLT50aHJlYWRfaWQgPT0gd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpIHx8Ci0JCQkob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpKSB7CisJCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkID09CisJCQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpICAgICAgfHwKKwkJCShvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09CisJCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgewogCQkJLyoKIAkJCSAqIFRoZSBtdXRleCBpcyBhbHJlYWR5IG93bmVkIGJ5IHRoaXMgdGhyZWFkLAogCQkJICoganVzdCBpbmNyZW1lbnQgdGhlIGFjcXVpc2l0aW9uIGRlcHRoCkBAIC0yMjEsNiArMjMyLDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlbGVhc2VfbXV0ZXgKICAqCiAgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IG1ldGhvZCBleGVjdXRpb24gc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjc4LDggKzI5MCw5IEBACiAJICogZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3luYyBsZXZlbAogCSAqLwogCWlmIChvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCA+IHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWxcbiIsCisJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9NVVRFWF9PUkRFUik7CiAJfQogCkBAIC0zMTMsMTEgKzMyNiwxMSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgbXV0ZXhfbGlzdCAgICAgICAgICAgIC0gSGVhZCBvZiB0aGUgbXV0ZXggbGlzdAorICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgICAgICAtIEN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZCBvYmplY3QKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFJlbGVhc2UgYWxsIG11dGV4ZXMgaW4gdGhlIGxpc3QKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFsbCBtdXRleGVzIGhlbGQgYnkgdGhpcyB0aHJlYWQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYwppbmRleCA3OTExYzUzLi42MzlmMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKQEAgLTUwLDEzICs1MCwxNyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4bmFtZXMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLS8qIEFNTCBQYWNrYWdlIExlbmd0aCBlbmNvZGluZ3MgKi8KK3N0YXRpYyBjaGFyICoKK2FjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2Vncyk7CiAKLSNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMSAgIDB4NDAKLSNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMiAgIDB4NDAwMAotI2RlZmluZSBBQ1BJX0FNTF9QQUNLQUdFX1RZUEUzICAgMHg0MDAwMDAKLSNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFNCAgIDB4NDAwMDAwMDAKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9uYW1lX3NlZ21lbnQgKAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKippbl9hbWxfYWRkcmVzcywKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3N0cmluZyk7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY0LDcgKzY4LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nCiAgKgogICogUEFSQU1FVEVSUzogIHByZWZpeF9jb3VudCAgICAgICAgLSBDb3VudCBvZiBwYXJlbnQgbGV2ZWxzLiBTcGVjaWFsIGNhc2VzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEpID0gcm9vdCwgIDAgPSBub25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMSk9PXJvb3QsICAwPT1ub25lCiAgKiAgICAgICAgICAgICAgbnVtX25hbWVfc2VncyAgICAgICAtIGNvdW50IG9mIDQtY2hhcmFjdGVyIG5hbWUgc2VnbWVudHMKICAqCiAgKiBSRVRVUk46ICAgICAgQSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3RyaW5nIHNlZ21lbnQuICBUaGlzIHNlZ21lbnQgbXVzdApAQCAtNzUsNyArNzksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNoYXIgKgorc3RhdGljIGNoYXIgKgogYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfY291bnQsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmFtZV9zZWdzKQpAQCAtODgsNyArOTIsNyBAQAogCiAKIAkvKgotCSAqIEFsbG93IHJvb20gZm9yIGFsbCBcIGFuZCBeIHByZWZpeGVzLCBhbGwgc2VnbWVudHMsIGFuZCBhIG11bHRpX25hbWVfcHJlZml4LgorCSAqIEFsbG93IHJvb20gZm9yIGFsbCBcIGFuZCBeIHByZWZpeGVzLCBhbGwgc2VnbWVudHMgYW5kIGEgbXVsdGlfbmFtZV9wcmVmaXguCiAJICogQWxzbywgb25lIGJ5dGUgZm9yIHRoZSBudWxsIHRlcm1pbmF0b3IuCiAJICogVGhpcyBtYXkgYWN0dWFsbHkgYmUgc29tZXdoYXQgbG9uZ2VyIHRoYW4gbmVlZGVkLgogCSAqLwpAQCAtMTA3LDcgKzExMSw4IEBACiAJICovCiAJbmFtZV9zdHJpbmcgPSBBQ1BJX01FTV9BTExPQ0FURSAoc2l6ZV9uZWVkZWQpOwogCWlmICghbmFtZV9zdHJpbmcpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmc6IENvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVkXG4iLCBzaXplX25lZWRlZCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJImV4X2FsbG9jYXRlX25hbWVfc3RyaW5nOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZFxuIiwgc2l6ZV9uZWVkZWQpKTsKIAkJcmV0dXJuX1BUUiAoTlVMTCk7CiAJfQogCkBAIC0xNTIsMTUgKzE1NywxNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X25hbWVfc2VnbWVudAogICoKLSAqIFBBUkFNRVRFUlM6ICBpbnRlcnByZXRlcl9tb2RlICAgIC0gQ3VycmVudCBydW5uaW5nIG1vZGUgKGxvYWQxL0xvYWQyL0V4ZWMpCisgKiBQQVJBTUVURVJTOiAgaW5fYW1sX2FkZHJlc3MgIC0gUG9pbnRlciB0byB0aGUgbmFtZSBpbiB0aGUgQU1MIGNvZGUKKyAqICAgICAgICAgICAgICBuYW1lX3N0cmluZyAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIG5hbWUuIFRoZSBuYW1lIGlzIGFwcGVuZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYW55IGV4aXN0aW5nIHN0cmluZyB0byBmb3JtIGEgbmFtZXBhdGgKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBuYW1lIHNlZ21lbnQgKDQgYnl0ZXMpCisgKiBERVNDUklQVElPTjogRXh0cmFjdCBhbiBBQ1BJIG5hbWUgKDQgYnl0ZXMpIGZyb20gdGhlIEFNTCBieXRlIHN0cmVhbQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfbmFtZV9zZWdtZW50ICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqaW5fYW1sX2FkZHJlc3MsCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmcpCkBAIC0yMjMsMTAgKzIzMCwxMyBAQAogCQlzdGF0dXMgPSBBRV9DVFJMX1BFTkRJTkc7CiAJfQogCWVsc2UgewotCQkvKiBTZWdtZW50IHN0YXJ0ZWQgd2l0aCBvbmUgb3IgbW9yZSB2YWxpZCBjaGFyYWN0ZXJzLCBidXQgZmV3ZXIgdGhhbiA0ICovCi0KKwkJLyoKKwkJICogU2VnbWVudCBzdGFydGVkIHdpdGggb25lIG9yIG1vcmUgdmFsaWQgY2hhcmFjdGVycywgYnV0IGZld2VyIHRoYW4KKwkJICogdGhlIHJlcXVpcmVkIDQKKwkJICovCiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfTkFNRTsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIkJhZCBjaGFyYWN0ZXIgJTAyeCBpbiBuYW1lLCBhdCAlcFxuIiwKIAkJCSphbWxfYWRkcmVzcywgYW1sX2FkZHJlc3MpKTsKIAl9CiAKQEAgLTIzOSwxMSArMjQ5LDE2IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nCiAgKgotICogUEFSQU1FVEVSUzogIGRhdGFfdHlwZSAgICAgICAgICAgLSBEYXRhIHR5cGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZQorICogUEFSQU1FVEVSUzogIGRhdGFfdHlwZSAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lCisgKiAgICAgICAgICAgICAgaW5fYW1sX2FkZHJlc3MgICAgICAtIFBvaW50ZXIgdG8gdGhlIG5hbWVzdHJpbmcgaW4gdGhlIEFNTCBjb2RlCisgKiAgICAgICAgICAgICAgb3V0X25hbWVfc3RyaW5nICAgICAtIFdoZXJlIHRoZSBuYW1lc3RyaW5nIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgb3V0X25hbWVfbGVuZ3RoICAgICAtIExlbmd0aCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFN0YXR1cywgbmFtZXN0cmluZyBhbmQgbGVuZ3RoCiAgKgotICogREVTQ1JJUFRJT046IEdldCBhIG5hbWUsIGluY2x1ZGluZyBhbnkgcHJlZml4ZXMuCisgKiBERVNDUklQVElPTjogRXh0cmFjdCBhIGZ1bGwgbmFtZXBhdGggZnJvbSB0aGUgQU1MIGJ5dGUgc3RyZWFtLAorICogICAgICAgICAgICAgIGluY2x1ZGluZyBhbnkgcHJlZml4ZXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjg2LDcgKzMwMSw4IEBACiAJCXN3aXRjaCAoKmFtbF9hZGRyZXNzKSB7CiAJCWNhc2UgQU1MX1JPT1RfUFJFRklYOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAicm9vdF9wcmVmaXgoXFwpIGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwKKwkJCQlhbWxfYWRkcmVzcykpOwogCiAJCQkvKgogCQkJICogUmVtZW1iZXIgdGhhdCB3ZSBoYXZlIGEgcm9vdF9wcmVmaXggLS0KQEAgLTMwMyw3ICszMTksOCBAQAogCQkJLyogSW5jcmVtZW50IHBhc3QgcG9zc2libHkgbXVsdGlwbGUgcGFyZW50IHByZWZpeGVzICovCiAKIAkJCWRvIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAicGFyZW50X3ByZWZpeCAoXikgYXQgJXBcbiIsIGFtbF9hZGRyZXNzKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInBhcmVudF9wcmVmaXggKF4pIGF0ICVwXG4iLAorCQkJCQlhbWxfYWRkcmVzcykpOwogCiAJCQkJYW1sX2FkZHJlc3MrKzsKIAkJCQlwcmVmaXhfY291bnQrKzsKQEAgLTMyMSwxMyArMzM4LDEzIEBACiAJCQlicmVhazsKIAkJfQogCi0KIAkJLyogRXhhbWluZSBmaXJzdCBjaGFyYWN0ZXIgb2YgbmFtZSBmb3IgbmFtZSBzZWdtZW50IHByZWZpeCBvcGVyYXRvciAqLwogCiAJCXN3aXRjaCAoKmFtbF9hZGRyZXNzKSB7CiAJCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJkdWFsX25hbWVfcHJlZml4IGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgImR1YWxfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJYW1sX2FkZHJlc3MrKzsKIAkJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAocHJlZml4X2NvdW50LCAyKTsKQEAgLTM0OSw3ICszNjYsOCBAQAogCiAJCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAibXVsdGlfbmFtZV9wcmVmaXggYXQgJXBcbiIsIGFtbF9hZGRyZXNzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAibXVsdGlfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJLyogRmV0Y2ggY291bnQgb2Ygc2VnbWVudHMgcmVtYWluaW5nIGluIG5hbWUgcGF0aCAqLwogCkBAIC0zNjgsNyArMzg2LDggQEAKIAkJCWhhc19wcmVmaXggPSBUUlVFOwogCiAJCQl3aGlsZSAobnVtX3NlZ21lbnRzICYmCi0JCQkJCShzdGF0dXMgPSBhY3BpX2V4X25hbWVfc2VnbWVudCAoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZykpID09IEFFX09LKSB7CisJCQkJCShzdGF0dXMgPSBhY3BpX2V4X25hbWVfc2VnbWVudCAoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZykpID09CisJCQkJCQlBRV9PSykgewogCQkJCW51bV9zZWdtZW50cy0tOwogCQkJfQogCkBAIC0zODAsNyArMzk5LDggQEAKIAkJCS8qIG51bGxfbmFtZSB2YWxpZCBhcyBvZiA4LTEyLTk4IEFTTC9BTUwgR3JhbW1hciBVcGRhdGUgKi8KIAogCQkJaWYgKHByZWZpeF9jb3VudCA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAibmFtZV9zZWcgaXMgXCJcXFwiIGZvbGxvd2VkIGJ5IE5VTExcbiIpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJCQkibmFtZV9zZWcgaXMgXCJcXFwiIGZvbGxvd2VkIGJ5IE5VTExcbiIpKTsKIAkJCX0KIAogCQkJLyogQ29uc3VtZSB0aGUgTlVMTCBieXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCmluZGV4IDg0ODJhZWYuLmRiZGY4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCkBAIC05Nyw3ICs5Nyw4IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8wQV8wVF8xUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8wQV8wVF8xUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwpAQCAtMTYxLDcgKzE2Miw4IEBACiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMFRfMFIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMFRfMFIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTIzNiw3ICsyMzgsOCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8xVF8wUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8xVF8wUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwpAQCAtMjg5LDcgKzI5Miw4IEBACiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBkaWdpdDsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMVIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMVIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTQwOSw4ICs0MTMsMTAgQEAKIAkJCWZvciAoaSA9IDA7IChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOyBpKyspIHsKIAkJCQkodm9pZCkgYWNwaV91dF9zaG9ydF9kaXZpZGUgKGRpZ2l0LCAxMCwgJmRpZ2l0LCAmdGVtcDMyKTsKIAotCQkJCS8qIEluc2VydCB0aGUgQkNEIGRpZ2l0IHRoYXQgcmVzaWRlcyBpbiB0aGUgcmVtYWluZGVyIGZyb20gYWJvdmUgKi8KLQorCQkJCS8qCisJCQkJICogSW5zZXJ0IHRoZSBCQ0QgZGlnaXQgdGhhdCByZXNpZGVzIGluIHRoZQorCQkJCSAqIHJlbWFpbmRlciBmcm9tIGFib3ZlCisJCQkJICovCiAJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgfD0gKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpIDw8CiAJCQkJCQkgICBBQ1BJX01VTF80IChpKSk7CiAJCQl9CkBAIC00NDUsNyArNDUxLDggQEAKIAogCQkJLyogR2V0IHRoZSBvYmplY3QgcmVmZXJlbmNlLCBzdG9yZSBpdCwgYW5kIHJlbW92ZSBvdXIgcmVmZXJlbmNlICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYzIsIHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9leF9nZXRfb2JqZWN0X3JlZmVyZW5jZSAob3BlcmFuZFswXSwKKwkJCQkJICZyZXR1cm5fZGVzYzIsIHdhbGtfc3RhdGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KQEAgLTQ4MiwxMCArNDg5LDEwIEBACiAKIAkJaWYgKCF3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CiAJCQkvKgotCQkJICogTm9ybWFsbHksIHdlIHdvdWxkIHJlbW92ZSBhIHJlZmVyZW5jZSBvbiB0aGUgT3BlcmFuZFswXSBwYXJhbWV0ZXI7Ci0JCQkgKiBCdXQgc2luY2UgaXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdAotCQkJICogKG1lYW5pbmcgd2Ugd291bGQgbm9ybWFsbHkgaW5jcmVtZW50IGl0KSwgdGhlIHR3byBjYW5jZWwgb3V0LAotCQkJICogYW5kIHdlIHNpbXBseSBkb24ndCBkbyBhbnl0aGluZy4KKwkJCSAqIE5vcm1hbGx5LCB3ZSB3b3VsZCByZW1vdmUgYSByZWZlcmVuY2Ugb24gdGhlIE9wZXJhbmRbMF0KKwkJCSAqIHBhcmFtZXRlcjsgQnV0IHNpbmNlIGl0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIGludGVybmFsIHJldHVybgorCQkJICogb2JqZWN0IChtZWFuaW5nIHdlIHdvdWxkIG5vcm1hbGx5IGluY3JlbWVudCBpdCksIHRoZSB0d28KKwkJCSAqIGNhbmNlbCBvdXQsIGFuZCB3ZSBzaW1wbHkgZG9uJ3QgZG8gYW55dGhpbmcuCiAJCQkgKi8KIAkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBvcGVyYW5kWzBdOwogCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOyAvKiBQcmV2ZW50IGRlbGV0aW9uICovCkBAIC01NDksOSArNTU2LDggQEAKIAljYXNlIEFNTF9TSElGVF9MRUZUX0JJVF9PUDogICAgIC8qIHNoaWZ0X2xlZnRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCiAJY2FzZSBBTUxfU0hJRlRfUklHSFRfQklUX09QOiAgICAvKiBzaGlmdF9yaWdodF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KIAotCQkvKgotCQkgKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMKLQkJICovCisJCS8qIFRoZXNlIGFyZSB0d28gb2Jzb2xldGUgb3Bjb2RlcyAqLworCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJIiVzIGlzIG9ic29sZXRlIGFuZCBub3QgaW1wbGVtZW50ZWRcbiIsCiAJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOwpAQCAtNTY4LDkgKzU3NCw4IEBACiAJfQogCiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkvKgotCQkgKiBTdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGNvbXB1dGVkIGFib3ZlIGludG8gdGhlIHRhcmdldCBvYmplY3QKLQkJICovCisJCS8qIFN0b3JlIHRoZSByZXR1cm4gdmFsdWUgY29tcHV0ZWQgYWJvdmUgaW50byB0aGUgdGFyZ2V0IG9iamVjdCAqLworCiAJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKHJldHVybl9kZXNjLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKIAl9CiAKQEAgLTYxNSw3ICs2MjAsOCBAQAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC03MDYsOSArNzEyLDkgQEAKIAogCQkvKgogCQkgKiBOb3RlOiBUaGUgb3BlcmFuZCBpcyBub3QgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHdlIHdhbnQgdG8KLQkJICogZ2V0IHRoZSBhc3NvY2lhdGVkIG9iamVjdCwgbm90IGl0cyB2YWx1ZS4gIEZvciBleGFtcGxlLCB3ZSBkb24ndCB3YW50Ci0JCSAqIHRvIHJlc29sdmUgYSBmaWVsZF91bml0IHRvIGl0cyB2YWx1ZSwgd2Ugd2FudCB0aGUgYWN0dWFsIGZpZWxkX3VuaXQKLQkJICogb2JqZWN0LgorCQkgKiBnZXQgdGhlIGFzc29jaWF0ZWQgb2JqZWN0LCBub3QgaXRzIHZhbHVlLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0CisJCSAqIHdhbnQgdG8gcmVzb2x2ZSBhIGZpZWxkX3VuaXQgdG8gaXRzIHZhbHVlLCB3ZSB3YW50IHRoZSBhY3R1YWwKKwkJICogZmllbGRfdW5pdCBvYmplY3QuCiAJCSAqLwogCiAJCS8qIEdldCB0aGUgdHlwZSBvZiB0aGUgYmFzZSBvYmplY3QgKi8KQEAgLTczOCw3ICs3NDQsOCBAQAogCiAJCS8qIEdldCB0aGUgYmFzZSBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKHdhbGtfc3RhdGUsIG9wZXJhbmRbMF0sICZ0eXBlLCAmdGVtcF9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICh3YWxrX3N0YXRlLAorCQkJCSBvcGVyYW5kWzBdLCAmdHlwZSwgJnRlbXBfZGVzYyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtODE4LDggKzgyNSwxMCBAQAogCiAJCQkJCS8qIFNldCBPcGVyYW5kWzBdIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwvYXJnICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJCQkJIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZ0ZW1wX2Rlc2MpOworCQkJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZSAoCisJCQkJCQkJIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vcGNvZGUsCisJCQkJCQkJIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCQkJIHdhbGtfc3RhdGUsICZ0ZW1wX2Rlc2MpOwogCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJCX0KQEAgLTg1MiwyMSArODYxLDI2IEBACiAJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKIAkJCQkvKgotCQkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAoU3RyaW5nKS4gVGhlIHN0cmluZyBpcyBhIHJlZmVyZW5jZSB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgorCQkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAoU3RyaW5nKS4gVGhlIHN0cmluZyBpcyBhIHJlZmVyZW5jZQorCQkJCSAqIHRvIGEgbmFtZWQgQUNQSSBvYmplY3QuCiAJCQkJICoKIAkJCQkgKiAxKSBGaW5kIHRoZSBvd25pbmcgTm9kZQotCQkJCSAqIDIpIERlcmVmZXJlbmNlIHRoZSBub2RlIHRvIGFuIGFjdHVhbCBvYmplY3QuICBDb3VsZCBiZSBhIEZpZWxkLCBzbyB3ZSBuZWUKLQkJCQkgKiAgICB0byByZXNvbHZlIHRoZSBub2RlIHRvIGEgdmFsdWUuCisJCQkJICogMikgRGVyZWZlcmVuY2UgdGhlIG5vZGUgdG8gYW4gYWN0dWFsIG9iamVjdC4gIENvdWxkIGJlIGEKKwkJCQkgKiAgICBGaWVsZCwgc28gd2UgbmVlZCB0byByZXNvbHZlIHRoZSBub2RlIHRvIGEgdmFsdWUuCiAJCQkJICovCiAJCQkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJCSAgd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+c2NvcGUubm9kZSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCQkJICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSk7CisJCQkJCQkgd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+c2NvcGUubm9kZSwKKwkJCQkJCSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJCQkgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoCisJCQkJCQkJCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCAmcmV0dXJuX2Rlc2MpKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCWdvdG8gY2xlYW51cDsKIAkJCQl9CiAKIAkJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoCi0JCQkJCQkgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCAmcmV0dXJuX2Rlc2MpLCB3YWxrX3N0YXRlKTsKKwkJCQkJCSAgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoCisJCQkJCQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwKKwkJCQkJCQkJd2Fsa19zdGF0ZSk7CiAJCQkJZ290byBjbGVhbnVwOwogCiAKQEAgLTg4MywxNCArODk3LDE2IEBACiAJCQkvKgogCQkJICogVGhpcyBpcyBhIGRlcmVmX29mIChvYmplY3RfcmVmZXJlbmNlKQogCQkJICogR2V0IHRoZSBhY3R1YWwgb2JqZWN0IGZyb20gdGhlIE5vZGUgKFRoaXMgaXMgdGhlIGRlcmVmZXJlbmNlKS4KLQkJCSAqIC0tIFRoaXMgY2FzZSBtYXkgb25seSBoYXBwZW4gd2hlbiBhIGxvY2FsX3ggb3IgYXJnX3ggaXMgZGVyZWZlcmVuY2VkIGFib3ZlLgorCQkJICogVGhpcyBjYXNlIG1heSBvbmx5IGhhcHBlbiB3aGVuIGEgbG9jYWxfeCBvciBhcmdfeCBpcworCQkJICogZGVyZWZlcmVuY2VkIGFib3ZlLgogCQkJICovCi0JCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF0pOworCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCQkgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdKTsKIAkJfQogCQllbHNlIHsKIAkJCS8qCi0JCQkgKiBUaGlzIG11c3QgYmUgYSByZWZlcmVuY2Ugb2JqZWN0IHByb2R1Y2VkIGJ5IGVpdGhlciB0aGUgSW5kZXgoKSBvcgotCQkJICogcmVmX29mKCkgb3BlcmF0b3IKKwkJCSAqIFRoaXMgbXVzdCBiZSBhIHJlZmVyZW5jZSBvYmplY3QgcHJvZHVjZWQgYnkgZWl0aGVyIHRoZQorCQkJICogSW5kZXgoKSBvciByZWZfb2YoKSBvcGVyYXRvcgogCQkJICovCiAJCQlzd2l0Y2ggKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vcGNvZGUpIHsKIAkJCWNhc2UgQU1MX0lOREVYX09QOgpAQCAtOTMxLDggKzk0Nyw4IEBACiAJCQkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAogCQkJCQkvKgotCQkJCQkgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBvZiB0aGUgcGFja2FnZS4gIFdlIG11c3QgYWRkCi0JCQkJCSAqIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdCwgaG93ZXZlci4KKwkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0CisJCQkJCSAqIGFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCiAJCQkJCSAqLwogCQkJCQlyZXR1cm5fZGVzYyA9ICoob3BlcmFuZFswXS0+cmVmZXJlbmNlLndoZXJlKTsKIAkJCQkJaWYgKCFyZXR1cm5fZGVzYykgewpAQCAtOTY3LDkgKzk4MywxMSBAQAogCiAJCQkJcmV0dXJuX2Rlc2MgPSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OwogCi0JCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAocmV0dXJuX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAocmV0dXJuX2Rlc2MpID09CisJCQkJCQlBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCi0JCQkJCXJldHVybl9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgcmV0dXJuX2Rlc2MpOworCQkJCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCisJCQkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgcmV0dXJuX2Rlc2MpOwogCQkJCX0KIAogCQkJCS8qIEFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzIuYwppbmRleCA4YmU0ZDgwLi43NDI5MDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzIuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzIuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAKIAkJdmFsdWUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwogCi0JCS8qIE5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCisJCS8qIEFyZSBub3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLwogCiAJCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0IChub2RlKSkgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCkBAIC0yMDMsMTEgKzIwMywxMiBAQAogCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgb3Bjb2RlCi0JICovCisJLyogRXhlY3V0ZSB0aGUgb3Bjb2RlICovCisKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0RJVklERV9PUDogICAgICAgICAgICAgLyogRGl2aWRlIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCBxdW90aWVudF9yZXN1bHQpICovCisJY2FzZSBBTUxfRElWSURFX09QOgorCisJCS8qIERpdmlkZSAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgcXVvdGllbnRfcmVzdWx0KSAqLwogCiAJCXJldHVybl9kZXNjMSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjMSkgewpAQCAtMjQxLDcgKzI0Miw2IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQogCS8qIFN0b3JlIHRoZSByZXN1bHRzIHRvIHRoZSB0YXJnZXQgcmVmZXJlbmNlIG9wZXJhbmRzICovCiAKIAlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYzIsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOwpAQCAtMjk1LDcgKzI5NSw3IEBACiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwogCkBAIC0zMDQsOSArMzA0LDggQEAKIAkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG9wY29kZQotCSAqLworCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLworCiAJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX01BVEgpIHsKIAkJLyogQWxsIHNpbXBsZSBtYXRoIG9wY29kZXMgKGFkZCwgZXRjLikgKi8KIApAQCAtMzIyLDkgKzMyMSw4IEBACiAJCWdvdG8gc3RvcmVfcmVzdWx0X3RvX3RhcmdldDsKIAl9CiAKLQogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfTU9EX09QOiAgICAgICAgICAgICAgICAvKiBNb2QgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IChBQ1BJIDIuMCkgKi8KKwljYXNlIEFNTF9NT0RfT1A6IC8qIE1vZCAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgKEFDUEkgMi4wKSAqLwogCiAJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKQEAgLTM0MSwxOCArMzM5LDE5IEBACiAJCWJyZWFrOwogCiAKLQljYXNlIEFNTF9DT05DQVRfT1A6ICAgICAgICAgICAgIC8qIENvbmNhdGVuYXRlIChEYXRhMSwgRGF0YTIsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9DT05DQVRfT1A6IC8qIENvbmNhdGVuYXRlIChEYXRhMSwgRGF0YTIsIFJlc3VsdCkgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2NvbmNhdGVuYXRlIChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAogCQkJCSAmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAogCi0JY2FzZSBBTUxfVE9fU1RSSU5HX09QOiAgICAgICAgICAvKiB0b19zdHJpbmcgKEJ1ZmZlciwgTGVuZ3RoLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KKwljYXNlIEFNTF9UT19TVFJJTkdfT1A6IC8qIHRvX3N0cmluZyAoQnVmZmVyLCBMZW5ndGgsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLwogCiAJCS8qCiAJCSAqIElucHV0IG9iamVjdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgYnVmZmVyIGF0IHRoaXMgcG9pbnQgKGl0IG1heSBoYXZlCi0JCSAqIGJlZW4gY29udmVydGVkLikgIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB0byBhIG5ldyBvYmplY3Qgb2YgdHlwZSBTdHJpbmcuCisJCSAqIGJlZW4gY29udmVydGVkLikgIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB0byBhIG5ldyBvYmplY3Qgb2YKKwkJICogdHlwZSBTdHJpbmcuCiAJCSAqLwogCiAJCS8qCkBAIC0zODMsMTQgKzM4MiwxNiBAQAogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJLyogQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHdpdGggbm8gdHJhbnNmb3JtLiBOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeS4gKi8KKwkJLyogQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHdpdGggbm8gdHJhbnNmb3JtLiBOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeSovCiAKIAkJQUNQSV9NRU1DUFkgKHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlciwKIAkJCW9wZXJhbmRbMF0tPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgpOwogCQlicmVhazsKIAogCi0JY2FzZSBBTUxfQ09OQ0FUX1JFU19PUDogICAgICAgICAvKiBjb25jYXRlbmF0ZV9yZXNfdGVtcGxhdGUgKEJ1ZmZlciwgQnVmZmVyLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KKwljYXNlIEFNTF9DT05DQVRfUkVTX09QOgorCisJCS8qIGNvbmNhdGVuYXRlX3Jlc190ZW1wbGF0ZSAoQnVmZmVyLCBCdWZmZXIsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLwogCiAJCXN0YXR1cyA9IGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlIChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAogCQkJCSAmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwpAQCAtNDA3LDMzICs0MDgsMzMgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCWluZGV4ID0gKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKKwkJaW5kZXggPSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwogCi0JCS8qCi0JCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBTb3VyY2Ugb3BlcmFuZCBpcyBhIFBhY2thZ2UsIEJ1ZmZlciwgb3IgU3RyaW5nCi0JCSAqLworCQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBQYWNrYWdlLCBCdWZmZXIsIG9yIFN0cmluZyAqLworCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJCS8qIE9iamVjdCB0byBiZSBpbmRleGVkIGlzIGEgUGFja2FnZSAqLwogCiAJCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkgewogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW5kZXggdmFsdWUgKCVYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKVxuIiwKLQkJCQkJaW5kZXgsIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKKwkJCQkJIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKVxuIiwKKwkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChpbmRleCksIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAKIAkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKIAkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ICAgID0gb3BlcmFuZFswXTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgICAgID0gJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHMgW2luZGV4XTsKKwkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgICAgID0gJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHMgWworCQkJCQkgIGluZGV4XTsKIAkJfQogCQllbHNlIHsKIAkJCS8qIE9iamVjdCB0byBiZSBpbmRleGVkIGlzIGEgQnVmZmVyL1N0cmluZyAqLwogCiAJCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkgewogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW5kZXggdmFsdWUgKCVYKSBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAoJVgpXG4iLAotCQkJCQlpbmRleCwgb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkpOworCQkJCQkiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBlbmQgb2YgYnVmZmVyICglWClcbiIsCisJCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX0JVRkZFUl9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CkBAIC00NTEsNyArNDUyLDcgQEAKIAkJLyogQ29tcGxldGUgdGhlIEluZGV4IHJlZmVyZW5jZSBvYmplY3QgKi8KIAogCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9wY29kZSAgICA9IEFNTF9JTkRFWF9PUDsKLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgICAgPSBpbmRleDsKKwkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgICAgPSAodTMyKSBpbmRleDsKIAogCQkvKiBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXQgKi8KIApAQCAtNTM2LDIyICs1MzcsMjQgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgT3Bjb2RlCi0JICovCi0JaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUxfTlVNRVJJQykgLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLyB7CisJLyogRXhlY3V0ZSB0aGUgT3Bjb2RlICovCisKKwlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTF9OVU1FUklDKSB7CisJCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlLAogCQkJCSAgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKIAkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7CiAJCWdvdG8gc3RvcmVfbG9naWNhbF9yZXN1bHQ7CiAJfQotCWVsc2UgaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUwpICAvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovIHsKKwllbHNlIGlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMKSB7CisJCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKHdhbGtfc3RhdGUtPm9wY29kZSwgb3BlcmFuZFswXSwKIAkJCQkgb3BlcmFuZFsxXSwgJmxvZ2ljYWxfcmVzdWx0KTsKIAkJZ290byBzdG9yZV9sb2dpY2FsX3Jlc3VsdDsKIAl9CiAKLQogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfQUNRVUlSRV9PUDogICAgICAgICAgICAvKiBBY3F1aXJlIChtdXRleF9vYmplY3QsIFRpbWVvdXQpICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKaW5kZXggMjlkMGIxNi4uMjNiMDY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKQEAgLTk3LDExICs5NywxMiBAQAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzNBXzBUXzBSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzNBXzBUXzBSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0ZBVEFMX09QOiAgICAgICAgICAvKiBGYXRhbCAoZmF0YWxfdHlwZSBmYXRhbF9jb2RlIGZhdGFsX2FyZykgICAqLworCWNhc2UgQU1MX0ZBVEFMX09QOiAgICAgICAgICAvKiBGYXRhbCAoZmF0YWxfdHlwZSBmYXRhbF9jb2RlIGZhdGFsX2FyZykgKi8KIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAogCQkJImZhdGFsX29wOiBUeXBlICVYIENvZGUgJVggQXJnICVYIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsCkBAIC0xMTYsOSArMTE3LDggQEAKIAkJCWZhdGFsLT5hcmd1bWVudCA9ICh1MzIpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAJCX0KIAotCQkvKgotCQkgKiBBbHdheXMgc2lnbmFsIHRoZSBPUyEKLQkJICovCisJCS8qIEFsd2F5cyBzaWduYWwgdGhlIE9TISAqLworCiAJCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsIChBQ1BJX1NJR05BTF9GQVRBTCwgZmF0YWwpOwogCiAJCS8qIE1pZ2h0IHJldHVybiB3aGlsZSBPUyBpcyBzaHV0dGluZyBkb3duLCBqdXN0IGNvbnRpbnVlICovCkBAIC0xNjIsMjEgKzE2MiwyMyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGluZGV4OworCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzNBXzFUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzNBXzFUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01JRF9PUDogICAgICAgIC8qIE1pZCAgKFNvdXJjZVswXSwgSW5kZXhbMV0sIExlbmd0aFsyXSwgUmVzdWx0WzNdKSAqLworCWNhc2UgQU1MX01JRF9PUDogICAgLyogTWlkIChTb3VyY2VbMF0sIEluZGV4WzFdLCBMZW5ndGhbMl0sIFJlc3VsdFszXSkgKi8KIAogCQkvKgogCQkgKiBDcmVhdGUgdGhlIHJldHVybiBvYmplY3QuICBUaGUgU291cmNlIG9wZXJhbmQgaXMgZ3VhcmFudGVlZCB0byBiZQogCQkgKiBlaXRoZXIgYSBTdHJpbmcgb3IgYSBCdWZmZXIsIHNvIGp1c3QgdXNlIGl0cyB0eXBlLgogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kWzBdKSk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKKwkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kWzBdKSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTE4NCw3ICsxODYsNyBAQAogCiAJCS8qIEdldCB0aGUgSW50ZWdlciB2YWx1ZXMgZnJvbSB0aGUgb2JqZWN0cyAqLwogCi0JCWluZGV4ID0gKGFjcGlfbmF0aXZlX3VpbnQpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CisJCWluZGV4ID0gb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAkJbGVuZ3RoID0gKGFjcGlfc2l6ZSkgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKIAogCQkvKgpAQCAtMTk3LDcgKzE5OSw4IEBACiAKIAkJCWlmICgoaW5kZXggKyBsZW5ndGgpID4KIAkJCQlvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7Ci0JCQkJbGVuZ3RoID0gKGFjcGlfc2l6ZSkgb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCAtIGluZGV4OworCQkJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGggLQorCQkJCQkJIChhY3BpX3NpemUpIGluZGV4OwogCQkJfQogCiAJCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBTdHJpbmcvQnVmZmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCmluZGV4IGQzMjYyNDMuLjE3ZjgxZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCkBAIC03NSw2ICs3NSwxNCBAQAogICogZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZHMuCiAhKi8KIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTgKK2FjcGlfZXhfZG9fbWF0Y2ggKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbWF0Y2hfb2JqKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTkyLDcgKzEwMCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKK3N0YXRpYyB1OAogYWNwaV9leF9kb19tYXRjaCAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9vcCwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX29iaiwKQEAgLTIxNiwxMSArMjI0LDEyIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXNfZWxlbWVudDsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfNkFfMFRfMVIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfNkFfMFRfMVIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CkBAIC0yNDEsOSArMjUwLDExIEBACiAKIAkJLyogR2V0IHRoZSBwYWNrYWdlIHN0YXJ0X2luZGV4LCB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBwYWNrYWdlIGxlbmd0aCAqLwogCi0JCWluZGV4ID0gKHUzMikgb3BlcmFuZFs1XS0+aW50ZWdlci52YWx1ZTsKLQkJaWYgKGluZGV4ID49ICh1MzIpIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW5kZXggYmV5b25kIHBhY2thZ2UgZW5kXG4iKSk7CisJCWluZGV4ID0gb3BlcmFuZFs1XS0+aW50ZWdlci52YWx1ZTsKKwkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJJbmRleCAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChpbmRleCksIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9QQUNLQUdFX0xJTUlUOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC0zMTQsMTMgKzMyNSwxMiBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8zQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCisJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKIAkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQogCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKaW5kZXggMjY0ZWYzYi4uYzllM2M2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwpAQCAtNTIsOCArNTIsMjMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHByZXAiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFncywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXR1cm5fYnl0ZV9hbGlnbm1lbnQpOworCiAKICNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9vZmZzZXQsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfbGVuZ3RoLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX2xlbmd0aCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzCkBAIC05OSwxMiArMTE0LDE0IEBACiAJLyogUm91bmQgRmllbGQgc3RhcnQgb2Zmc2V0IGFuZCBsZW5ndGggdG8gIm1pbmltYWwiIGJ5dGUgYm91bmRhcmllcyAqLwogCiAJZmllbGRfYnl0ZV9vZmZzZXQgID0gQUNQSV9ESVZfOCAoQUNQSV9ST1VORF9ET1dOIChmaWVsZF9iaXRfb2Zmc2V0LCA4KSk7Ci0JZmllbGRfYnl0ZV9lbmRfb2Zmc2V0ID0gQUNQSV9ESVZfOCAoQUNQSV9ST1VORF9VUCAoZmllbGRfYml0X2xlbmd0aCArIGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKKwlmaWVsZF9ieXRlX2VuZF9vZmZzZXQgPSBBQ1BJX0RJVl84IChBQ1BJX1JPVU5EX1VQIChmaWVsZF9iaXRfbGVuZ3RoICsKKwkJCSAgIGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKIAlmaWVsZF9ieXRlX2xlbmd0aCAgPSBmaWVsZF9ieXRlX2VuZF9vZmZzZXQgLSBmaWVsZF9ieXRlX29mZnNldDsKIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJCSJCaXQgbGVuZ3RoICVkLCBCaXQgb2Zmc2V0ICVkXG4iLAogCQkJZmllbGRfYml0X2xlbmd0aCwgZmllbGRfYml0X29mZnNldCkpOworCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJIkJ5dGUgTGVuZ3RoICVkLCBCeXRlIE9mZnNldCAlZCwgRW5kIE9mZnNldCAlZFxuIiwKIAkJCWZpZWxkX2J5dGVfbGVuZ3RoLCBmaWVsZF9ieXRlX29mZnNldCwgZmllbGRfYnl0ZV9lbmRfb2Zmc2V0KSk7CkBAIC0xMTcsMjAgKzEzNCwyNiBAQAogCSAqLwogCWZvciAoYWNjZXNzX2J5dGVfd2lkdGggPSAxOyBhY2Nlc3NfYnl0ZV93aWR0aCA8PSA4OyBhY2Nlc3NfYnl0ZV93aWR0aCA8PD0gMSkgewogCQkvKgotCQkgKiAxKSBSb3VuZCBlbmQgb2Zmc2V0IHVwIHRvIG5leHQgYWNjZXNzIGJvdW5kYXJ5IGFuZCBtYWtlIHN1cmUgdGhhdCB0aGlzCi0JCSAqICAgIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgcmVnaW9uLgotCQkgKiAyKSBXaGVuIHRoZSBBY2Nlc3Mgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBmaWVsZF9ieXRlX2xlbmd0aCwgd2UgYXJlIGRvbmUuCi0JCSAqICAgIChUaGlzIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGUgcGVyZmVjdGx5IGFsaWduZWQgY2FzZSB5ZXQpLgorCQkgKiAxKSBSb3VuZCBlbmQgb2Zmc2V0IHVwIHRvIG5leHQgYWNjZXNzIGJvdW5kYXJ5IGFuZCBtYWtlIHN1cmUgdGhhdAorCQkgKiAgICB0aGlzIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgcmVnaW9uLgorCQkgKiAyKSBXaGVuIHRoZSBBY2Nlc3Mgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBmaWVsZF9ieXRlX2xlbmd0aCwgd2UKKwkJICogICAgYXJlIGRvbmUuIChUaGlzIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGUgcGVyZmVjdGx5IGFsaWduZWQKKwkJICogICAgY2FzZSB5ZXQpLgogCQkgKi8KIAkJaWYgKEFDUElfUk9VTkRfVVAgKGZpZWxkX2J5dGVfZW5kX29mZnNldCwgYWNjZXNzX2J5dGVfd2lkdGgpIDw9IHJlZ2lvbl9sZW5ndGgpIHsKLQkJCWZpZWxkX3N0YXJ0X29mZnNldCA9IEFDUElfUk9VTkRfRE9XTiAoZmllbGRfYnl0ZV9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSAvCi0JCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCQlmaWVsZF9lbmRfb2Zmc2V0ID0gQUNQSV9ST1VORF9VUCAgICgoZmllbGRfYnl0ZV9sZW5ndGggKyBmaWVsZF9ieXRlX29mZnNldCksCi0JCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpIC8gYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCQlhY2Nlc3NlcyAgICAgICAgID0gZmllbGRfZW5kX29mZnNldCAtIGZpZWxkX3N0YXJ0X29mZnNldDsKKwkJCWZpZWxkX3N0YXJ0X29mZnNldCA9CisJCQkJQUNQSV9ST1VORF9ET1dOIChmaWVsZF9ieXRlX29mZnNldCwgYWNjZXNzX2J5dGVfd2lkdGgpIC8KKwkJCQlhY2Nlc3NfYnl0ZV93aWR0aDsKKworCQkJZmllbGRfZW5kX29mZnNldCA9CisJCQkJQUNQSV9ST1VORF9VUCAoKGZpZWxkX2J5dGVfbGVuZ3RoICsgZmllbGRfYnl0ZV9vZmZzZXQpLAorCQkJCQlhY2Nlc3NfYnl0ZV93aWR0aCkgLyBhY2Nlc3NfYnl0ZV93aWR0aDsKKworCQkJYWNjZXNzZXMgPSBmaWVsZF9lbmRfb2Zmc2V0IC0gZmllbGRfc3RhcnRfb2Zmc2V0OwogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkJCSJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIHdpdGhpbiByZWdpb25cbiIsIGFjY2Vzc19ieXRlX3dpZHRoKSk7CisKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJCQkJIkZpZWxkIFN0YXJ0ICVkLCBGaWVsZCBFbmQgJWQgLS0gcmVxdWlyZXMgJWQgYWNjZXNzZXNcbiIsCiAJCQkJCWZpZWxkX3N0YXJ0X29mZnNldCwgZmllbGRfZW5kX29mZnNldCwgYWNjZXNzZXMpKTsKQEAgLTEzOSw4ICsxNjIsOCBAQAogCiAJCQlpZiAoYWNjZXNzZXMgPD0gMSkgewogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJCSJFbnRpcmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggb25lIG9wZXJhdGlvbiBvZiBzaXplICVkXG4iLAotCQkJCQkJYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCQkJIkVudGlyZSBmaWVsZCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBvbmUgb3BlcmF0aW9uIG9mIHNpemUgJWRcbiIsCisJCQkJCWFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCQkJcmV0dXJuX1ZBTFVFIChhY2Nlc3NfYnl0ZV93aWR0aCk7CiAJCQl9CiAKQEAgLTE1NSwxNSArMTc4LDIwIEBACiAJCX0KIAkJZWxzZSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCSJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJCSJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOwogCQkJaWYgKGFjY2Vzc19ieXRlX3dpZHRoID09IDEpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkJCQkiRmllbGQgZ29lcyBiZXlvbmQgZW5kLW9mLXJlZ2lvbiFcbiIpKTsKLQkJCQlyZXR1cm5fVkFMVUUgKDApOyAgICAgLyogRmllbGQgZG9lcyBub3QgZml0IGluIHRoZSByZWdpb24gYXQgYWxsICovCisKKwkJCQkvKiBGaWVsZCBkb2VzIG5vdCBmaXQgaW4gdGhlIHJlZ2lvbiBhdCBhbGwgKi8KKworCQkJCXJldHVybl9WQUxVRSAoMCk7CiAJCQl9CiAKLQkJCS8qIFRoaXMgd2lkdGggZ29lcyBiZXlvbmQgdGhlIGVuZC1vZi1yZWdpb24sIGJhY2sgb2ZmIHRvIHByZXZpb3VzIGFjY2VzcyAqLwotCisJCQkvKgorCQkJICogVGhpcyB3aWR0aCBnb2VzIGJleW9uZCB0aGUgZW5kLW9mLXJlZ2lvbiwgYmFjayBvZmYgdG8KKwkJCSAqIHByZXZpb3VzIGFjY2VzcworCQkJICovCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkJCSJCYWNraW5nIG9mZiB0byBwcmV2aW91cyBvcHRpbWFsIGFjY2VzcyB3aWR0aCBvZiAlZFxuIiwKIAkJCQkJbWluaW11bV9hY2Nlc3Nfd2lkdGgpKTsKQEAgLTE3MSw4ICsxOTksMTAgQEAKIAkJfQogCX0KIAotCS8qIENvdWxkIG5vdCByZWFkL3dyaXRlIGZpZWxkIHdpdGggb25lIG9wZXJhdGlvbiwganVzdCB1c2UgbWF4IGFjY2VzcyB3aWR0aCAqLwotCisJLyoKKwkgKiBDb3VsZCBub3QgcmVhZC93cml0ZSBmaWVsZCB3aXRoIG9uZSBvcGVyYXRpb24sCisJICoganVzdCB1c2UgbWF4IGFjY2VzcyB3aWR0aAorCSAqLwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJCSJDYW5ub3QgYWNjZXNzIGZpZWxkIGluIG9uZSBvcGVyYXRpb24sIHVzaW5nIHdpZHRoIDhcbiIpKTsKIAlyZXR1cm5fVkFMVUUgKDgpOwpAQCAtMTg0LDggKzIxNCw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcwogICoKLSAqIFBBUkFNRVRFUlM6ICBBY2Nlc3MgICAgICAgICAgLSBFbmNvZGVkIGZpZWxkIGFjY2VzcyBiaXRzCi0gKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgIC0gRmllbGQgbGVuZ3RoLgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBGaWVsZCBvYmplY3QKKyAqICAgICAgICAgICAgICBmaWVsZF9mbGFncyAgICAgICAgIC0gRW5jb2RlZCBmaWVsZGZsYWdzIChjb250YWlucyBhY2Nlc3MgYml0cykKKyAqICAgICAgICAgICAgICByZXR1cm5fYnl0ZV9hbGlnbm1lbnQgLSBXaGVyZSB0aGUgYnl0ZSBhbGlnbm1lbnQgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgRmllbGQgZ3JhbnVsYXJpdHkgKDgsIDE2LCAzMiBvciA2NCkgYW5kCiAgKiAgICAgICAgICAgICAgYnl0ZV9hbGlnbm1lbnQgKDEsIDIsIDMsIG9yIDQpCkBAIC0yMTQsOSArMjQ1LDEwIEBACiAJY2FzZSBBTUxfRklFTERfQUNDRVNTX0FOWToKIAogI2lmZGVmIEFDUElfVU5ERVJfREVWRUxPUE1FTlQKLQkJYnl0ZV9hbGlnbm1lbnQgPSBhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJCSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkJIDB4RkZGRkZGRkYgLyogVGVtcCB1bnRpbCB3ZSBwYXNzIHJlZ2lvbl9sZW5ndGggYXMgcGFyYW0gKi8pOworCQlieXRlX2FsaWdubWVudCA9CisJCQlhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkweEZGRkZGRkZGIC8qIFRlbXAgdW50aWwgd2UgcGFzcyByZWdpb25fbGVuZ3RoIGFzIHBhcmFtZXRlciAqLyk7CiAJCWJpdF9sZW5ndGggPSBieXRlX2FsaWdubWVudCAqIDg7CiAjZW5kaWYKIApAQCAtMjc2LDYgKzMwOCw3IEBACiAgKiAgICAgICAgICAgICAgZmllbGRfZmxhZ3MgICAgICAgICAtIEFjY2VzcywgbG9ja19ydWxlLCBhbmQgdXBkYXRlX3J1bGUuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgYSBmaWVsZF9mbGFnIGlzIGRlc2NyaWJlZAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uCisgKiAgICAgICAgICAgICAgZmllbGRfYXR0cmlidXRlICAgICAtIFNwZWNpYWwgYXR0cmlidXRlcyAobm90IHVzZWQpCiAgKiAgICAgICAgICAgICAgZmllbGRfYml0X3Bvc2l0aW9uICAtIEZpZWxkIHN0YXJ0IHBvc2l0aW9uCiAgKiAgICAgICAgICAgICAgZmllbGRfYml0X2xlbmd0aCAgICAtIEZpZWxkIGxlbmd0aCBpbiBudW1iZXIgb2YgYml0cwogICoKQEAgLTMzNyw3ICszNzAsNyBAQAogCS8qIFNldHVwIHdpZHRoIChhY2Nlc3MgZ3JhbnVsYXJpdHkpIGZpZWxkcyAqLwogCiAJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCA9ICh1OCkKLQkJCUFDUElfRElWXzggKGFjY2Vzc19iaXRfd2lkdGgpOyAvKiAxLCAyLCA0LCAgOCAqLworCQkJQUNQSV9ESVZfOCAoYWNjZXNzX2JpdF93aWR0aCk7ICAgICAgICAgIC8qIDEsICAyLCAgNCwgIDggKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCA9ICh1OCkgYWNjZXNzX2JpdF93aWR0aDsKIApAQCAtMzgwLDExICs0MTMsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIE93bmluZyBOb2RlCi0gKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgICAgICAtIFJlZ2lvbiBpbiB3aGljaCBmaWVsZCBpcyBiZWluZyBkZWZpbmVkCi0gKiAgICAgICAgICAgICAgZmllbGRfZmxhZ3MgICAgICAgICAtIEFjY2VzcywgbG9ja19ydWxlLCBhbmQgdXBkYXRlX3J1bGUuCi0gKiAgICAgICAgICAgICAgZmllbGRfYml0X3Bvc2l0aW9uICAtIEZpZWxkIHN0YXJ0IHBvc2l0aW9uCi0gKiAgICAgICAgICAgICAgZmllbGRfYml0X2xlbmd0aCAgICAtIEZpZWxkIGxlbmd0aCBpbiBudW1iZXIgb2YgYml0cworICogUEFSQU1FVEVSUzogIEluZm8gICAgLSBDb250YWlucyBhbGwgZmllbGQgY3JlYXRpb24gaW5mbwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00NDUsNyArNDc0LDcgQEAKIAlzd2l0Y2ggKGluZm8tPmZpZWxkX3R5cGUpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAKLQkJb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmogICA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaW9uX25vZGUpOworCQlvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaW9uX25vZGUpOwogCiAJCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgY29udGFpbmVyICovCiAKQEAgLTQ2MSw4ICs0OTAsMTAgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCiAJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlICAgPSBpbmZvLT5iYW5rX3ZhbHVlOwotCQlvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5yZWdpb25fbm9kZSk7Ci0JCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCisJCQkJIGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCSBpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKIAogCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGF0dGFjaGVkIG9iamVjdHMgKi8KIApAQCAtNDgxLDEwICs1MTIsMTMgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lzdGVyX25vZGUpOwotCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCSBpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkgaW5mby0+ZGF0YV9yZWdpc3Rlcl9ub2RlKTsKIAkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlICA9ICh1MzIpCi0JCQkoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8gQUNQSV9NVUxfOCAob2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQkoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8gQUNQSV9NVUxfOCAoCisJCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CiAKIAkJaWYgKCFvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmogfHwgIW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmopIHsKIAkJCUFDUElfUkVQT1JUX0VSUk9SICgoIk51bGwgSW5kZXggT2JqZWN0IGR1cmluZyBmaWVsZCBwcmVwXG4iKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlZ2lvbi5jCmluZGV4IDdjZmQwNjguLjcyM2FhZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlZ2lvbi5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJfQogCi0KICNpZm5kZWYgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUwogCS8qCiAJICogSGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBub24tYWxpZ25lZCBkYXRhIHRyYW5zZmVycywgd2UgbXVzdCB2ZXJpZnkKQEAgLTEzNCw3ICsxMzMsOCBAQAogCSAqLwogCWlmICgoYWRkcmVzcyA8IG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcykgfHwKIAkJKCgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzICsgbGVuZ3RoKSA+Ci0JCQkoKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzICsgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpKSkgeworCQkJKChhY3BpX2ludGVnZXIpCisJCQltZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgKyBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkpKSB7CiAJCS8qCiAJCSAqIFRoZSByZXF1ZXN0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCBtZW1vcnkgbWFwcGluZzsKIAkJICogRGVsZXRlIHRoZSBleGlzdGluZyBtYXBwaW5nIGFuZCBjcmVhdGUgYSBuZXcgb25lLgpAQCAtMTUwLDcgKzE1MCw5IEBACiAJCSAqIERvbid0IGF0dGVtcHQgdG8gbWFwIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLCBhbmQKIAkJICogY29uc3RyYWluIHRoZSBtYXhpbXVtIG1hcHBpbmcgc2l6ZSB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4KIAkJICovCi0JCXdpbmRvd19zaXplID0gKGFjcGlfc2l6ZSkgKChtZW1faW5mby0+YWRkcmVzcyArIG1lbV9pbmZvLT5sZW5ndGgpIC0gYWRkcmVzcyk7CisJCXdpbmRvd19zaXplID0gKGFjcGlfc2l6ZSkKKwkJCSgobWVtX2luZm8tPmFkZHJlc3MgKyBtZW1faW5mby0+bGVuZ3RoKSAtIGFkZHJlc3MpOworCiAJCWlmICh3aW5kb3dfc2l6ZSA+IEFDUElfU1lTTUVNX1JFR0lPTl9XSU5ET1dfU0laRSkgewogCQkJd2luZG93X3NpemUgPSBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkU7CiAJCX0KQEAgLTE2MCw4ICsxNjIsOSBAQAogCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MsIHdpbmRvd19zaXplLAogCQkJCSAgKHZvaWQgKiopICZtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWFxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwgKHUzMikgd2luZG93X3NpemUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCU4LjhYLCBzaXplICVYXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcyksICh1MzIpIHdpbmRvd19zaXplKSk7CiAJCQltZW1faW5mby0+bWFwcGVkX2xlbmd0aCA9IDA7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTE3NywxMCArMTgwLDEyIEBACiAJICogYWNjZXNzCiAJICovCiAJbG9naWNhbF9hZGRyX3B0ciA9IG1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzICsKLQkJCSAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLSAoYWNwaV9pbnRlZ2VyKSBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpOworCQkJICAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLQorCQkJCQkgIChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJInN5c3RlbV9tZW1vcnkgJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsIGZ1bmN0aW9uLCBiaXRfd2lkdGgsCisJCQkic3lzdGVtX21lbW9yeSAlZCAoJWQgd2lkdGgpIEFkZHJlc3M9JTguOFglOC44WFxuIiwKKwkJCWZ1bmN0aW9uLCBiaXRfd2lkdGgsCiAJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpKSk7CiAKICAgIC8qCkBAIC0yOTgsMTMgKzMwMywxNSBAQAogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywgJnZhbHVlMzIsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCSAmdmFsdWUzMiwgYml0X3dpZHRoKTsKIAkJKnZhbHVlID0gdmFsdWUzMjsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfV1JJVEU6CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLCAodTMyKSAqdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkgKHUzMikgKnZhbHVlLCBiaXRfd2lkdGgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zNzUsMTIgKzM4MiwxNCBAQAogCWNhc2UgQUNQSV9SRUFEOgogCiAJCSp2YWx1ZSA9IDA7Ci0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbiAocGNpX2lkLCBwY2lfcmVnaXN0ZXIsIHZhbHVlLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLAorCQkJCSB2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfV1JJVEU6CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbiAocGNpX2lkLCBwY2lfcmVnaXN0ZXIsICp2YWx1ZSwgYml0X3dpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbiAocGNpX2lkLCBwY2lfcmVnaXN0ZXIsCisJCQkJICp2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTA1LDggKzUxNCw3IEBACiAKIAlsb2dpY2FsX2FkZHJfcHRyID0gQUNQSV9QSFlTQUREUl9UT19QVFIgKGFkZHJlc3MpOwogCi0KLSAgIC8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCisJLyogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUgKi8KIAogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKaW5kZXggNzkzNjMyOS4uMjFkNWM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKQEAgLTIxMCwxNSArMjEwLDE1IEBACiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiZmllbGRfcmVhZCBOb2RlPSVwIHNvdXJjZV9kZXNjPSVwIFR5cGU9JVhcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiZmllbGRfcmVhZCBOb2RlPSVwIHNvdXJjZV9kZXNjPSVwIFR5cGU9JVhcbiIsCiAJCQlub2RlLCBzb3VyY2VfZGVzYywgZW50cnlfdHlwZSkpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQgKHdhbGtfc3RhdGUsIHNvdXJjZV9kZXNjLCAmb2JqX2Rlc2MpOwogCQlicmVhazsKIAotCS8qCi0JICogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUKLQkgKi8KKwkvKiBGb3IgdGhlc2Ugb2JqZWN0cywganVzdCByZXR1cm4gdGhlIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgTm9kZSAqLworCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgpAQCAtMjMzLDEyICsyMzMsMTIgQEAKIAkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0KIAkvKiBUWVBFX0FOWSBpcyB1bnR5cGVkLCBhbmQgdGh1cyB0aGVyZSBpcyBubyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGl0ICovCiAKIAljYXNlIEFDUElfVFlQRV9BTlk6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhXG4iLAogCQkJbm9kZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7ICAvKiBDYW5ub3QgYmUgQUVfVFlQRSAqLwpAQCAtMjU5LDcgKzI1OSw4IEBACiAJCWRlZmF1bHQ6CiAJCQkvKiBObyBuYW1lZCByZWZlcmVuY2VzIGFyZSBhbGxvd2VkIGhlcmUgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlICVYICglcylcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpXG4iLAogCQkJCXNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAogCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpKTsKIApAQCAtMjY4LDExICsyNjksMTIgQEAKIAkJYnJlYWs7CiAKIAotCS8qIERlZmF1bHQgY2FzZSBpcyBmb3IgdW5rbm93biB0eXBlcyAqLwotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vZGUgJXAgLSBVbmtub3duIG9iamVjdCB0eXBlICVYXG4iLAorCQkvKiBEZWZhdWx0IGNhc2UgaXMgZm9yIHVua25vd24gdHlwZXMgKi8KKworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWFxuIiwKIAkJCW5vZGUsIGVudHJ5X3R5cGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwpAQCAtMjgwLDcgKzI4Miw3IEBACiAJfSAvKiBzd2l0Y2ggKGVudHJ5X3R5cGUpICovCiAKIAotCS8qIFB1dCB0aGUgb2JqZWN0IGRlc2NyaXB0b3Igb24gdGhlIHN0YWNrICovCisJLyogUmV0dXJuIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLwogCiAJKm9iamVjdF9wdHIgPSAodm9pZCAqKSBvYmpfZGVzYzsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmluZGV4IDdiZTYwNDkuLjNkZTQ1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCkBAIC01NCw2ICs1NCwxMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4cmVzb2x2IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05Niw2ICsxMDMsMTEgQEAKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CisKKwkJaWYgKCEqc3RhY2tfcHRyKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJfQogCX0KIAogCS8qCkBAIC0xMjAsMTggKzEzMiwxNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlCiAgKgotICogUEFSQU1FVEVSUzogIHN0YWNrX3B0ciAgICAgICAtIFBvaW50ZXIgdG8gYSBzdGFjayBsb2NhdGlvbiB0aGF0IGNvbnRhaW5zIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgdG8gYW4gaW50ZXJuYWwgb2JqZWN0LgorICogUEFSQU1FVEVSUzogIHN0YWNrX3B0ciAgICAgICAtIFBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgb2JqZWN0CiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIGFuIGludGVybmFsIG9iamVjdC4gIFRoZSBSZWZlcmVuY2UgdHlwZQorICogREVTQ1JJUFRJT046IFJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIGFuIGludGVybmFsIG9iamVjdC4gVGhlIFJlZmVyZW5jZSB0eXBlCiAgKiAgICAgICAgICAgICAgdXNlcyB0aGUgYXNzb2NpYXRlZCBBTUwgb3Bjb2RlIHRvIGRldGVybWluZSB0aGUgdmFsdWUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQpAQCAtMTU5LDcgKzE3MCw3IEBACiAJCWNhc2UgQU1MX05BTUVfT1A6CiAKIAkJCS8qCi0JCQkgKiBDb252ZXJ0IGluZGlyZWN0IG5hbWUgcHRyIHRvIGEgZGlyZWN0IG5hbWUgcHRyLgorCQkJICogQ29udmVydCBuYW1lIHJlZmVyZW5jZSB0byBhIG5hbWVzcGFjZSBub2RlCiAJCQkgKiBUaGVuLCBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIHZhbHVlCiAJCQkgKi8KIAkJCXRlbXBfbm9kZSA9IHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CkBAIC0xNjgsNyArMTc5LDcgQEAKIAogCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdGFja19kZXNjKTsKIAotCQkJLyogUHV0IGRpcmVjdCBuYW1lIHBvaW50ZXIgb250byBzdGFjayBhbmQgZXhpdCAqLworCQkJLyogUmV0dXJuIHRoZSBuYW1lc3BhY2Ugbm9kZSAqLwogCiAJCQkoKnN0YWNrX3B0cikgPSB0ZW1wX25vZGU7CiAJCQlicmVhazsKQEAgLTI1NSwxMCArMjY2LDE5IEBACiAKIAkJCWJyZWFrOwogCisJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDogICAvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KKworCQkJLyogR2V0IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KKworCQkJKnN0YWNrX3B0ciA9IChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZSktPm9iamVjdDsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoKnN0YWNrX3B0cik7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHN0YWNrX2Rlc2MpOworCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRHVyaW5nIHJlc29sdmUsIFVua25vd24gUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpIGluICVwXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiRHVyaW5nIHJlc29sdmUsIFVua25vd24gUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpIGluICVwXG4iLAogCQkJCW9wY29kZSwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wY29kZSksIHN0YWNrX2Rlc2MpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJCWJyZWFrOwpAQCAtMjc4LDkgKzI5OCw4IEBACiAJCWJyZWFrOwogCiAKLQkvKgotCSAqIFRoZXNlIGNhc2VzIG1heSBuZXZlciBoYXBwZW4gaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uCi0JICovCisJLyogVGhlc2UgY2FzZXMgbWF5IG5ldmVyIGhhcHBlbiBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4gKi8KKwogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKQEAgLTMzMyw5ICszNTIsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUiKTsKIAogCi0JLyoKLQkgKiBPcGVyYW5kIGNhbiBiZSBlaXRoZXIgYSBuYW1lc3BhY2Ugbm9kZSBvciBhbiBvcGVyYW5kIGRlc2NyaXB0b3IKLQkgKi8KKwkvKiBPcGVyYW5kIGNhbiBiZSBlaXRoZXIgYSBuYW1lc3BhY2Ugbm9kZSBvciBhbiBvcGVyYW5kIGRlc2NyaXB0b3IgKi8KKwogCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAJCXR5cGUgPSBvYmpfZGVzYy0+Y29tbW9uLnR5cGU7CkBAIC0zNTcsMTAgKzM3NSw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCisJLyogSWYgdHlwZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgcmVmZXJlbmNlLCB3ZSBhcmUgZG9uZSAqLwogCi0JLyoKLQkgKiBJZiB0eXBlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSByZWZlcmVuY2UsIHdlIGFyZSBkb25lCi0JICovCiAJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzgyLDggKzM5OCw5IEBACiAJCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwogCiAJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLAotCQkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJCSJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKKwkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIApAQCAtNDQwLDggKzQ1Nyw5IEBACiAJCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwogCiAJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLAotCQkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJCSJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKKwkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOwogCQkJICAgcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCQkJfQogCkBAIC00NjgsNyArNDg2LDcgQEAKIAogCQkJaWYgKHJldHVybl9kZXNjKSB7CiAJCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgd2Fsa19zdGF0ZSwgJm9ial9kZXNjKTsKKwkJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgd2Fsa19zdGF0ZSwgJm9ial9kZXNjKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJCQl9CkBAIC01MDAsNyArNTE4LDggQEAKIAogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IFVua25vd24gUmVmZXJlbmNlIHN1YnR5cGUgJVhcbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IFVua25vd24gUmVmZXJlbmNlIHN1YnR5cGUgJVhcbiIsCiAJCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKaW5kZXggYzkyODkwMi4uZDhiNDcwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCkBAIC01Miw2ICs1MiwxNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4cmVzb3AiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9jaGVja19vYmplY3RfdHlwZSAoCisJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZCwKKwlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRoaXNfdHlwZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjcsNyArNzUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZV9uZWVkZWQsCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0aGlzX3R5cGUsCkBAIC0xNDIsNiArMTUwLDcgQEAKIAljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpvcF9pbmZvOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19hcmdfdHlwZTsKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkOworCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X29wID0gMDsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJleF9yZXNvbHZlX29wZXJhbmRzIiwgb3Bjb2RlKTsKQEAgLTE2MCw3ICsxNjksOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9wY29kZSAlWCBbJXNdIHJlcXVpcmVkX29wZXJhbmRfdHlwZXM9JTguOFggXG4iLAorCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCSJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYIFxuIiwKIAkJb3Bjb2RlLCBvcF9pbmZvLT5uYW1lLCBhcmdfdHlwZXMpKTsKIAogCS8qCkBAIC0xODcsNyArMTk3LDcgQEAKIAkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSkgewogCQljYXNlIEFDUElfREVTQ19UWVBFX05BTUVEOgogCi0JCQkvKiBOb2RlICovCisJCQkvKiBOYW1lc3BhY2UgTm9kZSAqLwogCiAJCQlvYmplY3RfdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpLT50eXBlOwogCQkJYnJlYWs7CkBAIC0yMDIsMTYgKzIxMiwxNiBAQAogCQkJLyogQ2hlY2sgZm9yIGJhZCBhY3BpX29iamVjdF90eXBlICovCiAKIAkJCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAob2JqZWN0X3R5cGUpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJCYWQgb3BlcmFuZCBvYmplY3QgdHlwZSBbJVhdXG4iLAorCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKIAkJCQkJb2JqZWN0X3R5cGUpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAKIAkJCWlmIChvYmplY3RfdHlwZSA9PSAodTgpIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKLQkJCQkvKgotCQkJCSAqIERlY29kZSB0aGUgUmVmZXJlbmNlCi0JCQkJICovCisJCQkJLyogRGVjb2RlIHRoZSBSZWZlcmVuY2UgKi8KKwogCQkJCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKIAkJCQlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKIAkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CkBAIC0yMTksMTIgKzIyOSwxNyBAQAogCiAJCQkJc3dpdGNoIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkgewogCQkJCWNhc2UgQU1MX0RFQlVHX09QOgorCQkJCQl0YXJnZXRfb3AgPSBBTUxfREVCVUdfT1A7CisKKwkJCQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLworCiAJCQkJY2FzZSBBTUxfTkFNRV9PUDoKIAkJCQljYXNlIEFNTF9JTkRFWF9PUDoKIAkJCQljYXNlIEFNTF9SRUZfT0ZfT1A6CiAJCQkJY2FzZSBBTUxfQVJHX09QOgogCQkJCWNhc2UgQU1MX0xPQ0FMX09QOgotCQkJCWNhc2UgQU1MX0xPQURfT1A6ICAgLyogZGRiX2hhbmRsZSBmcm9tIExPQURfT1Agb3IgTE9BRF9UQUJMRV9PUCAqLworCQkJCWNhc2UgQU1MX0xPQURfT1A6IC8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KKwkJCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6IC8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLwogCiAJCQkJCUFDUElfREVCVUdfT05MWV9NRU1CRVJTIChBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAogCQkJCQkJIk9wZXJhbmQgaXMgYSBSZWZlcmVuY2UsIHJlZl9vcGNvZGUgWyVzXVxuIiwKQEAgLTI1NCwxMCArMjY5LDggQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAorCQkvKiBHZXQgb25lIGFyZ3VtZW50IHR5cGUsIHBvaW50IHRvIHRoZSBuZXh0ICovCiAKLQkJLyoKLQkJICogR2V0IG9uZSBhcmd1bWVudCB0eXBlLCBwb2ludCB0byB0aGUgbmV4dAotCQkgKi8KIAkJdGhpc19hcmdfdHlwZSA9IEdFVF9DVVJSRU5UX0FSR19UWVBFIChhcmdfdHlwZXMpOwogCQlJTkNSRU1FTlRfQVJHX0xJU1QgKGFyZ190eXBlcyk7CiAKQEAgLTI3MSwyNiArMjg0LDMxIEBACiAJCQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpICYmCiAJCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1NUUklORykpIHsKIAkJCQkvKgotCQkJCSAqIFN0cmluZyBmb3VuZCAtIHRoZSBzdHJpbmcgcmVmZXJlbmNlcyBhIG5hbWVkIG9iamVjdCBhbmQgbXVzdCBiZQotCQkJCSAqIHJlc29sdmVkIHRvIGEgbm9kZQorCQkJCSAqIFN0cmluZyBmb3VuZCAtIHRoZSBzdHJpbmcgcmVmZXJlbmNlcyBhIG5hbWVkIG9iamVjdCBhbmQKKwkJCQkgKiBtdXN0IGJlIHJlc29sdmVkIHRvIGEgbm9kZQogCQkJCSAqLwogCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCQkJfQogCi0JCQkvKiBFbHNlIG5vdCBhIHN0cmluZyAtIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIFJlZmVyZW5jZSBjYXNlIGJlbG93ICovCisJCQkvKgorCQkJICogRWxzZSBub3QgYSBzdHJpbmcgLSBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBSZWZlcmVuY2UKKwkJCSAqIGNhc2UgYmVsb3cKKwkJCSAqLwogCQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwogCiAJCWNhc2UgQVJHSV9SRUZFUkVOQ0U6ICAgICAgICAgICAgLyogUmVmZXJlbmNlczogKi8KIAkJY2FzZSBBUkdJX0lOVEVHRVJfUkVGOgogCQljYXNlIEFSR0lfT0JKRUNUX1JFRjoKIAkJY2FzZSBBUkdJX0RFVklDRV9SRUY6Ci0JCWNhc2UgQVJHSV9UQVJHRVRSRUY6ICAgICAgICAgICAgLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCi0JCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6ICAgICAgICAgLyogTm8gaW1wbGljaXQgY29udmVyc2lvbiBiZWZvcmUgc3RvcmUgdG8gdGFyZ2V0ICovCi0JCWNhc2UgQVJHSV9TSU1QTEVfVEFSR0VUOiAgICAgICAgLyogTmFtZSwgTG9jYWwsIG9yIEFyZyAtIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gICovCisJCWNhc2UgQVJHSV9UQVJHRVRSRUY6ICAgICAvKiBBbGxvd3MgaW1wbGljaXQgY29udmVyc2lvbiBydWxlcyBiZWZvcmUgc3RvcmUgKi8KKwkJY2FzZSBBUkdJX0ZJWEVEX1RBUkdFVDogIC8qIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHN0b3JlIHRvIHRhcmdldCAqLworCQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDogLyogTmFtZSwgTG9jYWwsIG9yIEFyZyAtIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gICovCiAKLQkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgKi8KLQotCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSAvKiBOb2RlIChuYW1lKSBwdHIgT0sgYXMtaXMgKi8geworCQkJLyoKKwkJCSAqIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UKKwkJCSAqIEEgTmFtZXNwYWNlIE5vZGUgaXMgT0sgYXMtaXMKKwkJCSAqLworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCQkJZ290byBuZXh0X29wZXJhbmQ7CiAJCQl9CiAKQEAgLTMwMCwxMSArMzE4LDkgQEAKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQl9CiAKLQkJCWlmIChBTUxfTkFNRV9PUCA9PSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkgewotCQkJCS8qCi0JCQkJICogQ29udmVydCBhbiBpbmRpcmVjdCBuYW1lIHB0ciB0byBkaXJlY3QgbmFtZSBwdHIgYW5kIHB1dAotCQkJCSAqIGl0IG9uIHRoZSBzdGFjawotCQkJCSAqLworCQkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9OQU1FX09QKSB7CisJCQkJLyogQ29udmVydCBhIG5hbWVkIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIG5hbWVkIG9iamVjdCAqLworCiAJCQkJdGVtcF9ub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CiAJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CiAJCQkJKCpzdGFja19wdHIpID0gdGVtcF9ub2RlOwpAQCAtMzMyLDcgKzM0OCw2IEBACiAJCQlicmVhazsKIAkJfQogCi0KIAkJLyoKIAkJICogUmVzb2x2ZSB0aGlzIG9iamVjdCB0byBhIHZhbHVlCiAJCSAqLwpAQCAtMzkyLDcgKzQwNyw3IEBACiAJCS8qCiAJCSAqIFRoZSBtb3JlIGNvbXBsZXggY2FzZXMgYWxsb3cgbXVsdGlwbGUgcmVzb2x2ZWQgb2JqZWN0IHR5cGVzCiAJCSAqLwotCQljYXNlIEFSR0lfSU5URUdFUjogICAvKiBOdW1iZXIgKi8KKwkJY2FzZSBBUkdJX0lOVEVHRVI6CiAKIAkJCS8qCiAJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfSU5URUdFUiwKQEAgLTU2Myw3ICs1NzgsNyBAQAogCiAJCWNhc2UgQVJHSV9SRUdJT05fT1JfRklFTEQ6CiAKLQkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9SRUdJT04gb3IgYSBGSUVMRCBpbiBhIHJlZ2lvbiAqLworCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgUkVHSU9OIG9yIGEgRklFTEQgaW4gYSByZWdpb24gKi8KIAogCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CiAJCQljYXNlIEFDUElfVFlQRV9SRUdJT046CkBAIC02MTQsNiArNjI5LDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAorCQkJCWlmICh0YXJnZXRfb3AgPT0gQU1MX0RFQlVHX09QKSB7CisJCQkJCS8qIEFsbG93IHN0b3JlIG9mIGFueSBvYmplY3QgdG8gdGhlIERlYnVnIG9iamVjdCAqLworCisJCQkJCWJyZWFrOworCQkJCX0KKwogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCQkiTmVlZGVkIEludGVnZXIvQnVmZmVyL1N0cmluZy9QYWNrYWdlL1JlZi9EZGJdLCBmb3VuZCBbJXNdICVwXG4iLAogCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CkBAIC02NTIsOCArNjczLDcgQEAKIAkJaWYgKEdFVF9DVVJSRU5UX0FSR19UWVBFIChhcmdfdHlwZXMpKSB7CiAJCQlzdGFja19wdHItLTsKIAkJfQotCi0JfSAgIC8qIHdoaWxlICgqVHlwZXMpICovCisJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKaW5kZXggZTBmYzZhYi4uMjcyNWRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCkBAIC00OCwxMSArNDgsMTcxIEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4c3RvcmUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdmFsX2Rlc2MsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjLAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fZGVidWdfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKKyAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gSW5kZW50YXRpb24gbGV2ZWwgKHVzZWQgZm9yIHBhY2thZ2VzKQorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBDdXJyZW50IHBhY2thZ2UgZWxlbWVudCwgemVybyBpZiBub3QgcGtnCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogSGFuZGxlcyBzdG9yZXMgdG8gdGhlIERlYnVnIE9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkKK3sKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfZG9fZGVidWdfb2JqZWN0Iiwgc291cmNlX2Rlc2MpOworCisKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiW0FDUEkgRGVidWddICUqcyIsCisJCWxldmVsLCAiICIpKTsKKworCS8qIERpc3BsYXkgaW5kZXggZm9yIHBhY2thZ2Ugb3V0cHV0IG9ubHkgKi8KKworCWlmIChpbmRleCA+IDApIHsKKwkgICBBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkgICAiKCUuMnUpICIsIGluZGV4IC0xKSk7CisJfQorCisJaWYgKCFzb3VyY2VfZGVzYykgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiPE51bGwgT2JqZWN0PlxuIikpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXM6ICIsCisJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKworCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0IChzb3VyY2VfZGVzYykpIHsKKwkJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCSAgICIlcCwgSW52YWxpZCBJbnRlcm5hbCBPYmplY3QhXG4iLCBzb3VyY2VfZGVzYykpOworCQkgICByZXR1cm5fVk9JRDsKKwkJfQorCX0KKwllbHNlIGlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXM6ICVwXG4iLAorCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICgoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHNvdXJjZV9kZXNjKS0+dHlwZSksCisJCQlzb3VyY2VfZGVzYykpOworCQlyZXR1cm5fVk9JRDsKKwl9CisJZWxzZSB7CisJCXJldHVybl9WT0lEOworCX0KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgeworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJLyogT3V0cHV0IGNvcnJlY3QgaW50ZWdlciB3aWR0aCAqLworCisJCWlmIChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggPT0gNCkgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjB4JTguOFhcbiIsCisJCQkJKHUzMikgc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJfQorCQllbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYJTguOFhcbiIsCisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSkpKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0iLAorCQkJKHUzMikgc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKKwkJQUNQSV9EVU1QX0JVRkZFUiAoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwgMzIpID8gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggOiAzMik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBcIiVzXCJcbiIsCisJCQlzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyKSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWCBFbGVtZW50c11cbiIsCisJCQlzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudCkpOworCisJCS8qIE91dHB1dCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBwYWNrYWdlICovCisKKwkJZm9yIChpID0gMDsgaSA8IHNvdXJjZV9kZXNjLT5wYWNrYWdlLmNvdW50OyBpKyspIHsKKwkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0IChzb3VyY2VfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKKwkJCQlsZXZlbCs0LCBpKzEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfSU5ERVhfT1ApIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXMsIDB4JVhdXG4iLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSksCisJCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpKTsKKwkJfQorCQllbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXNdXG4iLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpKTsKKwkJfQorCisKKwkJaWYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7CisJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgPT0KKwkJCQkJQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQlzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPm9iamVjdCwKKwkJCQkJbGV2ZWwrNCwgMCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsIGxldmVsKzQsIDApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uubm9kZSkgeworCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3QsCisJCQkJbGV2ZWwrNCwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlcCAlc1xuIiwKKwkJCXNvdXJjZV9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKwkJYnJlYWs7CisJfQorCisJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsICJcbiIpKTsKKwlyZXR1cm5fVk9JRDsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1NCw4ICszMTQsOSBAQAogCiAJCS8qIFN0b3JpbmcgYW4gb2JqZWN0IGludG8gYSBOYW1lICJjb250YWluZXIiICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAoc291cmNlX2Rlc2MsIHJlZl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LAotCQkJCSAgd2Fsa19zdGF0ZSwgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAoc291cmNlX2Rlc2MsCisJCQkJIHJlZl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LAorCQkJCSB3YWxrX3N0YXRlLCBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04pOwogCQlicmVhazsKIAogCkBAIC0xNzMsNyArMzM0LDcgQEAKIAkJLyogU3RvcmUgdG8gYSBtZXRob2QgbG9jYWwvYXJnICAqLwogCiAJCXN0YXR1cyA9IGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsIChyZWZfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkgIHJlZl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCBzb3VyY2VfZGVzYywgd2Fsa19zdGF0ZSk7CisJCQkJIHJlZl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCBzb3VyY2VfZGVzYywgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCiAKQEAgLTE4Nyw2MCArMzQ4LDcgQEAKIAkJCSIqKioqIFdyaXRlIHRvIERlYnVnIE9iamVjdDogT2JqZWN0ICVwICVzICoqKio6XG5cbiIsCiAJCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CiAKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlczogIiwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOwotCi0JCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3QgKHNvdXJjZV9kZXNjKSkgewotCQkgICBBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULAotCQkJICAgIiVwLCBJbnZhbGlkIEludGVybmFsIE9iamVjdCFcbiIsIHNvdXJjZV9kZXNjKSk7Ci0JCSAgIGJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJCWlmIChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggPT0gNCkgewotCQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAotCQkJCQkodTMyKSBzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjB4JTguOFglOC44WFxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSkpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0iLAotCQkJCSh1MzIpIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7Ci0JCQlBQ1BJX0RVTVBfQlVGRkVSIChzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwgMzIpID8gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggOiAzMik7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIFwiJXNcIlxuIiwKLQkJCQlzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyKSk7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBFbGVtZW50cyBQdHIgLSAlcFxuIiwKLQkJCQlzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudCwgc291cmNlX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpKTsKLQkJCWJyZWFrOwotCi0KLQkJZGVmYXVsdDoKLQotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVwXG4iLAotCQkJCXNvdXJjZV9kZXNjKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FWEVDLCAiXG4iKSk7CisJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0IChzb3VyY2VfZGVzYywgMCwgMCk7CiAJCWJyZWFrOwogCiAKQEAgLTI3Miw3ICszODAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbmRleF9kZXNjLApAQCAtMzEzLDE2ICs0MjEsMjIgQEAKIAkJaWYgKG9ial9kZXNjKSB7CiAJCQkvKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IGJ5IHRoZSByZWYgY291bnQgb2YgdGhlIHBhcmVudCBwYWNrYWdlICovCiAKLQkJCWZvciAoaSA9IDA7IGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7IGkrKykgeworCQkJZm9yIChpID0gMDsKKwkJCQkgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQkJaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7CisJCQkJIGkrKykgewogCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQkJfQogCQl9CiAKIAkJKihpbmRleF9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpID0gbmV3X2Rlc2M7CiAKLQkJLyogSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZSAtMSAqLworCQkvKiBJbmNyZW1lbnQgcmVmIGNvdW50IGJ5IHRoZSByZWYgY291bnQgb2YgdGhlIHBhcmVudCBwYWNrYWdlLTEgKi8KIAotCQlmb3IgKGkgPSAxOyBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OyBpKyspIHsKKwkJZm9yIChpID0gMTsKKwkJCSBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCWluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OworCQkJIGkrKykgewogCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChuZXdfZGVzYyk7CiAJCX0KIApAQCAtNDQwLDkgKzU1NCw4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9zdG9yZV9vYmplY3RfdG9fbm9kZSIsIHNvdXJjZV9kZXNjKTsKIAogCi0JLyoKLQkgKiBHZXQgY3VycmVudCB0eXBlIG9mIHRoZSBub2RlLCBhbmQgb2JqZWN0IGF0dGFjaGVkIHRvIE5vZGUKLQkgKi8KKwkvKiBHZXQgY3VycmVudCB0eXBlIG9mIHRoZSBub2RlLCBhbmQgb2JqZWN0IGF0dGFjaGVkIHRvIE5vZGUgKi8KKwogCXRhcmdldF90eXBlID0gYWNwaV9uc19nZXRfdHlwZSAobm9kZSk7CiAJdGFyZ2V0X2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwogCkBAIC00NjcsMTkgKzU4MCwxOCBAQAogCQl0YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9BTlk7CiAJfQogCi0JLyoKLQkgKiBEbyB0aGUgYWN0dWFsIHN0b3JlIG9wZXJhdGlvbgotCSAqLworCS8qIERvIHRoZSBhY3R1YWwgc3RvcmUgb3BlcmF0aW9uICovCisKIAlzd2l0Y2ggKHRhcmdldF90eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCS8qCi0JCSAqIEZvciBmaWVsZHMsIGNvcHkgdGhlIHNvdXJjZSBkYXRhIHRvIHRoZSB0YXJnZXQgZmllbGQuCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywgJndhbGtfc3RhdGUtPnJlc3VsdF9vYmopOworCQkvKiBGb3IgZmllbGRzLCBjb3B5IHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgdGFyZ2V0IGZpZWxkLiAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCAoc291cmNlX2Rlc2MsIHRhcmdldF9kZXNjLAorCQkJCSAmd2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7CiAJCWJyZWFrOwogCiAKQEAgLTQ5Myw3ICs2MDUsOCBAQAogCQkgKgogCQkgKiBDb3B5IGFuZC9vciBjb252ZXJ0IHRoZSBzb3VyY2Ugb2JqZWN0IHRvIGEgbmV3IHRhcmdldCBvYmplY3QKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCAoc291cmNlX2Rlc2MsIHRhcmdldF9kZXNjLCAmbmV3X2Rlc2MsIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkgJm5ld19kZXNjLCB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC01MjYsNyArNjM5LDggQEAKIAogCQkvKiBObyBjb252ZXJzaW9ucyBmb3IgYWxsIG90aGVyIHR5cGVzLiAgSnVzdCBhdHRhY2ggdGhlIHNvdXJjZSBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIHNvdXJjZV9kZXNjLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKTsKKwkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBzb3VyY2VfZGVzYywKKwkJCQkgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYwppbmRleCBkMzY3N2ZlLi4xMjBmMzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYwpAQCAtODEsOSArODEsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZXNvbHZlX29iamVjdCIpOwogCiAKLQkvKgotCSAqIEVuc3VyZSB3ZSBoYXZlIGEgVGFyZ2V0IHRoYXQgY2FuIGJlIHN0b3JlZCB0bwotCSAqLworCS8qIEVuc3VyZSB3ZSBoYXZlIGEgVGFyZ2V0IHRoYXQgY2FuIGJlIHN0b3JlZCB0byAqLworCiAJc3dpdGNoICh0YXJnZXRfdHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CkBAIC0xMTgsMTYgKzExNywxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKgotCQkgKiBNdXN0IGhhdmUgYSBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZwotCQkgKi8KKwkJLyogTXVzdCBoYXZlIGEgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcgKi8KKwogCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpICAgJiYKIAkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpICAgICYmCiAJCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAgICAmJgogCQkJISgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0xPQURfT1ApKSkgewotCQkJLyoKLQkJCSAqIENvbnZlcnNpb24gc3VjY2Vzc2Z1bCBidXQgc3RpbGwgbm90IGEgdmFsaWQgdHlwZQotCQkJICovCisJCQkvKiBDb252ZXJzaW9uIHN1Y2Nlc3NmdWwgYnV0IHN0aWxsIG5vdCBhIHZhbGlkIHR5cGUgKi8KKwogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkJIkNhbm5vdCBhc3NpZ24gdHlwZSAlcyB0byAlcyAobXVzdCBiZSB0eXBlIEludC9TdHIvQnVmKVxuIiwKIAkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYyksCkBAIC0xNDAsOSArMTM3LDggQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9BTElBUzoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM6CiAKLQkJLyoKLQkJICogQWxpYXNlcyBhcmUgcmVzb2x2ZWQgYnkgYWNwaV9leF9wcmVwX29wZXJhbmRzCi0JCSAqLworCQkvKiBBbGlhc2VzIGFyZSByZXNvbHZlZCBieSBhY3BpX2V4X3ByZXBfb3BlcmFuZHMgKi8KKwogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTdG9yZSBpbnRvIEFsaWFzIC0gc2hvdWxkIG5ldmVyIGhhcHBlblxuIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYwppbmRleCAwNWUxZWNhLi4xMmQxNTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYwpAQCAtMTI4LDcgKzEyOCw4IEBACiAJZWxzZSB7CiAJCS8qIFRydW5jYXRlIHRoZSBzb3VyY2UsIGNvcHkgb25seSB3aGF0IHdpbGwgZml0ICovCiAKLQkJQUNQSV9NRU1DUFkgKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgYnVmZmVyLCB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwKKwkJCXRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKTsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAogCQkJIlRydW5jYXRpbmcgc291cmNlIGJ1ZmZlciBmcm9tICVYIHRvICVYXG4iLApAQCAtMTgzLDcgKzE4NCw4IEBACiAJCSAqIFN0cmluZyB3aWxsIGZpdCBpbiBleGlzdGluZyBub24tc3RhdGljIGJ1ZmZlci4KIAkJICogQ2xlYXIgb2xkIHN0cmluZyBhbmQgY29weSBpbiB0aGUgbmV3IG9uZQogCQkgKi8KLQkJQUNQSV9NRU1TRVQgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgMCwgKGFjcGlfc2l6ZSkgdGFyZ2V0X2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJQUNQSV9NRU1TRVQgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgMCwKKwkJCShhY3BpX3NpemUpIHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKIAl9CiAJZWxzZSB7CkBAIC0xOTgsNyArMjAwLDggQEAKIAkJCUFDUElfTUVNX0ZSRUUgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAJCX0KIAotCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKChhY3BpX3NpemUpIGxlbmd0aCArIDEpOworCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAorCQkJCSAgIChhY3BpX3NpemUpIGxlbmd0aCArIDEpOwogCQlpZiAoIXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcikgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCmluZGV4IGY5MmVmYzUuLmNhZmE3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCkBAIC01NSw4ICs1NSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlCiAgKgotICogUEFSQU1FVEVSUzogIFNlbWFwaG9yZSAgICAgICAgICAgLSBPU0Qgc2VtYXBob3JlIHRvIHdhaXQgb24KLSAqICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgICAgICAgIC0gTWF4IHRpbWUgdG8gd2FpdAorICogUEFSQU1FVEVSUzogIFNlbWFwaG9yZSAgICAgICAtIFNlbWFwaG9yZSB0byB3YWl0IG9uCisgKiAgICAgICAgICAgICAgVGltZW91dCAgICAgICAgIC0gTWF4IHRpbWUgdG8gd2FpdAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC05MCw3ICs5MCw4IEBACiAKIAkJc3RhdHVzID0gYWNwaV9vc193YWl0X3NlbWFwaG9yZSAoc2VtYXBob3JlLCAxLCB0aW1lb3V0KTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCiAJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAogCQkvKiBSZWFjcXVpcmUgdGhlIGludGVycHJldGVyICovCkBAIC0xMTEsOCArMTEyLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwKICAqCi0gKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdGFsbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWljcm9zZWNvbmRzCisgKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgIC0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0YWxsLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xNDEsNyArMTQyLDggQEAKIAkJICogKEFDUEkgc3BlY2lmaWVzIDEwMCB1c2VjIGFzIG1heCwgYnV0IHRoaXMgZ2l2ZXMgc29tZSBzbGFjayBpbgogCQkgKiBvcmRlciB0byBzdXBwb3J0IGV4aXN0aW5nIEJJT1NzKQogCQkgKi8KLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RhbGw6IFRpbWUgcGFyYW1ldGVyIGlzIHRvbyBsYXJnZSAoJWQpXG4iLCBob3dfbG9uZykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTdGFsbDogVGltZSBwYXJhbWV0ZXIgaXMgdG9vIGxhcmdlICglZClcbiIsCisJCQlob3dfbG9uZykpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKIAl9CiAJZWxzZSB7CkBAIC0xNTYsOCArMTU4LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZAogICoKLSAqIFBBUkFNRVRFUlM6ICBob3dfbG9uZyAgICAgICAgICAgIC0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN1c3BlbmQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcworICogUEFSQU1FVEVSUzogIGhvd19sb25nICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdXNwZW5kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcwogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTkyLDggKzE5NCw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgKnRpbWVfZGVzYyAgICAgICAgICAtIFRoZSAndGltZSB0byBkZWxheScgb2JqZWN0IGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICAqb2JqX2Rlc2MgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgIC0gVGhlICd0aW1lIHRvIGRlbGF5JyBvYmplY3QgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMTgsMTYgKzIyMCwxNSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qCi0JICogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIGdvIGdldCB0aGUgZ2xvYmFsIGxvY2sKLQkgKi8KKwkvKiBTdXBwb3J0IGZvciB0aGUgX0dMXyBNdXRleCBvYmplY3QgLS0gZ28gZ2V0IHRoZSBnbG9iYWwgbG9jayAqLworCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayAoKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAogCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlLAotCQkJICAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOworCQkJICh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQogCkBAIC0yMzYsNyArMjM3LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI2MSw5ICsyNjIsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qCi0JICogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIHJlbGVhc2UgdGhlIGdsb2JhbCBsb2NrCi0JICovCisJLyogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIHJlbGVhc2UgdGhlIGdsb2JhbCBsb2NrICovCisKIAlpZiAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpIHsKIAkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrICgpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0yNzgsOSArMjc4LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50CiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKICAqCi0gKiBSRVRVUk46ICAgICAgQUVfT0sKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogUHJvdmlkZXMgYW4gYWNjZXNzIHBvaW50IHRvIHBlcmZvcm0gc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMKICAqICAgICAgICAgICAgICB3aXRoaW4gdGhlIEFNTC4KQEAgLTMwOSw4ICszMDksOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50CiAgKgotICogUEFSQU1FVEVSUzogICp0aW1lX2Rlc2MgICAgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAtIFRoZSAndGltZSB0byBkZWxheScgb2JqZWN0IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzMzLDcgKzMzMyw3IEBACiAKIAlpZiAob2JqX2Rlc2MpIHsKIAkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKG9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUsCi0JCQkJICAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOworCQkJCSAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTM0NCw3ICszNDQsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCmluZGV4IDQwYzZhYmIuLjVjN2VjMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwpAQCAtNjcsMjIgKzY3LDMxIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXh1dGlscyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHUzMgorYWNwaV9leF9kaWdpdHNfbmVlZGVkICgKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7CisKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcgogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKICAqIERFU0NSSVBUSU9OOiBFbnRlciB0aGUgaW50ZXJwcmV0ZXIgZXhlY3V0aW9uIHJlZ2lvbi4gIEZhaWx1cmUgdG8gZW50ZXIKICAqICAgICAgICAgICAgICB0aGUgaW50ZXJwcmV0ZXIgcmVnaW9uIGlzIGEgZmF0YWwgc3lzdGVtIGVycm9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKHZvaWQpCithY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCkBAIC0xMDQsNiArMTEzLDggQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgogICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24KICAqCiAgKiBDYXNlcyB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgaXMgdW5sb2NrZWQ6CkBAIC0xMTksNyArMTMwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAodm9pZCkKK2FjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIApAQCAtMjEyLDcgKzIyNCw4IEBACiAJCQlsb2NrZWQgPSBUUlVFOwogCQl9CiAJCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgYWNxdWlyZSBHbG9iYWwgTG9jaywgJXNcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAogCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQl9CiAJfQpAQCAtMjI4LDcgKzI0MSw3IEBACiAgKiBQQVJBTUVURVJTOiAgbG9ja2VkX2J5X21lICAgIC0gUmV0dXJuIHZhbHVlIGZyb20gY29ycmVzcG9uZGluZyBjYWxsIHRvCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZV9nbG9iYWxfbG9jay4KICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBnbG9iYWwgbG9jayBpZiBpdCBpcyBsb2NrZWQuCiAgKgpAQCAtMjY5LDExICsyODIsMTQgQEAKICAqIFBBUkFNRVRFUlM6ICBWYWx1ZSAgICAgICAgICAgLSBWYWx1ZSB0byBiZSByZXByZXNlbnRlZAogICogICAgICAgICAgICAgIEJhc2UgICAgICAgICAgICAtIEJhc2Ugb2YgcmVwcmVzZW50YXRpb24KICAqCi0gKiBSRVRVUk46ICAgICAgdGhlIG51bWJlciBvZiBkaWdpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBWYWx1ZSBpbiBCYXNlCisgKiBSRVRVUk46ICAgICAgVGhlIG51bWJlciBvZiBkaWdpdHMuCisgKgorICogREVTQ1JJUFRJT046IENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBWYWx1ZQorICogICAgICAgICAgICAgIGluIHRoZSBnaXZlbiBCYXNlIChSYWRpeCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKK3N0YXRpYyB1MzIKIGFjcGlfZXhfZGlnaXRzX25lZWRlZCAoCiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpCkBAIC0zMTIsNiArMzI4LDggQEAKICAqIFBBUkFNRVRFUlM6ICBudW1lcmljX2lkICAgICAgLSBFSVNBIElEIHRvIGJlIGNvbnZlcnRlZAogICogICAgICAgICAgICAgIG91dF9zdHJpbmcgICAgICAtIFdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIHN0cmluZyAoOCBieXRlcykKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgbnVtZXJpYyBFSVNBIElEIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNDksNyArMzY3LDEwIEBACiAgKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgY29udmVydGVkCiAgKiAgICAgICAgICAgICAgb3V0X3N0cmluZyAgICAgIC0gV2hlcmUgdG8gcHV0IHRoZSBjb252ZXJ0ZWQgc3RyaW5nICg4IGJ5dGVzKQogICoKLSAqIFJFVFVSTjogICAgICBDb252ZXJ0IGEgbnVtYmVyIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbgorICogUkVUVVJOOiAgICAgIE5vbmUsIHN0cmluZworICoKKyAqIERFU0NSSVBUT0lOOiBDb252ZXJ0IGEgbnVtYmVyIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbi4gQXNzdW1lcyBzdHJpbmcKKyAqICAgICAgICAgICAgICBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHN0cmluZy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZ2x1ZS5jIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBjZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIExpbmsgcGh5c2ljYWwgZGV2aWNlcyB3aXRoIEFDUEkgZGV2aWNlcyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA1IEludGVsIENvcnAuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisKKyNkZWZpbmUgQUNQSV9HTFVFX0RFQlVHCTAKKyNpZiBBQ1BJX0dMVUVfREVCVUcKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayhQUkVGSVggeCkKKyNlbHNlCisjZGVmaW5lIERCRyh4Li4uKQorI2VuZGlmCitzdGF0aWMgTElTVF9IRUFEKGJ1c190eXBlX2xpc3QpOworc3RhdGljIERFQ0xBUkVfUldTRU0oYnVzX3R5cGVfc2VtKTsKKworaW50IHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoc3RydWN0IGFjcGlfYnVzX3R5cGUgKnR5cGUpCit7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCWlmICh0eXBlICYmIHR5cGUtPmJ1cyAmJiB0eXBlLT5maW5kX2RldmljZSkgeworCQlkb3duX3dyaXRlKCZidXNfdHlwZV9zZW0pOworCQlsaXN0X2FkZF90YWlsKCZ0eXBlLT5saXN0LCAmYnVzX3R5cGVfbGlzdCk7CisJCXVwX3dyaXRlKCZidXNfdHlwZV9zZW0pOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiYnVzIHR5cGUgJXMgcmVnaXN0ZXJlZFxuIiwgdHlwZS0+YnVzLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUpOworCitpbnQgdW5yZWdpc3Rlcl9hY3BpX2J1c190eXBlKHN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlKQoreworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gMDsKKwlpZiAodHlwZSkgeworCQlkb3duX3dyaXRlKCZidXNfdHlwZV9zZW0pOworCQlsaXN0X2RlbF9pbml0KCZ0eXBlLT5saXN0KTsKKwkJdXBfd3JpdGUoJmJ1c190eXBlX3NlbSk7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJBQ1BJIGJ1cyB0eXBlICVzIHVucmVnaXN0ZXJlZFxuIiwgdHlwZS0+YnVzLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYWNwaV9idXNfdHlwZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqYWNwaV9nZXRfYnVzX3R5cGUoc3RydWN0IGJ1c190eXBlICp0eXBlKQoreworCXN0cnVjdCBhY3BpX2J1c190eXBlICp0bXAsICpyZXQgPSBOVUxMOworCisJZG93bl9yZWFkKCZidXNfdHlwZV9zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzX3R5cGVfbGlzdCwgbGlzdCkgeworCQlpZiAodG1wLT5idXMgPT0gdHlwZSkgeworCQkJcmV0ID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisJdXBfcmVhZCgmYnVzX3R5cGVfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFjcGlfZmluZF9icmlkZ2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKiBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfYnVzX3R5cGUgKnRtcDsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWRvd25fcmVhZCgmYnVzX3R5cGVfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJ1c190eXBlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRtcC0+ZmluZF9icmlkZ2UgJiYgIXRtcC0+ZmluZF9icmlkZ2UoZGV2LCBoYW5kbGUpKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJdXBfcmVhZCgmYnVzX3R5cGVfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZXQgUENJIHJvb3QgYnJpZGdlJ3MgaGFuZGxlIGZyb20gaXRzIHNlZ21lbnQgYW5kIGJ1cyBudW1iZXIgKi8KK3N0cnVjdCBhY3BpX2ZpbmRfcGNpX3Jvb3QgeworCXVuc2lnbmVkIGludCBzZWc7CisJdW5zaWduZWQgaW50IGJ1czsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7Cit9OworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2RvX3Jvb3RfYnJpZGdlX2J1c25yX2NhbGxiYWNrKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgKmJ1c25yID0gKGludCAqKWRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHJlc3M7CisKKwlpZiAocmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1MxNiAmJgorCSAgICByZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzMyICYmCisJICAgIHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQpCisJCXJldHVybiBBRV9PSzsKKworCWFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlc291cmNlLCAmYWRkcmVzcyk7CisJaWYgKChhZGRyZXNzLmFkZHJlc3NfbGVuZ3RoID4gMCkgJiYKKwkgICAgKGFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0JVU19OVU1CRVJfUkFOR0UpKQorCQkqYnVzbnIgPSBhZGRyZXNzLm1pbl9hZGRyZXNzX3JhbmdlOworCisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IGdldF9yb290X2JyaWRnZV9idXNucihhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCBidXMsIGJibjsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCisJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQkJOLCBOVUxMLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyAqKSZiYm4pOworCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCS8qIEFzc3VtZSBidXMgPSAwICovCisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCSAgICAgICAiQXNzdW1lIHJvb3QgYnJpZGdlIFslc10gYnVzIGlzIDBcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJc3RhdHVzID0gQUVfT0s7CisJCWJibiA9IDA7CisJfQorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQliYm4gPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChiYm4gPiAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBfQkJOIGluIHNvbWUgc3lzdGVtcyByZXR1cm4gMCBmb3IgYWxsIHJvb3QgYnJpZGdlcyAqLworCWJ1cyA9IC0xOworCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCSAgICAgZG9fcm9vdF9icmlkZ2VfYnVzbnJfY2FsbGJhY2ssICZidXMpOworCS8qIElmIF9DUlMgZmFpbGVkLCB3ZSBqdXN0IHVzZSBfQkJOICovCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8IChidXMgPT0gLTEpKQorCQlnb3RvIGV4aXQ7CisJLyogV2Ugc2VsZWN0IF9DUlMgKi8KKwlpZiAoYmJuICE9IGJ1cykgeworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkgICAgICAgIl9CQk4gYW5kIF9DUlMgcmV0dXJucyBkaWZmZXJlbnQgdmFsdWUgZm9yICVzLiBTZWxlY3QgX0NSU1xuIiwKKwkJICAgICAgIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOworCQliYm4gPSBidXM7CisJfQorICAgICAgZXhpdDoKKwlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiBiYm47Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cworZmluZF9wY2lfcm9vdGJyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290ICpmaW5kID0gKHN0cnVjdCBhY3BpX2ZpbmRfcGNpX3Jvb3QgKiljb250ZXh0OworCXVuc2lnbmVkIGxvbmcgc2VnLCBidXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCB0bXA7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX1NFRywgTlVMTCwgJnNlZyk7CisJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwkJLyogQXNzdW1lIHNlZyA9IDAgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJICAgICAgICJBc3N1bWUgcm9vdCBicmlkZ2UgWyVzXSBzZWdtZW50IGlzIDBcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJc3RhdHVzID0gQUVfT0s7CisJCXNlZyA9IDA7CisJfQorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBBRV9DVFJMX0RFUFRIOworCQlnb3RvIGV4aXQ7CisJfQorCisJdG1wID0gZ2V0X3Jvb3RfYnJpZGdlX2J1c25yKGhhbmRsZSk7CisJaWYgKHRtcCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkZpbmQgcm9vdCBicmlkZ2UgZmFpbGVkIGZvciAlc1xuIiwKKwkJICAgICAgIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOworCQlzdGF0dXMgPSBBRV9DVFJMX0RFUFRIOworCQlnb3RvIGV4aXQ7CisJfQorCWJ1cyA9IHRtcDsKKworCWlmIChzZWcgPT0gZmluZC0+c2VnICYmIGJ1cyA9PSBmaW5kLT5idXMpCisJCWZpbmQtPmhhbmRsZSA9IGhhbmRsZTsKKwlzdGF0dXMgPSBBRV9PSzsKKyAgICAgIGV4aXQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCithY3BpX2hhbmRsZSBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cykKK3sKKwlzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290IGZpbmQgPSB7IHNlZywgYnVzLCBOVUxMIH07CisKKwlhY3BpX2dldF9kZXZpY2VzKFBDSV9ST09UX0hJRF9TVFJJTkcsIGZpbmRfcGNpX3Jvb3RicmlkZ2UsICZmaW5kLCBOVUxMKTsKKwlyZXR1cm4gZmluZC5oYW5kbGU7Cit9CisKKy8qIEdldCBkZXZpY2UncyBoYW5kbGVyIHBlciBpdHMgYWRkcmVzcyB1bmRlciBpdHMgcGFyZW50ICovCitzdHJ1Y3QgYWNwaV9maW5kX2NoaWxkIHsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJYWNwaV9pbnRlZ2VyIGFkZHJlc3M7Cit9OworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2RvX2FjcGlfZmluZF9jaGlsZChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9maW5kX2NoaWxkICpmaW5kID0gKHN0cnVjdCBhY3BpX2ZpbmRfY2hpbGQgKiljb250ZXh0OworCisJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaW5mbyA9IGJ1ZmZlci5wb2ludGVyOworCQlpZiAoaW5mby0+YWRkcmVzcyA9PSBmaW5kLT5hZGRyZXNzKQorCQkJZmluZC0+aGFuZGxlID0gaGFuZGxlOworCQlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCX0KKwlyZXR1cm4gQUVfT0s7Cit9CisKK2FjcGlfaGFuZGxlIGFjcGlfZ2V0X2NoaWxkKGFjcGlfaGFuZGxlIHBhcmVudCwgYWNwaV9pbnRlZ2VyIGFkZHJlc3MpCit7CisJc3RydWN0IGFjcGlfZmluZF9jaGlsZCBmaW5kID0geyBOVUxMLCBhZGRyZXNzIH07CisKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIE5VTEw7CisJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBwYXJlbnQsCisJCQkgICAgMSwgZG9fYWNwaV9maW5kX2NoaWxkLCAmZmluZCwgTlVMTCk7CisJcmV0dXJuIGZpbmQuaGFuZGxlOworfQorCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2NoaWxkKTsKKworLyogTGluayBBQ1BJIGRldmljZXMgd2l0aCBwaHlzaWNhbCBkZXZpY2VzICovCitzdGF0aWMgdm9pZCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCQkgICB1MzIgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCit7CisJLyogd2UgcHJvdmlkZSBhbiBlbXB0eSBoYW5kbGVyICovCit9CisKKy8qIE5vdGU6IGEgc3VjY2VzcyBjYWxsIHdpbGwgaW5jcmVhc2UgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSAqLworc3RydWN0IGRldmljZSAqYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfZ2x1ZV9kYXRhX2hhbmRsZXIsICh2b2lkICoqKSZkZXYpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIGdldF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTChhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UpOworCitzdGF0aWMgaW50IGFjcGlfYmluZF9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGRldi0+ZmlybXdhcmVfZGF0YSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkgICAgICAgIkRyaXZlcnMgY2hhbmdlZCAnZmlybXdhcmVfZGF0YScgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlnZXRfZGV2aWNlKGRldik7CisJc3RhdHVzID0gYWNwaV9hdHRhY2hfZGF0YShoYW5kbGUsIGFjcGlfZ2x1ZV9kYXRhX2hhbmRsZXIsIGRldik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXB1dF9kZXZpY2UoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+ZmlybXdhcmVfZGF0YSA9IGhhbmRsZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfdW5iaW5kX29uZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCFkZXYtPmZpcm13YXJlX2RhdGEpCisJCXJldHVybiAwOworCWlmIChkZXYgPT0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGRldi0+ZmlybXdhcmVfZGF0YSkpIHsKKwkJLyogYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlIGluY3JlYXNlIHJlZmNudCBieSBvbmUgKi8KKwkJcHV0X2RldmljZShkZXYpOworCQlhY3BpX2RldGFjaF9kYXRhKGRldi0+ZmlybXdhcmVfZGF0YSwgYWNwaV9nbHVlX2RhdGFfaGFuZGxlcik7CisJCWRldi0+ZmlybXdhcmVfZGF0YSA9IE5VTEw7CisJCS8qIGFjcGlfYmluZF9vbmUgaW5jcmVhc2UgcmVmY250IGJ5IG9uZSAqLworCQlwdXRfZGV2aWNlKGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIk9vcHMsICdmaXJtd2FyZV9kYXRhJyBjb3JydXB0IGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX3BsYXRmb3JtX25vdGlmeShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfYnVzX3R5cGUgKnR5cGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFkZXYtPmJ1cyB8fCAhZGV2LT5wYXJlbnQpIHsKKwkJLyogYnJpZGdlIGRldmljZXMgZ2VuZXJuYWxseSBoYXZlbid0IGJ1cyBvciBwYXJlbnQgKi8KKwkJcmV0ID0gYWNwaV9maW5kX2JyaWRnZV9kZXZpY2UoZGV2LCAmaGFuZGxlKTsKKwkJZ290byBlbmQ7CisJfQorCXR5cGUgPSBhY3BpX2dldF9idXNfdHlwZShkZXYtPmJ1cyk7CisJaWYgKCF0eXBlKSB7CisJCURCRygiTm8gQUNQSSBidXMgc3VwcG9ydCBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCWlmICgocmV0ID0gdHlwZS0+ZmluZF9kZXZpY2UoZGV2LCAmaGFuZGxlKSkgIT0gMCkKKwkJREJHKCJDYW4ndCBnZXQgaGFuZGxlciBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKyAgICAgIGVuZDoKKwlpZiAoIXJldCkKKwkJYWNwaV9iaW5kX29uZShkZXYsIGhhbmRsZSk7CisKKyNpZiBBQ1BJX0dMVUVfREVCVUcKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCisJCWFjcGlfZ2V0X25hbWUoZGV2LT5maXJtd2FyZV9kYXRhLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCQlEQkcoIkRldmljZSAlcyAtPiAlc1xuIiwgZGV2LT5idXNfaWQsIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOworCQlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCX0gZWxzZQorCQlEQkcoIkRldmljZSAlcyAtPiBObyBBQ1BJIHN1cHBvcnRcbiIsIGRldi0+YnVzX2lkKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX3BsYXRmb3JtX25vdGlmeV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWFjcGlfdW5iaW5kX29uZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FjcGlfZGV2aWNlX25vdGlmeSh2b2lkKQoreworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gMDsKKwlpZiAocGxhdGZvcm1fbm90aWZ5IHx8IHBsYXRmb3JtX25vdGlmeV9yZW1vdmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgdXNlIHBsYXRmb3JtX25vdGlmeVxuIik7CisJCXJldHVybiAwOworCX0KKwlwbGF0Zm9ybV9ub3RpZnkgPSBhY3BpX3BsYXRmb3JtX25vdGlmeTsKKwlwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlID0gYWNwaV9wbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGluaXRfYWNwaV9kZXZpY2Vfbm90aWZ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwppbmRleCA1MjllOTIyLi5iNTEwMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCkBAIC01OCw3ICs1OCw4IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGFuZCB2YWxpZGF0ZSB2YXJpb3VzIEFDUEkgcmVnaXN0ZXJzCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgdmFsaWRhdGUgdGhlIHZhcmlvdXMgQUNQSSByZWdpc3RlcnMgZGVmaW5lZCBpbgorICogICAgICAgICAgICAgIHRoZSBGQURULgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTc1LDcgKzc2LDcgQEAKIAkvKiBXZSBtdXN0IGhhdmUgdGhlIEFDUEkgdGFibGVzIGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlICovCiAKIAlpZiAoIWFjcGlfZ2JsX0ZBRFQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJBIEZBRFQgaXMgbm90IGxvYWRlZFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIEZBRFQgaXMgcHJlc2VudFxuIikpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KQEAgLTEzMSw3ICsxMzIsOCBAQAogCSAqIHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgogCSAqLwogCWlmICghYWNwaV9nYmxfRkFEVC0+YWNwaV9lbmFibGUgJiYgIWFjcGlfZ2JsX0ZBRFQtPmFjcGlfZGlzYWJsZSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJObyBBQ1BJIG1vZGUgdHJhbnNpdGlvbiBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gKGVuYWJsZS9kaXNhYmxlIGJvdGggemVybylcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJObyBBQ1BJIG1vZGUgdHJhbnNpdGlvbiBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gKGVuYWJsZS9kaXNhYmxlIGJvdGggemVybylcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCkBAIC0xNjIsNyArMTY0LDggQEAKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCB3cml0ZSBtb2RlIGNoYW5nZSwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgd3JpdGUgbW9kZSBjaGFuZ2UsICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKQEAgLTE3Myw3ICsxNzYsOCBAQAogCXJldHJ5ID0gMzAwMDsKIAl3aGlsZSAocmV0cnkpIHsKIAkJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBtb2RlKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTW9kZSAlWCBzdWNjZXNzZnVsbHkgZW5hYmxlZFxuIiwgbW9kZSkpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsCisJCQkJbW9kZSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJCX0KIAkJYWNwaV9vc19zdGFsbCgxMDAwKTsKQEAgLTE4NSw3ICsxODksNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZ2V0X21vZGUKICAqCkBAIC0xOTksNyArMjAzLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV9od19nZXRfbW9kZSAodm9pZCkKK2FjcGlfaHdfZ2V0X21vZGUgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKaW5kZXggOWFjMWQ2My4uOGRhZWFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKQEAgLTQ4LDYgKzQ4LDEzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiaHdncGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayAoCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTM1LDYgKzE0Miw3IEBACiAgKiBERVNDUklQVElPTjogUmV0dXJuIHRoZSBzdGF0dXMgb2YgYSBzaW5nbGUgR1BFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKApAQCAtMjA2LDcgKzIxNCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFsbCBHUEVzIHdpdGhpbiBhIEdQRSBibG9jaworICogREVTQ1JJUFRJT046IERpc2FibGUgYWxsIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jawogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI0NCw3ICsyNTIsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogQ2xlYXIgc3RhdHVzIGJpdHMgZm9yIGFsbCBHUEVzIHdpdGhpbiBhIEdQRSBibG9jaworICogREVTQ1JJUFRJT046IENsZWFyIHN0YXR1cyBiaXRzIGZvciBhbGwgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjgyLDggKzI5MCw4IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJydW50aW1lIiBHUEVzIHdpdGhpbiBhIEdQRSBibG9jay4gKEluY2x1ZGVzCi0gKiAgICAgICAgICAgICAgY29tYmluYXRpb24gd2FrZS9ydW4gR1BFcy4pCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrLiBJbmNsdWRlcworICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzI3LDEyICszMzUsMTIgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgIndha2UiIEdQRXMgd2l0aGluIGEgR1BFIGJsb2NrLiAgKEluY2x1ZGVzCi0gKiAgICAgICAgICAgICAgY29tYmluYXRpb24gd2FrZS9ydW4gR1BFcy4pCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAid2FrZSIgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrLiBJbmNsdWRlcworICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayAoCiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQpAQCAtMzUwLDcgKzM1OCw4IEBACiAKIAkJLyogRW5hYmxlIGFsbCAid2FrZSIgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsIGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfZm9yX3dha2UsCisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LAorCQkJCSBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2Zvcl93YWtlLAogCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9hZGRyZXNzKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwpAQCAtMzY5LDcgKzM3OCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgR1BFcworICogREVTQ1JJUFRJT046IERpc2FibGUgYW5kIGNsZWFyIGFsbCBHUEVzIGluIGFsbCBHUEUgYmxvY2tzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzk3LDcgKzQwNiw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsIEdQRXMgb2YgdGhlIGdpdmVuIHR5cGUKKyAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJydW50aW1lIiBHUEVzLCBpbiBhbGwgR1BFIGJsb2NrcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQyNCw3ICs0MzMsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCBHUEVzIG9mIHRoZSBnaXZlbiB0eXBlCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAid2FrZXVwIiBHUEVzLCBpbiBhbGwgR1BFIGJsb2NrcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwppbmRleCA5MWFmMGMyLi42ZDllNGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCkBAIC04Nyw4ICs4Nyw5IEBACiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJICBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KQEAgLTEzOCwyOCArMTM5LDMwIEBACiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2xlZXBfc3RhdGVfbmFtZTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSIpOwogCiAKLQkvKgotCSAqIFZhbGlkYXRlIHBhcmFtZXRlcnMKLQkgKi8KKwkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCisKIAlpZiAoKHNsZWVwX3N0YXRlID4gQUNQSV9TX1NUQVRFU19NQVgpIHx8CiAJCSFzbGVlcF90eXBlX2EgfHwgIXNsZWVwX3R5cGVfYikgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qCi0JICogRXZhbHVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIGZvciB0aGlzIHN0YXRlCi0JICovCisJLyogRXZhbHVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIGZvciB0aGlzIHN0YXRlICovCisKIAlpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAoKGNoYXIgKikgYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdLAotCQkJICAmaW5mbyk7CisJaW5mby5yZXR1cm5fb2JqZWN0ID0gTlVMTDsKKwlzbGVlcF9zdGF0ZV9uYW1lID0gKGNoYXIgKikgYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdOworCisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lIChzbGVlcF9zdGF0ZV9uYW1lLCAmaW5mbyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJXMgd2hpbGUgZXZhbHVhdGluZyBzbGVlcF9zdGF0ZSBbJXNdXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBhY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tzbGVlcF9zdGF0ZV0pKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSIlcyB3aGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc11cbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIHNsZWVwX3N0YXRlX25hbWUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtMTY3LDQ1ICsxNzAsNTcgQEAKIAkvKiBNdXN0IGhhdmUgYSByZXR1cm4gb2JqZWN0ICovCiAKIAlpZiAoIWluZm8ucmV0dXJuX29iamVjdCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNaXNzaW5nIFNsZWVwIFN0YXRlIG9iamVjdFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJObyBTbGVlcCBTdGF0ZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBbJXNdXG4iLAorCQkJc2xlZXBfc3RhdGVfbmFtZSkpOwogCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAJfQogCiAJLyogSXQgbXVzdCBiZSBvZiB0eXBlIFBhY2thZ2UgKi8KIAogCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIFN0YXRlIG9iamVjdCBub3QgYSBQYWNrYWdlXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIFN0YXRlIHJldHVybiBvYmplY3QgaXMgbm90IGEgUGFja2FnZVxuIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCX0KIAotCS8qIFRoZSBwYWNrYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMgKi8KLQorCS8qCisJICogVGhlIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4gIE5PVEUgKE1hcmNoIDIwMDUpOiBUaGlzCisJICogZ29lcyBhZ2FpbnN0IHRoZSBjdXJyZW50IEFDUEkgc3BlYyB3aGljaCBkZWZpbmVzIHRoaXMgb2JqZWN0IGFzIGEKKwkgKiBwYWNrYWdlIHdpdGggb25lIGVuY29kZWQgRFdPUkQgZWxlbWVudC4gIEhvd2V2ZXIsIGV4aXN0aW5nIHByYWN0aWNlCisJICogYnkgQklPUyB2ZW5kb3JzIHNlZW1zIHRvIGJlIHRvIGhhdmUgMiBvciBtb3JlIGVsZW1lbnRzLCBhdCBsZWFzdAorCSAqIG9uZSBwZXIgc2xlZXAgdHlwZSAoQS9CKS4KKwkgKi8KIAllbHNlIGlmIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQgPCAyKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIFN0YXRlIHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHNcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50c1xuIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfTk9fT1BFUkFORDsKIAl9CiAKIAkvKiBUaGUgZmlyc3QgdHdvIGVsZW1lbnRzIG11c3QgYm90aCBiZSBvZiB0eXBlIEludGVnZXIgKi8KIAotCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKLQkJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkgIT0gQUNQSV9UWVBFX0lOVEVHRVIpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIFN0YXRlIHBhY2thZ2UgZWxlbWVudHMgYXJlIG5vdCBib3RoIEludGVnZXJzICglcywgJXMpXG4iLAorCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKQorCQkJICE9IEFDUElfVFlQRV9JTlRFR0VSKSB8fAorCQkJIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKQorCQkJCSE9IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGVsZW1lbnRzIGFyZSBub3QgYm90aCBJbnRlZ2VycyAoJXMsICVzKVxuIiwKIAkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSksCiAJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJfQogCWVsc2UgewotCQkvKgotCQkgKiBWYWxpZCBfU3hfIHBhY2thZ2Ugc2l6ZSwgdHlwZSwgYW5kIHZhbHVlCi0JCSAqLwotCQkqc2xlZXBfdHlwZV9hID0gKHU4KSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKLQkJKnNsZWVwX3R5cGVfYiA9ICh1OCkgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7CisJCS8qIFZhbGlkIF9TeF8gcGFja2FnZSBzaXplLCB0eXBlLCBhbmQgdmFsdWUgKi8KKworCQkqc2xlZXBfdHlwZV9hID0gKHU4KQorCQkJKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSktPmludGVnZXIudmFsdWU7CisJCSpzbGVlcF90eXBlX2IgPSAodTgpCisJCQkoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKS0+aW50ZWdlci52YWx1ZTsKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIldoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLAotCQkJYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdLCBpbmZvLnJldHVybl9vYmplY3QsCisJCQkiJXMgV2hpbGUgZXZhbHVhdGluZyBzbGVlcF9zdGF0ZSBbJXNdLCBiYWQgU2xlZXAgb2JqZWN0ICVwIHR5cGUgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksCisJCQlzbGVlcF9zdGF0ZV9uYW1lLCBpbmZvLnJldHVybl9vYmplY3QsCiAJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChpbmZvLnJldHVybl9vYmplY3QpKSk7CiAJfQogCkBAIC0yMjEsOSArMjM2LDkgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfaWQgICAgICAgICAtIEluZGV4IG9mIEFDUEkgUmVnaXN0ZXIgdG8gYWNjZXNzCiAgKgotICogUkVUVVJOOiAgICAgIFRoZSBiaXQgbWFzayB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRoZSByZWdpc3RlcgorICogUkVUVVJOOiAgICAgIFRoZSBiaXRtYXNrIHRvIGJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIHJlZ2lzdGVyCiAgKgotICogREVTQ1JJUFRJT046IE1hcCByZWdpc3Rlcl9pZCBpbnRvIGEgcmVnaXN0ZXIgYml0IG1hc2suCisgKiBERVNDUklQVElPTjogTWFwIHJlZ2lzdGVyX2lkIGludG8gYSByZWdpc3RlciBiaXRtYXNrLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM1OSw3ICszNzQsNyBAQAogCS8qIEFsd2F5cyBkbyBhIHJlZ2lzdGVyIHJlYWQgZmlyc3Qgc28gd2UgY2FuIGluc2VydCB0aGUgbmV3IGJpdHMgICovCiAKIAlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJICBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlciwgJnJlZ2lzdGVyX3ZhbHVlKTsKKwkJCSBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlciwgJnJlZ2lzdGVyX3ZhbHVlKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KQEAgLTM5Niw3ICs0MTEsNyBAQAogCQkJCWJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLCB2YWx1ZSk7CiAKIAkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJICBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKKwkJCQkgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CiAJCWJyZWFrOwogCiAKQEAgLTQxMyw3ICs0MjgsNyBAQAogCQkJCWJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLCB2YWx1ZSk7CiAKIAkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJICBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CisJCQkJIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKIAkJYnJlYWs7CiAKIApAQCAtNDI3LDE3ICs0NDIsMTkgQEAKIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlBNMiBjb250cm9sOiBSZWFkICVYIGZyb20gJTguOFglOC44WFxuIiwKIAkJCXJlZ2lzdGVyX3ZhbHVlLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJCUFDUElfRk9STUFUX1VJTlQ2NCAoCisJCQkJYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CiAKIAkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUgKHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKIAkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOwogCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiQWJvdXQgdG8gd3JpdGUgJTQuNFggdG8gJTguOFglOC44WFxuIiwKIAkJCXJlZ2lzdGVyX3ZhbHVlLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJCUFDUElfRk9STUFUX1VJTlQ2NCAoCisJCQkJYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJICAgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwgKHU4KSAocmVnaXN0ZXJfdmFsdWUpKTsKKwkJCQkgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwgKHU4KSAocmVnaXN0ZXJfdmFsdWUpKTsKIAkJYnJlYWs7CiAKIApAQCAtNDU0LDcgKzQ3MSw5IEBACiAKIAkvKiBOb3JtYWxpemUgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgKi8KIAotCUFDUElfREVCVUdfRVhFQyAocmVnaXN0ZXJfdmFsdWUgPSAoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spID4+IGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKSk7CisJQUNQSV9ERUJVR19FWEVDIChyZWdpc3Rlcl92YWx1ZSA9CisJCSgocmVnaXN0ZXJfdmFsdWUgJiBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaykgPj4KKwkJCWJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKSk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlNldCBiaXRzOiAlOC44WCBhY3R1YWwgJTguOFggcmVnaXN0ZXIgJVhcbiIsCiAJCQl2YWx1ZSwgcmVnaXN0ZXJfdmFsdWUsIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSk7CkBAIC00NjksNyArNDg4LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgdXNlX2xvY2sgICAgICAgICAgICAtIE11dGV4IGh3IGFjY2VzcwogICogICAgICAgICAgICAgIHJlZ2lzdGVyX2lkICAgICAgICAgLSByZWdpc3Rlcl9pRCArIE9mZnNldAotICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBWYWx1ZSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIFdoZXJlIHRoZSByZWdpc3RlciB2YWx1ZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHRoZSB2YWx1ZSByZWFkLgogICoKQEAgLTU1Nyw3ICs1NzYsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVhcbiIsIHJlZ2lzdGVyX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVhcbiIsCisJCQlyZWdpc3Rlcl9pZCkpOwogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlicmVhazsKIAl9CkBAIC03NjMsMTAgKzc4MywxMSBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiUmVhZDogICU4LjhYIHdpZHRoICUyZCBmcm9tICU4LjhYJTguOFggKCVzKVxuIiwKLQkJCSp2YWx1ZSwgd2lkdGgsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywKKwkJIlJlYWQ6ICAlOC44WCB3aWR0aCAlMmQgZnJvbSAlOC44WCU4LjhYICglcylcbiIsCisJCSp2YWx1ZSwgd2lkdGgsCisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcyksCisJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWctPmFkZHJlc3Nfc3BhY2VfaWQpKSk7CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CkBAIC04NDEsMTAgKzg2MiwxMSBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiV3JvdGU6ICU4LjhYIHdpZHRoICUyZCAgIHRvICU4LjhYJTguOFggKCVzKVxuIiwKLQkJCXZhbHVlLCB3aWR0aCwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcyksCi0JCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLAorCQkiV3JvdGU6ICU4LjhYIHdpZHRoICUyZCAgIHRvICU4LjhYJTguOFggKCVzKVxuIiwKKwkJdmFsdWUsIHdpZHRoLAorCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAorCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKaW5kZXggNzdiM2U5YS4uNDE1ZDM0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCkBAIC00MywyNyArNDMsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3c2xlZXAiKQogCiAKLSNkZWZpbmUgTUVUSE9EX05BTUVfX0JGUyAgICAgICAgIlxcX0JGUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX0dUUyAgICAgICAgIlxcX0dUUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BUUyAgICAgICAgIlxcX1BUUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1NTVCAgICAgICAgIlxcX1NJLl9TU1QiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19XQUsgICAgICAgICJcXF9XQUsiCi0KLSNkZWZpbmUgQUNQSV9TU1RfSU5ESUNBVE9SX09GRiAgMAotI2RlZmluZSBBQ1BJX1NTVF9XT1JLSU5HICAgICAgICAxCi0jZGVmaW5lIEFDUElfU1NUX1dBS0lORyAgICAgICAgIDIKLSNkZWZpbmUgQUNQSV9TU1RfU0xFRVBJTkcgICAgICAgMwotI2RlZmluZSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUICA0Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcgogICoKQEAgLTcyLDcgKzU4LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IGFjY2VzcyBmdW5jdGlvbiBmb3IgZF9maXJtd2FyZV93YWtpbmdfdmVjdG9yIGZpZWxkIGluIEZBQ1MKKyAqIERFU0NSSVBUSU9OOiBBY2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBmaXJtd2FyZV93YWtpbmdfdmVjdG9yIGZpZWxkIGluIEZBQ1MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC05OSwxOSArODUsMjAgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yCiAgKgotICogUEFSQU1FVEVSUzogICpwaHlzaWNhbF9hZGRyZXNzICAgLSBPdXRwdXQgYnVmZmVyIHdoZXJlIGNvbnRlbnRzIG9mCisgKiBQQVJBTUVURVJTOiAgKnBoeXNpY2FsX2FkZHJlc3MgICAtIFdoZXJlIHRoZSBjb250ZW50cyBvZgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRkFDUyB3aWxsIGJlIHN0b3JlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZBQ1Mgd2lsbCBiZSByZXR1cm5lZC4KICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCB2ZWN0b3IKICAqCi0gKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciBmaXJtd2FyZV93YWtpbmdfdmVjdG9yIGZpZWxkIGluIEZBQ1MKKyAqIERFU0NSSVBUSU9OOiBBY2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBmaXJtd2FyZV93YWtpbmdfdmVjdG9yIGZpZWxkIGluIEZBQ1MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yICgKQEAgLTE0MSw3ICsxMjgsNyBAQAogI2VuZGlmCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwCiAgKgpAQCAtMjE1LDcgKzIwMiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGOyAvKiBEZWZhdWx0IGlzIGluZGljYXRvciBvZmYgKi8KKwkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGOyAvKiBEZWZhdWx0IGlzIG9mZiAqLwogCQlicmVhazsKIAl9CiAKQEAgLTIyMywxNCArMjEwLDE1IEBACiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJIEFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkgQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUKICAqCkBAIC0yOTksMTUgKzI4NywxOCBAQAogCiAJLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgUE0xQSBjb250cm9sICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAmUE0xQWNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwgIkVudGVyaW5nIHNsZWVwIHN0YXRlIFtTJWRdXG4iLCBzbGVlcF9zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCisJCSJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKIAogCS8qIENsZWFyIFNMUF9FTiBhbmQgU0xQX1RZUCBmaWVsZHMgKi8KIAotCVBNMUFjb250cm9sICY9IH4oc2xlZXBfdHlwZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrIHwgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spOworCVBNMUFjb250cm9sICY9IH4oc2xlZXBfdHlwZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrIHwKKwkJCSAgIHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKIAlQTTFCY29udHJvbCA9IFBNMUFjb250cm9sOwogCiAJLyogSW5zZXJ0IFNMUF9UWVAgYml0cyAqLwpAQCAtMzIyLDEyICszMTMsMTQgQEAKIAogCS8qIFdyaXRlICMxOiBmaWxsIGluIFNMUF9UWVAgZGF0YSAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCSBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTM0MSwyMiArMzM0LDI1IEBACiAKIAlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSAoKTsKIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwgUE0xQWNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLCBQTTFCY29udHJvbCk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKIAlpZiAoc2xlZXBfc3RhdGUgPiBBQ1BJX1NUQVRFX1MzKSB7CiAJCS8qCi0JCSAqIFdlIHdhbnRlZCB0byBzbGVlcCA+IFMzLCBidXQgaXQgZGlkbid0IGhhcHBlbiAoYnkgdmlydHVlIG9mIHRoZSBmYWN0IHRoYXQKLQkJICogd2UgYXJlIHN0aWxsIGV4ZWN1dGluZyEpCisJCSAqIFdlIHdhbnRlZCB0byBzbGVlcCA+IFMzLCBidXQgaXQgZGlkbid0IGhhcHBlbiAoYnkgdmlydHVlIG9mIHRoZQorCQkgKiBmYWN0IHRoYXQgd2UgYXJlIHN0aWxsIGV4ZWN1dGluZyEpCiAJCSAqCi0JCSAqIFdhaXQgdGVuIHNlY29uZHMsIHRoZW4gdHJ5IGFnYWluLiBUaGlzIGlzIHRvIGdldCBTNC9TNSB0byB3b3JrIG9uIGFsbCBtYWNoaW5lcy4KKwkJICogV2FpdCB0ZW4gc2Vjb25kcywgdGhlbiB0cnkgYWdhaW4uIFRoaXMgaXMgdG8gZ2V0IFM0L1M1IHRvIHdvcmsgb24KKwkJICogYWxsIG1hY2hpbmVzLgogCQkgKgogCQkgKiBXZSB3YWl0IHNvIGxvbmcgdG8gYWxsb3cgY2hpcHNldHMgdGhhdCBwb2xsIHRoaXMgcmVnIHZlcnkgc2xvd2x5IHRvCiAJCSAqIHN0aWxsIHJlYWQgdGhlIHJpZ2h0IHZhbHVlLiBJZGVhbGx5LCB0aGlzIGJsb2NrIHdvdWxkIGdvCkBAIC0zNjQsNyArMzYwLDggQEAKIAkJICovCiAJCWFjcGlfb3Nfc3RhbGwgKDEwMDAwMDAwKTsKIAotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCiAJCQkJIHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMzc0LDcgKzM3MSw4IEBACiAJLyogV2FpdCB1bnRpbCB3ZSBlbnRlciBzbGVlcCBzdGF0ZSAqLwogCiAJZG8gewotCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSwKKwkJCUFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0zODgsNyArMzg2LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MKICAqCkBAIC00MzksMTEgKzQzNywxMyBAQAogCiAJQUNQSV9GTFVTSF9DUFVfQ0FDSEUgKCk7CiAKLQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPlM0Ymlvc19yZXEsIDgpOworCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKKwkJCSAodTMyKSBhY3BpX2dibF9GQURULT5TNGJpb3NfcmVxLCA4KTsKIAogCWRvIHsKIAkJYWNwaV9vc19zdGFsbCgxMDAwKTsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCisJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2xlYXZlX3NsZWVwX3N0YXRlCiAgKgpAQCAtNTM0LDE4ICs1MzQsMjEgQEAKIAlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dBS0lORzsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlhcmcuaW50ZWdlci52YWx1ZSA9IHNsZWVwX3N0YXRlOwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fQkZTLCAmYXJnX2xpc3QsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX0JGUyBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9CRlMgZmFpbGVkLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fV0FLLCAmYXJnX2xpc3QsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1dBSyBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9XQUsgZmFpbGVkLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAkvKiBUQkQ6IF9XQUsgInNvbWV0aW1lcyIgcmV0dXJucyBzdHVmZiAtIGRvIHdlIHdhbnQgdG8gbG9vayBhdCBpdD8gKi8KIApAQCAtNTY3LDE1ICs1NzAsMTkgQEAKIAogCS8qIEVuYWJsZSBwb3dlciBidXR0b24gKi8KIAotCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5lbmFibGVfcmVnaXN0ZXJfaWQsCisJKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyKAorCQkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLAogCQkJMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5zdGF0dXNfcmVnaXN0ZXJfaWQsCisKKwkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoCisJCQlhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5zdGF0dXNfcmVnaXN0ZXJfaWQsCiAJCQkxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAKIAlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dPUktJTkc7CiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKaW5kZXggMTkwNjE2Ny4uNDlkN2IzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCkBAIC00Myw3ICs0Myw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCkBAIC05MCw3ICs4OSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIFRpY2tzICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGltZXIgdmFsdWUgaXMgcmV0dXJuZWQKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBjdXJyZW50IHRpY2tzCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBjdXJyZW50IHRpbWVyIHZhbHVlICh0aWNrcykKICAqCiAgKiBERVNDUklQVElPTjogT2J0YWlucyBjdXJyZW50IHZhbHVlIG9mIEFDUEkgUE0gVGltZXIgKGluIHRpY2tzKS4KICAqCkBAIC0xOTksNSArMTk4LDYgQEAKIAkqdGltZV9lbGFwc2VkID0gKHUzMikgcXVvdGllbnQ7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hvdGtleS5jIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmRmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvaG90a2V5LmMKQEAgLTAsMCArMSwxMDE5IEBACisvKiAKKyAqICBob3RrZXkuYyAtIEFDUEkgSG90a2V5IERyaXZlciAoJFJldmlzaW9uOiQpCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMdW1pbmcgWXUgPGx1bWluZy55dUBpbnRlbC5jb20+CisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIEhPVEtFWV9BQ1BJX1ZFUlNJT04gIjAuMSIKKworI2RlZmluZSBIT1RLRVlfUFJPQyAiaG90a2V5IgorI2RlZmluZSBIT1RLRVlfRVZfQ09ORklHICAgICJldmVudF9jb25maWciCisjZGVmaW5lIEhPVEtFWV9QTF9DT05GSUcgICAgInBvbGxfY29uZmlnIgorI2RlZmluZSBIT1RLRVlfQUNUSU9OICAgImFjdGlvbiIKKyNkZWZpbmUgSE9US0VZX0lORk8gImluZm8iCisKKyNkZWZpbmUgQUNQSV9IT1RLX05BTUUgICAgICAgICAgIkdlbmVyaWMgSG90a2V5IERyaXZlciIKKyNkZWZpbmUgQUNQSV9IT1RLX0NMQVNTICAgICAgICAgIkhvdGtleSIKKyNkZWZpbmUgQUNQSV9IT1RLX0RFVklDRV9OQU1FICAgIkhvdGtleSIKKyNkZWZpbmUgQUNQSV9IT1RLX0hJRCAgICAgICAgICAgIlVua25vd24/IgorI2RlZmluZSBBQ1BJX0hPVEtFWV9DT01QT05FTlQgICAweDIwMDAwMDAwCisKKyNkZWZpbmUgQUNQSV9IT1RLRVlfRVZFTlQgICAweDEKKyNkZWZpbmUgQUNQSV9IT1RLRVlfUE9MTElORyAweDIKKyNkZWZpbmUgQUNQSV9VTkRFRklORURfRVZFTlQgICAgMHhmCisKKyNkZWZpbmUgTUFYX0NPTkZJR19SRUNPUkRfTEVOICAgODAKKyNkZWZpbmUgTUFYX05BTUVfUEFUSF9MRU4gICA4MAorI2RlZmluZSBNQVhfQ0FMTF9QQVJNICAgICAgIDgwCisKKyNkZWZpbmUgSVNfRVZFTlQoZSkgICAgICAgMHhmZgkvKiAoKGUpICYgMHg0MDAwMDAwMCkgICovCisjZGVmaW5lIElTX1BPTEwoZSkgICAgICAweGZmCS8qICh+KChlKSAmIDB4NDAwMDAwMDApKSAgKi8KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX0hPVEtFWV9DT01QT05FTlQKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfaG90a2V5IikKKworICAgIE1PRFVMRV9BVVRIT1IoImx1bWluZy55dUBpbnRlbC5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTihBQ1BJX0hPVEtfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qICBzdGFuZGFyZGl6ZWQgaW50ZXJuYWwgaG90a2V5IG51bWJlci9ldmVudCAgKi8KK2VudW0geworCS8qIFZpZGVvIEV4dGVuc2lvbiBldmVudCAqLworCUhLX0VWRU5UX0NZQ0xFX09VVFBVVF9ERVZJQ0UgPSAweDgwLAorCUhLX0VWRU5UX09VVFBVVF9ERVZJQ0VfU1RBVFVTX0NIQU5HRSwKKwlIS19FVkVOVF9DWUNMRV9ESVNQTEFZX09VVFBVVCwKKwlIS19FVkVOVF9ORVhUX0RJU1BMQVlfT1VUUFVULAorCUhLX0VWRU5UX1BSRVZJT1VTX0RJU1BMQVlfT1VUUFVULAorCUhLX0VWRU5UX0NZQ0xFX0JSSUdIVE5FU1MsCisJSEtfRVZFTlRfSU5DUkVBU0VfQlJJR0hUTkVTUywKKwlIS19FVkVOVF9ERUNSRUFTRV9CUklHSFRORVNTLAorCUhLX0VWRU5UX1pFUk9fQlJJR0hUTkVTUywKKwlIS19FVkVOVF9ESVNQTEFZX0RFVklDRV9PRkYsCisKKwkvKiBTbmQgQ2FyZCBldmVudCAqLworCUhLX0VWRU5UX1ZPTFVNRV9NVVRFLAorCUhLX0VWRU5UX1ZPTFVNRV9JTkNMUkVBU0UsCisJSEtfRVZFTlRfVk9MVU1FX0RFQ1JFQVNFLAorCisJLyogcnVubmluZyBzdGF0ZSBjb250cm9sICovCisJSEtfRVZFTlRfRU5URVJSSU5HX1MzLAorCUhLX0VWRU5UX0VOVEVSUklOR19TNCwKKwlIS19FVkVOVF9FTlRFUlJJTkdfUzUsCit9OworCisvKiAgcHJvY2RpciB3ZSB1c2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9wcm9jX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9jb25maWc7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfcG9sbF9jb25maWc7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfYWN0aW9uOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X2luZm87CisKKy8qIGxpbmthZ2UgZm9yIGFsbCB0eXBlIG9mIGhvdGtleSAqLworc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKKwlpbnQgaG90a2V5X3R5cGU7CS8qIGV2ZW50IG9yIHBvbGxpbmcgYmFzZWQgaG90a2V5ICAqLworCWludCBob3RrZXlfc3RhbmRhcmRfbnVtOwkvKiBzdGFuZGFyZGl6ZWQgaG90a2V5KGV2ZW50KSBudW1iZXIgKi8KK307CisKKy8qIGV2ZW50IGJhc2VkIGhvdGtleSAqLworc3RydWN0IGFjcGlfZXZlbnRfaG90a2V5IHsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBob3RrZXlfbGluazsKKwlpbnQgZmxhZzsKKwlhY3BpX2hhbmRsZSBidXNfaGFuZGxlOwkvKiBidXMgdG8gaW5zdGFsbCBub3RpZnkgaGFuZGxlciAqLworCWludCBleHRlcm5hbF9ob3RrZXlfbnVtOwkvKiBleHRlcm5hbCBob3RrZXkvZXZlbnQgbnVtYmVyICovCisJYWNwaV9oYW5kbGUgYWN0aW9uX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgYW1sIGFjdGlvbiBtZXRob2QgKi8KKwljaGFyICphY3Rpb25fbWV0aG9kOwkvKiBhY3Rpb24gbWV0aG9kICovCit9OworCisvKiAKKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBwb2xsIHN0YXR1cworICogMS4gZGlyZWN0eSBjYWxsIHJlYWRfeHh4IG1ldGhvZCwgd2l0aG91dCBhbnkgYXJndW1lbnRzIHBhc3NlZCBpbgorICogMi4gY2FsbCB3cml0ZV94eHggbWV0aG9kLCB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgaW4sIHlvdSBuZWVkCisgKiB0aGUgcmVzdWx0IGlzIHNhdmVkIGluIGFjcGlfcG9sbGluZ19ob3RrZXkucG9sbF9yZXN1bHQuCisgKiBhbnRob2VyIHJlYWQgY29tbWFuZCB0aHJvdWdoIHBvbGxpbmcgaW50ZXJmYWNlLgorICoKKyAqLworCisvKiBwb2xsaW5nIGJhc2VkIGhvdGtleSAqLworc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgeworCXN0cnVjdCBhY3BpX2hvdGtleV9saW5rIGhvdGtleV9saW5rOworCWludCBmbGFnOworCWFjcGlfaGFuZGxlIHBvbGxfaGFuZGxlOwkvKiBhY3BpIGhhbmRsZSBhdHRhY2hlZCBwb2xsaW5nIG1ldGhvZCAqLworCWNoYXIgKnBvbGxfbWV0aG9kOwkvKiBwb2xsIG1ldGhvZCAqLworCWFjcGlfaGFuZGxlIGFjdGlvbl9oYW5kbGU7CS8qIGFjcGkgaGFuZGxlIGF0dGFjaGVkIGFjdGlvbiBtZXRob2QgKi8KKwljaGFyICphY3Rpb25fbWV0aG9kOwkvKiBhY3Rpb24gbWV0aG9kICovCisJdm9pZCAqcG9sbF9yZXN1bHQ7CS8qIHBvbGxpbmdfcmVzdWx0ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworfTsKKworLyogaG90a2V5IG9iamVjdCB1bmlvbiAqLwordW5pb24gYWNwaV9ob3RrZXkgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBsaW5rOworCXN0cnVjdCBhY3BpX2V2ZW50X2hvdGtleSBldmVudF9ob3RrZXk7CisJc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgcG9sbF9ob3RrZXk7Cit9OworCisvKiBob3RrZXkgb2JqZWN0IGxpc3QgKi8KK3N0cnVjdCBhY3BpX2hvdGtleV9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOworCWludCBjb3VudDsKK307CisKK3N0YXRpYyBpbnQgYXV0b19ob3RrZXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYXV0b19ob3RrZXlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgaG90a2V5X2RyaXZlciA9IHsKKwkubmFtZSA9IEFDUElfSE9US19OQU1FLAorCS5jbGFzcyA9IEFDUElfSE9US19DTEFTUywKKwkuaWRzID0gQUNQSV9IT1RLX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYXV0b19ob3RrZXlfYWRkLAorCQkucmVtb3ZlID0gYXV0b19ob3RrZXlfcmVtb3ZlLAorCQl9LAorfTsKKworc3RhdGljIGludCBob3RrZXlfb3Blbl9jb25maWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgaG90a2V5X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpOworc3RhdGljIHNzaXplX3QgaG90a2V5X3dyaXRlX3BvbGxfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgaG90a2V5X2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGhvdGtleV9hY3Rpb25fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCBob3RrZXlfZXhlY3V0ZV9hbWxfbWV0aG9kKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpOworc3RhdGljIGludCBob3RrZXlfY29uZmlnX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworLyogZXZlbnQgYmFzZWQgY29uZmlnICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfY29uZmlnX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfb3Blbl9jb25maWcsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBob3RrZXlfd3JpdGVfY29uZmlnLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIHBvbGxpbmcgYmFzZWQgY29uZmlnICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfcG9sbF9jb25maWdfZm9wcyA9IHsKKwkub3BlbiA9IGhvdGtleV9vcGVuX2NvbmZpZywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGhvdGtleV93cml0ZV9wb2xsX2NvbmZpZywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBob3RrZXkgZHJpdmVyIGluZm8gKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogYWN0aW9uICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfYWN0aW9uX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfYWN0aW9uX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBob3RrZXlfZXhlY3V0ZV9hbWxfbWV0aG9kLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIHBvbGxpbmcgcmVzdWx0cyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X3BvbGxpbmdfZm9wcyA9IHsKKwkub3BlbiA9IGhvdGtleV9wb2xsaW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCBnbG9iYWxfaG90a2V5X2xpc3Q7CS8qIGxpbmsgYWxsIGV2IG9yIHBsIGhvdGtleSAgKi8KK3N0cnVjdCBsaXN0X2hlYWQgaG90a2V5X2VudHJpZXM7CS8qIGhlYWQgb2YgdGhlIGxpc3Qgb2YgaG90a2V5X2xpc3QgKi8KKworc3RhdGljIGludCBob3RrZXlfaW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9pbmZvX3NlcV9zaG93Iik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkhvdGtleSBnZW5lcmljIGRyaXZlciB2ZXI6ICVzIiwgSE9US0VZX0FDUElfVkVSU0lPTik7CisKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaG90a2V5X2luZm9fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgY2hhciAqZm9ybWF0X3Jlc3VsdCh1bmlvbiBhY3BpX29iamVjdCAqb2JqZWN0KQoreworCWNoYXIgKmJ1ZiA9IChjaGFyICopa21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKworCW1lbXNldChidWYsIDAsIHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOworCisJLyogTm93LCBqdXN0IHN1cHBvcnQgaW50ZWdlciB0eXBlICovCisJaWYgKG9iamVjdC0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKKwkJc3ByaW50ZihidWYsICIlZCIsICh1MzIpIG9iamVjdC0+aW50ZWdlci52YWx1ZSk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgKnBvbGxfaG90a2V5ID0KKwkgICAgKHN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICopc2VxLT5wcml2YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X3BvbGxpbmdfc2VxX3Nob3ciKTsKKworCWlmIChwb2xsX2hvdGtleS0+cG9sbF9yZXN1bHQpCisJCXNlcV9wcmludGYoc2VxLCAiJXMiLCBmb3JtYXRfcmVzdWx0KHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCkpOworCisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9wb2xsaW5nX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIGludCBob3RrZXlfYWN0aW9uX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworLyogTWFwcGluZyBleHRlcm5hbCBob3RrZXkgbnVtYmVyIHRvIHN0YW5kYXJkaXplZCBob3RrZXkgZXZlbnQgbnVtICovCitzdGF0aWMgaW50IGhvdGtleV9nZXRfaW50ZXJuYWxfZXZlbnQoaW50IGV2ZW50LCBzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKwlpbnQgdmFsID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9nZXRfaW50ZXJuYWxfZXZlbnQiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBsaXN0LT5lbnRyaWVzKSB7CisJCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQorCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKKwkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVAorCQkgICAgJiYga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9PSBldmVudCkKKwkJCXZhbCA9IGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtOworCQllbHNlCisJCQl2YWwgPSAtMTsKKwl9CisKKwlyZXR1cm5fVkFMVUUodmFsKTsKK30KKworc3RhdGljIHZvaWQKK2FjcGlfaG90a2V5X25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwl1MzIgaW50ZXJuYWxfZXZlbnQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlciIpOworCisJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKSkKKwkJcmV0dXJuX1ZPSUQ7CisKKwlpbnRlcm5hbF9ldmVudCA9IGhvdGtleV9nZXRfaW50ZXJuYWxfZXZlbnQoZXZlbnQsICZnbG9iYWxfaG90a2V5X2xpc3QpOworCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOworCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qIE5lZWQgdG8gaW52ZW50IGF1dG9tYXRpY2FsbHkgaG90a2V5IGFkZCBtZXRob2QgKi8KK3N0YXRpYyBpbnQgYXV0b19ob3RrZXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCS8qIEltcGxlbWVudCBtZSAqLworCXJldHVybiAwOworfQorCisvKiBOZWVkIHRvIGludmVudCBhdXRvbWF0aWNhbGx5IGhvdGtleSByZW1vdmUgbWV0aG9kICovCitzdGF0aWMgaW50IGF1dG9faG90a2V5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCit7CisJLyogSW1wbGVtZW50IG1lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIHByb2MgZmlsZSBmb3IgZWFjaCBwb2xsaW5nIG1ldGhvZCAqLworc3RhdGljIGludCBjcmVhdGVfcG9sbGluZ19wcm9jKHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCW1vZGVfdCBtb2RlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiY3JlYXRlX3BvbGxpbmdfcHJvYyIpOworCW1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR087CisKKwlwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2aWNlLT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAorCQkJCSBtb2RlLCBob3RrZXlfcHJvY19kaXIpOworCisJaWYgKCFwcm9jKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgZGV2aWNlLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCkpOworCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CisJfSBlbHNlIHsKKwkJcHJvYy0+cHJvY19mb3BzID0gJmhvdGtleV9wb2xsaW5nX2ZvcHM7CisJCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCXByb2MtPmRhdGEgPSBkZXZpY2U7CisJCXByb2MtPnVpZCA9IDA7CisJCXByb2MtPmdpZCA9IDA7CisJCWRldmljZS0+cG9sbF9ob3RrZXkucHJvYyA9IHByb2M7CisJfQorCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIGludCBpc192YWxpZF9hY3BpX3BhdGgoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpc192YWxpZF9hY3BpX3BhdGgiKTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAoY2hhciAqKXBhdGhuYW1lLCAmaGFuZGxlKTsKKwlyZXR1cm5fVkFMVUUoIUFDUElfRkFJTFVSRShzdGF0dXMpKTsKK30KKworc3RhdGljIGludCBpc192YWxpZF9ob3RrZXkodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpc192YWxpZF9ob3RrZXkiKTsKKwkvKiBJbXBsZW1lbnQgdmFsaWQgY2hlY2sgKi8KKwlyZXR1cm5fVkFMVUUoMSk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2FkZCh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9hZGQiKTsKKworCWlmIChkZXZpY2UtPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfYnVzX2dldF9kZXZpY2UoZGV2aWNlLT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwgJmRldik7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKKworCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoZGV2LT5oYW5kbGUsCisJCQkJCQkgICAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJCSAgICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIsCisJCQkJCQkgICAgIGRldmljZSk7CisJfSBlbHNlCQkJLyogQWRkIHBvbGxpbmcgaG90a2V5ICovCisJCWNyZWF0ZV9wb2xsaW5nX3Byb2MoZGV2aWNlKTsKKworCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudCsrOworCisJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5saW5rLmVudHJpZXMsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKTsKKworCXJldHVybl9WQUxVRShzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGhvdGtleV9yZW1vdmUodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9yZW1vdmUiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PQorCQkgICAgZGV2aWNlLT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pIHsKKwkJCWxpc3RfZGVsKCZrZXktPmxpbmsuZW50cmllcyk7CisJCQlyZW1vdmVfcHJvY19lbnRyeShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsCisJCQkJCSAgaG90a2V5X3Byb2NfZGlyKTsKKwkJCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudC0tOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgdm9pZCBob3RrZXlfdXBkYXRlKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfdXBkYXRlIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0KKwkJICAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSB7CisJCQlrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlID0KKwkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlOworCQkJa2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9CisJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bTsKKwkJCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUgPQorCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGU7CisJCQlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kID0KKwkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm5fVk9JRDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CisJaW50IHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImZyZWVfaG90a2V5X2RldmljZSIpOworCisJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9idXNfZ2V0X2RldmljZShrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlLCAmZGV2KTsKKwkJaWYgKGRldi0+aGFuZGxlKQorCQkJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2LT5oYW5kbGUsCisJCQkJCQkgICBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJCQkgICBhY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcik7CisJfSBlbHNlCisJCXJlbW92ZV9wcm9jX2VudHJ5KGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgIGhvdGtleV9wcm9jX2Rpcik7CisJa2ZyZWUoa2V5KTsKKwlyZXR1cm5fVk9JRDsKK30KKworc3RhdGljIGludAoraW5pdF9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXksIGNoYXIgKmJ1c19zdHIsIGNoYXIgKmFjdGlvbl9zdHIsCisJCSAgIGNoYXIgKm1ldGhvZCwgaW50IHN0ZF9udW0sIGludCBleHRlcm5hbF9udW0pCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaW5pdF9ob3RrZXlfZGV2aWNlIik7CisKKwlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9FVkVOVDsKKwlrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9IHN0ZF9udW07CisJa2V5LT5ldmVudF9ob3RrZXkuZmxhZyA9IDA7CisJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChidXNfc3RyKSkKKwkJYWNwaV9nZXRfaGFuZGxlKChhY3BpX2hhbmRsZSkgMCwKKwkJCQlidXNfc3RyLCAmKGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUpKTsKKwllbHNlCisJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKKwlrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtID0gZXh0ZXJuYWxfbnVtOworCWlmIChpc192YWxpZF9hY3BpX3BhdGgoYWN0aW9uX3N0cikpCisJCWFjcGlfZ2V0X2hhbmRsZSgoYWNwaV9oYW5kbGUpIDAsCisJCQkJYWN0aW9uX3N0ciwgJihrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlKSk7CisJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IGttYWxsb2Moc2l6ZW9mKG1ldGhvZCksIEdGUF9LRVJORUwpOworCXN0cmNweShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kLCBtZXRob2QpOworCisJcmV0dXJuX1ZBTFVFKCFpc192YWxpZF9ob3RrZXkoa2V5KSk7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfcG9sbF9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXksCisJCQljaGFyICpwb2xsX3N0ciwKKwkJCWNoYXIgKnBvbGxfbWV0aG9kLAorCQkJY2hhciAqYWN0aW9uX3N0ciwgY2hhciAqYWN0aW9uX21ldGhvZCwgaW50IHN0ZF9udW0pCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaW5pdF9wb2xsX2hvdGtleV9kZXZpY2UiKTsKKworCWtleS0+bGluay5ob3RrZXlfdHlwZSA9IEFDUElfSE9US0VZX1BPTExJTkc7CisJa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPSBzdGRfbnVtOworCWtleS0+cG9sbF9ob3RrZXkuZmxhZyA9IDA7CisJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChwb2xsX3N0cikpCisJCWFjcGlfZ2V0X2hhbmRsZSgoYWNwaV9oYW5kbGUpIDAsCisJCQkJcG9sbF9zdHIsICYoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSkpOworCWVsc2UKKwkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOworCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPSBwb2xsX21ldGhvZDsKKwlpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKGFjdGlvbl9zdHIpKQorCQlhY3BpX2dldF9oYW5kbGUoKGFjcGlfaGFuZGxlKSAwLAorCQkJCWFjdGlvbl9zdHIsICYoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlKSk7CisJa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kID0KKwkgICAga21hbGxvYyhzaXplb2YoYWN0aW9uX21ldGhvZCksIEdGUF9LRVJORUwpOworCXN0cmNweShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsIGFjdGlvbl9tZXRob2QpOworCWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQgPQorCSAgICAodW5pb24gYWNwaV9vYmplY3QgKilrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOworCXJldHVybl9WQUxVRShpc192YWxpZF9ob3RrZXkoa2V5KSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaG90a2V5X3ZhbGlkKHVuaW9uIGFjcGlfaG90a2V5ICprZXksCisJCQkgICAgICBzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqbGlzdCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJjaGVja19ob3RrZXlfdmFsaWQiKTsKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9vcGVuX2NvbmZpZyIpOworCXJldHVybl9WQUxVRShzaW5nbGVfb3BlbgorCQkgICAgIChmaWxlLCBob3RrZXlfY29uZmlnX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKSk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2NvbmZpZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisJY2hhciBidXNfbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKKwljaGFyIGFjdGlvbl9uYW1lW0FDUElfUEFUSE5BTUVfTUFYXSA9IHsgMCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidXMgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBidXNfbmFtZSB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBhY3QgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBhY3Rpb25fbmFtZSB9OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgoImhvdGtleV9jb25maWdfc2VxX3Nob3ciKSk7CisKKwlpZiAoIWhvdGtleV9saXN0KQorCQlnb3RvIGVuZDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBob3RrZXlfbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKKwkJCWFjcGlfZ2V0X25hbWUoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZidXMpOworCQkJYWNwaV9nZXRfbmFtZShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAorCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmFjdCk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzOiVzOiVzOiVkOiVkIiwgYnVzX25hbWUsCisJCQkJICAgYWN0aW9uX25hbWUsCisJCQkJICAga2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSwKKwkJCQkgICBrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtKTsKKwkJfSAvKiBBQ1BJX0hPVEtFWV9QT0xMSU5HICovCisJCWVsc2UgeworCQkJYWNwaV9nZXRfbmFtZShrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlLAorCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmJ1cyk7CisJCQlhY3BpX2dldF9uYW1lKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZhY3QpOworCQkJc2VxX3ByaW50ZihzZXEsICIlczolczolczolczolZCIsIGJ1c19uYW1lLAorCQkJCSAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QsCisJCQkJICAgYWN0aW9uX25hbWUsCisJCQkJICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAorCQkJCSAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKKwkJfQorCX0KKwlzZXFfcHV0cyhzZXEsICJcbiIpOworICAgICAgZW5kOgorCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIGludAorZ2V0X3Bhcm1zKGNoYXIgKmNvbmZpZ19yZWNvcmQsCisJICBpbnQgKmNtZCwKKwkgIGNoYXIgKmJ1c19oYW5kbGUsCisJICBjaGFyICpidXNfbWV0aG9kLAorCSAgY2hhciAqYWN0aW9uX2hhbmRsZSwKKwkgIGNoYXIgKm1ldGhvZCwgaW50ICppbnRlcm5hbF9ldmVudF9udW0sIGludCAqZXh0ZXJuYWxfZXZlbnRfbnVtKQoreworCWNoYXIgKnRtcCwgKnRtcDE7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgoImdldF9wYXJtcyIpKTsKKworCXNzY2FuZihjb25maWdfcmVjb3JkLCAiJWQiLCBjbWQpOworCisJdG1wID0gc3RyY2hyKGNvbmZpZ19yZWNvcmQsICc6Jyk7CisJdG1wKys7CisJdG1wMSA9IHN0cmNocih0bXAsICc6Jyk7CisJc3RybmNweShidXNfaGFuZGxlLCB0bXAsIHRtcDEgLSB0bXApOworCWJ1c19oYW5kbGVbdG1wMSAtIHRtcF0gPSAwOworCisJdG1wID0gdG1wMTsKKwl0bXArKzsKKwl0bXAxID0gc3RyY2hyKHRtcCwgJzonKTsKKwlzdHJuY3B5KGJ1c19tZXRob2QsIHRtcCwgdG1wMSAtIHRtcCk7CisJYnVzX21ldGhvZFt0bXAxIC0gdG1wXSA9IDA7CisKKwl0bXAgPSB0bXAxOworCXRtcCsrOworCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOworCXN0cm5jcHkoYWN0aW9uX2hhbmRsZSwgdG1wLCB0bXAxIC0gdG1wKTsKKwlhY3Rpb25faGFuZGxlW3RtcDEgLSB0bXBdID0gMDsKKworCXRtcCA9IHRtcDE7CisJdG1wKys7CisJdG1wMSA9IHN0cmNocih0bXAsICc6Jyk7CisJc3RybmNweShtZXRob2QsIHRtcCwgdG1wMSAtIHRtcCk7CisJbWV0aG9kW3RtcDEgLSB0bXBdID0gMDsKKworCXNzY2FuZih0bXAxICsgMSwgIiVkOiVkIiwgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pOworCXJldHVybl9WQUxVRSg2KTsKK30KKworLyogIGNvdW50IGlzIGxlbmd0aCBmb3Igb25lIGlucHV0IHJlY29yZCAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCit7CisJc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmhvdGtleV9saXN0ID0gJmdsb2JhbF9ob3RrZXlfbGlzdDsKKwljaGFyIGNvbmZpZ19yZWNvcmRbTUFYX0NPTkZJR19SRUNPUkRfTEVOXTsKKwljaGFyIGJ1c19oYW5kbGVbTUFYX05BTUVfUEFUSF9MRU5dOworCWNoYXIgYnVzX21ldGhvZFtNQVhfTkFNRV9QQVRIX0xFTl07CisJY2hhciBhY3Rpb25faGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIG1ldGhvZFsyMF07CisJaW50IGNtZCwgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW07CisJaW50IHJldCA9IDA7CisJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCgiaG90a2V5X3dyaXRlX2NvbmZpZyIpKTsKKworCWlmICghaG90a2V5X2xpc3QgfHwgY291bnQgPiBNQVhfQ09ORklHX1JFQ09SRF9MRU4pIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYXJndW1lbnRzXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY29uZmlnX3JlY29yZCwgYnVmZmVyLCBjb3VudCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgZGF0YSBcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKwljb25maWdfcmVjb3JkW2NvdW50XSA9ICdcMCc7CisKKwlyZXQgPSBnZXRfcGFybXMoY29uZmlnX3JlY29yZCwKKwkJCSZjbWQsCisJCQlidXNfaGFuZGxlLAorCQkJYnVzX21ldGhvZCwKKwkJCWFjdGlvbl9oYW5kbGUsCisJCQltZXRob2QsICZpbnRlcm5hbF9ldmVudF9udW0sICZleHRlcm5hbF9ldmVudF9udW0pOworCWlmIChyZXQgIT0gNikgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkludmFsaWQgZGF0YSBmb3JtYXQgcmV0PSVkXG4iLCByZXQpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWtleSA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfaG90a2V5KSwgR0ZQX0tFUk5FTCk7CisJcmV0ID0gaW5pdF9ob3RrZXlfZGV2aWNlKGtleSwgYnVzX2hhbmRsZSwgYWN0aW9uX2hhbmRsZSwgbWV0aG9kLAorCQkJCSBpbnRlcm5hbF9ldmVudF9udW0sIGV4dGVybmFsX2V2ZW50X251bSk7CisKKwlpZiAocmV0IHx8IGNoZWNrX2hvdGtleV92YWxpZChrZXksIGhvdGtleV9saXN0KSkgeworCQlrZnJlZShrZXkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBob3RrZXkgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIDA6CisJCWhvdGtleV9hZGQoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlob3RrZXlfcmVtb3ZlKGtleSk7CisJCWZyZWVfaG90a2V5X2RldmljZShrZXkpOworCQlicmVhazsKKwljYXNlIDI6CisJCWhvdGtleV91cGRhdGUoa2V5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybl9WQUxVRShjb3VudCk7Cit9CisKKy8qICBjb3VudCBpcyBsZW5ndGggZm9yIG9uZSBpbnB1dCByZWNvcmQgKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9wb2xsX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9CisJICAgIChzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqKW0tPnByaXZhdGU7CisKKwljaGFyIGNvbmZpZ19yZWNvcmRbTUFYX0NPTkZJR19SRUNPUkRfTEVOXTsKKwljaGFyIHBvbGxpbmdfaGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIGFjdGlvbl9oYW5kbGVbTUFYX05BTUVfUEFUSF9MRU5dOworCWNoYXIgcG9sbF9tZXRob2RbMjBdLCBhY3Rpb25fbWV0aG9kWzIwXTsKKwlpbnQgcmV0LCBpbnRlcm5hbF9ldmVudF9udW0sIGNtZCwgZXh0ZXJuYWxfZXZlbnRfbnVtOworCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X3dyaXRlX3BvbGxfY29uZmlnIik7CisKKwlpZiAoIWhvdGtleV9saXN0IHx8IGNvdW50ID4gTUFYX0NPTkZJR19SRUNPUkRfTEVOKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50c1xuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGNvbmZpZ19yZWNvcmQsIGJ1ZmZlciwgY291bnQpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJY29uZmlnX3JlY29yZFtjb3VudF0gPSAnXDAnOworCisJcmV0ID0gZ2V0X3Bhcm1zKGNvbmZpZ19yZWNvcmQsCisJCQkmY21kLAorCQkJcG9sbGluZ19oYW5kbGUsCisJCQlwb2xsX21ldGhvZCwKKwkJCWFjdGlvbl9oYW5kbGUsCisJCQlhY3Rpb25fbWV0aG9kLAorCQkJJmludGVybmFsX2V2ZW50X251bSwgJmV4dGVybmFsX2V2ZW50X251bSk7CisKKwlpZiAocmV0ICE9IDYpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgZGF0YSBmb3JtYXRcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWtleSA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfaG90a2V5KSwgR0ZQX0tFUk5FTCk7CisJcmV0ID0gaW5pdF9wb2xsX2hvdGtleV9kZXZpY2Uoa2V5LCBwb2xsaW5nX2hhbmRsZSwgcG9sbF9tZXRob2QsCisJCQkJICAgICAgYWN0aW9uX2hhbmRsZSwgYWN0aW9uX21ldGhvZCwKKwkJCQkgICAgICBpbnRlcm5hbF9ldmVudF9udW0pOworCWlmIChyZXQgfHwgY2hlY2tfaG90a2V5X3ZhbGlkKGtleSwgaG90a2V5X2xpc3QpKSB7CisJCWtmcmVlKGtleSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGhvdGtleSBcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgMDoKKwkJaG90a2V5X2FkZChrZXkpOworCQlicmVhazsKKwljYXNlIDE6CisJCWhvdGtleV9yZW1vdmUoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlob3RrZXlfdXBkYXRlKGtleSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm5fVkFMVUUoY291bnQpOworfQorCisvKiAgCisgKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyBhbiBBQ1BJIG1ldGhvZCwgZ2l2ZW4gYW4gaW50IGFzIHBhcmFtZXRlciwgdGhlCisgKiBtZXRob2QgaXMgc2VhcmNoZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgaGFuZGxlLCBjYW4gYmUgTlVMTC4gVGhlIG91dHB1dAorICogb2YgdGhlIG1ldGhvZCBpcyB3cml0dGVuIGlzIG91dHB1dCwgd2hpY2ggY2FuIGFsc28gYmUgTlVMTAorICoKKyAqIHJldHVybnMgMSBpZiB3cml0ZSBpcyBzdWNjZXNzZnVsLCAwIGVsc2UuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfYWNwaV9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjb25zdCBjaGFyICptZXRob2QsIGludCB2YWwsCisJCQkgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0KQoreworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IHBhcmFtczsJLyogbGlzdCBvZiBpbnB1dCBwYXJhbWV0ZXJzIChhbiBpbnQgaGVyZSkgKi8KKwl1bmlvbiBhY3BpX29iamVjdCBpbl9vYmo7CS8qIHRoZSBvbmx5IHBhcmFtIHdlIHVzZSAqLworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoIndyaXRlX2FjcGlfaW50Iik7CisJcGFyYW1zLmNvdW50ID0gMTsKKwlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmo7CisJaW5fb2JqLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlpbl9vYmouaW50ZWdlci52YWx1ZSA9IHZhbDsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsICZwYXJhbXMsIG91dHB1dCk7CisKKwlyZXR1cm5fVkFMVUUoc3RhdHVzID09IEFFX09LKTsKK30KKworc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OworCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicmVhZF9hY3BpX2ludCIpOworCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CisJb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIE5VTEwsICZvdXRwdXQpOworCSp2YWwgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7CisJcmV0dXJuX1ZBTFVFKChzdGF0dXMgPT0gQUVfT0spCisJCSAgICAgJiYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikpOworfQorCitzdGF0aWMgYWNwaV9oYW5kbGUKK2dldF9oYW5kbGVfZnJvbV9ob3RrZXlsaXN0KHN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCwgaW50IGV2ZW50X251bSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBob3RrZXlfbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQKKwkJICAgICYmIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50X251bSkgeworCQkJcmV0dXJuIChrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlKTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMKK2NoYXIgKmdldF9tZXRob2RfZnJvbV9ob3RrZXlsaXN0KHN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCwKKwkJCQkgaW50IGV2ZW50X251bSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBob3RrZXlfbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisKKwkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCAmJgorCQkgICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0gZXZlbnRfbnVtKQorCQkJcmV0dXJuIChrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICpnZXRfaG90a2V5X2J5X2V2ZW50KHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfaG90a2V5X2xpc3QKKwkJCQkJCSAgICAgICAqaG90a2V5X2xpc3QsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBob3RrZXlfbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfUE9MTElORworCQkgICAgJiYga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0gZXZlbnQpIHsKKwkJCXJldHVybiAoJmtleS0+cG9sbF9ob3RrZXkpOworCQl9CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKKy8qICAKKyAqIHVzZXIgY2FsbCBBTUwgbWV0aG9kIGludGVyZmFjZToKKyAqIENhbGwgY29udmVudGlvbjoKKyAqIGVjaG8gImV2ZW50X251bTogYXJnIHR5cGUgOiB2YWx1ZSIKKyAqIGV4YW1wbGU6IGVjaG8gIjE6MTozMCIgPiAvcHJvYy9hY3BpL2FjdGlvbgorICogSnVzdCBzdXBwb3J0IDEgaW50ZWdlciBhcmcgcGFzc2luZyB0byBBTUwgbWV0aG9kCisgKi8KKworc3RhdGljIHNzaXplX3QgaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQoreworCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJY2hhciBhcmdbTUFYX0NBTExfUEFSTV07CisJaW50IGV2ZW50LCB0eXBlLCB2YWx1ZTsKKworCWNoYXIgKm1ldGhvZDsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfZXhlY3RlX2FtbF9tZXRob2QiKTsKKworCWlmICghaG90a2V5X2xpc3QgfHwgY291bnQgPiBNQVhfQ0FMTF9QQVJNKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50IDEiKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXJnLCBidWZmZXIsIGNvdW50KSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudCAyIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJYXJnW2NvdW50XSA9ICdcMCc7CisKKwlpZiAoc3NjYW5mKGFyZywgIiVkOiVkOiVkIiwgJmV2ZW50LCAmdHlwZSwgJnZhbHVlKSAhPSAzKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50IDMiKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlpZiAodHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQloYW5kbGUgPSBnZXRfaGFuZGxlX2Zyb21faG90a2V5bGlzdChob3RrZXlfbGlzdCwgZXZlbnQpOworCQltZXRob2QgPSAoY2hhciAqKWdldF9tZXRob2RfZnJvbV9ob3RrZXlsaXN0KGhvdGtleV9saXN0LCBldmVudCk7CisJCWlmIChJU19FVkVOVChldmVudCkpCisJCQl3cml0ZV9hY3BpX2ludChoYW5kbGUsIG1ldGhvZCwgdmFsdWUsIE5VTEwpOworCQllbHNlIGlmIChJU19QT0xMKGV2ZW50KSkgeworCQkJc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgKmtleTsKKwkJCWtleSA9IChzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSAqKQorCQkJICAgIGdldF9ob3RrZXlfYnlfZXZlbnQoaG90a2V5X2xpc3QsIGV2ZW50KTsKKwkJCXJlYWRfYWNwaV9pbnQoaGFuZGxlLCBtZXRob2QsIGtleS0+cG9sbF9yZXN1bHQpOworCQl9CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vdCBzdXBwb3J0ZWQiKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm5fVkFMVUUoY291bnQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBob3RrZXlfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR087CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfaW5pdCIpOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKKwkJcHJpbnRrKCJVc2luZyBzcGVjaWZpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaG90a2V5X3Byb2NfZGlyID0gcHJvY19ta2RpcihIT1RLRVlfUFJPQywgYWNwaV9yb290X2Rpcik7CisJaWYgKCFob3RrZXlfcHJvY19kaXIpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfUFJPQykpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKwlob3RrZXlfcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlob3RrZXlfY29uZmlnID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkoSE9US0VZX0VWX0NPTkZJRywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKwlpZiAoIWhvdGtleV9jb25maWcpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfRVZfQ09ORklHKSk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfSBlbHNlIHsKKwkJaG90a2V5X2NvbmZpZy0+cHJvY19mb3BzID0gJmhvdGtleV9jb25maWdfZm9wczsKKwkJaG90a2V5X2NvbmZpZy0+ZGF0YSA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJCWhvdGtleV9jb25maWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWhvdGtleV9jb25maWctPnVpZCA9IDA7CisJCWhvdGtleV9jb25maWctPmdpZCA9IDA7CisJfQorCisJaG90a2V5X3BvbGxfY29uZmlnID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKwlpZiAoIWhvdGtleV9wb2xsX2NvbmZpZykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkhvdGtleTogVW5hYmxlIHRvIGNyZWF0ZSAlcyBlbnRyeVxuIiwKKwkJCQkgIEhPVEtFWV9FVl9DT05GSUcpKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9IGVsc2UgeworCQlob3RrZXlfcG9sbF9jb25maWctPnByb2NfZm9wcyA9ICZob3RrZXlfcG9sbF9jb25maWdfZm9wczsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT5kYXRhID0gJmdsb2JhbF9ob3RrZXlfbGlzdDsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlob3RrZXlfcG9sbF9jb25maWctPnVpZCA9IDA7CisJCWhvdGtleV9wb2xsX2NvbmZpZy0+Z2lkID0gMDsKKwl9CisKKwlob3RrZXlfYWN0aW9uID0gY3JlYXRlX3Byb2NfZW50cnkoSE9US0VZX0FDVElPTiwgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKwlpZiAoIWhvdGtleV9hY3Rpb24pIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfQUNUSU9OKSk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfSBlbHNlIHsKKwkJaG90a2V5X2FjdGlvbi0+cHJvY19mb3BzID0gJmhvdGtleV9hY3Rpb25fZm9wczsKKwkJaG90a2V5X2FjdGlvbi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJaG90a2V5X2FjdGlvbi0+dWlkID0gMDsKKwkJaG90a2V5X2FjdGlvbi0+Z2lkID0gMDsKKwl9CisKKwlob3RrZXlfaW5mbyA9IGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBtb2RlLCBob3RrZXlfcHJvY19kaXIpOworCWlmICghaG90a2V5X2luZm8pIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfSU5GTykpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCWhvdGtleV9pbmZvLT5wcm9jX2ZvcHMgPSAmaG90a2V5X2luZm9fZm9wczsKKwkJaG90a2V5X2luZm8tPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWhvdGtleV9pbmZvLT51aWQgPSAwOworCQlob3RrZXlfaW5mby0+Z2lkID0gMDsKKwl9CisKKwlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmhvdGtleV9kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJZ2xvYmFsX2hvdGtleV9saXN0LmNvdW50ID0gMDsKKwlnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcyA9ICZob3RrZXlfZW50cmllczsKKworCUlOSVRfTElTVF9IRUFEKCZob3RrZXlfZW50cmllcyk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaG90a2V5X2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9yZW1vdmUiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyaWVzLCBuZXh0LCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisKKwkJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKKwkJbGlzdF9kZWwoJmtleS0+bGluay5lbnRyaWVzKTsKKwkJZ2xvYmFsX2hvdGtleV9saXN0LmNvdW50LS07CisJCWZyZWVfaG90a2V5X2RldmljZShrZXkpOworCX0KKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmaG90a2V5X2RyaXZlcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0VWX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfUExfQ09ORklHLCBob3RrZXlfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIGhvdGtleV9wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0lORk8sIGhvdGtleV9wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BST0MsIGFjcGlfcm9vdF9kaXIpOworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoaG90a2V5X2luaXQpOworbW9kdWxlX2V4aXQoaG90a2V5X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwppbmRleCAwZmI3MzFhLi5hZDg1ZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBpYm1hY3BpX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogCW1lbXNldChpYm0tPmRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2RyaXZlcikpOwogCXNwcmludGYoaWJtLT5kcml2ZXItPm5hbWUsICIlcy8lcyIsIElCTV9OQU1FLCBpYm0tPm5hbWUpOwogCWlibS0+ZHJpdmVyLT5pZHMgPSBpYm0tPmhpZDsKLQlpYm0tPmRyaXZlci0+b3BzLmFkZCA9ICZkZXZpY2VfYWRkOworCWlibS0+ZHJpdmVyLT5vcHMuYWRkID0gJmlibWFjcGlfZGV2aWNlX2FkZDsKIAogCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihpYm0tPmRyaXZlcik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTExODUsNiArMTE4NSwxMCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCl7CisJCXByaW50ayhJQk1fRVJSICJVc2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsJCisJfQogCS8qIHRoZXNlIGhhbmRsZXMgYXJlIHJlcXVpcmVkICovCiAJaWYgKElCTV9IQU5ETEVfSU5JVChlYywJICAxKSA8IDAgfHwKIAkgICAgSUJNX0hBTkRMRV9JTklUKGhrZXksIDEpIDwgMCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCmluZGV4IDFjMGMxMjMuLmVjZTdhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKQEAgLTY3LDcgKzY3LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSAodm9pZCkKK2FjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIAljb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICppbml0X3ZhbCA9IE5VTEw7CkBAIC0yNjUsNyArMjY2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb29rdXAKICAqCi0gKiBQQVJBTUVURVJTOiAgcHJlZml4X25vZGUgICAgIC0gU2VhcmNoIHNjb3BlIGlmIG5hbWUgaXMgbm90IGZ1bGx5IHF1YWxpZmllZAorICogUEFSQU1FVEVSUzogIHNjb3BlX2luZm8gICAgICAtIEN1cnJlbnQgc2NvcGUgaW5mbyBibG9jawogICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIFNlYXJjaCBwYXRobmFtZSwgaW4gaW50ZXJuYWwgZm9ybWF0CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzIHJlcHJlc2VudGVkIGluIHRoZSBBTUwgc3RyZWFtKQogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFR5cGUgYXNzb2NpYXRlZCB3aXRoIG5hbWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKaW5kZXggYmZkOTIyYy4uNTY1M2ExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKQEAgLTQ5LDE0ICs0OSwyMCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2FsbG9jIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NyZWF0ZV9ub2RlCiAgKgotICogUEFSQU1FVEVSUzogIGFjcGlfbmFtZSAgICAgICAtIE5hbWUgb2YgdGhlIG5ldyBub2RlCisgKiBQQVJBTUVURVJTOiAgTmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgbmV3IG5vZGUgKDQgY2hhciBBQ1BJIG5hbWUpCiAgKgotICogUkVUVVJOOiAgICAgIE5vbmUKKyAqIFJFVFVSTjogICAgICBOZXcgbmFtZXNwYWNlIG5vZGUgKE51bGwgb24gZmFpbHVyZSkKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmFtZXNwYWNlIG5vZGUKICAqCkBAIC0xNDUsNyArMTUxLDYgQEAKIAkJfQogCX0KIAotCiAJQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0udG90YWxfZnJlZWQrKyk7CiAKIAkvKgpAQCAtMTU3LDU3ICsxNjIsNiBAQAogfQogCiAKLSNpZmRlZiBBQ1BJX0FMUEhBQkVUSUNfTkFNRVNQQUNFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NvbXBhcmVfbmFtZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTmFtZTEgICAgICAgICAgIC0gRmlyc3QgbmFtZSB0byBjb21wYXJlCi0gKiAgICAgICAgICAgICAgTmFtZTIgICAgICAgICAgIC0gU2Vjb25kIG5hbWUgdG8gY29tcGFyZQotICoKLSAqIFJFVFVSTjogICAgICB2YWx1ZSBmcm9tIHN0cm5jbXAKLSAqCi0gKiBERVNDUklQVElPTjogQ29tcGFyZSB0d28gQUNQSSBuYW1lcy4gIE5hbWVzIHRoYXQgYXJlIHByZWZpeGVkIHdpdGggYW4KLSAqICAgICAgICAgICAgICB1bmRlcnNjb3JlIGFyZSBmb3JjZWQgdG8gYmUgYWxwaGFiZXRpY2FsbHkgZmlyc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1hY3BpX25zX2NvbXBhcmVfbmFtZXMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUxLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUyKQotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWRfbmFtZTFbQUNQSV9OQU1FX1NJWkVdOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWRfbmFtZTJbQUNQSV9OQU1FX1NJWkVdOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGo7Ci0KLQotCS8qCi0JICogUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mICJ1bmRlcnNjb3JlIiB3aXRoIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIHNvCi0JICogdGhhdCBhbGwgbmFtZXMgdGhhdCBhcmUgcHJlZml4ZWQgd2l0aCB1bmRlcnNjb3JlKHMpIGFyZSBhbHBoYWJldGljYWxseQotCSAqIGZpcnN0LgotCSAqCi0JICogUmV2ZXJzZSB0aGUgbmFtZSBieXRld2lzZSBzbyB3ZSBjYW4ganVzdCBkbyBhIDMyLWJpdCBjb21wYXJlIGluc3RlYWQKLQkgKiBvZiBhIHN0cm5jbXAuCi0JICovCi0JZm9yIChpID0gMCwgaj0gKEFDUElfTkFNRV9TSVpFIC0gMSk7IGkgPCBBQ1BJX05BTUVfU0laRTsgaSsrLCBqLS0pIHsKLQkJcmV2ZXJzZWRfbmFtZTFbal0gPSBuYW1lMVtpXTsKLQkJaWYgKG5hbWUxW2ldID09ICdfJykgewotCQkJcmV2ZXJzZWRfbmFtZTFbal0gPSAnKic7Ci0JCX0KLQotCQlyZXZlcnNlZF9uYW1lMltqXSA9IG5hbWUyW2ldOwotCQlpZiAobmFtZTJbaV0gPT0gJ18nKSB7Ci0JCQlyZXZlcnNlZF9uYW1lMltqXSA9ICcqJzsKLQkJfQotCX0KLQotCXJldHVybiAoKihpbnQgKikgcmV2ZXJzZWRfbmFtZTEgLSAqKGludCAqKSByZXZlcnNlZF9uYW1lMik7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luc3RhbGxfbm9kZQpAQCAtMjcxLDcgKzIyNSw4IEBACiAJCSAqIGFscGhhYmV0aWMgcGxhY2VtZW50LgogCQkgKi8KIAkJcHJldmlvdXNfY2hpbGRfbm9kZSA9IE5VTEw7Ci0JCXdoaWxlIChhY3BpX25zX2NvbXBhcmVfbmFtZXMgKGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoY2hpbGRfbm9kZSksIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSkpIDwgMCkgeworCQl3aGlsZSAoYWNwaV9uc19jb21wYXJlX25hbWVzIChhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpLAorCQkJCSBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKSA8IDApIHsKIAkJCWlmIChjaGlsZF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKIAkJCQkvKiBMYXN0IHBlZXI7ICBDbGVhciBlbmQtb2YtbGlzdCBmbGFnICovCiAKQEAgLTQyOSw3ICszODQsOCBAQAogCQkvKiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgcmVmZXJlbmNlIHJlbWFpbmluZyBvbiB0aGlzIG5vZGUgKi8KIAogCQlpZiAoY2hpbGRfbm9kZS0+cmVmZXJlbmNlX2NvdW50ICE9IDEpIHsKLQkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiRXhpc3RpbmcgcmVmZXJlbmNlcyAoJWQpIG9uIG5vZGUgYmVpbmcgZGVsZXRlZCAoJXApXG4iLAorCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJCSJFeGlzdGluZyByZWZlcmVuY2VzICglZCkgb24gbm9kZSBiZWluZyBkZWxldGVkICglcClcbiIsCiAJCQkJY2hpbGRfbm9kZS0+cmVmZXJlbmNlX2NvdW50LCBjaGlsZF9ub2RlKSk7CiAJCX0KIApAQCAtNTQ4LDcgKzUwNCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKIHsKQEAgLTY4MywzICs2MzksNTQgQEAKIH0KIAogCisjaWZkZWYgQUNQSV9BTFBIQUJFVElDX05BTUVTUEFDRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19jb21wYXJlX25hbWVzCisgKgorICogUEFSQU1FVEVSUzogIE5hbWUxICAgICAgICAgICAtIEZpcnN0IG5hbWUgdG8gY29tcGFyZQorICogICAgICAgICAgICAgIE5hbWUyICAgICAgICAgICAtIFNlY29uZCBuYW1lIHRvIGNvbXBhcmUKKyAqCisgKiBSRVRVUk46ICAgICAgdmFsdWUgZnJvbSBzdHJuY21wCisgKgorICogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIEFDUEkgbmFtZXMuICBOYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIGFuCisgKiAgICAgICAgICAgICAgdW5kZXJzY29yZSBhcmUgZm9yY2VkIHRvIGJlIGFscGhhYmV0aWNhbGx5IGZpcnN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorYWNwaV9uc19jb21wYXJlX25hbWVzICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMikKK3sKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUxW0FDUElfTkFNRV9TSVpFXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUyW0FDUElfTkFNRV9TSVpFXTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOworCisKKwkvKgorCSAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAidW5kZXJzY29yZSIgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciBzbworCSAqIHRoYXQgYWxsIG5hbWVzIHRoYXQgYXJlIHByZWZpeGVkIHdpdGggdW5kZXJzY29yZShzKSBhcmUgYWxwaGFiZXRpY2FsbHkKKwkgKiBmaXJzdC4KKwkgKgorCSAqIFJldmVyc2UgdGhlIG5hbWUgYnl0ZXdpc2Ugc28gd2UgY2FuIGp1c3QgZG8gYSAzMi1iaXQgY29tcGFyZSBpbnN0ZWFkCisJICogb2YgYSBzdHJuY21wLgorCSAqLworCWZvciAoaSA9IDAsIGo9IChBQ1BJX05BTUVfU0laRSAtIDEpOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKywgai0tKSB7CisJCXJldmVyc2VkX25hbWUxW2pdID0gbmFtZTFbaV07CisJCWlmIChuYW1lMVtpXSA9PSAnXycpIHsKKwkJCXJldmVyc2VkX25hbWUxW2pdID0gJyonOworCQl9CisKKwkJcmV2ZXJzZWRfbmFtZTJbal0gPSBuYW1lMltpXTsKKwkJaWYgKG5hbWUyW2ldID09ICdfJykgeworCQkJcmV2ZXJzZWRfbmFtZTJbal0gPSAnKic7CisJCX0KKwl9CisKKwlyZXR1cm4gKCooaW50ICopIHJldmVyc2VkX25hbWUxIC0gKihpbnQgKikgcmV2ZXJzZWRfbmFtZTIpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKaW5kZXggMWY2YWYzZS4uNmMyYWVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCkBAIC01MCwxNiArNTAsMzIgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNkdW1wIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKK3ZvaWQKK2FjcGlfbnNfZHVtcF9yb290X2RldmljZXMgKAorCXZvaWQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZHVtcF9vbmVfZGV2aWNlICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworI2VuZGlmCisKIAogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19wcmludF9wYXRobmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBudW1fc2VnbWVudCAgICAgICAgIC0gTnVtYmVyIG9mIEFDUEkgbmFtZSBzZWdtZW50cworICogUEFSQU1FVEVSUzogIG51bV9zZWdtZW50cyAgICAgICAgLSBOdW1iZXIgb2YgQUNQSSBuYW1lIHNlZ21lbnRzCiAgKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIFRoZSBjb21wcmVzc2VkIChpbnRlcm5hbCkgcGF0aAogICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgogICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMyw2ICsxMTksOCBAQAogICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBEZXNpcmVkIGRlYnVnIGxldmVsCiAgKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgogICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCiAgKiAgICAgICAgICAgICAgTWFuYWdlcyBhbGxvY2F0aW9uL2ZyZWVpbmcgb2YgYSBwYXRobmFtZSBidWZmZXIKICAqCkBAIC0xMzcsOSArMTU1LDEyIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAorICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAogICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBOZXN0aW5nIGxldmVsIG9mIHRoZSBoYW5kbGUKICAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIGludG8gd2Fsa19uYW1lc3BhY2UKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gTm90IHVzZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IER1bXAgYSBzaW5nbGUgTm9kZQogICogICAgICAgICAgICAgIFRoaXMgcHJvY2VkdXJlIGlzIGEgdXNlcl9mdW5jdGlvbiBjYWxsZWQgYnkgYWNwaV9uc193YWxrX25hbWVzcGFjZS4KQEAgLTM5NCw4ICs0MTUsNyBAQAogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAotCQlhY3BpX29zX3ByaW50ZiAoIihSJWQpIiwKLQkJCQlvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisJCWFjcGlfb3NfcHJpbnRmICgiKFIlZCkiLCBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CiAKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKQEAgLTU1MSwxOCArNTcxLDIwIEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vYmplY3RzCiAgKgogICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBiZSBkdW1wZWQKKyAqICAgICAgICAgICAgICBkaXNwbGF5X3R5cGUgICAgICAgIC0gMCBvciBBQ1BJX0RJU1BMQVlfU1VNTUFSWQogICogICAgICAgICAgICAgIG1heF9kZXB0aCAgICAgICAgICAgLSBNYXhpbXVtIGRlcHRoIG9mIGR1bXAuIFVzZSBBQ1BJX1VJTlQzMl9NQVgKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFuIGVmZmVjdGl2ZWx5IHVubGltaXRlZCBkZXB0aC4KICAqICAgICAgICAgICAgICBvd25lcl9pZCAgICAgICAgICAgIC0gRHVtcCBvbmx5IG9iamVjdHMgb3duZWQgYnkgdGhpcyBJRC4gIFVzZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQzMl9NQVggdG8gbWF0Y2ggYWxsIG93bmVycy4KICAqICAgICAgICAgICAgICBzdGFydF9oYW5kbGUgICAgICAgIC0gV2hlcmUgaW4gbmFtZXNwYWNlIHRvIHN0YXJ0L2VuZCBzZWFyY2gKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIHR5cGVkIG9iamVjdHMgd2l0aGluIHRoZSBsb2FkZWQgbmFtZXNwYWNlLgogICogICAgICAgICAgICAgIFVzZXMgYWNwaV9uc193YWxrX25hbWVzcGFjZSBpbiBjb25qdW5jdGlvbiB3aXRoIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LgogICoKQEAgLTU5MCwxMCArNjEyLDQ0IEBACiAJCQkgQUNQSV9OU19XQUxLX05PX1VOTE9DSywgYWNwaV9uc19kdW1wX29uZV9vYmplY3QsCiAJCQkgKHZvaWQgKikgJmluZm8sIE5VTEwpOwogfQorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX2VudHJ5CisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAorICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAgICAgLSBPdXRwdXQgbGV2ZWwKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX25zX2R1bXBfZW50cnkgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGV2ZWwpCit7CisJc3RydWN0IGFjcGlfd2Fsa19pbmZvICAgICAgICAgICBpbmZvOworCisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCisKKwlpbmZvLmRlYnVnX2xldmVsID0gZGVidWdfbGV2ZWw7CisJaW5mby5vd25lcl9pZCA9IEFDUElfVUlOVDMyX01BWDsKKwlpbmZvLmRpc3BsYXlfdHlwZSA9IEFDUElfRElTUExBWV9TVU1NQVJZOworCisJKHZvaWQpIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0IChoYW5kbGUsIDEsICZpbmZvLCBOVUxMKTsKK30KKworCisjaWZkZWYgX0FDUElfQVNMX0NPTVBJTEVSCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfdGFibGVzCiAgKgogICogUEFSQU1FVEVSUzogIHNlYXJjaF9iYXNlICAgICAgICAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgZHVtcGVkLCBvcgpAQCAtNjAxLDYgKzY1Nyw4IEBACiAgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgZHVtcC4gIFVzZSBJTlRfTUFYCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBlZmZlY3RpdmVseSB1bmxpbWl0ZWQgZGVwdGguCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogRHVtcCB0aGUgbmFtZSBzcGFjZSwgb3IgYSBwb3J0aW9uIG9mIGl0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MjYsNyArNjg0LDcgQEAKIAl9CiAKIAlpZiAoQUNQSV9OU19BTEwgPT0gc2VhcmNoX2Jhc2UpIHsKLQkJLyogIGVudGlyZSBuYW1lc3BhY2UgICAgKi8KKwkJLyogRW50aXJlIG5hbWVzcGFjZSAqLwogCiAJCXNlYXJjaF9oYW5kbGUgPSBhY3BpX2dibF9yb290X25vZGU7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywgIlxcXG4iKSk7CkBAIC02MzYsMzggKzY5NCw1IEBACiAJCQlBQ1BJX1VJTlQzMl9NQVgsIHNlYXJjaF9oYW5kbGUpOwogCXJldHVybl9WT0lEOwogfQotCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfZW50cnkKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCi0gKiAgICAgICAgICAgICAgZGVidWdfbGV2ZWwgICAgICAgICAtIE91dHB1dCBsZXZlbAotICoKLSAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX25zX2R1bXBfZW50cnkgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGV2ZWwpCi17Ci0Jc3RydWN0IGFjcGlfd2Fsa19pbmZvICAgICAgICAgICBpbmZvOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlpbmZvLmRlYnVnX2xldmVsID0gZGVidWdfbGV2ZWw7Ci0JaW5mby5vd25lcl9pZCA9IEFDUElfVUlOVDMyX01BWDsKLQlpbmZvLmRpc3BsYXlfdHlwZSA9IEFDUElfRElTUExBWV9TVU1NQVJZOwotCi0JKHZvaWQpIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0IChoYW5kbGUsIDEsICZpbmZvLCBOVUxMKTsKLX0KLQotI2VuZGlmCi0KKyNlbmRpZgkvKiBfQUNQSV9BU0xfQ09NUElMRVIgKi8KKyNlbmRpZgkvKiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKaW5kZXggZDMwYTU5ZS4uMjdjNGY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYwpAQCAtNDMsMTUgKzQzLDE4IEBACiAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogCisvKiBUQkQ6IFRoaXMgZW50aXJlIG1vZHVsZSBpcyBhcHBhcmVudGx5IG9ic29sZXRlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCAqLworCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZHVtcGR2IikKIAotCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAKKyNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlCkBAIC01OSwxMyArNjIsMTYgQEAKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gTmVzdGluZyBsZXZlbCBvZiB0aGUgaGFuZGxlCiAgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCBpbnRvIHdhbGtfbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIE5vdCB1c2VkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgZGV2aWNlCiAgKiAgICAgICAgICAgICAgVGhpcyBwcm9jZWR1cmUgaXMgYSB1c2VyX2Z1bmN0aW9uIGNhbGxlZCBieSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKQEAgLTEwOCwxMiArMTE0LDE1IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIGFsbCBvYmplY3RzIG9mIHR5cGUgImRldmljZSIKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICh2b2lkKQorYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyAoCisJdm9pZCkKIHsKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN5c19idXNfaGFuZGxlOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwpAQCAtMTQyLDUgKzE1MSw2IEBACiB9CiAKICNlbmRpZgorI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKaW5kZXggMGQwMDhkNS4uMWFlODlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCkBAIC01MiwxOSArNTIsMzMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNldmFsIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZCAoCisJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlCiAgKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAgICAgLSBOYW1lIG9mIG1ldGhvZCB0byBleGVjdXRlLCBJZiBOVUxMLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGlzIHRoZSBvYmplY3QgdG8gZXhlY3V0ZQotICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaworICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIE5hbWUgb2YgbWV0aG9kIHRvIGV4ZWN1dGUsIElmIE5VTEwsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBpcyB0aGUgb2JqZWN0IHRvIGV4ZWN1dGUKKyAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiAgUGFyYW1zIGl0c2VsZiBtYXkgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kIGFuZCBleGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHVzaW5nIHRoZSBoYW5kbGUgYXMgYQotICogICAgICAgICAgICAgIHNjb3BlCisgKiBERVNDUklQVElPTjogRXZhbHVhdGUgdGhlIG9iamVjdCBvciBmaW5kIGFuZCBleGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kCiAgKgogICogTVVURVg6ICAgICAgIExvY2tzIE5hbWVzcGFjZQogICoKQEAgLTE1Nyw4ICsxNzEsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgUGF0aG5hbWUgICAgICAgICAgICAtIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSB0byB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIENvbnRhaW5zOgorICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSB0byB0aGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKICAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgogICogICAgICAgICAgICAgICAgICBQYXJhbXMgICAgICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLApAQCAtMTY3LDggKzE4MSw4IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kIGFuZCBleGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHBhc3NpbmcgdGhlIGdpdmVuCi0gKiAgICAgICAgICAgICAgcGFyYW1ldGVycworICogREVTQ1JJUFRJT046IEV2YWx1YXRlIHRoZSBvYmplY3Qgb3IgcmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZAorICogICAgICAgICAgICAgIHBhc3NpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAqCiAgKiBNVVRFWDogICAgICAgTG9ja3MgTmFtZXNwYWNlCiAgKgpAQCAtMjQxLDE3ICsyNTUsMjEgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUKICAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE1ldGhvZCBOb2RlIHRvIGV4ZWN1dGUKLSAqICAgICAgICAgICAgICBQYXJhbXMgICAgICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiAgUGFyYW1zIGl0c2VsZiBtYXkgYmUKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CisgKiAgICAgICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIE1ldGhvZC9PYmplY3QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCi0gKiAgICAgICAgICAgICAgcGFyYW1fdHlwZSAgICAgICAgICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKLSAqICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgICAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBtZXRob2QgcGFzc2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycworICogREVTQ1JJUFRJT046IEV2YWx1YXRlIG9iamVjdCBvciBleGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHBhc3NpbmcgdGhlCisgKiAgICAgICAgICAgICAgZ2l2ZW4gcGFyYW1ldGVycwogICoKICAqIE1VVEVYOiAgICAgICBMb2NrcyBOYW1lc3BhY2UKICAqCkBAIC0zNDUsNyArMzYzLDE2IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZAogICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jayAody9wYXJhbXMpCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0CisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zNTUsNyArMzgyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCiB7CkBAIC00MTQsNyArNDQxLDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jayAody9wYXJhbXMpCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBPYmplY3QncyBOUyBub2RlCisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBvYmplY3QgdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MjQsNyArNDU0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUgKAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYwppbmRleCA0YTQ2YjM4Li4zNjI4MDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKQEAgLTUwLDYgKzUwLDIyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zaW5pdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2luaXRfb25lX29iamVjdCAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2luaXRfb25lX2RldmljZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTkxLDcgKzIwNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19pbml0X29uZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLApAQCAtMzMxLDcgKzM0Nyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19pbml0X29uZV9kZXZpY2UgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCkBAIC0zNzQsNyArMzkwLDggQEAKIAkvKgogCSAqIFJ1biBfU1RBIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gcnVuIF9JTkkgb24gdGhlIGRldmljZS4KIAkgKi8KLQlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELCBwaW5mby5ub2RlLCAiX1NUQSIpKTsKKwlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELAorCQkJICAgcGluZm8ubm9kZSwgTUVUSE9EX05BTUVfX1NUQSkpOwogCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEgKHBpbmZvLm5vZGUsICZmbGFncyk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0zOTksOCArNDE2LDkgQEAKIAkvKgogCSAqIFRoZSBkZXZpY2UgaXMgcHJlc2VudC4gUnVuIF9JTkkuCiAJICovCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwgcGluZm8ubm9kZSwgIl9JTkkiKSk7Ci0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoIl9JTkkiLCAmcGluZm8pOworCUFDUElfREVCVUdfRVhFQyAoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9NRVRIT0QsCisJCQkgICBwaW5mby5ub2RlLCBNRVRIT0RfTkFNRV9fSU5JKSk7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoTUVUSE9EX05BTUVfX0lOSSwgJnBpbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCS8qIE5vIF9JTkkgKEFFX05PVF9GT1VORCkgbWVhbnMgZGV2aWNlIHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCmluZGV4IDFkN2FlZGYuLjM0ZTQ5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwpAQCAtNTAsOSArNTAsMjQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNsb2FkIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlICgKKwlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUpOworCisjaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KK2FjcGlfc3RhdHVzCithY3BpX25zX3VubG9hZF9uYW1lc3BhY2UgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2RlbGV0ZV9zdWJ0cmVlICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSk7CisjZW5kaWYKKwogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvYWRfdGFibGUKQEAgLTE1OSw3ICsxNzQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlICgKIAlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUpCiB7CkBAIC0zMjEsOCArMzM2LDcgQEAKIH0KIAogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQorI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlCkBAIC0zMzksNyArMzUzLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSkKIHsKQEAgLTQ1Myw4ICs0NjcsNiBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQotCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYwppbmRleCBiNmY4ZjkxLi5kOGNlN2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYwpAQCAtNTAsNiArNTAsMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNuYW1lcyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9idWZmZXIpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjYsNyArNzQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLApAQCAtMTI2LDcgKzEzNCw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lCiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5TIG5vZGUgd2hvc2UgcGF0aG5hbWUgaXMgbmVlZGVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgd2hvc2UgcGF0aG5hbWUgaXMgbmVlZGVkCiAgKgogICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gc3RvcmFnZSBjb250YWluaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZgogICogICAgICAgICAgICAgIHRoZSBub2RlLCBJbiBleHRlcm5hbCBmb3JtYXQgKG5hbWUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHBhdGgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwppbmRleCA0ZTQxZTY2Li4yNzI1OGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCkBAIC02MCw2ICs2MCw4IEBACiAgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIFR5cGUgb2Ygb2JqZWN0LCBvciBBQ1BJX1RZUEVfQU5ZIGlmIG5vdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bgogICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCiAgKiBERVNDUklQVElPTjogUmVjb3JkIHRoZSBnaXZlbiBvYmplY3QgYXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAqICAgICAgICAgICAgICBuYW1lIHdob3NlIGFjcGlfaGFuZGxlIGlzIHBhc3NlZC4gIElmIE9iamVjdCBpcyBOVUxMCiAgKiAgICAgICAgICAgICAgYW5kIFR5cGUgaXMgQUNQSV9UWVBFX0FOWSwgc2V0IHRoZSBuYW1lIGFzIGhhdmluZyBubyB2YWx1ZS4KQEAgLTk3LDcgKzk5LDggQEAKIAlpZiAoIW9iamVjdCAmJiAoQUNQSV9UWVBFX0FOWSAhPSB0eXBlKSkgewogCQkvKiBOdWxsIG9iamVjdCAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIm5zX2F0dGFjaF9vYmplY3Q6IE51bGwgb2JqZWN0LCBidXQgdHlwZSBub3QgQUNQSV9UWVBFX0FOWVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIm5zX2F0dGFjaF9vYmplY3Q6IE51bGwgb2JqZWN0LCBidXQgdHlwZSBub3QgQUNQSV9UWVBFX0FOWVxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApAQCAtMTEyLDcgKzExNSw4IEBACiAJLyogQ2hlY2sgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCAqLwogCiAJaWYgKG5vZGUtPm9iamVjdCA9PSBvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9iaiAlcCBhbHJlYWR5IGluc3RhbGxlZCBpbiBuYW1lX29iaiAlcFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gbmFtZV9vYmogJXBcbiIsCiAJCQlvYmplY3QsIG5vZGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKQEAgLTE5Miw3ICsxOTYsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RldGFjaF9vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgLSBBbiBub2RlIHdob3NlIG9iamVjdCB3aWxsIGJlIGRldGFjaGVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgLSBBIE5hbWVzcGFjZSBub2RlIHdob3NlIG9iamVjdCB3aWxsIGJlIGRldGFjaGVkCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUuCiAgKgpAQCAtMjQ4LDcgKzI1Miw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gUGFyZW50IE5vZGUgdG8gYmUgZXhhbWluZWQKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKICAqCiAgKiBSRVRVUk46ICAgICAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZpZWxkIGZyb20gdGhlIE5vZGUgd2hvc2UKICAqICAgICAgICAgICAgICBoYW5kbGUgaXMgcGFzc2VkCkBAIC0yODQsNyArMjg4LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gUGFyZW50IE5vZGUgdG8gYmUgZXhhbWluZWQKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKICAqCiAgKiBSRVRVUk46ICAgICAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZpZWxkIGZyb20gdGhlIE5vZGUgd2hvc2UKICAqICAgICAgICAgICAgICBoYW5kbGUgaXMgcGFzc2VkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCmluZGV4IDBlNmRlYTIuLmFmOGFhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKQEAgLTQ5LDE1ICs0OSwyNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3NlYXJjaCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSwKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAorCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX25vZGUKICAqCi0gKiBQQVJBTUVURVJTOiAgKnRhcmdldF9uYW1lICAgICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCi0gKiAgICAgICAgICAgICAgKk5vZGUgICAgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKLSAqICAgICAgICAgICAgICAqKnJldHVybl9ub2RlICAgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTmFtZWQgb2JqIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgdGFyZ2V0X25hbWUgICAgIC0gQXNjaWkgQUNQSSBuYW1lIHRvIHNlYXJjaCBmb3IKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgLSBXaGVyZSB0aGUgbWF0Y2hlZCBOYW1lZCBvYmogaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTYzLDEwICsxNzIsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUKICAqCi0gKiBQQVJBTUVURVJTOiAgKnRhcmdldF9uYW1lICAgICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCi0gKiAgICAgICAgICAgICAgKk5vZGUgICAgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKLSAqICAgICAgICAgICAgICAqKnJldHVybl9ub2RlICAgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTm9kZSBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTm9kZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yNTcsMTIgKzI2NiwxMiBAQAogICoKICAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfbmFtZSAgICAgICAgIC0gQXNjaWkgQUNQSSBuYW1lIHRvIHNlYXJjaCBmb3IgKDQgY2hhcnMpCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhbGsKLSAqICAgICAgICAgICAgICAqTm9kZSAgICAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCiAgKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJfbW9kZSAgICAtIEFkZCBuYW1lcyBvbmx5IGluIEFDUElfTU9ERV9MT0FEX1BBU1NfeC4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLHNlYXJjaCBvbmx5LgogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBtYXRjaAogICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGbGFncyBkZXNjcmliaW5nIHRoZSBzZWFyY2ggcmVzdHJpY3Rpb25zCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fbm9kZSAgICAgICAtIFdoZXJlIHRoZSBOb2RlIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgICAgICAtIFdoZXJlIHRoZSBOb2RlIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKaW5kZXggNzVkYTc2Yy4uYzUzYjgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKQEAgLTUxLDYgKzUxLDE4IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zdXRpbHMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB1OAorYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApOworCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKK2FjcGlfbmFtZQorYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlX3RvX3NlYXJjaCk7CisjZW5kaWYKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU5LDcgKzcxLDggQEAKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKKyAqICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lICAgICAgIC0gTmFtZSBvciBwYXRoIG9mIHRoZSBuYW1lc3BhY2Ugbm9kZQorICogICAgICAgICAgICAgIGxvb2t1cF9zdGF0dXMgICAgICAgLSBFeGNlcHRpb24gY29kZSBmcm9tIE5TIGxvb2t1cAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTIxLDYgKzEzNCw5IEBACiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKKyAqICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgICAgICAgIC0gUHJlZml4IHJlbGF0aXZlIHRvIHRoZSBwYXRoCisgKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIFBhdGggdG8gdGhlIG5vZGUKKyAqICAgICAgICAgICAgICBtZXRob2Rfc3RhdHVzICAgICAgIC0gRXhlY3V0aW9uIHN0YXR1cwogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTYxLDggKzE3Nyw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgICAgIC0gT2JqZWN0Ci0gKiAgICAgICAgICAgICAgTXNnICAgICAgICAgICAgICAgICAtIFByZWZpeCBtZXNzYWdlCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gT2JqZWN0CisgKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgIC0gUHJlZml4IG1lc3NhZ2UKICAqCiAgKiBERVNDUklQVElPTjogUHJpbnQgYW4gb2JqZWN0J3MgZnVsbCBuYW1lc3BhY2UgcGF0aG5hbWUKICAqICAgICAgICAgICAgICBNYW5hZ2VzIGFsbG9jYXRpb24vZnJlZWluZyBvZiBhIHBhdGhuYW1lIGJ1ZmZlcgpAQCAtMTcyLDcgKzE4OCw3IEBACiB2b2lkCiBhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnKQorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lc3NhZ2UpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICBidWZmZXI7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CkBAIC0xODksOCArMjA1LDggQEAKIAogCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lIChub2RlLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCWlmIChtc2cpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiJXMgIiwgbXNnKTsKKwkJaWYgKG1lc3NhZ2UpIHsKKwkJCWFjcGlfb3NfcHJpbnRmICgiJXMgIiwgbWVzc2FnZSk7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIlslc10gKE5vZGUgJXApIiwgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIsIG5vZGUpOwpAQCAtMjI0LDcgKzI0MCw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IKICAqCi0gKiBQQVJBTUVURVJTOiAgU2VwICAgICAgICAgICAgICAtIENoYXJhY3RlciB0byBiZSBjaGVja2VkCisgKiBQQVJBTUVURVJTOiAgU2VwICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAogICoKICAqIFJFVFVSTjogICAgICBUUlVFIGlmIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IKICAqCkBAIC0yMzIsNyArMjQ4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAorc3RhdGljIHU4CiBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCkKIHsKQEAgLTI0NSwxMCArMjYxLDEyIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3R5cGUKICAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgLSBQYXJlbnQgTm9kZSB0byBiZSBleGFtaW5lZAogICoKICAqIFJFVFVSTjogICAgICBUeXBlIGZpZWxkIGZyb20gTm9kZSB3aG9zZSBoYW5kbGUgaXMgcGFzc2VkCiAgKgorICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgdHlwZSBvZiBhIE5hbWVzcGFjZSBub2RlCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9vYmplY3RfdHlwZQpAQCAtMjcxLDExICsyODksMTMgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb2NhbAogICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgLSBBIG5hbWVzcGFjZSBvYmplY3QgdHlwZQorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgIC0gQSBuYW1lc3BhY2Ugb2JqZWN0IHR5cGUKICAqCiAgKiBSRVRVUk46ICAgICAgTE9DQUwgaWYgbmFtZXMgbXVzdCBiZSBmb3VuZCBsb2NhbGx5IGluIG9iamVjdHMgb2YgdGhlCiAgKiAgICAgICAgICAgICAgcGFzc2VkIHR5cGUsIDAgaWYgZW5jbG9zaW5nIHNjb3BlcyBzaG91bGQgYmUgc2VhcmNoZWQKICAqCisgKiBERVNDUklQVElPTjogUmV0dXJucyBzY29wZSBydWxlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IHR5cGUuCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdTMyCkBAIC0zMDMsNyArMzIzLDcgQEAKICAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBJbmZvIHN0cnVjdCBpbml0aWFsaXplZCB3aXRoIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIG5hbWUgcG9pbnRlci4KICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJuYWwgKEFNTCkgbmFtZXN0cmluZwogICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVybmFsIChBU0wpIG5hbWVzdHJpbmcuCkBAIC01NTEsMTQgKzU3MSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4dGVybmFsaXplX25hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX25hbWUgICAgICAgICAtIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKLSAqICAgICAgICAgICAgICAqKmNvbnZlcnRlZF9uYW1lICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSByZXN1bHRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgbmFtZQorICogUEFSQU1FVEVSUzogIGludGVybmFsX25hbWVfbGVuZ3RoIC0gTGVudGggb2YgdGhlIGludGVybmFsIG5hbWUgYmVsb3cKKyAqICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lICAgICAgIC0gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgbmFtZQorICogICAgICAgICAgICAgIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBjb252ZXJ0ZWRfbmFtZSAgICAgIC0gV2hlcmUgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBuYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGludGVybmFsIG5hbWUgKGUuZy4gNWMgMmYgMDIgNWYgNTAgNTIgNWYgNDMgNTAgNTUgMzApCi0gKiAgICAgICAgICAgICAgdG8gaXRzIGV4dGVybmFsIGZvcm0gKGUuZy4gIlxfUFJfLkNQVTAiKQorICogICAgICAgICAgICAgIHRvIGl0cyBleHRlcm5hbCAocHJpbnRhYmxlKSBmb3JtIChlLmcuICJcX1BSXy5DUFUwIikKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03MTcsOCArNzM5LDkgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhIG5hbWVzcGFjZSBoYW5kbGUgdG8gYSByZWFsIE5vZGUKICAqCi0gKiBOb3RlOiBSZWFsIGludGVnZXIgaGFuZGxlcyBhbGxvdyBmb3IgbW9yZSB2ZXJpZmljYXRpb24KLSAqICAgICAgIGFuZCBrZWVwIGFsbCBwb2ludGVycyB3aXRoaW4gdGhpcyBzdWJzeXN0ZW0uCisgKiBOb3RlOiBSZWFsIGludGVnZXIgaGFuZGxlcyB3b3VsZCBhbGxvdyBmb3IgbW9yZSB2ZXJpZmljYXRpb24KKyAqICAgICAgIGFuZCBrZWVwIGFsbCBwb2ludGVycyB3aXRoaW4gdGhpcyBzdWJzeXN0ZW0gLSBob3dldmVyIHRoaXMgaW50cm9kdWNlcworICogICAgICAgbW9yZSAoYW5kIHBlcmhhcHMgdW5uZWNlc3NhcnkpIG92ZXJoZWFkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTc3NSw3ICs3OTgsNyBAQAogCXJldHVybiAoKGFjcGlfaGFuZGxlKSBub2RlKTsKIAogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIEV4YW1wbGUgZnV0dXJlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJaWYgKCFOb2RlKQogCXsKQEAgLTgwMSwxMiArODI0LDEzIEBACiAgKgogICogUkVUVVJOOiAgICAgIG5vbmUKICAqCi0gKiBERVNDUklQVElPTjogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0YWJsZSBzdG9yYWdlLgorICogREVTQ1JJUFRJT046IGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbmFtZXNwYWNlIGFuZCBBQ1BJIHRhYmxlIHN0b3JhZ2UuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9uc190ZXJtaW5hdGUgKHZvaWQpCithY3BpX25zX3Rlcm1pbmF0ZSAoCisJdm9pZCkKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKIApAQCAtOTQwLDcgKzk2NCw2IEBACiAJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAogY2xlYW51cDoKLQkvKiBDbGVhbnVwICovCiAJaWYgKGludGVybmFsX3BhdGgpIHsKIAkJQUNQSV9NRU1fRlJFRSAoaW50ZXJuYWxfcGF0aCk7CiAJfQpAQCAtOTUwLDYgKzk3Myw3NCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9wYXJlbnRfbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgIC0gQ3VycmVudCB0YWJsZSBlbnRyeQorICoKKyAqIFJFVFVSTjogICAgICBQYXJlbnQgZW50cnkgb2YgdGhlIGdpdmVuIGVudHJ5CisgKgorICogREVTQ1JJUFRJT046IE9idGFpbiB0aGUgcGFyZW50IGVudHJ5IGZvciBhIGdpdmVuIGVudHJ5IGluIHRoZSBuYW1lc3BhY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgorYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKworCisJaWYgKCFub2RlKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBXYWxrIHRvIHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QuIFRoZSBsYXN0IGVudHJ5IGlzIG1hcmtlZCB3aXRoIGEgZmxhZworCSAqIGFuZCB0aGUgcGVlciBwb2ludGVyIGlzIHJlYWxseSBhIHBvaW50ZXIgYmFjayB0byB0aGUgcGFyZW50LiBUaGlzIHNhdmVzCisJICogcHV0dGluZyBhIHBhcmVudCBiYWNrIHBvaW50ZXIgaW4gZWFjaCBhbmQgZXZlcnkgbmFtZWQgb2JqZWN0IQorCSAqLworCXdoaWxlICghKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkpIHsKKwkJbm9kZSA9IG5vZGUtPnBlZXI7CisJfQorCisJcmV0dXJuIChub2RlLT5wZWVyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKKyAqCisgKiBSRVRVUk46ICAgICAgTmV4dCB2YWxpZCBOb2RlIGluIHRoZSBsaW5rZWQgbm9kZSBsaXN0LiBOVUxMIGlmIG5vIG1vcmUgdmFsaWQKKyAqICAgICAgICAgICAgICBub2Rlcy4KKyAqCisgKiBERVNDUklQVElPTjogRmluZCB0aGUgbmV4dCB2YWxpZCBub2RlIHdpdGhpbiBhIG5hbWUgdGFibGUuCisgKiAgICAgICAgICAgICAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgTlVMTC1lbmQtb2YtbGlzdCBsb29wcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCithY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUgKAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCit7CisKKwkvKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIHBlZXIgbGlzdCwgcmV0dXJuIE5VTEwgKi8KKworCWlmIChub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHRoZSBuZXh0IHBlZXIgKi8KKworCXJldHVybiAobm9kZS0+cGVlcik7Cit9CisKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2ZpbmRfcGFyZW50X25hbWUKICAqCiAgKiBQQVJBTUVURVJTOiAgKmNoaWxkX25vZGUgICAgICAgICAgICAtIE5hbWVkIE9iaiB3aG9zZSBuYW1lIGlzIHRvIGJlIGZvdW5kCkBAIC05NjEsNyArMTA1Miw3IEBACiAgKiAgICAgICAgICAgICAgKHdoaWNoICJzaG91bGQgbm90IGhhcHBlbiIpLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKwogYWNwaV9uYW1lCiBhY3BpX25zX2ZpbmRfcGFyZW50X25hbWUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkX25vZGUpCkBAIC05OTcsNzMgKzEwODgsMyBAQAogI2VuZGlmCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKLSAqCi0gKiBSRVRVUk46ICAgICAgUGFyZW50IGVudHJ5IG9mIHRoZSBnaXZlbiBlbnRyeQotICoKLSAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIHBhcmVudCBlbnRyeSBmb3IgYSBnaXZlbiBlbnRyeSBpbiB0aGUgbmFtZXNwYWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaWYgKCFub2RlKSB7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyoKLQkgKiBXYWxrIHRvIHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QuIFRoZSBsYXN0IGVudHJ5IGlzIG1hcmtlZCB3aXRoIGEgZmxhZwotCSAqIGFuZCB0aGUgcGVlciBwb2ludGVyIGlzIHJlYWxseSBhIHBvaW50ZXIgYmFjayB0byB0aGUgcGFyZW50LiBUaGlzIHNhdmVzCi0JICogcHV0dGluZyBhIHBhcmVudCBiYWNrIHBvaW50ZXIgaW4gZWFjaCBhbmQgZXZlcnkgbmFtZWQgb2JqZWN0IQotCSAqLwotCXdoaWxlICghKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkpIHsKLQkJbm9kZSA9IG5vZGUtPnBlZXI7Ci0JfQotCi0KLQlyZXR1cm4gKG5vZGUtPnBlZXIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgIC0gQ3VycmVudCB0YWJsZSBlbnRyeQotICoKLSAqIFJFVFVSTjogICAgICBOZXh0IHZhbGlkIE5vZGUgaW4gdGhlIGxpbmtlZCBub2RlIGxpc3QuIE5VTEwgaWYgbm8gbW9yZSB2YWxpZAotICogICAgICAgICAgICAgIG5vZGVzLgotICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kIHRoZSBuZXh0IHZhbGlkIG5vZGUgd2l0aGluIGEgbmFtZSB0YWJsZS4KLSAqICAgICAgICAgICAgICBVc2VmdWwgZm9yIGltcGxlbWVudGluZyBOVUxMLWVuZC1vZi1saXN0IGxvb3BzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQotewotCi0JLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QsIHJldHVybiBOVUxMICovCi0KLQlpZiAobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIE90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgbmV4dCBwZWVyICovCi0KLQlyZXR1cm4gKG5vZGUtPnBlZXIpOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCmluZGV4IDRkZTI0NDQuLmY5YTcyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwpAQCAtNTYsNyArNTYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gVHlwZSBvZiBub2RlIHRvIGJlIHNlYXJjaGVkIGZvcgogICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAgICAgLSBQYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiB3ZSBhcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZwogICogICAgICAgICAgICAgIGNoaWxkX25vZGUgICAgICAgICAgLSBQcmV2aW91cyBjaGlsZCB0aGF0IHdhcyBmb3VuZC4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE5FWFQgY2hpbGQgd2lsbCBiZSByZXR1cm5lZAogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYwppbmRleCAxZGM5OTU1Li4xMmVhMjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCkBAIC01OCwxMSArNTgsMTEgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZAogICoKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gT2JqZWN0IGhhbmRsZSAob3B0aW9uYWwpCi0gKiAgICAgICAgICAgICAgKlBhdGhuYW1lICAgICAgICAgICAtIE9iamVjdCBwYXRobmFtZSAob3B0aW9uYWwpCi0gKiAgICAgICAgICAgICAgKipleHRlcm5hbF9wYXJhbXMgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIG1ldGhvZCwKKyAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgICAgIC0gT2JqZWN0IHBhdGhuYW1lIChvcHRpb25hbCkKKyAqICAgICAgICAgICAgICBleHRlcm5hbF9wYXJhbXMgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gbWV0aG9kLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBNYXkgYmUgTlVMTAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCi0gKiAgICAgICAgICAgICAgKnJldHVybl9idWZmZXIgICAgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgcmV0dXJuX2J1ZmZlciAgICAgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqICAgICAgICAgICAgICByZXR1cm5fdHlwZSAgICAgICAgIC0gRXhwZWN0ZWQgdHlwZSBvZiByZXR1cm4gb2JqZWN0CiAgKgpAQCAtNzMsNiArNzMsNyBAQAogICogICAgICAgICAgICAgIGJlIHZhbGlkIChub24tbnVsbCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCAoCkBAIC0zMDcsNyArMzA4LDggQEAKIAkJCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCQkJCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCQkJCQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChyZXR1cm5fYnVmZmVyLCBidWZmZXJfc3BhY2VfbmVlZGVkKTsKKwkJCQkJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAocmV0dXJuX2J1ZmZlciwKKwkJCQkJCQkgIGJ1ZmZlcl9zcGFjZV9uZWVkZWQpOwogCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCQkvKgogCQkJCQkJICogQ2FsbGVyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCBvciBhIG5ldyBvbmUgY2FuJ3QgYmUgYWxsb2NhdGVkCkBAIC00MjMsNyArNDI1LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLCBBQ1BJX05TX1dBTEtfVU5MT0NLLAorCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLAorCQkJICBBQ1BJX05TX1dBTEtfVU5MT0NLLAogCQkJICB1c2VyX2Z1bmN0aW9uLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOwogCiAJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKQEAgLTUyNSw3ICs1MjgsOCBAQAogCQl9CiAJfQogCi0Jc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbiAob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKwlzdGF0dXMgPSBpbmZvLT51c2VyX2Z1bmN0aW9uIChvYmpfaGFuZGxlLCBuZXN0aW5nX2xldmVsLCBpbmZvLT5jb250ZXh0LAorCQkJIHJldHVybl92YWx1ZSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKaW5kZXggZjI0MDVlZi4uOGQwOTc5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYwpAQCAtNTcsOSArNTcsOSBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2hhbmRsZQogICoKICAqIFBBUkFNRVRFUlM6ICBQYXJlbnQgICAgICAgICAgLSBPYmplY3QgdG8gc2VhcmNoIHVuZGVyIChzZWFyY2ggc2NvcGUpLgotICogICAgICAgICAgICAgIHBhdGhfbmFtZSAgICAgICAtIFBvaW50ZXIgdG8gYW4gYXNjaWl6IHN0cmluZyBjb250YWluaW5nIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQotICogICAgICAgICAgICAgIHJldF9oYW5kbGUgICAgICAtIFdoZXJlIHRoZSByZXR1cm4gaGFuZGxlIGlzIHBsYWNlZAorICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIFBvaW50ZXIgdG8gYW4gYXNjaWl6IHN0cmluZyBjb250YWluaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKKyAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIGhhbmRsZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMjAsNyArMjIwLDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9vYmplY3RfaW5mbwogICoKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBPYmplY3QgSGFuZGxlCi0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gV2hlcmUgdGhlIGluZm8gaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBCdWZmZXIgICAgICAgICAgLSBXaGVyZSB0aGUgaW5mbyBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCmluZGV4IDE5YWNmMzIuLjM2M2UxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCkBAIC01Niw3ICs1Niw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdHlwZQogICoKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgb2Ygb2JqZWN0IHdob3NlIHR5cGUgaXMgZGVzaXJlZAotICogICAgICAgICAgICAgICpyZXRfdHlwZSAgICAgICAtIFdoZXJlIHRoZSB0eXBlIHdpbGwgYmUgcGxhY2VkCisgKiAgICAgICAgICAgICAgcmV0X3R5cGUgICAgICAgIC0gV2hlcmUgdGhlIHR5cGUgd2lsbCBiZSBwbGFjZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjU4LDUgKzI1OCw1IEBACiAJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25leHRfb2JqZWN0KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uZXh0X29iamVjdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggNWE5MTI4ZC4uYmRkOWYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtNzEsNiArNzEsOSBAQAogZXh0ZXJuIGNoYXIgbGluZV9idWZbODBdOwogI2VuZGlmIC8qRU5BQkxFX0RFQlVHR0VSKi8KIAoraW50IGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQ7CitFWFBPUlRfU1lNQk9MKGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IGFjcGlfaXJxX2lycTsKIHN0YXRpYyBhY3BpX29zZF9oYW5kbGVyIGFjcGlfaXJxX2hhbmRsZXI7CiBzdGF0aWMgdm9pZCAqYWNwaV9pcnFfY29udGV4dDsKQEAgLTExNTIsNiArMTE1NSwxNSBAQAogCiBfX3NldHVwKCJhY3BpX3dha2VfZ3Blc19hbHdheXNfb24iLCBhY3BpX3dha2VfZ3Blc19hbHdheXNfb25fc2V0dXApOwogCitpbnQgX19pbml0CithY3BpX2hvdGtleV9zZXR1cChjaGFyICpzdHIpCit7CisJYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCA9IFRSVUU7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFjcGlfc3BlY2lmaWNfaG90a2V5IiwgYWNwaV9ob3RrZXlfc2V0dXApOworCiAvKgogICogbWF4X2NzdGF0ZSBpcyBkZWZpbmVkIGluIHRoZSBiYXNlIGtlcm5lbCBzbyBtb2R1bGVzIGNhbgogICogY2hhbmdlIGl0IHcvbyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKaW5kZXggYjVkOTg4OS4uYjdhYzY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCkBAIC01MCw2ICs1MCwxNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc2FyZ3MiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB1MzIKK2FjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKAorCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7CisKK3N0YXRpYyB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCithY3BpX3BzX2dldF9uZXh0X2ZpZWxkICgKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjQsNyArNzQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgorc3RhdGljIHUzMgogYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQogewpAQCAtNzgsNyArODgsNiBAQAogCWVuY29kZWRfbGVuZ3RoID0gKHUzMikgQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCk7CiAJcGFyc2VyX3N0YXRlLT5hbWwrKzsKIAotCiAJc3dpdGNoIChlbmNvZGVkX2xlbmd0aCA+PiA2KSAvKiBiaXRzIDYtNyBjb250YWluIGVuY29kaW5nIHNjaGVtZSAqLyB7CiAJY2FzZSAwOiAvKiAxLWJ5dGUgZW5jb2RpbmcgKGJpdHMgMC01KSAqLwogCkBAIC0yODcsMTMgKzI5NiwxNCBAQAogCQkgKiBwYXJlbnQgdHJlZSwgYnV0IGRvbid0IG9wZW4gYSBuZXcgc2NvcGUgLS0gd2UganVzdCB3YW50IHRvIGxvb2t1cCB0aGUKIAkJICogb2JqZWN0ICAoTVVTVCBCRSBtb2RlIEVYRUNVVEUgdG8gcGVyZm9ybSB1cHNlYXJjaCkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICgmc2NvcGVfaW5mbywgcGF0aCwgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgTlVMTCwgJm5vZGUpOworCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoJnNjb3BlX2luZm8sIHBhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkJIE5VTEwsICZub2RlKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSAmJiBtZXRob2RfY2FsbCkgewogCQkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkgewotCQkJCS8qCi0JCQkJICogVGhpcyBuYW1lIGlzIGFjdHVhbGx5IGEgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbgotCQkJCSAqLworCQkJCS8qIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gKi8KKwogCQkJCW1ldGhvZF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwKIAkJCQkJIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLApAQCAtMzYwLDcgKzM3MCw3IEBACiAJCQkJLyoKIAkJCQkgKiBXZSBnb3QgYSBOT1RfRk9VTkQgZHVyaW5nIHRhYmxlIGxvYWQgb3Igd2UgZW5jb3VudGVyZWQKIAkJCQkgKiBhIGNvbmRfcmVmX29mKHgpIHdoZXJlIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3QuCi0JCQkJICogLS0gZWl0aGVyIGNhc2UgaXMgb2sKKwkJCQkgKiBFaXRoZXIgY2FzZSBpcyBvawogCQkJCSAqLwogCQkJCXN0YXR1cyA9IEFFX09LOwogCQkJfQpAQCAtNDg2LDEyICs0OTYsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCitzdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldCA9ICh1MzIpIEFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+YW1sLAotCQkJIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQgPSAodTMyKQorCQkJICBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKKwkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmZpZWxkOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKQEAgLTUwMCw3ICs1MTEsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19nZXRfbmV4dF9maWVsZCIpOwogCiAKLQkvKiBkZXRlcm1pbmUgZmllbGQgdHlwZSAqLworCS8qIERldGVybWluZSBmaWVsZCB0eXBlICovCiAKIAlzd2l0Y2ggKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpKSB7CiAJZGVmYXVsdDoKQEAgLTUyMSw3ICs1MzIsNiBAQAogCQlicmVhazsKIAl9CiAKLQogCS8qIEFsbG9jYXRlIGEgbmV3IGZpZWxkIG9wICovCiAKIAlmaWVsZCA9IGFjcGlfcHNfYWxsb2Nfb3AgKG9wY29kZSk7CkBAIC01ODIsMTAgKzU5MiwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X2FyZwogICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CiAgKiAgICAgICAgICAgICAgYXJnX3R5cGUgICAgICAgICAgICAtIFRoZSBhcmd1bWVudCB0eXBlIChBTUxfKl9BUkcpCi0gKiAgICAgICAgICAgICAgYXJnX2NvdW50ICAgICAgICAgICAtIElmIHRoZSBhcmd1bWVudCBwb2ludHMgdG8gYSBjb250cm9sIG1ldGhvZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4KKyAqICAgICAgICAgICAgICByZXR1cm5fYXJnICAgICAgICAgIC0gV2hlcmUgdGhlIG5leHQgYXJnIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cywgYW5kIGFuIG9wIG9iamVjdCBjb250YWluaW5nIHRoZSBuZXh0IGFyZ3VtZW50LgogICoKQEAgLTYxOSw3ICs2MjksNyBAQAogCWNhc2UgQVJHUF9OQU1FOgogCWNhc2UgQVJHUF9OQU1FU1RSSU5HOgogCi0JCS8qIGNvbnN0YW50cywgc3RyaW5ncywgYW5kIG5hbWVzdHJpbmdzIGFyZSBhbGwgdGhlIHNhbWUgc2l6ZSAqLworCQkvKiBDb25zdGFudHMsIHN0cmluZ3MsIGFuZCBuYW1lc3RyaW5ncyBhcmUgYWxsIHRoZSBzYW1lIHNpemUgKi8KIAogCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfQllURV9PUCk7CiAJCWlmICghYXJnKSB7CkBAIC02NTQsNyArNjY0LDYgQEAKIAkJCQllbHNlIHsKIAkJCQkJYXJnID0gZmllbGQ7CiAJCQkJfQotCiAJCQkJcHJldiA9IGZpZWxkOwogCQkJfQogCkBAIC02NzcsOCArNjg2LDggQEAKIAogCQkJLyogRmlsbCBpbiBieXRlbGlzdCBkYXRhICovCiAKLQkJCWFyZy0+Y29tbW9uLnZhbHVlLnNpemUgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQsCi0JCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwpOworCQkJYXJnLT5jb21tb24udmFsdWUuc2l6ZSA9ICh1MzIpCisJCQkJQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5wa2dfZW5kLCBwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCQlhcmctPm5hbWVkLmRhdGEgPSBwYXJzZXJfc3RhdGUtPmFtbDsKIAogCQkJLyogU2tpcCB0byBFbmQgb2YgYnl0ZSBkYXRhICovCkBAIC03MDYsNyArNzE1LDcgQEAKIAkJCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGggKHdhbGtfc3RhdGUsIHBhcnNlcl9zdGF0ZSwgYXJnLCAwKTsKIAkJfQogCQllbHNlIHsKLQkJCS8qIHNpbmdsZSBjb21wbGV4IGFyZ3VtZW50LCBub3RoaW5nIHJldHVybmVkICovCisJCQkvKiBTaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLwogCiAJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAxOwogCQl9CkBAIC03MTYsNyArNzI1LDcgQEAKIAljYXNlIEFSR1BfREFUQU9CSjoKIAljYXNlIEFSR1BfVEVSTUFSRzoKIAotCQkvKiBzaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLworCQkvKiBTaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLwogCiAJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDE7CiAJCWJyZWFrOwpAQCAtNzI3LDcgKzczNiw3IEBACiAJY2FzZSBBUkdQX09CSkxJU1Q6CiAKIAkJaWYgKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5wa2dfZW5kKSB7Ci0JCQkvKiBub24tZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMsIG5vdGhpbmcgcmV0dXJuZWQgKi8KKwkJCS8qIE5vbi1lbXB0eSBsaXN0IG9mIHZhcmlhYmxlIGFyZ3VtZW50cywgbm90aGluZyByZXR1cm5lZCAqLwogCiAJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSBBQ1BJX1ZBUl9BUkdTOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKaW5kZXggMDNlMzNmZS4uNTc0NDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYwpAQCAtNDQsNiArNDQsNyBAQAogCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgorI2luY2x1ZGUgPGFjcGkvYWNvcGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAogCkBAIC01MSwyMyArNTIsNiBAQAogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHNvcGNvZGUiKQogCiAKLSNkZWZpbmUgX1VOSyAgICAgICAgICAgICAgICAgICAgICAgIDB4NkIKLS8qCi0gKiBSZXNlcnZlZCBBU0NJSSBjaGFyYWN0ZXJzLiAgRG8gbm90IHVzZSBhbnkgb2YgdGhlc2UgZm9yCi0gKiBpbnRlcm5hbCBvcGNvZGVzLCBzaW5jZSB0aGV5IGFyZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUKLSAqIG5hbWUgc3RyaW5ncyBmcm9tIEFNTCBvcGNvZGVzCi0gKi8KLSNkZWZpbmUgX0FTQyAgICAgICAgICAgICAgICAgICAgICAgIDB4NkMKLSNkZWZpbmUgX05BTSAgICAgICAgICAgICAgICAgICAgICAgIDB4NkMKLSNkZWZpbmUgX1BGWCAgICAgICAgICAgICAgICAgICAgICAgIDB4NkQKLSNkZWZpbmUgX1VOS05PV05fT1BDT0RFICAgICAgICAgICAgIDB4MDIgICAgLyogQW4gZXhhbXBsZSB1bmtub3duIG9wY29kZSAqLwotCi0jZGVmaW5lIE1BWF9FWFRFTkRFRF9PUENPREUgICAgICAgICAweDg4Ci0jZGVmaW5lIE5VTV9FWFRFTkRFRF9PUENPREUgICAgICAgICAoTUFYX0VYVEVOREVEX09QQ09ERSArIDEpCi0jZGVmaW5lIE1BWF9JTlRFUk5BTF9PUENPREUKLSNkZWZpbmUgTlVNX0lOVEVSTkFMX09QQ09ERSAgICAgICAgIChNQVhfSU5URVJOQUxfT1BDT0RFICsgMSkKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5BTUU6ICAgICAgICBhY3BpX2dibF9hbWxfb3BfaW5mbwpAQCAtNzksMjc0ICs2Myw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0vKgotICogQWxsIEFNTCBvcGNvZGVzIGFuZCB0aGUgcGFyc2UtdGltZSBhcmd1bWVudHMgZm9yIGVhY2guICBVc2VkIGJ5IHRoZSBBTUwgcGFyc2VyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZAotICogaW50byBhIDMyLWJpdCBudW1iZXIgYW5kIHN0b3JlZCBpbiB0aGUgbWFzdGVyIG9wY29kZSB0YWJsZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLSAqLwotCi0KLSNkZWZpbmUgQVJHUF9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1dPUkREQVRBKQotI2RlZmluZSBBUkdQX0FERF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9BTElBU19PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX05BTUVTVFJJTkcsQVJHUF9URVJNQVJHLCAgIEFSR1BfQllURURBVEEsICBBUkdQX0ZJRUxETElTVCkKLSNkZWZpbmUgQVJHUF9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0JZVEVMSVNUKQotI2RlZmluZSBBUkdQX0JZVEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQllURURBVEEpCi0jZGVmaW5lIEFSR1BfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0NPUFlfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9TSU1QTEVOQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQ1JFQVRFX0JZVEVfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9GSUVMRF9PUCAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9EQVRBX1JFR0lPTl9PUCAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX0RFUkVGX09GX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9ERVZJQ0VfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9PQkpMSVNUKQotI2RlZmluZSBBUkdQX0RJVklERV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCwgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfRFdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9EV09SRERBVEEpCi0jZGVmaW5lIEFSR1BfRUxTRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX0VWRU5UX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9GQVRBTF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX0JZVEVEQVRBLCAgIEFSR1BfRFdPUkREQVRBLCAgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0ZJRUxEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCi0jZGVmaW5lIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUxJU1QpCi0jZGVmaW5lIEFSR1BfSU5DUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHUF9MSVNUNSAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUVTVFJJTkcsICAgIEFSR1BfTkFNRVNUUklORyxBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCi0jZGVmaW5lIEFSR1BfSU5ERVhfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0xBTkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xFUVVBTF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xMRVNTX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX0xOT1RfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTk9URVFVQUxfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MT0FEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUwyICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDMgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMNCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUw1ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDYgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMNyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9SX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTUFUQ0hfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9NRVRIT0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfVEVSTUxJU1QpCi0jZGVmaW5lIEFSR1BfTUVUSE9EQ0FMTF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX01JRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfTU9EX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX01VTFRJUExZX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9NVVRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEpCi0jZGVmaW5lIEFSR1BfTkFNRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0RBVEFPQkopCi0jZGVmaW5lIEFSR1BfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9EQVRBT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9QT1dFUl9SRVNfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1Q1IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfV09SRERBVEEsICBBUkdQX09CSkxJU1QpCi0jZGVmaW5lIEFSR1BfUFJPQ0VTU09SX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX0RXT1JEREFUQSwgQVJHUF9CWVRFREFUQSwgIEFSR1BfT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1FXT1JEREFUQSkKLSNkZWZpbmUgQVJHUF9SRUZfT0ZfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9SRUdJT05fT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9SRUxFQVNFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9SRVNFUlZFREZJRUxEX09QICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfUkVTRVRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfVEVSTUxJU1QpCi0jZGVmaW5lIEFSR1BfU0hJRlRfTEVGVF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1NISUZUX1JJR0hUX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9TSUdOQUxfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9TTEVFUF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfU1RBTExfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX1NUQVRJQ1NUUklOR19PUCAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9TVE9SRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX1NUUklOR19PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQ0hBUkxJU1QpCi0jZGVmaW5lIEFSR1BfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX09CSkxJU1QpCi0jZGVmaW5lIEFSR1BfVElNRVJfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9UT19CQ0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX0JVRkZFUl9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfVE9fREVDX1NUUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UT19IRVhfU1RSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX0lOVEVHRVJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfVE9fU1RSSU5HX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RZUEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0RBVEFPQkpMSVNUKQotI2RlZmluZSBBUkdQX1dBSVRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX1dISUxFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX1dPUkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfV09SRERBVEEpCi0jZGVmaW5lIEFSR1BfWkVST19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLQotCi0vKgotICogQWxsIEFNTCBvcGNvZGVzIGFuZCB0aGUgcnVudGltZSBhcmd1bWVudHMgZm9yIGVhY2guICBVc2VkIGJ5IHRoZSBBTUwgaW50ZXJwcmV0ZXIgIEVhY2ggbGlzdCBpcyBjb21wcmVzc2VkCi0gKiBpbnRvIGEgMzItYml0IG51bWJlciBhbmQgc3RvcmVkIGluIHRoZSBtYXN0ZXIgb3Bjb2RlIHRhYmxlIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgotICoKLSAqIChVc2VkIGJ5IHByZXBfb3BlcmFuZHMgcHJvY2VkdXJlIGFuZCB0aGUgQVNMIENvbXBpbGVyKQotICovCi0KLQotI2RlZmluZSBBUkdJX0FDQ0VTU0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9BQ1FVSVJFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX01VVEVYLCAgICAgIEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9BRERfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQUxJQVNfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0FSRzAgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHMSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkcyICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzMgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHNCAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkc1ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzYgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQkFOS19GSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0JJVF9BTkRfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CSVRfTkFORF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQklUX05PUl9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9OT1RfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQklUX09SX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9YT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CUkVBS19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0JSRUFLX1BPSU5UX09QICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQlVGRkVSX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX0JZVEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9CWVRFTElTVF9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQ09OQ0FUX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBLCAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9CVUZGRVIsICAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9DT05EX1JFRl9PRl9PUCAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX09CSkVDVF9SRUYsIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0NPTlRJTlVFX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9DT1BZX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0FOWVRZUEUsICAgIEFSR0lfU0lNUExFX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfQklUX0ZJRUxEX09QICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX0JZVEVfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0NSRUFURV9EV09SRF9GSUVMRF9PUCAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfRklFTERfT1AgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9JTlRFR0VSLCAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfV09SRF9GSUVMRF9PUCAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfREFUQV9SRUdJT05fT1AgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9TVFJJTkcsICAgICBBUkdJX1NUUklORywgICAgICAgIEFSR0lfU1RSSU5HKQotI2RlZmluZSBBUkdJX0RFQlVHX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfREVDUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSX1JFRikKLSNkZWZpbmUgQVJHSV9ERVJFRl9PRl9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX1JFRl9PUl9TVFJJTkcpCi0jZGVmaW5lIEFSR0lfREVWSUNFX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0RJVklERV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDQgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRiwgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfRFdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0VMU0VfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9FVkVOVF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfRkFUQUxfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9GSUVMRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfRklORF9TRVRfTEVGVF9CSVRfT1AgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCi0jZGVmaW5lIEFSR0lfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0lOREVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUExFWE9CSiwgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9MQU5EX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9MRVFVQUxfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfQ09NUFVURURBVEEpCi0jZGVmaW5lIEFSR0lfTEdSRUFURVJfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQotI2RlZmluZSBBUkdJX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9MTEVTU19PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfQ09NUFVURURBVEEpCi0jZGVmaW5lIEFSR0lfTExFU1NFUVVBTF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0xOT1RfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9MTk9URVFVQUxfT1AgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTE9BRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9SRUdJT05fT1JfRklFTEQsQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUNiAoQVJHSV9TVFJJTkcsICAgICBBUkdJX1NUUklORywgICAgICAgIEFSR0lfU1RSSU5HLCAgICAgICBBUkdJX1NUUklORywgICAgQVJHSV9TVFJJTkcsIEFSR0lfQU5ZVFlQRSkKLSNkZWZpbmUgQVJHSV9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUwyICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDMgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMNCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUw1ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDYgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMNyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9SX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTUFUQ0hfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNiAoQVJHSV9QQUNLQUdFLCAgICBBUkdJX0lOVEVHRVIsICAgQVJHSV9DT01QVVRFREFUQSwgICAgICBBUkdJX0lOVEVHRVIsQVJHSV9DT01QVVRFREFUQSxBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTUVUSE9EX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX01FVEhPRENBTExfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9NSURfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0JVRkZFUl9PUl9TVFJJTkcsQVJHSV9JTlRFR0VSLCAgQVJHSV9JTlRFR0VSLCAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX01PRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9NVUxUSVBMWV9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTVVURVhfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX05BTUVfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9OQU1FREZJRUxEX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTkFNRVBBVEhfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX05PT1BfT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTk9USUZZX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9ERVZJQ0VfUkVGLCBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfT05FX09QICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9PTkVTX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX1BBQ0tBR0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9QT1dFUl9SRVNfT1AgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfUFJPQ0VTU09SX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1FXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9SRUZfT0ZfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX09CSkVDVF9SRUYpCi0jZGVmaW5lIEFSR0lfUkVHSU9OX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfUkVMRUFTRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9NVVRFWCkKLSNkZWZpbmUgQVJHSV9SRVNFUlZFREZJRUxEX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfUkVTRVRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKLSNkZWZpbmUgQVJHSV9SRVRVUk5fT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfUkVWSVNJT05fT1AgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9TQ09QRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfU0hJRlRfTEVGVF9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX1NISUZUX1JJR0hUX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9TSUdOQUxfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0VWRU5UKQotI2RlZmluZSBBUkdJX1NJWkVfT0ZfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfREFUQU9CSkVDVCkKLSNkZWZpbmUgQVJHSV9TTEVFUF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfU1RBTExfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1NUQVRJQ1NUUklOR19PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9TVE9SRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0RBVEFSRUZPQkosIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX1NUUklOR19PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9TVUJUUkFDVF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfVEhFUk1BTF9aT05FX09QICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1RJTUVSX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfVE9fQkNEX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19CVUZGRVJfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQotI2RlZmluZSBBUkdJX1RPX0RFQ19TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVE9fSEVYX1NUUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19JTlRFR0VSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQotI2RlZmluZSBBUkdJX1RPX1NUUklOR19PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UWVBFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0FOWVRZUEUpCi0jZGVmaW5lIEFSR0lfVU5MT0FEX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9EREJIQU5ETEUpCi0jZGVmaW5lIEFSR0lfVkFSX1BBQ0tBR0VfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1dBSVRfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfRVZFTlQsICAgICAgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1dISUxFX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfWkVST19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLQotCiAvKgogICogU3VtbWFyeSBvZiBvcGNvZGUgdHlwZXMvZmxhZ3MKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogCiAgT3Bjb2RlcyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBuYW1lc3BhY2Ugb2JqZWN0cyAoQU1MX05TT0JKRUNUIGZsYWcpCiAKQEAgLTQ2MCwxNCArMTc5LDEzIEBACiAJQU1MX0NSRUFURV9EV09SRF9GSUVMRF9PUAogCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCiAvKgotICogTWFzdGVyIE9wY29kZSBpbmZvcm1hdGlvbiB0YWJsZS4gIEEgc3VtbWFyeSBvZiBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgZWFjaCBvcGNvZGUsIGFsbCBpbiBvbmUgcGxhY2UuCisgKiBNYXN0ZXIgT3Bjb2RlIGluZm9ybWF0aW9uIHRhYmxlLiAgQSBzdW1tYXJ5IG9mIGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCBlYWNoCisgKiBvcGNvZGUsIGFsbCBpbiBvbmUgcGxhY2UuCiAgKi8KLQotCiBjb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICAgYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXSA9CiB7CiAvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAqLwpAQCAtNjkzLDggKzQxMSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBUaGUgQU1MIG9wY29kZQogICoKLSAqIFJFVFVSTjogICAgICBBIHBvaW50ZXIgdG8gdGhlIGluZm8gYWJvdXQgdGhlIG9wY29kZS4gIE5VTEwgaWYgdGhlIG9wY29kZSB3YXMKLSAqICAgICAgICAgICAgICBub3QgZm91bmQgaW4gdGhlIHRhYmxlLgorICogUkVUVVJOOiAgICAgIEEgcG9pbnRlciB0byB0aGUgaW5mbyBhYm91dCB0aGUgb3Bjb2RlLgogICoKICAqIERFU0NSSVBUSU9OOiBGaW5kIEFNTCBvcGNvZGUgZGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIG9wY29kZS4KICAqICAgICAgICAgICAgICBOT1RFOiBUaGlzIHByb2NlZHVyZSBtdXN0IEFMV0FZUyByZXR1cm4gYSB2YWxpZCBwb2ludGVyIQpAQCAtNzMxLDcgKzQ0OCw4IEBACiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBBTUwgb3Bjb2RlIFslNC40WF1cbiIsIG9wY29kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJVbmtub3duIEFNTCBvcGNvZGUgWyU0LjRYXVxuIiwgb3Bjb2RlKSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwppbmRleCBlNzllZGI1Li5iYmZkYzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwpAQCAtNjQsNiArNjQsMjMgQEAKIAogc3RhdGljIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGVwdGggPSAwOwogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKKwlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3N0YXR1cyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19wYXJzZV9sb29wICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEwMCw3ICsxMTcsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQSBwYXJzZXIgc3RhdGUgb2JqZWN0CiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5leHQgQU1MIG9wY29kZQogICoKICAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBBTUwgb3Bjb2RlICh3aXRob3V0IGluY3JlbWVudGluZyBBTUwgcG9pbnRlcikKICAqCkBAIC0xMTcsNyArMTM0LDYgQEAKIAlhbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKIAlvcGNvZGUgPSAodTE2KSBBQ1BJX0dFVDggKGFtbCk7CiAKLQogCWlmIChvcGNvZGUgPT0gQU1MX0VYVE9QKSB7CiAJCS8qIEV4dGVuZGVkIG9wY29kZSAqLwogCkBAIC0xNDIsNyArMTU4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQpAQCAtMjcyLDcgKzI4OCw2IEBACiAJCQkJCW5leHQgPSBOVUxMOwogCQkJCX0KIAkJCX0KLQogCQkJcHJldiA9IG5leHQ7CiAJCX0KIAl9CkBAIC0yODAsNyArMjk1LDcgQEAKIAogY2xlYW51cDoKIAotCS8qIE5vdyB3ZSBjYW4gYWN0dWFsbHkgZGVsZXRlIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCBvcCAqLworCS8qIE5vdyB3ZSBjYW4gYWN0dWFsbHkgZGVsZXRlIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCBPcCAqLwogCiAJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOwogCXJldHVybl9WT0lEOwpAQCAtMjkxLDcgKzMwNiw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBvcAorICogICAgICAgICAgICAgIGNhbGxiYWNrX3N0YXR1cyAgICAgLSBTdGF0dXMgZnJvbSBwcmV2aW91cyBvcGVyYXRpb24KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzAwLDcgKzMxNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLApAQCAtMzgyLDkgKzM5OSw4IEBACiAKIAljYXNlIEFFX0NUUkxfVFJBTlNGRVI6CiAKLQkJLyoKLQkJICogQSBtZXRob2QgY2FsbCAoaW52b2NhdGlvbikgLS0gdHJhbnNmZXIgY29udHJvbAotCQkgKi8KKwkJLyogQSBtZXRob2QgY2FsbCAoaW52b2NhdGlvbikgLS0gdHJhbnNmZXIgY29udHJvbCAqLworCiAJCXN0YXR1cyA9IEFFX0NUUkxfVFJBTlNGRVI7CiAJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKIAkJd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfb3AgPSBvcDsKQEAgLTM5Nyw2ICs0MTMsNyBAQAogCiAKIAlkZWZhdWx0OgorCiAJCXN0YXR1cyA9IGNhbGxiYWNrX3N0YXR1czsKIAkJaWYgKChjYWxsYmFja19zdGF0dXMgJiBBRV9DT0RFX01BU0spID09IEFFX0NPREVfQ09OVFJPTCkgewogCQkJc3RhdHVzID0gQUVfT0s7CkBAIC00MTIsNyArNDI5LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9sb29wCiAgKgotICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MjEsNyArNDM4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3BzX3BhcnNlX2xvb3AgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCiB7CkBAIC00NDMsNiArNDYwLDcgQEAKIAl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOwogCiAjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCisKIAlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUKSB7CiAJCS8qIFdlIGFyZSByZXN0YXJ0aW5nIGEgcHJlZW1wdGVkIGNvbnRyb2wgbWV0aG9kICovCiAKQEAgLTQ3MSw3ICs0ODksOCBAQAogCQkJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCiAJCQkJCX0KLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsCisJCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJImdldF9wcmVkaWNhdGUgRmFpbGVkLCAlc1xuIiwKIAkJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQkJfQpAQCAtNDkyLDE2ICs1MTEsMTUgQEAKIAl9CiAjZW5kaWYKIAotCS8qCi0JICogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBhbWwgdG8gcHJvY2VzczoKLQkgKi8KKwkvKiBJdGVyYXRpdmUgcGFyc2luZyBsb29wLCB3aGlsZSB0aGVyZSBpcyBtb3JlIEFNTCB0byBwcm9jZXNzOiAqLworCiAJd2hpbGUgKChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+YW1sX2VuZCkgfHwgKG9wKSkgewogCQlhbWxfb3Bfc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKIAkJaWYgKCFvcCkgewogCQkJLyogR2V0IHRoZSBuZXh0IG9wY29kZSBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKIAkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOworCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKIAkJCXdhbGtfc3RhdGUtPm9wY29kZSAgID0gYWNwaV9wc19wZWVrX29wY29kZSAocGFyc2VyX3N0YXRlKTsKIAogCQkJLyoKQEAgLTU3OCw4ICs1OTYsMTAgQEAKIAkJCQkJSU5DUkVNRU5UX0FSR19MSVNUICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOwogCQkJCX0KIAotCQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YgYXJndW1lbnRzICovCi0KKwkJCQkvKgorCQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YKKwkJCQkgKiBhcmd1bWVudHMKKwkJCQkgKi8KIAkJCQlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpKSB7CiAJCQkJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOwogCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CkBAIC01OTcsMTIgKzYxNywxMyBAQAogCiAJCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSwgJm9wKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRHVyaW5nIG5hbWUgbG9va3VwL2NhdGFsb2csICVzXG4iLAotCQkJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZywgJXNcbiIsCisJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJCQkJZ290byBjbG9zZV90aGlzX29wOwogCQkJCX0KIAotCQkJCWlmIChvcCA9PSBOVUxMKSB7CisJCQkJaWYgKCFvcCkgewogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKQEAgLTY1OSw3ICs2ODAsNyBAQAogCiAJCQkJaWYgKCh3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpKSB7CiAJCQkJCS8qCi0JCQkJCSAqIEZpbmQgdGhlIG9iamVjdC4gIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bworCQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bwogCQkJCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCiAJCQkJCSAqLwogCQkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOwpAQCAtNjg4LDExICs3MDksMTUgQEAKIAkJfQogCiAKLQkJLyogU3RhcnQgYXJnX2NvdW50IGF0IHplcm8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZSBhbnkgYXJncyB5ZXQgKi8KLQorCQkvKgorCQkgKiBTdGFydCBhcmdfY291bnQgYXQgemVybyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgYXJlCisJCSAqIGFueSBhcmdzIHlldAorCQkgKi8KIAkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKIAotCQlpZiAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSAvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLyB7CisJCS8qIEFyZSB0aGVyZSBhbnkgYXJndW1lbnRzIHRoYXQgbXVzdCBiZSBwcm9jZXNzZWQ/ICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgewogCQkJLyogR2V0IGFyZ3VtZW50cyAqLwogCiAJCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewpAQCAtNzIwLDE0ICs3NDUsMTggQEAKIAogCQkJZGVmYXVsdDoKIAotCQkJCS8qIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQgdG8gdGhlIE9wICovCi0KKwkJCQkvKgorCQkJCSAqIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQKKwkJCQkgKiB0byB0aGUgT3AKKwkJCQkgKi8KIAkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgJiYKIAkJCQkJCSF3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKLQkJCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9ICh1MzIpIEFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+YW1sLAotCQkJCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwkJCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9ICh1MzIpCisJCQkJCQlBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOworCiAJCQkJCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X25leHRfYXJnICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsCi0JCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLCAmYXJnKTsKKwkJCQkJCQkgR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyksCisJCQkJCQkJICZhcmcpOwogCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CiAJCQkJCX0KQEAgLTc1Miw3ICs3ODEsOCBAQAogCQkJCQkgKiBTYXZlIHRoZSBsZW5ndGggYW5kIGFkZHJlc3Mgb2YgdGhlIGJvZHkKIAkJCQkJICovCiAJCQkJCW9wLT5uYW1lZC5kYXRhICAgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLSBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0KKwkJCQkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbCk7CiAKIAkJCQkJLyogU2tpcCBib2R5IG9mIG1ldGhvZCAqLwogCkBAIC03NzMsNyArODAzLDggQEAKIAkJCQkJCSAqIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgogCQkJCQkJICovCiAJCQkJCQlvcC0+bmFtZWQuZGF0YSAgID0gYW1sX29wX3N0YXJ0OwotCQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLSBhbWxfb3Bfc3RhcnQpOworCQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLQorCQkJCQkJCQkgICBhbWxfb3Bfc3RhcnQpOwogCiAJCQkJCQkvKiBTa2lwIGJvZHkgKi8KIApAQCAtNzg1LDcgKzgxNiw4IEBACiAJCQkJY2FzZSBBTUxfV0hJTEVfT1A6CiAKIAkJCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKLQkJCQkJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucGFja2FnZV9lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJCQkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KKwkJCQkJCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAKQEAgLTgwMSw4ICs4MzMsMTAgQEAKIAkJLyogQ2hlY2sgZm9yIGFyZ3VtZW50cyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkICovCiAKIAkJaWYgKHdhbGtfc3RhdGUtPmFyZ19jb3VudCkgewotCQkJLyogVGhlcmUgYXJlIGFyZ3VtZW50cyAoY29tcGxleCBvbmVzKSwgcHVzaCBPcCBhbmQgcHJlcGFyZSBmb3IgYXJndW1lbnQgKi8KLQorCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSBhcmd1bWVudHMgKGNvbXBsZXggb25lcyksIHB1c2ggT3AgYW5kCisJCQkgKiBwcmVwYXJlIGZvciBhcmd1bWVudAorCQkJICovCiAJCQlzdGF0dXMgPSBhY3BpX3BzX3B1c2hfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgb3AsCiAJCQkJCSB3YWxrX3N0YXRlLT5hcmdfdHlwZXMsIHdhbGtfc3RhdGUtPmFyZ19jb3VudCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC04MTIsOCArODQ2LDEwIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIEFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAtLSBPcCBpcyBjb21wbGV0ZSwgcHJlcGFyZSBmb3IgbmV4dCAqLwotCisJCS8qCisJCSAqIEFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAtLSBPcCBpcyBjb21wbGV0ZSwKKwkJICogcHJlcGFyZSBmb3IgbmV4dAorCQkgKi8KIAkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKIAkJCWlmIChhY3BpX2dibF9kZXB0aCkgewpAQCAtODgwLDkgKzkxNiw4IEBACiAKIAkJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgogCi0JCQkvKgotCQkJICogV2UgYXJlIGFib3V0IHRvIHRyYW5zZmVyIHRvIGEgY2FsbGVkIG1ldGhvZC4KLQkJCSAqLworCQkJLyogV2UgYXJlIGFib3V0IHRvIHRyYW5zZmVyIHRvIGEgY2FsbGVkIG1ldGhvZC4gKi8KKwogCQkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IG9wOwogCQkJd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5hcmdfdHlwZXM7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMDUxLDEwICsxMDg2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9hbWwKICAqCi0gKiBQQVJBTUVURVJTOiAgc3RhcnRfc2NvcGUgICAgIC0gVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBwYXJzZS4gIEJlY29tZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGFyc2VkIG9wIHRyZWUuCi0gKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBjb2RlIHRvIHBhcnNlCi0gKiAgICAgICAgICAgICAgYW1sX3NpemUgICAgICAgIC0gTGVuZ3RoIG9mIHRoZSBBTUwgdG8gcGFyc2UKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCiAgKgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTEwNzYsOCArMTEwOCwxMCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX3BhcnNlX2FtbCIpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJFbnRlcmVkIHdpdGggd2Fsa19zdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKLQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCisJCSJFbnRlcmVkIHdpdGggd2Fsa19zdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKKwkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKKwkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7CiAKIAogCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB0aHJlYWQgc3RhdGUgKi8KQEAgLTExNDIsOSArMTE3NiwxMCBAQAogCQkJaWYgKChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpICYmCiAJCQkJKCF3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSkpIHsKIAkJCQkvKgotCQkJCSAqIFRoaXMgbWV0aG9kIGlzIG1hcmtlZCBub3Rfc2VyaWFsaXplZCwgYnV0IGl0IHRyaWVkIHRvIGNyZWF0ZSBhIG5hbWVkCi0JCQkJICogb2JqZWN0LCBjYXVzaW5nIHRoZSBzZWNvbmQgdGhyZWFkIGVudHJhbmNlIHRvIGZhaWwuICBXZSB3aWxsIHdvcmthcm91bmQKLQkJCQkgKiB0aGlzIGJ5IG1hcmtpbmcgdGhlIG1ldGhvZCBwZXJtYW5lbnRseSBhcyBTZXJpYWxpemVkLgorCQkJCSAqIFRoaXMgbWV0aG9kIGlzIG1hcmtlZCBub3Rfc2VyaWFsaXplZCwgYnV0IGl0IHRyaWVkIHRvIGNyZWF0ZQorCQkJCSAqIGEgbmFtZWQgb2JqZWN0LCBjYXVzaW5nIHRoZSBzZWNvbmQgdGhyZWFkIGVudHJhbmNlIHRvIGZhaWwuCisJCQkJICogV2Ugd2lsbCB3b3JrYXJvdW5kIHRoaXMgYnkgbWFya2luZyB0aGUgbWV0aG9kIHBlcm1hbmVudGx5CisJCQkJICogYXMgU2VyaWFsaXplZC4KIAkJCQkgKi8KIAkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyB8PSBBTUxfTUVUSE9EX1NFUklBTElaRUQ7CiAJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSA9IDE7CkBAIC0xMTg3LDcgKzEyMjIsOCBAQAogCiAJCXByZXZpb3VzX3dhbGtfc3RhdGUgPSB3YWxrX3N0YXRlOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAicmV0dXJuX3ZhbHVlPSVwLCBpbXBsaWNpdF92YWx1ZT0lcCBTdGF0ZT0lcFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCisJCQkicmV0dXJuX3ZhbHVlPSVwLCBpbXBsaWNpdF92YWx1ZT0lcCBTdGF0ZT0lcFxuIiwKIAkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjLCB3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqLCB3YWxrX3N0YXRlKSk7CiAKIAkJLyogQ2hlY2sgaWYgd2UgaGF2ZSByZXN0YXJ0ZWQgYSBwcmVlbXB0ZWQgd2FsayAqLwpAQCAtMTIzMSwxMiArMTI2NywxNCBAQAogCQkgKi8KIAkJZWxzZSBpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSB7CiAJCQlpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgewotCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9IHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmo7CisJCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0KKwkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iajsKIAkJCX0KIAkJCWVsc2UgewogCQkJCSAvKiBOVUxMIGlmIG5vIHJldHVybiB2YWx1ZSAqLwogCi0JCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0gcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2M7CisJCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0KKwkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2M7CiAJCQl9CiAJCX0KIAkJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCmluZGV4IGRjYmVkNDkuLjhkY2QxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCkBAIC02NSw2ICs2NSw3IEBACiBhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUgKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKKwogCXJldHVybiAocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApOwogfQogCkBAIC04Nyw4ICs4OCwxMCBAQAogYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCiB7Ci0JcmV0dXJuICgodTgpICgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCB8fAotCQkJICAgIXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCkpKTsKKworCXJldHVybiAoKHU4KQorCQkJKChwYXJzZXJfc3RhdGUtPmFtbCA+PSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kIHx8CisJCQkgIXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCkpKTsKIH0KIAogCkBAIC0xNjcsMjMgKzE3MCwyMyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc2NvcGUtPmNvbW1vbi5kYXRhX3R5cGUgICAgICAgID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUFNDT1BFOwotCXNjb3BlLT5wYXJzZV9zY29wZS5vcCAgICAgICAgICA9IG9wOwotCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdCAgICA9IHJlbWFpbmluZ19hcmdzOwotCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgICA9IGFyZ19jb3VudDsKLQlzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZCAgICAgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJc2NvcGUtPmNvbW1vbi5kYXRhX3R5cGUgICAgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QU0NPUEU7CisJc2NvcGUtPnBhcnNlX3Njb3BlLm9wICAgICAgPSBvcDsKKwlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgPSByZW1haW5pbmdfYXJnczsKKwlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ID0gYXJnX2NvdW50OworCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwogCiAJLyogUHVzaCBvbnRvIHNjb3BlIHN0YWNrICovCiAKIAlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoJnBhcnNlcl9zdGF0ZS0+c2NvcGUsIHNjb3BlKTsKIAogCWlmIChhcmdfY291bnQgPT0gQUNQSV9WQVJfQVJHUykgewotCQkvKiBtdWx0aXBsZSBhcmd1bWVudHMgKi8KKwkJLyogTXVsdGlwbGUgYXJndW1lbnRzICovCiAKIAkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CiAJfQogCWVsc2UgewotCQkvKiBzaW5nbGUgYXJndW1lbnQgKi8KKwkJLyogU2luZ2xlIGFyZ3VtZW50ICovCiAKIAkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBBQ1BJX1RPX1BPSU5URVIgKEFDUElfTUFYX1BUUik7CiAJfQpAQCAtMjIxLDE4ICsyMjQsMTcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfcG9wX3Njb3BlIik7CiAKIAotCS8qCi0JICogT25seSBwb3AgdGhlIHNjb3BlIGlmIHRoZXJlIGlzIGluIGZhY3QgYSBuZXh0IHNjb3BlCi0JICovCisJLyogT25seSBwb3AgdGhlIHNjb3BlIGlmIHRoZXJlIGlzIGluIGZhY3QgYSBuZXh0IHNjb3BlICovCisKIAlpZiAoc2NvcGUtPmNvbW1vbi5uZXh0KSB7CiAJCXNjb3BlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOwogCiAJCS8qIHJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCiAKLQkJKm9wICAgICAgICAgICAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUub3A7Ci0JCSphcmdfbGlzdCAgICAgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0OwotCQkqYXJnX2NvdW50ICAgICAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQ7Ci0JCXBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQ7CisJCSpvcCAgICAgICAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUub3A7CisJCSphcmdfbGlzdCAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3Q7CisJCSphcmdfY291bnQgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OworCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPSBzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZDsKIAogCQkvKiBBbGwgZG9uZSB3aXRoIHRoaXMgc2NvcGUgc3RhdGUgc3RydWN0dXJlICovCiAKQEAgLTI0MSwxMiArMjQzLDEzIEBACiAJZWxzZSB7CiAJCS8qIGVtcHR5IHBhcnNlIHN0YWNrLCBwcmVwYXJlIHRvIGZldGNoIG5leHQgb3Bjb2RlICovCiAKLQkJKm9wICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotCQkqYXJnX2xpc3QgICAgICAgICAgICAgICA9IDA7Ci0JCSphcmdfY291bnQgICAgICAgICAgICAgID0gMDsKKwkJKm9wICAgICAgID0gTlVMTDsKKwkJKmFyZ19saXN0ID0gMDsKKwkJKmFyZ19jb3VudCA9IDA7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJQb3BwZWQgT3AgJXAgQXJncyAlWFxuIiwgKm9wLCAqYXJnX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCisJCSJQb3BwZWQgT3AgJXAgQXJncyAlWFxuIiwgKm9wLCAqYXJnX2NvdW50KSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKQEAgLTI1Nyw3ICsyNjAsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogRGVzdHJveSBhdmFpbGFibGUgbGlzdCwgcmVtYWluaW5nIHN0YWNrIGxldmVscywgYW5kIHJldHVybgogICogICAgICAgICAgICAgIHJvb3Qgc2NvcGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCmluZGV4IDIxNDBiZDEuLmQ1YWFmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwpAQCAtNDksNiArNDksMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHN0cmVlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKK2FjcGlfcHNfZ2V0X2NoaWxkICgKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CisjZW5kaWYKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU3LDcgKzY1LDcgQEAKICAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBHZXQgYW4gYXJndW1lbnQgZm9yIHRoaXMgb3AKICAqICAgICAgICAgICAgICBBcmduICAgICAgICAgICAgLSBOdGggYXJndW1lbnQgdG8gZ2V0CiAgKgotICogUkVUVVJOOiAgICAgIFRoZSBhcmd1bWVudCAoYXMgYW4gT3Agb2JqZWN0KS4gIE5VTEwgaWYgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QKKyAqIFJFVFVSTjogICAgICBUaGUgYXJndW1lbnQgKGFzIGFuIE9wIG9iamVjdCkuIE5VTEwgaWYgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QKICAqCiAgKiBERVNDUklQVElPTjogR2V0IHRoZSBzcGVjaWZpZWQgb3AncyBhcmd1bWVudC4KICAqCkBAIC0xNTIsNyArMTYwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCiAJLyogQXBwZW5kIHRoZSBhcmd1bWVudCB0byB0aGUgbGlua2VkIGFyZ3VtZW50IGxpc3QgKi8KIAogCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgewpAQCAtMTY0LDE0ICsxNzEsMTIgQEAKIAkJfQogCQlwcmV2X2FyZy0+Y29tbW9uLm5leHQgPSBhcmc7CiAJfQotCiAJZWxzZSB7CiAJCS8qIE5vIGFyZ3VtZW50IGxpc3QsIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KIAogCQlvcC0+Y29tbW9uLnZhbHVlLmFyZyA9IGFyZzsKIAl9CiAKLQogCS8qIFNldCB0aGUgcGFyZW50IGluIHRoaXMgYXJnIGFuZCBhbnkgYXJncyBsaW5rZWQgYWZ0ZXIgaXQgKi8KIAogCXdoaWxlIChhcmcpIHsKQEAgLTE4Miw3ICsxODcsODIgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2RlcHRoX25leHQKKyAqCisgKiBQQVJBTUVURVJTOiAgT3JpZ2luICAgICAgICAgIC0gUm9vdCBvZiBzdWJ0cmVlIHRvIHNlYXJjaAorICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIExhc3QgKHByZXZpb3VzKSBPcCB0aGF0IHdhcyBmb3VuZAorICoKKyAqIFJFVFVSTjogICAgICBOZXh0IE9wIGZvdW5kIGluIHRoZSBzZWFyY2guCisgKgorICogREVTQ1JJUFRJT046IEdldCBuZXh0IG9wIGluIHRyZWUgKHdhbGtpbmcgdGhlIHRyZWUgaW4gZGVwdGgtZmlyc3Qgb3JkZXIpCisgKiAgICAgICAgICAgICAgUmV0dXJuIE5VTEwgd2hlbiByZWFjaGluZyAib3JpZ2luIiBvciB3aGVuIHdhbGtpbmcgdXAgZnJvbSByb290CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgorYWNwaV9wc19nZXRfZGVwdGhfbmV4dCAoCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3JpZ2luLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7CisKKworCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisKKworCWlmICghb3ApIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBMb29rIGZvciBhbiBhcmd1bWVudCBvciBjaGlsZCAqLworCisJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDApOworCWlmIChuZXh0KSB7CisJCXJldHVybiAobmV4dCk7CisJfQorCisJLyogTG9vayBmb3IgYSBzaWJsaW5nICovCisKKwluZXh0ID0gb3AtPmNvbW1vbi5uZXh0OworCWlmIChuZXh0KSB7CisJCXJldHVybiAobmV4dCk7CisJfQorCisJLyogTG9vayBmb3IgYSBzaWJsaW5nIG9mIHBhcmVudCAqLworCisJcGFyZW50ID0gb3AtPmNvbW1vbi5wYXJlbnQ7CisKKwl3aGlsZSAocGFyZW50KSB7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyAocGFyZW50LCAwKTsKKwkJd2hpbGUgKGFyZyAmJiAoYXJnICE9IG9yaWdpbikgJiYgKGFyZyAhPSBvcCkpIHsKKwkJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJCX0KKworCQlpZiAoYXJnID09IG9yaWdpbikgeworCQkJLyogUmVhY2hlZCBwYXJlbnQgb2Ygb3JpZ2luLCBlbmQgc2VhcmNoICovCisKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKworCQlpZiAocGFyZW50LT5jb21tb24ubmV4dCkgeworCQkJLyogRm91bmQgc2libGluZyBvZiBwYXJlbnQgKi8KKworCQkJcmV0dXJuIChwYXJlbnQtPmNvbW1vbi5uZXh0KTsKKwkJfQorCisJCW9wID0gcGFyZW50OworCQlwYXJlbnQgPSBwYXJlbnQtPmNvbW1vbi5wYXJlbnQ7CisJfQorCisJcmV0dXJuIChuZXh0KTsKK30KKworCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2NoaWxkCkBAIC0xOTQsNiArMjc0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgb3AncyBjaGlsZHJlbiBvciBOVUxMIGlmIG5vbmUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCiBhY3BpX3BzX2dldF9jaGlsZCAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCkBAIC0yNDcsODEgKzMyOCw3IEBACiAKIAlyZXR1cm4gKGNoaWxkKTsKIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9kZXB0aF9uZXh0Ci0gKgotICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBzZWFyY2gKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBMYXN0IChwcmV2aW91cykgT3AgdGhhdCB3YXMgZm91bmQKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV4dCBPcCBmb3VuZCBpbiB0aGUgc2VhcmNoLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBvcCBpbiB0cmVlICh3YWxraW5nIHRoZSB0cmVlIGluIGRlcHRoLWZpcnN0IG9yZGVyKQotICogICAgICAgICAgICAgIFJldHVybiBOVUxMIHdoZW4gcmVhY2hpbmcgIm9yaWdpbiIgb3Igd2hlbiB3YWxraW5nIHVwIGZyb20gcm9vdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2RlcHRoX25leHQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0ID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJlbnQ7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlpZiAoIW9wKSB7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogbG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgKi8KLQotCW5leHQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKLQlpZiAobmV4dCkgewotCQlyZXR1cm4gKG5leHQpOwotCX0KLQotCS8qIGxvb2sgZm9yIGEgc2libGluZyAqLwotCi0JbmV4dCA9IG9wLT5jb21tb24ubmV4dDsKLQlpZiAobmV4dCkgewotCQlyZXR1cm4gKG5leHQpOwotCX0KLQotCS8qIGxvb2sgZm9yIGEgc2libGluZyBvZiBwYXJlbnQgKi8KLQotCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwotCi0Jd2hpbGUgKHBhcmVudCkgewotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKHBhcmVudCwgMCk7Ci0JCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7Ci0JCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBvcmlnaW4pIHsKLQkJCS8qIHJlYWNoZWQgcGFyZW50IG9mIG9yaWdpbiwgZW5kIHNlYXJjaCAqLwotCi0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0KLQkJaWYgKHBhcmVudC0+Y29tbW9uLm5leHQpIHsKLQkJCS8qIGZvdW5kIHNpYmxpbmcgb2YgcGFyZW50ICovCi0KLQkJCXJldHVybiAocGFyZW50LT5jb21tb24ubmV4dCk7Ci0JCX0KLQotCQlvcCA9IHBhcmVudDsKLQkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OwotCX0KLQotCXJldHVybiAobmV4dCk7Ci19CisjZW5kaWYKIAogI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKaW5kZXggYjM1OTdjYi4uYTEwZjg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzdXRpbHMiKQpAQCAtNTcsNyArNTYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIHNjb3BlX29wCisgKiBSRVRVUk46ICAgICAgQSBuZXcgU2NvcGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgU2NvcGUgYW5kIGFzc29jaWF0ZWQgbmFtZXBhdGggb3Agd2l0aCB0aGUgcm9vdCBuYW1lCiAgKgpAQCAtNzUsNyArNzQsNiBAQAogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCiAJc2NvcGVfb3AtPm5hbWVkLm5hbWUgPSBBQ1BJX1JPT1RfTkFNRTsKIAlyZXR1cm4gKHNjb3BlX29wKTsKIH0KQEAgLTg4LDEwICs4Niw5IEBACiAgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gQSBuZXdseSBhbGxvY2F0ZWQgT3Agb2JqZWN0CiAgKiAgICAgICAgICAgICAgT3Bjb2RlICAgICAgICAgIC0gT3Bjb2RlIHRvIHN0b3JlIGluIHRoZSBPcAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuIGFjcGlfb3AsIGNob29zZSBvcCB0eXBlIChhbmQgdGh1cyBzaXplKSBiYXNlZCBvbgotICogICAgICAgICAgICAgIG9wY29kZQorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYSBwYXJzZSAoT3ApIG9iamVjdAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEwNyw3ICsxMDQsOCBAQAogCW9wLT5jb21tb24uYW1sX29wY29kZSA9IG9wY29kZTsKIAogCUFDUElfRElTQVNNX09OTFlfTUVNQkVSUyAoQUNQSV9TVFJOQ1BZIChvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLAotCQkJKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpKS0+bmFtZSwgc2l6ZW9mIChvcC0+Y29tbW9uLmFtbF9vcF9uYW1lKSkpOworCQkJKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpKS0+bmFtZSwKKwkJCQlzaXplb2YgKG9wLT5jb21tb24uYW1sX29wX25hbWUpKSk7CiB9CiAKIApAQCAtMTE3LDcgKzExNSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAtIE9wY29kZSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBuZXcgT3AKICAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgbmV3IE9wLgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIG5ldyBPcCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuIGFjcGlfb3AsIGNob29zZSBvcCB0eXBlIChhbmQgdGh1cyBzaXplKSBiYXNlZCBvbgogICogICAgICAgICAgICAgIG9wY29kZS4gIEEgY2FjaGUgb2Ygb3Bjb2RlcyBpcyBhdmFpbGFibGUgZm9yIHRoZSBwdXJlCkBAIC0yNzUsNyArMjczLDYgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKIHsKIAotCiAJLyogVGhlICJnZW5lcmljIiBvYmplY3QgaGFzIG5vIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0ICovCiAKIAlpZiAob3AtPmNvbW1vbi5mbGFncyAmIEFDUElfUEFSU0VPUF9HRU5FUklDKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYwppbmRleCAxMTBkMmNlLi45ZDIwY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKQEAgLTkwLDE3ICs5MCwxNSBAQAogCQkJfQogCQl9CiAKLQkJLyoKLQkJICogTm8gbW9yZSBjaGlsZHJlbiwgdGhpcyBPcCBpcyBjb21wbGV0ZS4KLQkJICovCisJCS8qIE5vIG1vcmUgY2hpbGRyZW4sIHRoaXMgT3AgaXMgY29tcGxldGUuICovCisKIAkJbmV4dCA9IG9wLT5jb21tb24ubmV4dDsKIAkJcGFyZW50ID0gb3AtPmNvbW1vbi5wYXJlbnQ7CiAKIAkJYWNwaV9wc19mcmVlX29wIChvcCk7CiAKLQkJLyoKLQkJICogSWYgd2UgYXJlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHBvaW50LCB0aGUgd2FsayBpcyBjb21wbGV0ZS4KLQkJICovCisJCS8qIElmIHdlIGFyZSBiYWNrIHRvIHRoZSBzdGFydGluZyBwb2ludCwgdGhlIHdhbGsgaXMgY29tcGxldGUuICovCisKIAkJaWYgKG9wID09IHN1YnRyZWVfcm9vdCkgewogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KQEAgLTExMSw1ICsxMDksNiBAQAogCQkJb3AgPSBwYXJlbnQ7CiAJCX0KIAl9CisKIAlyZXR1cm5fVk9JRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKaW5kZXggYjMxOGFkMi4uZGJhODkzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKQEAgLTU3LDEzICs1NywxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzeF9leGVjdXRlCiAgKgotICogUEFSQU1FVEVSUzogIEluZm8tPk5vZGUgICAgICAgICAgLSBBIG1ldGhvZCBvYmplY3QgY29udGFpbmluZyBib3RoIHRoZSBBTUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgbGVuZ3RoLgotICogICAgICAgICAgICAgICoqUGFyYW1zICAgICAgICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBtZXRob2QsCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fb2JqX2Rlc2MgICAtIFJldHVybiBvYmplY3QgZnJvbSBleGVjdXRpb24gb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC4KKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE5Niw5ICsxOTksOCBAQAogCQlnb3RvIGNsZWFudXAzOwogCX0KIAotCS8qCi0JICogVGhlIHdhbGsgb2YgdGhlIHBhcnNlIHRyZWUgaXMgd2hlcmUgd2UgYWN0dWFsbHkgZXhlY3V0ZSB0aGUgbWV0aG9kCi0JICovCisJLyogVGhlIHdhbGsgb2YgdGhlIHBhcnNlIHRyZWUgaXMgd2hlcmUgd2UgYWN0dWFsbHkgZXhlY3V0ZSB0aGUgbWV0aG9kICovCisKIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7CiAJZ290byBjbGVhbnVwMjsgLyogV2FsayBzdGF0ZSBhbHJlYWR5IGRlbGV0ZWQgKi8KIApAQCAtMjE3LDcgKzIxOSw4IEBACiAJCWZvciAoaSA9IDA7IGluZm8tPnBhcmFtZXRlcnNbaV07IGkrKykgewogCQkJLyogSWdub3JlIGVycm9ycywganVzdCBkbyB0aGVtIGFsbCAqLwogCi0JCQkodm9pZCkgYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSAoaW5mby0+cGFyYW1ldGVyc1tpXSwgUkVGX0RFQ1JFTUVOVCk7CisJCQkodm9pZCkgYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSAoCisJCQkJCSBpbmZvLT5wYXJhbWV0ZXJzW2ldLCBSRUZfREVDUkVNRU5UKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwppbmRleCA1ZDE5YjM5Li41MTQ4ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwpAQCAtNjEsMTUgKzYxLDE0IEBACiAKIAogLyoqCi0gKiBhY3BpX29zX2dldF9wY2lfaWQKKyAqIGFjcGlfZ2V0X3BjaV9pZAogICogLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIEFDUEkgSW50ZXJwcmV0ZXIgKGEuay5hLiBDb3JlIFN1YnN5c3RlbSkKICAqIHRvIHJlc29sdmUgUENJIGluZm9ybWF0aW9uIGZvciBBQ1BJLVBDSSBkZXZpY2VzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZS4KICAqIFRoaXMgdHlwaWNhbGx5IG9jY3VycyB3aGVuIHJlc29sdmluZyBQQ0kgb3BlcmF0aW9uIHJlZ2lvbiBpbmZvcm1hdGlvbi4KICAqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9vc19nZXRfcGNpX2lkICgKK2FjcGlfZ2V0X3BjaV9pZCAoCiAJYWNwaV9oYW5kbGUJCWhhbmRsZSwKIAlzdHJ1Y3QgYWNwaV9wY2lfaWQJKmlkKQogewpAQCAtNzgsNyArNzcsNyBAQAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9wY2lfZGF0YQkqZGF0YSA9IE5VTEw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX29zX2dldF9wY2lfaWQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9wY2lfaWQiKTsKIAogCWlmICghaWQpCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTkyLDcgKzkxLDcgQEAKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9kYXRhKGhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCAodm9pZCoqKSAmZGF0YSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICFkYXRhIHx8ICFkYXRhLT5kZXYpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWRhdGEpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCiAJCQkiSW52YWxpZCBBQ1BJLVBDSSBjb250ZXh0IGZvciBkZXZpY2UgJXNcbiIsCiAJCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwpAQCAtMTE1LDcgKzExNCw3IEBACiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3BjaV9pZCk7CiAKIAkKIGludApAQCAtMTI5LDYgKzEyOCw4IEBACiAJY2hhcgkJCSpwYXRobmFtZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHswLCBOVUxMfTsKIAlhY3BpX2hhbmRsZQkJaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldgkJKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAJCSpidXM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9iaW5kIik7CiAKQEAgLTE5Myw4ICsxOTQsMjAgQEAKIAkgKiBMb2NhdGUgbWF0Y2hpbmcgZGV2aWNlIGluIFBDSSBuYW1lc3BhY2UuICBJZiBpdCBkb2Vzbid0IGV4aXN0CiAJICogdGhpcyB0eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzbid0IGN1cnJlbnRseSBpbnNlcnRlZAogCSAqIChlLmcuIGRvY2tpbmcgc3RhdGlvbiwgcG9ydCByZXBsaWNhdG9yLCBldGMuKS4KKwkgKiBXZSBjYW5ub3Qgc2ltcGx5IHNlYXJjaCB0aGUgZ2xvYmFsIHBjaSBkZXZpY2UgbGlzdCwgc2luY2UKKwkgKiBQQ0kgZGV2aWNlcyBhcmUgYWRkZWQgdG8gdGhlIGdsb2JhbCBwY2kgbGlzdCB3aGVuIHRoZSByb290CisJICogYnJpZGdlIHN0YXJ0IG9wcyBhcmUgcnVuLCB3aGljaCBtYXkgbm90IGhhdmUgaGFwcGVuZWQgeWV0LgogCSAqLwotCWRhdGEtPmRldiA9IHBjaV9maW5kX3Nsb3QoZGF0YS0+aWQuYnVzLCBQQ0lfREVWRk4oZGF0YS0+aWQuZGV2aWNlLCBkYXRhLT5pZC5mdW5jdGlvbikpOworCWJ1cyA9IHBjaV9maW5kX2J1cyhkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMpOworCWlmIChidXMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCQlpZiAoZGV2LT5kZXZmbiA9PSBQQ0lfREVWRk4oZGF0YS0+aWQuZGV2aWNlLAorCQkJCQkJZGF0YS0+aWQuZnVuY3Rpb24pKSB7CisJCQkJZGF0YS0+ZGV2ID0gZGV2OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCWlmICghZGF0YS0+ZGV2KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCiAJCQkiRGV2aWNlICUwMng6JTAyeDolMDJ4LiUwMnggbm90IHByZXNlbnQgaW4gUENJIG5hbWVzcGFjZVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IDhkYmY4MDIuLmQxZjQyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJQQ0kgSW50ZXJydXB0ICVzWyVjXTogbm8gR1NJIiwKIAkJCXBjaV9uYW1lKGRldiksICgnQScgKyBwaW4pKTsKIAkJLyogSW50ZXJydXB0IExpbmUgdmFsdWVzIGFib3ZlIDB4RiBhcmUgZm9yYmlkZGVuICovCi0JCWlmIChkZXYtPmlycSA+PSAwICYmIChkZXYtPmlycSA8PSAweEYpKSB7CisJCWlmIChkZXYtPmlycSA+IDAgJiYgKGRldi0+aXJxIDw9IDB4RikpIHsKIAkJCXByaW50aygiIC0gdXNpbmcgSVJRICVkXG4iLCBkZXYtPmlycSk7CiAJCQlhY3BpX3JlZ2lzdGVyX2dzaShkZXYtPmlycSwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsIEFDUElfQUNUSVZFX0xPVyk7CiAJCQlyZXR1cm5fVkFMVUUoMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDUyMGIyOGEuLjZhZDBlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC03MiwxMCArNzIsMTIgQEAKIAl1OAkJCWFjdGl2ZTsJCQkvKiBDdXJyZW50IElSUSAqLwogCXU4CQkJZWRnZV9sZXZlbDsJCS8qIEFsbCBJUlFzICovCiAJdTgJCQlhY3RpdmVfaGlnaF9sb3c7CS8qIEFsbCBJUlFzICovCi0JdTgJCQlpbml0aWFsaXplZDsKIAl1OAkJCXJlc291cmNlX3R5cGU7CiAJdTgJCQlwb3NzaWJsZV9jb3VudDsKIAl1OAkJCXBvc3NpYmxlW0FDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFXTsKKwl1OAkJCWluaXRpYWxpemVkOjE7CisJdTgJCQlzdXNwZW5kX3Jlc3VtZToxOworCXU4CQkJcmVzZXJ2ZWQ6NjsKIH07CiAKIHN0cnVjdCBhY3BpX3BjaV9saW5rIHsKQEAgLTUzMCw2ICs1MzIsMTAgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfYWxsb2NhdGUiKTsKIAorCWlmIChsaW5rLT5pcnEuc3VzcGVuZF9yZXN1bWUpIHsKKwkJYWNwaV9wY2lfbGlua19zZXQobGluaywgbGluay0+aXJxLmFjdGl2ZSk7CisJCWxpbmstPmlycS5zdXNwZW5kX3Jlc3VtZSA9IDA7CisJfQogCWlmIChsaW5rLT5pcnEuaW5pdGlhbGl6ZWQpCiAJCXJldHVybl9WQUxVRSgwKTsKIApAQCAtNzEzLDM4ICs3MTksMjQgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiBzdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX3Jlc3VtZSAoCi0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmspCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19yZXN1bWUiKTsKLQkKLQlpZiAobGluay0+aXJxLmFjdGl2ZSAmJiBsaW5rLT5pcnEuaW5pdGlhbGl6ZWQpCi0JCXJldHVybl9WQUxVRShhY3BpX3BjaV9saW5rX3NldChsaW5rLCBsaW5rLT5pcnEuYWN0aXZlKSk7Ci0JZWxzZQotCQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLQotc3RhdGljIGludAotaXJxcm91dGVyX3Jlc3VtZSgKLQlzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoraXJxcm91dGVyX3N1c3BlbmQoCisJc3RydWN0IHN5c19kZXZpY2UgKmRldiwKKwl1MzIJc3RhdGUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKm5vZGUgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3BjaV9saW5rICAgICpsaW5rID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImlycXJvdXRlcl9yZXN1bWUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpcnFyb3V0ZXJfc3VzcGVuZCIpOwogCiAJbGlzdF9mb3JfZWFjaChub2RlLCAmYWNwaV9saW5rLmVudHJpZXMpIHsKLQogCQlsaW5rID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9wY2lfbGluaywgbm9kZSk7CiAJCWlmICghbGluaykgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgbGluayBjb250ZXh0XG4iKSk7CiAJCQljb250aW51ZTsKIAkJfQotCi0JCWFjcGlfcGNpX2xpbmtfcmVzdW1lKGxpbmspOworCQlpZiAobGluay0+aXJxLmFjdGl2ZSAmJiBsaW5rLT5pcnEuaW5pdGlhbGl6ZWQpCisJCQlsaW5rLT5pcnEuc3VzcGVuZF9yZXN1bWUgPSAxOwogCX0KIAlyZXR1cm5fVkFMVUUoMCk7CiB9CkBAIC04MTIsOSArODA0LDEyIEBACiAgKiBUaGVyZSBpcyBubyBJU0FfUE9TU0lCTEUgd2VpZ2h0LCBzbyB3ZSBzaW1wbHkgdXNlCiAgKiB0aGUgKHNtYWxsKSBQQ0lfVVNJTkcgcGVuYWx0eS4KICAqLwotdm9pZCBhY3BpX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3ZvaWQgYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7Ci0JYWNwaV9pcnFfcGVuYWx0eVtpcnFdICs9IFBJUlFfUEVOQUxUWV9QQ0lfVVNJTkc7CisJaWYgKGFjdGl2ZSkKKwkJYWNwaV9pcnFfcGVuYWx0eVtpcnFdICs9IFBJUlFfUEVOQUxUWV9JU0FfVVNFRDsKKwllbHNlCisJCWFjcGlfaXJxX3BlbmFsdHlbaXJxXSArPSBQSVJRX1BFTkFMVFlfUENJX1VTSU5HOwogfQogCiAvKgpAQCAtODU2LDcgKzg1MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGlycXJvdXRlcl9zeXNkZXZfY2xhc3MgPSB7CiAgICAgICAgIHNldF9rc2V0X25hbWUoImlycXJvdXRlciIpLAotICAgICAgICAucmVzdW1lID0gaXJxcm91dGVyX3Jlc3VtZSwKKyAgICAgICAgLnN1c3BlbmQgPSBpcnFyb3V0ZXJfc3VzcGVuZCwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCA3ZTZiOGUzLi41ZDJmNzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtNDYsNiArNDYsNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3BjaV9yb290X3N0YXJ0IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wY2lfcm9vdF9kcml2ZXIgPSB7CiAJLm5hbWUgPQkJQUNQSV9QQ0lfUk9PVF9EUklWRVJfTkFNRSwKQEAgLTU0LDYgKzU1LDcgQEAKIAkub3BzID0JCXsKIAkJCQkuYWRkID0gICAgYWNwaV9wY2lfcm9vdF9hZGQsCiAJCQkJLnJlbW92ZSA9IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlLAorCQkJCS5zdGFydCA9ICBhY3BpX3BjaV9yb290X3N0YXJ0LAogCQkJfSwKIH07CiAKQEAgLTE2OSw2ICsxNzEsNyBAQAogCWlmICghcm9vdCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCW1lbXNldChyb290LCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3Jvb3QpKTsKKwlJTklUX0xJU1RfSEVBRCgmcm9vdC0+bm9kZSk7CiAKIAlyb290LT5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX1BDSV9ST09UX0RFVklDRV9OQU1FKTsKQEAgLTI5OCwxMiArMzAxLDMxIEBACiAJCQlyb290LT5pZC5idXMpOwogCiBlbmQ6Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CisJCWlmICghbGlzdF9lbXB0eSgmcm9vdC0+bm9kZSkpCisJCQlsaXN0X2RlbCgmcm9vdC0+bm9kZSk7CiAJCWtmcmVlKHJvb3QpOworCX0KIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCitzdGF0aWMgaW50CithY3BpX3BjaV9yb290X3N0YXJ0ICgKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3sKKwlzdHJ1Y3QgYWNwaV9wY2lfcm9vdAkqcm9vdDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX3Jvb3Rfc3RhcnQiKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocm9vdCwgJmFjcGlfcGNpX3Jvb3RzLCBub2RlKSB7CisJCWlmIChyb290LT5oYW5kbGUgPT0gZGV2aWNlLT5oYW5kbGUpIHsKKwkJCXBjaV9idXNfYWRkX2RldmljZXMocm9vdC0+YnVzKTsKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJfQorCX0KKwlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Cit9CiAKIHN0YXRpYyBpbnQKIGFjcGlfcGNpX3Jvb3RfcmVtb3ZlICgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKaW5kZXggZjQ3Nzg3NC4uZDU2YTQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKQEAgLTI1Niw2ICsyNTYsNDMgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uIEFDUEkgcHJvY2Vzc29yIGZ1Y250aW9ucworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIF9QREMgaXMgcmVxdWlyZWQgZm9yIGEgQklPUy1PUyBoYW5kc2hha2UgZm9yIG1vc3Qgb2YgdGhlIG5ld2VyCisgKiBBQ1BJIHByb2Nlc3NvciBmZWF0dXJlcy4KKyAqLworCitpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pCit7CisJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCXUzMgkJCWFyZzBfYnVmWzNdOworCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJbm9fb2JqZWN0ID0gezEsICZhcmcwfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAkqcGRjOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyIpOworCisJYXJnMC5idWZmZXIubGVuZ3RoID0gMTI7CisJYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKKwlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWFyZzBfYnVmWzFdID0gMDsKKwlhcmcwX2J1ZlsyXSA9IDA7CisKKwlwZGMgPSAocGRjX2luKSA/IHBkY19pbiA6ICZub19vYmplY3Q7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX1BEQyIsIHBkYywgTlVMTCk7CisKKwlpZiAoKEFDUElfRkFJTFVSRShzdGF0dXMpKSAmJiAocGRjX2luKSkKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXJyb3IgZXZhbHVhdGluZyBfUERDLCB1c2luZyBsZWdhY3kgcGVyZi4gY29udHJvbC4uLlxuIikpOworCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC03MjMsNyArNzYwLDcgQEAKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCWFjcGlfYnVzX3NjYW4oKmRldmljZSk7CisJYWNwaV9idXNfc3RhcnQoKmRldmljZSk7CiAKIAlwciA9IGFjcGlfZHJpdmVyX2RhdGEoKmRldmljZSk7CiAJaWYgKCFwcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggYzlkNjcxYy4uODkzYjA3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTYsNiArNiw4IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0ICAgICAgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgIEFuaWwgUyBLZXNoYXZhbXVydGh5IDxhbmlsLnMua2VzaGF2YW11cnRoeUBpbnRlbC5jb20+CiAgKiAgCQkJLSBBZGRlZCBwcm9jZXNzb3IgaG90cGx1ZyBzdXBwb3J0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqICAJCQktIEFkZGVkIHN1cHBvcnQgZm9yIEMzIG9uIFNNUAogICoKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKgpAQCAtMTQyLDcgKzE0NCw3IEBACiAJCXN3aXRjaCAob2xkLT50eXBlKSB7CiAJCWNhc2UgQUNQSV9TVEFURV9DMzoKIAkJCS8qIERpc2FibGUgYnVzIG1hc3RlciByZWxvYWQgKi8KLQkJCWlmIChuZXctPnR5cGUgIT0gQUNQSV9TVEFURV9DMykKKwkJCWlmIChuZXctPnR5cGUgIT0gQUNQSV9TVEFURV9DMyAmJiBwci0+ZmxhZ3MuYm1fY2hlY2spCiAJCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNTIsNyArMTU0LDcgQEAKIAlzd2l0Y2ggKG5ldy0+dHlwZSkgewogCWNhc2UgQUNQSV9TVEFURV9DMzoKIAkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgcmVsb2FkICovCi0JCWlmIChvbGQtPnR5cGUgIT0gQUNQSV9TVEFURV9DMykKKwkJaWYgKG9sZC0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzICYmIHByLT5mbGFncy5ibV9jaGVjaykKIAkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWJyZWFrOwogCX0KQEAgLTE2Myw2ICsxNjUsOSBAQAogfQogCiAKK3N0YXRpYyBhdG9taWNfdCAJYzNfY3B1X2NvdW50OworCisKIHN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX2lkbGUgKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IE5VTEw7CkBAIC0yOTcsOCArMzAyLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1NUQVRFX0MzOgotCQkvKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KLQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCisJCWlmIChwci0+ZmxhZ3MuYm1fY2hlY2spIHsKKwkJCWlmIChhdG9taWNfaW5jX3JldHVybigmYzNfY3B1X2NvdW50KSA9PQorCQkJCQludW1fb25saW5lX2NwdXMoKSkgeworCQkJCS8qCisJCQkJICogQWxsIENQVXMgYXJlIHRyeWluZyB0byBnbyB0byBDMworCQkJCSAqIERpc2FibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbgorCQkJCSAqLworCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAxLAorCQkJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTTVAgd2l0aCBubyBzaGFyZWQgY2FjaGUuLi4gSW52YWxpZGF0ZSBjYWNoZSAgKi8KKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCX0KKwkJCiAJCS8qIEdldCBzdGFydCB0aW1lICh0aWNrcykgKi8KIAkJdDEgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOwogCQkvKiBJbnZva2UgQzMgKi8KQEAgLTMwNyw4ICszMjYsMTIgQEAKIAkJdDIgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOwogCQkvKiBHZXQgZW5kIHRpbWUgKHRpY2tzKSAqLwogCQl0MiA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7Ci0JCS8qIEVuYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCi0JCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCWlmIChwci0+ZmxhZ3MuYm1fY2hlY2spIHsKKwkJCS8qIEVuYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCisJCQlhdG9taWNfZGVjKCZjM19jcHVfY291bnQpOworCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJfQorCiAJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwpAQCAtNTE5LDYgKzU0MiwyOSBAQAogfQogCiAKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3sKKwlpbnQgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEiKTsKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykKKwkJbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3gpKTsKKworCS8qIGlmIGluZm8gaXMgb2J0YWluZWQgZnJvbSBwYmxrL2ZhZHQsIHR5cGUgZXF1YWxzIHN0YXRlICovCisJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS50eXBlID0gQUNQSV9TVEFURV9DMTsKKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzJdLnR5cGUgPSBBQ1BJX1NUQVRFX0MyOworCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DM10udHlwZSA9IEFDUElfU1RBVEVfQzM7CisKKwkvKiB0aGUgQzAgc3RhdGUgb25seSBleGlzdHMgYXMgYSBmaWxsZXIgaW4gb3VyIGFycmF5LAorCSAqIGFuZCBhbGwgcHJvY2Vzc29ycyBuZWVkIHRvIHN1cHBvcnQgQzEgKi8KKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzBdLnZhbGlkID0gMTsKKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkID0gMTsKKworCXJldHVybl9WQUxVRSgwKTsKK30KKworCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2NzdCAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKQEAgLTUyOSw5ICs1NzUsNiBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fY3N0Iik7CiAKLQlpZiAoZXJyYXRhLnNtcCkKLQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCiAJaWYgKG5vY3N0KQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKQEAgLTY2NCwxMyArNzA3LDYgQEAKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JLyogV2UncmUgKGN1cnJlbnRseSkgb25seSBzdXBwb3J0aW5nIEMyIG9uIFVQICovCi0JZWxzZSBpZiAoZXJyYXRhLnNtcCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiQzIgbm90IHN1cHBvcnRlZCBpbiBTTVAgbW9kZVxuIikpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KIAkvKgogCSAqIE90aGVyd2lzZSB3ZSd2ZSBtZXQgYWxsIG9mIG91ciBDMiByZXF1aXJlbWVudHMuCiAJICogTm9ybWFsaXplIHRoZSBDMiBsYXRlbmN5IHRvIGV4cGlkaXRlIHBvbGljeQpAQCAtNjg2LDYgKzcyMiw4IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQogeworCXN0YXRpYyBpbnQgYm1fY2hlY2tfZmxhZzsKKwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl92ZXJpZnlfYzMiKTsKIAogCWlmICghY3gtPmFkZHJlc3MpCkBAIC03MDIsMjAgKzc0MCw2IEBACiAJCXJldHVybl9WT0lEOwogCX0KIAotCS8qIGJ1cyBtYXN0ZXJpbmcgY29udHJvbCBpcyBuZWNlc3NhcnkgKi8KLQllbHNlIGlmICghcHItPmZsYWdzLmJtX2NvbnRyb2wpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkMzIHN1cHBvcnQgcmVxdWlyZXMgYnVzIG1hc3RlcmluZyBjb250cm9sXG4iKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIFdlJ3JlIChjdXJyZW50bHkpIG9ubHkgc3VwcG9ydGluZyBDMiBvbiBVUCAqLwotCWVsc2UgaWYgKGVycmF0YS5zbXApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkMzIG5vdCBzdXBwb3J0ZWQgaW4gU01QIG1vZGVcbiIpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCiAJLyoKIAkgKiBQSUlYNCBFcnJhdHVtICMxODogV2UgZG9uJ3Qgc3VwcG9ydCBDMyB3aGVuIFR5cGUtRiAoZmFzdCkKIAkgKiBETUEgdHJhbnNmZXJzIGFyZSB1c2VkIGJ5IGFueSBJU0EgZGV2aWNlIHRvIGF2b2lkIGxpdmVsb2NrLgpAQCAtNzI5LDYgKzc1MywzOSBAQAogCQlyZXR1cm5fVk9JRDsKIAl9CiAKKwkvKiBBbGwgdGhlIGxvZ2ljIGhlcmUgYXNzdW1lcyBmbGFncy5ibV9jaGVjayBpcyBzYW1lIGFjcm9zcyBhbGwgQ1BVcyAqLworCWlmICghYm1fY2hlY2tfZmxhZykgeworCQkvKiBEZXRlcm1pbmUgd2hldGhlciBibV9jaGVjayBpcyBuZWVkZWQgYmFzZWQgb24gQ1BVICAqLworCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKCYocHItPmZsYWdzKSwgcHItPmlkKTsKKwkJYm1fY2hlY2tfZmxhZyA9IHByLT5mbGFncy5ibV9jaGVjazsKKwl9IGVsc2UgeworCQlwci0+ZmxhZ3MuYm1fY2hlY2sgPSBibV9jaGVja19mbGFnOworCX0KKworCWlmIChwci0+ZmxhZ3MuYm1fY2hlY2spIHsKKwkJcHJpbnRrKCJEaXNhYmxpbmcgQk0gYWNjZXNzIGJlZm9yZSBlbnRlcmluZyBDM1xuIik7CisJCS8qIGJ1cyBtYXN0ZXJpbmcgY29udHJvbCBpcyBuZWNlc3NhcnkgKi8KKwkJaWYgKCFwci0+ZmxhZ3MuYm1fY29udHJvbCkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiQzMgc3VwcG9ydCByZXF1aXJlcyBidXMgbWFzdGVyaW5nIGNvbnRyb2xcbiIpKTsKKwkJCXJldHVybl9WT0lEOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJJbnZhbGlkYXRpbmcgY2FjaGUgYmVmb3JlIGVudGVyaW5nIEMzXG4iKTsKKwkJLyoKKwkJICogV0JJTlZEIHNob3VsZCBiZSBzZXQgaW4gZmFkdCwgZm9yIEMzIHN0YXRlIHRvIGJlCisJCSAqIHN1cHBvcnRlZCBvbiB3aGVuIGJtX2NoZWNrIGlzIG5vdCByZXF1aXJlZC4KKwkJICovCisJCWlmIChhY3BpX2ZhZHQud2JfaW52ZCAhPSAxKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJDYWNoZSBpbnZhbGlkYXRpb24gc2hvdWxkIHdvcmsgcHJvcGVybHkiCisJCQkgICIgZm9yIEMzIHRvIGJlIGVuYWJsZWQgb24gU01QIHN5c3RlbXNcbiIpKTsKKwkJCXJldHVybl9WT0lEOworCQl9CisJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELAorCQkJCTAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwl9CisKIAkvKgogCSAqIE90aGVyd2lzZSB3ZSd2ZSBtZXQgYWxsIG9mIG91ciBDMyByZXF1aXJlbWVudHMuCiAJICogTm9ybWFsaXplIHRoZSBDMyBsYXRlbmN5IHRvIGV4cGlkaXRlIHBvbGljeS4gIEVuYWJsZQpAQCAtNzM3LDcgKzc5NCw2IEBACiAJICovCiAJY3gtPnZhbGlkID0gMTsKIAljeC0+bGF0ZW5jeV90aWNrcyA9IFVTX1RPX1BNX1RJTUVSX1RJQ0tTKGN4LT5sYXRlbmN5KTsKLQlwci0+ZmxhZ3MuYm1fY2hlY2sgPSAxOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CkBAIC03ODcsMTAgKzg0Myw3IEBACiAJaWYgKChyZXN1bHQpIHx8IChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnkocHIpIDwgMikpIHsKIAkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZmFkdChwcik7CiAJCWlmIChyZXN1bHQpCi0JCQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKLQotCQlpZiAoYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5KHByKSA8IDIpCi0JCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CisJCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxKHByKTsKIAl9CiAKIAkvKgpAQCAtODEwLDExICs4NjMsMTAgQEAKIAkgKiBDUFUgYXMgYmVpbmcgImlkbGUgbWFuYWdlYWJsZSIKIAkgKi8KIAlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKLQkJaWYgKHByLT5wb3dlci5zdGF0ZXNbaV0udmFsaWQpCisJCWlmIChwci0+cG93ZXIuc3RhdGVzW2ldLnZhbGlkKSB7CiAJCQlwci0+cG93ZXIuY291bnQgPSBpOwotCQlpZiAoKHByLT5wb3dlci5zdGF0ZXNbaV0udmFsaWQpICYmCi0JCSAgICAocHItPnBvd2VyLnN0YXRlc1tpXS50eXBlID49IEFDUElfU1RBVEVfQzIpKQogCQkJcHItPmZsYWdzLnBvd2VyID0gMTsKKwkJfQogCX0KIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTgyOSw3ICs4ODEsNyBAQAogCWlmICghcHIpCiAgCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlpZiAoZXJyYXRhLnNtcCB8fCBub2NzdCkgeworCWlmICggbm9jc3QpIHsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIApAQCAtOTI5LDcgKzk4MSw2IEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLQogaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7CkBAIC05NDYsNyArOTk3LDEwIEBACiAJCWZpcnN0X3J1bisrOwogCX0KIAotCWlmICghZXJyYXRhLnNtcCAmJiAocHItPmlkID09IDApICYmIGFjcGlfZmFkdC5jc3RfY250ICYmICFub2NzdCkgeworCWlmICghcHIpCisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKworCWlmIChhY3BpX2ZhZHQuY3N0X2NudCAmJiAhbm9jc3QpIHsKIAkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZmFkdC5zbWlfY21kLCBhY3BpX2ZhZHQuY3N0X2NudCwgOCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKQEAgLTk1NCw2ICsxMDA4LDggQEAKIAkJfQogCX0KIAorCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKCYocHItPnBvd2VyKSwgcHItPmlkKTsKKwlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHByLCBwci0+cG93ZXIucGRjKTsKIAlhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyhwcik7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwppbmRleCBhOWExYThmLi4xZjBkNjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwpAQCAtMTY1LDM3ICsxNjUsNiBAQAogCWFjcGlfcHJvY2Vzc29yX3BwY19zdGF0dXMgJj0gflBQQ19SRUdJU1RFUkVEOwogfQogCi0vKgotICogd2hlbiByZWdpc3RlcmluZyBhIGNwdWZyZXEgZHJpdmVyIHdpdGggdGhpcyBBQ1BJIHByb2Nlc3NvciBkcml2ZXIsIHRoZQotICogX1BDVCBhbmQgX1BTUyBzdHJ1Y3R1cmVzIGFyZSByZWFkIG91dCBhbmQgd3JpdHRlbiBpbnRvIHN0cnVjdAotICogYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIJCQlhcmcwX2J1ZlszXTsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IG5vX29iamVjdCA9IHsxLCAmYXJnMH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3NldF9wZGMiKTsKLQotCWFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOwotCWFyZzAuYnVmZmVyLnBvaW50ZXIgPSAodTggKikgYXJnMF9idWY7Ci0JYXJnMF9idWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKLQlhcmcwX2J1ZlsxXSA9IDA7Ci0JYXJnMF9idWZbMl0gPSAwOwotCi0JcGRjID0gKHByLT5wZXJmb3JtYW5jZS0+cGRjKSA/IHByLT5wZXJmb3JtYW5jZS0+cGRjIDogJm5vX29iamVjdDsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfUERDIiwgcGRjLCBOVUxMKTsKLQotCWlmICgoQUNQSV9GQUlMVVJFKHN0YXR1cykpICYmIChwci0+cGVyZm9ybWFuY2UtPnBkYykpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkVycm9yIGV2YWx1YXRpbmcgX1BEQywgdXNpbmcgbGVnYWN5IHBlcmYuIGNvbnRyb2wuLi5cbiIpKTsKLQotCXJldHVybl9WQUxVRShzdGF0dXMpOwotfQotCiAKIHN0YXRpYyBpbnQKIGFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9jb250cm9sICgKQEAgLTM1Nyw3ICszMjYsNyBAQAogCWlmICghcHIgfHwgIXByLT5wZXJmb3JtYW5jZSB8fCAhcHItPmhhbmRsZSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhwcik7CisJYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhwciwgcHItPnBlcmZvcm1hbmNlLT5wZGMpOwogCiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKHByLT5oYW5kbGUsICJfUENUIiwgJmhhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYwppbmRleCA0Nzg4YzA3Li41NWQyNjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKQEAgLTc3LDIxICs3NywyMSBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTY7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wODsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3B0cjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNik7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzMTZfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC0xMDQsOSArMTA0LDggQEAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfQUREUkVTUzE2OwogCi0JLyoKLQkgKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKQotCSAqLworCS8qIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTExOCw5ICsxMTcsOCBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwogCi0JLyoKLQkgKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KQotCSAqLworCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTE0MCw5ICsxMzgsOCBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMykgJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KQotCSAqLworCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTE2NSwzOSArMTYyLDM0IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi03KQotCSAqLworCS8qIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi03KSAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgOC05KQotCSAqLworCS8qIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgOC05KSAqLworCiAJYnVmZmVyICs9IDI7CiAJQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTEpCi0JICovCisJLyogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMSkgKi8KKwogCWJ1ZmZlciArPSAyOwogCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDEyLTEzKQotCSAqLwotCWJ1ZmZlciArPSAyOwotCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOworCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTItMTMpICovCiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMTQtMTUpCi0JICovCisJYnVmZmVyICs9IDI7CisJQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsCisJCWJ1ZmZlcik7CisKKwkvKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDE0LTE1KSAqLworCiAJYnVmZmVyICs9IDI7CiAJQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCisKIAlidWZmZXIgKz0gMjsKIAogCS8qCkBAIC0yMjUsNyArMjE3LDggQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQogCQkJCShjaGFyICopKCh1OCAqIClvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCi0JCXRlbXBfcHRyID0gKHU4ICopIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQl0ZW1wX3B0ciA9ICh1OCAqKQorCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKIAkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCkBAIC0yMzksOSArMjMyLDggQEAKIAkJCWluZGV4ICs9IDE7CiAJCX0KIAotCQkvKgotCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwKLQkJICovCisJCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLworCiAJCSp0ZW1wX3B0ciA9IDB4MDA7CiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CkBAIC0yNjAsMTQgKzI1MiwxMiBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTMwNSwyOCArMjk1LDI0IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MxNl9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDg4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyCi0JICovCisJLyogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCiAJbGVuZ3RoX2ZpZWxkID0gYnVmZmVyOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpCi0JICovCisJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBnZW5lcmFsIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwogCiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5kZWNvZGUgJiAweDAxKSA8PCAxOwpAQCAtMzM2LDkgKzMyMiw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KKwogCXRlbXA4ID0gMDsKIAogCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSkgewpAQCAtMzYyLDM5ICszNDcsMzQgQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuZ3JhbnVsYXJpdHkpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5taW5fYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldAotCSAqLwotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwkvKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0ICovCisKKwlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwKKwkJJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbAotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCAqLworCiAJaWYgKDAgIT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7CiAJCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4OwogCkBAIC00MDMsOSArMzgzLDggQEAKIAogCQl0ZW1wX3BvaW50ZXIgPSAoY2hhciAqKSBidWZmZXI7CiAKLQkJLyoKLQkJICogQ29weSB0aGUgc3RyaW5nCi0JCSAqLworCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KKwogCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAogCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAKQEAgLTQxMywxMiArMzkyLDEyIEBACiAJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOICgKKwkJCQkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJYWN0dWFsX2J5dGVzID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJKmJ5dGVzX2NvbnN1bWVkID0gYWN0dWFsX2J5dGVzOwogCkBAIC00NzUsOSArNDU0LDggQEAKIAlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAJc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKTsKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtNDkwLDkgKzQ2OCw4IEBACiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0FERFJFU1MzMjsKIAotCS8qCi0JICogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykKLQkgKi8KKwkvKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKSAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC01MDQsMzUgKzQ4MSwyOSBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwogCi0JLyoKLQkgKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KQotCSAqLworCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKLQkvKgotCSAqIFByb2R1Y2VyIC8gQ29uc3VtZXIKLQkgKi8KKwkvKiBQcm9kdWNlciAvIENvbnN1bWVyICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5wcm9kdWNlcl9jb25zdW1lciA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogRGVjb2RlCi0JICovCisJLyogRGVjb2RlICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5kZWNvZGUgPSAodGVtcDggPj4gMSkgJiAweDAxOwogCi0JLyoKLQkgKiBNaW4gQWRkcmVzcyBGaXhlZAotCSAqLworCS8qIE1pbiBBZGRyZXNzIEZpeGVkICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7CiAKLQkvKgotCSAqIE1heCBBZGRyZXNzIEZpeGVkCi0JICovCisJLyogTWF4IEFkZHJlc3MgRml4ZWQgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKIAotCS8qCi0JICogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkKLQkgKi8KKwkvKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC01NTYsMzkgKzUyNywzNCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtOSkKLQkgKi8KKwkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtOSkgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5LCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTEzKQotCSAqLworCS8qIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTMpICovCisKIAlidWZmZXIgKz0gNDsKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0xNykKLQkgKi8KKwkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTE3KSAqLworCiAJYnVmZmVyICs9IDQ7CiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTgtMjEpCi0JICovCi0JYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIGJ1ZmZlcik7CisJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxOC0yMSkgKi8KIAotCS8qCi0JICogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAyMi0yNSkKLQkgKi8KKwlidWZmZXIgKz0gNDsKKwlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwKKwkJYnVmZmVyKTsKKworCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMjItMjUpICovCisKIAlidWZmZXIgKz0gNDsKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCwgYnVmZmVyKTsKIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KQotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KKwogCWJ1ZmZlciArPSA0OwogCiAJLyoKQEAgLTYxNSw3ICs1ODEsOCBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9CiAJCQkJKGNoYXIgKikoKHU4ICopb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKIAotCQl0ZW1wX3B0ciA9ICh1OCAqKSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJdGVtcF9wdHIgPSAodTggKikKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCiAJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIApAQCAtNjI4LDkgKzU5NSw4IEBACiAJCQlpbmRleCArPSAxOwogCQl9CiAKLQkJLyoKLQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsCi0JCSAqLworCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KKwogCQkqdGVtcF9wdHIgPSAweDAwOwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKIApAQCAtNjQ4LDE0ICs2MTQsMTIgQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC02OTQsMjkgKzY1OCwyNSBAQAogCiAJYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODc7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlcgotCSAqLworCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCiAJbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUiAodTE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpCi0JICovCisJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7CiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5kZWNvZGUgJiAweDAxKSA8PCAxOwogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyOwpAQCAtNzI1LDkgKzY4NSw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KKwogCXRlbXA4ID0gMDsKIAogCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSkgewpAQCAtNzUxLDM5ICs3MTAsMzQgQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuZ3JhbnVsYXJpdHkpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldAotCSAqLwotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwkvKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0ICovCisKKwlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwKKwkJJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbAotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCAqLworCiAJaWYgKDAgIT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7CiAJCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLmluZGV4OwogCkBAIC03OTIsOSArNzQ2LDggQEAKIAogCQl0ZW1wX3BvaW50ZXIgPSAoY2hhciAqKSBidWZmZXI7CiAKLQkJLyoKLQkJICogQ29weSB0aGUgc3RyaW5nCi0JCSAqLworCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KKwogCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAogCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIApAQCAtODAyLDEyICs3NTUsMTIgQEAKIAkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCiAJCSAqICB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOICgKKwkJCQkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAKIAkvKgpAQCAtODY0LDkgKzgxNyw4IEBACiAJc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KTsKIAlyZXNvdXJjZV90eXBlID0gKmJ1ZmZlcjsKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtODc5LDkgKzgzMSw4IEBACiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0FERFJFU1M2NDsKIAotCS8qCi0JICogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykKLQkgKi8KKwkvKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKSAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC04OTMsMzUgKzg0NCwyOSBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwogCi0JLyoKLQkgKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KQotCSAqLworCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKLQkvKgotCSAqIFByb2R1Y2VyIC8gQ29uc3VtZXIKLQkgKi8KKwkvKiBQcm9kdWNlciAvIENvbnN1bWVyICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5wcm9kdWNlcl9jb25zdW1lciA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogRGVjb2RlCi0JICovCisJLyogRGVjb2RlICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5kZWNvZGUgPSAodGVtcDggPj4gMSkgJiAweDAxOwogCi0JLyoKLQkgKiBNaW4gQWRkcmVzcyBGaXhlZAotCSAqLworCS8qIE1pbiBBZGRyZXNzIEZpeGVkICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7CiAKLQkvKgotCSAqIE1heCBBZGRyZXNzIEZpeGVkCi0JICovCisJLyogTWF4IEFkZHJlc3MgRml4ZWQgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKIAotCS8qCi0JICogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkKLQkgKi8KKwkvKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC05NTEsMzMgKzg5NiwyOSBAQAogCQlidWZmZXIgKz0gMjsKIAl9CiAKLQkvKgotCSAqIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi0xMykgb3IgKEJ5dGVzIDgtMTUpCi0JICovCisJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTEzKSBvciAoQnl0ZXMgOC0xNSkgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5LCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTIxKSBvciAoQnl0ZXMgMTYtMjMpCi0JICovCisJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0yMSkgb3IgKEJ5dGVzIDE2LTIzKSAqLworCiAJYnVmZmVyICs9IDg7CiAJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMjItMjkpIG9yIChCeXRlcyAyNC0zMSkKLQkgKi8KKwkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDIyLTI5KSBvciAoQnl0ZXMgMjQtMzEpICovCisKIAlidWZmZXIgKz0gODsKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAzMC0zNykgb3IgKEJ5dGVzIDMyLTM5KQotCSAqLwotCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOworCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMzAtMzcpIG9yIChCeXRlcyAzMi0zOSkgKi8KIAotCS8qCi0JICogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAzOC00NSkgb3IgKEJ5dGVzIDQwLTQ3KQotCSAqLworCWJ1ZmZlciArPSA4OworCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAorCQlidWZmZXIpOworCisJLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAzOC00NSkgb3IgKEJ5dGVzIDQwLTQ3KSAqLworCiAJYnVmZmVyICs9IDg7CiAJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgsIGJ1ZmZlcik7CiAKQEAgLTk4OSwxNCArOTMwLDE1IEBACiAJCS8qIEdldCB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZSAoQnl0ZXMgNDgtNTUpICovCiAKIAkJYnVmZmVyICs9IDg7Ci0JCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcywgYnVmZmVyKTsKKwkJQUNQSV9NT1ZFXzY0X1RPXzY0ICgKKwkJCSZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMsCisJCQlidWZmZXIpOwogCX0KIAllbHNlIHsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQudHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzID0gMDsKIAotCQkvKgotCQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpCi0JCSAqLworCQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCisKIAkJYnVmZmVyICs9IDg7CiAKIAkJLyoKQEAgLTEwMjUsNyArOTY3LDggQEAKIAkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KIAkJCQkJKGNoYXIgKikoKHU4ICopb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKIAotCQkJdGVtcF9wdHIgPSAodTggKikgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CisJCQl0ZW1wX3B0ciA9ICh1OCAqKQorCQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCiAJCQkvKiBDb3B5IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCiAKQEAgLTEwNDIsNyArOTg1LDggQEAKIAkJCSAqIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbAogCQkJICovCiAJCQkqdGVtcF9wdHIgPSAweDAwOwotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9CisJCQkJaW5kZXggKyAxOwogCiAJCQkvKgogCQkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LApAQCAtMTA1NCwxNCArOTk4LDEyIEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTEwMCwyOSArMTA0MiwyNSBAQAogCiAJYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4OEE7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlcgotCSAqLworCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCiAJbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUiAodTE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpCi0JICovCisJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7CiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5kZWNvZGUgJiAweDAxKSA8PCAxOwogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyOwpAQCAtMTEzMSw5ICsxMDY5LDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncwotCSAqLworCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLworCiAJdGVtcDggPSAwOwogCiAJaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlKSB7CkBAIC0xMTU3LDM5ICsxMDk0LDM0IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkgKi8KKwogCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5KTsKIAlidWZmZXIgKz0gODsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLworCiAJQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCisKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDg7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQKLQkgKi8KLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLworCisJQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsCisJCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSA4OwogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KKwogCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewogCQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5pbmRleDsKIApAQCAtMTE5OCwyMSArMTEzMCwyMSBAQAogCiAJCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDb3B5IHRoZSBzdHJpbmcKLQkJICovCi0JCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCS8qIENvcHkgdGhlIHN0cmluZyAqLworCisJCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCisJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCiAJCS8qCiAJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOICgKKwkJCQkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKaW5kZXggOGE1ZjBhNS4uOTgxNzZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCkBAIC04MSw5ICs4MSw4IEBACiAKIAogCXdoaWxlICghZG9uZSkgewotCQkvKgotCQkgKiBJbml0IHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgc2l6ZSB0byBhZGQgdG8gdGhlIHRvdGFsLgotCQkgKi8KKwkJLyogSW5pdCB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIHNpemUgdG8gYWRkIHRvIHRoZSB0b3RhbC4gKi8KKwogCQlzZWdtZW50X3NpemUgPSAwOwogCiAJCXN3aXRjaCAobGlua2VkX2xpc3QtPmlkKSB7CkBAIC0xOTYsNyArMTk1LDggQEAKIAkJCXNlZ21lbnRfc2l6ZSA9IDE2OwogCiAJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7Ci0JCQkJc2VnbWVudF9zaXplICs9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQlzZWdtZW50X3NpemUgKz0KKwkJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yMTIsNyArMjEyLDggQEAKIAkJCXNlZ21lbnRfc2l6ZSA9IDI2OwogCiAJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7Ci0JCQkJc2VnbWVudF9zaXplICs9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQlzZWdtZW50X3NpemUgKz0KKwkJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yMjcsNyArMjI4LDggQEAKIAkJCXNlZ21lbnRfc2l6ZSA9IDQ2OwogCiAJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7Ci0JCQkJc2VnbWVudF9zaXplICs9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQlzZWdtZW50X3NpemUgKz0KKwkJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNDEsMzggKzI0MywzNiBAQAogCQkJICogSW5kZXggKyB0aGUgbGVuZ3RoIG9mIHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nCiAJCQkgKiBSZXNvdXJjZSBTb3VyY2UgKyAxIGZvciB0aGUgbnVsbC4KIAkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gOSArCi0JCQkJKCgoYWNwaV9zaXplKSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgLSAxKSAqIDQpOworCQkJc2VnbWVudF9zaXplID0gOSArICgoKGFjcGlfc2l6ZSkKKwkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgLSAxKSAqIDQpOwogCiAJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7Ci0JCQkJc2VnbWVudF9zaXplICs9IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQlzZWdtZW50X3NpemUgKz0KKwkJCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywgZXhpdCB3aXRoIGVycm9yCi0JCQkgKi8KKworCQkJLyogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsIGV4aXQgd2l0aCBlcnJvciAqLworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOwogCiAJCX0gLyogc3dpdGNoIChsaW5rZWRfbGlzdC0+SWQpICovCiAKLQkJLyoKLQkJICogVXBkYXRlIHRoZSB0b3RhbAotCQkgKi8KKwkJLyogVXBkYXRlIHRoZSB0b3RhbCAqLworCiAJCWJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkICs9IHNlZ21lbnRfc2l6ZTsKIAotCQkvKgotCQkgKiBQb2ludCB0byB0aGUgbmV4dCBvYmplY3QKLQkJICovCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLworCiAJCWxpbmtlZF9saXN0ID0gQUNQSV9QVFJfQUREIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKIAkJCQkgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKIAl9CiAKLQkvKgotCSAqIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcwotCSAqLworCS8qIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcyAqLworCiAJKnNpemVfbmVlZGVkID0gYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQ7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zMjAsOSArMzIwLDggQEAKIAogCiAJd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgpIHsKLQkJLyoKLQkJICogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlCi0JCSAqLworCQkvKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUgKi8KKwogCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoKmJ5dGVfc3RyZWFtX2J1ZmZlcik7CiAKIAkJc3dpdGNoIChyZXNvdXJjZV90eXBlKSB7CkBAIC0zNDYsOSArMzQ1LDggQEAKIAkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDE2ID0gKHUxNikgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wMTYpOwogCiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpICsKQEAgLTQxNiw5ICs0MTQsOCBAQAogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDY0LWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSA2NC1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyAodGVtcDgpOwogCiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpICsKQEAgLTQ1Miw5ICs0NDksOCBAQAogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOwogCiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpICsKQEAgLTQ4OCw5ICs0ODQsOCBAQAogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOwogCiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpICsKQEAgLTUzNyw5ICs1MzIsOCBAQAogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOwogCiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKSArCkBAIC01NjcsOSArNTYxLDggQEAKIAogCQkJKytidWZmZXI7CiAKLQkJCS8qCi0JCQkgKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQKLQkJCSAqLworCQkJLyogTG9vayBhdCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0ICovCisKIAkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAogCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHsKQEAgLTU5Niw5ICs1ODksOCBAQAogCiAJCQkrK2J1ZmZlcjsKIAotCQkJLyoKLQkJCSAqIExvb2sgYXQgdGhlIG51bWJlciBvZiBiaXRzIHNldAotCQkJICovCisJCQkvKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgKi8KKwogCQkJdGVtcDggPSAqYnVmZmVyOwogCiAJCQlmb3IoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHsKQEAgLTY3MCw5ICs2NjIsOCBAQAogCQkJdGVtcDggPSAodTgpICh0ZW1wOCAmIDB4Nyk7CiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXA4ICsgMTsKIAotCQkJLyoKLQkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQotCQkJICovCisJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOwogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSArCiAJCQkJCSAgICh0ZW1wOCAqIHNpemVvZiAodTgpKTsKQEAgLTY5NywyMSArNjg4LDE4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOwogCQl9CiAKLQkJLyoKLQkJICogVXBkYXRlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50ZXIKLQkJICovCisJCS8qIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyICovCisKIAkJYnVmZmVyX3NpemUgKz0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChzdHJ1Y3R1cmVfc2l6ZSk7CiAJCWJ5dGVzX3BhcnNlZCArPSBieXRlc19jb25zdW1lZDsKIAotCQkvKgotCQkgKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlCi0JCSAqLworCQkvKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlICovCisKIAkJYnl0ZV9zdHJlYW1fYnVmZmVyICs9IGJ5dGVzX2NvbnN1bWVkOwogCX0KIAotCS8qCi0JICogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzCi0JICovCisJLyogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzICovCisKIAkqc2l6ZV9uZWVkZWQgPSBidWZmZXJfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTc2Nyw5ICs3NTUsOCBAQAogCXRvcF9vYmplY3RfbGlzdCA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyX29mX2VsZW1lbnRzOyBpbmRleCsrKSB7Ci0JCS8qCi0JCSAqIERlcmVmZXJlbmNlIHRoZSBzdWItcGFja2FnZQotCQkgKi8KKwkJLyogRGVyZWZlcmVuY2UgdGhlIHN1Yi1wYWNrYWdlICovCisKIAkJcGFja2FnZV9lbGVtZW50ID0gKnRvcF9vYmplY3RfbGlzdDsKIAogCQkvKgpAQCAtNzc4LDM3ICs3NjUsNDAgQEAKIAkJICovCiAJCXN1Yl9vYmplY3RfbGlzdCA9IHBhY2thZ2VfZWxlbWVudC0+cGFja2FnZS5lbGVtZW50czsKIAotCQkvKgotCQkgKiBTY2FuIHRoZSBpcnFfdGFibGVfZWxlbWVudHMgZm9yIHRoZSBTb3VyY2UgTmFtZSBTdHJpbmcKLQkJICovCisJCS8qIFNjYW4gdGhlIGlycV90YWJsZV9lbGVtZW50cyBmb3IgdGhlIFNvdXJjZSBOYW1lIFN0cmluZyAqLworCiAJCW5hbWVfZm91bmQgPSBGQUxTRTsKIAogCQlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPCA0ICYmICFuYW1lX2ZvdW5kOyB0YWJsZV9pbmRleCsrKSB7Ci0JCQlpZiAoKEFDUElfVFlQRV9TVFJJTkcgPT0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpKSB8fAotCQkJCSgoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSA9PSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkpICYmCi0JCQkJCSgoKnN1Yl9vYmplY3RfbGlzdCktPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkpKSB7CisJCQlpZiAoKEFDUElfVFlQRV9TVFJJTkcgPT0KKwkJCQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpKSB8fAorCisJCQkJKChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFID09CisJCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgJiYKKworCQkJCQkoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2Uub3Bjb2RlID09CisJCQkJCQlBTUxfSU5UX05BTUVQQVRIX09QKSkpIHsKIAkJCQluYW1lX2ZvdW5kID0gVFJVRTsKIAkJCX0KIAkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogTG9vayBhdCB0aGUgbmV4dCBlbGVtZW50Ci0JCQkJICovCisJCQkJLyogTG9vayBhdCB0aGUgbmV4dCBlbGVtZW50ICovCisKIAkJCQlzdWJfb2JqZWN0X2xpc3QrKzsKIAkJCX0KIAkJfQogCiAJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gKHNpemVvZiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CiAKLQkJLyoKLQkJICogV2FzIGEgU3RyaW5nIHR5cGUgZm91bmQ/Ci0JCSAqLworCQkvKiBXYXMgYSBTdHJpbmcgdHlwZSBmb3VuZD8gKi8KKwogCQlpZiAobmFtZV9mb3VuZCkgewogCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSA9PSBBQ1BJX1RZUEVfU1RSSU5HKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGUgbGVuZ3RoIFN0cmluZy5MZW5ndGggZmllbGQgZG9lcyBub3QgaW5jbHVkZSB0aGUKIAkJCQkgKiB0ZXJtaW5hdGluZyBOVUxMLCBhZGQgMQogCQkJCSAqLwotCQkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gKChhY3BpX3NpemUpICgqc3ViX29iamVjdF9saXN0KS0+c3RyaW5nLmxlbmd0aCArIDEpOworCQkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gKChhY3BpX3NpemUpCisJCQkJCSgqc3ViX29iamVjdF9saXN0KS0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQkJfQogCQkJZWxzZSB7CiAJCQkJdGVtcF9zaXplX25lZWRlZCArPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKApAQCAtODI3LDE0ICs4MTcsMTQgQEAKIAogCQl0ZW1wX3NpemVfbmVlZGVkID0gQUNQSV9ST1VORF9VUF90b182NF9iSVRTICh0ZW1wX3NpemVfbmVlZGVkKTsKIAotCQkvKgotCQkgKiBQb2ludCB0byB0aGUgbmV4dCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0Ci0JCSAqLworCQkvKiBQb2ludCB0byB0aGUgbmV4dCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICovCisKIAkJdG9wX29iamVjdF9saXN0Kys7CiAJfQogCiAJLyoKLQkgKiBBZGRpbmcgYW4gZXh0cmEgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlc3NlbnRpYWxseSBhIE5VTEwgdGVybWluYXRvcgorCSAqIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGVzc2VudGlhbGx5IGEKKwkgKiBOVUxMIHRlcm1pbmF0b3IKIAkgKi8KIAkqYnVmZmVyX3NpemVfbmVlZGVkID0gdGVtcF9zaXplX25lZWRlZCArIHNpemVvZiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCmluZGV4IGEzYTBjYmYuLjhlMGVhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKQEAgLTg3LDkgKzg3LDggQEAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiYnl0ZV9zdHJlYW1fYnVmZmVyID0gJXBcbiIsCiAJCWJ5dGVfc3RyZWFtX2J1ZmZlcikpOwogCi0JLyoKLQkgKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUKLQkgKi8KKwkvKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUgKi8KKwogCWJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGggPSBieXRlX3N0cmVhbV9idWZmZXItPmJ1ZmZlci5sZW5ndGg7CiAJYnl0ZV9zdHJlYW1fc3RhcnQgPSBieXRlX3N0cmVhbV9idWZmZXItPmJ1ZmZlci5wb2ludGVyOwogCkBAIC0xNzEsOSArMTcwLDggQEAKIAogCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLwogCi0JLyoKLQkgKiBHZXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGgKLQkgKi8KKwkvKiBHZXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGggKi8KKwogCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCAocGFja2FnZV9vYmplY3QsCiAJCQkgJmJ1ZmZlcl9zaXplX25lZWRlZCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjE3LDkgKzIxNSw4IEBACiAJCSAqLwogCQl1c2VyX3BydC0+bGVuZ3RoID0gKHNpemVvZiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CiAKLQkJLyoKLQkJICogRWFjaCBlbGVtZW50IG9mIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBtdXN0IGFsc28gYmUgYSBwYWNrYWdlCi0JCSAqLworCQkvKiBFYWNoIGVsZW1lbnQgb2YgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIG11c3QgYWxzbyBiZSBhIHBhY2thZ2UgKi8KKwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCp0b3Bfb2JqZWN0X2xpc3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkiKFBSVFslWF0pIE5lZWQgc3ViLXBhY2thZ2UsIGZvdW5kICVzXG4iLApAQCAtMjQzLDkgKzI0MCw4IEBACiAJCSAqLwogCQlzdWJfb2JqZWN0X2xpc3QgPSAoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuZWxlbWVudHM7CiAKLQkJLyoKLQkJICogMSkgRmlyc3Qgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULkFkZHJlc3MKLQkJICovCisJCS8qIDEpIEZpcnN0IHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5BZGRyZXNzICovCisKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMF07CiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+YWRkcmVzcyA9IG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwpAQCAtMjU3LDkgKzI1Myw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKIAkJfQogCi0JCS8qCi0JCSAqIDIpIFNlY29uZCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuUGluCi0JCSAqLworCQkvKiAyKSBTZWNvbmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULlBpbiAqLworCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzFdOwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJdXNlcl9wcnQtPnBpbiA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwpAQCAtMjcxLDkgKzI2Niw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKIAkJfQogCi0JCS8qCi0JCSAqIDMpIFRoaXJkIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfbmFtZQotCQkgKi8KKwkJLyogMykgVGhpcmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9uYW1lICovCisKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMl07CiAJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgewogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CkBAIC0yOTYsNyArMjkwLDkgQEAKIAogCQkJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUgKChhY3BpX2hhbmRsZSkgbm9kZSwgJnBhdGhfYnVmZmVyKTsKIAotCQkJdXNlcl9wcnQtPmxlbmd0aCArPSAodTMyKSBBQ1BJX1NUUkxFTiAodXNlcl9wcnQtPnNvdXJjZSkgKyAxOyAvKiBpbmNsdWRlIG51bGwgdGVybWluYXRvciAqLworCQkJLyogKzEgdG8gaW5jbHVkZSBudWxsIHRlcm1pbmF0b3IgKi8KKworCQkJdXNlcl9wcnQtPmxlbmd0aCArPSAodTMyKSBBQ1BJX1NUUkxFTiAodXNlcl9wcnQtPnNvdXJjZSkgKyAxOwogCQkJYnJlYWs7CiAKIApAQCAtMzA0LDggKzMwMCwxMCBAQAogCiAJCQlBQ1BJX1NUUkNQWSAodXNlcl9wcnQtPnNvdXJjZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAotCQkJLyogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChhZGQgMSBmb3IgdGVybWluYXRvcikgKi8KLQorCQkJLyoKKwkJCSAqIEFkZCB0byB0aGUgTGVuZ3RoIGZpZWxkIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZworCQkJICogKGFkZCAxIGZvciB0ZXJtaW5hdG9yKQorCQkJICovCiAJCQl1c2VyX3BydC0+bGVuZ3RoICs9IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMTsKIAkJCWJyZWFrOwogCkBAIC0zMzMsOSArMzMxLDggQEAKIAogCQl1c2VyX3BydC0+bGVuZ3RoID0gKHUzMikgQUNQSV9ST1VORF9VUF90b182NF9iSVRTICh1c2VyX3BydC0+bGVuZ3RoKTsKIAotCQkvKgotCQkgKiA0KSBGb3VydGggc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9pbmRleAotCQkgKi8KKwkJLyogNCkgRm91cnRoIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfaW5kZXggKi8KKwogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFszXTsKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5zb3VyY2VfaW5kZXggPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCmluZGV4IGVlZjFiMWYuLjE5MzVkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwpAQCAtNDgsOSArNDgsNjIgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNkdW1wIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2lycSAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfYWRkcmVzczE2ICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2FkZHJlc3M2NCAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZG1hICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9pbyAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9maXhlZF9pbyAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX21lbW9yeTI0ICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9tZW1vcnkzMiAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKwogCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaXJxCkBAIC02Myw3ICsxMTYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfaXJxICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtNzcsMTMgKzEzMCwxMyBAQAogCWFjcGlfb3NfcHJpbnRmICgiSVJRIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlcyBUcmlnZ2VyZWRcbiIsCi0JCQkgQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPyAiTGV2ZWwiIDogIkVkZ2UiKTsKKwkJQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPyAiTGV2ZWwiIDogIkVkZ2UiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBY3RpdmUgJXNcbiIsCi0JCQkgQUNQSV9BQ1RJVkVfTE9XID09IGlycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPyAiTG93IiA6ICJIaWdoIik7CisJCUFDUElfQUNUSVZFX0xPVyA9PSBpcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8gIkxvdyIgOiAiSGlnaCIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzXG4iLAotCQkJIEFDUElfU0hBUkVEID09IGlycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8gIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7CisJCUFDUElfU0hBUkVEID09IGlycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8gIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJVggSW50ZXJydXB0cyAoICIsIGlycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0cyk7CiAKQEAgLTEwOCw3ICsxNjEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfZG1hICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMTQ0LDcgKzE5Nyw3IEBACiAJfQogCiAJYWNwaV9vc19wcmludGYgKCIgICVzQnVzIE1hc3RlclxuIiwKLQkJCSBBQ1BJX0JVU19NQVNURVIgPT0gZG1hX2RhdGEtPmJ1c19tYXN0ZXIgPyAiIiA6ICJOb3QgYSAiKTsKKwkJQUNQSV9CVVNfTUFTVEVSID09IGRtYV9kYXRhLT5idXNfbWFzdGVyID8gIiIgOiAiTm90IGEgIik7CiAKIAogCXN3aXRjaCAoZG1hX2RhdGEtPnRyYW5zZmVyKSB7CkBAIC0xNjUsNyArMjE4LDggQEAKIAkJYnJlYWs7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIgIE51bWJlciBvZiBDaGFubmVsczogJVggKCAiLCBkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgTnVtYmVyIG9mIENoYW5uZWxzOiAlWCAoICIsCisJCWRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHMpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZG1hX2RhdGEtPm51bWJlcl9vZl9jaGFubmVsczsgaW5kZXgrKykgewogCQlhY3BpX29zX3ByaW50ZiAoIiVYICIsIGRtYV9kYXRhLT5jaGFubmVsc1tpbmRleF0pOwpAQCAtMTg4LDcgKzI0Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9zdGFydF9kZXBlbmRfZm5zICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMjMyLDggKzI4Niw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYgKCIgIEludmFsaWQgcGVyZm9ybWFuY2UgIgotCQkJCSAgInJvYnVzdG5lc3MgcHJlZmVyZW5jZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmICgiICBJbnZhbGlkIHBlcmZvcm1hbmNlIHJvYnVzdG5lc3MgcHJlZmVyZW5jZVxuIik7CiAJCWJyZWFrOwogCX0KIApAQCAtMjUzLDcgKzMwNiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9pbyAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTI2NiwxOSArMzE5LDE1IEBACiAJYWNwaV9vc19wcmludGYgKCJJbyBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJWQgYml0IGRlY29kZVxuIiwKLQkJCSBBQ1BJX0RFQ09ERV8xNiA9PSBpb19kYXRhLT5pb19kZWNvZGUgPyAxNiA6IDEwKTsKKwkJQUNQSV9ERUNPREVfMTYgPT0gaW9fZGF0YS0+aW9fZGVjb2RlID8gMTYgOiAxMCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIGlvX2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsIGlvX2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBpb19kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLCBpb19kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsCi0JCQkgaW9fZGF0YS0+YWxpZ25tZW50KTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBpb19kYXRhLT5hbGlnbm1lbnQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIExlbmd0aDogJTA4WFxuIiwKLQkJCSBpb19kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBMZW5ndGg6ICUwOFhcbiIsIGlvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CkBAIC0yOTYsNyArMzQ1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2ZpeGVkX2lvICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMzA3LDExICszNTYsOSBAQAogCiAKIAlhY3BpX29zX3ByaW50ZiAoIkZpeGVkIElvIFJlc291cmNlXG4iKTsKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYIiwKLQkJCSBmaXhlZF9pb19kYXRhLT5iYXNlX2FkZHJlc3MpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFgiLCBmaXhlZF9pb19kYXRhLT5iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WCIsCi0JCQkgZml4ZWRfaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYIiwgZml4ZWRfaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KQEAgLTMyOSw3ICszNzYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMzQ2LDcgKzM5Myw3IEBACiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZW5kb3JfZGF0YS0+bGVuZ3RoOyBpbmRleCsrKSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiICBCeXRlICVYOiAlMDhYXG4iLAotCQkJCSBpbmRleCwgdmVuZG9yX2RhdGEtPnJlc2VydmVkW2luZGV4XSk7CisJCQlpbmRleCwgdmVuZG9yX2RhdGEtPnJlc2VydmVkW2luZGV4XSk7CiAJfQogCiAJcmV0dXJuOwpAQCAtMzY1LDcgKzQxMiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9tZW1vcnkyNCAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTM3OCwyMSArNDI1LDE5IEBACiAJYWNwaV9vc19wcmludGYgKCIyNC1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZWFkJXNcbiIsCi0JCQkgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJIG1lbW9yeTI0X2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSAiL1dyaXRlIiA6ICIgb25seSIpOworCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCQltZW1vcnkyNF9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCQkiL1dyaXRlIiA6ICIgb25seSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBtZW1vcnkyNF9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwkJbWVtb3J5MjRfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIG1lbW9yeTI0X2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOworCQltZW1vcnkyNF9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MjRfZGF0YS0+YWxpZ25tZW50KTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBtZW1vcnkyNF9kYXRhLT5hbGlnbm1lbnQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwKLQkJCSBtZW1vcnkyNF9kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CkBAIC00MTAsNyArNDU1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX21lbW9yeTMyICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtNDIzLDIxICs0NjgsMTkgQEAKIAlhY3BpX29zX3ByaW50ZiAoIjMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlYWQlc1xuIiwKLQkJCSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkgbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJICIvV3JpdGUiIDogIiBvbmx5Iik7CisJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCW1lbW9yeTMyX2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJCSIvV3JpdGUiIDogIiBvbmx5Iik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIG1lbW9yeTMyX2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOworCQltZW1vcnkzMl9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MzJfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CisJCW1lbW9yeTMyX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwKLQkJCSBtZW1vcnkzMl9kYXRhLT5hbGlnbm1lbnQpOworCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTMyX2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLAotCQkJIG1lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KQEAgLTQ1NSwxMSArNDk4LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMiAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAgICAgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgICAgKmZpeGVkX21lbW9yeTMyX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAgICAqZml4ZWRfbWVtb3J5MzJfZGF0YSA9CisJCQkgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKikgZGF0YTsKIAogCiAJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKQEAgLTQ2OCwxNSArNTEyLDE0IEBACiAJYWNwaV9vc19wcmludGYgKCIzMi1CaXQgRml4ZWQgTG9jYXRpb24gTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZWFkJXNcbiIsCi0JCQkgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJIGZpeGVkX21lbW9yeTMyX2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSAiL1dyaXRlIiA6ICIgT25seSIpOworCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCQlmaXhlZF9tZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYXG4iLAotCQkJIGZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2Jhc2VfYWRkcmVzcyk7CisJCWZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2Jhc2VfYWRkcmVzcyk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLAotCQkJIGZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJCWZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CkBAIC00OTQsNyArNTM3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTUxNCwzNSArNTU3LDMwIEBACiAKIAkJc3dpdGNoIChhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiQ2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIldyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAogCQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfSU9fUkFOR0U6CkBAIC01NTEsMzAgKzU4OSwyNiBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgcmFuZ2UgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIHJhbmdlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKIAkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkiU3BhcnNlIiA6ICJEZW5zZSIpOworCQkJCWFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KKwkJCQkiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgpAQCAtNTg5LDQxICs2MjMsNDIgQEAKIAl9CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MxNl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCUFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczE2X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KIAkJCSJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlcyBkZWNvZGVcbiIsCi0JCQkgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MxNl9kYXRhLT5kZWNvZGUgPwotCQkJICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKKwkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MxNl9kYXRhLT5kZWNvZGUgPworCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MxNl9kYXRhLT5ncmFudWxhcml0eSk7CisJCWFkZHJlc3MxNl9kYXRhLT5ncmFudWxhcml0eSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtaW46ICUwOFhcbiIsCi0JCQkgYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKKwkJYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOworCQlhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJCWFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyBMZW5ndGg6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKKwkJYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKIAogCWlmICgweEZGICE9IGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkJIGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCQkJYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQkJIGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCQlhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCX0KIAogCXJldHVybjsKQEAgLTY0Miw3ICs2NzcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfYWRkcmVzczMyICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtNjYxLDM1ICs2OTYsMzAgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0NBQ0hFQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9DQUNIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9XUklURV9DT01CSU5JTkdfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIlByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCiAJCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkiL1dyaXRlIiA6ICIgT25seSIpOworCQkJCWFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJCQkiL1dyaXRlIiA6ICIgT25seSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9JT19SQU5HRToKQEAgLTY5OCwzMCArNzI4LDI2IEBACiAKIAkJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfRU5USVJFX1JBTkdFOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCiAJCQlBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiA9PQotCQkJYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/CisJCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfQlVTX05VTUJFUl9SQU5HRToKQEAgLTczMSw0NiArNzU3LDQ4IEBACiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLCBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CisJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAorCQkJYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpOwogCQlicmVhazsKIAl9CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCQkgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMzJfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKKwkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMzJfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJCSBBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczMyX2RhdGEtPmRlY29kZSA/Ci0JCQkgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCQlBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczMyX2RhdGEtPmRlY29kZSA/CisJCQkiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90ICIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCAiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QgIik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90ICIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MzMl9kYXRhLT5ncmFudWxhcml0eSk7CisJCWFkZHJlc3MzMl9kYXRhLT5ncmFudWxhcml0eSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtaW46ICUwOFhcbiIsCi0JCQkgYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKKwkJYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOworCQlhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJCWFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyBMZW5ndGg6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKKwkJYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKIAogCWlmKDB4RkYgIT0gYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKLQkJCQkgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCQlhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCQkgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwpAQCAtNzg5LDcgKzgxNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC04MDgsMzUgKzgzNiwzMCBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKIAkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCWFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CisJCQkJYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgpAQCAtODQ1LDMwICs4NjgsMjYgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKIAkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkiU3BhcnNlIiA6ICJEZW5zZSIpOworCQkJCWFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KKwkJCQkiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgpAQCAtODc4LDQ5ICs4OTcsNTEgQEAKIAogCWRlZmF1bHQ6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsIGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV90eXBlKTsKKwkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsCisJCQlhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJCSBBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3M2NF9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3M2NF9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXMgZGVjb2RlXG4iLAotCQkJIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzNjRfZGF0YS0+ZGVjb2RlID8KLQkJCSAiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CisJCUFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzNjRfZGF0YS0+ZGVjb2RlID8KKwkJCSJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QgIik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90ICIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCAiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QgIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgR3JhbnVsYXJpdHk6ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+Z3JhbnVsYXJpdHkpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+Z3JhbnVsYXJpdHkpKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSkpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX2xlbmd0aCkpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX2xlbmd0aCkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWMgQXR0cmlidXRlczogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+dHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzKSk7CiAKIAlpZiAoMHhGRiAhPSBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYXG4iLAotCQkJCSBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJCWFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAotCQkJCSBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQkJYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CkBAIC05MzksNyArOTYwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTk1MywyMyArOTc0LDIyIEBACiAJYWNwaV9vc19wcmludGYgKCJFeHRlbmRlZCBJUlEgUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQkJIEFDUElfQ09OU1VNRVIgPT0gZXh0X2lycV9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCQlBQ1BJX0NPTlNVTUVSID09IGV4dF9pcnFfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzXG4iLAotCQkJIEFDUElfTEVWRUxfU0VOU0lUSVZFID09IGV4dF9pcnFfZGF0YS0+ZWRnZV9sZXZlbCA/Ci0JCQkgIkxldmVsIiA6ICJFZGdlIik7CisJCUFDUElfTEVWRUxfU0VOU0lUSVZFID09IGV4dF9pcnFfZGF0YS0+ZWRnZV9sZXZlbCA/CisJCQkiTGV2ZWwiIDogIkVkZ2UiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBY3RpdmUgJXNcbiIsCi0JCQkgQUNQSV9BQ1RJVkVfTE9XID09IGV4dF9pcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8KLQkJCSAibG93IiA6ICJoaWdoIik7CisJCUFDUElfQUNUSVZFX0xPVyA9PSBleHRfaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/CisJCQkibG93IiA6ICJoaWdoIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXNcbiIsCi0JCQkgQUNQSV9TSEFSRUQgPT0gZXh0X2lycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8KLQkJCSAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKKwkJQUNQSV9TSEFSRUQgPT0gZXh0X2lycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8KKwkJCSJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEludGVycnVwdHMgOiAlWCAoICIsCi0JCQkgZXh0X2lycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0cyk7CisJYWNwaV9vc19wcmludGYgKCIgIEludGVycnVwdHMgOiAlWCAoICIsIGV4dF9pcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZXh0X2lycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0czsgaW5kZXgrKykgewogCQlhY3BpX29zX3ByaW50ZiAoIiVYICIsIGV4dF9pcnFfZGF0YS0+aW50ZXJydXB0c1tpbmRleF0pOwpAQCAtOTc5LDkgKzk5OSwxMCBAQAogCiAJaWYoMHhGRiAhPSBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWCIsCi0JCQkJIGV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJCWV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlcyIsCi0JCQkJIGV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQkJZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwpAQCAtOTkyLDcgKzEwMTMsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdAogICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTEwOTYsNyArMTExNyw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9pcnFfbGlzdAogICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByb3V0aW5nIHRhYmxlIHRvIGR1bXAuCisgKiBQQVJBTUVURVJTOiAgcm91dGVfdGFibGUgICAgIC0gcG9pbnRlciB0byB0aGUgcm91dGluZyB0YWJsZSB0byBkdW1wLgogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTEyNCwyMCArMTE0NSwxNyBAQAogCQkJYWNwaV9vc19wcmludGYgKCJQQ0kgSVJRIFJvdXRpbmcgVGFibGUgc3RydWN0dXJlICVYLlxuIiwgY291bnQrKyk7CiAKIAkJCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzOiAlOC44WCU4LjhYXG4iLAotCQkJCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChwcnRfZWxlbWVudC0+YWRkcmVzcykpOworCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAocHJ0X2VsZW1lbnQtPmFkZHJlc3MpKTsKIAogCQkJYWNwaV9vc19wcmludGYgKCIgIFBpbjogJVhcbiIsIHBydF9lbGVtZW50LT5waW4pOwogCiAJCQlhY3BpX29zX3ByaW50ZiAoIiAgU291cmNlOiAlc1xuIiwgcHJ0X2VsZW1lbnQtPnNvdXJjZSk7CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBzb3VyY2VfaW5kZXg6ICVYXG4iLAotCQkJCQkgcHJ0X2VsZW1lbnQtPnNvdXJjZV9pbmRleCk7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgc291cmNlX2luZGV4OiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnNvdXJjZV9pbmRleCk7CiAKIAkJCWJ1ZmZlciArPSBwcnRfZWxlbWVudC0+bGVuZ3RoOwotCiAJCQlwcnRfZWxlbWVudCA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwotCi0JCQlpZigwID09IHBydF9lbGVtZW50LT5sZW5ndGgpIHsKKwkJCWlmICgwID09IHBydF9lbGVtZW50LT5sZW5ndGgpIHsKIAkJCQlkb25lID0gVFJVRTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW8uYwppbmRleCA5NzJjNzQ2Li4yM2E0ZDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW8uYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW8uYwpAQCAtODEsNjcgKzgxLDYwIEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19pb19yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50Ci0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KKwogCSpieXRlc19jb25zdW1lZCA9IDg7CiAKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0lPOwogCi0JLyoKLQkgKiBDaGVjayBEZWNvZGUKLQkgKi8KKwkvKiBDaGVjayBEZWNvZGUgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8uaW9fZGVjb2RlID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBDaGVjayBtaW5fYmFzZSBBZGRyZXNzCi0JICovCisJLyogQ2hlY2sgbWluX2Jhc2UgQWRkcmVzcyAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCi0JLyoKLQkgKiBDaGVjayBtYXhfYmFzZSBBZGRyZXNzCi0JICovCisJLyogQ2hlY2sgbWF4X2Jhc2UgQWRkcmVzcyAqLworCiAJYnVmZmVyICs9IDI7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5tYXhfYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCi0JLyoKLQkgKiBDaGVjayBCYXNlIGFsaWdubWVudAotCSAqLworCS8qIENoZWNrIEJhc2UgYWxpZ25tZW50ICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLmFsaWdubWVudCA9IHRlbXA4OwogCi0JLyoKLQkgKiBDaGVjayByYW5nZV9sZW5ndGgKLQkgKi8KKwkvKiBDaGVjayByYW5nZV9sZW5ndGggKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8ucmFuZ2VfbGVuZ3RoID0gdGVtcDg7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTc5LDQzICsxNzIsMzkgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2ZpeGVkX2lvX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gNDsKIAogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRklYRURfSU87CiAKLQkvKgotCSAqIENoZWNrIFJhbmdlIEJhc2UgQWRkcmVzcwotCSAqLworCS8qIENoZWNrIFJhbmdlIEJhc2UgQWRkcmVzcyAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9pby5iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIENoZWNrIHJhbmdlX2xlbmd0aAotCSAqLworCS8qIENoZWNrIHJhbmdlX2xlbmd0aCAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9pby5yYW5nZV9sZW5ndGggPSB0ZW1wODsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0yNTEsNTUgKzI0MCw0OCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19pb19zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDQ3OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBJbyBJbmZvcm1hdGlvbiBCeXRlCi0JICovCisJLyogSW8gSW5mb3JtYXRpb24gQnl0ZSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5pby5pb19kZWNvZGUgJiAweDAxKTsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLmlvLm1pbl9iYXNlX2FkZHJlc3M7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzICovCisKIAl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5pby5tYXhfYmFzZV9hZGRyZXNzOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50Ci0JICovCisJLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLworCiAJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmlvLmFsaWdubWVudDsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSByYW5nZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLworCiAJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmlvLnJhbmdlX2xlbmd0aDsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zMzUsMzIgKzMxNywyOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9pb19zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDRCOwogCiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBiYXNlIGFkZHJlc3MgKi8KKwogCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX2lvLmJhc2VfYWRkcmVzczsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSByYW5nZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLworCiAJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX2lvLnJhbmdlX2xlbmd0aDsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zOTksMjEgKzM3NywyMCBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZG1hX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0RNQTsKIAotCS8qCi0JICogUG9pbnQgdG8gdGhlIDgtYml0cyBvZiBCeXRlIDEKLQkgKi8KKwkvKiBQb2ludCB0byB0aGUgOC1iaXRzIG9mIEJ5dGUgMSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC00MzAsNDYgKzQwNyw0MCBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEubnVtYmVyX29mX2NoYW5uZWxzID0gaTsKIAlpZiAoaSA+IDApIHsKLQkJLyoKLQkJICogQ2FsY3VsYXRlIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiYXNlZCB1cG9uIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cwotCQkgKi8KKwkJLyogQ2FsY3VsYXRlIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiYXNlZCB1cG9uIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCiAJCXN0cnVjdF9zaXplICs9ICgoYWNwaV9zaXplKSBpIC0gMSkgKiA0OwogCX0KIAotCS8qCi0JICogUG9pbnQgdG8gQnl0ZSAyCi0JICovCisJLyogUG9pbnQgdG8gQnl0ZSAyICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKLQkvKgotCSAqIENoZWNrIGZvciB0cmFuc2ZlciBwcmVmZXJlbmNlIChCaXRzWzE6MF0pCi0JICovCisJLyogQ2hlY2sgZm9yIHRyYW5zZmVyIHByZWZlcmVuY2UgKEJpdHNbMTowXSkgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLnRyYW5zZmVyID0gdGVtcDggJiAweDAzOwogCiAJaWYgKDB4MDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHJhbnNmZXIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIERNQS5UcmFuc2ZlciBwcmVmZXJlbmNlICgzKVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJJbnZhbGlkIERNQS5UcmFuc2ZlciBwcmVmZXJlbmNlICgzKVxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKIAl9CiAKLQkvKgotCSAqIEdldCBidXMgbWFzdGVyIHByZWZlcmVuY2UgKEJpdFsyXSkKLQkgKi8KKwkvKiBHZXQgYnVzIG1hc3RlciBwcmVmZXJlbmNlIChCaXRbMl0pICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS5idXNfbWFzdGVyID0gKHRlbXA4ID4+IDIpICYgMHgwMTsKIAotCS8qCi0JICogR2V0IGNoYW5uZWwgc3BlZWQgc3VwcG9ydCAoQml0c1s2OjVdKQotCSAqLworCS8qIEdldCBjaGFubmVsIHNwZWVkIHN1cHBvcnQgKEJpdHNbNjo1XSkgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLnR5cGUgPSAodGVtcDggPj4gNSkgJiAweDAzOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTUwNiwxNiArNDc3LDE0IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2RtYV9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDJBOwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gMDsKIAotCS8qCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgQ2hhbm5lbHMgYW5kIHNldCB0aGUgbWFzayBiaXRzCi0JICovCisJLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgQ2hhbm5lbHMgYW5kIHNldCB0aGUgbWFzayBiaXRzICovCisKIAlmb3IgKGluZGV4ID0gMDsKIAkJIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVsczsKIAkJIGluZGV4KyspIHsKQEAgLTUyNiw5ICs0OTUsOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBETUEgSW5mbwotCSAqLworCS8qIFNldCB0aGUgRE1BIEluZm8gKi8KKwogCXRlbXA4ID0gKHU4KSAoKGxpbmtlZF9saXN0LT5kYXRhLmRtYS50eXBlICYgMHgwMykgPDwgNSk7CiAJdGVtcDggfD0gKChsaW5rZWRfbGlzdC0+ZGF0YS5kbWEuYnVzX21hc3RlciAmIDB4MDEpIDw8IDIpOwogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5kbWEudHJhbnNmZXIgJiAweDAzKTsKQEAgLTUzNiw5ICs1MDQsOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKaW5kZXggZmQwN2E4Ny4uOGEyYjYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYwpAQCAtODMsNyArODMsOCBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaXJxX3Jlc291cmNlIik7CkBAIC05MSwxNSArOTIsMTQgQEAKIAogCS8qCiAJICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgY29udGFpbmVkIGluIHRoZSBkZXNjcmlwdG9yCi0JICogIChCaXRzOjAtMSkKKwkgKiAoQml0czowLTEpCiAJICovCiAJdGVtcDggPSAqYnVmZmVyOwogCSpieXRlc19jb25zdW1lZCA9ICh0ZW1wOCAmIDB4MDMpICsgMTsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0lSUTsKIAotCS8qCi0JICogUG9pbnQgdG8gdGhlIDE2LWJpdHMgb2YgQnl0ZXMgMSBhbmQgMgotCSAqLworCS8qIFBvaW50IHRvIHRoZSAxNi1iaXRzIG9mIEJ5dGVzIDEgYW5kIDIgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtMTE4LDIyICsxMTgsMTkgQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID0gaTsKIAlpZiAoaSA+IDApIHsKLQkJLyoKLQkJICogQ2FsY3VsYXRlIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiYXNlZCB1cG9uIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cwotCQkgKi8KKwkJLyogQ2FsY3VsYXRlIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiYXNlZCB1cG9uIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCiAJCXN0cnVjdF9zaXplICs9ICgoYWNwaV9zaXplKSBpIC0gMSkgKiA0OwogCX0KIAotCS8qCi0JICogUG9pbnQgdG8gQnl0ZSAzIGlmIGl0IGlzIHVzZWQKLQkgKi8KKwkvKiBQb2ludCB0byBCeXRlIDMgaWYgaXQgaXMgdXNlZCAqLworCiAJaWYgKDQgPT0gKmJ5dGVzX2NvbnN1bWVkKSB7CiAJCWJ1ZmZlciArPSAyOwogCQl0ZW1wOCA9ICpidWZmZXI7CiAKLQkJLyoKLQkJICogQ2hlY2sgZm9yIEhFLCBMTCBpbnRlcnJ1cHRzCi0JCSAqLworCQkvKiBDaGVjayBmb3IgSEUsIExMIGludGVycnVwdHMgKi8KKwogCQlzd2l0Y2ggKHRlbXA4ICYgMHgwOSkgewogCQljYXNlIDB4MDE6IC8qIEhFICovCiAJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5lZGdlX2xldmVsID0gQUNQSV9FREdFX1NFTlNJVElWRTsKQEAgLTE1MiwxMyArMTQ5LDEzIEBACiAJCQkgKiBzbyAweDAwIGFuZCAweDA5IGFyZSBpbGxlZ2FsLgogCQkJICovCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiSW52YWxpZCBpbnRlcnJ1cHQgcG9sYXJpdHkvdHJpZ2dlciBpbiByZXNvdXJjZSBsaXN0LCAlWFxuIiwgdGVtcDgpKTsKKwkJCQkiSW52YWxpZCBpbnRlcnJ1cHQgcG9sYXJpdHkvdHJpZ2dlciBpbiByZXNvdXJjZSBsaXN0LCAlWFxuIiwKKwkJCQl0ZW1wOCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CiAJCX0KIAotCQkvKgotCQkgKiBDaGVjayBmb3Igc2hhcmFibGUKLQkJICovCisJCS8qIENoZWNrIGZvciBzaGFyYWJsZSAqLworCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSAodGVtcDggPj4gMykgJiAweDAxOwogCX0KIAllbHNlIHsKQEAgLTE3MSwxNCArMTY4LDEyIEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX0VYQ0xVU0lWRTsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMjM0LDkgKzIyOSw4IEBACiAJYnVmZmVyICs9IDE7CiAJdGVtcDE2ID0gMDsKIAotCS8qCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgaW50ZXJydXB0cyBhbmQgc2V0IHRoZSBtYXNrIGJpdHMKLQkgKi8KKwkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbnRlcnJ1cHRzIGFuZCBzZXQgdGhlIG1hc2sgYml0cyAqLworCiAJZm9yKGluZGV4ID0gMDsKIAkJaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHM7CiAJCWluZGV4KyspIHsKQEAgLTI0Nyw5ICsyNDEsOCBAQAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBJUlEgSW5mbyBieXRlIGlmIG5lZWRlZC4KLQkgKi8KKwkvKiBTZXQgdGhlIElSUSBJbmZvIGJ5dGUgaWYgbmVlZGVkLiAqLworCiAJaWYgKElScWluZm9fYnl0ZV9uZWVkZWQpIHsKIAkJdGVtcDggPSAwOwogCQl0ZW1wOCA9ICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmCkBAIC0yNjcsOSArMjYwLDggQEAKIAkJYnVmZmVyICs9IDE7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTMwOSwxNSArMzAxLDE1IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtMzMwLDkgKzMyMiw4IEBACiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0VYVF9JUlE7CiAKLQkvKgotCSAqIFBvaW50IHRvIHRoZSBCeXRlMwotCSAqLworCS8qIFBvaW50IHRvIHRoZSBCeXRlMyAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC0zNDcsMjEgKzMzOCwxOCBAQAogCSAqIC0gRWRnZS9MZXZlbCBhcmUgZGVmaW5lZCBvcHBvc2l0ZSBpbiB0aGUgdGFibGUgdnMgdGhlIGhlYWRlcnMKIAkgKi8KIAlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsID0KLQkJCSAgICh0ZW1wOCAmIDB4MikgPyBBQ1BJX0VER0VfU0VOU0lUSVZFIDogQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJCSh0ZW1wOCAmIDB4MikgPyBBQ1BJX0VER0VfU0VOU0lUSVZFIDogQUNQSV9MRVZFTF9TRU5TSVRJVkU7CiAKLQkvKgotCSAqIENoZWNrIEludGVycnVwdCBQb2xhcml0eQotCSAqLworCS8qIENoZWNrIEludGVycnVwdCBQb2xhcml0eSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93ID0gKHRlbXA4ID4+IDIpICYgMHgxOwogCi0JLyoKLQkgKiBDaGVjayBmb3Igc2hhcmFibGUKLQkgKi8KKwkvKiBDaGVjayBmb3Igc2hhcmFibGUgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnNoYXJlZF9leGNsdXNpdmUgPSAodGVtcDggPj4gMykgJiAweDAxOwogCi0JLyoKLQkgKiBQb2ludCB0byBCeXRlNCAoSVJRIFRhYmxlIGxlbmd0aCkKLQkgKi8KKwkvKiBQb2ludCB0byBCeXRlNCAoSVJRIFRhYmxlIGxlbmd0aCkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtMzc5LDE0ICszNjcsMTIgQEAKIAkgKi8KIAlzdHJ1Y3Rfc2l6ZSArPSAodGVtcDggLSAxKSAqIDQ7CiAKLQkvKgotCSAqIFBvaW50IHRvIEJ5dGU1IChGaXJzdCBJUlEgTnVtYmVyKQotCSAqLworCS8qIFBvaW50IHRvIEJ5dGU1IChGaXJzdCBJUlEgTnVtYmVyKSAqLworCiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIEN5Y2xlIHRocm91Z2ggZXZlcnkgSVJRIGluIHRoZSB0YWJsZQotCSAqLworCS8qIEN5Y2xlIHRocm91Z2ggZXZlcnkgSVJRIGluIHRoZSB0YWJsZSAqLworCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVtcDg7IGluZGV4KyspIHsKIAkJQUNQSV9NT1ZFXzMyX1RPXzMyICgKIAkJCSZvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzW2luZGV4XSwgYnVmZmVyKTsKQEAgLTQwNyw3ICszOTMsOCBAQAogCSAqIHdlIGFkZCAxIHRvIHRoZSBsZW5ndGguCiAJICovCiAJaWYgKCpieXRlc19jb25zdW1lZCA+Ci0JCSgoYWNwaV9zaXplKSBvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAqIDQpICsgKDUgKyAxKSkgeworCQkoKGFjcGlfc2l6ZSkgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgKiA0KSArCisJCSg1ICsgMSkpIHsKIAkJLyogRGVyZWZlcmVuY2UgdGhlIEluZGV4ICovCiAKIAkJdGVtcDggPSAqYnVmZmVyOwpAQCAtNDE3LDEzICs0MDQsMTMgQEAKIAogCQlidWZmZXIgKz0gMTsKIAotCQkvKgotCQkgKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZS4KLQkJICovCisJCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlLiAqLworCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KIAkJCQkoY2hhciAqKSgoY2hhciAqKSBvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCi0JCXRlbXBfcHRyID0gKHU4ICopIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQl0ZW1wX3B0ciA9ICh1OCAqKQorCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKIAkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCkBAIC00MzYsOSArNDIzLDggQEAKIAkJCWluZGV4ICs9IDE7CiAJCX0KIAotCQkvKgotCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwKLQkJICovCisJCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLworCiAJCSp0ZW1wX3B0ciA9IDB4MDA7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOwogCkBAIC00NTYsMTQgKzQ0MiwxMiBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTUwMSwyMSArNDg1LDE4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2V4dGVuZGVkX2lycV9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDg5OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIKLQkgKi8KKwkvKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwogCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBJbnRlcnJ1cHQgdmVjdG9yIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSBJbnRlcnJ1cHQgdmVjdG9yIGZsYWdzICovCisKIAl0ZW1wOCA9ICh1OCkobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7CiAJdGVtcDggfD0gKChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmIDB4MDEpIDw8IDMpOwogCkBAIC01MzIsMTcgKzUxMywxNSBAQAogCQl0ZW1wOCB8PSAweDI7CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIEludGVycnVwdCBQb2xhcml0eQotCSAqLworCS8qIFNldCB0aGUgSW50ZXJydXB0IFBvbGFyaXR5ICovCisKIAl0ZW1wOCB8PSAoKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgJiAweDEpIDw8IDIpOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIEludGVycnVwdCB0YWJsZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIEludGVycnVwdCB0YWJsZSBsZW5ndGggKi8KKwogCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHM7CiAKIAkqYnVmZmVyID0gdGVtcDg7CkBAIC01NTUsMTggKzUzNCwxNiBAQAogCQlidWZmZXIgKz0gNDsKIAl9CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbAotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCAqLworCiAJaWYgKDAgIT0gbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7CiAJCSpidWZmZXIgPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAJCWJ1ZmZlciArPSAxOwogCiAJCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDb3B5IHRoZSBzdHJpbmcKLQkJICovCisJCS8qIENvcHkgdGhlIHN0cmluZyAqLworCiAJCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCiAJCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCkBAIC01NzQsMTIgKzU1MSwxMiBAQAogCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKIAkJICogdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOIChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPSAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4gKAorCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKaW5kZXggZTQ5YzFlMC4uZGI3YmNiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCkBAIC01NSw3ICs1NSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIHJlc291cmNlX3N0YXJ0X2J5dGUgICAgIC0gQnl0ZSAwIG9mIGEgcmVzb3VyY2UgZGVzY3JpcHRvcgogICoKLSAqIFJFVFVSTjogICAgICBUaGUgUmVzb3VyY2UgVHlwZSAoTmFtZSkgd2l0aCBubyBleHRyYW5lb3VzIGJpdHMKKyAqIFJFVFVSTjogICAgICBUaGUgUmVzb3VyY2UgVHlwZSB3aXRoIG5vIGV4dHJhbmVvdXMgYml0cwogICoKICAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBSZXNvdXJjZSBUeXBlL05hbWUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZgogICogICAgICAgICAgICAgIGEgcmVzb3VyY2UgZGVzY3JpcHRvci4KQEAgLTcwLDI4ICs3MCwyNSBAQAogCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CiAKIAotCS8qCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBzbWFsbCBvciBsYXJnZSByZXNvdXJjZQotCSAqLworCS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc21hbGwgb3IgbGFyZ2UgcmVzb3VyY2UgKi8KKwogCXN3aXRjaCAocmVzb3VyY2Vfc3RhcnRfYnl0ZSAmIEFDUElfUkRFU0NfVFlQRV9NQVNLKSB7CiAJY2FzZSBBQ1BJX1JERVNDX1RZUEVfU01BTEw6CiAKLQkJLyoKLQkJICogU21hbGwgUmVzb3VyY2UgVHlwZSAtLSBPbmx5IGJpdHMgNjozIGFyZSB2YWxpZAotCQkgKi8KKwkJLyogU21hbGwgUmVzb3VyY2UgVHlwZSAtLSBPbmx5IGJpdHMgNjozIGFyZSB2YWxpZCAqLworCiAJCXJldHVybiAoKHU4KSAocmVzb3VyY2Vfc3RhcnRfYnl0ZSAmIEFDUElfUkRFU0NfU01BTExfTUFTSykpOwogCiAKIAljYXNlIEFDUElfUkRFU0NfVFlQRV9MQVJHRToKIAotCQkvKgotCQkgKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIEFsbCBiaXRzIGFyZSB2YWxpZAotCQkgKi8KKwkJLyogTGFyZ2UgUmVzb3VyY2UgVHlwZSAtLSBBbGwgYml0cyBhcmUgdmFsaWQgKi8KKwogCQlyZXR1cm4gKHJlc291cmNlX3N0YXJ0X2J5dGUpOwogCiAKIAlkZWZhdWx0OgotCQkvKiBObyBvdGhlciB0eXBlcyBvZiByZXNvdXJjZSBkZXNjcmlwdG9yICovCisJCS8qIEludmFsaWQgdHlwZSAqLwogCQlicmVhazsKIAl9CiAKQEAgLTEzNSw5ICsxMzIsOCBAQAogCiAJd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGggJiYKIAkJCSFlbmRfdGFnX3Byb2Nlc3NlZCkgewotCQkvKgotCQkgKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUKLQkJICovCisJCS8qIFRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbSBpcyB0aGUgcmVzb3VyY2UgdHlwZSAqLworCiAJCXJlc291cmNlX3R5cGUgPSBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlICgqYnl0ZV9zdHJlYW1fYnVmZmVyKTsKIAogCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKQEAgLTI5OSwyOCArMjk1LDIzIEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIAotCQkvKgotCQkgKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlcgotCQkgKi8KKwkJLyogVXBkYXRlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50ZXIgKi8KKwogCQlieXRlc19wYXJzZWQgKz0gYnl0ZXNfY29uc3VtZWQ7CiAKLQkJLyoKLQkJICogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBwb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZQotCQkgKi8KKwkJLyogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBwb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZSAqLworCiAJCWJ5dGVfc3RyZWFtX2J1ZmZlciArPSBieXRlc19jb25zdW1lZDsKIAotCQkvKgotCQkgKiBTZXQgdGhlIEJ1ZmZlciB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUKLQkJICovCisJCS8qIFNldCB0aGUgQnVmZmVyIHRvIHRoZSBuZXh0IHN0cnVjdHVyZSAqLworCiAJCXJlc291cmNlID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlcik7CiAJCXJlc291cmNlLT5sZW5ndGggPSAodTMyKSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUgKHJlc291cmNlLT5sZW5ndGgpOwogCQlidWZmZXIgKz0gQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChzdHJ1Y3R1cmVfc2l6ZSk7CisJfQogCi0JfSAvKiAgZW5kIHdoaWxlICovCisJLyogQ2hlY2sgdGhlIHJlYXNvbiBmb3IgZXhpdGluZyB0aGUgd2hpbGUgbG9vcCAqLwogCi0JLyoKLQkgKiBDaGVjayB0aGUgcmVhc29uIGZvciBleGl0aW5nIHRoZSB3aGlsZSBsb29wCi0JICovCiAJaWYgKCFlbmRfdGFnX3Byb2Nlc3NlZCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKIAl9CkBAIC00MjQsOSArNDE1LDggQEAKIAkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9yc19lbmRfdGFnX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CiAKLQkJCS8qCi0JCQkgKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBSZXNvdXJjZSBUZW1wbGF0ZQotCQkJICovCisJCQkvKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBSZXNvdXJjZSBUZW1wbGF0ZSAqLworCiAJCQlkb25lID0gVFJVRTsKIAkJCWJyZWFrOwogCkBAIC00ODgsMjcgKzQ3OCwyNSBAQAogCQlkZWZhdWx0OgogCQkJLyoKIAkJCSAqIElmIHdlIGdldCBoZXJlLCBldmVyeXRoaW5nIGlzIG91dCBvZiBzeW5jLAotCQkJICogIHNvIGV4aXQgd2l0aCBhbiBlcnJvcgorCQkJICogc28gZXhpdCB3aXRoIGFuIGVycm9yCiAJCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgKCVYKSBpbiByZXNvdXJjZSBsaXN0XG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwKIAkJCQlsaW5rZWRfbGlzdC0+aWQpKTsKIAkJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQkJYnJlYWs7Ci0KLQkJfSAvKiBzd2l0Y2ggKGxpbmtlZF9saXN0LT5JZCkgKi8KKwkJfQogCiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCi0JCS8qCi0JCSAqIFNldCB0aGUgQnVmZmVyIHRvIHBvaW50IHRvIHRoZSBvcGVuIGJ5dGUKLQkJICovCisJCS8qIFNldCB0aGUgQnVmZmVyIHRvIHBvaW50IHRvIHRoZSBvcGVuIGJ5dGUgKi8KKwogCQlidWZmZXIgKz0gYnl0ZXNfY29uc3VtZWQ7CiAKLQkJLyoKLQkJICogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0Ci0JCSAqLworCQkvKiBQb2ludCB0byB0aGUgbmV4dCBvYmplY3QgKi8KKwogCQlsaW5rZWRfbGlzdCA9IEFDUElfUFRSX0FERCAoc3RydWN0IGFjcGlfcmVzb3VyY2UsCiAJCQkJICBsaW5rZWRfbGlzdCwgbGlua2VkX2xpc3QtPmxlbmd0aCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCmluZGV4IDdjOTM1YWUuLjkxZDAyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKQEAgLTgxLDE1ICs4MSwxNSBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbWVtb3J5MjRfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CkBAIC05Nyw0OCArOTcsNDEgQEAKIAkqYnl0ZXNfY29uc3VtZWQgPSAoYWNwaV9zaXplKSB0ZW1wMTYgKyAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfTUVNMjQ7CiAKLQkvKgotCSAqIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQKLQkgKi8KKwkvKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0ICovCisKIAl0ZW1wOCA9ICpidWZmZXI7CiAJYnVmZmVyICs9IDE7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNSkKLQkgKi8KKwkvKiBHZXQgbWluX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC01KSAqLworCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQubWluX2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAotCS8qCi0JICogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDYtNykKLQkgKi8KKwkvKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNi03KSAqLworCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAotCS8qCi0JICogR2V0IEFsaWdubWVudCAoQnl0ZXMgOC05KQotCSAqLworCS8qIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDgtOSkgKi8KKwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCA9IHRlbXAxNjsKIAotCS8qCi0JICogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTAtMTEpCi0JICovCisJLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTAtMTEpICovCisKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5yYW5nZV9sZW5ndGggPSB0ZW1wMTY7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTc0LDUzICsxNjcsNDUgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbWVtb3J5MjRfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4MTsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJdGVtcDE2ID0gMHgwOTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZQotCSAqLworCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWluX2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0Lm1heF9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50Ci0JICovCisJLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIHJhbmdlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMjU4LDE1ICsyNDMsMTUgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwpAQCAtMjg1LDQ1ICsyNzAsMzggQEAKIAkgKiAgNCAqIHNpemVvZihSRVNPVVJDRV9EQVRBKSBpbnN0ZWFkIG9mIDQgKiBzaXplb2YodTgpCiAJICovCiAKLQkvKgotCSAqIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQKLQkgKi8KKwkvKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0ICovCisKIAl0ZW1wOCA9ICpidWZmZXI7CiAJYnVmZmVyICs9IDE7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgbWluX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KQotCSAqLworCS8qIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTcpICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA4LTExKQotCSAqLworCS8qIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA4LTExKSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzLCBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBHZXQgQWxpZ25tZW50IChCeXRlcyAxMi0xNSkKLQkgKi8KKwkvKiBHZXQgQWxpZ25tZW50IChCeXRlcyAxMi0xNSkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50LCBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxNi0xOSkKLQkgKi8KKwkvKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxNi0xOSkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoLCBidWZmZXIpOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTM2MSwxNSArMzM5LDE1IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTM3OCwzMiArMzU2LDI4IEBACiAKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOwogCi0JLyoKLQkgKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0Ci0JICovCisJLyogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdCAqLworCiAJdGVtcDggPSAqYnVmZmVyOwogCWJ1ZmZlciArPSAxOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCByYW5nZV9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykKLQkgKi8KLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2Jhc2VfYWRkcmVzcywgYnVmZmVyKTsKKwkvKiBHZXQgcmFuZ2VfYmFzZV9hZGRyZXNzIChCeXRlcyA0LTcpICovCisKKwlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2Jhc2VfYWRkcmVzcywKKwkJYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgOC0xMSkKLQkgKi8KKwkvKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyA4LTExKSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNDM5LDU0ICs0MTMsNDYgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4NTsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJdGVtcDE2ID0gMHgxMTsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlCi0JICovCisJLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7CiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIubWF4X2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQKLQkgKi8KKwkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLmFsaWdubWVudCk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgcmFuZ2UgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC01MjIsNDQgKzQ4OCwzOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9tZW1vcnkzMl9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDg2OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljICovCisKIAl0ZW1wMTYgPSAweDA5OwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUKLQkgKi8KKwkvKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBiYXNlIGFkZHJlc3MgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLAotCQkJICZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MpOworCQkmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSByYW5nZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCQkgJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CisJCSZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCmluZGV4IGQxNmJlNDQuLmExZjE3NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYwpAQCAtODQsMjQgKzg0LDIwIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF90YWdfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSAyOwogCi0JLyoKLQkgKiAgRmlsbCBvdXQgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qICBGaWxsIG91dCB0aGUgc3RydWN0dXJlICovCisKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0VORF9UQUc7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gMDsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xMzYsOSArMTMyLDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX3RhZ19zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDc5OwogCWJ1ZmZlciArPSAxOwogCkBAIC0xNTEsOSArMTQ2LDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTkyLDIxICsxODYsMjAgQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcik7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3ZlbmRvcl9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIERlcmVmZXJlbmNlIHRoZSBEZXNjcmlwdG9yIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uCi0JICovCisJLyogRGVyZWZlcmVuY2UgdGhlIERlc2NyaXB0b3IgdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4gKi8KKwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCWlmICh0ZW1wOCAmIDB4ODApIHsKLQkJLyoKLQkJICogTGFyZ2UgSXRlbSwgcG9pbnQgdG8gdGhlIGxlbmd0aCBmaWVsZAotCQkgKi8KKwkJLyogTGFyZ2UgSXRlbSwgcG9pbnQgdG8gdGhlIGxlbmd0aCBmaWVsZCAqLworCiAJCWJ1ZmZlciArPSAxOwogCiAJCS8qIERlcmVmZXJlbmNlICovCkBAIC0yMjIsOSArMjE1LDggQEAKIAkJYnVmZmVyICs9IDI7CiAJfQogCWVsc2UgewotCQkvKgotCQkgKiBTbWFsbCBJdGVtLCBkZXJlZmVyZW5jZSB0aGUgc2l6ZQotCQkgKi8KKwkJLyogU21hbGwgSXRlbSwgZGVyZWZlcmVuY2UgdGhlIHNpemUgKi8KKwogCQl0ZW1wMTYgPSAodTgpKCpidWZmZXIgJiAweDA3KTsKIAogCQkvKiBDYWxjdWxhdGUgYnl0ZXMgY29uc3VtZWQgKi8KQEAgLTI1MSwxNCArMjQzLDEyIEBACiAJICovCiAJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wMTYpOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTI5NSwxMyArMjg1LDExIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3ZlbmRvcl9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBEZXJlZmVyZW5jZSB0aGUgbGVuZ3RoIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uCi0JICovCisJLyogRGVyZWZlcmVuY2UgdGhlIGxlbmd0aCB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLiAqLworCiAJaWYobGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aCA+IDcpIHsKLQkJLyoKLQkJICogTGFyZ2UgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkIGFuZCBsZW5ndGggYnl0ZXMKLQkJICovCisJCS8qIExhcmdlIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZCBhbmQgbGVuZ3RoIGJ5dGVzICovCisKIAkJKmJ1ZmZlciA9IDB4ODQ7CiAJCWJ1ZmZlciArPSAxOwogCkBAIC0zMTEsOSArMjk5LDggQEAKIAkJYnVmZmVyICs9IDI7CiAJfQogCWVsc2UgewotCQkvKgotCQkgKiBTbWFsbCBJdGVtLCBTZXQgdGhlIGRlc2NyaXB0b3IgZmllbGQKLQkJICovCisJCS8qIFNtYWxsIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZCAqLworCiAJCXRlbXA4ID0gMHg3MDsKIAkJdGVtcDggfD0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOwogCkBAIC0zMjEsOSArMzA4LDggQEAKIAkJYnVmZmVyICs9IDE7CiAJfQogCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBWZW5kb3IgU3BlY2lmaWMgZmllbGRzCi0JICovCisJLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgVmVuZG9yIFNwZWNpZmljIGZpZWxkcyAqLworCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsgaW5kZXgrKykgewogCQl0ZW1wOCA9IGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5yZXNlcnZlZFtpbmRleF07CiAKQEAgLTMzMSw5ICszMTcsOCBAQAogCQlidWZmZXIgKz0gMTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzcwLDQwICszNTUsMzcgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZGVzY3JpcHRvciAoQml0czowLTEpCi0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3IgKEJpdHM6MC0xKSAqLworCiAJdGVtcDggPSAqYnVmZmVyOwogCiAJKmJ5dGVzX2NvbnN1bWVkID0gKHRlbXA4ICYgMHgwMSkgKyAxOwogCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9TVEFSVF9EUEY7CiAKLQkvKgotCSAqIFBvaW50IHRvIEJ5dGUgMSBpZiBpdCBpcyB1c2VkCi0JICovCisJLyogUG9pbnQgdG8gQnl0ZSAxIGlmIGl0IGlzIHVzZWQgKi8KKwogCWlmICgyID09ICpieXRlc19jb25zdW1lZCkgewogCQlidWZmZXIgKz0gMTsKIAkJdGVtcDggPSAqYnVmZmVyOwogCi0JCS8qCi0JCSAqIENoZWNrIENvbXBhdGliaWxpdHkgcHJpb3JpdHkKLQkJICovCisJCS8qIENoZWNrIENvbXBhdGliaWxpdHkgcHJpb3JpdHkgKi8KKwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ID0gdGVtcDggJiAweDAzOwogCiAJCWlmICgzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7CiAJCX0KIAotCQkvKgotCQkgKiBDaGVjayBQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIHByZWZlcmVuY2UKLQkJICovCisJCS8qIENoZWNrIFBlcmZvcm1hbmNlL1JvYnVzdG5lc3MgcHJlZmVyZW5jZSAqLworCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgPSAodGVtcDggPj4gMikgJiAweDAzOwogCiAJCWlmICgzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpIHsKQEAgLTQxMiwyMCArMzk0LDE4IEBACiAJfQogCWVsc2UgewogCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ID0KLQkJCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKKwkJCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgPQotCQkJCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOworCQkJQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTQ2NiwyNCArNDQ2LDIwIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYyAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gMTsKIAotCS8qCi0JICogIEZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiAgRmlsbCBvdXQgdGhlIHN0cnVjdHVyZSAqLworCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9FTkRfRFBGOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTUzMyw5ICs1MDksOCBAQAogCQkqYnVmZmVyID0gMHgzMTsKIAkJYnVmZmVyICs9IDE7CiAKLQkJLyoKLQkJICogU2V0IHRoZSBQcmlvcml0eSBCeXRlIERlZmluaXRpb24KLQkJICovCisJCS8qIFNldCB0aGUgUHJpb3JpdHkgQnl0ZSBEZWZpbml0aW9uICovCisKIAkJdGVtcDggPSAwOwogCQl0ZW1wOCA9ICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyAmCiAJCQkJICAgMHgwMykgPDwgMik7CkBAIC01NDYsOSArNTIxLDggQEAKIAogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTU4MiwxNSArNTU2LDEzIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4Mzg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYwppbmRleCBlZTljZTEzLi43MDBjZjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYwpAQCAtODMsMTAgKzgzLDEwIEBACiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycwotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsICJfUFJUIiwgQUNQSV9CVFlQRV9QQUNLQUdFLCAmb2JqX2Rlc2MpOworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgTUVUSE9EX05BTUVfX1BSVCwKKwkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtMTM2LDEwICsxMzYsMTAgQEAKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzCi0JICovCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgIl9DUlMiLCBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtMTc1LDYgKzE3NSw3IEBACiAgKiAgICAgICAgICAgICAgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2FsbGVycyBidWZmZXIgaXMgdW5kZWZpbmVkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YSAoCkBAIC0xOTAsMTAgKzE5MSwxMCBAQAogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCAiX1BSUyIsIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgTUVUSE9EX05BTUVfX1BSUywKKwkJCSBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0yMTgsNiArMjE5LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9tZXRob2RfZGF0YQogICoKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBhIGhhbmRsZSB0byB0aGUgY29udGFpbmluZyBvYmplY3QKKyAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgLSBQYXRoIHRvIG1ldGhvZCwgcmVsYXRpdmUgdG8gSGFuZGxlCiAgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCiAgKgpAQCAtMjQ2LDkgKzI0OCw4IEBACiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycwotCSAqLworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCiAJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgcGF0aCwgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0zMTQsMTggKzMxNSwxNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0JLyoKLQkgKiBJbml0IHRoZSBwYXJhbSBvYmplY3QKLQkgKi8KKwkvKiBJbml0IHRoZSBwYXJhbSBvYmplY3QgKi8KKwogCXBhcmFtc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0JVRkZFUik7CiAJaWYgKCFwYXJhbXNbMF0pIHsKIAkJYWNwaV9vc19mcmVlIChidWZmZXIucG9pbnRlcik7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQkvKgotCSAqIFNldCB1cCB0aGUgcGFyYW1ldGVyIG9iamVjdAotCSAqLworCS8qIFNldCB1cCB0aGUgcGFyYW1ldGVyIG9iamVjdCAqLworCiAJcGFyYW1zWzBdLT5idWZmZXIubGVuZ3RoICA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7CiAJcGFyYW1zWzBdLT5idWZmZXIucG9pbnRlciA9IGJ1ZmZlci5wb2ludGVyOwogCXBhcmFtc1swXS0+Y29tbW9uLmZsYWdzICAgPSBBT1BPQkpfREFUQV9WQUxJRDsKQEAgLTMzNSwxMCArMzM0LDkgQEAKIAlpbmZvLnBhcmFtZXRlcnMgPSBwYXJhbXM7CiAJaW5mby5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fQVJHUzsKIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyByZXR1cm4gdmFsdWUKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlICgiX1NSUyIsICZpbmZvKTsKKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoTUVUSE9EX05BTUVfX1NSUywgJmluZm8pOwogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJLyogRGVsZXRlIGFueSByZXR1cm4gb2JqZWN0IChlc3BlY2lhbGx5IGlmIGltcGxpY2l0X3JldHVybiBpcyBlbmFibGVkKSAqLwogCkBAIC0zNDcsOSArMzQ1LDggQEAKIAkJfQogCX0KIAotCS8qCi0JICogQ2xlYW4gdXAgYW5kIHJldHVybiB0aGUgc3RhdHVzIGZyb20gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZQotCSAqLworCS8qIENsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBmcm9tIGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKi8KKwogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGFyYW1zWzBdKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jCmluZGV4IGE5Y2RjYmUuLjgzYzk0NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jCkBAIC00OSw2ICs0OSwyMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc3hmYWNlIikKIAorLyogTG9jYWwgbWFjcm9zIGZvciAxNiwzMi1iaXQgdG8gNjQtYml0IGNvbnZlcnNpb24gKi8KKworI2RlZmluZSBBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZmllbGQpICAoKG91dCktPmZpZWxkID0gKGluKS0+ZmllbGQpCisjZGVmaW5lIEFDUElfQ09QWV9BRERSRVNTKG91dCwgaW4pICAgICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2VfdHlwZSk7ICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcHJvZHVjZXJfY29uc3VtZXIpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZGVjb2RlKTsgICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluX2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4X2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYXR0cmlidXRlKTsgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZ3JhbnVsYXJpdHkpOyAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluX2FkZHJlc3NfcmFuZ2UpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4X2FkZHJlc3NfcmFuZ2UpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOyBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfbGVuZ3RoKTsgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3NvdXJjZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xODAsNiArMTk3LDcgQEAKICAqICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIG9mIHJldF9idWZmZXIgaXMgdW5kZWZpbmVkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyAoCkBAIC0zNDYsOSArMzY0LDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMiKTsKIAogCi0JLyoKLQkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlcgotCSAqLworCS8qIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSBhbmQgYnVmZmVyICovCisKIAlpZiAoKCFkZXZpY2VfaGFuZGxlKSAgICAgIHx8CiAJCSghaW5fYnVmZmVyKSAgICAgICAgICB8fAogCQkoIWluX2J1ZmZlci0+cG9pbnRlcikgfHwKQEAgLTM2MiwyMSArMzc5LDYgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMpOwogCiAKLSNkZWZpbmUgQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGZpZWxkKSAgKChvdXQpLT5maWVsZCA9IChpbiktPmZpZWxkKQotI2RlZmluZSBBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGluKSAgICAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3R5cGUpOyAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHByb2R1Y2VyX2NvbnN1bWVyKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGRlY29kZSk7ICAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGF0dHJpYnV0ZSk7ICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGdyYW51bGFyaXR5KTsgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX2xlbmd0aCk7ICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV9zb3VyY2UpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0CkBAIC00MDgsMTQgKzQxMCwxNCBAQAogCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzE2OgogCiAJCWFkZHJlc3MxNiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKikgJnJlc291cmNlLT5kYXRhOwotCQlBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGFkZHJlc3MxNik7CisJCUFDUElfQ09QWV9BRERSRVNTIChvdXQsIGFkZHJlc3MxNik7CiAJCWJyZWFrOwogCiAKIAljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MzMjoKIAogCQlhZGRyZXNzMzIgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICopICZyZXNvdXJjZS0+ZGF0YTsKLQkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMzIpOworCQlBQ1BJX0NPUFlfQUREUkVTUyAob3V0LCBhZGRyZXNzMzIpOwogCQlicmVhazsKIAogCkBAIC00MzQsNCArNDM2LDMgQEAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCBlODU4ODU1Li5jYmNkYTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTU1MywyMCArNTUzLDI5IEBACiAJICogdXBvbiBwb3NzaWJsZSBjb25maWd1cmF0aW9uIGFuZCBjdXJyZW50bHkgYWxsb2NhdGVkIHJlc291cmNlcy4KIAkgKi8KIAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRyaXZlciBzdWNjZXNzZnVsbHkgYm91bmQgdG8gZGV2aWNlXG4iKSk7CisJcmV0dXJuX1ZBTFVFKDApOworfQorCitpbnQKK2FjcGlfc3RhcnRfc2luZ2xlX29iamVjdCAoCisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0Iik7CisKKwlpZiAoIShkcml2ZXIgPSBkZXZpY2UtPmRyaXZlcikpCisJCXJldHVybl9WQUxVRSgwKTsKKwogCWlmIChkcml2ZXItPm9wcy5zdGFydCkgewogCQlyZXN1bHQgPSBkcml2ZXItPm9wcy5zdGFydChkZXZpY2UpOwogCQlpZiAocmVzdWx0ICYmIGRyaXZlci0+b3BzLnJlbW92ZSkKIAkJCWRyaXZlci0+b3BzLnJlbW92ZShkZXZpY2UsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKLQkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRHJpdmVyIHN1Y2Nlc3NmdWxseSBib3VuZCB0byBkZXZpY2VcbiIpKTsKLQotCWlmIChkcml2ZXItPm9wcy5zY2FuKSB7Ci0JCWRyaXZlci0+b3BzLnNjYW4oZGV2aWNlKTsKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7CisJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9kcml2ZXJfYXR0YWNoKHN0cnVjdCBhY3BpX2RyaXZlciAqIGRydikKQEAgLTU4Niw2ICs1OTUsNyBAQAogCiAJCWlmICghYWNwaV9idXNfbWF0Y2goZGV2LCBkcnYpKSB7CiAJCQlpZiAoIWFjcGlfYnVzX2RyaXZlcl9pbml0KGRldiwgZHJ2KSkgeworCQkJCWFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXYpOwogCQkJCWF0b21pY19pbmMoJmRydi0+cmVmZXJlbmNlcyk7CiAJCQkJY291bnQrKzsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBkcml2ZXIgWyVzXSBmb3IgZGV2aWNlIFslc11cbiIsCkBAIC0xMDA5LDggKzEwMTksOCBAQAogfQogCiAKLWludAotYWNwaV9idXNfYWRkICgKK3N0YXRpYyBpbnQKK2FjcGlfYWRkX3NpbmdsZV9vYmplY3QgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqKmNoaWxkLAogCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50LAogCWFjcGlfaGFuZGxlCQloYW5kbGUsCkBAIC0xMDE5LDcgKzEwMjksNyBAQAogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfYWRkIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hZGRfc2luZ2xlX29iamVjdCIpOwogCiAJaWYgKCFjaGlsZCkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwpAQCAtMTA1MSwxMyArMTA2MSwxNSBAQAogCS8qCiAJICogU3RhdHVzCiAJICogLS0tLS0tCi0JICogU2VlIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudC4gIFdlIGFsd2F5cyBhc3N1bWUgdGhhdCBub24tRGV2aWNlKCkKLQkgKiBvYmplY3RzIChlLmcuIHRoZXJtYWwgem9uZXMsIHBvd2VyIHJlc291cmNlcywgcHJvY2Vzc29ycywgZXRjLikgYXJlCi0JICogcHJlc2VudCwgZnVuY3Rpb25pbmcsIGV0Yy4gKGF0IGxlYXN0IHdoZW4gcGFyZW50IG9iamVjdCBpcyBwcmVzZW50KS4KLQkgKiBOb3RlIHRoYXQgX1NUQSBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3Igc29tZSBvYmplY3RzIChlLmcuCi0JICogcG93ZXIgcmVzb3VyY2VzKSBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaG93IHdlIHVzZSBpdC4KKwkgKiBTZWUgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50LiAgV2UgYWx3YXlzIGFzc3VtZSB0aGF0IG5vbi1EZXZpY2UKKwkgKiBhbmQgbm9uLVByb2Nlc3NvciBvYmplY3RzIChlLmcuIHRoZXJtYWwgem9uZXMsIHBvd2VyIHJlc291cmNlcywKKwkgKiBldGMuKSBhcmUgcHJlc2VudCwgZnVuY3Rpb25pbmcsIGV0Yy4gKGF0IGxlYXN0IHdoZW4gcGFyZW50IG9iamVjdAorCSAqIGlzIHByZXNlbnQpLiAgTm90ZSB0aGF0IF9TVEEgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIHNvbWUKKwkgKiBvYmplY3RzIChlLmcuIHBvd2VyIHJlc291cmNlcykgc28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIGhvdyB3ZSB1c2UKKwkgKiBpdC4KIAkgKi8KIAlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfQlVTX1RZUEVfUFJPQ0VTU09SOgogCWNhc2UgQUNQSV9CVVNfVFlQRV9ERVZJQ0U6CiAJCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMoZGV2aWNlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpIHx8ICFkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSB7CkBAIC0xMTQwLDcgKzExNTIsNyBAQAogCSAqCiAJICogVEJEOiBBc3N1bWVzIExETSBwcm92aWRlcyBkcml2ZXIgaG90LXBsdWcgY2FwYWJpbGl0eS4KIAkgKi8KLQlhY3BpX2J1c19maW5kX2RyaXZlcihkZXZpY2UpOworCXJlc3VsdCA9IGFjcGlfYnVzX2ZpbmRfZHJpdmVyKGRldmljZSk7CiAKIGVuZDoKIAlpZiAoIXJlc3VsdCkKQEAgLTExNTMsMTAgKzExNjUsMTAgQEAKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2J1c19hZGQpOwogCiAKLWludCBhY3BpX2J1c19zY2FuIChzdHJ1Y3QgYWNwaV9kZXZpY2UJKnN0YXJ0KQorc3RhdGljIGludCBhY3BpX2J1c19zY2FuIChzdHJ1Y3QgYWNwaV9kZXZpY2UJKnN0YXJ0LAorCQlzdHJ1Y3QgYWNwaV9idXNfb3BzICpvcHMpCiB7CiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwogCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50ID0gTlVMTDsKQEAgLTEyMjksOSArMTI0MSwyMCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2J1c19hZGQoJmNoaWxkLCBwYXJlbnQsIGNoYW5kbGUsIHR5cGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQljb250aW51ZTsKKwkJaWYgKG9wcy0+YWNwaV9vcF9hZGQpCisJCQlzdGF0dXMgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZjaGlsZCwgcGFyZW50LAorCQkJCQljaGFuZGxlLCB0eXBlKTsKKwkJIGVsc2UKKwkJCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9kZXZpY2UoY2hhbmRsZSwgJmNoaWxkKTsKKworCQkgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJIGNvbnRpbnVlOworCisJCWlmIChvcHMtPmFjcGlfb3Bfc3RhcnQpIHsKKwkJCXN0YXR1cyA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChjaGlsZCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQkJY29udGludWU7CisJCX0KIAogCQkvKgogCQkgKiBJZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQsIGVuYWJsZWQsIGFuZCBmdW5jdGlvbmluZyB0aGVuCkBAIC0xMjU3LDggKzEyODAsNTAgQEAKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfc2Nhbik7CiAKK2ludAorYWNwaV9idXNfYWRkICgKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJKipjaGlsZCwKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJKnBhcmVudCwKKwlhY3BpX2hhbmRsZQkJaGFuZGxlLAorCWludAkJCXR5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgYWNwaV9idXNfb3BzIG9wczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2FkZCIpOworCisJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdChjaGlsZCwgcGFyZW50LCBoYW5kbGUsIHR5cGUpOworCWlmICghcmVzdWx0KSB7CisJCW1lbXNldCgmb3BzLCAwLCBzaXplb2Yob3BzKSk7CisJCW9wcy5hY3BpX29wX2FkZCA9IDE7CisJCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oKmNoaWxkLCAmb3BzKTsKKwl9CisJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2FkZCk7CisKK2ludAorYWNwaV9idXNfc3RhcnQgKAorCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19zdGFydCIpOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKworCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXZpY2UpOworCWlmICghcmVzdWx0KSB7CisJCW1lbXNldCgmb3BzLCAwLCBzaXplb2Yob3BzKSk7CisJCW9wcy5hY3BpX29wX3N0YXJ0ID0gMTsKKwkJcmVzdWx0ID0gYWNwaV9idXNfc2NhbihkZXZpY2UsICZvcHMpOworCX0KKwlyZXR1cm5fVkFMVUUocmVzdWx0KTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9idXNfc3RhcnQpOwogCiBzdGF0aWMgaW50CiBhY3BpX2J1c190cmltKHN0cnVjdCBhY3BpX2RldmljZQkqc3RhcnQsCkBAIC0xMzMxLDEzICsxMzk2LDE5IEBACiAJLyoKIAkgKiBFbnVtZXJhdGUgYWxsIGZpeGVkLWZlYXR1cmUgZGV2aWNlcy4KIAkgKi8KLQlpZiAoYWNwaV9mYWR0LnB3cl9idXR0b24gPT0gMCkKLQkJcmVzdWx0ID0gYWNwaV9idXNfYWRkKCZkZXZpY2UsIGFjcGlfcm9vdCwgCisJaWYgKGFjcGlfZmFkdC5wd3JfYnV0dG9uID09IDApIHsKKwkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCiAJCQlOVUxMLCBBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTik7CisJCWlmICghcmVzdWx0KQorCQkJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGRldmljZSk7CisJfQogCi0JaWYgKGFjcGlfZmFkdC5zbGVlcF9idXR0b24gPT0gMCkKLQkJcmVzdWx0ID0gYWNwaV9idXNfYWRkKCZkZXZpY2UsIGFjcGlfcm9vdCwgCisJaWYgKGFjcGlfZmFkdC5zbGVlcF9idXR0b24gPT0gMCkgeworCQlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZkZXZpY2UsIGFjcGlfcm9vdCwKIAkJCU5VTEwsIEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXN1bHQgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2aWNlKTsKKwl9CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KQEAgLTEzNDYsNiArMTQxNyw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NjYW5faW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3NjYW5faW5pdCIpOwogCkBAIC0xMzU3LDE3ICsxNDI5LDIzIEBACiAJLyoKIAkgKiBDcmVhdGUgdGhlIHJvb3QgZGV2aWNlIGluIHRoZSBidXMncyBkZXZpY2UgdHJlZQogCSAqLwotCXJlc3VsdCA9IGFjcGlfYnVzX2FkZCgmYWNwaV9yb290LCBOVUxMLCBBQ1BJX1JPT1RfT0JKRUNULCAKKwlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZhY3BpX3Jvb3QsIE5VTEwsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCUFDUElfQlVTX1RZUEVfU1lTVEVNKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIERvbmU7CiAKKwlyZXN1bHQgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoYWNwaV9yb290KTsKKwogCS8qCiAJICogRW51bWVyYXRlIGRldmljZXMgaW4gdGhlIEFDUEkgbmFtZXNwYWNlLgogCSAqLwogCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW5fZml4ZWQoYWNwaV9yb290KTsKLQlpZiAoIXJlc3VsdCkgCi0JCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oYWNwaV9yb290KTsKKwlpZiAoIXJlc3VsdCkgeworCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOworCQlvcHMuYWNwaV9vcF9hZGQgPSAxOworCQlvcHMuYWNwaV9vcF9zdGFydCA9IDE7CisJCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oYWNwaV9yb290LCAmb3BzKTsKKwl9CiAKIAlpZiAocmVzdWx0KQogCQlhY3BpX2RldmljZV91bnJlZ2lzdGVyKGFjcGlfcm9vdCwgQUNQSV9CVVNfUkVNT1ZBTF9OT1JNQUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKaW5kZXggMGE1ZDJhOS4uNzI0OWJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIHNsZWVwLmMgLSBBQ1BJIHNsZWVwIHN1cHBvcnQuCiAgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXhleSBTdGFyaWtvdnNraXkgPGFsZXhleS55LnN0YXJpa292c2tpeUBpbnRlbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBQYXRyaWNrIE1vY2hlbAogICogQ29weXJpZ2h0IChjKSAyMDAzIE9wZW4gU291cmNlIERldmVsb3BtZW50IExhYgpAQCAtMTQsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KICNpbmNsdWRlICJzbGVlcC5oIgpAQCAtMjcsMTAgKzI3LDExIEBACiBleHRlcm4gdm9pZCBkb19zdXNwZW5kX2xvd2xldmVsKHZvaWQpOwogCiBzdGF0aWMgdTMyIGFjcGlfc3VzcGVuZF9zdGF0ZXNbXSA9IHsKLQlbUE1fU1VTUEVORF9PTl0JCT0gQUNQSV9TVEFURV9TMCwKLQlbUE1fU1VTUEVORF9TVEFOREJZXQk9IEFDUElfU1RBVEVfUzEsCi0JW1BNX1NVU1BFTkRfTUVNXQk9IEFDUElfU1RBVEVfUzMsCi0JW1BNX1NVU1BFTkRfRElTS10JPSBBQ1BJX1NUQVRFX1M0LAorCVtQTV9TVVNQRU5EX09OXSA9IEFDUElfU1RBVEVfUzAsCisJW1BNX1NVU1BFTkRfU1RBTkRCWV0gPSBBQ1BJX1NUQVRFX1MxLAorCVtQTV9TVVNQRU5EX01FTV0gPSBBQ1BJX1NUQVRFX1MzLAorCVtQTV9TVVNQRU5EX0RJU0tdID0gQUNQSV9TVEFURV9TNCwKKwlbUE1fU1VTUEVORF9NQVhdID0gQUNQSV9TVEFURV9TNQogfTsKIAogc3RhdGljIGludCBpbml0XzgyNTlBX2FmdGVyX1MxOwpAQCAtNDQsMzAgKzQ1LDIwIEBACiAgKgl3YWtldXAgY29kZSB0byB0aGUgd2FraW5nIHZlY3Rvci4gCiAgKi8KIAorZXh0ZXJuIGludCBhY3BpX3NsZWVwX3ByZXBhcmUodTMyIGFjcGlfc3RhdGUpOworZXh0ZXJuIHZvaWQgYWNwaV9wb3dlcl9vZmYodm9pZCk7CisKIHN0YXRpYyBpbnQgYWNwaV9wbV9wcmVwYXJlKHN1c3BlbmRfc3RhdGVfdCBwbV9zdGF0ZSkKIHsKIAl1MzIgYWNwaV9zdGF0ZSA9IGFjcGlfc3VzcGVuZF9zdGF0ZXNbcG1fc3RhdGVdOwogCi0JaWYgKCFzbGVlcF9zdGF0ZXNbYWNwaV9zdGF0ZV0pCisJaWYgKCFzbGVlcF9zdGF0ZXNbYWNwaV9zdGF0ZV0pIHsKKwkJcHJpbnRrKCJhY3BpX3BtX3ByZXBhcmUgZG9lcyBub3Qgc3VwcG9ydCAlZCBcbiIsIHBtX3N0YXRlKTsKIAkJcmV0dXJuIC1FUEVSTTsKLQotCS8qIGRvIHdlIGhhdmUgYSB3YWtldXAgYWRkcmVzcyBmb3IgUzIgYW5kIFMzPyAqLwotCS8qIEhlcmUsIHdlIHN1cHBvcnQgb25seSBTNEJJT1MsIHRob3NlIHdlIHNldCB0aGUgd2FrZXVwIGFkZHJlc3MgKi8KLQkvKiBTNE9TIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBub3cgdmlhIHN3c3VzcC4uICovCi0JaWYgKHBtX3N0YXRlID09IFBNX1NVU1BFTkRfTUVNIHx8IHBtX3N0YXRlID09IFBNX1NVU1BFTkRfRElTSykgewotCQlpZiAoIWFjcGlfd2FrZXVwX2FkZHJlc3MpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcigKLQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHZpcnRfdG9fcGh5cygKLQkJCQkodm9pZCAqKWFjcGlfd2FrZXVwX2FkZHJlc3MpKTsKIAl9Ci0JQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAoYWNwaV9zdGF0ZSk7Ci0JYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKGFjcGlfc3RhdGUpOwotCXJldHVybiAwOworCXJldHVybiBhY3BpX3NsZWVwX3ByZXBhcmUoYWNwaV9zdGF0ZSk7CiB9CiAKLQogLyoqCiAgKglhY3BpX3BtX2VudGVyIC0gQWN0dWFsbHkgZW50ZXIgYSBzbGVlcCBzdGF0ZS4KICAqCUBwbV9zdGF0ZToJCVN0YXRlIHdlJ3JlIGVudGVyaW5nLgpAQCAtOTIsMTEgKzgzLDkgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKGFjcGlfc3RhdGUpOwotCXN3aXRjaCAocG1fc3RhdGUpCi0JeworCXN3aXRjaCAocG1fc3RhdGUpIHsKIAljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKIAkJYmFycmllcigpOwogCQlzdGF0dXMgPSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKGFjcGlfc3RhdGUpOwpAQCAtMTEyLDYgKzEwMSwxMCBAQAogCQllbHNlCiAJCQlkb19zdXNwZW5kX2xvd2xldmVsX3M0YmlvcygpOwogCQlicmVhazsKKwljYXNlIFBNX1NVU1BFTkRfTUFYOgorCQlhY3BpX3Bvd2VyX29mZigpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyNiwxMSArMTE5LDkgQEAKIAlpZiAocG1fc3RhdGUgPiBQTV9TVVNQRU5EX1NUQU5EQlkpCiAJCWFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0oKTsKIAotCiAJcmV0dXJuIEFDUElfU1VDQ0VTUyhzdGF0dXMpID8gMCA6IC1FRkFVTFQ7CiB9CiAKLQogLyoqCiAgKglhY3BpX3BtX2ZpbmlzaCAtIEZpbmlzaCB1cCBzdXNwZW5kIHNlcXVlbmNlLgogICoJQHBtX3N0YXRlOgkJU3RhdGUgd2UncmUgY29taW5nIG91dCBvZi4KQEAgLTE1NiwyNyArMTQ3LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogaW50IGFjcGlfc3VzcGVuZCh1MzIgYWNwaV9zdGF0ZSkKIHsKIAlzdXNwZW5kX3N0YXRlX3Qgc3RhdGVzW10gPSB7Ci0JCVsxXQk9IFBNX1NVU1BFTkRfU1RBTkRCWSwKLQkJWzNdCT0gUE1fU1VTUEVORF9NRU0sCi0JCVs0XQk9IFBNX1NVU1BFTkRfRElTSywKKwkJWzFdID0gUE1fU1VTUEVORF9TVEFOREJZLAorCQlbM10gPSBQTV9TVVNQRU5EX01FTSwKKwkJWzRdID0gUE1fU1VTUEVORF9ESVNLLAorCQlbNV0gPSBQTV9TVVNQRU5EX01BWAogCX07CiAKLQlpZiAoYWNwaV9zdGF0ZSA8PSA0ICYmIHN0YXRlc1thY3BpX3N0YXRlXSkKKwlpZiAoYWNwaV9zdGF0ZSA8IDYgJiYgc3RhdGVzW2FjcGlfc3RhdGVdKQogCQlyZXR1cm4gcG1fc3VzcGVuZChzdGF0ZXNbYWNwaV9zdGF0ZV0pOwogCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgc3RydWN0IHBtX29wcyBhY3BpX3BtX29wcyA9IHsKLQkucHJlcGFyZQk9IGFjcGlfcG1fcHJlcGFyZSwKLQkuZW50ZXIJCT0gYWNwaV9wbV9lbnRlciwKLQkuZmluaXNoCQk9IGFjcGlfcG1fZmluaXNoLAorCS5wcmVwYXJlID0gYWNwaV9wbV9wcmVwYXJlLAorCS5lbnRlciA9IGFjcGlfcG1fZW50ZXIsCisJLmZpbmlzaCA9IGFjcGlfcG1fZmluaXNoLAogfTsKIAotCiAvKgogICogVG9zaGliYSBmYWlscyB0byBwcmVzZXJ2ZSBpbnRlcnJ1cHRzIG92ZXIgUzEsIHJlaW5pdGlhbGl6YXRpb24KICAqIG9mIDgyNTkgaXMgbmVlZGVkIGFmdGVyIFMxIHJlc3VtZS4KQEAgLTE5MCwxNiArMTgwLDE2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGFjcGlzbGVlcF9kbWlfdGFibGVbXSA9IHsKIAl7Ci0JCS5jYWxsYmFjayA9IGluaXRfaW50c19hZnRlcl9zMSwKLQkJLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAotCQkubWF0Y2hlcyA9IHsgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwgfSwKLQl9LAotCXsgfSwKKwkgLmNhbGxiYWNrID0gaW5pdF9pbnRzX2FmdGVyX3MxLAorCSAuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsCisJIC5tYXRjaGVzID0ge0RNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksfSwKKwkgfSwKKwl7fSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfc2xlZXBfaW5pdCh2b2lkKQogewotCWludAkJCWkgPSAwOworCWludCBpID0gMDsKIAogCWRtaV9jaGVja19zeXN0ZW0oYWNwaXNsZWVwX2RtaV90YWJsZSk7CiAKQEAgLTIwNyw3ICsxOTcsNyBAQAogCQlyZXR1cm4gMDsKIAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIoc3VwcG9ydHMiKTsKLQlmb3IgKGk9MDsgaSA8IEFDUElfU19TVEFURV9DT1VOVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFDUElfU19TVEFURV9DT1VOVDsgaSsrKSB7CiAJCWFjcGlfc3RhdHVzIHN0YXR1czsKIAkJdTggdHlwZV9hLCB0eXBlX2I7CiAJCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShpLCAmdHlwZV9hLCAmdHlwZV9iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKaW5kZXggZGEyMzc3NS4uMWZjODZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKQEAgLTMsMzUgKzMsMTAwIEBACiAgKgogICogQUtBIFM1LCBidXQgaXQgaXMgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciBvciBub3QgdGhlIGtlcm5lbCBzdXBwb3J0cwogICogYW55IG90aGVyIHNsZWVwIHN1cHBvcnQgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWxleGV5IFN0YXJpa292c2tpeSA8YWxleGV5Lnkuc3Rhcmlrb3Zza2l5QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJzbGVlcC5oIgogCi1zdGF0aWMgdm9pZAotYWNwaV9wb3dlcl9vZmYgKHZvaWQpCitpbnQgYWNwaV9zbGVlcF9wcmVwYXJlKHUzMiBhY3BpX3N0YXRlKQogewotCXByaW50aygiJXMgY2FsbGVkXG4iLF9fRlVOQ1RJT05fXyk7CisJLyogRmxhZyB0byBkbyBub3QgYWxsb3cgc2Vjb25kIHRpbWUgaW52b2NhdGlvbiBmb3IgUzUgc3RhdGUgKi8KKwlzdGF0aWMgaW50IHNodXRkb3duX3ByZXBhcmVkID0gMDsKKyNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAorCS8qIGRvIHdlIGhhdmUgYSB3YWtldXAgYWRkcmVzcyBmb3IgUzIgYW5kIFMzPyAqLworCS8qIEhlcmUsIHdlIHN1cHBvcnQgb25seSBTNEJJT1MsIHRob3NlIHdlIHNldCB0aGUgd2FrZXVwIGFkZHJlc3MgKi8KKwkvKiBTNE9TIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBub3cgdmlhIHN3c3VzcC4uICovCisJaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMyB8fCBhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzQpIHsKKwkJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCQl2aXJ0X3RvX3BoeXMoKHZvaWQgKikKKwkJCQkJCQkgICAgIGFjcGlfd2FrZXVwX2FkZHJlc3MpKTsKKworCX0KKwlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcChhY3BpX3N0YXRlKTsKKyNlbmRpZgorCWlmIChhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzUpIHsKKwkJLyogQ2hlY2sgaWYgd2Ugd2VyZSBhbHJlYWR5IGNhbGxlZCAqLworCQlpZiAoc2h1dGRvd25fcHJlcGFyZWQpCisJCQlyZXR1cm4gMDsKKwkJYWNwaV93YWtldXBfZ3BlX3Bvd2Vyb2ZmX3ByZXBhcmUoKTsKKwkJc2h1dGRvd25fcHJlcGFyZWQgPSAxOworCX0KKwlhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWNwaV9wb3dlcl9vZmYodm9pZCkKK3sKKwlwcmludGsoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNSk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkvKiBTb21lIFNNUCBtYWNoaW5lcyBvbmx5IGNhbiBwb3dlcm9mZiBpbiBib290IENQVSAqLwogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOwotCWFjcGlfd2FrZXVwX2dwZV9wb3dlcm9mZl9wcmVwYXJlKCk7Ci0JYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKEFDUElfU1RBVEVfUzUpOwotCUFDUElfRElTQUJMRV9JUlFTKCk7CiAJYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZShBQ1BJX1NUQVRFX1M1KTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGFjcGlfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKngpCit7CisJcmV0dXJuIGFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M1KTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgYWNwaV9zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJhY3BpIiksCisJLnNodXRkb3duID0gYWNwaV9zaHV0ZG93bgorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9hY3BpID0geworCS5pZCA9IDAsCisJLmNscyA9ICZhY3BpX3N5c2NsYXNzLAorfTsKKworI2VuZGlmCisKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcm9mZl9pbml0KHZvaWQpCiB7CiAJaWYgKCFhY3BpX2Rpc2FibGVkKSB7CiAJCXU4IHR5cGVfYSwgdHlwZV9iOwogCQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQkJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKEFDUElfU1RBVEVfUzUsICZ0eXBlX2EsICZ0eXBlX2IpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TNSwgJnR5cGVfYSwgJnR5cGVfYik7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJcG1fcG93ZXJfb2ZmID0gYWNwaV9wb3dlcl9vZmY7CisjaWZkZWYgQ09ORklHX1BNCisJCQl7CisJCQkJaW50IGVycm9yOworCQkJCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZhY3BpX3N5c2NsYXNzKTsKKwkJCQlpZiAoIWVycm9yKQorCQkJCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX2FjcGkpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKyNlbmRpZgorCQl9CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKaW5kZXggZmQ3YzVhMC4uMWJlOTlmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCkBAIC0xMywxMyArMTMsMTcgQEAKIAogI2luY2x1ZGUgInNsZWVwLmgiCiAKKyNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfU0xFRVAJCSJzbGVlcCIKKyNlbmRpZgorCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfQUxBUk0JCSJhbGFybSIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9XQUtFVVBfREVWSUNFICAgIndha2V1cCIKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUJCSgic2xlZXAiKQogCisjaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAogCiBzdGF0aWMgaW50IGFjcGlfc3lzdGVtX3NsZWVwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CkBAIC03OCw2ICs4Miw3IEBACiAgRG9uZToKIAlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IGNvdW50OwogfQorI2VuZGlmCS8qIENPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAgKi8KIAogc3RhdGljIGludCBhY3BpX3N5c3RlbV9hbGFybV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewpAQCAtNDUyLDYgKzQ1Nyw3IEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKKyNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9zbGVlcF9mb3BzID0gewogCS5vcGVuCQk9IGFjcGlfc3lzdGVtX3NsZWVwX29wZW5fZnMsCiAJLnJlYWQJCT0gc2VxX3JlYWQsCkBAIC00NTksNiArNDY1LDcgQEAKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKKyNlbmRpZgkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX2FsYXJtX2ZvcHMgPSB7CiAJLm9wZW4JCT0gYWNwaV9zeXN0ZW1fYWxhcm1fb3Blbl9mcywKQEAgLTQ4NCwxMSArNDkxLDEzIEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogIAorI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKIAkvKiAnc2xlZXAnIFtSL1ddKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfU0xFRVAsCiAJCQkJICBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9yb290X2Rpcik7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfc3lzdGVtX3NsZWVwX2ZvcHM7CisjZW5kaWYKIAogCS8qICdhbGFybScgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfQUxBUk0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKaW5kZXggMzM0MzI3Yy4uOTJlMGMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwpAQCAtNTAsNiArNTAsMjQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJjb252cnQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpuZXdfZ2FzX3N0cnVjdCwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdF93aWR0aCwKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MpOworCitzdGF0aWMgdm9pZAorYWNwaV90Yl9jb252ZXJ0X2ZhZHQxICgKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQsCisJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxICAgICpvcmlnaW5hbF9mYWR0KTsKKworc3RhdGljIHZvaWQKK2FjcGlfdGJfY29udmVydF9mYWR0MiAoCisJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0LAorCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqb3JpZ2luYWxfZmFkdCk7CisKIAogdTggYWNwaV9mYWR0X2lzX3YxOwogRVhQT1JUX1NZTUJPTChhY3BpX2ZhZHRfaXNfdjEpOwpAQCAtMTQyLDExICsxNjAsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsgaSsrKSB7CiAJCWlmIChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA8IDIpIHsKIAkJCUFDUElfU1RPUkVfQUREUkVTUyAobmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0sCi0JCQkJKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MSwgdGFibGVfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV0pOworCQkJCShBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEsCisJCQkJCXRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldKTsKIAkJfQogCQllbHNlIHsKIAkJCW5ld190YWJsZS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldID0KLQkJCQkoQUNQSV9DQVNUX1BUUiAoWFNEVF9ERVNDUklQVE9SLCB0YWJsZV9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKKwkJCQkoQUNQSV9DQVNUX1BUUiAoWFNEVF9ERVNDUklQVE9SLAorCQkJCQl0YWJsZV9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAkJfQogCX0KIApAQCAtMTY0LDcgKzE4NCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcwogICoKQEAgLTIwMSw3ICsyMjEsNyBAQAogICogUEFSQU1FVEVSUzogIGxvY2FsX2ZhZHQgICAgICAtIFBvaW50ZXIgdG8gbmV3IEZBRFQKICAqICAgICAgICAgICAgICBvcmlnaW5hbF9mYWR0ICAgLSBQb2ludGVyIHRvIG9sZCBGQURUCiAgKgotICogUkVUVVJOOiAgICAgIFBvcHVsYXRlcyBsb2NhbF9mYWR0CisgKiBSRVRVUk46ICAgICAgTm9uZSwgcG9wdWxhdGVzIGxvY2FsX2ZhZHQKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBBQ1BJIDEuMCBGQURUIHRvIGNvbW1vbiBpbnRlcm5hbCBmb3JtYXQKICAqCkBAIC0yMTMsNyArMjMzLDYgQEAKIAlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgICAgKm9yaWdpbmFsX2ZhZHQpCiB7CiAKLQogCS8qIEFDUEkgMS4wIEZBQ1MgKi8KIAkvKiBUaGUgQklPUyBzdG9yZWQgRkFEVCBzaG91bGQgYWdyZWUgd2l0aCBSZXZpc2lvbiAxLjAgKi8KIAlhY3BpX2ZhZHRfaXNfdjEgPSAxOwpAQCAtMjMyLDcgKzI1MSw4IEBACiAJQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT5YZHNkdCwgbG9jYWxfZmFkdC0+VjFfZHNkdCk7CiAKIAkvKgotCSAqIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgaXNuJ3QgdXNlZCBpbiBBQ1BJIDIuMCAobG9jYWxfZmFkdC0+UmVzZXJ2ZWQxID0gMDspCisJICogU3lzdGVtIEludGVycnVwdCBNb2RlbCBpc24ndCB1c2VkIGluIEFDUEkgMi4wCisJICogKGxvY2FsX2ZhZHQtPlJlc2VydmVkMSA9IDA7KQogCSAqLwogCiAJLyoKQEAgLTI2OSw3ICsyODksOCBAQAogCQkgKiB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MuCiAJCSAqLwogCQlBQ1BJX01FTUNQWSAoJmxvY2FsX2ZhZHQtPnJlc2V0X3JlZ2lzdGVyLAotCQkJJihBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMsIG9yaWdpbmFsX2ZhZHQpKS0+cmVzZXRfcmVnaXN0ZXIsCisJCQkmKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cywKKwkJCQlvcmlnaW5hbF9mYWR0KSktPnJlc2V0X3JlZ2lzdGVyLAogICAJCQlzaXplb2YgKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykgKyAxKTsKIAl9CiAJZWxzZSB7CkBAIC0zMDQsNyArMzI1LDggQEAKIAogCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCiAJCSAodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIChsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKworCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKwogCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CiAKIAkvKiBQTTFCIGlzIG9wdGlvbmFsOyBsZWF2ZSBudWxsIGlmIG5vdCBwcmVzZW50ICovCkBAIC0zMTIsNyArMzM0LDggQEAKIAlpZiAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCiAJCQkgKHU4KSBBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiksCi0JCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCisJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzICsKIAkJCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKIAl9CiB9CkBAIC0zMjUsNyArMzQ4LDcgQEAKICAqIFBBUkFNRVRFUlM6ICBsb2NhbF9mYWR0ICAgICAgLSBQb2ludGVyIHRvIG5ldyBGQURUCiAgKiAgICAgICAgICAgICAgb3JpZ2luYWxfZmFkdCAgIC0gUG9pbnRlciB0byBvbGQgRkFEVAogICoKLSAqIFJFVFVSTjogICAgICBQb3B1bGF0ZXMgbG9jYWxfZmFkdAorICogUkVUVVJOOiAgICAgIE5vbmUsIHBvcHVsYXRlcyBsb2NhbF9mYWR0CiAgKgogICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSAyLjAgRkFEVCB0byBjb21tb24gaW50ZXJuYWwgZm9ybWF0LgogICogICAgICAgICAgICAgIEhhbmRsZXMgb3B0aW9uYWwgIlgiIGZpZWxkcy4KQEAgLTM0OCw3ICszNzEsOCBAQAogCSAqIGlzIHplcm8uCiAJICovCiAJaWYgKCEobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwpKSB7Ci0JCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwsIGxvY2FsX2ZhZHQtPlYxX2Zpcm13YXJlX2N0cmwpOworCQlBQ1BJX1NUT1JFX0FERFJFU1MgKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsLAorCQkJbG9jYWxfZmFkdC0+VjFfZmlybXdhcmVfY3RybCk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+WGRzZHQpKSB7CkBAIC0zNTcsMzIgKzM4MSwzOCBAQAogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2V2dF9ibGspOworCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2V2dF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9ldnRfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9ldnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWFfY250X2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWFfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWJfY250X2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWJfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2NudF9ibGspOworCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2NudF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMl9jbnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMl9jbnRfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtMl9jbnRfbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0yX2NudF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG1fdG1yX2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG1fdG1yX2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbV90bV9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbV90bXJfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54Z3BlMF9ibGsuYWRkcmVzcykpIHsKQEAgLTM5OSwxOCArNDI5LDI0IEBACiAKIAlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAogCQkodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCisJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKIAkJCUFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwotCWFjcGlfZ2JsX3hwbTFhX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0gbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOworCisJYWNwaV9nYmxfeHBtMWFfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPQorCQlsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CiAKIAkvKiBQTTFCIGlzIG9wdGlvbmFsOyBsZWF2ZSBudWxsIGlmIG5vdCBwcmVzZW50ICovCiAKIAlpZiAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCiAJCQkodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgKworCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzICsKIAkJCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKLQkJYWNwaV9nYmxfeHBtMWJfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPSBsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CisKKwkJYWNwaV9nYmxfeHBtMWJfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPQorCQkJbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOwogCX0KIH0KIApAQCAtNDMyLDcgKzQ2OCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQgKHZvaWQpCithY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAoCisJdm9pZCkKIHsKIAlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQ7CiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICp0YWJsZV9kZXNjOwpAQCAtNDQ2LDcgKzQ4Myw4IEBACiAJICogYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgdmVyc2lvbiAxLjAgRkFEVAogCSAqLwogCWlmIChhY3BpX2dibF9GQURULT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSkpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRkFEVCBpcyBpbnZhbGlkLCB0b28gc2hvcnQ6IDB4JVhcbiIsIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJGQURUIGlzIGludmFsaWQsIHRvbyBzaG9ydDogMHglWFxuIiwKKwkJCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKIAl9CiAKQEAgLTQ2MSw4ICs0OTksOSBAQAogCQlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpKSB7CiAJCQkvKiBMZW5ndGggaXMgdG9vIHNob3J0IHRvIGJlIGEgVjIuMCB0YWJsZSAqLwogCi0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkluY29uc2lzdGVudCBGQURUIGxlbmd0aCAoMHglWCkgYW5kIHJldmlzaW9uICgweCVYKSwgdXNpbmcgRkFEVCBWMS4wIHBvcnRpb24gb2YgdGFibGVcbiIsCi0JCQkJCSBhY3BpX2dibF9GQURULT5sZW5ndGgsIGFjcGlfZ2JsX0ZBRFQtPnJldmlzaW9uKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkJIkluY29uc2lzdGVudCBGQURUIGxlbmd0aCAoMHglWCkgYW5kIHJldmlzaW9uICgweCVYKSwgdXNpbmcgRkFEVCBWMS4wIHBvcnRpb24gb2YgdGFibGVcbiIsCisJCQkJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5yZXZpc2lvbikpOwogCiAJCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDEgKGxvY2FsX2ZhZHQsICh2b2lkICopIGFjcGlfZ2JsX0ZBRFQpOwogCQl9CkBAIC00NzgsOSArNTE3LDggQEAKIAkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQxIChsb2NhbF9mYWR0LCAodm9pZCAqKSBhY3BpX2dibF9GQURUKTsKIAl9CiAKLQkvKgotCSAqIEdsb2JhbCBGQURUIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGUgbmV3IGNvbW1vbiBWMi4wIEZBRFQKLQkgKi8KKwkvKiBHbG9iYWwgRkFEVCBwb2ludGVyIHdpbGwgcG9pbnQgdG8gdGhlIG5ldyBjb21tb24gVjIuMCBGQURUICovCisKIAlhY3BpX2dibF9GQURUID0gbG9jYWxfZmFkdDsKIAlhY3BpX2dibF9GQURULT5sZW5ndGggPSBzaXplb2YgKEZBRFRfREVTQ1JJUFRPUik7CiAKQEAgLTUwOCw3ICs1NDYsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFjcworICogRlVOQ1RJT046ICAgIGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MKICAqCiAgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgIC0gSW5mbyBmb3IgY3VycmVudGx5IGluc3RhbGxlZCBGQUNTCiAgKgpAQCAtNTMwLDEyICs1NjgsMTQgQEAKIAkvKiBBYnNvbHV0ZSBtaW5pbXVtIGxlbmd0aCBpcyAyNCwgYnV0IHRoZSBBQ1BJIHNwZWMgc2F5cyA2NCAqLwogCiAJaWYgKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDI0KSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgRkFDUyB0YWJsZSBsZW5ndGg6IDB4JVhcbiIsIGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIEZBQ1MgdGFibGUgbGVuZ3RoOiAweCVYXG4iLAorCQkJYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCA2NCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkZBQ1MgaXMgc2hvcnRlciB0aGFuIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gYWxsb3dzOiAweCVYLCB1c2luZyBhbnl3YXlcbiIsCisJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCSJGQUNTIGlzIHNob3J0ZXIgdGhhbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGFsbG93czogMHglWCwgdXNpbmcgYW55d2F5XG4iLAogCQkJYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CiAJfQogCkBAIC01NDgsNyArNTg4LDggQEAKIAkJKCEoYWNwaV9nYmxfRkFDUy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3IpKSkgewogCQkvKiBBQ1BJIDEuMCBGQUNTIG9yIHNob3J0IHRhYmxlIG9yIG9wdGlvbmFsIFhfIGZpZWxkIGlzIHplcm8gKi8KIAotCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gQUNQSV9DQVNUX1BUUiAodTY0LCAmKGFjcGlfZ2JsX0ZBQ1MtPmZpcm13YXJlX3dha2luZ192ZWN0b3IpKTsKKwkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IEFDUElfQ0FTVF9QVFIgKHU2NCwKKwkJCQkmKGFjcGlfZ2JsX0ZBQ1MtPmZpcm13YXJlX3dha2luZ192ZWN0b3IpKTsKIAkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MudmVjdG9yX3dpZHRoID0gMzI7CiAJfQogCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCmluZGV4IDg5NmYzZGQuLjRhYjJhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKQEAgLTQ5LDYgKzQ5LDE5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiZ2V0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X3RoaXNfdGFibGUgKAorCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKAorCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc2LDkgKzg5LDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZ2V0X3RhYmxlIik7CiAKIAotCS8qCi0JICogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZQotCSAqLworCS8qIEdldCB0aGUgaGVhZGVyIGluIG9yZGVyIHRvIGdldCBzaWduYXR1cmUgYW5kIHRhYmxlIHNpemUgKi8KKwogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlciAoYWRkcmVzcywgJmhlYWRlcik7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMjcsOCArMTM5LDggQEAKIAogCiAJLyoKLQkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbCBhZGRyZXNzaW5nKQotCSAqIFRoZSBwb2ludGVyX3R5cGUgaXMgZWl0aGVyIExvZ2ljYWwgb3IgUGh5c2ljYWwKKwkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbAorCSAqIGFkZHJlc3NpbmcpIFRoZSBwb2ludGVyX3R5cGUgaXMgZWl0aGVyIExvZ2ljYWwgb3IgUGh5c2ljYWwKIAkgKi8KIAlzd2l0Y2ggKGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkgewogCWNhc2UgQUNQSV9QSFlTTU9ERV9QSFlTUFRSOgpAQCAtMTM2LDcgKzE0OCw4IEBACiAKIAkJLyogUG9pbnRlciBtYXRjaGVzIHByb2Nlc3NvciBtb2RlLCBjb3B5IHRoZSBoZWFkZXIgKi8KIAotCQlBQ1BJX01FTUNQWSAocmV0dXJuX2hlYWRlciwgYWRkcmVzcy0+cG9pbnRlci5sb2dpY2FsLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlBQ1BJX01FTUNQWSAocmV0dXJuX2hlYWRlciwgYWRkcmVzcy0+cG9pbnRlci5sb2dpY2FsLAorCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJYnJlYWs7CiAKIApAQCAtMTQ0LDEwICsxNTcsMTEgQEAKIAogCQkvKiBDcmVhdGUgYSBsb2dpY2FsIGFkZHJlc3MgZm9yIHRoZSBwaHlzaWNhbCBwb2ludGVyKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSwKLQkJCQkgICh2b2lkICopICZoZWFkZXIpOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCisJCQkJIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSwgKHZvaWQgKikgJmhlYWRlcik7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKIAkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLAogCQkJCXNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMjEwLDkgKzIyNCw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyoKLQkgKiBBdHRlbXB0IHRhYmxlIG92ZXJyaWRlLgotCSAqLworCS8qIEF0dGVtcHQgdGFibGUgb3ZlcnJpZGUuICovCisKIAlzdGF0dXMgPSBhY3BpX3RiX3RhYmxlX292ZXJyaWRlIChoZWFkZXIsIHRhYmxlX2luZm8pOwogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJLyogVGFibGUgd2FzIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QgT1MgKi8KQEAgLTI0MSw3ICsyNTQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQpAQCAtMzE1LDcgKzMyOCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoCiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCkBAIC0zMzAsOCArMzQzLDggQEAKIAogCiAJLyoKLQkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbCBhZGRyZXNzaW5nKQotCSAqIFRoZSBwb2ludGVyX3R5cGUgaXMgZWl0aGVyIExvZ2ljYWwgb3IgUGh5c2ljYWwKKwkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbAorCSAqIGFkZHJlc3NpbmcpIFRoZSBwb2ludGVyX3R5cGUgaXMgZWl0aGVyIExvZ2ljYWwgb3IgUGh5c2ljYWwKIAkgKi8KIAlzd2l0Y2ggKGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkgewogCWNhc2UgQUNQSV9QSFlTTU9ERV9QSFlTUFRSOgpAQCAtMzQxLDcgKzM1NCw4IEBACiAKIAkJZnVsbF90YWJsZSA9IEFDUElfTUVNX0FMTE9DQVRFIChoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghZnVsbF90YWJsZSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGFsbG9jYXRlIHRhYmxlIG1lbW9yeSBmb3IgWyU0LjRzXSBsZW5ndGggJVhcbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgdGFibGUgbWVtb3J5IGZvciBbJTQuNHNdIGxlbmd0aCAlWFxuIiwKIAkJCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5sZW5ndGgpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtMzYyLDEyICszNzYsMTQgQEAKIAkJICogSnVzdCBtYXAgdGhlIHRhYmxlJ3MgcGh5c2ljYWwgbWVtb3J5CiAJCSAqIGludG8gb3VyIGFkZHJlc3Mgc3BhY2UuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsIChhY3BpX3NpemUpIGhlYWRlci0+bGVuZ3RoLAotCQkJCSAgKHZvaWQgKikgJmZ1bGxfdGFibGUpOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCisJCQkJIChhY3BpX3NpemUpIGhlYWRlci0+bGVuZ3RoLCAodm9pZCAqKSAmZnVsbF90YWJsZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGZvciB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGZvciB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKIAkJCQloZWFkZXItPnNpZ25hdHVyZSwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLCBoZWFkZXItPmxlbmd0aCkpOworCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksCisJCQkJaGVhZGVyLT5sZW5ndGgpKTsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCkBAIC00NjUsOSArNDgxLDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCi0JLyoKLQkgKiBDaGVjayBmb3IgaW5zdGFuY2Ugb3V0IG9mIHJhbmdlCi0JICovCisJLyogQ2hlY2sgZm9yIGluc3RhbmNlIG91dCBvZiByYW5nZSAqLworCiAJaWYgKGluc3RhbmNlID4gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYwppbmRleCBhZGM0MjcwLi5lZWE1YjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCkBAIC00OSw2ICs0OSwxOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YmdldGFsbCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoCisJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKKwlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYzLDcgKzc2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCkBAIC04MSw5ICs5NCw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIAotCS8qCi0JICogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZQotCSAqLworCS8qIEdldCB0aGUgaGVhZGVyIGluIG9yZGVyIHRvIGdldCBzaWduYXR1cmUgYW5kIHRhYmxlIHNpemUgKi8KKwogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlciAoYWRkcmVzcywgJmhlYWRlcik7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMzAsNyArMTQyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKAogCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCiAJYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCkBAIC0xNTMsNyArMTY1LDggQEAKIAkvKiBTaWduYXR1cmUgbXVzdCBtYXRjaCByZXF1ZXN0ICovCiAKIAlpZiAoQUNQSV9TVFJOQ01QIChoZWFkZXIuc2lnbmF0dXJlLCBzaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbmNvcnJlY3QgdGFibGUgc2lnbmF0dXJlIC0gd2FudGVkIFslc10gZm91bmQgWyU0LjRzXVxuIiwKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJJbmNvcnJlY3QgdGFibGUgc2lnbmF0dXJlIC0gd2FudGVkIFslc10gZm91bmQgWyU0LjRzXVxuIiwKIAkJCXNpZ25hdHVyZSwgaGVhZGVyLnNpZ25hdHVyZSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9TSUdOQVRVUkUpOwogCX0KQEAgLTIzMCw3ICsyNDMsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50OyBpKyspIHsKIAkJLyogR2V0IHRoZSB0YWJsZSBhZGRyZXNzIGZyb20gdGhlIGNvbW1vbiBpbnRlcm5hbCBYU0RUICovCiAKLQkJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfWFNEVC0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPQorCQkJCSAgYWNwaV9nYmxfWFNEVC0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOwogCiAJCS8qCiAJCSAqIEdldCB0aGUgdGFibGVzIG5lZWRlZCBieSB0aGlzIHN1YnN5c3RlbSAoRkFEVCBhbmQgYW55IFNTRFRzKS4KQEAgLTI1MiwxOCArMjY2LDE4IEBACiAJfQogCiAJLyoKLQkgKiBDb252ZXJ0IHRoZSBGQURUIHRvIGEgY29tbW9uIGZvcm1hdC4gIFRoaXMgYWxsb3dzIGVhcmxpZXIgcmV2aXNpb25zIG9mIHRoZQotCSAqIHRhYmxlIHRvIGNvZXhpc3Qgd2l0aCBuZXdlciB2ZXJzaW9ucywgdXNpbmcgY29tbW9uIGFjY2VzcyBjb2RlLgorCSAqIENvbnZlcnQgdGhlIEZBRFQgdG8gYSBjb21tb24gZm9ybWF0LiAgVGhpcyBhbGxvd3MgZWFybGllciByZXZpc2lvbnMgb2YKKwkgKiB0aGUgdGFibGUgdG8gY29leGlzdCB3aXRoIG5ld2VyIHZlcnNpb25zLCB1c2luZyBjb21tb24gYWNjZXNzIGNvZGUuCiAJICovCiAJc3RhdHVzID0gYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgY29udmVydCBGQURUIHRvIGludGVybmFsIGNvbW1vbiBmb3JtYXRcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJDb3VsZCBub3QgY29udmVydCBGQURUIHRvIGludGVybmFsIGNvbW1vbiBmb3JtYXRcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCS8qCi0JICogR2V0IHRoZSBGQUNTIChQb2ludGVkIHRvIGJ5IHRoZSBGQURUKQotCSAqLworCS8qIEdldCB0aGUgRkFDUyAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkgKi8KKwogCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX0ZBRFQtPnhmaXJtd2FyZV9jdHJsOwogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgmYWRkcmVzcywgRkFDU19TSUcsICZ0YWJsZV9pbmZvKTsKQEAgLTI4Miw5ICsyOTYsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0JLyoKLQkgKiBHZXQvaW5zdGFsbCB0aGUgRFNEVCAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkKLQkgKi8KKwkvKiBHZXQvaW5zdGFsbCB0aGUgRFNEVCAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkgKi8KKwogCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX0ZBRFQtPlhkc2R0OwogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgmYWRkcmVzcywgRFNEVF9TSUcsICZ0YWJsZV9pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYwppbmRleCA4NWQ1YmIwLi42MjliNjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCkBAIC00OSw2ICs0OSwxNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0Ymluc3RhbCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01Niw2ICs2NCw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBUYWJsZSBzaWduYXR1cmUgdG8gbWF0Y2gKICAqICAgICAgICAgICAgICB0YWJsZV9pbmZvICAgICAgICAgIC0gUmV0dXJuIGRhdGEKKyAqICAgICAgICAgICAgICBzZWFyY2hfdHlwZSAgICAgICAgIC0gVGFibGUgdHlwZSB0byBtYXRjaCAocHJpbWFyeS9zZWNvbmRhcnkpCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY0LDcgKzczLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCkBAIC03Niw5ICs4NSw4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX21hdGNoX3NpZ25hdHVyZSIpOwogCiAKLQkvKgotCSAqIFNlYXJjaCBmb3IgYSBzaWduYXR1cmUgbWF0Y2ggYW1vbmcgdGhlIGtub3duIHRhYmxlIHR5cGVzCi0JICovCisJLyogU2VhcmNoIGZvciBhIHNpZ25hdHVyZSBtYXRjaCBhbW9uZyB0aGUga25vd24gdGFibGUgdHlwZXMgKi8KKwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQUNQSV9UQUJMRV9UWVBFUzsgaSsrKSB7CiAJCWlmICghKGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uZmxhZ3MgJiBzZWFyY2hfdHlwZSkpIHsKIAkJCWNvbnRpbnVlOwpAQCAtMTYxLDYgKzE2OSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9yZWNvZ25pemVfdGFibGUKICAqCiAgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgICAgICAtIFJldHVybiB2YWx1ZSBmcm9tIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkKKyAqICAgICAgICAgICAgICBzZWFyY2hfdHlwZSAgICAgICAgIC0gVGFibGUgdHlwZSB0byBtYXRjaCAocHJpbWFyeS9zZWNvbmRhcnkpCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTIwMyw3ICsyMTIsOCBAQAogCSAqIFRoaXMgY2FuIGJlIGFueSBvbmUgb2YgbWFueSB2YWxpZCBBQ1BJIHRhYmxlcywgaXQganVzdCBpc24ndCBvbmUgb2YKIAkgKiB0aGUgdGFibGVzIHRoYXQgaXMgY29uc3VtZWQgYnkgdGhlIGNvcmUgc3Vic3lzdGVtCiAJICovCi0Jc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCB0YWJsZV9pbmZvLCBzZWFyY2hfdHlwZSk7CisJc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLAorCQkJIHRhYmxlX2luZm8sIHNlYXJjaF90eXBlKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0yNTMsOSArMjYzLDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCX0KIAotCS8qCi0JICogSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlCi0JICovCisJLyogSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlICovCisKIAlsaXN0X2hlYWQgPSAmYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV07CiAKIAkvKgpAQCAtMzE2LDcgKzMyNSw4IEBACiAJdGFibGVfZGVzYy0+YW1sX3N0YXJ0ICAgICAgICAgICA9ICh1OCAqKSAodGFibGVfZGVzYy0+cG9pbnRlciArIDEpLAogCXRhYmxlX2Rlc2MtPmFtbF9sZW5ndGggICAgICAgICAgPSAodTMyKSAodGFibGVfZGVzYy0+bGVuZ3RoIC0KIAkJCSAodTMyKSBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCXRhYmxlX2Rlc2MtPnRhYmxlX2lkICAgICAgICAgICAgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkIChBQ1BJX09XTkVSX1RZUEVfVEFCTEUpOworCXRhYmxlX2Rlc2MtPnRhYmxlX2lkICAgICAgICAgICAgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKKwkJCSBBQ1BJX09XTkVSX1RZUEVfVEFCTEUpOwogCXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSA9IEZBTFNFOwogCiAJLyoKQEAgLTM0OSw3ICszNTksOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAodm9pZCkKK2FjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMgKAorCXZvaWQpCiB7CiAJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0eXBlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwppbmRleCA5YzY5MTMyLi5iN2ZmZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKQEAgLTg0LDggKzg0LDkgQEAKIAkJLyoKIAkJICogT2J0YWluIGFjY2VzcyB0byB0aGUgUlNEUCBzdHJ1Y3R1cmUKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwgc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwKLQkJCQkgICh2b2lkICopICZyc2RwKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLAorCQkJCQkJICAgKHZvaWQgKikgJnJzZHApOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTE1NCw5ICsxNTUsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3MKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQorICogUEFSQU1FVEVSUzogIG91dF9hZGRyZXNzICAgICAgICAgLSBXaGVyZSB0aGUgYWRkcmVzcyBpcyByZXR1cm5lZAogICoKLSAqIFJFVFVSTjogICAgICBSU0RUIHBoeXNpY2FsIGFkZHJlc3MKKyAqIFJFVFVSTjogICAgICBOb25lLCBBZGRyZXNzCiAgKgogICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIFJTRFQgb3IgWFNEVCwgZGVwZW5kaW5nIG9uIHRoZQogICogICAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIFJTRFAKQEAgLTE4MSw3ICsxODIsOCBAQAogCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1JTRFAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzczsKIAl9CiAJZWxzZSB7Ci0JCW91dF9hZGRyZXNzLT5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOworCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9CisJCQlhY3BpX2dibF9SU0RQLT54c2R0X3BoeXNpY2FsX2FkZHJlc3M7CiAJfQogfQogCkBAIC0yMjQsNyArMjI2LDggQEAKIAlpZiAobm9fbWF0Y2gpIHsKIAkJLyogSW52YWxpZCBSU0RUIG9yIFhTRFQgc2lnbmF0dXJlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBzaWduYXR1cmUgd2hlcmUgUlNEUCBpbmRpY2F0ZXMgUlNEVC9YU0RUIHNob3VsZCBiZSBsb2NhdGVkXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiSW52YWxpZCBzaWduYXR1cmUgd2hlcmUgUlNEUCBpbmRpY2F0ZXMgUlNEVC9YU0RUIHNob3VsZCBiZSBsb2NhdGVkXG4iKSk7CiAKIAkJQUNQSV9EVU1QX0JVRkZFUiAoYWNwaV9nYmxfUlNEUCwgMjApOwogCkBAIC0yODIsNiArMjg1LDcgQEAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGdldCB0aGUgUlNEVC9YU0RULCAlc1xuIiwKIAkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKQEAgLTI5OSw3ICszMDMsOCBAQAogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgdGFibGVzIGRlZmluZWQgaW4gdGhlIFJTRFQgb3IgWFNEVCAqLwogCi0JYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCA9IGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50IChhY3BpX2dibF9SU0RQLCB0YWJsZV9pbmZvLnBvaW50ZXIpOworCWFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQgPSBhY3BpX3RiX2dldF90YWJsZV9jb3VudCAoYWNwaV9nYmxfUlNEUCwKKwkJCSAgdGFibGVfaW5mby5wb2ludGVyKTsKIAogCS8qIENvbnZlcnQgYW5kL29yIGNvcHkgdG8gYW4gWFNEVCBzdHJ1Y3R1cmUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwppbmRleCBmZWRlNTgwLi5lNjlkMDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwpAQCAtNDksNDggKzQ5LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRidXRpbHMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaGFuZGxlX3RvX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pZCAgICAgICAgICAgIC0gSWQgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBzZWFyY2hpbmcKLSAqICAgICAgICAgICAgICB0YWJsZV9kZXNjICAgICAgICAgIC0gUG9pbnRlciB0byByZXR1cm4gdGhlIG1hdGNoaW5nIHRhYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4KLSAqCi0gKiBSRVRVUk46ICAgICAgU2VhcmNoIHRoZSB0YWJsZXMgdG8gZmluZCBvbmUgd2l0aCBhIG1hdGNoaW5nIHRhYmxlX2lkIGFuZAotICogICAgICAgICAgICAgIHJldHVybiBhIHBvaW50ZXIgdG8gdGhhdCB0YWJsZSBkZXNjcmlwdG9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogYWNwaV9zdGF0dXMKIGFjcGlfdGJfaGFuZGxlX3RvX29iamVjdCAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9pZCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICoqcmV0dXJuX3RhYmxlX2Rlc2MpCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7Ci0KLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInRiX2hhbmRsZV90b19vYmplY3QiKTsKLQotCi0JZm9yIChpID0gMDsgaSA8IEFDUElfVEFCTEVfTUFYOyBpKyspIHsKLQkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLm5leHQ7Ci0JCXdoaWxlICh0YWJsZV9kZXNjKSB7Ci0JCQlpZiAodGFibGVfZGVzYy0+dGFibGVfaWQgPT0gdGFibGVfaWQpIHsKLQkJCQkqcmV0dXJuX3RhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjOwotCQkJCXJldHVybiAoQUVfT0spOwotCQkJfQotCi0JCQl0YWJsZV9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKLQkJfQotCX0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAidGFibGVfaWQ9JVggZG9lcyBub3QgZXhpc3RcbiIsIHRhYmxlX2lkKSk7Ci0JcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLX0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKip0YWJsZV9kZXNjKTsKKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjgsNiArOTQsNyBAQAogCWlmICghYWNwaV9vc19yZWFkYWJsZSAodGFibGVfaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJIkNhbm5vdCByZWFkIHRhYmxlIGhlYWRlciBhdCAlcFxuIiwgdGFibGVfaGVhZGVyKSk7CisKIAkJcmV0dXJuIChBRV9CQURfQUREUkVTUyk7CiAJfQogCkBAIC0xNDEsNiArMTA4LDcgQEAKIAogCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIGZvdW5kOiBbJTQuNHNdXG4iLAogCQkJKGNoYXIgKikgJnNpZ25hdHVyZSkpOworCiAJCUFDUElfRFVNUF9CVUZGRVIgKHRhYmxlX2hlYWRlciwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJcmV0dXJuIChBRV9CQURfU0lHTkFUVVJFKTsKIAl9CkBAIC0xNTQsNiArMTIyLDcgQEAKIAogCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgdGFibGUgaGVhZGVyIGxlbmd0aCAoMHglWCkgZm91bmRcbiIsCiAJCQkodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCkpOworCiAJCUFDUElfRFVNUF9CVUZGRVIgKHRhYmxlX2hlYWRlciwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJcmV0dXJuIChBRV9CQURfSEVBREVSKTsKIAl9CkBAIC0xOTMsOCArMTYyLDEwIEBACiAJLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gKi8KIAogCWlmIChjaGVja3N1bSkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgY2hlY2tzdW0gaW4gdGFibGUgWyU0LjRzXSAoJTAyWCwgc3VtICUwMlggaXMgbm90IHplcm8pXG4iLAotCQkJdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsICh1MzIpIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sICh1MzIpIGNoZWNrc3VtKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCSJJbnZhbGlkIGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gKCUwMlgsIHN1bSAlMDJYIGlzIG5vdCB6ZXJvKVxuIiwKKwkJCXRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAodTMyKSB0YWJsZV9oZWFkZXItPmNoZWNrc3VtLAorCQkJKHUzMikgY2hlY2tzdW0pKTsKIAogCQlzdGF0dXMgPSBBRV9CQURfQ0hFQ0tTVU07CiAJfQpAQCAtMjA5LDcgKzE4MCw3IEBACiAgKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgICAgICAtIEJ1ZmZlciB0byBjaGVja3N1bQogICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBidWZmZXIKICAqCi0gKiBSRVRVUk5TICAgICAgOCBiaXQgY2hlY2tzdW0gb2YgYnVmZmVyCisgKiBSRVRVUk46ICAgICAgOCBiaXQgY2hlY2tzdW0gb2YgYnVmZmVyCiAgKgogICogREVTQ1JJUFRJT046IENvbXB1dGVzIGFuIDggYml0IGNoZWNrc3VtIG9mIHRoZSBidWZmZXIobGVuZ3RoKSBhbmQgcmV0dXJucyBpdC4KICAqCkBAIC0yMzgsMyArMjA5LDQ3IEBACiB9CiAKIAorI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2hhbmRsZV90b19vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaWQgICAgICAgICAgICAtIElkIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgc2VhcmNoaW5nCisgKiAgICAgICAgICAgICAgdGFibGVfZGVzYyAgICAgICAgICAtIFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGluZyB0YWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuCisgKgorICogUkVUVVJOOiAgICAgIFNlYXJjaCB0aGUgdGFibGVzIHRvIGZpbmQgb25lIHdpdGggYSBtYXRjaGluZyB0YWJsZV9pZCBhbmQKKyAqICAgICAgICAgICAgICByZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQgdGFibGUgZGVzY3JpcHRvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0ICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKipyZXR1cm5fdGFibGVfZGVzYykKK3sKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKKworCisJQUNQSV9GVU5DVElPTl9OQU1FICgidGJfaGFuZGxlX3RvX29iamVjdCIpOworCisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9UQUJMRV9NQVg7IGkrKykgeworCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dDsKKwkJd2hpbGUgKHRhYmxlX2Rlc2MpIHsKKwkJCWlmICh0YWJsZV9kZXNjLT50YWJsZV9pZCA9PSB0YWJsZV9pZCkgeworCQkJCSpyZXR1cm5fdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2M7CisJCQkJcmV0dXJuIChBRV9PSyk7CisJCQl9CisKKwkJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OworCQl9CisJfQorCisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ0YWJsZV9pZD0lWCBkb2VzIG5vdCBleGlzdFxuIiwgdGFibGVfaWQpKTsKKwlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwppbmRleCA3NzE1MDQzLi4wYzBiOTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwpAQCAtNjcsNyArNjcsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbG9hZF90YWJsZXMgKHZvaWQpCithY3BpX2xvYWRfdGFibGVzICgKKwl2b2lkKQogewogCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgcnNkcF9hZGRyZXNzOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwpAQCAtODIsNyArODMsNyBAQAogCQkJICAmcnNkcF9hZGRyZXNzKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBnZXQgUlNEUCwgJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC05Myw3ICs5NCw3IEBACiAJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfcnNkcCAoJnJzZHBfYWRkcmVzcyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBSU0RQIEZhaWxlZCB2YWxpZGF0aW9uOiAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBSU0RUOiAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTExMCwyMCArMTExLDIwIEBACiAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBFcnJvciBnZXR0aW5nIHJlcXVpcmVkIHRhYmxlcyAoRFNEVC9GQURUL0ZBQ1MpOiAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJImFjcGlfbG9hZF90YWJsZXM6IEVycm9yIGdldHRpbmcgcmVxdWlyZWQgdGFibGVzIChEU0RUL0ZBRFQvRkFDUyk6ICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULCAiQUNQSSBUYWJsZXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkXG4iKSk7CiAKLQogCS8qIExvYWQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSB0YWJsZXMgKi8KIAogCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF9uYW1lc3BhY2UgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBuYW1lc3BhY2U6ICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtMTM5LDcgKzE0MCw2IEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbG9hZF90YWJsZQpAQCAtMjUwLDcgKzI1MCw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0KIAkvKiBGaW5kIGFsbCB0YWJsZXMgb2YgdGhlIHJlcXVlc3RlZCB0eXBlICovCiAKIAl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dDsKQEAgLTMyMSw3ICszMjAsNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCiAJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZW50aXJlIHRhYmxlICovCiAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIgKHRhYmxlX3R5cGUsIGluc3RhbmNlLCAmdGJsX3B0cik7CkBAIC0zMjksMjMgKzMyNywyMCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0JLyoKLQkgKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgaWYgdGhlIHRhYmxlIGlzIG5vdCBsb2FkZWQKLQkgKi8KKwkvKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgaWYgdGhlIHRhYmxlIGlzIG5vdCBsb2FkZWQgKi8KKwogCWlmICh0YmxfcHRyID09IE5VTEwpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOwogCX0KIAotCS8qCi0JICogQ29weSB0aGUgaGVhZGVyIHRvIHRoZSBjYWxsZXIncyBidWZmZXIKLQkgKi8KKwkvKiBDb3B5IHRoZSBoZWFkZXIgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlciAqLworCiAJQUNQSV9NRU1DUFkgKCh2b2lkICopIG91dF90YWJsZV9oZWFkZXIsICh2b2lkICopIHRibF9wdHIsCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KIAotCiAjZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQwNCw3ICszOTksNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCiAJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZW50aXJlIHRhYmxlICovCiAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIgKHRhYmxlX3R5cGUsIGluc3RhbmNlLCAmdGJsX3B0cik7CkBAIC00MjMsOSArNDE3LDggQEAKIAkvKiBHZXQgdGhlIHRhYmxlIGxlbmd0aCAqLwogCiAJaWYgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9SU0RQKSB7Ci0JCS8qCi0JCSAqICBSU0QgUFRSIGlzIHRoZSBvbmx5ICJ0YWJsZSIgd2l0aG91dCBhIGhlYWRlcgotCQkgKi8KKwkJLyogUlNEIFBUUiBpcyB0aGUgb25seSAidGFibGUiIHdpdGhvdXQgYSBoZWFkZXIgKi8KKwogCQl0YWJsZV9sZW5ndGggPSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpOwogCX0KIAllbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwppbmRleCA2ZTgwNzJlLi5kYzNjM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCkBAIC01MCw2ICs1MCwxOCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0Ynhmcm9vdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX2ZpbmRfcnNkcCAoCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworc3RhdGljIHU4ICoKK2FjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FkZHJlc3MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTcsNyArNjksOCBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gU3RyaW5nIHdpdGggQUNQSSB0YWJsZSBzaWduYXR1cmUKICAqICAgICAgICAgICAgICBvZW1faWQgICAgICAgICAgICAgIC0gU3RyaW5nIHdpdGggdGhlIHRhYmxlIE9FTSBJRAotICogICAgICAgICAgICAgIG9lbV90YWJsZV9pZCAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgT0VNIFRhYmxlIElELgorICogICAgICAgICAgICAgIG9lbV90YWJsZV9pZCAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgT0VNIFRhYmxlIElECisgKiAgICAgICAgICAgICAgdGFibGVfcHRyICAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBwb2ludGVyIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTk5LDE0ICsxMTIsMTMgQEAKIAkJaWYgKCFhY3BpX2dibF9EU0RUKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKIAkJfQotCiAJCXRhYmxlID0gYWNwaV9nYmxfRFNEVDsKIAl9CiAJZWxzZSB7CiAJCS8qIEZpbmQgdGhlIHRhYmxlICovCiAKIAkJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUgKHNpZ25hdHVyZSwgMSwKLQkJCQkgICBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywgJnRhYmxlKTsKKwkJCQkgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsICZ0YWJsZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtMTE0LDE0ICsxMjYsMTkgQEAKIAogCS8qIENoZWNrIG9lbV9pZCBhbmQgb2VtX3RhYmxlX2lkICovCiAKLQlpZiAoKG9lbV9pZFswXSAgICAgJiYgQUNQSV9TVFJOQ01QICgKLQkJCSBvZW1faWQsIHRhYmxlLT5vZW1faWQsIHNpemVvZiAodGFibGUtPm9lbV9pZCkpKSB8fAorCWlmICgob2VtX2lkWzBdICYmIEFDUElfU1RSTkNNUCAoCisJCQkgICBvZW1faWQsIHRhYmxlLT5vZW1faWQsCisJCQkgICBzaXplb2YgKHRhYmxlLT5vZW1faWQpKSkgfHwKKwogCQkob2VtX3RhYmxlX2lkWzBdICYmIEFDUElfU1RSTkNNUCAoCi0JCQkJICAgb2VtX3RhYmxlX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkLCBzaXplb2YgKHRhYmxlLT5vZW1fdGFibGVfaWQpKSkpIHsKKwkJCQkgICBvZW1fdGFibGVfaWQsIHRhYmxlLT5vZW1fdGFibGVfaWQsCisJCQkJICAgc2l6ZW9mICh0YWJsZS0+b2VtX3RhYmxlX2lkKSkpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05BTUVfTk9UX0ZPVU5EKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJGb3VuZCB0YWJsZSBbJTQuNHNdXG4iLCB0YWJsZS0+c2lnbmF0dXJlKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwKKwkJdGFibGUtPnNpZ25hdHVyZSkpOworCiAJKnRhYmxlX3B0ciA9IHRhYmxlOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTkxLDggKzIwOCw4IEBACiAJCS8qIE1hcCBhbmQgdmFsaWRhdGUgdGhlIFJTRFAgKi8KIAogCQlpZiAoKGZsYWdzICYgQUNQSV9NRU1PUllfTU9ERSkgPT0gQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcpIHsKLQkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy5wb2ludGVyLnBoeXNpY2FsLCBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLAotCQkJCQkgICh2b2lkICopICZhY3BpX2dibF9SU0RQKTsKKwkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy5wb2ludGVyLnBoeXNpY2FsLAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwgKHZvaWQgKikgJmFjcGlfZ2JsX1JTRFApOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJCX0KQEAgLTIwMyw3ICsyMjAsOCBAQAogCiAJCS8qIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCiAKLQkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgYWNwaV9nYmxfUlNEUCwgUlNEUF9TSUcsIHNpemVvZiAoUlNEUF9TSUcpLTEpICE9IDApIHsKKwkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgYWNwaV9nYmxfUlNEUCwgUlNEUF9TSUcsCisJCQkJc2l6ZW9mIChSU0RQX1NJRyktMSkgIT0gMCkgewogCQkJLyogTm9wZSwgQkFEIFNpZ25hdHVyZSAqLwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9TSUdOQVRVUkUpOwpAQCAtMzEzLDcgKzMzMSw4IEBACiAKIAogY2xlYW51cDoKLQlhY3BpX29zX3VubWFwX21lbW9yeSAocnNkdF9pbmZvLT5wb2ludGVyLCAoYWNwaV9zaXplKSByc2R0X2luZm8tPnBvaW50ZXItPmxlbmd0aCk7CisJYWNwaV9vc191bm1hcF9tZW1vcnkgKHJzZHRfaW5mby0+cG9pbnRlciwKKwkJKGFjcGlfc2l6ZSkgcnNkdF9pbmZvLT5wb2ludGVyLT5sZW5ndGgpOwogCUFDUElfTUVNX0ZSRUUgKHJzZHRfaW5mbyk7CiAKIAlpZiAoaGVhZGVyKSB7CkBAIC0zMzUsOCArMzU0LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcgogICoKLSAqIFBBUkFNRVRFUlM6ICAqKnJzZHBfYWRkcmVzcyAgICAgICAgICAtIFdoZXJlIHRvIHBsYWNlIHRoZSBSU0RQIGFkZHJlc3MKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgICAgICAtIExvZ2ljYWwvUGh5c2ljYWwgYWRkcmVzc2luZworICogUEFSQU1FVEVSUzogIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gTG9naWNhbC9QaHlzaWNhbCBhZGRyZXNzaW5nCisgKiAgICAgICAgICAgICAgcnNkcF9hZGRyZXNzICAgICAgICAgICAgLSBXaGVyZSB0byBwbGFjZSB0aGUgUlNEUCBhZGRyZXNzCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cywgUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUlNEUAogICoKQEAgLTM2Myw2ICszODIsNyBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCSJSU0RQIHN0cnVjdHVyZSBub3QgZm91bmQsICVzIEZsYWdzPSVYXG4iLAogCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBmbGFncykpOworCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIApAQCAtMzg1LDcgKzQwNSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTggKgorc3RhdGljIHU4ICoKIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FkZHJlc3MsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpCkBAIC00MDYsNyArNDI2LDggQEAKIAkJIG1lbV9yb3ZlciArPSBBQ1BJX1JTRFBfU0NBTl9TVEVQKSB7CiAJCS8qIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCiAKLQkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgbWVtX3JvdmVyLCBSU0RQX1NJRywgc2l6ZW9mIChSU0RQX1NJRyktMSkgIT0gMCkgeworCQlpZiAoQUNQSV9TVFJOQ01QICgoY2hhciAqKSBtZW1fcm92ZXIsCisJCQkJUlNEUF9TSUcsIHNpemVvZiAoUlNEUF9TSUcpIC0gMSkgIT0gMCkgewogCQkJLyogTm8gc2lnbmF0dXJlIG1hdGNoLCBrZWVwIGxvb2tpbmcgKi8KIAogCQkJY29udGludWU7CkBAIC00NTAsNyArNDcxLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3JzZHAKICAqCi0gKiBQQVJBTUVURVJTOiAgKnRhYmxlX2luZm8gICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5mbyBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZm8gICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZm8gaXMgcmV0dXJuZWQKICAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgbWVtb3J5IG1vZGUgKGxvZ2ljYWwgdnMuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBhZGRyZXNzaW5nKQogICoKQEAgLTQ2OCw3ICs0ODksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfZmluZF9yc2RwICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCkBAIC00ODMsNDMgKzUwNCw0OSBAQAogCiAKIAkvKgotCSAqIFNjYW4gc3VwcG9ydHMgZWl0aGVyIDEpIExvZ2ljYWwgYWRkcmVzc2luZyBvciAyKSBQaHlzaWNhbCBhZGRyZXNzaW5nCisJICogU2NhbiBzdXBwb3J0cyBlaXRoZXIgbG9naWNhbCBhZGRyZXNzaW5nIG9yIHBoeXNpY2FsIGFkZHJlc3NpbmcKIAkgKi8KIAlpZiAoKGZsYWdzICYgQUNQSV9NRU1PUllfTU9ERSkgPT0gQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcpIHsKLQkJLyoKLQkJICogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEVCREEKLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKLQkJCQkgIEFDUElfRUJEQV9QVFJfTEVOR1RILAotCQkJCSAgKHZvaWQgKikgJnRhYmxlX3B0cik7CisJCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFeHRlbmRlZCBCSU9TIERhdGEgQXJlYSAoRUJEQSkgKi8KKworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAorCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAorCQkJCSBBQ1BJX0VCREFfUFRSX0xFTkdUSCwgKHZvaWQgKikgJnRhYmxlX3B0cik7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAogCQkJCUFDUElfRUJEQV9QVFJfTE9DQVRJT04sIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CisKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCiAJCUFDUElfTU9WRV8xNl9UT18zMiAoJnBoeXNpY2FsX2FkZHJlc3MsIHRhYmxlX3B0cik7Ci0JCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7ICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHNlZ21lbnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCisJCS8qIENvbnZlcnQgc2VnbWVudCBwYXJ0IHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OwogCQlhY3BpX29zX3VubWFwX21lbW9yeSAodGFibGVfcHRyLCBBQ1BJX0VCREFfUFRSX0xFTkdUSCk7CiAKIAkJLyogRUJEQSBwcmVzZW50PyAqLwogCiAJCWlmIChwaHlzaWNhbF9hZGRyZXNzID4gMHg0MDApIHsKIAkJCS8qCi0JCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEYSBpcyByZXF1aXJlZCB0byBiZSBhIG1pbmltdW0gb2YgMV9rIGxlbmd0aCkKKwkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRhIGlzIHJlcXVpcmVkIHRvIGJlIGEKKwkJCSAqICAgICBtaW5pbXVtIG9mIDFfayBsZW5ndGgpCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzcywKLQkJCQkJICBBQ1BJX0VCREFfV0lORE9XX1NJWkUsCi0JCQkJCSAgKHZvaWQgKikgJnRhYmxlX3B0cik7CisJCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAorCQkJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzcywKKwkJCQkJIEFDUElfRUJEQV9XSU5ET1dfU0laRSwgKHZvaWQgKikgJnRhYmxlX3B0cik7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAogCQkJCQlwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpKTsKKwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJCX0KIAotCQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAodGFibGVfcHRyLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOworCQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAodGFibGVfcHRyLAorCQkJCQkgIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CiAJCQlhY3BpX29zX3VubWFwX21lbW9yeSAodGFibGVfcHRyLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwogCiAJCQlpZiAobWVtX3JvdmVyKSB7CkBAIC01MjcsNyArNTU0LDggQEAKIAogCQkJCXBoeXNpY2FsX2FkZHJlc3MgKz0gQUNQSV9QVFJfRElGRiAobWVtX3JvdmVyLCB0YWJsZV9wdHIpOwogCi0JCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CisJCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CisJCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJCQl9CiAJCX0KQEAgLTUzNSwxMyArNTYzLDE1IEBACiAJCS8qCiAJCSAqIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKLQkJCQkgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSwKLQkJCQkgICh2b2lkICopICZ0YWJsZV9wdHIpOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAorCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCisJCQkJIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSwgKHZvaWQgKikgJnRhYmxlX3B0cik7CisKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCiAJCQkJQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpKTsKKwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CiAKQEAgLTU1MSw5ICs1ODEsMTEgQEAKIAkJaWYgKG1lbV9yb3ZlcikgewogCQkJLyogRm91bmQgaXQsIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwogCi0JCQlwaHlzaWNhbF9hZGRyZXNzID0gQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsgQUNQSV9QVFJfRElGRiAobWVtX3JvdmVyLCB0YWJsZV9wdHIpOworCQkJcGh5c2ljYWxfYWRkcmVzcyA9CisJCQkJQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsgQUNQSV9QVFJfRElGRiAobWVtX3JvdmVyLCB0YWJsZV9wdHIpOwogCi0JCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKKwkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQorCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAkJfQogCX0KQEAgLTU2Miw5ICs1OTQsOCBAQAogCSAqIFBoeXNpY2FsIGFkZHJlc3NpbmcKIAkgKi8KIAllbHNlIHsKLQkJLyoKLQkJICogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEVCREEKLQkJICovCisJCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFQkRBICovCisKIAkJQUNQSV9NT1ZFXzE2X1RPXzMyICgmcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1BUUl9MT0NBVElPTik7CiAJCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7ICAgICAvKiBDb252ZXJ0IHNlZ21lbnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLwogCkBAIC01NzIsOSArNjAzLDExIEBACiAKIAkJaWYgKHBoeXNpY2FsX2FkZHJlc3MgPiAweDQwMCkgewogCQkJLyoKLQkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRhIGlzIHJlcXVpcmVkIHRvIGJlIGEgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQorCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYSBtaW5pbXVtIG9mCisJCQkgKiAgICAgMV9rIGxlbmd0aCkKIAkJCSAqLwotCQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoQUNQSV9QSFlTQUREUl9UT19QVFIgKHBoeXNpY2FsX2FkZHJlc3MpLAorCQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCisJCQkJCSAgQUNQSV9QSFlTQUREUl9UT19QVFIgKHBoeXNpY2FsX2FkZHJlc3MpLAogCQkJCQkgIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CiAJCQlpZiAobWVtX3JvdmVyKSB7CiAJCQkJLyogRm91bmQgaXQsIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwpAQCAtNTg0LDEwICs2MTcsMTAgQEAKIAkJCX0KIAkJfQogCi0JCS8qCi0JCSAqIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoCi0JCSAqLwotCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwIChBQ1BJX1BIWVNBRERSX1RPX1BUUiAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFKSwKKwkJLyogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmggKi8KKworCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICgKKwkJCQkgIEFDUElfUEhZU0FERFJfVE9fUFRSIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UpLAogCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKIAkJaWYgKG1lbV9yb3ZlcikgewogCQkJLyogRm91bmQgaXQsIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jIGIvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCmluZGV4IGM4NDk5N2MuLjczYjFkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKQEAgLTI2Myw2ICsyNjMsOSBAQAogCSAqIGRlc3RpbmF0aW9uIHNvIHRoYXQgc3NjYW5mIGNhbiBiZSB1c2VkIG9uIGl0IHNhZmVseS4KIAkgKi8KIAl0bXBfYnVmZmVyID0ga21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOworCWlmKCF0bXBfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlmIChjb3B5X2Zyb21fdXNlcih0bXBfYnVmZmVyLCBidWZmZXIsIGNvdW50KSkgewogCQlyZXN1bHQgPSAtRUZBVUxUOwogCX0KQEAgLTUyOSw2ICs1MzIsMTEgQEAKIAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCl7CisJCXByaW50ayhNWV9JTkZPICJVc2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsJCisJfQogCS8qIHNpbXBsZSBkZXZpY2UgZGV0ZWN0aW9uOiBsb29rIGZvciBIQ0kgbWV0aG9kICovCiAJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChNRVRIT0RfSENJXzEpKQogCQltZXRob2RfaGNpID0gTUVUSE9EX0hDSV8xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYwppbmRleCAzMzEzNDM5Li5jNGU3Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYwpAQCAtNDcsOCArNDcsMzUgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRhbGxvYyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2lmZGVmCUFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCitzdGF0aWMgc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICoKK2FjcGlfdXRfZmluZF9hbGxvY2F0aW9uICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbik7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCisJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWRkcmVzcywKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24gKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICphZGRyZXNzLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworI2VuZGlmCS8qIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlCiAgKgpAQCAtOTgsNyArMTI1LDggQEAKIAogCQkvKiBQdXQgdGhlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgY2FjaGUgbGlzdCAqLwogCi0JCSogKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsICYoKChjaGFyICopIG9iamVjdClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpID0gY2FjaGVfaW5mby0+bGlzdF9oZWFkOworCQkqIChBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLAorCQkJJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSkgPSBjYWNoZV9pbmZvLT5saXN0X2hlYWQ7CiAJCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9IG9iamVjdDsKIAkJY2FjaGVfaW5mby0+Y2FjaGVfZGVwdGgrKzsKIApAQCAtMTE1LDcgKzE0Myw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUKICAqCkBAIC0xNTYsNyArMTg0LDggQEAKIAkJLyogVGhlcmUgaXMgYW4gb2JqZWN0IGF2YWlsYWJsZSwgdXNlIGl0ICovCiAKIAkJb2JqZWN0ID0gY2FjaGVfaW5mby0+bGlzdF9oZWFkOwotCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsICYoKChjaGFyICopIG9iamVjdClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpOworCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsCisJCQkJICYoKChjaGFyICopIG9iamVjdClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpOwogCiAJCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT5jYWNoZV9oaXRzKyspOwogCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aC0tOwpAQCAtMjAxLDcgKzIzMCw3IEBACiAKIAogI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZQogICoKQEAgLTIyOCw3ICsyNTcsOCBAQAogCXdoaWxlIChjYWNoZV9pbmZvLT5saXN0X2hlYWQpIHsKIAkJLyogRGVsZXRlIG9uZSBjYWNoZWQgc3RhdGUgb2JqZWN0ICovCiAKLQkJbmV4dCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwgJigoKGNoYXIgKikgY2FjaGVfaW5mby0+bGlzdF9oZWFkKVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7CisJCW5leHQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsCisJCQkJICYoKChjaGFyICopIGNhY2hlX2luZm8tPmxpc3RfaGVhZClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpOwogCQlBQ1BJX01FTV9GUkVFIChjYWNoZV9pbmZvLT5saXN0X2hlYWQpOwogCiAJCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9IG5leHQ7CkBAIC00OTcsOCArNTI3LDggQEAKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIAogCi0JYWxsb2NhdGlvbiA9IGFjcGlfdXRfYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLCBjb21wb25lbnQsCi0JCQkgIG1vZHVsZSwgbGluZSk7CisJYWxsb2NhdGlvbiA9IGFjcGlfdXRfYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAorCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQpAQCAtNTQzLDggKzU3Myw4IEBACiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKIAotCWFsbG9jYXRpb24gPSBhY3BpX3V0X2NhbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksIGNvbXBvbmVudCwKLQkJCSAgbW9kdWxlLCBsaW5lKTsKKwlhbGxvY2F0aW9uID0gYWNwaV91dF9jYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAorCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCS8qIFJlcG9ydCBhbGxvY2F0aW9uIGVycm9yICovCiAKQEAgLTYzNyw3ICs2NjcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqCitzdGF0aWMgc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICoKIGFjcGlfdXRfZmluZF9hbGxvY2F0aW9uICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbikKQEAgLTY4Niw3ICs3MTYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAogCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFsbG9jYXRpb24sCkBAIC03MjEsMTAgKzc1MSwxMiBAQAogCiAJZWxlbWVudCA9IGFjcGlfdXRfZmluZF9hbGxvY2F0aW9uIChsaXN0X2lkLCBhbGxvY2F0aW9uKTsKIAlpZiAoZWxlbWVudCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJ1dF90cmFja19hbGxvY2F0aW9uOiBBbGxvY2F0aW9uIGFscmVhZHkgcHJlc2VudCBpbiBsaXN0ISAoJXApXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJInV0X3RyYWNrX2FsbG9jYXRpb246IEFsbG9jYXRpb24gYWxyZWFkeSBwcmVzZW50IGluIGxpc3QhICglcClcbiIsCiAJCQlhbGxvY2F0aW9uKSk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJFbGVtZW50ICVwIEFkZHJlc3MgJXBcbiIsIGVsZW1lbnQsIGFsbG9jYXRpb24pKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJFbGVtZW50ICVwIEFkZHJlc3MgJXBcbiIsCisJCQllbGVtZW50LCBhbGxvY2F0aW9uKSk7CiAKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQpAQCAtNzczLDcgKzgwNSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAogCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFsbG9jYXRpb24sCkBAIC03OTcsNyArODI5LDcgQEAKIAkJLyogTm8gYWxsb2NhdGlvbnMhICovCiAKIAkJX0FDUElfUkVQT1JUX0VSUk9SIChtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKLQkJCQkoInV0X3JlbW92ZV9hbGxvY2F0aW9uOiBFbXB0eSBhbGxvY2F0aW9uIGxpc3QsIG5vdGhpbmcgdG8gZnJlZSFcbiIpKTsKKwkJCSgidXRfcmVtb3ZlX2FsbG9jYXRpb246IEVtcHR5IGFsbG9jYXRpb24gbGlzdCwgbm90aGluZyB0byBmcmVlIVxuIikpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KQEAgLTgyNCw3ICs4NTYsOCBAQAogCiAJQUNQSV9NRU1TRVQgKCZhbGxvY2F0aW9uLT51c2VyX3NwYWNlLCAweEVBLCBhbGxvY2F0aW9uLT5zaXplKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZWluZyBzaXplIDAlWFxuIiwgYWxsb2NhdGlvbi0+c2l6ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZWluZyBzaXplIDAlWFxuIiwKKwkJYWxsb2NhdGlvbi0+c2l6ZSkpOwogCiAJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9NRU1PUlkpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTg0Miw2ICs4NzUsNyBAQAogICogREVTQ1JJUFRJT046IFByaW50IHNvbWUgaW5mbyBhYm91dCB0aGUgb3V0c3RhbmRpbmcgYWxsb2NhdGlvbnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKQEAgLTg4NCw3ICs5MTgsOCBAQAogCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAogCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIk1heCBOb2RlcyIsCiAJCQkgIGFjcGlfZ2JsX21heF9jb25jdXJyZW50X25vZGVfY291bnQsCi0JCQkgIFJPVU5EX1VQX1RPXzFLICgoYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpKSkpKTsKKwkJCSAgUk9VTkRfVVBfVE9fMUsgKChhY3BpX2dibF9tYXhfY29uY3VycmVudF9ub2RlX2NvdW50ICoKKwkJCQkJIHNpemVvZiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpKSkpKTsKICovCiAJcmV0dXJuX1ZPSUQ7CiB9CkBAIC05MzMsMjYgKzk2OCwyNiBAQAogCQkJZGVzY3JpcHRvciA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfZGVzY3JpcHRvciwgJmVsZW1lbnQtPnVzZXJfc3BhY2UpOwogCQkJaWYgKGRlc2NyaXB0b3ItPmRlc2NyaXB0b3JfaWQgIT0gQUNQSV9ERVNDX1RZUEVfQ0FDSEVEKSB7CiAJCQkJYWNwaV9vc19wcmludGYgKCIlcCBMZW4gJTA0WCAlOS45cy0lZCBbJXNdICIsCi0JCQkJCQkgZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwgZWxlbWVudC0+bW9kdWxlLAotCQkJCQkJIGVsZW1lbnQtPmxpbmUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoZGVzY3JpcHRvcikpOworCQkJCQlkZXNjcmlwdG9yLCBlbGVtZW50LT5zaXplLCBlbGVtZW50LT5tb2R1bGUsCisJCQkJCWVsZW1lbnQtPmxpbmUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoZGVzY3JpcHRvcikpOwogCiAJCQkJLyogTW9zdCBvZiB0aGUgZWxlbWVudHMgd2lsbCBiZSBPcGVyYW5kIG9iamVjdHMuICovCiAKIAkJCQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoZGVzY3JpcHRvcikpIHsKIAkJCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAJCQkJCWFjcGlfb3NfcHJpbnRmICgiJTEyLjEycyBSJWhkIiwKLQkJCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKGRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24udHlwZSksCi0JCQkJCQkJZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCQkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChkZXNjcmlwdG9yLT5vYmplY3QuY29tbW9uLnR5cGUpLAorCQkJCQkJZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfUEFSU0VSOgogCQkJCQlhY3BpX29zX3ByaW50ZiAoImFtbF9vcGNvZGUgJTA0aFgiLAotCQkJCQkJCWRlc2NyaXB0b3ItPm9wLmFzbC5hbWxfb3Bjb2RlKTsKKwkJCQkJCWRlc2NyaXB0b3ItPm9wLmFzbC5hbWxfb3Bjb2RlKTsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIEFDUElfREVTQ19UWVBFX05BTUVEOgogCQkJCQlhY3BpX29zX3ByaW50ZiAoIiU0LjRzIiwKLQkJCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKCZkZXNjcmlwdG9yLT5ub2RlKSk7CisJCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKCZkZXNjcmlwdG9yLT5ub2RlKSk7CiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKQEAgLTk4Myw2ICsxMDE4LDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAjZW5kaWYgIC8qICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwppbmRleCAwZmNkOThiLi4xMWU4ODQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKQEAgLTQ5LDIxICs0OSw2OSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGNvcHkiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAorCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NwYWNlLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zcGFjZV91c2VkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3BhY2VfdXNlZCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSgKKwl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICp1c2VyX29iaiwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX29iaik7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50ICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3Rfb2JqLAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgZXhhbWluaW5nCi0gKiAgICAgICAgICAgICAgKkJ1ZmZlciAgICAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAqc3BhY2VfdXNlZCAgICAgICAgIC0gV2hlcmUgdGhlIGRhdGEgbGVuZ3RoIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFNvdXJjZSBvYmplY3QgdG8gYmUgY29waWVkCisgKiAgICAgICAgICAgICAgZXh0ZXJuYWxfb2JqZWN0ICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgY29waWVkIG9iamVjdAorICogICAgICAgICAgICAgIGRhdGFfc3BhY2UgICAgICAgICAgLSBXaGVyZSBvYmplY3QgZGF0YSBpcyByZXR1cm5lZCAoc3VjaCBhcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgYW5kIHN0cmluZyBkYXRhKQorICogICAgICAgICAgICAgIGJ1ZmZlcl9zcGFjZV91c2VkICAgLSBMZW5ndGggb2YgZGF0YV9zcGFjZSB0aGF0IHdhcyB1c2VkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwbGFjZSBhIHNpbXBsZSBvYmplY3QgaW4gYSB1c2VyCi0gKiAgICAgICAgICAgICAgYnVmZmVyLgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvcHkgYSBzaW1wbGUgaW50ZXJuYWwgb2JqZWN0IHRvCisgKiAgICAgICAgICAgICAgYW4gZXh0ZXJuYWwgb2JqZWN0LgogICoKLSAqICAgICAgICAgICAgICBUaGUgYnVmZmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHNwYWNlIGZvciB0aGUgb2JqZWN0LgorICogICAgICAgICAgICAgIFRoZSBkYXRhX3NwYWNlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGhhdmUgc3VmZmljaWVudCBzcGFjZSBmb3IKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEwNywxMCArMTU1LDEyIEBACiAKIAkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9IChjaGFyICopIGRhdGFfc3BhY2U7CiAJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCA9IGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aDsKLQkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAorCQkJCSAgIChhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCArIDEpOwogCi0JCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLCAodm9pZCAqKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJCSAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJQUNQSV9NRU1DUFkgKCh2b2lkICopIGRhdGFfc3BhY2UsCisJCQkodm9pZCAqKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAorCQkJKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCWJyZWFrOwogCiAKQEAgLTExOCwxMCArMTY4LDEyIEBACiAKIAkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciA9IGRhdGFfc3BhY2U7CiAJCWV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCA9IGludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aDsKLQkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoKTsKKwkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCisJCQkJICAgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoKTsKIAotCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwgKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKLQkJCQkgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkgKCh2b2lkICopIGRhdGFfc3BhY2UsCisJCQkodm9pZCAqKSBpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAorCQkJaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKIAkJYnJlYWs7CiAKIApAQCAtMTk0LDcgKzI0Niw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50ICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCkBAIC0yMTMsNyArMjY1LDcgQEAKIAogCXRoaXNfaW5kZXggICA9IHN0YXRlLT5wa2cuaW5kZXg7CiAJdGFyZ2V0X29iamVjdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKQotCQkJICAmKCh1bmlvbiBhY3BpX29iamVjdCAqKShzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0KSktPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CisJCSYoKHVuaW9uIGFjcGlfb2JqZWN0ICopKHN0YXRlLT5wa2cuZGVzdF9vYmplY3QpKS0+cGFja2FnZS5lbGVtZW50c1t0aGlzX2luZGV4XTsKIAogCXN3aXRjaCAob2JqZWN0X3R5cGUpIHsKIAljYXNlIEFDUElfQ09QWV9UWVBFX1NJTVBMRToKQEAgLTIzNiw3ICsyODgsOCBAQAogCQkgKi8KIAkJdGFyZ2V0X29iamVjdC0+dHlwZSAgICAgICAgICAgICA9IEFDUElfVFlQRV9QQUNLQUdFOwogCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICAgID0gc291cmNlX29iamVjdC0+cGFja2FnZS5jb3VudDsKLQkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLT5mcmVlX3NwYWNlKTsKKwkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9CisJCQlBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwgaW5mby0+ZnJlZV9zcGFjZSk7CiAKIAkJLyoKIAkJICogUGFzcyB0aGUgbmV3IHBhY2thZ2Ugb2JqZWN0IGJhY2sgdG8gdGhlIHBhY2thZ2Ugd2FsayByb3V0aW5lCkBAIC0yNDgsNyArMzAxLDggQEAKIAkJICogdXBkYXRlIHRoZSBidWZmZXIgbGVuZ3RoIGNvdW50ZXIKIAkJICovCiAJCW9iamVjdF9zcGFjZSA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAotCQkJCSAgIChhY3BpX3NpemUpIHRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgKiBzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJCQkJICAgKGFjcGlfc2l6ZSkgdGFyZ2V0X29iamVjdC0+cGFja2FnZS5jb3VudCAqCisJCQkJICAgc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOwogCQlicmVhazsKIAogCkBAIC0yNjYsOSArMzIwLDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIHJldHVybmluZwotICogICAgICAgICAgICAgICpCdWZmZXIgICAgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgKnNwYWNlX3VzZWQgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgbGVuZ3RoIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBzcGFjZV91c2VkICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBsZW5ndGggaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzA0LDEzICszNTgsMTUgQEAKIAkgKiBGcmVlIHNwYWNlIGJlZ2lucyByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFja2FnZQogCSAqLwogCWluZm8ubGVuZ3RoICAgICAgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7Ci0JaW5mby5mcmVlX3NwYWNlICA9IGJ1ZmZlciArIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLmZyZWVfc3BhY2UgID0gYnVmZmVyICsgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCisJCQkgICBzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CiAJaW5mby5vYmplY3Rfc3BhY2UgPSAwOwogCWluZm8ubnVtX3BhY2thZ2VzID0gMTsKIAogCWV4dGVybmFsX29iamVjdC0+dHlwZSAgICAgICAgICAgID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGludGVybmFsX29iamVjdCk7CiAJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICAgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vYmplY3QsIGluZm8uZnJlZV9zcGFjZSk7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vYmplY3QsCisJCQkgIGluZm8uZnJlZV9zcGFjZSk7CiAKIAkvKgogCSAqIExlYXZlIHJvb20gZm9yIGFuIGFycmF5IG9mIEFDUElfT0JKRUNUUyBpbiB0aGUgYnVmZmVyCkBAIC0zMzMsOCArMzg5LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gVGhlIGludGVybmFsIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQKLSAqICAgICAgICAgICAgICAqYnVmZmVyX3B0ciAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBUaGUgaW50ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAorICogICAgICAgICAgICAgIGJ1ZmZlcl9wdHIgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTM2NywxMCArNDIzLDEwIEBACiAJCSAqIEJ1aWxkIGEgc2ltcGxlIG9iamVjdCAobm8gbmVzdGVkIG9iamVjdHMpCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlIChpbnRlcm5hbF9vYmplY3QsCi0JCQkJICAodW5pb24gYWNwaV9vYmplY3QgKikgcmV0X2J1ZmZlci0+cG9pbnRlciwKLQkJCQkgICgodTggKikgcmV0X2J1ZmZlci0+cG9pbnRlciArCi0JCQkJICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSkpLAotCQkJCSAgJnJldF9idWZmZXItPmxlbmd0aCk7CisJCQkJICh1bmlvbiBhY3BpX29iamVjdCAqKSByZXRfYnVmZmVyLT5wb2ludGVyLAorCQkJCSAoKHU4ICopIHJldF9idWZmZXItPnBvaW50ZXIgKworCQkJCSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSkpLAorCQkJCSAmcmV0X2J1ZmZlci0+bGVuZ3RoKTsKIAkJLyoKIAkJICogYnVpbGQgc2ltcGxlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG9iamVjdCBzaXplIGluIHRoZSBsZW5ndGgKIAkJICogc28gd2UgYWRkIGl0IGluIGhlcmUKQEAgLTM4Niw4ICs0NDIsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlCiAgKgotICogUEFSQU1FVEVSUzogICpleHRlcm5hbF9vYmplY3QgICAtIFRoZSBleHRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCi0gKiAgICAgICAgICAgICAgKmludGVybmFsX29iamVjdCAgIC0gV2hlcmUgdGhlIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGV4dGVybmFsX29iamVjdCAgICAgLSBUaGUgZXh0ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAorICogICAgICAgICAgICAgIHJldF9pbnRlcm5hbF9vYmplY3QgLSBXaGVyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTM5OCw3ICs0NTQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUgKAogCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0X2ludGVybmFsX29iamVjdCkKQEAgLTQxNyw3ICs0NzMsOCBAQAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCWludGVybmFsX29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoKHU4KSBleHRlcm5hbF9vYmplY3QtPnR5cGUpOworCQlpbnRlcm5hbF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKAorCQkJCSAgICh1OCkgZXh0ZXJuYWxfb2JqZWN0LT50eXBlKTsKIAkJaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtNDg2LDcgKzU0Myw2IEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCi0KIC8qIENvZGUgdG8gY29udmVydCBwYWNrYWdlcyB0aGF0IGFyZSBwYXJhbWV0ZXJzIHRvIGNvbnRyb2wgbWV0aG9kcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjE0LDcgKzY3MCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYykKQEAgLTcyNCw3ICs3ODAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LApAQCAtODM3LDcgKzg5Myw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3Rfb2JqLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwppbmRleCA5ODVjNWQwLi43OTRjN2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwpAQCAtNTYsNyArNTYsNyBAQAogc3RhdGljIGNoYXIgICAgICphY3BpX2dibF9mbl9leGl0X3N0ciA9ICItLS0tRXhpdC0iOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZQogICoKQEAgLTY0LDkgKzY0LDkgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBTYXZlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIKKyAqIERFU0NSSVBUSU9OOiBTYXZlIHRoZSBjdXJyZW50IENQVSBzdGFjayBwb2ludGVyIGF0IHN1YnN5c3RlbSBzdGFydHVwCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlICgKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyCiAgKgpAQCAtODcsOSArODcsOSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlcgorICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgKQEAgLTExMCwxNiArMTEwLDE2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlYnVnX3ByaW50CiAgKgotICogUEFSQU1FVEVSUzogIGRlYnVnX2xldmVsICAgICAgICAgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKLSAqICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCisgKiBQQVJBTUVURVJTOiAgcmVxdWVzdGVkX2RlYnVnX2xldmVsIC0gUmVxdWVzdGVkIGRlYnVnIHByaW50IGxldmVsCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKgorICogICAgICAgICAgICAgIGRiZ19pbmZvICAgICAgICAgICAgLSBDb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgZmllbGQKICAqICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgcHJpbnRmIGFyZ3VtZW50cwogICoKQEAgLTEyOCw3ICsxMjgsNyBAQAogICogREVTQ1JJUFRJT046IFByaW50IGVycm9yIG1lc3NhZ2Ugd2l0aCBwcmVmaXggY29uc2lzdGluZyBvZiB0aGUgbW9kdWxlIG5hbWUsCiAgKiAgICAgICAgICAgICAgbGluZSBudW1iZXIsIGFuZCBjb21wb25lbnQgSUQuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkICBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQogYWNwaV91dF9kZWJ1Z19wcmludCAoCkBAIC0xNTcsNyArMTU3LDggQEAKIAogCWlmICh0aHJlYWRfaWQgIT0gYWNwaV9nYmxfcHJldl90aHJlYWRfaWQpIHsKIAkJaWYgKEFDUElfTFZfVEhSRUFEUyAmIGFjcGlfZGJnX2xldmVsKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAorCQkJYWNwaV9vc19wcmludGYgKAorCQkJCSJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJVggdG8gVElEICVYICoqKipcblxuIiwKIAkJCQlhY3BpX2dibF9wcmV2X3RocmVhZF9pZCwgdGhyZWFkX2lkKTsKIAkJfQogCkBAIC0xNzQsMTUgKzE3NSwxNiBAQAogCQlhY3BpX29zX3ByaW50ZiAoIlslMDRsWF0gIiwgdGhyZWFkX2lkKTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlslMDJsZF0gJS0yMi4yMnM6ICIsIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsIGRiZ19pbmZvLT5wcm9jX25hbWUpOworCWFjcGlfb3NfcHJpbnRmICgiWyUwMmxkXSAlLTIyLjIyczogIiwKKwkJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCwgZGJnX2luZm8tPnByb2NfbmFtZSk7CiAKIAl2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKIAlhY3BpX29zX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV91dF9kZWJ1Z19wcmludCk7CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlYnVnX3ByaW50X3JhdwogICoKQEAgLTIwMCw3ICsyMDIsNyBAQAogICogREVTQ1JJUFRJT046IFByaW50IG1lc3NhZ2Ugd2l0aCBubyBoZWFkZXJzLiAgSGFzIHNhbWUgaW50ZXJmYWNlIGFzCiAgKiAgICAgICAgICAgICAgZGVidWdfcHJpbnQgc28gdGhhdCB0aGUgc2FtZSBtYWNyb3MgY2FuIGJlIHVzZWQuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkICBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQogYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgKApAQCAtMjI0LDcgKzIyNiw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3KTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2UKICAqCkBAIC0yMzksNyArMjQxLDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdHJhY2UgKApAQCAtMjU2LDcgKzI1OCw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV9wdHIKICAqCkBAIC0yNzIsNyArMjc0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdHJhY2VfcHRyICgKQEAgLTI4OCw3ICsyOTAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV9zdHIKICAqCkBAIC0zMDQsNyArMzA2LDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdHJhY2Vfc3RyICgKQEAgLTMyMSw3ICszMjMsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV91MzIKICAqCkBAIC0zMzcsNyArMzM5LDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdHJhY2VfdTMyICgKQEAgLTM1NCw3ICszNTYsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGl0CiAgKgpAQCAtMzY5LDcgKzM3MSw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfZXhpdCAoCkBAIC0zODUsNyArMzg3LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV91dF9leGl0KTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RhdHVzX2V4aXQKICAqCkBAIC00MDEsNyArNDAzLDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbC4gUHJpbnRzIGV4aXQgc3RhdHVzIGFsc28uCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3N0YXR1c19leGl0ICgKQEAgLTQyNiw3ICs0MjgsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3V0X3N0YXR1c19leGl0KTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsdWVfZXhpdAogICoKQEAgLTQ0Miw3ICs0NDQsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF92YWx1ZV9leGl0ICgKQEAgLTQ2MCw3ICs0NjIsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3V0X3ZhbHVlX2V4aXQpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9wdHJfZXhpdAogICoKQEAgLTQ2OSwxNCArNDcxLDE0IEBACiAgKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQogICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKICAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBwcmludGVkIHdpdGggZXhpdCBtc2cKKyAqICAgICAgICAgICAgICBQdHIgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHZhbHVlIGFsc28uCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3B0cl9leGl0ICgKQEAgLTQ5NCw3ICs0OTYsNyBAQAogI2VuZGlmCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R1bXBfYnVmZmVyCiAgKgpAQCAtNTA3LDcgKzUwOSw3IEBACiAgKgogICogREVTQ1JJUFRJT046IEdlbmVyaWMgZHVtcCBidWZmZXIgaW4gYm90aCBoZXggYW5kIGFzY2lpLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9kdW1wX2J1ZmZlciAoCkBAIC01MzMsMzQgKzUzNSwyOCBAQAogCQlkaXNwbGF5ID0gREJfQllURV9ESVNQTEFZOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiXG5PZmZzZXQgVmFsdWVcbiIpOworCS8qIE5hc3R5IGxpdHRsZSBkdW1wIGJ1ZmZlciByb3V0aW5lISAqLwogCi0JLyoKLQkgKiBOYXN0eSBsaXR0bGUgZHVtcCBidWZmZXIgcm91dGluZSEKLQkgKi8KIAl3aGlsZSAoaSA8IGNvdW50KSB7CiAJCS8qIFByaW50IGN1cnJlbnQgb2Zmc2V0ICovCiAKLQkJYWNwaV9vc19wcmludGYgKCIlMDVYICAiLCAodTMyKSBpKTsKKwkJYWNwaV9vc19wcmludGYgKCIlNi40WDogIiwgKHUzMikgaSk7CiAKIAkJLyogUHJpbnQgMTYgaGV4IGNoYXJzICovCiAKIAkJZm9yIChqID0gMDsgaiA8IDE2OykgewogCQkJaWYgKGkgKyBqID49IGNvdW50KSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOwotCQkJCXJldHVybjsKKwkJCQkvKiBEdW1wIGZpbGwgc3BhY2VzICovCisKKwkJCQlhY3BpX29zX3ByaW50ZiAoIiUqcyIsICgoZGlzcGxheSAqIDIpICsgMSksICIgIik7CisJCQkJaiArPSBkaXNwbGF5OworCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgczggZG9lc24ndCBnZXQgc2lnbi1leHRlbmRlZCEgKi8KLQogCQkJc3dpdGNoIChkaXNwbGF5KSB7Ci0JCQkvKiBEZWZhdWx0IGlzIEJZVEUgZGlzcGxheSAqLworCQkJZGVmYXVsdDogICAgLyogRGVmYXVsdCBpcyBCWVRFIGRpc3BsYXkgKi8KIAotCQkJZGVmYXVsdDoKLQotCQkJCWFjcGlfb3NfcHJpbnRmICgiJTAyWCAiLAotCQkJCQkJKigodTggKikgJmJ1ZmZlcltpICsgal0pKTsKLQkJCQlqICs9IDE7CisJCQkJYWNwaV9vc19wcmludGYgKCIlMDJYICIsIGJ1ZmZlcltpICsgal0pOwogCQkJCWJyZWFrOwogCiAKQEAgLTU2OCw3ICs1NjQsNiBAQAogCiAJCQkJQUNQSV9NT1ZFXzE2X1RPXzMyICgmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7CiAJCQkJYWNwaV9vc19wcmludGYgKCIlMDRYICIsIHRlbXAzMik7Ci0JCQkJaiArPSAyOwogCQkJCWJyZWFrOwogCiAKQEAgLTU3Niw3ICs1NzEsNiBAQAogCiAJCQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7CiAJCQkJYWNwaV9vc19wcmludGYgKCIlMDhYICIsIHRlbXAzMik7Ci0JCQkJaiArPSA0OwogCQkJCWJyZWFrOwogCiAKQEAgLTU4NywxNSArNTgxLDE3IEBACiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZ0ZW1wMzIsICZidWZmZXJbaSArIGogKyA0XSk7CiAJCQkJYWNwaV9vc19wcmludGYgKCIlMDhYICIsIHRlbXAzMik7Ci0JCQkJaiArPSA4OwogCQkJCWJyZWFrOwogCQkJfQorCisJCQlqICs9IGRpc3BsYXk7CiAJCX0KIAogCQkvKgogCQkgKiBQcmludCB0aGUgQVNDSUkgZXF1aXZhbGVudCBjaGFyYWN0ZXJzCiAJCSAqIEJ1dCB3YXRjaCBvdXQgZm9yIHRoZSBiYWQgdW5wcmludGFibGUgb25lcy4uLgogCQkgKi8KKwkJYWNwaV9vc19wcmludGYgKCIgIik7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CiAJCQlpZiAoaSArIGogPj0gY291bnQpIHsKIAkJCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKaW5kZXggOWE1MmFkNS4uYmM1NDAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwpAQCAtNTEsMTIgKzUxLDIzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0ZGVsZXRlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOworCitzdGF0aWMgdm9pZAorYWNwaV91dF91cGRhdGVfcmVmX2NvdW50ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iagogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGRlbGV0ZWQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTY1LDcgKzc2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCiB7CkBAIC0xNTIsNyArMTYzLDggQEAKIAogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiKioqKiogTXV0ZXggJXAsIFNlbWFwaG9yZSAlcFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiKioqKiogTXV0ZXggJXAsIFNlbWFwaG9yZSAlcFxuIiwKIAkJCW9iamVjdCwgb2JqZWN0LT5tdXRleC5zZW1hcGhvcmUpKTsKIAogCQlhY3BpX2V4X3VubGlua19tdXRleCAob2JqZWN0KTsKQEAgLTE2Miw3ICsxNzQsOCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqKiBFdmVudCAlcCwgU2VtYXBob3JlICVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSIqKioqKiBFdmVudCAlcCwgU2VtYXBob3JlICVwXG4iLAogCQkJb2JqZWN0LCBvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSkpOwogCiAJCSh2b2lkKSBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUgKG9iamVjdC0+ZXZlbnQuc2VtYXBob3JlKTsKQEAgLTE3Miw3ICsxODUsOCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiKioqKiogTWV0aG9kICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiKioqKiogTWV0aG9kICVwXG4iLCBvYmplY3QpKTsKIAogCQkvKiBEZWxldGUgdGhlIG1ldGhvZCBzZW1hcGhvcmUgaWYgaXQgZXhpc3RzICovCiAKQEAgLTE4NSw3ICsxOTksOCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiKioqKiogUmVnaW9uICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiKioqKiogUmVnaW9uICVwXG4iLCBvYmplY3QpKTsKIAogCQlzZWNvbmRfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewpAQCAtMjEyLDcgKzIyNyw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqKiBCdWZmZXIgRmllbGQgJXBcbiIsIG9iamVjdCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSIqKioqKiBCdWZmZXIgRmllbGQgJXBcbiIsIG9iamVjdCkpOwogCiAJCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKIAkJaWYgKHNlY29uZF9kZXNjKSB7CkBAIC0yNDcsNyArMjYzLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9saXN0ICAgICAgIC0gUG9pbnRlciB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCisgKiBQQVJBTUVURVJTOiAgb2JqX2xpc3QgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0yODMsNyArMjk5LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfcmVmX2NvdW50CiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgaXMgdG8gYmUgdXBkYXRlZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgaXMgdG8gYmUgdXBkYXRlZAogICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIFdoYXQgdG8gZG8KICAqCiAgKiBSRVRVUk46ICAgICAgTmV3IHJlZiBjb3VudApAQCAtMzEyLDcgKzMyOCw4IEBACiAJbmV3X2NvdW50ID0gY291bnQ7CiAKIAkvKgotCSAqIFBlcmZvcm0gdGhlIHJlZmVyZW5jZSBjb3VudCBhY3Rpb24gKGluY3JlbWVudCwgZGVjcmVtZW50LCBvciBmb3JjZSBkZWxldGUpCisJICogUGVyZm9ybSB0aGUgcmVmZXJlbmNlIGNvdW50IGFjdGlvbgorCSAqIChpbmNyZW1lbnQsIGRlY3JlbWVudCwgb3IgZm9yY2UgZGVsZXRlKQogCSAqLwogCXN3aXRjaCAoYWN0aW9uKSB7CiAKQEAgLTMyMSw3ICszMzgsOCBAQAogCQluZXdfY291bnQrKzsKIAkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqICVwIFJlZnM9JVgsIFtJbmNyZW1lbnRlZF1cbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIk9iaiAlcCBSZWZzPSVYLCBbSW5jcmVtZW50ZWRdXG4iLAogCQkJb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJYnJlYWs7CiAKQEAgLTMyOSw3ICszNDcsOCBAQAogCWNhc2UgUkVGX0RFQ1JFTUVOVDoKIAogCQlpZiAoY291bnQgPCAxKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk9iaiAlcCBSZWZzPSVYLCBjYW4ndCBkZWNyZW1lbnQhIChTZXQgdG8gMClcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKIAkJCQlvYmplY3QsIG5ld19jb3VudCkpOwogCiAJCQluZXdfY291bnQgPSAwOwpAQCAtMzM3LDEyICszNTYsMTQgQEAKIAkJZWxzZSB7CiAJCQluZXdfY291bnQtLTsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSJPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKIAkJCQlvYmplY3QsIG5ld19jb3VudCkpOwogCQl9CiAKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmplY3QpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiTWV0aG9kIE9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJIk1ldGhvZCBPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKIAkJCQlvYmplY3QsIG5ld19jb3VudCkpOwogCQl9CiAKQEAgLTM1Niw3ICszNzcsOCBAQAogCiAJY2FzZSBSRUZfRk9SQ0VfREVMRVRFOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqICVwIFJlZnM9JVgsIEZvcmNlIGRlbGV0ZSEgKFNldCB0byAwKVxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiT2JqICVwIFJlZnM9JVgsIEZvcmNlIGRlbGV0ZSEgKFNldCB0byAwKVxuIiwKIAkJCW9iamVjdCwgY291bnQpKTsKIAogCQluZXdfY291bnQgPSAwOwpAQCAtMzkwLDcgKzQxMiw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgICAgICAtIEluY3JlbWVudCByZWYgY291bnQgZm9yIHRoaXMgb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIEluY3JlbWVudCByZWYgY291bnQgZm9yIHRoaXMgb2JqZWN0CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbGwgc3ViLW9iamVjdHMKICAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIC0gRWl0aGVyIFJFRl9JTkNSRU1FTlQgb3IgUkVGX0RFQ1JFTUVOVCBvcgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfRk9SQ0VfREVMRVRFCkBAIC00MzEsNyArNDUzLDggQEAKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzbid0IGEgbmFtZXNwYWNlIGhhbmRsZSAqLwogCiAJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk9iamVjdCAlcCBpcyBOUyBoYW5kbGVcbiIsIG9iamVjdCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSJPYmplY3QgJXAgaXMgTlMgaGFuZGxlXG4iLCBvYmplY3QpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCkBAIC02MTQsOCArNjM3LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9hZGRfcmVmZXJlbmNlCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZmVyZW5jZSBjb3VudCBpcyB0byBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmZXJlbmNlIGNvdW50IGlzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ZWQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTY1Miw3ICs2NzUsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmIGNvdW50IHdpbGwgYmUgZGVjcmVtZW50ZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgd2lsbCBiZSBkZWNyZW1lbnRlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKaW5kZXggZWFkMjdkMi4uMDAwNDZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCkBAIC01MCw2ICs1MCwxOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGV2YWwiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3V0X2NvcHlfaWRfc3RyaW5nICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbiwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICAgICAgICpvbmVfY2lkKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIzNyw5ICsyNTAsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogICpvYmplY3RfbmFtZSAgICAgICAgLSBPYmplY3QgbmFtZSB0byBiZSBldmFsdWF0ZWQKKyAqIFBBUkFNRVRFUlM6ICBvYmplY3RfbmFtZSAgICAgICAgIC0gT2JqZWN0IG5hbWUgdG8gYmUgZXZhbHVhdGVkCiAgKiAgICAgICAgICAgICAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqQWRkcmVzcyAgICAgICAgICAgIC0gV2hlcmUgdGhlIHZhbHVlIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAtIFdoZXJlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zMDMsNyArMzE2LDYgQEAKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpCiB7CiAKLQogCS8qCiAJICogV29ya2Fyb3VuZCBmb3IgSUQgc3RyaW5ncyB0aGF0IGhhdmUgYSBsZWFkaW5nIGFzdGVyaXNrLiBUaGlzIGNvbnN0cnVjdAogCSAqIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gIChJRCBzdHJpbmdzIG11c3QgYmUKQEAgLTMyNSw3ICszMzcsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQKICAqCiAgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqSGlkICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIEhJRCBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIEhpZCAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgSElEIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQyOSw3ICs0NDEsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9DSUQKICAqCiAgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqQ2lkICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIENJRCBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIHJldHVybl9jaWRfbGlzdCAgICAgLSBXaGVyZSB0aGUgQ0lEIGxpc3QgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDg4LDEwICs1MDAsMTAgQEAKIAljaWRfbGlzdC0+c2l6ZSA9IHNpemU7CiAKIAkvKgotCSAqICBBIF9DSUQgY2FuIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgY29tcGF0aWJsZSBJRCBvciBhIHBhY2thZ2Ugb2YgY29tcGF0aWJsZQotCSAqICBJRHMuICBFYWNoIGNvbXBhdGlibGUgSUQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqICAtLSBOdW1iZXIgKDMyIGJpdCBjb21wcmVzc2VkIEVJU0EgSUQpIG9yCi0JICogIC0tIFN0cmluZyAoUENJIElEIGZvcm1hdCwgZS5nLiAiUENJXFZFTl92dnZ2JkRFVl9kZGRkJlNVQlNZU19zc3Nzc3NzcyIpLgorCSAqICBBIF9DSUQgY2FuIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgY29tcGF0aWJsZSBJRCBvciBhIHBhY2thZ2Ugb2YKKwkgKiAgY29tcGF0aWJsZSBJRHMuICBFYWNoIGNvbXBhdGlibGUgSUQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqICAxKSBJbnRlZ2VyICgzMiBiaXQgY29tcHJlc3NlZCBFSVNBIElEKSBvcgorCSAqICAyKSBTdHJpbmcgKFBDSSBJRCBmb3JtYXQsIGUuZy4gIlBDSVxWRU5fdnZ2diZERVZfZGRkZCZTVUJTWVNfc3Nzc3Nzc3MiKQogCSAqLwogCiAJLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLwpAQCAtNTM0LDcgKzU0Niw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX1VJRAogICoKICAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpVaWQgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgVUlEIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgVWlkICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBVSUQgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNTg3LDcgKzU5OSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX1NUQQogICoKICAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpGbGFncyAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgc3RhdHVzIGZsYWdzIGFyZSByZXR1cm5lZAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgc3RhdHVzIGZsYWdzIGFyZSByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02NDEsNyArNjUzLDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfU3hkcwogICoKICAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpGbGFncyAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgc3RhdHVzIGZsYWdzIGFyZSByZXR1cm5lZAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgc3RhdHVzIGZsYWdzIGFyZSByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKaW5kZXggMjViMGY4YS4uNDE0NjAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYwpAQCAtNDQsNyArNDQsNiBAQAogI2RlZmluZSBERUZJTkVfQUNQSV9HTE9CQUxTCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIApAQCAtNTIsMTMgKzUxLDE0IEBACiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGdsb2JhbCIpCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCiAgKgogICogUEFSQU1FVEVSUzogIFN0YXR1cyAgICAgICAtIFRoZSBhY3BpX3N0YXR1cyBjb2RlIHRvIGJlIGZvcm1hdHRlZAogICoKLSAqIFJFVFVSTjogICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gIHRleHQKKyAqIFJFVFVSTjogICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dC4gQSB2YWxpZCBwb2ludGVyIGlzCisgKiAgICAgICAgICAgICAgYWx3YXlzIHJldHVybmVkLgogICoKICAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcuCiAgKgpAQCAtNjgsOCArNjgsOCBAQAogYWNwaV9mb3JtYXRfZXhjZXB0aW9uICgKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cykKIHsKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb24gPSAiVU5LTk9XTl9TVEFUVVNfQ09ERSI7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdWJfc3RhdHVzOworCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmV4Y2VwdGlvbiA9IE5VTEw7CiAKIAogCUFDUElfRlVOQ1RJT05fTkFNRSAoImZvcm1hdF9leGNlcHRpb24iKTsKQEAgLTgyLDU3ICs4Miw1NSBAQAogCiAJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfRU5WX01BWCkgewogCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2VudiBbc3ViX3N0YXR1c107Ci0JCQlicmVhazsKIAkJfQotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCiAJY2FzZSBBRV9DT0RFX1BST0dSQU1NRVI6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9QR01fTUFYKSB7CiAJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtIFtzdWJfc3RhdHVzIC0xXTsKLQkJCWJyZWFrOwogCQl9Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfQUNQSV9UQUJMRVM6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9UQkxfTUFYKSB7CiAJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfdGJsIFtzdWJfc3RhdHVzIC0xXTsKLQkJCWJyZWFrOwogCQl9Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfQU1MOgogCiAJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfQU1MX01BWCkgewogCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbCBbc3ViX3N0YXR1cyAtMV07Ci0JCQlicmVhazsKIAkJfQotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCiAJY2FzZSBBRV9DT0RFX0NPTlRST0w6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9DVFJMX01BWCkgewogCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmwgW3N1Yl9zdGF0dXMgLTFdOwotCQkJYnJlYWs7CiAJCX0KLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAJfQogCisJaWYgKCFleGNlcHRpb24pIHsKKwkJLyogRXhjZXB0aW9uIGNvZGUgd2FzIG5vdCByZWNvZ25pemVkICovCiAKLQlyZXR1cm4gKChjb25zdCBjaGFyICopIGV4Y2VwdGlvbik7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIlVua25vd24gZXhjZXB0aW9uIGNvZGU6IDB4JTguOFhcbiIsIHN0YXR1cykpOwogCi11bmtub3duOgorCQlyZXR1cm4gKChjb25zdCBjaGFyICopICJVTktOT1dOX1NUQVRVU19DT0RFIik7CisJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKIAlyZXR1cm4gKChjb25zdCBjaGFyICopIGV4Y2VwdGlvbik7CiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTdGF0aWMgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLgogICoKQEAgLTIxMiwxMyArMjEwLDEyIEBACiB9OwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTmFtZXNwYWNlIGdsb2JhbHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qCiAgKiBQcmVkZWZpbmVkIEFDUEkgTmFtZXMgKEJ1aWx0LWluIHRvIHRoZSBJbnRlcnByZXRlcikKICAqCkBAIC0yNDEsOSArMjM4LDExIEBACiAjaWYgIWRlZmluZWQgKEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTikgfHwgZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpCiAJeyJfT1NJIiwgICAgQUNQSV9UWVBFX01FVEhPRCwgICAgICAgICAgIChjaGFyICopIDF9LAogI2VuZGlmCi0Je05VTEwsICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgICAvKiBUYWJsZSB0ZXJtaW5hdG9yICovCi19OwogCisJLyogVGFibGUgdGVybWluYXRvciAqLworCisJe05VTEwsICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgIE5VTEx9Cit9OwogCiAvKgogICogUHJvcGVydGllcyBvZiB0aGUgQUNQSSBPYmplY3QgVHlwZXMsIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsLgpAQCAtMjg4LDIyICsyODcsMjUgQEAKIC8qIEhleCB0byBBU0NJSSBjb252ZXJzaW9uIHRhYmxlICovCiAKIHN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2hleF90b19hc2NpaVtdID0KLQkJCSAgeycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsCi0JCQkJCSAnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKK3sKKwknMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLAorCSc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRicKK307CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyCiAgKgogICogUEFSQU1FVEVSUzogIEludGVnZXIgICAgICAgICAgICAgLSBDb250YWlucyB0aGUgaGV4IGRpZ2l0CiAgKiAgICAgICAgICAgICAgUG9zaXRpb24gICAgICAgICAgICAtIGJpdCBwb3NpdGlvbiBvZiB0aGUgZGlnaXQgd2l0aGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgKG11bHRpcGxlIG9mIDQpCiAgKgotICogUkVUVVJOOiAgICAgIEFzY2lpIGNoYXJhY3RlcgorICogUkVUVVJOOiAgICAgIFRoZSBjb252ZXJ0ZWQgQXNjaWkgY2hhcmFjdGVyCiAgKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBoZXggZGlnaXQgdG8gYW4gYXNjaWkgY2hhcmFjdGVyCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIGhleCBkaWdpdCB0byBhbiBBc2NpaSBjaGFyYWN0ZXIKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGNoYXIKIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIgKApAQCAtMzE1LDcgKzMxNyw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUYWJsZSBuYW1lIGdsb2JhbHMKICAqCkBAIC0zMjQsNyArMzI2LDcgQEAKICAqIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IHRoZSBzdWJzeXN0ZW0gYXJlIHNpbXBseSBpZ25vcmVkLgogICoKICAqIERvIE5PVCBhZGQgYW55IHRhYmxlIHRvIHRoaXMgbGlzdCB0aGF0IGlzIG5vdCBjb25zdW1lZCBkaXJlY3RseSBieSB0aGlzCi0gKiBzdWJzeXN0ZW0uCisgKiBzdWJzeXN0ZW0gKE5vIE1BRFQsIEVDRFQsIFNCU1QsIGV0Yy4pCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzkxLDcgKzM5Myw3IEBACiAJLyogQUNQSV9FVkVOVF9SVEMgICAgICAgICAgICovICB7QUNQSV9CSVRSRUdfUlRfQ0xPQ0tfU1RBVFVTLCAgICAgICBBQ1BJX0JJVFJFR19SVF9DTE9DS19FTkFCTEUsICAgICBBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfU1RBVFVTLCAgICAgICBBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfRU5BQkxFfSwKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKICAqCkBAIC00MDEsNyArNDAzLDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgU3BhY2UgSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogUmVnaW9uIHR5cGUgZGVjb2RpbmcgKi8KIApAQCAtNDI5LDcgKzQzMSw2IEBACiAJewogCQlyZXR1cm4gKCJ1c2VyX2RlZmluZWRfcmVnaW9uIik7CiAJfQotCiAJZWxzZSBpZiAoc3BhY2VfaWQgPj0gQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TKQogCXsKIAkJcmV0dXJuICgiaW52YWxpZF9zcGFjZV9pZCIpOwpAQCAtNDM5LDcgKzQ0MCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ldmVudF9uYW1lCiAgKgpAQCAtNDQ5LDcgKzQ1MCw3IEBACiAgKgogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIEV2ZW50IElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEV2ZW50IHR5cGUgZGVjb2RpbmcgKi8KIApAQCAtNDc3LDcgKzQ3OCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF90eXBlX25hbWUKICAqCkBAIC00ODcsMjAgKzQ4OCwyMSBAQAogICoKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBUeXBlIElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCiAgKiBFbGVtZW50cyBvZiBhY3BpX2dibF9uc190eXBlX25hbWVzIGJlbG93IG11c3QgbWF0Y2gKICAqIG9uZS10by1vbmUgd2l0aCB2YWx1ZXMgb2YgYWNwaV9vYmplY3RfdHlwZQogICoKLSAqIFRoZSB0eXBlIEFDUElfVFlQRV9BTlkgKFVudHlwZWQpIGlzIHVzZWQgYXMgYSAiZG9uJ3QgY2FyZSIgd2hlbiBzZWFyY2hpbmc7IHdoZW4KLSAqIHN0b3JlZCBpbiBhIHRhYmxlIGl0IHJlYWxseSBtZWFucyB0aGF0IHdlIGhhdmUgdGh1cyBmYXIgc2VlbiBubyBldmlkZW5jZSB0bwotICogaW5kaWNhdGUgd2hhdCB0eXBlIGlzIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHN0b3JlZCBmb3IgdGhpcyBlbnRyeS4KKyAqIFRoZSB0eXBlIEFDUElfVFlQRV9BTlkgKFVudHlwZWQpIGlzIHVzZWQgYXMgYSAiZG9uJ3QgY2FyZSIgd2hlbiBzZWFyY2hpbmc7CisgKiB3aGVuIHN0b3JlZCBpbiBhIHRhYmxlIGl0IHJlYWxseSBtZWFucyB0aGF0IHdlIGhhdmUgdGh1cyBmYXIgc2VlbiBubworICogZXZpZGVuY2UgdG8gaW5kaWNhdGUgd2hhdCB0eXBlIGlzIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHN0b3JlZCBmb3IgdGhpcyBlbnRyeS4KICAqLwogc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfYmFkX3R5cGVbXSA9ICJVTkRFRklORUQiOwotI2RlZmluZSBUWVBFX05BTUVfTEVOR1RIICAgIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBsZW5ndGggb2YgZWFjaCBzdHJpbmcgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbXSA9IC8qIHByaW50YWJsZSBuYW1lcyBvZiBBQ1BJIHR5cGVzICovCisvKiBQcmludGFibGUgbmFtZXMgb2YgdGhlIEFDUEkgb2JqZWN0IHR5cGVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9uc190eXBlX25hbWVzW10gPQogewogCS8qIDAwICovICJVbnR5cGVkIiwKIAkvKiAwMSAqLyAiSW50ZWdlciIsCkBAIC01NjQsNyArNTY2LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQogICoKQEAgLTU3NCw3ICs1NzYsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgbm9kZSBhbmQgcmV0dXJuIHRoZSBub2RlJ3MgQUNQSSBuYW1lLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY2hhciAqCiBhY3BpX3V0X2dldF9ub2RlX25hbWUgKApAQCAtNjE4LDcgKzYyMCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUKICAqCkBAIC02MjgsOSArNjMwLDExIEBACiAgKgogICogREVTQ1JJUFRJT046IFZhbGlkYXRlIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBkZXNjcmlwdG9yIHR5cGUKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kZXNjX3R5cGVfbmFtZXNbXSA9IC8qIHByaW50YWJsZSBuYW1lcyBvZiBkZXNjcmlwdG9yIHR5cGVzICovCisvKiBQcmludGFibGUgbmFtZXMgb2Ygb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tdID0KIHsKIAkvKiAwMCAqLyAiSW52YWxpZCIsCiAJLyogMDEgKi8gIkNhY2hlZCIsCkBAIC02NzYsMTcgKzY4MCwxOCBAQAogICogU3RyaW5ncyBhbmQgcHJvY2VkdXJlcyB1c2VkIGZvciBkZWJ1ZyBvbmx5CiAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9tdXRleF9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogIE5vbmUuCisgKiBQQVJBTUVURVJTOiAgbXV0ZXhfaWQgICAgICAgIC0gVGhlIHByZWRlZmluZWQgSUQgZm9yIHRoaXMgbXV0ZXguCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtdXRleC4gQWx3YXlzIHJldHVybnMgYSB2YWxpZAorICogICAgICAgICAgICAgIHBvaW50ZXIuCiAgKgogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIG11dGV4IElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGNoYXIgKgogYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoCkBAIC03MDAsMjEgKzcwNSwyMCBAQAogCiAJcmV0dXJuIChhY3BpX2dibF9tdXRleF9uYW1lc1ttdXRleF9pZF0pOwogfQotCiAjZW5kaWYKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUKICAqCiAgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgdmFsaWRhdGVkCiAgKgotICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdmFsaWQgb2JqZWN0IHR5cGUKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHZhbGlkIG9iamVjdCB0eXBlLCBGQUxTRSBvdGhlcndpc2UKICAqCiAgKiBERVNDUklQVElPTjogVmFsaWRhdGUgYW4gb2JqZWN0IHR5cGUKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHU4CiBhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlICgKQEAgLTczMiw3ICs3MzYsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkCiAgKgpAQCAtNzQwLDcgKzc0NCwxMCBAQAogICoKICAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIHRhYmxlIG9yIG1ldGhvZCBvd25lciBpZAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBOT1RFOiB0aGlzIGFsZ29yaXRobSBoYXMgYSB3cmFwYXJvdW5kIHByb2JsZW0gYXQgNjRfayBtZXRob2QgaW52b2NhdGlvbnMsIGFuZAorICogICAgICAgc2hvdWxkIGJlIHJldmlzaXRlZCAoVEJEKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfb3duZXJfaWQKIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKApAQCAtNzk2LDE2ICs4MDMsMTggQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9pbml0X2dsb2JhbHMKICAqCi0gKiBQQVJBTUVURVJTOiAgbm9uZQorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBJbml0IGxpYnJhcnkgZ2xvYmFscy4gIEFsbCBnbG9iYWxzIHRoYXQgcmVxdWlyZSBzcGVjaWZpYwogICogICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBpbml0aWFsaXplZCBoZXJlIQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X2luaXRfZ2xvYmFscyAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwppbmRleCBiZGJhZGFmLi43ZjM3MTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKQEAgLTQ5LDE5ICs0OSwyOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGluaXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lzdGVyX25hbWUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlICgKKwl2b2lkKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IKICAqCi0gKiBQQVJBTUVURVJTOiAgKnJlZ2lzdGVyX25hbWUgICAgICAgICAgLSBQb2ludGVyIHRvIHN0cmluZyBpZGVudGlmeWluZyByZWdpc3RlcgorICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX25hbWUgICAgICAgICAgIC0gUG9pbnRlciB0byBzdHJpbmcgaWRlbnRpZnlpbmcgcmVnaXN0ZXIKICAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAtIEFjdHVhbCByZWdpc3RlciBjb250ZW50cyB2YWx1ZQotICogICAgICAgICAgICAgIGFjcGlfdGVzdF9zcGVjX3NlY3Rpb24gIC0gVERTIHNlY3Rpb24gY29udGFpbmluZyBhc3NlcnRpb24KLSAqICAgICAgICAgICAgICBhY3BpX2Fzc2VydGlvbiAgICAgICAgICAtIEFzc2VydGlvbiBudW1iZXIgYmVpbmcgdGVzdGVkCisgKiAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgLSBCeXRlIG9mZnNldCBpbiB0aGUgRkFEVAogICoKICAqIFJFVFVSTjogICAgICBBRV9CQURfVkFMVUUKICAqCi0gKiBERVNDUklQVElPTjogRGlzcGxheSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGxpbmsgZmFpbHVyZSB0byBURFMgYXNzZXJ0aW9uCisgKiBERVNDUklQVElPTjogRGlzcGxheSBmYWlsdXJlIG1lc3NhZ2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xNjYsMTIgKzE3NiwxMyBAQAogICoKICAqIFJFVFVSTjogICAgICBub25lCiAgKgotICogREVTQ1JJUFRJT046IGZyZWUgZ2xvYmFsIG1lbW9yeQorICogREVTQ1JJUFRJT046IEZyZWUgZ2xvYmFsIG1lbW9yeQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfdGVybWluYXRlICh2b2lkKQorc3RhdGljIHZvaWQKK2FjcGlfdXRfdGVybWluYXRlICgKKwl2b2lkKQogewogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKIAlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpuZXh0X2dwZV9ibG9jazsKQEAgLTE4Myw4ICsxOTQsNiBAQAogCiAKIAkvKiBGcmVlIGdsb2JhbCB0YWJsZXMsIGV0Yy4gKi8KLQotCiAJLyogRnJlZSBnbG9iYWwgR1BFIGJsb2NrcyBhbmQgcmVsYXRlZCBpbmZvIHN0cnVjdHVyZXMgKi8KIAogCWdwZV94cnVwdF9pbmZvID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKQEAgLTIyMSw3ICsyMzAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9zdWJzeXN0ZW1fc2h1dGRvd24gKHZvaWQpCithY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAoCisJdm9pZCkKIHsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9zdWJzeXN0ZW1fc2h1dGRvd24iKTsKQEAgLTIyOSwxNCArMjM5LDE2IEBACiAJLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCiAKIAlpZiAoYWNwaV9nYmxfc2h1dGRvd24pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJBQ1BJIFN1YnN5c3RlbSBpcyBhbHJlYWR5IHRlcm1pbmF0ZWRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFN1YnN5c3RlbSBhcHBlYXJzIGFjdGl2ZSwgZ28gYWhlYWQgYW5kIHNodXQgaXQgZG93biAqLwogCiAJYWNwaV9nYmxfc2h1dGRvd24gPSBUUlVFOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJTaHV0dGluZyBkb3duIEFDUEkgU3Vic3lzdGVtLi4uXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKKwkJIlNodXR0aW5nIGRvd24gQUNQSSBTdWJzeXN0ZW0uLi5cbiIpKTsKIAogCS8qIENsb3NlIHRoZSBhY3BpX2V2ZW50IEhhbmRsaW5nICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCmluZGV4IDI1MjVjMWEuLjBkNTI3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwpAQCAtMjU5LDYgKzI1OSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc2hvcnRfZGl2aWRlLCBhY3BpX3V0X2RpdmlkZQogICoKKyAqIFBBUkFNRVRFUlM6ICBTZWUgZnVuY3Rpb24gaGVhZGVycyBhYm92ZQorICoKICAqIERFU0NSSVBUSU9OOiBOYXRpdmUgdmVyc2lvbnMgb2YgdGhlIHV0X2RpdmlkZSBmdW5jdGlvbnMuIFVzZSB0aGVzZSBpZiBlaXRoZXIKICAqICAgICAgICAgICAgICAxKSBUaGUgdGFyZ2V0IGlzIGEgNjQtYml0IHBsYXRmb3JtIGFuZCB0aGVyZWZvcmUgNjQtYml0CiAgKiAgICAgICAgICAgICAgICAgaW50ZWdlciBtYXRoIGlzIHN1cHBvcnRlZCBkaXJlY3RseSBieSB0aGUgbWFjaGluZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCmluZGV4IGY2NTk4NTQuLmY2ZGU0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYwpAQCAtNDksMTIgKzQ5LDU3IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0bWlzYyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NyZWF0ZV9tdXRleCAoCisJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9kZWxldGVfbXV0ZXggKAorCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydXByIChzdHJ1cHIpCisgKgorICogUEFSQU1FVEVSUzogIHNyY19zdHJpbmcgICAgICAtIFRoZSBzb3VyY2Ugc3RyaW5nIHRvIGNvbnZlcnQKKyAqCisgKiBSRVRVUk46ICAgICAgQ29udmVydGVkIHNyY19zdHJpbmcgKHNhbWUgYXMgaW5wdXQgcG9pbnRlcikKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBzdHJpbmcgdG8gdXBwZXJjYXNlCisgKgorICogTk9URTogVGhpcyBpcyBub3QgYSBQT1NJWCBmdW5jdGlvbiwgc28gaXQgYXBwZWFycyBoZXJlLCBub3QgaW4gdXRjbGliLmMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICoKK2FjcGlfdXRfc3RydXByICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKQoreworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzsKKworCisJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKworCisJLyogV2FsayBlbnRpcmUgc3RyaW5nLCB1cHBlcmNhc2luZyB0aGUgbGV0dGVycyAqLworCisJZm9yIChzdHJpbmcgPSBzcmNfc3RyaW5nOyAqc3RyaW5nOyBzdHJpbmcrKykgeworCQkqc3RyaW5nID0gKGNoYXIpIEFDUElfVE9VUFBFUiAoKnN0cmluZyk7CisJfQorCisJcmV0dXJuIChzcmNfc3RyaW5nKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ByaW50X3N0cmluZwogICoKICAqIFBBUkFNRVRFUlM6ICBTdHJpbmcgICAgICAgICAgLSBOdWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nCisgKiAgICAgICAgICAgICAgbWF4X2xlbmd0aCAgICAgIC0gTWF4aW11bSBvdXRwdXQgbGVuZ3RoCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0xNDgsNiArMTkzLDggQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgY29udmVydGVkCiAgKgorICogUkVUVVJOOiAgICAgIHUzMiBpbnRlZ2VyIHdpdGggYnl0ZXMgc3dhcHBlZAorICoKICAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgMzItYml0IHZhbHVlIHRvIGJpZy1lbmRpYW4gKHN3YXAgdGhlIGJ5dGVzKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjAsNyArMjA3LDYgQEAKIAkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNbNF07CiAJfSBvdXQ7Ci0KIAl1bmlvbiB7CiAJCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKIAkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzRdOwpAQCAtMjE5LDcgKzI2NSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCiAgKgotICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAgICAgLSBIYW5kbGUgd2hvc2UgcGF0aG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgb2YgdGhlIG5vZGUKKyAqICAgICAgICAgICAgICBvYmpfaGFuZGxlICAgICAgICAgIC0gSGFuZGxlIHdob3NlIHBhdGhuYW1lIHdpbGwgYmUgZGlzcGxheWVkCiAgKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIEFkZGl0aW9uYWwgcGF0aCBzdHJpbmcgdG8gYmUgYXBwZW5kZWQuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgaWYgbm8gZXh0cmEgcGF0aCkKICAqCkBAIC0yNzAsNyArMzE3LDggQEAKIAogCS8qIFByaW50IHRoZSBvYmplY3QgdHlwZSBhbmQgcGF0aG5hbWUgKi8KIAotCWFjcGlfb3NfcHJpbnRmICgiJS0xMnMgJXMiLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpLCAoY2hhciAqKSBidWZmZXIucG9pbnRlcik7CisJYWNwaV9vc19wcmludGYgKCIlLTEycyAlcyIsCisJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSksIChjaGFyICopIGJ1ZmZlci5wb2ludGVyKTsKIAogCS8qIEV4dHJhIHBhdGggaXMgdXNlZCB0byBhcHBlbmQgbmFtZXMgbGlrZSBfU1RBLCBfSU5JLCBldGMuICovCiAKQEAgLTI4OCw5ICszMzYsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBDaGFyYWN0ZXIgICAgICAgICAgIC0gVGhlIGNoYXJhY3RlciB0byBiZSBleGFtaW5lZAorICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIFRoZSBuYW1lIHRvIGJlIGV4YW1pbmVkCiAgKgotICogUkVUVVJOOiAgICAgIDEgaWYgQ2hhcmFjdGVyIG1heSBhcHBlYXIgaW4gYSBuYW1lLCBlbHNlIDAKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBuYW1lIGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UKICAqCiAgKiBERVNDUklQVElPTjogQ2hlY2sgZm9yIGEgdmFsaWQgQUNQSSBuYW1lLiAgRWFjaCBjaGFyYWN0ZXIgbXVzdCBiZSBvbmUgb2Y6CiAgKiAgICAgICAgICAgICAgMSkgVXBwZXIgY2FzZSBhbHBoYQpAQCAtNDk1LDQwICs1NDMsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnVwcgotICoKLSAqIFBBUkFNRVRFUlM6ICBzcmNfc3RyaW5nICAgICAgLSBUaGUgc291cmNlIHN0cmluZyB0byBjb252ZXJ0IHRvCi0gKgotICogUkVUVVJOOiAgICAgIHNyY19zdHJpbmcKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBzdHJpbmcgdG8gdXBwZXJjYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotY2hhciAqCi1hY3BpX3V0X3N0cnVwciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZykKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmc7Ci0KLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCS8qIFdhbGsgZW50aXJlIHN0cmluZywgdXBwZXJjYXNpbmcgdGhlIGxldHRlcnMgKi8KLQotCWZvciAoc3RyaW5nID0gc3JjX3N0cmluZzsgKnN0cmluZzsgKSB7Ci0JCSpzdHJpbmcgPSAoY2hhcikgQUNQSV9UT1VQUEVSICgqc3RyaW5nKTsKLQkJc3RyaW5nKys7Ci0JfQotCi0JcmV0dXJuIChzcmNfc3RyaW5nKTsKLX0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZQogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lLgpAQCAtNjExLDcgKzYyNSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jcmVhdGVfbXV0ZXggKAogCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCiB7CkBAIC02NDgsNyArNjYyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2RlbGV0ZV9tdXRleCAoCiAJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKIHsKQEAgLTcxNSwxNiArNzI5LDE2IEBACiAJCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5vd25lcl9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewogCQkJCWlmIChpID09IG11dGV4X2lkKSB7CiAJCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSJNdXRleCBbJXNdIGFscmVhZHkgYWNxdWlyZWQgYnkgdGhpcyB0aHJlYWQgWyVYXVxuIiwKLQkJCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksIHRoaXNfdGhyZWFkX2lkKSk7CisJCQkJCQkiTXV0ZXggWyVzXSBhbHJlYWR5IGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIFslWF1cbiIsCisJCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksIHRoaXNfdGhyZWFkX2lkKSk7CiAKIAkJCQkJcmV0dXJuIChBRV9BTFJFQURZX0FDUVVJUkVEKTsKIAkJCQl9CiAKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJJbnZhbGlkIGFjcXVpcmUgb3JkZXI6IFRocmVhZCAlWCBvd25zIFslc10sIHdhbnRzIFslc11cbiIsCi0JCQkJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoaSksCi0JCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJCQkJIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKKwkJCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLAorCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAogCQkJCXJldHVybiAoQUVfQUNRVUlSRV9ERUFETE9DSyk7CiAJCQl9CkBAIC03MzMsMjIgKzc0NywyMyBAQAogI2VuZGlmCiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwKLQkJCSAiVGhyZWFkICVYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAotCQkJIHRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJIlRocmVhZCAlWCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgTXV0ZXggWyVzXVxuIiwKKwkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCiAJc3RhdHVzID0gYWNwaV9vc193YWl0X3NlbWFwaG9yZSAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgsCiAJCQkgICAxLCBBQ1BJX1dBSVRfRk9SRVZFUik7CiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIlRocmVhZCAlWCBhY3F1aXJlZCBNdXRleCBbJXNdXG4iLAotCQkJCSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAKIAkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7CiAJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm93bmVyX2lkID0gdGhpc190aHJlYWRfaWQ7CiAJfQogCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlRocmVhZCAlWCBjb3VsZCBub3QgYWNxdWlyZSBNdXRleCBbJXNdICVzXG4iLAotCQkJCSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAotCQkJCSBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslc10gJXNcbiIsCisJCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKKwkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CkBAIC03OTMsOCArODA4LDggQEAKIAkgKi8KIAlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ub3duZXJfaWQgPT0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIk11dGV4IFslc10gaXMgbm90IGFjcXVpcmVkLCBjYW5ub3QgcmVsZWFzZVxuIiwKLQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJCSJNdXRleCBbJXNdIGlzIG5vdCBhY3F1aXJlZCwgY2Fubm90IHJlbGVhc2VcbiIsCisJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAogCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CiAJfQpAQCAtODEyLDggKzgyNyw4IEBACiAJCQl9CiAKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW52YWxpZCByZWxlYXNlIG9yZGVyOiBvd25zIFslc10sIHJlbGVhc2luZyBbJXNdXG4iLAotCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCQkJIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKKwkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAKIAkJCXJldHVybiAoQUVfUkVMRUFTRV9ERUFETE9DSyk7CiAJCX0KQEAgLTgyNiwxMyArODQxLDE0IEBACiAJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVGhyZWFkICVYIGNvdWxkIG5vdCByZWxlYXNlIE11dGV4IFslc10gJXNcbiIsCi0JCQkJIHRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksCi0JCQkJIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJUaHJlYWQgJVggY291bGQgbm90IHJlbGVhc2UgTXV0ZXggWyVzXSAlc1xuIiwKKwkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAJZWxzZSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiVGhyZWFkICVYIHJlbGVhc2VkIE11dGV4IFslc11cbiIsCi0JCQkJIHRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CkBAIC04NDMsMTEgKzg1OSwxMSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyBzdGF0ZQogICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEluY3JlbWVudC9EZWNyZW1lbnQKICAqICAgICAgICAgICAgICBzdGF0ZV9saXN0ICAgICAgLSBMaXN0IHRoZSBzdGF0ZSB3aWxsIGJlIGFkZGVkIHRvCiAgKgotICogUkVUVVJOOiAgICAgIE5vbmUKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0CiAgKgpAQCAtODg1LDE1ICs5MDEsMTYgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKICAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50CiAgKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bwogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZV9hbmRfcHVzaCAoCkBAIC05MjUsNyArOTQyLDcgQEAKICAqIFBBUkFNRVRFUlM6ICBsaXN0X2hlYWQgICAgICAgICAgIC0gSGVhZCBvZiB0aGUgc3RhdGUgc3RhY2sKICAqICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgIC0gU3RhdGUgb2JqZWN0IHRvIHB1c2gKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQdXNoIGEgc3RhdGUgb2JqZWN0IG9udG8gYSBzdGF0ZSBzdGFjawogICoKQEAgLTk1NCw3ICs5NzEsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBsaXN0X2hlYWQgICAgICAgICAgIC0gSGVhZCBvZiB0aGUgc3RhdGUgc3RhY2sKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgVGhlIHBvcHBlZCBzdGF0ZSBvYmplY3QKICAqCiAgKiBERVNDUklQVElPTjogUG9wIGEgc3RhdGUgb2JqZWN0IGZyb20gYSBzdGF0ZSBzdGFjawogICoKQEAgLTk4OSw3ICsxMDA2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBUaGUgbmV3IHN0YXRlIG9iamVjdC4gTlVMTCBvbiBmYWlsdXJlLgogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBnZW5lcmljIHN0YXRlIG9iamVjdC4gIEF0dGVtcHQgdG8gb2J0YWluIG9uZSBmcm9tCiAgKiAgICAgICAgICAgICAgdGhlIGdsb2JhbCBzdGF0ZSBjYWNoZTsgIElmIG5vbmUgYXZhaWxhYmxlLCBjcmVhdGUgYSBuZXcgb25lLgpAQCAtOTk3LDcgKzEwMTQsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKHZvaWQpCithY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICgKKwl2b2lkKQogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOwogCkBAIC0xMDIzLDcgKzEwNDEsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIFRocmVhZCBTdGF0ZQorICogUkVUVVJOOiAgICAgIE5ldyBUaHJlYWQgU3RhdGUuIE5VTEwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSAiVGhyZWFkIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKICAqICAgICAgICAgICAgICB0byB0cmFjayBwZXItdGhyZWFkIGluZm8gZHVyaW5nIG1ldGhvZCBleGVjdXRpb24KQEAgLTEwNjAsMTEgKzEwNzgsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlCiAgKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAtIFVwZGF0ZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gSW5pdGlhbCBPYmplY3QgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSBzdGF0ZQorICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIFVwZGF0ZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5ldyBzdGF0ZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYW4gIlVwZGF0ZSBTdGF0ZSIgLSBhIGZsYXZvciBvZiB0aGUgZ2VuZXJpYyBzdGF0ZSB1c2VkCiAgKiAgICAgICAgICAgICAgdG8gdXBkYXRlIHJlZmVyZW5jZSBjb3VudHMgYW5kIGRlbGV0ZSBjb21wbGV4IG9iamVjdHMgc3VjaApAQCAtMTEwNCwxMSArMTEyMSwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJQYWNrYWdlIFN0YXRlIgogICoKQEAgLTExNTEsNyArMTE2Nyw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJDb250cm9sIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKICAqICAgICAgICAgICAgICB0byBzdXBwb3J0IG5lc3RlZCBJRi9XSElMRSBjb25zdHJ1Y3RzIGluIHRoZSBBTUwuCkBAIC0xMTkwLDcgKzEyMDYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBTdGF0ZSAgICAgICAgICAgICAgIC0gVGhlIHN0YXRlIG9iamVjdCB0byBiZSBkZWxldGVkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUHV0IGEgc3RhdGUgb2JqZWN0IGJhY2sgaW50byB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlLiAgVGhlIG9iamVjdAogICogICAgICAgICAgICAgIGlzIG5vdCBhY3R1YWxseSBmcmVlZCBhdCB0aGlzIHRpbWUuCkBAIC0xMjE2LDcgKzEyMzIsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUHVyZ2UgdGhlIGdsb2JhbCBzdGF0ZSBvYmplY3QgY2FjaGUuICBVc2VkIGR1cmluZyBzdWJzeXN0ZW0KICAqICAgICAgICAgICAgICB0ZXJtaW5hdGlvbi4KQEAgLTEyNDAsNyArMTI1NiwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlCiAgKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBQYWNrYWdlIG9iamVjdCBvbiB3aGljaCB0byByZXNvbHZlIHJlZnMKKyAqIFBBUkFNRVRFUlM6ICBzb3VyY2Vfb2JqZWN0ICAgICAgIC0gVGhlIHBhY2thZ2UgdG8gd2FsaworICogICAgICAgICAgICAgIHRhcmdldF9vYmplY3QgICAgICAgLSBUYXJnZXQgb2JqZWN0IChpZiBwYWNrYWdlIGlzIGJlaW5nIGNvcGllZCkKKyAqICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrICAgICAgIC0gQ2FsbGVkIG9uY2UgZm9yIGVhY2ggcGFja2FnZSBlbGVtZW50CisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTM1OSw3ICsxMzc4LDcgQEAKICAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgLSBCdWZmZXIgdG8gYmUgc2Nhbm5lZAogICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAtIG51bWJlciBvZiBieXRlcyB0byBleGFtaW5lCiAgKgotICogUkVUVVJOOiAgICAgIGNoZWNrc3VtCisgKiBSRVRVUk46ICAgICAgVGhlIGdlbmVyYXRlZCBjaGVja3N1bQogICoKICAqIERFU0NSSVBUSU9OOiBHZW5lcmF0ZSBhIGNoZWNrc3VtIG9uIGEgcmF3IGJ1ZmZlcgogICoKQEAgLTE0NDIsNyArMTQ2MSw2IEBACiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0xNDU3LDcgKzE0NzUsNiBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKQogewogCi0KIAlhY3BpX29zX3ByaW50ZiAoIiU4cy0lMDRkOiAqKiogRXJyb3I6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CiB9CiAKQEAgLTE0NjksNyArMTQ4Niw2IEBACiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0xNDk1LDcgKzE1MTEsNiBAQAogICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICAgICAgIC0gRXJyb3IgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCmluZGV4IDllZTQwYTQuLmNkMzg5OWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCkBAIC01MCw2ICs1MCwyNSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dG9iamVjdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGggKAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYwLDcgKzc5LDcgQEAKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCiAgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIEFDUEkgVHlwZSBvZiB0aGUgbmV3IG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBPYmplY3QgICAgICAgICAgICAgIC0gVGhlIG5ldyBvYmplY3QuICBOdWxsIG9uIGZhaWx1cmUKKyAqIFJFVFVSTjogICAgICBBIG5ldyBpbnRlcm5hbCBvYmplY3QsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgaW50ZXJuYWwgb2JqZWN0LgogICoKQEAgLTgzLDcgKzEwMiw4IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX29iamVjdDsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJ1dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgidXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmciLAorCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKTsKIAogCiAJLyogQWxsb2NhdGUgdGhlIHJhdyBvYmplY3QgZGVzY3JpcHRvciAqLwpAQCAtOTksNyArMTE5LDggQEAKIAogCQkvKiBUaGVzZSB0eXBlcyByZXF1aXJlIGEgc2Vjb25kYXJ5IG9iamVjdCAqLwogCi0JCXNlY29uZF9vYmplY3QgPSBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQpOworCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLAorCQkJCSAgIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQpOwogCQlpZiAoIXNlY29uZF9vYmplY3QpIHsKIAkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjIChvYmplY3QpOwogCQkJcmV0dXJuX1BUUiAoTlVMTCk7CkBAIC0xMzgsNyArMTU5LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgYnVmZmVyX3NpemUgICAgICAgICAgICAtIFNpemUgb2YgYnVmZmVyIHRvIGJlIGNyZWF0ZWQKICAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBhIG5ldyBCdWZmZXIgb2JqZWN0CisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBhIG5ldyBCdWZmZXIgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgZnVsbHkgaW5pdGlhbGl6ZWQgYnVmZmVyIG9iamVjdAogICoKQEAgLTE5Miw5ICsyMTMsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIHN0cmluZ19zaXplICAgICAgICAgICAgLSBTaXplIG9mIHN0cmluZyB0byBiZSBjcmVhdGVkLiAgRG9lcyBub3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBOVUxMIHRlcm1pbmF0b3IsIHRoaXMgaXMgYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseS4KKyAqIFBBUkFNRVRFUlM6ICBzdHJpbmdfc2l6ZSAgICAgICAgIC0gU2l6ZSBvZiBzdHJpbmcgdG8gYmUgY3JlYXRlZC4gRG9lcyBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBOVUxMIHRlcm1pbmF0b3IsIHRoaXMgaXMgYWRkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseS4KICAqCiAgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBhIG5ldyBTdHJpbmcgb2JqZWN0CiAgKgpAQCAtMjQ5LDcgKzI3MCw5IEBACiAgKgogICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gYmUgdmFsaWRhdGVkCiAgKgotICogUkVUVVJOOiAgICAgIFZhbGlkYXRlIGEgcG9pbnRlciB0byBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhIHBvaW50ZXIgdG8gYmUgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5OSw4ICs0MjIsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgZXhhbWluaW5nCi0gKiAgICAgICAgICAgICAgKm9ial9sZW5ndGggICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgLSBBbiBBQ1BJIG9wZXJhbmQgb2JqZWN0CisgKiAgICAgICAgICAgICAgb2JqX2xlbmd0aCAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MTIsNyArNDM1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKQpAQCAtNDI0LDggKzQ0NywxMCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7CiAKIAotCS8qIEhhbmRsZSBhIG51bGwgb2JqZWN0IChDb3VsZCBiZSBhIHVuaW5pdGlhbGl6ZWQgcGFja2FnZSBlbGVtZW50IC0tIHdoaWNoIGlzIGxlZ2FsKSAqLwotCisJLyoKKwkgKiBIYW5kbGUgYSBudWxsIG9iamVjdCAoQ291bGQgYmUgYSB1bmluaXRpYWxpemVkIHBhY2thZ2UKKwkgKiBlbGVtZW50IC0tIHdoaWNoIGlzIGxlZ2FsKQorCSAqLwogCWlmICghaW50ZXJuYWxfb2JqZWN0KSB7CiAJCSpvYmpfbGVuZ3RoID0gMDsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CkBAIC00ODAsNyArNTA1LDggQEAKIAkJCSAqIEdldCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZnVsbCBwYXRobmFtZSB0byB0aGlzIG9iamVjdC4KIAkJCSAqIFRoZSByZWZlcmVuY2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHBhdGhuYW1lIHRvIHRoZSBvYmplY3QKIAkJCSAqLwotCQkJbGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSkpOworCQkJbGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAorCQkJCQkgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlKSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNTMwLDcgKzU1Niw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGggKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKQEAgLTU4Miw4ICs2MDgsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIGV4YW1pbmluZwotICogICAgICAgICAgICAgICpvYmpfbGVuZ3RoICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIEFuIEFDUEkgaW50ZXJuYWwgb2JqZWN0CisgKiAgICAgICAgICAgICAgb2JqX2xlbmd0aCAgICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNTk1LDcgKzYyMSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpCkBAIC02MzYsOCArNjYyLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfb2JqZWN0X3NpemUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgZXhhbWluaW5nCi0gKiAgICAgICAgICAgICAgKm9ial9sZW5ndGggICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggd2lsbCBiZSByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBBbiBBQ1BJIGludGVybmFsIG9iamVjdAorICogICAgICAgICAgICAgIG9ial9sZW5ndGggICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjQ3LDcgKzY3Myw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfb2JqZWN0X3NpemUoCithY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCmluZGV4IDk3YTkxZjMuLmU4ODAzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCkBAIC03Myw2ICs3Myw3IEBACiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKKwogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtIik7CiAKIApAQCAtMTA1LDcgKzEwNiw2IEBACiAJICogSW5pdGlhbGl6ZSB0aGUgbmFtZXNwYWNlIG1hbmFnZXIgYW5kCiAJICogdGhlIHJvb3Qgb2YgdGhlIG5hbWVzcGFjZSB0cmVlCiAJICovCi0KIAlzdGF0dXMgPSBhY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoIk5hbWVzcGFjZSBpbml0aWFsaXphdGlvbiBmYWlsdXJlLCAlc1xuIiwKQEAgLTExMyw3ICsxMTMsNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0KIAkvKiBJZiBjb25maWd1cmVkLCBpbml0aWFsaXplIHRoZSBBTUwgZGVidWdnZXIgKi8KIAogCUFDUElfREVCVUdHRVJfRVhFQyAoc3RhdHVzID0gYWNwaV9kYl9pbml0aWFsaXplICgpKTsKQEAgLTE1MCw3ICsxNDksOCBAQAogCSAqIFRoZSB2YWx1ZXMgZnJvbSB0aGUgRkFEVCBhcmUgdmFsaWRhdGVkIGhlcmUuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0hBUkRXQVJFX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgaGFyZHdhcmVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgaGFyZHdhcmVcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2h3X2luaXRpYWxpemUgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTE3OCw3ICsxNzgsOCBAQAogCSAqIGluc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIGludGVyZmFjZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEluc3RhbGxpbmcgZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEluc3RhbGxpbmcgZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTg5LDEyICsxOTAsMTQgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgQUNQSSBFdmVudCBoYW5kbGluZyAoRml4ZWQgYW5kIEdlbmVyYWwgUHVycG9zZSkKIAkgKgotCSAqIE5PVEU6IFdlIG11c3QgaGF2ZSB0aGUgaGFyZHdhcmUgQU5EIGV2ZW50cyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuIGV4ZWN1dGUKLQkgKiBBTlkgY29udHJvbCBtZXRob2RzIFNBRkVMWS4gIEFueSBjb250cm9sIG1ldGhvZCBjYW4gcmVxdWlyZSBBQ1BJIGhhcmR3YXJlCi0JICogc3VwcG9ydCwgc28gdGhlIGhhcmR3YXJlIE1VU1QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGV4ZWN1dGlvbiEKKwkgKiBOT1RFOiBXZSBtdXN0IGhhdmUgdGhlIGhhcmR3YXJlIEFORCBldmVudHMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIGNhbgorCSAqIGV4ZWN1dGUgQU5ZIGNvbnRyb2wgbWV0aG9kcyBTQUZFTFkuICBBbnkgY29udHJvbCBtZXRob2QgY2FuIHJlcXVpcmUKKwkgKiBBQ1BJIGhhcmR3YXJlIHN1cHBvcnQsIHNvIHRoZSBoYXJkd2FyZSBNVVNUIGJlIGluaXRpYWxpemVkIGJlZm9yZQorCSAqIGV4ZWN1dGlvbiEKIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgZXZlbnRzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjA1LDcgKzIwOCw4IEBACiAJLyogSW5zdGFsbCB0aGUgU0NJIGhhbmRsZXIgYW5kIEdsb2JhbCBMb2NrIGhhbmRsZXIgKi8KIAogCWlmICghKGZsYWdzICYgQUNQSV9OT19IQU5ETEVSX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gSW5zdGFsbGluZyBTQ0kvR0wgaGFuZGxlcnNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gSW5zdGFsbGluZyBTQ0kvR0wgaGFuZGxlcnNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTI0Nyw3ICsyNTEsOCBAQAogCSAqIGNvbnRhaW4gZXhlY3V0YWJsZSBBTUwgKHNlZSBjYWxsIHRvIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzIGJlbG93KS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEV4ZWN1dGluZyBfUkVHIG9wX3JlZ2lvbiBtZXRob2RzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEV4ZWN1dGluZyBfUkVHIG9wX3JlZ2lvbiBtZXRob2RzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTI2MSw3ICsyNjYsOCBAQAogCSAqIG9iamVjdHM6IG9wZXJhdGlvbl9yZWdpb25zLCBidWZmZXJfZmllbGRzLCBCdWZmZXJzLCBhbmQgUGFja2FnZXMuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX09CSkVDVF9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTI3NCw3ICsyODAsOCBAQAogCSAqIFRoaXMgcnVucyB0aGUgX1NUQSBhbmQgX0lOSSBtZXRob2RzLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19ERVZJQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBEZXZpY2VzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMzA3LDcgKzMxNCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90ZXJtaW5hdGUgKHZvaWQpCithY3BpX3Rlcm1pbmF0ZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOwogCkBAIC0zNDQsOCArMzUyLDcgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3N1YnN5c3RlbV9zdGF0dXMKICAqCkBAIC0zNTQsMTQgKzM2MSwxNiBAQAogICogUkVUVVJOOiAgICAgIFN0YXR1cyBvZiB0aGUgQUNQSSBzdWJzeXN0ZW0KICAqCiAgKiBERVNDUklQVElPTjogT3RoZXIgZHJpdmVycyB0aGF0IHVzZSB0aGUgQUNQSSBzdWJzeXN0ZW0gc2hvdWxkIGNhbGwgdGhpcwotICogICAgICAgICAgICAgIGJlZm9yZSBtYWtpbmcgYW55IG90aGVyIGNhbGxzLCB0byBlbnN1cmUgdGhlIHN1YnN5c3RlbSBpbml0aWFsLQotICogICAgICAgICAgICAgIGl6ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgICAgICAgICAgIGJlZm9yZSBtYWtpbmcgYW55IG90aGVyIGNhbGxzLCB0byBlbnN1cmUgdGhlIHN1YnN5c3RlbQorICogICAgICAgICAgICAgIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3N1YnN5c3RlbV9zdGF0dXMgKHZvaWQpCithY3BpX3N1YnN5c3RlbV9zdGF0dXMgKAorCXZvaWQpCiB7CisKIAlpZiAoYWNwaV9nYmxfc3RhcnR1cF9mbGFncyAmIEFDUElfSU5JVElBTElaRURfT0spIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQpAQCAtMzcxLDEzICszODAsMTIgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9zeXN0ZW1faW5mbwogICoKLSAqIFBBUkFNRVRFUlM6ICBvdXRfYnVmZmVyICAgICAgLSBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoICAgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyCisgKiBQQVJBTUVURVJTOiAgb3V0X2J1ZmZlciAgICAgIC0gQSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVzb3VyY2VzIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzICAgICAgICAgIC0gdGhlIHN0YXR1cyBvZiB0aGUgY2FsbAogICoKQEAgLTM5NSw4ICs0MDMsOCBAQAogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKm91dF9idWZmZXIpCiB7CiAJc3RydWN0IGFjcGlfc3lzdGVtX2luZm8gICAgICAgICAqaW5mb19wdHI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3N5c3RlbV9pbmZvIik7CkBAIC00NjYsNiArNDc0LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcgogICoKICAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgICAgIC0gQ2FsbGJhY2sgcHJvY2VkdXJlCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIE5vdCAoY3VycmVudGx5KSB1c2VkLCBzZWUgYmVsb3cKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDk1LDcgKzUwNCw2IEBACiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzCkBAIC01MDksNyArNTE3LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyAodm9pZCkKK2FjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMgKAorCXZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCA3MWZhMTAxLi4yY2YyNjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNTY0LDEyICs1NjQsMTMgQEAKIAkJaW50IGNvdW50ID0gMDsKIAkJdW5pb24gYWNwaV9vYmplY3QgKm87CiAJCQotCQliciA9IGttYWxsb2Moc2l6ZW9mICZiciwgR0ZQX0tFUk5FTCk7CisJCWJyID0ga21hbGxvYyhzaXplb2YoKmJyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAkJfSBlbHNlIHsKLQkJCW1lbXNldChiciwgMCwgc2l6ZW9mICZicik7Ci0JCQlici0+bGV2ZWxzID0ga21hbGxvYyhvYmotPnBhY2thZ2UuY291bnQgKiBzaXplb2YgJmJyLT5sZXZlbHMsIEdGUF9LRVJORUwpOworCQkJbWVtc2V0KGJyLCAwLCBzaXplb2YoKmJyKSk7CisJCQlici0+bGV2ZWxzID0ga21hbGxvYyhvYmotPnBhY2thZ2UuY291bnQgKgorCQkJCQlzaXplb2YgKihici0+bGV2ZWxzKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWJyLT5sZXZlbHMpCiAJCQkJZ290byBvdXQ7CiAKQEAgLTU4NCw4ICs1ODUsNyBAQAogCQkJfQogb3V0OgogCQkJaWYgKGNvdW50IDwgMikgewotCQkJCWlmIChici0+bGV2ZWxzKQotCQkJCQlrZnJlZShici0+bGV2ZWxzKTsKKwkJCQlrZnJlZShici0+bGV2ZWxzKTsKIAkJCQlrZnJlZShicik7CiAJCQl9IGVsc2UgewogCQkJCWJyLT5jb3VudCA9IGNvdW50OwpAQCAtNTk1LDggKzU5NSw3IEBACiAJCX0KIAl9CiAKLQlpZiAob2JqKQotCQlrZnJlZShvYmopOworCWtmcmVlKG9iaik7CiAKIAlyZXR1cm5fVk9JRDsKIH0KQEAgLTE1ODUsNyArMTU4NCw3IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19zd2l0Y2hfb3V0cHV0Iik7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJnZpZGVvLT52aWRlb19kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlLCBlbnRyeSk7CisJCWRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKIAkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfZ2V0X3N0YXRlKGRldiwgJnN0YXRlKTsKIAkJaWYgKHN0YXRlICYgMHgyKXsKIAkJCWRldl9uZXh0ID0gY29udGFpbmVyX29mKG5vZGUtPm5leHQsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCmluZGV4IGM0NmQ5NTIuLjczYzZiODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYworKysgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKQEAgLTc5NCw3ICs3OTQsOSBAQAogICAgIGRyYWluX3J4X3Bvb2wgKGRldiwgcG9vbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX3J4X3Bvb2wgKGFtYl9kZXYgKiBkZXYsIHVuc2lnbmVkIGNoYXIgcG9vbCwgaW50IHByaW9yaXR5KSB7CitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9yeF9wb29sIChhbWJfZGV2ICogZGV2LCB1bnNpZ25lZCBjaGFyIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpCit7CiAgIHJ4X2luIHJ4OwogICBhbWJfcnhxICogcnhxOwogICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYyBiL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYwppbmRleCAxMDFmMGNjLi5iMDc4ZmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKKysrIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCkBAIC0xMzc0LDcgKzEzNzQsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0ICphbGlnbmVkX2ttYWxsb2MgKGludCBzaXplLCBpbnQgZmxhZ3MsIGludCBhbGlnbm1lbnQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgKmFsaWduZWRfa21hbGxvYyAoaW50IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywKKwkJCQkJaW50IGFsaWdubWVudCkKIHsKIAl2b2lkICAqdDsKIApAQCAtMTQ2NCw3ICsxNDY1LDggQEAKICAgIGRvZXMuIEkndmUgc2VlbiAicmVjZWl2ZSBhYm9ydDogbm8gYnVmZmVycyIgYW5kIHRoaW5ncyBzdGFydGVkCiAgICB3b3JraW5nIGFnYWluIGFmdGVyIHRoYXQuLi4gIC0tIFJFVyAqLwogCi1zdGF0aWMgdm9pZCB0b3Bfb2ZmX2ZwIChzdHJ1Y3QgZnNfZGV2ICpkZXYsIHN0cnVjdCBmcmVlcG9vbCAqZnAsIGludCBnZnBfZmxhZ3MpCitzdGF0aWMgdm9pZCB0b3Bfb2ZmX2ZwIChzdHJ1Y3QgZnNfZGV2ICpkZXYsIHN0cnVjdCBmcmVlcG9vbCAqZnAsCisJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBGU19CUEVOVFJZICpxZSwgKm5lOwogCXN0cnVjdCBza19idWZmICpza2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9oZS5jIGIvZHJpdmVycy9hdG0vaGUuYwppbmRleCBkZjJjODNmLi4yODI1MGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9oZS5jCisrKyBiL2RyaXZlcnMvYXRtL2hlLmMKQEAgLTU3LDcgKzU3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCmluZGV4IGJhYWYxYTMuLjMwYjdlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKKysrIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNzgwLDcgKzc4MSw3IEBACiAJcmV0dXJuIDA7CiAKIG91dDoKLQlpZiAoamlmZmllcyAtIHNjcS0+dHJhbnNfc3RhcnQgPiBIWikgeworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHNjcS0+dHJhbnNfc3RhcnQgKyBIWikpIHsKIAkJcHJpbnRrKCIlczogRXJyb3IgcHVzaGluZyBUQkQgZm9yICVkLiVkXG4iLAogCQkgICAgICAgY2FyZC0+bmFtZSwgdmMtPnR4X3ZjYy0+dnBpLCB2Yy0+dHhfdmNjLT52Y2kpOwogI2lmZGVmIENPTkZJR19BVE1fSURUNzcyNTJfREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL3phdG0uYyBiL2RyaXZlcnMvYXRtL3phdG0uYwppbmRleCA4ZDVlNjVjLi5hMmIyMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS96YXRtLmMKKysrIGIvZHJpdmVycy9hdG0vemF0bS5jCkBAIC0xNiw5ICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4gLyogZm9yIHJlcXVlc3RfcmVnaW9uICovCiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtX3phdG0uaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC0xMjU3LDIyICsxMjU3LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHphdG1fc3RhcnQoc3RydWN0IGF0bV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgemF0bV9kZXYgKnphdG1fZGV2OworCXN0cnVjdCB6YXRtX2RldiAqemF0bV9kZXYgPSBaQVRNX0RFVihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gemF0bV9kZXYtPnBjaV9kZXY7CiAJdW5zaWduZWQgbG9uZyBjdXJyOwogCWludCBwb29scyx2Y2NzLHJ4OwotCWludCBlcnJvcixpLGxkOworCWludCBlcnJvciwgaSwgbGQ7CiAKIAlEUFJJTlRLKCJ6YXRtX3N0YXJ0XG4iKTsKLQl6YXRtX2RldiA9IFpBVE1fREVWKGRldik7CiAJemF0bV9kZXYtPnJ4X21hcCA9IHphdG1fZGV2LT50eF9tYXAgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOUl9NQlg7IGkrKykKLQkJemF0bV9kZXYtPm1ieF9zdGFydFtpXSA9IDA7Ci0JaWYgKHJlcXVlc3RfaXJxKHphdG1fZGV2LT5pcnEsJnphdG1faW50LFNBX1NISVJRLERFVl9MQUJFTCxkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZfTEFCRUwgIihpdGYgJWQpOiBJUlElZCBpcyBhbHJlYWR5IGluIHVzZVxuIiwKLQkJICAgIGRldi0+bnVtYmVyLHphdG1fZGV2LT5pcnEpOwotCQlyZXR1cm4gLUVBR0FJTjsKKyAJZm9yIChpID0gMDsgaSA8IE5SX01CWDsgaSsrKQorIAkJemF0bV9kZXYtPm1ieF9zdGFydFtpXSA9IDA7CisgCWVycm9yID0gcmVxdWVzdF9pcnEoemF0bV9kZXYtPmlycSwgemF0bV9pbnQsIFNBX1NISVJRLCBERVZfTEFCRUwsIGRldik7CisJaWYgKGVycm9yIDwgMCkgeworIAkJcHJpbnRrKEtFUk5fRVJSIERFVl9MQUJFTCAiKGl0ZiAlZCk6IElSUSVkIGlzIGFscmVhZHkgaW4gdXNlXG4iLAorIAkJICAgIGRldi0+bnVtYmVyLHphdG1fZGV2LT5pcnEpOworCQlnb3RvIGRvbmU7CiAJfQotCXJlcXVlc3RfcmVnaW9uKHphdG1fZGV2LT5iYXNlLHVQRDk4NDAxX1BPUlRTLERFVl9MQUJFTCk7CiAJLyogZGVmaW5lIG1lbW9yeSByZWdpb25zICovCiAJcG9vbHMgPSBOUl9QT09MUzsKIAlpZiAoTlJfU0hBUEVSUypTSEFQRVJfU0laRSA+IHBvb2xzKlBPT0xfU0laRSkKQEAgLTEyOTksNTEgKzEyOTksNjYgQEAKIAkgICAgIiVsZCBWQ3NcbiIsZGV2LT5udW1iZXIsTlJfU0hBUEVSUyxwb29scyxyeCwKIAkgICAgKHphdG1fZGV2LT5tZW0tY3Vycio0KS9WQ19TSVpFKTsKIAkvKiBjcmVhdGUgbWFpbGJveGVzICovCi0JZm9yIChpID0gMDsgaSA8IE5SX01CWDsgaSsrKQotCQlpZiAobWJ4X2VudHJpZXNbaV0pIHsKLQkJCXVuc2lnbmVkIGxvbmcgaGVyZTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTUJYOyBpKyspIHsKKwkJdm9pZCAqbWJ4OworCQlkbWFfYWRkcl90IG1ieF9kbWE7CiAKLQkJCWhlcmUgPSAodW5zaWduZWQgbG9uZykga21hbGxvYygyKk1CWF9TSVpFKGkpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCQkJaWYgKCFoZXJlKSB7Ci0JCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKChoZXJlXihoZXJlK01CWF9TSVpFKGkpKSkgJiB+MHhmZmZmVUwpLyogcGFyYW5vaWEgKi8KLQkJCQloZXJlID0gKGhlcmUgJiB+MHhmZmZmVUwpKzB4MTAwMDA7Ci0JCQl6YXRtX2Rldi0+bWJ4X3N0YXJ0W2ldID0gaGVyZTsKLQkJCWlmICgoaGVyZV52aXJ0X3RvX2J1cygodm9pZCAqKSBoZXJlKSkgJiAweGZmZmYpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIoaXRmICVkKTogc3lzdGVtICIKLQkJCQkgICAgImJ1cyBpbmNvbXBhdGlibGUgd2l0aCBkcml2ZXJcbiIsCi0JCQkJICAgIGRldi0+bnVtYmVyKTsKLQkJCQllcnJvciA9IC1FTk9ERVY7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlEUFJJTlRLKCJtYnhAMHglMDhseC0weCUwOGx4XG4iLGhlcmUsaGVyZStNQlhfU0laRShpKSk7Ci0JCQl6YXRtX2Rldi0+bWJ4X2VuZFtpXSA9IChoZXJlK01CWF9TSVpFKGkpKSAmIDB4ZmZmZjsKLQkJCXpvdXQodmlydF90b19idXMoKHZvaWQgKikgaGVyZSkgPj4gMTYsTVNIKGkpKTsKLQkJCXpvdXQodmlydF90b19idXMoKHZvaWQgKikgaGVyZSksTVNMKGkpKTsKLQkJCXpvdXQoKGhlcmUrTUJYX1NJWkUoaSkpICYgMHhmZmZmLE1CQShpKSk7Ci0JCQl6b3V0KGhlcmUgJiAweGZmZmYsTVRBKGkpKTsKLQkJCXpvdXQoaGVyZSAmIDB4ZmZmZixNV0EoaSkpOworCQlpZiAoIW1ieF9lbnRyaWVzW2ldKQorCQkJY29udGludWU7CisJCW1ieCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIDIqTUJYX1NJWkUoaSksICZtYnhfZG1hKTsKKwkJaWYgKCFtYngpIHsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CisJCS8qCisJCSAqIEFsaWdubWVudCBwcm92aWRlZCBieSBwY2lfYWxsb2NfY29uc2lzdGVudCgpIGlzbid0IGVub3VnaAorCQkgKiBmb3IgdGhpcyBkZXZpY2UuCisJCSAqLworCQlpZiAoKCh1bnNpZ25lZCBsb25nKW1ieCBeIG1ieF9kbWEpICYgMHhmZmZmKSB7CisJCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIoaXRmICVkKTogc3lzdGVtICIKKwkJCSAgICAgICAiYnVzIGluY29tcGF0aWJsZSB3aXRoIGRyaXZlclxuIiwgZGV2LT5udW1iZXIpOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCAyKk1CWF9TSVpFKGkpLCBtYngsIG1ieF9kbWEpOworCQkJZXJyb3IgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKwkJRFBSSU5USygibWJ4QDB4JTA4bHgtMHglMDhseFxuIiwgbWJ4LCBtYnggKyBNQlhfU0laRShpKSk7CisJCXphdG1fZGV2LT5tYnhfc3RhcnRbaV0gPSAodW5zaWduZWQgbG9uZyltYng7CisJCXphdG1fZGV2LT5tYnhfZG1hW2ldID0gbWJ4X2RtYTsKKwkJemF0bV9kZXYtPm1ieF9lbmRbaV0gPSAoemF0bV9kZXYtPm1ieF9zdGFydFtpXSArIE1CWF9TSVpFKGkpKSAmCisJCQkJCTB4ZmZmZjsKKwkJem91dChtYnhfZG1hID4+IDE2LCBNU0goaSkpOworCQl6b3V0KG1ieF9kbWEsIE1TTChpKSk7CisJCXpvdXQoemF0bV9kZXYtPm1ieF9lbmRbaV0sIE1CQShpKSk7CisJCXpvdXQoKHVuc2lnbmVkIGxvbmcpbWJ4ICYgMHhmZmZmLCBNVEEoaSkpOworCQl6b3V0KCh1bnNpZ25lZCBsb25nKW1ieCAmIDB4ZmZmZiwgTVdBKGkpKTsKKwl9CiAJZXJyb3IgPSBzdGFydF90eChkZXYpOwotCWlmIChlcnJvcikgZ290byBvdXQ7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKIAllcnJvciA9IHN0YXJ0X3J4KGRldik7Ci0JaWYgKGVycm9yKSBnb3RvIG91dDsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3R4OwogCWVycm9yID0gZGV2LT5waHktPnN0YXJ0KGRldik7Ci0JaWYgKGVycm9yKSBnb3RvIG91dDsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3J4OwogCXpvdXQoMHhmZmZmZmZmZixJTVIpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLwogCS8qIGVuYWJsZSBUWCAmIFJYICovCiAJem91dCh6aW4oR01SKSB8IHVQRDk4NDAxX0dNUl9TRSB8IHVQRDk4NDAxX0dNUl9SRSxHTVIpOwotCXJldHVybiAwOwotICAgIG91dDoKLQlmb3IgKGkgPSAwOyBpIDwgTlJfTUJYOyBpKyspCi0JCWtmcmVlKHphdG1fZGV2LT5tYnhfc3RhcnRbaV0pOwotCWtmcmVlKHphdG1fZGV2LT5yeF9tYXApOwotCWtmcmVlKHphdG1fZGV2LT50eF9tYXApOwotCWZyZWVfaXJxKHphdG1fZGV2LT5pcnEsIGRldik7Citkb25lOgogCXJldHVybiBlcnJvcjsKKworb3V0X3J4OgorCWtmcmVlKHphdG1fZGV2LT5yeF9tYXApOworb3V0X3R4OgorCWtmcmVlKHphdG1fZGV2LT50eF9tYXApOworb3V0OgorCXdoaWxlIChpLS0gPiAwKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgMipNQlhfU0laRShpKSwgCisJCQkJICAgICh2b2lkICopemF0bV9kZXYtPm1ieF9zdGFydFtpXSwKKwkJCQkgICAgemF0bV9kZXYtPm1ieF9kbWFbaV0pOworCX0KKwlmcmVlX2lycSh6YXRtX2Rldi0+aXJxLCBkZXYpOworCWdvdG8gZG9uZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmggYi9kcml2ZXJzL2F0bS96YXRtLmgKaW5kZXggMzRhMDQ4MC4uNDE2ZmUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5oCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uaApAQCAtNzMsNiArNzMsNyBAQAogCWludCBjaGFuczsJCQkvKiBtYXAgc2l6ZSwgbXVzdCBiZSAyXm4gKi8KIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1haWxib3hlcyAqLwogCXVuc2lnbmVkIGxvbmcgbWJ4X3N0YXJ0W05SX01CWF07Lyogc3RhcnQgYWRkcmVzc2VzICovCisJZG1hX2FkZHJfdCBtYnhfZG1hW05SX01CWF07CiAJdTE2IG1ieF9lbmRbTlJfTUJYXTsJCS8qIGVuZCBvZmZzZXQgKGluIGJ5dGVzKSAqLwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3RoZXIgcG9pbnRlcnMgKi8KIAl1MzIgcG9vbF9iYXNlOwkJCS8qIEZyZWUgYnVmZmVyIHBvb2wgZHNjICh3b3JkIGFkZHIpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCA2NDVmNjI2OS4uNzgzNzUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC01LDYgKzUsNyBAQAogZXh0ZXJuIHZvaWQgYnVzX3JlbW92ZV9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKik7CiAKIGV4dGVybiB2b2lkIGRyaXZlcl9kZXRhY2goc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOworZXh0ZXJuIGludCBkcml2ZXJfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHN0cnVjdCBkZXZpY2UgKik7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNsYXNzX2RldmljZSAqdG9fY2xhc3NfZGV2KHN0cnVjdCBrb2JqZWN0ICpvYmopCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggYzNmYWM3Zi4uOTZmZTJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtMTMzLDYgKzEzMyw1OCBAQAogZGVjbF9zdWJzeXMoYnVzLCAma3R5cGVfYnVzLCBOVUxMKTsKIAogCisvKiBNYW51YWxseSBkZXRhY2ggYSBkZXZpY2UgZnJvbSBpdCdzIGFzc29jaWF0ZWQgZHJpdmVyLiAqLworc3RhdGljIGludCBkcml2ZXJfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKKworCWlmIChzdHJjbXAobmFtZSwgZGV2LT5idXNfaWQpID09IDApCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkcml2ZXJfdW5iaW5kKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gZ2V0X2J1cyhkcnYtPmJ1cyk7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBlcnIgPSAtRU5PREVWOworCisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKGJ1cywgTlVMTCwgKHZvaWQgKilidWYsIGRyaXZlcl9oZWxwZXIpOworCWlmICgoZGV2KSAmJgorCSAgICAoZGV2LT5kcml2ZXIgPT0gZHJ2KSkgeworCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKKwkJZXJyID0gY291bnQ7CisJfQorCXJldHVybiBlcnI7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIodW5iaW5kLCBTX0lXVVNSLCBOVUxMLCBkcml2ZXJfdW5iaW5kKTsKKworLyoKKyAqIE1hbnVhbGx5IGF0dGFjaCBhIGRldmljZSB0byBhIGRyaXZlci4KKyAqIE5vdGU6IHRoZSBkcml2ZXIgbXVzdCB3YW50IHRvIGJpbmQgdG8gdGhlIGRldmljZSwKKyAqIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgZHJpdmVyJ3MgaWQgdGFibGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRyaXZlcl9iaW5kKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyA9IGdldF9idXMoZHJ2LT5idXMpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWRldiA9IGJ1c19maW5kX2RldmljZShidXMsIE5VTEwsICh2b2lkICopYnVmLCBkcml2ZXJfaGVscGVyKTsKKwlpZiAoKGRldikgJiYKKwkgICAgKGRldi0+ZHJpdmVyID09IE5VTEwpKSB7CisJCWRvd24oJmRldi0+c2VtKTsKKwkJZXJyID0gZHJpdmVyX3Byb2JlX2RldmljZShkcnYsIGRldik7CisJCXVwKCZkZXYtPnNlbSk7CisJCXB1dF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihiaW5kLCBTX0lXVVNSLCBOVUxMLCBkcml2ZXJfYmluZCk7CisKKwogc3RhdGljIHN0cnVjdCBkZXZpY2UgKiBuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqIGkpCiB7CiAJc3RydWN0IGtsaXN0X25vZGUgKiBuID0ga2xpc3RfbmV4dChpKTsKQEAgLTE3Nyw2ICsyMjksMzkgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qKgorICogYnVzX2ZpbmRfZGV2aWNlIC0gZGV2aWNlIGl0ZXJhdG9yIGZvciBsb2NhdGluZyBhIHBhcnRpY3VsYXIgZGV2aWNlLgorICogQGJ1czogYnVzIHR5cGUKKyAqIEBzdGFydDogRGV2aWNlIHRvIGJlZ2luIHdpdGgKKyAqIEBkYXRhOiBEYXRhIHRvIHBhc3MgdG8gbWF0Y2ggZnVuY3Rpb24KKyAqIEBtYXRjaDogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hlY2sgZGV2aWNlCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBidXNfZm9yX2VhY2hfZGV2KCkgZnVuY3Rpb24gYWJvdmUsIGJ1dCBpdAorICogcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGRldmljZSB0aGF0IGlzICdmb3VuZCcgZm9yIGxhdGVyIHVzZSwgYXMKKyAqIGRldGVybWluZWQgYnkgdGhlIEBtYXRjaCBjYWxsYmFjay4KKyAqCisgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiAwIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBtYXRjaCBhbmQgbm9uLXplcm8KKyAqIGlmIGl0IGRvZXMuICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24temVybywgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiByZXR1cm4gdG8gdGhlIGNhbGxlciBhbmQgbm90IGl0ZXJhdGUgb3ZlciBhbnkgbW9yZSBkZXZpY2VzLgorICovCitzdHJ1Y3QgZGV2aWNlICogYnVzX2ZpbmRfZGV2aWNlKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJCXN0cnVjdCBkZXZpY2UgKnN0YXJ0LCB2b2lkICpkYXRhLAorCQkJCWludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCit7CisJc3RydWN0IGtsaXN0X2l0ZXIgaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoIWJ1cykKKwkJcmV0dXJuIE5VTEw7CisKKwlrbGlzdF9pdGVyX2luaXRfbm9kZSgmYnVzLT5rbGlzdF9kZXZpY2VzLCAmaSwKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9idXMgOiBOVUxMKSk7CisJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQorCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCisJCQlicmVhazsKKwlrbGlzdF9pdGVyX2V4aXQoJmkpOworCXJldHVybiBkZXY7Cit9CiAKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyICogbmV4dF9kcml2ZXIoc3RydWN0IGtsaXN0X2l0ZXIgKiBpKQpAQCAtMzYzLDYgKzQ0OCw4IEBACiAJCW1vZHVsZV9hZGRfZHJpdmVyKGRydi0+b3duZXIsIGRydik7CiAKIAkJZHJpdmVyX2FkZF9hdHRycyhidXMsIGRydik7CisJCWRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl91bmJpbmQpOworCQlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfYmluZCk7CiAJfQogCXJldHVybiBlcnJvcjsKIH0KQEAgLTM4MCw2ICs0NjcsOCBAQAogdm9pZCBidXNfcmVtb3ZlX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKIHsKIAlpZiAoZHJ2LT5idXMpIHsKKwkJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX2JpbmQpOworCQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfdW5iaW5kKTsKIAkJZHJpdmVyX3JlbW92ZV9hdHRycyhkcnYtPmJ1cywgZHJ2KTsKIAkJa2xpc3RfcmVtb3ZlKCZkcnYtPmtub2RlX2J1cyk7CiAJCXByX2RlYnVnKCJidXMgJXM6IHJlbW92ZSBkcml2ZXIgJXNcbiIsIGRydi0+YnVzLT5uYW1lLCBkcnYtPm5hbWUpOwpAQCAtMzk0LDMxICs0ODMsMjIgQEAKIC8qIEhlbHBlciBmb3IgYnVzX3Jlc2Nhbl9kZXZpY2VzJ3MgaXRlciAqLwogc3RhdGljIGludCBidXNfcmVzY2FuX2RldmljZXNfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgKmNvdW50ID0gZGF0YTsKLQotCWlmICghZGV2LT5kcml2ZXIgJiYgKGRldmljZV9hdHRhY2goZGV2KSA+IDApKQotCQkoKmNvdW50KSsrOwotCisJaWYgKCFkZXYtPmRyaXZlcikKKwkJZGV2aWNlX2F0dGFjaChkZXYpOwogCXJldHVybiAwOwogfQogCi0KIC8qKgotICoJYnVzX3Jlc2Nhbl9kZXZpY2VzIC0gcmVzY2FuIGRldmljZXMgb24gdGhlIGJ1cyBmb3IgcG9zc2libGUgZHJpdmVycwotICoJQGJ1czoJdGhlIGJ1cyB0byBzY2FuLgorICogYnVzX3Jlc2Nhbl9kZXZpY2VzIC0gcmVzY2FuIGRldmljZXMgb24gdGhlIGJ1cyBmb3IgcG9zc2libGUgZHJpdmVycworICogQGJ1czogdGhlIGJ1cyB0byBzY2FuLgogICoKLSAqCVRoaXMgZnVuY3Rpb24gd2lsbCBsb29rIGZvciBkZXZpY2VzIG9uIHRoZSBidXMgd2l0aCBubyBkcml2ZXIKLSAqCWF0dGFjaGVkIGFuZCByZXNjYW4gaXQgYWdhaW5zdCBleGlzdGluZyBkcml2ZXJzIHRvIHNlZSBpZiBpdAotICoJbWF0Y2hlcyBhbnkuIENhbGxzIGRldmljZV9hdHRhY2goKS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRldmljZXMKLSAqCXRoYXQgd2VyZSBzdWNlc3NmdWxseSBib3VuZCB0byBhIGRyaXZlci4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBsb29rIGZvciBkZXZpY2VzIG9uIHRoZSBidXMgd2l0aCBubyBkcml2ZXIKKyAqIGF0dGFjaGVkIGFuZCByZXNjYW4gaXQgYWdhaW5zdCBleGlzdGluZyBkcml2ZXJzIHRvIHNlZSBpZiBpdCBtYXRjaGVzCisgKiBhbnkgYnkgY2FsbGluZyBkZXZpY2VfYXR0YWNoKCkgZm9yIHRoZSB1bmJvdW5kIGRldmljZXMuCiAgKi8KLWludCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKQordm9pZCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKQogewotCWludCBjb3VudCA9IDA7Ci0KLQlidXNfZm9yX2VhY2hfZGV2KGJ1cywgTlVMTCwgJmNvdW50LCBidXNfcmVzY2FuX2RldmljZXNfaGVscGVyKTsKLQotCXJldHVybiBjb3VudDsKKwlidXNfZm9yX2VhY2hfZGV2KGJ1cywgTlVMTCwgTlVMTCwgYnVzX3Jlc2Nhbl9kZXZpY2VzX2hlbHBlcik7CiB9CiAKIApAQCAtNTU3LDYgKzYzNyw3IEBACiAKIAogRVhQT1JUX1NZTUJPTF9HUEwoYnVzX2Zvcl9lYWNoX2Rldik7CitFWFBPUlRfU1lNQk9MX0dQTChidXNfZmluZF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTF9HUEwoYnVzX2Zvcl9lYWNoX2Rydik7CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGJ1c19hZGRfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDg2ZDc5NzUuLmVmZTAzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJc3RydWN0IGRldmljZSAqIHBhcmVudCA9IGRldi0+cGFyZW50OwogCiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CisJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOwogCiAJLyogTm90aWZ5IHRoZSBwbGF0Zm9ybSBvZiB0aGUgcmVtb3ZhbCwgaW4gY2FzZSB0aGV5CiAJICogbmVlZCB0byBkbyBhbnl0aGluZy4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCA2ZGIzYTc4Li4xNjMyM2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtNjUsNyArNjUsNyBAQAogICoKICAqCVRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBAZGV2LT5zZW0gaGVsZC4KICAqLwotc3RhdGljIGludCBkcml2ZXJfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2LCBzdHJ1Y3QgZGV2aWNlICogZGV2KQoraW50IGRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYsIHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAxYjY0NTg4Li4yOTFjNTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC01Niw2ICs1Niw0MSBAQAogCiAKIC8qKgorICogZHJpdmVyX2ZpbmRfZGV2aWNlIC0gZGV2aWNlIGl0ZXJhdG9yIGZvciBsb2NhdGluZyBhIHBhcnRpY3VsYXIgZGV2aWNlLgorICogQGRyaXZlcjogVGhlIGRldmljZSdzIGRyaXZlcgorICogQHN0YXJ0OiBEZXZpY2UgdG8gYmVnaW4gd2l0aAorICogQGRhdGE6IERhdGEgdG8gcGFzcyB0byBtYXRjaCBmdW5jdGlvbgorICogQG1hdGNoOiBDYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoKSBmdW5jdGlvbiBhYm92ZSwgYnV0CisgKiBpdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZGV2aWNlIHRoYXQgaXMgJ2ZvdW5kJyBmb3IgbGF0ZXIgdXNlLCBhcworICogZGV0ZXJtaW5lZCBieSB0aGUgQG1hdGNoIGNhbGxiYWNrLgorICoKKyAqIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDAgaWYgdGhlIGRldmljZSBkb2Vzbid0IG1hdGNoIGFuZCBub24temVybworICogaWYgaXQgZG9lcy4gIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi16ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHJldHVybiB0byB0aGUgY2FsbGVyIGFuZCBub3QgaXRlcmF0ZSBvdmVyIGFueSBtb3JlIGRldmljZXMuCisgKi8KK3N0cnVjdCBkZXZpY2UgKiBkcml2ZXJfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICogc3RhcnQsIHZvaWQgKiBkYXRhLAorCQkJCSAgIGludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCit7CisJc3RydWN0IGtsaXN0X2l0ZXIgaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIE5VTEw7CisKKwlrbGlzdF9pdGVyX2luaXRfbm9kZSgmZHJ2LT5rbGlzdF9kZXZpY2VzLCAmaSwKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CisJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQorCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCisJCQlicmVhazsKKwlrbGlzdF9pdGVyX2V4aXQoJmkpOworCXJldHVybiBkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkcml2ZXJfZmluZF9kZXZpY2UpOworCisvKioKICAqCWRyaXZlcl9jcmVhdGVfZmlsZSAtIGNyZWF0ZSBzeXNmcyBmaWxlIGZvciBkcml2ZXIuCiAgKglAZHJ2Oglkcml2ZXIuCiAgKglAYXR0cjoJZHJpdmVyIGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCA5N2ZlMTNmLi42NTIyODE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtNzQsNiArNzQsOCBAQAogZmlybXdhcmVfdGltZW91dF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlsb2FkaW5nX3RpbWVvdXQgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWlmIChsb2FkaW5nX3RpbWVvdXQgPCAwKQorCQlsb2FkaW5nX3RpbWVvdXQgPSAwOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTM4LDYgKzE0MCwxMCBAQAogCXN3aXRjaCAobG9hZGluZykgewogCWNhc2UgMToKIAkJZG93bigmZndfbG9jayk7CisJCWlmICghZndfcHJpdi0+ZncpIHsKKwkJCXVwKCZmd19sb2NrKTsKKwkJCWJyZWFrOworCQl9CiAJCXZmcmVlKGZ3X3ByaXYtPmZ3LT5kYXRhKTsKIAkJZndfcHJpdi0+ZnctPmRhdGEgPSBOVUxMOwogCQlmd19wcml2LT5mdy0+c2l6ZSA9IDA7CkBAIC0xNzgsNyArMTg0LDcgQEAKIAogCWRvd24oJmZ3X2xvY2spOwogCWZ3ID0gZndfcHJpdi0+Znc7Ci0JaWYgKHRlc3RfYml0KEZXX1NUQVRVU19ET05FLCAmZndfcHJpdi0+c3RhdHVzKSkgeworCWlmICghZncgfHwgdGVzdF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpKSB7CiAJCXJldF9jb3VudCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIzOCw5ICsyNDQsMTAgQEAKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJcmV0dXJuIC1FUEVSTTsKKwogCWRvd24oJmZ3X2xvY2spOwogCWZ3ID0gZndfcHJpdi0+Znc7Ci0JaWYgKHRlc3RfYml0KEZXX1NUQVRVU19ET05FLCAmZndfcHJpdi0+c3RhdHVzKSkgeworCWlmICghZncgfHwgdGVzdF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQxOCw3ICs0MjUsNyBAQAogCiAJZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CiAKLQlpZiAobG9hZGluZ190aW1lb3V0KSB7CisJaWYgKGxvYWRpbmdfdGltZW91dCA+IDApIHsKIAkJZndfcHJpdi0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGxvYWRpbmdfdGltZW91dCAqIEhaOwogCQlhZGRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9zeXMuYyBiL2RyaXZlcnMvYmFzZS9zeXMuYwppbmRleCBmMzdhMTNkLi4yMTRiOTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvc3lzLmMKKysrIGIvZHJpdmVycy9iYXNlL3N5cy5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAotCiBleHRlcm4gc3RydWN0IHN1YnN5c3RlbSBkZXZpY2VzX3N1YnN5czsKIAogI2RlZmluZSB0b19zeXNkZXYoaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBzeXNfZGV2aWNlLCBrb2JqKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hcy1pb3NjaGVkLmMgYi9kcml2ZXJzL2Jsb2NrL2FzLWlvc2NoZWQuYwppbmRleCAzNDEwYjRkLi45MWFlYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FzLWlvc2NoZWQuYwpAQCAtMTgwNiw3ICsxODA2LDggQEAKIAlycS0+ZWxldmF0b3JfcHJpdmF0ZSA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgYXNfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBnZnBfbWFzaykKK3N0YXRpYyBpbnQgYXNfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkgIHN0cnVjdCBiaW8gKmJpbywgaW50IGdmcF9tYXNrKQogewogCXN0cnVjdCBhc19kYXRhICphZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCBhc19ycSAqYXJxID0gbWVtcG9vbF9hbGxvYyhhZC0+YXJxX3Bvb2wsIGdmcF9tYXNrKTsKQEAgLTE4MjcsNyArMTgyOCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgYXNfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQorc3RhdGljIGludCBhc19tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlpbnQgcmV0ID0gRUxWX01RVUVVRV9NQVk7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggYWJkZTI3MC4uM2U5ZmI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgICBEaXNrIEFycmF5IGRyaXZlciBmb3IgSFAgU0EgNXh4eCBhbmQgNnh4eCBDb250cm9sbGVycwotICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDIgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqICAgIENvcHlyaWdodCAyMDAwLCAyMDA1IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01NCw3ICs1NCw3IEBACiBNT0RVTEVfQVVUSE9SKCJIZXdsZXR0LVBhY2thcmQgQ29tcGFueSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEhQIENvbnRyb2xsZXIgU0E1eHh4IFNBNnh4eCB2ZXJzaW9uIDIuNi42Iik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiSFAgU0E1aSBTQTVpKyBTQTUzMiBTQTUzMDAgU0E1MzEyIFNBNjQxIFNBNjQyIFNBNjQwMCIKLQkJCSIgU0E2aSBQNjAwIFA4MDAgRTQwMCIpOworCQkJIiBTQTZpIFA2MDAgUDgwMCBFNDAwIEUzMDAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2luY2x1ZGUgImNjaXNzX2NtZC5oIgpAQCAtODUsOCArODUsMTAgQEAKIAkJMHgxMDNDLCAweDMyMjUsIDAsIDAsIDB9LAogCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQiwKIAkJMHgxMDNjLCAweDMyMjMsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQiwKKwl7IFBDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0MsCiAJCTB4MTAzYywgMHgzMjMxLCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0MsCisJCTB4MTAzYywgMHgzMjMzLCAwLCAwLCAwfSwKIAl7MCx9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNjaXNzX3BjaV9kZXZpY2VfaWQpOwpAQCAtMTEwLDYgKzExMiw3IEBACiAJeyAweDMyMjUxMDNDLCAiU21hcnQgQXJyYXkgUDYwMCIsICZTQTVfYWNjZXNzfSwKIAl7IDB4MzIyMzEwM0MsICJTbWFydCBBcnJheSBQODAwIiwgJlNBNV9hY2Nlc3N9LAogCXsgMHgzMjMxMTAzQywgIlNtYXJ0IEFycmF5IEU0MDAiLCAmU0E1X2FjY2Vzc30sCisJeyAweDMyMzMxMDNDLCAiU21hcnQgQXJyYXkgRTMwMCIsICZTQTVfYWNjZXNzfSwKIH07CiAKIC8qIEhvdyBsb25nIHRvIHdhaXQgKGluIG1pbGxlc2NvbmRzKSBmb3IgYm9hcmQgdG8gZ28gaW50byBzaW1wbGUgbW9kZSAqLwpAQCAtNjM1LDYgKzYzOCw3IEBACiAJCWNjaXNzX3BjaV9pbmZvX3N0cnVjdCBwY2lpbmZvOwogCiAJCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKKwkJcGNpaW5mby5kb21haW4gPSBwY2lfZG9tYWluX25yKGhvc3QtPnBkZXYtPmJ1cyk7CiAJCXBjaWluZm8uYnVzID0gaG9zdC0+cGRldi0+YnVzLT5udW1iZXI7CiAJCXBjaWluZm8uZGV2X2ZuID0gaG9zdC0+cGRldi0+ZGV2Zm47CiAJCXBjaWluZm8uYm9hcmRfaWQgPSBob3N0LT5ib2FyZF9pZDsKQEAgLTc4MiwxOCArNzg2LDEwIEBACiAKICAJY2FzZSBDQ0lTU19HRVRMVU5JTkZPOiB7CiAgCQlMb2d2b2xJbmZvX3N0cnVjdCBsdW5pbmZvOwotIAkJaW50IGk7CiAgCQkKICAJCWx1bmluZm8uTHVuSUQgPSBkcnYtPkx1bklEOwogIAkJbHVuaW5mby5udW1fb3BlbnMgPSBkcnYtPnVzYWdlX2NvdW50OwogIAkJbHVuaW5mby5udW1fcGFydHMgPSAwOwotIAkJLyogY291bnQgcGFydGl0aW9ucyAxIHRvIDE1IHdpdGggc2l6ZXMgPiAwICovCi0gCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BBUlQgLSAxOyBpKyspIHsKLQkJCWlmICghZGlzay0+cGFydFtpXSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkaXNrLT5wYXJ0W2ldLT5ucl9zZWN0cyAhPSAwKQotCQkJCWx1bmluZm8ubnVtX3BhcnRzKys7Ci0JCX0KICAJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmx1bmluZm8sCiAgCQkJCXNpemVvZihMb2d2b2xJbmZvX3N0cnVjdCkpKQogIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jZnEtaW9zY2hlZC5jIGIvZHJpdmVycy9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDNhYzQ3ZGQuLmRlNTc0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2ZxLWlvc2NoZWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTIxLDIyICsyMSwzNCBAQAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9lbGFwc2VkX2NycTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9lbGFwc2VkX2Rpc3BhdGNoOworI2luY2x1ZGUgPGxpbnV4L2lvcHJpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAvKgogICogdHVuYWJsZXMKICAqLwogc3RhdGljIGludCBjZnFfcXVhbnR1bSA9IDQ7CQkvKiBtYXggcXVldWUgaW4gb25lIHJvdW5kIG9mIHNlcnZpY2UgKi8KIHN0YXRpYyBpbnQgY2ZxX3F1ZXVlZCA9IDg7CQkvKiBtaW5pbXVtIHJxIGFsbG9jYXRlIGxpbWl0IHBlci1xdWV1ZSovCi1zdGF0aWMgaW50IGNmcV9zZXJ2aWNlID0gSFo7CQkvKiBwZXJpb2Qgb3ZlciB3aGljaCBzZXJ2aWNlIGlzIGF2ZyAqLwotc3RhdGljIGludCBjZnFfZmlmb19leHBpcmVfciA9IEhaIC8gMjsJLyogZmlmbyB0aW1lb3V0IGZvciBzeW5jIHJlcXVlc3RzICovCi1zdGF0aWMgaW50IGNmcV9maWZvX2V4cGlyZV93ID0gNSAqIEhaOwkvKiBmaWZvIHRpbWVvdXQgZm9yIGFzeW5jIHJlcXVlc3RzICovCi1zdGF0aWMgaW50IGNmcV9maWZvX3JhdGUgPSBIWiAvIDg7CS8qIGZpZm8gZXhwaXJ5IHJhdGUgKi8KK3N0YXRpYyBpbnQgY2ZxX2ZpZm9fZXhwaXJlWzJdID0geyBIWiAvIDQsIEhaIC8gOCB9Owogc3RhdGljIGludCBjZnFfYmFja19tYXggPSAxNiAqIDEwMjQ7CS8qIG1heGltdW0gYmFja3dhcmRzIHNlZWssIGluIEtpQiAqLwogc3RhdGljIGludCBjZnFfYmFja19wZW5hbHR5ID0gMjsJLyogcGVuYWx0eSBvZiBhIGJhY2t3YXJkcyBzZWVrICovCiAKK3N0YXRpYyBpbnQgY2ZxX3NsaWNlX3N5bmMgPSBIWiAvIDEwOworc3RhdGljIGludCBjZnFfc2xpY2VfYXN5bmMgPSBIWiAvIDI1Oworc3RhdGljIGludCBjZnFfc2xpY2VfYXN5bmNfcnEgPSAyOworc3RhdGljIGludCBjZnFfc2xpY2VfaWRsZSA9IEhaIC8gMTAwOworCisjZGVmaW5lIENGUV9JRExFX0dSQUNFCQkoSFogLyAxMCkKKyNkZWZpbmUgQ0ZRX1NMSUNFX1NDQUxFCQkoNSkKKworI2RlZmluZSBDRlFfS0VZX0FTWU5DCQkoMCkKKyNkZWZpbmUgQ0ZRX0tFWV9BTlkJCSgweGZmZmYpCisKKy8qCisgKiBkaXNhYmxlIHF1ZXVlaW5nIGF0IHRoZSBkcml2ZXIvaGFyZHdhcmUgbGV2ZWwKKyAqLworc3RhdGljIGludCBjZnFfbWF4X2RlcHRoID0gMTsKKwogLyoKICAqIGZvciB0aGUgaGFzaCBvZiBjZnFxIGluc2lkZSB0aGUgY2ZxZAogICovCkBAIC01NSw2ICs2Nyw3IEBACiAjZGVmaW5lIGxpc3RfZW50cnlfaGFzaChwdHIpCWhsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgY2ZxX3JxLCBoYXNoKQogCiAjZGVmaW5lIGxpc3RfZW50cnlfY2ZxcShwdHIpCWxpc3RfZW50cnkoKHB0ciksIHN0cnVjdCBjZnFfcXVldWUsIGNmcV9saXN0KQorI2RlZmluZSBsaXN0X2VudHJ5X2ZpZm8ocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQogCiAjZGVmaW5lIFJRX0RBVEEocnEpCQkocnEpLT5lbGV2YXRvcl9wcml2YXRlCiAKQEAgLTc1LDc4ICs4OCwxMTAgQEAKICNkZWZpbmUgcmJfZW50cnlfY3JxKG5vZGUpCXJiX2VudHJ5KChub2RlKSwgc3RydWN0IGNmcV9ycSwgcmJfbm9kZSkKICNkZWZpbmUgcnFfcmJfa2V5KHJxKQkJKHJxKS0+c2VjdG9yCiAKLS8qCi0gKiB0aHJlc2hvbGQgZm9yIHN3aXRjaGluZyBvZmYgbm9uLXRhZyBhY2NvdW50aW5nCi0gKi8KLSNkZWZpbmUgQ0ZRX01BWF9UQUcJCSg0KQotCi0vKgotICogc29ydCBrZXkgdHlwZXMgYW5kIG5hbWVzCi0gKi8KLWVudW0gewotCUNGUV9LRVlfUEdJRCwKLQlDRlFfS0VZX1RHSUQsCi0JQ0ZRX0tFWV9VSUQsCi0JQ0ZRX0tFWV9HSUQsCi0JQ0ZRX0tFWV9MQVNULAotfTsKLQotc3RhdGljIGNoYXIgKmNmcV9rZXlfdHlwZXNbXSA9IHsgInBnaWQiLCAidGdpZCIsICJ1aWQiLCAiZ2lkIiwgTlVMTCB9OwotCiBzdGF0aWMga21lbV9jYWNoZV90ICpjcnFfcG9vbDsKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKmNmcV9wb29sOwogc3RhdGljIGttZW1fY2FjaGVfdCAqY2ZxX2lvY19wb29sOwogCisjZGVmaW5lIENGUV9QUklPX0xJU1RTCQlJT1BSSU9fQkVfTlIKKyNkZWZpbmUgY2ZxX2NsYXNzX2lkbGUoY2ZxcSkJKChjZnFxKS0+aW9wcmlvX2NsYXNzID09IElPUFJJT19DTEFTU19JRExFKQorI2RlZmluZSBjZnFfY2xhc3NfYmUoY2ZxcSkJKChjZnFxKS0+aW9wcmlvX2NsYXNzID09IElPUFJJT19DTEFTU19CRSkKKyNkZWZpbmUgY2ZxX2NsYXNzX3J0KGNmcXEpCSgoY2ZxcSktPmlvcHJpb19jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfUlQpCisKKyNkZWZpbmUgQVNZTkMJCQkoMCkKKyNkZWZpbmUgU1lOQwkJCSgxKQorCisjZGVmaW5lIGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkJXAorCSgoY2ZxcSktPm9uX2Rpc3BhdGNoW0FTWU5DXSArIChjZnFxKS0+b25fZGlzcGF0Y2hbU1lOQ10pCisKKyNkZWZpbmUgY2ZxX2NmcXFfY2xhc3Nfc3luYyhjZnFxKQkoKGNmcXEpLT5rZXkgIT0gQ0ZRX0tFWV9BU1lOQykKKworI2RlZmluZSBjZnFfY2ZxcV9zeW5jKGNmcXEpCQlcCisJKGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkgfHwgKGNmcXEpLT5vbl9kaXNwYXRjaFtTWU5DXSkKKworLyoKKyAqIFBlciBibG9jayBkZXZpY2UgcXVldWUgc3RydWN0dXJlCisgKi8KIHN0cnVjdCBjZnFfZGF0YSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBycl9saXN0OworCWF0b21pY190IHJlZjsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCisJLyoKKwkgKiByciBsaXN0IG9mIHF1ZXVlcyB3aXRoIHJlcXVlc3RzIGFuZCB0aGUgY291bnQgb2YgdGhlbQorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgcnJfbGlzdFtDRlFfUFJJT19MSVNUU107CisJc3RydWN0IGxpc3RfaGVhZCBidXN5X3JyOworCXN0cnVjdCBsaXN0X2hlYWQgY3VyX3JyOworCXN0cnVjdCBsaXN0X2hlYWQgaWRsZV9ycjsKKwl1bnNpZ25lZCBpbnQgYnVzeV9xdWV1ZXM7CisKKwkvKgorCSAqIG5vbi1vcmRlcmVkIGxpc3Qgb2YgZW1wdHkgY2ZxcSdzCisJICovCiAJc3RydWN0IGxpc3RfaGVhZCBlbXB0eV9saXN0OwogCisJLyoKKwkgKiBjZnFxIGxvb2t1cCBoYXNoCisJICovCiAJc3RydWN0IGhsaXN0X2hlYWQgKmNmcV9oYXNoOwotCXN0cnVjdCBobGlzdF9oZWFkICpjcnFfaGFzaDsKIAotCS8qIHF1ZXVlcyBvbiBycl9saXN0IChpZSB0aGV5IGhhdmUgcGVuZGluZyByZXF1ZXN0cyAqLwotCXVuc2lnbmVkIGludCBidXN5X3F1ZXVlczsKKwkvKgorCSAqIGdsb2JhbCBjcnEgaGFzaCBmb3IgYWxsIHF1ZXVlcworCSAqLworCXN0cnVjdCBobGlzdF9oZWFkICpjcnFfaGFzaDsKIAogCXVuc2lnbmVkIGludCBtYXhfcXVldWVkOwogCi0JYXRvbWljX3QgcmVmOwotCi0JaW50IGtleV90eXBlOwotCiAJbWVtcG9vbF90ICpjcnFfcG9vbDsKIAotCXJlcXVlc3RfcXVldWVfdCAqcXVldWU7CisJaW50IHJxX2luX2RyaXZlcjsKKworCS8qCisJICogc2NoZWR1bGUgc2xpY2Ugc3RhdGUgaW5mbworCSAqLworCS8qCisJICogaWRsZSB3aW5kb3cgbWFuYWdlbWVudAorCSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGlkbGVfc2xpY2VfdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IHVucGx1Z193b3JrOworCisJc3RydWN0IGNmcV9xdWV1ZSAqYWN0aXZlX3F1ZXVlOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqYWN0aXZlX2NpYzsKKwlpbnQgY3VyX3ByaW8sIGN1cl9lbmRfcHJpbzsKKwl1bnNpZ25lZCBpbnQgZGlzcGF0Y2hfc2xpY2U7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX2NsYXNzX3RpbWVyOwogCiAJc2VjdG9yX3QgbGFzdF9zZWN0b3I7CisJdW5zaWduZWQgbG9uZyBsYXN0X2VuZF9yZXF1ZXN0OwogCi0JaW50IHJxX2luX2RyaXZlcjsKKwl1bnNpZ25lZCBpbnQgcnFfc3RhcnZlZDsKIAogCS8qCiAJICogdHVuYWJsZXMsIHNlZSB0b3Agb2YgZmlsZQogCSAqLwogCXVuc2lnbmVkIGludCBjZnFfcXVhbnR1bTsKIAl1bnNpZ25lZCBpbnQgY2ZxX3F1ZXVlZDsKLQl1bnNpZ25lZCBpbnQgY2ZxX2ZpZm9fZXhwaXJlX3I7Ci0JdW5zaWduZWQgaW50IGNmcV9maWZvX2V4cGlyZV93OwotCXVuc2lnbmVkIGludCBjZnFfZmlmb19iYXRjaF9leHBpcmU7CisJdW5zaWduZWQgaW50IGNmcV9maWZvX2V4cGlyZVsyXTsKIAl1bnNpZ25lZCBpbnQgY2ZxX2JhY2tfcGVuYWx0eTsKIAl1bnNpZ25lZCBpbnQgY2ZxX2JhY2tfbWF4OwotCXVuc2lnbmVkIGludCBmaW5kX2Jlc3RfY3JxOwotCi0JdW5zaWduZWQgaW50IGNmcV90YWdnZWQ7CisJdW5zaWduZWQgaW50IGNmcV9zbGljZVsyXTsKKwl1bnNpZ25lZCBpbnQgY2ZxX3NsaWNlX2FzeW5jX3JxOworCXVuc2lnbmVkIGludCBjZnFfc2xpY2VfaWRsZTsKKwl1bnNpZ25lZCBpbnQgY2ZxX21heF9kZXB0aDsKIH07CiAKKy8qCisgKiBQZXIgcHJvY2Vzcy1ncm91cGluZyBzdHJ1Y3R1cmUKKyAqLwogc3RydWN0IGNmcV9xdWV1ZSB7CiAJLyogcmVmZXJlbmNlIGNvdW50ICovCiAJYXRvbWljX3QgcmVmOwogCS8qIHBhcmVudCBjZnFfZGF0YSAqLwogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKLQkvKiBoYXNoIG9mIG1lcmdlYWJsZSByZXF1ZXN0cyAqLworCS8qIGNmcXEgbG9va3VwIGhhc2ggKi8KIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBjZnFfaGFzaDsKIAkvKiBoYXNoIGtleSAqLwotCXVuc2lnbmVkIGxvbmcga2V5OwotCS8qIHdoZXRoZXIgcXVldWUgaXMgb24gcnIgKG9yIGVtcHR5KSBsaXN0ICovCi0JaW50IG9uX3JyOworCXVuc2lnbmVkIGludCBrZXk7CiAJLyogb24gZWl0aGVyIHJyIG9yIGVtcHR5IGxpc3Qgb2YgY2ZxZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgY2ZxX2xpc3Q7CiAJLyogc29ydGVkIGxpc3Qgb2YgcGVuZGluZyByZXF1ZXN0cyAqLwpAQCAtMTU4LDIxICsyMDMsMjIgQEAKIAkvKiBjdXJyZW50bHkgYWxsb2NhdGVkIHJlcXVlc3RzICovCiAJaW50IGFsbG9jYXRlZFsyXTsKIAkvKiBmaWZvIGxpc3Qgb2YgcmVxdWVzdHMgaW4gc29ydF9saXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBmaWZvWzJdOwotCS8qIGxhc3QgdGltZSBmaWZvIGV4cGlyZWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfZmlmb19leHBpcmU7CisJc3RydWN0IGxpc3RfaGVhZCBmaWZvOwogCi0JaW50IGtleV90eXBlOworCXVuc2lnbmVkIGxvbmcgc2xpY2Vfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzbGljZV9lbmQ7CisJdW5zaWduZWQgbG9uZyBzbGljZV9sZWZ0OworCXVuc2lnbmVkIGxvbmcgc2VydmljZV9sYXN0OwogCi0JdW5zaWduZWQgbG9uZyBzZXJ2aWNlX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2VydmljZV91c2VkOworCS8qIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBvbiB0aGUgZGlzcGF0Y2ggbGlzdCAqLworCWludCBvbl9kaXNwYXRjaFsyXTsKIAotCXVuc2lnbmVkIGludCBtYXhfcmF0ZTsKKwkvKiBpbyBwcmlvIG9mIHRoaXMgZ3JvdXAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpb3ByaW8sIG9yZ19pb3ByaW87CisJdW5zaWduZWQgc2hvcnQgaW9wcmlvX2NsYXNzLCBvcmdfaW9wcmlvX2NsYXNzOwogCi0JLyogbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgaGF2ZSBiZWVuIGhhbmRlZCB0byB0aGUgZHJpdmVyICovCi0JaW50IGluX2ZsaWdodDsKLQkvKiBudW1iZXIgb2YgY3VycmVudGx5IGFsbG9jYXRlZCByZXF1ZXN0cyAqLwotCWludCBhbGxvY19saW1pdFsyXTsKKwkvKiB2YXJpb3VzIHN0YXRlIGZsYWdzLCBzZWUgYmVsb3cgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwogCiBzdHJ1Y3QgY2ZxX3JxIHsKQEAgLTE4NCw0MiArMjMwLDc4IEBACiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX3F1ZXVlOwogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqaW9fY29udGV4dDsKIAotCXVuc2lnbmVkIGxvbmcgc2VydmljZV9zdGFydDsKLQl1bnNpZ25lZCBsb25nIHF1ZXVlX3N0YXJ0OwotCi0JdW5zaWduZWQgaW50IGluX2ZsaWdodCA6IDE7Ci0JdW5zaWduZWQgaW50IGFjY291bnRlZCA6IDE7Ci0JdW5zaWduZWQgaW50IGlzX3N5bmMgICA6IDE7Ci0JdW5zaWduZWQgaW50IGlzX3dyaXRlICA6IDE7CisJdW5zaWduZWQgaW50IGNycV9mbGFnczsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfZmluZF9jZnFfaGFzaChzdHJ1Y3QgY2ZxX2RhdGEgKiwgdW5zaWduZWQgbG9uZyk7CitlbnVtIGNmcXFfc3RhdGVfZmxhZ3MgeworCUNGUV9DRlFRX0ZMQUdfb25fcnIgPSAwLAorCUNGUV9DRlFRX0ZMQUdfd2FpdF9yZXF1ZXN0LAorCUNGUV9DRlFRX0ZMQUdfbXVzdF9hbGxvYywKKwlDRlFfQ0ZRUV9GTEFHX211c3RfYWxsb2Nfc2xpY2UsCisJQ0ZRX0NGUVFfRkxBR19tdXN0X2Rpc3BhdGNoLAorCUNGUV9DRlFRX0ZMQUdfZmlmb19leHBpcmUsCisJQ0ZRX0NGUVFfRkxBR19pZGxlX3dpbmRvdywKKwlDRlFfQ0ZRUV9GTEFHX3ByaW9fY2hhbmdlZCwKKwlDRlFfQ0ZRUV9GTEFHX2V4cGlyZWQsCit9OworCisjZGVmaW5lIENGUV9DRlFRX0ZOUyhuYW1lKQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfbWFya19jZnFxXyMjbmFtZShzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQkJXAorewkJCQkJCQkJCVwKKwljZnFxLT5mbGFncyB8PSAoMSA8PCBDRlFfQ0ZRUV9GTEFHXyMjbmFtZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfY2xlYXJfY2ZxcV8jI25hbWUoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkJXAorewkJCQkJCQkJCVwKKwljZnFxLT5mbGFncyAmPSB+KDEgPDwgQ0ZRX0NGUVFfRkxBR18jI25hbWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBjZnFfY2ZxcV8jI25hbWUoY29uc3Qgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIChjZnFxLT5mbGFncyAmICgxIDw8IENGUV9DRlFRX0ZMQUdfIyNuYW1lKSkgIT0gMDsJXAorfQorCitDRlFfQ0ZRUV9GTlMob25fcnIpOworQ0ZRX0NGUVFfRk5TKHdhaXRfcmVxdWVzdCk7CitDRlFfQ0ZRUV9GTlMobXVzdF9hbGxvYyk7CitDRlFfQ0ZRUV9GTlMobXVzdF9hbGxvY19zbGljZSk7CitDRlFfQ0ZRUV9GTlMobXVzdF9kaXNwYXRjaCk7CitDRlFfQ0ZRUV9GTlMoZmlmb19leHBpcmUpOworQ0ZRX0NGUVFfRk5TKGlkbGVfd2luZG93KTsKK0NGUV9DRlFRX0ZOUyhwcmlvX2NoYW5nZWQpOworQ0ZRX0NGUVFfRk5TKGV4cGlyZWQpOworI3VuZGVmIENGUV9DRlFRX0ZOUworCitlbnVtIGNmcV9ycV9zdGF0ZV9mbGFncyB7CisJQ0ZRX0NSUV9GTEFHX2luX2ZsaWdodCA9IDAsCisJQ0ZRX0NSUV9GTEFHX2luX2RyaXZlciwKKwlDRlFfQ1JRX0ZMQUdfaXNfc3luYywKKwlDRlFfQ1JRX0ZMQUdfcmVxdWV1ZWQsCit9OworCisjZGVmaW5lIENGUV9DUlFfRk5TKG5hbWUpCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIGNmcV9tYXJrX2NycV8jI25hbWUoc3RydWN0IGNmcV9ycSAqY3JxKQkJXAorewkJCQkJCQkJCVwKKwljcnEtPmNycV9mbGFncyB8PSAoMSA8PCBDRlFfQ1JRX0ZMQUdfIyNuYW1lKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIGNmcV9jbGVhcl9jcnFfIyNuYW1lKHN0cnVjdCBjZnFfcnEgKmNycSkJCVwKK3sJCQkJCQkJCQlcCisJY3JxLT5jcnFfZmxhZ3MgJj0gfigxIDw8IENGUV9DUlFfRkxBR18jI25hbWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBjZnFfY3JxXyMjbmFtZShjb25zdCBzdHJ1Y3QgY2ZxX3JxICpjcnEpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiAoY3JxLT5jcnFfZmxhZ3MgJiAoMSA8PCBDRlFfQ1JRX0ZMQUdfIyNuYW1lKSkgIT0gMDsJXAorfQorCitDRlFfQ1JRX0ZOUyhpbl9mbGlnaHQpOworQ0ZRX0NSUV9GTlMoaW5fZHJpdmVyKTsKK0NGUV9DUlFfRk5TKGlzX3N5bmMpOworQ0ZRX0NSUV9GTlMocmVxdWV1ZWQpOworI3VuZGVmIENGUV9DUlFfRk5TCisKK3N0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfZmluZF9jZnFfaGFzaChzdHJ1Y3QgY2ZxX2RhdGEgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBzaG9ydCk7CiBzdGF0aWMgdm9pZCBjZnFfZGlzcGF0Y2hfc29ydChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGNmcV9ycSAqKTsKLXN0YXRpYyB2b2lkIGNmcV91cGRhdGVfbmV4dF9jcnEoc3RydWN0IGNmcV9ycSAqKTsKIHN0YXRpYyB2b2lkIGNmcV9wdXRfY2ZxZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpOwogCi0vKgotICogd2hhdCB0aGUgZmFpcm5lc3MgaXMgYmFzZWQgb24gKGllIGhvdyBwcm9jZXNzZXMgYXJlIGdyb3VwZWQgYW5kCi0gKiBkaWZmZXJlbnRpYXRlZCkKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1jZnFfaGFzaF9rZXkoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQkvKgotCSAqIG9wdGltaXplIHRoaXMgc28gdGhhdCAtPmtleV90eXBlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc3RydWN0Ci0JICovCi0Jc3dpdGNoIChjZnFkLT5rZXlfdHlwZSkgewotCQljYXNlIENGUV9LRVlfUEdJRDoKLQkJCXJldHVybiBwcm9jZXNzX2dyb3VwKHRzayk7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgQ0ZRX0tFWV9UR0lEOgotCQkJcmV0dXJuIHRzay0+dGdpZDsKLQkJY2FzZSBDRlFfS0VZX1VJRDoKLQkJCXJldHVybiB0c2stPnVpZDsKLQkJY2FzZSBDRlFfS0VZX0dJRDoKLQkJCXJldHVybiB0c2stPmdpZDsKLQl9Ci19CisjZGVmaW5lIHByb2Nlc3Nfc3luYyh0c2spCSgodHNrKS0+ZmxhZ3MgJiBQRl9TWU5DV1JJVEUpCiAKIC8qCiAgKiBsb3RzIG9mIGRlYWRsaW5lIGlvc2NoZWQgZHVwZXMsIGNhbiBiZSBhYnN0cmFjdGVkIGxhdGVyLi4uCkBAIC0yMzUsMTYgKzMxNywxMiBAQAogCiAJaWYgKHEtPmxhc3RfbWVyZ2UgPT0gY3JxLT5yZXF1ZXN0KQogCQlxLT5sYXN0X21lcmdlID0gTlVMTDsKLQotCWNmcV91cGRhdGVfbmV4dF9jcnEoY3JxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNmcV9hZGRfY3JxX2hhc2goc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3JxICpjcnEpCiB7CiAJY29uc3QgaW50IGhhc2hfaWR4ID0gQ0ZRX01IQVNIX0ZOKHJxX2hhc2hfa2V5KGNycS0+cmVxdWVzdCkpOwogCi0JQlVHX09OKCFobGlzdF91bmhhc2hlZCgmY3JxLT5oYXNoKSk7Ci0KIAlobGlzdF9hZGRfaGVhZCgmY3JxLT5oYXNoLCAmY2ZxZC0+Y3JxX2hhc2hbaGFzaF9pZHhdKTsKIH0KIApAQCAtMjU3LDggKzMzNSw2IEBACiAJCXN0cnVjdCBjZnFfcnEgKmNycSA9IGxpc3RfZW50cnlfaGFzaChlbnRyeSk7CiAJCXN0cnVjdCByZXF1ZXN0ICpfX3JxID0gY3JxLT5yZXF1ZXN0OwogCi0JCUJVR19PTihobGlzdF91bmhhc2hlZCgmY3JxLT5oYXNoKSk7Ci0KIAkJaWYgKCFycV9tZXJnZWFibGUoX19ycSkpIHsKIAkJCWNmcV9kZWxfY3JxX2hhc2goY3JxKTsKIAkJCWNvbnRpbnVlOwpAQCAtMjcxLDYgKzM0NywyOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGludCBjZnFfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZjZnFkLT5xdWV1ZS0+cXVldWVfaGVhZCkgfHwgY2ZxZC0+YnVzeV9xdWV1ZXM7Cit9CisKKy8qCisgKiBzY2hlZHVsZXIgcnVuIG9mIHF1ZXVlLCBpZiB0aGVyZSBhcmUgcmVxdWVzdHMgcGVuZGluZyBhbmQgbm8gb25lIGluIHRoZQorICogZHJpdmVyIHRoYXQgd2lsbCByZXN0YXJ0IHF1ZXVlaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfc2NoZWR1bGVfZGlzcGF0Y2goc3RydWN0IGNmcV9kYXRhICpjZnFkKQoreworCWlmICghY2ZxZC0+cnFfaW5fZHJpdmVyICYmIGNmcV9wZW5kaW5nX3JlcXVlc3RzKGNmcWQpKQorCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsoJmNmcWQtPnVucGx1Z193b3JrKTsKK30KKworc3RhdGljIGludCBjZnFfcXVldWVfZW1wdHkocmVxdWVzdF9xdWV1ZV90ICpxKQoreworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOworCisJcmV0dXJuICFjZnFfcGVuZGluZ19yZXF1ZXN0cyhjZnFkKTsKK30KKwogLyoKICAqIExpZnRlZCBmcm9tIEFTIC0gY2hvb3NlIHdoaWNoIG9mIGNycTEgYW5kIGNycTIgdGhhdCBpcyBiZXN0IHNlcnZlZCBub3cuCiAgKiBXZSBjaG9vc2UgdGhlIHJlcXVlc3QgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBoZWFkIHJpZ2h0IG5vdy4gRGlzdGFuY2UKQEAgLTI4NywzNiArMzg1LDE2IEBACiAJCXJldHVybiBjcnEyOwogCWlmIChjcnEyID09IE5VTEwpCiAJCXJldHVybiBjcnExOworCWlmIChjZnFfY3JxX3JlcXVldWVkKGNycTEpKQorCQlyZXR1cm4gY3JxMTsKKwlpZiAoY2ZxX2NycV9yZXF1ZXVlZChjcnEyKSkKKwkJcmV0dXJuIGNycTI7CiAKIAlzMSA9IGNycTEtPnJlcXVlc3QtPnNlY3RvcjsKIAlzMiA9IGNycTItPnJlcXVlc3QtPnNlY3RvcjsKIAogCWxhc3QgPSBjZnFkLT5sYXN0X3NlY3RvcjsKIAotI2lmIDAKLQlpZiAoIWxpc3RfZW1wdHkoJmNmcWQtPnF1ZXVlLT5xdWV1ZV9oZWFkKSkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZjZnFkLT5xdWV1ZS0+cXVldWVfaGVhZDsKLQkJdW5zaWduZWQgbG9uZyBkaXN0YW5jZSA9IH4wVUw7Ci0JCXN0cnVjdCByZXF1ZXN0ICpycTsKLQotCQl3aGlsZSAoKGVudHJ5ID0gZW50cnktPnByZXYpICE9ICZjZnFkLT5xdWV1ZS0+cXVldWVfaGVhZCkgewotCQkJcnEgPSBsaXN0X2VudHJ5X3JxKGVudHJ5KTsKLQotCQkJaWYgKGJsa19iYXJyaWVyX3JxKHJxKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKGRpc3RhbmNlIDwgYWJzKHMxIC0gcnEtPnNlY3RvciArIHJxLT5ucl9zZWN0b3JzKSkgewotCQkJCWRpc3RhbmNlID0gYWJzKHMxIC0gcnEtPnNlY3RvciArcnEtPm5yX3NlY3RvcnMpOwotCQkJCWxhc3QgPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7Ci0JCQl9Ci0JCQlpZiAoZGlzdGFuY2UgPCBhYnMoczIgLSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnMpKSB7Ci0JCQkJZGlzdGFuY2UgPSBhYnMoczIgLSBycS0+c2VjdG9yICtycS0+bnJfc2VjdG9ycyk7Ci0JCQkJbGFzdCA9IHJxLT5zZWN0b3IgKyBycS0+bnJfc2VjdG9yczsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCiAJLyoKIAkgKiBieSBkZWZpbml0aW9uLCAxS2lCIGlzIDIgc2VjdG9ycwogCSAqLwpAQCAtMzc3LDExICs0NTUsMTQgQEAKIAlzdHJ1Y3QgY2ZxX3JxICpjcnFfbmV4dCA9IE5VTEwsICpjcnFfcHJldiA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKnJibmV4dCwgKnJicHJldjsKIAotCWlmICghT05fUkIoJmxhc3QtPnJiX25vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICgocmJuZXh0ID0gcmJfbmV4dCgmbGFzdC0+cmJfbm9kZSkpID09IE5VTEwpCisJcmJuZXh0ID0gTlVMTDsKKwlpZiAoT05fUkIoJmxhc3QtPnJiX25vZGUpKQorCQlyYm5leHQgPSByYl9uZXh0KCZsYXN0LT5yYl9ub2RlKTsKKwlpZiAoIXJibmV4dCkgewogCQlyYm5leHQgPSByYl9maXJzdCgmY2ZxcS0+c29ydF9saXN0KTsKKwkJaWYgKHJibmV4dCA9PSAmbGFzdC0+cmJfbm9kZSkKKwkJCXJibmV4dCA9IE5VTEw7CisJfQogCiAJcmJwcmV2ID0gcmJfcHJldigmbGFzdC0+cmJfbm9kZSk7CiAKQEAgLTQwMSw2NyArNDgyLDUzIEBACiAJCWNmcXEtPm5leHRfY3JxID0gY2ZxX2ZpbmRfbmV4dF9jcnEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgY3JxKTsKIH0KIAotc3RhdGljIGludCBjZnFfY2hlY2tfc29ydF9ycl9saXN0KHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCitzdGF0aWMgdm9pZCBjZnFfcmVzb3J0X3JyX2xpc3Qoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgaW50IHByZWVtcHRlZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmNmcXEtPmNmcWQtPnJyX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqZW50cnk7CiAKLQkvKgotCSAqIGxpc3QgbWlnaHQgc3RpbGwgYmUgb3JkZXJlZAotCSAqLwotCW5leHQgPSBjZnFxLT5jZnFfbGlzdC5uZXh0OwotCWlmIChuZXh0ICE9IGhlYWQpIHsKLQkJc3RydWN0IGNmcV9xdWV1ZSAqY25leHQgPSBsaXN0X2VudHJ5X2NmcXEobmV4dCk7Ci0KLQkJaWYgKGNmcXEtPnNlcnZpY2VfdXNlZCA+IGNuZXh0LT5zZXJ2aWNlX3VzZWQpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwcmV2ID0gY2ZxcS0+Y2ZxX2xpc3QucHJldjsKLQlpZiAocHJldiAhPSBoZWFkKSB7Ci0JCXN0cnVjdCBjZnFfcXVldWUgKmNwcmV2ID0gbGlzdF9lbnRyeV9jZnFxKHByZXYpOwotCi0JCWlmIChjZnFxLT5zZXJ2aWNlX3VzZWQgPCBjcHJldi0+c2VydmljZV91c2VkKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNmcV9zb3J0X3JyX2xpc3Qoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgaW50IG5ld19xdWV1ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZjZnFxLT5jZnFkLT5ycl9saXN0OwotCi0JaWYgKCFjZnFxLT5vbl9ycikKLQkJcmV0dXJuOwotCWlmICghbmV3X3F1ZXVlICYmICFjZnFfY2hlY2tfc29ydF9ycl9saXN0KGNmcXEpKQotCQlyZXR1cm47CisJQlVHX09OKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSk7CiAKIAlsaXN0X2RlbCgmY2ZxcS0+Y2ZxX2xpc3QpOwogCisJaWYgKGNmcV9jbGFzc19ydChjZnFxKSkKKwkJbGlzdCA9ICZjZnFkLT5jdXJfcnI7CisJZWxzZSBpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCisJCWxpc3QgPSAmY2ZxZC0+aWRsZV9ycjsKKwllbHNlIHsKKwkJLyoKKwkJICogaWYgY2ZxcSBoYXMgcmVxdWVzdHMgaW4gZmxpZ2h0LCBkb24ndCBhbGxvdyBpdCB0byBiZQorCQkgKiBmb3VuZCBpbiBjZnFfc2V0X2FjdGl2ZV9xdWV1ZSBiZWZvcmUgaXQgaGFzIGZpbmlzaGVkIHRoZW0uCisJCSAqIHRoaXMgaXMgZG9uZSB0byBpbmNyZWFzZSBmYWlybmVzcyBiZXR3ZWVuIGEgcHJvY2VzcyB0aGF0CisJCSAqIGhhcyBsb3RzIG9mIGlvIHBlbmRpbmcgdnMgb25lIHRoYXQgb25seSBnZW5lcmF0ZXMgb25lCisJCSAqIHNwb3JhZGljYWxseSBvciBzeW5jaHJvbm91c2x5CisJCSAqLworCQlpZiAoY2ZxX2NmcXFfZGlzcGF0Y2hlZChjZnFxKSkKKwkJCWxpc3QgPSAmY2ZxZC0+YnVzeV9ycjsKKwkJZWxzZQorCQkJbGlzdCA9ICZjZnFkLT5ycl9saXN0W2NmcXEtPmlvcHJpb107CisJfQorCiAJLyoKLQkgKiBzb3J0IGJ5IG91ciBtZWFuIHNlcnZpY2VfdXNlZCwgc3ViLXNvcnQgYnkgaW4tZmxpZ2h0IHJlcXVlc3RzCisJICogaWYgcXVldWUgd2FzIHByZWVtcHRlZCwganVzdCBhZGQgdG8gZnJvbnQgdG8gYmUgZmFpci4gYnVzeV9ycgorCSAqIGlzbid0IHNvcnRlZC4KIAkgKi8KLQl3aGlsZSAoKGVudHJ5ID0gZW50cnktPnByZXYpICE9ICZjZnFxLT5jZnFkLT5ycl9saXN0KSB7CisJaWYgKHByZWVtcHRlZCB8fCBsaXN0ID09ICZjZnFkLT5idXN5X3JyKSB7CisJCWxpc3RfYWRkKCZjZnFxLT5jZnFfbGlzdCwgbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHNvcnQgYnkgd2hlbiBxdWV1ZSB3YXMgbGFzdCBzZXJ2aWNlZAorCSAqLworCWVudHJ5ID0gbGlzdDsKKwl3aGlsZSAoKGVudHJ5ID0gZW50cnktPnByZXYpICE9IGxpc3QpIHsKIAkJc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxID0gbGlzdF9lbnRyeV9jZnFxKGVudHJ5KTsKIAotCQlpZiAoY2ZxcS0+c2VydmljZV91c2VkID4gX19jZnFxLT5zZXJ2aWNlX3VzZWQpCisJCWlmICghX19jZnFxLT5zZXJ2aWNlX2xhc3QpCiAJCQlicmVhazsKLQkJZWxzZSBpZiAoY2ZxcS0+c2VydmljZV91c2VkID09IF9fY2ZxcS0+c2VydmljZV91c2VkKSB7Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkICpwcnY7Ci0KLQkJCXdoaWxlICgocHJ2ID0gZW50cnktPnByZXYpICE9ICZjZnFxLT5jZnFkLT5ycl9saXN0KSB7Ci0JCQkJX19jZnFxID0gbGlzdF9lbnRyeV9jZnFxKHBydik7Ci0KLQkJCQlXQVJOX09OKF9fY2ZxcS0+c2VydmljZV91c2VkID4gY2ZxcS0+c2VydmljZV91c2VkKTsKLQkJCQlpZiAoY2ZxcS0+c2VydmljZV91c2VkICE9IF9fY2ZxcS0+c2VydmljZV91c2VkKQotCQkJCQlicmVhazsKLQkJCQlpZiAoY2ZxcS0+aW5fZmxpZ2h0ID4gX19jZnFxLT5pbl9mbGlnaHQpCi0JCQkJCWJyZWFrOwotCi0JCQkJZW50cnkgPSBwcnY7Ci0JCQl9Ci0JCX0KKwkJaWYgKHRpbWVfYmVmb3JlKF9fY2ZxcS0+c2VydmljZV9sYXN0LCBjZnFxLT5zZXJ2aWNlX2xhc3QpKQorCQkJYnJlYWs7CiAJfQogCiAJbGlzdF9hZGQoJmNmcXEtPmNmcV9saXN0LCBlbnRyeSk7CkBAIC00NjksMjggKzUzNiwyNCBAQAogCiAvKgogICogYWRkIHRvIGJ1c3kgbGlzdCBvZiBxdWV1ZXMgZm9yIHNlcnZpY2UsIHRyeWluZyB0byBiZSBmYWlyIGluIG9yZGVyaW5nCi0gKiB0aGUgcGVuZGluZyBsaXN0IGFjY29yZGluZyB0byByZXF1ZXN0cyBzZXJ2aWNlZAorICogdGhlIHBlbmRpbmcgbGlzdCBhY2NvcmRpbmcgdG8gbGFzdCByZXF1ZXN0IHNlcnZpY2UKICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1jZnFfYWRkX2NmcXFfcnIoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQorY2ZxX2FkZF9jZnFxX3JyKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgaW50IHJlcXVldWUpCiB7Ci0JLyoKLQkgKiBpdCdzIGN1cnJlbnRseSBvbiB0aGUgZW1wdHkgbGlzdAotCSAqLwotCWNmcXEtPm9uX3JyID0gMTsKKwlCVUdfT04oY2ZxX2NmcXFfb25fcnIoY2ZxcSkpOworCWNmcV9tYXJrX2NmcXFfb25fcnIoY2ZxcSk7CiAJY2ZxZC0+YnVzeV9xdWV1ZXMrKzsKIAotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGNmcXEtPnNlcnZpY2Vfc3RhcnQgKyBjZnFfc2VydmljZSkpCi0JCWNmcXEtPnNlcnZpY2VfdXNlZCA+Pj0gMzsKLQotCWNmcV9zb3J0X3JyX2xpc3QoY2ZxcSwgMSk7CisJY2ZxX3Jlc29ydF9ycl9saXN0KGNmcXEsIHJlcXVldWUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGNmcV9kZWxfY2ZxcV9ycihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CisJQlVHX09OKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSk7CisJY2ZxX2NsZWFyX2NmcXFfb25fcnIoY2ZxcSk7CiAJbGlzdF9tb3ZlKCZjZnFxLT5jZnFfbGlzdCwgJmNmcWQtPmVtcHR5X2xpc3QpOwotCWNmcXEtPm9uX3JyID0gMDsKIAogCUJVR19PTighY2ZxZC0+YnVzeV9xdWV1ZXMpOwogCWNmcWQtPmJ1c3lfcXVldWVzLS07CkBAIC01MDUsMTYgKzU2OCwxNyBAQAogCiAJaWYgKE9OX1JCKCZjcnEtPnJiX25vZGUpKSB7CiAJCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IGNmcXEtPmNmcWQ7CisJCWNvbnN0IGludCBzeW5jID0gY2ZxX2NycV9pc19zeW5jKGNycSk7CiAKLQkJQlVHX09OKCFjZnFxLT5xdWV1ZWRbY3JxLT5pc19zeW5jXSk7CisJCUJVR19PTighY2ZxcS0+cXVldWVkW3N5bmNdKTsKKwkJY2ZxcS0+cXVldWVkW3N5bmNdLS07CiAKIAkJY2ZxX3VwZGF0ZV9uZXh0X2NycShjcnEpOwogCi0JCWNmcXEtPnF1ZXVlZFtjcnEtPmlzX3N5bmNdLS07CiAJCXJiX2VyYXNlKCZjcnEtPnJiX25vZGUsICZjZnFxLT5zb3J0X2xpc3QpOwogCQlSQl9DTEVBUl9DT0xPUigmY3JxLT5yYl9ub2RlKTsKIAotCQlpZiAoUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkgJiYgY2ZxcS0+b25fcnIpCisJCWlmIChjZnFfY2ZxcV9vbl9ycihjZnFxKSAmJiBSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSkKIAkJCWNmcV9kZWxfY2ZxcV9ycihjZnFkLCBjZnFxKTsKIAl9CiB9CkBAIC01NTAsNyArNjE0LDcgQEAKIAlzdHJ1Y3QgY2ZxX3JxICpfX2FsaWFzOwogCiAJY3JxLT5yYl9rZXkgPSBycV9yYl9rZXkocnEpOwotCWNmcXEtPnF1ZXVlZFtjcnEtPmlzX3N5bmNdKys7CisJY2ZxcS0+cXVldWVkW2NmcV9jcnFfaXNfc3luYyhjcnEpXSsrOwogCiAJLyoKIAkgKiBsb29rcyBhIGxpdHRsZSBvZGQsIGJ1dCB0aGUgZmlyc3QgaW5zZXJ0IG1pZ2h0IHJldHVybiBhbiBhbGlhcy4KQEAgLTU2MSw4ICs2MjUsOCBAQAogCiAJcmJfaW5zZXJ0X2NvbG9yKCZjcnEtPnJiX25vZGUsICZjZnFxLT5zb3J0X2xpc3QpOwogCi0JaWYgKCFjZnFxLT5vbl9ycikKLQkJY2ZxX2FkZF9jZnFxX3JyKGNmcWQsIGNmcXEpOworCWlmICghY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCisJCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxLCBjZnFfY3JxX3JlcXVldWVkKGNycSkpOwogCiAJLyoKIAkgKiBjaGVjayBpZiB0aGlzIHJlcXVlc3QgaXMgYSBiZXR0ZXIgbmV4dC1zZXJ2ZSBjYW5kaWRhdGUKQEAgLTU3NSwxNyArNjM5LDE2IEBACiB7CiAJaWYgKE9OX1JCKCZjcnEtPnJiX25vZGUpKSB7CiAJCXJiX2VyYXNlKCZjcnEtPnJiX25vZGUsICZjZnFxLT5zb3J0X2xpc3QpOwotCQljZnFxLT5xdWV1ZWRbY3JxLT5pc19zeW5jXS0tOworCQljZnFxLT5xdWV1ZWRbY2ZxX2NycV9pc19zeW5jKGNycSldLS07CiAJfQogCiAJY2ZxX2FkZF9jcnFfcmIoY3JxKTsKIH0KIAotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKLWNmcV9maW5kX3JxX3JiKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc2VjdG9yX3Qgc2VjdG9yKQorc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpjZnFfZmluZF9ycV9yYihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHNlY3Rvcl90IHNlY3RvcikKKwogewotCWNvbnN0IHVuc2lnbmVkIGxvbmcga2V5ID0gY2ZxX2hhc2hfa2V5KGNmcWQsIGN1cnJlbnQpOwotCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXkpOworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFfZmluZF9jZnFfaGFzaChjZnFkLCBjdXJyZW50LT5waWQsIENGUV9LRVlfQU5ZKTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKIAogCWlmICghY2ZxcSkKQEAgLTYwOSwyMCArNjcyLDI1IEBACiAKIHN0YXRpYyB2b2lkIGNmcV9kZWFjdGl2YXRlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IGNmcV9ycSAqY3JxID0gUlFfREFUQShycSk7CiAKIAlpZiAoY3JxKSB7CiAJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKIAotCQlpZiAoY2ZxcS0+Y2ZxZC0+Y2ZxX3RhZ2dlZCkgewotCQkJY2ZxcS0+c2VydmljZV91c2VkLS07Ci0JCQljZnFfc29ydF9ycl9saXN0KGNmcXEsIDApOworCQlpZiAoY2ZxX2NycV9pbl9kcml2ZXIoY3JxKSkgeworCQkJY2ZxX2NsZWFyX2NycV9pbl9kcml2ZXIoY3JxKTsKKwkJCVdBUk5fT04oIWNmcWQtPnJxX2luX2RyaXZlcik7CisJCQljZnFkLT5ycV9pbl9kcml2ZXItLTsKIAkJfQorCQlpZiAoY2ZxX2NycV9pbl9mbGlnaHQoY3JxKSkgeworCQkJY29uc3QgaW50IHN5bmMgPSBjZnFfY3JxX2lzX3N5bmMoY3JxKTsKIAotCQlpZiAoY3JxLT5hY2NvdW50ZWQpIHsKLQkJCWNycS0+YWNjb3VudGVkID0gMDsKLQkJCWNmcXEtPmNmcWQtPnJxX2luX2RyaXZlci0tOworCQkJY2ZxX2NsZWFyX2NycV9pbl9mbGlnaHQoY3JxKTsKKwkJCVdBUk5fT04oIWNmcXEtPm9uX2Rpc3BhdGNoW3N5bmNdKTsKKwkJCWNmcXEtPm9uX2Rpc3BhdGNoW3N5bmNdLS07CiAJCX0KKwkJY2ZxX21hcmtfY3JxX3JlcXVldWVkKGNycSk7CiAJfQogfQogCkBAIC02NDAsMTEgKzcwOCwxMCBAQAogCXN0cnVjdCBjZnFfcnEgKmNycSA9IFJRX0RBVEEocnEpOwogCiAJaWYgKGNycSkgewotCQljZnFfcmVtb3ZlX21lcmdlX2hpbnRzKHEsIGNycSk7CiAJCWxpc3RfZGVsX2luaXQoJnJxLT5xdWV1ZWxpc3QpOworCQljZnFfZGVsX2NycV9yYihjcnEpOworCQljZnFfcmVtb3ZlX21lcmdlX2hpbnRzKHEsIGNycSk7CiAKLQkJaWYgKGNycS0+Y2ZxX3F1ZXVlKQotCQkJY2ZxX2RlbF9jcnFfcmIoY3JxKTsKIAl9CiB9CiAKQEAgLTY2MiwyMSArNzI5LDE1IEBACiAJfQogCiAJX19ycSA9IGNmcV9maW5kX3JxX2hhc2goY2ZxZCwgYmlvLT5iaV9zZWN0b3IpOwotCWlmIChfX3JxKSB7Ci0JCUJVR19PTihfX3JxLT5zZWN0b3IgKyBfX3JxLT5ucl9zZWN0b3JzICE9IGJpby0+Ymlfc2VjdG9yKTsKLQotCQlpZiAoZWx2X3JxX21lcmdlX29rKF9fcnEsIGJpbykpIHsKLQkJCXJldCA9IEVMRVZBVE9SX0JBQ0tfTUVSR0U7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChfX3JxICYmIGVsdl9ycV9tZXJnZV9vayhfX3JxLCBiaW8pKSB7CisJCXJldCA9IEVMRVZBVE9SX0JBQ0tfTUVSR0U7CisJCWdvdG8gb3V0OwogCX0KIAogCV9fcnEgPSBjZnFfZmluZF9ycV9yYihjZnFkLCBiaW8tPmJpX3NlY3RvciArIGJpb19zZWN0b3JzKGJpbykpOwotCWlmIChfX3JxKSB7Ci0JCWlmIChlbHZfcnFfbWVyZ2Vfb2soX19ycSwgYmlvKSkgewotCQkJcmV0ID0gRUxFVkFUT1JfRlJPTlRfTUVSR0U7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChfX3JxICYmIGVsdl9ycV9tZXJnZV9vayhfX3JxLCBiaW8pKSB7CisJCXJldCA9IEVMRVZBVE9SX0ZST05UX01FUkdFOworCQlnb3RvIG91dDsKIAl9CiAKIAlyZXR1cm4gRUxFVkFUT1JfTk9fTUVSR0U7CkBAIC03MDksMjAgKzc3MCwyMjAgQEAKIGNmcV9tZXJnZWRfcmVxdWVzdHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCSAgICBzdHJ1Y3QgcmVxdWVzdCAqbmV4dCkKIHsKLQlzdHJ1Y3QgY2ZxX3JxICpjcnEgPSBSUV9EQVRBKHJxKTsKLQlzdHJ1Y3QgY2ZxX3JxICpjbmV4dCA9IFJRX0RBVEEobmV4dCk7Ci0KIAljZnFfbWVyZ2VkX3JlcXVlc3QocSwgcnEpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZycS0+cXVldWVsaXN0KSAmJiAhbGlzdF9lbXB0eSgmbmV4dC0+cXVldWVsaXN0KSkgewotCQlpZiAodGltZV9iZWZvcmUoY25leHQtPnF1ZXVlX3N0YXJ0LCBjcnEtPnF1ZXVlX3N0YXJ0KSkgewotCQkJbGlzdF9tb3ZlKCZycS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKLQkJCWNycS0+cXVldWVfc3RhcnQgPSBjbmV4dC0+cXVldWVfc3RhcnQ7Ci0JCX0KKwkvKgorCSAqIHJlcG9zaXRpb24gaW4gZmlmbyBpZiBuZXh0IGlzIG9sZGVyIHRoYW4gcnEKKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnJxLT5xdWV1ZWxpc3QpICYmICFsaXN0X2VtcHR5KCZuZXh0LT5xdWV1ZWxpc3QpICYmCisJICAgIHRpbWVfYmVmb3JlKG5leHQtPnN0YXJ0X3RpbWUsIHJxLT5zdGFydF90aW1lKSkKKwkJbGlzdF9tb3ZlKCZycS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKKworCWNmcV9yZW1vdmVfcmVxdWVzdChxLCBuZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2NmcV9zZXRfYWN0aXZlX3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwlpZiAoY2ZxcSkgeworCQkvKgorCQkgKiBzdG9wIHBvdGVudGlhbCBpZGxlIGNsYXNzIHF1ZXVlcyB3YWl0aW5nIHNlcnZpY2UKKwkJICovCisJCWRlbF90aW1lcigmY2ZxZC0+aWRsZV9jbGFzc190aW1lcik7CisKKwkJY2ZxcS0+c2xpY2Vfc3RhcnQgPSBqaWZmaWVzOworCQljZnFxLT5zbGljZV9lbmQgPSAwOworCQljZnFxLT5zbGljZV9sZWZ0ID0gMDsKKwkJY2ZxX2NsZWFyX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKTsKKwkJY2ZxX2NsZWFyX2NmcXFfZmlmb19leHBpcmUoY2ZxcSk7CisJCWNmcV9jbGVhcl9jZnFxX2V4cGlyZWQoY2ZxcSk7CiAJfQogCi0JY2ZxX3VwZGF0ZV9uZXh0X2NycShjbmV4dCk7Ci0JY2ZxX3JlbW92ZV9yZXF1ZXN0KHEsIG5leHQpOworCWNmcWQtPmFjdGl2ZV9xdWV1ZSA9IGNmcXE7Cit9CisKKy8qCisgKiAwCisgKiAwLDEKKyAqIDAsMSwyCisgKiAwLDEsMiwzCisgKiAwLDEsMiwzLDQKKyAqIDAsMSwyLDMsNCw1CisgKiAwLDEsMiwzLDQsNSw2CisgKiAwLDEsMiwzLDQsNSw2LDcKKyAqLworc3RhdGljIGludCBjZnFfZ2V0X25leHRfcHJpb19sZXZlbChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCit7CisJaW50IHByaW8sIHdyYXA7CisKKwlwcmlvID0gLTE7CisJd3JhcCA9IDA7CisJZG8geworCQlpbnQgcDsKKworCQlmb3IgKHAgPSBjZnFkLT5jdXJfcHJpbzsgcCA8PSBjZnFkLT5jdXJfZW5kX3ByaW87IHArKykgeworCQkJaWYgKCFsaXN0X2VtcHR5KCZjZnFkLT5ycl9saXN0W3BdKSkgeworCQkJCXByaW8gPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHByaW8gIT0gLTEpCisJCQlicmVhazsKKwkJY2ZxZC0+Y3VyX3ByaW8gPSAwOworCQlpZiAoKytjZnFkLT5jdXJfZW5kX3ByaW8gPT0gQ0ZRX1BSSU9fTElTVFMpIHsKKwkJCWNmcWQtPmN1cl9lbmRfcHJpbyA9IDA7CisJCQlpZiAod3JhcCkKKwkJCQlicmVhazsKKwkJCXdyYXAgPSAxOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAodW5saWtlbHkocHJpbyA9PSAtMSkpCisJCXJldHVybiAtMTsKKworCUJVR19PTihwcmlvID49IENGUV9QUklPX0xJU1RTKTsKKworCWxpc3Rfc3BsaWNlX2luaXQoJmNmcWQtPnJyX2xpc3RbcHJpb10sICZjZnFkLT5jdXJfcnIpOworCisJY2ZxZC0+Y3VyX3ByaW8gPSBwcmlvICsgMTsKKwlpZiAoY2ZxZC0+Y3VyX3ByaW8gPiBjZnFkLT5jdXJfZW5kX3ByaW8pIHsKKwkJY2ZxZC0+Y3VyX2VuZF9wcmlvID0gY2ZxZC0+Y3VyX3ByaW87CisJCWNmcWQtPmN1cl9wcmlvID0gMDsKKwl9CisJaWYgKGNmcWQtPmN1cl9lbmRfcHJpbyA9PSBDRlFfUFJJT19MSVNUUykgeworCQljZnFkLT5jdXJfcHJpbyA9IDA7CisJCWNmcWQtPmN1cl9lbmRfcHJpbyA9IDA7CisJfQorCisJcmV0dXJuIHByaW87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfc2V0X2FjdGl2ZV9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCit7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKKworCS8qCisJICogaWYgY3VycmVudCBxdWV1ZSBpcyBleHBpcmVkIGJ1dCBub3QgZG9uZSB3aXRoIGl0cyByZXF1ZXN0cyB5ZXQsCisJICogd2FpdCBmb3IgdGhhdCB0byBoYXBwZW4KKwkgKi8KKwlpZiAoKGNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWUpICE9IE5VTEwpIHsKKwkJaWYgKGNmcV9jZnFxX2V4cGlyZWQoY2ZxcSkgJiYgY2ZxX2NmcXFfZGlzcGF0Y2hlZChjZnFxKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogaWYgY3VycmVudCBsaXN0IGlzIG5vbi1lbXB0eSwgZ3JhYiBmaXJzdCBlbnRyeS4gaWYgaXQgaXMgZW1wdHksCisJICogZ2V0IG5leHQgcHJpbyBsZXZlbCBhbmQgZ3JhYiBmaXJzdCBlbnRyeSB0aGVuIGlmIGFueSBhcmUgc3BsaWNlZAorCSAqLworCWlmICghbGlzdF9lbXB0eSgmY2ZxZC0+Y3VyX3JyKSB8fCBjZnFfZ2V0X25leHRfcHJpb19sZXZlbChjZnFkKSAhPSAtMSkKKwkJY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShjZnFkLT5jdXJfcnIubmV4dCk7CisKKwkvKgorCSAqIGlmIHdlIGhhdmUgaWRsZSBxdWV1ZXMgYW5kIG5vIHJ0IG9yIGJlIHF1ZXVlcyBoYWQgcGVuZGluZworCSAqIHJlcXVlc3RzLCBlaXRoZXIgYWxsb3cgaW1tZWRpYXRlIHNlcnZpY2UgaWYgdGhlIGdyYWNlIHBlcmlvZAorCSAqIGhhcyBwYXNzZWQgb3IgYXJtIHRoZSBpZGxlIGdyYWNlIHRpbWVyCisJICovCisJaWYgKCFjZnFxICYmICFsaXN0X2VtcHR5KCZjZnFkLT5pZGxlX3JyKSkgeworCQl1bnNpZ25lZCBsb25nIGVuZCA9IGNmcWQtPmxhc3RfZW5kX3JlcXVlc3QgKyBDRlFfSURMRV9HUkFDRTsKKworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBlbmQpKQorCQkJY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShjZnFkLT5pZGxlX3JyLm5leHQpOworCQllbHNlCisJCQltb2RfdGltZXIoJmNmcWQtPmlkbGVfY2xhc3NfdGltZXIsIGVuZCk7CisJfQorCisJX19jZnFfc2V0X2FjdGl2ZV9xdWV1ZShjZnFkLCBjZnFxKTsKKwlyZXR1cm4gY2ZxcTsKK30KKworLyoKKyAqIGN1cnJlbnQgY2ZxcSBleHBpcmVkIGl0cyBzbGljZSAob3Igd2FzIHRvbyBpZGxlKSwgc2VsZWN0IG5ldyBvbmUKKyAqLworc3RhdGljIHZvaWQKK19fY2ZxX3NsaWNlX2V4cGlyZWQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAorCQkgICAgaW50IHByZWVtcHRlZCkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlpZiAoY2ZxX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpKQorCQlkZWxfdGltZXIoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpOworCisJaWYgKCFwcmVlbXB0ZWQgJiYgIWNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpCisJCWNmcXEtPnNlcnZpY2VfbGFzdCA9IG5vdzsKKworCWNmcV9jbGVhcl9jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJY2ZxX2NsZWFyX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpOworCisJLyoKKwkgKiBzdG9yZSB3aGF0IHdhcyBsZWZ0IG9mIHRoaXMgc2xpY2UsIGlmIHRoZSBxdWV1ZSBpZGxlZCBvdXQKKwkgKiBvciB3YXMgcHJlZW1wdGVkCisJICovCisJaWYgKHRpbWVfYWZ0ZXIobm93LCBjZnFxLT5zbGljZV9lbmQpKQorCQljZnFxLT5zbGljZV9sZWZ0ID0gbm93IC0gY2ZxcS0+c2xpY2VfZW5kOworCWVsc2UKKwkJY2ZxcS0+c2xpY2VfbGVmdCA9IDA7CisKKwlpZiAoY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCisJCWNmcV9yZXNvcnRfcnJfbGlzdChjZnFxLCBwcmVlbXB0ZWQpOworCisJaWYgKGNmcXEgPT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKQorCQljZnFkLT5hY3RpdmVfcXVldWUgPSBOVUxMOworCisJaWYgKGNmcWQtPmFjdGl2ZV9jaWMpIHsKKwkJcHV0X2lvX2NvbnRleHQoY2ZxZC0+YWN0aXZlX2NpYy0+aW9jKTsKKwkJY2ZxZC0+YWN0aXZlX2NpYyA9IE5VTEw7CisJfQorCisJY2ZxZC0+ZGlzcGF0Y2hfc2xpY2UgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX3NsaWNlX2V4cGlyZWQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBpbnQgcHJlZW1wdGVkKQoreworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CisKKwlpZiAoY2ZxcSkgeworCQkvKgorCQkgKiB1c2UgZGVmZXJyZWQgZXhwaXJ5LCBpZiB0aGVyZSBhcmUgcmVxdWVzdHMgaW4gcHJvZ3Jlc3MgYXMKKwkJICogbm90IHRvIGRpc3R1cmIgdGhlIHNsaWNlIG9mIHRoZSBuZXh0IHF1ZXVlCisJCSAqLworCQlpZiAoY2ZxX2NmcXFfZGlzcGF0Y2hlZChjZnFxKSkKKwkJCWNmcV9tYXJrX2NmcXFfZXhwaXJlZChjZnFxKTsKKwkJZWxzZQorCQkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCBwcmVlbXB0ZWQpOworCX0KK30KKworc3RhdGljIGludCBjZnFfYXJtX3NsaWNlX3RpbWVyKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKKworeworCVdBUk5fT04oIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKTsKKwlXQVJOX09OKGNmcXEgIT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKTsKKworCS8qCisJICogaWRsZSBpcyBkaXNhYmxlZCwgZWl0aGVyIG1hbnVhbGx5IG9yIGJ5IHBhc3QgcHJvY2VzcyBoaXN0b3J5CisJICovCisJaWYgKCFjZnFkLT5jZnFfc2xpY2VfaWRsZSkKKwkJcmV0dXJuIDA7CisJaWYgKCFjZnFfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiB0YXNrIGhhcyBleGl0ZWQsIGRvbid0IHdhaXQKKwkgKi8KKwlpZiAoY2ZxZC0+YWN0aXZlX2NpYyAmJiAhY2ZxZC0+YWN0aXZlX2NpYy0+aW9jLT50YXNrKQorCQlyZXR1cm4gMDsKKworCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKKwljZnFfbWFya19jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKKworCWlmICghdGltZXJfcGVuZGluZygmY2ZxZC0+aWRsZV9zbGljZV90aW1lcikpIHsKKwkJdW5zaWduZWQgbG9uZyBzbGljZV9sZWZ0ID0gbWluKGNmcXEtPnNsaWNlX2VuZCAtIDEsICh1bnNpZ25lZCBsb25nKSBjZnFkLT5jZnFfc2xpY2VfaWRsZSk7CisKKwkJY2ZxZC0+aWRsZV9zbGljZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIHNsaWNlX2xlZnQ7CisJCWFkZF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJfQorCisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC03MzgsMzEgKzk5OSw0MCBAQAogCXN0cnVjdCByZXF1ZXN0ICpfX3JxOwogCXNlY3Rvcl90IGxhc3Q7CiAKLQljZnFfZGVsX2NycV9yYihjcnEpOwotCWNmcV9yZW1vdmVfbWVyZ2VfaGludHMocSwgY3JxKTsKIAlsaXN0X2RlbCgmY3JxLT5yZXF1ZXN0LT5xdWV1ZWxpc3QpOwogCiAJbGFzdCA9IGNmcWQtPmxhc3Rfc2VjdG9yOwotCXdoaWxlICgoZW50cnkgPSBlbnRyeS0+cHJldikgIT0gaGVhZCkgewotCQlfX3JxID0gbGlzdF9lbnRyeV9ycShlbnRyeSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKF9fcnEsIGhlYWQsIHF1ZXVlbGlzdCkgeworCQlzdHJ1Y3QgY2ZxX3JxICpfX2NycSA9IFJRX0RBVEEoX19ycSk7CiAKLQkJaWYgKGJsa19iYXJyaWVyX3JxKGNycS0+cmVxdWVzdCkpCisJCWlmIChibGtfYmFycmllcl9ycShfX3JxKSkKIAkJCWJyZWFrOwotCQlpZiAoIWJsa19mc19yZXF1ZXN0KGNycS0+cmVxdWVzdCkpCisJCWlmICghYmxrX2ZzX3JlcXVlc3QoX19ycSkpCisJCQlicmVhazsKKwkJaWYgKGNmcV9jcnFfcmVxdWV1ZWQoX19jcnEpKQogCQkJYnJlYWs7CiAKLQkJaWYgKGNycS0+cmVxdWVzdC0+c2VjdG9yID4gX19ycS0+c2VjdG9yKQorCQlpZiAoX19ycS0+c2VjdG9yIDw9IGNycS0+cmVxdWVzdC0+c2VjdG9yKQogCQkJYnJlYWs7CiAJCWlmIChfX3JxLT5zZWN0b3IgPiBsYXN0ICYmIGNycS0+cmVxdWVzdC0+c2VjdG9yIDwgbGFzdCkgewotCQkJbGFzdCA9IGNycS0+cmVxdWVzdC0+c2VjdG9yOworCQkJbGFzdCA9IGNycS0+cmVxdWVzdC0+c2VjdG9yICsgY3JxLT5yZXF1ZXN0LT5ucl9zZWN0b3JzOwogCQkJYnJlYWs7CiAJCX0KKwkJZW50cnkgPSAmX19ycS0+cXVldWVsaXN0OwogCX0KIAogCWNmcWQtPmxhc3Rfc2VjdG9yID0gbGFzdDsKLQljcnEtPmluX2ZsaWdodCA9IDE7Ci0JY2ZxcS0+aW5fZmxpZ2h0Kys7Ci0JbGlzdF9hZGQoJmNycS0+cmVxdWVzdC0+cXVldWVsaXN0LCBlbnRyeSk7CisKKwljZnFxLT5uZXh0X2NycSA9IGNmcV9maW5kX25leHRfY3JxKGNmcWQsIGNmcXEsIGNycSk7CisKKwljZnFfZGVsX2NycV9yYihjcnEpOworCWNmcV9yZW1vdmVfbWVyZ2VfaGludHMocSwgY3JxKTsKKworCWNmcV9tYXJrX2NycV9pbl9mbGlnaHQoY3JxKTsKKwljZnFfY2xlYXJfY3JxX3JlcXVldWVkKGNycSk7CisKKwljZnFxLT5vbl9kaXNwYXRjaFtjZnFfY3JxX2lzX3N5bmMoY3JxKV0rKzsKKwlsaXN0X2FkZF90YWlsKCZjcnEtPnJlcXVlc3QtPnF1ZXVlbGlzdCwgZW50cnkpOwogfQogCiAvKgpAQCAtNzcxLDE3MyArMTA0MSwyMjUgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNmcV9ycSAqY2ZxX2NoZWNrX2ZpZm8oc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOwotCWNvbnN0IGludCByZWFkcyA9ICFsaXN0X2VtcHR5KCZjZnFxLT5maWZvWzBdKTsKLQljb25zdCBpbnQgd3JpdGVzID0gIWxpc3RfZW1wdHkoJmNmcXEtPmZpZm9bMV0pOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IGNmcV9ycSAqY3JxOwogCi0JaWYgKHRpbWVfYmVmb3JlKG5vdywgY2ZxcS0+bGFzdF9maWZvX2V4cGlyZSArIGNmcWQtPmNmcV9maWZvX2JhdGNoX2V4cGlyZSkpCisJaWYgKGNmcV9jZnFxX2ZpZm9fZXhwaXJlKGNmcXEpKQogCQlyZXR1cm4gTlVMTDsKIAotCWNycSA9IFJRX0RBVEEobGlzdF9lbnRyeShjZnFxLT5maWZvWzBdLm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpKTsKLQlpZiAocmVhZHMgJiYgdGltZV9hZnRlcihub3csIGNycS0+cXVldWVfc3RhcnQgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVfcikpIHsKLQkJY2ZxcS0+bGFzdF9maWZvX2V4cGlyZSA9IG5vdzsKLQkJcmV0dXJuIGNycTsKLQl9CisJaWYgKCFsaXN0X2VtcHR5KCZjZnFxLT5maWZvKSkgeworCQlpbnQgZmlmbyA9IGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSk7CiAKLQljcnEgPSBSUV9EQVRBKGxpc3RfZW50cnkoY2ZxcS0+Zmlmb1sxXS5uZXh0LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KSk7Ci0JaWYgKHdyaXRlcyAmJiB0aW1lX2FmdGVyKG5vdywgY3JxLT5xdWV1ZV9zdGFydCArIGNmcWQtPmNmcV9maWZvX2V4cGlyZV93KSkgewotCQljZnFxLT5sYXN0X2ZpZm9fZXhwaXJlID0gbm93OwotCQlyZXR1cm4gY3JxOworCQljcnEgPSBSUV9EQVRBKGxpc3RfZW50cnlfZmlmbyhjZnFxLT5maWZvLm5leHQpKTsKKwkJcnEgPSBjcnEtPnJlcXVlc3Q7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJxLT5zdGFydF90aW1lICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW2ZpZm9dKSkgeworCQkJY2ZxX21hcmtfY2ZxcV9maWZvX2V4cGlyZShjZnFxKTsKKwkJCXJldHVybiBjcnE7CisJCX0KIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAogLyoKLSAqIGRpc3BhdGNoIGEgc2luZ2xlIHJlcXVlc3QgZnJvbSBnaXZlbiBxdWV1ZQorICogU2NhbGUgc2NoZWR1bGUgc2xpY2UgYmFzZWQgb24gaW8gcHJpb3JpdHkuIFVzZSB0aGUgc3luYyB0aW1lIHNsaWNlIG9ubHkKKyAqIGlmIGEgcXVldWUgaXMgbWFya2VkIHN5bmMgYW5kIGhhcyBzeW5jIGlvIHF1ZXVlZC4gQSBzeW5jIHF1ZXVlIHdpdGggYXN5bmMKKyAqIGlvIG9ubHksIHNob3VsZCBub3QgZ2V0IGZ1bGwgc3luYyBzbGljZSBsZW5ndGguCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2ZxX2Rpc3BhdGNoX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsCi0JCSAgICAgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3N0YXRpYyBpbmxpbmUgaW50CitjZnFfcHJpb190b19zbGljZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7Ci0Jc3RydWN0IGNmcV9ycSAqY3JxOworCWNvbnN0IGludCBiYXNlX3NsaWNlID0gY2ZxZC0+Y2ZxX3NsaWNlW2NmcV9jZnFxX3N5bmMoY2ZxcSldOwogCi0JLyoKLQkgKiBmb2xsb3cgZXhwaXJlZCBwYXRoLCBlbHNlIGdldCBmaXJzdCBuZXh0IGF2YWlsYWJsZQotCSAqLwotCWlmICgoY3JxID0gY2ZxX2NoZWNrX2ZpZm8oY2ZxcSkpID09IE5VTEwpIHsKLQkJaWYgKGNmcWQtPmZpbmRfYmVzdF9jcnEpCi0JCQljcnEgPSBjZnFxLT5uZXh0X2NycTsKLQkJZWxzZQotCQkJY3JxID0gcmJfZW50cnlfY3JxKHJiX2ZpcnN0KCZjZnFxLT5zb3J0X2xpc3QpKTsKLQl9CisJV0FSTl9PTihjZnFxLT5pb3ByaW8gPj0gSU9QUklPX0JFX05SKTsKIAotCWNmcWQtPmxhc3Rfc2VjdG9yID0gY3JxLT5yZXF1ZXN0LT5zZWN0b3IgKyBjcnEtPnJlcXVlc3QtPm5yX3NlY3RvcnM7Ci0KLQkvKgotCSAqIGZpbmFsbHksIGluc2VydCByZXF1ZXN0IGludG8gZHJpdmVyIGxpc3QKLQkgKi8KLQljZnFfZGlzcGF0Y2hfc29ydChxLCBjcnEpOworCXJldHVybiBiYXNlX3NsaWNlICsgKGJhc2Vfc2xpY2UvQ0ZRX1NMSUNFX1NDQUxFICogKDQgLSBjZnFxLT5pb3ByaW8pKTsKIH0KIAotc3RhdGljIGludCBjZnFfZGlzcGF0Y2hfcmVxdWVzdHMocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgbWF4X2Rpc3BhdGNoKQorc3RhdGljIGlubGluZSB2b2lkCitjZnFfc2V0X3ByaW9fc2xpY2Uoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQoreworCWNmcXEtPnNsaWNlX2VuZCA9IGNmcV9wcmlvX3RvX3NsaWNlKGNmcWQsIGNmcXEpICsgamlmZmllczsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2NmcV9wcmlvX3RvX21heHJxKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwljb25zdCBpbnQgYmFzZV9ycSA9IGNmcWQtPmNmcV9zbGljZV9hc3luY19ycTsKKworCVdBUk5fT04oY2ZxcS0+aW9wcmlvID49IElPUFJJT19CRV9OUik7CisKKwlyZXR1cm4gMiAqIChiYXNlX3JxICsgYmFzZV9ycSAqIChDRlFfUFJJT19MSVNUUyAtIDEgLSBjZnFxLT5pb3ByaW8pKTsKK30KKworLyoKKyAqIGdldCBuZXh0IHF1ZXVlIGZvciBzZXJ2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfc2VsZWN0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IGZvcmNlKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCisJY2ZxcSA9IGNmcWQtPmFjdGl2ZV9xdWV1ZTsKKwlpZiAoIWNmcXEpCisJCWdvdG8gbmV3X3F1ZXVlOworCisJaWYgKGNmcV9jZnFxX2V4cGlyZWQoY2ZxcSkpCisJCWdvdG8gbmV3X3F1ZXVlOworCisJLyoKKwkgKiBzbGljZSBoYXMgZXhwaXJlZAorCSAqLworCWlmICghY2ZxX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKSAmJiB0aW1lX2FmdGVyKG5vdywgY2ZxcS0+c2xpY2VfZW5kKSkKKwkJZ290byBleHBpcmU7CisKKwkvKgorCSAqIGlmIHF1ZXVlIGhhcyByZXF1ZXN0cywgZGlzcGF0Y2ggb25lLiBpZiBub3QsIGNoZWNrIGlmCisJICogZW5vdWdoIHNsaWNlIGlzIGxlZnQgdG8gd2FpdCBmb3Igb25lCisJICovCisJaWYgKCFSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSkKKwkJZ290byBrZWVwX3F1ZXVlOworCWVsc2UgaWYgKCFmb3JjZSAmJiBjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpICYmCisJCSB0aW1lX2JlZm9yZShub3csIGNmcXEtPnNsaWNlX2VuZCkpIHsKKwkJaWYgKGNmcV9hcm1fc2xpY2VfdGltZXIoY2ZxZCwgY2ZxcSkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKK2V4cGlyZToKKwljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwKTsKK25ld19xdWV1ZToKKwljZnFxID0gY2ZxX3NldF9hY3RpdmVfcXVldWUoY2ZxZCk7CitrZWVwX3F1ZXVlOgorCXJldHVybiBjZnFxOworfQorCitzdGF0aWMgaW50CitfX2NmcV9kaXNwYXRjaF9yZXF1ZXN0cyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCisJCQlpbnQgbWF4X2Rpc3BhdGNoKQoreworCWludCBkaXNwYXRjaGVkID0gMDsKKworCUJVR19PTihSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSk7CisKKwlkbyB7CisJCXN0cnVjdCBjZnFfcnEgKmNycTsKKworCQkvKgorCQkgKiBmb2xsb3cgZXhwaXJlZCBwYXRoLCBlbHNlIGdldCBmaXJzdCBuZXh0IGF2YWlsYWJsZQorCQkgKi8KKwkJaWYgKChjcnEgPSBjZnFfY2hlY2tfZmlmbyhjZnFxKSkgPT0gTlVMTCkKKwkJCWNycSA9IGNmcXEtPm5leHRfY3JxOworCisJCS8qCisJCSAqIGZpbmFsbHksIGluc2VydCByZXF1ZXN0IGludG8gZHJpdmVyIGRpc3BhdGNoIGxpc3QKKwkJICovCisJCWNmcV9kaXNwYXRjaF9zb3J0KGNmcWQtPnF1ZXVlLCBjcnEpOworCisJCWNmcWQtPmRpc3BhdGNoX3NsaWNlKys7CisJCWRpc3BhdGNoZWQrKzsKKworCQlpZiAoIWNmcWQtPmFjdGl2ZV9jaWMpIHsKKwkJCWF0b21pY19pbmMoJmNycS0+aW9fY29udGV4dC0+aW9jLT5yZWZjb3VudCk7CisJCQljZnFkLT5hY3RpdmVfY2ljID0gY3JxLT5pb19jb250ZXh0OworCQl9CisKKwkJaWYgKFJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlIChkaXNwYXRjaGVkIDwgbWF4X2Rpc3BhdGNoKTsKKworCS8qCisJICogaWYgc2xpY2UgZW5kIGlzbid0IHNldCB5ZXQsIHNldCBpdC4gaWYgYXQgbGVhc3Qgb25lIHJlcXVlc3Qgd2FzCisJICogc3luYywgdXNlIHRoZSBzeW5jIHRpbWUgc2xpY2UgdmFsdWUKKwkgKi8KKwlpZiAoIWNmcXEtPnNsaWNlX2VuZCkKKwkJY2ZxX3NldF9wcmlvX3NsaWNlKGNmcWQsIGNmcXEpOworCisJLyoKKwkgKiBleHBpcmUgYW4gYXN5bmMgcXVldWUgaW1tZWRpYXRlbHkgaWYgaXQgaGFzIHVzZWQgdXAgaXRzIHNsaWNlLiBpZGxlCisJICogcXVldWUgYWx3YXlzIGV4cGlyZSBhZnRlciAxIGRpc3BhdGNoIHJvdW5kLgorCSAqLworCWlmICgoIWNmcV9jZnFxX3N5bmMoY2ZxcSkgJiYKKwkgICAgY2ZxZC0+ZGlzcGF0Y2hfc2xpY2UgPj0gY2ZxX3ByaW9fdG9fbWF4cnEoY2ZxZCwgY2ZxcSkpIHx8CisJICAgIGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwKTsKKworCXJldHVybiBkaXNwYXRjaGVkOworfQorCitzdGF0aWMgaW50CitjZnFfZGlzcGF0Y2hfcmVxdWVzdHMocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgbWF4X2Rpc3BhdGNoLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKLQlpbnQgcXVldWVkLCBidXN5X3F1ZXVlcywgZmlyc3Rfcm91bmQ7CiAKLQlpZiAobGlzdF9lbXB0eSgmY2ZxZC0+cnJfbGlzdCkpCisJaWYgKCFjZnFkLT5idXN5X3F1ZXVlcykKIAkJcmV0dXJuIDA7CiAKLQlxdWV1ZWQgPSAwOwotCWZpcnN0X3JvdW5kID0gMTsKLXJlc3RhcnQ6Ci0JYnVzeV9xdWV1ZXMgPSAwOwotCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmY2ZxZC0+cnJfbGlzdCkgewotCQljZnFxID0gbGlzdF9lbnRyeV9jZnFxKGVudHJ5KTsKKwljZnFxID0gY2ZxX3NlbGVjdF9xdWV1ZShjZnFkLCBmb3JjZSk7CisJaWYgKGNmcXEpIHsKKwkJY2ZxX2NsZWFyX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKKwkJY2ZxX2NsZWFyX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpOworCQlkZWxfdGltZXIoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpOwogCi0JCUJVR19PTihSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSk7CisJCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkJCW1heF9kaXNwYXRjaCA9IDE7CiAKLQkJLyoKLQkJICogZmlyc3Qgcm91bmQgb2YgcXVldWVpbmcsIG9ubHkgc2VsZWN0IGZyb20gcXVldWVzIHRoYXQKLQkJICogZG9uJ3QgYWxyZWFkeSBoYXZlIGlvIGluLWZsaWdodAotCQkgKi8KLQkJaWYgKGZpcnN0X3JvdW5kICYmIGNmcXEtPmluX2ZsaWdodCkKLQkJCWNvbnRpbnVlOwotCi0JCWNmcV9kaXNwYXRjaF9yZXF1ZXN0KHEsIGNmcWQsIGNmcXEpOwotCi0JCWlmICghUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpCi0JCQlidXN5X3F1ZXVlcysrOwotCi0JCXF1ZXVlZCsrOworCQlyZXR1cm4gX19jZnFfZGlzcGF0Y2hfcmVxdWVzdHMoY2ZxZCwgY2ZxcSwgbWF4X2Rpc3BhdGNoKTsKIAl9CiAKLQlpZiAoKHF1ZXVlZCA8IG1heF9kaXNwYXRjaCkgJiYgKGJ1c3lfcXVldWVzIHx8IGZpcnN0X3JvdW5kKSkgewotCQlmaXJzdF9yb3VuZCA9IDA7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQlyZXR1cm4gcXVldWVkOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX2FjY291bnRfZGlzcGF0Y2goc3RydWN0IGNmcV9ycSAqY3JxKQogewogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOwotCXVuc2lnbmVkIGxvbmcgbm93LCBlbGFwc2VkOwogCi0JaWYgKCFibGtfZnNfcmVxdWVzdChjcnEtPnJlcXVlc3QpKQorCWlmICh1bmxpa2VseSghYmxrX2ZzX3JlcXVlc3QoY3JxLT5yZXF1ZXN0KSkpCiAJCXJldHVybjsKIAogCS8qCiAJICogYWNjb3VudGVkIGJpdCBpcyBuZWNlc3Nhcnkgc2luY2Ugc29tZSBkcml2ZXJzIHdpbGwgY2FsbAogCSAqIGVsdl9uZXh0X3JlcXVlc3QoKSBtYW55IHRpbWVzIGZvciB0aGUgc2FtZSByZXF1ZXN0IChlZyBpZGUpCiAJICovCi0JaWYgKGNycS0+YWNjb3VudGVkKQorCWlmIChjZnFfY3JxX2luX2RyaXZlcihjcnEpKQogCQlyZXR1cm47CiAKLQlub3cgPSBqaWZmaWVzOwotCWlmIChjZnFxLT5zZXJ2aWNlX3N0YXJ0ID09IH4wVUwpCi0JCWNmcXEtPnNlcnZpY2Vfc3RhcnQgPSBub3c7Ci0KLQkvKgotCSAqIG9uIGRyaXZlcyB3aXRoIHRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nLCBjb21tYW5kIHR1cm4tYXJvdW5kIHRpbWUKLQkgKiBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHRpbWUgc3BlbnQgcHJvY2Vzc2luZyB0aGlzIHZlcnkKLQkgKiBjb21tYW5kIGluc2lkZSB0aGUgZHJpdmUuIHNvIGRvIHRoZSBhY2NvdW50aW5nIGRpZmZlcmVudGx5IHRoZXJlLAotCSAqIGJ5IGp1c3Qgc29ydGluZyBvbiB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzCi0JICovCi0JaWYgKGNmcWQtPmNmcV90YWdnZWQpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIobm93LCBjZnFxLT5zZXJ2aWNlX3N0YXJ0ICsgY2ZxX3NlcnZpY2UpKSB7Ci0JCQljZnFxLT5zZXJ2aWNlX3N0YXJ0ID0gbm93OwotCQkJY2ZxcS0+c2VydmljZV91c2VkIC89IDEwOwotCQl9Ci0KLQkJY2ZxcS0+c2VydmljZV91c2VkKys7Ci0JCWNmcV9zb3J0X3JyX2xpc3QoY2ZxcSwgMCk7Ci0JfQotCi0JZWxhcHNlZCA9IG5vdyAtIGNycS0+cXVldWVfc3RhcnQ7Ci0JaWYgKGVsYXBzZWQgPiBtYXhfZWxhcHNlZF9kaXNwYXRjaCkKLQkJbWF4X2VsYXBzZWRfZGlzcGF0Y2ggPSBlbGFwc2VkOwotCi0JY3JxLT5hY2NvdW50ZWQgPSAxOwotCWNycS0+c2VydmljZV9zdGFydCA9IG5vdzsKLQotCWlmICgrK2NmcWQtPnJxX2luX2RyaXZlciA+PSBDRlFfTUFYX1RBRyAmJiAhY2ZxZC0+Y2ZxX3RhZ2dlZCkgewotCQljZnFxLT5jZnFkLT5jZnFfdGFnZ2VkID0gMTsKLQkJcHJpbnRrKCJjZnE6IGRlcHRoICVkIHJlYWNoZWQsIHRhZ2dpbmcgbm93IG9uXG4iLCBDRlFfTUFYX1RBRyk7Ci0JfQorCWNmcV9tYXJrX2NycV9pbl9kcml2ZXIoY3JxKTsKKwljZnFkLT5ycV9pbl9kcml2ZXIrKzsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBjZnFfYWNjb3VudF9jb21wbGV0aW9uKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIHN0cnVjdCBjZnFfcnEgKmNycSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOworCXVuc2lnbmVkIGxvbmcgbm93OwogCi0JaWYgKCFjcnEtPmFjY291bnRlZCkKKwlpZiAoIWNmcV9jcnFfaW5fZHJpdmVyKGNycSkpCiAJCXJldHVybjsKIAorCW5vdyA9IGppZmZpZXM7CisKIAlXQVJOX09OKCFjZnFkLT5ycV9pbl9kcml2ZXIpOwogCWNmcWQtPnJxX2luX2RyaXZlci0tOwogCi0JaWYgKCFjZnFkLT5jZnFfdGFnZ2VkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQkJdW5zaWduZWQgbG9uZyBkdXJhdGlvbiA9IG5vdyAtIGNycS0+c2VydmljZV9zdGFydDsKKwlpZiAoIWNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQljZnFkLT5sYXN0X2VuZF9yZXF1ZXN0ID0gbm93OwogCi0JCWlmICh0aW1lX2FmdGVyKG5vdywgY2ZxcS0+c2VydmljZV9zdGFydCArIGNmcV9zZXJ2aWNlKSkgewotCQkJY2ZxcS0+c2VydmljZV9zdGFydCA9IG5vdzsKLQkJCWNmcXEtPnNlcnZpY2VfdXNlZCA+Pj0gMzsKKwlpZiAoIWNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpIHsKKwkJaWYgKGNmcV9jZnFxX29uX3JyKGNmcXEpKSB7CisJCQljZnFxLT5zZXJ2aWNlX2xhc3QgPSBub3c7CisJCQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgMCk7CiAJCX0KLQotCQljZnFxLT5zZXJ2aWNlX3VzZWQgKz0gZHVyYXRpb247Ci0JCWNmcV9zb3J0X3JyX2xpc3QoY2ZxcSwgMCk7Ci0KLQkJaWYgKGR1cmF0aW9uID4gbWF4X2VsYXBzZWRfY3JxKQotCQkJbWF4X2VsYXBzZWRfY3JxID0gZHVyYXRpb247CisJCWlmIChjZnFfY2ZxcV9leHBpcmVkKGNmcXEpKSB7CisJCQlfX2NmcV9zbGljZV9leHBpcmVkKGNmcWQsIGNmcXEsIDApOworCQkJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOworCQl9CiAJfQorCisJaWYgKGNmcV9jcnFfaXNfc3luYyhjcnEpKQorCQljcnEtPmlvX2NvbnRleHQtPmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqY2ZxX25leHRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCkBAIC05NTAsNyArMTI3MiwxOCBAQAogZGlzcGF0Y2g6CiAJCXJxID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOwogCi0JCWlmICgoY3JxID0gUlFfREFUQShycSkpICE9IE5VTEwpIHsKKwkJY3JxID0gUlFfREFUQShycSk7CisJCWlmIChjcnEpIHsKKwkJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKKworCQkJLyoKKwkJCSAqIGlmIGlkbGUgd2luZG93IGlzIGRpc2FibGVkLCBhbGxvdyBxdWV1ZSBidWlsZHVwCisJCQkgKi8KKwkJCWlmICghY2ZxX2NycV9pbl9kcml2ZXIoY3JxKSAmJgorCQkJICAgICFjZnFfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKSAmJgorCQkJICAgIGNmcWQtPnJxX2luX2RyaXZlciA+PSBjZnFkLT5jZnFfbWF4X2RlcHRoKQorCQkJCXJldHVybiBOVUxMOworCiAJCQljZnFfcmVtb3ZlX21lcmdlX2hpbnRzKHEsIGNycSk7CiAJCQljZnFfYWNjb3VudF9kaXNwYXRjaChjcnEpOwogCQl9CkBAIC05NTgsNyArMTI5MSw3IEBACiAJCXJldHVybiBycTsKIAl9CiAKLQlpZiAoY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHEsIGNmcWQtPmNmcV9xdWFudHVtKSkKKwlpZiAoY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHEsIGNmcWQtPmNmcV9xdWFudHVtLCAwKSkKIAkJZ290byBkaXNwYXRjaDsKIAogCXJldHVybiBOVUxMOwpAQCAtOTcyLDEzICsxMzA1LDIxIEBACiAgKi8KIHN0YXRpYyB2b2lkIGNmcV9wdXRfcXVldWUoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKLQlCVUdfT04oIWF0b21pY19yZWFkKCZjZnFxLT5yZWYpKTsKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOworCisJQlVHX09OKGF0b21pY19yZWFkKCZjZnFxLT5yZWYpIDw9IDApOwogCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjZnFxLT5yZWYpKQogCQlyZXR1cm47CiAKIAlCVUdfT04ocmJfZmlyc3QoJmNmcXEtPnNvcnRfbGlzdCkpOwotCUJVR19PTihjZnFxLT5vbl9ycik7CisJQlVHX09OKGNmcXEtPmFsbG9jYXRlZFtSRUFEXSArIGNmcXEtPmFsbG9jYXRlZFtXUklURV0pOworCUJVR19PTihjZnFfY2ZxcV9vbl9ycihjZnFxKSk7CisKKwlpZiAodW5saWtlbHkoY2ZxZC0+YWN0aXZlX3F1ZXVlID09IGNmcXEpKSB7CisJCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ZxcSwgMCk7CisJCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKKwl9CiAKIAljZnFfcHV0X2NmcWQoY2ZxcS0+Y2ZxZCk7CiAKQEAgLTk5MSwxNSArMTMzMiwxNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjZnFfcXVldWUgKgotX19jZnFfZmluZF9jZnFfaGFzaChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGxvbmcga2V5LCBjb25zdCBpbnQgaGFzaHZhbCkKK19fY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICpjZnFkLCB1bnNpZ25lZCBpbnQga2V5LCB1bnNpZ25lZCBpbnQgcHJpbywKKwkJICAgIGNvbnN0IGludCBoYXNodmFsKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpoYXNoX2xpc3QgPSAmY2ZxZC0+Y2ZxX2hhc2hbaGFzaHZhbF07CiAJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5LCAqbmV4dDsKIAogCWhsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIG5leHQsIGhhc2hfbGlzdCkgewogCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpfX2NmcXEgPSBsaXN0X2VudHJ5X3FoYXNoKGVudHJ5KTsKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgX19wID0gSU9QUklPX1BSSU9fVkFMVUUoX19jZnFxLT5pb3ByaW9fY2xhc3MsIF9fY2ZxcS0+aW9wcmlvKTsKIAotCQlpZiAoX19jZnFxLT5rZXkgPT0ga2V5KQorCQlpZiAoX19jZnFxLT5rZXkgPT0ga2V5ICYmIChfX3AgPT0gcHJpbyB8fCBwcmlvID09IENGUV9LRVlfQU5ZKSkKIAkJCXJldHVybiBfX2NmcXE7CiAJfQogCkBAIC0xMDA3LDIxMCArMTM1MCwxODcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjZnFfcXVldWUgKgotY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICpjZnFkLCB1bnNpZ25lZCBsb25nIGtleSkKK2NmcV9maW5kX2NmcV9oYXNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgaW50IGtleSwgdW5zaWduZWQgc2hvcnQgcHJpbykKIHsKLQlyZXR1cm4gX19jZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXksIGhhc2hfbG9uZyhrZXksIENGUV9RSEFTSF9TSElGVCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNmcV9yZWhhc2hfY2ZxcShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKipjZnFxLAotCQlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKLXsKLQl1bnNpZ25lZCBsb25nIGhhc2hrZXkgPSBjZnFfaGFzaF9rZXkoY2ZxZCwgY3VycmVudCk7Ci0JdW5zaWduZWQgbG9uZyBoYXNodmFsID0gaGFzaF9sb25nKGhhc2hrZXksIENGUV9RSEFTSF9TSElGVCk7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaGxpc3RfZGVsKCYoKmNmcXEpLT5jZnFfaGFzaCk7Ci0KLQlfX2NmcXEgPSBfX2NmcV9maW5kX2NmcV9oYXNoKGNmcWQsIGhhc2hrZXksIGhhc2h2YWwpOwotCWlmICghX19jZnFxIHx8IF9fY2ZxcSA9PSAqY2ZxcSkgewotCQlfX2NmcXEgPSAqY2ZxcTsKLQkJaGxpc3RfYWRkX2hlYWQoJl9fY2ZxcS0+Y2ZxX2hhc2gsICZjZnFkLT5jZnFfaGFzaFtoYXNodmFsXSk7Ci0JCV9fY2ZxcS0+a2V5X3R5cGUgPSBjZnFkLT5rZXlfdHlwZTsKLQl9IGVsc2UgewotCQlhdG9taWNfaW5jKCZfX2NmcXEtPnJlZik7Ci0JCWNpYy0+Y2ZxcSA9IF9fY2ZxcTsKLQkJY2ZxX3B1dF9xdWV1ZSgqY2ZxcSk7Ci0JCSpjZnFxID0gX19jZnFxOwotCX0KLQotCWNpYy0+Y2ZxcSA9IF9fY2ZxcTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIF9fY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCBwcmlvLCBoYXNoX2xvbmcoa2V5LCBDRlFfUUhBU0hfU0hJRlQpKTsKIH0KIAogc3RhdGljIHZvaWQgY2ZxX2ZyZWVfaW9fY29udGV4dChzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKIHsKKwlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKl9fY2ljOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgbmV4dCwgJmNpYy0+bGlzdCkgeworCQlfX2NpYyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjZnFfaW9fY29udGV4dCwgbGlzdCk7CisJCWttZW1fY2FjaGVfZnJlZShjZnFfaW9jX3Bvb2wsIF9fY2ljKTsKKwl9CisKIAlrbWVtX2NhY2hlX2ZyZWUoY2ZxX2lvY19wb29sLCBjaWMpOwogfQogCiAvKgotICogbG9ja2luZyBoaWVyYXJjaHkgaXM6IGlvX2NvbnRleHQgbG9jayAtPiBxdWV1ZSBsb2NrcworICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICovCitzdGF0aWMgdm9pZCBjZnFfZXhpdF9zaW5nbGVfaW9fY29udGV4dChzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKK3sKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjaWMtPmNmcXEtPmNmcWQ7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gY2ZxZC0+cXVldWU7CisKKwlXQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpOworCisJc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGNpYy0+Y2ZxcSA9PSBjZnFkLT5hY3RpdmVfcXVldWUpKSB7CisJCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ljLT5jZnFxLCAwKTsKKwkJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOworCX0KKworCWNmcV9wdXRfcXVldWUoY2ljLT5jZnFxKTsKKwljaWMtPmNmcXEgPSBOVUxMOworCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOworfQorCisvKgorICogQW5vdGhlciB0YXNrIG1heSB1cGRhdGUgdGhlIHRhc2sgY2ljIGxpc3QsIGlmIGl0IGlzIGRvaW5nIGEgcXVldWUgbG9va3VwCisgKiBvbiBpdHMgYmVoYWxmLiBjZnFfY2ljX2xvY2sgZXhjbHVkZXMgc3VjaCBjb25jdXJyZW50IHVwZGF0ZXMKICAqLwogc3RhdGljIHZvaWQgY2ZxX2V4aXRfaW9fY29udGV4dChzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKIHsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY2ljLT5jZnFxOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gJmNpYy0+bGlzdDsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCiAJLyoKIAkgKiBwdXQgdGhlIHJlZmVyZW5jZSB0aGlzIHRhc2sgaXMgaG9sZGluZyB0byB0aGUgdmFyaW91cyBxdWV1ZXMKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2ljLT5pb2MtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKGVudHJ5ID0gY2ljLT5saXN0Lm5leHQpICE9ICZjaWMtPmxpc3QpIHsKLQkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKLQorCWxpc3RfZm9yX2VhY2goZW50cnksICZjaWMtPmxpc3QpIHsKIAkJX19jaWMgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQsIGxpc3QpOwotCQlsaXN0X2RlbChlbnRyeSk7Ci0KLQkJcSA9IF9fY2ljLT5jZnFxLT5jZnFkLT5xdWV1ZTsKLQkJc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOwotCQljZnFfcHV0X3F1ZXVlKF9fY2ljLT5jZnFxKTsKLQkJc3Bpbl91bmxvY2socS0+cXVldWVfbG9jayk7CisJCWNmcV9leGl0X3NpbmdsZV9pb19jb250ZXh0KF9fY2ljKTsKIAl9CiAKLQlxID0gY2ZxcS0+Y2ZxZC0+cXVldWU7Ci0Jc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOwotCWNmcV9wdXRfcXVldWUoY2ZxcSk7Ci0Jc3Bpbl91bmxvY2socS0+cXVldWVfbG9jayk7Ci0KLQljaWMtPmNmcXEgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNpYy0+aW9jLT5sb2NrLCBmbGFncyk7CisJY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoY2ljKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNmcV9hbGxvY19pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpCitzdGF0aWMgc3RydWN0IGNmcV9pb19jb250ZXh0ICoKK2NmcV9hbGxvY19pb19jb250ZXh0KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IGdmcF9tYXNrKQogewotCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljID0ga21lbV9jYWNoZV9hbGxvYyhjZnFfaW9jX3Bvb2wsIGdmcF9mbGFncyk7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBrbWVtX2NhY2hlX2FsbG9jKGNmcV9pb2NfcG9vbCwgZ2ZwX21hc2spOwogCiAJaWYgKGNpYykgewotCQljaWMtPmR0b3IgPSBjZnFfZnJlZV9pb19jb250ZXh0OwotCQljaWMtPmV4aXQgPSBjZnFfZXhpdF9pb19jb250ZXh0OwogCQlJTklUX0xJU1RfSEVBRCgmY2ljLT5saXN0KTsKIAkJY2ljLT5jZnFxID0gTlVMTDsKKwkJY2ljLT5rZXkgPSBOVUxMOworCQljaWMtPmxhc3RfZW5kX3JlcXVlc3QgPSBqaWZmaWVzOworCQljaWMtPnR0aW1lX3RvdGFsID0gMDsKKwkJY2ljLT50dGltZV9zYW1wbGVzID0gMDsKKwkJY2ljLT50dGltZV9tZWFuID0gMDsKKwkJY2ljLT5kdG9yID0gY2ZxX2ZyZWVfaW9fY29udGV4dDsKKwkJY2ljLT5leGl0ID0gY2ZxX2V4aXRfaW9fY29udGV4dDsKIAl9CiAKIAlyZXR1cm4gY2ljOwogfQogCitzdGF0aWMgdm9pZCBjZnFfaW5pdF9wcmlvX2RhdGEoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IGlvcHJpb19jbGFzczsKKworCWlmICghY2ZxX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpKQorCQlyZXR1cm47CisKKwlpb3ByaW9fY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyh0c2stPmlvcHJpbyk7CisJc3dpdGNoIChpb3ByaW9fY2xhc3MpIHsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiY2ZxOiBiYWQgcHJpbyAleFxuIiwgaW9wcmlvX2NsYXNzKTsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfTk9ORToKKwkJCS8qCisJCQkgKiBubyBwcmlvIHNldCwgcGxhY2UgdXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgQkUgY2xhc3NlcworCQkJICovCisJCQljZnFxLT5pb3ByaW8gPSB0YXNrX25pY2VfaW9wcmlvKHRzayk7CisJCQljZnFxLT5pb3ByaW9fY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfUlQ6CisJCQljZnFxLT5pb3ByaW8gPSB0YXNrX2lvcHJpbyh0c2spOworCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX1JUOworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX0NMQVNTX0JFOgorCQkJY2ZxcS0+aW9wcmlvID0gdGFza19pb3ByaW8odHNrKTsKKwkJCWNmcXEtPmlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19DTEFTU19JRExFOgorCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX0lETEU7CisJCQljZnFxLT5pb3ByaW8gPSA3OworCQkJY2ZxX2NsZWFyX2NmcXFfaWRsZV93aW5kb3coY2ZxcSk7CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIGtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgcHJpbyBzZXR0aW5ncyBpbiBjYXNlIHdlIGhhdmUgdG8gdGVtcG9yYXJpbHkKKwkgKiBlbGV2YXRlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHF1ZXVlCisJICovCisJY2ZxcS0+b3JnX2lvcHJpbyA9IGNmcXEtPmlvcHJpbzsKKwljZnFxLT5vcmdfaW9wcmlvX2NsYXNzID0gY2ZxcS0+aW9wcmlvX2NsYXNzOworCisJaWYgKGNmcV9jZnFxX29uX3JyKGNmcXEpKQorCQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgMCk7CisKKwljZnFfY2xlYXJfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VkX2lvcHJpbyhzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQoreworCWlmIChjZnFxKSB7CisJCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IGNmcXEtPmNmcWQ7CisKKwkJc3Bpbl9sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJY2ZxX21hcmtfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7CisJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKKwkJc3Bpbl91bmxvY2soY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCX0KK30KKwogLyoKLSAqIFNldHVwIGdlbmVyYWwgaW8gY29udGV4dCBhbmQgY2ZxIGlvIGNvbnRleHQuIFRoZXJlIGNhbiBiZSBzZXZlcmFsIGNmcQotICogaW8gY29udGV4dHMgcGVyIGdlbmVyYWwgaW8gY29udGV4dCwgaWYgdGhpcyBwcm9jZXNzIGlzIGRvaW5nIGlvIHRvIG1vcmUKLSAqIHRoYW4gb25lIGRldmljZSBtYW5hZ2VkIGJ5IGNmcS4gTm90ZSB0aGF0IGNhbGxlciBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvCi0gKiBjZnFxLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0IGRpc2FwcGVhcmluZworICogY2FsbGJhY2sgZnJvbSBzeXNfaW9wcmlvX3NldCwgaXJxcyBhcmUgZGlzYWJsZWQKICAqLwotc3RhdGljIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqCi1jZnFfZ2V0X2lvX2NvbnRleHQoc3RydWN0IGNmcV9xdWV1ZSAqKmNmcXEsIGludCBnZnBfZmxhZ3MpCitzdGF0aWMgaW50IGNmcV9pb2Nfc2V0X2lvcHJpbyhzdHJ1Y3QgaW9fY29udGV4dCAqaW9jLCB1bnNpZ25lZCBpbnQgaW9wcmlvKQogewotCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9ICgqY2ZxcSktPmNmcWQ7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxID0gKmNmcXE7Ci0Jc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7Ci0Jc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKKwlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYyA9IGlvYy0+Y2ljOwogCi0JbWlnaHRfc2xlZXBfaWYoZ2ZwX2ZsYWdzICYgX19HRlBfV0FJVCk7CisJY2hhbmdlZF9pb3ByaW8oY2ljLT5jZnFxKTsKIAotCWlvYyA9IGdldF9pb19jb250ZXh0KGdmcF9mbGFncyk7Ci0JaWYgKCFpb2MpCi0JCXJldHVybiBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ljLCAmY2ljLT5saXN0LCBsaXN0KQorCQljaGFuZ2VkX2lvcHJpbyhjaWMtPmNmcXEpOwogCi0JaWYgKChjaWMgPSBpb2MtPmNpYykgPT0gTlVMTCkgewotCQljaWMgPSBjZnFfYWxsb2NfaW9fY29udGV4dChnZnBfZmxhZ3MpOwotCi0JCWlmIChjaWMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCi0JCWlvYy0+Y2ljID0gY2ljOwotCQljaWMtPmlvYyA9IGlvYzsKLQkJY2ljLT5jZnFxID0gX19jZnFxOwotCQlhdG9taWNfaW5jKCZfX2NmcXEtPnJlZik7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkvKgotCQkgKiBzaW5jZSB0aGUgZmlyc3QgY2ljIG9uIHRoZSBsaXN0IGlzIGFjdHVhbGx5IHRoZSBoZWFkCi0JCSAqIGl0c2VsZiwgbmVlZCB0byBjaGVjayB0aGlzIGhlcmUgb3Igd2UnbGwgZHVwbGljYXRlIGFuCi0JCSAqIGNpYyBwZXIgaW9jIGZvciBubyByZWFzb24KLQkJICovCi0JCWlmIChjaWMtPmNmcXEgPT0gX19jZnFxKQotCQkJZ290byBvdXQ7Ci0KLQkJLyoKLQkJICogY2ljIGV4aXN0cywgY2hlY2sgaWYgd2UgYWxyZWFkeSBhcmUgdGhlcmUuIGxpbmVhciBzZWFyY2gKLQkJICogc2hvdWxkIGJlIG9rIGhlcmUsIHRoZSBsaXN0IHdpbGwgdXN1YWxseSBub3QgYmUgbW9yZSB0aGFuCi0JCSAqIDEgb3IgYSBmZXcgZW50cmllcyBsb25nCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoX19jaWMsICZjaWMtPmxpc3QsIGxpc3QpIHsKLQkJCS8qCi0JCQkgKiB0aGlzIHByb2Nlc3MgaXMgYWxyZWFkeSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvCi0JCQkgKiB0aGlzIHF1ZXVlLCBzbyBubyBuZWVkIHRvIGdldCBvbmUgbW9yZQotCQkJICovCi0JCQlpZiAoX19jaWMtPmNmcXEgPT0gX19jZnFxKSB7Ci0JCQkJY2ljID0gX19jaWM7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5sb2NrLCBmbGFncyk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyoKLQkJICogbm9wZSwgcHJvY2VzcyBkb2Vzbid0IGhhdmUgYSBjaWMgYXNzb2ljYXRlZCB3aXRoIHRoaXMKLQkJICogY2ZxcSB5ZXQuIGdldCBhIG5ldyBvbmUgYW5kIGFkZCB0byBsaXN0Ci0JCSAqLwotCQlfX2NpYyA9IGNmcV9hbGxvY19pb19jb250ZXh0KGdmcF9mbGFncyk7Ci0JCWlmIChfX2NpYyA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0KLQkJX19jaWMtPmlvYyA9IGlvYzsKLQkJX19jaWMtPmNmcXEgPSBfX2NmcXE7Ci0JCWF0b21pY19pbmMoJl9fY2ZxcS0+cmVmKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZCgmX19jaWMtPmxpc3QsICZjaWMtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmxvY2ssIGZsYWdzKTsKLQotCQljaWMgPSBfX2NpYzsKLQkJKmNmcXEgPSBfX2NmcXE7Ci0JfQotCi1vdXQ6Ci0JLyoKLQkgKiBpZiBrZXlfdHlwZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmbHksIHdlIGxhemlseSByZWhhc2gKLQkgKiBlYWNoIHF1ZXVlIGF0IGxvb2t1cCB0aW1lCi0JICovCi0JaWYgKCgqY2ZxcSktPmtleV90eXBlICE9IGNmcWQtPmtleV90eXBlKQotCQljZnFfcmVoYXNoX2NmcXEoY2ZxZCwgY2ZxcSwgY2ljKTsKLQotCXJldHVybiBjaWM7Ci1lcnI6Ci0JcHV0X2lvX2NvbnRleHQoaW9jKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjZnFfcXVldWUgKgotX19jZnFfZ2V0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgbG9uZyBrZXksIGludCBnZnBfbWFzaykKK2NmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCB1bnNpZ25lZCBpbnQga2V5LCB1bnNpZ25lZCBzaG9ydCBpb3ByaW8sCisJICAgICAgaW50IGdmcF9tYXNrKQogewogCWNvbnN0IGludCBoYXNodmFsID0gaGFzaF9sb25nKGtleSwgQ0ZRX1FIQVNIX1NISUZUKTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLCAqbmV3X2NmcXEgPSBOVUxMOwogCiByZXRyeToKLQljZnFxID0gX19jZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXksIGhhc2h2YWwpOworCWNmcXEgPSBfX2NmcV9maW5kX2NmcV9oYXNoKGNmcWQsIGtleSwgaW9wcmlvLCBoYXNodmFsKTsKIAogCWlmICghY2ZxcSkgewogCQlpZiAobmV3X2NmcXEpIHsKIAkJCWNmcXEgPSBuZXdfY2ZxcTsKIAkJCW5ld19jZnFxID0gTlVMTDsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpIHsKIAkJCXNwaW5fdW5sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7CiAJCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2MoY2ZxX3Bvb2wsIGdmcF9tYXNrKTsKIAkJCXNwaW5fbG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOwotCi0JCQlpZiAoIW5ld19jZnFxICYmICEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkKLQkJCQlnb3RvIG91dDsKLQogCQkJZ290byByZXRyeTsKKwkJfSBlbHNlIHsKKwkJCWNmcXEgPSBrbWVtX2NhY2hlX2FsbG9jKGNmcV9wb29sLCBnZnBfbWFzayk7CisJCQlpZiAoIWNmcXEpCisJCQkJZ290byBvdXQ7CiAJCX0KIAogCQltZW1zZXQoY2ZxcSwgMCwgc2l6ZW9mKCpjZnFxKSk7CkBAIC0xMjE4LDE2ICsxNTM4LDIxIEBACiAJCUlOSVRfSExJU1RfTk9ERSgmY2ZxcS0+Y2ZxX2hhc2gpOwogCQlJTklUX0xJU1RfSEVBRCgmY2ZxcS0+Y2ZxX2xpc3QpOwogCQlSQl9DTEVBUl9ST09UKCZjZnFxLT5zb3J0X2xpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmY2ZxcS0+Zmlmb1swXSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvWzFdKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNmcXEtPmZpZm8pOwogCiAJCWNmcXEtPmtleSA9IGtleTsKIAkJaGxpc3RfYWRkX2hlYWQoJmNmcXEtPmNmcV9oYXNoLCAmY2ZxZC0+Y2ZxX2hhc2hbaGFzaHZhbF0pOwogCQlhdG9taWNfc2V0KCZjZnFxLT5yZWYsIDApOwogCQljZnFxLT5jZnFkID0gY2ZxZDsKIAkJYXRvbWljX2luYygmY2ZxZC0+cmVmKTsKLQkJY2ZxcS0+a2V5X3R5cGUgPSBjZnFkLT5rZXlfdHlwZTsKLQkJY2ZxcS0+c2VydmljZV9zdGFydCA9IH4wVUw7CisJCWNmcXEtPnNlcnZpY2VfbGFzdCA9IDA7CisJCS8qCisJCSAqIHNldCAtPnNsaWNlX2xlZnQgdG8gYWxsb3cgcHJlZW1wdGlvbiBmb3IgYSBuZXcgcHJvY2VzcworCQkgKi8KKwkJY2ZxcS0+c2xpY2VfbGVmdCA9IDIgKiBjZnFkLT5jZnFfc2xpY2VfaWRsZTsKKwkJY2ZxX21hcmtfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKKwkJY2ZxX21hcmtfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7CisJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKIAl9CiAKIAlpZiAobmV3X2NmcXEpCkBAIC0xMjM5LDU1ICsxNTY0LDI5NyBAQAogCXJldHVybiBjZnFxOwogfQogCi1zdGF0aWMgdm9pZCBjZnFfZW5xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcnEgKmNycSkKKy8qCisgKiBTZXR1cCBnZW5lcmFsIGlvIGNvbnRleHQgYW5kIGNmcSBpbyBjb250ZXh0LiBUaGVyZSBjYW4gYmUgc2V2ZXJhbCBjZnEKKyAqIGlvIGNvbnRleHRzIHBlciBnZW5lcmFsIGlvIGNvbnRleHQsIGlmIHRoaXMgcHJvY2VzcyBpcyBkb2luZyBpbyB0byBtb3JlCisgKiB0aGFuIG9uZSBkZXZpY2UgbWFuYWdlZCBieSBjZnEuIE5vdGUgdGhhdCBjYWxsZXIgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0bworICogY2ZxcSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdCBkaXNhcHBlYXJpbmcKKyAqLworc3RhdGljIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqCitjZnFfZ2V0X2lvX2NvbnRleHQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBwaWRfdCBwaWQsIGludCBnZnBfbWFzaykKIHsKLQljcnEtPmlzX3N5bmMgPSAwOwotCWlmIChycV9kYXRhX2RpcihjcnEtPnJlcXVlc3QpID09IFJFQUQgfHwgY3VycmVudC0+ZmxhZ3MgJiBQRl9TWU5DV1JJVEUpCi0JCWNycS0+aXNfc3luYyA9IDE7CisJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IE5VTEw7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CisKKwltaWdodF9zbGVlcF9pZihnZnBfbWFzayAmIF9fR0ZQX1dBSVQpOworCisJaW9jID0gZ2V0X2lvX2NvbnRleHQoZ2ZwX21hc2spOworCWlmICghaW9jKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoY2ljID0gaW9jLT5jaWMpID09IE5VTEwpIHsKKwkJY2ljID0gY2ZxX2FsbG9jX2lvX2NvbnRleHQoY2ZxZCwgZ2ZwX21hc2spOworCisJCWlmIChjaWMgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCisJCS8qCisJCSAqIG1hbnVhbGx5IGluY3JlbWVudCBnZW5lcmljIGlvX2NvbnRleHQgdXNhZ2UgY291bnQsIGl0CisJCSAqIGNhbm5vdCBnbyBhd2F5IHNpbmNlIHdlIGFyZSBhbHJlYWR5IGhvbGRpbmcgb25lIHJlZiB0byBpdAorCQkgKi8KKwkJaW9jLT5jaWMgPSBjaWM7CisJCWlvYy0+c2V0X2lvcHJpbyA9IGNmcV9pb2Nfc2V0X2lvcHJpbzsKKwkJY2ljLT5pb2MgPSBpb2M7CisJCWNpYy0+a2V5ID0gY2ZxZDsKKwkJYXRvbWljX2luYygmY2ZxZC0+cmVmKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKl9fY2ljOworCisJCS8qCisJCSAqIHRoZSBmaXJzdCBjaWMgb24gdGhlIGxpc3QgaXMgYWN0dWFsbHkgdGhlIGhlYWQgaXRzZWxmCisJCSAqLworCQlpZiAoY2ljLT5rZXkgPT0gY2ZxZCkKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIGNpYyBleGlzdHMsIGNoZWNrIGlmIHdlIGFscmVhZHkgYXJlIHRoZXJlLiBsaW5lYXIgc2VhcmNoCisJCSAqIHNob3VsZCBiZSBvayBoZXJlLCB0aGUgbGlzdCB3aWxsIHVzdWFsbHkgbm90IGJlIG1vcmUgdGhhbgorCQkgKiAxIG9yIGEgZmV3IGVudHJpZXMgbG9uZworCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2NpYywgJmNpYy0+bGlzdCwgbGlzdCkgeworCQkJLyoKKwkJCSAqIHRoaXMgcHJvY2VzcyBpcyBhbHJlYWR5IGhvbGRpbmcgYSByZWZlcmVuY2UgdG8KKwkJCSAqIHRoaXMgcXVldWUsIHNvIG5vIG5lZWQgdG8gZ2V0IG9uZSBtb3JlCisJCQkgKi8KKwkJCWlmIChfX2NpYy0+a2V5ID09IGNmcWQpIHsKKwkJCQljaWMgPSBfX2NpYzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIG5vcGUsIHByb2Nlc3MgZG9lc24ndCBoYXZlIGEgY2ljIGFzc29pY2F0ZWQgd2l0aCB0aGlzCisJCSAqIGNmcXEgeWV0LiBnZXQgYSBuZXcgb25lIGFuZCBhZGQgdG8gbGlzdAorCQkgKi8KKwkJX19jaWMgPSBjZnFfYWxsb2NfaW9fY29udGV4dChjZnFkLCBnZnBfbWFzayk7CisJCWlmIChfX2NpYyA9PSBOVUxMKQorCQkJZ290byBlcnI7CisKKwkJX19jaWMtPmlvYyA9IGlvYzsKKwkJX19jaWMtPmtleSA9IGNmcWQ7CisJCWF0b21pY19pbmMoJmNmcWQtPnJlZik7CisJCWxpc3RfYWRkKCZfX2NpYy0+bGlzdCwgJmNpYy0+bGlzdCk7CisJCWNpYyA9IF9fY2ljOworCX0KKworb3V0OgorCXJldHVybiBjaWM7CitlcnI6CisJcHV0X2lvX2NvbnRleHQoaW9jKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NmcV91cGRhdGVfaW9fdGhpbmt0aW1lKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCit7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkLCB0dGltZTsKKworCS8qCisJICogaWYgdGhpcyBjb250ZXh0IGFscmVhZHkgaGFzIHN0dWZmIHF1ZXVlZCwgdGhpbmt0aW1lIGlzIGZyb20KKwkgKiBsYXN0IHF1ZXVlIG5vdCBsYXN0IGVuZAorCSAqLworI2lmIDAKKwlpZiAodGltZV9hZnRlcihjaWMtPmxhc3RfZW5kX3JlcXVlc3QsIGNpYy0+bGFzdF9xdWV1ZSkpCisJCWVsYXBzZWQgPSBqaWZmaWVzIC0gY2ljLT5sYXN0X2VuZF9yZXF1ZXN0OworCWVsc2UKKwkJZWxhcHNlZCA9IGppZmZpZXMgLSBjaWMtPmxhc3RfcXVldWU7CisjZWxzZQorCQllbGFwc2VkID0gamlmZmllcyAtIGNpYy0+bGFzdF9lbmRfcmVxdWVzdDsKKyNlbmRpZgorCisJdHRpbWUgPSBtaW4oZWxhcHNlZCwgMlVMICogY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpOworCisJY2ljLT50dGltZV9zYW1wbGVzID0gKDcqY2ljLT50dGltZV9zYW1wbGVzICsgMjU2KSAvIDg7CisJY2ljLT50dGltZV90b3RhbCA9ICg3KmNpYy0+dHRpbWVfdG90YWwgKyAyNTYqdHRpbWUpIC8gODsKKwljaWMtPnR0aW1lX21lYW4gPSAoY2ljLT50dGltZV90b3RhbCArIDEyOCkgLyBjaWMtPnR0aW1lX3NhbXBsZXM7Cit9CisKKyNkZWZpbmUgc2FtcGxlX3ZhbGlkKHNhbXBsZXMpCSgoc2FtcGxlcykgPiA4MCkKKworLyoKKyAqIERpc2FibGUgaWRsZSB3aW5kb3cgaWYgdGhlIHByb2Nlc3MgdGhpbmtzIHRvbyBsb25nIG9yIHNlZWtzIHNvIG11Y2ggdGhhdAorICogaXQgZG9lc24ndCBtYXR0ZXIKKyAqLworc3RhdGljIHZvaWQKK2NmcV91cGRhdGVfaWRsZV93aW5kb3coc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAorCQkgICAgICAgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCit7CisJaW50IGVuYWJsZV9pZGxlID0gY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSk7CisKKwlpZiAoIWNpYy0+aW9jLT50YXNrIHx8ICFjZnFkLT5jZnFfc2xpY2VfaWRsZSkKKwkJZW5hYmxlX2lkbGUgPSAwOworCWVsc2UgaWYgKHNhbXBsZV92YWxpZChjaWMtPnR0aW1lX3NhbXBsZXMpKSB7CisJCWlmIChjaWMtPnR0aW1lX21lYW4gPiBjZnFkLT5jZnFfc2xpY2VfaWRsZSkKKwkJCWVuYWJsZV9pZGxlID0gMDsKKwkJZWxzZQorCQkJZW5hYmxlX2lkbGUgPSAxOworCX0KKworCWlmIChlbmFibGVfaWRsZSkKKwkJY2ZxX21hcmtfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKKwllbHNlCisJCWNmcV9jbGVhcl9jZnFxX2lkbGVfd2luZG93KGNmcXEpOworfQorCisKKy8qCisgKiBDaGVjayBpZiBuZXdfY2ZxcSBzaG91bGQgcHJlZW1wdCB0aGUgY3VycmVudGx5IGFjdGl2ZSBxdWV1ZS4gUmV0dXJuIDAgZm9yCisgKiBubyBvciBpZiB3ZSBhcmVuJ3Qgc3VyZSwgYSAxIHdpbGwgY2F1c2UgYSBwcmVlbXB0LgorICovCitzdGF0aWMgaW50CitjZnFfc2hvdWxkX3ByZWVtcHQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpuZXdfY2ZxcSwKKwkJICAgc3RydWN0IGNmcV9ycSAqY3JxKQoreworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CisKKwlpZiAoY2ZxX2NsYXNzX2lkbGUobmV3X2NmcXEpKQorCQlyZXR1cm4gMDsKKworCWlmICghY2ZxcSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCisJCXJldHVybiAxOworCWlmICghY2ZxX2NmcXFfd2FpdF9yZXF1ZXN0KG5ld19jZnFxKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBpZiBpdCBkb2Vzbid0IGhhdmUgc2xpY2UgbGVmdCwgZm9yZ2V0IGl0CisJICovCisJaWYgKG5ld19jZnFxLT5zbGljZV9sZWZ0IDwgY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpCisJCXJldHVybiAwOworCWlmIChjZnFfY3JxX2lzX3N5bmMoY3JxKSAmJiAhY2ZxX2NmcXFfc3luYyhjZnFxKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNmcXEgcHJlZW1wdHMgdGhlIGFjdGl2ZSBxdWV1ZS4gaWYgd2UgYWxsb3dlZCBwcmVlbXB0IHdpdGggbm8gc2xpY2UgbGVmdCwKKyAqIGxldCBpdCBoYXZlIGhhbGYgb2YgaXRzIG5vbWluYWwgc2xpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGNmcV9wcmVlbXB0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpfX2NmcXEsICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKF9fY2ZxcSwgbmV4dCwgJmNmcWQtPmN1cl9yciwgY2ZxX2xpc3QpCisJCWNmcV9yZXNvcnRfcnJfbGlzdChfX2NmcXEsIDEpOworCisJaWYgKCFjZnFxLT5zbGljZV9sZWZ0KQorCQljZnFxLT5zbGljZV9sZWZ0ID0gY2ZxX3ByaW9fdG9fc2xpY2UoY2ZxZCwgY2ZxcSkgLyAyOworCisJY2ZxcS0+c2xpY2VfZW5kID0gY2ZxcS0+c2xpY2VfbGVmdCArIGppZmZpZXM7CisJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCAxKTsKKwlfX2NmcV9zZXRfYWN0aXZlX3F1ZXVlKGNmcWQsIGNmcXEpOworfQorCisvKgorICogc2hvdWxkIHJlYWxseSBiZSBhIGxsX3J3X2Jsay5jIGhlbHBlcgorICovCitzdGF0aWMgdm9pZCBjZnFfc3RhcnRfcXVldWVpbmcoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNmcWQtPnF1ZXVlOworCisJaWYgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkKKwkJcS0+cmVxdWVzdF9mbihxKTsKKwllbHNlCisJCV9fZ2VuZXJpY191bnBsdWdfZGV2aWNlKHEpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSBuZXcgZnMgcmVxdWVzdCAoY3JxKSBpcyBhZGRlZCAodG8gY2ZxcSkuIENoZWNrIGlmIHRoZXJlJ3MKKyAqIHNvbWV0aGluZyB3ZSBzaG91bGQgZG8gYWJvdXQgaXQKKyAqLworc3RhdGljIHZvaWQKK2NmcV9jcnFfZW5xdWV1ZWQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAorCQkgc3RydWN0IGNmcV9ycSAqY3JxKQoreworCWNvbnN0IGludCBzeW5jID0gY2ZxX2NycV9pc19zeW5jKGNycSk7CisKKwljZnFxLT5uZXh0X2NycSA9IGNmcV9jaG9vc2VfcmVxKGNmcWQsIGNmcXEtPm5leHRfY3JxLCBjcnEpOworCisJaWYgKHN5bmMpIHsKKwkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBjcnEtPmlvX2NvbnRleHQ7CisKKwkJY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoY2ZxZCwgY2ljKTsKKwkJY2ZxX3VwZGF0ZV9pZGxlX3dpbmRvdyhjZnFkLCBjZnFxLCBjaWMpOworCisJCWNpYy0+bGFzdF9xdWV1ZSA9IGppZmZpZXM7CisJfQorCisJaWYgKGNmcXEgPT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKSB7CisJCS8qCisJCSAqIGlmIHdlIGFyZSB3YWl0aW5nIGZvciBhIHJlcXVlc3QgZm9yIHRoaXMgcXVldWUsIGxldCBpdCByaXAKKwkJICogaW1tZWRpYXRlbHkgYW5kIGZsYWcgdGhhdCB3ZSBtdXN0IG5vdCBleHBpcmUgdGhpcyBxdWV1ZQorCQkgKiBqdXN0IG5vdworCQkgKi8KKwkJaWYgKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSkgeworCQkJY2ZxX21hcmtfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOworCQkJZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKKwkJCWNmcV9zdGFydF9xdWV1ZWluZyhjZnFkLCBjZnFxKTsKKwkJfQorCX0gZWxzZSBpZiAoY2ZxX3Nob3VsZF9wcmVlbXB0KGNmcWQsIGNmcXEsIGNycSkpIHsKKwkJLyoKKwkJICogbm90IHRoZSBhY3RpdmUgcXVldWUgLSBleHBpcmUgY3VycmVudCBzbGljZSBpZiBpdCBpcworCQkgKiBpZGxlIGFuZCBoYXMgZXhwaXJlZCBpdCdzIG1lYW4gdGhpbmt0aW1lIG9yIHRoaXMgbmV3IHF1ZXVlCisJCSAqIGhhcyBzb21lIG9sZCBzbGljZSB0aW1lIGxlZnQgYW5kIGlzIG9mIGhpZ2hlciBwcmlvcml0eQorCQkgKi8KKwkJY2ZxX3ByZWVtcHRfcXVldWUoY2ZxZCwgY2ZxcSk7CisJCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKKwkJY2ZxX3N0YXJ0X3F1ZXVlaW5nKGNmcWQsIGNmcXEpOworCX0KK30KKworc3RhdGljIHZvaWQgY2ZxX2VucXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IGNmcV9ycSAqY3JxID0gUlFfREFUQShycSk7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNycS0+Y2ZxX3F1ZXVlOworCisJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEpOwogCiAJY2ZxX2FkZF9jcnFfcmIoY3JxKTsKLQljcnEtPnF1ZXVlX3N0YXJ0ID0gamlmZmllczsKIAotCWxpc3RfYWRkX3RhaWwoJmNycS0+cmVxdWVzdC0+cXVldWVsaXN0LCAmY3JxLT5jZnFfcXVldWUtPmZpZm9bY3JxLT5pc19zeW5jXSk7CisJbGlzdF9hZGRfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgJmNmcXEtPmZpZm8pOworCisJaWYgKHJxX21lcmdlYWJsZShycSkpIHsKKwkJY2ZxX2FkZF9jcnFfaGFzaChjZnFkLCBjcnEpOworCisJCWlmICghY2ZxZC0+cXVldWUtPmxhc3RfbWVyZ2UpCisJCQljZnFkLT5xdWV1ZS0+bGFzdF9tZXJnZSA9IHJxOworCX0KKworCWNmcV9jcnFfZW5xdWV1ZWQoY2ZxZCwgY2ZxcSwgY3JxKTsKIH0KIAogc3RhdGljIHZvaWQKIGNmcV9pbnNlcnRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHdoZXJlKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwotCXN0cnVjdCBjZnFfcnEgKmNycSA9IFJRX0RBVEEocnEpOwogCiAJc3dpdGNoICh3aGVyZSkgewogCQljYXNlIEVMRVZBVE9SX0lOU0VSVF9CQUNLOgotCQkJd2hpbGUgKGNmcV9kaXNwYXRjaF9yZXF1ZXN0cyhxLCBjZnFkLT5jZnFfcXVhbnR1bSkpCisJCQl3aGlsZSAoY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHEsIElOVF9NQVgsIDEpKQogCQkJCTsKIAkJCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZxLT5xdWV1ZV9oZWFkKTsKKwkJCS8qCisJCQkgKiBJZiB3ZSB3ZXJlIGlkbGluZyB3aXRoIHBlbmRpbmcgcmVxdWVzdHMgb24KKwkJCSAqIGluYWN0aXZlIGNmcXFzLCBmb3JjZSBkaXNwYXRjaGluZyB3aWxsCisJCQkgKiByZW1vdmUgdGhlIGlkbGUgdGltZXIgYW5kIHRoZSBxdWV1ZSB3b24ndAorCQkJICogYmUga2lja2VkIGJ5IF9fbWFrZV9yZXF1ZXN0KCkgYWZ0ZXJ3YXJkLgorCQkJICogS2ljayBpdCBoZXJlLgorCQkJICovCisJCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiAJCQlicmVhazsKIAkJY2FzZSBFTEVWQVRPUl9JTlNFUlRfRlJPTlQ6CiAJCQlsaXN0X2FkZCgmcnEtPnF1ZXVlbGlzdCwgJnEtPnF1ZXVlX2hlYWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgRUxFVkFUT1JfSU5TRVJUX1NPUlQ6CiAJCQlCVUdfT04oIWJsa19mc19yZXF1ZXN0KHJxKSk7Ci0JCQljZnFfZW5xdWV1ZShjZnFkLCBjcnEpOworCQkJY2ZxX2VucXVldWUoY2ZxZCwgcnEpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoIiVzOiBiYWQgaW5zZXJ0IHBvaW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sd2hlcmUpOwogCQkJcmV0dXJuOwogCX0KLQotCWlmIChycV9tZXJnZWFibGUocnEpKSB7Ci0JCWNmcV9hZGRfY3JxX2hhc2goY2ZxZCwgY3JxKTsKLQotCQlpZiAoIXEtPmxhc3RfbWVyZ2UpCi0JCQlxLT5sYXN0X21lcmdlID0gcnE7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNmcV9xdWV1ZV9lbXB0eShyZXF1ZXN0X3F1ZXVlX3QgKnEpCi17Ci0Jc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7Ci0KLQlyZXR1cm4gbGlzdF9lbXB0eSgmcS0+cXVldWVfaGVhZCkgJiYgbGlzdF9lbXB0eSgmY2ZxZC0+cnJfbGlzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9jb21wbGV0ZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTEzMDAsOSArMTg2NywxMSBAQAogCiAJY2ZxcSA9IGNycS0+Y2ZxX3F1ZXVlOwogCi0JaWYgKGNycS0+aW5fZmxpZ2h0KSB7Ci0JCVdBUk5fT04oIWNmcXEtPmluX2ZsaWdodCk7Ci0JCWNmcXEtPmluX2ZsaWdodC0tOworCWlmIChjZnFfY3JxX2luX2ZsaWdodChjcnEpKSB7CisJCWNvbnN0IGludCBzeW5jID0gY2ZxX2NycV9pc19zeW5jKGNycSk7CisKKwkJV0FSTl9PTighY2ZxcS0+b25fZGlzcGF0Y2hbc3luY10pOworCQljZnFxLT5vbl9kaXNwYXRjaFtzeW5jXS0tOwogCX0KIAogCWNmcV9hY2NvdW50X2NvbXBsZXRpb24oY2ZxcSwgY3JxKTsKQEAgLTEzMzIsNTEgKzE5MDEsMTM2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKKy8qCisgKiB3ZSB0ZW1wb3JhcmlseSBib29zdCBsb3dlciBwcmlvcml0eSBxdWV1ZXMgaWYgdGhleSBhcmUgaG9sZGluZyBmcyBleGNsdXNpdmUKKyAqIHJlc291cmNlcy4gdGhleSBhcmUgYm9vc3RlZCB0byBub3JtYWwgcHJpbyAoQ0xBU1NfQkUvNCkKKyAqLworc3RhdGljIHZvaWQgY2ZxX3ByaW9fYm9vc3Qoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKLQlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwotCWludCByZXQgPSBFTFZfTVFVRVVFX01BWTsKKwljb25zdCBpbnQgaW9wcmlvX2NsYXNzID0gY2ZxcS0+aW9wcmlvX2NsYXNzOworCWNvbnN0IGludCBpb3ByaW8gPSBjZnFxLT5pb3ByaW87CiAKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKLQkJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOwotCi0JY2ZxcSA9IGNmcV9maW5kX2NmcV9oYXNoKGNmcWQsIGNmcV9oYXNoX2tleShjZnFkLCBjdXJyZW50KSk7Ci0JaWYgKGNmcXEpIHsKLQkJaW50IGxpbWl0ID0gY2ZxZC0+bWF4X3F1ZXVlZDsKLQotCQlpZiAoY2ZxcS0+YWxsb2NhdGVkW3J3XSA8IGNmcWQtPmNmcV9xdWV1ZWQpCi0JCQlyZXR1cm4gRUxWX01RVUVVRV9NVVNUOwotCi0JCWlmIChjZnFkLT5idXN5X3F1ZXVlcykKLQkJCWxpbWl0ID0gcS0+bnJfcmVxdWVzdHMgLyBjZnFkLT5idXN5X3F1ZXVlczsKLQotCQlpZiAobGltaXQgPCBjZnFkLT5jZnFfcXVldWVkKQotCQkJbGltaXQgPSBjZnFkLT5jZnFfcXVldWVkOwotCQllbHNlIGlmIChsaW1pdCA+IGNmcWQtPm1heF9xdWV1ZWQpCi0JCQlsaW1pdCA9IGNmcWQtPm1heF9xdWV1ZWQ7Ci0KLQkJaWYgKGNmcXEtPmFsbG9jYXRlZFtyd10gPj0gbGltaXQpIHsKLQkJCWlmIChsaW1pdCA+IGNmcXEtPmFsbG9jX2xpbWl0W3J3XSkKLQkJCQljZnFxLT5hbGxvY19saW1pdFtyd10gPSBsaW1pdDsKLQotCQkJcmV0ID0gRUxWX01RVUVVRV9OTzsKLQkJfQorCWlmIChoYXNfZnNfZXhjbCgpKSB7CisJCS8qCisJCSAqIGJvb3N0IGlkbGUgcHJpbyBvbiB0cmFuc2FjdGlvbnMgdGhhdCB3b3VsZCBsb2NrIG91dCBvdGhlcgorCQkgKiB1c2VycyBvZiB0aGUgZmlsZXN5c3RlbQorCQkgKi8KKwkJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX0JFOworCQlpZiAoY2ZxcS0+aW9wcmlvID4gSU9QUklPX05PUk0pCisJCQljZnFxLT5pb3ByaW8gPSBJT1BSSU9fTk9STTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHVuYm9vc3QgdGhlIHF1ZXVlCisJCSAqLworCQlpZiAoY2ZxcS0+aW9wcmlvX2NsYXNzICE9IGNmcXEtPm9yZ19pb3ByaW9fY2xhc3MpCisJCQljZnFxLT5pb3ByaW9fY2xhc3MgPSBjZnFxLT5vcmdfaW9wcmlvX2NsYXNzOworCQlpZiAoY2ZxcS0+aW9wcmlvICE9IGNmcXEtPm9yZ19pb3ByaW8pCisJCQljZnFxLT5pb3ByaW8gPSBjZnFxLT5vcmdfaW9wcmlvOwogCX0KIAotCXJldHVybiByZXQ7CisJLyoKKwkgKiByZWZpbGUgYmV0d2VlbiByb3VuZC1yb2JpbiBsaXN0cyBpZiB3ZSBtb3ZlZCB0aGUgcHJpb3JpdHkgY2xhc3MKKwkgKi8KKwlpZiAoKGlvcHJpb19jbGFzcyAhPSBjZnFxLT5pb3ByaW9fY2xhc3MgfHwgaW9wcmlvICE9IGNmcXEtPmlvcHJpbykgJiYKKwkgICAgY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCisJCWNmcV9yZXNvcnRfcnJfbGlzdChjZnFxLCAwKTsKK30KKworc3RhdGljIGlubGluZSBwaWRfdCBjZnFfcXVldWVfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJ3KQoreworCWlmIChydyA9PSBSRUFEIHx8IHByb2Nlc3Nfc3luYyh0YXNrKSkKKwkJcmV0dXJuIHRhc2stPnBpZDsKKworCXJldHVybiBDRlFfS0VZX0FTWU5DOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19jZnFfbWF5X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcncpCit7CisjaWYgMQorCWlmICgoY2ZxX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpIHx8IGNmcV9jZnFxX211c3RfYWxsb2MoY2ZxcSkpICYmCisJICAgICFjZnFfY2ZxcV9tdXN0X2FsbG9jX3NsaWNlKGNmcXEpKSB7CisJCWNmcV9tYXJrX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKTsKKwkJcmV0dXJuIEVMVl9NUVVFVUVfTVVTVDsKKwl9CisKKwlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CisjZWxzZQorCWlmICghY2ZxcSB8fCB0YXNrLT5mbGFncyAmIFBGX01FTUFMTE9DKQorCQlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CisJaWYgKCFjZnFxLT5hbGxvY2F0ZWRbcnddIHx8IGNmcV9jZnFxX211c3RfYWxsb2MoY2ZxcSkpIHsKKwkJaWYgKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSkKKwkJCXJldHVybiBFTFZfTVFVRVVFX01VU1Q7CisKKwkJLyoKKwkJICogb25seSBhbGxvdyAxIEVMVl9NUVVFVUVfTVVTVCBwZXIgc2xpY2UsIG90aGVyd2lzZSB3ZQorCQkgKiBjYW4gcXVpY2tseSBmbG9vZCB0aGUgcXVldWUgd2l0aCB3cml0ZXMgZnJvbSBhIHNpbmdsZSB0YXNrCisJCSAqLworCQlpZiAocncgPT0gUkVBRCB8fCAhY2ZxX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKSkgeworCQkJY2ZxX21hcmtfY2ZxcV9tdXN0X2FsbG9jX3NsaWNlKGNmcXEpOworCQkJcmV0dXJuIEVMVl9NUVVFVUVfTVVTVDsKKwkJfQorCisJCXJldHVybiBFTFZfTVFVRVVFX01BWTsKKwl9CisJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQlyZXR1cm4gRUxWX01RVUVVRV9OTzsKKwlpZiAoY2ZxcS0+YWxsb2NhdGVkW3J3XSA+PSBjZnFkLT5tYXhfcXVldWVkKSB7CisJCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBnZXRfaW9fY29udGV4dChHRlBfQVRPTUlDKTsKKwkJaW50IHJldCA9IEVMVl9NUVVFVUVfTk87CisKKwkJaWYgKGlvYyAmJiBpb2MtPm5yX2JhdGNoX3JlcXVlc3RzKQorCQkJcmV0ID0gRUxWX01RVUVVRV9NQVk7CisKKwkJcHV0X2lvX2NvbnRleHQoaW9jKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBjZnFfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CisKKwkvKgorCSAqIGRvbid0IGZvcmNlIHNldHVwIG9mIGEgcXVldWUgZnJvbSBoZXJlLCBhcyBhIGNhbGwgdG8gbWF5X3F1ZXVlCisJICogZG9lcyBub3QgbmVjZXNzYXJpbHkgaW1wbHkgdGhhdCBhIHJlcXVlc3QgYWN0dWFsbHkgd2lsbCBiZSBxdWV1ZWQuCisJICogc28ganVzdCBsb29rdXAgYSBwb3NzaWJseSBleGlzdGluZyBxdWV1ZSwgb3IgcmV0dXJuICdtYXkgcXVldWUnCisJICogaWYgdGhhdCBmYWlscworCSAqLworCWNmcXEgPSBjZnFfZmluZF9jZnFfaGFzaChjZnFkLCBjZnFfcXVldWVfcGlkKHRzaywgcncpLCB0c2stPmlvcHJpbyk7CisJaWYgKGNmcXEpIHsKKwkJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEpOworCQljZnFfcHJpb19ib29zdChjZnFxKTsKKworCQlyZXR1cm4gX19jZnFfbWF5X3F1ZXVlKGNmcWQsIGNmcXEsIHRzaywgcncpOworCX0KKworCXJldHVybiBFTFZfTVFVRVVFX01BWTsKIH0KIAogc3RhdGljIHZvaWQgY2ZxX2NoZWNrX3dhaXRlcnMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogeworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwotCWNvbnN0IGludCB3cml0ZSA9IHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1dSSVRFXSk7Ci0JY29uc3QgaW50IHJlYWQgPSB3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtSRUFEXSk7CiAKLQlpZiAocmVhZCAmJiBjZnFxLT5hbGxvY2F0ZWRbUkVBRF0gPCBjZnFxLT5hbGxvY19saW1pdFtSRUFEXSkKLQkJd2FrZV91cCgmcmwtPndhaXRbUkVBRF0pOwotCWlmICh3cml0ZSAmJiBjZnFxLT5hbGxvY2F0ZWRbV1JJVEVdIDwgY2ZxcS0+YWxsb2NfbGltaXRbV1JJVEVdKQotCQl3YWtlX3VwKCZybC0+d2FpdFtXUklURV0pOworCWlmIChjZnFxLT5hbGxvY2F0ZWRbUkVBRF0gPD0gY2ZxZC0+bWF4X3F1ZXVlZCB8fCBjZnFkLT5ycV9zdGFydmVkKSB7CisJCXNtcF9tYigpOworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcmwtPndhaXRbUkVBRF0pKQorCQkJd2FrZV91cCgmcmwtPndhaXRbUkVBRF0pOworCX0KKworCWlmIChjZnFxLT5hbGxvY2F0ZWRbV1JJVEVdIDw9IGNmcWQtPm1heF9xdWV1ZWQgfHwgY2ZxZC0+cnFfc3RhcnZlZCkgeworCQlzbXBfbWIoKTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1dSSVRFXSkpCisJCQl3YWtlX3VwKCZybC0+d2FpdFtXUklURV0pOworCX0KIH0KIAogLyoKQEAgLTEzODksNjkgKzIwNDMsNjEgQEAKIAogCWlmIChjcnEpIHsKIAkJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNycS0+Y2ZxX3F1ZXVlOworCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihycSk7CiAKLQkJQlVHX09OKHEtPmxhc3RfbWVyZ2UgPT0gcnEpOwotCQlCVUdfT04oIWhsaXN0X3VuaGFzaGVkKCZjcnEtPmhhc2gpKTsKKwkJQlVHX09OKCFjZnFxLT5hbGxvY2F0ZWRbcnddKTsKKwkJY2ZxcS0+YWxsb2NhdGVkW3J3XS0tOwogCi0JCWlmIChjcnEtPmlvX2NvbnRleHQpCi0JCQlwdXRfaW9fY29udGV4dChjcnEtPmlvX2NvbnRleHQtPmlvYyk7Ci0KLQkJQlVHX09OKCFjZnFxLT5hbGxvY2F0ZWRbY3JxLT5pc193cml0ZV0pOwotCQljZnFxLT5hbGxvY2F0ZWRbY3JxLT5pc193cml0ZV0tLTsKKwkJcHV0X2lvX2NvbnRleHQoY3JxLT5pb19jb250ZXh0LT5pb2MpOwogCiAJCW1lbXBvb2xfZnJlZShjcnEsIGNmcWQtPmNycV9wb29sKTsKIAkJcnEtPmVsZXZhdG9yX3ByaXZhdGUgPSBOVUxMOwogCi0JCXNtcF9tYigpOwogCQljZnFfY2hlY2tfd2FpdGVycyhxLCBjZnFxKTsKIAkJY2ZxX3B1dF9xdWV1ZShjZnFxKTsKIAl9CiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBjZnEgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuIEEgcXVldWUgYW5kCisgKiBBbGxvY2F0ZSBjZnEgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCiAgKi8KLXN0YXRpYyBpbnQgY2ZxX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZ2ZwX21hc2spCitzdGF0aWMgaW50CitjZnFfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJaW50IGdmcF9tYXNrKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihycSk7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgKnNhdmVkX2NmcXE7CisJcGlkX3Qga2V5ID0gY2ZxX3F1ZXVlX3BpZCh0c2ssIHJ3KTsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwogCXN0cnVjdCBjZnFfcnEgKmNycTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbWlnaHRfc2xlZXBfaWYoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKTsKIAorCWNpYyA9IGNmcV9nZXRfaW9fY29udGV4dChjZnFkLCBrZXksIGdmcF9tYXNrKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCWNmcXEgPSBfX2NmcV9nZXRfcXVldWUoY2ZxZCwgY2ZxX2hhc2hfa2V5KGNmcWQsIGN1cnJlbnQpLCBnZnBfbWFzayk7Ci0JaWYgKCFjZnFxKQotCQlnb3RvIG91dF9sb2NrOworCWlmICghY2ljKQorCQlnb3RvIHF1ZXVlX2ZhaWw7CiAKLXJlcGVhdDoKLQlpZiAoY2ZxcS0+YWxsb2NhdGVkW3J3XSA+PSBjZnFkLT5tYXhfcXVldWVkKQotCQlnb3RvIG91dF9sb2NrOworCWlmICghY2ljLT5jZnFxKSB7CisJCWNmcXEgPSBjZnFfZ2V0X3F1ZXVlKGNmcWQsIGtleSwgdHNrLT5pb3ByaW8sIGdmcF9tYXNrKTsKKwkJaWYgKCFjZnFxKQorCQkJZ290byBxdWV1ZV9mYWlsOworCisJCWNpYy0+Y2ZxcSA9IGNmcXE7CisJfSBlbHNlCisJCWNmcXEgPSBjaWMtPmNmcXE7CiAKIAljZnFxLT5hbGxvY2F0ZWRbcnddKys7CisJY2ZxX2NsZWFyX2NmcXFfbXVzdF9hbGxvYyhjZnFxKTsKKwljZnFkLT5ycV9zdGFydmVkID0gMDsKKwlhdG9taWNfaW5jKCZjZnFxLT5yZWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCi0JLyoKLQkgKiBpZiBoYXNoaW5nIHR5cGUgaGFzIGNoYW5nZWQsIHRoZSBjZnFfcXVldWUgbWlnaHQgY2hhbmdlIGhlcmUuCi0JICovCi0Jc2F2ZWRfY2ZxcSA9IGNmcXE7Ci0JY2ljID0gY2ZxX2dldF9pb19jb250ZXh0KCZjZnFxLCBnZnBfbWFzayk7Ci0JaWYgKCFjaWMpCi0JCWdvdG8gZXJyOwotCi0JLyoKLQkgKiByZXBlYXQgYWxsb2NhdGlvbiBjaGVja3Mgb24gcXVldWUgY2hhbmdlCi0JICovCi0JaWYgKHVubGlrZWx5KHNhdmVkX2NmcXEgIT0gY2ZxcSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCQlzYXZlZF9jZnFxLT5hbGxvY2F0ZWRbcnddLS07Ci0JCWdvdG8gcmVwZWF0OwotCX0KLQogCWNycSA9IG1lbXBvb2xfYWxsb2MoY2ZxZC0+Y3JxX3Bvb2wsIGdmcF9tYXNrKTsKIAlpZiAoY3JxKSB7CiAJCVJCX0NMRUFSKCZjcnEtPnJiX25vZGUpOwpAQCAtMTQ2MCwyNCArMjEwNiwxNDEgQEAKIAkJSU5JVF9ITElTVF9OT0RFKCZjcnEtPmhhc2gpOwogCQljcnEtPmNmcV9xdWV1ZSA9IGNmcXE7CiAJCWNycS0+aW9fY29udGV4dCA9IGNpYzsKLQkJY3JxLT5zZXJ2aWNlX3N0YXJ0ID0gY3JxLT5xdWV1ZV9zdGFydCA9IDA7Ci0JCWNycS0+aW5fZmxpZ2h0ID0gY3JxLT5hY2NvdW50ZWQgPSBjcnEtPmlzX3N5bmMgPSAwOwotCQljcnEtPmlzX3dyaXRlID0gcnc7CisJCWNmcV9jbGVhcl9jcnFfaW5fZmxpZ2h0KGNycSk7CisJCWNmcV9jbGVhcl9jcnFfaW5fZHJpdmVyKGNycSk7CisJCWNmcV9jbGVhcl9jcnFfcmVxdWV1ZWQoY3JxKTsKKworCQlpZiAocncgPT0gUkVBRCB8fCBwcm9jZXNzX3N5bmModHNrKSkKKwkJCWNmcV9tYXJrX2NycV9pc19zeW5jKGNycSk7CisJCWVsc2UKKwkJCWNmcV9jbGVhcl9jcnFfaXNfc3luYyhjcnEpOworCiAJCXJxLT5lbGV2YXRvcl9wcml2YXRlID0gY3JxOwotCQljZnFxLT5hbGxvY19saW1pdFtyd10gPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwdXRfaW9fY29udGV4dChjaWMtPmlvYyk7Ci1lcnI6CiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCWNmcXEtPmFsbG9jYXRlZFtyd10tLTsKKwlpZiAoIShjZnFxLT5hbGxvY2F0ZWRbMF0gKyBjZnFxLT5hbGxvY2F0ZWRbMV0pKQorCQljZnFfbWFya19jZnFxX211c3RfYWxsb2MoY2ZxcSk7CiAJY2ZxX3B1dF9xdWV1ZShjZnFxKTsKLW91dF9sb2NrOgorcXVldWVfZmFpbDoKKwlpZiAoY2ljKQorCQlwdXRfaW9fY29udGV4dChjaWMtPmlvYyk7CisJLyoKKwkgKiBtYXJrIHVzIHJxIGFsbG9jYXRpb24gc3RhcnZlZC4gd2UgbmVlZCB0byBraWNrc3RhcnQgdGhlIHByb2Nlc3MKKwkgKiBvdXJzZWx2ZXMgaWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVxdWVzdHMgdGhhdCBjYW4gZG8gaXQgZm9yIHVzLgorCSAqIHRoYXQgd291bGQgYmUgYW4gZXh0cmVtZWx5IHJhcmUgT09NIHNpdHVhdGlvbgorCSAqLworCWNmcWQtPnJxX3N0YXJ2ZWQgPSAxOworCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQgY2ZxX2tpY2tfcXVldWUodm9pZCAqZGF0YSkKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkYXRhOworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoY2ZxZC0+cnFfc3RhcnZlZCkgeworCQlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKKworCQkvKgorCQkgKiB3ZSBhcmVuJ3QgZ3VhcmFudGVlZCB0byBnZXQgYSByZXF1ZXN0IGFmdGVyIHRoaXMsIGJ1dCB3ZQorCQkgKiBoYXZlIHRvIGJlIG9wcG9ydHVuaXN0aWMKKwkJICovCisJCXNtcF9tYigpOworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcmwtPndhaXRbUkVBRF0pKQorCQkJd2FrZV91cCgmcmwtPndhaXRbUkVBRF0pOworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcmwtPndhaXRbV1JJVEVdKSkKKwkJCXdha2VfdXAoJnJsLT53YWl0W1dSSVRFXSk7CisJfQorCisJYmxrX3JlbW92ZV9wbHVnKHEpOworCXEtPnJlcXVlc3RfZm4ocSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaW1lciBydW5uaW5nIGlmIHRoZSBhY3RpdmVfcXVldWUgaXMgY3VycmVudGx5IGlkbGluZyBpbnNpZGUgaXRzIHRpbWUgc2xpY2UKKyAqLworc3RhdGljIHZvaWQgY2ZxX2lkbGVfc2xpY2VfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IChzdHJ1Y3QgY2ZxX2RhdGEgKikgZGF0YTsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKChjZnFxID0gY2ZxZC0+YWN0aXZlX3F1ZXVlKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCQkvKgorCQkgKiBleHBpcmVkCisJCSAqLworCQlpZiAodGltZV9hZnRlcihub3csIGNmcXEtPnNsaWNlX2VuZCkpCisJCQlnb3RvIGV4cGlyZTsKKworCQkvKgorCQkgKiBvbmx5IGV4cGlyZSBhbmQgcmVpbnZva2UgcmVxdWVzdCBoYW5kbGVyLCBpZiB0aGVyZSBhcmUKKwkJICogb3RoZXIgcXVldWVzIHdpdGggcGVuZGluZyByZXF1ZXN0cworCQkgKi8KKwkJaWYgKCFjZnFfcGVuZGluZ19yZXF1ZXN0cyhjZnFkKSkgeworCQkJY2ZxZC0+aWRsZV9zbGljZV90aW1lci5leHBpcmVzID0gbWluKG5vdyArIGNmcWQtPmNmcV9zbGljZV9pZGxlLCBjZnFxLT5zbGljZV9lbmQpOworCQkJYWRkX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKKwkJCWdvdG8gb3V0X2NvbnQ7CisJCX0KKworCQkvKgorCQkgKiBub3QgZXhwaXJlZCBhbmQgaXQgaGFzIGEgcmVxdWVzdCBwZW5kaW5nLCBsZXQgaXQgZGlzcGF0Y2gKKwkJICovCisJCWlmICghUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpIHsKKwkJCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKKwkJCWdvdG8gb3V0X2tpY2s7CisJCX0KKwl9CitleHBpcmU6CisJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCk7CitvdXRfa2ljazoKKwljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CitvdXRfY29udDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaW1lciBydW5uaW5nIGlmIGFuIGlkbGUgY2xhc3MgcXVldWUgaXMgd2FpdGluZyBmb3Igc2VydmljZQorICovCitzdGF0aWMgdm9pZCBjZnFfaWRsZV9jbGFzc190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gKHN0cnVjdCBjZnFfZGF0YSAqKSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGVuZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHJhY2Ugd2l0aCBhIG5vbi1pZGxlIHF1ZXVlLCByZXNldCB0aW1lcgorCSAqLworCWVuZCA9IGNmcWQtPmxhc3RfZW5kX3JlcXVlc3QgKyBDRlFfSURMRV9HUkFDRTsKKwlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSkgeworCQljZnFkLT5pZGxlX2NsYXNzX3RpbWVyLmV4cGlyZXMgPSBlbmQ7CisJCWFkZF90aW1lcigmY2ZxZC0+aWRsZV9jbGFzc190aW1lcik7CisJfSBlbHNlCisJCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2ZxX3NodXRkb3duX3RpbWVyX3dxKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKK3sKKwlkZWxfdGltZXJfc3luYygmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNmcWQtPmlkbGVfY2xhc3NfdGltZXIpOworCWJsa19zeW5jX3F1ZXVlKGNmcWQtPnF1ZXVlKTsKK30KKwogc3RhdGljIHZvaWQgY2ZxX3B1dF9jZnFkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKIAlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjZnFkLT5xdWV1ZTsKQEAgLTE0ODcsNiArMjI1MCw5IEBACiAKIAlibGtfcHV0X3F1ZXVlKHEpOwogCisJY2ZxX3NodXRkb3duX3RpbWVyX3dxKGNmcWQpOworCXEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhID0gTlVMTDsKKwogCW1lbXBvb2xfZGVzdHJveShjZnFkLT5jcnFfcG9vbCk7CiAJa2ZyZWUoY2ZxZC0+Y3JxX2hhc2gpOwogCWtmcmVlKGNmcWQtPmNmcV9oYXNoKTsKQEAgLTE0OTUsNyArMjI2MSwxMCBAQAogCiBzdGF0aWMgdm9pZCBjZnFfZXhpdF9xdWV1ZShlbGV2YXRvcl90ICplKQogewotCWNmcV9wdXRfY2ZxZChlLT5lbGV2YXRvcl9kYXRhKTsKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBlLT5lbGV2YXRvcl9kYXRhOworCisJY2ZxX3NodXRkb3duX3RpbWVyX3dxKGNmcWQpOworCWNmcV9wdXRfY2ZxZChjZnFkKTsKIH0KIAogc3RhdGljIGludCBjZnFfaW5pdF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGVsZXZhdG9yX3QgKmUpCkBAIC0xNTA4LDcgKzIyNzcsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltZW1zZXQoY2ZxZCwgMCwgc2l6ZW9mKCpjZnFkKSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNmcWQtPnJyX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IENGUV9QUklPX0xJU1RTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5ycl9saXN0W2ldKTsKKworCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5idXN5X3JyKTsKKwlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+Y3VyX3JyKTsKKwlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+aWRsZV9ycik7CiAJSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmVtcHR5X2xpc3QpOwogCiAJY2ZxZC0+Y3JxX2hhc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgKiBDRlFfTUhBU0hfRU5UUklFUywgR0ZQX0tFUk5FTCk7CkBAIC0xNTMzLDI0ICsyMzA4LDMyIEBACiAJY2ZxZC0+cXVldWUgPSBxOwogCWF0b21pY19pbmMoJnEtPnJlZmNudCk7CiAKLQkvKgotCSAqIGp1c3Qgc2V0IGl0IHRvIHNvbWUgaGlnaCB2YWx1ZSwgd2Ugd2FudCBhbnlvbmUgdG8gYmUgYWJsZSB0byBxdWV1ZQotCSAqIHNvbWUgcmVxdWVzdHMuIGZhaXJuZXNzIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKLQkgKi8KLQlxLT5ucl9yZXF1ZXN0cyA9IDEwMjQ7Ci0JY2ZxZC0+bWF4X3F1ZXVlZCA9IHEtPm5yX3JlcXVlc3RzIC8gMTY7CisJY2ZxZC0+bWF4X3F1ZXVlZCA9IHEtPm5yX3JlcXVlc3RzIC8gNDsKIAlxLT5ucl9iYXRjaGluZyA9IGNmcV9xdWV1ZWQ7Ci0JY2ZxZC0+a2V5X3R5cGUgPSBDRlFfS0VZX1RHSUQ7Ci0JY2ZxZC0+ZmluZF9iZXN0X2NycSA9IDE7CisKKwlpbml0X3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKKwljZnFkLT5pZGxlX3NsaWNlX3RpbWVyLmZ1bmN0aW9uID0gY2ZxX2lkbGVfc2xpY2VfdGltZXI7CisJY2ZxZC0+aWRsZV9zbGljZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNmcWQ7CisKKwlpbml0X3RpbWVyKCZjZnFkLT5pZGxlX2NsYXNzX3RpbWVyKTsKKwljZnFkLT5pZGxlX2NsYXNzX3RpbWVyLmZ1bmN0aW9uID0gY2ZxX2lkbGVfY2xhc3NfdGltZXI7CisJY2ZxZC0+aWRsZV9jbGFzc190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNmcWQ7CisKKwlJTklUX1dPUksoJmNmcWQtPnVucGx1Z193b3JrLCBjZnFfa2lja19xdWV1ZSwgcSk7CisKIAlhdG9taWNfc2V0KCZjZnFkLT5yZWYsIDEpOwogCiAJY2ZxZC0+Y2ZxX3F1ZXVlZCA9IGNmcV9xdWV1ZWQ7CiAJY2ZxZC0+Y2ZxX3F1YW50dW0gPSBjZnFfcXVhbnR1bTsKLQljZnFkLT5jZnFfZmlmb19leHBpcmVfciA9IGNmcV9maWZvX2V4cGlyZV9yOwotCWNmcWQtPmNmcV9maWZvX2V4cGlyZV93ID0gY2ZxX2ZpZm9fZXhwaXJlX3c7Ci0JY2ZxZC0+Y2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlID0gY2ZxX2ZpZm9fcmF0ZTsKKwljZnFkLT5jZnFfZmlmb19leHBpcmVbMF0gPSBjZnFfZmlmb19leHBpcmVbMF07CisJY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzFdID0gY2ZxX2ZpZm9fZXhwaXJlWzFdOwogCWNmcWQtPmNmcV9iYWNrX21heCA9IGNmcV9iYWNrX21heDsKIAljZnFkLT5jZnFfYmFja19wZW5hbHR5ID0gY2ZxX2JhY2tfcGVuYWx0eTsKKwljZnFkLT5jZnFfc2xpY2VbMF0gPSBjZnFfc2xpY2VfYXN5bmM7CisJY2ZxZC0+Y2ZxX3NsaWNlWzFdID0gY2ZxX3NsaWNlX3N5bmM7CisJY2ZxZC0+Y2ZxX3NsaWNlX2FzeW5jX3JxID0gY2ZxX3NsaWNlX2FzeW5jX3JxOworCWNmcWQtPmNmcV9zbGljZV9pZGxlID0gY2ZxX3NsaWNlX2lkbGU7CisJY2ZxZC0+Y2ZxX21heF9kZXB0aCA9IGNmcV9tYXhfZGVwdGg7CiAKIAlyZXR1cm4gMDsKIG91dF9jcnFwb29sOgpAQCAtMTU5NSw3ICsyMzc4LDYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotCiAvKgogICogc3lzZnMgcGFydHMgYmVsb3cgLS0+CiAgKi8KQEAgLTE2MjAsNDUgKzI0MDIsNiBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QKLWNmcV9jbGVhcl9lbGFwc2VkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQotewotCW1heF9lbGFwc2VkX2Rpc3BhdGNoID0gbWF4X2VsYXBzZWRfY3JxID0gMDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jZnFfc2V0X2tleV90eXBlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQotewotCXNwaW5fbG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOwotCWlmICghc3RybmNtcChwYWdlLCAicGdpZCIsIDQpKQotCQljZnFkLT5rZXlfdHlwZSA9IENGUV9LRVlfUEdJRDsKLQllbHNlIGlmICghc3RybmNtcChwYWdlLCAidGdpZCIsIDQpKQotCQljZnFkLT5rZXlfdHlwZSA9IENGUV9LRVlfVEdJRDsKLQllbHNlIGlmICghc3RybmNtcChwYWdlLCAidWlkIiwgMykpCi0JCWNmcWQtPmtleV90eXBlID0gQ0ZRX0tFWV9VSUQ7Ci0JZWxzZSBpZiAoIXN0cm5jbXAocGFnZSwgImdpZCIsIDMpKQotCQljZnFkLT5rZXlfdHlwZSA9IENGUV9LRVlfR0lEOwotCXNwaW5fdW5sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdAotY2ZxX3JlYWRfa2V5X3R5cGUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBjaGFyICpwYWdlKQotewotCXNzaXplX3QgbGVuID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IENGUV9LRVlfUEdJRDsgaSA8IENGUV9LRVlfTEFTVDsgaSsrKSB7Ci0JCWlmIChjZnFkLT5rZXlfdHlwZSA9PSBpKQotCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJbJXNdICIsIGNmcV9rZXlfdHlwZXNbaV0pOwotCQllbHNlCi0JCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVzICIsIGNmcV9rZXlfdHlwZXNbaV0pOwotCX0KLQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlxuIik7Ci0JcmV0dXJuIGxlbjsKLX0KLQogI2RlZmluZSBTSE9XX0ZVTkNUSU9OKF9fRlVOQywgX19WQVIsIF9fQ09OVikJCQkJXAogc3RhdGljIHNzaXplX3QgX19GVU5DKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgY2hhciAqcGFnZSkJCVwKIHsJCQkJCQkJCQlcCkBAIC0xNjY5LDEyICsyNDEyLDE1IEBACiB9CiBTSE9XX0ZVTkNUSU9OKGNmcV9xdWFudHVtX3Nob3csIGNmcWQtPmNmcV9xdWFudHVtLCAwKTsKIFNIT1dfRlVOQ1RJT04oY2ZxX3F1ZXVlZF9zaG93LCBjZnFkLT5jZnFfcXVldWVkLCAwKTsKLVNIT1dfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX3Jfc2hvdywgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlX3IsIDEpOwotU0hPV19GVU5DVElPTihjZnFfZmlmb19leHBpcmVfd19zaG93LCBjZnFkLT5jZnFfZmlmb19leHBpcmVfdywgMSk7Ci1TSE9XX0ZVTkNUSU9OKGNmcV9maWZvX2JhdGNoX2V4cGlyZV9zaG93LCBjZnFkLT5jZnFfZmlmb19iYXRjaF9leHBpcmUsIDEpOwotU0hPV19GVU5DVElPTihjZnFfZmluZF9iZXN0X3Nob3csIGNmcWQtPmZpbmRfYmVzdF9jcnEsIDApOworU0hPV19GVU5DVElPTihjZnFfZmlmb19leHBpcmVfc3luY19zaG93LCBjZnFkLT5jZnFfZmlmb19leHBpcmVbMV0sIDEpOworU0hPV19GVU5DVElPTihjZnFfZmlmb19leHBpcmVfYXN5bmNfc2hvdywgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzBdLCAxKTsKIFNIT1dfRlVOQ1RJT04oY2ZxX2JhY2tfbWF4X3Nob3csIGNmcWQtPmNmcV9iYWNrX21heCwgMCk7CiBTSE9XX0ZVTkNUSU9OKGNmcV9iYWNrX3BlbmFsdHlfc2hvdywgY2ZxZC0+Y2ZxX2JhY2tfcGVuYWx0eSwgMCk7CitTSE9XX0ZVTkNUSU9OKGNmcV9zbGljZV9pZGxlX3Nob3csIGNmcWQtPmNmcV9zbGljZV9pZGxlLCAxKTsKK1NIT1dfRlVOQ1RJT04oY2ZxX3NsaWNlX3N5bmNfc2hvdywgY2ZxZC0+Y2ZxX3NsaWNlWzFdLCAxKTsKK1NIT1dfRlVOQ1RJT04oY2ZxX3NsaWNlX2FzeW5jX3Nob3csIGNmcWQtPmNmcV9zbGljZVswXSwgMSk7CitTSE9XX0ZVTkNUSU9OKGNmcV9zbGljZV9hc3luY19ycV9zaG93LCBjZnFkLT5jZnFfc2xpY2VfYXN5bmNfcnEsIDApOworU0hPV19GVU5DVElPTihjZnFfbWF4X2RlcHRoX3Nob3csIGNmcWQtPmNmcV9tYXhfZGVwdGgsIDApOwogI3VuZGVmIFNIT1dfRlVOQ1RJT04KIAogI2RlZmluZSBTVE9SRV9GVU5DVElPTihfX0ZVTkMsIF9fUFRSLCBNSU4sIE1BWCwgX19DT05WKQkJCVwKQEAgLTE2OTQsMTIgKzI0NDAsMTUgQEAKIH0KIFNUT1JFX0ZVTkNUSU9OKGNmcV9xdWFudHVtX3N0b3JlLCAmY2ZxZC0+Y2ZxX3F1YW50dW0sIDEsIFVJTlRfTUFYLCAwKTsKIFNUT1JFX0ZVTkNUSU9OKGNmcV9xdWV1ZWRfc3RvcmUsICZjZnFkLT5jZnFfcXVldWVkLCAxLCBVSU5UX01BWCwgMCk7Ci1TVE9SRV9GVU5DVElPTihjZnFfZmlmb19leHBpcmVfcl9zdG9yZSwgJmNmcWQtPmNmcV9maWZvX2V4cGlyZV9yLCAxLCBVSU5UX01BWCwgMSk7Ci1TVE9SRV9GVU5DVElPTihjZnFfZmlmb19leHBpcmVfd19zdG9yZSwgJmNmcWQtPmNmcV9maWZvX2V4cGlyZV93LCAxLCBVSU5UX01BWCwgMSk7Ci1TVE9SRV9GVU5DVElPTihjZnFfZmlmb19iYXRjaF9leHBpcmVfc3RvcmUsICZjZnFkLT5jZnFfZmlmb19iYXRjaF9leHBpcmUsIDAsIFVJTlRfTUFYLCAxKTsKLVNUT1JFX0ZVTkNUSU9OKGNmcV9maW5kX2Jlc3Rfc3RvcmUsICZjZnFkLT5maW5kX2Jlc3RfY3JxLCAwLCAxLCAwKTsKK1NUT1JFX0ZVTkNUSU9OKGNmcV9maWZvX2V4cGlyZV9zeW5jX3N0b3JlLCAmY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzFdLCAxLCBVSU5UX01BWCwgMSk7CitTVE9SRV9GVU5DVElPTihjZnFfZmlmb19leHBpcmVfYXN5bmNfc3RvcmUsICZjZnFkLT5jZnFfZmlmb19leHBpcmVbMF0sIDEsIFVJTlRfTUFYLCAxKTsKIFNUT1JFX0ZVTkNUSU9OKGNmcV9iYWNrX21heF9zdG9yZSwgJmNmcWQtPmNmcV9iYWNrX21heCwgMCwgVUlOVF9NQVgsIDApOwogU1RPUkVfRlVOQ1RJT04oY2ZxX2JhY2tfcGVuYWx0eV9zdG9yZSwgJmNmcWQtPmNmcV9iYWNrX3BlbmFsdHksIDEsIFVJTlRfTUFYLCAwKTsKK1NUT1JFX0ZVTkNUSU9OKGNmcV9zbGljZV9pZGxlX3N0b3JlLCAmY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUsIDAsIFVJTlRfTUFYLCAxKTsKK1NUT1JFX0ZVTkNUSU9OKGNmcV9zbGljZV9zeW5jX3N0b3JlLCAmY2ZxZC0+Y2ZxX3NsaWNlWzFdLCAxLCBVSU5UX01BWCwgMSk7CitTVE9SRV9GVU5DVElPTihjZnFfc2xpY2VfYXN5bmNfc3RvcmUsICZjZnFkLT5jZnFfc2xpY2VbMF0sIDEsIFVJTlRfTUFYLCAxKTsKK1NUT1JFX0ZVTkNUSU9OKGNmcV9zbGljZV9hc3luY19ycV9zdG9yZSwgJmNmcWQtPmNmcV9zbGljZV9hc3luY19ycSwgMSwgVUlOVF9NQVgsIDApOworU1RPUkVfRlVOQ1RJT04oY2ZxX21heF9kZXB0aF9zdG9yZSwgJmNmcWQtPmNmcV9tYXhfZGVwdGgsIDEsIFVJTlRfTUFYLCAwKTsKICN1bmRlZiBTVE9SRV9GVU5DVElPTgogCiBzdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfcXVhbnR1bV9lbnRyeSA9IHsKQEAgLTE3MTIsMjUgKzI0NjEsMTUgQEAKIAkuc2hvdyA9IGNmcV9xdWV1ZWRfc2hvdywKIAkuc3RvcmUgPSBjZnFfcXVldWVkX3N0b3JlLAogfTsKLXN0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9maWZvX2V4cGlyZV9yX2VudHJ5ID0geworc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2ZpZm9fZXhwaXJlX3N5bmNfZW50cnkgPSB7CiAJLmF0dHIgPSB7Lm5hbWUgPSAiZmlmb19leHBpcmVfc3luYyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKLQkuc2hvdyA9IGNmcV9maWZvX2V4cGlyZV9yX3Nob3csCi0JLnN0b3JlID0gY2ZxX2ZpZm9fZXhwaXJlX3Jfc3RvcmUsCisJLnNob3cgPSBjZnFfZmlmb19leHBpcmVfc3luY19zaG93LAorCS5zdG9yZSA9IGNmcV9maWZvX2V4cGlyZV9zeW5jX3N0b3JlLAogfTsKLXN0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9maWZvX2V4cGlyZV93X2VudHJ5ID0geworc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX2VudHJ5ID0gewogCS5hdHRyID0gey5uYW1lID0gImZpZm9fZXhwaXJlX2FzeW5jIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAotCS5zaG93ID0gY2ZxX2ZpZm9fZXhwaXJlX3dfc2hvdywKLQkuc3RvcmUgPSBjZnFfZmlmb19leHBpcmVfd19zdG9yZSwKLX07Ci1zdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfZmlmb19iYXRjaF9leHBpcmVfZW50cnkgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAiZmlmb19iYXRjaF9leHBpcmUiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCi0JLnNob3cgPSBjZnFfZmlmb19iYXRjaF9leHBpcmVfc2hvdywKLQkuc3RvcmUgPSBjZnFfZmlmb19iYXRjaF9leHBpcmVfc3RvcmUsCi19Owotc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2ZpbmRfYmVzdF9lbnRyeSA9IHsKLQkuYXR0ciA9IHsubmFtZSA9ICJmaW5kX2Jlc3RfY3JxIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAotCS5zaG93ID0gY2ZxX2ZpbmRfYmVzdF9zaG93LAotCS5zdG9yZSA9IGNmcV9maW5kX2Jlc3Rfc3RvcmUsCisJLnNob3cgPSBjZnFfZmlmb19leHBpcmVfYXN5bmNfc2hvdywKKwkuc3RvcmUgPSBjZnFfZmlmb19leHBpcmVfYXN5bmNfc3RvcmUsCiB9Owogc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2JhY2tfbWF4X2VudHJ5ID0gewogCS5hdHRyID0gey5uYW1lID0gImJhY2tfc2Vla19tYXgiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCkBAIC0xNzQyLDI3ICsyNDgxLDQ0IEBACiAJLnNob3cgPSBjZnFfYmFja19wZW5hbHR5X3Nob3csCiAJLnN0b3JlID0gY2ZxX2JhY2tfcGVuYWx0eV9zdG9yZSwKIH07Ci1zdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfY2xlYXJfZWxhcHNlZF9lbnRyeSA9IHsKLQkuYXR0ciA9IHsubmFtZSA9ICJjbGVhcl9lbGFwc2VkIiwgLm1vZGUgPSBTX0lXVVNSIH0sCi0JLnN0b3JlID0gY2ZxX2NsZWFyX2VsYXBzZWQsCitzdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfc2xpY2Vfc3luY19lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJzbGljZV9zeW5jIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAorCS5zaG93ID0gY2ZxX3NsaWNlX3N5bmNfc2hvdywKKwkuc3RvcmUgPSBjZnFfc2xpY2Vfc3luY19zdG9yZSwKIH07Ci1zdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfa2V5X3R5cGVfZW50cnkgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAia2V5X3R5cGUiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCi0JLnNob3cgPSBjZnFfcmVhZF9rZXlfdHlwZSwKLQkuc3RvcmUgPSBjZnFfc2V0X2tleV90eXBlLAorc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX3NsaWNlX2FzeW5jX2VudHJ5ID0geworCS5hdHRyID0gey5uYW1lID0gInNsaWNlX2FzeW5jIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAorCS5zaG93ID0gY2ZxX3NsaWNlX2FzeW5jX3Nob3csCisJLnN0b3JlID0gY2ZxX3NsaWNlX2FzeW5jX3N0b3JlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9zbGljZV9hc3luY19ycV9lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJzbGljZV9hc3luY19ycSIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdyA9IGNmcV9zbGljZV9hc3luY19ycV9zaG93LAorCS5zdG9yZSA9IGNmcV9zbGljZV9hc3luY19ycV9zdG9yZSwKK307CitzdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfc2xpY2VfaWRsZV9lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJzbGljZV9pZGxlIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAorCS5zaG93ID0gY2ZxX3NsaWNlX2lkbGVfc2hvdywKKwkuc3RvcmUgPSBjZnFfc2xpY2VfaWRsZV9zdG9yZSwKK307CitzdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfbWF4X2RlcHRoX2VudHJ5ID0geworCS5hdHRyID0gey5uYW1lID0gIm1heF9kZXB0aCIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdyA9IGNmcV9tYXhfZGVwdGhfc2hvdywKKwkuc3RvcmUgPSBjZnFfbWF4X2RlcHRoX3N0b3JlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfYXR0cnNbXSA9IHsKIAkmY2ZxX3F1YW50dW1fZW50cnkuYXR0ciwKIAkmY2ZxX3F1ZXVlZF9lbnRyeS5hdHRyLAotCSZjZnFfZmlmb19leHBpcmVfcl9lbnRyeS5hdHRyLAotCSZjZnFfZmlmb19leHBpcmVfd19lbnRyeS5hdHRyLAotCSZjZnFfZmlmb19iYXRjaF9leHBpcmVfZW50cnkuYXR0ciwKLQkmY2ZxX2tleV90eXBlX2VudHJ5LmF0dHIsCi0JJmNmcV9maW5kX2Jlc3RfZW50cnkuYXR0ciwKKwkmY2ZxX2ZpZm9fZXhwaXJlX3N5bmNfZW50cnkuYXR0ciwKKwkmY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX2VudHJ5LmF0dHIsCiAJJmNmcV9iYWNrX21heF9lbnRyeS5hdHRyLAogCSZjZnFfYmFja19wZW5hbHR5X2VudHJ5LmF0dHIsCi0JJmNmcV9jbGVhcl9lbGFwc2VkX2VudHJ5LmF0dHIsCisJJmNmcV9zbGljZV9zeW5jX2VudHJ5LmF0dHIsCisJJmNmcV9zbGljZV9hc3luY19lbnRyeS5hdHRyLAorCSZjZnFfc2xpY2VfYXN5bmNfcnFfZW50cnkuYXR0ciwKKwkmY2ZxX3NsaWNlX2lkbGVfZW50cnkuYXR0ciwKKwkmY2ZxX21heF9kZXB0aF9lbnRyeS5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0xODMyLDIxICsyNTg4LDQ2IEBACiB7CiAJaW50IHJldDsKIAorCS8qCisJICogY291bGQgYmUgMCBvbiBIWiA8IDEwMDAgc2V0dXBzCisJICovCisJaWYgKCFjZnFfc2xpY2VfYXN5bmMpCisJCWNmcV9zbGljZV9hc3luYyA9IDE7CisJaWYgKCFjZnFfc2xpY2VfaWRsZSkKKwkJY2ZxX3NsaWNlX2lkbGUgPSAxOworCiAJaWYgKGNmcV9zbGFiX3NldHVwKCkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gZWx2X3JlZ2lzdGVyKCZpb3NjaGVkX2NmcSk7Ci0JaWYgKCFyZXQpIHsKLQkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChyZXQpCisJCWNmcV9zbGFiX2tpbGwoKTsKIAotCWNmcV9zbGFiX2tpbGwoKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2ZxX2V4aXQodm9pZCkKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBpdGVyYXRlIGVhY2ggcHJvY2VzcyBpbiB0aGUgc3lzdGVtLCByZW1vdmluZyBvdXIgaW9fY29udGV4dAorCSAqLworCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKKwkJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IHAtPmlvX2NvbnRleHQ7CisKKwkJaWYgKGlvYyAmJiBpb2MtPmNpYykgeworCQkJaW9jLT5jaWMtPmV4aXQoaW9jLT5jaWMpOworCQkJY2ZxX2ZyZWVfaW9fY29udGV4dChpb2MtPmNpYyk7CisJCQlpb2MtPmNpYyA9IE5VTEw7CisJCX0KKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpOworCiAJY2ZxX3NsYWJfa2lsbCgpOwogCWVsdl91bnJlZ2lzdGVyKCZpb3NjaGVkX2NmcSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYyBiL2RyaXZlcnMvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IDRiYzJmZWEuLmZmNTIwMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCkBAIC03NjAsNyArNzYwLDggQEAKIH0KIAogc3RhdGljIGludAotZGVhZGxpbmVfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBnZnBfbWFzaykKK2RlYWRsaW5lX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCSAgICAgaW50IGdmcF9tYXNrKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCBkZWFkbGluZV9ycSAqZHJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9lbGV2YXRvci5jIGIvZHJpdmVycy9ibG9jay9lbGV2YXRvci5jCmluZGV4IGY4MzFmMDguLjk4ZjAxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZWxldmF0b3IuYworKysgYi9kcml2ZXJzL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTQ4NiwxMiArNDg2LDEzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBlbHZfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBnZnBfbWFzaykKK2ludCBlbHZfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJICAgIGludCBnZnBfbWFzaykKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9zZXRfcmVxX2ZuKQotCQlyZXR1cm4gZS0+b3BzLT5lbGV2YXRvcl9zZXRfcmVxX2ZuKHEsIHJxLCBnZnBfbWFzayk7CisJCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX3NldF9yZXFfZm4ocSwgcnEsIGJpbywgZ2ZwX21hc2spOwogCiAJcnEtPmVsZXZhdG9yX3ByaXZhdGUgPSBOVUxMOwogCXJldHVybiAwOwpAQCAtNTA1LDEyICs1MDYsMTIgQEAKIAkJZS0+b3BzLT5lbGV2YXRvcl9wdXRfcmVxX2ZuKHEsIHJxKTsKIH0KIAotaW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncpCitpbnQgZWx2X21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJpbyAqYmlvKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX21heV9xdWV1ZV9mbikKLQkJcmV0dXJuIGUtPm9wcy0+ZWxldmF0b3JfbWF5X3F1ZXVlX2ZuKHEsIHJ3KTsKKwkJcmV0dXJuIGUtPm9wcy0+ZWxldmF0b3JfbWF5X3F1ZXVlX2ZuKHEsIHJ3LCBiaW8pOwogCiAJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYyBiL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggNjBlNjQwOS4uNjkyYTVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC0yNzYsNiArMjc2LDcgQEAKIAlycS0+ZXJyb3JzID0gMDsKIAlycS0+cnFfc3RhdHVzID0gUlFfQUNUSVZFOwogCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IE5VTEw7CisJcnEtPmlvcHJpbyA9IDA7CiAJcnEtPmJ1ZmZlciA9IE5VTEw7CiAJcnEtPnJlZl9jb3VudCA9IDE7CiAJcnEtPnEgPSBxOwpAQCAtMTQ0MiwxMSArMTQ0Myw3IEBACiAJaWYgKCFibGtfcmVtb3ZlX3BsdWcocSkpCiAJCXJldHVybjsKIAotCS8qCi0JICogd2FzIHBsdWdnZWQsIGZpcmUgcmVxdWVzdF9mbiBpZiBxdWV1ZSBoYXMgc3R1ZmYgdG8gZG8KLQkgKi8KLQlpZiAoZWx2X25leHRfcmVxdWVzdChxKSkKLQkJcS0+cmVxdWVzdF9mbihxKTsKKwlxLT5yZXF1ZXN0X2ZuKHEpOwogfQogRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfdW5wbHVnX2RldmljZSk7CiAKQEAgLTE3NzYsOCArMTc3Myw4IEBACiAJbWVtcG9vbF9mcmVlKHJxLCBxLT5ycS5ycV9wb29sKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdCAqYmxrX2FsbG9jX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsCi0JCQkJCQlpbnQgZ2ZwX21hc2spCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0ICoKK2Jsa19hbGxvY19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8sIGludCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBtZW1wb29sX2FsbG9jKHEtPnJxLnJxX3Bvb2wsIGdmcF9tYXNrKTsKIApAQCAtMTc5MCw3ICsxNzg3LDcgQEAKIAkgKi8KIAlycS0+ZmxhZ3MgPSBydzsKIAotCWlmICghZWx2X3NldF9yZXF1ZXN0KHEsIHJxLCBnZnBfbWFzaykpCisJaWYgKCFlbHZfc2V0X3JlcXVlc3QocSwgcnEsIGJpbywgZ2ZwX21hc2spKQogCQlyZXR1cm4gcnE7CiAKIAltZW1wb29sX2ZyZWUocnEsIHEtPnJxLnJxX3Bvb2wpOwpAQCAtMTg3MCwxOCArMTg2NywyMCBAQAogCiAjZGVmaW5lIGJsa2Rldl9mcmVlX3JxKGxpc3QpIGxpc3RfZW50cnkoKGxpc3QpLT5uZXh0LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQogLyoKLSAqIEdldCBhIGZyZWUgcmVxdWVzdCwgcXVldWVfbG9jayBtdXN0IG5vdCBiZSBoZWxkCisgKiBHZXQgYSBmcmVlIHJlcXVlc3QsIHF1ZXVlX2xvY2sgbXVzdCBiZSBoZWxkLgorICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUsIHdpdGggcXVldWVfbG9jayBoZWxkLgorICogUmV0dXJucyAhTlVMTCBvbiBzdWNjZXNzLCB3aXRoIHF1ZXVlX2xvY2sgKm5vdCBoZWxkKi4KICAqLwotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgaW50IGdmcF9tYXNrKQorc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJpbyAqYmlvLAorCQkJCSAgIGludCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBOVUxMOwogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwotCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBnZXRfaW9fY29udGV4dChnZnBfbWFzayk7CisJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IGN1cnJlbnRfaW9fY29udGV4dChHRlBfQVRPTUlDKTsKIAogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RSQUlOLCAmcS0+cXVldWVfZmxhZ3MpKSkKIAkJZ290byBvdXQ7CiAKLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCWlmIChybC0+Y291bnRbcnddKzEgPj0gcS0+bnJfcmVxdWVzdHMpIHsKIAkJLyoKIAkJICogVGhlIHF1ZXVlIHdpbGwgZmlsbCBhZnRlciB0aGlzIGFsbG9jYXRpb24sIHNvIHNldCBpdCBhcwpAQCAtMTg5NSw3ICsxODk0LDcgQEAKIAkJfQogCX0KIAotCXN3aXRjaCAoZWx2X21heV9xdWV1ZShxLCBydykpIHsKKwlzd2l0Y2ggKGVsdl9tYXlfcXVldWUocSwgcncsIGJpbykpIHsKIAkJY2FzZSBFTFZfTVFVRVVFX05POgogCQkJZ290byBycV9zdGFydmVkOwogCQljYXNlIEVMVl9NUVVFVUVfTUFZOgpAQCAtMTkwOSwxOCArMTkwOCwyNSBAQAogCQkgKiBUaGUgcXVldWUgaXMgZnVsbCBhbmQgdGhlIGFsbG9jYXRpbmcgcHJvY2VzcyBpcyBub3QgYQogCQkgKiAiYmF0Y2hlciIsIGFuZCBub3QgZXhlbXB0ZWQgYnkgdGhlIElPIHNjaGVkdWxlcgogCQkgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCQlnb3RvIG91dDsKIAl9CiAKIGdldF9ycToKKwkvKgorCSAqIE9ubHkgYWxsb3cgYmF0Y2hpbmcgcXVldWVycyB0byBhbGxvY2F0ZSB1cCB0byA1MCUgb3ZlciB0aGUgZGVmaW5lZAorCSAqIGxpbWl0IG9mIHJlcXVlc3RzLCBvdGhlcndpc2Ugd2UgY291bGQgaGF2ZSB0aG91c2FuZHMgb2YgcmVxdWVzdHMKKwkgKiBhbGxvY2F0ZWQgd2l0aCBhbnkgc2V0dGluZyBvZiAtPm5yX3JlcXVlc3RzCisJICovCisJaWYgKHJsLT5jb3VudFtyd10gPj0gKDMgKiBxLT5ucl9yZXF1ZXN0cyAvIDIpKQorCQlnb3RvIG91dDsKKwogCXJsLT5jb3VudFtyd10rKzsKIAlybC0+c3RhcnZlZFtyd10gPSAwOwogCWlmIChybC0+Y291bnRbcnddID49IHF1ZXVlX2Nvbmdlc3Rpb25fb25fdGhyZXNob2xkKHEpKQogCQlzZXRfcXVldWVfY29uZ2VzdGVkKHEsIHJ3KTsKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKLQlycSA9IGJsa19hbGxvY19yZXF1ZXN0KHEsIHJ3LCBnZnBfbWFzayk7CisJcnEgPSBibGtfYWxsb2NfcmVxdWVzdChxLCBydywgYmlvLCBnZnBfbWFzayk7CiAJaWYgKCFycSkgewogCQkvKgogCQkgKiBBbGxvY2F0aW9uIGZhaWxlZCBwcmVzdW1hYmx5IGR1ZSB0byBtZW1vcnkuIFVuZG8gYW55dGhpbmcKQEAgLTE5NDMsNyArMTk0OSw2IEBACiAJCWlmICh1bmxpa2VseShybC0+Y291bnRbcnddID09IDApKQogCQkJcmwtPnN0YXJ2ZWRbcnddID0gMTsKIAotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTk1MywzMSArMTk1OCwzNSBAQAogCXJxX2luaXQocSwgcnEpOwogCXJxLT5ybCA9IHJsOwogb3V0OgotCXB1dF9pb19jb250ZXh0KGlvYyk7CiAJcmV0dXJuIHJxOwogfQogCiAvKgogICogTm8gYXZhaWxhYmxlIHJlcXVlc3RzIGZvciB0aGlzIHF1ZXVlLCB1bnBsdWcgdGhlIGRldmljZSBhbmQgd2FpdCBmb3Igc29tZQogICogcmVxdWVzdHMgdG8gYmVjb21lIGF2YWlsYWJsZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBxLT5xdWV1ZV9sb2NrIGhlbGQsIGFuZCByZXR1cm5zIHdpdGggaXQgdW5sb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3Rfd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3Rfd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywKKwkJCQkJc3RydWN0IGJpbyAqYmlvKQogewotCURFRklORV9XQUlUKHdhaXQpOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAotCWRvIHsKKwlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBiaW8sIEdGUF9OT0lPKTsKKwl3aGlsZSAoIXJxKSB7CisJCURFRklORV9XQUlUKHdhaXQpOwogCQlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIAogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZybC0+d2FpdFtyd10sICZ3YWl0LAogCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAotCQlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBHRlBfTk9JTyk7CisJCXJxID0gZ2V0X3JlcXVlc3QocSwgcncsIGJpbywgR0ZQX05PSU8pOwogCiAJCWlmICghcnEpIHsKIAkJCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAKLQkJCWdlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKKwkJCV9fZ2VuZXJpY191bnBsdWdfZGV2aWNlKHEpOworCQkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCQkJaW9fc2NoZWR1bGUoKTsKIAogCQkJLyoKQEAgLTE5ODYsMTIgKzE5OTUsMTMgQEAKIAkJCSAqIHVwIHRvIGEgYmlnIGJhdGNoIG9mIHRoZW0gZm9yIGEgc21hbGwgcGVyaW9kIHRpbWUuCiAJCQkgKiBTZWUgaW9jX2JhdGNoaW5nLCBpb2Nfc2V0X2JhdGNoaW5nCiAJCQkgKi8KLQkJCWlvYyA9IGdldF9pb19jb250ZXh0KEdGUF9OT0lPKTsKKwkJCWlvYyA9IGN1cnJlbnRfaW9fY29udGV4dChHRlBfTk9JTyk7CiAJCQlpb2Nfc2V0X2JhdGNoaW5nKHEsIGlvYyk7Ci0JCQlwdXRfaW9fY29udGV4dChpb2MpOworCisJCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCQl9CiAJCWZpbmlzaF93YWl0KCZybC0+d2FpdFtyd10sICZ3YWl0KTsKLQl9IHdoaWxlICghcnEpOworCX0KIAogCXJldHVybiBycTsKIH0KQEAgLTIwMDIsMTQgKzIwMTIsMTggQEAKIAogCUJVR19PTihydyAhPSBSRUFEICYmIHJ3ICE9IFdSSVRFKTsKIAotCWlmIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpCi0JCXJxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCBydyk7Ci0JZWxzZQotCQlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBnZnBfbWFzayk7CisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSB7CisJCXJxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCBydywgTlVMTCk7CisJfSBlbHNlIHsKKwkJcnEgPSBnZXRfcmVxdWVzdChxLCBydywgTlVMTCwgZ2ZwX21hc2spOworCQlpZiAoIXJxKQorCQkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCX0KKwkvKiBxLT5xdWV1ZV9sb2NrIGlzIHVubG9ja2VkIGF0IHRoaXMgcG9pbnQgKi8KIAogCXJldHVybiBycTsKIH0KLQogRVhQT1JUX1NZTUJPTChibGtfZ2V0X3JlcXVlc3QpOwogCiAvKioKQEAgLTIzMzMsNyArMjM0Nyw2IEBACiAJCXJldHVybjsKIAogCXJlcS0+cnFfc3RhdHVzID0gUlFfSU5BQ1RJVkU7Ci0JcmVxLT5xID0gTlVMTDsKIAlyZXEtPnJsID0gTlVMTDsKIAogCS8qCkBAIC0yNDYyLDYgKzI0NzUsOCBAQAogCQlyZXEtPnJxX2Rpc2stPmluX2ZsaWdodC0tOwogCX0KIAorCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIG5leHQtPmlvcHJpbyk7CisKIAlfX2Jsa19wdXRfcmVxdWVzdChxLCBuZXh0KTsKIAlyZXR1cm4gMTsKIH0KQEAgLTI1MTIsMTMgKzI1MjcsMTUgQEAKIAogc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxLCAqZnJlZXJlcSA9IE5VTEw7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAlpbnQgZWxfcmV0LCBydywgbnJfc2VjdG9ycywgY3VyX25yX3NlY3RvcnMsIGJhcnJpZXIsIGVyciwgc3luYzsKKwl1bnNpZ25lZCBzaG9ydCBwcmlvOwogCXNlY3Rvcl90IHNlY3RvcjsKIAogCXNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCW5yX3NlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOwogCWN1cl9ucl9zZWN0b3JzID0gYmlvX2N1cl9zZWN0b3JzKGJpbyk7CisJcHJpbyA9IGJpb19wcmlvKGJpbyk7CiAKIAlydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN5bmMgPSBiaW9fc3luYyhiaW8pOwpAQCAtMjUzOCwxNCArMjU1NSw5IEBACiAJCWdvdG8gZW5kX2lvOwogCX0KIAotYWdhaW46CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCWlmIChlbHZfcXVldWVfZW1wdHkocSkpIHsKLQkJYmxrX3BsdWdfZGV2aWNlKHEpOwotCQlnb3RvIGdldF9ycTsKLQl9Ci0JaWYgKGJhcnJpZXIpCisJaWYgKHVubGlrZWx5KGJhcnJpZXIpIHx8IGVsdl9xdWV1ZV9lbXB0eShxKSkKIAkJZ290byBnZXRfcnE7CiAKIAllbF9yZXQgPSBlbHZfbWVyZ2UocSwgJnJlcSwgYmlvKTsKQEAgLTI1NTksNiArMjU3MSw3IEBACiAJCQlyZXEtPmJpb3RhaWwtPmJpX25leHQgPSBiaW87CiAJCQlyZXEtPmJpb3RhaWwgPSBiaW87CiAJCQlyZXEtPm5yX3NlY3RvcnMgPSByZXEtPmhhcmRfbnJfc2VjdG9ycyArPSBucl9zZWN0b3JzOworCQkJcmVxLT5pb3ByaW8gPSBpb3ByaW9fYmVzdChyZXEtPmlvcHJpbywgcHJpbyk7CiAJCQlkcml2ZV9zdGF0X2FjY3QocmVxLCBucl9zZWN0b3JzLCAwKTsKIAkJCWlmICghYXR0ZW1wdF9iYWNrX21lcmdlKHEsIHJlcSkpCiAJCQkJZWx2X21lcmdlZF9yZXF1ZXN0KHEsIHJlcSk7CkBAIC0yNTgzLDQ1ICsyNTk2LDMwIEBACiAJCQlyZXEtPmhhcmRfY3VyX3NlY3RvcnMgPSBjdXJfbnJfc2VjdG9yczsKIAkJCXJlcS0+c2VjdG9yID0gcmVxLT5oYXJkX3NlY3RvciA9IHNlY3RvcjsKIAkJCXJlcS0+bnJfc2VjdG9ycyA9IHJlcS0+aGFyZF9ucl9zZWN0b3JzICs9IG5yX3NlY3RvcnM7CisJCQlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBwcmlvKTsKIAkJCWRyaXZlX3N0YXRfYWNjdChyZXEsIG5yX3NlY3RvcnMsIDApOwogCQkJaWYgKCFhdHRlbXB0X2Zyb250X21lcmdlKHEsIHJlcSkpCiAJCQkJZWx2X21lcmdlZF9yZXF1ZXN0KHEsIHJlcSk7CiAJCQlnb3RvIG91dDsKIAotCQkvKgotCQkgKiBlbGV2YXRvciBzYXlzIGRvbid0L2Nhbid0IG1lcmdlLiBnZXQgbmV3IHJlcXVlc3QKLQkJICovCi0JCWNhc2UgRUxFVkFUT1JfTk9fTUVSR0U6Ci0JCQlicmVhazsKLQorCQkvKiBFTFZfTk9fTUVSR0U6IGVsZXZhdG9yIHNheXMgZG9uJ3QvY2FuJ3QgbWVyZ2UuICovCiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoImVsZXZhdG9yIHJldHVybmVkIGNyYXAgKCVkKVxuIiwgZWxfcmV0KTsKLQkJCUJVRygpOworCQkJOwogCX0KIAorZ2V0X3JxOgorCS8qCisJICogR3JhYiBhIGZyZWUgcmVxdWVzdC4gVGhpcyBpcyBtaWdodCBzbGVlcCBidXQgY2FuIG5vdCBmYWlsLgorCSAqIFJldHVybnMgd2l0aCB0aGUgcXVldWUgdW5sb2NrZWQuCisJICovCisJcmVxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCBydywgYmlvKTsKKwogCS8qCi0JICogR3JhYiBhIGZyZWUgcmVxdWVzdCBmcm9tIHRoZSBmcmVlbGlzdCAtIGlmIHRoYXQgaXMgZW1wdHksIGNoZWNrCi0JICogaWYgd2UgYXJlIGRvaW5nIHJlYWQgYWhlYWQgYW5kIGFib3J0IGluc3RlYWQgb2YgYmxvY2tpbmcgZm9yCi0JICogYSBmcmVlIHNsb3QuCisJICogQWZ0ZXIgZHJvcHBpbmcgdGhlIGxvY2sgYW5kIHBvc3NpYmx5IHNsZWVwaW5nIGhlcmUsIG91ciByZXF1ZXN0CisJICogbWF5IG5vdyBiZSBtZXJnZWFibGUgYWZ0ZXIgaXQgaGFkIHByb3ZlbiB1bm1lcmdlYWJsZSAoYWJvdmUpLgorCSAqIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoYXQgY2FzZSBmb3IgZWZmaWNpZW5jeS4gSXQgd29uJ3QgaGFwcGVuCisJICogb2Z0ZW4sIGFuZCB0aGUgZWxldmF0b3JzIGFyZSBhYmxlIHRvIGhhbmRsZSBpdC4KIAkgKi8KLWdldF9ycToKLQlpZiAoZnJlZXJlcSkgewotCQlyZXEgPSBmcmVlcmVxOwotCQlmcmVlcmVxID0gTlVMTDsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCWlmICgoZnJlZXJlcSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQkJLyoKLQkJCSAqIFJFQURBIGJpdCBzZXQKLQkJCSAqLwotCQkJZXJyID0gLUVXT1VMREJMT0NLOwotCQkJaWYgKGJpb19yd19haGVhZChiaW8pKQotCQkJCWdvdG8gZW5kX2lvOwotCQotCQkJZnJlZXJlcSA9IGdldF9yZXF1ZXN0X3dhaXQocSwgcncpOwotCQl9Ci0JCWdvdG8gYWdhaW47Ci0JfQogCiAJcmVxLT5mbGFncyB8PSBSRVFfQ01EOwogCkBAIC0yNjQ2LDEzICsyNjQ0LDE1IEBACiAJcmVxLT5idWZmZXIgPSBiaW9fZGF0YShiaW8pOwkvKiBzZWUgLT5idWZmZXIgY29tbWVudCBhYm92ZSAqLwogCXJlcS0+d2FpdGluZyA9IE5VTEw7CiAJcmVxLT5iaW8gPSByZXEtPmJpb3RhaWwgPSBiaW87CisJcmVxLT5pb3ByaW8gPSBwcmlvOwogCXJlcS0+cnFfZGlzayA9IGJpby0+YmlfYmRldi0+YmRfZGlzazsKIAlyZXEtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlpZiAoZWx2X3F1ZXVlX2VtcHR5KHEpKQorCQlibGtfcGx1Z19kZXZpY2UocSk7CiAJYWRkX3JlcXVlc3QocSwgcmVxKTsKIG91dDoKLQlpZiAoZnJlZXJlcSkKLQkJX19ibGtfcHV0X3JlcXVlc3QocSwgZnJlZXJlcSk7CiAJaWYgKHN5bmMpCiAJCV9fZ2VuZXJpY191bnBsdWdfZGV2aWNlKHEpOwogCkBAIC0yNjc0LDcgKzI2NzQsNyBAQAogCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKSB7CiAJCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBiZGV2LT5iZF9wYXJ0OwogCi0JCXN3aXRjaCAoYmlvLT5iaV9ydykgeworCQlzd2l0Y2ggKGJpb19kYXRhX2RpcihiaW8pKSB7CiAJCWNhc2UgUkVBRDoKIAkJCXAtPnJlYWRfc2VjdG9ycyArPSBiaW9fc2VjdG9ycyhiaW8pOwogCQkJcC0+cmVhZHMrKzsKQEAgLTI2OTMsNiArMjY5Myw3IEBACiB7CiAJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CiAJc3RydWN0IHJlcXVlc3QgKnJxOworCWludCByZXF1ZXVlZCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCWNsZWFyX2JpdChRVUVVRV9GTEFHX0RSQUlOLCAmcS0+cXVldWVfZmxhZ3MpOwpAQCAtMjcwMSw5ICsyNzAyLDEzIEBACiAJCXJxID0gbGlzdF9lbnRyeV9ycShxLT5kcmFpbl9saXN0Lm5leHQpOwogCiAJCWxpc3RfZGVsX2luaXQoJnJxLT5xdWV1ZWxpc3QpOwotCQlfX2Vsdl9hZGRfcmVxdWVzdChxLCBycSwgRUxFVkFUT1JfSU5TRVJUX0JBQ0ssIDEpOworCQllbHZfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKKwkJcmVxdWV1ZWQrKzsKIAl9CiAKKwlpZiAocmVxdWV1ZWQpCisJCXEtPnJlcXVlc3RfZm4ocSk7CisKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAl3YWtlX3VwKCZybC0+d2FpdFswXSk7CkBAIC0yOTAwLDcgKzI5MDUsNyBAQAogCiAJQklPX0JVR19PTighYmlvLT5iaV9zaXplKTsKIAlCSU9fQlVHX09OKCFiaW8tPmJpX2lvX3ZlYyk7Ci0JYmlvLT5iaV9ydyA9IHJ3OworCWJpby0+YmlfcncgfD0gcnc7CiAJaWYgKHJ3ICYgV1JJVEUpCiAJCW1vZF9wYWdlX3N0YXRlKHBncGdvdXQsIGNvdW50KTsKIAllbHNlCkBAIC0zMjU3LDggKzMyNjIsMTEgQEAKIAlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRhc2tfbG9jayhjdXJyZW50KTsKIAlpb2MgPSBjdXJyZW50LT5pb19jb250ZXh0OwogCWN1cnJlbnQtPmlvX2NvbnRleHQgPSBOVUxMOworCWlvYy0+dGFzayA9IE5VTEw7CisJdGFza191bmxvY2soY3VycmVudCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJaWYgKGlvYy0+YWljICYmIGlvYy0+YWljLT5leGl0KQpAQCAtMzI3MSw1NSArMzI3OSw1MSBAQAogCiAvKgogICogSWYgdGhlIGN1cnJlbnQgdGFzayBoYXMgbm8gSU8gY29udGV4dCB0aGVuIGNyZWF0ZSBvbmUgYW5kIGluaXRpYWxpc2UgaXQuCi0gKiBJZiBpdCBkb2VzIGhhdmUgYSBjb250ZXh0LCB0YWtlIGEgcmVmIG9uIGl0LgorICogT3RoZXJ3aXNlLCByZXR1cm4gaXRzIGV4aXN0aW5nIElPIGNvbnRleHQuCiAgKgotICogVGhpcyBpcyBhbHdheXMgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrIHdoaWNoIHN1Ym1pdHRlZCB0aGUgSS9PLgotICogQnV0IHdlaXJkIHRoaW5ncyBoYXBwZW4sIHNvIHdlIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cyB0byBlbnN1cmUgZXhjbHVzaXZlCi0gKiBhY2Nlc3MgdG8gKmN1cnJlbnQuCisgKiBUaGlzIHJldHVybmVkIElPIGNvbnRleHQgZG9lc24ndCBoYXZlIGEgc3BlY2lmaWNhbGx5IGVsZXZhdGVkIHJlZmNvdW50LAorICogYnV0IHNpbmNlIHRoZSBjdXJyZW50IHRhc2sgaXRzZWxmIGhvbGRzIGEgcmVmZXJlbmNlLCB0aGUgY29udGV4dCBjYW4gYmUKKyAqIHVzZWQgaW4gZ2VuZXJhbCBjb2RlLCBzbyBsb25nIGFzIGl0IHN0YXlzIHdpdGhpbiBgY3VycmVudGAgY29udGV4dC4KICAqLwotc3RydWN0IGlvX2NvbnRleHQgKmdldF9pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpCitzdHJ1Y3QgaW9fY29udGV4dCAqY3VycmVudF9pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGlvX2NvbnRleHQgKnJldDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlyZXQgPSB0c2stPmlvX2NvbnRleHQ7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaWYgKGxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhpb2NvbnRleHRfY2FjaGVwLCBnZnBfZmxhZ3MpOwogCWlmIChyZXQpIHsKIAkJYXRvbWljX3NldCgmcmV0LT5yZWZjb3VudCwgMSk7Ci0JCXJldC0+cGlkID0gdHNrLT5waWQ7CisJCXJldC0+dGFzayA9IGN1cnJlbnQ7CisJCXJldC0+c2V0X2lvcHJpbyA9IE5VTEw7CiAJCXJldC0+bGFzdF93YWl0ZWQgPSBqaWZmaWVzOyAvKiBkb2Vzbid0IG1hdHRlci4uLiAqLwogCQlyZXQtPm5yX2JhdGNoX3JlcXVlc3RzID0gMDsgLyogYmVjYXVzZSB0aGlzIGlzIDAgKi8KIAkJcmV0LT5haWMgPSBOVUxMOwogCQlyZXQtPmNpYyA9IE5VTEw7Ci0JCXNwaW5fbG9ja19pbml0KCZyZXQtPmxvY2spOwotCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCQkvKgotCQkgKiB2ZXJ5IHVubGlrZWx5LCBzb21lb25lIHJhY2VkIHdpdGggdXMgaW4gc2V0dGluZyB1cCB0aGUgdGFzawotCQkgKiBpbyBjb250ZXh0LiBmcmVlIG5ldyBjb250ZXh0IGFuZCBqdXN0IGdyYWIgYSByZWZlcmVuY2UuCi0JCSAqLwotCQlpZiAoIXRzay0+aW9fY29udGV4dCkKLQkJCXRzay0+aW9fY29udGV4dCA9IHJldDsKLQkJZWxzZSB7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUoaW9jb250ZXh0X2NhY2hlcCwgcmV0KTsKLQkJCXJldCA9IHRzay0+aW9fY29udGV4dDsKLQkJfQotCi1vdXQ6Ci0JCWF0b21pY19pbmMoJnJldC0+cmVmY291bnQpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXRzay0+aW9fY29udGV4dCA9IHJldDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChjdXJyZW50X2lvX2NvbnRleHQpOworCisvKgorICogSWYgdGhlIGN1cnJlbnQgdGFzayBoYXMgbm8gSU8gY29udGV4dCB0aGVuIGNyZWF0ZSBvbmUgYW5kIGluaXRpYWxpc2UgaXQuCisgKiBJZiBpdCBkb2VzIGhhdmUgYSBjb250ZXh0LCB0YWtlIGEgcmVmIG9uIGl0LgorICoKKyAqIFRoaXMgaXMgYWx3YXlzIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGFzayB3aGljaCBzdWJtaXR0ZWQgdGhlIEkvTy4KKyAqLworc3RydWN0IGlvX2NvbnRleHQgKmdldF9pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGlvX2NvbnRleHQgKnJldDsKKwlyZXQgPSBjdXJyZW50X2lvX2NvbnRleHQoZ2ZwX2ZsYWdzKTsKKwlpZiAobGlrZWx5KHJldCkpCisJCWF0b21pY19pbmMoJnJldC0+cmVmY291bnQpOworCXJldHVybiByZXQ7Cit9CiBFWFBPUlRfU1lNQk9MKGdldF9pb19jb250ZXh0KTsKIAogdm9pZCBjb3B5X2lvX2NvbnRleHQoc3RydWN0IGlvX2NvbnRleHQgKipwZHN0LCBzdHJ1Y3QgaW9fY29udGV4dCAqKnBzcmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKaW5kZXggNWIwOWNmMS4uZTVmNzQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltMy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiBzdGF0aWMgaW50IHN3aW0zX2FkZF9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpzd2ltcyk7CiBpbnQgc3dpbTNfaW5pdCh2b2lkKTsKIAotI2lmbmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmbmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogI2RlZmluZSBjaGVja19tZWRpYV9iYXkod2hpY2gsIHdoYXQpCTEKICNlbmRpZgogCkBAIC0yOTcsOSArMjk3LDExIEBACiAJaW50IGk7CiAJZm9yKGk9MDtpPGZsb3BweV9jb3VudDtpKyspCiAJeworI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJCWlmIChmbG9wcHlfc3RhdGVzW2ldLm1lZGlhX2JheSAmJgogCQkJY2hlY2tfbWVkaWFfYmF5KGZsb3BweV9zdGF0ZXNbaV0ubWVkaWFfYmF5LCBNQl9GRCkpCiAJCQljb250aW51ZTsKKyNlbmRpZiAvKiBDT05GSUdfUE1BQ19NRURJQUJBWSAqLwogCQlzdGFydF9yZXF1ZXN0KCZmbG9wcHlfc3RhdGVzW2ldKTsKIAl9CiAJc3RpKCk7CkBAIC04NTYsOCArODU4LDEwIEBACiAJaWYgKChjbWQgJiAweDgwKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJaWYgKGZzLT5tZWRpYV9iYXkgJiYgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZWRpYV9iYXksIE1CX0ZEKSkKIAkJcmV0dXJuIC1FTlhJTzsKKyNlbmRpZgogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEZERUpFQ1Q6CkBAIC04ODEsOCArODg1LDEwIEBACiAJaW50IG4sIGVyciA9IDA7CiAKIAlpZiAoZnMtPnJlZl9jb3VudCA9PSAwKSB7CisjaWZkZWYgQ09ORklHX1BNQUNfTUVESUFCQVkKIAkJaWYgKGZzLT5tZWRpYV9iYXkgJiYgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZWRpYV9iYXksIE1CX0ZEKSkKIAkJCXJldHVybiAtRU5YSU87CisjZW5kaWYKIAkJb3V0XzgoJnN3LT5zZXR1cCwgU19JQk1fRFJJVkUgfCBTX0ZDTEtfRElWMik7CiAJCW91dF84KCZzdy0+Y29udHJvbF9iaWMsIDB4ZmYpOwogCQlvdXRfOCgmc3ctPm1vZGUsIDB4OTUpOwpAQCAtOTY3LDggKzk3MywxMCBAQAogCXN0cnVjdCBzd2ltMyBfX2lvbWVtICpzdzsKIAlpbnQgcmV0LCBuOwogCisjaWZkZWYgQ09ORklHX1BNQUNfTUVESUFCQVkKIAlpZiAoZnMtPm1lZGlhX2JheSAmJiBjaGVja19tZWRpYV9iYXkoZnMtPm1lZGlhX2JheSwgTUJfRkQpKQogCQlyZXR1cm4gLUVOWElPOworI2VuZGlmCiAKIAlzdyA9IGZzLT5zd2ltMzsKIAlncmFiX2RyaXZlKGZzLCByZXZhbGlkYXRpbmcsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zeDguYyBiL2RyaXZlcnMvYmxvY2svc3g4LmMKaW5kZXggNWVkM2E2My4uOWRiMGE5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zeDguYworKysgYi9kcml2ZXJzL2Jsb2NrL3N4OC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTU4Miw5ICsxNTgzLDkgQEAKIAkJZ290byBlcnJfb3V0OwogCiAjaWYgSUZfNjRCSVRfRE1BX0lTX1BPU1NJQkxFIC8qIGdycnJyLi4uICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKIAlpZiAoIXJjKSB7Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IGNvbnNpc3RlbnQgRE1BIG1hc2sgZmFpbHVyZVxuIiwKIAkJCQlwY2lfbmFtZShwZGV2KSk7CkBAIC0xNTkzLDcgKzE1OTQsNyBAQAogCQlwY2lfZGFjID0gMTsKIAl9IGVsc2UgewogI2VuZGlmCi0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IERNQSBtYXNrIGZhaWx1cmVcbiIsCiAJCQkJcGNpX25hbWUocGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKaW5kZXggZTQ4MWNjNC4uYmQyZWM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTg5NSwxMSArODk0LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmJsdWVjYXJkX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC0xMDg5LDEzICsxMDgzLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBibHVlY2FyZF9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQmx1ZUNhcmQiLCAiTFNFMDQxIiwgMHhiYWYxNmZiZiwgMHg2NTdjYzE1ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJUQ0ZDQVJEIiwgIkxTRTEzOSIsIDB4ZTM5ODc3NjQsIDB4MjUyNGI1OWMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJXU1MiLCAiTFNFMDM5IiwgMHgwYTA3MzZlYywgMHgyNGU2ZGZhYiksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGJsdWVjYXJkX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBibHVlY2FyZF9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJibHVlY2FyZF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGJsdWVjYXJkX2F0dGFjaCwKKwkuZXZlbnQJCT0gYmx1ZWNhcmRfZXZlbnQsCiAJLmRldGFjaAkJPSBibHVlY2FyZF9kZXRhY2gsCisJLmlkX3RhYmxlCT0gYmx1ZWNhcmRfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9ibHVlY2FyZF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCmluZGV4IGY3MWU1YzcuLmFkZjE3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02OTYsMTEgKzY5NSw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCSAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZidDNjX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC05MzUsMTMgKzkyOSwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYnQzY19pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiM0NPTSIsICJCbHVldG9vdGggUEMgQ2FyZCIsIDB4ZWZjZTBhMzEsIDB4ZDRjZTliMDIpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBidDNjX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBidDNjX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImJ0M2NfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBidDNjX2F0dGFjaCwKKwkuZXZlbnQJCT0gYnQzY19ldmVudCwKIAkuZGV0YWNoCQk9IGJ0M2NfZGV0YWNoLAorCS5pZF90YWJsZQk9IGJ0M2NfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9idDNjX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCmluZGV4IGFkOGQ5NzIuLmU0YzU5ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02MTUsMTEgKzYxNCw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZidHVhcnRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTg1NSwxMyArODQ5LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBidHVhcnRfaWRzW10gPSB7CisJLyogZG9uJ3QgdXNlIHRoaXMgZHJpdmVyLiBVc2Ugc2VyaWFsX2NzICsgaGNpX3VhcnQgaW5zdGVhZCAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBidHVhcnRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGJ0dWFydF9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJidHVhcnRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBidHVhcnRfYXR0YWNoLAorCS5ldmVudAkJPSBidHVhcnRfZXZlbnQsCiAJLmRldGFjaAkJPSBidHVhcnRfZGV0YWNoLAorCS5pZF90YWJsZQk9IGJ0dWFydF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2J0dWFydF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCmluZGV4IGZlOTU0ZTUuLmUzOTg2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU5NCwxMSArNTkzLDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmR0bDFfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTgwNywxMyArODAxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBkdGwxX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOb2tpYSBNb2JpbGUgUGhvbmVzIiwgIkRUTC0xIiwgMHhlMWJmZGQ2NCwgMHhlMTY4NDgwZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNvY2tldCIsICJDRiIsIDB4YjM4YmNjMmUsIDB4NDRlYmY4NjMpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBkdGwxX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBkdGwxX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImR0bDFfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBkdGwxX2F0dGFjaCwKKwkuZXZlbnQJCT0gZHRsMV9ldmVudCwKIAkuZGV0YWNoCQk9IGR0bDFfZGV0YWNoLAorCS5pZF90YWJsZQk9IGR0bDFfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9kdGwxX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwppbmRleCAzMjU2MTkyLi5mOWI5NTZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCXBvbGxfd2FpdChmaWxlLCAmaGNpX3ZoY2ktPnJlYWRfd2FpdCwgd2FpdCk7CiAgCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJmhjaV92aGNpLT5yZWFkcSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmhjaV92aGNpLT5yZWFkcSkpCiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDFhZmY4MTkuLjA4ZjY5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTQwLDcgKzQwLDcgQEAKIG9iai0kKENPTkZJR19BTUlHQV9CVUlMVElOX1NFUklBTCkgKz0gYW1pc2VyaWFsLm8KIG9iai0kKENPTkZJR19TWCkJCSs9IHN4Lm8gZ2VuZXJpY19zZXJpYWwubwogb2JqLSQoQ09ORklHX1JJTykJCSs9IHJpby8gZ2VuZXJpY19zZXJpYWwubwotb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNfY29uc29sZS5vIGh2c2kubworb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNfY29uc29sZS5vIGh2Y192aW8ubyBodnNpLm8KIG9iai0kKENPTkZJR19SQVdfRFJJVkVSKQkrPSByYXcubwogb2JqLSQoQ09ORklHX1NHSV9TTlNDKQkJKz0gc25zYy5vIHNuc2NfZXZlbnQubwogb2JqLSQoQ09ORklHX01NVElNRVIpCQkrPSBtbXRpbWVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCmluZGV4IDE0MDc5NDUuLjU5ZjU4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwpAQCAtNjg2LDYgKzY4NiwxNSBAQAogCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAogCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAogCX0sCisJLyogU0lTIDc2MCAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9TSSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfU0lfNzYwLAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcKaW5kZXggZDlhMDI5OS4uMTIzNDE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKICMKIGNvbmZpZyBEUk0KIAl0cmlzdGF0ZSAiRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIChYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIgRFJJIHN1cHBvcnQpIgotCWRlcGVuZHMgb24gQUdQIHx8IEFHUD1uCisJZGVwZW5kcyBvbiAoQUdQIHx8IEFHUD1uKSAmJiBQQ0kKIAloZWxwCiAJICBLZXJuZWwtbGV2ZWwgc3VwcG9ydCBmb3IgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkKIAkgIGludHJvZHVjZWQgaW4gWEZyZWU4NiA0LjAuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzZWxlY3QKQEAgLTk2LDMgKzk2LDEwIEBACiAgICAgICAgICAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpcy4gQUdQCiAgICAgICAgICAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcyBkcml2ZXIgdG8gd29yay4KIAorY29uZmlnIERSTV9WSUEKKwl0cmlzdGF0ZSAiVmlhIHVuaWNocm9tZSB2aWRlbyBjYXJkcyIKKwlkZXBlbmRzIG9uIERSTQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFZpYSB1bmljaHJvbWUgb3IgY29tcGF0aWJsZSB2aWRlbworCSAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZpYS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKaW5kZXggMjNhYjI2My4uZGRkOTQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCkBAIC0xOCw2ICsxOCwxNSBAQAogcmFkZW9uLW9ianMgOj0gcmFkZW9uX2Rydi5vIHJhZGVvbl9jcC5vIHJhZGVvbl9zdGF0ZS5vIHJhZGVvbl9tZW0ubyByYWRlb25faXJxLm8KIGZmYi1vYmpzICAgIDo9IGZmYl9kcnYubyBmZmJfY29udGV4dC5vCiBzaXMtb2JqcyAgICA6PSBzaXNfZHJ2Lm8gc2lzX2RzLm8gc2lzX21tLm8KK3ZpYS1vYmpzICAgIDo9IHZpYV9pcnEubyB2aWFfZHJ2Lm8gdmlhX2RzLm8gdmlhX21hcC5vIHZpYV9tbS5vIHZpYV9kbWEubyB2aWFfdmVyaWZpZXIubyB2aWFfdmlkZW8ubworCitpZmVxICgkKENPTkZJR19DT01QQVQpLHkpCitkcm0tb2JqcyAgICArPSBkcm1faW9jMzIubworcmFkZW9uLW9ianMgKz0gcmFkZW9uX2lvYzMyLm8KK21nYS1vYmpzICAgICs9IG1nYV9pb2MzMi5vCityMTI4LW9ianMgICArPSByMTI4X2lvYzMyLm8KK2k5MTUtb2JqcyAgICs9IGk5MTVfaW9jMzIubworZW5kaWYKIAogb2JqLSQoQ09ORklHX0RSTSkJKz0gZHJtLm8KIG9iai0kKENPTkZJR19EUk1fR0FNTUEpICs9IGdhbW1hLm8KQEAgLTMwLDQgKzM5LDUgQEAKIG9iai0kKENPTkZJR19EUk1fSTkxNSkgICs9IGk5MTUubwogb2JqLSQoQ09ORklHX0RSTV9GRkIpICAgKz0gZmZiLm8KIG9iai0kKENPTkZJR19EUk1fU0lTKSAgICs9IHNpcy5vCitvYmotJChDT05GSUdfRFJNX1ZJQSkJKz12aWEubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKaW5kZXggZmRjYTE4Ny4uMGFlYzVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwpAQCAtNTIsNyArNTIsNyBAQAogIyBkZWZpbmUgQVRJX01BWF9QQ0lHQVJUX1BBR0VTCQk4MTkyCS8qKjwgMzIgTUIgYXBlcnR1cmUsIDRLIHBhZ2VzICovCiAjIGRlZmluZSBBVElfUENJR0FSVF9QQUdFX1NJWkUJCTQwOTYJLyoqPCBQQ0kgR0FSVCBwYWdlIHNpemUgKi8KIAotdW5zaWduZWQgbG9uZyBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoIHZvaWQgKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtX2F0aV9hbGxvY19wY2lnYXJ0X3RhYmxlKCB2b2lkICkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaAppbmRleCA1ODczMDUyLi5lODM3MWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKQEAgLTM4LDcgKzM4LDkgQEAKICNkZWZpbmUgX0RSTV9IXwogCiAjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CQkvKiBGb3IgX0lPKiBtYWNyb3MgKi8KICNkZWZpbmUgRFJNX0lPQ1RMX05SKG4pCQlfSU9DX05SKG4pCiAjZGVmaW5lIERSTV9JT0NfVk9JRAkJX0lPQ19OT05FCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCmluZGV4IDIxZjRjNTQuLjVkZjA5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCkBAIC0zMTYsNiArMzE2LDkgQEAKIHR5cGVkZWYgaW50IGRybV9pb2N0bF90KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwogCit0eXBlZGVmIGludCBkcm1faW9jdGxfY29tcGF0X3Qoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworCiB0eXBlZGVmIHN0cnVjdCBkcm1faW9jdGxfZGVzYyB7CiAJZHJtX2lvY3RsX3QJICAgICAqZnVuYzsKIAlpbnQJCSAgICAgYXV0aF9uZWVkZWQ7CkBAIC03NzEsMzcgKzc3NCwyOCBAQAogCQkJCS8qIERyaXZlciBzdXBwb3J0IChkcm1fZHJ2LmgpICovCiBleHRlcm4gaW50ICAgICAgICAgICBkcm1faW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKIGV4dGVybiB2b2lkICAgICAgICAgIGRybV9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwotZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3ZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGxvbmcJICAgICBkcm1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgICAgICAgICAgIGRybV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwogCiAJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQJICAgICBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIGludAkgICAgIGRybV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50CSAgICAgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogCiAJCQkJLyogTWFwcGluZyBzdXBwb3J0IChkcm1fdm0uaCkgKi8KLWV4dGVybiB2b2lkCSAgICAgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWV4dGVybiBpbnQJICAgICBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIGludAkgICAgIGRybV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBleHRlcm4gdW5zaWduZWQgaW50ICBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKLWV4dGVybiBzc2l6ZV90ICAgICAgIGRybV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKIAogCQkJCS8qIE1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9tZW1vcnkuaCkgKi8KICNpbmNsdWRlICJkcm1fbWVtb3J5LmgiCiBleHRlcm4gdm9pZAkgICAgIGRybV9tZW1faW5pdCh2b2lkKTsKIGV4dGVybiBpbnQJICAgICBkcm1fbWVtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCQkgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotZXh0ZXJuIHZvaWQJICAgICAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CiBleHRlcm4gdm9pZAkgICAgICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLAogCQkJCSAgIGludCBhcmVhKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9hbGxvY19wYWdlcyhpbnQgb3JkZXIsIGludCBhcmVhKTsKQEAgLTg0OSw5ICs4NDMsNiBAQAogZXh0ZXJuIGludAkgICAgIGRybV9ybWN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CiAKLWV4dGVybiBpbnQJICAgICBkcm1fY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpOwotZXh0ZXJuIGludAkgICAgIGRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZShkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldyk7Ci0KIGV4dGVybiBpbnQJICAgICBkcm1fY3R4Yml0bWFwX2luaXQoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gdm9pZAkgICAgIGRybV9jdHhiaXRtYXBfY2xlYW51cCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiB2b2lkICAgICAgICAgIGRybV9jdHhiaXRtYXBfZnJlZSggZHJtX2RldmljZV90ICpkZXYsIGludCBjdHhfaGFuZGxlICk7CkBAIC04NjksOSArODYwLDYgQEAKIAogCiAJCQkJLyogQXV0aGVudGljYXRpb24gSU9DVEwgc3VwcG9ydCAoZHJtX2F1dGguaCkgKi8KLWV4dGVybiBpbnQJICAgICBkcm1fYWRkX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpwcml2LAotCQkJCSAgICBkcm1fbWFnaWNfdCBtYWdpYyk7Ci1leHRlcm4gaW50CSAgICAgZHJtX3JlbW92ZV9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21hZ2ljX3QgbWFnaWMpOwogZXh0ZXJuIGludAkgICAgIGRybV9nZXRtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50CSAgICAgZHJtX2F1dGhtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTg4OCwxMyArODc2LDkgQEAKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludAkgICAgIGRybV9sb2NrX3Rha2UoX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywKIAkJCQkgICAgdW5zaWduZWQgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludAkgICAgIGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAotCQkJCQlfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAotCQkJCQl1bnNpZ25lZCBpbnQgY29udGV4dCk7CiBleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwKIAkJCQkgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywKIAkJCQkgICAgdW5zaWduZWQgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCAgICAgICAgICAgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpOwogCiAJCQkJLyogQnVmZmVyIG1hbmFnZW1lbnQgc3VwcG9ydCAoZHJtX2J1ZnMuaCkgKi8KIGV4dGVybiBpbnQJICAgICBkcm1fb3JkZXIoIHVuc2lnbmVkIGxvbmcgc2l6ZSApOwpAQCAtOTIyLDcgKzkwNiw2IEBACiAJCQkJLyogSVJRIHN1cHBvcnQgKGRybV9pcnEuaCkgKi8KIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9jb250cm9sKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwotZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV9pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gaXJxcmV0dXJuX3QgICBkcm1faXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOwogZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKQEAgLTk2Miw3ICs5NDUsNiBAQAogZXh0ZXJuIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKIGV4dGVybiBpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2hlYWRfdCAqaGVhZCk7CiBleHRlcm4gaW50IGRybV9wdXRfaGVhZChkcm1faGVhZF90ICogaGVhZCk7CiBleHRlcm4gdW5zaWduZWQgaW50ICAgZHJtX2RlYnVnOwogZXh0ZXJuIHVuc2lnbmVkIGludCAgIGRybV9jYXJkc19saW1pdDsKQEAgLTEwNTksOSArMTA0MSwxNiBAQAogewogCWtmcmVlKHB0KTsKIH0KKworLyoqIFdyYXBwZXIgYXJvdW5kIGtjYWxsb2MoKSAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkKK3sKKwlyZXR1cm4ga2NhbGxvYyhubWVtYiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Cit9CiAjZWxzZQogZXh0ZXJuIHZvaWQgKmRybV9hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGFyZWEpOwogZXh0ZXJuIHZvaWQgZHJtX2ZyZWUodm9pZCAqcHQsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CitleHRlcm4gdm9pZCAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CiAjZW5kaWYKIAogLypAfSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKaW5kZXggYjQyODc2MS4uZGQxNDBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYwpAQCAtODcsNyArODcsNyBAQAogICogYXNzb2NpYXRlZCB0aGUgbWFnaWMgbnVtYmVyIGhhc2gga2V5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCwgd2hpbGUgaG9sZGluZwogICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KICAqLwotaW50IGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsIGRybV9tYWdpY190IG1hZ2ljKQorc3RhdGljIGludCBkcm1fYWRkX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpwcml2LCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKIAlpbnQJCSAgaGFzaDsKIAlkcm1fbWFnaWNfZW50cnlfdCAqZW50cnk7CkBAIC0xMjQsNyArMTI0LDcgQEAKICAqIFNlYXJjaGVzIGFuZCB1bmxpbmtzIHRoZSBlbnRyeSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3Qgd2l0aCB0aGUgbWFnaWMKICAqIG51bWJlciBoYXNoIGtleSwgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgogICovCi1pbnQgZHJtX3JlbW92ZV9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgaW50IGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9tYWdpY190IG1hZ2ljKQogewogCWRybV9tYWdpY19lbnRyeV90ICpwcmV2ID0gTlVMTDsKIAlkcm1fbWFnaWNfZW50cnlfdCAqcHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggNDExM2JjYi4uNGM2MTkxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtNjAsNiArNjAsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX29yZGVyKTsKIAorI2lmZGVmIENPTkZJR19DT01QQVQKKy8qCisgKiBVc2VkIHRvIGFsbG9jYXRlIDMyLWJpdCBoYW5kbGVzIGZvciBfRFJNX1NITSByZWdpb25zCisgKiBUaGUgMHgxMDAwMDAwMCB2YWx1ZSBpcyBjaG9zZW4gdG8gYmUgb3V0IG9mIHRoZSB3YXkgb2YKKyAqIEZCL3JlZ2lzdGVyIGFuZCBHQVJUIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXAzMl9oYW5kbGUgPSAweDEwMDAwMDAwOworI2VuZGlmCisKIC8qKgogICogSW9jdGwgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgbWFwcGluZyBieSBhIG5vbi1yb290IHByb2Nlc3MuCiAgKgpAQCAtMTg3LDE2ICsxOTYsMTggQEAKIAogCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CiAJbGlzdF9hZGQoJmxpc3QtPmhlYWQsICZkZXYtPm1hcGxpc3QtPmhlYWQpOworI2lmZGVmIENPTkZJR19DT01QQVQKKwkvKiBBc3NpZ24gYSAzMi1iaXQgaGFuZGxlIGZvciBfRFJNX1NITSBtYXBwaW5ncyAqLworCS8qIFdlIGRvIGl0IGhlcmUgc28gdGhhdCBkZXYtPnN0cnVjdF9zZW0gcHJvdGVjdHMgdGhlIGluY3JlbWVudCAqLworCWlmIChtYXAtPnR5cGUgPT0gX0RSTV9TSE0pCisJCW1hcC0+b2Zmc2V0ID0gbWFwMzJfaGFuZGxlICs9IFBBR0VfU0laRTsKKyNlbmRpZgogIAl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAogCWlmICggY29weV90b191c2VyKCBhcmdwLCBtYXAsIHNpemVvZigqbWFwKSApICkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKCBtYXAtPnR5cGUgIT0gX0RSTV9TSE0gKSB7Ci0JCWlmICggY29weV90b191c2VyKCAmYXJncC0+aGFuZGxlLAotCQkJCSAgICZtYXAtPm9mZnNldCwKLQkJCQkgICBzaXplb2YobWFwLT5vZmZzZXQpICkgKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCWlmIChjb3B5X3RvX3VzZXIoJmFyZ3AtPmhhbmRsZSwgJm1hcC0+b2Zmc2V0LCBzaXplb2YobWFwLT5vZmZzZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MCw3ICsyNTEsNyBAQAogCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKIAogCQlpZihyX2xpc3QtPm1hcCAmJgotCQkgICByX2xpc3QtPm1hcC0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlICYmCisJCSAgIHJfbGlzdC0+bWFwLT5vZmZzZXQgPT0gKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QuaGFuZGxlICYmCiAJCSAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSBicmVhazsKIAl9CiAKQEAgLTM0NSw4ICszNTYsOCBAQAogICogcmVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBsaXN0IG9mIHRoZSBzYW1lIHNpemUgb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIG5ldwogICogYnVmZmVycy4KICAqLwotaW50IGRybV9hZGRidWZzX2FncCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfYWdwKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCiB7CiAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKQEAgLTUxMCw4ICs1MjEsOCBAQAogfQogI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwogCi1pbnQgZHJtX2FkZGJ1ZnNfcGNpKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQorc3RhdGljIGludCBkcm1fYWRkYnVmc19wY2koIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKIHsKICAgIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtNzQwLDggKzc1MSw4IEBACiAKIH0KIAotaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQogewogCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKaW5kZXggZjE1Yzg2Yy4uYTdjZmFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtODQsNyArODQsNyBAQAogICogZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgdG8gYWNjb21tb2RhdGUgdGhlIG5ldyBlbnRyeSB3aGlsZSBob2xkaW5nIHRoZQogICogZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgogICovCi1pbnQgZHJtX2N0eGJpdG1hcF9uZXh0KCBkcm1fZGV2aWNlX3QgKmRldiApCitzdGF0aWMgaW50IGRybV9jdHhiaXRtYXBfbmV4dCggZHJtX2RldmljZV90ICpkZXYgKQogewogCWludCBiaXQ7CiAKQEAgLTIyNSw3ICsyMjUsNyBAQAogCW1hcCA9IGRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdOwogCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwogCi0JcmVxdWVzdC5oYW5kbGUgPSBtYXAtPmhhbmRsZTsKKwlyZXF1ZXN0LmhhbmRsZSA9ICh2b2lkICopIG1hcC0+b2Zmc2V0OwogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwpAQCAtMjYxLDggKzI2MSw4IEBACiAJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKIAkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0JCWlmKHJfbGlzdC0+bWFwICYmCi0JCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUpCisJCWlmIChyX2xpc3QtPm1hcAorCQkgICAgJiYgcl9saXN0LT5tYXAtPm9mZnNldCA9PSAodW5zaWduZWQgbG9uZykgcmVxdWVzdC5oYW5kbGUpCiAJCQlnb3RvIGZvdW5kOwogCX0KIGJhZDoKQEAgLTMyNiw3ICszMjYsNyBAQAogICogaGFyZHdhcmUgbG9jayBpcyBoZWxkLCBjbGVhcnMgdGhlIGRybV9kZXZpY2U6OmNvbnRleHRfZmxhZyBhbmQgd2FrZXMgdXAKICAqIGRybV9kZXZpY2U6OmNvbnRleHRfd2FpdC4KICAqLwotaW50IGRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZSggZHJtX2RldmljZV90ICpkZXYsIGludCBuZXcgKQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3ICkKIHsKICAgICAgICAgZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7ICAvKiBQUkUvUE9TVDogVGhpcyBpcyB0aGUgX29ubHlfIHdyaXRlci4gKi8KICAgICAgICAgZGV2LT5sYXN0X3N3aXRjaCAgPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwppbmRleCAxZTM3ZWQwLi4zMzMzYzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwpAQCAtNTEsOCArNTEsMTEgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NvcmUuaCIKIAorc3RhdGljIGludCBkcm1fdmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyoqIElvY3RsIHRhYmxlICovCi1kcm1faW9jdGxfZGVzY190CQkgIGRybV9pb2N0bHNbXSA9IHsKK3N0YXRpYyBkcm1faW9jdGxfZGVzY190CQkgIGRybV9pb2N0bHNbXSA9IHsKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9WRVJTSU9OKV0gICAgICAgPSB7IGRybV92ZXJzaW9uLCAgICAgMCwgMCB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9VTklRVUUpXSAgICA9IHsgZHJtX2dldHVuaXF1ZSwgICAwLCAwIH0sCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BR0lDKV0gICAgID0geyBkcm1fZ2V0bWFnaWMsICAgIDAsIDAgfSwKQEAgLTQ0Nyw4ICs0NTAsOCBAQAogICoKICAqIEZpbGxzIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIFxwIGFyZy4KICAqLwotaW50IGRybV92ZXJzaW9uKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRybV92ZXJzaW9uKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKIHsKIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCmluZGV4IDkwNjc5NDIuLjEwZTY0ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCitzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RldmljZV90ICpkZXYpOworCiBzdGF0aWMgaW50IGRybV9zZXR1cCggZHJtX2RldmljZV90ICpkZXYgKQogewogCWludCBpOwpAQCAtMjUxLDcgKzI1Myw3IEBACiAJCX0KIAl9CiAJCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSAmJiAhZGV2LT5kcml2ZXItPnJlbGVhc2UpCiAJewogCQlkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7CiAJfQpAQCAtMjU5LDcgKzI2MSw3IEBACiAJZHJtX2Zhc3luYyggLTEsIGZpbHAsIDAgKTsKIAogCWRvd24oICZkZXYtPmN0eGxpc3Rfc2VtICk7Ci0JaWYgKCAhbGlzdF9lbXB0eSggJmRldi0+Y3R4bGlzdC0+aGVhZCApICkgeworCWlmICggZGV2LT5jdHhsaXN0ICYmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0LT5oZWFkKSkpIHsKIAkJZHJtX2N0eF9saXN0X3QgKnBvcywgKm47CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKCBwb3MsIG4sICZkZXYtPmN0eGxpc3QtPmhlYWQsIGhlYWQgKSB7CkBAIC0zNDEsNyArMzQzLDcgQEAKICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2ZpbGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSBwcml2YXRlIGRhdGEgaW4gXHAKICAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgogICovCi1pbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZGV2aWNlX3QgKmRldikKIHsKIAlpbnQJICAgICBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJZHJtX2ZpbGVfdCAgICpwcml2OwpAQCAtNDQzLDkgKzQ0NSwzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9wb2xsKTsKIAotCi0vKiogTm8tb3AuICovCi1zc2l6ZV90IGRybV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQotewotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4N2E5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKQEAgLTAsMCArMSwxMDY5IEBACisvKioKKyAqIFxmaWxlIGRybV9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBEUk0uCisgKgorICogXGF1dGhvciBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDIwMDUuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jb3JlLmgiCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04zMgkJRFJNX0lPV1IoMHgwMCwgZHJtX3ZlcnNpb24zMl90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRTMyCQlEUk1fSU9XUigweDAxLCBkcm1fdW5pcXVlMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAzMgkJRFJNX0lPV1IoMHgwNCwgZHJtX21hcDMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UMzIJCURSTV9JT1dSKDB4MDUsIGRybV9jbGllbnQzMl90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTMzIJCURSTV9JT1IoIDB4MDYsIGRybV9zdGF0czMyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9VTklRVUUzMgkJRFJNX0lPVyggMHgxMCwgZHJtX3VuaXF1ZTMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQMzIJCURSTV9JT1dSKDB4MTUsIGRybV9tYXAzMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUREX0JVRlMzMgkJRFJNX0lPV1IoMHgxNiwgZHJtX2J1Zl9kZXNjMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01BUktfQlVGUzMyCQlEUk1fSU9XKCAweDE3LCBkcm1fYnVmX2Rlc2MzMl90KQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTMzIJCURSTV9JT1dSKDB4MTgsIGRybV9idWZfaW5mbzMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NQVBfQlVGUzMyCQlEUk1fSU9XUigweDE5LCBkcm1fYnVmX21hcDMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMzMgkJRFJNX0lPVyggMHgxYSwgZHJtX2J1Zl9mcmVlMzJfdCkKKworI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQMzIJCURSTV9JT1coIDB4MWIsIGRybV9tYXAzMl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYMzIJRFJNX0lPVyggMHgxYywgZHJtX2N0eF9wcml2X21hcDMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYMzIJRFJNX0lPV1IoMHgxZCwgZHJtX2N0eF9wcml2X21hcDMyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgzMgkJRFJNX0lPV1IoMHgyNiwgZHJtX2N0eF9yZXMzMl90KQorI2RlZmluZSBEUk1fSU9DVExfRE1BMzIJCQlEUk1fSU9XUigweDI5LCBkcm1fZG1hMzJfdCkKKworI2RlZmluZSBEUk1fSU9DVExfQUdQX0VOQUJMRTMyCQlEUk1fSU9XKCAweDMyLCBkcm1fYWdwX21vZGUzMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8zMgkJRFJNX0lPUiggMHgzMywgZHJtX2FncF9pbmZvMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BTExPQzMyCQlEUk1fSU9XUigweDM0LCBkcm1fYWdwX2J1ZmZlcjMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRlJFRTMyCQlEUk1fSU9XKCAweDM1LCBkcm1fYWdwX2J1ZmZlcjMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORDMyCQlEUk1fSU9XKCAweDM2LCBkcm1fYWdwX2JpbmRpbmczMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX1VOQklORDMyCQlEUk1fSU9XKCAweDM3LCBkcm1fYWdwX2JpbmRpbmczMl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9TR19BTExPQzMyCQlEUk1fSU9XKCAweDM4LCBkcm1fc2NhdHRlcl9nYXRoZXIzMl90KQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRTMyCQlEUk1fSU9XKCAweDM5LCBkcm1fc2NhdHRlcl9nYXRoZXIzMl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSzMyCQlEUk1fSU9XUigweDNhLCBkcm1fd2FpdF92YmxhbmszMl90KQorCit0eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbl8zMiB7CisJaW50CXZlcnNpb25fbWFqb3I7CSAgLyoqPCBNYWpvciB2ZXJzaW9uICovCisJaW50CXZlcnNpb25fbWlub3I7CSAgLyoqPCBNaW5vciB2ZXJzaW9uICovCisJaW50CXZlcnNpb25fcGF0Y2hsZXZlbDsvKio8IFBhdGNoIGxldmVsICovCisJdTMyCW5hbWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIG5hbWUgYnVmZmVyICovCisJdTMyCW5hbWU7CQkgIC8qKjwgTmFtZSBvZiBkcml2ZXIgKi8KKwl1MzIJZGF0ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKwl1MzIJZGF0ZTsJCSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRhdGUgKi8KKwl1MzIJZGVzY19sZW47CSAgLyoqPCBMZW5ndGggb2YgZGVzYyBidWZmZXIgKi8KKwl1MzIJZGVzYzsJCSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRlc2MgKi8KK30gZHJtX3ZlcnNpb24zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fdmVyc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV92ZXJzaW9uMzJfdCB2MzI7CisJZHJtX3ZlcnNpb25fdCBfX3VzZXIgKnZlcnNpb247CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdjMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YodjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdmVyc2lvbiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdmVyc2lvbikpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdmVyc2lvbiwgc2l6ZW9mKCp2ZXJzaW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKHYzMi5uYW1lX2xlbiwgJnZlcnNpb24tPm5hbWVfbGVuKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXYzMi5uYW1lLAorCQkJICAmdmVyc2lvbi0+bmFtZSkKKwkgICAgfHwgX19wdXRfdXNlcih2MzIuZGF0ZV9sZW4sICZ2ZXJzaW9uLT5kYXRlX2xlbikKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyl2MzIuZGF0ZSwKKwkJCSAgJnZlcnNpb24tPmRhdGUpCisJICAgIHx8IF9fcHV0X3VzZXIodjMyLmRlc2NfbGVuLCAmdmVyc2lvbi0+ZGVzY19sZW4pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdjMyLmRlc2MsCisJCQkgICZ2ZXJzaW9uLT5kZXNjKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfVkVSU0lPTiwgKHVuc2lnbmVkIGxvbmcpIHZlcnNpb24pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcih2MzIudmVyc2lvbl9tYWpvciwgJnZlcnNpb24tPnZlcnNpb25fbWFqb3IpCisJICAgIHx8IF9fZ2V0X3VzZXIodjMyLnZlcnNpb25fbWlub3IsICZ2ZXJzaW9uLT52ZXJzaW9uX21pbm9yKQorCSAgICB8fCBfX2dldF91c2VyKHYzMi52ZXJzaW9uX3BhdGNobGV2ZWwsICZ2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwpCisJICAgIHx8IF9fZ2V0X3VzZXIodjMyLm5hbWVfbGVuLCAmdmVyc2lvbi0+bmFtZV9sZW4pCisJICAgIHx8IF9fZ2V0X3VzZXIodjMyLmRhdGVfbGVuLCAmdmVyc2lvbi0+ZGF0ZV9sZW4pCisJICAgIHx8IF9fZ2V0X3VzZXIodjMyLmRlc2NfbGVuLCAmdmVyc2lvbi0+ZGVzY19sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJnYzMiwgc2l6ZW9mKHYzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZTMyIHsKKwl1MzIgdW5pcXVlX2xlbjsJLyoqPCBMZW5ndGggb2YgdW5pcXVlICovCisJdTMyIHVuaXF1ZTsJLyoqPCBVbmlxdWUgbmFtZSBmb3IgZHJpdmVyIGluc3RhbnRpYXRpb24gKi8KK30gZHJtX3VuaXF1ZTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9nZXR1bmlxdWUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3VuaXF1ZTMyX3QgdXEzMjsKKwlkcm1fdW5pcXVlX3QgX191c2VyICp1OworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZih1cTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdSwgc2l6ZW9mKCp1KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKHVxMzIudW5pcXVlX2xlbiwgJnUtPnVuaXF1ZV9sZW4pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIHVxMzIudW5pcXVlLAorCQkJICAmdS0+dW5pcXVlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfR0VUX1VOSVFVRSwgKHVuc2lnbmVkIGxvbmcpIHUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcih1cTMyLnVuaXF1ZV9sZW4sICZ1LT51bmlxdWVfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmdXEzMiwgc2l6ZW9mKHVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9zZXR1bmlxdWUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3VuaXF1ZTMyX3QgdXEzMjsKKwlkcm1fdW5pcXVlX3QgX191c2VyICp1OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YodXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXUgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnUpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHUsIHNpemVvZigqdSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcih1cTMyLnVuaXF1ZV9sZW4sICZ1LT51bmlxdWVfbGVuKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSB1cTMyLnVuaXF1ZSwKKwkJCSAgJnUtPnVuaXF1ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfU0VUX1VOSVFVRSwgKHVuc2lnbmVkIGxvbmcpIHUpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFwMzIgeworCXUzMglvZmZzZXQ7CSAJLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KKwl1MzIJc2l6ZTsJIAkvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KKwlkcm1fbWFwX3R5cGVfdAl0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWRybV9tYXBfZmxhZ3NfdCBmbGFnczsJLyoqPCBGbGFncyAqLworCXUzMgloYW5kbGU7CQkvKio8IFVzZXItc3BhY2U6ICJIYW5kbGUiIHRvIHBhc3MgdG8gbW1hcCgpICovCisJaW50CW10cnI7CQkvKio8IE1UUlIgc2xvdCB1c2VkICovCit9IGRybV9tYXAzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZ2V0bWFwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX21hcDMyX3QgbTMyOworCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwlpbnQgaWR4LCBlcnI7CisJdm9pZCAqaGFuZGxlOworCisJaWYgKGdldF91c2VyKGlkeCwgJmFyZ3AtPm9mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWFwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCptYXApKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG1hcCwgc2l6ZW9mKCptYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIoaWR4LCAmbWFwLT5vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9HRVRfTUFQLCAodW5zaWduZWQgbG9uZykgbWFwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIobTMyLm9mZnNldCwgJm1hcC0+b2Zmc2V0KQorCSAgICB8fCBfX2dldF91c2VyKG0zMi5zaXplLCAmbWFwLT5zaXplKQorCSAgICB8fCBfX2dldF91c2VyKG0zMi50eXBlLCAmbWFwLT50eXBlKQorCSAgICB8fCBfX2dldF91c2VyKG0zMi5mbGFncywgJm1hcC0+ZmxhZ3MpCisJICAgIHx8IF9fZ2V0X3VzZXIoaGFuZGxlLCAmbWFwLT5oYW5kbGUpCisJICAgIHx8IF9fZ2V0X3VzZXIobTMyLm10cnIsICZtYXAtPm10cnIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW0zMi5oYW5kbGUgPSAodW5zaWduZWQgbG9uZykgaGFuZGxlOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm0zMiwgc2l6ZW9mKG0zMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWRkbWFwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX21hcDMyX3QgbTMyOworCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwlpbnQgZXJyOworCXZvaWQgKmhhbmRsZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbTMyLCBhcmdwLCBzaXplb2YobTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWFwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCptYXApKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG1hcCwgc2l6ZW9mKCptYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIobTMyLm9mZnNldCwgJm1hcC0+b2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKG0zMi5zaXplLCAmbWFwLT5zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKG0zMi50eXBlLCAmbWFwLT50eXBlKQorCSAgICB8fCBfX3B1dF91c2VyKG0zMi5mbGFncywgJm1hcC0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9BRERfTUFQLCAodW5zaWduZWQgbG9uZykgbWFwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIobTMyLm9mZnNldCwgJm1hcC0+b2Zmc2V0KQorCSAgICB8fCBfX2dldF91c2VyKG0zMi5tdHJyLCAmbWFwLT5tdHJyKQorCSAgICB8fCBfX2dldF91c2VyKGhhbmRsZSwgJm1hcC0+aGFuZGxlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltMzIuaGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZTsKKwlpZiAobTMyLmhhbmRsZSAhPSAodW5zaWduZWQgbG9uZykgaGFuZGxlICYmIHByaW50a19yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21wYXRfZHJtX2FkZG1hcCB0cnVuY2F0ZWQgaGFuZGxlIgorCQkgICAgICAgIiAlcCBmb3IgdHlwZSAlZCBvZmZzZXQgJXhcbiIsCisJCSAgICAgICBoYW5kbGUsIG0zMi50eXBlLCBtMzIub2Zmc2V0KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm0zMiwgc2l6ZW9mKG0zMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fcm1tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwl1MzIgaGFuZGxlOworCisJaWYgKGdldF91c2VyKGhhbmRsZSwgJmFyZ3AtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWFwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCptYXApKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG1hcCwgc2l6ZW9mKCptYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIoKHZvaWQgKikodW5zaWduZWQgbG9uZykgaGFuZGxlLCAmbWFwLT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JNX01BUCwgKHVuc2lnbmVkIGxvbmcpIG1hcCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9jbGllbnQzMiB7CisJaW50CWlkeDsJLyoqPCBXaGljaCBjbGllbnQgZGVzaXJlZD8gKi8KKwlpbnQJYXV0aDsJLyoqPCBJcyBjbGllbnQgYXV0aGVudGljYXRlZD8gKi8KKwl1MzIJcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KKwl1MzIJdWlkOwkvKio8IFVzZXIgSUQgKi8KKwl1MzIJbWFnaWM7CS8qKjwgTWFnaWMgKi8KKwl1MzIJaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLworfSBkcm1fY2xpZW50MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2dldGNsaWVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fY2xpZW50MzJfdCBjMzI7CisJZHJtX2NsaWVudDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jbGllbnRfdCBfX3VzZXIgKmNsaWVudDsKKwlpbnQgaWR4LCBlcnI7CisKKwlpZiAoZ2V0X3VzZXIoaWR4LCAmYXJncC0+aWR4KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljbGllbnQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNsaWVudCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgY2xpZW50LCBzaXplb2YoKmNsaWVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcihpZHgsICZjbGllbnQtPmlkeCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0dFVF9DTElFTlQsICh1bnNpZ25lZCBsb25nKSBjbGllbnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcihjMzIuYXV0aCwgJmNsaWVudC0+YXV0aCkKKwkgICAgfHwgX19nZXRfdXNlcihjMzIucGlkLCAmY2xpZW50LT5waWQpCisJICAgIHx8IF9fZ2V0X3VzZXIoYzMyLnVpZCwgJmNsaWVudC0+dWlkKQorCSAgICB8fCBfX2dldF91c2VyKGMzMi5tYWdpYywgJmNsaWVudC0+bWFnaWMpCisJICAgIHx8IF9fZ2V0X3VzZXIoYzMyLmlvY3MsICZjbGllbnQtPmlvY3MpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmMzMiwgc2l6ZW9mKGMzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzMzIgeworCXUzMiBjb3VudDsKKwlzdHJ1Y3QgeworCQl1MzIgdmFsdWU7CisJCWRybV9zdGF0X3R5cGVfdCB0eXBlOworCX0gZGF0YVsxNV07Cit9IGRybV9zdGF0czMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9nZXRzdGF0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fc3RhdHMzMl90IHMzMjsKKwlkcm1fc3RhdHMzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fc3RhdHNfdCBfX3VzZXIgKnN0YXRzOworCWludCBpLCBlcnI7CisKKwlzdGF0cyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqc3RhdHMpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHN0YXRzLCBzaXplb2YoKnN0YXRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0dFVF9TVEFUUywgKHVuc2lnbmVkIGxvbmcpIHN0YXRzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIoczMyLmNvdW50LCAmc3RhdHMtPmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZm9yIChpID0gMDsgaSA8IDE1OyArK2kpCisJCWlmIChfX2dldF91c2VyKHMzMi5kYXRhW2ldLnZhbHVlLCAmc3RhdHMtPmRhdGFbaV0udmFsdWUpCisJCSAgICB8fCBfX2dldF91c2VyKHMzMi5kYXRhW2ldLnR5cGUsICZzdGF0cy0+ZGF0YVtpXS50eXBlKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmczMyLCBzaXplb2YoczMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2Rlc2MzMiB7CisJaW50CSAgICAgIGNvdW50OwkgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBvZiB0aGlzIHNpemUgKi8KKwlpbnQJICAgICAgc2l6ZTsJIC8qKjwgU2l6ZSBpbiBieXRlcyAqLworCWludAkgICAgICBsb3dfbWFyazsJIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KKwlpbnQJICAgICAgaGlnaF9tYXJrOyAvKio8IEhpZ2ggd2F0ZXIgbWFyayAqLworCWludAkgICAgICBmbGFnczsKKwl1MzIJICAgICAgYWdwX3N0YXJ0OyAvKio8IFN0YXJ0IGFkZHJlc3MgaW4gdGhlIEFHUCBhcGVydHVyZSAqLworfSBkcm1fYnVmX2Rlc2MzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWRkYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9idWZfZGVzYzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9idWZfZGVzY190IF9fdXNlciAqYnVmOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7CisKKwlidWYgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmJ1ZikpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBzaXplb2YoKmJ1ZikpCisJICAgIHx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBzaXplb2YoKmFyZ3ApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19jb3B5X2luX3VzZXIoYnVmLCBhcmdwLCBvZmZzZXRvZihkcm1fYnVmX2Rlc2MzMl90LCBhZ3Bfc3RhcnQpKQorCSAgICB8fCBfX2dldF91c2VyKGFncF9zdGFydCwgJmFyZ3AtPmFncF9zdGFydCkKKwkgICAgfHwgX19wdXRfdXNlcihhZ3Bfc3RhcnQsICZidWYtPmFncF9zdGFydCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0FERF9CVUZTLCAodW5zaWduZWQgbG9uZykgYnVmKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fY29weV9pbl91c2VyKGFyZ3AsIGJ1Ziwgb2Zmc2V0b2YoZHJtX2J1Zl9kZXNjMzJfdCwgYWdwX3N0YXJ0KSkKKwkgICAgfHwgX19nZXRfdXNlcihhZ3Bfc3RhcnQsICZidWYtPmFncF9zdGFydCkKKwkgICAgfHwgX19wdXRfdXNlcihhZ3Bfc3RhcnQsICZhcmdwLT5hZ3Bfc3RhcnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fbWFya2J1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2J1Zl9kZXNjMzJfdCBiMzI7CisJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2J1Zl9kZXNjX3QgX191c2VyICpidWY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmIzMiwgYXJncCwgc2l6ZW9mKGIzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqYnVmKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIHNpemVvZigqYnVmKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKF9fcHV0X3VzZXIoYjMyLnNpemUsICZidWYtPnNpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoYjMyLmxvd19tYXJrLCAmYnVmLT5sb3dfbWFyaykKKwkgICAgfHwgX19wdXRfdXNlcihiMzIuaGlnaF9tYXJrLCAmYnVmLT5oaWdoX21hcmspKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX01BUktfQlVGUywgKHVuc2lnbmVkIGxvbmcpIGJ1Zik7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfaW5mbzMyIHsKKwlpbnQJICAgICAgIGNvdW50OwkvKio8IEVudHJpZXMgaW4gbGlzdCAqLworCXUzMgkgICAgICAgbGlzdDsKK30gZHJtX2J1Zl9pbmZvMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2luZm9idWZzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9idWZfaW5mbzMyX3QgcmVxMzI7CisJZHJtX2J1Zl9pbmZvMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKnRvOworCWRybV9idWZfaW5mb190IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmxpc3Q7CisJc2l6ZV90IG5ieXRlczsKKwlpbnQgaSwgZXJyOworCWludCBjb3VudCwgYWN0dWFsOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY291bnQgPSByZXEzMi5jb3VudDsKKwl0byA9IChkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSByZXEzMi5saXN0OworCWlmIChjb3VudCA8IDApCisJCWNvdW50ID0gMDsKKwlpZiAoY291bnQgPiAwCisJICAgICYmICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9kZXNjMzJfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihkcm1fYnVmX2Rlc2NfdCk7CisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5ieXRlcyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBuYnl0ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsaXN0ID0gKGRybV9idWZfZGVzY190ICopIChyZXF1ZXN0ICsgMSk7CisKKwlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfSU5GT19CVUZTLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKGFjdHVhbCwgJnJlcXVlc3QtPmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID49IGFjdHVhbCkKKwkJZm9yIChpID0gMDsgaSA8IGFjdHVhbDsgKytpKQorCQkJaWYgKF9fY29weV9pbl91c2VyKCZ0b1tpXSwgJmxpc3RbaV0sCisJCQkJCSAgIG9mZnNldG9mKGRybV9idWZfZGVzY190LCBmbGFncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJaWYgKF9fcHV0X3VzZXIoYWN0dWFsLCAmYXJncC0+Y291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX3B1YjMyIHsKKwlpbnQJaWR4OwkJLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KKwlpbnQJdG90YWw7CQkvKio8IEJ1ZmZlciBzaXplICovCisJaW50CXVzZWQ7CQkvKio8IEFtb3VudCBvZiBidWZmZXIgaW4gdXNlIChmb3IgRE1BKSAqLworCXUzMglhZGRyZXNzOwkvKio8IEFkZHJlc3Mgb2YgYnVmZmVyICovCit9IGRybV9idWZfcHViMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9tYXAzMiB7CisJaW50CWNvdW50OwkJLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciBsaXN0ICovCisJdTMyCXZpcnR1YWw7CS8qKjwgTW1hcCdkIGFyZWEgaW4gdXNlci12aXJ0dWFsICovCisJdTMyCWxpc3Q7CQkvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworfSBkcm1fYnVmX21hcDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9tYXBidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2J1Zl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYnVmX21hcDMyX3QgcmVxMzI7CisJZHJtX2J1Zl9wdWIzMl90IF9fdXNlciAqbGlzdDMyOworCWRybV9idWZfbWFwX3QgX191c2VyICpyZXF1ZXN0OworCWRybV9idWZfcHViX3QgX191c2VyICpsaXN0OworCWludCBpLCBlcnI7CisJaW50IGNvdW50LCBhY3R1YWw7CisJc2l6ZV90IG5ieXRlczsKKwl2b2lkIF9fdXNlciAqYWRkcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljb3VudCA9IHJlcTMyLmNvdW50OworCWxpc3QzMiA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLmxpc3Q7CisKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9wdWJfdCk7CisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5ieXRlcyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBuYnl0ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsaXN0ID0gKGRybV9idWZfcHViX3QgKikgKHJlcXVlc3QgKyAxKTsKKworCWlmIChfX3B1dF91c2VyKGNvdW50LCAmcmVxdWVzdC0+Y291bnQpCisJICAgIHx8IF9fcHV0X3VzZXIobGlzdCwgJnJlcXVlc3QtPmxpc3QpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9NQVBfQlVGUywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcihhY3R1YWwsICZyZXF1ZXN0LT5jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA+PSBhY3R1YWwpCisJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKKwkJCWlmIChfX2NvcHlfaW5fdXNlcigmbGlzdDMyW2ldLCAmbGlzdFtpXSwKKwkJCQkJICAgb2Zmc2V0b2YoZHJtX2J1Zl9wdWJfdCwgYWRkcmVzcykpCisJCQkgICAgfHwgX19nZXRfdXNlcihhZGRyLCAmbGlzdFtpXS5hZGRyZXNzKQorCQkJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCQkJCSAgJmxpc3QzMltpXS5hZGRyZXNzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX3B1dF91c2VyKGFjdHVhbCwgJmFyZ3AtPmNvdW50KQorCSAgICB8fCBfX2dldF91c2VyKGFkZHIsICZyZXF1ZXN0LT52aXJ0dWFsKQorCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKSBhZGRyLCAmYXJncC0+dmlydHVhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZTMyIHsKKwlpbnQJY291bnQ7CisJdTMyCWxpc3Q7Cit9IGRybV9idWZfZnJlZTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9mcmVlYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYnVmX2ZyZWUzMl90IHJlcTMyOworCWRybV9idWZfZnJlZV90IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fYnVmX2ZyZWUzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcihyZXEzMi5jb3VudCwgJnJlcXVlc3QtPmNvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIHJlcTMyLmxpc3QsCisJCQkgICZyZXF1ZXN0LT5saXN0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9GUkVFX0JVRlMsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcDMyIHsKKwl1bnNpZ25lZCBpbnQJY3R4X2lkOyAgLyoqPCBDb250ZXh0IHJlcXVlc3RpbmcgcHJpdmF0ZSBtYXBwaW5nICovCisJdTMyCQloYW5kbGU7IC8qKjwgSGFuZGxlIG9mIG1hcCAqLworfSBkcm1fY3R4X3ByaXZfbWFwMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX3NldHNhcmVhY3R4KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2N0eF9wcml2X21hcDMyX3QgcmVxMzI7CisJZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fY3R4X3ByaXZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIocmVxMzIuY3R4X2lkLCAmcmVxdWVzdC0+Y3R4X2lkKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkICopKHVuc2lnbmVkIGxvbmcpIHJlcTMyLmhhbmRsZSwKKwkJCSAgJnJlcXVlc3QtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZ2V0c2FyZWFjdHgoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICpyZXF1ZXN0OworCWRybV9jdHhfcHJpdl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBjdHhfaWQ7CisJdm9pZCAqaGFuZGxlOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBzaXplb2YoKmFyZ3ApKQorCSAgICB8fCBfX2dldF91c2VyKGN0eF9pZCwgJmFyZ3AtPmN0eF9pZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKGN0eF9pZCwgJnJlcXVlc3QtPmN0eF9pZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFgsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIoaGFuZGxlLCAmcmVxdWVzdC0+aGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKSBoYW5kbGUsICZhcmdwLT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3JlczMyIHsKKwlpbnQJY291bnQ7CisJdTMyCWNvbnRleHRzOworfSBkcm1fY3R4X3JlczMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9yZXNjdHgoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcmVzMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2N0eF9yZXMzMl90IHJlczMyOworCWRybV9jdHhfcmVzX3QgX191c2VyICpyZXM7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzMzIsIGFyZ3AsIHNpemVvZihyZXMzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVzKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXMsIHNpemVvZigqcmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKHJlczMyLmNvdW50LCAmcmVzLT5jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcigoZHJtX2N0eF90IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSByZXMzMi5jb250ZXh0cywKKwkJCSAgJnJlcy0+Y29udGV4dHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9SRVNfQ1RYLCAodW5zaWduZWQgbG9uZykgcmVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIocmVzMzIuY291bnQsICZyZXMtPmNvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKHJlczMyLmNvdW50LCAmYXJncC0+Y291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fZG1hMzIgeworCWludAljb250ZXh0OwkgIC8qKjwgQ29udGV4dCBoYW5kbGUgKi8KKwlpbnQJc2VuZF9jb3VudDsJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQgKi8KKwl1MzIJc2VuZF9pbmRpY2VzOwkgIC8qKjwgTGlzdCBvZiBoYW5kbGVzIHRvIGJ1ZmZlcnMgKi8KKwl1MzIJc2VuZF9zaXplczsJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCisJZHJtX2RtYV9mbGFnc190IGZsYWdzOwkJICAvKio8IEZsYWdzICovCisJaW50CXJlcXVlc3RfY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KKwlpbnQJcmVxdWVzdF9zaXplOwkgIC8qKjwgRGVzaXJlZCBzaXplIGZvciBidWZmZXJzICovCisJdTMyCXJlcXVlc3RfaW5kaWNlczsgIC8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCisJdTMyCXJlcXVlc3Rfc2l6ZXM7CisJaW50CWdyYW50ZWRfY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkICovCit9IGRybV9kbWEzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZG1hKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZG1hMzJfdCBkMzI7CisJZHJtX2RtYTMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlkcm1fZG1hX3QgX191c2VyICpkOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmQzMiwgYXJncCwgc2l6ZW9mKGQzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGQsIHNpemVvZigqZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX3B1dF91c2VyKGQzMi5jb250ZXh0LCAmZC0+Y29udGV4dCkKKwkgICAgfHwgX19wdXRfdXNlcihkMzIuc2VuZF9jb3VudCwgJmQtPnNlbmRfY291bnQpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgZDMyLnNlbmRfaW5kaWNlcywKKwkJCSAgJmQtPnNlbmRfaW5kaWNlcykKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSBkMzIuc2VuZF9zaXplcywKKwkJCSAgJmQtPnNlbmRfc2l6ZXMpCisJICAgIHx8IF9fcHV0X3VzZXIoZDMyLmZsYWdzLCAmZC0+ZmxhZ3MpCisJICAgIHx8IF9fcHV0X3VzZXIoZDMyLnJlcXVlc3RfY291bnQsICZkLT5yZXF1ZXN0X2NvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIGQzMi5yZXF1ZXN0X2luZGljZXMsCisJCQkgICZkLT5yZXF1ZXN0X2luZGljZXMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgZDMyLnJlcXVlc3Rfc2l6ZXMsCisJCQkgICZkLT5yZXF1ZXN0X3NpemVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfRE1BLCAodW5zaWduZWQgbG9uZykgZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKGQzMi5yZXF1ZXN0X3NpemUsICZkLT5yZXF1ZXN0X3NpemUpCisJICAgIHx8IF9fZ2V0X3VzZXIoZDMyLmdyYW50ZWRfY291bnQsICZkLT5ncmFudGVkX2NvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKGQzMi5yZXF1ZXN0X3NpemUsICZhcmdwLT5yZXF1ZXN0X3NpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoZDMyLmdyYW50ZWRfY291bnQsICZhcmdwLT5ncmFudGVkX2NvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIF9fT1NfSEFTX0FHUAordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tb2RlMzIgeworCXUzMiBtb2RlOwkvKio8IEFHUCBtb2RlICovCit9IGRybV9hZ3BfbW9kZTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9hZ3BfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYWdwX21vZGUzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYWdwX21vZGUzMl90IG0zMjsKKwlkcm1fYWdwX21vZGVfdCBfX3VzZXIgKm1vZGU7CisKKwlpZiAoZ2V0X3VzZXIobTMyLm1vZGUsICZhcmdwLT5tb2RlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltb2RlID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCptb2RlKSk7CisJaWYgKHB1dF91c2VyKG0zMi5tb2RlLCAmbW9kZS0+bW9kZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfQUdQX0VOQUJMRSwgKHVuc2lnbmVkIGxvbmcpIG1vZGUpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8zMiB7CisJaW50ICAgICAgIGFncF92ZXJzaW9uX21ham9yOworCWludCAgICAgICBhZ3BfdmVyc2lvbl9taW5vcjsKKwl1MzIJICBtb2RlOworCXUzMgkgIGFwZXJ0dXJlX2Jhc2U7ICAvKiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyCSAgYXBlcnR1cmVfc2l6ZTsgIC8qIGJ5dGVzICovCisJdTMyCSAgbWVtb3J5X2FsbG93ZWQ7IC8qIGJ5dGVzICovCisJdTMyCSAgbWVtb3J5X3VzZWQ7CisKKwkJCQkvKiBQQ0kgaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBpZF92ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgaWRfZGV2aWNlOworfSBkcm1fYWdwX2luZm8zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWdwX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2FncF9pbmZvMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2FncF9pbmZvMzJfdCBpMzI7CisJZHJtX2FncF9pbmZvX3QgX191c2VyICppbmZvOworCWludCBlcnI7CisKKwlpbmZvID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbmZvKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBpbmZvLCBzaXplb2YoKmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfQUdQX0lORk8sICh1bnNpZ25lZCBsb25nKSBpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIoaTMyLmFncF92ZXJzaW9uX21ham9yLCAmaW5mby0+YWdwX3ZlcnNpb25fbWFqb3IpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLmFncF92ZXJzaW9uX21pbm9yLCAmaW5mby0+YWdwX3ZlcnNpb25fbWlub3IpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLm1vZGUsICZpbmZvLT5tb2RlKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5hcGVydHVyZV9iYXNlLCAmaW5mby0+YXBlcnR1cmVfYmFzZSkKKwkgICAgfHwgX19nZXRfdXNlcihpMzIuYXBlcnR1cmVfc2l6ZSwgJmluZm8tPmFwZXJ0dXJlX3NpemUpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLm1lbW9yeV9hbGxvd2VkLCAmaW5mby0+bWVtb3J5X2FsbG93ZWQpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLm1lbW9yeV91c2VkLCAmaW5mby0+bWVtb3J5X3VzZWQpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLmlkX3ZlbmRvciwgJmluZm8tPmlkX3ZlbmRvcikKKwkgICAgfHwgX19nZXRfdXNlcihpMzIuaWRfZGV2aWNlLCAmaW5mby0+aWRfZGV2aWNlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZpMzIsIHNpemVvZihpMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9idWZmZXIzMiB7CisJdTMyIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCisJdTMyIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBiaW5kaW5nIC8gdW5iaW5kaW5nICovCisJdTMyIHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKi8KKyAgICAgICAgdTMyIHBoeXNpY2FsOwkvKio8IFBoeXNpY2FsIHVzZWQgYnkgaTgxMCAqLworfSBkcm1fYWdwX2J1ZmZlcjMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9hZ3BfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2FncF9idWZmZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYWdwX2J1ZmZlcjMyX3QgcmVxMzI7CisJZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuc2l6ZSwgJnJlcXVlc3QtPnNpemUpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIudHlwZSwgJnJlcXVlc3QtPnR5cGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9BR1BfQUxMT0MsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIocmVxMzIuaGFuZGxlLCAmcmVxdWVzdC0+aGFuZGxlKQorCSAgICB8fCBfX2dldF91c2VyKHJlcTMyLnBoeXNpY2FsLCAmcmVxdWVzdC0+cGh5c2ljYWwpCisJICAgIHx8IGNvcHlfdG9fdXNlcihhcmdwLCAmcmVxMzIsIHNpemVvZihyZXEzMikpKSB7CisJCWRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSAgRFJNX0lPQ1RMX0FHUF9GUkVFLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWdwX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2FncF9idWZmZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqcmVxdWVzdDsKKwl1MzIgaGFuZGxlOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgZ2V0X3VzZXIoaGFuZGxlLCAmYXJncC0+aGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKGhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfQUdQX0ZSRUUsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nMzIgeworCXUzMiBoYW5kbGU7CS8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLworCXUzMiBvZmZzZXQ7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCit9IGRybV9hZ3BfYmluZGluZzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9hZ3BfYmluZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYWdwX2JpbmRpbmczMl90IHJlcTMyOworCWRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuaGFuZGxlLCAmcmVxdWVzdC0+aGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLm9mZnNldCwgJnJlcXVlc3QtPm9mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfQUdQX0JJTkQsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX2FncF91bmJpbmQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9hZ3BfYmluZGluZzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqcmVxdWVzdDsKKwl1MzIgaGFuZGxlOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgZ2V0X3VzZXIoaGFuZGxlLCAmYXJncC0+aGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKGhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfQUdQX1VOQklORCwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIzMiB7CisJdTMyIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCisJdTMyIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBtYXBwaW5nIC8gdW5tYXBwaW5nICovCit9IGRybV9zY2F0dGVyX2dhdGhlcjMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9zZ19hbGxvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fc2NhdHRlcl9nYXRoZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJncCwgc2l6ZW9mKCphcmdwKSkKKwkgICAgfHwgX19nZXRfdXNlcih4LCAmYXJncC0+c2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcih4LCAmcmVxdWVzdC0+c2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX1NHX0FMTE9DLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFhYWCBub3Qgc3VyZSBhYm91dCB0aGUgaGFuZGxlIGNvbnZlcnNpb24gaGVyZS4uLiAqLworCWlmIChfX2dldF91c2VyKHgsICZyZXF1ZXN0LT5oYW5kbGUpCisJICAgIHx8IF9fcHV0X3VzZXIoeCA+PiBQQUdFX1NISUZULCAmYXJncC0+aGFuZGxlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX3NnX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fc2NhdHRlcl9nYXRoZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJdW5zaWduZWQgbG9uZyB4OworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZ3AsIHNpemVvZigqYXJncCkpCisJICAgIHx8IF9fZ2V0X3VzZXIoeCwgJmFyZ3AtPmhhbmRsZSkKKwkgICAgfHwgX19wdXRfdXNlcih4IDw8IFBBR0VfU0hJRlQsICZyZXF1ZXN0LT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1NHX0ZSRUUsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0MzIgeworCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1MzIgc2lnbmFsOworfTsKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseTMyIHsKKwlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJczMyIHR2YWxfc2VjOworCXMzMiB0dmFsX3VzZWM7Cit9OworCit0eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuazMyIHsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QzMiByZXF1ZXN0OworCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkzMiByZXBseTsKK30gZHJtX3dhaXRfdmJsYW5rMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX3dhaXRfdmJsYW5rKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3dhaXRfdmJsYW5rMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3dhaXRfdmJsYW5rMzJfdCByZXEzMjsKKwlkcm1fd2FpdF92YmxhbmtfdCBfX3VzZXIgKnJlcXVlc3Q7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucmVxdWVzdC50eXBlLCAmcmVxdWVzdC0+cmVxdWVzdC50eXBlKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnJlcXVlc3Quc2VxdWVuY2UsICZyZXF1ZXN0LT5yZXF1ZXN0LnNlcXVlbmNlKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnJlcXVlc3Quc2lnbmFsLCAmcmVxdWVzdC0+cmVxdWVzdC5zaWduYWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9XQUlUX1ZCTEFOSywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcihyZXEzMi5yZXBseS50eXBlLCAmcmVxdWVzdC0+cmVwbHkudHlwZSkKKwkgICAgfHwgX19nZXRfdXNlcihyZXEzMi5yZXBseS5zZXF1ZW5jZSwgJnJlcXVlc3QtPnJlcGx5LnNlcXVlbmNlKQorCSAgICB8fCBfX2dldF91c2VyKHJlcTMyLnJlcGx5LnR2YWxfc2VjLCAmcmVxdWVzdC0+cmVwbHkudHZhbF9zZWMpCisJICAgIHx8IF9fZ2V0X3VzZXIocmVxMzIucmVwbHkudHZhbF91c2VjLCAmcmVxdWVzdC0+cmVwbHkudHZhbF91c2VjKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXEzMiwgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK2RybV9pb2N0bF9jb21wYXRfdCAqZHJtX2NvbXBhdF9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9WRVJTSU9OMzIpXSA9IGNvbXBhdF9kcm1fdmVyc2lvbiwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfVU5JUVVFMzIpXSA9IGNvbXBhdF9kcm1fZ2V0dW5pcXVlLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQVAzMildID0gY29tcGF0X2RybV9nZXRtYXAsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX0NMSUVOVDMyKV0gPSBjb21wYXRfZHJtX2dldGNsaWVudCwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfU1RBVFMzMildID0gY29tcGF0X2RybV9nZXRzdGF0cywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfVU5JUVVFMzIpXSA9IGNvbXBhdF9kcm1fc2V0dW5pcXVlLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9NQVAzMildID0gY29tcGF0X2RybV9hZGRtYXAsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0JVRlMzMildID0gY29tcGF0X2RybV9hZGRidWZzLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01BUktfQlVGUzMyKV0gPSBjb21wYXRfZHJtX21hcmtidWZzLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0lORk9fQlVGUzMyKV0gPSBjb21wYXRfZHJtX2luZm9idWZzLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01BUF9CVUZTMzIpXSA9IGNvbXBhdF9kcm1fbWFwYnVmcywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GUkVFX0JVRlMzMildID0gY29tcGF0X2RybV9mcmVlYnVmcywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9NQVAzMildID0gY29tcGF0X2RybV9ybW1hcCwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYMzIpXSA9IGNvbXBhdF9kcm1fc2V0c2FyZWFjdHgsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWDMyKV0gPSBjb21wYXRfZHJtX2dldHNhcmVhY3R4LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgzMildID0gY29tcGF0X2RybV9yZXNjdHgsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRE1BMzIpXSA9IGNvbXBhdF9kcm1fZG1hLAorI2lmIF9fT1NfSEFTX0FHUAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9FTkFCTEUzMildID0gY29tcGF0X2RybV9hZ3BfZW5hYmxlLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9JTkZPMzIpXSA9IGNvbXBhdF9kcm1fYWdwX2luZm8sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FMTE9DMzIpXSA9IGNvbXBhdF9kcm1fYWdwX2FsbG9jLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9GUkVFMzIpXSA9IGNvbXBhdF9kcm1fYWdwX2ZyZWUsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0JJTkQzMildID0gY29tcGF0X2RybV9hZ3BfYmluZCwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfVU5CSU5EMzIpXSA9IGNvbXBhdF9kcm1fYWdwX3VuYmluZCwKKyNlbmRpZgorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0FMTE9DMzIpXSA9IGNvbXBhdF9kcm1fc2dfYWxsb2MsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0dfRlJFRTMyKV0gPSBjb21wYXRfZHJtX3NnX2ZyZWUsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfV0FJVF9WQkxBTkszMildID0gY29tcGF0X2RybV93YWl0X3ZibGFuaywKK307CisKKy8qKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgMzItYml0IHByb2Nlc3MgcnVubmluZyB1bmRlciBhIDY0LWJpdCBrZXJuZWwKKyAqIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJtLgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIGRybV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm47CisJaW50IHJldDsKKworCWlmIChuciA+PSBEUk1fQVJSQVlfU0laRShkcm1fY29tcGF0X2lvY3RscykpCisJCXJldHVybiAtRU5PVFRZOworCisJZm4gPSBkcm1fY29tcGF0X2lvY3Rsc1tucl07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NvbXBhdF9pb2N0bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCmluZGV4IDJlMjM2ZWIuLmNkZDRhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCkBAIC04OSw3ICs4OSw3IEBACiAgKiBcYyBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCkgYW5kIFxjIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCkgZnVuY3Rpb25zCiAgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uCiAgKi8KLWludCBkcm1faXJxX2luc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3N0YXRpYyBpbnQgZHJtX2lycV9pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHNoX2ZsYWdzPTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKaW5kZXggZDBkNmZjNi4uNDcwMmQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwpAQCAtMzUsNiArMzUsMTEgQEAKIAogI2luY2x1ZGUgImRybVAuaCIKIAorc3RhdGljIGludCBkcm1fbG9ja190cmFuc2Zlcihkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbnRleHQpOworc3RhdGljIGludCBkcm1fbm90aWZpZXIodm9pZCAqcHJpdik7CisKIC8qKiAKICAqIExvY2sgaW9jdGwuCiAgKgpAQCAtMjI1LDggKzIzMCw5IEBACiAgKiBSZXNldHMgdGhlIGxvY2sgZmlsZSBwb2ludGVyLgogICogTWFya3MgdGhlIGxvY2sgYXMgaGVsZCBieSB0aGUgZ2l2ZW4gY29udGV4dCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLgogICovCi1pbnQgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCi0JCSAgICAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLCB1bnNpZ25lZCBpbnQgY29udGV4dCkKK3N0YXRpYyBpbnQgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCisJCQkgICAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCisJCQkgICAgIHVuc2lnbmVkIGludCBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKIApAQCAtMjgyLDcgKzI4OCw3IEBACiAgKiBccmV0dXJuIG9uZSBpZiB0aGUgc2lnbmFsIHNob3VsZCBiZSBkZWxpdmVyZWQgbm9ybWFsbHksIG9yIHplcm8gaWYgdGhlCiAgKiBzaWduYWwgc2hvdWxkIGJlIGJsb2NrZWQuCiAgKi8KLWludCBkcm1fbm90aWZpZXIodm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpCiB7CiAJZHJtX3NpZ2RhdGFfdCAqcyA9IChkcm1fc2lnZGF0YV90ICopcHJpdjsKIAl1bnNpZ25lZCBpbnQgIG9sZCwgbmV3LCBwcmV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwppbmRleCA3ZjUzZjc1Li5hY2UzZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtNjUsMTkgKzY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqIFdyYXBwZXIgYXJvdW5kIGttYWxsb2MoKSAqLwotdm9pZCAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkKLXsKLQl2b2lkICphZGRyOwotCi0JYWRkciA9IGttYWxsb2Moc2l6ZSAqIG5tZW1iLCBHRlBfS0VSTkVMKTsKLQlpZiAoYWRkciAhPSBOVUxMKQotCQltZW1zZXQoKHZvaWQgKilhZGRyLCAwLCBzaXplICogbm1lbWIpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9jYWxsb2MpOwotCiAvKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpIGFuZCBrZnJlZSgpICovCiB2b2lkICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggMTFjNjk1MC4uNzBjYTRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKQEAgLTIyMywzICsyMjMsMTAgQEAKIAl7MHg4MDg2LCAweDI3NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCiAJezAsIDAsIDB9CiAKKyNkZWZpbmUgdmlhZHJ2X1BDSV9JRFMgXAorCXsweDExMDYsIDB4MzAyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDMxMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHg3MjA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4NzIwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCmluZGV4IDZlMDZlOGMuLjQ3NzQwODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTU3LDcgKzU3LDcgQEAKIC8qKgogICogUHJvYyBmaWxlIGxpc3QuCiAgKi8KLXN0cnVjdCBkcm1fcHJvY19saXN0IHsKK3N0YXRpYyBzdHJ1Y3QgZHJtX3Byb2NfbGlzdCB7CiAJY29uc3QgY2hhciAqbmFtZTsJLyoqPCBmaWxlIG5hbWUgKi8KIAlpbnQJICAgKCpmKShjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOwkvKio8IHByb2MgY2FsbGJhY2sqLwogfSBkcm1fcHJvY19saXN0W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKaW5kZXggOGNjYmRlZi4uNDg4MjlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwpAQCAtMTU3LDUyICsxNTcsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLQotLyoqCi0gKiBSZWdpc3Rlci4KLSAqCi0gKiBccGFyYW0gcGRldiAtIFBDSSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBccGFyYW0gZW50IGVudHJ5IGZyb20gdGhlIFBDSSBJRCB0YWJsZSB3aXRoIGRldmljZSB0eXBlIGZsYWdzCi0gKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgotICoKLSAqIEF0dGVtcHQgdG8gZ2V0cyBpbnRlciBtb2R1bGUgImRybSIgaW5mb3JtYXRpb24uIElmIHdlIGFyZSBmaXJzdAotICogdGhlbiByZWdpc3RlciB0aGUgY2hhcmFjdGVyIGRldmljZSBhbmQgaW50ZXIgbW9kdWxlIGluZm9ybWF0aW9uLgotICogVHJ5IGFuZCByZWdpc3RlciwgaWYgd2UgZmFpbCB0byByZWdpc3RlciwgYmFja291dCBwcmV2aW91cyB3b3JrLgotICovCi1pbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCi0JICAgICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKLXsKLQlkcm1fZGV2aWNlX3QgKmRldjsKLQlpbnQgcmV0OwotCi0JRFJNX0RFQlVHKCJcbiIpOwotCi0JZGV2ID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0KLQlpZiAoKHJldCA9IGRybV9maWxsX2luX2RldihkZXYsIHBkZXYsIGVudCwgZHJpdmVyKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJEUk06IEZpbGxfaW5fZGV2IGZhaWxlZC5cbiIpOwotCQlnb3RvIGVycl9nMTsKLQl9Ci0JaWYgKChyZXQgPSBkcm1fZ2V0X2hlYWQoZGV2LCAmZGV2LT5wcmltYXJ5KSkpCi0JCWdvdG8gZXJyX2cxOwotCi0JLyogcG9zdGluaXQgaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzaWdub24gYmFubmVyICovCi0JLyogZHJpdmVycyBhZGQgc2Vjb25kYXJ5IGhlYWRzIGhlcmUgaWYgbmVlZGVkICovCi0JaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+cG9zdGluaXQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKSkpCi0JCWdvdG8gZXJyX2cxOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9nMToKLQlkcm1fZnJlZShkZXYsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2Rldik7Ci0KIC8qKgogICogR2V0IGEgc2Vjb25kYXJ5IG1pbm9yIG51bWJlci4KICAqCkBAIC0yMTQsNyArMTY4LDcgQEAKICAqIGNyZWF0ZSB0aGUgcHJvYyBpbml0IGVudHJ5IHZpYSBwcm9jX2luaXQoKS4gVGhpcyByb3V0aW5lcyBhc3NpZ25zCiAgKiBtaW5vciBudW1iZXJzIHRvIHNlY29uZGFyeSBoZWFkcyBvZiBtdWx0aS1oZWFkZWQgY2FyZHMKICAqLwotaW50IGRybV9nZXRfaGVhZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2hlYWRfdCAqaGVhZCkKK3N0YXRpYyBpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGVhZF90ICpoZWFkKQogewogCWRybV9oZWFkX3QgKipoZWFkcyA9IGRybV9oZWFkczsKIAlpbnQgcmV0OwpAQCAtMjYyLDYgKzIxNiw1MCBAQAogCXJldHVybiByZXQ7CiB9CiAJCQorLyoqCisgKiBSZWdpc3Rlci4KKyAqCisgKiBccGFyYW0gcGRldiAtIFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKiBccGFyYW0gZW50IGVudHJ5IGZyb20gdGhlIFBDSSBJRCB0YWJsZSB3aXRoIGRldmljZSB0eXBlIGZsYWdzCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEF0dGVtcHQgdG8gZ2V0cyBpbnRlciBtb2R1bGUgImRybSIgaW5mb3JtYXRpb24uIElmIHdlIGFyZSBmaXJzdAorICogdGhlbiByZWdpc3RlciB0aGUgY2hhcmFjdGVyIGRldmljZSBhbmQgaW50ZXIgbW9kdWxlIGluZm9ybWF0aW9uLgorICogVHJ5IGFuZCByZWdpc3RlciwgaWYgd2UgZmFpbCB0byByZWdpc3RlciwgYmFja291dCBwcmV2aW91cyB3b3JrLgorICovCitpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCisJICAgICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKK3sKKwlkcm1fZGV2aWNlX3QgKmRldjsKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHKCJcbiIpOworCisJZGV2ID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlpZiAoKHJldCA9IGRybV9maWxsX2luX2RldihkZXYsIHBkZXYsIGVudCwgZHJpdmVyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEUk06IEZpbGxfaW5fZGV2IGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9nMTsKKwl9CisJaWYgKChyZXQgPSBkcm1fZ2V0X2hlYWQoZGV2LCAmZGV2LT5wcmltYXJ5KSkpCisJCWdvdG8gZXJyX2cxOworCisJLyogcG9zdGluaXQgaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzaWdub24gYmFubmVyICovCisJLyogZHJpdmVycyBhZGQgc2Vjb25kYXJ5IGhlYWRzIGhlcmUgaWYgbmVlZGVkICovCisJaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+cG9zdGluaXQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKSkpCisJCWdvdG8gZXJyX2cxOworCisJcmV0dXJuIDA7CisKK2Vycl9nMToKKwlkcm1fZnJlZShkZXYsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2Rldik7CiAKIC8qKgogICogUHV0IGEgZGV2aWNlIG1pbm9yIG51bWJlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCmluZGV4IGZjNzJmMzAuLjYyMTIyMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyB2b2lkIGRybV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIC8qKgogICogXGMgbm9wYWdlIG1ldGhvZCBmb3IgQUdQIHZpcnR1YWwgbWVtb3J5LgpAQCAtMTYzLDcgKzE2NSw3IEBACiAgKiBEZWxldGVzIG1hcCBpbmZvcm1hdGlvbiBpZiB3ZSBhcmUgdGhlIGxhc3QKICAqIHBlcnNvbiB0byBjbG9zZSBhIG1hcHBpbmcgYW5kIGl0J3Mgbm90IGluIHRoZSBnbG9iYWwgbWFwbGlzdC4KICAqLwotdm9pZCBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIHZvaWQgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSpwcml2CT0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CkBAIC0zOTksNyArNDAxLDcgQEAKICAqIENyZWF0ZSBhIG5ldyBkcm1fdm1hX2VudHJ5IHN0cnVjdHVyZSBhcyB0aGUgXHAgdm1hIHByaXZhdGUgZGF0YSBlbnRyeSBhbmQKICAqIGFkZCBpdCB0byBkcm1fZGV2aWNlOjp2bWFsaXN0LgogICovCi12b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIHZvaWQgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkqcHJpdgk9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtNDI4LDcgKzQzMCw3IEBACiAgKiBTZWFyY2ggdGhlIFxwIHZtYSBwcml2YXRlIGRhdGEgZW50cnkgaW4gZHJtX2RldmljZTo6dm1hbGlzdCwgdW5saW5rIGl0LCBhbmQKICAqIGZyZWUgaXQuCiAgKi8KLXZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIHZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKQEAgLTQ2Myw3ICs0NjUsNyBAQAogICogU2V0cyB0aGUgdmlydHVhbCBtZW1vcnkgYXJlYSBvcGVyYXRpb25zIHN0cnVjdHVyZSB0byB2bV9kbWFfb3BzLCB0aGUgZmlsZQogICogcG9pbnRlciwgYW5kIGNhbGxzIHZtX29wZW4oKS4KICAqLwotaW50IGRybV9tbWFwX2RtYShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGRybV9tbWFwX2RtYShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkgKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwppbmRleCAyNDg1N2NjLi4xOGUwYjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCkBAIC05MCwxNiArOTAsNyBAQAogICAgCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX2J1ZmZlcl9mb3BzID0gewotCS5vcGVuCSA9IGRybV9vcGVuLAotCS5mbHVzaAkgPSBkcm1fZmx1c2gsCi0JLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKLQkuaW9jdGwJID0gZHJtX2lvY3RsLAotCS5tbWFwCSA9IGk4MTBfbW1hcF9idWZmZXJzLAotCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKLX07Ci0KLWludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSAgICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkgICAgKmRldjsKQEAgLTEyNiw2ICsxMTcsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODEwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCiBzdGF0aWMgaW50IGk4MTBfbWFwX2J1ZmZlcihkcm1fYnVmX3QgKmJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CkBAIC0xMDAzLDggKzEwMDMsOCBAQAogCX0KIH0KIAotaW50IGk4MTBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGk4MTBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAgICAJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+aGVhZC0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCmluZGV4IGZhMjNjYTQuLjFiNDA1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKQEAgLTExNSw3ICsxMTUsNiBAQAogCiAJCQkJLyogaTgxMF9kbWEuYyAqLwogZXh0ZXJuIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KTsKIGV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwppbmRleCA5OGFkY2NmLi5kYzc3MzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCkBAIC05MiwxNiArOTIsNyBAQAogICAgCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODMwX2J1ZmZlcl9mb3BzID0gewotCS5vcGVuCSA9IGRybV9vcGVuLAotCS5mbHVzaAkgPSBkcm1fZmx1c2gsCi0JLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKLQkuaW9jdGwJID0gZHJtX2lvY3RsLAotCS5tbWFwCSA9IGk4MzBfbW1hcF9idWZmZXJzLAotCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKLX07Ci0KLWludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGk4MzBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSAgICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkgICAgKmRldjsKQEAgLTEyOCw2ICsxMTksMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgzMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODMwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCiBzdGF0aWMgaW50IGk4MzBfbWFwX2J1ZmZlcihkcm1fYnVmX3QgKmJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKaW5kZXggYWE4MGFkNi4uYmMzNmJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwpAQCAtNDAsNyArNDAsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1pbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQorc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCiB7CiAJZGV2LT5jb3VudGVycyArPSA0OwogCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCmluZGV4IGQ0YjJkMDkuLmRmNzc0NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKQEAgLTEyMyw4ICsxMjMsNiBAQAogLyogaTgzMF9kbWEuYyAqLwogZXh0ZXJuIHZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAotZXh0ZXJuIGludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotCiAvKiBpODMwX2lycS5jICovCiBleHRlcm4gaW50IGk4MzBfaXJxX2VtaXQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCAKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwppbmRleCA2ZDc3MjlmLi5hNTkyM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCkBAIC01NCw4ICs1NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0KLWludCBpODMwX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIGludCBpODMwX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNzMsNyArNzIsNyBAQAogfQogCiAKLWludCBpODMwX3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgaXJxX25yKQorc3RhdGljIGludCBpODMwX3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgaXJxX25yKQogewogICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAogCSAgIChkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCmluZGV4IDczMDBhMDkuLmFjZjllNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTEsMTAgKzEsMzAgQEAKIC8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQogICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAorICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJkcm1QLmgiCkBAIC0xMiwyMyArMzIsNiBAQAogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAotZHJtX2lvY3RsX2Rlc2NfdCBpOTE1X2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVCldID0ge2k5MTVfZG1hX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxVU0gpXSA9IHtpOTE1X2ZsdXNoX2lvY3RsLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMSVApXSA9IHtpOTE1X2ZsaXBfYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9CQVRDSEJVRkZFUildID0ge2k5MTVfYmF0Y2hidWZmZXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX0VNSVQpXSA9IHtpOTE1X2lycV9lbWl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9XQUlUKV0gPSB7aTkxNV9pcnFfd2FpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9HRVRQQVJBTSldID0ge2k5MTVfZ2V0cGFyYW0sIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfU0VUUEFSQU0pXSA9IHtpOTE1X3NldHBhcmFtLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0FMTE9DKV0gPSB7aTkxNV9tZW1fYWxsb2MsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRlJFRSldID0ge2k5MTVfbWVtX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0NNREJVRkZFUildID0ge2k5MTVfY21kYnVmZmVyLCAxLCAwfQotfTsKLQotaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOwotCiAvKiBSZWFsbHkgd2FudCBhbiBPUy1pbmRlcGVuZGVudCByZXNldHRhYmxlIHRpbWVyLiAgV291bGQgbGlrZSB0byBoYXZlCiAgKiB0aGlzIGxvb3AgcnVuIGZvciAoZWcpIDMgc2VjLCBidXQgaGF2ZSB0aGUgdGltZXIgcmVzZXQgZXZlcnkgdGltZQogICogdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2VzLCBzbyB0aGF0IEVCVVNZIG9ubHkgaGFwcGVucyBpZiB0aGUgcmluZwpAQCAtNzUsNyArNzgsNyBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9SSU5HX0VNUFRZOwogfQogCi1pbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQogewogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTIyNyw3ICsyMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTkxNV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXY7CkBAIC01MzgsNyArNTQxLDcgQEAKIAlyZXR1cm4gaTkxNV93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKIH0KIAotaW50IGk5MTVfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIApAQCAtNTQ3LDcgKzU1MCw3IEBACiAJcmV0dXJuIGk5MTVfcXVpZXNjZW50KGRldik7CiB9CiAKLWludCBpOTE1X2JhdGNoYnVmZmVyKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X2JhdGNoYnVmZmVyKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU4MSw3ICs1ODQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpOTE1X2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjE3LDE4ICs2MjAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTkxNV9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKLQkJaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGk5MTVfZmxpcF9idWZzKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCkBAIC02MzksNyArNjMxLDcgQEAKIAlyZXR1cm4gaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7CiB9CiAKLWludCBpOTE1X2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02NzQsNyArNjY2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcyMywzICs3MTUsMTkgQEAKIAl9CiB9CiAKK2RybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVQpXSA9IHtpOTE1X2RtYV9pbml0LCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMVVNIKV0gPSB7aTkxNV9mbHVzaF9pb2N0bCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTElQKV0gPSB7aTkxNV9mbGlwX2J1ZnMsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQkFUQ0hCVUZGRVIpXSA9IHtpOTE1X2JhdGNoYnVmZmVyLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9FTUlUKV0gPSB7aTkxNV9pcnFfZW1pdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfV0FJVCldID0ge2k5MTVfaXJxX3dhaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUUEFSQU0pXSA9IHtpOTE1X2dldHBhcmFtLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X1NFVFBBUkFNKV0gPSB7aTkxNV9zZXRwYXJhbSwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9BTExPQyldID0ge2k5MTVfbWVtX2FsbG9jLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZSRUUpXSA9IHtpOTE1X21lbV9mcmVlLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVRfSEVBUCldID0ge2k5MTVfbWVtX2luaXRfaGVhcCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9DTURCVUZGRVIpXSA9IHtpOTE1X2NtZGJ1ZmZlciwgMSwgMH0KK307CisKK2ludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAppbmRleCA3ZTU1ZWRmLi4yM2UwMjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC0xLDMgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZuZGVmIF9JOTE1X0RSTV9IXwogI2RlZmluZSBfSTkxNV9EUk1fSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCmluZGV4IDAwMmI3MDguLjFmNTlkM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKQEAgLTEsMTEgKzEsMzAgQEAKIC8qIGk5MTVfZHJ2LmMgLS0gaTgzMCxpODQ1LGk4NTUsaTg2NSxpOTE1IGRyaXZlciAtKi0gbGludXgtYyAtKi0KICAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAorICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJkcm1QLmgiCkBAIC0xNSw3ICszNCw3IEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKLWludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKIHsKIAlkZXYtPmNvdW50ZXJzICs9IDQ7CiAJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CkBAIC03OCw2ICs5Nyw5IEBACiAJCS5tbWFwID0gZHJtX21tYXAsCiAJCS5wb2xsID0gZHJtX3BvbGwsCiAJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkJLmNvbXBhdF9pb2N0bCA9IGk5MTVfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJfSwKIAkucGNpX2RyaXZlciA9IHsKIAkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAppbmRleCBmNmNhOTJhLi45YzM3ZDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC0xLDEwICsxLDMwIEBACiAvKiBpOTE1X2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgSTkxNSBkcml2ZXIgLSotIGxpbnV4LWMgLSotCiAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCisgKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBfSTkxNV9EUlZfSF8KQEAgLTc5LDE0ICs5OSw2IEBACiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIAogCQkJCS8qIGk5MTVfZG1hLmMgKi8KLWV4dGVybiBpbnQgaTkxNV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgaTkxNV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfYmF0Y2hidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOwpAQCAtOTQsOCArMTA2LDYgQEAKIC8qIGk5MTVfaXJxLmMgKi8KIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucik7Ci1leHRlcm4gaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KTsKIAogZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKmRldik7CkBAIC0xMTAsNiArMTIwLDEwIEBACiBleHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKIAkJCSAgICAgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKIAorZXh0ZXJuIGxvbmcgaTkxNV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CisKKwogI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQogI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQogI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaW9jMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAwOWUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qKgorICogXGZpbGUgaTkxNV9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBpOTE1IERSTS4KKyAqCisgKiBcYXV0aG9yIEFsYW4gSG91cmloYW5lIDxhbGFuaEBmYWlybGl0ZS5kZW1vbi5jby51az4gCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQ29weXJpZ2h0IChDKSBBbGFuIEhvdXJpaGFuZSAyMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9iYXRjaGJ1ZmZlcjMyIHsKKwlpbnQgc3RhcnQ7CQkvKiBhZ3Agb2Zmc2V0ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwl1MzIgY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KK30gZHJtX2k5MTVfYmF0Y2hidWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2JhdGNoYnVmZmVyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXIzMl90IGJhdGNoYnVmZmVyMzI7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBfX3VzZXIgKmJhdGNoYnVmZmVyOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmYmF0Y2hidWZmZXIzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYmF0Y2hidWZmZXIzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwliYXRjaGJ1ZmZlciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqYmF0Y2hidWZmZXIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJhdGNoYnVmZmVyLCBzaXplb2YoKmJhdGNoYnVmZmVyKSkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLnN0YXJ0LCAmYmF0Y2hidWZmZXItPnN0YXJ0KQorCSAgICB8fCBfX3B1dF91c2VyKGJhdGNoYnVmZmVyMzIudXNlZCwgJmJhdGNoYnVmZmVyLT51c2VkKQorCSAgICB8fCBfX3B1dF91c2VyKGJhdGNoYnVmZmVyMzIuRFIxLCAmYmF0Y2hidWZmZXItPkRSMSkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLkRSNCwgJmJhdGNoYnVmZmVyLT5EUjQpCisJICAgIHx8IF9fcHV0X3VzZXIoYmF0Y2hidWZmZXIzMi5udW1fY2xpcHJlY3RzLCAmYmF0Y2hidWZmZXItPm51bV9jbGlwcmVjdHMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyliYXRjaGJ1ZmZlcjMyLmNsaXByZWN0cywKKwkJCSAgJmJhdGNoYnVmZmVyLT5jbGlwcmVjdHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSLCAodW5zaWduZWQgbG9uZykgYmF0Y2hidWZmZXIpOworfQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyMzIgeworCXUzMiBidWY7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNvbW1hbmQgYnVmZmVyICovCisJaW50IHN6OwkJCS8qIG5yIGJ5dGVzIGluIGJ1ZiAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXUzMiBjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2NtZGJ1ZmZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2NtZGJ1ZmZlcjMyX3QgY21kYnVmZmVyMzI7CisJZHJtX2k5MTVfY21kYnVmZmVyX3QgX191c2VyICpjbWRidWZmZXI7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWRidWZmZXIzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kYnVmZmVyMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJY21kYnVmZmVyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWRidWZmZXIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZGJ1ZmZlciwgc2l6ZW9mKCpjbWRidWZmZXIpKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kYnVmZmVyMzIuYnVmLAorCQkJICAmY21kYnVmZmVyLT5idWYpCisJICAgIHx8IF9fcHV0X3VzZXIoY21kYnVmZmVyMzIuc3osICZjbWRidWZmZXItPnN6KQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLkRSMSwgJmNtZGJ1ZmZlci0+RFIxKQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLkRSNCwgJmNtZGJ1ZmZlci0+RFI0KQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLm51bV9jbGlwcmVjdHMsICZjbWRidWZmZXItPm51bV9jbGlwcmVjdHMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWRidWZmZXIzMi5jbGlwcmVjdHMsCisJCQkgICZjbWRidWZmZXItPmNsaXByZWN0cykpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSLCAodW5zaWduZWQgbG9uZykgY21kYnVmZmVyKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQzMiB7CisJdTMyIGlycV9zZXE7Cit9IGRybV9pOTE1X2lycV9lbWl0MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfaTkxNV9pcnFfZW1pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2lycV9lbWl0MzJfdCByZXEzMjsKKwlkcm1faTkxNV9pcnFfZW1pdF90IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5pcnFfc2VxLAorCQkJICAmcmVxdWVzdC0+aXJxX3NlcSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0zMiB7CisJaW50IHBhcmFtOworCXUzMiB2YWx1ZTsKK30gZHJtX2k5MTVfZ2V0cGFyYW0zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2dldHBhcmFtKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2k5MTVfZ2V0cGFyYW0zMl90IHJlcTMyOworCWRybV9pOTE1X2dldHBhcmFtX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5wYXJhbSwgJnJlcXVlc3QtPnBhcmFtKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnZhbHVlLAorCQkJICAmcmVxdWVzdC0+dmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jMzIgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwl1MzIgcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgYWdwICovCit9IGRybV9pOTE1X21lbV9hbGxvYzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2k5MTVfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1faTkxNV9tZW1fYWxsb2MzMl90IHJlcTMyOworCWRybV9pOTE1X21lbV9hbGxvY190IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucmVnaW9uLCAmcmVxdWVzdC0+cmVnaW9uKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmFsaWdubWVudCwgJnJlcXVlc3QtPmFsaWdubWVudCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5zaXplLCAmcmVxdWVzdC0+c2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5yZWdpb25fb2Zmc2V0LAorCQkJICAmcmVxdWVzdC0+cmVnaW9uX29mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfSTkxNV9BTExPQywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCisKK2RybV9pb2N0bF9jb21wYXRfdCAqaTkxNV9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9JOTE1X0JBVENIQlVGRkVSXSA9IGNvbXBhdF9pOTE1X2JhdGNoYnVmZmVyLAorCVtEUk1fSTkxNV9DTURCVUZGRVJdID0gY29tcGF0X2k5MTVfY21kYnVmZmVyLAorCVtEUk1fSTkxNV9HRVRQQVJBTV0gPSBjb21wYXRfaTkxNV9nZXRwYXJhbSwKKwlbRFJNX0k5MTVfSVJRX0VNSVRdID0gY29tcGF0X2k5MTVfaXJxX2VtaXQsCisJW0RSTV9JOTE1X0FMTE9DXSA9IGNvbXBhdF9pOTE1X2FsbG9jCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKGk5MTVfY29tcGF0X2lvY3RscykpCisJCWZuID0gaTkxNV9jb21wYXRfaW9jdGxzW25yIC0gRFJNX0NPTU1BTkRfQkFTRV07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwppbmRleCBiMDIzOTI2Li40ZmE0NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCkBAIC0xLDEwICsxLDMwIEBACiAvKiBpOTE1X2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTkxNSAtKi0gbGludXgtYyAtKi0KICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKKyAqCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgpAQCAtMzYsNyArNTYsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcmV0OwpAQCAtNTYsNyArNzYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwppbmRleCBkNTRhMzAwLi45YjE2OThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCkBAIC0xLDEwICsxLDMwIEBACiAvKiBpOTE1X21lbS5jIC0tIFNpbXBsZSBhZ3AvZmIgbWVtb3J5IG1hbmFnZXIgZm9yIGk5MTUgLSotIGxpbnV4LWMgLSotCiAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCisgKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImRybVAuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKaW5kZXggMjJkYWIzZS4uODQ0Y2NhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKQEAgLTEwMSw2ICsxMDEsOSBAQAogCQkubW1hcCA9IGRybV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCS5jb21wYXRfaW9jdGwgPSBtZ2FfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJfSwKIAkucGNpX2RyaXZlciA9IHsKIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKaW5kZXggMWQ4NGExZS4uOTQxMmUyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCkBAIC0xMzcsNiArMTM3LDggQEAKIGV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiBsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogI2RlZmluZSBtZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpCURSTV9XUklURU1FTU9SWUJBUlJJRVIoKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc0NWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiBcZmlsZSBtZ2FfaW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgTUdBIERSTS4KKyAqCisgKiBcYXV0aG9yIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPiB3aXRoIGNvZGUgZnJvbSBwYXRjaGVzIGJ5IEVnYmVydCBFaWNoCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQ29weXJpZ2h0IChDKSBFZ2JlcnQgRWljaCAyMDAzLDIwMDQKKyAqIENvcHlyaWdodCAoQykgRGF2ZSBBaXJsaWUgMjAwNQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJtLmgiCisKK3R5cGVkZWYgc3RydWN0IGRybTMyX21nYV9pbml0IHsKKwlpbnQgZnVuYzsKKyAgIAl1MzIgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGNoaXBzZXQ7CisgICAJaW50IHNncmFtOworCXVuc2lnbmVkIGludCBtYWNjZXNzOworICAgCXVuc2lnbmVkIGludCBmYl9jcHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisgICAJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworICAgCXVuc2lnbmVkIGludCBkZXB0aF9jcHA7CisgICAJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisgICAJdW5zaWduZWQgaW50IHRleHR1cmVfb2Zmc2V0W01HQV9OUl9URVhfSEVBUFNdOworICAgCXVuc2lnbmVkIGludCB0ZXh0dXJlX3NpemVbTUdBX05SX1RFWF9IRUFQU107CisJdTMyIGZiX29mZnNldDsKKwl1MzIgbW1pb19vZmZzZXQ7CisJdTMyIHN0YXR1c19vZmZzZXQ7CisJdTMyIHdhcnBfb2Zmc2V0OworCXUzMiBwcmltYXJ5X29mZnNldDsKKwl1MzIgYnVmZmVyc19vZmZzZXQ7Cit9IGRybV9tZ2FfaW5pdDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X21nYV9pbml0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX21nYV9pbml0MzJfdCBpbml0MzI7CisJZHJtX21nYV9pbml0X3QgX191c2VyICppbml0OworCWludCBlcnIgPSAwLCBpOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmaW5pdDMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbml0MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaW5pdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5pdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5pdCwgc2l6ZW9mKCppbml0KSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnVuYywgJmluaXQtPmZ1bmMpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnNhcmVhX3ByaXZfb2Zmc2V0LCAmaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmNoaXBzZXQsICZpbml0LT5jaGlwc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zZ3JhbSwgJmluaXQtPnNncmFtKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5tYWNjZXNzLCAmaW5pdC0+bWFjY2VzcykKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZmJfY3BwLCAmaW5pdC0+ZmJfY3BwKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mcm9udF9vZmZzZXQsICZpbml0LT5mcm9udF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZyb250X3BpdGNoLCAmaW5pdC0+ZnJvbnRfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJhY2tfb2Zmc2V0LCAmaW5pdC0+YmFja19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJhY2tfcGl0Y2gsICZpbml0LT5iYWNrX3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9jcHAsICZpbml0LT5kZXB0aF9jcHApCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX29mZnNldCwgJmluaXQtPmRlcHRoX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfcGl0Y2gsICZpbml0LT5kZXB0aF9waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZmJfb2Zmc2V0LCAmaW5pdC0+ZmJfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5tbWlvX29mZnNldCwgJmluaXQtPm1taW9fb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zdGF0dXNfb2Zmc2V0LCAmaW5pdC0+c3RhdHVzX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIud2FycF9vZmZzZXQsICZpbml0LT53YXJwX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucHJpbWFyeV9vZmZzZXQsICZpbml0LT5wcmltYXJ5X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYnVmZmVyc19vZmZzZXQsICZpbml0LT5idWZmZXJzX29mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWZvciAoaT0wOyBpPE1HQV9OUl9URVhfSEVBUFM7IGkrKykKKwl7CisJCWVyciB8PSBfX3B1dF91c2VyKGluaXQzMi50ZXh0dXJlX29mZnNldFtpXSwgJmluaXQtPnRleHR1cmVfb2Zmc2V0W2ldKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoaW5pdDMyLnRleHR1cmVfc2l6ZVtpXSwgJmluaXQtPnRleHR1cmVfc2l6ZVtpXSk7CisJfQorCWlmIChlcnIpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX01HQV9JTklULCAodW5zaWduZWQgbG9uZykgaW5pdCk7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9nZXRwYXJhbTMyIHsKKwlpbnQgcGFyYW07CisJdTMyIHZhbHVlOworfSBkcm1fbWdhX2dldHBhcmFtMzJfdDsKKworCitzdGF0aWMgaW50IGNvbXBhdF9tZ2FfZ2V0cGFyYW0oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX21nYV9nZXRwYXJhbTMyX3QgZ2V0cGFyYW0zMjsKKwlkcm1fbWdhX2dldHBhcmFtX3QgX191c2VyICpnZXRwYXJhbTsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldHBhcmFtMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGdldHBhcmFtMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlnZXRwYXJhbSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZ2V0cGFyYW0pKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGdldHBhcmFtLCBzaXplb2YoKmdldHBhcmFtKSkKKwkgICAgfHwgX19wdXRfdXNlcihnZXRwYXJhbTMyLnBhcmFtLCAmZ2V0cGFyYW0tPnBhcmFtKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWdldHBhcmFtMzIudmFsdWUsICZnZXRwYXJhbS0+dmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsIAorCQkJIERSTV9JT0NUTF9NR0FfR0VUUEFSQU0sICh1bnNpZ25lZCBsb25nKWdldHBhcmFtKTsKK30KKworZHJtX2lvY3RsX2NvbXBhdF90ICptZ2FfY29tcGF0X2lvY3Rsc1tdID0geworCVtEUk1fTUdBX0lOSVRdID0gY29tcGF0X21nYV9pbml0LAorCVtEUk1fTUdBX0dFVFBBUkFNXSA9IGNvbXBhdF9tZ2FfZ2V0cGFyYW0sCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG5yID0gRFJNX0lPQ1RMX05SKGNtZCk7CisJZHJtX2lvY3RsX2NvbXBhdF90ICpmbiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UpCisJCXJldHVybiBkcm1fY29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwkKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FSUkFZX1NJWkUobWdhX2NvbXBhdF9pb2N0bHMpKQorCQlmbiA9IG1nYV9jb21wYXRfaW9jdGxzW25yIC0gRFJNX0NPTU1BTkRfQkFTRV07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwppbmRleCBjZWQ2MzgxLi5iYzQ0NmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCkBAIC05Niw2ICs5Niw5IEBACiAJCS5tbWFwID0gZHJtX21tYXAsCiAJCS5wb2xsID0gZHJtX3BvbGwsCiAJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkJLmNvbXBhdF9pb2N0bCA9IHIxMjhfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJfSwKIAkucGNpX2RyaXZlciA9IHsKIAkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAppbmRleCBjZjFhYTVkLi4wZmI2ODdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaApAQCAtMTU2LDYgKzE1Niw5IEBACiBleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOwogCitleHRlcm4gbG9uZyByMTI4X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMsIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgYW5kIGRybUFkZE1hcCBjb25zdGFudHMKICAqIGZvciBSYWdlIDEyOCBrZXJuZWwgZHJpdmVyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pb2MzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTk4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaW9jMzIuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoqCisgKiBcZmlsZSByMTI4X2lvYzMyLmMKKyAqCisgKiAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgdGhlIFIxMjggRFJNLgorICoKKyAqIFxhdXRob3IgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+IHdpdGggY29kZSBmcm9tIHBhdGNoZXMgYnkgRWdiZXJ0IEVpY2gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDIwMDUKKyAqIENvcHlyaWdodCAoQykgRWdiZXJ0IEVpY2ggMjAwMywyMDA0CisgKiBDb3B5cmlnaHQgKEMpIERhdmUgQWlybGllIDIwMDUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5pdDMyIHsKKwlpbnQgZnVuYzsKKwl1bnNpZ25lZCBpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlpbnQgY2NlX21vZGU7CisJaW50IGNjZV9zZWN1cmU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgc3Bhbl9vZmZzZXQ7CisKKwl1bnNpZ25lZCBpbnQgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGludCBhZ3BfdGV4dHVyZXNfb2Zmc2V0OworfSBkcm1fcjEyOF9pbml0MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcjEyOF9pbml0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yMTI4X2luaXQzMl90IGluaXQzMjsKKwlkcm1fcjEyOF9pbml0X3QgX191c2VyICppbml0OworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmaW5pdDMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbml0MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaW5pdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5pdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5pdCwgc2l6ZW9mKCppbml0KSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnVuYywgJmluaXQtPmZ1bmMpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnNhcmVhX3ByaXZfb2Zmc2V0LCAmaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmlzX3BjaSwgJmluaXQtPmlzX3BjaSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuY2NlX21vZGUsICZpbml0LT5jY2VfbW9kZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuY2NlX3NlY3VyZSwgJmluaXQtPmNjZV9zZWN1cmUpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfc2l6ZSwgJmluaXQtPnJpbmdfc2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIudXNlY190aW1lb3V0LCAmaW5pdC0+dXNlY190aW1lb3V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9icHAsICZpbml0LT5mYl9icHApCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZyb250X29mZnNldCwgJmluaXQtPmZyb250X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfcGl0Y2gsICZpbml0LT5mcm9udF9waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19vZmZzZXQsICZpbml0LT5iYWNrX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19waXRjaCwgJmluaXQtPmJhY2tfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX2JwcCwgJmluaXQtPmRlcHRoX2JwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfb2Zmc2V0LCAmaW5pdC0+ZGVwdGhfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9waXRjaCwgJmluaXQtPmRlcHRoX3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zcGFuX29mZnNldCwgJmluaXQtPnNwYW5fb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9vZmZzZXQsICZpbml0LT5mYl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLm1taW9fb2Zmc2V0LCAmaW5pdC0+bW1pb19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfb2Zmc2V0LCAmaW5pdC0+cmluZ19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfcnB0cl9vZmZzZXQsICZpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5idWZmZXJzX29mZnNldCwgJmluaXQtPmJ1ZmZlcnNfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5hZ3BfdGV4dHVyZXNfb2Zmc2V0LCAmaW5pdC0+YWdwX3RleHR1cmVzX29mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1IxMjhfSU5JVCwgKHVuc2lnbmVkIGxvbmcpaW5pdCk7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZGVwdGgzMiB7CisJaW50IGZ1bmM7CisJaW50IG47CisJdTMyIHg7CisJdTMyIHk7CisJdTMyIGJ1ZmZlcjsKKwl1MzIgbWFzazsKK30gZHJtX3IxMjhfZGVwdGgzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yMTI4X2RlcHRoKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcjEyOF9kZXB0aDMyX3QgZGVwdGgzMjsKKwlkcm1fcjEyOF9kZXB0aF90IF9fdXNlciAqZGVwdGg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRlcHRoMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGRlcHRoMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXB0aCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZGVwdGgpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRlcHRoLCBzaXplb2YoKmRlcHRoKSkKKwkgICAgfHwgX19wdXRfdXNlcihkZXB0aDMyLmZ1bmMsICZkZXB0aC0+ZnVuYykKKwkgICAgfHwgX19wdXRfdXNlcihkZXB0aDMyLm4sICZkZXB0aC0+bikKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWRlcHRoMzIueCwgJmRlcHRoLT54KQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZGVwdGgzMi55LCAmZGVwdGgtPnkpCisJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylkZXB0aDMyLmJ1ZmZlciwgJmRlcHRoLT5idWZmZXIpCisJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGNoYXIgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZGVwdGgzMi5tYXNrLCAmZGVwdGgtPm1hc2spKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SMTI4X0RFUFRILCAodW5zaWduZWQgbG9uZylkZXB0aCk7CQorCQorfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9zdGlwcGxlMzIgeworCXUzMiBtYXNrOworfSBkcm1fcjEyOF9zdGlwcGxlMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcjEyOF9zdGlwcGxlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yMTI4X3N0aXBwbGUzMl90IHN0aXBwbGUzMjsKKwlkcm1fcjEyOF9zdGlwcGxlX3QgX191c2VyICpzdGlwcGxlOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGlwcGxlMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0aXBwbGUzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0aXBwbGUgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnN0aXBwbGUpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHN0aXBwbGUsIHNpemVvZigqc3RpcHBsZSkpCisJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylzdGlwcGxlMzIubWFzaywgJnN0aXBwbGUtPm1hc2spKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1IxMjhfU1RJUFBMRSwgKHVuc2lnbmVkIGxvbmcpc3RpcHBsZSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2dldHBhcmFtMzIgeworCWludCBwYXJhbTsKKwl1MzIgdmFsdWU7Cit9IGRybV9yMTI4X2dldHBhcmFtMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcjEyOF9nZXRwYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcjEyOF9nZXRwYXJhbTMyX3QgZ2V0cGFyYW0zMjsKKwlkcm1fcjEyOF9nZXRwYXJhbV90IF9fdXNlciAqZ2V0cGFyYW07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldHBhcmFtMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGdldHBhcmFtMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlnZXRwYXJhbSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZ2V0cGFyYW0pKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGdldHBhcmFtLCBzaXplb2YoKmdldHBhcmFtKSkKKwkgICAgfHwgX19wdXRfdXNlcihnZXRwYXJhbTMyLnBhcmFtLCAmZ2V0cGFyYW0tPnBhcmFtKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWdldHBhcmFtMzIudmFsdWUsICZnZXRwYXJhbS0+dmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SMTI4X0dFVFBBUkFNLCAodW5zaWduZWQgbG9uZylnZXRwYXJhbSk7Cit9CisKK2RybV9pb2N0bF9jb21wYXRfdCAqcjEyOF9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9SMTI4X0lOSVRdID0gY29tcGF0X3IxMjhfaW5pdCwKKwlbRFJNX1IxMjhfREVQVEhdID0gY29tcGF0X3IxMjhfZGVwdGgsCisJW0RSTV9SMTI4X1NUSVBQTEVdID0gY29tcGF0X3IxMjhfc3RpcHBsZSwKKwlbRFJNX1IxMjhfR0VUUEFSQU1dID0gY29tcGF0X3IxMjhfZ2V0cGFyYW0sCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIHIxMjhfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FSUkFZX1NJWkUocjEyOF9jb21wYXRfaW9jdGxzKSkKKwkJZm4gPSByMTI4X2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKKworCWxvY2tfa2VybmVsKCk7CQkvKiBYWFggZm9yIG5vdyAqLworCWlmIChmbiAhPSBOVUxMKQorCQlyZXQgPSAoKmZuKShmaWxwLCBjbWQsIGFyZyk7CisJZWxzZQorCQlyZXQgPSBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwppbmRleCA1M2FmNjkxLi40MjZhNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtMTMwNyw3ICsxMzA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHIxMjhfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQorc3RhdGljIGludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlEUk1fREVCVUcoICJcbiIgKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKaW5kZXggN2I5ODNkOS4uMThlNGU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKQEAgLTEwMSw2ICsxMDEsOSBAQAogCQkubW1hcCA9IGRybV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCS5jb21wYXRfaW9jdGwgPSByYWRlb25fY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJfSwKIAkucGNpX2RyaXZlciA9IHsKIAkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKaW5kZXggNTgzNzA5OC4uNzcxYWE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKQEAgLTMxNyw2ICszMTcsOSBAQAogZXh0ZXJuIGludCByYWRlb25fcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKTsKIGV4dGVybiBpbnQgcmFkZW9uX3Bvc3RjbGVhbnVwKCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ICk7CiAKK2V4dGVybiBsb25nIHJhZGVvbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworCiAvKiBGbGFncyBmb3Igc3RhdHMuYm94ZXMKICAqLwogI2RlZmluZSBSQURFT05fQk9YX0RNQV9JRExFICAgICAgMHgxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU2MTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoqCisgKiBcZmlsZSByYWRlb25faW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgUmFkZW9uIERSTS4KKyAqCisgKiBcYXV0aG9yIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luaXQzMiB7CisJaW50IGZ1bmM7CisJdTMyIHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBpc19wY2k7CisJaW50IGNwX21vZGU7CisJaW50IGdhcnRfc2l6ZTsKKwlpbnQgcmluZ19zaXplOworCWludCB1c2VjX3RpbWVvdXQ7CisKKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJdTMyIGZiX29mZnNldDsKKwl1MzIgbW1pb19vZmZzZXQ7CisJdTMyIHJpbmdfb2Zmc2V0OworCXUzMiByaW5nX3JwdHJfb2Zmc2V0OworCXUzMiBidWZmZXJzX29mZnNldDsKKwl1MzIgZ2FydF90ZXh0dXJlc19vZmZzZXQ7Cit9IGRybV9yYWRlb25faW5pdDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9jcF9pbml0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcmFkZW9uX2luaXQzMl90IGluaXQzMjsKKwlkcm1fcmFkZW9uX2luaXRfdCBfX3VzZXIgKmluaXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW5pdDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5pdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5pdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5pdCwgc2l6ZW9mKCppbml0KSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnVuYywgJmluaXQtPmZ1bmMpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnNhcmVhX3ByaXZfb2Zmc2V0LCAmaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmlzX3BjaSwgJmluaXQtPmlzX3BjaSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuY3BfbW9kZSwgJmluaXQtPmNwX21vZGUpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmdhcnRfc2l6ZSwgJmluaXQtPmdhcnRfc2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19zaXplLCAmaW5pdC0+cmluZ19zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi51c2VjX3RpbWVvdXQsICZpbml0LT51c2VjX3RpbWVvdXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX2JwcCwgJmluaXQtPmZiX2JwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfb2Zmc2V0LCAmaW5pdC0+ZnJvbnRfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mcm9udF9waXRjaCwgJmluaXQtPmZyb250X3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX29mZnNldCwgJmluaXQtPmJhY2tfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX3BpdGNoLCAmaW5pdC0+YmFja19waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfYnBwLCAmaW5pdC0+ZGVwdGhfYnBwKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9vZmZzZXQsICZpbml0LT5kZXB0aF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX3BpdGNoLCAmaW5pdC0+ZGVwdGhfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX29mZnNldCwgJmluaXQtPmZiX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIubW1pb19vZmZzZXQsICZpbml0LT5tbWlvX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19vZmZzZXQsICZpbml0LT5yaW5nX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19ycHRyX29mZnNldCwgJmluaXQtPnJpbmdfcnB0cl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJ1ZmZlcnNfb2Zmc2V0LCAmaW5pdC0+YnVmZmVyc19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmdhcnRfdGV4dHVyZXNfb2Zmc2V0LAorCQkJICAmaW5pdC0+Z2FydF90ZXh0dXJlc19vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9DUF9JTklULCAodW5zaWduZWQgbG9uZykgaW5pdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY2xlYXIzMiB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7ICAgLyogbWlzbmFtZWQgZmllbGQ6ICBzaG91bGQgYmUgc3RlbmNpbCAqLworCXUzMgkgICAgIGRlcHRoX2JveGVzOworfSBkcm1fcmFkZW9uX2NsZWFyMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcmFkZW9uX2NwX2NsZWFyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl9jbGVhcjMyX3QgY2xyMzI7CisJZHJtX3JhZGVvbl9jbGVhcl90IF9fdXNlciAqY2xyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbHIzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY2xyMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljbHIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNscikpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgY2xyLCBzaXplb2YoKmNscikpCisJICAgIHx8IF9fcHV0X3VzZXIoY2xyMzIuZmxhZ3MsICZjbHItPmZsYWdzKQorCSAgICB8fCBfX3B1dF91c2VyKGNscjMyLmNsZWFyX2NvbG9yLCAmY2xyLT5jbGVhcl9jb2xvcikKKwkgICAgfHwgX19wdXRfdXNlcihjbHIzMi5jbGVhcl9kZXB0aCwgJmNsci0+Y2xlYXJfZGVwdGgpCisJICAgIHx8IF9fcHV0X3VzZXIoY2xyMzIuY29sb3JfbWFzaywgJmNsci0+Y29sb3JfbWFzaykKKwkgICAgfHwgX19wdXRfdXNlcihjbHIzMi5kZXB0aF9tYXNrLCAmY2xyLT5kZXB0aF9tYXNrKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNscjMyLmRlcHRoX2JveGVzLAorCQkJICAmY2xyLT5kZXB0aF9ib3hlcykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX0NMRUFSLCAodW5zaWduZWQgbG9uZykgY2xyKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdGlwcGxlMzIgeworCXUzMiBtYXNrOworfSBkcm1fcmFkZW9uX3N0aXBwbGUzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fY3Bfc3RpcHBsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl9zdGlwcGxlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCWRybV9yYWRlb25fc3RpcHBsZV90IF9fdXNlciAqcmVxdWVzdDsKKwl1MzIgbWFzazsKKworCWlmIChnZXRfdXNlcihtYXNrLCAmYXJncC0+bWFzaykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSBtYXNrLAorCQkJICAmcmVxdWVzdC0+bWFzaykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX1NUSVBQTEUsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXhfaW1hZ2UzMiB7CisJdW5zaWduZWQgaW50IHgsIHk7CQkvKiBCbGl0IGNvb3JkaW5hdGVzICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJdTMyIGRhdGE7Cit9IGRybV9yYWRlb25fdGV4X2ltYWdlMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXh0dXJlMzIgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHBpdGNoOworCWludCBmb3JtYXQ7CisJaW50IHdpZHRoOwkJCS8qIFRleHR1cmUgaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKwlpbnQgaGVpZ2h0OworCXUzMiBpbWFnZTsKK30gZHJtX3JhZGVvbl90ZXh0dXJlMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcmFkZW9uX2NwX3RleHR1cmUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fdGV4dHVyZTMyX3QgcmVxMzI7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3QgX191c2VyICpyZXF1ZXN0OworCWRybV9yYWRlb25fdGV4X2ltYWdlMzJfdCBpbWczMjsKKwlkcm1fcmFkZW9uX3RleF9pbWFnZV90IF9fdXNlciAqaW1hZ2U7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJlcTMyLmltYWdlID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmaW1nMzIsICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLmltYWdlLAorCQkJICAgc2l6ZW9mKGltZzMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkgKyBzaXplb2YoKmltYWdlKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LAorCQkgICAgICAgc2l6ZW9mKCpyZXF1ZXN0KSArIHNpemVvZigqaW1hZ2UpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaW1hZ2UgPSAoZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKikgKHJlcXVlc3QgKyAxKTsKKworCWlmIChfX3B1dF91c2VyKHJlcTMyLm9mZnNldCwgJnJlcXVlc3QtPm9mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5waXRjaCwgJnJlcXVlc3QtPnBpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmZvcm1hdCwgJnJlcXVlc3QtPmZvcm1hdCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi53aWR0aCwgJnJlcXVlc3QtPndpZHRoKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmhlaWdodCwgJnJlcXVlc3QtPmhlaWdodCkKKwkgICAgfHwgX19wdXRfdXNlcihpbWFnZSwgJnJlcXVlc3QtPmltYWdlKQorCSAgICB8fCBfX3B1dF91c2VyKGltZzMyLngsICZpbWFnZS0+eCkKKwkgICAgfHwgX19wdXRfdXNlcihpbWczMi55LCAmaW1hZ2UtPnkpCisJICAgIHx8IF9fcHV0X3VzZXIoaW1nMzIud2lkdGgsICZpbWFnZS0+d2lkdGgpCisJICAgIHx8IF9fcHV0X3VzZXIoaW1nMzIuaGVpZ2h0LCAmaW1hZ2UtPmhlaWdodCkKKwkgICAgfHwgX19wdXRfdXNlcigoY29uc3Qgdm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylpbWczMi5kYXRhLAorCQkJICAmaW1hZ2UtPmRhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9URVhUVVJFLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdmVydGV4Ml8zMiB7CisJaW50IGlkeDsJCQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworCWludCBucl9zdGF0ZXM7CisJdTMyIHN0YXRlOworCWludCBucl9wcmltczsKKwl1MzIgcHJpbTsKK30gZHJtX3JhZGVvbl92ZXJ0ZXgyXzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9jcF92ZXJ0ZXgyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcmFkZW9uX3ZlcnRleDJfMzJfdCByZXEzMjsKKwlkcm1fcmFkZW9uX3ZlcnRleDJfdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmlkeCwgJnJlcXVlc3QtPmlkeCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5kaXNjYXJkLCAmcmVxdWVzdC0+ZGlzY2FyZCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5ucl9zdGF0ZXMsICZyZXF1ZXN0LT5ucl9zdGF0ZXMpCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIuc3RhdGUsCisJCQkgICZyZXF1ZXN0LT5zdGF0ZSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5ucl9wcmltcywgJnJlcXVlc3QtPm5yX3ByaW1zKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnByaW0sCisJCQkgICZyZXF1ZXN0LT5wcmltKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SQURFT05fVkVSVEVYMiwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NtZF9idWZmZXIzMiB7CisJaW50IGJ1ZnN6OworCXUzMiBidWY7CisJaW50IG5ib3g7CisJdTMyIGJveGVzOworfSBkcm1fcmFkZW9uX2NtZF9idWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fY3BfY21kYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fY21kX2J1ZmZlcjMyX3QgcmVxMzI7CisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5idWZzeiwgJnJlcXVlc3QtPmJ1ZnN6KQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLmJ1ZiwKKwkJCSAgJnJlcXVlc3QtPmJ1ZikKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5uYm94LCAmcmVxdWVzdC0+bmJveCkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5ib3hlcywKKwkJCSAgJnJlcXVlc3QtPmJveGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SQURFT05fQ01EQlVGLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0zMiB7CisJaW50IHBhcmFtOworCXUzMiB2YWx1ZTsKK30gZHJtX3JhZGVvbl9nZXRwYXJhbTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9jcF9nZXRwYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fZ2V0cGFyYW0zMl90IHJlcTMyOworCWRybV9yYWRlb25fZ2V0cGFyYW1fdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnBhcmFtLCAmcmVxdWVzdC0+cGFyYW0pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIudmFsdWUsCisJCQkgICZyZXF1ZXN0LT52YWx1ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX0dFVFBBUkFNLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2FsbG9jMzIgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwl1MzIgcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgR0FSVCAqLworfSBkcm1fcmFkZW9uX21lbV9hbGxvYzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9tZW1fYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl9tZW1fYWxsb2MzMl90IHJlcTMyOworCWRybV9yYWRlb25fbWVtX2FsbG9jX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5yZWdpb24sICZyZXF1ZXN0LT5yZWdpb24pCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuYWxpZ25tZW50LCAmcmVxdWVzdC0+YWxpZ25tZW50KQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnNpemUsICZyZXF1ZXN0LT5zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIucmVnaW9uX29mZnNldCwKKwkJCSAgJnJlcXVlc3QtPnJlZ2lvbl9vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9BTExPQywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2lycV9lbWl0MzIgeworCXUzMiBpcnFfc2VxOworfSBkcm1fcmFkZW9uX2lycV9lbWl0MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcmFkZW9uX2lycV9lbWl0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl9pcnFfZW1pdDMyX3QgcmVxMzI7CisJZHJtX3JhZGVvbl9pcnFfZW1pdF90IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5pcnFfc2VxLAorCQkJICAmcmVxdWVzdC0+aXJxX3NlcSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX0lSUV9FTUlULCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK2RybV9pb2N0bF9jb21wYXRfdCAqcmFkZW9uX2NvbXBhdF9pb2N0bHNbXSA9IHsKKwlbRFJNX1JBREVPTl9DUF9JTklUXSA9IGNvbXBhdF9yYWRlb25fY3BfaW5pdCwKKwlbRFJNX1JBREVPTl9DTEVBUl0gPSBjb21wYXRfcmFkZW9uX2NwX2NsZWFyLAorCVtEUk1fUkFERU9OX1NUSVBQTEVdID0gY29tcGF0X3JhZGVvbl9jcF9zdGlwcGxlLAorCVtEUk1fUkFERU9OX1RFWFRVUkVdID0gY29tcGF0X3JhZGVvbl9jcF90ZXh0dXJlLAorCVtEUk1fUkFERU9OX1ZFUlRFWDJdID0gY29tcGF0X3JhZGVvbl9jcF92ZXJ0ZXgyLAorCVtEUk1fUkFERU9OX0NNREJVRl0gPSBjb21wYXRfcmFkZW9uX2NwX2NtZGJ1ZiwKKwlbRFJNX1JBREVPTl9HRVRQQVJBTV0gPSBjb21wYXRfcmFkZW9uX2NwX2dldHBhcmFtLAorCVtEUk1fUkFERU9OX0FMTE9DXSA9IGNvbXBhdF9yYWRlb25fbWVtX2FsbG9jLAorCVtEUk1fUkFERU9OX0lSUV9FTUlUXSA9IGNvbXBhdF9yYWRlb25faXJxX2VtaXQsCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIHJhZGVvbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG5yID0gRFJNX0lPQ1RMX05SKGNtZCk7CisJZHJtX2lvY3RsX2NvbXBhdF90ICpmbiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UpCisJCXJldHVybiBkcm1fY29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQVJSQVlfU0laRShyYWRlb25fY29tcGF0X2lvY3RscykpCisJCWZuID0gcmFkZW9uX2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKKworCWxvY2tfa2VybmVsKCk7CQkvKiBYWFggZm9yIG5vdyAqLworCWlmIChmbiAhPSBOVUxMKQorCQlyZXQgPSAoKmZuKShmaWxwLCBjbWQsIGFyZyk7CisJZWxzZQorCQlyZXQgPSBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwppbmRleCBjZDI1ZjI4Li40MDQ3NGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpAQCAtMzUsNiArMzUsMTQgQEAKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgogCitzdGF0aWMgX19pbmxpbmVfXyB1MzIgcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKK3sKKwl1MzIgaXJxcyA9IFJBREVPTl9SRUFEKFJBREVPTl9HRU5fSU5UX1NUQVRVUykgJiBtYXNrOworCWlmIChpcnFzKQorCQlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfU1RBVFVTLCBpcnFzKTsKKwlyZXR1cm4gaXJxczsKK30KKwogLyogSW50ZXJydXB0cyAtIFVzZWQgZm9yIGRldmljZSBzeW5jaHJvbml6YXRpb24gYW5kIGZsdXNoaW5nIGluIHRoZQogICogZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6CiAgKgpAQCAtNjMsOCArNzEsOCBAQAogCS8qIE9ubHkgY29uc2lkZXIgdGhlIGJpdHMgd2UncmUgaW50ZXJlc3RlZCBpbiAtIG90aGVycyBjb3VsZCBiZSB1c2VkCiAJICogb3V0c2lkZSB0aGUgRFJNCiAJICovCi0Jc3RhdCA9IFJBREVPTl9SRUFEKFJBREVPTl9HRU5fSU5UX1NUQVRVUykKLQkgICAgICYgKFJBREVPTl9TV19JTlRfVEVTVCB8IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKTsKKwlzdGF0ID0gcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwgCisJCQkJCQkgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSk7CiAJaWYgKCFzdGF0KQogCQlyZXR1cm4gSVJRX05PTkU7CiAKQEAgLTgwLDE5ICs4OCw5IEBACiAJCWRybV92Ymxfc2VuZF9zaWduYWxzKCBkZXYgKTsKIAl9CiAKLQkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHRzIHdlIGhhbmRsZSAqLwotCVJBREVPTl9XUklURShSQURFT05fR0VOX0lOVF9TVEFUVVMsIHN0YXQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCi17Ci0JdTMyIHRtcCA9IFJBREVPTl9SRUFEKCBSQURFT05fR0VOX0lOVF9TVEFUVVMgKQotCQkmIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpOwotCWlmICh0bXApCi0JCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfU1RBVFVTLCB0bXAgKTsKLX0KLQogc3RhdGljIGludCByYWRlb25fZW1pdF9pcnEoZHJtX2RldmljZV90ICpkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0MSw3ICsxMzksNyBAQAogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CiAKIAlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CiAKQEAgLTIxOSw3ICsyMTcsOCBAQAogICAgICAgCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwgMCApOwogCiAJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLwotCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8CisJCQkJCSAgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSk7CiB9CiAKIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfM2RfcmVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV8zZF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjYxYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfM2RfcmVnLmgKQEAgLTAsMCArMSwxNjUxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFZJQV8zRF9SRUdfSAorI2RlZmluZSBWSUFfM0RfUkVHX0gKKyNkZWZpbmUgSENfUkVHX0JBU0UgICAgICAgICAgICAgMHgwNDAwCisKKyNkZWZpbmUgSENfUkVHX1RSQU5TX1NQQUNFICAgICAgMHgwMDQwCisKKyNkZWZpbmUgSENfUGFyYU5fTUFTSyAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIQ19QYXJhX01BU0sgICAgICAgICAgICAweDAwZmZmZmZmCisjZGVmaW5lIEhDX1N1YkFfTUFTSyAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfU3ViQV9TSElGVCAgICAgICAgICAgMjQKKy8qIFRyYW5zbWlzc2lvbiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfUkVHX1RSQU5TX1NFVCAgICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1BhcmFTdWJUeXBlX01BU0sgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfUGFyYVR5cGVfTUFTSyAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19QYXJhT1NfTUFTSyAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX1BhcmFBZHJfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfUGFyYVN1YlR5cGVfU0hJRlQgICAgMjQKKyNkZWZpbmUgSENfUGFyYVR5cGVfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfUGFyYU9TX1NISUZUICAgICAgICAgOAorI2RlZmluZSBIQ19QYXJhQWRyX1NISUZUICAgICAgICAwCisKKyNkZWZpbmUgSENfUGFyYVR5cGVfQ21kVmRhdGEgICAgMHgwMDAwCisjZGVmaW5lIEhDX1BhcmFUeXBlX05vdFRleCAgICAgIDB4MDAwMQorI2RlZmluZSBIQ19QYXJhVHlwZV9UZXggICAgICAgICAweDAwMDIKKyNkZWZpbmUgSENfUGFyYVR5cGVfUGFsZXR0ZSAgICAgMHgwMDAzCisjZGVmaW5lIEhDX1BhcmFUeXBlX1ByZUNSICAgICAgIDB4MDAxMAorI2RlZmluZSBIQ19QYXJhVHlwZV9BdXRvICAgICAgICAweDAwZmUKKworLyogVHJhbnNtaXNzaW9uIFNwYWNlCisgKi8KKyNkZWZpbmUgSENfUkVHX0hwYXJhMCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1JFR19IcGF0YUFGICAgICAgICAgIDB4MDJmYworCisvKiBSZWFkCisgKi8KKyNkZWZpbmUgSENfUkVHX0hSRW5nU3QgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX1JFR19IUkZJRk9lbXB0eSAgICAgIDB4MDAwNAorI2RlZmluZSBIQ19SRUdfSFJGSUZPZnVsbCAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfUkVHX0hSRXJyICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIEhDX1JFR19GSUZPc3RhdHVzICAgICAgIDB4MDAxMAorLyogSENfUkVHX0hSRW5nU3QgICAgICAgICAgMHgwMDAwCisgKi8KKyNkZWZpbmUgSENfSERBU1pDX01BU0sgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IU0dFTUlfTUFTSyAgICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hMR0VNSVN0X01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSENSU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IU0UwU3RfTUFTSyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hTRTFTdF9NQVNLICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFBFU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IWEVTdF9NQVNLICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hCRVN0X01BU0sgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSEUyU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IRTNTdF9NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisvKiBIQ19SRUdfSFJGSUZPZW1wdHkgICAgICAweDAwMDQKKyAqLworI2RlZmluZSBIQ19IUlpEZW1wdHlfTUFTSyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hSVFhBZW1wdHlfTUFTSyAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFJUWERlbXB0eV9NQVNLICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IV1pEZW1wdHlfTUFTSyAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hXQ0RlbXB0eV9NQVNLICAgICAgIDB4MDAwMDAwMDEKKy8qIEhDX1JFR19IUkZJRk9mdWxsICAgICAgIDB4MDAwOAorICovCisjZGVmaW5lIEhDX0hSWkRmdWxsX01BU0sgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFJUWEFmdWxsX01BU0sgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IUlRYRGZ1bGxfTUFTSyAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX0hXWkRmdWxsX01BU0sgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFdDRGZ1bGxfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorLyogSENfUkVHX0hSRXJyICAgICAgICAgICAgMHgwMDBjCisgKi8KKyNkZWZpbmUgSENfSEFHUENNRXJyX01BU0sgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBIQ19IQUdQQ01FcnJDX01BU0sgICAgICAweDcwMDAwMDAwCisvKiBIQ19SRUdfRklGT3N0YXR1cyAgICAgICAweDAwMTAKKyAqLworI2RlZmluZSBIQ19IUkZJRk9BVGFsbF9NQVNLICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEhDX0hSRklGT0FUYnVzeV9NQVNLICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSENfSFJBVEZHTURvX01BU0sgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IUkFURkdNRGlfTUFTSyAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hSQVRGUlpEX01BU0sgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFJBVEZSVFhBX01BU0sgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IUkFURlJUWERfTUFTSyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hSQVRGV1pEX01BU0sgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFJBVEZXQ0RfTUFTSyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IUkFUVFhUQUdfTUFTSyAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hSQVRUWENIX01BU0sgICAgICAgIDB4MDAwMDAwMDEKKworLyogQUdQIENvbW1hbmQgU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJzdEwgICAgICAgIDB4MDA2MAorI2RlZmluZSBIQ19TdWJBX0hBR1BCZW5kTCAgICAgICAweDAwNjEKKyNkZWZpbmUgSENfU3ViQV9IQUdQQ01OVCAgICAgICAgMHgwMDYyCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJwTCAgICAgICAgIDB4MDA2MworI2RlZmluZSBIQ19TdWJBX0hBR1BCcEggICAgICAgICAweDAwNjQKKy8qIEhDX1N1YkFfSEFHUENNTlQgICAgICAgIDB4MDA2MgorICovCisjZGVmaW5lIEhDX0hBR1BDTU5UX01BU0sgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSENtZEVyckNscl9NQVNLICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IQUdQQmVuZEhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBR1BCc3RIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFHUEJlbmRIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IQUdQQnN0SF9TSElGVCAgICAgICAwCisvKiBIQ19TdWJBX0hBR1BCcEwgICAgICAgICAweDAwNjMKKyAqLworI2RlZmluZSBIQ19IQUdQQnBMX01BU0sgICAgICAgICAweDAwZmZmZmZjCisjZGVmaW5lIEhDX0hBR1BCcElEX01BU0sgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSEFHUEJwSURfUEFVU0UgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUdQQnBJRF9KVU1QICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBR1BCcElEX1NUT1AgICAgICAgIDB4MDAwMDAwMDIKKy8qIEhDX1N1YkFfSEFHUEJwSCAgICAgICAgIDB4MDA2NAorICovCisjZGVmaW5lIEhDX0hBR1BCcEhfTUFTSyAgICAgICAgIDB4MDBmZmZmZmYKKworLyogTWlzY2VsbGFuZW91cyBTZXR0aW5ncworICovCisjZGVmaW5lIEhDX1N1YkFfSENsaXBUQiAgICAgICAgIDB4MDA3MAorI2RlZmluZSBIQ19TdWJBX0hDbGlwTFIgICAgICAgICAweDAwNzEKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwVEwgICAgICAgMHgwMDcyCisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcEJMICAgICAgIDB4MDA3MworI2RlZmluZSBIQ19TdWJBX0hGUENsaXBMTCAgICAgICAweDAwNzQKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwUkwgICAgICAgMHgwMDc1CisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcFRCSCAgICAgIDB4MDA3NgorI2RlZmluZSBIQ19TdWJBX0hGUENsaXBMUkggICAgICAweDAwNzcKKyNkZWZpbmUgSENfU3ViQV9ITFAgICAgICAgICAgICAgMHgwMDc4CisjZGVmaW5lIEhDX1N1YkFfSExQUkYgICAgICAgICAgIDB4MDA3OQorI2RlZmluZSBIQ19TdWJBX0hTb2xpZENMICAgICAgICAweDAwN2EKKyNkZWZpbmUgSENfU3ViQV9IUGl4R0MgICAgICAgICAgMHgwMDdiCisjZGVmaW5lIEhDX1N1YkFfSFNQWFlPUyAgICAgICAgIDB4MDA3YworI2RlZmluZSBIQ19TdWJBX0hWZXJ0ZXhDTlQgICAgICAweDAwN2QKKworI2RlZmluZSBIQ19IQ2xpcFRfTUFTSyAgICAgICAgICAweDAwZmZmMDAwCisjZGVmaW5lIEhDX0hDbGlwVF9TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIEhDX0hDbGlwQl9NQVNLICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSENfSENsaXBCX1NISUZUICAgICAgICAgMAorI2RlZmluZSBIQ19IQ2xpcExfTUFTSyAgICAgICAgICAweDAwZmZmMDAwCisjZGVmaW5lIEhDX0hDbGlwTF9TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIEhDX0hDbGlwUl9NQVNLICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSENfSENsaXBSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBIQ19IRlBDbGlwQkhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hGUENsaXBCSF9TSElGVCAgICAgIDgKKyNkZWZpbmUgSENfSEZQQ2xpcFRIX01BU0sgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IRlBDbGlwVEhfU0hJRlQgICAgICAwCisjZGVmaW5lIEhDX0hGUENsaXBSSF9NQVNLICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSEZQQ2xpcFJIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IRlBDbGlwTEhfTUFTSyAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hGUENsaXBMSF9TSElGVCAgICAgIDAKKyNkZWZpbmUgSENfSFNvbGlkQ0hfTUFTSyAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IUGl4R0NfTUFTSyAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hTUFhPU19NQVNLICAgICAgICAgIDB4MDBmZmYwMDAKKyNkZWZpbmUgSENfSFNQWE9TX1NISUZUICAgICAgICAgMTIKKyNkZWZpbmUgSENfSFNQWU9TX01BU0sgICAgICAgICAgMHgwMDAwMGZmZgorCisvKiBDb21tYW5kCisgKiBDb21tYW5kIEEKKyAqLworI2RlZmluZSBIQ19IQ21kSGVhZGVyX01BU0sgICAgICAweGZlMDAwMDAwCS8qMHhmZmUwMDAwMCAqLworI2RlZmluZSBIQ19IRTNGaXJlX01BU0sgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhDX0hQTVR5cGVfTUFTSyAgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSEVGbGFnX01BU0sgICAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBIQ19IU2hhZGluZ19NQVNLICAgICAgICAweDAwMDAxYzAwCisjZGVmaW5lIEhDX0hQTVZhbGlkTl9NQVNLICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFBMRU5EX01BU0sgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IVkN5Y2xlX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hWQ3ljbGVfU3R5bGVfTUFTSyAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSFZDeWNsZV9DaGdBX01BU0sgICAgMHgwMDAwMDAzMAorI2RlZmluZSBIQ19IVkN5Y2xlX0NoZ0JfTUFTSyAgICAweDAwMDAwMDBjCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ2hnQ19NQVNLICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFBNVHlwZV9Qb2ludCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IUE1UeXBlX0xpbmUgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hQTVR5cGVfVHJpICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFBNVHlwZV9UcmlXRiAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIQ19IRUZsYWdfTm9BQSAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hFRmxhZ19hYiAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSEVGbGFnX2JjICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IRUZsYWdfY2EgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX1NvbGlkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfRmxhdEEgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IU2hhZGluZ19GbGF0QiAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX0ZsYXRDICAgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfR291cmF1ZCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0Z1bGwgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQUZQICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFZDeWNsZV9PbmUgICAgICAgICAgMHgwMDAwMDBjMAorI2RlZmluZSBIQ19IVkN5Y2xlX05ld0EgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQUEgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFZDeWNsZV9BQiAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IVkN5Y2xlX0FDICAgICAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIEhDX0hWQ3ljbGVfTmV3QiAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFZDeWNsZV9CQSAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IVkN5Y2xlX0JCICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hWQ3ljbGVfQkMgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgSENfSFZDeWNsZV9OZXdDICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0NBICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ0IgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFZDeWNsZV9DQyAgICAgICAgICAgMHgwMDAwMDAwMworCisvKiBDb21tYW5kIEIKKyAqLworI2RlZmluZSBIQ19ITFByc3RfTUFTSyAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hMTGFzdFBfTUFTSyAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSFZQTVNLX01BU0sgICAgICAgICAgMHgwMDAwN2Y4MAorI2RlZmluZSBIQ19IQkZhY2VfTUFTSyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0gybmQxVlRfTUFTSyAgICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgSENfSFZQTVNLX1ggICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IVlBNU0tfWSAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hWUE1TS19aICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSFZQTVNLX1cgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IVlBNU0tfQ2QgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hWUE1TS19DcyAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFZQTVNLX1MgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IVlBNU0tfVCAgICAgICAgICAgICAweDAwMDAwMDgwCisKKy8qIEVuYWJsZSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IRW5hYmxlICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX0hlblRYRW52TWFwX01BU0sgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSGVuVmVydGV4Q05UX01BU0sgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IZW5DUFVEQVpfTUFTSyAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hlbkRBU1pXQ19NQVNLICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSENfSGVuRkJDdWxsX01BU0sgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIQ19IZW5DV19NQVNLICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hlbkFBX01BU0sgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSGVuU1RfTUFTSyAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IZW5aVF9NQVNLICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hlblpXX01BU0sgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSGVuQVRfTUFTSyAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IZW5BV19NQVNLICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hlblNQX01BU0sgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSGVuTFBfTUFTSyAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IZW5UWENIX01BU0sgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hlblRYTVBfTUFTSyAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSGVuVFhQUF9NQVNLICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IZW5UWFRSX01BU0sgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hlbkNTX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSGVuRk9HX01BU0sgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IZW5BQkxfTUFTSyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hlbkRUX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogWiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IWldCQmFzTCAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhDX1N1YkFfSFpXQkJhc0ggICAgICAgIDB4MDAxMQorI2RlZmluZSBIQ19TdWJBX0haV0JUeXBlICAgICAgICAweDAwMTIKKyNkZWZpbmUgSENfU3ViQV9IWkJpYXNMICAgICAgICAgMHgwMDEzCisjZGVmaW5lIEhDX1N1YkFfSFpXQmVuZCAgICAgICAgIDB4MDAxNAorI2RlZmluZSBIQ19TdWJBX0haV1RNRCAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgSENfU3ViQV9IWldDREwgICAgICAgICAgMHgwMDE2CisjZGVmaW5lIEhDX1N1YkFfSFpXQ1RBR251bSAgICAgIDB4MDAxNworI2RlZmluZSBIQ19TdWJBX0haQ1lOdW0gICAgICAgICAweDAwMTgKKyNkZWZpbmUgSENfU3ViQV9IWldDRmlyZSAgICAgICAgMHgwMDE5CisvKiBIQ19TdWJBX0haV0JUeXBlCisgKi8KKyNkZWZpbmUgSENfSFpXQlR5cGVfTUFTSyAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IWkJpYXNlZFdCX01BU0sgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhDX0haT05FYXNGRl9NQVNLICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFpPT05FYXNGRl9NQVNLICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IWldCRk1fTUFTSyAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0haV0JMb2NfTUFTSyAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgSENfSFpXQlBpdF9NQVNLICAgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBIQ19IWldCRk1fMTYgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV0JGTV8zMiAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFpXQkZNXzI0ICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IWldCTG9jX0xvY2FsICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV0JMb2NfU3lTICAgICAgICAgIDB4MDAwMDQwMDAKKy8qIEhDX1N1YkFfSFpXQmVuZAorICovCisjZGVmaW5lIEhDX0haV0JlbmRfTUFTSyAgICAgICAgIDB4MDBmZmUwMDAKKyNkZWZpbmUgSENfSFpCaWFzSF9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IWldCZW5kX1NISUZUICAgICAgICAxMAorLyogSENfU3ViQV9IWldUTUQKKyAqLworI2RlZmluZSBIQ19IWldUTURfTUFTSyAgICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hFQkVCaWFzX01BU0sgICAgICAgIDB4MDAwMDdmMDAKKyNkZWZpbmUgSENfSFpORl9NQVNLICAgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IWldUTURfTmV2ZXJQYXNzICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9MVCAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX0VRICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIQ19IWldUTURfTEUgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9HVCAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX05FICAgICAgICAgICAgMHgwMDA1MDAwMAorI2RlZmluZSBIQ19IWldUTURfR0UgICAgICAgICAgICAweDAwMDYwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9BbGxQYXNzICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgSENfSEVCRUJpYXNfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IWldDREwgICAgICAgICAgMHgwMDE2CisgKi8KKyNkZWZpbmUgSENfSFpXQ0RMX01BU0sgICAgICAgICAgMHgwMGZmZmZmZgorLyogSENfU3ViQV9IWldDVEFHbnVtICAgICAgMHgwMDE3CisgKi8KKyNkZWZpbmUgSENfSFpXQ1RBR251bV9NQVNLICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IWldDVEFHbnVtX1NISUZUICAgICAxNgorI2RlZmluZSBIQ19IWldDREhfTUFTSyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0haV0NESF9TSElGVCAgICAgICAgIDAKKy8qIEhDX1N1YkFfSFpDWU51bSAgICAgICAgIDB4MDAxOAorICovCisjZGVmaW5lIEhDX0haQ1lOdW1fTUFTSyAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFpDWU51bV9TSElGVCAgICAgICAgMTYKKyNkZWZpbmUgSENfSFpXQ1FXbnVtX01BU0sgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBIQ19IWldDUVdudW1fU0hJRlQgICAgICAwCisvKiBIQ19TdWJBX0haV0NGaXJlICAgICAgICAweDAwMTkKKyAqLworI2RlZmluZSBIQ19aV0NGaXJlX01BU0sgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0haV0NRV251bUxhc3RfTUFTSyAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFpXQ1FXbnVtTGFzdF9TSElGVCAgMAorCisvKiBTdGVuY2lsIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hTVFJFRiAgICAgICAgICAweDAwMjMKKyNkZWZpbmUgSENfU3ViQV9IU1RNRCAgICAgICAgICAgMHgwMDI0CisvKiBIQ19TdWJBX0hTQkZNCisgKi8KKyNkZWZpbmUgSENfSFNCRk1fTUFTSyAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IU0JMb2NfTUFTSyAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hTQlBpdF9NQVNLICAgICAgICAgIDB4MDAwMDNmZmYKKy8qIEhDX1N1YkFfSFNUUkVGCisgKi8KKyNkZWZpbmUgSENfSFNUUkVGX01BU0sgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IU1RPUE1TS19NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hTVEJNU0tfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFNUUkVGX1NISUZUICAgICAgICAgMTYKKyNkZWZpbmUgSENfSFNUT1BNU0tfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IU1RNRAorICovCisjZGVmaW5lIEhDX0hTVE1EX01BU0sgICAgICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgSENfSFNUT1BTRl9NQVNLICAgICAgICAgMHgwMDAwMDFjMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfTUFTSyAgICAgICAweDAwMDAwMDM4CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9NQVNLICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfSFNUTURfTmV2ZXJQYXNzICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IU1RNRF9MVCAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hTVE1EX0VRICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFNUTURfTEUgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IU1RNRF9HVCAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0hTVE1EX05FICAgICAgICAgICAgIDB4MDAwNTAwMDAKKyNkZWZpbmUgSENfSFNUTURfR0UgICAgICAgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBIQ19IU1RNRF9BbGxQYXNzICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hTVE9QU0ZfS0VFUCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNUT1BTRl9aRVJPICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBIQ19IU1RPUFNGX1JFUExBQ0UgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hTVE9QU0ZfSU5DUlNBVCAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSFNUT1BTRl9ERUNSU0FUICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IU1RPUFNGX0lOVkVSVCAgICAgICAweDAwMDAwMTQwCisjZGVmaW5lIEhDX0hTVE9QU0ZfSU5DUiAgICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSENfSFNUT1BTRl9ERUNSICAgICAgICAgMHgwMDAwMDFjMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfS0VFUCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hTVE9QU1BaRl9aRVJPICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFNUT1BTUFpGX1JFUExBQ0UgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfSU5DUlNBVCAgICAweDAwMDAwMDE4CisjZGVmaW5lIEhDX0hTVE9QU1BaRl9ERUNSU0FUICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFNUT1BTUFpGX0lOVkVSVCAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBIQ19IU1RPUFNQWkZfSU5DUiAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIEhDX0hTVE9QU1BaRl9ERUNSICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0tFRVAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IU1RPUFNQWlBfWkVSTyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hTVE9QU1BaUF9SRVBMQUNFICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0lOQ1JTQVQgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IU1RPUFNQWlBfREVDUlNBVCAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9JTlZFUlQgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0lOQ1IgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19IU1RPUFNQWlBfREVDUiAgICAgICAweDAwMDAwMDA3CisKKy8qIEFscGhhIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hBQkJhc0wgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSENfU3ViQV9IQUJCYXNIICAgICAgICAgMHgwMDMxCisjZGVmaW5lIEhDX1N1YkFfSEFCRk0gICAgICAgICAgIDB4MDAzMgorI2RlZmluZSBIQ19TdWJBX0hBVE1EICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgSENfU3ViQV9IQUJMQ3NhdCAgICAgICAgMHgwMDM0CisjZGVmaW5lIEhDX1N1YkFfSEFCTENvcCAgICAgICAgIDB4MDAzNQorI2RlZmluZSBIQ19TdWJBX0hBQkxBc2F0ICAgICAgICAweDAwMzYKKyNkZWZpbmUgSENfU3ViQV9IQUJMQW9wICAgICAgICAgMHgwMDM3CisjZGVmaW5lIEhDX1N1YkFfSEFCTFJDYSAgICAgICAgIDB4MDAzOAorI2RlZmluZSBIQ19TdWJBX0hBQkxSRkNhICAgICAgICAweDAwMzkKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkNiaWFzICAgICAgMHgwMDNhCisjZGVmaW5lIEhDX1N1YkFfSEFCTFJDYiAgICAgICAgIDB4MDAzYgorI2RlZmluZSBIQ19TdWJBX0hBQkxSRkNiICAgICAgICAweDAwM2MKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkFhICAgICAgICAgMHgwMDNkCisjZGVmaW5lIEhDX1N1YkFfSEFCTFJBYiAgICAgICAgIDB4MDAzZQorLyogSENfU3ViQV9IQUJGTQorICovCisjZGVmaW5lIEhDX0hBQkZNX01BU0sgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSEFCTG9jX01BU0sgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IQUJQaXRfTUFTSyAgICAgICAgICAweDAwMDAwN2ZmCisvKiBIQ19TdWJBX0hBVE1ECisgKi8KKyNkZWZpbmUgSENfSEFUTURfTUFTSyAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBIQ19IQVRSRUZfTUFTSyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hBVE1EX05ldmVyUGFzcyAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSEFUTURfTFQgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IQVRNRF9FUSAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hBVE1EX0xFICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSEFUTURfR1QgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IQVRNRF9ORSAgICAgICAgICAgICAweDAwMDAwNTAwCisjZGVmaW5lIEhDX0hBVE1EX0dFICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgSENfSEFUTURfQWxsUGFzcyAgICAgICAgMHgwMDAwMDcwMAorLyogSENfU3ViQV9IQUJMQ3NhdAorICovCisjZGVmaW5lIEhDX0hBQkxDc2F0X01BU0sgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSEFCTENhX01BU0sgICAgICAgICAgMHgwMDAwZmMwMAorI2RlZmluZSBIQ19IQUJMQ2FfQ19NQVNLICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hBQkxDYV9PUENfTUFTSyAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgSENfSEFCTEZDYV9NQVNLICAgICAgICAgMHgwMDAwMDNmMAorI2RlZmluZSBIQ19IQUJMRkNhX0NfTUFTSyAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEhDX0hBQkxGQ2FfT1BDX01BU0sgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSEFCTENiaWFzX01BU0sgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IQUJMQ2JpYXNfQ19NQVNLICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hBQkxDYmlhc19PUENfTUFTSyAgIDB4MDAwMDAwMDcKKy8qLS0gRGVmaW5lIHRoZSBpbnB1dCBjb2xvci4KKyAqLworI2RlZmluZSBIQ19YQ19Dc3JjICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hDX0Nkc3QgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfWENfQXNyYyAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19YQ19BZHN0ICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX1hDX0ZvZyAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfWENfSEFCTFJDICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBIQ19YQ19taW5TcmNEc3QgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEhDX1hDX21heFNyY0RzdCAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfWENfbWltQXNyY0ludkFkc3QgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19YQ19PUEMgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hDX0ludk9QQyAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWENfT1BDcDUgICAgICAgICAgICAgMHgwMDAwMDAyMAorLyotLSBEZWZpbmUgdGhlIGlucHV0IEFscGhhCisgKi8KKyNkZWZpbmUgSENfWEFfT1BBICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQV9JbnZPUEEgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hBX09QQXA1ICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfWEFfMCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQV9Bc3JjICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hBX0Fkc3QgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWEFfRm9nICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YQV9taW5Bc3JjRm9nICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hBX21pbkFzcmNBZHN0ICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfWEFfbWF4QXNyY0ZvZyAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19YQV9tYXhBc3JjQWRzdCAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX1hBX0hBQkxSQSAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWEFfbWluQXNyY0ludkFkc3QgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19YQV9IQUJMRlJBICAgICAgICAgICAweDAwMDAwMDA5CisvKi0tCisgKi8KKyNkZWZpbmUgSENfSEFCTENhX09QQyAgICAgICAgICAgKEhDX1hDX09QQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0ludk9QQyAgICAgICAgKEhDX1hDX0ludk9QQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX09QQ3A1ICAgICAgICAgKEhDX1hDX09QQ3A1IDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQ2FfQ3NyYyAgICAgICAgICAoSENfWENfQ3NyYyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0Nkc3QgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9Bc3JjICAgICAgICAgIChIQ19YQ19Bc3JjIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQ2FfQWRzdCAgICAgICAgICAoSENfWENfQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0ZvZyAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0hBQkxSQ2EgICAgICAgKEhDX1hDX0hBQkxSQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX21pblNyY0RzdCAgICAgKEhDX1hDX21pblNyY0RzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX21heFNyY0RzdCAgICAgKEhDX1hDX21heFNyY0RzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEZDYV9PUEMgICAgICAgICAgICAgIChIQ19YQ19PUEMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9JbnZPUEMgICAgICAgICAgIChIQ19YQ19JbnZPUEMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9PUENwNSAgICAgICAgICAgIChIQ19YQ19PUENwNSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkNhX0NzcmMgICAgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9DZHN0ICAgICAgICAgICAgIChIQ19YQ19DZHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfQXNyYyAgICAgICAgICAgICAoSENfWENfQXNyYyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkNhX0Fkc3QgICAgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9Gb2cgICAgICAgICAgICAgIChIQ19YQ19Gb2cgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9IQUJMUkNhICAgICAgICAgIChIQ19YQ19IQUJMUkMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9taW5TcmNEc3QgICAgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9tYXhTcmNEc3QgICAgICAgIChIQ19YQ19tYXhTcmNEc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9taW1Bc3JjSW52QWRzdCAgIChIQ19YQ19taW1Bc3JjSW52QWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMQ2JpYXNfSEFCTFJDYmlhcyAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hBQkxDYmlhc19Bc3JjICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSEFCTENiaWFzX0Fkc3QgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IQUJMQ2JpYXNfRm9nICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hBQkxDYmlhc19DaW4gICAgICAgIDB4MDAwMDAwMDQKKy8qIEhDX1N1YkFfSEFCTENvcCAgICAgICAgIDB4MDAzNQorICovCisjZGVmaW5lIEhDX0hBQkxkb3RfTUFTSyAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSEFCTENvcF9NQVNLICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IQUJMQ2JfTUFTSyAgICAgICAgICAweDAwMDAzZjAwCisjZGVmaW5lIEhDX0hBQkxDYl9DX01BU0sgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSENfSEFCTENiX09QQ19NQVNLICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IQUJMRkNiX01BU0sgICAgICAgICAweDAwMDAwMGZjCisjZGVmaW5lIEhDX0hBQkxGQ2JfQ19NQVNLICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSEFCTEZDYl9PUENfTUFTSyAgICAgMHgwMDAwMDAzYworI2RlZmluZSBIQ19IQUJMQ3NoaWZ0X01BU0sgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hBQkxDYl9PUEMgICAgICAgICAgIChIQ19YQ19PUEMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0ludk9QQyAgICAgICAgKEhDX1hDX0ludk9QQyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQ2JfT1BDcDUgICAgICAgICAoSENfWENfT1BDcDUgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0NzcmMgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0Nkc3QgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0FzcmMgICAgICAgICAgKEhDX1hDX0FzcmMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0Fkc3QgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0ZvZyAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQ2JfSEFCTFJDYSAgICAgICAoSENfWENfSEFCTFJDIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9taW5TcmNEc3QgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX21heFNyY0RzdCAgICAgKEhDX1hDX21heFNyY0RzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMRkNiX09QQyAgICAgICAgICAgICAgKEhDX1hDX09QQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0ludk9QQyAgICAgICAgICAgKEhDX1hDX0ludk9QQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX09QQ3A1ICAgICAgICAgICAgKEhDX1hDX09QQ3A1IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQ2JfQ3NyYyAgICAgICAgICAgICAoSENfWENfQ3NyYyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0Nkc3QgICAgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9Bc3JjICAgICAgICAgICAgIChIQ19YQ19Bc3JjIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQ2JfQWRzdCAgICAgICAgICAgICAoSENfWENfQWRzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0ZvZyAgICAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0hBQkxSQ2IgICAgICAgICAgKEhDX1hDX0hBQkxSQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21pblNyY0RzdCAgICAgICAgKEhDX1hDX21pblNyY0RzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21heFNyY0RzdCAgICAgICAgKEhDX1hDX21heFNyY0RzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21pbUFzcmNJbnZBZHN0ICAgKEhDX1hDX21pbUFzcmNJbnZBZHN0IDw8IDIpCisvKiBIQ19TdWJBX0hBQkxBc2F0ICAgICAgICAweDAwMzYKKyAqLworI2RlZmluZSBIQ19IQUJMQXNhdF9NQVNLICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hBQkxBYV9NQVNLICAgICAgICAgIDB4MDAwMGZjMDAKKyNkZWZpbmUgSENfSEFCTEFhX0FfTUFTSyAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IQUJMQWFfT1BBX01BU0sgICAgICAweDAwMDAzYzAwCisjZGVmaW5lIEhDX0hBQkxGQWFfTUFTSyAgICAgICAgIDB4MDAwMDAzZjAKKyNkZWZpbmUgSENfSEFCTEZBYV9BX01BU0sgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBIQ19IQUJMRkFhX09QQV9NQVNLICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hBQkxBYmlhc19NQVNLICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0FfTUFTSyAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IQUJMQWJpYXNfT1BBX01BU0sgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX0hBQkxBYV9PUEEgICAgICAgICAgIChIQ19YQV9PUEEgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9JbnZPUEEgICAgICAgIChIQ19YQV9JbnZPUEEgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9PUEFwNSAgICAgICAgIChIQ19YQV9PUEFwNSA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhXzAgICAgICAgICAgICAgKEhDX1hBXzAgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9Bc3JjICAgICAgICAgIChIQ19YQV9Bc3JjIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfQWRzdCAgICAgICAgICAoSENfWEFfQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX0ZvZyAgICAgICAgICAgKEhDX1hBX0ZvZyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX21pbkFzcmNGb2cgICAgKEhDX1hBX21pbkFzcmNGb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9taW5Bc3JjQWRzdCAgIChIQ19YQV9taW5Bc3JjQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX21heEFzcmNGb2cgICAgKEhDX1hBX21heEFzcmNGb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9tYXhBc3JjQWRzdCAgIChIQ19YQV9tYXhBc3JjQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX0hBQkxSQSAgICAgICAgKEhDX1hBX0hBQkxSQSA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEZBYV9PUEEgICAgICAgICAgKEhDX1hBX09QQSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0ludk9QQSAgICAgICAoSENfWEFfSW52T1BBIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfT1BBcDUgICAgICAgIChIQ19YQV9PUEFwNSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhXzAgICAgICAgICAgICAoSENfWEFfMCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0FzcmMgICAgICAgICAoSENfWEFfQXNyYyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0Fkc3QgICAgICAgICAoSENfWEFfQWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0ZvZyAgICAgICAgICAoSENfWEFfRm9nIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfbWluQXNyY0ZvZyAgIChIQ19YQV9taW5Bc3JjRm9nIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfbWluQXNyY0Fkc3QgIChIQ19YQV9taW5Bc3JjQWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21heEFzcmNGb2cgICAoSENfWEFfbWF4QXNyY0ZvZyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21heEFzcmNBZHN0ICAoSENfWEFfbWF4QXNyY0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9taW5Bc3JjSW52QWRzdCAgIChIQ19YQV9taW5Bc3JjSW52QWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0hBQkxGUkEgICAgICAgICAgKEhDX1hBX0hBQkxGUkEgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0hBQkxSQWJpYXMgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUJMQWJpYXNfQXNyYyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBQkxBYmlhc19BZHN0ICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0ZvZyAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQWJpYXNfQWFhICAgICAgICAweDAwMDAwMDA0CisvKiBIQ19TdWJBX0hBQkxBb3AgICAgICAgICAweDAwMzcKKyAqLworI2RlZmluZSBIQ19IQUJMQW9wX01BU0sgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhDX0hBQkxBYl9NQVNLICAgICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgSENfSEFCTEFiX09QQV9NQVNLICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IQUJMRkFiX01BU0sgICAgICAgICAweDAwMDAwMGZjCisjZGVmaW5lIEhDX0hBQkxGQWJfT1BBX01BU0sgICAgIDB4MDAwMDAwM2MKKyNkZWZpbmUgSENfSEFCTEFzaGlmdF9NQVNLICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQWJfT1BBICAgICAgICAgICAoSENfWEFfT1BBIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9JbnZPUEEgICAgICAgIChIQ19YQV9JbnZPUEEgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX09QQXA1ICAgICAgICAgKEhDX1hBX09QQXA1IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl8wICAgICAgICAgICAgIChIQ19YQV8wIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9Bc3JjICAgICAgICAgIChIQ19YQV9Bc3JjIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9BZHN0ICAgICAgICAgIChIQ19YQV9BZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9Gb2cgICAgICAgICAgIChIQ19YQV9Gb2cgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX21pbkFzcmNGb2cgICAgKEhDX1hBX21pbkFzcmNGb2cgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX21pbkFzcmNBZHN0ICAgKEhDX1hBX21pbkFzcmNBZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9tYXhBc3JjRm9nICAgIChIQ19YQV9tYXhBc3JjRm9nIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9tYXhBc3JjQWRzdCAgIChIQ19YQV9tYXhBc3JjQWRzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfSEFCTFJBICAgICAgICAoSENfWEFfSEFCTFJBIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxGQWJfT1BBICAgICAgICAgIChIQ19YQV9PUEEgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9JbnZPUEEgICAgICAgKEhDX1hBX0ludk9QQSA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX09QQXA1ICAgICAgICAoSENfWEFfT1BBcDUgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl8wICAgICAgICAgICAgKEhDX1hBXzAgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9Bc3JjICAgICAgICAgKEhDX1hBX0FzcmMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9BZHN0ICAgICAgICAgKEhDX1hBX0Fkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9Gb2cgICAgICAgICAgKEhDX1hBX0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX21pbkFzcmNGb2cgICAoSENfWEFfbWluQXNyY0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX21pbkFzcmNBZHN0ICAoSENfWEFfbWluQXNyY0Fkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9tYXhBc3JjRm9nICAgKEhDX1hBX21heEFzcmNGb2cgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9tYXhBc3JjQWRzdCAgKEhDX1hBX21heEFzcmNBZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfbWluQXNyY0ludkFkc3QgICAoSENfWEFfbWluQXNyY0ludkFkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9IQUJMRlJBICAgICAgICAgIChIQ19YQV9IQUJMRlJBIDw8IDIpCisvKiBIQ19TdWJBX0hBQkxSQWEgICAgICAgICAweDAwM2QKKyAqLworI2RlZmluZSBIQ19IQUJMUkFhX01BU0sgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hBQkxSRkFhX01BU0sgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSEFCTFJBYmlhc19NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IQUJMUkFhX1NISUZUICAgICAgICAxNgorI2RlZmluZSBIQ19IQUJMUkZBYV9TSElGVCAgICAgICA4CisvKiBIQ19TdWJBX0hBQkxSQWIgICAgICAgICAweDAwM2UKKyAqLworI2RlZmluZSBIQ19IQUJMUkFiX01BU0sgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBQkxSRkFiX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFCTFJBYl9TSElGVCAgICAgICAgOAorCisvKiBEZXN0aW5hdGlvbiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IREJCYXNMICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1N1YkFfSERCQmFzSCAgICAgICAgIDB4MDA0MQorI2RlZmluZSBIQ19TdWJBX0hEQkZNICAgICAgICAgICAweDAwNDIKKyNkZWZpbmUgSENfU3ViQV9IRkJCTVNLTCAgICAgICAgMHgwMDQzCisjZGVmaW5lIEhDX1N1YkFfSFJPUCAgICAgICAgICAgIDB4MDA0NAorLyogSENfU3ViQV9IREJGTSAgICAgICAgICAgMHgwMDQyCisgKi8KKyNkZWZpbmUgSENfSERCRk1fTUFTSyAgICAgICAgICAgMHgwMDFmMDAwMAorI2RlZmluZSBIQ19IREJMb2NfTUFTSyAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hEQlBpdF9NQVNLICAgICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSERCRk1fUkdCNTU1ICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IREJGTV9SR0I1NjUgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0I0NDQ0ICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSERCRk1fQVJHQjE1NTUgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IREJGTV9CR1I1NTUgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0JHUjU2NSAgICAgICAgIDB4MDAwNTAwMDAKKyNkZWZpbmUgSENfSERCRk1fQUJHUjQ0NDQgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBIQ19IREJGTV9BQkdSMTU1NSAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0IwODg4ICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSERCRk1fQVJHQjg4ODggICAgICAgMHgwMDA5MDAwMAorI2RlZmluZSBIQ19IREJGTV9BQkdSMDg4OCAgICAgICAweDAwMGEwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FCR1I4ODg4ICAgICAgIDB4MDAwYjAwMDAKKyNkZWZpbmUgSENfSERCTG9jX0xvY2FsICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IREJMb2NfU3lzICAgICAgICAgICAweDAwMDA0MDAwCisvKiBIQ19TdWJBX0hST1AgICAgICAgICAgICAweDAwNDQKKyAqLworI2RlZmluZSBIQ19IUk9QX01BU0sgICAgICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hGQkJNU0tIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFJPUF9CTEFDSyAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IUk9QX0RQb24gICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hST1BfRFBuYSAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFJPUF9QbiAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBIQ19IUk9QX1BEbmEgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hST1BfRG4gICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgSENfSFJPUF9EUHggICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBIQ19IUk9QX0RQYW4gICAgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIEhDX0hST1BfRFBhICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFJPUF9EUHhuICAgICAgICAgICAgMHgwMDAwMDkwMAorI2RlZmluZSBIQ19IUk9QX0QgICAgICAgICAgICAgICAweDAwMDAwYTAwCisjZGVmaW5lIEhDX0hST1BfRFBubyAgICAgICAgICAgIDB4MDAwMDBiMDAKKyNkZWZpbmUgSENfSFJPUF9QICAgICAgICAgICAgICAgMHgwMDAwMGMwMAorI2RlZmluZSBIQ19IUk9QX1BEbm8gICAgICAgICAgICAweDAwMDAwZDAwCisjZGVmaW5lIEhDX0hST1BfRFBvICAgICAgICAgICAgIDB4MDAwMDBlMDAKKyNkZWZpbmUgSENfSFJPUF9XSElURSAgICAgICAgICAgMHgwMDAwMGYwMAorCisvKiBGb2cgU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSEZvZ0xGICAgICAgICAgIDB4MDA1MAorI2RlZmluZSBIQ19TdWJBX0hGb2dDTCAgICAgICAgICAweDAwNTEKKyNkZWZpbmUgSENfU3ViQV9IRm9nQ0ggICAgICAgICAgMHgwMDUyCisjZGVmaW5lIEhDX1N1YkFfSEZvZ1N0TCAgICAgICAgIDB4MDA1MworI2RlZmluZSBIQ19TdWJBX0hGb2dTdEggICAgICAgICAweDAwNTQKKyNkZWZpbmUgSENfU3ViQV9IRm9nT09kTUYgICAgICAgMHgwMDU1CisjZGVmaW5lIEhDX1N1YkFfSEZvZ09PZEVGICAgICAgIDB4MDA1NgorI2RlZmluZSBIQ19TdWJBX0hGb2dFbmRMICAgICAgICAweDAwNTcKKyNkZWZpbmUgSENfU3ViQV9IRm9nRGVuc3QgICAgICAgMHgwMDU4CisvKiBIQ19TdWJBX0ZvZ0xGICAgICAgICAgICAweDAwNTAKKyAqLworI2RlZmluZSBIQ19Gb2dMRl9NQVNLICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0ZvZ0VxX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfRm9nTURfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBIQ19Gb2dNRF9Mb2NhbEZvZyAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19Gb2dNRF9MaW5lYXJGb2cgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19Gb2dNRF9FeHBvbmVudGlhbEZvZyAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19Gb2dNRF9FeHBvbmVudGlhbDJGb2cgMHgwMDAwMDAwNQorLyogI2RlZmluZSBIQ19Gb2dNRF9Gb2dUYWJsZSAgICAgICAweDAwMDAwMDAzICovCisKKy8qIEhDX1N1YkFfSEZvZ0RlbnN0ICAgICAgICAweDAwNTgKKyAqLworI2RlZmluZSBIQ19Gb2dEZW5zdF9NQVNLICAgICAgICAweDAwMWZmZjAwCisjZGVmaW5lIEhDX0ZvZ0VuZExfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKworLyogVGV4dHVyZSBzdWJ0eXBlIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSENfU3ViVHlwZV9UZXgwICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19TdWJUeXBlX1RleDEgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4R2VuZXJhbCAgIDB4MDAwMDAwZmUKKworLyogQXR0cmlidXRlIG9mIHRleHR1cmUgbgorICovCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwQmFzTCAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19TdWJBX0hUWG5MMUJhc0wgICAgICAweDAwMDEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDJCYXNMICAgICAgMHgwMDAyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwzQmFzTCAgICAgIDB4MDAwMworI2RlZmluZSBIQ19TdWJBX0hUWG5MNEJhc0wgICAgICAweDAwMDQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDVCYXNMICAgICAgMHgwMDA1CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw2QmFzTCAgICAgIDB4MDAwNgorI2RlZmluZSBIQ19TdWJBX0hUWG5MN0Jhc0wgICAgICAweDAwMDcKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDhCYXNMICAgICAgMHgwMDA4CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5QmFzTCAgICAgIDB4MDAwOQorI2RlZmluZSBIQ19TdWJBX0hUWG5MYUJhc0wgICAgICAweDAwMGEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGJCYXNMICAgICAgMHgwMDBiCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjQmFzTCAgICAgIDB4MDAwYworI2RlZmluZSBIQ19TdWJBX0hUWG5MZEJhc0wgICAgICAweDAwMGQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGVCYXNMICAgICAgMHgwMDBlCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxmQmFzTCAgICAgIDB4MDAwZgorI2RlZmluZSBIQ19TdWJBX0hUWG5MMTBCYXNMICAgICAweDAwMTAKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDExQmFzTCAgICAgMHgwMDExCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwMTJCYXNIICAgIDB4MDAyMAorI2RlZmluZSBIQ19TdWJBX0hUWG5MMzQ1QmFzSCAgICAweDAwMjEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDY3OEJhc0ggICAgMHgwMDIyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5YWJCYXNIICAgIDB4MDAyMworI2RlZmluZSBIQ19TdWJBX0hUWG5MY2RlQmFzSCAgICAweDAwMjQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGYxMDExQmFzSCAgMHgwMDI1CisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwUGl0ICAgICAgIDB4MDAyYgorI2RlZmluZSBIQ19TdWJBX0hUWG5MMVBpdCAgICAgICAweDAwMmMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDJQaXQgICAgICAgMHgwMDJkCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwzUGl0ICAgICAgIDB4MDAyZQorI2RlZmluZSBIQ19TdWJBX0hUWG5MNFBpdCAgICAgICAweDAwMmYKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDVQaXQgICAgICAgMHgwMDMwCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw2UGl0ICAgICAgIDB4MDAzMQorI2RlZmluZSBIQ19TdWJBX0hUWG5MN1BpdCAgICAgICAweDAwMzIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDhQaXQgICAgICAgMHgwMDMzCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5UGl0ICAgICAgIDB4MDAzNAorI2RlZmluZSBIQ19TdWJBX0hUWG5MYVBpdCAgICAgICAweDAwMzUKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGJQaXQgICAgICAgMHgwMDM2CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjUGl0ICAgICAgIDB4MDAzNworI2RlZmluZSBIQ19TdWJBX0hUWG5MZFBpdCAgICAgICAweDAwMzgKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGVQaXQgICAgICAgMHgwMDM5CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxmUGl0ICAgICAgIDB4MDAzYQorI2RlZmluZSBIQ19TdWJBX0hUWG5MMTBQaXQgICAgICAweDAwM2IKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDExUGl0ICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwXzVXRSAgICAgIDB4MDA0YgorI2RlZmluZSBIQ19TdWJBX0hUWG5MNl9iV0UgICAgICAweDAwNGMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGNfMTFXRSAgICAgMHgwMDRkCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwXzVIRSAgICAgIDB4MDA1MQorI2RlZmluZSBIQ19TdWJBX0hUWG5MNl9iSEUgICAgICAweDAwNTIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGNfMTFIRSAgICAgMHgwMDUzCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwT1MgICAgICAgIDB4MDA3NworI2RlZmluZSBIQ19TdWJBX0hUWG5UQiAgICAgICAgICAweDAwNzgKKyNkZWZpbmUgSENfU3ViQV9IVFhuTVBNRCAgICAgICAgMHgwMDc5CisjZGVmaW5lIEhDX1N1YkFfSFRYbkNMT0R1ICAgICAgIDB4MDA3YQorI2RlZmluZSBIQ19TdWJBX0hUWG5GTSAgICAgICAgICAweDAwN2IKKyNkZWZpbmUgSENfU3ViQV9IVFhuVFJDSCAgICAgICAgMHgwMDdjCisjZGVmaW5lIEhDX1N1YkFfSFRYblRSQ0wgICAgICAgIDB4MDA3ZAorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkMgICAgICAgICAweDAwN2UKKyNkZWZpbmUgSENfU3ViQV9IVFhuVFJBSCAgICAgICAgMHgwMDdmCisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTENzYXQgICAgIDB4MDA4MAorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxDb3AgICAgICAweDAwODEKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMTVBmb2cgICAgMHgwMDgyCisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTEFzYXQgICAgIDB4MDA4MworI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSQ2EgICAgICAweDAwODUKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkNiICAgICAgMHgwMDg2CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJDYyAgICAgIDB4MDA4NworI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSQ2JpYXMgICAweDAwODgKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkFhICAgICAgMHgwMDg5CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJGb2cgICAgIDB4MDA4YQorI2RlZmluZSBIQ19TdWJBX0hUWG5CdW1wTTAwICAgICAweDAwOTAKKyNkZWZpbmUgSENfU3ViQV9IVFhuQnVtcE0wMSAgICAgMHgwMDkxCisjZGVmaW5lIEhDX1N1YkFfSFRYbkJ1bXBNMTAgICAgIDB4MDA5MgorI2RlZmluZSBIQ19TdWJBX0hUWG5CdW1wTTExICAgICAweDAwOTMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTFNjYWxlICAgICAgMHgwMDk0CisjZGVmaW5lIEhDX1N1YkFfSFRYU01EICAgICAgICAgIDB4MDAwMAorLyogSENfU3ViQV9IVFhuTDAxMkJhc0ggICAgMHgwMDIwCisgKi8KKyNkZWZpbmUgSENfSFRYbkwwQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDFCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MMkJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDJCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDM0NUJhc0ggICAgMHgwMDIxCisgKi8KKyNkZWZpbmUgSENfSFRYbkwzQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDRCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MNUJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw0QmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDVCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDY3OEJhc0ggICAgMHgwMDIyCisgKi8KKyNkZWZpbmUgSENfSFRYbkw2QmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDdCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MOEJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw3QmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDhCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDlhYkJhc0ggICAgMHgwMDIzCisgKi8KKyNkZWZpbmUgSENfSFRYbkw5QmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTGFCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MYkJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxhQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTGJCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTGNkZUJhc0ggICAgMHgwMDI0CisgKi8KKyNkZWZpbmUgSENfSFRYbkxjQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTGRCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MZUJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxkQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTGVCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTGNkZUJhc0ggICAgMHgwMDI1CisgKi8KKyNkZWZpbmUgSENfSFRYbkxmQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDEwQmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTDExQmFzSF9NQVNLICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFhuTDEwQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDExQmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkwwUGl0ICAgICAgIDB4MDAyYgorICovCisjZGVmaW5lIEhDX0hUWG5MblBpdF9NQVNLICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFRYbkVuUGl0X01BU0sgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IVFhuTG5QaXRFX01BU0sgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MblBpdEVfU0hJRlQgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MMF81V0UgICAgICAweDAwNGIKKyAqLworI2RlZmluZSBIQ19IVFhuTDBXRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MMVdFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkwyV0VfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTDNXRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MNFdFX01BU0sgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw1V0VfTUFTSyAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTDFXRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MMldFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkwzV0VfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkw0V0VfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkw1V0VfU0hJRlQgICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkw2X2JXRSAgICAgIDB4MDA0YworICovCisjZGVmaW5lIEhDX0hUWG5MNldFX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSFRYbkw3V0VfTUFTSyAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IVFhuTDhXRV9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hUWG5MOVdFX01BU0sgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgSENfSFRYbkxhV0VfTUFTSyAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19IVFhuTGJXRV9NQVNLICAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MN1dFX1NISUZUICAgICAgIDQKKyNkZWZpbmUgSENfSFRYbkw4V0VfU0hJRlQgICAgICAgOAorI2RlZmluZSBIQ19IVFhuTDlXRV9TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTGFXRV9TSElGVCAgICAgICAxNgorI2RlZmluZSBIQ19IVFhuTGJXRV9TSElGVCAgICAgICAyMAorLyogSENfU3ViQV9IVFhuTGNfMTFXRSAgICAgIDB4MDA0ZAorICovCisjZGVmaW5lIEhDX0hUWG5MY1dFX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSFRYbkxkV0VfTUFTSyAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IVFhuTGVXRV9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hUWG5MZldFX01BU0sgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgSENfSFRYbkwxMFdFX01BU0sgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19IVFhuTDExV0VfTUFTSyAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MZFdFX1NISUZUICAgICAgIDQKKyNkZWZpbmUgSENfSFRYbkxlV0VfU0hJRlQgICAgICAgOAorI2RlZmluZSBIQ19IVFhuTGZXRV9TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTDEwV0VfU0hJRlQgICAgICAxNgorI2RlZmluZSBIQ19IVFhuTDExV0VfU0hJRlQgICAgICAyMAorLyogSENfU3ViQV9IVFhuTDBfNUhFICAgICAgMHgwMDUxCisgKi8KKyNkZWZpbmUgSENfSFRYbkwwSEVfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuTDFIRV9NQVNLICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hUWG5MMkhFX01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSFRYbkwzSEVfTUFTSyAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19IVFhuTDRIRV9NQVNLICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hUWG5MNUhFX01BU0sgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkwxSEVfU0hJRlQgICAgICAgNAorI2RlZmluZSBIQ19IVFhuTDJIRV9TSElGVCAgICAgICA4CisjZGVmaW5lIEhDX0hUWG5MM0hFX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MNEhFX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5MNUhFX1NISUZUICAgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MNl9iSEUgICAgICAweDAwNTIKKyAqLworI2RlZmluZSBIQ19IVFhuTDZIRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MN0hFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkw4SEVfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTDlIRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MYUhFX01BU0sgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxiSEVfTUFTSyAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTDdIRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MOEhFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkw5SEVfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkxhSEVfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkxiSEVfU0hJRlQgICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkxjXzExSEUgICAgICAweDAwNTMKKyAqLworI2RlZmluZSBIQ19IVFhuTGNIRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MZEhFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkxlSEVfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTGZIRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MMTBIRV9NQVNLICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxMUhFX01BU0sgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTGRIRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MZUhFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkxmSEVfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkwxMEhFX1NISUZUICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkwxMUhFX1NISUZUICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkwwT1MgICAgICAgIDB4MDA3NworICovCisjZGVmaW5lIEhDX0hUWG5MME9TX01BU0sgICAgICAgIDB4MDAzZmYwMDAKKyNkZWZpbmUgSENfSFRYbkxWbWF4X01BU0sgICAgICAgMHgwMDAwMGZjMAorI2RlZmluZSBIQ19IVFhuTFZtaW5fTUFTSyAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIEhDX0hUWG5MME9TX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MVm1heF9TSElGVCAgICAgIDYKKy8qIEhDX1N1YkFfSFRYblRCICAgICAgICAgIDB4MDA3OAorICovCisjZGVmaW5lIEhDX0hUWG5UQl9NQVNLICAgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfTUFTSyAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBIQ19IVFhuRkxTc19NQVNLICAgICAgICAweDAwMDAxYzAwCisjZGVmaW5lIEhDX0hUWG5GTFRlX01BU0sgICAgICAgIDB4MDAwMDAzODAKKyNkZWZpbmUgSENfSFRYbkZMVHNfTUFTSyAgICAgICAgMHgwMDAwMDA3MAorI2RlZmluZSBIQ19IVFhuRkxEc19NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5UQl9Ob1RCICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCX1RCQ19TICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJfVEJDX1QgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQl9UQl9TICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCX1RCX1QgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9OZWFyZXN0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX0xpbmVhciAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfTm9uTGluZWFyICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9TaGFycCAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX0ZsYXRfR2F1c3NpYW5fQ3ViaWMgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IVFhuRkxTc19OZWFyZXN0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNzX0xpbmVhciAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSENfSFRYbkZMU3NfTm9uTGluZWFyICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IVFhuRkxTc19GbGF0X0dhdXNzaWFuX0N1YmljIDB4MDAwMDE4MDAKKyNkZWZpbmUgSENfSFRYbkZMVGVfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxUZV9MaW5lYXIgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hUWG5GTFRlX05vbkxpbmVhciAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFRYbkZMVGVfU2hhcnAgICAgICAgMHgwMDAwMDE4MAorI2RlZmluZSBIQ19IVFhuRkxUZV9GbGF0X0dhdXNzaWFuX0N1YmljIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSFRYbkZMVHNfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxUc19MaW5lYXIgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hUWG5GTFRzX05vbkxpbmVhciAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFRYbkZMVHNfRmxhdF9HYXVzc2lhbl9DdWJpYyAweDAwMDAwMDYwCisjZGVmaW5lIEhDX0hUWG5GTERzX1RleDAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMRHNfTmVhcmVzdCAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IVFhuRkxEc19MaW5lYXIgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hUWG5GTERzX05vbkxpbmVhciAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFRYbkZMRHNfRGl0aGVyICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IVFhuRkxEc19Db25zdExPRCAgICAweDAwMDAwMDA1CisjZGVmaW5lIEhDX0hUWG5GTERzX0FuaSAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgSENfSFRYbkZMRHNfQW5pRGl0aGVyICAgMHgwMDAwMDAwNworLyogSENfU3ViQV9IVFhuTVBNRCAgICAgICAgMHgwMDc5CisgKi8KKyNkZWZpbmUgSENfSFRYbk1QTURfU01BU0sgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9UTUFTSyAgICAgICAweDAwMzgwMDAwCisjZGVmaW5lIEhDX0hUWG5MT0REVGZfTUFTSyAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfSFRYblhZMlNUX01BU0sgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IVFhuTVBNRF9Uc2luZ2xlICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1RjbGFtcCAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfVHJlcGVhdCAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9UbWlycm9yICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1R3cmFwICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU3NpbmdsZSAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9TY2xhbXAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1NyZXBlYXQgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU21pcnJvciAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9Td3JhcCAgICAgICAweDAwMDQwMDAwCisvKiBIQ19TdWJBX0hUWG5DTE9EdSAgICAgICAweDAwN2EKKyAqLworI2RlZmluZSBIQ19IVFhuQ0xPRHVfTUFTSyAgICAgICAweDAwMGZmYzAwCisjZGVmaW5lIEhDX0hUWG5DTE9EZF9NQVNLICAgICAgIDB4MDAwMDAzZmYKKyNkZWZpbmUgSENfSFRYbkNMT0R1X1NISUZUICAgICAgMTAKKy8qIEhDX1N1YkFfSFRYbkZNICAgICAgICAgIDB4MDA3YgorICovCisjZGVmaW5lIEhDX0hUWG5GTV9NQVNLICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxvY19NQVNLICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IVFhuRk1fSU5ERVggICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9JbnRlbnNpdHkgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0x1bSAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQWxwaGEgICAgICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9EWCAgICAgICAgICAgIDB4MDAyODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0IxNiAgICAgICAgMHgwMDg4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjMyICAgICAgICAweDAwOTgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSMTYgICAgICAgIDB4MDBhODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FCR1IzMiAgICAgICAgMHgwMGI4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTE2ICAgICAgICAweDAwYzgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBMzIgICAgICAgIDB4MDBkODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkExNiAgICAgICAgMHgwMGU4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTMyICAgICAgICAweDAwZjgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9CVU1QTUFQICAgICAgIDB4MDAzODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0luZGV4MSAgICAgICAgKEhDX0hUWG5GTV9JTkRFWCAgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fSW5kZXgyICAgICAgICAoSENfSFRYbkZNX0lOREVYICAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9JbmRleDQgICAgICAgIChIQ19IVFhuRk1fSU5ERVggICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0luZGV4OCAgICAgICAgKEhDX0hUWG5GTV9JTkRFWCAgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVDEgICAgICAgICAgICAoSENfSFRYbkZNX0ludGVuc2l0eSB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9UMiAgICAgICAgICAgIChIQ19IVFhuRk1fSW50ZW5zaXR5IHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1Q0ICAgICAgICAgICAgKEhDX0hUWG5GTV9JbnRlbnNpdHkgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVDggICAgICAgICAgICAoSENfSFRYbkZNX0ludGVuc2l0eSB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MMSAgICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0wyICAgICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fTDQgICAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MOCAgICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FMNDQgICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDQwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUw4OCAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwNTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BMSAgICAgICAgICAgIChIQ19IVFhuRk1fQWxwaGEgICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0EyICAgICAgICAgICAgKEhDX0hUWG5GTV9BbHBoYSAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQTQgICAgICAgICAgICAoSENfSFRYbkZNX0FscGhhICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BOCAgICAgICAgICAgIChIQ19IVFhuRk1fQWxwaGEgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0RYMSAgICAgICAgICAgKEhDX0hUWG5GTV9EWCAgICAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fRFgyMyAgICAgICAgICAoSENfSFRYbkZNX0RYICAgICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9EWDQ1ICAgICAgICAgIChIQ19IVFhuRk1fRFggICAgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQjU1NSAgICAgICAgKEhDX0hUWG5GTV9BUkdCMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCNTY1ICAgICAgICAoSENfSFRYbkZNX0FSR0IxNiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCMTU1NSAgICAgIChIQ19IVFhuRk1fQVJHQjE2ICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0I0NDQ0ICAgICAgKEhDX0hUWG5GTV9BUkdCMTYgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjA4ODggICAgICAoSENfSFRYbkZNX0FSR0IzMiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCODg4OCAgICAgIChIQ19IVFhuRk1fQVJHQjMyICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUjU1NSAgICAgICAgKEhDX0hUWG5GTV9BQkdSMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSNTY1ICAgICAgICAoSENfSFRYbkZNX0FCR1IxNiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSMTU1NSAgICAgIChIQ19IVFhuRk1fQUJHUjE2ICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FCR1I0NDQ0ICAgICAgKEhDX0hUWG5GTV9BQkdSMTYgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUJHUjA4ODggICAgICAoSENfSFRYbkZNX0FCR1IzMiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSODg4OCAgICAgIChIQ19IVFhuRk1fQUJHUjMyICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE1NTUwICAgICAgKEhDX0hUWG5GTV9SR0JBMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTU1NTEgICAgICAoSENfSFRYbkZNX1JHQkExNiAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBNDQ0NCAgICAgIChIQ19IVFhuRk1fUkdCQTE2ICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE4ODgwICAgICAgKEhDX0hUWG5GTV9SR0JBMzIgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTg4ODggICAgICAoSENfSFRYbkZNX1JHQkEzMiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBNTU1MCAgICAgIChIQ19IVFhuRk1fQkdSQTE2ICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkE1NTUxICAgICAgKEhDX0hUWG5GTV9CR1JBMTYgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTQ0NDQgICAgICAoSENfSFRYbkZNX0JHUkExNiAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBODg4MCAgICAgIChIQ19IVFhuRk1fQkdSQTMyICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkE4ODg4ICAgICAgKEhDX0hUWG5GTV9CR1JBMzIgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVlU4OCAgICAgICAgICAoSENfSFRYbkZNX0JVTVBNQVAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MVlU2NTUgICAgICAgIChIQ19IVFhuRk1fQlVNUE1BUCAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0xWVTg4OCAgICAgICAgKEhDX0hUWG5GTV9CVU1QTUFQICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuTG9jX0xvY2FsICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5Mb2NfU3lzICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFRYbkxvY19BR1AgICAgICAgICAgMHgwMDAwMDAwMworLyogSENfU3ViQV9IVFhuVFJBSCAgICAgICAgMHgwMDdmCisgKi8KKyNkZWZpbmUgSENfSFRYblRSQUhfTUFTSyAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFhuVFJBTF9NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5UQkFfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYblRSQUhfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYblRSQUxfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IVFhuVEJMQ3NhdCAgICAgMHgwMDgwCisgKi0tIERlZmluZSB0aGUgaW5wdXQgdGV4dHVyZS4KKyAqLworI2RlZmluZSBIQ19YVENfVE9QQyAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hUQ19JbnZUT1BDICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRDX1RPUENwNSAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19YVENfQ2JpYXMgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hUQ19JbnZDYmlhcyAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRDXzAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVENfRGlmICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hUQ19TcGVjICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWFRDX1RleCAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YVENfQ3VyICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hUQ19BZGlmICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfWFRDX0ZvZyAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19YVENfQXRleCAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX1hUQ19BY3VyICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWFRDX0hUWG5UQkxSQyAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBIQ19YVENfQ3RleG5leHQgICAgICAgICAweDAwMDAwMDBhCisvKi0tCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTENzYXRfTUFTSyAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ2FfTUFTSyAgICAgICAweDAwMGZjMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9NQVNLICAgICAgIDB4MDAwMDFmODAKKyNkZWZpbmUgSENfSFRYblRCTENjX01BU0sgICAgICAgMHgwMDAwMDAzZgorI2RlZmluZSBIQ19IVFhuVEJMQ2FfVE9QQyAgICAgICAoSENfWFRDX1RPUEMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9JbnZUT1BDICAgIChIQ19YVENfSW52VE9QQyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV8wICAgICAgICAgIChIQ19YVENfMCA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0RpZiAgICAgICAgKEhDX1hUQ19EaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX1RleCAgICAgICAgKEhDX1hUQ19UZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9DdXIgICAgICAgIChIQ19YVENfQ3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9Gb2cgICAgICAgIChIQ19YVENfRm9nIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQXRleCAgICAgICAoSENfWFRDX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0hUWG5UQkxSQyAgKEhDX1hUQ19IVFhuVEJMUkMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9DdGV4bmV4dCAgIChIQ19YVENfQ3RleG5leHQgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9UT1BDICAgICAgIChIQ19YVENfVE9QQyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfSW52VE9QQyAgICAoSENfWFRDX0ludlRPUEMgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiXzAgICAgICAgICAgKEhDX1hUQ18wIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9EaWYgICAgICAgIChIQ19YVENfRGlmIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfVGV4ICAgICAgICAoSENfWFRDX1RleCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQ3VyICAgICAgICAoSENfWFRDX0N1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0ZvZyAgICAgICAgKEhDX1hUQ19Gb2cgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0F0ZXggICAgICAgKEhDX1hUQ19BdGV4IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfSFRYblRCTFJDICAoSENfWFRDX0hUWG5UQkxSQyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQ3RleG5leHQgICAoSENfWFRDX0N0ZXhuZXh0IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDY19UT1BDICAgICAgIChIQ19YVENfVE9QQyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfSW52VE9QQyAgICAoSENfWFRDX0ludlRPUEMgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjXzAgICAgICAgICAgKEhDX1hUQ18wIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19EaWYgICAgICAgIChIQ19YVENfRGlmIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfVGV4ICAgICAgICAoSENfWFRDX1RleCA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQ3VyICAgICAgICAoSENfWFRDX0N1ciA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0ZvZyAgICAgICAgKEhDX1hUQ19Gb2cgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0F0ZXggICAgICAgKEhDX1hUQ19BdGV4IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfSFRYblRCTFJDICAoSENfWFRDX0hUWG5UQkxSQyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQ3RleG5leHQgICAoSENfWFRDX0N0ZXhuZXh0IDw8IDApCisvKiBIQ19TdWJBX0hUWG5UQkxDb3AgICAgICAweDAwODEKKyAqLworI2RlZmluZSBIQ19IVFhuVEJMZG90X01BU0sgICAgICAweDAwYzAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfTUFTSyAgICAgIDB4MDAzODAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX01BU0sgICAgMHgwMDA3YzAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0X01BU0sgICAweDAwMDAxODAwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfTUFTSyAgICAgIDB4MDAwMDAzODAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX01BU0sgICAgMHgwMDAwMDA3OAorI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0X01BU0sgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfQWRkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENvcF9TdWIgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ29wX01pbiAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfTWF4ICAgICAgIDB4MDAxODAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENvcF9NYXNrICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQ2JpYXMgICAgICAgICAgIChIQ19YVENfQ2JpYXMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19JbnZDYmlhcyAgICAgICAgKEhDX1hUQ19JbnZDYmlhcyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzXzAgICAgICAgICAgICAgICAoSENfWFRDXzAgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19EaWYgICAgICAgICAgICAgKEhDX1hUQ19EaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19TcGVjICAgICAgICAgICAgKEhDX1hUQ19TcGVjIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfVGV4ICAgICAgICAgICAgIChIQ19YVENfVGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQ3VyICAgICAgICAgICAgIChIQ19YVENfQ3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQWRpZiAgICAgICAgICAgIChIQ19YVENfQWRpZiA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0ZvZyAgICAgICAgICAgICAoSENfWFRDX0ZvZyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0F0ZXggICAgICAgICAgICAoSENfWFRDX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19BY3VyICAgICAgICAgICAgKEhDX1hUQ19BY3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfSFRYblRCTFJDICAgICAgIChIQ19YVENfSFRYblRCTFJDIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0XzEgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDc2hpZnRfMiAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFRYblRCTENzaGlmdF9ObyAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0X0RvdFAgICAweDAwMDAxODAwCisvKj0qIEpvaG4gU2hlbmcgWzIwMDMuNy4xOF0gdGV4dHVyZSBjb21iaW5lICo9Ki8KKyNkZWZpbmUgSENfSFRYblRCTERPVDMgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxET1Q0ICAgMHgwMDBDMDAwMAorCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfQWRkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTEFvcF9TdWIgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IVFhuVEJMQW9wX01pbiAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfTWF4ICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSENfSFRYblRCTEFvcF9NYXNrICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfSW52ICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0FkaWYgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19Gb2cgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfQWN1ciAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0hUWG5UQkxSQWJpYXMgICAweDAwMDAwMDE4CisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19BdGV4ICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0XzEgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBc2hpZnRfMiAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSFRYblRCTEFzaGlmdF9ObyAgICAgMHgwMDAwMDAwMgorLyogI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0X0RvdFAgICAweDAwMDAwMDAzICovCisvKiBIQ19TdWJBX0hUWG5UQkxNUEZvZyAgICAweDAwODIKKyAqLworI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfTUFTSyAgICAweDAwZTAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ18wICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0FkaWYgICAgMHgwMDIwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfRm9nICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ19BdGV4ICAgIDB4MDA2MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0FjdXIgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfR0hUWG5UQkxSRm9nICAgIDB4MDBhMDAwMDAKKy8qIEhDX1N1YkFfSFRYblRCTEFzYXQgICAgIDB4MDA4MworICotLSBEZWZpbmUgdGhlIHRleHR1cmUgYWxwaGEgaW5wdXQuCisgKi8KKyNkZWZpbmUgSENfWFRBX1RPUEEgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVEFfSW52VE9QQSAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX1hUQV9UT1BBcDUgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRBX0FkaWYgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVEFfRm9nICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hUQV9BY3VyICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWFRBX0hUWG5UQkxSQSAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YVEFfQXRleCAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hUQV9BdGV4bmV4dCAgICAgICAgIDB4MDAwMDAwMDUKKy8qLS0KKyAqLworI2RlZmluZSBIQ19IVFhuVEJMQXNhdF9NQVNLICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBTUJfTUFTSyAgICAgIDB4MDA3MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTEFhX01BU0sgICAgICAgMHgwMDA3YzAwMAorI2RlZmluZSBIQ19IVFhuVEJMQWJfTUFTSyAgICAgICAweDAwMDAwZjgwCisjZGVmaW5lIEhDX0hUWG5UQkxBY19NQVNLICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgSENfSFRYblRCTEFNQl9TSElGVCAgICAgMjAKKyNkZWZpbmUgSENfSFRYblRCTEFhX1RPUEEgICAgICAgKEhDX1hUQV9UT1BBIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfSW52VE9QQSAgICAoSENfWFRBX0ludlRPUEEgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9UT1BBcDUgICAgIChIQ19YVEFfVE9QQXA1IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQWRpZiAgICAgICAoSENfWFRBX0FkaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9Gb2cgICAgICAgIChIQ19YVEFfRm9nIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQWN1ciAgICAgICAoSENfWFRBX0FjdXIgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9IVFhuVEJMUkEgIChIQ19YVEFfSFRYblRCTFJBIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQXRleCAgICAgICAoSENfWFRBX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9BdGV4bmV4dCAgIChIQ19YVEFfQXRleG5leHQgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9UT1BBICAgICAgIChIQ19YVEFfVE9QQSA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfSW52VE9QQSAgICAoSENfWFRBX0ludlRPUEEgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX1RPUEFwNSAgICAgKEhDX1hUQV9UT1BBcDUgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0FkaWYgICAgICAgKEhDX1hUQV9BZGlmIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9Gb2cgICAgICAgIChIQ19YVEFfRm9nIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9BY3VyICAgICAgIChIQ19YVEFfQWN1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfSFRYblRCTFJBICAoSENfWFRBX0hUWG5UQkxSQSA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfQXRleCAgICAgICAoSENfWFRBX0F0ZXggPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0F0ZXhuZXh0ICAgKEhDX1hUQV9BdGV4bmV4dCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWNfVE9QQSAgICAgICAoSENfWFRBX1RPUEEgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0ludlRPUEEgICAgKEhDX1hUQV9JbnZUT1BBIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19UT1BBcDUgICAgIChIQ19YVEFfVE9QQXA1IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19BZGlmICAgICAgIChIQ19YVEFfQWRpZiA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfRm9nICAgICAgICAoSENfWFRBX0ZvZyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfQWN1ciAgICAgICAoSENfWFRBX0FjdXIgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0hUWG5UQkxSQSAgKEhDX1hUQV9IVFhuVEJMUkEgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0F0ZXggICAgICAgKEhDX1hUQV9BdGV4IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19BdGV4bmV4dCAgIChIQ19YVEFfQXRleG5leHQgPDwgMCkKKy8qIEhDX1N1YkFfSFRYblRCTFJBYSAgICAgIDB4MDA4OQorICovCisjZGVmaW5lIEhDX0hUWG5UQkxSQWFfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYblRCTFJBYl9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuVEJMUkFjX01BU0sgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hUWG5UQkxSQWFfU0hJRlQgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5UQkxSQWJfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYblRCTFJBY19TSElGVCAgICAgMAorLyogSENfU3ViQV9IVFhuVEJMUkZvZyAgICAgMHgwMDhhCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTFJGb2dfTUFTSyAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuVEJMUkFiaWFzX01BU0sgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hUWG5UQkxSRm9nX1NISUZUICAgIDgKKyNkZWZpbmUgSENfSFRYblRCTFJBYmlhc19TSElGVCAgMAorLyogSENfU3ViQV9IVFhuTFNjYWxlICAgICAgMHgwMDk0CisgKi8KKyNkZWZpbmUgSENfSFRYbkxTY2FsZV9NQVNLICAgICAgMHgwMDA3ZmMwMAorI2RlZmluZSBIQ19IVFhuTE9mZl9NQVNLICAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0hUWG5MU2NhbGVfU0hJRlQgICAgIDEwCisvKiBIQ19TdWJBX0hUWFNNRCAgICAgICAgICAweDAwMDAKKyAqLworI2RlZmluZSBIQ19IVFhTTURfTUFTSyAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hUWFRNRF9NQVNLICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFRYTnVtX01BU0sgICAgICAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBIQ19IVFhUUk1EX01BU0sgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEhDX0hUWENIQ0xSX01BU0sgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSFRYTnVtX1NISUZUICAgICAgICAgMworCisvKiBUZXh0dXJlIFBhbGV0dGUgbgorICovCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfU3ViVHlwZV9UZXhQYWxldHRlMSAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19TdWJUeXBlX0ZvZ1RhYmxlICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1N1YlR5cGVfU3RpcHBsZSAgICAgIDB4MDAwMDAwMTQKKy8qIEhDX1N1YkFfVGV4UGFsZXR0ZTAgICAgIDB4MDAwMAorICovCisjZGVmaW5lIEhDX0hUUG5BX01BU0sgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfSFRQblJfTUFTSyAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFBuR19NQVNLICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUUG5CX01BU0sgICAgICAgICAgIDB4MDAwMDAwZmYKKy8qIEhDX1N1YkFfRm9nVGFibGUgICAgICAgIDB4MDAxMAorICovCisjZGVmaW5lIEhDX0hGUG4zX01BU0sgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfSEZQbjJfTUFTSyAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IRlBuMV9NQVNLICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hGUG5fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEZQbjNfU0hJRlQgICAgICAgICAgMjQKKyNkZWZpbmUgSENfSEZQbjJfU0hJRlQgICAgICAgICAgMTYKKyNkZWZpbmUgSENfSEZQbjFfU0hJRlQgICAgICAgICAgOAorCisvKiBBdXRvIFRlc3RpbmcgJiBTZWN1cml0eQorICovCisjZGVmaW5lIEhDX1N1YkFfSGVuRklGT0FUICAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19TdWJBX0hGQkRyYXdGaXJzdCAgICAweDAwMDQKKyNkZWZpbmUgSENfU3ViQV9IRkJCYXNMICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEhDX1N1YkFfSEZCRHN0ICAgICAgICAgIDB4MDAwNgorLyogSENfU3ViQV9IZW5GSUZPQVQgICAgICAgMHgwMDAwCisgKi8KKyNkZWZpbmUgSENfSGVuRklGT0FUX01BU0sgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IZW5HRU1JTG9ja19NQVNLICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hlbkZCQVN3YXBfTUFTSyAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSGVuT1RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IZW5DTURRX01BU0sgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hlblRYQ1RTVV9NQVNLICAgICAgIDB4MDAwMDAwMDEKKy8qIEhDX1N1YkFfSEZCRHJhd0ZpcnN0ICAgIDB4MDAwNAorICovCisjZGVmaW5lIEhDX0hGQkRyYXdGaXJzdF9NQVNLICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSEZCUXVldWVfTUFTSyAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IRkJMb2NrX01BU0sgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hFT0ZfTUFTSyAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSEZCQmFzSF9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorCisvKiBHRU1JIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hUQXJiUkNNICAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJaICAgICAgICAgMHgwMDBhCisjZGVmaW5lIEhDX1N1YkFfSFRBcmJXWiAgICAgICAgIDB4MDAwYgorI2RlZmluZSBIQ19TdWJBX0hUQXJiUlRYICAgICAgICAweDAwMGMKKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJDVyAgICAgICAgMHgwMDBkCisjZGVmaW5lIEhDX1N1YkFfSFRBcmJFMiAgICAgICAgIDB4MDAwZQorI2RlZmluZSBIQ19TdWJBX0hBcmJSUUNNICAgICAgICAweDAwMTAKKyNkZWZpbmUgSENfU3ViQV9IQXJiV1FDTSAgICAgICAgMHgwMDExCisjZGVmaW5lIEhDX1N1YkFfSEdFTUlUb3V0ICAgICAgIDB4MDAyMAorI2RlZmluZSBIQ19TdWJBX0hGdGhSVFhEICAgICAgICAweDAwNDAKKyNkZWZpbmUgSENfU3ViQV9IRnRoUlRYQSAgICAgICAgMHgwMDQ0CisjZGVmaW5lIEhDX1N1YkFfSENNRFFzdEwgICAgICAgIDB4MDA1MAorI2RlZmluZSBIQ19TdWJBX0hDTURRZW5kTCAgICAgICAweDAwNTEKKyNkZWZpbmUgSENfU3ViQV9IQ01EUUxlbiAgICAgICAgMHgwMDUyCisvKiBIQ19TdWJBX0hUQXJiUkNNICAgICAgICAweDAwMDgKKyAqLworI2RlZmluZSBIQ19IVEFyYlJDTV9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUlogICAgICAgICAweDAwMGEKKyAqLworI2RlZmluZSBIQ19IVEFyYlJaX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiV1ogICAgICAgICAweDAwMGIKKyAqLworI2RlZmluZSBIQ19IVEFyYldaX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUlRYICAgICAgICAweDAwMGMKKyAqLworI2RlZmluZSBIQ19IVEFyYlJUWF9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUkNXICAgICAgICAweDAwMGQKKyAqLworI2RlZmluZSBIQ19IVEFyYlJDV19NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiRTIgICAgICAgICAweDAwMGUKKyAqLworI2RlZmluZSBIQ19IVEFyYkUyX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hBcmJSUUNNICAgICAgICAweDAwMTAKKyAqLworI2RlZmluZSBIQ19IVEFyYlJRQ01fTUFTSyAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hBcmJXUUNNICAgICAgICAweDAwMTEKKyAqLworI2RlZmluZSBIQ19IQXJiV1FDTV9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hHRU1JVG91dCAgICAgICAweDAwMjAKKyAqLworI2RlZmluZSBIQ19IR0VNSVRvdXRfTUFTSyAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hOUEFyYlpDX01BU0sgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSENfSEdFTUlUb3V0X1NISUZUICAgICAgMTYKKy8qIEhDX1N1YkFfSEZ0aFJUWEQgICAgICAgIDB4MDA0MAorICovCisjZGVmaW5lIEhDX0hGdGhSVFhEX01BU0sgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSEZ0aFJaRF9NQVNLICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IRnRoV1pEX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hGdGhSVFhEX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hGdGhSWkRfU0hJRlQgICAgICAgIDgKKy8qIEhDX1N1YkFfSEZ0aFJUWEEgICAgICAgIDB4MDA0NAorICovCisjZGVmaW5lIEhDX0hGdGhSVFhBX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIHRoZSBIYWxjeW9uIEludGVybmFsIHJlZ2lzdGVyIGFjY2VzcyBjb25zdGFudHMuIEZvciBzaW11bGF0b3Igb25seS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfU0lNQV9IQUdQQnN0TCAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJlbmRMICAgICAgIDB4MDAwMQorI2RlZmluZSBIQ19TSU1BX0hBR1BDTU5UICAgICAgICAweDAwMDIKKyNkZWZpbmUgSENfU0lNQV9IQUdQQnBMICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJwSCAgICAgICAgIDB4MDAwNAorI2RlZmluZSBIQ19TSU1BX0hDbGlwVEIgICAgICAgICAweDAwMDUKKyNkZWZpbmUgSENfU0lNQV9IQ2xpcExSICAgICAgICAgMHgwMDA2CisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcFRMICAgICAgIDB4MDAwNworI2RlZmluZSBIQ19TSU1BX0hGUENsaXBCTCAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwTEwgICAgICAgMHgwMDA5CisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcFJMICAgICAgIDB4MDAwYQorI2RlZmluZSBIQ19TSU1BX0hGUENsaXBUQkggICAgICAweDAwMGIKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwTFJIICAgICAgMHgwMDBjCisjZGVmaW5lIEhDX1NJTUFfSExQICAgICAgICAgICAgIDB4MDAwZAorI2RlZmluZSBIQ19TSU1BX0hMUFJGICAgICAgICAgICAweDAwMGUKKyNkZWZpbmUgSENfU0lNQV9IU29saWRDTCAgICAgICAgMHgwMDBmCisjZGVmaW5lIEhDX1NJTUFfSFBpeEdDICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBIQ19TSU1BX0hTUFhZT1MgICAgICAgICAweDAwMTEKKyNkZWZpbmUgSENfU0lNQV9IQ21kQSAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIEhDX1NJTUFfSENtZEIgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBIQ19TSU1BX0hFbmFibGUgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSENfU0lNQV9IWldCQmFzTCAgICAgICAgMHgwMDE1CisjZGVmaW5lIEhDX1NJTUFfSFpXQkJhc0ggICAgICAgIDB4MDAxNgorI2RlZmluZSBIQ19TSU1BX0haV0JUeXBlICAgICAgICAweDAwMTcKKyNkZWZpbmUgSENfU0lNQV9IWkJpYXNMICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEhDX1NJTUFfSFpXQmVuZCAgICAgICAgIDB4MDAxOQorI2RlZmluZSBIQ19TSU1BX0haV1RNRCAgICAgICAgICAweDAwMWEKKyNkZWZpbmUgSENfU0lNQV9IWldDREwgICAgICAgICAgMHgwMDFiCisjZGVmaW5lIEhDX1NJTUFfSFpXQ1RBR251bSAgICAgIDB4MDAxYworI2RlZmluZSBIQ19TSU1BX0haQ1lOdW0gICAgICAgICAweDAwMWQKKyNkZWZpbmUgSENfU0lNQV9IWldDRmlyZSAgICAgICAgMHgwMDFlCisvKiAjZGVmaW5lIEhDX1NJTUFfSFNCQmFzTCAgICAgICAgIDB4MDAxZCAqLworLyogI2RlZmluZSBIQ19TSU1BX0hTQkJhc0ggICAgICAgICAweDAwMWUgKi8KKy8qICNkZWZpbmUgSENfU0lNQV9IU0JGTSAgICAgICAgICAgMHgwMDFmICovCisjZGVmaW5lIEhDX1NJTUFfSFNUUkVGICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBIQ19TSU1BX0hTVE1EICAgICAgICAgICAweDAwMjEKKyNkZWZpbmUgSENfU0lNQV9IQUJCYXNMICAgICAgICAgMHgwMDIyCisjZGVmaW5lIEhDX1NJTUFfSEFCQmFzSCAgICAgICAgIDB4MDAyMworI2RlZmluZSBIQ19TSU1BX0hBQkZNICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgSENfU0lNQV9IQVRNRCAgICAgICAgICAgMHgwMDI1CisjZGVmaW5lIEhDX1NJTUFfSEFCTENzYXQgICAgICAgIDB4MDAyNgorI2RlZmluZSBIQ19TSU1BX0hBQkxDb3AgICAgICAgICAweDAwMjcKKyNkZWZpbmUgSENfU0lNQV9IQUJMQXNhdCAgICAgICAgMHgwMDI4CisjZGVmaW5lIEhDX1NJTUFfSEFCTEFvcCAgICAgICAgIDB4MDAyOQorI2RlZmluZSBIQ19TSU1BX0hBQkxSQ2EgICAgICAgICAweDAwMmEKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkZDYSAgICAgICAgMHgwMDJiCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJDYmlhcyAgICAgIDB4MDAyYworI2RlZmluZSBIQ19TSU1BX0hBQkxSQ2IgICAgICAgICAweDAwMmQKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkZDYiAgICAgICAgMHgwMDJlCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJBYSAgICAgICAgIDB4MDAyZgorI2RlZmluZSBIQ19TSU1BX0hBQkxSQWIgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSENfU0lNQV9IREJCYXNMICAgICAgICAgMHgwMDMxCisjZGVmaW5lIEhDX1NJTUFfSERCQmFzSCAgICAgICAgIDB4MDAzMgorI2RlZmluZSBIQ19TSU1BX0hEQkZNICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgSENfU0lNQV9IRkJCTVNLTCAgICAgICAgMHgwMDM0CisjZGVmaW5lIEhDX1NJTUFfSFJPUCAgICAgICAgICAgIDB4MDAzNQorI2RlZmluZSBIQ19TSU1BX0hGb2dMRiAgICAgICAgICAweDAwMzYKKyNkZWZpbmUgSENfU0lNQV9IRm9nQ0wgICAgICAgICAgMHgwMDM3CisjZGVmaW5lIEhDX1NJTUFfSEZvZ0NIICAgICAgICAgIDB4MDAzOAorI2RlZmluZSBIQ19TSU1BX0hGb2dTdEwgICAgICAgICAweDAwMzkKKyNkZWZpbmUgSENfU0lNQV9IRm9nU3RIICAgICAgICAgMHgwMDNhCisjZGVmaW5lIEhDX1NJTUFfSEZvZ09PZE1GICAgICAgIDB4MDAzYgorI2RlZmluZSBIQ19TSU1BX0hGb2dPT2RFRiAgICAgICAweDAwM2MKKyNkZWZpbmUgSENfU0lNQV9IRm9nRW5kTCAgICAgICAgMHgwMDNkCisjZGVmaW5lIEhDX1NJTUFfSEZvZ0RlbnN0ICAgICAgIDB4MDAzZQorLyotLS0tIHN0YXJ0IG9mIHRleHR1cmUgMCBzZXR0aW5nIC0tLS0KKyAqLworI2RlZmluZSBIQ19TSU1BX0hUWDBMMEJhc0wgICAgICAweDAwNDAKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDFCYXNMICAgICAgMHgwMDQxCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwyQmFzTCAgICAgIDB4MDA0MgorI2RlZmluZSBIQ19TSU1BX0hUWDBMM0Jhc0wgICAgICAweDAwNDMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDRCYXNMICAgICAgMHgwMDQ0CisjZGVmaW5lIEhDX1NJTUFfSFRYMEw1QmFzTCAgICAgIDB4MDA0NQorI2RlZmluZSBIQ19TSU1BX0hUWDBMNkJhc0wgICAgICAweDAwNDYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDdCYXNMICAgICAgMHgwMDQ3CisjZGVmaW5lIEhDX1NJTUFfSFRYMEw4QmFzTCAgICAgIDB4MDA0OAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOUJhc0wgICAgICAweDAwNDkKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGFCYXNMICAgICAgMHgwMDRhCisjZGVmaW5lIEhDX1NJTUFfSFRYMExiQmFzTCAgICAgIDB4MDA0YgorI2RlZmluZSBIQ19TSU1BX0hUWDBMY0Jhc0wgICAgICAweDAwNGMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGRCYXNMICAgICAgMHgwMDRkCisjZGVmaW5lIEhDX1NJTUFfSFRYMExlQmFzTCAgICAgIDB4MDA0ZQorI2RlZmluZSBIQ19TSU1BX0hUWDBMZkJhc0wgICAgICAweDAwNGYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDEwQmFzTCAgICAgMHgwMDUwCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMUJhc0wgICAgIDB4MDA1MQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMDEyQmFzSCAgICAweDAwNTIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDM0NUJhc0ggICAgMHgwMDUzCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw2NzhCYXNIICAgIDB4MDA1NAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOWFiQmFzSCAgICAweDAwNTUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGNkZUJhc0ggICAgMHgwMDU2CisjZGVmaW5lIEhDX1NJTUFfSFRYMExmMTAxMUJhc0ggIDB4MDA1NworI2RlZmluZSBIQ19TSU1BX0hUWDBMMFBpdCAgICAgICAweDAwNTgKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDFQaXQgICAgICAgMHgwMDU5CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwyUGl0ICAgICAgIDB4MDA1YQorI2RlZmluZSBIQ19TSU1BX0hUWDBMM1BpdCAgICAgICAweDAwNWIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDRQaXQgICAgICAgMHgwMDVjCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw1UGl0ICAgICAgIDB4MDA1ZAorI2RlZmluZSBIQ19TSU1BX0hUWDBMNlBpdCAgICAgICAweDAwNWUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDdQaXQgICAgICAgMHgwMDVmCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw4UGl0ICAgICAgIDB4MDA2MAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOVBpdCAgICAgICAweDAwNjEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGFQaXQgICAgICAgMHgwMDYyCisjZGVmaW5lIEhDX1NJTUFfSFRYMExiUGl0ICAgICAgIDB4MDA2MworI2RlZmluZSBIQ19TSU1BX0hUWDBMY1BpdCAgICAgICAweDAwNjQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGRQaXQgICAgICAgMHgwMDY1CisjZGVmaW5lIEhDX1NJTUFfSFRYMExlUGl0ICAgICAgIDB4MDA2NgorI2RlZmluZSBIQ19TSU1BX0hUWDBMZlBpdCAgICAgICAweDAwNjcKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDEwUGl0ICAgICAgMHgwMDY4CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMVBpdCAgICAgIDB4MDA2OQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMF81V0UgICAgICAweDAwNmEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZfYldFICAgICAgMHgwMDZiCisjZGVmaW5lIEhDX1NJTUFfSFRYMExjXzExV0UgICAgIDB4MDA2YworI2RlZmluZSBIQ19TSU1BX0hUWDBMMF81SEUgICAgICAweDAwNmQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZfYkhFICAgICAgMHgwMDZlCisjZGVmaW5lIEhDX1NJTUFfSFRYMExjXzExSEUgICAgIDB4MDA2ZgorI2RlZmluZSBIQ19TSU1BX0hUWDBMME9TICAgICAgICAweDAwNzAKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEIgICAgICAgICAgMHgwMDcxCisjZGVmaW5lIEhDX1NJTUFfSFRYME1QTUQgICAgICAgIDB4MDA3MgorI2RlZmluZSBIQ19TSU1BX0hUWDBDTE9EdSAgICAgICAweDAwNzMKKyNkZWZpbmUgSENfU0lNQV9IVFgwRk0gICAgICAgICAgMHgwMDc0CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRSQ0ggICAgICAgIDB4MDA3NQorI2RlZmluZSBIQ19TSU1BX0hUWDBUUkNMICAgICAgICAweDAwNzYKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJDICAgICAgICAgMHgwMDc3CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRSQUggICAgICAgIDB4MDA3OAorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxDc2F0ICAgICAweDAwNzkKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMQ29wICAgICAgMHgwMDdhCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTE1QZm9nICAgIDB4MDA3YgorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxBc2F0ICAgICAweDAwN2MKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkNhICAgICAgMHgwMDdkCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJDYiAgICAgIDB4MDA3ZQorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSQ2MgICAgICAweDAwN2YKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkNiaWFzICAgMHgwMDgwCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJBYSAgICAgIDB4MDA4MQorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSRm9nICAgICAweDAwODIKKyNkZWZpbmUgSENfU0lNQV9IVFgwQnVtcE0wMCAgICAgMHgwMDgzCisjZGVmaW5lIEhDX1NJTUFfSFRYMEJ1bXBNMDEgICAgIDB4MDA4NAorI2RlZmluZSBIQ19TSU1BX0hUWDBCdW1wTTEwICAgICAweDAwODUKKyNkZWZpbmUgSENfU0lNQV9IVFgwQnVtcE0xMSAgICAgMHgwMDg2CisjZGVmaW5lIEhDX1NJTUFfSFRYMExTY2FsZSAgICAgIDB4MDA4NworLyotLS0tIGVuZCBvZiB0ZXh0dXJlIDAgc2V0dGluZyAtLS0tICAgICAgMHgwMDhmCisgKi8KKyNkZWZpbmUgSENfU0lNQV9UWDBUWDFfT0ZGICAgICAgMHgwMDUwCisvKi0tLS0gc3RhcnQgb2YgdGV4dHVyZSAxIHNldHRpbmcgLS0tLQorICovCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwyQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwzQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMM0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw0QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw1QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw3QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMN0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw4QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMOEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw5QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMOUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxhQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMYUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxiQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMYkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxjQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMY0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxkQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxlQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxmQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMEJhc0wgICAgIChIQ19TSU1BX0hUWDBMMTBCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMTFCYXNMICAgICAoSENfU0lNQV9IVFgwTDExQmFzTCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDAxMkJhc0ggICAgKEhDX1NJTUFfSFRYMEwwMTJCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMzQ1QmFzSCAgICAoSENfU0lNQV9IVFgwTDM0NUJhc0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2NzhCYXNIICAgIChIQ19TSU1BX0hUWDBMNjc4QmFzSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDlhYkJhc0ggICAgKEhDX1NJTUFfSFRYMEw5YWJCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY2RlQmFzSCAgICAoSENfU0lNQV9IVFgwTGNkZUJhc0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxmMTAxMUJhc0ggIChIQ19TSU1BX0hUWDBMZjEwMTFCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMFBpdCAgICAgICAoSENfU0lNQV9IVFgwTDBQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMMVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDJQaXQgICAgICAgKEhDX1NJTUFfSFRYMEwyUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMM1BpdCAgICAgICAoSENfU0lNQV9IVFgwTDNQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw0UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMNFBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDVQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw1UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNlBpdCAgICAgICAoSENfU0lNQV9IVFgwTDZQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw3UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMN1BpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDhQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw4UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMOVBpdCAgICAgICAoSENfU0lNQV9IVFgwTDlQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxhUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMYVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGJQaXQgICAgICAgKEhDX1NJTUFfSFRYMExiUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY1BpdCAgICAgICAoSENfU0lNQV9IVFgwTGNQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxkUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMZFBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGVQaXQgICAgICAgKEhDX1NJTUFfSFRYMExlUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZlBpdCAgICAgICAoSENfU0lNQV9IVFgwTGZQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMFBpdCAgICAgIChIQ19TSU1BX0hUWDBMMTBQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMVBpdCAgICAgIChIQ19TSU1BX0hUWDBMMTFQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwXzVXRSAgICAgIChIQ19TSU1BX0hUWDBMMF81V0UgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2X2JXRSAgICAgIChIQ19TSU1BX0hUWDBMNl9iV0UgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxjXzExV0UgICAgIChIQ19TSU1BX0hUWDBMY18xMVdFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMF81SEUgICAgICAoSENfU0lNQV9IVFgwTDBfNUhFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNl9iSEUgICAgICAoSENfU0lNQV9IVFgwTDZfYkhFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY18xMUhFICAgICAgKEhDX1NJTUFfSFRYMExjXzExSEUgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwT1MgICAgICAgIChIQ19TSU1BX0hUWDBMME9TICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQiAgICAgICAgICAoSENfU0lNQV9IVFgwVEIgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMU1QTUQgICAgICAgIChIQ19TSU1BX0hUWDBNUE1EICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFDTE9EdSAgICAgICAoSENfU0lNQV9IVFgwQ0xPRHUgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUZNICAgICAgICAgIChIQ19TSU1BX0hUWDBGTSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVFJDSCAgICAgICAgKEhDX1NJTUFfSFRYMFRSQ0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRSQ0wgICAgICAgIChIQ19TSU1BX0hUWDBUUkNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkMgICAgICAgICAoSENfU0lNQV9IVFgwVEJDICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUUkFIICAgICAgICAoSENfU0lNQV9IVFgwVFJBSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFRDICAgICAgICAgKEhDX1NJTUFfSFRYMExUQyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFRBICAgICAgICAgKEhDX1NJTUFfSFRYMExUQSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEJMQ3NhdCAgICAgKEhDX1NJTUFfSFRYMFRCTENzYXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTENvcCAgICAgIChIQ19TSU1BX0hUWDBUQkxDb3AgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTE1QZm9nICAgIChIQ19TSU1BX0hUWDBUQkxNUGZvZyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEJMQXNhdCAgICAgKEhDX1NJTUFfSFRYMFRCTEFzYXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYSAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2EgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYiAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2IgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYyAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2MgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYmlhcyAgIChIQ19TSU1BX0hUWDBUQkxSQ2JpYXMgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJBYSAgICAgIChIQ19TSU1BX0hUWDBUQkxSQWEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJGb2cgICAgIChIQ19TSU1BX0hUWDBUQkxSRm9nICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFCdW1wTTAwICAgICAoSENfU0lNQV9IVFgwQnVtcE0wMCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxQnVtcE0wMSAgICAgKEhDX1NJTUFfSFRYMEJ1bXBNMDEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUJ1bXBNMTAgICAgIChIQ19TSU1BX0hUWDBCdW1wTTEwICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFCdW1wTTExICAgICAoSENfU0lNQV9IVFgwQnVtcE0xMSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFNjYWxlICAgICAgKEhDX1NJTUFfSFRYMExTY2FsZSArIEhDX1NJTUFfVFgwVFgxX09GRikKKy8qLS0tLSBlbmQgb2YgdGV4dHVyZSAxIHNldHRpbmcgLS0tLSAweGFmCisgKi8KKyNkZWZpbmUgSENfU0lNQV9IVFhTTUQgICAgICAgICAgMHgwMGIwCisjZGVmaW5lIEhDX1NJTUFfSGVuRklGT0FUICAgICAgIDB4MDBiMQorI2RlZmluZSBIQ19TSU1BX0hGQkRyYXdGaXJzdCAgICAweDAwYjIKKyNkZWZpbmUgSENfU0lNQV9IRkJCYXNMICAgICAgICAgMHgwMGIzCisjZGVmaW5lIEhDX1NJTUFfSFRBcmJSQ00gICAgICAgIDB4MDBiNAorI2RlZmluZSBIQ19TSU1BX0hUQXJiUlogICAgICAgICAweDAwYjUKKyNkZWZpbmUgSENfU0lNQV9IVEFyYldaICAgICAgICAgMHgwMGI2CisjZGVmaW5lIEhDX1NJTUFfSFRBcmJSVFggICAgICAgIDB4MDBiNworI2RlZmluZSBIQ19TSU1BX0hUQXJiUkNXICAgICAgICAweDAwYjgKKyNkZWZpbmUgSENfU0lNQV9IVEFyYkUyICAgICAgICAgMHgwMGI5CisjZGVmaW5lIEhDX1NJTUFfSEdFTUlUb3V0ICAgICAgIDB4MDBiYQorI2RlZmluZSBIQ19TSU1BX0hGdGhSVFhEICAgICAgICAweDAwYmIKKyNkZWZpbmUgSENfU0lNQV9IRnRoUlRYQSAgICAgICAgMHgwMGJjCisvKiBEZWZpbmUgdGhlIHRleHR1cmUgcGFsZXR0ZSAwCisgKi8KKyNkZWZpbmUgSENfU0lNQV9IVFAwICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEhDX1NJTUFfSFRQMSAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBIQ19TSU1BX0ZPR1RBQkxFICAgICAgICAweDAzMDAKKyNkZWZpbmUgSENfU0lNQV9TVElQUExFICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEhDX1NJTUFfSEUzRmlyZSAgICAgICAgIDB4MDQ0MAorI2RlZmluZSBIQ19TSU1BX1RSQU5TX1NFVCAgICAgICAweDA0NDEKKyNkZWZpbmUgSENfU0lNQV9IUkVuZ1N0ICAgICAgICAgMHgwNDQyCisjZGVmaW5lIEhDX1NJTUFfSFJGSUZPZW1wdHkgICAgIDB4MDQ0MworI2RlZmluZSBIQ19TSU1BX0hSRklGT2Z1bGwgICAgICAweDA0NDQKKyNkZWZpbmUgSENfU0lNQV9IUkVyciAgICAgICAgICAgMHgwNDQ1CisjZGVmaW5lIEhDX1NJTUFfRklGT3N0YXR1cyAgICAgIDB4MDQ0NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBEZWZpbmUgdGhlIEFHUCBjb21tYW5kIGhlYWRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfQUNNRF9NQVNLICAgICAgICAgICAgMHhmZTAwMDAwMAorI2RlZmluZSBIQ19BQ01EX1NVQl9NQVNLICAgICAgICAweDBjMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSENtZEEgICAgICAgICAgIDB4ZWUwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IQ21kQiAgICAgICAgICAgMHhlYzAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0hDbWRDICAgICAgICAgICAweGVhMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSDEgICAgICAgICAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IMiAgICAgICAgICAgICAgMHhmMjAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0gzICAgICAgICAgICAgICAweGY0MDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSDQgICAgICAgICAgICAgIDB4ZjYwMDAwMDAKKworI2RlZmluZSBIQ19BQ01EX0gxSU9fTUFTSyAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0FDTURfSDJJTzFfTUFTSyAgICAgIDB4MDAxZmYwMDAKKyNkZWZpbmUgSENfQUNNRF9IMklPMl9NQVNLICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIQ19BQ01EX0gySU8xX1NISUZUICAgICAxMgorI2RlZmluZSBIQ19BQ01EX0gySU8yX1NISUZUICAgICAwCisjZGVmaW5lIEhDX0FDTURfSDNJT19NQVNLICAgICAgIDB4MDAwMDAxZmYKKyNkZWZpbmUgSENfQUNNRF9IM0NPVU5UX01BU0sgICAgMHgwMWZmZjAwMAorI2RlZmluZSBIQ19BQ01EX0gzQ09VTlRfU0hJRlQgICAxMgorI2RlZmluZSBIQ19BQ01EX0g0SURfTUFTSyAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0FDTURfSDRDT1VOVF9NQVNLICAgIDB4MDFmZmZlMDAKKyNkZWZpbmUgSENfQUNNRF9INENPVU5UX1NISUZUICAgOQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluZSBIZWFkZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ19IRUFERVIyCQkweEYyMTBGMTEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIER1bW15IFZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfRFVNTVkJCTB4Q0NDQ0NDQ0MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIGZvciBETUEgdXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSEFMQ1lPTl9IRUFERVIyICAgICAwWEYyMTBGMTEwCisjZGVmaW5lIEhBTENZT05fRklSRUNNRCAgICAgMFhFRTEwMDAwMAorI2RlZmluZSBIQUxDWU9OX0ZJUkVNQVNLICAgIDBYRkZGMDAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9DTURCICAgICAgICAwWEVDMDAwMDAwCisjZGVmaW5lIEhBTENZT05fQ01EQk1BU0sgICAgMFhGRkZFMDAwMAorI2RlZmluZSBIQUxDWU9OX1NVQl9BRERSMCAgIDBYMDAwMDAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9IRUFERVIxTUFTSyAwWEZGRkZGQzAwCisjZGVmaW5lIEhBTENZT05fSEVBREVSMSAgICAgMFhGMDAwMDAwMAorI2RlZmluZSBIQ19TdWJBX0hBR1BCc3RMICAgICAgICAweDAwNjAKKyNkZWZpbmUgSENfU3ViQV9IQUdQQmVuZEwgICAgICAgMHgwMDYxCisjZGVmaW5lIEhDX1N1YkFfSEFHUENNTlQgICAgICAgIDB4MDA2MgorI2RlZmluZSBIQ19TdWJBX0hBR1BCcEwgICAgICAgICAweDAwNjMKKyNkZWZpbmUgSENfU3ViQV9IQUdQQnBIICAgICAgICAgMHgwMDY0CisjZGVmaW5lIEhDX0hBR1BDTU5UX01BU0sgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSENtZEVyckNscl9NQVNLICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IQUdQQmVuZEhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBR1BCc3RIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFHUEJlbmRIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IQUdQQnN0SF9TSElGVCAgICAgICAwCisjZGVmaW5lIEhDX0hBR1BCcExfTUFTSyAgICAgICAgIDB4MDBmZmZmZmMKKyNkZWZpbmUgSENfSEFHUEJwSURfTUFTSyAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUdQQnBJRF9QQVVTRSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hBR1BCcElEX0pVTVAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSEFHUEJwSURfU1RPUCAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IQUdQQnBIX01BU0sgICAgICAgICAweDAwZmZmZmZmCisKKworI2RlZmluZSBWSUFfVklERU9fSEVBREVSNSAgICAgICAweEZFMDQwMDAwCisjZGVmaW5lIFZJQV9WSURFT19IRUFERVI2ICAgICAgIDB4RkUwNTAwMDAKKyNkZWZpbmUgVklBX1ZJREVPX0hFQURFUjcgICAgICAgMHhGRTA2MDAwMAorI2RlZmluZSBWSUFfVklERU9NQVNLICAgICAgICAgICAweEZGRkYwMDAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmODM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCkBAIC0wLDAgKzEsNzQxIEBACisvKiB2aWFfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBWSUEgVW5pY2hyb21lL1BybworICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAyMDA0IERpZ2VvLCBJbmMuLCBQYWxvIEFsdG8sIENBLCBVLlMuQS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIENvcHlyaWdodCAyMDA0IFRoZSBVbmljaHJvbWUgcHJvamVjdC4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogCisgKiAgICBUdW5nc3RlbiBHcmFwaGljcywgCisgKiAgICBFcmRpIENoZW4sIAorICogICAgVGhvbWFzIEhlbGxzdHJvbS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisjaW5jbHVkZSAidmlhXzNkX3JlZy5oIgorCisjZGVmaW5lIENNREJVRl9BTElHTk1FTlRfU0laRSAgICgweDEwMCkKKyNkZWZpbmUgQ01EQlVGX0FMSUdOTUVOVF9NQVNLICAgKDB4MGZmKQorCisvKiBkZWZpbmVzIGZvciBWSUEgM0QgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZJQV9SRUdfU1RBVFVTICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFZJQV9SRUdfVFJBTlNFVCAgICAgICAgIDB4NDNDCisjZGVmaW5lIFZJQV9SRUdfVFJBTlNQQUNFICAgICAgIDB4NDQwCisKKy8qIFZJQV9SRUdfU1RBVFVTKDB4NDAwKTogRW5naW5lIFN0YXR1cyAqLworI2RlZmluZSBWSUFfQ01EX1JHVFJfQlVTWSAgICAgICAweDAwMDAwMDgwCS8qIENvbW1hbmQgUmVndWxhdG9yIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBXzJEX0VOR19CVVNZICAgICAgICAgMHgwMDAwMDAwMQkvKiAyRCBFbmdpbmUgaXMgYnVzeSAqLworI2RlZmluZSBWSUFfM0RfRU5HX0JVU1kgICAgICAgICAweDAwMDAwMDAyCS8qIDNEIEVuZ2luZSBpcyBidXN5ICovCisjZGVmaW5lIFZJQV9WUl9RVUVVRV9CVVNZICAgICAgIDB4MDAwMjAwMDAJLyogVmlydHVhbCBRdWV1ZSBpcyBidXN5ICovCisKKyNkZWZpbmUgU2V0UmVnMkRBR1AoblJlZywgbkRhdGEpIHsJCQkJXAorCSooKHVpbnQzMl90ICopKHZiKSkgPSAoKG5SZWcpID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxOwlcCisJKigodWludDMyX3QgKikodmIpICsgMSkgPSAobkRhdGEpOwkJCVwKKwl2YiA9ICgodWludDMyX3QgKil2YikgKyAyOwkJCQlcCisJZGV2X3ByaXYtPmRtYV9sb3cgKz04OwkJCQkJXAorfQorCisjZGVmaW5lIHZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCkgRFJNX01FTU9SWUJBUlJJRVIoKSAKKworI2RlZmluZSBWSUFfT1VUX1JJTkdfUVcodzEsdzIpCQkJXAorCSp2YisrID0gKHcxKTsJCQkJXAorCSp2YisrID0gKHcyKTsJCQkJXAorCWRldl9wcml2LT5kbWFfbG93ICs9IDg7IAorCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3N0YXJ0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9wYXVzZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmVzZXQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jld2luZChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyBpbnQgdmlhX3dhaXRfaWRsZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyB2b2lkIHZpYV9wYWRfY2FjaGUoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgcXdvcmRzKTsKKworCisvKgorICogRnJlZSBzcGFjZSBpbiBjb21tYW5kIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdWludDMyX3QKK3ZpYV9jbWRidWZfc3BhY2UoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQoreworCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAKKwkJKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwl1aW50MzJfdCBod19hZGRyID0gKihkZXZfcHJpdi0+aHdfYWRkcl9wdHIpIC0gYWdwX2Jhc2U7CisJCisJcmV0dXJuICgoaHdfYWRkciA8PSBkZXZfcHJpdi0+ZG1hX2xvdykgPyAKKwkJKGRldl9wcml2LT5kbWFfaGlnaCArIGh3X2FkZHIgLSBkZXZfcHJpdi0+ZG1hX2xvdykgOiAKKwkJKGh3X2FkZHIgLSBkZXZfcHJpdi0+ZG1hX2xvdykpOworfQorCisvKgorICogSG93IG11Y2ggZG9lcyB0aGUgY29tbWFuZCByZWd1bGF0b3IgbGFnIGJlaGluZD8KKyAqLworCitzdGF0aWMgdWludDMyX3QKK3ZpYV9jbWRidWZfbGFnKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgCisJCSh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJdWludDMyX3QgaHdfYWRkciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKSAtIGFncF9iYXNlOworCQorCXJldHVybiAoKGh3X2FkZHIgPD0gZGV2X3ByaXYtPmRtYV9sb3cpID8gCisJCShkZXZfcHJpdi0+ZG1hX2xvdyAtIGh3X2FkZHIpIDogCisJCShkZXZfcHJpdi0+ZG1hX3dyYXAgKyBkZXZfcHJpdi0+ZG1hX2xvdyAtIGh3X2FkZHIpKTsKK30KKworLyoKKyAqIENoZWNrIHRoYXQgdGhlIGdpdmVuIHNpemUgZml0cyBpbiB0aGUgYnVmZmVyLCBvdGhlcndpc2Ugd2FpdC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAordmlhX2NtZGJ1Zl93YWl0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXVpbnQzMl90IGN1cl9hZGRyLCBod19hZGRyLCBuZXh0X2FkZHI7CisJdm9sYXRpbGUgdWludDMyX3QgKmh3X2FkZHJfcHRyOworCXVpbnQzMl90IGNvdW50OworCWh3X2FkZHJfcHRyID0gZGV2X3ByaXYtPmh3X2FkZHJfcHRyOworCWN1cl9hZGRyID0gZGV2X3ByaXYtPmRtYV9sb3c7CisJbmV4dF9hZGRyID0gY3VyX2FkZHIgKyBzaXplICsgNTEyKjEwMjQ7CisJY291bnQgPSAxMDAwMDAwOworCWRvIHsKKwkgICAgICAgIGh3X2FkZHIgPSAqaHdfYWRkcl9wdHIgLSBhZ3BfYmFzZTsKKwkJaWYgKGNvdW50LS0gPT0gMCkgeworCQkJRFJNX0VSUk9SKCJ2aWFfY21kYnVmX3dhaXQgdGltZWQgb3V0IGh3ICV4IGN1cl9hZGRyICV4IG5leHRfYWRkciAleFxuIiwKKwkJCQkgIGh3X2FkZHIsIGN1cl9hZGRyLCBuZXh0X2FkZHIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSB3aGlsZSAoKGN1cl9hZGRyIDwgaHdfYWRkcikgJiYgKG5leHRfYWRkciA+PSBod19hZGRyKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENoZWNrcyB3aGV0aGVyIGJ1ZmZlciBoZWFkIGhhcyByZWFjaCB0aGUgZW5kLiBSZXdpbmQgdGhlIHJpbmcgYnVmZmVyCisgKiB3aGVuIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zIHZpcnR1YWwgcG9pbnRlciB0byByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfY2hlY2tfZG1hKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKChkZXZfcHJpdi0+ZG1hX2xvdyArIHNpemUgKyA0KkNNREJVRl9BTElHTk1FTlRfU0laRSkgPiBkZXZfcHJpdi0+ZG1hX2hpZ2gpIHsKKwkJdmlhX2NtZGJ1Zl9yZXdpbmQoZGV2X3ByaXYpOworCX0KKwlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBzaXplKSAhPSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOworfQorCitpbnQgdmlhX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwkJCXZpYV9jbWRidWZfcmVzZXQoZGV2X3ByaXYpOworCisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYpOworCQkJZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9IE5VTEw7CisJCX0KKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKKwkJCSAgZHJtX3ZpYV9kbWFfaW5pdF90ICogaW5pdCkKK3sKKwlpZiAoIWRldl9wcml2IHx8ICFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoInZpYV9kbWFfaW5pdCBjYWxsZWQgYmVmb3JlIHZpYV9tYXBfaW5pdFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgIT0gTlVMTCkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCBhZ2FpbiB3aXRob3V0IGNhbGxpbmcgY2xlYW51cFxuIiwKKwkJCSAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YmFzZSkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGFncCBtZW1vcnkgYXZhaWxhYmxlXG4iLCAKKwkJCSAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlkZXZfcHJpdi0+cmluZy5tYXAub2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2UgKyBpbml0LT5vZmZzZXQ7CisJZGV2X3ByaXYtPnJpbmcubWFwLnNpemUgPSBpbml0LT5zaXplOworCWRldl9wcml2LT5yaW5nLm1hcC50eXBlID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAuZmxhZ3MgPSAwOworCWRldl9wcml2LT5yaW5nLm1hcC5tdHJyID0gMDsKKworCWRybV9jb3JlX2lvcmVtYXAoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJdmlhX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCisJCQkgICIgcmluZyBidWZmZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSBkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlOworCisJZGV2X3ByaXYtPmRtYV9wdHIgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKwlkZXZfcHJpdi0+ZG1hX2hpZ2ggPSBpbml0LT5zaXplOworCWRldl9wcml2LT5kbWFfd3JhcCA9IGluaXQtPnNpemU7CisJZGV2X3ByaXYtPmRtYV9vZmZzZXQgPSBpbml0LT5vZmZzZXQ7CisJZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gTlVMTDsKKwlkZXZfcHJpdi0+aHdfYWRkcl9wdHIgPSBkZXZfcHJpdi0+bW1pby0+aGFuZGxlICsgaW5pdC0+cmVnX3BhdXNlX2FkZHI7CisKKwl2aWFfY21kYnVmX3N0YXJ0KGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9kbWFfaW5pdF90IGluaXQ7CisJaW50IHJldGNvZGUgPSAwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGluaXQsIChkcm1fdmlhX2RtYV9pbml0X3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBWSUFfSU5JVF9ETUE6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKKwkJZWxzZQorCQkJcmV0Y29kZSA9IHZpYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJYnJlYWs7CisJY2FzZSBWSUFfQ0xFQU5VUF9ETUE6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKKwkJZWxzZQorCQkJcmV0Y29kZSA9IHZpYV9kbWFfY2xlYW51cChkZXYpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBWSUFfRE1BX0lOSVRJQUxJWkVEOgorCQlyZXRjb2RlID0gKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgIT0gTlVMTCkgPyAKKwkJCTA6IERSTV9FUlIoIEVGQVVMVCApOworCSAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0Y29kZSA9IERSTV9FUlIoRUlOVkFMKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldGNvZGU7Cit9CisKKworCitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwl1aW50MzJfdCAqdmI7CisJaW50IHJldDsKKworCWRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6aW5nIEFHUCByaW5nIGJ1ZmZlci5cbiIsCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJaWYgKGNtZC0+c2l6ZSA+IFZJQV9QQ0lfQlVGX1NJWkUpIHsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9IAorCisKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCS8qCisJICogUnVubmluZyB0aGlzIGZ1bmN0aW9uIG9uIEFHUCBtZW1vcnkgaXMgZGVhZCBzbG93LiBUaGVyZWZvcmUKKwkgKiB3ZSBydW4gaXQgb24gYSB0ZW1wb3JhcnkgY2FjaGVhYmxlIHN5c3RlbSBtZW1vcnkgYnVmZmVyIGFuZAorCSAqIGNvcHkgaXQgdG8gQUdQIG1lbW9yeSB3aGVuIHJlYWR5LgorCSAqLworCisJCQorCWlmICgocmV0ID0gdmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbSgodWludDMyX3QgKilkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5zaXplLCBkZXYsIDEpKSkgeworCQlyZXR1cm4gcmV0OworCX0KKyAgICAgICAJCisJCisJdmIgPSB2aWFfY2hlY2tfZG1hKGRldl9wcml2LCAoY21kLT5zaXplIDwgMHgxMDApID8gMHgxMDIgOiBjbWQtPnNpemUpOworCWlmICh2YiA9PSBOVUxMKSB7CisJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CisJfQorCisJbWVtY3B5KHZiLCBkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5zaXplKTsKKwkKKwlkZXZfcHJpdi0+ZG1hX2xvdyArPSBjbWQtPnNpemU7CisKKwkvKgorCSAqIFNtYWxsIHN1Ym1pc3Npb25zIHNvbWVob3cgc3RhbGxzIHRoZSBDUFUuIChBR1AgY2FjaGUgZWZmZWN0cz8pCisJICogcGFkIHRvIGdyZWF0ZXIgc2l6ZS4KKwkgKi8KKworCWlmIChjbWQtPnNpemUgPCAweDEwMCkKKwkgIHZpYV9wYWRfY2FjaGUoZGV2X3ByaXYsKDB4MTAwIC0gY21kLT5zaXplKSA+PiAzKTsKKwl2aWFfY21kYnVmX3BhdXNlKGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCF2aWFfd2FpdF9pZGxlKGRldl9wcml2KSkgeworCQlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdmlhX2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkZXYpOworfQorCitpbnQgdmlhX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfY21kYnVmZmVyX3QgY21kYnVmOworCWludCByZXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGNtZGJ1ZiwgKGRybV92aWFfY21kYnVmZmVyX3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOworCisJRFJNX0RFQlVHKCJ2aWEgY21kYnVmZmVyLCBidWYgJXAgc2l6ZSAlbHVcbiIsIGNtZGJ1Zi5idWYsIGNtZGJ1Zi5zaXplKTsKKworCXJldCA9IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZGV2LCAmY21kYnVmKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgCit2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgICBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKworCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfSAKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkKKwlpZiAoKHJldCA9IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oKHVpbnQzMl90ICopZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSwgZGV2LCAwKSkpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJcmV0ID0gdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRldiwgKGNvbnN0IHVpbnQzMl90ICopZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHZpYV9wY2lfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9jbWRidWZmZXJfdCBjbWRidWY7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLCAoZHJtX3ZpYV9jbWRidWZmZXJfdCAqKSBkYXRhLAorCQkJCSBzaXplb2YoY21kYnVmKSk7CisKKwlEUk1fREVCVUcoInZpYV9wY2lfY21kYnVmZmVyLCBidWYgJXAgc2l6ZSAlbHVcbiIsIGNtZGJ1Zi5idWYsCisJCSAgY21kYnVmLnNpemUpOworCisJcmV0ID0gdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoZGV2LCAmY21kYnVmKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB1aW50MzJfdCAqdmlhX2FsaWduX2J1ZmZlcihkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJCQkgdWludDMyX3QgKiB2YiwgaW50IHF3X2NvdW50KQoreworICAgICAgICBmb3IgKDsgcXdfY291bnQgPiAwOyAtLXF3X2NvdW50KSB7CisJCVZJQV9PVVRfUklOR19RVyhIQ19EVU1NWSwgSENfRFVNTVkpOworCX0KKwlyZXR1cm4gdmI7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHJpbmcgYnVmZmVyIG1hbmdlbWVudCBjb2RlLgorICoKKyAqIFJldHVybnMgdmlydHVhbCBwb2ludGVyIHRvIHJpbmcgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfZ2V0X2RtYShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOworfQorCisvKgorICogSG9va3MgYSBzZWdtZW50IG9mIGRhdGEgaW50byB0aGUgdGFpbCBvZiB0aGUgcmluZy1idWZmZXIgYnkKKyAqIG1vZGlmeWluZyB0aGUgcGF1c2UgYWRkcmVzcyBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBpdHNlbGYuIElmCisgKiB0aGUgcmVndWxhdG9yIGhhcyBhbHJlYWR5IHBhdXNlZCwgcmVzdGFydCBpdC4KKyAqLworc3RhdGljIGludCB2aWFfaG9va19zZWdtZW50KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICB1aW50MzJfdCBwYXVzZV9hZGRyX2hpLCB1aW50MzJfdCBwYXVzZV9hZGRyX2xvLAorCQkJICAgIGludCBub19wY2lfZmlyZSkKK3sKKwlpbnQgcGF1c2VkLCBjb3VudDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqcGF1c2VkX2F0ID0gZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyOworCisJdmlhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKwl3aGlsZSghICoodmlhX2dldF9kbWEoZGV2X3ByaXYpLTEpKTsKKwkqZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gcGF1c2VfYWRkcl9sbzsKKwl2aWFfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCisJLyoKKwkgKiBUaGUgYmVsb3cgc3RhdGVtZW50IGlzIGluc2VydGVkIHRvIHJlYWxseSBmb3JjZSB0aGUgZmx1c2guCisJICogTm90IHN1cmUgaXQgaXMgbmVlZGVkLgorCSAqLworCisJd2hpbGUoISAqZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyKTsKKwlkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdikgLSAxOworCXdoaWxlKCEgKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0cik7CisKKworCXBhdXNlZCA9IDA7CisJY291bnQgPSAyMDsgCisKKwl3aGlsZSAoIShwYXVzZWQgPSAoVklBX1JFQUQoMHg0MWMpICYgMHg4MDAwMDAwMCkpICYmIGNvdW50LS0pOworCWlmICgoY291bnQgPD0gOCkgJiYgKGNvdW50ID49IDApKSB7CisJCXVpbnQzMl90IHJndHIsIHB0cjsKKwkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKKwkJcHRyID0gKChjaGFyICopZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyIC0gZGV2X3ByaXYtPmRtYV9wdHIpICsgCisJCQlkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0IC0gCisJCQlDTURCVUZfQUxJR05NRU5UX1NJWkU7CisJCWlmIChyZ3RyIDw9IHB0cikgeworCQkJRFJNX0VSUk9SKCJDb21tYW5kIHJlZ3VsYXRvclxucGF1c2VkIGF0IGNvdW50ICVkLCBhZGRyZXNzICV4LCAiCisJCQkJICAid2hpbGUgY3VycmVudCBwYXVzZSBhZGRyZXNzIGlzICV4LlxuIgorCQkJCSAgIlBsZWFzZSBtYWlsIHRoaXMgbWVzc2FnZSB0byAiCisJCQkJICAiPHVuaWNocm9tZS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iLAorCQkJCSAgY291bnQsIHJndHIsIHB0cik7CisJCX0KKwl9CisJCQorCWlmIChwYXVzZWQgJiYgIW5vX3BjaV9maXJlKSB7CisJICAgICAgICB1aW50MzJfdCByZ3RyLHB0cjsKKwkJdWludDMyX3QgcHRyX2xvdzsKKworCQljb3VudCA9IDEwMDAwMDA7CisJCXdoaWxlICgoVklBX1JFQUQoVklBX1JFR19TVEFUVVMpICYgVklBX0NNRF9SR1RSX0JVU1kpICYmIGNvdW50LS0pOworCQkKKwkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKKwkJcHRyID0gKChjaGFyICopcGF1c2VkX2F0IC0gZGV2X3ByaXYtPmRtYV9wdHIpICsgCisJCQlkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0OworCQkKKworCQlwdHJfbG93ID0gKHB0ciA+IDMqQ01EQlVGX0FMSUdOTUVOVF9TSVpFKSA/IAorCQkJcHRyIC0gMypDTURCVUZfQUxJR05NRU5UX1NJWkUgOiAwOworCQlpZiAocmd0ciA8PSBwdHIgJiYgcmd0ciA+PSBwdHJfbG93KSB7CisJCQlWSUFfV1JJVEUoVklBX1JFR19UUkFOU0VULCAoSENfUGFyYVR5cGVfUHJlQ1IgPDwgMTYpKTsKKwkJCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgcGF1c2VfYWRkcl9oaSk7CisJCQlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfbG8pOworCQl9IAorCX0KKwlyZXR1cm4gcGF1c2VkOworfQorCisKKworc3RhdGljIGludCB2aWFfd2FpdF9pZGxlKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCit7CisJaW50IGNvdW50ID0gMTAwMDAwMDA7CisJd2hpbGUgKGNvdW50LS0gJiYgKFZJQV9SRUFEKFZJQV9SRUdfU1RBVFVTKSAmCisJCQkgICAoVklBX0NNRF9SR1RSX0JVU1kgfCBWSUFfMkRfRU5HX0JVU1kgfAorCQkJICAgIFZJQV8zRF9FTkdfQlVTWSkpKSA7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdWludDMyX3QgKnZpYV9hbGlnbl9jbWQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdWludDMyX3QgY21kX3R5cGUsCisJCQkgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgKmNtZF9hZGRyX2hpLCAKKwkJCSAgICAgICB1aW50MzJfdCAqY21kX2FkZHJfbG8sCisJCQkgICAgICAgaW50IHNraXBfd2FpdCkKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZTsKKwl1aW50MzJfdCBjbWRfYWRkciwgYWRkcl9sbywgYWRkcl9oaTsKKwl1aW50MzJfdCAqdmI7CisJdWludDMyX3QgcXdfcGFkX2NvdW50OworCisJaWYgKCFza2lwX3dhaXQpCisJCXZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgMipDTURCVUZfQUxJR05NRU5UX1NJWkUpOworCisJdmIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdik7CisJVklBX09VVF9SSU5HX1FXKCBIQ19IRUFERVIyIHwgKChWSUFfUkVHX1RSQU5TRVQgPj4gMikgPDwgMTIpIHwKKwkJCSAoVklBX1JFR19UUkFOU1BBQ0UgPj4gMiksIEhDX1BhcmFUeXBlX1ByZUNSIDw8IDE2KTsgCisJYWdwX2Jhc2UgPSBkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJcXdfcGFkX2NvdW50ID0gKENNREJVRl9BTElHTk1FTlRfU0laRSA+PiAzKSAtCisJCSgoZGV2X3ByaXYtPmRtYV9sb3cgJiBDTURCVUZfQUxJR05NRU5UX01BU0spID4+IDMpOworCisJCisJY21kX2FkZHIgPSAoYWRkcikgPyBhZGRyIDogCisJCWFncF9iYXNlICsgZGV2X3ByaXYtPmRtYV9sb3cgLSA4ICsgKHF3X3BhZF9jb3VudCA8PCAzKTsKKwlhZGRyX2xvID0gKChIQ19TdWJBX0hBR1BCcEwgPDwgMjQpIHwgKGNtZF90eXBlICYgSENfSEFHUEJwSURfTUFTSykgfAorCQkgICAoY21kX2FkZHIgJiBIQ19IQUdQQnBMX01BU0spKTsKKwlhZGRyX2hpID0gKChIQ19TdWJBX0hBR1BCcEggPDwgMjQpIHwgKGNtZF9hZGRyID4+IDI0KSk7CisKKwl2YiA9IHZpYV9hbGlnbl9idWZmZXIoZGV2X3ByaXYsIHZiLCBxd19wYWRfY291bnQgLSAxKTsKKwlWSUFfT1VUX1JJTkdfUVcoKmNtZF9hZGRyX2hpID0gYWRkcl9oaSwgCisJCQkqY21kX2FkZHJfbG8gPSBhZGRyX2xvKTsKKwlyZXR1cm4gdmI7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfc3RhcnQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBwYXVzZV9hZGRyX2xvLCBwYXVzZV9hZGRyX2hpOworCXVpbnQzMl90IHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHJfbG87CisJdWludDMyX3QgZW5kX2FkZHIsIGVuZF9hZGRyX2xvOworCXVpbnQzMl90IGNvbW1hbmQ7CisJdWludDMyX3QgYWdwX2Jhc2U7CisKKworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKworCWFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXN0YXJ0X2FkZHIgPSBhZ3BfYmFzZTsKKwllbmRfYWRkciA9IGFncF9iYXNlICsgZGV2X3ByaXYtPmRtYV9oaWdoOworCisJc3RhcnRfYWRkcl9sbyA9ICgoSENfU3ViQV9IQUdQQnN0TCA8PCAyNCkgfCAoc3RhcnRfYWRkciAmIDB4RkZGRkZGKSk7CisJZW5kX2FkZHJfbG8gPSAoKEhDX1N1YkFfSEFHUEJlbmRMIDw8IDI0KSB8IChlbmRfYWRkciAmIDB4RkZGRkZGKSk7CisJY29tbWFuZCA9ICgoSENfU3ViQV9IQUdQQ01OVCA8PCAyNCkgfCAoc3RhcnRfYWRkciA+PiAyNCkgfAorCQkgICAoKGVuZF9hZGRyICYgMHhmZjAwMDAwMCkgPj4gMTYpKTsKKworCWRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciA9IAorCQl2aWFfYWxpZ25fY21kKGRldl9wcml2LCBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgCisJCQkgICAgICAmcGF1c2VfYWRkcl9oaSwgJiBwYXVzZV9hZGRyX2xvLCAxKSAtIDE7CisKKwl2aWFfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCXdoaWxlKCEgKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0cik7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU0VULCAoSENfUGFyYVR5cGVfUHJlQ1IgPDwgMTYpKTsKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIGNvbW1hbmQpOworCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgc3RhcnRfYWRkcl9sbyk7CisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBlbmRfYWRkcl9sbyk7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfaGkpOworCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgcGF1c2VfYWRkcl9sbyk7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIGNvbW1hbmQgfCBIQ19IQUdQQ01OVF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgdmlhX3BhZF9jYWNoZShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBxd29yZHMpCit7CisJdWludDMyX3QgKnZiOworCisJdmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBxd29yZHMgKyAyKTsKKwl2YiA9IHZpYV9nZXRfZG1hKGRldl9wcml2KTsKKwlWSUFfT1VUX1JJTkdfUVcoIEhDX0hFQURFUjIsIEhDX1BhcmFUeXBlX05vdFRleCA8PCAxNik7CisJdmlhX2FsaWduX2J1ZmZlcihkZXZfcHJpdix2Yixxd29yZHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhX2R1bW15X2JpdGJsdChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXVpbnQzMl90ICp2YiA9IHZpYV9nZXRfZG1hKGRldl9wcml2KTsKKwlTZXRSZWcyREFHUCgweDBDLCAoMCB8ICgwIDw8IDE2KSkpOworCVNldFJlZzJEQUdQKDB4MTAsIDAgfCAoMCA8PCAxNikpOworCVNldFJlZzJEQUdQKDB4MCwgMHgxIHwgMHgyMDAwIHwgMHhBQTAwMDAwMCk7IAorfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfanVtcChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXVpbnQzMl90IGFncF9iYXNlOworCXVpbnQzMl90IHBhdXNlX2FkZHJfbG8sIHBhdXNlX2FkZHJfaGk7CisJdWludDMyX3QganVtcF9hZGRyX2xvLCBqdW1wX2FkZHJfaGk7CisJdm9sYXRpbGUgdWludDMyX3QgKmxhc3RfcGF1c2VfcHRyOworCXVpbnQzMl90IGRtYV9sb3dfc2F2ZTEsIGRtYV9sb3dfc2F2ZTI7CisKKwlhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwl2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfSlVNUCwgMCwgJmp1bXBfYWRkcl9oaSwgCisJCSAgICAgICZqdW1wX2FkZHJfbG8sIDApOworCQorCWRldl9wcml2LT5kbWFfd3JhcCA9IGRldl9wcml2LT5kbWFfbG93OworCisKKwkvKgorCSAqIFdyYXAgY29tbWFuZCBidWZmZXIgdG8gdGhlIGJlZ2lubmluZy4KKwkgKi8KKworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKwlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBDTURCVUZfQUxJR05NRU5UX1NJWkUpICE9IDApIHsKKwkJRFJNX0VSUk9SKCJ2aWFfY21kYnVmX2p1bXAgZmFpbGVkXG4iKTsKKwl9CisKKwl2aWFfZHVtbXlfYml0Ymx0KGRldl9wcml2KTsKKwl2aWFfZHVtbXlfYml0Ymx0KGRldl9wcml2KTsgCisKKwlsYXN0X3BhdXNlX3B0ciA9IHZpYV9hbGlnbl9jbWQoZGV2X3ByaXYsICBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgJnBhdXNlX2FkZHJfaGksIAorCQkJCSAgICAgICAmcGF1c2VfYWRkcl9sbywgMCkgLTE7CisJdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgIEhDX0hBR1BCcElEX1BBVVNFLCAwLCAmcGF1c2VfYWRkcl9oaSwgCisJCSAgICAgICZwYXVzZV9hZGRyX2xvLCAwKTsKKworCSpsYXN0X3BhdXNlX3B0ciA9IHBhdXNlX2FkZHJfbG87CisJZG1hX2xvd19zYXZlMSA9IGRldl9wcml2LT5kbWFfbG93OworCisJLyoKKwkgKiBOb3csIHNldCBhIHRyYXAgdGhhdCB3aWxsIHBhdXNlIHRoZSByZWd1bGF0b3IgaWYgaXQgdHJpZXMgdG8gcmVydW4gdGhlIG9sZAorCSAqIGNvbW1hbmQgYnVmZmVyLiAoV2hpY2ggbWF5IGhhcHBlbiBpZiB2aWFfaG9va19zZWdtZW50IGRldGVjcyBhIGNvbW1hbmQgcmVndWxhdG9yIHBhdXNlCisJICogYW5kIHJlaXNzdWVzIHRoZSBqdW1wIGNvbW1hbmQgb3ZlciBQQ0ksIHdoaWxlIHRoZSByZWd1bGF0b3IgaGFzIGFscmVhZHkgdGFrZW4gdGhlIGp1bXAKKwkgKiBhbmQgYWN0dWFsbHkgcGF1c2VkIGF0IHRoZSBjdXJyZW50IGJ1ZmZlciBlbmQpLgorCSAqIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gb3RoZXIgd2F5IHRvIGRldGVjdCB0aGlzIGNvbmRpdGlvbiwgc2luY2UgdGhlIGh3X2FkZHJfcG9pbnRlcgorCSAqIGRvZXMgbm90IHNlZW0gdG8gZ2V0IHVwZGF0ZWQgaW1tZWRpYXRlbHkgd2hlbiBhIGp1bXAgb2NjdXJzLgorCSAqLworCisJbGFzdF9wYXVzZV9wdHIgPSB2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfUEFVU0UsIDAsICZwYXVzZV9hZGRyX2hpLCAKKwkJCQkgICAgICAgJnBhdXNlX2FkZHJfbG8sIDApIC0xOworCXZpYV9hbGlnbl9jbWQoZGV2X3ByaXYsICBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgJnBhdXNlX2FkZHJfaGksIAorCQkgICAgICAmcGF1c2VfYWRkcl9sbywgMCk7CisJKmxhc3RfcGF1c2VfcHRyID0gcGF1c2VfYWRkcl9sbzsKKworCWRtYV9sb3dfc2F2ZTIgPSBkZXZfcHJpdi0+ZG1hX2xvdzsKKwlkZXZfcHJpdi0+ZG1hX2xvdyA9IGRtYV9sb3dfc2F2ZTE7CQorCXZpYV9ob29rX3NlZ21lbnQoIGRldl9wcml2LCBqdW1wX2FkZHJfaGksIGp1bXBfYWRkcl9sbywgMCk7CisJZGV2X3ByaXYtPmRtYV9sb3cgPSBkbWFfbG93X3NhdmUyOworCXZpYV9ob29rX3NlZ21lbnQoIGRldl9wcml2LCBwYXVzZV9hZGRyX2hpLCBwYXVzZV9hZGRyX2xvLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jld2luZChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfanVtcChkZXZfcHJpdik7IAorfQorCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX2ZsdXNoKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVpbnQzMl90IGNtZF90eXBlKQoreworCXVpbnQzMl90IHBhdXNlX2FkZHJfbG8sIHBhdXNlX2FkZHJfaGk7CisKKwl2aWFfYWxpZ25fY21kKGRldl9wcml2LCBjbWRfdHlwZSwgMCwgJnBhdXNlX2FkZHJfaGksICZwYXVzZV9hZGRyX2xvLCAwKTsKKwl2aWFfaG9va19zZWdtZW50KCBkZXZfcHJpdiwgcGF1c2VfYWRkcl9oaSwgcGF1c2VfYWRkcl9sbywgMCk7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9wYXVzZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfZmx1c2goZGV2X3ByaXYsIEhDX0hBR1BCcElEX1BBVVNFKTsKK30KKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXNldChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfZmx1c2goZGV2X3ByaXYsIEhDX0hBR1BCcElEX1NUT1ApOworCXZpYV93YWl0X2lkbGUoZGV2X3ByaXYpOworfQorCisvKgorICogVXNlciBpbnRlcmZhY2UgdG8gdGhlIHNwYWNlIGFuZCBsYWcgZnVuY3Rpb25zLgorICovCisKK2ludCAKK3ZpYV9jbWRidWZfc2l6ZShEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfY21kYnVmX3NpemVfdCBkX3NpejsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCB0bXBfc2l6ZSwgY291bnQ7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OworCisJRFJNX0RFQlVHKCJ2aWEgY21kYnVmX3NpemVcbiIpOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRob3V0IGluaXRpYWxpemluZyBBR1AgcmluZyBidWZmZXIuXG4iLAorCQkJICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkX3NpeiwgKGRybV92aWFfY21kYnVmX3NpemVfdCAqKSBkYXRhLAorCQkJCSBzaXplb2YoZF9zaXopKTsKKworCisJY291bnQgPSAxMDAwMDAwOworCXRtcF9zaXplID0gZF9zaXouc2l6ZTsKKwlzd2l0Y2goZF9zaXouZnVuYykgeworCWNhc2UgVklBX0NNREJVRl9TUEFDRToKKwkJd2hpbGUgKCgodG1wX3NpemUgPSB2aWFfY21kYnVmX3NwYWNlKGRldl9wcml2KSkgPCBkX3Npei5zaXplKSAmJiBjb3VudC0tKSB7CisJCQlpZiAoIWRfc2l6LndhaXQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWNvdW50KSB7CisJCQlEUk1fRVJST1IoIlZJQV9DTURCVUZfU1BBQ0UgdGltZWQgb3V0LlxuIik7CisJCQlyZXQgPSBEUk1fRVJSKEVBR0FJTik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWSUFfQ01EQlVGX0xBRzoKKwkJd2hpbGUgKCgodG1wX3NpemUgPSB2aWFfY21kYnVmX2xhZyhkZXZfcHJpdikpID4gZF9zaXouc2l6ZSkgJiYgY291bnQtLSkgeworCQkJaWYgKCFkX3Npei53YWl0KSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFjb3VudCkgeworCQkJRFJNX0VSUk9SKCJWSUFfQ01EQlVGX0xBRyB0aW1lZCBvdXQuXG4iKTsKKwkJCXJldCA9IERSTV9FUlIoRUFHQUlOKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWRfc2l6LnNpemUgPSB0bXBfc2l6ZTsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfY21kYnVmX3NpemVfdCAqKSBkYXRhLCBkX3NpeiwKKwkJCSAgICAgICBzaXplb2YoZF9zaXopKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg4YzliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9WSUFfRFJNX0hfCisjZGVmaW5lIF9WSUFfRFJNX0hfCisKKy8qIFdBUk5JTkc6IFRoZXNlIGRlZmluZXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSBYc2VydmVyIHVzZXMuCisgKiBpZiB5b3UgY2hhbmdlIHRoZW0sIHlvdSBtdXN0IGNoYW5nZSB0aGUgZGVmaW5lcyBpbiB0aGUgWHNlcnZlci4KKyAqLworCisjaWZuZGVmIF9WSUFfREVGSU5FU18KKyNkZWZpbmUgX1ZJQV9ERUZJTkVTXworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlICJ2aWFfZHJtY2xpZW50LmgiCisjZW5kaWYKKworI2RlZmluZSBWSUFfTlJfU0FSRUFfQ0xJUFJFQ1RTIAkJOAorI2RlZmluZSBWSUFfTlJfWFZNQ19QT1JUUyAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQorI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIFhWTUNMT0NLUFRSKHNhUHJpdixsb2NrTm8pCQkJCQlcCisJKCh2b2xhdGlsZSBkcm1faHdfbG9ja190ICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKKwkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKKwkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKKwkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIFZJQV9OUl9URVhfUkVHSU9OUyA2NAorI2RlZmluZSBWSUFfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMElNQUdFICAweDEJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMUlNQUdFICAweDIJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgVklBX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDAgICAgICAgMHgxMAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBWSUFfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorI2RlZmluZSBWSUFfVVBMT0FEX0FMTCAgICAgICAgMHhmZgorCisvKiBWSUEgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIERSTV9WSUFfQUxMT0NNRU0JMHgwMAorI2RlZmluZSBEUk1fVklBX0ZSRUVNRU0JICAgICAgICAweDAxCisjZGVmaW5lIERSTV9WSUFfQUdQX0lOSVQJMHgwMgorI2RlZmluZSBEUk1fVklBX0ZCX0lOSVQJICAgICAgICAweDAzCisjZGVmaW5lIERSTV9WSUFfTUFQX0lOSVQJMHgwNAorI2RlZmluZSBEUk1fVklBX0RFQ19GVVRFWCAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfRE1BX0lOSVQJMHgwNworI2RlZmluZSBEUk1fVklBX0NNREJVRkZFUgkweDA4CisjZGVmaW5lIERSTV9WSUFfRkxVU0gJICAgICAgICAweDA5CisjZGVmaW5lIERSTV9WSUFfUENJQ01ECSAgICAgICAgMHgwYQorI2RlZmluZSBEUk1fVklBX0NNREJVRl9TSVpFCTB4MGIKKyNkZWZpbmUgTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1ZJQV9XQUlUX0lSUSAgICAgICAgMHgwZAorCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUxMT0NNRU0JICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BTExPQ01FTSwgZHJtX3ZpYV9tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GUkVFTUVNCSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRlJFRU1FTSwgZHJtX3ZpYV9tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9BR1BfSU5JVAkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0FHUF9JTklULCBkcm1fdmlhX2FncF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0ZCX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GQl9JTklULCBkcm1fdmlhX2ZiX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfTUFQX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9NQVBfSU5JVCwgZHJtX3ZpYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfREVDX0ZVVEVYICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfREVDX0ZVVEVYLCBkcm1fdmlhX2Z1dGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRE1BX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9ETUFfSU5JVCwgZHJtX3ZpYV9kbWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0NNREJVRkZFUgkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRkZFUiwgZHJtX3ZpYV9jbWRidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GTFVTSAkgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfVklBX1BDSUNNRAkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1BDSUNNRCwgZHJtX3ZpYV9jbWRidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZfU0laRSBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQ01EQlVGX1NJWkUsIFwKKwkJCQkJICAgIGRybV92aWFfY21kYnVmX3NpemVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9XQUlUX0lSUSAgICBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfV0FJVF9JUlEsIGRybV92aWFfaXJxd2FpdF90KQorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBWSUFfVEVYX1NFVFVQX1NJWkUgOAorCisvKiBGbGFncyBmb3IgY2xlYXIgaW9jdGwKKyAqLworI2RlZmluZSBWSUFfRlJPTlQgICAweDEKKyNkZWZpbmUgVklBX0JBQ0sgICAgMHgyCisjZGVmaW5lIFZJQV9ERVBUSCAgIDB4NAorI2RlZmluZSBWSUFfU1RFTkNJTCAweDgKKyNkZWZpbmUgVklERU8gMAorI2RlZmluZSBBR1AgMQordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBzaXplOworfSBkcm1fdmlhX2FncF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHNpemU7Cit9IGRybV92aWFfZmJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGNvbnRleHQ7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9IGRybV92aWFfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9NQVAgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9NQVAgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKK30gZHJtX3ZpYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2Z1dGV4IHsKKwllbnVtIHsKKwkJVklBX0ZVVEVYX1dBSVQgPSAweDAwLAorCQlWSUFfRlVURVhfV0FLRSA9IDBYMDEKKwl9IGZ1bmM7CisJdWludDMyX3QgbXM7CisJdWludDMyX3QgbG9jazsKKwl1aW50MzJfdCB2YWw7Cit9IGRybV92aWFfZnV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfZG1hX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9ETUEgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9ETUEgPSAweDAyLAorICAgICAgICAgICAgICAgIFZJQV9ETUFfSU5JVElBTElaRUQgPSAweDAzCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgcmVnX3BhdXNlX2FkZHI7Cit9IGRybV92aWFfZG1hX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfY21kYnVmZmVyIHsKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworfSBkcm1fdmlhX2NtZGJ1ZmZlcl90OworCisvKiBXYXJuaW5nOiBJZiB5b3UgY2hhbmdlIHRoZSBTQVJFQSBzdHJ1Y3R1cmUgeW91IG11c3QgY2hhbmdlIHRoZSBYc2VydmVyCisgKiBzdHJ1Y3R1cmUgYXMgd2VsbCAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQsIHByZXY7CS8qIGluZGljZXMgdG8gZm9ybSBhIGNpcmN1bGFyIExSVSAgKi8KKwl1bnNpZ25lZCBjaGFyIGluVXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1fdmlhX3RleF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfc2FyZWEgeworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CisJZHJtX3ZpYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtWSUFfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB2ZXJ0ZXhQcmltOworCisJLyoKKwkgKiBCZWxvdyBpcyBmb3IgWHZNQy4KKwkgKiBXZSB3YW50IHRoZSBsb2NrIGludGVnZXJzIGFsb25lIG9uLCBhbmQgYWxpZ25lZCB0bywgYSBjYWNoZSBsaW5lLgorCSAqIFRoZXJlZm9yZSB0aGlzIHNvbWV3aGF0IHN0cmFuZ2UgY29uc3RydWN0LgorCSAqLworCisJY2hhciBYdk1DTG9ja0FyZWFbVklBX01BWF9DQUNIRUxJTkVfU0laRSAqIChWSUFfTlJfWFZNQ19MT0NLUyArIDEpXTsKKworCXVuc2lnbmVkIGludCBYdk1DRGlzcGxheWluZ1tWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNTdWJQaWNPbltWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNDdHhOb0dyYWJiZWQ7CS8qIExhc3QgY29udGV4dCB0byBob2xkIGRlY29kZXIgKi8KKworfSBkcm1fdmlhX3NhcmVhX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1Zl9zaXplIHsKKwllbnVtIHsKKwkJVklBX0NNREJVRl9TUEFDRSA9IDB4MDEsCisJCVZJQV9DTURCVUZfTEFHID0gMHgwMgorCX0gZnVuYzsKKwlpbnQgd2FpdDsKKwl1aW50MzJfdCBzaXplOworfSBkcm1fdmlhX2NtZGJ1Zl9zaXplX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJVklBX0lSUV9BQlNPTFVURSA9IDB4MCwKKwlWSUFfSVJRX1JFTEFUSVZFID0gMHgxLAorCVZJQV9JUlFfU0lHTkFMID0gMHgxMDAwMDAwMCwKKwlWSUFfSVJRX0ZPUkNFX1NFUVVFTkNFID0gMHgyMDAwMDAwMAorfSB2aWFfaXJxX3NlcV90eXBlX3Q7CisKKyNkZWZpbmUgVklBX0lSUV9GTEFHU19NQVNLIDB4RjAwMDAwMDAKKworc3RydWN0IGRybV92aWFfd2FpdF9pcnFfcmVxdWVzdHsKKwl1bnNpZ25lZCBpcnE7CisJdmlhX2lycV9zZXFfdHlwZV90IHR5cGU7CisJdWludDMyX3Qgc2VxdWVuY2U7CisJdWludDMyX3Qgc2lnbmFsOworfTsKKwordHlwZWRlZiB1bmlvbiBkcm1fdmlhX2lycXdhaXQgeworCXN0cnVjdCBkcm1fdmlhX3dhaXRfaXJxX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fdmlhX2lycXdhaXRfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworaW50IHZpYV9mYl9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfbWVtX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9hZ3BfaW5pdChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX21hcF9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfZGVjb2Rlcl9mdXRleChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9wY2lfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfY21kYnVmX3NpemUoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV93YWl0X2lycShEUk1fSU9DVExfQVJHUyk7CisKKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9WSUFfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWVlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJIERSSVZFUl9OQU1FLAorCQkgRFJJVkVSX01BSk9SLAorCQkgRFJJVkVSX01JTk9SLAorCQkgRFJJVkVSX1BBVENITEVWRUwsCisJCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCSAgICApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7CisJRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOworCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXZpYWRydl9QQ0lfSURTCit9OworCitzdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdCBpb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQUxMT0NNRU0pXSA9IHt2aWFfbWVtX2FsbG9jLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRlJFRU1FTSldID0ge3ZpYV9tZW1fZnJlZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0FHUF9JTklUKV0gPSB7dmlhX2FncF9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRkJfSU5JVCldID0ge3ZpYV9mYl9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfTUFQX0lOSVQpXSA9IHt2aWFfbWFwX2luaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ERUNfRlVURVgpXSA9IHt2aWFfZGVjb2Rlcl9mdXRleCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0RNQV9JTklUKV0gPSB7dmlhX2RtYV9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGRkVSKV0gPSB7dmlhX2NtZGJ1ZmZlciwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZMVVNIKV0gPSB7dmlhX2ZsdXNoX2lvY3RsLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfUENJQ01EKV0gPSB7dmlhX3BjaV9jbWRidWZmZXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9DTURCVUZfU0laRSldID0ge3ZpYV9jbWRidWZfc2l6ZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX1dBSVRfSVJRKV0gPSB7dmlhX3dhaXRfaXJxLCAxLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0KKwkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9JUlEgfAorCSAgICBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5jb250ZXh0X2N0b3IgPSB2aWFfaW5pdF9jb250ZXh0LAorCS5jb250ZXh0X2R0b3IgPSB2aWFfZmluYWxfY29udGV4dCwKKwkudmJsYW5rX3dhaXQgPSB2aWFfZHJpdmVyX3ZibGFua193YWl0LAorCS5pcnFfcHJlaW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCisJLmlycV9wb3N0aW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIsCisJLmRtYV9xdWllc2NlbnQgPSB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IGlvY3RscywKKwkubnVtX2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKGlvY3RscyksCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCQl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdmlhX2luaXQodm9pZCkKK3sKKwl2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKCk7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlhX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmlhX2luaXQpOworbW9kdWxlX2V4aXQodmlhX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWE4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX1ZJQV9EUlZfSF8KKyNkZWZpbmUgX1ZJQV9EUlZfSF8KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCSJWSUEiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJ2aWEiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiVklBIFVuaWNocm9tZSAvIFBybyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MDUyMyIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTIKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQk2CisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTMKKworI2luY2x1ZGUgInZpYV92ZXJpZmllci5oIgorCisjZGVmaW5lIFZJQV9QQ0lfQlVGX1NJWkUgNjAwMDAKKyNkZWZpbmUgVklBX0ZJUkVfQlVGX1NJWkUgIDEwMjQKKyNkZWZpbmUgVklBX05VTV9JUlFTIDIKKworCisKK3R5cGVkZWYgc3RydWN0IGRybV92aWFfcmluZ19idWZmZXIgeworCWRybV9tYXBfdCBtYXA7CisJY2hhciAqdmlydHVhbF9zdGFydDsKK30gZHJtX3ZpYV9yaW5nX2J1ZmZlcl90OworCit0eXBlZGVmIHVpbnQzMl90IG1hc2thcnJheV90WzVdOworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX2lycSB7CisJYXRvbWljX3QgaXJxX3JlY2VpdmVkOworCXVpbnQzMl90IHBlbmRpbmdfbWFzazsKKwl1aW50MzJfdCBlbmFibGVfbWFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7Cit9IGRybV92aWFfaXJxX3Q7CisJCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX3ByaXZhdGUgeworCWRybV92aWFfc2FyZWFfdCAqc2FyZWFfcHJpdjsKKwlkcm1fbWFwX3QgKnNhcmVhOworCWRybV9tYXBfdCAqZmI7CisJZHJtX21hcF90ICptbWlvOworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkZWNvZGVyX3F1ZXVlW1ZJQV9OUl9YVk1DX0xPQ0tTXTsKKwljaGFyICpkbWFfcHRyOworCXVuc2lnbmVkIGludCBkbWFfbG93OworCXVuc2lnbmVkIGludCBkbWFfaGlnaDsKKwl1bnNpZ25lZCBpbnQgZG1hX29mZnNldDsKKwl1aW50MzJfdCBkbWFfd3JhcDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqbGFzdF9wYXVzZV9wdHI7CisJdm9sYXRpbGUgdWludDMyX3QgKmh3X2FkZHJfcHRyOworCWRybV92aWFfcmluZ19idWZmZXJfdCByaW5nOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCBsYXN0X3ZibGFuazsKKyAgICAgICAgaW50IGxhc3RfdmJsYW5rX3ZhbGlkOworICAgICAgICB1bnNpZ25lZCB1c2VjX3Blcl92Ymxhbms7CisJZHJtX3ZpYV9zdGF0ZV90IGhjX3N0YXRlOworCWNoYXIgcGNpX2J1ZltWSUFfUENJX0JVRl9TSVpFXTsKKwljb25zdCB1aW50MzJfdCAqZmlyZV9vZmZzZXRzW1ZJQV9GSVJFX0JVRl9TSVpFXTsKKwl1aW50MzJfdCBudW1fZmlyZV9vZmZzZXRzOworCWludCBwcm9fZ3JvdXBfYTsKKwlkcm1fdmlhX2lycV90IHZpYV9pcnFzW1ZJQV9OVU1fSVJRU107CisJdW5zaWduZWQgbnVtX2lycXM7CisJbWFza2FycmF5X3QgKmlycV9tYXNrczsKKwl1aW50MzJfdCBpcnFfZW5hYmxlX21hc2s7IAorCXVpbnQzMl90IGlycV9wZW5kaW5nX21hc2s7CQorfSBkcm1fdmlhX3ByaXZhdGVfdDsKKworLyogVklBIE1NSU8gcmVnaXN0ZXIgYWNjZXNzICovCisjZGVmaW5lIFZJQV9CQVNFICgoZGV2X3ByaXYtPm1taW8pKQorCisjZGVmaW5lIFZJQV9SRUFEKHJlZykJCURSTV9SRUFEMzIoVklBX0JBU0UsIHJlZykKKyNkZWZpbmUgVklBX1dSSVRFKHJlZyx2YWwpCURSTV9XUklURTMyKFZJQV9CQVNFLCByZWcsIHZhbCkKKyNkZWZpbmUgVklBX1JFQUQ4KHJlZykJCURSTV9SRUFEOChWSUFfQkFTRSwgcmVnKQorI2RlZmluZSBWSUFfV1JJVEU4KHJlZyx2YWwpCURSTV9XUklURTgoVklBX0JBU0UsIHJlZywgdmFsKQorCitleHRlcm4gaW50IHZpYV9pbml0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50IHZpYV9maW5hbF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOworCitleHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfbWFwX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKworZXh0ZXJuIGlycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKKworZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9pbml0X2NvbW1hbmRfdmVyaWZpZXIodm9pZCk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIHZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2aWFfcmVsZWFzZV9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBjb250ZXh0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjNkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAidmlhX2RzLmgiCitleHRlcm4gdW5zaWduZWQgaW50IFZJQV9ERUJVRzsKKworc2V0X3QgKnZpYV9zZXRJbml0KHZvaWQpCit7CisJaW50IGk7CisJc2V0X3QgKnNldDsKKwlzZXQgPSAoc2V0X3QgKikgZHJtX2FsbG9jKHNpemVvZihzZXRfdCksIERSTV9NRU1fRFJJVkVSKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0VUX1NJWkU7IGkrKykgeworCQlzZXQtPmxpc3RbaV0uZnJlZV9uZXh0ID0gaSArIDE7CisJCXNldC0+bGlzdFtpXS5hbGxvY19uZXh0ID0gLTE7CisJfQorCXNldC0+bGlzdFtTRVRfU0laRSAtIDFdLmZyZWVfbmV4dCA9IC0xOworCXNldC0+ZnJlZSA9IDA7CisJc2V0LT5hbGxvYyA9IC0xOworCXNldC0+dHJhY2UgPSAtMTsKKwlyZXR1cm4gc2V0OworfQorCitpbnQgdmlhX3NldEFkZChzZXRfdCAqIHNldCwgSVRFTV9UWVBFIGl0ZW0pCit7CisJaW50IGZyZWUgPSBzZXQtPmZyZWU7CisJaWYgKGZyZWUgIT0gLTEpIHsKKwkJc2V0LT5saXN0W2ZyZWVdLnZhbCA9IGl0ZW07CisJCXNldC0+ZnJlZSA9IHNldC0+bGlzdFtmcmVlXS5mcmVlX25leHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCXNldC0+bGlzdFtmcmVlXS5hbGxvY19uZXh0ID0gc2V0LT5hbGxvYzsKKwlzZXQtPmFsbG9jID0gZnJlZTsKKwlzZXQtPmxpc3RbZnJlZV0uZnJlZV9uZXh0ID0gLTE7CisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfc2V0RGVsKHNldF90ICogc2V0LCBJVEVNX1RZUEUgaXRlbSkKK3sKKwlpbnQgYWxsb2MgPSBzZXQtPmFsbG9jOworCWludCBwcmV2ID0gLTE7CisKKwl3aGlsZSAoYWxsb2MgIT0gLTEpIHsKKwkJaWYgKHNldC0+bGlzdFthbGxvY10udmFsID09IGl0ZW0pIHsKKwkJCWlmIChwcmV2ICE9IC0xKQorCQkJCXNldC0+bGlzdFtwcmV2XS5hbGxvY19uZXh0ID0KKwkJCQkgICAgc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJZWxzZQorCQkJCXNldC0+YWxsb2MgPSBzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQ7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gYWxsb2M7CisJCWFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCX0KKworCWlmIChhbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlzZXQtPmxpc3RbYWxsb2NdLmZyZWVfbmV4dCA9IHNldC0+ZnJlZTsKKwlzZXQtPmZyZWUgPSBhbGxvYzsKKwlzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQgPSAtMTsKKworCXJldHVybiAxOworfQorCisvKiBzZXRGaXJzdCAtPiBzZXRBZGQgLT4gc2V0TmV4dCBpcyB3cm9uZyAqLworCitpbnQgdmlhX3NldEZpcnN0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKQoreworCWlmIChzZXQtPmFsbG9jID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYV9zZXROZXh0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKQoreworCWlmIChzZXQtPnRyYWNlID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYV9zZXREZXN0cm95KHNldF90ICogc2V0KQoreworCWRybV9mcmVlKHNldCwgc2l6ZW9mKHNldF90KSwgRFJNX01FTV9EUklWRVIpOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSVNGUkVFKGJwdHIpICgoYnB0ciktPmZyZWUpCisKKyNkZWZpbmUgZnByaW50ZihmbXQsIGFyZy4uLikgZG97fXdoaWxlKDApCisKK21lbUhlYXBfdCAqdmlhX21tSW5pdChpbnQgb2ZzLCBpbnQgc2l6ZSkKK3sKKwlQTWVtQmxvY2sgYmxvY2tzOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlibG9ja3MgPSAoVE1lbUJsb2NrICopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksIERSTV9NRU1fRFJJVkVSKTsKKworCWlmIChibG9ja3MpIHsKKwkJYmxvY2tzLT5vZnMgPSBvZnM7CisJCWJsb2Nrcy0+c2l6ZSA9IHNpemU7CisJCWJsb2Nrcy0+ZnJlZSA9IDE7CisJCXJldHVybiAobWVtSGVhcF90ICopIGJsb2NrczsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBUTWVtQmxvY2sgKlNsaWNlQmxvY2soVE1lbUJsb2NrICogcCwKKwkJCSAgICAgaW50IHN0YXJ0b2ZzLCBpbnQgc2l6ZSwKKwkJCSAgICAgaW50IHJlc2VydmVkLCBpbnQgYWxpZ25tZW50KQoreworCVRNZW1CbG9jayAqbmV3YmxvY2s7CisKKwkvKiBicmVhayBsZWZ0ICovCisJaWYgKHN0YXJ0b2ZzID4gcC0+b2ZzKSB7CisJCW5ld2Jsb2NrID0KKwkJICAgIChUTWVtQmxvY2sgKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJCQkJICAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mczsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0b2ZzIC0gcC0+b2ZzKTsKKwkJbmV3YmxvY2stPmZyZWUgPSAxOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIGJyZWFrIHJpZ2h0ICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCW5ld2Jsb2NrID0KKwkJICAgIChUTWVtQmxvY2sgKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJCQkJICAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mcyArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQlwLT5zaXplID0gc2l6ZTsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCX0KKworCS8qIHAgPSBtaWRkbGUgYmxvY2sgKi8KKwlwLT5hbGlnbiA9IGFsaWdubWVudDsKKwlwLT5mcmVlID0gMDsKKwlwLT5yZXNlcnZlZCA9IHJlc2VydmVkOworCXJldHVybiBwOworfQorCitQTWVtQmxvY2sgdmlhX21tQWxsb2NNZW0obWVtSGVhcF90ICogaGVhcCwgaW50IHNpemUsIGludCBhbGlnbjIsCisJCQkgaW50IHN0YXJ0U2VhcmNoKQoreworCWludCBtYXNrLCBzdGFydG9mcywgZW5kb2ZzOworCVRNZW1CbG9jayAqcDsKKworCWlmICghaGVhcCB8fCBhbGlnbjIgPCAwIHx8IHNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXNrID0gKDEgPDwgYWxpZ24yKSAtIDE7CisJc3RhcnRvZnMgPSAwOworCXAgPSAoVE1lbUJsb2NrICopIGhlYXA7CisKKwl3aGlsZSAocCkgeworCQlpZiAoSVNGUkVFKHApKSB7CisJCQlzdGFydG9mcyA9IChwLT5vZnMgKyBtYXNrKSAmIH5tYXNrOworCisJCQlpZiAoc3RhcnRvZnMgPCBzdGFydFNlYXJjaCkKKwkJCQlzdGFydG9mcyA9IHN0YXJ0U2VhcmNoOworCisJCQllbmRvZnMgPSBzdGFydG9mcyArIHNpemU7CisKKwkJCWlmIChlbmRvZnMgPD0gKHAtPm9mcyArIHAtPnNpemUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJcCA9IHAtPm5leHQ7CisJfQorCisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKworCXAgPSBTbGljZUJsb2NrKHAsIHN0YXJ0b2ZzLCBzaXplLCAwLCBtYXNrICsgMSk7CisJcC0+aGVhcCA9IGhlYXA7CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IEpvaW4yQmxvY2tzKFRNZW1CbG9jayAqIHApCit7CisJaWYgKHAtPmZyZWUgJiYgcC0+bmV4dCAmJiBwLT5uZXh0LT5mcmVlKSB7CisJCVRNZW1CbG9jayAqcSA9IHAtPm5leHQ7CisJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCWRybV9mcmVlKHEsIHNpemVvZihUTWVtQmxvY2spLCBEUk1fTUVNX0RSSVZFUik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWFfbW1GcmVlTWVtKFBNZW1CbG9jayBiKQoreworCVRNZW1CbG9jayAqcCwgKnByZXY7CisKKwlpZiAoIWIpCisJCXJldHVybiAwOworCisJaWYgKCFiLT5oZWFwKSB7CisJCWZwcmludGYoc3RkZXJyLCAibm8gaGVhcFxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXAgPSBiLT5oZWFwOworCXByZXYgPSBOVUxMOworCisJd2hpbGUgKHAgJiYgcCAhPSBiKSB7CisJCXByZXYgPSBwOworCQlwID0gcC0+bmV4dDsKKwl9CisKKwlpZiAoIXAgfHwgcC0+ZnJlZSB8fCBwLT5yZXNlcnZlZCkgeworCQlpZiAoIXApCisJCQlmcHJpbnRmKHN0ZGVyciwgImJsb2NrIG5vdCBmb3VuZCBpbiBoZWFwXG4iKTsKKwkJZWxzZSBpZiAocC0+ZnJlZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiYmxvY2sgYWxyZWFkeSBmcmVlXG4iKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJibG9jayBpcyByZXNlcnZlZFxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXAtPmZyZWUgPSAxOworCUpvaW4yQmxvY2tzKHApOworCisJaWYgKHByZXYpCisJCUpvaW4yQmxvY2tzKHByZXYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTljN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF92aWFfZHNfaF8KKyNkZWZpbmUgX3ZpYV9kc19oXworCisjaW5jbHVkZSAiZHJtUC5oIgorCisvKiBTZXQgRGF0YSBTdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgU0VUX1NJWkUgNTAwMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIElURU1fVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUlURU1fVFlQRSB2YWw7CisJaW50IGFsbG9jX25leHQsIGZyZWVfbmV4dDsKK30gbGlzdF9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYWxsb2M7CisJaW50IGZyZWU7CisJaW50IHRyYWNlOworCWxpc3RfaXRlbV90IGxpc3RbU0VUX1NJWkVdOworfSBzZXRfdDsKKworc2V0X3QgKnZpYV9zZXRJbml0KHZvaWQpOworaW50IHZpYV9zZXRBZGQoc2V0X3QgKiBzZXQsIElURU1fVFlQRSBpdGVtKTsKK2ludCB2aWFfc2V0RGVsKHNldF90ICogc2V0LCBJVEVNX1RZUEUgaXRlbSk7CitpbnQgdmlhX3NldEZpcnN0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKTsKK2ludCB2aWFfc2V0TmV4dChzZXRfdCAqIHNldCwgSVRFTV9UWVBFICogaXRlbSk7CitpbnQgdmlhX3NldERlc3Ryb3koc2V0X3QgKiBzZXQpOworCisjZW5kaWYKKworI2lmbmRlZiBNTV9JTkMKKyNkZWZpbmUgTU1fSU5DCisKK3N0cnVjdCBtZW1fYmxvY2tfdCB7CisJc3RydWN0IG1lbV9ibG9ja190ICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2tfdCAqaGVhcDsKKwlpbnQgb2ZzLCBzaXplOworCWludCBhbGlnbjsKKwlpbnQgZnJlZToxOworCWludCByZXNlcnZlZDoxOworfTsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190IFRNZW1CbG9jazsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190ICpQTWVtQmxvY2s7CisKKy8qIGEgaGVhcCBpcyBqdXN0IHRoZSBmaXJzdCBibG9jayBpbiBhIGNoYWluICovCit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCBtZW1IZWFwX3Q7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBtbUJsb2NrU2l6ZShQTWVtQmxvY2sgYikKK3sKKwlyZXR1cm4gYi0+c2l6ZTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IG1tT2Zmc2V0KFBNZW1CbG9jayBiKQoreworCXJldHVybiBiLT5vZnM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbW1NYXJrUmVzZXJ2ZWQoUE1lbUJsb2NrIGIpCit7CisJYi0+cmVzZXJ2ZWQgPSAxOworfQorCisvKgorICogaW5wdXQ6IHRvdGFsIHNpemUgaW4gYnl0ZXMKKyAqIHJldHVybjogYSBoZWFwIHBvaW50ZXIgaWYgT0ssIE5VTEwgaWYgZXJyb3IKKyAqLworbWVtSGVhcF90ICp2aWFfbW1Jbml0KGludCBvZnMsIGludCBzaXplKTsKKworUE1lbUJsb2NrIHZpYV9tbUFsbG9jTWVtKG1lbUhlYXBfdCAqIGhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLAorCQkJIGludCBzdGFydFNlYXJjaCk7CisKKy8qCisgKiBGcmVlIGJsb2NrIHN0YXJ0cyBhdCBvZmZzZXQKKyAqIGlucHV0OiBwb2ludGVyIHRvIGEgYmxvY2sKKyAqIHJldHVybjogMCBpZiBPSywgLTEgaWYgZXJyb3IKKyAqLworaW50IHZpYV9tbUZyZWVNZW0oUE1lbUJsb2NrIGIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMjdmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiB2aWFfaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBCRUFNIEx0ZC4KKyAqIENvcHlyaWdodCAyMDAyIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogQkVBTSBMVEQsIFRVTkdTVEVOIEdSQVBISUNTICBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFRlcnJ5IEJhcm5hYnkgPHRlcnJ5MUBiZWFtLmx0ZC51az4KKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqICAgIFRob21hcyBIZWxsc3Ryb20gPHVuaWNocm9tZUBzaGlwbWFpbC5vcmc+CisgKgorICogVGhpcyBjb2RlIHByb3ZpZGVzIHN0YW5kYXJkIERSTSBhY2Nlc3MgdG8gdGhlIFZpYSBVbmljaHJvbWUgLyBQcm8gVmVydGljYWwgYmxhbmsKKyAqIGludGVycnVwdCwgYXMgd2VsbCBhcyBhbiBpbmZyYXN0cnVjdHVyZSB0byBoYW5kbGUgb3RoZXIgaW50ZXJydXB0cyBvZiB0aGUgY2hpcC4KKyAqIFRoZSByZWZyZXNoIHJhdGUgaXMgYWxzbyBjYWxjdWxhdGVkIGZvciB2aWRlbyBwbGF5YmFjayBzeW5jIHB1cnBvc2VzLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKworI2RlZmluZSBWSUFfUkVHX0lOVEVSUlVQVCAgICAgICAweDIwMAorCisvKiBWSUFfUkVHX0lOVEVSUlVQVCAqLworI2RlZmluZSBWSUFfSVJRX0dMT0JBTCAgICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgVklBX0lSUV9WQkxBTktfRU5BQkxFICAgKDEgPDwgMTkpCisjZGVmaW5lIFZJQV9JUlFfVkJMQU5LX1BFTkRJTkcgICgxIDw8IDMpCisjZGVmaW5lIFZJQV9JUlFfSFFWMF9FTkFCTEUgICAgICgxIDw8IDExKQorI2RlZmluZSBWSUFfSVJRX0hRVjFfRU5BQkxFICAgICAoMSA8PCAyNSkKKyNkZWZpbmUgVklBX0lSUV9IUVYwX1BFTkRJTkcgICAgKDEgPDwgOSkKKyNkZWZpbmUgVklBX0lSUV9IUVYxX1BFTkRJTkcgICAgKDEgPDwgMTApCisKKy8qCisgKiBEZXZpY2Utc3BlY2lmaWMgSVJRcyBnbyBoZXJlLiBUaGlzIHR5cGUgbWlnaHQgbmVlZCB0byBiZSBleHRlbmRlZCB3aXRoCisgKiB0aGUgcmVnaXN0ZXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIElSUSBjb250cm9sIHJlZ2lzdGVycy4KKyAqIEN1cnJlbnRseSB3ZSBhY3RpdmF0ZSB0aGUgSFFWIGludGVycnVwdHMgb2YgIFVuaWNocm9tZSBQcm8gZ3JvdXAgQS4gCisgKi8KKworc3RhdGljIG1hc2thcnJheV90IHZpYV9wcm9fZ3JvdXBfYV9pcnFzW10gPSB7CisJe1ZJQV9JUlFfSFFWMF9FTkFCTEUsIFZJQV9JUlFfSFFWMF9QRU5ESU5HLCAweDAwMDAwM0QwLCAweDAwMDA4MDEwLCAweDAwMDAwMDAwIH0sCisJe1ZJQV9JUlFfSFFWMV9FTkFCTEUsIFZJQV9JUlFfSFFWMV9QRU5ESU5HLCAweDAwMDAxM0QwLCAweDAwMDA4MDEwLCAweDAwMDAwMDAwIH19Oworc3RhdGljIGludCB2aWFfbnVtX3Byb19ncm91cF9hID0gc2l6ZW9mKHZpYV9wcm9fZ3JvdXBfYV9pcnFzKS9zaXplb2YobWFza2FycmF5X3QpOworCitzdGF0aWMgbWFza2FycmF5X3QgdmlhX3VuaWNocm9tZV9pcnFzW10gPSB7fTsKK3N0YXRpYyBpbnQgdmlhX251bV91bmljaHJvbWUgPSBzaXplb2YodmlhX3VuaWNocm9tZV9pcnFzKS9zaXplb2YobWFza2FycmF5X3QpOworCisKK3N0YXRpYyB1bnNpZ25lZCB0aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKm5vdyxzdHJ1Y3QgdGltZXZhbCAqdGhlbikgCit7CisgICAgcmV0dXJuIChub3ctPnR2X3VzZWMgPj0gdGhlbi0+dHZfdXNlYykgPworICAgICAgICBub3ctPnR2X3VzZWMgLSB0aGVuLT50dl91c2VjIDoKKyAgICAgICAgMTAwMDAwMCAtICh0aGVuLT50dl91c2VjIC0gbm93LT50dl91c2VjKTsKK30KKworaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCBjdXJfdmJsYW5rOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IGk7CisKKwlzdGF0dXMgPSBWSUFfUkVBRChWSUFfUkVHX0lOVEVSUlVQVCk7CisJaWYgKHN0YXR1cyAmIFZJQV9JUlFfVkJMQU5LX1BFTkRJTkcpIHsKKwkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworICAgICAgICAgICAgICAgIGlmICghKGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkgJiAweDBGKSkgeworCQkJZG9fZ2V0dGltZW9mZGF5KCZjdXJfdmJsYW5rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQpIHsKKwkJCQlkZXZfcHJpdi0+dXNlY19wZXJfdmJsYW5rID0gCisJCQkJCXRpbWVfZGlmZiggJmN1cl92YmxhbmssJmRldl9wcml2LT5sYXN0X3ZibGFuaykgPj4gNDsKKwkJCX0KKwkJCWRldl9wcml2LT5sYXN0X3ZibGFuayA9IGN1cl92Ymxhbms7CisJCQlkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIShhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpICYgMHhGRikpIHsKKwkJCURSTV9ERUJVRygiVVMgcGVyIHZibGFuayBpczogJXVcbiIsCisJCQkJZGV2X3ByaXYtPnVzZWNfcGVyX3ZibGFuayk7CisJCX0KKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyhkZXYpOworCQloYW5kbGVkID0gMTsKKwl9CisJCisKKwlmb3IgKGk9MDsgaTxkZXZfcHJpdi0+bnVtX2lycXM7ICsraSkgeworCQlpZiAoc3RhdHVzICYgY3VyX2lycS0+cGVuZGluZ19tYXNrKSB7CisJCQlhdG9taWNfaW5jKCAmY3VyX2lycS0+aXJxX3JlY2VpdmVkICk7CisJCQlEUk1fV0FLRVVQKCAmY3VyX2lycS0+aXJxX3F1ZXVlICk7CisJCQloYW5kbGVkID0gMTsKKwkJfQorCQljdXJfaXJxKys7CisJfQorCQorCS8qIEFja25vd2xlZ2UgaW50ZXJydXB0cyAqLworCVZJQV9XUklURShWSUFfUkVHX0lOVEVSUlVQVCwgc3RhdHVzKTsKKworCisJaWYgKGhhbmRsZWQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwllbHNlCisJCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCB2aWFkcnZfYWNrbm93bGVkZ2VfaXJxcyhkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXUzMiBzdGF0dXM7CisKKwlpZiAoZGV2X3ByaXYpIHsKKwkJLyogQWNrbm93bGVnZSBpbnRlcnJ1cHRzICovCisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgfCAKKwkJCSAgZGV2X3ByaXYtPmlycV9wZW5kaW5nX21hc2spOworCX0KK30KKworaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOworCWludCByZXQgPSAwOworCisJRFJNX0RFQlVHKCJ2aWFkcnZfdmJsYW5rX3dhaXRcbiIpOworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmlhZHJ2X2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYpOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4KKwkgKi8KKworCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxfcXVldWUsIDMgKiBEUk1fSFosCisJCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSkgLQorCQkgICAgICAqc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkpOworCQorCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCAKK3ZpYV9kcml2ZXJfaXJxX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZm9yY2Vfc2VxdWVuY2UsCisJCSAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBjdXJfaXJxX3NlcXVlbmNlOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IHJldCA9IDA7CisJbWFza2FycmF5X3QgKm1hc2tzID0gZGV2X3ByaXYtPmlycV9tYXNrczsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKGlycSA+PSBkZXZfcHJpdi0+bnVtX2lycXMgKSB7CisJCURSTV9FUlJPUigiJXMgVHJ5aW5nIHRvIHdhaXQgb24gdW5rbm93biBpcnEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJCQorCWN1cl9pcnEgKz0gaXJxOworCisJaWYgKG1hc2tzW2lycV1bMl0gJiYgIWZvcmNlX3NlcXVlbmNlKSB7CisJCURSTV9XQUlUX09OKHJldCwgY3VyX2lycS0+aXJxX3F1ZXVlLCAzICogRFJNX0haLAorCQkJICAgICgoVklBX1JFQUQobWFza3NbaXJxXVsyXSkgJiBtYXNrc1tpcnFdWzNdKSA9PSBtYXNrc1tpcnFdWzRdKSk7CisJCWN1cl9pcnFfc2VxdWVuY2UgPSBhdG9taWNfcmVhZCgmY3VyX2lycS0+aXJxX3JlY2VpdmVkKTsKKwl9IGVsc2UgeworCQlEUk1fV0FJVF9PTihyZXQsIGN1cl9pcnEtPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKKwkJCSAgICAoKChjdXJfaXJxX3NlcXVlbmNlID0gYXRvbWljX3JlYWQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCkpIC0KKwkJCSAgICAgICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CQkKKwl9CisJKnNlcXVlbmNlID0gY3VyX2lycV9zZXF1ZW5jZTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBkcm1fZG1hLmggaG9va3MKKyAqLworCit2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisJZHJtX3ZpYV9pcnFfdCAqY3VyX2lycSA9IGRldl9wcml2LT52aWFfaXJxczsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiZHJpdmVyX2lycV9wcmVpbnN0YWxsOiBkZXZfcHJpdjogJXBcbiIsIGRldl9wcml2KTsKKwlpZiAoZGV2X3ByaXYpIHsKKworCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrID0gVklBX0lSUV9WQkxBTktfRU5BQkxFOworCQlkZXZfcHJpdi0+aXJxX3BlbmRpbmdfbWFzayA9IFZJQV9JUlFfVkJMQU5LX1BFTkRJTkc7CisKKwkJZGV2X3ByaXYtPmlycV9tYXNrcyA9IChkZXZfcHJpdi0+cHJvX2dyb3VwX2EpID8KKwkJCXZpYV9wcm9fZ3JvdXBfYV9pcnFzIDogdmlhX3VuaWNocm9tZV9pcnFzOworCQlkZXZfcHJpdi0+bnVtX2lycXMgPSAoZGV2X3ByaXYtPnByb19ncm91cF9hKSA/CisJCQl2aWFfbnVtX3Byb19ncm91cF9hIDogdmlhX251bV91bmljaHJvbWU7CisJCQorCQlmb3IoaT0wOyBpIDwgZGV2X3ByaXYtPm51bV9pcnFzOyArK2kpIHsKKwkJCWF0b21pY19zZXQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCwgMCk7CisJCQljdXJfaXJxLT5lbmFibGVfbWFzayA9IGRldl9wcml2LT5pcnFfbWFza3NbaV1bMF07IAorCQkJY3VyX2lycS0+cGVuZGluZ19tYXNrID0gZGV2X3ByaXYtPmlycV9tYXNrc1tpXVsxXTsKKwkJCURSTV9JTklUX1dBSVRRVUVVRSggJmN1cl9pcnEtPmlycV9xdWV1ZSApOworCQkJZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzayB8PSBjdXJfaXJxLT5lbmFibGVfbWFzazsKKwkJCWRldl9wcml2LT5pcnFfcGVuZGluZ19tYXNrIHw9IGN1cl9pcnEtPnBlbmRpbmdfbWFzazsKKwkJCWN1cl9pcnErKzsKKwkJCQorCQkJRFJNX0RFQlVHKCJJbml0aWFsaXppbmcgSVJRICVkXG4iLCBpKTsKKwkJfQorCQkJCisJICAgICAgICBkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQgPSAwOworCisJCS8vIENsZWFyIFZTeW5jIGludGVycnVwdCByZWdzCisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgJiAKKwkJCSAgfihkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrKSk7CisJCQorCQkvKiBDbGVhciBiaXRzIGlmIHRoZXkncmUgYWxyZWFkeSBoaWdoICovCisJCXZpYWRydl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2KTsKKwl9Cit9CisKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisKKwlEUk1fREVCVUcoInZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsXG4iKTsKKwlpZiAoZGV2X3ByaXYpIHsKKwkJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOworCQlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyB8IFZJQV9JUlFfR0xPQkFMCisJCQkgIHwgZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzayk7CisKKwkJLyogU29tZSBtYWdpYywgb2ggZm9yIHNvbWUgZGF0YSBzaGVldHMgISAqLworCisJCVZJQV9XUklURTgoMHg4M2Q0LCAweDExKTsKKwkJVklBX1dSSVRFOCgweDgzZDUsIFZJQV9SRUFEOCgweDgzZDUpIHwgMHgzMCk7CisJCQorCX0KK30KKwordm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisKKwlEUk1fREVCVUcoImRyaXZlcl9pcnFfdW5pbnN0YWxsKVxuIik7CisJaWYgKGRldl9wcml2KSB7CisKKwkJLyogU29tZSBtb3JlIG1hZ2ljLCBvaCBmb3Igc29tZSBkYXRhIHNoZWV0cyAhICovCisKKwkJVklBX1dSSVRFOCgweDgzZDQsIDB4MTEpOworCQlWSUFfV1JJVEU4KDB4ODNkNSwgVklBX1JFQUQ4KDB4ODNkNSkgJiB+MHgzMCk7CisKKwkJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOworCQlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyAmIAorCQkJICB+KFZJQV9JUlFfVkJMQU5LX0VOQUJMRSB8IGRldl9wcml2LT5pcnFfZW5hYmxlX21hc2spKTsKKwl9Cit9CisKK2ludCB2aWFfd2FpdF9pcnEoRFJNX0lPQ1RMX0FSR1MpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdmlhX2lycXdhaXRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV92aWFfaXJxd2FpdF90IGlycXdhaXQ7CisJc3RydWN0IHRpbWV2YWwgbm93OworCWludCByZXQgPSAwOworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IGZvcmNlX3NlcXVlbmNlOworCisJaWYgKCFkZXYtPmlycSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpcnF3YWl0LCBhcmdwLCBzaXplb2YoaXJxd2FpdCkpOworCWlmIChpcnF3YWl0LnJlcXVlc3QuaXJxID49IGRldl9wcml2LT5udW1faXJxcykgeworCQlEUk1fRVJST1IoIiVzIFRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICBpcnF3YWl0LnJlcXVlc3QuaXJxKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljdXJfaXJxICs9IGlycXdhaXQucmVxdWVzdC5pcnE7CisKKwlzd2l0Y2ggKGlycXdhaXQucmVxdWVzdC50eXBlICYgflZJQV9JUlFfRkxBR1NfTUFTSykgeworCWNhc2UgVklBX0lSUV9SRUxBVElWRToKKwkJaXJxd2FpdC5yZXF1ZXN0LnNlcXVlbmNlICs9IGF0b21pY19yZWFkKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpOworCQlpcnF3YWl0LnJlcXVlc3QudHlwZSAmPSB+X0RSTV9WQkxBTktfUkVMQVRJVkU7CisJY2FzZSBWSUFfSVJRX0FCU09MVVRFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChpcnF3YWl0LnJlcXVlc3QudHlwZSAmIFZJQV9JUlFfU0lHTkFMKSB7CisJCURSTV9FUlJPUigiJXMgU2lnbmFscyBvbiBWaWEgSVJRcyBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIiwgCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZm9yY2Vfc2VxdWVuY2UgPSAoaXJxd2FpdC5yZXF1ZXN0LnR5cGUgJiBWSUFfSVJRX0ZPUkNFX1NFUVVFTkNFKTsKKworCXJldCA9IHZpYV9kcml2ZXJfaXJxX3dhaXQoZGV2LCBpcnF3YWl0LnJlcXVlc3QuaXJxLCBmb3JjZV9zZXF1ZW5jZSwKKwkJCQkgICZpcnF3YWl0LnJlcXVlc3Quc2VxdWVuY2UpOworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlpcnF3YWl0LnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKKwlpcnF3YWl0LnJlcGx5LnR2YWxfdXNlYyA9IG5vdy50dl91c2VjOworCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBpcnF3YWl0LCBzaXplb2YoaXJxd2FpdCkpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlODI5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCitzdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSk7CisKKwlEUk1fR0VUU0FSRUEoKTsKKwlpZiAoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQl2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X3ByaXYtPmZiID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmZiX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+ZmIpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBmcmFtZWJ1ZmZlciFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJdmlhX2RvX2NsZWFudXBfbWFwKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfcHJpdi0+bW1pbyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQl2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCSAgICAoZHJtX3ZpYV9zYXJlYV90ICopICgodTggKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlkZXZfcHJpdi0+YWdwQWRkciA9IGluaXQtPmFncEFkZHI7CisKKwl2aWFfaW5pdF9mdXRleCggZGV2X3ByaXYgKTsKKwlkZXZfcHJpdi0+cHJvX2dyb3VwX2EgPSAoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHgzMTE4KTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCisJCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJdmlhX2RtYV9jbGVhbnVwKGRldik7CisKKwkJZHJtX2ZyZWUoZGV2X3ByaXYsIHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWFfbWFwX2luaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2luaXRfdCBpbml0OworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0LCAoZHJtX3ZpYV9pbml0X3QgKikgZGF0YSwgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBWSUFfSU5JVF9NQVA6CisJCXJldHVybiB2aWFfZG9faW5pdF9tYXAoZGV2LCAmaW5pdCk7CisJY2FzZSBWSUFfQ0xFQU5VUF9NQVA6CisJCXJldHVybiB2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI3MTJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKyNpbmNsdWRlICJ2aWFfZHMuaCIKKyNpbmNsdWRlICJ2aWFfbW0uaCIKKworI2RlZmluZSBNQVhfQ09OVEVYVCAxMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB1c2VkOworCWludCBjb250ZXh0OworCXNldF90ICpzZXRzWzJdOwkJLyogMCBmb3IgZnJhbWUgYnVmZmVyLCAxIGZvciBBR1AgLCAyIGZvciBTeXN0ZW0gKi8KK30gdmlhX2NvbnRleHRfdDsKKworc3RhdGljIHZpYV9jb250ZXh0X3QgZ2xvYmFsX3Bwcml2W01BWF9DT05URVhUXTsKKworc3RhdGljIGludCB2aWFfYWdwX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pOworc3RhdGljIGludCB2aWFfYWdwX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CitzdGF0aWMgaW50IHZpYV9mYl9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKTsKK3N0YXRpYyBpbnQgdmlhX2ZiX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CisKK3N0YXRpYyBpbnQgYWRkX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYgZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkgeworCQkJcmV0dmFsID0gdmlhX3NldEFkZChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkZWxfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKQorCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYgZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkgeworCQkJcmV0dmFsID0gdmlhX3NldERlbChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBhZ3AgbWVtb3J5IG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBtZW1IZWFwX3QgKkFncEhlYXAgPSBOVUxMOworCitpbnQgdmlhX2FncF9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfYWdwX3QgYWdwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV92aWFfYWdwX3QgKikgZGF0YSwgc2l6ZW9mKGFncCkpOworCisJQWdwSGVhcCA9IHZpYV9tbUluaXQoYWdwLm9mZnNldCwgYWdwLnNpemUpOworCisJRFJNX0RFQlVHKCJvZmZzZXQgPSAlbHUsIHNpemUgPSAlbHUiLCAodW5zaWduZWQgbG9uZylhZ3Aub2Zmc2V0LCAodW5zaWduZWQgbG9uZylhZ3Auc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZmIgbWVtb3J5IG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBtZW1IZWFwX3QgKkZCSGVhcCA9IE5VTEw7CisKK2ludCB2aWFfZmJfaW5pdChEUk1fSU9DVExfQVJHUykKK3sKKwlkcm1fdmlhX2ZiX3QgZmI7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIChkcm1fdmlhX2ZiX3QgKikgZGF0YSwgc2l6ZW9mKGZiKSk7CisKKwlGQkhlYXAgPSB2aWFfbW1Jbml0KGZiLm9mZnNldCwgZmIuc2l6ZSk7CisKKwlEUk1fREVCVUcoIm9mZnNldCA9ICVsdSwgc2l6ZSA9ICVsdSIsICh1bnNpZ25lZCBsb25nKWZiLm9mZnNldCwgKHVuc2lnbmVkIGxvbmcpZmIuc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9pbml0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmCisJCSAgICAoZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkpCisJCQlicmVhazsKKworCWlmIChpID49IE1BWF9DT05URVhUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKSB7CisJCQlpZiAoIWdsb2JhbF9wcHJpdltpXS51c2VkKSB7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPSBjb250ZXh0OworCQkJCWdsb2JhbF9wcHJpdltpXS51c2VkID0gMTsKKwkJCQlnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9IHZpYV9zZXRJbml0KCk7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV0gPSB2aWFfc2V0SW5pdCgpOworCQkJCURSTV9ERUJVRygiaW5pdCBhbGxvY2F0aW9uIHNldCwgc29ja2V0PSVkLCIKKwkJCQkJICAiIGNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGkgPj0gTUFYX0NPTlRFWFQpIHx8IChnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9PSBOVUxMKSB8fAorCQkgICAgKGdsb2JhbF9wcHJpdltpXS5zZXRzWzFdID09IE5VTEwpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmlhX2ZpbmFsX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpCit7CQorICAgICAgICBpbnQgaTsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKQorCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBNQVhfQ09OVEVYVCkgeworCQlzZXRfdCAqc2V0OworCQlJVEVNX1RZUEUgaXRlbTsKKwkJaW50IHJldHZhbDsKKworCQlEUk1fREVCVUcoImZpbmQgc29ja2V0ICVkLCBjb250ZXh0ID0gJWRcbiIsIGksIGNvbnRleHQpOworCisJCS8qIFZpZGVvIE1lbW9yeSAqLworCQlzZXQgPSBnbG9iYWxfcHByaXZbaV0uc2V0c1swXTsKKwkJcmV0dmFsID0gdmlhX3NldEZpcnN0KHNldCwgJml0ZW0pOworCQl3aGlsZSAocmV0dmFsKSB7CisJCQlEUk1fREVCVUcoImZyZWUgdmlkZW8gbWVtb3J5IDB4JWx4XG4iLCBpdGVtKTsKKwkJCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgaXRlbSk7CisJCQlyZXR2YWwgPSB2aWFfc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQl2aWFfc2V0RGVzdHJveShzZXQpOworCisJCS8qIEFHUCBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV07CisJCXJldHZhbCA9IHZpYV9zZXRGaXJzdChzZXQsICZpdGVtKTsKKwkJd2hpbGUgKHJldHZhbCkgeworCQkJRFJNX0RFQlVHKCJmcmVlIGFncCBtZW1vcnkgMHglbHhcbiIsIGl0ZW0pOworCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBpdGVtKTsKKwkJCXJldHZhbCA9IHZpYV9zZXROZXh0KHNldCwgJml0ZW0pOworCQl9CisJCXZpYV9zZXREZXN0cm95KHNldCk7CisJCWdsb2JhbF9wcHJpdltpXS51c2VkID0gMDsKKwl9CisJdmlhX3JlbGVhc2VfZnV0ZXgoZGV2X3ByaXYsIGNvbnRleHQpOyAKKwkKKwkJCQorI2lmIGRlZmluZWQoX19saW51eF9fKQorCS8qIExpbnV4IHNwZWNpZmljIHVudGlsIGNvbnRleHQgdHJhY2tpbmcgY29kZSBnZXRzIHBvcnRlZCB0byBCU0QgKi8KKwkvKiBMYXN0IGNvbnRleHQsIHBlcmZvcm0gY2xlYW51cCAqLworCWlmIChkZXYtPmN0eF9jb3VudCA9PSAxICYmIGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkgICAgICAgIERSTV9ERUJVRygiTGFzdCBDb250ZXh0XG4iKTsKKwkJaWYgKGRldi0+aXJxKQorCQkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCQl2aWFfY2xlYW51cF9mdXRleChkZXZfcHJpdik7CisJCXZpYV9kb19jbGVhbnVwX21hcChkZXYpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfbWVtX3QgbWVtOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgKGRybV92aWFfbWVtX3QgKikgZGF0YSwgc2l6ZW9mKG1lbSkpOworCisJc3dpdGNoIChtZW0udHlwZSkgeworCWNhc2UgVklERU86CisJCWlmICh2aWFfZmJfYWxsb2MoJm1lbSkgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfbWVtX3QgKikgZGF0YSwgbWVtLAorCQkJCSAgICAgICBzaXplb2YobWVtKSk7CisJCXJldHVybiAwOworCWNhc2UgQUdQOgorCQlpZiAodmlhX2FncF9hbGxvYygmbWVtKSA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX3ZpYV9tZW1fdCAqKSBkYXRhLCBtZW0sCisJCQkJICAgICAgIHNpemVvZihtZW0pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2ZiX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pCit7CisJZHJtX3ZpYV9tbV90IGZiOworCVBNZW1CbG9jayBibG9jazsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghRkJIZWFwKQorCQlyZXR1cm4gLTE7CisKKwlmYi5zaXplID0gbWVtLT5zaXplOworCWZiLmNvbnRleHQgPSBtZW0tPmNvbnRleHQ7CisKKwlibG9jayA9IHZpYV9tbUFsbG9jTWVtKEZCSGVhcCwgZmIuc2l6ZSwgNSwgMCk7CisJaWYgKGJsb2NrKSB7CisJCWZiLm9mZnNldCA9IGJsb2NrLT5vZnM7CisJCWZiLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPLCBmYi5mcmVlKSkgeworCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOworCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBmYi5mcmVlKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJZmIub2Zmc2V0ID0gMDsKKwkJZmIuc2l6ZSA9IDA7CisJCWZiLmZyZWUgPSAwOworCQlyZXR2YWwgPSAtMTsKKwl9CisKKwltZW0tPm9mZnNldCA9IGZiLm9mZnNldDsKKwltZW0tPmluZGV4ID0gZmIuZnJlZTsKKworCURSTV9ERUJVRygiYWxsb2MgZmIsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGZiLnNpemUsCisJCSAgKGludClmYi5vZmZzZXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWFfYWdwX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pCit7CisJZHJtX3ZpYV9tbV90IGFncDsKKwlQTWVtQmxvY2sgYmxvY2s7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIUFncEhlYXApCisJCXJldHVybiAtMTsKKworCWFncC5zaXplID0gbWVtLT5zaXplOworCWFncC5jb250ZXh0ID0gbWVtLT5jb250ZXh0OworCisJYmxvY2sgPSB2aWFfbW1BbGxvY01lbShBZ3BIZWFwLCBhZ3Auc2l6ZSwgNSwgMCk7CisJaWYgKGJsb2NrKSB7CisJCWFncC5vZmZzZXQgPSBibG9jay0+b2ZzOworCQlhZ3AuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOworCQlpZiAoIWFkZF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUCwgYWdwLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGFncC5mcmVlKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJYWdwLm9mZnNldCA9IDA7CisJCWFncC5zaXplID0gMDsKKwkJYWdwLmZyZWUgPSAwOworCX0KKworCW1lbS0+b2Zmc2V0ID0gYWdwLm9mZnNldDsKKwltZW0tPmluZGV4ID0gYWdwLmZyZWU7CisKKwlEUk1fREVCVUcoImFsbG9jIGFncCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgYWdwLnNpemUsCisJCSAgKHVuc2lnbmVkIGludClhZ3Aub2Zmc2V0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdmlhX21lbV9mcmVlKERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfbWVtX3QgbWVtOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgKGRybV92aWFfbWVtX3QgKikgZGF0YSwgc2l6ZW9mKG1lbSkpOworCisJc3dpdGNoIChtZW0udHlwZSkgeworCisJY2FzZSBWSURFTzoKKwkJaWYgKHZpYV9mYl9mcmVlKCZtZW0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBBR1A6CisJCWlmICh2aWFfYWdwX2ZyZWUoJm1lbSkgPT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB2aWFfZmJfZnJlZShkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBmYjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghRkJIZWFwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlmYi5mcmVlID0gbWVtLT5pbmRleDsKKwlmYi5jb250ZXh0ID0gbWVtLT5jb250ZXh0OworCisJaWYgKCFmYi5mcmVlKSB7CisJCXJldHVybiAtMTsKKworCX0KKworCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgZmIuZnJlZSk7CisKKwlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU8sIGZiLmZyZWUpKSB7CisJCXJldHZhbCA9IC0xOworCX0KKworCURSTV9ERUJVRygiZnJlZSBmYiwgZnJlZSA9ICVsZFxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpYV9hZ3BfZnJlZShkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBhZ3A7CisKKwlpbnQgcmV0dmFsID0gMDsKKworCWFncC5mcmVlID0gbWVtLT5pbmRleDsKKwlhZ3AuY29udGV4dCA9IG1lbS0+Y29udGV4dDsKKworCWlmICghYWdwLmZyZWUpCisJCXJldHVybiAtMTsKKworCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgYWdwLmZyZWUpOworCisJaWYgKCFkZWxfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBBR1AsIGFncC5mcmVlKSkgeworCQlyZXR2YWwgPSAtMTsKKwl9CisKKwlEUk1fREVCVUcoImZyZWUgYWdwLCBmcmVlID0gJWxkXG4iLCBhZ3AuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3ZWZkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX3ZpYV9kcm1fbW1faF8KKyNkZWZpbmUgX3ZpYV9kcm1fbW1faF8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjb250ZXh0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3ZpYV9tbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CisJdm9pZCAqdmlydHVhbDsKK30gZHJtX3ZpYV9kbWFfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkyM2IwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwpAQCAtMCwwICsxLDEwNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBUaGUgVW5pY2hyb21lIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUihTKSwgQU5EL09SIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogVGhvbWFzIEhlbGxzdHJvbSAyMDA0LCAyMDA1LgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHVzaW5nIGRvY3Mgb2J0YWluZWQgdW5kZXIgTkRBIGZyb20gVklBIEluYy4KKyAqCisgKiBEb24ndCBydW4gdGhpcyBjb2RlIGRpcmVjdGx5IG9uIGFuIEFHUCBidWZmZXIuIER1ZSB0byBjYWNoZSBwcm9ibGVtcyBpdCB3aWxsCisgKiBiZSB2ZXJ5IHNsb3cuCisgKi8KKworCisjaW5jbHVkZSAidmlhXzNkX3JlZy5oIgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX3ZlcmlmaWVyLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCit0eXBlZGVmIGVudW17CisJc3RhdGVfY29tbWFuZCwKKwlzdGF0ZV9oZWFkZXIyLAorCXN0YXRlX2hlYWRlcjEsCisJc3RhdGVfdmhlYWRlcjUsCisJc3RhdGVfdmhlYWRlcjYsCisJc3RhdGVfZXJyb3IKK30gdmVyaWZpZXJfc3RhdGVfdDsKKworCit0eXBlZGVmIGVudW17CisJbm9fY2hlY2sgPSAwLAorCWNoZWNrX2Zvcl9oZWFkZXIyLAorCWNoZWNrX2Zvcl9oZWFkZXIxLAorCWNoZWNrX2Zvcl9oZWFkZXIyX2VyciwKKwljaGVja19mb3JfaGVhZGVyMV9lcnIsCisJY2hlY2tfZm9yX2ZpcmUsCisJY2hlY2tfel9idWZmZXJfYWRkcjAsCisJY2hlY2tfel9idWZmZXJfYWRkcjEsCisJY2hlY2tfel9idWZmZXJfYWRkcl9tb2RlLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIwLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIxLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHJfbW9kZSwKKwljaGVja19mb3JfZHVtbXksCisJY2hlY2tfZm9yX2RkLAorCWNoZWNrX3RleHR1cmVfYWRkcjAsCisJY2hlY2tfdGV4dHVyZV9hZGRyMSwKKwljaGVja190ZXh0dXJlX2FkZHIyLAorCWNoZWNrX3RleHR1cmVfYWRkcjMsCisJY2hlY2tfdGV4dHVyZV9hZGRyNCwKKwljaGVja190ZXh0dXJlX2FkZHI1LAorCWNoZWNrX3RleHR1cmVfYWRkcjYsCisJY2hlY2tfdGV4dHVyZV9hZGRyNywKKwljaGVja190ZXh0dXJlX2FkZHI4LAorCWNoZWNrX3RleHR1cmVfYWRkcl9tb2RlLAorCWNoZWNrX2Zvcl92ZXJ0ZXhfY291bnQsCisJY2hlY2tfbnVtYmVyX3RleHVuaXRzLAorCWZvcmJpZGRlbl9jb21tYW5kCit9aGF6YXJkX3Q7CisKKy8qCisgKiBBc3NvY2lhdGVzIGVhY2ggaGF6YXJkIGFib3ZlIHdpdGggYSBwb3NzaWJsZSBtdWx0aS1jb21tYW5kCisgKiBzZXF1ZW5jZS4gRm9yIGV4YW1wbGUgYW4gYWRkcmVzcyB0aGF0IGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUKKyAqIGNvbW1hbmRzIGFuZCB0aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQgYXQgdGhlIGZpcnN0IGNvbW1hbmQgCisgKiB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYW55IHBhcnQgb2YgdGhlIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGRybV92aWFfc2VxdWVuY2VfdCBzZXFzW10gPSB7IAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCXpfYWRkcmVzcywKKwl6X2FkZHJlc3MsCisJel9hZGRyZXNzLAorCWRlc3RfYWRkcmVzcywKKwlkZXN0X2FkZHJlc3MsCisJZGVzdF9hZGRyZXNzLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCW5vX3NlcXVlbmNlCit9OworICAgIAordHlwZWRlZiBzdHJ1Y3R7CisJdW5zaWduZWQgaW50IGNvZGU7CisJaGF6YXJkX3QgaHo7Cit9IGh6X2luaXRfdDsKKworCisKK3N0YXRpYyBoel9pbml0X3QgaW5pdF90YWJsZTFbXSA9IHsKKwl7MHhmMiwgY2hlY2tfZm9yX2hlYWRlcjJfZXJyfSwKKwl7MHhmMCwgY2hlY2tfZm9yX2hlYWRlcjFfZXJyfSwKKwl7MHhlZSwgY2hlY2tfZm9yX2ZpcmV9LAorCXsweGNjLCBjaGVja19mb3JfZHVtbXl9LAorCXsweGRkLCBjaGVja19mb3JfZGR9LAorCXsweDAwLCBub19jaGVja30sCisJezB4MTAsIGNoZWNrX3pfYnVmZmVyX2FkZHIwfSwKKwl7MHgxMSwgY2hlY2tfel9idWZmZXJfYWRkcjF9LAorCXsweDEyLCBjaGVja196X2J1ZmZlcl9hZGRyX21vZGV9LAorCXsweDEzLCBub19jaGVja30sCisJezB4MTQsIG5vX2NoZWNrfSwKKwl7MHgxNSwgbm9fY2hlY2t9LAorCXsweDIzLCBub19jaGVja30sCisJezB4MjQsIG5vX2NoZWNrfSwKKwl7MHgzMywgbm9fY2hlY2t9LAorCXsweDM0LCBub19jaGVja30sCisJezB4MzUsIG5vX2NoZWNrfSwKKwl7MHgzNiwgbm9fY2hlY2t9LAorCXsweDM3LCBub19jaGVja30sCisJezB4MzgsIG5vX2NoZWNrfSwKKwl7MHgzOSwgbm9fY2hlY2t9LAorCXsweDNBLCBub19jaGVja30sCisJezB4M0IsIG5vX2NoZWNrfSwKKwl7MHgzQywgbm9fY2hlY2t9LAorCXsweDNELCBub19jaGVja30sCisJezB4M0UsIG5vX2NoZWNrfSwKKwl7MHg0MCwgY2hlY2tfZGVzdGluYXRpb25fYWRkcjB9LAorCXsweDQxLCBjaGVja19kZXN0aW5hdGlvbl9hZGRyMX0sCisJezB4NDIsIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHJfbW9kZX0sCisJezB4NDMsIG5vX2NoZWNrfSwKKwl7MHg0NCwgbm9fY2hlY2t9LAorCXsweDUwLCBub19jaGVja30sCisJezB4NTEsIG5vX2NoZWNrfSwKKwl7MHg1Miwgbm9fY2hlY2t9LAorCXsweDUzLCBub19jaGVja30sCisJezB4NTQsIG5vX2NoZWNrfSwKKwl7MHg1NSwgbm9fY2hlY2t9LAorCXsweDU2LCBub19jaGVja30sCisJezB4NTcsIG5vX2NoZWNrfSwKKwl7MHg1OCwgbm9fY2hlY2t9LAorCXsweDcwLCBub19jaGVja30sCisJezB4NzEsIG5vX2NoZWNrfSwKKwl7MHg3OCwgbm9fY2hlY2t9LAorCXsweDc5LCBub19jaGVja30sCisJezB4N0EsIG5vX2NoZWNrfSwKKwl7MHg3Qiwgbm9fY2hlY2t9LAorCXsweDdDLCBub19jaGVja30sCisJezB4N0QsIGNoZWNrX2Zvcl92ZXJ0ZXhfY291bnR9Cit9OworCisgICAKKwkJICAgICAgIAorc3RhdGljIGh6X2luaXRfdCBpbml0X3RhYmxlMltdID0geworCXsweGYyLCBjaGVja19mb3JfaGVhZGVyMl9lcnJ9LAorCXsweGYwLCBjaGVja19mb3JfaGVhZGVyMV9lcnJ9LAorCXsweGVlLCBjaGVja19mb3JfZmlyZX0sCisJezB4Y2MsIGNoZWNrX2Zvcl9kdW1teX0sCisJezB4MDAsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDAxLCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwMiwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDMsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA0LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwNSwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDYsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA3LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwOCwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDksIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDIwLCBjaGVja190ZXh0dXJlX2FkZHIxfSwKKwl7MHgyMSwgY2hlY2tfdGV4dHVyZV9hZGRyMX0sCisJezB4MjIsIGNoZWNrX3RleHR1cmVfYWRkcjF9LAorCXsweDIzLCBjaGVja190ZXh0dXJlX2FkZHI0fSwKKwl7MHgyQiwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MkMsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDJELCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgyRSwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MkYsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDMwLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzMSwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MzIsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDMzLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzNCwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4NEIsIGNoZWNrX3RleHR1cmVfYWRkcjV9LAorCXsweDRDLCBjaGVja190ZXh0dXJlX2FkZHI2fSwKKwl7MHg1MSwgY2hlY2tfdGV4dHVyZV9hZGRyN30sCisJezB4NTIsIGNoZWNrX3RleHR1cmVfYWRkcjh9LAorCXsweDc3LCBjaGVja190ZXh0dXJlX2FkZHIyfSwKKwl7MHg3OCwgbm9fY2hlY2t9LAorCXsweDc5LCBub19jaGVja30sCisJezB4N0EsIG5vX2NoZWNrfSwKKwl7MHg3QiwgY2hlY2tfdGV4dHVyZV9hZGRyX21vZGV9LAorCXsweDdDLCBub19jaGVja30sCisJezB4N0QsIG5vX2NoZWNrfSwKKwl7MHg3RSwgbm9fY2hlY2t9LAorCXsweDdGLCBub19jaGVja30sCisJezB4ODAsIG5vX2NoZWNrfSwKKwl7MHg4MSwgbm9fY2hlY2t9LAorCXsweDgyLCBub19jaGVja30sCisJezB4ODMsIG5vX2NoZWNrfSwKKwl7MHg4NSwgbm9fY2hlY2t9LAorCXsweDg2LCBub19jaGVja30sCisJezB4ODcsIG5vX2NoZWNrfSwKKwl7MHg4OCwgbm9fY2hlY2t9LAorCXsweDg5LCBub19jaGVja30sCisJezB4OEEsIG5vX2NoZWNrfSwKKwl7MHg5MCwgbm9fY2hlY2t9LAorCXsweDkxLCBub19jaGVja30sCisJezB4OTIsIG5vX2NoZWNrfSwKKwl7MHg5Mywgbm9fY2hlY2t9Cit9OworCitzdGF0aWMgaHpfaW5pdF90IGluaXRfdGFibGUzW10gPSB7CisJezB4ZjIsIGNoZWNrX2Zvcl9oZWFkZXIyX2Vycn0sCisJezB4ZjAsIGNoZWNrX2Zvcl9oZWFkZXIxX2Vycn0sCisJezB4Y2MsIGNoZWNrX2Zvcl9kdW1teX0sCisJezB4MDAsIGNoZWNrX251bWJlcl90ZXh1bml0c30KK307CisgICAKKwkJICAgICAgIAorc3RhdGljIGhhemFyZF90IHRhYmxlMVsyNTZdOyAKK3N0YXRpYyBoYXphcmRfdCB0YWJsZTJbMjU2XTsgCitzdGF0aWMgaGF6YXJkX3QgdGFibGUzWzI1Nl07IAorCisKKworc3RhdGljIF9faW5saW5lX18gaW50CitlYXRfd29yZHMoY29uc3QgdWludDMyX3QgKipidWYsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kLCB1bnNpZ25lZCBudW1fd29yZHMpCit7CisJaWYgKCgqYnVmIC0gYnVmX2VuZCkgPj0gbnVtX3dvcmRzKSB7CisJCSpidWYgKz0gbnVtX3dvcmRzOworCQlyZXR1cm4gMDsKKwl9IAorCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiBETUEgY29tbWFuZCBidWZmZXJcbiIpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBQYXJ0aWFsbHkgc3RvbGVuIGZyb20gZHJtX21lbW9yeS5oCisgKi8KKworc3RhdGljIF9faW5saW5lX18gZHJtX21hcF90ICoKK3ZpYV9kcm1fbG9va3VwX2FncF9tYXAgKGRybV92aWFfc3RhdGVfdCAqc2VxLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCAKKwkJCWRybV9kZXZpY2VfdCAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlkcm1fbWFwX3QgKm1hcCA9IHNlcS0+bWFwX2NhY2hlOworCisJaWYgKG1hcCAmJiBtYXAtPm9mZnNldCA8PSBvZmZzZXQgJiYgKG9mZnNldCArIHNpemUpIDw9IChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSkpIHsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCQorCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKikgbGlzdDsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKQorCQkJY29udGludWU7CisJCWlmIChtYXAtPm9mZnNldCA8PSBvZmZzZXQgJiYgKG9mZnNldCArIHNpemUpIDw9IChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSkgJiYgCisJCSAgICAhKG1hcC0+ZmxhZ3MgJiBfRFJNX1JFU1RSSUNURUQpICYmIChtYXAtPnR5cGUgPT0gX0RSTV9BR1ApKSB7CisJCQlzZXEtPm1hcF9jYWNoZSA9IG1hcDsKKwkJCXJldHVybiBtYXA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFJlcXVpcmUgdGhhdCBhbGwgQUdQIHRleHR1cmUgbGV2ZWxzIHJlc2lkZSBpbiB0aGUgc2FtZSBBR1AgbWFwIHdoaWNoIHNob3VsZCAKKyAqIGJlIG1hcHBhYmxlIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgbm90IGEgYmlnIHJlc3RyaWN0aW9uLgorICogRklYTUU6IFRvIGFjdHVhbGx5IGVuZm9yY2UgdGhpcyBzZWN1cml0eSBwb2xpY3kgc3RyaWN0bHksIGRybV9ybW1hcCAKKyAqIHdvdWxkIGhhdmUgdG8gd2FpdCBmb3IgZG1hIHF1aWVzY2VudCBiZWZvcmUgcmVtb3ZpbmcgYW4gQUdQIG1hcC4gCisgKiBUaGUgdmlhX2RybV9sb29rdXBfYWdwX21hcCBjYWxsIGluIHJlYWxpdHkgc2VlbXMgdG8gdGFrZQorICogdmVyeSBsaXR0bGUgQ1BVIHRpbWUuCisgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2ZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkgCit7CisJc3dpdGNoKGN1cl9zZXEtPnVuZmluaXNoZWQpIHsKKwljYXNlIHpfYWRkcmVzczoKKwkJRFJNX0RFQlVHKCJaIEJ1ZmZlciBzdGFydCBhZGRyZXNzIGlzIDB4JXhcbiIsIGN1cl9zZXEtPnpfYWRkcik7CisJCWJyZWFrOworCWNhc2UgZGVzdF9hZGRyZXNzOgorCQlEUk1fREVCVUcoIkRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3MgaXMgMHgleFxuIiwgY3VyX3NlcS0+ZF9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSB0ZXhfYWRkcmVzczoKKwkJaWYgKGN1cl9zZXEtPmFncF90ZXh0dXJlKSB7CQkJIAorCQkJdW5zaWduZWQgc3RhcnQgPSBjdXJfc2VxLT50ZXhfbGV2ZWxfbG9bY3VyX3NlcS0+dGV4dHVyZV07CisJCQl1bnNpZ25lZCBlbmQgPSBjdXJfc2VxLT50ZXhfbGV2ZWxfaGlbY3VyX3NlcS0+dGV4dHVyZV07CisJCQl1bnNpZ25lZCBsb25nIGxvPX4wLCBoaT0wLCB0bXA7CisJCQl1aW50MzJfdCAqYWRkciwgKnBpdGNoLCAqaGVpZ2h0LCB0ZXg7CisJCQl1bnNpZ25lZCBpOworCisJCQlpZiAoZW5kID4gOSkgZW5kID0gOTsKKwkJCWlmIChzdGFydCA+IDkpIHN0YXJ0ID0gOTsKKworCQkJYWRkciA9JihjdXJfc2VxLT50X2FkZHJbdGV4ID0gY3VyX3NlcS0+dGV4dHVyZV1bc3RhcnRdKTsKKwkJCXBpdGNoID0gJihjdXJfc2VxLT5waXRjaFt0ZXhdW3N0YXJ0XSk7CisJCQloZWlnaHQgPSAmKGN1cl9zZXEtPmhlaWdodFt0ZXhdW3N0YXJ0XSk7CisKKwkJCWZvciAoaT1zdGFydDsgaTw9IGVuZDsgKytpKSB7CisJCQkJdG1wID0gKmFkZHIrKzsKKwkJCQlpZiAodG1wIDwgbG8pIGxvID0gdG1wOworCQkJCXRtcCArPSAoKmhlaWdodCsrIDw8ICpwaXRjaCsrKTsKKwkJCQlpZiAodG1wID4gaGkpIGhpID0gdG1wOworCQkJfQorCisJCQlpZiAoISB2aWFfZHJtX2xvb2t1cF9hZ3BfbWFwIChjdXJfc2VxLCBsbywgaGkgLSBsbywgY3VyX3NlcS0+ZGV2KSkgeworCQkJCURSTV9FUlJPUigiQUdQIHRleHR1cmUgaXMgbm90IGluIGFsbG93ZWQgbWFwXG4iKTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWN1cl9zZXEtPnVuZmluaXNoZWQgPSBub19zZXF1ZW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IAoraW52ZXN0aWdhdGVfaGF6YXJkKCB1aW50MzJfdCBjbWQsIGhhemFyZF90IGh6LCBkcm1fdmlhX3N0YXRlX3QgKmN1cl9zZXEpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgdG1wLCAqdG1wX2FkZHI7CisKKwlpZiAoY3VyX3NlcS0+dW5maW5pc2hlZCAmJiAoY3VyX3NlcS0+dW5maW5pc2hlZCAhPSBzZXFzW2h6XSkpIHsKKwkJaW50IHJldDsKKwkJaWYgKChyZXQgPSBmaW5pc2hfY3VycmVudF9zZXF1ZW5jZShjdXJfc2VxKSkpIHJldHVybiByZXQ7CisJfQorCisJc3dpdGNoKGh6KSB7CisJY2FzZSBjaGVja19mb3JfaGVhZGVyMjoKKwkJaWYgKGNtZCA9PSBIQUxDWU9OX0hFQURFUjIpIHJldHVybiAxOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Zvcl9oZWFkZXIxOgorCQlpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSkgcmV0dXJuIDE7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfZm9yX2hlYWRlcjJfZXJyOgorCQlpZiAoY21kID09IEhBTENZT05fSEVBREVSMikgcmV0dXJuIDE7CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgSEFMQ1lPTl9IRUFERVIyIGNvbW1hbmRcbiIpOworCQlicmVhazsKKwljYXNlIGNoZWNrX2Zvcl9oZWFkZXIxX2VycjoKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSA9PSBIQUxDWU9OX0hFQURFUjEpIHJldHVybiAxOworCQlEUk1fRVJST1IoIklsbGVnYWwgRE1BIEhBTENZT05fSEVBREVSMSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja19mb3JfZmlyZToKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0ZJUkVNQVNLKSA9PSBIQUxDWU9OX0ZJUkVDTUQpIHJldHVybiAxOyAKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBIQUxDWU9OX0ZJUkVDTUQgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfZm9yX2R1bW15OgorCQlpZiAoSENfRFVNTVkgPT0gY21kKSByZXR1cm4gMDsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBIQ19EVU1NWSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja19mb3JfZGQ6CisJCWlmICgweGRkZGRkZGRkID09IGNtZCkgcmV0dXJuIDA7CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgMHhkZGRkZGRkZCBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja196X2J1ZmZlcl9hZGRyMDoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJY3VyX3NlcS0+el9hZGRyID0gKGN1cl9zZXEtPnpfYWRkciAmIDB4RkYwMDAwMDApIHwKKwkJCShjbWQgJiAweDAwRkZGRkZGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja196X2J1ZmZlcl9hZGRyMToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJY3VyX3NlcS0+el9hZGRyID0gKGN1cl9zZXEtPnpfYWRkciAmIDB4MDBGRkZGRkYpIHwKKwkJCSgoY21kICYgMHhGRikgPDwgMjQpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3pfYnVmZmVyX2FkZHJfbW9kZToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJaWYgKChjbWQgJiAweDAwMDBDMDAwKSA9PSAwKSByZXR1cm4gMDsKKwkJRFJNX0VSUk9SKCJBdHRlbXB0IHRvIHBsYWNlIFogYnVmZmVyIGluIHN5c3RlbSBtZW1vcnlcbiIpOworCQlyZXR1cm4gMjsKKwljYXNlIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIwOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQljdXJfc2VxLT5kX2FkZHIgPSAoY3VyX3NlcS0+ZF9hZGRyICYgMHhGRjAwMDAwMCkgfAorCQkJKGNtZCAmIDB4MDBGRkZGRkYpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIxOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQljdXJfc2VxLT5kX2FkZHIgPSAoY3VyX3NlcS0+ZF9hZGRyICYgMHgwMEZGRkZGRikgfAorCQkJKChjbWQgJiAweEZGKSA8PCAyNCk7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfZGVzdGluYXRpb25fYWRkcl9tb2RlOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQlpZiAoKGNtZCAmIDB4MDAwMEMwMDApID09IDApIHJldHVybiAwOworCQlEUk1fRVJST1IoIkF0dGVtcHQgdG8gcGxhY2UgM0QgZHJhd2luZyBidWZmZXIgaW4gc3lzdGVtIG1lbW9yeVxuIik7CisJCXJldHVybiAyOwkgICAgCisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIwOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcCA9IChjbWQgPj4gMjQpOworCQl0bXBfYWRkciA9ICZjdXJfc2VxLT50X2FkZHJbY3VyX3NlcS0+dGV4dHVyZV1bdG1wXTsKKwkJKnRtcF9hZGRyID0gKCp0bXBfYWRkciAmIDB4RkYwMDAwMDApIHwgKGNtZCAmIDB4MDBGRkZGRkYpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjE6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wID0gKChjbWQgPj4gMjQpIC0gMHgyMCk7CisJCXRtcCArPSB0bXAgPDwgMTsKKwkJdG1wX2FkZHIgPSAmY3VyX3NlcS0+dF9hZGRyW2N1cl9zZXEtPnRleHR1cmVdW3RtcF07CisJCSp0bXBfYWRkciA9ICgqdG1wX2FkZHIgJiAweDAwRkZGRkZGKSB8ICgoY21kICYgMHhGRikgPDwgMjQpOworCQl0bXBfYWRkcisrOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYwMCkgPDwgMTYpOworCQl0bXBfYWRkcisrOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYwMDAwKSA8PCA4KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIyOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCWN1cl9zZXEtPnRleF9sZXZlbF9sb1t0bXAgPSBjdXJfc2VxLT50ZXh0dXJlXSA9IGNtZCAmIDB4M0Y7CisJCWN1cl9zZXEtPnRleF9sZXZlbF9oaVt0bXBdID0gKGNtZCAmIDB4RkMwKSA+PiA2OworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjM6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wID0gKChjbWQgPj4gMjQpIC0gMHgyQik7CisJCWN1cl9zZXEtPnBpdGNoW2N1cl9zZXEtPnRleHR1cmVdW3RtcF0gPSAoY21kICYgMHgwMEYwMDAwMCkgPj4gMjA7CisJCWlmICghdG1wICYmIChjbWQgJiAweDAwMEZGRkZGKSkgeworCQkJRFJNX0VSUk9SKCJVbmltcGxlbWVudGVkIHRleHR1cmUgbGV2ZWwgMCBwaXRjaCBtb2RlLlxuIik7CisJCQlyZXR1cm4gMjsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjQ6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wX2FkZHIgPSAmY3VyX3NlcS0+dF9hZGRyW2N1cl9zZXEtPnRleHR1cmVdWzldOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYpIDw8IDI0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI1OgorCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyNjoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHRleF9hZGRyZXNzOworCQkvKgorCQkgKiBUZXh0dXJlIHdpZHRoLiBXZSBkb24ndCBjYXJlIHNpbmNlIHdlIGhhdmUgdGhlIHBpdGNoLgorCQkgKi8gIAorCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjc6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wX2FkZHIgPSAmKGN1cl9zZXEtPmhlaWdodFtjdXJfc2VxLT50ZXh0dXJlXVswXSk7CisJCXRtcF9hZGRyWzVdID0gMSA8PCAoKGNtZCAmIDB4MDBGMDAwMDApID4+IDIwKTsKKwkJdG1wX2FkZHJbNF0gPSAxIDw8ICgoY21kICYgMHgwMDBGMDAwMCkgPj4gMTYpOworCQl0bXBfYWRkclszXSA9IDEgPDwgKChjbWQgJiAweDAwMDBGMDAwKSA+PiAxMik7CisJCXRtcF9hZGRyWzJdID0gMSA8PCAoKGNtZCAmIDB4MDAwMDBGMDApID4+IDgpOworCQl0bXBfYWRkclsxXSA9IDEgPDwgKChjbWQgJiAweDAwMDAwMEYwKSA+PiA0KTsKKwkJdG1wX2FkZHJbMF0gPSAxIDw8IChjbWQgJiAweDAwMDAwMDBGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI4OgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcF9hZGRyID0gJihjdXJfc2VxLT5oZWlnaHRbY3VyX3NlcS0+dGV4dHVyZV1bMF0pOworCQl0bXBfYWRkcls5XSA9IDEgPDwgKChjbWQgJiAweDAwMDBGMDAwKSA+PiAxMik7CisJICAgICAgICB0bXBfYWRkcls4XSA9IDEgPDwgKChjbWQgJiAweDAwMDAwRjAwKSA+PiA4KTsKKwkJdG1wX2FkZHJbN10gPSAxIDw8ICgoY21kICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJCXRtcF9hZGRyWzZdID0gMSA8PCAoY21kICYgMHgwMDAwMDAwRik7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyX21vZGU6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJaWYgKCAyID09ICh0bXAgPSBjbWQgJiAweDAwMDAwMDAzKSkgeworCQkJRFJNX0VSUk9SKCJBdHRlbXB0IHRvIGZldGNoIHRleHR1cmUgZnJvbSBzeXN0ZW0gbWVtb3J5LlxuIik7IAorCQkJcmV0dXJuIDI7CisJCX0KKwkJY3VyX3NlcS0+YWdwX3RleHR1cmUgPSAodG1wID09IDMpOworCQljdXJfc2VxLT50ZXhfcGFsZXR0ZV9zaXplW2N1cl9zZXEtPnRleHR1cmVdID0gCisJCQkoY21kID4+IDE2KSAmIDB4MDAwMDAwMDA3OworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Zvcl92ZXJ0ZXhfY291bnQ6CisJCWN1cl9zZXEtPnZlcnRleF9jb3VudCA9IGNtZCAmIDB4MDAwMEZGRkY7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfbnVtYmVyX3RleHVuaXRzOgorCSAgICAgICAgY3VyX3NlcS0+bXVsdGl0ZXggPSAoY21kID4+IDMpICYgMTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBkYXRhOiAweCV4XG4iLCBjbWQpOworCQlyZXR1cm4gMjsKKwl9CisJcmV0dXJuIDI7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gaW50Cit2aWFfY2hlY2tfcHJpbV9saXN0KHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwKKwkJICAgIGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgY3VyX3NlcS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBhX2ZpcmUsIGJjbWQgLCBkd19jb3VudDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaGF2ZV9maXJlOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworCSAgICAgICAgaGF2ZV9maXJlID0gMDsKKwkJaWYgKChidWZfZW5kIC0gYnVmKSA8IDIpIHsKKwkJCURSTV9FUlJPUigiVW5leHBlY3RlZCB0ZXJtaW5hdGlvbiBvZiBwcmltaXRpdmUgbGlzdC5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoKmJ1ZiAmIEhDX0FDTURfTUFTSykgIT0gSENfQUNNRF9IQ21kQikgYnJlYWs7CisJCWJjbWQgPSAqYnVmKys7CisJCWlmICgoKmJ1ZiAmIEhDX0FDTURfTUFTSykgIT0gSENfQUNNRF9IQ21kQSkgeworCQkJRFJNX0VSUk9SKCJFeHBlY3RlZCBWZXJ0ZXggTGlzdCBBIGNvbW1hbmQsIGdvdCAweCV4XG4iLAorCQkJCSAgKmJ1Zik7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYV9maXJlID0gKmJ1ZisrIHwgSENfSFBMRU5EX01BU0sgfCBIQ19IUE1WYWxpZE5fTUFTSyB8IEhDX0hFM0ZpcmVfTUFTSzsJCisJCisJCS8qCisJCSAqIEhvdyBtYW55IGR3b3JkcyBwZXIgdmVydGV4ID8KKwkJICovIAorCQkKKwkJaWYgKGN1cl9zZXEtPmFncCAmJiAoKGJjbWQgJiAoMHhGIDw8IDExKSkgPT0gMCkpIHsKKwkJCURSTV9FUlJPUigiSWxsZWdhbCBCIGNvbW1hbmQgdmVydGV4IGRhdGEgZm9yIEFHUC5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9IAorCisJCWR3X2NvdW50ID0gMDsKKwkJaWYgKGJjbWQgJiAoMSA8PCA3KSkgZHdfY291bnQgKz0gKGN1cl9zZXEtPm11bHRpdGV4KSA/IDI6MTsKKwkJaWYgKGJjbWQgJiAoMSA8PCA4KSkgZHdfY291bnQgKz0gKGN1cl9zZXEtPm11bHRpdGV4KSA/IDI6MTsKKwkJaWYgKGJjbWQgJiAoMSA8PCA5KSkgZHdfY291bnQrKzsKKwkJaWYgKGJjbWQgJiAoMSA8PCAxMCkpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTEpKSBkd19jb3VudCsrOworCQlpZiAoYmNtZCAmICgxIDw8IDEyKSkgZHdfY291bnQrKzsKKwkJaWYgKGJjbWQgJiAoMSA8PCAxMykpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTQpKSBkd19jb3VudCsrOworCisJCXdoaWxlKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkJCWlmICgqYnVmID09IGFfZmlyZSkgeworCQkJCWlmIChkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cyA+PSBWSUFfRklSRV9CVUZfU0laRSkgeworCQkJCQlEUk1fRVJST1IoIkZpcmUgb2Zmc2V0IGJ1ZmZlciBmdWxsLlxuIik7CisJCQkJCXJldCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZXZfcHJpdi0+ZmlyZV9vZmZzZXRzW2Rldl9wcml2LT5udW1fZmlyZV9vZmZzZXRzKytdID0gYnVmOworCQkJICAgICAgICBoYXZlX2ZpcmUgPSAxOworCQkJCWJ1ZisrOworCQkJCWlmIChidWYgPCBidWZfZW5kICYmICpidWYgPT0gYV9maXJlKSAKKwkJCQkJYnVmKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKCpidWYgPT0gSEFMQ1lPTl9IRUFERVIyKSB8fCAKKwkJCSAgICAoKCpidWYgJiBIQUxDWU9OX0ZJUkVNQVNLKSA9PSBIQUxDWU9OX0ZJUkVDTUQpKSB7CisJCQkJRFJNX0VSUk9SKCJNaXNzaW5nIFZlcnRleCBGaXJlIGNvbW1hbmQsICIKKwkJCQkJICAiU3RyYXkgVmVydGV4IEZpcmUgY29tbWFuZCAgb3IgdmVyaWZpZXIgIgorCQkJCQkgICJsb3N0IHN5bmMuXG4iKTsKKwkJCQlyZXQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChyZXQgPSBlYXRfd29yZHMoJmJ1ZiwgYnVmX2VuZCwgZHdfY291bnQpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmID49IGJ1Zl9lbmQgJiYgIWhhdmVfZmlyZSkgeworCQkJRFJNX0VSUk9SKCJNaXNzaW5nIFZlcnRleCBGaXJlIGNvbW1hbmQgb3IgdmVyaWZpZXIgIgorCQkJCSAgImxvc3Qgc3luYy5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjdXJfc2VxLT5hZ3AgJiYgKChidWYgLSBjdXJfc2VxLT5idWZfc3RhcnQpICYgMHgwMSkpIHsKKwkJCURSTV9FUlJPUigiQUdQIFByaW1pdGl2ZSBsaXN0IGVuZCBtaXNhbGlnbmVkLlxuIik7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IAorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHJldDsKK30KKworCisJCSAgICAgICAKKworCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfaGVhZGVyMiggdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kLCAKKwkJICAgZHJtX3ZpYV9zdGF0ZV90ICpoY19zdGF0ZSkKK3sKKwl1aW50MzJfdCBjbWQ7CisJaW50IGh6X21vZGU7CisJaGF6YXJkX3QgaHo7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJY29uc3QgaGF6YXJkX3QgKmh6X3RhYmxlOworCisKKwlpZiAoKGJ1Zl9lbmQgLSBidWYpIDwgMikgeworCQlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgRE1BIEhBTENZT05fSEVBREVSMiBzZXF1ZW5jZS5cbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWJ1ZisrOworCWNtZCA9ICgqYnVmKysgJiAweEZGRkYwMDAwKSA+PiAxNjsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIEhDX1BhcmFUeXBlX0NtZFZkYXRhOgorCQlpZiAodmlhX2NoZWNrX3ByaW1fbGlzdCgmYnVmLCBidWZfZW5kLCBoY19zdGF0ZSApKSAKKwkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJKmJ1ZmZlciA9IGJ1ZjsKKwkJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7CisJY2FzZSBIQ19QYXJhVHlwZV9Ob3RUZXg6CisJCWh6X3RhYmxlID0gdGFibGUxOworCQlicmVhazsKKwljYXNlIEhDX1BhcmFUeXBlX1RleDoKKwkJaGNfc3RhdGUtPnRleHR1cmUgPSAwOworCQloel90YWJsZSA9IHRhYmxlMjsKKwkJYnJlYWs7CisJY2FzZSAoSENfUGFyYVR5cGVfVGV4IHwgKEhDX1N1YlR5cGVfVGV4MSA8PCA4KSk6CisJCWhjX3N0YXRlLT50ZXh0dXJlID0gMTsKKwkJaHpfdGFibGUgPSB0YWJsZTI7CisJCWJyZWFrOworCWNhc2UgKEhDX1BhcmFUeXBlX1RleCB8IChIQ19TdWJUeXBlX1RleEdlbmVyYWwgPDwgOCkpOgorCQloel90YWJsZSA9IHRhYmxlMzsKKwkJYnJlYWs7CisJY2FzZSBIQ19QYXJhVHlwZV9BdXRvOgorCQlpZiAoZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIDIpKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfY29tbWFuZDsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfU3RpcHBsZSA8PCA4KSk6CisJCWlmIChlYXRfd29yZHMoJmJ1ZiwgYnVmX2VuZCwgMzIpKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfY29tbWFuZDsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTAgPDwgOCkpOgorCWNhc2UgKEhDX1BhcmFUeXBlX1BhbGV0dGUgfCAoSENfU3ViVHlwZV9UZXhQYWxldHRlMSA8PCA4KSk6CisJCURSTV9FUlJPUigiVGV4dHVyZSBwYWxldHRlcyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSBvZiAiCisJCQkgICJsYWNrIG9mIGluZm8gaG93IHRvIGRldGVybWluZSB0aGVpciBzaXplLlxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfRm9nVGFibGUgPDwgOCkpOgorCQlEUk1fRVJST1IoIkZvZyBmYWN0b3IgcGFsZXR0ZXMgYXJlIHJlamVjdGVkIGJlY2F1c2Ugb2YgIgorCQkJICAibGFjayBvZiBpbmZvIGhvdyB0byBkZXRlcm1pbmUgdGhlaXIgc2l6ZS5cbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJZGVmYXVsdDoKKworCQkvKgorCQkgKiBUaGVyZSBhcmUgc29tZSB1bmltcGxlbWVudGVkIEhDX1BhcmFUeXBlcyBoZXJlLCB0aGF0CisJCSAqIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgaWYgdGhlIE1lc2EgZHJpdmVyIGlzIGV4dGVuZGVkLgorCQkgKi8KKworCQlEUk1fRVJST1IoIkludmFsaWQgb3IgdW5pbXBsZW1lbnRlZCBIQUxDWU9OX0hFQURFUjIgIgorCQkJICAiRE1BIHN1YmNvbW1hbmQ6IDB4JXguIFByZXZpb3VzIGR3b3JkOiAweCV4XG4iLCAKKwkJCSAgY21kLCAqKGJ1ZiAtMikpOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCisJd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmKys7CisJCWlmICgoaHogPSBoel90YWJsZVtjbWQgPj4gMjRdKSkgeworCQkJaWYgKChoel9tb2RlID0gaW52ZXN0aWdhdGVfaGF6YXJkKGNtZCwgaHosIGhjX3N0YXRlKSkpIHsKKwkJCQlpZiAoaHpfbW9kZSA9PSAxKSB7CisJCQkJCWJ1Zi0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkJfQorCQl9IGVsc2UgaWYgKGhjX3N0YXRlLT51bmZpbmlzaGVkICYmIAorCQkJICAgZmluaXNoX2N1cnJlbnRfc2VxdWVuY2UoaGNfc3RhdGUpKSB7CisJCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJCX0KKwl9CisJaWYgKGhjX3N0YXRlLT51bmZpbmlzaGVkICYmIGZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGhjX3N0YXRlKSkgeworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV9oZWFkZXIyKCBkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwKKwkJICAgaW50ICpmaXJlX2NvdW50KQoreworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwljb25zdCB1aW50MzJfdCAqbmV4dF9maXJlOyAKKwlpbnQgYnVyc3QgPSAwOworCisJbmV4dF9maXJlID0gZGV2X3ByaXYtPmZpcmVfb2Zmc2V0c1sqZmlyZV9jb3VudF07CisJYnVmKys7CisJY21kID0gKCpidWYgJiAweEZGRkYwMDAwKSA+PiAxNjsKKwlWSUFfV1JJVEUoSENfUkVHX1RSQU5TX1NFVCArIEhDX1JFR19CQVNFLCAqYnVmKyspOworCXN3aXRjaChjbWQpIHsKKwljYXNlIEhDX1BhcmFUeXBlX0NtZFZkYXRhOgorCQl3aGlsZSAoKGJ1ZiA8IGJ1Zl9lbmQpICYmCisJCSAgICAgICAoKmZpcmVfY291bnQgPCBkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cykgJiYgCisJCSAgICAgICAoKmJ1ZiAmIEhDX0FDTURfTUFTSykgPT0gSENfQUNNRF9IQ21kQiApIHsKKwkJCXdoaWxlKGJ1ZiA8PSBuZXh0X2ZpcmUpIHsKKwkJCQlWSUFfV1JJVEUoSENfUkVHX1RSQU5TX1NQQUNFICsgSENfUkVHX0JBU0UgKyAoYnVyc3QgJiA2MyksICpidWYrKyk7CisJCQkJYnVyc3QgKz0gNDsKKwkJCX0KKwkJCWlmICggKCBidWYgPCBidWZfZW5kICkgJiYgKCgqYnVmICYgSEFMQ1lPTl9GSVJFTUFTSykgPT0gSEFMQ1lPTl9GSVJFQ01EKSkKKwkJCQlidWYrKzsKKworCQkJaWYgKCsrKCpmaXJlX2NvdW50KSA8IGRldl9wcml2LT5udW1fZmlyZV9vZmZzZXRzKSAKKwkJCQluZXh0X2ZpcmUgPSBkZXZfcHJpdi0+ZmlyZV9vZmZzZXRzWypmaXJlX2NvdW50XTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQl3aGlsZShidWYgPCBidWZfZW5kKSB7CisJCQkKKwkJCWlmICggKmJ1ZiA9PSBIQ19IRUFERVIyIHx8CisJCQkgICAgICgqYnVmICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgPT0gSEFMQ1lPTl9IRUFERVIxICB8fAorCQkJICAgICAoKmJ1ZiAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI1IHx8CisJCQkgICAgICgqYnVmICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjYgKSBicmVhazsKKwkJCQorCQkJVklBX1dSSVRFKEhDX1JFR19UUkFOU19TUEFDRSArIEhDX1JFR19CQVNFICsgKGJ1cnN0ICYgNjMpLCAqYnVmKyspOworCQkJYnVyc3QgKz00OworCQl9CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3ZlcmlmeV9tbWlvX2FkZHJlc3MoIHVpbnQzMl90IGFkZHJlc3MpCit7CisJaWYgKChhZGRyZXNzID4gMHgzRkYpICYmIChhZGRyZXNzIDwgMHhDMDAgKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgVklERU8gRE1BIGNvbW1hbmQuICIKKwkJCSAgIkF0dGVtcHQgdG8gYWNjZXNzIDNELSBvciBjb21tYW5kIGJ1cnN0IGFyZWEuXG4iKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmICgoYWRkcmVzcyA+IDB4Q0ZGKSAmJiAoYWRkcmVzcyA8IDB4MTMwMCkpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIFZJREVPIERNQSBjb21tYW5kLiAiCisJCQkgICJBdHRlbXB0IHRvIGFjY2VzcyBQQ0kgRE1BIGFyZWEuXG4iKTsKKwkJcmV0dXJuIDE7CQkKKwl9IGVsc2UgaWYgKGFkZHJlc3MgPiAweDEzRkYgKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBWSURFTyBETUEgY29tbWFuZC4gIgorCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgVkdBIHJlZ2lzdGVycy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAordmVyaWZ5X3ZpZGVvX3RhaWwoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwgdWludDMyX3QgZHdvcmRzKSAKK3sKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKworCWlmIChidWZfZW5kIC0gYnVmIDwgZHdvcmRzKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBjb21tYW5kLlxuIik7CisJCXJldHVybiAxOworCX0KKwl3aGlsZSAoZHdvcmRzLS0pIHsKKwkJaWYgKCpidWYrKykgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIHZpZGVvIGNvbW1hbmQgdGFpbC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gMDsKK30KKwkJCisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9jaGVja19oZWFkZXIxKCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwl2ZXJpZmllcl9zdGF0ZV90IHJldCA9IHN0YXRlX2NvbW1hbmQ7CisKKwl3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmOworCQlpZiAoKGNtZCA+ICgoMHgzRkYgPj4gMikgfCBIQUxDWU9OX0hFQURFUjEpKSAmJgorCQkgICAgKGNtZCA8ICgoMHhDMDAgPj4gMikgfCBIQUxDWU9OX0hFQURFUjEpKSkgewkJCQorCQkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSAhPSBIQUxDWU9OX0hFQURFUjEpIAorCQkJCWJyZWFrOworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIEhBTENZT05fSEVBREVSMSBjb21tYW5kLiAiCisJCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgM0QtIG9yIGNvbW1hbmQgYnVyc3QgYXJlYS5cbiIpOworCQkJcmV0ID0gc3RhdGVfZXJyb3I7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjbWQgPiAoKDB4Q0ZGID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxKSkgeworCQkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSAhPSBIQUxDWU9OX0hFQURFUjEpIAorCQkJCWJyZWFrOworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIEhBTENZT05fSEVBREVSMSBjb21tYW5kLiAiCisJCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgVkdBIHJlZ2lzdGVycy5cbiIpOworCQkJcmV0ID0gc3RhdGVfZXJyb3I7CisJCQlicmVhazsJCQkKKwkJfSBlbHNlIHsJCQkKKwkJCWJ1ZiArPSAyOworCQl9CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX3BhcnNlX2hlYWRlcjEoIGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisKKwl3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmOworCQlpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spICE9IEhBTENZT05fSEVBREVSMSkgYnJlYWs7CisJCVZJQV9XUklURSggKGNtZCAmIH5IQUxDWU9OX0hFQURFUjFNQVNLKSA8PCAyLCAqKytidWYpOyAKKwkJYnVmKys7CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9jaGVja192aGVhZGVyNSggdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKwl1aW50MzJfdCBkYXRhOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJaWYgKGJ1Zl9lbmQgLSBidWYgPCA0KSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBoZWFkZXI1IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCisJZGF0YSA9ICpidWYrKyAmIH5WSUFfVklERU9NQVNLOworCWlmICh2ZXJpZnlfbW1pb19hZGRyZXNzKGRhdGEpKQorCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisKKwlkYXRhID0gKmJ1ZisrOworCWlmICgqYnVmKysgIT0gMHgwMEY1MDAwMCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgaGVhZGVyNSBoZWFkZXIgZGF0YVxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJaWYgKCpidWYrKyAhPSAweDAwMDAwMDAwKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCBoZWFkZXI1IGhlYWRlciBkYXRhXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwlpZiAoZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIGRhdGEpKSAKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCWlmICgoZGF0YSAmIDMpICYmIHZlcmlmeV92aWRlb190YWlsKCZidWYsIGJ1Zl9lbmQsIDQgLSAoZGF0YSAmIDMpKSkgCisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworCSAgICAgICAKK30gCisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV92aGVhZGVyNSggZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworICB1aW50MzJfdCBhZGRyLCBjb3VudCwgaTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwkKKwlhZGRyID0gKmJ1ZisrICYgflZJQV9WSURFT01BU0s7CisJaSA9IGNvdW50ID0gKmJ1ZjsKKwlidWYgKz0gMzsKKwl3aGlsZShpLS0pIHsKKwkJVklBX1dSSVRFKGFkZHIsICpidWYrKyk7CisJfQorCWlmIChjb3VudCAmIDMpIGJ1ZiArPSA0IC0gKGNvdW50ICYgMyk7CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gc3RhdGVfY29tbWFuZDsJICAgICAgIAorfSAKKworCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfdmhlYWRlcjYoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisJdWludDMyX3QgZGF0YTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwl1aW50MzJfdCBpOworCisKKwlpZiAoYnVmX2VuZCAtIGJ1ZiA8IDQpIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIHRlcm1pbmF0aW9uIG9mIHZpZGVvIGhlYWRlcjYgY29tbWFuZFxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJYnVmKys7CisJZGF0YSA9ICpidWYrKzsKKwlpZiAoKmJ1ZisrICE9IDB4MDBGNjAwMDApIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIGhlYWRlcjYgaGVhZGVyIGRhdGFcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWlmICgqYnVmKysgIT0gMHgwMDAwMDAwMCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgaGVhZGVyNiBoZWFkZXIgZGF0YVxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJaWYgKChidWZfZW5kIC0gYnVmKSA8IChkYXRhIDw8IDEpKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBoZWFkZXI2IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWZvciAoaT0wOyBpPGRhdGE7ICsraSkgeworCQlpZiAodmVyaWZ5X21taW9fYWRkcmVzcygqYnVmKyspKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQlidWYrKzsKKwl9CisJZGF0YSA8PD0gMTsKKwlpZiAoKGRhdGEgJiAzKSAmJiB2ZXJpZnlfdmlkZW9fdGFpbCgmYnVmLCBidWZfZW5kLCA0IC0gKGRhdGEgJiAzKSkpCisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfSAKKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX3BhcnNlX3ZoZWFkZXI2KCBkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisKKyAgdWludDMyX3QgYWRkciwgY291bnQsIGk7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisKKwlpID0gY291bnQgPSAqKytidWY7CisJYnVmICs9IDM7CisJd2hpbGUoaS0tKSB7CisJCWFkZHIgPSAqYnVmKys7CisJCVZJQV9XUklURShhZGRyLCAqYnVmKyspOworCX0KKwljb3VudCA8PD0gMTsKKwlpZiAoY291bnQgJiAzKSBidWYgKz0gNCAtIChjb3VudCAmIDMpOworCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9IAorCisKKworaW50IAordmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbShjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICBpbnQgYWdwKQoreworCisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9zdGF0ZV90ICpoY19zdGF0ZSA9ICZkZXZfcHJpdi0+aGNfc3RhdGU7CisJZHJtX3ZpYV9zdGF0ZV90IHNhdmVkX3N0YXRlID0gKmhjX3N0YXRlOworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmX2VuZCA9IGJ1ZiArICggc2l6ZSA+PiAyICk7CisJdmVyaWZpZXJfc3RhdGVfdCBzdGF0ZSA9IHN0YXRlX2NvbW1hbmQ7CisJaW50IHByb19ncm91cF9hID0gZGV2X3ByaXYtPnByb19ncm91cF9hOworCQorCWhjX3N0YXRlLT5kZXYgPSBkZXY7CisJaGNfc3RhdGUtPnVuZmluaXNoZWQgPSBub19zZXF1ZW5jZTsKKwloY19zdGF0ZS0+bWFwX2NhY2hlID0gTlVMTDsKKwloY19zdGF0ZS0+YWdwID0gYWdwOworCWhjX3N0YXRlLT5idWZfc3RhcnQgPSBidWY7CisJZGV2X3ByaXYtPm51bV9maXJlX29mZnNldHMgPSAwOworCisJd2hpbGUgKGJ1ZiA8IGJ1Zl9lbmQpIHsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc3RhdGVfaGVhZGVyMjoKKwkJICBzdGF0ZSA9IHZpYV9jaGVja19oZWFkZXIyKCAmYnVmLCBidWZfZW5kLCBoY19zdGF0ZSApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfaGVhZGVyMToKKwkJCXN0YXRlID0gdmlhX2NoZWNrX2hlYWRlcjEoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI1OgorCQkJc3RhdGUgPSB2aWFfY2hlY2tfdmhlYWRlcjUoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI2OgorCQkJc3RhdGUgPSB2aWFfY2hlY2tfdmhlYWRlcjYoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2NvbW1hbmQ6CisJCQlpZiAoSEFMQ1lPTl9IRUFERVIyID09IChjbWQgPSAqYnVmKSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIyOworCQkJZWxzZSBpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIxOworCQkJZWxzZSBpZiAocHJvX2dyb3VwX2EgJiYgKGNtZCAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI1KQorCQkJCXN0YXRlID0gc3RhdGVfdmhlYWRlcjU7CisJCQllbHNlIGlmIChwcm9fZ3JvdXBfYSAmJiAoY21kICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjYpCisJCQkJc3RhdGUgPSBzdGF0ZV92aGVhZGVyNjsKKwkJCWVsc2UgeworCQkJCURSTV9FUlJPUigiSW52YWxpZCAvIFVuaW1wbGVtZW50ZWQgRE1BIEhFQURFUiBjb21tYW5kLiAweCV4XG4iLAorCQkJCQkgIGNtZCk7CisJCQkJc3RhdGUgPSBzdGF0ZV9lcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2Vycm9yOgorCQlkZWZhdWx0OgorCQkJKmhjX3N0YXRlID0gc2F2ZWRfc3RhdGU7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwkJCQorCQl9CisJfQkKKwlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpIHsKKwkJKmhjX3N0YXRlID0gc2F2ZWRfc3RhdGU7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgCit2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmX2VuZCA9IGJ1ZiArICggc2l6ZSA+PiAyICk7CisJdmVyaWZpZXJfc3RhdGVfdCBzdGF0ZSA9IHN0YXRlX2NvbW1hbmQ7CisJaW50IGZpcmVfY291bnQgPSAwOworCQorCXdoaWxlIChidWYgPCBidWZfZW5kKSB7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHN0YXRlX2hlYWRlcjI6CisJCSAgc3RhdGUgPSB2aWFfcGFyc2VfaGVhZGVyMiggZGV2X3ByaXYsICZidWYsIGJ1Zl9lbmQsICZmaXJlX2NvdW50ICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV9oZWFkZXIxOgorCQkJc3RhdGUgPSB2aWFfcGFyc2VfaGVhZGVyMSggZGV2X3ByaXYsICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI1OgorCQkJc3RhdGUgPSB2aWFfcGFyc2VfdmhlYWRlcjUoIGRldl9wcml2LCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV92aGVhZGVyNjoKKwkJCXN0YXRlID0gdmlhX3BhcnNlX3ZoZWFkZXI2KCBkZXZfcHJpdiwgJmJ1ZiwgYnVmX2VuZCApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfY29tbWFuZDoKKwkJCWlmIChIQUxDWU9OX0hFQURFUjIgPT0gKGNtZCA9ICpidWYpKSAKKwkJCQlzdGF0ZSA9IHN0YXRlX2hlYWRlcjI7CisJCQllbHNlIGlmICgoY21kICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgPT0gSEFMQ1lPTl9IRUFERVIxKSAKKwkJCQlzdGF0ZSA9IHN0YXRlX2hlYWRlcjE7CisJCQllbHNlIGlmICgoY21kICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjUpCisJCQkJc3RhdGUgPSBzdGF0ZV92aGVhZGVyNTsKKwkJCWVsc2UgaWYgKChjbWQgJiBWSUFfVklERU9NQVNLKSA9PSBWSUFfVklERU9fSEVBREVSNikKKwkJCQlzdGF0ZSA9IHN0YXRlX3ZoZWFkZXI2OworCQkJZWxzZSB7CisJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIC8gVW5pbXBsZW1lbnRlZCBETUEgSEVBREVSIGNvbW1hbmQuIDB4JXhcbiIsCisJCQkJCSAgY21kKTsKKwkJCQlzdGF0ZSA9IHN0YXRlX2Vycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfZXJyb3I6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwkJCQorCQl9CisJfQkKKwlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpIHsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCAKK3NldHVwX2hhemFyZF90YWJsZShoel9pbml0X3QgaW5pdF90YWJsZVtdLCBoYXphcmRfdCB0YWJsZVtdLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8MjU2OyArK2kpIHsKKwkJdGFibGVbaV0gPSBmb3JiaWRkZW5fY29tbWFuZDsKKwl9CisKKwlmb3IoaT0wOyBpPHNpemU7ICsraSkgeworCQl0YWJsZVtpbml0X3RhYmxlW2ldLmNvZGVdID0gaW5pdF90YWJsZVtpXS5oejsKKwl9Cit9CisKK3ZvaWQgCit2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKCB2b2lkICkKK3sKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTEsIHRhYmxlMSwgc2l6ZW9mKGluaXRfdGFibGUxKSAvIHNpemVvZihoel9pbml0X3QpKTsKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTIsIHRhYmxlMiwgc2l6ZW9mKGluaXRfdGFibGUyKSAvIHNpemVvZihoel9pbml0X3QpKTsKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTMsIHRhYmxlMywgc2l6ZW9mKGluaXRfdGFibGUzKSAvIHNpemVvZihoel9pbml0X3QpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTEzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBUaGUgVW5pY2hyb21lIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgVU5JQ0hST01FIFBST0pFQ1QsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogVGhvbWFzIEhlbGxzdHL2bSAyMDA0LgorICovCisKKyNpZm5kZWYgX1ZJQV9WRVJJRklFUl9IXworI2RlZmluZSBfVklBX1ZFUklGSUVSX0hfCisKK3R5cGVkZWYgZW51bXsKKwlub19zZXF1ZW5jZSA9IDAsIAorCXpfYWRkcmVzcywKKwlkZXN0X2FkZHJlc3MsCisJdGV4X2FkZHJlc3MKK31kcm1fdmlhX3NlcXVlbmNlX3Q7CisKKworCit0eXBlZGVmIHN0cnVjdHsKKwl1bnNpZ25lZCB0ZXh0dXJlOworCXVpbnQzMl90IHpfYWRkcjsgCisJdWludDMyX3QgZF9hZGRyOyAKKyAgICAgICAgdWludDMyX3QgdF9hZGRyWzJdWzEwXTsKKwl1aW50MzJfdCBwaXRjaFsyXVsxMF07CisJdWludDMyX3QgaGVpZ2h0WzJdWzEwXTsKKwl1aW50MzJfdCB0ZXhfbGV2ZWxfbG9bMl07IAorCXVpbnQzMl90IHRleF9sZXZlbF9oaVsyXTsKKwl1aW50MzJfdCB0ZXhfcGFsZXR0ZV9zaXplWzJdOworCWRybV92aWFfc2VxdWVuY2VfdCB1bmZpbmlzaGVkOworCWludCBhZ3BfdGV4dHVyZTsKKwlpbnQgbXVsdGl0ZXg7CisJZHJtX2RldmljZV90ICpkZXY7CisJZHJtX21hcF90ICptYXBfY2FjaGU7CisJdWludDMyX3QgdmVydGV4X2NvdW50OworCWludCBhZ3A7CisJY29uc3QgdWludDMyX3QgKmJ1Zl9zdGFydDsKK30gZHJtX3ZpYV9zdGF0ZV90OworCitleHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLCAKKwkJCQkgICAgIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgYWdwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92aWRlby5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E2MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IoUyksIEFORC9PUiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFRob21hcyBIZWxsc3Ryb20gMjAwNS4KKyAqCisgKiBWaWRlbyBhbmQgWHZNQyByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisKK3ZvaWQKK3ZpYV9pbml0X2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVklBX05SX1hWTUNfTE9DS1M7ICsraSkgeworCQlEUk1fSU5JVF9XQUlUUVVFVUUoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtpXSkpOworCQlYVk1DTE9DS1BUUihkZXZfcHJpdi0+c2FyZWFfcHJpdiwgaSktPmxvY2sgPSAwOworCX0KK30KKwordm9pZAordmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQoreworfQkKKwordm9pZAordmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2xhdGlsZSBpbnQgKmxvY2s7CisKKwlmb3IgKGk9MDsgaSA8IFZJQV9OUl9YVk1DX0xPQ0tTOyArK2kpIHsKKwkgICAgICAgIGxvY2sgPSAoaW50ICopIFhWTUNMT0NLUFRSKGRldl9wcml2LT5zYXJlYV9wcml2LCBpKTsKKwkJaWYgKCAoX0RSTV9MT0NLSU5HX0NPTlRFWFQoICpsb2NrICkgPT0gY29udGV4dCkpIHsKKwkJCWlmIChfRFJNX0xPQ0tfSVNfSEVMRCggKmxvY2sgKSAmJiAoKmxvY2sgJiBfRFJNX0xPQ0tfQ09OVCkpIHsKKwkJCQlEUk1fV0FLRVVQKCAmKGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2ldKSk7CisJCQl9CisJCQkqbG9jayA9IDA7CisJCX0KKwl9CQorfQkKKworaW50IAordmlhX2RlY29kZXJfZnV0ZXgoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2Z1dGV4X3QgZng7CisJdm9sYXRpbGUgaW50ICpsb2NrOworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfc2FyZWFfdCAqc0FQcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZ4LCAoZHJtX3ZpYV9mdXRleF90ICopIGRhdGEsIHNpemVvZihmeCkpOworCisJaWYgKGZ4LmxvY2sgPiBWSUFfTlJfWFZNQ19MT0NLUykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2NrID0gKGludCAqKVhWTUNMT0NLUFRSKHNBUHJpdiwgZngubG9jayk7CisKKwlzd2l0Y2ggKGZ4LmZ1bmMpIHsKKwljYXNlIFZJQV9GVVRFWF9XQUlUOgorCQlEUk1fV0FJVF9PTihyZXQsIGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2Z4LmxvY2tdLAorCQkJICAgIChmeC5tcyAvIDEwKSAqIChEUk1fSFogLyAxMDApLCAqbG9jayAhPSBmeC52YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgVklBX0ZVVEVYX1dBS0U6CisJCURSTV9XQUtFVVAoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtmeC5sb2NrXSkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKaW5kZXggODhjZDg1OC4uY2RkYjc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQwLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgotI2luY2x1ZGUgPGFzbS92aW8uaD4KIAogI2RlZmluZSBIVkNfTUFKT1IJMjI5CiAjZGVmaW5lIEhWQ19NSU5PUgkwCkBAIC02MSwxNiArNjEsMjEgQEAKICAqLwogI2RlZmluZSBIVkNfQUxMT0NfVFRZX0FEQVBURVJTCTgKIAotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNfZHJpdmVyOwotI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQotc3RhdGljIGludCBzeXNycV9wcmVzc2VkOwotI2VuZGlmCi0KICNkZWZpbmUgTl9PVVRCVUYJMTYKICNkZWZpbmUgTl9JTkJVRgkJMTYKIAogI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCiAKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y190YXNrOworCisvKiBQaWNrcyB1cCBsYXRlIGtpY2tzIGFmdGVyIGxpc3Qgd2FsayBidXQgYmVmb3JlIHNjaGVkdWxlKCkgKi8KK3N0YXRpYyBpbnQgaHZjX2tpY2tlZDsKKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorc3RhdGljIGludCBzeXNycV9wcmVzc2VkOworI2VuZGlmCisKIHN0cnVjdCBodmNfc3RydWN0IHsKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IGluZGV4OwpAQCAtODAsMTEgKzg1LDExIEBACiAJY2hhciBvdXRidWZbTl9PVVRCVUZdIF9fQUxJR05FRF9fOwogCWludCBuX291dGJ1ZjsKIAl1aW50MzJfdCB2dGVybW5vOworCXN0cnVjdCBodl9vcHMgKm9wczsKIAlpbnQgaXJxX3JlcXVlc3RlZDsKIAlpbnQgaXJxOwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOyAvKiByZWYgY291bnQgJiBodmNfc3RydWN0IGxpZmV0aW1lICovCi0Jc3RydWN0IHZpb19kZXYgKnZkZXY7CiB9OwogCiAvKiBkeW5hbWljIGxpc3Qgb2YgaHZjX3N0cnVjdCBpbnN0YW5jZXMgKi8KQEAgLTk3LDQ4ICsxMDIsMTEgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjX3N0cnVjdHNfbG9jayk7CiAKIC8qCi0gKiBJbml0aWFsIGNvbnNvbGUgdnRlcm1ub3MgZm9yIGNvbnNvbGUgQVBJIHVzYWdlIHByaW9yIHRvIGZ1bGwgY29uc29sZQotICogaW5pdGlhbGl6YXRpb24uICBBbnkgdnR5IGFkYXB0ZXIgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgbm90IGhhdmUgdXNhYmxlCi0gKiBjb25zb2xlIGludGVyZmFjZXMgYnV0IGNhbiBzdGlsbCBiZSB1c2VkIGFzIGEgdHR5IGRldmljZS4gIFRoaXMgaGFzIHRvIGJlCi0gKiBzdGF0aWMgYmVjYXVzZSBrbWFsbG9jIHdpbGwgbm90IHdvcmsgZHVyaW5nIGVhcmx5IGNvbnNvbGUgaW5pdC4KKyAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NpZ24gYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAorICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCksIHdoZW4gd2UgY2FuIG5vdCBtYXRjaCBpdCB0bworICogYSBjb25zb2xlIGNhbmlkYXRlIHJlZ2lzdGVyZWQgd2l0aCBodmNfaW5zdGFudGlhdGUoKS4KICAqLwotc3RhdGljIHVpbnQzMl90IHZ0ZXJtbm9zW01BWF9OUl9IVkNfQ09OU09MRVNdOwotCi0vKiBVc2VkIGZvciBhY2NvdW50aW5nIHB1cnBvc2VzICovCi1zdGF0aWMgaW50IG51bV92dGVybXMgPSAwOwotCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpodmNfdGFzazsKLQotLyoKLSAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAotICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCkuCi0gKi8KLXN0YXRpYyBpbnQgaHZjX2NvdW50ID0gLTE7Ci0KLS8qIFBpY2tzIHVwIGxhdGUga2lja3MgYWZ0ZXIgbGlzdCB3YWxrIGJ1dCBiZWZvcmUgc2NoZWR1bGUoKSAqLwotc3RhdGljIGludCBodmNfa2lja2VkOwotCi0vKiBXYWtlIHRoZSBzbGVlcGluZyBraHZjZCAqLwotc3RhdGljIHZvaWQgaHZjX2tpY2sodm9pZCkKLXsKLQlodmNfa2lja2VkID0gMTsKLQl3YWtlX3VwX3Byb2Nlc3MoaHZjX3Rhc2spOwotfQotCi0vKgotICogTk9URTogVGhpcyBBUEkgaXNuJ3QgdXNlZCBpZiB0aGUgY29uc29sZSBhZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHRzLgotICogSW4gdGhpcyBjYXNlIHRoZSBjb25zb2xlIGlzIHBvbGwgZHJpdmVuLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaHZjX2hhbmRsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlodmNfa2ljaygpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgaHZjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlodmNfa2ljaygpOwotfQorc3RhdGljIGludCBsYXN0X2h2YyA9IC0xOwogCiAvKgogICogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGVpdGhlciB0aGUgaHZjX3N0cnVjc3RfbG9jayBvciB0aGUgaHZjX3N0cnVjdApAQCAtMTY4LDYgKzEzNiwxNzggQEAKIAlyZXR1cm4gaHA7CiB9CiAKKworLyoKKyAqIEluaXRpYWwgY29uc29sZSB2dGVybW5vcyBmb3IgY29uc29sZSBBUEkgdXNhZ2UgcHJpb3IgdG8gZnVsbCBjb25zb2xlCisgKiBpbml0aWFsaXphdGlvbi4gIEFueSB2dHkgYWRhcHRlciBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgaGF2ZSB1c2FibGUKKyAqIGNvbnNvbGUgaW50ZXJmYWNlcyBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYXMgYSB0dHkgZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUKKyAqIHN0YXRpYyBiZWNhdXNlIGttYWxsb2Mgd2lsbCBub3Qgd29yayBkdXJpbmcgZWFybHkgY29uc29sZSBpbml0LgorICovCitzdGF0aWMgc3RydWN0IGh2X29wcyAqY29uc19vcHNbTUFYX05SX0hWQ19DT05TT0xFU107CitzdGF0aWMgdWludDMyX3QgdnRlcm1ub3NbTUFYX05SX0hWQ19DT05TT0xFU10gPQorCXtbMCAuLi4gTUFYX05SX0hWQ19DT05TT0xFUyAtIDFdID0gLTF9OworCisvKgorICogQ29uc29sZSBBUElzLCBOT1QgVFRZLiAgVGhlc2UgQVBJcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IHdoZW4KKyAqIGh2Y19jb25zb2xlX3NldHVwKCkgZmluZHMgYWRhcHRlcnMuCisgKi8KKwordm9pZCBodmNfY29uc29sZV9wcmludChzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKmIsIHVuc2lnbmVkIGNvdW50KQoreworCWNoYXIgY1sxNl0gX19BTElHTkVEX187CisJdW5zaWduZWQgaSA9IDAsIG4gPSAwOworCWludCByLCBkb25lY3IgPSAwLCBpbmRleCA9IGNvLT5pbmRleDsKKworCS8qIENvbnNvbGUgYWNjZXNzIGF0dGVtcHQgb3V0c2lkZSBvZiBhY2NlcHRhYmxlIGNvbnNvbGUgcmFuZ2UuICovCisJaWYgKGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybjsKKworCS8qIFRoaXMgY29uc29sZSBhZGFwdGVyIHdhcyByZW1vdmVkIHNvIGl0IGlzIG5vdCB1c2VhYmxlLiAqLworCWlmICh2dGVybW5vc1tpbmRleF0gPCAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7CisJCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgeworCQkJaWYgKGJbbl0gPT0gJ1xuJyAmJiAhZG9uZWNyKSB7CisJCQkJY1tpKytdID0gJ1xyJzsKKwkJCQlkb25lY3IgPSAxOworCQkJfSBlbHNlIHsKKwkJCQljW2krK10gPSBiW24rK107CisJCQkJZG9uZWNyID0gMDsKKwkJCQktLWNvdW50OworCQkJfQorCQl9IGVsc2UgeworCQkJciA9IGNvbnNfb3BzW2luZGV4XS0+cHV0X2NoYXJzKHZ0ZXJtbm9zW2luZGV4XSwgYywgaSk7CisJCQlpZiAociA8IDApIHsKKwkJCQkvKiB0aHJvdyBhd2F5IGNoYXJzIG9uIGVycm9yICovCisJCQkJaSA9IDA7CisJCQl9IGVsc2UgaWYgKHIgPiAwKSB7CisJCQkJaSAtPSByOworCQkJCWlmIChpID4gMCkKKwkJCQkJbWVtbW92ZShjLCBjK3IsIGkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwlpZiAodnRlcm1ub3NbYy0+aW5kZXhdID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBodmNfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJaWYgKGNvLT5pbmRleCA8IDAgfHwgY28tPmluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHZ0ZXJtbm9zW2NvLT5pbmRleF0gPT0gLTEpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0geworCS5uYW1lCQk9ICJodmMiLAorCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gaHZjX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisvKgorICogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAoMSkgd2UgYXJlIGZpcnN0LCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIGFub3RoZXIgZHJpdmVyCisgKiAtLSBpbmRleCB3aWxsIHJlbWFpbiAtMQorICogKDIpIHdlIGFyZSBmaXJzdCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIG5vIGRyaXZlcgorICogLS0gaW5kZXggd2lsbCBiZSBzZXQgdG8gMCwgdGhlbiB3ZSB3aWxsIGZhaWwgc2V0dXAuCisgKiAoMykgIHdlIGFyZSBmaXJzdCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIG91ciBkcml2ZXIKKyAqIC0tIGluZGV4IHdpbGwgYmUgc2V0IHRvIHVzZXIgc3BlY2lmaWVkIGRyaXZlciwgYW5kIHdlIHdpbGwgZmFpbAorICogKDQpIHdlIGFyZSBhZnRlciBkcml2ZXIsIGFuZCB0aGlzIGluaXRjYWxsIHdpbGwgcmVnaXN0ZXIgdXMKKyAqIC0tIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgZHJpdmVyIHRoZW4gdGhlIGNvbnNvbGUgd2lsbCBtYXRjaAorICoKKyAqIE5vdGUgdGhhdCBmb3IgY2FzZXMgMiBhbmQgMywgd2Ugd2lsbCBtYXRjaCBsYXRlciB3aGVuIHRoZSBpbyBkcml2ZXIKKyAqIGNhbGxzIGh2Y19pbnN0YW50aWF0ZSgpIGFuZCBjYWxsIHJlZ2lzdGVyIGFnYWluLgorICovCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodmNfY29uc29sZV9pbml0KTsKKworLyoKKyAqIGh2Y19pbnN0YW50aWF0ZSgpIGlzIGFuIGVhcmx5IGNvbnNvbGUgZGlzY292ZXJ5IG1ldGhvZCB3aGljaCBsb2NhdGVzCisgKiBjb25zb2xlcyAqIHByaW9yIHRvIHRoZSB2aW8gc3Vic3lzdGVtIGRpc2NvdmVyaW5nIHRoZW0uICBIb3RwbHVnZ2VkCisgKiB2dHkgYWRhcHRlcnMgZG8gTk9UIGdldCBhbiBodmNfaW5zdGFudGlhdGUoKSBjYWxsYmFjayBzaW5jZSB0aGV5CisgKiBhcHBlYXIgYWZ0ZXIgZWFybHkgY29uc29sZSBpbml0LgorICovCitpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCwgc3RydWN0IGh2X29wcyAqb3BzKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuIC0xOworCisJaWYgKHZ0ZXJtbm9zW2luZGV4XSAhPSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogbWFrZSBzdXJlIG5vIG5vIHR0eSBoYXMgYmVlbiByZWdpc3RlcmQgaW4gdGhpcyBpbmRleCAqLworCWhwID0gaHZjX2dldF9ieV9pbmRleChpbmRleCk7CisJaWYgKGhwKSB7CisJCWtvYmplY3RfcHV0KCZocC0+a29iaik7CisJCXJldHVybiAtMTsKKwl9CisKKwl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOworCWNvbnNfb3BzW2luZGV4XSA9IG9wczsKKworCS8qIHJlc2VydmUgYWxsIGluZGljZXMgdXB0byBhbmQgaW5jbHVkaW5nIHRoaXMgaW5kZXggKi8KKwlpZiAobGFzdF9odmMgPCBpbmRleCkKKwkJbGFzdF9odmMgPSBpbmRleDsKKworCS8qIGlmIHRoaXMgaW5kZXggaXMgd2hhdCB0aGUgdXNlciByZXF1ZXN0ZWQsIHRoZW4gcmVnaXN0ZXIKKwkgKiBub3cgKHNldHVwIHdvbid0IGZhaWwgYXQgdGhpcyBwb2ludCkuICBJdCdzIG9rIHRvIGp1c3QKKwkgKiBjYWxsIHJlZ2lzdGVyIGFnYWluIGlmIHByZXZpb3VzbHkgLnNldHVwIGZhaWxlZC4KKwkgKi8KKwlpZiAoaW5kZXggPT0gaHZjX2Nvbl9kcml2ZXIuaW5kZXgpCisJCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChodmNfaW5zdGFudGlhdGUpOworCisvKiBXYWtlIHRoZSBzbGVlcGluZyBraHZjZCAqLworc3RhdGljIHZvaWQgaHZjX2tpY2sodm9pZCkKK3sKKwlodmNfa2lja2VkID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3MoaHZjX3Rhc2spOworfQorCitzdGF0aWMgaW50IGh2Y19wb2xsKHN0cnVjdCBodmNfc3RydWN0ICpocCk7CisKKy8qCisgKiBOT1RFOiBUaGlzIEFQSSBpc24ndCB1c2VkIGlmIHRoZSBjb25zb2xlIGFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdHMuCisgKiBJbiB0aGlzIGNhc2UgdGhlIGNvbnNvbGUgaXMgcG9sbCBkcml2ZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIGlmIGh2Y19wb2xsIHJlcXVlc3QgYSByZXBvbGwsIHRoZW4ga2ljayB0aGUgaHZjZCB0aHJlYWQgKi8KKwlpZiAoaHZjX3BvbGwoZGV2X2luc3RhbmNlKSkKKwkJaHZjX2tpY2soKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaHZjX2tpY2soKTsKK30KKwogLyoKICAqIFRoZSBUVFkgaW50ZXJmYWNlIHdvbid0IGJlIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHZpbyBsYXllciBoYXMgZXhwb3NlZCB0aGUgdnR5CiAgKiBhZGFwdGVyIHRvIHRoZSBrZXJuZWwuCkBAIC0zMjksNyArNDY5LDcgQEAKIHsKIAlpbnQgbjsKIAotCW4gPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCBocC0+b3V0YnVmLCBocC0+bl9vdXRidWYpOworCW4gPSBocC0+b3BzLT5wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CiAJaWYgKG4gPD0gMCkgewogCQlpZiAobiA9PSAwKQogCQkJcmV0dXJuOwpAQCAtNDY3LDcgKzYwNyw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCW4gPSBodmNfZ2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKKwkJbiA9IGhwLT5vcHMtPmdldF9jaGFycyhocC0+dnRlcm1ubywgYnVmLCBjb3VudCk7CiAJCWlmIChuIDw9IDApIHsKIAkJCS8qIEhhbmd1cCB0aGUgdHR5IHdoZW4gZGlzY29ubmVjdGVkIGZyb20gaG9zdCAqLwogCQkJaWYgKG4gPT0gLUVQSVBFKSB7CkBAIC00NzksMTQgKzYxOSwxNyBAQAogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkJCS8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLwotCQkJaWYgKGJ1ZltpXSA9PSAnXHgwZicpIHsJLyogXk8gLS0gc2hvdWxkIHN1cHBvcnQgYSBzZXF1ZW5jZSAqLwotCQkJCXN5c3JxX3ByZXNzZWQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChzeXNycV9wcmVzc2VkKSB7Ci0JCQkJaGFuZGxlX3N5c3JxKGJ1ZltpXSwgTlVMTCwgdHR5KTsKLQkJCQlzeXNycV9wcmVzc2VkID0gMDsKLQkJCQljb250aW51ZTsKKwkJCWlmIChocC0+aW5kZXggPT0gaHZjX2Nvbl9kcml2ZXIuaW5kZXgpIHsKKwkJCQkvKiBIYW5kbGUgdGhlIFN5c1JxIEhhY2sgKi8KKwkJCQkvKiBYWFggc2hvdWxkIHN1cHBvcnQgYSBzZXF1ZW5jZSAqLworCQkJCWlmIChidWZbaV0gPT0gJ1x4MGYnKSB7CS8qIF5PICovCisJCQkJCXN5c3JxX3ByZXNzZWQgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKHN5c3JxX3ByZXNzZWQpIHsKKwkJCQkJaGFuZGxlX3N5c3JxKGJ1ZltpXSwgTlVMTCwgdHR5KTsKKwkJCQkJc3lzcnFfcHJlc3NlZCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJCX0KICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYnVmW2ldLCAwKTsKQEAgLTQ5Nyw4ICs2NDAsOCBAQAogCiAJCS8qCiAJCSAqIEFjY291bnQgZm9yIHRoZSB0b3RhbCBhbW91bnQgcmVhZCBpbiBvbmUgbG9vcCwgYW5kIGlmIGFib3ZlCi0JCSAqIDY0IGJ5dGVzLCB3ZSBkbyBhIHF1aWNrIHNjaGVkdWxlIGxvb3AgdG8gbGV0IHRoZSB0dHkgZ3JvayB0aGUKLQkJICogZGF0YSBhbmQgZXZlbnR1YWxseSB0aHJvdHRsZSB1cy4KKwkJICogNjQgYnl0ZXMsIHdlIGRvIGEgcXVpY2sgc2NoZWR1bGUgbG9vcCB0byBsZXQgdGhlIHR0eSBncm9rCisJCSAqIHRoZSBkYXRhIGFuZCBldmVudHVhbGx5IHRocm90dGxlIHVzLgogCQkgKi8KIAkJcmVhZF90b3RhbCArPSBuOwogCQlpZiAocmVhZF90b3RhbCA+PSA2NCkgewpAQCAtNTQyLDcgKzY4NSw2IEBACiAJCWlmIChjcHVzX2VtcHR5KGNwdXNfaW5feG1vbikpIHsKIAkJCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhwLCAmaHZjX3N0cnVjdHMsIG5leHQpIHsKLQkJCQkvKmhwID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgaHZjX3N0cnVjdCwgKiBuZXh0KTsgKi8KIAkJCQlwb2xsX21hc2sgfD0gaHZjX3BvbGwoaHApOwogCQkJfQogCQkJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOwpAQCAtNTc3LDE0ICs3MTksNiBAQAogCS5jaGFyc19pbl9idWZmZXIgPSBodmNfY2hhcnNfaW5fYnVmZmVyLAogfTsKIAotY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YT0gewotCXsic2VyaWFsIiwgImh2dGVybTEifSwKLQl7IE5VTEwsIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7Ci0KIC8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVyby4gKi8KIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKQEAgLTYwNiw0MSArNzQwLDUxIEBACiAJLnJlbGVhc2UgPSBkZXN0cm95X2h2Y19zdHJ1Y3QsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBodmNfcHJvYmUoCi0JCXN0cnVjdCB2aW9fZGV2ICpkZXYsCi0JCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3N0cnVjdCBodmNfc3RydWN0IF9fZGV2aW5pdCAqaHZjX2FsbG9jKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpcnEsCisJCQkJCXN0cnVjdCBodl9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7Ci0KLQkvKiBwcm9iZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMuICovCi0JaWYgKCFkZXYgfHwgIWlkKQotCQlyZXR1cm4gLUVQRVJNOworCWludCBpOwogCiAJaHAgPSBrbWFsbG9jKHNpemVvZigqaHApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhwKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAltZW1zZXQoaHAsIDB4MDAsIHNpemVvZigqaHApKTsKLQlocC0+dnRlcm1ubyA9IGRldi0+dW5pdF9hZGRyZXNzOwotCWhwLT52ZGV2ID0gZGV2OwotCWhwLT52ZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBocDsKLQlocC0+aXJxID0gZGV2LT5pcnE7CisKKwlocC0+dnRlcm1ubyA9IHZ0ZXJtbm87CisJaHAtPmlycSA9IGlycTsKKwlocC0+b3BzID0gb3BzOwogCiAJa29iamVjdF9pbml0KCZocC0+a29iaik7CiAJaHAtPmtvYmoua3R5cGUgPSAmaHZjX2tvYmpfdHlwZTsKIAogCXNwaW5fbG9ja19pbml0KCZocC0+bG9jayk7CiAJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKLQlocC0+aW5kZXggPSArK2h2Y19jb3VudDsKKworCS8qCisJICogZmluZCBpbmRleCB0byB1c2U6CisJICogc2VlIGlmIHRoaXMgdnRlcm0gaWQgbWF0Y2hlcyBvbmUgcmVnaXN0ZXJlZCBmb3IgY29uc29sZS4KKwkgKi8KKwlmb3IgKGk9MDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKKwkJaWYgKHZ0ZXJtbm9zW2ldID09IGhwLT52dGVybW5vKQorCQkJYnJlYWs7CisKKwkvKiBubyBtYXRjaGluZyBzbG90LCBqdXN0IHVzZSBhIGNvdW50ZXIgKi8KKwlpZiAoaSA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlpID0gKytsYXN0X2h2YzsKKworCWhwLT5pbmRleCA9IGk7CisKIAlsaXN0X2FkZF90YWlsKCYoaHAtPm5leHQpLCAmaHZjX3N0cnVjdHMpOwogCXNwaW5fdW5sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKIAotCXJldHVybiAwOworCXJldHVybiBocDsKIH0KK0VYUE9SVF9TWU1CT0woaHZjX2FsbG9jKTsKIAotc3RhdGljIGludCBfX2RldmV4aXQgaHZjX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoraW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCBodmNfc3RydWN0ICpocCkKIHsKLQlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtNjczLDIzICs4MTcsMTQgQEAKIAkJdHR5X2hhbmd1cCh0dHkpOwogCXJldHVybiAwOwogfQotCi1zdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjX3Zpb19kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gaHZjX2RyaXZlcl9uYW1lLAotCS5pZF90YWJsZQk9IGh2Y19kcml2ZXJfdGFibGUsCi0JLnByb2JlCQk9IGh2Y19wcm9iZSwKLQkucmVtb3ZlCQk9IGh2Y19yZW1vdmUsCi19OworRVhQT1JUX1NZTUJPTChodmNfcmVtb3ZlKTsKIAogLyogRHJpdmVyIGluaXRpYWxpemF0aW9uLiAgRm9sbG93IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24uICBUaGlzIGlzIHdoZXJlIHRoZSBUVFkKICAqIGludGVyZmFjZXMgc3RhcnQgdG8gYmVjb21lIGF2YWlsYWJsZS4gKi8KIGludCBfX2luaXQgaHZjX2luaXQodm9pZCkKIHsKLQlpbnQgcmM7Ci0KLQkvKiBXZSBuZWVkIG1vcmUgdGhhbiBudW1fdnRlcm1zIGFkYXB0ZXJzIGR1ZSB0byBob3RwbHVnIGFkZGl0aW9ucy4gKi8KKwkvKiBXZSBuZWVkIG1vcmUgdGhhbiBodmNfY291bnQgYWRhcHRlcnMgZHVlIHRvIGhvdHBsdWcgYWRkaXRpb25zLiAqLwogCWh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKEhWQ19BTExPQ19UVFlfQURBUFRFUlMpOwotCS8qIGh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKG51bV92dGVybXMpOyAqLwogCWlmICghaHZjX2RyaXZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTcxNiwxMTYgKzg1MSwyMCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKiBSZWdpc3RlciBhcyBhIHZpbyBkZXZpY2UgdG8gcmVjZWl2ZSBjYWxsYmFja3MgKi8KLQlyYyA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJmh2Y192aW9fZHJpdmVyKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KGh2Y19pbml0KTsKIAotLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFyaWx5IG5lY2Vzc2FyeSBkdWUgdG8gdGhpcyBiZWluZyBhIGNvbnNvbGUgZHJpdmVyIGJ1dCBpdAotICogaXMgbmljZSB0byBiZSB0aG9yb3VnaCAqLworLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFyaWx5IG5lY2Vzc2FyeSBkdWUgdG8gdGhpcyBiZWluZyBhIGNvbnNvbGUgZHJpdmVyCisgKiBidXQgaXQgaXMgbmljZSB0byBiZSB0aG9yb3VnaC4KKyAqLwogc3RhdGljIHZvaWQgX19leGl0IGh2Y19leGl0KHZvaWQpCiB7CiAJa3RocmVhZF9zdG9wKGh2Y190YXNrKTsKIAotCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOwogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNfZHJpdmVyKTsKIAkvKiByZXR1cm4gdHR5X3N0cnVjdCBpbnN0YW5jZXMgYWxsb2NhdGVkIGluIGh2Y19pbml0KCkuICovCiAJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9jb25zb2xlKCZodmNfY29uX2RyaXZlcik7CiB9Ci0KLS8qCi0gKiBDb25zb2xlIEFQSXMsIE5PVCBUVFkuICBUaGVzZSBBUElzIGFyZSBhdmFpbGFibGUgaW1tZWRpYXRlbHkgd2hlbgotICogaHZjX2NvbnNvbGVfc2V0dXAoKSBmaW5kcyBhZGFwdGVycy4KLSAqLwotCi0vKgotICogaHZjX2luc3RhbnRpYXRlKCkgaXMgYW4gZWFybHkgY29uc29sZSBkaXNjb3ZlcnkgbWV0aG9kIHdoaWNoIGxvY2F0ZXMgY29uc29sZXMKLSAqIHByaW9yIHRvIHRoZSB2aW8gc3Vic3lzdGVtIGRpc2NvdmVyaW5nIHRoZW0uICBIb3RwbHVnZ2VkIHZ0eSBhZGFwdGVycyBkbyBOT1QKLSAqIGdldCBhbiBodmNfaW5zdGFudGlhdGUoKSBjYWxsYmFjayBzaW5jZSB0aGUgYXBwZWFyIGFmdGVyIGVhcmx5IGNvbnNvbGUgaW5pdC4KLSAqLwotaW50IGh2Y19pbnN0YW50aWF0ZSh1aW50MzJfdCB2dGVybW5vLCBpbnQgaW5kZXgpCi17Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAodnRlcm1ub3NbaW5kZXhdICE9IC0xKQotCQlyZXR1cm4gLTE7Ci0KLQl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOwotCXJldHVybiAwOwotfQotCi12b2lkIGh2Y19jb25zb2xlX3ByaW50KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYiwgdW5zaWduZWQgY291bnQpCi17Ci0JY2hhciBjWzE2XSBfX0FMSUdORURfXzsKLQl1bnNpZ25lZCBpID0gMCwgbiA9IDA7Ci0JaW50IHIsIGRvbmVjciA9IDA7Ci0KLQkvKiBDb25zb2xlIGFjY2VzcyBhdHRlbXB0IG91dHNpZGUgb2YgYWNjZXB0YWJsZSBjb25zb2xlIHJhbmdlLiAqLwotCWlmIChjby0+aW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKLQkJcmV0dXJuOwotCi0JLyogVGhpcyBjb25zb2xlIGFkYXB0ZXIgd2FzIHJlbW92ZWQgc28gaXQgaXMgbm90IHVzZWFibGUuICovCi0JaWYgKHZ0ZXJtbm9zW2NvLT5pbmRleF0gPCAwKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7Ci0JCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgewotCQkJaWYgKGJbbl0gPT0gJ1xuJyAmJiAhZG9uZWNyKSB7Ci0JCQkJY1tpKytdID0gJ1xyJzsKLQkJCQlkb25lY3IgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQljW2krK10gPSBiW24rK107Ci0JCQkJZG9uZWNyID0gMDsKLQkJCQktLWNvdW50OwotCQkJfQotCQl9IGVsc2UgewotCQkJciA9IGh2Y19wdXRfY2hhcnModnRlcm1ub3NbY28tPmluZGV4XSwgYywgaSk7Ci0JCQlpZiAociA8IDApIHsKLQkJCQkvKiB0aHJvdyBhd2F5IGNoYXJzIG9uIGVycm9yICovCi0JCQkJaSA9IDA7Ci0JCQl9IGVsc2UgaWYgKHIgPiAwKSB7Ci0JCQkJaSAtPSByOwotCQkJCWlmIChpID4gMCkKLQkJCQkJbWVtbW92ZShjLCBjK3IsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKLXsKLQkqaW5kZXggPSBjLT5pbmRleDsKLQlyZXR1cm4gaHZjX2RyaXZlcjsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgY29uc29sZSBodmNfY29uX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiaHZjIiwKLQkud3JpdGUJCT0gaHZjX2NvbnNvbGVfcHJpbnQsCi0JLmRldmljZQkJPSBodmNfY29uc29sZV9kZXZpY2UsCi0JLnNldHVwCQk9IGh2Y19jb25zb2xlX3NldHVwLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CQk9IC0xLAotfTsKLQotLyogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4gKi8KLXN0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpPE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKLQkJdnRlcm1ub3NbaV0gPSAtMTsKLQludW1fdnRlcm1zID0gaHZjX2ZpbmRfdnR5cygpOwotCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKLQlyZXR1cm4gMDsKLX0KLWNvbnNvbGVfaW5pdGNhbGwoaHZjX2NvbnNvbGVfaW5pdCk7Ci0KLW1vZHVsZV9pbml0KGh2Y19pbml0KTsKIG1vZHVsZV9leGl0KGh2Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogdmlvIGRyaXZlciBpbnRlcmZhY2UgdG8gaHZjX2NvbnNvbGUuYworICoKKyAqIFRoaXMgY29kZSB3YXMgbW92ZWQgaGVyZSB0byBhbGxvdyB0aGUgcmVtYWluZyBjb2RlIHRvIGJlIHJldXNlZCBhcyBhCisgKiBnZW5lcmljIHBvbGxpbmcgbW9kZSB3aXRoIHNlbWktcmVsaWFibGUgdHJhbnNwb3J0IGRyaXZlciBjb3JlIHRvIHRoZQorICogY29uc29sZSBhbmQgdHR5IHN1YnN5c3RlbXMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwMSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBZGRpdGlvbmFsIEF1dGhvcihzKToKKyAqICBSeWFuIFMuIEFybm9sZCA8cnNhQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7InNlcmlhbCIsICJodnRlcm0xIn0sCisJeyBOVUxMLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIGh2Y19kcml2ZXJfdGFibGUpOworCitzdGF0aWMgaW50IGZpbHRlcmVkX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGdvdDsKKwlpbnQgaTsKKworCWdvdCA9IGh2Y19nZXRfY2hhcnModnRlcm1ubywgYnVmLCBjb3VudCk7CisKKwkvKgorCSAqIFdvcmsgYXJvdW5kIGEgSFYgYnVnIHdoZXJlIGl0IGdpdmVzIHVzIGEgbnVsbAorCSAqIGFmdGVyIGV2ZXJ5IFxyLiAgLS0gcGF1bHVzCisJICovCisJZm9yIChpID0gMTsgaSA8IGdvdDsgKytpKSB7CisJCWlmIChidWZbaV0gPT0gMCAmJiBidWZbaS0xXSA9PSAnXHInKSB7CisJCQktLWdvdDsKKwkJCWlmIChpIDwgZ290KQorCQkJCW1lbW1vdmUoJmJ1ZltpXSwgJmJ1ZltpKzFdLAorCQkJCQlnb3QgLSBpKTsKKwkJfQorCX0KKwlyZXR1cm4gZ290OworfQorCitzdGF0aWMgc3RydWN0IGh2X29wcyBodmNfZ2V0X3B1dF9vcHMgPSB7CisJLmdldF9jaGFycyA9IGZpbHRlcmVkX2dldF9jaGFycywKKwkucHV0X2NoYXJzID0gaHZjX3B1dF9jaGFycywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh2Y192aW9fcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCS8qIHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycy4gKi8KKwlpZiAoIXZkZXYgfHwgIWlkKQorCQlyZXR1cm4gLUVQRVJNOworCisJaHAgPSBodmNfYWxsb2ModmRldi0+dW5pdF9hZGRyZXNzLCB2ZGV2LT5pcnEsICZodmNfZ2V0X3B1dF9vcHMpOworCWlmIChJU19FUlIoaHApKQorCQlyZXR1cm4gUFRSX0VSUihocCk7CisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIGhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNfdmlvX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlyZXR1cm4gaHZjX3JlbW92ZShocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBodmNfdmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBodmNfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjX2RyaXZlcl90YWJsZSwKKwkucHJvYmUJCT0gaHZjX3Zpb19wcm9iZSwKKwkucmVtb3ZlCQk9IGh2Y192aW9fcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IGh2Y192aW9faW5pdCh2b2lkKQoreworCWludCByYzsKKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOworCisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQoaHZjX3Zpb19pbml0KTsgLyogYWZ0ZXIgZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgKi8KKworc3RhdGljIHZvaWQgaHZjX3Zpb19leGl0KHZvaWQpCit7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChodmNfdmlvX2V4aXQpOworCisvKiB0aGUgZGV2aWNlIHRyZWUgb3JkZXIgZGVmaW5lcyBvdXIgbnVtYmVyaW5nICovCitzdGF0aWMgaW50IGh2Y19maW5kX3Z0eXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnZ0eTsKKwlpbnQgbnVtX2ZvdW5kID0gMDsKKworCWZvciAodnR5ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZ0eSIpOyB2dHkgIT0gTlVMTDsKKwkJCXZ0eSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHZ0eSwgInZ0eSIpKSB7CisJCXVpbnQzMl90ICp2dGVybW5vOworCisJCS8qIFdlIGhhdmUgc3RhdGljYWxseSBkZWZpbmVkIHNwYWNlIGZvciBvbmx5IGEgY2VydGFpbiBudW1iZXIKKwkJICogb2YgY29uc29sZSBhZGFwdGVycy4KKwkJICovCisJCWlmIChudW1fZm91bmQgPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJCWJyZWFrOworCisJCXZ0ZXJtbm8gPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAicmVnIiwgTlVMTCk7CisJCWlmICghdnRlcm1ubykKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZSh2dHksICJodnRlcm0xIikpIHsKKwkJCWh2Y19pbnN0YW50aWF0ZSgqdnRlcm1ubywgbnVtX2ZvdW5kLCAmaHZjX2dldF9wdXRfb3BzKTsKKwkJCSsrbnVtX2ZvdW5kOworCQl9CisJfQorCisJcmV0dXJuIG51bV9mb3VuZDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoaHZjX2ZpbmRfdnR5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZzaS5jIGIvZHJpdmVycy9jaGFyL2h2c2kuYwppbmRleCBmMWYxMTkyLi5hMjJhYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZzaS5jCisrKyBiL2RyaXZlcnMvY2hhci9odnNpLmMKQEAgLTI5MSwxNSArMjkxLDEzIEBACiAJZHVtcF9oZXgocGFja2V0LCBoZWFkZXItPmxlbik7CiB9CiAKLS8qIGNhbid0IHVzZSBodmNfZ2V0X2NoYXJzIGJlY2F1c2UgdGhhdCBzdHJpcHMgQ1JzICovCiBzdGF0aWMgaW50IGh2c2lfcmVhZChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIGdvdDsKIAotCWlmIChwbHBhcl9oY2FsbChIX0dFVF9URVJNX0NIQVIsIGhwLT52dGVybW5vLCAwLCAwLCAwLCAmZ290LAotCQkJKHVuc2lnbmVkIGxvbmcgKilidWYsICh1bnNpZ25lZCBsb25nICopYnVmKzEpID09IEhfU3VjY2VzcykKLQkJcmV0dXJuIGdvdDsKLQlyZXR1cm4gMDsKKwlnb3QgPSBodmNfZ2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKKworCXJldHVybiBnb3Q7CiB9CiAKIHN0YXRpYyB2b2lkIGh2c2lfcmVjdl9jb250cm9sKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwppbmRleCA3ZTZhYzE0Li4zNDgwNTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCkBAIC01NzksNyArNTc5LDcgQEAKIAogCS8qIFByb2JlIGZvciBJbnRlbCwgQU1EIFJOR3MgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZW50ID0gcGNpX21hdGNoX2RldmljZSAocm5nX3BjaV90YmwsIHBkZXYpOworCQllbnQgPSBwY2lfbWF0Y2hfaWQocm5nX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoZW50KSB7CiAJCQlybmdfb3BzID0gJnJuZ192ZW5kb3Jfb3BzW2VudC0+ZHJpdmVyX2RhdGFdOwogCQkJZ290byBtYXRjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKaW5kZXggMTgxM2QwZC4uZTE2YzEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKQEAgLTEwODgsOCArMTA4OCw4IEBACiAJCWxvbmcgICAgICAgICAgICAgICAgICBzZXFpZDsKIAkJaW50ICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCA9IDA7CiAKLQkJaWYgKGFkZHItPmNoYW5uZWwgPiBJUE1JX05VTV9DSEFOTkVMUykgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoYWRkci0+Y2hhbm5lbCA+PSBJUE1JX01BWF9DSEFOTkVMUykgeworCQkgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKIAkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CiAJCQlydiA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCAzMWNmODRkLi45MzFlZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTMwOSw5ICszMDksNiBAQAogI2lmZGVmIENPTkZJR19CVk1FNjAwMAogCXJ0Y19EUDg1NzBBX2luaXQoKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JcG11X2RldmljZV9pbml0KCk7Ci0jZW5kaWYKIAlpZiAocmVnaXN0ZXJfY2hyZGV2KE1JU0NfTUFKT1IsIm1pc2MiLCZtaXNjX2ZvcHMpKSB7CiAJCXByaW50aygidW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbWlzYyBkZXZpY2VzXG4iLAogCQkgICAgICAgTUlTQ19NQUpPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCA3YzI0ZmJlLi45NWY3MDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCQlpbnQgbiA9IChzaXplb2YobW94YV9wY2licmRzKSAvIHNpemVvZihtb3hhX3BjaWJyZHNbMF0pKSAtIDE7CiAJCWkgPSAwOwogCQl3aGlsZSAoaSA8IG4pIHsKLQkJCXdoaWxlICgocCA9IHBjaV9maW5kX2RldmljZShtb3hhX3BjaWJyZHNbaV0udmVuZG9yLCBtb3hhX3BjaWJyZHNbaV0uZGV2aWNlLCBwKSkhPU5VTEwpCisJCQl3aGlsZSAoKHAgPSBwY2lfZ2V0X2RldmljZShtb3hhX3BjaWJyZHNbaV0udmVuZG9yLCBtb3hhX3BjaWJyZHNbaV0uZGV2aWNlLCBwKSkhPU5VTEwpCiAJCQl7CiAJCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHApKQogCQkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggZWRiYTVhMy4uMDkxMDNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTc3MCwxMCArNzcwLDggQEAKIAkJfQogCQlpZiAoYyA9PSAnXG4nKSB7CiAJCQlpZiAoTF9FQ0hPKHR0eSkgfHwgTF9FQ0hPTkwodHR5KSkgewotCQkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKQogCQkJCQlwdXRfY2hhcignXGEnLCB0dHkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQogCQkJCW9wb3N0KCdcbicsIHR0eSk7CiAJCQl9CiAJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOwpAQCAtNzkwLDEwICs3ODgsOCBAQAogCQkJICogWFhYIGFyZSBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSIGVjaG9lZD8hPwogCQkJICovCiAJCQlpZiAoTF9FQ0hPKHR0eSkpIHsKLQkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkKIAkJCQkJcHV0X2NoYXIoJ1xhJywgdHR5KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KIAkJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLwogCQkJCWlmICh0dHktPmNhbm9uX2hlYWQgPT0gdHR5LT5yZWFkX2hlYWQpCiAJCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW47CkBAIC04NjIsMTIgKzg1OCw5IEBACiAJICogdGhhdCBlcmFzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaGFuZGxlZC4gIE90aGVyIGV4Y2VzcwogCSAqIGNoYXJhY3RlcnMgd2lsbCBiZSBiZWVwZWQuCiAJICovCi0JaWYgKHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGEpCi0JCXJldHVybiBOX1RUWV9CVUZfU0laRTsKLQotCWlmIChsZWZ0ID4gMCkKLQkJcmV0dXJuIGxlZnQ7Ci0JcmV0dXJuIDA7CisJaWYgKGxlZnQgPD0gMCkKKwkJbGVmdCA9IHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGE7CisJcmV0dXJuIGxlZnQ7CiB9CiAKIC8qKgpAQCAtMTQ3MywxMyArMTQ2NiwxNyBAQAogCQkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycykKIAkJCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKIAkJfSBlbHNlIHsKLQkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7Ci0JCQlpZiAoYyA8IDApIHsKLQkJCQlyZXR2YWwgPSBjOwotCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJd2hpbGUgKG5yID4gMCkgeworCQkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7CisJCQkJaWYgKGMgPCAwKSB7CisJCQkJCXJldHZhbCA9IGM7CisJCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJCX0KKwkJCQlpZiAoIWMpCisJCQkJCWJyZWFrOworCQkJCWIgKz0gYzsKKwkJCQluciAtPSBjOwogCQkJfQotCQkJYiArPSBjOwotCQkJbnIgLT0gYzsKIAkJfQogCQlpZiAoIW5yKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggMWM4ZDg2Ni4uN2EwYzc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTcxLDcgKzcxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU4MSw3ICs1ODAsNyBAQAogCiAgICAgLyogSW50ZXJydXB0IHNldHVwICovCiAgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7Ci0gICAgbGluay0+aXJxLklSUUluZm8xICAgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLklSUUluZm8xICAgPSBJUlFfTEVWRUxfSUQ7CiAgICAgbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogICAgIAogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CkBAIC01OTMsMTEgKzU5Miw2IEBACiAgICAgZGV2X2xpc3QgPSBsaW5rOwogCiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbWdzbHBjX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC0zMDgxLDEzICszMDc1LDIxIEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbWdzbHBjX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDJjNSwgMHgwMDUwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgbWdzbHBjX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBtZ3NscGNfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAic3luY2xpbmtfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBtZ3NscGNfYXR0YWNoLAorCS5ldmVudAkJPSBtZ3NscGNfZXZlbnQsCiAJLmRldGFjaAkJPSBtZ3NscGNfZGV0YWNoLAorCS5pZF90YWJsZQk9IG1nc2xwY19pZHMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG1nc2xwY19vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggNDYwYjVkNC4uNmIxMWQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAgKiBzYW1wbGVzIHRvIGF2b2lkIHdhc3RpbmcgQ1BVIHRpbWUgYW5kIHJlZHVjZSBsb2NrIGNvbnRlbnRpb24uCiAgKi8KIAotc3RhdGljIGludCB0cmlja2xlX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAyODsKK3N0YXRpYyBpbnQgdHJpY2tsZV90aHJlc2ggX19yZWFkX21vc3RseSA9IElOUFVUX1BPT0xfV09SRFMgKiAyODsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgdHJpY2tsZV9jb3VudCkgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwppbmRleCA3ZGIzMzcwLi5kN2Q0ODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAgICAgLyogRmlyc3QgbG9vayBmb3IgdGhlIEpFVCBkZXZpY2VzOiAqLwotICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIAorICAgIHdoaWxlICgocGRldiA9IHBjaV9nZXRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CiAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKQEAgLTExNjksNyArMTE2OSw3IEBACiAgICovCiAKICAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBSSU8vUENJIGRldmljZXM6ICovCi0gICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfUklPLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpKSkgewogICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKaW5kZXggZjQ2M2Q2Yi4uNWIxZDM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JvY2tldC5jCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCVRvUmVjdiA9IHNwYWNlOwogCiAJaWYgKFRvUmVjdiA8PSAwKQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAogCS8qCiAJICogaWYgc3RhdHVzIGluZGljYXRlcyB0aGVyZSBhcmUgZXJyb3JlZCBjaGFyYWN0ZXJzIGluIHRoZQpAQCAtNDM3LDYgKzQzNyw3IEBACiAJfQogCS8qICBQdXNoIHRoZSBkYXRhIHVwIHRvIHRoZSB0dHkgbGF5ZXIgKi8KIAlsZC0+cmVjZWl2ZV9idWYodHR5LCB0dHktPmZsaXAuY2hhcl9idWYsIHR0eS0+ZmxpcC5mbGFnX2J1ZiwgY291bnQpOworZG9uZToKIAl0dHlfbGRpc2NfZGVyZWYobGQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggZmY0ZjA5OC4uZDhmOWU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtODk0LDcgKzg5NSw2IEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CiAjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19taXBzX18pCiAJdW5zaWduZWQgaW50IHllYXIsIGN0cmw7Ci0JdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2c7CiAJY2hhciAqZ3Vlc3MgPSBOVUxMOwogI2VuZGlmCiAjaWZkZWYgX19zcGFyY19fCkBAIC0xMDAwLDEyICsxMDAwLDggQEAKIAkvKiBFYWNoIG9wZXJhdGluZyBzeXN0ZW0gb24gYW4gQWxwaGEgdXNlcyBpdHMgb3duIGVwb2NoLgogCSAgIExldCdzIHRyeSB0byBndWVzcyB3aGljaCBvbmUgd2UgYXJlIHVzaW5nIG5vdy4gKi8KIAkKLQl1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOwogCWlmIChydGNfaXNfdXBkYXRpbmcoKSAhPSAwKQotCQl3aGlsZSAoamlmZmllcyAtIHVpcF93YXRjaGRvZyA8IDIqSFovMTAwKSB7IAotCQkJYmFycmllcigpOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KKwkJbXNsZWVwKDIwKTsKIAkKIAlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CiAJeWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CkBAIC0xMjEzLDcgKzEyMDksNiBAQAogCiB2b2lkIHJ0Y19nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCiB7Ci0JdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOwogCXVuc2lnbmVkIGNoYXIgY3RybDsKICNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCiAJdW5zaWduZWQgaW50IHJlYWxfeWVhcjsKQEAgLTEyMjEsNyArMTIxNiw3IEBACiAKIAkvKgogCSAqIHJlYWQgUlRDIG9uY2UgYW55IHVwZGF0ZSBpbiBwcm9ncmVzcyBpcyBkb25lLiBUaGUgdXBkYXRlCi0JICogY2FuIHRha2UganVzdCBvdmVyIDJtcy4gV2Ugd2FpdCAxMCB0byAyMG1zLiBUaGVyZSBpcyBubyBuZWVkIHRvCisJICogY2FuIHRha2UganVzdCBvdmVyIDJtcy4gV2Ugd2FpdCAyMG1zLiBUaGVyZSBpcyBubyBuZWVkIHRvCiAJICogdG8gcG9sbC13YWl0ICh1cCB0byAxcyAtIGVlY2NjaCkgZm9yIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgUlRDX1VJUC4KIAkgKiBJZiB5b3UgbmVlZCB0byBrbm93ICpleGFjdGx5KiB3aGVuIGEgc2Vjb25kIGhhcyBzdGFydGVkLCBlbmFibGUKIAkgKiBwZXJpb2RpYyB1cGRhdGUgY29tcGxldGUgaW50ZXJydXB0cywgKHZpYSBpb2N0bCkgYW5kIHRoZW4gCkBAIC0xMjMwLDEwICsxMjI1LDcgQEAKIAkgKi8KIAogCWlmIChydGNfaXNfdXBkYXRpbmcoKSAhPSAwKQotCQl3aGlsZSAoamlmZmllcyAtIHVpcF93YXRjaGRvZyA8IDIqSFovMTAwKSB7Ci0JCQliYXJyaWVyKCk7Ci0JCQljcHVfcmVsYXgoKTsKLQkJfQorCQltc2xlZXAoMjApOwogCiAJLyoKIAkgKiBPbmx5IHRoZSB2YWx1ZXMgdGhhdCB3ZSByZWFkIGZyb20gdGhlIFJUQyBhcmUgc2V0LiBXZSBsZWF2ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5c3JxLmMgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwppbmRleCBhZjc5ODA1Li4xMmQ1NjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3lzcnEuYworKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAKIHN0YXRpYyB2b2lkIG1vb21fY2FsbGJhY2sodm9pZCAqaWdub3JlZCkKIHsKLQlvdXRfb2ZfbWVtb3J5KEdGUF9LRVJORUwpOworCW91dF9vZl9tZW1vcnkoR0ZQX0tFUk5FTCwgMCk7CiB9CiAKIHN0YXRpYyBERUNMQVJFX1dPUksobW9vbV93b3JrLCBtb29tX2NhbGxiYWNrLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90YjAyMTkuYyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwppbmRleCA1NDEzZjI5Li5lYjcwNThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKKysrIGIvZHJpdmVycy9jaGFyL3RiMDIxOS5jCkBAIC0yNCw2ICsyNCw4IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3ZyNDF4eC9naXUuaD4KKyNpbmNsdWRlIDxhc20vdnI0MXh4L3RiMDIxOS5oPgogCiBNT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgZHJpdmVyIik7CkBAIC0yNjYsNiArMjY4LDIxIEBACiAJdGIwMjE5X3dyaXRlKFRCMDIxOV9SRVNFVCwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHRiMDIxOV9wY2lfaXJxX2luaXQodm9pZCkKK3sKKwkvKiBQQ0kgU2xvdCAxICovCisJdnI0MXh4X3NldF9pcnFfdHJpZ2dlcihUQjAyMTlfUENJX1NMT1QxX1BJTiwgSVJRX1RSSUdHRVJfTEVWRUwsIElSUV9TSUdOQUxfVEhST1VHSCk7CisJdnI0MXh4X3NldF9pcnFfbGV2ZWwoVEIwMjE5X1BDSV9TTE9UMV9QSU4sIElSUV9MRVZFTF9MT1cpOworCisJLyogUENJIFNsb3QgMiAqLworCXZyNDF4eF9zZXRfaXJxX3RyaWdnZXIoVEIwMjE5X1BDSV9TTE9UMl9QSU4sIElSUV9UUklHR0VSX0xFVkVMLCBJUlFfU0lHTkFMX1RIUk9VR0gpOworCXZyNDF4eF9zZXRfaXJxX2xldmVsKFRCMDIxOV9QQ0lfU0xPVDJfUElOLCBJUlFfTEVWRUxfTE9XKTsKKworCS8qIFBDSSBTbG90IDMgKi8KKwl2cjQxeHhfc2V0X2lycV90cmlnZ2VyKFRCMDIxOV9QQ0lfU0xPVDNfUElOLCBJUlFfVFJJR0dFUl9MRVZFTCwgSVJRX1NJR05BTF9USFJPVUdIKTsKKwl2cjQxeHhfc2V0X2lycV9sZXZlbChUQjAyMTlfUENJX1NMT1QzX1BJTiwgSVJRX0xFVkVMX0xPVyk7Cit9CisKIHN0YXRpYyBpbnQgdGIwMjE5X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0dmFsOwpAQCAtMjkyLDYgKzMwOSw4IEBACiAJb2xkX21hY2hpbmVfcmVzdGFydCA9IF9tYWNoaW5lX3Jlc3RhcnQ7CiAJX21hY2hpbmVfcmVzdGFydCA9IHRiMDIxOV9yZXN0YXJ0OwogCisJdGIwMjE5X3BjaV9pcnFfaW5pdCgpOworCiAJaWYgKG1ham9yID09IDApIHsKIAkJbWFqb3IgPSByZXR2YWw7CiAJCXByaW50ayhLRVJOX0lORk8gIlRCMDIxOTogbWFqb3IgbnVtYmVyICVkXG4iLCBtYWpvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGlwYXIuYyBiL2RyaXZlcnMvY2hhci90aXBhci5jCmluZGV4IDY1OTMzNWQuLmVjNzhkMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90aXBhci5jCisrKyBiL2RyaXZlcnMvY2hhci90aXBhci5jCkBAIC0zOTYsNyArMzk2LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0CiB0aXBhcl9zZXR1cChjaGFyICpzdHIpCiB7Ci0JaW50IGludHNbMl07CisJaW50IGludHNbM107CiAKIAlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwppbmRleCA4NTQ0NzVjLi4wNDlkMTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwogCW1pc2NfZGVyZWdpc3RlcigmY2hpcC0+dmVuZG9yLT5taXNjZGV2KTsKLQlrZnJlZSgmY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm5hbWUpOworCWtmcmVlKGNoaXAtPnZlbmRvci0+bWlzY2Rldi5uYW1lKTsKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGNpX2Rldi0+ZGV2LmtvYmosIGNoaXAtPnZlbmRvci0+YXR0cl9ncm91cCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwppbmRleCA1ODU5Nzk5Li5mMTljZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCkBAIC00NzYsMTEgKzQ3NiwxMSBAQAogCQkJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CiAJCQlzd2l0Y2ggKGFyZykgewogCQkJY2FzZSBUQ0lGTFVTSDoKLQkJCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKKwkJCQlpZiAobGQgJiYgbGQtPmZsdXNoX2J1ZmZlcikKIAkJCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUQ0lPRkxVU0g6Ci0JCQkJaWYgKGxkLT5mbHVzaF9idWZmZXIpCisJCQkJaWYgKGxkICYmIGxkLT5mbHVzaF9idWZmZXIpCiAJCQkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKIAkJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJCWNhc2UgVENPRkxVU0g6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IGQ3YWE3YTIuLjMwZDk2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC0yNzk2LDcgKzI3OTYsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAodmVzYV9vZmZfaW50ZXJ2YWwpIHsKLQkJYmxhbmtfc3RhdGUgPSBibGFua192ZXNhX3dhaXQsCisJCWJsYW5rX3N0YXRlID0gYmxhbmtfdmVzYV93YWl0OwogCQltb2RfdGltZXIoJmNvbnNvbGVfdGltZXIsIGppZmZpZXMgKyB2ZXNhX29mZl9pbnRlcnZhbCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnRfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCmluZGV4IDg5NzE0ODQuLjFkNDRmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zODYsNyArMzg3LDcgQEAKIAkJaWYgKCFwZXJtKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJaWYgKGFyZykKLQkJCWFyZyA9IDExOTMxODIgLyBhcmc7CisJCQlhcmcgPSBDTE9DS19USUNLX1JBVEUgLyBhcmc7CiAJCWtkX21rc291bmQoYXJnLCAwKTsKIAkJcmV0dXJuIDA7CiAKQEAgLTQwMyw3ICs0MDQsNyBAQAogCQl0aWNrcyA9IEhaICogKChhcmcgPj4gMTYpICYgMHhmZmZmKSAvIDEwMDA7CiAJCWNvdW50ID0gdGlja3MgPyAoYXJnICYgMHhmZmZmKSA6IDA7CiAJCWlmIChjb3VudCkKLQkJCWNvdW50ID0gMTE5MzE4MiAvIGNvdW50OworCQkJY291bnQgPSBDTE9DS19USUNLX1JBVEUgLyBjb3VudDsKIAkJa2RfbWtzb3VuZChjb3VudCwgdGlja3MpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jCmluZGV4IGIxNGQ2NDIuLjVkMDdlZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAkgKi8KIAogCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKLQkJaWYgKHBjaV9tYXRjaF9kZXZpY2UoaTh4eF90Y29fcGNpX3RibCwgZGV2KSkgeworCQlpZiAocGNpX21hdGNoX2lkKGk4eHhfdGNvX3BjaV90YmwsIGRldikpIHsKIAkJCWk4eHhfdGNvX3BjaSA9IGRldjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwMjAwMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jCmluZGV4IDRlOThjMjEuLjRiMDM5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlpZiAodGVzdF9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cykpIHsKIAkJd2R0X2Rpc2FibGUoKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9DUklUICJXQVRDSERPRzogRGV2aWNlIGNsb3NlZCB1bmV4cGVjdGRseSAtICIKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IERldmljZSBjbG9zZWQgdW5leHBlY3RlZGx5IC0gIgogCQkJCQkidGltZXIgd2lsbCBub3Qgc3RvcFxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwppbmRleCA4MjM5NmUwLi44M2RmMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCWlmICh0ZXN0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKSkgewogCQl3ZHRfZGlzYWJsZSgpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBEZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZGx5IC0gIgorCQlwcmludGsoS0VSTl9DUklUICJXQVRDSERPRzogRGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkgLSAiCiAJCQkJCSJ0aW1lciB3aWxsIG5vdCBzdG9wXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGJmNjJkZmUuLjdhNzg1OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtODY5LDcgKzg2OSw3IEBACiAgKgljcHVmcmVxX3N1c3BlbmQgLSBsZXQgdGhlIGxvdyBsZXZlbCBkcml2ZXIgcHJlcGFyZSBmb3Igc3VzcGVuZAogICovCiAKLXN0YXRpYyBpbnQgY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IGNwdWZyZXFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c2RldiwgcG1fbWVzc2FnZV90IHBtc2cpCiB7CiAJaW50IGNwdSA9IHN5c2Rldi0+aWQ7CiAJdW5zaWduZWQgaW50IHJldCA9IDA7CkBAIC04OTcsNyArODk3LDcgQEAKIAl9CiAKIAlpZiAoY3B1ZnJlcV9kcml2ZXItPnN1c3BlbmQpIHsKLQkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPnN1c3BlbmQoY3B1X3BvbGljeSwgc3RhdGUpOworCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+c3VzcGVuZChjcHVfcG9saWN5LCBwbXNnKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBzdXNwZW5kIGZhaWxlZCBpbiAtPnN1c3BlbmQgIgogCQkJCQkic3RlcCBvbiBDUFUgJXVcbiIsIGNwdV9wb2xpY3ktPmNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwppbmRleCBlZDcwOGI0Li43MTQwN2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlICJwYWRsb2NrLmgiCiAKQEAgLTU5LDggKzYwLDEyIEBACiAjZGVmaW5lIEFFU19FWFRFTkRFRF9LRVlfU0laRV9CCShBRVNfRVhURU5ERURfS0VZX1NJWkUgKiBzaXplb2YodWludDMyX3QpKQogCiBzdHJ1Y3QgYWVzX2N0eCB7Ci0JdWludDMyX3QgZV9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRSs0XTsKLQl1aW50MzJfdCBkX2RhdGFbQUVTX0VYVEVOREVEX0tFWV9TSVpFKzRdOworCXVpbnQzMl90IGVfZGF0YVtBRVNfRVhURU5ERURfS0VZX1NJWkVdOworCXVpbnQzMl90IGRfZGF0YVtBRVNfRVhURU5ERURfS0VZX1NJWkVdOworCXN0cnVjdCB7CisJCXN0cnVjdCBjd29yZCBlbmNyeXB0OworCQlzdHJ1Y3QgY3dvcmQgZGVjcnlwdDsKKwl9IGN3b3JkOwogCXVpbnQzMl90ICpFOwogCXVpbnQzMl90ICpEOwogCWludCBrZXlfbGVuZ3RoOwpAQCAtMjgwLDEwICsyODUsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgYWVzX2N0eCAqYWVzX2N0eCh2b2lkICpjdHgpCit7CisJcmV0dXJuIChzdHJ1Y3QgYWVzX2N0eCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWN0eCwgUEFETE9DS19BTElHTk1FTlQpOworfQorCiBzdGF0aWMgaW50CiBhZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1aW50OF90ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1aW50MzJfdCAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3R4X2FyZyk7CiAJdWludDMyX3QgaSwgdCwgdSwgdiwgdzsKIAl1aW50MzJfdCBQW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CiAJdWludDMyX3Qgcm91bmRzOwpAQCAtMjk1LDI1ICszMDUsMzYgQEAKIAogCWN0eC0+a2V5X2xlbmd0aCA9IGtleV9sZW47CiAKKwkvKgorCSAqIElmIHRoZSBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgdGhlIGV4dGVuZGVkIGtleQorCSAqIGl0c2VsZiB3ZSBtdXN0IHN1cHBseSB0aGUgcGxhaW4ga2V5IGZvciBib3RoIGVuY3J5cHRpb24KKwkgKiBhbmQgZGVjcnlwdGlvbi4KKwkgKi8KIAljdHgtPkUgPSBjdHgtPmVfZGF0YTsKLQljdHgtPkQgPSBjdHgtPmRfZGF0YTsKLQotCS8qIEVuc3VyZSAxNi1CeXRlcyBhbGlnbm1lbnRhdGlvbiBvZiBrZXlzIGZvciBWSUEgUGFkTG9jay4gKi8KLQlpZiAoKGludCkoY3R4LT5lX2RhdGEpICYgMHgwRikKLQkJY3R4LT5FICs9IDQgLSAoKChpbnQpKGN0eC0+ZV9kYXRhKSAmIDB4MEYpIC8gc2l6ZW9mIChjdHgtPmVfZGF0YVswXSkpOwotCi0JaWYgKChpbnQpKGN0eC0+ZF9kYXRhKSAmIDB4MEYpCi0JCWN0eC0+RCArPSA0IC0gKCgoaW50KShjdHgtPmRfZGF0YSkgJiAweDBGKSAvIHNpemVvZiAoY3R4LT5kX2RhdGFbMF0pKTsKKwljdHgtPkQgPSBjdHgtPmVfZGF0YTsKIAogCUVfS0VZWzBdID0gdWludDMyX3RfaW4gKGluX2tleSk7CiAJRV9LRVlbMV0gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgNCk7CiAJRV9LRVlbMl0gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgOCk7CiAJRV9LRVlbM10gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgMTIpOwogCisJLyogUHJlcGFyZSBjb250cm9sIHdvcmRzLiAqLworCW1lbXNldCgmY3R4LT5jd29yZCwgMCwgc2l6ZW9mKGN0eC0+Y3dvcmQpKTsKKworCWN0eC0+Y3dvcmQuZGVjcnlwdC5lbmNkZWMgPSAxOworCWN0eC0+Y3dvcmQuZW5jcnlwdC5yb3VuZHMgPSAxMCArIChrZXlfbGVuIC0gMTYpIC8gNDsKKwljdHgtPmN3b3JkLmRlY3J5cHQucm91bmRzID0gY3R4LT5jd29yZC5lbmNyeXB0LnJvdW5kczsKKwljdHgtPmN3b3JkLmVuY3J5cHQua3NpemUgPSAoa2V5X2xlbiAtIDE2KSAvIDg7CisJY3R4LT5jd29yZC5kZWNyeXB0LmtzaXplID0gY3R4LT5jd29yZC5lbmNyeXB0LmtzaXplOworCiAJLyogRG9uJ3QgZ2VuZXJhdGUgZXh0ZW5kZWQga2V5cyBpZiB0aGUgaGFyZHdhcmUgY2FuIGRvIGl0LiAqLwogCWlmIChhZXNfaHdfZXh0a2V5X2F2YWlsYWJsZShrZXlfbGVuKSkKIAkJcmV0dXJuIDA7CiAKKwljdHgtPkQgPSBjdHgtPmRfZGF0YTsKKwljdHgtPmN3b3JkLmVuY3J5cHQua2V5Z2VuID0gMTsKKwljdHgtPmN3b3JkLmRlY3J5cHQua2V5Z2VuID0gMTsKKwogCXN3aXRjaCAoa2V5X2xlbikgewogCWNhc2UgMTY6CiAJCXQgPSBFX0tFWVszXTsKQEAgLTM2OSwxMCArMzkwLDkgQEAKIAogLyogPT09PT09IEVuY3J5cHRpb24vZGVjcnlwdGlvbiByb3V0aW5lcyA9PT09PT0gKi8KIAotLyogVGhpcyBpcyB0aGUgcmVhbCBjYWxsIHRvIFBhZExvY2suICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXBhZGxvY2tfeGNyeXB0X2VjYih1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCB1aW50OF90ICprZXksCi0JCSAgIHZvaWQgKmNvbnRyb2xfd29yZCwgdWludDMyX3QgY291bnQpCisvKiBUaGVzZSBhcmUgdGhlIHJlYWwgY2FsbCB0byBQYWRMb2NrLiAqLworc3RhdGljIGlubGluZSB2b2lkIHBhZGxvY2tfeGNyeXB0X2VjYihjb25zdCB1OCAqaW5wdXQsIHU4ICpvdXRwdXQsIHZvaWQgKmtleSwKKwkJCQkgICAgICB2b2lkICpjb250cm9sX3dvcmQsIHUzMiBjb3VudCkKIHsKIAlhc20gdm9sYXRpbGUgKCJwdXNoZmw7IHBvcGZsIik7CQkvKiBlbmZvcmNlIGtleSByZWxvYWQuICovCiAJYXNtIHZvbGF0aWxlICgiLmJ5dGUgMHhmMywweDBmLDB4YTcsMHhjOCIJLyogcmVwIHhjcnlwdGVjYiAqLwpAQCAtMzgwLDYwICs0MDAsNzAgQEAKIAkJICAgICAgOiAiZCIoY29udHJvbF93b3JkKSwgImIiKGtleSksICJjIihjb3VudCkpOwogfQogCi1zdGF0aWMgdm9pZAotYWVzX3BhZGxvY2sodm9pZCAqY3R4X2FyZywgdWludDhfdCAqb3V0X2FyZywgY29uc3QgdWludDhfdCAqaW5fYXJnLCBpbnQgZW5jZGVjKQorc3RhdGljIGlubGluZSB1OCAqcGFkbG9ja194Y3J5cHRfY2JjKGNvbnN0IHU4ICppbnB1dCwgdTggKm91dHB1dCwgdm9pZCAqa2V5LAorCQkJCSAgICAgdTggKml2LCB2b2lkICpjb250cm9sX3dvcmQsIHUzMiBjb3VudCkKIHsKLQkvKiBEb24ndCBibGluZGx5IG1vZGlmeSB0aGlzIHN0cnVjdHVyZSAtIHRoZSBpdGVtcyBtdXN0IAotCSAgIGZpdCBvbiAxNi1CeXRlcyBib3VuZGFyaWVzISAqLwotCXN0cnVjdCBwYWRsb2NrX3hjcnlwdF9kYXRhIHsKLQkJdWludDhfdCBidWZbQUVTX0JMT0NLX1NJWkVdOwotCQl1bmlvbiBjd29yZCBjd29yZDsKLQl9OwotCi0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7Ci0JY2hhciBiaWdidWZbc2l6ZW9mKHN0cnVjdCBwYWRsb2NrX3hjcnlwdF9kYXRhKSArIDE2XTsKLQlzdHJ1Y3QgcGFkbG9ja194Y3J5cHRfZGF0YSAqZGF0YTsKLQl2b2lkICprZXk7Ci0KLQkvKiBQbGFjZSAnZGF0YScgYXQgdGhlIGZpcnN0IDE2LUJ5dGVzIGFsaWduZWQgYWRkcmVzcyBpbiAnYmlnYnVmJy4gKi8KLQlpZiAoKChsb25nKWJpZ2J1ZikgJiAweDBGKQotCQlkYXRhID0gKHZvaWQqKShiaWdidWYgKyAxNiAtICgobG9uZyliaWdidWYgJiAweDBGKSk7Ci0JZWxzZQotCQlkYXRhID0gKHZvaWQqKWJpZ2J1ZjsKLQotCS8qIFByZXBhcmUgQ29udHJvbCB3b3JkLiAqLwotCW1lbXNldCAoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRsb2NrX3hjcnlwdF9kYXRhKSk7Ci0JZGF0YS0+Y3dvcmQuYi5lbmNkZWMgPSAhZW5jZGVjOwkvKiBpbiB0aGUgcmVzdCBvZiBjcnlwdG9hcGkgRU5DPTEvREVDPTAgKi8KLQlkYXRhLT5jd29yZC5iLnJvdW5kcyA9IDEwICsgKGN0eC0+a2V5X2xlbmd0aCAtIDE2KSAvIDQ7Ci0JZGF0YS0+Y3dvcmQuYi5rc2l6ZSA9IChjdHgtPmtleV9sZW5ndGggLSAxNikgLyA4OwotCi0JLyogSXMgdGhlIGhhcmR3YXJlIGNhcGFibGUgdG8gZ2VuZXJhdGUgdGhlIGV4dGVuZGVkIGtleT8gKi8KLQlpZiAoIWFlc19od19leHRrZXlfYXZhaWxhYmxlKGN0eC0+a2V5X2xlbmd0aCkpCi0JCWRhdGEtPmN3b3JkLmIua2V5Z2VuID0gMTsKLQotCS8qIGN0eC0+RSBzdGFydHMgd2l0aCBhIHBsYWluIGtleSAtIGlmIHRoZSBoYXJkd2FyZSBpcyBjYXBhYmxlCi0JICAgdG8gZ2VuZXJhdGUgdGhlIGV4dGVuZGVkIGtleSBpdHNlbGYgd2UgbXVzdCBzdXBwbHkKLQkgICB0aGUgcGxhaW4ga2V5IGZvciBib3RoIEVuY3J5cHRpb24gYW5kIERlY3J5cHRpb24uICovCi0JaWYgKGVuY2RlYyA9PSBDUllQVE9fRElSX0VOQ1JZUFQgfHwgZGF0YS0+Y3dvcmQuYi5rZXlnZW4gPT0gMCkKLQkJa2V5ID0gY3R4LT5FOwotCWVsc2UKLQkJa2V5ID0gY3R4LT5EOwotCQotCW1lbWNweShkYXRhLT5idWYsIGluX2FyZywgQUVTX0JMT0NLX1NJWkUpOwotCXBhZGxvY2tfeGNyeXB0X2VjYihkYXRhLT5idWYsIGRhdGEtPmJ1Ziwga2V5LCAmZGF0YS0+Y3dvcmQsIDEpOwotCW1lbWNweShvdXRfYXJnLCBkYXRhLT5idWYsIEFFU19CTE9DS19TSVpFKTsKKwkvKiBFbmZvcmNlIGtleSByZWxvYWQuICovCisJYXNtIHZvbGF0aWxlICgicHVzaGZsOyBwb3BmbCIpOworCS8qIHJlcCB4Y3J5cHRjYmMgKi8KKwlhc20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGQwIgorCQkgICAgICA6ICIrUyIgKGlucHV0KSwgIitEIiAob3V0cHV0KSwgIithIiAoaXYpCisJCSAgICAgIDogImQiIChjb250cm9sX3dvcmQpLCAiYiIgKGtleSksICJjIiAoY291bnQpKTsKKwlyZXR1cm4gaXY7CiB9CiAKIHN0YXRpYyB2b2lkCiBhZXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluKQogewotCWFlc19wYWRsb2NrKGN0eF9hcmcsIG91dCwgaW4sIENSWVBUT19ESVJfRU5DUllQVCk7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3R4X2FyZyk7CisJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RSwgJmN0eC0+Y3dvcmQuZW5jcnlwdCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBhZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluKQogewotCWFlc19wYWRsb2NrKGN0eF9hcmcsIG91dCwgaW4sIENSWVBUT19ESVJfREVDUllQVCk7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3R4X2FyZyk7CisJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RCwgJmN0eC0+Y3dvcmQuZGVjcnlwdCwgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2VuY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSkpOworCXBhZGxvY2tfeGNyeXB0X2VjYihpbiwgb3V0LCBjdHgtPkUsICZjdHgtPmN3b3JkLmVuY3J5cHQsCisJCQkgICBuYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSk7CisJcmV0dXJuIG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZGVjcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKSk7CisJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RCwgJmN0eC0+Y3dvcmQuZGVjcnlwdCwKKwkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFlc19lbmNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwl1OCAqaXY7CisKKwlpdiA9IHBhZGxvY2tfeGNyeXB0X2NiYyhpbiwgb3V0LCBjdHgtPkUsIGRlc2MtPmluZm8sCisJCQkJJmN0eC0+Y3dvcmQuZW5jcnlwdCwgbmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpOworCW1lbWNweShkZXNjLT5pbmZvLCBpdiwgQUVTX0JMT0NLX1NJWkUpOworCisJcmV0dXJuIG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZGVjcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKSk7CisJcGFkbG9ja194Y3J5cHRfY2JjKGluLCBvdXQsIGN0eC0+RCwgZGVzYy0+aW5mbywgJmN0eC0+Y3dvcmQuZGVjcnlwdCwKKwkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWVzX2FsZyA9IHsKQEAgLTQ0MSw2ICs0NzEsNyBAQAogCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhZXNfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQlQQURMT0NLX0FMSUdOTUVOVCAtIDEsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAogCS5jcmFfdQkJCT0JewpAQCAtNDQ5LDcgKzQ4MCwxMSBAQAogCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CUFFU19NQVhfS0VZX1NJWkUsCiAJCQkuY2lhX3NldGtleQkgICAJPSAJYWVzX3NldF9rZXksCiAJCQkuY2lhX2VuY3J5cHQJIAk9CWFlc19lbmNyeXB0LAotCQkJLmNpYV9kZWNyeXB0CSAgCT0JYWVzX2RlY3J5cHQKKwkJCS5jaWFfZGVjcnlwdAkgIAk9CWFlc19kZWNyeXB0LAorCQkJLmNpYV9lbmNyeXB0X2VjYiAJPQlhZXNfZW5jcnlwdF9lY2IsCisJCQkuY2lhX2RlY3J5cHRfZWNiICAJPQlhZXNfZGVjcnlwdF9lY2IsCisJCQkuY2lhX2VuY3J5cHRfY2JjIAk9CWFlc19lbmNyeXB0X2NiYywKKwkJCS5jaWFfZGVjcnlwdF9jYmMgIAk9CWFlc19kZWNyeXB0X2NiYywKIAkJfQogCX0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmggYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmgKaW5kZXggN2E1MDA2MC4uM2NmMmI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCisrKyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaApAQCAtMTMsMTggKzEzLDE4IEBACiAjaWZuZGVmIF9DUllQVE9fUEFETE9DS19ICiAjZGVmaW5lIF9DUllQVE9fUEFETE9DS19ICiAKKyNkZWZpbmUgUEFETE9DS19BTElHTk1FTlQgMTYKKwogLyogQ29udHJvbCB3b3JkLiAqLwotdW5pb24gY3dvcmQgewotCXVpbnQzMl90IGN3b3JkWzRdOwotCXN0cnVjdCB7Ci0JCWludCByb3VuZHM6NDsKLQkJaW50IGFsZ286MzsKLQkJaW50IGtleWdlbjoxOwotCQlpbnQgaW50ZXJtOjE7Ci0JCWludCBlbmNkZWM6MTsKLQkJaW50IGtzaXplOjI7Ci0JfSBiOwotfTsKK3N0cnVjdCBjd29yZCB7CisJaW50IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKKwkJcm91bmRzOjQsCisJCWFsZ286MywKKwkJa2V5Z2VuOjEsCisJCWludGVybToxLAorCQllbmNkZWM6MSwKKwkJa3NpemU6MjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKFBBRExPQ0tfQUxJR05NRU5UKSkpOwogCiAjZGVmaW5lIFBGWAkicGFkbG9jazogIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCmluZGV4IDgzOWI0NGEuLjUzYzk1YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS92Z2EuaD4KICNpbmNsdWRlICJwY2RwLmgiCiAKIHN0YXRpYyBpbnQgX19pbml0CkBAIC00MCwxMCArNDEsMjcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXNldHVwX3ZnYV9jb25zb2xlKHN0cnVjdCBwY2RwX3ZnYSAqdmdhKQorc2V0dXBfdmdhX2NvbnNvbGUoc3RydWN0IHBjZHBfZGV2aWNlICpkZXYpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQotCWlmIChlZmlfbWVtX3R5cGUoMHhBMDAwMCkgPT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkpIHsKKwl1OCAqaWZfcHRyOworCisJaWZfcHRyID0gKCh1OCAqKWRldiArIHNpemVvZihzdHJ1Y3QgcGNkcF9kZXZpY2UpKTsKKwlpZiAoaWZfcHRyWzBdID09IFBDRFBfSUZfUENJKSB7CisJCXN0cnVjdCBwY2RwX2lmX3BjaSBpZl9wY2k7CisKKwkJLyogc3RydWN0IGNvcHkgc2luY2UgaWZwdHIgbWlnaHQgbm90IGJlIGNvcnJlY3RseSBhbGlnbmVkICovCisKKwkJbWVtY3B5KCZpZl9wY2ksIGlmX3B0ciwgc2l6ZW9mKGlmX3BjaSkpOworCisJCWlmIChpZl9wY2kudHJhbnMgJiBQQ0RQX1BDSV9UUkFOU19JT1BPUlQpCisJCQl2Z2FfY29uc29sZV9pb2Jhc2UgPSBpZl9wY2kuaW9wb3J0X3RyYTsKKworCQlpZiAoaWZfcGNpLnRyYW5zICYgUENEUF9QQ0lfVFJBTlNfTU1JTykKKwkJCXZnYV9jb25zb2xlX21lbWJhc2UgPSBpZl9wY2kubW1pb190cmE7CisJfQorCisJaWYgKGVmaV9tZW1fdHlwZSh2Z2FfY29uc29sZV9tZW1iYXNlICsgMHhBMDAwMCkgPT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0RQOiBWR0Egc2VsZWN0ZWQsIGJ1dCBmcmFtZSBidWZmZXIgaXMgbm90IE1NSU8hXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtOTUsNyArMTEzLDcgQEAKIAkgICAgIGRldiA9IChzdHJ1Y3QgcGNkcF9kZXZpY2UgKikgKCh1OCAqKSBkZXYgKyBkZXYtPmxlbmd0aCkpIHsKIAkJaWYgKGRldi0+ZmxhZ3MgJiBQQ0RQX1BSSU1BUllfQ09OU09MRSkgewogCQkJaWYgKGRldi0+dHlwZSA9PSBQQ0RQX0NPTlNPTEVfVkdBKSB7Ci0JCQkJcmV0dXJuIHNldHVwX3ZnYV9jb25zb2xlKChzdHJ1Y3QgcGNkcF92Z2EgKikgZGV2KTsKKwkJCQlyZXR1cm4gc2V0dXBfdmdhX2NvbnNvbGUoZGV2KTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5oIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmgKaW5kZXggMWRjN2M4OC4uY2U5MTBkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9wY2RwLmgKKysrIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmgKQEAgLTUyLDExICs1MiwzNiBAQAogCXUzMgkJCQljbG9ja19yYXRlOwogCXU4CQkJCXBjaV9wcm9nX2ludGZjOwogCXU4CQkJCWZsYWdzOwotfTsKKwl1MTYJCQkJY29ub3V0X2luZGV4OworCXUzMgkJCQlyZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUENEUF9JRl9QQ0kJMQorCisvKiBwY2RwX2lmX3BjaS50cmFucyAqLworI2RlZmluZSBQQ0RQX1BDSV9UUkFOU19JT1BPUlQJMHgwMgorI2RlZmluZSBQQ0RQX1BDSV9UUkFOU19NTUlPCTB4MDEKKworc3RydWN0IHBjZHBfaWZfcGNpIHsKKwl1OAkJCWludGVyY29ubmVjdDsKKwl1OAkJCXJlc2VydmVkOworCXUxNgkJCWxlbmd0aDsKKwl1OAkJCXNlZ21lbnQ7CisJdTgJCQlidXM7CisJdTgJCQlkZXY7CisJdTgJCQlmdW47CisJdTE2CQkJZGV2X2lkOworCXUxNgkJCXZlbmRvcl9pZDsKKwl1MzIJCQlhY3BpX2ludGVycnVwdDsKKwl1NjQJCQltbWlvX3RyYTsKKwl1NjQJCQlpb3BvcnRfdHJhOworCXU4CQkJZmxhZ3M7CisJdTgJCQl0cmFuczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBwY2RwX3ZnYSB7CiAJdTgJCQljb3VudDsJCS8qIGFkZHJlc3Mgc3BhY2UgZGVzY3JpcHRvcnMgKi8KLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBwY2RwX2RldmljZS5mbGFncyAqLwogI2RlZmluZSBQQ0RQX1BSSU1BUllfQ09OU09MRQkxCkBAIC02Niw3ICs5MSw5IEBACiAJdTgJCQlmbGFnczsKIAl1MTYJCQlsZW5ndGg7CiAJdTE2CQkJZWZpX2luZGV4OwotfTsKKwkvKiBuZXh0IGRhdGEgaXMgcGNkcF9pZl9wY2kgb3IgcGNkcF9pZl9hY3BpIChub3QgeWV0IHN1cHBvcnRlZCkgKi8KKwkvKiBuZXh0IGRhdGEgaXMgZGV2aWNlIHNwZWNpZmljIHR5cGUgKGN1cnJlbnRseSBvbmx5IHBjZHBfdmdhKSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHBjZHAgewogCXU4CQkJc2lnbmF0dXJlWzRdOwpAQCAtODEsNCArMTA4LDQgQEAKIAl1MzIJCQludW1fdWFydHM7CiAJc3RydWN0IHBjZHBfdWFydAl1YXJ0WzBdOwkvKiBhY3R1YWwgc2l6ZSBpcyBudW1fdWFydHMgKi8KIAkvKiByZW1haW5kZXIgb2YgdGFibGUgaXMgcGNkcF9kZXZpY2Ugc3RydWN0dXJlcyAqLwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwZDVmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMCwwICsxLDQyMCBAQAorIworIyBJMkMgU2Vuc29yIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydCIKKworY29uZmlnIEhXTU9OCisJdHJpc3RhdGUgIkhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBIYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZXMgbGV0IHlvdSBtb25pdG9yIHRoZSBoYXJkd2FyZSBoZWFsdGgKKwkgIG9mIGEgc3lzdGVtLiBNb3N0IG1vZGVybiBtb3RoZXJib2FyZHMgaW5jbHVkZSBzdWNoIGEgZGV2aWNlLiBJdAorCSAgY2FuIGluY2x1ZGUgdGVtcGVyYXR1cmUgc2Vuc29ycywgdm9sdGFnZSBzZW5zb3JzLCBmYW4gc3BlZWQKKwkgIHNlbnNvcnMgYW5kIHZhcmlvdXMgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBhYmlsaXR5IHRvCisJICBjb250cm9sIHRoZSBzcGVlZCBvZiB0aGUgZmFucy4KKworY29uZmlnIFNFTlNPUlNfQURNMTAyMQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjEKKwkgIGFuZCBBRE0xMDIzIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBNYXhpbSBNQVgxNjE3IGFuZCBNQVgxNjE3QSwKKwkgIEdlbmVzeXMgTG9naWMgR0w1MjNTTSwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg0LCBUSSBUSE1DMTAsCisJICBhbmQgdGhlIFhFT04gcHJvY2Vzc29yIGJ1aWx0LWluIHNlbnNvci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyMS4KKworY29uZmlnIFNFTlNPUlNfQURNMTAyNQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI1IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDI1CisJICBhbmQgUGhpbGlwcyBORTE2MTkgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDI1LgorCitjb25maWcgU0VOU09SU19BRE0xMDI2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjYgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjYKKwkgIHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDI2LgorCitjb25maWcgU0VOU09SU19BRE0xMDMxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMzEgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMzEKKwkgIGFuZCBBRE0xMDMwIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAzMS4KKworY29uZmlnIFNFTlNPUlNfQURNOTI0MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE05MjQwIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE05MjQwLAorCSAgRGFsbGFzIERTMTc4MCwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgxIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtOTI0MC4KKworY29uZmlnIFNFTlNPUlNfQVNCMTAwCisJdHJpc3RhdGUgIkFzdXMgQVNCMTAwIEJhY2giCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFTQjEwMCBCYWNoIHNlbnNvcgorCSAgY2hpcCBmb3VuZCBvbiBzb21lIEFzdXMgbWFpbmJvYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXNiMTAwLgorCitjb25maWcgU0VOU09SU19BVFhQMQorCXRyaXN0YXRlICJBdHRhbnNpYyBBVFhQMSBWSUQgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQXR0YW5zaWMgQVRYUDEgVklECisJICBjb250cm9sbGVyLgorCisJICBJZiB5b3VyIGJvYXJkIGhhdmUgc3VjaCBhIGNoaXAsIHlvdSBhcmUgYWJsZSB0byBjb250cm9sIHlvdXIgQ1BVCisJICBjb3JlIGFuZCBvdGhlciB2b2x0YWdlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXR4cDEuCisKK2NvbmZpZyBTRU5TT1JTX0RTMTYyMQorCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzE2MjEgYW5kIERTMTYyNSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgorCSAgRFMxNjIxIGFuZCBEUzE2MjUgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkczE2MjEuCisKK2NvbmZpZyBTRU5TT1JTX0ZTQ0hFUgorCXRyaXN0YXRlICJGU0MgSGVybWVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucworCSAgQ29tcHV0ZXJzIEhlcm1lcyBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGZzY2hlci4KKworY29uZmlnIFNFTlNPUlNfRlNDUE9TCisJdHJpc3RhdGUgIkZTQyBQb3NlaWRvbiIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKKwkgIENvbXB1dGVycyBQb3NlaWRvbiBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGZzY3Bvcy4KKworY29uZmlnIFNFTlNPUlNfR0w1MThTTQorCXRyaXN0YXRlICJHZW5lc3lzIExvZ2ljIEdMNTE4U00iCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHZW5lc3lzIExvZ2ljIEdMNTE4U00KKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2w1MThzbS4KKworY29uZmlnIFNFTlNPUlNfR0w1MjBTTQorCXRyaXN0YXRlICJHZW5lc3lzIExvZ2ljIEdMNTIwU00iCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUyMFNNCisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdsNTIwc20uCisKK2NvbmZpZyBTRU5TT1JTX0lUODcKKwl0cmlzdGF0ZSAiSVRFIElUODd4eCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBJVEUgSVQ4N3h4IHNlbnNvciBjaGlwcworCSAgYW5kIGNsb25lczogU2lTOTYwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpdDg3LgorCitjb25maWcgU0VOU09SU19MTTYzCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE02MyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgTE02MyByZW1vdGUgZGlvZGUgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3Igd2l0aCBpbnRlZ3JhdGVkIGZhbgorCSAgY29udHJvbC4gIFN1Y2ggY2hpcHMgYXJlIGZvdW5kIG9uIHRoZSBUeWFuIFM0ODgyIChUaHVuZGVyIEs4UVMgUHJvKQorCSAgbW90aGVyYm9hcmQsIGFtb25nIG90aGVycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG02My4KKworY29uZmlnIFNFTlNPUlNfTE03NQorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1CisJICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogRGFsbGFzIFNlbWljb25kdWN0b3IgRFM3NSBhbmQgRFMxNzc1IChpbgorCSAgOS1iaXQgcHJlY2lzaW9uIG1vZGUpLCBhbmQgVGVsQ29tIChub3cgTWljcm9jaGlwKSBUQ043NS4KKworCSAgVGhlIERTNzUgYW5kIERTMTc3NSBpbiAxMC0gdG8gMTItYml0IHByZWNpc2lvbiBtb2RlcyB3aWxsIHJlcXVpcmUKKwkgIGEgZm9yY2UgbW9kdWxlIHBhcmFtZXRlci4gVGhlIGRyaXZlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4dHJhCisJICBwcmVjaXNpb24gYW55aG93LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTc1LgorCitjb25maWcgU0VOU09SU19MTTc3CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzcKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03Ny4KKworY29uZmlnIFNFTlNPUlNfTE03OAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCwKKwkgIExNNzgtSiBhbmQgTE03OS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03OC4KKworY29uZmlnIFNFTlNPUlNfTE04MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODAiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgTE04MCBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODAuCisKK2NvbmZpZyBTRU5TT1JTX0xNODMKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgTE04MyBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODMuCisKK2NvbmZpZyBTRU5TT1JTX0xNODUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODUKKwkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBBRFQ3NDYzLCBFTUM2RDEwMCwgRU1DNkQxMDIgYW5kIEFETTEwMjcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODUuCisKK2NvbmZpZyBTRU5TT1JTX0xNODcKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg3IgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NworCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTg3LgorCitjb25maWcgU0VOU09SU19MTTkwCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAsCisJICBMTTg2LCBMTTg5IGFuZCBMTTk5LCBBbmFsb2cgRGV2aWNlcyBBRE0xMDMyIGFuZCBNYXhpbSBNQVg2NjU3IGFuZAorCSAgTUFYNjY1OCBzZW5zb3IgY2hpcHMuCisKKwkgIFRoZSBBbmFsb2cgRGV2aWNlcyBBRFQ3NDYxIHNlbnNvciBjaGlwIGlzIGFsc28gc3VwcG9ydGVkLCBidXQgb25seQorCSAgaWYgZm91bmQgaW4gQURNMTAzMiBjb21wYXRpYmlsaXR5IG1vZGUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtOTAuCisKK2NvbmZpZyBTRU5TT1JTX0xNOTIKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIKKwkgIGFuZCBNYXhpbSBNQVg2NjM1IHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG05Mi4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYxOQorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjE5IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2MTkgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MTkuCisKK2NvbmZpZyBTRU5TT1JTX1BDODczNjAKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzYwIGZhbWlseSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZworCSAgZnVuY3Rpb25zIG9mIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNnggU3VwZXItSS9PIGNoaXBzLgorCSAgVGhlIFBDODczNjAsIFBDODczNjMgYW5kIFBDODczNjQgb25seSBoYXZlIGZhbiBtb25pdG9yaW5nIGFuZAorCSAgY29udHJvbC4gIFRoZSBQQzg3MzY1IGFuZCBQQzg3MzY2IGFkZGl0aW9uYWxseSBoYXZlIHZvbHRhZ2UgYW5kCisJICB0ZW1wZXJhdHVyZSBtb25pdG9yaW5nLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBwYzg3MzYwLgorCitjb25maWcgU0VOU09SU19TSVM1NTk1CisJdHJpc3RhdGUgIlNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAuIFNpUzU1OTUiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgc2Vuc29ycyBpbgorCSAgU2lTNTU5NSBTb3V0aCBCcmlkZ2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaXM1NTk1LgorCitjb25maWcgU0VOU09SU19TTVNDNDdNMQorCXRyaXN0YXRlICJTTVNDIExQQzQ3TTEweCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBmYW4KKwkgIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wgY2FwYWJpbGl0aWVzIG9mIHRoZSBTTVNDIExQQzQ3QjI3eCwKKwkgIExQQzQ3TTEweCwgTFBDNDdNMTN4LCBMUEM0N00xNHgsIExQQzQ3TTE1eCBhbmQgTFBDNDdNMTkyIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbXNjNDdtMS4KKworY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NworCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQworCSAgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCisKK2NvbmZpZyBTRU5TT1JTX1ZJQTY4NkEKKwl0cmlzdGF0ZSAiVklBNjg2QSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBQQ0kKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIHNlbnNvcnMgaW4KKwkgIFZpYSA2ODZBL0IgU291dGggQnJpZGdlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdmlhNjg2YS4KKworY29uZmlnIFNFTlNPUlNfVzgzNzgxRAorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MsIFc4MzYyN0hGLCBBc3VzIEFTOTkxMjdGIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNzh4IHNlcmllcworCSAgb2Ygc2Vuc29yIGNoaXBzOiB0aGUgVzgzNzgxRCwgVzgzNzgyRCwgVzgzNzgzUyBhbmQgVzgzNjI3SEYsCisJICBhbmQgdGhlIHNpbWlsYXIgQXN1cyBBUzk5MTI3Ri4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNzgxZC4KKworY29uZmlnIFNFTlNPUlNfVzgzTDc4NVRTCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzTDc4NVRTLVMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzTDc4NVRTLVMKKwkgIHNlbnNvciBjaGlwLCB3aGljaCBpcyB1c2VkIG9uIHRoZSBBc3VzIEE3TjhYLCBhbW9uZyBvdGhlcgorCSAgbW90aGVyYm9hcmRzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODNsNzg1dHMuCisKK2NvbmZpZyBTRU5TT1JTX1c4MzYyN0hGCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIFc4MzY5N0hGIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNlg3IHNlcmllcworCSAgb2Ygc2Vuc29yIGNoaXBzOiB0aGUgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIGFuZCB0aGUgVzgzNjk3SEYKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3aGYuCisKK2NvbmZpZyBTRU5TT1JTX1c4MzYyN0VIRgorCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0VIRiIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZQorCSAgbW9uaXRvcmluZyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBXaW5ib25kIFc4MzYyN0VIRiBTdXBlci1JL08gY2hpcC4KKwkgIE9ubHkgZmFuIGFuZCB0ZW1wZXJhdHVyZSBpbnB1dHMgYXJlIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LCB3aGlsZQorCSAgdGhlIGNoaXAgZG9lcyBtdWNoIG1vcmUgdGhhbiB0aGF0LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODM2MjdlaGYuCisKK2NvbmZpZyBIV01PTl9ERUJVR19DSElQCisJYm9vbCAiSGFyZHdhcmUgTW9uaXRvcmluZyBDaGlwIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwlkZXBlbmRzIG9uIEhXTU9OCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgSTJDIGNoaXAgZHJpdmVycyB0byBwcm9kdWNlIGEgYnVuY2ggb2YKKwkgIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gbG9nLiAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSBoYXZpbmcKKwkgIGEgcHJvYmxlbSB3aXRoIEkyQyBzdXBwb3J0IGFuZCB3YW50IHRvIHNlZSBtb3JlIG9mIHdoYXQgaXMgZ29pbmcKKwkgIG9uLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzgxNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIE1ha2VmaWxlIGZvciBzZW5zb3IgY2hpcCBkcml2ZXJzLgorIworCisjIGFzYjEwMCwgdGhlbiB3ODM3ODFkIGdvIGZpcnN0LCBhcyB0aGV5IGNhbiBvdmVycmlkZSBvdGhlciBkcml2ZXJzJyBhZGRyZXNzZXMuCitvYmotJChDT05GSUdfU0VOU09SU19BU0IxMDApCSs9IGFzYjEwMC5vCitvYmotJChDT05GSUdfU0VOU09SU19XODM2MjdIRikJKz0gdzgzNjI3aGYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNzgxRCkJKz0gdzgzNzgxZC5vCisKK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNSkJKz0gYWRtMTAyNS5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI2KQkrPSBhZG0xMDI2Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMzEpCSs9IGFkbTEwMzEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNOTI0MCkJKz0gYWRtOTI0MC5vCitvYmotJChDT05GSUdfU0VOU09SU19BVFhQMSkJKz0gYXR4cDEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRFMxNjIxKQkrPSBkczE2MjEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRlNDSEVSKQkrPSBmc2NoZXIubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRlNDUE9TKQkrPSBmc2Nwb3Mubworb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MThTTSkJKz0gZ2w1MThzbS5vCitvYmotJChDT05GSUdfU0VOU09SU19HTDUyMFNNKQkrPSBnbDUyMHNtLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0lUODcpCSs9IGl0ODcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE02MykJKz0gbG02My5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTc1KQkrPSBsbTc1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzcpCSs9IGxtNzcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03OCkJKz0gbG03OC5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTgwKQkrPSBsbTgwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODMpCSs9IGxtODMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NSkJKz0gbG04NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTg3KQkrPSBsbTg3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNOTApCSs9IGxtOTAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MikJKz0gbG05Mi5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjE5KQkrPSBtYXgxNjE5Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU0lTNTU5NSkJKz0gc2lzNTU5NS5vCitvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3KSs9IHNtc2M0N2IzOTcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEpCSs9IHNtc2M0N20xLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1ZJQTY4NkEpCSs9IHZpYTY4NmEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGKQkrPSB3ODM2MjdlaGYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubworCitpZmVxICgkKENPTkZJR19IV01PTl9ERUJVR19DSElQKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjEuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDIxLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYWRtMTAyMS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI1LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNi5jIGIvZHJpdmVycy9od21vbi9hZG0xMDI2LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjYuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hZG0xMDI2LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMzEuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAzMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDMxLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYWRtMTAzMS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG05MjQwLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTkyNDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYWRtOTI0MC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FkbTkyNDAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hc2IxMDAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hc2IxMDAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYXR4cDEuYyBiL2RyaXZlcnMvaHdtb24vYXR4cDEuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hdHhwMS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2F0eHAxLmMKaW5kZXggNWM2NTk3YS4uMGJjZjgyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvYXR4cDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2F0eHAxLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCWlmICh2aWQgPT0gY3ZpZCkKIAkJcmV0dXJuIGNvdW50OwogCi0JZGV2X2luZm8oZGV2LCAiU2V0dGluZyBWQ29yZSB0byAlZCBtViAoMHglMDJ4KVxuIiwgdmNvcmUsIHZpZCk7CisJZGV2X2RiZyhkZXYsICJTZXR0aW5nIFZDb3JlIHRvICVkIG1WICgweCUwMngpXG4iLCB2Y29yZSwgdmlkKTsKIAogCS8qIFdyaXRlIGV2ZXJ5IDI1IG1WIHN0ZXAgdG8gaW5jcmVhc2Ugc3RhYmlsaXR5ICovCiAJaWYgKGN2aWQgPiB2aWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZHMxNjIxLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZHMxNjIxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jIGIvZHJpdmVycy9od21vbi9mc2NoZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjaGVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjaGVyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY3Bvcy5jIGIvZHJpdmVycy9od21vbi9mc2Nwb3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjcG9zLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYyBiL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9nbDUxOHNtLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZ2w1MThzbS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9nbDUyMHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZ2w1MjBzbS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2l0ODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9pdDg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNjMuYyBiL2RyaXZlcnMvaHdtb24vbG02My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG02My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oIGIvZHJpdmVycy9od21vbi9sbTc1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtNzUuaApyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTc1LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTc3LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG03Ny5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03OC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jIGIvZHJpdmVycy9od21vbi9sbTgwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTgwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYyBiL2RyaXZlcnMvaHdtb24vbG04My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTgzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG04My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTg1LmMgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtODUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG05MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTkyLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtOTIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jIGIvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL21heDE2MTkuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9tYXgxNjE5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9wYzg3MzYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcGM4NzM2MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N2IzOTcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jIGIvZHJpdmVycy9od21vbi92aWE2ODZhLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCAxMzdkOWI3Li4xNjRkNDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy92aWE2ODZhLmMKKysrIGIvZHJpdmVycy9od21vbi92aWE2ODZhLmMKQEAgLTEsOSArMSw5IEBACiAvKgogICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKLSAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwogCiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKKwkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKIAkJCU1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCiAJCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+CiAgICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwpAQCAtMTcxLDE4ICsxNzEsMTggQEAKIC8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCiAvKiBsaW5lYXIgZml0cyBmcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpCiAgICAgICBpZih0ZW1wPDE2OSkKLSAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKKwkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNDI3LTMyLjA4OwogICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQotICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OworCSAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CiAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOworCSAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOwogCiAgQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KICBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+KSBhIGJpdCBiZXR0ZXIuICBJdCBhbHNvIGdpdmUgbW9yZSByZWFzb25hYmxlCiAgbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCiAgSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiAgdGVtcCA9IDEuNjI1MDkzZS0xMCp2YWxeNSAtIDEuMDAxNjMyZS0wNyp2YWxeNCArIDIuNDU3NjUzZS0wNSp2YWxeMyAtCi0gICAgICAgIDIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KKwkyLjk2NzYxOWUtMDMqdmFsXjIgKyAyLjE3NTE0NGUtMDEqdmFsIC0gNy4wOTAwNjdlKzAuCiAKICAoMjAwMC0xMC0yNS0gUkZEOiB0aGFua3MgdG8gVXdlIEFuZGVyc2VuIDx1YW5kZXJzZW5AbWF5YWguY29tPiBmb3IKICBmaW5kaW5nIG15IHR5cG9zIGluIHRoaXMgZm9ybXVsYSEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3c4MzYyN2VoZi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODM3ODFkLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODNsNzg1dHMuYyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3c4M2w3ODV0cy5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCmluZGV4IDY4ZTllNjguLmU2Y2FlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJZ290byBiYWlsb3V0OwogCX0KIAlzZGFsbyhhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjEgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6MSBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwICE9IGdldHNkYShhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHN0dWNrIGhpZ2ghXG4iLG5hbWUpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCWdvdG8gYmFpbG91dDsKIAl9CQkKIAlzZGFoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjIgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6MiBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHN0dWNrIGxvdyFcbiIsbmFtZSk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAlnb3RvIGJhaWxvdXQ7CiAJfQogCXNjbGxvKGFkYXApOwotCXByaW50aygidGVzdF9idXM6MyBzY2w6ICVkICBzZGE6ICVkIFxuIixnZXRzY2woYWRhcCksCisJcHJpbnRrKCJ0ZXN0X2J1czozIHNjbDogJWQgIHNkYTogJWRcbiIsIGdldHNjbChhZGFwKSwKIAkgICAgICAgZ2V0c2RhKGFkYXApKTsKIAlpZiAoIDAgIT0gZ2V0c2NsKGFkYXApICkgewogCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJZ290byBiYWlsb3V0OwogCX0KIAlzY2xoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjQgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6NCBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwID09IGdldHNjbChhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0NMIHN0dWNrIGxvdyFcbiIsbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDQ1ZTZlZmIxLi4wYWI3ZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBTTUJ1cyBob3N0IGlzIHJlYWR5IHRvIHN0YXJ0IHRyYW5zbWl0dGluZyAqLwogCS8qIDB4MWYgPSBGYWlsZWQsIEJ1c19FcnIsIERldl9FcnIsIEludHIsIEhvc3RfQnVzeSAqLwogCWlmICgodGVtcCA9ICgweDFmICYgaW5iX3AoU01CSFNUU1RTKSkpICE9IDB4MDApIHsKLQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIlNNQnVzIGJ1c3kgKCUwMngpLiBSZXNldHRpbmcuLi4gXG4iLAorCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuIFJlc2V0dGluZy4uLlxuIiwKIAkJCXRlbXApOwogCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJaWYgKCh0ZW1wID0gKDB4MWYgJiBpbmJfcChTTUJIU1RTVFMpKSkgIT0gMHgwMCkgewpAQCAtMzE1LDcgKzMxNSw3IEBACiAJCX0KIAkJaWYgKHRlbXAgJiBlcnJtYXNrKSB7CiAJCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKLQkJCQkiUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCQkJIlJlc2V0dGluZy4uLlxuIiwgdGVtcCk7CiAJCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJCWlmICgoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIGVycm1hc2spICE9IDB4MDApIHsKIAkJCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwppbmRleCAzNjNlNTQ1Li45NGFlODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwpAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNyZWF0ZV9pZmFjZV9tYWNpbyhzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitjcmVhdGVfaWZhY2VfbWFjaW8oc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlyZXR1cm4gY3JlYXRlX2lmYWNlKGRldi0+b2ZkZXYubm9kZSwgJmRldi0+b2ZkZXYuZGV2KTsKIH0KQEAgLTcxMCw3ICs3MTAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1jcmVhdGVfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorY3JlYXRlX2lmYWNlX29mX3BsYXRmb3JtKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm5vZGUsICZkZXYtPmRldik7CiB9CkBAIC03MjEsMTAgKzcyMSw5IEBACiAJcmV0dXJuIGRpc3Bvc2VfaWZhY2UoJmRldi0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCiB7CiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImkyYyIsCiAJLmNvbXBhdGlibGUJPSAia2V5d2VzdCIKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCmluZGV4IDFmODBiYTkuLjZkMzRlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KIAlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAhPSAweDAwKSB7CiAJCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKLQkJCSJSZXNldHRpbmcuLi4gXG4iLCB0ZW1wKTsKKwkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgIT0gMHgwMCkgewogCQkJZGV2X2VycigmcGlpeDRfYWRhcHRlci5kZXYsICJGYWlsZWQhICglMDJ4KVxuIiwgdGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IDJiNTkxMWMuLmJiZDVlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0yMjgsNyArMjI4LDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCiAJdGVtcCA9IHNpczU1OTVfcmVhZChTTUJfU1RTX0xPKSArIChzaXM1NTk1X3JlYWQoU01CX1NUU19ISSkgPDwgOCk7CiAJaWYgKHRlbXAgIT0gMHgwMCkgewotCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJ1cyBidXN5ICglMDR4KS4gUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwNHgpLiBSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlzaXM1NTk1X3dyaXRlKFNNQl9TVFNfTE8sIHRlbXAgJiAweGZmKTsKIAkJc2lzNTU5NV93cml0ZShTTUJfU1RTX0hJLCB0ZW1wID4+IDgpOwogCQlpZiAoKHRlbXAgPSBzaXM1NTk1X3JlYWQoU01CX1NUU19MTykgKyAoc2lzNTU5NV9yZWFkKFNNQl9TVFNfSEkpIDw8IDgpKSAhPSAweDAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCBhMDk4MmRhLi40M2Y3MGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTEsNDA5ICsxLDEyIEBACiAjCi0jIEkyQyBTZW5zb3IgYW5kICJvdGhlciIgY2hpcCBjb25maWd1cmF0aW9uCisjIE1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIkhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDCi0KIGNvbmZpZyBJMkNfU0VOU09SCiAJdHJpc3RhdGUKIAlkZWZhdWx0IG4KIAotY29uZmlnIFNFTlNPUlNfQURNMTAyMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjEgCi0JICBhbmQgQURNMTAyMyBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogTWF4aW0gTUFYMTYxNyBhbmQgTUFYMTYxN0EsCi0JICBHZW5lc3lzIExvZ2ljIEdMNTIzU00sIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NCwgVEkgVEhNQzEwLAotCSAgYW5kIHRoZSBYRU9OIHByb2Nlc3NvciBidWlsdC1pbiBzZW5zb3IuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjEuCi0KLWNvbmZpZyBTRU5TT1JTX0FETTEwMjUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQotCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNS4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAyNgotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI2IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDI2Ci0JICBzZW5zb3IgY2hpcC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNi4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAzMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIAotCSAgYW5kIEFETTEwMzAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG0xMDMxLgotCi1jb25maWcgU0VOU09SU19BRE05MjQwCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTkyNDAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTkyNDAsCi0JICBEYWxsYXMgRFMxNzgwLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODEgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG05MjQwLgotCi1jb25maWcgU0VOU09SU19BU0IxMDAKLQl0cmlzdGF0ZSAiQXN1cyBBU0IxMDAgQmFjaCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQVNCMTAwIEJhY2ggc2Vuc29yCi0JICBjaGlwIGZvdW5kIG9uIHNvbWUgQXN1cyBtYWluYm9hcmRzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhc2IxMDAuCi0KLWNvbmZpZyBTRU5TT1JTX0FUWFAxCi0JdHJpc3RhdGUgIkF0dGFuc2ljIEFUWFAxIFZJRCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQXR0YW5zaWMgQVRYUDEgVklECi0JICBjb250cm9sbGVyLgotCi0JICBJZiB5b3VyIGJvYXJkIGhhdmUgc3VjaCBhIGNoaXAsIHlvdSBhcmUgYWJsZSB0byBjb250cm9sIHlvdXIgQ1BVCi0JICBjb3JlIGFuZCBvdGhlciB2b2x0YWdlcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYXR4cDEuCi0KLWNvbmZpZyBTRU5TT1JTX0RTMTYyMQotCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzE2MjEgYW5kIERTMTYyNSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotCSAgRFMxNjIxIGFuZCBEUzE2MjUgc2Vuc29yIGNoaXBzLiAKLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZHMxNjIxLgotCi1jb25maWcgU0VOU09SU19GU0NIRVIKLQl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKLQkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCi0KLWNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwotCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCi0JICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2Nwb3MuCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTE4U00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUxOFNNIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUxOFNNCi0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGdsNTE4c20uCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTIwU00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUyMFNNIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MjBTTQotCSAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgotCi1jb25maWcgU0VOU09SU19JVDg3Ci0JdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODd4eCBzZW5zb3IgY2hpcHMKLQkgIGFuZCBjbG9uZXM6IFNpUzk2MC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KLQotY29uZmlnIFNFTlNPUlNfTE02MwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNNjMgcmVtb3RlIGRpb2RlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIHdpdGggaW50ZWdyYXRlZCBmYW4KLQkgIGNvbnRyb2wuICBTdWNoIGNoaXBzIGFyZSBmb3VuZCBvbiB0aGUgVHlhbiBTNDg4MiAoVGh1bmRlciBLOFFTIFBybykKLQkgIG1vdGhlcmJvYXJkLCBhbW9uZyBvdGhlcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNjMuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzUKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NQotCSAgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IERhbGxhcyBTZW1pY29uZHVjdG9yIERTNzUgYW5kIERTMTc3NSAoaW4KLQkgIDktYml0IHByZWNpc2lvbiBtb2RlKSwgYW5kIFRlbENvbSAobm93IE1pY3JvY2hpcCkgVENONzUuCi0KLQkgIFRoZSBEUzc1IGFuZCBEUzE3NzUgaW4gMTAtIHRvIDEyLWJpdCBwcmVjaXNpb24gbW9kZXMgd2lsbCByZXF1aXJlCi0JICBhIGZvcmNlIG1vZHVsZSBwYXJhbWV0ZXIuIFRoZSBkcml2ZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleHRyYQotCSAgcHJlY2lzaW9uIGFueWhvdy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG03NS4KLQotY29uZmlnIFNFTlNPUlNfTE03NwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzciCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3Ci0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzcuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzgKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzgsCi0JICBMTTc4LUogYW5kIExNNzkuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzguCi0KLWNvbmZpZyBTRU5TT1JTX0xNODAKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgwIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgwLgotCi1jb25maWcgU0VOU09SU19MTTgzCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgzLgotCi1jb25maWcgU0VOU09SU19MTTg1Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1Ci0JICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogQURUNzQ2MywgRU1DNkQxMDAsIEVNQzZEMTAyIGFuZCBBRE0xMDI3LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTg1LgotCi1jb25maWcgU0VOU09SU19MTTg3Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KLQotY29uZmlnIFNFTlNPUlNfTE05MAotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAotCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKLQkgIE1BWDY2NTggc2Vuc29yIGNoaXBzLgotCi0JICBUaGUgQW5hbG9nIERldmljZXMgQURUNzQ2MSBzZW5zb3IgY2hpcCBpcyBhbHNvIHN1cHBvcnRlZCwgYnV0IG9ubHkKLQkgIGlmIGZvdW5kIGluIEFETTEwMzIgY29tcGF0aWJpbGl0eSBtb2RlLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTkwLgotCi1jb25maWcgU0VOU09SU19MTTkyCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyCi0JICBhbmQgTWF4aW0gTUFYNjYzNSBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtOTIuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MTkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgotCSAgCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgotCi1jb25maWcgU0VOU09SU19QQzg3MzYwCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzZ4IFN1cGVyLUkvTyBjaGlwcy4KLQkgIFRoZSBQQzg3MzYwLCBQQzg3MzYzIGFuZCBQQzg3MzY0IG9ubHkgaGF2ZSBmYW4gbW9uaXRvcmluZyBhbmQKLQkgIGNvbnRyb2wuICBUaGUgUEM4NzM2NSBhbmQgUEM4NzM2NiBhZGRpdGlvbmFsbHkgaGF2ZSB2b2x0YWdlIGFuZAotCSAgdGVtcGVyYXR1cmUgbW9uaXRvcmluZy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzM2MC4KLQotY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NwotCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQwotCSAgc2Vuc29yIGNoaXAuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCi0KLWNvbmZpZyBTRU5TT1JTX1NJUzU1OTUKLQl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBTaVM1NTk1IFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCi0KLWNvbmZpZyBTRU5TT1JTX1NNU0M0N00xCi0JdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgotCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAotCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xLgotCi1jb25maWcgU0VOU09SU19WSUE2ODZBCi0JdHJpc3RhdGUgIlZJQTY4NkEiCi0JZGVwZW5kcyBvbiBJMkMgJiYgUENJCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBWaWEgNjg2QS9CIFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHZpYTY4NmEuCi0KLWNvbmZpZyBTRU5TT1JTX1c4Mzc4MUQKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM3ODFELCBXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRiwgQXN1cyBBUzk5MTI3RiIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4eCBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MgYW5kIFc4MzYyN0hGLAotCSAgYW5kIHRoZSBzaW1pbGFyIEFzdXMgQVM5OTEyN0YuCi0JICAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc4MWQuCi0KLWNvbmZpZyBTRU5TT1JTX1c4M0w3ODVUUwotCXRyaXN0YXRlICJXaW5ib25kIFc4M0w3ODVUUy1TIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4M0w3ODVUUy1TCi0JICBzZW5zb3IgY2hpcCwgd2hpY2ggaXMgdXNlZCBvbiB0aGUgQXN1cyBBN044WCwgYW1vbmcgb3RoZXIKLQkgIG1vdGhlcmJvYXJkcy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzbDc4NXRzLgotCi1jb25maWcgU0VOU09SU19XODM2MjdIRgotCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBXODM2OTdIRiIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4MzZYNyBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBhbmQgdGhlIFc4MzY5N0hGCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2hmLgotCi1jb25maWcgU0VOU09SU19XODM2MjdFSEYKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdFSEYiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKLQkgIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSBvZiB0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAuCi0JICBPbmx5IGZhbiBhbmQgdGVtcGVyYXR1cmUgaW5wdXRzIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCwgd2hpbGUKLQkgIHRoZSBjaGlwIGRvZXMgbXVjaCBtb3JlIHRoYW4gdGhhdC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3ZWhmLgotCi1lbmRtZW51Ci0KLW1lbnUgIk90aGVyIEkyQyBDaGlwIHN1cHBvcnQiCittZW51ICJNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNFTlNPUlNfRFMxMzM3CkBAIC01MDksNyArMTEyLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRwczY1MDEwLgogCi0KIGNvbmZpZyBTRU5TT1JTX000MVQwMAogCXRyaXN0YXRlICJTVCBNNDFUMDAgUlRDIGNoaXAiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUFBDMzIKQEAgLTUyMCwxMyArMTIyLDE2IEBACiAJICB3aWxsIGJlIGNhbGxlZCBtNDF0MDAuCiAKIGNvbmZpZyBTRU5TT1JTX01BWDY4NzUKLQl0cmlzdGF0ZSAiTUFYSU0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1BWDY4NzUKLQkgIEVFUFJPTS1Qcm9ncmFtbWFibGUsIEhleC9RdWFkLCBQb3dlci1TdXBweSBTZXF1ZW5jZXJzL1N1cGVydmlzb3JzLgorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVg2ODc1CisJICBFRVBST00tcHJvZ3JhbW1hYmxlLCBxdWFkIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIvc3VwZXJ2aXNvci4KIAotICAgICAgICAgIFRoaXMgcHJvdmlkZXMgYSBpbnRlcmZhY2UgdG8gcHJvZ3JhbSB0aGUgRUVQUk9NIGFuZCByZXNldCB0aGUgY2hpcC4KKwkgIFRoaXMgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHByb2dyYW0gdGhlIEVFUFJPTSBhbmQgcmVzZXQgdGhlIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE1heGltIE1BWDY4NzQgaGV4IHBvd2VyLXN1cHBseQorCSAgc2VxdWVuY2VyL3N1cGVydmlzb3IgaWYgZm91bmQgYXQgYSBjb21wYXRpYmxlIGFkZHJlc3MuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1heDY4NzUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IGI1ZTZkMmYuLmE4NzZkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xLDUyICsxLDE2IEBACiAjCi0jIE1ha2VmaWxlIGZvciBzZW5zb3IgYW5kICJvdGhlciIgSTJDIGNoaXAgZHJpdmVycy4KKyMgTWFrZWZpbGUgZm9yIG1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycy4KICMKIAotIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubwotCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNikJKz0gYWRtMTAyNi5vCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDMxKQkrPSBhZG0xMDMxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTkyNDApCSs9IGFkbTkyNDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTMzNykJKz0gZHMxMzM3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTM3NCkJKz0gZHMxMzc0Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VFUFJPTSkJKz0gZWVwcm9tLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0dMNTE4U00pCSs9IGdsNTE4c20ubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MjBTTSkJKz0gZ2w1MjBzbS5vCi1vYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MCkJKz0gbG04MC5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTgzKQkrPSBsbTgzLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNODUpCSs9IGxtODUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NykJKz0gbG04Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2ODc1KQkrPSBtYXg2ODc1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX000MVQwMCkJKz0gbTQxdDAwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENBOTUzOSkJKz0gcGNhOTUzOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTc0KQkrPSBwY2Y4NTc0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUlRDODU2NCkJKz0gcnRjODU2NC5vCi1vYmotJChDT05GSUdfU0VOU09SU19TSVM1NTk1KQkrPSBzaXM1NTk1Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcpKz0gc21zYzQ3YjM5Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdNMSkJKz0gc21zYzQ3bTEubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVklBNjg2QSkJKz0gdmlhNjg2YS5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODM2MjdFSEYpCSs9IHc4MzYyN2VoZi5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCi0KIG9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCiBvYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKaW5kZXggYWRkZjBhZC4uNmVhNDEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKQEAgLTE3Myw5ICsxNzMsNiBAQAogCQkJCQkgICAgfCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKIAkJZ290byBleGl0OwogCi0JLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKLQkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KLQkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBlZXByb21fe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLwogCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWVwcm9tX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwppbmRleCA1ZTQ2M2M0Ny4uNzc4ZDdlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCWludAlyYzsKIAogCWlmICgocmMgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSA9PSAwKSB7Ci0JCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwkJa2ZyZWUoY2xpZW50KTsKIAkJdGFza2xldF9raWxsKCZtNDF0MDBfdGFza2xldCk7CiAJfQogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYwppbmRleCBmZTZiMTUwLi5jNGYxNGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jCkBAIC0zNyw3ICszNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsweDUwLCAweDUyLCBJMkNfQ0xJRU5UX0VORH07CisvKiBObyBhZGRyZXNzIHNjYW5uZWQgYnkgZGVmYXVsdCwgYXMgdGhpcyBjb3VsZCBjb3JydXB0IHN0YW5kYXJkIEVFUFJPTVMuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0ge0kyQ19DTElFTlRfRU5EfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0ge0kyQ19DTElFTlRfSVNBX0VORH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCkBAIC0zNjksNiArMzcwLDkgQEAKIAluZXdfY2xpZW50LT5kcml2ZXIgPSAmbWF4Njg3NV9kcml2ZXI7CiAJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwogCisJLyogUHJldmVudCAyNFJGMDggY29ycnVwdGlvbiAqLworCWkyY19zbWJ1c193cml0ZV9xdWljayhuZXdfY2xpZW50LCAwKTsKKwogCS8qIFNldHVwIHRoZSB1c2VyIHNlY3Rpb24gKi8KIAlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fdXNlcl0udHlwZSAgICA9IG1heDY4NzVfZWVwcm9tX3VzZXI7CiAJZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX3VzZXJdLnNsaWNlcyAgPSBVU0VSX0VFUFJPTV9TTElDRVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwppbmRleCBjMGFjMDFiLi4yODBlOTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwotI3VuZGVmCURFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQ5LDExICs0OCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MDF4IFBvd2VyIE1hbmFnZW1lbnQgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLS8qIG9ubHkgdHdvIGFkZHJlc3NlcyBwb3NzaWJsZSAqLwotI2RlZmluZQlUUFNfQkFTRQkweDQ4Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gewotCVRQU19CQVNFLAotCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAvKiAweDQ5LCAqLyBJMkNfQ0xJRU5UX0VORCB9Owogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKIAogSTJDX0NMSUVOVF9JTlNNT0Q7CkBAIC0xMDIsNyArOTcsNyBAQAogCXU4CQkJY2hnc3RhdHVzLCByZWdzdGF0dXMsIGNoZ2NvbmY7CiAJdTgJCQlubWFzazEsIG5tYXNrMjsKIAotCS8qIHBsdXMgZm91ciBHUElPcywgcHJvYmFibHkgdXNlZCB0byBzd2l0Y2ggcG93ZXIgKi8KKwkvKiBub3QgY3VycmVudGx5IHRyYWNraW5nIEdQSU8gc3RhdGUgKi8KIH07CiAKICNkZWZpbmUJUE9XRVJfUE9MTF9ERUxBWQltc2Vjc190b19qaWZmaWVzKDgwMCkKQEAgLTEzNSw3ICsxMzAsNyBAQAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19DT1ZFUikgPyAiIHVuY292ZXIiIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX1VWTE8pID8gIiBVVkxPIiA6ICIiLAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19OT19DSEcpID8gIiBOT19DSEciIDogIiIsCi0JCShyZWdzdGF0dXMgJiBUUFNfUkVHX1BHX0xEMDIpID8gIiBsZDAxX2JhZCIgOiAiIiwKKwkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfTEQwMikgPyAiIGxkMDJfYmFkIiA6ICIiLAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19QR19MRDAxKSA/ICIgbGQwMV9iYWQiIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX1BHX01BSU4pID8gIiBtYWluX2JhZCIgOiAiIiwKIAkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfQ09SRSkgPyAiIGNvcmVfYmFkIiA6ICIiKTsKQEAgLTE0Myw3ICsxMzgsNyBAQAogCiBzdGF0aWMgdm9pZCBkYmdfY2hnY29uZihpbnQgcG9yLCBjaGFyICpidWYsIHNpemVfdCBsZW4sIHU4IGNoZ2NvbmZpZykKIHsKLQljaGFyICpoaWJpdDsKKwljb25zdCBjaGFyICpoaWJpdDsKIAogCWlmIChwb3IpCiAJCWhpYml0ID0gKGNoZ2NvbmZpZyAmIFRQU19DSEFSR0VfUE9SKQpAQCAtMjk1LDcgKzI5MCw3IEBACiAJc2VxX3ByaW50ZihzLCAiZGVmZ3BpbyAlMDJ4IG1hc2szICUwMnhcbiIsIHZhbHVlLCB2Mik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICh2YWx1ZSAmICgxIDw8ICg0ICtpKSkpCisJCWlmICh2YWx1ZSAmICgxIDw8ICg0ICsgaSkpKQogCQkJc2VxX3ByaW50ZihzLCAiICBncGlvJWQtb3V0ICVzXG4iLCBpICsgMSwKIAkJCQkodmFsdWUgJiAoMSA8PCBpKSkgPyAibG93IiA6ICJoaSAiKTsKIAkJZWxzZQpAQCAtNDgxLDcgKzQ3Niw3IEBACiAJZGVidWdmc19yZW1vdmUodHBzLT5maWxlKTsKIAlpZiAoaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSA9PSAwKQogCQlrZnJlZSh0cHMpOwotCXRoZV90cHMgPSAwOworCXRoZV90cHMgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC01MTQsNyArNTA5LDYgQEAKIAlJTklUX1dPUksoJnRwcy0+d29yaywgdHBzNjUwMTBfd29yaywgdHBzKTsKIAl0cHMtPmlycSA9IC0xOwogCXRwcy0+Y2xpZW50LmFkZHIgPSBhZGRyZXNzOwotCWkyY19zZXRfY2xpZW50ZGF0YSgmdHBzLT5jbGllbnQsIHRwcyk7CiAJdHBzLT5jbGllbnQuYWRhcHRlciA9IGJ1czsKIAl0cHMtPmNsaWVudC5kcml2ZXIgPSAmdHBzNjUwMTBfZHJpdmVyOwogCXN0cmxjcHkodHBzLT5jbGllbnQubmFtZSwgRFJJVkVSX05BTUUsIEkyQ19OQU1FX1NJWkUpOwpAQCAtNTIzLDkgKzUxNyw3IEBACiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2RiZygmYnVzLT5kZXYsICJjYW4ndCBhdHRhY2ggJXMgdG8gZGV2aWNlICVkLCBlcnIgJWRcbiIsCiAJCQkJRFJJVkVSX05BTUUsIGFkZHJlc3MsIHN0YXR1cyk7Ci1mYWlsMToKLQkJa2ZyZWUodHBzKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gZmFpbDE7CiAJfQogCiAjaWZkZWYJQ09ORklHX0FSTQpAQCAtNTM1LDcgKzUyNyw3IEBACiAJCXRwcy0+aXJxID0gT01BUF9HUElPX0lSUSg1OCk7CiAJCW9tYXBfcmVxdWVzdF9ncGlvKDU4KTsKIAkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNTgsIDEpOwotCQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg1OCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJCXNldF9pcnFfdHlwZSh0cHMtPmlycSwgSVJRVF9GQUxMSU5HKTsKIAl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewogCQl0cHMtPm1vZGVsID0gVFBTNjUwMTA7CkBAIC01NDMsNyArNTM1LDcgQEAKIAkJdHBzLT5pcnEgPSBPTUFQX0dQSU9fSVJRKE9NQVBfTVBVSU8oMSkpOwogCQlvbWFwX3JlcXVlc3RfZ3BpbyhPTUFQX01QVUlPKDEpKTsKIAkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oT01BUF9NUFVJTygxKSwgMSk7Ci0JCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKE9NQVBfTVBVSU8oMSksIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCQlzZXRfaXJxX3R5cGUodHBzLT5pcnEsIElSUVRfRkFMTElORyk7CiAJfQogCWlmIChtYWNoaW5lX2lzX29tYXBfaDMoKSkgewogCQl0cHMtPm1vZGVsID0gVFBTNjUwMTM7CkBAIC02MzMsNiArNjI1LDkgQEAKIAl0cHMtPmZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKERSSVZFUl9OQU1FLCBTX0lSVUdPLCBOVUxMLAogCQkJCXRwcywgREVCVUdfRk9QUyk7CiAJcmV0dXJuIDA7CitmYWlsMToKKwlrZnJlZSh0cHMpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB0cHM2NTAxMF9zY2FuX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmJ1cykKQEAgLTY0NSw3ICs2NDAsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczY1MDEwX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInRwczY1MDEwIiwKLQkuaWQJCT0gODg4LAkJLyogRklYTUUgYXNzaWduICJvZmZpY2lhbCIgdmFsdWUgKi8KIAkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSB0cHM2NTAxMF9zY2FuX2J1cywKIAkuZGV0YWNoX2NsaWVudAk9IF9fZXhpdF9wKHRwczY1MDEwX2RldGFjaF9jbGllbnQpLApAQCAtNzQ0LDcgKzczOCw3IEBACiAJaWYgKCF0aGVfdHBzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmKGxlZCA9PSBMRUQxKQorCWlmIChsZWQgPT0gTEVEMSkKIAkJb2ZmcyA9IDA7CiAJZWxzZSB7CiAJCW9mZnMgPSAyOwpAQCAtNzUzLDExICs3NDcsMTMgQEAKIAogCWRvd24oJnRoZV90cHMtPmxvY2spOwogCi0JZGV2X2RiZyAoJnRoZV90cHMtPmNsaWVudC5kZXYsICJsZWQlaV9vbiAgIDB4JTAyeFxuIiwgbGVkLAotCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX0xFRDFfT04gKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9vbiAgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfT04gKyBvZmZzKSk7CiAKLQlkZXZfZGJnICgmdGhlX3Rwcy0+Y2xpZW50LmRldiwgImxlZCVpX3BlciAgMHglMDJ4XG4iLCBsZWQsCi0JCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9wZXIgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfUEVSICsgb2ZmcykpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBPRkY6CkBAIC03NzMsNyArNzY5LDcgQEAKIAkJbGVkX3BlciA9IDB4MDggfCAoMSA8PCA3KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgbW9kZSBwYXJhbWV0ZXIgZm9yIHRwczY1MDEwX3NldF9sZWQoKVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgbW9kZSBwYXJhbWV0ZXIgZm9yIHNldF9sZWQoKVxuIiwKIAkJICAgICAgIERSSVZFUl9OQU1FKTsKIAkJdXAoJnRoZV90cHMtPmxvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc4OSw3ICs3ODUsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCWRldl9kYmcgKCZ0aGVfdHBzLT5jbGllbnQuZGV2LCAibGVkJWlfb24gICAweCUwMnhcbiIsIGxlZCwKKwlwcl9kZWJ1ZygiJXM6IGxlZCVpX29uICAgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwgbGVkLAogCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX0xFRDFfT04gKyBvZmZzKSk7CiAKIAlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCkBAIC04MDIsOCArNzk4LDkgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlkZXZfZGJnICgmdGhlX3Rwcy0+Y2xpZW50LmRldiwgImxlZCVpX3BlciAgMHglMDJ4XG4iLCBsZWQsCi0JCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9wZXIgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfUEVSICsgb2ZmcykpOwogCiAJdXAoJnRoZV90cHMtPmxvY2spOwogCkBAIC04NzQsNyArODcxLDcgQEAKIAogCWlmIChzdGF0dXMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHdyaXRlIHZkY2RjMSByZWdpc3RlclxuIiwKLQkJICAgICAgIERSSVZFUl9OQU1FKTsKKwkJCURSSVZFUl9OQU1FKTsKIAllbHNlCiAJCXByX2RlYnVnKCIlczogdmRjZGMxIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsCiAJCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX1ZEQ0RDMSkpOwpAQCAtOTAwLDE0ICs4OTcsMTQgQEAKIAlkb3duKCZ0aGVfdHBzLT5sb2NrKTsKIAogCXByX2RlYnVnKCIlczogdnJlZ3MxIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsCi0JCSAgICAgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19WUkVHUzEpKTsKKwkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfVlJFR1MxKSk7CiAKIAlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCiAJCQlUUFNfVlJFR1MxLCB2YWx1ZSk7CiAKIAlpZiAoc3RhdHVzICE9IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byB3cml0ZSB2cmVnczEgcmVnaXN0ZXJcbiIsCi0JCSAgICAgICAgRFJJVkVSX05BTUUpOworCQkJRFJJVkVSX05BTUUpOwogCWVsc2UKIAkJcHJfZGVidWcoIiVzOiB2cmVnczEgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwKIAkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfVlJFR1MxKSk7CkBAIC0xMDA5LDcgKzEwMDYsNyBAQAogCQltc2xlZXAoMTApOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTSkKKyNpZmRlZglDT05GSUdfQVJNCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewogCiAJCS8vIEZJWE1FOiBNb3JlIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IDUxY2UyNjguLjRmZDRmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyZXMgPSBpZHJfZ2V0X25ldygmaTJjX2FkYXB0ZXJfaWRyLCBOVUxMLCAmaWQpOworCXJlcyA9IGlkcl9nZXRfbmV3KCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAsICZpZCk7CiAJaWYgKHJlcyA8IDApIHsKIAkJaWYgKHJlcyA9PSAtRUFHQUlOKQogCQkJcmVzID0gLUVOT01FTTsKQEAgLTc2NSwyMCArNzY1LDE1IEBACiAKIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2dldF9hZGFwdGVyKGludCBpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOwogCQogCWRvd24oJmNvcmVfbGlzdHMpOwotCWxpc3RfZm9yX2VhY2goaXRlbSwmYWRhcHRlcnMpIHsKLQkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKLQkJaWYgKGlkID09IGFkYXB0ZXItPm5yICYmCi0JCSAgICB0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpIHsKLQkJCXVwKCZjb3JlX2xpc3RzKTsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0JfQorCWFkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyICopaWRyX2ZpbmQoJmkyY19hZGFwdGVyX2lkciwgaWQpOworCWlmIChhZGFwdGVyICYmICF0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpCisJCWFkYXB0ZXIgPSBOVUxMOworCiAJdXAoJmNvcmVfbGlzdHMpOwotCXJldHVybiBOVUxMOworCXJldHVybiBhZGFwdGVyOwogfQogCiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCAwMjczZjEyLi41ZjMzZGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTYwNiw2ICs2MDYsMTIgQEAKIAkgIDxodHRwOi8vd3d3Lml0ZS5jb20udHcvaWEvYnJpZWZfaXQ4MTcyYnNwLmh0bT47IHBpY3R1cmUgb2YgdGhlCiAJICBib2FyZCBhdCA8aHR0cDovL3d3dy5tdmlzdGEuY29tL3BhcnRuZXJzL3NlbWljb25kdWN0b3IvaXRlLmh0bWw+LgogCitjb25maWcgQkxLX0RFVl9JVDgyMVgKKwl0cmlzdGF0ZSAiSVQ4MjFYIElERSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIElURSA4MjExIElERSBjb250cm9sbGVyIGFuZCB0aGUKKwkgIElUIDgyMTIgSURFIFJBSUQgY29udHJvbGxlciBpbiBib3RoIFJBSUQgYW5kIHBhc3MtdGhyb3VnaCBtb2RlLgorCiBjb25maWcgQkxLX0RFVl9OUzg3NDE1CiAJdHJpc3RhdGUgIk5TODc0MTUgY2hpcHNldCBzdXBwb3J0IgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKaW5kZXggNWJlOGFkNmQuLmNjYTljMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWRlL01ha2VmaWxlCkBAIC0yMCw3ICsyMCw2IEBACiAjIENvcmUgSURFIGNvZGUgLSBtdXN0IGNvbWUgYmVmb3JlIGxlZ2FjeQogaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVQQ0kpCSs9IHNldHVwLXBjaS5vCiBpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERURNQSkJKz0gaWRlLWRtYS5vCi1pZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERV9UQ1EpCSs9IGlkZS10Y3EubwogaWRlLWNvcmUtJChDT05GSUdfUFJPQ19GUykJCSs9IGlkZS1wcm9jLm8KIGlkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfSURFUE5QKQkrPSBpZGUtcG5wLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCAwYTMxY2ZkLi43NGFmN2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAjaWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCiAJewogCQlpbnQgaTsKLQkJY29uc3QgY2hhciAqczsKKwkJY29uc3QgY2hhciAqcyA9ICJiYWQgc2Vuc2Uga2V5ISI7CiAJCWNoYXIgYnVmWzgwXTsKIAogCQlwcmludGsgKCJBVEFQSSBkZXZpY2UgJXM6XG4iLCBkcml2ZS0+bmFtZSk7CkBAIC00NDYsOCArNDQ2LDYgQEAKIAogCQlpZiAoc2Vuc2UtPnNlbnNlX2tleSA8IEFSWV9MRU4oc2Vuc2Vfa2V5X3RleHRzKSkKIAkJCXMgPSBzZW5zZV9rZXlfdGV4dHNbc2Vuc2UtPnNlbnNlX2tleV07Ci0JCWVsc2UKLQkJCXMgPSAiYmFkIHNlbnNlIGtleSEiOwogCiAJCXByaW50aygiJXMgLS0gKFNlbnNlIGtleT0weCUwMngpXG4iLCBzLCBzZW5zZS0+c2Vuc2Vfa2V5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKaW5kZXggZDZmOTM0OC4uZjljMWFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCkBAIC0xMTksNiArMTE5LDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBsYmFfc2VjdHMsIGNoc19zZWN0cywgaGVhZCwgdGFpbDsKIAorCS8qIE5vIG5vbi1MQkEgaW5mbyAuLiBzbyB2YWxpZCEgKi8KKwlpZiAoaWQtPmN5bHMgPT0gMCkKKwkJcmV0dXJuIDE7CisKIAkvKgogCSAqIFRoZSBBVEEgc3BlYyB0ZWxscyBsYXJnZSBkcml2ZXMgdG8gcmV0dXJuCiAJICogQy9IL1MgPSAxNjM4My8xNi82MyBpbmRlcGVuZGVudCBvZiB0aGVpciBzaXplLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCmluZGV4IDJkMmVlZmIuLjFlMTUzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKQEAgLTEzMiw3ICsxMzIsNiBAQAogCXsgIlNBTVNVTkcgQ0QtUk9NIFNDLTE0OEMiLAkiQUxMIgkJfSwKIAl7ICJTQU1TVU5HIENELVJPTSBTQyIsCSJBTEwiCQl9LAogCXsgIlNhbkRpc2sgU0RQM0ItNjQiCSwJIkFMTCIJCX0sCi0JeyAiU0FNU1VORyBDRC1ST00gU04tMTI0IiwJIkFMTCIJCX0sCiAJeyAiQVRBUEkgQ0QtUk9NIERSSVZFIDQwWCBNQVhJTVVNIiwJIkFMTCIJCX0sCiAJeyAiX05FQyBEVjU4MDBBIiwgICAgICAgICAgICAgICAiQUxMIiAgICAgICAgICAgfSwgIAogCXsgTlVMTAkJCSwJTlVMTAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKaW5kZXggNTMwMjQ5NC4uYjQ0M2IwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCkBAIC0xMTgxLDcgKzExODEsOCBAQAogCQlwcmVfcmVzZXQoZHJpdmUpOwogCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOwogCQl1ZGVsYXkgKDIwKTsKLQkJaHdpZi0+T1VUQihXSU5fU1JTVCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJaHdpZi0+T1VUQlNZTkMoZHJpdmUsIFdJTl9TUlNULCBJREVfQ09NTUFORF9SRUcpOworCQluZGVsYXkoNDAwKTsKIAkJaHdncm91cC0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOwogCQlod2dyb3VwLT5wb2xsaW5nID0gMTsKIAkJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZhdGFwaV9yZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IDY4MDZkNDAuLmIwOWE2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTQ4Nyw4ICs0ODcsNyBAQAogCXU4IGVyciA9IDA7CiAKIAlsb2NhbF9pcnFfc2V0KGZsYWdzKTsKLQlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCIsIGRyaXZlLT5uYW1lLCBtc2csIHN0YXQpOwotCXByaW50aygiIHsgIik7CisJcHJpbnRrKCIlczogJXM6IHN0YXR1cz0weCUwMnggeyAiLCBkcml2ZS0+bmFtZSwgbXNnLCBzdGF0KTsKIAlpZiAoc3RhdCAmIEJVU1lfU1RBVCkKIAkJcHJpbnRrKCJCdXN5ICIpOwogCWVsc2UgewpAQCAtNTAwLDE1ICs0OTksMTMgQEAKIAkJaWYgKHN0YXQgJiBJTkRFWF9TVEFUKQlwcmludGsoIkluZGV4ICIpOwogCQlpZiAoc3RhdCAmIEVSUl9TVEFUKQlwcmludGsoIkVycm9yICIpOwogCX0KLQlwcmludGsoIn0iKTsKLQlwcmludGsoIlxuIik7CisJcHJpbnRrKCJ9XG4iKTsKIAlpZiAoKHN0YXQgJiAoQlVTWV9TVEFUfEVSUl9TVEFUKSkgPT0gRVJSX1NUQVQpIHsKIAkJZXJyID0gaHdpZi0+SU5CKElERV9FUlJPUl9SRUcpOwotCQlwcmludGsoIiVzOiAlczogZXJyb3I9MHglMDJ4IiwgZHJpdmUtPm5hbWUsIG1zZywgZXJyKTsKLQkJcHJpbnRrKCIgeyAiKTsKKwkJcHJpbnRrKCIlczogJXM6IGVycm9yPTB4JTAyeCB7ICIsIGRyaXZlLT5uYW1lLCBtc2csIGVycik7CiAJCWlmIChlcnIgJiBBQlJUX0VSUikJcHJpbnRrKCJEcml2ZVN0YXR1c0Vycm9yICIpOwogCQlpZiAoZXJyICYgSUNSQ19FUlIpCi0JCQlwcmludGsoIkJhZCVzICIsIChlcnIgJiBBQlJUX0VSUikgPyAiQ1JDIiA6ICJTZWN0b3IiKTsKKwkJCXByaW50aygoZXJyICYgQUJSVF9FUlIpID8gIkJhZENSQyAiIDogIkJhZFNlY3RvciAiKTsKIAkJaWYgKGVyciAmIEVDQ19FUlIpCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOwogCQlpZiAoZXJyICYgSURfRVJSKQlwcmludGsoIlNlY3RvcklkTm90Rm91bmQgIik7CiAJCWlmIChlcnIgJiBUUkswX0VSUikJcHJpbnRrKCJUcmFja1plcm9Ob3RGb3VuZCAiKTsKQEAgLTU0Niw4ICs1NDMsOCBAQAogCQkJCXByaW50aygiLCBzZWN0b3I9JWxsdSIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpSFdHUk9VUChkcml2ZSktPnJxLT5zZWN0b3IpOwogCQl9CisJCXByaW50aygiXG4iKTsKIAl9Ci0JcHJpbnRrKCJcbiIpOwogCWlkZV9kdW1wX29wY29kZShkcml2ZSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCmluZGV4IGU4ODRjZDQuLjI0MjAyOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCkBAIC0xNTYsMTEgKzE1NiwxMyBAQAogCiAKICNpZiAoSERfREVMQVkgPiAwKQorCisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisKIHVuc2lnbmVkIGxvbmcgbGFzdF9yZXE7CiAKIHVuc2lnbmVkIGxvbmcgcmVhZF90aW1lcih2b2lkKQogewotICAgICAgICBleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogCXVuc2lnbmVkIGxvbmcgdCwgZmxhZ3M7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwppbmRleCBlMjAzMjdlLi5hYWM1OTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMzQsMTEgKzEzMyw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZpZGVfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC00NTcsMTMgKzQ1MSw0OSBAQAogICAgIHJldHVybiAwOwogfSAvKiBpZGVfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGlkZV9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX0ZVTkNfSUQoNCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDMyLCAweDA3MDQpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDBhNCwgMHgwMDJkKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDIwODAsIDB4MDAwMSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDQ1LCAweDA0MDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQ2FyYXZlbGxlIiwgIlBTQy1JREUgIiwgIlBTQzAwMCIsIDB4OGMzNjEzN2MsIDB4ZDA2OTNhYjgsIDB4Mjc2OGE5ZjApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQ0RST00iLCAiSURFIiwgIk1DRC02MDFwIiwgMHgxYjkxNzljYSwgMHhlZGU4ODk1MSwgMHgwZDkwMmY3NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJQQ01DSUEiLCAiSURFIENBUkQiLCAiRjEiLCAweDI4MWYxYzVkLCAweDE5MDc5NjBjLCAweGY3ZmRlOGI5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVJHT1NZIiwgIkNELVJPTSIsIDB4NzhmMzA4ZGMsIDB4NjY1MzY1OTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBUkdPU1kiLCAiUG5QSURFIiwgMHg3OGYzMDhkYywgMHgwYzY5NDcyOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNORiBDRC1NIiwgIkNELVJPTSIsIDB4N2Q5M2I4NTIsIDB4NjY1MzY1OTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDcmVhdGl2ZSBUZWNobm9sb2d5IEx0ZC4iLCAiUENNQ0lBIENELVJPTSBJbnRlcmZhY2UgQ2FyZCIsIDB4ZmY4YzhhNDUsIDB4ZmU4MDIwYzQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4iLCAiRGlnaXRhbCBNb2JpbGUgTWVkaWEgQ0QtUk9NIiwgMHgxNzY5MmE2NiwgMHhlZjFkY2JkZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVYUCIsICJDRCIsIDB4NmY1OGM5ODMsIDB4YWFlNTk5NGYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFWFAgICAiLCAiQ0QtUk9NIiwgMHgwYTVjNTJmZCwgMHg2NjUzNjU5MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVYUCAgICIsICJQblBJREUiLCAweDBhNWM1MmZkLCAweDBjNjk0NzI4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRlJFRUNPTSIsICJQQ0NBUkQtSURFIiwgMHg1NzE0Y2JmNywgMHg0OGUwYWI4ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICJJQk0xN0pTU0ZQMjAiLCAweGI1NjlhNmU1LCAweGYyNTA4NzUzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU8gREFUQSIsICJDQklERTIgICAgICAiLCAweDU0N2U2NmRjLCAweDg2NzEwNDNiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU8gREFUQSIsICJQQ0lERSIsIDB4NTQ3ZTY2ZGMsIDB4NWM1YWIxNDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJTyBEQVRBIiwgIlBDSURFSUkiLCAweDU0N2U2NmRjLCAweGIzNjYyNjc0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTE9PS01FRVQiLCAiQ0JJREUyICAgICAgIiwgMHhlMzdiZTJiNSwgMHg4NjcxMDQzYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIiAiLCAiTmluamFBVEEtIiwgMHgzYjZlMjBjOCwgMHhlYmUwYmQ3OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJDRC1ST00iLCAweDI4MWYxYzVkLCAweDY2NTM2NTkxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIlBuUElERSIsIDB4MjgxZjFjNWQsIDB4MGM2OTQ3MjgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTSFVUVExFIFRFQ0hOT0xPR1kgTFRELiIsICJQQ0NBUkQtSURFL0FUQVBJIEFkYXB0ZXIiLCAweDRhM2YwYmEwLCAweDMyMjU2MGUxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVE9TSElCQSIsICJNSzIwMDFNUEwiLCAweGI0NTg1YTFhLCAweDM0ODllMDAzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0lUIiwgIklERTE2IiwgMHgyNDRlNTk5NCwgMHgzZTIzMjg1MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU1RJIEZsYXNoIiwgMHhlNGExMzIwOSksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBpZGVfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGlkZV9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJpZGUtY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBpZGVfYXR0YWNoLAorCS5ldmVudAkJPSBpZGVfZXZlbnQsCiAJLmRldGFjaAkJPSBpZGVfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IGlkZV9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2lkZV9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvcGNpL01ha2VmaWxlCmluZGV4IDU1ZTZlNTUuLmFmNDYyMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lkZS9wY2kvTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX0hQVDM2NikJCSs9IGhwdDM2Ni5vCiAjb2JqLSQoQ09ORklHX0JMS19ERVZfSFBUMzdYKQkJKz0gaHB0Mzd4Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lUODE3MikJCSs9IGl0ODE3Mi5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JVDgyMVgpCQkrPSBpdDgyMXgubwogb2JqLSQoQ09ORklHX0JMS19ERVZfTlM4NzQxNSkJCSs9IG5zODc0MTUubwogb2JqLSQoQ09ORklHX0JMS19ERVZfT1BUSTYyMSkJCSs9IG9wdGk2MjEubwogb2JqLSQoQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEKQkrPSBwZGMyMDJ4eF9vbGQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMgYi9kcml2ZXJzL2lkZS9wY2kvYWxpbTE1eDMuYwppbmRleCA2N2VmYjM4Li42Y2Y0OTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYWxpbTE1eDMuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvYWxpbTE1eDMuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiAgKglhcHByb3ByaWF0ZSBhbHNvIHNldHMgdXAgdGhlIDE1MzMgc291dGhicmlkZ2UuCiAgKi8KICAgCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfYWxpMTV4MyAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9hbGkxNXgzIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggdG1wYnl0ZTsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICoJRklYTUU6IGZyb2JzIGJpdHMgdGhhdCBhcmUgbm90IGRlZmluZWQgb24gbmV3ZXIgQUxpIGRldmljZWEKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBhdGE2Nl9hbGkxNXgzIChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYXRhNjZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKIAl1bnNpZ25lZCBpbnQgYXRhNjYJPSAwOwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAgKglJbml0aWFsaXplIHRoZSBJREUgc3RydWN0dXJlIHNpZGUgb2YgdGhlIEFMaSAxNXgzIGRyaXZlci4KICAqLwogIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9jb21tb25fYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfY29tbW9uX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaHdpZi0+YXV0b2RtYSA9IDA7CiAJaHdpZi0+dHVuZXByb2MgPSAmYWxpMTV4M190dW5lX2RyaXZlOwpAQCAtNzk0LDcgKzc5NCw3IEBACiAgKglTcGFyYyBzeXN0ZW1zCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9hbGkxNXgzIChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9hbGkxNXgzIChpZGVfaHdpZl90ICpod2lmKQogewogCXU4IGlkZWljLCBpbm1pcjsKIAlzOCBpcnFfcm91dGluZ190YWJsZVtdID0geyAtMSwgIDksIDMsIDEwLCA0LCAgNSwgNywgIDYsCkBAIC04NDcsNyArODQ3LDcgQEAKICAqCXRoZSBhY3R1YWwgd29yay4KICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9kbWFfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFiYXNlKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hYmFzZSkKIHsKIAlpZiAobTUyMjlfcmV2aXNpb24gPCAweDIwKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYwppbmRleCA0ZTBmMTNkLi44NDRhNmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKQEAgLTczLDYgKzczLDcgQEAKIAl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9DSzgwNF9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCiAJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgMCB9CiB9OwogCkBAIC0zMDksNyArMzEwLDcgQEAKICAqIGFuZCBpbml0aWFsaXplIGl0cyBkcml2ZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X2FtZDc0eHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9hbWQ3NHh4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgY2hhciB0OwogCXVuc2lnbmVkIGludCB1OwpAQCAtNDEzLDcgKzQxNCw3IEBACiAJcmV0dXJuIGRldi0+aXJxOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX2FtZDc0eHgoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfYW1kNzR4eChpZGVfaHdpZl90ICpod2lmKQogewogCWludCBpOwogCkBAIC00ODksNiArNDkwLDcgQEAKIAkvKiAxMyAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLUNLODA0IiksCiAJLyogMTQgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1AwNCIpLAogCS8qIDE1ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQNTEiKSwKKwkvKiAxNiAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDU1IiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhbWQ3NHh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKQEAgLTUyNCw2ICs1MjYsNyBAQAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9DSzgwNF9JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzIH0sCiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTQgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE2IH0sCiAJeyAwLCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhbWQ3NHh4X3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jIGIvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jCmluZGV4IDAzODE5NjEuLjA5MjY5ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9jczU1MzAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogICoJSW5pdGlhbGl6ZSB0aGUgY3M1NTMwIGJyaWRnZSBmb3IgcmVsaWFibGUgSURFIERNQSBvcGVyYXRpb24uCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X2NzNTUzMCAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9jczU1MzAgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKm1hc3Rlcl8wID0gTlVMTCwgKmNzNTUzMF8wID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAgKglwZXJmb3JtcyBjaGFubmVsLXNwZWNpZmljIHByZS1pbml0aWFsaXphdGlvbiBiZWZvcmUgZHJpdmUgcHJvYmluZy4KICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX2NzNTUzMCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfY3M1NTMwIChpZGVfaHdpZl90ICpod2lmKQogewogCXVuc2lnbmVkIGxvbmcgYmFzZXJlZzsKIAl1MzIgZDBfdGltaW5nczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9jeTgyYzY5My5jIGIvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMKaW5kZXggODBkNjdlOS4uNWEzMzUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMKQEAgLTM5MSw3ICszOTEsNyBAQAogLyoKICAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBpbml0IGFuZCBpcyB1c2VkIHRvIHNldHVwIHRoZSBjeTgyYzY5MyBjaGlwCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9jeTgyYzY5MyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2N5ODJjNjkzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaWYgKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICE9IDEpCiAJCXJldHVybiAwOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAvKgogICogdGhlIGluaXQgZnVuY3Rpb24gLSBjYWxsZWQgZm9yIGVhY2ggaWRlIGNoYW5uZWwgb25jZQogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaHdpZi0+YXV0b2RtYSA9IDA7CiAKQEAgLTQ2Nyw5ICs0NjcsOSBAQAogCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKIH0KIAotc3RhdGljIF9faW5pdGRhdGEgaWRlX2h3aWZfdCAqcHJpbWFyeTsKK3N0YXRpYyBfX2RldmluaXRkYXRhIGlkZV9od2lmX3QgKnByaW1hcnk7CiAKLXZvaWQgX19pbml0IGluaXRfaW9wc19jeTgyYzY5MyhpZGVfaHdpZl90ICpod2lmKQordm9pZCBfX2RldmluaXQgaW5pdF9pb3BzX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaWYgKFBDSV9GVU5DKGh3aWYtPnBjaV9kZXYtPmRldmZuKSA9PSAxKQogCQlwcmltYXJ5ID0gaHdpZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMgYi9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jCmluZGV4IDQ1NjVjYzMuLmRhNDY1NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwpAQCAtMzksNiArMzksMTcgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCitzdGF0aWMgaW50IGlkZV9nZW5lcmljX2FsbDsJCS8qIFNldCB0byBjbGFpbSBhbGwgZGV2aWNlcyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpZGVfZ2VuZXJpY19hbGxfb24oY2hhciAqdW51c2VkKQoreworCWlkZV9nZW5lcmljX2FsbCA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiSURFIGdlbmVyaWMgd2lsbCBjbGFpbSBhbGwgdW5rbm93biBQQ0kgSURFIHN0b3JhZ2UgY29udHJvbGxlcnMuXG4iKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWxsLWdlbmVyaWMtaWRlIiwgaWRlX2dlbmVyaWNfYWxsX29uKTsKKwogc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9nZW5lcmljIChpZGVfaHdpZl90ICpod2lmKQogewogCXN3aXRjaChod2lmLT5wY2lfZGV2LT5kZXZpY2UpIHsKQEAgLTc4LDc5ICs4OSw4NSBAQAogCiBzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBnZW5lcmljX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIlVua25vd24iLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDEgKi8KIAkJLm5hbWUJCT0gIk5TODc0MTAiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gQVVUT0RNQSwKIAkJLmVuYWJsZWJpdHMJPSB7ezB4NDMsMHgwOCwweDA4fSwgezB4NDcsMHgwOCwweDA4fX0sCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotICAgICAgICB9LHsJLyogMSAqLworICAgICAgICB9LHsJLyogMiAqLwogCQkubmFtZQkJPSAiU0FNVVJBSSIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBBVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogMiAqLworCX0sewkvKiAzICovCiAJCS5uYW1lCQk9ICJIVDY1NjUiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gQVVUT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDMgKi8KKwl9LHsJLyogNCAqLwogCQkubmFtZQkJPSAiVU04NjczRiIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBOT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDQgKi8KKwl9LHsJLyogNSAqLwogCQkubmFtZQkJPSAiVU04ODg2QSIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBOT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDUgKi8KKwl9LHsJLyogNiAqLwogCQkubmFtZQkJPSAiVU04ODg2QkYiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiA2ICovCisJfSx7CS8qIDcgKi8KIAkJLm5hbWUJCT0gIkhJTlRfSURFIiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IEFVVE9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiA3ICovCisJfSx7CS8qIDggKi8KIAkJLm5hbWUJCT0gIlZJQV9JREUiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9BVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogOCAqLworCX0sewkvKiA5ICovCiAJCS5uYW1lCQk9ICJPUFRJNjIxViIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiA5ICovCisJfSx7CS8qIDEwICovCiAJCS5uYW1lCQk9ICJWSUE4MjM3U0FUQSIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBBVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCi0JfSx7CS8qIDEwICovCisJfSx7CS8qIDExICovCiAJCS5uYW1lIAkJPSAiUGljY29sbzAxMDIiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9BVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogMTEgKi8KKwl9LHsJLyogMTIgKi8KIAkJLm5hbWUgCQk9ICJQaWNjb2xvMDEwMyIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiAxMiAqLworCX0sewkvKiAxMyAqLwogCQkubmFtZSAJCT0gIlBpY2NvbG8wMTA1IiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLApAQCAtMTc0LDYgKzE5MSwxMCBAQAogCXUxNiBjb21tYW5kOwogCWludCByZXQgPSAtRU5PREVWOwogCisJLyogRG9uJ3QgdXNlIHRoZSBnZW5lcmljIGVudHJ5IHVubGVzcyBpbnN0cnVjdGVkIHRvIGRvIHNvICovCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAwICYmIGlkZV9nZW5lcmljX2FsbCA9PSAwKQorCQkJZ290byBvdXQ7CisKIAlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9VTUMgJiYKIAkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QSAmJgogCSAgICAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSkKQEAgLTE5NSwyMSArMjE2LDIzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBnZW5lcmljX3BjaV90YmxbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfTlMsICAgICBQQ0lfREVWSUNFX0lEX05TXzg3NDEwLCAgICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9QQ1RFQ0gsIFBDSV9ERVZJQ0VfSURfUENURUNIX1NBTVVSQUlfSURFLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCi0JeyBQQ0lfVkVORE9SX0lEX0hPTFRFSywgUENJX0RFVklDRV9JRF9IT0xURUtfNjU2NSwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKLQl7IFBDSV9WRU5ET1JfSURfVU1DLCAgICBQQ0lfREVWSUNFX0lEX1VNQ19VTTg2NzNGLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDN9LAotCXsgUENJX1ZFTkRPUl9JRF9VTUMsICAgIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkEsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCi0JeyBQQ0lfVkVORE9SX0lEX1VNQywgICAgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QkYsICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1fSwKLQl7IFBDSV9WRU5ET1JfSURfSElOVCwgICBQQ0lfREVWSUNFX0lEX0hJTlRfVlhQUk9JSV9JREUsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDZ9LAotCXsgUENJX1ZFTkRPUl9JRF9WSUEsICAgIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU2MSwgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgN30sCi0JeyBQQ0lfVkVORE9SX0lEX09QVEksICAgUENJX0RFVklDRV9JRF9PUFRJXzgyQzU1OCwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA4fSwKKwl7IFBDSV9WRU5ET1JfSURfTlMsICAgICBQQ0lfREVWSUNFX0lEX05TXzg3NDEwLCAgICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAorCXsgUENJX1ZFTkRPUl9JRF9QQ1RFQ0gsIFBDSV9ERVZJQ0VfSURfUENURUNIX1NBTVVSQUlfSURFLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCisJeyBQQ0lfVkVORE9SX0lEX0hPTFRFSywgUENJX0RFVklDRV9JRF9IT0xURUtfNjU2NSwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzfSwKKwl7IFBDSV9WRU5ET1JfSURfVU1DLCAgICBQQ0lfREVWSUNFX0lEX1VNQ19VTTg2NzNGLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXsgUENJX1ZFTkRPUl9JRF9VTUMsICAgIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkEsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJeyBQQ0lfVkVORE9SX0lEX1VNQywgICAgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QkYsICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2fSwKKwl7IFBDSV9WRU5ET1JfSURfSElOVCwgICBQQ0lfREVWSUNFX0lEX0hJTlRfVlhQUk9JSV9JREUsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDd9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsICAgIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU2MSwgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOH0sCisJeyBQQ0lfVkVORE9SX0lEX09QVEksICAgUENJX0RFVklDRV9JRF9PUFRJXzgyQzU1OCwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA5fSwKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfU0FUQQotCXsgUENJX1ZFTkRPUl9JRF9WSUEsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzdfU0FUQSwJICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOX0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwJUENJX0RFVklDRV9JRF9WSUFfODIzN19TQVRBLAkgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMH0sCiAjZW5kaWYKLQl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MTywgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwfSwKLQl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MT18xLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExfSwKLQl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MT18yLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyfSwKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MTywgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExfSwKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MT18xLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyfSwKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSxQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MT18yLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzfSwKKwkvKiBNdXN0IGNvbWUgbGFzdC4gSWYgeW91IGFkZCBlbnRyaWVzIGFkanVzdCB0aGlzIHRhYmxlIGFwcHJvcHJpYXRlbHkgYW5kIHRoZSBpbml0X29uZSBjb2RlICovCisJeyBQQ0lfQU5ZX0lELAkJUENJX0FOWV9JRCwJCQkgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgPDwgOCwgMHhGRkZGRkYwMFVMLCAwfSwKIAl7IDAsIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGdlbmVyaWNfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMgYi9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKaW5kZXggYzhlZTBiOC4uN2I2NGRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYwpAQCAtMTAsNiArMTAsMTEgQEAKICAqIGRvbmF0aW9uIG9mIGFuIEFCaXQgQlA2IG1haW5ib2FyZCwgcHJvY2Vzc29yLCBhbmQgbWVtb3J5IGFjZWxsZXJhdGVkCiAgKiBkZXZlbG9wbWVudCBhbmQgc3VwcG9ydC4KICAqCisgKgorICogSGlnaHBvaW50IGhhdmUgdGhlaXIgb3duIGRyaXZlciAoc291cmNlIGV4Y2VwdCBmb3IgdGhlIHJhaWQgcGFydCkKKyAqIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuaGlnaHBvaW50LXRlY2guY29tL2hwdDN4eC1vcGVuc291cmNlLXYxMzEudGd6CisgKiBUaGlzIG1heSBiZSB1c2VmdWwgdG8gYW55b25lIHdhbnRpbmcgdG8gd29yayBvbiB0aGUgbWFpbnN0cmVhbSBocHQgSURFLgorICoKICAqIE5vdGUgdGhhdCBmaW5hbCBIUFQzNzAgc3VwcG9ydCB3YXMgZG9uZSBieSBmb3JjZSBleHRyYWN0aW9uIG9mIEdQTC4KICAqCiAgKiAtIGFkZCBmdW5jdGlvbiBmb3IgZ2V0dGluZy9zZXR0aW5nIHBvd2VyIHN0YXR1cyBvZiBkcml2ZQpAQCAtNDQ2LDQ0ICs0NTEsMjkgQEAKICNkZWZpbmUgRl9MT1dfUENJXzUwCTB4MmQKICNkZWZpbmUgRl9MT1dfUENJXzY2CTB4NDIKIAotLyogRklYTUU6IGNvbXBhcmUgd2l0aCBkcml2ZXIncyBjb2RlIGJlZm9yZSByZW1vdmluZyAqLwotI2lmIDAKLQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsKLQkJCXU4IGNibDsKLQkJCWNibCA9IGluYihpb2Jhc2UgKyAweDdiKTsKLQkJCW91dGIoY2JsIHwgMSwgaW9iYXNlICsgMHg3Yik7Ci0JCQlvdXRiKGNibCAmIH4xLCBpb2Jhc2UgKyAweDdiKTsKLQkJCWNibCA9IGluYihpb2Jhc2UgKyAweDdhKTsKLQkJCXAgKz0gc3ByaW50ZihwLCAiQ2FibGU6ICAgICAgICAgIEFUQS0lZCIKLQkJCQkJIiAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBLSVkXG4iLAotCQkJCShjYmwgJiAweDAyKSA/IDMzIDogNjYsCi0JCQkJKGNibCAmIDB4MDEpID8gMzMgOiA2Nik7Ci0JCQlwICs9IHNwcmludGYocCwgIlxuIik7Ci0JCX0KLQkJewotCQkJdTggYzIsIGMzOwotCQkJLyogb2xkZXIgcmV2cyBkb24ndCBoYXZlIHRoZXNlIHJlZ2lzdGVycyBtYXBwZWQgCi0JCQkgKiBpbnRvIGlvIHNwYWNlICovCi0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDMsICZjMCk7Ci0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDcsICZjMSk7Ci0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NGIsICZjMik7Ci0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NGYsICZjMyk7CisvKgorICoJSG9sZCBhbGwgdGhlIGhpZ2hwb2ludCBxdWlya3MgYW5kIHJldmlzaW9uIGluZm9ybWF0aW9uIGluIG9uZQorICoJcGxhY2UuCisgKi8KIAotCQkJcCArPSBzcHJpbnRmKHAsICJNb2RlOiAgICAgICAgICAgJXMgICAgICAgICAgICAgJXMiCi0JCQkJCSIgICAgICAgICAgICVzICAgICAgICAgICAgICAlc1xuIiwKLQkJCQkoYzAgJiAweDEwKSA/ICJVRE1BIiA6IChjMCAmIDB4MjApID8gIkRNQSAiIDogCi0JCQkJCShjMCAmIDB4ODApID8gIlBJTyAiIDogIm9mZiAiLAotCQkJCShjMSAmIDB4MTApID8gIlVETUEiIDogKGMxICYgMHgyMCkgPyAiRE1BICIgOgotCQkJCQkoYzEgJiAweDgwKSA/ICJQSU8gIiA6ICJvZmYgIiwKLQkJCQkoYzIgJiAweDEwKSA/ICJVRE1BIiA6IChjMiAmIDB4MjApID8gIkRNQSAiIDoKLQkJCQkJKGMyICYgMHg4MCkgPyAiUElPICIgOiAib2ZmICIsCi0JCQkJKGMzICYgMHgxMCkgPyAiVURNQSIgOiAoYzMgJiAweDIwKSA/ICJETUEgIiA6Ci0JCQkJCShjMyAmIDB4ODApID8gIlBJTyAiIDogIm9mZiAiKTsKLQkJfQotCX0KLSNlbmRpZgorc3RydWN0IGhwdF9pbmZvCit7CisJdTggbWF4X21vZGU7CQkvKiBTcGVlZHMgYWxsb3dlZCAqLworCWludCByZXZpc2lvbjsJCS8qIENoaXBzZXQgcmV2aXNpb24gKi8KKwlpbnQgZmxhZ3M7CQkvKiBDaGlwc2V0IHByb3BlcnRpZXMgKi8KKyNkZWZpbmUgUExMX01PREUJMQorI2RlZmluZSBJU18zNzJOCQkyCisJCQkJLyogU3BlZWQgdGFibGUgKi8KKwlzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqc3BlZWQ7Cit9OwogCi1zdGF0aWMgdTMyIGhwdF9yZXZpc2lvbiAoc3RydWN0IHBjaV9kZXYgKmRldikKKy8qCisgKglUaGlzIHdhbnRzIGZpeGluZyBzbyB0aGF0IHdlIGRvIGV2ZXJ5dGhpbmcgbm90IGJ5IGNsYXNzcmV2CisgKgkod2hpY2ggYnJlYWtzIG9uIHRoZSBuZXdlc3QgY2hpcHMpIGJ1dCBieSBjcmVhdGluZyBhbgorICoJZW51bWVyYXRpb24gb2YgY2hpcCB2YXJpYW50cyBhbmQgdXNpbmcgdGhhdAorICovCisKK3N0YXRpYyBfX2RldmluaXQgdTMyIGhwdF9yZXZpc2lvbiAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MzIgY2xhc3NfcmV2OwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CkBAIC01MDcsMzcgKzQ5NywzMyBAQAogCXJldHVybiBjbGFzc19yZXY7CiB9CiAKLXN0YXRpYyB1MzIgaHB0X21pbmltdW1fcmV2aXNpb24gKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXZpc2lvbikKLXsKLQl1bnNpZ25lZCBpbnQgY2xhc3NfcmV2ID0gaHB0X3JldmlzaW9uKGRldik7Ci0JcmV2aXNpb24tLTsKLQlyZXR1cm4gKChpbnQpIChjbGFzc19yZXYgPiByZXZpc2lvbikgPyAxIDogMCk7Ci19Ci0KIHN0YXRpYyBpbnQgY2hlY2tfaW5fZHJpdmVfbGlzdHMoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICoqbGlzdCk7CiAKIHN0YXRpYyB1OCBocHQzeHhfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggbW9kZQkJCT0gMDsKIAotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDgpKSB7CQkvKiBIUFQzNzQgKi8KKwkvKiBGSVhNRTogVE9ETyAtIG1vdmUgdGhpcyB0byBzZXQgaW5mby0+bW9kZSBvbmNlIGF0IGJvb3QgKi8KKworCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KSB7CQkvKiBIUFQzNzQgKi8KIAkJbW9kZSA9IChIUFQzNzRfQUxMT1dfQVRBMTMzXzYpID8gNCA6IDM7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDcpKSB7CS8qIEhQVDM3MSAqLworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNykgewkvKiBIUFQzNzEgKi8KIAkJbW9kZSA9IChIUFQzNzFfQUxMT1dfQVRBMTMzXzYpID8gNCA6IDM7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDYpKSB7CS8qIEhQVDMwMiAqLworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNikgewkvKiBIUFQzMDIgKi8KIAkJbW9kZSA9IChIUFQzMDJfQUxMT1dfQVRBMTMzXzYpID8gNCA6IDM7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDUpKSB7CS8qIEhQVDM3MiAqLworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkgewkvKiBIUFQzNzIgKi8KIAkJbW9kZSA9IChIUFQzNzJfQUxMT1dfQVRBMTMzXzYpID8gNCA6IDM7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDQpKSB7CS8qIEhQVDM3MEEgKi8KKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpIHsJLyogSFBUMzcwQSAqLwogCQltb2RlID0gKEhQVDM3MF9BTExPV19BVEExMDBfNSkgPyAzIDogMjsKLQl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsJLyogSFBUMzcwICovCisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKSB7CS8qIEhQVDM3MCAqLwogCQltb2RlID0gKEhQVDM3MF9BTExPV19BVEExMDBfNSkgPyAzIDogMjsKIAkJbW9kZSA9IChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTMzKSkgPyAwIDogbW9kZTsKIAl9IGVsc2UgewkJCQkvKiBIUFQzNjYgYW5kIEhQVDM2OCAqLwogCQltb2RlID0gKGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBiYWRfYXRhMzMpKSA/IDAgOiAyOwogCX0KLQlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkgJiYgKG1vZGUpKQorCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSAmJiBtb2RlKQogCQltb2RlID0gbWluKG1vZGUsICh1OCkxKTsKIAlyZXR1cm4gbW9kZTsKIH0KQEAgLTU0OSw3ICs1MzUsOCBAQAogIAogc3RhdGljIHU4IGhwdDN4eF9yYXRlZmlsdGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNwZWVkKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBtb2RlCQkJPSBocHQzeHhfcmF0ZW1hc2soZHJpdmUpOwogCiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKQEAgLTU2MSw3ICs1NDgsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMzoKIAkJCXNwZWVkID0gbWluKHNwZWVkLCAodTgpWEZFUl9VRE1BXzUpOwotCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNSkpCisJCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKIAkJCQlicmVhazsKIAkJCWlmIChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTEwMF81KSkKIAkJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfVURNQV80KTsKQEAgLTU3MSw3ICs1NTgsNyBAQAogCS8qCiAJICogQ0hFQ0sgTUUsIERvZXMgdGhpcyBuZWVkIHRvIGJlIHNldCB0byA1ID8/CiAJICovCi0JCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAzKSkKKwkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKQogCQkJCWJyZWFrOwogCQkJaWYgKChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTY2XzQpKSB8fAogCQkJICAgICghKEhQVDM2Nl9BTExPV19BVEE2Nl80KSkpCkBAIC01ODUsNyArNTcyLDcgQEAKIAkvKgogCSAqIENIRUNLIE1FLCBEb2VzIHRoaXMgbmVlZCB0byBiZSBzZXQgdG8gNSA/PwogCSAqLwotCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpCisJCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gMykKIAkJCQlicmVhazsKIAkJCWlmIChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTMzKSkKIAkJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfTVdfRE1BXzIpOwpAQCAtNjI0LDExICs2MTEsMTIgQEAKIAogc3RhdGljIGludCBocHQzNnhfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJc3RydWN0IGhwdF9pbmZvCSppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBzcGVlZAkJPSBocHQzeHhfcmF0ZWZpbHRlcihkcml2ZSwgeGZlcnNwZWVkKTsKLS8vCXU4IHNwZWVkCQk9IGlkZV9yYXRlX2ZpbHRlcihocHQzeHhfcmF0ZW1hc2soZHJpdmUpLCB4ZmVyc3BlZWQpOwogCXU4IHJlZ3RpbWUJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSkgPyAweDQ0IDogMHg0MDsKLQl1OCByZWdmYXN0CQk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKKwl1OCByZWdmYXN0CQk9IChod2lmLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOwogCXU4IGRyaXZlX2Zhc3QJCT0gMDsKIAl1MzIgcmVnMSA9IDAsIHJlZzIJPSAwOwogCkBAIC02MzYsMTYgKzYyNCwxMSBAQAogCSAqIERpc2FibGUgdGhlICJmYXN0IGludGVycnVwdCIgcHJlZGljdGlvbi4KIAkgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHJlZ2Zhc3QsICZkcml2ZV9mYXN0KTsKLSNpZiAwCi0JaWYgKGRyaXZlX2Zhc3QgJiAweDAyKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBkcml2ZV9mYXN0ICYgfjB4MjApOwotI2Vsc2UKIAlpZiAoZHJpdmVfZmFzdCAmIDB4ODApCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHJlZ2Zhc3QsIGRyaXZlX2Zhc3QgJiB+MHg4MCk7Ci0jZW5kaWYKIAotCXJlZzIgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsCi0JCShzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqKSBwY2lfZ2V0X2RydmRhdGEoZGV2KSk7CisJcmVnMiA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwgaW5mby0+c3BlZWQpOworCiAJLyoKIAkgKiBEaXNhYmxlIG9uLWNoaXAgUElPIEZJRk8vYnVmZmVyCiAJICogICh0byBhdm9pZCBwcm9ibGVtcyBoYW5kbGluZyBJL08gZXJyb3JzIGxhdGVyKQpAQCAtNjY1LDEwICs2NDgsMTEgQEAKIAogc3RhdGljIGludCBocHQzNzBfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisJc3RydWN0IGhwdF9pbmZvCSppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBzcGVlZAk9IGhwdDN4eF9yYXRlZmlsdGVyKGRyaXZlLCB4ZmVyc3BlZWQpOwotLy8JdTggc3BlZWQJPSBpZGVfcmF0ZV9maWx0ZXIoaHB0M3h4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKLQl1OCByZWdmYXN0CT0gKEhXSUYoZHJpdmUpLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOworCXU4IHJlZ2Zhc3QJPSAoZHJpdmUtPmh3aWYtPmNoYW5uZWwpID8gMHg1NSA6IDB4NTE7CiAJdTggZHJpdmVfcGNpCT0gMHg0MCArIChkcml2ZS0+ZG4gKiA0KTsKIAl1OCBuZXdfZmFzdAk9IDAsIGRyaXZlX2Zhc3QgPSAwOwogCXUzMiBsaXN0X2NvbmYJPSAwLCBkcml2ZV9jb25mID0gMDsKQEAgLTY5MywxNyArNjc3LDEzIEBACiAJaWYgKG5ld19mYXN0ICE9IGRyaXZlX2Zhc3QpCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHJlZ2Zhc3QsIG5ld19mYXN0KTsKIAotCWxpc3RfY29uZiA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwgCi0JCQkJICAgICAgIChzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqKQotCQkJCSAgICAgICBwY2lfZ2V0X2RydmRhdGEoZGV2KSk7CisJbGlzdF9jb25mID0gcGNpX2J1c19jbG9ja19saXN0KHNwZWVkLCBpbmZvLT5zcGVlZCk7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBkcml2ZV9wY2ksICZkcml2ZV9jb25mKTsKIAlsaXN0X2NvbmYgPSAobGlzdF9jb25mICYgfmNvbmZfbWFzaykgfCAoZHJpdmVfY29uZiAmIGNvbmZfbWFzayk7CiAJCi0JaWYgKHNwZWVkIDwgWEZFUl9NV19ETUFfMCkgeworCWlmIChzcGVlZCA8IFhGRVJfTVdfRE1BXzApCiAJCWxpc3RfY29uZiAmPSB+MHg4MDAwMDAwMDsgLyogRGlzYWJsZSBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlciAqLwotCX0KLQogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkcml2ZV9wY2ksIGxpc3RfY29uZik7CiAKIAlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOwpAQCAtNzExLDEwICs2OTEsMTEgQEAKIAogc3RhdGljIGludCBocHQzNzJfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJc3RydWN0IGhwdF9pbmZvCSppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBzcGVlZAk9IGhwdDN4eF9yYXRlZmlsdGVyKGRyaXZlLCB4ZmVyc3BlZWQpOwotLy8JdTggc3BlZWQJPSBpZGVfcmF0ZV9maWx0ZXIoaHB0M3h4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKLQl1OCByZWdmYXN0CT0gKEhXSUYoZHJpdmUpLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOworCXU4IHJlZ2Zhc3QJPSAoZHJpdmUtPmh3aWYtPmNoYW5uZWwpID8gMHg1NSA6IDB4NTE7CiAJdTggZHJpdmVfZmFzdAk9IDAsIGRyaXZlX3BjaSA9IDB4NDAgKyAoZHJpdmUtPmRuICogNCk7CiAJdTMyIGxpc3RfY29uZgk9IDAsIGRyaXZlX2NvbmYgPSAwOwogCXUzMiBjb25mX21hc2sJPSAoc3BlZWQgPj0gWEZFUl9NV19ETUFfMCkgPyAweGMwMDAwMDAwIDogMHgzMDA3MDAwMDsKQEAgLTcyNiwxMCArNzA3LDggQEAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHJlZ2Zhc3QsICZkcml2ZV9mYXN0KTsKIAlkcml2ZV9mYXN0ICY9IH4weDA3OwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHJlZ2Zhc3QsIGRyaXZlX2Zhc3QpOwotCQkJCQkKLQlsaXN0X2NvbmYgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsCi0JCQkoc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKikKLQkJCQkJcGNpX2dldF9kcnZkYXRhKGRldikpOworCisJbGlzdF9jb25mID0gcGNpX2J1c19jbG9ja19saXN0KHNwZWVkLCBpbmZvLT5zcGVlZCk7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7CiAJbGlzdF9jb25mID0gKGxpc3RfY29uZiAmIH5jb25mX21hc2spIHwgKGRyaXZlX2NvbmYgJiBjb25mX21hc2spOwogCWlmIChzcGVlZCA8IFhGRVJfTVdfRE1BXzApCkBAIC03NDEsMTkgKzcyMCwxNCBAQAogCiBzdGF0aWMgaW50IGhwdDN4eF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldgk9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaHB0X2luZm8JKmluZm8JPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCi0JaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgOCkpCisJaWYgKGluZm8tPnJldmlzaW9uID49IDgpCiAJCXJldHVybiBocHQzNzJfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7IC8qIG5vdCBhIHR5cG8gKi8KLSNpZiAwCi0JZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA3KSkKLQkJaHB0MzcxX3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOwotCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNikpCi0JCWhwdDMwMl90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKLSNlbmRpZgotCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNSkpCisJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKIAkJcmV0dXJuIGhwdDM3Ml90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKLQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKQorCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDMpCiAJCXJldHVybiBocHQzNzBfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CiAJZWxzZQkvKiBocHQzNjg6IGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMikgKi8KIAkJcmV0dXJuIGhwdDM2eF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKQEAgLTc3OSw4ICs3NTMsMTQgQEAKIHN0YXRpYyBpbnQgY29uZmlnX2NoaXBzZXRfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXU4IHNwZWVkID0gaWRlX2RtYV9zcGVlZChkcml2ZSwgaHB0M3h4X3JhdGVtYXNrKGRyaXZlKSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCBocHRfaW5mbwkqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAKLQlpZiAoIShzcGVlZCkpCisJaWYgKCFzcGVlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSB0aW1pbmdzIHdlIGNhbid0IGRvIGEgbG90ICovCisJaWYgKGluZm8tPnNwZWVkID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJKHZvaWQpIGhwdDN4eF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKQEAgLTc5NCw3ICs3NzQsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfaW50cnByb2MgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCiAJaWYgKGRyaXZlLT5xdWlya19saXN0KQogCQlyZXR1cm47CkBAIC04MDQsMjQgKzc4NCwyNiBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfbWFza3Byb2MgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1hc2spCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8gPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OwogCiAJaWYgKGRyaXZlLT5xdWlya19saXN0KSB7Ci0JCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMykpIHsKKwkJaWYgKGluZm8tPnJldmlzaW9uID49IDMpIHsKIAkJCXU4IHJlZzVhID0gMDsKIAkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgJnJlZzVhKTsKIAkJCWlmICgoKHJlZzVhICYgMHgxMCkgPj4gNCkgIT0gbWFzaykKIAkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCBtYXNrID8gKHJlZzVhIHwgMHgxMCkgOiAocmVnNWEgJiB+MHgxMCkpOwogCQl9IGVsc2UgewogCQkJaWYgKG1hc2spIHsKLQkJCQlkaXNhYmxlX2lycShIV0lGKGRyaXZlKS0+aXJxKTsKKwkJCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOwogCQkJfSBlbHNlIHsKLQkJCQllbmFibGVfaXJxKEhXSUYoZHJpdmUpLT5pcnEpOworCQkJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCWlmIChJREVfQ09OVFJPTF9SRUcpCi0JCQlIV0lGKGRyaXZlKS0+T1VUQihtYXNrID8gKGRyaXZlLT5jdGwgfCAyKSA6CisJCQlod2lmLT5PVVRCKG1hc2sgPyAoZHJpdmUtPmN0bCB8IDIpIDoKIAkJCQkJCSAoZHJpdmUtPmN0bCAmIH4yKSwKIAkJCQkJCSBJREVfQ09OVFJPTF9SRUcpOwogCX0KQEAgLTgyOSwxMiArODExLDEyIEBACiAKIHN0YXRpYyBpbnQgaHB0MzY2X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBoZF9kcml2ZWlkICppZAk9IGRyaXZlLT5pZDsKIAogCWRyaXZlLT5pbml0X3NwZWVkID0gMDsKIAotCWlmIChpZCAmJiAoaWQtPmNhcGFiaWxpdHkgJiAxKSAmJiBkcml2ZS0+YXV0b2RtYSkgeworCWlmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAmJiBkcml2ZS0+YXV0b2RtYSkgewogCiAJCWlmIChpZGVfdXNlX2RtYShkcml2ZSkpIHsKIAkJCWlmIChjb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKQEAgLTg2OCwxNSArODUwLDYgQEAKIAkJZHJpdmUtPm5hbWUsIF9fRlVOQ1RJT05fXywgcmVnNTBoLCByZWc1MmgsIHJlZzVhaCk7CiAJaWYgKHJlZzVhaCAmIDB4MTApCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWEsIHJlZzVhaCAmIH4weDEwKTsKLSNpZiAwCi0JLyogaG93IGFib3V0IHdlIGZsdXNoIGFuZCByZXNldCwgbW1ta2F5PyAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTEsIDB4MUYpOwotCS8qIGZhbGwgdGhyb3VnaCB0byBhIHJlc2V0ICovCi0JY2FzZSBkbWFfc3RhcnQ6Ci0JY2FzZSBpZGVfZG1hX2VuZDoKLQkvKiByZXNldCB0aGUgY2hpcHMgc3RhdGUgb3ZlciBhbmQgb3Zlci4uICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgMHgxMyk7Ci0jZW5kaWYKIAlyZXR1cm4gX19pZGVfZG1hX2xvc3RpcnEoZHJpdmUpOwogfQogCkBAIC05MTksNyArODkyLDcgQEAKIAl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIHJlZ2luZm8sICZiZmlmbyk7Ci0JcHJpbnRrKCIlczogJWQgYnl0ZXMgaW4gRklGT1xuIiwgZHJpdmUtPm5hbWUsIGJmaWZvKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVkIGJ5dGVzIGluIEZJRk9cbiIsIGRyaXZlLT5uYW1lLCBiZmlmbyk7CiAJaHB0MzcwX2NsZWFyX2VuZ2luZShkcml2ZSk7CiAJLyogZ2V0IGRtYSBjb21tYW5kIG1vZGUgKi8KIAlkbWFfY21kID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9jb21tYW5kKTsKQEAgLTEwNDcsMTUgKzEwMjAsNiBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLSNpZiAwCi0JdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gcGNpX3Jlc291cmNlX3N0YXJ0KEhXSUYoZHJpdmUpLT5wY2lfZGV2LCA0KTsKLQl1OCByZXNldAk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDgwIDogMHg0MDsKLQl1OCByZWc1OWgJPSAwOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NTksICZyZWc1OWgpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg1OSwgcmVnNTlofHJlc2V0KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NTksIHJlZzU5aCk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBocHQzeHhfdHJpc3RhdGUgKGlkZV9kcml2ZV90ICogZHJpdmUsIGludCBzdGF0ZSkKQEAgLTEwNjUsOCArMTAyOSw2IEBACiAJdTggcmVnNTloID0gMCwgcmVzZXQJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDgwIDogMHg0MDsKIAl1OCByZWdYWGggPSAwLCBzdGF0ZV9yZWc9IChod2lmLT5jaGFubmVsKSA/IDB4NTcgOiAweDUzOwogCi0vLwlod2lmLT5idXNfc3RhdGUgPSBzdGF0ZTsKLQogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1OSwgJnJlZzU5aCk7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBzdGF0ZV9yZWcsICZyZWdYWGgpOwogCkBAIC0xMDkzLDcgKzEwNTUsNyBAQAogI2RlZmluZSBUUklTVEFURV9CSVQgIDB4ODAwMAogc3RhdGljIGludCBocHQzNzBfYnVzcHJvYyhpZGVfZHJpdmVfdCAqIGRyaXZlLCBpbnQgc3RhdGUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKIAl1OCB0cmlzdGF0ZSA9IDAsIHJlc2V0bWFzayA9IDAsIGJ1c19yZWcgPSAwOwogCXUxNiB0cmlfcmVnOwpAQCAtMTE0OCwzMyArMTExMCw0NCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X2hwdDM3eChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19kZXZpbml0IGhwdDM2Nl9jbG9ja2luZyhpZGVfaHdpZl90ICpod2lmKQogeworCXUzMiByZWcxCT0gMDsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8gPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGh3aWYtPnBjaV9kZXYsIDB4NDAsICZyZWcxKTsKKworCS8qIGRldGVjdCBidXMgc3BlZWQgYnkgbG9va2luZyBhdCBjb250cm9sIHJlZyB0aW1pbmc6ICovCisJc3dpdGNoKChyZWcxID4+IDgpICYgNykgeworCQljYXNlIDU6CisJCQlpbmZvLT5zcGVlZCA9IGZvcnR5X2Jhc2VfaHB0MzY2OworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCWluZm8tPnNwZWVkID0gdHdlbnR5X2ZpdmVfYmFzZV9ocHQzNjY7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQlkZWZhdWx0OgorCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNjY7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBocHQzN3hfY2xvY2tpbmcoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8gPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OwogCWludCBhZGp1c3QsIGk7CiAJdTE2IGZyZXE7CiAJdTMyIHBsbDsKIAl1OCByZWc1Ymg7Ci0JdTggcmVnNWFoID0gMDsKLQl1bnNpZ25lZCBsb25nIGRtYWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKLQl1OCBkaWQsIHJpZDsJCi0JaW50IGlzXzM3Mm4gPSAwOwogCQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgJnJlZzVhaCk7Ci0JLyogaW50ZXJydXB0IGZvcmNlIGVuYWJsZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWEsIChyZWc1YWggJiB+MHgxMCkpOwotCi0JaWYoZG1hYmFzZSkKLQl7Ci0JCWRpZCA9IGluYihkbWFiYXNlICsgMHgyMik7Ci0JCXJpZCA9IGluYihkbWFiYXNlICsgMHgyOCk7Ci0JCi0JCWlmKChkaWQgPT0gNCAmJiByaWQgPT0gNikgfHwgKGRpZCA9PSA1ICYmIHJpZCA+IDEpKQotCQkJaXNfMzcybiA9IDE7Ci0JfQotCiAJLyoKIAkgKiBkZWZhdWx0IHRvIHBjaSBjbG9jay4gbWFrZSBzdXJlIE1BMTUvMTYgYXJlIHNldCB0byBvdXRwdXQKLQkgKiB0byBwcmV2ZW50IGRyaXZlcyBoYXZpbmcgcHJvYmxlbXMgd2l0aCA0MC1waW4gY2FibGVzLgorCSAqIHRvIHByZXZlbnQgZHJpdmVzIGhhdmluZyBwcm9ibGVtcyB3aXRoIDQwLXBpbiBjYWJsZXMuIE5lZWRlZAorCSAqIGZvciBzb21lIGRyaXZlcyBzdWNoIGFzIElCTS1EVExBIHdoaWNoIHdpbGwgbm90IGVudGVyIHJlYWR5CisJICogc3RhdGUgb24gcmVzZXQgd2hlbiBQRElBRyBpcyBhIGlucHV0LgorCSAqCisJICogVG9Ebzogc2hvdWxkIHdlIHNldCAweDIxIHdoZW4gdXNpbmcgUExMIG1vZGUgPwogCSAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjMpOwogCkBAIC0xMTk3LDkgKzExNzAsNyBAQAogCSAqIEN1cnJlbnRseSB3ZSBhbHdheXMgc2V0IHVwIHRoZSBQTEwgZm9yIHRoZSAzNzJOCiAJICovCiAJIAotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCQotCWlmKGlzXzM3Mm4pCisJaWYoaW5mby0+ZmxhZ3MgJiBJU18zNzJOKQogCXsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaHB0OiBIUFQzNzJOIGRldGVjdGVkLCB1c2luZyAzNzJOIHRpbWluZy5cbiIpOwogCQlpZihmcmVxIDwgMHg1NSkKQEAgLTEyMjcsMzkgKzExOTgsMzggQEAKIAkJCXBsbCA9IEZfTE9XX1BDSV82NjsKIAkKIAkJaWYgKHBsbCA9PSBGX0xPV19QQ0lfMzMpIHsKLQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsOCkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdGhpcnR5X3RocmVlX2Jhc2VfaHB0Mzc0KTsKLQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw1KSkKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzIpOwotCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDQpKQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MGEpOworCQkJaWYgKGluZm8tPnJldmlzaW9uID49IDgpCisJCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzQ7CisJCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KQorCQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcyOworCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNCkKKwkJCQlpbmZvLT5zcGVlZCA9IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MGE7CiAJCQllbHNlCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcwKTsKLQkJCXByaW50aygiSFBUMzdYOiB1c2luZyAzM01IeiBQQ0kgY2xvY2tcbiIpOworCQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcwOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkhQVDM3WDogdXNpbmcgMzNNSHogUENJIGNsb2NrXG4iKTsKIAkJfSBlbHNlIGlmIChwbGwgPT0gRl9MT1dfUENJXzQwKSB7CiAJCQkvKiBVbnN1cHBvcnRlZCAqLwogCQl9IGVsc2UgaWYgKHBsbCA9PSBGX0xPV19QQ0lfNTApIHsKLQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsOCkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKLQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw1KSkKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3Mik7Ci0JCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNCkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKKwkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQorCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOworCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKKwkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcyOworCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNCkKKwkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcwYTsKIAkJCWVsc2UKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3MGEpOwotCQkJcHJpbnRrKCJIUFQzN1g6IHVzaW5nIDUwTUh6IFBDSSBjbG9ja1xuIik7CisJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiSFBUMzdYOiB1c2luZyA1ME1IeiBQQ0kgY2xvY2tcbiIpOwogCQl9IGVsc2UgewotCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw4KSkKLQkJCXsKKwkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJIUFQzN3g6IDY2TUh6IHRpbWluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKIAkJCX0KLQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw1KSkKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBzaXh0eV9zaXhfYmFzZV9ocHQzNzIpOwotCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDQpKQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHNpeHR5X3NpeF9iYXNlX2hwdDM3MGEpOworCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKKwkJCQlpbmZvLT5zcGVlZCA9IHNpeHR5X3NpeF9iYXNlX2hwdDM3MjsKKwkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCisJCQkJaW5mby0+c3BlZWQgPSBzaXh0eV9zaXhfYmFzZV9ocHQzNzBhOwogCQkJZWxzZQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHNpeHR5X3NpeF9iYXNlX2hwdDM3MCk7Ci0JCQlwcmludGsoIkhQVDM3WDogdXNpbmcgNjZNSHogUENJIGNsb2NrXG4iKTsKKwkJCQlpbmZvLT5zcGVlZCA9IHNpeHR5X3NpeF9iYXNlX2hwdDM3MDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJIUFQzN1g6IHVzaW5nIDY2TUh6IFBDSSBjbG9ja1xuIik7CiAJCX0KIAl9CiAJCkBAIC0xMjY5LDExICsxMjM5LDE5IEBACiAJICogcmVzdWx0IGluIHNsb3cgcmVhZHMgd2hlbiB1c2luZyBhIDMzTUh6IFBDSSBjbG9jay4gd2UgYWxzbwogCSAqIGRvbid0IGxpa2UgdG8gdXNlIHRoZSBQTEwgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGdsaXRjaGVzCiAJICogb24gUFJTVC9TUlNUIHdoZW4gdGhlIEhQVCBzdGF0ZSBlbmdpbmUgZ2V0cyByZXNldC4KKwkgKgorCSAqIFRvRG86IFVzZSA2Nk1IeiBQTEwgd2hlbiBBVEExMzMgZGV2aWNlcyBhcmUgcHJlc2VudCBvbiBhCisJICogMzcyIGRldmljZSBzbyB3ZSBjYW4gZ2V0IEFUQTEzMyBzdXBwb3J0CiAJICovCi0JaWYgKHBjaV9nZXRfZHJ2ZGF0YShkZXYpKSAKKwlpZiAoaW5mby0+c3BlZWQpCiAJCWdvdG8gaW5pdF9ocHQzN1hfZG9uZTsKKworCWluZm8tPmZsYWdzIHw9IFBMTF9NT0RFOwogCQogCS8qCisJICogRklYTUU6IG1ha2UgdGhpcyB3b3JrIGNvcnJlY3RseSwgZXNwIHdpdGggMzcyTiBhcyBwZXIKKwkgKiByZWZlcmVuY2UgZHJpdmVyIGNvZGUuCisJICoKIAkgKiBhZGp1c3QgUExMIGJhc2VkIHVwb24gUENJIGNsb2NrLCBlbmFibGUgaXQsIGFuZCB3YWl0IGZvcgogCSAqIHN0YWJpbGl6YXRpb24uCiAJICovCkBAIC0xMjk4LDE0ICsxMjc2LDE0IEBACiAJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIAogCQkJCQkJICAgICAgIHBsbCAmIH4weDEwMCk7CiAJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgMHgyMSk7Ci0JCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw4KSkKLQkJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKLQkJCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCi0JCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcyKTsKLQkJCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNCkpCi0JCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7CisJCQkJaWYgKGluZm8tPnJldmlzaW9uID49IDgpCisJCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOworCQkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpCisJCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzI7CisJCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNCkKKwkJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7CiAJCQkJZWxzZQotCQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3MGEpOworCQkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcwYTsKIAkJCQlwcmludGsoIkhQVDM3WDogdXNpbmcgNTBNSHogaW50ZXJuYWwgUExMXG4iKTsKIAkJCQlnb3RvIGluaXRfaHB0MzdYX2RvbmU7CiAJCQl9CkBAIC0xMzE4LDEwICsxMjk2LDIyIEBACiAJfSAKIAogaW5pdF9ocHQzN1hfZG9uZToKKwlpZiAoIWluZm8tPnNwZWVkKQorCQlwcmludGsoS0VSTl9FUlIgIkhQVDM3WCVzOiB1bmtub3duIGJ1cyB0aW1pbmcgWyVkICVkXS5cbiIsCisJCQkoaW5mby0+ZmxhZ3MgJiBJU18zNzJOKT8iTiI6IiIsIHBsbCwgZnJlcSk7CiAJLyogcmVzZXQgc3RhdGUgZW5naW5lICovCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgMHgzNyk7IAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIDB4MzcpOyAKIAl1ZGVsYXkoMTAwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9ocHQzN3goc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCByZWc1YWg7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZyZWc1YWgpOworCS8qIGludGVycnVwdCBmb3JjZSBlbmFibGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAocmVnNWFoICYgfjB4MTApKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMzOCw1OSArMTMyOCwyNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUxLCBkcml2ZV9mYXN0ICYgfjB4ODApOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDAsICZyZWcxKTsKIAkJCQkJCQkJCQotCS8qIGRldGVjdCBidXMgc3BlZWQgYnkgbG9va2luZyBhdCBjb250cm9sIHJlZyB0aW1pbmc6ICovCi0Jc3dpdGNoKChyZWcxID4+IDgpICYgNykgewotCQljYXNlIDU6Ci0JCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmb3J0eV9iYXNlX2hwdDM2Nik7Ci0JCQlicmVhazsKLQkJY2FzZSA5OgotCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdHdlbnR5X2ZpdmVfYmFzZV9ocHQzNjYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNzoKLQkJZGVmYXVsdDoKLQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM2Nik7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAoIXBjaV9nZXRfZHJ2ZGF0YShkZXYpKQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJocHQzNjY6IHVua25vd24gYnVzIHRpbWluZy5cbiIpOwotCQlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9ocHQzNjYoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmV0ID0gMDsKLQl1OCB0ZXN0ID0gMDsKLQorCS8qIEZJWE1FOiBOb3QgcG9ydGFibGUgKi8KIAlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1JPTV9BRERSRVNTLAogCQkJZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmdGVzdCk7Ci0JaWYgKHRlc3QgIT0gKEwxX0NBQ0hFX0JZVEVTIC8gNCkpCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCi0JCQkoTDFfQ0FDSEVfQllURVMgLyA0KSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgKEwxX0NBQ0hFX0JZVEVTIC8gNCkpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDc4KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUlOX0dOVCwgMHgwOCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01BWF9MQVQsIDB4MDgpOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnRlc3QpOwotCWlmICh0ZXN0ICE9IDB4NzgpCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDc4KTsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsICZ0ZXN0KTsKLQlpZiAodGVzdCAhPSAweDA4KQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUlOX0dOVCwgMHgwOCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAmdGVzdCk7Ci0JaWYgKHRlc3QgIT0gMHgwOCkKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01BWF9MQVQsIDB4MDgpOwotCi0JaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsKKwlpZiAoaHB0X3JldmlzaW9uKGRldikgPj0gMykKIAkJcmV0ID0gaW5pdF9ocHQzN3goZGV2KTsKLQl9IGVsc2UgewotCQlyZXQgPWluaXRfaHB0MzY2KGRldik7Ci0JfQorCWVsc2UKKwkJcmV0ID0gaW5pdF9ocHQzNjYoZGV2KTsKKwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE0MDAsMjcgKzEzNTgsMTYgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldgkJPSBod2lmLT5wY2lfZGV2OworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwkJPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXU4IGF0YTY2ID0gMCwgcmVnbWFzawkJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDAxIDogMHgwMjsKLQl1OCBkaWQsIHJpZDsKLQl1bnNpZ25lZCBsb25nIGRtYWJhc2UJCT0gaHdpZi0+ZG1hX2Jhc2U7Ci0JaW50IGlzXzM3Mm4gPSAwOwogCQotCWlmKGRtYWJhc2UpCi0JewotCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOwotCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOwotCQotCQlpZigoZGlkID09IDQgJiYgcmlkID09IDYpIHx8IChkaWQgPT0gNSAmJiByaWQgPiAxKSkKLQkJCWlzXzM3Mm4gPSAxOwotCX0KLQkJCiAJaHdpZi0+dHVuZXByb2MJCQk9ICZocHQzeHhfdHVuZV9kcml2ZTsKIAlod2lmLT5zcGVlZHByb2MJCQk9ICZocHQzeHhfdHVuZV9jaGlwc2V0OwogCWh3aWYtPnF1aXJrcHJvYwkJCT0gJmhwdDN4eF9xdWlya3Byb2M7CiAJaHdpZi0+aW50cnByb2MJCQk9ICZocHQzeHhfaW50cnByb2M7CiAJaHdpZi0+bWFza3Byb2MJCQk9ICZocHQzeHhfbWFza3Byb2M7CiAJCi0JaWYoaXNfMzcybikKKwlpZihpbmZvLT5mbGFncyAmIElTXzM3Mk4pCiAJCWh3aWYtPnJ3X2Rpc2sgPSAmaHB0Mzcybl9yd19kaXNrOwogCiAJLyoKQEAgLTE0MjgsNyArMTM3NSw3IEBACiAJICogYWRkcmVzcyBsaW5lcyB0byBhY2Nlc3MgYW4gZXh0ZXJuYWwgZWVwcm9tLiAgVG8gcmVhZCB2YWxpZAogCSAqIGNhYmxlIGRldGVjdCBzdGF0ZSB0aGUgcGlucyBtdXN0IGJlIGVuYWJsZWQgYXMgaW5wdXRzLgogCSAqLwotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDgpICYmIFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkgeworCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4ICYmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSB7CiAJCS8qCiAJCSAqIEhQVDM3NCBQQ0kgZnVuY3Rpb24gMQogCQkgKiAtIHNldCBiaXQgMTUgb2YgcmVnIDB4NTIgdG8gZW5hYmxlIFRDQkxJRCBhcyBpbnB1dApAQCAtMTQ0Myw3ICsxMzkwLDcgQEAKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAmYXRhNjYpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDUyLCBtY3IzKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg1NiwgbWNyNik7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKSB7CisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKSB7CiAJCS8qCiAJCSAqIEhQVDM3MC8zNzIgYW5kIDM3NCBwY2lmbiAwCiAJCSAqIC0gY2xlYXIgYml0IDAgb2YgMHg1YiB0byBlbmFibGUgUC9TQ0JMSUQgYXMgaW5wdXRzCkBAIC0xNDcwLDcgKzE0MTcsNyBAQAogCQlod2lmLT5zZXJpYWxpemVkID0gaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IDE7CiAjZW5kaWYKIAotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMykpIHsKKwlpZiAoaW5mby0+cmV2aXNpb24gPj0gMykgewogCQl1OCByZWc1YWggPSAwOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgcmVnNWFoICYgfjB4MTApOwogCQkvKgpAQCAtMTQ4MCw4ICsxNDI3LDcgQEAKIAkJICovCiAJCWh3aWYtPnJlc2V0cHJvYwk9ICZocHQzeHhfcmVzZXQ7CiAJCWh3aWYtPmJ1c3Byb2MJPSAmaHB0MzcwX2J1c3Byb2M7Ci0vLwkJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gMTsKLQl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwyKSkgeworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gMikgewogCQlod2lmLT5yZXNldHByb2MJPSAmaHB0M3h4X3Jlc2V0OwogCQlod2lmLT5idXNwcm9jCT0gJmhwdDN4eF90cmlzdGF0ZTsKIAl9IGVsc2UgewpAQCAtMTUwMiwxOCArMTQ0OCwxOCBAQAogCQlod2lmLT51ZG1hX2ZvdXIgPSAoKGF0YTY2ICYgcmVnbWFzaykgPyAwIDogMSk7CiAJaHdpZi0+aWRlX2RtYV9jaGVjayA9ICZocHQzNjZfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKIAotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsOCkpIHsKKwlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCkgewogCQlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJmhwdDM3NF9pZGVfZG1hX3Rlc3RfaXJxOwogCQlod2lmLT5pZGVfZG1hX2VuZCA9ICZocHQzNzRfaWRlX2RtYV9lbmQ7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpIHsKKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpIHsKIAkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZocHQzNzRfaWRlX2RtYV90ZXN0X2lycTsKIAkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmaHB0Mzc0X2lkZV9kbWFfZW5kOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDMpKSB7CisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKSB7CiAJCWh3aWYtPmRtYV9zdGFydCA9ICZocHQzNzBfaWRlX2RtYV9zdGFydDsKIAkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmaHB0MzcwX2lkZV9kbWFfZW5kOwogCQlod2lmLT5pZGVfZG1hX3RpbWVvdXQgPSAmaHB0MzcwX2lkZV9kbWFfdGltZW91dDsKIAkJaHdpZi0+aWRlX2RtYV9sb3N0aXJxID0gJmhwdDM3MF9pZGVfZG1hX2xvc3RpcnE7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMikpCisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSAyKQogCQlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmaHB0MzY2X2lkZV9kbWFfbG9zdGlycTsKIAllbHNlCiAJCWh3aWYtPmlkZV9kbWFfbG9zdGlycSA9ICZocHQzNjZfaWRlX2RtYV9sb3N0aXJxOwpAQCAtMTUyNiw2ICsxNDcyLDcgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX2hwdDM2NihpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGRtYWJhc2UpCiB7CisJc3RydWN0IGhwdF9pbmZvCSppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBtYXN0ZXJkbWEJPSAwLCBzbGF2ZWRtYSA9IDA7CiAJdTggZG1hX25ldwk9IDAsIGRtYV9vbGQgPSAwOwogCXU4IHByaW1hcnkJPSBod2lmLT5jaGFubmVsID8gMHg0YiA6IDB4NDM7CkBAIC0xNTM1LDggKzE0ODIsNyBAQAogCWlmICghZG1hYmFzZSkKIAkJcmV0dXJuOwogCQkKLQlpZihwY2lfZ2V0X2RydmRhdGEoaHdpZi0+cGNpX2RldikgPT0gTlVMTCkKLQl7CisJaWYoaW5mby0+c3BlZWQgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQ6IG5vIGtub3duIElERSB0aW1pbmdzLCBkaXNhYmxpbmcgRE1BLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTU5LDYgKzE1MDUsNDAgQEAKIAlpZGVfc2V0dXBfZG1hKGh3aWYsIGRtYWJhc2UsIDgpOwogfQogCisvKgorICoJV2UgImJvcnJvdyIgdGhpcyBob29rIGluIG9yZGVyIHRvIHNldCB0aGUgZGF0YSBzdHJ1Y3R1cmVzCisgKgl1cCBlYXJseSBlbm91Z2ggYmVmb3JlIGRtYSBvciBpbml0X2h3aWYgY2FsbHMgYXJlIG1hZGUuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaW9wc19ocHQzNjYoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaHB0X2luZm8pLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBsb25nIGRtYWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaHdpZi0+cGNpX2RldiwgNCk7CisJdTggZGlkLCByaWQ7CisKKwlpZihpbmZvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB0MzY2OiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHB0X2luZm8pKTsKKwlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGluZm8pOworCisJaWYoZG1hYmFzZSkgeworCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOworCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOworCisJCWlmKChkaWQgPT0gNCAmJiByaWQgPT0gNikgfHwgKGRpZCA9PSA1ICYmIHJpZCA+IDEpKQorCQkJaW5mby0+ZmxhZ3MgfD0gSVNfMzcyTjsKKwl9CisKKwlpbmZvLT5yZXZpc2lvbiA9IGhwdF9yZXZpc2lvbihod2lmLT5wY2lfZGV2KTsKKworCWlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKQorCQlocHQzN3hfY2xvY2tpbmcoaHdpZik7CisJZWxzZQorCQlocHQzNjZfY2xvY2tpbmcoaHdpZik7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfc2V0dXBfaHB0Mzc0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmZpbmRldiA9IE5VTEw7CkBAIC0xNjQ2LDYgKzE2MjYsNyBAQAogCQkubmFtZQkJPSAiSFBUMzY2IiwKIAkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM2NiwKIAkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfaHB0MzY2LAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKIAkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAogCQkuY2hhbm5lbHMJPSAyLApAQCAtMTY1Niw2ICsxNjM3LDcgQEAKIAkJLm5hbWUJCT0gIkhQVDM3MkEiLAogCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzd4LAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKKwkJLmluaXRfaW9wcwk9IGluaXRfaW9wc19ocHQzNjYsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAogCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCiAJCS5jaGFubmVscwk9IDIsCkBAIC0xNjY1LDYgKzE2NDcsNyBAQAogCQkubmFtZQkJPSAiSFBUMzAyIiwKIAkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3eCwKIAkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfaHB0MzY2LAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKIAkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAogCQkuY2hhbm5lbHMJPSAyLApAQCAtMTY3NCw2ICsxNjU3LDcgQEAKIAkJLm5hbWUJCT0gIkhQVDM3MSIsCiAJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzN3gsCiAJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2hwdDM2NiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCiAJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKIAkJLmNoYW5uZWxzCT0gMiwKQEAgLTE2ODMsNiArMTY2Nyw3IEBACiAJCS5uYW1lCQk9ICJIUFQzNzQiLAogCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzc0LAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKKwkJLmluaXRfaW9wcwk9IGluaXRfaW9wc19ocHQzNjYsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAogCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCiAJCS5jaGFubmVscwk9IDIsCS8qIDQgKi8KQEAgLTE2OTIsNiArMTY3Nyw3IEBACiAJCS5uYW1lCQk9ICJIUFQzNzJOIiwKIAkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3eCwKIAkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfaHB0MzY2LAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKIAkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAogCQkuY2hhbm5lbHMJPSAyLAkvKiA0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvaXQ4MTcyLmMgYi9kcml2ZXJzL2lkZS9wY2kvaXQ4MTcyLmMKaW5kZXggNjMxOTI3Yy4uOTM0NjI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2l0ODE3Mi5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9pdDgxNzIuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9pdDgxNzIgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfaXQ4MTcyIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCXVuc2lnbmVkIGNoYXIgcHJvZ2lmOwogICAgIApAQCAtMjMwLDcgKzIzMCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9pdDgxNzIgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2l0ODE3MiAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiogZGV2ID0gaHdpZi0+cGNpX2RldjsKIAl1bnNpZ25lZCBsb25nIGNtZEJhc2UsIGN0cmxCYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2l0ODIxeC5jIGIvZHJpdmVycy9pZGUvcGNpL2l0ODIxeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDAwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvaXQ4MjF4LmMKQEAgLTAsMCArMSw4MTIgQEAKKworLyoKKyAqIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9pdDgyMXguYwkJVmVyc2lvbiAwLjA5CURlY2VtYmVyIDIwMDQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQJCVJlZCBIYXQgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiAgTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgQmFzZWQgaW4gcGFydCBvbiB0aGUgSVRFIHZlbmRvciBwcm92aWRlZCBTQ1NJIGRyaXZlci4KKyAqCisgKiAgRG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgZnJvbQorICogCWh0dHA6Ly93d3cuaXRlLmNvbS50dy9wYy9JVDgyMTJGX1YwNC5wZGYKKyAqICBTb21lIG90aGVyIGRvY3VtZW50cyBhcmUgTkRBLgorICoKKyAqICBUaGUgSVRFODIxMiBpc24ndCBleGFjdGx5IGEgc3RhbmRhcmQgSURFIGNvbnRyb2xsZXIuIEl0IGhhcyB0d28KKyAqICBtb2Rlcy4gSW4gcGFzcyB0aHJvdWdoIG1vZGUgdGhlbiBpdCBpcyBhbiBJREUgY29udHJvbGxlci4gSW4gaXRzIHNtYXJ0CisgKiAgbW9kZSBpdHMgYWN0dWFsbHkgcXVpdGUgYSBjYXBhYmxlIGhhcmR3YXJlIHJhaWQgY29udHJvbGxlciBkaXNndWlzZWQKKyAqICBhcyBhbiBJREUgY29udHJvbGxlci4gU21hcnQgbW9kZSBvbmx5IHVuZGVyc3RhbmRzIERNQSByZWFkL3dyaXRlIGFuZAorICogIGlkZW50aWZ5LCBub25lIG9mIHRoZSBmYW5jaWVyIGNvbW1hbmRzIGFwcGx5LiBUaGUgSVQ4MjExIGlzIGlkZW50aWNhbAorICogIGluIG90aGVyIHJlc3BlY3RzIGJ1dCBsYWNrcyB0aGUgcmFpZCBtb2RlLgorICoKKyAqICBFcnJhdGE6CisgKiAgbwlSZXYgMHgxMCBhbHNvIHJlcXVpcmVzIG1hc3Rlci9zbGF2ZSBob2xkIHRoZSBzYW1lIERNQSB0aW1pbmdzIGFuZAorICoJY2Fubm90IGRvIEFUQVBJIE1XRE1BLgorICogIG8JVGhlIGlkZW50aWZ5IGRhdGEgZm9yIHJhaWQgdm9sdW1lcyBsYWNrcyBDSFMgaW5mbyAodGVjaG5pY2FsbHkgb2spCisgKglidXQgYWxzbyBmYWlscyB0byBzZXQgdGhlIExCQTI4IGFuZCBvdGhlciBiaXRzLiBXZSBmaXggdGhlc2UgaW4KKyAqCXRoZSBJREUgcHJvYmUgcXVpcmsgY29kZS4KKyAqICBvCUlmIHlvdSB3cml0ZSBMQkE0OCBzaXplZCBJL08ncyAoaWUgPiAyNTYgc2VjdG9yKSBpbiBzbWFydCBtb2RlCisgKglyYWlkIHRoZW4gdGhlIGNvbnRyb2xsZXIgZmlybXdhcmUgZGllcworICogIG8JU21hcnQgbW9kZSB3aXRob3V0IFJBSUQgZG9lc24ndCBjbGVhciBhbGwgdGhlIG5lY2Vzc2FyeSBpZGVudGlmeQorICoJYml0cyB0byByZWR1Y2UgdGhlIGNvbW1hbmQgc2V0IHRvIHRoZSBvbmUgdXNlZAorICoKKyAqICBUaGlzIGhhcyBhIGZldyBpbXBhY3RzIG9uIHRoZSBkcml2ZXIKKyAqICAtIEluIHBhc3MgdGhyb3VnaCBtb2RlIHdlIGRvIGFsbCB0aGUgd29yayB5b3Ugd291bGQgZXhwZWN0CisgKiAgLSBJbiBzbWFydCBtb2RlIHRoZSBjbG9ja2luZyBzZXQgdXAgaXMgZG9uZSBieSB0aGUgY29udHJvbGxlciBnZW5lcmFsbHkKKyAqICAgIGJ1dCB3ZSBtdXN0IHdhdGNoIHRoZSBvdGhlciBsaW1pdHMgYW5kIGZpbHRlci4KKyAqICAtIFRoZXJlIGFyZSBhIGZldyBleHRyYSB2ZW5kb3IgY29tbWFuZHMgdGhhdCBhY3R1YWxseSB0YWxrIHRvIHRoZQorICogICAgY29udHJvbGxlciBidXQgb25seSB3b3JrIFBJTyB3aXRoIG5vIElSUS4KKyAqCisgKiAgVmVuZG9yIGFyZWFzIG9mIHRoZSBpZGVudGlmeSBibG9jayBpbiBzbWFydCBtb2RlIGFyZSB1c2VkIGZvciB0aGUKKyAqICB0aW1pbmcgYW5kIHBvbGljeSBzZXQgdXAuIEVhY2ggSEREIGluIHJhaWQgbW9kZSBhbHNvIGhhcyBhIHNlcmlhbAorICogIGJsb2NrIG9uIHRoZSBkaXNrLiBUaGUgaGFyZHdhcmUgZXh0cmEgY29tbWFuZHMgYXJlIGdldC9zZXQgY2hpcCBzdGF0dXMsCisgKiAgcmVidWlsZCwgZ2V0IHJlYnVpbGQgc3RhdHVzLgorICoKKyAqICBJbiBMaW51eCB0aGUgZHJpdmVyIHN1cHBvcnRzIHBhc3MgdGhyb3VnaCBtb2RlIGFzIGlmIHRoZSBkZXZpY2Ugd2FzCisgKiAganVzdCBhbm90aGVyIElERSBjb250cm9sbGVyLiBJZiB0aGUgc21hcnQgbW9kZSBpcyBydW5uaW5nIHRoZW4KKyAqICB2b2x1bWVzIGFyZSBtYW5hZ2VkIGJ5IHRoZSBjb250cm9sbGVyIGZpcm13YXJlIGFuZCBlYWNoIElERSAiZGlzayIKKyAqICBpcyBhIHJhaWQgdm9sdW1lLiBFdmVuIG1vcmUgY3V0ZSAtIHRoZSBjb250cm9sbGVyIGNhbiBkbyBhdXRvbWF0ZWQKKyAqICBob3RwbHVnIGFuZCByZWJ1aWxkLgorICoKKyAqICBUaGUgcGFzcyB0aHJvdWdoIGNvbnRyb2xsZXIgaXRzZWxmIGlzIGEgbGl0dGxlIGRlbWVudGVkLiBJdCBoYXMgYQorICogIGZsYXcgdGhhdCBpdCBoYXMgYSBzaW5nbGUgc2V0IG9mIFBJTy9NV0RNQSB0aW1pbmdzIHBlciBjaGFubmVsIHNvCisgKiAgbm9uIFVETUEgZGV2aWNlcyByZXN0cmljdCBlYWNoIG90aGVycyBwZXJmb3JtYW5jZS4gSXQgYWxzbyBoYXMgYQorICogIHNpbmdsZSBjbG9jayBzb3VyY2UgcGVyIGNoYW5uZWwgc28gbWl4ZWQgVURNQTEwMC8xMzMgcGVyZm9ybWFuY2UKKyAqICBpc24ndCBwZXJmZWN0IGFuZCB3ZSBoYXZlIHRvIHBpY2sgYSBjbG9jay4gVGhhbmtmdWxseSBub25lIG9mIHRoaXMKKyAqICBtYXR0ZXJzIGluIHNtYXJ0IG1vZGUuIEFUQVBJIERNQSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAqCisgKiAgSXQgc2VlbXMgdGhlIHNtYXJ0IG1vZGUgaXMgYSB3aW4gZm9yIFJBSUQxL1JBSUQxMCBidXQgb3RoZXJ3aXNlIG5vdC4KKyAqCisgKiAgVE9ETworICoJLQlBVEFQSSBVRE1BIGlzIG9rIGJ1dCBub3QgTVdETUEgaXQgc2VlbXMKKyAqCS0JUkFJRCBjb25maWd1cmF0aW9uIGlvY3RscworICoJLQlNb3ZlIHRvIGxpYmF0YSBvbmNlIGl0IGdyb3dzIHVwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3QgaXQ4MjF4X2RldgoreworCXVuc2lnbmVkIGludCBzbWFydDoxLAkJLyogQXJlIHdlIGluIHNtYXJ0IHJhaWQgbW9kZSAqLworCQl0aW1pbmcxMDoxOwkJLyogUmV2IDB4MTAgKi8KKwl1OAljbG9ja19tb2RlOwkJLyogMCwgQVRBXzUwIG9yIEFUQV82NiAqLworCXU4CXdhbnRbMl1bMl07CQkvKiBNb2RlL1ByaSBsb2cgZm9yIG1hc3RlciBzbGF2ZSAqLworCS8qIFdlIG5lZWQgdGhlc2UgZm9yIHN3aXRjaGluZyB0aGUgY2xvY2sgd2hlbiBETUEgZ29lcyBvbi9vZmYKKwkgICBUaGUgaGlnaCBieXRlIGlzIHRoZSA2Nk1oeiB0aW1pbmcgKi8KKwl1MTYJcGlvWzJdOwkJCS8qIENhY2hlZCBQSU8gdmFsdWVzICovCisJdTE2CW13ZG1hWzJdOwkJLyogQ2FjaGVkIE1XRE1BIHZhbHVlcyAqLworCXUxNgl1ZG1hWzJdOwkJLyogQ2FjaGVkIFVETUEgdmFsdWVzIChwZXIgZHJpdmUpICovCit9OworCisjZGVmaW5lIEFUQV82NgkJMAorI2RlZmluZSBBVEFfNTAJCTEKKyNkZWZpbmUgQVRBX0FOWQkJMgorCisjZGVmaW5lIFVETUFfT0ZGCTAKKyNkZWZpbmUgTVdETUFfT0ZGCTAKKworLyoKKyAqCVdlIGFsbG93IHVzZXJzIHRvIGZvcmNlIHRoZSBjYXJkIGludG8gbm9uIHJhaWQgbW9kZSB3aXRob3V0CisgKglmbGFzaGluZyB0aGUgYWx0ZXJuYXRpdmUgQklPUy4gVGhpcyBpcyBhbHNvIG5lY2Nlc3NhcnkgcmlnaHQgbm93CisgKglmb3IgZW1iZWRkZWQgcGxhdGZvcm1zIHRoYXQgY2Fubm90IHJ1biBhIFBDIEJJT1MgYnV0IGFyZSB1c2luZyB0aGlzCisgKglkZXZpY2UuCisgKi8KKworc3RhdGljIGludCBpdDgyMTJfbm9yYWlkOworCisvKioKKyAqCWl0ODIxeF9wcm9ncmFtCS0JcHJvZ3JhbSB0aGUgUElPL01XRE1BIHJlZ2lzdGVycworICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKgorICoJUHJvZ3JhbSB0aGUgUElPL01XRE1BIHRpbWluZyBmb3IgdGhpcyBjaGFubmVsIGFjY29yZGluZyB0byB0aGUKKyAqCWN1cnJlbnQgY2xvY2suCisgKi8KKworc3RhdGljIHZvaWQgaXQ4MjF4X3Byb2dyYW0oaWRlX2RyaXZlX3QgKmRyaXZlLCB1MTYgdGltaW5nKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCBjaGFubmVsID0gaHdpZi0+Y2hhbm5lbDsKKwl1OCBjb25mOworCisJLyogUHJvZ3JhbSBQSU8vTVdETUEgdGltaW5nIGJpdHMgKi8KKwlpZihpdGRldi0+Y2xvY2tfbW9kZSA9PSBBVEFfNjYpCisJCWNvbmYgPSB0aW1pbmcgPj4gODsKKwllbHNlCisJCWNvbmYgPSB0aW1pbmcgJiAweEZGOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDU0ICsgNCAqIGNoYW5uZWwsIGNvbmYpOworfQorCisvKioKKyAqCWl0ODIxeF9wcm9ncmFtX3VkbWEJLQlwcm9ncmFtIHRoZSBVRE1BIHJlZ2lzdGVycworICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKgorICoJUHJvZ3JhbSB0aGUgVURNQSB0aW1pbmcgZm9yIHRoaXMgZHJpdmUgYWNjb3JkaW5nIHRvIHRoZQorICoJY3VycmVudCBjbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBpdDgyMXhfcHJvZ3JhbV91ZG1hKGlkZV9kcml2ZV90ICpkcml2ZSwgdTE2IHRpbWluZykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgY2hhbm5lbCA9IGh3aWYtPmNoYW5uZWw7CisJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwl1OCBjb25mOworCisJLyogUHJvZ3JhbSBVRE1BIHRpbWluZyBiaXRzICovCisJaWYoaXRkZXYtPmNsb2NrX21vZGUgPT0gQVRBXzY2KQorCQljb25mID0gdGltaW5nID4+IDg7CisJZWxzZQorCQljb25mID0gdGltaW5nICYgMHhGRjsKKwlpZihpdGRldi0+dGltaW5nMTAgPT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTYgKyA0ICogY2hhbm5lbCArIHVuaXQsIGNvbmYpOworCWVsc2UgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1NiArIDQgKiBjaGFubmVsLCBjb25mKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTYgKyA0ICogY2hhbm5lbCArIDEsIGNvbmYpOworCX0KK30KKworCisvKioKKyAqCWl0ODIxeF9jbG9ja19zdHJhdGVneQorICoJQGh3aWY6IGhhcmR3YXJlIGludGVyZmFjZQorICoKKyAqCVNlbGVjdCBiZXR3ZWVuIHRoZSA1MCBhbmQgNjZNaHogYmFzZSBjbG9ja3MgdG8gZ2V0IHRoZSBiZXN0CisgKglyZXN1bHRzIGZvciB0aGlzIGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCBpdDgyMXhfY2xvY2tfc3RyYXRlZ3koaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCisJdTggdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCWlkZV9kcml2ZV90ICpwYWlyID0gJmh3aWYtPmRyaXZlc1sxLXVuaXRdOworCisJaW50IGNsb2NrLCBhbHRjbG9jazsKKwl1OCB2OworCWludCBzZWwgPSAwOworCisJaWYoaXRkZXYtPndhbnRbMF1bMF0gPiBpdGRldi0+d2FudFsxXVswXSkgeworCQljbG9jayA9IGl0ZGV2LT53YW50WzBdWzFdOworCQlhbHRjbG9jayA9IGl0ZGV2LT53YW50WzFdWzFdOworCX0gZWxzZSB7CisJCWNsb2NrID0gaXRkZXYtPndhbnRbMV1bMV07CisJCWFsdGNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07CisJfQorCisJLyogTWFzdGVyIGRvZXNuJ3QgY2FyZSBkb2VzIHRoZSBzbGF2ZSA/ICovCisJaWYoY2xvY2sgPT0gQVRBX0FOWSkKKwkJY2xvY2sgPSBhbHRjbG9jazsKKworCS8qIE5vYm9keSBjYXJlcyAtIGtlZXAgdGhlIHNhbWUgY2xvY2sgKi8KKwlpZihjbG9jayA9PSBBVEFfQU5ZKQorCQlyZXR1cm47CisJLyogTm8gY2hhbmdlICovCisJaWYoY2xvY2sgPT0gaXRkZXYtPmNsb2NrX21vZGUpCisJCXJldHVybjsKKworCS8qIExvYWQgdGhpcyBpbnRvIHRoZSBjb250cm9sbGVyID8gKi8KKwlpZihjbG9jayA9PSBBVEFfNjYpCisJCWl0ZGV2LT5jbG9ja19tb2RlID0gQVRBXzY2OworCWVsc2UgeworCQlpdGRldi0+Y2xvY2tfbW9kZSA9IEFUQV81MDsKKwkJc2VsID0gMTsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1MCwgJnYpOworCXYgJj0gfigxIDw8ICgxICsgaHdpZi0+Y2hhbm5lbCkpOworCXYgfD0gc2VsIDw8ICgxICsgaHdpZi0+Y2hhbm5lbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsIHYpOworCisJLyoKKwkgKglSZXByb2dyYW0gdGhlIFVETUEvUElPIG9mIHRoZSBwYWlyIGRyaXZlIGZvciB0aGUgc3dpdGNoCisJICoJTVdETUEgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBkbWEgc3dpdGNoZXIKKwkgKi8KKwlpZihwYWlyICYmIGl0ZGV2LT51ZG1hWzEtdW5pdF0gIT0gVURNQV9PRkYpIHsKKwkJaXQ4MjF4X3Byb2dyYW1fdWRtYShwYWlyLCBpdGRldi0+dWRtYVsxLXVuaXRdKTsKKwkJaXQ4MjF4X3Byb2dyYW0ocGFpciwgaXRkZXYtPnBpb1sxLXVuaXRdKTsKKwl9CisJLyoKKwkgKglSZXByb2dyYW0gdGhlIFVETUEvUElPIG9mIG91ciBkcml2ZSBmb3IgdGhlIHN3aXRjaC4KKwkgKglNV0RNQSB3aWxsIGJlIGRlYWx0IHdpdGggYnkgdGhlIGRtYSBzd2l0Y2hlcgorCSAqLworCWlmKGl0ZGV2LT51ZG1hW3VuaXRdICE9IFVETUFfT0ZGKSB7CisJCWl0ODIxeF9wcm9ncmFtX3VkbWEoZHJpdmUsIGl0ZGV2LT51ZG1hW3VuaXRdKTsKKwkJaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5waW9bdW5pdF0pOworCX0KK30KKworLyoqCisgKglpdDgyMXhfcmF0ZW1hc2sJLQlDb21wdXRlIGF2YWlsYWJsZSBtb2RlcworICoJQGRyaXZlOiBJREUgZHJpdmUKKyAqCisgKglDb21wdXRlIHRoZSBhdmFpbGFibGUgc3BlZWRzIGZvciB0aGUgZGV2aWNlcyBvbiB0aGUgaW50ZXJmYWNlLiBUaGlzCisgKglpcyBhbGwgbW9kZXMgdG8gQVRBMTMzIGNsaXBwZWQgYnkgZHJpdmUgY2FibGUgc2V0dXAuCisgKi8KKworc3RhdGljIHU4IGl0ODIxeF9yYXRlbWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IG1vZGUJPSA0OworCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisJcmV0dXJuIG1vZGU7Cit9CisKKy8qKgorICoJaXQ4MjF4X3R1bmVwcm9jCS0JdHVuZSBhIGRyaXZlCisgKglAZHJpdmU6IGRyaXZlIHRvIHR1bmUKKyAqCUBtb2RlX3dhbnRlZDogdGhlIHRhcmdldCBvcGVyYXRpbmcgbW9kZQorICoKKyAqCUxvYWQgdGhlIHRpbWluZyBzZXR0aW5ncyBmb3IgdGhpcyBkZXZpY2UgbW9kZSBpbnRvIHRoZQorICoJY29udHJvbGxlci4gQnkgdGhlIHRpbWUgd2UgYXJlIGNhbGxlZCB0aGUgbW9kZSBoYXMgYmVlbgorICoJbW9kaWZpZWQgYXMgbmVjY2Vzc2FyeSB0byBoYW5kbGUgdGhlIGFic2VuY2Ugb2Ygc2VwZXJhdGUKKyAqCW1hc3Rlci9zbGF2ZSB0aW1lcnMgZm9yIE1XRE1BL1BJTy4KKyAqCisgKglUaGlzIGNvZGUgaXMgb25seSB1c2VkIGluIHBhc3MgdGhyb3VnaCBtb2RlLgorICovCisKK3N0YXRpYyB2b2lkIGl0ODIxeF90dW5lcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisKKwkvKiBTcGVjIHNheXMgODkgcmVmIGRyaXZlciB1c2VzIDg4ICovCisJc3RhdGljIHUxNiBwaW9bXQk9IHsgMHhBQTg4LCAweEEzODIsIDB4QTE4MSwgMHgzMzMyLCAweDMxMjEgfTsKKwlzdGF0aWMgdTggcGlvX3dhbnRbXSAgICA9IHsgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBXzY2LCBBVEFfQU5ZIH07CisKKwlpZihpdGRldi0+c21hcnQpCisJCXJldHVybjsKKworCS8qIFdlIHByZWZlciA2Nk1oeiBjbG9jayBmb3IgUElPIDAtMywgZG9uJ3QgY2FyZSBmb3IgUElPNCAqLworCWl0ZGV2LT53YW50W3VuaXRdWzFdID0gcGlvX3dhbnRbbW9kZV93YW50ZWRdOworCWl0ZGV2LT53YW50W3VuaXRdWzBdID0gMTsJLyogUElPIGlzIGxvd2VzdCBwcmlvcml0eSAqLworCWl0ZGV2LT5waW9bdW5pdF0gPSBwaW9bbW9kZV93YW50ZWRdOworCWl0ODIxeF9jbG9ja19zdHJhdGVneShkcml2ZSk7CisJaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5waW9bdW5pdF0pOworfQorCisvKioKKyAqCWl0ODIxeF90dW5lX213ZG1hCS0JdHVuZSBhIGNoYW5uZWwgZm9yIE1XRE1BCisgKglAZHJpdmU6IGRyaXZlIHRvIHNldCB1cAorICoJQG1vZGVfd2FudGVkOiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBtb2RlCisgKgorICoJTG9hZCB0aGUgdGltaW5nIHNldHRpbmdzIGZvciB0aGlzIGRldmljZSBtb2RlIGludG8gdGhlCisgKgljb250cm9sbGVyIHdoZW4gZG9pbmcgTVdETUEgaW4gcGFzcyB0aHJvdWdoIG1vZGUuIFRoZSBjYWxsZXIKKyAqCW11c3QgbWFuYWdlIHRoZSB3aG9sZSBsYWNrIG9mIHBlciBkZXZpY2UgTVdETUEvUElPIHRpbWluZ3MgYW5kCisgKgl0aGUgc2hhcmVkIE1XRE1BL1BJTyB0aW1pbmcgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfbXdkbWEgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBtb2RlX3dhbnRlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gKHZvaWQgKilpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJaW50IGNoYW5uZWwgPSBod2lmLT5jaGFubmVsOworCXU4IGNvbmY7CisKKwlzdGF0aWMgdTE2IGRtYVtdCT0geyAweDg4NjYsIDB4MzIyMiwgMHgzMTIxIH07CisJc3RhdGljIHU4IG13ZG1hX3dhbnRbXQk9IHsgQVRBX0FOWSwgQVRBXzY2LCBBVEFfQU5ZIH07CisKKwlpdGRldi0+d2FudFt1bml0XVsxXSA9IG13ZG1hX3dhbnRbbW9kZV93YW50ZWRdOworCWl0ZGV2LT53YW50W3VuaXRdWzBdID0gMjsJLyogTVdETUEgaXMgbG93IHByaW9yaXR5ICovCisJaXRkZXYtPm13ZG1hW3VuaXRdID0gZG1hW21vZGVfd2FudGVkXTsKKwlpdGRldi0+dWRtYVt1bml0XSA9IFVETUFfT0ZGOworCisJLyogVURNQSBiaXRzIG9mZiAtIFJldmlzaW9uIDB4MTAgZG8gdGhlbSBpbiBwYWlycyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZjb25mKTsKKwlpZihpdGRldi0+dGltaW5nMTApCisJCWNvbmYgfD0gY2hhbm5lbCA/IDB4NjA6IDB4MTg7CisJZWxzZQorCQljb25mIHw9IDEgPDwgKDMgKyAyICogY2hhbm5lbCArIHVuaXQpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCBjb25mKTsKKworCWl0ODIxeF9jbG9ja19zdHJhdGVneShkcml2ZSk7CisJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gcHJvZ3JhbSB0aGlzID8gKi8KKwkvKiBpdDgyMXhfcHJvZ3JhbShkcml2ZSwgaXRkZXYtPm13ZG1hW3VuaXRdKTsgKi8KK30KKworLyoqCisgKglpdDgyMXhfdHVuZV91ZG1hCS0JdHVuZSBhIGNoYW5uZWwgZm9yIFVETUEKKyAqCUBkcml2ZTogZHJpdmUgdG8gc2V0IHVwCisgKglAbW9kZV93YW50ZWQ6IHRoZSB0YXJnZXQgb3BlcmF0aW5nIG1vZGUKKyAqCisgKglMb2FkIHRoZSB0aW1pbmcgc2V0dGluZ3MgZm9yIHRoaXMgZGV2aWNlIG1vZGUgaW50byB0aGUKKyAqCWNvbnRyb2xsZXIgd2hlbiBkb2luZyBVRE1BIG1vZGVzIGluIHBhc3MgdGhyb3VnaC4KKyAqLworCitzdGF0aWMgdm9pZCBpdDgyMXhfdHVuZV91ZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgbW9kZV93YW50ZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlpbnQgY2hhbm5lbCA9IGh3aWYtPmNoYW5uZWw7CisJdTggY29uZjsKKworCXN0YXRpYyB1MTYgdWRtYVtdCT0geyAweDQ0MzMsIDB4NDIzMSwgMHgzMTIxLCAweDIxMjEsIDB4MTExMSwgMHgyMjExLCAweDExMTEgfTsKKwlzdGF0aWMgdTggdWRtYV93YW50W10JPSB7IEFUQV9BTlksIEFUQV81MCwgQVRBX0FOWSwgQVRBXzY2LCBBVEFfNjYsIEFUQV81MCwgQVRBXzY2IH07CisKKwlpdGRldi0+d2FudFt1bml0XVsxXSA9IHVkbWFfd2FudFttb2RlX3dhbnRlZF07CisJaXRkZXYtPndhbnRbdW5pdF1bMF0gPSAzOwkvKiBVRE1BIGlzIGhpZ2ggcHJpb3JpdHkgKi8KKwlpdGRldi0+bXdkbWFbdW5pdF0gPSBNV0RNQV9PRkY7CisJaXRkZXYtPnVkbWFbdW5pdF0gPSB1ZG1hW21vZGVfd2FudGVkXTsKKwlpZihtb2RlX3dhbnRlZCA+PSA1KQorCQlpdGRldi0+dWRtYVt1bml0XSB8PSAweDgwODA7CS8qIFVETUEgNS82IHNlbGVjdCBvbiAqLworCisJLyogVURNQSBvbi4gQWdhaW4gcmV2aXNpb24gMHgxMCBtdXN0IGRvIHRoZSBwYWlyICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1MCwgJmNvbmYpOworCWlmKGl0ZGV2LT50aW1pbmcxMCkKKwkJY29uZiAmPSBjaGFubmVsID8gMHg5RjogMHhFNzsKKwllbHNlCisJCWNvbmYgJj0gfiAoMSA8PCAoMyArIDIgKiBjaGFubmVsICsgdW5pdCkpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCBjb25mKTsKKworCWl0ODIxeF9jbG9ja19zdHJhdGVneShkcml2ZSk7CisJaXQ4MjF4X3Byb2dyYW1fdWRtYShkcml2ZSwgaXRkZXYtPnVkbWFbdW5pdF0pOworCit9CisKKy8qKgorICoJY29uZmlnX2l0ODIxeF9jaGlwc2V0X2Zvcl9waW8JLQlzZXQgZHJpdmUgdGltaW5ncworICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKglAc3BlZWQgd2Ugd2FudAorICoKKyAqCUNvbXB1dGUgdGhlIGJlc3QgcGlvIG1vZGUgd2UgY2FuIGZvciBhIGdpdmVuIGRldmljZS4gV2UgbXVzdAorICoJcGljayBhIHNwZWVkIHRoYXQgZG9lcyBub3QgY2F1c2UgcHJvYmxlbXMgd2l0aCB0aGUgb3RoZXIgZGV2aWNlCisgKglvbiB0aGUgY2FibGUuCisgKi8KKworc3RhdGljIHZvaWQgY29uZmlnX2l0ODIxeF9jaGlwc2V0X2Zvcl9waW8gKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBzZXRfc3BlZWQpCit7CisJdTggdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlpZGVfZHJpdmVfdCAqcGFpciA9ICZod2lmLT5kcml2ZXNbMS11bml0XTsKKwl1OCBzcGVlZCA9IDAsIHNldF9waW8JPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDI1NSwgNSwgTlVMTCk7CisJdTggcGFpcl9waW87CisKKwkvKiBXZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzIG1lc3MgaW4gcGFpcnMgKi8KKwlpZihwYWlyICE9IE5VTEwpIHsKKwkJcGFpcl9waW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUocGFpciwgMjU1LCA1LCBOVUxMKTsKKwkJLyogVHJpbSBQSU8gdG8gdGhlIHNsb3dlc3Qgb2YgdGhlIG1hc3Rlci9zbGF2ZSAqLworCQlpZihwYWlyX3BpbyA8IHNldF9waW8pCisJCQlzZXRfcGlvID0gcGFpcl9waW87CisJfQorCWl0ODIxeF90dW5lcHJvYyhkcml2ZSwgc2V0X3Bpbyk7CisJc3BlZWQgPSBYRkVSX1BJT18wICsgc2V0X3BpbzsKKwkvKiBYWFggLSBXZSB0cmltIHRvIHRoZSBsb3dlc3Qgb2YgdGhlIHBhaXIgc28gdGhlIG90aGVyIGRyaXZlCisJICAgd2lsbCBhbHdheXMgYmUgZmluZSBhdCB0aGlzIHBvaW50IHVudGlsIHdlIGRvIGhvdHBsdWcgcGFzc3RocnUgKi8KKworCWlmIChzZXRfc3BlZWQpCisJCSh2b2lkKSBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCk7Cit9CisKKy8qKgorICoJaXQ4MjF4X2RtYV9yZWFkCS0JRE1BIGhvb2sKKyAqCUBkcml2ZTogZHJpdmUgZm9yIERNQQorICoKKyAqCVRoZSBJVDgyMXggaGFzIGEgc2luZ2xlIHRpbWluZyByZWdpc3RlciBmb3IgTVdETUEgYW5kIGZvciBQSU8KKyAqCW9wZXJhdGlvbnMuIEFzIHdlIGZsaXAgYmFjayBhbmQgZm9ydGggd2UgaGF2ZSB0byByZWxvYWQgdGhlCisgKgljbG9jay4gSW4gYWRkaXRpb24gdGhlIHJldiAweDEwIGRldmljZSBvbmx5IHdvcmtzIGlmIHRoZSBzYW1lCisgKgl0aW1pbmcgdmFsdWUgaXMgbG9hZGVkIGludG8gdGhlIG1hc3RlciBhbmQgc2xhdmUgVURNQSBjbG9jaworICogCXNvIHdlIG11c3QgYWxzbyByZWxvYWQgdGhhdC4KKyAqCisgKglGSVhNRTogd2UgY291bGQgZmlndXJlIG91dCBpbiBhZHZhbmNlIGlmIHdlIG5lZWQgdG8gZG8gcmVsb2FkcworICovCisKK3N0YXRpYyB2b2lkIGl0ODIxeF9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJaWYoaXRkZXYtPm13ZG1hW3VuaXRdICE9IE1XRE1BX09GRikKKwkJaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5td2RtYVt1bml0XSk7CisJZWxzZSBpZihpdGRldi0+dWRtYVt1bml0XSAhPSBVRE1BX09GRiAmJiBpdGRldi0+dGltaW5nMTApCisJCWl0ODIxeF9wcm9ncmFtX3VkbWEoZHJpdmUsIGl0ZGV2LT51ZG1hW3VuaXRdKTsKKwlpZGVfZG1hX3N0YXJ0KGRyaXZlKTsKK30KKworLyoqCisgKglpdDgyMXhfZG1hX3dyaXRlCS0JRE1BIGhvb2sKKyAqCUBkcml2ZTogZHJpdmUgZm9yIERNQSBzdG9wCisgKgorICoJVGhlIElUODIxeCBoYXMgYSBzaW5nbGUgdGltaW5nIHJlZ2lzdGVyIGZvciBNV0RNQSBhbmQgZm9yIFBJTworICoJb3BlcmF0aW9ucy4gQXMgd2UgZmxpcCBiYWNrIGFuZCBmb3J0aCB3ZSBoYXZlIHRvIHJlbG9hZCB0aGUKKyAqCWNsb2NrLgorICovCisKK3N0YXRpYyBpbnQgaXQ4MjF4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJaW50IHJldCA9IF9faWRlX2RtYV9lbmQoZHJpdmUpOworCWlmKGl0ZGV2LT5td2RtYVt1bml0XSAhPSBNV0RNQV9PRkYpCisJCWl0ODIxeF9wcm9ncmFtKGRyaXZlLCBpdGRldi0+cGlvW3VuaXRdKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJaXQ4MjF4X3R1bmVfY2hpcHNldAktCXNldCBjb250cm9sbGVyIHRpbWluZ3MKKyAqCUBkcml2ZTogRHJpdmUgdG8gc2V0IHVwCisgKglAeGZlcnNwZWVkOiBzcGVlZCB3ZSB3YW50IHRvIGFjaGlldmUKKyAqCisgKglUdW5lIHRoZSBJVEUgY2hpcHNldCBmb3IgdGhlIGRlc2lyZWQgbW9kZS4gSWYgd2UgY2FuJ3QgYWNoaWV2ZQorICoJdGhlIGRlc2lyZWQgbW9kZSB0aGVuIHR1bmUgZm9yIGEgbG93ZXIgb25lLCBidXQgdWx0aW1hdGVseQorICoJbWFrZSB0aGUgdGhpbmcgd29yay4KKyAqLworCitzdGF0aWMgaW50IGl0ODIxeF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSB4ZmVyc3BlZWQpCit7CisKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwl1OCBzcGVlZAkJPSBpZGVfcmF0ZV9maWx0ZXIoaXQ4MjF4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKworCWlmKCFpdGRldi0+c21hcnQpIHsKKwkJc3dpdGNoKHNwZWVkKSB7CisJCQljYXNlIFhGRVJfUElPXzQ6CisJCQljYXNlIFhGRVJfUElPXzM6CisJCQljYXNlIFhGRVJfUElPXzI6CisJCQljYXNlIFhGRVJfUElPXzE6CisJCQljYXNlIFhGRVJfUElPXzA6CisJCQkJaXQ4MjF4X3R1bmVwcm9jKGRyaXZlLCAoc3BlZWQgLSBYRkVSX1BJT18wKSk7CisJCQkJYnJlYWs7CisJCQkvKiBNV0RNQSB0dW5pbmcgaXMgcmVhbGx5IGhhcmQgYmVjYXVzZSBvdXIgTVdETUEgYW5kIFBJTworCQkJICAgdGltaW5ncyBhcmUga2VwdCBpbiB0aGUgc2FtZSBwbGFjZS4gV2UgY2FuIHN3aXRjaCBpbiB0aGUKKwkJCSAgIGhvc3QgZG1hIG9uL29mZiBjYWxsYmFja3MgKi8KKwkJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJCQlpdDgyMXhfdHVuZV9td2RtYShkcml2ZSwgKHNwZWVkIC0gWEZFUl9NV19ETUFfMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBYRkVSX1VETUFfNjoKKwkJCWNhc2UgWEZFUl9VRE1BXzU6CisJCQljYXNlIFhGRVJfVURNQV80OgorCQkJY2FzZSBYRkVSX1VETUFfMzoKKwkJCWNhc2UgWEZFUl9VRE1BXzI6CisJCQljYXNlIFhGRVJfVURNQV8xOgorCQkJY2FzZSBYRkVSX1VETUFfMDoKKwkJCQlpdDgyMXhfdHVuZV91ZG1hKGRyaXZlLCAoc3BlZWQgLSBYRkVSX1VETUFfMCkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKgorCSAqCUluIHNtYXJ0IG1vZGUgdGhlIGNsb2NraW5nIGlzIGRvbmUgYnkgdGhlIGhvc3QgY29udHJvbGxlcgorCSAqIAlzbm9vcGluZyB0aGUgbW9kZSB3ZSBwaWNrZWQuIFRoZSByZXN0IG9mIGl0IGlzIG5vdCBvdXIgcHJvYmxlbQorCSAqLworCXJldHVybiBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCk7Cit9CisKKy8qKgorICoJY29uZmlnX2NoaXBzZXRfZm9yX2RtYQktCWNvbmZpZ3VyZSBmb3IgRE1BCisgKglAZHJpdmU6IGRyaXZlIHRvIGNvbmZpZ3VyZQorICoKKyAqCUNhbGxlZCBieSB0aGUgSURFIGxheWVyIHdoZW4gaXQgd2FudHMgdGhlIHRpbWluZ3Mgc2V0IHVwLgorICovCisKK3N0YXRpYyBpbnQgY29uZmlnX2NoaXBzZXRfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IHNwZWVkCT0gaWRlX2RtYV9zcGVlZChkcml2ZSwgaXQ4MjF4X3JhdGVtYXNrKGRyaXZlKSk7CisKKwljb25maWdfaXQ4MjF4X2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgIXNwZWVkKTsKKwlpdDgyMXhfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworLyoqCisgKglpdDgyMXhfY29uZmlndXJlX2RyaXZlX2Zvcl9kbWEJLQlzZXQgdXAgZm9yIERNQSB0cmFuc2ZlcnMKKyAqCUBkcml2ZTogZHJpdmUgd2UgYXJlIGdvaW5nIHRvIHNldCB1cAorICoKKyAqCVNldCB1cCB0aGUgZHJpdmUgZm9yIERNQSwgdHVuZSB0aGUgY29udHJvbGxlciBhbmQgZHJpdmUgYXMKKyAqCXJlcXVpcmVkLiBJZiB0aGUgZHJpdmUgaXNuJ3Qgc3VpdGFibGUgZm9yIERNQSBvciB3ZSBoaXQKKyAqCW90aGVyIHByb2JsZW1zIHRoZW4gd2Ugd2lsbCBkcm9wIGRvd24gdG8gUElPIGFuZCBzZXQgdXAKKyAqCVBJTyBhcHByb3ByaWF0ZWx5CisgKi8KKworc3RhdGljIGludCBpdDgyMXhfY29uZmlnX2RyaXZlX2Zvcl9kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisKKwlpZiAoaWRlX3VzZV9kbWEoZHJpdmUpKSB7CisJCWlmIChjb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKKwkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwl9CisJY29uZmlnX2l0ODIxeF9jaGlwc2V0X2Zvcl9waW8oZHJpdmUsIDEpOworCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKK30KKworLyoqCisgKglhdGE2Nl9pdDgyMXgJLQljaGVjayBmb3IgODAgcGluIGNhYmxlCisgKglAaHdpZjogaW50ZXJmYWNlIHRvIGNoZWNrCisgKgorICoJQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbiBBVEE2NiBjYXBhYmxlIGNhYmxlIG9uIHRoZQorICoJaW50ZXJmYWNlLiBQcm9ibGVtYXRpYyBhcyBpdCBzZWVtcyBzb21lIGNhcmRzIGRvbid0IGhhdmUKKyAqCXRoZSBuZWVkZWQgbG9naWMgb25ib2FyZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBhdGE2Nl9pdDgyMXgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwkvKiBUaGUgcmVmZXJlbmNlIGRyaXZlciBhbHNvIG9ubHkgZG9lcyBkaXNrIHNpZGUgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglpdDgyMXhfZml4dXAJLQlwb3N0IGluaXQgY2FsbGJhY2sKKyAqCUBod2lmOiBpbnRlcmZhY2UKKyAqCisgKglUaGlzIGNhbGxiYWNrIGlzIHJ1biBhZnRlciB0aGUgZHJpdmVzIGhhdmUgYmVlbiBwcm9iZWQgYnV0CisgKgliZWZvcmUgYW55dGhpbmcgZ2V0cyBhdHRhY2hlZC4gSXQgYWxsb3dzIGRyaXZlcnMgdG8gZG8gYW55CisgKglmaW5hbCB0dW5pbmcgdGhhdCBpcyBuZWVkZWQsIG9yIGZpeHVwcyB0byB3b3JrIGFyb3VuZCBidWdzLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpdDgyMXhfZml4dXBzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgaTsKKworCWlmKCFpdGRldi0+c21hcnQpIHsKKwkJLyoKKwkJICoJSWYgd2UgYXJlIGluIHBhc3MgdGhyb3VnaCBtb2RlIHRoZW4gbm90IG11Y2gKKwkJICoJbmVlZHMgdG8gYmUgZG9uZSwgYnV0IHdlIGRvIGJvdGhlciB0byBjbGVhciB0aGUKKwkJICoJSVJRIG1hc2sgYXMgd2UgbWF5IHdlbGwgYmUgaW4gUElPIChlZyByZXYgMHgxMCkKKwkJICoJZm9yIG5vdyBhbmQgd2Uga25vdyB1bm1hc2tpbmcgaXMgc2FmZSBvbiB0aGlzIGNoaXBzZXQuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOworCQkJaWYoZHJpdmUtPnByZXNlbnQpCisJCQkJZHJpdmUtPnVubWFzayA9IDE7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKgorCSAqCVBlcmZvcm0gZml4dXBzIG9uIHNtYXJ0IG1vZGUuIFdlIG5lZWQgdG8gImxvc2UiIHNvbWUKKwkgKgljYXBhYmlsaXRpZXMgdGhlIGZpcm13YXJlIGxhY2tzIGJ1dCBkb2VzIG5vdCBmaWx0ZXIsIGFuZAorCSAqCWFsc28gcGF0Y2ggdXAgc29tZSBjYXBhYmlsaXR5IGJpdHMgdGhhdCBpdCBmb3JnZXRzIHRvIHNldAorCSAqCWluIFJBSUQgbW9kZS4KKwkgKi8KKworCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOworCQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQ7CisJCXUxNiAqaWRiaXRzOworCisJCWlmKCFkcml2ZS0+cHJlc2VudCkKKwkJCWNvbnRpbnVlOworCQlpZCA9IGRyaXZlLT5pZDsKKwkJaWRiaXRzID0gKHUxNiAqKWRyaXZlLT5pZDsKKworCQkvKiBDaGVjayBmb3IgUkFJRCB2IG5hdGl2ZSAqLworCQlpZihzdHJzdHIoaWQtPm1vZGVsLCAiSW50ZWdyYXRlZCBUZWNobm9sb2d5IEV4cHJlc3MiKSkgeworCQkJLyogSW4gcmFpZCBtb2RlIHRoZSBpZGVudCBibG9jayBpcyBzbGlnaHRseSBidWdneQorCQkJICAgV2UgbmVlZCB0byBzZXQgdGhlIGJpdHMgc28gdGhhdCB0aGUgSURFIGxheWVyIGtub3dzCisJCQkgICBMQkEyOC4gTEJBNDggYW5kIERNQSBhciB2YWxpZCAqLworCQkJaWQtPmNhcGFiaWxpdHkgfD0gMzsJCS8qIExCQTI4LCBETUEgKi8KKwkJCWlkLT5jb21tYW5kX3NldF8yIHw9IDB4MDQwMDsJLyogTEJBNDggdmFsaWQgKi8KKwkJCWlkLT5jZnNfZW5hYmxlXzIgfD0gMHgwNDAwOwkvKiBMQkE0OCBvbiAqLworCQkJLyogUmVwb3J0aW5nIGxvZ2ljICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSVQ4MjEyICVzUkFJRCAlZCB2b2x1bWUiLAorCQkJCWRyaXZlLT5uYW1lLAorCQkJCWlkYml0c1sxNDddID8gIkJvb3RhYmxlICI6IiIsCisJCQkJaWRiaXRzWzEyOV0pOworCQkJCWlmKGlkYml0c1sxMjldICE9IDEpCisJCQkJCXByaW50aygiKCVkSyBzdHJpcGUpIiwgaWRiaXRzWzE0Nl0pOworCQkJCXByaW50aygiLlxuIik7CisJCQkvKiBOb3cgdGhlIGNvcmUgY29kZSB3aWxsIGhhdmUgd3JvbmdseSBkZWNpZGVkIG5vIERNQQorCQkJICAgc28gd2UgbmVlZCB0byBmaXggdGhpcyAqLworCQkJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisjaWZkZWYgQ09ORklHX0lERURNQV9PTkxZRElTSworCQkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKyNlbmRpZgorCQkJCWh3aWYtPmlkZV9kbWFfY2hlY2soZHJpdmUpOworCQl9IGVsc2UgeworCQkJLyogTm9uIFJBSUQgdm9sdW1lLiBGaXh1cHMgdG8gc3RvcCB0aGUgY29yZSBjb2RlCisJCQkgICBkb2luZyB1bnN1cHBvcnRlZCB0aGluZ3MgKi8KKwkJCWlkLT5maWVsZF92YWxpZCAmPSAxOworCQkJaWQtPnF1ZXVlX2RlcHRoID0gMDsKKwkJCWlkLT5jb21tYW5kX3NldF8xID0gMDsKKwkJCWlkLT5jb21tYW5kX3NldF8yICY9IDB4QzQwMDsKKwkJCWlkLT5jZnNzZSAmPSAweEMwMDA7CisJCQlpZC0+Y2ZzX2VuYWJsZV8xID0gMDsKKwkJCWlkLT5jZnNfZW5hYmxlXzIgJj0gMHhDNDAwOworCQkJaWQtPmNzZl9kZWZhdWx0ICY9IDB4QzAwMDsKKwkJCWlkLT53b3JkMTI3ID0gMDsKKwkJCWlkLT5kbGYgPSAwOworCQkJaWQtPmNzZm8gPSAwOworCQkJaWQtPmNmYV9wb3dlciA9IDA7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGVyZm9ybWluZyBpZGVudGlmeSBmaXh1cHMuXG4iLAorCQkJCWRyaXZlLT5uYW1lKTsKKwkJfQorCX0KKworfQorCisvKioKKyAqCWluaXRfaHdpZl9pdDgyMXgJLQlzZXQgdXAgaHdpZiBzdHJ1Y3RzCisgKglAaHdpZjogaW50ZXJmYWNlIHRvIHNldCB1cAorICoKKyAqCVdlIGRvIHRoZSBiYXNpYyBzZXQgdXAgb2YgdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUuIFRoZSBJVDgyMTIKKyAqCXJlcXVpcmVzIHNldmVyYWwgY3VzdG9tIGhhbmRsZXJzIHNvIHdlIG92ZXJyaWRlIHRoZSBkZWZhdWx0CisgKglpZGUgRE1BIGhhbmRsZXJzIGFwcHJvcHJpYXRlbHkKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2l0ODIxeChpZGVfaHdpZl90ICpod2lmKQoreworCXN0cnVjdCBpdDgyMXhfZGV2ICppZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl0ODIxeF9kZXYpLCBHRlBfS0VSTkVMKTsKKwl1OCBjb25mOworCisJaWYoaWRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXQ4MjF4OiBvdXQgb2YgbWVtb3J5LCBmYWxsaW5nIGJhY2sgdG8gbGVnYWN5IGJlaGF2aW91ci5cbiIpOworCQlnb3RvIGZhbGxiYWNrOworCX0KKwltZW1zZXQoaWRldiwgMCwgc2l6ZW9mKHN0cnVjdCBpdDgyMXhfZGV2KSk7CisJaWRlX3NldF9od2lmZGF0YShod2lmLCBpZGV2KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZjb25mKTsKKwlpZihjb25mICYgMSkgeworCQlpZGV2LT5zbWFydCA9IDE7CisJCWh3aWYtPmF0YXBpX2RtYSA9IDA7CisJCS8qIExvbmcgSS9PJ3MgYWx0aG91Z2ggYWxsb3dlZCBpbiBMQkE0OCBzcGFjZSBjYXVzZSB0aGUKKwkJICAgb25ib2FyZCBmaXJtd2FyZSB0byBlbnRlciB0aGUgdHdpZ2hsaWdodCB6b25lICovCisJCWh3aWYtPnJxc2l6ZSA9IDI1NjsKKwl9CisKKwkvKiBQdWxsIHRoZSBjdXJyZW50IGNsb2NrcyBmcm9tIDB4NTAgYWxzbyAqLworCWlmIChjb25mICYgKDEgPDwgKDEgKyBod2lmLT5jaGFubmVsKSkpCisJCWlkZXYtPmNsb2NrX21vZGUgPSBBVEFfNTA7CisJZWxzZQorCQlpZGV2LT5jbG9ja19tb2RlID0gQVRBXzY2OworCisJaWRldi0+d2FudFswXVsxXSA9IEFUQV9BTlk7CisJaWRldi0+d2FudFsxXVsxXSA9IEFUQV9BTlk7CisKKwkvKgorCSAqCU5vdCBpbiB0aGUgZG9jcyBidXQgYWNjb3JkaW5nIHRvIHRoZSByZWZlcmVuY2UgZHJpdmVyCisJICoJdGhpcyBpcyBuZWNjZXNzYXJ5LgorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHgwOCwgJmNvbmYpOworCWlmKGNvbmYgPT0gMHgxMCkgeworCQlpZGV2LT50aW1pbmcxMCA9IDE7CisJCWh3aWYtPmF0YXBpX2RtYSA9IDA7CisJCWlmKCFpZGV2LT5zbWFydCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIml0ODIxeDogUmV2aXNpb24gMHgxMCwgd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIik7CisJfQorCisJaHdpZi0+c3BlZWRwcm9jID0gJml0ODIxeF90dW5lX2NoaXBzZXQ7CisJaHdpZi0+dHVuZXByb2MJPSAmaXQ4MjF4X3R1bmVwcm9jOworCisJLyogTVdETUEvUElPIGNsb2NrIHN3aXRjaGluZyBmb3IgcGFzcyB0aHJvdWdoIG1vZGUgKi8KKwlpZighaWRldi0+c21hcnQpIHsKKwkJaHdpZi0+ZG1hX3N0YXJ0ID0gJml0ODIxeF9kbWFfc3RhcnQ7CisJCWh3aWYtPmlkZV9kbWFfZW5kID0gJml0ODIxeF9kbWFfZW5kOworCX0KKworCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gMTsKKworCWlmICghaHdpZi0+ZG1hX2Jhc2UpCisJCWdvdG8gZmFsbGJhY2s7CisKKwlod2lmLT51bHRyYV9tYXNrID0gMHg3ZjsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmaXQ4MjF4X2NvbmZpZ19kcml2ZV9mb3JfZG1hOworCWlmICghKGh3aWYtPnVkbWFfZm91cikpCisJCWh3aWYtPnVkbWFfZm91ciA9IGF0YTY2X2l0ODIxeChod2lmKTsKKworCS8qCisJICoJVGhlIEJJT1Mgb2Z0ZW4gZG9lc24ndCBzZXQgdXAgRE1BIG9uIHRoaXMgY29udHJvbGxlcgorCSAqCXNvIHdlIGFsd2F5cyBkbyBpdC4KKwkgKi8KKworCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJcmV0dXJuOworZmFsbGJhY2s6CisJaHdpZi0+YXV0b2RtYSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaXQ4MjEyX2Rpc2FibGVfcmFpZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFJlc2V0IGxvY2FsIENQVSwgYW5kIHNldCBCSU9TIG5vdCByZWFkeSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NUUsIDB4MDEpOworCisJLyogU2V0IHRvIGJ5cGFzcyBtb2RlLCBhbmQgcmVzZXQgUENJIGJ1cyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIDB4MDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELAorCQkJICAgICAgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfSU8gfAorCQkJICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQwLCAweEEwRjMpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsMHg0QywgMHgwMjA0MDIwNCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MiwgMHgzNik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfaXQ4MjF4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdTggY29uZjsKKwlzdGF0aWMgY2hhciAqbW9kZVsyXSA9IHsgInBhc3MgdGhyb3VnaCIsICJzbWFydCIgfTsKKworCS8qIEZvcmNlIHRoZSBjYXJkIGludG8gYnlwYXNzIG1vZGUgaWYgc28gcmVxdWVzdGVkICovCisJaWYgKGl0ODIxMl9ub3JhaWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXQ4MjEyOiBmb3JjaW5nIGJ5cGFzcyBtb2RlLlxuIik7CisJCWl0ODIxMl9kaXNhYmxlX3JhaWQoZGV2KTsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAmY29uZik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaXQ4MjF4OiBjb250cm9sbGVyIGluICVzIG1vZGUuXG4iLCBtb2RlW2NvbmYgJiAxXSk7CisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBERUNMQVJFX0lURV9ERVYobmFtZV9zdHIpCQkJXAorCXsJCQkJCQlcCisJCS5uYW1lCQk9IG5hbWVfc3RyLAkJXAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2l0ODIxeCwJXAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2l0ODIxeCwJXAorCQkuY2hhbm5lbHMJPSAyLAkJCVwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAkJXAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwJCVwKKwkJLmZpeHVwCSAJPSBpdDgyMXhfZml4dXBzCQlcCisJfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBpdDgyMXhfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0geworCS8qIDAgKi8gREVDTEFSRV9JVEVfREVWKCJJVDgyMTIiKSwKK307CisKKy8qKgorICoJaXQ4MjF4X2luaXRfb25lCS0JcGNpIGxheWVyIGRpc2NvdmVyeSBlbnRyeQorICoJQGRldjogUENJIGRldmljZQorICoJQGlkOiBpZGVudCB0YWJsZSBlbnRyeQorICoKKyAqCUNhbGxlZCBieSB0aGUgUENJIGNvZGUgd2hlbiBpdCBmaW5kcyBhbiBJVEU4MjF4IGNvbnRyb2xsZXIuCisgKglXZSB0aGVuIHVzZSB0aGUgSURFIFBDSSBnZW5lcmljIGhlbHBlciB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGl0ODIxeF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCAmaXQ4MjF4X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXQ4MjF4X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSVRFLCBQQ0lfREVWSUNFX0lEX0lURV84MjExLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0lURSwgUENJX0RFVklDRV9JRF9JVEVfODIxMiwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpdDgyMXhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIklURTgyMXggSURFIiwKKwkuaWRfdGFibGUJPSBpdDgyMXhfcGNpX3RibCwKKwkucHJvYmUJCT0gaXQ4MjF4X2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXQ4MjF4X2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpdDgyMXhfaWRlX2luaXQpOworCittb2R1bGVfcGFyYW1fbmFtZWQobm9yYWlkLCBpdDgyMTJfbm9yYWlkLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpdDgyMTJfbm9yYWlkLCAiRm9yY2UgY2FyZCBpbnRvIGJ5cGFzcyBtb2RlIik7CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciB0aGUgSVRFIDgyMXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMgYi9kcml2ZXJzL2lkZS9wY2kvbnM4NzQxNS5jCmluZGV4IDIwNWEzMmYuLmZjZDUxNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJcmV0dXJuIF9faWRlX2RtYV9jaGVjayhkcml2ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfbnM4NzQxNSAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfbnM4NzQxNSAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAl1bnNpZ25lZCBpbnQgY3RybCwgdXNpbmdfaW50YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9vcHRpNjIxLmMgYi9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jCmluZGV4IGNmNGZkOTEuLjdhN2MyZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9vcHRpNjIxLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYwpAQCAtMzI2LDcgKzMyNiw3IEBACiAvKgogICogaW5pdF9od2lmX29wdGk2MjEoKSBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBod2lmIGZvdW5kIGF0IGJvb3QuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfb3B0aTYyMSAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfb3B0aTYyMSAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlod2lmLT5hdXRvZG1hID0gMDsKIAlod2lmLT5kcml2ZXNbMF0uZHJpdmVfZGF0YSA9IFBJT19ET05UX0tOT1c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMKaW5kZXggM2JjM2JmMS4uMTA1OTJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zYzEyMDAuYwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAgKiBUaGlzIGdldHMgaW52b2tlZCBieSB0aGUgSURFIGRyaXZlciBvbmNlIGZvciBlYWNoIGNoYW5uZWwsCiAgKiBhbmQgcGVyZm9ybXMgY2hhbm5lbC1zcGVjaWZpYyBwcmUtaW5pdGlhbGl6YXRpb24gYmVmb3JlIGRyaXZlIHByb2JpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfc2MxMjAwIChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9zYzEyMDAgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaWYgKGh3aWYtPm1hdGUpCiAJCWh3aWYtPnNlcmlhbGl6ZWQgPSBod2lmLT5tYXRlLT5zZXJpYWxpemVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMKaW5kZXggODJhMTEwMy4uYzZmNWZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCXJldHVybiAoZGV2LT5pcnEpID8gZGV2LT5pcnEgOiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBhdGE2Nl9zdndrc19zdndrcyAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGF0YTY2X3N2d2tzX3N2d2tzIChpZGVfaHdpZl90ICpod2lmKQogewogCXJldHVybiAxOwogfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiAgKiBCaXQgMTQgY2xlYXIgPSBwcmltYXJ5IElERSBjaGFubmVsIGRvZXMgbm90IGhhdmUgODAtcGluIGNhYmxlLgogICogQml0IDE0IHNldCAgID0gcHJpbWFyeSBJREUgY2hhbm5lbCBoYXMgODAtcGluIGNhYmxlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBhdGE2Nl9zdndrc19kZWxsIChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYXRhNjZfc3Z3a3NfZGVsbCAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAlpZiAoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVMTCAmJgpAQCAtNDcyLDcgKzQ3Miw3IEBACiAgKgogICogV0FSTklORzogdGhpcyBvbmx5IHdvcmtzIG9uIEFscGluZSBoYXJkd2FyZSEKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc3Z3a3NfY29iYWx0IChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYXRhNjZfc3Z3a3NfY29iYWx0IChpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OwogCWlmIChkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBhdGE2Nl9zdndrcyAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGF0YTY2X3N2d2tzIChpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OwogCkBAIC01NzMsNyArNTczLDcgQEAKIAlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9zZXR1cF9jc2I2IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQorc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9jc2I2IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQogewogCWlmICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpIHsKIAkJZC0+Ym9vdGFibGUgPSBORVZFUl9CT0FSRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jIGIvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMKaW5kZXggMWQ5NzBhMC4uZWEwODA2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMKQEAgLTM4Niw3ICszODYsNyBAQAogICogY2hhbm5lbCAwIGhlcmUgYXQgbGVhc3QsIGJ1dCBjaGFubmVsIDEgaGFzIHRvIGJlIGVuYWJsZWQgYnkKICAqIGZpcm13YXJlIG9yIGFyY2ggY29kZS4gV2Ugc3RpbGwgc2V0IGJvdGggdG8gMTYgYml0cyBtb2RlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfc2w4MmMxMDUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbXNnKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3NsODJjMTA1KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm1zZykKIHsKIAl1MzIgdmFsOwogCkBAIC0zOTksNyArMzk5LDcgQEAKIAlyZXR1cm4gZGV2LT5pcnE7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2RtYV9zbDgyYzEwNShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGRtYV9iYXNlKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX3NsODJjMTA1KGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UpCiB7CiAJdW5zaWduZWQgaW50IHJldjsKIAl1OCBkbWFfc3RhdGU7CkBAIC00MzEsNyArNDMxLDcgQEAKICAqIEluaXRpYWxpc2UgdGhlIGNoaXAKICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3NsODJjMTA1KGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3NsODJjMTA1KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CiAJdTMyIHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jIGIvZHJpdmVycy9pZGUvcGNpL3NsYzkwZTY2LmMKaW5kZXggN2ZiZjM2My4uNTExMmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NsYzkwZTY2LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NsYzkwZTY2LmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQSAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3NsYzkwZTY2IChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9zbGM5MGU2NiAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAl1OCByZWc0NyA9IDA7CiAJdTggbWFzayA9IGh3aWYtPmNoYW5uZWwgPyAweDAxIDogMHgwMjsgIC8qIGJpdDA6UHJpbWFyeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYyBiL2RyaXZlcnMvaWRlL3BjaS90cmlmbGV4LmMKaW5kZXggYTFkZjJiZi4uZjk2YjU2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvdHJpZmxleC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfdHJpZmxleChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl90cmlmbGV4KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaHdpZi0+dHVuZXByb2MgPSAmdHJpZmxleF90dW5lX2RyaXZlOwogCWh3aWYtPnNwZWVkcHJvYyA9ICZ0cmlmbGV4X3R1bmVfY2hpcHNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYwppbmRleCAwNjlkYmZmLi5hNGQwOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCkBAIC00MTUsNyArNDE1LDcgQEAKICAqCWFuZCBpbml0aWFsaXplIGl0cyBkcml2ZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X3ZpYTgyY3h4eChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3ZpYTgyY3h4eChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBwY2lfZGV2ICppc2EgPSBOVUxMOwogCXU4IHQsIHY7CkBAIC01NzYsNyArNTc2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl92aWE4MmN4eHgoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfdmlhODJjeHh4KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMgYi9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCmluZGV4IDU2OWYxNjcuLmJlMGZjYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwpAQCAtMTMyNCw5ICsxMzI0LDkgQEAKIAkvKiBYWFggRklYTUU6IE1lZGlhIGJheSBzdHVmZiBuZWVkIHJlLW9yZ2FuaXppbmcgKi8KIAlpZiAobnAtPnBhcmVudCAmJiBucC0+cGFyZW50LT5uYW1lCiAJICAgICYmIHN0cmNhc2VjbXAobnAtPnBhcmVudC0+bmFtZSwgIm1lZGlhLWJheSIpID09IDApIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJCW1lZGlhX2JheV9zZXRfaWRlX2luZm9zKG5wLT5wYXJlbnQsIHBtaWYtPnJlZ2Jhc2UsIHBtaWYtPmlycSwgaHdpZi0+aW5kZXgpOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYgLyogQ09ORklHX1BNQUNfTUVESUFCQVkgKi8KIAkJcG1pZi0+bWVkaWFiYXkgPSAxOwogCQlpZiAoIWJpZHApCiAJCQlwbWlmLT5hYXBsX2J1c19pZCA9IDE7CkBAIC0xMzgyLDEwICsxMzgyLDEwIEBACiAJICAgICAgIGh3aWYtPmluZGV4LCBtb2RlbF9uYW1lW3BtaWYtPmtpbmRdLCBwbWlmLT5hYXBsX2J1c19pZCwKIAkgICAgICAgcG1pZi0+bWVkaWFiYXkgPyAiIChtZWRpYWJheSkiIDogIiIsIGh3aWYtPmlycSk7CiAJCQkKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJaWYgKHBtaWYtPm1lZGlhYmF5ICYmIGNoZWNrX21lZGlhX2JheV9ieV9iYXNlKHBtaWYtPnJlZ2Jhc2UsIE1CX0NEKSA9PSAwKQogCQlod2lmLT5ub3Byb2JlID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTUFDX01FRElBQkFZICovCiAKIAlod2lmLT5zZ19tYXhfbmVudHMgPSBNQVhfRENNRFM7CiAKQEAgLTE0MTksNyArMTQxOSw3IEBACiAgKiBBdHRhY2ggdG8gYSBtYWNpbyBwcm9iZWQgaW50ZXJmYWNlCiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0Ci1wbWFjX2lkZV9tYWNpb19hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3BtYWNfaWRlX21hY2lvX2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJdW5zaWduZWQgbG9uZyByZWdiYXNlOwpAQCAtMTYzNywyNyArMTYzNywxOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBwbWFjX2lkZV9tYWNpb19tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwbWFjX2lkZV9tYWNpb19tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiSURFIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXsKIAkubmFtZSAJCT0gIkFUQSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7Ci0JLm5hbWUgCQk9IE9GX0FOWV9NQVRDSCwKIAkudHlwZQkJPSAiaWRlIiwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImF0YSIsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggZTUwMTY3NS4uNzdkYTgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCQlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcGNpX2RyaXZlciwgbm9kZSk7CiAJCWlmKGQtPmlkX3RhYmxlKQogCQl7Ci0JCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgPSBwY2lfbWF0Y2hfZGV2aWNlKGQtPmlkX3RhYmxlLCBkZXYpOworCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkID0gcGNpX21hdGNoX2lkKGQtPmlkX3RhYmxlLCBkZXYpOwogCQkJaWYoaWQgIT0gTlVMTCkKIAkJCXsKIAkJCQlpZihkLT5wcm9iZShkZXYsIGlkKSA+PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCmluZGV4IDdkNThhZjEuLjI1MTAzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZworKysgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKQEAgLTY2LDYgKzY2LDE4IEBACiAJICB3aXRoIE1hY09TWCBhbmQgV2luWFAgSVAtb3Zlci0xMzk0KSwgZW5hYmxlIHRoaXMgb3B0aW9uIGFuZCB0aGUKIAkgIGV0aDEzOTQgb3B0aW9uIGJlbG93LgogCitjb25maWcgSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCisJYm9vbCAiRXhwb3J0IGFsbCBzeW1ib2xzIG9mIGllZWUxMzk0J3MgQVBJIgorCWRlcGVuZHMgb24gSUVFRTEzOTQKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFeHBvcnQgYWxsIHN5bWJvbHMgb2YgaWVlZTEzOTQncyBkcml2ZXIgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBldmVuCisJICB0aG9zZSB0aGF0IGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0YW5kYXJkIElFRUUgMTM5NCBkcml2ZXJzLgorCisJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGludGVyZmFjZSB0byB1c2Vyc3BhY2UgYXBwbGljYXRpb25zLgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb21waWxlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGRyaXZlcnMgdGhhdAorCSAgbWFrZSBleHRlbmRlZCB1c2Ugb2YgaWVlZTEzOTQncyBBUEkuIEl0IGlzIG90aGVyd2lzZSBzYWZlIHRvIHNheSBOLgorCiBjb21tZW50ICJEZXZpY2UgRHJpdmVycyIKIAlkZXBlbmRzIG9uIElFRUUxMzk0CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCmluZGV4IDFiOTg2ODQuLjE0OTU3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImhvc3RzLmgiCiAjaW5jbHVkZSAiaWVlZTEzOTQuaCIKICNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCiAKIC8qIE1vZHVsZSBQYXJhbWV0ZXJzICovCiAvKiB0aGlzIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBtYXBwaW5nIG9mIHRoZSBGQ1AgcmVnaXN0ZXJzICovCkBAIC0yMzIsNyArMjMzLDcgQEAKIAlob3N0LT5jc3IuZ2VuZXJhdGlvbiA9IDI7CiAKIAlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7Ci0JYnVzX2luZm9bMl0gPSBjcHVfdG9fYmUzMigoMSA8PCBDU1JfSVJNQ19TSElGVCkgfAorCWJ1c19pbmZvWzJdID0gY3B1X3RvX2JlMzIoKGhwc2JfZGlzYWJsZV9pcm0gPyAwIDogMSA8PCBDU1JfSVJNQ19TSElGVCkgfAogCQkJCSAgKDEgPDwgQ1NSX0NNQ19TSElGVCkgfAogCQkJCSAgKDEgPDwgQ1NSX0lTQ19TSElGVCkgfAogCQkJCSAgKDAgPDwgQ1NSX0JNQ19TSElGVCkgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwppbmRleCA3YzQzMzBlLi42MWRkZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwpAQCAtMjA5LDcgKzIwOSwxNSBAQAogewogCXN0YXRpYyBjb25zdCBpbnQgbXJfbWFwW10gPSB7IDQsIDY0LCAxMDI0LCAwIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisJQlVHX09OKG1heF9yb20gJiB+MHgzKTsKIAljc3ItPm1heF9yb20gPSBtcl9tYXBbbWF4X3JvbV07CisjZWxzZQorCWlmIChtYXhfcm9tICYgfjB4MykgLyogY2FsbGVyIHN1cHBsaWVkIGludmFsaWQgYXJndW1lbnQgKi8KKwkJY3NyLT5tYXhfcm9tID0gMDsKKwllbHNlCisJCWNzci0+bWF4X3JvbSA9IG1yX21hcFttYXhfcm9tXTsKKyNlbmRpZgogCW1lbWNweShjc3ItPmJ1c19pbmZvX2RhdGEsIGJ1c19pbmZvX2RhdGEsIGNzci0+YnVzX2luZm9fbGVuKTsKIH0KIApAQCAtNTMzLDEyICs1NDEsMTUgQEAKIAlzdGF0aWMgY29uc3QgaW50IHBkWzRdID0geyAwLCA0LCAxNiwgMjU2IH07CiAJc3RhdGljIGNvbnN0IGludCBjc1sxNl0gPSB7IDQsIDIgfTsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OwotCWludCBwYWxldHRlX3NpemUgPSBwZFtwYWxldHRlX2RlcHRoXSAqIGNzW2NvbG9yX3NwYWNlXTsKKwlpbnQgcGFsZXR0ZV9zaXplOwogCWludCBwaXhlbF9zaXplID0gKGhzY2FuICogdnNjYW4gKyAzKSAmIH4weDM7CiAKLQlpZiAoKHBhbGV0dGVfZGVwdGggJiYgIXBhbGV0dGUpIHx8ICFwaXhlbHMpCisJaWYgKCFwaXhlbHMgfHwgKCFwYWxldHRlICYmIHBhbGV0dGVfZGVwdGgpIHx8CisJICAgIChwYWxldHRlX2RlcHRoICYgfjB4MykgfHwgKGNvbG9yX3NwYWNlICYgfjB4ZikpCiAJCXJldHVybiBOVUxMOwogCisJcGFsZXR0ZV9zaXplID0gcGRbcGFsZXR0ZV9kZXB0aF0gKiBjc1tjb2xvcl9zcGFjZV07CisKIAlrdiA9IGNzcjEyMTJfbmV3X2Rlc2NyaXB0b3JfbGVhZigxLCAwLCBOVUxMLAogCQkJCQkgcGFsZXR0ZV9zaXplICsgcGl4ZWxfc2l6ZSArCiAJCQkJCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX09WRVJIRUFEKTsKQEAgLTc2MCw5ICs3NzEsOSBAQAogCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOwogCXVfaW50NjRfdCBjc3JfYWRkcjsKIAotCWlmICghY3NyIHx8ICFjc3ItPm9wcy0+YWxsb2NhdGVfYWRkcl9yYW5nZSB8fAotCSAgICAhY3NyLT5vcHMtPnJlbGVhc2VfYWRkcikKLQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCWlmICghY3NyIHx8ICFjc3ItPm9wcyB8fCAhY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2UgfHwKKwkgICAgIWNzci0+b3BzLT5yZWxlYXNlX2FkZHIgfHwgY3NyLT5tYXhfcm9tIDwgMSkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwogCiAJLyogUk9NIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGNzci0+bWF4X3JvbSAqLwogCXJvbXNpemUgPSAocm9tc2l6ZSArIChjc3ItPm1heF9yb20gLSAxKSkgJiB+KGNzci0+bWF4X3JvbSAtIDEpOwpAQCAtMTE0NSw2ICsxMTU2LDggQEAKIAogCQkJLyogTWFrZSBzdXJlIHRoZSBFeHRlbmRlZCBST00gbGVhZiBpcyBhIG11bHRpcGxlIG9mCiAJCQkgKiBtYXhfcm9tIGluIHNpemUuICovCisJCQlpZiAoY3NyLT5tYXhfcm9tIDwgMSkKKwkJCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CiAJCQlsZWFmX3NpemUgPSAoY2FjaGUtPmxlbiArIChjc3ItPm1heF9yb20gLSAxKSkgJgogCQkJCX4oY3NyLT5tYXhfcm9tIC0gMSk7CiAKQEAgLTE0MDksNyArMTQyMiw3IEBACiAJdV9pbnQzMl90ICpjYWNoZV9wdHI7CiAJdV9pbnQxNl90IGt2X2xlbiA9IDA7CiAKLQlpZiAoIWNzciB8fCAha3YpCisJaWYgKCFjc3IgfHwgIWt2IHx8IGNzci0+bWF4X3JvbSA8IDEpCiAJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKIAogCS8qIEZpcnN0IGZpbmQgd2hpY2ggY2FjaGUgdGhlIGRhdGEgc2hvdWxkIGJlIGluIChvciBnbyBpbiBpZiBub3QgcmVhZApAQCAtMTU3Miw3ICsxNTg1LDcgQEAKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKIAlpbnQgcmV0OwogCi0JaWYgKCFjc3IgfHwgIWNzci0+b3BzLT5idXNfcmVhZCkKKwlpZiAoIWNzciB8fCAhY3NyLT5vcHMgfHwgIWNzci0+b3BzLT5idXNfcmVhZCkKIAkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwogCiAJcmV0ID0gY3NyMTIxMl9wYXJzZV9idXNfaW5mb19ibG9jayhjc3IpOwpAQCAtMTU4MSw5ICsxNTk0LDEzIEBACiAKIAlpZiAoIWNzci0+b3BzLT5nZXRfbWF4X3JvbSkKIAkJY3NyLT5tYXhfcm9tID0gbXJfbWFwWzBdOwkvKiBkZWZhdWx0IHZhbHVlICovCi0JZWxzZQotCQljc3ItPm1heF9yb20gPSBtcl9tYXBbY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKLQkJCQkJCQkgICAgY3NyLT5wcml2YXRlKV07CisJZWxzZSB7CisJCWludCBpID0gY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKKwkJCQkJICAgICAgY3NyLT5wcml2YXRlKTsKKwkJaWYgKGkgJiB+MHgzKQorCQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCQljc3ItPm1heF9yb20gPSBtcl9tYXBbaV07CisJfQogCiAJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfaGVhZCA9IGNzci0+cm9vdF9rdjsKIAljc3ItPmNhY2hlX2hlYWQtPmxheW91dF90YWlsID0gY3NyLT5yb290X2t2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKaW5kZXggNzU4ODE5ZC4uYjc5ZGRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2RtYS5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAogZG1hX2FkZHJfdCBkbWFfcmVnaW9uX29mZnNldF90b19idXMoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0JdW5zaWduZWQgbG9uZyByZW07CisJdW5zaWduZWQgbG9uZyByZW0gPSAwOwogCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZkbWEtPnNnbGlzdFtkbWFfcmVnaW9uX2ZpbmQoZG1hLCBvZmZzZXQsICZyZW0pXTsKIAlyZXR1cm4gc2dfZG1hX2FkZHJlc3Moc2cpICsgcmVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCA2NTRkYTc2Li5jZDUzYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtODksNyArODksNyBAQAogI2RlZmluZSBUUkFDRSgpIHByaW50ayhLRVJOX0VSUiAiJXM6JXNbJWRdIC0tLS0gVFJBQ0VcbiIsIGRyaXZlcl9uYW1lLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0JIiRSZXY6IDEyNDcgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOworCSIkUmV2OiAxMjY0ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKIAogc3RydWN0IGZyYWdtZW50X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTcwNiw3ICs3MDYsNyBAQAogCQlyZXR1cm47CiAKIAlkZXYgPSBoaS0+ZGV2OwotCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYgPSAoc3RydWN0IGV0aDEzOTRfcHJpdiAqKW5ldGRldl9wcml2KGRldik7CiAKIAkvKiBSZXNldCBvdXIgcHJpdmF0ZSBob3N0IGRhdGEsIGJ1dCBub3Qgb3VyIG10dSAqLwogCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CkBAIC0xNzcwLDcgKzE3NzAsNyBAQAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RyY3B5IChpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lKTsKLQlzdHJjcHkgKGluZm8tPnZlcnNpb24sICIkUmV2OiAxMjQ3ICQiKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sICIkUmV2OiAxMjY0ICQiKTsKIAkvKiBGSVhNRSBYWFggcHJvdmlkZSBzYW5lIGJ1c2luZm8gKi8KIAlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCAiaWVlZTEzOTQiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKaW5kZXggNjI5MDcwYi4uYjI0OGQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKQEAgLTUyLDcgKzUyLDcgQEAKIC8qCiAgKiBEaXNhYmxlIHRoZSBub2RlbWdyIGRldGVjdGlvbiBhbmQgY29uZmlnIHJvbSByZWFkaW5nIGZ1bmN0aW9uYWxpdHkuCiAgKi8KLXN0YXRpYyBpbnQgZGlzYWJsZV9ub2RlbWdyID0gMDsKK3N0YXRpYyBpbnQgZGlzYWJsZV9ub2RlbWdyOwogbW9kdWxlX3BhcmFtKGRpc2FibGVfbm9kZW1nciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9ub2RlbWdyLCAiRGlzYWJsZSBub2RlbWdyIGZ1bmN0aW9uYWxpdHkuIik7CiAKQEAgLTUyMCw2ICs1MjAsOSBAQAogCiAJaWYgKCFwYWNrZXQtPm5vX3dhaXRlciB8fCBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSkgewogCQlhdG9taWNfaW5jKCZwYWNrZXQtPnJlZmNudCk7CisJCS8qIFNldCB0aGUgaW5pdGlhbCAic2VuZHRpbWUiIHRvIDEwIHNlY29uZHMgZnJvbSBub3csIHRvCisJCSAgIHByZXZlbnQgcHJlbWF0dXJlIGV4cGlyeS4gIElmIGEgcGFja2V0IHRha2VzIG1vcmUgdGhhbgorCQkgICAxMCBzZWNvbmRzIHRvIGhpdCB0aGUgd2lyZSwgd2UgaGF2ZSBiaWdnZXIgcHJvYmxlbXMgOikgKi8KIAkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXMgKyAxMCAqIEhaOwogCQlza2JfcXVldWVfdGFpbCgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUsIHBhY2tldC0+c2tiKTsKIAl9CkBAIC0xMjIzLDkgKzEyMjYsNyBAQAogRVhQT1JUX1NZTUJPTChocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfYWxsb2NfcGFja2V0KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9mcmVlX3BhY2tldCk7Ci1FWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9waHlfY29uZmlnKTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BhY2tldCk7Ci1FWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQpOwogRVhQT1JUX1NZTUJPTChocHNiX3Jlc2V0X2J1cyk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfYnVzX3Jlc2V0KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZWxmaWRfcmVjZWl2ZWQpOwpAQCAtMTIzMyw2ICsxMjM0LDEwIEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfcGFja2V0X3NlbnQpOwogRVhQT1JUX1NZTUJPTChocHNiX3BhY2tldF9yZWNlaXZlZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChocHNiX2Rpc2FibGVfaXJtKTsKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCitFWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9waHlfY29uZmlnKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdCk7CisjZW5kaWYKIAogLyoqIGllZWUxMzk0X3RyYW5zYWN0aW9ucy5jICoqLwogRVhQT1JUX1NZTUJPTChocHNiX2dldF90bGFiZWwpOwpAQCAtMTI2Miw5ICsxMjY3LDExIEBACiBFWFBPUlRfU1lNQk9MKGhwc2Jfc2V0X2hvc3RpbmZvX2tleSk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfZ2V0X2hvc3RpbmZvX2J5a2V5KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZXRfaG9zdGluZm8pOworRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfaG9zdF9yZXNldCk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfYWRkX2hvc3QpOwogRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfcmVtb3ZlX2hvc3QpOwotRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfaG9zdF9yZXNldCk7CisjZW5kaWYKIAogLyoqIG5vZGVtZ3IuYyAqKi8KIEVYUE9SVF9TWU1CT0woaHBzYl9ub2RlX2ZpbGxfcGFja2V0KTsKQEAgLTEyNzIsNyArMTI3OSw5IEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2wpOwogRVhQT1JUX1NZTUJPTChocHNiX3VucmVnaXN0ZXJfcHJvdG9jb2wpOwogRVhQT1JUX1NZTUJPTChpZWVlMTM5NF9idXNfdHlwZSk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChub2RlbWdyX2Zvcl9lYWNoX2hvc3QpOworI2VuZGlmCiAKIC8qKiBjc3IuYyAqKi8KIEVYUE9SVF9TWU1CT0woaHBzYl91cGRhdGVfY29uZmlnX3JvbSk7CkBAIC0xMzA5LDE5ICsxMzE4LDIxIEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3ZfZmx1c2gpOwogCiAvKiogY3NyMTIxMi5jICoqLworRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19kaXJlY3RvcnkpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWxlYXNlX2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcGFyc2Vfa2V5dmFsKTsKK0VYUE9SVF9TWU1CT0woX2NzcjEyMTJfcmVhZF9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9kZXN0cm95X2tleXZhbCk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2NyZWF0ZV9jc3IpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2luaXRfbG9jYWxfY3NyKTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfaW1tZWRpYXRlKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfZGlyZWN0b3J5KTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeSk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfbmV3X3N0cmluZ19kZXNjcmlwdG9yX2xlYWYpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX2RldGFjaF9rZXl2YWxfZnJvbV9kaXJlY3RvcnkpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9kZXN0cm95X2Nzcik7Ci1FWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfZ2VuZXJhdGVfY3NyX2ltYWdlKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9wYXJzZV9rZXl2YWwpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX3BhcnNlX2Nzcik7Ci1FWFBPUlRfU1lNQk9MKF9jc3IxMjEyX3JlYWRfa2V5dmFsKTsKLUVYUE9SVF9TWU1CT0woX2NzcjEyMTJfZGVzdHJveV9rZXl2YWwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCmluZGV4IDczYmQ4ZWYuLjBiMzE0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCkBAIC0zOCw4ICszOCw4IEBACiAKICAgICAgICAgLyogVGhlc2UgYXJlIGNvcmUgaW50ZXJuYWwuICovCiAgICAgICAgIHNpZ25lZCBjaGFyIHRsYWJlbDsKLSAgICAgICAgY2hhciBhY2tfY29kZTsKLSAgICAgICAgY2hhciB0Y29kZTsKKwlzaWduZWQgY2hhciBhY2tfY29kZTsKKwl1bnNpZ25lZCBjaGFyIHRjb2RlOwogCiAgICAgICAgIHVuc2lnbmVkIGV4cGVjdF9yZXNwb25zZToxOwogICAgICAgICB1bnNpZ25lZCBub193YWl0ZXI6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMgYi9kcml2ZXJzL2llZWUxMzk0L2lzby5jCmluZGV4IGYwNTc1OTEuLjYxNTU0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uYwpAQCAtNjIsMTAgKzYyLDEwIEBACiAJaWYgKChkbWFfbW9kZSA8IEhQU0JfSVNPX0RNQV9ERUZBVUxUKSB8fCAoZG1hX21vZGUgPiBIUFNCX0lTT19ETUFfUEFDS0VUX1BFUl9CVUZGRVIpKQogCQlkbWFfbW9kZT1IUFNCX0lTT19ETUFfREVGQVVMVDsKIAorCWlmICgoaXJxX2ludGVydmFsIDwgMCkgfHwgKGlycV9pbnRlcnZhbCA+IGJ1Zl9wYWNrZXRzIC8gNCkpCisgCQlpcnFfaW50ZXJ2YWwgPSBidWZfcGFja2V0cyAvIDQ7CiAJaWYgKGlycV9pbnRlcnZhbCA9PSAwKSAgICAgLyogcmVhbGx5IGludGVycnVwdCBmb3IgZWFjaCBwYWNrZXQqLwogCQlpcnFfaW50ZXJ2YWwgPSAxOwotCWVsc2UgaWYgKChpcnFfaW50ZXJ2YWwgPCAwKSB8fCAoaXJxX2ludGVydmFsID4gYnVmX3BhY2tldHMgLyA0KSkKLSAJCWlycV9pbnRlcnZhbCA9IGJ1Zl9wYWNrZXRzIC8gNDsKIAogCWlmIChjaGFubmVsIDwgLTEgfHwgY2hhbm5lbCA+PSA2NCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDYsNiArMTA2LDcgQEAKIAl9CiAKIAlhdG9taWNfc2V0KCZpc28tPm92ZXJmbG93cywgMCk7CisJaXNvLT5ieXRlc19kaXNjYXJkZWQgPSAwOwogCWlzby0+ZmxhZ3MgPSAwOwogCWlzby0+cHJlYnVmZmVyID0gMDsKIApAQCAtMjQxLDEyICsyNDIsMTIgQEAKIAlpc28tPnhtaXRfY3ljbGUgPSBjeWNsZTsKIAogCWlmIChwcmVidWZmZXIgPCAwKQotCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzOworCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzIC0gMTsKIAllbHNlIGlmIChwcmVidWZmZXIgPT0gMCkKIAkJcHJlYnVmZmVyID0gMTsKIAotCWlmIChwcmVidWZmZXIgPiBpc28tPmJ1Zl9wYWNrZXRzKQotCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzOworCWlmIChwcmVidWZmZXIgPj0gaXNvLT5idWZfcGFja2V0cykKKwkJcHJlYnVmZmVyID0gaXNvLT5idWZfcGFja2V0cyAtIDE7CiAKIAlpc28tPnByZWJ1ZmZlciA9IHByZWJ1ZmZlcjsKIApAQCAtMzk1LDcgKzM5Niw3IEBACiB9CiAKIHZvaWQgaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAotCQkJICAgICAgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KQorCQkJICAgICAgdTE2IHRvdGFsX2xlbiwgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlzby0+bG9jaywgZmxhZ3MpOwpAQCAtNDAzLDEwICs0MDQsMTMgQEAKIAlpZiAoaXNvLT5uX3JlYWR5X3BhY2tldHMgPT0gaXNvLT5idWZfcGFja2V0cykgewogCQkvKiBvdmVyZmxvdyEgKi8KIAkJYXRvbWljX2luYygmaXNvLT5vdmVyZmxvd3MpOworCQkvKiBSZWNvcmQgc2l6ZSBvZiB0aGlzIGRpc2NhcmRlZCBwYWNrZXQgKi8KKwkJaXNvLT5ieXRlc19kaXNjYXJkZWQgKz0gdG90YWxfbGVuOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbyA9ICZpc28tPmluZm9zW2lzby0+cGt0X2RtYV07CiAJCWluZm8tPm9mZnNldCA9IG9mZnNldDsKIAkJaW5mby0+bGVuID0gbGVuOworCQlpbmZvLT50b3RhbF9sZW4gPSB0b3RhbF9sZW47CiAJCWluZm8tPmN5Y2xlID0gY3ljbGU7CiAJCWluZm8tPmNoYW5uZWwgPSBjaGFubmVsOwogCQlpbmZvLT50YWcgPSB0YWc7CkBAIC00MzcsNiArNDQxLDE3IEBACiAKIAkJaXNvLT5maXJzdF9wYWNrZXQgPSAoaXNvLT5maXJzdF9wYWNrZXQrMSkgJSBpc28tPmJ1Zl9wYWNrZXRzOwogCQlpc28tPm5fcmVhZHlfcGFja2V0cy0tOworCisJCS8qIHJlbGVhc2UgbWVtb3J5IGZyb20gcGFja2V0cyBkaXNjYXJkZWQgd2hlbiBxdWV1ZSB3YXMgZnVsbCAgKi8KKwkJaWYgKGlzby0+bl9yZWFkeV9wYWNrZXRzID09IDApIHsgLyogUmVsZWFzZSBvbmx5IGFmdGVyIGFsbCBwcmlvciBwYWNrZXRzIGhhbmRsZWQgKi8KKwkJCWlmIChpc28tPmJ5dGVzX2Rpc2NhcmRlZCAhPSAwKSB7CisJCQkJc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvIGluZjsKKwkJCQlpbmYudG90YWxfbGVuID0gaXNvLT5ieXRlc19kaXNjYXJkZWQ7CisJCQkJaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfUkVMRUFTRSwKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgJmluZik7CisJCQkJaXNvLT5ieXRlc19kaXNjYXJkZWQgPSAwOworCQkJfQorCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzby0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBydjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmggYi9kcml2ZXJzL2llZWUxMzk0L2lzby5oCmluZGV4IGZiNjU0ZDkuLjNlZmM2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uaApAQCAtNDcsNiArNDcsMTQgQEAKIAkvKiAyLWJpdCAndGFnJyBhbmQgNC1iaXQgJ3N5JyBmaWVsZHMgb2YgdGhlIGlzb2Nocm9ub3VzIGhlYWRlciAqLwogCV9fdTggdGFnOwogCV9fdTggc3k7CisKKwkvKgorCSAqIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcGFja2V0IGluY2x1ZGluZyBoZWFkZXIvdHJhaWxlci4KKwkgKiBNVVNUIGJlIGF0IHN0cnVjdHVyZSBlbmQsIHNpbmNlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGFsc28gCisJICogZGVmaW5lZCBpbiByYXcxMzk0LmggKGkuZS4gc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldF9pbmZvKSwgaXMgY29waWVkIHRvIAorCSAqIHVzZXJzcGFjZSBhbmQgaXMgYWNjZXNzZWQgdGhlcmUgdGhyb3VnaCBsaWJyYXcxMzk0LiAKKwkgKi8KKwlfX3UxNiB0b3RhbF9sZW47CiB9OwogCiBlbnVtIGhwc2JfaXNvX3R5cGUgeyBIUFNCX0lTT19SRUNWID0gMCwgSFBTQl9JU09fWE1JVCA9IDEgfTsKQEAgLTExMSw2ICsxMTksOSBAQAogCS8qIGhvdyBtYW55IHRpbWVzIHRoZSBidWZmZXIgaGFzIG92ZXJmbG93ZWQgb3IgdW5kZXJmbG93ZWQgKi8KIAlhdG9taWNfdCBvdmVyZmxvd3M7CiAKKwkvKiBDdXJyZW50IG51bWJlciBvZiBieXRlcyBsb3N0IGluIGRpc2NhcmRlZCBwYWNrZXRzICovCisJaW50IGJ5dGVzX2Rpc2NhcmRlZDsKKwogCS8qIHByaXZhdGUgZmxhZ3MgdG8gdHJhY2sgaW5pdGlhbGl6YXRpb24gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgSFBTQl9JU09fRFJJVkVSX0lOSVQgICAgICgxPDwwKQogI2RlZmluZSBIUFNCX0lTT19EUklWRVJfU1RBUlRFRCAgKDE8PDEpCkBAIC0xOTMsNyArMjA0LDcgQEAKIAogLyogY2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCAoaW50ZXJydXB0IGNvbnRleHQgT0spICovCiB2b2lkIGhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwKLQkJCSAgICAgIHUxNiBjeWNsZSwgdTggY2hhbm5lbCwgdTggdGFnLCB1OCBzeSk7CisJCQkgICAgICB1MTYgdG90YWxfbGVuLCB1MTYgY3ljbGUsIHU4IGNoYW5uZWwsIHU4IHRhZywgdTggc3kpOwogCiAvKiBjYWxsIHRvIHdha2Ugd2FpdGluZyBwcm9jZXNzZXMgYWZ0ZXIgYnVmZmVyIHNwYWNlIGhhcyBvcGVuZWQgdXAuICovCiB2b2lkIGhwc2JfaXNvX3dha2Uoc3RydWN0IGhwc2JfaXNvICppc28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCA5YTQ2YzNiLi5iZWJjYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImNzci5oIgogI2luY2x1ZGUgIm5vZGVtZ3IuaCIKIAotc3RhdGljIGludCBpZ25vcmVfZHJpdmVycyA9IDA7CitzdGF0aWMgaW50IGlnbm9yZV9kcml2ZXJzOwogbW9kdWxlX3BhcmFtKGlnbm9yZV9kcml2ZXJzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfZHJpdmVycywgIkRpc2FibGUgYXV0b21hdGljIHByb2JpbmcgZm9yIGRyaXZlcnMuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCAzNmUyNWFjLi5iMTJhOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIHByaW50ayhsZXZlbCAiJXM6IGZ3LWhvc3QlZDogIiBmbXQgIlxuIiAsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpLT5ob3N0LT5pZCAsICMjIGFyZ3MpCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLQkiJFJldjogMTI1MCAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CisJIiRSZXY6IDEyOTkgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOwogCiAvKiBNb2R1bGUgUGFyYW1ldGVycyAqLwogc3RhdGljIGludCBwaHlzX2RtYSA9IDE7CkBAIC00ODMsNyArNDgzLDkgQEAKIAkvKiBQdXQgc29tZSBkZWZhdWx0cyB0byB0aGVzZSB1bmRlZmluZWQgYnVzIG9wdGlvbnMgKi8KIAlidWYgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKTsKIAlidWYgfD0gIDB4NjAwMDAwMDA7IC8qIEVuYWJsZSBDTUMgYW5kIElTQyAqLwotCWlmICghaHBzYl9kaXNhYmxlX2lybSkKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJYnVmICY9IH4weDgwMDAwMDAwOworCWVsc2UKIAkJYnVmIHw9ICAweDgwMDAwMDAwOyAvKiBFbmFibGUgSVJNQyAqLwogCWJ1ZiAmPSB+MHgwMGZmMDAwMDsgLyogWFhYOiBTZXQgY3ljX2Nsa19hY2MgdG8gemVybyBmb3Igbm93ICovCiAJYnVmICY9IH4weDE4MDAwMDAwOyAvKiBEaXNhYmxlIFBNQyBhbmQgQk1DICovCkBAIC01MDMsOCArNTA1LDEyIEBACiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sU2V0LAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlVGltZXJFbmFibGUgfAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlTWFzdGVyKTsKLQlzZXRfcGh5X3JlZ19tYXNrKG9oY2ksIDQsIFBIWV8wNF9MQ1RSTCB8Ci0JCQkgKGhwc2JfZGlzYWJsZV9pcm0gPyAwIDogUEhZXzA0X0NPTlRFTkRFUikpOworCWkgPSBnZXRfcGh5X3JlZyhvaGNpLCA0KSB8IFBIWV8wNF9MQ1RSTDsKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJaSAmPSB+UEhZXzA0X0NPTlRFTkRFUjsKKwllbHNlCisJCWkgfD0gUEhZXzA0X0NPTlRFTkRFUjsKKwlzZXRfcGh5X3JlZyhvaGNpLCA0LCBpKTsKIAogCS8qIFNldCB1cCBzZWxmLWlkIGRtYSBidWZmZXIgKi8KIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfU2VsZklEQnVmZmVyLCBvaGNpLT5zZWxmaWRfYnVmX2J1cyk7CkBAIC0xMDc4LDcgKzEwODQsOCBAQAogCiAJCQlpbml0aWFsaXplX2RtYV9yY3ZfY3R4KCZvaGNpLT5pcl9sZWdhY3lfY29udGV4dCwgMSk7CiAKLQkJCVBSSU5UKEtFUk5fRVJSLCAiSVIgbGVnYWN5IGFjdGl2YXRlZCIpOworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlQUklOVChLRVJOX0VSUiwgIklSIGxlZ2FjeSBhY3RpdmF0ZWQiKTsKIAkJfQogCiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9oY2ktPklSX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwpAQCAtMTU2Niw2ICsxNTczLDEwIEBACiAKIAlzdHJ1Y3QgZG1hX2NtZCAqbmV4dCA9ICZyZWN2LT5ibG9ja1tuZXh0X2ldOwogCXN0cnVjdCBkbWFfY21kICpwcmV2ID0gJnJlY3YtPmJsb2NrW3ByZXZfaV07CisJCisJLyogaWdub3JlIG91dC1vZi1yYW5nZSByZXF1ZXN0cyAqLworCWlmICgoYmxvY2sgPCAwKSB8fCAoYmxvY2sgPiByZWN2LT5uYmxvY2tzKSkKKwkJcmV0dXJuOwogCiAJLyogJ25leHQnIGJlY29tZXMgdGhlIG5ldyBlbmQgb2YgdGhlIERNQSBjaGFpbiwKIAkgICBzbyBkaXNhYmxlIGJyYW5jaCBhbmQgZW5hYmxlIGludGVycnVwdCAqLwpAQCAtMTU5MywxOSArMTYwNCw4IEBACiBzdGF0aWMgdm9pZCBvaGNpX2lzb19yZWN2X2J1ZmZlcmZpbGxfcmVsZWFzZShzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdiwKIAkJCQkJICAgICBzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8pCiB7Ci0JaW50IGxlbjsKLQogCS8qIHJlbGVhc2UgdGhlIG1lbW9yeSB3aGVyZSB0aGUgcGFja2V0IHdhcyAqLwotCWxlbiA9IGluZm8tPmxlbjsKLQotCS8qIGFkZCB0aGUgd2FzdGVkIHNwYWNlIGZvciBwYWRkaW5nIHRvIDQgYnl0ZXMgKi8KLQlpZiAobGVuICUgNCkKLQkJbGVuICs9IDQgLSAobGVuICUgNCk7Ci0KLQkvKiBhZGQgOCBieXRlcyBmb3IgdGhlIE9IQ0kgRE1BIGRhdGEgZm9ybWF0IG92ZXJoZWFkICovCi0JbGVuICs9IDg7Ci0KLQlyZWN2LT5yZWxlYXNlZF9ieXRlcyArPSBsZW47CisJcmVjdi0+cmVsZWFzZWRfYnl0ZXMgKz0gaW5mby0+dG90YWxfbGVuOwogCiAJLyogaGF2ZSB3ZSByZWxlYXNlZCBlbm91Z2ggbWVtb3J5IGZvciBvbmUgYmxvY2s/ICovCiAJd2hpbGUgKHJlY3YtPnJlbGVhc2VkX2J5dGVzID4gcmVjdi0+YnVmX3N0cmlkZSkgewpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAkJLyogbm90ZTogcGFja2V0IGxheW91dCBpcyBhcyBzaG93biBpbiBzZWN0aW9uIDEwLjYuMS4xIG9mIHRoZSBPSENJIHNwZWMgKi8KIAogCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCQl1bnNpZ25lZCBzaG9ydCBsZW4sIGN5Y2xlOworCQl1bnNpZ25lZCBzaG9ydCBsZW4sIGN5Y2xlLCB0b3RhbF9sZW47CiAJCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdGFnLCBzeTsKIAogCQl1bnNpZ25lZCBjaGFyICpwID0gaXNvLT5kYXRhX2J1Zi5rdmlydDsKQEAgLTE2ODgsOSArMTY4OCwxMSBAQAogCQkvKiBhZHZhbmNlIHRvIHhmZXJTdGF0dXMvdGltZVN0YW1wICovCiAJCXJlY3YtPmRtYV9vZmZzZXQgKz0gbGVuOwogCisJCXRvdGFsX2xlbiA9IGxlbiArIDg7IC8qIDggYnl0ZXMgaGVhZGVyK3RyYWlsZXIgaW4gT0hDSSBwYWNrZXQgKi8KIAkJLyogcGF5bG9hZCBpcyBwYWRkZWQgdG8gNCBieXRlcyAqLwogCQlpZiAobGVuICUgNCkgewogCQkJcmVjdi0+ZG1hX29mZnNldCArPSA0IC0gKGxlbiU0KTsKKwkJCXRvdGFsX2xlbiArPSA0IC0gKGxlbiU0KTsKIAkJfQogCiAJCS8qIGNoZWNrIGZvciB3cmFwLWFyb3VuZCAqLwpAQCAtMTcyNCw3ICsxNzI2LDcgQEAKIAkJCXJlY3YtPmRtYV9vZmZzZXQgLT0gcmVjdi0+YnVmX3N0cmlkZSpyZWN2LT5uYmxvY2tzOwogCQl9CiAKLQkJaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKGlzbywgb2Zmc2V0LCBsZW4sIGN5Y2xlLCBjaGFubmVsLCB0YWcsIHN5KTsKKwkJaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKGlzbywgb2Zmc2V0LCBsZW4sIHRvdGFsX2xlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOwogCX0KIAogCWlmICh3YWtlKQpAQCAtMTg1MCw3ICsxODUyLDggQEAKIAkJCXRhZyA9IGhkcls1XSA+PiA2OwogCQkJc3kgPSBoZHJbNF0gJiAweEY7CiAKLQkJCWhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChpc28sIG9mZnNldCwgcGFja2V0X2xlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOworCQkJaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKGlzbywgb2Zmc2V0LCBwYWNrZXRfbGVuLAorCQkJCQlyZWN2LT5idWZfc3RyaWRlLCBjeWNsZSwgY2hhbm5lbCwgdGFnLCBzeSk7CiAJCX0KIAogCQkvKiByZXNldCB0aGUgRE1BIGRlc2NyaXB0b3IgKi8KQEAgLTM1MzgsOCArMzU0MSw4IEBACiAKIHN0YXRpYyBpbnQgb2hjaTEzOTRfcGNpX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLQl7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKF9tYWNoaW5lID09IF9NQUNIX1BtYWMpIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwogCiAJCS8qIFJlLWVuYWJsZSAxMzk0ICovCkBAIC0zNTQ3LDcgKzM1NTAsNyBAQAogCQlpZiAob2Zfbm9kZSkKIAkJCXBtYWNfY2FsbF9mZWF0dXJlIChQTUFDX0ZUUl8xMzk0X0VOQUJMRSwgb2Zfbm9kZSwgMCwgMSk7CiAJfQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKIAlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIApAQCAtMzU1Nyw4ICszNTYwLDggQEAKIAogc3RhdGljIGludCBvaGNpMTM5NF9wY2lfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCXsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CiAKIAkJLyogRGlzYWJsZSAxMzk0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCmluZGV4IGJkYjNhODUuLjM2MDc0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCkBAIC03Niw3ICs3Niw3IEBACiAKIAogLyogTW9kdWxlIFBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgc2tpcF9lZXByb20gPSAwOworc3RhdGljIGludCBza2lwX2VlcHJvbTsKIG1vZHVsZV9wYXJhbShza2lwX2VlcHJvbSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2tpcF9lZXByb20sICJVc2UgZ2VuZXJpYyBidXMgaW5mbyBibG9jayBpbnN0ZWFkIG9mIHNlcmlhbCBlZXByb20gKGRlZmF1bHQgPSAwKS4iKTsKIApAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIAkJaSA9IGdldF9waHlfcmVnKGx5bngsIDQpOwogCQlpIHw9IFBIWV8wNF9MQ1RSTDsKIAkJaWYgKGhwc2JfZGlzYWJsZV9pcm0pCi0JCQlpICY9ICFQSFlfMDRfQ09OVEVOREVSOworCQkJaSAmPSB+UEhZXzA0X0NPTlRFTkRFUjsKIAkJZWxzZQogCQkJaSB8PSBQSFlfMDRfQ09OVEVOREVSOwogCQlpZiAoaSAhPSAtMSkgc2V0X3BoeV9yZWcobHlueCwgNCwgaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCmluZGV4IDc0MTlhZjQuLmI0ZmExNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCkBAIC05OCw3ICs5OCw3IEBACiAKIHN0YXRpYyB2b2lkIHF1ZXVlX2NvbXBsZXRlX2NiKHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChpbnQgZmxhZ3MpCitzdGF0aWMgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqX19hbGxvY19wZW5kaW5nX3JlcXVlc3QodW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewogCXN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcTsKIApAQCAtMjUwNiw5ICsyNTA2LDEyIEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cGFja2V0cywgdWFkZHIsIHNpemVvZih1cGFja2V0cykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICh1cGFja2V0cy5uX3BhY2tldHMgPiBocHNiX2lzb19uX3JlYWR5KGZpLT5pc29faGFuZGxlKSkKKwlpZiAodXBhY2tldHMubl9wYWNrZXRzID49IGZpLT5pc29faGFuZGxlLT5idWZfcGFja2V0cykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodXBhY2tldHMubl9wYWNrZXRzID49IGhwc2JfaXNvX25fcmVhZHkoZmktPmlzb19oYW5kbGUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCS8qIGVuc3VyZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciBpcyBhY2Nlc3NpYmxlIGFuZCBiaWcgZW5vdWdoICovCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwYWNrZXRzLmluZm9zLAogCQkJdXBhY2tldHMubl9wYWNrZXRzICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKaW5kZXggMzIzNjhmMy4uZmUzZTE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKQEAgLTgxLDcgKzgxLDcgQEAKICNpbmNsdWRlICJzYnAyLmgiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLQkiJFJldjogMTIxOSAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CisJIiRSZXY6IDEzMDYgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOwogCiAvKgogICogTW9kdWxlIGxvYWQgcGFyYW1ldGVyIGRlZmluaXRpb25zCkBAIC0xMDQsNyArMTA0LDcgQEAKICAqIGRvd24gdG8gdXMgYXQgYSB0aW1lIChkZWJ1Z2dpbmcpLiBUaGlzIG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgdmVyeQogICogYmFkbHkgYmVoYXZlZCBzYnAyIGRldmljZXMuCiAgKi8KLXN0YXRpYyBpbnQgc2VyaWFsaXplX2lvID0gMDsKK3N0YXRpYyBpbnQgc2VyaWFsaXplX2lvOwogbW9kdWxlX3BhcmFtKHNlcmlhbGl6ZV9pbywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VyaWFsaXplX2lvLCAiU2VyaWFsaXplIGFsbCBJL08gY29taW5nIGRvd24gZnJvbSB0aGUgc2NzaSBkcml2ZXJzIChkZWZhdWx0ID0gMCkiKTsKIApAQCAtMTQ1LDcgKzE0NSw3IEBACiAgKiBwbGVhc2Ugc3VibWl0IHRoZSBsb2dnZWQgc2JwMl9maXJtd2FyZV9yZXZpc2lvbiB2YWx1ZSBvZiB0aGlzIGRldmljZSB0bwogICogdGhlIGxpbnV4MTM5NC1kZXZlbCBtYWlsaW5nIGxpc3QuCiAgKi8KLXN0YXRpYyBpbnQgZm9yY2VfaW5xdWlyeV9oYWNrID0gMDsKK3N0YXRpYyBpbnQgZm9yY2VfaW5xdWlyeV9oYWNrOwogbW9kdWxlX3BhcmFtKGZvcmNlX2lucXVpcnlfaGFjaywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaW5xdWlyeV9oYWNrLCAiRm9yY2UgU0NTSSBpbnF1aXJ5IGhhY2sgKGRlZmF1bHQgPSAwKSIpOwogCkBAIC0yMTEyLDYgKzIxMTIsMTAyIEBACiAgKi8KIHN0YXRpYyB2b2lkIHNicDJfY2hlY2tfc2JwMl9jb21tYW5kKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsIHVuY2hhciAqY21kKQogeworCXVuY2hhciBuZXdfY21kWzE2XTsKKwl1OCBkZXZpY2VfdHlwZSA9IFNCUDJfREVWSUNFX1RZUEUgKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bik7CisKKwlTQlAyX0RFQlVHKCJzYnAyX2NoZWNrX3NicDJfY29tbWFuZCIpOworCisJc3dpdGNoICgqY21kKSB7CisKKwkJY2FzZSBSRUFEXzY6CisKKwkJCWlmIChzYnAyX2NvbW1hbmRfY29udmVyc2lvbl9kZXZpY2VfdHlwZShkZXZpY2VfdHlwZSkpIHsKKworCQkJCVNCUDJfREVCVUcoIkNvbnZlcnQgUkVBRF82IHRvIFJFQURfMTAiKTsKKworCQkJCS8qCisJCQkJICogTmVlZCB0byB0dXJuIHJlYWRfNiBpbnRvIHJlYWRfMTAKKwkJCQkgKi8KKwkJCQluZXdfY21kWzBdID0gMHgyODsKKwkJCQluZXdfY21kWzFdID0gKGNtZFsxXSAmIDB4ZTApOworCQkJCW5ld19jbWRbMl0gPSAweDA7CisJCQkJbmV3X2NtZFszXSA9IChjbWRbMV0gJiAweDFmKTsKKwkJCQluZXdfY21kWzRdID0gY21kWzJdOworCQkJCW5ld19jbWRbNV0gPSBjbWRbM107CisJCQkJbmV3X2NtZFs2XSA9IDB4MDsKKwkJCQluZXdfY21kWzddID0gMHgwOworCQkJCW5ld19jbWRbOF0gPSBjbWRbNF07CisJCQkJbmV3X2NtZFs5XSA9IGNtZFs1XTsKKworCQkJCW1lbWNweShjbWQsIG5ld19jbWQsIDEwKTsKKworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFdSSVRFXzY6CisKKwkJCWlmIChzYnAyX2NvbW1hbmRfY29udmVyc2lvbl9kZXZpY2VfdHlwZShkZXZpY2VfdHlwZSkpIHsKKworCQkJCVNCUDJfREVCVUcoIkNvbnZlcnQgV1JJVEVfNiB0byBXUklURV8xMCIpOworCisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIHR1cm4gd3JpdGVfNiBpbnRvIHdyaXRlXzEwCisJCQkJICovCisJCQkJbmV3X2NtZFswXSA9IDB4MmE7CisJCQkJbmV3X2NtZFsxXSA9IChjbWRbMV0gJiAweGUwKTsKKwkJCQluZXdfY21kWzJdID0gMHgwOworCQkJCW5ld19jbWRbM10gPSAoY21kWzFdICYgMHgxZik7CisJCQkJbmV3X2NtZFs0XSA9IGNtZFsyXTsKKwkJCQluZXdfY21kWzVdID0gY21kWzNdOworCQkJCW5ld19jbWRbNl0gPSAweDA7CisJCQkJbmV3X2NtZFs3XSA9IDB4MDsKKwkJCQluZXdfY21kWzhdID0gY21kWzRdOworCQkJCW5ld19jbWRbOV0gPSBjbWRbNV07CisKKwkJCQltZW1jcHkoY21kLCBuZXdfY21kLCAxMCk7CisKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCisJCQlpZiAoc2JwMl9jb21tYW5kX2NvbnZlcnNpb25fZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKSB7CisKKwkJCQlTQlAyX0RFQlVHKCJDb252ZXJ0IE1PREVfU0VOU0VfNiB0byBNT0RFX1NFTlNFXzEwIik7CisKKwkJCQkvKgorCQkJCSAqIE5lZWQgdG8gdHVybiBtb2RlX3NlbnNlXzYgaW50byBtb2RlX3NlbnNlXzEwCisJCQkJICovCisJCQkJbmV3X2NtZFswXSA9IDB4NWE7CisJCQkJbmV3X2NtZFsxXSA9IGNtZFsxXTsKKwkJCQluZXdfY21kWzJdID0gY21kWzJdOworCQkJCW5ld19jbWRbM10gPSAweDA7CisJCQkJbmV3X2NtZFs0XSA9IDB4MDsKKwkJCQluZXdfY21kWzVdID0gMHgwOworCQkJCW5ld19jbWRbNl0gPSAweDA7CisJCQkJbmV3X2NtZFs3XSA9IDB4MDsKKwkJCQluZXdfY21kWzhdID0gY21kWzRdOworCQkJCW5ld19jbWRbOV0gPSBjbWRbNV07CisKKwkJCQltZW1jcHkoY21kLCBuZXdfY21kLCAxMCk7CisKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTEVDVDoKKworCQkJLyoKKwkJCSAqIFRPRE8uIFByb2JhYmx5IG5lZWQgdG8gY2hhbmdlIG1vZGUgc2VsZWN0IHRvIDEwIGJ5dGUgdmVyc2lvbgorCQkJICovCisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKIH0KIAogLyoKQEAgLTIxNTIsNiArMjI0OCw3IEBACiAJCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1OCAqc2NzaV9idWYgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJdTggZGV2aWNlX3R5cGUgPSBTQlAyX0RFVklDRV9UWVBFIChzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4pOwogCiAJU0JQMl9ERUJVRygic2JwMl9jaGVja19zYnAyX3Jlc3BvbnNlIik7CiAKQEAgLTIxNzYsNiArMjI3MywxNCBAQAogCQkJfQogCiAJCQkvKgorCQkJICogQ2hlY2sgZm9yIFNpbXBsZSBEaXJlY3QgQWNjZXNzIERldmljZSBhbmQgY2hhbmdlIGl0IHRvIFRZUEVfRElTSworCQkJICovCisJCQlpZiAoKHNjc2lfYnVmWzBdICYgMHgxZikgPT0gVFlQRV9SQkMpIHsKKwkJCQlTQlAyX0RFQlVHKCJDaGFuZ2luZyBUWVBFX1JCQyB0byBUWVBFX0RJU0siKTsKKwkJCQlzY3NpX2J1ZlswXSAmPSAweGUwOworCQkJfQorCisJCQkvKgogCQkJICogRml4IGFuc2kgcmV2aXNpb24gYW5kIHJlc3BvbnNlIGRhdGEgZm9ybWF0CiAJCQkgKi8KIAkJCXNjc2lfYnVmWzJdIHw9IDI7CkBAIC0yMTgzLDYgKzIyODgsMjcgQEAKIAogCQkJYnJlYWs7CiAKKwkJY2FzZSBNT0RFX1NFTlNFOgorCisJCQlpZiAoc2JwMl9jb21tYW5kX2NvbnZlcnNpb25fZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKSB7CisKKwkJCQlTQlAyX0RFQlVHKCJNb2RpZnkgbW9kZSBzZW5zZSByZXNwb25zZSAoMTAgYnl0ZSB2ZXJzaW9uKSIpOworCisJCQkJc2NzaV9idWZbMF0gPSBzY3NpX2J1ZlsxXTsJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQkJCXNjc2lfYnVmWzFdID0gc2NzaV9idWZbMl07CS8qIE1lZGl1bSB0eXBlICovCisJCQkJc2NzaV9idWZbMl0gPSBzY3NpX2J1ZlszXTsJLyogRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlciAqLworCQkJCXNjc2lfYnVmWzNdID0gc2NzaV9idWZbN107CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCisJCQkJbWVtY3B5KHNjc2lfYnVmICsgNCwgc2NzaV9idWYgKyA4LCBzY3NpX2J1ZlswXSk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9TRUxFQ1Q6CisKKwkJCS8qCisJCQkgKiBUT0RPLiBQcm9iYWJseSBuZWVkIHRvIGNoYW5nZSBtb2RlIHNlbGVjdCB0byAxMCBieXRlIHZlcnNpb24KKwkJCSAqLworCiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAl9CkBAIC0yNTU5LDggKzI2ODUsNyBAQAogc3RhdGljIGludCBzYnAyc2NzaV9zbGF2ZV9jb25maWd1cmUgKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlibGtfcXVldWVfZG1hX2FsaWdubWVudChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAoNTEyIC0gMSkpOwotCXNkZXYtPnVzZV8xMF9mb3JfcncgPSAxOwotCXNkZXYtPnVzZV8xMF9mb3JfbXMgPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIGIvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKaW5kZXggM2NjM2ZmMC4uNzljOGUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKQEAgLTcsNiArNywxNiBAQAogCSAgYW55IHByb3RvY29scyB5b3Ugd2lzaCB0byB1c2UgYXMgd2VsbCBhcyBkcml2ZXJzIGZvciB5b3VyCiAJICBJbmZpbmlCYW5kIGhhcmR3YXJlLgogCitjb25maWcgSU5GSU5JQkFORF9VU0VSX1ZFUkJTCisJdHJpc3RhdGUgIkluZmluaUJhbmQgdXNlcnNwYWNlIHZlcmJzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJTkZJTklCQU5ECisJLS0taGVscC0tLQorCSAgVXNlcnNwYWNlIEluZmluaUJhbmQgdmVyYnMgc3VwcG9ydC4gIFRoaXMgaXMgdGhlIGtlcm5lbCBzaWRlCisJICBvZiB1c2Vyc3BhY2UgdmVyYnMsIHdoaWNoIGFsbG93cyB1c2Vyc3BhY2UgcHJvY2Vzc2VzIHRvCisJICBkaXJlY3RseSBhY2Nlc3MgSW5maW5pQmFuZCBoYXJkd2FyZSBmb3IgZmFzdC1wYXRoCisJICBvcGVyYXRpb25zLiAgWW91IHdpbGwgYWxzbyBuZWVkIGxpYmlidmVyYnMgYW5kIGEgaGFyZHdhcmUKKwkgIGRyaXZlciBsaWJyYXJ5IGZyb20gPGh0dHA6Ly93d3cub3BlbmliLm9yZz4uCisKIHNvdXJjZSAiZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQppbmRleCBkMmRiZmI1Li5lMWE3Y2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlCiAKLW9iai0kKENPTkZJR19JTkZJTklCQU5EKSArPQlpYl9jb3JlLm8gaWJfbWFkLm8gaWJfc2EubyBpYl91bWFkLm8KK29iai0kKENPTkZJR19JTkZJTklCQU5EKSArPQkJaWJfY29yZS5vIGliX21hZC5vIGliX3NhLm8gaWJfdW1hZC5vCitvYmotJChDT05GSUdfSU5GSU5JQkFORF9VU0VSX1ZFUkJTKSArPQlpYl91dmVyYnMubwogCiBpYl9jb3JlLXkgOj0JCQlwYWNrZXIubyB1ZF9oZWFkZXIubyB2ZXJicy5vIHN5c2ZzLm8gXAogCQkJCWRldmljZS5vIGZtcl9wb29sLm8gY2FjaGUubwpAQCAtMTAsMyArMTEsNSBAQAogaWJfc2EteSA6PQkJCXNhX3F1ZXJ5Lm8KIAogaWJfdW1hZC15IDo9CQkJdXNlcl9tYWQubworCitpYl91dmVyYnMteSA6PQkJCXV2ZXJic19tYWluLm8gdXZlcmJzX2NtZC5vIHV2ZXJic19tZW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvcGFja2VyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYwppbmRleCA1ZjE1ZmVmLi5lYjVmZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYwpAQCAtOTYsNyArOTYsNyBAQAogCQkJZWxzZQogCQkJCXZhbCA9IDA7CiAKLQkJCW1hc2sgPSBjcHVfdG9fYmU2NCgoKDF1bGwgPDwgZGVzY1tpXS5zaXplX2JpdHMpIC0gMSkgPDwgc2hpZnQpOworCQkJbWFzayA9IGNwdV90b19iZTY0KCh+MHVsbCA+PiAoNjQgLSBkZXNjW2ldLnNpemVfYml0cykpIDw8IHNoaWZ0KTsKIAkJCWFkZHIgPSAoX19iZTY0ICopICgoX19iZTMyICopIGJ1ZiArIGRlc2NbaV0ub2Zmc2V0X3dvcmRzKTsKIAkJCSphZGRyID0gKCphZGRyICYgfm1hc2spIHwgKGNwdV90b19iZTY0KHZhbCkgJiBtYXNrKTsKIAkJfSBlbHNlIHsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkJX19iZTY0ICphZGRyOwogCiAJCQlzaGlmdCA9IDY0IC0gZGVzY1tpXS5vZmZzZXRfYml0cyAtIGRlc2NbaV0uc2l6ZV9iaXRzOwotCQkJbWFzayA9ICgoMXVsbCA8PCBkZXNjW2ldLnNpemVfYml0cykgLSAxKSA8PCBzaGlmdDsKKwkJCW1hc2sgPSAofjB1bGwgPj4gKDY0IC0gZGVzY1tpXS5zaXplX2JpdHMpKSA8PCBzaGlmdDsKIAkJCWFkZHIgPSAoX19iZTY0ICopIGJ1ZiArIGRlc2NbaV0ub2Zmc2V0X3dvcmRzOwogCQkJdmFsID0gKGJlNjRfdG9fY3B1cChhZGRyKSAmIG1hc2spID4+IHNoaWZ0OwogCQkJdmFsdWVfd3JpdGUoZGVzY1tpXS5zdHJ1Y3Rfb2Zmc2V0X2J5dGVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKaW5kZXggMjc2ZTFhNS4uNWEwOGU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCkBAIC01MDcsNyArNTA3LDEzIEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkcl9sb2NrLCBmbGFncyk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwkvKgorCSAqIEl0J3Mgbm90IHNhZmUgdG8gZGVyZWZlcmVuY2UgcXVlcnkgYW55IG1vcmUsIGJlY2F1c2UgdGhlCisJICogc2VuZCBtYXkgYWxyZWFkeSBoYXZlIGNvbXBsZXRlZCBhbmQgZnJlZWQgdGhlIHF1ZXJ5IGluCisJICogYW5vdGhlciBjb250ZXh0LiAgU28gdXNlIHdyLndyX2lkLCB3aGljaCBoYXMgYSBjb3B5IG9mIHRoZQorCSAqIHF1ZXJ5J3MgaWQuCisJICovCisJcmV0dXJuIHJldCA/IHJldCA6IHdyLndyX2lkOwogfQogCiBzdGF0aWMgdm9pZCBpYl9zYV9wYXRoX3JlY19jYWxsYmFjayhzdHJ1Y3QgaWJfc2FfcXVlcnkgKnNhX3F1ZXJ5LApAQCAtNTk4LDE0ICs2MDQsMTUgQEAKIAkJcmVjLCBxdWVyeS0+c2FfcXVlcnkubWFkLT5kYXRhKTsKIAogCSpzYV9xdWVyeSA9ICZxdWVyeS0+c2FfcXVlcnk7CisKIAlyZXQgPSBzZW5kX21hZCgmcXVlcnktPnNhX3F1ZXJ5LCB0aW1lb3V0X21zKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCA8IDApIHsKIAkJKnNhX3F1ZXJ5ID0gTlVMTDsKIAkJa2ZyZWUocXVlcnktPnNhX3F1ZXJ5Lm1hZCk7CiAJCWtmcmVlKHF1ZXJ5KTsKIAl9CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogcXVlcnktPnNhX3F1ZXJ5LmlkOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGliX3NhX3BhdGhfcmVjX2dldCk7CiAKQEAgLTY3NCwxNCArNjgxLDE1IEBACiAJCXJlYywgcXVlcnktPnNhX3F1ZXJ5Lm1hZC0+ZGF0YSk7CiAKIAkqc2FfcXVlcnkgPSAmcXVlcnktPnNhX3F1ZXJ5OworCiAJcmV0ID0gc2VuZF9tYWQoJnF1ZXJ5LT5zYV9xdWVyeSwgdGltZW91dF9tcyk7Ci0JaWYgKHJldCkgeworCWlmIChyZXQgPCAwKSB7CiAJCSpzYV9xdWVyeSA9IE5VTEw7CiAJCWtmcmVlKHF1ZXJ5LT5zYV9xdWVyeS5tYWQpOwogCQlrZnJlZShxdWVyeSk7CiAJfQogCi0JcmV0dXJuIHJldCA/IHJldCA6IHF1ZXJ5LT5zYV9xdWVyeS5pZDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChpYl9zYV9tY21lbWJlcl9yZWNfcXVlcnkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzQ3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzLmggMjU1OSAyMDA1LTA2LTA2IDE5OjQzOjE2WiByb2xhbmQgJAorICovCisKKyNpZm5kZWYgVVZFUkJTX0gKKyNkZWZpbmUgVVZFUkJTX0gKKworLyogSW5jbHVkZSBkZXZpY2UuaCBhbmQgZnMuaCB1bnRpbCBjZGV2LmggaXMgc2VsZi1zdWZmaWNpZW50ICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSA8aWJfdmVyYnMuaD4KKyNpbmNsdWRlIDxpYl91c2VyX3ZlcmJzLmg+CisKK3N0cnVjdCBpYl91dmVyYnNfZGV2aWNlIHsKKwlpbnQJCQkJCWRldm51bTsKKwlzdHJ1Y3QgY2RldgkJCQlkZXY7CisJc3RydWN0IGNsYXNzX2RldmljZQkJCWNsYXNzX2RldjsKKwlzdHJ1Y3QgaWJfZGV2aWNlCQkgICAgICAgKmliX2RldjsKKwlpbnQJCQkJCW51bV9jb21wOworfTsKKworc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlIHsKKwlzdHJ1Y3Qga3JlZgkJCQlyZWY7CisJc3RydWN0IGliX3V2ZXJic19maWxlCQkgICAgICAgKnV2ZXJic19maWxlOworCXNwaW5sb2NrX3QJCQkJbG9jazsKKwlpbnQJCQkJCWZkOworCWludAkJCQkJaXNfYXN5bmM7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCQlwb2xsX3dhaXQ7CisJc3RydWN0IGxpc3RfaGVhZAkJCWV2ZW50X2xpc3Q7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgeworCXN0cnVjdCBrcmVmCQkJCXJlZjsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZQkJICAgICAgICpkZXZpY2U7CisJc3RydWN0IGliX3Vjb250ZXh0CQkgICAgICAgKnVjb250ZXh0OworCXN0cnVjdCBpYl9ldmVudF9oYW5kbGVyCQkJZXZlbnRfaGFuZGxlcjsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUJICAgICAgICBhc3luY19maWxlOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZQkgICAgICAgIGNvbXBfZmlsZVsxXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnQgeworCXN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYwlkZXNjOworCXN0cnVjdCBsaXN0X2hlYWQJCQlsaXN0OworfTsKKworc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50IHsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnRfZGVzYwlkZXNjOworCXN0cnVjdCBsaXN0X2hlYWQJCQlsaXN0OworfTsKKworc3RydWN0IGliX3VvYmplY3RfbXIgeworCXN0cnVjdCBpYl91b2JqZWN0CQkJdW9iajsKKwlzdHJ1Y3QgcGFnZQkJCSAgICAgICAqcGFnZV9saXN0OworCXN0cnVjdCBzY2F0dGVybGlzdAkJICAgICAgICpzZ19saXN0OworfTsKKworZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgaWJfdXZlcmJzX2lkcl9tdXRleDsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19wZF9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfbXJfaWRyOworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX213X2lkcjsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19haF9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfY3FfaWRyOworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3FwX2lkcjsKKwordm9pZCBpYl91dmVyYnNfY29tcF9oYW5kbGVyKHN0cnVjdCBpYl9jcSAqY3EsIHZvaWQgKmNxX2NvbnRleHQpOwordm9pZCBpYl91dmVyYnNfY3FfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50LCB2b2lkICpjb250ZXh0X3B0cik7Cit2b2lkIGliX3V2ZXJic19xcF9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKTsKKworaW50IGliX3VtZW1fZ2V0KHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKm1lbSwKKwkJdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIGludCB3cml0ZSk7Cit2b2lkIGliX3VtZW1fcmVsZWFzZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl91bWVtICp1bWVtKTsKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlX29uX2Nsb3NlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pOworCisjZGVmaW5lIElCX1VWRVJCU19ERUNMQVJFX0NNRChuYW1lKQkJCQkJXAorCXNzaXplX3QgaWJfdXZlcmJzXyMjbmFtZShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCQlcCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCVwKKwkJCQkgaW50IG91dF9sZW4pCisKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9wYXJhbXMpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGdldF9jb250ZXh0KTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9kZXZpY2UpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X3BvcnQpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X2dpZCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfcGtleSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoYWxsb2NfcGQpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGRlYWxsb2NfcGQpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHJlZ19tcik7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVyZWdfbXIpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGNyZWF0ZV9jcSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9jcSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoY3JlYXRlX3FwKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChtb2RpZnlfcXApOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGRlc3Ryb3lfcXApOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGF0dGFjaF9tY2FzdCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGV0YWNoX21jYXN0KTsKKworI2VuZGlmIC8qIFVWRVJCU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyYmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiAkSWQ6IHV2ZXJic19jbWQuYyAyNzA4IDIwMDUtMDYtMjQgMTc6Mjc6MjFaIHJvbGFuZCAkCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ1dmVyYnMuaCIKKworI2RlZmluZSBJTklUX1VEQVRBKHVkYXRhLCBpYnVmLCBvYnVmLCBpbGVuLCBvbGVuKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCSh1ZGF0YSktPmluYnVmICA9ICh2b2lkIF9fdXNlciAqKSAoaWJ1Zik7CQlcCisJCSh1ZGF0YSktPm91dGJ1ZiA9ICh2b2lkIF9fdXNlciAqKSAob2J1Zik7CQlcCisJCSh1ZGF0YSktPmlubGVuICA9IChpbGVuKTsJCQkJXAorCQkodWRhdGEpLT5vdXRsZW4gPSAob2xlbik7CQkJCVwKKwl9IHdoaWxlICgwKQorCitzc2l6ZV90IGliX3V2ZXJic19xdWVyeV9wYXJhbXMoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9wYXJhbXMgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9wYXJhbXNfcmVzcCByZXNwOworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKworCXJlc3AubnVtX2NxX2V2ZW50cyA9IGZpbGUtPmRldmljZS0+bnVtX2NvbXA7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLCAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2dldF9jb250ZXh0KHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2dldF9jb250ZXh0ICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfZ2V0X2NvbnRleHRfcmVzcCByZXNwOworCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICAgICAgICAgICAqaWJkZXYgPSBmaWxlLT5kZXZpY2UtPmliX2RldjsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gaW5fbGVuOworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlJTklUX1VEQVRBKCZ1ZGF0YSwgYnVmICsgc2l6ZW9mIGNtZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAorCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOworCisJZmlsZS0+dWNvbnRleHQgPSBpYmRldi0+YWxsb2NfdWNvbnRleHQoaWJkZXYsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihmaWxlLT51Y29udGV4dCkpIHsKKwkJcmV0ID0gUFRSX0VSUihmaWxlLT51Y29udGV4dCk7CisJCWZpbGUtPnVjb250ZXh0ID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmaWxlLT51Y29udGV4dC0+ZGV2aWNlID0gaWJkZXY7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5wZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPm1yX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+bXdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5jcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+c3JxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+YWhfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCXJlc3AuYXN5bmNfZmQgPSBmaWxlLT5hc3luY19maWxlLmZkOworCWZvciAoaSA9IDA7IGkgPCBmaWxlLT5kZXZpY2UtPm51bV9jb21wOyArK2kpCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQuY3FfZmRfdGFiICsKKwkJCQkgaSAqIHNpemVvZiAoX191MzIpLAorCQkJCSAmZmlsZS0+Y29tcF9maWxlW2ldLmZkLCBzaXplb2YgKF9fdTMyKSkpCisJCQlnb3RvIGVycjsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnI6CisJaWJkZXYtPmRlYWxsb2NfdWNvbnRleHQoZmlsZS0+dWNvbnRleHQpOworCWZpbGUtPnVjb250ZXh0ID0gTlVMTDsKKworCXJldHVybiAtRUZBVUxUOworfQorCitzc2l6ZV90IGliX3V2ZXJic19xdWVyeV9kZXZpY2Uoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2UgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2VfcmVzcCByZXNwOworCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAgICAgICAgICAgICAgYXR0cjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gaWJfcXVlcnlfZGV2aWNlKGZpbGUtPmRldmljZS0+aWJfZGV2LCAmYXR0cik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCisJcmVzcC5md192ZXIgCQkgICAgICAgPSBhdHRyLmZ3X3ZlcjsKKwlyZXNwLm5vZGVfZ3VpZCAJCSAgICAgICA9IGF0dHIubm9kZV9ndWlkOworCXJlc3Auc3lzX2ltYWdlX2d1aWQgCSAgICAgICA9IGF0dHIuc3lzX2ltYWdlX2d1aWQ7CisJcmVzcC5tYXhfbXJfc2l6ZSAJICAgICAgID0gYXR0ci5tYXhfbXJfc2l6ZTsKKwlyZXNwLnBhZ2Vfc2l6ZV9jYXAgCSAgICAgICA9IGF0dHIucGFnZV9zaXplX2NhcDsKKwlyZXNwLnZlbmRvcl9pZCAJCSAgICAgICA9IGF0dHIudmVuZG9yX2lkOworCXJlc3AudmVuZG9yX3BhcnRfaWQgCSAgICAgICA9IGF0dHIudmVuZG9yX3BhcnRfaWQ7CisJcmVzcC5od192ZXIgCQkgICAgICAgPSBhdHRyLmh3X3ZlcjsKKwlyZXNwLm1heF9xcCAJCSAgICAgICA9IGF0dHIubWF4X3FwOworCXJlc3AubWF4X3FwX3dyIAkJICAgICAgID0gYXR0ci5tYXhfcXBfd3I7CisJcmVzcC5kZXZpY2VfY2FwX2ZsYWdzIAkgICAgICAgPSBhdHRyLmRldmljZV9jYXBfZmxhZ3M7CisJcmVzcC5tYXhfc2dlIAkJICAgICAgID0gYXR0ci5tYXhfc2dlOworCXJlc3AubWF4X3NnZV9yZCAJICAgICAgID0gYXR0ci5tYXhfc2dlX3JkOworCXJlc3AubWF4X2NxIAkJICAgICAgID0gYXR0ci5tYXhfY3E7CisJcmVzcC5tYXhfY3FlIAkJICAgICAgID0gYXR0ci5tYXhfY3FlOworCXJlc3AubWF4X21yIAkJICAgICAgID0gYXR0ci5tYXhfbXI7CisJcmVzcC5tYXhfcGQgCQkgICAgICAgPSBhdHRyLm1heF9wZDsKKwlyZXNwLm1heF9xcF9yZF9hdG9tIAkgICAgICAgPSBhdHRyLm1heF9xcF9yZF9hdG9tOworCXJlc3AubWF4X2VlX3JkX2F0b20gCSAgICAgICA9IGF0dHIubWF4X2VlX3JkX2F0b207CisJcmVzcC5tYXhfcmVzX3JkX2F0b20gCSAgICAgICA9IGF0dHIubWF4X3Jlc19yZF9hdG9tOworCXJlc3AubWF4X3FwX2luaXRfcmRfYXRvbSAgICAgICA9IGF0dHIubWF4X3FwX2luaXRfcmRfYXRvbTsKKwlyZXNwLm1heF9lZV9pbml0X3JkX2F0b20gICAgICAgPSBhdHRyLm1heF9lZV9pbml0X3JkX2F0b207CisJcmVzcC5hdG9taWNfY2FwIAkgICAgICAgPSBhdHRyLmF0b21pY19jYXA7CisJcmVzcC5tYXhfZWUgCQkgICAgICAgPSBhdHRyLm1heF9lZTsKKwlyZXNwLm1heF9yZGQgCQkgICAgICAgPSBhdHRyLm1heF9yZGQ7CisJcmVzcC5tYXhfbXcgCQkgICAgICAgPSBhdHRyLm1heF9tdzsKKwlyZXNwLm1heF9yYXdfaXB2Nl9xcCAJICAgICAgID0gYXR0ci5tYXhfcmF3X2lwdjZfcXA7CisJcmVzcC5tYXhfcmF3X2V0aHlfcXAgCSAgICAgICA9IGF0dHIubWF4X3Jhd19ldGh5X3FwOworCXJlc3AubWF4X21jYXN0X2dycCAJICAgICAgID0gYXR0ci5tYXhfbWNhc3RfZ3JwOworCXJlc3AubWF4X21jYXN0X3FwX2F0dGFjaCAgICAgICA9IGF0dHIubWF4X21jYXN0X3FwX2F0dGFjaDsKKwlyZXNwLm1heF90b3RhbF9tY2FzdF9xcF9hdHRhY2ggPSBhdHRyLm1heF90b3RhbF9tY2FzdF9xcF9hdHRhY2g7CisJcmVzcC5tYXhfYWggCQkgICAgICAgPSBhdHRyLm1heF9haDsKKwlyZXNwLm1heF9mbXIgCQkgICAgICAgPSBhdHRyLm1heF9mbXI7CisJcmVzcC5tYXhfbWFwX3Blcl9mbXIgCSAgICAgICA9IGF0dHIubWF4X21hcF9wZXJfZm1yOworCXJlc3AubWF4X3NycSAJCSAgICAgICA9IGF0dHIubWF4X3NycTsKKwlyZXNwLm1heF9zcnFfd3IgCSAgICAgICA9IGF0dHIubWF4X3NycV93cjsKKwlyZXNwLm1heF9zcnFfc2dlIAkgICAgICAgPSBhdHRyLm1heF9zcnFfc2dlOworCXJlc3AubWF4X3BrZXlzIAkJICAgICAgID0gYXR0ci5tYXhfcGtleXM7CisJcmVzcC5sb2NhbF9jYV9hY2tfZGVsYXkgICAgICAgID0gYXR0ci5sb2NhbF9jYV9hY2tfZGVsYXk7CisJcmVzcC5waHlzX3BvcnRfY250CSAgICAgICA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5waHlzX3BvcnRfY250OworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnQgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9wb3J0X3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfcG9ydF9hdHRyICAgICAgICAgICAgICBhdHRyOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gaWJfcXVlcnlfcG9ydChmaWxlLT5kZXZpY2UtPmliX2RldiwgY21kLnBvcnRfbnVtLCAmYXR0cik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCisJcmVzcC5zdGF0ZSAJICAgICA9IGF0dHIuc3RhdGU7CisJcmVzcC5tYXhfbXR1IAkgICAgID0gYXR0ci5tYXhfbXR1OworCXJlc3AuYWN0aXZlX210dSAgICAgID0gYXR0ci5hY3RpdmVfbXR1OworCXJlc3AuZ2lkX3RibF9sZW4gICAgID0gYXR0ci5naWRfdGJsX2xlbjsKKwlyZXNwLnBvcnRfY2FwX2ZsYWdzICA9IGF0dHIucG9ydF9jYXBfZmxhZ3M7CisJcmVzcC5tYXhfbXNnX3N6ICAgICAgPSBhdHRyLm1heF9tc2dfc3o7CisJcmVzcC5iYWRfcGtleV9jbnRyICAgPSBhdHRyLmJhZF9wa2V5X2NudHI7CisJcmVzcC5xa2V5X3Zpb2xfY250ciAgPSBhdHRyLnFrZXlfdmlvbF9jbnRyOworCXJlc3AucGtleV90YmxfbGVuICAgID0gYXR0ci5wa2V5X3RibF9sZW47CisJcmVzcC5saWQgCSAgICAgPSBhdHRyLmxpZDsKKwlyZXNwLnNtX2xpZCAJICAgICA9IGF0dHIuc21fbGlkOworCXJlc3AubG1jIAkgICAgID0gYXR0ci5sbWM7CisJcmVzcC5tYXhfdmxfbnVtICAgICAgPSBhdHRyLm1heF92bF9udW07CisJcmVzcC5zbV9zbCAJICAgICA9IGF0dHIuc21fc2w7CisJcmVzcC5zdWJuZXRfdGltZW91dCAgPSBhdHRyLnN1Ym5ldF90aW1lb3V0OworCXJlc3AuaW5pdF90eXBlX3JlcGx5ID0gYXR0ci5pbml0X3R5cGVfcmVwbHk7CisJcmVzcC5hY3RpdmVfd2lkdGggICAgPSBhdHRyLmFjdGl2ZV93aWR0aDsKKwlyZXNwLmFjdGl2ZV9zcGVlZCAgICA9IGF0dHIuYWN0aXZlX3NwZWVkOworCXJlc3AucGh5c19zdGF0ZSAgICAgID0gYXR0ci5waHlzX3N0YXRlOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X2dpZChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2dpZCAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2dpZF9yZXNwIHJlc3A7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCisJcmV0ID0gaWJfcXVlcnlfZ2lkKGZpbGUtPmRldmljZS0+aWJfZGV2LCBjbWQucG9ydF9udW0sIGNtZC5pbmRleCwKKwkJCSAgICh1bmlvbiBpYl9naWQgKikgcmVzcC5naWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfcGtleShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGtleSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BrZXlfcmVzcCByZXNwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXQgPSBpYl9xdWVyeV9wa2V5KGZpbGUtPmRldmljZS0+aWJfZGV2LCBjbWQucG9ydF9udW0sIGNtZC5pbmRleCwKKwkJCSAgICAmcmVzcC5wa2V5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2FsbG9jX3BkKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2FsbG9jX3BkICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGRfcmVzcCByZXNwOworCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAgICAqdW9iajsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAqcGQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCXVvYmogPSBrbWFsbG9jKHNpemVvZiAqdW9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVvYmotPmNvbnRleHQgPSBmaWxlLT51Y29udGV4dDsKKworCXBkID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPmFsbG9jX3BkKGZpbGUtPmRldmljZS0+aWJfZGV2LAorCQkJCQkgICAgZmlsZS0+dWNvbnRleHQsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihwZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihwZCk7CisJCWdvdG8gZXJyOworCX0KKworCXBkLT5kZXZpY2UgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXY7CisJcGQtPnVvYmplY3QgPSB1b2JqOworCWF0b21pY19zZXQoJnBkLT51c2VjbnQsIDApOworCityZXRyeToKKwlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfcGRfaWRyLCBHRlBfS0VSTkVMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wZDsKKwl9CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwlyZXQgPSBpZHJfZ2V0X25ldygmaWJfdXZlcmJzX3BkX2lkciwgcGQsICZ1b2JqLT5pZCk7CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlnb3RvIHJldHJ5OworCWlmIChyZXQpCisJCWdvdG8gZXJyX3BkOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJnVvYmotPmxpc3QsICZmaWxlLT51Y29udGV4dC0+cGRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKwlyZXNwLnBkX2hhbmRsZSA9IHVvYmotPmlkOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2xpc3Q7CisJfQorCisJcmV0dXJuIGluX2xlbjsKKworZXJyX2xpc3Q6CisgCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcGRfaWRyLCB1b2JqLT5pZCk7CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCitlcnJfcGQ6CisJaWJfZGVhbGxvY19wZChwZCk7CisKK2VycjoKKwlrZnJlZSh1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19kZWFsbG9jX3BkKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19kZWFsbG9jX3BkIGNtZDsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAqcGQ7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgKnVvYmo7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOworCWlmICghcGQgfHwgcGQtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCisJCWdvdG8gb3V0OworCisJdW9iaiA9IHBkLT51b2JqZWN0OworCisJcmV0ID0gaWJfZGVhbGxvY19wZChwZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlrZnJlZSh1b2JqKTsKKworb3V0OgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX3JlZ19tcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tciAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tcl9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgICAgICAgKm9iajsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgKnBkOworCXN0cnVjdCBpYl9tciAgICAgICAgICAgICAgICAqbXI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwlpZiAoKGNtZC5zdGFydCAmIH5QQUdFX01BU0spICE9IChjbWQuaGNhX3ZhICYgflBBR0VfTUFTSykpCisJCXJldHVybiAtRUlOVkFMOworCisJb2JqID0ga21hbGxvYyhzaXplb2YgKm9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJb2JqLT51b2JqZWN0LmNvbnRleHQgPSBmaWxlLT51Y29udGV4dDsKKworCS8qCisJICogV2UgYXNrIGZvciB3cml0YWJsZSBtZW1vcnkgaWYgYW55IGFjY2VzcyBmbGFncyBvdGhlciB0aGFuCisJICogInJlbW90ZSByZWFkIiBhcmUgc2V0LiAgIkxvY2FsIHdyaXRlIiBhbmQgInJlbW90ZSB3cml0ZSIKKwkgKiBvYnZpb3VzbHkgcmVxdWlyZSB3cml0ZSBhY2Nlc3MuICAiUmVtb3RlIGF0b21pYyIgY2FuIGRvCisJICogdGhpbmdzIGxpa2UgZmV0Y2ggYW5kIGFkZCwgd2hpY2ggd2lsbCBtb2RpZnkgbWVtb3J5LCBhbmQKKwkgKiAiTVcgYmluZCIgY2FuIGNoYW5nZSBwZXJtaXNzaW9ucyBieSBiaW5kaW5nIGEgd2luZG93LgorCSAqLworCXJldCA9IGliX3VtZW1fZ2V0KGZpbGUtPmRldmljZS0+aWJfZGV2LCAmb2JqLT51bWVtLAorCQkJICAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgY21kLnN0YXJ0LCBjbWQubGVuZ3RoLAorCQkJICAhIShjbWQuYWNjZXNzX2ZsYWdzICYgfklCX0FDQ0VTU19SRU1PVEVfUkVBRCkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlvYmotPnVtZW0udmlydF9iYXNlID0gY21kLmhjYV92YTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcGQgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CisJaWYgKCFwZCB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl91cDsKKwl9CisKKwlpZiAoIXBkLT5kZXZpY2UtPnJlZ191c2VyX21yKSB7CisJCXJldCA9IC1FTk9TWVM7CisJCWdvdG8gZXJyX3VwOworCX0KKworCW1yID0gcGQtPmRldmljZS0+cmVnX3VzZXJfbXIocGQsICZvYmotPnVtZW0sIGNtZC5hY2Nlc3NfZmxhZ3MsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihtcikpIHsKKwkJcmV0ID0gUFRSX0VSUihtcik7CisJCWdvdG8gZXJyX3VwOworCX0KKworCW1yLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwltci0+cGQgICAgICA9IHBkOworCW1yLT51b2JqZWN0ID0gJm9iai0+dW9iamVjdDsKKwlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKKwlhdG9taWNfc2V0KCZtci0+dXNlY250LCAwKTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AubGtleSA9IG1yLT5sa2V5OworCXJlc3AucmtleSA9IG1yLT5ya2V5OworCityZXRyeToKKwlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfbXJfaWRyLCBHRlBfS0VSTkVMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwlyZXQgPSBpZHJfZ2V0X25ldygmaWJfdXZlcmJzX21yX2lkciwgbXIsICZvYmotPnVvYmplY3QuaWQpOworCisJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlnb3RvIHJldHJ5OworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VucmVnOworCisJcmVzcC5tcl9oYW5kbGUgPSBvYmotPnVvYmplY3QuaWQ7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmb2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+bXJfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfbGlzdDsKKwl9CisKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfbGlzdDoKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9kZWwoJm9iai0+dW9iamVjdC5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworZXJyX3VucmVnOgorCWliX2RlcmVnX21yKG1yKTsKKworZXJyX3VwOgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCWliX3VtZW1fcmVsZWFzZShmaWxlLT5kZXZpY2UtPmliX2RldiwgJm9iai0+dW1lbSk7CisKK2Vycl9mcmVlOgorCWtmcmVlKG9iaik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBpYl91dmVyYnNfZGVyZWdfbXIoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGVyZWdfbXIgY21kOworCXN0cnVjdCBpYl9tciAgICAgICAgICAgICAqbXI7CisJc3RydWN0IGliX3VtZW1fb2JqZWN0ICAgICptZW1vYmo7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwltciA9IGlkcl9maW5kKCZpYl91dmVyYnNfbXJfaWRyLCBjbWQubXJfaGFuZGxlKTsKKwlpZiAoIW1yIHx8IG1yLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQorCQlnb3RvIG91dDsKKworCW1lbW9iaiA9IGNvbnRhaW5lcl9vZihtci0+dW9iamVjdCwgc3RydWN0IGliX3VtZW1fb2JqZWN0LCB1b2JqZWN0KTsKKworCXJldCA9IGliX2RlcmVnX21yKG1yKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZtZW1vYmotPnVvYmplY3QubGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlpYl91bWVtX3JlbGVhc2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZtZW1vYmotPnVtZW0pOworCWtmcmVlKG1lbW9iaik7CisKK291dDoKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19jcmVhdGVfY3Eoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3EgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3FfcmVzcCByZXNwOworCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgdWRhdGE7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICAgICAqY3E7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwlpZiAoY21kLmV2ZW50X2hhbmRsZXIgPj0gZmlsZS0+ZGV2aWNlLT5udW1fY29tcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1b2JqID0ga21hbGxvYyhzaXplb2YgKnVvYmosIEdGUF9LRVJORUwpOworCWlmICghdW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1b2JqLT51c2VyX2hhbmRsZSA9IGNtZC51c2VyX2hhbmRsZTsKKwl1b2JqLT5jb250ZXh0ICAgICA9IGZpbGUtPnVjb250ZXh0OworCisJY3EgPSBmaWxlLT5kZXZpY2UtPmliX2Rldi0+Y3JlYXRlX2NxKGZpbGUtPmRldmljZS0+aWJfZGV2LCBjbWQuY3FlLAorCQkJCQkgICAgIGZpbGUtPnVjb250ZXh0LCAmdWRhdGEpOworCWlmIChJU19FUlIoY3EpKSB7CisJCXJldCA9IFBUUl9FUlIoY3EpOworCQlnb3RvIGVycjsKKwl9CisKKwljcS0+ZGV2aWNlICAgICAgICA9IGZpbGUtPmRldmljZS0+aWJfZGV2OworCWNxLT51b2JqZWN0ICAgICAgID0gdW9iajsKKwljcS0+Y29tcF9oYW5kbGVyICA9IGliX3V2ZXJic19jb21wX2hhbmRsZXI7CisJY3EtPmV2ZW50X2hhbmRsZXIgPSBpYl91dmVyYnNfY3FfZXZlbnRfaGFuZGxlcjsKKwljcS0+Y3FfY29udGV4dCAgICA9IGZpbGU7CisJYXRvbWljX3NldCgmY3EtPnVzZWNudCwgMCk7CisKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19jcV9pZHIsIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NxOworCX0KKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfY3FfaWRyLCBjcSwgJnVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY3E7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5jcV9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AuY3FfaGFuZGxlID0gdW9iai0+aWQ7CisJcmVzcC5jcWUgICAgICAgPSBjcS0+Y3FlOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2xpc3Q7CisJfQorCisJcmV0dXJuIGluX2xlbjsKKworZXJyX2xpc3Q6CisgCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqLT5pZCk7CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCitlcnJfY3E6CisJaWJfZGVzdHJveV9jcShjcSk7CisKK2VycjoKKwlrZnJlZSh1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19kZXN0cm95X2NxKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19kZXN0cm95X2NxIGNtZDsKKwlzdHJ1Y3QgaWJfY3EgICAgICAgICAgICAgICAqY3E7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgKnVvYmo7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCWNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOworCWlmICghY3EgfHwgY3EtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCisJCWdvdG8gb3V0OworCisJdW9iaiA9IGNxLT51b2JqZWN0OworCisJcmV0ID0gaWJfZGVzdHJveV9jcShjcSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKKwlrZnJlZSh1b2JqKTsKKworb3V0OgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2NyZWF0ZV9xcChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcCAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAgICAgKnVvYmo7CisJc3RydWN0IGliX3BkICAgICAgICAgICAgICAgICAgICpwZDsKKwlzdHJ1Y3QgaWJfY3EgICAgICAgICAgICAgICAgICAgKnNjcSwgKnJjcTsKKwlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgICAgICAgICAgYXR0cjsKKwlpbnQgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlJTklUX1VEQVRBKCZ1ZGF0YSwgYnVmICsgc2l6ZW9mIGNtZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAorCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOworCisJdW9iaiA9IGttYWxsb2Moc2l6ZW9mICp1b2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlwZCAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CisJc2NxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5zZW5kX2NxX2hhbmRsZSk7CisJcmNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5yZWN2X2NxX2hhbmRsZSk7CisKKwlpZiAoIXBkICB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAgIT0gZmlsZS0+dWNvbnRleHQgfHwKKwkgICAgIXNjcSB8fCBzY3EtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQgfHwKKwkgICAgIXJjcSB8fCByY3EtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfdXA7CisJfQorCisJYXR0ci5ldmVudF9oYW5kbGVyID0gaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXI7CisJYXR0ci5xcF9jb250ZXh0ICAgID0gZmlsZTsKKwlhdHRyLnNlbmRfY3EgICAgICAgPSBzY3E7CisJYXR0ci5yZWN2X2NxICAgICAgID0gcmNxOworCWF0dHIuc3JxICAgICAgICAgICA9IE5VTEw7CisJYXR0ci5zcV9zaWdfdHlwZSAgID0gY21kLnNxX3NpZ19hbGwgPyBJQl9TSUdOQUxfQUxMX1dSIDogSUJfU0lHTkFMX1JFUV9XUjsKKwlhdHRyLnFwX3R5cGUgICAgICAgPSBjbWQucXBfdHlwZTsKKworCWF0dHIuY2FwLm1heF9zZW5kX3dyICAgICA9IGNtZC5tYXhfc2VuZF93cjsKKwlhdHRyLmNhcC5tYXhfcmVjdl93ciAgICAgPSBjbWQubWF4X3JlY3Zfd3I7CisJYXR0ci5jYXAubWF4X3NlbmRfc2dlICAgID0gY21kLm1heF9zZW5kX3NnZTsKKwlhdHRyLmNhcC5tYXhfcmVjdl9zZ2UgICAgPSBjbWQubWF4X3JlY3Zfc2dlOworCWF0dHIuY2FwLm1heF9pbmxpbmVfZGF0YSA9IGNtZC5tYXhfaW5saW5lX2RhdGE7CisKKwl1b2JqLT51c2VyX2hhbmRsZSA9IGNtZC51c2VyX2hhbmRsZTsKKwl1b2JqLT5jb250ZXh0ICAgICA9IGZpbGUtPnVjb250ZXh0OworCisJcXAgPSBwZC0+ZGV2aWNlLT5jcmVhdGVfcXAocGQsICZhdHRyLCAmdWRhdGEpOworCWlmIChJU19FUlIocXApKSB7CisJCXJldCA9IFBUUl9FUlIocXApOworCQlnb3RvIGVycl91cDsKKwl9CisKKwlxcC0+ZGV2aWNlICAgICAJICA9IHBkLT5kZXZpY2U7CisJcXAtPnBkICAgICAgICAgCSAgPSBwZDsKKwlxcC0+c2VuZF9jcSAgICAJICA9IGF0dHIuc2VuZF9jcTsKKwlxcC0+cmVjdl9jcSAgICAJICA9IGF0dHIucmVjdl9jcTsKKwlxcC0+c3JxCSAgICAgICAJICA9IGF0dHIuc3JxOworCXFwLT51b2JqZWN0ICAgICAgID0gdW9iajsKKwlxcC0+ZXZlbnRfaGFuZGxlciA9IGF0dHIuZXZlbnRfaGFuZGxlcjsKKwlxcC0+cXBfY29udGV4dCAgICA9IGF0dHIucXBfY29udGV4dDsKKwlxcC0+cXBfdHlwZQkgID0gYXR0ci5xcF90eXBlOworCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCWF0b21pY19pbmMoJmF0dHIuc2VuZF9jcS0+dXNlY250KTsKKwlhdG9taWNfaW5jKCZhdHRyLnJlY3ZfY3EtPnVzZWNudCk7CisJaWYgKGF0dHIuc3JxKQorCQlhdG9taWNfaW5jKCZhdHRyLnNycS0+dXNlY250KTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AucXBuID0gcXAtPnFwX251bTsKKworcmV0cnk6CisJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX3FwX2lkciwgR0ZQX0tFUk5FTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGVzdHJveTsKKwl9CisKKwlyZXQgPSBpZHJfZ2V0X25ldygmaWJfdXZlcmJzX3FwX2lkciwgcXAsICZ1b2JqLT5pZCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVzdHJveTsKKworCXJlc3AucXBfaGFuZGxlID0gdW9iai0+aWQ7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5xcF9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9saXN0OworCX0KKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiBpbl9sZW47CisKK2Vycl9saXN0OgorCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisKK2Vycl9kZXN0cm95OgorCWliX2Rlc3Ryb3lfcXAocXApOworCitlcnJfdXA6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJa2ZyZWUodW9iaik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBpYl91dmVyYnNfbW9kaWZ5X3FwKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfbW9kaWZ5X3FwIGNtZDsKKwlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICpxcDsKKwlzdHJ1Y3QgaWJfcXBfYXR0ciAgICAgICAgICphdHRyOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWF0dHIgPSBrbWFsbG9jKHNpemVvZiAqYXR0ciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlhdHRyLT5xcF9zdGF0ZSAJCSAgPSBjbWQucXBfc3RhdGU7CisJYXR0ci0+Y3VyX3FwX3N0YXRlIAkgID0gY21kLmN1cl9xcF9zdGF0ZTsKKwlhdHRyLT5wYXRoX210dSAJCSAgPSBjbWQucGF0aF9tdHU7CisJYXR0ci0+cGF0aF9taWdfc3RhdGUgCSAgPSBjbWQucGF0aF9taWdfc3RhdGU7CisJYXR0ci0+cWtleSAJCSAgPSBjbWQucWtleTsKKwlhdHRyLT5ycV9wc24gCQkgID0gY21kLnJxX3BzbjsKKwlhdHRyLT5zcV9wc24gCQkgID0gY21kLnNxX3BzbjsKKwlhdHRyLT5kZXN0X3FwX251bSAJICA9IGNtZC5kZXN0X3FwX251bTsKKwlhdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgCSAgPSBjbWQucXBfYWNjZXNzX2ZsYWdzOworCWF0dHItPnBrZXlfaW5kZXggCSAgPSBjbWQucGtleV9pbmRleDsKKwlhdHRyLT5hbHRfcGtleV9pbmRleCAJICA9IGNtZC5wa2V5X2luZGV4OworCWF0dHItPmVuX3NxZF9hc3luY19ub3RpZnkgPSBjbWQuZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlhdHRyLT5tYXhfcmRfYXRvbWljIAkgID0gY21kLm1heF9yZF9hdG9taWM7CisJYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljICA9IGNtZC5tYXhfZGVzdF9yZF9hdG9taWM7CisJYXR0ci0+bWluX3Jucl90aW1lciAJICA9IGNtZC5taW5fcm5yX3RpbWVyOworCWF0dHItPnBvcnRfbnVtIAkJICA9IGNtZC5wb3J0X251bTsKKwlhdHRyLT50aW1lb3V0IAkJICA9IGNtZC50aW1lb3V0OworCWF0dHItPnJldHJ5X2NudCAJICA9IGNtZC5yZXRyeV9jbnQ7CisJYXR0ci0+cm5yX3JldHJ5IAkgID0gY21kLnJucl9yZXRyeTsKKwlhdHRyLT5hbHRfcG9ydF9udW0gCSAgPSBjbWQuYWx0X3BvcnRfbnVtOworCWF0dHItPmFsdF90aW1lb3V0IAkgID0gY21kLmFsdF90aW1lb3V0OworCisJbWVtY3B5KGF0dHItPmFoX2F0dHIuZ3JoLmRnaWQucmF3LCBjbWQuZGVzdC5kZ2lkLCAxNik7CisJYXR0ci0+YWhfYXR0ci5ncmguZmxvd19sYWJlbCAgICAgICAgPSBjbWQuZGVzdC5mbG93X2xhYmVsOworCWF0dHItPmFoX2F0dHIuZ3JoLnNnaWRfaW5kZXggICAgICAgID0gY21kLmRlc3Quc2dpZF9pbmRleDsKKwlhdHRyLT5haF9hdHRyLmdyaC5ob3BfbGltaXQgICAgICAgICA9IGNtZC5kZXN0LmhvcF9saW1pdDsKKwlhdHRyLT5haF9hdHRyLmdyaC50cmFmZmljX2NsYXNzICAgICA9IGNtZC5kZXN0LnRyYWZmaWNfY2xhc3M7CisJYXR0ci0+YWhfYXR0ci5kbGlkIAkgICAgCSAgICA9IGNtZC5kZXN0LmRsaWQ7CisJYXR0ci0+YWhfYXR0ci5zbCAgIAkgICAgCSAgICA9IGNtZC5kZXN0LnNsOworCWF0dHItPmFoX2F0dHIuc3JjX3BhdGhfYml0cyAJICAgID0gY21kLmRlc3Quc3JjX3BhdGhfYml0czsKKwlhdHRyLT5haF9hdHRyLnN0YXRpY19yYXRlICAgCSAgICA9IGNtZC5kZXN0LnN0YXRpY19yYXRlOworCWF0dHItPmFoX2F0dHIuYWhfZmxhZ3MgCSAgICAJICAgID0gY21kLmRlc3QuaXNfZ2xvYmFsID8gSUJfQUhfR1JIIDogMDsKKwlhdHRyLT5haF9hdHRyLnBvcnRfbnVtIAkgICAgCSAgICA9IGNtZC5kZXN0LnBvcnRfbnVtOworCisJbWVtY3B5KGF0dHItPmFsdF9haF9hdHRyLmdyaC5kZ2lkLnJhdywgY21kLmFsdF9kZXN0LmRnaWQsIDE2KTsKKwlhdHRyLT5hbHRfYWhfYXR0ci5ncmguZmxvd19sYWJlbCAgICA9IGNtZC5hbHRfZGVzdC5mbG93X2xhYmVsOworCWF0dHItPmFsdF9haF9hdHRyLmdyaC5zZ2lkX2luZGV4ICAgID0gY21kLmFsdF9kZXN0LnNnaWRfaW5kZXg7CisJYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLmhvcF9saW1pdCAgICAgPSBjbWQuYWx0X2Rlc3QuaG9wX2xpbWl0OworCWF0dHItPmFsdF9haF9hdHRyLmdyaC50cmFmZmljX2NsYXNzID0gY21kLmFsdF9kZXN0LnRyYWZmaWNfY2xhc3M7CisJYXR0ci0+YWx0X2FoX2F0dHIuZGxpZCAJICAgIAkgICAgPSBjbWQuYWx0X2Rlc3QuZGxpZDsKKwlhdHRyLT5hbHRfYWhfYXR0ci5zbCAgIAkgICAgCSAgICA9IGNtZC5hbHRfZGVzdC5zbDsKKwlhdHRyLT5hbHRfYWhfYXR0ci5zcmNfcGF0aF9iaXRzICAgICA9IGNtZC5hbHRfZGVzdC5zcmNfcGF0aF9iaXRzOworCWF0dHItPmFsdF9haF9hdHRyLnN0YXRpY19yYXRlICAgICAgID0gY21kLmFsdF9kZXN0LnN0YXRpY19yYXRlOworCWF0dHItPmFsdF9haF9hdHRyLmFoX2ZsYWdzIAkgICAgPSBjbWQuYWx0X2Rlc3QuaXNfZ2xvYmFsID8gSUJfQUhfR1JIIDogMDsKKwlhdHRyLT5hbHRfYWhfYXR0ci5wb3J0X251bSAJICAgID0gY21kLmFsdF9kZXN0LnBvcnRfbnVtOworCisJcmV0ID0gaWJfbW9kaWZ5X3FwKHFwLCBhdHRyLCBjbWQuYXR0cl9tYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGluX2xlbjsKKworb3V0OgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwlrZnJlZShhdHRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2Rlc3Ryb3lfcXAoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfcXAgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICpxcDsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAqdW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKKwkJZ290byBvdXQ7CisKKwl1b2JqID0gcXAtPnVvYmplY3Q7CisKKwlyZXQgPSBpYl9kZXN0cm95X3FwKHFwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWtmcmVlKHVvYmopOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfYXR0YWNoX21jYXN0KHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfYXR0YWNoX21jYXN0IGNtZDsKKwlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICAgICpxcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKKwlpZiAocXAgJiYgcXAtPnVvYmplY3QtPmNvbnRleHQgPT0gZmlsZS0+dWNvbnRleHQpCisJCXJldCA9IGliX2F0dGFjaF9tY2FzdChxcCwgKHVuaW9uIGliX2dpZCAqKSBjbWQuZ2lkLCBjbWQubWxpZCk7CisKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19kZXRhY2hfbWNhc3Qoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19kZXRhY2hfbWNhc3QgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICAgKnFwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOworCWlmIChxcCAmJiBxcC0+dW9iamVjdC0+Y29udGV4dCA9PSBmaWxlLT51Y29udGV4dCkKKwkJcmV0ID0gaWJfZGV0YWNoX21jYXN0KHFwLCAodW5pb24gaWJfZ2lkICopIGNtZC5naWQsIGNtZC5tbGlkKTsKKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJlMDNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzX21haW4uYyAyNzMzIDIwMDUtMDYtMjggMTk6MTQ6MzRaIHJvbGFuZCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ1dmVyYnMuaCIKKworTU9EVUxFX0FVVEhPUigiUm9sYW5kIERyZWllciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbmZpbmlCYW5kIHVzZXJzcGFjZSB2ZXJicyBhY2Nlc3MiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworI2RlZmluZSBJTkZJTklCQU5ERVZFTlRGU19NQUdJQwkweDQ5NDI2NTc2CS8qICJJQmV2IiAqLworCitlbnVtIHsKKwlJQl9VVkVSQlNfTUFKT1IgICAgICAgPSAyMzEsCisJSUJfVVZFUkJTX0JBU0VfTUlOT1IgID0gMTkyLAorCUlCX1VWRVJCU19NQVhfREVWSUNFUyA9IDMyCit9OworCisjZGVmaW5lIElCX1VWRVJCU19CQVNFX0RFVglNS0RFVihJQl9VVkVSQlNfTUFKT1IsIElCX1VWRVJCU19CQVNFX01JTk9SKQorCitERUNMQVJFX01VVEVYKGliX3V2ZXJic19pZHJfbXV0ZXgpOworREVGSU5FX0lEUihpYl91dmVyYnNfcGRfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX21yX2lkcik7CitERUZJTkVfSURSKGliX3V2ZXJic19td19pZHIpOworREVGSU5FX0lEUihpYl91dmVyYnNfYWhfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX2NxX2lkcik7CitERUZJTkVfSURSKGliX3V2ZXJic19xcF9pZHIpOworCitzdGF0aWMgc3BpbmxvY2tfdCBtYXBfbG9jazsKK3N0YXRpYyBERUNMQVJFX0JJVE1BUChkZXZfbWFwLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMpOworCitzdGF0aWMgc3NpemVfdCAoKnV2ZXJic19jbWRfdGFibGVbXSkoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCQkgICAgIGludCBvdXRfbGVuKSA9IHsKKwlbSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEFSQU1TXSAgPSBpYl91dmVyYnNfcXVlcnlfcGFyYW1zLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9HRVRfQ09OVEVYVF0gICA9IGliX3V2ZXJic19nZXRfY29udGV4dCwKKwlbSUJfVVNFUl9WRVJCU19DTURfUVVFUllfREVWSUNFXSAgPSBpYl91dmVyYnNfcXVlcnlfZGV2aWNlLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QT1JUXSAgICA9IGliX3V2ZXJic19xdWVyeV9wb3J0LAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9HSURdICAgICA9IGliX3V2ZXJic19xdWVyeV9naWQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BLRVldICAgID0gaWJfdXZlcmJzX3F1ZXJ5X3BrZXksCisJW0lCX1VTRVJfVkVSQlNfQ01EX0FMTE9DX1BEXSAgICAgID0gaWJfdXZlcmJzX2FsbG9jX3BkLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9ERUFMTE9DX1BEXSAgICA9IGliX3V2ZXJic19kZWFsbG9jX3BkLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfTVJdICAgICAgICA9IGliX3V2ZXJic19yZWdfbXIsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFUkVHX01SXSAgICAgID0gaWJfdXZlcmJzX2RlcmVnX21yLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfQ1FdICAgICA9IGliX3V2ZXJic19jcmVhdGVfY3EsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfQ1FdICAgID0gaWJfdXZlcmJzX2Rlc3Ryb3lfY3EsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9RUF0gICAgID0gaWJfdXZlcmJzX2NyZWF0ZV9xcCwKKwlbSUJfVVNFUl9WRVJCU19DTURfTU9ESUZZX1FQXSAgICAgPSBpYl91dmVyYnNfbW9kaWZ5X3FwLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX1FQXSAgICA9IGliX3V2ZXJic19kZXN0cm95X3FwLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9BVFRBQ0hfTUNBU1RdICA9IGliX3V2ZXJic19hdHRhY2hfbWNhc3QsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFVEFDSF9NQ0FTVF0gID0gaWJfdXZlcmJzX2RldGFjaF9tY2FzdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnV2ZXJic19ldmVudF9tbnQ7CisKK3N0YXRpYyB2b2lkIGliX3V2ZXJic19hZGRfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgaW50IGliX2RlYWxsb2NfdWNvbnRleHQoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0KQoreworCXN0cnVjdCBpYl91b2JqZWN0ICp1b2JqLCAqdG1wOworCisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gMDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJLyogWFhYIEZyZWUgQUhzICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+cXBfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfcXAgKnFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIHVvYmotPmlkKTsKKwkJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3FwX2lkciwgdW9iai0+aWQpOworCQlpYl9kZXN0cm95X3FwKHFwKTsKKwkJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCQlrZnJlZSh1b2JqKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+Y3FfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfY3EgKmNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPmlkKTsKKwkJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX2NxX2lkciwgdW9iai0+aWQpOworCQlpYl9kZXN0cm95X2NxKGNxKTsKKwkJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCQlrZnJlZSh1b2JqKTsKKwl9CisKKwkvKiBYWFggRnJlZSBTUlFzICovCisJLyogWFhYIEZyZWUgTVdzICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+bXJfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfbXIgKm1yID0gaWRyX2ZpbmQoJmliX3V2ZXJic19tcl9pZHIsIHVvYmotPmlkKTsKKwkJc3RydWN0IGliX3VtZW1fb2JqZWN0ICptZW1vYmo7CisKKwkJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX21yX2lkciwgdW9iai0+aWQpOworCQlpYl9kZXJlZ19tcihtcik7CisKKwkJbWVtb2JqID0gY29udGFpbmVyX29mKHVvYmosIHN0cnVjdCBpYl91bWVtX29iamVjdCwgdW9iamVjdCk7CisJCWliX3VtZW1fcmVsZWFzZV9vbl9jbG9zZShtci0+ZGV2aWNlLCAmbWVtb2JqLT51bWVtKTsKKworCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJCWtmcmVlKG1lbW9iaik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVvYmosIHRtcCwgJmNvbnRleHQtPnBkX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGliX3BkICpwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCB1b2JqLT5pZCk7CisJCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKKwkJaWJfZGVhbGxvY19wZChwZCk7CisJCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwkJa2ZyZWUodW9iaik7CisJfQorCisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIGNvbnRleHQtPmRldmljZS0+ZGVhbGxvY191Y29udGV4dChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX3JlbGVhc2VfZmlsZShzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSA9CisJCWNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBpYl91dmVyYnNfZmlsZSwgcmVmKTsKKworCW1vZHVsZV9wdXQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPm93bmVyKTsKKwlrZnJlZShmaWxlKTsKK30KKworc3RhdGljIHNzaXplX3QgaWJfdXZlcmJzX2V2ZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKmV2ZW50OworCWludCBldmVudHN6OworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CisKKwl3aGlsZSAobGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRfbGlzdCkgJiYgZmlsZS0+ZmQgPj0gMCkgeworCQlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworCisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmlsZS0+cG9sbF93YWl0LAorCQkJCQkgICAgICFsaXN0X2VtcHR5KCZmaWxlLT5ldmVudF9saXN0KSB8fAorCQkJCQkgICAgIGZpbGUtPmZkIDwgMCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCXNwaW5fbG9ja19pcnEoJmZpbGUtPmxvY2spOworCX0KKworCWlmIChmaWxlLT5mZCA8IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGZpbGUtPmlzX2FzeW5jKSB7CisJCWV2ZW50ICAgPSBsaXN0X2VudHJ5KGZpbGUtPmV2ZW50X2xpc3QubmV4dCwKKwkJCQkgICAgIHN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnQsIGxpc3QpOworCQlldmVudHN6ID0gc2l6ZW9mIChzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50X2Rlc2MpOworCX0gZWxzZSB7CisJCWV2ZW50ICAgPSBsaXN0X2VudHJ5KGZpbGUtPmV2ZW50X2xpc3QubmV4dCwKKwkJCQkgICAgIHN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudCwgbGlzdCk7CisJCWV2ZW50c3ogPSBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjKTsKKwl9CisKKwlpZiAoZXZlbnRzeiA+IGNvdW50KSB7CisJCXJldCAgID0gLUVJTlZBTDsKKwkJZXZlbnQgPSBOVUxMOworCX0gZWxzZQorCQlsaXN0X2RlbChmaWxlLT5ldmVudF9saXN0Lm5leHQpOworCisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKworCWlmIChldmVudCkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZXZlbnQsIGV2ZW50c3opKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0ID0gZXZlbnRzejsKKwl9CisKKwlrZnJlZShldmVudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGliX3V2ZXJic19ldmVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGludCBwb2xsZmxhZ3MgPSAwOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxwLCAmZmlsZS0+cG9sbF93YWl0LCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPmxvY2spOworCWlmIChmaWxlLT5mZCA8IDApCisJCXBvbGxmbGFncyA9IFBPTExFUlI7CisJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmZpbGUtPmV2ZW50X2xpc3QpKQorCQlwb2xsZmxhZ3MgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+bG9jayk7CisKKwlyZXR1cm4gcG9sbGZsYWdzOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfZXZlbnRfcmVsZWFzZShzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKwlpZiAoZmlsZS0+ZmQgIT0gLTEpIHsKKwkJZmlsZS0+ZmQgPSAtMTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZmaWxlLT5ldmVudF9saXN0KQorCQkJaWYgKGZpbGUtPmlzX2FzeW5jKQorCQkJCWtmcmVlKGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnQsIGxpc3QpKTsKKwkJCWVsc2UKKwkJCQlrZnJlZShsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnQsIGxpc3QpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKK30KKworc3RhdGljIGludCBpYl91dmVyYnNfZXZlbnRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoZmlsZSk7CisJa3JlZl9wdXQoJmZpbGUtPnV2ZXJic19maWxlLT5yZWYsIGliX3V2ZXJic19yZWxlYXNlX2ZpbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHV2ZXJic19ldmVudF9mb3BzID0geworCS8qCisJICogTm8gLm93bmVyIGZpZWxkIHNpbmNlIHdlIGFydGlmaWNpYWxseSBjcmVhdGUgZXZlbnQgZmlsZXMsCisJICogc28gdGhlcmUgaXMgbm8gaW5jcmVtZW50IHRvIHRoZSBtb2R1bGUgcmVmZXJlbmNlIGNvdW50IGluCisJICogdGhlIG9wZW4gcGF0aC4gIEFsbCBldmVudCBmaWxlcyBjb21lIGZyb20gYSB1dmVyYnMgY29tbWFuZAorCSAqIGZpbGUsIHdoaWNoIGFscmVhZHkgdGFrZXMgYSBtb2R1bGUgcmVmZXJlbmNlLCBzbyB0aGlzIGlzIE9LLgorCSAqLworCS5yZWFkIAkgPSBpYl91dmVyYnNfZXZlbnRfcmVhZCwKKwkucG9sbCAgICA9IGliX3V2ZXJic19ldmVudF9wb2xsLAorCS5yZWxlYXNlID0gaWJfdXZlcmJzX2V2ZW50X2Nsb3NlCit9OworCit2b2lkIGliX3V2ZXJic19jb21wX2hhbmRsZXIoc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgICAgICAgKmZpbGUgPSBjcV9jb250ZXh0OworCXN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudCAqZW50cnk7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBmbGFnczsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfQVRPTUlDKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm47CisKKwllbnRyeS0+ZGVzYy5jcV9oYW5kbGUgPSBjcS0+dW9iamVjdC0+dXNlcl9oYW5kbGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmlsZS0+Y29tcF9maWxlWzBdLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmZpbGUtPmNvbXBfZmlsZVswXS5ldmVudF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWxlLT5jb21wX2ZpbGVbMF0ubG9jaywgZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmaWxlLT5jb21wX2ZpbGVbMF0ucG9sbF93YWl0KTsKK30KKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX2FzeW5jX2hhbmRsZXIoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJCSAgICBfX3U2NCBlbGVtZW50LCBfX3U2NCBldmVudCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT5kZXNjLmVsZW1lbnQgICAgPSBlbGVtZW50OworCWVudHJ5LT5kZXNjLmV2ZW50X3R5cGUgPSBldmVudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxlLT5hc3luY19maWxlLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmZpbGUtPmFzeW5jX2ZpbGUuZXZlbnRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlsZS0+YXN5bmNfZmlsZS5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZpbGUtPmFzeW5jX2ZpbGUucG9sbF93YWl0KTsKK30KKwordm9pZCBpYl91dmVyYnNfY3FfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50LCB2b2lkICpjb250ZXh0X3B0cikKK3sKKwlpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihjb250ZXh0X3B0ciwKKwkJCQlldmVudC0+ZWxlbWVudC5jcS0+dW9iamVjdC0+dXNlcl9oYW5kbGUsCisJCQkJZXZlbnQtPmV2ZW50KTsKK30KKwordm9pZCBpYl91dmVyYnNfcXBfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50LCB2b2lkICpjb250ZXh0X3B0cikKK3sKKwlpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihjb250ZXh0X3B0ciwKKwkJCQlldmVudC0+ZWxlbWVudC5xcC0+dW9iamVjdC0+dXNlcl9oYW5kbGUsCisJCQkJZXZlbnQtPmV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisJCQkJICAgIHN0cnVjdCBpYl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0KKwkJY29udGFpbmVyX29mKGhhbmRsZXIsIHN0cnVjdCBpYl91dmVyYnNfZmlsZSwgZXZlbnRfaGFuZGxlcik7CisKKwlpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihmaWxlLCBldmVudC0+ZWxlbWVudC5wb3J0X251bSwgZXZlbnQtPmV2ZW50KTsKK30KKworc3RhdGljIGludCBpYl91dmVyYnNfZXZlbnRfaW5pdChzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUsCisJCQkJc3RydWN0IGliX3V2ZXJic19maWxlICp1dmVyYnNfZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKworCXNwaW5fbG9ja19pbml0KCZmaWxlLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+ZXZlbnRfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZmlsZS0+cG9sbF93YWl0KTsKKwlmaWxlLT51dmVyYnNfZmlsZSA9IHV2ZXJic19maWxlOworCisJZmlsZS0+ZmQgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKGZpbGUtPmZkIDwgMCkKKwkJcmV0dXJuIGZpbGUtPmZkOworCisJZmlscCA9IGdldF9lbXB0eV9maWxwKCk7CisJaWYgKCFmaWxwKSB7CisJCXB1dF91bnVzZWRfZmQoZmlsZS0+ZmQpOworCQlyZXR1cm4gLUVORklMRTsKKwl9CisKKwlmaWxwLT5mX29wIAkgICA9ICZ1dmVyYnNfZXZlbnRfZm9wczsKKwlmaWxwLT5mX3Zmc21udCAJICAgPSBtbnRnZXQodXZlcmJzX2V2ZW50X21udCk7CisJZmlscC0+Zl9kZW50cnkgCSAgID0gZGdldCh1dmVyYnNfZXZlbnRfbW50LT5tbnRfcm9vdCk7CisJZmlscC0+Zl9tYXBwaW5nICAgID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxwLT5mX2ZsYWdzICAgICAgPSBPX1JET05MWTsKKwlmaWxwLT5mX21vZGUgICAgICAgPSBGTU9ERV9SRUFEOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZpbGU7CisKKwlmZF9pbnN0YWxsKGZpbGUtPmZkLCBmaWxwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpYl91dmVyYnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpYl91dmVyYnNfY21kX2hkciBoZHI7CisKKwlpZiAoY291bnQgPCBzaXplb2YgaGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCBidWYsIHNpemVvZiBoZHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChoZHIuaW5fd29yZHMgKiA0ICE9IGNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoZHIuY29tbWFuZCA8IDAgfHwgaGRyLmNvbW1hbmQgPj0gQVJSQVlfU0laRSh1dmVyYnNfY21kX3RhYmxlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWZpbGUtPnVjb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisJICAgIGhkci5jb21tYW5kICE9IElCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BBUkFNUyAmJgorCSAgICBoZHIuY29tbWFuZCAhPSBJQl9VU0VSX1ZFUkJTX0NNRF9HRVRfQ09OVEVYVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdXZlcmJzX2NtZF90YWJsZVtoZHIuY29tbWFuZF0oZmlsZSwgYnVmICsgc2l6ZW9mIGhkciwKKwkJCQkJICAgICBoZHIuaW5fd29yZHMgKiA0LCBoZHIub3V0X3dvcmRzICogNCk7Cit9CisKK3N0YXRpYyBpbnQgaWJfdXZlcmJzX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmICghZmlsZS0+dWNvbnRleHQpCisJCXJldHVybiAtRU5PREVWOworCWVsc2UKKwkJcmV0dXJuIGZpbGUtPmRldmljZS0+aWJfZGV2LT5tbWFwKGZpbGUtPnVjb250ZXh0LCB2bWEpOworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYgPQorCQljb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IGliX3V2ZXJic19kZXZpY2UsIGRldik7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlOworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmliX2Rldi0+b3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZpbGUgPSBrbWFsbG9jKHNpemVvZiAqZmlsZSArCisJCSAgICAgICAoZGV2LT5udW1fY29tcCAtIDEpICogc2l6ZW9mIChzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUpLAorCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbGUtPmRldmljZSA9IGRldjsKKwlrcmVmX2luaXQoJmZpbGUtPnJlZik7CisKKwlmaWxlLT51Y29udGV4dCA9IE5VTEw7CisKKwlyZXQgPSBpYl91dmVyYnNfZXZlbnRfaW5pdCgmZmlsZS0+YXN5bmNfZmlsZSwgZmlsZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmaWxlLT5hc3luY19maWxlLmlzX2FzeW5jID0gMTsKKworCWtyZWZfZ2V0KCZmaWxlLT5yZWYpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2NvbXA7ICsraSkgeworCQlyZXQgPSBpYl91dmVyYnNfZXZlbnRfaW5pdCgmZmlsZS0+Y29tcF9maWxlW2ldLCBmaWxlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2FzeW5jOworCQlrcmVmX2dldCgmZmlsZS0+cmVmKTsKKwkJZmlsZS0+Y29tcF9maWxlW2ldLmlzX2FzeW5jID0gMDsKKwl9CisKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZpbGU7CisKKwlJTklUX0lCX0VWRU5UX0hBTkRMRVIoJmZpbGUtPmV2ZW50X2hhbmRsZXIsIGRldi0+aWJfZGV2LAorCQkJICAgICAgaWJfdXZlcmJzX2V2ZW50X2hhbmRsZXIpOworCWlmIChpYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKCZmaWxlLT5ldmVudF9oYW5kbGVyKSkKKwkJZ290byBlcnJfYXN5bmM7CisKKwlyZXR1cm4gMDsKKworZXJyX2FzeW5jOgorCXdoaWxlIChpLS0pCisJCWliX3V2ZXJic19ldmVudF9yZWxlYXNlKCZmaWxlLT5jb21wX2ZpbGVbaV0pOworCisJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmFzeW5jX2ZpbGUpOworCitlcnI6CisJa3JlZl9wdXQoJmZpbGUtPnJlZiwgaWJfdXZlcmJzX3JlbGVhc2VfZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlpYl91bnJlZ2lzdGVyX2V2ZW50X2hhbmRsZXIoJmZpbGUtPmV2ZW50X2hhbmRsZXIpOworCWliX3V2ZXJic19ldmVudF9yZWxlYXNlKCZmaWxlLT5hc3luY19maWxlKTsKKwlpYl9kZWFsbG9jX3Vjb250ZXh0KGZpbGUtPnVjb250ZXh0KTsKKworCWZvciAoaSA9IDA7IGkgPCBmaWxlLT5kZXZpY2UtPm51bV9jb21wOyArK2kpCisJCWliX3V2ZXJic19ldmVudF9yZWxlYXNlKCZmaWxlLT5jb21wX2ZpbGVbaV0pOworCisJa3JlZl9wdXQoJmZpbGUtPnJlZiwgaWJfdXZlcmJzX3JlbGVhc2VfZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXZlcmJzX2ZvcHMgPSB7CisJLm93bmVyIAkgPSBUSElTX01PRFVMRSwKKwkud3JpdGUgCSA9IGliX3V2ZXJic193cml0ZSwKKwkub3BlbiAJID0gaWJfdXZlcmJzX29wZW4sCisJLnJlbGVhc2UgPSBpYl91dmVyYnNfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHV2ZXJic19tbWFwX2ZvcHMgPSB7CisJLm93bmVyIAkgPSBUSElTX01PRFVMRSwKKwkud3JpdGUgCSA9IGliX3V2ZXJic193cml0ZSwKKwkubW1hcCAgICA9IGliX3V2ZXJic19tbWFwLAorCS5vcGVuIAkgPSBpYl91dmVyYnNfb3BlbiwKKwkucmVsZWFzZSA9IGliX3V2ZXJic19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBpYl9jbGllbnQgdXZlcmJzX2NsaWVudCA9IHsKKwkubmFtZSAgID0gInV2ZXJicyIsCisJLmFkZCAgICA9IGliX3V2ZXJic19hZGRfb25lLAorCS5yZW1vdmUgPSBpYl91dmVyYnNfcmVtb3ZlX29uZQorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19pYmRldihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2ID0KKwkJY29udGFpbmVyX29mKGNsYXNzX2Rldiwgc3RydWN0IGliX3V2ZXJic19kZXZpY2UsIGNsYXNzX2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZGV2LT5pYl9kZXYtPm5hbWUpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGliZGV2LCBTX0lSVUdPLCBzaG93X2liZGV2LCBOVUxMKTsKKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX3JlbGVhc2VfY2xhc3NfZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2ID0KKwkJY29udGFpbmVyX29mKGNsYXNzX2Rldiwgc3RydWN0IGliX3V2ZXJic19kZXZpY2UsIGNsYXNzX2Rldik7CisKKwljZGV2X2RlbCgmZGV2LT5kZXYpOworCWNsZWFyX2JpdChkZXYtPmRldm51bSwgZGV2X21hcCk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyB1dmVyYnNfY2xhc3MgPSB7CisJLm5hbWUgICAgPSAiaW5maW5pYmFuZF92ZXJicyIsCisJLnJlbGVhc2UgPSBpYl91dmVyYnNfcmVsZWFzZV9jbGFzc19kZXYKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWJpX3ZlcnNpb24oc3RydWN0IGNsYXNzICpjbGFzcywgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJQl9VU0VSX1ZFUkJTX0FCSV9WRVJTSU9OKTsKK30KK3N0YXRpYyBDTEFTU19BVFRSKGFiaV92ZXJzaW9uLCBTX0lSVUdPLCBzaG93X2FiaV92ZXJzaW9uLCBOVUxMKTsKKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICp1dmVyYnNfZGV2OworCisJaWYgKCFkZXZpY2UtPmFsbG9jX3Vjb250ZXh0KQorCQlyZXR1cm47CisKKwl1dmVyYnNfZGV2ID0ga21hbGxvYyhzaXplb2YgKnV2ZXJic19kZXYsIEdGUF9LRVJORUwpOworCWlmICghdXZlcmJzX2RldikKKwkJcmV0dXJuOworCisJbWVtc2V0KHV2ZXJic19kZXYsIDAsIHNpemVvZiAqdXZlcmJzX2Rldik7CisKKwlzcGluX2xvY2soJm1hcF9sb2NrKTsKKwl1dmVyYnNfZGV2LT5kZXZudW0gPSBmaW5kX2ZpcnN0X3plcm9fYml0KGRldl9tYXAsIElCX1VWRVJCU19NQVhfREVWSUNFUyk7CisJaWYgKHV2ZXJic19kZXYtPmRldm51bSA+PSBJQl9VVkVSQlNfTUFYX0RFVklDRVMpIHsKKwkJc3Bpbl91bmxvY2soJm1hcF9sb2NrKTsKKwkJZ290byBlcnI7CisJfQorCXNldF9iaXQodXZlcmJzX2Rldi0+ZGV2bnVtLCBkZXZfbWFwKTsKKwlzcGluX3VubG9jaygmbWFwX2xvY2spOworCisJdXZlcmJzX2Rldi0+aWJfZGV2ICAgPSBkZXZpY2U7CisJdXZlcmJzX2Rldi0+bnVtX2NvbXAgPSAxOworCisJaWYgKGRldmljZS0+bW1hcCkKKwkJY2Rldl9pbml0KCZ1dmVyYnNfZGV2LT5kZXYsICZ1dmVyYnNfbW1hcF9mb3BzKTsKKwllbHNlCisJCWNkZXZfaW5pdCgmdXZlcmJzX2Rldi0+ZGV2LCAmdXZlcmJzX2ZvcHMpOworCXV2ZXJic19kZXYtPmRldi5vd25lciA9IFRISVNfTU9EVUxFOworCWtvYmplY3Rfc2V0X25hbWUoJnV2ZXJic19kZXYtPmRldi5rb2JqLCAidXZlcmJzJWQiLCB1dmVyYnNfZGV2LT5kZXZudW0pOworCWlmIChjZGV2X2FkZCgmdXZlcmJzX2Rldi0+ZGV2LCBJQl9VVkVSQlNfQkFTRV9ERVYgKyB1dmVyYnNfZGV2LT5kZXZudW0sIDEpKQorCQlnb3RvIGVycjsKKworCXV2ZXJic19kZXYtPmNsYXNzX2Rldi5jbGFzcyA9ICZ1dmVyYnNfY2xhc3M7CisJdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmRldiAgID0gZGV2aWNlLT5kbWFfZGV2aWNlOworCXV2ZXJic19kZXYtPmNsYXNzX2Rldi5kZXZ0ICA9IHV2ZXJic19kZXYtPmRldi5kZXY7CisJc25wcmludGYodXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgInV2ZXJicyVkIiwgdXZlcmJzX2Rldi0+ZGV2bnVtKTsKKwlpZiAoY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYpKQorCQlnb3RvIGVycl9jZGV2OworCisJaWYgKGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaWJkZXYpKQorCQlnb3RvIGVycl9jbGFzczsKKworCWliX3NldF9jbGllbnRfZGF0YShkZXZpY2UsICZ1dmVyYnNfY2xpZW50LCB1dmVyYnNfZGV2KTsKKworCXJldHVybjsKKworZXJyX2NsYXNzOgorCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYpOworCitlcnJfY2RldjoKKwljZGV2X2RlbCgmdXZlcmJzX2Rldi0+ZGV2KTsKKwljbGVhcl9iaXQodXZlcmJzX2Rldi0+ZGV2bnVtLCBkZXZfbWFwKTsKKworZXJyOgorCWtmcmVlKHV2ZXJic19kZXYpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX3JlbW92ZV9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICp1dmVyYnNfZGV2ID0gaWJfZ2V0X2NsaWVudF9kYXRhKGRldmljZSwgJnV2ZXJic19jbGllbnQpOworCisJaWYgKCF1dmVyYnNfZGV2KQorCQlyZXR1cm47CisKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmdXZlcmJzX2Rldi0+Y2xhc3NfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdXZlcmJzX2V2ZW50X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImluZmluaWJhbmRldmVudDoiLCBOVUxMLAorCQkJICAgICBJTkZJTklCQU5ERVZFTlRGU19NQUdJQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1dmVyYnNfZXZlbnRfZnMgPSB7CisJLyogTm8gb3duZXIgZmllbGQgc28gbW9kdWxlIGNhbiBiZSB1bmxvYWRlZCAqLworCS5uYW1lICAgID0gImluZmluaWJhbmRldmVudGZzIiwKKwkuZ2V0X3NiICA9IHV2ZXJic19ldmVudF9nZXRfc2IsCisJLmtpbGxfc2IgPSBraWxsX2xpdHRlcl9zdXBlcgorfTsKKworc3RhdGljIGludCBfX2luaXQgaWJfdXZlcmJzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJm1hcF9sb2NrKTsKKworCXJldCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oSUJfVVZFUkJTX0JBU0VfREVWLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMsCisJCQkJICAgICAiaW5maW5pYmFuZF92ZXJicyIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2VyX3ZlcmJzOiBjb3VsZG4ndCByZWdpc3RlciBkZXZpY2UgbnVtYmVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gY2xhc3NfcmVnaXN0ZXIoJnV2ZXJic19jbGFzcyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInVzZXJfdmVyYnM6IGNvdWxkbid0IGNyZWF0ZSBjbGFzcyBpbmZpbmliYW5kX3ZlcmJzXG4iKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKworCXJldCA9IGNsYXNzX2NyZWF0ZV9maWxlKCZ1dmVyYnNfY2xhc3MsICZjbGFzc19hdHRyX2FiaV92ZXJzaW9uKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgY3JlYXRlIGFiaV92ZXJzaW9uIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCXJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnV2ZXJic19ldmVudF9mcyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInVzZXJfdmVyYnM6IGNvdWxkbid0IHJlZ2lzdGVyIGluZmluaWJhbmRldmVudGZzXG4iKTsKKwkJZ290byBvdXRfY2xhc3M7CisJfQorCisJdXZlcmJzX2V2ZW50X21udCA9IGtlcm5fbW91bnQoJnV2ZXJic19ldmVudF9mcyk7CisJaWYgKElTX0VSUih1dmVyYnNfZXZlbnRfbW50KSkgeworCQlyZXQgPSBQVFJfRVJSKHV2ZXJic19ldmVudF9tbnQpOworCQlwcmludGsoS0VSTl9FUlIgInVzZXJfdmVyYnM6IGNvdWxkbid0IG1vdW50IGluZmluaWJhbmRldmVudGZzXG4iKTsKKwkJZ290byBvdXRfZnM7CisJfQorCisJcmV0ID0gaWJfcmVnaXN0ZXJfY2xpZW50KCZ1dmVyYnNfY2xpZW50KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgcmVnaXN0ZXIgY2xpZW50XG4iKTsKKwkJZ290byBvdXRfbW50OworCX0KKworCXJldHVybiAwOworCitvdXRfbW50OgorCW1udHB1dCh1dmVyYnNfZXZlbnRfbW50KTsKKworb3V0X2ZzOgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXZlcmJzX2V2ZW50X2ZzKTsKKworb3V0X2NsYXNzOgorCWNsYXNzX3VucmVnaXN0ZXIoJnV2ZXJic19jbGFzcyk7CisKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKElCX1VWRVJCU19CQVNFX0RFViwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpYl91dmVyYnNfY2xlYW51cCh2b2lkKQoreworCWliX3VucmVnaXN0ZXJfY2xpZW50KCZ1dmVyYnNfY2xpZW50KTsKKwltbnRwdXQodXZlcmJzX2V2ZW50X21udCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ1dmVyYnNfZXZlbnRfZnMpOworCWNsYXNzX3VucmVnaXN0ZXIoJnV2ZXJic19jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKElCX1VWRVJCU19CQVNFX0RFViwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKK30KKworbW9kdWxlX2luaXQoaWJfdXZlcmJzX2luaXQpOworbW9kdWxlX2V4aXQoaWJfdXZlcmJzX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21lbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTUwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiAkSWQ6IHV2ZXJic19tZW0uYyAyNzQzIDIwMDUtMDYtMjggMjI6Mjc6NTlaIHJvbGFuZCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInV2ZXJicy5oIgorCitzdHJ1Y3QgaWJfdW1lbV9hY2NvdW50X3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBtbV9zdHJ1Y3QgICptbTsKKwl1bnNpZ25lZCBsb25nICAgICAgZGlmZjsKK307CisKKworc3RhdGljIHZvaWQgX19pYl91bWVtX3JlbGVhc2Uoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqdW1lbSwgaW50IGRpcnR5KQoreworCXN0cnVjdCBpYl91bWVtX2NodW5rICpjaHVuaywgKnRtcDsKKwlpbnQgaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmdW1lbS0+Y2h1bmtfbGlzdCwgbGlzdCkgeworCQlkbWFfdW5tYXBfc2coZGV2LT5kbWFfZGV2aWNlLCBjaHVuay0+cGFnZV9saXN0LAorCQkJICAgICBjaHVuay0+bmVudHMsIERNQV9CSURJUkVDVElPTkFMKTsKKwkJZm9yIChpID0gMDsgaSA8IGNodW5rLT5uZW50czsgKytpKSB7CisJCQlpZiAodW1lbS0+d3JpdGFibGUgJiYgZGlydHkpCisJCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQkJcHV0X3BhZ2UoY2h1bmstPnBhZ2VfbGlzdFtpXS5wYWdlKTsKKwkJfQorCisJCWtmcmVlKGNodW5rKTsKKwl9Cit9CisKK2ludCBpYl91bWVtX2dldChzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl91bWVtICptZW0sCisJCXZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBpbnQgd3JpdGUpCit7CisJc3RydWN0IHBhZ2UgKipwYWdlX2xpc3Q7CisJc3RydWN0IGliX3VtZW1fY2h1bmsgKmNodW5rOworCXVuc2lnbmVkIGxvbmcgbG9ja2VkOworCXVuc2lnbmVkIGxvbmcgbG9ja19saW1pdDsKKwl1bnNpZ25lZCBsb25nIGN1cl9iYXNlOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCWludCByZXQgPSAwOworCWludCBvZmY7CisJaW50IGk7CisKKwlpZiAoIWNhbl9kb19tbG9jaygpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcGFnZV9saXN0ID0gKHN0cnVjdCBwYWdlICoqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtLT51c2VyX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKKwltZW0tPmxlbmd0aCAgICA9IHNpemU7CisJbWVtLT5vZmZzZXQgICAgPSAodW5zaWduZWQgbG9uZykgYWRkciAmIH5QQUdFX01BU0s7CisJbWVtLT5wYWdlX3NpemUgPSBQQUdFX1NJWkU7CisJbWVtLT53cml0YWJsZSAgPSB3cml0ZTsKKworCUlOSVRfTElTVF9IRUFEKCZtZW0tPmNodW5rX2xpc3QpOworCisJbnBhZ2VzID0gUEFHRV9BTElHTihzaXplICsgbWVtLT5vZmZzZXQpID4+IFBBR0VfU0hJRlQ7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJbG9ja2VkICAgICA9IG5wYWdlcyArIGN1cnJlbnQtPm1tLT5sb2NrZWRfdm07CisJbG9ja19saW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTUVNTE9DS10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKKworCWlmICgobG9ja2VkID4gbG9ja19saW1pdCkgJiYgIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwljdXJfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBhZGRyICYgUEFHRV9NQVNLOworCisJd2hpbGUgKG5wYWdlcykgeworCQlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgY3VyX2Jhc2UsCisJCQkJICAgICBtaW5fdChpbnQsIG5wYWdlcywKKwkJCQkJICAgUEFHRV9TSVpFIC8gc2l6ZW9mIChzdHJ1Y3QgcGFnZSAqKSksCisJCQkJICAgICAxLCAhd3JpdGUsIHBhZ2VfbGlzdCwgTlVMTCk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQljdXJfYmFzZSArPSByZXQgKiBQQUdFX1NJWkU7CisJCW5wYWdlcyAgIC09IHJldDsKKworCQlvZmYgPSAwOworCisJCXdoaWxlIChyZXQpIHsKKwkJCWNodW5rID0ga21hbGxvYyhzaXplb2YgKmNodW5rICsgc2l6ZW9mIChzdHJ1Y3Qgc2NhdHRlcmxpc3QpICoKKwkJCQkJbWluX3QoaW50LCByZXQsIElCX1VNRU1fTUFYX1BBR0VfQ0hVTkspLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghY2h1bmspIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQljaHVuay0+bmVudHMgPSBtaW5fdChpbnQsIHJldCwgSUJfVU1FTV9NQVhfUEFHRV9DSFVOSyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyArK2kpIHsKKwkJCQljaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UgICA9IHBhZ2VfbGlzdFtpICsgb2ZmXTsKKwkJCQljaHVuay0+cGFnZV9saXN0W2ldLm9mZnNldCA9IDA7CisJCQkJY2h1bmstPnBhZ2VfbGlzdFtpXS5sZW5ndGggPSBQQUdFX1NJWkU7CisJCQl9CisKKwkJCWNodW5rLT5ubWFwID0gZG1hX21hcF9zZyhkZXYtPmRtYV9kZXZpY2UsCisJCQkJCQkgJmNodW5rLT5wYWdlX2xpc3RbMF0sCisJCQkJCQkgY2h1bmstPm5lbnRzLAorCQkJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwkJCWlmIChjaHVuay0+bm1hcCA8PSAwKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IGNodW5rLT5uZW50czsgKytpKQorCQkJCQlwdXRfcGFnZShjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQkJCWtmcmVlKGNodW5rKTsKKworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCAtPSBjaHVuay0+bmVudHM7CisJCQlvZmYgKz0gY2h1bmstPm5lbnRzOworCQkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZtZW0tPmNodW5rX2xpc3QpOworCQl9CisKKwkJcmV0ID0gMDsKKwl9CisKK291dDoKKwlpZiAocmV0IDwgMCkKKwkJX19pYl91bWVtX3JlbGVhc2UoZGV2LCBtZW0sIDApOworCWVsc2UKKwkJY3VycmVudC0+bW0tPmxvY2tlZF92bSA9IGxvY2tlZDsKKworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZV9saXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pCit7CisJX19pYl91bWVtX3JlbGVhc2UoZGV2LCB1bWVtLCAxKTsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJY3VycmVudC0+bW0tPmxvY2tlZF92bSAtPQorCQlQQUdFX0FMSUdOKHVtZW0tPmxlbmd0aCArIHVtZW0tPm9mZnNldCkgPj4gUEFHRV9TSElGVDsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKK30KKworc3RhdGljIHZvaWQgaWJfdW1lbV9hY2NvdW50KHZvaWQgKndvcmtfcHRyKQoreworCXN0cnVjdCBpYl91bWVtX2FjY291bnRfd29yayAqd29yayA9IHdvcmtfcHRyOworCisJZG93bl93cml0ZSgmd29yay0+bW0tPm1tYXBfc2VtKTsKKwl3b3JrLT5tbS0+bG9ja2VkX3ZtIC09IHdvcmstPmRpZmY7CisJdXBfd3JpdGUoJndvcmstPm1tLT5tbWFwX3NlbSk7CisJbW1wdXQod29yay0+bW0pOworCWtmcmVlKHdvcmspOworfQorCit2b2lkIGliX3VtZW1fcmVsZWFzZV9vbl9jbG9zZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl91bWVtICp1bWVtKQoreworCXN0cnVjdCBpYl91bWVtX2FjY291bnRfd29yayAqd29yazsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKworCV9faWJfdW1lbV9yZWxlYXNlKGRldiwgdW1lbSwgMSk7CisKKwltbSA9IGdldF90YXNrX21tKGN1cnJlbnQpOworCWlmICghbW0pCisJCXJldHVybjsKKworCS8qCisJICogV2UgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBtbSdzIG1tYXBfc2VtIGFscmVhZHkgaGVsZC4gIFRoaXMKKwkgKiBjYW4gaGFwcGVuIHdoZW4gYSB1c2Vyc3BhY2UgbXVubWFwKCkgaXMgdGhlIGNhbGwgdGhhdCBkcm9wcworCSAqIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBvdXIgZmlsZSBhbmQgY2FsbHMgb3VyIHJlbGVhc2UKKwkgKiBtZXRob2QuICBJZiB0aGVyZSBhcmUgbWVtb3J5IHJlZ2lvbnMgdG8gZGVzdHJveSwgd2UnbGwgZW5kCisJICogdXAgaGVyZSBhbmQgbm90IGJlIGFibGUgdG8gdGFrZSB0aGUgbW1hcF9zZW0uICBUaGVyZWZvcmUgd2UKKwkgKiBkZWZlciB0aGUgdm1fbG9ja2VkIGFjY291bnRpbmcgdG8gdGhlIHN5c3RlbSB3b3JrcXVldWUuCisJICovCisKKwl3b3JrID0ga21hbGxvYyhzaXplb2YgKndvcmssIEdGUF9LRVJORUwpOworCWlmICghd29yaykKKwkJcmV0dXJuOworCisJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBpYl91bWVtX2FjY291bnQsIHdvcmspOworCXdvcmstPm1tICAgPSBtbTsKKwl3b3JrLT5kaWZmID0gUEFHRV9BTElHTih1bWVtLT5sZW5ndGggKyB1bWVtLT5vZmZzZXQpID4+IFBBR0VfU0hJRlQ7CisKKwlzY2hlZHVsZV93b3JrKCZ3b3JrLT53b3JrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCmluZGV4IDdjMDhlZDAuLjI1MTZmOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVm9sdGFpcmUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00NywxMCArNDgsMTEgQEAKIHsKIAlzdHJ1Y3QgaWJfcGQgKnBkOwogCi0JcGQgPSBkZXZpY2UtPmFsbG9jX3BkKGRldmljZSk7CisJcGQgPSBkZXZpY2UtPmFsbG9jX3BkKGRldmljZSwgTlVMTCwgTlVMTCk7CiAKIAlpZiAoIUlTX0VSUihwZCkpIHsKLQkJcGQtPmRldmljZSA9IGRldmljZTsKKwkJcGQtPmRldmljZSAgPSBkZXZpY2U7CisJCXBkLT51b2JqZWN0ID0gTlVMTDsKIAkJYXRvbWljX3NldCgmcGQtPnVzZWNudCwgMCk7CiAJfQogCkBAIC03Niw4ICs3OCw5IEBACiAJYWggPSBwZC0+ZGV2aWNlLT5jcmVhdGVfYWgocGQsIGFoX2F0dHIpOwogCiAJaWYgKCFJU19FUlIoYWgpKSB7Ci0JCWFoLT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQlhaC0+cGQgICAgID0gcGQ7CisJCWFoLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJYWgtPnBkICAgICAgPSBwZDsKKwkJYWgtPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAl9CiAKQEAgLTEyMiw3ICsxMjUsNyBAQAogewogCXN0cnVjdCBpYl9xcCAqcXA7CiAKLQlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgcXBfaW5pdF9hdHRyKTsKKwlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgcXBfaW5pdF9hdHRyLCBOVUxMKTsKIAogCWlmICghSVNfRVJSKHFwKSkgewogCQlxcC0+ZGV2aWNlICAgICAJICA9IHBkLT5kZXZpY2U7CkBAIC0xMzAsNiArMTMzLDcgQEAKIAkJcXAtPnNlbmRfY3EgICAgCSAgPSBxcF9pbml0X2F0dHItPnNlbmRfY3E7CiAJCXFwLT5yZWN2X2NxICAgIAkgID0gcXBfaW5pdF9hdHRyLT5yZWN2X2NxOwogCQlxcC0+c3JxCSAgICAgICAJICA9IHFwX2luaXRfYXR0ci0+c3JxOworCQlxcC0+dW9iamVjdCAgICAgICA9IE5VTEw7CiAJCXFwLT5ldmVudF9oYW5kbGVyID0gcXBfaW5pdF9hdHRyLT5ldmVudF9oYW5kbGVyOwogCQlxcC0+cXBfY29udGV4dCAgICA9IHFwX2luaXRfYXR0ci0+cXBfY29udGV4dDsKIAkJcXAtPnFwX3R5cGUJICA9IHFwX2luaXRfYXR0ci0+cXBfdHlwZTsKQEAgLTE5NywxMCArMjAxLDExIEBACiB7CiAJc3RydWN0IGliX2NxICpjcTsKIAotCWNxID0gZGV2aWNlLT5jcmVhdGVfY3EoZGV2aWNlLCBjcWUpOworCWNxID0gZGV2aWNlLT5jcmVhdGVfY3EoZGV2aWNlLCBjcWUsIE5VTEwsIE5VTEwpOwogCiAJaWYgKCFJU19FUlIoY3EpKSB7CiAJCWNxLT5kZXZpY2UgICAgICAgID0gZGV2aWNlOworCQljcS0+dW9iamVjdCAgICAgICA9IE5VTEw7CiAJCWNxLT5jb21wX2hhbmRsZXIgID0gY29tcF9oYW5kbGVyOwogCQljcS0+ZXZlbnRfaGFuZGxlciA9IGV2ZW50X2hhbmRsZXI7CiAJCWNxLT5jcV9jb250ZXh0ICAgID0gY3FfY29udGV4dDsKQEAgLTI0NSw4ICsyNTAsOSBAQAogCW1yID0gcGQtPmRldmljZS0+Z2V0X2RtYV9tcihwZCwgbXJfYWNjZXNzX2ZsYWdzKTsKIAogCWlmICghSVNfRVJSKG1yKSkgewotCQltci0+ZGV2aWNlID0gcGQtPmRldmljZTsKLQkJbXItPnBkICAgICA9IHBkOworCQltci0+ZGV2aWNlICA9IHBkLT5kZXZpY2U7CisJCW1yLT5wZCAgICAgID0gcGQ7CisJCW1yLT51b2JqZWN0ID0gTlVMTDsKIAkJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CiAJCWF0b21pY19zZXQoJm1yLT51c2VjbnQsIDApOwogCX0KQEAgLTI2Nyw4ICsyNzMsOSBAQAogCQkJCSAgICAgbXJfYWNjZXNzX2ZsYWdzLCBpb3ZhX3N0YXJ0KTsKIAogCWlmICghSVNfRVJSKG1yKSkgewotCQltci0+ZGV2aWNlID0gcGQtPmRldmljZTsKLQkJbXItPnBkICAgICA9IHBkOworCQltci0+ZGV2aWNlICA9IHBkLT5kZXZpY2U7CisJCW1yLT5wZCAgICAgID0gcGQ7CisJCW1yLT51b2JqZWN0ID0gTlVMTDsKIAkJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CiAJCWF0b21pY19zZXQoJm1yLT51c2VjbnQsIDApOwogCX0KQEAgLTM0NCw4ICszNTEsOSBAQAogCiAJbXcgPSBwZC0+ZGV2aWNlLT5hbGxvY19tdyhwZCk7CiAJaWYgKCFJU19FUlIobXcpKSB7Ci0JCW13LT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQltdy0+cGQgICAgID0gcGQ7CisJCW13LT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJbXctPnBkICAgICAgPSBwZDsKKwkJbXctPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9hdi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKaW5kZXggMDg1YmFmMy4uZDU4ZGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCmluZGV4IGNkOWVkOTUuLjE1NTdhNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKQEAgLTQzMSw2ICs0MzEsMzYgQEAKIAkJCQkgICAgICB0aW1lb3V0LCBzdGF0dXMpOwogfQogCitpbnQgbXRoY2FfY21kX2luaXQoc3RydWN0IG10aGNhX2RldiAqZGV2KQoreworCXNlbWFfaW5pdCgmZGV2LT5jbWQuaGNyX3NlbSwgMSk7CisJc2VtYV9pbml0KCZkZXYtPmNtZC5wb2xsX3NlbSwgMSk7CisJZGV2LT5jbWQudXNlX2V2ZW50cyA9IDA7CisKKwlkZXYtPmhjciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKyBNVEhDQV9IQ1JfQkFTRSwKKwkJCSAgIE1USENBX0hDUl9TSVpFKTsKKwlpZiAoIWRldi0+aGNyKSB7CisJCW10aGNhX2VycihkZXYsICJDb3VsZG4ndCBtYXAgY29tbWFuZCByZWdpc3Rlci4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2LT5jbWQucG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgibXRoY2FfY21kIiwgZGV2LT5wZGV2LAorCQkJCQlNVEhDQV9NQUlMQk9YX1NJWkUsCisJCQkJCU1USENBX01BSUxCT1hfU0laRSwgMCk7CisJaWYgKCFkZXYtPmNtZC5wb29sKSB7CisJCWlvdW5tYXAoZGV2LT5oY3IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtdGhjYV9jbWRfY2xlYW51cChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCit7CisJcGNpX3Bvb2xfZGVzdHJveShkZXYtPmNtZC5wb29sKTsKKwlpb3VubWFwKGRldi0+aGNyKTsKK30KKwogLyoKICAqIFN3aXRjaCB0byB1c2luZyBldmVudHMgdG8gaXNzdWUgRlcgY29tbWFuZHMgKHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKICAqIGV2ZW50IHF1ZXVlIHRvIGNvbW1hbmQgZXZlbnRzIGhhcyBiZWVuIGluaXRpYWxpemVkKS4KQEAgLTQ4OSw2ICs1MTksMzMgQEAKIAl1cCgmZGV2LT5jbWQucG9sbF9zZW0pOwogfQogCitzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbXRoY2FfYWxsb2NfbWFpbGJveChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkJCSAgdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OworCisJbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mICptYWlsYm94LCBnZnBfbWFzayk7CisJaWYgKCFtYWlsYm94KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW1haWxib3gtPmJ1ZiA9IHBjaV9wb29sX2FsbG9jKGRldi0+Y21kLnBvb2wsIGdmcF9tYXNrLCAmbWFpbGJveC0+ZG1hKTsKKwlpZiAoIW1haWxib3gtPmJ1ZikgeworCQlrZnJlZShtYWlsYm94KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIG1haWxib3g7Cit9CisKK3ZvaWQgbXRoY2FfZnJlZV9tYWlsYm94KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gpCit7CisJaWYgKCFtYWlsYm94KQorCQlyZXR1cm47CisKKwlwY2lfcG9vbF9mcmVlKGRldi0+Y21kLnBvb2wsIG1haWxib3gtPmJ1ZiwgbWFpbGJveC0+ZG1hKTsKKwlrZnJlZShtYWlsYm94KTsKK30KKwogaW50IG10aGNhX1NZU19FTihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCiB7CiAJdTY0IG91dDsKQEAgLTUxMywyMCArNTcwLDIwIEBACiBzdGF0aWMgaW50IG10aGNhX21hcF9jbWQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MTYgb3AsIHN0cnVjdCBtdGhjYV9pY20gKmljbSwKIAkJCSB1NjQgdmlydCwgdTggKnN0YXR1cykKIHsKLQl1MzIgKmluYm94OwotCWRtYV9hZGRyX3QgaW5kbWE7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJc3RydWN0IG10aGNhX2ljbV9pdGVyIGl0ZXI7CisJX19iZTY0ICpwYWdlczsKIAlpbnQgbGc7CiAJaW50IG5lbnQgPSAwOwogCWludCBpOwogCWludCBlcnIgPSAwOwogCWludCB0cyA9IDAsIHRjID0gMDsKIAotCWluYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsICZpbmRtYSk7Ci0JaWYgKCFpbmJveCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoaW5ib3gsIDAsIFBBR0VfU0laRSk7CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwltZW1zZXQobWFpbGJveC0+YnVmLCAwLCBNVEhDQV9NQUlMQk9YX1NJWkUpOworCXBhZ2VzID0gbWFpbGJveC0+YnVmOwogCiAJZm9yIChtdGhjYV9pY21fZmlyc3QoaWNtLCAmaXRlcik7CiAJICAgICAhbXRoY2FfaWNtX2xhc3QoJml0ZXIpOwpAQCAtNTQ2LDE5ICs2MDMsMTcgQEAKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgbXRoY2FfaWNtX3NpemUoJml0ZXIpIC8gKDEgPDwgbGcpOyArK2ksICsrbmVudCkgewogCQkJaWYgKHZpcnQgIT0gLTEpIHsKLQkJCQkqKChfX2JlNjQgKikgKGluYm94ICsgbmVudCAqIDQpKSA9Ci0JCQkJCWNwdV90b19iZTY0KHZpcnQpOworCQkJCXBhZ2VzW25lbnQgKiAyXSA9IGNwdV90b19iZTY0KHZpcnQpOwogCQkJCXZpcnQgKz0gMSA8PCBsZzsKIAkJCX0KIAotCQkJKigoX19iZTY0ICopIChpbmJveCArIG5lbnQgKiA0ICsgMikpID0KLQkJCQljcHVfdG9fYmU2NCgobXRoY2FfaWNtX2FkZHIoJml0ZXIpICsKLQkJCQkJICAgICAoaSA8PCBsZykpIHwgKGxnIC0gMTIpKTsKKwkJCXBhZ2VzW25lbnQgKiAyICsgMV0gPSBjcHVfdG9fYmU2NCgobXRoY2FfaWNtX2FkZHIoJml0ZXIpICsKKwkJCQkJCQkgICAoaSA8PCBsZykpIHwgKGxnIC0gMTIpKTsKIAkJCXRzICs9IDEgPDwgKGxnIC0gMTApOwogCQkJKyt0YzsKIAotCQkJaWYgKG5lbnQgPT0gUEFHRV9TSVpFIC8gMTYpIHsKLQkJCQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgbmVudCwgMCwgb3AsCisJCQlpZiAobmVudCA9PSBNVEhDQV9NQUlMQk9YX1NJWkUgLyAxNikgeworCQkJCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgbmVudCwgMCwgb3AsCiAJCQkJCQlDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwogCQkJCWlmIChlcnIgfHwgKnN0YXR1cykKIAkJCQkJZ290byBvdXQ7CkBAIC01NjgsNyArNjIzLDcgQEAKIAl9CiAKIAlpZiAobmVudCkKLQkJZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsIG5lbnQsIDAsIG9wLAorCQllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIG5lbnQsIDAsIG9wLAogCQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CiAKIAlzd2l0Y2ggKG9wKSB7CkBAIC01ODUsNyArNjQwLDcgQEAKIAl9CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLCBpbmJveCwgaW5kbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTYwNiw4ICs2NjEsOCBAQAogCiBpbnQgbXRoY2FfUVVFUllfRlcoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQogeworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXUzMiAqb3V0Ym94OwotCWRtYV9hZGRyX3Qgb3V0ZG1hOwogCWludCBlcnIgPSAwOwogCXU4IGxnOwogCkBAIC02MjUsMTIgKzY4MCwxMiBAQAogI2RlZmluZSBRVUVSWV9GV19FUV9BUk1fQkFTRV9PRkZTRVQgICAgMHg0MAogI2RlZmluZSBRVUVSWV9GV19FUV9TRVRfQ0lfQkFTRV9PRkZTRVQgMHg0OAogCi0Jb3V0Ym94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9GV19PVVRfU0laRSwgJm91dGRtYSk7Ci0JaWYgKCFvdXRib3gpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJb3V0Ym94ID0gbWFpbGJveC0+YnVmOwogCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG91dGRtYSwgMCwgMCwgQ01EX1FVRVJZX0ZXLAorCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9GVywKIAkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogCiAJaWYgKGVycikKQEAgLTY4MSwxNSArNzM2LDE1IEBACiAJfQogCiBvdXQ6Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFFVRVJZX0ZXX09VVF9TSVpFLCBvdXRib3gsIG91dGRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG10aGNhX0VOQUJMRV9MQU0oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQogeworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXU4IGluZm87CiAJdTMyICpvdXRib3g7Ci0JZG1hX2FkZHJfdCBvdXRkbWE7CiAJaW50IGVyciA9IDA7CiAKICNkZWZpbmUgRU5BQkxFX0xBTV9PVVRfU0laRSAgICAgICAgIDB4MTAwCkBAIC03MDAsMTEgKzc1NSwxMiBAQAogI2RlZmluZSBFTkFCTEVfTEFNX0lORk9fSElEREVOX0ZMQUcgKDEgPDwgNCkKICNkZWZpbmUgRU5BQkxFX0xBTV9JTkZPX0VDQ19NQVNLICAgIDB4MwogCi0Jb3V0Ym94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBFTkFCTEVfTEFNX09VVF9TSVpFLCAmb3V0ZG1hKTsKLQlpZiAoIW91dGJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCAwLCAwLCBDTURfRU5BQkxFX0xBTSwKKwllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLCBDTURfRU5BQkxFX0xBTSwKIAkJCSAgICBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOwogCiAJaWYgKGVycikKQEAgLTczMyw3ICs3ODksNyBAQAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRldi0+ZGRyX2VuZCk7CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgRU5BQkxFX0xBTV9PVVRfU0laRSwgb3V0Ym94LCBvdXRkbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTc0NCw5ICs4MDAsOSBAQAogCiBpbnQgbXRoY2FfUVVFUllfRERSKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKIHsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1OCBpbmZvOwogCXUzMiAqb3V0Ym94OwotCWRtYV9hZGRyX3Qgb3V0ZG1hOwogCWludCBlcnIgPSAwOwogCiAjZGVmaW5lIFFVRVJZX0REUl9PVVRfU0laRSAgICAgICAgIDB4MTAwCkBAIC03NTcsMTEgKzgxMywxMiBAQAogI2RlZmluZSBRVUVSWV9ERFJfSU5GT19ISURERU5fRkxBRyAoMSA8PCA0KQogI2RlZmluZSBRVUVSWV9ERFJfSU5GT19FQ0NfTUFTSyAgICAweDMKIAotCW91dGJveCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfRERSX09VVF9TSVpFLCAmb3V0ZG1hKTsKLQlpZiAoIW91dGJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCAwLCAwLCBDTURfUVVFUllfRERSLAorCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9ERFIsCiAJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIAogCWlmIChlcnIpCkBAIC03ODcsMTUgKzg0NCwxNSBAQAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRldi0+ZGRyX2VuZCk7CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfRERSX09VVF9TSVpFLCBvdXRib3gsIG91dGRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG10aGNhX1FVRVJZX0RFVl9MSU0oc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkJc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICpvdXRib3g7Ci0JZG1hX2FkZHJfdCBvdXRkbWE7CiAJdTggZmllbGQ7CiAJdTE2IHNpemU7CiAJaW50IGVycjsKQEAgLTg2MCwxMSArOTE3LDEyIEBACiAjZGVmaW5lIFFVRVJZX0RFVl9MSU1fTEFNUl9PRkZTRVQgICAgICAgICAgIDB4OWYKICNkZWZpbmUgUVVFUllfREVWX0xJTV9NQVhfSUNNX1NaX09GRlNFVCAgICAgMHhhMAogCi0Jb3V0Ym94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9ERVZfTElNX09VVF9TSVpFLCAmb3V0ZG1hKTsKLQlpZiAoIW91dGJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCAwLCAwLCBDTURfUVVFUllfREVWX0xJTSwKKwllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLCBDTURfUVVFUllfREVWX0xJTSwKIAkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogCiAJaWYgKGVycikKQEAgLTEwMjAsMTUgKzEwNzgsMTUgQEAKIAl9CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfREVWX0xJTV9PVVRfU0laRSwgb3V0Ym94LCBvdXRkbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKIGludCBtdGhjYV9RVUVSWV9BREFQVEVSKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCXN0cnVjdCBtdGhjYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqc3RhdHVzKQogeworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXUzMiAqb3V0Ym94OwotCWRtYV9hZGRyX3Qgb3V0ZG1hOwogCWludCBlcnI7CiAKICNkZWZpbmUgUVVFUllfQURBUFRFUl9PVVRfU0laRSAgICAgICAgICAgICAweDEwMApAQCAtMTAzNywyMyArMTA5NSwyNCBAQAogI2RlZmluZSBRVUVSWV9BREFQVEVSX1JFVklTSU9OX0lEX09GRlNFVCAgIDB4MDgKICNkZWZpbmUgUVVFUllfQURBUFRFUl9JTlRBX1BJTl9PRkZTRVQgICAgICAweDEwCiAKLQlvdXRib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFFVRVJZX0FEQVBURVJfT1VUX1NJWkUsICZvdXRkbWEpOwotCWlmICghb3V0Ym94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIDAsIDAsIENNRF9RVUVSWV9BREFQVEVSLAorCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9BREFQVEVSLAogCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCU1USENBX0dFVChhZGFwdGVyLT52ZW5kb3JfaWQsIG91dGJveCwgUVVFUllfQURBUFRFUl9WRU5ET1JfSURfT0ZGU0VUKTsKLQlNVEhDQV9HRVQoYWRhcHRlci0+ZGV2aWNlX2lkLCBvdXRib3gsIFFVRVJZX0FEQVBURVJfREVWSUNFX0lEX09GRlNFVCk7CisJTVRIQ0FfR0VUKGFkYXB0ZXItPnZlbmRvcl9pZCwgb3V0Ym94LCAgIFFVRVJZX0FEQVBURVJfVkVORE9SX0lEX09GRlNFVCk7CisJTVRIQ0FfR0VUKGFkYXB0ZXItPmRldmljZV9pZCwgb3V0Ym94LCAgIFFVRVJZX0FEQVBURVJfREVWSUNFX0lEX09GRlNFVCk7CiAJTVRIQ0FfR0VUKGFkYXB0ZXItPnJldmlzaW9uX2lkLCBvdXRib3gsIFFVRVJZX0FEQVBURVJfUkVWSVNJT05fSURfT0ZGU0VUKTsKLQlNVEhDQV9HRVQoYWRhcHRlci0+aW50YV9waW4sIG91dGJveCwgUVVFUllfQURBUFRFUl9JTlRBX1BJTl9PRkZTRVQpOworCU1USENBX0dFVChhZGFwdGVyLT5pbnRhX3Bpbiwgb3V0Ym94LCAgICBRVUVSWV9BREFQVEVSX0lOVEFfUElOX09GRlNFVCk7CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfREVWX0xJTV9PVVRfU0laRSwgb3V0Ym94LCBvdXRkbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwNjEsOCArMTEyMCw4IEBACiAJCSAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqcGFyYW0sCiAJCSAgIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICppbmJveDsKLQlkbWFfYWRkcl90IGluZG1hOwogCWludCBlcnI7CiAKICNkZWZpbmUgSU5JVF9IQ0FfSU5fU0laRSAgICAgICAgICAgICAJIDB4MjAwCkBAIC0xMTAyLDkgKzExNjEsMTAgQEAKICNkZWZpbmUgIElOSVRfSENBX1VBUl9TQ0FUQ0hfQkFTRV9PRkZTRVQgKElOSVRfSENBX1VBUl9PRkZTRVQgKyAweDEwKQogI2RlZmluZSAgSU5JVF9IQ0FfVUFSX0NUWF9CQVNFX09GRlNFVCAgICAoSU5JVF9IQ0FfVUFSX09GRlNFVCArIDB4MTgpCiAKLQlpbmJveCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgSU5JVF9IQ0FfSU5fU0laRSwgJmluZG1hKTsKLQlpZiAoIWluYm94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCWluYm94ID0gbWFpbGJveC0+YnVmOwogCiAJbWVtc2V0KGluYm94LCAwLCBJTklUX0hDQV9JTl9TSVpFKTsKIApAQCAtMTE2NywxMCArMTIyNyw5IEBACiAJCU1USENBX1BVVChpbmJveCwgcGFyYW0tPnVhcmNfYmFzZSwgICBJTklUX0hDQV9VQVJfQ1RYX0JBU0VfT0ZGU0VUKTsKIAl9CiAKLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgMCwgMCwgQ01EX0lOSVRfSENBLAotCQkJSFosIHN0YXR1cyk7CisJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCAwLCAwLCBDTURfSU5JVF9IQ0EsIEhaLCBzdGF0dXMpOwogCi0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIElOSVRfSENBX0lOX1NJWkUsIGluYm94LCBpbmRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTE3OCw4ICsxMjM3LDggQEAKIAkJICBzdHJ1Y3QgbXRoY2FfaW5pdF9pYl9wYXJhbSAqcGFyYW0sCiAJCSAgaW50IHBvcnQsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICppbmJveDsKLQlkbWFfYWRkcl90IGluZG1hOwogCWludCBlcnI7CiAJdTMyIGZsYWdzOwogCkBAIC0xMTk5LDkgKzEyNTgsMTAgQEAKICNkZWZpbmUgSU5JVF9JQl9OT0RFX0dVSURfT0ZGU0VUIDB4MTgKICNkZWZpbmUgSU5JVF9JQl9TSV9HVUlEX09GRlNFVCAgIDB4MjAKIAotCWluYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBJTklUX0lCX0lOX1NJWkUsICZpbmRtYSk7Ci0JaWYgKCFpbmJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlpbmJveCA9IG1haWxib3gtPmJ1ZjsKIAogCW1lbXNldChpbmJveCwgMCwgSU5JVF9JQl9JTl9TSVpFKTsKIApAQCAtMTIyMSwxMCArMTI4MSwxMCBAQAogCU1USENBX1BVVChpbmJveCwgcGFyYW0tPm5vZGVfZ3VpZCwgSU5JVF9JQl9OT0RFX0dVSURfT0ZGU0VUKTsKIAlNVEhDQV9QVVQoaW5ib3gsIHBhcmFtLT5zaV9ndWlkLCAgIElOSVRfSUJfU0lfR1VJRF9PRkZTRVQpOwogCi0JZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsIHBvcnQsIDAsIENNRF9JTklUX0lCLAorCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgcG9ydCwgMCwgQ01EX0lOSVRfSUIsCiAJCQlDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogCi0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIElOSVRfSENBX0lOX1NJWkUsIGluYm94LCBpbmRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTI0MSw4ICsxMzAxLDggQEAKIGludCBtdGhjYV9TRVRfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2Ffc2V0X2liX3BhcmFtICpwYXJhbSwKIAkJIGludCBwb3J0LCB1OCAqc3RhdHVzKQogeworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXUzMiAqaW5ib3g7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKIAlpbnQgZXJyOwogCXUzMiBmbGFncyA9IDA7CiAKQEAgLTEyNTMsOSArMTMxMywxMCBAQAogI2RlZmluZSBTRVRfSUJfQ0FQX01BU0tfT0ZGU0VUIDB4MDQKICNkZWZpbmUgU0VUX0lCX1NJX0dVSURfT0ZGU0VUICAweDA4CiAKLQlpbmJveCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgU0VUX0lCX0lOX1NJWkUsICZpbmRtYSk7Ci0JaWYgKCFpbmJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlpbmJveCA9IG1haWxib3gtPmJ1ZjsKIAogCW1lbXNldChpbmJveCwgMCwgU0VUX0lCX0lOX1NJWkUpOwogCkBAIC0xMjY2LDEwICsxMzI3LDEwIEBACiAJTVRIQ0FfUFVUKGluYm94LCBwYXJhbS0+Y2FwX21hc2ssIFNFVF9JQl9DQVBfTUFTS19PRkZTRVQpOwogCU1USENBX1BVVChpbmJveCwgcGFyYW0tPnNpX2d1aWQsICBTRVRfSUJfU0lfR1VJRF9PRkZTRVQpOwogCi0JZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsIHBvcnQsIDAsIENNRF9TRVRfSUIsCisJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLCBDTURfU0VUX0lCLAogCQkJQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBJTklUX0hDQV9JTl9TSVpFLCBpbmJveCwgaW5kbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEyODAsMjAgKzEzNDEsMjIgQEAKIAogaW50IG10aGNhX01BUF9JQ01fcGFnZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBkbWFfYWRkciwgdTY0IHZpcnQsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTY0ICppbmJveDsKLQlkbWFfYWRkcl90IGluZG1hOwogCWludCBlcnI7CiAKLQlpbmJveCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgMTYsICZpbmRtYSk7Ci0JaWYgKCFpbmJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlpbmJveCA9IG1haWxib3gtPmJ1ZjsKIAogCWluYm94WzBdID0gY3B1X3RvX2JlNjQodmlydCk7CiAJaW5ib3hbMV0gPSBjcHVfdG9fYmU2NChkbWFfYWRkcik7CiAKLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgMSwgMCwgQ01EX01BUF9JQ00sIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCAxLCAwLCBDTURfTUFQX0lDTSwKKwkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgMTYsIGluYm94LCBpbmRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKIAlpZiAoIWVycikKIAkJbXRoY2FfZGJnKGRldiwgIk1hcHBlZCBwYWdlIGF0ICVsbHggdG8gJWxseCBmb3IgSUNNLlxuIiwKQEAgLTEzMzgsNjkgKzE0MDEsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG10aGNhX1NXMkhXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKm1wdF9lbnRyeSwKK2ludCBtdGhjYV9TVzJIV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKLQlpbnQgZXJyOwotCi0JaW5kbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIG1wdF9lbnRyeSwKLQkJCSAgICAgICBNVEhDQV9NUFRfRU5UUllfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGluZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgbXB0X2luZGV4LCAwLCBDTURfU1cySFdfTVBULAotCQkJQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwKLQkJCSBNVEhDQV9NUFRfRU5UUllfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBtcHRfaW5kZXgsIDAsIENNRF9TVzJIV19NUFQsCisJCQkgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX0hXMlNXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKm1wdF9lbnRyeSwKK2ludCBtdGhjYV9IVzJTV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBvdXRkbWEgPSAwOwotCWludCBlcnI7Ci0KLQlpZiAobXB0X2VudHJ5KSB7Ci0JCW91dGRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgbXB0X2VudHJ5LAotCQkJCQlNVEhDQV9NUFRfRU5UUllfU0laRSwKLQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihvdXRkbWEpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG91dGRtYSwgbXB0X2luZGV4LCAhbXB0X2VudHJ5LAotCQkJICAgIENNRF9IVzJTV19NUFQsCi0JCQkgICAgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKLQotCWlmIChtcHRfZW50cnkpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBvdXRkbWEsCi0JCQkJIE1USENBX01QVF9FTlRSWV9TSVpFLAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94ID8gbWFpbGJveC0+ZG1hIDogMCwgbXB0X2luZGV4LAorCQkJICAgICAhbWFpbGJveCwgQ01EX0hXMlNXX01QVCwKKwkJCSAgICAgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX1dSSVRFX01UVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCAqbXR0X2VudHJ5LAoraW50IG10aGNhX1dSSVRFX01UVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICAgaW50IG51bV9tdHQsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKLQlpbnQgZXJyOwotCi0JaW5kbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIG10dF9lbnRyeSwKLQkJCSAgICAgICAobnVtX210dCArIDIpICogOCwKLQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGluZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgbnVtX210dCwgMCwgQ01EX1dSSVRFX01UVCwKLQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgaW5kbWEsCi0JCQkgKG51bV9tdHQgKyAyKSAqIDgsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgbnVtX210dCwgMCwgQ01EX1dSSVRFX01UVCwKKwkJCSBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwogfQogCiBpbnQgbXRoY2FfU1lOQ19UUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQpAQCAtMTQxOCw5MiArMTQzOCwzOCBAQAogCQkJIDAsIENNRF9NQVBfRVEsIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CiB9CiAKLWludCBtdGhjYV9TVzJIV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmVxX2NvbnRleHQsCitpbnQgbXRoY2FfU1cySFdfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGVxX251bSwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwotCWludCBlcnI7Ci0KLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgZXFfY29udGV4dCwKLQkJCSAgICAgICBNVEhDQV9FUV9DT05URVhUX1NJWkUsCi0JCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihpbmRtYSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsIGVxX251bSwgMCwgQ01EX1NXMkhXX0VRLAotCQkJQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwKLQkJCSBNVEhDQV9FUV9DT05URVhUX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgZXFfbnVtLCAwLCBDTURfU1cySFdfRVEsCisJCQkgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX0hXMlNXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqZXFfY29udGV4dCwKK2ludCBtdGhjYV9IVzJTV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKQogewotCWRtYV9hZGRyX3Qgb3V0ZG1hID0gMDsKLQlpbnQgZXJyOwotCi0Jb3V0ZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBlcV9jb250ZXh0LAotCQkJCU1USENBX0VRX0NPTlRFWFRfU0laRSwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3Iob3V0ZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCBlcV9udW0sIDAsCi0JCQkgICAgQ01EX0hXMlNXX0VRLAotCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgb3V0ZG1hLAotCQkJIE1USENBX0VRX0NPTlRFWFRfU0laRSwKLQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIGVxX251bSwgMCwKKwkJCSAgICAgQ01EX0hXMlNXX0VRLAorCQkJICAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogfQogCi1pbnQgbXRoY2FfU1cySFdfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpjcV9jb250ZXh0LAoraW50IG10aGNhX1NXMkhXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgIGludCBjcV9udW0sIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKLQlpbnQgZXJyOwotCi0JaW5kbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIGNxX2NvbnRleHQsCi0JCQkgICAgICAgTVRIQ0FfQ1FfQ09OVEVYVF9TSVpFLAotCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoaW5kbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCBjcV9udW0sIDAsIENNRF9TVzJIV19DUSwKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBjcV9udW0sIDAsIENNRF9TVzJIV19DUSwKIAkJCUNNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgaW5kbWEsCi0JCQkgTVRIQ0FfQ1FfQ09OVEVYVF9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlyZXR1cm4gZXJyOwogfQogCi1pbnQgbXRoY2FfSFcyU1dfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpjcV9jb250ZXh0LAoraW50IG10aGNhX0hXMlNXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgIGludCBjcV9udW0sIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBvdXRkbWEgPSAwOwotCWludCBlcnI7Ci0KLQlvdXRkbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIGNxX2NvbnRleHQsCi0JCQkJTVRIQ0FfQ1FfQ09OVEVYVF9TSVpFLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihvdXRkbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIGNxX251bSwgMCwKLQkJCSAgICBDTURfSFcyU1dfQ1EsCi0JCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBvdXRkbWEsCi0JCQkgTVRIQ0FfQ1FfQ09OVEVYVF9TSVpFLAotCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgY3FfbnVtLCAwLAorCQkJICAgICBDTURfSFcyU1dfQ1EsCisJCQkgICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiB9CiAKIGludCBtdGhjYV9NT0RJRllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgdHJhbnMsIHUzMiBudW0sCi0JCSAgICBpbnQgaXNfZWUsIHZvaWQgKnFwX2NvbnRleHQsIHUzMiBvcHRtYXNrLAorCQkgICAgaW50IGlzX2VlLCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTMyIG9wdG1hc2ssCiAJCSAgICB1OCAqc3RhdHVzKQogewogCXN0YXRpYyBjb25zdCB1MTYgb3BbXSA9IHsKQEAgLTE1MjAsMzYgKzE0ODYsMzQgQEAKIAkJW01USENBX1RSQU5TX0FOWTJSU1RdICAgPSBDTURfRVJSMlJTVF9RUEVFCiAJfTsKIAl1OCBvcF9tb2QgPSAwOwotCi0JZG1hX2FkZHJfdCBpbmRtYTsKKwlpbnQgbXlfbWFpbGJveCA9IDA7CiAJaW50IGVycjsKIAogCWlmICh0cmFucyA8IDAgfHwgdHJhbnMgPj0gQVJSQVlfU0laRShvcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHRyYW5zID09IE1USENBX1RSQU5TX0FOWTJSU1QpIHsKLQkJaW5kbWEgID0gMDsKIAkJb3BfbW9kID0gMzsJLyogZG9uJ3Qgd3JpdGUgb3V0Ym94LCBhbnktPnJlc2V0ICovCiAKIAkJLyogRm9yIGRlYnVnZ2luZyAqLwotCQlxcF9jb250ZXh0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBNVEhDQV9RUF9DT05URVhUX1NJWkUsCi0JCQkJCQkgICZpbmRtYSk7Ci0JCW9wX21vZCA9IDI7CS8qIHdyaXRlIG91dGJveCwgYW55LT5yZXNldCAqLworCQlpZiAoIW1haWxib3gpIHsKKwkJCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIUlTX0VSUihtYWlsYm94KSkgeworCQkJCW15X21haWxib3ggPSAxOworCQkJCW9wX21vZCAgICAgPSAyOwkvKiB3cml0ZSBvdXRib3gsIGFueS0+cmVzZXQgKi8KKwkJCX0gZWxzZQorCQkJCW1haWxib3ggPSBOVUxMOworCQl9CiAJfSBlbHNlIHsKLQkJaW5kbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIHFwX2NvbnRleHQsCi0JCQkJICAgICAgIE1USENBX1FQX0NPTlRFWFRfU0laRSwKLQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoaW5kbWEpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkJaWYgKDApIHsKIAkJCWludCBpOwogCQkJbXRoY2FfZGJnKGRldiwgIkR1bXBpbmcgUVAgY29udGV4dDpcbiIpOwotCQkJcHJpbnRrKCIgIG9wdCBwYXJhbSBtYXNrOiAlMDh4XG4iLCBiZTMyX3RvX2NwdXAocXBfY29udGV4dCkpOworCQkJcHJpbnRrKCIgIG9wdCBwYXJhbSBtYXNrOiAlMDh4XG4iLCBiZTMyX3RvX2NwdXAobWFpbGJveC0+YnVmKSk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgMHgxMDAgLyA0OyArK2kpIHsKIAkJCQlpZiAoaSAlIDggPT0gMCkKIAkJCQkJcHJpbnRrKCIgIFslMDJ4XSAiLCBpICogNCk7Ci0JCQkJcHJpbnRrKCIgJTA4eCIsIGJlMzJfdG9fY3B1KCgodTMyICopIHFwX2NvbnRleHQpW2kgKyAyXSkpOworCQkJCXByaW50aygiICUwOHgiLAorCQkJCSAgICAgICBiZTMyX3RvX2NwdSgoKHUzMiAqKSBtYWlsYm94LT5idWYpW2kgKyAyXSkpOwogCQkJCWlmICgoaSArIDEpICUgOCA9PSAwKQogCQkJCQlwcmludGsoIlxuIik7CiAJCQl9CkBAIC0xNTU3LDU1ICsxNTIxLDM5IEBACiAJfQogCiAJaWYgKHRyYW5zID09IE1USENBX1RSQU5TX0FOWTJSU1QpIHsKLQkJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIGluZG1hLCAoISFpc19lZSA8PCAyNCkgfCBudW0sCi0JCQkJICAgIG9wX21vZCwgb3BbdHJhbnNdLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOworCQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveCA/IG1haWxib3gtPmRtYSA6IDAsCisJCQkJICAgICghIWlzX2VlIDw8IDI0KSB8IG51bSwgb3BfbW9kLAorCQkJCSAgICBvcFt0cmFuc10sIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CiAKLQkJaWYgKDApIHsKKwkJaWYgKDAgJiYgbWFpbGJveCkgewogCQkJaW50IGk7CiAJCQltdGhjYV9kYmcoZGV2LCAiRHVtcGluZyBRUCBjb250ZXh0OlxuIik7Ci0JCQlwcmludGsoIiAlMDh4XG4iLCBiZTMyX3RvX2NwdXAocXBfY29udGV4dCkpOworCQkJcHJpbnRrKCIgJTA4eFxuIiwgYmUzMl90b19jcHVwKG1haWxib3gtPmJ1ZikpOwogCQkJZm9yIChpID0gMDsgaSA8IDB4MTAwIC8gNDsgKytpKSB7CiAJCQkJaWYgKGkgJSA4ID09IDApCiAJCQkJCXByaW50aygiWyUwMnhdICIsIGkgKiA0KTsKLQkJCQlwcmludGsoIiAlMDh4IiwgYmUzMl90b19jcHUoKCh1MzIgKikgcXBfY29udGV4dClbaSArIDJdKSk7CisJCQkJcHJpbnRrKCIgJTA4eCIsCisJCQkJICAgICAgIGJlMzJfdG9fY3B1KCgodTMyICopIG1haWxib3gtPmJ1ZilbaSArIDJdKSk7CiAJCQkJaWYgKChpICsgMSkgJSA4ID09IDApCiAJCQkJCXByaW50aygiXG4iKTsKIAkJCX0KIAkJfQogCiAJfSBlbHNlCi0JCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCAoISFpc19lZSA8PCAyNCkgfCBudW0sCisJCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgKCEhaXNfZWUgPDwgMjQpIHwgbnVtLAogCQkJCW9wX21vZCwgb3BbdHJhbnNdLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOwogCi0JaWYgKHRyYW5zICE9IE1USENBX1RSQU5TX0FOWTJSU1QpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwKLQkJCQkgTVRIQ0FfUVBfQ09OVEVYVF9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQllbHNlCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBNVEhDQV9RUF9DT05URVhUX1NJWkUsCi0JCQkJICAgIHFwX2NvbnRleHQsIGluZG1hKTsKKwlpZiAobXlfbWFpbGJveCkKKwkJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CisKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfUVVFUllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgbnVtLCBpbnQgaXNfZWUsCi0JCSAgIHZvaWQgKnFwX2NvbnRleHQsIHU4ICpzdGF0dXMpCisJCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKQogewotCWRtYV9hZGRyX3Qgb3V0ZG1hID0gMDsKLQlpbnQgZXJyOwotCi0Jb3V0ZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBxcF9jb250ZXh0LAotCQkJCU1USENBX1FQX0NPTlRFWFRfU0laRSwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3Iob3V0ZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCAoISFpc19lZSA8PCAyNCkgfCBudW0sIDAsCi0JCQkgICAgQ01EX1FVRVJZX1FQRUUsCi0JCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBvdXRkbWEsCi0JCQkgTVRIQ0FfUVBfQ09OVEVYVF9TSVpFLAotCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgKCEhaXNfZWUgPDwgMjQpIHwgbnVtLCAwLAorCQkJICAgICBDTURfUVVFUllfUVBFRSwgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIH0KIAogaW50IG10aGNhX0NPTkZfU1BFQ0lBTF9RUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCB0eXBlLCB1MzIgcXBuLApAQCAtMTYzNSwxMSArMTU4MywxMSBAQAogfQogCiBpbnQgbXRoY2FfTUFEX0lGQyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpZ25vcmVfbWtleSwgaW50IGlnbm9yZV9ia2V5LAotCQkgIGludCBwb3J0LCBzdHJ1Y3QgaWJfd2MqIGluX3djLCBzdHJ1Y3QgaWJfZ3JoKiBpbl9ncmgsCisJCSAgaW50IHBvcnQsIHN0cnVjdCBpYl93YyAqaW5fd2MsIHN0cnVjdCBpYl9ncmggKmluX2dyaCwKIAkJICB2b2lkICppbl9tYWQsIHZvaWQgKnJlc3BvbnNlX21hZCwgdTggKnN0YXR1cykKIHsKLQl2b2lkICpib3g7Ci0JZG1hX2FkZHJfdCBkbWE7CisJc3RydWN0IG10aGNhX21haWxib3ggKmlubWFpbGJveCwgKm91dG1haWxib3g7CisJdm9pZCAqaW5ib3g7CiAJaW50IGVycjsKIAl1MzIgaW5fbW9kaWZpZXIgPSBwb3J0OwogCXU4IG9wX21vZGlmaWVyID0gMDsKQEAgLTE2NTMsMTEgKzE2MDEsMTggQEAKICNkZWZpbmUgTUFEX0lGQ19QS0VZX09GRlNFVCAgIDB4MTBlCiAjZGVmaW5lIE1BRF9JRkNfR1JIX09GRlNFVCAgICAweDE0MAogCi0JYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBNQURfSUZDX0JPWF9TSVpFLCAmZG1hKTsKLQlpZiAoIWJveCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaW5tYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIoaW5tYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIoaW5tYWlsYm94KTsKKwlpbmJveCA9IGlubWFpbGJveC0+YnVmOwogCi0JbWVtY3B5KGJveCwgaW5fbWFkLCAyNTYpOworCW91dG1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihvdXRtYWlsYm94KSkgeworCQltdGhjYV9mcmVlX21haWxib3goZGV2LCBpbm1haWxib3gpOworCQlyZXR1cm4gUFRSX0VSUihvdXRtYWlsYm94KTsKKwl9CisKKwltZW1jcHkoaW5ib3gsIGluX21hZCwgMjU2KTsKIAogCS8qCiAJICogS2V5IGNoZWNrIHRyYXBzIGNhbid0IGJlIGdlbmVyYXRlZCB1bmxlc3Mgd2UgaGF2ZSBpbl93YyB0bwpAQCAtMTY3MSw5NyArMTYyNiw2NSBAQAogCWlmIChpbl93YykgewogCQl1OCB2YWw7CiAKLQkJbWVtc2V0KGJveCArIDI1NiwgMCwgMjU2KTsKKwkJbWVtc2V0KGluYm94ICsgMjU2LCAwLCAyNTYpOwogCi0JCU1USENBX1BVVChib3gsIGluX3djLT5xcF9udW0sIAkgIE1BRF9JRkNfTVlfUVBOX09GRlNFVCk7Ci0JCU1USENBX1BVVChib3gsIGluX3djLT5zcmNfcXAsIAkgIE1BRF9JRkNfUlFQTl9PRkZTRVQpOworCQlNVEhDQV9QVVQoaW5ib3gsIGluX3djLT5xcF9udW0sICAgICBNQURfSUZDX01ZX1FQTl9PRkZTRVQpOworCQlNVEhDQV9QVVQoaW5ib3gsIGluX3djLT5zcmNfcXAsICAgICBNQURfSUZDX1JRUE5fT0ZGU0VUKTsKIAogCQl2YWwgPSBpbl93Yy0+c2wgPDwgNDsKLQkJTVRIQ0FfUFVUKGJveCwgdmFsLCAgICAgICAgICAgICAgIE1BRF9JRkNfU0xfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19TTF9PRkZTRVQpOwogCiAJCXZhbCA9IGluX3djLT5kbGlkX3BhdGhfYml0cyB8CiAJCQkoaW5fd2MtPndjX2ZsYWdzICYgSUJfV0NfR1JIID8gMHg4MCA6IDApOwotCQlNVEhDQV9QVVQoYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HUkhfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HUkhfT0ZGU0VUKTsKIAotCQlNVEhDQV9QVVQoYm94LCBpbl93Yy0+c2xpZCwgICAgICAgTUFEX0lGQ19STElEX09GRlNFVCk7Ci0JCU1USENBX1BVVChib3gsIGluX3djLT5wa2V5X2luZGV4LCBNQURfSUZDX1BLRVlfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCBpbl93Yy0+c2xpZCwgICAgICAgTUFEX0lGQ19STElEX09GRlNFVCk7CisJCU1USENBX1BVVChpbmJveCwgaW5fd2MtPnBrZXlfaW5kZXgsIE1BRF9JRkNfUEtFWV9PRkZTRVQpOwogCiAJCWlmIChpbl9ncmgpCi0JCQltZW1jcHkoKHU4ICopIGJveCArIE1BRF9JRkNfR1JIX09GRlNFVCwgaW5fZ3JoLCA0MCk7CisJCQltZW1jcHkoaW5ib3ggKyBNQURfSUZDX0dSSF9PRkZTRVQsIGluX2dyaCwgNDApOwogCiAJCW9wX21vZGlmaWVyIHw9IDB4MTA7CiAKIAkJaW5fbW9kaWZpZXIgfD0gaW5fd2MtPnNsaWQgPDwgMTY7CiAJfQogCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIGRtYSwgZG1hICsgNTEyLCBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsCisJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIGlubWFpbGJveC0+ZG1hLCBvdXRtYWlsYm94LT5kbWEsCisJCQkgICAgaW5fbW9kaWZpZXIsIG9wX21vZGlmaWVyLAogCQkJICAgIENNRF9NQURfSUZDLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOwogCiAJaWYgKCFlcnIgJiYgISpzdGF0dXMpCi0JCW1lbWNweShyZXNwb25zZV9tYWQsIGJveCArIDUxMiwgMjU2KTsKKwkJbWVtY3B5KHJlc3BvbnNlX21hZCwgb3V0bWFpbGJveC0+YnVmLCAyNTYpOwogCi0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIE1BRF9JRkNfQk9YX1NJWkUsIGJveCwgZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBpbm1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG91dG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9SRUFEX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwgdm9pZCAqbWdtLAotCQkgICB1OCAqc3RhdHVzKQoraW50IG10aGNhX1JFQURfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LAorCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IG91dGRtYSA9IDA7Ci0JaW50IGVycjsKLQotCW91dGRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgbWdtLAotCQkJCU1USENBX01HTV9FTlRSWV9TSVpFLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihvdXRkbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIGluZGV4LCAwLAotCQkJICAgIENNRF9SRUFEX01HTSwKLQkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIG91dGRtYSwKLQkJCSBNVEhDQV9NR01fRU5UUllfU0laRSwKLQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIGluZGV4LCAwLAorCQkJICAgICBDTURfUkVBRF9NR00sIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiB9CiAKLWludCBtdGhjYV9XUklURV9NR00oc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaW5kZXgsIHZvaWQgKm1nbSwKLQkJICAgIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfV1JJVEVfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LAorCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKLQlpbnQgZXJyOwotCi0JaW5kbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIG1nbSwKLQkJCSAgICAgICBNVEhDQV9NR01fRU5UUllfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGluZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgaW5kZXgsIDAsIENNRF9XUklURV9NR00sCi0JCQlDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIGluZG1hLAotCQkJIE1USENBX01HTV9FTlRSWV9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluZGV4LCAwLCBDTURfV1JJVEVfTUdNLAorCQkJIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiB9CiAKLWludCBtdGhjYV9NR0lEX0hBU0goc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpnaWQsIHUxNiAqaGFzaCwKLQkJICAgIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfTUdJRF9IQVNIKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCisJCSAgICB1MTYgKmhhc2gsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKIAl1NjQgaW1tOwogCWludCBlcnI7CiAKLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgZ2lkLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihpbmRtYSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbXRoY2FfY21kX2ltbShkZXYsIGluZG1hLCAmaW1tLCAwLCAwLCBDTURfTUdJRF9IQVNILAorCWVyciA9IG10aGNhX2NtZF9pbW0oZGV2LCBtYWlsYm94LT5kbWEsICZpbW0sIDAsIDAsIENNRF9NR0lEX0hBU0gsCiAJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQkqaGFzaCA9IGltbTsKIAotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOworCSpoYXNoID0gaW1tOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuaAppbmRleCBhZGYwMzliLi5lZDUxN2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5oCkBAIC0zNyw4ICszNyw3IEBACiAKICNpbmNsdWRlIDxpYl92ZXJicy5oPgogCi0jZGVmaW5lIE1USENBX0NNRF9NQUlMQk9YX0FMSUdOIDE2VUwKLSNkZWZpbmUgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEgKE1USENBX0NNRF9NQUlMQk9YX0FMSUdOIC0gMSkKKyNkZWZpbmUgTVRIQ0FfTUFJTEJPWF9TSVpFIDQwOTYKIAogZW51bSB7CiAJLyogY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5OiAqLwpAQCAtMTEyLDYgKzExMSwxMSBAQAogCURFVl9MSU1fRkxBR19VRF9NVUxUSSAgICAgICAgICAgPSAxIDw8IDIxLAogfTsKIAorc3RydWN0IG10aGNhX21haWxib3ggeworCWRtYV9hZGRyX3QgZG1hOworCXZvaWQgICAgICAqYnVmOworfTsKKwogc3RydWN0IG10aGNhX2Rldl9saW0gewogCWludCBtYXhfc3JxX3N6OwogCWludCBtYXhfcXBfc3o7CkBAIC0yMzUsMTEgKzIzOSwxNyBAQAogCXUzMiBjYXBfbWFzazsKIH07CiAKK2ludCBtdGhjYV9jbWRfaW5pdChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwordm9pZCBtdGhjYV9jbWRfY2xlYW51cChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogaW50IG10aGNhX2NtZF91c2VfZXZlbnRzKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7CiB2b2lkIG10aGNhX2NtZF91c2VfcG9sbGluZyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogdm9pZCBtdGhjYV9jbWRfZXZlbnQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MTYgdG9rZW4sCiAJCSAgICAgdTggIHN0YXR1cywgdTY0IG91dF9wYXJhbSk7CiAKK3N0cnVjdCBtdGhjYV9tYWlsYm94ICptdGhjYV9hbGxvY19tYWlsYm94KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spOwordm9pZCBtdGhjYV9mcmVlX21haWxib3goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCk7CisKIGludCBtdGhjYV9TWVNfRU4oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9TWVNfRElTKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfTUFQX0ZBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1OCAqc3RhdHVzKTsKQEAgLTI3MCw0MSArMjgwLDM5IEBACiBpbnQgbXRoY2FfVU5NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwogaW50IG10aGNhX1NFVF9JQ01fU0laRShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBpY21fc2l6ZSwgdTY0ICphdXhfcGFnZXMsCiAJCSAgICAgICB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9TVzJIV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICptcHRfZW50cnksCitpbnQgbXRoY2FfU1cySFdfTVBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgICBpbnQgbXB0X2luZGV4LCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9IVzJTV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICptcHRfZW50cnksCitpbnQgbXRoY2FfSFcyU1dfTVBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgICBpbnQgbXB0X2luZGV4LCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9XUklURV9NVFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgKm10dF9lbnRyeSwKK2ludCBtdGhjYV9XUklURV9NVFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgIGludCBudW1fbXR0LCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9TWU5DX1RQVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwogaW50IG10aGNhX01BUF9FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBldmVudF9tYXNrLCBpbnQgdW5tYXAsCiAJCSBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9TVzJIV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmVxX2NvbnRleHQsCitpbnQgbXRoY2FfU1cySFdfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGVxX251bSwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfSFcyU1dfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICplcV9jb250ZXh0LAoraW50IG10aGNhX0hXMlNXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgIGludCBlcV9udW0sIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1NXMkhXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqY3FfY29udGV4dCwKK2ludCBtdGhjYV9TVzJIV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICBpbnQgY3FfbnVtLCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9IVzJTV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmNxX2NvbnRleHQsCitpbnQgbXRoY2FfSFcyU1dfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGNxX251bSwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfTU9ESUZZX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHRyYW5zLCB1MzIgbnVtLAotCQkgICAgaW50IGlzX2VlLCB2b2lkICpxcF9jb250ZXh0LCB1MzIgb3B0bWFzaywKKwkJICAgIGludCBpc19lZSwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHUzMiBvcHRtYXNrLAogCQkgICAgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfUVVFUllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgbnVtLCBpbnQgaXNfZWUsCi0JCSAgIHZvaWQgKnFwX2NvbnRleHQsIHU4ICpzdGF0dXMpOworCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4sCiAJCQkgIHU4ICpzdGF0dXMpOwogaW50IG10aGNhX01BRF9JRkMoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaWdub3JlX21rZXksIGludCBpZ25vcmVfYmtleSwKLQkJICBpbnQgcG9ydCwgc3RydWN0IGliX3djKiBpbl93Yywgc3RydWN0IGliX2dyaCogaW5fZ3JoLAorCQkgIGludCBwb3J0LCBzdHJ1Y3QgaWJfd2MgKmluX3djLCBzdHJ1Y3QgaWJfZ3JoICppbl9ncmgsCiAJCSAgdm9pZCAqaW5fbWFkLCB2b2lkICpyZXNwb25zZV9tYWQsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1JFQURfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LCB2b2lkICptZ20sCi0JCSAgIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1dSSVRFX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwgdm9pZCAqbWdtLAotCQkgICAgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfTUdJRF9IQVNIKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqZ2lkLCB1MTYgKmhhc2gsCi0JCSAgICB1OCAqc3RhdHVzKTsKK2ludCBtdGhjYV9SRUFEX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwKKwkJICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpOworaW50IG10aGNhX1dSSVRFX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwKKwkJICAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKTsKK2ludCBtdGhjYV9NR0lEX0hBU0goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKKwkJICAgIHUxNiAqaGFzaCwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfTk9QKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CiAKLSNkZWZpbmUgTUFJTEJPWF9BTElHTih4KSAoKHZvaWQgKikgQUxJR04oKHVuc2lnbmVkIGxvbmcpICh4KSwgTVRIQ0FfQ01EX01BSUxCT1hfQUxJR04pKQotCiAjZW5kaWYgLyogTVRIQ0FfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKaW5kZXggMmJmMzQ3Yi4uYjVhZWE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKQEAgLTEsNSArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTE3MSw2ICsxNzMsMTcgQEAKIAljcWUtPm93bmVyID0gTVRIQ0FfQ1FfRU5UUllfT1dORVJfSFc7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfY3FlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqY3FlX3B0cikKK3sKKwlfX2JlMzIgKmNxZSA9IGNxZV9wdHI7CisKKwkodm9pZCkgY3FlOwkvKiBhdm9pZCB3YXJuaW5nIGlmIG10aGNhX2RiZyBjb21waWxlZCBhd2F5Li4uICovCisJbXRoY2FfZGJnKGRldiwgIkNRRSBjb250ZW50cyAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCSAgYmUzMl90b19jcHUoY3FlWzBdKSwgYmUzMl90b19jcHUoY3FlWzFdKSwgYmUzMl90b19jcHUoY3FlWzJdKSwKKwkJICBiZTMyX3RvX2NwdShjcWVbM10pLCBiZTMyX3RvX2NwdShjcWVbNF0pLCBiZTMyX3RvX2NwdShjcWVbNV0pLAorCQkgIGJlMzJfdG9fY3B1KGNxZVs2XSksIGJlMzJfdG9fY3B1KGNxZVs3XSkpOworfQorCiAvKgogICogaW5jciBpcyBpZ25vcmVkIGluIG5hdGl2ZSBBcmJlbCAobWVtLWZyZWUpIG1vZGUsIHNvIGNxLT5jb25zX2luZGV4CiAgKiBzaG91bGQgYmUgY29ycmVjdCBiZWZvcmUgY2FsbGluZyB1cGRhdGVfY29uc19pbmRleCgpLgpAQCAtMjgwLDE2ICsyOTMsMTIgQEAKIAlpbnQgZGJkOwogCXUzMiBuZXdfd3FlOwogCi0JaWYgKDEgJiYgY3FlLT5zeW5kcm9tZSAhPSBTWU5EUk9NRV9XUl9GTFVTSF9FUlIpIHsKLQkJaW50IGo7Ci0KLQkJbXRoY2FfZGJnKGRldiwgIiV4LyVkOiBlcnJvciBDUUUgLT4gUVBOICUwNngsIFdRRSBAICUwOHhcbiIsCi0JCQkgIGNxLT5jcW4sIGNxLT5jb25zX2luZGV4LCBiZTMyX3RvX2NwdShjcWUtPm15X3FwbiksCi0JCQkgIGJlMzJfdG9fY3B1KGNxZS0+d3FlKSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDg7ICsraikKLQkJCXByaW50ayhLRVJOX0RFQlVHICIgIFslMnhdICUwOHhcbiIsCi0JCQkgICAgICAgaiAqIDQsIGJlMzJfdG9fY3B1KCgodTMyICopIGNxZSlbal0pKTsKKwlpZiAoY3FlLT5zeW5kcm9tZSA9PSBTWU5EUk9NRV9MT0NBTF9RUF9PUF9FUlIpIHsKKwkJbXRoY2FfZGJnKGRldiwgImxvY2FsIFFQIG9wZXJhdGlvbiBlcnIgIgorCQkJICAiKFFQTiAlMDZ4LCBXUUUgQCAlMDh4LCBDUU4gJTA2eCwgaW5kZXggJWQpXG4iLAorCQkJICBiZTMyX3RvX2NwdShjcWUtPm15X3FwbiksIGJlMzJfdG9fY3B1KGNxZS0+d3FlKSwKKwkJCSAgY3EtPmNxbiwgY3EtPmNvbnNfaW5kZXgpOworCQlkdW1wX2NxZShkZXYsIGNxZSk7CiAJfQogCiAJLyoKQEAgLTM3NywxNSArMzg2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHVtcF9jcWUoc3RydWN0IG10aGNhX2NxZSAqY3FlKQotewotCWludCBqOwotCi0JZm9yIChqID0gMDsgaiA8IDg7ICsraikKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgWyUyeF0gJTA4eFxuIiwKLQkJICAgICAgIGogKiA0LCBiZTMyX3RvX2NwdSgoKHUzMiAqKSBjcWUpW2pdKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG10aGNhX3BvbGxfb25lKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCQkgc3RydWN0IG10aGNhX2NxICpjcSwKIAkJCQkgc3RydWN0IG10aGNhX3FwICoqY3VyX3FwLApAQCAtNDE0LDggKzQxNCw3IEBACiAJCW10aGNhX2RiZyhkZXYsICIleC8lZDogQ1FFIC0+IFFQTiAlMDZ4LCBXUUUgQCAlMDh4XG4iLAogCQkJICBjcS0+Y3FuLCBjcS0+Y29uc19pbmRleCwgYmUzMl90b19jcHUoY3FlLT5teV9xcG4pLAogCQkJICBiZTMyX3RvX2NwdShjcWUtPndxZSkpOwotCi0JCWR1bXBfY3FlKGNxZSk7CisJCWR1bXBfY3FlKGRldiwgY3FlKTsKIAl9CiAKIAlpc19lcnJvciA9IChjcWUtPm9wY29kZSAmIE1USENBX0VSUk9SX0NRRV9PUENPREVfTUFTSykgPT0KQEAgLTYzOCwxOSArNjM3LDE5IEBACiAJaW50IHNpemU7CiAKIAlpZiAoY3EtPmlzX2RpcmVjdCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsCi0JCQkJICAgIChjcS0+aWJjcS5jcWUgKyAxKSAqIE1USENBX0NRX0VOVFJZX1NJWkUsCi0JCQkJICAgIGNxLT5xdWV1ZS5kaXJlY3QuYnVmLAotCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmY3EtPnF1ZXVlLmRpcmVjdCwKLQkJCQkJCSAgIG1hcHBpbmcpKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LAorCQkJCSAgKGNxLT5pYmNxLmNxZSArIDEpICogTVRIQ0FfQ1FfRU5UUllfU0laRSwKKwkJCQkgIGNxLT5xdWV1ZS5kaXJlY3QuYnVmLAorCQkJCSAgcGNpX3VubWFwX2FkZHIoJmNxLT5xdWV1ZS5kaXJlY3QsCisJCQkJCQkgbWFwcGluZykpOwogCWVsc2UgewogCQlzaXplID0gKGNxLT5pYmNxLmNxZSArIDEpICogTVRIQ0FfQ1FfRU5UUllfU0laRTsKIAkJZm9yIChpID0gMDsgaSA8IChzaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7ICsraSkKIAkJCWlmIChjcS0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZikKLQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAotCQkJCQkJICAgIGNxLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAotCQkJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZjcS0+cXVldWUucGFnZV9saXN0W2ldLAotCQkJCQkJCQkgICBtYXBwaW5nKSk7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkgIGNxLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAorCQkJCQkJICBwY2lfdW5tYXBfYWRkcigmY3EtPnF1ZXVlLnBhZ2VfbGlzdFtpXSwKKwkJCQkJCQkJIG1hcHBpbmcpKTsKIAogCQlrZnJlZShjcS0+cXVldWUucGFnZV9saXN0KTsKIAl9CkBAIC02NzAsOCArNjY5LDggQEAKIAkJbnBhZ2VzICAgICAgICA9IDE7CiAJCXNoaWZ0ICAgICAgICAgPSBnZXRfb3JkZXIoc2l6ZSkgKyBQQUdFX1NISUZUOwogCi0JCWNxLT5xdWV1ZS5kaXJlY3QuYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LAotCQkJCQkJCSAgICBzaXplLCAmdCk7CisJCWNxLT5xdWV1ZS5kaXJlY3QuYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwKKwkJCQkJCQkgIHNpemUsICZ0LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjcS0+cXVldWUuZGlyZWN0LmJ1ZikKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC03MDksNyArNzA4LDggQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKIAkJCWNxLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmID0KLQkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwgJnQpOworCQkJCWRtYV9hbGxvY19jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJCSAgICZ0LCBHRlBfS0VSTkVMKTsKIAkJCWlmICghY3EtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYpCiAJCQkJZ290byBlcnJfZnJlZTsKIApAQCAtNzQzLDEwICs3NDMsMTEgQEAKIH0KIAogaW50IG10aGNhX2luaXRfY3Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgbmVudCwKKwkJICBzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgKmN0eCwgdTMyIHBkbiwKIAkJICBzdHJ1Y3QgbXRoY2FfY3EgKmNxKQogewogCWludCBzaXplID0gbmVudCAqIE1USENBX0NRX0VOVFJZX1NJWkU7Ci0Jdm9pZCAqbWFpbGJveCA9IE5VTEw7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJc3RydWN0IG10aGNhX2NxX2NvbnRleHQgKmNxX2NvbnRleHQ7CiAJaW50IGVyciA9IC1FTk9NRU07CiAJdTggc3RhdHVzOwpAQCAtNzU0LDQ1ICs3NTUsNDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQljcS0+aWJjcS5jcWUgPSBuZW50IC0gMTsKKwljcS0+aWJjcS5jcWUgID0gbmVudCAtIDE7CisJY3EtPmlzX2tlcm5lbCA9ICFjdHg7CiAKIAljcS0+Y3FuID0gbXRoY2FfYWxsb2MoJmRldi0+Y3FfdGFibGUuYWxsb2MpOwogCWlmIChjcS0+Y3FuID09IC0xKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKLQkJY3EtPmFybV9zbiA9IDE7Ci0KIAkJZXJyID0gbXRoY2FfdGFibGVfZ2V0KGRldiwgZGV2LT5jcV90YWJsZS50YWJsZSwgY3EtPmNxbik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXQ7CiAKLQkJZXJyID0gLUVOT01FTTsKKwkJaWYgKGNxLT5pc19rZXJuZWwpIHsKKwkJCWNxLT5hcm1fc24gPSAxOwogCi0JCWNxLT5zZXRfY2lfZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfU0VUX0NJLAotCQkJCQkJICAgICBjcS0+Y3FuLCAmY3EtPnNldF9jaV9kYik7Ci0JCWlmIChjcS0+c2V0X2NpX2RiX2luZGV4IDwgMCkKLQkJCWdvdG8gZXJyX291dF9pY207CisJCQllcnIgPSAtRU5PTUVNOwogCi0JCWNxLT5hcm1fZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfQVJNLAotCQkJCQkJICBjcS0+Y3FuLCAmY3EtPmFybV9kYik7Ci0JCWlmIChjcS0+YXJtX2RiX2luZGV4IDwgMCkKLQkJCWdvdG8gZXJyX291dF9jaTsKKwkJCWNxLT5zZXRfY2lfZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfU0VUX0NJLAorCQkJCQkJCSAgICAgY3EtPmNxbiwgJmNxLT5zZXRfY2lfZGIpOworCQkJaWYgKGNxLT5zZXRfY2lfZGJfaW5kZXggPCAwKQorCQkJCWdvdG8gZXJyX291dF9pY207CisKKwkJCWNxLT5hcm1fZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfQVJNLAorCQkJCQkJCSAgY3EtPmNxbiwgJmNxLT5hcm1fZGIpOworCQkJaWYgKGNxLT5hcm1fZGJfaW5kZXggPCAwKQorCQkJCWdvdG8gZXJyX291dF9jaTsKKwkJfQogCX0KIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IG10aGNhX2NxX2NvbnRleHQpICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKLQkJZ290byBlcnJfb3V0X21haWxib3g7CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlnb3RvIGVycl9vdXRfYXJtOwogCi0JY3FfY29udGV4dCA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJY3FfY29udGV4dCA9IG1haWxib3gtPmJ1ZjsKIAotCWVyciA9IG10aGNhX2FsbG9jX2NxX2J1ZihkZXYsIHNpemUsIGNxKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfbWFpbGJveDsKKwlpZiAoY3EtPmlzX2tlcm5lbCkgeworCQllcnIgPSBtdGhjYV9hbGxvY19jcV9idWYoZGV2LCBzaXplLCBjcSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXRfbWFpbGJveDsKIAotCWZvciAoaSA9IDA7IGkgPCBuZW50OyArK2kpCi0JCXNldF9jcWVfaHcoZ2V0X2NxZShjcSwgaSkpOworCQlmb3IgKGkgPSAwOyBpIDwgbmVudDsgKytpKQorCQkJc2V0X2NxZV9odyhnZXRfY3FlKGNxLCBpKSk7CisJfQogCiAJc3Bpbl9sb2NrX2luaXQoJmNxLT5sb2NrKTsKIAlhdG9taWNfc2V0KCZjcS0+cmVmY291bnQsIDEpOwpAQCAtODAzLDExICs4MDgsMTQgQEAKIAkJCQkJCSAgTVRIQ0FfQ1FfU1RBVEVfRElTQVJNRUQgfAogCQkJCQkJICBNVEhDQV9DUV9GTEFHX1RSKTsKIAljcV9jb250ZXh0LT5zdGFydCAgICAgICAgICAgPSBjcHVfdG9fYmU2NCgwKTsKLQljcV9jb250ZXh0LT5sb2dzaXplX3VzcnBhZ2UgPSBjcHVfdG9fYmUzMigoZmZzKG5lbnQpIC0gMSkgPDwgMjQgfAotCQkJCQkJICBkZXYtPmRyaXZlcl91YXIuaW5kZXgpOworCWNxX2NvbnRleHQtPmxvZ3NpemVfdXNycGFnZSA9IGNwdV90b19iZTMyKChmZnMobmVudCkgLSAxKSA8PCAyNCk7CisJaWYgKGN0eCkKKwkJY3FfY29udGV4dC0+bG9nc2l6ZV91c3JwYWdlIHw9IGNwdV90b19iZTMyKGN0eC0+dWFyLmluZGV4KTsKKwllbHNlCisJCWNxX2NvbnRleHQtPmxvZ3NpemVfdXNycGFnZSB8PSBjcHVfdG9fYmUzMihkZXYtPmRyaXZlcl91YXIuaW5kZXgpOwogCWNxX2NvbnRleHQtPmVycm9yX2VxbiAgICAgICA9IGNwdV90b19iZTMyKGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQVNZTkNdLmVxbik7CiAJY3FfY29udGV4dC0+Y29tcF9lcW4gICAgICAgID0gY3B1X3RvX2JlMzIoZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9DT01QXS5lcW4pOwotCWNxX2NvbnRleHQtPnBkICAgICAgICAgICAgICA9IGNwdV90b19iZTMyKGRldi0+ZHJpdmVyX3BkLnBkX251bSk7CisJY3FfY29udGV4dC0+cGQgICAgICAgICAgICAgID0gY3B1X3RvX2JlMzIocGRuKTsKIAljcV9jb250ZXh0LT5sa2V5ICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihjcS0+bXIuaWJtci5sa2V5KTsKIAljcV9jb250ZXh0LT5jcW4gICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihjcS0+Y3FuKTsKIApAQCAtODE2LDcgKzgyNCw3IEBACiAJCWNxX2NvbnRleHQtPnN0YXRlX2RiID0gY3B1X3RvX2JlMzIoY3EtPmFybV9kYl9pbmRleCk7CiAJfQogCi0JZXJyID0gbXRoY2FfU1cySFdfQ1EoZGV2LCBjcV9jb250ZXh0LCBjcS0+Y3FuLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TVzJIV19DUShkZXYsIG1haWxib3gsIGNxLT5jcW4sICZzdGF0dXMpOwogCWlmIChlcnIpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19DUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbXI7CkBAIC04NDAsMjIgKzg0OCwyNSBAQAogCiAJY3EtPmNvbnNfaW5kZXggPSAwOwogCi0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKIAlyZXR1cm4gMDsKIAogZXJyX291dF9mcmVlX21yOgotCW10aGNhX2ZyZWVfbXIoZGV2LCAmY3EtPm1yKTsKLQltdGhjYV9mcmVlX2NxX2J1ZihkZXYsIGNxKTsKKwlpZiAoY3EtPmlzX2tlcm5lbCkgeworCQltdGhjYV9mcmVlX21yKGRldiwgJmNxLT5tcik7CisJCW10aGNhX2ZyZWVfY3FfYnVmKGRldiwgY3EpOworCX0KIAogZXJyX291dF9tYWlsYm94OgotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCi0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKK2Vycl9vdXRfYXJtOgorCWlmIChjcS0+aXNfa2VybmVsICYmIG10aGNhX2lzX21lbWZyZWUoZGV2KSkKIAkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfQVJNLCBjcS0+YXJtX2RiX2luZGV4KTsKIAogZXJyX291dF9jaToKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQorCWlmIChjcS0+aXNfa2VybmVsICYmIG10aGNhX2lzX21lbWZyZWUoZGV2KSkKIAkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfU0VUX0NJLCBjcS0+c2V0X2NpX2RiX2luZGV4KTsKIAogZXJyX291dF9pY206CkBAIC04NzAsMzIgKzg4MSwzMSBAQAogdm9pZCBtdGhjYV9mcmVlX2NxKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJICAgc3RydWN0IG10aGNhX2NxICpjcSkKIHsKLQl2b2lkICptYWlsYm94OworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCWludCBlcnI7CiAJdTggc3RhdHVzOwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IG10aGNhX2NxX2NvbnRleHQpICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkgeworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkgewogCQltdGhjYV93YXJuKGRldiwgIk5vIG1lbW9yeSBmb3IgbWFpbGJveCB0byBmcmVlIENRLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQllcnIgPSBtdGhjYV9IVzJTV19DUShkZXYsIE1BSUxCT1hfQUxJR04obWFpbGJveCksIGNxLT5jcW4sICZzdGF0dXMpOworCWVyciA9IG10aGNhX0hXMlNXX0NRKGRldiwgbWFpbGJveCwgY3EtPmNxbiwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19DUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAllbHNlIGlmIChzdGF0dXMpCi0JCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfQ1EgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCSAgIHN0YXR1cyk7CisJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfQ1EgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwgc3RhdHVzKTsKIAogCWlmICgwKSB7Ci0JCXUzMiAqY3R4ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwkJdTMyICpjdHggPSBtYWlsYm94LT5idWY7CiAJCWludCBqOwogCiAJCXByaW50ayhLRVJOX0VSUiAiY29udGV4dCBmb3IgQ1FOICV4IChjb25zIGluZGV4ICV4LCBuZXh0IHN3ICVkKVxuIiwKLQkJICAgICAgIGNxLT5jcW4sIGNxLT5jb25zX2luZGV4LCAhIW5leHRfY3FlX3N3KGNxKSk7CisJCSAgICAgICBjcS0+Y3FuLCBjcS0+Y29uc19pbmRleCwKKwkJICAgICAgIGNxLT5pc19rZXJuZWwgPyAhIW5leHRfY3FlX3N3KGNxKSA6IDApOwogCQlmb3IgKGogPSAwOyBqIDwgMTY7ICsraikKIAkJCXByaW50ayhLRVJOX0VSUiAiWyUyeF0gJTA4eFxuIiwgaiAqIDQsIGJlMzJfdG9fY3B1KGN0eFtqXSkpOwogCX0KQEAgLTkxMywxNyArOTIzLDE4IEBACiAJYXRvbWljX2RlYygmY3EtPnJlZmNvdW50KTsKIAl3YWl0X2V2ZW50KGNxLT53YWl0LCAhYXRvbWljX3JlYWQoJmNxLT5yZWZjb3VudCkpOwogCi0JbXRoY2FfZnJlZV9tcihkZXYsICZjcS0+bXIpOwotCW10aGNhX2ZyZWVfY3FfYnVmKGRldiwgY3EpOwotCi0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewotCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sICAgIGNxLT5hcm1fZGJfaW5kZXgpOwotCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksIGNxLT5zZXRfY2lfZGJfaW5kZXgpOwotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPmNxX3RhYmxlLnRhYmxlLCBjcS0+Y3FuKTsKKwlpZiAoY3EtPmlzX2tlcm5lbCkgeworCQltdGhjYV9mcmVlX21yKGRldiwgJmNxLT5tcik7CisJCW10aGNhX2ZyZWVfY3FfYnVmKGRldiwgY3EpOworCQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CisJCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sICAgIGNxLT5hcm1fZGJfaW5kZXgpOworCQkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfQ1FfU0VUX0NJLCBjcS0+c2V0X2NpX2RiX2luZGV4KTsKKwkJfQogCX0KIAorCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+Y3FfdGFibGUudGFibGUsIGNxLT5jcW4pOwogCW10aGNhX2ZyZWUoJmRldi0+Y3FfdGFibGUuYWxsb2MsIGNxLT5jcW4pOwotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogfQogCiBpbnQgX19kZXZpbml0IG10aGNhX2luaXRfY3FfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCmluZGV4IGUzZDc5ZTIuLjVlY2RkMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKQEAgLTEsNSArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNDYsOCArNDgsOCBAQAogCiAjZGVmaW5lIERSVl9OQU1FCSJpYl9tdGhjYSIKICNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjA2LXByZSIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIk5vdmVtYmVyIDgsIDIwMDQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjA2IgorI2RlZmluZSBEUlZfUkVMREFURQkiSnVuZSAyMywgMjAwNSIKIAogZW51bSB7CiAJTVRIQ0FfRkxBR19ERFJfSElEREVOID0gMSA8PCAxLApAQCAtOTgsNiArMTAwLDcgQEAKIH07CiAKIHN0cnVjdCBtdGhjYV9jbWQgeworCXN0cnVjdCBwY2lfcG9vbCAgICAgICAgICAqcG9vbDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgIHVzZV9ldmVudHM7CiAJc3RydWN0IHNlbWFwaG9yZSAgICAgICAgICBoY3Jfc2VtOwogCXN0cnVjdCBzZW1hcGhvcmUgCSAgcG9sbF9zZW07CkBAIC0zNzYsOSArMzc5LDE1IEBACiBpbnQgbXRoY2FfdWFyX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyKTsKIHZvaWQgbXRoY2FfdWFyX2ZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIpOwogCi1pbnQgbXRoY2FfcGRfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfcGQgKnBkKTsKK2ludCBtdGhjYV9wZF9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBwcml2aWxlZ2VkLCBzdHJ1Y3QgbXRoY2FfcGQgKnBkKTsKIHZvaWQgbXRoY2FfcGRfZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpOwogCitzdHJ1Y3QgbXRoY2FfbXR0ICptdGhjYV9hbGxvY19tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgc2l6ZSk7Cit2b2lkIG10aGNhX2ZyZWVfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX210dCAqbXR0KTsKK2ludCBtdGhjYV93cml0ZV9tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbXR0ICptdHQsCisJCSAgICBpbnQgc3RhcnRfaW5kZXgsIHU2NCAqYnVmZmVyX2xpc3QsIGludCBsaXN0X2xlbik7CitpbnQgbXRoY2FfbXJfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsIGludCBidWZmZXJfc2l6ZV9zaGlmdCwKKwkJICAgdTY0IGlvdmEsIHU2NCB0b3RhbF9zaXplLCB1MzIgYWNjZXNzLCBzdHJ1Y3QgbXRoY2FfbXIgKm1yKTsKIGludCBtdGhjYV9tcl9hbGxvY19ub3RyYW5zKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLAogCQkJICAgdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcik7CiBpbnQgbXRoY2FfbXJfYWxsb2NfcGh5cyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwKQEAgLTQwNSw2ICs0MTQsNyBAQAogaW50IG10aGNhX3Rhdm9yX2FybV9jcShzdHJ1Y3QgaWJfY3EgKmNxLCBlbnVtIGliX2NxX25vdGlmeSBub3RpZnkpOwogaW50IG10aGNhX2FyYmVsX2FybV9jcShzdHJ1Y3QgaWJfY3EgKmNxLCBlbnVtIGliX2NxX25vdGlmeSBub3RpZnkpOwogaW50IG10aGNhX2luaXRfY3Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgbmVudCwKKwkJICBzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgKmN0eCwgdTMyIHBkbiwKIAkJICBzdHJ1Y3QgbXRoY2FfY3EgKmNxKTsKIHZvaWQgbXRoY2FfZnJlZV9jcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCSAgIHN0cnVjdCBtdGhjYV9jcSAqY3EpOwpAQCAtNDMwLDEyICs0NDAsMTQgQEAKIAkJICAgc3RydWN0IG10aGNhX2NxICpyZWN2X2NxLAogCQkgICBlbnVtIGliX3FwX3R5cGUgdHlwZSwKIAkJICAgZW51bSBpYl9zaWdfdHlwZSBzZW5kX3BvbGljeSwKKwkJICAgc3RydWN0IGliX3FwX2NhcCAqY2FwLAogCQkgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKTsKIGludCBtdGhjYV9hbGxvY19zcXAoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkgICAgc3RydWN0IG10aGNhX3BkICpwZCwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcSwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgICBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCiAJCSAgICBpbnQgcXBuLAogCQkgICAgaW50IHBvcnQsCiAJCSAgICBzdHJ1Y3QgbXRoY2Ffc3FwICpzcXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rvb3JiZWxsLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZG9vcmJlbGwuaAppbmRleCA4MjEwMzlhLi41MzVmYWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZG9vcmJlbGwuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZG9vcmJlbGwuaApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCmluZGV4IGY0NmQ2MTUuLmNiY2YyYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCkBAIC00NjksNyArNDY5LDcgQEAKIAkJUEFHRV9TSVpFOwogCXU2NCAqZG1hX2xpc3QgPSBOVUxMOwogCWRtYV9hZGRyX3QgdDsKLQl2b2lkICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfZXFfY29udGV4dCAqZXFfY29udGV4dDsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgaTsKQEAgLTQ5NCwxNyArNDk0LDE2IEBACiAJaWYgKCFkbWFfbGlzdCkKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKLQltYWlsYm94ID0ga21hbGxvYyhzaXplb2YgKmVxX2NvbnRleHQgKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KQorCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKIAkJZ290byBlcnJfb3V0X2ZyZWU7Ci0JZXFfY29udGV4dCA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJZXFfY29udGV4dCA9IG1haWxib3gtPmJ1ZjsKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSkgewotCQllcS0+cGFnZV9saXN0W2ldLmJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwKLQkJCQkJCQkgICAgUEFHRV9TSVpFLCAmdCk7CisJCWVxLT5wYWdlX2xpc3RbaV0uYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwKKwkJCQkJCQkgIFBBR0VfU0laRSwgJnQsIEdGUF9LRVJORUwpOwogCQlpZiAoIWVxLT5wYWdlX2xpc3RbaV0uYnVmKQotCQkJZ290byBlcnJfb3V0X2ZyZWU7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9wYWdlczsKIAogCQlkbWFfbGlzdFtpXSA9IHQ7CiAJCXBjaV91bm1hcF9hZGRyX3NldCgmZXEtPnBhZ2VfbGlzdFtpXSwgbWFwcGluZywgdCk7CkBAIC01MTcsNyArNTE2LDcgQEAKIAogCWVxLT5lcW4gPSBtdGhjYV9hbGxvYygmZGV2LT5lcV90YWJsZS5hbGxvYyk7CiAJaWYgKGVxLT5lcW4gPT0gLTEpCi0JCWdvdG8gZXJyX291dF9mcmVlOworCQlnb3RvIGVycl9vdXRfZnJlZV9wYWdlczsKIAogCWVyciA9IG10aGNhX21yX2FsbG9jX3BoeXMoZGV2LCBkZXYtPmRyaXZlcl9wZC5wZF9udW0sCiAJCQkJICBkbWFfbGlzdCwgUEFHRV9TSElGVCwgbnBhZ2VzLApAQCAtNTQ4LDcgKzU0Nyw3IEBACiAJZXFfY29udGV4dC0+aW50ciAgICAgICAgICAgID0gaW50cjsKIAllcV9jb250ZXh0LT5sa2V5ICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihlcS0+bXIuaWJtci5sa2V5KTsKIAotCWVyciA9IG10aGNhX1NXMkhXX0VRKGRldiwgZXFfY29udGV4dCwgZXEtPmVxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfU1cySFdfRVEoZGV2LCBtYWlsYm94LCBlcS0+ZXFuLCAmc3RhdHVzKTsKIAlpZiAoZXJyKSB7CiAJCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfRVEgZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXJyX291dF9mcmVlX21yOwpAQCAtNTYxLDcgKzU2MCw3IEBACiAJfQogCiAJa2ZyZWUoZG1hX2xpc3QpOwotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCiAJZXEtPmVxbl9tYXNrICAgPSBzd2FiMzIoMSA8PCBlcS0+ZXFuKTsKIAllcS0+Y29uc19pbmRleCA9IDA7CkBAIC01NzksMTcgKzU3OCwxOSBAQAogIGVycl9vdXRfZnJlZV9lcToKIAltdGhjYV9mcmVlKCZkZXYtPmVxX3RhYmxlLmFsbG9jLCBlcS0+ZXFuKTsKIAotIGVycl9vdXRfZnJlZToKKyBlcnJfb3V0X2ZyZWVfcGFnZXM6CiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKQogCQlpZiAoZXEtPnBhZ2VfbGlzdFtpXS5idWYpCi0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAotCQkJCQkgICAgZXEtPnBhZ2VfbGlzdFtpXS5idWYsCi0JCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmZXEtPnBhZ2VfbGlzdFtpXSwKLQkJCQkJCQkgICBtYXBwaW5nKSk7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJICBlcS0+cGFnZV9saXN0W2ldLmJ1ZiwKKwkJCQkJICBwY2lfdW5tYXBfYWRkcigmZXEtPnBhZ2VfbGlzdFtpXSwKKwkJCQkJCQkgbWFwcGluZykpOwogCisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CisKKyBlcnJfb3V0X2ZyZWU6CiAJa2ZyZWUoZXEtPnBhZ2VfbGlzdCk7CiAJa2ZyZWUoZG1hX2xpc3QpOwotCWtmcmVlKG1haWxib3gpOwogCiAgZXJyX291dDoKIAlyZXR1cm4gZXJyOwpAQCAtNTk4LDI1ICs1OTksMjIgQEAKIHN0YXRpYyB2b2lkIG10aGNhX2ZyZWVfZXEoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkJICBzdHJ1Y3QgbXRoY2FfZXEgKmVxKQogewotCXZvaWQgKm1haWxib3ggPSBOVUxMOworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCWludCBlcnI7CiAJdTggc3RhdHVzOwogCWludCBucGFnZXMgPSAoZXEtPm5lbnQgKiBNVEhDQV9FUV9FTlRSWV9TSVpFICsgUEFHRV9TSVpFIC0gMSkgLwogCQlQQUdFX1NJWkU7CiAJaW50IGk7CiAKLQltYWlsYm94ID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBtdGhjYV9lcV9jb250ZXh0KSArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLAotCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm47CiAKLQllcnIgPSBtdGhjYV9IVzJTV19FUShkZXYsIE1BSUxCT1hfQUxJR04obWFpbGJveCksCi0JCQkgICAgIGVxLT5lcW4sICZzdGF0dXMpOworCWVyciA9IG10aGNhX0hXMlNXX0VRKGRldiwgbWFpbGJveCwgZXEtPmVxbiwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19FUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAlpZiAoc3RhdHVzKQotCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0VRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBzdGF0dXMpOworCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0VRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsIHN0YXR1cyk7CiAKIAlkZXYtPmVxX3RhYmxlLmFybV9tYXNrICY9IH5lcS0+ZXFuX21hc2s7CiAKQEAgLTYyNSw3ICs2MjMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfZXFfY29udGV4dCkgLyA0OyArK2kpIHsKIAkJCWlmIChpICUgNCA9PSAwKQogCQkJCXByaW50aygiWyUwMnhdICIsIGkgKiA0KTsKLQkJCXByaW50aygiICUwOHgiLCBiZTMyX3RvX2NwdXAoTUFJTEJPWF9BTElHTihtYWlsYm94KSArIGkgKiA0KSk7CisJCQlwcmludGsoIiAlMDh4IiwgYmUzMl90b19jcHVwKG1haWxib3gtPmJ1ZiArIGkgKiA0KSk7CiAJCQlpZiAoKGkgKyAxKSAlIDQgPT0gMCkKIAkJCQlwcmludGsoIlxuIik7CiAJCX0KQEAgLTYzOCw3ICs2MzYsNyBAQAogCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmZXEtPnBhZ2VfbGlzdFtpXSwgbWFwcGluZykpOwogCiAJa2ZyZWUoZXEtPnBhZ2VfbGlzdCk7Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiB9CiAKIHN0YXRpYyB2b2lkIG10aGNhX2ZyZWVfaXJxcyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCkBAIC03MDksOCArNzA3LDcgQEAKIAkJaWYgKG10aGNhX21hcF9yZWcoZGV2LCAoKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDEpICYKIAkJCQkJZGV2LT5mdy5hcmJlbC5lcV9hcm1fYmFzZSkgKyA0LCA0LAogCQkJCSAgJmRldi0+ZXFfcmVncy5hcmJlbC5lcV9hcm0pKSB7Ci0JCQltdGhjYV9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIGludGVycnVwdCBjbGVhciByZWdpc3RlciwgIgotCQkJCSAgImFib3J0aW5nLlxuIik7CisJCQltdGhjYV9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIEVRIGFybSByZWdpc3RlciwgYWJvcnRpbmcuXG4iKTsKIAkJCW10aGNhX3VubWFwX3JlZyhkZXYsIChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkgLSAxKSAmCiAJCQkJCWRldi0+ZncuYXJiZWwuY2xyX2ludF9iYXNlLCBNVEhDQV9DTFJfSU5UX1NJWkUsCiAJCQkJCWRldi0+Y2xyX2Jhc2UpOwpAQCAtNzIxLDggKzcxOCw3IEBACiAJCQkJICBkZXYtPmZ3LmFyYmVsLmVxX3NldF9jaV9iYXNlLAogCQkJCSAgTVRIQ0FfRVFfU0VUX0NJX1NJWkUsCiAJCQkJICAmZGV2LT5lcV9yZWdzLmFyYmVsLmVxX3NldF9jaV9iYXNlKSkgewotCQkJbXRoY2FfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIsICIKLQkJCQkgICJhYm9ydGluZy5cbiIpOworCQkJbXRoY2FfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBFUSBDSSByZWdpc3RlciwgYWJvcnRpbmcuXG4iKTsKIAkJCW10aGNhX3VubWFwX3JlZyhkZXYsICgocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMSkgJgogCQkJCQkgICAgICBkZXYtPmZ3LmFyYmVsLmVxX2FybV9iYXNlKSArIDQsIDQsCiAJCQkJCWRldi0+ZXFfcmVncy5hcmJlbC5lcV9hcm0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggZDQwNTkwMy4uMmVmOTE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTY5LDcgKzcwLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwogCiBzdGF0aWMgY29uc3QgY2hhciBtdGhjYV92ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0JImliX210aGNhOiBNZWxsYW5veCBJbmZpbmlCYW5kIEhDQSBkcml2ZXIgdiIKKwlEUlZfTkFNRSAiOiBNZWxsYW5veCBJbmZpbmlCYW5kIEhDQSBkcml2ZXIgdiIKIAlEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpXG4iOwogCiBzdGF0aWMgc3RydWN0IG10aGNhX3Byb2ZpbGUgZGVmYXVsdF9wcm9maWxlID0gewpAQCAtNjY0LDcgKzY2NSw3IEBACiAJCWdvdG8gZXJyX3BkX3RhYmxlX2ZyZWU7CiAJfQogCi0JZXJyID0gbXRoY2FfcGRfYWxsb2MoZGV2LCAmZGV2LT5kcml2ZXJfcGQpOworCWVyciA9IG10aGNhX3BkX2FsbG9jKGRldiwgMSwgJmRldi0+ZHJpdmVyX3BkKTsKIAlpZiAoZXJyKSB7CiAJCW10aGNhX2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGRyaXZlciBQRCwgIgogCQkJICAiYWJvcnRpbmcuXG4iKTsKQEAgLTkyNywxMyArOTI4LDEzIEBACiAJICovCiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pIHx8CiAJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgIT0gMSA8PCAyMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIERDUywgYWJvcnRpbmcuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgRENTLCBhYm9ydGluZy5cbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CiAJfQogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAogCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpICE9IDEgPDwgMjMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBVQVIsIGFib3J0aW5nLiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIFVBUiwgYWJvcnRpbmcuXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfZGlzYWJsZV9wZGV2OwogCX0KQEAgLTEwMDQsMjUgKzEwMDUsMTggQEAKIAkgICAgIXBjaV9lbmFibGVfbXNpKHBkZXYpKQogCQltZGV2LT5tdGhjYV9mbGFncyB8PSBNVEhDQV9GTEFHX01TSTsKIAotCXNlbWFfaW5pdCgmbWRldi0+Y21kLmhjcl9zZW0sIDEpOwotCXNlbWFfaW5pdCgmbWRldi0+Y21kLnBvbGxfc2VtLCAxKTsKLQltZGV2LT5jbWQudXNlX2V2ZW50cyA9IDA7Ci0KLQltZGV2LT5oY3IgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIE1USENBX0hDUl9CQVNFLCBNVEhDQV9IQ1JfU0laRSk7Ci0JaWYgKCFtZGV2LT5oY3IpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJDb3VsZG4ndCBtYXAgY29tbWFuZCByZWdpc3RlciwgIgotCQkJICAiYWJvcnRpbmcuXG4iKTsKLQkJZXJyID0gLUVOT01FTTsKKwlpZiAobXRoY2FfY21kX2luaXQobWRldikpIHsKKwkJbXRoY2FfZXJyKG1kZXYsICJGYWlsZWQgdG8gaW5pdCBjb21tYW5kIGludGVyZmFjZSwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfZnJlZV9kZXY7CiAJfQogCiAJZXJyID0gbXRoY2FfdHVuZV9wY2kobWRldik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfaW91bm1hcDsKKwkJZ290byBlcnJfY21kOwogCiAJZXJyID0gbXRoY2FfaW5pdF9oY2EobWRldik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfaW91bm1hcDsKKwkJZ290byBlcnJfY21kOwogCiAJaWYgKG1kZXYtPmZ3X3ZlciA8IG10aGNhX2hjYV90YWJsZVtpZC0+ZHJpdmVyX2RhdGFdLmxhdGVzdF9mdykgewogCQltdGhjYV93YXJuKG1kZXYsICJIQ0EgRlcgdmVyc2lvbiAleC4leC4leCBpcyBvbGQgKCV4LiV4LiV4IGlzIGN1cnJlbnQpLlxuIiwKQEAgLTEwNzAsOCArMTA2NCw4IEBACiBlcnJfY2xvc2U6CiAJbXRoY2FfY2xvc2VfaGNhKG1kZXYpOwogCi1lcnJfaW91bm1hcDoKLQlpb3VubWFwKG1kZXYtPmhjcik7CitlcnJfY21kOgorCW10aGNhX2NtZF9jbGVhbnVwKG1kZXYpOwogCiBlcnJfZnJlZV9kZXY6CiAJaWYgKG1kZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkKQEAgLTExMTgsMTAgKzExMTIsOCBAQAogCQlpb3VubWFwKG1kZXYtPmthcik7CiAJCW10aGNhX3Vhcl9mcmVlKG1kZXYsICZtZGV2LT5kcml2ZXJfdWFyKTsKIAkJbXRoY2FfY2xlYW51cF91YXJfdGFibGUobWRldik7Ci0KIAkJbXRoY2FfY2xvc2VfaGNhKG1kZXYpOwotCi0JCWlvdW5tYXAobWRldi0+aGNyKTsKKwkJbXRoY2FfY21kX2NsZWFudXAobWRldik7CiAKIAkJaWYgKG1kZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkKIAkJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CkBAIC0xMTYzLDcgKzExNTUsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG10aGNhX3BjaV90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtdGhjYV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImliX210aGNhIiwKKwkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBtdGhjYV9wY2lfdGFibGUsCiAJLnByb2JlCQk9IG10aGNhX2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXRoY2FfcmVtb3ZlX29uZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYwppbmRleCA3MGE2NTUzLi41YmU3ZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCkBAIC02NiwyMiArNjYsMjMgQEAKICAqIGVudHJ5IGluIGhhc2ggY2hhaW4gYW5kICptZ20gaG9sZHMgZW5kIG9mIGhhc2ggY2hhaW4uCiAgKi8KIHN0YXRpYyBpbnQgZmluZF9tZ20oc3RydWN0IG10aGNhX2RldiAqZGV2LAotCQkgICAgdTggKmdpZCwgc3RydWN0IG10aGNhX21nbSAqbWdtLAorCQkgICAgdTggKmdpZCwgc3RydWN0IG10aGNhX21haWxib3ggKm1nbV9tYWlsYm94LAogCQkgICAgdTE2ICpoYXNoLCBpbnQgKnByZXYsIGludCAqaW5kZXgpCiB7Ci0Jdm9pZCAqbWFpbGJveDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKKwlzdHJ1Y3QgbXRoY2FfbWdtICptZ20gPSBtZ21fbWFpbGJveC0+YnVmOwogCXU4ICptZ2lkOwogCWludCBlcnI7CiAJdTggc3RhdHVzOwogCi0JbWFpbGJveCA9IGttYWxsb2MoMTYgKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KQorCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWdpZCA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJbWdpZCA9IG1haWxib3gtPmJ1ZjsKIAogCW1lbWNweShtZ2lkLCBnaWQsIDE2KTsKIAotCWVyciA9IG10aGNhX01HSURfSEFTSChkZXYsIG1naWQsIGhhc2gsICZzdGF0dXMpOworCWVyciA9IG10aGNhX01HSURfSEFTSChkZXYsIG1haWxib3gsIGhhc2gsICZzdGF0dXMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWlmIChzdGF0dXMpIHsKQEAgLTEwMyw3ICsxMDQsNyBAQAogCSpwcmV2ICA9IC0xOwogCiAJZG8gewotCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsICppbmRleCwgbWdtLCAmc3RhdHVzKTsKKwkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCAqaW5kZXgsIG1nbV9tYWlsYm94LCAmc3RhdHVzKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdHVzKSB7CkBAIC0xMjksMTQgKzEzMCwxNCBAQAogCSppbmRleCA9IC0xOwogCiAgb3V0OgotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKIGludCBtdGhjYV9tdWx0aWNhc3RfYXR0YWNoKHN0cnVjdCBpYl9xcCAqaWJxcCwgdW5pb24gaWJfZ2lkICpnaWQsIHUxNiBsaWQpCiB7CiAJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihpYnFwLT5kZXZpY2UpOwotCXZvaWQgKm1haWxib3g7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJc3RydWN0IG10aGNhX21nbSAqbWdtOwogCXUxNiBoYXNoOwogCWludCBpbmRleCwgcHJldjsKQEAgLTE0NSwxNSArMTQ2LDE1IEBACiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CiAKLQltYWlsYm94ID0ga21hbGxvYyhzaXplb2YgKm1nbSArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCi0JCXJldHVybiAtRU5PTUVNOwotCW1nbSA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwltZ20gPSBtYWlsYm94LT5idWY7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPm1jZ190YWJsZS5zZW0pKQogCQlyZXR1cm4gLUVJTlRSOwogCi0JZXJyID0gZmluZF9tZ20oZGV2LCBnaWQtPnJhdywgbWdtLCAmaGFzaCwgJnByZXYsICZpbmRleCk7CisJZXJyID0gZmluZF9tZ20oZGV2LCBnaWQtPnJhdywgbWFpbGJveCwgJmhhc2gsICZwcmV2LCAmaW5kZXgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0xNzAsNyArMTcxLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBpbmRleCwgbWdtLCAmc3RhdHVzKTsKKwkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJaWYgKHN0YXR1cykgewpAQCAtMTk1LDcgKzE5Niw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtZ20sICZzdGF0dXMpOworCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtYWlsYm94LCAmc3RhdHVzKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlpZiAoc3RhdHVzKSB7CkBAIC0yMDYsNyArMjA3LDcgQEAKIAlpZiAoIWxpbmspCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBwcmV2LCBtZ20sICZzdGF0dXMpOworCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgcHJldiwgbWFpbGJveCwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAJaWYgKHN0YXR1cykgewpAQCAtMjE3LDcgKzIxOCw3IEBACiAKIAltZ20tPm5leHRfZ2lkX2luZGV4ID0gY3B1X3RvX2JlMzIoaW5kZXggPDwgNSk7CiAKLQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBwcmV2LCBtZ20sICZzdGF0dXMpOworCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1haWxib3gsICZzdGF0dXMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWlmIChzdGF0dXMpIHsKQEAgLTIyNywxNCArMjI4LDE0IEBACiAKICBvdXQ6CiAJdXAoJmRldi0+bWNnX3RhYmxlLnNlbSk7Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG10aGNhX211bHRpY2FzdF9kZXRhY2goc3RydWN0IGliX3FwICppYnFwLCB1bmlvbiBpYl9naWQgKmdpZCwgdTE2IGxpZCkKIHsKIAlzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYgPSB0b19tZGV2KGlicXAtPmRldmljZSk7Ci0Jdm9pZCAqbWFpbGJveDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfbWdtICptZ207CiAJdTE2IGhhc2g7CiAJaW50IHByZXYsIGluZGV4OwpAQCAtMjQyLDE1ICsyNDMsMTUgQEAKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAqbWdtICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWdtID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW1nbSA9IG1haWxib3gtPmJ1ZjsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+bWNnX3RhYmxlLnNlbSkpCiAJCXJldHVybiAtRUlOVFI7CiAKLQllcnIgPSBmaW5kX21nbShkZXYsIGdpZC0+cmF3LCBtZ20sICZoYXNoLCAmcHJldiwgJmluZGV4KTsKKwllcnIgPSBmaW5kX21nbShkZXYsIGdpZC0+cmF3LCBtYWlsYm94LCAmaGFzaCwgJnByZXYsICZpbmRleCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI4NSw3ICsyODYsNyBAQAogCW1nbS0+cXBbbG9jXSAgID0gbWdtLT5xcFtpIC0gMV07CiAJbWdtLT5xcFtpIC0gMV0gPSAwOwogCi0JZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgaW5kZXgsIG1nbSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgaW5kZXgsIG1haWxib3gsICZzdGF0dXMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWlmIChzdGF0dXMpIHsKQEAgLTMwNCw3ICszMDUsNyBAQAogCQlpZiAoYmUzMl90b19jcHUobWdtLT5uZXh0X2dpZF9pbmRleCkgPj4gNSkgewogCQkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LAogCQkJCQkgICAgIGJlMzJfdG9fY3B1KG1nbS0+bmV4dF9naWRfaW5kZXgpID4+IDUsCi0JCQkJCSAgICAgbWdtLCAmc3RhdHVzKTsKKwkJCQkJICAgICBtYWlsYm94LCAmc3RhdHVzKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBvdXQ7CiAJCQlpZiAoc3RhdHVzKSB7CkBAIC0zMTYsNyArMzE3LDcgQEAKIAkJfSBlbHNlCiAJCQltZW1zZXQobWdtLT5naWQsIDAsIDE2KTsKIAotCQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWdtLCAmc3RhdHVzKTsKKwkJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgaW5kZXgsIG1haWxib3gsICZzdGF0dXMpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJCWlmIChzdGF0dXMpIHsKQEAgLTMyNyw3ICszMjgsNyBAQAogCX0gZWxzZSB7CiAJCS8qIFJlbW92ZSBlbnRyeSBmcm9tIEFNR00gKi8KIAkJaW5kZXggPSBiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA1OwotCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIHByZXYsIG1nbSwgJnN0YXR1cyk7CisJCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgcHJldiwgbWFpbGJveCwgJnN0YXR1cyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJaWYgKHN0YXR1cykgewpAQCAtMzM4LDcgKzMzOSw3IEBACiAKIAkJbWdtLT5uZXh0X2dpZF9pbmRleCA9IGNwdV90b19iZTMyKGluZGV4IDw8IDUpOwogCi0JCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1nbSwgJnN0YXR1cyk7CisJCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1haWxib3gsICZzdGF0dXMpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJCWlmIChzdGF0dXMpIHsKQEAgLTM1MCw3ICszNTEsNyBAQAogCiAgb3V0OgogCXVwKCZkZXYtPm1jZ190YWJsZS5zZW0pOwotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5jCmluZGV4IDYzN2IzMGUuLjJhODY0NjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00Nyw2ICs0OCwxNSBAQAogCU1USENBX1RBQkxFX0NIVU5LX1NJWkUgPSAxIDw8IDE4CiB9OwogCitzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSB7CisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKKwlzdHJ1Y3QgeworCQl1NjQgICAgICAgICAgICAgICAgdXZpcnQ7CisJCXN0cnVjdCBzY2F0dGVybGlzdCBtZW07CisJCWludCAgICAgICAgICAgICAgICByZWZjb3VudDsKKwl9ICAgICAgICAgICAgICAgIHBhZ2VbMF07Cit9OworCiB2b2lkIG10aGNhX2ZyZWVfaWNtKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtKQogewogCXN0cnVjdCBtdGhjYV9pY21fY2h1bmsgKmNodW5rLCAqdG1wOwpAQCAtMTc5LDkgKzE4OSwxNCBAQAogCiB2b2lkIG10aGNhX3RhYmxlX3B1dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9pY21fdGFibGUgKnRhYmxlLCBpbnQgb2JqKQogewotCWludCBpID0gKG9iaiAmICh0YWJsZS0+bnVtX29iaiAtIDEpKSAqIHRhYmxlLT5vYmpfc2l6ZSAvIE1USENBX1RBQkxFX0NIVU5LX1NJWkU7CisJaW50IGk7CiAJdTggc3RhdHVzOwogCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybjsKKworCWkgPSAob2JqICYgKHRhYmxlLT5udW1fb2JqIC0gMSkpICogdGFibGUtPm9ial9zaXplIC8gTVRIQ0FfVEFCTEVfQ0hVTktfU0laRTsKKwogCWRvd24oJnRhYmxlLT5tdXRleCk7CiAKIAlpZiAoLS10YWJsZS0+aWNtW2ldLT5yZWZjb3VudCA9PSAwKSB7CkBAIC0yNTYsNiArMjcxLDkgQEAKIHsKIAlpbnQgaTsKIAorCWlmICghbXRoY2FfaXNfbWVtZnJlZShkZXYpKQorCQlyZXR1cm47CisKIAlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkgKz0gTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSAvIHRhYmxlLT5vYmpfc2l6ZSkKIAkJbXRoY2FfdGFibGVfcHV0KGRldiwgdGFibGUsIGkpOwogfQpAQCAtMzM2LDEzICszNTQsMTMzIEBACiAJa2ZyZWUodGFibGUpOwogfQogCi1zdGF0aWMgdTY0IG10aGNhX3VhcmNfdmlydChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBwYWdlKQorc3RhdGljIHU2NCBtdGhjYV91YXJjX3ZpcnQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsIGludCBwYWdlKQogewogCXJldHVybiBkZXYtPnVhcl90YWJsZS51YXJjX2Jhc2UgKwotCQlkZXYtPmRyaXZlcl91YXIuaW5kZXggKiBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgKworCQl1YXItPmluZGV4ICogZGV2LT51YXJfdGFibGUudWFyY19zaXplICsKIAkJcGFnZSAqIDQwOTY7CiB9CiAKK2ludCBtdGhjYV9tYXBfdXNlcl9kYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhciwKKwkJICAgICAgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4LCB1NjQgdWFkZHIpCit7CisJaW50IHJldCA9IDA7CisJdTggc3RhdHVzOworCWludCBpOworCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybiAwOworCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGRldi0+dWFyX3RhYmxlLnVhcmNfc2l6ZSAvIDgpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmZGJfdGFiLT5tdXRleCk7CisKKwlpID0gaW5kZXggLyBNVEhDQV9EQl9SRUNfUEVSX1BBR0U7CisKKwlpZiAoKGRiX3RhYi0+cGFnZVtpXS5yZWZjb3VudCA+PSBNVEhDQV9EQl9SRUNfUEVSX1BBR0UpICAgICAgIHx8CisJICAgIChkYl90YWItPnBhZ2VbaV0udXZpcnQgJiYgZGJfdGFiLT5wYWdlW2ldLnV2aXJ0ICE9IHVhZGRyKSB8fAorCSAgICAodWFkZHIgJiA0MDk1KSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50KSB7CisJCSsrZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50OworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgdWFkZHIgJiBQQUdFX01BU0ssIDEsIDEsIDAsCisJCQkgICAgICZkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWRiX3RhYi0+cGFnZVtpXS5tZW0ubGVuZ3RoID0gNDA5NjsKKwlkYl90YWItPnBhZ2VbaV0ubWVtLm9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKworCXJldCA9IHBjaV9tYXBfc2coZGV2LT5wZGV2LCAmZGJfdGFiLT5wYWdlW2ldLm1lbSwgMSwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHV0X3BhZ2UoZGJfdGFiLT5wYWdlW2ldLm1lbS5wYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbXRoY2FfTUFQX0lDTV9wYWdlKGRldiwgc2dfZG1hX2FkZHJlc3MoJmRiX3RhYi0+cGFnZVtpXS5tZW0pLAorCQkJCSBtdGhjYV91YXJjX3ZpcnQoZGV2LCB1YXIsIGkpLCAmc3RhdHVzKTsKKwlpZiAoIXJldCAmJiBzdGF0dXMpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHJldCkgeworCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAmZGJfdGFiLT5wYWdlW2ldLm1lbSwgMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCXB1dF9wYWdlKGRiX3RhYi0+cGFnZVtpXS5tZW0ucGFnZSk7CisJCWdvdG8gb3V0OworCX0KKworCWRiX3RhYi0+cGFnZVtpXS51dmlydCAgICA9IHVhZGRyOworCWRiX3RhYi0+cGFnZVtpXS5yZWZjb3VudCA9IDE7CisKK291dDoKKwl1cCgmZGJfdGFiLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBtdGhjYV91bm1hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkJIHN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWIsIGludCBpbmRleCkKK3sKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUbyBtYWtlIG91ciBib29ra2VlcGluZyBzaW1wbGVyLCB3ZSBkb24ndCB1bm1hcCBEQgorCSAqIHBhZ2VzIHVudGlsIHdlIGNsZWFuIHVwIHRoZSB3aG9sZSBkYiB0YWJsZS4KKwkgKi8KKworCWRvd24oJmRiX3RhYi0+bXV0ZXgpOworCisJLS1kYl90YWItPnBhZ2VbaW5kZXggLyBNVEhDQV9EQl9SRUNfUEVSX1BBR0VdLnJlZmNvdW50OworCisJdXAoJmRiX3RhYi0+bXV0ZXgpOworfQorCitzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqbXRoY2FfaW5pdF91c2VyX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCit7CisJc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYjsKKwlpbnQgbnBhZ2VzOworCWludCBpOworCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybiBOVUxMOworCisJbnBhZ2VzID0gZGV2LT51YXJfdGFibGUudWFyY19zaXplIC8gNDA5NjsKKwlkYl90YWIgPSBrbWFsbG9jKHNpemVvZiAqZGJfdGFiICsgbnBhZ2VzICogc2l6ZW9mICpkYl90YWItPnBhZ2UsIEdGUF9LRVJORUwpOworCWlmICghZGJfdGFiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXRfTVVURVgoJmRiX3RhYi0+bXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSkgeworCQlkYl90YWItPnBhZ2VbaV0ucmVmY291bnQgPSAwOworCQlkYl90YWItPnBhZ2VbaV0udXZpcnQgICAgPSAwOworCX0KKworCXJldHVybiBkYl90YWI7Cit9CisKK3ZvaWQgbXRoY2FfY2xlYW51cF91c2VyX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhciwKKwkJCSAgICAgICBzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiKQoreworCWludCBpOworCXU4IHN0YXR1czsKKworCWlmICghbXRoY2FfaXNfbWVtZnJlZShkZXYpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT51YXJfdGFibGUudWFyY19zaXplIC8gNDA5NjsgKytpKSB7CisJCWlmIChkYl90YWItPnBhZ2VbaV0udXZpcnQpIHsKKwkJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsIHVhciwgaSksIDEsICZzdGF0dXMpOworCQkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwgJmRiX3RhYi0+cGFnZVtpXS5tZW0sIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcHV0X3BhZ2UoZGJfdGFiLT5wYWdlW2ldLm1lbS5wYWdlKTsKKwkJfQorCX0KK30KKwogaW50IG10aGNhX2FsbG9jX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxbiwgdTMyICoqZGIpCiB7CiAJaW50IGdyb3VwOwpAQCAtMzk5LDcgKzUzNyw4IEBACiAJfQogCW1lbXNldChwYWdlLT5kYl9yZWMsIDAsIDQwOTYpOwogCi0JcmV0ID0gbXRoY2FfTUFQX0lDTV9wYWdlKGRldiwgcGFnZS0+bWFwcGluZywgbXRoY2FfdWFyY192aXJ0KGRldiwgaSksICZzdGF0dXMpOworCXJldCA9IG10aGNhX01BUF9JQ01fcGFnZShkZXYsIHBhZ2UtPm1hcHBpbmcsCisJCQkJIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAmc3RhdHVzKTsKIAlpZiAoIXJldCAmJiBzdGF0dXMpCiAJCXJldCA9IC1FSU5WQUw7CiAJaWYgKHJldCkgewpAQCAtNDUzLDcgKzU5Miw3IEBACiAKIAlpZiAoYml0bWFwX2VtcHR5KHBhZ2UtPnVzZWQsIE1USENBX0RCX1JFQ19QRVJfUEFHRSkgJiYKIAkgICAgaSA+PSBkZXYtPmRiX3RhYi0+bWF4X2dyb3VwMSAtIDEpIHsKLQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgaSksIDEsICZzdGF0dXMpOworCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCAmZGV2LT5kcml2ZXJfdWFyLCBpKSwgMSwgJnN0YXR1cyk7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCA0MDk2LAogCQkJCSAgcGFnZS0+ZGJfcmVjLCBwYWdlLT5tYXBwaW5nKTsKQEAgLTUyMiw3ICs2NjEsNyBAQAogCQlpZiAoIWJpdG1hcF9lbXB0eShkZXYtPmRiX3RhYi0+cGFnZVtpXS51c2VkLCBNVEhDQV9EQl9SRUNfUEVSX1BBR0UpKQogCQkJbXRoY2Ffd2FybihkZXYsICJLZXJuZWwgVUFSQyBwYWdlICVkIG5vdCBlbXB0eVxuIiwgaSk7CiAKLQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgaSksIDEsICZzdGF0dXMpOworCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCAmZGV2LT5kcml2ZXJfdWFyLCBpKSwgMSwgJnN0YXR1cyk7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCA0MDk2LAogCQkJCSAgZGV2LT5kYl90YWItPnBhZ2VbaV0uZGJfcmVjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmgKaW5kZXggZmU3YmUyYS4uNDc2MWQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJc3RydWN0IHNlbWFwaG9yZSAgICAgIG11dGV4OwogfTsKIAotZW51bSB7CitlbnVtIG10aGNhX2RiX3R5cGUgewogCU1USENBX0RCX1RZUEVfSU5WQUxJRCAgID0gMHgwLAogCU1USENBX0RCX1RZUEVfQ1FfU0VUX0NJID0gMHgxLAogCU1USENBX0RCX1RZUEVfQ1FfQVJNICAgID0gMHgyLApAQCAtMTU4LDYgKzE1OSwxNyBAQAogCU1USENBX0RCX1RZUEVfR1JPVVBfU0VQID0gMHg3CiB9OwogCitzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZTsKK3N0cnVjdCBtdGhjYV91YXI7CisKK2ludCBtdGhjYV9tYXBfdXNlcl9kYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhciwKKwkJICAgICAgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4LCB1NjQgdWFkZHIpOwordm9pZCBtdGhjYV91bm1hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkJIHN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWIsIGludCBpbmRleCk7CitzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqbXRoY2FfaW5pdF91c2VyX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwordm9pZCBtdGhjYV9jbGVhbnVwX3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkJICAgICAgIHN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWIpOworCiBpbnQgbXRoY2FfaW5pdF9kYl90YWIoc3RydWN0IG10aGNhX2RldiAqZGV2KTsKIHZvaWQgbXRoY2FfY2xlYW51cF9kYl90YWIoc3RydWN0IG10aGNhX2RldiAqZGV2KTsKIGludCBtdGhjYV9hbGxvY19kYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCB0eXBlLCB1MzIgcW4sIHUzMiAqKmRiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMKaW5kZXggODk2MGZjMi4uY2JlNTBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMKQEAgLTQwLDYgKzQwLDEyIEBACiAjaW5jbHVkZSAibXRoY2FfY21kLmgiCiAjaW5jbHVkZSAibXRoY2FfbWVtZnJlZS5oIgogCitzdHJ1Y3QgbXRoY2FfbXR0IHsKKwlzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5OworCWludCAgICAgICAgICAgICAgICAgb3JkZXI7CisJdTMyICAgICAgICAgICAgICAgICBmaXJzdF9zZWc7Cit9OworCiAvKgogICogTXVzdCBiZSBwYWNrZWQgYmVjYXVzZSBtdHRfc2VnIGlzIDY0IGJpdHMgYnV0IG9ubHkgYWxpZ25lZCB0byAzMiBiaXRzLgogICovCkBAIC0xNzMsOCArMTc5LDggQEAKIAlrZnJlZShidWRkeS0+Yml0cyk7CiB9CiAKLXN0YXRpYyB1MzIgbXRoY2FfYWxsb2NfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IG9yZGVyLAotCQkJICAgc3RydWN0IG10aGNhX2J1ZGR5ICpidWRkeSkKK3N0YXRpYyB1MzIgbXRoY2FfYWxsb2NfbXR0X3JhbmdlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IG9yZGVyLAorCQkJCSBzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5KQogewogCXUzMiBzZWcgPSBtdGhjYV9idWRkeV9hbGxvYyhidWRkeSwgb3JkZXIpOwogCkBAIC0xOTEsMTQgKzE5NywxMDIgQEAKIAlyZXR1cm4gc2VnOwogfQogCi1zdGF0aWMgdm9pZCBtdGhjYV9mcmVlX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBzZWcsIGludCBvcmRlciwKLQkJCSAgIHN0cnVjdCBtdGhjYV9idWRkeSogYnVkZHkpCitzdGF0aWMgc3RydWN0IG10aGNhX210dCAqX19tdGhjYV9hbGxvY19tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgc2l6ZSwKKwkJCQkJICAgc3RydWN0IG10aGNhX2J1ZGR5ICpidWRkeSkKIHsKLQltdGhjYV9idWRkeV9mcmVlKGJ1ZGR5LCBzZWcsIG9yZGVyKTsKKwlzdHJ1Y3QgbXRoY2FfbXR0ICptdHQ7CisJaW50IGk7CiAKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQotCQltdGhjYV90YWJsZV9wdXRfcmFuZ2UoZGV2LCBkZXYtPm1yX3RhYmxlLm10dF90YWJsZSwgc2VnLAotCQkJCSAgICAgIHNlZyArICgxIDw8IG9yZGVyKSAtIDEpOworCWlmIChzaXplIDw9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbXR0ID0ga21hbGxvYyhzaXplb2YgKm10dCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdHQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbXR0LT5idWRkeSA9IGJ1ZGR5OworCW10dC0+b3JkZXIgPSAwOworCWZvciAoaSA9IE1USENBX01UVF9TRUdfU0laRSAvIDg7IGkgPCBzaXplOyBpIDw8PSAxKQorCQkrK210dC0+b3JkZXI7CisKKwltdHQtPmZpcnN0X3NlZyA9IG10aGNhX2FsbG9jX210dF9yYW5nZShkZXYsIG10dC0+b3JkZXIsIGJ1ZGR5KTsKKwlpZiAobXR0LT5maXJzdF9zZWcgPT0gLTEpIHsKKwkJa2ZyZWUobXR0KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIG10dDsKK30KKworc3RydWN0IG10aGNhX210dCAqbXRoY2FfYWxsb2NfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHNpemUpCit7CisJcmV0dXJuIF9fbXRoY2FfYWxsb2NfbXR0KGRldiwgc2l6ZSwgJmRldi0+bXJfdGFibGUubXR0X2J1ZGR5KTsKK30KKwordm9pZCBtdGhjYV9mcmVlX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tdHQgKm10dCkKK3sKKwlpZiAoIW10dCkKKwkJcmV0dXJuOworCisJbXRoY2FfYnVkZHlfZnJlZShtdHQtPmJ1ZGR5LCBtdHQtPmZpcnN0X3NlZywgbXR0LT5vcmRlcik7CisKKwltdGhjYV90YWJsZV9wdXRfcmFuZ2UoZGV2LCBkZXYtPm1yX3RhYmxlLm10dF90YWJsZSwKKwkJCSAgICAgIG10dC0+Zmlyc3Rfc2VnLAorCQkJICAgICAgbXR0LT5maXJzdF9zZWcgKyAoMSA8PCBtdHQtPm9yZGVyKSAtIDEpOworCisJa2ZyZWUobXR0KTsKK30KKworaW50IG10aGNhX3dyaXRlX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tdHQgKm10dCwKKwkJICAgIGludCBzdGFydF9pbmRleCwgdTY0ICpidWZmZXJfbGlzdCwgaW50IGxpc3RfbGVuKQoreworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OworCXU2NCAqbXR0X2VudHJ5OworCWludCBlcnIgPSAwOworCXU4IHN0YXR1czsKKwlpbnQgaTsKKworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJbXR0X2VudHJ5ID0gbWFpbGJveC0+YnVmOworCisJd2hpbGUgKGxpc3RfbGVuID4gMCkgeworCQltdHRfZW50cnlbMF0gPSBjcHVfdG9fYmU2NChkZXYtPm1yX3RhYmxlLm10dF9iYXNlICsKKwkJCQkJICAgbXR0LT5maXJzdF9zZWcgKiBNVEhDQV9NVFRfU0VHX1NJWkUgKworCQkJCQkgICBzdGFydF9pbmRleCAqIDgpOworCQltdHRfZW50cnlbMV0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbGlzdF9sZW4gJiYgaSA8IE1USENBX01BSUxCT1hfU0laRSAvIDggLSAyOyArK2kpCisJCQltdHRfZW50cnlbaSArIDJdID0gY3B1X3RvX2JlNjQoYnVmZmVyX2xpc3RbaV0gfAorCQkJCQkJICAgICAgIE1USENBX01UVF9GTEFHX1BSRVNFTlQpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzIHRvIHdyaXRlLCBhZGQKKwkJICogb25lIG1vcmUgZHVtbXkgZW50cnkgZm9yIGZpcm13YXJlIGVmZmljaWVuY3kuCisJCSAqLworCQlpZiAoaSAmIDEpCisJCQltdHRfZW50cnlbaSArIDJdID0gMDsKKworCQllcnIgPSBtdGhjYV9XUklURV9NVFQoZGV2LCBtYWlsYm94LCAoaSArIDEpICYgfjEsICZzdGF0dXMpOworCQlpZiAoZXJyKSB7CisJCQltdGhjYV93YXJuKGRldiwgIldSSVRFX01UVCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChzdGF0dXMpIHsKKwkJCW10aGNhX3dhcm4oZGV2LCAiV1JJVEVfTVRUIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCisJCQkJICAgc3RhdHVzKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxpc3RfbGVuICAgIC09IGk7CisJCXN0YXJ0X2luZGV4ICs9IGk7CisJCWJ1ZmZlcl9saXN0ICs9IGk7CisJfQorCitvdXQ6CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgdGF2b3JfaHdfaW5kZXhfdG9fa2V5KHUzMiBpbmQpCkBAIC0yMzcsOTEgKzMzMSwxOCBAQAogCQlyZXR1cm4gdGF2b3Jfa2V5X3RvX2h3X2luZGV4KGtleSk7CiB9CiAKLWludCBtdGhjYV9tcl9hbGxvY19ub3RyYW5zKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLAotCQkJICAgdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcikKK2ludCBtdGhjYV9tcl9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwgaW50IGJ1ZmZlcl9zaXplX3NoaWZ0LAorCQkgICB1NjQgaW92YSwgdTY0IHRvdGFsX3NpemUsIHUzMiBhY2Nlc3MsIHN0cnVjdCBtdGhjYV9tciAqbXIpCiB7Ci0Jdm9pZCAqbWFpbGJveCA9IE5VTEw7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJc3RydWN0IG10aGNhX21wdF9lbnRyeSAqbXB0X2VudHJ5OwogCXUzMiBrZXk7CisJaW50IGk7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CiAKIAltaWdodF9zbGVlcCgpOwogCi0JbXItPm9yZGVyID0gLTE7Ci0Ja2V5ID0gbXRoY2FfYWxsb2MoJmRldi0+bXJfdGFibGUubXB0X2FsbG9jKTsKLQlpZiAoa2V5ID09IC0xKQotCQlyZXR1cm4gLUVOT01FTTsKLQltci0+aWJtci5ya2V5ID0gbXItPmlibXIubGtleSA9IGh3X2luZGV4X3RvX2tleShkZXYsIGtleSk7Ci0KLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7Ci0JCWVyciA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLCBrZXkpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X21wdF9mcmVlOwotCX0KLQotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAqbXB0X2VudHJ5ICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXRfdGFibGU7Ci0JfQotCW1wdF9lbnRyeSA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7Ci0KLQltcHRfZW50cnktPmZsYWdzID0gY3B1X3RvX2JlMzIoTVRIQ0FfTVBUX0ZMQUdfU1dfT1dOUyAgICAgfAotCQkJCSAgICAgICBNVEhDQV9NUFRfRkxBR19NSU8gICAgICAgICB8Ci0JCQkJICAgICAgIE1USENBX01QVF9GTEFHX1BIWVNJQ0FMICAgIHwKLQkJCQkgICAgICAgTVRIQ0FfTVBUX0ZMQUdfUkVHSU9OICAgICAgfAotCQkJCSAgICAgICBhY2Nlc3MpOwotCW1wdF9lbnRyeS0+cGFnZV9zaXplID0gMDsKLQltcHRfZW50cnktPmtleSAgICAgICA9IGNwdV90b19iZTMyKGtleSk7Ci0JbXB0X2VudHJ5LT5wZCAgICAgICAgPSBjcHVfdG9fYmUzMihwZCk7Ci0JbXB0X2VudHJ5LT5zdGFydCAgICAgPSAwOwotCW1wdF9lbnRyeS0+bGVuZ3RoICAgID0gfjBVTEw7Ci0KLQltZW1zZXQoJm1wdF9lbnRyeS0+bGtleSwgMCwKLQkgICAgICAgc2l6ZW9mICptcHRfZW50cnkgLSBvZmZzZXRvZihzdHJ1Y3QgbXRoY2FfbXB0X2VudHJ5LCBsa2V5KSk7Ci0KLQllcnIgPSBtdGhjYV9TVzJIV19NUFQoZGV2LCBtcHRfZW50cnksCi0JCQkgICAgICBrZXkgJiAoZGV2LT5saW1pdHMubnVtX21wdHMgLSAxKSwKLQkJCSAgICAgICZzdGF0dXMpOwotCWlmIChlcnIpIHsKLQkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19NUFQgZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZXJyX291dF90YWJsZTsKLQl9IGVsc2UgaWYgKHN0YXR1cykgewotCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgc3RhdHVzKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0X3RhYmxlOwotCX0KLQotCWtmcmVlKG1haWxib3gpOwotCXJldHVybiBlcnI7Ci0KLWVycl9vdXRfdGFibGU6Ci0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKLQkJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5tcl90YWJsZS5tcHRfdGFibGUsIGtleSk7Ci0KLWVycl9vdXRfbXB0X2ZyZWU6Ci0JbXRoY2FfZnJlZSgmZGV2LT5tcl90YWJsZS5tcHRfYWxsb2MsIGtleSk7Ci0Ja2ZyZWUobWFpbGJveCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotaW50IG10aGNhX21yX2FsbG9jX3BoeXMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsCi0JCQl1NjQgKmJ1ZmZlcl9saXN0LCBpbnQgYnVmZmVyX3NpemVfc2hpZnQsCi0JCQlpbnQgbGlzdF9sZW4sIHU2NCBpb3ZhLCB1NjQgdG90YWxfc2l6ZSwKLQkJCXUzMiBhY2Nlc3MsIHN0cnVjdCBtdGhjYV9tciAqbXIpCi17Ci0Jdm9pZCAqbWFpbGJveDsKLQl1NjQgKm10dF9lbnRyeTsKLQlzdHJ1Y3QgbXRoY2FfbXB0X2VudHJ5ICptcHRfZW50cnk7Ci0JdTMyIGtleTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQl1OCBzdGF0dXM7Ci0JaW50IGk7Ci0KLQltaWdodF9zbGVlcCgpOwogCVdBUk5fT04oYnVmZmVyX3NpemVfc2hpZnQgPj0gMzIpOwogCiAJa2V5ID0gbXRoY2FfYWxsb2MoJmRldi0+bXJfdGFibGUubXB0X2FsbG9jKTsKQEAgLTMzNSw3NSArMzU2LDMzIEBACiAJCQlnb3RvIGVycl9vdXRfbXB0X2ZyZWU7CiAJfQogCi0JZm9yIChpID0gTVRIQ0FfTVRUX1NFR19TSVpFIC8gOCwgbXItPm9yZGVyID0gMDsKLQkgICAgIGkgPCBsaXN0X2xlbjsKLQkgICAgIGkgPDw9IDEsICsrbXItPm9yZGVyKQotCQk7IC8qIG5vdGhpbmcgKi8KLQotCW1yLT5maXJzdF9zZWcgPSBtdGhjYV9hbGxvY19tdHQoZGV2LCBtci0+b3JkZXIsCi0JCQkJICAgICAgIAkmZGV2LT5tcl90YWJsZS5tdHRfYnVkZHkpOwotCWlmIChtci0+Zmlyc3Rfc2VnID09IC0xKQorCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkgeworCQllcnIgPSBQVFJfRVJSKG1haWxib3gpOwogCQlnb3RvIGVycl9vdXRfdGFibGU7Ci0KLQkvKgotCSAqIElmIGxpc3RfbGVuIGlzIG9kZCwgd2UgYWRkIG9uZSBtb3JlIGR1bW15IGVudHJ5IGZvcgotCSAqIGZpcm13YXJlIGVmZmljaWVuY3kuCi0JICovCi0JbWFpbGJveCA9IGttYWxsb2MobWF4KHNpemVvZiAqbXB0X2VudHJ5LAotCQkJICAgICAgKHNpemVfdCkgOCAqIChsaXN0X2xlbiArIChsaXN0X2xlbiAmIDEpICsgMikpICsKLQkJCSAgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKLQkJZ290byBlcnJfb3V0X2ZyZWVfbXR0OwotCi0JbXR0X2VudHJ5ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKLQotCW10dF9lbnRyeVswXSA9IGNwdV90b19iZTY0KGRldi0+bXJfdGFibGUubXR0X2Jhc2UgKwotCQkJCSAgIG1yLT5maXJzdF9zZWcgKiBNVEhDQV9NVFRfU0VHX1NJWkUpOwotCW10dF9lbnRyeVsxXSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGxpc3RfbGVuOyArK2kpCi0JCW10dF9lbnRyeVtpICsgMl0gPSBjcHVfdG9fYmU2NChidWZmZXJfbGlzdFtpXSB8Ci0JCQkJCSAgICAgICBNVEhDQV9NVFRfRkxBR19QUkVTRU5UKTsKLQlpZiAobGlzdF9sZW4gJiAxKSB7Ci0JCW10dF9lbnRyeVtpICsgMl0gPSAwOwotCQkrK2xpc3RfbGVuOwogCX0KLQotCWlmICgwKSB7Ci0JCW10aGNhX2RiZyhkZXYsICJEdW1waW5nIE1QVCBlbnRyeVxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBsaXN0X2xlbiArIDI7ICsraSkKLQkJCXByaW50ayhLRVJOX0VSUiAiWyUyZF0gJTAxNmxseFxuIiwKLQkJCSAgICAgICBpLCAodW5zaWduZWQgbG9uZyBsb25nKSBiZTY0X3RvX2NwdShtdHRfZW50cnlbaV0pKTsKLQl9Ci0KLQllcnIgPSBtdGhjYV9XUklURV9NVFQoZGV2LCBtdHRfZW50cnksIGxpc3RfbGVuLCAmc3RhdHVzKTsKLQlpZiAoZXJyKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiV1JJVEVfTVRUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGVycl9vdXRfbWFpbGJveF9mcmVlOwotCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiV1JJVEVfTVRUIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfbWFpbGJveF9mcmVlOwotCX0KLQotCW1wdF9lbnRyeSA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJbXB0X2VudHJ5ID0gbWFpbGJveC0+YnVmOwogCiAJbXB0X2VudHJ5LT5mbGFncyA9IGNwdV90b19iZTMyKE1USENBX01QVF9GTEFHX1NXX09XTlMgICAgIHwKIAkJCQkgICAgICAgTVRIQ0FfTVBUX0ZMQUdfTUlPICAgICAgICAgfAogCQkJCSAgICAgICBNVEhDQV9NUFRfRkxBR19SRUdJT04gICAgICB8CiAJCQkJICAgICAgIGFjY2Vzcyk7CisJaWYgKCFtci0+bXR0KQorCQltcHRfZW50cnktPmZsYWdzIHw9IGNwdV90b19iZTMyKE1USENBX01QVF9GTEFHX1BIWVNJQ0FMKTsKIAogCW1wdF9lbnRyeS0+cGFnZV9zaXplID0gY3B1X3RvX2JlMzIoYnVmZmVyX3NpemVfc2hpZnQgLSAxMik7CiAJbXB0X2VudHJ5LT5rZXkgICAgICAgPSBjcHVfdG9fYmUzMihrZXkpOwogCW1wdF9lbnRyeS0+cGQgICAgICAgID0gY3B1X3RvX2JlMzIocGQpOwogCW1wdF9lbnRyeS0+c3RhcnQgICAgID0gY3B1X3RvX2JlNjQoaW92YSk7CiAJbXB0X2VudHJ5LT5sZW5ndGggICAgPSBjcHVfdG9fYmU2NCh0b3RhbF9zaXplKTsKKwogCW1lbXNldCgmbXB0X2VudHJ5LT5sa2V5LCAwLAogCSAgICAgICBzaXplb2YgKm1wdF9lbnRyeSAtIG9mZnNldG9mKHN0cnVjdCBtdGhjYV9tcHRfZW50cnksIGxrZXkpKTsKLQltcHRfZW50cnktPm10dF9zZWcgICA9IGNwdV90b19iZTY0KGRldi0+bXJfdGFibGUubXR0X2Jhc2UgKwotCQkJCQkgICBtci0+Zmlyc3Rfc2VnICogTVRIQ0FfTVRUX1NFR19TSVpFKTsKKworCWlmIChtci0+bXR0KQorCQltcHRfZW50cnktPm10dF9zZWcgPQorCQkJY3B1X3RvX2JlNjQoZGV2LT5tcl90YWJsZS5tdHRfYmFzZSArCisJCQkJICAgIG1yLT5tdHQtPmZpcnN0X3NlZyAqIE1USENBX01UVF9TRUdfU0laRSk7CiAKIAlpZiAoMCkgewogCQltdGhjYV9kYmcoZGV2LCAiRHVtcGluZyBNUFQgZW50cnkgJTA4eDpcbiIsIG1yLT5pYm1yLmxrZXkpOwpAQCAtNDE2LDQ1ICszOTUsNzAgQEAKIAkJfQogCX0KIAotCWVyciA9IG10aGNhX1NXMkhXX01QVChkZXYsIG1wdF9lbnRyeSwKKwllcnIgPSBtdGhjYV9TVzJIV19NUFQoZGV2LCBtYWlsYm94LAogCQkJICAgICAga2V5ICYgKGRldi0+bGltaXRzLm51bV9tcHRzIC0gMSksCiAJCQkgICAgICAmc3RhdHVzKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19NUFQgZmFpbGVkICglZClcbiIsIGVycik7Ci0JZWxzZSBpZiAoc3RhdHVzKSB7CisJCWdvdG8gZXJyX291dF9tYWlsYm94OworCX0gZWxzZSBpZiAoc3RhdHVzKSB7CiAJCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfTVBUIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCiAJCQkgICBzdGF0dXMpOwogCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXRfbWFpbGJveDsKIAl9CiAKLQlrZnJlZShtYWlsYm94KTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogCi1lcnJfb3V0X21haWxib3hfZnJlZToKLQlrZnJlZShtYWlsYm94KTsKLQotZXJyX291dF9mcmVlX210dDoKLQltdGhjYV9mcmVlX210dChkZXYsIG1yLT5maXJzdF9zZWcsIG1yLT5vcmRlciwgJmRldi0+bXJfdGFibGUubXR0X2J1ZGR5KTsKK2Vycl9vdXRfbWFpbGJveDoKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAogZXJyX291dF90YWJsZToKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPm1yX3RhYmxlLm1wdF90YWJsZSwga2V5KTsKKwltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPm1yX3RhYmxlLm1wdF90YWJsZSwga2V5KTsKIAogZXJyX291dF9tcHRfZnJlZToKIAltdGhjYV9mcmVlKCZkZXYtPm1yX3RhYmxlLm1wdF9hbGxvYywga2V5KTsKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBGcmVlIG1yIG9yIGZtciAqLwotc3RhdGljIHZvaWQgbXRoY2FfZnJlZV9yZWdpb24oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgbGtleSwgaW50IG9yZGVyLAotCQkJICAgICAgdTMyIGZpcnN0X3NlZywgc3RydWN0IG10aGNhX2J1ZGR5ICpidWRkeSkKK2ludCBtdGhjYV9tcl9hbGxvY19ub3RyYW5zKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLAorCQkJICAgdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcikKIHsKLQlpZiAob3JkZXIgPj0gMCkKLQkJbXRoY2FfZnJlZV9tdHQoZGV2LCBmaXJzdF9zZWcsIG9yZGVyLCBidWRkeSk7CisJbXItPm10dCA9IE5VTEw7CisJcmV0dXJuIG10aGNhX21yX2FsbG9jKGRldiwgcGQsIDEyLCAwLCB+MFVMTCwgYWNjZXNzLCBtcik7Cit9CiAKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPm1yX3RhYmxlLm1wdF90YWJsZSwKLQkJCQlhcmJlbF9rZXlfdG9faHdfaW5kZXgobGtleSkpOworaW50IG10aGNhX21yX2FsbG9jX3BoeXMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsCisJCQl1NjQgKmJ1ZmZlcl9saXN0LCBpbnQgYnVmZmVyX3NpemVfc2hpZnQsCisJCQlpbnQgbGlzdF9sZW4sIHU2NCBpb3ZhLCB1NjQgdG90YWxfc2l6ZSwKKwkJCXUzMiBhY2Nlc3MsIHN0cnVjdCBtdGhjYV9tciAqbXIpCit7CisJaW50IGVycjsKKworCW1yLT5tdHQgPSBtdGhjYV9hbGxvY19tdHQoZGV2LCBsaXN0X2xlbik7CisJaWYgKElTX0VSUihtci0+bXR0KSkKKwkJcmV0dXJuIFBUUl9FUlIobXItPm10dCk7CisKKwllcnIgPSBtdGhjYV93cml0ZV9tdHQoZGV2LCBtci0+bXR0LCAwLCBidWZmZXJfbGlzdCwgbGlzdF9sZW4pOworCWlmIChlcnIpIHsKKwkJbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+bXR0KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBtdGhjYV9tcl9hbGxvYyhkZXYsIHBkLCBidWZmZXJfc2l6ZV9zaGlmdCwgaW92YSwKKwkJCSAgICAgdG90YWxfc2l6ZSwgYWNjZXNzLCBtcik7CisJaWYgKGVycikKKwkJbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+bXR0KTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIEZyZWUgbXIgb3IgZm1yICovCitzdGF0aWMgdm9pZCBtdGhjYV9mcmVlX3JlZ2lvbihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBsa2V5KQoreworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLAorCQkJYXJiZWxfa2V5X3RvX2h3X2luZGV4KGxrZXkpKTsKIAogCW10aGNhX2ZyZWUoJmRldi0+bXJfdGFibGUubXB0X2FsbG9jLCBrZXlfdG9faHdfaW5kZXgoZGV2LCBsa2V5KSk7CiB9CkBAIC00NzYsMTUgKzQ4MCwxNSBAQAogCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX01QVCByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAogCQkJICAgc3RhdHVzKTsKIAotCW10aGNhX2ZyZWVfcmVnaW9uKGRldiwgbXItPmlibXIubGtleSwgbXItPm9yZGVyLCBtci0+Zmlyc3Rfc2VnLAotCQkJICAmZGV2LT5tcl90YWJsZS5tdHRfYnVkZHkpOworCW10aGNhX2ZyZWVfcmVnaW9uKGRldiwgbXItPmlibXIubGtleSk7CisJbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+bXR0KTsKIH0KIAogaW50IG10aGNhX2Ztcl9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwKIAkJICAgIHUzMiBhY2Nlc3MsIHN0cnVjdCBtdGhjYV9mbXIgKm1yKQogewogCXN0cnVjdCBtdGhjYV9tcHRfZW50cnkgKm1wdF9lbnRyeTsKLQl2b2lkICptYWlsYm94OworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXU2NCBtdHRfc2VnOwogCXUzMiBrZXksIGlkeDsKIAl1OCBzdGF0dXM7CkBAIC01MjIsMzEgKzUyNiwyNCBAQAogCQltci0+bWVtLnRhdm9yLm1wdCA9IGRldi0+bXJfdGFibGUudGF2b3JfZm1yLm1wdF9iYXNlICsKIAkJICAgICAgIAlzaXplb2YgKihtci0+bWVtLnRhdm9yLm1wdCkgKiBpZHg7CiAKLQlmb3IgKGkgPSBNVEhDQV9NVFRfU0VHX1NJWkUgLyA4LCBtci0+b3JkZXIgPSAwOwotCSAgICAgaSA8IGxpc3RfbGVuOwotCSAgICAgaSA8PD0gMSwgKyttci0+b3JkZXIpCi0JCTsgLyogbm90aGluZyAqLwotCi0JbXItPmZpcnN0X3NlZyA9IG10aGNhX2FsbG9jX210dChkZXYsIG1yLT5vcmRlciwKLQkJCQkgICAgICAgCWRldi0+bXJfdGFibGUuZm1yX210dF9idWRkeSk7Ci0JaWYgKG1yLT5maXJzdF9zZWcgPT0gLTEpCisJbXItPm10dCA9IF9fbXRoY2FfYWxsb2NfbXR0KGRldiwgbGlzdF9sZW4sIGRldi0+bXJfdGFibGUuZm1yX210dF9idWRkeSk7CisJaWYgKElTX0VSUihtci0+bXR0KSkKIAkJZ290byBlcnJfb3V0X3RhYmxlOwogCi0JbXR0X3NlZyA9IG1yLT5maXJzdF9zZWcgKiBNVEhDQV9NVFRfU0VHX1NJWkU7CisJbXR0X3NlZyA9IG1yLT5tdHQtPmZpcnN0X3NlZyAqIE1USENBX01UVF9TRUdfU0laRTsKIAogCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKIAkJbXItPm1lbS5hcmJlbC5tdHRzID0gbXRoY2FfdGFibGVfZmluZChkZXYtPm1yX3RhYmxlLm10dF90YWJsZSwKLQkJCQkJCSAgICAgIG1yLT5maXJzdF9zZWcpOworCQkJCQkJICAgICAgbXItPm10dC0+Zmlyc3Rfc2VnKTsKIAkJQlVHX09OKCFtci0+bWVtLmFyYmVsLm10dHMpOwogCX0gZWxzZQogCQltci0+bWVtLnRhdm9yLm10dHMgPSBkZXYtPm1yX3RhYmxlLnRhdm9yX2Ztci5tdHRfYmFzZSArIG10dF9zZWc7CiAKLQltYWlsYm94ID0ga21hbGxvYyhzaXplb2YgKm1wdF9lbnRyeSArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLAotCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlnb3RvIGVycl9vdXRfZnJlZV9tdHQ7CiAKLQltcHRfZW50cnkgPSBNQUlMQk9YX0FMSUdOKG1haWxib3gpOworCW1wdF9lbnRyeSA9IG1haWxib3gtPmJ1ZjsKIAogCW1wdF9lbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fYmUzMihNVEhDQV9NUFRfRkxBR19TV19PV05TICAgICB8CiAJCQkJICAgICAgIE1USENBX01QVF9GTEFHX01JTyAgICAgICAgIHwKQEAgLTU3MSw3ICs1NjgsNyBAQAogCQl9CiAJfQogCi0JZXJyID0gbXRoY2FfU1cySFdfTVBUKGRldiwgbXB0X2VudHJ5LAorCWVyciA9IG10aGNhX1NXMkhXX01QVChkZXYsIG1haWxib3gsCiAJCQkgICAgICBrZXkgJiAoZGV2LT5saW1pdHMubnVtX21wdHMgLSAxKSwKIAkJCSAgICAgICZzdGF0dXMpOwogCWlmIChlcnIpIHsKQEAgLTU4NSwxOSArNTgyLDE3IEBACiAJCWdvdG8gZXJyX291dF9tYWlsYm94X2ZyZWU7CiAJfQogCi0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfbWFpbGJveF9mcmVlOgotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCiBlcnJfb3V0X2ZyZWVfbXR0OgotCW10aGNhX2ZyZWVfbXR0KGRldiwgbXItPmZpcnN0X3NlZywgbXItPm9yZGVyLAotCQkgICAgICAgZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5KTsKKwltdGhjYV9mcmVlX210dChkZXYsIG1yLT5tdHQpOwogCiBlcnJfb3V0X3RhYmxlOgotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLCBrZXkpOworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLCBrZXkpOwogCiBlcnJfb3V0X21wdF9mcmVlOgogCW10aGNhX2ZyZWUoJmRldi0+bXJfdGFibGUubXB0X2FsbG9jLCBtci0+aWJtci5sa2V5KTsKQEAgLTYwOSw4ICs2MDQsOSBAQAogCWlmIChmbXItPm1hcHMpCiAJCXJldHVybiAtRUJVU1k7CiAKLQltdGhjYV9mcmVlX3JlZ2lvbihkZXYsIGZtci0+aWJtci5sa2V5LCBmbXItPm9yZGVyLCBmbXItPmZpcnN0X3NlZywKLQkJCSAgZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5KTsKKwltdGhjYV9mcmVlX3JlZ2lvbihkZXYsIGZtci0+aWJtci5sa2V5KTsKKwltdGhjYV9mcmVlX210dChkZXYsIGZtci0+bXR0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC04MjYsNyArODIyLDggQEAKIAlpZiAoZGV2LT5saW1pdHMucmVzZXJ2ZWRfbXR0cykgewogCQlpID0gZmxzKGRldi0+bGltaXRzLnJlc2VydmVkX210dHMgLSAxKTsKIAotCQlpZiAobXRoY2FfYWxsb2NfbXR0KGRldiwgaSwgZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5KSA9PSAtMSkgeworCQlpZiAobXRoY2FfYWxsb2NfbXR0X3JhbmdlKGRldiwgaSwKKwkJCQkJICBkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkpID09IC0xKSB7CiAJCQltdGhjYV93YXJuKGRldiwgIk1UVCB0YWJsZSBvZiBvcmRlciAlZCBpcyB0b28gc21hbGwuXG4iLAogCQkJCSAgZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5LT5tYXhfb3JkZXIpOwogCQkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKaW5kZXggZWE2Njg0Ny4uYzJjODk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0zNywyMyArMzgsMjcgQEAKIAogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgogCi1pbnQgbXRoY2FfcGRfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfcGQgKnBkKQoraW50IG10aGNhX3BkX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHByaXZpbGVnZWQsIHN0cnVjdCBtdGhjYV9wZCAqcGQpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwlwZC0+cHJpdmlsZWdlZCA9IHByaXZpbGVnZWQ7CisKIAlhdG9taWNfc2V0KCZwZC0+c3FwX2NvdW50LCAwKTsKIAlwZC0+cGRfbnVtID0gbXRoY2FfYWxsb2MoJmRldi0+cGRfdGFibGUuYWxsb2MpOwogCWlmIChwZC0+cGRfbnVtID09IC0xKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IG10aGNhX21yX2FsbG9jX25vdHJhbnMoZGV2LCBwZC0+cGRfbnVtLAotCQkJCSAgICAgTVRIQ0FfTVBUX0ZMQUdfTE9DQUxfUkVBRCB8Ci0JCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9XUklURSwKLQkJCQkgICAgICZwZC0+bnRtcik7Ci0JaWYgKGVycikKLQkJbXRoY2FfZnJlZSgmZGV2LT5wZF90YWJsZS5hbGxvYywgcGQtPnBkX251bSk7CisJaWYgKHByaXZpbGVnZWQpIHsKKwkJZXJyID0gbXRoY2FfbXJfYWxsb2Nfbm90cmFucyhkZXYsIHBkLT5wZF9udW0sCisJCQkJCSAgICAgTVRIQ0FfTVBUX0ZMQUdfTE9DQUxfUkVBRCB8CisJCQkJCSAgICAgTVRIQ0FfTVBUX0ZMQUdfTE9DQUxfV1JJVEUsCisJCQkJCSAgICAgJnBkLT5udG1yKTsKKwkJaWYgKGVycikKKwkJCW10aGNhX2ZyZWUoJmRldi0+cGRfdGFibGUuYWxsb2MsIHBkLT5wZF9udW0pOworCX0KIAogCXJldHVybiBlcnI7CiB9CkBAIC02MSw3ICs2Niw4IEBACiB2b2lkIG10aGNhX3BkX2ZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfcGQgKnBkKQogewogCW1pZ2h0X3NsZWVwKCk7Ci0JbXRoY2FfZnJlZV9tcihkZXYsICZwZC0+bnRtcik7CisJaWYgKHBkLT5wcml2aWxlZ2VkKQorCQltdGhjYV9mcmVlX21yKGRldiwgJnBkLT5udG1yKTsKIAltdGhjYV9mcmVlKCZkZXYtPnBkX3RhYmxlLmFsbG9jLCBwZC0+cGRfbnVtKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYwppbmRleCAxNTlmNGU2Li43YTU4Y2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYwpAQCAtMSw1ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTMzLDkgKzM1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGliX3NtaS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlICJtdGhjYV9kZXYuaCIKICNpbmNsdWRlICJtdGhjYV9jbWQuaCIKKyNpbmNsdWRlICJtdGhjYV91c2VyLmgiCisjaW5jbHVkZSAibXRoY2FfbWVtZnJlZS5oIgogCiBzdGF0aWMgaW50IG10aGNhX3F1ZXJ5X2RldmljZShzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKIAkJCSAgICAgIHN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqcHJvcHMpCkBAIC01Miw3ICs1Nyw3IEBACiAJaWYgKCFpbl9tYWQgfHwgIW91dF9tYWQpCiAJCWdvdG8gb3V0OwogCi0JbWVtc2V0KHByb3BzLCAwLCBzaXplb2YgcHJvcHMpOworCW1lbXNldChwcm9wcywgMCwgc2l6ZW9mICpwcm9wcyk7CiAKIAlwcm9wcy0+ZndfdmVyICAgICAgICAgICAgICA9IG1kZXYtPmZ3X3ZlcjsKIApAQCAtMjgzLDcgKzI4OCw3OCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaWJfcGQgKm10aGNhX2FsbG9jX3BkKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQorc3RhdGljIHN0cnVjdCBpYl91Y29udGV4dCAqbXRoY2FfYWxsb2NfdWNvbnRleHQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJCQlzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQoreworCXN0cnVjdCBtdGhjYV9hbGxvY191Y29udGV4dF9yZXNwIHVyZXNwOworCXN0cnVjdCBtdGhjYV91Y29udGV4dCAgICAgICAgICAgKmNvbnRleHQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOworCisJbWVtc2V0KCZ1cmVzcCwgMCwgc2l6ZW9mIHVyZXNwKTsKKworCXVyZXNwLnFwX3RhYl9zaXplID0gdG9fbWRldihpYmRldiktPmxpbWl0cy5udW1fcXBzOworCWlmIChtdGhjYV9pc19tZW1mcmVlKHRvX21kZXYoaWJkZXYpKSkKKwkJdXJlc3AudWFyY19zaXplID0gdG9fbWRldihpYmRldiktPnVhcl90YWJsZS51YXJjX3NpemU7CisJZWxzZQorCQl1cmVzcC51YXJjX3NpemUgPSAwOworCisJY29udGV4dCA9IGttYWxsb2Moc2l6ZW9mICpjb250ZXh0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gbXRoY2FfdWFyX2FsbG9jKHRvX21kZXYoaWJkZXYpLCAmY29udGV4dC0+dWFyKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGNvbnRleHQpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCWNvbnRleHQtPmRiX3RhYiA9IG10aGNhX2luaXRfdXNlcl9kYl90YWIodG9fbWRldihpYmRldikpOworCWlmIChJU19FUlIoY29udGV4dC0+ZGJfdGFiKSkgeworCQllcnIgPSBQVFJfRVJSKGNvbnRleHQtPmRiX3RhYik7CisJCW10aGNhX3Vhcl9mcmVlKHRvX21kZXYoaWJkZXYpLCAmY29udGV4dC0+dWFyKTsKKwkJa2ZyZWUoY29udGV4dCk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJaWYgKGliX2NvcHlfdG9fdWRhdGEodWRhdGEsICZ1cmVzcCwgc2l6ZW9mIHVyZXNwKSkgeworCQltdGhjYV9jbGVhbnVwX3VzZXJfZGJfdGFiKHRvX21kZXYoaWJkZXYpLCAmY29udGV4dC0+dWFyLCBjb250ZXh0LT5kYl90YWIpOworCQltdGhjYV91YXJfZnJlZSh0b19tZGV2KGliZGV2KSwgJmNvbnRleHQtPnVhcik7CisJCWtmcmVlKGNvbnRleHQpOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gJmNvbnRleHQtPmlidWNvbnRleHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRoY2FfZGVhbGxvY191Y29udGV4dChzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQpCit7CisJbXRoY2FfY2xlYW51cF91c2VyX2RiX3RhYih0b19tZGV2KGNvbnRleHQtPmRldmljZSksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhciwKKwkJCQkgIHRvX211Y29udGV4dChjb250ZXh0KS0+ZGJfdGFiKTsKKwltdGhjYV91YXJfZnJlZSh0b19tZGV2KGNvbnRleHQtPmRldmljZSksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhcik7CisJa2ZyZWUodG9fbXVjb250ZXh0KGNvbnRleHQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10aGNhX21tYXBfdWFyKHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCSAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCAhPSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgIHRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLnBmbiwKKwkJCSAgICBQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYl9wZCAqbXRoY2FfYWxsb2NfcGQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICAgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSkKIHsKIAlzdHJ1Y3QgbXRoY2FfcGQgKnBkOwogCWludCBlcnI7CkBAIC0yOTIsMTIgKzM2OCwyMCBAQAogCWlmICghcGQpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JZXJyID0gbXRoY2FfcGRfYWxsb2ModG9fbWRldihpYmRldiksIHBkKTsKKwllcnIgPSBtdGhjYV9wZF9hbGxvYyh0b19tZGV2KGliZGV2KSwgIWNvbnRleHQsIHBkKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlKHBkKTsKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAl9CiAKKwlpZiAoY29udGV4dCkgeworCQlpZiAoaWJfY29weV90b191ZGF0YSh1ZGF0YSwgJnBkLT5wZF9udW0sIHNpemVvZiAoX191MzIpKSkgeworCQkJbXRoY2FfcGRfZnJlZSh0b19tZGV2KGliZGV2KSwgcGQpOworCQkJa2ZyZWUocGQpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJCX0KKwl9CisKIAlyZXR1cm4gJnBkLT5pYnBkOwogfQogCkBAIC0zMzcsOCArNDIxLDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWJfcXAgKm10aGNhX2NyZWF0ZV9xcChzdHJ1Y3QgaWJfcGQgKnBkLAotCQkJCSAgICAgc3RydWN0IGliX3FwX2luaXRfYXR0ciAqaW5pdF9hdHRyKQorCQkJCSAgICAgc3RydWN0IGliX3FwX2luaXRfYXR0ciAqaW5pdF9hdHRyLAorCQkJCSAgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSkKIHsKKwlzdHJ1Y3QgbXRoY2FfY3JlYXRlX3FwIHVjbWQ7CiAJc3RydWN0IG10aGNhX3FwICpxcDsKIAlpbnQgZXJyOwogCkBAIC0zNDcsNDEgKzQzMyw4MiBAQAogCWNhc2UgSUJfUVBUX1VDOgogCWNhc2UgSUJfUVBUX1VEOgogCXsKKwkJc3RydWN0IG10aGNhX3Vjb250ZXh0ICpjb250ZXh0OworCiAJCXFwID0ga21hbGxvYyhzaXplb2YgKnFwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFxcCkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JCXFwLT5zcS5tYXggICAgPSBpbml0X2F0dHItPmNhcC5tYXhfc2VuZF93cjsKLQkJcXAtPnJxLm1heCAgICA9IGluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3dyOwotCQlxcC0+c3EubWF4X2dzID0gaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfc2dlOwotCQlxcC0+cnEubWF4X2dzID0gaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfc2dlOworCQlpZiAocGQtPnVvYmplY3QpIHsKKwkJCWNvbnRleHQgPSB0b19tdWNvbnRleHQocGQtPnVvYmplY3QtPmNvbnRleHQpOworCisJCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKQorCQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCisJCQllcnIgPSBtdGhjYV9tYXBfdXNlcl9kYih0b19tZGV2KHBkLT5kZXZpY2UpLCAmY29udGV4dC0+dWFyLAorCQkJCQkJY29udGV4dC0+ZGJfdGFiLAorCQkJCQkJdWNtZC5zcV9kYl9pbmRleCwgdWNtZC5zcV9kYl9wYWdlKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlrZnJlZShxcCk7CisJCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJCX0KKworCQkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwgJmNvbnRleHQtPnVhciwKKwkJCQkJCWNvbnRleHQtPmRiX3RhYiwKKwkJCQkJCXVjbWQucnFfZGJfaW5kZXgsIHVjbWQucnFfZGJfcGFnZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KHBkLT5kZXZpY2UpLAorCQkJCQkJICAgICZjb250ZXh0LT51YXIsCisJCQkJCQkgICAgY29udGV4dC0+ZGJfdGFiLAorCQkJCQkJICAgIHVjbWQuc3FfZGJfaW5kZXgpOworCQkJCWtmcmVlKHFwKTsKKwkJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQkJfQorCisJCQlxcC0+bXIuaWJtci5sa2V5ID0gdWNtZC5sa2V5OworCQkJcXAtPnNxLmRiX2luZGV4ICA9IHVjbWQuc3FfZGJfaW5kZXg7CisJCQlxcC0+cnEuZGJfaW5kZXggID0gdWNtZC5ycV9kYl9pbmRleDsKKwkJfQogCiAJCWVyciA9IG10aGNhX2FsbG9jX3FwKHRvX21kZXYocGQtPmRldmljZSksIHRvX21wZChwZCksCiAJCQkJICAgICB0b19tY3EoaW5pdF9hdHRyLT5zZW5kX2NxKSwKIAkJCQkgICAgIHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLAogCQkJCSAgICAgaW5pdF9hdHRyLT5xcF90eXBlLCBpbml0X2F0dHItPnNxX3NpZ190eXBlLAotCQkJCSAgICAgcXApOworCQkJCSAgICAgJmluaXRfYXR0ci0+Y2FwLCBxcCk7CisKKwkJaWYgKGVyciAmJiBwZC0+dW9iamVjdCkgeworCQkJY29udGV4dCA9IHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCk7CisKKwkJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwKKwkJCQkJICAgICZjb250ZXh0LT51YXIsCisJCQkJCSAgICBjb250ZXh0LT5kYl90YWIsCisJCQkJCSAgICB1Y21kLnNxX2RiX2luZGV4KTsKKwkJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwKKwkJCQkJICAgICZjb250ZXh0LT51YXIsCisJCQkJCSAgICBjb250ZXh0LT5kYl90YWIsCisJCQkJCSAgICB1Y21kLnJxX2RiX2luZGV4KTsKKwkJfQorCiAJCXFwLT5pYnFwLnFwX251bSA9IHFwLT5xcG47CiAJCWJyZWFrOwogCX0KIAljYXNlIElCX1FQVF9TTUk6CiAJY2FzZSBJQl9RUFRfR1NJOgogCXsKKwkJLyogRG9uJ3QgYWxsb3cgdXNlcnNwYWNlIHRvIGNyZWF0ZSBzcGVjaWFsIFFQcyAqLworCQlpZiAocGQtPnVvYmplY3QpCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCQlxcCA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbXRoY2Ffc3FwKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcXApCiAJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCQlxcC0+c3EubWF4ICAgID0gaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfd3I7Ci0JCXFwLT5ycS5tYXggICAgPSBpbml0X2F0dHItPmNhcC5tYXhfcmVjdl93cjsKLQkJcXAtPnNxLm1heF9ncyA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3NnZTsKLQkJcXAtPnJxLm1heF9ncyA9IGluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3NnZTsKLQogCQlxcC0+aWJxcC5xcF9udW0gPSBpbml0X2F0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1NNSSA/IDAgOiAxOwogCiAJCWVyciA9IG10aGNhX2FsbG9jX3NxcCh0b19tZGV2KHBkLT5kZXZpY2UpLCB0b19tcGQocGQpLAogCQkJCSAgICAgIHRvX21jcShpbml0X2F0dHItPnNlbmRfY3EpLAogCQkJCSAgICAgIHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLAotCQkJCSAgICAgIGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUsCisJCQkJICAgICAgaW5pdF9hdHRyLT5zcV9zaWdfdHlwZSwgJmluaXRfYXR0ci0+Y2FwLAogCQkJCSAgICAgIHFwLT5pYnFwLnFwX251bSwgaW5pdF9hdHRyLT5wb3J0X251bSwKIAkJCQkgICAgICB0b19tc3FwKHFwKSk7CiAJCWJyZWFrOwpAQCAtMzk2LDQyICs1MjMsMTE1IEBACiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQogCi0gICAgICAgIGluaXRfYXR0ci0+Y2FwLm1heF9pbmxpbmVfZGF0YSA9IDA7CisJaW5pdF9hdHRyLT5jYXAubWF4X2lubGluZV9kYXRhID0gMDsKKwlpbml0X2F0dHItPmNhcC5tYXhfc2VuZF93ciAgICAgPSBxcC0+c3EubWF4OworCWluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3dyICAgICA9IHFwLT5ycS5tYXg7CisJaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfc2dlICAgID0gcXAtPnNxLm1heF9nczsKKwlpbml0X2F0dHItPmNhcC5tYXhfcmVjdl9zZ2UgICAgPSBxcC0+cnEubWF4X2dzOwogCiAJcmV0dXJuICZxcC0+aWJxcDsKIH0KIAogc3RhdGljIGludCBtdGhjYV9kZXN0cm95X3FwKHN0cnVjdCBpYl9xcCAqcXApCiB7CisJaWYgKHFwLT51b2JqZWN0KSB7CisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihxcC0+ZGV2aWNlKSwKKwkJCQkgICAgJnRvX211Y29udGV4dChxcC0+dW9iamVjdC0+Y29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KHFwLT51b2JqZWN0LT5jb250ZXh0KS0+ZGJfdGFiLAorCQkJCSAgICB0b19tcXAocXApLT5zcS5kYl9pbmRleCk7CisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihxcC0+ZGV2aWNlKSwKKwkJCQkgICAgJnRvX211Y29udGV4dChxcC0+dW9iamVjdC0+Y29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KHFwLT51b2JqZWN0LT5jb250ZXh0KS0+ZGJfdGFiLAorCQkJCSAgICB0b19tcXAocXApLT5ycS5kYl9pbmRleCk7CisJfQogCW10aGNhX2ZyZWVfcXAodG9fbWRldihxcC0+ZGV2aWNlKSwgdG9fbXFwKHFwKSk7CiAJa2ZyZWUocXApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGliX2NxICptdGhjYV9jcmVhdGVfY3Eoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIGludCBlbnRyaWVzKQorc3RhdGljIHN0cnVjdCBpYl9jcSAqbXRoY2FfY3JlYXRlX2NxKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBpbnQgZW50cmllcywKKwkJCQkgICAgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7CisJc3RydWN0IG10aGNhX2NyZWF0ZV9jcSB1Y21kOwogCXN0cnVjdCBtdGhjYV9jcSAqY3E7CiAJaW50IG5lbnQ7CiAJaW50IGVycjsKIAorCWlmIChjb250ZXh0KSB7CisJCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnVjbWQsIHVkYXRhLCBzaXplb2YgdWNtZCkpCisJCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKworCQllcnIgPSBtdGhjYV9tYXBfdXNlcl9kYih0b19tZGV2KGliZGV2KSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLAorCQkJCQl0b19tdWNvbnRleHQoY29udGV4dCktPmRiX3RhYiwKKwkJCQkJdWNtZC5zZXRfZGJfaW5kZXgsIHVjbWQuc2V0X2RiX3BhZ2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCQllcnIgPSBtdGhjYV9tYXBfdXNlcl9kYih0b19tZGV2KGliZGV2KSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLAorCQkJCQl0b19tdWNvbnRleHQoY29udGV4dCktPmRiX3RhYiwKKwkJCQkJdWNtZC5hcm1fZGJfaW5kZXgsIHVjbWQuYXJtX2RiX3BhZ2UpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfdW5tYXBfc2V0OworCX0KKwogCWNxID0ga21hbGxvYyhzaXplb2YgKmNxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNxKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIWNxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwX2FybTsKKwl9CisKKwlpZiAoY29udGV4dCkgeworCQljcS0+bXIuaWJtci5sa2V5ICAgID0gdWNtZC5sa2V5OworCQljcS0+c2V0X2NpX2RiX2luZGV4ID0gdWNtZC5zZXRfZGJfaW5kZXg7CisJCWNxLT5hcm1fZGJfaW5kZXggICAgPSB1Y21kLmFybV9kYl9pbmRleDsKKwl9CiAKIAlmb3IgKG5lbnQgPSAxOyBuZW50IDw9IGVudHJpZXM7IG5lbnQgPDw9IDEpCiAJCTsgLyogbm90aGluZyAqLwogCi0JZXJyID0gbXRoY2FfaW5pdF9jcSh0b19tZGV2KGliZGV2KSwgbmVudCwgY3EpOwotCWlmIChlcnIpIHsKLQkJa2ZyZWUoY3EpOwotCQljcSA9IEVSUl9QVFIoZXJyKTsKKwllcnIgPSBtdGhjYV9pbml0X2NxKHRvX21kZXYoaWJkZXYpLCBuZW50LAorCQkJICAgIGNvbnRleHQgPyB0b19tdWNvbnRleHQoY29udGV4dCkgOiBOVUxMLAorCQkJICAgIGNvbnRleHQgPyB1Y21kLnBkbiA6IHRvX21kZXYoaWJkZXYpLT5kcml2ZXJfcGQucGRfbnVtLAorCQkJICAgIGNxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlOworCisJaWYgKGNvbnRleHQgJiYgaWJfY29weV90b191ZGF0YSh1ZGF0YSwgJmNxLT5jcW4sIHNpemVvZiAoX191MzIpKSkgeworCQltdGhjYV9mcmVlX2NxKHRvX21kZXYoaWJkZXYpLCBjcSk7CisJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0dXJuICZjcS0+aWJjcTsKKworZXJyX2ZyZWU6CisJa2ZyZWUoY3EpOworCitlcnJfdW5tYXBfYXJtOgorCWlmIChjb250ZXh0KQorCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYoaWJkZXYpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChjb250ZXh0KS0+ZGJfdGFiLCB1Y21kLmFybV9kYl9pbmRleCk7CisKK2Vycl91bm1hcF9zZXQ6CisJaWYgKGNvbnRleHQpCisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihpYmRldiksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KGNvbnRleHQpLT5kYl90YWIsIHVjbWQuc2V0X2RiX2luZGV4KTsKKworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIHN0YXRpYyBpbnQgbXRoY2FfZGVzdHJveV9jcShzdHJ1Y3QgaWJfY3EgKmNxKQogeworCWlmIChjcS0+dW9iamVjdCkgeworCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYoY3EtPmRldmljZSksCisJCQkJICAgICZ0b19tdWNvbnRleHQoY3EtPnVvYmplY3QtPmNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChjcS0+dW9iamVjdC0+Y29udGV4dCktPmRiX3RhYiwKKwkJCQkgICAgdG9fbWNxKGNxKS0+YXJtX2RiX2luZGV4KTsKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KGNxLT5kZXZpY2UpLAorCQkJCSAgICAmdG9fbXVjb250ZXh0KGNxLT51b2JqZWN0LT5jb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQoY3EtPnVvYmplY3QtPmNvbnRleHQpLT5kYl90YWIsCisJCQkJICAgIHRvX21jcShjcSktPnNldF9jaV9kYl9pbmRleCk7CisJfQogCW10aGNhX2ZyZWVfY3EodG9fbWRldihjcS0+ZGV2aWNlKSwgdG9fbWNxKGNxKSk7CiAJa2ZyZWUoY3EpOwogCkBAIC01NTgsNiArNzU4LDcgQEAKIAkJCQkgIGNvbnZlcnRfYWNjZXNzKGFjYyksIG1yKTsKIAogCWlmIChlcnIpIHsKKwkJa2ZyZWUocGFnZV9saXN0KTsKIAkJa2ZyZWUobXIpOwogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KQEAgLTU2Niw2ICs3NjcsODcgQEAKIAlyZXR1cm4gJm1yLT5pYm1yOwogfQogCitzdGF0aWMgc3RydWN0IGliX21yICptdGhjYV9yZWdfdXNlcl9tcihzdHJ1Y3QgaWJfcGQgKnBkLCBzdHJ1Y3QgaWJfdW1lbSAqcmVnaW9uLAorCQkJCSAgICAgICBpbnQgYWNjLCBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQoreworCXN0cnVjdCBtdGhjYV9kZXYgKmRldiA9IHRvX21kZXYocGQtPmRldmljZSk7CisJc3RydWN0IGliX3VtZW1fY2h1bmsgKmNodW5rOworCXN0cnVjdCBtdGhjYV9tciAqbXI7CisJdTY0ICpwYWdlczsKKwlpbnQgc2hpZnQsIG4sIGxlbjsKKwlpbnQgaSwgaiwgazsKKwlpbnQgZXJyID0gMDsKKworCXNoaWZ0ID0gZmZzKHJlZ2lvbi0+cGFnZV9zaXplKSAtIDE7CisKKwltciA9IGttYWxsb2Moc2l6ZW9mICptciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwluID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmcmVnaW9uLT5jaHVua19saXN0LCBsaXN0KQorCQluICs9IGNodW5rLT5uZW50czsKKworCW1yLT5tdHQgPSBtdGhjYV9hbGxvY19tdHQoZGV2LCBuKTsKKwlpZiAoSVNfRVJSKG1yLT5tdHQpKSB7CisJCWVyciA9IFBUUl9FUlIobXItPm10dCk7CisJCWdvdG8gZXJyOworCX0KKworCXBhZ2VzID0gKHU2NCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlcykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tdHQ7CisJfQorCisJaSA9IG4gPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJnJlZ2lvbi0+Y2h1bmtfbGlzdCwgbGlzdCkKKwkJZm9yIChqID0gMDsgaiA8IGNodW5rLT5ubWFwOyArK2opIHsKKwkJCWxlbiA9IHNnX2RtYV9sZW4oJmNodW5rLT5wYWdlX2xpc3Rbal0pID4+IHNoaWZ0OworCQkJZm9yIChrID0gMDsgayA8IGxlbjsgKytrKSB7CisJCQkJcGFnZXNbaSsrXSA9IHNnX2RtYV9hZGRyZXNzKCZjaHVuay0+cGFnZV9saXN0W2pdKSArCisJCQkJCXJlZ2lvbi0+cGFnZV9zaXplICogazsKKwkJCQkvKgorCQkJCSAqIEJlIGZyaWVuZGx5IHRvIFdSSVRFX01UVCBjb21tYW5kCisJCQkJICogYW5kIGxlYXZlIHR3byBlbXB0eSBzbG90cyBmb3IgdGhlCisJCQkJICogaW5kZXggYW5kIHJlc2VydmVkIGZpZWxkcyBvZiB0aGUKKwkJCQkgKiBtYWlsYm94LgorCQkJCSAqLworCQkJCWlmIChpID09IFBBR0VfU0laRSAvIHNpemVvZiAodTY0KSAtIDIpIHsKKwkJCQkJZXJyID0gbXRoY2Ffd3JpdGVfbXR0KGRldiwgbXItPm10dCwKKwkJCQkJCQkgICAgICBuLCBwYWdlcywgaSk7CisJCQkJCWlmIChlcnIpCisJCQkJCQlnb3RvIG10dF9kb25lOworCQkJCQluICs9IGk7CisJCQkJCWkgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJaWYgKGkpCisJCWVyciA9IG10aGNhX3dyaXRlX210dChkZXYsIG1yLT5tdHQsIG4sIHBhZ2VzLCBpKTsKK210dF9kb25lOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX210dDsKKworCWVyciA9IG10aGNhX21yX2FsbG9jKGRldiwgdG9fbXBkKHBkKS0+cGRfbnVtLCBzaGlmdCwgcmVnaW9uLT52aXJ0X2Jhc2UsCisJCQkgICAgIHJlZ2lvbi0+bGVuZ3RoLCBjb252ZXJ0X2FjY2VzcyhhY2MpLCBtcik7CisKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tdHQ7CisKKwlyZXR1cm4gJm1yLT5pYm1yOworCitlcnJfbXR0OgorCW10aGNhX2ZyZWVfbXR0KGRldiwgbXItPm10dCk7CisKK2VycjoKKwlrZnJlZShtcik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKwogc3RhdGljIGludCBtdGhjYV9kZXJlZ19tcihzdHJ1Y3QgaWJfbXIgKm1yKQogewogCXN0cnVjdCBtdGhjYV9tciAqbW1yID0gdG9fbW1yKG1yKTsKQEAgLTY5MCw2ICs5NzIsOCBAQAogCWludCBpOwogCiAJc3RybGNweShkZXYtPmliX2Rldi5uYW1lLCAibXRoY2ElZCIsIElCX0RFVklDRV9OQU1FX01BWCk7CisJZGV2LT5pYl9kZXYub3duZXIgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRTsKKwogCWRldi0+aWJfZGV2Lm5vZGVfdHlwZSAgICAgICAgICAgID0gSUJfTk9ERV9DQTsKIAlkZXYtPmliX2Rldi5waHlzX3BvcnRfY250ICAgICAgICA9IGRldi0+bGltaXRzLm51bV9wb3J0czsKIAlkZXYtPmliX2Rldi5kbWFfZGV2aWNlICAgICAgICAgICA9ICZkZXYtPnBkZXYtPmRldjsKQEAgLTY5OSw2ICs5ODMsOSBAQAogCWRldi0+aWJfZGV2Lm1vZGlmeV9wb3J0ICAgICAgICAgID0gbXRoY2FfbW9kaWZ5X3BvcnQ7CiAJZGV2LT5pYl9kZXYucXVlcnlfcGtleSAgICAgICAgICAgPSBtdGhjYV9xdWVyeV9wa2V5OwogCWRldi0+aWJfZGV2LnF1ZXJ5X2dpZCAgICAgICAgICAgID0gbXRoY2FfcXVlcnlfZ2lkOworCWRldi0+aWJfZGV2LmFsbG9jX3Vjb250ZXh0ICAgICAgID0gbXRoY2FfYWxsb2NfdWNvbnRleHQ7CisJZGV2LT5pYl9kZXYuZGVhbGxvY191Y29udGV4dCAgICAgPSBtdGhjYV9kZWFsbG9jX3Vjb250ZXh0OworCWRldi0+aWJfZGV2Lm1tYXAgICAgICAgICAgICAgICAgID0gbXRoY2FfbW1hcF91YXI7CiAJZGV2LT5pYl9kZXYuYWxsb2NfcGQgICAgICAgICAgICAgPSBtdGhjYV9hbGxvY19wZDsKIAlkZXYtPmliX2Rldi5kZWFsbG9jX3BkICAgICAgICAgICA9IG10aGNhX2RlYWxsb2NfcGQ7CiAJZGV2LT5pYl9kZXYuY3JlYXRlX2FoICAgICAgICAgICAgPSBtdGhjYV9haF9jcmVhdGU7CkBAIC03MTEsNiArOTk4LDcgQEAKIAlkZXYtPmliX2Rldi5wb2xsX2NxICAgICAgICAgICAgICA9IG10aGNhX3BvbGxfY3E7CiAJZGV2LT5pYl9kZXYuZ2V0X2RtYV9tciAgICAgICAgICAgPSBtdGhjYV9nZXRfZG1hX21yOwogCWRldi0+aWJfZGV2LnJlZ19waHlzX21yICAgICAgICAgID0gbXRoY2FfcmVnX3BoeXNfbXI7CisJZGV2LT5pYl9kZXYucmVnX3VzZXJfbXIgICAgICAgICAgPSBtdGhjYV9yZWdfdXNlcl9tcjsKIAlkZXYtPmliX2Rldi5kZXJlZ19tciAgICAgICAgICAgICA9IG10aGNhX2RlcmVnX21yOwogCiAJaWYgKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX0ZNUikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuaAppbmRleCA2MTk3MTBmLi4xZDAzMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuaApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTU0LDE4ICs1NSwyNiBAQAogCWludCAgICAgICAgICAgaW5kZXg7CiB9OwogCitzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZTsKKworc3RydWN0IG10aGNhX3Vjb250ZXh0IHsKKwlzdHJ1Y3QgaWJfdWNvbnRleHQgICAgICAgICAgaWJ1Y29udGV4dDsKKwlzdHJ1Y3QgbXRoY2FfdWFyICAgICAgICAgICAgdWFyOworCXN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWI7Cit9OworCitzdHJ1Y3QgbXRoY2FfbXR0OworCiBzdHJ1Y3QgbXRoY2FfbXIgewotCXN0cnVjdCBpYl9tciBpYm1yOwotCWludCBvcmRlcjsKLQl1MzIgZmlyc3Rfc2VnOworCXN0cnVjdCBpYl9tciAgICAgIGlibXI7CisJc3RydWN0IG10aGNhX210dCAqbXR0OwogfTsKIAogc3RydWN0IG10aGNhX2ZtciB7Ci0Jc3RydWN0IGliX2ZtciBpYm1yOworCXN0cnVjdCBpYl9mbXIgICAgICBpYm1yOwogCXN0cnVjdCBpYl9mbXJfYXR0ciBhdHRyOwotCWludCBvcmRlcjsKLQl1MzIgZmlyc3Rfc2VnOwotCWludCBtYXBzOworCXN0cnVjdCBtdGhjYV9tdHQgICptdHQ7CisJaW50ICAgICAgICAgICAgICAgIG1hcHM7CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJc3RydWN0IG10aGNhX21wdF9lbnRyeSBfX2lvbWVtICptcHQ7CkBAIC04Myw2ICs5Miw3IEBACiAJdTMyICAgICAgICAgICAgIHBkX251bTsKIAlhdG9taWNfdCAgICAgICAgc3FwX2NvdW50OwogCXN0cnVjdCBtdGhjYV9tciBudG1yOworCWludCAgICAgICAgICAgICBwcml2aWxlZ2VkOwogfTsKIAogc3RydWN0IG10aGNhX2VxIHsKQEAgLTE2Nyw2ICsxNzcsNyBAQAogCWludCAgICAgICAgICAgICAgICAgICAgY3FuOwogCXUzMiAgICAgICAgICAgICAgICAgICAgY29uc19pbmRleDsKIAlpbnQgICAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgIGlzX2tlcm5lbDsKIAogCS8qIE5leHQgZmllbGRzIGFyZSBBcmJlbCBvbmx5ICovCiAJaW50ICAgICAgICAgICAgICAgICAgICBzZXRfY2lfZGJfaW5kZXg7CkBAIC0yMzYsNiArMjQ3LDExIEBACiAJZG1hX2FkZHJfdCAgICAgIGhlYWRlcl9kbWE7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGhjYV91Y29udGV4dCAqdG9fbXVjb250ZXh0KHN0cnVjdCBpYl91Y29udGV4dCAqaWJ1Y29udGV4dCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlidWNvbnRleHQsIHN0cnVjdCBtdGhjYV91Y29udGV4dCwgaWJ1Y29udGV4dCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG10aGNhX2ZtciAqdG9fbWZtcihzdHJ1Y3QgaWJfZm1yICppYm1yKQogewogCXJldHVybiBjb250YWluZXJfb2YoaWJtciwgc3RydWN0IG10aGNhX2ZtciwgaWJtcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCmluZGV4IGNhNzNiYWIuLmY3MTI2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00Niw3ICs0Nyw5IEBACiAJTVRIQ0FfTUFYX0RJUkVDVF9RUF9TSVpFID0gNCAqIFBBR0VfU0laRSwKIAlNVEhDQV9BQ0tfUkVRX0ZSRVEgICAgICAgPSAxMCwKIAlNVEhDQV9GTElHSFRfTElNSVQgICAgICAgPSA5LAotCU1USENBX1VEX0hFQURFUl9TSVpFICAgICA9IDcyIC8qIGxhcmdlc3QgVUQgaGVhZGVyIHBvc3NpYmxlICovCisJTVRIQ0FfVURfSEVBREVSX1NJWkUgICAgID0gNzIsIC8qIGxhcmdlc3QgVUQgaGVhZGVyIHBvc3NpYmxlICovCisJTVRIQ0FfSU5MSU5FX0hFQURFUl9TSVpFID0gNCwgIC8qIGRhdGEgc2VnbWVudCBvdmVyaGVhZCBmb3IgaW5saW5lICovCisJTVRIQ0FfSU5MSU5FX0NIVU5LX1NJWkUgID0gMTYgIC8qIGlubGluZSBkYXRhIHNlZ21lbnQgY2h1bmsgKi8KIH07CiAKIGVudW0gewpAQCAtMzU3LDYgKzM2MCw5IEBACiAJCQkJW1VEXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CiAJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAorCQkJCVtVQ10gID0gKElCX1FQX1BLRVlfSU5ERVggfAorCQkJCQkgSUJfUVBfUE9SVCAgICAgICB8CisJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MpLAogCQkJCVtSQ10gID0gKElCX1FQX1BLRVlfSU5ERVggfAogCQkJCQkgSUJfUVBfUE9SVCAgICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MpLApAQCAtMzc4LDYgKzM4NCw5IEBACiAJCQkJW1VEXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CiAJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAorCQkJCVtVQ10gID0gKElCX1FQX1BLRVlfSU5ERVggfAorCQkJCQkgSUJfUVBfUE9SVCAgICAgICB8CisJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MpLAogCQkJCVtSQ10gID0gKElCX1FQX1BLRVlfSU5ERVggfAogCQkJCQkgSUJfUVBfUE9SVCAgICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MpLApAQCAtMzg4LDYgKzM5NywxMSBAQAogCQlbSUJfUVBTX1JUUl0gICA9IHsKIAkJCS50cmFucyA9IE1USENBX1RSQU5TX0lOSVQyUlRSLAogCQkJLnJlcV9wYXJhbSA9IHsKKwkJCQlbVUNdICA9IChJQl9RUF9BViAgICAgICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1BBVEhfTVRVICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfREVTVF9RUE4gICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9SUV9QU04gICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQyksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQVYgICAgICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9QQVRIX01UVSAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0RFU1RfUVBOICAgICAgICAgICAgfApAQCAtMzk4LDYgKzQxMiw5IEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX1BLRVlfSU5ERVggfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfQUxUX1BBVEggICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyB8CisJCQkJCSBJQl9RUF9QS0VZX0lOREVYKSwKIAkJCQlbUkNdICA9IChJQl9RUF9BTFRfUEFUSCAgICAgfAogCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTIHwKIAkJCQkJIElCX1FQX1BLRVlfSU5ERVgpLApAQCAtNDEzLDYgKzQzMCw4IEBACiAJCQkudHJhbnMgPSBNVEhDQV9UUkFOU19SVFIyUlRTLAogCQkJLnJlcV9wYXJhbSA9IHsKIAkJCQlbVURdICA9IElCX1FQX1NRX1BTTiwKKwkJCQlbVUNdICA9IChJQl9RUF9TUV9QU04gICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSwKIAkJCQlbUkNdICA9IChJQl9RUF9USU1FT1VUICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9SRVRSWV9DTlQgICAgICAgICB8CiAJCQkJCSBJQl9RUF9STlJfUkVUUlkgICAgICAgICB8CkBAIC00MjMsNiArNDQyLDExIEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKKwkJCQlbVUNdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfQUxUX1BBVEggICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyAgICAgICAgICB8CisJCQkJCSBJQl9RUF9QS0VZX0lOREVYICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAogCQkJCVtSQ10gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9BTFRfUEFUSCAgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKQEAgLTQ0Miw2ICs0NjYsOSBAQAogCQkJLm9wdF9wYXJhbSA9IHsKIAkJCQlbVURdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSAgICAgICAgfApAQCAtNDYyLDYgKzQ4OSwxMCBAQAogCQkJLm9wdF9wYXJhbSA9IHsKIAkJCQlbVURdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfAorCQkJCQkgSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAogCQkJCVtSQ10gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9BTFRfUEFUSCAgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKQEAgLTQ3Niw2ICs1MDcsMTQgQEAKIAkJCS5vcHRfcGFyYW0gPSB7CiAJCQkJW1VEXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAorCQkJCVtVQ10gID0gKElCX1FQX0FWICAgICAgICAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDICAgICAgfAorCQkJCQkgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDICAgIHwKKwkJCQkJIElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9BTFRfUEFUSCAgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1BLRVlfSU5ERVggICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQVYgICAgICAgICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1RJTUVPVVQgICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9SRVRSWV9DTlQgICAgICAgICAgICAgfApAQCAtNTAxLDYgKzU0MCw3IEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKKwkJCQlbVUNdICA9IChJQl9RUF9DVVJfU1RBVEUpLAogCQkJCVtSQ10gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9NSU5fUk5SX1RJTUVSKSwKIAkJCQlbTUxYXSA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfApAQCAtNTUyLDcgKzU5Miw3IEBACiAJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihpYnFwLT5kZXZpY2UpOwogCXN0cnVjdCBtdGhjYV9xcCAqcXAgPSB0b19tcXAoaWJxcCk7CiAJZW51bSBpYl9xcF9zdGF0ZSBjdXJfc3RhdGUsIG5ld19zdGF0ZTsKLQl2b2lkICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfcXBfcGFyYW0gKnFwX3BhcmFtOwogCXN0cnVjdCBtdGhjYV9xcF9jb250ZXh0ICpxcF9jb250ZXh0OwogCXUzMiByZXFfcGFyYW0sIG9wdF9wYXJhbTsKQEAgLTYwOSwxMCArNjQ5LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAoKnFwX3BhcmFtKSArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCi0JCXJldHVybiAtRU5PTUVNOwotCXFwX3BhcmFtID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCXFwX3BhcmFtID0gbWFpbGJveC0+YnVmOwogCXFwX2NvbnRleHQgPSAmcXBfcGFyYW0tPmNvbnRleHQ7CiAJbWVtc2V0KHFwX3BhcmFtLCAwLCBzaXplb2YgKnFwX3BhcmFtKTsKIApAQCAtNjUyLDcgKzY5MiwxMSBAQAogCiAJLyogbGVhdmUgYXJiZWxfc2NoZWRfcXVldWUgYXMgMCAqLwogCi0JcXBfY29udGV4dC0+dXNyX3BhZ2UgICA9IGNwdV90b19iZTMyKGRldi0+ZHJpdmVyX3Vhci5pbmRleCk7CisJaWYgKHFwLT5pYnFwLnVvYmplY3QpCisJCXFwX2NvbnRleHQtPnVzcl9wYWdlID0KKwkJCWNwdV90b19iZTMyKHRvX211Y29udGV4dChxcC0+aWJxcC51b2JqZWN0LT5jb250ZXh0KS0+dWFyLmluZGV4KTsKKwllbHNlCisJCXFwX2NvbnRleHQtPnVzcl9wYWdlID0gY3B1X3RvX2JlMzIoZGV2LT5kcml2ZXJfdWFyLmluZGV4KTsKIAlxcF9jb250ZXh0LT5sb2NhbF9xcG4gID0gY3B1X3RvX2JlMzIocXAtPnFwbik7CiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX0RFU1RfUVBOKSB7CiAJCXFwX2NvbnRleHQtPnJlbW90ZV9xcG4gPSBjcHVfdG9fYmUzMihhdHRyLT5kZXN0X3FwX251bSk7CkBAIC02ODMsNyArNzI3LDcgQEAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfQVYpIHsKIAkJcXBfY29udGV4dC0+cHJpX3BhdGguZ19teWxtYyAgICAgPSBhdHRyLT5haF9hdHRyLnNyY19wYXRoX2JpdHMgJiAweDdmOwogCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5ybGlkICAgICAgICA9IGNwdV90b19iZTE2KGF0dHItPmFoX2F0dHIuZGxpZCk7Ci0JCXFwX2NvbnRleHQtPnByaV9wYXRoLnN0YXRpY19yYXRlID0gKCEhYXR0ci0+YWhfYXR0ci5zdGF0aWNfcmF0ZSkgPDwgMzsKKwkJcXBfY29udGV4dC0+cHJpX3BhdGguc3RhdGljX3JhdGUgPSAhIWF0dHItPmFoX2F0dHIuc3RhdGljX3JhdGU7CiAJCWlmIChhdHRyLT5haF9hdHRyLmFoX2ZsYWdzICYgSUJfQUhfR1JIKSB7CiAJCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5nX215bG1jIHw9IDEgPDwgNzsKIAkJCXFwX2NvbnRleHQtPnByaV9wYXRoLm1naWRfaW5kZXggPSBhdHRyLT5haF9hdHRyLmdyaC5zZ2lkX2luZGV4OwpAQCAtNzI0LDkgKzc2OCw5IEBACiAJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfUkVUUllfQ09VTlQpOwogCX0KIAotCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMpIHsKLQkJcXBfY29udGV4dC0+cGFyYW1zMSB8PSBjcHVfdG9fYmUzMihtaW4oYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljID8KLQkJCQkJCSAgICAgICBmZnMoYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKSAtIDEgOiAwLAorCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSB7CisJCXFwX2NvbnRleHQtPnBhcmFtczEgfD0gY3B1X3RvX2JlMzIobWluKGF0dHItPm1heF9yZF9hdG9taWMgPworCQkJCQkJICAgICAgIGZmcyhhdHRyLT5tYXhfcmRfYXRvbWljKSAtIDEgOiAwLAogCQkJCQkJICAgICAgIDcpIDw8IDIxKTsKIAkJcXBfcGFyYW0tPm9wdF9wYXJhbV9tYXNrIHw9IGNwdV90b19iZTMyKE1USENBX1FQX09QVFBBUl9TUkFfTUFYKTsKIAl9CkBAIC03NjQsMTAgKzgwOCwxMCBAQAogCQlxcC0+YXRvbWljX3JkX2VuID0gYXR0ci0+cXBfYWNjZXNzX2ZsYWdzOwogCX0KIAotCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSB7CisJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykgewogCQl1OCBycmFfbWF4OwogCi0JCWlmIChxcC0+cmVzcF9kZXB0aCAmJiAhYXR0ci0+bWF4X3JkX2F0b21pYykgeworCQlpZiAocXAtPnJlc3BfZGVwdGggJiYgIWF0dHItPm1heF9kZXN0X3JkX2F0b21pYykgewogCQkJLyoKIAkJCSAqIExvd2VyaW5nIG91ciByZXNwb25kZXIgcmVzb3VyY2VzIHRvIHplcm8uCiAJCQkgKiBUdXJuIG9mZiBSRE1BL2F0b21pY3MgYXMgcmVzcG9uZGVyLgpAQCAtNzc4LDcgKzgyMiw3IEBACiAJCQkJCQkJCU1USENBX1FQX09QVFBBUl9SQUUpOwogCQl9CiAKLQkJaWYgKCFxcC0+cmVzcF9kZXB0aCAmJiBhdHRyLT5tYXhfcmRfYXRvbWljKSB7CisJCWlmICghcXAtPnJlc3BfZGVwdGggJiYgYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKSB7CiAJCQkvKgogCQkJICogSW5jcmVhc2luZyBvdXIgcmVzcG9uZGVyIHJlc291cmNlcyBmcm9tCiAJCQkgKiB6ZXJvLiAgVHVybiBvbiBSRE1BL2F0b21pY3MgYXMgYXBwcm9wcmlhdGUuCkBAIC03OTksNyArODQzLDcgQEAKIAkJfQogCiAJCWZvciAocnJhX21heCA9IDA7Ci0JCSAgICAgMSA8PCBycmFfbWF4IDwgYXR0ci0+bWF4X3JkX2F0b21pYyAmJgorCQkgICAgIDEgPDwgcnJhX21heCA8IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYyAmJgogCQkJICAgICBycmFfbWF4IDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQ7CiAJCSAgICAgKytycmFfbWF4KQogCQkJOyAvKiBub3RoaW5nICovCkBAIC04MDcsNyArODUxLDcgQEAKIAkJcXBfY29udGV4dC0+cGFyYW1zMiAgICAgIHw9IGNwdV90b19iZTMyKHJyYV9tYXggPDwgMjEpOwogCQlxcF9wYXJhbS0+b3B0X3BhcmFtX21hc2sgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfT1BUUEFSX1JSQV9NQVgpOwogCi0JCXFwLT5yZXNwX2RlcHRoID0gYXR0ci0+bWF4X3JkX2F0b21pYzsKKwkJcXAtPnJlc3BfZGVwdGggPSBhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWM7CiAJfQogCiAJcXBfY29udGV4dC0+cGFyYW1zMiB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9CSVRfUlNDKTsKQEAgLTgzNSw3ICs4NzksNyBAQAogCX0KIAogCWVyciA9IG10aGNhX01PRElGWV9RUChkZXYsIHN0YXRlX3RhYmxlW2N1cl9zdGF0ZV1bbmV3X3N0YXRlXS50cmFucywKLQkJCSAgICAgIHFwLT5xcG4sIDAsIHFwX3BhcmFtLCAwLCAmc3RhdHVzKTsKKwkJCSAgICAgIHFwLT5xcG4sIDAsIG1haWxib3gsIDAsICZzdGF0dXMpOwogCWlmIChzdGF0dXMpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJtb2RpZnkgUVAgJWQgcmV0dXJuZWQgc3RhdHVzICUwMnguXG4iLAogCQkJICAgc3RhdGVfdGFibGVbY3VyX3N0YXRlXVtuZXdfc3RhdGVdLnRyYW5zLCBzdGF0dXMpOwpAQCAtODQ1LDcgKzg4OSw3IEBACiAJaWYgKCFlcnIpCiAJCXFwLT5zdGF0ZSA9IG5ld19zdGF0ZTsKIAotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCiAJaWYgKGlzX3NxcChkZXYsIHFwKSkKIAkJc3RvcmVfYXR0cnModG9fbXNxcChxcCksIGF0dHIsIGF0dHJfbWFzayk7CkBAIC05MTcsNiArOTYxLDE1IEBACiAKIAlxcC0+c2VuZF93cWVfb2Zmc2V0ID0gQUxJR04ocXAtPnJxLm1heCA8PCBxcC0+cnEud3FlX3NoaWZ0LAogCQkJCSAgICAxIDw8IHFwLT5zcS53cWVfc2hpZnQpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdXNlcnNwYWNlIFFQLCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIHRvCisJICogYWxsb2NhdGUgYW55dGhpbmcuICBBbGwgd2UgbmVlZCBpcyB0byBjYWxjdWxhdGUgdGhlIFdRRQorCSAqIHNpemVzIGFuZCB0aGUgc2VuZF93cWVfb2Zmc2V0LCBzbyB3ZSdyZSBkb25lIG5vdy4KKwkgKi8KKwlpZiAocGQtPmlicGQudW9iamVjdCkKKwkJcmV0dXJuIDA7CisKIAlzaXplID0gUEFHRV9BTElHTihxcC0+c2VuZF93cWVfb2Zmc2V0ICsKIAkJCSAgKHFwLT5zcS5tYXggPDwgcXAtPnNxLndxZV9zaGlmdCkpOwogCkBAIC05MzQsNyArOTg3LDggQEAKIAkJCW10aGNhX2RiZyhkZXYsICJDcmVhdGluZyBkaXJlY3QgUVAgb2Ygc2l6ZSAlZCAoc2hpZnQgJWQpXG4iLAogCQkJCSAgc2l6ZSwgc2hpZnQpOwogCi0JCXFwLT5xdWV1ZS5kaXJlY3QuYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBzaXplLCAmdCk7CisJCXFwLT5xdWV1ZS5kaXJlY3QuYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc2l6ZSwKKwkJCQkJCQkgICZ0LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFxcC0+cXVldWUuZGlyZWN0LmJ1ZikKIAkJCWdvdG8gZXJyX291dDsKIApAQCAtOTczLDcgKzEwMjcsOCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSkgewogCQkJcXAtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYgPQotCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLCAmdCk7CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkJICAgJnQsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZikKIAkJCQlnb3RvIGVycl9vdXRfZnJlZTsKIApAQCAtOTk2LDE2ICsxMDUxLDE1IEBACiAKICBlcnJfb3V0X2ZyZWU6CiAJaWYgKHFwLT5pc19kaXJlY3QpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsCi0JCQkJICAgIHFwLT5xdWV1ZS5kaXJlY3QuYnVmLAotCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIHNpemUsIHFwLT5xdWV1ZS5kaXJlY3QuYnVmLAorCQkJCSAgcGNpX3VubWFwX2FkZHIoJnFwLT5xdWV1ZS5kaXJlY3QsIG1hcHBpbmcpKTsKIAl9IGVsc2UKIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CiAJCQlpZiAocXAtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYpCi0JCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKLQkJCQkJCSAgICBxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiwKLQkJCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLnBhZ2VfbGlzdFtpXSwKLQkJCQkJCQkJICAgbWFwcGluZykpOworCQkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkJICBxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiwKKwkJCQkJCSAgcGNpX3VubWFwX2FkZHIoJnFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0sCisJCQkJCQkJCSBtYXBwaW5nKSk7CiAKIAkJfQogCkBAIC0xMDE1LDEwICsxMDY5LDMyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtdGhjYV9hbGxvY19tZW1mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKK3N0YXRpYyB2b2lkIG10aGNhX2ZyZWVfd3FlX2J1ZihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCQkgICAgICAgc3RydWN0IG10aGNhX3FwICpxcCkKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IFBBR0VfQUxJR04ocXAtPnNlbmRfd3FlX29mZnNldCArCisJCQkgICAgICAocXAtPnNxLm1heCA8PCBxcC0+c3Eud3FlX3NoaWZ0KSk7CisKKwlpZiAocXAtPmlzX2RpcmVjdCkgeworCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIHNpemUsIHFwLT5xdWV1ZS5kaXJlY3QuYnVmLAorCQkJCSAgcGNpX3VubWFwX2FkZHIoJnFwLT5xdWV1ZS5kaXJlY3QsIG1hcHBpbmcpKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIFBBR0VfU0laRTsgKytpKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJICBxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiwKKwkJCQkJICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLnBhZ2VfbGlzdFtpXSwKKwkJCQkJCQkgbWFwcGluZykpOworCQl9CisJfQorCisJa2ZyZWUocXAtPndyaWQpOworfQorCitzdGF0aWMgaW50IG10aGNhX21hcF9tZW1mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCSAgICAgc3RydWN0IG10aGNhX3FwICpxcCkKK3sKKwlpbnQgcmV0OwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewogCQlyZXQgPSBtdGhjYV90YWJsZV9nZXQoZGV2LCBkZXYtPnFwX3RhYmxlLnFwX3RhYmxlLCBxcC0+cXBuKTsKQEAgLTEwMjksMzUgKzExMDUsMTUgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyX3FwYzsKIAotCQlyZXQgPSBtdGhjYV90YWJsZV9nZXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKLQkJCQkgICAgICBxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2VxcGM7CisgCQlyZXQgPSBtdGhjYV90YWJsZV9nZXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKKyAJCQkJICAgICAgcXAtPnFwbiA8PCBkZXYtPnFwX3RhYmxlLnJkYl9zaGlmdCk7CisgCQlpZiAocmV0KQorIAkJCWdvdG8gZXJyX2VxcGM7CiAKLQkJcXAtPnJxLmRiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1JRLAotCQkJCQkJIHFwLT5xcG4sICZxcC0+cnEuZGIpOwotCQlpZiAocXAtPnJxLmRiX2luZGV4IDwgMCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX3JkYjsKLQkJfQotCi0JCXFwLT5zcS5kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9TUSwKLQkJCQkJCSBxcC0+cXBuLCAmcXAtPnNxLmRiKTsKLQkJaWYgKHFwLT5zcS5kYl9pbmRleCA8IDApIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9ycV9kYjsKLQkJfQogCX0KIAogCXJldHVybiAwOwogCi1lcnJfcnFfZGI6Ci0JbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsIHFwLT5ycS5kYl9pbmRleCk7Ci0KLWVycl9yZGI6Ci0JbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5yZGJfdGFibGUsCi0JCQlxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKLQogZXJyX2VxcGM6CiAJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5lcXBfdGFibGUsIHFwLT5xcG4pOwogCkBAIC0xMDY3LDE2ICsxMTIzLDQxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbXRoY2FfdW5tYXBfbWVtZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkJc3RydWN0IG10aGNhX3FwICpxcCkKK3sKKwltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKKwkJCXFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+cXBfdGFibGUuZXFwX3RhYmxlLCBxcC0+cXBuKTsKKwltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnFwX3RhYmxlLCBxcC0+cXBuKTsKK30KKworc3RhdGljIGludCBtdGhjYV9hbGxvY19tZW1mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQoreworCWludCByZXQgPSAwOworCisJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgeworCQlxcC0+cnEuZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsCisJCQkJCQkgcXAtPnFwbiwgJnFwLT5ycS5kYik7CisJCWlmIChxcC0+cnEuZGJfaW5kZXggPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlxcC0+c3EuZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfU1EsCisJCQkJCQkgcXAtPnFwbiwgJnFwLT5zcS5kYik7CisJCWlmIChxcC0+c3EuZGJfaW5kZXggPCAwKQorCQkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsIHFwLT5ycS5kYl9pbmRleCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgbXRoY2FfZnJlZV9tZW1mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewogCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKIAkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfU1EsIHFwLT5zcS5kYl9pbmRleCk7CiAJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1JRLCBxcC0+cnEuZGJfaW5kZXgpOwotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKLQkJCQlxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKLQkJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5lcXBfdGFibGUsIHFwLT5xcG4pOwotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnFwX3RhYmxlLCBxcC0+cXBuKTsKIAl9CiB9CiAKQEAgLTExMDgsMTMgKzExODksMjggQEAKIAltdGhjYV93cV9pbml0KCZxcC0+c3EpOwogCW10aGNhX3dxX2luaXQoJnFwLT5ycSk7CiAKLQlyZXQgPSBtdGhjYV9hbGxvY19tZW1mcmVlKGRldiwgcXApOworCXJldCA9IG10aGNhX21hcF9tZW1mcmVlKGRldiwgcXApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBtdGhjYV9hbGxvY193cWVfYnVmKGRldiwgcGQsIHFwKTsKIAlpZiAocmV0KSB7Ci0JCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwkJbXRoY2FfdW5tYXBfbWVtZnJlZShkZXYsIHFwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHdlJ3JlIGRvbmUgbm93LiAgVGhlIGRvb3JiZWxscworCSAqIHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBidWZmZXJzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4KKwkgKiB1c2Vyc3BhY2UuCisJICovCisJaWYgKHBkLT5pYnBkLnVvYmplY3QpCisJCXJldHVybiAwOworCisJcmV0ID0gbXRoY2FfYWxsb2NfbWVtZnJlZShkZXYsIHFwKTsKKwlpZiAocmV0KSB7CisJCW10aGNhX2ZyZWVfd3FlX2J1ZihkZXYsIHFwKTsKKwkJbXRoY2FfdW5tYXBfbWVtZnJlZShkZXYsIHFwKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTExNDcsMjIgKzEyNDMsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRoY2FfYWxpZ25fcXBfc2l6ZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9xcCAqcXApCitzdGF0aWMgaW50IG10aGNhX3NldF9xcF9zaXplKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IGliX3FwX2NhcCAqY2FwLAorCQkJICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewotCWludCBpOworCS8qIFNhbml0eSBjaGVjayBRUCBzaXplIGJlZm9yZSBwcm9jZWVkaW5nICovCisJaWYgKGNhcC0+bWF4X3NlbmRfd3IgID4gNjU1MzYgfHwgY2FwLT5tYXhfcmVjdl93ciAgPiA2NTUzNiB8fAorCSAgICBjYXAtPm1heF9zZW5kX3NnZSA+IDY0ICAgIHx8IGNhcC0+bWF4X3JlY3Zfc2dlID4gNjQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCXJldHVybjsKKwlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CisJCXFwLT5ycS5tYXggPSBjYXAtPm1heF9yZWN2X3dyID8KKwkJCXJvdW5kdXBfcG93X29mX3R3byhjYXAtPm1heF9yZWN2X3dyKSA6IDA7CisJCXFwLT5zcS5tYXggPSBjYXAtPm1heF9zZW5kX3dyID8KKwkJCXJvdW5kdXBfcG93X29mX3R3byhjYXAtPm1heF9zZW5kX3dyKSA6IDA7CisJfSBlbHNlIHsKKwkJcXAtPnJxLm1heCA9IGNhcC0+bWF4X3JlY3Zfd3I7CisJCXFwLT5zcS5tYXggPSBjYXAtPm1heF9zZW5kX3dyOworCX0KIAotCWZvciAoaSA9IDA7IDEgPDwgaSA8IHFwLT5ycS5tYXg7ICsraSkKLQkJOyAvKiBub3RoaW5nICovCisJcXAtPnJxLm1heF9ncyA9IGNhcC0+bWF4X3JlY3Zfc2dlOworCXFwLT5zcS5tYXhfZ3MgPSBtYXhfdChpbnQsIGNhcC0+bWF4X3NlbmRfc2dlLAorCQkJICAgICAgQUxJR04oY2FwLT5tYXhfaW5saW5lX2RhdGEgKyBNVEhDQV9JTkxJTkVfSEVBREVSX1NJWkUsCisJCQkJICAgIE1USENBX0lOTElORV9DSFVOS19TSVpFKSAvCisJCQkgICAgICBzaXplb2YgKHN0cnVjdCBtdGhjYV9kYXRhX3NlZykpOwogCi0JcXAtPnJxLm1heCA9IDEgPDwgaTsKKwkvKgorCSAqIEZvciBNTFggdHJhbnNwb3J0IHdlIG5lZWQgMiBleHRyYSBTL0cgZW50cmllczoKKwkgKiBvbmUgZm9yIHRoZSBoZWFkZXIgYW5kIG9uZSBmb3IgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQKKwkgKi8KKwlpZiAoKHFwLT50cmFuc3BvcnQgPT0gTUxYICYmIHFwLT5zcS5tYXhfZ3MgKyAyID4gZGV2LT5saW1pdHMubWF4X3NnKSB8fAorCSAgICBxcC0+c3EubWF4X2dzID4gZGV2LT5saW1pdHMubWF4X3NnIHx8IHFwLT5ycS5tYXhfZ3MgPiBkZXYtPmxpbWl0cy5tYXhfc2cpCisJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yIChpID0gMDsgMSA8PCBpIDwgcXAtPnNxLm1heDsgKytpKQotCQk7IC8qIG5vdGhpbmcgKi8KLQotCXFwLT5zcS5tYXggPSAxIDw8IGk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBtdGhjYV9hbGxvY19xcChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCkBAIC0xMTcxLDExICsxMjg0LDE0IEBACiAJCSAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgZW51bSBpYl9xcF90eXBlIHR5cGUsCiAJCSAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKIAkJICAgc3RydWN0IG10aGNhX3FwICpxcCkKIHsKIAlpbnQgZXJyOwogCi0JbXRoY2FfYWxpZ25fcXBfc2l6ZShkZXYsIHFwKTsKKwllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgcXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElCX1FQVF9SQzogcXAtPnRyYW5zcG9ydCA9IFJDOyBicmVhazsKQEAgLTEyMDgsMTQgKzEzMjQsMTcgQEAKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcSwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgICBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCiAJCSAgICBpbnQgcXBuLAogCQkgICAgaW50IHBvcnQsCiAJCSAgICBzdHJ1Y3QgbXRoY2Ffc3FwICpzcXApCiB7Ci0JaW50IGVyciA9IDA7CiAJdTMyIG1xcG4gPSBxcG4gKiAyICsgZGV2LT5xcF90YWJsZS5zcXBfc3RhcnQgKyBwb3J0IC0gMTsKKwlpbnQgZXJyOwogCi0JbXRoY2FfYWxpZ25fcXBfc2l6ZShkZXYsICZzcXAtPnFwKTsKKwllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgJnNxcC0+cXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzcXAtPmhlYWRlcl9idWZfc2l6ZSA9IHNxcC0+cXAuc3EubWF4ICogTVRIQ0FfVURfSEVBREVSX1NJWkU7CiAJc3FwLT5oZWFkZXJfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc3FwLT5oZWFkZXJfYnVmX3NpemUsCkBAIC0xMjc0LDggKzEzOTMsNiBAQAogCQkgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewogCXU4IHN0YXR1czsKLQlpbnQgc2l6ZTsKLQlpbnQgaTsKIAlzdHJ1Y3QgbXRoY2FfY3EgKnNlbmRfY3E7CiAJc3RydWN0IG10aGNhX2NxICpyZWN2X2NxOwogCkBAIC0xMzA1LDMxICsxNDIyLDIyIEBACiAJaWYgKHFwLT5zdGF0ZSAhPSBJQl9RUFNfUkVTRVQpCiAJCW10aGNhX01PRElGWV9RUChkZXYsIE1USENBX1RSQU5TX0FOWTJSU1QsIHFwLT5xcG4sIDAsIE5VTEwsIDAsICZzdGF0dXMpOwogCi0JbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAuc2VuZF9jcSktPmNxbiwgcXAtPnFwbik7Ci0JaWYgKHFwLT5pYnFwLnNlbmRfY3EgIT0gcXAtPmlicXAucmVjdl9jcSkKLQkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAucmVjdl9jcSktPmNxbiwgcXAtPnFwbik7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdXNlcnNwYWNlIFFQLCB0aGUgYnVmZmVycywgTVIsIENRcyBhbmQgc28gb24KKwkgKiB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdXNlcnNwYWNlLCBzbyBhbGwgd2UgaGF2ZSB0byBkbyBpcworCSAqIHVucmVmIHRoZSBtZW0tZnJlZSB0YWJsZXMgYW5kIGZyZWUgdGhlIFFQTiBpbiBvdXIgdGFibGUuCisJICovCisJaWYgKCFxcC0+aWJxcC51b2JqZWN0KSB7CisJCW10aGNhX2NxX2NsZWFuKGRldiwgdG9fbWNxKHFwLT5pYnFwLnNlbmRfY3EpLT5jcW4sIHFwLT5xcG4pOworCQlpZiAocXAtPmlicXAuc2VuZF9jcSAhPSBxcC0+aWJxcC5yZWN2X2NxKQorCQkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAucmVjdl9jcSktPmNxbiwgcXAtPnFwbik7CiAKLQltdGhjYV9mcmVlX21yKGRldiwgJnFwLT5tcik7Ci0KLQlzaXplID0gUEFHRV9BTElHTihxcC0+c2VuZF93cWVfb2Zmc2V0ICsKLQkJCSAgKHFwLT5zcS5tYXggPDwgcXAtPnNxLndxZV9zaGlmdCkpOwotCi0JaWYgKHFwLT5pc19kaXJlY3QpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsCi0JCQkJICAgIHFwLT5xdWV1ZS5kaXJlY3QuYnVmLAotCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gUEFHRV9TSVpFOyArK2kpIHsKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCi0JCQkJCSAgICBxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiwKLQkJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUucGFnZV9saXN0W2ldLAotCQkJCQkJCSAgIG1hcHBpbmcpKTsKLQkJfQorCQltdGhjYV9mcmVlX21yKGRldiwgJnFwLT5tcik7CisJCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwkJbXRoY2FfZnJlZV93cWVfYnVmKGRldiwgcXApOwogCX0KIAotCWtmcmVlKHFwLT53cmlkKTsKLQotCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwltdGhjYV91bm1hcF9tZW1mcmVlKGRldiwgcXApOwogCiAJaWYgKGlzX3NxcChkZXYsIHFwKSkgewogCQlhdG9taWNfZGVjKCYodG9fbXBkKHFwLT5pYnFwLnBkKS0+c3FwX2NvdW50KSk7CkBAIC0xNTI5LDYgKzE2MzcsMjYgQEAKIAogCQkJYnJlYWs7CiAKKwkJY2FzZSBVQzoKKwkJCXN3aXRjaCAod3ItPm9wY29kZSkgeworCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFOgorCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFX1dJVEhfSU1NOgorCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5yYWRkciA9CisJCQkJCWNwdV90b19iZTY0KHdyLT53ci5yZG1hLnJlbW90ZV9hZGRyKTsKKwkJCQkoKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcgKikgd3FlKS0+cmtleSA9CisJCQkJCWNwdV90b19iZTMyKHdyLT53ci5yZG1hLnJrZXkpOworCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5yZXNlcnZlZCA9IDA7CisJCQkJd3FlICs9IHNpemVvZiAoc3RydWN0IG10aGNhX3JhZGRyX3NlZyk7CisJCQkJc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcpIC8gMTY7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJLyogTm8gZXh0cmEgc2VnbWVudHMgcmVxdWlyZWQgZm9yIHNlbmRzICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWFrOworCiAJCWNhc2UgVUQ6CiAJCQkoKHN0cnVjdCBtdGhjYV90YXZvcl91ZF9zZWcgKikgd3FlKS0+bGtleSA9CiAJCQkJY3B1X3RvX2JlMzIodG9fbWFoKHdyLT53ci51ZC5haCktPmtleSk7CkBAIC0xODE0LDkgKzE5NDIsMjkgQEAKIAkJCQkJc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfYXRvbWljX3NlZyk7CiAJCQkJYnJlYWs7CiAKKwkJCWNhc2UgSUJfV1JfUkRNQV9SRUFEOgogCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFOgogCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFX1dJVEhfSU1NOgotCQkJY2FzZSBJQl9XUl9SRE1BX1JFQUQ6CisJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJhZGRyID0KKwkJCQkJY3B1X3RvX2JlNjQod3ItPndyLnJkbWEucmVtb3RlX2FkZHIpOworCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5ya2V5ID0KKwkJCQkJY3B1X3RvX2JlMzIod3ItPndyLnJkbWEucmtleSk7CisJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJlc2VydmVkID0gMDsKKwkJCQl3cWUgKz0gc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnKTsKKwkJCQlzaXplICs9IHNpemVvZiAoc3RydWN0IG10aGNhX3JhZGRyX3NlZykgLyAxNjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBObyBleHRyYSBzZWdtZW50cyByZXF1aXJlZCBmb3Igc2VuZHMgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBVQzoKKwkJCXN3aXRjaCAod3ItPm9wY29kZSkgeworCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFOgorCQkJY2FzZSBJQl9XUl9SRE1BX1dSSVRFX1dJVEhfSU1NOgogCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5yYWRkciA9CiAJCQkJCWNwdV90b19iZTY0KHdyLT53ci5yZG1hLnJlbW90ZV9hZGRyKTsKIAkJCQkoKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcgKikgd3FlKS0+cmtleSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfdXNlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI0YzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3VzZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgTVRIQ0FfVVNFUl9ICisjZGVmaW5lIE1USENBX1VTRVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHJlbWFpbiBsYWlkIG91dCBzbworICogdGhhdCB0aGV5IHBhY2sgdGhlIHNhbWUgd2F5IG9uIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMgKHRvCisgKiBhdm9pZCBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiAzMi1iaXQgdXNlcnNwYWNlIGFuZCA2NC1iaXQga2VybmVscykuCisgKiBJbiBwYXJ0aWN1bGFyIGRvIG5vdCB1c2UgcG9pbnRlciB0eXBlcyAtLSBwYXNzIHBvaW50ZXJzIGluIF9fdTY0CisgKiBpbnN0ZWFkLgorICovCisKK3N0cnVjdCBtdGhjYV9hbGxvY191Y29udGV4dF9yZXNwIHsKKwlfX3UzMiBxcF90YWJfc2l6ZTsKKwlfX3UzMiB1YXJjX3NpemU7Cit9OworCitzdHJ1Y3QgbXRoY2FfYWxsb2NfcGRfcmVzcCB7CisJX191MzIgcGRuOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IG10aGNhX2NyZWF0ZV9jcSB7CisJX191MzIgbGtleTsKKwlfX3UzMiBwZG47CisJX191NjQgYXJtX2RiX3BhZ2U7CisJX191NjQgc2V0X2RiX3BhZ2U7CisJX191MzIgYXJtX2RiX2luZGV4OworCV9fdTMyIHNldF9kYl9pbmRleDsKK307CisKK3N0cnVjdCBtdGhjYV9jcmVhdGVfY3FfcmVzcCB7CisJX191MzIgY3FuOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IG10aGNhX2NyZWF0ZV9xcCB7CisJX191MzIgbGtleTsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBzcV9kYl9wYWdlOworCV9fdTY0IHJxX2RiX3BhZ2U7CisJX191MzIgc3FfZGJfaW5kZXg7CisJX191MzIgcnFfZGJfaW5kZXg7Cit9OworCisjZW5kaWYgLyogTVRIQ0FfVVNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MTM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3VzZXJfdmVyYnMuaApAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogaWJfdXNlcl92ZXJicy5oIDI3MDggMjAwNS0wNi0yNCAxNzoyNzoyMVogcm9sYW5kICQKKyAqLworCisjaWZuZGVmIElCX1VTRVJfVkVSQlNfSAorI2RlZmluZSBJQl9VU0VSX1ZFUkJTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJbmNyZW1lbnQgdGhpcyB2YWx1ZSBpZiBhbnkgY2hhbmdlcyB0aGF0IGJyZWFrIHVzZXJzcGFjZSBBQkkKKyAqIGNvbXBhdGliaWxpdHkgYXJlIG1hZGUuCisgKi8KKyNkZWZpbmUgSUJfVVNFUl9WRVJCU19BQklfVkVSU0lPTgkxCisKK2VudW0geworCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BBUkFNUywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9HRVRfQ09OVEVYVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9ERVZJQ0UsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUE9SVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9HSUQsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEtFWSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19QRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERUFMTE9DX1BELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfTVIsCisJSUJfVVNFUl9WRVJCU19DTURfUkVHX1NNUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19NVywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9CSU5EX01XLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfTVcsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFU0laRV9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPTExfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUEVFS19DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVFfTk9USUZZX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfUVAsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1NFTkQsCisJSUJfVVNFUl9WRVJCU19DTURfUE9TVF9SRUNWLAorCUlCX1VTRVJfVkVSQlNfQ01EX0FUVEFDSF9NQ0FTVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVRBQ0hfTUNBU1QKK307CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBhbGwgc3RydWN0cyBkZWZpbmVkIGluIHRoaXMgZmlsZSByZW1haW4gbGFpZCBvdXQgc28KKyAqIHRoYXQgdGhleSBwYWNrIHRoZSBzYW1lIHdheSBvbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzICh0bworICogYXZvaWQgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gMzItYml0IHVzZXJzcGFjZSBhbmQgNjQtYml0IGtlcm5lbHMpLgorICogSW4gcGFydGljdWxhciBkbyBub3QgdXNlIHBvaW50ZXIgdHlwZXMgLS0gcGFzcyBwb2ludGVycyBpbiBfX3U2NAorICogaW5zdGVhZC4KKyAqLworCitzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50X2Rlc2MgeworCV9fdTY0IGVsZW1lbnQ7CisJX191MzIgZXZlbnRfdHlwZTsJLyogZW51bSBpYl9ldmVudF90eXBlICovCisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnRfZGVzYyB7CisJX191NjQgY3FfaGFuZGxlOworfTsKKworLyoKKyAqIEFsbCBjb21tYW5kcyBmcm9tIHVzZXJzcGFjZSBzaG91bGQgc3RhcnQgd2l0aCBhIF9fdTMyIGNvbW1hbmQgZmllbGQKKyAqIGZvbGxvd2VkIGJ5IF9fdTE2IGluX3dvcmRzIGFuZCBvdXRfd29yZHMgZmllbGRzICh3aGljaCBnaXZlIHRoZQorICogbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJsb2NrIGFuZCByZXNwb25zZSBidWZmZXIgaWYgYW55IGluIDMyLWJpdAorICogd29yZHMpLiAgVGhlIGtlcm5lbCBkcml2ZXIgd2lsbCByZWFkIHRoZXNlIGZpZWxkcyBmaXJzdCBhbmQgcmVhZAorICogdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgc3RydWN0IGJhc2VkIG9uIHRoZXNlIHZhbHVlLgorICovCisKK3N0cnVjdCBpYl91dmVyYnNfY21kX2hkciB7CisJX191MzIgY29tbWFuZDsKKwlfX3UxNiBpbl93b3JkczsKKwlfX3UxNiBvdXRfd29yZHM7Cit9OworCisvKgorICogTm8gZHJpdmVyX2RhdGEgZm9yICJxdWVyeSBwYXJhbXMiIGNvbW1hbmQsIHNpbmNlIHRoaXMgaXMgaW50ZW5kZWQKKyAqIHRvIGJlIGEgY29yZSBmdW5jdGlvbiB3aXRoIG5vIHBvc3NpYmxlIGRldmljZSBkZXBlbmRlbmNlLgorICovCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyB7CisJX191NjQgcmVzcG9uc2U7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtc19yZXNwIHsKKwlfX3UzMiBudW1fY3FfZXZlbnRzOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgY3FfZmRfdGFiOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dF9yZXNwIHsKKwlfX3UzMiBhc3luY19mZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZGV2aWNlIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZGV2aWNlX3Jlc3AgeworCV9fdTY0IGZ3X3ZlcjsKKwlfX3U2NCBub2RlX2d1aWQ7CisJX191NjQgc3lzX2ltYWdlX2d1aWQ7CisJX191NjQgbWF4X21yX3NpemU7CisJX191NjQgcGFnZV9zaXplX2NhcDsKKwlfX3UzMiB2ZW5kb3JfaWQ7CisJX191MzIgdmVuZG9yX3BhcnRfaWQ7CisJX191MzIgaHdfdmVyOworCV9fdTMyIG1heF9xcDsKKwlfX3UzMiBtYXhfcXBfd3I7CisJX191MzIgZGV2aWNlX2NhcF9mbGFnczsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIG1heF9zZ2VfcmQ7CisJX191MzIgbWF4X2NxOworCV9fdTMyIG1heF9jcWU7CisJX191MzIgbWF4X21yOworCV9fdTMyIG1heF9wZDsKKwlfX3UzMiBtYXhfcXBfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfcmRfYXRvbTsKKwlfX3UzMiBtYXhfcmVzX3JkX2F0b207CisJX191MzIgbWF4X3FwX2luaXRfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfaW5pdF9yZF9hdG9tOworCV9fdTMyIGF0b21pY19jYXA7CisJX191MzIgbWF4X2VlOworCV9fdTMyIG1heF9yZGQ7CisJX191MzIgbWF4X213OworCV9fdTMyIG1heF9yYXdfaXB2Nl9xcDsKKwlfX3UzMiBtYXhfcmF3X2V0aHlfcXA7CisJX191MzIgbWF4X21jYXN0X2dycDsKKwlfX3UzMiBtYXhfbWNhc3RfcXBfYXR0YWNoOworCV9fdTMyIG1heF90b3RhbF9tY2FzdF9xcF9hdHRhY2g7CisJX191MzIgbWF4X2FoOworCV9fdTMyIG1heF9mbXI7CisJX191MzIgbWF4X21hcF9wZXJfZm1yOworCV9fdTMyIG1heF9zcnE7CisJX191MzIgbWF4X3NycV93cjsKKwlfX3UzMiBtYXhfc3JxX3NnZTsKKwlfX3UxNiBtYXhfcGtleXM7CisJX191OCAgbG9jYWxfY2FfYWNrX2RlbGF5OworCV9fdTggIHBoeXNfcG9ydF9jbnQ7CisJX191OCAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHJlc2VydmVkWzddOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wb3J0X3Jlc3AgeworCV9fdTMyIHBvcnRfY2FwX2ZsYWdzOworCV9fdTMyIG1heF9tc2dfc3o7CisJX191MzIgYmFkX3BrZXlfY250cjsKKwlfX3UzMiBxa2V5X3Zpb2xfY250cjsKKwlfX3UzMiBnaWRfdGJsX2xlbjsKKwlfX3UxNiBwa2V5X3RibF9sZW47CisJX191MTYgbGlkOworCV9fdTE2IHNtX2xpZDsKKwlfX3U4ICBzdGF0ZTsKKwlfX3U4ICBtYXhfbXR1OworCV9fdTggIGFjdGl2ZV9tdHU7CisJX191OCAgbG1jOworCV9fdTggIG1heF92bF9udW07CisJX191OCAgc21fc2w7CisJX191OCAgc3VibmV0X3RpbWVvdXQ7CisJX191OCAgaW5pdF90eXBlX3JlcGx5OworCV9fdTggIGFjdGl2ZV93aWR0aDsKKwlfX3U4ICBhY3RpdmVfc3BlZWQ7CisJX191OCAgcGh5c19zdGF0ZTsKKwlfX3U4ICByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U4ICBwb3J0X251bTsKKwlfX3U4ICBpbmRleDsKKwlfX3U4ICByZXNlcnZlZFs2XTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkX3Jlc3AgeworCV9fdTggIGdpZFsxNl07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BrZXkgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIGluZGV4OworCV9fdTggIHJlc2VydmVkWzZdOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wa2V5X3Jlc3AgeworCV9fdTE2IHBrZXk7CisJX191MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2FsbG9jX3BkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGRfcmVzcCB7CisJX191MzIgcGRfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZWFsbG9jX3BkIHsKKwlfX3UzMiBwZF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tciB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuZ3RoOworCV9fdTY0IGhjYV92YTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgYWNjZXNzX2ZsYWdzOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZWdfbXJfcmVzcCB7CisJX191MzIgbXJfaGFuZGxlOworCV9fdTMyIGxrZXk7CisJX191MzIgcmtleTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVyZWdfbXIgeworCV9fdTMyIG1yX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBjcWU7CisJX191MzIgZXZlbnRfaGFuZGxlcjsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxX3Jlc3AgeworCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3UzMiBjcWU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgeworCV9fdTMyIGNxX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgc2VuZF9jcV9oYW5kbGU7CisJX191MzIgcmVjdl9jcV9oYW5kbGU7CisJX191MzIgc3JxX2hhbmRsZTsKKwlfX3UzMiBtYXhfc2VuZF93cjsKKwlfX3UzMiBtYXhfcmVjdl93cjsKKwlfX3UzMiBtYXhfc2VuZF9zZ2U7CisJX191MzIgbWF4X3JlY3Zfc2dlOworCV9fdTMyIG1heF9pbmxpbmVfZGF0YTsKKwlfX3U4ICBzcV9zaWdfYWxsOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgaXNfc3JxOworCV9fdTggIHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCB7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIHFwbjsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdCBuZWVkcyB0byByZW1haW4gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzIHRvIGtlZXAgdGhlCisgKiBhbGlnbm1lbnQgb2YgdGhlIG1vZGlmeSBRUCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgaWJfdXZlcmJzX3FwX2Rlc3QgeworCV9fdTggIGRnaWRbMTZdOworCV9fdTMyIGZsb3dfbGFiZWw7CisJX191MTYgZGxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U4ICBzZ2lkX2luZGV4OworCV9fdTggIGhvcF9saW1pdDsKKwlfX3U4ICB0cmFmZmljX2NsYXNzOworCV9fdTggIHNsOworCV9fdTggIHNyY19wYXRoX2JpdHM7CisJX191OCAgc3RhdGljX3JhdGU7CisJX191OCAgaXNfZ2xvYmFsOworCV9fdTggIHBvcnRfbnVtOworfTsKKworc3RydWN0IGliX3V2ZXJic19tb2RpZnlfcXAgeworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBkZXN0OworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBhbHRfZGVzdDsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgYXR0cl9tYXNrOworCV9fdTMyIHFrZXk7CisJX191MzIgcnFfcHNuOworCV9fdTMyIHNxX3BzbjsKKwlfX3UzMiBkZXN0X3FwX251bTsKKwlfX3UzMiBxcF9hY2Nlc3NfZmxhZ3M7CisJX191MTYgcGtleV9pbmRleDsKKwlfX3UxNiBhbHRfcGtleV9pbmRleDsKKwlfX3U4ICBxcF9zdGF0ZTsKKwlfX3U4ICBjdXJfcXBfc3RhdGU7CisJX191OCAgcGF0aF9tdHU7CisJX191OCAgcGF0aF9taWdfc3RhdGU7CisJX191OCAgZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlfX3U4ICBtYXhfcmRfYXRvbWljOworCV9fdTggIG1heF9kZXN0X3JkX2F0b21pYzsKKwlfX3U4ICBtaW5fcm5yX3RpbWVyOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHRpbWVvdXQ7CisJX191OCAgcmV0cnlfY250OworCV9fdTggIHJucl9yZXRyeTsKKwlfX3U4ICBhbHRfcG9ydF9udW07CisJX191OCAgYWx0X3RpbWVvdXQ7CisJX191OCAgcmVzZXJ2ZWRbMl07CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9xcF9yZXNwIHsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcCB7CisJX191MzIgcXBfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19hdHRhY2hfbWNhc3QgeworCV9fdTggIGdpZFsxNl07CisJX191MzIgcXBfaGFuZGxlOworCV9fdTE2IG1saWQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdCB7CisJX191OCAgZ2lkWzE2XTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MTYgbWxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKKyNlbmRpZiAvKiBJQl9VU0VSX1ZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl92ZXJicy5oCmluZGV4IGNmMDFmMDQuLmU1YmQ5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfdmVyYnMuaApAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVm9sdGFpcmUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00MSw3ICs0MiwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiB1bmlvbiBpYl9naWQgewogCXU4CXJhd1sxNl07CkBAIC01NDQsNyArNTQ4LDcgQEAKIAlpbnQJCQludW1fc2dlOwogCWVudW0gaWJfd3Jfb3Bjb2RlCW9wY29kZTsKIAlpbnQJCQlzZW5kX2ZsYWdzOwotCXUzMgkJCWltbV9kYXRhOworCV9fYmUzMgkJCWltbV9kYXRhOwogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCXU2NAlyZW1vdGVfYWRkcjsKQEAgLTYxOCwyOSArNjIyLDg2IEBACiAJdTgJcGFnZV9zaXplOwogfTsKIAorc3RydWN0IGliX3Vjb250ZXh0IHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGxpc3RfaGVhZAlwZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJbXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW13X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAljcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJcXBfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXNycV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJYWhfbGlzdDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOworfTsKKworc3RydWN0IGliX3VvYmplY3QgeworCXU2NAkJCXVzZXJfaGFuZGxlOwkvKiBoYW5kbGUgZ2l2ZW4gdG8gdXMgYnkgdXNlcnNwYWNlICovCisJc3RydWN0IGliX3Vjb250ZXh0ICAgICAqY29udGV4dDsJLyogYXNzb2NpYXRlZCB1c2VyIGNvbnRleHQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvKiBsaW5rIHRvIGNvbnRleHQncyBsaXN0ICovCisJdTMyCQkJaWQ7CQkvKiBpbmRleCBpbnRvIGtlcm5lbCBpZHIgKi8KK307CisKK3N0cnVjdCBpYl91bWVtIHsKKwl1bnNpZ25lZCBsb25nCQl1c2VyX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJdmlydF9iYXNlOworCXNpemVfdAkJCWxlbmd0aDsKKwlpbnQJCQlvZmZzZXQ7CisJaW50CQkJcGFnZV9zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQJY2h1bmtfbGlzdDsKK307CisKK3N0cnVjdCBpYl91bWVtX2NodW5rIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbmVudHM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbm1hcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICBwYWdlX2xpc3RbMF07Cit9OworCitzdHJ1Y3QgaWJfdWRhdGEgeworCXZvaWQgX191c2VyICppbmJ1ZjsKKwl2b2lkIF9fdXNlciAqb3V0YnVmOworCXNpemVfdCAgICAgICBpbmxlbjsKKwlzaXplX3QgICAgICAgb3V0bGVuOworfTsKKworI2RlZmluZSBJQl9VTUVNX01BWF9QQUdFX0NIVU5LCQkJCQkJXAorCSgoUEFHRV9TSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGliX3VtZW1fY2h1bmssIHBhZ2VfbGlzdCkpIC8JXAorCSAoKHZvaWQgKikgJigoc3RydWN0IGliX3VtZW1fY2h1bmsgKikgMCktPnBhZ2VfbGlzdFsxXSAtCVwKKwkgICh2b2lkICopICYoKHN0cnVjdCBpYl91bWVtX2NodW5rICopIDApLT5wYWdlX2xpc3RbMF0pKQorCitzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgeworCXN0cnVjdCBpYl91b2JqZWN0CXVvYmplY3Q7CisJc3RydWN0IGliX3VtZW0JCXVtZW07Cit9OworCiBzdHJ1Y3QgaWJfcGQgewotCXN0cnVjdCBpYl9kZXZpY2UgKmRldmljZTsKLQlhdG9taWNfdCAgICAgICAgICB1c2VjbnQ7IC8qIGNvdW50IGFsbCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKKwlhdG9taWNfdCAgICAgICAgICAJdXNlY250OyAvKiBjb3VudCBhbGwgcmVzb3VyY2VzICovCiB9OwogCiBzdHJ1Y3QgaWJfYWggewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkqdW9iamVjdDsKIH07CiAKIHR5cGVkZWYgdm9pZCAoKmliX2NvbXBfaGFuZGxlcikoc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCk7CiAKIHN0cnVjdCBpYl9jcSB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwotCWliX2NvbXBfaGFuZGxlciAgIGNvbXBfaGFuZGxlcjsKLQl2b2lkICAgICAgICAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7Ci0Jdm9pZCAqICAgICAgICAgICAgY3FfY29udGV4dDsKLQlpbnQgICAgICAgICAgICAgICBjcWU7Ci0JYXRvbWljX3QgICAgICAgICAgdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2Ygd29yayBxdWV1ZXMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKKwlpYl9jb21wX2hhbmRsZXIgICAJY29tcF9oYW5kbGVyOworCXZvaWQgICAgICAgICAgICAgICAgICAoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBpYl9ldmVudCAqLCB2b2lkICopOworCXZvaWQgKiAgICAgICAgICAgIAljcV9jb250ZXh0OworCWludCAgICAgICAgICAgICAgIAljcWU7CisJYXRvbWljX3QgICAgICAgICAgCXVzZWNudDsgLyogY291bnQgbnVtYmVyIG9mIHdvcmsgcXVldWVzICovCiB9OwogCiBzdHJ1Y3QgaWJfc3JxIHsKIAlzdHJ1Y3QgaWJfZGV2aWNlCSpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QJKnVvYmplY3Q7CiAJc3RydWN0IGliX3BkCQkqcGQ7CiAJdm9pZAkJCSpzcnFfY29udGV4dDsKIAlhdG9taWNfdAkJdXNlY250OwpAQCAtNjUyLDYgKzcxMyw3IEBACiAJc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcTsKIAlzdHJ1Y3QgaWJfY3EJICAgICAgICpyZWN2X2NxOwogCXN0cnVjdCBpYl9zcnEJICAgICAgICpzcnE7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKIAl2b2lkICAgICAgICAgICAgICAgICAgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgICAgKnFwX2NvbnRleHQ7CiAJdTMyCQkJcXBfbnVtOwpAQCAtNjU5LDE2ICs3MjEsMTggQEAKIH07CiAKIHN0cnVjdCBpYl9tciB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBpYl9wZCAgICAgKnBkOwotCXUzMgkJICBsa2V5OwotCXUzMgkJICBya2V5OwotCWF0b21pY190ICAgICAgICAgIHVzZWNudDsgLyogY291bnQgbnVtYmVyIG9mIE1XcyAqLworCXN0cnVjdCBpYl9kZXZpY2UgICpkZXZpY2U7CisJc3RydWN0IGliX3BkCSAgKnBkOworCXN0cnVjdCBpYl91b2JqZWN0ICp1b2JqZWN0OworCXUzMgkJICAgbGtleTsKKwl1MzIJCSAgIHJrZXk7CisJYXRvbWljX3QJICAgdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2YgTVdzICovCiB9OwogCiBzdHJ1Y3QgaWJfbXcgewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkqdW9iamVjdDsKIAl1MzIJCQlya2V5OwogfTsKIApAQCAtNzM3LDcgKzgwMSwxNCBAQAogCWludAkJICAgICAgICAgICAoKm1vZGlmeV9wb3J0KShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCiAJCQkJCQkgIHU4IHBvcnRfbnVtLCBpbnQgcG9ydF9tb2RpZnlfbWFzaywKIAkJCQkJCSAgc3RydWN0IGliX3BvcnRfbW9kaWZ5ICpwb3J0X21vZGlmeSk7Ci0Jc3RydWN0IGliX3BkICogICAgICAgICAgICAgKCphbGxvY19wZCkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKTsKKwlzdHJ1Y3QgaWJfdWNvbnRleHQgKiAgICAgICAoKmFsbG9jX3Vjb250ZXh0KShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVhbGxvY191Y29udGV4dCkoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKm1tYXApKHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCXN0cnVjdCBpYl9wZCAqICAgICAgICAgICAgICgqYWxsb2NfcGQpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVhbGxvY19wZCkoc3RydWN0IGliX3BkICpwZCk7CiAJc3RydWN0IGliX2FoICogICAgICAgICAgICAgKCpjcmVhdGVfYWgpKHN0cnVjdCBpYl9wZCAqcGQsCiAJCQkJCQlzdHJ1Y3QgaWJfYWhfYXR0ciAqYWhfYXR0cik7CkBAIC03NDcsNyArODE4LDggQEAKIAkJCQkJICAgICAgIHN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3Ryb3lfYWgpKHN0cnVjdCBpYl9haCAqYWgpOwogCXN0cnVjdCBpYl9xcCAqICAgICAgICAgICAgICgqY3JlYXRlX3FwKShzdHJ1Y3QgaWJfcGQgKnBkLAotCQkJCQkJc3RydWN0IGliX3FwX2luaXRfYXR0ciAqcXBfaW5pdF9hdHRyKTsKKwkJCQkJCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKnFwX2luaXRfYXR0ciwKKwkJCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqbW9kaWZ5X3FwKShzdHJ1Y3QgaWJfcXAgKnFwLAogCQkJCQkJc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIsCiAJCQkJCQlpbnQgcXBfYXR0cl9tYXNrKTsKQEAgLTc2Miw4ICs4MzQsOSBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqcG9zdF9yZWN2KShzdHJ1Y3QgaWJfcXAgKnFwLAogCQkJCQkJc3RydWN0IGliX3JlY3Zfd3IgKnJlY3Zfd3IsCiAJCQkJCQlzdHJ1Y3QgaWJfcmVjdl93ciAqKmJhZF9yZWN2X3dyKTsKLQlzdHJ1Y3QgaWJfY3EgKiAgICAgICAgICAgICAoKmNyZWF0ZV9jcSkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLAotCQkJCQkJaW50IGNxZSk7CisJc3RydWN0IGliX2NxICogICAgICAgICAgICAgKCpjcmVhdGVfY3EpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwgaW50IGNxZSwKKwkJCQkJCXN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdHJveV9jcSkoc3RydWN0IGliX2NxICpjcSk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXNpemVfY3EpKHN0cnVjdCBpYl9jcSAqY3EsIGludCAqY3FlKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKnBvbGxfY3EpKHN0cnVjdCBpYl9jcSAqY3EsIGludCBudW1fZW50cmllcywKQEAgLTc4MCw2ICs4NTMsMTAgQEAKIAkJCQkJCSAgaW50IG51bV9waHlzX2J1ZiwKIAkJCQkJCSAgaW50IG1yX2FjY2Vzc19mbGFncywKIAkJCQkJCSAgdTY0ICppb3ZhX3N0YXJ0KTsKKwlzdHJ1Y3QgaWJfbXIgKiAgICAgICAgICAgICAoKnJlZ191c2VyX21yKShzdHJ1Y3QgaWJfcGQgKnBkLAorCQkJCQkJICBzdHJ1Y3QgaWJfdW1lbSAqcmVnaW9uLAorCQkJCQkJICBpbnQgbXJfYWNjZXNzX2ZsYWdzLAorCQkJCQkJICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKnF1ZXJ5X21yKShzdHJ1Y3QgaWJfbXIgKm1yLAogCQkJCQkgICAgICAgc3RydWN0IGliX21yX2F0dHIgKm1yX2F0dHIpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVyZWdfbXIpKHN0cnVjdCBpYl9tciAqbXIpOwpAQCAtODE3LDYgKzg5NCw3IEBACiAJCQkJCQkgIHN0cnVjdCBpYl9tYWQgKmluX21hZCwKIAkJCQkJCSAgc3RydWN0IGliX21hZCAqb3V0X21hZCk7CiAKKwlzdHJ1Y3QgbW9kdWxlICAgICAgICAgICAgICAgKm93bmVyOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgICAgICAgICAgY2xhc3NfZGV2OwogCXN0cnVjdCBrb2JqZWN0ICAgICAgICAgICAgICAgcG9ydHNfcGFyZW50OwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgcG9ydF9saXN0OwpAQCAtODUyLDYgKzkzMCwxNiBAQAogdm9pZCAgaWJfc2V0X2NsaWVudF9kYXRhKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwgc3RydWN0IGliX2NsaWVudCAqY2xpZW50LAogCQkJIHZvaWQgKmRhdGEpOwogCitzdGF0aWMgaW5saW5lIGludCBpYl9jb3B5X2Zyb21fdWRhdGEodm9pZCAqZGVzdCwgc3RydWN0IGliX3VkYXRhICp1ZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIoZGVzdCwgdWRhdGEtPmluYnVmLCBsZW4pID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGliX2NvcHlfdG9fdWRhdGEoc3RydWN0IGliX3VkYXRhICp1ZGF0YSwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjb3B5X3RvX3VzZXIodWRhdGEtPm91dGJ1Ziwgc3JjLCBsZW4pID8gLUVGQVVMVCA6IDA7Cit9CisKIGludCBpYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyICAoc3RydWN0IGliX2V2ZW50X2hhbmRsZXIgKmV2ZW50X2hhbmRsZXIpOwogaW50IGliX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlciAqZXZlbnRfaGFuZGxlcik7CiB2b2lkIGliX2Rpc3BhdGNoX2V2ZW50KHN0cnVjdCBpYl9ldmVudCAqZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IDU1NjI2NGIuLjM3NGY0MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogCiBzdHJ1Y3QgZXZkZXYgewogCWludCBleGlzdDsKQEAgLTE0NSw2ICsxNDYsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgeworCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOworCV9fdTE2IHR5cGU7CisJX191MTYgY29kZTsKKwlfX3MzMiB2YWx1ZTsKK307CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikKKyNlbGlmIGRlZmluZWQoQ09ORklHX0lBNjQpCisjICBkZWZpbmUgQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKGN1cnJlbnQpKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TMzkwKQorIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKQorI2Vsc2UKKyMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkKKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCBldmRldl93cml0ZV9jb21wYXQoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCBldmVudDsKKwlpbnQgcmV0dmFsID0gMDsKKworCXdoaWxlIChyZXR2YWwgPCBjb3VudCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmV2ZW50LCBidWZmZXIgKyByZXR2YWwsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaW5wdXRfZXZlbnQobGlzdC0+ZXZkZXYtPmhhbmRsZS5kZXYsIGV2ZW50LnR5cGUsIGV2ZW50LmNvZGUsIGV2ZW50LnZhbHVlKTsKKwkJcmV0dmFsICs9IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKIHN0YXRpYyBzc2l6ZV90IGV2ZGV2X3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMTUzLDYgKzE4OSwxMSBAQAogCiAJaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOwogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCWlmIChDT01QQVRfVEVTVCkKKwkJcmV0dXJuIGV2ZGV2X3dyaXRlX2NvbXBhdChmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKyNlbmRpZgorCiAJd2hpbGUgKHJldHZhbCA8IGNvdW50KSB7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZldmVudCwgYnVmZmVyICsgcmV0dmFsLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCkBAIC0xNjQsMTEgKzIwNSw1NiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgc3NpemVfdCBldmRldl9yZWFkX2NvbXBhdChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXZkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0dmFsOworCisJaWYgKGNvdW50IDwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsaXN0LT5oZWFkID09IGxpc3QtPnRhaWwgJiYgbGlzdC0+ZXZkZXYtPmV4aXN0ICYmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxpc3QtPmV2ZGV2LT53YWl0LAorCQlsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwgfHwgKCFsaXN0LT5ldmRldi0+ZXhpc3QpKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoIWxpc3QtPmV2ZGV2LT5leGlzdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmIHJldHZhbCArIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSA8PSBjb3VudCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBpbnB1dF9ldmVudCAqKSBsaXN0LT5idWZmZXIgKyBsaXN0LT50YWlsOworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGV2ZW50X2NvbXBhdDsKKwkJZXZlbnRfY29tcGF0LnRpbWUudHZfc2VjID0gZXZlbnQtPnRpbWUudHZfc2VjOworCQlldmVudF9jb21wYXQudGltZS50dl91c2VjID0gZXZlbnQtPnRpbWUudHZfdXNlYzsKKwkJZXZlbnRfY29tcGF0LnR5cGUgPSBldmVudC0+dHlwZTsKKwkJZXZlbnRfY29tcGF0LmNvZGUgPSBldmVudC0+Y29kZTsKKwkJZXZlbnRfY29tcGF0LnZhbHVlID0gZXZlbnQtPnZhbHVlOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnRfY29tcGF0LAorCQkJc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkgcmV0dXJuIC1FRkFVTFQ7CisJCWxpc3QtPnRhaWwgPSAobGlzdC0+dGFpbCArIDEpICYgKEVWREVWX0JVRkZFUl9TSVpFIC0gMSk7CisJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCiBzdGF0aWMgc3NpemVfdCBldmRldl9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXR2YWw7CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJaWYgKENPTVBBVF9URVNUKQorCQlyZXR1cm4gZXZkZXZfcmVhZF9jb21wYXQoZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7CisjZW5kaWYKKwogCWlmIChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTg2LDcgKzI3Miw3IEBACiAKIAl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmIHJldHZhbCArIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpIDw9IGNvdW50KSB7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyICsgcmV0dmFsLCBsaXN0LT5idWZmZXIgKyBsaXN0LT50YWlsLAotCQkJIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkgcmV0dXJuIC1FRkFVTFQ7CisJCQlzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpIHJldHVybiAtRUZBVUxUOwogCQlsaXN0LT50YWlsID0gKGxpc3QtPnRhaWwgKyAxKSAmIChFVkRFVl9CVUZGRVJfU0laRSAtIDEpOwogCQlyZXR2YWwgKz0gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7CiAJfQpAQCAtMjAzLDcgKzI4OSw3IEBACiAJCShsaXN0LT5ldmRldi0+ZXhpc3QgPyAwIDogKFBPTExIVVAgfCBQT0xMRVJSKSk7CiB9CiAKLXN0YXRpYyBpbnQgZXZkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgZXZkZXZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBldmRldiAqZXZkZXYgPSBsaXN0LT5ldmRldjsKQEAgLTI4NSwxMTAgKzM3MSwyNjggQEAKIAogCQlkZWZhdWx0OgogCi0JCQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ0UnIHx8IF9JT0NfRElSKGNtZCkgIT0gX0lPQ19SRUFEKQorCQkJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdFJykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+RVZfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0JJVCgwLDApKSkgeworCQkJaWYgKF9JT0NfRElSKGNtZCkgPT0gX0lPQ19SRUFEKSB7CiAKLQkJCQlsb25nICpiaXRzOwotCQkJCWludCBsZW47CisJCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+RVZfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0JJVCgwLDApKSkgewogCi0JCQkJc3dpdGNoIChfSU9DX05SKGNtZCkgJiBFVl9NQVgpIHsKLQkJCQkJY2FzZSAgICAgIDA6IGJpdHMgPSBkZXYtPmV2Yml0OyAgbGVuID0gRVZfTUFYOyAgYnJlYWs7Ci0JCQkJCWNhc2UgRVZfS0VZOiBiaXRzID0gZGV2LT5rZXliaXQ7IGxlbiA9IEtFWV9NQVg7IGJyZWFrOwotCQkJCQljYXNlIEVWX1JFTDogYml0cyA9IGRldi0+cmVsYml0OyBsZW4gPSBSRUxfTUFYOyBicmVhazsKLQkJCQkJY2FzZSBFVl9BQlM6IGJpdHMgPSBkZXYtPmFic2JpdDsgbGVuID0gQUJTX01BWDsgYnJlYWs7Ci0JCQkJCWNhc2UgRVZfTVNDOiBiaXRzID0gZGV2LT5tc2NiaXQ7IGxlbiA9IE1TQ19NQVg7IGJyZWFrOwotCQkJCQljYXNlIEVWX0xFRDogYml0cyA9IGRldi0+bGVkYml0OyBsZW4gPSBMRURfTUFYOyBicmVhazsKLQkJCQkJY2FzZSBFVl9TTkQ6IGJpdHMgPSBkZXYtPnNuZGJpdDsgbGVuID0gU05EX01BWDsgYnJlYWs7Ci0JCQkJCWNhc2UgRVZfRkY6ICBiaXRzID0gZGV2LT5mZmJpdDsgIGxlbiA9IEZGX01BWDsgIGJyZWFrOwotCQkJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJCQkJbG9uZyAqYml0czsKKwkJCQkJaW50IGxlbjsKKworCQkJCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSAmIEVWX01BWCkgeworCQkJCQkJY2FzZSAgICAgIDA6IGJpdHMgPSBkZXYtPmV2Yml0OyAgbGVuID0gRVZfTUFYOyAgYnJlYWs7CisJCQkJCQljYXNlIEVWX0tFWTogYml0cyA9IGRldi0+a2V5Yml0OyBsZW4gPSBLRVlfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfUkVMOiBiaXRzID0gZGV2LT5yZWxiaXQ7IGxlbiA9IFJFTF9NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9BQlM6IGJpdHMgPSBkZXYtPmFic2JpdDsgbGVuID0gQUJTX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX01TQzogYml0cyA9IGRldi0+bXNjYml0OyBsZW4gPSBNU0NfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfTEVEOiBiaXRzID0gZGV2LT5sZWRiaXQ7IGxlbiA9IExFRF9NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9TTkQ6IGJpdHMgPSBkZXYtPnNuZGJpdDsgbGVuID0gU05EX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX0ZGOiAgYml0cyA9IGRldi0+ZmZiaXQ7ICBsZW4gPSBGRl9NQVg7ICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJCQl9CisJCQkJCWxlbiA9IE5CSVRTKGxlbikgKiBzaXplb2YobG9uZyk7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgYml0cywgbGVuKSA/IC1FRkFVTFQgOiBsZW47CiAJCQkJfQotCQkJCWxlbiA9IE5CSVRTKGxlbikgKiBzaXplb2YobG9uZyk7Ci0JCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGJpdHMsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0tFWSgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJbGVuID0gTkJJVFMoS0VZX01BWCkgKiBzaXplb2YobG9uZyk7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5rZXksIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCX0KKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dMRUQoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWxlbiA9IE5CSVRTKExFRF9NQVgpICogc2l6ZW9mKGxvbmcpOworCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+bGVkLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHU05EKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlsZW4gPSBOQklUUyhTTkRfTUFYKSAqIHNpemVvZihsb25nKTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnNuZCwgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR05BTUUoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWlmICghZGV2LT5uYW1lKSByZXR1cm4gLUVOT0VOVDsKKwkJCQkJbGVuID0gc3RybGVuKGRldi0+bmFtZSkgKyAxOworCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+bmFtZSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1BIWVMoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWlmICghZGV2LT5waHlzKSByZXR1cm4gLUVOT0VOVDsKKwkJCQkJbGVuID0gc3RybGVuKGRldi0+cGh5cykgKyAxOworCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+cGh5cywgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1VOSVEoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWlmICghZGV2LT51bmlxKSByZXR1cm4gLUVOT0VOVDsKKwkJCQkJbGVuID0gc3RybGVuKGRldi0+dW5pcSkgKyAxOworCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+dW5pcSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCisJCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+QUJTX01BWCkgPT0gX0lPQ19OUihFVklPQ0dBQlMoMCkpKSB7CisKKwkJCQkJaW50IHQgPSBfSU9DX05SKGNtZCkgJiBBQlNfTUFYOworCisJCQkJCWFicy52YWx1ZSA9IGRldi0+YWJzW3RdOworCQkJCQlhYnMubWluaW11bSA9IGRldi0+YWJzbWluW3RdOworCQkJCQlhYnMubWF4aW11bSA9IGRldi0+YWJzbWF4W3RdOworCQkJCQlhYnMuZnV6eiA9IGRldi0+YWJzZnV6elt0XTsKKwkJCQkJYWJzLmZsYXQgPSBkZXYtPmFic2ZsYXRbdF07CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmYWJzLCBzaXplb2Yoc3RydWN0IGlucHV0X2Fic2luZm8pKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJCXJldHVybiAwOworCQkJCX0KKwogCQkJfQogCi0JCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHS0VZKDApKSkgewotCQkJCWludCBsZW47Ci0JCQkJbGVuID0gTkJJVFMoS0VZX01BWCkgKiBzaXplb2YobG9uZyk7Ci0JCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+a2V5LCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKLQkJCX0KKwkJCWlmIChfSU9DX0RJUihjbWQpID09IF9JT0NfV1JJVEUpIHsKIAotCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0xFRCgwKSkpIHsKLQkJCQlpbnQgbGVuOwotCQkJCWxlbiA9IE5CSVRTKExFRF9NQVgpICogc2l6ZW9mKGxvbmcpOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPmxlZCwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQl9CisJCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+QUJTX01BWCkgPT0gX0lPQ19OUihFVklPQ1NBQlMoMCkpKSB7CiAKLQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dTTkQoMCkpKSB7Ci0JCQkJaW50IGxlbjsKLQkJCQlsZW4gPSBOQklUUyhTTkRfTUFYKSAqIHNpemVvZihsb25nKTsKLQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5zbmQsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJfQorCQkJCQlpbnQgdCA9IF9JT0NfTlIoY21kKSAmIEFCU19NQVg7CiAKLQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dOQU1FKDApKSkgewotCQkJCWludCBsZW47Ci0JCQkJaWYgKCFkZXYtPm5hbWUpIHJldHVybiAtRU5PRU5UOwotCQkJCWxlbiA9IHN0cmxlbihkZXYtPm5hbWUpICsgMTsKLQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5uYW1lLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKLQkJCX0KKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYnMsIHAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfYWJzaW5mbykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dQSFlTKDApKSkgewotCQkJCWludCBsZW47Ci0JCQkJaWYgKCFkZXYtPnBoeXMpIHJldHVybiAtRU5PRU5UOwotCQkJCWxlbiA9IHN0cmxlbihkZXYtPnBoeXMpICsgMTsKLQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5waHlzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKLQkJCX0KKwkJCQkJZGV2LT5hYnNbdF0gPSBhYnMudmFsdWU7CisJCQkJCWRldi0+YWJzbWluW3RdID0gYWJzLm1pbmltdW07CisJCQkJCWRldi0+YWJzbWF4W3RdID0gYWJzLm1heGltdW07CisJCQkJCWRldi0+YWJzZnV6elt0XSA9IGFicy5mdXp6OworCQkJCQlkZXYtPmFic2ZsYXRbdF0gPSBhYnMuZmxhdDsKIAotCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1VOSVEoMCkpKSB7Ci0JCQkJaW50IGxlbjsKLQkJCQlpZiAoIWRldi0+dW5pcSkgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJbGVuID0gc3RybGVuKGRldi0+dW5pcSkgKyAxOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnVuaXEsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJfQotCi0JCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5BQlNfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0FCUygwKSkpIHsKLQotCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKLQotCQkJCWFicy52YWx1ZSA9IGRldi0+YWJzW3RdOwotCQkJCWFicy5taW5pbXVtID0gZGV2LT5hYnNtaW5bdF07Ci0JCQkJYWJzLm1heGltdW0gPSBkZXYtPmFic21heFt0XTsKLQkJCQlhYnMuZnV6eiA9IGRldi0+YWJzZnV6elt0XTsKLQkJCQlhYnMuZmxhdCA9IGRldi0+YWJzZmxhdFt0XTsKLQotCQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmFicywgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NTQUJTKDApKSkgewotCi0JCQkJaW50IHQgPSBfSU9DX05SKGNtZCkgJiBBQlNfTUFYOwotCi0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYnMsIHAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfYWJzaW5mbykpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCWRldi0+YWJzW3RdID0gYWJzLnZhbHVlOwotCQkJCWRldi0+YWJzbWluW3RdID0gYWJzLm1pbmltdW07Ci0JCQkJZGV2LT5hYnNtYXhbdF0gPSBhYnMubWF4aW11bTsKLQkJCQlkZXYtPmFic2Z1enpbdF0gPSBhYnMuZnV6ejsKLQkJCQlkZXYtPmFic2ZsYXRbdF0gPSBhYnMuZmxhdDsKLQotCQkJCXJldHVybiAwOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CiAJCQl9CiAJfQogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjZGVmaW5lIEJJVFNfUEVSX0xPTkdfQ09NUEFUIChzaXplb2YoY29tcGF0X2xvbmdfdCkgKiA4KQorI2RlZmluZSBOQklUU19DT01QQVQoeCkgKCgoKHgpLTEpL0JJVFNfUEVSX0xPTkdfQ09NUEFUKSsxKQorI2RlZmluZSBPRkZfQ09NUEFUKHgpICAoKHgpJUJJVFNfUEVSX0xPTkdfQ09NUEFUKQorI2RlZmluZSBCSVRfQ09NUEFUKHgpICAoMVVMPDxPRkZfQ09NUEFUKHgpKQorI2RlZmluZSBMT05HX0NPTVBBVCh4KSAoKHgpL0JJVFNfUEVSX0xPTkdfQ09NUEFUKQorI2RlZmluZSB0ZXN0X2JpdF9jb21wYXQoYml0LCBhcnJheSkgKChhcnJheVtMT05HX0NPTVBBVChiaXQpXSA+PiBPRkZfQ09NUEFUKGJpdCkpICYgMSkKKworI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBiaXRfdG9fdXNlcihiaXQsIG1heCkgXAorZG8geyBcCisJaW50IGk7IFwKKwlpbnQgbGVuID0gTkJJVFNfQ09NUEFUKChtYXgpKSAqIHNpemVvZihjb21wYXRfbG9uZ190KTsgXAorCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7IFwKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBpKyspIFwKKwkJaWYgKGNvcHlfdG9fdXNlcigoY29tcGF0X2xvbmdfdCopIHAgKyBpLCBcCisJCQkJIChjb21wYXRfbG9uZ190KikgKGJpdCkgKyBpICsgMSAtICgoaSAlIDIpIDw8IDEpLCBcCisJCQkJIHNpemVvZihjb21wYXRfbG9uZ190KSkpIFwKKwkJCXJldHVybiAtRUZBVUxUOyBcCisJcmV0dXJuIGxlbjsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGJpdF90b191c2VyKGJpdCwgbWF4KSBcCitkbyB7IFwKKwlpbnQgbGVuID0gTkJJVFNfQ09NUEFUKChtYXgpKSAqIHNpemVvZihjb21wYXRfbG9uZ190KTsgXAorCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7IFwKKwlyZXR1cm4gY29weV90b191c2VyKHAsIChiaXQpLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBldmRldl9pb2N0bF9jb21wYXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBldmRldiAqZXZkZXYgPSBsaXN0LT5ldmRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBldmRldi0+aGFuZGxlLmRldjsKKwlzdHJ1Y3QgaW5wdXRfYWJzaW5mbyBhYnM7CisJdm9pZCBfX3VzZXIgKnAgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoIWV2ZGV2LT5leGlzdCkgcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJCWNhc2UgRVZJT0NHVkVSU0lPTjoKKwkJY2FzZSBFVklPQ0dJRDoKKwkJY2FzZSBFVklPQ0dLRVlDT0RFOgorCQljYXNlIEVWSU9DU0tFWUNPREU6CisJCWNhc2UgRVZJT0NTRkY6CisJCWNhc2UgRVZJT0NSTUZGOgorCQljYXNlIEVWSU9DR0VGRkVDVFM6CisJCWNhc2UgRVZJT0NHUkFCOgorCQkJcmV0dXJuIGV2ZGV2X2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHApOworCisJCWRlZmF1bHQ6CisKKwkJCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnRScpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChfSU9DX0RJUihjbWQpID09IF9JT0NfUkVBRCkgeworCisJCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+RVZfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0JJVCgwLDApKSkgeworCQkJCQlsb25nICpiaXRzOworCQkJCQlpbnQgbWF4OworCisJCQkJCXN3aXRjaCAoX0lPQ19OUihjbWQpICYgRVZfTUFYKSB7CisJCQkJCQljYXNlICAgICAgMDogYml0cyA9IGRldi0+ZXZiaXQ7ICBtYXggPSBFVl9NQVg7ICBicmVhazsKKwkJCQkJCWNhc2UgRVZfS0VZOiBiaXRzID0gZGV2LT5rZXliaXQ7IG1heCA9IEtFWV9NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9SRUw6IGJpdHMgPSBkZXYtPnJlbGJpdDsgbWF4ID0gUkVMX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX0FCUzogYml0cyA9IGRldi0+YWJzYml0OyBtYXggPSBBQlNfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfTVNDOiBiaXRzID0gZGV2LT5tc2NiaXQ7IG1heCA9IE1TQ19NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9MRUQ6IGJpdHMgPSBkZXYtPmxlZGJpdDsgbWF4ID0gTEVEX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX1NORDogYml0cyA9IGRldi0+c25kYml0OyBtYXggPSBTTkRfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfRkY6ICBiaXRzID0gZGV2LT5mZmJpdDsgIG1heCA9IEZGX01BWDsgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJYml0X3RvX3VzZXIoYml0cywgbWF4KTsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHS0VZKDApKSkKKwkJCQkJYml0X3RvX3VzZXIoZGV2LT5rZXksIEtFWV9NQVgpOworCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0xFRCgwKSkpCisJCQkJCWJpdF90b191c2VyKGRldi0+bGVkLCBMRURfTUFYKTsKKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dTTkQoMCkpKQorCQkJCQliaXRfdG9fdXNlcihkZXYtPnNuZCwgU05EX01BWCk7CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHTkFNRSgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPm5hbWUpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT5uYW1lKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5uYW1lLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHUEhZUygwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPnBoeXMpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT5waHlzKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5waHlzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHVU5JUSgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPnVuaXEpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT51bmlxKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT51bmlxLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5BQlNfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0FCUygwKSkpIHsKKworCQkJCQlpbnQgdCA9IF9JT0NfTlIoY21kKSAmIEFCU19NQVg7CisKKwkJCQkJYWJzLnZhbHVlID0gZGV2LT5hYnNbdF07CisJCQkJCWFicy5taW5pbXVtID0gZGV2LT5hYnNtaW5bdF07CisJCQkJCWFicy5tYXhpbXVtID0gZGV2LT5hYnNtYXhbdF07CisJCQkJCWFicy5mdXp6ID0gZGV2LT5hYnNmdXp6W3RdOworCQkJCQlhYnMuZmxhdCA9IGRldi0+YWJzZmxhdFt0XTsKKworCQkJCQlpZiAoY29weV90b191c2VyKHAsICZhYnMsIHNpemVvZihzdHJ1Y3QgaW5wdXRfYWJzaW5mbykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCisJCQlpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1dSSVRFKSB7CisKKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5BQlNfTUFYKSA9PSBfSU9DX05SKEVWSU9DU0FCUygwKSkpIHsKKworCQkJCQlpbnQgdCA9IF9JT0NfTlIoY21kKSAmIEFCU19NQVg7CisKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYnMsIHAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfYWJzaW5mbykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQkJZGV2LT5hYnNbdF0gPSBhYnMudmFsdWU7CisJCQkJCWRldi0+YWJzbWluW3RdID0gYWJzLm1pbmltdW07CisJCQkJCWRldi0+YWJzbWF4W3RdID0gYWJzLm1heGltdW07CisJCQkJCWRldi0+YWJzZnV6elt0XSA9IGFicy5mdXp6OworCQkJCQlkZXYtPmFic2ZsYXRbdF0gPSBhYnMuZmxhdDsKKworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV2ZGV2X2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLnJlYWQgPQkJZXZkZXZfcmVhZCwKQEAgLTM5Niw3ICs2NDAsMTAgQEAKIAkucG9sbCA9CQlldmRldl9wb2xsLAogCS5vcGVuID0JCWV2ZGV2X29wZW4sCiAJLnJlbGVhc2UgPQlldmRldl9yZWxlYXNlLAotCS5pb2N0bCA9CWV2ZGV2X2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bCA9IGV2ZGV2X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0JZXZkZXZfaW9jdGxfY29tcGF0LAorI2VuZGlmCiAJLmZhc3luYyA9CWV2ZGV2X2Zhc3luYywKIAkuZmx1c2ggPQlldmRldl9mbHVzaAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvS2NvbmZpZwppbmRleCAxZDkzZjUwLi43NTI0YmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9LY29uZmlnCkBAIC00OSwyMiArNDksOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW11MTBrMS1ncC4KIAotY29uZmlnIEdBTUVQT1JUX1ZPUlRFWAotCXRyaXN0YXRlICJBdXJlYWwgVm9ydGV4LCBWb3J0ZXggMiBnYW1lcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBdXJlYWwgVm9ydGV4IDEgb3IgMiAgY2FyZCBhbmQgd2FudAotCSAgdG8gdXNlIGl0cyBnYW1lcG9ydC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdm9ydGV4LgotCiBjb25maWcgR0FNRVBPUlRfRk04MDEKIAl0cmlzdGF0ZSAiRm9ydGVNZWRpYSBGTTgwMSBnYW1lcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAKLWNvbmZpZyBHQU1FUE9SVF9DUzQ2MVgKLQl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZEZ1c2lvbiBnYW1lcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9NYWtlZmlsZQppbmRleCA1MzY3YjQyLi5iNmY2MDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvTWFrZWZpbGUKQEAgLTUsOSArNSw3IEBACiAjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCiAKIG9iai0kKENPTkZJR19HQU1FUE9SVCkJCSs9IGdhbWVwb3J0Lm8KLW9iai0kKENPTkZJR19HQU1FUE9SVF9DUzQ2MVgpCSs9IGNzNDYxeC5vCiBvYmotJChDT05GSUdfR0FNRVBPUlRfRU1VMTBLMSkJKz0gZW11MTBrMS1ncC5vCiBvYmotJChDT05GSUdfR0FNRVBPUlRfRk04MDEpCSs9IGZtODAxLWdwLm8KIG9iai0kKENPTkZJR19HQU1FUE9SVF9MNCkJKz0gbGlnaHRuaW5nLm8KIG9iai0kKENPTkZJR19HQU1FUE9SVF9OUzU1OCkJKz0gbnM1NTgubwotb2JqLSQoQ09ORklHX0dBTUVQT1JUX1ZPUlRFWCkJKz0gdm9ydGV4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvY3M0NjF4LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2NzNDYxeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAxM2ZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvY3M0NjF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoKLQlUaGUgYWxsIGRlZmluZXMgYW5kIHBhcnQgb2YgY29kZSAoc3VjaCBhcyBjczQ2MXhfKikgYXJlCi0JY29udHJpYnV0ZWQgZnJvbSBBTFNBIDAuNS44IHNvdXJjZXMuCi0JU2VlIGh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy8gZm9yIHNvdXJjZXMKLQotCVRlc3RlZCBvbiBMaW51eCA2ODYgMi40LjAtdGVzdDksIEFMU0EgMC41LjhhIGFuZCBDUzQ2MTAKLSovCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotTU9EVUxFX0FVVEhPUigiVmljdG9yIEtyYXBpdmluIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qCi0JVGhlc2Ugb3B0aW9ucyBhcmUgZXhwZXJpbWVudGFsCi0KLSNkZWZpbmUgQ1M0NjFYX0ZVTExfTUFQCi0qLwotCi0KLSNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DSVJSVVMKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVJSVVMgICAgICAgICAgICAweDEwMTMKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAgICAgICAgMHg2MDAxCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyICAgICAgIDB4NjAwMwotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNSAgICAgICAweDYwMDQKLSNlbmRpZgotCi0vKiBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBCQTBfSlNQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4MAotI2RlZmluZSBCQTBfSlNDVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4NAotI2RlZmluZSBCQTBfSlNDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4OAotI2RlZmluZSBCQTBfSlNDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4QwotI2RlZmluZSBCQTBfSlNJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBMAotCi0vKiBCaXRzIGZvciBKU1BUICovCi0KLSNkZWZpbmUgSlNQVF9DQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSlNQVF9DQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSlNQVF9DQlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSlNQVF9DQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSlNQVF9CQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSlNQVF9CQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSlNQVF9CQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSlNQVF9CQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyogQml0cyBmb3IgSlNDVEwgKi8KLQotI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBKU0NUTF9TUF9TTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fU0xPVyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU0NUTF9TUF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBKU0NUTF9BUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotCi0vKiBEYXRhIHJlZ2lzdGVyIHBhaXJzIG1hc2tzICovCi0KLSNkZWZpbmUgSlNDMV9ZMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSlNDMV9YMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSlNDMV9ZMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSlNDMV9YMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEpTQzJfWTJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEpTQzJfWDJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIEpTQzJfWTJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEpTQzJfWDJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotCi0vKiBKUyBHUElPICovCi0KLSNkZWZpbmUgSlNJT19EQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSlNJT19EQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSlNJT19EQlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSlNJT19EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSlNJT19BWE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSlNJT19BWU9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSlNJT19CWE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSlNJT19CWU9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoKLSAgIFRoZSBjYXJkIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgb2JmdXNjYXRlZDsgdGhlIG1vZHVsZSBjczQ2MXgKLSAgIG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIEFMU0EgbW9kdWxlcyBpbml0aWFsaXplZCBhbmQgc29tZXRoaW5nCi0gICBwbGF5ZWQgb24gdGhlIENTIDQ2MTAgY2hpcCAoc2VlIHNvdXJjZXMgZm9yIGRldGFpbHMgb2YgQ1M0NjEwCi0gICBpbml0aWFsaXphdGlvbiBjb2RlIGZyb20gQUxTQSkKLSovCi0KLS8qIENhcmQgc3BlY2lmaWMgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBDUzQ2MVhfQkEwX1NJWkUgICAgICAgICAweDIwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9EQVRBMF9TSVpFICAgMHgzMDAwCi0jZGVmaW5lIENTNDYxWF9CQTFfREFUQTFfU0laRSAgIDB4MzgwMAotI2RlZmluZSBDUzQ2MVhfQkExX1BSR19TSVpFICAgICAweDcwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9SRUdfU0laRSAgICAgMHgwMTAwCi0KLSNkZWZpbmUgQkExX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQkExX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgQkExX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgQkExX1NQX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLQotI2RlZmluZSBCQTFfRFdPUkRfU0laRSAgICAgICAgICAoMTMgKiAxMDI0ICsgNTEyKQotI2RlZmluZSBCQTFfTUVNT1JZX0NPVU5UICAgICAgICAzCi0KLS8qCi0gICBPbmx5IG9uZSBDUzQ2MXggY2FyZCBpcyBzdGlsbCBzdXBwb3RlZDsgdGhlIGNvZGUgcmVxdWlyZXMKLSAgIHJlZGVzaWduIHRvIGF2b2lkIHRoaXMgbGltaXRhdHVpb24uCi0qLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiYTBfYWRkcjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pb21lbSAqYmEwOwotCi0jaWZkZWYgQ1M0NjFYX0ZVTExfTUFQCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiYTFfYWRkcjsKLXN0YXRpYyB1bmlvbiBiYTFfdCB7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9faW9tZW0gKmRhdGEwOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX2lvbWVtICpkYXRhMTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19pb21lbSAqcG1lbTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19pb21lbSAqcmVnOwotICAgICAgICB9IG5hbWU7Ci0gICAgICAgIHVuc2lnbmVkIGludCBfX2lvbWVtICppZHhbNF07Ci19IGJhMTsKLQotc3RhdGljIHZvaWQgY3M0NjF4X3Bva2UodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0gICAgICAgIHdyaXRlbCh2YWwsICZiYTEuaWR4WyhyZWcgPj4gMTYpICYgM11bKHJlZyA+PiAyKSAmIDB4M2ZmZl0pOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrKHVuc2lnbmVkIGxvbmcgcmVnKQotewotICAgICAgICByZXR1cm4gcmVhZGwoJmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXVsocmVnID4+IDIpICYgMHgzZmZmXSk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcG9rZUJBMCh1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLSAgICAgICAgd3JpdGVsKHZhbCwgJmJhMFtyZWcgPj4gMl0pOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrQkEwKHVuc2lnbmVkIGxvbmcgcmVnKQotewotICAgICAgICByZXR1cm4gcmVhZGwoJmJhMFtyZWcgPj4gMl0pOwotfQotCi1zdGF0aWMgaW50IGNzNDYxeF9mcmVlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBnYW1lcG9ydCAqcG9ydCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmIChwb3J0KQotCSAgICBnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocG9ydCk7Ci0KLQlpZiAoYmEwKSBpb3VubWFwKGJhMCk7Ci0jaWZkZWYgQ1M0NjFYX0ZVTExfTUFQCi0JaWYgKGJhMS5uYW1lLmRhdGEwKSBpb3VubWFwKGJhMS5uYW1lLmRhdGEwKTsKLQlpZiAoYmExLm5hbWUuZGF0YTEpIGlvdW5tYXAoYmExLm5hbWUuZGF0YTEpOwotCWlmIChiYTEubmFtZS5wbWVtKSAgaW91bm1hcChiYTEubmFtZS5wbWVtKTsKLQlpZiAoYmExLm5hbWUucmVnKSAgIGlvdW5tYXAoYmExLm5hbWUucmVnKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfZ2FtZXBvcnRfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQotewotCWNzNDYxeF9wb2tlQkEwKEJBMF9KU1BULCAweEZGKTsgIC8vb3V0YihnYW1lcG9ydC0+aW8sIDB4RkYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjczQ2MXhfZ2FtZXBvcnRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQotewotCXJldHVybiBjczQ2MXhfcGVla0JBMChCQTBfSlNQVCk7IC8vaW5iKGdhbWVwb3J0LT5pbyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0NjF4X2dhbWVwb3J0X2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCAqYXhlcywgaW50ICpidXR0b25zKQotewotCXVuc2lnbmVkIGpzMSwganMyLCBqc3Q7Ci0KLQlqczEgPSBjczQ2MXhfcGVla0JBMChCQTBfSlNDMSk7Ci0JanMyID0gY3M0NjF4X3BlZWtCQTAoQkEwX0pTQzIpOwotCWpzdCA9IGNzNDYxeF9wZWVrQkEwKEJBMF9KU1BUKTsKLQotCSpidXR0b25zID0gKH5qc3QgPj4gNCkgJiAweDBGOwotCi0JYXhlc1swXSA9ICgoanMxICYgSlNDMV9ZMVZfTUFTSykgPj4gSlNDMV9ZMVZfU0hJRlQpICYgMHhGRkZGOwotCWF4ZXNbMV0gPSAoKGpzMSAmIEpTQzFfWDFWX01BU0spID4+IEpTQzFfWDFWX1NISUZUKSAmIDB4RkZGRjsKLQlheGVzWzJdID0gKChqczIgJiBKU0MyX1kyVl9NQVNLKSA+PiBKU0MyX1kyVl9TSElGVCkgJiAweEZGRkY7Ci0JYXhlc1szXSA9ICgoanMyICYgSlNDMl9YMlZfTUFTSykgPj4gSlNDMl9YMlZfU0hJRlQpICYgMHhGRkZGOwotCi0JZm9yKGpzdD0wO2pzdDw0OysranN0KQotCQlpZihheGVzW2pzdF09PTB4RkZGRikgYXhlc1tqc3RdID0gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0NjF4X2dhbWVwb3J0X29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCi17Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgR0FNRVBPUlRfTU9ERV9DT09LRUQ6Ci0JCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQ2MXhfcGNpX3RibFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9DSVJSVVMsIDB4NjAwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBDaXJydXMgQ1M0NjEwICovCi0JeyBQQ0lfVkVORE9SX0lEX0NJUlJVUywgMHg2MDAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIENpcnJ1cyBDUzQ2MTIgKi8KLQl7IFBDSV9WRU5ET1JfSURfQ0lSUlVTLCAweDYwMDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwgLyogQ2lycnVzIENTNDYxNSAqLwotCXsgMCwgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczQ2MXhfcGNpX3RibCk7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGNzNDYxeF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBnYW1lcG9ydCogcG9ydDsKLQotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0NjF4OiBDYW5ub3QgZW5hYmxlIFBDSSBnYW1lcG9ydCAoYnVzICVkLCBkZXZmbiAlZCkgZXJyb3I9JWRcbiIsCi0JCQlwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWJhMF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotI2lmZGVmIENTNDYxWF9GVUxMX01BUAotCWJhMV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotI2VuZGlmCi0JaWYgKGJhMF9hZGRyID09IDAgfHwgYmEwX2FkZHIgPT0gfjAKLSNpZmRlZiBDUzQ2MVhfRlVMTF9NQVAKLSAgICAgICAgICAgIHx8IGJhMV9hZGRyID09IDAgfHwgYmExX2FkZHIgPT0gfjAKLSNlbmRpZgotCSAgICApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDYxeDogd3JvbmcgYWRkcmVzcyAtIGJhMCA9IDB4JWx4XG4iLCBiYTBfYWRkcik7Ci0jaWZkZWYgQ1M0NjFYX0ZVTExfTUFQCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQ2MXg6IHdyb25nIGFkZHJlc3MgLSBiYTEgPSAweCVseFxuIiwgYmExX2FkZHIpOwotI2VuZGlmCi0JCWNzNDYxeF9mcmVlKHBkZXYpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0KLQliYTAgPSBpb3JlbWFwKGJhMF9hZGRyLCBDUzQ2MVhfQkEwX1NJWkUpOwotI2lmZGVmIENTNDYxWF9GVUxMX01BUAotCWJhMS5uYW1lLmRhdGEwID0gaW9yZW1hcChiYTFfYWRkciArIEJBMV9TUF9ETUVNMCwgQ1M0NjFYX0JBMV9EQVRBMF9TSVpFKTsKLQliYTEubmFtZS5kYXRhMSA9IGlvcmVtYXAoYmExX2FkZHIgKyBCQTFfU1BfRE1FTTEsIENTNDYxWF9CQTFfREFUQTFfU0laRSk7Ci0JYmExLm5hbWUucG1lbSAgPSBpb3JlbWFwKGJhMV9hZGRyICsgQkExX1NQX1BNRU0sIENTNDYxWF9CQTFfUFJHX1NJWkUpOwotCWJhMS5uYW1lLnJlZyAgID0gaW9yZW1hcChiYTFfYWRkciArIEJBMV9TUF9SRUcsIENTNDYxWF9CQTFfUkVHX1NJWkUpOwotCi0JaWYgKGJhMCA9PSBOVUxMIHx8IGJhMS5uYW1lLmRhdGEwID09IE5VTEwgfHwKLSAgICAgICAgICAgIGJhMS5uYW1lLmRhdGExID09IE5VTEwgfHwgYmExLm5hbWUucG1lbSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBiYTEubmFtZS5yZWcgPT0gTlVMTCkgewotCQljczQ2MXhfZnJlZShwZGV2KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotI2Vsc2UKLQlpZiAoYmEwID09IE5VTEwpIHsKLQkJY3M0NjF4X2ZyZWUocGRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLSNlbmRpZgotCi0JaWYgKCEocG9ydCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2MXg6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWNzNDYxeF9mcmVlKHBkZXYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcG9ydCk7Ci0KLQlwb3J0LT5vcGVuID0gY3M0NjF4X2dhbWVwb3J0X29wZW47Ci0JcG9ydC0+dHJpZ2dlciA9IGNzNDYxeF9nYW1lcG9ydF90cmlnZ2VyOwotCXBvcnQtPnJlYWQgPSBjczQ2MXhfZ2FtZXBvcnRfcmVhZDsKLQlwb3J0LT5jb29rZWRfcmVhZCA9IGNzNDYxeF9nYW1lcG9ydF9jb29rZWRfcmVhZDsKLQotCWdhbWVwb3J0X3NldF9uYW1lKHBvcnQsICJDUzQxNngiKTsKLQlnYW1lcG9ydF9zZXRfcGh5cyhwb3J0LCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUocGRldikpOwotCXBvcnQtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCi0JY3M0NjF4X3Bva2VCQTAoQkEwX0pTSU8sIDB4RkYpOyAvLyA/Ci0JY3M0NjF4X3Bva2VCQTAoQkEwX0pTQ1RMLCBKU0NUTF9TUF9NRURJVU1fU0xPVyk7Ci0KLQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHBvcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjczQ2MXhfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQljczQ2MXhfZnJlZShwZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNzNDYxeF9wY2lfZHJpdmVyID0gewotICAgICAgICAubmFtZSA9ICAgICAgICAgIkNTNDYxeF9nYW1lcG9ydCIsCi0gICAgICAgIC5pZF90YWJsZSA9ICAgICBjczQ2MXhfcGNpX3RibCwKLSAgICAgICAgLnByb2JlID0gICAgICAgIGNzNDYxeF9wY2lfcHJvYmUsCi0gICAgICAgIC5yZW1vdmUgPSAgICAgICBfX2RldmV4aXRfcChjczQ2MXhfcGNpX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjczQ2MXhfaW5pdCh2b2lkKQotewotICAgICAgICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3M0NjF4X3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY3M0NjF4X2V4aXQodm9pZCkKLXsKLSAgICAgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjczQ2MXhfcGNpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGNzNDYxeF9pbml0KTsKLW1vZHVsZV9leGl0KGNzNDYxeF9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IGM3N2E4MmUuLmFiMDljZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTE3LDExICsxNywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogLyojaW5jbHVkZSA8YXNtL2lvLmg+Ki8KIApAQCAtNjEsMTIgKzYwLDEzIEBACiAKICNpZiBkZWZpbmVkKF9faTM4Nl9fKQogCisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisKICNkZWZpbmUgREVMVEEoeCx5KSAgICAgICgoeSktKHgpKygoeSk8KHgpPzExOTMxODIvSFo6MCkpCiAjZGVmaW5lIEdFVF9USU1FKHgpICAgICBkbyB7IHggPSBnZXRfdGltZV9waXQoKTsgfSB3aGlsZSAoMCkKIAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRfdGltZV9waXQodm9pZCkKIHsKLQlleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNvdW50OwogCkBAIC0yMzgsOCArMjM4LDcgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2FtZXBvcnRfZXZlbnRfbG9jayk7CS8qIHByb3RlY3RzIGdhbWVwb3J0X2V2ZW50X2xpc3QgKi8KIHN0YXRpYyBMSVNUX0hFQUQoZ2FtZXBvcnRfZXZlbnRfbGlzdCk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ2FtZXBvcnRfd2FpdCk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGdhbWVwb3J0X2V4aXRlZCk7Ci1zdGF0aWMgaW50IGdhbWVwb3J0X3BpZDsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdhbWVwb3J0X3Rhc2s7CiAKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X3F1ZXVlX2V2ZW50KHZvaWQgKm9iamVjdCwgc3RydWN0IG1vZHVsZSAqb3duZXIsCiAJCQkgICAgICBlbnVtIGdhbWVwb3J0X2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKQEAgLTI1MCwxMiArMjQ5LDEyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdhbWVwb3J0X2V2ZW50X2xvY2ssIGZsYWdzKTsKIAogCS8qCi0gCSAqIFNjYW4gZXZlbnQgbGlzdCBmb3IgdGhlIG90aGVyIGV2ZW50cyBmb3IgdGhlIHNhbWUgZ2FtZXBvcnQgcG9ydCwKKwkgKiBTY2FuIGV2ZW50IGxpc3QgZm9yIHRoZSBvdGhlciBldmVudHMgZm9yIHRoZSBzYW1lIGdhbWVwb3J0IHBvcnQsCiAJICogc3RhcnRpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgb25lLiBJZiBldmVudCBpcyB0aGUgc2FtZSB3ZQogCSAqIGRvIG5vdCBuZWVkIGFkZCBuZXcgb25lLiBJZiBldmVudCBpcyBvZiBkaWZmZXJlbnQgdHlwZSB3ZQogCSAqIG5lZWQgdG8gYWRkIHRoaXMgZXZlbnQgYW5kIHNob3VsZCBub3QgbG9vayBmdXJ0aGVyIGJlY2F1c2UKIAkgKiB3ZSBuZWVkIHRvIHByZXNldmUgc2VxdWVuY2Ugb2YgZGlzdGluY3QgZXZlbnRzLgotIAkgKi8KKwkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZXZlbnQsICZnYW1lcG9ydF9ldmVudF9saXN0LCBub2RlKSB7CiAJCWlmIChldmVudC0+b2JqZWN0ID09IG9iamVjdCkgewogCQkJaWYgKGV2ZW50LT50eXBlID09IGV2ZW50X3R5cGUpCkBAIC00MzIsMjAgKzQzMSwxNSBAQAogCiBzdGF0aWMgaW50IGdhbWVwb3J0X3RocmVhZCh2b2lkICpub3RoaW5nKQogewotCWxvY2tfa2VybmVsKCk7Ci0JZGFlbW9uaXplKCJrZ2FtZXBvcnRkIik7Ci0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCiAJZG8gewogCQlnYW1lcG9ydF9oYW5kbGVfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnYW1lcG9ydF93YWl0LCAhbGlzdF9lbXB0eSgmZ2FtZXBvcnRfZXZlbnRfbGlzdCkpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2FtZXBvcnRfd2FpdCwKKwkJCWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCAhbGlzdF9lbXB0eSgmZ2FtZXBvcnRfZXZlbnRfbGlzdCkpOwogCQl0cnlfdG9fZnJlZXplKCk7Ci0JfSB3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAogCXByaW50ayhLRVJOX0RFQlVHICJnYW1lcG9ydDoga2dhbWVwb3J0ZCBleGl0aW5nXG4iKTsKLQotCXVubG9ja19rZXJuZWwoKTsKLQljb21wbGV0ZV9hbmRfZXhpdCgmZ2FtZXBvcnRfZXhpdGVkLCAwKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC03NzMsOSArNzY3LDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGdhbWVwb3J0X2luaXQodm9pZCkKIHsKLQlpZiAoIShnYW1lcG9ydF9waWQgPSBrZXJuZWxfdGhyZWFkKGdhbWVwb3J0X3RocmVhZCwgTlVMTCwgQ0xPTkVfS0VSTkVMKSkpIHsKKwlnYW1lcG9ydF90YXNrID0ga3RocmVhZF9ydW4oZ2FtZXBvcnRfdGhyZWFkLCBOVUxMLCAia2dhbWVwb3J0ZCIpOworCWlmIChJU19FUlIoZ2FtZXBvcnRfdGFzaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJnYW1lcG9ydDogRmFpbGVkIHRvIHN0YXJ0IGtnYW1lcG9ydGRcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBQVFJfRVJSKGdhbWVwb3J0X3Rhc2spOwogCX0KIAogCWdhbWVwb3J0X2J1cy5kZXZfYXR0cnMgPSBnYW1lcG9ydF9kZXZpY2VfYXR0cnM7CkBAIC03ODksOCArNzg0LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBnYW1lcG9ydF9leGl0KHZvaWQpCiB7CiAJYnVzX3VucmVnaXN0ZXIoJmdhbWVwb3J0X2J1cyk7Ci0Ja2lsbF9wcm9jKGdhbWVwb3J0X3BpZCwgU0lHVEVSTSwgMSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZ2FtZXBvcnRfZXhpdGVkKTsKKwlrdGhyZWFkX3N0b3AoZ2FtZXBvcnRfdGFzayk7CiB9CiAKIG1vZHVsZV9pbml0KGdhbWVwb3J0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCmluZGV4IDdjNWM2MzEuLjFhYjVmMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKQEAgLTI1OCwxOCArMjU4LDE4IEBACiB7CiAJaW50IGkgPSAwOwogCisJaWYgKHBucF9yZWdpc3Rlcl9kcml2ZXIoJm5zNTU4X3BucF9kcml2ZXIpID49IDApCisJCXBucF9yZWdpc3RlcmVkID0gMTsKKwogLyoKLSAqIFByb2JlIElTQSBwb3J0cyBmaXJzdCBzbyB0aGF0IFBuUCBnZXRzIHRvIGNob29zZSBmcmVlIHBvcnQgYWRkcmVzc2VzCi0gKiBub3Qgb2NjdXBpZWQgYnkgdGhlIElTQSBwb3J0cy4KKyAqIFByb2JlIElTQSBwb3J0cyBhZnRlciBQblAsIHNvIHRoYXQgUG5QIHBvcnRzIHRoYXQgYXJlIGFscmVhZHkKKyAqIGVuYWJsZWQgZ2V0IGRldGVjdGVkIGFzIFBuUC4gVGhpcyBtYXkgYmUgc3Vib3B0aW1hbCBpbiBtdWx0aS1kZXZpY2UKKyAqIGNvbmZpZ3VyYXRpb25zLCBidXQgc2F2ZXMgaGFzc2xlIHdpdGggc2ltcGxlIHNldHVwcy4KICAqLwogCiAJd2hpbGUgKG5zNTU4X2lzYV9wb3J0bGlzdFtpXSkKIAkJbnM1NThfaXNhX3Byb2JlKG5zNTU4X2lzYV9wb3J0bGlzdFtpKytdKTsKIAotCWlmIChwbnBfcmVnaXN0ZXJfZHJpdmVyKCZuczU1OF9wbnBfZHJpdmVyKSA+PSAwKQotCQlwbnBfcmVnaXN0ZXJlZCA9IDE7Ci0KLQogCXJldHVybiAobGlzdF9lbXB0eSgmbnM1NThfbGlzdCkgJiYgIXBucF9yZWdpc3RlcmVkKSA/IC1FTk9ERVYgOiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L3ZvcnRleC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC92b3J0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiMDMwOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L3ZvcnRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiAkSWQ6IHZvcnRleC5jLHYgMS41IDIwMDIvMDcvMDEgMTU6Mzk6MzAgdm9qdGVjaCBFeHAgJAotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBWb2p0ZWNoIFBhdmxpawotICoKLSAqICBCYXNlZCBvbiB0aGUgd29yayBvZjoKLSAqCVJheW1vbmQgSW5nbGVzCi0gKi8KLQotLyoKLSAqIFRyaWRlbnQgNERXYXZlIGFuZCBBdXJlYWwgVm9ydGV4IGdhbWVwb3J0IGRyaXZlciBmb3IgTGludXgKLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKLSAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6Ci0gKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgotCi1NT0RVTEVfQVVUSE9SKCJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkF1cmVhbCBWb3J0ZXggYW5kIFZvcnRleDIgZ2FtZXBvcnQgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgVk9SVEVYX0dDUgkJMHgwYwkvKiBHYW1lcG9ydCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZPUlRFWF9MRUcJCTB4MDgJLyogTGVnYWN5IHBvcnQgbG9jYXRpb24gKi8KLSNkZWZpbmUgVk9SVEVYX0FYRAkJMHgxMAkvKiBBeGVzIHN0YXJ0ICovCi0jZGVmaW5lIFZPUlRFWF9EQVRBX1dBSVQJMjAJLyogMjAgbXMgKi8KLQotc3RydWN0IHZvcnRleCB7Ci0Jc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYmFzZTsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmlvOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgdm9ydGV4X3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKLXsKLQlzdHJ1Y3Qgdm9ydGV4ICp2b3J0ZXggPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwotCXJldHVybiByZWFkYih2b3J0ZXgtPmlvICsgVk9SVEVYX0xFRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZvcnRleF90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0Jc3RydWN0IHZvcnRleCAqdm9ydGV4ID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKLQl3cml0ZWIoMHhmZiwgdm9ydGV4LT5pbyArIFZPUlRFWF9MRUcpOwotfQotCi1zdGF0aWMgaW50IHZvcnRleF9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgKmF4ZXMsIGludCAqYnV0dG9ucykKLXsKLQlzdHJ1Y3Qgdm9ydGV4ICp2b3J0ZXggPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwotCWludCBpOwotCi0JKmJ1dHRvbnMgPSAofnJlYWRiKHZvcnRleC0+YmFzZSArIFZPUlRFWF9MRUcpID4+IDQpICYgMHhmOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlheGVzW2ldID0gcmVhZHcodm9ydGV4LT5pbyArIFZPUlRFWF9BWEQgKyBpICogc2l6ZW9mKHUzMikpOwotCQlpZiAoYXhlc1tpXSA9PSAweDFmZmYpIGF4ZXNbaV0gPSAtMTsKLQl9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdm9ydGV4X29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHZvcnRleCAqdm9ydGV4ID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKLQotCXN3aXRjaCAobW9kZSkgewotCQljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgotCQkJd3JpdGViKDB4NDAsIHZvcnRleC0+aW8gKyBWT1JURVhfR0NSKTsKLQkJCW1zbGVlcChWT1JURVhfREFUQV9XQUlUKTsKLQkJCXJldHVybiAwOwotCQljYXNlIEdBTUVQT1JUX01PREVfUkFXOgotCQkJd3JpdGViKDB4MDAsIHZvcnRleC0+aW8gKyBWT1JURVhfR0NSKTsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB2b3J0ZXhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCB2b3J0ZXggKnZvcnRleDsKLQlzdHJ1Y3QgZ2FtZXBvcnQgKnBvcnQ7Ci0JaW50IGk7Ci0KLQl2b3J0ZXggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgdm9ydGV4KSwgR0ZQX0tFUk5FTCk7Ci0JcG9ydCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKLQlpZiAoIXZvcnRleCB8fCAhcG9ydCkgewotCQlwcmludGsoS0VSTl9FUlIgInZvcnRleDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7Ci0JCWtmcmVlKHZvcnRleCk7Ci0JCWdhbWVwb3J0X2ZyZWVfcG9ydChwb3J0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJaWYgKH5wY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBpKSAmIElPUkVTT1VSQ0VfSU8pCi0JCQlicmVhazsKLQotCXBjaV9lbmFibGVfZGV2aWNlKGRldik7Ci0KLQl2b3J0ZXgtPmRldiA9IGRldjsKLQl2b3J0ZXgtPmdhbWVwb3J0ID0gcG9ydDsKLQl2b3J0ZXgtPmJhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydCh2b3J0ZXgtPmRldiwgaSksCi0JCQkJcGNpX3Jlc291cmNlX2xlbih2b3J0ZXgtPmRldiwgaSkpOwotCXZvcnRleC0+aW8gPSB2b3J0ZXgtPmJhc2UgKyBpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlwY2lfc2V0X2RydmRhdGEoZGV2LCB2b3J0ZXgpOwotCi0JcG9ydC0+cG9ydF9kYXRhID0gdm9ydGV4OwotCXBvcnQtPmZ1enogPSA2NDsKLQotCWdhbWVwb3J0X3NldF9uYW1lKHBvcnQsICJBVTg4eDAiKTsKLQlnYW1lcG9ydF9zZXRfcGh5cyhwb3J0LCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUoZGV2KSk7Ci0JcG9ydC0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKLQlwb3J0LT5yZWFkID0gdm9ydGV4X3JlYWQ7Ci0JcG9ydC0+dHJpZ2dlciA9IHZvcnRleF90cmlnZ2VyOwotCXBvcnQtPmNvb2tlZF9yZWFkID0gdm9ydGV4X2Nvb2tlZF9yZWFkOwotCXBvcnQtPm9wZW4gPSB2b3J0ZXhfb3BlbjsKLQotCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHZvcnRleF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3Qgdm9ydGV4ICp2b3J0ZXggPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydCh2b3J0ZXgtPmdhbWVwb3J0KTsKLQlpb3VubWFwKHZvcnRleC0+YmFzZSk7Ci0Ja2ZyZWUodm9ydGV4KTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZvcnRleF9pZF90YWJsZVtdID0gewotCXsgMHgxMmViLCAweDAwMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MTEwMDAgfSwKLQl7IDB4MTJlYiwgMHgwMDAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDI4ODAwIH0sCi0JeyAwIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2b3J0ZXhfZHJpdmVyID0gewotCS5uYW1lID0JCSJ2b3J0ZXhfZ2FtZXBvcnQiLAotCS5pZF90YWJsZSA9CXZvcnRleF9pZF90YWJsZSwKLQkucHJvYmUgPQl2b3J0ZXhfcHJvYmUsCi0JLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHZvcnRleF9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdm9ydGV4X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdm9ydGV4X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2b3J0ZXhfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdm9ydGV4X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHZvcnRleF9pbml0KTsKLW1vZHVsZV9leGl0KHZvcnRleF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCA4M2M3N2M5Li43YzRiNGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC0yMTksMTAgKzIxOSwyNCBAQAogCiBpbnQgaW5wdXRfb3Blbl9kZXZpY2Uoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlKQogeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhhbmRsZS0+ZGV2OworCWludCBlcnI7CisKKwllcnIgPSBkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJaGFuZGxlLT5vcGVuKys7Ci0JaWYgKGhhbmRsZS0+ZGV2LT5vcGVuKQotCQlyZXR1cm4gaGFuZGxlLT5kZXYtPm9wZW4oaGFuZGxlLT5kZXYpOwotCXJldHVybiAwOworCisJaWYgKCFkZXYtPnVzZXJzKysgJiYgZGV2LT5vcGVuKQorCQllcnIgPSBkZXYtPm9wZW4oZGV2KTsKKworCWlmIChlcnIpCisJCWhhbmRsZS0+b3Blbi0tOworCisJdXAoJmRldi0+c2VtKTsKKworCXJldHVybiBlcnI7CiB9CiAKIGludCBpbnB1dF9mbHVzaF9kZXZpY2Uoc3RydWN0IGlucHV0X2hhbmRsZSogaGFuZGxlLCBzdHJ1Y3QgZmlsZSogZmlsZSkKQEAgLTIzNSwxMCArMjQ5LDE3IEBACiAKIHZvaWQgaW5wdXRfY2xvc2VfZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoYW5kbGUtPmRldjsKKwogCWlucHV0X3JlbGVhc2VfZGV2aWNlKGhhbmRsZSk7Ci0JaWYgKGhhbmRsZS0+ZGV2LT5jbG9zZSkKLQkJaGFuZGxlLT5kZXYtPmNsb3NlKGhhbmRsZS0+ZGV2KTsKKworCWRvd24oJmRldi0+c2VtKTsKKworCWlmICghLS1kZXYtPnVzZXJzICYmIGRldi0+Y2xvc2UpCisJCWRldi0+Y2xvc2UoZGV2KTsKIAloYW5kbGUtPm9wZW4tLTsKKworCXVwKCZkZXYtPnNlbSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlucHV0X2xpbmtfaGFuZGxlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKQEAgLTQxNSw2ICs0MzYsOCBAQAogCiAJc2V0X2JpdChFVl9TWU4sIGRldi0+ZXZiaXQpOwogCisJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOworCiAJLyoKIAkgKiBJZiBkZWxheSBhbmQgcGVyaW9kIGFyZSBwcmUtc2V0IGJ5IHRoZSBkcml2ZXIsIHRoZW4gYXV0b3JlcGVhdGluZwogCSAqIGlzIGhhbmRsZWQgYnkgdGhlIGRyaXZlciBpdHNlbGYgYW5kIHdlIGRvbid0IGRvIGl0IGluIGlucHV0LmMuCkBAIC02NzQsNiArNjk3LDggQEAKIAlyZXR1cm4gKGNvdW50ID4gY250KSA/IGNudCA6IGNvdW50OwogfQogCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbnB1dF9maWxlb3BzOworCiBzdGF0aWMgaW50IF9faW5pdCBpbnB1dF9wcm9jX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwpAQCAtNjg4LDYgKzcxMyw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpbnB1dF9maWxlb3BzID0gKmVudHJ5LT5wcm9jX2ZvcHM7CisJZW50cnktPnByb2NfZm9wcyA9ICZpbnB1dF9maWxlb3BzOwogCWVudHJ5LT5wcm9jX2ZvcHMtPnBvbGwgPSBpbnB1dF9kZXZpY2VzX3BvbGw7CiAJZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJoYW5kbGVycyIsIDAsIHByb2NfYnVzX2lucHV0X2RpciwgaW5wdXRfaGFuZGxlcnNfcmVhZCwgTlVMTCk7CiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCmluZGV4IDM5Nzc1ZmMuLmZmOGUxYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwpAQCAtMjg1LDQ4ICsyODUsMzMgQEAKIAkJKFBPTExJTiB8IFBPTExSRE5PUk0pIDogMCkgfCAobGlzdC0+am95ZGV2LT5leGlzdCA/IDAgOiAoUE9MTEhVUCB8IFBPTExFUlIpKTsKIH0KIAotc3RhdGljIGludCBqb3lkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBqb3lkZXZfaW9jdGxfY29tbW9uKHN0cnVjdCBqb3lkZXYgKmpveWRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCiB7Ci0Jc3RydWN0IGpveWRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBqb3lkZXYgKmpveWRldiA9IGxpc3QtPmpveWRldjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBqb3lkZXYtPmhhbmRsZS5kZXY7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGksIGo7CiAKLQlpZiAoIWpveWRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOwotCiAJc3dpdGNoIChjbWQpIHsKIAogCQljYXNlIEpTX1NFVF9DQUw6CiAJCQlyZXR1cm4gY29weV9mcm9tX3VzZXIoJmpveWRldi0+Z2x1ZS5KU19DT1JSLCBhcmdwLAotCQkJCXNpemVvZihzdHJ1Y3QgSlNfREFUQV9UWVBFKSkgPyAtRUZBVUxUIDogMDsKKwkJCQlzaXplb2Yoam95ZGV2LT5nbHVlLkpTX0NPUlIpKSA/IC1FRkFVTFQgOiAwOwogCQljYXNlIEpTX0dFVF9DQUw6CiAJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZqb3lkZXYtPmdsdWUuSlNfQ09SUiwKLQkJCQlzaXplb2Yoc3RydWN0IEpTX0RBVEFfVFlQRSkpID8gLUVGQVVMVCA6IDA7CisJCQkJc2l6ZW9mKGpveWRldi0+Z2x1ZS5KU19DT1JSKSkgPyAtRUZBVUxUIDogMDsKIAkJY2FzZSBKU19TRVRfVElNRU9VVDoKLQkJCXJldHVybiBnZXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRU9VVCwgKGludCBfX3VzZXIgKikgYXJnKTsKKwkJCXJldHVybiBnZXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRU9VVCwgKHMzMiBfX3VzZXIgKikgYXJncCk7CiAJCWNhc2UgSlNfR0VUX1RJTUVPVVQ6Ci0JCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChpbnQgX191c2VyICopIGFyZyk7Ci0JCWNhc2UgSlNfU0VUX1RJTUVMSU1JVDoKLQkJCXJldHVybiBnZXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlULCAobG9uZyBfX3VzZXIgKikgYXJnKTsKLQkJY2FzZSBKU19HRVRfVElNRUxJTUlUOgotCQkJcmV0dXJuIHB1dF91c2VyKGpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQsIChsb25nIF9fdXNlciAqKSBhcmcpOwotCQljYXNlIEpTX1NFVF9BTEw6Ci0JCQlyZXR1cm4gY29weV9mcm9tX3VzZXIoJmpveWRldi0+Z2x1ZSwgYXJncCwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEUpKSA/IC1FRkFVTFQgOiAwOwotCQljYXNlIEpTX0dFVF9BTEw6Ci0JCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZqb3lkZXYtPmdsdWUsCi0JCQkJCQlzaXplb2Yoc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFKSkgPyAtRUZBVUxUIDogMDsKKwkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRU9VVCwgKHMzMiBfX3VzZXIgKikgYXJncCk7CiAKIAkJY2FzZSBKU0lPQ0dWRVJTSU9OOgotCQkJcmV0dXJuIHB1dF91c2VyKEpTX1ZFUlNJT04sIChfX3UzMiBfX3VzZXIgKikgYXJnKTsKKwkJCXJldHVybiBwdXRfdXNlcihKU19WRVJTSU9OLCAoX191MzIgX191c2VyICopIGFyZ3ApOwogCQljYXNlIEpTSU9DR0FYRVM6Ci0JCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5uYWJzLCAoX191OCBfX3VzZXIgKikgYXJnKTsKKwkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPm5hYnMsIChfX3U4IF9fdXNlciAqKSBhcmdwKTsKIAkJY2FzZSBKU0lPQ0dCVVRUT05TOgotCQkJcmV0dXJuIHB1dF91c2VyKGpveWRldi0+bmtleSwgKF9fdTggX191c2VyICopIGFyZyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5ua2V5LCAoX191OCBfX3VzZXIgKikgYXJncCk7CiAJCWNhc2UgSlNJT0NTQ09SUjoKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihqb3lkZXYtPmNvcnIsIGFyZ3AsCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBqc19jb3JyKSAqIGpveWRldi0+bmFicykpCisJCQkJICAgICAgc2l6ZW9mKGpveWRldi0+Y29yclswXSkgKiBqb3lkZXYtPm5hYnMpKQogCQkJICAgIHJldHVybiAtRUZBVUxUOwogCQkJZm9yIChpID0gMDsgaSA8IGpveWRldi0+bmFiczsgaSsrKSB7CiAJCQkJaiA9IGpveWRldi0+YWJzcGFtW2ldOwpAQCAtMzM1LDcgKzMyMCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBKU0lPQ0dDT1JSOgogCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCBqb3lkZXYtPmNvcnIsCi0JCQkJCQlzaXplb2Yoc3RydWN0IGpzX2NvcnIpICogam95ZGV2LT5uYWJzKSA/IC1FRkFVTFQgOiAwOworCQkJCQkJc2l6ZW9mKGpveWRldi0+Y29yclswXSkgKiBqb3lkZXYtPm5hYnMpID8gLUVGQVVMVCA6IDA7CiAJCWNhc2UgSlNJT0NTQVhNQVA6CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoam95ZGV2LT5hYnNwYW0sIGFyZ3AsIHNpemVvZihfX3U4KSAqIChBQlNfTUFYICsgMSkpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMzcxLDYgKzM1Niw4NCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgam95ZGV2X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGpveWRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBqb3lkZXYgKmpveWRldiA9IGxpc3QtPmpveWRldjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzMzIgdG1wMzI7CisJc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFXzMyIGRzMzI7CisJaW50IGVycjsKKworCWlmICgham95ZGV2LT5leGlzdCkgcmV0dXJuIC1FTk9ERVY7CisJc3dpdGNoKGNtZCkgeworCWNhc2UgSlNfU0VUX1RJTUVMSU1JVDoKKwkJZXJyID0gZ2V0X3VzZXIodG1wMzIsIChzMzIgX191c2VyICopIGFyZyk7CisJCWlmIChlcnIgPT0gMCkKKwkJCWpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQgPSB0bXAzMjsKKwkJYnJlYWs7CisJY2FzZSBKU19HRVRfVElNRUxJTUlUOgorCQl0bXAzMiA9IGpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQ7CisJCWVyciA9IHB1dF91c2VyKHRtcDMyLCAoczMyIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgSlNfU0VUX0FMTDoKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJmRzMzIsIGFyZ3AsCisJCQkJICAgICBzaXplb2YoZHMzMikpID8gLUVGQVVMVCA6IDA7CisJCWlmIChlcnIgPT0gMCkgeworCQkJam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQgICAgPSBkczMyLkpTX1RJTUVPVVQ7CisJCQlqb3lkZXYtPmdsdWUuQlVTWSAgICAgICAgICA9IGRzMzIuQlVTWTsKKwkJCWpveWRldi0+Z2x1ZS5KU19FWFBJUkVUSU1FID0gZHMzMi5KU19FWFBJUkVUSU1FOworCQkJam95ZGV2LT5nbHVlLkpTX1RJTUVMSU1JVCAgPSBkczMyLkpTX1RJTUVMSU1JVDsKKwkJCWpveWRldi0+Z2x1ZS5KU19TQVZFICAgICAgID0gZHMzMi5KU19TQVZFOworCQkJam95ZGV2LT5nbHVlLkpTX0NPUlIgICAgICAgPSBkczMyLkpTX0NPUlI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEpTX0dFVF9BTEw6CisJCWRzMzIuSlNfVElNRU9VVCAgICA9IGpveWRldi0+Z2x1ZS5KU19USU1FT1VUOworCQlkczMyLkJVU1kgICAgICAgICAgPSBqb3lkZXYtPmdsdWUuQlVTWTsKKwkJZHMzMi5KU19FWFBJUkVUSU1FID0gam95ZGV2LT5nbHVlLkpTX0VYUElSRVRJTUU7CisJCWRzMzIuSlNfVElNRUxJTUlUICA9IGpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQ7CisJCWRzMzIuSlNfU0FWRSAgICAgICA9IGpveWRldi0+Z2x1ZS5KU19TQVZFOworCQlkczMyLkpTX0NPUlIgICAgICAgPSBqb3lkZXYtPmdsdWUuSlNfQ09SUjsKKworCQllcnIgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmRzMzIsCisJCQkJCSAgc2l6ZW9mKGRzMzIpKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IGpveWRldl9pb2N0bF9jb21tb24oam95ZGV2LCBjbWQsIGFyZ3ApOworCX0KKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworc3RhdGljIGludCBqb3lkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBqb3lkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgam95ZGV2ICpqb3lkZXYgPSBsaXN0LT5qb3lkZXY7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWpveWRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIEpTX1NFVF9USU1FTElNSVQ6CisJCQlyZXR1cm4gZ2V0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVMSU1JVCwgKGxvbmcgX191c2VyICopIGFyZyk7CisJCWNhc2UgSlNfR0VUX1RJTUVMSU1JVDoKKwkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlULCAobG9uZyBfX3VzZXIgKikgYXJnKTsKKwkJY2FzZSBKU19TRVRfQUxMOgorCQkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZqb3lkZXYtPmdsdWUsIGFyZ3AsCisJCQkJCQlzaXplb2Yoam95ZGV2LT5nbHVlKSkgPyAtRUZBVUxUIDogMDsKKwkJY2FzZSBKU19HRVRfQUxMOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmam95ZGV2LT5nbHVlLAorCQkJCQkJc2l6ZW9mKGpveWRldi0+Z2x1ZSkpID8gLUVGQVVMVCA6IDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gam95ZGV2X2lvY3RsX2NvbW1vbihqb3lkZXYsIGNtZCwgYXJncCk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqb3lkZXZfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkucmVhZCA9CQlqb3lkZXZfcmVhZCwKQEAgLTM3OSw2ICs0NDIsOSBAQAogCS5vcGVuID0JCWpveWRldl9vcGVuLAogCS5yZWxlYXNlID0Jam95ZGV2X3JlbGVhc2UsCiAJLmlvY3RsID0Jam95ZGV2X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0Jam95ZGV2X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCS5mYXN5bmMgPQlqb3lkZXZfZmFzeW5jLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKaW5kZXggYWQzOWZlNC4uYmYzNGY3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlhM2QtPnJlYWRzKys7CiAJaWYgKGEzZF9yZWFkX3BhY2tldChhM2QtPmdhbWVwb3J0LCBhM2QtPmxlbmd0aCwgZGF0YSkgIT0gYTNkLT5sZW5ndGggfHwKIAkgICAgZGF0YVswXSAhPSBhM2QtPm1vZGUgfHwgYTNkX2NzdW0oZGF0YSwgYTNkLT5sZW5ndGgpKQotCSAJYTNkLT5iYWRzKys7CisJCWEzZC0+YmFkcysrOwogCWVsc2UKIAkJYTNkX3JlYWQoYTNkLCBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCmluZGV4IDgzZjZkYWYuLjI2NTk2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYwpAQCAtODIsNyArODIsNyBAQAogc3RhdGljIGNoYXIgYWRpX3dtZl9hYnNbXSA9CXsgQUJTX1dIRUVMLCBBQlNfR0FTLCBBQlNfQlJBS0UsIEFCU19IQVQwWCwgQUJTX0hBVDBZLCBBQlNfSEFUMVgsIEFCU19IQVQxWSwgQUJTX0hBVDJYLCBBQlNfSEFUMlkgfTsKIAogc3RhdGljIHNob3J0IGFkaV93bWdwZV9rZXlbXSA9CXsgQlROX0EsIEJUTl9CLCBCVE5fQywgQlROX1gsIEJUTl9ZLCBCVE5fWiwgIEJUTl9UTCwgQlROX1RSLCBCVE5fU1RBUlQsIEJUTl9NT0RFLCBCVE5fU0VMRUNUIH07Ci1zdGF0aWMgc2hvcnQgYWRpX3dtaV9rZXlbXSA9IAl7IEJUTl9UUklHR0VSLCAgQlROX1RPUCwgQlROX1RIVU1CLCBCVE5fVE9QMiwgQlROX0JBU0UsIEJUTl9CQVNFMiwgQlROX0JBU0UzLCBCVE5fQkFTRTQsIEJUTl9FWFRSQSB9Oworc3RhdGljIHNob3J0IGFkaV93bWlfa2V5W10gPQl7IEJUTl9UUklHR0VSLCAgQlROX1RPUCwgQlROX1RIVU1CLCBCVE5fVE9QMiwgQlROX0JBU0UsIEJUTl9CQVNFMiwgQlROX0JBU0UzLCBCVE5fQkFTRTQsIEJUTl9FWFRSQSB9Owogc3RhdGljIHNob3J0IGFkaV93bWVkM2Rfa2V5W10gPQl7IEJUTl9UUklHR0VSLCBCVE5fVEhVTUIsIEJUTl9USFVNQjIsIEJUTl9UT1AsIEJUTl9UT1AyLCBCVE5fQkFTRSwgQlROX0JBU0UyIH07CiBzdGF0aWMgc2hvcnQgYWRpX2NtMl9rZXlbXSA9CXsgQlROXzEsIEJUTl8yLCBCVE5fMywgQlROXzQsIEJUTl81LCBCVE5fNiwgQlROXzcsIEJUTl84IH07CiAKQEAgLTE4Myw3ICsxODMsNyBAQAogCWludCBpOwogCXN0cnVjdCBhZGkgKmFkaSA9IHBvcnQtPmFkaTsKIAotIAlhZGlbMF0uaWR4ID0gYWRpWzFdLmlkeCA9IDA7CisJYWRpWzBdLmlkeCA9IGFkaVsxXS5pZHggPSAwOwogCiAJaWYgKGFkaVswXS5yZXQgPD0gMCB8fCBhZGlbMV0ucmV0IDw9IDApIHJldHVybjsKIAlpZiAoYWRpWzBdLmRhdGFbMF0gJiAweDIwIHx8IH5hZGlbMV0uZGF0YVswXSAmIDB4MjApIHJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCmluZGV4IGNmMzZjYTkuLmU5OTYxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYwpAQCAtNTEsNyArNTEsOCBAQAogCiBfX29ic29sZXRlX3NldHVwKCJhbWlqb3k9Iik7CiAKLXN0YXRpYyBpbnQgYW1pam95X3VzZWRbMl0gPSB7IDAsIDAgfTsKK3N0YXRpYyBpbnQgYW1pam95X3VzZWQ7CitzdGF0aWMgREVDTEFSRV9NVVRFWChhbWlqb3lfc2VtKTsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGFtaWpveV9kZXZbMl07CiBzdGF0aWMgY2hhciAqYW1pam95X3BoeXNbMl0gPSB7ICJhbWlqb3kvaW5wdXQwIiwgImFtaWpveS9pbnB1dDEiIH07CiAKQEAgLTg0LDI2ICs4NSwzMCBAQAogCiBzdGF0aWMgaW50IGFtaWpveV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpbnQgKnVzZWQgPSBkZXYtPnByaXZhdGU7CisJaW50IGVycjsKIAotCWlmICgoKnVzZWQpKyspCi0JCXJldHVybiAwOworCWVyciA9IGRvd25faW50ZXJydXB0aWJsZSgmYW1pam95X3NlbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaWpveV9pbnRlcnJ1cHQsIDAsICJhbWlqb3kiLCBhbWlqb3lfaW50ZXJydXB0KSkgewotCQkoKnVzZWQpLS07CisJaWYgKCFhbWlqb3lfdXNlZCAmJiByZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaWpveV9pbnRlcnJ1cHQsIDAsICJhbWlqb3kiLCBhbWlqb3lfaW50ZXJydXB0KSkgewogCQlwcmludGsoS0VSTl9FUlIgImFtaWpveS5jOiBDYW4ndCBhbGxvY2F0ZSBpcnEgJWRcbiIsIElSUV9BTUlHQV9WRVJUQik7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CiAJfQogCi0JcmV0dXJuIDA7CisJYW1pam95X3VzZWQrKzsKK291dDoKKwl1cCgmYW1pam95X3NlbSk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgYW1pam95X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpbnQgKnVzZWQgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoIS0tKCp1c2VkKSkKKwlkb3duKCZhbWlqb3lfc2VtKTsKKwlpZiAoIS0tYW1pam95X3VzZWQpCiAJCWZyZWVfaXJxKElSUV9BTUlHQV9WRVJUQiwgYW1pam95X2ludGVycnVwdCk7CisJdXAoJmFtaWpveV9zZW0pOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhbWlqb3lfaW5pdCh2b2lkKQpAQCAtMTM4LDggKzE0Myw2IEBACiAJCQlhbWlqb3lfZGV2W2ldLmlkLnByb2R1Y3QgPSAweDAwMDM7CiAJCQlhbWlqb3lfZGV2W2ldLmlkLnZlcnNpb24gPSAweDAxMDA7CiAKLQkJCWFtaWpveV9kZXZbaV0ucHJpdmF0ZSA9IGFtaWpveV91c2VkICsgaTsKLQogCQkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFtaWpveV9kZXYgKyBpKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBhdCBqb3klZGRhdFxuIiwgYW1pam95X25hbWUsIGkpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCA1MDRiN2Q1Li5jM2E1NzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTE0MCwxMiArMTQwLDE0IEBACiAgKi8KIAogI2lmZGVmIF9faTM4Nl9fCisKKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KKwogI2RlZmluZSBHRVRfVElNRSh4KQlkbyB7IGlmIChjcHVfaGFzX3RzYykgcmR0c2NsKHgpOyBlbHNlIHggPSBnZXRfdGltZV9waXQoKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgREVMVEEoeCx5KQkoY3B1X2hhc190c2MgPyAoKHkpIC0gKHgpKSA6ICgoeCkgLSAoeSkgKyAoKHgpIDwgKHkpID8gQ0xPQ0tfVElDS19SQVRFIC8gSFogOiAwKSkpCiAjZGVmaW5lIFRJTUVfTkFNRQkoY3B1X2hhc190c2M/IlRTQyI6IlBJVCIpCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF90aW1lX3BpdCh2b2lkKQogewotICAgICAgICBleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2RiOS5jCmluZGV4IGNmZGQzYWMuLmZiZDNlZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYwpAQCAtODcsNyArODcsNyBAQAogI2RlZmluZSBEQjlfTk9STUFMCQkweDBhCiAjZGVmaW5lIERCOV9OT1NFTEVDVAkJMHgwOAogCi0jZGVmaW5lIERCOV9NQVhfREVWSUNFUyAyCisjZGVmaW5lIERCOV9NQVhfREVWSUNFUwkJMgogCiAjZGVmaW5lIERCOV9HRU5FU0lTNl9ERUxBWQkxNAogI2RlZmluZSBEQjlfUkVGUkVTSF9USU1FCUhaLzEwMApAQCAtOTgsNiArOTgsNyBAQAogCXN0cnVjdCBwYXJkZXZpY2UgKnBkOwogCWludCBtb2RlOwogCWludCB1c2VkOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwogCWNoYXIgcGh5c1syXVszMl07CiB9OwogCkBAIC01MDMsNiArNTA0LDExIEBACiB7CiAJc3RydWN0IGRiOSAqZGI5ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gZGI5LT5wZC0+cG9ydDsKKwlpbnQgZXJyOworCisJZXJyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkYjktPnNlbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmICghZGI5LT51c2VkKyspIHsKIAkJcGFycG9ydF9jbGFpbShkYjktPnBkKTsKQEAgLTUxNCw2ICs1MjAsNyBAQAogCQltb2RfdGltZXIoJmRiOS0+dGltZXIsIGppZmZpZXMgKyBEQjlfUkVGUkVTSF9USU1FKTsKIAl9CiAKKwl1cCgmZGI5LT5zZW0pOwogCXJldHVybiAwOwogfQogCkBAIC01MjIsMTIgKzUyOSwxNCBAQAogCXN0cnVjdCBkYjkgKmRiOSA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGRiOS0+cGQtPnBvcnQ7CiAKKwlkb3duKCZkYjktPnNlbSk7CiAJaWYgKCEtLWRiOS0+dXNlZCkgewotCQlkZWxfdGltZXIoJmRiOS0+dGltZXIpOworCQlkZWxfdGltZXJfc3luYygmZGI5LT50aW1lcik7CiAJCXBhcnBvcnRfd3JpdGVfY29udHJvbChwb3J0LCAweDAwKTsKIAkJcGFycG9ydF9kYXRhX2ZvcndhcmQocG9ydCk7CiAJCXBhcnBvcnRfcmVsZWFzZShkYjktPnBkKTsKIAl9CisJdXAoJmRiOS0+c2VtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkYjkgX19pbml0ICpkYjlfcHJvYmUoaW50ICpjb25maWcsIGludCBuYXJncykKQEAgLTU2MywxMiArNTcyLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoIShkYjkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGI5KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZGI5ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRiOSksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW1lbXNldChkYjksIDAsIHNpemVvZihzdHJ1Y3QgZGI5KSk7CiAKKwlpbml0X01VVEVYKCZkYjktPnNlbSk7CiAJZGI5LT5tb2RlID0gY29uZmlnWzFdOwogCWluaXRfdGltZXIoJmRiOS0+dGltZXIpOwogCWRiOS0+dGltZXIuZGF0YSA9IChsb25nKSBkYjk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCmluZGV4IDg3MzJmNTIuLjk1YmJkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCkBAIC0xLDEyICsxLDEyIEBACiAvKgogICogTkVTLCBTTkVTLCBONjQsIE11bHRpU3lzdGVtLCBQU1ggZ2FtZXBhZCBkcml2ZXIgZm9yIExpbnV4CiAgKgotICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IAlWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgotICogIENvcHlyaWdodCAoYykgMjAwNCAJCVBldGVyIE5lbHNvbiA8cnVmdXMta2VybmVsQGhhY2tpc2gub3JnPgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0CVZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CQlQZXRlciBOZWxzb24gPHJ1ZnVzLWtlcm5lbEBoYWNraXNoLm9yZz4KICAqCiAgKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6Ci0gKiAgCUFuZHJlZSBCb3JybWFubgkJSm9obiBEYWhsc3Ryb20KLSAqICAJRGF2aWQgS3VkZXIJCU5hdGhhbiBIYW5kCisgKglBbmRyZWUgQm9ycm1hbm4JCUpvaG4gRGFobHN0cm9tCisgKglEYXZpZCBLdWRlcgkJTmF0aGFuIEhhbmQKICAqLwogCiAvKgpAQCAtODEsNiArODEsNyBAQAogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXVuc2lnbmVkIGNoYXIgcGFkc1tHQ19NQVggKyAxXTsKIAlpbnQgdXNlZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIAljaGFyIHBoeXNbNV1bMzJdOwogfTsKIApAQCAtNDMzLDcgKzQzNCw3IEBACiAJCWdjX3BzeF9yZWFkX3BhY2tldChnYywgZGF0YV9wc3gsIGRhdGEpOwogCiAJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkgCQlzd2l0Y2ggKGRhdGFbaV0pIHsKKwkJCXN3aXRjaCAoZGF0YVtpXSkgewogCiAJCQkJY2FzZSBHQ19QU1hfUlVNQkxFOgogCkBAIC01MDMsMjIgKzUwNCwzMyBAQAogc3RhdGljIGludCBnY19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZ2MgKmdjID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CisKKwllcnIgPSBkb3duX2ludGVycnVwdGlibGUoJmdjLT5zZW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlpZiAoIWdjLT51c2VkKyspIHsKIAkJcGFycG9ydF9jbGFpbShnYy0+cGQpOwogCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2woZ2MtPnBkLT5wb3J0LCAweDA0KTsKIAkJbW9kX3RpbWVyKCZnYy0+dGltZXIsIGppZmZpZXMgKyBHQ19SRUZSRVNIX1RJTUUpOwogCX0KKworCXVwKCZnYy0+c2VtKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZ2NfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCXN0cnVjdCBnYyAqZ2MgPSBkZXYtPnByaXZhdGU7CisKKwlkb3duKCZnYy0+c2VtKTsKIAlpZiAoIS0tZ2MtPnVzZWQpIHsKLQkJZGVsX3RpbWVyKCZnYy0+dGltZXIpOworCQlkZWxfdGltZXJfc3luYygmZ2MtPnRpbWVyKTsKIAkJcGFycG9ydF93cml0ZV9jb250cm9sKGdjLT5wZC0+cG9ydCwgMHgwMCk7CiAJCXBhcnBvcnRfcmVsZWFzZShnYy0+cGQpOwogCX0KKwl1cCgmZ2MtPnNlbSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZ2MgX19pbml0ICpnY19wcm9iZShpbnQgKmNvbmZpZywgaW50IG5hcmdzKQpAQCAtNTQyLDExICs1NTQsMTIgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCEoZ2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2MpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShnYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBnYyksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW1lbXNldChnYywgMCwgc2l6ZW9mKHN0cnVjdCBnYykpOworCisJaW5pdF9NVVRFWCgmZ2MtPnNlbSk7CiAKIAlnYy0+cGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgImdhbWVjb24iLCBOVUxMLCBOVUxMLCBOVUxMLCBQQVJQT1JUX0RFVl9FWENMLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYwppbmRleCBhZDEzZjA5Li43ZDk2OTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZ2Yya19heGVzW2dmMmstPmlkXTsgaSsrKSB7CiAJCWdmMmstPmRldi5hYnNtYXhbZ2Yya19hYnNbaV1dID0gKGkgPCAyKSA/IGdmMmstPmRldi5hYnNbZ2Yya19hYnNbaV1dICogMiAtIDMyIDoKLQkgICAgICAJCSAgZ2Yyay0+ZGV2LmFic1tnZjJrX2Fic1swXV0gKyBnZjJrLT5kZXYuYWJzW2dmMmtfYWJzWzFdXSAtIDMyOworCQkJICBnZjJrLT5kZXYuYWJzW2dmMmtfYWJzWzBdXSArIGdmMmstPmRldi5hYnNbZ2Yya19hYnNbMV1dIC0gMzI7CiAJCWdmMmstPmRldi5hYnNtaW5bZ2Yya19hYnNbaV1dID0gMzI7CiAJCWdmMmstPmRldi5hYnNmdXp6W2dmMmtfYWJzW2ldXSA9IDg7CiAJCWdmMmstPmRldi5hYnNmbGF0W2dmMmtfYWJzW2ldXSA9IChpIDwgMikgPyAyNCA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDQyZTUwMDUuLjBkYTdiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkqcGFja2V0ID0gMDsKIAlyYXdfZGF0YSA9IGdhbWVwb3J0X3JlYWQoZ2FtZXBvcnQpOwogCWlmIChyYXdfZGF0YSAmIDEpCi0gCQlyZXR1cm4gSU9fUkVUUlk7CisJCXJldHVybiBJT19SRVRSWTsKIAogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAJCXJhd19kYXRhID0gZ2FtZXBvcnRfcmVhZChnYW1lcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYwppbmRleCAwMjhmMzUxLi5lMzFiN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKQEAgLTc4LDYgKzc4LDcgQEAKIAl7IDB4MDYxYywgMHhjMGE0LCAiQUNUIExBQlMgRm9yY2UgUlMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuX3doZWVsLCBhYnNfd2hlZWwsIGZmX2lmb3JjZSB9LCAvLz8KIAl7IDB4MDZmOCwgMHgwMDAxLCAiR3VpbGxlbW90IFJhY2UgTGVhZGVyIEZvcmNlIEZlZWRiYWNrIiwJYnRuX3doZWVsLCBhYnNfd2hlZWwsIGZmX2lmb3JjZSB9LCAvLz8KIAl7IDB4MDZmOCwgMHgwMDA0LCAiR3VpbGxlbW90IEZvcmNlIEZlZWRiYWNrIFJhY2luZyBXaGVlbCIsCWJ0bl93aGVlbCwgYWJzX3doZWVsLCBmZl9pZm9yY2UgfSwgLy8/CisJeyAweDA2ZjgsIDB4MDAwNCwgIkd1bGxlbW90IEpldCBMZWFkZXIgM0QiLAkJCWJ0bl9qb3lzdGljaywgYWJzX2pveXN0aWNrLCBmZl9pZm9yY2UgfSwgLy8/CiAJeyAweDAwMDAsIDB4MDAwMCwgIlVua25vd24gSS1Gb3JjZSBEZXZpY2UgWyUwNHg6JTA0eF0iLAkJYnRuX2pveXN0aWNrLCBhYnNfam95c3RpY2ssIGZmX2lmb3JjZSB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKaW5kZXggNjE3YzBiMC4uNjM2OWEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYwpAQCAtMjI5LDYgKzIyOSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDYxYywgMHhjMGE0KSB9LCAgICAgICAgIC8qIEFDVCBMQUJTIEZvcmNlIFJTICovCiAJeyBVU0JfREVWSUNFKDB4MDZmOCwgMHgwMDAxKSB9LAkJLyogR3VpbGxlbW90IFJhY2UgTGVhZGVyIEZvcmNlIEZlZWRiYWNrICovCiAJeyBVU0JfREVWSUNFKDB4MDZmOCwgMHgwMDA0KSB9LAkJLyogR3VpbGxlbW90IEZvcmNlIEZlZWRiYWNrIFJhY2luZyBXaGVlbCAqLworCXsgVVNCX0RFVklDRSgweDA2ZjgsIDB4YTMwMikgfSwJCS8qIEd1aWxsZW1vdCBKZXQgTGVhZGVyIDNEICovCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2ViYWxsLmMKaW5kZXggZWMwYTJhNi4uYTQzNmYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jCkBAIC00LDggKzQsOCBAQAogICogIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFZvanRlY2ggUGF2bGlrCiAgKgogICogIEJhc2VkIG9uIHRoZSB3b3JrIG9mOgotICogIAlEYXZpZCBUaG9tcHNvbgotICogIAlKb3NlcGggS3JhaG4KKyAqCURhdmlkIFRob21wc29uCisgKglKb3NlcGggS3JhaG4KICAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jCmluZGV4IDg3NDM2N2IuLjAxZmQyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2VvcmIuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlb3JiLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVm9qdGVjaCBQYXZsaWsKICAqCiAgKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6Ci0gKiAgCURhdmlkIFRob21wc29uCisgKglEYXZpZCBUaG9tcHNvbgogICovCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3RtZGMuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCmluZGV4IGFhZWU1MmMuLjllYjk5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCkBAIC03OSw3ICs3OSw3IEBACiAJeyBCVE5fQSwgQlROX0IsIEJUTl9DLCBCVE5fWCwgQlROX1ksIEJUTl9aLCBCVE5fU1RBUlQsIEJUTl9TRUxFQ1QsIEJUTl9UTCwgQlROX1RSIH07CiBzdGF0aWMgc2hvcnQgdG1kY19idG5fam95W1RNRENfQlROXSA9CiAJeyBCVE5fVFJJR0dFUiwgQlROX1RIVU1CLCBCVE5fVE9QLCBCVE5fVE9QMiwgQlROX0JBU0UsIEJUTl9CQVNFMiwgQlROX1RIVU1CMiwgQlROX1BJTktJRSwKLSAJICBCVE5fQkFTRTMsIEJUTl9CQVNFNCwgQlROX0EsIEJUTl9CLCBCVE5fQywgQlROX1gsIEJUTl9ZLCBCVE5fWiB9OworCSAgQlROX0JBU0UzLCBCVE5fQkFTRTQsIEJUTl9BLCBCVE5fQiwgQlROX0MsIEJUTl9YLCBCVE5fWSwgQlROX1ogfTsKIHN0YXRpYyBzaG9ydCB0bWRjX2J0bl9mbVtUTURDX0JUTl0gPQogICAgICAgICB7IEJUTl9UUklHR0VSLCBCVE5fQywgQlROX0IsIEJUTl9BLCBCVE5fVEhVTUIsIEJUTl9YLCBCVE5fWSwgQlROX1osIEJUTl9UT1AsIEJUTl9UT1AyIH07CiBzdGF0aWMgc2hvcnQgdG1kY19idG5fYXRbVE1EQ19CVE5dID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKaW5kZXggZGQ4OGI5Yy4uMjgxMDBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKQEAgLTg0LDYgKzg0LDcgQEAKIAljaGFyIHBoeXNbN11bMzJdOwogCWludCBzdGlja3M7CiAJaW50IHVzZWQ7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CiB9ICp0Z2Z4X2Jhc2VbM107CiAKIC8qCkBAIC05OSw3ICsxMDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAJCWlmICh0Z2Z4LT5zdGlja3MgJiAoMSA8PCBpKSkgewogCi0gCQkJZGV2ID0gdGdmeC0+ZGV2ICsgaTsKKwkJCWRldiA9IHRnZngtPmRldiArIGk7CiAKIAkJCXBhcnBvcnRfd3JpdGVfZGF0YSh0Z2Z4LT5wZC0+cG9ydCwgfigxIDw8IGkpKTsKIAkJCWRhdGExID0gcGFycG9ydF9yZWFkX3N0YXR1cyh0Z2Z4LT5wZC0+cG9ydCkgXiAweDdmOwpAQCAtMTIyLDIzICsxMjMsMzQgQEAKIAogc3RhdGljIGludCB0Z2Z4X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgdGdmeCAqdGdmeCA9IGRldi0+cHJpdmF0ZTsKLSAgICAgICAgaWYgKCF0Z2Z4LT51c2VkKyspIHsKKwlzdHJ1Y3QgdGdmeCAqdGdmeCA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZXJyOworCisJZXJyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZ0Z2Z4LT5zZW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXRnZngtPnVzZWQrKykgewogCQlwYXJwb3J0X2NsYWltKHRnZngtPnBkKTsKIAkJcGFycG9ydF93cml0ZV9jb250cm9sKHRnZngtPnBkLT5wb3J0LCAweDA0KTsKLSAgICAgICAgICAgICAgICBtb2RfdGltZXIoJnRnZngtPnRpbWVyLCBqaWZmaWVzICsgVEdGWF9SRUZSRVNIX1RJTUUpOworCQltb2RfdGltZXIoJnRnZngtPnRpbWVyLCBqaWZmaWVzICsgVEdGWF9SRUZSRVNIX1RJTUUpOwogCX0KLSAgICAgICAgcmV0dXJuIDA7CisKKwl1cCgmdGdmeC0+c2VtKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdGdmeF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCB0Z2Z4ICp0Z2Z4ID0gZGV2LT5wcml2YXRlOwotICAgICAgICBpZiAoIS0tdGdmeC0+dXNlZCkgewotICAgICAgICAgICAgICAgIGRlbF90aW1lcigmdGdmeC0+dGltZXIpOworCXN0cnVjdCB0Z2Z4ICp0Z2Z4ID0gZGV2LT5wcml2YXRlOworCisJZG93bigmdGdmeC0+c2VtKTsKKwlpZiAoIS0tdGdmeC0+dXNlZCkgeworCQlkZWxfdGltZXJfc3luYygmdGdmeC0+dGltZXIpOwogCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wodGdmeC0+cGQtPnBvcnQsIDB4MDApOwotICAgICAgICAJcGFycG9ydF9yZWxlYXNlKHRnZngtPnBkKTsKKwkJcGFycG9ydF9yZWxlYXNlKHRnZngtPnBkKTsKIAl9CisJdXAoJnRnZngtPnNlbSk7CiB9CiAKIC8qCkBAIC0xNjYsMTEgKzE3OCwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoISh0Z2Z4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRnZngpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoISh0Z2Z4ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRnZngpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcGFycG9ydF9wdXRfcG9ydChwcCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQodGdmeCwgMCwgc2l6ZW9mKHN0cnVjdCB0Z2Z4KSk7CisKKwlpbml0X01VVEVYKCZ0Z2Z4LT5zZW0pOwogCiAJdGdmeC0+cGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgInR1cmJvZ3JhZngiLCBOVUxMLCBOVUxMLCBOVUxMLCBQQVJQT1JUX0RFVl9FWENMLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IDgyZmFkOWEuLjRkNDk4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogewkJCQkJCQkJCQlcCiAJcmV0dXJuIGF0a2JkX2F0dHJfc2V0X2hlbHBlcihkLCBiLCBzLCBhdGtiZF9zZXRfIyNfbmFtZSk7CQlcCiB9CQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdGtiZF9hdHRyXyMjX25hbWUgPSAJCQkJXAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0a2JkX2F0dHJfIyNfbmFtZSA9CQkJCVwKIAlfX0FUVFIoX25hbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBhdGtiZF9kb19zaG93XyMjX25hbWUsIGF0a2JkX2RvX3NldF8jI19uYW1lKTsKIAogQVRLQkRfREVGSU5FX0FUVFIoZXh0cmEpOwpAQCAtMzg4LDcgKzM4OCw3IEBACiAJCQl2YWx1ZSA9IGF0a2JkLT5yZWxlYXNlID8gMCA6CiAJCQkJKDEgKyAoIWF0a2JkLT5zb2Z0cmVwZWF0ICYmIHRlc3RfYml0KGF0a2JkLT5rZXljb2RlW2NvZGVdLCBhdGtiZC0+ZGV2LmtleSkpKTsKIAotCQkJc3dpdGNoICh2YWx1ZSkgeyAJLyogV29ya2Fyb3VuZCBUb3NoaWJhIGxhcHRvcCBtdWx0aXBsZSBrZXlwcmVzcyAqLworCQkJc3dpdGNoICh2YWx1ZSkgewkvKiBXb3JrYXJvdW5kIFRvc2hpYmEgbGFwdG9wIG11bHRpcGxlIGtleXByZXNzICovCiAJCQkJY2FzZSAwOgogCQkJCQlhdGtiZC0+bGFzdCA9IDA7CiAJCQkJCWJyZWFrOwpAQCAtODk0LDcgKzg5NCw3IEBACiAJaWYgKGF0a2JkLT53cml0ZSkgewogCQlwYXJhbVswXSA9ICh0ZXN0X2JpdChMRURfU0NST0xMTCwgYXRrYmQtPmRldi5sZWQpID8gMSA6IDApCiAJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9OVU1MLCAgICBhdGtiZC0+ZGV2LmxlZCkgPyAyIDogMCkKLSAJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9DQVBTTCwgICBhdGtiZC0+ZGV2LmxlZCkgPyA0IDogMCk7CisJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9DQVBTTCwgICBhdGtiZC0+ZGV2LmxlZCkgPyA0IDogMCk7CiAKIAkJaWYgKGF0a2JkX3Byb2JlKGF0a2JkKSkKIAkJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwppbmRleCAwZjEyMjBhLi5hODU1MTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCkBAIC0zOSw2ICszOSw3IEBACiAjZGVmaW5lIENPUkdJX0tFWV9DQUxFTkRFUglLRVlfRjEKICNkZWZpbmUgQ09SR0lfS0VZX0FERFJFU1MJS0VZX0YyCiAjZGVmaW5lIENPUkdJX0tFWV9GTgkJS0VZX0YzCisjZGVmaW5lIENPUkdJX0tFWV9DQU5DRUwJS0VZX0Y0CiAjZGVmaW5lIENPUkdJX0tFWV9PRkYJCUtFWV9TVVNQRU5ECiAjZGVmaW5lIENPUkdJX0tFWV9FWE9LCQlLRVlfRjUKICNkZWZpbmUgQ09SR0lfS0VZX0VYQ0FOQ0VMCUtFWV9GNgpAQCAtNDYsNiArNDcsNyBAQAogI2RlZmluZSBDT1JHSV9LRVlfRVhKT0dVUAlLRVlfRjgKICNkZWZpbmUgQ09SR0lfS0VZX0pBUDEJCUtFWV9MRUZUQ1RSTAogI2RlZmluZSBDT1JHSV9LRVlfSkFQMgkJS0VZX0xFRlRBTFQKKyNkZWZpbmUgQ09SR0lfS0VZX01BSUwJCUtFWV9GMTAKICNkZWZpbmUgQ09SR0lfS0VZX09LCQlLRVlfRjExCiAjZGVmaW5lIENPUkdJX0tFWV9NRU5VCQlLRVlfRjEyCiAjZGVmaW5lIENPUkdJX0hJTkdFXzAJCUtFWV9LUDAKQEAgLTU5LDggKzYxLDggQEAKIAlLRVlfVEFCLCBLRVlfUSwgS0VZX0UsIEtFWV9ULCBLRVlfRywgS0VZX1UsIEtFWV9KLCBLRVlfSywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMy00OCAqLwogCUNPUkdJX0tFWV9DQUxFTkRFUiwgS0VZX1csIEtFWV9TLCBLRVlfRiwgS0VZX1YsIEtFWV9ILCBLRVlfTSwgS0VZX0wsIDAsIEtFWV9SSUdIVFNISUZULCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgIC8qIDQ5LTY0ICovCiAJQ09SR0lfS0VZX0FERFJFU1MsIEtFWV9BLCBLRVlfRCwgS0VZX0MsIEtFWV9CLCBLRVlfTiwgS0VZX0RPVCwgMCwgS0VZX0VOVEVSLCAwLCBLRVlfTEVGVFNISUZULCAwLCAwLCAwLCAwLCAwLCAJICAvKiA2NS04MCAqLwotCUtFWV9NQUlMLCBLRVlfWiwgS0VZX1gsIEtFWV9NSU5VUywgS0VZX1NQQUNFLCBLRVlfQ09NTUEsIDAsIEtFWV9VUCwgMCwgMCwgMCwgQ09SR0lfS0VZX0ZOLCAwLCAwLCAwLCAwLCAgICAgICAgICAgIC8qIDgxLTk2ICovCi0JS0VZX1NZU1JRLCBDT1JHSV9LRVlfSkFQMSwgQ09SR0lfS0VZX0pBUDIsIEtFWV9DQU5DRUwsIENPUkdJX0tFWV9PSywgQ09SR0lfS0VZX01FTlUsIEtFWV9MRUZULCBLRVlfRE9XTiwgS0VZX1JJR0hULCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgLyogOTctMTEyICovCisJQ09SR0lfS0VZX01BSUwsIEtFWV9aLCBLRVlfWCwgS0VZX01JTlVTLCBLRVlfU1BBQ0UsIEtFWV9DT01NQSwgMCwgS0VZX1VQLCAwLCAwLCAwLCBDT1JHSV9LRVlfRk4sIDAsIDAsIDAsIDAsICAgICAgICAgICAgLyogODEtOTYgKi8KKwlLRVlfU1lTUlEsIENPUkdJX0tFWV9KQVAxLCBDT1JHSV9LRVlfSkFQMiwgQ09SR0lfS0VZX0NBTkNFTCwgQ09SR0lfS0VZX09LLCBDT1JHSV9LRVlfTUVOVSwgS0VZX0xFRlQsIEtFWV9ET1dOLCBLRVlfUklHSFQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAvKiA5Ny0xMTIgKi8KIAlDT1JHSV9LRVlfT0ZGLCBDT1JHSV9LRVlfRVhPSywgQ09SR0lfS0VZX0VYQ0FOQ0VMLCBDT1JHSV9LRVlfRVhKT0dET1dOLCBDT1JHSV9LRVlfRVhKT0dVUCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAvKiAxMTMtMTI0ICovCiAJQ09SR0lfSElOR0VfMCwgQ09SR0lfSElOR0VfMSwgQ09SR0lfSElOR0VfMgkgIC8qIDEyNS0xMjcgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKaW5kZXggMjY5NGZmMi4uMDk4OTYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAgKiBpbmZvcm1hdGlvbiBnaXZlbiBiZWxvdywgSSB3aWxsIF9ub3RfIGJlIGxpYWJsZSEKICAqCiAgKiBSSjEwIHBpbm91dDoJCVRvIERFOToJCU9yIERCMjU6Ci0gKiAJMSAtIFJ4RCA8LS0tLT4JUGluIDMgKFR4RCkgPC0+CVBpbiAyIChUeEQpCi0gKiAJMiAtIEdORCA8LS0tLT4JUGluIDUgKEdORCkgPC0+CVBpbiA3IChHTkQpCi0gKiAJNCAtIFR4RCA8LS0tLT4JUGluIDIgKFJ4RCkgPC0+CVBpbiAzIChSeEQpCi0gKiAJMyAtICsxMlYgKGZyb20gSEREIGRyaXZlIGNvbm5lY3RvciksIERPTidUIGNvbm5lY3QgdG8gREU5IG9yIERCMjUhISEKKyAqCTEgLSBSeEQgPC0tLS0+CVBpbiAzIChUeEQpIDwtPglQaW4gMiAoVHhEKQorICoJMiAtIEdORCA8LS0tLT4JUGluIDUgKEdORCkgPC0+CVBpbiA3IChHTkQpCisgKgk0IC0gVHhEIDwtLS0tPglQaW4gMiAoUnhEKSA8LT4JUGluIDMgKFJ4RCkKKyAqCTMgLSArMTJWIChmcm9tIEhERCBkcml2ZSBjb25uZWN0b3IpLCBET04nVCBjb25uZWN0IHRvIERFOSBvciBEQjI1ISEhCiAgKgogICogUGluIG51bWJlcnMgZm9yIERFOSBhbmQgREIyNSBhcmUgbm90ZWQgb24gdGhlIHBsdWcgKHF1aXRlIHNtYWxsOikuIEZvcgogICogUkoxMCwgaXQncyBsaWtlIHRoaXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYwppbmRleCBkM2U5ZGQ2Li44OTM1MjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG9jb21va2JkLmMKQEAgLTQyLDcgKzQyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiTG9Db01vIGtleWJvYXJkIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0jZGVmaW5lIExPQ09NT0tCRF9OVU1LRVlTIAkxMjgKKyNkZWZpbmUgTE9DT01PS0JEX05VTUtFWVMJMTI4CiAKICNkZWZpbmUgS0VZX0FDVElWSVRZCQlLRVlfRjE2CiAjZGVmaW5lIEtFWV9DT05UQUNUCQlLRVlfRjE4CkBAIC02MSw3ICs2MSw3IEBACiAJS0VZX0csIEtFWV9GLCBLRVlfWCwgS0VZX1MsIDAsIDAsIDAsIDAsIDAsIDAsCQkJCS8qIDkwIC0gOTkgKi8KIAkwLCAwLCBLRVlfRE9ULCAwLCBLRVlfQ09NTUEsIEtFWV9OLCBLRVlfQiwgS0VZX0MsIEtFWV9aLCBLRVlfQSwJCS8qIDEwMCAtIDEwOSAqLwogCUtFWV9MRUZUU0hJRlQsIEtFWV9UQUIsIEtFWV9MRUZUQ1RSTCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJCS8qIDExMCAtIDExOSAqLwotCUtFWV9NLCBLRVlfU1BBQ0UsIEtFWV9WLCBLRVlfQVBPU1RST1BIRSwgS0VZX1NMQVNILCAwLCAwLCAwIAkJLyogMTIwIC0gMTI4ICovCisJS0VZX00sIEtFWV9TUEFDRSwgS0VZX1YsIEtFWV9BUE9TVFJPUEhFLCBLRVlfU0xBU0gsIDAsIDAsIDAJCS8qIDEyMCAtIDEyOCAqLwogfTsKIAogI2RlZmluZSBLQl9ST1dTCQkJMTYKQEAgLTgyLDcgKzgyLDcgQEAKIAlzdHJ1Y3QgbG9jb21vX2RldiAqbGRldjsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwotCQorCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCkBAIC05NSw3ICs5NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbG9jb21va2JkX2FjdGl2YXRlX2FsbCh1bnNpZ25lZCBsb25nIG1lbWJhc2UpCiB7CiAJdW5zaWduZWQgbG9uZyByOwotCQorCiAJbG9jb21vX3dyaXRlbCgwLCBtZW1iYXNlICsgTE9DT01PX0tTQyk7CiAJciA9IGxvY29tb19yZWFkbChtZW1iYXNlICsgTE9DT01PX0tJQyk7CiAJciAmPSAweEZFRkY7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAqLwogCiAvKiBTY2FuIHRoZSBoYXJkd2FyZSBrZXlib2FyZCBhbmQgcHVzaCBhbnkgY2hhbmdlcyB1cCB0aHJvdWdoIHRoZSBpbnB1dCBsYXllciAqLwotc3RhdGljIHZvaWQgbG9jb21va2JkX3NjYW5rZXlib2FyZChzdHJ1Y3QgbG9jb21va2JkICpsb2NvbW9rYmQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3N0YXRpYyB2b2lkIGxvY29tb2tiZF9zY2Fua2V5Ym9hcmQoc3RydWN0IGxvY29tb2tiZCAqbG9jb21va2JkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHJvd2QsIHNjYW5jb2RlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAogCWlmIChyZWdzKQogCQlpbnB1dF9yZWdzKCZsb2NvbW9rYmQtPmlucHV0LCByZWdzKTsKLQkKKwogCWxvY29tb2tiZF9jaGFyZ2VfYWxsKG1lbWJhc2UpOwogCiAJbnVtX3ByZXNzZWQgPSAwOwpAQCAtMTQ2LDkgKzE0Niw5IEBACiAKIAkJbG9jb21va2JkX2FjdGl2YXRlX2NvbChtZW1iYXNlLCBjb2wpOwogCQl1ZGVsYXkoS0JfREVMQVkpOwotCQkgCisKIAkJcm93ZCA9IH5sb2NvbW9fcmVhZGwobWVtYmFzZSArIExPQ09NT19LSUIpOwotCQlmb3IgKHJvdyA9IDA7IHJvdyA8IEtCX1JPV1M7IHJvdysrICkgeworCQlmb3IgKHJvdyA9IDA7IHJvdyA8IEtCX1JPV1M7IHJvdysrKSB7CiAJCQlzY2FuY29kZSA9IFNDQU5DT0RFKGNvbCwgcm93KTsKIAkJCWlmIChyb3dkICYgS0JfUk9XTUFTSyhyb3cpKSB7CiAJCQkJbnVtX3ByZXNzZWQgKz0gMTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY29tb2tiZC0+bG9jaywgZmxhZ3MpOwogfQogCi0vKiAKKy8qCiAgKiBMb0NvTW8ga2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIuCiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBsb2NvbW9rYmRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0yMDUsOCArMjA1LDggQEAKIAltZW1zZXQobG9jb21va2JkLCAwLCBzaXplb2Yoc3RydWN0IGxvY29tb2tiZCkpOwogCiAJLyogdHJ5IGFuZCBjbGFpbSBtZW1vcnkgcmVnaW9uICovCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpIGRldi0+bWFwYmFzZSwgCi0JCQkJZGV2LT5sZW5ndGgsIAorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKCh1bnNpZ25lZCBsb25nKSBkZXYtPm1hcGJhc2UsCisJCQkJZGV2LT5sZW5ndGgsCiAJCQkJTE9DT01PX0RSSVZFUl9OQU1FKGRldikpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJcHJpbnRrKEtFUk5fRVJSICJsb2NvbW9rYmQ6IENhbid0IGFjcXVpcmUgYWNjZXNzIHRvIGlvIG1lbW9yeSBmb3Iga2V5Ym9hcmRcbiIpOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJbG9jb21va2JkLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGxvY29tb2tiZDsKIAogCWxvY29tb2tiZC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApOwotCQorCiAJaW5pdF9pbnB1dF9kZXYoJmxvY29tb2tiZC0+aW5wdXQpOwogCWxvY29tb2tiZC0+aW5wdXQua2V5Y29kZSA9IGxvY29tb2tiZC0+a2V5Y29kZTsKIAlsb2NvbW9rYmQtPmlucHV0LmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwpAQCAtMjcxLDExICsyNzEsMTEgQEAKIHN0YXRpYyBpbnQgbG9jb21va2JkX3JlbW92ZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQogewogCXN0cnVjdCBsb2NvbW9rYmQgKmxvY29tb2tiZCA9IGxvY29tb19nZXRfZHJ2ZGF0YShkZXYpOwotCQorCiAJZnJlZV9pcnEoZGV2LT5pcnFbMF0sIGxvY29tb2tiZCk7CiAKIAlkZWxfdGltZXJfc3luYygmbG9jb21va2JkLT50aW1lcik7Ci0JCisKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmbG9jb21va2JkLT5pbnB1dCk7CiAJbG9jb21vX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWFwbGVfa2V5Yi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKaW5kZXggODU5ZWQ3Ny4uZWVjYmRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoJJElkOiBtYXBsZV9rZXliLmMsdiAxLjQgMjAwNC8wMy8yMiAwMToxODoxNSBsZXRoYWwgRXhwICQKLSAqIAlTRUdBIERyZWFtY2FzdCBrZXlib2FyZCBkcml2ZXIKKyAqCVNFR0EgRHJlYW1jYXN0IGtleWJvYXJkIGRyaXZlcgogICoJQmFzZWQgb24gZHJpdmVycy91c2IvdXNia2JkLmMKICAqLwogCkBAIC00MCw3ICs0MCw2IEBACiAJc3RydWN0IGlucHV0X2RldiBkZXY7CiAJdW5zaWduZWQgY2hhciBuZXdbOF07CiAJdW5zaWduZWQgY2hhciBvbGRbOF07Ci0JaW50IG9wZW47CiB9OwogCiAKQEAgLTk1LDIyICs5NCw2IEBACiAJfQogfQogCi0KLXN0YXRpYyBpbnQgZGNfa2JkX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKLQlrYmQtPm9wZW4rKzsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkY19rYmRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKLQlrYmQtPm9wZW4tLTsKLX0KLQotCiBzdGF0aWMgaW50IGRjX2tiZF9jb25uZWN0KHN0cnVjdCBtYXBsZV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKQEAgLTEzMyw5ICsxMTYsNiBAQAogCWNsZWFyX2JpdCgwLCBrYmQtPmRldi5rZXliaXQpOwogCiAJa2JkLT5kZXYucHJpdmF0ZSA9IGtiZDsKLQlrYmQtPmRldi5vcGVuID0gZGNfa2JkX29wZW47Ci0Ja2JkLT5kZXYuY2xvc2UgPSBkY19rYmRfY2xvc2U7Ci0Ja2JkLT5kZXYuZXZlbnQgPSBOVUxMOwogCiAJa2JkLT5kZXYubmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOwogCWtiZC0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfTUFQTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKaW5kZXggMTU4YzhlOC4uOTg3MTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYwpAQCAtMjk4LDkgKzI5OCwxMSBAQAogCS8qIGNoZWNrIGlmIGFic21pbi9hYnNtYXgvYWJzZnV6ei9hYnNmbGF0IGFyZSBmaWxsZWQgYXMKIAkgKiB0b2xkIGluIERvY3VtZW50YXRpb24vaW5wdXQvaW5wdXQtcHJvZ3JhbW1pbmcudHh0ICovCiAJaWYgKHRlc3RfYml0KEVWX0FCUywgZGV2LT5ldmJpdCkpIHsKLQkJcmV0dmFsID0gdWlucHV0X3ZhbGlkYXRlX2Fic2JpdHMoZGV2KTsKLQkJaWYgKHJldHZhbCA8IDApCisJCWludCBlcnIgPSB1aW5wdXRfdmFsaWRhdGVfYWJzYml0cyhkZXYpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcmV0dmFsID0gZXJyOwogCQkJa2ZyZWUoZGV2LT5uYW1lKTsKKwkJfQogCX0KIAogZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCmluZGV4IGE3ODY0MTkuLmM0OTA5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQpAQCAtMTUsNCArMTUsNCBAQAogb2JqLSQoQ09ORklHX01PVVNFX0hJTCkJCSs9IGhpbF9wdHIubwogb2JqLSQoQ09ORklHX01PVVNFX1ZTWFhYQUEpCSs9IHZzeHh4YWEubwogCi1wc21vdXNlLW9ianMgIDo9IHBzbW91c2UtYmFzZS5vIGFscHMubyBsb2dpcHMycHAubyBzeW5hcHRpY3MubworcHNtb3VzZS1vYmpzICA6PSBwc21vdXNlLWJhc2UubyBhbHBzLm8gbG9naXBzMnBwLm8gc3luYXB0aWNzLm8gbGlmZWJvb2subwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCA3YmY0YmU3Li5hMTJlOTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtMzAsMTAgKzMwLDExIEBACiAKICNkZWZpbmUgQUxQU19EVUFMUE9JTlQJMHgwMQogI2RlZmluZSBBTFBTX1dIRUVMCTB4MDIKLSNkZWZpbmUgQUxQU19GV19CSwkweDA0CisjZGVmaW5lIEFMUFNfRldfQktfMQkweDA0CiAjZGVmaW5lIEFMUFNfNEJUTgkweDA4CiAjZGVmaW5lIEFMUFNfT0xEUFJPVE8JMHgxMAogI2RlZmluZSBBTFBTX1BBU1MJMHgyMAorI2RlZmluZSBBTFBTX0ZXX0JLXzIJMHg0MAogCiBzdGF0aWMgc3RydWN0IGFscHNfbW9kZWxfaW5mbyBhbHBzX21vZGVsX2RhdGFbXSA9IHsKIAl7IHsgMHgzMywgMHgwMiwgMHgwYSB9LAkweDg4LCAweGY4LCBBTFBTX09MRFBST1RPIH0sCQkvKiBVTUFYLTUzMFQgKi8KQEAgLTQzLDExICs0NCwxMSBAQAogCXsgeyAweDYzLCAweDAyLCAweDE0IH0sCTB4ZjgsIDB4ZjgsIDAgfSwKIAl7IHsgMHg2MywgMHgwMiwgMHgyOCB9LAkweGY4LCAweGY4LCAwIH0sCiAJeyB7IDB4NjMsIDB4MDIsIDB4M2MgfSwJMHg4ZiwgMHg4ZiwgQUxQU19XSEVFTCB9LAkJLyogVG9zaGliYSBTYXRlbGxpdGUgUzI0MDAtMTAzICovCi0JeyB7IDB4NjMsIDB4MDIsIDB4NTAgfSwJMHhlZiwgMHhlZiwgQUxQU19GV19CSyB9LAkJLyogTkVDIFZlcnNhIEwzMjAgKi8KKwl7IHsgMHg2MywgMHgwMiwgMHg1MCB9LAkweGVmLCAweGVmLCBBTFBTX0ZXX0JLXzEgfSwJCS8qIE5FQyBWZXJzYSBMMzIwICovCiAJeyB7IDB4NjMsIDB4MDIsIDB4NjQgfSwJMHhmOCwgMHhmOCwgMCB9LAogCXsgeyAweDYzLCAweDAzLCAweGM4IH0sIDB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB9LAkJLyogRGVsbCBMYXRpdHVkZSBEODAwICovCiAJeyB7IDB4NzMsIDB4MDIsIDB4MGEgfSwJMHhmOCwgMHhmOCwgMCB9LAotCXsgeyAweDczLCAweDAyLCAweDE0IH0sCTB4ZjgsIDB4ZjgsIDAgfSwKKwl7IHsgMHg3MywgMHgwMiwgMHgxNCB9LAkweGY4LCAweGY4LCBBTFBTX0ZXX0JLXzIgfSwJCS8qIEFodGVjIExhcHRvcCAqLwogCXsgeyAweDIwLCAweDAyLCAweDBlIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sIC8qIFhYWCAqLwogCXsgeyAweDIyLCAweDAyLCAweDBhIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sCiAJeyB7IDB4MjIsIDB4MDIsIDB4MTQgfSwgMHhmZiwgMHhmZiwgQUxQU19QQVNTIHwgQUxQU19EVUFMUE9JTlQgfSwgLyogRGVsbCBMYXRpdHVkZSBENjAwICovCkBAIC02MSwxMSArNjIsMTEgQEAKIAogLyoKICAqIEFMUFMgYWJvbHV0ZSBNb2RlIC0gbmV3IGZvcm1hdAotICogCi0gKiBieXRlIDA6ICAxICAgID8gICAgPyAgICA/ICAgIDEgICAgPyAgICA/ICAgID8gCisgKgorICogYnl0ZSAwOiAgMSAgICA/ICAgID8gICAgPyAgICAxICAgID8gICAgPyAgICA/CiAgKiBieXRlIDE6ICAwICAgeDYgICB4NSAgIHg0ICAgeDMgICB4MiAgIHgxICAgeDAKICAqIGJ5dGUgMjogIDAgICB4MTAgIHg5ICAgeDggICB4NyAgICA/ICBmaW4gIGdlcwotICogYnl0ZSAzOiAgMCAgIHk5ICAgeTggICB5NyAgICAxICAgIE0gICAgUiAgICBMIAorICogYnl0ZSAzOiAgMCAgIHk5ICAgeTggICB5NyAgICAxICAgIE0gICAgUiAgICBMCiAgKiBieXRlIDQ6ICAwICAgeTYgICB5NSAgIHk0ICAgeTMgICB5MiAgIHkxICAgeTAKICAqIGJ5dGUgNTogIDAgICB6NiAgIHo1ICAgejQgICB6MyAgIHoyICAgejEgICB6MAogICoKQEAgLTgxLDExICs4MiwxMiBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZwc21vdXNlLT5kZXY7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2MiA9ICZwcml2LT5kZXYyOwogCWludCB4LCB5LCB6LCBnZXMsIGZpbiwgbGVmdCwgcmlnaHQsIG1pZGRsZTsKKwlpbnQgYmFjayA9IDAsIGZvcndhcmQgPSAwOwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCiAJaWYgKChwYWNrZXRbMF0gJiAweGM4KSA9PSAweDA4KSB7ICAgLyogMy1ieXRlIFBTLzIgcGFja2V0ICovCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2MiwgQlROX0xFRlQsICAgcGFja2V0WzBdICYgMSk7ICAgIAorCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9MRUZULCAgIHBhY2tldFswXSAmIDEpOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9SSUdIVCwgIHBhY2tldFswXSAmIDIpOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9NSURETEUsIHBhY2tldFswXSAmIDQpOwogCQlpbnB1dF9yZXBvcnRfcmVsKGRldjIsIFJFTF9YLApAQCAtMTEyLDYgKzExNCwxOCBAQAogCQl6ID0gcGFja2V0WzVdOwogCX0KIAorCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfRldfQktfMSkgeworCQliYWNrID0gcGFja2V0WzJdICYgNDsKKwkJZm9yd2FyZCA9IHBhY2tldFswXSAmIDB4MTA7CisJfQorCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19GV19CS18yKSB7CisJCWJhY2sgPSBwYWNrZXRbM10gJiA0OworCQlmb3J3YXJkID0gcGFja2V0WzJdICYgNDsKKwkJaWYgKChtaWRkbGUgPSBmb3J3YXJkICYmIGJhY2spKQorCQkJZm9yd2FyZCA9IGJhY2sgPSAwOworCX0KKwogCWdlcyA9IHBhY2tldFsyXSAmIDE7CiAJZmluID0gcGFja2V0WzJdICYgMjsKIApAQCAtMTU1LDEzICsxNjksMTIgQEAKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCB6KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCB6ID4gMCk7CiAKLQogCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfV0hFRUwpCiAJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICgocGFja2V0WzBdID4+IDQpICYgMHgwNykgfCAoKHBhY2tldFsyXSA+PiAyKSAmIDB4MDgpKTsKIAotCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfRldfQkspIHsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBwYWNrZXRbMF0gJiAweDEwKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCBwYWNrZXRbMl0gJiAweDA0KTsKKwlpZiAocHJpdi0+aS0+ZmxhZ3MgJiAoQUxQU19GV19CS18xIHwgQUxQU19GV19CS18yKSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0ZPUldBUkQsIGZvcndhcmQpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGJhY2spOwogCX0KIAogCWlucHV0X3N5bmMoZGV2KTsKQEAgLTI1Nyw3ICsyNzAsNiBAQAogc3RhdGljIGludCBhbHBzX3Bhc3N0aHJvdWdoX21vZGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGludCBlbmFibGUpCiB7CiAJc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJnBzbW91c2UtPnBzMmRldjsKLQl1bnNpZ25lZCBjaGFyIHBhcmFtWzNdOwogCWludCBjbWQgPSBlbmFibGUgPyBQU01PVVNFX0NNRF9TRVRTQ0FMRTIxIDogUFNNT1VTRV9DTURfU0VUU0NBTEUxMTsKIAogCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIGNtZCkgfHwKQEAgLTI2Nyw3ICsyNzksNyBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiB3ZSBtYXkgZ2V0IDMgbW9yZSBieXRlcywganVzdCBpZ25vcmUgdGhlbSAqLwotCXBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIDB4MDMwMCk7CisJcHMyX2RyYWluKHBzMmRldiwgMywgMTAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDI1LDcgKzQzNyw3IEBACiAJCXBzbW91c2UtPmRldi5yZWxiaXRbTE9ORyhSRUxfV0hFRUwpXSB8PSBCSVQoUkVMX1dIRUVMKTsKIAl9CiAKLQlpZiAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX0ZXX0JLKSB7CisJaWYgKHByaXYtPmktPmZsYWdzICYgKEFMUFNfRldfQktfMSB8IEFMUFNfRldfQktfMikpIHsKIAkJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9GT1JXQVJEKV0gfD0gQklUKEJUTl9GT1JXQVJEKTsKIAkJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9CQUNLKV0gfD0gQklUKEJUTl9CQUNLKTsKIAl9CkBAIC00MzYsOCArNDQ4LDggQEAKIAlwcml2LT5kZXYyLmlkLmJ1c3R5cGUgPSBCVVNfSTgwNDI7CiAJcHJpdi0+ZGV2Mi5pZC52ZW5kb3IgPSAweDAwMDI7CiAJcHJpdi0+ZGV2Mi5pZC5wcm9kdWN0ID0gUFNNT1VTRV9BTFBTOwotCXByaXYtPmRldjIuaWQudmVyc2lvbiA9IDB4MDAwMDsgCi0JCisJcHJpdi0+ZGV2Mi5pZC52ZXJzaW9uID0gMHgwMDAwOworCiAJcHJpdi0+ZGV2Mi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CiAJcHJpdi0+ZGV2Mi5yZWxiaXRbTE9ORyhSRUxfWCldIHw9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOwogCXByaXYtPmRldjIua2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7CkBAIC00NjEsMTcgKzQ3MywxNSBAQAogaW50IGFscHNfZGV0ZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgc2V0X3Byb3BlcnRpZXMpCiB7CiAJaW50IHZlcnNpb247Ci0Jc3RydWN0IGFscHNfbW9kZWxfaW5mbyAqbW9kZWw7IAorCXN0cnVjdCBhbHBzX21vZGVsX2luZm8gKm1vZGVsOwogCiAJaWYgKCEobW9kZWwgPSBhbHBzX2dldF9tb2RlbChwc21vdXNlLCAmdmVyc2lvbikpKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKIAkJcHNtb3VzZS0+dmVuZG9yID0gIkFMUFMiOwotCQlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19EVUFMUE9JTlQpIAotCQkJcHNtb3VzZS0+bmFtZSA9ICJEdWFsUG9pbnQgVG91Y2hQYWQiOwotCQllbHNlCi0JCQlwc21vdXNlLT5uYW1lID0gIkdsaWRlUG9pbnQiOworCQlwc21vdXNlLT5uYW1lID0gbW9kZWwtPmZsYWdzICYgQUxQU19EVUFMUE9JTlQgPworCQkJCSJEdWFsUG9pbnQgVG91Y2hQYWQiIDogIkdsaWRlUG9pbnQiOwogCQlwc21vdXNlLT5tb2RlbCA9IHZlcnNpb247CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jCmluZGV4IDdiYWEwOWMuLmU5OTQ4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYW1pbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMKQEAgLTMzLDcgKzMzLDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQW1pZ2EgbW91c2UgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgYW1pbW91c2VfdXNlZCA9IDA7CiBzdGF0aWMgaW50IGFtaW1vdXNlX2xhc3R4LCBhbWltb3VzZV9sYXN0eTsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGFtaW1vdXNlX2RldjsKIApAQCAtODEsMTYgKzgwLDEyIEBACiB7CiAJdW5zaWduZWQgc2hvcnQgam95MGRhdDsKIAotICAgICAgICBpZiAoYW1pbW91c2VfdXNlZCsrKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCiAJam95MGRhdCA9IGN1c3RvbS5qb3kwZGF0OwogCiAJYW1pbW91c2VfbGFzdHggPSBqb3kwZGF0ICYgMHhmZjsKIAlhbWltb3VzZV9sYXN0eSA9IGpveTBkYXQgPj4gODsKIAogCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaW1vdXNlX2ludGVycnVwdCwgMCwgImFtaW1vdXNlIiwgYW1pbW91c2VfaW50ZXJydXB0KSkgewotICAgICAgICAgICAgICAgIGFtaW1vdXNlX3VzZWQtLTsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImFtaW1vdXNlLmM6IENhbid0IGFsbG9jYXRlIGlycSAlZFxuIiwgSVJRX0FNSUdBX1ZFUlRCKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICB9CkBAIC0xMDAsOCArOTUsNyBAQAogCiBzdGF0aWMgdm9pZCBhbWltb3VzZV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0gICAgICAgIGlmICghLS1hbWltb3VzZV91c2VkKQotCQlmcmVlX2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaW1vdXNlX2ludGVycnVwdCk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhbWltb3VzZV9pbnRlcnJ1cHQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhbWltb3VzZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9pbnBvcnQuYwppbmRleCBjYTRlOTY4Li4xZjYyYzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaW5wb3J0LmMKQEAgLTE3LDE4ICsxNywxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTg3LDI5ICs4NywyMyBAQAogCiBfX29ic29sZXRlX3NldHVwKCJpbnBvcnRfaXJxPSIpOwogCi1zdGF0aWMgaW50IGlucG9ydF91c2VkOwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgaW5wb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIGludCBpbnBvcnRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0JaWYgKCFpbnBvcnRfdXNlZCsrKSB7Ci0JCWlmIChyZXF1ZXN0X2lycShpbnBvcnRfaXJxLCBpbnBvcnRfaW50ZXJydXB0LCAwLCAiaW5wb3J0IiwgTlVMTCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlvdXRiKElOUE9SVF9SRUdfTU9ERSwgSU5QT1JUX0NPTlRST0xfUE9SVCk7Ci0JCW91dGIoSU5QT1JUX01PREVfSVJRIHwgSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7Ci0JfQorCWlmIChyZXF1ZXN0X2lycShpbnBvcnRfaXJxLCBpbnBvcnRfaW50ZXJydXB0LCAwLCAiaW5wb3J0IiwgTlVMTCkpCisJCXJldHVybiAtRUJVU1k7CisJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOworCW91dGIoSU5QT1JUX01PREVfSVJRIHwgSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaW5wb3J0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpZiAoIS0taW5wb3J0X3VzZWQpIHsKLQkJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOwotCQlvdXRiKElOUE9SVF9NT0RFX0JBU0UsIElOUE9SVF9EQVRBX1BPUlQpOwotCQlmcmVlX2lycShpbnBvcnRfaXJxLCBOVUxMKTsKLQl9CisJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOworCW91dGIoSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7CisJZnJlZV9pcnEoaW5wb3J0X2lycSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGlucG9ydF9kZXYgPSB7CkBAIC0xMjAsMTEgKzExNCwxMSBAQAogCS5jbG9zZQk9IGlucG9ydF9jbG9zZSwKIAkubmFtZQk9IElOUE9SVF9OQU1FLAogCS5waHlzCT0gImlzYTAyM2MvaW5wdXQwIiwKLQkuaWQgPSB7IAotIAkJLmJ1c3R5cGUgPSBCVVNfSVNBLAotICAgICAgICAJLnZlbmRvciAgPSBJTlBPUlRfVkVORE9SLAotICAgICAgICAJLnByb2R1Y3QgPSAweDAwMDEsCi0gICAgICAgIAkudmVyc2lvbiA9IDB4MDEwMCwKKwkuaWQgPSB7CisJCS5idXN0eXBlID0gQlVTX0lTQSwKKwkJLnZlbmRvciAgPSBJTlBPUlRfVkVORE9SLAorCQkucHJvZHVjdCA9IDB4MDAwMSwKKwkJLnZlcnNpb24gPSAweDAxMDAsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDlkZjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogRnVqaXRzdSBCLXNlcmllcyBMaWZlYm9vayBQUy8yIFRvdWNoU2NyZWVuIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChjKSAyMDA1IEtlbmFuIEVzYXUgPGtlbmFuLmVzYXVAY29uYW4uZGU+CisgKgorICogVG91Y2hTY3JlZW4gZGV0ZWN0aW9uLCBhYnNvbHV0ZSBtb2RlIHNldHRpbmcgYW5kIHBhY2tldCBsYXlvdXQgaXMgdGFrZW4gZnJvbQorICogSGFyYWxkIEhveWVyJ3MgZGVzY3JpcHRpb24gb2YgdGhlIGRldmljZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisjaW5jbHVkZSA8bGludXgvbGlicHMyLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisKKyNpbmNsdWRlICJwc21vdXNlLmgiCisjaW5jbHVkZSAibGlmZWJvb2suaCIKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGxpZmVib29rX2RtaV90YWJsZVtdID0geworICAgICAgIHsKKyAgICAgICAgICAgICAgIC5pZGVudCA9ICJMaWZlYm9vayBCIiwKKyAgICAgICAgICAgICAgIC5tYXRjaGVzID0geworICAgICAgICAgICAgICAgICAgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIEIgU2VyaWVzIiksCisgICAgICAgICAgICAgICB9LAorICAgICAgIH0sCisgICAgICAgeyB9Cit9OworCisKK3N0YXRpYyBwc21vdXNlX3JldF90IGxpZmVib29rX3Byb2Nlc3NfYnl0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZwc21vdXNlLT5kZXY7CisKKwlpZiAocHNtb3VzZS0+cGt0Y250ICE9IDMpCisJCXJldHVybiBQU01PVVNFX0dPT0RfREFUQTsKKworCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKKworCS8qIGNhbGN1bGF0ZSBYIGFuZCBZICovCisJaWYgKChwYWNrZXRbMF0gJiAweDA4KSA9PSAweDAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwKKwkJCQkgKHBhY2tldFsxXSB8ICgocGFja2V0WzBdICYgMHgzMCkgPDwgNCkpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAorCQkJCSAxMDI0IC0gKHBhY2tldFsyXSB8ICgocGFja2V0WzBdICYgMHhDMCkgPDwgMikpKTsKKwl9IGVsc2UgeworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsCisJCQkJKChwYWNrZXRbMF0gJiAweDEwKSA/IHBhY2tldFsxXSAtIDI1NiA6IHBhY2tldFsxXSkpOworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksCisJCQkJIC0oaW50KSgocGFja2V0WzBdICYgMHgyMCkgPyBwYWNrZXRbMl0gLSAyNTYgOiBwYWNrZXRbMl0pKTsKKwl9CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIHBhY2tldFswXSAmIDB4MDQpOworCisJaW5wdXRfc3luYyhkZXYpOworCisJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7Cit9CisKK3N0YXRpYyBpbnQgbGlmZWJvb2tfYWJzb2x1dGVfbW9kZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKK3sKKwlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmcHNtb3VzZS0+cHMyZGV2OworCXVuc2lnbmVkIGNoYXIgcGFyYW07CisKKwlpZiAocHNtb3VzZV9yZXNldChwc21vdXNlKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgICBFbmFibGUgYWJzb2x1dGUgb3V0cHV0IC0tIHBzMl9jb21tYW5kIGZhaWxzIGFsd2F5cyBidXQgaWYKKwkgICB5b3UgbGVhdmUgdGhpcyBjYWxsIG91dCB0aGUgdG91Y2hzcmVlbiB3aWxsIG5ldmVyIHNlbmQKKwkgICBhYnNvbHV0ZSBjb29yZGluYXRlcworCSovCisJcGFyYW0gPSAweDA3OworCXBzMl9jb21tYW5kKHBzMmRldiwgJnBhcmFtLCBQU01PVVNFX0NNRF9TRVRSRVMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpZmVib29rX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbikKK3sKKwl1bnNpZ25lZCBjaGFyIHBhcmFtc1tdID0geyAwLCAxLCAyLCAyLCAzIH07CisKKwlpZiAocmVzb2x1dGlvbiA9PSAwIHx8IHJlc29sdXRpb24gPiA0MDApCisJCXJlc29sdXRpb24gPSA0MDA7CisKKwlwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCAmcGFyYW1zW3Jlc29sdXRpb24gLyAxMDBdLCBQU01PVVNFX0NNRF9TRVRSRVMpOworCXBzbW91c2UtPnJlc29sdXRpb24gPSA1MCA8PCBwYXJhbXNbcmVzb2x1dGlvbiAvIDEwMF07Cit9CisKK3N0YXRpYyB2b2lkIGxpZmVib29rX2Rpc2Nvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKK30KKworaW50IGxpZmVib29rX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQoreworICAgICAgICBpZiAoIWRtaV9jaGVja19zeXN0ZW0obGlmZWJvb2tfZG1pX3RhYmxlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKwlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKKwkJcHNtb3VzZS0+dmVuZG9yID0gIkZ1aml0c3UiOworCQlwc21vdXNlLT5uYW1lID0gIkxpZmVib29rIFRvdWNoU2NyZWVuIjsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsaWZlYm9va19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCWlmIChsaWZlYm9va19hYnNvbHV0ZV9tb2RlKHBzbW91c2UpKQorCQlyZXR1cm4gLTE7CisKKwlwc21vdXNlLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfQUJTKSB8IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CisJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9MRUZUKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7CisJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9UT1VDSCldID0gQklUKEJUTl9UT1VDSCk7CisJcHNtb3VzZS0+ZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZwc21vdXNlLT5kZXYsIEFCU19YLCAwLCAxMDI0LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmcHNtb3VzZS0+ZGV2LCBBQlNfWSwgMCwgMTAyNCwgMCwgMCk7CisKKwlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gbGlmZWJvb2tfcHJvY2Vzc19ieXRlOworCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gbGlmZWJvb2tfc2V0X3Jlc29sdXRpb247CisJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IGxpZmVib29rX2Rpc2Nvbm5lY3Q7CisJcHNtb3VzZS0+cmVjb25uZWN0ICA9IGxpZmVib29rX2Fic29sdXRlX21vZGU7CisJcHNtb3VzZS0+cGt0c2l6ZSA9IDM7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWMwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIEZ1aml0c3UgQi1zZXJpZXMgTGlmZWJvb2sgUFMvMiBUb3VjaFNjcmVlbiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJRkVCT09LX0gKKyNkZWZpbmUgX0xJRkVCT09LX0gKKworaW50IGxpZmVib29rX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKTsKK2ludCBsaWZlYm9va19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYwppbmRleCA3N2ViODNlLi44YjUyNDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naWJtLmMKQEAgLTE4LDE4ICsxOCwxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTc3LDE2ICs3NywxMSBAQAogCiBfX29ic29sZXRlX3NldHVwKCJsb2dpYm1faXJxPSIpOwogCi1zdGF0aWMgaW50IGxvZ2libV91c2VkID0gMDsKLQogc3RhdGljIGlycXJldHVybl90IGxvZ2libV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIHN0YXRpYyBpbnQgbG9naWJtX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmIChsb2dpYm1fdXNlZCsrKQotCQlyZXR1cm4gMDsKIAlpZiAocmVxdWVzdF9pcnEobG9naWJtX2lycSwgbG9naWJtX2ludGVycnVwdCwgMCwgImxvZ2libSIsIE5VTEwpKSB7Ci0JCWxvZ2libV91c2VkLS07CiAJCXByaW50ayhLRVJOX0VSUiAibG9naWJtLmM6IENhbid0IGFsbG9jYXRlIGlycSAlZFxuIiwgbG9naWJtX2lycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTYsOCArOTEsNiBAQAogCiBzdGF0aWMgdm9pZCBsb2dpYm1fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmICgtLWxvZ2libV91c2VkKQotCQlyZXR1cm47CiAJb3V0YihMT0dJQk1fRElTQUJMRV9JUlEsIExPR0lCTV9DT05UUk9MX1BPUlQpOwogCWZyZWVfaXJxKGxvZ2libV9pcnEsIE5VTEwpOwogfQpAQCAtMTY3LDcgKzE2MCw3IEBACiAJb3V0YihMT0dJQk1fRElTQUJMRV9JUlEsIExPR0lCTV9DT05UUk9MX1BPUlQpOwogCiAJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZsb2dpYm1fZGV2KTsKLQkKKwogCXByaW50ayhLRVJOX0lORk8gImlucHV0OiBMb2dpdGVjaCBidXMgbW91c2UgYXQgJSN4IGlycSAlZFxuIiwgTE9HSUJNX0JBU0UsIGxvZ2libV9pcnEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL21hcGxlbW91c2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCmluZGV4IDEyZGMwZWYuLmU5MGM2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCSRJZDogbWFwbGVtb3VzZS5jLHYgMS4yIDIwMDQvMDMvMjIgMDE6MTg6MTUgbGV0aGFsIEV4cCAkCi0gKiAJU0VHQSBEcmVhbWNhc3QgbW91c2UgZHJpdmVyCisgKglTRUdBIERyZWFtY2FzdCBtb3VzZSBkcml2ZXIKICAqCUJhc2VkIG9uIGRyaXZlcnMvdXNiL3VzYm1vdXNlLmMKICAqLwogCkBAIC0xNSw4MCArMTUsNTEgQEAKIE1PRFVMRV9BVVRIT1IoIllBRUdBU0hJIFRha2VzaGkgPHRAa2VzaGkub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTRUdBIERyZWFtY2FzdCBtb3VzZSBkcml2ZXIiKTsKIAotc3RydWN0IGRjX21vdXNlIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2IGRldjsKLQlpbnQgb3BlbjsKLX07Ci0KLQogc3RhdGljIHZvaWQgZGNfbW91c2VfY2FsbGJhY2soc3RydWN0IG1hcGxlcSAqbXEpCiB7CiAJaW50IGJ1dHRvbnMsIHJlbHgsIHJlbHksIHJlbHo7CiAJc3RydWN0IG1hcGxlX2RldmljZSAqbWFwbGVkZXYgPSBtcS0+ZGV2OwotCXN0cnVjdCBkY19tb3VzZSAqbW91c2UgPSBtYXBsZWRldi0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZtb3VzZS0+ZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IG1hcGxlZGV2LT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgY2hhciAqcmVzID0gbXEtPnJlY3ZidWY7CiAKIAlidXR0b25zID0gfnJlc1s4XTsKLQlyZWx4PSoodW5zaWduZWQgc2hvcnQgKikocmVzKzEyKS01MTI7Ci0JcmVseT0qKHVuc2lnbmVkIHNob3J0ICopKHJlcysxNCktNTEyOwotCXJlbHo9Kih1bnNpZ25lZCBzaG9ydCAqKShyZXMrMTYpLTUxMjsKKwlyZWx4ID0gKih1bnNpZ25lZCBzaG9ydCAqKShyZXMgKyAxMikgLSA1MTI7CisJcmVseSA9ICoodW5zaWduZWQgc2hvcnQgKikocmVzICsgMTQpIC0gNTEyOworCXJlbHogPSAqKHVuc2lnbmVkIHNob3J0ICopKHJlcyArIDE2KSAtIDUxMjsKIAotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBidXR0b25zJjQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBidXR0b25zJjkpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBidXR0b25zJjIpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBidXR0b25zICYgNCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGJ1dHRvbnMgJiA5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgYnV0dG9ucyAmIDIpOwogCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgICAgICByZWx4KTsKIAlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksICAgICAgcmVseSk7CiAJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgIHJlbHopOwogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotCi1zdGF0aWMgaW50IGRjX21vdXNlX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19tb3VzZSAqbW91c2UgPSBkZXYtPnByaXZhdGU7Ci0JbW91c2UtPm9wZW4rKzsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkY19tb3VzZV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGRjX21vdXNlICptb3VzZSA9IGRldi0+cHJpdmF0ZTsKLQltb3VzZS0+b3Blbi0tOwotfQotCi0KIHN0YXRpYyBpbnQgZGNfbW91c2VfY29ubmVjdChzdHJ1Y3QgbWFwbGVfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBkYXRhID0gYmUzMl90b19jcHUoZGV2LT5kZXZpbmZvLmZ1bmN0aW9uX2RhdGFbMF0pOwotCXN0cnVjdCBkY19tb3VzZSAqbW91c2U7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCi0JaWYgKCEobW91c2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGNfbW91c2UpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoaW5wdXRfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2RldiksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC0xOwotCW1lbXNldChtb3VzZSwgMCwgc2l6ZW9mKHN0cnVjdCBkY19tb3VzZSkpOwogCi0JZGV2LT5wcml2YXRlX2RhdGEgPSBtb3VzZTsKKwlkZXYtPnByaXZhdGVfZGF0YSA9IGlucHV0X2RldjsKIAotCW1vdXNlLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOwotCW1vdXNlLT5kZXYua2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7Ci0JbW91c2UtPmRldi5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKSB8IEJJVChSRUxfV0hFRUwpOworCW1lbXNldChpbnB1dF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgZGNfbW91c2UpKTsKKwlpbml0X2lucHV0X2RldihpbnB1dF9kZXYpOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7CisJaW5wdXRfZGV2LT5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKSB8IEJJVChSRUxfV0hFRUwpOwogCi0JaW5pdF9pbnB1dF9kZXYoJm1vdXNlLT5kZXYpOworCWlucHV0X2Rldi0+bmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19NQVBMRTsKIAotCW1vdXNlLT5kZXYucHJpdmF0ZSA9IG1vdXNlOwotCW1vdXNlLT5kZXYub3BlbiA9IGRjX21vdXNlX29wZW47Ci0JbW91c2UtPmRldi5jbG9zZSA9IGRjX21vdXNlX2Nsb3NlOwotCW1vdXNlLT5kZXYuZXZlbnQgPSBOVUxMOwotCi0JbW91c2UtPmRldi5uYW1lID0gZGV2LT5wcm9kdWN0X25hbWU7Ci0JbW91c2UtPmRldi5pZC5idXN0eXBlID0gQlVTX01BUExFOwotCQotCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmbW91c2UtPmRldik7CisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAKIAltYXBsZV9nZXRjb25kX2NhbGxiYWNrKGRldiwgZGNfbW91c2VfY2FsbGJhY2ssIDEsIE1BUExFX0ZVTkNfTU9VU0UpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6IG1vdXNlKDB4JWx4KTogJXNcbiIsIGRhdGEsIG1vdXNlLT5kZXYubmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6IG1vdXNlKDB4JWx4KTogJXNcbiIsIGRhdGEsIGlucHV0X2Rldi0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2LDEwICs2NywxMCBAQAogCiBzdGF0aWMgdm9pZCBkY19tb3VzZV9kaXNjb25uZWN0KHN0cnVjdCBtYXBsZV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGNfbW91c2UgKm1vdXNlID0gZGV2LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gZGV2LT5wcml2YXRlX2RhdGE7CiAKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmbW91c2UtPmRldik7Ci0Ja2ZyZWUobW91c2UpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoaW5wdXRfZGV2KTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMKaW5kZXggMGM3NDkxOC4uOTMzOTNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wYzExMHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcGMxMTBwYWQuYwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBWb2p0ZWNoIFBhdmxpawogICoKICAqICBCYXNlZCBvbiB0aGUgd29yayBvZjoKLSAqCUFsYW4gQ294CVJvYmluIE8nTGVhcnkJCisgKglBbGFuIENveAlSb2JpbiBPJ0xlYXJ5CiAgKi8KIAogLyoKQEAgLTU2LDcgKzU2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IHBjMTEwcGFkX2RldjsKIHN0YXRpYyBpbnQgcGMxMTBwYWRfZGF0YVszXTsKIHN0YXRpYyBpbnQgcGMxMTBwYWRfY291bnQ7Ci1zdGF0aWMgaW50IHBjMTEwcGFkX3VzZWQ7CiAKIHN0YXRpYyBjaGFyICpwYzExMHBhZF9uYW1lID0gIklCTSBQQzExMCBUb3VjaFBhZCI7CiBzdGF0aWMgY2hhciAqcGMxMTBwYWRfcGh5cyA9ICJpc2ExNWUwL2lucHV0MCI7CkBAIC03NCw3ICs3Myw3IEBACiAKIAlpZiAocGMxMTBwYWRfY291bnQgPCAzKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCisKIAlpbnB1dF9yZWdzKCZwYzExMHBhZF9kZXYsIHJlZ3MpOwogCWlucHV0X3JlcG9ydF9rZXkoJnBjMTEwcGFkX2RldiwgQlROX1RPVUNILAogCQlwYzExMHBhZF9kYXRhWzBdICYgMHgwMSk7CkBAIC05MCwxNSArODksMTEgQEAKIAogc3RhdGljIHZvaWQgcGMxMTBwYWRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmICghLS1wYzExMHBhZF91c2VkKQotCQlvdXRiKFBDMTEwUEFEX09GRiwgcGMxMTBwYWRfaW8gKyAyKTsKKwlvdXRiKFBDMTEwUEFEX09GRiwgcGMxMTBwYWRfaW8gKyAyKTsKIH0KIAogc3RhdGljIGludCBwYzExMHBhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpZiAocGMxMTBwYWRfdXNlZCsrKQotCQlyZXR1cm4gMDsKLQogCXBjMTEwcGFkX2ludGVycnVwdCgwLE5VTEwsTlVMTCk7CiAJcGMxMTBwYWRfaW50ZXJydXB0KDAsTlVMTCxOVUxMKTsKIAlwYzExMHBhZF9pbnRlcnJ1cHQoMCxOVUxMLE5VTEwpOwpAQCAtMTQ1LDcgKzE0MCw3IEBACiAKIAlwYzExMHBhZF9kZXYuYWJzbWF4W0FCU19YXSA9IDB4MWZmOwogCXBjMTEwcGFkX2Rldi5hYnNtYXhbQUJTX1ldID0gMHgwZmY7Ci0gICAgICAgIAorCiAJcGMxMTBwYWRfZGV2Lm9wZW4gPSBwYzExMHBhZF9vcGVuOwogICAgICAgICBwYzExMHBhZF9kZXYuY2xvc2UgPSBwYzExMHBhZF9jbG9zZTsKIApAQCAtMTU2LDE3ICsxNTEsMTcgQEAKIAlwYzExMHBhZF9kZXYuaWQucHJvZHVjdCA9IDB4MDAwMTsKIAlwYzExMHBhZF9kZXYuaWQudmVyc2lvbiA9IDB4MDEwMDsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmcGMxMTBwYWRfZGV2KTsJCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZwYzExMHBhZF9kZXYpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIGF0ICUjeCBpcnEgJWRcbiIsCiAJCXBjMTEwcGFkX25hbWUsIHBjMTEwcGFkX2lvLCBwYzExMHBhZF9pcnEpOwotCQorCiAJcmV0dXJuIDA7CiB9Ci0gCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBwYzExMHBhZF9leGl0KHZvaWQpCiB7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnBjMTEwcGFkX2Rldik7CQorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZwYzExMHBhZF9kZXYpOwogCiAJb3V0YihQQzExMFBBRF9PRkYsIHBjMTEwcGFkX2lvICsgMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDAxOTAzNGIuLjE5Nzg1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInN5bmFwdGljcy5oIgogI2luY2x1ZGUgImxvZ2lwczJwcC5oIgogI2luY2x1ZGUgImFscHMuaCIKKyNpbmNsdWRlICJsaWZlYm9vay5oIgogCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJQUy8yIG1vdXNlIGRyaXZlciIKIApAQCAtMzEsMTAgKzMyLDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHNtb3VzZV9tYXhfcHJvdG8gPSAtMVU7CitzdGF0aWMgdW5zaWduZWQgaW50IHBzbW91c2VfbWF4X3Byb3RvID0gUFNNT1VTRV9BVVRPOwogc3RhdGljIGludCBwc21vdXNlX3NldF9tYXhwcm90byhjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKIHN0YXRpYyBpbnQgcHNtb3VzZV9nZXRfbWF4cHJvdG8oY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7Ci1zdGF0aWMgY2hhciAqcHNtb3VzZV9wcm90b19hYmJyZXZbXSA9IHsgTlVMTCwgImJhcmUiLCBOVUxMLCBOVUxMLCBOVUxMLCAiaW1wcyIsICJleHBzIiwgTlVMTCwgTlVMTCwgTlVMTCB9OwogI2RlZmluZSBwYXJhbV9jaGVja19wcm90b19hYmJyZXYobmFtZSwgcCkJX19wYXJhbV9jaGVjayhuYW1lLCBwLCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIHBhcmFtX3NldF9wcm90b19hYmJyZXYJCQlwc21vdXNlX3NldF9tYXhwcm90bwogI2RlZmluZSBwYXJhbV9nZXRfcHJvdG9fYWJicmV2CQkJcHNtb3VzZV9nZXRfbWF4cHJvdG8KQEAgLTU3LDYgKzU3LDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChyZXNldGFmdGVyLCBwc21vdXNlX3Jlc2V0YWZ0ZXIsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZXNldGFmdGVyLCAiUmVzZXQgZGV2aWNlIGFmdGVyIHNvIG1hbnkgYmFkIHBhY2tldHMgKDAgPSBuZXZlcikuIik7CiAKK1BTTU9VU0VfREVGSU5FX0FUVFIocHJvdG9jb2wpOwogUFNNT1VTRV9ERUZJTkVfQVRUUihyYXRlKTsKIFBTTU9VU0VfREVGSU5FX0FUVFIocmVzb2x1dGlvbik7CiBQU01PVVNFX0RFRklORV9BVFRSKHJlc2V0YWZ0ZXIpOwpAQCAtNjcsNyArNjgsMjMgQEAKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2VfcmVzZXRhZnRlcj0iKTsKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2VfcmF0ZT0iKTsKIAotc3RhdGljIGNoYXIgKnBzbW91c2VfcHJvdG9jb2xzW10gPSB7ICJOb25lIiwgIlBTLzIiLCAiUFMyKysiLCAiVGhpbmtQUy8yIiwgIkdlblBTLzIiLCAiSW1QUy8yIiwgIkltRXhQUy8yIiwgIlN5blBTLzIiLCAiQWxwc1BTLzIiIH07CisvKgorICogcHNtb3VzZV9zZW0gcHJvdGVjdHMgYWxsIG9wZXJhdGlvbnMgY2hhbmdpbmcgc3RhdGUgb2YgbW91c2UKKyAqIChjb25uZWN0aW5nLCBkaXNjb25uZWN0aW5nLCBjaGFuZ2luZyByYXRlIG9yIHJlc29sdXRpb24gdmlhCisgKiBzeXNmcykuIFdlIGNvdWxkIHVzZSBhIHBlci1kZXZpY2Ugc2VtYXBob3JlIGJ1dCBzaW5jZSB0aGVyZQorICogcmFyZWx5IG1vcmUgdGhhbiBvbmUgUFMvMiBtb3VzZSBjb25uZWN0ZWQgYW5kIHNpbmNlIHNlbWFwaG9yZQorICogaXMgdGFrZW4gaW4gInNsb3ciIHBhdGhzIGl0IGlzIG5vdCB3b3J0aCBpdC4KKyAqLworc3RhdGljIERFQ0xBUkVfTVVURVgocHNtb3VzZV9zZW0pOworCitzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCB7CisJZW51bSBwc21vdXNlX3R5cGUgdHlwZTsKKwljaGFyICpuYW1lOworCWNoYXIgKmFsaWFzOworCWludCBtYXhwcm90bzsKKwlpbnQgKCpkZXRlY3QpKHN0cnVjdCBwc21vdXNlICosIGludCk7CisJaW50ICgqaW5pdCkoc3RydWN0IHBzbW91c2UgKik7Cit9OwogCiAvKgogICogcHNtb3VzZV9wcm9jZXNzX2J5dGUoKSBhbmFseXplcyB0aGUgUFMvMiBkYXRhIHN0cmVhbSBhbmQgcmVwb3J0cwpAQCAtNDA3LDEyICs0MjQsMTUgQEAKICAqLwogc3RhdGljIGludCBwczJiYXJlX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQogewotCWlmICghcHNtb3VzZS0+dmVuZG9yKSBwc21vdXNlLT52ZW5kb3IgPSAiR2VuZXJpYyI7Ci0JaWYgKCFwc21vdXNlLT5uYW1lKSBwc21vdXNlLT5uYW1lID0gIk1vdXNlIjsKKwlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKKwkJaWYgKCFwc21vdXNlLT52ZW5kb3IpIHBzbW91c2UtPnZlbmRvciA9ICJHZW5lcmljIjsKKwkJaWYgKCFwc21vdXNlLT5uYW1lKSBwc21vdXNlLT5uYW1lID0gIk1vdXNlIjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAorCiAvKgogICogcHNtb3VzZV9leHRlbnNpb25zKCkgcHJvYmVzIGZvciBhbnkgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMgUFMvMiBwcm90b2NvbAogICogdGhlIG1vdXNlIG1heSBoYXZlLgpAQCAtNDI0LDYgKzQ0NCwxNyBAQAogCWludCBzeW5hcHRpY3NfaGFyZHdhcmUgPSAwOwogCiAvKgorICogV2UgYWx3YXlzIGNoZWNrIGZvciBsaWZlYm9vayBiZWNhdXNlIGl0IGRvZXMgbm90IGRpc3R1cmIgbW91c2UKKyAqIChpdCBvbmx5IGNoZWNrcyBETUkgaW5mb3JtYXRpb24pLgorICovCisJaWYgKGxpZmVib29rX2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkgeworCQlpZiAobWF4X3Byb3RvID4gUFNNT1VTRV9JTUVYKSB7CisJCQlpZiAoIXNldF9wcm9wZXJ0aWVzIHx8IGxpZmVib29rX2luaXQocHNtb3VzZSkgPT0gMCkKKwkJCQlyZXR1cm4gUFNNT1VTRV9MSUZFQk9PSzsKKwkJfQorCX0KKworLyoKICAqIFRyeSBLZW5zaW5ndG9uIFRoaW5raW5nTW91c2UgKHdlIHRyeSBmaXJzdCwgYmVjYXVzZSBzeW5hcHRpY3MgcHJvYmUKICAqIHVwc2V0cyB0aGUgdGhpbmtpbmdtb3VzZSkuCiAgKi8KQEAgLTUwNiw2ICs1MzcsMTAzIEBACiAJcmV0dXJuIFBTTU9VU0VfUFMyOwogfQogCitzdGF0aWMgc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgcHNtb3VzZV9wcm90b2NvbHNbXSA9IHsKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfUFMyLAorCQkubmFtZQkJPSAiUFMvMiIsCisJCS5hbGlhcwkJPSAiYmFyZSIsCisJCS5tYXhwcm90bwk9IDEsCisJCS5kZXRlY3QJCT0gcHMyYmFyZV9kZXRlY3QsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfUFMyUFAsCisJCS5uYW1lCQk9ICJQUzIrKyIsCisJCS5hbGlhcwkJPSAibG9naXRlY2giLAorCQkuZGV0ZWN0CQk9IHBzMnBwX2luaXQsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfVEhJTktQUywKKwkJLm5hbWUJCT0gIlRoaW5rUFMvMiIsCisJCS5hbGlhcwkJPSAidGhpbmtwcyIsCisJCS5kZXRlY3QJCT0gdGhpbmtpbmdfZGV0ZWN0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX0dFTlBTLAorCQkubmFtZQkJPSAiR2VuUFMvMiIsCisJCS5hbGlhcwkJPSAiZ2VuaXVzIiwKKwkJLmRldGVjdAkJPSBnZW5pdXNfZGV0ZWN0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX0lNUFMsCisJCS5uYW1lCQk9ICJJbVBTLzIiLAorCQkuYWxpYXMJCT0gImltcHMiLAorCQkubWF4cHJvdG8JPSAxLAorCQkuZGV0ZWN0CQk9IGludGVsbGltb3VzZV9kZXRlY3QsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfSU1FWCwKKwkJLm5hbWUJCT0gIkltRXhQUy8yIiwKKwkJLmFsaWFzCQk9ICJleHBzIiwKKwkJLm1heHByb3RvCT0gMSwKKwkJLmRldGVjdAkJPSBpbV9leHBsb3Jlcl9kZXRlY3QsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfU1lOQVBUSUNTLAorCQkubmFtZQkJPSAiU3luUFMvMiIsCisJCS5hbGlhcwkJPSAic3luYXB0aWNzIiwKKwkJLmRldGVjdAkJPSBzeW5hcHRpY3NfZGV0ZWN0LAorCQkuaW5pdAkJPSBzeW5hcHRpY3NfaW5pdCwKKwl9LAorCXsKKwkJLnR5cGUJCT0gUFNNT1VTRV9BTFBTLAorCQkubmFtZQkJPSAiQWxwc1BTLzIiLAorCQkuYWxpYXMJCT0gImFscHMiLAorCQkuZGV0ZWN0CQk9IGFscHNfZGV0ZWN0LAorCQkuaW5pdAkJPSBhbHBzX2luaXQsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfTElGRUJPT0ssCisJCS5uYW1lCQk9ICJMQlBTLzIiLAorCQkuYWxpYXMJCT0gImxpZmVib29rIiwKKwkJLmluaXQJCT0gbGlmZWJvb2tfaW5pdCwKKwl9LAorCXsKKwkJLnR5cGUJCT0gUFNNT1VTRV9BVVRPLAorCQkubmFtZQkJPSAiYXV0byIsCisJCS5hbGlhcwkJPSAiYW55IiwKKwkJLm1heHByb3RvCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwc21vdXNlX3Byb3RvY29sICpwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUoZW51bSBwc21vdXNlX3R5cGUgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBzbW91c2VfcHJvdG9jb2xzKTsgaSsrKQorCQlpZiAocHNtb3VzZV9wcm90b2NvbHNbaV0udHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuICZwc21vdXNlX3Byb3RvY29sc1tpXTsKKworCVdBUk5fT04oMSk7CisJcmV0dXJuICZwc21vdXNlX3Byb3RvY29sc1swXTsKK30KKworc3RhdGljIHN0cnVjdCBwc21vdXNlX3Byb3RvY29sICpwc21vdXNlX3Byb3RvY29sX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBzbW91c2VfcHJvdG9jb2xzKTsgaSsrKSB7CisJCXAgPSAmcHNtb3VzZV9wcm90b2NvbHNbaV07CisKKwkJaWYgKChzdHJsZW4ocC0+bmFtZSkgPT0gbGVuICYmICFzdHJuY21wKHAtPm5hbWUsIG5hbWUsIGxlbikpIHx8CisJCSAgICAoc3RybGVuKHAtPmFsaWFzKSA9PSBsZW4gJiYgIXN0cm5jbXAocC0+YWxpYXMsIG5hbWUsIGxlbikpKQorCQkJcmV0dXJuICZwc21vdXNlX3Byb3RvY29sc1tpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCiAvKgogICogcHNtb3VzZV9wcm9iZSgpIHByb2JlcyBmb3IgYSBQUy8yIG1vdXNlLgogICovCkBAIC02NTMsMzAgKzc4MSw4NCBAQAogCiBzdGF0aWMgdm9pZCBwc21vdXNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgKnBhcmVudDsKKwlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgKnBhcmVudCA9IE5VTEw7CiAKKwlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Byb3RvY29sKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmF0ZSk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc29sdXRpb24pOwogCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yZXNldGFmdGVyKTsKIAotCXBzbW91c2UgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJZG93bigmcHNtb3VzZV9zZW0pOworCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CiAKIAlpZiAoc2VyaW8tPnBhcmVudCAmJiBzZXJpby0+aWQudHlwZSA9PSBTRVJJT19QU19QU1RIUlUpIHsKIAkJcGFyZW50ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8tPnBhcmVudCk7Ci0JCWlmIChwYXJlbnQtPnB0X2RlYWN0aXZhdGUpCi0JCQlwYXJlbnQtPnB0X2RlYWN0aXZhdGUocGFyZW50KTsKKwkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CiAJfQogCiAJaWYgKHBzbW91c2UtPmRpc2Nvbm5lY3QpCiAJCXBzbW91c2UtPmRpc2Nvbm5lY3QocHNtb3VzZSk7CiAKKwlpZiAocGFyZW50ICYmIHBhcmVudC0+cHRfZGVhY3RpdmF0ZSkKKwkJcGFyZW50LT5wdF9kZWFjdGl2YXRlKHBhcmVudCk7CisKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmcHNtb3VzZS0+ZGV2KTsKIAlzZXJpb19jbG9zZShzZXJpbyk7CiAJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwogCWtmcmVlKHBzbW91c2UpOworCisJaWYgKHBhcmVudCkKKwkJcHNtb3VzZV9hY3RpdmF0ZShwYXJlbnQpOworCisJdXAoJnBzbW91c2Vfc2VtKTsKK30KKworc3RhdGljIGludCBwc21vdXNlX3N3aXRjaF9wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgKnByb3RvKQoreworCW1lbXNldCgmcHNtb3VzZS0+ZGV2LCAwLCBzaXplb2Yoc3RydWN0IGlucHV0X2RldikpOworCisJaW5pdF9pbnB1dF9kZXYoJnBzbW91c2UtPmRldik7CisKKwlwc21vdXNlLT5kZXYucHJpdmF0ZSA9IHBzbW91c2U7CisJcHNtb3VzZS0+ZGV2LmRldiA9ICZwc21vdXNlLT5wczJkZXYuc2VyaW8tPmRldjsKKworCXBzbW91c2UtPmRldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CisJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fTUlERExFKSB8IEJJVChCVE5fUklHSFQpOworCXBzbW91c2UtPmRldi5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKTsKKworCXBzbW91c2UtPnNldF9yYXRlID0gcHNtb3VzZV9zZXRfcmF0ZTsKKwlwc21vdXNlLT5zZXRfcmVzb2x1dGlvbiA9IHBzbW91c2Vfc2V0X3Jlc29sdXRpb247CisJcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlciA9IHBzbW91c2VfcHJvY2Vzc19ieXRlOworCXBzbW91c2UtPnBrdHNpemUgPSAzOworCisJaWYgKHByb3RvICYmIChwcm90by0+ZGV0ZWN0IHx8IHByb3RvLT5pbml0KSkgeworCQlpZiAocHJvdG8tPmRldGVjdCAmJiBwcm90by0+ZGV0ZWN0KHBzbW91c2UsIDEpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAocHJvdG8tPmluaXQgJiYgcHJvdG8tPmluaXQocHNtb3VzZSkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCXBzbW91c2UtPnR5cGUgPSBwcm90by0+dHlwZTsKKwl9CisJZWxzZQorCQlwc21vdXNlLT50eXBlID0gcHNtb3VzZV9leHRlbnNpb25zKHBzbW91c2UsIHBzbW91c2VfbWF4X3Byb3RvLCAxKTsKKworCXNwcmludGYocHNtb3VzZS0+ZGV2bmFtZSwgIiVzICVzICVzIiwKKwkJcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKHBzbW91c2UtPnR5cGUpLT5uYW1lLCBwc21vdXNlLT52ZW5kb3IsIHBzbW91c2UtPm5hbWUpOworCisJcHNtb3VzZS0+ZGV2Lm5hbWUgPSBwc21vdXNlLT5kZXZuYW1lOworCXBzbW91c2UtPmRldi5waHlzID0gcHNtb3VzZS0+cGh5czsKKwlwc21vdXNlLT5kZXYuaWQuYnVzdHlwZSA9IEJVU19JODA0MjsKKwlwc21vdXNlLT5kZXYuaWQudmVuZG9yID0gMHgwMDAyOworCXBzbW91c2UtPmRldi5pZC5wcm9kdWN0ID0gcHNtb3VzZS0+dHlwZTsKKwlwc21vdXNlLT5kZXYuaWQudmVyc2lvbiA9IHBzbW91c2UtPm1vZGVsOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC02ODgsNiArODcwLDggQEAKIAlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgKnBhcmVudCA9IE5VTEw7CiAJaW50IHJldHZhbDsKIAorCWRvd24oJnBzbW91c2Vfc2VtKTsKKwogCS8qCiAJICogSWYgdGhpcyBpcyBhIHBhc3MtdGhyb3VnaCBwb3J0IGRlYWN0aXZhdGUgcGFyZW50IHNvIHRoZSBkZXZpY2UKIAkgKiBjb25uZWN0ZWQgdG8gdGhpcyBwb3J0IGNhbiBiZSBzdWNjZXNzZnVsbHkgaWRlbnRpZmllZApAQCAtNjk3LDIwICs4ODEsMTQgQEAKIAkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CiAJfQogCi0JaWYgKCEocHNtb3VzZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwc21vdXNlKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEocHNtb3VzZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwc21vdXNlKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAotCW1lbXNldChwc21vdXNlLCAwLCBzaXplb2Yoc3RydWN0IHBzbW91c2UpKTsKLQogCXBzMl9pbml0KCZwc21vdXNlLT5wczJkZXYsIHNlcmlvKTsKIAlzcHJpbnRmKHBzbW91c2UtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7Ci0JcHNtb3VzZS0+ZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKLQlwc21vdXNlLT5kZXYua2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7Ci0JcHNtb3VzZS0+ZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOwotCXBzbW91c2UtPmRldi5wcml2YXRlID0gcHNtb3VzZTsKLQlwc21vdXNlLT5kZXYuZGV2ID0gJnNlcmlvLT5kZXY7CisKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lOSVRJQUxJWklORyk7CiAKIAlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgcHNtb3VzZSk7CkBAIC03MzQsMjUgKzkxMiwxMCBAQAogCXBzbW91c2UtPnJlc29sdXRpb24gPSBwc21vdXNlX3Jlc29sdXRpb247CiAJcHNtb3VzZS0+cmVzZXRhZnRlciA9IHBzbW91c2VfcmVzZXRhZnRlcjsKIAlwc21vdXNlLT5zbWFydHNjcm9sbCA9IHBzbW91c2Vfc21hcnRzY3JvbGw7Ci0JcHNtb3VzZS0+c2V0X3JhdGUgPSBwc21vdXNlX3NldF9yYXRlOwotCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gcHNtb3VzZV9zZXRfcmVzb2x1dGlvbjsKLQlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gcHNtb3VzZV9wcm9jZXNzX2J5dGU7Ci0JcHNtb3VzZS0+cGt0c2l6ZSA9IDM7CiAKLQlwc21vdXNlLT50eXBlID0gcHNtb3VzZV9leHRlbnNpb25zKHBzbW91c2UsIHBzbW91c2VfbWF4X3Byb3RvLCAxKTsKLQotCXNwcmludGYocHNtb3VzZS0+ZGV2bmFtZSwgIiVzICVzICVzIiwKLQkJcHNtb3VzZV9wcm90b2NvbHNbcHNtb3VzZS0+dHlwZV0sIHBzbW91c2UtPnZlbmRvciwgcHNtb3VzZS0+bmFtZSk7Ci0KLQlwc21vdXNlLT5kZXYubmFtZSA9IHBzbW91c2UtPmRldm5hbWU7Ci0JcHNtb3VzZS0+ZGV2LnBoeXMgPSBwc21vdXNlLT5waHlzOwotCXBzbW91c2UtPmRldi5pZC5idXN0eXBlID0gQlVTX0k4MDQyOwotCXBzbW91c2UtPmRldi5pZC52ZW5kb3IgPSAweDAwMDI7Ci0JcHNtb3VzZS0+ZGV2LmlkLnByb2R1Y3QgPSBwc21vdXNlLT50eXBlOwotCXBzbW91c2UtPmRldi5pZC52ZXJzaW9uID0gcHNtb3VzZS0+bW9kZWw7CisJcHNtb3VzZV9zd2l0Y2hfcHJvdG9jb2wocHNtb3VzZSwgTlVMTCk7CiAKIAlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnBzbW91c2UtPmRldik7Ci0KIAlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogJXMgb24gJXNcbiIsIHBzbW91c2UtPmRldm5hbWUsIHNlcmlvLT5waHlzKTsKIAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwpAQCAtNzYyLDYgKzkyNSw3IEBACiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnB0X2FjdGl2YXRlKQogCQlwYXJlbnQtPnB0X2FjdGl2YXRlKHBhcmVudCk7CiAKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcHJvdG9jb2wpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yYXRlKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc2V0YWZ0ZXIpOwpAQCAtNzcxLDEwICs5MzUsMTEgQEAKIAlyZXR2YWwgPSAwOwogCiBvdXQ6Ci0JLyogSWYgdGhpcyBpcyBhIHBhc3MtdGhyb3VnaCBwb3J0IHRoZSBwYXJlbnQgYXdhaXRzIHRvIGJlIGFjdGl2YXRlZCAqLworCS8qIElmIHRoaXMgaXMgYSBwYXNzLXRocm91Z2ggcG9ydCB0aGUgcGFyZW50IG5lZWRzIHRvIGJlIHJlLWFjdGl2YXRlZCAqLwogCWlmIChwYXJlbnQpCiAJCXBzbW91c2VfYWN0aXZhdGUocGFyZW50KTsKIAorCXVwKCZwc21vdXNlX3NlbSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNzkxLDYgKzk1Niw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlkb3duKCZwc21vdXNlX3NlbSk7CisKIAlpZiAoc2VyaW8tPnBhcmVudCAmJiBzZXJpby0+aWQudHlwZSA9PSBTRVJJT19QU19QU1RIUlUpIHsKIAkJcGFyZW50ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8tPnBhcmVudCk7CiAJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOwpAQCAtODIzLDYgKzk5MCw3IEBACiAJaWYgKHBhcmVudCkKIAkJcHNtb3VzZV9hY3RpdmF0ZShwYXJlbnQpOwogCisJdXAoJnBzbW91c2Vfc2VtKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTg5MywyNiArMTA2MSwxMDkgQEAKIAogCWlmIChzZXJpby0+ZHJ2ICE9ICZwc21vdXNlX2RydikgewogCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5waW47CisJfQorCisJcmV0dmFsID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZwc21vdXNlX3NlbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5waW47CisKKwlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9JR05PUkUpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdXA7CiAJfQogCiAJaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7CiAJCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwogCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKIAl9CisKIAlwc21vdXNlX2RlYWN0aXZhdGUocHNtb3VzZSk7CiAKIAlyZXR2YWwgPSBoYW5kbGVyKHBzbW91c2UsIGJ1ZiwgY291bnQpOwogCi0JcHNtb3VzZV9hY3RpdmF0ZShwc21vdXNlKTsKKwlpZiAocmV0dmFsICE9IC1FTk9ERVYpCisJCXBzbW91c2VfYWN0aXZhdGUocHNtb3VzZSk7CisKIAlpZiAocGFyZW50KQogCQlwc21vdXNlX2FjdGl2YXRlKHBhcmVudCk7CiAKLW91dDoKKyBvdXRfdXA6CisJdXAoJnBzbW91c2Vfc2VtKTsKKyBvdXRfdW5waW46CiAJc2VyaW9fdW5waW5fZHJpdmVyKHNlcmlvKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUocHNtb3VzZS0+dHlwZSktPm5hbWUpOworfQorCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gcHNtb3VzZS0+cHMyZGV2LnNlcmlvOworCXN0cnVjdCBwc21vdXNlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBwc21vdXNlX3Byb3RvY29sICpwcm90bzsKKwlpbnQgcmV0cnkgPSAwOworCisJaWYgKCEocHJvdG8gPSBwc21vdXNlX3Byb3RvY29sX2J5X25hbWUoYnVmLCBjb3VudCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwc21vdXNlLT50eXBlID09IHByb3RvLT50eXBlKQorCQlyZXR1cm4gY291bnQ7CisKKwl3aGlsZSAoc2VyaW8tPmNoaWxkKSB7CisJCWlmICgrK3JldHJ5ID4gMykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZTogZmFpbGVkIHRvIGRlc3Ryb3kgY2hpbGQgcG9ydCwgcHJvdG9jb2wgY2hhbmdlIGFib3J0ZWQuXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJdXAoJnBzbW91c2Vfc2VtKTsKKwkJc2VyaW9fdW5waW5fZHJpdmVyKHNlcmlvKTsKKwkJc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHNlcmlvKTsKKwkJc2VyaW9fcGluX2RyaXZlcl91bmludGVycnVwdGlibGUoc2VyaW8pOworCQlkb3duKCZwc21vdXNlX3NlbSk7CisKKwkJaWYgKHNlcmlvLT5kcnYgIT0gJnBzbW91c2VfZHJ2KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJaWYgKHBzbW91c2UtPnR5cGUgPT0gcHJvdG8tPnR5cGUpCisJCQlyZXR1cm4gY291bnQ7IC8qIHN3aXRjaGVkIGJ5IG90aGVyIHRocmVhZCAqLworCX0KKworCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgeworCQlwYXJlbnQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpby0+cGFyZW50KTsKKwkJaWYgKHBhcmVudC0+cHRfZGVhY3RpdmF0ZSkKKwkJCXBhcmVudC0+cHRfZGVhY3RpdmF0ZShwYXJlbnQpOworCX0KKworCWlmIChwc21vdXNlLT5kaXNjb25uZWN0KQorCQlwc21vdXNlLT5kaXNjb25uZWN0KHBzbW91c2UpOworCisJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZwc21vdXNlLT5kZXYpOworCisJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JTklUSUFMSVpJTkcpOworCisJaWYgKHBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHBzbW91c2UsIHByb3RvKSA8IDApIHsKKwkJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKKwkJLyogZGVmYXVsdCB0byBQU01PVVNFX1BTMiAqLworCQlwc21vdXNlX3N3aXRjaF9wcm90b2NvbChwc21vdXNlLCAmcHNtb3VzZV9wcm90b2NvbHNbMF0pOworCX0KKworCXBzbW91c2VfaW5pdGlhbGl6ZShwc21vdXNlKTsKKwlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmcHNtb3VzZS0+ZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogJXMgb24gJXNcbiIsIHBzbW91c2UtPmRldm5hbWUsIHNlcmlvLT5waHlzKTsKKworCWlmIChwYXJlbnQgJiYgcGFyZW50LT5wdF9hY3RpdmF0ZSkKKwkJcGFyZW50LT5wdF9hY3RpdmF0ZShwYXJlbnQpOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19yYXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBzbW91c2UtPnJhdGUpOwpAQCAtOTY5LDM0ICsxMjIwLDI2IEBACiAKIHN0YXRpYyBpbnQgcHNtb3VzZV9zZXRfbWF4cHJvdG8oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHJvdG87CiAKIAlpZiAoIXZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXN0cm5jbXAodmFsLCAiYW55IiwgMykpIHsKLQkJKigodW5zaWduZWQgaW50ICopa3AtPmFyZykgPSAtMVU7Ci0JCXJldHVybiAwOwotCX0KKwlwcm90byA9IHBzbW91c2VfcHJvdG9jb2xfYnlfbmFtZSh2YWwsIHN0cmxlbih2YWwpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBzbW91c2VfcHJvdG9fYWJicmV2KTsgaSsrKSB7Ci0JCWlmICghcHNtb3VzZV9wcm90b19hYmJyZXZbaV0pCi0JCQljb250aW51ZTsKKwlpZiAoIXByb3RvIHx8ICFwcm90by0+bWF4cHJvdG8pCisJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICghc3RybmNtcCh2YWwsIHBzbW91c2VfcHJvdG9fYWJicmV2W2ldLCBzdHJsZW4ocHNtb3VzZV9wcm90b19hYmJyZXZbaV0pKSkgewotCQkJKigodW5zaWduZWQgaW50ICopa3AtPmFyZykgPSBpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CisJKigodW5zaWduZWQgaW50ICopa3AtPmFyZykgPSBwcm90by0+dHlwZTsKIAotCXJldHVybiAtRUlOVkFMOwkJCQkJXAorCXJldHVybiAwOwkJCQkJXAogfQogCiBzdGF0aWMgaW50IHBzbW91c2VfZ2V0X21heHByb3RvKGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXNcbiIsCi0JCQlwc21vdXNlX21heF9wcm90byA8IEFSUkFZX1NJWkUocHNtb3VzZV9wcm90b19hYmJyZXYpID8KLQkJCQlwc21vdXNlX3Byb3RvX2FiYnJldltwc21vdXNlX21heF9wcm90b10gOiAiYW55Iik7CisJaW50IHR5cGUgPSAqKCh1bnNpZ25lZCBpbnQgKilrcC0+YXJnKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUodHlwZSktPm5hbWUpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwc21vdXNlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggNzllMTdhMC4uODY2OTFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTc3LDYgKzc3LDggQEAKIAlQU01PVVNFX0lNRVgsCiAJUFNNT1VTRV9TWU5BUFRJQ1MsCiAJUFNNT1VTRV9BTFBTLAorCVBTTU9VU0VfTElGRUJPT0ssCisJUFNNT1VTRV9BVVRPCQkvKiBUaGlzIG9uZSBzaG91bGQgYWx3YXlzIGJlIGxhc3QgKi8KIH07CiAKIGludCBwc21vdXNlX3NsaWNlZF9jb21tYW5kKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQpOwpAQCAtOTksNyArMTAxLDcgQEAKIHsJCQkJCQkJCQkJXAogCXJldHVybiBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihkLCBiLCBzLCBwc21vdXNlX2F0dHJfc2V0XyMjX25hbWUpOwlcCiB9CQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwc21vdXNlX2F0dHJfIyNfbmFtZSA9IAkJCQlcCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPQkJCQlcCiAJX19BVFRSKF9uYW1lLCBTX0lXVVNSIHwgU19JUlVHTywJCQkJCVwKIAkJcHNtb3VzZV9kb19zaG93XyMjX25hbWUsIHBzbW91c2VfZG9fc2V0XyMjX25hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3JwY21vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3JwY21vdXNlLmMKaW5kZXggNzI4MGY2OC4uOGZlMTIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9ycGNtb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcnBjbW91c2UuYwpAQCAtNTksNyArNTksNyBAQAogCWIgPSAoc2hvcnQpIChfX3Jhd19yZWFkbCgweGUwMzEwMDAwKSBeIDB4NzApOwogCiAJZHggPSB4IC0gcnBjbW91c2VfbGFzdHg7Ci0JZHkgPSB5IC0gcnBjbW91c2VfbGFzdHk7IAorCWR5ID0geSAtIHJwY21vdXNlX2xhc3R5OwogCiAJcnBjbW91c2VfbGFzdHggPSB4OwogCXJwY21vdXNlX2xhc3R5ID0geTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKaW5kZXggYjJjYjEwMS4uZjAyNGJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogRHJpdmVyIGZvcglERUMgVlNYWFgtQUEgbW91c2UgKGhvY2tleS1wdWNrIG1vdXNlLCBiYWxsIG9yIHR3byByb2xsZXJzKQotICogCQlERUMgVlNYWFgtR0EgbW91c2UgKHJlY3Rhbmd1bGFyIG1vdXNlLCB3aXRoIGJhbGwpCi0gKiAJCURFQyBWU1hYWC1BQiB0YWJsZXQgKGRpZ2l0aXplciB3aXRoIGhhaXIgY3Jvc3Mgb3Igc3R5bHVzKQorICoJCURFQyBWU1hYWC1HQSBtb3VzZSAocmVjdGFuZ3VsYXIgbW91c2UsIHdpdGggYmFsbCkKKyAqCQlERUMgVlNYWFgtQUIgdGFibGV0IChkaWdpdGl6ZXIgd2l0aCBoYWlyIGNyb3NzIG9yIHN0eWx1cykKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBieSBKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IDA2Mjg0OGEuLmM2MTk0YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTIyMCw2ICsyMjAsNyBAQAogCXN0cnVjdCBtb3VzZWRldl9saXN0ICpsaXN0OwogCXN0cnVjdCBtb3VzZWRldl9tb3Rpb24gKnA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FrZV9yZWFkZXJzID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdCwgJm1vdXNlZGV2LT5saXN0LCBub2RlKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5wYWNrZXRfbG9jaywgZmxhZ3MpOwpAQCAtMjU1LDExICsyNTYsMTQgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5wYWNrZXRfbG9jaywgZmxhZ3MpOwogCi0JCWlmIChsaXN0LT5yZWFkeSkKKwkJaWYgKGxpc3QtPnJlYWR5KSB7CiAJCQlraWxsX2Zhc3luYygmbGlzdC0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCQl3YWtlX3JlYWRlcnMgPSAxOworCQl9CiAJfQogCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtb3VzZWRldi0+d2FpdCk7CisJaWYgKHdha2VfcmVhZGVycykKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtb3VzZWRldi0+d2FpdCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1vdXNlZGV2X3RvdWNocGFkX3RvdWNoKHN0cnVjdCBtb3VzZWRldiAqbW91c2VkZXYsIGludCB2YWx1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCmluZGV4IGM5Nzg2NTcuLmQ0Yzk5MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYwpAQCAtMjksNiArMjksNyBAQAogCiBFWFBPUlRfU1lNQk9MKHBzMl9pbml0KTsKIEVYUE9SVF9TWU1CT0wocHMyX3NlbmRieXRlKTsKK0VYUE9SVF9TWU1CT0wocHMyX2RyYWluKTsKIEVYUE9SVF9TWU1CT0wocHMyX2NvbW1hbmQpOwogRVhQT1JUX1NZTUJPTChwczJfc2NoZWR1bGVfY29tbWFuZCk7CiBFWFBPUlRfU1lNQk9MKHBzMl9oYW5kbGVfYWNrKTsKQEAgLTQ1LDExICs0NiwxMSBAQAogCiAKIC8qCi0gKiBwczJfc2VuZGJ5dGUoKSBzZW5kcyBhIGJ5dGUgdG8gdGhlIG1vdXNlLCBhbmQgd2FpdHMgZm9yIGFja25vd2xlZGdlLgotICogSXQgZG9lc24ndCBoYW5kbGUgcmV0cmFuc21pc3Npb24sIHRob3VnaCBpdCBjb3VsZCAtIGJlY2F1c2Ugd2hlbiB0aGVyZSB3b3VsZAotICogYmUgbmVlZCBmb3IgcmV0cmFuc21pc3Npb25zLCB0aGUgbW91c2UgaGFzIHRvIGJlIHJlcGxhY2VkIGFueXdheS4KKyAqIHBzMl9zZW5kYnl0ZSgpIHNlbmRzIGEgYnl0ZSB0byB0aGUgZGV2aWNlIGFuZCB3YWl0cyBmb3IgYWNrbm93bGVkZ2UuCisgKiBJdCBkb2Vzbid0IGhhbmRsZSByZXRyYW5zbWlzc2lvbiwgdGhvdWdoIGl0IGNvdWxkIC0gYmVjYXVzZSBpZiB0aGVyZQorICogaXMgYSBuZWVkIGZvciByZXRyYW5zbWlzc2lvbnMgZGV2aWNlIGhhcyB0byBiZSByZXBsYWNlZCBhbnl3YXkuCiAgKgotICogcHMyX3NlbmRieXRlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQKKyAqIHBzMl9zZW5kYnl0ZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0LgogICovCiAKIGludCBwczJfc2VuZGJ5dGUoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyIGJ5dGUsIGludCB0aW1lb3V0KQpAQCAtNzIsNiArNzMsOTEgQEAKIH0KIAogLyoKKyAqIHBzMl9kcmFpbigpIHdhaXRzIGZvciBkZXZpY2UgdG8gdHJhbnNtaXQgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcworICogYW5kIGRpc2NhcmRzIHRoZW0uCisgKi8KKwordm9pZCBwczJfZHJhaW4oc3RydWN0IHBzMmRldiAqcHMyZGV2LCBpbnQgbWF4Ynl0ZXMsIGludCB0aW1lb3V0KQoreworCWlmIChtYXhieXRlcyA+IHNpemVvZihwczJkZXYtPmNtZGJ1ZikpIHsKKwkJV0FSTl9PTigxKTsKKwkJbWF4Ynl0ZXMgPSBzaXplb2YocHMyZGV2LT5jbWRidWYpOworCX0KKworCWRvd24oJnBzMmRldi0+Y21kX3NlbSk7CisKKwlzZXJpb19wYXVzZV9yeChwczJkZXYtPnNlcmlvKTsKKwlwczJkZXYtPmZsYWdzID0gUFMyX0ZMQUdfQ01EOworCXBzMmRldi0+Y21kY250ID0gbWF4Ynl0ZXM7CisJc2VyaW9fY29udGludWVfcngocHMyZGV2LT5zZXJpbyk7CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQocHMyZGV2LT53YWl0LAorCQkJICAgIShwczJkZXYtPmZsYWdzICYgUFMyX0ZMQUdfQ01EKSwKKwkJCSAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOworCXVwKCZwczJkZXYtPmNtZF9zZW0pOworfQorCisvKgorICogcHMyX2lzX2tleWJvYXJkX2lkKCkgY2hlY2tzIHJlY2VpdmVkIElEIGJ5dGUgYWdhaW5zdCB0aGUgbGlzdCBvZgorICoga25vd24ga2V5Ym9hcmQgSURzLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBzMl9pc19rZXlib2FyZF9pZChjaGFyIGlkX2J5dGUpCit7CisJc3RhdGljIGNoYXIga2V5Ym9hcmRfaWRzW10gPSB7CisJCTB4YWIsCS8qIFJlZ3VsYXIga2V5Ym9hcmRzCQkqLworCQkweGFjLAkvKiBOQ0QgU3VuIGtleWJvYXJkCQkqLworCQkweDJiLAkvKiBUcnVzdCBrZXlib2FyZCwgdHJhbnNsYXRlZAkqLworCQkweDVkLAkvKiBUcnVzdCBrZXlib2FyZAkJKi8KKwkJMHg2MCwJLyogTk1CIFNHSSBrZXlib2FyZCwgdHJhbnNsYXRlZCAqLworCQkweDQ3LAkvKiBOTUIgU0dJIGtleWJvYXJkCQkqLworCX07CisKKwlyZXR1cm4gbWVtY2hyKGtleWJvYXJkX2lkcywgaWRfYnl0ZSwgc2l6ZW9mKGtleWJvYXJkX2lkcykpICE9IE5VTEw7Cit9CisKKy8qCisgKiBwczJfYWRqdXN0X3RpbWVvdXQoKSBpcyBjYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIDFzdCBieXRlIG9mIGNvbW1hbmQKKyAqIHJlc3BvbnNlIGFuZCB0cmllcyB0byByZWR1Y2UgcmVtYWluaW5nIHRpbWVvdXQgdG8gc3BlZWQgdXAgY29tbWFuZAorICogY29tcGxldGlvbi4KKyAqLworCitzdGF0aWMgaW50IHBzMl9hZGp1c3RfdGltZW91dChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIGludCBjb21tYW5kLCBpbnQgdGltZW91dCkKK3sKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwkJY2FzZSBQUzJfQ01EX1JFU0VUX0JBVDoKKwkJCS8qCisJCQkgKiBEZXZpY2UgaGFzIHNlbnQgdGhlIGZpcnN0IHJlc3BvbnNlIGJ5dGUgYWZ0ZXIKKwkJCSAqIHJlc2V0IGNvbW1hbmQsIHJlc2V0IGlzIHRodXMgZG9uZSwgc28gd2UgY2FuCisJCQkgKiBzaG9ydGVuIHRoZSB0aW1lb3V0LgorCQkJICogVGhlIG5leHQgYnl0ZSB3aWxsIGNvbWUgc29vbiAoa2V5Ym9hcmQpIG9yIG5vdAorCQkJICogYXQgYWxsIChtb3VzZSkuCisJCQkgKi8KKwkJCWlmICh0aW1lb3V0ID4gbXNlY3NfdG9famlmZmllcygxMDApKQorCQkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJCQlicmVhazsKKworCQljYXNlIFBTMl9DTURfR0VUSUQ6CisJCQkvKgorCQkJICogSWYgZGV2aWNlIGJlaGluZCB0aGUgcG9ydCBpcyBub3QgYSBrZXlib2FyZCB0aGVyZQorCQkJICogd29uJ3QgYmUgMm5kIGJ5dGUgb2YgSUQgcmVzcG9uc2UuCisJCQkgKi8KKwkJCWlmICghcHMyX2lzX2tleWJvYXJkX2lkKHBzMmRldi0+Y21kYnVmWzFdKSkgeworCQkJCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOworCQkJCXBzMmRldi0+ZmxhZ3MgPSBwczJkZXYtPmNtZGNudCA9IDA7CisJCQkJc2VyaW9fY29udGludWVfcngocHMyZGV2LT5zZXJpbyk7CisJCQkJdGltZW91dCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKKy8qCiAgKiBwczJfY29tbWFuZCgpIHNlbmRzIGEgY29tbWFuZCBhbmQgaXRzIHBhcmFtZXRlcnMgdG8gdGhlIG1vdXNlLAogICogdGhlbiB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlIGFuZCBwdXRzIGl0IGluIHRoZSBwYXJhbSBhcnJheS4KICAqCkBAIC04Niw2ICsxNzIsMTEgQEAKIAlpbnQgcmMgPSAtMTsKIAlpbnQgaTsKIAorCWlmIChyZWNlaXZlID4gc2l6ZW9mKHBzMmRldi0+Y21kYnVmKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLTE7CisJfQorCiAJZG93bigmcHMyZGV2LT5jbWRfc2VtKTsKIAogCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOwpAQCAtMTAxLDEwICsxOTIsOSBAQAogCSAqIEFDS2luZyB0aGUgcmVzZXQgY29tbWFuZCwgYW5kIHNvIGl0IGNhbiB0YWtlIGEgbG9uZwogCSAqIHRpbWUgYmVmb3JlIHRoZSBBQ0sgYXJycml2ZXMuCiAJICovCi0JaWYgKGNvbW1hbmQgJiAweGZmKQotCQlpZiAocHMyX3NlbmRieXRlKHBzMmRldiwgY29tbWFuZCAmIDB4ZmYsCi0JCQljb21tYW5kID09IFBTMl9DTURfUkVTRVRfQkFUID8gMTAwMCA6IDIwMCkpCi0JCQlnb3RvIG91dDsKKwlpZiAocHMyX3NlbmRieXRlKHBzMmRldiwgY29tbWFuZCAmIDB4ZmYsCisJCQkgY29tbWFuZCA9PSBQUzJfQ01EX1JFU0VUX0JBVCA/IDEwMDAgOiAyMDApKQorCQlnb3RvIG91dDsKIAogCWZvciAoaSA9IDA7IGkgPCBzZW5kOyBpKyspCiAJCWlmIChwczJfc2VuZGJ5dGUocHMyZGV2LCBwYXJhbVtpXSwgMjAwKSkKQEAgLTEyMCwzMyArMjEwLDcgQEAKIAogCWlmIChwczJkZXYtPmNtZGNudCAmJiB0aW1lb3V0ID4gMCkgewogCi0JCWlmIChjb21tYW5kID09IFBTMl9DTURfUkVTRVRfQkFUICYmIHRpbWVvdXQgPiBtc2Vjc190b19qaWZmaWVzKDEwMCkpIHsKLQkJCS8qCi0JCQkgKiBEZXZpY2UgaGFzIHNlbnQgdGhlIGZpcnN0IHJlc3BvbnNlIGJ5dGUKLQkJCSAqIGFmdGVyIGEgcmVzZXQgY29tbWFuZCwgcmVzZXQgaXMgdGh1cyBkb25lLAotCQkJICogc2hvcnRlbiB0aGUgdGltZW91dC4gVGhlIG5leHQgYnl0ZSB3aWxsIGNvbWUKLQkJCSAqIHNvb24gKGtleWJvYXJkKSBvciBub3QgYXQgYWxsIChtb3VzZSkuCi0JCQkgKi8KLQkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0JCX0KLQotCQlpZiAoY29tbWFuZCA9PSBQUzJfQ01EX0dFVElEICYmCi0JCSAgICBwczJkZXYtPmNtZGJ1ZltyZWNlaXZlIC0gMV0gIT0gMHhhYiAmJiAvKiBSZWd1bGFyIGtleWJvYXJkcyAqLwotCQkgICAgcHMyZGV2LT5jbWRidWZbcmVjZWl2ZSAtIDFdICE9IDB4YWMgJiYgLyogTkNEIFN1biBrZXlib2FyZCAqLwotCQkgICAgcHMyZGV2LT5jbWRidWZbcmVjZWl2ZSAtIDFdICE9IDB4MmIgJiYgLyogVHJ1c3Qga2V5Ym9hcmQsIHRyYW5zbGF0ZWQgKi8KLQkJICAgIHBzMmRldi0+Y21kYnVmW3JlY2VpdmUgLSAxXSAhPSAweDVkICYmIC8qIFRydXN0IGtleWJvYXJkICovCi0JCSAgICBwczJkZXYtPmNtZGJ1ZltyZWNlaXZlIC0gMV0gIT0gMHg2MCAmJiAvKiBOTUIgU0dJIGtleWJvYXJkLCB0cmFuc2xhdGVkICovCi0JCSAgICBwczJkZXYtPmNtZGJ1ZltyZWNlaXZlIC0gMV0gIT0gMHg0NykgeyAvKiBOTUIgU0dJIGtleWJvYXJkICovCi0JCQkvKgotCQkJICogRGV2aWNlIGJlaGluZCB0aGUgcG9ydCBpcyBub3QgYSBrZXlib2FyZAotCQkJICogc28gd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUgMm5kIGJ5dGUKLQkJCSAqIG9mIElEIHJlc3BvbnNlLgotCQkJICovCi0JCQlzZXJpb19wYXVzZV9yeChwczJkZXYtPnNlcmlvKTsKLQkJCXBzMmRldi0+ZmxhZ3MgPSBwczJkZXYtPmNtZGNudCA9IDA7Ci0JCQlzZXJpb19jb250aW51ZV9yeChwczJkZXYtPnNlcmlvKTsKLQkJfQotCisJCXRpbWVvdXQgPSBwczJfYWRqdXN0X3RpbWVvdXQocHMyZGV2LCBjb21tYW5kLCB0aW1lb3V0KTsKIAkJd2FpdF9ldmVudF90aW1lb3V0KHBzMmRldi0+d2FpdCwKIAkJCQkgICAhKHBzMmRldi0+ZmxhZ3MgJiBQUzJfRkxBR19DTUQpLCB0aW1lb3V0KTsKIAl9CkBAIC0xNjAsNyArMjI0LDcgQEAKIAogCXJjID0gMDsKIAotb3V0OgorIG91dDoKIAlzZXJpb19wYXVzZV9yeChwczJkZXYtPnNlcmlvKTsKIAlwczJkZXYtPmZsYWdzID0gMDsKIAlzZXJpb19jb250aW51ZV9yeChwczJkZXYtPnNlcmlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCAzNDE4MjRjLi5mMzY3Njk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC0zMSwxMCArMzEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiBNT0RVTEVfQVVUSE9SKCJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNlcmlvIGFic3RyYWN0aW9uIGNvcmUiKTsKQEAgLTQzLDYgKzQyLDcgQEAKIEVYUE9SVF9TWU1CT0woc2VyaW9faW50ZXJydXB0KTsKIEVYUE9SVF9TWU1CT0woX19zZXJpb19yZWdpc3Rlcl9wb3J0KTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9wb3J0KTsKK0VYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KTsKIEVYUE9SVF9TWU1CT0woX19zZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZCk7CiBFWFBPUlRfU1lNQk9MKF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIpOwpAQCAtNjgsNiArNjgsMzcgQEAKIHN0YXRpYyB2b2lkIHNlcmlvX3JlY29ubmVjdF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogc3RhdGljIHZvaWQgc2VyaW9fZGlzY29ubmVjdF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogCitzdGF0aWMgaW50IHNlcmlvX2Nvbm5lY3RfZHJpdmVyKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKK3sKKwlpbnQgcmV0dmFsOworCisJZG93bigmc2VyaW8tPmRydl9zZW0pOworCXJldHZhbCA9IGRydi0+Y29ubmVjdChzZXJpbywgZHJ2KTsKKwl1cCgmc2VyaW8tPmRydl9zZW0pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzZXJpb19yZWNvbm5lY3RfZHJpdmVyKHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJaW50IHJldHZhbCA9IC0xOworCisJZG93bigmc2VyaW8tPmRydl9zZW0pOworCWlmIChzZXJpby0+ZHJ2ICYmIHNlcmlvLT5kcnYtPnJlY29ubmVjdCkKKwkJcmV0dmFsID0gc2VyaW8tPmRydi0+cmVjb25uZWN0KHNlcmlvKTsKKwl1cCgmc2VyaW8tPmRydl9zZW0pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgc2VyaW9fZGlzY29ubmVjdF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbykKK3sKKwlkb3duKCZzZXJpby0+ZHJ2X3NlbSk7CisJaWYgKHNlcmlvLT5kcnYpCisJCXNlcmlvLT5kcnYtPmRpc2Nvbm5lY3Qoc2VyaW8pOworCXVwKCZzZXJpby0+ZHJ2X3NlbSk7Cit9CisKIHN0YXRpYyBpbnQgc2VyaW9fbWF0Y2hfcG9ydChjb25zdCBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkICppZHMsIHN0cnVjdCBzZXJpbyAqc2VyaW8pCiB7CiAJd2hpbGUgKGlkcy0+dHlwZSB8fCBpZHMtPnByb3RvKSB7CkBAIC05MSw3ICsxMjIsNyBAQAogCiAJaWYgKHNlcmlvX21hdGNoX3BvcnQoZHJ2LT5pZF90YWJsZSwgc2VyaW8pKSB7CiAJCXNlcmlvLT5kZXYuZHJpdmVyID0gJmRydi0+ZHJpdmVyOwotCQlpZiAoZHJ2LT5jb25uZWN0KHNlcmlvLCBkcnYpKSB7CisJCWlmIChzZXJpb19jb25uZWN0X2RyaXZlcihzZXJpbywgZHJ2KSkgewogCQkJc2VyaW8tPmRldi5kcml2ZXIgPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTEzOCw4ICsxNjksNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhzZXJpb19ldmVudF9sb2NrKTsJLyogcHJvdGVjdHMgc2VyaW9fZXZlbnRfbGlzdCAqLwogc3RhdGljIExJU1RfSEVBRChzZXJpb19ldmVudF9saXN0KTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzZXJpb193YWl0KTsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oc2VyaW9fZXhpdGVkKTsKLXN0YXRpYyBpbnQgc2VyaW9fcGlkOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2VyaW9fdGFzazsKIAogc3RhdGljIHZvaWQgc2VyaW9fcXVldWVfZXZlbnQodm9pZCAqb2JqZWN0LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKIAkJCSAgICAgIGVudW0gc2VyaW9fZXZlbnRfdHlwZSBldmVudF90eXBlKQpAQCAtMTUwLDEyICsxODAsMTIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2VyaW9fZXZlbnRfbG9jaywgZmxhZ3MpOwogCiAJLyoKLSAJICogU2NhbiBldmVudCBsaXN0IGZvciB0aGUgb3RoZXIgZXZlbnRzIGZvciB0aGUgc2FtZSBzZXJpbyBwb3J0LAorCSAqIFNjYW4gZXZlbnQgbGlzdCBmb3IgdGhlIG90aGVyIGV2ZW50cyBmb3IgdGhlIHNhbWUgc2VyaW8gcG9ydCwKIAkgKiBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBvbmUuIElmIGV2ZW50IGlzIHRoZSBzYW1lIHdlCiAJICogZG8gbm90IG5lZWQgYWRkIG5ldyBvbmUuIElmIGV2ZW50IGlzIG9mIGRpZmZlcmVudCB0eXBlIHdlCiAJICogbmVlZCB0byBhZGQgdGhpcyBldmVudCBhbmQgc2hvdWxkIG5vdCBsb29rIGZ1cnRoZXIgYmVjYXVzZQogCSAqIHdlIG5lZWQgdG8gcHJlc2V2ZSBzZXF1ZW5jZSBvZiBkaXN0aW5jdCBldmVudHMuCi0gCSAqLworCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShldmVudCwgJnNlcmlvX2V2ZW50X2xpc3QsIG5vZGUpIHsKIAkJaWYgKGV2ZW50LT5vYmplY3QgPT0gb2JqZWN0KSB7CiAJCQlpZiAoZXZlbnQtPnR5cGUgPT0gZXZlbnRfdHlwZSkKQEAgLTMzNywyMCArMzY3LDE1IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fdGhyZWFkKHZvaWQgKm5vdGhpbmcpCiB7Ci0JbG9ja19rZXJuZWwoKTsKLQlkYWVtb25pemUoImtzZXJpb2QiKTsKLQlhbGxvd19zaWduYWwoU0lHVEVSTSk7Ci0KIAlkbyB7CiAJCXNlcmlvX2hhbmRsZV9ldmVudHMoKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlcmlvX3dhaXQsICFsaXN0X2VtcHR5KCZzZXJpb19ldmVudF9saXN0KSk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJpb193YWl0LAorCQkJa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8ICFsaXN0X2VtcHR5KCZzZXJpb19ldmVudF9saXN0KSk7CiAJCXRyeV90b19mcmVlemUoKTsKLQl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgInNlcmlvOiBrc2VyaW9kIGV4aXRpbmdcbiIpOwotCi0JdW5sb2NrX2tlcm5lbCgpOwotCWNvbXBsZXRlX2FuZF9leGl0KCZzZXJpb19leGl0ZWQsIDApOworCXJldHVybiAwOwogfQogCiAKQEAgLTU1Nyw3ICs1ODIsNyBAQAogc3RhdGljIHZvaWQgc2VyaW9fcmVjb25uZWN0X3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKIAlkbyB7Ci0JCWlmICghc2VyaW8tPmRydiB8fCAhc2VyaW8tPmRydi0+cmVjb25uZWN0IHx8IHNlcmlvLT5kcnYtPnJlY29ubmVjdChzZXJpbykpIHsKKwkJaWYgKHNlcmlvX3JlY29ubmVjdF9kcml2ZXIoc2VyaW8pKSB7CiAJCQlzZXJpb19kaXNjb25uZWN0X3BvcnQoc2VyaW8pOwogCQkJc2VyaW9fZmluZF9kcml2ZXIoc2VyaW8pOwogCQkJLyogT2ssIG9sZCBjaGlsZHJlbiBhcmUgbm93IGdvbmUsIHdlIGFyZSBkb25lICovCkBAIC02MzAsNiArNjU1LDE5IEBACiB9CiAKIC8qCisgKiBTYWZlbHkgdW5yZWdpc3RlcnMgY2hpbGQgcG9ydCBpZiBvbmUgaXMgcHJlc2VudC4KKyAqLwordm9pZCBzZXJpb191bnJlZ2lzdGVyX2NoaWxkX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbykKK3sKKwlkb3duKCZzZXJpb19zZW0pOworCWlmIChzZXJpby0+Y2hpbGQpIHsKKwkJc2VyaW9fZGlzY29ubmVjdF9wb3J0KHNlcmlvLT5jaGlsZCk7CisJCXNlcmlvX2Rlc3Ryb3lfcG9ydChzZXJpby0+Y2hpbGQpOworCX0KKwl1cCgmc2VyaW9fc2VtKTsKK30KKworLyoKICAqIFN1Ym1pdHMgcmVnaXN0ZXIgcmVxdWVzdCB0byBrc2VyaW9kIGZvciBzdWJzZXF1ZW50IGV4ZWN1dGlvbi4KICAqIENhbiBiZSB1c2VkIHdoZW4gaXQgaXMgbm90IG9idmlvdXMgd2hldGhlciB0aGUgc2VyaW9fc2VtIGlzCiAgKiB0YWtlbiBvciBub3QgYW5kIHdoZW4gZGVsYXllZCBleGVjdXRpb24gaXMgZmVhc2libGUuCkBAIC02ODYsMTUgKzcyNCwxNCBAQAogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSB0b19zZXJpb19wb3J0KGRldik7CiAJc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2ID0gdG9fc2VyaW9fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAotCXJldHVybiBkcnYtPmNvbm5lY3Qoc2VyaW8sIGRydik7CisJcmV0dXJuIHNlcmlvX2Nvbm5lY3RfZHJpdmVyKHNlcmlvLCBkcnYpOwogfQogCiBzdGF0aWMgaW50IHNlcmlvX2RyaXZlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSB0b19zZXJpb19wb3J0KGRldik7Ci0Jc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2ID0gdG9fc2VyaW9fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAotCWRydi0+ZGlzY29ubmVjdChzZXJpbyk7CisJc2VyaW9fZGlzY29ubmVjdF9kcml2ZXIoc2VyaW8pOwogCXJldHVybiAwOwogfQogCkBAIC03MzAsMTEgKzc2Nyw5IEBACiAKIHN0YXRpYyB2b2lkIHNlcmlvX3NldF9kcnYoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQogewotCWRvd24oJnNlcmlvLT5kcnZfc2VtKTsKIAlzZXJpb19wYXVzZV9yeChzZXJpbyk7CiAJc2VyaW8tPmRydiA9IGRydjsKIAlzZXJpb19jb250aW51ZV9yeChzZXJpbyk7Ci0JdXAoJnNlcmlvLT5kcnZfc2VtKTsKIH0KIAogc3RhdGljIGludCBzZXJpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQpAQCAtNzk0LDcgKzgyOSw3IEBACiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHRvX3NlcmlvX3BvcnQoZGV2KTsKIAotCWlmICghc2VyaW8tPmRydiB8fCAhc2VyaW8tPmRydi0+cmVjb25uZWN0IHx8IHNlcmlvLT5kcnYtPnJlY29ubmVjdChzZXJpbykpIHsKKwlpZiAoc2VyaW9fcmVjb25uZWN0X2RyaXZlcihzZXJpbykpIHsKIAkJLyoKIAkJICogRHJpdmVyIHJlLXByb2JpbmcgY2FuIHRha2UgYSB3aGlsZSwgc28gYmV0dGVyIGxldCBrc2VyaW9kCiAJCSAqIGRlYWwgd2l0aCBpdC4KQEAgLTg0OCw5ICs4ODMsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2VyaW9faW5pdCh2b2lkKQogewotCWlmICghKHNlcmlvX3BpZCA9IGtlcm5lbF90aHJlYWQoc2VyaW9fdGhyZWFkLCBOVUxMLCBDTE9ORV9LRVJORUwpKSkgeworCXNlcmlvX3Rhc2sgPSBrdGhyZWFkX3J1bihzZXJpb190aHJlYWQsIE5VTEwsICJrc2VyaW9kIik7CisJaWYgKElTX0VSUihzZXJpb190YXNrKSkgewogCQlwcmludGsoS0VSTl9FUlIgInNlcmlvOiBGYWlsZWQgdG8gc3RhcnQga3NlcmlvZFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIFBUUl9FUlIoc2VyaW9fdGFzayk7CiAJfQogCiAJc2VyaW9fYnVzLmRldl9hdHRycyA9IHNlcmlvX2RldmljZV9hdHRyczsKQEAgLTg2Niw4ICs5MDIsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNlcmlvX2V4aXQodm9pZCkKIHsKIAlidXNfdW5yZWdpc3Rlcigmc2VyaW9fYnVzKTsKLQlraWxsX3Byb2Moc2VyaW9fcGlkLCBTSUdURVJNLCAxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzZXJpb19leGl0ZWQpOworCWt0aHJlYWRfc3RvcChzZXJpb190YXNrKTsKIH0KIAogbW9kdWxlX2luaXQoc2VyaW9faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Vsby5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbG8uYwppbmRleCA1NDZjZTU5Li4zY2RjOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Vsby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxvLmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoJmVsby0+ZGV2LCBBQlNfWSwgOTYsIDQwMDAsIDAsIDApOwogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoJmVsby0+ZGV2LCBBQlNfUFJFU1NVUkUsIDAsIDI1NSwgMCwgMCk7CiAJCQlicmVhazsKLQkJCisKIAkJY2FzZSAxOiAvKiA2LWJ5dGUgcHJvdG9jb2wgKi8KIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKCZlbG8tPmRldiwgQUJTX1BSRVNTVVJFLCAwLCAxNSwgMCwgMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYwppbmRleCBhY2I5MTM3Li5iY2ZhMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCkBAIC04OSw5ICs4OSw5IEBACiAjZGVmaW5lIEgzNjAwX1NDQU5DT0RFX1EJNAkgLyogNCAtPiBRIGJ1dHRvbiAqLwogI2RlZmluZQlIMzYwMF9TQ0FOQ09ERV9TVEFSVAk1CSAvKiA1IC0+IHN0YXJ0IG1lbnUgKi8KICNkZWZpbmUJSDM2MDBfU0NBTkNPREVfVVAJNgkgLyogNiAtPiB1cCAqLwotI2RlZmluZSBIMzYwMF9TQ0FOQ09ERV9SSUdIVAk3IAkgLyogNyAtPiByaWdodCAqLwotI2RlZmluZSBIMzYwMF9TQ0FOQ09ERV9MRUZUIAk4CSAvKiA4IC0+IGxlZnQgKi8KLSNkZWZpbmUgSDM2MDBfU0NBTkNPREVfRE9XTiAJOQkgLyogOSAtPiBkb3duICovCisjZGVmaW5lIEgzNjAwX1NDQU5DT0RFX1JJR0hUCTcJIC8qIDcgLT4gcmlnaHQgKi8KKyNkZWZpbmUgSDM2MDBfU0NBTkNPREVfTEVGVAk4CSAvKiA4IC0+IGxlZnQgKi8KKyNkZWZpbmUgSDM2MDBfU0NBTkNPREVfRE9XTgk5CSAvKiA5IC0+IGRvd24gKi8KIAogc3RhdGljIGNoYXIgKmgzNjAwX25hbWUgPSAiSDM2MDAgVG91Y2hTY3JlZW4iOwogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFjdGlvbl9idXR0b25faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotICAgICAgICBpbnQgZG93biA9IChHUExSICYgR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OKSA/IDAgOiAxOworCWludCBkb3duID0gKEdQTFIgJiBHUElPX0JJVFNZX0FDVElPTl9CVVRUT04pID8gMCA6IDE7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gKHN0cnVjdCBpbnB1dF9kZXYgKikgZGV2X2lkOwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBucG93ZXJfYnV0dG9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSAgICAgICAgaW50IGRvd24gPSAoR1BMUiAmIEdQSU9fQklUU1lfTlBPV0VSX0JVVFRPTikgPyAwIDogMTsKKwlpbnQgZG93biA9IChHUExSICYgR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OKSA/IDAgOiAxOwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IChzdHJ1Y3QgaW5wdXRfZGV2ICopIGRldl9pZDsKIAogCS8qCkBAIC0xNDUsOCArMTQ1LDggQEAKIHN0YXRpYyBpbnQgZmxpdGVfYnJpZ2h0bmVzcyA9IDI1OwogCiBlbnVtIGZsaXRlX3B3ciB7Ci0gICAgICAgIEZMSVRFX1BXUl9PRkYgPSAwLAotICAgICAgICBGTElURV9QV1JfT04gPSAxCisJRkxJVEVfUFdSX09GRiA9IDAsCisJRkxJVEVfUFdSX09OID0gMQogfTsKIAogLyoKQEAgLTE1Nyw5ICsxNTcsOSBAQAogCXN0cnVjdCBoMzYwMF9kZXYgKnRzID0gZGV2LT5wcml2YXRlOwogCiAJLyogTXVzdCBiZSBpbiB0aGlzIG9yZGVyICovCi0gICAgICAgCXRzLT5zZXJpby0+d3JpdGUodHMtPnNlcmlvLCAxKTsKKwl0cy0+c2VyaW8tPndyaXRlKHRzLT5zZXJpbywgMSk7CiAJdHMtPnNlcmlvLT53cml0ZSh0cy0+c2VyaW8sIHB3cik7Ci0gICAgICAJdHMtPnNlcmlvLT53cml0ZSh0cy0+c2VyaW8sIGJyaWdodG5lc3MpOworCXRzLT5zZXJpby0+d3JpdGUodHMtPnNlcmlvLCBicmlnaHRuZXNzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY5LDI2ICsxNjksMjYgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAoc3RydWN0IGlucHV0X2RldiAqKSBkYXRhOwogCi0gICAgICAgIHN3aXRjaCAocmVxKSB7Ci0gICAgICAgIGNhc2UgUE1fU1VTUEVORDogLyogZW50ZXIgRDEtRDMgKi8KLSAgICAgICAgICAgICAgICBzdXNwZW5kZWQgPSAxOwotICAgICAgICAgICAgICAgIGgzNjAwX2ZsaXRlX3Bvd2VyKGRldiwgRkxJVEVfUFdSX09GRik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUE1fQkxBTks6Ci0gICAgICAgICAgICAgICAgaWYgKCFzdXNwZW5kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBoMzYwMF9mbGl0ZV9wb3dlcihkZXYsIEZMSVRFX1BXUl9PRkYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBNX1JFU1VNRTogIC8qIGVudGVyIEQwICovCi0gICAgICAgICAgICAgICAgLyogc2FtZSBhcyB1bmJsYW5rICovCi0gICAgICAgIGNhc2UgUE1fVU5CTEFOSzoKLSAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2luaXRTZXJpYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGgzNjAwX2ZsaXRlX3Bvd2VyKGRldiwgRkxJVEVfUFdSX09OKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKwlzd2l0Y2ggKHJlcSkgeworCWNhc2UgUE1fU1VTUEVORDogLyogZW50ZXIgRDEtRDMgKi8KKwkJc3VzcGVuZGVkID0gMTsKKwkJaDM2MDBfZmxpdGVfcG93ZXIoZGV2LCBGTElURV9QV1JfT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBQTV9CTEFOSzoKKwkJaWYgKCFzdXNwZW5kZWQpCisJCQloMzYwMF9mbGl0ZV9wb3dlcihkZXYsIEZMSVRFX1BXUl9PRkYpOworCQlicmVhazsKKwljYXNlIFBNX1JFU1VNRTogIC8qIGVudGVyIEQwICovCisJCS8qIHNhbWUgYXMgdW5ibGFuayAqLworCWNhc2UgUE1fVU5CTEFOSzoKKwkJaWYgKHN1c3BlbmRlZCkgeworCQkJLy9pbml0U2VyaWFsKCk7CisJCQlzdXNwZW5kZWQgPSAwOworCQl9CisJCWgzNjAwX2ZsaXRlX3Bvd2VyKGRldiwgRkxJVEVfUFdSX09OKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQogI2VuZGlmCiAKQEAgLTE5OSwyNSArMTk5LDI1IEBACiAgKi8KIHN0YXRpYyB2b2lkIGgzNjAwdHNfcHJvY2Vzc19wYWNrZXQoc3RydWN0IGgzNjAwX2RldiAqdHMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotICAgICAgICBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmdHMtPmRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmdHMtPmRldjsKIAlzdGF0aWMgaW50IHRvdWNoZWQgPSAwOwogCWludCBrZXksIGRvd24gPSAwOwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCi0gICAgICAgIHN3aXRjaCAodHMtPmV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICBCdXR0b25zIC0gcmV0dXJuZWQgYXMgYSBzaW5nbGUgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgNyA2IDUgNCAzIDIgMSAwCi0gICAgICAgICAgICAgICAgICAgICAgICBTIHggeCB4IE4gTiBOIE4KKwlzd2l0Y2ggKHRzLT5ldmVudCkgeworCQkvKgorCQkgICBCdXR0b25zIC0gcmV0dXJuZWQgYXMgYSBzaW5nbGUgYnl0ZQorCQkJNyA2IDUgNCAzIDIgMSAwCisJCQlTIHggeCB4IE4gTiBOIE4KIAotICAgICAgICAgICAgICAgICAgIFMgICAgICAgc3dpdGNoIHN0YXRlICggMD1wcmVzc2VkIDE9cmVsZWFzZWQpCi0gICAgICAgICAgICAgICAgICAgeCAgICAgICBVbnVzZWQuCi0gICAgICAgICAgICAgICAgICAgTk5OTiAgICBzd2l0Y2ggbnVtYmVyIDAtMTUKKwkJICAgUyAgICAgICBzd2l0Y2ggc3RhdGUgKCAwPXByZXNzZWQgMT1yZWxlYXNlZCkKKwkJICAgeCAgICAgICBVbnVzZWQuCisJCSAgIE5OTk4gICAgc3dpdGNoIG51bWJlciAwLTE1CiAKLSAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIGlzIHRydWUgZm9yIG5vbiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGtleSBldmVudHMuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjYXNlIEtFWUJEX0lEOgorCQkgICBOb3RlOiBUaGlzIGlzIHRydWUgZm9yIG5vbiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGtleSBldmVudHMuCisJCSovCisJCWNhc2UgS0VZQkRfSUQ6CiAJCQlkb3duID0gKHRzLT5idWZbMF0gJiAweDgwKSA/IDAgOiAxOwogCiAJCQlzd2l0Y2ggKHRzLT5idWZbMF0gJiAweDdmKSB7CkBAIC0yMjksNDAgKzIyOSw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfQ09OVEFDVFM6CiAJCQkJCWtleSA9IEtFWV9QUk9HMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBIMzYwMF9TQ0FOQ09ERV9ROgogCQkJCQlrZXkgPSBLRVlfUTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBIMzYwMF9TQ0FOQ09ERV9TVEFSVDoKIAkJCQkJa2V5ID0gS0VZX1BST0czOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCQlicmVhazsKIAkJCQljYXNlIEgzNjAwX1NDQU5DT0RFX1VQOgogCQkJCQlrZXkgPSBLRVlfVVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfUklHSFQ6CiAJCQkJCWtleSA9IEtFWV9SSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBIMzYwMF9TQ0FOQ09ERV9MRUZUOgogCQkJCQlrZXkgPSBLRVlfTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBIMzYwMF9TQ0FOQ09ERV9ET1dOOgogCQkJCQlrZXkgPSBLRVlfRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJa2V5ID0gMDsKIAkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleSwgZG93bik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE5hdGl2ZSB0b3VjaHNjcmVlbiBldmVudCBkYXRhIGlzIGZvcm1hdHRlZCBhcyBzaG93biBiZWxvdzotCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiAgICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICAgICAgICAgICAqICAgICAgfCBYbXNiICB8IFhsc2IgIHwgWW1zYiAgfCBZbHNiICB8Ci0gICAgICAgICAgICAgICAgICogICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgKiAgICAgICBieXRlIDAgICAgMSAgICAgICAyICAgICAgIDMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjYXNlIFRPVUNIU19JRDoKKwkJCWlmIChrZXkpCisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleSwgZG93bik7CisJCQlicmVhazsKKwkJLyoKKwkJICogTmF0aXZlIHRvdWNoc2NyZWVuIGV2ZW50IGRhdGEgaXMgZm9ybWF0dGVkIGFzIHNob3duIGJlbG93Oi0KKwkJICoKKwkJICogICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkJICogICAgICB8IFhtc2IgIHwgWGxzYiAgfCBZbXNiICB8IFlsc2IgIHwKKwkJICogICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkJICogICAgICAgYnl0ZSAwICAgIDEgICAgICAgMiAgICAgICAzCisJCSAqLworCQljYXNlIFRPVUNIU19JRDoKIAkJCWlmICghdG91Y2hlZCkgewogCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIDEpOwogCQkJCXRvdWNoZWQgPSAxOwpAQCAtMjcyLDE5ICsyNzIsMTkgQEAKIAkJCQl1bnNpZ25lZCBzaG9ydCB4LCB5OwogCiAJCQkJeCA9IHRzLT5idWZbMF07IHggPDw9IDg7IHggKz0gdHMtPmJ1ZlsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHRzLT5idWZbMl07IHkgPDw9IDg7IHkgKz0gdHMtPmJ1ZlszXTsKKwkJCQl5ID0gdHMtPmJ1ZlsyXTsgeSA8PD0gODsgeSArPSB0cy0+YnVmWzNdOwogCi0gICAgICAgICAgICAgICAgICAgICAgIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkpOworCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7CisJCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKIAkJCX0gZWxzZSB7Ci0JCSAgICAgICAgICAgICAgIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAwKTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAwKTsKIAkJCQl0b3VjaGVkID0gMDsKIAkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBTZW5kIGEgbm9uIGlucHV0IGV2ZW50IGVsc2V3aGVyZSAqLwogCQkJYnJlYWs7Ci0gICAgICAgIH0KKwl9CiAKIAlpbnB1dF9zeW5jKGRldik7CiB9CkBAIC0yOTMsNyArMjkzLDcgQEAKICAqIGgzNjAwdHNfZXZlbnQoKSBoYW5kbGVzIGV2ZW50cyBmcm9tIHRoZSBpbnB1dCBtb2R1bGUuCiAgKi8KIHN0YXRpYyBpbnQgaDM2MDB0c19ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLAotCQkgCSB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQorCQkJIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IGgzNjAwX2RldiAqdHMgPSBkZXYtPnByaXZhdGU7CiAKQEAgLTMzMiw0MSArMzMyLDQxIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgaDM2MDB0c19pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywgdW5zaWduZWQgY2hhciBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVjdCBoMzYwMF9kZXYgKnRzID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCXN0cnVjdCBoMzYwMF9kZXYgKnRzID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCiAJLyoKLSAgICAgICAgICogV2UgaGF2ZSBhIG5ldyBmcmFtZSBjb21pbmcgaW4uCi0gICAgICAgICAqLworCSAqIFdlIGhhdmUgYSBuZXcgZnJhbWUgY29taW5nIGluLgorCSAqLwogCXN3aXRjaCAoc3RhdGUpIHsKIAkJY2FzZSBTVEFURV9TT0Y6Ci0gICAgICAgIAkJaWYgKGRhdGEgPT0gQ0hBUl9TT0YpCi0gICAgICAgICAgICAgICAgCQlzdGF0ZSA9IFNUQVRFX0lEOworCQkJaWYgKGRhdGEgPT0gQ0hBUl9TT0YpCisJCQkJc3RhdGUgPSBTVEFURV9JRDsKIAkJCWJyZWFrOwotICAgICAgICAJY2FzZSBTVEFURV9JRDoKKwkJY2FzZSBTVEFURV9JRDoKIAkJCXRzLT5ldmVudCA9IChkYXRhICYgMHhmMCkgPj4gNDsKIAkJCXRzLT5sZW4gPSAoZGF0YSAmIDB4Zik7CiAJCQl0cy0+aWR4ID0gMDsKIAkJCWlmICh0cy0+ZXZlbnQgPj0gTUFYX0lEKSB7CiAJCQkJc3RhdGUgPSBTVEFURV9TT0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQl0cy0+Y2hrc3VtID0gZGF0YTsKLSAgICAgICAgICAgICAgICAJc3RhdGUgPSAodHMtPmxlbiA+IDApID8gU1RBVEVfREFUQSA6IFNUQVRFX0VPRjsKKwkJCXN0YXRlID0gKHRzLT5sZW4gPiAwKSA/IFNUQVRFX0RBVEEgOiBTVEFURV9FT0Y7CiAJCQlicmVhazsKIAkJY2FzZSBTVEFURV9EQVRBOgogCQkJdHMtPmNoa3N1bSArPSBkYXRhOwogCQkJdHMtPmJ1Zlt0cy0+aWR4XT0gZGF0YTsKLQkJCWlmKCsrdHMtPmlkeCA9PSB0cy0+bGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgCXN0YXRlID0gU1RBVEVfRU9GOworCQkJaWYgKCsrdHMtPmlkeCA9PSB0cy0+bGVuKQorCQkJCXN0YXRlID0gU1RBVEVfRU9GOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfRU9GOgotICAgICAgICAgICAgICAgIAlzdGF0ZSA9IFNUQVRFX1NPRjsKLSAgICAgICAgICAgICAgICAJaWYgKGRhdGEgPT0gQ0hBUl9FT0YgfHwgZGF0YSA9PSB0cy0+Y2hrc3VtKQorCQkJc3RhdGUgPSBTVEFURV9TT0Y7CisJCQlpZiAoZGF0YSA9PSBDSEFSX0VPRiB8fCBkYXRhID09IHRzLT5jaGtzdW0pCiAJCQkJaDM2MDB0c19wcm9jZXNzX3BhY2tldCh0cywgcmVncyk7Ci0gICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAJZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAJcHJpbnRrKCJFcnJvcjNcbiIpOwotICAgICAgICAgICAgICAgIAlicmVhazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJFcnJvcjNcbiIpOworCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMzkwLDEwICszOTAsMTAgQEAKIAlpbml0X2lucHV0X2RldigmdHMtPmRldik7CiAKIAkvKiBEZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KLSAgICAgICAgc2V0X0dQSU9fSVJRX2VkZ2UoR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCBHUElPX0JPVEhfRURHRVMpOwotICAgICAgICBzZXRfR1BJT19JUlFfZWRnZShHUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIEdQSU9fUklTSU5HX0VER0UpOworCXNldF9HUElPX0lSUV9lZGdlKEdQSU9fQklUU1lfQUNUSU9OX0JVVFRPTiwgR1BJT19CT1RIX0VER0VTKTsKKwlzZXRfR1BJT19JUlFfZWRnZShHUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIEdQSU9fUklTSU5HX0VER0UpOwogCi0gICAgICAgIGlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCBhY3Rpb25fYnV0dG9uX2hhbmRsZXIsCisJaWYgKHJlcXVlc3RfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIGFjdGlvbl9idXR0b25faGFuZGxlciwKIAkJCVNBX1NISVJRIHwgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwKIAkJCSJoMzYwMF9hY3Rpb24iLCAmdHMtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoMzYwMHRzLmM6IENvdWxkIG5vdCBhbGxvY2F0ZSBBY3Rpb24gQnV0dG9uIElSUSFcbiIpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0gICAgICAgIGlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBucG93ZXJfYnV0dG9uX2hhbmRsZXIsCisJaWYgKHJlcXVlc3RfaXJxKElSUV9HUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIG5wb3dlcl9idXR0b25faGFuZGxlciwKIAkJCVNBX1NISVJRIHwgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwKIAkJCSJoMzYwMF9zdXNwZW5kIiwgJnRzLT5kZXYpKSB7CiAJCWZyZWVfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sICZ0cy0+ZGV2KTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJc3ByaW50Zih0cy0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAotICAgICAgIAl0cy0+ZGV2LmV2ZW50ID0gaDM2MDB0c19ldmVudDsKKwl0cy0+ZGV2LmV2ZW50ID0gaDM2MDB0c19ldmVudDsKIAl0cy0+ZGV2LnByaXZhdGUgPSB0czsKIAl0cy0+ZGV2Lm5hbWUgPSBoMzYwMF9uYW1lOwogCXRzLT5kZXYucGh5cyA9IHRzLT5waHlzOwpAQCAtNDQ2LDggKzQ0Niw4IEBACiAKIAllcnIgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOwogCWlmIChlcnIpIHsKLSAgICAgICAgCWZyZWVfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIHRzKTsKLSAgICAgICAgCWZyZWVfaXJxKElSUV9HUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIHRzKTsKKwkJZnJlZV9pcnEoSVJRX0dQSU9fQklUU1lfQUNUSU9OX0JVVFRPTiwgdHMpOworCQlmcmVlX2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCB0cyk7CiAJCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKIAkJa2ZyZWUodHMpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tazcxMi5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tazcxMi5jCmluZGV4IDJkMTRhNTcuLmFmYWFlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21rNzEyLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqIGZvdW5kIGluIEdhdGV3YXkgQU9MIENvbm5lY3RlZCBUb3VjaHBhZCBjb21wdXRlcnMuCiAgKgogICogRG9jdW1lbnRhdGlvbiBmb3IgSUNTIE1LNzEyIGNhbiBiZSBmb3VuZCBhdDoKLSAqIAlodHRwOi8vd3d3Lmljc3QuY29tL3BkZi9tazcxMi5wZGYKKyAqCWh0dHA6Ly93d3cuaWNzdC5jb20vcGRmL21rNzEyLnBkZgogICovCiAKIC8qCkBAIC03Nyw3ICs3Nyw2IEBACiAjZGVmaW5lIE1LNzEyX1JFQURfT05FX1BPSU5UCQkJMHgyMAogI2RlZmluZSBNSzcxMl9QT1dFUlVQCQkJCTB4NDAKIAotc3RhdGljIGludCBtazcxMl91c2VkID0gMDsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IG1rNzEyX2RldjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWs3MTJfbG9jayk7CiAKQEAgLTEzMCwxNyArMTI5LDE0IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWs3MTJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKCFtazcxMl91c2VkKyspIHsKKwlvdXRiKDAsIG1rNzEyX2lvICsgTUs3MTJfQ09OVFJPTCk7IC8qIFJlc2V0ICovCiAKLQkJb3V0YigwLCBtazcxMl9pbyArIE1LNzEyX0NPTlRST0wpOyAvKiBSZXNldCAqLworCW91dGIoTUs3MTJfRU5BQkxFX0lOVCB8IE1LNzEyX0lOVF9PTl9DT05WRVJTSU9OX0NPTVBMRVRFIHwKKwkJTUs3MTJfSU5UX09OX0NIQU5HRV9JTl9UT1VDSF9TVEFUVVMgfAorCQlNSzcxMl9FTkFCTEVfUEVSSU9ESUNfQ09OVkVSU0lPTlMgfAorCQlNSzcxMl9QT1dFUlVQLCBtazcxMl9pbyArIE1LNzEyX0NPTlRST0wpOwogCi0JCW91dGIoTUs3MTJfRU5BQkxFX0lOVCB8IE1LNzEyX0lOVF9PTl9DT05WRVJTSU9OX0NPTVBMRVRFIHwKLQkJCU1LNzEyX0lOVF9PTl9DSEFOR0VfSU5fVE9VQ0hfU1RBVFVTIHwKLQkJCU1LNzEyX0VOQUJMRV9QRVJJT0RJQ19DT05WRVJTSU9OUyB8Ci0JCQlNSzcxMl9QT1dFUlVQLCBtazcxMl9pbyArIE1LNzEyX0NPTlRST0wpOwotCi0JCW91dGIoMTAsIG1rNzEyX2lvICsgTUs3MTJfUkFURSk7IC8qIDE4NyBwb2ludHMgcGVyIHNlY29uZCAqLwotCX0KKwlvdXRiKDEwLCBtazcxMl9pbyArIE1LNzEyX1JBVEUpOyAvKiAxODcgcG9pbnRzIHBlciBzZWNvbmQgKi8KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1rNzEyX2xvY2ssIGZsYWdzKTsKIApAQCAtMTUzLDggKzE0OSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWs3MTJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKCEtLW1rNzEyX3VzZWQpCi0JCW91dGIoMCwgbWs3MTJfaW8gKyBNSzcxMl9DT05UUk9MKTsKKwlvdXRiKDAsIG1rNzEyX2lvICsgTUs3MTJfQ09OVFJPTCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtazcxMl9sb2NrLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwppbmRleCBkYzAwYzg1Li5kYjliYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE2MSwxMSArMTYwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF2bWNzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDg2LDEzICs0ODAsMjMgQEAKICAgICByZXR1cm4gMDsKIH0gLyogYXZtY3NfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGF2bWNzX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVk0iLCAiSVNETi1Db250cm9sbGVyIEIxIiwgMHg5NWQ0MjAwOCwgMHg4NDVkYzMzNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFWTSIsICJNb2JpbGUgSVNETi1Db250cm9sbGVyIE0xIiwgMHg5NWQ0MjAwOCwgMHg4MWUxMDQzMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFWTSIsICJNb2JpbGUgSVNETi1Db250cm9sbGVyIE0yIiwgMHg5NWQ0MjAwOCwgMHgxOGU4NTU4YSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGF2bWNzX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdm1jc19kcml2ZXIgPSB7CiAJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJLmRydgk9IHsKIAkJLm5hbWUJPSAiYXZtX2NzIiwKIAl9LAogCS5hdHRhY2gJPSBhdm1jc19hdHRhY2gsCisJLmV2ZW50CT0gYXZtY3NfZXZlbnQsCiAJLmRldGFjaAk9IGF2bWNzX2RldGFjaCwKKwkuaWRfdGFibGUgPSBhdm1jc19pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdm1jc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGFkYXB0ZXIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCmluZGV4IDZlNTQ4YTIuLjg5NDk3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCkBAIC00NCw3ICs0NCw3IEBACiAgIEFycmF5IHRvIGhlbGQgYWRhcHRlciBpbmZvcm1hdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBERVNDUklQVE9SICBIYW5kbGVUYWJsZVtORVdfTUFYX0RFU0NSSVBUT1JTXTsKLWR3b3JkIEFkYXB0ZXJzID0gMDsgLyogTnVtYmVyIG9mIGFkYXB0ZXJzICovCitzdGF0aWMgZHdvcmQgQWRhcHRlcnMgPSAwOyAvKiBOdW1iZXIgb2YgYWRhcHRlcnMgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNoYWRvdyBJRElfRElNQUlOVAogICBhbmQgJ3NoYWRvdycgZGVidWcgc3R1ZmYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKaW5kZXggNjYzYTBiZi4uMGUyMjk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE4MywxMSArMTgyLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF2bWExY3NfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01MDEsMTMgKzQ5NSwyMiBAQAogICAgIHJldHVybiAwOwogfSAvKiBhdm1hMWNzX2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBhdm1hMWNzX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVk0iLCAiSVNETiBBIiwgMHg5NWQ0MjAwOCwgMHhhZGM5ZDRiYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklTRE4iLCAiQ0FSRCIsIDB4OGQ5NzYxYzgsIDB4MDFjNWFhN2IpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBhdm1hMWNzX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdm1hMWNzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImF2bWExX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYXZtYTFjc19hdHRhY2gsCisJLmV2ZW50CQk9IGF2bWExY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBhdm1hMWNzX2RldGFjaCwKKwkuaWRfdGFibGUJPSBhdm1hMWNzX2lkcywKIH07CiAgCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCmluZGV4IGJmYzAxMzIuLjZmYzY4NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjEyLDExICsyMTEsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmZWxzYV9jc19ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTUwOCwxMyArNTAyLDIyIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVsc2FfY3NfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGVsc2FfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMU0EgQUcgKEFhY2hlbiwgR2VybWFueSkiLCAiTWljcm9MaW5rIElTRE4vTUMgIiwgMHg5ODNkZTJjNCwgMHgzMzNiYTI1NyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMU0EgR21iSCwgQWFjaGVuIiwgIk1pY3JvTGluayBJU0ROL01DICIsIDB4NjM5ZTU3MTgsIDB4MzMzYmEyNTcpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBlbHNhX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBlbHNhX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImVsc2FfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBlbHNhX2NzX2F0dGFjaCwKKwkuZXZlbnQJCT0gZWxzYV9jc19ldmVudCwKIAkuZGV0YWNoCQk9IGVsc2FfY3NfZGV0YWNoLAorCS5pZF90YWJsZQk9IGVsc2FfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9lbHNhX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYwppbmRleCA2ZTdlMDYwLi43MzMzMzc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIC8qIGZ1bmN0aW9uIHRvIHJlYWQgY3JpdGljYWwgY291bnRlciByZWdpc3RlcnMgdGhhdCAgICovCiAvKiBtYXkgYmUgdWRwYXRlZCBieSB0aGUgY2hpcCBkdXJpbmcgcmVhZCAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2xhdGlsZSB1X2NoYXIKK3N0YXRpYyB1X2NoYXIKIFJlYWRfaGZjOF9zdGFibGUoaGZjNHM4c19odyAqIGh3LCBpbnQgcmVnKQogewogCXVfY2hhciByZWY4OwpAQCAtMzI0LDcgKzMyNCw3IEBACiAJcmV0dXJuIGluODsKIH0KIAotc3RhdGljIHZvbGF0aWxlIGludAorc3RhdGljIGludAogUmVhZF9oZmMxNl9zdGFibGUoaGZjNHM4c19odyAqIGh3LCBpbnQgcmVnKQogewogCWludCByZWYxNjsKQEAgLTE0NjUsNyArMTQ2NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZGlzYWJsZSBtZW1vcnkgbWFwcGVkIHBvcnRzIC8gaW8gcG9ydHMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9wY2lfcG9ydHMoaGZjNHM4c19odyAqIGh3KQogewogCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX0NPTU1BTkQsIDApOwpAQCAtMTQ4MSw3ICsxNDgxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGVuYWJsZSBtZW1vcnkgbWFwcGVkIHBvcnRzIC8gaW8gcG9ydHMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBlbmFibGVfcGNpX3BvcnRzKGhmYzRzOHNfaHcgKiBodykKIHsKICNpZmRlZiBDT05GSUdfSElTQVhfSEZDNFM4U19QQ0lNRU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuYwppbmRleCBhYzg5OTUwLi5iYWIzNTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5jCkBAIC0yNzksNyArMjc5LDggQEAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19MMV9QVUxMX1JFUSwgJnN0LT5sMS5GbGFncykpCiAJCXN0LT5sMS5sMWwyKHN0LCBQSF9QVUxMIHwgQ09ORklSTSwgTlVMTCk7CiAJaWYgKCF0ZXN0X2JpdChCQ19GTEdfQUNUSVYsICZiY3MtPkZsYWcpKSB7Ci0JCWlmICghdGVzdF9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpICYmICghc2tiX3F1ZXVlX2xlbigmYmNzLT5zcXVldWUpKSkgeworCQlpZiAoIXRlc3RfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKSAmJgorCQkgICAgc2tiX3F1ZXVlX2VtcHR5KCZiY3MtPnNxdWV1ZSkpIHsKIAkJCXN0LT5sMi5sMmwxKHN0LCBQSF9ERUFDVElWQVRFIHwgQ09ORklSTSwgTlVMTCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKaW5kZXggOTAyMjU4My4uMTYxNWMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYwpAQCAtMTA4LDcgKzEwOCw4IEBACiBzdGF0aWMgdm9pZAogc2V0X3BlZXJfYnVzeShzdHJ1Y3QgTGF5ZXIyICpsMikgewogCXRlc3RfYW5kX3NldF9iaXQoRkxHX1BFRVJfQlVTWSwgJmwyLT5mbGFnKTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmbDItPmlfcXVldWUpIHx8IHNrYl9xdWV1ZV9sZW4oJmwyLT51aV9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmwyLT5pX3F1ZXVlKSB8fAorCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZsMi0+dWlfcXVldWUpKQogCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MMkJMT0NLLCAmbDItPmZsYWcpOwogfQogCkBAIC03NTQsNyArNzU1LDcgQEAKIAkJc3QtPmwyLmwybDMoc3QsIERMX0VTVEFCTElTSCB8IElORElDQVRJT04sIE5VTEwpOwogCiAJaWYgKChTVF9MMl83PT1zdGF0ZSkgfHwgKFNUX0wyXzggPT0gc3RhdGUpKQotCQlpZiAoc2tiX3F1ZXVlX2xlbigmc3QtPmwyLmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQorCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3QtPmwyLmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQogCQkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIH0KIApAQCAtODEwLDcgKzgxMSw3IEBACiAJaWYgKHByICE9IC0xKQogCQlzdC0+bDIubDJsMyhzdCwgcHIsIE5VTEwpOwogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3QtPmwyLmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQogCQlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IFJFUVVFU1QsIE5VTEwpOwogfQogCkBAIC0xMDE0LDcgKzEwMTUsNyBAQAogCQkJaWYodHlwICE9IFJSKSBGc21EZWxUaW1lcigmc3QtPmwyLnQyMDMsIDkpOwogCQkJcmVzdGFydF90MjAwKHN0LCAxMik7CiAJCX0KLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi5pX3F1ZXVlKSAmJiAodHlwID09IFJSKSkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0LT5sMi5pX3F1ZXVlKSAmJiAodHlwID09IFJSKSkKIAkJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiAJfSBlbHNlCiAJCW5yZXJyb3JyZWNvdmVyeShmaSk7CkBAIC0xMTIwLDcgKzExMjEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi5pX3F1ZXVlKSAmJiAoZmktPnN0YXRlID09IFNUX0wyXzcpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIuaV9xdWV1ZSkgJiYgKGZpLT5zdGF0ZSA9PSBTVF9MMl83KSkKIAkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19BQ0tfUEVORCwgJnN0LT5sMi5mbGFnKSkKIAkJZW5xdWlyeV9jcihzdCwgUlIsIFJTUCwgMCk7CkBAIC0xMTM4LDcgKzExMzksNyBAQAogCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MM19JTklULCAmc3QtPmwyLmZsYWcpOwogCX0gZWxzZQogCQlGc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNCk7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi51aV9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0LT5sMi51aV9xdWV1ZSkpCiAJCXR4X3VpKHN0KTsKIH0KIApAQCAtMTMwMSw3ICsxMzAyLDcgQEAKIAkJRnNtRGVsVGltZXIoJnN0LT5sMi50MjAzLCAxMyk7CiAJCUZzbUFkZFRpbWVyKCZzdC0+bDIudDIwMCwgc3QtPmwyLlQyMDAsIEVWX0wyX1QyMDAsIE5VTEwsIDExKTsKIAl9Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbDItPmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQogCQlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IFJFUVVFU1QsIE5VTEwpOwogfQogCkBAIC0xMzQ3LDcgKzEzNDgsNyBAQAogCQkJfQogCQkJaW52b2tlX3JldHJhbnNtaXNzaW9uKHN0LCBucik7CiAJCQlGc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7Ci0JCQlpZiAoc2tiX3F1ZXVlX2xlbigmbDItPmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJCQlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IFJFUVVFU1QsIE5VTEwpOwogCQl9IGVsc2UKIAkJCW5yZXJyb3JyZWNvdmVyeShmaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMKaW5kZXggYWJjYzk1My4uYzk5MTdjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJCQkJIXRlc3RfYml0KEZMR19QVFAsICZwLT5zdC0+bDIuZmxhZykpIHsKIAkJCQlpZiAocC0+ZGVidWcpCiAJCQkJCWwzX2RlYnVnKHAtPnN0LCAicmVsZWFzZV9sM19wcm9jZXNzOiBsYXN0IHByb2Nlc3MiKTsKLQkJCQlpZiAoIXNrYl9xdWV1ZV9sZW4oJnAtPnN0LT5sMy5zcXVldWUpKSB7CisJCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcC0+c3QtPmwzLnNxdWV1ZSkpIHsKIAkJCQkJaWYgKHAtPmRlYnVnKQogCQkJCQkJbDNfZGVidWcocC0+c3QsICJyZWxlYXNlX2wzX3Byb2Nlc3M6IHJlbGVhc2UgbGluayIpOwogCQkJCQlpZiAocC0+c3QtPnByb3RvY29sICE9IElTRE5fUFRZUEVfTkkxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCmluZGV4IDQ0OTY1MTIuLmM2YjViZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIyNiwxMSArMjI1LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNlZGxiYXVlcl9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTYxNiwxMyArNjEwLDI3IEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIHNlZGxiYXVlcl9ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgc2VkbGJhdWVyX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIlNFRExCQVVFUiIsICJzcGVlZCBzdGFyIElJIiwgIlYgMy4xIiwgIihjKSA5MyAtIDk4IGNiICIsIDB4ODFmYjc5ZjUsIDB4ZjM2MTJlMWQsIDB4NmI5NWM3OGEsIDB4NTBkNDE0OWMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiU0VETEJBVUVSIiwgIklTRE4tQWRhcHRlciIsICI0RDY3IiwgMHg4MWZiNzlmNSwgMHhlNGU5YmMxMiwgMHgzOTdiN2U5MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJTRURMQkFVRVIiLCAiSVNETi1BZGFwdGVyIiwgIjREOTgiLCAweDgxZmI3OWY1LCAweGU0ZTliYzEyLCAweDJlNWM3ZmNlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlNFRExCQVVFUiIsICJJU0ROLUFkYXB0ZXIiLCAiIChDKSA5My05NCBWSyIsIDB4ODFmYjc5ZjUsIDB4ZTRlOWJjMTIsIDB4OGRiMTQzZmUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiU0VETEJBVUVSIiwgIklTRE4tQWRhcHRlciIsICIgKGMpIDkzLTk1IFZLIiwgMHg4MWZiNzlmNSwgMHhlNGU5YmMxMiwgMHhiMzkxYWI0YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkhTVCBIaWdoIFNvZnQgVGVjaCBHbWJIIiwgIlNhcGhpciBJSSBCIiwgMHhkNzllMGI4NCwgMHgyMWQwODNhZSksCisvKglQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJTRURMQkFVRVIiLCAweDgxZmI3OWY1KSwgKi8gLyogdG9vIGdlbmVyaWMqLworCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzZWRsYmF1ZXJfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHNlZGxiYXVlcl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJzZWRsYmF1ZXJfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBzZWRsYmF1ZXJfYXR0YWNoLAorCS5ldmVudAkJPSBzZWRsYmF1ZXJfZXZlbnQsCiAJLmRldGFjaAkJPSBzZWRsYmF1ZXJfZGV0YWNoLAorCS5pZF90YWJsZQk9IHNlZGxiYXVlcl9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NlZGxiYXVlcl9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwppbmRleCA2M2U4ZTIwLi4wZGRlZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTkzLDExICsxOTIsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGVsZXNfY3NfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC00ODksMTMgKzQ4MywyMSBAQAogICAgIHJldHVybiAwOwogfSAvKiB0ZWxlc19jc19ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgdGVsZXNfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRFTEVTIiwgIlMwL1BDIiwgMHg2N2I1MGVhZSwgMHhlOWU3MDExOSksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB0ZWxlc19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdGVsZXNfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAidGVsZXNfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSB0ZWxlc19hdHRhY2gsCisJLmV2ZW50CQk9IHRlbGVzX2NzX2V2ZW50LAogCS5kZXRhY2gJCT0gdGVsZXNfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHRlbGVzX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdGVsZXNfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYwppbmRleCA4ZWUyNWIyLi4xZmQzZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5Y2FwaS5jCkBAIC00Miw2ICs0Miw4IEBACiAKIHN0YXRpYyBoeWNhcGlfYXBwbCBoeWNhcGlfYXBwbGljYXRpb25zW0NBUElfTUFYQVBQTF07CiAKK3N0YXRpYyB1MTYgaHljYXBpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsIHN0cnVjdCBza19idWZmICpza2IpOworCiBzdGF0aWMgaW5saW5lIGludCBfaHljYXBpX2FwcENoZWNrKGludCBhcHBfaWQsIGludCBjdHJsX25vKQogewogCWlmKChjdHJsX25vIDw9IDApIHx8IChjdHJsX25vID4gQ0FQSV9NQVhDT05UUikgfHwgKGFwcF9pZCA8PSAwKSB8fApAQCAtNTcsNyArNTksNyBAQAogS2VybmVsLUNhcGkgY2FsbGJhY2sgcmVzZXRfY3RyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAKIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAloeWNhcGljdHJsX2luZm8gKmNpbmZvID0gY3RybC0+ZHJpdmVyZGF0YTsKQEAgLTczLDcgKzc1LDcgQEAKIEtlcm5lbC1DYXBpIGNhbGxiYWNrIHJlbW92ZV9jdHIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgIAogCi12b2lkIAorc3RhdGljIHZvaWQKIGh5Y2FwaV9yZW1vdmVfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAlpbnQgaTsKQEAgLTIxNSw3ICsyMTcsNyBAQAogVGhlIGFwcGxpY2F0aW9uIGlzIHJlY29yZGVkIGluIHRoZSBpbnRlcm5hbCBsaXN0LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVnaXN0ZXJfYXBwbChzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsIF9fdTE2IGFwcGwsIAogCQkgICAgIGNhcGlfcmVnaXN0ZXJfcGFyYW1zICpycCkKIHsKQEAgLTI5MSw3ICsyOTMsNyBAQAogcmVnaXN0cmF0aW9uIGF0IGNvbnRyb2xsZXItbGV2ZWwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVsZWFzZV9hcHBsKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgX191MTYgYXBwbCkKIHsKIAlpbnQgY2hrOwpAQCAtMzY0LDcgKzM2Niw3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTE2IGh5Y2FwaV9zZW5kX21lc3NhZ2Uoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHUxNiBoeWNhcGlfc2VuZF9tZXNzYWdlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3UxNiBhcHBsX2lkOwogCWludCBfbGVuLCBfbGVuMjsKQEAgLTQzNyw4ICs0MzksOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBoeWNhcGlfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKK3N0YXRpYyBpbnQgaHljYXBpX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCBzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCiB7CiAJaHljYXBpY3RybF9pbmZvICpjaW5mbyA9IChoeWNhcGljdHJsX2luZm8gKikoY3RybC0+ZHJpdmVyZGF0YSk7CiAJaHlzZG5fY2FyZCAqY2FyZCA9IGNpbmZvLT5jYXJkOwpAQCAtNDg1LDcgKzQ4Nyw3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgaHljYXBpX2xvYWRfZmlybXdhcmUoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBjYXBpbG9hZGRhdGEgKmRhdGEpCitzdGF0aWMgaW50IGh5Y2FwaV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgY2FwaWxvYWRkYXRhICpkYXRhKQogewogI2lmZGVmIEhZQ0FQSV9QUklOVEZOQU1FUwogCXByaW50ayhLRVJOX05PVElDRSAiaHljYXBpX2xvYWRfZmlybXdhcmVcbiIpOyAgICAKQEAgLTQ5NCw3ICs0OTYsNyBAQAogfQogCiAKLWNoYXIgKmh5Y2FwaV9wcm9jaW5mbyhzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCitzdGF0aWMgY2hhciAqaHljYXBpX3Byb2NpbmZvKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAloeWNhcGljdHJsX2luZm8gKmNpbmZvID0gKGh5Y2FwaWN0cmxfaW5mbyAqKShjdHJsLT5kcml2ZXJkYXRhKTsKICNpZmRlZiBIWUNBUElfUFJJTlRGTkFNRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9ib290LmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fYm9vdC5jCmluZGV4IDZjMDQyODEuLjdiZmJhMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9ib290LmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2Jvb3QuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogIHRvIGJlIGNhbGxlZCBhdCBzdGFydCBvZiBQT0YgZmlsZSByZWFkaW5nLCAgICAgICAqLwogLyogIGJlZm9yZSBzdGFydGluZyBhbnkgZGVjcnlwdGlvbiBvbiBhbnkgUE9GIHJlY29yZC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBTdGFydERlY3J5cHRpb24oc3RydWN0IGJvb3RfZGF0YSAqYm9vdCkKIHsKIAlib290LT5DcnlwdG9yID0gQ1JZUFRfU1RBUlRURVJNOwpAQCAtNjYsNyArNjYsNyBAQAogLyogICAgICAgdG8gSEkgYW5kIExPIGJvb3QgbG9hZGVyIGFuZCAoYWxsKSBzZXEgdGFncywgYmVjYXVzZSAgKi8KIC8qICAgICAgIGdsb2JhbCBDcnlwdG9yIGlzIHN0YXJ0ZWQgZm9yIHdob2xlIFBPRi4gICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIERlY3J5cHRCdWYoc3RydWN0IGJvb3RfZGF0YSAqYm9vdCwgaW50IGNudCkKIHsKIAl1Y2hhciAqYnVmcCA9IGJvb3QtPmJ1Zi5Cb290QnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaCBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9kZWZzLmgKaW5kZXggNGNlZTI2ZS4uNDMyZjZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaAorKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fZGVmcy5oCkBAIC0yMjcsNyArMjI3LDYgQEAKIC8qKioqKioqKioqKioqKioqKi8KIC8qIGV4cG9ydGVkIHZhcnMgKi8KIC8qKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgY2FyZG1heDsJCS8qIG51bWJlciBvZiBmb3VuZCBjYXJkcyAqLwogZXh0ZXJuIGh5c2RuX2NhcmQgKmNhcmRfcm9vdDsJLyogcG9pbnRlciB0byBmaXJzdCBjYXJkICovCiAKIApAQCAtMjQ0LDcgKzI0Myw2IEBACiAvKiBoeXNkbl9wcm9jbG9nLmMgKi8KIGV4dGVybiBpbnQgaHlzZG5fcHJvY2xvZ19pbml0KGh5c2RuX2NhcmQgKik7CS8qIGluaXQgcHJvYyBsb2cgZW50cnkgKi8KIGV4dGVybiB2b2lkIGh5c2RuX3Byb2Nsb2dfcmVsZWFzZShoeXNkbl9jYXJkICopOwkvKiBkZWluaXQgcHJvYyBsb2cgZW50cnkgKi8KLWV4dGVybiB2b2lkIHB1dF9sb2dfYnVmZmVyKGh5c2RuX2NhcmQgKiwgY2hhciAqKTsJLyogb3V0cHV0IGxvZyBkYXRhICovCiBleHRlcm4gdm9pZCBoeXNkbl9hZGRsb2coaHlzZG5fY2FyZCAqLCBjaGFyICosLi4uKTsJLyogb3V0cHV0IGRhdGEgdG8gbG9nICovCiBleHRlcm4gdm9pZCBoeXNkbl9jYXJkX2VycmxvZyhoeXNkbl9jYXJkICosIHRFcnJMb2dFbnRyeSAqLCBpbnQpOwkvKiBvdXRwdXQgY2FyZCBsb2cgKi8KIApAQCAtMjc4LDE2ICsyNzYsNiBAQAogZXh0ZXJuIGludCBoeWNhcGlfY2FwaV9jcmVhdGUoaHlzZG5fY2FyZCAqKTsJLyogY3JlYXRlIGEgbmV3IGNhcGkgZGV2aWNlICovCiBleHRlcm4gaW50IGh5Y2FwaV9jYXBpX3JlbGVhc2UoaHlzZG5fY2FyZCAqKTsJLyogZGVsZXRlIHRoZSBkZXZpY2UgKi8KIGV4dGVybiBpbnQgaHljYXBpX2NhcGlfc3RvcChoeXNkbl9jYXJkICpjYXJkKTsgICAvKiBzdXNwZW5kICovCi1leHRlcm4gaW50IGh5Y2FwaV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqLCBjYXBpbG9hZGRhdGEgKik7Ci1leHRlcm4gdm9pZCBoeWNhcGlfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZW1vdmVfY3RyKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZWdpc3Rlcl9hcHBsKHN0cnVjdCBjYXBpX2N0ciAqLCBfX3UxNiBhcHBsLAotCQkJCSBjYXBpX3JlZ2lzdGVyX3BhcmFtcyAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZWxlYXNlX2FwcGwoc3RydWN0IGNhcGlfY3RyICosIF9fdTE2IGFwcGwpOwotZXh0ZXJuIHUxNiAgaHljYXBpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgY2FwaV9jdHIgKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gY2hhciAqaHljYXBpX3Byb2NpbmZvKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiBpbnQgaHljYXBpX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCBzdHJ1Y3QgY2FwaV9jdHIgKmNhcmQpOwogZXh0ZXJuIHZvaWQgaHljYXBpX3J4X2NhcGlwa3QoaHlzZG5fY2FyZCAqIGNhcmQsIHVjaGFyICogYnVmLCB3b3JkIGxlbik7CiBleHRlcm4gdm9pZCBoeWNhcGlfdHhfY2FwaWFjayhoeXNkbl9jYXJkICogY2FyZCk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmh5Y2FwaV90eF9jYXBpZ2V0KGh5c2RuX2NhcmQgKmNhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9pbml0LmMKaW5kZXggNWNhYzJiZi4uMTJjODEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5faW5pdC5jCkBAIC0zNCw3ICszNCw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBjaGFyICpoeXNkbl9pbml0X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS42LjYuNiAkIjsKLWludCBjYXJkbWF4OwkJCS8qIG51bWJlciBvZiBmb3VuZCBjYXJkcyAqLworc3RhdGljIGludCBjYXJkbWF4OwkJLyogbnVtYmVyIG9mIGZvdW5kIGNhcmRzICovCiBoeXNkbl9jYXJkICpjYXJkX3Jvb3QgPSBOVUxMOwkvKiBwb2ludGVyIHRvIGZpcnN0IGNhcmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYwppbmRleCA4ZWYyYjdjLi40ZDU3MDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKQEAgLTIyLDYgKzIyLDggQEAKIC8qIHRoZSBwcm9jIHN1YmRpciBmb3IgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkIGluIHRoZSBwcm9jY29uZiBtb2R1bGUgKi8KIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmh5c2RuX3Byb2NfZW50cnk7CiAKK3N0YXRpYyB2b2lkIHB1dF9sb2dfYnVmZmVyKGh5c2RuX2NhcmQgKiBjYXJkLCBjaGFyICpjcCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogc3RydWN0dXJlIGtlZXBpbmcgYXNjaWkgbG9nIGZvciBkZXZpY2Ugb3V0cHV0ICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkzLDcgKzk1LDcgQEAKIC8qIG9wZW5lZCBmb3IgcmVhZCBnb3QgdGhlIGNvbnRlbnRzLiAgICAgICAgKi8KIC8qIEZsdXNoZXMgYnVmZmVycyBub3QgbG9uZ2VyIGluIHVzZS4gICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBwdXRfbG9nX2J1ZmZlcihoeXNkbl9jYXJkICogY2FyZCwgY2hhciAqY3ApCiB7CiAJc3RydWN0IGxvZ19kYXRhICppYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwppbmRleCBhZDVhYTM4Li5iMzdlZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogCQl0b3RhbCArPSBjOwogCX0KIAlhdG9taWNfZGVjKCZpbmZvLT54bWl0X2xvY2spOwotCWlmICgoaW5mby0+eG1pdF9jb3VudCkgfHwgKHNrYl9xdWV1ZV9sZW4oJmluZm8tPnhtaXRfcXVldWUpKSkgeworCWlmICgoaW5mby0+eG1pdF9jb3VudCkgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+eG1pdF9xdWV1ZSkpIHsKIAkJaWYgKG0tPm1kbXJlZ1tSRUdfRFhNVF0gJiBCSVRfRFhNVCkgewogCQkJaXNkbl90dHlfc2VuZGRvd24oaW5mbyk7CiAJCQlpc2RuX3R0eV90aW50KGluZm8pOwpAQCAtMTI4NCw3ICsxMjg0LDcgQEAKIAogCWlmIChpc2RuX3R0eV9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJpc2RuX3R0eV9mbHVzaF9jaGFycyIpKQogCQlyZXR1cm47Ci0JaWYgKChpbmZvLT54bWl0X2NvdW50KSB8fCAoc2tiX3F1ZXVlX2xlbigmaW5mby0+eG1pdF9xdWV1ZSkpKQorCWlmICgoaW5mby0+eG1pdF9jb3VudCkgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+eG1pdF9xdWV1ZSkpCiAJCWlzZG5fdGltZXJfY3RybChJU0ROX1RJTUVSX01PREVNWE1JVCwgMSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMgYi9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCmluZGV4IDlmYzBjMWUuLmUwZDFiMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKKysrIGIvZHJpdmVycy9pc2RuL2ljbi9pY24uYwpAQCAtMzA0LDEyICszMDQsMTIgQEAKIAlpc2RuX2N0cmwgY21kOwogCiAJaWYgKCEoY2FyZC0+c25kY291bnRbY2hhbm5lbF0gfHwgY2FyZC0+eHNrYltjaGFubmVsXSB8fAotCSAgICAgIHNrYl9xdWV1ZV9sZW4oJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pKSkKKwkgICAgICAhc2tiX3F1ZXVlX2VtcHR5KCZjYXJkLT5zcHF1ZXVlW2NoYW5uZWxdKSkpCiAJCXJldHVybjsKIAlpZiAoaWNuX3RyeW1hcGxvY2tfY2hhbm5lbChjYXJkLCBtY2gpKSB7CiAJCXdoaWxlIChzYmZyZWUgJiYgCiAJCSAgICAgICAoY2FyZC0+c25kY291bnRbY2hhbm5lbF0gfHwKLQkJCXNrYl9xdWV1ZV9sZW4oJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pIHx8CisJCQkhc2tiX3F1ZXVlX2VtcHR5KCZjYXJkLT5zcHF1ZXVlW2NoYW5uZWxdKSB8fAogCQkJY2FyZC0+eHNrYltjaGFubmVsXSkpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCQlpZiAoY2FyZC0+eG1pdF9sb2NrW2NoYW5uZWxdKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwppbmRleCA4YTcxMTdhLi45MTY5MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKQEAgLTg2LDMzICs4NiwxOCBAQAogCSAgb24gdGhlICJTTVUiIHN5c3RlbSBjb250cm9sIGNoaXAgd2hpY2ggcmVwbGFjZXMgdGhlIG9sZCBQTVUuCiAJICBJZiB5b3UgZG9uJ3Qga25vdywgc2F5IFkuCiAKLWNvbmZpZyBQTUFDX1BCT09LCi0JYm9vbCAiUG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0IGZvciBQb3dlckJvb2tzIgotCWRlcGVuZHMgb24gQURCX1BNVQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcHV0dGluZyBhIFBvd2VyQm9vayB0byBzbGVlcDsgaXQgYWxzbwotCSAgZW5hYmxlcyBtZWRpYSBiYXkgc3VwcG9ydC4gIFBvd2VyIG1hbmFnZW1lbnQgd29ya3Mgb24gdGhlCi0JICBQQjI0MDAvMzQwMC8zNTAwLCBXYWxsc3RyZWV0LCBMb21iYXJkLCBhbmQgQnJvbnplIFBvd2VyQm9vayBHMyBhbmQKLQkgIHRoZSBUaXRhbml1bSBQb3dlcmJvb2sgRzQsIGFzIHdlbGwgYXMgdGhlIGlCb29rcy4gIFlvdSBzaG91bGQgZ2V0Ci0JICB0aGUgcG93ZXIgbWFuYWdlbWVudCBkYWVtb24sIHBtdWQsIHRvIG1ha2UgaXQgd29yayBhbmQgeW91IG11c3QgaGF2ZQotCSAgdGhlIC9kZXYvcG11IGRldmljZSAoc2VlIHRoZSBwbXVkIFJFQURNRSkuCi0KLQkgIEdldCBwbXVkIGZyb20gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwY2xpbnV4L3BtdWQvPi4KLQotCSAgSWYgeW91IGhhdmUgYSBQb3dlckJvb2ssIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KLQotCSAgWW91IG1heSBhbHNvIHdhbnQgdG8gY29tcGlsZSB0aGUgZG1hIHNvdW5kIGRyaXZlciBhcyBhIG1vZHVsZSBhbmQKLQkgIGhhdmUgaXQgYXV0b2xvYWRlZC4gVGhlIGFjdCBvZiByZW1vdmluZyB0aGUgbW9kdWxlIHNodXRzIGRvd24gdGhlCi0JICBzb3VuZCBoYXJkd2FyZSBmb3IgbW9yZSBwb3dlciBzYXZpbmdzLgotCi1jb25maWcgUE0KLQlib29sCi0JZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBBREJfUE1VICYmIFBNQUNfUEJPT0sKLQlkZWZhdWx0IHkKLQogY29uZmlnIFBNQUNfQVBNX0VNVQogCXRyaXN0YXRlICJBUE0gZW11bGF0aW9uIgotCWRlcGVuZHMgb24gUE1BQ19QQk9PSworCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgUFBDMzIgJiYgUE0KKworY29uZmlnIFBNQUNfTUVESUFCQVkKKwlib29sICJTdXBwb3J0IFBvd2VyQm9vayBob3Rzd2FwIG1lZGlhIGJheSIKKwlkZXBlbmRzIG9uIFBQQ19QTUFDICYmIFBQQzMyCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBvbGRlciBQb3dlckJvb2sncyBob3Rzd2FwIG1lZGlhIGJheQorCSAgdGhhdCBjYW4gY29udGFpbnMgYmF0dGVyaWVzLCBmbG9wcHkgZHJpdmVzLCBvciBJREUgZGV2aWNlcy4gUENJCisJICBkZXZpY2VzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIGluIHRoZSBiYXkgYXMgSSBuZXZlciBoYWQgb25lIHRvCisJICB0cnkgd2l0aAogCiAjIG1hZGUgYSBzZXBhcmF0ZSBvcHRpb24gc2luY2UgYmFja2xpZ2h0IG1heSBlbmQgdXAgYmVlaW5nIHVzZWQKICMgb24gbm9uLXBvd2VyYm9vayBtYWNoaW5lcyAoYnV0IG9ubHkgb24gUE1VIGJhc2VkIG9uZXMgQUZBSUspCkBAIC0xMjYsMTMgKzExMSw2IEBACiAJICBldmVudHM7IGFsc28sIHRoZSBQb3dlckJvb2sgYnV0dG9uIGRldmljZSB3aWxsIGJlIGVuYWJsZWQgc28geW91IGNhbgogCSAgY2hhbmdlIHRoZSBzY3JlZW4gYnJpZ2h0bmVzcy4KIAotY29uZmlnIE1BQ19TRVJJQUwKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgUG93ZXJNYWMgc2VyaWFsIHBvcnRzIChPQlNPTEVURSBEUklWRVIpIgotCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgQlJPS0VOCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgaXMgb2Jzb2xldGUuIFVzZSBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpbgotCSAgIkNoYXJhY3RlciBkZXZpY2VzIC0tPiBTZXJpYWwgZHJpdmVycyAtLT4gUG93ZXJNYWMgejg1YzMwIiBvcHRpb24uCi0KIGNvbmZpZyBBREJfTUFDSU8KIAlib29sICJJbmNsdWRlIE1hY0lPIChDSFJQKSBBREIgZHJpdmVyIgogCWRlcGVuZHMgb24gQURCICYmIFBQQ19DSFJQICYmICFQUENfUE1BQzY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9NYWtlZmlsZSBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCmluZGV4IGMzYTQ3MDUuLjIzNjI5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCi1vYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSBtYWNpb19hc2ljLm8KK29iai0kKENPTkZJR19QUENfUE1BQykJCSs9IG1hY2lvX2FzaWMubyBtYWNpb19zeXNmcy5vCiAKLW9iai0kKENPTkZJR19QTUFDX1BCT09LKQkrPSBtZWRpYWJheS5vCi1vYmotJChDT05GSUdfTUFDX1NFUklBTCkJKz0gbWFjc2VyaWFsLm8KK29iai0kKENPTkZJR19QTUFDX01FRElBQkFZKQkrPSBtZWRpYWJheS5vCiBvYmotJChDT05GSUdfTUFDX0VNVU1PVVNFQlROKQkrPSBtYWNfaGlkLm8KIG9iai0kKENPTkZJR19JTlBVVF9BREJISUQpCSs9IGFkYmhpZC5vCiBvYmotJChDT05GSUdfQU5TTENEKQkJKz0gYW5zLWxjZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCmluZGV4IDQ5M2UyYWYuLmMwZGMxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCkBAIC05MCw3ICs5MCw3IEBACiBzdGF0aWMgaW50IGF1dG9wb2xsX2RldnM7CiBpbnQgX19hZGJfcHJvYmVfc3luYzsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGFkYl9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwogc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgYWRiX3NsZWVwX25vdGlmaWVyID0gewogCWFkYl9ub3RpZnlfc2xlZXAsCkBAIC0zMjAsOSArMzIwLDkgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogbm8gQURCIGludGVyZmFjZSBkZXRlY3RlZFxuIik7CiAJCWFkYl9jb250cm9sbGVyID0gTlVMTDsKIAl9IGVsc2UgewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJCXBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcigmYWRiX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogI2lmZGVmIENPTkZJR19QUEMKIAkJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikgfHwKIAkJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpCkBAIC0zMzcsNyArMzM3LDcgQEAKIAogX19pbml0Y2FsbChhZGJfaW5pdCk7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyoKICAqIG5vdGlmeSBjbGllbnRzIGJlZm9yZSBzbGVlcCBhbmQgcmVzZXQgYnVzIGFmdGVyd2FyZHMKICAqLwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJfQogCXJldHVybiBQQk9PS19TTEVFUF9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgaW50CiBkb19hZGJfcmVzZXRfYnVzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKaW5kZXggZDBiZGE3ZS4uMWVlMDAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwpAQCAtMzMsNyArMzMsNyBAQAogewogCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICogbWFjaW9fZHJ2ID0gdG9fbWFjaW9fZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICogbWF0Y2hlcyA9IG1hY2lvX2Rydi0+bWF0Y2hfdGFibGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBtYWNpb19kcnYtPm1hdGNoX3RhYmxlOwogCiAJaWYgKCFtYXRjaGVzKSAKIAkJcmV0dXJuIDA7CkBAIC02Niw3ICs2Niw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICpkcnY7CiAJc3RydWN0IG1hY2lvX2RldiAqbWFjaW9fZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAlkcnYgPSB0b19tYWNpb19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCW1hY2lvX2RldiA9IHRvX21hY2lvX2RldmljZShkZXYpOwpAQCAtMTI2LDExICsxMjYsODUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtYWNpb19ob3RwbHVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXY7CisJc3RydWN0IG9mX2RldmljZSAqIG9mOworCWNoYXIgKnNjcmF0Y2gsICpjb21wYXQ7CisJaW50IGkgPSAwOworCWludCBsZW5ndGggPSAwOworCWludCBjcGxlbiwgc2VlbiA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKKwlpZiAoIW1hY2lvX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZiA9ICZtYWNpb19kZXYtPm9mZGV2OworCXNjcmF0Y2ggPSBidWZmZXI7CisKKwkvKiBzdHVmZiB3ZSB3YW50IHRvIHBhc3MgdG8gL3NiaW4vaG90cGx1ZyAqLworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsICJPRl9OQU1FPSVzIiwKKwkgICAgICAgICAgICAgICAgICAgICBvZi0+bm9kZS0+bmFtZSk7CisJaWYgKChidWZmZXJfc2l6ZSAtIGxlbmd0aCA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCisJCXJldHVybiAtRU5PTUVNOworCSsrbGVuZ3RoOworCXNjcmF0Y2ggKz0gbGVuZ3RoOworCisJZW52cFtpKytdID0gc2NyYXRjaDsKKwlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwgIk9GX1RZUEU9JXMiLAorCSAgICAgICAgICAgICAgICAgICAgIG9mLT5ub2RlLT50eXBlKTsKKwlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKytsZW5ndGg7CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKyAgICAgICAgLyogU2luY2UgdGhlIGNvbXBhdGlibGUgZmllbGQgY2FuIGNvbnRhaW4gcHJldHR5IG11Y2ggYW55dGhpbmcKKyAgICAgICAgICogaXQncyBub3QgcmVhbGx5IGxlZ2FsIHRvIHNwbGl0IGl0IG91dCB3aXRoIGNvbW1hcy4gV2Ugc3BsaXQgaXQKKyAgICAgICAgICogdXAgdXNpbmcgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluc3RlYWQuICovCisKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwl3aGlsZSAoY29tcGF0ICYmIGNwbGVuID4gMCkgeworCQlpbnQgbDsKKyAgICAgICAgICAgICAgICBlbnZwW2krK10gPSBzY3JhdGNoOworCQlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwKKwkJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpOworCQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsZW5ndGgrKzsKKwkJc2NyYXRjaCArPSBsZW5ndGg7CisJCWwgPSBzdHJsZW4gKGNvbXBhdCkgKyAxOworCQljb21wYXQgKz0gbDsKKwkJY3BsZW4gLT0gbDsKKwkJc2VlbisrOworCX0KKworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCisJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfTj0lZCIsIHNlZW4pOworCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKwkrK2xlbmd0aDsKKwlzY3JhdGNoICs9IGxlbmd0aDsKKworCWVudnBbaV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBtYWNpb19kZXZfYXR0cnNbXTsKKwogc3RydWN0IGJ1c190eXBlIG1hY2lvX2J1c190eXBlID0gewogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCisgICAgICAgLmhvdHBsdWcgPSBtYWNpb19ob3RwbHVnLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCisgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1hY2lvX2J1c19kcml2ZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fc3lzZnMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMjJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKworCisjZGVmaW5lIG1hY2lvX2NvbmZpZ19vZl9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitmaWVsZCMjX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKyAgICAgICAgICAgICAgY2hhciAqYnVmKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1hY2lvX2RldiAqbWRldiA9IHRvX21hY2lvX2RldmljZSAoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgZm9ybWF0X3N0cmluZywgbWRldi0+b2ZkZXYubm9kZS0+ZmllbGQpOwlcCit9CisKK3N0YXRpYyBzc2l6ZV90Citjb21wYXRpYmxlX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZjsKKwljaGFyICpjb21wYXQ7CisJaW50IGNwbGVuOworCWludCBsZW5ndGggPSAwOworCisJb2YgPSAmdG9fbWFjaW9fZGV2aWNlIChkZXYpLT5vZmRldjsKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQkqYnVmID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJaW50IGw7CisJCWxlbmd0aCArPSBzcHJpbnRmIChidWYsICIlc1xuIiwgY29tcGF0KTsKKwkJYnVmICs9IGxlbmd0aDsKKwkJbCA9IHN0cmxlbiAoY29tcGF0KSArIDE7CisJCWNvbXBhdCArPSBsOworCQljcGxlbiAtPSBsOworCX0KKworCXJldHVybiBsZW5ndGg7Cit9CisKK21hY2lvX2NvbmZpZ19vZl9hdHRyIChuYW1lLCAiJXNcbiIpOworbWFjaW9fY29uZmlnX29mX2F0dHIgKHR5cGUsICIlc1xuIik7CisKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG1hY2lvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhuYW1lKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX1JPKGNvbXBhdGlibGUpLAorCV9fQVRUUl9OVUxMCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNzZXJpYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlM2FjNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNzZXJpYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMzYgKzAsMCBAQAotLyoKLSAqIG1hY3NlcmlhbC5jOiBTZXJpYWwgcG9ydCBkcml2ZXIgZm9yIFBvd2VyIE1hY2ludG9zaGVzLgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3NidXMvY2hhci9zdW5zZXJpYWwuYyBieSBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMgKFBhdWwuTWFja2VycmFzQGNzLmFudS5lZHUuYXUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICoKLSAqIFJlY2VpdmUgRE1BIGNvZGUgYnkgVGFrYXNoaSBPZSA8dG9lQHVubHNlcnZlLnVubC5lZHU+LgotICoKLSAqICRJZDogbWFjc2VyaWFsLmMsdiAxLjI0LjIuNCAxOTk5LzEwLzE5IDA0OjM2OjQyIHBhdWx1cyBFeHAgJAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0jaWZkZWYgQ09ORklHX0tHREIKLSNpbmNsdWRlIDxhc20va2dkYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL2RiZG1hLmg+Ci0KLSNpbmNsdWRlICJtYWNzZXJpYWwuaCIKLQotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi1zdGF0aWMgaW50IHNlcmlhbF9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwotc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgc2VyaWFsX3NsZWVwX25vdGlmaWVyID0gewotCXNlcmlhbF9ub3RpZnlfc2xlZXAsCi0JU0xFRVBfTEVWRUxfTUlTQywKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBTVVBQT1JUX1NFUklBTF9ETUEKLSNkZWZpbmUgTUFDU0VSSUFMX1ZFUlNJT04JIjIuMCIKLQotLyoKLSAqIEl0IHdvdWxkIGJlIG5pY2UgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgZXZlcnl0aGluZyB0aGF0Ci0gKiBkZXBlbmRzIG9uIE5VTV9TRVJJQUwsIHNvIHdlIGNvdWxkIHN1cHBvcnQgYW55IG51bWJlciBvZgotICogWjg1MzBzLCBidXQgZm9yIG5vdy4uLgotICovCi0jZGVmaW5lIE5VTV9TRVJJQUwJMgkJLyogTWF4IG51bWJlciBvZiBaUyBjaGlwcyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTlVNX0NIQU5ORUxTCShOVU1fU0VSSUFMICogMikJLyogMiBjaGFubmVscyBwZXIgY2hpcCAqLwotCi0vKiBPbiBQb3dlck1hY3MsIHRoZSBoYXJkd2FyZSB0YWtlcyBjYXJlIG9mIHRoZSBTQ0MgcmVjb3ZlcnkgdGltZSwKLSAgIGJ1dCB3ZSBuZWVkIHRoZSBlaWVpbyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYWNjZXNzZXMgb2NjdXIKLSAgIGluIHRoZSBvcmRlciB3ZSB3YW50LiAqLwotI2RlZmluZSBSRUNPVkVSWV9ERUxBWQllaWVpbygpCi0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKLQotc3RydWN0IG1hY196c2NoYW5uZWwgenNfY2hhbm5lbHNbTlVNX0NIQU5ORUxTXTsKLQotc3RydWN0IG1hY19zZXJpYWwgenNfc29mdFtOVU1fQ0hBTk5FTFNdOwotaW50IHpzX2NoYW5uZWxzX2ZvdW5kOwotc3RydWN0IG1hY19zZXJpYWwgKnpzX2NoYWluOwkvKiBsaXN0IG9mIGFsbCBjaGFubmVscyAqLwotCi1zdHJ1Y3QgdHR5X3N0cnVjdCB6c190dHlzW05VTV9DSEFOTkVMU107Ci0KLXN0YXRpYyBpbnQgaXNfcG93ZXJib29rOwotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29uczsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0tHREIKLXN0cnVjdCBtYWNfenNjaGFubmVsICp6c19rZ2RiY2hhbjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjY19pbml0dGFiW10gPSB7Ci0JOSwgIDB4ODAsCS8qIHJlc2V0IEEgc2lkZSAoQ0hSQSkgKi8KLQkxMywgMCwJCS8qIHNldCBiYXVkIHJhdGUgZGl2aXNvciAqLwotCTEyLCAxLAotCTE0LCAxLAkJLyogYmF1ZCByYXRlIGdlbiBlbmFibGUsIHNyYz1ydHhjIChCUkVOQUJMKSAqLwotCTExLCAweDUwLAkvKiBjbG9ja3MgPSBiciBnZW4gKFJDQlIgfCBUQ0JSKSAqLwotCTUsICAweDZhLAkvKiB0eCA4IGJpdHMsIGFzc2VydCBSVFMgKFR4OCB8IFR4RU5BQiB8IFJUUykgKi8KLQk0LCAgMHg0NCwJLyogeDE2IGNsb2NrLCAxIHN0b3AgKFNCMSB8IFgxNkNMSykqLwotCTMsICAweGMxLAkvKiByeCBlbmFibGUsIDggYml0cyAoUnhFTkFCTEUgfCBSeDgpKi8KLX07Ci0jZW5kaWYKLSNkZWZpbmUgWlNfQ0xPQ0sgICAgICAgICAzNjg2NDAwIAkvKiBaODUzMCBSVHhDIGlucHV0IGNsb2NrIHJhdGUgKi8KLQotLyogc2VyaWFsIHN1YnR5cGUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMCTEKLQotLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCi0jZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKLQotLyoKLSAqIERlYnVnZ2luZy4KLSAqLwotI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCi0jdW5kZWYgU0VSSUFMX0RFQlVHX09QRU4KLSN1bmRlZiBTRVJJQUxfREVCVUdfRkxPVwotI3VuZGVmIFNFUklBTF9ERUJVR19QT1dFUgotI3VuZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotI3VuZGVmIFNFUklBTF9ERUJVR19TVE9QCi0jdW5kZWYgU0VSSUFMX0RFQlVHX0JBVURTCi0KLSNkZWZpbmUgUlNfU1RST0JFX1RJTUUgMTAKLSNkZWZpbmUgUlNfSVNSX1BBU1NfTElNSVQgMjU2Ci0KLSNkZWZpbmUgX0lOTElORV8gaW5saW5lCi0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotI2RlZmluZSBPUE5EQkcoZm10LCBhcmcuLi4pCXByaW50ayhLRVJOX0RFQlVHIGZtdCAsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIE9QTkRCRyhmbXQsIGFyZy4uLikJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0jaWZkZWYgU0VSSUFMX0RFQlVHX1BPV0VSCi0jZGVmaW5lIFBXUkRCRyhmbXQsIGFyZy4uLikJcHJpbnRrKEtFUk5fREVCVUcgZm10ICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgUFdSREJHKGZtdCwgYXJnLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNpZmRlZiBTRVJJQUxfREVCVUdfQkFVRFMKLSNkZWZpbmUgQkFVREJHKGZtdCwgYXJnLi4uKQlwcmludGsoZm10ICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgQkFVREJHKGZtdCwgYXJnLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgcHJvYmVfc2Njcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGNoYW5nZV9zcGVlZChzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbywgc3RydWN0IHRlcm1pb3MgKm9sZCk7Ci1zdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotc3RhdGljIGludCBzZXRfc2NjX3Bvd2VyKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbywgaW50IHN0YXRlKTsKLXN0YXRpYyBpbnQgc2V0dXBfc2NjKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbyk7Ci1zdGF0aWMgdm9pZCBkYmRtYV9yZXNldCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqZG1hKTsKLXN0YXRpYyB2b2lkIGRiZG1hX2ZsdXNoKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpkbWEpOwotc3RhdGljIGlycXJldHVybl90IHJzX3R4ZG1hX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCByc19yeGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pOwotc3RhdGljIHZvaWQgcnhkbWFfc3RhcnQoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvLCBpbnQgY3Vycik7Ci1zdGF0aWMgdm9pZCByeGRtYV90b190dHkoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKTsKLQotLyoKLSAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgc2VyaWFsX3dyaXRlLiAgV2UgbmVlZCB0bwotICogbG9jayBpdCBpbiBjYXNlIHRoZSBjb3B5X2Zyb21fdXNlciBibG9ja3Mgd2hpbGUgc3dhcHBpbmcgaW4gYSBwYWdlLAotICogYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbSB0cmllcyB0byBkbyBhIHNlcmlhbCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogU2luY2UgdGhlIGxvY2sgd2lsbCBvbmx5IGNvbWUgdW5kZXIgY29udGVudGlvbiB3aGVuIHRoZSBzeXN0ZW0gaXMKLSAqIHN3YXBwaW5nIGFuZCBhdmFpbGFibGUgbWVtb3J5IGlzIGxvdywgaXQgbWFrZXMgc2Vuc2UgdG8gc2hhcmUgb25lCi0gKiBidWZmZXIgYWNyb3NzIGFsbCB0aGUgc2VyaWFsIHBvcnRzLCBzaW5jZSBpdCBzaWduaWZpY2FudGx5IHNhdmVzCi0gKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwotCi0KLXN0YXRpYyBpbmxpbmUgaW50IF9fcG1hYwotc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkgICAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQotewotI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSwotCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX1dBUk5JTkcKLQkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgJXMgaW4gJXNcbiI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9XQVJOSU5HCi0JCSJXYXJuaW5nOiBudWxsIG1hY19zZXJpYWwgZm9yICVzIGluICVzXG4iOwotCi0JaWYgKCFpbmZvKSB7Ci0JCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChpbmZvLT5tYWdpYyAhPSBTRVJJQUxfTUFHSUMpIHsKLQkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogUmVhZGluZyBhbmQgd3JpdGluZyBaODUzMCByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3BtYWMgcmVhZF96c3JlZyhzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcpCi17Ci0JdW5zaWduZWQgY2hhciByZXR2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogV2UgaGF2ZSB0byBtYWtlIHRoaXMgYXRvbWljLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHJlZyAhPSAwKSB7Ci0JCSpjaGFubmVsLT5jb250cm9sID0gcmVnOwotCQlSRUNPVkVSWV9ERUxBWTsKLQl9Ci0JcmV0dmFsID0gKmNoYW5uZWwtPmNvbnRyb2w7Ci0JUkVDT1ZFUllfREVMQVk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtYWMgd3JpdGVfenNyZWcoc3RydWN0IG1hY196c2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHJlZyAhPSAwKSB7Ci0JCSpjaGFubmVsLT5jb250cm9sID0gcmVnOwotCQlSRUNPVkVSWV9ERUxBWTsKLQl9Ci0JKmNoYW5uZWwtPmNvbnRyb2wgPSB2YWx1ZTsKLQlSRUNPVkVSWV9ERUxBWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX19wbWFjIHJlYWRfenNkYXRhKHN0cnVjdCBtYWNfenNjaGFubmVsICpjaGFubmVsKQotewotCXVuc2lnbmVkIGNoYXIgcmV0dmFsOwotCi0JcmV0dmFsID0gKmNoYW5uZWwtPmRhdGE7Ci0JUkVDT1ZFUllfREVMQVk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3pzZGF0YShzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQl1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCSpjaGFubmVsLT5kYXRhID0gdmFsdWU7Ci0JUkVDT1ZFUllfREVMQVk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9hZF96c3JlZ3Moc3RydWN0IG1hY196c2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmVncykKLXsKLQlaU19DTEVBUkVSUihjaGFubmVsKTsKLQlaU19DTEVBUkZJRk8oY2hhbm5lbCk7Ci0JLyogTG9hZCAnZW0gdXAgKi8KLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSNCwgcmVnc1tSNF0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxMCwgcmVnc1tSMTBdKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMywgcmVnc1tSM10gJiB+UnhFTkFCTEUpOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFI1LCByZWdzW1I1XSAmIH5UeEVOQUIpOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxLCByZWdzW1IxXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjksIHJlZ3NbUjldKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMTEsIHJlZ3NbUjExXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjEyLCByZWdzW1IxMl0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxMywgcmVnc1tSMTNdKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMTQsIHJlZ3NbUjE0XSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjE1LCByZWdzW1IxNV0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIzLCByZWdzW1IzXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjUsIHJlZ3NbUjVdKTsKLQlyZXR1cm47Ci19Ci0KLS8qIFNldHMgb3IgY2xlYXJzIERUUi9SVFMgb24gdGhlIHJlcXVlc3RlZCBsaW5lICovCi1zdGF0aWMgaW5saW5lIHZvaWQgenNfcnRzZHRyKHN0cnVjdCBtYWNfc2VyaWFsICpzcywgaW50IHNldCkKLXsKLQlpZiAoc2V0KQotCQlzcy0+Y3VycmVnc1s1XSB8PSAoUlRTIHwgRFRSKTsKLQllbHNlCi0JCXNzLT5jdXJyZWdzWzVdICY9IH4oUlRTIHwgRFRSKTsKLQl3cml0ZV96c3JlZyhzcy0+enNfY2hhbm5lbCwgNSwgc3MtPmN1cnJlZ3NbNV0pOwotCXJldHVybjsKLX0KLQotLyogVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIFppbG9nICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfenNiYXVkKHN0cnVjdCBtYWNfc2VyaWFsICpzcykKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCA9IHNzLT56c19jaGFubmVsOwotCWludCBicmc7Ci0KLQlpZiAoKHNzLT5jdXJyZWdzW1IxMV0gJiBUQ0JSKSA9PSAwKSB7Ci0JCS8qIGhpZ2hlciByYXRlcyBkb24ndCB1c2UgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KLQkJcmV0dXJuIChzcy0+Y3VycmVnc1tSNF0gJiBYMzJDTEspPyBaU19DTE9DSy8zMjogWlNfQ0xPQ0svMTY7Ci0JfQotCS8qIFRoZSBiYXVkIHJhdGUgaXMgc3BsaXQgdXAgYmV0d2VlbiB0d28gOC1iaXQgcmVnaXN0ZXJzIGluCi0JICogd2hhdCBpcyB0ZXJtZWQgJ0JSRyB0aW1lIGNvbnN0YW50JyBmb3JtYXQgaW4gbXkgZG9jcyBmb3IKLQkgKiB0aGUgY2hpcCwgaXQgaXMgYSBmdW5jdGlvbiBvZiB0aGUgY2xrIHJhdGUgdGhlIGNoaXAgaXMKLQkgKiByZWNlaXZpbmcgd2hpY2ggaGFwcGVucyB0byBiZSBjb25zdGFudC4KLQkgKi8KLQlicmcgPSAocmVhZF96c3JlZyhjaGFubmVsLCAxMykgPDwgOCk7Ci0JYnJnIHw9IHJlYWRfenNyZWcoY2hhbm5lbCwgMTIpOwotCXJldHVybiBCUkdfVE9fQlBTKGJyZywgKFpTX0NMT0NLLyhzcy0+Y2xrX2Rpdmlzb3IpKSk7Ci19Ci0KLS8qIE9uIHJlY2VpdmUsIHRoaXMgY2xlYXJzIGVycm9ycyBhbmQgdGhlIHJlY2VpdmVyIGludGVycnVwdHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByc19yZWN2X2NsZWFyKHN0cnVjdCBtYWNfenNjaGFubmVsICp6c2MpCi17Ci0Jd3JpdGVfenNyZWcoenNjLCAwLCBFUlJfUkVTKTsKLQl3cml0ZV96c3JlZyh6c2MsIDAsIFJFU19IX0lVUyk7IC8qIFhYWCB0aGlzIGlzIHVubmVjZXNzYXJ5ICovCi19Ci0KLS8qCi0gKiBSZXNldCBhIERlc2NyaXB0b3ItQmFzZWQgRE1BIGNoYW5uZWwuCi0gKi8KLXN0YXRpYyB2b2lkIGRiZG1hX3Jlc2V0KHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpkbWEpCi17Ci0JaW50IGk7Ci0KLQlvdXRfbGUzMigmZG1hLT5jb250cm9sLCAoV0FLRXxGTFVTSHxQQVVTRXxSVU4pIDw8IDE2KTsKLQotCS8qCi0JICogWWVzIHRoaXMgbG9va3MgcGVjdWxpYXIsIGJ1dCBhcHBhcmVudGx5IGl0IG5lZWRzIHRvIGJlIHRoaXMKLQkgKiB3YXkgb24gc29tZSBtYWNoaW5lcy4gIChXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgREJETUEKLQkgKiBlbmdpbmUgaGFzIGFjdHVhbGx5IGdvdCB0aGUgd3JpdGUgYWJvdmUgYW5kIHJlc3BvbmRlZAotCSAqIHRvIGl0LiAtIHBhdWx1cykKLQkgKi8KLQlmb3IgKGkgPSAyMDA7IGkgPiAwOyAtLWkpCi0JCWlmIChsZF9sZTMyKCZkbWEtPnN0YXR1cykgJiBSVU4pCi0JCQl1ZGVsYXkoMSk7Ci19Ci0KLS8qCi0gKiBUZWxscyBhIERCRE1BIGNoYW5uZWwgdG8gc3RvcCBhbmQgd3JpdGUgYW55IGJ1ZmZlcmVkIGRhdGEKLSAqIGl0IG1pZ2h0IGhhdmUgdG8gbWVtb3J5LgotICovCi1zdGF0aWMgX0lOTElORV8gdm9pZCBkYmRtYV9mbHVzaCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqZG1hKQotewotCWludCBpID0gMDsKLQotCW91dF9sZTMyKCZkbWEtPmNvbnRyb2wsIChGTFVTSCA8PCAxNikgfCBGTFVTSCk7Ci0Jd2hpbGUgKCgoaW5fbGUzMigmZG1hLT5zdGF0dXMpICYgRkxVU0gpICE9IDApICYmIChpKysgPCAxMDApKQotCQl1ZGVsYXkoMSk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogSGVyZSBzdGFydHMgdGhlIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcy4gIEFsbCBvZiB0aGUgZm9sbG93aW5nCi0gKiBzdWJyb3V0aW5lcyBhcmUgZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBhcmUgZm9sZGVkIGludG8KLSAqIHJzX2ludGVycnVwdCgpLiAgVGhleSB3ZXJlIHNlcGFyYXRlZCBvdXQgZm9yIHJlYWRhYmlsaXR5J3Mgc2FrZS4KLSAqCi0gKiAJCQkJLSBUZWQgVHMnbyAodHl0c29AbWl0LmVkdSksIDctTWFyLTkzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKLSAqIHByb2Nlc3NpbmcgaW4gdGhlIHNvZnR3YXJlIGludGVycnVwdCBwb3J0aW9uIG9mIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHJzX3NjaGVkX2V2ZW50KHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkJCSAgaW50IGV2ZW50KQotewotCWluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7Ci0Jc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKLX0KLQotLyogV29yayBvdXQgdGhlIGZsYWcgdmFsdWUgZm9yIGEgejg1MzAgc3RhdHVzIHZhbHVlLiAqLwotc3RhdGljIF9JTkxJTkVfIGludCBzdGF0X3RvX2ZsYWcoaW50IHN0YXQpCi17Ci0JaW50IGZsYWc7Ci0KLQlpZiAoc3RhdCAmIFJ4X09WUikgewotCQlmbGFnID0gVFRZX09WRVJSVU47Ci0JfSBlbHNlIGlmIChzdGF0ICYgRlJNX0VSUikgewotCQlmbGFnID0gVFRZX0ZSQU1FOwotCX0gZWxzZSBpZiAoc3RhdCAmIFBBUl9FUlIpIHsKLQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0JfSBlbHNlCi0JCWZsYWcgPSAwOwotCXJldHVybiBmbGFnOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7Ci0JdW5zaWduZWQgY2hhciBjaCwgc3RhdCwgZmxhZzsKLQotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSAhPSAwKSB7Ci0KLQkJc3RhdCA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjEpOwotCQljaCA9IHJlYWRfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwpOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQkJaWYgKGNoID09IDB4MDMgfHwgY2ggPT0gJyQnKQotCQkJCWJyZWFrcG9pbnQoKTsKLQkJCWlmIChzdGF0ICYgKFJ4X09WUnxGUk1fRVJSfFBBUl9FUlIpKQotCQkJCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIEVSUl9SRVMpOwotCQkJcmV0dXJuOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCF0dHkpCi0JCQljb250aW51ZTsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCXN0YXRpYyBpbnQgZmxpcF9idWZfb3ZmOwotCQkJaWYgKCsrZmxpcF9idWZfb3ZmIDw9IDEpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkIuIG92ZXJmbG93OiAlZFxuIiwKLQkJCQkJCSAgICBmbGlwX2J1Zl9vdmYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCXsKLQkJCXN0YXRpYyBpbnQgZmxpcF9tYXhfY250OwotCQkJaWYgKGZsaXBfbWF4X2NudCA8IHR0eS0+ZmxpcC5jb3VudCkKLQkJCQlmbGlwX21heF9jbnQgPSB0dHktPmZsaXAuY291bnQ7Ci0JCX0KLQkJZmxhZyA9IHN0YXRfdG9fZmxhZyhzdGF0KTsKLQkJaWYgKGZsYWcpCi0JCQkvKiByZXNldCB0aGUgZXJyb3IgaW5kaWNhdGlvbiAqLwotCQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgRVJSX1JFUyk7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBmbGFnOwotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7Ci0JfQotCWlmICh0dHkpCi0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCWlmICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDApCi0JCXJldHVybjsKLQlpbmZvLT50eF9hY3RpdmUgPSAwOwotCi0JaWYgKGluZm8tPnhfY2hhciAmJiAhaW5mby0+cG93ZXJfd2FpdCkgewotCQkvKiBTZW5kIG5leHQgY2hhciAqLwotCQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgaW5mby0+eF9jaGFyKTsKLQkJaW5mby0+eF9jaGFyID0gMDsKLQkJaW5mby0+dHhfYWN0aXZlID0gMTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR4X3N0b3BwZWQKLQkgICAgfHwgaW5mby0+cG93ZXJfd2FpdCkgewotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwLCBSRVNfVHhfUCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTZW5kIGNoYXIgKi8KLQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsKytdKTsKLQlpbmZvLT54bWl0X3RhaWwgPSBpbmZvLT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKLQlpbmZvLT54bWl0X2NudC0tOwotCWluZm8tPnR4X2FjdGl2ZSA9IDE7Ci0KLQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpCi0JCXJzX3NjaGVkX2V2ZW50KGluZm8sIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvd2VydXBfZG9uZSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKikgZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpbmZvLT5wb3dlcl93YWl0ID0gMDsKLQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHN0YXR1c19oYW5kbGUoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0KLQkvKiBHZXQgc3RhdHVzIGZyb20gUmVhZCBSZWdpc3RlciAwICovCi0Jc3RhdHVzID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQotCS8qIENoZWNrIGZvciBEQ0QgdHJhbnNpdGlvbnMgKi8KLQlpZiAoKChzdGF0dXMgXiBpbmZvLT5yZWFkX3JlZ196ZXJvKSAmIERDRCkgIT0gMAotCSAgICAmJiBpbmZvLT50dHkgJiYgIUNfQ0xPQ0FMKGluZm8tPnR0eSkpIHsKLQkJaWYgKHN0YXR1cyAmIERDRCkgewotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCQl9IGVsc2UgewotCQkJaWYgKGluZm8tPnR0eSkKLQkJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBmb3IgQ1RTIHRyYW5zaXRpb25zICovCi0JaWYgKGluZm8tPnR0eSAmJiBDX0NSVFNDVFMoaW5mby0+dHR5KSkgewotCQkvKgotCQkgKiBGb3Igc29tZSByZWFzb24sIG9uIHRoZSBQb3dlciBNYWNpbnRvc2gsCi0JCSAqIGl0IHNlZW1zIHRoYXQgdGhlIENUUyBiaXQgaXMgMSB3aGVuIENUUyBpcwotCQkgKiAqbmVnYXRlZCogYW5kIDAgd2hlbiBpdCBpcyBhc3NlcnRlZC4KLQkJICogVGhlIERDRCBiaXQgZG9lc24ndCBzZWVtIHRvIGJlIGludmVydGVkCi0JCSAqIGxpa2UgdGhpcy4KLQkJICovCi0JCWlmICgoc3RhdHVzICYgQ1RTKSA9PSAwKSB7Ci0JCQlpZiAoaW5mby0+dHhfc3RvcHBlZCkgewotI2lmZGVmIFNFUklBTF9ERUJVR19GTE9XCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNUUyB1cFxuIik7Ci0jZW5kaWYKLQkJCQlpbmZvLT50eF9zdG9wcGVkID0gMDsKLQkJCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKLQkJCQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX0ZMT1cKLQkJCXByaW50ayhLRVJOX0RFQlVHICJDVFMgZG93blxuIik7Ci0jZW5kaWYKLQkJCWluZm8tPnR4X3N0b3BwZWQgPSAxOwotCQl9Ci0JfQotCi0JLyogQ2xlYXIgc3RhdHVzIGNvbmRpdGlvbi4uLiAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsKLQlpbmZvLT5yZWFkX3JlZ196ZXJvID0gc3RhdHVzOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX3NwZWNpYWxfZG1hKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCXVuc2lnbmVkIGNoYXIgc3RhdCwgZmxhZzsKLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqcmQgPSAmaW5mby0+cngtPmRtYTsKLQlpbnQgd2hlcmUgPSBSWF9CVUZfU0laRTsKLQotCXNwaW5fbG9jaygmaW5mby0+cnhfZG1hX2xvY2spOwotCWlmICgobGRfbGUzMigmcmQtPnN0YXR1cykgJiBBQ1RJVkUpICE9IDApCi0JCWRiZG1hX2ZsdXNoKHJkKTsKLQlpZiAoaW5fbGUzMigmcmQtPmNtZHB0cikKLQkgICAgPT0gdmlydF90b19idXMoaW5mby0+cnhfY21kc1tpbmZvLT5yeF9jYnVmXSArIDEpKQotCQl3aGVyZSAtPSBpbl9sZTE2KCZpbmZvLT5yeC0+cmVzX2NvdW50KTsKLQl3aGVyZS0tOwotCi0Jc3RhdCA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjEpOwotCi0JZmxhZyA9IHN0YXRfdG9fZmxhZyhzdGF0KTsKLQlpZiAoZmxhZykgewotCQlpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF9jYnVmXVt3aGVyZV0gPSBmbGFnOwotCQkvKiByZXNldCB0aGUgZXJyb3IgaW5kaWNhdGlvbiAqLwotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwLCBFUlJfUkVTKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmaW5mby0+cnhfZG1hX2xvY2spOwotfQotCi0vKgotICogVGhpcyBpcyB0aGUgc2VyaWFsIGRyaXZlcidzIGdlbmVyaWMgaW50ZXJydXB0IHJvdXRpbmUKLSAqLwotc3RhdGljIGlycXJldHVybl90IHJzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBkZXZfaWQ7Ci0JdW5zaWduZWQgY2hhciB6c19pbnRyZWc7Ci0JaW50IHNoaWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBaSUxPR19JTklUSUFMSVpFRCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicnNfaW50ZXJydXB0OiBpcnEgJWQsIHBvcnQgbm90ICIKLQkJCQkgICAgImluaXRpYWxpemVkXG4iLCBpcnEpOwotCQlkaXNhYmxlX2lycShpcnEpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JLyogTk9URTogVGhlIHJlYWQgcmVnaXN0ZXIgMywgd2hpY2ggaG9sZHMgdGhlIGlycSBzdGF0dXMsCi0JICogICAgICAgZG9lcyBzbyBmb3IgYm90aCBjaGFubmVscyBvbiBlYWNoIGNoaXAuICBBbHRob3VnaAotCSAqICAgICAgIHRoZSBzdGF0dXMgdmFsdWUgaXRzZWxmIG11c3QgYmUgcmVhZCBmcm9tIHRoZSBBCi0JICogICAgICAgY2hhbm5lbCBhbmQgaXMgb25seSB2YWxpZCB3aGVuIHJlYWQgZnJvbSBjaGFubmVsIEEuCi0JICogICAgICAgWWVzLi4uIGJyb2tlbiBoYXJkd2FyZS4uLgotCSAqLwotI2RlZmluZSBDSEFOX0lSUU1BU0sgKENIQlJ4SVAgfCBDSEJUeElQIHwgQ0hCRVhUKQotCi0JaWYgKGluZm8tPnpzX2NoYW5fYSA9PSBpbmZvLT56c19jaGFubmVsKQotCQlzaGlmdCA9IDM7CS8qIENoYW5uZWwgQSAqLwotCWVsc2UKLQkJc2hpZnQgPSAwOwkvKiBDaGFubmVsIEIgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JZm9yICg7OykgewotCQl6c19pbnRyZWcgPSByZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5fYSwgMykgPj4gc2hpZnQ7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJzX2ludGVycnVwdDogaXJxICVkLCB6c19pbnRyZWcgMHgleFxuIiwKLQkJICAgICAgIGlycSwgKGludCl6c19pbnRyZWcpOwotI2VuZGlmCi0KLQkJaWYgKCh6c19pbnRyZWcgJiBDSEFOX0lSUU1BU0spID09IDApCi0JCQlicmVhazsKLQkJaGFuZGxlZCA9IDE7Ci0KLQkJaWYgKHpzX2ludHJlZyAmIENIQlJ4SVApIHsKLQkJCS8qIElmIHdlIGFyZSBkb2luZyBETUEsIHdlIG9ubHkgYXNrIGZvciBpbnRlcnJ1cHRzCi0JCQkgICBvbiBjaGFyYWN0ZXJzIHdpdGggZXJyb3JzIG9yIHNwZWNpYWwgY29uZGl0aW9ucy4gKi8KLQkJCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkKLQkJCQlyZWNlaXZlX3NwZWNpYWxfZG1hKGluZm8pOwotCQkJZWxzZQotCQkJCXJlY2VpdmVfY2hhcnMoaW5mbywgcmVncyk7Ci0JCX0KLQkJaWYgKHpzX2ludHJlZyAmIENIQlR4SVApCi0JCQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQkJaWYgKHpzX2ludHJlZyAmIENIQkVYVCkKLQkJCXN0YXR1c19oYW5kbGUoaW5mbyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLX0KLQotLyogVHJhbnNtaXQgRE1BIGludGVycnVwdCAtIG5vdCB1c2VkIGF0IHByZXNlbnQgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCByc190eGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBSZWNlaXZlIERNQSBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCByc19yeGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBkZXZfaWQ7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2Q7Ci0KLQlpZiAoIWluZm8tPmRtYV9pbml0dGVkKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0Jc3Bpbl9sb2NrKCZpbmZvLT5yeF9kbWFfbG9jayk7Ci0JLyogRmlyc3QsIGNvbmZpcm0gdGhhdCB0aGlzIGludGVycnVwdCBpcywgaW5kZWVkLCBjb21pbmcgKi8KLQkvKiBmcm9tIFJ4IERNQSAqLwotCWNkID0gaW5mby0+cnhfY21kc1tpbmZvLT5yeF9jYnVmXSArIDI7Ci0JaWYgKChpbl9sZTE2KCZjZC0+eGZlcl9zdGF0dXMpICYgKFJVTiB8IEFDVElWRSkpICE9IChSVU4gfCBBQ1RJVkUpKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5yeF9kbWFfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JaWYgKGluZm8tPnJ4X2ZidWYgIT0gUlhfTk9fRkJVRikgewotCQlpbmZvLT5yeF9jYnVmID0gaW5mby0+cnhfZmJ1ZjsKLQkJaWYgKCsraW5mby0+cnhfZmJ1ZiA9PSBpbmZvLT5yeF9uYnVmKQotCQkJaW5mby0+cnhfZmJ1ZiA9IDA7Ci0JCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X3VidWYpCi0JCQlpbmZvLT5yeF9mYnVmID0gUlhfTk9fRkJVRjsKLQl9Ci0Jc3Bpbl91bmxvY2soJmluZm8tPnJ4X2RtYV9sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBIZXJlIGVuZHMgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZXMuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfc3RvcCgpIGFuZCByc19zdGFydCgpCi0gKgotICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19TVE9QCi0JcHJpbnRrKEtFUk5fREVCVUcgInJzX3N0b3AgJWxkLi4uLlxuIiwKLQkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7Ci0jZW5kaWYKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RvcCIpKQotCQlyZXR1cm47Ci0KLSNpZiAwCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoaW5mby0+Y3VycmVnc1s1XSAmIFR4RU5BQikgewotCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeEVOQUI7Ci0JCWluZm8tPnBlbmRyZWdzWzVdICY9IH5UeEVOQUI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19TVE9QCi0JcHJpbnRrKEtFUk5fREVCVUcgInJzX3N0YXJ0ICVsZC4uLi5cbiIsIAotCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zdGFydCIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotI2lmIDAKLQlpZiAoaW5mby0+eG1pdF9jbnQgJiYgaW5mby0+eG1pdF9idWYgJiYgIShpbmZvLT5jdXJyZWdzWzVdICYgVHhFTkFCKSkgewotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4RU5BQjsKLQkJaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQl9Ci0jZWxzZQotCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhaW5mby0+dHhfYWN0aXZlKSB7Ci0JCXRyYW5zbWl0X2NoYXJzKGluZm8pOwotCX0KLSNlbmRpZgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBwcml2YXRlXzsKLQlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwotCi0JdHR5ID0gaW5mby0+dHR5OwotCWlmICghdHR5KQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkKLQkJdHR5X3dha2V1cCh0dHkpOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0dXAoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCWludCBkZWxheTsKLQotCU9QTkRCRygic3RhcnR1cCgpICh0dHlTJWQsIGlycSAlZClcbiIsIGluZm8tPmxpbmUsIGluZm8tPmlycSk7Ci0gCi0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJT1BOREJHKCIgLT4gYWxyZWFkeSBpbml0ZWRcbiIpOwotIAkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFpbmZvLT54bWl0X2J1ZikgewotCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFpbmZvLT54bWl0X2J1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCU9QTkRCRygic3RhcnRpbmcgdXAgdHR5UyVkIChpcnEgJWQpLi4uXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotCi0JZGVsYXkgPSBzZXRfc2NjX3Bvd2VyKGluZm8sIDEpOwotCi0Jc2V0dXBfc2NjKGluZm8pOwotCi0JaWYgKGRlbGF5KSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyogZGVsYXkgaXMgaW4gbXMgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaW5mby0+cG93ZXJfd2FpdCA9IDE7Ci0JCW1vZF90aW1lcigmaW5mby0+cG93ZXJ1cF90aW1lciwKLQkJCSAgamlmZmllcyArIChkZWxheSAqIEhaICsgOTk5KSAvIDEwMDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JT1BOREJHKCJlbmFibGluZyBJUlEgb24gdHR5UyVkIChpcnEgJWQpLi4uXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotCi0JaW5mby0+ZmxhZ3MgfD0gWklMT0dfSU5JVElBTElaRUQ7Ci0JZW5hYmxlX2lycShpbmZvLT5pcnEpOwotCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkgewotCQllbmFibGVfaXJxKGluZm8tPnJ4X2RtYV9pcnEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByeGRtYV9zdGFydChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sIGludCBjdXJyKQotewotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpyZCA9ICZpbmZvLT5yeC0+ZG1hOwotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNkID0gaW5mby0+cnhfY21kc1tjdXJyXTsKLQotLy9wcmludGsoS0VSTl9ERUJVRyAiU0NDOiByeGRtYV9zdGFydFxuIik7Ci0KLQlzdF9sZTMyKCZyZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhjZCkpOwotCW91dF9sZTMyKCZyZC0+Y29udHJvbCwgKFJVTiA8PCAxNikgfCBSVU4pOwotfQotCi1zdGF0aWMgdm9pZCByeGRtYV90b190dHkoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eSA9IGluZm8tPnR0eTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqcmQgPSAmaW5mby0+cngtPmRtYTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXNpZHVlLCBhdmFpbGFibGUsIHNwYWNlLCBkb19xdWV1ZTsKLQotCWlmICghdHR5KQotCQlyZXR1cm47Ci0KLQlkb19xdWV1ZSA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnJ4X2RtYV9sb2NrLCBmbGFncyk7Ci1tb3JlOgotCXNwYWNlID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudDsKLQlpZiAoIXNwYWNlKSB7Ci0JCWRvX3F1ZXVlKys7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXNpZHVlID0gMDsKLQlpZiAoaW5mby0+cnhfdWJ1ZiA9PSBpbmZvLT5yeF9jYnVmKSB7Ci0JCWlmICgobGRfbGUzMigmcmQtPnN0YXR1cykgJiBBQ1RJVkUpICE9IDApIHsKLQkJCWRiZG1hX2ZsdXNoKHJkKTsKLQkJCWlmIChpbl9sZTMyKCZyZC0+Y21kcHRyKQotCQkJICAgID09IHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NtZHNbaW5mby0+cnhfY2J1Zl0rMSkpCi0JCQkJcmVzaWR1ZSA9IGluX2xlMTYoJmluZm8tPnJ4LT5yZXNfY291bnQpOwotCQl9Ci0JfQotCWF2YWlsYWJsZSA9IFJYX0JVRl9TSVpFIC0gcmVzaWR1ZSAtIGluZm8tPnJ4X2RvbmVfYnl0ZXM7Ci0JaWYgKGF2YWlsYWJsZSA+IHNwYWNlKQotCQlhdmFpbGFibGUgPSBzcGFjZTsKLQlpZiAoYXZhaWxhYmxlKSB7Ci0JCW1lbWNweSh0dHktPmZsaXAuY2hhcl9idWZfcHRyLAotCQkgICAgICAgaW5mby0+cnhfY2hhcl9idWZbaW5mby0+cnhfdWJ1Zl0gKyBpbmZvLT5yeF9kb25lX2J5dGVzLAotCQkgICAgICAgYXZhaWxhYmxlKTsKLQkJbWVtY3B5KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsCi0JCSAgICAgICBpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF91YnVmXSArIGluZm8tPnJ4X2RvbmVfYnl0ZXMsCi0JCSAgICAgICBhdmFpbGFibGUpOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGF2YWlsYWJsZTsKLQkJdHR5LT5mbGlwLmNvdW50ICs9IGF2YWlsYWJsZTsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBhdmFpbGFibGU7Ci0JCW1lbXNldChpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF91YnVmXSArIGluZm8tPnJ4X2RvbmVfYnl0ZXMsCi0JCSAgICAgICAwLCBhdmFpbGFibGUpOwotCQlpbmZvLT5yeF9kb25lX2J5dGVzICs9IGF2YWlsYWJsZTsKLQkJZG9fcXVldWUrKzsKLQl9Ci0JaWYgKGluZm8tPnJ4X2RvbmVfYnl0ZXMgPT0gUlhfQlVGX1NJWkUpIHsKLQkJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2QgPSBpbmZvLT5yeF9jbWRzW2luZm8tPnJ4X3VidWZdOwotCi0JCWlmIChpbmZvLT5yeF91YnVmID09IGluZm8tPnJ4X2NidWYpCi0JCQlnb3RvIG91dDsKLQkJLyogbWFyayByeF9jaGFyX2J1ZltyeF91YnVmXSBmcmVlICovCi0JCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBEQkRNQV9OT1ApOwotCQljZCsrOwotCQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgMCk7Ci0JCXN0X2xlMzIoKHVuc2lnbmVkIGludCAqKSZjZC0+cmVzX2NvdW50LCAwKTsKLQkJY2QrKzsKLQkJc3RfbGUxNigmY2QtPnhmZXJfc3RhdHVzLCAwKTsKLQotCQlpZiAoaW5mby0+cnhfZmJ1ZiA9PSBSWF9OT19GQlVGKSB7Ci0JCQlpbmZvLT5yeF9mYnVmID0gaW5mby0+cnhfdWJ1ZjsKLQkJCWlmICghKGxkX2xlMzIoJnJkLT5zdGF0dXMpICYgQUNUSVZFKSkgewotCQkJCWRiZG1hX3Jlc2V0KCZpbmZvLT5yeC0+ZG1hKTsKLQkJCQlyeGRtYV9zdGFydChpbmZvLCBpbmZvLT5yeF91YnVmKTsKLQkJCQlpbmZvLT5yeF9jYnVmID0gaW5mby0+cnhfdWJ1ZjsKLQkJCX0KLQkJfQotCQlpbmZvLT5yeF9kb25lX2J5dGVzID0gMDsKLQkJaWYgKCsraW5mby0+cnhfdWJ1ZiA9PSBpbmZvLT5yeF9uYnVmKQotCQkJaW5mby0+cnhfdWJ1ZiA9IDA7Ci0JCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X3VidWYpCi0JCQlpbmZvLT5yeF9mYnVmID0gUlhfTk9fRkJVRjsKLQkJZ290byBtb3JlOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotCWlmIChkb19xdWV1ZSkKLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLX0KLQotc3RhdGljIHZvaWQgcG9sbF9yeGRtYSh1bnNpZ25lZCBsb25nIHByaXZhdGVfKQotewotCXN0cnVjdCBtYWNfc2VyaWFsCSppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopIHByaXZhdGVfOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyeGRtYV90b190dHkoaW5mbyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnJ4X2RtYV9sb2NrLCBmbGFncyk7Ci0JbW9kX3RpbWVyKCZpbmZvLT5wb2xsX2RtYV90aW1lciwgUlhfRE1BX1RJTUVSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pCi17Ci0JaW50IGksIHNpemU7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2Q7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCWluZm8tPnJ4X25idWYgPSA4OwotCi0JLyogdmFyaW91cyBtZW0gc2V0IHVwICovCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSAqICgzICogaW5mby0+cnhfbmJ1ZiArIDIpCi0JCSsgKFJYX0JVRl9TSVpFICogMiArIHNpemVvZigqaW5mby0+cnhfY21kcykKLQkJICAgKyBzaXplb2YoKmluZm8tPnJ4X2NoYXJfYnVmKSArIHNpemVvZigqaW5mby0+cnhfZmxhZ19idWYpKQotCQkqIGluZm8tPnJ4X25idWY7Ci0JaW5mby0+ZG1hX3ByaXYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoaW5mby0+ZG1hX3ByaXYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW1lbXNldChpbmZvLT5kbWFfcHJpdiwgMCwgc2l6ZSk7Ci0KLQlpbmZvLT5yeF9jbWRzID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKiopaW5mby0+ZG1hX3ByaXY7Ci0JaW5mby0+cnhfY2hhcl9idWYgPSAodW5zaWduZWQgY2hhciAqKikgKGluZm8tPnJ4X2NtZHMgKyBpbmZvLT5yeF9uYnVmKTsKLQlpbmZvLT5yeF9mbGFnX2J1ZiA9IGluZm8tPnJ4X2NoYXJfYnVmICsgaW5mby0+cnhfbmJ1ZjsKLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgKGluZm8tPnJ4X2ZsYWdfYnVmICsgaW5mby0+cnhfbmJ1Zik7Ci0JZm9yIChpID0gMDsgaSA8IGluZm8tPnJ4X25idWY7IGkrKywgcCArPSBSWF9CVUZfU0laRSkKLQkJaW5mby0+cnhfY2hhcl9idWZbaV0gPSBwOwotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5yeF9uYnVmOyBpKyssIHAgKz0gUlhfQlVGX1NJWkUpCi0JCWluZm8tPnJ4X2ZsYWdfYnVmW2ldID0gcDsKLQotCS8qIGEgYml0IG9mIERNQSBwcm9ncmFtbWluZyAqLwotCWNkID0gaW5mby0+cnhfY21kc1swXSA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopIERCRE1BX0FMSUdOKHApOwotCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBEQkRNQV9OT1ApOwotCWNkKys7Ci0Jc3RfbGUxNigmY2QtPnJlcV9jb3VudCwgUlhfQlVGX1NJWkUpOwotCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBJTlBVVF9NT1JFKTsKLQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NoYXJfYnVmWzBdKSk7Ci0JY2QrKzsKLQlzdF9sZTE2KCZjZC0+cmVxX2NvdW50LCA0KTsKLQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTKTsKLQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGNkLTIpKTsKLQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgREJETUFfU1RPUCk7Ci0JZm9yIChpID0gMTsgaSA8IGluZm8tPnJ4X25idWY7IGkrKykgewotCQlpbmZvLT5yeF9jbWRzW2ldID0gKytjZDsKLQkJc3RfbGUxNigmY2QtPmNvbW1hbmQsIERCRE1BX05PUCk7Ci0JCWNkKys7Ci0JCXN0X2xlMTYoJmNkLT5yZXFfY291bnQsIFJYX0JVRl9TSVpFKTsKLQkJc3RfbGUxNigmY2QtPmNvbW1hbmQsIElOUFVUX01PUkUpOwotCQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NoYXJfYnVmW2ldKSk7Ci0JCWNkKys7Ci0JCXN0X2xlMTYoJmNkLT5yZXFfY291bnQsIDQpOwotCQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTKTsKLQkJc3RfbGUzMigmY2QtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhjZC0yKSk7Ci0JCXN0X2xlMzIoJmNkLT5jbWRfZGVwLCBEQkRNQV9TVE9QKTsKLQl9Ci0JY2QrKzsKLQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgREJETUFfTk9QIHwgQlJfQUxXQVlTKTsKLQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgdmlydF90b19idXMoaW5mby0+cnhfY21kc1swXSkpOwotCi0JLyogc2V0dXAgRE1BIHRvIG91ciBsaWtpbmcgKi8KLQlkYmRtYV9yZXNldCgmaW5mby0+cngtPmRtYSk7Ci0Jc3RfbGUzMigmaW5mby0+cngtPmRtYS5pbnRyX3NlbCwgMHgxMDAwMSk7Ci0Jc3RfbGUzMigmaW5mby0+cngtPmRtYS5icl9zZWwsIDB4MTAwMDEpOwotCW91dF9sZTMyKCZpbmZvLT5yeC0+ZG1hLndhaXRfc2VsLCAweDEwMDAxKTsKLQotCS8qIHNldCB2YXJpb3VzIGZsYWdzICovCi0JaW5mby0+cnhfdWJ1ZiA9IDA7Ci0JaW5mby0+cnhfY2J1ZiA9IDA7Ci0JaW5mby0+cnhfZmJ1ZiA9IGluZm8tPnJ4X3VidWYgKyAxOwotCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X25idWYpCi0JCWluZm8tPnJ4X2ZidWYgPSBSWF9OT19GQlVGOwotCWluZm8tPnJ4X2RvbmVfYnl0ZXMgPSAwOwotCi0JLyogc2V0dXAgcG9sbGluZyAqLwotCWluaXRfdGltZXIoJmluZm8tPnBvbGxfZG1hX3RpbWVyKTsKLQlpbmZvLT5wb2xsX2RtYV90aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBvbGxfcnhkbWE7Ci0JaW5mby0+cG9sbF9kbWFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87Ci0KLQlpbmZvLT5kbWFfaW5pdHRlZCA9IDE7Ci19Ci0KLS8qCi0gKiBGaXhaZXJvQnVnLi4uLldvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgU0NDIHJlY2V2aW5nIGNoYW5uZWwuCi0gKiBUYWtlbiBmcm9tIERhcndpbiBjb2RlLCAxNSBTZXB0LiAyMDAwICAtRGFuTQotICoKLSAqIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgcHJldmVudHMgYSBwcm9ibGVtIHRoYXQgaXMgc2VlbiB3aXRoIE8nSGFyZSBBU0lDcwotICogKG1vc3QgdmVyc2lvbnMgLS0gYWxzbyB3aXRoIHNvbWUgSGVhdGhyb3cgYW5kIEh5ZHJhIEFTSUNzKSB3aGVyZSBhIHplcm8KLSAqIGF0IHRoZSBpbnB1dCB0byB0aGUgcmVjZWl2ZXIgYmVjb21lcyAnc3R1Y2snIGFuZCBsb2NrcyB1cCB0aGUgcmVjZWl2ZXIuCi0gKiBUaGlzIHByb2JsZW0gY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIGEgemVybyBiaXQgYXQgdGhlIHJlY2VpdmVyIGlucHV0Ci0gKiBjb2luY2lkZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOgotICoKLSAqCVRoZSBTQ0MgaXMgaW5pdGlhbGl6ZWQgKGhhcmR3YXJlIG9yIHNvZnR3YXJlKS4KLSAqCUEgZnJhbWluZyBlcnJvciBpcyBkZXRlY3RlZC4KLSAqCVRoZSBjbG9ja2luZyBvcHRpb24gY2hhbmdlcyBmcm9tIHN5bmNocm9ub3VzIG9yIFgxIGFzeW5jaHJvbm91cwotICoJCWNsb2NraW5nIHRvIFgxNiwgWDMyLCBvciBYNjQgYXN5bmNocm9ub3VzIGNsb2NraW5nLgotICoJVGhlIGRlY29kaW5nIG1vZGUgaXMgY2hhbmdlZCBhbW9uZyBOUlosIE5SWkksIEZNMCwgb3IgRk0xLgotICoKLSAqIFRoaXMgd29ya2Fyb3VuZCBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gdGhlIGxvY2t1cCBjb25kaXRpb24gYnkgcGxhY2luZwotICogdGhlIFNDQyBpbiBzeW5jaHJvbm91cyBsb29wYmFjayBtb2RlIHdpdGggYSBmYXN0IGNsb2NrIGJlZm9yZSBwcm9ncmFtbWluZwotICogYW55IG9mIHRoZSBhc3luY2hyb25vdXMgbW9kZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGZpeF96ZXJvX2J1Z19zY2Moc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoaW5mby0+enNfY2hhbm5lbCA9PSBpbmZvLT56c19jaGFuX2E/IENIUkE6IENIUkIpKTsKLQl1ZGVsYXkoMTApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoKGluZm8tPnpzX2NoYW5uZWwgPT0gaW5mby0+enNfY2hhbl9hPyBDSFJBOiBDSFJCKSB8IE5WKSk7Ci0KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA0LCAoWDFDTEsgfCBFWFRTWU5DKSk7Ci0KLQkvKiBJIHRoaW5rIHRoaXMgaXMgd3JvbmcuLi4uYnV0LCBJIGp1c3QgY29weWluZyBjb2RlLi4uLgotCSovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMywgKDggJiB+UnhFTkFCTEUpKTsKLQotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsICg4ICYgflR4RU5BQikpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksIE5WKTsJLyogRGlkbid0IHdlIGFscmVhZHkgZG8gdGhpcz8gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxMSwgKFJDQlIgfCBUQ0JSKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTIsIDApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEzLCAwKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxNCwgKExPT1BCQUsgfCBTU0JSKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTQsIChMT09QQkFLIHwgU1NCUiB8IEJSRU5BQkwpKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAzLCAoOCB8IFJ4RU5BQkxFKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgUkVTX0VYVF9JTlQpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsJLyogdG8ga2lsbCBzb21lIHRpbWUgKi8KLQotCS8qIFRoZSBjaGFubmVsIHNob3VsZCBiZSBPSyBub3csIGJ1dCBpdCBpcyBwcm9iYWJseSByZWNlaXZpbmcKLQkgKiBsb29wYmFjayBnYXJiYWdlLgotCSAqIFN3aXRjaCB0byBhc3luY2hyb25vdXMgbW9kZSwgZGlzYWJsZSB0aGUgcmVjZWl2ZXIsCi0JICogYW5kIGRpc2NhcmQgZXZlcnl0aGluZyBpbiB0aGUgcmVjZWl2ZSBidWZmZXIuCi0JICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgOSwgTlYpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDQsIFBBUl9FTkEpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsICg4ICYgflJ4RU5BQkxFKSk7Ci0KLQl3aGlsZSAocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSB7Ci0JCSh2b2lkKXJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgOCk7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgRVJSX1JFUyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNldHVwX3NjYyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCU9QTkRCRygic2V0dGluZyB1cCB0dHlTJWQgU0NDLi4uXG4iLCBpbmZvLT5saW5lKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBOaWNlIGJ1Z2d5IEhXIC4uLiAqLwotCWZpeF96ZXJvX2J1Z19zY2MoaW5mbyk7Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSBjaGlwLgotCSAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoaW5mby0+enNfY2hhbm5lbCA9PSBpbmZvLT56c19jaGFuX2E/IENIUkE6IENIUkIpKTsKLQl1ZGVsYXkoMTApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksIDApOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgcmVjZWl2ZSBGSUZPLgotCSAqLwotCVpTX0NMRUFSRklGTyhpbmZvLT56c19jaGFubmVsKTsKLQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDE7Ci0KLQkvKgotCSAqIFJlc2V0IERNQXMKLQkgKi8KLQlpZiAoaW5mby0+aGFzX2RtYSkKLQkJZG1hX2luaXQoaW5mbyk7Ci0KLQkvKgotCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgotCSAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIEVSUl9SRVMpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19IX0lVUyk7Ci0KLQkvKgotCSAqIFR1cm4gb24gUlRTIGFuZCBEVFIuCi0JICovCi0JaWYgKCFpbmZvLT5pc19pcmRhKQotCQl6c19ydHNkdHIoaW5mbywgMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIGVuYWJsZSBzZXF1ZW5jaW5nIGFuZCBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKCFpbmZvLT5kbWFfaW5pdHRlZCkgewotCQkvKiBpbnRlcnJ1cHQgb24gZXh0L3N0YXR1cyBjaGFuZ2VzLCBhbGwgcmVjZWl2ZWQgY2hhcnMsCi0JCSAgIHRyYW5zbWl0IHJlYWR5ICovCi0JCWluZm8tPmN1cnJlZ3NbMV0gPSAoaW5mby0+Y3VycmVnc1sxXSAmIH4weDE4KQotCQkJCXwgKEVYVF9JTlRfRU5BQiB8IElOVF9BTExfUnggfCBUeElOVF9FTkFCKTsKLQl9IGVsc2UgewotCQkvKiBpbnRlcnJ1cHQgb24gZXh0L3N0YXR1cyBjaGFuZ2VzLCBXL1JlcSBwaW4gaXMKLQkJICAgcmVjZWl2ZSBETUEgcmVxdWVzdCAqLwotCQlpbmZvLT5jdXJyZWdzWzFdID0gKGluZm8tPmN1cnJlZ3NbMV0gJiB+KDB4MTggfCBUeElOVF9FTkFCKSkKLQkJCQl8IChFWFRfSU5UX0VOQUIgfCBXVF9SRFlfUlQgfCBXVF9GTl9SRFlGTik7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIGluZm8tPmN1cnJlZ3NbMV0pOwotCQkvKiBlbmFibGUgVy9SZXEgcGluICovCi0JCWluZm8tPmN1cnJlZ3NbMV0gfD0gV1RfUkRZX0VOQUI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIGluZm8tPmN1cnJlZ3NbMV0pOwotCQkvKiBlbmFibGUgaW50ZXJydXB0cyBvbiB0cmFuc21pdCByZWFkeSBhbmQgcmVjZWl2ZSBlcnJvcnMgKi8KLQkJaW5mby0+Y3VycmVnc1sxXSB8PSBJTlRfRVJSX1J4IHwgVHhJTlRfRU5BQjsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbMV0gPSBpbmZvLT5jdXJyZWdzWzFdOwotCWluZm8tPmN1cnJlZ3NbM10gfD0gKFJ4RU5BQkxFIHwgUng4KTsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+Y3VycmVnc1s1XSB8PSAoVHhFTkFCIHwgVHg4KTsKLQlpbmZvLT5wZW5kcmVnc1s1XSA9IGluZm8tPmN1cnJlZ3NbNV07Ci0JaW5mby0+Y3VycmVnc1s5XSB8PSAoTlYgfCBNSUUpOwotCWluZm8tPnBlbmRyZWdzWzldID0gaW5mby0+Y3VycmVnc1s5XTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAzLCBpbmZvLT5jdXJyZWdzWzNdKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA5LCBpbmZvLT5jdXJyZWdzWzldKTsKLQotCWlmIChpbmZvLT50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0JICovCi0JY2hhbmdlX3NwZWVkKGluZm8sIDApOwotCi0JLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBSUjAgKi8KLQlpbmZvLT5yZWFkX3JlZ196ZXJvID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQotCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+cnhfZG1hX2xvY2ssIGZsYWdzKTsKLQkJcnhkbWFfc3RhcnQoaW5mbywgMCk7Ci0JCWluZm8tPnBvbGxfZG1hX3RpbWVyLmV4cGlyZXMgPSBSWF9ETUFfVElNRVI7Ci0JCWFkZF90aW1lcigmaW5mby0+cG9sbF9kbWFfdGltZXIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGFuZAotICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KLSAqLwotc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCU9QTkRCRygiU2h1dHRpbmcgZG93biBzZXJpYWwgcG9ydCAlZCAoaXJxICVkKS4uLi5cbiIsIGluZm8tPmxpbmUsCi0JICAgICAgIGluZm8tPmlycSk7Ci0KLQlpZiAoIShpbmZvLT5mbGFncyAmIFpJTE9HX0lOSVRJQUxJWkVEKSkgewotCQlPUE5EQkcoIihhbHJlYWR5IHNodXRkb3duKVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW5mby0+aGFzX2RtYSkgewotCQlkZWxfdGltZXIoJmluZm8tPnBvbGxfZG1hX3RpbWVyKTsKLQkJZGJkbWFfcmVzZXQoaW5mby0+dHhfZG1hKTsKLQkJZGJkbWFfcmVzZXQoJmluZm8tPnJ4LT5kbWEpOwotCQlkaXNhYmxlX2lycShpbmZvLT50eF9kbWFfaXJxKTsKLQkJZGlzYWJsZV9pcnEoaW5mby0+cnhfZG1hX2lycSk7Ci0JfQotCWRpc2FibGVfaXJxKGluZm8tPmlycSk7Ci0KLQlpbmZvLT5wZW5kcmVnc1sxXSA9IGluZm8tPmN1cnJlZ3NbMV0gPSAwOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIDApOwkvKiBubyBpbnRlcnJ1cHRzICovCi0KLQlpbmZvLT5jdXJyZWdzWzNdICY9IH5SeEVOQUJMRTsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMywgaW5mby0+Y3VycmVnc1szXSk7Ci0KLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeEVOQUI7Ci0JaWYgKCFpbmZvLT50dHkgfHwgQ19IVVBDTChpbmZvLT50dHkpKQotCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5EVFI7Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCXNldF9zY2NfcG93ZXIoaW5mbywgMCk7Ci0KLQlpZiAoaW5mby0+eG1pdF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7Ci0JCWluZm8tPnhtaXRfYnVmID0gMDsKLQl9Ci0KLQlpZiAoaW5mby0+aGFzX2RtYSAmJiBpbmZvLT5kbWFfcHJpdikgewotCQlrZnJlZShpbmZvLT5kbWFfcHJpdik7Ci0JCWluZm8tPmRtYV9wcml2ID0gTlVMTDsKLQkJaW5mby0+ZG1hX2luaXR0ZWQgPSAwOwotCX0KLQotCW1lbXNldChpbmZvLT5jdXJyZWdzLCAwLCBzaXplb2YoaW5mby0+Y3VycmVncykpOwotCW1lbXNldChpbmZvLT5wZW5kcmVncywgMCwgc2l6ZW9mKGluZm8tPnBlbmRyZWdzKSk7Ci0KLQlpbmZvLT5mbGFncyAmPSB+WklMT0dfSU5JVElBTElaRUQ7Ci19Ci0KLS8qCi0gKiBUdXJuIHBvd2VyIG9uIG9yIG9mZiB0byB0aGUgU0NDIGFuZCBhc3NvY2lhdGVkIHN0dWZmCi0gKiAocG9ydCBkcml2ZXJzLCBtb2RlbSwgSVIgcG9ydCwgZXRjLikKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2Ugc2hvdWxkIHdhaXQgYmVmb3JlCi0gKiB0cnlpbmcgdG8gdXNlIHRoZSBwb3J0LgotICovCi1zdGF0aWMgaW50IHNldF9zY2NfcG93ZXIoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvLCBpbnQgc3RhdGUpCi17Ci0JaW50IGRlbGF5ID0gMDsKLQotCWlmIChzdGF0ZSkgewotCQlQV1JEQkcoInR0eVMlZDogcG93ZXJpbmcgdXAgaGFyZHdhcmVcbiIsIGluZm8tPmxpbmUpOwotCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCVBNQUNfRlRSX1NDQ19FTkFCTEUsCi0JCQlpbmZvLT5kZXZfbm9kZSwgaW5mby0+cG9ydF90eXBlLCAxKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCi0JCQkJaW5mby0+ZGV2X25vZGUsIDAsIDEpOwotCQkJZGVsYXkgPSAyNTAwOwkvKiB3YWl0IGZvciAyLjVzIGJlZm9yZSB1c2luZyAqLwotCQl9IGVsc2UgaWYgKGluZm8tPmlzX2lyZGEpCi0JCQltZGVsYXkoNTApOwkvKiBEbyBiZXR0ZXIgaGVyZSBvbmNlIHRoZSBwcm9ibGVtcwotCQkJICAgICAgICAgICAgICAgICAqIHdpdGggYmxvY2tpbmcgaGF2ZSBiZWVuIGlyb25lZCBvdXQKLQkJCSAgICAgICAgICAgICAgICAgKi8KLQl9IGVsc2UgewotCQkvKiBUT0RPOiBNYWtlIHRoYXQgZGVwZW5kIG9uIGEgdGltZXIsIGRvbid0IHBvd2VyIGRvd24KLQkJICogaW1tZWRpYXRlbHkKLQkJICovCi0JCVBXUkRCRygidHR5UyVkOiBzaHV0dGluZyBkb3duIGhhcmR3YXJlXG4iLCBpbmZvLT5saW5lKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCQlQV1JEQkcoInR0eVMlZDogc2h1dHRpbmcgZG93biBtb2RlbVxuIiwgaW5mby0+bGluZSk7Ci0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCi0JCQkJaW5mby0+ZGV2X25vZGUsIDAsIDApOwotCQl9Ci0JCXBtYWNfY2FsbF9mZWF0dXJlKAotCQkJUE1BQ19GVFJfU0NDX0VOQUJMRSwKLQkJCWluZm8tPmRldl9ub2RlLCBpbmZvLT5wb3J0X3R5cGUsIDApOwotCX0KLQlyZXR1cm4gZGVsYXk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlyZGFfcnRzX3B1bHNlcyhzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbywgaW50IHcpCi17Ci0JdWRlbGF5KHcpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQik7Ci0JdWRlbGF5KDIpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQiB8IFJUUyk7Ci0JdWRlbGF5KDgpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQik7Ci0JdWRlbGF5KDQpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQiB8IFJUUyk7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIGlyZGEgY29kZWMgb24gdGhlIGltYWMgdG8gdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIGlyZGFfc2V0dXAoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0JaW50IGNvZGUsIHNwZWVkLCB0OwotCi0Jc3BlZWQgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRDsKLQlpZiAoc3BlZWQgPCBCMjQwMCB8fCBzcGVlZCA+IEIxMTUyMDApCi0JCXJldHVybjsKLQljb2RlID0gMHg0ZCArIEIxMTUyMDAgLSBzcGVlZDsKLQotCS8qIGRpc2FibGUgc2VyaWFsIGludGVycnVwdHMgYW5kIHJlY2VpdmUgRE1BICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSwgaW5mby0+Y3VycmVnc1sxXSAmIH4weDlmKTsKLQotCS8qIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGRyYWluICovCi0JdCA9IDEwMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDAKLQkgICAgICAgfHwgKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSkgJiBBTExfU05UKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmFuc21pdHRlciBkaWRuJ3QgZHJhaW5cbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotCXVkZWxheSgxMDApOwotCi0JLyogc2V0IHRvIDggYml0cywgbm8gcGFyaXR5LCAxOTIwMCBiYXVkLCBSVFMgb24sIERUUiBvZmYgKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA0LCBYMTZDTEsgfCBTQjEpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDExLCBUQ0JSIHwgUkNCUik7Ci0JdCA9IEJQU19UT19CUkcoMTkyMDAsIFpTX0NMT0NLLzE2KTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxMiwgdCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTMsIHQgPj4gOCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTQsIEJSRU5BQkwpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsIFJ4OCB8IFJ4RU5BQkxFKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBUeDggfCBUeEVOQUIgfCBSVFMpOwotCi0JLyogc2V0IFR4RCBsb3cgZm9yIH4xMDR1cyBhbmQgcHVsc2UgUlRTICovCi0JdWRlbGF5KDEwMDApOwotCXdyaXRlX3pzZGF0YShpbmZvLT56c19jaGFubmVsLCAweGZlKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgMTUwKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgMTgwKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgNTApOwotCXVkZWxheSgxMDApOwotCi0JLyogYXNzZXJ0IERUUiwgd2FpdCAzMG1zLCB0YWxrIHRvIHRoZSBjaGlwICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgVHg4IHwgVHhFTkFCIHwgUlRTIHwgRFRSKTsKLQltZGVsYXkoMzApOwotCXdoaWxlIChyZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApICYgUnhfQ0hfQVYpCi0JCXJlYWRfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwpOwotCi0Jd3JpdGVfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwsIDEpOwotCXQgPSAxMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIHRpbWVkIG91dCBvbiAxc3QgYnl0ZVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLQl0ID0gcmVhZF96c2RhdGEoaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKHQgIT0gNCkKLQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIDFzdCBieXRlID0gJXhcbiIsIHQpOwotCi0Jd3JpdGVfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwsIGNvZGUpOwotCXQgPSAxMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIHRpbWVkIG91dCBvbiAybmQgYnl0ZVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLQl0ID0gcmVhZF96c2RhdGEoaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKHQgIT0gY29kZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIDJuZCBieXRlID0gJXggKCV4KVxuIiwgdCwgY29kZSk7Ci0KLQkvKiBEcm9wIERUUiBhZ2FpbiBhbmQgZG8gc29tZSBtb3JlIFJUUyBwdWxzZXMgKi8KLSBvdXQ6Ci0JdWRlbGF5KDEwMCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgVHg4IHwgVHhFTkFCIHwgUlRTKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgODApOwotCi0JLyogV2Ugc2hvdWxkIGJlIHJpZ2h0IHRvIGdvIG5vdy4gIFdlIGFzc3VtZSB0aGF0IGxvYWRfenNyZWdzCi0JICAgd2lsbCBnZXQgY2FsbGVkIHNvb24gdG8gbG9hZCB1cCB0aGUgY29ycmVjdCBiYXVkIHJhdGUgZXRjLiAqLwotCWluZm8tPmN1cnJlZ3NbNV0gPSAoaW5mby0+Y3VycmVnc1s1XSB8IFJUUykgJiB+RFRSOwotCWluZm8tPnBlbmRyZWdzWzVdID0gaW5mby0+Y3VycmVnc1s1XTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCi0gKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0JdW5zaWduZWQgY2ZsYWc7Ci0JaW50CWJpdHM7Ci0JaW50CWJyZywgYmF1ZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKLQkJcmV0dXJuOwotCi0JY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7Ci0JaWYgKGJhdWQgPT0gMCkgewotCQlpZiAob2xkX3Rlcm1pb3MpIHsKLQkJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7Ci0JCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOwotCQkJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKLQkJfQotCQllbHNlCi0JCQliYXVkID0gaW5mby0+enNfYmF1ZDsKLQl9Ci0JaWYgKGJhdWQgPiAyMzA0MDApCi0JCWJhdWQgPSAyMzA0MDA7Ci0JZWxzZSBpZiAoYmF1ZCA9PSAwKQotCQliYXVkID0gMzg0MDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWluZm8tPnpzX2JhdWQgPSBiYXVkOwotCWluZm8tPmNsa19kaXZpc29yID0gMTY7Ci0KLQlCQVVEQkcoS0VSTl9ERUJVRyAic2V0IHNwZWVkIHRvICVkIGJkcywgIiwgYmF1ZCk7Ci0KLQlzd2l0Y2ggKGJhdWQpIHsKLQljYXNlIFpTX0NMT0NLLzE2OgkvKiAyMzA0MDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgxNkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQljYXNlIFpTX0NMT0NLLzMyOgkvKiAxMTUyMDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgzMkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbmZvLT5jdXJyZWdzWzRdID0gWDE2Q0xLOwotCQlpbmZvLT5jdXJyZWdzWzExXSA9IFRDQlIgfCBSQ0JSOwotCQlicmcgPSBCUFNfVE9fQlJHKGJhdWQsIFpTX0NMT0NLL2luZm8tPmNsa19kaXZpc29yKTsKLQkJaW5mby0+Y3VycmVnc1sxMl0gPSAoYnJnICYgMjU1KTsKLQkJaW5mby0+Y3VycmVnc1sxM10gPSAoKGJyZyA+PiA4KSAmIDI1NSk7Ci0JCWluZm8tPmN1cnJlZ3NbMTRdID0gQlJFTkFCTDsKLQl9Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCWluZm8tPmN1cnJlZ3NbM10gJj0gflJ4TkJJVFNfTUFTSzsKLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeE5CSVRTX01BU0s7Ci0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng1OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NTsKLQkJQkFVREJHKCI1IGJpdHMsICIpOwotCQliaXRzID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBDUzY6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng2OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NjsKLQkJQkFVREJHKCI2IGJpdHMsICIpOwotCQliaXRzID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng3OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NzsKLQkJQkFVREJHKCI3IGJpdHMsICIpOwotCQliaXRzID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBDUzg6Ci0JZGVmYXVsdDogLyogZGVmYXVsdHMgdG8gOCBiaXRzICovCi0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng4OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4ODsKLQkJQkFVREJHKCI4IGJpdHMsICIpOwotCQliaXRzID0gMTA7Ci0JCWJyZWFrOwotCX0KLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCi0JaW5mby0+Y3VycmVnc1s0XSAmPSB+KFNCX01BU0sgfCBQQVJfRU5BIHwgUEFSX0VWRU4pOwotCWlmIChjZmxhZyAmIENTVE9QQikgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMjsKLQkJYml0cysrOwotCQlCQVVEQkcoIjIgc3RvcCwgIik7Ci0JfSBlbHNlIHsKLQkJaW5mby0+Y3VycmVnc1s0XSB8PSBTQjE7Ci0JCUJBVURCRygiMSBzdG9wLCAiKTsKLQl9Ci0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWJpdHMrKzsKLSAJCWluZm8tPmN1cnJlZ3NbNF0gfD0gUEFSX0VOQTsKLQkJQkFVREJHKCJwYXJpdHksICIpOwotCX0KLQlpZiAoIShjZmxhZyAmIFBBUk9ERCkpIHsKLQkJaW5mby0+Y3VycmVnc1s0XSB8PSBQQVJfRVZFTjsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbNF0gPSBpbmZvLT5jdXJyZWdzWzRdOwotCi0JaWYgKCEoY2ZsYWcgJiBDTE9DQUwpKSB7Ci0JCWlmICghKGluZm8tPmN1cnJlZ3NbMTVdICYgRENESUUpKQotCQkJaW5mby0+cmVhZF9yZWdfemVybyA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCk7Ci0JCWluZm8tPmN1cnJlZ3NbMTVdIHw9IERDRElFOwotCX0gZWxzZQotCQlpbmZvLT5jdXJyZWdzWzE1XSAmPSB+RENESUU7Ci0JaWYgKGNmbGFnICYgQ1JUU0NUUykgewotCQlpbmZvLT5jdXJyZWdzWzE1XSB8PSBDVFNJRTsKLQkJaWYgKChyZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApICYgQ1RTKSAhPSAwKQotCQkJaW5mby0+dHhfc3RvcHBlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJaW5mby0+Y3VycmVnc1sxNV0gJj0gfkNUU0lFOwotCQlpbmZvLT50eF9zdG9wcGVkID0gMDsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbMTVdID0gaW5mby0+Y3VycmVnc1sxNV07Ci0KLQkvKiBDYWxjIHRpbWVvdXQgdmFsdWUuIFRoaXMgaXMgcHJldHR5IGJyb2tlbiB3aXRoIGhpZ2ggYmF1ZCByYXRlcyB3aXRoIEhaPTEwMC4KLQkgICBUaGlzIGNvZGUgd291bGQgbG92ZSBhIGxhcmdlciBIWiBhbmQgYSA+MSBmaWZvIHNpemUsIGJ1dCB0aGlzIGlzIG5vdAotCSAgIGEgcHJpb3JpdHkuIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSA+SFovMgotCSAqLwotCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKmJpdHMpIC8gYmF1ZCk7Ci0JaW5mby0+dGltZW91dCArPSBIWi81MCsxOwkvKiBBZGQgLjAyIHNlY29uZHMgb2Ygc2xvcCAqLwotCi0JQkFVREJHKCJ0aW1lb3V0PSVkLyVkcywgYmFzZTolZFxuIiwgKGludClpbmZvLT50aW1lb3V0LCAoaW50KUhaLAotCSAgICAgICAoaW50KWluZm8tPmJhdWRfYmFzZSk7Ci0KLQkvKiBzZXQgdGhlIGlyZGEgY29kZWMgdG8gdGhlIHJpZ2h0IHJhdGUgKi8KLQlpZiAoaW5mby0+aXNfaXJkYSkKLQkJaXJkYV9zZXR1cChpbmZvKTsKLQotCS8qIExvYWQgdXAgdGhlIG5ldyB2YWx1ZXMgKi8KLQlsb2FkX3pzcmVncyhpbmZvLT56c19jaGFubmVsLCBpbmZvLT5jdXJyZWdzKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfZmx1c2hfY2hhcnMiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCBpbmZvLT50eF9zdG9wcGVkIHx8Ci0JICAgICAgIWluZm8tPnhtaXRfYnVmKSkKLQkJLyogRW5hYmxlIHRyYW5zbWl0dGVyICovCi0JCXRyYW5zbWl0X2NoYXJzKGluZm8pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKLQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCWludAljLCByZXQgPSAwOwotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQotCQlyZXR1cm4gMDsKLQotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsCi0JCQkJCSAgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOwotCQlpZiAoYyA8PSAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7Ci0JCWluZm8tPnhtaXRfaGVhZCA9ICgoaW5mby0+eG1pdF9oZWFkICsgYykgJgotCQkJCSAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKLQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJcmV0ICs9IGM7Ci0JfQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIWluZm8tPnR4X3N0b3BwZWQKLQkgICAgJiYgIWluZm8tPnR4X2FjdGl2ZSkKLQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQJcmV0OwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZV9yb29tIikpCi0JCXJldHVybiAwOwotCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7Ci0JaWYgKHJldCA8IDApCi0JCXJldCA9IDA7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9idWZmZXIiKSkKLQkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX3Rocm90dGxlKCkKLSAqIAotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdXBwZXItbGF5ZXIgdHR5IGxheWVyIHRvIHNpZ25hbCB0aGF0Ci0gKiBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIHZvaWQgcnNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCi0JcHJpbnRrKEtFUk5fREVCVUcgInRocm90dGxlICVsZC4uLi5cbiIsdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7Ci0jZW5kaWYKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfdGhyb3R0bGUiKSkKLQkJcmV0dXJuOwotCi0JaWYgKElfSVhPRkYodHR5KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlpbmZvLT54X2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKLQkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCi0JCQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChDX0NSVFNDVFModHR5KSkgewotCQkvKgotCQkgKiBIZXJlIHdlIHdhbnQgdG8gdHVybiBvZmYgdGhlIFJUUyBsaW5lLiAgT24gTWFjaW50b3NoZXMsCi0JCSAqIHRoZSBleHRlcm5hbCBzZXJpYWwgcG9ydHMgdXNpbmcgYSBESU4tOCBvciBESU4tOQotCQkgKiBjb25uZWN0b3Igb25seSBoYXZlIHRoZSBEVFIgbGluZSAod2hpY2ggaXMgdXN1YWxseQotCQkgKiB3aXJlZCB0byBib3RoIFJUUyBhbmQgRFRSIG9uIGFuIGV4dGVybmFsIG1vZGVtIGluCi0JCSAqIHRoZSBjYWJsZSkuICBSVFMgZG9lc24ndCBnbyBvdXQgdG8gdGhlIHNlcmlhbCBwb3J0Ci0JCSAqIHNvY2tldCwgaXQgYWN0cyBhcyBhbiBvdXRwdXQgZW5hYmxlIGZvciB0aGUgdHJhbnNtaXQKLQkJICogZGF0YSBsaW5lLiAgU28gaW4gdGhpcyBjYXNlIHdlIGRvbid0IGRyb3AgUlRTLgotCQkgKgotCQkgKiBNYWNzIHdpdGggaW50ZXJuYWwgbW9kZW1zIGdlbmVyYWxseSBkbyBoYXZlIGJvdGggUlRTCi0JCSAqIGFuZCBEVFIgd2lyZWQgdG8gdGhlIG1vZGVtLCBzbyBpbiB0aGF0IGNhc2Ugd2UgZG8KLQkJICogZHJvcCBSVFMuCi0JCSAqLwotCQlpZiAoaW5mby0+aXNfaW50ZXJuYWxfbW9kZW0pIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5SVFM7Ci0JCQlpbmZvLT5wZW5kcmVnc1s1XSAmPSB+UlRTOwotCQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0JCi0jaWZkZWYgQ0RUUkNUUwotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDRFRSQ1RTKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gfkRUUjsKLQkJaW5mby0+cGVuZHJlZ3NbNV0gJj0gfkRUUjsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0jZW5kaWYgLyogQ0RUUkNUUyAqLwotfQotCi1zdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotCXByaW50ayhLRVJOX0RFQlVHICJ1bnRocm90dGxlICVzOiAlZC4uLi5cbiIsCi0JCQl0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCi0JCXJldHVybjsKLQotCWlmIChJX0lYT0ZGKHR0eSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGluZm8tPnhfY2hhcikKLQkJCWluZm8tPnhfY2hhciA9IDA7Ci0JCWVsc2UgewotCQkJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOwotCQkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCi0JCQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChDX0NSVFNDVFModHR5KSAmJiBpbmZvLT5pc19pbnRlcm5hbF9tb2RlbSkgewotCQkvKiBBc3NlcnQgUlRTIGxpbmUgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaW5mby0+Y3VycmVnc1s1XSB8PSBSVFM7Ci0JCWluZm8tPnBlbmRyZWdzWzVdIHw9IFJUUzsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLSNpZmRlZiBDRFRSQ1RTCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENEVFJDVFMpIHsKLQkJLyogQXNzZXJ0IERUUiBsaW5lICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWluZm8tPmN1cnJlZ3NbNV0gfD0gRFRSOwotCQlpbmZvLT5wZW5kcmVnc1s1XSB8PSBEVFI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX2lvY3RsKCkgYW5kIGZyaWVuZHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwotICAKLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAtRUZBVUxUOwotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnR5cGUgPSBpbmZvLT50eXBlOwotCXRtcC5saW5lID0gaW5mby0+bGluZTsKLQl0bXAucG9ydCA9IGluZm8tPnBvcnQ7Ci0JdG1wLmlycSA9IGluZm8tPmlycTsKLQl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKLQl0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZF9iYXNlOwotCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OwotCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7Ci0JdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7Ci0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sCi0JCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwotCXN0cnVjdCBtYWNfc2VyaWFsIG9sZF9pbmZvOwotCWludCAJCQlyZXR2YWwgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLG5ld19pbmZvLHNpemVvZihuZXdfc2VyaWFsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW9sZF9pbmZvID0gKmluZm87Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8Ci0JCSAgICAobmV3X3NlcmlhbC50eXBlICE9IGluZm8tPnR5cGUpIHx8Ci0JCSAgICAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKLQkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5aSUxPR19VU1JfTUFTSykgIT0KLQkJICAgICAoaW5mby0+ZmxhZ3MgJiB+WklMT0dfVVNSX01BU0spKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5aSUxPR19VU1JfTUFTSykgfAotCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgWklMT0dfVVNSX01BU0spKTsKLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCQlnb3RvIGNoZWNrX2FuZF9leGl0OwotCX0KLQotCWlmIChpbmZvLT5jb3VudCA+IDEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKgotCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KLQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCi0JICovCi0KLQlpbmZvLT5iYXVkX2Jhc2UgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKLQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+WklMT0dfRkxBR1MpIHwKLQkJCShuZXdfc2VyaWFsLmZsYWdzICYgWklMT0dfRkxBR1MpKTsKLQlpbmZvLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOwotCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheTsKLQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdDsKLQotY2hlY2tfYW5kX2V4aXQ6Ci0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpCi0JCXJldHZhbCA9IHNldHVwX3NjYyhpbmZvKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KLSAqCi0gKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5Ci0gKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKLSAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgotICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCi0gKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKLSAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAotICovCi1zdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sIHVuc2lnbmVkIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gKHN0YXR1cyAmIFR4X0JVRl9FTVApPyBUSU9DU0VSX1RFTVQ6IDA7Ci0JcmV0dXJuIHB1dF91c2VyKHN0YXR1cyx2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBjaGFyIGNvbnRyb2wsIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQlpZiAoaW5mby0+a2dkYl9jaGFubmVsKQotCQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWNvbnRyb2wgPSBpbmZvLT5jdXJyZWdzWzVdOwotCXN0YXR1cyA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAgICAoKGNvbnRyb2wgJiBSVFMpID8gVElPQ01fUlRTOiAwKQotCQl8ICgoY29udHJvbCAmIERUUikgPyBUSU9DTV9EVFI6IDApCi0JCXwgKChzdGF0dXMgICYgRENEKSA/IFRJT0NNX0NBUjogMCkKLQkJfCAoKHN0YXR1cyAgJiBDVFMpID8gMDogVElPQ01fQ1RTKTsKLX0KLQotc3RhdGljIGludCByc190aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGludCBhcmcsIGJpdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybiAtRUlPOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoc2V0ICYgVElPQ01fUlRTKQotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFJUUzsKLQlpZiAoc2V0ICYgVElPQ01fRFRSKQotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IERUUjsKLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCi0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gflJUUzsKLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCi0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gfkRUUjsKLQotCWluZm8tPnBlbmRyZWdzWzVdID0gaW5mby0+Y3VycmVnc1s1XTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiByc19icmVhayAtIHR1cm4gdHJhbnNtaXQgYnJlYWsgY29uZGl0aW9uIG9uL29mZgotICovCi1zdGF0aWMgdm9pZCByc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19icmVhayIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWlmIChicmVha19zdGF0ZSA9PSAtMSkKLQkJaW5mby0+Y3VycmVnc1s1XSB8PSBTTkRfQlJLOwotCWVsc2UKLQkJaW5mby0+Y3VycmVnc1s1XSAmPSB+U05EX0JSSzsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCi0JICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkpIHsKLQkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkgICAgcmV0dXJuIC1FSU87Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywKLQkJCQkJKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwotCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLAotCQkJCQkoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7Ci0JCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGluZm8sICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKLQotCQljYXNlIFRJT0NTRVJHU1RSVUNUOgotCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IG1hY19zZXJpYWwgX191c2VyICopIGFyZywKLQkJCQkJIGluZm8sIHNpemVvZihzdHJ1Y3QgbWFjX3NlcmlhbCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQgd2FzX3N0b3BwZWQ7Ci0KLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCQlyZXR1cm47Ci0Jd2FzX3N0b3BwZWQgPSBpbmZvLT50eF9zdG9wcGVkOwotCi0JY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQotCWlmICh3YXNfc3RvcHBlZCAmJiAhaW5mby0+dHhfc3RvcHBlZCkgewotCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQlyc19zdGFydCh0dHkpOwotCX0KLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfY2xvc2UoKQotICogCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLgotICogV2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jbG9zZSIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JT1BOREJHKCJyc19jbG9zZSB0dHlTJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKLQlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7Ci0JCS8qCi0JCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5Ci0JCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCXByaW50ayhLRVJOX0VSUiAicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCAiCi0JCQkJImlzIDEsIGluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7Ci0JCWluZm8tPmNvdW50ID0gMTsKLQl9Ci0JaWYgKC0taW5mby0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgIgotCQkJCSJ0dHlTJWQ6ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0JCWluZm8tPmNvdW50ID0gMDsKLQl9Ci0JaWYgKGluZm8tPmNvdW50KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlpbmZvLT5mbGFncyB8PSBaSUxPR19DTE9TSU5HOwotCS8qCi0JICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCi0JICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KLQkgKi8KLQlPUE5EQkcoIndhaXRpbmcgZW5kIG9mIFR4Li4uICh0aW1lb3V0OiVkKVxuIiwgaW5mby0+Y2xvc2luZ193YWl0KTsKLQl0dHktPmNsb3NpbmcgPSAxOwotCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gWklMT0dfQ0xPU0lOR19XQUlUX05PTkUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKgotCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQotCSAqIGRpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCByZWNlaXZlIGludGVycnVwdHMuCi0JICovCi0JaW5mby0+Y3VycmVnc1szXSAmPSB+UnhFTkFCTEU7Ci0JaW5mby0+cGVuZHJlZ3NbM10gPSBpbmZvLT5jdXJyZWdzWzNdOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsIGluZm8tPmN1cnJlZ3NbM10pOwotCWluZm8tPmN1cnJlZ3NbMV0gJj0gfigweDE4KTsJLyogZGlzYWJsZSBhbnkgcnggaW50cyAqLwotCWluZm8tPnBlbmRyZWdzWzFdID0gaW5mby0+Y3VycmVnc1sxXTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxLCBpbmZvLT5jdXJyZWdzWzFdKTsKLQlaU19DTEVBUkZJRk8oaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFNDQyB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkLgotCQkgKi8KLQkJT1BOREJHKCJ3YWl0aW5nIGVuZCBvZiBSeC4uLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJcnNfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0Jc2h1dGRvd24oaW5mbyk7Ci0JLyogcmVzdG9yZSBmbGFncyBub3cgc2luY2Ugc2h1dGRvd24oKSB3aWxsIGhhdmUgZGlzYWJsZWQgdGhpcyBwb3J0J3MKLQkgICBzcGVjaWZpYyBpcnFzICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCi0JCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT50dHkgPSAwOwotCi0JaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewotCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKLQkJfQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci0JfQotCWluZm8tPmZsYWdzICY9IH4oWklMT0dfTk9STUFMX0FDVElWRXxaSUxPR19DTE9TSU5HKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOwotfQotCi0vKgotICogcnNfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5Ci0gKi8KLXN0YXRpYyB2b2lkIHJzX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dhaXRfdW50aWxfc2VudCIpKQotCQlyZXR1cm47Ci0KLS8qCXByaW50aygicnNfd2FpdF91bnRpbF9zZW50LCB0aW1lb3V0OiVkLCB0dHlfc3RvcHBlZDolZCwgdHhfc3RvcHBlZDolZFxuIiwKLQkJCXRpbWVvdXQsIHR0eS0+c3RvcHBlZCwgaW5mby0+dHhfc3RvcHBlZCk7Ci0qLwotCW9yaWdfamlmZmllcyA9IGppZmZpZXM7Ci0JLyoKLQkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KLQkgKiBzZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gIFRoZSBjaGVjawotCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KLQkgKi8KLQlpZiAoaW5mby0+dGltZW91dCA8PSBIWi81MCkgewotCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGludmFsaWQgaW5mby0+dGltZW91dD0lZFxuIiwKLQkJCQkgICAgaW5mby0+dGltZW91dCk7Ci0JCWluZm8tPnRpbWVvdXQgPSBIWi81MCsxOwotCX0KLQotCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFovNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7Ci0JY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKLQlpZiAoY2hhcl90aW1lID4gSFopIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFjc2VyaWFsOiBjaGFyX3RpbWUgJWxkID5IWiAhISFcbiIsCi0JCQkJICAgIGNoYXJfdGltZSk7Ci0JCWNoYXJfdGltZSA9IDE7Ci0JfSBlbHNlIGlmIChjaGFyX3RpbWUgPT0gMCkKLQkJY2hhcl90aW1lID0gMTsKLQlpZiAodGltZW91dCkKLQkJY2hhcl90aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywgY2hhcl90aW1lLCB0aW1lb3V0KTsKLQl3aGlsZSAoKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSkgJiBBTExfU05UKSA9PSAwKSB7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQotCQkJYnJlYWs7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotfQotCi0vKgotICogcnNfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KLSAqLwotc3RhdGljIHZvaWQgcnNfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaGFuZ3VwIikpCi0JCXJldHVybjsKLQotCXJzX2ZsdXNoX2J1ZmZlcih0dHkpOwotCXNodXRkb3duKGluZm8pOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT5jb3VudCA9IDA7Ci0JaW5mby0+ZmxhZ3MgJj0gflpJTE9HX05PUk1BTF9BQ1RJVkU7Ci0JaW5mby0+dHR5ID0gMDsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX29wZW4oKSBhbmQgZnJpZW5kcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKLQkJCSAgIHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7Ci0JaW50CQlyZXR2YWw7Ci0JaW50CQlkb19jbG9jYWwgPSAwOwotCi0JLyoKLQkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCi0JICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCi0JICovCi0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfQ0xPU0lORykgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JLyoKLQkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAotCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KLQkgKi8KLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAotCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCWluZm8tPmZsYWdzIHw9IFpJTE9HX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCWRvX2Nsb2NhbCA9IDE7Ci0KLQkvKgotCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCi0JICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KLQkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0Ci0JICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCi0JICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KLQkgKi8KLQlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlPUE5EQkcoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eVMlZCwgY291bnQgPSAlZFxuIiwKLQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotCXNwaW5fbG9ja19pcnEoJmluZm8tPmxvY2spOwotCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgCi0JCWluZm8tPmNvdW50LS07Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5sb2NrKTsKLQlpbmZvLT5ibG9ja2VkX29wZW4rKzsKLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxKCZpbmZvLT5sb2NrKTsKLQkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKLQkJICAgICFpbmZvLT5pc19pcmRhKQotCQkJenNfcnRzZHRyKGluZm8sIDEpOwotCQlzcGluX3VubG9ja19pcnEoJmluZm8tPmxvY2spOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAotCQkgICAgIShpbmZvLT5mbGFncyAmIFpJTE9HX0lOSVRJQUxJWkVEKSkgewotCQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghKGluZm8tPmZsYWdzICYgWklMT0dfQ0xPU0lORykgJiYKLQkJICAgIChkb19jbG9jYWwgfHwgKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCkgJiBEQ0QpKSkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JCU9QTkRCRygiYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlTJWQsIGNvdW50ID0gJWRcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCWluZm8tPmNvdW50Kys7Ci0JaW5mby0+YmxvY2tlZF9vcGVuLS07Ci0JT1BOREJHKCJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eVMlZCwgY291bnQgPSAlZFxuIiwKLQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JaW5mby0+ZmxhZ3MgfD0gWklMT0dfTk9STUFMX0FDVElWRTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAotICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBaSUxPRyBzdHJ1Y3R1cmUgaW50bwotICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKLSAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCByc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbAkqaW5mbzsKLQlpbnQgCQkJcmV0dmFsLCBsaW5lOwotCXVuc2lnbmVkIGxvbmcJCXBhZ2U7Ci0KLQlsaW5lID0gdHR5LT5pbmRleDsKLQlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSB6c19jaGFubmVsc19mb3VuZCkpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWluZm8gPSB6c19zb2Z0ICsgbGluZTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX29wZW4iKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JT1BOREJHKCJyc19vcGVuICVzLCBjb3VudCA9ICVkLCB0dHk9JXBcbiIsIHR0eS0+bmFtZSwKLQkgICAgICAgaW5mby0+Y291bnQsIHR0eSk7Ci0KLQlpbmZvLT5jb3VudCsrOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotCWluZm8tPnR0eSA9IHR0eTsKLQotCWlmICghdG1wX2J1ZikgewotCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIXBhZ2UpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKHRtcF9idWYpCi0JCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCWVsc2UKLQkJCXRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHBvcnQgaXMgdGhlIG1pZGRsZSBvZiBjbG9zaW5nLCBiYWlsIG91dCBub3cKLQkgKi8KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAotCSAgICAoaW5mby0+ZmxhZ3MgJiBaSUxPR19DTE9TSU5HKSkgewotCQlpZiAoaW5mby0+ZmxhZ3MgJiBaSUxPR19DTE9TSU5HKQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCS8qCi0JICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKLQkgKi8KLQotCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOwotCWlmIChyZXR2YWwpIHsKLQkJT1BOREJHKCJyc19vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKLQkJCXJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCi0JaWYgKHNlcmNvbnMuY2ZsYWcgJiYgc2VyY29ucy5pbmRleCA9PSBsaW5lKSB7Ci0JCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IHNlcmNvbnMuY2ZsYWc7Ci0JCXNlcmNvbnMuY2ZsYWcgPSAwOwotCQljaGFuZ2Vfc3BlZWQoaW5mbywgMCk7Ci0JfQotI2VuZGlmCi0KLQlPUE5EQkcoInJzX29wZW4gJXMgc3VjY2Vzc2Z1bC4uLlxuIiwgdHR5LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRmluYWxseSwgcm91dGluZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwgZHJpdmVyLiAqLwotCi1zdGF0aWMgdm9pZCBzaG93X3NlcmlhbF92ZXJzaW9uKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXJNYWMgWjg1MzAgc2VyaWFsIGRyaXZlciB2ZXJzaW9uICIgTUFDU0VSSUFMX1ZFUlNJT04gIlxuIik7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIG9uZSBjaGFubmVsLCBib3RoIHRoZSBtYWNfc2VyaWFsIGFuZCBtYWNfenNjaGFubmVsCi0gKiBzdHJ1Y3RzLiAgV2UgdXNlIHRoZSBkZXZfbm9kZSBmaWVsZCBvZiB0aGUgbWFjX3NlcmlhbCBzdHJ1Y3QuCi0gKi8KLXN0YXRpYyBpbnQKLWNoYW5faW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqenNzLCBzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqenNfY2hhbiwKLQkgIHN0cnVjdCBtYWNfenNjaGFubmVsICp6c19jaGFuX2EpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjaCA9IHpzcy0+ZGV2X25vZGU7Ci0JY2hhciAqY29ubjsKLQlpbnQgbGVuOwotCXN0cnVjdCBzbG90X25hbWVzX3Byb3AgewotCQlpbnQJY291bnQ7Ci0JCWNoYXIJbmFtZVsxXTsKLQl9ICpzbG90czsKLQotCXpzcy0+aXJxID0gY2gtPmludHJzWzBdLmxpbmU7Ci0JenNzLT5oYXNfZG1hID0gMDsKLSNpZiAhZGVmaW5lZChDT05GSUdfS0dEQikgJiYgZGVmaW5lZChTVVBQT1JUX1NFUklBTF9ETUEpCi0JaWYgKGNoLT5uX2FkZHJzID49IDMgJiYgY2gtPm5faW50cnMgPT0gMykKLQkJenNzLT5oYXNfZG1hID0gMTsKLSNlbmRpZgotCXpzcy0+ZG1hX2luaXR0ZWQgPSAwOwotCi0JenNfY2hhbi0+Y29udHJvbCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCi0JCWlvcmVtYXAoY2gtPmFkZHJzWzBdLmFkZHJlc3MsIDB4MTAwMCk7Ci0JenNfY2hhbi0+ZGF0YSA9IHpzX2NoYW4tPmNvbnRyb2wgKyAweDEwOwotCXNwaW5fbG9ja19pbml0KCZ6c19jaGFuLT5sb2NrKTsKLQl6c19jaGFuLT5wYXJlbnQgPSB6c3M7Ci0JenNzLT56c19jaGFubmVsID0genNfY2hhbjsKLQl6c3MtPnpzX2NoYW5fYSA9IHpzX2NoYW5fYTsKLQotCS8qIHNldHVwIG1pc2MgdmFyYXJpYWJsZXMgKi8KLQl6c3MtPmtnZGJfY2hhbm5lbCA9IDA7Ci0KLQkvKiBGb3Igbm93LCB3ZSBhc3N1bWUgeW91IGVpdGhlciBoYXZlIGEgc2xvdC1uYW1lcyBwcm9wZXJ0eQotCSAqIHdpdGggIk1vZGVtIiBpbiBpdCwgb3IgeW91ciBjaGFubmVsIGlzIGNvbXBhdGlibGUgd2l0aAotCSAqICJjb2JhbHQiLiBNaWdodCBuZWVkIGFkZGl0aW9uYWwgZml4dXBzCi0JICovCi0JenNzLT5pc19pbnRlcm5hbF9tb2RlbSA9IGRldmljZV9pc19jb21wYXRpYmxlKGNoLCAiY29iYWx0Iik7Ci0JY29ubiA9IGdldF9wcm9wZXJ0eShjaCwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbik7Ci0JenNzLT5pc19pcmRhID0gY29ubiAmJiAoc3RyY21wKGNvbm4sICJpbmZyYXJlZCIpID09IDApOwotCXpzcy0+cG9ydF90eXBlID0gUE1BQ19TQ0NfQVNZTkM7Ci0JLyogMTk5OSBQb3dlcmJvb2sgRzMgaGFzIHNsb3QtbmFtZXMgcHJvcGVydHkgaW5zdGVhZCAqLwotCXNsb3RzID0gKHN0cnVjdCBzbG90X25hbWVzX3Byb3AgKilnZXRfcHJvcGVydHkoY2gsICJzbG90LW5hbWVzIiwgJmxlbik7Ci0JaWYgKHNsb3RzICYmIHNsb3RzLT5jb3VudCA+IDApIHsKLQkJaWYgKHN0cmNtcChzbG90cy0+bmFtZSwgIklyREEiKSA9PSAwKQotCQkJenNzLT5pc19pcmRhID0gMTsKLQkJZWxzZSBpZiAoc3RyY21wKHNsb3RzLT5uYW1lLCAiTW9kZW0iKSA9PSAwKQotCQkJenNzLT5pc19pbnRlcm5hbF9tb2RlbSA9IDE7Ci0JfQotCWlmICh6c3MtPmlzX2lyZGEpCi0JCXpzcy0+cG9ydF90eXBlID0gUE1BQ19TQ0NfSVJEQTsKLQlpZiAoenNzLT5pc19pbnRlcm5hbF9tb2RlbSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGkyY19tb2RlbSA9IGZpbmRfZGV2aWNlcygiaTJjLW1vZGVtIik7Ci0JCWlmIChpMmNfbW9kZW0pIHsKLQkJCWNoYXIqIG1pZCA9IGdldF9wcm9wZXJ0eShpMmNfbW9kZW0sICJtb2RlbS1pZCIsIE5VTEwpOwotCQkJaWYgKG1pZCkgc3dpdGNoKCptaWQpIHsKLQkJCWNhc2UgMHgwNCA6Ci0JCQljYXNlIDB4MDUgOgotCQkJY2FzZSAweDA3IDoKLQkJCWNhc2UgMHgwOCA6Ci0JCQljYXNlIDB4MGIgOgotCQkJY2FzZSAweDBjIDoKLQkJCQl6c3MtPnBvcnRfdHlwZSA9IFBNQUNfU0NDX0kyUzE7Ci0JCQl9Ci0JCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGkyYy1tb2RlbSBkZXRlY3RlZCwgaWQ6ICVkXG4iLAotCQkJCW1pZCA/ICgqbWlkKSA6IDApOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFjc2VyaWFsOiBzZXJpYWwgbW9kZW0gZGV0ZWN0ZWRcbiIpOwotCQl9Ci0JfQotCi0Jd2hpbGUgKHpzcy0+aGFzX2RtYSkgewotCQl6c3MtPmRtYV9wcml2ID0gTlVMTDsKLQkJLyogaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCB0d28gYWRkcmVzc2VzIGFyZSB0aGUKLQkJICAgRE1BIGNvbnRyb2xsZXJzICovCi0JCXpzcy0+dHhfZG1hID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICopCi0JCQlpb3JlbWFwKGNoLT5hZGRyc1tjaC0+bl9hZGRycyAtIDJdLmFkZHJlc3MsIDB4MTAwKTsKLQkJenNzLT5yeCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbWFjX2RtYSAqKQotCQkJaW9yZW1hcChjaC0+YWRkcnNbY2gtPm5fYWRkcnMgLSAxXS5hZGRyZXNzLCAweDEwMCk7Ci0JCXpzcy0+dHhfZG1hX2lycSA9IGNoLT5pbnRyc1sxXS5saW5lOwotCQl6c3MtPnJ4X2RtYV9pcnEgPSBjaC0+aW50cnNbMl0ubGluZTsKLQkJc3Bpbl9sb2NrX2luaXQoJnpzcy0+cnhfZG1hX2xvY2spOwotCQlicmVhazsKLQl9Ci0KLQlpbml0X3RpbWVyKCZ6c3MtPnBvd2VydXBfdGltZXIpOwotCXpzcy0+cG93ZXJ1cF90aW1lci5mdW5jdGlvbiA9IHBvd2VydXBfZG9uZTsKLQl6c3MtPnBvd2VydXBfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB6c3M7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAvcHJvYyBmcyByb3V0aW5lcy4gVE9ETzogQWRkIHN0YXR1cyBsaW5lcyAmIGVycm9yIHN0YXRzCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1saW5lX2luZm8oY2hhciAqYnVmLCBzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbykKLXsKLQlpbnQJCXJldD0wOwotCXVuc2lnbmVkIGNoYXIqIGNvbm5lY3RvcjsKLQlpbnQgbGVucDsKLQotCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVkOiBwb3J0OjB4JVggaXJxOiVkIiwgaW5mby0+bGluZSwgaW5mby0+cG9ydCwgaW5mby0+aXJxKTsKLQotCWNvbm5lY3RvciA9IGdldF9wcm9wZXJ0eShpbmZvLT5kZXZfbm9kZSwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbnApOwotCWlmIChjb25uZWN0b3IpCi0JCXJldCs9c3ByaW50ZihidWYrcmV0LCIgY29uOiVzICIsIGNvbm5lY3Rvcik7Ci0JaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCWlmICghY29ubmVjdG9yKQotCQkJcmV0Kz1zcHJpbnRmKGJ1ZityZXQsIiBjb246Iik7Ci0JCXJldCs9c3ByaW50ZihidWYrcmV0LCIlcyIsICIgKGludGVybmFsIG1vZGVtKSIpOwotCX0KLQlpZiAoaW5mby0+aXNfaXJkYSkgewotCQlpZiAoIWNvbm5lY3RvcikKLQkJCXJldCs9c3ByaW50ZihidWYrcmV0LCIgY29uOiIpOwotCQlyZXQrPXNwcmludGYoYnVmK3JldCwiJXMiLCAiIChJckRBKSIpOwotCX0KLQlyZXQrPXNwcmludGYoYnVmK3JldCwiXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBtYWNzZXJpYWxfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgbCwgbGVuID0gMDsKLQlvZmZfdAliZWdpbiA9IDA7Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm87Ci0KLQlsZW4gKz0gc3ByaW50ZihwYWdlLCAic2VyaW5mbzoxLjAgZHJpdmVyOiIgTUFDU0VSSUFMX1ZFUlNJT04gIlxuIik7Ci0JZm9yIChpbmZvID0genNfY2hhaW47IGluZm8gJiYgbGVuIDwgNDAwMDsgaW5mbyA9IGluZm8tPnpzX25leHQpIHsKLQkJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCBpbmZvKTsKLQkJbGVuICs9IGw7Ci0JCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChsZW4rYmVnaW4gPCBvZmYpIHsKLQkJCWJlZ2luICs9IGxlbjsKLQkJCWxlbiA9IDA7Ci0JCX0KLQl9Ci0JKmVvZiA9IDE7Ci1kb25lOgotCWlmIChvZmYgPj0gbGVuK2JlZ2luKQotCQlyZXR1cm4gMDsKLQkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7Ci0JcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7Ci19Ci0KLS8qIEFzayB0aGUgUFJPTSBob3cgbWFueSBaODUzMHMgd2UgaGF2ZSBhbmQgaW5pdGlhbGl6ZSB0aGVpciB6c19jaGFubmVscyAqLwotc3RhdGljIHZvaWQKLXByb2JlX3NjY3Modm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgKmNoOwotCXN0cnVjdCBtYWNfc2VyaWFsICoqcHA7Ci0JaW50IG4sIGNoaXAsIG5jaGFuOwotCXN0cnVjdCBtYWNfenNjaGFubmVsICp6c19jaGFuOwotCWludCBjaGFuX2FfaW5kZXg7Ci0KLQluID0gMDsKLQlwcCA9ICZ6c19jaGFpbjsKLQl6c19jaGFuID0genNfY2hhbm5lbHM7Ci0JZm9yIChkZXYgPSBmaW5kX2RldmljZXMoImVzY2MiKTsgZGV2ICE9IDA7IGRldiA9IGRldi0+bmV4dCkgewotCQluY2hhbiA9IDA7Ci0JCWNoaXAgPSBuOwotCQlpZiAobiA+PSBOVU1fQ0hBTk5FTFMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvcnJ5LCBjYW4ndCB1c2UgJXM6IG5vIG1vcmUgIgotCQkJCQkgICAgImNoYW5uZWxzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQljaGFuX2FfaW5kZXggPSAwOwotCQlmb3IgKGNoID0gZGV2LT5jaGlsZDsgY2ggIT0gMDsgY2ggPSBjaC0+c2libGluZykgewotCQkJaWYgKG5jaGFuID49IDIpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTQ0M6IE9ubHkgMiBjaGFubmVscyBwZXIgIgotCQkJCQkiY2hpcCBhcmUgc3VwcG9ydGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaC0+bl9hZGRycyA8IDEgfHwgKGNoIC0+bl9pbnRycyA8IDEpKSB7Ci0JCQkJcHJpbnRrKCJDYW4ndCB1c2UgJXM6ICVkIGFkZHJzICVkIGludHJzXG4iLAotCQkJCSAgICAgIGNoLT5mdWxsX25hbWUsIGNoLT5uX2FkZHJzLCBjaC0+bl9pbnRycyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFRoZSBjaGFubmVsIHdpdGggdGhlIGhpZ2hlciBhZGRyZXNzCi0JCQkgICB3aWxsIGJlIHRoZSBBIHNpZGUuICovCi0JCQlpZiAobmNoYW4gPiAwICYmCi0JCQkgICAgY2gtPmFkZHJzWzBdLmFkZHJlc3MKLQkJCSAgICA+IHpzX3NvZnRbbi0xXS5kZXZfbm9kZS0+YWRkcnNbMF0uYWRkcmVzcykKLQkJCQljaGFuX2FfaW5kZXggPSAxOwotCi0JCQkvKiBtaW5pbWFsIGluaXRpYWxpemF0aW9uIGZvciBub3cgKi8KLQkJCXpzX3NvZnRbbl0uZGV2X25vZGUgPSBjaDsKLQkJCSpwcCA9ICZ6c19zb2Z0W25dOwotCQkJcHAgPSAmenNfc29mdFtuXS56c19uZXh0OwotCQkJKytuY2hhbjsKLQkJCSsrbjsKLQkJfQotCQlpZiAobmNoYW4gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHNldCB1cCBBIHNpZGUgKi8KLQkJaWYgKGNoYW5faW5pdCgmenNfc29mdFtjaGlwICsgY2hhbl9hX2luZGV4XSwgenNfY2hhbiwgenNfY2hhbikpCi0JCQljb250aW51ZTsKLQkJKyt6c19jaGFuOwotCi0JCS8qIHNldCB1cCBCIHNpZGUsIGlmIGl0IGV4aXN0cyAqLwotCQlpZiAobmNoYW4gPiAxKQotCQkJaWYgKGNoYW5faW5pdCgmenNfc29mdFtjaGlwICsgMSAtIGNoYW5fYV9pbmRleF0sCi0JCQkJICB6c19jaGFuLCB6c19jaGFuIC0gMSkpCi0JCQkJY29udGludWU7Ci0JCSsrenNfY2hhbjsKLQl9Ci0JKnBwID0gMDsKLQotCXpzX2NoYW5uZWxzX2ZvdW5kID0gbjsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCWlmIChuKQotCQlwbXVfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJnNlcmlhbF9zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KLX0KLQotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0gewotCS5vcGVuID0gcnNfb3BlbiwKLQkuY2xvc2UgPSByc19jbG9zZSwKLQkud3JpdGUgPSByc193cml0ZSwKLQkuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFycywKLQkud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlciwKLQkuZmx1c2hfYnVmZmVyID0gcnNfZmx1c2hfYnVmZmVyLAotCS5pb2N0bCA9IHJzX2lvY3RsLAotCS50aHJvdHRsZSA9IHJzX3Rocm90dGxlLAotCS51bnRocm90dGxlID0gcnNfdW50aHJvdHRsZSwKLQkuc2V0X3Rlcm1pb3MgPSByc19zZXRfdGVybWlvcywKLQkuc3RvcCA9IHJzX3N0b3AsCi0JLnN0YXJ0ID0gcnNfc3RhcnQsCi0JLmhhbmd1cCA9IHJzX2hhbmd1cCwKLQkuYnJlYWtfY3RsID0gcnNfYnJlYWssCi0JLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKLQkucmVhZF9wcm9jID0gbWFjc2VyaWFsX3JlYWRfcHJvYywKLQkudGlvY21nZXQgPSByc190aW9jbWdldCwKLQkudGlvY21zZXQgPSByc190aW9jbXNldCwKLX07Ci0KLXN0YXRpYyBpbnQgbWFjc2VyaWFsX2luaXQodm9pZCkKLXsKLQlpbnQgY2hhbm5lbCwgaTsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQotCS8qIEZpbmQgb3V0IGhvdyBtYW55IFo4NTMwIFNDQ3Mgd2UgaGF2ZSAqLwotCWlmICh6c19jaGFpbiA9PSAwKQotCQlwcm9iZV9zY2NzKCk7Ci0KLQlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcih6c19jaGFubmVsc19mb3VuZCk7Ci0JaWYgKCFzZXJpYWxfZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFhYWCBhc3N1bWUgaXQncyBhIHBvd2VyYm9vayBpZiB3ZSBoYXZlIGEgdmlhLXBtdQotCSAqIAotCSAqIFRoaXMgaXMgT0sgZm9yIGNvcmU5OSBtYWNoaW5lcyBhcyB3ZWxsLgotCSAqLwotCWlzX3Bvd2VyYm9vayA9IGZpbmRfZGV2aWNlcygidmlhLXBtdSIpICE9IDA7Ci0KLQkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGVhY2ggb25lCi0JICogV2UgYWxzbyByZXF1ZXN0IHRoZSBPRiByZXNvdXJjZXMgaGVyZSBhcyBwcm9iZV9zY2NzKCkKLQkgKiBtaWdodCBiZSBjYWxsZWQgdG9vIGVhcmx5IGZvciB0aGF0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IHpzX2NoYW5uZWxzX2ZvdW5kOyArK2kpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlKiBjaCA9IHpzX3NvZnRbaV0uZGV2X25vZGU7Ci0JCWlmICghcmVxdWVzdF9PRl9yZXNvdXJjZShjaCwgMCwgTlVMTCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWFjc2VyaWFsOiBjYW4ndCByZXF1ZXN0IElPIHJlc291cmNlICFcbiIpOwotCQkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlpZiAoenNfc29mdFtpXS5oYXNfZG1hKSB7Ci0JCQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoY2gsIGNoLT5uX2FkZHJzIC0gMiwgIiAodHggZG1hKSIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJtYWNzZXJpYWw6IGNhbid0IHJlcXVlc3QgVFggRE1BIHJlc291cmNlICFcbiIpOwotCQkJCXpzX3NvZnRbaV0uaGFzX2RtYSA9IDA7Ci0JCQkJZ290byBub19kbWE7Ci0JCQl9Ci0JCQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoY2gsIGNoLT5uX2FkZHJzIC0gMSwgIiAocnggZG1hKSIpKSB7Ci0JCQkJcmVsZWFzZV9PRl9yZXNvdXJjZShjaCwgY2gtPm5fYWRkcnMgLSAyKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm1hY3NlcmlhbDogY2FuJ3QgcmVxdWVzdCBSWCBETUEgcmVzb3VyY2UgIVxuIik7Ci0JCQkJenNfc29mdFtpXS5oYXNfZG1hID0gMDsKLQkJCQlnb3RvIG5vX2RtYTsKLQkJCX0KLQkJCWlmIChyZXF1ZXN0X2lycSh6c19zb2Z0W2ldLnR4X2RtYV9pcnEsIHJzX3R4ZG1hX2lycSwgMCwKLQkJCQkJIlNDQy10eGRtYSIsICZ6c19zb2Z0W2ldKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIm1hY3NlcmlhbDogY2FuJ3QgZ2V0IGlycSAlZFxuIiwKLQkJCQkgICAgICAgenNfc29mdFtpXS50eF9kbWFfaXJxKTsKLQkJCWRpc2FibGVfaXJxKHpzX3NvZnRbaV0udHhfZG1hX2lycSk7Ci0JCQlpZiAocmVxdWVzdF9pcnEoenNfc29mdFtpXS5yeF9kbWFfaXJxLCByc19yeGRtYV9pcnEsIDAsCi0JCQkJCSJTQ0MtcnhkbWEiLCAmenNfc29mdFtpXSkpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJtYWNzZXJpYWw6IGNhbid0IGdldCBpcnEgJWRcbiIsCi0JCQkJICAgICAgIHpzX3NvZnRbaV0ucnhfZG1hX2lycSk7Ci0JCQlkaXNhYmxlX2lycSh6c19zb2Z0W2ldLnJ4X2RtYV9pcnEpOwotCQl9Ci1ub19kbWE6CQkKLQkJaWYgKHJlcXVlc3RfaXJxKHpzX3NvZnRbaV0uaXJxLCByc19pbnRlcnJ1cHQsIDAsCi0JCQkJIlNDQyIsICZ6c19zb2Z0W2ldKSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWFjc2VyaWFsOiBjYW4ndCBnZXQgaXJxICVkXG4iLAotCQkJICAgICAgIHpzX3NvZnRbaV0uaXJxKTsKLQkJZGlzYWJsZV9pcnEoenNfc29mdFtpXS5pcnEpOwotCX0KLQotCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCi0JLyogTm90IGFsbCBvZiB0aGlzIGlzIGV4YWN0bHkgcmlnaHQgZm9yIHVzLiAqLwotCi0Jc2VyaWFsX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlzZXJpYWxfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJtYWNzZXJpYWwiOwotCXNlcmlhbF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzLyI7Ci0Jc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTIjsKLQlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKLQlzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OwotCXNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCXNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0Jc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KLQkJQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLQlzZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7Ci0JdHR5X3NldF9vcGVyYXRpb25zKHNlcmlhbF9kcml2ZXIsICZzZXJpYWxfb3BzKTsKLQotCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKQotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBjb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKLQotCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB6c19jaGFubmVsc19mb3VuZDsgKytjaGFubmVsKSB7Ci0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKHpzX3NvZnRbY2hhbm5lbF0ua2dkYl9jaGFubmVsKSB7Ci0JCQlrZ2RiX2ludGVycnVwdGlibGUoMSk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmCi0JCXpzX3NvZnRbY2hhbm5lbF0uY2xrX2Rpdmlzb3IgPSAxNjsKLS8qIC0tIHdlIGFyZSBub3Qgc3VyZSB0aGUgU0NDIGlzIHBvd2VyZWQgT04gYXQgdGhpcyBwb2ludAotIAkJenNfc29mdFtjaGFubmVsXS56c19iYXVkID0gZ2V0X3pzYmF1ZCgmenNfc29mdFtjaGFubmVsXSk7Ci0qLwotCQl6c19zb2Z0W2NoYW5uZWxdLnpzX2JhdWQgPSAzODQwMDsKLQotCQkvKiBJZiBjb25zb2xlIHNlcmlhbCBsaW5lLCB0aGVuIGVuYWJsZSBpbnRlcnJ1cHRzLiAqLwotCQlpZiAoenNfc29mdFtjaGFubmVsXS5pc19jb25zKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGNvbnNvbGUgbGluZSwgZW5hYmxpbmcgIgotCQkJCQkiaW50ZXJydXB0ICVkXG4iLCB6c19zb2Z0W2NoYW5uZWxdLmlycSk7Ci0JCQlwYW5pYygibWFjc2VyaWFsOiBjb25zb2xlIG5vdCBzdXBwb3J0ZWQgeWV0ICEiKTsKLQkJCXdyaXRlX3pzcmVnKHpzX3NvZnRbY2hhbm5lbF0uenNfY2hhbm5lbCwgUjEsCi0JCQkJICAgIChFWFRfSU5UX0VOQUIgfCBJTlRfQUxMX1J4IHwgVHhJTlRfRU5BQikpOwotCQkJd3JpdGVfenNyZWcoenNfc29mdFtjaGFubmVsXS56c19jaGFubmVsLCBSOSwKLQkJCQkgICAgKE5WIHwgTUlFKSk7Ci0JCX0KLQl9Ci0KLQlmb3IgKGluZm8gPSB6c19jaGFpbiwgaSA9IDA7IGluZm87IGluZm8gPSBpbmZvLT56c19uZXh0LCBpKyspCi0JewotCQl1bnNpZ25lZCBjaGFyKiBjb25uZWN0b3I7Ci0JCWludCBsZW5wOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQkJY29udGludWU7Ci0JCX0KLSNlbmRpZgotCQlpbmZvLT5tYWdpYyA9IFNFUklBTF9NQUdJQzsKLQkJaW5mby0+cG9ydCA9IChpbnQpIGluZm8tPnpzX2NoYW5uZWwtPmNvbnRyb2w7Ci0JCWluZm8tPmxpbmUgPSBpOwotCQlpbmZvLT50dHkgPSAwOwotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IDE2OwotCQlpbmZvLT50aW1lb3V0ID0gMDsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1MDsKLQkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAwMDsKLQkJaW5mby0+eF9jaGFyID0gMDsKLQkJaW5mby0+ZXZlbnQgPSAwOwotCQlpbmZvLT5jb3VudCA9IDA7Ci0JCWluZm8tPmJsb2NrZWRfb3BlbiA9IDA7Ci0JCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKLQkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKLQkJaW5mby0+dGltZW91dCA9IEhaOwotCQlwcmludGsoS0VSTl9JTkZPICJ0dHklMDJkIGF0IDB4JTA4eCAoaXJxID0gJWQpIiwgaW5mby0+bGluZSwgCi0JCQlpbmZvLT5wb3J0LCBpbmZvLT5pcnEpOwotCQlwcmludGsoIiBpcyBhIFo4NTMwIEVTQ0MiKTsKLQkJY29ubmVjdG9yID0gZ2V0X3Byb3BlcnR5KGluZm8tPmRldl9ub2RlLCAiQUFQTCxjb25uZWN0b3IiLCAmbGVucCk7Ci0JCWlmIChjb25uZWN0b3IpCi0JCQlwcmludGsoIiwgcG9ydCA9ICVzIiwgY29ubmVjdG9yKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKQotCQkJcHJpbnRrKCIgKGludGVybmFsIG1vZGVtKSIpOwotCQlpZiAoaW5mby0+aXNfaXJkYSkKLQkJCXByaW50aygiIChJckRBKSIpOwotCQlwcmludGsoIlxuIik7Ci0gCX0KLQl0bXBfYnVmID0gMDsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG1hY3NlcmlhbF9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQotCWZvciAoaW5mbyA9IHpzX2NoYWluLCBpID0gMDsgaW5mbzsgaW5mbyA9IGluZm8tPnpzX25leHQsIGkrKykKLQkJc2V0X3NjY19wb3dlcihpbmZvLCAwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCB6c19jaGFubmVsc19mb3VuZDsgKytpKSB7Ci0JCWZyZWVfaXJxKHpzX3NvZnRbaV0uaXJxLCAmenNfc29mdFtpXSk7Ci0JCWlmICh6c19zb2Z0W2ldLmhhc19kbWEpIHsKLQkJCWZyZWVfaXJxKHpzX3NvZnRbaV0udHhfZG1hX2lycSwgJnpzX3NvZnRbaV0pOwotCQkJZnJlZV9pcnEoenNfc29mdFtpXS5yeF9kbWFfaXJxLCAmenNfc29mdFtpXSk7Ci0JCX0KLQkJcmVsZWFzZV9PRl9yZXNvdXJjZSh6c19zb2Z0W2ldLmRldl9ub2RlLCAwKTsKLQkJaWYgKHpzX3NvZnRbaV0uaGFzX2RtYSkgewotCQkJc3RydWN0IGRldmljZV9ub2RlKiBjaCA9IHpzX3NvZnRbaV0uZGV2X25vZGU7Ci0JCQlyZWxlYXNlX09GX3Jlc291cmNlKGNoLCBjaC0+bl9hZGRycyAtIDIpOwotCQkJcmVsZWFzZV9PRl9yZXNvdXJjZShjaCwgY2gtPm5fYWRkcnMgLSAxKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOwotCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOwotCi0JaWYgKHRtcF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKLQkJdG1wX2J1ZiA9IDA7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLQlpZiAoenNfY2hhbm5lbHNfZm91bmQpCi0JCXBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZzZXJpYWxfc2xlZXBfbm90aWZpZXIpOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCi19Ci0KLW1vZHVsZV9pbml0KG1hY3NlcmlhbF9pbml0KTsKLW1vZHVsZV9leGl0KG1hY3NlcmlhbF9jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2lmIDAKLS8qCi0gKiByZWdpc3Rlcl9zZXJpYWwgYW5kIHVucmVnaXN0ZXJfc2VyaWFsIGFsbG93cyBmb3Igc2VyaWFsIHBvcnRzIHRvIGJlCi0gKiBjb25maWd1cmVkIGF0IHJ1bi10aW1lLCB0byBzdXBwb3J0IFBDTUNJQSBtb2RlbXMuCi0gKi8KLS8qIFBvd2VyTWFjOiBVbnVzZWQgYXQgdGhpcyB0aW1lLCBqdXN0IGhlcmUgdG8gbWFrZSB0aGluZ3MgbGluay4gKi8KLWludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgdW5yZWdpc3Rlcl9zZXJpYWwoaW50IGxpbmUpCi17Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFNlcmlhbCBjb25zb2xlIGRyaXZlcgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKLQotLyoKLSAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKLSAqCWFueSBwb3NzaWJsZSByZWFsIHVzZSBvZiB0aGUgcG9ydC4uLgotICovCi1zdGF0aWMgdm9pZCBzZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsCi0JCQkJIHVuc2lnbmVkIGNvdW50KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0genNfc29mdCArIGNvLT5pbmRleDsKLQlpbnQgaTsKLQotCS8qIFR1cm4gb2YgaW50ZXJydXB0cyBhbmQgZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSMSwgaW5mby0+Y3VycmVnc1sxXSAmIH5UeElOVF9FTkFCKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSNSwgaW5mby0+Y3VycmVnc1s1XSB8IFR4RU5BQiB8IFJUUyB8IERUUik7Ci0KLQlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCS8qIFdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gZW1wdHkuICovCi0JCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDApIHsKLQkJCWVpZWlvKCk7Ci0JCX0KLQotCQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgc1tpXSk7Ci0JCWlmIChzW2ldID09IDEwKSB7Ci0JCQl3aGlsZSAoKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCkgJiBUeF9CVUZfRU1QKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKQotCQkJCWVpZWlvKCk7Ci0KLQkJCXdyaXRlX3pzZGF0YShpbmZvLT56c19jaGFubmVsLCAxMyk7Ci0JCX0KLQl9Ci0KLQkvKiBSZXN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSMSwgaW5mby0+Y3VycmVnc1sxXSk7Ci0JLyogRG9uJ3QgZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKLQotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCi17Ci0JKmluZGV4ID0gYy0+aW5kZXg7Ci0JcmV0dXJuIHNlcmlhbF9kcml2ZXI7Ci19Ci0KLS8qCi0gKglTZXR1cCBpbml0aWFsIGJhdWQvYml0cy9wYXJpdHkuIFdlIGRvIHR3byB0aGluZ3MgaGVyZToKLSAqCS0gY29uc3RydWN0IGEgY2ZsYWcgc2V0dGluZyBmb3IgdGhlIGZpcnN0IHJzX29wZW4oKQotICoJLSBpbml0aWFsaXplIHRoZSBzZXJpYWwgcG9ydAotICoJUmV0dXJuIG5vbi16ZXJvIGlmIHdlIGRpZG4ndCBmaW5kIGEgc2VyaWFsIHBvcnQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHNlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQlpbnQJYmF1ZCA9IDM4NDAwOwotCWludAliaXRzID0gODsKLQlpbnQJcGFyaXR5ID0gJ24nOwotCWludAljZmxhZyA9IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7Ci0JaW50CWJyZzsKLQljaGFyCSpzOwotCWxvbmcJZmxhZ3M7Ci0KLQkvKiBGaW5kIG91dCBob3cgbWFueSBaODUzMCBTQ0NzIHdlIGhhdmUgKi8KLQlpZiAoenNfY2hhaW4gPT0gMCkKLQkJcHJvYmVfc2NjcygpOwotCi0JaWYgKHpzX2NoYWluID09IDApCi0JCXJldHVybiAtMTsKLQotCS8qIERvIHdlIGhhdmUgdGhlIGRldmljZSBhc2tlZCBmb3I/ICovCi0JaWYgKGNvLT5pbmRleCA+PSB6c19jaGFubmVsc19mb3VuZCkKLQkJcmV0dXJuIC0xOwotCWluZm8gPSB6c19zb2Z0ICsgY28tPmluZGV4OwotCi0Jc2V0X3NjY19wb3dlcihpbmZvLCAxKTsKLQotCS8qIFJlc2V0IHRoZSBjaGFubmVsICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjksIENIUkEpOwotCi0JaWYgKG9wdGlvbnMpIHsKLQkJYmF1ZCA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMsIE5VTEwsIDEwKTsKLQkJcyA9IG9wdGlvbnM7Ci0JCXdoaWxlKCpzID49ICcwJyAmJiAqcyA8PSAnOScpCi0JCQlzKys7Ci0JCWlmICgqcykKLQkJCXBhcml0eSA9ICpzKys7Ci0JCWlmICgqcykKLQkJCWJpdHMgICA9ICpzIC0gJzAnOwotCX0KLQotCS8qCi0JICoJTm93IGNvbnN0cnVjdCBhIGNmbGFnIHNldHRpbmcuCi0JICovCi0Jc3dpdGNoKGJhdWQpIHsKLQljYXNlIDEyMDA6Ci0JCWNmbGFnIHw9IEIxMjAwOwotCQlicmVhazsKLQljYXNlIDI0MDA6Ci0JCWNmbGFnIHw9IEIyNDAwOwotCQlicmVhazsKLQljYXNlIDQ4MDA6Ci0JCWNmbGFnIHw9IEI0ODAwOwotCQlicmVhazsKLQljYXNlIDk2MDA6Ci0JCWNmbGFnIHw9IEI5NjAwOwotCQlicmVhazsKLQljYXNlIDE5MjAwOgotCQljZmxhZyB8PSBCMTkyMDA7Ci0JCWJyZWFrOwotCWNhc2UgNTc2MDA6Ci0JCWNmbGFnIHw9IEI1NzYwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxMTUyMDA6Ci0JCWNmbGFnIHw9IEIxMTUyMDA7Ci0JCWJyZWFrOwotCWNhc2UgMzg0MDA6Ci0JZGVmYXVsdDoKLQkJY2ZsYWcgfD0gQjM4NDAwOwotCQlicmVhazsKLQl9Ci0Jc3dpdGNoKGJpdHMpIHsKLQljYXNlIDc6Ci0JCWNmbGFnIHw9IENTNzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIDg6Ci0JCWNmbGFnIHw9IENTODsKLQkJYnJlYWs7Ci0JfQotCXN3aXRjaChwYXJpdHkpIHsKLQljYXNlICdvJzogY2FzZSAnTyc6Ci0JCWNmbGFnIHw9IFBBUkVOQiB8IFBBUk9ERDsKLQkJYnJlYWs7Ci0JY2FzZSAnZSc6IGNhc2UgJ0UnOgotCQljZmxhZyB8PSBQQVJFTkI7Ci0JCWJyZWFrOwotCX0KLQljby0+Y2ZsYWcgPSBjZmxhZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIG1lbXNldChpbmZvLT5jdXJyZWdzLCAwLCBzaXplb2YoaW5mby0+Y3VycmVncykpOwotCi0JaW5mby0+enNfYmF1ZCA9IGJhdWQ7Ci0JaW5mby0+Y2xrX2Rpdmlzb3IgPSAxNjsKLQlzd2l0Y2ggKGluZm8tPnpzX2JhdWQpIHsKLQljYXNlIFpTX0NMT0NLLzE2OgkvKiAyMzA0MDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgxNkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQljYXNlIFpTX0NMT0NLLzMyOgkvKiAxMTUyMDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgzMkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbmZvLT5jdXJyZWdzWzRdID0gWDE2Q0xLOwotCQlpbmZvLT5jdXJyZWdzWzExXSA9IFRDQlIgfCBSQ0JSOwotCQlicmcgPSBCUFNfVE9fQlJHKGluZm8tPnpzX2JhdWQsIFpTX0NMT0NLL2luZm8tPmNsa19kaXZpc29yKTsKLQkJaW5mby0+Y3VycmVnc1sxMl0gPSAoYnJnICYgMjU1KTsKLQkJaW5mby0+Y3VycmVnc1sxM10gPSAoKGJyZyA+PiA4KSAmIDI1NSk7Ci0JCWluZm8tPmN1cnJlZ3NbMTRdID0gQlJFTkFCTDsKLQl9Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCWluZm8tPmN1cnJlZ3NbM10gJj0gflJ4TkJJVFNfTUFTSzsKLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeE5CSVRTX01BU0s7Ci0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng1OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NTsKLQkJYnJlYWs7Ci0JY2FzZSBDUzY6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng2OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NjsKLQkJYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng3OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NzsKLQkJYnJlYWs7Ci0JY2FzZSBDUzg6Ci0JZGVmYXVsdDogLyogZGVmYXVsdHMgdG8gOCBiaXRzICovCi0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng4OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4ODsKLQkJYnJlYWs7Ci0JfQotICAgICAgICBpbmZvLT5jdXJyZWdzWzVdIHw9IFR4RU5BQiB8IFJUUyB8IERUUjsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCi0JaW5mby0+Y3VycmVnc1s0XSAmPSB+KFNCX01BU0sgfCBQQVJfRU5BIHwgUEFSX0VWRU4pOwotCWlmIChjZmxhZyAmIENTVE9QQikgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMjsKLQl9IGVsc2UgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMTsKLQl9Ci0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWluZm8tPmN1cnJlZ3NbNF0gfD0gUEFSX0VOQTsKLQkJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKSB7Ci0JCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFBBUl9FVkVOOwotCQl9Ci0JfQotCWluZm8tPnBlbmRyZWdzWzRdID0gaW5mby0+Y3VycmVnc1s0XTsKLQotCWlmICghKGNmbGFnICYgQ0xPQ0FMKSkgewotCQlpZiAoIShpbmZvLT5jdXJyZWdzWzE1XSAmIERDRElFKSkKLQkJCWluZm8tPnJlYWRfcmVnX3plcm8gPSByZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApOwotCQlpbmZvLT5jdXJyZWdzWzE1XSB8PSBEQ0RJRTsKLQl9IGVsc2UKLQkJaW5mby0+Y3VycmVnc1sxNV0gJj0gfkRDRElFOwotCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKLQkJaW5mby0+Y3VycmVnc1sxNV0gfD0gQ1RTSUU7Ci0JCWlmICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIENUUykgIT0gMCkKLQkJCWluZm8tPnR4X3N0b3BwZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWluZm8tPmN1cnJlZ3NbMTVdICY9IH5DVFNJRTsKLQkJaW5mby0+dHhfc3RvcHBlZCA9IDA7Ci0JfQotCWluZm8tPnBlbmRyZWdzWzE1XSA9IGluZm8tPmN1cnJlZ3NbMTVdOwotCi0JLyogTG9hZCB1cCB0aGUgbmV3IHZhbHVlcyAqLwotCWxvYWRfenNyZWdzKGluZm8tPnpzX2NoYW5uZWwsIGluZm8tPmN1cnJlZ3MpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zID0gewotCS5uYW1lCQk9ICJ0dHlTIiwKLQkud3JpdGUJCT0gc2VyaWFsX2NvbnNvbGVfd3JpdGUsCi0JLmRldmljZQkJPSBzZXJpYWxfY29uc29sZV9kZXZpY2UsCi0JLnNldHVwCQk9IHNlcmlhbF9jb25zb2xlX3NldHVwLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CQk9IC0xLAotfTsKLQotLyoKLSAqCVJlZ2lzdGVyIGNvbnNvbGUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBtYWNfc2NjX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX2NvbnNvbGUoJnNlcmNvbnMpOwotfQotY29uc29sZV9pbml0Y2FsbChtYWNfc2NjX2NvbnNvbGVfaW5pdCk7Ci0KLSNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUgKi8KLQotI2lmZGVmIENPTkZJR19LR0RCCi0vKiBUaGVzZSBhcmUgZm9yIHJlY2VpdmluZyBhbmQgc2VuZGluZyBjaGFyYWN0ZXJzIHVuZGVyIHRoZSBrZ2RiCi0gKiBzb3VyY2UgbGV2ZWwga2VybmVsIGRlYnVnZ2VyLgotICovCi12b2lkIHB1dERlYnVnQ2hhcihjaGFyIGtnZGJfY2hhcikKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbiA9IHpzX2tnZGJjaGFuOwotCXdoaWxlICgocmVhZF96c3JlZyhjaGFuLCAwKSAmIFR4X0JVRl9FTVApID09IDApCi0JCXVkZWxheSg1KTsKLQl3cml0ZV96c2RhdGEoY2hhbiwga2dkYl9jaGFyKTsKLX0KLQotY2hhciBnZXREZWJ1Z0NoYXIodm9pZCkKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbiA9IHpzX2tnZGJjaGFuOwotCXdoaWxlKChyZWFkX3pzcmVnKGNoYW4sIDApICYgUnhfQ0hfQVYpID09IDApCi0JCWVpZWlvKCk7IC8qYmFycmllcigpOyovCi0JcmV0dXJuIHJlYWRfenNkYXRhKGNoYW4pOwotfQotCi12b2lkIGtnZGJfaW50ZXJydXB0aWJsZShpbnQgeWVzKQotewotCXN0cnVjdCBtYWNfenNjaGFubmVsICpjaGFuID0genNfa2dkYmNoYW47Ci0JaW50IG9uZSwgbmluZTsKLQluaW5lID0gcmVhZF96c3JlZyhjaGFuLCA5KTsKLQlpZiAoeWVzID09IDEpIHsKLQkJb25lID0gRVhUX0lOVF9FTkFCfElOVF9BTExfUng7Ci0JCW5pbmUgfD0gTUlFOwotCQlwcmludGsoInR1cm5pbmcgc2VyaWFsIGludHMgb25cbiIpOwotCX0gZWxzZSB7Ci0JCW9uZSA9IFJ4SU5UX0RJU0FCOwotCQluaW5lICY9IH5NSUU7Ci0JCXByaW50aygidHVybmluZyBzZXJpYWwgaW50cyBvZmZcbiIpOwotCX0KLQl3cml0ZV96c3JlZyhjaGFuLCAxLCBvbmUpOwotCXdyaXRlX3pzcmVnKGNoYW4sIDksIG5pbmUpOwotfQotCi0vKiBUaGlzIHNldHMgdXAgdGhlIHNlcmlhbCBwb3J0IHdlJ3JlIHVzaW5nLCBhbmQgdHVybnMgb24KLSAqIGludGVycnVwdHMgZm9yIHRoYXQgY2hhbm5lbCwgc28ga2dkYiBpcyB1c2FibGUgb25jZSB3ZSdyZSBkb25lLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQga2dkYl9jaGFuaW5pdChzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqbXMsIGludCBpbnRzb24sIGludCBicHMpCi17Ci0JaW50IGJyZzsKLQlpbnQgaSwgeDsKLQl2b2xhdGlsZSBjaGFyICpzY2NjID0gbXMtPmNvbnRyb2w7Ci0JYnJnID0gQlBTX1RPX0JSRyhicHMsIFpTX0NMT0NLLzE2KTsKLQlwcmludGsoInNldHRpbmcgYnBzIG9uIGtnZGIgbGluZSB0byAlZCBbYnJnPSV4XVxuIiwgYnBzLCBicmcpOwotCWZvciAoaSA9IDIwMDAwOyBpICE9IDA7IC0taSkgewotCQl4ID0gKnNjY2M7IGVpZWlvKCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2NjX2luaXR0YWIpOyArK2kpIHsKLQkJd3JpdGVfenNyZWcobXMsIHNjY19pbml0dGFiW2ldLCBzY2NfaW5pdHRhYltpKzFdKTsKLQkJaSsrOwotCX0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgYm9vdCB0aW1lIHRvIHByaW1lIHRoZSBrZ2RiIHNlcmlhbCBkZWJ1Z2dpbmcKLSAqIHNlcmlhbCBsaW5lLiAgVGhlICd0dHlfbnVtJyBhcmd1bWVudCBpcyAwIGZvciAvZGV2L3R0eWEgYW5kIDEKLSAqIGZvciAvZGV2L3R0eWIgd2hpY2ggaXMgZGV0ZXJtaW5lZCBpbiBzZXR1cF9hcmNoKCkgZnJvbSB0aGUKLSAqIGJvb3QgY29tbWFuZCBsaW5lIGZsYWdzLgotICogWFhYIGF0IHRoZSBtb21lbnQgcHJvYmFibHkgb25seSBjaGFubmVsIEEgd2lsbCB3b3JrCi0gKi8KLXZvaWQgX19pbml0IHpzX2tnZGJfaG9vayhpbnQgdHR5X251bSkKLXsKLQkvKiBGaW5kIG91dCBob3cgbWFueSBaODUzMCBTQ0NzIHdlIGhhdmUgKi8KLQlpZiAoenNfY2hhaW4gPT0gMCkKLQkJcHJvYmVfc2NjcygpOwotCi0Jc2V0X3NjY19wb3dlcigmenNfc29mdFt0dHlfbnVtXSwgMSk7Ci0KLQl6c19rZ2RiY2hhbiA9IHpzX3NvZnRbdHR5X251bV0uenNfY2hhbm5lbDsKLQl6c19zb2Z0W3R0eV9udW1dLmNoYW5nZV9uZWVkZWQgPSAwOwotCXpzX3NvZnRbdHR5X251bV0uY2xrX2Rpdmlzb3IgPSAxNjsKLQl6c19zb2Z0W3R0eV9udW1dLnpzX2JhdWQgPSAzODQwMDsKLQl6c19zb2Z0W3R0eV9udW1dLmtnZGJfY2hhbm5lbCA9IDE7ICAgICAvKiBUaGlzIHJ1bnMga2dkYiAqLwotCi0JLyogVHVybiBvbiB0cmFuc21pdHRlci9yZWNlaXZlciBhdCA4LWJpdHMvY2hhciAqLwotICAgICAgICBrZ2RiX2NoYW5pbml0KHpzX3NvZnRbdHR5X251bV0uenNfY2hhbm5lbCwgMSwgMzg0MDApOwotCXByaW50aygiS0dEQjogb24gY2hhbm5lbCAlZCBpbml0aWFsaXplZFxuIiwgdHR5X251bSk7Ci0Jc2V0X2RlYnVnX3RyYXBzKCk7IC8qIGluaXQgc3R1YiAqLwotfQotI2VuZGlmIC8qIGlmZGVmIENPTkZJR19LR0RCICovCi0KLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotLyoKLSAqIG5vdGlmeSBjbGllbnRzIGJlZm9yZSBzbGVlcCBhbmQgcmVzZXQgYnVzIGFmdGVyd2FyZHMKLSAqLwotaW50Ci1zZXJpYWxfbm90aWZ5X3NsZWVwKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQotewotCWludCBpOwotCi0Jc3dpdGNoICh3aGVuKSB7Ci0JY2FzZSBQQk9PS19TTEVFUF9SRVFVRVNUOgotCWNhc2UgUEJPT0tfU0xFRVBfUkVKRUNUOgotCQlicmVhazsKLQotCWNhc2UgUEJPT0tfU0xFRVBfTk9XOgotCQlmb3IgKGk9MDsgaTx6c19jaGFubmVsc19mb3VuZDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9ICZ6c19zb2Z0W2ldOwotCQkJaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJCQlzaHV0ZG93bihpbmZvKTsKLQkJCQlpbmZvLT5mbGFncyB8PSBaSUxPR19TTEVFUElORzsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIFBCT09LX1dBS0U6Ci0JCWZvciAoaT0wOyBpPHpzX2NoYW5uZWxzX2ZvdW5kOyBpKyspIHsKLQkJCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gJnpzX3NvZnRbaV07Ci0JCQlpZiAoaW5mby0+ZmxhZ3MgJiBaSUxPR19TTEVFUElORykgewotCQkJCWluZm8tPmZsYWdzICY9IH5aSUxPR19TTEVFUElORzsKLQkJCQlzdGFydHVwKGluZm8pOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY3NlcmlhbC5oIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGUxMWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoKLSAqIG1hY3NlcmlhbC5oOiBEZWZpbml0aW9ucyBmb3IgdGhlIE1hY2ludG9zaCBaODUzMCBzZXJpYWwgZHJpdmVyLgotICoKLSAqIEFkYXB0ZWQgZnJvbSBkcml2ZXJzL3NidXMvY2hhci9zdW5zZXJpYWwuaCBieSBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMgKFBhdWwuTWFja2VycmFzQGNzLmFudS5lZHUuYXUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICovCi0jaWZuZGVmIF9NQUNTRVJJQUxfSAotI2RlZmluZSBfTUFDU0VSSUFMX0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgTlVNX1pTUkVHUyAgICAxNgotCi1zdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB7Ci0JaW50CXR5cGU7Ci0JaW50CWxpbmU7Ci0JaW50CXBvcnQ7Ci0JaW50CWlycTsKLQlpbnQJZmxhZ3M7Ci0JaW50CXhtaXRfZmlmb19zaXplOwotCWludAljdXN0b21fZGl2aXNvcjsKLQlpbnQJYmF1ZF9iYXNlOwotCXVuc2lnbmVkIHNob3J0CWNsb3NlX2RlbGF5OwotCWNoYXIJcmVzZXJ2ZWRfY2hhclsyXTsKLQlpbnQJaHViNjsKLQl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQ7IC8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLwotCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDI7IC8qIG5vIGxvbmdlciB1c2VkLi4uICovCi0JaW50CXJlc2VydmVkWzRdOwotfTsKLQotLyoKLSAqIEZvciB0aGUgY2xvc2Ugd2FpdCB0aW1lcywgMCBtZWFucyB3YWl0IGZvcmV2ZXIgZm9yIHNlcmlhbCBwb3J0IHRvCi0gKiBmbHVzaCBpdHMgb3V0cHV0LiAgNjU1MzUgbWVhbnMgZG9uJ3Qgd2FpdCBhdCBhbGwuCi0gKi8KLSNkZWZpbmUgWklMT0dfQ0xPU0lOR19XQUlUX0lORgkwCi0jZGVmaW5lIFpJTE9HX0NMT1NJTkdfV0FJVF9OT05FCTY1NTM1Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgWklMT0dfc3RydWN0IChhbmQgc2VyaWFsX3N0cnVjdCkgZmxhZ3MgZmllbGQKLSAqLwotI2RlZmluZSBaSUxPR19IVVBfTk9USUZZCTB4MDAwMQkvKiBOb3RpZnkgZ2V0dHkgb24gaGFuZ3VwcyBhbmQgY2xvc2VzIAotCQkJCSAgIAkgKiBvbiB0aGUgY2FsbG91dCBwb3J0ICovCi0jZGVmaW5lIFpJTE9HX0ZPVVJQT1JUIAkJMHgwMDAyCS8qIFNldCBPVTEsIE9VVDIgcGVyIEFTVCBGb3VycG9ydCBzZXR0aW5ncyAqLwotI2RlZmluZSBaSUxPR19TQUsJCTB4MDAwNAkvKiBTZWN1cmUgQXR0ZW50aW9uIEtleSAoT3JhbmdlIGJvb2spICovCi0jZGVmaW5lIFpJTE9HX1NQTElUX1RFUk1JT1MJMHgwMDA4CS8qIFNlcGFyYXRlIHRlcm1pb3MgZm9yIGRpYWxpbi9jYWxsb3V0ICovCi0KLSNkZWZpbmUgWklMT0dfU1BEX01BU0sJCTB4MDAzMAotI2RlZmluZSBaSUxPR19TUERfSEkJCTB4MDAxMAkvKiBVc2UgNTYwMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KLQotI2RlZmluZSBaSUxPR19TUERfVkhJCQkweDAwMjAgIC8qIFVzZSAxMTUyMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KLSNkZWZpbmUgWklMT0dfU1BEX0NVU1QJCTB4MDAzMCAgLyogVXNlIHVzZXItc3BlY2lmaWVkIGRpdmlzb3IgKi8KLQotI2RlZmluZSBaSUxPR19TS0lQX1RFU1QJCTB4MDA0MAkvKiBTa2lwIFVBUlQgdGVzdCBkdXJpbmcgYXV0b2NvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWklMT0dfQVVUT19JUlEgCQkweDAwODAJLyogRG8gYXV0b21hdGljIElSUSBkdXJpbmcgYXV0b2NvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWklMT0dfU0VTU0lPTl9MT0NLT1VUCTB4MDEwMAkvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gc2Vzc2lvbiAqLwotI2RlZmluZSBaSUxPR19QR1JQX0xPQ0tPVVQJMHgwMjAwCS8qIExvY2sgb3V0IGN1YSBvcGVucyBiYXNlZCBvbiBwZ3JwICovCi0jZGVmaW5lIFpJTE9HX0NBTExPVVRfTk9IVVAJMHgwNDAwCS8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KLQotI2RlZmluZSBaSUxPR19GTEFHUwkJMHgwRkZGCS8qIFBvc3NpYmxlIGxlZ2FsIFpJTE9HIGZsYWdzICovCi0jZGVmaW5lIFpJTE9HX1VTUl9NQVNLCQkweDA0MzAJLyogTGVnYWwgZmxhZ3MgdGhhdCBub24tcHJpdmlsZWdlZAotCQkJCQkgKiB1c2VycyBjYW4gc2V0IG9yIHJlc2V0ICovCi0KLS8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwvY2hyX2Rydi9zZXJpYWwuYyAqLwotI2RlZmluZSBaSUxPR19JTklUSUFMSVpFRAkweDgwMDAwMDAwIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLwotI2RlZmluZSBaSUxPR19DQUxMT1VUX0FDVElWRQkweDQwMDAwMDAwIC8qIENhbGwgb3V0IGRldmljZSBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgWklMT0dfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwIC8qIE5vcm1hbCBkZXZpY2UgaXMgYWN0aXZlICovCi0jZGVmaW5lIFpJTE9HX0JPT1RfQVVUT0NPTkYJMHgxMDAwMDAwMCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCi0jZGVmaW5lIFpJTE9HX0NMT1NJTkcJCTB4MDgwMDAwMDAgLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLwotI2RlZmluZSBaSUxPR19DVFNfRkxPVwkJMHgwNDAwMDAwMCAvKiBEbyBDVFMgZmxvdyBjb250cm9sICovCi0jZGVmaW5lIFpJTE9HX0NIRUNLX0NECQkweDAyMDAwMDAwIC8qIGkuZS4sIENMT0NBTCAqLwotI2RlZmluZSBaSUxPR19TTEVFUElORwkJMHgwMTAwMDAwMCAvKiBoYXZlIHNodXQgaXQgZG93biBmb3Igc2xlZXAgKi8KLQotLyogU29mdHdhcmUgc3RhdGUgcGVyIGNoYW5uZWwgKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBUaGlzIGlzIG91ciBpbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGVhY2ggc2VyaWFsIHBvcnQncyBzdGF0ZS4KLSAqIAotICogTWFueSBmaWVsZHMgYXJlIHBhcmFsbGVsZWQgYnkgdGhlIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBzZXJpYWxfc3RydWN0Ci0gKiBzdHJ1Y3R1cmUuCi0gKgotICogRm9yIGRlZmluaXRpb25zIG9mIHRoZSBmbGFncyBmaWVsZCwgc2VlIHR0eS5oCi0gKi8KLQotc3RydWN0IG1hY19zZXJpYWw7Ci0KLXN0cnVjdCBtYWNfenNjaGFubmVsIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKgljb250cm9sOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqCWRhdGE7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQkvKiBVc2VkIGZvciBkZWJ1Z2dpbmcgKi8KLQlzdHJ1Y3QgbWFjX3NlcmlhbCoJcGFyZW50OwotfTsKLQotc3RydWN0IG1hY19kbWEgewotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzCWRtYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAkJcmVzX2NvdW50OwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CQljb21tYW5kOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludAkJYnVmX2FkZHI7Ci19OwotCi1zdHJ1Y3QgbWFjX3NlcmlhbCB7Ci0Jc3RydWN0IG1hY19zZXJpYWwgKnpzX25leHQ7CS8qIEZvciBJUlEgc2VydmljaW5nIGNoYWluICovCi0Jc3RydWN0IG1hY196c2NoYW5uZWwgKnpzX2NoYW5uZWw7IC8qIENoYW5uZWwgcmVnaXN0ZXJzICovCi0Jc3RydWN0IG1hY196c2NoYW5uZWwgKnpzX2NoYW5fYTsJLyogQSBzaWRlIHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGNoYXIgcmVhZF9yZWdfemVybzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGRldl9ub2RlOwotCXNwaW5sb2NrX3QgbG9jazsKLQotCWNoYXIgc29mdF9jYXJyaWVyOyAgLyogVXNlIHNvZnQgY2FycmllciBvbiB0aGlzIGNoYW5uZWwgKi8KLQljaGFyIGJyZWFrX2Fib3J0OyAgIC8qIElzIHNlcmlhbCBjb25zb2xlIGluLCBzbyBwcm9jZXNzIGJyay9hYnJ0ICovCi0JY2hhciBrZ2RiX2NoYW5uZWw7ICAvKiBLZ2RiIGlzIHJ1bm5pbmcgb24gdGhpcyBjaGFubmVsICovCi0JY2hhciBpc19jb25zOyAgICAgICAvKiBJcyB0aGlzIG91ciBjb25zb2xlLiAqLwotCWNoYXIgaXNfaW50ZXJuYWxfbW9kZW07IC8qIGlzIGNvbm5lY3RlZCB0byBhbiBpbnRlcm5hbCBtb2RlbSAqLwotCWNoYXIgaXNfaXJkYTsJCS8qIGlzIGNvbm5lY3RlZCB0byBhbiBJckRBIGNvZGVjICovCi0JaW50IHBvcnRfdHlwZTsJCS8qIFBvcnQgdHlwZSBmb3IgcG1hY19mZWF0dXJlICovCi0JdW5zaWduZWQgY2hhciB0eF9hY3RpdmU7IC8qIGNoYXJhY3RlciBpcyBiZWluZyB4bWl0dGVkICovCi0JdW5zaWduZWQgY2hhciB0eF9zdG9wcGVkOyAvKiBvdXRwdXQgaXMgc3VzcGVuZGVkICovCi0JdW5zaWduZWQgY2hhciBwb3dlcl93YWl0OyAvKiB3YWl0aW5nIGZvciBwb3dlci11cCBkZWxheSB0byBleHBpcmUgKi8KLQotCS8qIFdlIG5lZWQgdG8ga25vdyB0aGUgY3VycmVudCBjbG9jayBkaXZpc29yCi0JICogdG8gcmVhZCB0aGUgYnBzIHJhdGUgdGhlIGNoaXAgaGFzIGN1cnJlbnRseQotCSAqIGxvYWRlZC4KLQkgKi8KLQl1bnNpZ25lZCBjaGFyIGNsa19kaXZpc29yOyAgLyogTWF5IGJlIDEsIDE2LCAzMiwgb3IgNjQgKi8KLQlpbnQgenNfYmF1ZDsKLQotCS8qIEN1cnJlbnQgd3JpdGUgcmVnaXN0ZXIgdmFsdWVzICovCi0JdW5zaWduZWQgY2hhciBjdXJyZWdzW05VTV9aU1JFR1NdOwotCi0JLyogVmFsdWVzIHdlIG5lZWQgdG8gc2V0IG5leHQgb3Bwb3J0dW5pdHkgKi8KLQl1bnNpZ25lZCBjaGFyIHBlbmRyZWdzW05VTV9aU1JFR1NdOwotCi0JY2hhciBjaGFuZ2VfbmVlZGVkOwotCi0JaW50CQkJbWFnaWM7Ci0JaW50CQkJYmF1ZF9iYXNlOwotCWludAkJCXBvcnQ7Ci0JaW50CQkJaXJxOwotCWludAkJCWZsYWdzOyAJCS8qIGRlZmluZWQgaW4gdHR5LmggKi8KLQlpbnQJCQl0eXBlOyAJCS8qIFVBUlQgdHlwZSAqLwotCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OwotCWludAkJCXJlYWRfc3RhdHVzX21hc2s7Ci0JaW50CQkJaWdub3JlX3N0YXR1c19tYXNrOwotCWludAkJCXRpbWVvdXQ7Ci0JaW50CQkJeG1pdF9maWZvX3NpemU7Ci0JaW50CQkJY3VzdG9tX2Rpdmlzb3I7Ci0JaW50CQkJeF9jaGFyOwkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KLQlpbnQJCQljbG9zZV9kZWxheTsKLQl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwotCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQyOwotCXVuc2lnbmVkIGxvbmcJCWV2ZW50OwotCXVuc2lnbmVkIGxvbmcJCWxhc3RfYWN0aXZlOwotCWludAkJCWxpbmU7Ci0JaW50CQkJY291bnQ7CSAgICAvKiAjIG9mIGZkIG9uIGRldmljZSAqLwotCWludAkJCWJsb2NrZWRfb3BlbjsgLyogIyBvZiBibG9ja2VkIG9wZW5zICovCi0JdW5zaWduZWQgY2hhciAJCSp4bWl0X2J1ZjsKLQlpbnQJCQl4bWl0X2hlYWQ7Ci0JaW50CQkJeG1pdF90YWlsOwotCWludAkJCXhtaXRfY250OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7Ci0KLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqdHhfZG1hOwotCWludAkJCXR4X2RtYV9pcnE7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqdHhfY21kczsKLQl2b2xhdGlsZSBzdHJ1Y3QgbWFjX2RtYSAqcng7Ci0JaW50IAkJCXJ4X2RtYV9pcnE7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqKnJ4X2NtZHM7Ci0JdW5zaWduZWQgY2hhcgkJKipyeF9jaGFyX2J1ZjsKLQl1bnNpZ25lZCBjaGFyCQkqKnJ4X2ZsYWdfYnVmOwotI2RlZmluZQlSWF9CVUZfU0laRQkyNTYKLQlpbnQJCQlyeF9uYnVmOwotCWludAkJCXJ4X2RvbmVfYnl0ZXM7Ci0JaW50CQkJcnhfdWJ1ZjsKLQlpbnQJCQlyeF9mYnVmOwotI2RlZmluZQlSWF9OT19GQlVGCSgtMSkKLQlpbnQJCQlyeF9jYnVmOwotCXNwaW5sb2NrX3QJCXJ4X2RtYV9sb2NrOwotCWludAkJCWhhc19kbWE7Ci0JaW50CQkJZG1hX2luaXR0ZWQ7Ci0Jdm9pZAkJCSpkbWFfcHJpdjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlwb2xsX2RtYV90aW1lcjsKLSNkZWZpbmUgUlhfRE1BX1RJTUVSCShqaWZmaWVzICsgMTAqSFovMTAwMCkKLQotCXN0cnVjdCB0aW1lcl9saXN0CXBvd2VydXBfdGltZXI7Ci19OwotCi0KLSNkZWZpbmUgU0VSSUFMX01BR0lDIDB4NTMwMQotCi0vKgotICogVGhlIHNpemUgb2YgdGhlIHNlcmlhbCB4bWl0IGJ1ZmZlciBpcyAxIHBhZ2UsIG9yIDQwOTYgYnl0ZXMKLSAqLwotI2RlZmluZSBTRVJJQUxfWE1JVF9TSVpFIDQwOTYKLQotLyoKLSAqIEV2ZW50cyBhcmUgdXNlZCB0byBzY2hlZHVsZSB0aGluZ3MgdG8gaGFwcGVuIGF0IHRpbWVyLWludGVycnVwdAotICogdGltZSwgaW5zdGVhZCBvZiBhdCBycyBpbnRlcnJ1cHQgdGltZS4KLSAqLwotI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0vKiBDb252ZXJzaW9uIHJvdXRpbmVzIHRvL2Zyb20gYnJnIHRpbWUgY29uc3RhbnRzIGZyb20vdG8gYml0cwotICogcGVyIHNlY29uZC4KLSAqLwotI2RlZmluZSBCUkdfVE9fQlBTKGJyZywgZnJlcSkgKChmcmVxKSAvIDIgLyAoKGJyZykgKyAyKSkKLSNkZWZpbmUgQlBTX1RPX0JSRyhicHMsIGZyZXEpICgoKChmcmVxKSArIChicHMpKSAvICgyICogKGJwcykpKSAtIDIpCi0KLS8qIFRoZSBaaWxvZyByZWdpc3RlciBzZXQgKi8KLQotI2RlZmluZQlGTEFHCTB4N2UKLQotLyogV3JpdGUgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlSMAkwCQkvKiBSZWdpc3RlciBzZWxlY3RzICovCi0jZGVmaW5lCVIxCTEKLSNkZWZpbmUJUjIJMgotI2RlZmluZQlSMwkzCi0jZGVmaW5lCVI0CTQKLSNkZWZpbmUJUjUJNQotI2RlZmluZQlSNgk2Ci0jZGVmaW5lCVI3CTcKLSNkZWZpbmUJUjgJOAotI2RlZmluZQlSOQk5Ci0jZGVmaW5lCVIxMAkxMAotI2RlZmluZQlSMTEJMTEKLSNkZWZpbmUJUjEyCTEyCi0jZGVmaW5lCVIxMwkxMwotI2RlZmluZQlSMTQJMTQKLSNkZWZpbmUJUjE1CTE1Ci0KLSNkZWZpbmUJTlVMTENPREUJMAkvKiBOdWxsIENvZGUgKi8KLSNkZWZpbmUJUE9JTlRfSElHSAkweDgJLyogU2VsZWN0IHVwcGVyIGhhbGYgb2YgcmVnaXN0ZXJzICovCi0jZGVmaW5lCVJFU19FWFRfSU5UCTB4MTAJLyogUmVzZXQgRXh0LiBTdGF0dXMgSW50ZXJydXB0cyAqLwotI2RlZmluZQlTRU5EX0FCT1JUCTB4MTgJLyogSERMQyBBYm9ydCAqLwotI2RlZmluZQlSRVNfUnhJTlRfRkMJMHgyMAkvKiBSZXNldCBSeElOVCBvbiBGaXJzdCBDaGFyYWN0ZXIgKi8KLSNkZWZpbmUJUkVTX1R4X1AJMHgyOAkvKiBSZXNldCBUeElOVCBQZW5kaW5nICovCi0jZGVmaW5lCUVSUl9SRVMJCTB4MzAJLyogRXJyb3IgUmVzZXQgKi8KLSNkZWZpbmUJUkVTX0hfSVVTCTB4MzgJLyogUmVzZXQgaGlnaGVzdCBJVVMgKi8KLQotI2RlZmluZQlSRVNfUnhfQ1JDCTB4NDAJLyogUmVzZXQgUnggQ1JDIENoZWNrZXIgKi8KLSNkZWZpbmUJUkVTX1R4X0NSQwkweDgwCS8qIFJlc2V0IFR4IENSQyBDaGVja2VyICovCi0jZGVmaW5lCVJFU19FT01fTAkweEMwCS8qIFJlc2V0IEVPTSBsYXRjaCAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxICovCi0KLSNkZWZpbmUJRVhUX0lOVF9FTkFCCTB4MQkvKiBFeHQgSW50IEVuYWJsZSAqLwotI2RlZmluZQlUeElOVF9FTkFCCTB4MgkvKiBUeCBJbnQgRW5hYmxlICovCi0jZGVmaW5lCVBBUl9TUEVDCTB4NAkvKiBQYXJpdHkgaXMgc3BlY2lhbCBjb25kaXRpb24gKi8KLQotI2RlZmluZQlSeElOVF9ESVNBQgkwCS8qIFJ4IEludCBEaXNhYmxlICovCi0jZGVmaW5lCVJ4SU5UX0ZDRVJSCTB4OAkvKiBSeCBJbnQgb24gRmlyc3QgQ2hhcmFjdGVyIE9ubHkgb3IgRXJyb3IgKi8KLSNkZWZpbmUJSU5UX0FMTF9SeAkweDEwCS8qIEludCBvbiBhbGwgUnggQ2hhcmFjdGVycyBvciBlcnJvciAqLwotI2RlZmluZQlJTlRfRVJSX1J4CTB4MTgJLyogSW50IG9uIGVycm9yIG9ubHkgKi8KLQotI2RlZmluZQlXVF9SRFlfUlQJMHgyMAkvKiBXL1JlcSByZWZsZWN0cyByZWN2IGlmIDEsIHhtaXQgaWYgMCAqLwotI2RlZmluZQlXVF9GTl9SRFlGTgkweDQwCS8qIFcvUmVxIHBpbiBpcyBETUEgcmVxdWVzdCBpZiAxLCB3YWl0IGlmIDAgKi8KLSNkZWZpbmUJV1RfUkRZX0VOQUIJMHg4MAkvKiBFbmFibGUgVy9SZXEgcGluICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyICMyIChJbnRlcnJ1cHQgVmVjdG9yKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAzICovCi0KLSNkZWZpbmUJUnhFTkFCTEUJMHgxCS8qIFJ4IEVuYWJsZSAqLwotI2RlZmluZQlTWU5DX0xfSU5ICTB4MgkvKiBTeW5jIENoYXJhY3RlciBMb2FkIEluaGliaXQgKi8KLSNkZWZpbmUJQUREX1NNCQkweDQJLyogQWRkcmVzcyBTZWFyY2ggTW9kZSAoU0RMQykgKi8KLSNkZWZpbmUJUnhDUkNfRU5BQgkweDgJLyogUnggQ1JDIEVuYWJsZSAqLwotI2RlZmluZQlFTlRfSE0JCTB4MTAJLyogRW50ZXIgSHVudCBNb2RlICovCi0jZGVmaW5lCUFVVE9fRU5BQgkweDIwCS8qIEF1dG8gRW5hYmxlcyAqLwotI2RlZmluZQlSeDUJCTB4MAkvKiBSeCA1IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4NwkJMHg0MAkvKiBSeCA3IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4NgkJMHg4MAkvKiBSeCA2IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4OAkJMHhjMAkvKiBSeCA4IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lIFJ4TkJJVFNfTUFTSwkweGMwCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDQgKi8KLQotI2RlZmluZQlQQVJfRU5BCQkweDEJLyogUGFyaXR5IEVuYWJsZSAqLwotI2RlZmluZQlQQVJfRVZFTgkweDIJLyogUGFyaXR5IEV2ZW4vT2RkKiAqLwotCi0jZGVmaW5lCVNZTkNfRU5BQgkwCS8qIFN5bmMgTW9kZXMgRW5hYmxlICovCi0jZGVmaW5lCVNCMQkJMHg0CS8qIDEgc3RvcCBiaXQvY2hhciAqLwotI2RlZmluZQlTQjE1CQkweDgJLyogMS41IHN0b3AgYml0cy9jaGFyICovCi0jZGVmaW5lCVNCMgkJMHhjCS8qIDIgc3RvcCBiaXRzL2NoYXIgKi8KLSNkZWZpbmUgU0JfTUFTSwkJMHhjCi0KLSNkZWZpbmUJTU9OU1lOQwkJMAkvKiA4IEJpdCBTeW5jIGNoYXJhY3RlciAqLwotI2RlZmluZQlCSVNZTkMJCTB4MTAJLyogMTYgYml0IHN5bmMgY2hhcmFjdGVyICovCi0jZGVmaW5lCVNETEMJCTB4MjAJLyogU0RMQyBNb2RlICgwMTExMTExMCBTeW5jIEZsYWcpICovCi0jZGVmaW5lCUVYVFNZTkMJCTB4MzAJLyogRXh0ZXJuYWwgU3luYyBNb2RlICovCi0KLSNkZWZpbmUJWDFDTEsJCTB4MAkvKiB4MSBjbG9jayBtb2RlICovCi0jZGVmaW5lCVgxNkNMSwkJMHg0MAkvKiB4MTYgY2xvY2sgbW9kZSAqLwotI2RlZmluZQlYMzJDTEsJCTB4ODAJLyogeDMyIGNsb2NrIG1vZGUgKi8KLSNkZWZpbmUJWDY0Q0xLCQkweEMwCS8qIHg2NCBjbG9jayBtb2RlICovCi0jZGVmaW5lIFhDTEtfTUFTSwkweEMwCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDUgKi8KLQotI2RlZmluZQlUeENSQ19FTkFCCTB4MQkvKiBUeCBDUkMgRW5hYmxlICovCi0jZGVmaW5lCVJUUwkJMHgyCS8qIFJUUyAqLwotI2RlZmluZQlTRExDX0NSQwkweDQJLyogU0RMQy9DUkMtMTYgKi8KLSNkZWZpbmUJVHhFTkFCCQkweDgJLyogVHggRW5hYmxlICovCi0jZGVmaW5lCVNORF9CUksJCTB4MTAJLyogU2VuZCBCcmVhayAqLwotI2RlZmluZQlUeDUJCTB4MAkvKiBUeCA1IGJpdHMgKG9yIGxlc3MpL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDcJCTB4MjAJLyogVHggNyBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDYJCTB4NDAJLyogVHggNiBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDgJCTB4NjAJLyogVHggOCBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZSBUeE5CSVRTX01BU0sJMHg2MAotI2RlZmluZQlEVFIJCTB4ODAJLyogRFRSICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDYgKFN5bmMgYml0cyAwLTcvU0RMQyBBZGRyZXNzIEZpZWxkKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA3IChTeW5jIGJpdHMgOC0xNS9TRExDIDAxMTExMTEwKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA3JyAoU29tZSBlbmhhbmNlZCBmZWF0dXJlIGNvbnRyb2wpICovCi0jZGVmaW5lCUVORVhSRUFECTB4NDAJLyogRW5hYmxlIHJlYWQgb2Ygc29tZSB3cml0ZSByZWdpc3RlcnMgKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgOCAodHJhbnNtaXQgYnVmZmVyKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA5IChNYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wpICovCi0jZGVmaW5lCVZJUwkxCS8qIFZlY3RvciBJbmNsdWRlcyBTdGF0dXMgKi8KLSNkZWZpbmUJTlYJMgkvKiBObyBWZWN0b3IgKi8KLSNkZWZpbmUJRExDCTQJLyogRGlzYWJsZSBMb3dlciBDaGFpbiAqLwotI2RlZmluZQlNSUUJOAkvKiBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZQlTVEFUSEkJMHgxMAkvKiBTdGF0dXMgaGlnaCAqLwotI2RlZmluZQlOT1JFU0VUCTAJLyogTm8gcmVzZXQgb24gd3JpdGUgdG8gUjkgKi8KLSNkZWZpbmUJQ0hSQgkweDQwCS8qIFJlc2V0IGNoYW5uZWwgQiAqLwotI2RlZmluZQlDSFJBCTB4ODAJLyogUmVzZXQgY2hhbm5lbCBBICovCi0jZGVmaW5lCUZIV1JFUwkweGMwCS8qIEZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDEwIChtaXNjIGNvbnRyb2wgYml0cykgKi8KLSNkZWZpbmUJQklUNgkxCS8qIDYgYml0LzhiaXQgc3luYyAqLwotI2RlZmluZQlMT09QTU9ERSAyCS8qIFNETEMgTG9vcCBtb2RlICovCi0jZGVmaW5lCUFCVU5ERVIJNAkvKiBBYm9ydC9mbGFnIG9uIFNETEMgeG1pdCB1bmRlcnJ1biAqLwotI2RlZmluZQlNQVJLSURMRSA4CS8qIE1hcmsvZmxhZyBvbiBpZGxlICovCi0jZGVmaW5lCUdBT1AJMHgxMAkvKiBHbyBhY3RpdmUgb24gcG9sbCAqLwotI2RlZmluZQlOUloJMAkvKiBOUlogbW9kZSAqLwotI2RlZmluZQlOUlpJCTB4MjAJLyogTlJaSSBtb2RlICovCi0jZGVmaW5lCUZNMQkweDQwCS8qIEZNMSAodHJhbnNpdGlvbiA9IDEpICovCi0jZGVmaW5lCUZNMAkweDYwCS8qIEZNMCAodHJhbnNpdGlvbiA9IDApICovCi0jZGVmaW5lCUNSQ1BTCTB4ODAJLyogQ1JDIFByZXNldCBJL08gKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgMTEgKENsb2NrIE1vZGUgY29udHJvbCkgKi8KLSNkZWZpbmUJVFJ4Q1hUCTAJLyogVFJ4QyA9IFh0YWwgb3V0cHV0ICovCi0jZGVmaW5lCVRSeENUQwkxCS8qIFRSeEMgPSBUcmFuc21pdCBjbG9jayAqLwotI2RlZmluZQlUUnhDQlIJMgkvKiBUUnhDID0gQlIgR2VuZXJhdG9yIE91dHB1dCAqLwotI2RlZmluZQlUUnhDRFAJMwkvKiBUUnhDID0gRFBMTCBvdXRwdXQgKi8KLSNkZWZpbmUJVFJ4Q09JCTQJLyogVFJ4QyBPL0kgKi8KLSNkZWZpbmUJVENSVHhDUAkwCS8qIFRyYW5zbWl0IGNsb2NrID0gUlR4QyBwaW4gKi8KLSNkZWZpbmUJVENUUnhDUAk4CS8qIFRyYW5zbWl0IGNsb2NrID0gVFJ4QyBwaW4gKi8KLSNkZWZpbmUJVENCUgkweDEwCS8qIFRyYW5zbWl0IGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLwotI2RlZmluZQlUQ0RQTEwJMHgxOAkvKiBUcmFuc21pdCBjbG9jayA9IERQTEwgb3V0cHV0ICovCi0jZGVmaW5lCVJDUlR4Q1AJMAkvKiBSZWNlaXZlIGNsb2NrID0gUlR4QyBwaW4gKi8KLSNkZWZpbmUJUkNUUnhDUAkweDIwCS8qIFJlY2VpdmUgY2xvY2sgPSBUUnhDIHBpbiAqLwotI2RlZmluZQlSQ0JSCTB4NDAJLyogUmVjZWl2ZSBjbG9jayA9IEJSIEdlbmVyYXRvciBvdXRwdXQgKi8KLSNkZWZpbmUJUkNEUExMCTB4NjAJLyogUmVjZWl2ZSBjbG9jayA9IERQTEwgb3V0cHV0ICovCi0jZGVmaW5lCVJUeENYCTB4ODAJLyogUlR4QyBYdGFsL05vIFh0YWwgKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciB0aW1lIGNvbnN0YW50KSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDE0IChNaXNjIGNvbnRyb2wgYml0cykgKi8KLSNkZWZpbmUJQlJFTkFCTAkxCS8qIEJhdWQgcmF0ZSBnZW5lcmF0b3IgZW5hYmxlICovCi0jZGVmaW5lCUJSU1JDCTIJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBzb3VyY2UgKi8KLSNkZWZpbmUJRFRSUkVRCTQJLyogRFRSL1JlcXVlc3QgZnVuY3Rpb24gKi8KLSNkZWZpbmUJQVVUT0VDSE8gOAkvKiBBdXRvIEVjaG8gKi8KLSNkZWZpbmUJTE9PUEJBSwkweDEwCS8qIExvY2FsIGxvb3BiYWNrICovCi0jZGVmaW5lCVNFQVJDSAkweDIwCS8qIEVudGVyIHNlYXJjaCBtb2RlICovCi0jZGVmaW5lCVJNQwkweDQwCS8qIFJlc2V0IG1pc3NpbmcgY2xvY2sgKi8KLSNkZWZpbmUJRElTRFBMTAkweDYwCS8qIERpc2FibGUgRFBMTCAqLwotI2RlZmluZQlTU0JSCTB4ODAJLyogU2V0IERQTEwgc291cmNlID0gQlIgZ2VuZXJhdG9yICovCi0jZGVmaW5lCVNTUlR4QwkweGEwCS8qIFNldCBEUExMIHNvdXJjZSA9IFJUeEMgKi8KLSNkZWZpbmUJU0ZNTQkweGMwCS8qIFNldCBGTSBtb2RlICovCi0jZGVmaW5lCVNOUlpJCTB4ZTAJLyogU2V0IE5SWkkgbW9kZSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLwotI2RlZmluZQlFTjg1QzMwCTEJLyogRW5hYmxlIHNvbWUgODVjMzAtZW5oYW5jZWQgcmVnaXN0ZXJzICovCi0jZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCi0jZGVmaW5lCUVOU1RGSUZPIDQJLyogRW5hYmxlIHN0YXR1cyBGSUZPIChTRExDKSAqLwotI2RlZmluZQlEQ0RJRQk4CS8qIERDRCBJRSAqLwotI2RlZmluZQlTWU5DSUUJMHgxMAkvKiBTeW5jL2h1bnQgSUUgKi8KLSNkZWZpbmUJQ1RTSUUJMHgyMAkvKiBDVFMgSUUgKi8KLSNkZWZpbmUJVHhVSUUJMHg0MAkvKiBUeCBVbmRlcnJ1bi9FT00gSUUgKi8KLSNkZWZpbmUJQlJLSUUJMHg4MAkvKiBCcmVhay9BYm9ydCBJRSAqLwotCi0KLS8qIFJlYWQgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlSeF9DSF9BVgkweDEJLyogUnggQ2hhcmFjdGVyIEF2YWlsYWJsZSAqLwotI2RlZmluZQlaQ09VTlQJCTB4MgkvKiBaZXJvIGNvdW50ICovCi0jZGVmaW5lCVR4X0JVRl9FTVAJMHg0CS8qIFR4IEJ1ZmZlciBlbXB0eSAqLwotI2RlZmluZQlEQ0QJCTB4OAkvKiBEQ0QgKi8KLSNkZWZpbmUJU1lOQ19IVU5UCTB4MTAJLyogU3luYy9odW50ICovCi0jZGVmaW5lCUNUUwkJMHgyMAkvKiBDVFMgKi8KLSNkZWZpbmUJVHhFT00JCTB4NDAJLyogVHggdW5kZXJydW4gKi8KLSNkZWZpbmUJQlJLX0FCUlQJMHg4MAkvKiBCcmVhay9BYm9ydCAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJQUxMX1NOVAkJMHgxCS8qIEFsbCBzZW50ICovCi0vKiBSZXNpZHVlIERhdGEgZm9yIDggUnggYml0cy9jaGFyIHByb2dyYW1tZWQgKi8KLSNkZWZpbmUJUkVTMwkJMHg4CS8qIDAvMyAqLwotI2RlZmluZQlSRVM0CQkweDQJLyogMC80ICovCi0jZGVmaW5lCVJFUzUJCTB4YwkvKiAwLzUgKi8KLSNkZWZpbmUJUkVTNgkJMHgyCS8qIDAvNiAqLwotI2RlZmluZQlSRVM3CQkweGEJLyogMC83ICovCi0jZGVmaW5lCVJFUzgJCTB4NgkvKiAwLzggKi8KLSNkZWZpbmUJUkVTMTgJCTB4ZQkvKiAxLzggKi8KLSNkZWZpbmUJUkVTMjgJCTB4MAkvKiAyLzggKi8KLS8qIFNwZWNpYWwgUnggQ29uZGl0aW9uIEludGVycnVwdHMgKi8KLSNkZWZpbmUJUEFSX0VSUgkJMHgxMAkvKiBQYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUJUnhfT1ZSCQkweDIwCS8qIFJ4IE92ZXJydW4gRXJyb3IgKi8KLSNkZWZpbmUJRlJNX0VSUgkJMHg0MAkvKiBDUkMvRnJhbWluZyBFcnJvciAqLwotI2RlZmluZQlFTkRfRlIJCTB4ODAJLyogRW5kIG9mIEZyYW1lIChTRExDKSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDIgKGNoYW5uZWwgYiBvbmx5KSAtIEludGVycnVwdCB2ZWN0b3IgKi8KLSNkZWZpbmUJQ0hCX1R4X0VNUFRZCTB4MDAKLSNkZWZpbmUJQ0hCX0VYVF9TVEFUCTB4MDIKLSNkZWZpbmUJQ0hCX1J4X0FWQUlMCTB4MDQKLSNkZWZpbmUJQ0hCX1NQRUNJQUwJMHgwNgotI2RlZmluZQlDSEFfVHhfRU1QVFkJMHgwOAotI2RlZmluZQlDSEFfRVhUX1NUQVQJMHgwYQotI2RlZmluZQlDSEFfUnhfQVZBSUwJMHgwYwotI2RlZmluZQlDSEFfU1BFQ0lBTAkweDBlCi0jZGVmaW5lCVNUQVRVU19NQVNLCTB4MDYKLQotLyogUmVhZCBSZWdpc3RlciAzIChpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikgY2ggYSBvbmx5ICovCi0jZGVmaW5lCUNIQkVYVAkweDEJCS8qIENoYW5uZWwgQiBFeHQvU3RhdCBJUCAqLwotI2RlZmluZQlDSEJUeElQCTB4MgkJLyogQ2hhbm5lbCBCIFR4IElQICovCi0jZGVmaW5lCUNIQlJ4SVAJMHg0CQkvKiBDaGFubmVsIEIgUnggSVAgKi8KLSNkZWZpbmUJQ0hBRVhUCTB4OAkJLyogQ2hhbm5lbCBBIEV4dC9TdGF0IElQICovCi0jZGVmaW5lCUNIQVR4SVAJMHgxMAkJLyogQ2hhbm5lbCBBIFR4IElQICovCi0jZGVmaW5lCUNIQVJ4SVAJMHgyMAkJLyogQ2hhbm5lbCBBIFJ4IElQICovCi0KLS8qIFJlYWQgUmVnaXN0ZXIgOCAocmVjZWl2ZSBkYXRhIHJlZ2lzdGVyKSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEwICAobWlzYyBzdGF0dXMgYml0cykgKi8KLSNkZWZpbmUJT05MT09QCTIJCS8qIE9uIGxvb3AgKi8KLSNkZWZpbmUJTE9PUFNFTkQgMHgxMAkJLyogTG9vcCBzZW5kaW5nICovCi0jZGVmaW5lCUNMSzJNSVMJMHg0MAkJLyogVHdvIGNsb2NrcyBtaXNzaW5nICovCi0jZGVmaW5lCUNMSzFNSVMJMHg4MAkJLyogT25lIGNsb2NrIG1pc3NpbmcgKi8KLQotLyogUmVhZCBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCi0KLS8qIFJlYWQgUmVnaXN0ZXIgMTUgKHZhbHVlIG9mIFdSIDE1KSAqLwotCi0vKiBNaXNjIG1hY3JvcyAqLwotI2RlZmluZSBaU19DTEVBUkVSUihjaGFubmVsKSAgICAod3JpdGVfenNyZWcoY2hhbm5lbCwgMCwgRVJSX1JFUykpCi0jZGVmaW5lIFpTX0NMRUFSRklGTyhjaGFubmVsKSAgIGRvIHsgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBnYXJiYWdlOyBcCi0JCQkJICAgICBnYXJiYWdlID0gcmVhZF96c2RhdGEoY2hhbm5lbCk7IFwKLQkJCQkgICAgIGdhcmJhZ2UgPSByZWFkX3pzZGF0YShjaGFubmVsKTsgXAotCQkJCSAgICAgZ2FyYmFnZSA9IHJlYWRfenNkYXRhKGNoYW5uZWwpOyBcCi0JCQkJfSB3aGlsZSgwKQotCi0jZW5kaWYgLyogIShfTUFDU0VSSUFMX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYwppbmRleCA0YmU3MDllLi43YzE2YzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbWVkaWFfYmF5X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgbWVkaWFfYmF5X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8qIGJheTsKIAl1MzIgX19pb21lbSAqcmVnYmFzZTsKQEAgLTc5NywyMyArNzk3LDIwIEBACiAgKiBUaGVyZWZvcmUgd2UgZG8gaXQgYWxsIGJ5IHBvbGxpbmcgdGhlIG1lZGlhIGJheSBvbmNlIGVhY2ggdGljay4KICAqLwogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIG1lZGlhX2JheV9tYXRjaFtdID0KK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1lZGlhX2JheV9tYXRjaFtdID0KIHsKIAl7CiAJLm5hbWUJCT0gIm1lZGlhLWJheSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAogCS5jb21wYXRpYmxlCT0gImtleWxhcmdvLW1lZGlhLWJheSIsCiAJLmRhdGEJCT0gJmtleWxhcmdvX21iX29wcywKIAl9LAogCXsKIAkubmFtZQkJPSAibWVkaWEtYmF5IiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCiAJLmNvbXBhdGlibGUJPSAiaGVhdGhyb3ctbWVkaWEtYmF5IiwKIAkuZGF0YQkJPSAmaGVhdGhyb3dfbWJfb3BzLAogCX0sCiAJewogCS5uYW1lCQk9ICJtZWRpYS1iYXkiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKIAkuY29tcGF0aWJsZQk9ICJvaGFyZS1tZWRpYS1iYXkiLAogCS5kYXRhCQk9ICZvaGFyZV9tYl9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwppbmRleCBmZWI0ZTI0Li43MDNlMzE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KIAogI2luY2x1ZGUgInRoZXJtX3BtNzIuaCIKIApAQCAtMTk4Niw3ICsxOTg3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZmN1X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgZmN1X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJaW50IHJjOwogCkBAIC0yMDA5LDEyICsyMDEwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggZmN1X29mX21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZjdV9tYXRjaFtdID0gCiB7CiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImZjdSIsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKQEAgLTIwMjIsNyArMjAyMSw3IEBACiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyID0gCiB7CiAJLm5hbWUgCQk9ICJ0ZW1wZXJhdHVyZSIsCi0JLm1hdGNoX3RhYmxlCT0gZmN1X29mX21hdGNoLAorCS5tYXRjaF90YWJsZQk9IGZjdV9tYXRjaCwKIAkucHJvYmUJCT0gZmN1X29mX3Byb2JlLAogCS5yZW1vdmUJCT0gZmN1X29mX3JlbW92ZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYwppbmRleCA2MTQwMGYwLi5jYmI3MmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KIAogI2RlZmluZSBMT0dfVEVNUAkJMAkJCS8qIGNvbnRpbm91c2x5IGxvZyB0ZW1wZXJhdHVyZSAqLwogCkBAIC00NTAsNyArNDUxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQKLXRoZXJtX29mX3Byb2JlKCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2ggKQordGhlcm1fb2ZfcHJvYmUoIHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2ggKQogewogCXJldHVybiBpMmNfYWRkX2RyaXZlciggJmc0ZmFuX2RyaXZlciApOwogfQpAQCAtNDYxLDkgKzQ2Miw4IEBACiAJcmV0dXJuIGkyY19kZWxfZHJpdmVyKCAmZzRmYW5fZHJpdmVyICk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggdGhlcm1fb2ZfbWF0Y2hbXSA9IHt7CitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0aGVybV9vZl9tYXRjaFtdID0ge3sKIAkubmFtZQkJPSAiZmFuIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCiAJLmNvbXBhdGlibGUJPSAiYWRtMTAzMCIKICAgICB9LCB7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwppbmRleCBiOTQxZWUyLi40YTBhMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCkBAIC02Myw2ICs2MywxMCBAQAogI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQzMyCisjaW5jbHVkZSA8YXNtL29wZW5fcGljLmg+CisjZW5kaWYKKwogLyogU29tZSBjb21waWxlIG9wdGlvbnMgKi8KICN1bmRlZiBTVVNQRU5EX1VTRVNfUE1VCiAjZGVmaW5lIERFQlVHX1NMRUVQCkBAIC0xNTEsMTAgKzE1NSwxMCBAQAogc3RhdGljIHU4IHBtdV9pbnRyX21hc2s7CiBzdGF0aWMgaW50IHBtdV92ZXJzaW9uOwogc3RhdGljIGludCBkcm9wX2ludGVycnVwdHM7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgb3B0aW9uX2xpZF93YWtldXAgPSAxOwogc3RhdGljIGludCBzbGVlcF9pbl9wcm9ncmVzczsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXN5bmNfcmVxX2xvY2tzOwogc3RhdGljIHVuc2lnbmVkIGludCBwbXVfaXJxX3N0YXRzWzExXTsKIApAQCAtMTY0LDcgKzE2OCw2IEBACiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BtdV9vcHRpb25zOwogc3RhdGljIGludCBvcHRpb25fc2VydmVyX21vZGU7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogaW50IHBtdV9iYXR0ZXJ5X2NvdW50OwogaW50IHBtdV9jdXJfYmF0dGVyeTsKIHVuc2lnbmVkIGludCBwbXVfcG93ZXJfZmxhZ3M7CkBAIC0xNzIsNyArMTc1LDYgQEAKIHN0YXRpYyBpbnQgcXVlcnlfYmF0dF90aW1lciA9IEJBVFRFUllfUE9MTElOR19DT1VOVDsKIHN0YXRpYyBzdHJ1Y3QgYWRiX3JlcXVlc3QgYmF0dF9yZXE7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BtdV9iYXR0W1BNVV9NQVhfQkFUVEVSSUVTXTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfQURCSElEKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVCkKIGV4dGVybiBpbnQgZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0OwpAQCAtMjA2LDExICsyMDgsOSBAQAogc3RhdGljIGludCBwbXVfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwogc3RhdGljIGludCBwbXVfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwogI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiBzdGF0aWMgdm9pZCBwbXVfcGFzc19pbnRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwogc3RhdGljIGludCBwcm9jX2dldF9iYXR0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KIHN0YXRpYyBpbnQgcHJvY19yZWFkX29wdGlvbnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIHN0YXRpYyBpbnQgcHJvY193cml0ZV9vcHRpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApAQCAtNDAzLDggKzQwMywxMiBAQAogCiAJYnJpZ2h0X3JlcV8xLmNvbXBsZXRlID0gMTsKIAlicmlnaHRfcmVxXzIuY29tcGxldGUgPSAxOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJYmF0dF9yZXEuY29tcGxldGUgPSAxOworCisjaWZkZWYgQ09ORklHX1BQQzMyCisJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCkKKwkJb3BlbnBpY19zZXRfaXJxX3ByaW9yaXR5KHZpYXMtPmludHJzWzBdLmxpbmUsCisJCQkJCSBPUEVOUElDX1BSSU9SSVRZX0RFRkFVTFQgKyAxKTsKICNlbmRpZgogCiAJaWYgKHJlcXVlc3RfaXJxKHZpYXMtPmludHJzWzBdLmxpbmUsIHZpYV9wbXVfaW50ZXJydXB0LCAwLCAiVklBLVBNVSIsCkBAIC00NTgsNyArNDYyLDcgQEAKIAlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcG11X2JhY2tsaWdodF9jb250cm9sbGVyLCBOVUxMLCAicG11Iik7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QUEMzMgogICAJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNDAwLzI0MDAiKSB8fAogICAJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIikpIHsKIAkJaW50IG1iID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR0VUX01CX0lORk8sCkBAIC00ODYsMjAgKzQ5MCwxOSBAQAogCQkJCXBtdV9iYXR0ZXJpZXNbMV0uZmxhZ3MgfD0gUE1VX0JBVFRfVFlQRV9TTUFSVDsKIAkJfQogCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworCiAJLyogQ3JlYXRlIC9wcm9jL3BtdSAqLwogCXByb2NfcG11X3Jvb3QgPSBwcm9jX21rZGlyKCJwbXUiLCBOVUxMKTsKIAlpZiAocHJvY19wbXVfcm9vdCkgewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JCWludCBpOworCQlsb25nIGk7CiAKIAkJZm9yIChpPTA7IGk8cG11X2JhdHRlcnlfY291bnQ7IGkrKykgewogCQkJY2hhciB0aXRsZVsxNl07Ci0JCQlzcHJpbnRmKHRpdGxlLCAiYmF0dGVyeV8lZCIsIGkpOworCQkJc3ByaW50Zih0aXRsZSwgImJhdHRlcnlfJWxkIiwgaSk7CiAJCQlwcm9jX3BtdV9iYXR0W2ldID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSh0aXRsZSwgMCwgcHJvY19wbXVfcm9vdCwKIAkJCQkJCXByb2NfZ2V0X2JhdHQsICh2b2lkICopaSk7CiAJCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAJCXByb2NfcG11X2luZm8gPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgMCwgcHJvY19wbXVfcm9vdCwKIAkJCQkJcHJvY19nZXRfaW5mbywgTlVMTCk7CkBAIC02MTksOCArNjIyLDYgQEAKIAlwbXVfd2FpdF9jb21wbGV0ZSgmcmVxKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0KIC8qIFRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvZGUgZm9yIDI0MDAvMzQwMC8zNTAwIHBvd2VyYm9va3MKICAqIGlzIGluc3BpcmVkIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGluIGdrcmVsbG0tcG11CiAgKi8KQEAgLTgwMyw4ICs4MDQsNiBAQAogCQkJMiwgUE1VX1NNQVJUX0JBVFRFUllfU1RBVEUsIHBtdV9jdXJfYmF0dGVyeSsxKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCi0KIHN0YXRpYyBpbnQgX19wbWFjCiBwcm9jX2dldF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtODEzLDExICs4MTIsOSBAQAogCiAJcCArPSBzcHJpbnRmKHAsICJQTVUgZHJpdmVyIHZlcnNpb24gICAgIDogJWRcbiIsIFBNVV9EUklWRVJfVkVSU0lPTik7CiAJcCArPSBzcHJpbnRmKHAsICJQTVUgZmlybXdhcmUgdmVyc2lvbiAgIDogJTAyeFxuIiwgcG11X3ZlcnNpb24pOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJcCArPSBzcHJpbnRmKHAsICJBQyBQb3dlciAgICAgICAgICAgICAgIDogJWRcbiIsCiAJCSgocG11X3Bvd2VyX2ZsYWdzICYgUE1VX1BXUl9BQ19QUkVTRU5UKSAhPSAwKSk7CiAJcCArPSBzcHJpbnRmKHAsICJCYXR0ZXJ5IGNvdW50ICAgICAgICAgIDogJWRcbiIsIHBtdV9iYXR0ZXJ5X2NvdW50KTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAJcmV0dXJuIHAgLSBwYWdlOwogfQpAQCAtODQ5LDEyICs4NDYsMTEgQEAKIAlyZXR1cm4gcCAtIHBhZ2U7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogc3RhdGljIGludCBfX3BtYWMKIHByb2NfZ2V0X2JhdHQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGJhdG51bSA9IChpbnQpZGF0YTsKKwlsb25nIGJhdG51bSA9IChsb25nKWRhdGE7CiAJY2hhciAqcCA9IHBhZ2U7CiAJCiAJcCArPSBzcHJpbnRmKHAsICJcbiIpOwpAQCAtODczLDcgKzg2OSw2IEBACiAKIAlyZXR1cm4gcCAtIHBhZ2U7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KIAogc3RhdGljIGludCBfX3BtYWMKIHByb2NfcmVhZF9vcHRpb25zKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLApAQCAtODgxLDExICs4NzYsMTEgQEAKIHsKIAljaGFyICpwID0gcGFnZTsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCAmJgogCSAgICBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TTEVFUF9TVEFURSxOVUxMLDAsLTEpID49IDApCiAJCXAgKz0gc3ByaW50ZihwLCAibGlkX3dha2V1cD0lZFxuIiwgb3B0aW9uX2xpZF93YWtldXApOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYKIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEKQogCQlwICs9IHNwcmludGYocCwgInNlcnZlcl9tb2RlPSVkXG4iLCBvcHRpb25fc2VydmVyX21vZGUpOwogCkBAIC05MjIsMTIgKzkxNywxMiBAQAogCSoodmFsKyspID0gMDsKIAl3aGlsZSgqdmFsID09ICcgJykKIAkJdmFsKys7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEICYmCiAJICAgIHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLE5VTEwsMCwtMSkgPj0gMCkKIAkJaWYgKCFzdHJjbXAobGFiZWwsICJsaWRfd2FrZXVwIikpCiAJCQlvcHRpb25fbGlkX3dha2V1cCA9ICgoKnZhbCkgPT0gJzEnKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmCiAJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCAmJiAhc3RyY21wKGxhYmVsLCAic2VydmVyX21vZGUiKSkgewogCQlpbnQgbmV3X3ZhbHVlOwogCQluZXdfdmFsdWUgPSAoKCp2YWwpID09ICcxJyk7CkBAIC0xNDIyLDcgKzE0MTcsNiBAQAogCX0KIAkvKiBUaWNrIGludGVycnVwdCAqLwogCWVsc2UgaWYgKCgxIDw8IHBpcnEpICYgUE1VX0lOVF9USUNLKSB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIAkJLyogRW52aXJvbmVtZW50IG9yIHRpY2sgaW50ZXJydXB0LCBxdWVyeSBiYXR0ZXJpZXMgKi8KIAkJaWYgKHBtdV9iYXR0ZXJ5X2NvdW50KSB7CiAJCQlpZiAoKC0tcXVlcnlfYmF0dF90aW1lcikgPT0gMCkgewpAQCAtMTQzNyw3ICsxNDMxLDYgQEAKIAkJcG11X3Bhc3NfaW50cihkYXRhLCBsZW4pOwogCX0gZWxzZSB7CiAJICAgICAgIHBtdV9wYXNzX2ludHIoZGF0YSwgbGVuKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCX0KIAlnb3RvIG5leHQ7CiB9CkBAIC0yMDUyLDcgKzIwNDUsNyBAQAogCXJldHVybiAtMTsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAKIHN0YXRpYyBMSVNUX0hFQUQoc2xlZXBfbm90aWZpZXJzKTsKIApAQCAtMjcwNSw2ICsyNjk4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiAvKgogICogU3VwcG9ydCBmb3IgL2Rldi9wbXUgZGV2aWNlCiAgKi8KQEAgLTI4ODQsMTEgKzI4NzksMTEgQEAKIHBtdV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewotCXN0cnVjdCBwbXVfcHJpdmF0ZSAqcHAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJX191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZzsKLQlpbnQgZXJyb3I7CisJaW50IGVycm9yID0gLUVJTlZBTDsKIAogCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgQ09ORklHX1BNCiAJY2FzZSBQTVVfSU9DX1NMRUVQOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTI5MTAsMTIgKzI5MDUsMTMgQEAKIAkJCWVycm9yID0gLUVOT1NZUzsKIAkJfQogCQlzbGVlcF9pbl9wcm9ncmVzcyA9IDA7Ci0JCXJldHVybiBlcnJvcjsKKwkJYnJlYWs7CiAJY2FzZSBQTVVfSU9DX0NBTl9TTEVFUDoKIAkJaWYgKHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLE5VTEwsMCwtMSkgPCAwKQogCQkJcmV0dXJuIHB1dF91c2VyKDAsIGFyZ3ApOwogCQllbHNlCiAJCQlyZXR1cm4gcHV0X3VzZXIoMSwgYXJncCk7CisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKIAkvKiBCYWNrbGlnaHQgc2hvdWxkIGhhdmUgaXRzIG93biBkZXZpY2Ugb3IgZ28gdmlhCkBAIC0yOTM2LDExICsyOTMyLDEzIEBACiAJCWVycm9yID0gZ2V0X3VzZXIodmFsdWUsIGFyZ3ApOwogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBzZXRfYmFja2xpZ2h0X2xldmVsKHZhbHVlKTsKLQkJcmV0dXJuIGVycm9yOworCQlicmVhazsKIAl9CiAjaWZkZWYgQ09ORklHX0lOUFVUX0FEQkhJRAogCWNhc2UgUE1VX0lPQ19HUkFCX0JBQ0tMSUdIVDogeworCQlzdHJ1Y3QgcG11X3ByaXZhdGUgKnBwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJCWlmIChwcC0+YmFja2xpZ2h0X2xvY2tlcikKIAkJCXJldHVybiAwOwogCQlwcC0+YmFja2xpZ2h0X2xvY2tlciA9IDE7CkBAIC0yOTU2LDcgKzI5NTQsNyBAQAogCWNhc2UgUE1VX0lPQ19IQVNfQURCOgogCQlyZXR1cm4gcHV0X3VzZXIocG11X2hhc19hZGIsIGFyZ3ApOwogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBtdV9kZXZpY2VfZm9wcyBfX3BtYWNkYXRhID0gewpAQCAtMjk3MiwxNCArMjk3MCwxNiBAQAogCVBNVV9NSU5PUiwgInBtdSIsICZwbXVfZGV2aWNlX2ZvcHMKIH07CiAKLXZvaWQgcG11X2RldmljZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IHBtdV9kZXZpY2VfaW5pdCh2b2lkKQogewogCWlmICghdmlhKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCWlmIChtaXNjX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlLlxuIik7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KK2RldmljZV9pbml0Y2FsbChwbXVfZGV2aWNlX2luaXQpOworCiAKICNpZmRlZiBERUJVR19TTEVFUAogc3RhdGljIGlubGluZSB2b2lkICBfX3BtYWMKQEAgLTMxNDcsMTIgKzMxNDcsMTIgQEAKIEVYUE9SVF9TWU1CT0wocG11X2kyY19zdGRzdWJfd3JpdGUpOwogRVhQT1JUX1NZTUJPTChwbXVfaTJjX3NpbXBsZV9yZWFkKTsKIEVYUE9SVF9TWU1CT0wocG11X2kyY19zaW1wbGVfd3JpdGUpOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiBFWFBPUlRfU1lNQk9MKHBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcik7CiBFWFBPUlRfU1lNQk9MKHBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKTsKIEVYUE9SVF9TWU1CT0wocG11X2VuYWJsZV9pcmxlZCk7CiBFWFBPUlRfU1lNQk9MKHBtdV9iYXR0ZXJ5X2NvdW50KTsKIEVYUE9SVF9TWU1CT0wocG11X2JhdHRlcmllcyk7CiBFWFBPUlRfU1lNQk9MKHBtdV9wb3dlcl9mbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggOTU5ODBhZC4uMGMyZWQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0xMzQ1LDcgKzEzNDUsOCBAQAogCX0KIH0KIAotaW50IGJpdG1hcF9zdGFydF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcykKK2ludCBiaXRtYXBfc3RhcnRfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50ICpibG9ja3MsCisJCQlpbnQgZGVncmFkZWQpCiB7CiAJYml0bWFwX2NvdW50ZXJfdCAqYm1jOwogCWludCBydjsKQEAgLTEzNjIsOCArMTM2MywxMCBAQAogCQkJcnYgPSAxOwogCQllbHNlIGlmIChORUVERUQoKmJtYykpIHsKIAkJCXJ2ID0gMTsKLQkJCSpibWMgfD0gUkVTWU5DX01BU0s7Ci0JCQkqYm1jICY9IH5ORUVERURfTUFTSzsKKwkJCWlmICghZGVncmFkZWQpIHsgLyogZG9uJ3Qgc2V0L2NsZWFyIGJpdHMgaWYgZGVncmFkZWQgKi8KKwkJCQkqYm1jIHw9IFJFU1lOQ19NQVNLOworCQkJCSpibWMgJj0gfk5FRURFRF9NQVNLOworCQkJfQogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmYml0bWFwLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCAwYzFiODUyLi43ODU4MDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC02Myw2ICs2Myw3IEBACiAJdW5zaWduZWQgbnJfcHJpb3JpdHlfZ3JvdXBzOwogCXN0cnVjdCBsaXN0X2hlYWQgcHJpb3JpdHlfZ3JvdXBzOwogCXVuc2lnbmVkIHBnX2luaXRfcmVxdWlyZWQ7CS8qIHBnX2luaXQgbmVlZHMgY2FsbGluZz8gKi8KKwl1bnNpZ25lZCBwZ19pbml0X2luX3Byb2dyZXNzOwkvKiBPbmx5IG9uZSBwZ19pbml0IGFsbG93ZWQgYXQgb25jZSAqLwogCiAJdW5zaWduZWQgbnJfdmFsaWRfcGF0aHM7CS8qIFRvdGFsIG51bWJlciBvZiB1c2FibGUgcGF0aHMgKi8KIAlzdHJ1Y3QgcGdwYXRoICpjdXJyZW50X3BncGF0aDsKQEAgLTcyLDcgKzczLDcgQEAKIAogCXVuc2lnbmVkIHF1ZXVlX2lvOwkJLyogTXVzdCB3ZSBxdWV1ZSBhbGwgSS9PPyAqLwogCXVuc2lnbmVkIHF1ZXVlX2lmX25vX3BhdGg7CS8qIFF1ZXVlIEkvTyBpZiBsYXN0IHBhdGggZmFpbHM/ICovCi0JdW5zaWduZWQgc3VzcGVuZGVkOwkJLyogSGFzIGRtIGNvcmUgc3VzcGVuZGVkIG91ciBJL08/ICovCisJdW5zaWduZWQgc2F2ZWRfcXVldWVfaWZfbm9fcGF0aDsvKiBTYXZlZCBzdGF0ZSBkdXJpbmcgc3VzcGVuc2lvbiAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0IHByb2Nlc3NfcXVldWVkX2lvczsKIAlzdHJ1Y3QgYmlvX2xpc3QgcXVldWVkX2lvczsKQEAgLTMwNCwxMSArMzA1LDEyIEBACiAJCW0tPnF1ZXVlX3NpemUtLTsKIAogCWlmICgocGdwYXRoICYmIG0tPnF1ZXVlX2lvKSB8fAotCSAgICAoIXBncGF0aCAmJiBtLT5xdWV1ZV9pZl9ub19wYXRoICYmICFtLT5zdXNwZW5kZWQpKSB7CisJICAgICghcGdwYXRoICYmIG0tPnF1ZXVlX2lmX25vX3BhdGgpKSB7CiAJCS8qIFF1ZXVlIGZvciB0aGUgZGFlbW9uIHRvIHJlc3VibWl0ICovCiAJCWJpb19saXN0X2FkZCgmbS0+cXVldWVkX2lvcywgYmlvKTsKIAkJbS0+cXVldWVfc2l6ZSsrOwotCQlpZiAobS0+cGdfaW5pdF9yZXF1aXJlZCB8fCAhbS0+cXVldWVfaW8pCisJCWlmICgobS0+cGdfaW5pdF9yZXF1aXJlZCAmJiAhbS0+cGdfaW5pdF9pbl9wcm9ncmVzcykgfHwKKwkJICAgICFtLT5xdWV1ZV9pbykKIAkJCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCQlwZ3BhdGggPSBOVUxMOwogCQlyID0gMDsKQEAgLTMzMyw4ICszMzUsOSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKIAorCW0tPnNhdmVkX3F1ZXVlX2lmX25vX3BhdGggPSBtLT5xdWV1ZV9pZl9ub19wYXRoOwogCW0tPnF1ZXVlX2lmX25vX3BhdGggPSBxdWV1ZV9pZl9ub19wYXRoOwotCWlmICghbS0+cXVldWVfaWZfbm9fcGF0aCkKKwlpZiAoIW0tPnF1ZXVlX2lmX25vX3BhdGggJiYgbS0+cXVldWVfc2l6ZSkKIAkJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CkBAIC0zNzksMjUgKzM4MiwzMSBAQAogewogCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSBkYXRhOwogCXN0cnVjdCBod19oYW5kbGVyICpod2ggPSAmbS0+aHdfaGFuZGxlcjsKLQlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGg7Ci0JdW5zaWduZWQgaW5pdF9yZXF1aXJlZCwgbXVzdF9xdWV1ZSA9IDA7CisJc3RydWN0IHBncGF0aCAqcGdwYXRoID0gTlVMTDsKKwl1bnNpZ25lZCBpbml0X3JlcXVpcmVkID0gMCwgbXVzdF9xdWV1ZSA9IDE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7CiAKKwlpZiAoIW0tPnF1ZXVlX3NpemUpCisJCWdvdG8gb3V0OworCiAJaWYgKCFtLT5jdXJyZW50X3BncGF0aCkKIAkJX19jaG9vc2VfcGdwYXRoKG0pOwogCiAJcGdwYXRoID0gbS0+Y3VycmVudF9wZ3BhdGg7CiAKLQlpZiAoKHBncGF0aCAmJiBtLT5xdWV1ZV9pbykgfHwKLQkgICAgKCFwZ3BhdGggJiYgbS0+cXVldWVfaWZfbm9fcGF0aCAmJiAhbS0+c3VzcGVuZGVkKSkKLQkJbXVzdF9xdWV1ZSA9IDE7CisJaWYgKChwZ3BhdGggJiYgIW0tPnF1ZXVlX2lvKSB8fAorCSAgICAoIXBncGF0aCAmJiAhbS0+cXVldWVfaWZfbm9fcGF0aCkpCisJCW11c3RfcXVldWUgPSAwOwogCi0JaW5pdF9yZXF1aXJlZCA9IG0tPnBnX2luaXRfcmVxdWlyZWQ7Ci0JaWYgKGluaXRfcmVxdWlyZWQpCisJaWYgKG0tPnBnX2luaXRfcmVxdWlyZWQgJiYgIW0tPnBnX2luaXRfaW5fcHJvZ3Jlc3MpIHsKIAkJbS0+cGdfaW5pdF9yZXF1aXJlZCA9IDA7CisJCW0tPnBnX2luaXRfaW5fcHJvZ3Jlc3MgPSAxOworCQlpbml0X3JlcXVpcmVkID0gMTsKKwl9CiAKK291dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoaW5pdF9yZXF1aXJlZCkKQEAgLTc1Miw2ICs3NjEsOCBAQAogc3RhdGljIHZvaWQgbXVsdGlwYXRoX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptID0gKHN0cnVjdCBtdWx0aXBhdGggKikgdGktPnByaXZhdGU7CisKKwlmbHVzaF93b3JrcXVldWUoa211bHRpcGF0aGQpOwogCWZyZWVfbXVsdGlwYXRoKG0pOwogfQogCkBAIC03NjUsNiArNzc2LDkgQEAKIAlzdHJ1Y3QgbXBhdGhfaW8gKm1waW87CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIHRpLT5wcml2YXRlOwogCisJaWYgKGJpb19iYXJyaWVyKGJpbykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCW1waW8gPSBtZW1wb29sX2FsbG9jKG0tPm1waW9fcG9vbCwgR0ZQX05PSU8pOwogCWRtX2Jpb19yZWNvcmQoJm1waW8tPmRldGFpbHMsIGJpbyk7CiAKQEAgLTgzNyw3ICs4NTEsNyBAQAogCXBncGF0aC0+cGF0aC5pc19hY3RpdmUgPSAxOwogCiAJbS0+Y3VycmVudF9wZ3BhdGggPSBOVUxMOwotCWlmICghbS0+bnJfdmFsaWRfcGF0aHMrKykKKwlpZiAoIW0tPm5yX3ZhbGlkX3BhdGhzKysgJiYgbS0+cXVldWVfc2l6ZSkKIAkJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7CiAKIAlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+dHJpZ2dlcl9ldmVudCk7CkBAIC05NjMsMTIgKzk3NywxMyBAQAogCQlieXBhc3NfcGcobSwgcGcsIDEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWVycl9mbGFncykKLQkJbS0+cXVldWVfaW8gPSAwOwotCWVsc2UgeworCWlmIChlcnJfZmxhZ3MpIHsKIAkJbS0+Y3VycmVudF9wZ3BhdGggPSBOVUxMOwogCQltLT5jdXJyZW50X3BnID0gTlVMTDsKLQl9CisJfSBlbHNlIGlmICghbS0+cGdfaW5pdF9yZXF1aXJlZCkKKwkJbS0+cXVldWVfaW8gPSAwOworCisJbS0+cGdfaW5pdF9pbl9wcm9ncmVzcyA9IDA7CiAJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwogfQpAQCAtOTg4LDkgKzEwMDMsMTIgQEAKIAlpZiAoKGVycm9yID09IC1FV09VTERCTE9DSykgJiYgYmlvX3J3X2FoZWFkKGJpbykpCiAJCXJldHVybiBlcnJvcjsKIAorCWlmIChlcnJvciA9PSAtRU9QTk9UU1VQUCkKKwkJcmV0dXJuIGVycm9yOworCiAJc3Bpbl9sb2NrKCZtLT5sb2NrKTsKIAlpZiAoIW0tPm5yX3ZhbGlkX3BhdGhzKSB7Ci0JCWlmICghbS0+cXVldWVfaWZfbm9fcGF0aCB8fCBtLT5zdXNwZW5kZWQpIHsKKwkJaWYgKCFtLT5xdWV1ZV9pZl9ub19wYXRoKSB7CiAJCQlzcGluX3VubG9jaygmbS0+bG9jayk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlIHsKQEAgLTEwNTEsMjcgKzEwNjksMjcgQEAKIAogLyoKICAqIFN1c3BlbmQgY2FuJ3QgY29tcGxldGUgdW50aWwgYWxsIHRoZSBJL08gaXMgcHJvY2Vzc2VkIHNvIGlmCi0gKiB0aGUgbGFzdCBwYXRoIGZhaWxlZCB3ZSB3aWxsIG5vdyBlcnJvciBhbnkgcXVldWVkIEkvTy4KKyAqIHRoZSBsYXN0IHBhdGggZmFpbHMgd2UgbXVzdCBlcnJvciBhbnkgcmVtYWluaW5nIEkvTy4KKyAqIE5vdGUgdGhhdCBpZiB0aGUgZnJlZXplX2JkZXYgZmFpbHMgd2hpbGUgc3VzcGVuZGluZywgdGhlCisgKiBxdWV1ZV9pZl9ub19wYXRoIHN0YXRlIGlzIGxvc3QgLSB1c2Vyc3BhY2Ugc2hvdWxkIHJlc2V0IGl0LgogICovCiBzdGF0aWMgdm9pZCBtdWx0aXBhdGhfcHJlc3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptID0gKHN0cnVjdCBtdWx0aXBhdGggKikgdGktPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7Ci0JbS0+c3VzcGVuZGVkID0gMTsKLQlpZiAobS0+cXVldWVfaWZfbm9fcGF0aCkKLQkJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOworCXF1ZXVlX2lmX25vX3BhdGgobSwgMCk7CiB9CiAKKy8qCisgKiBSZXN0b3JlIHRoZSBxdWV1ZV9pZl9ub19wYXRoIHNldHRpbmcuCisgKi8KIHN0YXRpYyB2b2lkIG11bHRpcGF0aF9yZXN1bWUoc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIHRpLT5wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwotCW0tPnN1c3BlbmRlZCA9IDA7CisJbS0+cXVldWVfaWZfbm9fcGF0aCA9IG0tPnNhdmVkX3F1ZXVlX2lmX25vX3BhdGg7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKaW5kZXggNmUzY2Y3ZS4uMTIwMzFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwpAQCAtMTA2MCw2ICsxMDYwLDcgQEAKIAl9CiAKIAl0aS0+cHJpdmF0ZSA9IG1zOworIAl0aS0+c3BsaXRfaW8gPSBtcy0+cmgucmVnaW9uX3NpemU7CiAKIAlyID0ga2NvcHlkX2NsaWVudF9jcmVhdGUoRE1fSU9fUEFHRVMsICZtcy0+a2NvcHlkX2NsaWVudCk7CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggN2U2OTFhYi4uYWI1NGY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTc3Nyw3ICs3NzcsNyBAQAogCiAJLyogRnVsbCBzbmFwc2hvdHMgYXJlIG5vdCB1c2FibGUgKi8KIAlpZiAoIXMtPnZhbGlkKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlPOwogCiAJLyoKIAkgKiBXcml0ZSB0byBzbmFwc2hvdCAtIGhpZ2hlciBsZXZlbCB0YWtlcyBjYXJlIG9mIFJXL1JPCkBAIC05MzEsNiArOTMxLDEwIEBACiAJCWlmICghc25hcC0+dmFsaWQpCiAJCQljb250aW51ZTsKIAorCQkvKiBOb3RoaW5nIHRvIGRvIGlmIHdyaXRpbmcgYmV5b25kIGVuZCBvZiBzbmFwc2hvdCAqLworCQlpZiAoYmlvLT5iaV9zZWN0b3IgPj0gZG1fdGFibGVfZ2V0X3NpemUoc25hcC0+dGFibGUpKQorCQkJY29udGludWU7CisKIAkJZG93bl93cml0ZSgmc25hcC0+bG9jayk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCAxOGU5Yjk5Li5hNWE0YzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC05NDMsNiArOTQzLDcgQEAKIEVYUE9SVF9TWU1CT0woZG1fZ2V0X2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKGRtX3B1dF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChkbV90YWJsZV9ldmVudCk7CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9zaXplKTsKIEVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21vZGUpOwogRVhQT1JUX1NZTUJPTChkbV90YWJsZV9wdXQpOwogRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IGY2YjAzOTUuLjU0ZmFiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTM4NCw3ICszODQsNyBAQAogCQkvKiBlcnJvciB0aGUgaW8gYW5kIGJhaWwgb3V0ICovCiAJCXN0cnVjdCBkbV9pbyAqaW8gPSB0aW8tPmlvOwogCQlmcmVlX3Rpbyh0aW8tPmlvLT5tZCwgdGlvKTsKLQkJZGVjX3BlbmRpbmcoaW8sIC1FSU8pOworCQlkZWNfcGVuZGluZyhpbywgcik7CiAJCWJpb19wdXQoY2xvbmUpOwogCX0KIH0KQEAgLTk2NiwyMyArOTY2LDIwIEBACiAgKi8KIGludCBkbV9zd2FwX3RhYmxlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX3RhYmxlICp0YWJsZSkKIHsKLQlpbnQgcjsKKwlpbnQgciA9IC1FSU5WQUw7CiAKIAlkb3duX3dyaXRlKCZtZC0+bG9jayk7CiAKIAkvKiBkZXZpY2UgbXVzdCBiZSBzdXNwZW5kZWQgKi8KLQlpZiAoIXRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpKSB7Ci0JCXVwX3dyaXRlKCZtZC0+bG9jayk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQorCWlmICghdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncykpCisJCWdvdG8gb3V0OwogCiAJX191bmJpbmQobWQpOwogCXIgPSBfX2JpbmQobWQsIHRhYmxlKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7CiAKK291dDoKIAl1cF93cml0ZSgmbWQtPmxvY2spOwotCXJldHVybiAwOworCXJldHVybiByOwogfQogCiAvKgpAQCAtMTA1NSwxNCArMTA1MiwxNyBAQAogCWlmICh0ZXN0X2JpdChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpKQogCQlnb3RvIG91dF9yZWFkX3VubG9jazsKIAotCWVycm9yID0gX19sb2NrX2ZzKG1kKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3JlYWRfdW5sb2NrOwotCiAJbWFwID0gZG1fZ2V0X3RhYmxlKG1kKTsKIAlpZiAobWFwKQorCQkvKiBUaGlzIGRvZXMgbm90IGdldCByZXZlcnRlZCBpZiB0aGVyZSdzIGFuIGVycm9yIGxhdGVyLiAqLwogCQlkbV90YWJsZV9wcmVzdXNwZW5kX3RhcmdldHMobWFwKTsKIAorCWVycm9yID0gX19sb2NrX2ZzKG1kKTsKKwlpZiAoZXJyb3IpIHsKKwkJZG1fdGFibGVfcHV0KG1hcCk7CisJCWdvdG8gb3V0X3JlYWRfdW5sb2NrOworCX0KKwogCXVwX3JlYWQoJm1kLT5sb2NrKTsKIAogCS8qCkBAIC0xMTIxLDcgKzExMjEsNiBAQAogCXJldHVybiAwOwogCiBvdXRfdW5mcmVlemU6Ci0JLyogRklYTUUgVW5kbyBkbV90YWJsZV9wcmVzdXNwZW5kX3RhcmdldHMgKi8KIAlfX3VubG9ja19mcyhtZCk7CiAJY2xlYXJfYml0KERNRl9CTE9DS19JTywgJm1kLT5mbGFncyk7CiBvdXRfd3JpdGVfdW5sb2NrOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDM4MDJmN2EuLjRhMGM1N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTMzOCw2ICszMzgsNyBAQAogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJkZXYtPm1kZGV2LT5wZW5kaW5nX3dyaXRlcykpCiAJCXdha2VfdXAoJnJkZXYtPm1kZGV2LT5zYl93YWl0KTsKKwliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCBlMTFkZDE0Li4yMTIwNzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC0zMTQsMTYgKzMxNCwxNiBAQAogCQlzZWN0b3JfdCBzcGFjZSA9IGNvbmYtPmhhc2hfc3BhY2luZzsKIAkJaW50IHJvdW5kOwogCQljb25mLT5wcmVzaGlmdCA9IDA7Ci0JCWlmIChzaXplb2Yoc2VjdG9yX3QpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisJCWlmIChzaXplb2Yoc2VjdG9yX3QpID4gc2l6ZW9mKHUzMikpIHsKIAkJCS8qc2hpZnQgZG93biBzcGFjZSBhbmQgcyBzbyB0aGF0IHNlY3Rvcl9kaXYgd2lsbCB3b3JrICovCi0JCQl3aGlsZSAoc3BhY2UgPiAoc2VjdG9yX3QpICh+KHVuc2lnbmVkIGxvbmcpMCkpIHsKKwkJCXdoaWxlIChzcGFjZSA+IChzZWN0b3JfdCkgKH4odTMyKTApKSB7CiAJCQkJcyA+Pj0gMTsKIAkJCQlzcGFjZSA+Pj0gMTsKIAkJCQlzICs9IDE7IC8qIGZvcmNlIHJvdW5kLXVwICovCiAJCQkJY29uZi0+cHJlc2hpZnQrKzsKIAkJCX0KIAkJfQotCQlyb3VuZCA9IHNlY3Rvcl9kaXYocywgKHVuc2lnbmVkIGxvbmcpc3BhY2UpID8gMSA6IDA7CisJCXJvdW5kID0gc2VjdG9yX2RpdihzLCAodTMyKXNwYWNlKSA/IDEgOiAwOwogCQluYl96b25lID0gcyArIHJvdW5kOwogCX0KIAlwcmludGsoInJhaWQwIDogbmJfem9uZSBpcyAlZC5cbiIsIG5iX3pvbmUpOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJCXZvbGF0aWxlCiAjZW5kaWYKIAkJc2VjdG9yX3QgeCA9IGJsb2NrID4+IGNvbmYtPnByZXNoaWZ0OwotCQlzZWN0b3JfZGl2KHgsICh1bnNpZ25lZCBsb25nKWNvbmYtPmhhc2hfc3BhY2luZyk7CisJCXNlY3Rvcl9kaXYoeCwgKHUzMiljb25mLT5oYXNoX3NwYWNpbmcpOwogCQl6b25lID0gY29uZi0+aGFzaF90YWJsZVt4XTsKIAl9CiAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggZmYxZGJlYy4uNWYyNTNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTEyNiwyMSArMTEyNiwxOSBAQAogCQkgKiBvbmx5IGJlIG9uZSBpbiByYWlkMSByZXN5bmMuCiAJCSAqIFdlIGNhbiBmaW5kIHRoZSBjdXJyZW50IGFkZGVzcyBpbiBtZGRldi0+Y3Vycl9yZXN5bmMKIAkJICovCi0JCWlmICghY29uZi0+ZnVsbHN5bmMpIHsKLQkJCWlmIChtZGRldi0+Y3Vycl9yZXN5bmMgPCBtYXhfc2VjdG9yKQotCQkJCWJpdG1hcF9lbmRfc3luYyhtZGRldi0+Yml0bWFwLAotCQkJCQkJbWRkZXYtPmN1cnJfcmVzeW5jLAorCQlpZiAobWRkZXYtPmN1cnJfcmVzeW5jIDwgbWF4X3NlY3RvcikgLyogYWJvcnRlZCAqLworCQkJYml0bWFwX2VuZF9zeW5jKG1kZGV2LT5iaXRtYXAsIG1kZGV2LT5jdXJyX3Jlc3luYywKIAkJCQkJCSZzeW5jX2Jsb2NrcywgMSk7Ci0JCQliaXRtYXBfY2xvc2Vfc3luYyhtZGRldi0+Yml0bWFwKTsKLQkJfQotCQlpZiAobWRkZXYtPmN1cnJfcmVzeW5jID49IG1heF9zZWN0b3IpCisJCWVsc2UgLyogY29tcGxldGVkIHN5bmMgKi8KIAkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKKworCQliaXRtYXBfY2xvc2Vfc3luYyhtZGRldi0+Yml0bWFwKTsKIAkJY2xvc2Vfc3luYyhjb25mKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFjb25mLT5mdWxsc3luYyAmJgotCSAgICAhYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MpKSB7CisJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgbWRkZXYtPmRlZ3JhZGVkKSAmJgorCSAgICAhY29uZi0+ZnVsbHN5bmMpIHsKIAkJLyogV2UgY2FuIHNraXAgdGhpcyBibG9jaywgYW5kIHByb2JhYmx5IHNldmVyYWwgbW9yZSAqLwogCQkqc2tpcHBlZCA9IDE7CiAJCXJldHVybiBzeW5jX2Jsb2NrczsKQEAgLTEyNDMsMTUgKzEyNDEsMTUgQEAKIAkJCWxlbiA9IChtYXhfc2VjdG9yIC0gc2VjdG9yX25yKSA8PCA5OwogCQlpZiAobGVuID09IDApCiAJCQlicmVhazsKLQkJaWYgKCFjb25mLT5mdWxsc3luYykgewotCQkJaWYgKHN5bmNfYmxvY2tzID09IDApIHsKLQkJCQlpZiAoIWJpdG1hcF9zdGFydF9zeW5jKG1kZGV2LT5iaXRtYXAsCi0JCQkJCQkgICAgICAgc2VjdG9yX25yLCAmc3luY19ibG9ja3MpKQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3luY19ibG9ja3MgPCAoUEFHRV9TSVpFPj45KSkKLQkJCQkJQlVHKCk7Ci0JCQkJaWYgKGxlbiA+IChzeW5jX2Jsb2Nrczw8OSkpIGxlbiA9IHN5bmNfYmxvY2tzPDw5OwotCQkJfQorCQlpZiAoc3luY19ibG9ja3MgPT0gMCkgeworCQkJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsCisJCQkJCSZzeW5jX2Jsb2NrcywgbWRkZXYtPmRlZ3JhZGVkKSAmJgorCQkJCQkhY29uZi0+ZnVsbHN5bmMpCisJCQkJYnJlYWs7CisJCQlpZiAoc3luY19ibG9ja3MgPCAoUEFHRV9TSVpFPj45KSkKKwkJCQlCVUcoKTsKKwkJCWlmIChsZW4gPiAoc3luY19ibG9ja3M8PDkpKQorCQkJCWxlbiA9IHN5bmNfYmxvY2tzPDw5OwogCQl9CiAKIAkJZm9yIChpPTAgOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKSB7CkBAIC0xMjY0LDcgKzEyNjIsOCBAQAogCQkJCQl3aGlsZSAoaSA+IDApIHsKIAkJCQkJCWktLTsKIAkJCQkJCWJpbyA9IHIxX2Jpby0+Ymlvc1tpXTsKLQkJCQkJCWlmIChiaW8tPmJpX2VuZF9pbz09TlVMTCkgY29udGludWU7CisJCQkJCQlpZiAoYmlvLT5iaV9lbmRfaW89PU5VTEwpCisJCQkJCQkJY29udGludWU7CiAJCQkJCQkvKiByZW1vdmUgbGFzdCBwYWdlIGZyb20gdGhpcyBiaW8gKi8KIAkJCQkJCWJpby0+YmlfdmNudC0tOwogCQkJCQkJYmlvLT5iaV9zaXplIC09IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKaW5kZXggNGFkYjI4NC4uYWI3YTFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBpci1jb21tb24uYyx2IDEuMTAgMjAwNS8wNS8yMiAxOToyMzozOSBuc2ggRXhwICQKKyAqICRJZDogaXItY29tbW9uLmMsdiAxLjExIDIwMDUvMDcvMDcgMTQ6NDQ6NDMgbWNoZWhhYiBFeHAgJAogICoKICAqIHNvbWUgY29tbW9uIHN0cnVjdHMgYW5kIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW5mcmFyZWQgcmVtb3RlcyB2aWEKICAqIGlucHV0IGxheWVyIC4uLgpAQCAtNDYsNzkgKzQ2LDQ5IEBACiAvKiBzZWUgaHR0cDovL3VzZXJzLnBhbmRvcmEuYmUvbmVueWEvZWxlY3Ryb25pY3MvcmM1L2NvZGVzMDAuaHRtICovCiAvKiB1c2VkIGJ5IG9sZCAoYmxhY2spIEhhdXBwYXVnZSByZW1vdGVzICAgICAgICAgICAgICAgICAgICAgICAgICovCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19yYzVfdHZbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHgwMCBdID0gS0VZX0tQMCwgICAgICAgICAgICAgLy8gMAotCVsgMHgwMSBdID0gS0VZX0tQMSwgICAgICAgICAgICAgLy8gMQotCVsgMHgwMiBdID0gS0VZX0tQMiwgICAgICAgICAgICAgLy8gMgotCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAgICAgLy8gMwotCVsgMHgwNCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAotCVsgMHgwNSBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQotCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgotCVsgMHgwNyBdID0gS0VZX0tQNywgICAgICAgICAgICAgLy8gNwotCVsgMHgwOCBdID0gS0VZX0tQOCwgICAgICAgICAgICAgLy8gOAotCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAgICAgLy8gOQorCS8qIEtleXMgMCB0byA5ICovCisJWyAweDAwIF0gPSBLRVlfS1AwLAorCVsgMHgwMSBdID0gS0VZX0tQMSwKKwlbIDB4MDIgXSA9IEtFWV9LUDIsCisJWyAweDAzIF0gPSBLRVlfS1AzLAorCVsgMHgwNCBdID0gS0VZX0tQNCwKKwlbIDB4MDUgXSA9IEtFWV9LUDUsCisJWyAweDA2IF0gPSBLRVlfS1A2LAorCVsgMHgwNyBdID0gS0VZX0tQNywKKwlbIDB4MDggXSA9IEtFWV9LUDgsCisJWyAweDA5IF0gPSBLRVlfS1A5LAogCi0JWyAweDBiIF0gPSBLRVlfQ0hBTk5FTCwgICAgICAgICAvLyBjaGFubmVsIC8gcHJvZ3JhbSAoamFwYW46IDExKQotCVsgMHgwYyBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gc3RhbmRieQotCVsgMHgwZCBdID0gS0VZX01VVEUsICAgICAgICAgICAgLy8gbXV0ZSAvIGRlbXV0ZQotCVsgMHgwZiBdID0gS0VZX1RWLCAgICAgICAgICAgICAgLy8gZGlzcGxheQotCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLCAgICAgICAgLy8gdm9sdW1lICsKLQlbIDB4MTEgXSA9IEtFWV9WT0xVTUVET1dOLCAgICAgIC8vIHZvbHVtZSAtCi0JWyAweDEyIF0gPSBLRVlfQlJJR0hUTkVTU1VQLCAgICAvLyBicmlnaHRuZXNzICsKLQlbIDB4MTMgXSA9IEtFWV9CUklHSFRORVNTRE9XTiwgIC8vIGJyaWdodG5lc3MgLQotCVsgMHgxZSBdID0gS0VZX1NFQVJDSCwgICAgICAgICAgLy8gc2VhcmNoICsKLQlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsICAgICAgIC8vIGNoYW5uZWwgLyBwcm9ncmFtICsKLQlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwgICAgIC8vIGNoYW5uZWwgLyBwcm9ncmFtIC0KLQlbIDB4MjIgXSA9IEtFWV9DSEFOTkVMLCAgICAgICAgIC8vIGFsdCAvIGNoYW5uZWwKLQlbIDB4MjMgXSA9IEtFWV9MQU5HVUFHRSwgICAgICAgIC8vIDFzdCAvIDJuZCBsYW5ndWFnZQotCVsgMHgyNiBdID0gS0VZX1NMRUVQLCAgICAgICAgICAgLy8gc2xlZXB0aW1lcgotCVsgMHgyZSBdID0gS0VZX01FTlUsICAgICAgICAgICAgLy8gMm5kIGNvbnRyb2xzIChVU0E6IG1lbnUpCi0JWyAweDMwIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzMiBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gcmV3aW5kCi0JWyAweDMzIF0gPSBLRVlfR09UTywgICAgICAgICAgICAvLyBnbyB0bwotCVsgMHgzNSBdID0gS0VZX1BMQVksICAgICAgICAgICAgLy8gcGxheQotCVsgMHgzNiBdID0gS0VZX1NUT1AsICAgICAgICAgICAgLy8gc3RvcAotCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwgICAgICAgICAgLy8gcmVjb3JkaW5nCi0JWyAweDNjIF0gPSBLRVlfVEVYVCwgICAgICAgICAgICAvLyB0ZWxldGV4dCBzdWJtb2RlIChKYXBhbjogMTIpCi0JWyAweDNkIF0gPSBLRVlfU1VTUEVORCwgICAgICAgICAvLyBzeXN0ZW0gc3RhbmRieQorCVsgMHgwYiBdID0gS0VZX0NIQU5ORUwsCQkvKiBjaGFubmVsIC8gcHJvZ3JhbSAoamFwYW46IDExKSAqLworCVsgMHgwYyBdID0gS0VZX1BPV0VSLAkJLyogc3RhbmRieSAqLworCVsgMHgwZCBdID0gS0VZX01VVEUsCQkvKiBtdXRlIC8gZGVtdXRlICovCisJWyAweDBmIF0gPSBLRVlfVFYsCQkvKiBkaXNwbGF5ICovCisJWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MTIgXSA9IEtFWV9CUklHSFRORVNTVVAsCisJWyAweDEzIF0gPSBLRVlfQlJJR0hUTkVTU0RPV04sCisJWyAweDFlIF0gPSBLRVlfU0VBUkNILAkJLyogc2VhcmNoICsgKi8KKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLyogY2hhbm5lbCAvIHByb2dyYW0gLSAqLworCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsCQkvKiBhbHQgLyBjaGFubmVsICovCisJWyAweDIzIF0gPSBLRVlfTEFOR1VBR0UsCS8qIDFzdCAvIDJuZCBsYW5ndWFnZSAqLworCVsgMHgyNiBdID0gS0VZX1NMRUVQLAkJLyogc2xlZXB0aW1lciAqLworCVsgMHgyZSBdID0gS0VZX01FTlUsCQkvKiAybmQgY29udHJvbHMgKFVTQTogbWVudSkgKi8KKwlbIDB4MzAgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCisJWyAweDMzIF0gPSBLRVlfR09UTywKKwlbIDB4MzUgXSA9IEtFWV9QTEFZLAorCVsgMHgzNiBdID0gS0VZX1NUT1AsCisJWyAweDM3IF0gPSBLRVlfUkVDT1JELAkJLyogcmVjb3JkaW5nICovCisJWyAweDNjIF0gPSBLRVlfVEVYVCwgICAgCS8qIHRlbGV0ZXh0IHN1Ym1vZGUgKEphcGFuOiAxMikgKi8KKwlbIDB4M2QgXSA9IEtFWV9TVVNQRU5ELAkJLyogc3lzdGVtIHN0YW5kYnkgKi8KIAotI2lmIDAgLyogRklYTUUgKi8KLQlbIDB4MGEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIDEvMi8zIGRpZ2l0cyAoamFwYW46IDEwKQotCVsgMHgwZSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gUC5QLiAocGVyc29uYWwgcHJlZmVyZW5jZSkKLQlbIDB4MTQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbG91ciBzYXR1cmF0aW9uICsKLQlbIDB4MTUgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbG91ciBzYXR1cmF0aW9uIC0KLQlbIDB4MTYgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhc3MgKwotCVsgMHgxNyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gYmFzcyAtCi0JWyAweDE4IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0cmVibGUgKwotCVsgMHgxOSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdHJlYmxlIC0KLQlbIDB4MWEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhbGFuY2UgcmlnaHQKLQlbIDB4MWIgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhbGFuY2UgbGVmdAotCVsgMHgxYyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gY29udHJhc3QgKwotCVsgMHgxZCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gY29udHJhc3QgLQotCVsgMHgxZiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdGludC9odWUgKwotCVsgMHgyNCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gc3BhY2lhbCBzdGVyZW8gb24vb2ZmCi0JWyAweDI1IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBtb25vIC8gc3RlcmVvIChVU0EpCi0JWyAweDI3IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0aW50IC8gaHVlIC0KLQlbIDB4MjggXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIFJGIHN3aXRjaC9QSVAgc2VsZWN0Ci0JWyAweDI5IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB2b3RlCi0JWyAweDJhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0aW1lZCBwYWdlL2NoYW5uZWwgY2xjawotCVsgMHgyYiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gaW5jcmVtZW50IChVU0EpCi0JWyAweDJjIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBkZWNyZW1lbnQgKFVTQSkKLQlbIDB4MmQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vCi0JWyAweDJmIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBQSVAgc2hpZnQKLQlbIDB4MzEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGVyYXNlCi0JWyAweDM0IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB3aW5kCi0JWyAweDM4IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBleHRlcm5hbCAxCi0JWyAweDM5IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBleHRlcm5hbCAyCi0JWyAweDNhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBQSVAgZGlzcGxheSBtb2RlCi0JWyAweDNiIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB2aWV3IGRhdGEgbW9kZSAvIGFkdmFuY2UKLQlbIDB4M2UgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNyaXNwZW5lciBvbi9vZmYKLQlbIDB4M2YgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIHN5c3RlbSBzZWxlY3QKLSNlbmRpZgogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3JjNV90dik7CiAKIC8qIFRhYmxlIGZvciBMZWFkdGVrIFdpbmZhc3QgUmVtb3RlIENvbnRyb2xzIC0gdXNlZCBieSBib3RoIGJ0dHYgYW5kIGN4ODggKi8KIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3dpbmZhc3RbSVJfS0VZVEFCX1NJWkVdID0geworCS8qIEtleXMgMCB0byA5ICovCisJWyAxOCBdID0gS0VZX0tQMCwKIAlbICA1IF0gPSBLRVlfS1AxLAogCVsgIDYgXSA9IEtFWV9LUDIsCiAJWyAgNyBdID0gS0VZX0tQMywKQEAgLTEyOCwzOSArOTgsMzEgQEAKIAlbIDEzIF0gPSBLRVlfS1A3LAogCVsgMTQgXSA9IEtFWV9LUDgsCiAJWyAxNSBdID0gS0VZX0tQOSwKLQlbIDE4IF0gPSBLRVlfS1AwLAogCiAJWyAgMCBdID0gS0VZX1BPV0VSLAotLy8gICAgICBbIDI3IF0gPSBNVFMgYnV0dG9uCi0JWyAgMiBdID0gS0VZX1RVTkVSLCAgICAgLy8gVFYvRk0KKwlbICAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSAqLwogCVsgMzAgXSA9IEtFWV9WSURFTywKLS8vICAgICAgWyAyMiBdID0gZGlzcGxheSBidXR0b24KIAlbICA0IF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAgOCBdID0gS0VZX1ZPTFVNRURPV04sCiAJWyAxMiBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDE2IF0gPSBLRVlfQ0hBTk5FTERPV04sCi0JWyAgMyBdID0gS0VZX1pPT00sICAgICAgLy8gZnVsbHNjcmVlbgotCVsgMzEgXSA9IEtFWV9TVUJUSVRMRSwgIC8vIGNsb3NlZCBjYXB0aW9uL3RlbGV0ZXh0CisJWyAgMyBdID0gS0VZX1pPT00sCQkvKiBmdWxsc2NyZWVuICovCisJWyAzMSBdID0gS0VZX1NVQlRJVExFLAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KIAlbIDMyIF0gPSBLRVlfU0xFRVAsCi0vLyAgICAgIFsgNDEgXSA9IGJvc3Mga2V5CiAJWyAyMCBdID0gS0VZX01VVEUsCiAJWyA0MyBdID0gS0VZX1JFRCwKIAlbIDQ0IF0gPSBLRVlfR1JFRU4sCiAJWyA0NSBdID0gS0VZX1lFTExPVywKIAlbIDQ2IF0gPSBLRVlfQkxVRSwKLQlbIDI0IF0gPSBLRVlfS1BQTFVTLCAgICAvL2ZpbmUgdHVuZSArCi0JWyAyNSBdID0gS0VZX0tQTUlOVVMsICAgLy9maW5lIHR1bmUgLQotLy8gICAgICBbIDQyIF0gPSBwaWN0dXJlIGluIHBpY3R1cmUKKwlbIDI0IF0gPSBLRVlfS1BQTFVTLAkJLyogZmluZSB0dW5lICsgKi8KKwlbIDI1IF0gPSBLRVlfS1BNSU5VUywJCS8qIGZpbmUgdHVuZSAtICovCiAgICAgICAgIFsgMzMgXSA9IEtFWV9LUERPVCwKIAlbIDE5IF0gPSBLRVlfS1BFTlRFUiwKLS8vICAgICAgWyAxNyBdID0gcmVjYWxsCiAJWyAzNCBdID0gS0VZX0JBQ0ssCiAJWyAzNSBdID0gS0VZX1BMQVlQQVVTRSwKIAlbIDM2IF0gPSBLRVlfTkVYVCwKLS8vICAgICAgWyAzNyBdID0gdGltZSBzaGlmdGluZwogCVsgMzggXSA9IEtFWV9TVE9QLAogCVsgMzkgXSA9IEtFWV9SRUNPUkQKLS8vICAgICAgWyA0MCBdID0gc25hcHNob3QKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc193aW5mYXN0KTsKIApAQCAtMTc0LDU0ICsxMzYsNjEgQEAKICAqIHNsaWdodGx5IGRpZmZlcmVudCB2ZXJzaW9ucyksIHNoaXBwZWQgd2l0aCBjeDg4K2l2dHYgY2FyZHMuCiAgKiBhbG1vc3QgcmM1IGNvZGluZywgYnV0IHNvbWUgbm9uLXN0YW5kYXJkIGtleXMgKi8KIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2hhdXBwYXVnZV9uZXdbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHgwMCBdID0gS0VZX0tQMCwgICAgICAgICAgICAgLy8gMAotCVsgMHgwMSBdID0gS0VZX0tQMSwgICAgICAgICAgICAgLy8gMQotCVsgMHgwMiBdID0gS0VZX0tQMiwgICAgICAgICAgICAgLy8gMgotCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAgICAgLy8gMwotCVsgMHgwNCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAotCVsgMHgwNSBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQotCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgotCVsgMHgwNyBdID0gS0VZX0tQNywgICAgICAgICAgICAgLy8gNwotCVsgMHgwOCBdID0gS0VZX0tQOCwgICAgICAgICAgICAgLy8gOAotCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAgICAgLy8gOQotCVsgMHgwYSBdID0gS0VZX1RFWFQsICAgICAgCS8vIGtleXBhZCBhc3RlcmlzayBhcyB3ZWxsCi0JWyAweDBiIF0gPSBLRVlfUkVELCAgICAgICAgICAgICAvLyByZWQgYnV0dG9uCi0JWyAweDBjIF0gPSBLRVlfUkFESU8sICAgICAgICAgICAvLyByYWRpbwotCVsgMHgwZCBdID0gS0VZX01FTlUsICAgICAgICAgICAgLy8gbWVudQotCVsgMHgwZSBdID0gS0VZX1NVQlRJVExFLAkvLyBhbHNvIHRoZSAjIGtleQotCVsgMHgwZiBdID0gS0VZX01VVEUsICAgICAgICAgICAgLy8gbXV0ZQotCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLCAgICAgICAgLy8gdm9sdW1lICsKLQlbIDB4MTEgXSA9IEtFWV9WT0xVTUVET1dOLCAgICAgIC8vIHZvbHVtZSAtCi0JWyAweDEyIF0gPSBLRVlfUFJFVklPVVMsICAgICAgICAvLyBwcmV2aW91cyBjaGFubmVsCi0JWyAweDE0IF0gPSBLRVlfVVAsICAgICAgICAgICAgICAvLyB1cAotCVsgMHgxNSBdID0gS0VZX0RPV04sCQkvLyBkb3duCi0JWyAweDE2IF0gPSBLRVlfTEVGVCwJCS8vIGxlZnQKLQlbIDB4MTcgXSA9IEtFWV9SSUdIVCwJCS8vIHJpZ2h0Ci0JWyAweDE4IF0gPSBLRVlfVklERU8sCQkvLyBWaWRlb3MKLQlbIDB4MTkgXSA9IEtFWV9BVURJTywJCS8vIE11c2ljCi0JWyAweDFhIF0gPSBLRVlfTUhQLAkJLy8gUGljdHVyZXMgLSBwcmVzdW1lIHRoaXMgbWVhbnMgIk11bHRpbWVkaWEgSG9tZSBQbGF0Zm9ybSItIG5vICJQSUNUVVJFUyIga2V5IGluIGlucHV0LmgKLQlbIDB4MWIgXSA9IEtFWV9FUEcsCQkvLyBHdWlkZQotCVsgMHgxYyBdID0gS0VZX1RWLAkJLy8gVFYKLQlbIDB4MWUgXSA9IEtFWV9ORVhUU09ORywgICAgICAgIC8vIHNraXAgPnwKLQlbIDB4MWYgXSA9IEtFWV9FWElULCAgICAgICAgICAgIC8vIGJhY2svZXhpdAotCVsgMHgyMCBdID0gS0VZX0NIQU5ORUxVUCwgICAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gKwotCVsgMHgyMSBdID0gS0VZX0NIQU5ORUxET1dOLCAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gLQotCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsICAgICAgICAgLy8gc291cmNlIChvbGQgYmxhY2sgcmVtb3RlKQotCVsgMHgyNCBdID0gS0VZX1BSRVZJT1VTU09ORywgICAgLy8gcmVwbGF5IHw8Ci0JWyAweDI1IF0gPSBLRVlfRU5URVIsICAgICAgICAgICAvLyBPSwotCVsgMHgyNiBdID0gS0VZX1NMRUVQLCAgICAgICAgICAgLy8gbWluaW1pemUgKG9sZCBibGFjayByZW1vdGUpCi0JWyAweDI5IF0gPSBLRVlfQkxVRSwgICAgICAgICAgICAvLyBibHVlIGtleQotCVsgMHgyZSBdID0gS0VZX0dSRUVOLCAgICAgICAgICAgLy8gZ3JlZW4gYnV0dG9uCi0JWyAweDMwIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzMiBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gYmFja3dhcmQgPDwKLQlbIDB4MzQgXSA9IEtFWV9GQVNURk9SV0FSRCwgICAgIC8vIGZvcndhcmQgPj4KLQlbIDB4MzUgXSA9IEtFWV9QTEFZLCAgICAgICAgICAgIC8vIHBsYXkKLQlbIDB4MzYgXSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8vIHN0b3AKLQlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZwotCVsgMHgzOCBdID0gS0VZX1lFTExPVywgICAgICAgICAgLy8geWVsbG93IGtleQotCVsgMHgzYiBdID0gS0VZX1NFTEVDVCwgICAgICAgICAgLy8gdG9wIHJpZ2h0IGJ1dHRvbgotCVsgMHgzYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gZnVsbAotCVsgMHgzZCBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gc3lzdGVtIHBvd2VyIChncmVlbiBidXR0b24pCisJLyogS2V5cyAwIHRvIDkgKi8KKwlbIDB4MDAgXSA9IEtFWV9LUDAsCisJWyAweDAxIF0gPSBLRVlfS1AxLAorCVsgMHgwMiBdID0gS0VZX0tQMiwKKwlbIDB4MDMgXSA9IEtFWV9LUDMsCisJWyAweDA0IF0gPSBLRVlfS1A0LAorCVsgMHgwNSBdID0gS0VZX0tQNSwKKwlbIDB4MDYgXSA9IEtFWV9LUDYsCisJWyAweDA3IF0gPSBLRVlfS1A3LAorCVsgMHgwOCBdID0gS0VZX0tQOCwKKwlbIDB4MDkgXSA9IEtFWV9LUDksCisKKwlbIDB4MGEgXSA9IEtFWV9URVhULCAgICAgIAkvKiBrZXlwYWQgYXN0ZXJpc2sgYXMgd2VsbCAqLworCVsgMHgwYiBdID0gS0VZX1JFRCwJCS8qIHJlZCBidXR0b24gKi8KKwlbIDB4MGMgXSA9IEtFWV9SQURJTywKKwlbIDB4MGQgXSA9IEtFWV9NRU5VLAorCVsgMHgwZSBdID0gS0VZX1NVQlRJVExFLAkvKiBhbHNvIHRoZSAjIGtleSAqLworCVsgMHgwZiBdID0gS0VZX01VVEUsCisJWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MTIgXSA9IEtFWV9QUkVWSU9VUywJLyogcHJldmlvdXMgY2hhbm5lbCAqLworCVsgMHgxNCBdID0gS0VZX1VQLAorCVsgMHgxNSBdID0gS0VZX0RPV04sCisJWyAweDE2IF0gPSBLRVlfTEVGVCwKKwlbIDB4MTcgXSA9IEtFWV9SSUdIVCwKKwlbIDB4MTggXSA9IEtFWV9WSURFTywJCS8qIFZpZGVvcyAqLworCVsgMHgxOSBdID0gS0VZX0FVRElPLAkJLyogTXVzaWMgKi8KKwkvKiAweDFhOiBQaWN0dXJlcyAtIHByZXN1bWUgdGhpcyBtZWFucworCSAgICJNdWx0aW1lZGlhIEhvbWUgUGxhdGZvcm0iIC0KKwkgICBubyAiUElDVFVSRVMiIGtleSBpbiBpbnB1dC5oCisJICovCisJWyAweDFhIF0gPSBLRVlfTUhQLAorCisJWyAweDFiIF0gPSBLRVlfRVBHLAkJLyogR3VpZGUgKi8KKwlbIDB4MWMgXSA9IEtFWV9UViwKKwlbIDB4MWUgXSA9IEtFWV9ORVhUU09ORywJLyogc2tpcCA+fCAqLworCVsgMHgxZiBdID0gS0VZX0VYSVQsCQkvKiBiYWNrL2V4aXQgKi8KKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLyogY2hhbm5lbCAvIHByb2dyYW0gLSAqLworCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsCQkvKiBzb3VyY2UgKG9sZCBibGFjayByZW1vdGUpICovCisJWyAweDI0IF0gPSBLRVlfUFJFVklPVVNTT05HLAkvKiByZXBsYXkgfDwgKi8KKwlbIDB4MjUgXSA9IEtFWV9FTlRFUiwJCS8qIE9LICovCisJWyAweDI2IF0gPSBLRVlfU0xFRVAsCQkvKiBtaW5pbWl6ZSAob2xkIGJsYWNrIHJlbW90ZSkgKi8KKwlbIDB4MjkgXSA9IEtFWV9CTFVFLAkJLyogYmx1ZSBrZXkgKi8KKwlbIDB4MmUgXSA9IEtFWV9HUkVFTiwJCS8qIGdyZWVuIGJ1dHRvbiAqLworCVsgMHgzMCBdID0gS0VZX1BBVVNFLAkJLyogcGF1c2UgKi8KKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsgMHgzNCBdID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWyAweDM1IF0gPSBLRVlfUExBWSwKKwlbIDB4MzYgXSA9IEtFWV9TVE9QLAorCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZGluZyAqLworCVsgMHgzOCBdID0gS0VZX1lFTExPVywJCS8qIHllbGxvdyBrZXkgKi8KKwlbIDB4M2IgXSA9IEtFWV9TRUxFQ1QsCQkvKiB0b3AgcmlnaHQgYnV0dG9uICovCisJWyAweDNjIF0gPSBLRVlfWk9PTSwJCS8qIGZ1bGwgKi8KKwlbIDB4M2QgXSA9IEtFWV9QT1dFUiwJCS8qIHN5c3RlbSBwb3dlciAoZ3JlZW4gYnV0dG9uKSAqLwogfTsKIEVYUE9SVF9TWU1CT0woaXJfY29kZXNfaGF1cHBhdWdlX25ldyk7CiAKQEAgLTIzNyw5ICsyMDYsOSBAQAogCVsgMTAgXSA9IEtFWV9LUDgsCiAJWyAxOCBdID0gS0VZX0tQOSwKIAotCVsgIDMgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KLQlbICA3IF0gPSBLRVlfU0VBUkNILCAgICAgIC8vIHNjYW4KLQlbIDI4IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCisJWyAgMyBdID0gS0VZX1RVTkVSLAkJLyogVFYvRk0gKi8KKwlbICA3IF0gPSBLRVlfU0VBUkNILAkJLyogc2NhbiAqLworCVsgMjggXSA9IEtFWV9aT09NLAkJLyogZnVsbCBzY3JlZW4gKi8KIAlbIDMwIF0gPSBLRVlfUE9XRVIsCiAJWyAyMyBdID0gS0VZX1ZPTFVNRURPV04sCiAJWyAzMSBdID0gS0VZX1ZPTFVNRVVQLApAQCAtMjQ3LDE0ICsyMTYsMTQgQEAKIAlbIDIyIF0gPSBLRVlfQ0hBTk5FTFVQLAogCVsgMjQgXSA9IEtFWV9NVVRFLAogCi0JWyAgMCBdID0gS0VZX0xJU1QsICAgICAgICAvLyBzb3VyY2UKLQlbIDE5IF0gPSBLRVlfSU5GTywgICAgICAgIC8vIGxvb3AKLQlbIDE2IF0gPSBLRVlfTEFTVCwgICAgICAgIC8vICsxMDAKLQlbIDEzIF0gPSBLRVlfQ0xFQVIsICAgICAgIC8vIHJlc2V0Ci0JWyAxMiBdID0gQlROX1JJR0hULCAgICAgICAvLyBmdW4rKwotCVsgIDQgXSA9IEJUTl9MRUZULCAgICAgICAgLy8gZnVuLS0KLQlbIDE0IF0gPSBLRVlfR09UTywgICAgICAgIC8vIGZ1bmN0aW9uCi0JWyAxNSBdID0gS0VZX1NUT1AsICAgICAgICAgLy8gZnJlZXplCisJWyAgMCBdID0gS0VZX0xJU1QsCQkvKiBzb3VyY2UgKi8KKwlbIDE5IF0gPSBLRVlfSU5GTywJCS8qIGxvb3AgKi8KKwlbIDE2IF0gPSBLRVlfTEFTVCwJCS8qICsxMDAgKi8KKwlbIDEzIF0gPSBLRVlfQ0xFQVIsCQkvKiByZXNldCAqLworCVsgMTIgXSA9IEJUTl9SSUdIVCwJCS8qIGZ1bisrICovCisJWyAgNCBdID0gQlROX0xFRlQsCQkvKiBmdW4tLSAqLworCVsgMTQgXSA9IEtFWV9HT1RPLAkJLyogZnVuY3Rpb24gKi8KKwlbIDE1IF0gPSBLRVlfU1RPUCwJCS8qIGZyZWV6ZSAqLwogfTsKIEVYUE9SVF9TWU1CT0woaXJfY29kZXNfcGl4ZWx2aWV3KTsKIApAQCAtMzIxLDEwICsyOTAsNiBAQAogCQlpci0+a2V5cHJlc3NlZCA9IDE7CiAJCWlyX2lucHV0X2tleV9ldmVudChkZXYsaXIpOwogCX0KLSNpZiAwCi0JLyogbWF5YmUgZG8gc29tZXRoaW5nIGxpa2UgdGhpcyA/Pz8gKi8KLQlpbnB1dF9ldmVudChhLCBFVl9JUiwgaXItPmlyX3R5cGUsIGlyLT5pcl9yYXcpOwotI2VuZGlmCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCmluZGV4IDUwZThiODYuLmNkNTgyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCkBAIC02MiwxMyArNjIsMTUgQEAKIGludCBzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IG5vYnVzeWxvb3ApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJLyogd2FpdCBmb3IgcmVnaXN0ZXJzIHRvIGJlIHByb2dyYW1tZWQgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2FhNzE0Nl9yZWFkKGRldiwgTUMyKSAmIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi8yMCkpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEhaLzIwKTsKKwkJaWYgKHNhYTcxNDZfcmVhZChkZXYsIE1DMikgJiAyKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCURFQl9TKCgidGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIpKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CkBAIC03OSwxMCArODEsMTEgQEAKIAkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZSAqLwogCXN0YXJ0ID0gamlmZmllczsKIAl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgSFovNCk7CiAJCWlmICghKHNhYTcxNDZfcmVhZChkZXYsIFBTUikgJiBTUENJX0RFQklfUykpCiAJCQlicmVhazsKIAkJc2FhNzE0Nl9yZWFkKGRldiwgTUMyKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi80KSkgeworCQlpZiAoZXJyKSB7CiAJCQlERUJfUygoInRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciBjb21wbGV0aW9uXG4iKSk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQpAQCAtNTEyLDcgKzUxNSw3IEBACiAJZXh0LT5kcml2ZXIucmVtb3ZlID0gc2FhNzE0Nl9yZW1vdmVfb25lOwogCiAJcHJpbnRrKCJzYWE3MTQ2OiByZWdpc3RlciBleHRlbnNpb24gJyVzJy5cbiIsZXh0LT5uYW1lKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZleHQtPmRyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmV4dC0+ZHJpdmVyKTsKIH0KIAogaW50IHNhYTcxNDZfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uKiBleHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwppbmRleCAwMTM4N2Y4Li4zZjBlYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKQEAgLTQwLDYgKzQwLDEwIEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZyIKIAorY29tbWVudCAiU3VwcG9ydGVkIFBsdXRvMiBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZyIKKwogY29tbWVudCAiU3VwcG9ydGVkIERWQiBGcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKaW5kZXggM2M2ZmYxNi4uYTdhZDA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIG11bHRpbWVkaWEgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLW9iai15ICAgICAgICA6PSBkdmItY29yZS8gZnJvbnRlbmRzLyB0dHBjaS8gdHR1c2ItZGVjLyB0dHVzYi1idWRnZXQvIGIyYzIvIGJ0OHh4LyBjaW5lcmd5VDIvIGR2Yi11c2IvCitvYmoteSAgICAgICAgOj0gZHZiLWNvcmUvIGZyb250ZW5kcy8gdHRwY2kvIHR0dXNiLWRlYy8gdHR1c2ItYnVkZ2V0LyBiMmMyLyBidDh4eC8gY2luZXJneVQyLyBkdmItdXNiLyBwbHV0bzIvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKaW5kZXggZmFmZDBhYi4uZDc0MTdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZwpAQCAtMzUsMTcgKzM1LDMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIG1vZHVsZSBvcHRpb24gdG8gY29udHJvbCBkZWJ1ZyBtZXNzYWdlcwogCSAgb2YgYWxsIEIyQzIgRmxleENvcCBkcml2ZXJzLgotCi1jb25maWcgRFZCX0IyQzJfU0tZU1RBUgotCXRyaXN0YXRlICJCMkMyL1RlY2huaXNhdCBBaXIvU2t5L0NhYmxlU3RhciAyIFBDSSIKLQlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQotCXNlbGVjdCBEVkJfU1RWMDI5OQotCXNlbGVjdCBEVkJfTVQzNTIKLQlzZWxlY3QgRFZCX01UMzEyCi0Jc2VsZWN0IERWQl9OWFQyMDAyCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgdGhlIFNreXN0YXIyIFBDSSBEVkIgY2FyZCBieSBUZWNobmlzYXQsIHdoaWNoCi0JICBpcyBlcXVpcHBlZCB3aXRoIHRoZSBGbGV4Q29wSUkgY2hpcHNldCBieSBCMkMyLCBhbmQKLQkgIGZvciB0aGUgQjJDMi9CQlRJIEFpcjJQQy1BVFNDIGNhcmQuCi0KLQkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQppbmRleCA3NzAzODEyLi4xYTFjM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKQEAgLTksNiArOSw0IEBACiBiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCiBvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCi1vYmotJChDT05GSUdfRFZCX0IyQzJfU0tZU1RBUikgKz0gc2t5c3RhcjIubwotCiBFWFRSQV9DRkxBR1MgPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaAppbmRleCA3NzNkMTU4Li5hOTQ5MTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oCkBAIC0xMDgsNiArMTA4LDggQEAKIGludCAgZmxleGNvcF9kZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UqKTsKIHZvaWQgZmxleGNvcF9kZXZpY2VfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKIAordm9pZCBmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKKwogLyogZnJvbSBmbGV4Y29wLWRtYS5jICovCiBpbnQgZmxleGNvcF9kbWFfYWxsb2NhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCB1MzIgc2l6ZSk7CiB2b2lkIGZsZXhjb3BfZG1hX2ZyZWUoc3RydWN0IGZsZXhjb3BfZG1hICpkbWEpOwpAQCAtMTE1LDcgKzExNyw4IEBACiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBubywgaW50IG9ub2ZmKTsKIGludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7CiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7Ci1pbnQgZmxleGNvcF9kbWFfY29uZmlnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4KTsKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCk7CitpbnQgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4LCBpbnQgb25vZmYpOwogaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcyk7CiBpbnQgZmxleGNvcF9kbWFfY29uZmlnX3BhY2tldF9jb3VudChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IHBhY2tldHMpOwogCkBAIC0xNTEsNiArMTU0LDcgQEAKIC8qIGZyb20gZmxleGNvcC1taXNjLmMgKi8KIHZvaWQgZmxleGNvcF9kZXRlcm1pbmVfcmV2aXNpb24oc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyk7CiB2b2lkIGZsZXhjb3BfZGV2aWNlX25hbWUoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyxjb25zdCBjaGFyICpwcmVmaXgsY29uc3QgY2hhciAqc3VmZml4KTsKK3ZvaWQgZmxleGNvcF9kdW1wX3JlZyhzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2liaV9yZWdpc3RlciByZWcsIGludCBudW0pOwogCiAvKiBmcm9tIGZsZXhjb3AtaHctZmlsdGVyLmMgKi8KIGludCBmbGV4Y29wX3BpZF9mZWVkX2NvbnRyb2woc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkLCBpbnQgb25vZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jCmluZGV4IDhkMjcwNjAuLmNmNGVkMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMKQEAgLTM3LDIyICszNyw5MCBAQAogfQogRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9mcmVlKTsKIAotaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywKKwkJc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCkKIHsKLQlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisJZmxleGNvcF9pYmlfdmFsdWUgdjB4MCx2MHg0LHYweGM7CisJdjB4MC5yYXcgPSB2MHg0LnJhdyA9IHYweGMucmF3ID0gMDsKIAotCWlmIChubyAmIEZDX0RNQV8xKQotCQl2LmN0cmxfMjA4LkRNQTFfVGltZXJfRW5hYmxlX3NpZyA9IG9ub2ZmOworCXYweDAuZG1hXzB4MC5kbWFfYWRkcmVzczAgICAgICAgID0gZG1hLT5kbWFfYWRkcjAgPj4gMjsKKwl2MHhjLmRtYV8weGMuZG1hX2FkZHJlc3MxICAgICAgICA9IGRtYS0+ZG1hX2FkZHIxID4+IDI7CisJdjB4NC5kbWFfMHg0X3dyaXRlLmRtYV9hZGRyX3NpemUgPSBkbWEtPnNpemUgLyA0OwogCi0JaWYgKG5vICYgRkNfRE1BXzIpCi0JCXYuY3RybF8yMDguRE1BMl9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisJaWYgKChkbWFfaWR4ICYgRkNfRE1BXzEpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMDAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDA0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwYyx2MHhjKTsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKKwl9IGVsc2UgeworCQllcnIoImVpdGhlciBETUExIG9yIERNQTIgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgdGhlIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfY29uZmlnIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZyk7CiAKLWludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKKy8qIHN0YXJ0IHRoZSBETUEgdHJhbnNmZXJzLCBidXQgbm90IHRoZSBETUEgSVJRcyAqLworaW50IGZsZXhjb3BfZG1hX3hmZXJfY29udHJvbChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWZsZXhjb3BfZG1hX2FkZHJfaW5kZXhfdCBpbmRleCwKKwkJaW50IG9ub2ZmKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHYweDAsdjB4YzsKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByMHgwLHIweGM7CisKKwlpZiAoKGRtYV9pZHggJiBGQ19ETUFfMSkgPT0gZG1hX2lkeCkgeworCQlyMHgwID0gZG1hMV8wMDA7CisJCXIweGMgPSBkbWExXzAwYzsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJcjB4MCA9IGRtYTJfMDEwOworCQlyMHhjID0gZG1hMl8wMWM7CisJfSBlbHNlIHsKKwkJZXJyKCJlaXRoZXIgdHJhbnNmZXIgRE1BMSBvciBETUEyIGNhbiBiZSBzdGFydGVkIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXYweDAgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweDApOworCXYweGMgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKworCWlmIChpbmRleCAmIEZDX0RNQV9TVUJBRERSXzApCisJCXYweDAuZG1hXzB4MC5kbWFfMHN0YXJ0ID0gb25vZmY7CisKKwlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQorCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IG9ub2ZmOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMscjB4MCx2MHgwKTsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyMHhjLHYweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKTsKKworc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOworCWRlYl9pbmZvKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOworCXJldHVybiAwOworfQorCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCkBAIC02Nyw3NSArMTM1LDY0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEpOwogCi1pbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCiAJaWYgKG5vICYgRkNfRE1BXzEpCisJCXYuY3RybF8yMDguRE1BMV9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisKKwlpZiAobm8gJiBGQ19ETUFfMikKKwkJdi5jdHJsXzIwOC5ETUEyX1RpbWVyX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CisKKy8qIDEgY3ljbGVzID0gMS45NyBtc2VjICovCitpbnQgZmxleGNvcF9kbWFfY29uZmlnX3RpbWVyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggY3ljbGVzKQoreworCWZsZXhjb3BfaWJpX3JlZ2lzdGVyIHIgPSAoZG1hX2lkeCAmIEZDX0RNQV8xKSA/IGRtYTFfMDA0IDogZG1hMl8wMTQ7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMscik7CisKKwlmbGV4Y29wX2RtYV9yZW1hcChmYyxkbWFfaWR4LDApOworCisJZGViX2luZm8oIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJdi5kbWFfMHg0X3dyaXRlLmRtYXRpbWVyID0gY3ljbGVzOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7CisKKy8qIHBhY2tldCBJUlEgZG9lcyBub3QgZXhpc3QgaW4gRkNJSSBvciBGQ0lJYiAtIGFjY29yZGluZyB0byBkYXRhIGJvb2sgYW5kIHRlc3RzICovCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCWlmIChubyAmIEZDX0RNQV8xKQogCQl2LmN0cmxfMjA4LkRNQTFfU2l6ZV9JUlFfRW5hYmxlX3NpZyA9IG9ub2ZmOwogCiAJaWYgKG5vICYgRkNfRE1BXzIpCiAJCXYuY3RybF8yMDguRE1BMl9TaXplX0lSUV9FbmFibGVfc2lnID0gb25vZmY7CiAKIAlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCx2KTsKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycSk7CiAKLWludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCxmbGV4Y29wX2RtYV9hZGRyX2luZGV4X3QgaW5kZXgpCi17Ci0KLQlmbGV4Y29wX2liaV92YWx1ZSB2MHgwLHYweDQsdjB4YzsKLQl2MHgwLnJhdyA9IHYweDQucmF3ID0gdjB4Yy5yYXcgPSAwOwotCi0JdjB4MC5kbWFfMHgwLmRtYV9hZGRyZXNzMCAgICAgICAgPSBkbWEtPmRtYV9hZGRyMCA+PiAyOwotCXYweGMuZG1hXzB4Yy5kbWFfYWRkcmVzczEgICAgICAgID0gZG1hLT5kbWFfYWRkcjEgPj4gMjsKLQl2MHg0LmRtYV8weDRfd3JpdGUuZG1hX2FkZHJfc2l6ZSA9IGRtYS0+c2l6ZSAvIDQ7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8wKQotCQl2MHgwLmRtYV8weDAuZG1hXzBzdGFydCA9IDE7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQotCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IDE7Ci0KLQlpZiAoZG1hX2lkeCAmIEZDX0RNQV8xKSB7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDAwLHYweDApOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwNCx2MHg0KTsKLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMGMsdjB4Yyk7Ci0JfSBlbHNlIHsgLyogKGRtYV9pZHggJiBGQ19ETUFfMikgKi8KLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfY29uZmlnKTsKLQotc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIGludCBvbm9mZikKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKLQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOwotCXJldHVybiAwOwotfQotCi0vKiAxIGN5Y2xlcyA9IDEuOTcgbXNlYyAqLwotaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcykKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCi0JZmxleGNvcF9kbWFfcmVtYXAoZmMsZG1hX2lkeCwwKTsKLQotCXYuZG1hXzB4NF93cml0ZS5kbWF0aW1lciA9IGN5Y2xlcyA+PiAxOwotCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7Ci0KLWludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgdTggcGFja2V0cykKK2ludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggcGFja2V0cykKIHsKIAlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwogCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jCmluZGV4IDJiYWY0M2QuLjc1Y2YyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1ody1maWx0ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaHctZmlsdGVyLmMKQEAgLTEwLDYgKzEwLDggQEAKIHN0YXRpYyB2b2lkIGZsZXhjb3BfcmN2X2RhdGFfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9zZXRfaWJpX3ZhbHVlKGN0cmxfMjA4LFJjdl9EYXRhX3NpZyxvbm9mZik7CisKKwlkZWJfdHMoInJjdl9kYXRhIGlzIG5vdzogJyVzJ1xuIixvbm9mZiA/ICJvbiIgOiAib2ZmIik7CiB9CiAKIHZvaWQgZmxleGNvcF9zbWNfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCkBAIC0xNTEsNyArMTUzLDcgQEAKIHsKIAlpbnQgbWF4X3BpZF9maWx0ZXIgPSA2ICsgZmMtPmhhc18zMl9od19waWRfZmlsdGVyKjMyOwogCi0JZmMtPmZlZWRjb3VudCArPSBvbm9mZiA/IDEgOiAtMTsKKwlmYy0+ZmVlZGNvdW50ICs9IG9ub2ZmID8gMSA6IC0xOyAvKiB0aGUgbnVtYmVyIG9mIFBJRHMvRmVlZCBjdXJyZW50bHkgcmVxdWVzdGVkICovCiAJaWYgKGR2YmRteGZlZWQtPmluZGV4ID49IG1heF9waWRfZmlsdGVyKQogCQlmYy0+ZXh0cmFfZmVlZGNvdW50ICs9IG9ub2ZmID8gMSA6IC0xOwogCkBAIC0xNzgsOCArMTgwLDE0IEBACiAJLyogaWYgaXQgd2FzIHRoZSBmaXJzdCBvciBsYXN0IGZlZWQgcmVxdWVzdCBjaGFuZ2UgdGhlIHN0cmVhbS1zdGF0dXMgKi8KIAlpZiAoZmMtPmZlZWRjb3VudCA9PSBvbm9mZikgewogCQlmbGV4Y29wX3Jjdl9kYXRhX2N0cmwoZmMsb25vZmYpOwotCQlpZiAoZmMtPnN0cmVhbV9jb250cm9sKQorCQlpZiAoZmMtPnN0cmVhbV9jb250cm9sKSAvKiBkZXZpY2Ugc3BlY2lmaWMgc3RyZWFtIGNvbnRyb2wgKi8KIAkJCWZjLT5zdHJlYW1fY29udHJvbChmYyxvbm9mZik7CisKKwkJLyogZmVlZGluZyBzdG9wcGVkIC0+IHJlc2V0IHRoZSBmbGV4Y29wIGZpbHRlciovCisJCWlmIChvbm9mZiA9PSAwKSB7CisJCQlmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMChmYyk7CisJCQlmbGV4Y29wX2h3X2ZpbHRlcl9pbml0KGZjKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLW1pc2MuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1taXNjLmMKaW5kZXggMjMwODI1NC4uM2EwOGQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLW1pc2MuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jCkBAIC02NSwzICs2NSwxNSBAQAogCQkJZmxleGNvcF9kZXZpY2VfbmFtZXNbZmMtPmRldl90eXBlXSxmbGV4Y29wX2J1c19uYW1lc1tmYy0+YnVzX3R5cGVdLAogCQkJZmxleGNvcF9yZXZpc2lvbl9uYW1lc1tmYy0+cmV2XSxzdWZmaXgpOwogfQorCit2b2lkIGZsZXhjb3BfZHVtcF9yZWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9pYmlfcmVnaXN0ZXIgcmVnLCBpbnQgbnVtKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHY7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHJlZys0KmkpOworCQlkZWJfcmR1bXAoIjB4JTAzeDogJTA4eCwgIixyZWcrNCppLCB2LnJhdyk7CisJfQorCWRlYl9yZHVtcCgiXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kdW1wX3JlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggZWQ3MTdjMC4uMmY3NmViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYwpAQCAtMTMsNiArMTMsMTAgQEAKIG1vZHVsZV9wYXJhbShlbmFibGVfcGlkX2ZpbHRlcmluZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3BpZF9maWx0ZXJpbmcsICJlbmFibGUgaGFyZHdhcmUgcGlkIGZpbHRlcmluZzogc3VwcG9ydGVkIHZhbHVlczogMCAoZnVsbHRzKSwgMSIpOwogCitzdGF0aWMgaW50IGlycV9jaGtfaW50djsKK21vZHVsZV9wYXJhbShpcnFfY2hrX2ludHYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycV9jaGtfaW50diwgInNldCB0aGUgaW50ZXJ2YWwgZm9yIElSUSB3YXRjaGRvZyAoY3VycmVudGx5IGp1c3QgZGVidWdnaW5nKS4iKTsKKwogI2lmZGVmIENPTkZJR19EVkJfQjJDMl9GTEVYQ09QX0RFQlVHCiAjZGVmaW5lIGRwcmludGsobGV2ZWwsYXJncy4uLikgXAogCWRvIHsgaWYgKChkZWJ1ZyAmIGxldmVsKSkgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQpAQCAtMjYsNiArMzAsNyBAQAogI2RlZmluZSBkZWJfcmVnKGFyZ3MuLi4pICAgZHByaW50aygweDAyLGFyZ3MpCiAjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKDB4MDQsYXJncykKICNkZWZpbmUgZGViX2lycShhcmdzLi4uKSAgIGRwcmludGsoMHgwOCxhcmdzKQorI2RlZmluZSBkZWJfY2hrKGFyZ3MuLi4pICAgZHByaW50aygweDEwLGFyZ3MpCiAKIHN0YXRpYyBpbnQgZGVidWcgPSAwOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNTYsNiArNjEsMTAgQEAKIAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CiAKKwl1bnNpZ25lZCBsb25nIGxhc3RfaXJxOworCisJc3RydWN0IHdvcmtfc3RydWN0IGlycV9jaGVja193b3JrOworCiAJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmY19kZXY7CiB9OwogCkBAIC04OCwxOCArOTcsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZmxleGNvcF9wY2lfaXJxX2NoZWNrX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRhdGE7CisJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZjX3BjaS0+ZmNfZGV2OworCisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsc3JhbV9kZXN0X3JlZ183MTQpOworCisJZmxleGNvcF9kdW1wX3JlZyhmY19wY2ktPmZjX2RldixkbWExXzAwMCw0KTsKKworCWlmICh2LnNyYW1fZGVzdF9yZWdfNzE0Lm5ldF9vdmZsb3dfZXJyb3IpCisJCWRlYl9jaGsoInNyYW0gbmV0X292Zmxvd19lcnJvclxuIik7CisJaWYgKHYuc3JhbV9kZXN0X3JlZ183MTQubWVkaWFfb3ZmbG93X2Vycm9yKQorCQlkZWJfY2hrKCJzcmFtIG1lZGlhX292Zmxvd19lcnJvclxuIik7CisJaWYgKHYuc3JhbV9kZXN0X3JlZ183MTQuY2FpX292Zmxvd19lcnJvcikKKwkJZGViX2Noaygic3JhbSBjYWlfb3ZmbG93X2Vycm9yXG4iKTsKKwlpZiAodi5zcmFtX2Rlc3RfcmVnXzcxNC5jYWlfb3ZmbG93X2Vycm9yKQorCQlkZWJfY2hrKCJzcmFtIGNhaV9vdmZsb3dfZXJyb3JcbiIpOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmY19wY2ktPmlycV9jaGVja193b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhpcnFfY2hrX2ludHYgPCAxMDAgPyAxMDAgOiBpcnFfY2hrX2ludHYpKTsKK30KKwogLyogV2hlbiBQSUQgZmlsdGVyaW5nIGlzIHR1cm5lZCBvbiwgd2UgdXNlIHRoZSB0aW1lciBJUlEsIGJlY2F1c2Ugc21hbGwgYW1vdW50cwogICogb2YgZGF0YSBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgdXNlciBzcGFjZSBpbnN0YW50bHkgYXMgd2VsbC4gV2hlbiBQSUQKICAqIGZpbHRlcmluZyBpcyB0dXJuZWQgb2ZmLCB3ZSB1c2UgdGhlIHBhZ2UtY2hhbmdlLUlSUSAqLwotc3RhdGljIGlycXJldHVybl90IGZsZXhjb3BfcGNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGZsZXhjb3BfcGNpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBmbGV4Y29wX3BjaSAqZmNfcGNpID0gZGV2X2lkOwogCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmY19wY2ktPmZjX2RldjsKLQlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxpcnFfMjBjKTsKKwlmbGV4Y29wX2liaV92YWx1ZSB2OwogCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwogCiAJc3Bpbl9sb2NrX2lycSgmZmNfcGNpLT5pcnFfbG9jayk7CiAKKwl2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxpcnFfMjBjKTsKKworICAgLyogZXJyb3JzICovCisJaWYgKHYuaXJxXzIwYy5EYXRhX3JlY2VpdmVyX2Vycm9yKQorCQlkZWJfY2hrKCJkYXRhIHJlY2VpdmVyIGVycm9yXG4iKTsKKwlpZiAodi5pcnFfMjBjLkNvbnRpbnVpdHlfZXJyb3JfZmxhZykKKwkJZGViX2NoaygiQ29udHVudWl0eSBlcnJvciBmbGFnIGlzIHNldFxuIik7CisJaWYgKHYuaXJxXzIwYy5MTENfU05BUF9GTEFHX3NldCkKKwkJZGViX2NoaygiTExDX1NOQVBfRkxBR19zZXQgaXMgc2V0XG4iKTsKKwlpZiAodi5pcnFfMjBjLlRyYW5zcG9ydF9FcnJvcikKKwkJZGViX2NoaygiVHJhbnNwb3J0IGVycm9yXG4iKTsKKworCWlmICgoZmNfcGNpLT5jb3VudCAlIDEwMDApID09IDApCisJCWRlYl9jaGsoIiVkIHZhbGlkIGlycSB0b29rIHBsYWNlIHNvIGZhclxuIixmY19wY2ktPmNvdW50KTsKKwogCWlmICh2LmlycV8yMGMuRE1BMV9JUlFfU3RhdHVzID09IDEpIHsKIAkJaWYgKGZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9PSAwKQogCQkJZmxleGNvcF9wYXNzX2RteF9wYWNrZXRzKGZjX3BjaS0+ZmNfZGV2LGZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCxmY19wY2ktPmRtYVswXS5zaXplIC8gMTg4KTsKQEAgLTExNSw4ICsxNjEsOSBAQAogCQkJZmMtPnJlYWRfaWJpX3JlZyhmYyxkbWExXzAwOCkuZG1hXzB4OC5kbWFfY3VyX2FkZHIgPDwgMjsKIAkJdTMyIGN1cl9wb3MgPSBjdXJfYWRkciAtIGZjX3BjaS0+ZG1hWzBdLmRtYV9hZGRyMDsKIAotCQlkZWJfaXJxKCJpcnE6ICUwOHggY3VyX2FkZHI6ICUwOHg6IGN1cl9wb3M6ICUwOHgsIGxhc3RfY3VyX3BvczogJTA4eCAiLAotCQkJCXYucmF3LGN1cl9hZGRyLGN1cl9wb3MsZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisJCWRlYl9pcnEoIiV1IGlycTogJTA4eCBjdXJfYWRkcjogJTA4eDogY3VyX3BvczogJTA4eCwgbGFzdF9jdXJfcG9zOiAlMDh4ICIsCisJCQkJamlmZmllc190b191c2VjcyhqaWZmaWVzIC0gZmNfcGNpLT5sYXN0X2lycSksdi5yYXcsY3VyX2FkZHIsY3VyX3BvcyxmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKTsKKwkJZmNfcGNpLT5sYXN0X2lycSA9IGppZmZpZXM7CiAKIAkJLyogYnVmZmVyIGVuZCB3YXMgcmVhY2hlZCwgcmVzdGFydGVkIGZyb20gdGhlIGJlZ2lubmluZwogCQkgKiBwYXNzIHRoZSBkYXRhIGZyb20gbGFzdF9jdXJfcG9zIHRvIHRoZSBidWZmZXIgZW5kIHRvIHRoZSBkZW11eApAQCAtMTI3LDcgKzE3NCw2IEBACiAJCQkJCWZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCArIGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MsCiAJCQkJCShmY19wY2ktPmRtYVswXS5zaXplKjIpIC0gZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CiAJCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gMDsKLQkJCWZjX3BjaS0+Y291bnQgPSAwOwogCQl9CiAKIAkJaWYgKGN1cl9wb3MgPiBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKSB7CkBAIC0xMzksMTYgKzE4NSwxNCBAQAogCQlkZWJfaXJxKCJcbiIpOwogCiAJCWZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MgPSBjdXJfcG9zOwotCX0gZWxzZQorCQlmY19wY2ktPmNvdW50Kys7CisJfSBlbHNlIHsKKwkJZGViX2lycSgiaXNyIGZvciBmbGV4Y29wIGNhbGxlZCwgYXBwYXJlbnRseSB3aXRob3V0IHJlYXNvbiAoJTA4eClcbiIsdi5yYXcpOwogCQlyZXQgPSBJUlFfTk9ORTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnEoJmZjX3BjaS0+aXJxX2xvY2spOwogCi0vKiBwYWNrZXQgY291bnQgd291bGQgYmUgaWRlYWwgZm9yIGh3IGZpbHRlcmluZywgYnV0IGl0IGlzbid0IHdvcmtpbmcuIEVpdGhlcgotICogdGhlIGRhdGEgYm9vayBpcyB3cm9uZywgb3IgSSdtIHVuYWJsZSB0byByZWFkIGl0IGNvcnJlY3RseSAqLwotCi0vKglpZiAodi5pcnFfMjBjLkRNQTFfU2l6ZV9JUlFfU3RhdHVzID09IDEpIHsgcGFja2V0IGNvdW50ZXIgKi8KLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1NiwzMCArMjAwLDM1IEBACiB7CiAJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPSBmYy0+YnVzX3NwZWNpZmljOwogCWlmIChvbm9mZikgewotCQlmbGV4Y29wX2RtYV9jb25maWcoZmMsJmZjX3BjaS0+ZG1hWzBdLEZDX0RNQV8xLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xKTsKLQkJZmxleGNvcF9kbWFfY29uZmlnKGZjLCZmY19wY2ktPmRtYVsxXSxGQ19ETUFfMixGQ19ETUFfU1VCQUREUl8wIHwgRkNfRE1BX1NVQkFERFJfMSk7Ci0JCWZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihmYyxGQ19ETUFfMSwxKTsKKwkJZmxleGNvcF9kbWFfY29uZmlnKGZjLCZmY19wY2ktPmRtYVswXSxGQ19ETUFfMSk7CisJCWZsZXhjb3BfZG1hX2NvbmZpZyhmYywmZmNfcGNpLT5kbWFbMV0sRkNfRE1BXzIpOwogCi0JCWlmIChmY19wY2ktPmZjX2Rldi0+cGlkX2ZpbHRlcmluZykgewotCQkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IDA7Ci0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwxKTsKLQkJfSBlbHNlIHsKLQkJCWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9IDA7Ci0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKGZjLEZDX0RNQV8xLDEpOwotCQl9CisJCWZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihmYyxGQ19ETUFfMSwwKTsKIAotLyoJCWZsZXhjb3BfZG1hX2NvbmZpZ19wYWNrZXRfY291bnQoZmMsRkNfRE1BXzEsMHhjMCk7Ci0JCWZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShmYyxGQ19ETUFfMSwxKTsgKi8KKwkJZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKGZjLEZDX0RNQV8xLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xLDEpOworCQlkZWJfaXJxKCJETUEgeGZlciBlbmFibGVkXG4iKTsKIAotCQlkZWJfaXJxKCJpcnFzIGVuYWJsZWRcbiIpOworCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gMDsKKwkJZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoZmMsRkNfRE1BXzEsMSk7CisJCWRlYl9pcnEoIklSUSBlbmFibGVkXG4iKTsKKworLy8JCWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9IDA7CisvLwkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwxKTsKKworCQlpZiAoaXJxX2Noa19pbnR2ID4gMCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmNfcGNpLT5pcnFfY2hlY2tfd29yaywKKwkJCQkJbXNlY3NfdG9famlmZmllcyhpcnFfY2hrX2ludHYgPCAxMDAgPyAxMDAgOiBpcnFfY2hrX2ludHYpKTsKIAl9IGVsc2UgewotCQlpZiAoZmNfcGNpLT5mY19kZXYtPnBpZF9maWx0ZXJpbmcpCi0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwwKTsKLQkJZWxzZQotCQkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwwKTsKKwkJaWYgKGlycV9jaGtfaW50diA+IDApCisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZmY19wY2ktPmlycV9jaGVja193b3JrKTsKIAotLy8JCWZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShmYyxGQ19ETUFfMSwwKTsKLQkJZGViX2lycSgiaXJxcyBkaXNhYmxlZFxuIik7CisJCWZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKGZjLEZDX0RNQV8xLDApOworCQlkZWJfaXJxKCJJUlEgZGlzYWJsZWRcbiIpOworCisvLwkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwwKTsKKworCQlmbGV4Y29wX2RtYV94ZmVyX2NvbnRyb2woZmMsRkNfRE1BXzEsRkNfRE1BX1NVQkFERFJfMCB8IEZDX0RNQV9TVUJBRERSXzEsMCk7CisJCWRlYl9pcnEoIkRNQSB4ZmVyIGRpc2FibGVkXG4iKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE5OCw2ICsyNDcsNyBAQAogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfQ0FPICAgfCBGQ19TUkFNX0RFU1RfQ0FJLCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTIpOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9ETUFfSU5JVDsKKwogCWdvdG8gc3VjY2VzczsKIGRtYTFfZnJlZToKIAlmbGV4Y29wX2RtYV9mcmVlKCZmY19wY2ktPmRtYVswXSk7CkBAIC0yNDQsNyArMjk0LDcgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShmY19wY2ktPnBkZXYsIGZjX3BjaSk7CiAKLQlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKGZjX3BjaS0+cGRldi0+aXJxLCBmbGV4Y29wX3BjaV9pcnEsCisJaWYgKChyZXQgPSByZXF1ZXN0X2lycShmY19wY2ktPnBkZXYtPmlycSwgZmxleGNvcF9wY2lfaXNyLAogCQkJCQlTQV9TSElSUSwgRFJJVkVSX05BTUUsIGZjX3BjaSkpICE9IDApCiAJCWdvdG8gZXJyX3BjaV9pb3VubWFwOwogCkBAIC0zMjQsNiArMzc0LDggQEAKIAlpZiAoKHJldCA9IGZsZXhjb3BfcGNpX2RtYV9pbml0KGZjX3BjaSkpICE9IDApCiAJCWdvdG8gZXJyX2ZjX2V4aXQ7CiAKKwlJTklUX1dPUksoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrLCBmY19wY2kpOworCiAJZ290byBzdWNjZXNzOwogZXJyX2ZjX2V4aXQ6CiAJZmxleGNvcF9kZXZpY2VfZXhpdChmYyk7CkBAIC0zNTAsMTcgKzQwMiwxNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZmxleGNvcF9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfREVWSUNFKDB4MTNkMCwgMHgyMTAzKSB9LAotLyoJeyBQQ0lfREVWSUNFKDB4MTNkMCwgMHgyMjAwKSB9LCBQQ0kgRmxleENvcElJSSA/ICovCisvKgl7IFBDSV9ERVZJQ0UoMHgxM2QwLCAweDIyMDApIH0sID8gKi8KIAl7IH0sCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZmxleGNvcF9wY2lfdGJsKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGZsZXhjb3BfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9ICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgUENJIiwKKwkubmFtZSAgICAgPSAiYjJjMl9mbGV4Y29wX3BjaSIsCiAJLmlkX3RhYmxlID0gZmxleGNvcF9wY2lfdGJsLAotCS5wcm9iZSA9IGZsZXhjb3BfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBmbGV4Y29wX3BjaV9yZW1vdmUsCisJLnByb2JlICAgID0gZmxleGNvcF9wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gZmxleGNvcF9wY2lfcmVtb3ZlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZmxleGNvcF9wY2lfbW9kdWxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaAppbmRleCA3NWI1MGYyLi40YWUxZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oCkBAIC0zNiw1NTUgKzM2LDIxIEBACiBleHRlcm4gY29uc3QgY2hhciAqZmxleGNvcF9kZXZpY2VfbmFtZXNbXTsKIAogLyogRmxleENvcCBJQkkgUmVnaXN0ZXJzICovCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJI2luY2x1ZGUgImZsZXhjb3BfaWJpX3ZhbHVlX2xlLmgiCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwkjaW5jbHVkZSAiZmxleGNvcF9pYmlfdmFsdWVfYmUuaCIKKyNlbHNlCisJI2Vycm9yIG5vIGVuZGlhbiBkZWZpbmVkCisjZW5kaWYKIAotLyogZmxleGNvcF9pYmlfcmVnIC0gYSBodWdlIHVuaW9uIHJlcHJlc2VudGluZyB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHVuaW9uIHsKLQl1MzIgcmF3OwotCi0vKiBETUEgMHgwMDAgdG8gMHgwMWMKLSAqIERNQTEgMHgwMDAgdG8gMHgwMGMKLSAqIERNQTIgMHgwMTAgdG8gMHgwMWMKLSAqLwotCXN0cnVjdCB7Ci0JCXUzMiBkbWFfMHN0YXJ0ICAgICAgICA6IDE7ICAgLyogc2V0OiBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIHRvIGRtYTFfYWRkcmVzczAgKi8KLSAgICAgICAgdTMyIGRtYV8wTm9fdXBkYXRlICAgIDogMTsgICAvKiBzZXQ6IGRtYTFfY3VyX2FkZHJlc3Mgd2lsbCBiZSB1cGRhdGVkLCB1bnNldDogbm8gdXBkYXRlICovCi0gICAgICAgIHUzMiBkbWFfYWRkcmVzczAgICAgICA6MzA7ICAgLyogcGh5c2ljYWwvdmlydHVhbCBob3N0IG1lbW9yeSBhZGRyZXNzMCBETUEgKi8KLQl9IGRtYV8weDA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgRE1BX21heHBhY2tldHMgICAgOiA4OyAgIC8qIChyZW1hcHBlZCkgUENJIERNQTEgUGFja2V0IENvdW50IEludGVycnVwdC4gVGhpcyB2YXJpYWJsZQotCQkJCQkJCQkJCWlzIGFibGUgdG8gYmUgcmVhZCBhbmQgd3JpdHRlbiB3aGlsZSBiaXQoMSkgb2YgcmVnaXN0ZXIKLQkJCQkJCQkJCQkweDAwYyAocmVtYXBfZW5hYmxlKSBpcyBzZXQuIFRoaXMgdmFyaWFibGUgcmVwcmVzZW50cwotCQkJCQkJCQkJCXRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIFBDSQotCQkJCQkJCQkJCWhvc3QgdXNpbmcgUENJIERNQTEgYmVmb3JlIGFuIGludGVycnVwdCB0byB0aGUgUENJIGlzCi0JCQkJCQkJCQkJYXNzZXJ0ZWQuIFRoaXMgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW5hYmxlZCB1c2luZyBiaXQoMjApCi0JCQkJCQkJCQkJb2YgcmVnaXN0ZXIgMHgyMDguIE49MCBkaXNhYmxlcyB0aGUgSVJRLiAqLwotCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgOjI0OyAgIC8qIHNpemUgb2YgbWVtb3J5IGJ1ZmZlciBpbiBEV09SRHMgKGJ5dGVzaXplIC8gNCkgZm9yIERNQSAqLwotCX0gZG1hXzB4NF9yZW1hcDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBkbWExdGltZXIgICAgICAgICA6IDc7ICAgLyogcmVhZGluZyBQQ0kgRE1BMSB0aW1lciAuLi4gd2hlbiByZW1hcF9lbmFibGUgaXMgMCAqLwotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiAxOwotCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgOjI0OwotCX0gZG1hXzB4NF9yZWFkOwotCi0Jc3RydWN0IHsKLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMTsKLQkJdTMyIGRtYXRpbWVyICAgICAgICAgIDogNzsgICAvKiB3cml0aW5nIFBDSSBETUExIHRpbWVyIC4uLiB3aGVuIHJlbWFwX2VuYWJsZSBpcyAwICovCi0JCXUzMiBkbWFfYWRkcl9zaXplICAgICA6MjQ7Ci0JfSBkbWFfMHg0X3dyaXRlOwotCi0Jc3RydWN0IHsKLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMjsKLQkJdTMyIGRtYV9jdXJfYWRkciAgICAgIDozMDsgICAvKiBjdXJyZW50IHBoeXNpY2FsIGhvc3QgbWVtb3J5IGFkZHJlc3MgcG9pbnRlciBmb3IgRE1BICovCi0JfSBkbWFfMHg4OwotCi0Jc3RydWN0IHsKLQkJdTMyIGRtYV8xc3RhcnQgICAgICAgIDogMTsgICAvKiBzZXQ6IGRhdGEgd2lsbCBiZSBkZWxpdmVyZWQgdG8gZG1hX2FkZHJlc3MxLCB3aGVuIGRtYV9hZGRyZXNzMCBpcyBmdWxsICovCi0JCXUzMiByZW1hcF9lbmFibGUgICAgICA6IDE7ICAgLyogcmVtYXAgZW5hYmxlIGZvciAweDB4NCg3OjApICovCi0JCXUzMiBkbWFfYWRkcmVzczEgICAgICA6MzA7ICAgLyogUGh5c2ljYWwvdmlydHVhbCBhZGRyZXNzIDEgb24gRE1BICovCi0JfSBkbWFfMHhjOwotCi0vKiBUd28td2lyZSBTZXJpYWwgTWFzdGVyIGFuZCBDbG9jayAweDEwMC0weDExMCAqLwotCXN0cnVjdCB7Ci0vLwkJdTMyIHNsYXZlX3RyYW5zbWl0dGVyIDogMTsgICAvKiA/Pz8qLwotCQl1MzIgY2hpcGFkZHIgICAgICAgICAgOiA3OyAgIC8qIHR3by1saW5lIHNlcmlhbCBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgc2xhdmUgKi8KLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMTsKLQkJdTMyIGJhc2VhZGRyICAgICAgICAgIDogODsgICAvKiBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb24gKi8KLQkJdTMyIGRhdGExX3JlZyAgICAgICAgIDogODsgICAvKiBmaXJzdCBieXRlIGluIHR3by1saW5lIHNlcmlhbCByZWFkL3dyaXRlIG9wZXJhdGlvbiAqLwotCQl1MzIgd29ya2luZ19zdGFydCAgICAgOiAxOyAgLyogd2hlbiBkb2luZyBhIHdyaXRlIG9wZXJhdGlvbiB0aGlzIGluZGljYXRvciBpcyAwIHdoZW4gcmVhZHkKLQkJCQkJCQkJCSAgKiBzZXQgdG8gMSB3aGVuIGRvaW5nIGEgd3JpdGUgb3BlcmF0aW9uICovCi0JCXUzMiB0d29XU19ydyAgICAgICAgICA6IDE7ICAgLyogcmVhZC93cml0ZSBpbmRpY2F0b3IgKDEgPSByZWFkLCAwIHdyaXRlKSAqLwotCQl1MzIgdG90YWxfYnl0ZXMgICAgICAgOiAyOyAgIC8qIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGVhY2ggdHdvLWxpbmUgc2VyaWFsIHRyYW5zYWN0aW9uICgwID0gMSBieXRlLCAxMSA9IDRieXRlKSovCi0JCXUzMiB0d29XU19wb3J0X3JlZyAgICA6IDI7ICAgLyogcG9ydCBzZWxlY3Rpb246IDAxIC0gRnJvbnQgRW5kL0RlbW9kLCAxMCAtIEVFUFJPTSwgMTEgLSBUdW5lciAqLwotCQl1MzIgbm9fYmFzZV9hZGRyX2Fja19lcnJvciA6IDE7ICAgLyogd3JpdGluZzogd3JpdGUtcmVxOiBmcmFtZSBpcyBwcm9kdWNlZCB3L28gYmFzZWFkZHIsIHJlYWQtcmVxOiByZWFkLWN5Y2xlcyB3L28KLQkJCQkJCQkJCSAgKiBwcmVjZWRpbmcgYWRkcmVzcyBhc3NpZ25tZW50IHdyaXRlIGZyYW1lCi0JCQkJCQkJCQkgICogQUNLX0VSUk9SID0gMSB3aGVuIG5vIEFDSyBmcm9tIHNsYXZlIGluIHRoZSBsYXN0IHRyYW5zYWN0aW9uICovCi0JCXUzMiBzdF9kb25lICAgICAgICAgICA6IDE7ICAgLyogaW5kaWNhdG9yIGZvciB0cmFuc2FjdGlvbiBpcyBkb25lICovCi0JfSB0d19zbV9jXzEwMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBkYXRhMl9yZWcgICAgICAgICA6IDg7ICAgLyogMm5kIGRhdGEgYnl0ZSAqLwotCQl1MzIgZGF0YTNfcmVnICAgICAgICAgOiA4OyAgIC8qIDNyZCBkYXRhIGJ5dGUgKi8KLQkJdTMyIGRhdGE0X3JlZyAgICAgICAgIDogODsgICAvKiA0dGggZGF0YSBieXRlICovCi0JCXUzMiBleGxpY2l0X3N0b3BzICAgICA6IDE7ICAgLyogd2hlbiBzZXQsIHRyYW5zYWN0aW9ucyBhcmUgcHJvZHVjZWQgdy9vIHRyYWlsaW5nIFNUT1AgZmxhZywgdGhlbiBzZW5kIGlzb2xhdGVkIFNUT1AgZmxhZ3MgKi8KLQkJdTMyIGZvcmNlX3N0b3AgICAgICAgIDogMTsgICAvKiBpc29sYXRlZCBzdG9wIGZsYWcgKi8KLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogNjsKLQl9IHR3X3NtX2NfMTA0OwotCi0vKiBDbG9jay4gVGhlIHJlZ2lzdGVyIGFsbG93cyB0aGUgRkNJSUkgdG8gY29udmVydCBhbiBpbmNvbWluZyBNYXN0ZXIgY2xvY2sKLSAqIChNQ0xLKSBzaWduYWwgaW50byBhIGxvd2VyIGZyZXF1ZW5jeSBjbG9jayB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBMb3dDb3VudGVyCi0gKiAoVExPKSBhbmQgYSBIaWdoLSBDb3VudGVyIChUSEkpLiBUaGUgdGltZSBjb3VudHMgZm9yIFRISSBhbmQgVExPIGFyZQotICogbWVhc3VyZWQgaW4gTUNMSzsgZWFjaCBjb3VudCByZXByZXNlbnRzIDQgTUNMSyBpbnB1dCBjbG9jayBjeWNsZXMuCi0gKgotICogVGhlIGRlZmF1bHQgb3V0cHV0IGZvciBwb3J0ICMxIGlzIHNldCBmb3IgRnJvbnQgRW5kIERlbW9kIGNvbW11bmljYXRpb24uICgweDEwOCkKLSAqIFRoZSBkZWZhdWx0IG91dHB1dCBmb3IgcG9ydCAjMiBpcyBzZXQgZm9yIEVFUFJPTSBjb21tdW5pY2F0aW9uLiAoMHgxMGMpCi0gKiBUaGUgZGVmYXVsdCBvdXRwdXQgZm9yIHBvcnQgIzMgaXMgc2V0IGZvciBUdW5lciBjb21tdW5pY2F0aW9uLiAoMHgxMTApCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgdGhpMSAgICAgICAgICAgICAgOiA2OyAgIC8qIFRoaSBmb3IgcG9ydCAjMSAoZGVmOiAxMDAxMTBiOyAzOCkgKi8KLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMjsKLQkJdTMyIHRsbzEgICAgICAgICAgICAgIDogNTsgICAvKiBUbG8gZm9yIHBvcnQgIzEgKGRlZjogMTExMDBiOyAyOCkgKi8KLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDoxOTsKLQl9IHR3X3NtX2NfMTA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIHRoaTEgICAgICAgICAgICAgIDogNjsgICAvKiBUaGkgZm9yIHBvcnQgIzIgKGRlZjogMTExMDAxYjsgNTcpICovCi0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDI7Ci0JCXUzMiB0bG8xICAgICAgICAgICAgICA6IDU7ICAgLyogVGxvIGZvciBwb3J0ICMyIChkZWY6IDExMTAwYjsgMjgpICovCi0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6MTk7Ci0JfSB0d19zbV9jXzEwYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB0aGkxICAgICAgICAgICAgICA6IDY7ICAgLyogVGhpIGZvciBwb3J0ICMzIChkZWY6IDExMTAwMWI7IDU3KSAqLwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAyOwotCQl1MzIgdGxvMSAgICAgICAgICAgICAgOiA1OyAgIC8qIFRsbyBmb3IgcG9ydCAjMyAoZGVmOiAxMTEwMGI7IDI4KSAqLwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOjE5OwotCX0gdHdfc21fY18xMTA7Ci0KLS8qIExOQiBTd2l0Y2ggRnJlcXVlbmN5IDB4MjAwCi0gKiBDbG9jayB0aGF0IGNyZWF0ZXMgdGhlIExOQiBzd2l0Y2ggdG9uZS4gVGhlIGRlZmF1bHQgaXMgc2V0IHRvIGhhdmUgYSBmaXhlZAotICogbG93IG91dHB1dCAobm90IG9zY2lsbGF0aW5nKSB0byB0aGUgTE5CX0NUTCBsaW5lLgotICovCi0Jc3RydWN0IHsKLQkJdTMyIExOQl9DVExIaWdoQ291bnRfc2lnIDoxNTsgLyogSXQgaXMgdGhlIG51bWJlciBvZiBwcmUtc2NhbGVkIGNsb2NrIGN5Y2xlcyB0aGF0IHdpbGwgYmUgbG93LiAqLwotCQl1MzIgTE5CX0NUTExvd0NvdW50X3NpZyAgOjE1OyAvKiBGb3IgZXhhbXBsZSwgdG8gb2J0YWluIGEgMjJLSHogb3V0cHV0IGdpdmVuIGEgNDUgTWh6IE1hc3RlcgotCQkJCQkJCQkJCUNsb2NrIHNpZ25hbCAoTUNMSyksIHNldCBQcmVTY2FsYXI9MDEgYW5kIExvd0NvdW50ZXIgdmFsdWUgdG8gMHgxZmYuICovCi0JCXUzMiBMTkJfQ1RMUHJlc2NhbGVyX3NpZyA6IDI7IC8qIHByZS1zY2FsZXIgZGl2aWRlcyBNQ0xLOiAwMCAobm8gZGl2aXNpb24pLCAwMSBieSAyLCAxMCBieSA0LCAxMSBieSAxMiAqLwotCX0gbG5iX3N3aXRjaF9mcmVxXzIwMDsKLQotLyogQUNQSSwgUGVyaXBoZXJhbCBSZXNldCwgTE5CIFBvbGFyaXR5Ci0gKiBBQ1BJIHBvd2VyIGNvbnNlcnZhdGlvbiBtb2RlLCBMTkIgcG9sYXJpdHkgc2VsZWN0aW9uIChsb3cgb3IgaGlnaCB2b2x0YWdlKSwKLSAqIGFuZCBwZXJpcGhlcmFsIHJlc2V0LgotICovCi0Jc3RydWN0IHsKLQkJdTMyIEFDUEkxX3NpZyAgICAgICAgIDogMTsgICAvKiB0dXJuIG9mIHRoZSBwb3dlciBvZiB0dW5lciBhbmQgTE5CLCBub3QgaW1wbGVtZW50ZWQgaW4gRkNJSUkgKi8KLQkJdTMyIEFDUEkzX3NpZyAgICAgICAgIDogMTsgICAvKiB0dXJuIG9mIHBvd2VyIG9mIHRoZSBjb21wbGV0ZSBzYXRlbGl0ZSByZWNlaXZlciBib2FyZCAoZXhjZXB0IEZDSUlJKSAqLwotCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgOiAxOyAgIC8qIGxvdyBvciBoaWdoIHZvbHRhZ2UgZm9yIExOQi4gKDAgPSBsb3csIDEgPSBoaWdoKSAqLwotCQl1MzIgUGVyX3Jlc2V0X3NpZyAgICAgOiAxOyAgIC8qIG1pc2MuIGluaXQgcmVzZXQgKGRlZmF1bHQ6IDEpLCB0byByZXNldCBzZXQgdG8gbG93IGFuZCBiYWNrIHRvIGhpZ2ggKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDoyMDsKLQkJdTMyIFJldl9OX3NpZ19yZXZpc2lvbl9oaSA6IDQ7LyogMHhjIGluIGNhc2Ugb2YgRkNJSUkgKi8KLQkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDEgOiAyOwotCQl1MzIgUmV2X05fc2lnX2NhcHMgICAgOiAxOyAgIC8qIGlmIDEsIEZDSUlJIGhhcyAzMiBQSUQtIGFuZCBNQUMtZmlsdGVycyBhbmQgaXMgY2FwYWJsZSBvZiBJUCBtdWx0aWNhc3QgKi8KLQkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDIgOiAxOwotCX0gbWlzY18yMDQ7Ci0KLS8qIENvbnRyb2wgYW5kIFN0YXR1cyAweDIwOCB0byAweDIxYyAqLwotLyogR3Jvc3MgZW5hYmxlIGFuZCBkaXNhYmxlIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgewotCQl1MzIgU3RyZWFtMV9maWx0ZXJfc2lnIDogMTsgIC8qIFN0cmVhbTEgUElEIGZpbHRlcmluZyAqLwotCQl1MzIgU3RyZWFtMl9maWx0ZXJfc2lnIDogMTsgIC8qIFN0cmVhbTIgUElEIGZpbHRlcmluZyAqLwotCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIFBDUiBQSUQgZmlsdGVyICovCi0JCXUzMiBQTVRfZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogUE1UIFBJRCBmaWx0ZXIgKi8KLQotCQl1MzIgRU1NX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIEVNTSBQSUQgZmlsdGVyICovCi0JCXUzMiBFQ01fZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogRUNNIFBJRCBmaWx0ZXIgKi8KLQkJdTMyIE51bGxfZmlsdGVyX3NpZyAgIDogMTsgICAvKiBGaWx0ZXJzIG51bGwgcGFja2V0cywgUElEPTB4MWZmZi4gKi8KLQkJdTMyIE1hc2tfZmlsdGVyX3NpZyAgIDogMTsgICAvKiBtYXNrIFBJRCBmaWx0ZXIgKi8KLQotCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgOiAxOyAgIC8qIFdBTiBvdXRwdXQgbGluZSB0aHJvdWdoIFY4IG1lbW9yeSBzcGFjZSBpcyBhY3RpdmF0ZWQuICovCi0JCXUzMiBXQU5fQ0FfRW5hYmxlX3NpZyA6IDE7ICAgLyogbm90IGluIEZDSUlJICovCi0JCXUzMiBDQV9FbmFibGVfc2lnICAgICA6IDE7ICAgLyogbm90IGluIEZDSUlJICovCi0JCXUzMiBTTUNfRW5hYmxlX3NpZyAgICA6IDE7ICAgLyogQ0kgc3RyZWFtIGRhdGEgKENBSSkgZ29lcyBkaXJlY3RseSB0byB0aGUgc21hcnQgY2FyZCBpbnRmIChvcHBvc2VkIElCSSAweDYwMCBvciBTQy1jbWQgYnVmKS4gKi8KLQotCQl1MzIgUGVyX0NBX0VuYWJsZV9zaWcgOiAxOyAgIC8qIG5vdCBpbiBGQ0lJSSAqLwotCQl1MzIgTXVsdGkyX0VuYWJsZV9zaWcgOiAxOyAgIC8qID8gKi8KLQkJdTMyIE1BQ19maWx0ZXJfTW9kZV9zaWcgOiAxOyAvKiAoTUFDX2ZpbHRlcl9lbmFibGUpIEdsb2JhbGx5IGVuYWJsZXMgTUFDIGZpbHRlcnMgZm9yIE5ldCBQSUQgZmlsdGVyZXMuICovCi0JCXUzMiBSY3ZfRGF0YV9zaWcgICAgICA6IDE7ICAgLyogUElEIGZpbHRlcmluZyBtb2R1bGUgZW5hYmxlLiBXaGVuIHRoaXMgYml0IGlzIGEgb25lLCB0aGUgUElEIGZpbHRlciB3aWxsCi0JCQkJCQkJCQkJZXhhbWluZSBhbmQgcHJvY2VzcyBwYWNrZXRzIGFjY29yZGluZyB0byBhbGwgb3RoZXIgKGluZGl2aWR1YWwpIFBJRAotCQkJCQkJCQkJCWZpbHRlcmluZyBjb250cm9scy4gSWYgaXQgYSB6ZXJvLCBubyBwYWNrZXQgcHJvY2Vzc2luZyBvZiBhbnkga2luZCB3aWxsCi0JCQkJCQkJCQkJdGFrZSBwbGFjZS4gQWxsIGRhdGEgZnJvbSB0aGUgdHVuZXIgd2lsbCBiZSB0aHJvd24gYXdheS4gKi8KLQotCQl1MzIgRE1BMV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIERXT1JEIGNvdW50ZXIgaXMgZW5hYmxlZCBvbiBQQ0kgRE1BMSB0aGF0IGFzc2VydHMgdGhlIFBDSQotCQkJCQkJCQkJICAqIGludGVycnVwdCBhZnRlciB0aGUgc3BlY2lmaWVkIGNvdW50IGZvciBmaWxsaW5nIHRoZSBidWZmZXIuICovCi0JCXUzMiBETUExX1RpbWVyX0VuYWJsZV9zaWcgOiAxOyAvKiBXaGVuIHNldCwgYSB0aW1lciBpcyBlbmFibGVkIG9uIFBDSSBETUExIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdAotCQkJCQkJCQkJCQlhZnRlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gKi8KLQkJdTMyIERNQTJfSVJRX0VuYWJsZV9zaWcgOiAxOyAgIC8qIHNhbWUgYXMgRE1BMV9JUlFfRW5hYmxlX3NpZyBidXQgZm9yIERNQTIgKi8KLQkJdTMyIERNQTJfVGltZXJfRW5hYmxlX3NpZyA6IDE7ICAgLyogc2FtZSBhcyBETUExX1RpbWVyX0VuYWJsZV9zaWcgYnV0IGZvciBETUEyICovCi0KLQkJdTMyIERNQTFfU2l6ZV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIHBhY2tldCBjb3VudCBkZXRlY3RvciBpcyBlbmFibGVkIG9uIFBDSSBETUExIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdC4gKi8KLQkJdTMyIERNQTJfU2l6ZV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIHBhY2tldAljb3VudCBkZXRlY3RvciBpcyBlbmFibGVkIG9uIFBDSSBETUEyIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdC4gKi8KLQkJdTMyIE1haWxib3hfZnJvbV9WOF9FbmFibGVfc2lnOiAxOyAvKiBXaGVuIHNldCwgd3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHByb2R1Y2UgYW4gaW50ZXJydXB0IHRvIHRoZQotCQkJCQkJCQkJCQlQQ0kgaG9zdCB0byBpbmRpY2F0ZSB0aGF0IG1haWxib3ggZGF0YSBpcyBhdmFpbGFibGUuICovCi0KLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogOTsKLQl9IGN0cmxfMjA4OwotCi0vKiBHZW5lcmFsIHN0YXR1cy4gV2hlbiBhIFBDSSBpbnRlcnJ1cHQgb2NjdXJzLCB0aGlzIHJlZ2lzdGVyIGlzIHJlYWQgdG8KLSAqIGRpc2NvdmVyIHRoZSByZWFzb24gZm9yIHRoZSBpbnRlcnJ1cHQuCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgRE1BMV9JUlFfU3RhdHVzICAgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUExIGNvdW50ZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KLQkJdTMyIERNQTFfVGltZXJfU3RhdHVzIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMSB0aW1lciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUEyIGNvdW50ZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KLQkJdTMyIERNQTJfVGltZXJfU3RhdHVzIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMiB0aW1lciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMV9TaXplX0lSUV9TdGF0dXMgOiAxOyAvKiAoUmVhZCBvbmx5KS4gVGhpcyByZWdpc3RlciBpcyByZWFkIGFmdGVyIGFuIGludGVycnVwdCB0byAqLwotCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgOiAxOyAvKiBmaW5kIG91dCB3aHkgd2UgaGFkIGFuIElSUS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgdGhpcyBiaXQuIFBhY2tldCBjb3VudCovCi0JCXUzMiBNYWlsYm94X2Zyb21fVjhfU3RhdHVzX3NpZzogMTsgLyogU2FtZSBhcyBhYm92ZS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgdGhpcyBiaXQuICovCi0JCXUzMiBEYXRhX3JlY2VpdmVyX2Vycm9yIDogMTsgLyogMSBpbmRpY2F0ZSBhbiBlcnJvciBpbiB0aGUgcmVjZWl2ZXIgRnJvbnQgRW5kIChUdW5lciBtb2R1bGUpICovCi0JCXUzMiBDb250aW51aXR5X2Vycm9yX2ZsYWcgOiAxOyAgIC8qIDEgaW5kaWNhdGVzIGEgY29udGludWl0eSBlcnJvciBpbiB0aGUgVFMgc3RyZWFtLiAqLwotCQl1MzIgTExDX1NOQVBfRkxBR19zZXQgOiAxOyAgIC8qIDEgaW5kaWNhdGVzIHRoYXQgdGhlIExDQ19TTkFQX0ZMQUcgd2FzIHNldC4gKi8KLQkJdTMyIFRyYW5zcG9ydF9FcnJvciAgIDogMTsgICAvKiAgV2hlbiBzZXQgaW5kaWNhdGVzIHRoYXQgYW4gdW5leHBlY3RlZCBwYWNrZXQgd2FzIHJlY2VpdmVkLiAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjIxOwotCX0gaXJxXzIwYzsKLQotCi0vKiBTb2Z0d2FyZSByZXNldCByZWdpc3RlciAqLwotCXN0cnVjdCB7Ci0JCXUzMiByZXNldF9ibG9ja3MgICAgICA6IDg7ICAgLyogRW5hYmxlZCB3aGVuIEJsb2NrX3Jlc2V0X2VuYWJsZSA9IDB4QjIgYW5kIDB4MjA4IGJpdHMgMTU6OCA9IDB4MDAuCi0JCQkJCQkJCQkJRWFjaCBiaXQgbG9jYXRpb24gcmVwcmVzZW50cyBhIDB4MTAwIGJsb2NrIG9mIHJlZ2lzdGVycy4gV3JpdGluZwotCQkJCQkJCQkJCWEgb25lIGluIGEgYml0IGxvY2F0aW9uIHJlc2V0cyB0aGF0IGJsb2NrIG9mIHJlZ2lzdGVycyBhbmQgdGhlIGxvZ2ljCi0JCQkJCQkJCQkJdGhhdCBpdCBjb250cm9scy4gKi8KLQkJdTMyIEJsb2NrX3Jlc2V0X2VuYWJsZSA6IDg7ICAvKiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAweEIyIHdoZW4gdGhlIHJlZ2lzdGVyIGlzIHdyaXR0ZW4uICovCi0JCXUzMiBTcGVjaWFsX2NvbnRyb2xzICA6MTY7ICAgLyogQXNzZXJ0cyBSZXNldF9WOCA9PiAweEMyNTg7IFR1cm5zIG9uIHBjaSBlbmNyeXB0aW9uID0+IDB4QzI1QTsKLQkJCQkJCQkJCQlUdXJucyBvZmYgcGNpIGVuY3J5cHRpb24gPT4gMHhDMjU5IE5vdGU6IHBjaV9lbmNyeXB0aW9uIGRlZmF1bHQKLQkJCQkJCQkJCQlhdCBwb3dlci11cCBpcyBPTi4gKi8KLQl9IHN3X3Jlc2V0XzIxMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiB2dWFydF9vZV9zaWcgICAgICA6IDE7ICAgLyogV2hlbiBjbGVhciwgdGhlIFY4IHByb2Nlc3NvciBoYXMgc29sZSBjb250cm9sIG9mIHRoZSBzZXJpYWwgVUFSVAotCQkJCQkJCQkJCShSUy0yMzIgU21hcnQgQ2FyZCBpbnRlcmZhY2UpLiBXaGVuIHNldCwgdGhlIElCSSBpbnRlcmZhY2UKLQkJCQkJCQkJCQlkZWZpbmVkIGJ5IHJlZ2lzdGVyIDB4NjAwIGNvbnRyb2xzIHRoZSBzZXJpYWwgVUFSVC4gKi8KLQkJdTMyIHYyV1Nfb2Vfc2lnICAgICAgIDogMTsgICAvKiBXaGVuIGNsZWFyLCB0aGUgVjggcHJvY2Vzc29yIGhhcyBkaXJlY3QgY29udHJvbCBvZiB0aGUgVHdvLWxpbmUKLQkJCQkJCQkJCQlTZXJpYWwgTWFzdGVyIEVFUFJPTSB0YXJnZXQuIFdoZW4gc2V0LCB0aGUgVHdvLWxpbmUgU2VyaWFsIE1hc3RlcgotCQkJCQkJCQkJCUVFUFJPTSB0YXJnZXQgaW50ZXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgSUJJIHJlZ2lzdGVyIDB4MTAwLiAqLwotCQl1MzIgaGFsdF9WOF9zaWcgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBjb250aWd1b3VzIHdhaXQgc3RhdGVzIGFyZSBhcHBsaWVkIHRvIHRoZSBWOC1zcGFjZQotCQkJCQkJCQkJCWJ1cyBtYXN0ZXJzLiBPbmNlIHRoaXMgc2lnbmFsIGlzIGNsZWFyZWQsIG5vcm1hbCBWOC1zcGFjZQotCQkJCQkJCQkJCW9wZXJhdGlvbnMgcmVzdW1lLiAqLwotCQl1MzIgc2VjdGlvbl9wa2dfZW5hYmxlX3NpZzogMTsgLyogV2hlbiBzZXQsIHRoaXMgc2lnbmFsIGVuYWJsZXMgdGhlIGZyb250IGVuZCB0cmFuc2xhdGlvbiBjaXJjdWl0cnkKLQkJCQkJCQkJCQkgIHRvIHByb2Nlc3Mgc2VjdGlvbiBwYWNrZWQgdHJhbnNwb3J0IHN0cmVhbXMuICovCi0JCXUzMiBzMnBfc2VsX3NpZyAgICAgICA6IDE7ICAgLyogU2VyaWFsIHRvIHBhcmFsbGVsIGNvbnZlcnNpb24uIFdoZW4gc2V0LCBwb2xhcml6ZWQgdHJhbnNwb3J0IGRhdGEKLQkJCQkJCQkJCQl3aXRoaW4gdGhlIEZsZXhDb3AzIGZyb250IGVuZCBjaXJjdWl0cnkgaXMgY29udmVydGVkIGZyb20gYSBzZXJpYWwKLQkJCQkJCQkJCQlzdHJlYW0gaW50byBwYXJhbGxlbCBkYXRhIGJlZm9yZSBkb3duc3RyZWFtIHByb2Nlc3Npbmcgb3RoZXJ3aXNlCi0JCQkJCQkJCQkJaW50ZXJwcmV0cyB0aGUgZGF0YS4gKi8KLQkJdTMyIHVudXNlZDEgICAgICAgICAgIDogMzsKLQkJdTMyIHBvbGFyaXR5X1BTX0NMS19zaWc6IDE7ICAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIENMT0NLIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgcG9sYXJpdHlfUFNfVkFMSURfc2lnOiAxOyAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIFZBTElEIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgcG9sYXJpdHlfUFNfU1lOQ19zaWc6IDE7IC8qIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gaW52ZXJ0IHRoZSBpbnB1dCBwb2xhcml0eSBvZiB0aGUgdHJhbnBvcnQKLQkJCQkJCQkJCQlzdHJlYW0gU1lOQyBzaWduYWwgYmVmb3JlIGFueSBwcm9jZXNzaW5nIG9jY3VycyBvbiB0aGUgdHJhbnNwb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIHdpdGhpbiBGbGV4Q29wMy4gKi8KLQkJdTMyIHBvbGFyaXR5X1BTX0VSUl9zaWc6IDE7ICAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIEVSUk9SIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgdW51c2VkMiAgICAgICAgICAgOjIwOwotCX0gbWlzY18yMTQ7Ci0KLS8qIE1haWxib3ggZnJvbSBWOCB0byBob3N0ICovCi0Jc3RydWN0IHsKLQkJdTMyIE1haWxib3hfZnJvbV9WOCAgIDozMjsgICAvKiBXaGVuIHRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBieSBlaXRoZXIgdGhlIFY4IHByb2Nlc3NvciBvciBieSBhbgotCQkJCQkJCQkJCWVuZCBob3N0LCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHRvIHRoZSBQQ0kgaG9zdCB0byBpbmRpY2F0ZQotCQkJCQkJCQkJCXRoYXQgbWFpbGJveCBkYXRhIGlzIGF2YWlsYWJsZS4gUmVhZGluZyByZWdpc3RlciAyMGMgd2lsbCBjbGVhcgotCQkJCQkJCQkJCXRoZSBJUlEuICovCi0JfSBtYm94X3Y4X3RvX2hvc3RfMjE4OwotCi0vKiBNYWlsYm94IGZyb20gaG9zdCB0byB2OCBNYWlsYm94X3RvX1Y4Ci0gKiBNYWlsYm94X3RvX1Y4IG1haWxib3ggc3RvcmFnZSByZWdpc3RlcgotICogdXNlZCB0byBzZW5kIG1lc3NhZ2VzIGZyb20gUENJIHRvIFY4LiBXcml0aW5nIHRvIHRoaXMgcmVnaXN0ZXIgd2lsbCBzZW5kIGFuCi0gKiBJUlEgdG8gdGhlIFY4LiBUaGVuIGl0IGNhbiByZWFkIHRoZSBkYXRhIGZyb20gaGVyZS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyCi0gKiB3aWxsIGNsZWFyIHRoZSBJUlEuIElmIHRoZSBWOCBpcyBoYWx0ZWQgYW5kIGJpdCAzMSBvZiB0aGlzIHJlZ2lzdGVyIGlzIHNldCwKLSAqIHRoZW4gdGhpcyByZWdpc3RlciBpcyB1c2VkIGluc3RlYWQgYXMgYSBkaXJlY3QgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUKLSAqIFY4c3BhY2UgbWVtb3J5LgotICovCi0Jc3RydWN0IHsKLQkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhIDogODsgICAvKiBEYXRhIGJ5dGUgd3JpdHRlbiBvciByZWFkIGZyb20gdGhlIHNwZWNpZmllZCBhZGRyZXNzIGluIFY4IFN5c1JBTS4gKi8KLQkJdTMyIHN5c3JhbWFjY2Vzc19hZGRyIDoxNTsgICAvKiAxNSBiaXQgYWRkcmVzcyB1c2VkIHRvIGFjY2VzcyBWOCBTeXMtUkFNLiAqLwotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiA3OwotCQl1MzIgc3lzcmFtYWNjZXNzX3dyaXRlOiAxOyAgIC8qIFdyaXRlIGZsYWcgdXNlZCB0byBsYXRjaCBkYXRhIGludG8gdGhlIFY4IFN5c1JBTS4gKi8KLQkJdTMyIHN5c3JhbWFjY2Vzc19idXNtdXN0ZXI6IDE7IC8qIFNldHRpbmcgdGhpcyBiaXQgd2hlbiB0aGUgVjggaXMgaGFsdGVkIGF0IDB4MjE0IEJpdCgyKSBhbGxvd3MKLQkJCQkJCQkJCQkgIHRoaXMgSUJJIHJlZ2lzdGVyIGludGVyZmFjZSB0byBkaXJlY3RseSBkcml2ZSB0aGUgVjgtc3BhY2UgbWVtb3J5LiAqLwotCX0gbWJveF9ob3N0X3RvX3Y4XzIxYzsKLQotCi0vKiBQSURzLCBUcmFuc2xhdGlvbiBCaXQsIFNNQyBGaWx0ZXIgU2VsZWN0IDB4MzAwIHRvIDB4MzFjICovCi0Jc3RydWN0IHsKLQkJdTMyIFN0cmVhbTFfUElEICAgICAgIDoxMzsgICAvKiBQcmltYXJ5IHVzZSBpcyByZWNlaXZpbmcgTmV0IGRhdGEsIHNvIHRoZXNlIDEzIGJpdHMgbm9ybWFsbHkKLQkJCQkJCQkJCQlob2xkIHRoZSBQSUQgdmFsdWUgZm9yIHRoZSBkZXNpcmVkIG5ldHdvcmsgc3RyZWFtLiAqLwotCQl1MzIgU3RyZWFtMV90cmFucyAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBOZXQgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciBOZXQgZGF0YSBmZXJyaWVkIGluIFRTIHBhY2tldHMuICovCi0JCXUzMiBNQUNfTXVsdGljYXN0X2ZpbHRlciA6IDE7ICAgLyogV2hlbiBjbGVhciwgbXVsdGljYXN0IE1BQyBmaWx0ZXJpbmcgaXMgbm90IGFsbG93ZWQgZm9yIFN0cmVhbTEgYW5kIFBJRF9uIGZpbHRlcnMuICovCi0JCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCA6IDE7Ci0JCXUzMiBTdHJlYW0yX1BJRCAgICAgICA6MTM7ICAgLyogMTMgYml0cyBmb3IgU3RyZWFtIDIgUElEIGZpbHRlciB2YWx1ZS4gR2VuZXJhbCB1c2UuICovCi0JCXUzMiBTdHJlYW0yX3RyYW5zICAgICA6IDE7ICAgLyogV2hlbiBzZXQgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZSBkYXRhIGZlcnJpZWQgaW4KLQkJCQkJCQkJCQlTdHJlYW0yX1BJRCBUUyBwYWNrZXRzLiAqLwotCQl1MzIgZGVidWdfZmxhZ193cml0ZV9zdGF0dXMwMCA6IDE7Ci0JCXUzMiBkZWJ1Z19maWZvX3Byb2JsZW0gOiAxOwotCX0gcGlkX2ZpbHRlcl8zMDA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgUENSX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIFBDUiBzdHJlYW0gUElEIGZpbHRlciB2YWx1ZS4gUHJpbWFyeSB1c2UgaXMgUHJvZ3JhbSBDbG9jayBSZWZlcmVuY2Ugc3RyZWFtIGZpbHRlcmluZy4gKi8KLQkJdTMyIFBDUl90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiBkZWJ1Z19vdmVycnVuMyAgICA6IDE7Ci0JCXUzMiBkZWJ1Z19vdmVycnVuMiAgICA6IDE7Ci0JCXUzMiBQTVRfUElEICAgICAgICAgICA6MTM7ICAgLyogc3RyZWFtIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIFByb2dyYW0gTWFuYWdlbWVudCBUYWJsZSBzZWdtZW50IGZpbHRlcmluZy4gKi8KLQkJdTMyIFBNVF90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDI7Ci0JfSBwaWRfZmlsdGVyXzMwNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBFTU1fUElEICAgICAgICAgICA6MTM7ICAgLyogRU1NIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIEVudGl0bGVtZW50IE1hbmFnZW1lbnQgTWVzc2FnaW5nIGZvcgotCQkJCQkJCQkJCWNvbmRpdGlvbmFsIGFjY2Vzcy1yZWxhdGVkIGRhdGEuICovCi0JCXUzMiBFTU1fdHJhbnMgICAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLwotCQl1MzIgRU1NX2ZpbHRlcl80ICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0IHdpbGwgcGFzcyBvbmx5IEVNTSBkYXRhIHBvc3Nlc3NpbmcgdGhlIHNhbWUgSUQgY29kZSBhcyB0aGUKLQkJCQkJCQkJCQlmaXJzdCBmb3VyIGJ5dGVzICgzMiBiaXRzKSBvZiB0aGUgZW5kLXVzZXIgcyA2LWJ5dGUgU21hcnQgQ2FyZCBJRCBudW1iZXIgU2VsZWN0ICovCi0JCXUzMiBFTU1fZmlsdGVyXzYgICAgICA6IDE7ICAgLyogV2hlbiBzZXQgd2lsbCBwYXNzIG9ubHkgRU1NIGRhdGEgcG9zc2Vzc2luZyB0aGUgc2FtZSA2LWJ5dGUgY29kZSBhcyB0aGUgZW5kLXVzZXJzCi0JCQkJCQkJCQkJY29tcGxldGUgNi1ieXRlIFNtYXJ0IENhcmQgSUQgbnVtYmVyLiAqLwotCQl1MzIgRUNNX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIEVDTSBQSUQgZmlsdGVyIHZhbHVlLiBQcmltYXJ5IHVzZSBpcyBFbnRpdGxlbWVudCBDb250cm9sIE1lc3NhZ2luZyBmb3IgY29uZGl0aW9uYWwKLQkJCQkJCQkJCQlhY2Nlc3MtcmVsYXRlZCBkYXRhLiAqLwotCQl1MzIgRUNNX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogMjsKLQl9IHBpZF9maWx0ZXJfMzA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIEdyb3VwX1BJRCAgICAgOjEzOyAgIC8qIFBJRCB2YWx1ZSBmb3IgZ3JvdXAgZmlsdGVyaW5nLiAqLwotCQl1MzIgR3JvdXBfdHJhbnMgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLwotCQl1MzIgdW51c2VkMSAgICAgICA6IDI7Ci0JCXUzMiBHcm91cF9tYXNrICAgIDoxMzsgICAvKiBNYXNrIHZhbHVlIHVzZWQgaW4gbG9naWNhbCAiYW5kIiBlcXVhdGlvbiB0aGF0IGRlZmluZXMgZ3JvdXAgZmlsdGVyaW5nICovCi0JCXUzMiB1bnVzZWQyICAgICAgIDogMzsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83OwotCi0Jc3RydWN0IHsKLQkJdTMyIG5ldF9tYXN0ZXJfcmVhZCA6MTc7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoxNTsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMTsKLQotCXN0cnVjdCB7Ci0JCXUzMiBuZXRfbWFzdGVyX3dyaXRlIDoxNzsKLQkJdTMyIHVudXNlZCAgICAgICAgOjE1OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8yOwotCi0Jc3RydWN0IHsKLQkJdTMyIG5leHRfbmV0X21hc3Rlcl93cml0ZSA6MTc7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoxNTsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB1bnVzZWQxICAgICAgIDogMTsKLQkJdTMyIHN0YXRlX3dyaXRlICAgOjEwOwotCQl1MzIgcmVzZXJ2ZWQxICAgICA6IDY7ICAgLyogZGVmYXVsdDogMDAwMTAwICovCi0JCXUzMiBzdGFja19yZWFkICAgIDoxMDsKLQkJdTMyIHJlc2VydmVkMiAgICAgOiA1OyAgIC8qIGRlZmF1bHQ6IDAwMTAwICovCi0JfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgc3RhY2tfY250ICAgICA6MTA7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoyMjsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNTsKLQotCXN0cnVjdCB7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMCA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMSA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMiA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMyA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnNCA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMzAwIDogMjsKLQkJdTMyIHdyaXRlX3N0YXR1czEgOiAyOwotCQl1MzIgd3JpdGVfc3RhdHVzNCA6IDI7Ci0JCXUzMiBkYXRhX3NpemVfcmVnIDoxMjsKLQkJdTMyIHVudXNlZCAgICAgICAgOiA0OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF82OwotCi0Jc3RydWN0IHsKLQkJdTMyIGluZGV4X3JlZyAgICAgICAgIDogNTsgICAvKiAoSW5kZXggcG9pbnRlcikgUG9pbnRzIGF0IGFuIGludGVybmFsIFBJRG4gcmVnaXN0ZXIuIEEgYmluYXJ5IGNvZGUKLQkJCQkJCQkJCQlyZXByZXNlbnRpbmcgb25lIG9mIDMyIGludGVybmFsIFBJRG4gcmVnaXN0ZXJzIGFzIHdlbGwgYXMgaXRzCi0JCQkJCQkJCQkJY29ycmVzcG9uZGluZyBpbnRlcm5hbCBNQUNfbG93biByZWdpc3Rlci4gKi8KLQkJdTMyIGV4dHJhX2luZGV4X3JlZyAgIDogMzsgICAvKiBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHNlbGVjdCBiZXR3ZWVuIHNldHMgb2YgZGVidWcgc2lnbmFscyByb3V0ZWQgdG8gcmVnaXN0ZXIgMHgzMGMuICovCi0JCXUzMiBBQl9zZWxlY3QgICAgICAgICA6IDE7ICAgLyogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDB4MzFjLiByZWFkL3dyaXRlIHRvIHRoZSBNQUNfaGlnaEEgb3IgTUFDX2hpZ2hCIHJlZ2lzdGVyCi0JCQkJCQkJCQkJMD1NQUNfaGlnaEIgcmVnaXN0ZXIsIDE9TUFDX2hpZ2hBICovCi0JCXUzMiBwYXNzX2FsbHRhYmxlcyAgICA6IDE7ICAgLyogMT1OZXQgcGFja2V0cyBhcmUgbm90IGZpbHRlcmVkIGFnYWluc3QgdGhlIE5ldHdvcmsgVGFibGUgSUQgZm91bmQgaW4gcmVnaXN0ZXIgMHg0MDAuCi0JCQkJCQkJCQkJQWxsIHR5cGVzIG9mIG5ldHdvcmtzIChEVkIsIEFUU0MsIElTREIpIGFyZSBwYXNzZWQuICovCi0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6MjI7Ci0JfSBpbmRleF9yZWdfMzEwOwotCi0Jc3RydWN0IHsKLQkJdTMyIFBJRCAgICAgICAgICAgICAgIDoxMzsgICAvKiBQSUQgdmFsdWUgKi8KLQkJdTMyIFBJRF90cmFucyAgICAgICAgIDogMTsgICAvKiB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHBhY2tldHMgZmlsdGVyZWQgKi8KLQkJdTMyIFBJRF9lbmFibGVfYml0ICAgIDogMTsgICAvKiBXaGVuIHNldCB0aGlzIFBJRCBmaWx0ZXIgaXMgZW5hYmxlZCAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjE3OwotCX0gcGlkX25fcmVnXzMxNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBBNF9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBNV9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBNl9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBFbmFibGVfYml0ICAgICAgICA6IDE7ICAgLyogZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDEpICovCi0JCXUzMiBIaWdoQUJfYml0ICAgICAgICA6IDE7ICAgLyogdXNlIE1BQ19oaWdoQSAoMSkgb3IgTUFDX2hpZ2hCICgwKSBhcyBNU0IgKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogNjsKLQl9IG1hY19sb3dfcmVnXzMxODsKLQotCXN0cnVjdCB7Ci0JCXUzMiBBMV9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBMl9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBM19ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDg7Ci0JfSBtYWNfaGlnaF9yZWdfMzFjOwotCi0vKiBUYWJsZSwgU01DSUQsTUFDRGVzdGluYXRpb24gRmlsdGVycyAweDQwMCB0byAweDQxYyAqLwotCXN0cnVjdCB7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MTY7CiAjZGVmaW5lIGZjX2RhdGFfVGFnX0lEX0RWQiAgMHgzZQogI2RlZmluZSBmY19kYXRhX1RhZ19JRF9BVFNDIDB4M2YKICNkZWZpbmUgZmNfZGF0YV9UYWdfSURfSURTQiAweDhiCi0JCXUzMiBkYXRhX1RhZ19JRCAgICAgICA6MTY7Ci0JfSBkYXRhX3RhZ180MDA7CiAKLQlzdHJ1Y3QgewotCQl1MzIgQ2FyZF9JRGJ5dGU2ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGU1ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGU0ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGUzICAgICAgOiA4OwotCX0gY2FyZF9pZF80MDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgQ2FyZF9JRGJ5dGUyICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGUxICAgICAgOiA4OwotCX0gY2FyZF9pZF80MGM7Ci0KLQkvKiBob2xkaW5nIHRoZSB1bmlxdWUgbWFjIGFkZHJlc3Mgb2YgdGhlIHJlY2VpdmVyIHdoaWNoIGhvdXNlcyB0aGUgRmxleENvcElJSSAqLwotCXN0cnVjdCB7Ci0JCXUzMiBNQUMxICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUMyICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUMzICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUM2ICAgICAgICAgICAgICA6IDg7Ci0JfSBtYWNfYWRkcmVzc180MTg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgTUFDNyAgICAgICAgICAgICAgOiA4OwotCQl1MzIgTUFDOCAgICAgICAgICAgICAgOiA4OwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAxNjsKLQl9IG1hY19hZGRyZXNzXzQxYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB0cmFuc21pdHRlcl9kYXRhX2J5dGUgOiA4OwotCQl1MzIgUmVjZWl2ZURhdGFSZWFkeSAgOiAxOwotCQl1MzIgUmVjZWl2ZUJ5dGVGcmFtZUVycm9yOiAxOwotCQl1MzIgdHhidWZmZW1wdHkgICAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjIxOwotCX0gY2lfNjAwOwotCi0Jc3RydWN0IHsKLQkJdTMyIHBpX2QgICAgICAgICAgICAgIDogODsKLQkJdTMyIHBpX2hhICAgICAgICAgICAgIDoyMDsKLQkJdTMyIHBpX3J3ICAgICAgICAgICAgIDogMTsKLQkJdTMyIHBpX2NvbXBvbmVudF9yZWcgIDogMzsKLQl9IHBpXzYwNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBzZXJpYWxSZXNldCAgICAgICA6IDE7Ci0JCXUzMiBvbmNlY3ljbGVfcmVhZCAgICA6IDE7Ci0JCXUzMiBUaW1lcl9SZWFkX3JlcSAgICA6IDE7Ci0JCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICA6IDE7Ci0JCXUzMiB0aW1lcl9kYXRhICAgICAgICA6IDc7Ci0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDE7IC8qID8/PyBub3QgbWVudGlvbmVkIGluIGRhdGEgYm9vayAqLwotCQl1MzIgVGltZXJfYWRkciAgICAgICAgOiA1OwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAzOwotCQl1MzIgcGNtY2lhX2FfbW9kX3B3cl9uIDogMTsKLQkJdTMyIHBjbWNpYV9iX21vZF9wd3JfbiA6IDE7Ci0JCXUzMiBjb25maWdfRG9uZV9zdGF0ICA6IDE7Ci0JCXUzMiBjb25maWdfSW5pdF9zdGF0ICA6IDE7Ci0JCXUzMiBjb25maWdfUHJvZ19uICAgICA6IDE7Ci0JCXUzMiBjb25maWdfd3JfbiAgICAgICA6IDE7Ci0JCXUzMiBjb25maWdfY3NfbiAgICAgICA6IDE7Ci0JCXUzMiBjb25maWdfY2NsayAgICAgICA6IDE7Ci0JCXUzMiBwaV9DaU1heF9JUlFfbiAgICA6IDE7Ci0JCXUzMiBwaV90aW1lb3V0X3N0YXR1cyA6IDE7Ci0JCXUzMiBwaV93YWl0X24gICAgICAgICA6IDE7Ci0JCXUzMiBwaV9idXN5X24gICAgICAgICA6IDE7Ci0JfSBwaV82MDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgUElEICAgICAgICAgICAgICAgOjEzOwotCQl1MzIga2V5X2VuYWJsZSAgICAgICAgOiAxOwogI2RlZmluZSBmY19rZXlfY29kZV9kZWZhdWx0IDB4MQogI2RlZmluZSBmY19rZXlfY29kZV9ldmVuICAgIDB4MgogI2RlZmluZSBmY19rZXlfY29kZV9vZGQgICAgIDB4MwotCQl1MzIga2V5X2NvZGUgICAgICAgICAgOiAyOwotCQl1MzIga2V5X2FycmF5X2NvbCAgICAgOiAzOwotCQl1MzIga2V5X2FycmF5X3JvdyAgICAgOiA1OwotCQl1MzIgZHZiX2VuICAgICAgICAgICAgOiAxOyAvKiAwPVRTIGJ5cGFzc2VzIHRoZSBEZXNjcmFtYmxlciAqLwotCQl1MzIgcndfZmxhZyAgICAgICAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiA2OwotCX0gZHZiX3JlZ182MGM7Ci0KLS8qIFNSQU0gYW5kIE91dHB1dCBEZXN0aW5hdGlvbiAweDcwMCB0byAweDcxNCAqLwotCXN0cnVjdCB7Ci0JCXUzMiBzcmFtX2FkZHIgICAgICAgICA6MTU7Ci0JCXUzMiBzcmFtX3J3ICAgICAgICAgICA6IDE7ICAgLyogMD13cml0ZSwgMT1yZWFkICovCi0JCXUzMiBzcmFtX2RhdGEgICAgICAgICA6IDg7Ci0JCXUzMiBzY194ZmVyX2JpdCAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDM7Ci0JCXUzMiBvZV9waW5fcmVnICAgICAgICA6IDE7Ci0JCXUzMiBjZV9waW5fcmVnICAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDE7Ci0JCXUzMiBzdGFydF9zcmFtX2liaSAgICA6IDE7Ci0JfSBzcmFtX2N0cmxfcmVnXzcwMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBuZXRfYWRkcl9yZWFkICAgICA6MTY7Ci0JCXUzMiBuZXRfYWRkcl93cml0ZSAgICA6MTY7Ci0JfSBuZXRfYnVmX3JlZ183MDQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgY2FpX3JlYWQgICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA1OwotCQl1MzIgY2FpX3dyaXRlICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiA2OwotCQl1MzIgY2FpX2NudCAgICAgICAgICAgOiA0OwotCX0gY2FpX2J1Zl9yZWdfNzA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIGNhb19yZWFkICAgICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNTsKLQkJdTMyIGNhcF93cml0ZSAgICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNjsKLQkJdTMyIGNhb19jbnQgICAgICAgICAgIDogNDsKLQl9IGNhb19idWZfcmVnXzcwYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiBtZWRpYV9yZWFkICAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDU7Ci0JCXUzMiBtZWRpYV93cml0ZSAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDY7Ci0JCXUzMiBtZWRpYV9jbnQgICAgICAgICA6IDQ7Ci0JfSBtZWRpYV9idWZfcmVnXzcxMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBORVRfRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBDQUlfRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBDQU9fRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBNRURJQV9EZXN0ICAgICAgICA6IDI7Ci0JCXUzMiBuZXRfb3ZmbG93X2Vycm9yICA6IDE7Ci0JCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgOiAxOwotCQl1MzIgY2FpX292Zmxvd19lcnJvciAgOiAxOwotCQl1MzIgY2FvX292Zmxvd19lcnJvciAgOiAxOwotCQl1MzIgY3RybF91c2Jfd2FuICAgICAgOiAxOwotCQl1MzIgY3RybF9zcmFtZG1hICAgICAgOiAxOwotCQl1MzIgY3RybF9tYXhpbXVtZmlsbCAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjE3OwotCX0gc3JhbV9kZXN0X3JlZ183MTQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbmV0X2NudCAgICAgICAgICAgOjEyOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA0OwotCQl1MzIgbmV0X2FkZHJfcmVhZCAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiAzOwotCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQzICAgICAgICAgOjExOwotCX0gbmV0X2J1Zl9yZWdfNzE4OwotCi0Jc3RydWN0IHsKLQkJdTMyIHdhbl9zcGVlZF9zaWcgICAgIDogMjsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNjsKLQkJdTMyIHdhbl93YWl0X3N0YXRlICAgIDogODsKLQkJdTMyIHNyYW1fY2hpcCAgICAgICAgIDogMjsKLQkJdTMyIHNyYW1fbWVtbWFwICAgICAgIDogMjsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNDsKLQkJdTMyIHdhbl9wa3RfZnJhbWUgICAgIDogNDsKLQkJdTMyIHJlc2VydmVkMyAgICAgICAgIDogNDsKLQl9IHdhbl9jdHJsX3JlZ183MWM7Ci19IGZsZXhjb3BfaWJpX3ZhbHVlOwogCiBleHRlcm4gZmxleGNvcF9pYmlfdmFsdWUgaWJpX3plcm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwppbmRleCAwMTEzNDQ5Li4wYTc4YmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCkBAIC01NDUsNyArNTQ1LDcgQEAKIC8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBmbGV4Y29wX3VzYl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgVVNCIiwKKwkubmFtZQkJPSAiYjJjMl9mbGV4Y29wX3VzYiIsCiAJLnByb2JlCQk9IGZsZXhjb3BfdXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZmxleGNvcF91c2JfZGlzY29ubmVjdCwKIAkuaWRfdGFibGUJPSBmbGV4Y29wX3VzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKaW5kZXggOGI1ZDE0ZC4uMTI4NzNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogaW50IGIyYzJfZmxleGNvcF9kZWJ1ZzsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYjJjMl9mbGV4Y29wX2RlYnVnLCAgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWcgbGV2ZWwgKDE9aW5mbywyPXR1bmVyLDQ9aTJjLDg9dHMsMTY9c3JhbSAofC1hYmxlKSkuIiBERUJTVEFUVVMpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1ZyBsZXZlbCAoMT1pbmZvLDI9dHVuZXIsND1pMmMsOD10cywxNj1zcmFtLDMyPXJlZyAofC1hYmxlKSkuIiBERUJTVEFUVVMpOwogI3VuZGVmIERFQlNUQVRVUwogCiAvKiBnbG9iYWwgemVybyBmb3IgaWJpIHZhbHVlcyAqLwpAQCAtMTczLDkgKzE3MywyMCBAQAogCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LGliaV96ZXJvKTsKIAogCXYyMTAucmF3ID0gMDsKLQl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja3MgPSAweGZmOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzAwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfMTAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja18yMDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzMwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfNDAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja181MDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzYwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfNzAwID0gMTsKIAl2MjEwLnN3X3Jlc2V0XzIxMC5CbG9ja19yZXNldF9lbmFibGUgPSAweGIyOworCisJdjIxMC5zd19yZXNldF8yMTAuU3BlY2lhbF9jb250cm9scyA9IDB4YzI1OTsKKwogCWZjLT53cml0ZV9pYmlfcmVnKGZjLHN3X3Jlc2V0XzIxMCx2MjEwKTsKKwltc2xlZXAoMSk7CiAKIC8qIHJlc2V0IHRoZSBwZXJpcGhpY2FsIGRldmljZXMgKi8KIApAQCAtMTg2LDYgKzE5NywyNSBAQAogCWZjLT53cml0ZV9pYmlfcmVnKGZjLG1pc2NfMjA0LHYyMDQpOwogfQogCit2b2lkIGZsZXhjb3BfcmVzZXRfYmxvY2tfMzAwKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgdjIwOF9zYXZlID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCksCisJCQkJCSAgdjIxMCA9IGZjLT5yZWFkX2liaV9yZWcoZmMsc3dfcmVzZXRfMjEwKTsKKworCWRlYl9yZHVtcCgiMjA4OiAlMDh4LCAyMTA6ICUwOHhcbiIsdjIwOF9zYXZlLnJhdyx2MjEwLnJhdyk7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCxpYmlfemVybyk7CisKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja18zMDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLkJsb2NrX3Jlc2V0X2VuYWJsZSA9IDB4YjI7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxzd19yZXNldF8yMTAsdjIxMCk7CisJbXNsZWVwKDEpOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMsY3RybF8yMDgsdjIwOF9zYXZlKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9yZXNldF9ibG9ja18zMDApOworCiBzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZsZXhjb3BfZGV2aWNlX2ttYWxsb2Moc2l6ZV90IGJ1c19zcGVjaWZpY19sZW4pCiB7CiAJdm9pZCAqYnVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaAppbmRleCBjYWEzNDNhLi4wY2ViZTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaApAQCAtMjYsNSArMjYsNiBAQAogI2RlZmluZSBkZWJfaTJjKGFyZ3MuLi4pICAgZHByaW50aygweDA0LGFyZ3MpCiAjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKDB4MDgsYXJncykKICNkZWZpbmUgZGViX3NyYW0oYXJncy4uLikgIGRwcmludGsoMHgxMCxhcmdzKQorI2RlZmluZSBkZWJfcmR1bXAoYXJncy4uLikgIGRwcmludGsoMHgyMCxhcmdzKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfYmUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlhNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wX2liaV92YWx1ZV9iZS5oCkBAIC0wLDAgKzEsNDU4IEBACisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgZm9yIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIHJlZ2lzdGVyIGRlc2NyaXB0aW9ucworICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IHRoaW5ncyBoZXJlLiAqLworI2lmbmRlZiBfX0ZMRVhDT1BfSUJJX1ZBTFVFX0lOQ0xVREVEX18KKyNkZWZpbmUgX19GTEVYQ09QX0lCSV9WQUxVRV9JTkNMVURFRF9fCisKK3R5cGVkZWYgdW5pb24geworCXUzMiByYXc7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJlc3MwICAgICAgICAgICAgICAgICAgIDozMDsKKwkJdTMyIGRtYV8wTm9fdXBkYXRlICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfMHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gZG1hXzB4MDsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfYWRkcl9zaXplICAgICAgICAgICAgICAgICAgOjI0OworCQl1MzIgRE1BX21heHBhY2tldHMgICAgICAgICAgICAgICAgIDogODsKKwl9IGRtYV8weDRfcmVtYXA7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWExdGltZXIgICAgICAgICAgICAgICAgICAgICAgOiA3OworCX0gZG1hXzB4NF9yZWFkOworCisJc3RydWN0IHsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJCXUzMiBkbWF0aW1lciAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IGRtYV8weDRfd3JpdGU7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2N1cl9hZGRyICAgICAgICAgICAgICAgICAgIDozMDsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBkbWFfMHg4OworCisJc3RydWN0IHsKKwkJdTMyIGRtYV9hZGRyZXNzMSAgICAgICAgICAgICAgICAgICA6MzA7CisJCXUzMiByZW1hcF9lbmFibGUgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hXzFzdGFydCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IGRtYV8weGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3RfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG5vX2Jhc2VfYWRkcl9hY2tfZXJyb3IgICAgICAgICA6IDE7CisJCXUzMiB0d29XU19wb3J0X3JlZyAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdG90YWxfYnl0ZXMgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHR3b1dTX3J3ICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB3b3JraW5nX3N0YXJ0ICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGF0YTFfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGJhc2VhZGRyICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2hpcGFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwl9IHR3X3NtX2NfMTAwOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBmb3JjZV9zdG9wICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZXhsaWNpdF9zdG9wcyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRhdGE0X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBkYXRhM19yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTJfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IHR3X3NtX2NfMTA0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCX0gdHdfc21fY18xMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IHR3X3NtX2NfMTEwOworCisJc3RydWN0IHsKKwkJdTMyIExOQl9DVExQcmVzY2FsZXJfc2lnICAgICAgICAgICA6IDI7CisJCXUzMiBMTkJfQ1RMTG93Q291bnRfc2lnICAgICAgICAgICAgOjE1OworCQl1MzIgTE5CX0NUTEhpZ2hDb3VudF9zaWcgICAgICAgICAgIDoxNTsKKwl9IGxuYl9zd2l0Y2hfZnJlcV8yMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMiAgICAgICAgICAgIDogMTsKKwkJdTMyIFJldl9OX3NpZ19jYXBzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQxICAgICAgICAgICAgOiAyOworCQl1MzIgUmV2X05fc2lnX3JldmlzaW9uX2hpICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBQZXJfcmVzZXRfc2lnICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEFDUEkzX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQ1BJMV9zaWcgICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gbWlzY18yMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogOTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9FbmFibGVfc2lnICAgICA6IDE7CisJCXUzMiBETUEyX1NpemVfSVJRX0VuYWJsZV9zaWcgICAgICAgOiAxOworCQl1MzIgRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfRW5hYmxlX3NpZyAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX0lSUV9FbmFibGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9UaW1lcl9FbmFibGVfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBSY3ZfRGF0YV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX2ZpbHRlcl9Nb2RlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIE11bHRpMl9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQZXJfQ0FfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgU01DX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIENBX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBXQU5fQ0FfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1hc2tfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBOdWxsX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTJfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0xX2ZpbHRlcl9zaWcgICAgICAgICAgICAgOiAxOworCX0gY3RybF8yMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMTsKKwkJdTMyIFRyYW5zcG9ydF9FcnJvciAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBMTENfU05BUF9GTEFHX3NldCAgICAgICAgICAgICAgOiAxOworCQl1MzIgQ29udGludWl0eV9lcnJvcl9mbGFnICAgICAgICAgIDogMTsKKwkJdTMyIERhdGFfcmVjZWl2ZXJfZXJyb3IgICAgICAgICAgICA6IDE7CisJCXUzMiBNYWlsYm94X2Zyb21fVjhfU3RhdHVzX3NpZyAgICAgOiAxOworCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfU2l6ZV9JUlFfU3RhdHVzICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX1RpbWVyX1N0YXR1cyAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX0lSUV9TdGF0dXMgICAgICAgICAgICAgICAgOiAxOworCX0gaXJxXzIwYzsKKworCXN0cnVjdCB7CisJCXUzMiBTcGVjaWFsX2NvbnRyb2xzICAgICAgICAgICAgICAgOjE2OworCQl1MzIgQmxvY2tfcmVzZXRfZW5hYmxlICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2V0X2Jsb2NrXzcwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja182MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNTAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzQwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18zMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMjAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzEwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18wMDAgICAgICAgICAgICAgICAgOiAxOworCX0gc3dfcmVzZXRfMjEwOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZDIgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwb2xhcml0eV9QU19FUlJfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfU1lOQ19zaWcgICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX1ZBTElEX3NpZyAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19DTEtfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkMSAgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHMycF9zZWxfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZWN0aW9uX3BrZ19lbmFibGVfc2lnICAgICAgICAgOiAxOworCQl1MzIgaGFsdF9WOF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHYyV1Nfb2Vfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB2dWFydF9vZV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCX0gbWlzY18yMTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgTWFpbGJveF9mcm9tX1Y4ICAgICAgICAgICAgICAgIDozMjsKKwl9IG1ib3hfdjhfdG9faG9zdF8yMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3lzcmFtYWNjZXNzX2J1c211c3RlciAgICAgICAgIDogMTsKKwkJdTMyIHN5c3JhbWFjY2Vzc193cml0ZSAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgc3lzcmFtYWNjZXNzX2FkZHIgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhICAgICAgICAgICAgICA6IDg7CisJfSBtYm94X2hvc3RfdG9fdjhfMjFjOworCisJc3RydWN0IHsKKwkJdTMyIGRlYnVnX2ZpZm9fcHJvYmxlbSAgICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3dyaXRlX3N0YXR1czAwICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTJfUElEICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX011bHRpY2FzdF9maWx0ZXIgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTFfdHJhbnMgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0xX1BJRCAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gcGlkX2ZpbHRlcl8zMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIFBNVF90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgZGVidWdfb3ZlcnJ1bjIgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX292ZXJydW4zICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQQ1JfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9maWx0ZXJfMzA0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBFQ01fdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEVNTV9maWx0ZXJfNiAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyXzQgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRU1NX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBwaWRfZmlsdGVyXzMwODsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQyICAgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgR3JvdXBfbWFzayAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBHcm91cF90cmFucyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgR3JvdXBfUElEICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXRfbWFzdGVyX3JlYWQgICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8xOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXRfbWFzdGVyX3dyaXRlICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8yOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXh0X25ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8zOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBzdGFja19yZWFkICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHN0YXRlX3dyaXRlICAgICAgICAgICAgICAgICAgICA6MTA7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF80OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MjI7CisJCXUzMiBzdGFja19jbnQgICAgICAgICAgICAgICAgICAgICAgOjEwOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF81OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiBkYXRhX3NpemVfcmVnICAgICAgICAgICAgICAgICAgOjEyOworCQl1MzIgd3JpdGVfc3RhdHVzNCAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHdyaXRlX3N0YXR1czEgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMzAwICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzQgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMiAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzEgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcwICAgICAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzY7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoyMjsKKwkJdTMyIHBhc3NfYWxsdGFibGVzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQl9zZWxlY3QgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZXh0cmFfaW5kZXhfcmVnICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIGluZGV4X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJfSBpbmRleF9yZWdfMzEwOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTc7CisJCXUzMiBQSURfZW5hYmxlX2JpdCAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUElEX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBwaWRfbl9yZWdfMzE0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBIaWdoQUJfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRW5hYmxlX2JpdCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEE2X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBNV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTRfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19sb3dfcmVnXzMxODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTNfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEEyX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBMV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2hpZ2hfcmVnXzMxYzsKKworCXN0cnVjdCB7CisJCXUzMiBkYXRhX1RhZ19JRCAgICAgICAgICAgICAgICAgICAgOjE2OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwl9IGRhdGFfdGFnXzQwMDsKKworCXN0cnVjdCB7CisJCXUzMiBDYXJkX0lEYnl0ZTMgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGU0ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNSAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTYgICAgICAgICAgICAgICAgICAgOiA4OworCX0gY2FyZF9pZF80MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQ2FyZF9JRGJ5dGUxICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlMiAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBjYXJkX2lkXzQwYzsKKworCXN0cnVjdCB7CisJCXUzMiBNQUM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzIgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2FkZHJlc3NfNDE4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTY7CisJCXUzMiBNQUM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19hZGRyZXNzXzQxYzsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIxOworCQl1MzIgdHhidWZmZW1wdHkgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFJlY2VpdmVCeXRlRnJhbWVFcnJvciAgICAgICAgICA6IDE7CisJCXUzMiBSZWNlaXZlRGF0YVJlYWR5ICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdHJhbnNtaXR0ZXJfZGF0YV9ieXRlICAgICAgICAgIDogODsKKwl9IGNpXzYwMDsKKworCXN0cnVjdCB7CisJCXUzMiBwaV9jb21wb25lbnRfcmVnICAgICAgICAgICAgICAgOiAzOworCQl1MzIgcGlfcncgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX2hhICAgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwaV9kICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gcGlfNjA0OworCisJc3RydWN0IHsKKwkJdTMyIHBpX2J1c3lfbiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV93YWl0X24gICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfdGltZW91dF9zdGF0dXMgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX0NpTWF4X0lSUV9uICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfY2NsayAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX2NzX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ193cl9uICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfUHJvZ19uICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0luaXRfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Eb25lX3N0YXQgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwY21jaWFfYl9tb2RfcHdyX24gICAgICAgICAgICAgOiAxOworCQl1MzIgcGNtY2lhX2FfbW9kX3B3cl9uICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBUaW1lcl9hZGRyICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHRpbWVyX2RhdGEgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgVGltZXJfUmVhZF9yZXEgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG9uY2VjeWNsZV9yZWFkICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZXJpYWxSZXNldCAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gcGlfNjA4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiByd19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZHZiX2VuICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGtleV9hcnJheV9yb3cgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBrZXlfYXJyYXlfY29sICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIga2V5X2NvZGUgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGtleV9lbmFibGUgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gZHZiX3JlZ182MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3RhcnRfc3JhbV9pYmkgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjZV9waW5fcmVnICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgb2VfcGluX3JlZyAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBzY194ZmVyX2JpdCAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3JhbV9kYXRhICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNyYW1fcncgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzcmFtX2FkZHIgICAgICAgICAgICAgICAgICAgICAgOjE1OworCX0gc3JhbV9jdHJsX3JlZ183MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6MTY7CisJfSBuZXRfYnVmX3JlZ183MDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FpX2NudCAgICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYWlfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGNhaV9yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBjYWlfYnVmX3JlZ183MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FvX2NudCAgICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYXBfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGNhb19yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBjYW9fYnVmX3JlZ183MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgbWVkaWFfY250ICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBtZWRpYV93cml0ZSAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIG1lZGlhX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBtZWRpYV9idWZfcmVnXzcxMDsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCQl1MzIgY3RybF9tYXhpbXVtZmlsbCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfc3JhbWRtYSAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjdHJsX3VzYl93YW4gICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FvX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNhaV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgOiAxOworCQl1MzIgbmV0X292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1FRElBX0Rlc3QgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBDQU9fRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgQ0FJX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIE5FVF9EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBzcmFtX2Rlc3RfcmVnXzcxNDsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBuZXRfYWRkcl9yZWFkICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIG5ldF9jbnQgICAgICAgICAgICAgICAgICAgICAgICA6MTI7CisJfSBuZXRfYnVmX3JlZ183MTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQzICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHdhbl9wa3RfZnJhbWUgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgc3JhbV9tZW1tYXAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHNyYW1fY2hpcCAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB3YW5fd2FpdF9zdGF0ZSAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHdhbl9zcGVlZF9zaWcgICAgICAgICAgICAgICAgICA6IDI7CisJfSB3YW5fY3RybF9yZWdfNzFjOworfSBmbGV4Y29wX2liaV92YWx1ZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3BfaWJpX3ZhbHVlX2xlLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3BfaWJpX3ZhbHVlX2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfbGUuaApAQCAtMCwwICsxLDQ1OCBAQAorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGludXggZHJpdmVyIGZvciBkaWdpdGFsIFRWIGRldmljZXMgZXF1aXBwZWQgd2l0aCBCMkMyIEZsZXhjb3BJSShiKS9JSUkKKyAqCisgKiByZWdpc3RlciBkZXNjcmlwdGlvbnMKKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCB0aGluZ3MgaGVyZS4gKi8KKyNpZm5kZWYgX19GTEVYQ09QX0lCSV9WQUxVRV9JTkNMVURFRF9fCisjZGVmaW5lIF9fRkxFWENPUF9JQklfVkFMVUVfSU5DTFVERURfXworCit0eXBlZGVmIHVuaW9uIHsKKwl1MzIgcmF3OworCisJc3RydWN0IHsKKwkJdTMyIGRtYV8wc3RhcnQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfME5vX3VwZGF0ZSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hX2FkZHJlc3MwICAgICAgICAgICAgICAgICAgIDozMDsKKwl9IGRtYV8weDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgRE1BX21heHBhY2tldHMgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJfSBkbWFfMHg0X3JlbWFwOworCisJc3RydWN0IHsKKwkJdTMyIGRtYTF0aW1lciAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwl9IGRtYV8weDRfcmVhZDsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hdGltZXIgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJfSBkbWFfMHg0X3dyaXRlOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBkbWFfY3VyX2FkZHIgICAgICAgICAgICAgICAgICAgOjMwOworCX0gZG1hXzB4ODsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfMXN0YXJ0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVtYXBfZW5hYmxlICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYV9hZGRyZXNzMSAgICAgICAgICAgICAgICAgICA6MzA7CisJfSBkbWFfMHhjOworCisJc3RydWN0IHsKKwkJdTMyIGNoaXBhZGRyICAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgYmFzZWFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRhdGExX3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiB3b3JraW5nX3N0YXJ0ICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdHdvV1NfcncgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHRvdGFsX2J5dGVzICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0d29XU19wb3J0X3JlZyAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgbm9fYmFzZV9hZGRyX2Fja19lcnJvciAgICAgICAgIDogMTsKKwkJdTMyIHN0X2RvbmUgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSB0d19zbV9jXzEwMDsKKworCXN0cnVjdCB7CisJCXUzMiBkYXRhMl9yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTNfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRhdGE0X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBleGxpY2l0X3N0b3BzICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZm9yY2Vfc3RvcCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwNDsKKworCXN0cnVjdCB7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCX0gdHdfc21fY18xMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwl9IHR3X3NtX2NfMTBjOworCisJc3RydWN0IHsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJfSB0d19zbV9jXzExMDsKKworCXN0cnVjdCB7CisJCXUzMiBMTkJfQ1RMSGlnaENvdW50X3NpZyAgICAgICAgICAgOjE1OworCQl1MzIgTE5CX0NUTExvd0NvdW50X3NpZyAgICAgICAgICAgIDoxNTsKKwkJdTMyIExOQl9DVExQcmVzY2FsZXJfc2lnICAgICAgICAgICA6IDI7CisJfSBsbmJfc3dpdGNoX2ZyZXFfMjAwOworCisJc3RydWN0IHsKKwkJdTMyIEFDUEkxX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQ1BJM19zaWcgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBlcl9yZXNldF9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIwOworCQl1MzIgUmV2X05fc2lnX3JldmlzaW9uX2hpICAgICAgICAgIDogNDsKKwkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDEgICAgICAgICAgICA6IDI7CisJCXUzMiBSZXZfTl9zaWdfY2FwcyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMiAgICAgICAgICAgIDogMTsKKwl9IG1pc2NfMjA0OworCisJc3RydWN0IHsKKwkJdTMyIFN0cmVhbTFfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0yX2ZpbHRlcl9zaWcgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBNVF9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE51bGxfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNYXNrX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFdBTl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBDQV9FbmFibGVfc2lnICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgU01DX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBlcl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNdWx0aTJfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX2ZpbHRlcl9Nb2RlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIFJjdl9EYXRhX3NpZyAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX0lSUV9FbmFibGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9UaW1lcl9FbmFibGVfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX1RpbWVyX0VuYWJsZV9zaWcgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnICAgICAgIDogMTsKKwkJdTMyIERNQTJfU2l6ZV9JUlFfRW5hYmxlX3NpZyAgICAgICA6IDE7CisJCXUzMiBNYWlsYm94X2Zyb21fVjhfRW5hYmxlX3NpZyAgICAgOiAxOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogOTsKKwl9IGN0cmxfMjA4OworCisJc3RydWN0IHsKKwkJdTMyIERNQTFfSVJRX1N0YXR1cyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1RpbWVyX1N0YXR1cyAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1NpemVfSVJRX1N0YXR1cyAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgICAgICAgICAgIDogMTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9TdGF0dXNfc2lnICAgICA6IDE7CisJCXUzMiBEYXRhX3JlY2VpdmVyX2Vycm9yICAgICAgICAgICAgOiAxOworCQl1MzIgQ29udGludWl0eV9lcnJvcl9mbGFnICAgICAgICAgIDogMTsKKwkJdTMyIExMQ19TTkFQX0ZMQUdfc2V0ICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUcmFuc3BvcnRfRXJyb3IgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMTsKKwl9IGlycV8yMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXRfYmxvY2tfMDAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzEwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18yMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMzAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzQwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja181MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNjAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzcwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBCbG9ja19yZXNldF9lbmFibGUgICAgICAgICAgICAgOiA4OworCQl1MzIgU3BlY2lhbF9jb250cm9scyAgICAgICAgICAgICAgIDoxNjsKKwl9IHN3X3Jlc2V0XzIxMDsKKworCXN0cnVjdCB7CisJCXUzMiB2dWFydF9vZV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdjJXU19vZV9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGhhbHRfVjhfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZWN0aW9uX3BrZ19lbmFibGVfc2lnICAgICAgICAgOiAxOworCQl1MzIgczJwX3NlbF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBwb2xhcml0eV9QU19DTEtfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfVkFMSURfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX1NZTkNfc2lnICAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19FUlJfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkMiAgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwl9IG1pc2NfMjE0OworCisJc3RydWN0IHsKKwkJdTMyIE1haWxib3hfZnJvbV9WOCAgICAgICAgICAgICAgICA6MzI7CisJfSBtYm94X3Y4X3RvX2hvc3RfMjE4OworCisJc3RydWN0IHsKKwkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhICAgICAgICAgICAgICA6IDg7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYWRkciAgICAgICAgICAgICAgOjE1OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHN5c3JhbWFjY2Vzc193cml0ZSAgICAgICAgICAgICA6IDE7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYnVzbXVzdGVyICAgICAgICAgOiAxOworCX0gbWJveF9ob3N0X3RvX3Y4XzIxYzsKKworCXN0cnVjdCB7CisJCXUzMiBTdHJlYW0xX1BJRCAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgU3RyZWFtMV90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1BQ19NdWx0aWNhc3RfZmlsdGVyICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCAgICAgICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl9QSUQgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIFN0cmVhbTJfdHJhbnMgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3dyaXRlX3N0YXR1czAwICAgICAgOiAxOworCQl1MzIgZGVidWdfZmlmb19wcm9ibGVtICAgICAgICAgICAgIDogMTsKKwl9IHBpZF9maWx0ZXJfMzAwOworCisJc3RydWN0IHsKKwkJdTMyIFBDUl9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBQQ1JfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGVidWdfb3ZlcnJ1bjMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX292ZXJydW4yICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgUE1UX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwNDsKKworCXN0cnVjdCB7CisJCXUzMiBFTU1fUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgRU1NX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfNCAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyXzYgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEVDTV90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCX0gcGlkX2ZpbHRlcl8zMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgR3JvdXBfUElEICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEdyb3VwX3RyYW5zICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgR3JvdXBfbWFzayAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIHVudXNlZDIgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzBfNzsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfbWFzdGVyX3JlYWQgICAgICAgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMTsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfbWFzdGVyX3dyaXRlICAgICAgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMjsKKworCXN0cnVjdCB7CisJCXUzMiBuZXh0X25ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMzsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3RhdGVfd3JpdGUgICAgICAgICAgICAgICAgICAgIDoxMDsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBzdGFja19yZWFkICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNDsKKworCXN0cnVjdCB7CisJCXUzMiBzdGFja19jbnQgICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoyMjsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNTsKKworCXN0cnVjdCB7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMCAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzEgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcyICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMyAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzQgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczMDAgICAgICAgICAgICA6IDI7CisJCXUzMiB3cml0ZV9zdGF0dXMxICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgd3JpdGVfc3RhdHVzNCAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGRhdGFfc2l6ZV9yZWcgICAgICAgICAgICAgICAgICA6MTI7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF82OworCisJc3RydWN0IHsKKwkJdTMyIGluZGV4X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBleHRyYV9pbmRleF9yZWcgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgQUJfc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBhc3NfYWxsdGFibGVzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjIyOworCX0gaW5kZXhfcmVnXzMxMDsKKworCXN0cnVjdCB7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgUElEX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBJRF9lbmFibGVfYml0ICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX25fcmVnXzMxNDsKKworCXN0cnVjdCB7CisJCXUzMiBBNF9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTVfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEE2X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBFbmFibGVfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgSGlnaEFCX2JpdCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSBtYWNfbG93X3JlZ18zMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQTFfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEEyX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBM19ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19oaWdoX3JlZ18zMWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIGRhdGFfVGFnX0lEICAgICAgICAgICAgICAgICAgICA6MTY7CisJfSBkYXRhX3RhZ180MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgQ2FyZF9JRGJ5dGU2ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNSAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTQgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGUzICAgICAgICAgICAgICAgICAgIDogODsKKwl9IGNhcmRfaWRfNDA4OworCisJc3RydWN0IHsKKwkJdTMyIENhcmRfSURieXRlMiAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTEgICAgICAgICAgICAgICAgICAgOiA4OworCX0gY2FyZF9pZF80MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgTUFDMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzIgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19hZGRyZXNzXzQxODsKKworCXN0cnVjdCB7CisJCXUzMiBNQUM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTY7CisJfSBtYWNfYWRkcmVzc180MWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdHJhbnNtaXR0ZXJfZGF0YV9ieXRlICAgICAgICAgIDogODsKKwkJdTMyIFJlY2VpdmVEYXRhUmVhZHkgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBSZWNlaXZlQnl0ZUZyYW1lRXJyb3IgICAgICAgICAgOiAxOworCQl1MzIgdHhidWZmZW1wdHkgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjE7CisJfSBjaV82MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgcGlfZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHBpX2hhICAgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwaV9ydyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfY29tcG9uZW50X3JlZyAgICAgICAgICAgICAgIDogMzsKKwl9IHBpXzYwNDsKKworCXN0cnVjdCB7CisJCXUzMiBzZXJpYWxSZXNldCAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgb25jZWN5Y2xlX3JlYWQgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFRpbWVyX1JlYWRfcmVxICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdGltZXJfZGF0YSAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUaW1lcl9hZGRyICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHBjbWNpYV9hX21vZF9wd3JfbiAgICAgICAgICAgICA6IDE7CisJCXUzMiBwY21jaWFfYl9tb2RfcHdyX24gICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0RvbmVfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Jbml0X3N0YXQgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfUHJvZ19uICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX3dyX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19jc19uICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfY2NsayAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfQ2lNYXhfSVJRX24gICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX3RpbWVvdXRfc3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV93YWl0X24gICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfYnVzeV9uICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IHBpXzYwODsKKworCXN0cnVjdCB7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIga2V5X2VuYWJsZSAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGtleV9jb2RlICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBrZXlfYXJyYXlfY29sICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIga2V5X2FycmF5X3JvdyAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGR2Yl9lbiAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByd19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IGR2Yl9yZWdfNjBjOworCisJc3RydWN0IHsKKwkJdTMyIHNyYW1fYWRkciAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBzcmFtX3J3ICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3JhbV9kYXRhICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNjX3hmZXJfYml0ICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgb2VfcGluX3JlZyAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNlX3Bpbl9yZWcgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3RhcnRfc3JhbV9pYmkgICAgICAgICAgICAgICAgIDogMTsKKwl9IHNyYW1fY3RybF9yZWdfNzAwOworCisJc3RydWN0IHsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6MTY7CisJCXUzMiBuZXRfYWRkcl93cml0ZSAgICAgICAgICAgICAgICAgOjE2OworCX0gbmV0X2J1Zl9yZWdfNzA0OworCisJc3RydWN0IHsKKwkJdTMyIGNhaV9yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FpX3dyaXRlICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYWlfY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gY2FpX2J1Zl9yZWdfNzA4OworCisJc3RydWN0IHsKKwkJdTMyIGNhb19yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FwX3dyaXRlICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYW9fY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gY2FvX2J1Zl9yZWdfNzBjOworCisJc3RydWN0IHsKKwkJdTMyIG1lZGlhX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgbWVkaWFfd3JpdGUgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBtZWRpYV9jbnQgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gbWVkaWFfYnVmX3JlZ183MTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgTkVUX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIENBSV9EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBDQU9fRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgTUVESUFfRGVzdCAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIG5ldF9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FpX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNhb19vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjdHJsX3VzYl93YW4gICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY3RybF9zcmFtZG1hICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfbWF4aW11bWZpbGwgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCX0gc3JhbV9kZXN0X3JlZ183MTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2NudCAgICAgICAgICAgICAgICAgICAgICAgIDoxMjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiBuZXRfYWRkcl9yZWFkICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIG5ldF9hZGRyX3dyaXRlICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOjExOworCX0gbmV0X2J1Zl9yZWdfNzE4OworCisJc3RydWN0IHsKKwkJdTMyIHdhbl9zcGVlZF9zaWcgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgd2FuX3dhaXRfc3RhdGUgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNyYW1fY2hpcCAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBzcmFtX21lbW1hcCAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHdhbl9wa3RfZnJhbWUgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gd2FuX2N0cmxfcmVnXzcxYzsKK30gZmxleGNvcF9pYmlfdmFsdWU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JjNGMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvc2t5c3RhcjIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NDQgKzAsMCBAQAotLyoKLSAqIHNreXN0YXIyLmMgLSBkcml2ZXIgZm9yIHRoZSBUZWNobmlzYXQgU2t5U3RhcjIgUENJIERWQiBjYXJkCi0gKiAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIEZsZXhDb3BJSSBieSBCMkMyLEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFZhZGltIENhdGFuYSwgc2t5c3RhckBtb2xkb3ZhLmNjCi0gKgotICogRklYOiBESVNFUUMgVG9uZSBCdXJzdCBpbiBmbGV4Y29wX2Rpc2VxY19pb2N0bCgpCi0gKiBGSVg6IEZVTEwgc29mdCBEaVNFcUMgZm9yIHNreXN0YXIyIChGbGV4Q29wSUkgcmV2IDEzMCkgVlAzMTAgZXF1aXBwZWQKLSAqICAgICBWaW5jZW56byBEaSBNYXNzYSwgaGF3ay5pdCBhdCB0aXNjYWxpbmV0Lml0Ci0gKgotICogQ29udmVydGVkIHRvIExpbnV4IGNvZGluZyBzdHlsZQotICogTWlzYyByZW9yZ2FuaXphdGlvbiwgcG9saXNoaW5nLCByZXN0eWxpbmcKLSAqICAgICBSb2JlcnRvIFJhZ3VzYSwgc2t5c3RhcjItYzViOCBhdCByb2JlcnRvcmFndXNhIGRvdCBpdAotICoKLSAqIEFkZGVkIGhhcmR3YXJlIGZpbHRlcmluZyBzdXBwb3J0LAotICogICAgIE5pa2xhcyBQZWluZWNrZSwgcGVpbmVja2UgYXQgZ2R2LnVuaS1oYW5ub3Zlci5kZQotICoKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KLSNpbmNsdWRlICJkdmJfZGVtdXguaCIKLSNpbmNsdWRlICJkbXhkZXYuaCIKLSNpbmNsdWRlICJkdmJfZmlsdGVyLmgiCi0jaW5jbHVkZSAiZHZiZGV2LmgiCi0jaW5jbHVkZSAiZGVtdXguaCIKLSNpbmNsdWRlICJkdmJfbmV0LmgiCi0jaW5jbHVkZSAic3R2MDI5OS5oIgotI2luY2x1ZGUgIm10MzUyLmgiCi0jaW5jbHVkZSAibXQzMTIuaCIKLSNpbmNsdWRlICJueHQyMDAyLmgiCi0KLXN0YXRpYyBpbnQgZGVidWc7Ci1zdGF0aWMgaW50IGVuYWJsZV9od19maWx0ZXJzID0gMjsKLQotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDAgPSBkZWZhdWx0LCAxID0gbW9zdCBtZXNzYWdlcywgMiA9IGFsbCBtZXNzYWdlcykuIik7Ci1tb2R1bGVfcGFyYW0oZW5hYmxlX2h3X2ZpbHRlcnMsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9od19maWx0ZXJzLCAiZW5hYmxlIGhhcmR3YXJlIGZpbHRlcnM6IHN1cHBvcnRlZCB2YWx1ZXM6IDAgKG5vbmUpLCAxLCAyIik7Ci0KLSNkZWZpbmUgZHByaW50ayh4Li4uKQlkbyB7IGlmIChkZWJ1Zz49MSkgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQotI2RlZmluZSBkZHByaW50ayh4Li4uKQlkbyB7IGlmIChkZWJ1Zz49MikgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJWkVfT0ZfQlVGX0RNQTEJMHgzYWMwMAotI2RlZmluZSBTSVpFX09GX0JVRl9ETUEyCTB4NzU4Ci0KLSNkZWZpbmUgTUFYX05fSFdfRklMVEVSUwkoNiszMikKLSNkZWZpbmUgTl9QSURfU0xPVFMJCTI1NgotCi1zdHJ1Y3QgZG1hcSB7Ci0JdTMyIGJ1c19hZGRyOwotCXUzMiBoZWFkOwotCXUzMiB0YWlsOwotCXUzMiBidWZmZXJfc2l6ZTsKLQl1OCAqYnVmZmVyOwotfTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KQotI2RlZmluZSBfX2lvbWVtCi0jZW5kaWYKLQotc3RydWN0IGFkYXB0ZXIgewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCi0JdTggY2FyZF9yZXZpc2lvbjsKLQl1MzIgYjJjMl9yZXZpc2lvbjsKLQl1MzIgcGlkX2ZpbHRlcl9tYXg7Ci0JdTMyIG1hY19maWx0ZXJfbWF4OwotCXUzMiBpcnE7Ci0Jdm9pZCBfX2lvbWVtICppb19tZW07Ci0JdW5zaWduZWQgbG9uZyBpb19wb3J0OwotCXU4IG1hY19hZGRyWzhdOwotCXUzMiBkd19zcmFtX3R5cGU7Ci0KLQlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKLQlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKLQlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOwotCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOwotCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKLQlzdHJ1Y3QgZHZiX25ldCBkdmJuZXQ7Ci0KLQlzdHJ1Y3Qgc2VtYXBob3JlIGkyY19zZW07Ci0KLQlzdHJ1Y3QgZG1hcSBkbWFxMTsKLQlzdHJ1Y3QgZG1hcSBkbWFxMjsKLQotCXUzMiBkbWFfY3RybDsKLQl1MzIgZG1hX3N0YXR1czsKLQotCWludCBjYXB0dXJpbmc7Ci0KLQlzcGlubG9ja190IGxvY2s7Ci0KLQlpbnQgdXNlYWJsZV9od19maWx0ZXJzOwotCXUxNiBod19waWRzW01BWF9OX0hXX0ZJTFRFUlNdOwotCXUxNiBwaWRfbGlzdFtOX1BJRF9TTE9UU107Ci0JaW50IHBpZF9yY1tOX1BJRF9TTE9UU107CS8vIHJlZiBjb3VudGVycyBmb3IgdGhlIHBpZHMKLQlpbnQgcGlkX2NvdW50OwotCWludCB3aG9sZV9iYW5kd2lkdGhfY291bnQ7Ci0JdTMyIG1hY19maWx0ZXI7Ci0KLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZTsKLQlpbnQgKCpmZV9zbGVlcCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotfTsKLQotI2RlZmluZSB3cml0ZV9yZWdfZHcoYWRhcHRlcixyZWcsdmFsdWUpIHdyaXRlbCh2YWx1ZSwgYWRhcHRlci0+aW9fbWVtICsgcmVnKQotI2RlZmluZSByZWFkX3JlZ19kdyhhZGFwdGVyLHJlZykgcmVhZGwoYWRhcHRlci0+aW9fbWVtICsgcmVnKQotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZWdfYml0ZmllbGQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWcsIHUzMiB6ZXJvbWFzaywgdTMyIG9ydmFsdWUpCi17Ci0JdTMyIHRtcDsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIHJlZyk7Ci0JdG1wID0gKHRtcCAmIH56ZXJvbWFzaykgfCBvcnZhbHVlOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCByZWcsIHRtcCk7Ci19Ci0KLS8qIGkyYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgaTJjX21haW5fd3JpdGVfZm9yX2ZsZXgyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgY29tbWFuZCwgdTggKmJ1ZiwgaW50IHJldHJpZXMpCi17Ci0JaW50IGk7Ci0JdTMyIHZhbHVlOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwLCAwKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIGNvbW1hbmQpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwKTsKLQotCQlpZiAoKHZhbHVlICYgMHg0MDAwMDAwMCkgPT0gMCkgewotCQkJaWYgKCh2YWx1ZSAmIDB4ODEwMDAwMDApID09IDB4ODAwMDAwMDApIHsKLQkJCQlpZiAoYnVmICE9IDApCi0JCQkJCSpidWYgPSAodmFsdWUgPj4gMHgxMCkgJiAweGZmOwotCi0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIDApOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwLCBjb21tYW5kKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBkZXZpY2UgPSAweDEwMDAwMDAwIGZvciB0dW5lciwgMHgyMDAwMDAwMCBmb3IgZWVwcm9tICovCi1zdGF0aWMgdm9pZCBpMmNfbWFpbl9zZXR1cCh1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1OCBvcCwgdTggYWRkciwgdTMyIHZhbHVlLCB1MzIgbGVuLCB1MzIgKmNvbW1hbmQpCi17Ci0JKmNvbW1hbmQgPSBkZXZpY2UgfCAoKGxlbiAtIDEpIDw8IDI2KSB8ICh2YWx1ZSA8PCAxNikgfCAoYWRkciA8PCA4KSB8IGNoaXBfYWRkcjsKLQotCWlmIChvcCAhPSAwKQotCQkqY29tbWFuZCA9ICpjb21tYW5kIHwgMHgwMzAwMDAwMDsKLQllbHNlCi0JCSpjb21tYW5kID0gKmNvbW1hbmQgfCAweDAxMDAwMDAwOwotfQotCi1zdGF0aWMgaW50IGZsZXhfaTJjX3JlYWQ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTggbGVuKQotewotCXUzMiBjb21tYW5kOwotCXUzMiB2YWx1ZTsKLQotCWludCByZXN1bHQsIGk7Ci0KLQlpMmNfbWFpbl9zZXR1cChkZXZpY2UsIGNoaXBfYWRkciwgMSwgYWRkciwgMCwgbGVuLCAmY29tbWFuZCk7Ci0KLQlyZXN1bHQgPSBpMmNfbWFpbl93cml0ZV9mb3JfZmxleDIoYWRhcHRlciwgY29tbWFuZCwgYnVmLCAxMDAwMDApOwotCi0JaWYgKChyZXN1bHQgJiAweGZmKSAhPSAwKSB7Ci0JCWlmIChsZW4gPiAxKSB7Ci0JCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MTA0KTsKLQotCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gdmFsdWUgJiAweGZmOwotCQkJCXZhbHVlID0gdmFsdWUgPj4gODsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleF9pMmNfd3JpdGU0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTggbGVuKQotewotCXUzMiBjb21tYW5kOwotCXUzMiB2YWx1ZTsKLQlpbnQgaTsKLQotCWlmIChsZW4gPiAxKSB7Ci0JCXZhbHVlID0gMDsKLQotCQlmb3IgKGkgPSBsZW47IGkgPiAxOyBpLS0pIHsKLQkJCXZhbHVlID0gdmFsdWUgPDwgODsKLQkJCXZhbHVlID0gdmFsdWUgfCBidWZbaSAtIDFdOwotCQl9Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTA0LCB2YWx1ZSk7Ci0JfQotCi0JaTJjX21haW5fc2V0dXAoZGV2aWNlLCBjaGlwX2FkZHIsIDAsIGFkZHIsIGJ1ZlswXSwgbGVuLCAmY29tbWFuZCk7Ci0KLQlyZXR1cm4gaTJjX21haW5fd3JpdGVfZm9yX2ZsZXgyKGFkYXB0ZXIsIGNvbW1hbmQsIE5VTEwsIDEwMDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpeGNoaXBhZGRyKHUzMiBkZXZpY2UsIHUzMiBidXMsIHUzMiBhZGRyLCB1MzIgKnJldCkKLXsKLQlpZiAoZGV2aWNlID09IDB4MjAwMDAwMDApCi0JCSpyZXQgPSBidXMgfCAoKGFkZHIgPj4gOCkgJiAzKTsKLQllbHNlCi0JCSpyZXQgPSBidXM7Ci19Ci0KLXN0YXRpYyB1MzIgZmxleF9pMmNfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGRldmljZSwgdTMyIGJ1cywgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGNoaXBhZGRyOwotCXUzMiBieXRlc190b190cmFuc2ZlcjsKLQl1OCAqc3RhcnQ7Ci0KLQlkZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3RhcnQgPSBidWY7Ci0KLQl3aGlsZSAobGVuICE9IDApIHsKLQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBsZW47Ci0KLQkJaWYgKGJ5dGVzX3RvX3RyYW5zZmVyID4gNCkKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gNDsKLQotCQlmaXhjaGlwYWRkcihkZXZpY2UsIGJ1cywgYWRkciwgJmNoaXBhZGRyKTsKLQotCQlpZiAoZmxleF9pMmNfcmVhZDQoYWRhcHRlciwgZGV2aWNlLCBjaGlwYWRkciwgYWRkciwgYnVmLCBieXRlc190b190cmFuc2ZlcikgPT0gMCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQotCQlidWYgPSBidWYgKyBieXRlc190b190cmFuc2ZlcjsKLQkJYWRkciA9IGFkZHIgKyBieXRlc190b190cmFuc2ZlcjsKLQkJbGVuID0gbGVuIC0gYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JfTsKLQotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIHUzMiBmbGV4X2kyY193cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGRldmljZSwgdTMyIGJ1cywgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGNoaXBhZGRyOwotCXUzMiBieXRlc190b190cmFuc2ZlcjsKLQl1OCAqc3RhcnQ7Ci0KLQlkZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3RhcnQgPSBidWY7Ci0KLQl3aGlsZSAobGVuICE9IDApIHsKLQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBsZW47Ci0KLQkJaWYgKGJ5dGVzX3RvX3RyYW5zZmVyID4gNCkKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gNDsKLQotCQlmaXhjaGlwYWRkcihkZXZpY2UsIGJ1cywgYWRkciwgJmNoaXBhZGRyKTsKLQotCQlpZiAoZmxleF9pMmNfd3JpdGU0KGFkYXB0ZXIsIGRldmljZSwgY2hpcGFkZHIsIGFkZHIsIGJ1ZiwgYnl0ZXNfdG9fdHJhbnNmZXIpID09IDApCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQkJYnVmID0gYnVmICsgYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JCWFkZHIgPSBhZGRyICsgYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JCWxlbiA9IGxlbiAtIGJ5dGVzX3RvX3RyYW5zZmVyOwotCX0KLQotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIGludCBtYXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXB0ZXIsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQotewotCXN0cnVjdCBhZGFwdGVyICp0bXAgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOwotCWludCBpLCByZXQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdG1wLT5pMmNfc2VtKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWRkcHJpbnRrKCIlczogJWQgbWVzc2FnZXMgdG8gdHJhbnNmZXJcbiIsIF9fRlVOQ1RJT05fXywgbnVtKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJZGRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgbXNnc1tpXS5sZW4pOwotCX0KLQotCS8vIHJlYWQgY29tbWFuZAotCWlmICgobnVtID09IDIpICYmIChtc2dzWzBdLmZsYWdzID09IDApICYmIChtc2dzWzFdLmZsYWdzID09IEkyQ19NX1JEKSAmJiAobXNnc1swXS5idWYgIT0gTlVMTCkgJiYgKG1zZ3NbMV0uYnVmICE9IE5VTEwpKSB7Ci0KLQkJcmV0ID0gZmxleF9pMmNfcmVhZCh0bXAsIDB4MTAwMDAwMDAsIG1zZ3NbMF0uYWRkciwgbXNnc1swXS5idWZbMF0sIG1zZ3NbMV0uYnVmLCBtc2dzWzFdLmxlbik7Ci0KLQkJdXAoJnRtcC0+aTJjX3NlbSk7Ci0KLQkJaWYgKHJldCAhPSBtc2dzWzFdLmxlbikgewotCQkJZHByaW50aygiJXM6IHJlYWQgZXJyb3IgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCWRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkJICAgICAgIG1zZ3NbaV0uZmxhZ3MsIG1zZ3NbaV0uYWRkciwgbXNnc1tpXS5idWZbMF0sIG1zZ3NbaV0ubGVuKTsKLQkJfQotCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJfQotCi0JCXJldHVybiBudW07Ci0JfQotCS8vIHdyaXRlIGNvbW1hbmQKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQotCQlpZiAoKG1zZ3NbaV0uZmxhZ3MgIT0gMCkgfHwgKG1zZ3NbaV0uYnVmID09IE5VTEwpIHx8IChtc2dzW2ldLmxlbiA8IDIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmV0ID0gZmxleF9pMmNfd3JpdGUodG1wLCAweDEwMDAwMDAwLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uYnVmWzBdLCAmbXNnc1tpXS5idWZbMV0sIG1zZ3NbaV0ubGVuIC0gMSk7Ci0KLQkJdXAoJnRtcC0+aTJjX3NlbSk7Ci0KLQkJaWYgKHJldCAhPSBtc2dzWzBdLmxlbiAtIDEpIHsKLQkJCWRwcmludGsoIiVzOiB3cml0ZSBlcnJvciAlaSAhXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0KLQkJCWRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmWzBdPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkgICAgICAgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgbXNnc1tpXS5sZW4pOwotCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJfQotCi0JCXJldHVybiBudW07Ci0JfQotCi0JcHJpbnRrKCIlczogdW5rbm93biBjb21tYW5kIGZvcm1hdCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIFNSQU0gKFNreXN0YXIyIHJldjIuMyBoYXMgb25lICJJU1NJIElTNjFMVjI1NiIgY2hpcCBvbiBib2FyZCwKLSAgIGJ1dCBpdCBzZWVtcyB0aGF0IEZsZXhDb3BJSSBjYW4gd29yayB3aXRoIG1vcmUgdGhhbiBvbmUgY2hpcCkgKi8KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X25ldF9kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmZmYykgfCAoZGVzdCAmIDMpOwotCi0JdWRlbGF5KDEwMDApOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQotCXVkZWxheSgxMDAwKTsKLQotCS8qIHJldHVybiB2YWx1ZSBpcyBuZXZlciB1c2VkPyAqLwotLyoJcmV0dXJuIHRtcDsgKi8KLX0KLQotc3RhdGljIHZvaWQgc3JhbV9zZXRfY2FpX2Rlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRlc3QpCi17Ci0JdTMyIHRtcDsKLQotCXVkZWxheSgxMDAwKTsKLQotCXRtcCA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxNCkgJiAweGZmZmZmZmYzKSB8ICgoZGVzdCAmIDMpIDw8IDIpOwotCi0JdWRlbGF5KDEwMDApOwotCXVkZWxheSgxMDAwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiB0bXA7ICovCi19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X2Nhb19kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmZjZikgfCAoKGRlc3QgJiAzKSA8PCA0KTsKLQotCXVkZWxheSgxMDAwKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCi0JdWRlbGF5KDEwMDApOwotCi0JLyogcmV0dXJuIHZhbHVlIGlzIG5ldmVyIHVzZWQ/ICovCi0vKglyZXR1cm4gdG1wOyAqLwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3NldF9tZWRpYV9kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmYzZikgfCAoKGRlc3QgJiAzKSA8PCA2KTsKLQotCXVkZWxheSgxMDAwKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCi0JdWRlbGF5KDEwMDApOwotCi0JLyogcmV0dXJuIHZhbHVlIGlzIG5ldmVyIHVzZWQ/ICovCi0vKglyZXR1cm4gdG1wOyAqLwotfQotCi0vKiBTUkFNIG1lbW9yeSBpcyBhY2Nlc3NlZCB0aHJvdWdoIGEgYnVmZmVyIHJlZ2lzdGVyIGluIHRoZSBGbGV4Q29wCi0gICBjaGlwICgweDcwMCkuIFRoaXMgcmVnaXN0ZXIgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIGJpdHMgMC0xNCAgOiBhZGRyZXNzCi0gICAgYml0ICAxNSAgICA6IHJlYWQvd3JpdGUgZmxhZwotICAgIGJpdHMgMTYtMjMgOiA4LWJpdCB3b3JkIHRvIHdyaXRlCi0gICAgYml0cyAyNC0yNyA6ID0gNAotICAgIGJpdHMgMjgtMjkgOiBtZW1vcnkgYmFuayBzZWxlY3RvcgotICAgIGJpdCAgMzEgICAgOiBidXN5IGZsYWcKLSovCi1zdGF0aWMgdm9pZCBmbGV4X3NyYW1fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQlpbnQgaSwgcmV0cmllczsKLQl1MzIgY29tbWFuZDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljb21tYW5kID0gYmFuayB8IGFkZHIgfCAweDA0MDAwMDAwIHwgKCpidWYgPDwgMHgxMCk7Ci0KLQkJcmV0cmllcyA9IDI7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKLQotCQlidWYrKzsKLQkJYWRkcisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmxleF9zcmFtX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQlpbnQgaSwgcmV0cmllczsKLQl1MzIgY29tbWFuZCwgdmFsdWU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJY29tbWFuZCA9IGJhbmsgfCBhZGRyIHwgMHgwNDAwODAwMDsKLQotCQlyZXRyaWVzID0gMTAwMDA7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKLQotCQlyZXRyaWVzID0gMTAwMDA7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJdmFsdWUgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgPj4gMHgxMDsKLQotCQkqYnVmID0gKHZhbHVlICYgMHhmZik7Ci0KLQkJYWRkcisrOwotCQlidWYrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fd3JpdGVfY2h1bmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQotewotCXUzMiBiYW5rOwotCi0JYmFuayA9IDA7Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MjAwMDApIHsKLQkJYmFuayA9IChhZGRyICYgMHgxODAwMCkgPDwgMHgwZDsKLQl9Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApIHsKLQkJaWYgKChhZGRyID4+IDB4MGYpID09IDApCi0JCQliYW5rID0gMHgyMDAwMDAwMDsKLQkJZWxzZQotCQkJYmFuayA9IDB4MTAwMDAwMDA7Ci0JfQotCi0JZmxleF9zcmFtX3dyaXRlKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgc3JhbV9yZWFkX2NodW5rKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQl1MzIgYmFuazsKLQotCWJhbmsgPSAwOwotCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDIwMDAwKSB7Ci0JCWJhbmsgPSAoYWRkciAmIDB4MTgwMDApIDw8IDB4MGQ7Ci0JfQotCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDAwMDAwKSB7Ci0JCWlmICgoYWRkciA+PiAweDBmKSA9PSAwKQotCQkJYmFuayA9IDB4MjAwMDAwMDA7Ci0JCWVsc2UKLQkJCWJhbmsgPSAweDEwMDAwMDAwOwotCX0KLQotCWZsZXhfc3JhbV9yZWFkKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgc3JhbV9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQl1MzIgbGVuZ3RoOwotCi0Jd2hpbGUgKGxlbiAhPSAwKSB7Ci0JCWxlbmd0aCA9IGxlbjsKLQotCQkvLyBjaGVjayBpZiB0aGUgYWRkcmVzcyByYW5nZSBiZWxvbmdzIHRvIHRoZSBzYW1lIAotCQkvLyAzMksgbWVtb3J5IGNoaXAuIElmIG5vdCwgdGhlIGRhdGEgaXMgcmVhZCBmcm9tIAotCQkvLyBvbmUgY2hpcCBhdCBhIHRpbWUuCi0JCWlmICgoYWRkciA+PiAweDBmKSAhPSAoKGFkZHIgKyBsZW4gLSAxKSA+PiAweDBmKSkgewotCQkJbGVuZ3RoID0gKCgoYWRkciA+PiAweDBmKSArIDEpIDw8IDB4MGYpIC0gYWRkcjsKLQkJfQotCi0JCXNyYW1fcmVhZF9jaHVuayhhZGFwdGVyLCBhZGRyLCBidWYsIGxlbmd0aCk7Ci0KLQkJYWRkciA9IGFkZHIgKyBsZW5ndGg7Ci0JCWJ1ZiA9IGJ1ZiArIGxlbmd0aDsKLQkJbGVuID0gbGVuIC0gbGVuZ3RoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3JhbV93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGxlbmd0aDsKLQotCXdoaWxlIChsZW4gIT0gMCkgewotCQlsZW5ndGggPSBsZW47Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGFkZHJlc3MgcmFuZ2UgYmVsb25ncyB0byB0aGUgc2FtZSAKLQkJLy8gMzJLIG1lbW9yeSBjaGlwLiBJZiBub3QsIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8KLQkJLy8gb25lIGNoaXAgYXQgYSB0aW1lLgotCQlpZiAoKGFkZHIgPj4gMHgwZikgIT0gKChhZGRyICsgbGVuIC0gMSkgPj4gMHgwZikpIHsKLQkJCWxlbmd0aCA9ICgoKGFkZHIgPj4gMHgwZikgKyAxKSA8PCAweDBmKSAtIGFkZHI7Ci0JCX0KLQotCQlzcmFtX3dyaXRlX2NodW5rKGFkYXB0ZXIsIGFkZHIsIGJ1ZiwgbGVuZ3RoKTsKLQotCQlhZGRyID0gYWRkciArIGxlbmd0aDsKLQkJYnVmID0gYnVmICsgbGVuZ3RoOwotCQlsZW4gPSBsZW4gLSBsZW5ndGg7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3NldF9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaykKLXsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MWMsIChtYXNrIHwgKH4weDMwMDAwICYgcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpKSkpOwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIHRtcDsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7Ci0KLQlpZiAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpICE9IDApIHsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCB0bXApOwotCi0JCWFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9IHRtcCAmIDB4MzAwMDA7Ci0KLQkJZGRwcmludGsoIiVzOiBkd19zcmFtX3R5cGUgPSAleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOwotCi0JfSBlbHNlIHsKLQotCQlhZGFwdGVyLT5kd19zcmFtX3R5cGUgPSAweDEwMDAwOwotCi0JCWRkcHJpbnRrKCIlczogZHdfc3JhbV90eXBlID0gJXhcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZHdfc3JhbV90eXBlKTsKLQl9Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiBhZGFwdGVyLT5kd19zcmFtX3R5cGU7ICovCi19Ci0KLXN0YXRpYyBpbnQgc3JhbV90ZXN0X2xvY2F0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaywgdTMyIGFkZHIpCi17Ci0JdTggdG1wMSwgdG1wMjsKLQotCWRwcmludGsoIiVzOiBtYXNrID0gJXgsIGFkZHIgPSAleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrLCBhZGRyKTsKLQotCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgbWFzayk7Ci0Jc3JhbV9pbml0KGFkYXB0ZXIpOwotCi0JdG1wMiA9IDB4YTU7Ci0JdG1wMSA9IDB4NGY7Ci0KLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7Ci0KLQl0bXAyID0gMDsKLQotCW1kZWxheSgyMCk7Ci0KLQlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0KLQlkcHJpbnRrKCIlczogd3JvdGUgMHhhNSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCWlmICh0bXAyICE9IDB4YTUpCi0JCXJldHVybiAwOwotCi0JdG1wMiA9IDB4NWE7Ci0JdG1wMSA9IDB4ZjQ7Ci0KLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7Ci0KLQl0bXAyID0gMDsKLQotCW1kZWxheSgyMCk7Ci0KLQlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0KLQlkcHJpbnRrKCIlczogd3JvdGUgMHg1YSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCWlmICh0bXAyICE9IDB4NWEpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1MzIgc3JhbV9sZW5ndGgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDEwMDAwKQotCQlyZXR1cm4gMzI3Njg7CS8vICAzMksKLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApCi0JCXJldHVybiA2NTUzNjsJLy8gIDY0SyAgICAgICAgCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDIwMDAwKQotCQlyZXR1cm4gMTMxMDcyOwkvLyAxMjhLCi0KLQlyZXR1cm4gMzI3Njg7CQkvLyAzMksKLX0KLQotLyogRmxleGNvcElJIGNhbiB3b3JrIHdpdGggMzJLLCA2NEsgb3IgMTI4SyBvZiBleHRlcm5hbCBTUkFNIG1lbW9yeS4KLSAgICAtIGZvciAxMjhLIHRoZXJlIGFyZSA0eDMySyBjaGlwcyBhdCBiYW5rIDAsMSwyLDMuCi0gICAgLSBmb3IgIDY0SyB0aGVyZSBhcmUgMngzMksgY2hpcHMgYXQgYmFuayAxLDIuCi0gICAgLSBmb3IgIDMySyB0aGVyZSBpcyBvbmUgMzJLIGNoaXAgYXQgYmFuayAwLgotCi0gICBGbGV4Q29wIHdvcmtzIG9ubHkgd2l0aCBvbmUgYmFuayBhdCBhIHRpbWUuIFRoZSBiYW5rIGlzIHNlbGVjdGVkCi0gICBieSBiaXRzIDI4LTI5IG9mIHRoZSAweDcwMCByZWdpc3Rlci4KLSAgCi0gICBiYW5rIDAgY292ZXJzIGFkZHJlc3NlcyAweDAwMDAwLTB4MDdmZmYKLSAgIGJhbmsgMSBjb3ZlcnMgYWRkcmVzc2VzIDB4MDgwMDAtMHgwZmZmZgotICAgYmFuayAyIGNvdmVycyBhZGRyZXNzZXMgMHgxMDAwMC0weDE3ZmZmCi0gICBiYW5rIDMgY292ZXJzIGFkZHJlc3NlcyAweDE4MDAwLTB4MWZmZmYKLSovCi1zdGF0aWMgaW50IHNyYW1fZGV0ZWN0X2Zvcl9mbGV4MihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgdG1wLCB0bXAyLCB0bXAzOwotCi0JZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JdG1wID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDgpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgMCk7Ci0KLQl0bXAyID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOwotCi0JZHByaW50aygiJXM6IHRtcDIgPSAleFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7Ci0KLQl0bXAzID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOwotCi0JZHByaW50aygiJXM6IHRtcDMgPSAleFxuIiwgX19GVU5DVElPTl9fLCB0bXAzKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgdG1wMik7Ci0KLQkvLyBjaGVjayBmb3IgaW50ZXJuYWwgU1JBTSA/Pz8KLQl0bXAzLS07Ci0JaWYgKHRtcDMgIT0gMCkgewotCQlzcmFtX3NldF9zaXplKGFkYXB0ZXIsIDB4MTAwMDApOwotCQlzcmFtX2luaXQoYWRhcHRlcik7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCQlkcHJpbnRrKCIlczogc3JhbSBzaXplID0gMzJLXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXJldHVybiAzMjsKLQl9Ci0KLQlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MjAwMDAsIDB4MTgwMDApICE9IDApIHsKLQkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDIwMDAwKTsKLQkJc3JhbV9pbml0KGFkYXB0ZXIpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7Ci0KLQkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDEyOEtcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJcmV0dXJuIDEyODsKLQl9Ci0KLQlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MDAwMDAsIDB4MTAwMDApICE9IDApIHsKLQkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDAwMDAwKTsKLQkJc3JhbV9pbml0KGFkYXB0ZXIpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7Ci0KLQkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDY0S1xuIiwgX19GVU5DVElPTl9fKTsKLQotCQlyZXR1cm4gNjQ7Ci0JfQotCi0JaWYgKHNyYW1fdGVzdF9sb2NhdGlvbihhZGFwdGVyLCAweDEwMDAwLCAweDAwMDAwKSAhPSAwKSB7Ci0JCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7Ci0JCXNyYW1faW5pdChhZGFwdGVyKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCB0bXApOwotCi0JCWRwcmludGsoIiVzOiBzcmFtIHNpemUgPSAzMktcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJcmV0dXJuIDMyOwotCX0KLQotCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7Ci0Jc3JhbV9pbml0KGFkYXB0ZXIpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCWRwcmludGsoIiVzOiBTUkFNIGRldGVjdGlvbiBmYWlsZWQuIFNldCB0byAzMksgXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsbF9kZXRlY3Rfc3JhbV9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXNyYW1fZGV0ZWN0X2Zvcl9mbGV4MihhZGFwdGVyKTsKLX0KLQotLyogRUVQUk9NIChTa3lzdGFyMiBoYXMgb25lICIyNExDMDhCIiBjaGlwIG9uIGJvYXJkKSAqLwotLyoKLXN0YXRpYyBpbnQgZWVwcm9tX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlyZXR1cm4gZmxleF9pMmNfd3JpdGUoYWRhcHRlciwgMHgyMDAwMDAwMCwgMHg1MCwgYWRkciwgYnVmLCBsZW4pOwotfQotKi8KLQotc3RhdGljIGludCBlZXByb21fcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCi17Ci0JcmV0dXJuIGZsZXhfaTJjX3JlYWQoYWRhcHRlciwgMHgyMDAwMDAwMCwgMHg1MCwgYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdTggY2FsY19scmModTggKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQl1OCBzdW07Ci0KLQlzdW0gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlzdW0gPSBzdW0gXiBidWZbaV07Ci0KLQlyZXR1cm4gc3VtOwotfQotCi1zdGF0aWMgaW50IGVlcHJvbV9scmNfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBsZW4sIHU4ICpidWYsIGludCByZXRyaWVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQlpZiAoZWVwcm9tX3JlYWQoYWRhcHRlciwgYWRkciwgYnVmLCBsZW4pID09IGxlbikgewotCQkJaWYgKGNhbGNfbHJjKGJ1ZiwgbGVuIC0gMSkgPT0gYnVmW2xlbiAtIDFdKQotCQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IGVlcHJvbV9scmNfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgbGVuLCB1OCAqd2J1ZiwgdTggKnJidWYsIGludCByZXRyaWVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQlpZiAoZWVwcm9tX3dyaXRlKGFkYXB0ZXIsIGFkZHIsIHdidWYsIGxlbikgPT0gbGVuKSB7Ci0JCQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIGFkZHIsIGxlbiwgcmJ1ZiwgcmV0cmllcykgPT0gMSkKLQkJCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotKi8KLQotCi0vKiBUaGVzZSBmdW5jdGlvbnMgY291bGQgYmUgdXNlZCB0byB1bmxvY2sgU2t5U3RhcjIgY2FyZHMuICovCi0KLS8qCi1zdGF0aWMgaW50IGVlcHJvbV93cml0ZUtleShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKmtleSwgdTMyIGxlbikKLXsKLQl1OCByYnVmWzIwXTsKLQl1OCB3YnVmWzIwXTsKLQotCWlmIChsZW4gIT0gMTYpCi0JCXJldHVybiAwOwotCi0JbWVtY3B5KHdidWYsIGtleSwgbGVuKTsKLQotCXdidWZbMTZdID0gMDsKLQl3YnVmWzE3XSA9IDA7Ci0Jd2J1ZlsxOF0gPSAwOwotCXdidWZbMTldID0gY2FsY19scmMod2J1ZiwgMTkpOwotCi0JcmV0dXJuIGVlcHJvbV9scmNfd3JpdGUoYWRhcHRlciwgMHgzZTQsIDIwLCB3YnVmLCByYnVmLCA0KTsKLX0KLQotc3RhdGljIGludCBlZXByb21fcmVhZEtleShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKmtleSwgdTMyIGxlbikKLXsKLQl1OCBidWZbMjBdOwotCi0JaWYgKGxlbiAhPSAxNikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIDB4M2U0LCAyMCwgYnVmLCA0KSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCW1lbWNweShrZXksIGJ1ZiwgbGVuKTsKLQotCXJldHVybiAxOwotfQotKi8KLQotc3RhdGljIGludCBlZXByb21fZ2V0X21hY19hZGRyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjaGFyIHR5cGUsIHU4ICptYWMpCi17Ci0JdTggdG1wWzhdOwotCi0JaWYgKGVlcHJvbV9scmNfcmVhZChhZGFwdGVyLCAweDNmOCwgOCwgdG1wLCA0KSAhPSAwKSB7Ci0JCWlmICh0eXBlICE9IDApIHsKLQkJCW1hY1swXSA9IHRtcFswXTsKLQkJCW1hY1sxXSA9IHRtcFsxXTsKLQkJCW1hY1syXSA9IHRtcFsyXTsKLQkJCW1hY1szXSA9IDB4ZmU7Ci0JCQltYWNbNF0gPSAweGZmOwotCQkJbWFjWzVdID0gdG1wWzNdOwotCQkJbWFjWzZdID0gdG1wWzRdOwotCQkJbWFjWzddID0gdG1wWzVdOwotCi0JCX0gZWxzZSB7Ci0KLQkJCW1hY1swXSA9IHRtcFswXTsKLQkJCW1hY1sxXSA9IHRtcFsxXTsKLQkJCW1hY1syXSA9IHRtcFsyXTsKLQkJCW1hY1szXSA9IHRtcFszXTsKLQkJCW1hY1s0XSA9IHRtcFs0XTsKLQkJCW1hY1s1XSA9IHRtcFs1XTsKLQkJfQotCi0JCXJldHVybiAxOwotCi0JfSBlbHNlIHsKLQotCQlpZiAodHlwZSA9PSAwKSB7Ci0JCQltZW1zZXQobWFjLCAwLCA2KTsKLQotCQl9IGVsc2UgewotCi0JCQltZW1zZXQobWFjLCAwLCA4KTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLX0KLQotLyoKLXN0YXRpYyBjaGFyIGVlcHJvbV9zZXRfbWFjX2FkZHIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgdHlwZSwgdTggKm1hYykKLXsKLQl1OCB0bXBbOF07Ci0KLQlpZiAodHlwZSAhPSAwKSB7Ci0JCXRtcFswXSA9IG1hY1swXTsKLQkJdG1wWzFdID0gbWFjWzFdOwotCQl0bXBbMl0gPSBtYWNbMl07Ci0JCXRtcFszXSA9IG1hY1s1XTsKLQkJdG1wWzRdID0gbWFjWzZdOwotCQl0bXBbNV0gPSBtYWNbN107Ci0KLQl9IGVsc2UgewotCi0JCXRtcFswXSA9IG1hY1swXTsKLQkJdG1wWzFdID0gbWFjWzFdOwotCQl0bXBbMl0gPSBtYWNbMl07Ci0JCXRtcFszXSA9IG1hY1szXTsKLQkJdG1wWzRdID0gbWFjWzRdOwotCQl0bXBbNV0gPSBtYWNbNV07Ci0JfQotCi0JdG1wWzZdID0gMDsKLQl0bXBbN10gPSBjYWxjX2xyYyh0bXAsIDcpOwotCi0JaWYgKGVlcHJvbV93cml0ZShhZGFwdGVyLCAweDNmOCwgdG1wLCA4KSA9PSA4KQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotKi8KLQotLyogUElEIGZpbHRlciAqLwotCi0vKiBldmVyeSBmbGV4Y29wIGhhcyA2ICJsb3dlciIgaHcgUElEIGZpbHRlcnMgICAgICovCi0vKiB0aGVzZSBhcmUgZW5hYmxlZCBieSBzZXR0aW5nIGJpdHMgMC01IG9mIDB4MjA4ICovCi0vKiBmb3IgdGhlIDMyIGFkZGl0aW9uYWwgZmlsdGVycyB3ZSBoYXZlIHRvIHNlbGVjdCBvbmUgKi8KLS8qIG9mIHRoZW0gdGhyb3VnaCAweDMxMCBhbmQgbW9kaWZ5IHRocm91Z2ggMHgzMTQgKi8KLS8qIG9wOiAwPWRpc2FibGUsIDE9ZW5hYmxlICovCi1zdGF0aWMgdm9pZCBmaWx0ZXJfZW5hYmxlX2h3X2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGlkLCB1OCBvcCkKLXsKLQlkcHJpbnRrKCIlczogaWQ9JWQgb3A9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIG9wKTsKLQlpZiAoaWQgPD0gNSkgewotCQl1MzIgbWFzayA9ICgweDAwMDAwMDAxIDw8IGlkKTsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCBtYXNrLCBvcCA/IG1hc2sgOiAwKTsKLQl9IGVsc2UgewotCQkvKiBzZWxlY3QgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzEwLCAweDFmLCAoaWQgLSA2KSAmIDB4MWYpOwotCQkvKiBtb2RpZnkgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzE0LCAweDAwMDA2MDAwLCBvcCA/IDB4MDAwMDQwMDAgOiAwKTsKLQl9Ci19Ci0KLS8qIHRoaXMgc2V0cyB0aGUgUElEIHRoYXQgc2hvdWxkIHBhc3MgdGhlIHNwZWNpZmllZCBmaWx0ZXIgKi8KLXN0YXRpYyB2b2lkIHBpZF9zZXRfaHdfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWQsIHUxNiBwaWQpCi17Ci0JZHByaW50aygiJXM6IGlkPSVkICBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIHBpZCk7Ci0JaWYgKGlkIDw9IDUpIHsKLQkJdTMyIGFkciA9IDB4MzAwICsgKChpZCAmIDYpIDw8IDEpOwotCQlpbnQgc2hpZnQgPSAoaWQgJiAxKSA/IDE2IDogMDsKLQkJZHByaW50aygiJXM6IGlkPSVkICBhZGRyPSV4ICVjICBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIGFkciwgKGlkICYgMSkgPyAnaCcgOiAnbCcsIHBpZCk7Ci0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCBhZHIsICgweDdmZmYpIDw8IHNoaWZ0LCAocGlkICYgMHgxZmZmKSA8PCBzaGlmdCk7Ci0JfSBlbHNlIHsKLQkJLyogc2VsZWN0ICovCi0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDMxMCwgMHgxZiwgKGlkIC0gNikgJiAweDFmKTsKLQkJLyogbW9kaWZ5ICovCi0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDMxNCwgMHgxZmZmLCBwaWQgJiAweDFmZmYpOwotCX0KLX0KLQotCi0vKgotc3RhdGljIHZvaWQgZmlsdGVyX2VuYWJsZV9udWxsX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIG9wKQotewotCWRwcmludGsoIiVzOiBvcD0leFxuIiwgX19GVU5DVElPTl9fLCBvcCk7Ci0KLQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDAwNDAsIG9wPzB4MDAwMDAwNDA6MCk7Ci19Ci0qLwotCi1zdGF0aWMgdm9pZCBmaWx0ZXJfZW5hYmxlX21hc2tfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JZHByaW50aygiJXM6IG9wPSV4XG4iLCBfX0ZVTkNUSU9OX18sIG9wKTsKLQotCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDIwOCwgMHgwMDAwMDA4MCwgb3AgPyAweDAwMDAwMDgwIDogMCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfbWFjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0Jd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA0MDAwLCBvcCA/IDB4MDAwMDQwMDAgOiAwKTsKLX0KLQotc3RhdGljIGludCBjYV9zZXRfbWFjX2RzdF9hZGRyX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKLXsKLQl1MzIgdG1wMSwgdG1wMjsKLQotCXRtcDEgPSAobWFjWzNdIDw8IDB4MTgpIHwgKG1hY1syXSA8PCAweDEwKSB8IChtYWNbMV0gPDwgMHgwOCkgfCBtYWNbMF07Ci0JdG1wMiA9IChtYWNbNV0gPDwgMHgwOCkgfCBtYWNbNF07Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg0MTgsIHRtcDEpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDQxYywgdG1wMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLXN0YXRpYyB2b2lkIHNldF9pZ25vcmVfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggb3ApCi17Ci0JaWYgKG9wICE9IDApIHsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA0MDAwLCAwKTsKLQkJYWRhcHRlci0+bWFjX2ZpbHRlciA9IDE7Ci0JfSBlbHNlIHsKLQkJaWYgKGFkYXB0ZXItPm1hY19maWx0ZXIgIT0gMCkgewotCQkJYWRhcHRlci0+bWFjX2ZpbHRlciA9IDA7Ci0JCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDQwMDAsIDB4MDAwMDQwMDApOwotCQl9Ci0JfQotfQotKi8KLQotLyoKLXN0YXRpYyB2b2lkIGNoZWNrX251bGxfZmlsdGVyX2VuYWJsZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlmaWx0ZXJfZW5hYmxlX251bGxfZmlsdGVyKGFkYXB0ZXIsIDEpOwotCWZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoYWRhcHRlciwgMSk7Ci19Ci0qLwotCi1zdGF0aWMgdm9pZCBwaWRfc2V0X2dyb3VwX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQl1MzIgdmFsdWU7Ci0KLQlkcHJpbnRrKCIlczogcGlkPSV4XG4iLCBfX0ZVTkNUSU9OX18sIHBpZCk7Ci0JdmFsdWUgPSAocGlkICYgMHgzZmZmKSB8IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgJiAweGZmZmYwMDAwKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgzMGMsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgcGlkX3NldF9ncm91cF9tYXNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCXUzMiB2YWx1ZTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JXhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl2YWx1ZSA9ICgocGlkICYgMHgzZmZmKSA8PCAweDEwKSB8IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgJiAweGZmZmYpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDMwYywgdmFsdWUpOwotfQotCi0vKgotc3RhdGljIGludCBwaWRfZ2V0X2dyb3VwX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgzMGMpICYgMHgwMDAwMWZmZjsKLX0KLQotc3RhdGljIGludCBwaWRfZ2V0X2dyb3VwX21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgPj4gMHgxMCkmIDB4MDAwMDFmZmY7Ci19Ci0qLwotCi0vKgotc3RhdGljIHZvaWQgcmVzZXRfaGFyZHdhcmVfcGlkX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlwaWRfc2V0X3N0cmVhbTFfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0KLQlwaWRfc2V0X3N0cmVhbTJfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9zdHJlYW0yX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfcGNyX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfcGNyX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfcG10X3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfcG10X2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfZWNtX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfZWNtX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfZW1tX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfZW1tX2ZpbHRlcihhZGFwdGVyLCAwKTsKLX0KLSovCi0KLXN0YXRpYyB2b2lkIGluaXRfcGlkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgaTsKLQotCWFkYXB0ZXItPnBpZF9jb3VudCA9IDA7Ci0JYWRhcHRlci0+d2hvbGVfYmFuZHdpZHRoX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzOyBpKyspIHsKLQkJZHByaW50aygiJXM6IHNldHRpbmcgZmlsdGVyICVkIHRvIDB4MWZmZlxuIiwgX19GVU5DVElPTl9fLCBpKTsKLQkJYWRhcHRlci0+aHdfcGlkc1tpXSA9IDB4MWZmZjsKLQkJcGlkX3NldF9od19waWQoYWRhcHRlciwgaSwgMHgxZmZmKTsKLX0KLQotCXBpZF9zZXRfZ3JvdXBfcGlkKGFkYXB0ZXIsIDApOwotCXBpZF9zZXRfZ3JvdXBfbWFzayhhZGFwdGVyLCAweDFmZTApOwotfQotCi1zdGF0aWMgdm9pZCBvcGVuX3dob2xlX2JhbmR3aWR0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcGlkX3NldF9ncm91cF9waWQoYWRhcHRlciwgMCk7Ci0JcGlkX3NldF9ncm91cF9tYXNrKGFkYXB0ZXIsIDApOwotLyoKLQlmaWx0ZXJfZW5hYmxlX21hc2tfZmlsdGVyKGFkYXB0ZXIsIDEpOwotKi8KLX0KLQotc3RhdGljIHZvaWQgY2xvc2Vfd2hvbGVfYmFuZHdpZHRoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLQlwaWRfc2V0X2dyb3VwX3BpZChhZGFwdGVyLCAwKTsKLQlwaWRfc2V0X2dyb3VwX21hc2soYWRhcHRlciwgMHgxZmUwKTsKLS8qCi0JZmlsdGVyX2VuYWJsZV9tYXNrX2ZpbHRlcihhZGFwdGVyLCAxKTsKLSovCi19Ci0KLXN0YXRpYyB2b2lkIHdob2xlX2JhbmR3aWR0aF9pbmMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPndob2xlX2JhbmR3aWR0aF9jb3VudCsrID09IDApCi0JCW9wZW5fd2hvbGVfYmFuZHdpZHRoKGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCB3aG9sZV9iYW5kd2lkdGhfZGVjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWlmICgtLWFkYXB0ZXItPndob2xlX2JhbmR3aWR0aF9jb3VudCA8PSAwKQotCQljbG9zZV93aG9sZV9iYW5kd2lkdGgoYWRhcHRlcik7Ci19Ci0KLS8qIFRoZSBzcGVjaWZpZWQgUElEIGhhcyB0byBiZSBsZXQgdGhyb3VnaCB0aGUKLSAgIGh3IGZpbHRlcnMuCi0gICBXZSB0cnkgdG8gYWxsb2NhdGUgYW4gaGFyZHdhcmUgZmlsdGVyIGFuZCBvcGVuIHdob2xlCi0gICBiYW5kd2lkdGggd2hlbiBhbGxvY2F0aW9uIGlzIGltcG9zc2libGUuCi0gICBBbGwgcGlkczw9MHgxZiBwYXNzIHRocm91Z2ggdGhlIGdyb3VwIGZpbHRlci4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotc3RhdGljIGludCBhZGRfaHdfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA8PSAweDFmKQotCQlyZXR1cm4gMTsKLQotCS8qIHdlIGNhbid0IHVzZSBhIGZpbHRlciBmb3IgMHgyMDAwLCBzbyBubyBzZWFyY2ggKi8KLQlpZiAocGlkICE9IDB4MjAwMCkgewotCQkvKiBmaW5kIGFuIHVudXNlZCBoYXJkd2FyZSBmaWx0ZXIgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVyczsgaSsrKSB7Ci0JCQlkcHJpbnRrKCIlczogcGlkPSVkIHNlYXJjaGluZyBzbG90PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCwgaSk7Ci0JCQlpZiAoYWRhcHRlci0+aHdfcGlkc1tpXSA9PSAweDFmZmYpIHsKLQkJCQlkcHJpbnRrKCIlczogcGlkPSVkIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCQlhZGFwdGVyLT5od19waWRzW2ldID0gcGlkOwotCQkJCXBpZF9zZXRfaHdfcGlkKGFkYXB0ZXIsIGksIHBpZCk7Ci0JCQkJZmlsdGVyX2VuYWJsZV9od19maWx0ZXIoYWRhcHRlciwgaSwgMSk7Ci0JCXJldHVybiAxOwotCX0KLQl9Ci0JfQotCS8qIGlmIHdlIGhhdmUgbm90IHVzZWQgYSBmaWx0ZXIsIHRoaXMgcGlkIGRlcGVuZHMgb24gd2hvbGUgYmFuZHdpZHRoICovCi0JZHByaW50aygiJXM6IHBpZD0lZCB3aG9sZV9iYW5kd2lkdGhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl3aG9sZV9iYW5kd2lkdGhfaW5jKGFkYXB0ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLS8qIHJldHVybnMgLTEgaWYgdGhlIHBpZCB3YXMgbm90IHByZXNlbnQgaW4gdGhlIGZpbHRlcnMgKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX2h3X3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQlpbnQgaTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQotCWlmIChwaWQgPD0gMHgxZikKLQkJcmV0dXJuIDE7Ci0KLQkvKiB3ZSBjYW4ndCB1c2UgYSBmaWx0ZXIgZm9yIDB4MjAwMCwgc28gbm8gc2VhcmNoICovCi0JaWYgKHBpZCAhPSAweDIwMDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVyczsgaSsrKSB7Ci0JCQlkcHJpbnRrKCIlczogcGlkPSVkIHNlYXJjaGluZyBzbG90PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCwgaSk7Ci0JCQlpZiAoYWRhcHRlci0+aHdfcGlkc1tpXSA9PSBwaWQpIHsJLy8gZmluZCB0aGUgcGlkIHNsb3QKLQkJCQlkcHJpbnRrKCIlczogcGlkPSVkIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCQlhZGFwdGVyLT5od19waWRzW2ldID0gMHgxZmZmOwotCQkJCXBpZF9zZXRfaHdfcGlkKGFkYXB0ZXIsIGksIDB4MWZmZik7Ci0JCQkJZmlsdGVyX2VuYWJsZV9od19maWx0ZXIoYWRhcHRlciwgaSwgMCk7Ci0JCXJldHVybiAxOwotCX0KLQl9Ci0JfQotCS8qIGlmIHdlIGhhdmUgbm90IHVzZWQgYSBmaWx0ZXIsIHRoaXMgcGlkIGRlcGVuZGVkIG9uIHdob2xlIGJhbmR3aXRoICovCi0JZHByaW50aygiJXM6IHBpZD0lZCB3aG9sZV9iYW5kd2lkdGhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl3aG9sZV9iYW5kd2lkdGhfZGVjKGFkYXB0ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLS8qIEFkZHMgYSBQSUQgdG8gdGhlIGZpbHRlcnMuCi0gICBBZGRpbmcgYSBwaWQgbW9yZSB0aGFuIG9uY2UgaXMgcG9zc2libGUsIHdlIGtlZXAgcmVmZXJlbmNlIGNvdW50cy4KLSAgIFdob2xlIHN0cmVhbSBhdmFpbGFibGUgdGhyb3VnaCBwaWQ9PTB4MjAwMC4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotc3RhdGljIGludCBhZGRfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA+IDB4MWZmZSAmJiBwaWQgIT0gMHgyMDAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvLyBjaGVjayBpZiB0aGUgcGlkIGlzIGFscmVhZHkgcHJlc2VudAotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5waWRfY291bnQ7IGkrKykKLQkJaWYgKGFkYXB0ZXItPnBpZF9saXN0W2ldID09IHBpZCkgewotCQkJYWRhcHRlci0+cGlkX3JjW2ldKys7CS8vIGluY3JlbWVudCByZWYgY291bnRlcgotCQlyZXR1cm4gMTsKLQkJfQotCi0JaWYgKGFkYXB0ZXItPnBpZF9jb3VudCA9PSBOX1BJRF9TTE9UUykKLQkJcmV0dXJuIC0xOwkvLyBubyBtb3JlIHBpZHMgY2FuIGJlIGFkZGVkCi0JYWRhcHRlci0+cGlkX2xpc3RbYWRhcHRlci0+cGlkX2NvdW50XSA9IHBpZDsJLy8gcmVnaXN0ZXIgcGlkCi0JYWRhcHRlci0+cGlkX3JjW2FkYXB0ZXItPnBpZF9jb3VudF0gPSAxOwotCWFkYXB0ZXItPnBpZF9jb3VudCsrOwotCS8vIGhhcmR3YXJlIHNldHRpbmcKLQlhZGRfaHdfcGlkKGFkYXB0ZXIsIHBpZCk7Ci0KLQkJCXJldHVybiAxOwotCQl9Ci0KLS8qIFJlbW92ZXMgYSBQSUQgZnJvbSB0aGUgZmlsdGVycy4gKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQlpbnQgaTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQotCWlmIChwaWQgPiAweDFmZmUgJiYgcGlkICE9IDB4MjAwMCkKLQkJcmV0dXJuIC0xOwotCi0JLy8gY2hlY2sgaWYgdGhlIHBpZCBpcyBwcmVzZW50IChpdCBtdXN0IGJlISkKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cGlkX2NvdW50OyBpKyspIHsKLQkJaWYgKGFkYXB0ZXItPnBpZF9saXN0W2ldID09IHBpZCkgewotCQkJYWRhcHRlci0+cGlkX3JjW2ldLS07Ci0JCQlpZiAoYWRhcHRlci0+cGlkX3JjW2ldIDw9IDApIHsKLQkJCQkvLyByZW1vdmUgZnJvbSB0aGUgbGlzdAotCQkJCWFkYXB0ZXItPnBpZF9jb3VudC0tOwotCQkJCWFkYXB0ZXItPnBpZF9saXN0W2ldPWFkYXB0ZXItPnBpZF9saXN0W2FkYXB0ZXItPnBpZF9jb3VudF07Ci0JCQkJYWRhcHRlci0+cGlkX3JjW2ldID0gYWRhcHRlci0+cGlkX3JjW2FkYXB0ZXItPnBpZF9jb3VudF07Ci0JCQkJLy8gaGFyZHdhcmUgc2V0dGluZwotCQkJCXJlbW92ZV9od19waWQoYWRhcHRlciwgcGlkKTsKLQkJCX0KLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi0KLS8qIGRtYSAmIGlycSAqLwotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfc21jKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0Jd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDAwODAwLCBvcCA/IDB4MDAwMDA4MDAgOiAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2VuYWJsZV9kaXNhYmxlX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGZsYWcxLCB1MzIgZmxhZzIsIHUzMiBmbGFnMykKLXsKLQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsICYgMHgwMDBmMDAwMDsKLQotCWlmIChmbGFnMSA9PSAwKSB7Ci0JCWlmIChmbGFnMiA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDEwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDAxMDAwMDsKLQotCQlpZiAoZmxhZzMgPT0gMCkKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgJiB+MHgwMDAyMDAwMDsKLQkJZWxzZQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCB8IDB4MDAwMjAwMDA7Ci0KLQl9IGVsc2UgewotCi0JCWlmIChmbGFnMiA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDQwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDA0MDAwMDsKLQotCQlpZiAoZmxhZzMgPT0gMCkKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgJiB+MHgwMDA4MDAwMDsKLQkJZWxzZQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCB8IDB4MDAwODAwMDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIG9wKQotewotCXUzMiB2YWx1ZTsKLQotCXZhbHVlID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDgpICYgMHhmZmYwZmZmZjsKLQotCWlmIChvcCAhPSAwKQotCQl2YWx1ZSA9IHZhbHVlIHwgKGFkYXB0ZXItPmRtYV9jdHJsICYgMHgwMDBmMDAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHZhbHVlKTsKLX0KLQotLyogRmxleENvcElJIGhhcyAyIGRtYSBjaGFubmVscy4gRE1BMSBpcyB1c2VkIHRvIHRyYW5zZmVyIFRTIGRhdGEgdG8KLSAgIHN5c3RlbSBtZW1vcnkuCi0KLSAgIFRoZSBETUExIGJ1ZmZlciBpcyBkaXZpZGVkIGluIDIgc3ViYnVmZmVycyBvZiBlcXVhbCBzaXplLgotICAgRmxleENvcElJIHdpbGwgdHJhbnNmZXIgVFMgZGF0YSB0byBvbmUgc3ViYnVmZmVyLCBzaWduYWwgYW4gaW50ZXJydXB0Ci0gICB3aGVuIHRoZSBzdWJidWZmZXIgaXMgZnVsbCBhbmQgY29udGludWUgZmlsbGlnIHRoZSBzZWNvbmQgc3ViYnVmZmVyLgotCi0gICBGb3IgRE1BMToKLSAgICAgICBzdWJidWZmZXIgc2l6ZSBpbiAzMi1iaXQgd29yZHMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCAyNCBiaXRzIG9mCi0gICAgICAgcmVnaXN0ZXIgMHgwMDQuIFRoZSBsYXN0IDggYml0cyBvZiByZWdpc3RlciAweDAwNCBjb250YWluIHRoZSBudW1iZXIKLSAgICAgICBvZiBzdWJidWZmZXJzLgotICAgICAgIAotICAgICAgIHRoZSBmaXJzdCAzMCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDAwIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0Ci0gICAgICAgc3ViYnVmZmVyLiBUaGUgbGFzdCAyIGJpdHMgY29udGFpbiAwLCB3aGVuIGRtYTEgaXMgZGlzYWJsZWQgYW5kIDEsCi0gICAgICAgd2hlbiBkbWExIGlzIGVuYWJsZWQuCi0KLSAgICAgICB0aGUgZmlyc3QgMzAgYml0cyBvZiByZWdpc3RlciAweDAwYyBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWNvbmQKLSAgICAgICBzdWJidWZmZXIuIHRoZSBsYXN0IDIgYml0cyBjb250YWluIDEuCi0KLSAgICAgICByZWdpc3RlciAweDAwOCB3aWxsIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN1YmJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQKLSAgICAgICB3aXRoIFRTIGRhdGEsIHdoZW4gRmxleENvcElJIHdpbGwgZ2VuZXJhdGUgYW4gaW50ZXJydXB0LgotCi0gICBGb3IgRE1BMjoKLSAgICAgICBzdWJidWZmZXIgc2l6ZSBpbiAzMi1iaXQgd29yZHMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCAyNCBiaXRzIG9mCi0gICAgICAgcmVnaXN0ZXIgMHgwMTQuIFRoZSBsYXN0IDggYml0cyBvZiByZWdpc3RlciAweDAxNCBjb250YWluIHRoZSBudW1iZXIKLSAgICAgICBvZiBzdWJidWZmZXJzLgotICAgICAgIAotICAgICAgIHRoZSBmaXJzdCAzMCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDEwIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0Ci0gICAgICAgc3ViYnVmZmVyLiAgVGhlIGxhc3QgMiBiaXRzIGNvbnRhaW4gMCwgd2hlbiBkbWExIGlzIGRpc2FibGVkIGFuZCAxLAotICAgICAgIHdoZW4gZG1hMSBpcyBlbmFibGVkLgotCi0gICAgICAgdGhlIGZpcnN0IDMwIGJpdHMgb2YgcmVnaXN0ZXIgMHgwMWMgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgc2Vjb25kCi0gICAgICAgc3ViYnVmZmVyLiB0aGUgbGFzdCAyIGJpdHMgY29udGFpbiAxLgotCi0gICAgICAgcmVnaXN0ZXIgMHgwMTggY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN1YmJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQKLSAgICAgICB3aXRoIFRTIGRhdGEsIHdoZW4gRmxleENvcElJIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuCi0qLwotc3RhdGljIGludCBkbWFfaW5pdF9kbWEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkbWFfY2hhbm5lbCkKLXsKLQl1MzIgc3ViYnVmZmVycywgc3ViYnVmc2l6ZSwgc3ViYnVmMCwgc3ViYnVmMTsKLQotCWlmIChkbWFfY2hhbm5lbCA9PSAwKSB7Ci0JCWRwcmludGsoIiVzOiBJbml0aWFsaXppbmcgRE1BMSBjaGFubmVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXN1YmJ1ZmZlcnMgPSAyOwotCi0JCXN1YmJ1ZnNpemUgPSAoKChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpIC8gNCkgPDwgOCkgfCBzdWJidWZmZXJzOwotCi0JCXN1YmJ1ZjAgPSBhZGFwdGVyLT5kbWFxMS5idXNfYWRkciAmIDB4ZmZmZmZmZmM7Ci0KLQkJc3ViYnVmMSA9ICgoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpICYgMHhmZmZmZmZmYykgfCAxOwotCi0JCWRwcmludGsoIiVzOiBmaXJzdCBzdWJidWZmZXIgYWRkcmVzcyA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgc3ViYnVmMCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDAwLCBzdWJidWYwKTsKLQotCQlkcHJpbnRrKCIlczogc3ViYnVmZmVyIHNpemUgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIChzdWJidWZzaXplID4+IDgpICogNCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDA0LCBzdWJidWZzaXplKTsKLQotCQlkcHJpbnRrKCIlczogc2Vjb25kIHN1YmJ1ZmZlciBhZGRyZXNzID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBzdWJidWYxKTsKLQkJdWRlbGF5KDEwMDApOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMGMsIHN1YmJ1ZjEpOwotCi0JCWRwcmludGsoIiVzOiBjb3VudGVyID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kbWFxMS5idXNfYWRkciAmIDB4ZmZmZmZmZmMpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDgsIGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICYgMHhmZmZmZmZmYyk7Ci0JCXVkZWxheSgxMDAwKTsKLQotCQlkbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDAsIDEsIHN1YmJ1ZmZlcnMgPyAxIDogMCk7Ci0KLQkJaXJxX2RtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMSk7Ci0KLQkJc3JhbV9zZXRfbWVkaWFfZGVzdChhZGFwdGVyLCAxKTsKLQkJc3JhbV9zZXRfbmV0X2Rlc3QoYWRhcHRlciwgMSk7Ci0JCXNyYW1fc2V0X2NhaV9kZXN0KGFkYXB0ZXIsIDIpOwotCQlzcmFtX3NldF9jYW9fZGVzdChhZGFwdGVyLCAyKTsKLQl9Ci0KLQlpZiAoZG1hX2NoYW5uZWwgPT0gMSkgewotCQlkcHJpbnRrKCIlczogSW5pdGlhbGl6aW5nIERNQTIgY2hhbm5lbFxuIiwgX19GVU5DVElPTl9fKTsKLQotCQlzdWJidWZmZXJzID0gMjsKLQotCQlzdWJidWZzaXplID0gKCgoYWRhcHRlci0+ZG1hcTIuYnVmZmVyX3NpemUgLyAyKSAvIDQpIDw8IDgpIHwgc3ViYnVmZmVyczsKLQotCQlzdWJidWYwID0gYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgJiAweGZmZmZmZmZjOwotCi0JCXN1YmJ1ZjEgPSAoKGFkYXB0ZXItPmRtYXEyLmJ1c19hZGRyICsgYWRhcHRlci0+ZG1hcTIuYnVmZmVyX3NpemUgLyAyKSAmIDB4ZmZmZmZmZmMpIHwgMTsKLQotCQlkcHJpbnRrKCIlczogZmlyc3Qgc3ViYnVmZmVyIGFkZHJlc3MgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIHN1YmJ1ZjApOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgc3ViYnVmMCk7Ci0KLQkJZHByaW50aygiJXM6IHN1YmJ1ZmZlciBzaXplID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCAoc3ViYnVmc2l6ZSA+PiA4KSAqIDQpOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxNCwgc3ViYnVmc2l6ZSk7Ci0KLQkJZHByaW50aygiJXM6IHNlY29uZCBidWZmZXIgYWRkcmVzcyA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgc3ViYnVmMSk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDFjLCBzdWJidWYxKTsKLQotCQlzcmFtX3NldF9jYWlfZGVzdChhZGFwdGVyLCAyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JaWYgKG9wID09IDApIHsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA4MDAwLCAwKTsKLQkJYWRhcHRlci0+ZG1hX3N0YXR1cyA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgJiB+MHgwMDAwMDAwNDsKLQl9IGVsc2UgewotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDApOwotCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyB8IDB4MDAwMDAwMDQ7Ci0JfQotfQotCi0vKiBiaXQgMCBvZiBkbWFfbWFzayBpcyBzZXQgdG8gMSBpZiBkbWExIGNoYW5uZWwgaGFzIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQKLSAgIGJpdCAxIG9mIGRtYV9tYXNrIGlzIHNldCB0byAxIGlmIGRtYTIgY2hhbm5lbCBoYXMgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZAotKi8KLXN0YXRpYyB2b2lkIGRtYV9zdGFydF9zdG9wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZG1hX21hc2ssIGludCBzdGFydF9zdG9wKQotewotCXUzMiBkbWFfZW5hYmxlLCBkbWExX2VuYWJsZSwgZG1hMl9lbmFibGU7Ci0KLQlkcHJpbnRrKCIlczogZG1hX21hc2s9JXhcbiIsIF9fRlVOQ1RJT05fXywgZG1hX21hc2spOwotCi0JaWYgKHN0YXJ0X3N0b3AgPT0gMSkgewotCQlkcHJpbnRrKCIlczogc3RhcnRpbmcgZG1hXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCWRtYTFfZW5hYmxlID0gMDsKLQkJZG1hMl9lbmFibGUgPSAwOwotCi0JCWlmICgoKGRtYV9tYXNrICYgMSkgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMSkgPT0gMCkgJiYgKGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICE9IDApKSB7Ci0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyB8IDE7Ci0JCQlkbWExX2VuYWJsZSA9IDE7Ci0JCX0KLQotCQlpZiAoKChkbWFfbWFzayAmIDIpICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDIpID09IDApICYmIChhZGFwdGVyLT5kbWFxMi5idXNfYWRkciAhPSAwKSkgewotCQkJYWRhcHRlci0+ZG1hX3N0YXR1cyA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgfCAyOwotCQkJZG1hMl9lbmFibGUgPSAxOwotCQl9Ci0JCS8vIGVuYWJsZSBkbWExIGFuZCBkbWEyCi0JCWlmICgoZG1hMV9lbmFibGUgPT0gMSkgJiYgKGRtYTJfZW5hYmxlID09IDEpKSB7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDAsIGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyIHwgMSk7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMGMsIChhZGFwdGVyLT5kbWFxMS5idXNfYWRkciArIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC8gMikgfCAxKTsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgfCAxKTsKLQotCQkJY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDEpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZW5hYmxlIGRtYTEKLQkJaWYgKChkbWExX2VuYWJsZSA9PSAxKSAmJiAoZG1hMl9lbmFibGUgPT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwMCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgfCAxKTsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwYywgKGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICsgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLyAyKSB8IDEpOwotCi0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBlbmFibGUgZG1hMgotCQlpZiAoKGRtYTFfZW5hYmxlID09IDApICYmIChkbWEyX2VuYWJsZSA9PSAxKSkgewotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDEwLCBhZGFwdGVyLT5kbWFxMi5idXNfYWRkciB8IDEpOwotCi0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBzdGFydCBkbWEKLQkJaWYgKChkbWExX2VuYWJsZSA9PSAwKSAmJiAoZG1hMl9lbmFibGUgPT0gMCkpIHsKLQkJCWN0cmxfZW5hYmxlX3JlY2VpdmVfZGF0YShhZGFwdGVyLCAxKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQl9IGVsc2UgewotCi0JCWRwcmludGsoIiVzOiBzdG9wcGluZyBkbWFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJZG1hX2VuYWJsZSA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDAwMDAwMDAzOwotCi0JCWlmICgoKGRtYV9tYXNrICYgMSkgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMSkgIT0gMCkpIHsKLQkJCWRtYV9lbmFibGUgPSBkbWFfZW5hYmxlICYgMHhmZmZmZmZmZTsKLQkJfQotCi0JCWlmICgoKGRtYV9tYXNrICYgMikgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMikgIT0gMCkpIHsKLQkJCWRtYV9lbmFibGUgPSBkbWFfZW5hYmxlICYgMHhmZmZmZmZmZDsKLQkJfQotCQkvL3N0b3AgZG1hCi0JCWlmICgoZG1hX2VuYWJsZSA9PSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiA0KSAhPSAwKSkgewotCQkJY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDApOwotCi0JCQl1ZGVsYXkoMzAwMCk7Ci0JCX0KLQkJLy9kaXNhYmxlIGRtYTEKLQkJaWYgKCgoZG1hX21hc2sgJiAxKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSAhPSAwKSAmJiAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgIT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwMCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIpOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDBjLCAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpIHwgMSk7Ci0KLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgPSBhZGFwdGVyLT5kbWFfc3RhdHVzICYgfjB4MDAwMDAwMDE7Ci0JCX0KLQkJLy9kaXNhYmxlIGRtYTIKLQkJaWYgKCgoZG1hX21hc2sgJiAyKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSAhPSAwKSAmJiAoYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgIT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIpOwotCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyAmIH4weDAwMDAwMDAyOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvcGVuX3N0cmVhbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQl1MzIgZG1hX21hc2s7Ci0KLQkrK2FkYXB0ZXItPmNhcHR1cmluZzsKLQotCWZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoYWRhcHRlciwgMSk7Ci0KLQlhZGRfcGlkKGFkYXB0ZXIsIHBpZCk7Ci0KLQlkcHJpbnRrKCIlczogYWRhcHRlci0+ZG1hX3N0YXR1cz0leFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kbWFfc3RhdHVzKTsKLQotCWlmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDcpICE9IDcpIHsKLQkJZG1hX21hc2sgPSAwOwotCi0JCWlmICgoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDEwMDAwMDAwKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSA9PSAwKSkgewotCQkJZG1hX21hc2sgPSBkbWFfbWFzayB8IDE7Ci0KLQkJCWFkYXB0ZXItPmRtYXExLmhlYWQgPSAwOwotCQkJYWRhcHRlci0+ZG1hcTEudGFpbCA9IDA7Ci0KLQkJCW1lbXNldChhZGFwdGVyLT5kbWFxMS5idWZmZXIsIDAsIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplKTsKLQkJfQotCi0JCWlmICgoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDIwMDAwMDAwKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSA9PSAwKSkgewotCQkJZG1hX21hc2sgPSBkbWFfbWFzayB8IDI7Ci0KLQkJCWFkYXB0ZXItPmRtYXEyLmhlYWQgPSAwOwotCQkJYWRhcHRlci0+ZG1hcTIudGFpbCA9IDA7Ci0JCX0KLQotCQlpZiAoZG1hX21hc2sgIT0gMCkgewotCQkJaXJxX2RtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMSk7Ci0KLQkJCWRtYV9zdGFydF9zdG9wKGFkYXB0ZXIsIGRtYV9tYXNrLCAxKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWlmIChhZGFwdGVyLT5jYXB0dXJpbmcgPiAwKQotCQktLWFkYXB0ZXItPmNhcHR1cmluZzsKLQotCWRwcmludGsoIiVzOiBkbWFfc3RhdHVzPSV4XG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmRtYV9zdGF0dXMpOwotCi0JaWYgKGFkYXB0ZXItPmNhcHR1cmluZyA9PSAwKSB7Ci0JCXUzMiBkbWFfbWFzayA9IDA7Ci0KLQlpZiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSAhPSAwKQotCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMHgwMDAwMDAwMTsKLQlpZiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSAhPSAwKQotCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMHgwMDAwMDAwMjsKLQotCWlmIChkbWFfbWFzayAhPSAwKSB7Ci0JCQlkbWFfc3RhcnRfc3RvcChhZGFwdGVyLCBkbWFfbWFzaywgMCk7Ci0JfQotCX0KLQlyZW1vdmVfcGlkKGFkYXB0ZXIsIHBpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVycnVwdF9zZXJ2aWNlX2RtYTEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gJmFkYXB0ZXItPmRlbXV4OwotCi0JaW50IG5fY3VyX2RtYV9jb3VudGVyOwotCXUzMiBuX251bV9ieXRlc19wYXJzZWQ7Ci0JdTMyIG5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZDsKLQl1MzIgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZSA9IDE4ODsKLQl1OCBnYl90bXBfYnVmZmVyWzE4OF07Ci0JdTggKnBiX2RtYV9idWZfY3VyX3BvczsKLQotCW5fY3VyX2RtYV9jb3VudGVyID0gcmVhZGwoYWRhcHRlci0+aW9fbWVtICsgMHgwMDgpIC0gYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHI7Ci0Jbl9jdXJfZG1hX2NvdW50ZXIgPSAobl9jdXJfZG1hX2NvdW50ZXIgLyBkd19kZWZhdWx0X3BhY2tldF9zaXplKSAqIGR3X2RlZmF1bHRfcGFja2V0X3NpemU7Ci0KLQlpZiAoKG5fY3VyX2RtYV9jb3VudGVyIDwgMCkgfHwgKG5fY3VyX2RtYV9jb3VudGVyID4gYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUpKSB7Ci0JCWRwcmludGsoIiVzOiBkbWEgY291bnRlciBvdXRzaWRlIGRtYSBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhZGFwdGVyLT5kbWFxMS5oZWFkID0gbl9jdXJfZG1hX2NvdW50ZXI7Ci0KLQlpZiAoYWRhcHRlci0+ZG1hcTEudGFpbCA8PSBuX2N1cl9kbWFfY291bnRlcikgewotCQluX251bV9uZXdfYnl0ZXNfdHJhbnNmZXJyZWQgPSBuX2N1cl9kbWFfY291bnRlciAtIGFkYXB0ZXItPmRtYXExLnRhaWw7Ci0KLQl9IGVsc2UgewotCi0JCW5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCA9IChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpICsgbl9jdXJfZG1hX2NvdW50ZXI7Ci0JfQotCi0JZGRwcmludGsoIiVzOiBuX2N1cl9kbWFfY291bnRlciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5fY3VyX2RtYV9jb3VudGVyKTsKLQlkZHByaW50aygiJXM6IGRtYXExLnRhaWwgICAgICAgID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZG1hcTEudGFpbCk7Ci0JZGRwcmludGsoIiVzOiBieXRlc190cmFuc2ZlcnJlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCk7Ci0KLQlpZiAobl9udW1fbmV3X2J5dGVzX3RyYW5zZmVycmVkIDwgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZSkKLQkJcmV0dXJuOwotCi0Jbl9udW1fYnl0ZXNfcGFyc2VkID0gMDsKLQotCXdoaWxlIChuX251bV9ieXRlc19wYXJzZWQgPCBuX251bV9uZXdfYnl0ZXNfdHJhbnNmZXJyZWQpIHsKLQkJcGJfZG1hX2J1Zl9jdXJfcG9zID0gYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEudGFpbDsKLQotCQlpZiAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgPCBhZGFwdGVyLT5kbWFxMS5idWZmZXIgKyBhZGFwdGVyLT5kbWFxMS50YWlsICsgMTg4KSB7Ci0JCQltZW1jcHkoZ2JfdG1wX2J1ZmZlciwgYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEudGFpbCwKLQkJCSAgICAgICBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpOwotCQkJbWVtY3B5KGdiX3RtcF9idWZmZXIgKyAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLSBhZGFwdGVyLT5kbWFxMS50YWlsKSwgYWRhcHRlci0+ZG1hcTEuYnVmZmVyLAotCQkJICAgICAgICgxODggLSAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLSBhZGFwdGVyLT5kbWFxMS50YWlsKSkpOwotCi0JCQlwYl9kbWFfYnVmX2N1cl9wb3MgPSBnYl90bXBfYnVmZmVyOwotCQl9Ci0KLQkJaWYgKGFkYXB0ZXItPmNhcHR1cmluZyAhPSAwKSB7Ci0JCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoZHZiZG14LCBwYl9kbWFfYnVmX2N1cl9wb3MsIGR3X2RlZmF1bHRfcGFja2V0X3NpemUgLyAxODgpOwotCQl9Ci0KLQkJbl9udW1fYnl0ZXNfcGFyc2VkID0gbl9udW1fYnl0ZXNfcGFyc2VkICsgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZTsKLQotCQlhZGFwdGVyLT5kbWFxMS50YWlsID0gYWRhcHRlci0+ZG1hcTEudGFpbCArIGR3X2RlZmF1bHRfcGFja2V0X3NpemU7Ci0KLQkJaWYgKGFkYXB0ZXItPmRtYXExLnRhaWwgPj0gYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUpCi0JCQlhZGFwdGVyLT5kbWFxMS50YWlsID0gYWRhcHRlci0+ZG1hcTEudGFpbCAtIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplOwotCX07Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVycnVwdF9zZXJ2aWNlX2RtYTIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqdG1wID0gZGV2X2lkOwotCi0JdTMyIHZhbHVlOwotCi0JZGRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLQotCXNwaW5fbG9ja19pcnEoJnRtcC0+bG9jayk7Ci0KLQlpZiAoMCA9PSAoKHZhbHVlID0gcmVhZF9yZWdfZHcodG1wLCAweDIwYykpICYgMHgwZikpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0bXAtPmxvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCQotCXdoaWxlICh2YWx1ZSAhPSAwKSB7Ci0JCWlmICgodmFsdWUgJiAweDAzKSAhPSAwKQotCQkJaW50ZXJydXB0X3NlcnZpY2VfZG1hMSh0bXApOwotCQlpZiAoKHZhbHVlICYgMHgwYykgIT0gMCkKLQkJCWludGVycnVwdF9zZXJ2aWNlX2RtYTIodG1wKTsKLQkJdmFsdWUgPSByZWFkX3JlZ19kdyh0bXAsIDB4MjBjKSAmIDB4MGY7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxKCZ0bXAtPmxvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBpbml0X2RtYV9xdWV1ZV9vbmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBkbWFxICpkbWFxLAotCQkJICAgICAgaW50IHNpemUsIGludCBkbWFxX29mZnNldCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQotCWRtYXEtPmhlYWQgPSAwOwotCWRtYXEtPnRhaWwgPSAwOwotCi0JZG1hcS0+YnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSArIDB4ODAsICZkbWFfYWRkcik7Ci0JaWYgKCFkbWFxLT5idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG1hcS0+YnVzX2FkZHIgPSBkbWFfYWRkcjsKLQlkbWFxLT5idWZmZXJfc2l6ZSA9IHNpemU7Ci0KLQlkbWFfaW5pdF9kbWEoYWRhcHRlciwgZG1hcV9vZmZzZXQpOwotCi0JZGRwcmludGsoIiVzOiBhbGxvY2F0ZWQgZG1hIGJ1ZmZlciBhdCAweCVwLCBsZW5ndGg9JWRcbiIsCi0JCSBfX0ZVTkNUSU9OX18sIGRtYXEtPmJ1ZmZlciwgc2l6ZSk7Ci0KLQlyZXR1cm4gMDsKLQl9Ci0KLXN0YXRpYyBpbnQgaW5pdF9kbWFfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGRtYXEgKmRtYXE7Ci0JCXUzMiBkbWFfc3RhdHVzOwotCQlpbnQgc2l6ZTsKLQl9IGRtYXFfZGVzY1tdID0gewotCQl7ICZhZGFwdGVyLT5kbWFxMSwgMHgxMDAwMDAwMCwgU0laRV9PRl9CVUZfRE1BMSB9LAotCQl7ICZhZGFwdGVyLT5kbWFxMiwgMHgyMDAwMDAwMCwgU0laRV9PRl9CVUZfRE1BMiB9Ci0JfSwgKnAgPSBkbWFxX2Rlc2M7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCBwKyspIHsKLQkJaWYgKGluaXRfZG1hX3F1ZXVlX29uZShhZGFwdGVyLCBwLT5kbWFxLCBwLT5zaXplLCBpKSA8IDApCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzICY9IH5wLT5kbWFfc3RhdHVzOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzIHw9IHAtPmRtYV9zdGF0dXM7Ci0JfQotCXJldHVybiAoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDB4MzAwMDAwMDApID8gMCA6IC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZG1hX3F1ZXVlX29uZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGRtYXEgKmRtYXEpCi17Ci0JaWYgKGRtYXEtPmJ1ZmZlcikgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGRtYXEtPmJ1ZmZlcl9zaXplICsgMHg4MCwKLQkJCQkgICAgZG1hcS0+YnVmZmVyLCBkbWFxLT5idXNfYWRkcik7Ci0JCW1lbXNldChkbWFxLCAwLCBzaXplb2YoKmRtYXEpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZG1hX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBkbWFxICpkbWFxW10gPSB7Ci0JCSZhZGFwdGVyLT5kbWFxMSwKLQkJJmFkYXB0ZXItPmRtYXEyLAotCQlOVUxMCi0JfSwgKipwOwotCi0JZm9yIChwID0gZG1hcTsgKnA7IHArKykKLQkJZnJlZV9kbWFfcXVldWVfb25lKGFkYXB0ZXIsICpwKTsKLQl9Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0KLQlpb3VubWFwKGFkYXB0ZXItPmlvX21lbSk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYWRhcHRlcl9vYmplY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JY2xvc2Vfc3RyZWFtKGFkYXB0ZXIsIDApOwotCQlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOwotCWZyZWVfZG1hX3F1ZXVlKGFkYXB0ZXIpOwotCXJlbGVhc2VfYWRhcHRlcihhZGFwdGVyKTsKLQlrZnJlZShhZGFwdGVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNreXN0YXIyX3BjaV9kcml2ZXI7Ci0KLXN0YXRpYyBpbnQgY2xhaW1fYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdTE2IHZhcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsIHNreXN0YXIyX3BjaV9kcml2ZXIubmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsIHNreXN0YXIyX3BjaV9kcml2ZXIubmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3BjaV9yZWxlYXNlXzE7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZhZGFwdGVyLT5jYXJkX3JldmlzaW9uKTsKLQotCWRwcmludGsoIiVzOiBjYXJkIHJldmlzaW9uICV4IFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5jYXJkX3JldmlzaW9uKTsKLQotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9wY2lfcmVsZWFzZV8wOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgNCwgJnZhcik7Ci0KLQlpZiAoKHZhciAmIDQpID09IDApCi0JCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JYWRhcHRlci0+aW9fcG9ydCA9IHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OwotCi0JYWRhcHRlci0+aW9fbWVtID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMHg4MDApOwotCi0JaWYgKCFhZGFwdGVyLT5pb19tZW0pIHsKLQkJZHByaW50aygiJXM6IGNhbiBub3QgbWFwIGlvIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJfcGNpX2Rpc2FibGU7Ci0JfQotCi0JZHByaW50aygiJXM6IGlvIG1lbW9yeSBtYXBlZCBhdCAlcFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5pb19tZW0pOwotCi0JcmV0ID0gMTsKLW91dDoKLQlyZXR1cm4gcmV0OwotCi1lcnJfcGNpX2Rpc2FibGU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotZXJyX3BjaV9yZWxlYXNlXzA6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwotZXJyX3BjaV9yZWxlYXNlXzE6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOwotCWdvdG8gb3V0OwotfQotCi0vKgotc3RhdGljIGludCBzbGxfcmVzZXRfZmxleGNvcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIxMCwgMHhiMmZmKTsKLQotCXJldHVybiAwOwotfQotKi8KLQotc3RhdGljIHZvaWQgZGVjaWRlX2hvd19tYW55X2h3X2ZpbHRlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGh3X2ZpbHRlcnM7Ci0JaW50IG1vZF9vcHRpb25faHdfZmlsdGVyczsKLQotCS8vIEZsZXhDb3AgSUliICYgSUlJIGhhdmUgNiszMiBodyBmaWx0ZXJzICAgIAotCS8vIEZsZXhDb3AgSUkgaGFzIDYgaHcgZmlsdGVycywgZXZlcnkgb3RoZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3QgNgotCXN3aXRjaCAoYWRhcHRlci0+YjJjMl9yZXZpc2lvbikgewotCWNhc2UgMHg4MjoJCS8qIElJICovCi0JCWh3X2ZpbHRlcnMgPSA2OwotCQlicmVhazsKLQljYXNlIDB4YzM6CQkvKiBJSUIgKi8KLQkJaHdfZmlsdGVycyA9IDYgKyAzMjsKLQkJYnJlYWs7Ci0JY2FzZSAweGMwOgkJLyogSUlJICovCi0JCWh3X2ZpbHRlcnMgPSA2ICsgMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWh3X2ZpbHRlcnMgPSA2OwotCQlicmVhazsKLQl9Ci0JcHJpbnRrKCIlczogdGhlIGNoaXAgaGFzICVpIGhhcmR3YXJlIGZpbHRlcnMiLCBfX0ZJTEVfXywgaHdfZmlsdGVycyk7Ci0KLQltb2Rfb3B0aW9uX2h3X2ZpbHRlcnMgPSAwOwotCWlmIChlbmFibGVfaHdfZmlsdGVycyA+PSAxKQotCQltb2Rfb3B0aW9uX2h3X2ZpbHRlcnMgKz0gNjsKLQlpZiAoZW5hYmxlX2h3X2ZpbHRlcnMgPj0gMikKLQkJbW9kX29wdGlvbl9od19maWx0ZXJzICs9IDMyOwotCi0JaWYgKG1vZF9vcHRpb25faHdfZmlsdGVycyA+PSBod19maWx0ZXJzKSB7Ci0JCWFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVycyA9IGh3X2ZpbHRlcnM7Ci0JfSBlbHNlIHsKLQkJYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzID0gbW9kX29wdGlvbl9od19maWx0ZXJzOwotCQlwcmludGsoIiwgYnV0IG9ubHkgJWQgd2lsbCBiZSB1c2VkIGJlY2F1c2Ugb2YgbW9kdWxlIG9wdGlvbiIsIG1vZF9vcHRpb25faHdfZmlsdGVycyk7Ci0JfQotCXByaW50aygiXG4iKTsKLQlkcHJpbnRrKCIlczogdXNlYWJsZV9oYXJkd2FyZV9maWx0ZXJzIHNldCB0byAlaVxuIiwgX19GSUxFX18sIGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVycyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHJpdmVyX2luaXRpYWxpemUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Ci0JdTMyIHRtcDsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQotCWFkYXB0ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRhcHRlciksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlcikgewotCQlkcHJpbnRrKCIlczogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2Yoc3RydWN0IGFkYXB0ZXIpKTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LGFkYXB0ZXIpOwotCi0JYWRhcHRlci0+cGRldiA9IHBkZXY7Ci0JYWRhcHRlci0+aXJxID0gcGRldi0+aXJxOwotCi0JcmV0ID0gY2xhaW1fYWRhcHRlcihhZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfa2ZyZWU7Ci0KLQlpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAwKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaXNyLCAweDQwMDAwMDAsICJTa3lzdGFyMiIsIGFkYXB0ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkICFcbiIsIF9fRlVOQ1RJT05fXywgcGRldi0+aXJxKTsKLQkJZ290byBlcnJfcmVsZWFzZV9hZGFwdGVyOwotCX0KLQotCXJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4KTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIxMCwgMHhiMmZmKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDB4NDApOwotCi0JcmV0ID0gaW5pdF9kbWFfcXVldWUoYWRhcHRlcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2ZyZWVfaXJxOwotCi0JYWRhcHRlci0+YjJjMl9yZXZpc2lvbiA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwNCkgPj4gMHgxOCk7Ci0KLQlzd2l0Y2ggKGFkYXB0ZXItPmIyYzJfcmV2aXNpb24pIHsKLQljYXNlIDB4ODI6Ci0JCXByaW50aygiJXM6IEZsZXhDb3BJSShyZXYuMTMwKSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhjMzoKLQkJcHJpbnRrKCIlczogRmxleENvcElJQihyZXYuMTk1KSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhjMDoKLQkJcHJpbnRrKCIlczogRmxleENvcElJSShyZXYuMTkyKSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50aygiJXM6IFRoZSByZXZpc2lvbiBvZiB0aGUgRmxleENvcCBjaGlwIG9uIHlvdXIgY2FyZCBpcyAlZFxuIiwgX19GSUxFX18sIGFkYXB0ZXItPmIyYzJfcmV2aXNpb24pOwotCQlwcmludGsoIiVzOiBUaGlzIGRyaXZlciB3b3JrcyBvbmx5IHdpdGggRmxleENvcElJKHJldi4xMzApLCBGbGV4Q29wSUlCKHJldi4xOTUpIGFuZCBGbGV4Q29wSUlJKHJldi4xOTIpLlxuIiwgX19GSUxFX18pOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlX2RtYV9xdWV1ZTsKLQkJfQotCi0JZGVjaWRlX2hvd19tYW55X2h3X2ZpbHRlcnMoYWRhcHRlcik7Ci0KLQlpbml0X3BpZHMoYWRhcHRlcik7Ci0KLQl0bXAgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwNCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDQsIDApOwotCW1kZWxheSgyMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDQsIHRtcCk7Ci0JbWRlbGF5KDEwKTsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MzA4KTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgzMDgsIDB4NDAwMCB8IHRtcCk7Ci0KLQlhZGFwdGVyLT5kd19zcmFtX3R5cGUgPSAweDEwMDAwOwotCi0Jc2xsX2RldGVjdF9zcmFtX3NpemUoYWRhcHRlcik7Ci0KLQlkcHJpbnRrKCIlcyBzcmFtIGxlbmd0aCA9ICVkLCBzcmFtIHR5cGU9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHNyYW1fbGVuZ3RoKGFkYXB0ZXIpLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOwotCi0Jc3JhbV9zZXRfbWVkaWFfZGVzdChhZGFwdGVyLCAxKTsKLQlzcmFtX3NldF9uZXRfZGVzdChhZGFwdGVyLCAxKTsKLQotCWN0cmxfZW5hYmxlX3NtYyhhZGFwdGVyLCAwKTsKLQotCXNyYW1fc2V0X2NhaV9kZXN0KGFkYXB0ZXIsIDIpOwotCXNyYW1fc2V0X2Nhb19kZXN0KGFkYXB0ZXIsIDIpOwotCi0JZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAxLCAwLCAwKTsKLQotCWlmIChlZXByb21fZ2V0X21hY19hZGRyKGFkYXB0ZXIsIDAsIGFkYXB0ZXItPm1hY19hZGRyKSAhPSAwKSB7Ci0JCXByaW50aygiJXMgTUFDIGFkZHJlc3MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPm1hY19hZGRyWzBdLAotCQkgICAgICAgYWRhcHRlci0+bWFjX2FkZHJbMV0sIGFkYXB0ZXItPm1hY19hZGRyWzJdLCBhZGFwdGVyLT5tYWNfYWRkclszXSwgYWRhcHRlci0+bWFjX2FkZHJbNF0sIGFkYXB0ZXItPm1hY19hZGRyWzVdLAotCQkgICAgICAgYWRhcHRlci0+bWFjX2FkZHJbNl0sIGFkYXB0ZXItPm1hY19hZGRyWzddCi0JCSAgICApOwotCi0JCWNhX3NldF9tYWNfZHN0X2FkZHJfZmlsdGVyKGFkYXB0ZXIsIGFkYXB0ZXItPm1hY19hZGRyKTsKLQkJY3RybF9lbmFibGVfbWFjKGFkYXB0ZXIsIDEpOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci0KLWVycl9mcmVlX2RtYV9xdWV1ZToKLQlmcmVlX2RtYV9xdWV1ZShhZGFwdGVyKTsKLWVycl9mcmVlX2lycToKLQlmcmVlX2lycShwZGV2LT5pcnEsIGFkYXB0ZXIpOwotZXJyX3JlbGVhc2VfYWRhcHRlcjoKLQlyZWxlYXNlX2FkYXB0ZXIoYWRhcHRlcik7Ci1lcnJfa2ZyZWU6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWtmcmVlKGFkYXB0ZXIpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBkcml2ZXJfaGFsdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlycV9kbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDApOwotCi0JY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDApOwotCi0JZnJlZV9hZGFwdGVyX29iamVjdChhZGFwdGVyKTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBkdmJfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikgZHZiZG14LT5wcml2OwotCi0JZHByaW50aygiJXM6IFBJRD0lZCwgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnR5cGUpOwotCi0Jb3Blbl9zdHJlYW0oYWRhcHRlciwgZHZiZG14ZmVlZC0+cGlkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGR2Yl9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQotewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopIGR2YmRteC0+cHJpdjsKLQotCWRwcmludGsoIiVzOiBQSUQ9JWQsIHR5cGU9JWRcbiIsIF9fRlVOQ1RJT05fXywgZHZiZG14ZmVlZC0+cGlkLCBkdmJkbXhmZWVkLT50eXBlKTsKLQotCWNsb3NlX3N0cmVhbShhZGFwdGVyLCBkdmJkbXhmZWVkLT5waWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGxuYiBjb250cm9sICovCi1zdGF0aWMgdm9pZCBzZXRfdHVuZXJfdG9uZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggdG9uZSkKLXsKLQl1MTYgd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oeltdID0geyAweDAxZmYsIDB4MDE1NCwgMHgwMGZmLCAweDAwY2MgfTsKLQl1MTYgYXg7Ci0KLQlkcHJpbnRrKCIlczogJXVcbiIsIF9fRlVOQ1RJT05fXywgdG9uZSk7Ci0KLQlzd2l0Y2ggKHRvbmUpIHsKLQljYXNlIDE6Ci0JCWF4ID0gd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oelswXTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlheCA9IHd6X2hhbGZfcGVyaW9kX2Zvcl80NV9taHpbMV07Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJYXggPSB3el9oYWxmX3BlcmlvZF9mb3JfNDVfbWh6WzJdOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWF4ID0gd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oelszXTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlheCA9IDA7Ci0JfQotCi0JaWYgKGF4ICE9IDApIHsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjAwLCAoKGF4IDw8IDB4MGYpICsgKGF4ICYgMHg3ZmZmKSkgfCAweDQwMDAwMDAwKTsKLQotCX0gZWxzZSB7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjAwLCAweDQwZmY4MDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF90dW5lcl9wb2xhcml0eShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggcG9sYXJpdHkpCi17Ci0JdTMyIHZhcjsKLQotCWRwcmludGsoIiVzIDogcG9sYXJpdHkgPSAldSBcbiIsIF9fRlVOQ1RJT05fXywgcG9sYXJpdHkpOwotCi0JdmFyID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDQpOwotCi0JaWYgKHBvbGFyaXR5ID09IDApIHsKLQkJZHByaW50aygiJXM6IExOQiBwb3dlciBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXZhciA9IHZhciB8IDE7Ci0JfTsKLQotCWlmIChwb2xhcml0eSA9PSAxKSB7Ci0JCXZhciA9IHZhciAmIH4xOwotCQl2YXIgPSB2YXIgJiB+NDsKLQl9OwotCi0JaWYgKHBvbGFyaXR5ID09IDIpIHsKLQkJdmFyID0gdmFyICYgfjE7Ci0JCXZhciA9IHZhciB8IDQ7Ci0JfQotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA0LCB2YXIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNlcWNfc2VuZF9iaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBkYXRhKQotewotCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCXVkZWxheShkYXRhID8gNTAwIDogMTAwMCk7Ci0Jc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JdWRlbGF5KGRhdGEgPyAxMDAwIDogNTAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkaXNlcWNfc2VuZF9ieXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZGF0YSkKLQkJewotCWludCBpLCBwYXIgPSAxLCBkOwotCi0JZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKLQkJZCA9IChkYXRhID4+IGkpICYgMTsKLQkJcGFyIF49IGQ7Ci0JCWRpc2VxY19zZW5kX2JpdChhZGFwdGVyLCBkKTsKLQl9Ci0KLQlkaXNlcWNfc2VuZF9iaXQoYWRhcHRlciwgcGFyKTsKLQkJfQotCi0KLXN0YXRpYyBpbnQgc2VuZF9kaXNlcWNfbXNnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgbGVuLCB1OCAqbXNnLCB1bnNpZ25lZCBsb25nIGJ1cnN0KQotewotCWludCBpOwotCi0Jc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JbWRlbGF5KDE2KTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJZGlzZXFjX3NlbmRfYnl0ZShhZGFwdGVyLCBtc2dbaV0pOwotCi0JbWRlbGF5KDE2KTsKLQotCWlmIChidXJzdCAhPSAtMSkgewotCQlpZiAoYnVyc3QpCi0JCQlkaXNlcWNfc2VuZF9ieXRlKGFkYXB0ZXIsIDB4ZmYpOwotCQllbHNlIHsKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCQkJdWRlbGF5KDEyNTAwKTsKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDApOwotCQl9Ci0JCW1zbGVlcCgyMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCi17Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0Jc3dpdGNoKHRvbmUpIHsKLQkJY2FzZSBTRUNfVE9ORV9PTjoKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQkJc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZsZXhjb3BfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCogY21kKQotCQl7Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JCQlzZW5kX2Rpc2VxY19tc2coYWRhcHRlciwgY21kLT5tc2dfbGVuLCBjbWQtPm1zZywgMCk7Ci0KLQlyZXR1cm4gMDsKLQkJfQotCi1zdGF0aWMgaW50IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCi17Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0Jc2VuZF9kaXNlcWNfbXNnKGFkYXB0ZXIsIDAsIE5VTEwsIG1pbmljbWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQotCQl7Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JZHByaW50aygiJXM6IEZFX1NFVF9WT0xUQUdFXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3dpdGNoICh2b2x0YWdlKSB7Ci0JY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJZHByaW50aygiJXM6IFNFQ19WT0xUQUdFXzEzLCAleFxuIiwgX19GVU5DVElPTl9fLCBTRUNfVk9MVEFHRV8xMyk7Ci0JCXNldF90dW5lcl9wb2xhcml0eShhZGFwdGVyLCAxKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNFQ19WT0xUQUdFXzE4OgotCQlkcHJpbnRrKCIlczogU0VDX1ZPTFRBR0VfMTgsICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNFQ19WT0xUQUdFXzE4KTsKLQkJc2V0X3R1bmVyX3BvbGFyaXR5KGFkYXB0ZXIsIDIpOwotCQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JfQotCi1zdGF0aWMgaW50IGZsZXhjb3Bfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi0JCXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkcHJpbnRrKCIlczogRkVfU0xFRVBcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzZXRfdHVuZXJfcG9sYXJpdHkoYWRhcHRlciwgMCk7Ci0KLQlpZiAoYWRhcHRlci0+ZmVfc2xlZXApIHJldHVybiBhZGFwdGVyLT5mZV9zbGVlcChmZSk7Ci0JcmV0dXJuIDA7Ci0JCX0KLQotc3RhdGljIHUzMiBmbGV4Y29wX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLQkJewotCXByaW50aygiZmxleGNvcF9pMmNfZnVuY1xuIik7Ci0KLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gICAgZmxleGNvcF9hbGdvID0gewotCS5uYW1lCQk9ICJmbGV4Y29wIGkyYyBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19CSVQsCi0JLm1hc3Rlcl94ZmVyCT0gbWFzdGVyX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBmbGV4Y29wX2kyY19mdW5jLAotfTsKLQotCi0KLQotc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9zZXRfc3ltYm9sX3JhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBzcmF0ZSwgdTMyIHJhdGlvKQotewotCXU4IGFjbGsgPSAwOwotCXU4IGJjbGsgPSAwOwotCi0JaWYgKHNyYXRlIDwgMTUwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NDc7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDMwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDRiOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCA3MDAwMDAwKSB7IGFjbGsgPSAweGI3OyBiY2xrID0gMHg0ZjsgfQotCWVsc2UgaWYgKHNyYXRlIDwgMTQwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDUzOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCAzMDAwMDAwMCkgeyBhY2xrID0gMHhiNjsgYmNsayA9IDB4NTM7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDQ1MDAwMDAwKSB7IGFjbGsgPSAweGI0OyBiY2xrID0gMHg1MTsgfQotCi0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MTMsIGFjbGspOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDE0LCBiY2xrKTsKLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgxZiwgKHJhdGlvID4+IDE2KSAmIDB4ZmYpOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDIwLCAocmF0aW8gPj4gIDgpICYgMHhmZik7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MjEsIChyYXRpbyAgICAgICkgJiAweGYwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQotewotCXU4IGJ1Zls0XTsKLQl1MzIgZGl2OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkaXYgPSBwYXJhbXMtPmZyZXF1ZW5jeSAvIDEyNTsKLQotCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4NDsgIC8vIDB4QzQKLQlidWZbM10gPSAweDA4OwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMCkgYnVmWzNdIHw9IDB4MTA7Ci0KLQlpZiAoaTJjX3RyYW5zZmVyICgmYWRhcHRlci0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYltdID0gewotCSAgICAgMHgwMSwgMHgxNSwKLQkgICAgIDB4MDIsIDB4MzAsCi0JICAgICAweDAzLCAweDAwLAotCSAgICAgMHgwNCwgMHg3RCwKLQkgICAgIDB4MDUsIDB4MzUsCi0JICAgICAweDA2LCAweDAyLAotCSAgICAgMHgwNywgMHgwMCwKLQkgICAgIDB4MDgsIDB4QzMsCi0JICAgICAweDBDLCAweDAwLAotCSAgICAgMHgwRCwgMHg4MSwKLQkgICAgIDB4MEUsIDB4MjMsCi0JICAgICAweDBGLCAweDEyLAotCSAgICAgMHgxMCwgMHg3RSwKLQkgICAgIDB4MTEsIDB4ODQsCi0JICAgICAweDEyLCAweEI5LAotCSAgICAgMHgxMywgMHg4OCwKLQkgICAgIDB4MTQsIDB4ODksCi0JICAgICAweDE1LCAweEM5LAotCSAgICAgMHgxNiwgMHgwMCwKLQkgICAgIDB4MTcsIDB4NUMsCi0JICAgICAweDE4LCAweDAwLAotCSAgICAgMHgxOSwgMHgwMCwKLQkgICAgIDB4MUEsIDB4MDAsCi0JICAgICAweDFDLCAweDAwLAotCSAgICAgMHgxRCwgMHgwMCwKLQkgICAgIDB4MUUsIDB4MDAsCi0JICAgICAweDFGLCAweDNBLAotCSAgICAgMHgyMCwgMHgyRSwKLQkgICAgIDB4MjEsIDB4ODAsCi0JICAgICAweDIyLCAweEZGLAotCSAgICAgMHgyMywgMHhDMSwKLQkgICAgIDB4MjgsIDB4MDAsCi0JICAgICAweDI5LCAweDFFLAotCSAgICAgMHgyQSwgMHgxNCwKLQkgICAgIDB4MkIsIDB4MEYsCi0JICAgICAweDJDLCAweDA5LAotCSAgICAgMHgyRCwgMHgwNSwKLQkgICAgIDB4MzEsIDB4MUYsCi0JICAgICAweDMyLCAweDE5LAotCSAgICAgMHgzMywgMHhGRSwKLQkgICAgIDB4MzQsIDB4OTMsCi0JICAgICAweGZmLCAweGZmLAotCQkJfTsKLQotc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBzYW1zdW5nX3RibXUyNDExMl9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5pbml0dGFiID0gc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYiwKLQkubWNsayA9IDg4MDAwMDAwVUwsCi0JLmludmVydCA9IDAsCi0JLmVuaGFuY2VkX3R1bmluZyA9IDAsCi0JLnNraXBfcmVpbml0ID0gMCwKLQkubG9ja19vdXRwdXQgPSBTVFYwMjI5X0xPQ0tPVVRQVVRfTEssCi0JLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAotCS5taW5fZGVsYXlfbXMgPSAxMDAsCi0JLnNldF9zeW1ib2xfcmF0ZSA9IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZSwKLSAgIAkucGxsX3NldCA9IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQsCi19OwotCi0KLQotc3RhdGljIGludCBueHQyMDAyX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQotewotCXN0cnVjdCBhZGFwdGVyKiBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyKikgZmUtPmR2Yi0+cHJpdjsKLQotCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCAmYWRhcHRlci0+cGRldi0+ZGV2KTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG54dDIwMDJfY29uZmlnIHNhbXN1bmdfdGJtdl9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDBBLAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gbnh0MjAwMl9yZXF1ZXN0X2Zpcm13YXJlLAotfTsKLQotc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi17Ci0Jc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZyBbXSA9IHsgMHg4OSwgMHgxOCwgMHgyZCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9yZXNldCBbXSA9IHsgMHg1MCwgMHg4MCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9hZGNfY3RsXzFfY2ZnIFtdID0geyAweDhFLCAweDQwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FnY19jZmcgW10gPSB7IDB4NjcsIDB4MjgsIDB4YTEgfTsKLQlzdGF0aWMgdTggbXQzNTJfY2FwdF9yYW5nZV9jZmdbXSA9IHsgMHg3NSwgMHgzMiB9OwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2Nsb2NrX2NvbmZpZywgc2l6ZW9mKG10MzUyX2Nsb2NrX2NvbmZpZykpOwotCXVkZWxheSgyMDAwKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfcmVzZXQsIHNpemVvZihtdDM1Ml9yZXNldCkpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZGNfY3RsXzFfY2ZnLCBzaXplb2YobXQzNTJfYWRjX2N0bF8xX2NmZykpOwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FnY19jZmcsIHNpemVvZihtdDM1Ml9hZ2NfY2ZnKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2NhcHRfcmFuZ2VfY2ZnLCBzaXplb2YobXQzNTJfY2FwdF9yYW5nZV9jZmcpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpCi17Ci0JdTMyIGRpdjsKLQl1bnNpZ25lZCBjaGFyIGJzID0gMDsKLQotCSNkZWZpbmUgSUZfRlJFUVVFTkNZeDYgMjE3ICAgIC8qIDYgKiAzNi4xNjY2NjY2NjY2N01IeiAqLwotCWRpdiA9ICgoKHBhcmFtcy0+ZnJlcXVlbmN5ICsgODMzMzMpICogMykgLyA1MDAwMDApICsgSUZfRlJFUVVFTkNZeDY7Ci0KLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gNDgwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gMTU0MDAwMDAwKSBicyA9IDB4MDk7Ci0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID49IDE2MTAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSA0MzkwMDAwMDApIGJzID0gMHgwYTsKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gNDQ3MDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDg2MzAwMDAwMCkgYnMgPSAweDA4OwotCi0JcGxsYnVmWzBdID0gMHhjMjsgLy8gTm90ZTogbm9uLWxpbnV4IHN0YW5kYXJkIFBMTCBpMmMgYWRkcmVzcwotCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwotICAgCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4ZmY7Ci0gICAJcGxsYnVmWzNdID0gMHhjYzsKLSAgIAlwbGxidWZbNF0gPSBiczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZyA9IHsKLQotCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKLQkuZGVtb2RfaW5pdCA9IHNhbXN1bmdfdGR0YzkyNTFkaDBfZGVtb2RfaW5pdCwKLSAgIAkucGxsX3NldCA9IHNhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldCwKLX07Ci0KLXN0YXRpYyBpbnQgc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQotewotCXU4IGJ1Zls0XTsKLQl1MzIgZGl2OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyAoMTI1LzIpKSAvIDEyNTsKLQotCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOwotCWJ1ZlsyXSA9IDB4ODQgfCAoKGRpdiA+PiAxMCkgJiAweDYwKTsKLQlidWZbM10gPSAweDgwOwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTU1MDAwMCkKLQkJYnVmWzNdIHw9IDB4MDI7Ci0KLQlpZiAoaTJjX3RyYW5zZmVyICgmYWRhcHRlci0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG10MzEyX2NvbmZpZyBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfY29uZmlnID0gewotCi0JLmRlbW9kX2FkZHJlc3MgPSAweDBlLAotICAgCS5wbGxfc2V0ID0gc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQsCi19OwotCi0KLQotCi1zdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCBhZGFwdGVyICpza3lzdGFyMikKLXsKLQlzd2l0Y2goc2t5c3RhcjItPnBkZXYtPmRldmljZSkgewotCWNhc2UgMHgyMTAzOiAvLyBUZWNobmlzYXQgU2t5c3RhcjIgT1IgVGVjaG5pc2F0IEFpcnN0YXIyIChEVkItVCBvciBBVFNDKQotCi0JCS8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgTmV4dHdhdmUgbnh0MjAwMiBmb3IgQVRTQyBzdXBwb3J0IAotCQlza3lzdGFyMi0+ZmUgPSBueHQyMDAyX2F0dGFjaCgmc2Ftc3VuZ190Ym12X2NvbmZpZywgJnNreXN0YXIyLT5pMmNfYWRhcCk7Ci0JCWlmIChza3lzdGFyMi0+ZmUgIT0gTlVMTCkgewotCQkJc2t5c3RhcjItPmZlX3NsZWVwID0gc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwID0gZmxleGNvcF9zbGVlcDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gdHJ5IHRoZSBza3lzdGFyMiB2Mi42IGZpcnN0IChzdHYwMjk5L1NhbXN1bmcgdGJtdTI0MTEyKHNsMTkzNSkpCi0JCXNreXN0YXIyLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZzYW1zdW5nX3RibXUyNDExMl9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7Ci0JCQlza3lzdGFyMi0+ZmVfc2xlZXAgPSBza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXAgPSBmbGV4Y29wX3NsZWVwOwotCQkJYnJlYWs7Ci19Ci0KLQkJLy8gdHJ5IHRoZSBhaXJzdGFyMiAobXQzNTIvU2Ftc3VuZyB0ZHRjOTI1MWRoMCg/PykpCi0JCXNreXN0YXIyLT5mZSA9IG10MzUyX2F0dGFjaCgmc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSA0NzQwMDAwMDA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyB0cnkgdGhlIHNreXN0YXIyIHYyLjMgKHZwMzEwL1NhbXN1bmcgdGJkdTE4MTMyKHRzYTUwNTkpKQotCQlza3lzdGFyMi0+ZmUgPSB2cDMxMF9hdHRhY2goJnNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gZmxleGNvcF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGZsZXhjb3Bfc2V0X3RvbmU7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBmbGV4Y29wX3NldF92b2x0YWdlOwotCQkJc2t5c3RhcjItPmZlX3NsZWVwID0gc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwID0gZmxleGNvcF9zbGVlcDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChza3lzdGFyMi0+ZmUgPT0gTlVMTCkgewotCQlwcmludGsoInNreXN0YXIyOiBBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgJTA0eC8lMDR4IHN1YnN5c3RlbSAlMDR4LyUwNHhcbiIsCi0JCSAgICAgICBza3lzdGFyMi0+cGRldi0+dmVuZG9yLAotCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPmRldmljZSwKLQkJICAgICAgIHNreXN0YXIyLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAotCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwotCX0gZWxzZSB7Ci0JCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnNreXN0YXIyLT5kdmJfYWRhcHRlciwgc2t5c3RhcjItPmZlKSkgewotCQkJcHJpbnRrKCJza3lzdGFyMjogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwotCQkJaWYgKHNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCXNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKHNreXN0YXIyLT5mZSk7Ci0JCQlza3lzdGFyMi0+ZmUgPSBOVUxMOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQgc2t5c3RhcjJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcjsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eDsKLQlzdHJ1Y3QgZG14X2RlbXV4ICpkbXg7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0KLQlpZiAoIXBkZXYpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gZHJpdmVyX2luaXRpYWxpemUocGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlkdmJfYWRhcHRlciA9ICZhZGFwdGVyLT5kdmJfYWRhcHRlcjsKLQotCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyLCBza3lzdGFyMl9wY2lfZHJpdmVyLm5hbWUsCi0JCQkJICAgVEhJU19NT0RVTEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiJXM6IEVycm9yIHJlZ2lzdGVyaW5nIERWQiBhZGFwdGVyXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlnb3RvIGVycl9oYWx0OwotCX0KLQotCWR2Yl9hZGFwdGVyLT5wcml2ID0gYWRhcHRlcjsKLQotCi0JaW5pdF9NVVRFWCgmYWRhcHRlci0+aTJjX3NlbSk7Ci0KLQotCW1lbXNldCgmYWRhcHRlci0+aTJjX2FkYXAsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKLQlzdHJjcHkoYWRhcHRlci0+aTJjX2FkYXAubmFtZSwgIlNreVN0YXIyIik7Ci0KLQlpMmNfc2V0X2FkYXBkYXRhKCZhZGFwdGVyLT5pMmNfYWRhcCwgYWRhcHRlcik7Ci0KLSNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMCi0JYWRhcHRlci0+aTJjX2FkYXAuY2xhc3MgCSAgICA9IEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUw7Ci0jZWxzZQotCWFkYXB0ZXItPmkyY19hZGFwLmNsYXNzIAkgICAgPSBJMkNfQ0xBU1NfVFZfRElHSVRBTDsKLSNlbmRpZgotCWFkYXB0ZXItPmkyY19hZGFwLmFsZ28gICAgICAgICAgICAgID0gJmZsZXhjb3BfYWxnbzsKLQlhZGFwdGVyLT5pMmNfYWRhcC5hbGdvX2RhdGEgICAgICAgICA9IE5VTEw7Ci0JYWRhcHRlci0+aTJjX2FkYXAuaWQgICAgICAgICAgICAgICAgPSBJMkNfQUxHT19CSVQ7Ci0KLQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmFkYXB0ZXItPmkyY19hZGFwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXI7Ci0KLQlkdmJkZW11eCA9ICZhZGFwdGVyLT5kZW11eDsKLQotCWR2YmRlbXV4LT5wcml2ID0gYWRhcHRlcjsKLQlkdmJkZW11eC0+ZmlsdGVybnVtID0gTl9QSURfU0xPVFM7Ci0JZHZiZGVtdXgtPmZlZWRudW0gPSBOX1BJRF9TTE9UUzsKLQlkdmJkZW11eC0+c3RhcnRfZmVlZCA9IGR2Yl9zdGFydF9mZWVkOwotCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBkdmJfc3RvcF9mZWVkOwotCWR2YmRlbXV4LT53cml0ZV90b19kZWNvZGVyID0gTlVMTDsKLQlkdmJkZW11eC0+ZG14LmNhcGFiaWxpdGllcyA9IChETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkcpOwotCi0JcmV0ID0gZHZiX2RteF9pbml0KCZhZGFwdGVyLT5kZW11eCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2kyY19kZWw7Ci0KLQlkbXggPSAmZHZiZGVtdXgtPmRteDsKLQotCWFkYXB0ZXItPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOwotCWFkYXB0ZXItPmRteGRldi5maWx0ZXJudW0gPSBOX1BJRF9TTE9UUzsKLQlhZGFwdGVyLT5kbXhkZXYuZGVtdXggPSBkbXg7Ci0JYWRhcHRlci0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7Ci0KLQlyZXQgPSBkdmJfZG14ZGV2X2luaXQoJmFkYXB0ZXItPmRteGRldiwgJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZG14X3JlbGVhc2U7Ci0KLQlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2RteGRldl9yZWxlYXNlOwotCi0JYWRhcHRlci0+bWVtX2Zyb250ZW5kLnNvdXJjZSA9IERNWF9NRU1PUllfRkU7Ci0KLQlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5tZW1fZnJvbnRlbmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZW1vdmVfaHdfZnJvbnRlbmQ7Ci0KLQlyZXQgPSBkbXgtPmNvbm5lY3RfZnJvbnRlbmQoZG14LCAmYWRhcHRlci0+aHdfZnJvbnRlbmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZW1vdmVfbWVtX2Zyb250ZW5kOwotCi0JZHZiX25ldF9pbml0KCZhZGFwdGVyLT5kdmJfYWRhcHRlciwgJmFkYXB0ZXItPmR2Ym5ldCwgJmR2YmRlbXV4LT5kbXgpOwotCi0JZnJvbnRlbmRfaW5pdChhZGFwdGVyKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotCi1lcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKLQlkdmJkZW11eC0+ZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwgJmFkYXB0ZXItPm1lbV9mcm9udGVuZCk7Ci1lcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOgotCWR2YmRlbXV4LT5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCAmYWRhcHRlci0+aHdfZnJvbnRlbmQpOwotZXJyX2RteGRldl9yZWxlYXNlOgotCWR2Yl9kbXhkZXZfcmVsZWFzZSgmYWRhcHRlci0+ZG14ZGV2KTsKLWVycl9kbXhfcmVsZWFzZToKLQlkdmJfZG14X3JlbGVhc2UoJmFkYXB0ZXItPmRlbXV4KTsKLWVycl9pMmNfZGVsOgotCWkyY19kZWxfYWRhcHRlcigmYWRhcHRlci0+aTJjX2FkYXApOwotZXJyX2R2Yl91bnJlZ2lzdGVyOgotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKLWVycl9oYWx0OgotCWRyaXZlcl9oYWx0KHBkZXYpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBza3lzdGFyMl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg7Ci0Jc3RydWN0IGRteF9kZW11eCAqZG14OwotCi0JaWYgKCFhZGFwdGVyKQotCQlyZXR1cm47Ci0KLQkJZHZiX25ldF9yZWxlYXNlKCZhZGFwdGVyLT5kdmJuZXQpOwotCQlkdmJkZW11eCA9ICZhZGFwdGVyLT5kZW11eDsKLQlkbXggPSAmZHZiZGVtdXgtPmRteDsKLQotCWRteC0+Y2xvc2UoZG14KTsKLQlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci0JZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmYWRhcHRlci0+bWVtX2Zyb250ZW5kKTsKLQotCQlkdmJfZG14ZGV2X3JlbGVhc2UoJmFkYXB0ZXItPmRteGRldik7Ci0JZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKLQotCWlmIChhZGFwdGVyLT5mZSAhPSBOVUxMKQotCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChhZGFwdGVyLT5mZSk7Ci0KLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZhZGFwdGVyLT5kdmJfYWRhcHRlcik7Ci0KLQkJCWkyY19kZWxfYWRhcHRlcigmYWRhcHRlci0+aTJjX2FkYXApOwotCi0JCWRyaXZlcl9oYWx0KHBkZXYpOwotCX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNreXN0YXIyX3BjaV90YmxbXSA9IHsKLQl7MHgwMDAwMTNkMCwgMHgwMDAwMjEwMywgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0vKgl7MHgwMDAwMTNkMCwgMHgwMDAwMjIwMCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sIFVOREVGSU5FRCBIQVJEV0FSRSAtIG1haWwgbGludXh0di5vcmcgbGlzdCAqLwkvL0ZDSUlJCi0JezAsfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBza3lzdGFyMl9wY2lfdGJsKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNreXN0YXIyX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU2t5U3RhcjIiLAotCS5pZF90YWJsZSA9IHNreXN0YXIyX3BjaV90YmwsCi0JLnByb2JlID0gc2t5c3RhcjJfcHJvYmUsCi0JLnJlbW92ZSA9IHNreXN0YXIyX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgc2t5c3RhcjJfaW5pdCh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza3lzdGFyMl9wY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgc2t5c3RhcjJfY2xlYW51cCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2t5c3RhcjJfcGNpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNreXN0YXIyX2luaXQpOwotbW9kdWxlX2V4aXQoc2t5c3RhcjJfY2xlYW51cCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVGVjaG5pc2F0IFNreVN0YXIyIERWQiBQQ0kgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCmluZGV4IDEzMzk5MTIuLjA3YTBiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCkBAIC0yNTgsMTAgKzI1OCwxMCBAQAogCWlmIChkZWJ1ZyAmJiAodmVyYm9zZSA+IDQpKSB7CiAJCXU4IGk7CiAJCWlmICh2ZXJib3NlID4gNCkgewotCQkJZHByaW50aygiJXMgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKCIlcyB3cml0aW5nIFsgIiwgX19GVU5DVElPTl9fKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQlkcHJpbnRrKCIgJTAyeCIsIGRhdGFbaV0pOwotCQkJZHByaW50aygiXG4iKTsKKwkJCQlkcHJpbnRrKCIlMDJ4ICIsIGRhdGFbaV0pOworCQkJZHByaW50aygiXVxuIik7CiAJCX0KIAl9CiAJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykgewpAQCAtMzIwLDEwICszMjAsMjkgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmVhZF9kc3QpOwogCitzdGF0aWMgaW50IGRzdF9zZXRfcG9sYXJpemF0aW9uKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUtPnZvbHRhZ2UpIHsKKwkJY2FzZSBTRUNfVk9MVEFHRV8xMzoJLy8gdmVydGljYWwKKwkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bVmVydGljYWxdXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4NDA7ICAvLzEKKwkJCWJyZWFrOworCisJCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CS8vIGhvcml6b250YWwKKwkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bSG9yaXpvbnRhbF1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDQwOyAgLy8gMAorCQkJYnJlYWs7CisKKwkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRzdF9zZXRfZnJlcShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTMyIGZyZXEpCiB7Ci0JdTggKnZhbDsKLQogCXN0YXRlLT5mcmVxdWVuY3kgPSBmcmVxOwogCWlmIChkZWJ1ZyA+IDQpCiAJCWRwcmludGsoIiVzOiBzZXQgRnJlcXVlbmN5ICV1XG4iLCBfX0ZVTkNUSU9OX18sIGZyZXEpOwpAQCAtMzMyLDQ2ICszNTEsMzAgQEAKIAkJZnJlcSA9IGZyZXEgLyAxMDAwOwogCQlpZiAoZnJlcSA8IDk1MCB8fCBmcmVxID4gMjE1MCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0JCXZhbFsyXSA9IChmcmVxID4+IDgpICYgMHg3ZjsKLQkJdmFsWzNdID0gKHU4KSBmcmVxOwotCQl2YWxbNF0gPSAxOwotCQl2YWxbOF0gJj0gfjQ7Ci0JCWlmIChmcmVxIDwgMTUzMSkKLQkJCXZhbFs4XSB8PSA0OworCisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gOCk7CisJCXN0YXRlLT50eF90dW5hWzNdID0gKHU4KSBmcmVxOworCQlzdGF0ZS0+dHhfdHVuYVs0XSA9IDB4MDE7CisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDA0OworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKKwkJCWlmIChmcmVxIDwgMTUzMSkKKwkJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDA0OworCQl9CisKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJaWYgKGZyZXEgPCAxMzcwMDAgfHwgZnJlcSA+IDg1ODAwMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0JCXZhbFsyXSA9IChmcmVxID4+IDE2KSAmIDB4ZmY7Ci0JCXZhbFszXSA9IChmcmVxID4+IDgpICYgMHhmZjsKLQkJdmFsWzRdID0gKHU4KSBmcmVxOwotCQl2YWxbNV0gPSAwOwotCQlzd2l0Y2ggKHN0YXRlLT5iYW5kd2lkdGgpIHsKLQkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6Ci0JCQl2YWxbNl0gPSA2OwotCQkJYnJlYWs7CiAKLQkJY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCWNhc2UgQkFORFdJRFRIX0FVVE86Ci0JCQl2YWxbNl0gPSA3OwotCQkJYnJlYWs7CisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOwogCi0JCWNhc2UgQkFORFdJRFRIXzhfTUhaOgotCQkJdmFsWzZdID0gODsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdmFsWzddID0gMDsKLQkJdmFsWzhdID0gMDsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewotCQkvKiBndWVzcyB0aWxsIHdpbGwgZ2V0IG9uZSAqLwotCQlmcmVxID0gZnJlcSAvIDEwMDA7Ci0JCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKLQkJdmFsWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKLQkJdmFsWzNdID0gKGZyZXEgPj4gOCkgJiAweGZmOwotCQl2YWxbNF0gPSAodTgpIGZyZXE7CisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwpAQCAtMzc5LDUxICszODIsNTggQEAKIAogc3RhdGljIGludCBkc3Rfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgZmVfYmFuZHdpZHRoX3QgYmFuZHdpZHRoKQogewotCXU4ICp2YWw7Ci0KIAlzdGF0ZS0+YmFuZHdpZHRoID0gYmFuZHdpZHRoOwogCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19URVJSKQogCQlyZXR1cm4gMDsKIAotCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKIAlzd2l0Y2ggKGJhbmR3aWR0aCkgewotCWNhc2UgQkFORFdJRFRIXzZfTUhaOgotCQl2YWxbNl0gPSA2OwotCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA2OworCQkJZWxzZSB7CisJCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA2OworCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOwogCi0JY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCXZhbFs2XSA9IDc7Ci0JCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDc7CisJCQllbHNlIHsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9IDB4MDc7CisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQkJfQorCQkJYnJlYWs7CiAKLQljYXNlIEJBTkRXSURUSF84X01IWjoKLQkJdmFsWzZdID0gODsKLQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwODsKKwkJCWVsc2UgeworCQkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwODsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDA7CisJCQl9CisJCQlicmVhazsKIAotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRzdF9zZXRfaW52ZXJzaW9uKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCiB7Ci0JdTggKnZhbDsKLQogCXN0YXRlLT5pbnZlcnNpb24gPSBpbnZlcnNpb247Ci0KLQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0KLQl2YWxbOF0gJj0gfjB4ODA7Ci0KIAlzd2l0Y2ggKGludmVyc2lvbikgewotCWNhc2UgSU5WRVJTSU9OX09GRjoKLQkJYnJlYWs7Ci0JY2FzZSBJTlZFUlNJT05fT046Ci0JCXZhbFs4XSB8PSAweDgwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBJTlZFUlNJT05fT0ZGOgkvLyBJbnZlcnNpb24gPSBOb3JtYWwKKwkJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTlZFUlNJT05fT046CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00NzgsNiArNDg4LDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCBkc3Rfc2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uKQoreworCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfQ0FCTEUpCisJCXJldHVybiAwOworCisJc3RhdGUtPm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uOworCXN3aXRjaCAobW9kdWxhdGlvbikgeworCQljYXNlIFFBTV8xNjoKKwkJCXN0YXRlLT50eF90dW5hWzhdID0gMHgxMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUUFNXzMyOgorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDIwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRQU1fNjQ6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4NDA7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8xMjg6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4ODA7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8yNTY6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MDA7CisJCQlicmVhazsKKworCQljYXNlIFFQU0s6CisJCWNhc2UgUUFNX0FVVE86CisJCWNhc2UgVlNCXzg6CisJCWNhc2UgVlNCXzE2OgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGZlX21vZHVsYXRpb25fdCBkc3RfZ2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5tb2R1bGF0aW9uOworfQorCisKIHU4IGRzdF9jaGVja19zdW0odTggKiBidWYsIHUzMiBsZW4pCiB7CiAJdTMyIGk7CkBAIC01NzcsNyArNjMzLDcgQEAKIAkJLmRldmljZV9pZCA9ICIyMDAxMDNBIiwKIAkJLm9mZnNldCA9IDAsCiAJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19TWU1ESVYgfCBEU1RfVFlQRV9IQVNfRldfMSB8IERTVF9UWVBFX0hBU19PQlNfUkVHUywKIAkJLmRzdF9mZWF0dXJlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKQEAgLTYyNiw3ICs2ODIsNyBAQAogCQkuZGV2aWNlX2lkID0gIkRTVE1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVCwKIAkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBIHwgRFNUX1RZUEVfSEFTX0RJU0VRQzMgfCBEU1RfVFlQRV9IQVNfRElTRVFDNAogCQkJCQkJCXwgRFNUX1RZUEVfSEFTX01PVE8gfCBEU1RfVFlQRV9IQVNfTUFDCiAJfSwKQEAgLTg3Miw3ICs5MjgsNyBAQAogewogCWludCByZXR2YWw7CiAJdTggZ2V0X3NpZ25hbFtdID0geyAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZiIH07Ci0KKwlkcHJpbnRrKCIlczogR2V0dGluZyBTaWduYWwgc3RyZW5ndGggYW5kIG90aGVyIHBhcmFtZXRlcnNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBBVFRFTVBUX1RVTkUpID09IDApIHsKIAkJc3RhdGUtPmRlY29kZV9sb2NrID0gc3RhdGUtPmRlY29kZV9zdHJlbmd0aCA9IHN0YXRlLT5kZWNvZGVfc25yID0gMDsKIAkJcmV0dXJuIDA7CkBAIC05NTQsMTUgKzEwMTAsOCBAQAogCXN0YXRlLT5kZWNvZGVfZnJlcSA9ICgoc3RhdGUtPnJ4X3R1bmFbMl0gJiAweDdmKSA8PCA4KSArIHN0YXRlLT5yeF90dW5hWzNdOwogCiAJc3RhdGUtPmRlY29kZV9sb2NrID0gMTsKLQkvKgotCSAgIGRzdC0+ZGVjb2RlX24xID0gKGRzdC0+cnhfdHVuYVs0XSA8PCA4KSArCi0JICAgKGRzdC0+cnhfdHVuYVs1XSk7Ci0KLQkgICBkc3QtPmRlY29kZV9uMiA9IChkc3QtPnJ4X3R1bmFbOF0gPDwgOCkgKwotCSAgIChkc3QtPnJ4X3R1bmFbN10pOwotCSAqLwogCXN0YXRlLT5kaXNlcV9mbGFncyB8PSBIQVNfTE9DSzsKLQkvKiBkc3QtPmN1cl9qaWZmID0gamlmZmllczsgKi8KKwogCXJldHVybiAxOwogfQogCkBAIC0xMDk4LDcgKzExNDcsMTEgQEAKIAogCXN3aXRjaCAodG9uZSkgewogCQljYXNlIFNFQ19UT05FX09GRjoKLQkJCXN0YXRlLT50eF90dW5hWzJdID0gMHhmZjsKKwkJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJCSAgICBzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4MDA7CisJCQllbHNlCisJCQkgICAgc3RhdGUtPnR4X3R1bmFbMl0gPSAweGZmOworCiAJCQlicmVhazsKIAogCQljYXNlIFNFQ19UT05FX09OOgpAQCAtMTE0NSw3ICsxMTk4LDggQEAKIAlzdGF0aWMgdTggaW5pX3R2Y2lfdHVuYVtdID0geyA5LCAwLCAzLCAweGI2LCAxLCA3LCAweDAsIDB4MCwgMCwgMCB9OwogCXN0YXRpYyB1OCBpbmlfY2FiZnRhX3R1bmFbXSA9IHsgMCwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKIAlzdGF0aWMgdTggaW5pX2NhYmNpX3R1bmFbXSA9IHsgOSwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLQlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworLy8Jc3RhdGUtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PTjsKKwlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09GRjsKIAlzdGF0ZS0+dm9sdGFnZSA9IFNFQ19WT0xUQUdFXzEzOwogCXN0YXRlLT50b25lID0gU0VDX1RPTkVfT0ZGOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IDI5NDczMDAwOwpAQCAtMTE3NCw3ICsxMjI4LDcgQEAKIAogCSpzdGF0dXMgPSAwOwogCWlmIChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBIQVNfTE9DSykgewotCQlkc3RfZ2V0X3NpZ25hbChzdGF0ZSk7CisvLwkJZHN0X2dldF9zaWduYWwoc3RhdGUpOwkvLyBkb24ndCByZXF1aXJlKD8pIHRvIGFzayBNQ1UKIAkJaWYgKHN0YXRlLT5kZWNvZGVfbG9jaykKIAkJCSpzdGF0dXMgfD0gRkVfSEFTX0xPQ0sgfCBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19WSVRFUkJJOwogCX0KQEAgLTEyMDgsMjAgKzEyNjIsMjUgQEAKIAogCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKIAlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIlNldCBGcmVxdWVuY3kgPSBbJWRdXG4iLCBwLT5mcmVxdWVuY3kpOworCQlkcHJpbnRrKCJTZXQgRnJlcXVlbmN5PVslZF1cbiIsIHAtPmZyZXF1ZW5jeSk7CiAKLQlkc3Rfc2V0X2ludmVyc2lvbihzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKKy8vCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOworCiAJCWRzdF9zZXRfZmVjKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKIAkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQlkc3Rfc2V0X3BvbGFyaXphdGlvbihzdGF0ZSk7CiAJCWlmICh2ZXJib3NlID4gNCkKLQkJCWRwcmludGsoIlNldCBTeW1ib2xyYXRlID0gWyVkXVxuIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKKwkJCWRwcmludGsoIlNldCBTeW1ib2xyYXRlPVslZF1cbiIsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CiAKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CiAJCWRzdF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewogCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xYW0uZmVjX2lubmVyKTsKIAkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CisJCWRzdF9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcC0+dS5xYW0ubW9kdWxhdGlvbik7CiAJfQogCWRzdF93cml0ZV90dW5hKGZlKTsKIApAQCAtMTIzMyw4ICsxMjkyLDExIEBACiAJc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT5kZWNvZGVfZnJlcTsKLQlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOworLy8JcC0+aW52ZXJzaW9uID0gc3RhdGUtPmludmVyc2lvbjsKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgeworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCisJCQlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOworCiAJCXAtPnUucXBzay5zeW1ib2xfcmF0ZSA9IHN0YXRlLT5zeW1ib2xfcmF0ZTsKIAkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGRzdF9nZXRfZmVjKHN0YXRlKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CkBAIC0xMjQyLDcgKzEzMDQsOCBAQAogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CiAJCXAtPnUucWFtLnN5bWJvbF9yYXRlID0gc3RhdGUtPnN5bWJvbF9yYXRlOwogCQlwLT51LnFhbS5mZWNfaW5uZXIgPSBkc3RfZ2V0X2ZlYyhzdGF0ZSk7Ci0JCXAtPnUucWFtLm1vZHVsYXRpb24gPSBRQU1fQVVUTzsKKy8vCQlwLT51LnFhbS5tb2R1bGF0aW9uID0gUUFNX0FVVE87CisJCXAtPnUucWFtLm1vZHVsYXRpb24gPSBkc3RfZ2V0X21vZHVsYXRpb24oc3RhdGUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwppbmRleCBkNzgxNTA0Li5iZmFhY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgImRzdF9jYS5oIgogI2luY2x1ZGUgImRzdF9jb21tb24uaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCB2ZXJib3NlID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDU7CiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CiAKQEAgLTI5NSwzNCArMjk1LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX2VuNTAyMjFfdGFnKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcikKK3N0YXRpYyBpbnQgaGFuZGxlX2RzdF90YWcoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1MzIgbGVuZ3RoKQogewogCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19TRVNTSU9OKSB7CiAJCWh3X2J1ZmZlci0+bXNnWzJdID0gcF9jYV9tZXNzYWdlLT5tc2dbMV07CQkvKgkJTVNCCQkJKi8KIAkJaHdfYnVmZmVyLT5tc2dbM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1syXTsJCS8qCQlMU0IJCQkqLwogCX0KIAllbHNlIHsKKwkJaHdfYnVmZmVyLT5tc2dbMF0gPSAobGVuZ3RoICYgMHhmZikgKyA3OworCQlod19idWZmZXItPm1zZ1sxXSA9IDB4NDA7CiAJCWh3X2J1ZmZlci0+bXNnWzJdID0gMHgwMzsKIAkJaHdfYnVmZmVyLT5tc2dbM10gPSAweDAwOworCQlod19idWZmZXItPm1zZ1s0XSA9IDB4MDM7CisJCWh3X2J1ZmZlci0+bXNnWzVdID0gbGVuZ3RoICYgMHhmZjsKKwkJaHdfYnVmZmVyLT5tc2dbNl0gPSAweDAwOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWJ1Z184ODIwX2J1ZmZlcihzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIpCisKK3N0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCBsZW5ndGgsIHU4IHJlcGx5KQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZHByaW50aygiJXM6RGVidWc9WyIsIF9fRlVOQ1RJT05fXyk7Ci0JZm9yIChpID0gMDsgaSA8IChod19idWZmZXItPm1zZ1swXSArIDEpOyBpKyspCi0JCWRwcmludGsoIiAlMDJ4IiwgaHdfYnVmZmVyLT5tc2dbaV0pOwotCWRwcmludGsoIl1cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSkKLXsKLQlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCAoaHdfYnVmZmVyLT5sZW5ndGggKyAxKSwgaHdfYnVmZmVyLT5tc2csIHJlcGx5KSkgPCAwKSB7CisJaWYgKChkc3RfcHV0X2NpKHN0YXRlLCBod19idWZmZXItPm1zZywgbGVuZ3RoLCBod19idWZmZXItPm1zZywgcmVwbHkpKSA8IDApIHsKIAkJZHByaW50aygiJXM6IERTVC1DSSBDb21tYW5kIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWRwcmludGsoIiVzOiBSZXNldHRpbmcgRFNULlxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmRjX3Jlc2V0X3N0YXRlKHN0YXRlKTsKQEAgLTMzNCwyMzQgKzMyOCwxNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGNhX3NldF9wbXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSwgdTggcXVlcnkpCit1MzIgYXNuXzFfZGVjb2RlKHU4ICphc25fMV9hcnJheSkKIHsKLQl1MzIgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0LCBpLCBrOwotCXUzMiBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMCwgZXNfaW5mb19sZW5ndGggPSAwLCBsZW5ndGggPSAwLCB3b3JkcyA9IDA7Ci0JdTggZm91bmRfcHJvZ19jYV9kZXNjID0gMCwgZm91bmRfc3RyZWFtX2NhX2Rlc2MgPSAwLCBlcnJvcl9jb25kaXRpb24gPSAwLCBod19idWZmZXJfbGVuZ3RoID0gMDsKKwl1OCBsZW5ndGhfZmllbGQgPSAwLCB3b3JkX2NvdW50ID0gMCwgY291bnQgPSAwOworCXUzMiBsZW5ndGggPSAwOwogCi0JaWYgKHZlcmJvc2UgPiAzKQotCQlkcHJpbnRrKCIlcywgcF9jYV9tZXNzYWdlIGxlbmd0aCAlZCAoMHgleClcbiIsIF9fRlVOQ1RJT05fXyxwX2NhX21lc3NhZ2UtPmxlbmd0aCxwX2NhX21lc3NhZ2UtPmxlbmd0aCApOwotCi0JaGFuZGxlX2VuNTAyMjFfdGFnKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlcik7CQkJLyoJRU41MDIyMSB0YWcJCSovCi0KLQkvKglIYW5kbGUgdGhlIGxlbmd0aCBmaWVsZCAodmFyaWFibGUpCSovCi0JaWYgKCEocF9jYV9tZXNzYWdlLT5tc2dbM10gJiAweDgwKSkgewkJCQkvKglMZW5ndGggPSAxCQkqLwotCQlsZW5ndGggPSBwX2NhX21lc3NhZ2UtPm1zZ1szXSAmIDB4N2Y7Ci0JCXdvcmRzID0gMDsJCQkJCQkvKglkb21pJ3Mgc3VnZ2VzdGlvbgkqLwotCX0KLQllbHNlIHsJCQkJCQkJCS8qCUxlbmd0aCA9IHdvcmRzCQkqLwotCQl3b3JkcyA9IHBfY2FfbWVzc2FnZS0+bXNnWzNdICYgMHg3ZjsKLQkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKLQkJCWxlbmd0aCA9IGxlbmd0aCA8PCA4OwotCQkJbGVuZ3RoID0gbGVuZ3RoIHwgcF9jYV9tZXNzYWdlLT5tc2dbNCArIGldOworCWxlbmd0aF9maWVsZCA9IGFzbl8xX2FycmF5WzBdOworCWRwcmludGsoIiVzOiBMZW5ndGggZmllbGQ9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aF9maWVsZCk7CisJaWYgKGxlbmd0aF9maWVsZCA8IDB4ODApIHsKKwkJbGVuZ3RoID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKKwkJZHByaW50aygiJXM6IExlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwl9IGVsc2UgeworCQl3b3JkX2NvdW50ID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgd29yZF9jb3VudDsgY291bnQrKykgeworCQkJbGVuZ3RoID0gKGxlbmd0aCB8IGFzbl8xX2FycmF5W2NvdW50ICsgMV0pIDw8IDg7CisJCQlkcHJpbnRrKCIlczogTGVuZ3RoPVslMDR4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOwogCQl9CiAJfQotCWlmICh2ZXJib3NlID4gNCkgewotCQlkcHJpbnRrKCIlczpMZW5ndGg9WyVkICgweCV4KV0sIFdvcmRzPVslZF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoLGxlbmd0aCwgd29yZHMpOworCXJldHVybiBsZW5ndGg7Cit9CiAKLQkJLyoJRGVidWcgSW5wdXQgc3RyaW5nCQkqLwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlkcHJpbnRrKCIgJTAyeCIsIHBfY2FfbWVzc2FnZS0+bXNnW2ldKTsKLQkJZHByaW50aygiXVxuIik7Ci0JfQotCi0JaHdfb2Zmc2V0ID0gNzsKLQlidWZfb2Zmc2V0ID0gd29yZHMgKyA0OwotCi0JLyoJCVByb2dyYW0gSGVhZGVyCQkJKi8KLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIlxuJXM6UHJvZ3JhbSBIZWFkZXI9WyIsIF9fRlVOQ1RJT05fXyk7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JCWlmICh2ZXJib3NlID4gNCkKLQkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF0pOwotCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKys7Ci0JfQotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiXVxuIik7Ci0KLQlwcm9ncmFtX2luZm9fbGVuZ3RoID0gMDsKLQlwcm9ncmFtX2luZm9fbGVuZ3RoID0gKCgocHJvZ3JhbV9pbmZvX2xlbmd0aCB8IHBfY2FfbWVzc2FnZS0+bXNnW3dvcmRzICsgOF0pICYgMHgwZikgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1t3b3JkcyArIDldOwotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6UHJvZ3JhbSBpbmZvIExlbmd0aD1bJWRdWyUwMnhdLCBod19vZmZzZXQ9WyVkXSwgYnVmX29mZnNldD1bJWRdIFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0KTsKLQotCWlmIChwcm9ncmFtX2luZm9fbGVuZ3RoICYmIChwcm9ncmFtX2luZm9fbGVuZ3RoIDwgMjU2KSkgewkvKglJZiBwcm9ncmFtX2luZm9fbGVuZ3RoCQkqLwotCQlod19idWZmZXItPm1zZ1sxMV0gPSBod19idWZmZXItPm1zZ1sxMV0gJiAweDBmOwkJLyoJcmVxIG9ubHkgNCBiaXRzCQkJKi8KLQkJaHdfYnVmZmVyLT5tc2dbMTJdID0gaHdfYnVmZmVyLT5tc2dbMTJdICsgMTsJCS8qCWluY3JlbWVudCEgQVNJQyBidWchCQkqLwotCi0JCWlmIChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0gPT0gMHgwOSkgewkvKglDaGVjayBDQSBkZXNjcmlwdG9yCQkqLwotCQkJZm91bmRfcHJvZ19jYV9kZXNjID0gMTsKLQkJCWlmICh2ZXJib3NlID4gNCkKLQkJCQlkcHJpbnRrKCIlczogRm91bmQgQ0EgZGVzY3JpcHRvciBAIFByb2dyYW0gbGV2ZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0KLQotCQlpZiAoZm91bmRfcHJvZ19jYV9kZXNjKSB7CQkJCS8qCUNvbW1hbmQgb25seSBpZiBDQSBkZXNjcmlwdG9yCSovCi0JCQlod19idWZmZXItPm1zZ1sxM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsJLyoJQ0EgUE1UIGNvbW1hbmQgSUQJKi8KLQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKzsKLQkJfQotCi0JCS8qCQkJUHJvZ3JhbSBkZXNjcmlwdG9ycwkJCQkqLwotCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCWRwcmludGsoIiVzOioqKioqKioqKio+YnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBidWZfb2Zmc2V0LCBod19vZmZzZXQpOwotCQkJZHByaW50aygiJXM6UHJvZ3JhbSBkZXNjcmlwdG9ycz1bIiwgX19GVU5DVElPTl9fKTsKLQkJfQotCQl3aGlsZSAocHJvZ3JhbV9pbmZvX2xlbmd0aCAmJiAhZXJyb3JfY29uZGl0aW9uKSB7CQkvKglDb3B5IHByb2cgZGVzY3JpcHRvcnMJKi8KLQkJCWlmIChwcm9ncmFtX2luZm9fbGVuZ3RoID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpIHsJLyoJRXJyb3Igc2l0dWF0aW9uCQkqLwotCQkJCWRwcmludGsgKCIlczpcIldBUk5JTkdcIiBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgcHJvZ19pbmZvX2xlbmd0aD1bJWRdXG4iLAotCQkJCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoKTsKLQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBCYWlsaW5nIG91dCBvZiBwb3NzaWJsZSBsb29wXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCWVycm9yX2NvbmRpdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKLQkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF0pOwotCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrLCBwcm9ncmFtX2luZm9fbGVuZ3RoLS07Ci0JCX0KLQkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQlkcHJpbnRrKCJdXG4iKTsKLQkJCWRwcmludGsoIiVzOioqKioqKioqKio+YnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBidWZfb2Zmc2V0LCBod19vZmZzZXQpOwotCQl9Ci0JCWlmIChmb3VuZF9wcm9nX2NhX2Rlc2MpIHsKLQkJCWlmICghcmVwbHkpIHsKLQkJCQlod19idWZmZXItPm1zZ1sxM10gPSAweDAxOwkJLyoJT0sgZGVzY3JhbWJsaW5nCQkJKi8KLQkJCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJCWRwcmludGsoIkNBIFBNVCBDb21tYW5kID0gT0sgRGVzY3JhbWJsaW5nXG4iKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDI7CQkvKglPayBNTUkJCQkJKi8KLQkJCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJCWRwcmludGsoIkNBIFBNVCBDb21tYW5kID0gT2sgTU1JXG4iKTsKLQkJCX0KLQkJCWlmIChxdWVyeSkgewotCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDM7CQkvKglRdWVyeQkJCQkqLwotCQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBDQSBQTVQgcXVlcnlcbiIpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlod19idWZmZXItPm1zZ1sxMV0gPSBod19idWZmZXItPm1zZ1sxMV0gJiAweGYwOwkJLyoJRG9uJ3Qgd3JpdGUgdG8gQVNJQwkJKi8KLQkJaHdfYnVmZmVyLT5tc2dbMTJdID0gaHdfYnVmZmVyLT5tc2dbMTJdID0gMHgwMDsKLQl9Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczoqKioqKioqKioqPnBfY2FfbWVzc2FnZS0+bGVuZ3RoPVslZF0sIGJ1Zl9vZmZzZXQ9WyVkXSwgaHdfb2Zmc2V0PVslZF1cbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcF9jYV9tZXNzYWdlLT5sZW5ndGgsIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7Ci0KLQl3aGlsZSAoKGJ1Zl9vZmZzZXQgIDwgcF9jYV9tZXNzYWdlLT5sZW5ndGgpICAmJiAhZXJyb3JfY29uZGl0aW9uKSB7Ci0JCS8qCUJhaWwgb3V0IGluIGNhc2Ugb2YgYW4gaW5kZWZpbml0ZSBsb29wCQkqLwotCQlpZiAoKGVzX2luZm9fbGVuZ3RoID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpIHx8IChidWZfb2Zmc2V0ID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpKSB7Ci0JCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgcHJvZ19pbmZvX2xlbmd0aD1bJWRdLCBidWZfb2Zmc2V0PVslZF1cbiIsCi0JCQkJCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgYnVmX29mZnNldCk7Ci0KLQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEJhaWxpbmcgb3V0IG9mIHBvc3NpYmxlIGxvb3BcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQllcnJvcl9jb25kaXRpb24gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgkJU3RyZWFtIEhlYWRlcgkJCQkqLwotCi0JCWZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKLQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCArIGtdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIGtdOwotCQl9Ci0KLQkJZXNfaW5mb19sZW5ndGggPSAwOwotCQllc19pbmZvX2xlbmd0aCA9IChlc19pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10gJiAweDBmKSkgPDwgOCB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XTsKLQotCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCWRwcmludGsoIlxuJXM6LS0tLS0+U3RyZWFtIGhlYWRlcj1bJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XVxuIiwgX19GVU5DVElPTl9fLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAwXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDFdLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAyXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDNdLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XSk7Ci0KLQkJCWRwcmludGsoIiVzOi0tLS0tPlN0cmVhbSB0eXBlPVslMDJ4XSwgZXMgbGVuZ3RoPVslZCAoMHgleCldLCBDaGFycz1bJTAyeF0gWyUwMnhdLCBidWZfb2Zmc2V0PVslZF1cbiIsIF9fRlVOQ1RJT05fXywKLQkJCQlwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMF0sIGVzX2luZm9fbGVuZ3RoLCBlc19pbmZvX2xlbmd0aCwKLQkJCQlwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10sIHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XSwgYnVmX29mZnNldCk7Ci0JCX0KLQotCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyAzXSAmPSAweDBmOwkJCS8qCXJlcSBvbmx5IDQgYml0cwkJCSovCi0KLQkJaWYgKGZvdW5kX3Byb2dfY2FfZGVzYykgewotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsgM10gPSAweDAwOwotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsgNF0gPSAweDAwOwotCQl9Ci0KLQkJaHdfb2Zmc2V0ICs9IDUsIGJ1Zl9vZmZzZXQgKz0gNSwgaHdfYnVmZmVyX2xlbmd0aCArPSA1OwotCi0JCS8qCQlDaGVjayBmb3IgQ0EgZGVzY3JpcHRvcgkJCSovCi0JCWlmIChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0gPT0gMHgwOSkgewotCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCWRwcmludGsoIiVzOkZvdW5kIENBIGRlc2NyaXB0b3IgQCBTdHJlYW0gbGV2ZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlmb3VuZF9zdHJlYW1fY2FfZGVzYyA9IDE7Ci0JCX0KLQotCQkvKgkJRVMgZGVzY3JpcHRvcnMJCQkJKi8KLQotCQlpZiAoZXNfaW5mb19sZW5ndGggJiYgIWVycm9yX2NvbmRpdGlvbiAmJiAhZm91bmRfcHJvZ19jYV9kZXNjICYmIGZvdW5kX3N0cmVhbV9jYV9kZXNjKSB7Ci0vLwkJCWlmICghY2FfcG10X2RvbmUpIHsKLQkJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07CS8qCUNBIFBNVCBjbWQoZXMpCSovCi0JCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCQlwcmludGsoIiVzOi0tLS0tPkNBIFBNVCBDb21tYW5kIElEPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7Ci0vLwkJCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIGVzX2luZm9fbGVuZ3RoLS0sIGNhX3BtdF9kb25lID0gMTsKLQkJCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIGVzX2luZm9fbGVuZ3RoLS07Ci0vLwkJCX0KLQkJCWlmICh2ZXJib3NlID4gNCkKLQkJCQlkcHJpbnRrKCIlczotLS0tLT5FUyBkZXNjcmlwdG9ycz1bIiwgX19GVU5DVElPTl9fKTsKLQotCQkJd2hpbGUgKGVzX2luZm9fbGVuZ3RoICYmICFlcnJvcl9jb25kaXRpb24pIHsJLyoJRVMgZGVzY3JpcHRvcnMJCQkqLwotCQkJCWlmICgoZXNfaW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgfHwgKGJ1Zl9vZmZzZXQgPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkpIHsKLQkJCQkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBFUyBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgZXNfaW5mb19sZW5ndGg9WyVkXSwgYnVmX29mZnNldD1bJWRdXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIGVzX2luZm9fbGVuZ3RoLCBidWZfb2Zmc2V0KTsKLQotCQkJCQkJZHByaW50aygiJXM6XCJXQVJOSU5HXCIgQmFpbGluZyBvdXQgb2YgcG9zc2libGUgbG9vcFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQkJfQotCQkJCQllcnJvcl9jb25kaXRpb24gPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlMDJ4ICIsIGh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0pOwotCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLTsKLQkJCX0KLQkJCWZvdW5kX3N0cmVhbV9jYV9kZXNjID0gMDsJCQkvKgl1bnNldCBmb3IgbmV3IHN0cmVhbXMJCSovCi0JCQlkcHJpbnRrKCJdXG4iKTsKLQkJfQotCX0KLQotCS8qCQlNQ1UgTWFnaWMgd29yZHMJCQkJCSovCi0KLQlod19idWZmZXJfbGVuZ3RoICs9IDc7Ci0JaHdfYnVmZmVyLT5tc2dbMF0gPSBod19idWZmZXJfbGVuZ3RoOwotCWh3X2J1ZmZlci0+bXNnWzFdID0gNjQ7Ci0JaHdfYnVmZmVyLT5tc2dbNF0gPSAzOwotCWh3X2J1ZmZlci0+bXNnWzVdID0gaHdfYnVmZmVyLT5tc2dbMF0gLSA3OwotCWh3X2J1ZmZlci0+bXNnWzZdID0gMDsKLQotCi0JLyogICAgICBGaXggbGVuZ3RoICAgICAgKi8KLQlod19idWZmZXItPmxlbmd0aCA9IGh3X2J1ZmZlci0+bXNnWzBdOwotCi0JcHV0X2NoZWNrc3VtKCZod19idWZmZXItPm1zZ1swXSwgaHdfYnVmZmVyLT5tc2dbMF0pOwotCS8qICAgICAgRG8gdGhlIGFjdHVhbCB3cml0ZSAgICAgKi8KLQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJZHByaW50aygiJXM6PT09PT09PT09PT09PT09PT09PT09PURFQlVHR0lORz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkcHJpbnRrKCIlczogQWN0dWFsIExlbmd0aD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGh3X2J1ZmZlcl9sZW5ndGgpOwotCX0KLQkvKiAgICAgIE9ubHkgZm9yIGRlYnVnZ2luZyEgICAgICovCi0JaWYgKHZlcmJvc2UgPiAyKQotCQlkZWJ1Z184ODIwX2J1ZmZlcihod19idWZmZXIpOwotCWlmICh2ZXJib3NlID4gMykKLQkJZHByaW50aygiJXM6IFJlcGx5ID0gWyVkXVxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7Ci0Jd3JpdGVfdG9fODgyMChzdGF0ZSwgaHdfYnVmZmVyLCByZXBseSk7CitzdGF0aWMgaW50IGluaXRfYnVmZmVyKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpCit7CisJdTMyIGk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlidWZmZXJbaV0gPSAwOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGVidWdfc3RyaW5nKHU4ICptc2csIHUzMiBsZW5ndGgsIHUzMiBvZmZzZXQpCit7CisJdTMyIGk7CisKKwlkcHJpbnRrKCIgU3RyaW5nPVsgIik7CisJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspCisJCWRwcmludGsoIiUwMnggIiwgbXNnW2ldKTsKKwlkcHJpbnRrKCJdXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfc3RyaW5nKHU4ICpkZXN0aW5hdGlvbiwgdTggKnNvdXJjZSwgdTMyIGRlc3Rfb2Zmc2V0LCB1MzIgc291cmNlX29mZnNldCwgdTMyIGxlbmd0aCkKK3sKKwl1MzIgaTsKKwlkcHJpbnRrKCIlczogQ29weWluZyBbIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZGVzdGluYXRpb25baSArIGRlc3Rfb2Zmc2V0XSA9IHNvdXJjZVtpICsgc291cmNlX29mZnNldF07CisJCWRwcmludGsoIiAlMDJ4Iiwgc291cmNlW2kgKyBzb3VyY2Vfb2Zmc2V0XSk7CisJfQorCWRwcmludGsoIl1cbiIpOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbW9kaWZ5XzRfYml0cyh1OCAqbWVzc2FnZSwgdTMyIHBvcykKK3sKKwltZXNzYWdlW3Bvc10gJj0gMHgwZjsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBjYV9zZXRfcG10KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlciwgdTggcmVwbHksIHU4IHF1ZXJ5KQoreworCXUzMiBsZW5ndGggPSAwLCBjb3VudCA9IDA7CisJdTggYXNuXzFfd29yZHMsIHByb2dyYW1faGVhZGVyX2xlbmd0aDsKKwl1MTYgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9IDAsIGVzX2luZm9fbGVuZ3RoID0gMDsKKwl1MzIgaHdfb2Zmc2V0ID0gMCwgYnVmX29mZnNldCA9IDAsIGk7CisJdTggZHN0X3RhZ19sZW5ndGg7CisKKwlsZW5ndGggPSBhc25fMV9kZWNvZGUoJnBfY2FfbWVzc2FnZS0+bXNnWzNdKTsKKwlkcHJpbnRrKCIlczogQ0EgTWVzc2FnZSBsZW5ndGg9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCWRwcmludGsoIiVzOiBBU04uMSAiLCBfX0ZVTkNUSU9OX18pOworCWRlYnVnX3N0cmluZygmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIGxlbmd0aCwgMCk7IC8vIGxlbmd0aCBkb2VzIG5vdCBpbmNsdWRlIHRhZyBhbmQgbGVuZ3RoCisKKwlpbml0X2J1ZmZlcihod19idWZmZXItPm1zZywgbGVuZ3RoKTsKKwloYW5kbGVfZHN0X3RhZyhzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIGxlbmd0aCk7CisKKwlod19vZmZzZXQgPSA3OworCWFzbl8xX3dvcmRzID0gMTsgLy8ganVzdCBhIGhhY2sgdG8gdGVzdCwgc2hvdWxkIGNvbXB1dGUgdGhpcyBvbmUKKwlidWZfb2Zmc2V0ID0gMzsKKwlwcm9ncmFtX2hlYWRlcl9sZW5ndGggPSA2OworCWRzdF90YWdfbGVuZ3RoID0gNzsKKworLy8JZGVidWdfdHdpbmhhbl9jYV9wYXJhbXMoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCByZXBseSwgcXVlcnksIGxlbmd0aCwgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0KTsKKy8vCWRwcmludGsoIiVzOiBQcm9ncmFtIEhlYWRlcihCVUYpIiwgX19GVU5DVElPTl9fKTsKKy8vCWRlYnVnX3N0cmluZygmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIHByb2dyYW1faGVhZGVyX2xlbmd0aCwgMCk7CisvLwlkcHJpbnRrKCIlczogQ29weWluZyBQcm9ncmFtIGhlYWRlclxuIiwgX19GVU5DVElPTl9fKTsKKwljb3B5X3N0cmluZyhod19idWZmZXItPm1zZywgcF9jYV9tZXNzYWdlLT5tc2csIGh3X29mZnNldCwgKGJ1Zl9vZmZzZXQgKyBhc25fMV93b3JkcyksIHByb2dyYW1faGVhZGVyX2xlbmd0aCk7CisJYnVmX29mZnNldCArPSBwcm9ncmFtX2hlYWRlcl9sZW5ndGgsIGh3X29mZnNldCArPSBwcm9ncmFtX2hlYWRlcl9sZW5ndGg7CisJbW9kaWZ5XzRfYml0cyhod19idWZmZXItPm1zZywgKGh3X29mZnNldCAtIDIpKTsKKwlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfSU5DX0NPVU5UKSB7CS8vIHdvcmthcm91bmQKKwkJZHByaW50aygiJXM6IFByb2JhYmx5IGFuIEFTSUMgYnVnICEhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0ICsgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoKSwgMCk7CisJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCAtIDFdICs9IDE7CisJfQorCisvLwlkcHJpbnRrKCIlczogUHJvZ3JhbSBIZWFkZXIoSFcpLCBDb3VudD1bJWRdIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisvLwlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgMCk7CisKKwlwcm9ncmFtX2luZm9fbGVuZ3RoID0gICgocHJvZ3JhbV9pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0IC0gMV0gJiAweDBmKSkgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwlkcHJpbnRrKCIlczogUHJvZ3JhbSBpbmZvIGxlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCk7CisJaWYgKHByb2dyYW1faW5mb19sZW5ndGgpIHsKKwkJY291bnQgPSBjb3B5X3N0cmluZyhod19idWZmZXItPm1zZywgcF9jYV9tZXNzYWdlLT5tc2csIGh3X29mZnNldCwgKGJ1Zl9vZmZzZXQgKyAxKSwgKHByb2dyYW1faW5mb19sZW5ndGggKyAxKSApOyAvLyBjb3B5IG5leHQgZWxlbSwgbm90IGN1cnJlbnQKKwkJYnVmX29mZnNldCArPSBjb3VudCwgaHdfb2Zmc2V0ICs9IGNvdW50OworLy8JCWRwcmludGsoIiVzOiBQcm9ncmFtIGxldmVsICIsIF9fRlVOQ1RJT05fXyk7CisvLwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBod19vZmZzZXQsIDApOworCX0KKworCWJ1Zl9vZmZzZXQgKz0gMTsvLyBod19vZmZzZXQgKz0gMTsKKwlmb3IgKGkgPSBidWZfb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKKy8vCQlkcHJpbnRrKCIlczogU3RyZWFtIEhlYWRlciAiLCBfX0ZVTkNUSU9OX18pOworCQljb3VudCA9IGNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0LCA1KTsKKwkJbW9kaWZ5XzRfYml0cyhod19idWZmZXItPm1zZywgKGh3X29mZnNldCArIDMpKTsKKworCQlod19vZmZzZXQgKz0gNSwgYnVmX29mZnNldCArPSA1LCBpICs9IDQ7CisvLwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBod19vZmZzZXQsIChod19vZmZzZXQgLSA1KSk7CisJCWVzX2luZm9fbGVuZ3RoID0gKChlc19pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0IC0gMV0gJiAweDBmKSkgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwkJZHByaW50aygiJXM6IEVTIGluZm8gbGVuZ3RoPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBlc19pbmZvX2xlbmd0aCk7CisJCWlmIChlc19pbmZvX2xlbmd0aCkgeworCQkJLy8gY29weSBkZXNjcmlwdG9ycyBAIFNUUkVBTSBsZXZlbAorCQkJZHByaW50aygiJXM6IERlc2NyaXB0b3JzIEAgU1RSRUFNIGxldmVsLi4uISEhIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCisJfQorCWh3X2J1ZmZlci0+bXNnW2xlbmd0aCArIGRzdF90YWdfbGVuZ3RoXSA9IGRzdF9jaGVja19zdW0oaHdfYnVmZmVyLT5tc2csIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCkpOworLy8JZHByaW50aygiJXM6IFRvdGFsIGxlbmd0aD1bJWRdLCBDaGVja3N1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoKSwgaHdfYnVmZmVyLT5tc2dbbGVuZ3RoICsgZHN0X3RhZ19sZW5ndGhdKTsKKwlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCArIDEpLCAwKTsJLy8gZHN0IHRhZ3MgYWxzbworCXdyaXRlX3RvXzg4MjAoc3RhdGUsIGh3X2J1ZmZlciwgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoICsgMSksIHJlcGx5KTsJLy8gY2hlY2tzdW0KKworCXJldHVybiAwOworfQorCisKIC8qCUJvYXJkIHN1cHBvcnRzIENBIFBNVCByZXBseSA/CQkqLwogc3RhdGljIGludCBkc3RfY2hlY2tfY2FfcG10KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcikKIHsKQEAgLTYwNSw3ICs1MDYsNyBAQAogCXN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcjsKIAogCWlmICgoaHdfYnVmZmVyID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmICh2ZXJib3NlID4gMykKQEAgLTYzMCw4ICs1MzEsMTAgQEAKIAkJc3dpdGNoIChjb21tYW5kKSB7CiAJCQljYXNlIENBX1BNVDoKIAkJCQlpZiAodmVyYm9zZSA+IDMpCisvLwkJCQkJZHByaW50aygiQ29tbWFuZCA9IFNFTkRfQ0FfUE1UXG4iKTsKIAkJCQkJZHByaW50aygiQ29tbWFuZCA9IFNFTkRfQ0FfUE1UXG4iKTsKLQkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CisvLwkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CisJCQkJaWYgKChjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMCwgMCkpIDwgMCkgewkvLyBjb2RlIHNpbXBsaWZpY2F0aW9uIHN0YXJ0ZWQKIAkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVCBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KQEAgLTY2NCw3ICs1NjcsNyBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCQkJCWlmICh2ZXJib3NlID4gMykKLQkJCQkJcHJpbnRrKCIlczogLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCWRwcmludGsoIiVzOiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKIAogCQkJCWJyZWFrOwogCQl9CkBAIC02ODEsMTcgKzU4NCwxNyBAQAogCXN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZTsKIAogCWlmICgocF9jYV9tZXNzYWdlID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKChwX2NhX3Nsb3RfaW5mbyA9IChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlmICgocF9jYV9jYXBzID0gKHN0cnVjdCBjYV9jYXBzICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaAppbmRleCAwYjNkYTI5Li5lZjUzMmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCkBAIC00Nyw2ICs0Nyw4IEBACiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18yCTE2CiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18zCTMyCiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV19CVUlMRAk2NAorI2RlZmluZSBEU1RfVFlQRV9IQVNfT0JTX1JFR1MJMTI4CisjZGVmaW5lIERTVF9UWVBFX0hBU19JTkNfQ09VTlQJMjU2CiAKIC8qCUNhcmQgY2FwYWJpbGl0eSBsaXN0CSovCiAKQEAgLTExMCw2ICsxMTIsNyBAQAogCXUzMiBkc3RfaHdfY2FwOwogCXU4IGRzdF9md192ZXJzaW9uOwogCWZlX3NlY19taW5pX2NtZF90IG1pbmljbWQ7CisJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CiAJdTggbWVzc2FnZXNbMjU2XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwppbmRleCA5NmM1N2ZkLi43ZDhiM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC02OTksNiArNjk5LDggQEAKIAlmb3IgKG49MDsgbGVuPjAgJiYgbjwobGVuL3NpemVvZihyY19ldmVudHNbMF0pKTsgbisrKSB7CiAJCWludCBpOwogCisvKgkJZHByaW50aygxLCJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsbixsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpLHJjX2V2ZW50c1tuXS50eXBlKTsqLworCiAJCWlmIChyY19ldmVudHNbbl0udHlwZSA9PSBDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMgJiYKIAkJICAgIHJjX2V2ZW50c1tuXS52YWx1ZSA9PSB+MCkKIAkJewpAQCAtNzE0LDcgKzcxNiw3IEBACiAJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKIAkJCWZvciAoaT0wOyBpPHNpemVvZihyY19rZXlzKS9zaXplb2YocmNfa2V5c1swXSk7IGkrPTMpIHsKIAkJCQlpZiAocmNfa2V5c1tpKzBdID09IHJjX2V2ZW50c1tuXS50eXBlICYmCi0JCQkJICAgIHJjX2tleXNbaSsxXSA9PSByY19ldmVudHNbbl0udmFsdWUpCisJCQkJICAgIHJjX2tleXNbaSsxXSA9PSBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpKQogCQkJCXsKIAkJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IHJjX2tleXNbaSsyXTsKIAkJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCmluZGV4IGMyMjVkZTcuLjY4MDUwY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC00MiwxMiArNDIsNiBAQAogCiAjZGVmaW5lIGRwcmludGsJaWYgKGRlYnVnKSBwcmludGsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqCi1kdmJfZG14ZGV2X2ZpbGVfdG9fZmlsdGVyKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAoc3RydWN0IGRteGRldl9maWx0ZXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHZiX2RteGRldl9idWZmZXJfaW5pdChzdHJ1Y3QgZG14ZGV2X2J1ZmZlciAqYnVmZmVyKQogewogCWJ1ZmZlci0+ZGF0YT1OVUxMOwpAQCAtNjY5LDggKzY2MywxMCBAQAogCiAJCXJldCA9IGZpbHRlci0+ZmVlZC50cy0+c3RhcnRfZmlsdGVyaW5nKGZpbHRlci0+ZmVlZC50cyk7CiAKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQgPCAwKSB7CisJCQlkbXhkZXYtPmRlbXV4LT5yZWxlYXNlX3RzX2ZlZWQoZG14ZGV2LT5kZW11eCwgKnRzZmVlZCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAKIAkJYnJlYWs7CiAJfQpAQCAtODQyLDcgKzgzOCw3IEBACiBzdGF0aWMgc3NpemVfdAogZHZiX2RlbXV4X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXI9ZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihmaWxlKTsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldD0wOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZG14ZGV2ZmlsdGVyLT5tdXRleCkpCkBAIC04NjMsNyArODU5LDcgQEAKIHN0YXRpYyBpbnQgZHZiX2RlbXV4X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyPWR2Yl9kbXhkZXZfZmlsZV90b19maWx0ZXIoZmlsZSk7CisJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXY9ZG14ZGV2ZmlsdGVyLT5kZXY7CiAJdW5zaWduZWQgbG9uZyBhcmc9KHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldD0wOwpAQCAtOTYwLDcgKzk1Niw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZHZiX2RlbXV4X3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBkdmJfZG14ZGV2X2ZpbGVfdG9fZmlsdGVyKGZpbGUpOworCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJaWYgKCFkbXhkZXZmaWx0ZXIpCkBAIC05ODUsNyArOTgxLDcgQEAKIAogc3RhdGljIGludCBkdmJfZGVtdXhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihmaWxlKTsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGRteGRldmZpbHRlci0+ZGV2OwogCiAJcmV0dXJuIGR2Yl9kbXhkZXZfZmlsdGVyX2ZyZWUoZG14ZGV2LCBkbXhkZXZmaWx0ZXIpOwpAQCAtMTEwOSw3ICsxMTA1LDYgQEAKIAkJZHZiX2RteGRldl9maWx0ZXJfc3RhdGVfc2V0KCZkbXhkZXYtPmZpbHRlcltpXSwgRE1YREVWX1NUQVRFX0ZSRUUpOwogCQlkbXhkZXYtPmR2cltpXS5kZXY9ZG14ZGV2OwogCQlkbXhkZXYtPmR2cltpXS5idWZmZXIuZGF0YT1OVUxMOwotCQlkdmJfZG14ZGV2X2ZpbHRlcl9zdGF0ZV9zZXQoJmRteGRldi0+ZmlsdGVyW2ldLCBETVhERVZfU1RBVEVfRlJFRSk7CiAJCWR2Yl9kbXhkZXZfZHZyX3N0YXRlX3NldCgmZG14ZGV2LT5kdnJbaV0sIERNWERFVl9TVEFURV9GUkVFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggZjExZGFhZS4uYThiYzg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKIAorLy8gI2RlZmluZSBERUJVR19MT0NLTE9TUyAxCisKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2RlYnVnOwogc3RhdGljIGludCBkdmJfc2h1dGRvd25fdGltZW91dCA9IDU7CiBzdGF0aWMgaW50IGR2Yl9mb3JjZV9hdXRvX2ludmVyc2lvbjsKQEAgLTExMyw2ICsxMTUsNyBAQAogCWludCBleGl0OwogCWludCB3YWtldXA7CiAJZmVfc3RhdHVzX3Qgc3RhdHVzOworCWZlX3NlY190b25lX21vZGVfdCB0b25lOwogfTsKIAogCkBAIC00MzQsOSArNDM3LDI2IEBACiAJCQkvKiB3ZSdyZSB0dW5lZCwgYW5kIHRoZSBsb2NrIGlzIHN0aWxsIGdvb2QuLi4gKi8KIAkJCWlmIChzICYgRkVfSEFTX0xPQ0spCiAJCQkJY29udGludWU7Ci0JCQllbHNlIHsKLQkJCQkvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2ssCi0JCQkJICogbmVlZCB0byB6aWd6YWcgKi8KKwkJCWVsc2UgeyAvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2sgKi8KKyNpZmRlZiBERUJVR19MT0NLTE9TUworCQkJCS8qIGZpcnN0IG9mIGFsbCB0cnkgc2V0dGluZyB0aGUgdG9uZSBhZ2FpbiBpZiBpdCB3YXMgb24gLSB0aGlzCisJCQkJICogc29tZXRpbWVzIHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIG5vaXN5IHBvd2VyIHN1cHBsaWVzICovCisJCQkJaWYgKGZlLT5vcHMtPnNldF90b25lICYmIChmZXByaXYtPnRvbmUgPT0gU0VDX1RPTkVfT04pKSB7CisJCQkJCWZlLT5vcHMtPnNldF90b25lKGZlLCBmZXByaXYtPnRvbmUpOworCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJcyA9IDA7CisJCQkJCWZlLT5vcHMtPnJlYWRfc3RhdHVzKGZlLCAmcyk7CisJCQkJCWlmIChzICYgRkVfSEFTX0xPQ0spIHsKKwkJCQkJCXByaW50aygiRFZCJWk6IExvY2sgd2FzIGxvc3QsIGJ1dCByZWdhaW5lZCBieSBzZXR0aW5nICIKKwkJCQkJCSAgICAgICAidGhlIHRvbmUuIFRoaXMgbWF5IGluZGljYXRlIHlvdXIgcG93ZXIgc3VwcGx5ICIKKwkJCQkJCSAgICAgICAiaXMgbm9pc3kvc2xpZ2h0bHkgaW5jb21wYXRhYmxlIHdpdGggdGhpcyBEVkItUyAiCisJCQkJCQkgICAgICAgImFkYXB0ZXJcbiIsIGZlLT5kdmItPm51bSk7CisJCQkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJLyogc29tZSBvdGhlciByZWFzb24gZm9yIGxvc2luZyB0aGUgbG9jayAtIHN0YXJ0IHppZ3phZ2dpbmcgKi8KIAkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9aSUdaQUdfRkFTVDsKIAkJCQlmZXByaXYtPnN0YXJ0ZWRfYXV0b19zdGVwID0gZmVwcml2LT5hdXRvX3N0ZXA7CiAJCQkJY2hlY2tfd3JhcHBlZCA9IDA7CkBAIC02MjYsMTEgKzY0NiwyMSBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIEZFX1JFQURfU1RBVFVTOgotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgKGZlX3N0YXR1c190KikgcGFyZyk7Ci0JCWJyZWFrOworCWNhc2UgRkVfUkVBRF9TVEFUVVM6IHsKKwkJZmVfc3RhdHVzX3QqIHN0YXR1cyA9IHBhcmc7CiAKKwkJLyogaWYgcmV0dW5lIHdhcyByZXF1ZXN0ZWQgYnV0IGhhc24ndCBvY2N1cmVkIHlldCwgcHJldmVudAorCQkgKiB0aGF0IHVzZXIgZ2V0IHNpZ25hbCBzdGF0ZSBmcm9tIHByZXZpb3VzIHR1bmluZyAqLworCQlpZihmZXByaXYtPnN0YXRlID09IEZFU1RBVEVfUkVUVU5FKSB7CisJCQllcnI9MDsKKwkJCSpzdGF0dXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCisJCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgRkVfUkVBRF9CRVI6CiAJCWlmIChmZS0+b3BzLT5yZWFkX2JlcikKIAkJCWVyciA9IGZlLT5vcHMtPnJlYWRfYmVyKGZlLCAoX191MzIqKSBwYXJnKTsKQEAgLTY4MSw2ICs3MTEsNyBAQAogCQkJZXJyID0gZmUtPm9wcy0+c2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOworCQkJZmVwcml2LT50b25lID0gKGZlX3NlY190b25lX21vZGVfdCkgcGFyZzsKIAkJfQogCQlicmVhazsKIApAQCAtODgzLDYgKzkxNCw3IEBACiAJaW5pdF9NVVRFWCAoJmZlcHJpdi0+ZXZlbnRzLnNlbSk7CiAJZmUtPmR2YiA9IGR2YjsKIAlmZXByaXYtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJZmVwcml2LT50b25lID0gU0VDX1RPTkVfT0ZGOwogCiAJcHJpbnRrICgiRFZCOiByZWdpc3RlcmluZyBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLAogCQlmZS0+ZHZiLT5udW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IGQyYjAyMTcuLjljMmMxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC00MCwyOCArNDAsNiBAQAogCiAjaW5jbHVkZSAiZHZiZGV2LmgiCiAKLS8qIEZJWE1FOiBNb3ZlIHRvIGkyYy1pZC5oICovCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TUDg4NzAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0NYMjI3MDAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0FUNzZDNjUxCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDI0MTEwCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDIyNzAyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9ESUIzMDAwTUIJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RTVAkJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RVTU1ZCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9MNjQ3ODEJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX01UMzEyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9NVDM1MglJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfTlhUNjAwMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfU1A4ODdYCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TVFYwMjk5CUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9UREExMDA0WAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODA4MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMTgyMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMVg5MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODBYWAlJMkNfRFJJVkVSSURfRVhQMgotCi0KIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyB7CiAgICAgICAgIGludCBtaW5fZGVsYXlfbXM7CiAgICAgICAgIGludCBzdGVwX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggOGFhMzJmNi4uNjEyZTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMywzMCArMywzNSBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgVVNCCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKLQkgIEJ5IGVuYWJsaW5nIHRoaXMgeW91IHdpbGwgYmUgYWJsZSB0byBjaG9vc2UgdGhlIHZhcmlvdXMgVVNCIDEuMSBhbmQKLQkgIFVTQjIuMCBEVkIgZGV2aWNlcy4KKwkgIEJ5IGVuYWJsaW5nIHRoaXMgeW91IHdpbGwgYmUgYWJsZSB0byBjaG9vc2UgdGhlIHZhcmlvdXMgc3VwcG9ydGVkCisJICBVU0IxLjEgYW5kIFVTQjIuMCBEVkIgZGV2aWNlcy4KIAogCSAgQWxtb3N0IGV2ZXJ5IFVTQiBkZXZpY2UgbmVlZHMgYSBmaXJtd2FyZSwgcGxlYXNlIGxvb2sgaW50bwotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2I+CisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYj4uCiAKLQkgIFNheSBZIGlmIHlvdSBvd24gYW4gVVNCIERWQiBkZXZpY2UuCisJICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBVU0IgZGV2aWNlcyBzZWUgdGhlIExpbnV4VFYgRFZCIFdpa2k6CisJICA8aHR0cDovL3d3dy5saW51eHR2Lm9yZy93aWtpL2luZGV4LnBocC9EVkJfVVNCPgorCisJICBTYXkgWSBpZiB5b3Ugb3duIGEgVVNCIERWQiBkZXZpY2UuCiAKIGNvbmZpZyBEVkJfVVNCX0RFQlVHCiAJYm9vbCAiRW5hYmxlIGV4dGVuZGVkIGRlYnVnIHN1cHBvcnQgZm9yIGFsbCBEVkItVVNCIGRldmljZXMiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCiAJaGVscAotCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGRlYnVnaW5nLiBTZWUgbW9kaW5mbyBkdmItdXNiIChhbmQgdGhlCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZGVidWdnaW5nLiBTZWUgbW9kaW5mbyBkdmItdXNiIChhbmQgdGhlCiAJICBhcHByb3ByaWF0ZSBkcml2ZXJzKSBmb3IgZGVidWcgbGV2ZWxzLgogCiBjb25maWcgRFZCX1VTQl9BODAwCiAJdHJpc3RhdGUgIkFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkgcmVjZWl2ZXIuCiAKIGNvbmZpZyBEVkJfVVNCX0RJQlVTQl9NQgogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1CKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0RJQjMwMDBNQgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFVTQiAxLjEgYW5kIDIuMCBEVkItVCByZWNlaXZlcnMgYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbnMgbWFkZSBieQogCSAgRGlCY29tICg8aHR0cDovL3d3dy5kaWJjb20uZnI+KSBlcXVpcHBlZCB3aXRoIGEgRGlCMzAwME0tQiBkZW1vZHVsYXRvci4KQEAgLTUyLDYgKzU3LDcgQEAKIGNvbmZpZyBEVkJfVVNCX0RJQlVTQl9NQwogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1DL1ApIChzZWUgaGVscCBmb3IgZGV2aWNlIGxpc3QpIgogCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfRElCMzAwME1DCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgMi4wIERWQi1UIHJlY2VpdmVycyBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWducyBtYWRlIGJ5CiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1DL1AgZGVtb2R1bGF0b3IuCkBAIC02NiwxMiArNzIsMjMgQEAKIGNvbmZpZyBEVkJfVVNCX1VNVF8wMTAKIAl0cmlzdGF0ZSAiSGFuZlRlayBVTVQtMDEwIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfRElCMzAwME1DCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBIYW5mVGVrIFVNVC0wMTAgVVNCMi4wIHN0aWNrLXNpemVkIERWQi1UIHJlY2VpdmVyLgogCitjb25maWcgRFZCX1VTQl9DWFVTQgorCXRyaXN0YXRlICJNZWRpb24gTUQ5NTcwMCBoeWJyaWQgVVNCMi4wIChDb25leGFudCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0NYMjI3MDIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE1lZGlvbiBNRDk1NzAwIGh5YnJpZCBVU0IyLjAgZGV2aWNlLiBDdXJyZW50bHkKKwkgIG9ubHkgdGhlIERWQi1UIHBhcnQgaXMgc3VwcG9ydGVkLgorCiBjb25maWcgRFZCX1VTQl9ESUdJVFYKIAl0cmlzdGF0ZSAiTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpVFYgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9OWFQ2MDAwCisJc2VsZWN0IERWQl9NVDM1MgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpdFYgVVNCMi4wIERWQi1UIHJlY2VpdmVyLgogCkBAIC04NywxMyArMTA0LDE2IEBACiBjb25maWcgRFZCX1VTQl9OT1ZBX1RfVVNCMgogCXRyaXN0YXRlICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCiAKIGNvbmZpZyBEVkJfVVNCX0RUVDIwMFUKLQl0cmlzdGF0ZSAiWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCBzdXBwb3J0IgorCXRyaXN0YXRlICJXaWRlVmlldyBXVC0yMDBVIGFuZCBXVC0yMjBVIChwZW4pIERWQi1UIFVTQjIuMCBzdXBwb3J0IChZYWt1bW8vSGFtYS9UeXBob29uL1l1YW4pIgogCWRlcGVuZHMgb24gRFZCX1VTQgogCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgV2lkZVZpZXcvWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KIAogCSAgVGhlIHJlY2VpdmVycyBhcmUgYWxzbyBrbm93biBhcyBEVFQyMDBVIChZYWt1bW8pIGFuZCBVQjMwMCAoWXVhbikuCisKKwkgIFRoZSBXVC0yMjBVIGFuZCBpdHMgY2xvbmVzIGFyZSBwZW4tc2l6ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQppbmRleCBkNjViNTBmLi43NDZkODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTI3LDQgKzI3LDcgQEAKIGR2Yi11c2ItZGlnaXR2LW9ianMgPSBkaWdpdHYubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRElHSVRWKSArPSBkdmItdXNiLWRpZ2l0di5vCiAKK2R2Yi11c2ItY3h1c2Itb2JqcyA9IGN4dXNiLm8KK29iai0kKENPTkZJR19EVkJfVVNCX0NYVVNCKSArPSBkdmItdXNiLWN4dXNiLm8KKwogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCmluZGV4IGEzNTQyOTMuLmYyZmNjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCkBAIC02MSw2ICs2MSwxMiBAQAogCXsgMHgwMiwgMHgwMCwgS0VZX0xBU1QgfSwgICAgICAgIC8qID4+fCAvIEJMVUUgKi8KIAl7IDB4MDIsIDB4MDQsIEtFWV9FUEcgfSwgICAgICAgICAvKiBFUEcgKi8KIAl7IDB4MDIsIDB4MTUsIEtFWV9NRU5VIH0sICAgICAgICAvKiBNRU5VICovCisKKwl7IDB4MDMsIDB4MDMsIEtFWV9DSEFOTkVMVVAgfSwgICAvKiBDSCBVUCAqLworCXsgMHgwMywgMHgwMiwgS0VZX0NIQU5ORUxET1dOIH0sIC8qIENIIERPV04gKi8KKwl7IDB4MDMsIDB4MDEsIEtFWV9GSVJTVCB9LCAgICAgICAvKiB8PDwgLyBHUkVFTiAqLworCXsgMHgwMywgMHgwMCwgS0VZX0xBU1QgfSwgICAgICAgIC8qID4+fCAvIEJMVUUgKi8KKwogfTsKIAogaW50IGE4MDBfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQpAQCAtNjgsNyArNzQsNyBAQAogCXU4IGtleVs1XTsKIAlpZiAodXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsMCksCiAJCQkJMHgwNCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwgMCwgMCwga2V5LCA1LAotCQkJCTIqSFopICE9IDUpCisJCQkJMjAwMCkgIT0gNSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBjYWxsIHRoZSB1bml2ZXJzYWwgTkVDIHJlbW90ZSBwcm9jZXNzb3IsIHRvIGZpbmQgb3V0IHRoZSBrZXkncyBzdGF0ZSBhbmQgZXZlbnQgKi8KQEAgLTE0Myw3ICsxNDksNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYTgwMF9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJBVmVyTWVkaWEgQXZlclRWIERWQi1UIFVTQiAyLjAgKEE4MDApIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9hODAwIiwKIAkucHJvYmUJCT0gYTgwMF9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlCT0gYTgwMF90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UxYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBsaW51eCBkcml2ZXIgZm9yIENvbmV4YW50IFVTQiByZWZlcmVuY2UgZGVzaWduLgorICoKKyAqIFRoZSBDb25leGFudCByZWZlcmVuY2UgZGVzaWduIEkgc2F3IG9uIHRoZWlyIHdlYnNpdGUgd2FzIG9ubHkgZm9yIGFuYWxvZ3VlCisgKiBjYXB0dXJpbmcgKHVzaW5nIHRoZSBjeDI1ODQyKS4gVGhlIGJveCBJIHRvb2sgdG8gd3JpdGUgdGhpcyBkcml2ZXIgKHJldmVyc2UKKyAqIGVuZ2luZWVyZWQpIGlzIHRoZSBvbmUgbGFiZWxlZCBNZWRpb24gTUQ5NTcwMC4gSW4gYWRkaXRpb24gdG8gdGhlIGN4MjU4NDIKKyAqIGZvciBhbmFsb2d1ZSBjYXB0dXJpbmcgaXQgYWxzbyBoYXMgYSBjeDIyNzAyIERWQi1UIGRlbW9kdWxhdG9yIG9uIHRoZSBtYWluCisgKiBib2FyZC4gQmVzaWRlcyBpdCBoYXMgYSBhdGlyZW1vdGUgKFgxMCkgYW5kIGEgVVNCMi4wIGh1YiBvbmJvYXJkLgorICoKKyAqIE1heWJlIGl0IGlzIGEgbGl0dGxlIGJpdCBwcmVtYXR1cmUgdG8gY2FsbCB0aGlzIGRyaXZlciBjeHVzYiwgYnV0IEkgYXNzdW1lCisgKiB0aGUgVVNCIHByb3RvY29sIGlzIGlkZW50aWNhbCBvciBhdCBsZWFzdCBpbmhlcml0ZWQgZnJvbSB0aGUgcmVmZXJlbmNlCisgKiBkZXNpZ24sIHNvIGl0IGNhbiBiZSByZXVzZWQgZm9yIHRoZSAiYW5hbG9ndWUtb25seSIgZGV2aWNlIChpZiBpdCB3aWxsCisgKiBhcHBlYXIgYXQgYWxsKS4KKyAqCisgKiBUT0RPOiBjaGVjayBpZiB0aGUgY3gyNTg0MC1kcml2ZXIgKGZyb20gaXZ0dikgY2FuIGJlIHVzZWQgZm9yIHRoZSBhbmFsb2d1ZQorICogcGFydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworI2luY2x1ZGUgImN4dXNiLmgiCisKKyNpbmNsdWRlICJjeDIyNzAyLmgiCisKKy8qIGRlYnVnICovCitpbnQgZHZiX3VzYl9jeHVzYl9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2N4dXNiX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9cmMgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworc3RhdGljIGludCBjeHVzYl9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsCisJCXU4IGNtZCwgdTggKndidWYsIGludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCisJdTggc25kYnVmWzErd2xlbl07CisJbWVtc2V0KHNuZGJ1ZiwwLDErd2xlbik7CisKKwlzbmRidWZbMF0gPSBjbWQ7CisJbWVtY3B5KCZzbmRidWZbMV0sd2J1Zix3bGVuKTsKKwlpZiAod28pCisJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLHNuZGJ1ZiwxK3dsZW4pOworCWVsc2UKKwkJZHZiX3VzYl9nZW5lcmljX3J3KGQsc25kYnVmLDErd2xlbixyYnVmLHJsZW4sMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogSTJDICovCitzdGF0aWMgdm9pZCBjeHVzYl9zZXRfaTJjX3BhdGgoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBlbnVtIGN4dXNiX2kyY19wYXRoZXMgcGF0aCkKK3sKKwlzdHJ1Y3QgY3h1c2Jfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwl1OCBvWzJdLGk7CisKKwlpZiAocGF0aCA9PSBzdC0+Y3VyX2kyY19wYXRoKQorCQlyZXR1cm47CisKKwlvWzBdID0gSU9DVExfU0VUX0kyQ19QQVRIOworCXN3aXRjaCAocGF0aCkgeworCQljYXNlIFBBVEhfQ1gyMjcwMjoKKwkJCW9bMV0gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUEFUSF9UVU5FUl9PVEhFUjoKKwkJCW9bMV0gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoInVua293biBpMmMgcGF0aCIpOworCQkJcmV0dXJuOworCX0KKwljeHVzYl9jdHJsX21zZyhkLENNRF9JT0NUTCxvLDIsJmksMSk7CisKKwlpZiAoaSAhPSAweDAxKQorCQlkZWJfaW5mbygiaTJjX3BhdGggc2V0dGluZyBmYWlsZWQuXG4iKTsKKworCXN0LT5jdXJfaTJjX3BhdGggPSBwYXRoOworfQorCitzdGF0aWMgaW50IGN4dXNiX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCxzdHJ1Y3QgaTJjX21zZyBtc2dbXSxpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IGk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfc2VtKSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKG51bSA+IDIpCisJCXdhcm4oIm1vcmUgdGhhbiAyIGkyYyBtZXNzYWdlcyBhdCBhIHRpbWUgaXMgbm90IGhhbmRsZWQgeWV0LiBUT0RPLiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisKKwkJc3dpdGNoIChtc2dbaV0uYWRkcikgeworCQkJY2FzZSAweDYzOgorCQkJCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfQ1gyMjcwMik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfVFVORVJfT1RIRVIpOworCQkJCWJyZWFrOworCQl9CisKKwkJLyogcmVhZCByZXF1ZXN0ICovCisJCWlmIChpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQl1OCBvYnVmWzMrbXNnW2ldLmxlbl0sIGlidWZbMSttc2dbaSsxXS5sZW5dOworCQkJb2J1ZlswXSA9IG1zZ1tpXS5sZW47CisJCQlvYnVmWzFdID0gbXNnW2krMV0ubGVuOworCQkJb2J1ZlsyXSA9IG1zZ1tpXS5hZGRyOworCQkJbWVtY3B5KCZvYnVmWzNdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisKKwkJCWlmIChjeHVzYl9jdHJsX21zZyhkLCBDTURfSTJDX1JFQUQsCisJCQkJCQlvYnVmLCAzK21zZ1tpXS5sZW4sCisJCQkJCQlpYnVmLCAxK21zZ1tpKzFdLmxlbikgPCAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoaWJ1ZlswXSAhPSAweDA4KQorCQkJCWRlYl9pbmZvKCJpMmMgcmVhZCBjb3VsZCBoYXZlIGJlZW4gZmFpbGVkXG4iKTsKKworCQkJbWVtY3B5KG1zZ1tpKzFdLmJ1ZiwmaWJ1ZlsxXSxtc2dbaSsxXS5sZW4pOworCisJCQlpKys7CisJCX0gZWxzZSB7IC8qIHdyaXRlICovCisJCQl1OCBvYnVmWzIrbXNnW2ldLmxlbl0sIGlidWY7CisJCQlvYnVmWzBdID0gbXNnW2ldLmFkZHI7CisJCQlvYnVmWzFdID0gbXNnW2ldLmxlbjsKKwkJCW1lbWNweSgmb2J1ZlsyXSxtc2dbaV0uYnVmLG1zZ1tpXS5sZW4pOworCisJCQlpZiAoY3h1c2JfY3RybF9tc2coZCxDTURfSTJDX1dSSVRFLCBvYnVmLCAyK21zZ1tpXS5sZW4sICZpYnVmLDEpIDwgMCkKKwkJCQlicmVhazsKKwkJCWlmIChpYnVmICE9IDB4MDgpCisJCQkJZGViX2luZm8oImkyYyB3cml0ZSBjb3VsZCBoYXZlIGJlZW4gZmFpbGVkXG4iKTsKKwkJfQorCX0KKworCXVwKCZkLT5pMmNfc2VtKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHUzMiBjeHVzYl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGN4dXNiX2kyY19hbGdvID0geworCS5uYW1lICAgICAgICAgID0gIkNvbmV4YW50IFVTQiBJMkMgYWxnb3JpdGhtIiwKKwkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCwKKwkubWFzdGVyX3hmZXIgICA9IGN4dXNiX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gY3h1c2JfaTJjX2Z1bmMsCit9OworCitzdGF0aWMgaW50IGN4dXNiX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2Jfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggYnVmWzJdID0geyAweDAzLCAweDAwIH07CisJaWYgKG9ub2ZmKQorCQljeHVzYl9jdHJsX21zZyhkLDB4MzYsIGJ1ZiwgMiwgTlVMTCwgMCk7CisJZWxzZQorCQljeHVzYl9jdHJsX21zZyhkLDB4MzcsIE5VTEwsIDAsIE5VTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjeDIyNzAyX2NvbmZpZyBjeHVzYl9jeDIyNzAyX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NjMsCisKKwkub3V0cHV0X21vZGUgPSBDWDIyNzAyX1BBUkFMTEVMX09VVFBVVCwKKworCS5wbGxfaW5pdCA9IGR2Yl91c2JfcGxsX2luaXRfaTJjLAorCS5wbGxfc2V0ICA9IGR2Yl91c2JfcGxsX3NldF9pMmMsCit9OworCisvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KK3N0YXRpYyBpbnQgY3h1c2JfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBicGxsWzRdID0geyAweDBiLCAweGRjLCAweDljLCAweGEwIH07CisJZC0+cGxsX2FkZHIgPSAweDYxOworCW1lbWNweShkLT5wbGxfaW5pdCxicGxsLDQpOworCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfZm1kMTIxNm1lOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4dXNiX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggYnVmWzJdID0geyAweDAzLCAweDAwIH07CisJdTggYiA9IDA7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwwLDApIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIHRvIGFsdHM9MCBmYWlsZWQiKTsKKworCWN4dXNiX2N0cmxfbXNnKGQsMHhkZSwmYiwwLE5VTEwsMCk7CisJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9UVU5FUl9PVEhFUik7CisJY3h1c2JfY3RybF9tc2coZCxDTURfUE9XRVJfT0ZGLCBOVUxMLCAwLCAmYiwgMSk7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwwLDYpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJY3h1c2JfY3RybF9tc2coZCwweDM2LCBidWYsIDIsIE5VTEwsIDApOworCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfQ1gyMjcwMik7CisJY3h1c2JfY3RybF9tc2coZCxDTURfUE9XRVJfT04sIE5VTEwsIDAsICZiLCAxKTsKKworCWlmICgoZC0+ZmUgPSBjeDIyNzAyX2F0dGFjaCgmY3h1c2JfY3gyMjcwMl9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIERWQiBVU0IgRHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGN4dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmY3h1c2JfcHJvcGVydGllcyxUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjeHVzYl90YWJsZSBbXSA9IHsKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfTUVESU9OLCBVU0JfUElEX01FRElPTl9NRDk1NzAwKSB9LAorCQl7fQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGN4dXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBjeHVzYl9zdGF0ZSksCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gY3h1c2JfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX3R1bmVyX2F0dGFjaCwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0lTT0MsCisJCS5jb3VudCA9IDUsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmlzb2MgPSB7CisJCQkJLmZyYW1lc3BlcnVyYiA9IDMyLAorCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJLmludGVydmFsID0gNSwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgICAiTWVkaW9uIE1EOTU3MDAgKE1EVVNCVFYtSFlCUklEKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJmN4dXNiX3RhYmxlWzBdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGN4dXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImR2Yl91c2JfY3h1c2IiLAorCS5wcm9iZQkJPSBjeHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlCT0gY3h1c2JfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGN4dXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmY3h1c2JfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjeHVzYl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZjeHVzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAoY3h1c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGN4dXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQ29uZXhhbnQgVVNCMi4wIGh5YnJpZCByZWZlcmVuY2UgZGVzaWduIik7CitNT0RVTEVfVkVSU0lPTigiMS4wLWFscGhhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3OTAxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9EVkJfVVNCX0NYVVNCX0hfCisjZGVmaW5lIF9EVkJfVVNCX0NYVVNCX0hfCisKKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWdpdHYiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCitleHRlcm4gaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2N4dXNiX2RlYnVnLDB4MDEsYXJncykKKworLyogdXNiIGNvbW1hbmRzIC0gc29tZSBvZiBpdCBhcmUgZ3Vlc3NlcywgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB5ZXQgKi8KKyNkZWZpbmUgQ01EX0kyQ19XUklURSAgICAweDA4CisjZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgMHgwOQorCisjZGVmaW5lIENNRF9JT0NUTCAgICAgICAgMHgwZQorI2RlZmluZSAgICBJT0NUTF9TRVRfSTJDX1BBVEggMHgwMgorCisjZGVmaW5lIENNRF9QT1dFUl9PRkYgICAgMHg1MAorI2RlZmluZSBDTURfUE9XRVJfT04gICAgIDB4NTEKKworZW51bSBjeHVzYl9pMmNfcGF0aGVzIHsKKwlQQVRIX1VOREVGICAgICAgID0gMHgwMCwKKwlQQVRIX0NYMjI3MDIgICAgID0gMHgwMSwKKwlQQVRIX1RVTkVSX09USEVSID0gMHgwMiwKK307CisKK3N0cnVjdCBjeHVzYl9zdGF0ZSB7CisJZW51bSBjeHVzYl9pMmNfcGF0aGVzIGN1cl9pMmNfcGF0aDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggYTBmZmJiNS4uODI4YjUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0zMSwxMCArMzEsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogc29tZSBvZiB0aGUgZGlidXNiIDEuMSBkZXZpY2UgYXJlbid0IGVxdWlwcGVkIHdpdGggdGhlIGRlZmF1bHQgdHVuZXIKK3N0YXRpYyBpbnQgZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjE7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90dWE2MDEweHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgb2YgdGhlIEFydGVjIDEuMSBkZXZpY2UgYXJlbid0IGVxdWlwcGVkIHdpdGggdGhlIGRlZmF1bHQgdHVuZXIKICAqIChUaG9tc29uIENhYmxlKSwgYnV0IHdpdGggYSBQYW5hc29uaWMgRU5WNzdIMTFENS4gIFRoaXMgZnVuY3Rpb24gZmlndXJlcwogICogdGhpcyBvdXQuICovCi1zdGF0aWMgaW50IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCitzdGF0aWMgaW50IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAl1OCBiWzJdID0geyAwLDAgfSwgYjJbMV07CiAJaW50IHJldCA9IDA7CkBAIC01OSw4ICs2Niw3IEBACiAKIAlpZiAoYjJbMF0gPT0gMHhmZSkgewogCQlpbmZvKCJ0aGlzIGRldmljZSBoYXMgdGhlIFRob21zb24gQ2FibGUgb25ib2FyZC4gV2hpY2ggaXMgZGVmYXVsdC4iKTsKLQkJZC0+cGxsX2FkZHIgPSAweDYxOwotCQlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3R1YTYwMTB4czsKKwkJZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKGQpOwogCX0gZWxzZSB7CiAJCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKIAkJaW5mbygidGhpcyBkZXZpY2UgaGFzIHRoZSBQYW5hc29uaWMgRU5WNzdIMTFENSBvbmJvYXJkLiIpOwpAQCAtOTAsOCArOTYsOCBAQAogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkaWJ1c2JfZGliMzAwMG1iX3RhYmxlIFtdID0gewotLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBX1VOSywJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfQ09MRCl9LAotLyogMDEgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBX1VOSywJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTSl9LAorLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsCQlVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQl9DT0xEKX0sCisvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX1dBUk0pfSwKIC8qIDAyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywJCVVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX0NPTEQpIH0sCiAvKiAwMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9DT01QUk8sCQlVU0JfUElEX0NPTVBST19EVkJVMjAwMF9XQVJNKSB9LAogLyogMDQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ09NUFJPX1VOSywJVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfVU5LX0NPTEQpIH0sCkBAIC0xMTQsNyArMTIwLDE3IEBACiAvKiAyMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQpIH0sCiAvKiAyMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0pIH0sCiAvKiAyMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BRFNURUNILAkJVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRCkgfSwKKworLyogZGV2aWNlIElEIHdpdGggZGVmYXVsdCBESUJVU0IyXzAtZmlybXdhcmUgYW5kIHdpdGggdGhlIGhhY2tlZCBmaXJtd2FyZSAqLwogLyogMjQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQURTVEVDSCwJCVVTQl9QSURfQURTVEVDSF9VU0IyX1dBUk0pIH0sCisvKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKKy8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCQlVU0JfUElEX0tZRV9EVkJfVF9XQVJNKSB9LAorCisvLyAjZGVmaW5lIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCisKKyNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworLyogMjcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQU5DSE9SLAkJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU5DSE9SX0NPTEQpIH0sCisjZW5kaWYKIAkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRpYnVzYl9kaWIzMDAwbWJfdGFibGUpOwpAQCAtMTM0LDcgKzE1MCw3IEBACiAJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCiAKIAkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCiAJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKQEAgLTE1Niw3ICsxNzIsNyBAQAogCQl9CiAJfSwKIAotCS5udW1fZGV2aWNlX2Rlc2NzID0gOCwKKwkubnVtX2RldmljZV9kZXNjcyA9IDksCiAJLmRldmljZXMgPSB7CiAJCXsJIkFWZXJNZWRpYSBBdmVyVFYgRFZCVCBVU0IxLjEiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVswXSwgIE5VTEwgfSwKQEAgLTE5MCwxMSArMjA2LDE3IEBACiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE5XSwgTlVMTCB9LAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMF0sIE5VTEwgfSwKIAkJfSwKKwkJewkiVmlkZW9XYWxrZXIgRFZCLVQgVVNCIiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjVdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI2XSwgTlVMTCB9LAorCQl9LAogCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpYnVzYjFfMV9hbjIyMzVfcHJvcGVydGllcyA9IHsKIAkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCisKIAkudXNiX2N0cmwgPSBDWVBSRVNTX0FOMjIzNSwKIAogCS5maXJtd2FyZSA9ICJkdmItdXNiLWRpYnVzYi1hbjIyMzUtMDEuZnciLApAQCAtMjA2LDcgKzIyOCw3IEBACiAJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCiAKIAkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCiAJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKQEAgLTIyOCwyMCArMjUwLDMyIEBACiAJCX0KIAl9LAogCisjaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKwkubnVtX2RldmljZV9kZXNjcyA9IDIsCisjZWxzZQogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKyNlbmRpZgogCS5kZXZpY2VzID0gewogCQl7CSJBcnRlYyBUMSBVU0IxLjEgVFZCT1ggd2l0aCBBTjIyMzUiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMF0sIE5VTEwgfSwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjFdLCBOVUxMIH0sCiAJCX0sCisjaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKwkJewkiQXJ0ZWMgVDEgVVNCMS4xIFRWQk9YIHdpdGggQU4yMjM1IChmYXVsdHkgVVNCIElEcykiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyN10sIE5VTEwgfSwKKwkJCXsgTlVMTCB9LAorCQl9LAorI2VuZGlmCiAJfQogfTsKIAogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZGlidXNiMl8wYl9wcm9wZXJ0aWVzID0gewogCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiB8IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwogCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAogCi0JLmZpcm13YXJlID0gImR2Yi11c2ItYWRzdGVjaC11c2IyLTAxLmZ3IiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1hZHN0ZWNoLXVzYjItMDIuZnciLAogCiAJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAKQEAgLTI1MCw3ICsyODQsNyBAQAogCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKIAkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYjJfMF9wb3dlcl9jdHJsLAogCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtYl9mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfZGliMzAwMG1iX3R1bmVyX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90aG9tc29uX3R1bmVyX2F0dGFjaCwKIAogCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKIAkucmNfa2V5X21hcCAgICAgICA9IGRpYnVzYl9yY19rZXlzLApAQCAtMjcyLDE4ICszMDYsMTggQEAKIAkJfQogCX0sCiAKLQkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewogCQl7CSJLV29ybGQvQURTVGVjaCBJbnN0YW50IERWQi1UIFVTQiAyLjAiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyM10sIE5VTEwgfSwKLQkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjRdLCBOVUxMIH0sIC8qIGRldmljZSBJRCB3aXRoIGRlZmF1bHQgRElCVVNCMl8wLWZpcm13YXJlICovCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI0XSwgTlVMTCB9LAogCQl9LAogCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWJ1c2JfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiRGlCY29tIGJhc2VkIFVTQiBEVkItVCBkZXZpY2VzIChEaUIzMDAwTS1CIGJhc2VkKSIsCisJLm5hbWUJCT0gImR2Yl91c2JfZGlidXNiX21iIiwKIAkucHJvYmUJCT0gZGlidXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUJPSBkaWJ1c2JfZGliMzAwMG1iX3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKaW5kZXggYWFkOGVkMy4uZTlkYWM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCkBAIC04Myw3ICs4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWJ1c2JfbWNfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiRGlCY29tIGJhc2VkIFVTQjIuMCBEVkItVCAoRGlCMzAwME0tQy9QIGJhc2VkKSBkZXZpY2VzIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9kaWJ1c2JfbWMiLAogCS5wcm9iZQkJPSBkaWJ1c2JfbWNfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZQk9IGRpYnVzYl9kaWIzMDAwbWNfdGFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwppbmRleCA1YWNmM2ZkLi45YTY3NmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKQEAgLTEsMTAgKzEsOSBAQAogLyogRFZCIFVTQiBjb21wbGlhbnQgbGludXggZHJpdmVyIGZvciBOZWJ1bGEgRWxlY3Ryb25pY3MgdURpZ2lUViBEVkItVCBVU0IyLjAKICAqIHJlY2VpdmVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGxhbiBUaGlyZCAoYWxsYW4udGhpcmRAY3MubWFuLmFjLnVrKQorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQogICoKLSAqIHBhcnRseSBiYXNlZCBvbiB0aGUgU0RLIHB1Ymxpc2hlZCBieSBOZWJ1bGEgRWxlY3Ryb25pY3MgKFRPRE8gZG8gd2Ugd2FudCB0aGlzIGxpbmUgPykKKyAqIHBhcnRseSBiYXNlZCBvbiB0aGUgU0RLIHB1Ymxpc2hlZCBieSBOZWJ1bGEgRWxlY3Ryb25pY3MKICAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKQEAgLTM4LDcgKzM3LDcgQEAKIAkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsc25kYnVmLDcpOwogCX0gZWxzZSB7CiAJCWR2Yl91c2JfZ2VuZXJpY19ydyhkLHNuZGJ1Ziw3LHJjdmJ1Ziw3LDEwKTsKLQkJbWVtY3B5KCZyYnVmLCZyY3ZidWZbM10scmxlbik7CisJCW1lbWNweShyYnVmLCZyY3ZidWZbM10scmxlbik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTUsNDEgKzk0LDIwIEBACiAKIHN0YXRpYyBpbnQgZGlnaXR2X210MzUyX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0Jc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZ1tdID0geyAweDg5LCAweDM4LCAweDJkIH07Ci0Jc3RhdGljIHU4IG10MzUyX3Jlc2V0W10gPSB7IDB4NTAsIDB4ODAgfTsKLQlzdGF0aWMgdTggbXQzNTJfbWNsa19yYXRpb1tdID0geyAweDhiLCAweDAwIH07CisJc3RhdGljIHU4IHJlc2V0X2J1ZltdID0geyAweDg5LCAweDM4LCAgMHg4YSwgMHgyZCwgMHg1MCwgMHg4MCB9OworCXN0YXRpYyB1OCBpbml0X2J1ZltdID0geyAweDY4LCAweGEwLCAgMHg4ZSwgMHg0MCwgIDB4NTMsIDB4NTAsCisJCQkweDY3LCAweDIwLCAgMHg3ZCwgMHgwMSwgIDB4N2MsIDB4MDAsICAweDdhLCAweDAwLAorCQkJMHg3OSwgMHgyMCwgIDB4NTcsIDB4MDUsICAweDU2LCAweDMxLCAgMHg4OCwgMHgwZiwKKwkJCTB4NzUsIDB4MzIgfTsKKwlpbnQgaTsKIAotCXN0YXRpYyB1OCBtdDM1Ml9hZ2NfY2ZnW10gPSB7IDB4NjgsIDB4YTAgfTsKLQlzdGF0aWMgdTggbXQzNTJfYWRjX2N0bF8xX2NmZ1tdID0geyAweDhFLCAweGEwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FjcV9jdGxbXSA9IHsgMHg1MywgMHg1MCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9hZ2NfdGFyZ2V0W10gPSB7IDB4NjcsIDB4MjAgfTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXNldF9idWYpOyBpICs9IDIpCisJCW10MzUyX3dyaXRlKGZlLCAmcmVzZXRfYnVmW2ldLCAyKTsKIAotCXN0YXRpYyB1OCBtdDM1Ml9yc19lcnJfcGVyW10gPSB7IDB4N2MsIDB4MDAsIDB4MDEgfTsKLQlzdGF0aWMgdTggbXQzNTJfc25yX3NlbGVjdFtdID0geyAweDc5LCAweDAwLCAweDIwIH07Ci0KLQlzdGF0aWMgdTggbXQzNTJfaW5wdXRfZnJlcV8xW10gPSB7IDB4NTYsIDB4MzEsIDB4MDUgfTsKLQotCXN0YXRpYyB1OCBtdDM1Ml9zY2FuX2N0bFtdID0geyAweDg4LCAweDBmIH07Ci0Jc3RhdGljIHU4IG10MzUyX2NhcHRfcmFuZ2VbXSA9IHsgMHg3NSwgMHgzMiB9OwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2Nsb2NrX2NvbmZpZywgc2l6ZW9mKG10MzUyX2Nsb2NrX2NvbmZpZykpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7CiAJbXNsZWVwKDEpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9tY2xrX3JhdGlvLCBzaXplb2YobXQzNTJfbWNsa19yYXRpbykpOwogCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FnY19jZmcsIHNpemVvZihtdDM1Ml9hZ2NfY2ZnKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FkY19jdGxfMV9jZmcsIHNpemVvZihtdDM1Ml9hZGNfY3RsXzFfY2ZnKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FjcV9jdGwsIHNpemVvZihtdDM1Ml9hY3FfY3RsKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FnY190YXJnZXQsIHNpemVvZihtdDM1Ml9hZ2NfdGFyZ2V0KSk7Ci0KLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yc19lcnJfcGVyLCBzaXplb2YobXQzNTJfcnNfZXJyX3BlcikpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zbnJfc2VsZWN0LCBzaXplb2YobXQzNTJfc25yX3NlbGVjdCkpOwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2lucHV0X2ZyZXFfMSwgc2l6ZW9mKG10MzUyX2lucHV0X2ZyZXFfMSkpOwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX3NjYW5fY3RsLCBzaXplb2YobXQzNTJfc2Nhbl9jdGwpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2FwdF9yYW5nZSwgc2l6ZW9mKG10MzUyX2NhcHRfcmFuZ2UpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X2J1Zik7IGkgKz0gMikKKwkJbXQzNTJfd3JpdGUoZmUsICZpbml0X2J1ZltpXSwgMik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNyw3ICsxMTUsNyBAQAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X210MzUyX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MCwgLyogaWdub3JlZCBieSB0aGUgZGlnaXR2IGFueXdheSAqLwogCS5kZW1vZF9pbml0ID0gZGlnaXR2X210MzUyX2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSBOVUxMLCAvKiBUT0RPICovCisJLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IG54dDYwMDBfY29uZmlnIGRpZ2l0dl9ueHQ2MDAwX2NvbmZpZyA9IHsKQEAgLTE1MCw5ICsxMjgsOSBAQAogCiBzdGF0aWMgaW50IGRpZ2l0dl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewotCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpID09IE5VTEwpCisJaWYgKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmZGlnaXR2X210MzUyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JaWYgKChkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZkLT5pMmNfYWRhcCkpID09IE5VTEwpIHsKKwlpZiAoKGQtPmZlID0gbnh0NjAwMF9hdHRhY2goJmRpZ2l0dl9ueHQ2MDAwX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkgewogCiAJCXdhcm4oIm54dDYwMDAgc3VwcG9ydCBpcyBub3QgZG9uZSB5ZXQsIGluIGZhY3QgeW91IGFyZSBvbmUgb2YgdGhlIGZpcnN0ICIKIAkJCQkicGVyc29uIHdobyB3YW50cyB0byB1c2UgdGhpcyBkZXZpY2UgaW4gTGludXguIFBsZWFzZSByZXBvcnQgdG8gIgpAQCAtMTYzLDYgKzE0MSwxMyBAQAogCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgaW50IGRpZ2l0dl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWQtPnBsbF9hZGRyID0gMHg2MDsKKwlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3RkZWQ0OworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGRpZ2l0dl9yY19rZXlzW10gPSB7CiAJeyAweDAwLCAweDE2LCBLRVlfUE9XRVIgfSwgLyogZHVtbXkga2V5ICovCiB9OwpAQCAtMTg0LDcgKzE2OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpZ2l0dl9wcm9wZXJ0aWVzOwogCkBAIC0yMDgsMTMgKzE5Miw4IEBACiAKIAkuc2l6ZV9vZl9wcml2ICAgICA9IDAsCiAKLQkuc3RyZWFtaW5nX2N0cmwgICA9IE5VTEwsCi0JLnBpZF9maWx0ZXIgICAgICAgPSBOVUxMLAotCS5waWRfZmlsdGVyX2N0cmwgID0gTlVMTCwKLQkucG93ZXJfY3RybCAgICAgICA9IE5VTEwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWdpdHZfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gTlVMTCwgLy8gZGlnaXR2X3R1bmVyX2F0dGFjaCwKLQkucmVhZF9tYWNfYWRkcmVzcyA9IE5VTEwsCisJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWdpdHZfdHVuZXJfYXR0YWNoLAogCiAJLnJjX2ludGVydmFsICAgICAgPSAxMDAwLAogCS5yY19rZXlfbWFwICAgICAgID0gZGlnaXR2X3JjX2tleXMsCkBAIC0yMzgsNyArMjE3LDcgQEAKIAkJfQogCX0sCiAKLQkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewogCQl7ICAgIk5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaVRWIERWQi1UIFVTQjIuMCkiLAogCQkJeyAmZGlnaXR2X3RhYmxlWzBdLCBOVUxMIH0sCkBAIC0yNDksNyArMjI4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGRpZ2l0dl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJOZWJ1bGEgRWxlY3Ryb25pY3MgdURpZ2lUViBEVkItVCBVU0IyLjAgZGV2aWNlIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9kaWdpdHYiLAogCS5wcm9iZQkJPSBkaWdpdHZfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZQk9IGRpZ2l0dl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKaW5kZXggZDE3ZDc2OC4uYjAzMjUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKQEAgLTEsNSArMSw1IEBACi0vKiBGcm9udGVuZCBwYXJ0IG9mIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoZSBZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UCi0gKiBVU0IyLjAgcmVjZWl2ZXIuCisvKiBGcm9udGVuZCBwYXJ0IG9mIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoZSBXaWRlVmlldy8gWWFrdW1vLyBIYW1hLworICogVHlwaG9vbi8gWXVhbiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPgogICoKQEAgLTE0LDYxICsxNCw1OCBAQAogc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKIAorCWZlX3N0YXR1c190IHN0YXQ7CisKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgZmVwOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiB9OwogCi0jZGVmaW5lIG1vYW4od2hpY2gsd2hhdCkgaW5mbygidW5leHBlY3RlZCB2YWx1ZSBpbiAnJXMnIGZvciBjbWQgJyUwMngnIC0gcGxlYXNlIHJlcG9ydCB0byBsaW51eC1kdmJAbGludXh0di5vcmciLHdoaWNoLHdoYXQpCi0KIHN0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QgKnN0YXQpCiB7CiAJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYncgPSBHRVRfVFVORV9TVEFUOwotCXU4IGJyWzNdID0geyAwIH07Ci0vLwl1OCBiZGViWzVdID0geyAwIH07CisJdTggc3QgPSBHRVRfVFVORV9TVEFUVVMsIGJbM107CiAKLQlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJmJ3LDEsYnIsMywwKTsKLQlzd2l0Y2ggKGJyWzBdKSB7CisJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZzdCwxLGIsMywwKTsKKworCXN3aXRjaCAoYlswXSkgewogCQljYXNlIDB4MDE6Ci0JCQkqc3RhdCA9IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKwkJCSpzdGF0ID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCQlGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX0xPQ0s7CiAJCQlicmVhazsKLQkJY2FzZSAweDAwOgotCQkJKnN0YXQgPSAwOworCQljYXNlIDB4MDA6IC8qIHBlbmRpbmcgKi8KKwkJCSpzdGF0ID0gRkVfVElNRURPVVQ7IC8qIGR1cmluZyBzZXRfZnJvbnRlbmQgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJbW9hbigiYnJbMF0iLEdFVF9UVU5FX1NUQVQpOworCQljYXNlIDB4MDI6IC8qIGZhaWxlZCAqLworCQkJKnN0YXQgPSAwOwogCQkJYnJlYWs7CiAJfQotCi0vLwlid1swXSA9IDB4ODg7Ci0vLwlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsYncsMSxiZGViLDUsMCk7Ci0KLS8vCWRlYl9pbmZvKCIlMDJ4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsYndbMF0sYmRlYlswXSxiZGViWzFdLGJkZWJbMl0sYmRlYlszXSxiZGViWzRdKTsKLQogCXJldHVybiAwOwogfQorCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqYmVyKQogewogCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3ID0gR0VUX0JFUjsKLQkqYmVyID0gMDsKLQlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJmJ3LDEsKHU4KikgYmVyLDMsMCk7CisJdTggYncgPSBHRVRfVklUX0VSUl9DTlQsYlszXTsKKwlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJmJ3LDEsYiwzLDApOworCSpiZXIgPSAoYlswXSA8PCAxNikgfCAoYlsxXSA8PCA4KSB8IGJbMl07CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3VuY19ibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqdW5jKQogewogCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3ID0gR0VUX1VOSzsKLQkqdW5jID0gMDsKLQlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJmJ3LDEsKHU4KikgdW5jLDMsMCk7CisJdTggYncgPSBHRVRfUlNfVU5DT1JfQkxLX0NOVCxiWzJdOworCisJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLGIsMiwwKTsKKwkqdW5jID0gKGJbMF0gPDwgOCkgfCBiWzFdOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiAqc3RyZW5ndGgpCiB7CiAJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYncgPSBHRVRfU0lHX1NUUkVOR1RILCBiOworCXU4IGJ3ID0gR0VUX0FHQywgYjsKIAlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJmJ3LDEsJmIsMSwwKTsKIAkqc3RyZW5ndGggPSAoYiA8PCA4KSB8IGI7CiAJcmV0dXJuIDA7CkBAIC04Niw3ICs4Myw3IEBACiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBiID0gUkVTRVRfREVNT0Q7CisJdTggYiA9IFNFVF9JTklUOwogCXJldHVybiBkdmJfdXNiX2dlbmVyaWNfd3JpdGUoc3RhdGUtPmQsJmIsMSk7CiB9CiAKQEAgLTk4LDggKzk1LDggQEAKIHN0YXRpYyBpbnQgZHR0MjAwdV9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQogewogCXR1bmUtPm1pbl9kZWxheV9tcyA9IDE1MDA7Ci0JdHVuZS0+c3RlcF9zaXplID0gMTY2NjY3OwotCXR1bmUtPm1heF9kcmlmdCA9IDE2NjY2NyAqIDI7CisJdHVuZS0+c3RlcF9zaXplID0gMDsKKwl0dW5lLT5tYXhfZHJpZnQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMDcsMjcgKzEwNCwzMiBAQAogCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCiB7CiAJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGk7CisJZmVfc3RhdHVzX3Qgc3Q7CiAJdTE2IGZyZXEgPSBmZXAtPmZyZXF1ZW5jeSAvIDI1MDAwMDsKLQl1OCBidyxid2J1ZlsyXSA9IHsgU0VUX0JBTkRXSURUSCwgMCB9LCBmcmVxYnVmWzNdID0geyBTRVRfRlJFUVVFTkNZLCAwLCAwIH07CisJdTggYndidWZbMl0gPSB7IFNFVF9CQU5EV0lEVEgsIDAgfSxmcmVxYnVmWzNdID0geyBTRVRfUkZfRlJFUSwgMCwgMCB9OwogCiAJc3dpdGNoIChmZXAtPnUub2ZkbS5iYW5kd2lkdGgpIHsKLQkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6IGJ3ID0gODsgYnJlYWs7Ci0JCWNhc2UgQkFORFdJRFRIXzdfTUhaOiBidyA9IDc7IGJyZWFrOwotCQljYXNlIEJBTkRXSURUSF82X01IWjogYncgPSA2OyBicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6IGJ3YnVmWzFdID0gODsgYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzdfTUhaOiBid2J1ZlsxXSA9IDc7IGJyZWFrOworCQljYXNlIEJBTkRXSURUSF82X01IWjogYndidWZbMV0gPSA2OyBicmVhazsKIAkJY2FzZSBCQU5EV0lEVEhfQVVUTzogcmV0dXJuIC1FT1BOT1RTVVBQOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWRlYl9pbmZvKCJzZXRfZnJvbnRlbmRcbiIpOwogCi0JYndidWZbMV0gPSBidzsKIAlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoc3RhdGUtPmQsYndidWYsMik7CiAKIAlmcmVxYnVmWzFdID0gZnJlcSAmIDB4ZmY7CiAJZnJlcWJ1ZlsyXSA9IChmcmVxID4+IDgpICYgMHhmZjsKIAlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoc3RhdGUtPmQsZnJlcWJ1ZiwzKTsKIAotCW1lbWNweSgmc3RhdGUtPmZlcCxmZXAsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOworCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCW1zbGVlcCgyMCk7CisJCWR0dDIwMHVfZmVfcmVhZF9zdGF0dXMoZmUsICZzdCk7CisJCWlmIChzdCAmIEZFX1RJTUVET1VUKQorCQkJY29udGludWU7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQsNyArMTc2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGR0dDIwMHVfZmVfb3BzID0gewogCS5pbmZvID0gewotCQkubmFtZQkJCT0gIkRUVDIwMFUgKFlha3Vtby9UeXBob29uL0hhbWEpIERWQi1UIiwKKwkJLm5hbWUJCQk9ICJXaWRlVmlldyBVU0IgRFZCLVQiLAogCQkudHlwZQkJCT0gRkVfT0ZETSwKIAkJLmZyZXF1ZW5jeV9taW4JCT0gNDQyNTAwMDAsCiAJCS5mcmVxdWVuY3lfbWF4CQk9IDg2NzI1MDAwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKaW5kZXggZmIyYjVhMi4uNDdkYmE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKQEAgLTEsOCArMSwxMCBAQAotLyogRFZCIFVTQiBsaWJyYXJ5IGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZSBZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UCi0gKiBVU0IyLjAgcmVjZWl2ZXIuCisvKiBEVkIgVVNCIGxpYnJhcnkgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIFdpZGVWaWV3LyBZYWt1bW8vIEhhbWEvCisgKiBUeXBob29uLyBZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKICAqCisgKiBUaGFua3MgdG8gU3RldmUgQ2hhbmcgZnJvbSBXaWRlVmlldyBmb3IgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHRoZSBXVC0yMjBVLgorICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgpAQCAtMTYsMTQgKzE4LDI0IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl9kdHQyMDB1X2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyx4ZmVyPTIgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKIAorc3RhdGljIGludCBkdHQyMDB1X3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggYiA9IFNFVF9JTklUOworCisJaWYgKG9ub2ZmKQorCQlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoZCwmYiwyKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCiB7Ci0JdTggYl9zdHJlYW1pbmdbMl0gPSB7IFNFVF9UU19DVFJMLCBvbm9mZiB9OworCXU4IGJfc3RyZWFtaW5nWzJdID0geyBTRVRfU1RSRUFNSU5HLCBvbm9mZiB9OwogCXU4IGJfcnN0X3BpZCA9IFJFU0VUX1BJRF9GSUxURVI7CiAKIAlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoZCxiX3N0cmVhbWluZywyKTsKIAotCWlmICghb25vZmYpCisJaWYgKG9ub2ZmID09IDApCiAJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLCZiX3JzdF9waWQsMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNiw3ICs0OCw3IEBACiAJYl9waWRbMF0gPSBTRVRfUElEX0ZJTFRFUjsKIAliX3BpZFsxXSA9IGluZGV4OwogCWJfcGlkWzJdID0gcGlkICYgMHhmZjsKLQliX3BpZFszXSA9IChwaWQgPj4gOCkgJiAweGZmOworCWJfcGlkWzNdID0gKHBpZCA+PiA4KSAmIDB4MWY7CiAKIAlyZXR1cm4gZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsYl9waWQsNCk7CiB9CkBAIC01NCw5ICs2Niw5IEBACiAJeyAweDgwLCAweDA4LCBLRVlfNSB9LAogCXsgMHg4MCwgMHgwOSwgS0VZXzYgfSwKIAl7IDB4ODAsIDB4MGEsIEtFWV83IH0sCi0JeyAweDAwLCAweDBjLCBLRVlfWk9PTSB9LAorCXsgMHg4MCwgMHgwYywgS0VZX1pPT00gfSwKIAl7IDB4ODAsIDB4MGQsIEtFWV8wIH0sCi0JeyAweDAwLCAweDBlLCBLRVlfU0VMRUNUIH0sCisJeyAweDgwLCAweDBlLCBLRVlfU0VMRUNUIH0sCiAJeyAweDgwLCAweDEyLCBLRVlfUE9XRVIgfSwKIAl7IDB4ODAsIDB4MWEsIEtFWV9DSEFOTkVMVVAgfSwKIAl7IDB4ODAsIDB4MWIsIEtFWV84IH0sCkBAIC02Niw3ICs3OCw3IEBACiAKIHN0YXRpYyBpbnQgZHR0MjAwdV9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCiB7Ci0JdTgga2V5WzVdLGNtZCA9IEdFVF9SQ19LRVk7CisJdTgga2V5WzVdLGNtZCA9IEdFVF9SQ19DT0RFOwogCWR2Yl91c2JfZ2VuZXJpY19ydyhkLCZjbWQsMSxrZXksNSwwKTsKIAlkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQoZCxrZXksZXZlbnQsc3RhdGUpOwogCWlmIChrZXlbMF0gIT0gMCkKQEAgLTgxLDMyICs5Myw0MSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkdHQyMDB1X3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB3dDIyMHVfcHJvcGVydGllczsKIAogc3RhdGljIGludCBkdHQyMDB1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmR0dDIwMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSk7CisJaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZHR0MjAwdV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwIHx8CisJCWR2Yl91c2JfZGV2aWNlX2luaXQoaW50Ziwmd3QyMjB1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkdHQyMDB1X3VzYl90YWJsZSBbXSA9IHsKLQkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBX1VOSywgVVNCX1BJRF9EVFQyMDBVX0NPTEQpIH0sCi0JICAgIHsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQV9VTkssIFVTQl9QSURfRFRUMjAwVV9XQVJNKSB9LAorLy8JCXsgVVNCX0RFVklDRSgweDA0YjQsMHg4NjEzKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX0NPTEQpIH0sCisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX0RUVDIwMFVfV0FSTSkgfSwKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfV1QyMjBVX0NPTEQpICB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9XVDIyMFVfV0FSTSkgIH0sCiAJICAgIHsgMCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkdHQyMDB1X3VzYl90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGR0dDIwMHVfcHJvcGVydGllcyA9IHsKIAkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORywKLQkucGlkX2ZpbHRlcl9jb3VudCA9IDI1NSwgLyogSXQgaXMgYSBndWVzcywgYnV0IHRoZXJlIGFyZSBhdCBsZWFzdCAxMCAqLworCS5waWRfZmlsdGVyX2NvdW50ID0gMTUsCiAKIAkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKIAkuZmlybXdhcmUgPSAiZHZiLXVzYi1kdHQyMDB1LTAxLmZ3IiwKIAorCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCiAJLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCiAJLnBpZF9maWx0ZXIgICAgICA9IGR0dDIwMHVfcGlkX2ZpbHRlciwKIAkuZnJvbnRlbmRfYXR0YWNoID0gZHR0MjAwdV9mcm9udGVuZF9hdHRhY2gsCiAKLQkucmNfaW50ZXJ2YWwgICAgID0gMjAwLAorCS5yY19pbnRlcnZhbCAgICAgPSAzMDAsCiAJLnJjX2tleV9tYXAgICAgICA9IGR0dDIwMHVfcmNfa2V5cywKIAkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShkdHQyMDB1X3JjX2tleXMpLAogCS5yY19xdWVyeSAgICAgICAgPSBkdHQyMDB1X3JjX3F1ZXJ5LApAQCAtMTI3LDE4ICsxNDgsNTkgQEAKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKLQkJeyAubmFtZSA9ICJZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UIFVTQjIuMCkiLAotCQkgIC5jb2xkX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzBdLCAmZHR0MjAwdV91c2JfdGFibGVbMl0gfSwKKwkJeyAubmFtZSA9ICJXaWRlVmlldy9ZdWFuL1lha3Vtby9IYW1hL1R5cGhvb24gRFZCLVQgVVNCMi4wIChXVC0yMDBVKSIsCisJCSAgLmNvbGRfaWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMF0sIE5VTEwgfSwKIAkJICAud2FybV9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVsxXSwgTlVMTCB9LAogCQl9LAogCQl7IDAgfSwKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB3dDIyMHVfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORywKKwkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAorCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisJLmZpcm13YXJlID0gImR2Yi11c2Itd3QyMjB1LTAxLmZ3IiwKKworCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCisJLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCisJLnBpZF9maWx0ZXIgICAgICA9IGR0dDIwMHVfcGlkX2ZpbHRlciwKKwkuZnJvbnRlbmRfYXR0YWNoID0gZHR0MjAwdV9mcm9udGVuZF9hdHRhY2gsCisKKwkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAorCS5yY19rZXlfbWFwICAgICAgPSBkdHQyMDB1X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZHR0MjAwdV9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJXaWRlVmlldyBXVC0yMjBVIFBlblR5cGUgUmVjZWl2ZXIgKGFuZCBjbG9uZXMpIiwKKwkJICAuY29sZF9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVsyXSwgTlVMTCB9LAorCQkgIC53YXJtX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzNdLCBOVUxMIH0sCisJCX0sCisJCXsgMCB9LAorCX0KK307CisKIC8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkdHQyMDB1X3VzYl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UIFVTQjIuMCIsCisJLm5hbWUJCT0gImR2Yl91c2JfZHR0MjAwdSIsCiAJLnByb2JlIAkJPSBkdHQyMDB1X3VzYl9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlIAk9IGR0dDIwMHVfdXNiX3RhYmxlLApAQCAtMTY2LDYgKzIyOCw2IEBACiBtb2R1bGVfZXhpdChkdHQyMDB1X3VzYl9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UIFVTQjIuMCBkZXZpY2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgV2lkZVZpZXcvWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVCBVU0IyLjAgZGV2aWNlcyIpOwogTU9EVUxFX1ZFUlNJT04oIjEuMCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaAppbmRleCBlZDQxNDIwLi42ZjFmMzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaApAQCAtMSw1ICsxLDUgQEAKLS8qIENvbW1vbiBoZWFkZXIgZmlsZSBvZiBMaW51eCBkcml2ZXIgZm9yIHRoZSBZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UCi0gKiBVU0IyLjAgcmVjZWl2ZXIuCisvKiBDb21tb24gaGVhZGVyIGZpbGUgb2YgTGludXggZHJpdmVyIGZvciB0aGUgV2lkZVZpZXcvIFlha3Vtby8gSGFtYS8KKyAqIFR5cGhvb24vIFl1YW4gRFZCLVQgVVNCMi4wIHJlY2VpdmVyLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQogICoKQEAgLTIyLDQ0ICsyMiwzNCBAQAogLyogZ3Vlc3NlZCBwcm90b2NvbCBkZXNjcmlwdGlvbiAocmV2ZXJzZSBlbmdpbmVlcmVkKToKICAqIHJlYWQKICAqICAwMCAtIFVTQiB0eXBlIDB4MDIgZm9yIHVzYjIuMCwgMHgwMSBmb3IgdXNiMS4xCi0gKiAgODEgLSA8VFNfTE9DSz4gPGN1cnJlbnQgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMjUwMDAwPgotICogIDgyIC0gY3Jhc2ggLSBkbyBub3QgdG91Y2gKLSAqICA4MyAtIGNyYXNoIC0gZG8gbm90IHRvdWNoCi0gKiAgODQgLSByZW1vdGUgY29udHJvbAotICogIDg1IC0gY3Jhc2ggLSBkbyBub3QgdG91Y2ggKE9LLCBzdG9wIHRlc3RpbmcgaGVyZSkKICAqICA4OCAtIGxvY2tpbmcgMiBieXRlcyAoMHg4MCAweDQwID09IG5vIHNpZ25hbCwgMHg4OSAweDIwID09IG5pY2Ugc2lnbmFsKQotICogIDg5IC0gbm9pc2UtdG8tc2lnbmFsCi0gKgk4YSAtIHVua293biAxIGJ5dGUgLSBzaWduYWxfc3RyZW5ndGgKLSAqICA4YyAtIGJlciA/Pz8KLSAqICA4ZCAtIGJlcgotICogIDhlIC0gdW5jCiAgKi8KIAotI2RlZmluZSBHRVRfU1BFRUQgICAgICAgIDB4MDAKLSNkZWZpbmUgR0VUX1RVTkVfU1RBVCAgICAweDgxCi0jZGVmaW5lIEdFVF9SQ19LRVkgICAgICAgMHg4NAotI2RlZmluZSBHRVRfU1RBVFVTICAgICAgIDB4ODgKLSNkZWZpbmUgR0VUX1NOUiAgICAgICAgICAweDg5Ci0jZGVmaW5lIEdFVF9TSUdfU1RSRU5HVEggMHg4YQotI2RlZmluZSBHRVRfVU5LICAgICAgICAgIDB4OGMKLSNkZWZpbmUgR0VUX0JFUiAgICAgICAgICAweDhkCi0jZGVmaW5lIEdFVF9VTkMgICAgICAgICAgMHg4ZQorI2RlZmluZSBHRVRfU1BFRUQgICAgICAgICAgICAweDAwCisjZGVmaW5lIEdFVF9UVU5FX1NUQVRVUyAgICAgIDB4ODEKKyNkZWZpbmUgR0VUX1JDX0NPREUgICAgICAgICAgMHg4NAorI2RlZmluZSBHRVRfQ09ORklHVVJBVElPTiAgICAweDg4CisjZGVmaW5lIEdFVF9BR0MgICAgICAgICAgICAgIDB4ODkKKyNkZWZpbmUgR0VUX1NOUiAgICAgICAgICAgICAgMHg4YQorI2RlZmluZSBHRVRfVklUX0VSUl9DTlQgICAgICAweDhjCisjZGVmaW5lIEdFVF9SU19FUlJfQ05UICAgICAgIDB4OGQKKyNkZWZpbmUgR0VUX1JTX1VOQ09SX0JMS19DTlQgMHg4ZQogCiAvKiB3cml0ZQotICogIDAxIC0gcmVzZXQgdGhlIGRlbW9kCisgKiAgMDEgLSBpbml0CiAgKiAgMDIgLSBmcmVxdWVuY3kgKGRpdmlkZWQgYnkgMjUwMDAwKQogICogIDAzIC0gYmFuZHdpZHRoCiAgKiAgMDQgLSBwaWQgdGFibGUgKGluZGV4IHBpZCg3OjApIHBpZCgxMjo4KSkKICAqICAwNSAtIHJlc2V0IHRoZSBwaWQgdGFibGUKLSAqICAwOCAtIGRlbW9kIHRyYW5zZmVyIGVuYWJsZWQgb3Igbm90IChGWDIgdHJhbnNmZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0KQorICogIDA4IC0gdHJhbnNmZXIgc3dpdGNoCiAgKi8KIAotI2RlZmluZSBSRVNFVF9ERU1PRCAgICAgIDB4MDEKLSNkZWZpbmUgU0VUX0ZSRVFVRU5DWSAgICAweDAyCisjZGVmaW5lIFNFVF9JTklUICAgICAgICAgMHgwMQorI2RlZmluZSBTRVRfUkZfRlJFUSAgICAgIDB4MDIKICNkZWZpbmUgU0VUX0JBTkRXSURUSCAgICAweDAzCiAjZGVmaW5lIFNFVF9QSURfRklMVEVSICAgMHgwNAogI2RlZmluZSBSRVNFVF9QSURfRklMVEVSIDB4MDUKLSNkZWZpbmUgU0VUX1RTX0NUUkwgICAgICAweDA4CisjZGVmaW5lIFNFVF9TVFJFQU1JTkcgICAgMHgwOAogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqIGR0dDIwMHVfZmVfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaAppbmRleCA2N2UwZDczLi43MzAwNDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWNvbW1vbi5oCkBAIC0xMiwxNCArMTIsMTYgQEAKICNpbmNsdWRlICJkdmItdXNiLmgiCiAKIGV4dGVybiBpbnQgZHZiX3VzYl9kZWJ1ZzsKK2V4dGVybiBpbnQgZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmc7CiAKICNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDEsYXJncykKICNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDIsYXJncykKLSNkZWZpbmUgZGViX3BsbChhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHgwNCxhcmdzKQorI2RlZmluZSBkZWJfcGxsKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHgwNCxhcmdzKQogI2RlZmluZSBkZWJfdHMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHgwOCxhcmdzKQogI2RlZmluZSBkZWJfZXJyKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHgxMCxhcmdzKQogI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHgyMCxhcmdzKQogI2RlZmluZSBkZWJfZncoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHg0MCxhcmdzKQorI2RlZmluZSBkZWJfbWVtKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfZGVidWcsMHg4MCxhcmdzKQogCiAvKiBjb21tb25seSB1c2VkICBtZXRob2RzICovCiBleHRlcm4gaW50IHVzYl9jeXByZXNzX2xvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKiwgY29uc3QgY2hhciAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCmluZGV4IGJkZDcyZjcuLjM0OTFmZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogaW50IGR2Yl91c2JfZmVfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UqIGQpCiB7CiAJaWYgKGQtPnByb3BzLmZyb250ZW5kX2F0dGFjaCA9PSBOVUxMKSB7Ci0JCWVycigic3RyYW5nZSAnJXMnIGRvbid0IHdhbnQgdG8gYXR0YWNoIGEgZnJvbnRlbmQuIixkLT5kZXNjLT5uYW1lKTsKKwkJZXJyKCJzdHJhbmdlICclcycgZG9lc24ndCB3YW50IHRvIGF0dGFjaCBhIGZyb250ZW5kLiIsZC0+ZGVzYy0+bmFtZSk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IGJjYjM0MTkuLjc5NGQ1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTEyLDcgKzEyLDcgQEAKIC8qIFZlbmRvciBJRHMgKi8KICNkZWZpbmUgVVNCX1ZJRF9BRFNURUNICQkJCQkJMHgwNmUxCiAjZGVmaW5lIFVTQl9WSURfQU5DSE9SCQkJCQkJMHgwNTQ3Ci0jZGVmaW5lIFVTQl9WSURfQVZFUk1FRElBX1VOSwkJCQkweDE0YWEKKyNkZWZpbmUgVVNCX1ZJRF9XSURFVklFVwkJCQkJMHgxNGFhCiAjZGVmaW5lIFVTQl9WSURfQVZFUk1FRElBCQkJCQkweDA3Y2EKICNkZWZpbmUgVVNCX1ZJRF9DT01QUk8JCQkJCQkweDE4NWIKICNkZWZpbmUgVVNCX1ZJRF9DT01QUk9fVU5LCQkJCQkweDE0NWYKQEAgLTI0LDYgKzI0LDggQEAKICNkZWZpbmUgVVNCX1ZJRF9IQU5GVEVLCQkJCQkJMHgxNWY0CiAjZGVmaW5lIFVTQl9WSURfSEFVUFBBVUdFCQkJCQkweDIwNDAKICNkZWZpbmUgVVNCX1ZJRF9IWVBFUl9QQUxURUsJCQkJMHgxMDI1CisjZGVmaW5lIFVTQl9WSURfS1lFCQkJCQkJCTB4MDQ1OAorI2RlZmluZSBVU0JfVklEX01FRElPTgkJCQkJCTB4MTY2MAogI2RlZmluZSBVU0JfVklEX1ZJU0lPTlBMVVMJCQkJCTB4MTNkMwogI2RlZmluZSBVU0JfVklEX1RXSU5IQU4JCQkJCQkweDE4MjIKICNkZWZpbmUgVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQwkJCTB4MDVkOApAQCAtNzAsNiArNzIsOCBAQAogI2RlZmluZSBVU0JfUElEX0hBTkZURUtfVU1UXzAxMF9XQVJNCQkweDAwMTUKICNkZWZpbmUgVVNCX1BJRF9EVFQyMDBVX0NPTEQJCQkJMHgwMjAxCiAjZGVmaW5lIFVTQl9QSURfRFRUMjAwVV9XQVJNCQkJCTB4MDMwMQorI2RlZmluZSBVU0JfUElEX1dUMjIwVV9DT0xECQkJCQkweDAyMjIKKyNkZWZpbmUgVVNCX1BJRF9XVDIyMFVfV0FSTQkJCQkJMHgwMjIxCiAjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfQ09MRAkJMHg5MzAwCiAjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfV0FSTQkJMHg5MzAxCiAjZGVmaW5lIFVTQl9QSURfTkVCVUxBX0RJR0lUVgkJCQkweDAyMDEKQEAgLTc4LDYgKzgyLDggQEAKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR0RUCQkJMHhkODIwCiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdaMjAxXzEJCTB4ZGIwMQogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX1RINzU3OV8yCQkweGRiMTEKLQorI2RlZmluZSBVU0JfUElEX01FRElPTl9NRDk1NzAwCQkJCTB4MDkzMgorI2RlZmluZSBVU0JfUElEX0tZRV9EVkJfVF9DT0xECQkJCTB4NzAxZQorI2RlZmluZSBVU0JfUElEX0tZRV9EVkJfVF9XQVJNCQkJCTB4NzAxZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCmluZGV4IDNhYWRlYzkuLjY1ZjBjMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwpAQCAtMTgsNiArMTgsMTAgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyx4ZmVyPTIscGxsPTQsdHM9OCxlcnI9MTYscmM9MzIsZnc9NjQgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKIAoraW50IGR2Yl91c2JfZGlzYWJsZV9yY19wb2xsaW5nOworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfcmNfcG9sbGluZywgZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcmNfcG9sbGluZywgImRpc2FibGUgcmVtb3RlIGNvbnRyb2wgcG9sbGluZyAoZGVmYXVsdDogMCkuIik7CisKIC8qIGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCiBpbnQgZHZiX3VzYl9leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKQEAgLTQ3LDE3ICs1MSwxNyBAQAogCiAvKiBzcGVlZCAtIHdoZW4gcnVubmluZyBhdCBGVUxMIHNwZWVkIHdlIG5lZWQgYSBIVyBQSUQgZmlsdGVyICovCiAJaWYgKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMICYmICEoZC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfSEFTX1BJRF9GSUxURVIpKSB7Ci0JCWVycigiVGhpcyBVU0IyLjAgZGV2aWNlIGNhbm5vdCBiZSBydW4gb24gYSBVU0IxLjEgcG9ydC4gKGl0IGxhY2tzIGEgSFcgUElEIGZpbHRlcikiKTsKKwkJZXJyKCJUaGlzIFVTQjIuMCBkZXZpY2UgY2Fubm90IGJlIHJ1biBvbiBhIFVTQjEuMSBwb3J0LiAoaXQgbGFja3MgYSBoYXJkd2FyZSBQSUQgZmlsdGVyKSIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMICYmIGQtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0hBU19QSURfRklMVEVSKSB8fAogCQkoZC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfTkVFRF9QSURfRklMVEVSSU5HKSkgewotCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaHcgUElEIGZpbHRlci4iKTsKKwkJaW5mbygid2lsbCB1c2UgdGhlIGRldmljZSdzIGhhcmR3YXJlIFBJRCBmaWx0ZXIgKHRhYmxlIGNvdW50OiAlZCkuIixkLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50KTsKIAkJZC0+cGlkX2ZpbHRlcmluZyA9IDE7CiAJCWQtPm1heF9mZWVkX2NvdW50ID0gZC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudDsKIAl9IGVsc2UgewotCQlpbmZvKCJ3aWxsIHBhc3MgdGhlIGNvbXBsZXRlIE1QRUcyIHRyYW5zcG9ydCBzdHJlYW0gdG8gdGhlIGRlbXV4ZXIuIik7CisJCWluZm8oIndpbGwgcGFzcyB0aGUgY29tcGxldGUgTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSB0byB0aGUgc29mdHdhcmUgZGVtdXhlci4iKTsKIAkJZC0+cGlkX2ZpbHRlcmluZyA9IDA7CiAJCWQtPm1heF9mZWVkX2NvdW50ID0gMjU1OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYwppbmRleCA5ZjFlMjNmLi5mYzc4MDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCkBAIC0yMSw2ICsyMSwxMCBAQAogCS8qIFRPRE86IG5lZWQgYSBsb2NrIGhlcmUuICBXZSBjYW4gc2ltcGx5IHNraXAgY2hlY2tpbmcgZm9yIHRoZSByZW1vdGUgY29udHJvbAogCSAgIGlmIHdlJ3JlIGJ1c3kuICovCiAKKwkvKiB3aGVuIHRoZSBwYXJhbWV0ZXIgaGFzIGJlZW4gc2V0IHRvIDEgdmlhIHN5c2ZzIHdoaWxlIHRoZSBkcml2ZXIgd2FzIHJ1bm5pbmcgKi8KKwlpZiAoZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcpCisJCXJldHVybjsKKwogCWlmIChkLT5wcm9wcy5yY19xdWVyeShkLCZldmVudCwmc3RhdGUpKSB7CiAJCWVycigiZXJyb3Igd2hpbGUgcXVlcnlpbmcgZm9yIGFuIHJlbW90ZSBjb250cm9sIGV2ZW50LiIpOwogCQlnb3RvIHNjaGVkdWxlOwpAQCAtMzUsNyArMzksNyBAQAogCQkJZC0+bGFzdF9ldmVudCA9IGV2ZW50OwogCQljYXNlIFJFTU9URV9LRVlfUkVQRUFUOgogCQkJZGViX3JjKCJrZXkgcmVwZWF0ZWRcbiIpOwotCQkJaW5wdXRfZXZlbnQoJmQtPnJjX2lucHV0X2RldiwgRVZfS0VZLCBldmVudCwgMSk7CisJCQlpbnB1dF9ldmVudCgmZC0+cmNfaW5wdXRfZGV2LCBFVl9LRVksIGQtPmxhc3RfZXZlbnQsIDEpOwogCQkJaW5wdXRfZXZlbnQoJmQtPnJjX2lucHV0X2RldiwgRVZfS0VZLCBkLT5sYXN0X2V2ZW50LCAwKTsKIAkJCWlucHV0X3N5bmMoJmQtPnJjX2lucHV0X2Rldik7CiAJCQlicmVhazsKQEAgLTg1LDcgKzg5LDkgQEAKIGludCBkdmJfdXNiX3JlbW90ZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAlpbnQgaTsKLQlpZiAoZC0+cHJvcHMucmNfa2V5X21hcCA9PSBOVUxMKQorCWlmIChkLT5wcm9wcy5yY19rZXlfbWFwID09IE5VTEwgfHwKKwkJZC0+cHJvcHMucmNfcXVlcnkgPT0gTlVMTCB8fAorCQlkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZykKIAkJcmV0dXJuIDA7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSByZW1vdGUtY29udHJvbCBzdHJ1Y3R1cmVzLiovCkBAIC0xNTQsMTIgKzE2MCwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgcmF3IGtleSBjb2RlLiAqLwotCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihrZXltYXApL3NpemVvZihzdHJ1Y3QgZHZiX3VzYl9yY19rZXkpOyBpKyspCisJCQlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspCiAJCQkJaWYgKGtleW1hcFtpXS5jdXN0b20gPT0ga2V5YnVmWzFdICYmCiAJCQkJCWtleW1hcFtpXS5kYXRhID09IGtleWJ1ZlszXSkgewogCQkJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CiAJCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCQkJYnJlYWs7CisJCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCWRlYl9lcnIoImtleSBtYXBwaW5nIGZhaWxlZCAtIG5vIGFwcHJvcHJpYXRlIGtleSBmb3VuZCBpbiBrZXltYXBwaW5nXG4iKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCmluZGV4IDgzZDQ3NmYuLmY1Nzk5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKQEAgLTI0LDExICsyNCwxMiBAQAogCWlmICgocmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkLT51c2Jfc2VtKSkpCiAJCXJldHVybiByZXQ7CiAKKwlkZWJfeGZlcigiPj4+ICIpOwogCWRlYnVnX2R1bXAod2J1Zix3bGVuLGRlYl94ZmVyKTsKIAogCXJldCA9IHVzYl9idWxrX21zZyhkLT51ZGV2LHVzYl9zbmRidWxrcGlwZShkLT51ZGV2LAogCQkJZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpLCB3YnVmLHdsZW4sJmFjdGxlbiwKLQkJCTIqSFopOworCQkJMjAwMCk7CiAKIAlpZiAocmV0KQogCQllcnIoImJ1bGsgbWVzc2FnZSBmYWlsZWQ6ICVkICglZC8lZCkiLHJldCx3bGVuLGFjdGxlbik7CkBAIC00MiwxMiArNDMsMTQgQEAKIAogCQlyZXQgPSB1c2JfYnVsa19tc2coZC0+dWRldix1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwKIAkJCQlkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkscmJ1ZixybGVuLCZhY3RsZW4sCi0JCQkJMipIWik7CisJCQkJMjAwMCk7CiAKIAkJaWYgKHJldCkKIAkJCWVycigicmVjdiBidWxrIG1lc3NhZ2UgZmFpbGVkOiAlZCIscmV0KTsKLQkJZWxzZQorCQllbHNlIHsKKwkJCWRlYl94ZmVyKCI8PDwgIik7CiAJCQlkZWJ1Z19kdW1wKHJidWYsYWN0bGVuLGRlYl94ZmVyKTsKKwkJfQogCX0KIAogCXVwKCZkLT51c2Jfc2VtKTsKQEAgLTYxLDEyICs2NCwxOSBAQAogfQogRVhQT1JUX1NZTUJPTChkdmJfdXNiX2dlbmVyaWNfd3JpdGUpOwogCi1zdGF0aWMgdm9pZCBkdmJfdXNiX2J1bGtfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKKworLyogVVJCIHN0dWZmIGZvciBzdHJlYW1pbmcgKi8KK3N0YXRpYyB2b2lkIGR2Yl91c2JfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1cmItPmNvbnRleHQ7CisJaW50IHB0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisJaW50IGk7CisJdTggKmI7CiAKLQlkZWJfdHMoImJ1bGsgdXJiIGNvbXBsZXRlZC4gZmVlZGNvdW50OiAlZCwgc3RhdHVzOiAlZCwgbGVuZ3RoOiAlZFxuIixkLT5mZWVkY291bnQsdXJiLT5zdGF0dXMsCi0JCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCWRlYl90cygiJyVzJyB1cmIgY29tcGxldGVkLiBmZWVkY291bnQ6ICVkLCBzdGF0dXM6ICVkLCBsZW5ndGg6ICVkLyVkLCBwYWNrX251bTogJWQsIGVycm9yczogJWRcbiIsCisJCQlwdHlwZSA9PSBQSVBFX0lTT0NIUk9OT1VTID8gImlzb2MiIDogImJ1bGsiLCBkLT5mZWVkY291bnQsCisJCQl1cmItPnN0YXR1cyx1cmItPmFjdHVhbF9sZW5ndGgsdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyx1cmItPmVycm9yX2NvdW50KTsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAwOiAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KQEAgLTgxLDExICs5MSwzMyBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGQtPmZlZWRjb3VudCA+IDAgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgewotCQlpZiAoZC0+c3RhdGUgJiBEVkJfVVNCX1NUQVRFX0RWQikKLQkJCWR2Yl9kbXhfc3dmaWx0ZXIoJmQtPmRlbXV4LCAodTgqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcix1cmItPmFjdHVhbF9sZW5ndGgpOwotCX0gZWxzZQotCQlkZWJfdHMoIlVSQiBkcm9wcGVkIGJlY2F1c2Ugb2YgZmVlZGNvdW50LlxuIik7CisJaWYgKGQtPmZlZWRjb3VudCA+IDApIHsKKwkJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9EVkIpIHsKKwkJCXN3aXRjaCAocHR5cGUpIHsKKwkJCQljYXNlIFBJUEVfSVNPQ0hST05PVVM6CisJCQkJCWIgPSAodTggKikgdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCQkJCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJCQkJCWlmICh1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyAhPSAwKQorCQkJCQkJCWRlYl90cygiaXNvIGZyYW1lIGRlc2NyaXB0b3IgaGFzIGFuIGVycm9yOiAlZFxuIix1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCQkJCQllbHNlIGlmICh1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCQkJCQkJCWR2Yl9kbXhfc3dmaWx0ZXIoJmQtPmRlbXV4LGIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCwKKwkJCQkJCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGgpOworCQkJCQkJCX0KKwkJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKKwkJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IDA7CisJCQkJCX0KKwkJCQkJZGVidWdfZHVtcChiLDIwLGRlYl90cyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUElQRV9CVUxLOgorCQkJCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKKwkJCQkJCWR2Yl9kbXhfc3dmaWx0ZXIoJmQtPmRlbXV4LCAodTggKikgdXJiLT50cmFuc2Zlcl9idWZmZXIsdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZXJyKCJ1bmtvd24gZW5kcG9pbnQgdHlwZSBpbiBjb21wbGV0aXRpb24gaGFuZGxlci4iKTsKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQogCiAJdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOwogfQpAQCAtOTQsNyArMTI2LDcgQEAKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgZC0+dXJic19zdWJtaXR0ZWQ7IGkrKykgewotCQlkZWJfaW5mbygia2lsbGluZyBVUkIgbm8uICVkLlxuIixpKTsKKwkJZGViX3RzKCJraWxsaW5nIFVSQiBuby4gJWQuXG4iLGkpOwogCiAJCS8qIHN0b3AgdGhlIFVSQiAqLwogCQl1c2Jfa2lsbF91cmIoZC0+dXJiX2xpc3RbaV0pOwpAQCAtMTA3LDkgKzEzOSw5IEBACiB7CiAJaW50IGkscmV0OwogCWZvciAoaSA9IDA7IGkgPCBkLT51cmJzX2luaXRpYWxpemVkOyBpKyspIHsKLQkJZGViX2luZm8oInN1Ym1pdHRpbmcgVVJCIG5vLiAlZFxuIixpKTsKKwkJZGViX3RzKCJzdWJtaXR0aW5nIFVSQiBuby4gJWRcbiIsaSk7CiAJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIoZC0+dXJiX2xpc3RbaV0sR0ZQX0FUT01JQykpKSB7Ci0JCQllcnIoImNvdWxkIG5vdCBzdWJtaXQgVVJCIG5vLiAlZCAtIGdldCB0aGVtIGFsbCBiYWNrXG4iLGkpOworCQkJZXJyKCJjb3VsZCBub3Qgc3VibWl0IFVSQiBuby4gJWQgLSBnZXQgdGhlbSBhbGwgYmFjayIsaSk7CiAJCQlkdmJfdXNiX3VyYl9raWxsKGQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMTE4LDMyICsxNTAsNzggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdmJfdXNiX2J1bGtfdXJiX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQorc3RhdGljIGludCBkdmJfdXNiX2ZyZWVfc3RyZWFtX2J1ZmZlcnMoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewotCWludCBpLGJ1ZnNpemUgPSBkLT5wcm9wcy51cmIuY291bnQgKiBkLT5wcm9wcy51cmIudS5idWxrLmJ1ZmZlcnNpemU7CisJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9VUkJfQlVGKSB7CisJCXdoaWxlIChkLT5idWZfbnVtKSB7CisJCQlkLT5idWZfbnVtLS07CisJCQlkZWJfbWVtKCJmcmVlaW5nIGJ1ZmZlciAlZFxuIixkLT5idWZfbnVtKTsKKwkJCXVzYl9idWZmZXJfZnJlZShkLT51ZGV2LCBkLT5idWZfc2l6ZSwKKwkJCQkJZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sIGQtPmRtYV9hZGRyW2QtPmJ1Zl9udW1dKTsKKwkJfQorCQlrZnJlZShkLT5idWZfbGlzdCk7CisJCWtmcmVlKGQtPmRtYV9hZGRyKTsKKwl9CiAKLQlkZWJfaW5mbygiYWxsb2NhdGUgJWQgYnl0ZXMgYXMgYnVmZmVyc2l6ZSBmb3IgYWxsIFVSQnNcbiIsYnVmc2l6ZSk7Ci0JLyogYWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgZm9yIHRoZSBVUkJzICovCi0JaWYgKChkLT5idWZmZXIgPSAgdXNiX2J1ZmZlcl9hbGxvYyhkLT51ZGV2LCBidWZzaXplLCBTTEFCX0FUT01JQywgJmQtPmRtYV9oYW5kbGUpKSA9PSBOVUxMKSB7Ci0JCWRlYl9pbmZvKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgdXJiLWJ1ZmZlciBhbGxvY2F0aW9uLlxuIik7CisJZC0+c3RhdGUgJj0gfkRWQl9VU0JfU1RBVEVfVVJCX0JVRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfYWxsb2NhdGVfc3RyZWFtX2J1ZmZlcnMoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgbnVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJZC0+YnVmX251bSA9IDA7CisJZC0+YnVmX3NpemUgPSBzaXplOworCisJZGViX21lbSgiYWxsIGluIGFsbCBJIHdpbGwgdXNlICVsdSBieXRlcyBmb3Igc3RyZWFtaW5nXG4iLG51bSpzaXplKTsKKworCWlmICgoZC0+YnVmX2xpc3QgPSBrbWFsbG9jKG51bSpzaXplb2YodTggKiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoZC0+ZG1hX2FkZHIgPSBrbWFsbG9jKG51bSpzaXplb2YoZG1hX2FkZHJfdCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWtmcmVlKGQtPmJ1Zl9saXN0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRlYl9pbmZvKCJhbGxvY2F0aW9uIHN1Y2Nlc3NmdWxcbiIpOwotCW1lbXNldChkLT5idWZmZXIsMCxidWZzaXplKTsKKwltZW1zZXQoZC0+YnVmX2xpc3QsMCxudW0qc2l6ZW9mKHU4ICopKTsKKwltZW1zZXQoZC0+ZG1hX2FkZHIsMCxudW0qc2l6ZW9mKGRtYV9hZGRyX3QpKTsKIAogCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfVVJCX0JVRjsKIAotCS8qIGFsbG9jYXRlIHRoZSBVUkJzICovCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnVyYi5jb3VudDsgaSsrKSB7Ci0JCWlmICghKGQtPnVyYl9saXN0W2ldID0gdXNiX2FsbG9jX3VyYigwLEdGUF9BVE9NSUMpKSkgeworCWZvciAoZC0+YnVmX251bSA9IDA7IGQtPmJ1Zl9udW0gPCBudW07IGQtPmJ1Zl9udW0rKykgeworCQlkZWJfbWVtKCJhbGxvY2F0aW5nIGJ1ZmZlciAlZFxuIixkLT5idWZfbnVtKTsKKwkJaWYgKCggZC0+YnVmX2xpc3RbZC0+YnVmX251bV0gPQorCQkJCQl1c2JfYnVmZmVyX2FsbG9jKGQtPnVkZXYsIHNpemUsIFNMQUJfQVRPTUlDLAorCQkJCQkmZC0+ZG1hX2FkZHJbZC0+YnVmX251bV0pICkgPT0gTlVMTCkgeworCQkJZGViX21lbSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYi1idWZmZXIgYWxsb2NhdGlvbi5cbiIpOworCQkJZHZiX3VzYl9mcmVlX3N0cmVhbV9idWZmZXJzKGQpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKwkJZGViX21lbSgiYnVmZmVyICVkOiAlcCAoZG1hOiAlZClcbiIsZC0+YnVmX251bSxkLT5idWZfbGlzdFtkLT5idWZfbnVtXSxkLT5kbWFfYWRkcltkLT5idWZfbnVtXSk7CisJCW1lbXNldChkLT5idWZfbGlzdFtkLT5idWZfbnVtXSwwLHNpemUpOworCX0KKwlkZWJfbWVtKCJhbGxvY2F0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3VzYl9idWxrX3VyYl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgaTsKKworCWlmICgoaSA9IGR2Yl91c2JfYWxsb2NhdGVfc3RyZWFtX2J1ZmZlcnMoZCxkLT5wcm9wcy51cmIuY291bnQsCisJCQkJCWQtPnByb3BzLnVyYi51LmJ1bGsuYnVmZmVyc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIGk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgVVJCcyAqLworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy51cmIuY291bnQ7IGkrKykgeworCQlpZiAoKGQtPnVyYl9saXN0W2ldID0gdXNiX2FsbG9jX3VyYigwLEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJdXNiX2ZpbGxfYnVsa191cmIoIGQtPnVyYl9saXN0W2ldLCBkLT51ZGV2LAogCQkJCXVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LGQtPnByb3BzLnVyYi5lbmRwb2ludCksCi0JCQkJJmQtPmJ1ZmZlcltpKmQtPnByb3BzLnVyYi51LmJ1bGsuYnVmZmVyc2l6ZV0sCisJCQkJZC0+YnVmX2xpc3RbaV0sCiAJCQkJZC0+cHJvcHMudXJiLnUuYnVsay5idWZmZXJzaXplLAotCQkJCWR2Yl91c2JfYnVsa191cmJfY29tcGxldGUsIGQpOworCQkJCWR2Yl91c2JfdXJiX2NvbXBsZXRlLCBkKTsKIAogCQlkLT51cmJfbGlzdFtpXS0+dHJhbnNmZXJfZmxhZ3MgPSAwOwogCQlkLT51cmJzX2luaXRpYWxpemVkKys7CkBAIC0xNTEsNiArMjI5LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHZiX3VzYl9pc29jX3VyYl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgaSxqOworCisJaWYgKChpID0gZHZiX3VzYl9hbGxvY2F0ZV9zdHJlYW1fYnVmZmVycyhkLGQtPnByb3BzLnVyYi5jb3VudCwKKwkJCQkJZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNpemUqZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNwZXJ1cmIpKSA8IDApCisJCXJldHVybiBpOworCisJLyogYWxsb2NhdGUgdGhlIFVSQnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMudXJiLmNvdW50OyBpKyspIHsKKwkJc3RydWN0IHVyYiAqdXJiOworCQlpbnQgZnJhbWVfb2Zmc2V0ID0gMDsKKwkJaWYgKChkLT51cmJfbGlzdFtpXSA9CisJCQkJCXVzYl9hbGxvY191cmIoZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNwZXJ1cmIsR0ZQX0FUT01JQykpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQl1cmIgPSBkLT51cmJfbGlzdFtpXTsKKworCQl1cmItPmRldiA9IGQtPnVkZXY7CisJCXVyYi0+Y29udGV4dCA9IGQ7CisJCXVyYi0+Y29tcGxldGUgPSBkdmJfdXNiX3VyYl9jb21wbGV0ZTsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKGQtPnVkZXYsZC0+cHJvcHMudXJiLmVuZHBvaW50KTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQl1cmItPmludGVydmFsID0gZC0+cHJvcHMudXJiLnUuaXNvYy5pbnRlcnZhbDsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IGQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzcGVydXJiOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBkLT5idWZfc2l6ZTsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBkLT5idWZfbGlzdFtpXTsKKwkJdXJiLT50cmFuc2Zlcl9kbWEgPSBkLT5kbWFfYWRkcltpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNwZXJ1cmI7IGorKykgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBmcmFtZV9vZmZzZXQ7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IGQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzaXplOworCQkJZnJhbWVfb2Zmc2V0ICs9IGQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzaXplOworCQl9CisKKwkJZC0+dXJic19pbml0aWFsaXplZCsrOworCX0KKwlyZXR1cm4gMDsKKworfQorCiBpbnQgZHZiX3VzYl91cmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7CiAJLyoKQEAgLTE3NCw4ICsyOTMsNyBAQAogCQljYXNlIERWQl9VU0JfQlVMSzoKIAkJCXJldHVybiBkdmJfdXNiX2J1bGtfdXJiX2luaXQoZCk7CiAJCWNhc2UgRFZCX1VTQl9JU09DOgotCQkJZXJyKCJpc29jaHJvbm91cyB0cmFuc2ZlciBub3QgeWV0IGltcGxlbWVudGVkIGluIGR2Yi11c2IuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBkdmJfdXNiX2lzb2NfdXJiX2luaXQoZCk7CiAJCWRlZmF1bHQ6CiAJCQllcnIoInVua293biBVUkItdHlwZSBmb3IgZGF0YSB0cmFuc2Zlci4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTkxLDcgKzMwOSw3IEBACiAJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9VUkJfTElTVCkgewogCQlmb3IgKGkgPSAwOyBpIDwgZC0+dXJic19pbml0aWFsaXplZDsgaSsrKSB7CiAJCQlpZiAoZC0+dXJiX2xpc3RbaV0gIT0gTlVMTCkgewotCQkJCWRlYl9pbmZvKCJmcmVlaW5nIFVSQiBuby4gJWQuXG4iLGkpOworCQkJCWRlYl9tZW0oImZyZWVpbmcgVVJCIG5vLiAlZC5cbiIsaSk7CiAJCQkJLyogZnJlZSB0aGUgVVJCcyAqLwogCQkJCXVzYl9mcmVlX3VyYihkLT51cmJfbGlzdFtpXSk7CiAJCQl9CkBAIC0yMDIsMTAgKzMyMCw2IEBACiAJCWQtPnN0YXRlICY9IH5EVkJfVVNCX1NUQVRFX1VSQl9MSVNUOwogCX0KIAotCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfVVJCX0JVRikKLQkJdXNiX2J1ZmZlcl9mcmVlKGQtPnVkZXYsIGQtPnByb3BzLnVyYi51LmJ1bGsuYnVmZmVyc2l6ZSAqIGQtPnByb3BzLnVyYi5jb3VudCwKLQkJCQlkLT5idWZmZXIsIGQtPmRtYV9oYW5kbGUpOwotCi0JZC0+c3RhdGUgJj0gfkRWQl9VU0JfU1RBVEVfVVJCX0JVRjsKKwlkdmJfdXNiX2ZyZWVfc3RyZWFtX2J1ZmZlcnMoZCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IGFiY2VlMTkuLmE4MDU2N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0xODksMTIgKzE4OSwxMyBAQAogCQkJc3RydWN0IHsKIAkJCQlpbnQgZnJhbWVzcGVydXJiOwogCQkJCWludCBmcmFtZXNpemU7CisJCQkJaW50IGludGVydmFsOwogCQkJfSBpc29jOwogCQl9IHU7CiAJfSB1cmI7CiAKIAlpbnQgbnVtX2RldmljZV9kZXNjczsKLQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gZGV2aWNlc1s4XTsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gZGV2aWNlc1s5XTsKIH07CiAKIApAQCAtMjA3LDE5ICsyMDgsMjggQEAKICAqIEB1ZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBzdHJ1Y3QgdXNiX2RldmljZS4KICAqIEB1cmJfbGlzdDogYXJyYXkgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cnVjdCB1cmIgZm9yIHRoZSBNUEVHMi1UUy0KICAqICBzdHJlYW1pbmcuCi0gKiBAYnVmZmVyOiBidWZmZXIgdXNlZCB0byBzdHJlYW1pbmcuCi0gKiBAZG1hX2hhbmRsZTogZG1hX2FkZHJfdCBmb3IgYnVmZmVyLgorICoKKyAqIEBidWZfbnVtOiBudW1iZXIgb2YgYnVmZmVyIGFsbG9jYXRlZC4KKyAqIEBidWZfc2l6ZTogc2l6ZSBvZiBlYWNoIGJ1ZmZlciBpbiBidWZfbGlzdC4KKyAqIEBidWZfbGlzdDogYXJyYXkgY29udGFpbmluZyBhbGwgYWxsb2NhdGUgYnVmZmVycyBmb3Igc3RyZWFtaW5nLgorICogQGRtYV9hZGRyOiBsaXN0IG9mIGRtYV9hZGRyX3QgZm9yIGVhY2ggYnVmZmVyIGluIGJ1Zl9saXN0LgorICoKICAqIEB1cmJzX2luaXRpYWxpemVkOiBudW1iZXIgb2YgVVJCcyBpbml0aWFsaXplZC4KICAqIEB1cmJzX3N1Ym1pdHRlZDogbnVtYmVyIG9mIFVSQnMgc3VibWl0dGVkLgorICoKICAqIEBmZWVkY291bnQ6IG51bWJlciBvZiByZXFlc3RlZCBmZWVkcyAodXNlZCBmb3Igc3RyZWFtaW5nLWFjdGl2YXRpb24pCiAgKiBAcGlkX2ZpbHRlcmluZzogaXMgaGFyZHdhcmUgcGlkX2ZpbHRlcmluZyB1c2VkIG9yIG5vdC4KKyAqCiAgKiBAdXNiX3NlbTogc2VtYXBob3JlIG9mIFVTQiBjb250cm9sIG1lc3NhZ2VzIChyZWFkaW5nIG5lZWRzIHR3byBtZXNzYWdlcykKICAqIEBpMmNfc2VtOiBzZW1hcGhvcmUgZm9yIGkyYy10cmFuc2ZlcnMKKyAqCiAgKiBAaTJjX2FkYXA6IGRldmljZSdzIGkyY19hZGFwdGVyIGlmIGl0IHVzZXMgSTJDb3ZlclVTQgogICogQHBsbF9hZGRyOiBJMkMgYWRkcmVzcyBvZiB0aGUgdHVuZXIgZm9yIHByb2dyYW1taW5nCiAgKiBAcGxsX2luaXQ6IGFycmF5IGNvbnRhaW5pbmcgdGhlIGluaXRpYWxpemF0aW9uIGJ1ZmZlcgogICogQHBsbF9kZXNjOiBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3QgZHZiX3BsbF9kZXNjCi0gKiBAdHVuZXJfcGFzc19jdHJsOiBjYWxsZWQgdG8gKGRlKWFjdGl2YXRlIHR1bmVyIHBhc3N0aHJ1IG9mIHRoZSBkZW1vZAorICoKKyAqIEB0dW5lcl9wYXNzX2N0cmw6IGNhbGxlZCB0byAoZGUpYWN0aXZhdGUgdHVuZXIgcGFzc3RocnUgb2YgdGhlIGRlbW9kIG9yIHRoZSBib2FyZAorICoKICAqIEBkdmJfYWRhcDogZGV2aWNlJ3MgZHZiX2FkYXB0ZXIuCiAgKiBAZG14ZGV2OiBkZXZpY2UncyBkbXhkZXYuCiAgKiBAZGVtdXg6IGRldmljZSdzIHNvZnR3YXJlIGRlbXV4ZXIuCkBAIC0yNTMsOCArMjYzLDEyIEBACiAJLyogdXNiICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVyYiAqKnVyYl9saXN0OwotCXU4ICpidWZmZXI7Ci0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCisJaW50IGJ1Zl9udW07CisJdW5zaWduZWQgbG9uZyBidWZfc2l6ZTsKKwl1OCAqKmJ1Zl9saXN0OworCWRtYV9hZGRyX3QgKmRtYV9hZGRyOworCiAJaW50IHVyYnNfaW5pdGlhbGl6ZWQ7CiAJaW50IHVyYnNfc3VibWl0dGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKaW5kZXggOWQ4Mzc4MS4uMjU4YTkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBub3ZhX3RfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLU5PVkEtVCB1c2IyIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9ub3ZhX3RfdXNiMiIsCiAJLnByb2JlCQk9IG5vdmFfdF9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlCT0gbm92YV90X3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwppbmRleCBhYTU2MDQyLi4yMTEyYWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1bXRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiSGFuZlRlayBVTVQtMDEwIFVTQjIuMCBEVkItVCBkZXZpY2VzIiwKKwkubmFtZQkJPSAiZHZiX3VzYl91bXRfMDEwIiwKIAkucHJvYmUJCT0gdW10X3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUJPSB1bXRfdGFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwppbmRleCAwMmVjYzlhLi45YWM5NWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlpZiAodXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCiAJCQl1c2Jfc25kY3RybHBpcGUoZC0+dWRldiwwKSwKIAkJCVRIX0NPTU1BTkRfT1VULCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwgMCwgMCwKLQkJCW91dGJ1ZiwgMjAsIDIqSFopICE9IDIwKSB7CisJCQlvdXRidWYsIDIwLCAyMDAwKSAhPSAyMCkgewogCQllcnIoIlVTQiBjb250cm9sIG1lc3NhZ2UgJ291dCcgd2VudCB3cm9uZy4iKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byB1bmxvY2s7CkBAIC01NSw3ICs1NSw3IEBACiAJaWYgKHVzYl9jb250cm9sX21zZyhkLT51ZGV2LAogCQkJdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsMCksCiAJCQlUSF9DT01NQU5EX0lOLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOLCAwLCAwLAotCQkJaW5idWYsIDEyLCAyKkhaKSAhPSAxMikgeworCQkJaW5idWYsIDEyLCAyMDAwKSAhPSAxMikgewogCQllcnIoIlVTQiBjb250cm9sIG1lc3NhZ2UgJ2luJyB3ZW50IHdyb25nLiIpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIHVubG9jazsKQEAgLTk0LDE2ICs5NCw0MSBAQAogLyogVGhlIGtleW1hcHBpbmcgc3RydWN0LiBTb21laG93IHRoaXMgc2hvdWxkIGJlIGxvYWRlZCB0byB0aGUgZHJpdmVyLCBidXQKICAqIGN1cnJlbnRseSBpdCBpcyBoYXJkY29kZWQuICovCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IHZwNzA0NV9yY19rZXlzW10gPSB7Ci0JLyogaW5zZXJ0IHRoZSBrZXlzIGxpa2UgdGhpcy4gdG8gbWFrZSB0aGUgcmF3IGtleXMgdmlzaWJsZSwgZW5hYmxlCi0JICogZGVidWc9MHgwNCB3aGVuIGxvYWRpbmcgZHZiLXVzYi12cDcwNDUuICovCi0KLQkvKiB0aGVzZSBrZXlzIGFyZSBwcm9iYWJseSB3cm9uZy4gSSBkb24ndCBoYXZlIGEgd29ya2luZyBJUi1yZWNlaXZlciBvbiBteQotCSAqIHZwNzA0NSwgc28gSSBjYW4ndCB0ZXN0IGl0LiAgUGF0Y2hlcyBhcmUgd2VsY29tZS4gKi8KLQl7IDB4MDAsIDB4MDEsIEtFWV8xIH0sCi0JeyAweDAwLCAweDAyLCBLRVlfMiB9LAorCXsgMHgwMCwgMHgxNiwgS0VZX1BPV0VSIH0sCisJeyAweDAwLCAweDEwLCBLRVlfTVVURSB9LAorCXsgMHgwMCwgMHgwMywgS0VZXzEgfSwKKwl7IDB4MDAsIDB4MDEsIEtFWV8yIH0sCisJeyAweDAwLCAweDA2LCBLRVlfMyB9LAorCXsgMHgwMCwgMHgwOSwgS0VZXzQgfSwKKwl7IDB4MDAsIDB4MWQsIEtFWV81IH0sCisJeyAweDAwLCAweDFmLCBLRVlfNiB9LAorCXsgMHgwMCwgMHgwZCwgS0VZXzcgfSwKKwl7IDB4MDAsIDB4MTksIEtFWV84IH0sCisJeyAweDAwLCAweDFiLCBLRVlfOSB9LAorCXsgMHgwMCwgMHgxNSwgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MDUsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MDAsIDB4MDIsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwMCwgMHgxZSwgS0VZX1ZPTFVNRVVQIH0sCisJeyAweDAwLCAweDBhLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMCwgMHgxMSwgS0VZX1JFQ09SRCB9LAorCXsgMHgwMCwgMHgxNywgS0VZX0ZBVk9SSVRFUyB9LCAvKiBIZWFydCBzeW1ib2wgLSBDaGFubmVsIGxpc3QuICovCisJeyAweDAwLCAweDE0LCBLRVlfUExBWSB9LAorCXsgMHgwMCwgMHgxYSwgS0VZX1NUT1AgfSwKKwl7IDB4MDAsIDB4NDAsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MDAsIDB4MTIsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgwMCwgMHgwZSwgS0VZX1BSRVZJT1VTIH0sIC8qIFJlY2FsbCAtIFByZXZpb3VzIGNoYW5uZWwuICovCisJeyAweDAwLCAweDRjLCBLRVlfUEFVU0UgfSwKKwl7IDB4MDAsIDB4NGQsIEtFWV9TQ1JFRU4gfSwgLyogRnVsbCBzY3JlZW4gbW9kZS4gKi8KKwl7IDB4MDAsIDB4NTQsIEtFWV9BVURJTyB9LCAvKiBNVFMgLSBTd2l0Y2ggdG8gc2Vjb25kYXJ5IGF1ZGlvLiAqLworCXsgMHgwMCwgMHgwYywgS0VZX0NBTkNFTCB9LCAvKiBDYW5jZWwgKi8KKwl7IDB4MDAsIDB4MWMsIEtFWV9FUEcgfSwgLyogRVBHICovCisJeyAweDAwLCAweDAwLCBLRVlfVEFCIH0sIC8qIFRhYiAqLworCXsgMHgwMCwgMHg0OCwgS0VZX0lORk8gfSwgLyogUHJldmlldyAqLworCXsgMHgwMCwgMHgwNCwgS0VZX0xJU1QgfSwgLyogUmVjb3JkTGlzdCAqLworCXsgMHgwMCwgMHgwZiwgS0VZX1RFWFQgfSAvKiBUZWxldGV4dCAqLwogfTsKIAotc3RhdGljIGludCB2cDcwNDVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmtleV9idWYsIGludCAqc3RhdGUpCitzdGF0aWMgaW50IHZwNzA0NV9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCiB7CiAJdTgga2V5OwogCWludCBpOwpAQCAtMTE5LDcgKzE0NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IHNpemVvZih2cDcwNDVfcmNfa2V5cykvc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX3JjX2tleSk7IGkrKykKIAkJaWYgKHZwNzA0NV9yY19rZXlzW2ldLmRhdGEgPT0ga2V5KSB7CiAJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7Ci0JCQkqa2V5X2J1ZiA9IHZwNzA0NV9yY19rZXlzW2ldLmV2ZW50OworCQkJKmV2ZW50ID0gdnA3MDQ1X3JjX2tleXNbaV0uZXZlbnQ7CiAJCQlicmVhazsKIAkJfQogCXJldHVybiAwOwpAQCAtMjMwLDcgKzI1NSw3IEBACiAvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdnA3MDQ1X3VzYl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJkdmItdXNiLXZwNzA0NSIsCisJLm5hbWUJCT0gImR2Yl91c2JfdnA3MDQ1IiwKIAkucHJvYmUgCQk9IHZwNzA0NV91c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZSAJPSB2cDcwNDVfdXNiX3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwppbmRleCBiNGZkZGY1Li5kODQ3YzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwpAQCAtNDAsNiArNDAsMTIgQEAKIAloZWxwCiAJICBBIERWQi1TIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfUzVIMTQyMAorCXRyaXN0YXRlICJTYW1zdW5nIFM1SDE0MjAgYmFzZWQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWhlbHAKKwkgIEEgRFZCLVMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogY29tbWVudCAiRFZCLVQgKHRlcnJlc3RyaWFsKSBmcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogCkBAIC0xODEsNCArMTg3LDExIEBACiAJICBBbiBBVFNDIDhWU0IvMTZWU0IgYW5kIFFBTTY0LzI1NiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8KIAkgIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorY29uZmlnIERWQl9MR0RUMzMwMgorCXRyaXN0YXRlICJMR0RUMzMwMiBiYXNlZCAoRFZpQ08gRnVzaW9uSERUVjMgR29sZCkiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWhlbHAKKwkgIEFuIEFUU0MgOFZTQiBhbmQgUUFNNjQvMjU2IHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudAorCSAgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggOTFkNmQzNS4uZGU1ZTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtMjksMyArMjksNSBAQAogb2JqLSQoQ09ORklHX0RWQl9PUjUxMjExKSArPSBvcjUxMjExLm8KIG9iai0kKENPTkZJR19EVkJfT1I1MTEzMikgKz0gb3I1MTEzMi5vCiBvYmotJChDT05GSUdfRFZCX0JDTTM1MTApICs9IGJjbTM1MTAubworb2JqLSQoQ09ORklHX0RWQl9TNUgxNDIwKSArPSBzNWgxNDIwLm8KK29iai0kKENPTkZJR19EVkJfTEdEVDMzMDIpICs9IGxnZHQzMzAyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCmluZGV4IGY0YWE0NDEuLjlmNjM5MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYwpAQCAtNzYsNyArNzYsNiBAQAogCTB4NDksIDB4NTYsCiAJMHg2YiwgMHgxZSwKIAkweGM4LCAweDAyLAotCTB4ZjgsIDB4MDIsCiAJMHhmOSwgMHgwMCwKIAkweGZhLCAweDAwLAogCTB4ZmIsIDB4MDAsCkBAIC0yMDMsNyArMjAyLDcgQEAKIAlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCS8qIHNldCBQTEwgKi8KLSAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CisJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CiAJaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpIHsKIAkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CiAJfSBlbHNlIGlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYykgewpAQCAtMjE3LDcgKzIxNiw3IEBACiAJfSBlbHNlIHsKIAkJQlVHKCk7CiAJfQotICAgICAgICBjeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLDB4MEQpIHwgMSk7CisJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSB8IDEpOwogCiAJLyogc2V0IGludmVyc2lvbiAqLwogCWN4MjI3MDJfc2V0X2ludmVyc2lvbiAoc3RhdGUsIHAtPmludmVyc2lvbik7CkBAIC0yNTYsNyArMjU1LDcgQEAKIAkJY3gyMjcwMl93cml0ZXJlZyhzdGF0ZSwgMHgwQiwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLCAweDBCKSAmIDB4ZmMgKTsKIAkJY3gyMjcwMl93cml0ZXJlZyhzdGF0ZSwgMHgwQywgKGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwgMHgwQykgJiAweEJGKSB8IDB4NDAgKTsKIAkJY3gyMjcwMl93cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMSk7IC8qIEJlZ2luIGFxdWlzaXRpb24gKi8KLQkJcHJpbnRrKCIlczogQXV0b2RldGVjdGluZ1xuIixfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogQXV0b2RldGVjdGluZ1xuIixfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM0NywxMCArMzQ2LDExIEBACiAJZm9yIChpPTA7IGk8c2l6ZW9mKGluaXRfdGFiKTsgaSs9MikKIAkJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIGluaXRfdGFiW2ldLCBpbml0X3RhYltpKzFdKTsKIAorCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweGY4LCAoc3RhdGUtPmNvbmZpZy0+b3V0cHV0X21vZGUgPDwgMSkgJiAweDAyKTsKIAogCS8qIGluaXQgUExMICovCiAJaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JICAgICAgICBjeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLDB4MEQpICYweGZlKTsKKwkJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmIDB4ZmUpOwogCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CiAJCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgfCAxKTsKIAl9CkBAIC00NDAsOCArNDQwLDEwIEBACiAKIAkvKiBSUyBVbmNvcnJlY3RhYmxlIFBhY2tldCBDb3VudCB0aGVuIHJlc2V0ICovCiAJX3VjYmxvY2tzID0gY3gyMjcwMl9yZWFkcmVnIChzdGF0ZSwgMHhFMyk7Ci0JaWYgKHN0YXRlLT5wcmV2VUNCbG9ja3MgPCBfdWNibG9ja3MpICp1Y2Jsb2NrcyA9IChfdWNibG9ja3MgLSBzdGF0ZS0+cHJldlVDQmxvY2tzKTsKLQllbHNlICp1Y2Jsb2NrcyA9IHN0YXRlLT5wcmV2VUNCbG9ja3MgLSBfdWNibG9ja3M7CisJaWYgKHN0YXRlLT5wcmV2VUNCbG9ja3MgPCBfdWNibG9ja3MpCisJCSp1Y2Jsb2NrcyA9IChfdWNibG9ja3MgLSBzdGF0ZS0+cHJldlVDQmxvY2tzKTsKKwllbHNlCisJCSp1Y2Jsb2NrcyA9IHN0YXRlLT5wcmV2VUNCbG9ja3MgLSBfdWNibG9ja3M7CiAJc3RhdGUtPnByZXZVQ0Jsb2NrcyA9IF91Y2Jsb2NrczsKIAogCXJldHVybiAwOwpAQCAtNDU3LDYgKzQ1OSwxMiBAQAogCXJldHVybiBjeDIyNzAyX2dldF90cHMgKHN0YXRlLCAmcC0+dS5vZmRtKTsKIH0KIAorc3RhdGljIGludCBjeDIyNzAyX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMTAwMDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgY3gyMjcwMl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNDcyLDcgKzQ4MCw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwogCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjI3MDJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CkBAIC00ODEsNyArNDkwLDggQEAKIAlzdGF0ZS0+cHJldlVDQmxvY2tzID0gMDsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCWlmIChjeDIyNzAyX3JlYWRyZWcoc3RhdGUsIDB4MWYpICE9IDB4MykgZ290byBlcnJvcjsKKwlpZiAoY3gyMjcwMl9yZWFkcmVnKHN0YXRlLCAweDFmKSAhPSAweDMpCisJCWdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCiAJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwpAQCAtNTE0LDYgKzUyNCw3IEBACiAKIAkuc2V0X2Zyb250ZW5kID0gY3gyMjcwMl9zZXRfdHBzLAogCS5nZXRfZnJvbnRlbmQgPSBjeDIyNzAyX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBjeDIyNzAyX2dldF90dW5lX3NldHRpbmdzLAogCiAJLnJlYWRfc3RhdHVzID0gY3gyMjcwMl9yZWFkX3N0YXR1cywKIAkucmVhZF9iZXIgPSBjeDIyNzAyX3JlYWRfYmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKaW5kZXggNTU5ZmRiOS4uMTFmODY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCkBAIC0zNSw2ICszNSwxMSBAQAogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKIAorCS8qIHNlcmlhbC9wYXJhbGxlbCBvdXRwdXQgKi8KKyNkZWZpbmUgQ1gyMjcwMl9QQVJBTExFTF9PVVRQVVQgMAorI2RlZmluZSBDWDIyNzAyX1NFUklBTF9PVVRQVVQgICAxCisJdTggb3V0cHV0X21vZGU7CisKIAkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KIAl1OCBwbGxfYWRkcmVzczsKIAlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCmluZGV4IGY3M2I1ZjQuLjVhZmVhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwpAQCAtNTUsNyArNTUsNyBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF90aG9tc29uX2R0dDc2MTApOwogCi1zdGF0aWMgdm9pZCB0aG9tc29uX2R0dDc1OXhfYncodTggKmJ1ZiwgaW50IGJhbmR3aWR0aCkKK3N0YXRpYyB2b2lkIHRob21zb25fZHR0NzU5eF9idyh1OCAqYnVmLCB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCkKIHsKIAlpZiAoQkFORFdJRFRIXzdfTUhaID09IGJhbmR3aWR0aCkKIAkJYnVmWzNdIHw9IDB4MTA7CkBAIC05Myw2ICs5MywzMiBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF9sZ196MjAxKTsKIAorc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX21pY3JvdHVuZV80MDQyID0geworCS5uYW1lICA9ICJNaWNyb3R1bmUgNDA0MiBGSTUiLAorCS5taW4gICA9ICA1NzAwMDAwMCwKKwkubWF4ICAgPSA4NTgwMDAwMDAsCisJLmNvdW50ID0gMywKKwkuZW50cmllcyA9IHsKKwkJeyAxNjIwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHhhMSB9LAorCQl7IDQ1NzAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDkxIH0sCisJCXsgOTk5OTk5OTk5LCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4MzEgfSwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF9taWNyb3R1bmVfNDA0Mik7CisKK3N0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MTEgPSB7CisJLm5hbWUgID0gIlRob21zb24gZHR0NzYxMSIsCisJLm1pbiAgID0gIDQ0MDAwMDAwLAorCS5tYXggICA9IDk1ODAwMDAwMCwKKwkuY291bnQgPSAzLAorCS5lbnRyaWVzID0geworCQl7IDE1NzI1MDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDM5IH0sCisJCXsgNDU0MDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4M2EgfSwKKwkJeyA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzYyB9LAorCX0sCit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZHR0NzYxMSk7CisKIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF91bmtub3duXzEgPSB7CiAJLm5hbWUgID0gInVua25vd24gMSIsIC8qIHVzZWQgYnkgZG50diBsaXZlIGR2Yi10ICovCiAJLm1pbiAgID0gMTc0MDAwMDAwLApAQCAtMTQ2LDcgKzE3Miw3IEBACiAvKiBQaGlsaXBzIFREQTY2NTAvVERBNjY1MQogICogdXNlZCBpbiBQYW5hc29uaWMgRU5WNzdIMTFENQogICovCi1zdGF0aWMgdm9pZCB0ZGE2NjV4X2J3KHU4ICpidWYsIGludCBiYW5kd2lkdGgpCitzdGF0aWMgdm9pZCB0ZGE2NjV4X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQogewogCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKQogCQlidWZbM10gfD0gMHgwODsKQEAgLTE3OCw3ICsyMDQsNyBAQAogLyogSW5maW5lb24gVFVBNjAzNAogICogdXNlZCBpbiBMRyBURFRQIEUxMDJQCiAgKi8KLXN0YXRpYyB2b2lkIHR1YTYwMzRfYncodTggKmJ1ZiwgaW50IGJhbmR3aWR0aCkKK3N0YXRpYyB2b2lkIHR1YTYwMzRfYncodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpCiB7CiAJaWYgKEJBTkRXSURUSF83X01IWiAhPSBiYW5kd2lkdGgpCiAJCWJ1ZlszXSB8PSAweDA4OwpAQCAtMTk4LDYgKzIyNCw1NyBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF90dWE2MDM0KTsKIAorLyogUGhpbGlwcyBGTUQxMjE2TUUKKyAqIHVzZWQgaW4gTWVkaW9uIEh5YnJpZCBQQ01DSUEgY2FyZCBhbmQgVVNCIEJveAorICovCitzdGF0aWMgdm9pZCBmbWQxMjE2bWVfYncodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpCit7CisJaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFogJiYgZnJlcSA+PSAxNTg4NzAwMDApCisJCWJ1ZlszXSB8PSAweDA4OworfQorCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZm1kMTIxNm1lID0geworCS5uYW1lID0gIlBoaWxpcHMgRk1EMTIxNk1FIiwKKwkubWluID0gNTA4NzAwMDAsCisJLm1heCA9IDg1ODAwMDAwMCwKKwkuc2V0YncgPSBmbWQxMjE2bWVfYncsCisJLmNvdW50ID0gNywKKwkuZW50cmllcyA9IHsKKwkJeyAxNDM4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4YmMsIDB4NDEgfSwKKwkJeyAxNTg4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4ZjQsIDB4NDEgfSwKKwkJeyAzMjk4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4YmMsIDB4NDIgfSwKKwkJeyA0NDE4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4ZjQsIDB4NDIgfSwKKwkJeyA2MjU4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4YmMsIDB4NDQgfSwKKwkJeyA4MDM4NzAwMDAsIDM2MjEzMzMzLCAxNjY2NjcsIDB4ZjQsIDB4NDQgfSwKKwkJeyA5OTk5OTk5OTksIDM2MjEzMzMzLCAxNjY2NjcsIDB4ZmMsIDB4NDQgfSwKKwl9Cit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX2ZtZDEyMTZtZSk7CisKKy8qIEFMUFMgVERFRDQKKyAqIHVzZWQgaW4gTmVidWxhLUNhcmRzIGFuZCBVU0IgYm94ZXMKKyAqLworc3RhdGljIHZvaWQgdGRlZDRfYncodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpCit7CisJaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopCisJCWJ1ZlszXSB8PSAweDA0OworfQorCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGRlZDQgPSB7CisJLm5hbWUgPSAiQUxQUyBUREVENCIsCisJLm1pbiA9IDQ3MDAwMDAwLAorCS5tYXggPSA4NjMwMDAwMDAsCisJLnNldGJ3ID0gdGRlZDRfYncsCisJLmNvdW50ID0gNCwKKwkuZW50cmllcyA9IHsKKwkJeyAxNTMwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjcsIDB4ODUsIDB4MDEgfSwKKwkJeyA0NzAwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjcsIDB4ODUsIDB4MDIgfSwKKwkJeyA4MjMwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjcsIDB4ODUsIDB4MDggfSwKKwkJeyA5OTk5OTk5OTksIDM2MTY2NjY3LCAxNjY2NjcsIDB4ODUsIDB4ODggfSwKKwl9Cit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX3RkZWQ0KTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTIzMSw3ICszMDgsNyBAQAogCWJ1ZlszXSA9IGRlc2MtPmVudHJpZXNbaV0uY2IyOwogCiAJaWYgKGRlc2MtPnNldGJ3KQotCQlkZXNjLT5zZXRidyhidWYsIGJhbmR3aWR0aCk7CisJCWRlc2MtPnNldGJ3KGJ1ZiwgZnJlcSwgYmFuZHdpZHRoKTsKIAogCWlmIChkZWJ1ZykKIAkJcHJpbnRrKCJwbGw6ICVzOiBkaXY9JWQgfCBidWY9MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKaW5kZXggYjc5Njc3OC4uY2I3OTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCkBAIC05LDcgKzksNyBAQAogCWNoYXIgKm5hbWU7CiAJdTMyICBtaW47CiAJdTMyICBtYXg7Ci0Jdm9pZCAoKnNldGJ3KSh1OCAqYnVmLCBpbnQgYmFuZHdpZHRoKTsKKwl2b2lkICgqc2V0YncpKHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKTsKIAlpbnQgIGNvdW50OwogCXN0cnVjdCB7CiAJCXUzMiBsaW1pdDsKQEAgLTI0LDEyICsyNCwxNiBAQAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc1OXg7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZHR0NzYxMDsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfbGdfejIwMTsKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfbWljcm90dW5lXzQwNDI7CitleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZHR0NzYxMTsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdW5rbm93bl8xOwogCiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3R1YTYwMTB4czsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZW52NTdoMXhkNTsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdHVhNjAzNDsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGRhNjY1eDsKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZm1kMTIxNm1lOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZGVkNDsKIAogaW50IGR2Yl9wbGxfY29uZmlndXJlKHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MsIHU4ICpidWYsCiAJCSAgICAgIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwppbmRleCAwMzFhMWRkLi5mYWFhZDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCkBAIC00NzQsMTEgKzQ3NCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGw2NDc4MV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKQorc3RhdGljIGludCBsNjQ3ODFfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKIHsKLSAgICAgICAgZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOwotICAgICAgICBmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAxNjY2Njc7Ci0gICAgICAgIGZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDE2NjY2NyoyOworICAgICAgICBmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSA0MDAwOworICAgICAgICBmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAwOworICAgICAgICBmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAwOwogICAgICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVhMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiAgICBTdXBwb3J0IGZvciBMR0RUMzMwMiAoRFZpQ08gRnVzdGlvbkhEVFYgMyBHb2xkKSAtIFZTQi9RQU0KKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgV2lsc29uIE1pY2hhZWxzIDx3aWxzb25taWNoYWVsc0BlYXJ0aGxpbmsubmV0PgorICoKKyAqICAgIEJhc2VkIG9uIGNvZGUgZnJvbSAgS2lyayBMYXByYXkgPGtpcmtfbGFwcmF5QGJpZ2Zvb3QuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDUKKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworLyoKKyAqICAgICAgICAgICAgICAgICAgICAgIE5PVEVTIEFCT1VUIFRISVMgRFJJVkVSCisgKgorICogVGhpcyBkcml2ZXIgc3VwcG9ydHMgRFZpQ08gRnVzaW9uSERUViAzIEdvbGQgdW5kZXIgTGludXguCisgKgorICogVE9ETzoKKyAqIEJFUiBhbmQgc2lnbmFsIHN0cmVuZ3RoIGFsd2F5cyByZXR1cm4gMC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiZHZiLXBsbC5oIgorI2luY2x1ZGUgImxnZHQzMzAyX3ByaXYuaCIKKyNpbmNsdWRlICJsZ2R0MzMwMi5oIgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsIlR1cm4gb24vb2ZmIGxnZHQzMzAyIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKK2RvIHsgXAoraWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyAibGdkdDMzMDI6ICIgYXJncyk7IFwKK30gd2hpbGUgKDApCisKK3N0cnVjdCBsZ2R0MzMwMl9zdGF0ZQoreworCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKKworCS8qIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwljb25zdCBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnKiBjb25maWc7CisKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCisJLyogRGVtb2R1bGF0b3IgcHJpdmF0ZSBkYXRhICovCisJZmVfbW9kdWxhdGlvbl90IGN1cnJlbnRfbW9kdWxhdGlvbjsKKworCS8qIFR1bmVyIHByaXZhdGUgZGF0YSAqLworCXUzMiBjdXJyZW50X2ZyZXF1ZW5jeTsKK307CisKK3N0YXRpYyBpbnQgaTJjX3dyaXRlYnl0ZXMgKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUsCisJCQkgICB1OCBhZGRyLCAvKiBkZW1vZF9hZGRyZXNzIG9yIHBsbF9hZGRyZXNzICovCisJCQkgICB1OCAqYnVmLCAvKiBkYXRhIGJ5dGVzIHRvIHNlbmQgKi8KKwkJCSAgIGludCBsZW4gIC8qIG51bWJlciBvZiBieXRlcyB0byBzZW5kICovICkKK3sKKwlpZiAoYWRkciA9PSBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcykgeworCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPQorCQkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsICAubGVuID0gbGVuIH07CisJCWludCBlcnI7CisKKwkJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAyOiAlcyBlcnJvciAoYWRkciAlMDJ4IDwtICUwMngsIGVyciA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgYWRkciwgYnVmWzBdLCBlcnIpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0gZWxzZSB7CisJCXU4IHRtcFtdID0geyBidWZbMF0sIGJ1ZlsxXSB9OworCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPQorCQkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IDAsIC5idWYgPSB0bXAsICAubGVuID0gMiB9OworCQlpbnQgZXJyOworCQlpbnQgaTsKKworCQlmb3IgKGk9MTsgaTxsZW47IGkrKykgeworCQkJdG1wWzFdID0gYnVmW2ldOworCQkJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXMgZXJyb3IgKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIGJ1ZlswXSwgZXJyKTsKKwkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRVJFTU9URUlPOworCQkJfQorCQkJdG1wWzBdKys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGkyY19yZWFkYnl0ZXMgKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUsCisJCQkgIHU4IGFkZHIsIC8qIGRlbW9kX2FkZHJlc3Mgb3IgcGxsX2FkZHJlc3MgKi8KKwkJCSAgdTggKmJ1ZiwgLyogaG9sZHMgZGF0YSBieXRlcyByZWFkICovCisJCQkgIGludCBsZW4gIC8qIG51bWJlciBvZiBieXRlcyB0byByZWFkICovICkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPQorCQl7IC5hZGRyID0gYWRkciwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBidWYsICAubGVuID0gbGVuIH07CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAyOiAlcyBlcnJvciAoYWRkciAlMDJ4LCBlcnIgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIGVycik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3cml0ZXMgdGhlIHJlZ2lzdGVyIChyZWcpIHRvIHRoZSBkZW1vZCBidXMKKyAqIHRoZW4gcmVhZHMgdGhlIGRhdGEgcmV0dXJuZWQgZm9yIChsZW4pIGJ5dGVzLgorICovCisKK3N0YXRpYyB1OCBpMmNfc2VsZWN0cmVhZGJ5dGVzIChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlLAorCQkJICAgICAgIGVudW0gSTJDX1JFRyByZWcsIHU4KiBidWYsIGludCBsZW4pCit7CisJdTggd3IgW10gPSB7IHJlZyB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyBbXSA9IHsKKwkJeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCSAgLmZsYWdzID0gMCwgLmJ1ZiA9IHdyLCAgLmxlbiA9IDEgfSwKKwkJeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCSAgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBidWYsIC5sZW4gPSBsZW4gfSwKKwl9OworCWludCByZXQ7CisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAyOiAlczogYWRkciAweCUwMnggc2VsZWN0IDB4JTAyeCBlcnJvciAocmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCByZWcsIHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogU29mdHdhcmUgcmVzZXQgKi8KK2ludCBsZ2R0MzMwMl9Td1Jlc2V0KHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUpCit7CisJdTggcmV0OworCXU4IHJlc2V0W10gPSB7CisJCUlSUV9NQVNLLAorCQkweDAwIC8qIGJpdCA2IGlzIGFjdGl2ZSBsb3cgc29mdHdhcmUgcmVzZXQKKwkJICAgICAgKgliaXRzIDUtMCBhcmUgMSB0byBtYXNrIGludGVycnVwdHMgKi8KKwl9OworCisJcmV0ID0gaTJjX3dyaXRlYnl0ZXMoc3RhdGUsCisJCQkgICAgIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyogc3BlYyBzYXlzIHJlc2V0IHRha2VzIDEwMCBucyB3aHkgd2FpdCAqLworCQkvKiBtZGVsYXkoMTAwKTsgICAgKi8gLyoga2VlcCBsb3cgZm9yIDEwMG1TICovCisJCXJlc2V0WzFdID0gMHg3ZjsgICAgICAvKiBmb3JjZSByZXNldCBoaWdoIChpbmFjdGl2ZSkKKwkJCQkgICAgICAgKiBhbmQgdW5tYXNrIGludGVycnVwdHMgKi8KKwkJcmV0ID0gaTJjX3dyaXRlYnl0ZXMoc3RhdGUsCisJCQkJICAgICBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJCSAgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOworCX0KKwkvKiBTcGVjIGRvZXMgbm90IGluZGljYXRlIGEgbmVlZCBmb3IgdGhpcyBlaXRoZXIgKi8KKwkvKm1kZWxheSg1KTsgKi8gICAgICAgICAgICAgICAvKiB3YWl0IDUgbXNlYyBiZWZvcmUgZG9pbmcgbW9yZSAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwkvKiBIYXJkd2FyZSByZXNldCBpcyBkb25lIHVzaW5nIGdwaW9bMF0gb2YgY3gyMzg4MHggY2hpcC4KKwkgKiBJJ2QgbGlrZSB0byBkbyBpdCBoZXJlLCBidXQgZG9uJ3Qga25vdyBob3cgdG8gZmluZCBjaGlwIGFkZHJlc3MuCisJICogY3g4OC1jYXJkcy5jIGFycmFuZ2VzIGZvciB0aGUgcmVzZXQgYml0IHRvIGJlIGluYWN0aXZlIChoaWdoKS4KKwkgKiBNYXliZSB0aGVyZSBuZWVkcyB0byBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uIGluIGN4ODgtY29yZSBvcgorCSAqIHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBkbyBpdC4gKi8KKworCWRwcmludGsoIiVzIGVudGVyZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIGxnZHQzMzAyX1N3UmVzZXQoKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2KTsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJKmJlciA9IDA7IC8qIER1bW15IG91dCBmb3Igbm93ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlsyXTsKKworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIFBBQ0tFVF9FUlJfQ09VTlRFUjEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisJKnVjYmxvY2tzID0gKGJ1ZlswXSA8PCA4KSB8IGJ1ZlsxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQoreworCXU4IGJ1Zls0XTsKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0KKwkJKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJLyogVXNlIDUwTUh6IHBhcmFtZXRlciB2YWx1ZXMgZnJvbSBzcGVjIHNoZWV0IHNpbmNlIHh0YWwgaXMgNTAgKi8KKwlzdGF0aWMgdTggdG9wX2N0cmxfY2ZnW10gICA9IHsgVE9QX0NPTlRST0wsIDB4MDMgfTsKKwlzdGF0aWMgdTggdnNiX2ZyZXFfY2ZnW10gICA9IHsgVlNCX0NBUlJJRVJfRlJFUTAsIDB4MDAsIDB4ODcsIDB4OGUsIDB4MDEgfTsKKwlzdGF0aWMgdTggZGVtdXhfY3RybF9jZmdbXSA9IHsgREVNVVhfQ09OVFJPTCwgMHhmYiB9OworCXN0YXRpYyB1OCBhZ2NfcmZfY2ZnW10gICAgID0geyBBR0NfUkZfQkFORFdJRFRIMCwgMHg0MCwgMHg5MywgMHgwMCB9OworCXN0YXRpYyB1OCBhZ2NfY3RybF9jZmdbXSAgID0geyBBR0NfRlVOQ19DVFJMMiwgMHhjNiwgMHg0MCB9OworCXN0YXRpYyB1OCBhZ2NfZGVsYXlfY2ZnW10gID0geyBBR0NfREVMQVkwLCAweDA3LCAweDAwLCAweGZlIH07CisJc3RhdGljIHU4IGFnY19sb29wX2NmZ1tdICAgPSB7IEFHQ19MT09QX0JBTkRXSURUSDAsIDB4MDgsIDB4OWEgfTsKKworCS8qIENoYW5nZSBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBjaGFuZ2luZyB0aGUgbW9kdWxhdGlvbiAqLworCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uICE9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJCXN3aXRjaChwYXJhbS0+dS52c2IubW9kdWxhdGlvbikgeworCQljYXNlIFZTQl84OgorCQkJZHByaW50aygiJXM6IFZTQl84IE1PREVcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIFNlbGVjdCBWU0IgbW9kZSBhbmQgc2VyaWFsIE1QRUcgaW50ZXJmYWNlICovCisJCQl0b3BfY3RybF9jZmdbMV0gPSAweDA3OworCQkJYnJlYWs7CisKKwkJY2FzZSBRQU1fNjQ6CisJCQlkcHJpbnRrKCIlczogUUFNXzY0IE1PREVcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIFNlbGVjdCBRQU1fNjQgbW9kZSBhbmQgc2VyaWFsIE1QRUcgaW50ZXJmYWNlICovCisJCQl0b3BfY3RybF9jZmdbMV0gPSAweDA0OworCQkJYnJlYWs7CisKKwkJY2FzZSBRQU1fMjU2OgorCQkJZHByaW50aygiJXM6IFFBTV8yNTYgTU9ERVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogU2VsZWN0IFFBTV8yNTYgbW9kZSBhbmQgc2VyaWFsIE1QRUcgaW50ZXJmYWNlICovCisJCQl0b3BfY3RybF9jZmdbMV0gPSAweDA1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXM6IE1vZHVsYXRpb24gdHlwZSglZCkgVU5TVVBQT1JURURcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnUudnNiLm1vZHVsYXRpb24pOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIEluaXRpYWxpemF0aW9ucyBjb21tb24gdG8gYWxsIG1vZGVzICovCisKKwkJLyogU2VsZWN0IHRoZSByZXF1ZXN0ZWQgbW9kZSAqLworCQlpMmNfd3JpdGVieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCSAgICAgICB0b3BfY3RybF9jZmcsIHNpemVvZih0b3BfY3RybF9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIElGQldbMTE6MF0KKwkJICAgb2YgQUdDIElGL1JGIGxvb3AgZmlsdGVyIGJhbmR3aWR0aCByZWdpc3RlciAqLworCQlpMmNfd3JpdGVieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCSAgICAgICBhZ2NfcmZfY2ZnLCBzaXplb2YoYWdjX3JmX2NmZykpOworCisJCS8qIENoYW5nZSB0aGUgdmFsdWUgb2YgYml0IDYsICduSU5BR0NCWScgYW5kCisJCSAgICdOU1NFTFsxOjBdIG9mIEFDRyBmdW5jdGlvbiBjb250cm9sIHJlZ2lzdGVyIDIgKi8KKwkJLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBiaXQgNiAnUkZGSVgnCisJCSAgIG9mIEFHQyBmdW5jdGlvbiBjb250cm9sIHJlZ2lzdGVyIDMgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2N0cmxfY2ZnLCBzaXplb2YoYWdjX2N0cmxfY2ZnKSk7CisKKwkJLyogQ2hhbmdlIHRoZSBUUENMSyBwaW4gcG9sYXJpdHkKKwkJICAgZGF0YSBpcyB2YWxpZCBvbiBmYWxsaW5nIGNsb2NrICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIGRlbXV4X2N0cmxfY2ZnLCBzaXplb2YoZGVtdXhfY3RybF9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIE5DT0NURlZbMjU6MF0gb2YgY2FycmllcgorCQkgICByZWNvdmVyeSBjZW50ZXIgZnJlcXVlbmN5IHJlZ2lzdGVyICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJCSAgICAgICB2c2JfZnJlcV9jZmcsIHNpemVvZih2c2JfZnJlcV9jZmcpKTsKKworCQkvKiBTZXQgdGhlIHZhbHVlIG9mICdJTkxWVEhEJyByZWdpc3RlciAweDJhLzB4MmMgdG8gMHg3ZmUgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2RlbGF5X2NmZywgc2l6ZW9mKGFnY19kZWxheV9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIElBR0NCV1sxNTo4XQorCQkgICBvZiBpbm5lciBBR0MgbG9vcCBmaWx0ZXIgYmFuZHdpdGggKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2xvb3BfY2ZnLCBzaXplb2YoYWdjX2xvb3BfY2ZnKSk7CisKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisJCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbjsKKwl9CisKKwkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIGNoYW5uZWwgKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ICE9IHBhcmFtLT5mcmVxdWVuY3kpIHsKKwkJZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIGJ1ZiwKKwkJCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOworCQlkcHJpbnRrKCIlczogdHVuZXIgYnl0ZXM6IDB4JTAyeCAweCUwMnggIgorCQkJIjB4JTAyeCAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpOworCisJCS8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHR1bmVyIHBsbCAqLworCQlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwkJZHByaW50aygiJXM6IHR1bmVyIHN0YXR1cyBieXRlID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisKKwkJLyogVXBkYXRlIGN1cnJlbnQgZnJlcXVlbmN5ICovCisJCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7CisJfQorCWxnZHQzMzAyX1N3UmVzZXQoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJcGFyYW0tPmZyZXF1ZW5jeSA9IHN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlszXTsKKworCSpzdGF0dXMgPSAwOyAvKiBSZXNldCBzdGF0dXMgcmVzdWx0ICovCisKKwkvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSB0dW5lciBwbGwgKi8KKwlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwlkcHJpbnRrKCIlczogdHVuZXIgc3RhdHVzIGJ5dGUgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlpZiAoKGJ1ZlswXSAmIDB4YzApICE9IDB4NDApCisJCXJldHVybiAwOyAvKiBUdW5lciBQTEwgbm90IGxvY2tlZCBvciBub3QgcG93ZXJlZCBvbiAqLworCisJLyoKKwkgKiBZb3UgbXVzdCBzZXQgdGhlIE1hc2sgYml0cyB0byAxIGluIHRoZSBJUlFfTUFTSyBpbiBvcmRlcgorCSAqIHRvIHNlZSB0aGF0IHN0YXR1cyBiaXQgaW4gdGhlIElSUV9TVEFUVVMgcmVnaXN0ZXIuCisJICogVGhpcyBpcyBkb25lIGluIFN3UmVzZXQoKTsKKwkgKi8KKworCS8qIEFHQyBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBBR0NfU1RBVFVTLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBBR0NfU1RBVFVTID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisJaWYgKChidWZbMF0gJiAweDBjKSA9PSAweDgpeworCQkvKiBUZXN0IHNpZ25hbCBkb2VzIG5vdCBleGlzdCBmbGFnICovCisJCS8qIGFzIHdlbGwgYXMgdGhlIEFHQyBsb2NrIGZsYWcuICAgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCX0gZWxzZSB7CisJCS8qIFdpdGhvdXQgYSBzaWduYWwgYWxsIG90aGVyIHN0YXR1cyBiaXRzIGFyZSBtZWFuaW5nbGVzcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzaWduYWwgc3RhdHVzICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgVE9QX0NPTlRST0wsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWRwcmludGsoIiVzOiBUT1BfQ09OVFJPTCA9IDB4JTAyeCwgSVJPX01BU0sgPSAweCUwMngsIElSUV9TVEFUVVMgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKyNpZiAwCisJLyogQWx0ZXJuYXRpdmUgbWV0aG9kIHRvIGNoZWNrIGZvciBhIHNpZ25hbCAqLworCS8qIHVzaW5nIHRoZSBTTlIgZ29vZC9iYWQgaW50ZXJydXB0cy4gICAqLworCWlmICgoYnVmWzJdICYgMHgzMCkgPT0gMHgxMCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworI2VuZGlmCisKKwkvKiBzeW5jIHN0YXR1cyAqLworCWlmICgoYnVmWzJdICYgMHgwMykgPT0gMHgwMSkgeworCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCX0KKworCS8qIEZFQyBlcnJvciBzdGF0dXMgKi8KKwlpZiAoKGJ1ZlsyXSAmIDB4MGMpID09IDB4MDgpIHsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwl9CisKKwkvKiBDYXJyaWVyIFJlY292ZXJ5IExvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgQ0FSUklFUl9MT0NLLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBDQVJSSUVSX0xPQ0sgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlzd2l0Y2ggKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pIHsKKwljYXNlIFFBTV8yNTY6CisJY2FzZSBRQU1fNjQ6CisJCS8qIE5lZWQgdG8gdW5kZXN0YW5kIHdoeSB0aGVyZSBhcmUgMyBsb2NrIGxldmVscyBoZXJlICovCisJCWlmICgoYnVmWzBdICYgMHgwNykgPT0gMHgwNykKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWNhc2UgVlNCXzg6CisJCWlmICgoYnVmWzBdICYgMHg4MCkgPT0gMHg4MCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiS0VSTl9XQVJOSU5HIGxnZHQzMzAyOiAlczogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCit7CisJLyogbm90IGRpcmVjdGx5IGF2YWlsYWJsZS4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCit7CisjaWZkZWYgU05SX0lOX0RCCisJLyoKKwkgKiBTcGVjIHNoZWV0IHNob3dzIGZvcm11bGEgZm9yIFNOUl9FUSA9IDEwIGxvZzEwKDI1ICogMjQqKjIgLyBub2lzZSkKKwkgKiBhbmQgU05SX1BIID0gMTAgbG9nMTAoMjUgKiAzMioqMiAvIG5vaXNlKSBmb3IgZXF1YWxpemVyIGFuZCBwaGFzZSB0cmFja2VyCisJICogcmVzcGVjdGl2ZWx5LiBUaGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlc2UgZm9ybXVsYXMuCisJICogVGhlIHVzdWFsIGRlZmluaXRpb24gaXMgU05SID0gMjAgbG9nMTAoc2lnbmFsL25vaXNlKQorCSAqIElmIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHdyb25nIHRoZSB2YWx1ZSByZXR1bmVkIGlzIDEvMiB0aGUgYWN0dWFsIFNOUiBpbiBkYi4KKwkgKgorCSAqIFRoaXMgdGFibGUgaXMgYSBhbiBvcmRlcmVkIGxpc3Qgb2Ygbm9pc2UgdmFsdWVzIGNvbXB1dGVkIGJ5IHRoZQorCSAqIGZvcm11bGEgZnJvbSB0aGUgc3BlYyBzaGVldCBzdWNoIHRoYXQgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlCisJICogc3RhcnRpbmcgYXQgNDMgb3IgNDUgaXMgdGhlIFNOUiB2YWx1ZSBpbiBkYi4gVGhlcmUgYXJlIGR1cGxpY2F0ZSBub2lzZQorCSAqIHZhbHVlIGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyBiZWNhdXNlIHRoZSBTTlIgdmFyaWVzIG1vcmUgdGhhbgorCSAqIDEgZGIgZm9yIGEgY2hhbmdlIG9mIDEgZGlnaXQgaW4gbm9pc2UgYXQgdmVyeSBzbWFsbCB2YWx1ZXMgb2Ygbm9pc2UuCisJICoKKwkgKiBFeGFtcGxlcyBmcm9tIFNOUl9FUSB0YWJsZToKKwkgKiBub2lzZSBTTlIKKwkgKiAgIDAgICAgNDMKKwkgKiAgIDEgICAgNDIKKwkgKiAgIDIgICAgMzkKKwkgKiAgIDMgICAgMzcKKwkgKiAgIDQgICAgMzYKKwkgKiAgIDUgICAgMzUKKwkgKiAgIDYgICAgMzQKKwkgKiAgIDcgICAgMzMKKwkgKiAgIDggICAgMzMKKwkgKiAgIDkgICAgMzIKKwkgKiAgIDEwICAgMzIKKwkgKiAgIDExICAgMzEKKwkgKiAgIDEyICAgMzEKKwkgKiAgIDEzICAgMzAKKwkgKi8KKworCXN0YXRpYyBjb25zdCB1MzIgU05SX0VRW10gPQorCQl7IDEsICAgICAyLCAgICAgIDIsICAgICAgMiwgMywgICAgICAzLCAgICAgIDQsICAgICA0LCAgICAgNSwgICAgIDcsCisJCSAgOSwgICAgIDExLCAgICAgMTMsICAgICAxNywgMjEsICAgICAyNiwgICAgIDMzLCAgICA0MSwgICAgNTIsICAgIDY1LAorCQkgIDgxLCAgICAxMDIsICAgIDEyOSwgICAgMTYyLCAyMDQsICAgIDI1NywgICAgMzIzLCAgIDQwNiwgICA1MTEsICAgNjQ0LAorCQkgIDgxMCwgICAxMDIwLCAgIDEyODQsICAgMTYxNiwgMjAzNSwgICAyNTYxLCAgIDMyMjQsICA0MDU5LCAgNTExMCwgIDY0MzMsCisJCSAgODA5OCwgIDEwMTk1LCAgMTI4MzUsICAxNjE1OCwgMjAzNDEsICAyNTYwOCwgIDMyMjM4LCA0MDU4NSwgNTEwOTQsIDY0MzIzLAorCQkgIDgwOTc4LCAxMDE5NDUsIDEyODM0MSwgMTYxNTcxLCAyMDM0MDYsIDI1NjA3MywgMHg0MDAwMAorCQl9OworCisJc3RhdGljIGNvbnN0IHUzMiBTTlJfUEhbXSA9CisJCXsgMSwgICAgIDIsICAgICAgMiwgICAgICAyLCAgICAgIDMsICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDgsCisJCSAgMTAsICAgIDEyLCAgICAgMTUsICAgICAxOSwgICAgIDIzLCAgICAgMjksIDM3LCAgICA0NiwgICAgNTgsICAgIDczLAorCQkgIDkxLCAgICAxMTUsICAgIDE0NCwgICAgMTgyLCAgICAyMjksICAgIDI4OCwgMzYyLCAgIDQ1NiwgICA1NzQsICAgNzIyLAorCQkgIDkwOSwgICAxMTQ0LCAgIDE0NDAsICAgMTgxMywgICAyMjgyLCAgIDI4NzMsIDM2MTcsICA0NTUzLCAgNTczMiwgIDcyMTYsCisJCSAgOTA4NCwgIDExNDM2LCAgMTQzOTYsICAxODEyNCwgIDIyODE3LCAgMjg3MjQsICAzNjE2MSwgNDU1MjQsIDU3MzEyLCA3MjE1MSwKKwkJICA5MDgzMywgMTE0MzUxLCAxNDM5NjAsIDE4MTIzNSwgMjI4MTYxLCAweDA0MDAwMAorCQl9OworCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0YXRpYyB1MzIgc25yX2RiOyAgLyogaW5kZXggaW50byBTTlJfRVFbXSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKworCQkvKgorCQkgKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLgorCQkgKiBBIGJldHRlciBzZWFyY2ggYWxnb3JpdGhtIGNvdWxkIGJlIHVzZWQuLi4KKwkJICogd2F0Y2ggb3V0IHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCWZvciAoc25yX2RiID0gMDsgc25yX2RiIDwgc2l6ZW9mKFNOUl9FUSk7IHNucl9kYisrKSB7CisJCQlpZiAobm9pc2UgPCBTTlJfRVFbc25yX2RiXSkgeworCQkJCSpzbnIgPSA0MyAtIHNucl9kYjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFFBTSAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNzw8MykgPDwgMTMpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKKworCQkvKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLiAqLworCQlmb3IgKHNucl9kYiA9IDA7IHNucl9kYiA8IHNpemVvZihTTlJfUEgpOyBzbnJfZGIrKykgeworCQkJaWYgKG5vaXNlIDwgU05SX1BIW3Nucl9kYl0pIHsKKwkJCQkqc25yID0gNDUgLSBzbnJfZGI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZWxzZQorCS8qIFJldHVybiB0aGUgcmF3IG5vaXNlIHZhbHVlICovCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKwl9IGVsc2UgeworCQkvKiBQaGFzZSBUcmFja2VyIE1lYW4tU3F1YXJlIEVycm9yIFJlZ2lzdGVyIGZvciBRQU0gKi8KKwkJbm9pc2UgPSAoKGJ1ZlswXSAmIDc8PDMpIDw8IDEzKSB8IChidWZbM10gPDwgOCkgfCBidWZbNF07CisJfQorCisJLyogU21hbGwgdmFsdWVzIGZvciBub2lzZSBtZWFuIHNpZ25hbCBpcyBiZXR0ZXIgc28gaW52ZXJ0IG5vaXNlICovCisJLyogTm9pc2UgaXMgMTkgYml0IHZhbHVlIHNvIGRpc2NhcmQgMyBMU0IqLworCSpzbnIgPSB+bm9pc2U+PjM7CisjZW5kaWYKKworCWRwcmludGsoIiVzOiBub2lzZSA9IDB4JTA1eCwgc25yID0gJWlkYlxuIixfX0ZVTkNUSU9OX18sIG5vaXNlLCAqc25yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlX3R1bmVfc2V0dGluZ3MpCit7CisJLyogSSBoYXZlIG5vIGlkZWEgYWJvdXQgdGhpcyAtIGl0IG1heSBub3QgYmUgbmVlZGVkICovCisJZmVfdHVuZV9zZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTAwOworCWZlX3R1bmVfc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDA7CisJZmVfdHVuZV9zZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGdkdDMzMDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGxnZHQzMzAyX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogbGdkdDMzMDJfYXR0YWNoKGNvbnN0IHN0cnVjdCBsZ2R0MzMwMl9jb25maWcqIGNvbmZpZywKKwkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQoreworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGJ1ZlsxXTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCisJc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGxnZHQzMzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKCpzdGF0ZSkpOworCisJLyogU2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPm9wcywgJmxnZHQzMzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJLyogVmVyaWZ5IGNvbW11bmljYXRpb24gd2l0aCBkZW1vZCBjaGlwICovCisJaWYgKGkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIDIsIGJ1ZiwgMSkpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAtMTsKKwlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gLTE7CisKKwkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWlmIChzdGF0ZSkKKwkJa2ZyZWUoc3RhdGUpOworCWRwcmludGsoIiVzOiBFUlJPUlxuIixfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbGdkdDMzMDJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZT0gIkxHIEVsZWN0cm9uaWNzIExHRFQzMzAyIFZTQi9RQU0gRnJvbnRlbmQiLAorCQkudHlwZSA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfbWluPSA1NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXg9IDg1ODAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZT0gNjI1MDAsCisJCS8qIFN5bWJvbCByYXRlIGlzIGZvciBhbGwgVlNCIG1vZGVzIG5lZWQgdG8gY2hlY2sgUUFNICovCisJCS5zeW1ib2xfcmF0ZV9taW4gICAgPSAxMDc2MjAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCAgICA9IDEwNzYyMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKwkuaW5pdCAgICAgICAgICAgICAgICAgPSBsZ2R0MzMwMl9pbml0LAorCS5zZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBsZ2R0MzMwMl9nZXRfdHVuZV9zZXR0aW5ncywKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBsZ2R0MzMwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3VjYmxvY2tzLAorCS5yZWxlYXNlICAgICAgICAgICAgICA9IGxnZHQzMzAyX3JlbGVhc2UsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxHRFQzMzAyIFtEVmlDTyBGdXNpb25IRFRWIDMgR29sZF0gKEFUU0MgOFZTQiAmIElUVS1UIEouODMgQW5uZXhCIDY0LzI1NiBRQU0pIERlbW9kdWxhdG9yIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsc29uIE1pY2hhZWxzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0wobGdkdDMzMDJfYXR0YWNoKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIERWQj0xIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTg3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogJElkOiBsZ2R0MzMwMi5oLHYgMS4yIDIwMDUvMDYvMjggMjM6NTA6NDggbWtydWZreSBFeHAgJAorICoKKyAqICAgIFN1cHBvcnQgZm9yIExHRFQzMzAyIChEVmlDTyBGdXN0aW9uSERUViAzIEdvbGQpIC0gVlNCL1FBTQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNSBXaWxzb24gTWljaGFlbHMgPHdpbHNvbm1pY2hhZWxzQGVhcnRobGluay5uZXQ+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTEdEVDMzMDJfSAorI2RlZmluZSBMR0RUMzMwMl9ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworc3RydWN0IGxnZHQzMzAyX2NvbmZpZworeworCS8qIFRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKKwl1OCBwbGxfYWRkcmVzczsKKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKKworCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCisJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGxnZHQzMzAyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnKiBjb25maWcsCisJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvKiBMR0RUMzMwMl9IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkzZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogJElkOiBsZ2R0MzMwMl9wcml2LmgsdiAxLjIgMjAwNS8wNi8yOCAyMzo1MDo0OCBta3J1Zmt5IEV4cCAkCisgKgorICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDIgKERWaUNPIEZ1c3Rpb25IRFRWIDMgR29sZCkgLSBWU0IvUUFNCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1IFdpbHNvbiBNaWNoYWVscyA8d2lsc29ubWljaGFlbHNAZWFydGhsaW5rLm5ldD4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTEdEVDMzMDJfUFJJVl8KKyNkZWZpbmUgX0xHRFQzMzAyX1BSSVZfCisKKy8qIGkyYyBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworZW51bSBJMkNfUkVHIHsKKwlUT1BfQ09OVFJPTD0gMHgwMCwKKwlJUlFfTUFTSz0gMHgwMSwKKwlJUlFfU1RBVFVTPSAweDAyLAorCVZTQl9DQVJSSUVSX0ZSRVEwPSAweDE2LAorCVZTQl9DQVJSSUVSX0ZSRVExPSAweDE3LAorCVZTQl9DQVJSSUVSX0ZSRVEyPSAweDE4LAorCVZTQl9DQVJSSUVSX0ZSRVEzPSAweDE5LAorCUNBUlJJRVJfTVNFUUFNMT0gMHgxYSwKKwlDQVJSSUVSX01TRVFBTTI9IDB4MWIsCisJQ0FSUklFUl9MT0NLPSAweDFjLAorCVRJTUlOR19SRUNPVkVSWT0gMHgxZCwKKwlBR0NfREVMQVkwPSAweDJhLAorCUFHQ19ERUxBWTE9IDB4MmIsCisJQUdDX0RFTEFZMj0gMHgyYywKKwlBR0NfUkZfQkFORFdJRFRIMD0gMHgyZCwKKwlBR0NfUkZfQkFORFdJRFRIMT0gMHgyZSwKKwlBR0NfUkZfQkFORFdJRFRIMj0gMHgyZiwKKwlBR0NfTE9PUF9CQU5EV0lEVEgwPSAweDMwLAorCUFHQ19MT09QX0JBTkRXSURUSDE9IDB4MzEsCisJQUdDX0ZVTkNfQ1RSTDE9IDB4MzIsCisJQUdDX0ZVTkNfQ1RSTDI9IDB4MzMsCisJQUdDX0ZVTkNfQ1RSTDM9IDB4MzQsCisJQUdDX1JGSUZfQUNDMD0gMHgzOSwKKwlBR0NfUkZJRl9BQ0MxPSAweDNhLAorCUFHQ19SRklGX0FDQzI9IDB4M2IsCisJQUdDX1NUQVRVUz0gMHgzZiwKKwlTWU5DX1NUQVRVU19WU0I9IDB4NDMsCisJRVFQSF9FUlIwPSAweDQ3LAorCUVRX0VSUjE9IDB4NDgsCisJRVFfRVJSMj0gMHg0OSwKKwlQSF9FUlIxPSAweDRhLAorCVBIX0VSUjI9IDB4NGIsCisJREVNVVhfQ09OVFJPTD0gMHg2NiwKKwlQQUNLRVRfRVJSX0NPVU5URVIxPSAweDZhLAorCVBBQ0tFVF9FUlJfQ09VTlRFUjI9IDB4NmIsCit9OworCisjZW5kaWYgLyogX0xHRFQzMzAyX1BSSVZfICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM5NmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKK0RyaXZlciBmb3IgU2Ftc3VuZyBTNUgxNDIwIFFQU0sgRGVtb2R1bGF0b3IKKworQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgInM1aDE0MjAuaCIKKworCisKKyNkZWZpbmUgVE9ORV9GUkVRIDIyMDAwCisKK3N0cnVjdCBzNWgxNDIwX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CisJY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXU4IHBvc3Rsb2NrZWQ6MTsKKwl1MzIgZmNsazsKKwl1MzIgdHVuZWRmcmVxOworCWZlX2NvZGVfcmF0ZV90IGZlY19pbm5lcjsKKwl1MzIgc3ltYm9sX3JhdGU7Cit9OworCitzdGF0aWMgdTMyIHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpOworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpOworCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworI2RlZmluZSBkcHJpbnRrIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0YXRpYyBpbnQgczVoMTQyMF93cml0ZXJlZyAoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJdTggYnVmIFtdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCWRwcmludGsgKCIlczogd3JpdGVyZWcgZXJyb3IgKGVyciA9PSAlaSwgcmVnID09IDB4JTAyeCwgZGF0YSA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgcmVnLCBkYXRhKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzNWgxNDIwX3JlYWRyZWcgKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjAgW10gPSB7IHJlZyB9OworCXU4IGIxIFtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnMSA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH07CisJc3RydWN0IGkyY19tc2cgbXNnMiA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9OworCisJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2cxLCAxKSkgIT0gMSkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCAmbXNnMiwgMSkpICE9IDEpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN3aXRjaCh2b2x0YWdlKSB7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgJiAweGZlKSB8IDB4MDIpOworCQlicmVhazsKKworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgfCAweDAzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNjKSAmIDB4ZmQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzd2l0Y2godG9uZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDA4KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NlbmRfbWFzdGVyX2NtZCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXN1bHQgPSAwOworCisJLyogc2V0dXAgZm9yIERJU0VRQyAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHgwMik7CisJbXNsZWVwKDE1KTsKKworCS8qIHdyaXRlIHRoZSBESVNFUUMgY29tbWFuZCBieXRlcyAqLworCWZvcihpPTA7IGk8IGNtZC0+bXNnX2xlbjsgaSsrKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MgKyBpLCBjbWQtPm1zZ1tpXSk7CisJfQorCisJLyoga2ljayBvZmYgdHJhbnNtaXNzaW9uICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8ICgoY21kLT5tc2dfbGVuLTEpIDw8IDQpIHwgMHgwOCk7CisKKwkvKiB3YWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgoMTAwKkhaKSAvIDEwMDApOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkqIHJlcGx5KQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHZhbDsKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIHNldHVwIGZvciBESVNFUUMgcmVjaWV2ZSAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHg4Mik7IC8qIEZJWE1FOiBndWVzcyAtIGRvIHdlIG5lZWQgdG8gc2V0IERJU19SRFkoMHgwOCkgaW4gcmVjZWl2ZSBtb2RlPyAqLworCW1zbGVlcCgxNSk7CisKKwkvKiB3YWl0IGZvciByZWNlcHRpb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgocmVwbHktPnRpbWVvdXQqSFopIC8gMTAwMCk7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKCEoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4ODApKSAvKiBGSVhNRTogZG8gd2UgdGVzdCBESVNfUkRZKDB4MDgpIG9yIFJDVl9FTigweDgwKT8gKi8KKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIGNoZWNrIGVycm9yIGZsYWcgLSBGSVhNRTogbm90IHN1cmUgd2hhdCB0aGlzIGRvZXMgLSBkb2NzIGRvIG5vdCBkZXNjcmliZQorCSAqIGJleW9uZCAiZXJyb3IgZmxhZyBmb3IgZGlzZXFjIHJlY2VpdmUgZGF0YSA6KCAqLworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDkpKSB7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBjaGVjayBsZW5ndGggKi8KKwlsZW5ndGggPSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4NzApID4+IDQ7CisJaWYgKGxlbmd0aCA+IHNpemVvZihyZXBseS0+bXNnKSkgeworCQlyZXN1bHQgPSAtRU9WRVJGTE9XOworCQlnb3RvIGV4aXQ7CisJfQorCXJlcGx5LT5tc2dfbGVuID0gbGVuZ3RoOworCisJLyogZXh0cmFjdCBkYXRhICovCisJZm9yKGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKKwkJcmVwbHktPm1zZ1tpXSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYyArIGkpOworCX0KKworZXhpdDoKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZW5kX2J1cnN0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2V0dXAgZm9yIHRvbmUgYnVyc3QgKi8KKwl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3MCkgfCAweDAxKTsKKworCS8qIHNldCB2YWx1ZSBmb3IgQiBwb3NpdGlvbiBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAobWluaWNtZCA9PSBTRUNfTUlOSV9CKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA0KTsKKwl9CisJbXNsZWVwKDE1KTsKKworCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA4KTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgyMCpIWikgLyAxMDAwKTsKKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoIShzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkpCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJfQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCisJLyogcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncyAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHZhbCk7CisJbXNsZWVwKDE1KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZmVfc3RhdHVzX3QgczVoMTQyMF9nZXRfc3RhdHVzX2JpdHMoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU4IHZhbDsKKwlmZV9zdGF0dXNfdCBzdGF0dXMgPSAwOworCisJdmFsID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDE0KTsKKwlpZiAodmFsICYgMHgwMikKKwkJc3RhdHVzIHw9ICBGRV9IQVNfU0lHTkFMOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCWlmICh2YWwgJiAweDAxKQorCQlzdGF0dXMgfD0gIEZFX0hBU19DQVJSSUVSOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzNik7CisJaWYgKHZhbCAmIDB4MDEpCisJCXN0YXR1cyB8PSAgRkVfSEFTX1ZJVEVSQkk7CisJaWYgKHZhbCAmIDB4MjApCisJCXN0YXR1cyB8PSAgRkVfSEFTX1NZTkM7CisJaWYgKHN0YXR1cyA9PSAoRkVfSEFTX1NJR05BTHxGRV9IQVNfQ0FSUklFUnxGRV9IQVNfVklURVJCSXxGRV9IQVNfU1lOQykpCisJCXN0YXR1cyB8PSAgRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsOworCisJaWYgKHN0YXR1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRldGVybWluZSBsb2NrIHN0YXRlICovCisJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKworCS8qIGZpeCBmb3IgRkVDIDUvNiBpbnZlcnNpb24gaXNzdWUgLSBpZiBpdCBkb2Vzbid0IHF1aXRlIGxvY2ssIGludmVydCB0aGUgaW52ZXJzaW9uLAorCXdhaXQgYSBiaXQgYW5kIGNoZWNrIGFnYWluICovCisJaWYgKCpzdGF0dXMgPT0gKEZFX0hBU19TSUdOQUx8RkVfSEFTX0NBUlJJRVJ8RkVfSEFTX1ZJVEVSQkkpKSB7CisJCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMik7CisJCWlmICgodmFsICYgMHgwNykgPT0gMHgwMykgeworCQkJaWYgKHZhbCAmIDB4MDgpCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMyk7CisJCQllbHNlCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxYik7CisKKwkJCS8qIHdhaXQgYSBiaXQgdGhlbiB1cGRhdGUgbG9jayBzdGF0dXMgKi8KKwkJCW1kZWxheSgyMDApOworCQkJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKwkJfQorCX0KKworCS8qIHBlcmZvcm0gcG9zdCBsb2NrIHNldHVwICovCisJaWYgKCgqc3RhdHVzICYgRkVfSEFTX0xPQ0spICYmICghc3RhdGUtPnBvc3Rsb2NrZWQpKSB7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBkYXRhIHJhdGUgKi8KKwkJdTMyIHRtcCA9IHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdGF0ZSk7CisJCXN3aXRjaChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwNykgeworCQljYXNlIDA6CisJCQl0bXAgPSAodG1wICogMiAqIDEpIC8gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXRtcCA9ICh0bXAgKiAyICogMikgLyAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJdG1wID0gKHRtcCAqIDIgKiAzKSAvIDQ7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQl0bXAgPSAodG1wICogMiAqIDUpIC8gNjsKKwkJCWJyZWFrOworCisJCWNhc2UgNDoKKwkJCXRtcCA9ICh0bXAgKiAyICogNikgLyA3OworCQkJYnJlYWs7CisKKwkJY2FzZSA1OgorCQkJdG1wID0gKHRtcCAqIDIgKiA3KSAvIDg7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPSBzdGF0ZS0+ZmNsayAvIHRtcDsKKworCQkvKiBzZXQgdGhlIE1QRUdfQ0xLX0lOVEwgZm9yIHRoZSBjYWxjdWxhdGVkIGRhdGEgcmF0ZSAqLworCQlpZiAodG1wIDwgNCkKKwkJCXZhbCA9IDB4MDA7CisJCWVsc2UgaWYgKHRtcCA8IDgpCisJCQl2YWwgPSAweDAxOworCQllbHNlIGlmICh0bXAgPCAxMikKKwkJCXZhbCA9IDB4MDI7CisJCWVsc2UgaWYgKHRtcCA8IDE2KQorCQkJdmFsID0gMHgwMzsKKwkJZWxzZSBpZiAodG1wIDwgMjQpCisJCQl2YWwgPSAweDA0OworCQllbHNlIGlmICh0bXAgPCAzMikKKwkJCXZhbCA9IDB4MDU7CisJCWVsc2UKKwkJCXZhbCA9IDB4MDY7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MjIsIHZhbCk7CisKKwkJLyogREMgZnJlZXplICovCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MWYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxZikgfCAweDAxKTsKKworCQkvKiBraWNrZXIgZGlzYWJsZSArIHJlbW92ZSBEQyBvZmZzZXQgKi8KKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSAmIDB4NmYpOworCisJCS8qIHBvc3QtbG9jayBwcm9jZXNzaW5nIGhhcyBiZWVuIGRvbmUhICovCisJCXN0YXRlLT5wb3N0bG9ja2VkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWQpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJdTggdmFsID0gMHhmZiAtIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxNSk7CisKKwlyZXR1cm4gKGludCkgKCh2YWwgPDwgOCkgfCB2YWwpOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWYpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9yZXNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDEsIDB4MDgpOworCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAxLCAweDAwKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJdTY0IHZhbDsKKworCXZhbCA9IChwLT51LnFwc2suc3ltYm9sX3JhdGUgLyAxMDAwKSAqICgxPDwyNCk7CisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA8PSAyMTAwMDAwMCkgeworCQl2YWwgKj0gMjsKKwl9CisJZG9fZGl2KHZhbCwgKHN0YXRlLT5mY2xrIC8gMTAwMCkpOworCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSAmIDB4N2YpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTEsIHZhbCA+PiAxNik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMiwgdmFsID4+IDgpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTMsIHZhbCAmIDB4ZmYpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDksIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwOSkgfCAweDgwKTsKK30KKworc3RhdGljIHUzMiBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU2NCB2YWw7CisJaW50IHNhbXBsaW5nID0gMjsKKworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpICYgMHgyKQorCQlzYW1wbGluZyA9IDE7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpIHwgMHgwOCk7CisJdmFsICA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMSkgPDwgMTY7CisJdmFsIHw9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMikgPDwgODsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDEzKTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpICYgMHhmNyk7CisKKwl2YWwgKj0gKHN0YXRlLT5mY2xrIC8gMTAwMCk7CisJZG9fZGl2KHZhbCwgKCgxPDwyNCkgKiBzYW1wbGluZykpOworCisJcmV0dXJuICh1MzIpICh2YWwgKiAxMDAwKTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgaW50IGZyZXFvZmZzZXQpCit7CisJaW50IHZhbDsKKworCS8qIHJlbWVtYmVyIGZyZXFvZmZzZXQgaXMgaW4ga0h6LCBidXQgdGhlIGNoaXAgd2FudHMgdGhlIG9mZnNldCBpbiBIeiwgc28KKwkgKiBkaXZpZGUgZmNsayBieSAxMDAwMDAwIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4gKi8KKwl2YWwgPSAtKGludCkgKChmcmVxb2Zmc2V0ICogKDE8PDI0KSkgLyAoc3RhdGUtPmZjbGsgLyAxMDAwMDAwKSk7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA5LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDkpICYgMHhiZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZSwgdmFsID4+IDE2KTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDBmLCB2YWwgPj4gOCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMCwgdmFsICYgMHhmZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSB8IDB4NDApOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfZ2V0ZnJlcW9mZnNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJaW50IHZhbDsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgfCAweDA4KTsKKwl2YWwgID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBlKSA8PCAxNjsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBmKSA8PCA4OworCXZhbCB8PSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTApOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgJiAweGY3KTsKKworCWlmICh2YWwgJiAweDgwMDAwMCkKKwkJdmFsIHw9IDB4ZmYwMDAwMDA7CisKKwkvKiByZW1lbWJlciBmcmVxb2Zmc2V0IGlzIGluIGtIeiwgYnV0IHRoZSBjaGlwIHdhbnRzIHRoZSBvZmZzZXQgaW4gSHosIHNvCisJICogZGl2aWRlIGZjbGsgYnkgMTAwMDAwMCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuICovCisJdmFsID0gLSAoKHZhbCAqIChzdGF0ZS0+ZmNsay8xMDAwMDAwKSkgLyAoMTw8MjQpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHM1aDE0MjBfc2V0ZmVjKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWlmICgocC0+dS5xcHNrLmZlY19pbm5lciA9PSBGRUNfQVVUTykgfHwgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgwMCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4M2YpOworCX0gZWxzZSB7CisJCXN3aXRjaChwLT51LnFwc2suZmVjX2lubmVyKSB7CisJCWNhc2UgRkVDXzFfMjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTApOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwMSk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ18yXzM6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDExKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MDIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfM180OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMik7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRkVDXzVfNjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTMpOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwOCk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ182Xzc6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDE0KTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MTApOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfN184OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNSk7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDIwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBmZV9jb2RlX3JhdGVfdCBzNWgxNDIwX2dldGZlYyhzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJc3dpdGNoKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMikgJiAweDA3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gRkVDXzFfMjsKKworCWNhc2UgMToKKwkJcmV0dXJuIEZFQ18yXzM7CisKKwljYXNlIDI6CisJCXJldHVybiBGRUNfM180OworCisJY2FzZSAzOgorCQlyZXR1cm4gRkVDXzVfNjsKKworCWNhc2UgNDoKKwkJcmV0dXJuIEZFQ182Xzc7CisKKwljYXNlIDU6CisJCXJldHVybiBGRUNfN184OworCX0KKworCXJldHVybiBGRUNfTk9ORTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJaWYgKChwLT51LnFwc2suZmVjX2lubmVyID09IEZFQ19BVVRPKSB8fCAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9BVVRPKSkgeworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDAwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgzZik7CisJfSBlbHNlIHsKKwkJdTggdG1wID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDMxKSAmIDB4Zjc7CisJCQl0bXAgfD0gMHgxMDsKKworCQlpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PTikKKwkJCXRtcCB8PSAweDgwOworCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIHRtcCk7CisJfQorfQorCitzdGF0aWMgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgczVoMTQyMF9nZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwOCkKKwkJcmV0dXJuIElOVkVSU0lPTl9PTjsKKworCXJldHVybiBJTlZFUlNJT05fT0ZGOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIGZyZXF1ZW5jeV9kZWx0YTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgZmVzZXR0aW5nczsKKworCS8qIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhIGZhc3QtdHVuZSAqLworCW1lbWNweSgmZmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CisJczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZlc2V0dGluZ3MpOworCWZyZXF1ZW5jeV9kZWx0YSA9IHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXE7CisJaWYgKChmcmVxdWVuY3lfZGVsdGEgPiAtZmVzZXR0aW5ncy5tYXhfZHJpZnQpICYmIChmcmVxdWVuY3lfZGVsdGEgPCBmZXNldHRpbmdzLm1heF9kcmlmdCkgJiYKKwkgICAgKGZyZXF1ZW5jeV9kZWx0YSAhPSAwKSAmJgorCSAgICAoc3RhdGUtPmZlY19pbm5lciA9PSBwLT51LnFwc2suZmVjX2lubmVyKSAmJgorCSAgICAoc3RhdGUtPnN5bWJvbF9yYXRlID09IHAtPnUucXBzay5zeW1ib2xfcmF0ZSkpIHsKKworCQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIGZyZXF1ZW5jeV9kZWx0YSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IG9mIGFsbCwgc29mdHdhcmUgcmVzZXQgKi8KKwlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKKworCS8qIHNldCB0dW5lciBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgeworCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7CisJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZzdGF0ZS0+dHVuZWRmcmVxKTsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSAmIDB4ZmUpOworCX0KKworCS8qIHNldCBzNWgxNDIwIGZjbGsgUExMIGFjY29yZGluZyB0byBkZXNpcmVkIHN5bWJvbCByYXRlICovCisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IDI4MDAwMDAwKSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhZSk7CisJfSBlbHNlIGlmIChwLT51LnFwc2suc3ltYm9sX3JhdGUgPiAyMTAwMDAwMCkgeworCQlzdGF0ZS0+ZmNsayA9IDU5MDAwMDAwOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAzLCAweDMzKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNCwgMHg0MCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDUsIDB4YWUpOworCX0gZWxzZSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhYyk7CisJfQorCisJLyogc2V0IG1pc2MgcmVnaXN0ZXJzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNywgMHhiMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHg2Nyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYiwgMHg3OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYywgMHg0OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZCwgMHg2Yik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgyZSwgMHg4ZSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzNSwgMHgzMyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOCwgMHgwMSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOSwgMHg3ZCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYSwgKHN0YXRlLT5mY2xrICsgKFRPTkVfRlJFUSAqIDMyKSAtIDEpIC8gKFRPTkVfRlJFUSAqIDMyKSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NSwgMHg2MSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NiwgMHgxZCk7CisKKwkvKiBzdGFydCBRUFNLICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSB8IDEpOworCisJLyogc2V0IHRoZSBmcmVxdWVuY3kgb2Zmc2V0IHRvIGFkanVzdCBmb3IgUExMIGluYWNjdXJhY3kgKi8KKwlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXEpOworCisJLyogc2V0IHRoZSByZXNldCBvZiB0aGUgcGFyYW1ldGVycyAqLworCXM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdGF0ZSwgcCk7CisJczVoMTQyMF9zZXRpbnZlcnNpb24oc3RhdGUsIHApOworCXM1aDE0MjBfc2V0ZmVjKHN0YXRlLCBwKTsKKworCXN0YXRlLT5mZWNfaW5uZXIgPSBwLT51LnFwc2suZmVjX2lubmVyOworCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKKwlzdGF0ZS0+cG9zdGxvY2tlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT50dW5lZGZyZXEgKyBzNWgxNDIwX2dldGZyZXFvZmZzZXQoc3RhdGUpOworCXAtPmludmVyc2lvbiA9IHM1aDE0MjBfZ2V0aW52ZXJzaW9uKHN0YXRlKTsKKwlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RhdGUpOworCXAtPnUucXBzay5mZWNfaW5uZXIgPSBzNWgxNDIwX2dldGZlYyhzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCit7CisJaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gMjAwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDIwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDEyMDAwMDAwKSB7CisJCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDsKKwkJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMTUwMDsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gOTAwMDsKKwl9IGVsc2UgaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gODAwMDAwMCkgeworCQlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSAxMDA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDEwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDQwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMTAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSA1MDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDcwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDIwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTQgKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfSBlbHNlIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTggKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9pbml0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qIGRpc2FibGUgcG93ZXIgZG93biBhbmQgZG8gcmVzZXQgKi8KKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAyLCAweDEwKTsKKwltc2xlZXAoMTApOworCXM1aDE0MjBfcmVzZXQoc3RhdGUpOworCisJLyogaW5pdCBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOworCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CisJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgJiAweGZlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJcmV0dXJuIHM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDIsIDB4MTIpOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgczVoMTQyMF9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGlkZW50aXR5OworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzNWgxNDIwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmczVoMTQyMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5wb3N0bG9ja2VkID0gMDsKKwlzdGF0ZS0+ZmNsayA9IDg4MDAwMDAwOworCXN0YXRlLT50dW5lZGZyZXEgPSAwOworCXN0YXRlLT5mZWNfaW5uZXIgPSBGRUNfTk9ORTsKKwlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICsgaWRlbnRpZnkgaXQgKi8KKwlpZGVudGl0eSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CisJaWYgKGlkZW50aXR5ICE9IDB4MDMpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHM1aDE0MjBfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lICAgICA9ICJTYW1zdW5nIFM1SDE0MjAgRFZCLVMiLAorCQkudHlwZSAgICAgPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbiAgICA9IDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggICAgPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMTI1LCAgICAgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLworCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSAgPSAyOTUwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiAgPSAxMDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4ICA9IDQ1MDAwMDAwLAorCQkvKiAgLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSAgPSA/Pz8sKi8KKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQlGRV9DQU5fUVBTSworCX0sCisKKwkucmVsZWFzZSA9IHM1aDE0MjBfcmVsZWFzZSwKKworCS5pbml0ID0gczVoMTQyMF9pbml0LAorCS5zbGVlcCA9IHM1aDE0MjBfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gczVoMTQyMF9zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IHM1aDE0MjBfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkucmVhZF9zdGF0dXMgPSBzNWgxNDIwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IHM1aDE0MjBfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gczVoMTQyMF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF91Y2Jsb2NrcyA9IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcywKKworCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gczVoMTQyMF9zZW5kX21hc3Rlcl9jbWQsCisJLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5ID0gczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5LAorCS5kaXNlcWNfc2VuZF9idXJzdCA9IHM1aDE0MjBfc2VuZF9idXJzdCwKKwkuc2V0X3RvbmUgPSBzNWgxNDIwX3NldF90b25lLAorCS5zZXRfdm9sdGFnZSA9IHM1aDE0MjBfc2V0X3ZvbHRhZ2UsCit9OworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNUgxNDIwIERWQi1TIERlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IGRlIFF1aW5jZXkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChzNWgxNDIwX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg3ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMCwwICsxLDQxIEBACisvKgorICAgIERyaXZlciBmb3IgUzVIMTQyMCBRUFNLIERlbW9kdWxhdG9ycworCisgICAgQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIFM1SDE0MjBfSAorI2RlZmluZSBTNUgxNDIwX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgczVoMTQyMF9jb25maWcKK3sKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KKwlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOworCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTMyKiBmcmVxb3V0KTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvLyBTNUgxNDIwX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCmluZGV4IGU2ODEyNjMuLjkyOGFjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwpAQCAtNjE3LDcgKzYxNyw3IEBACiAKIAkvKiB3YWl0IGZvciBXR0FHQyBsb2NrICovCiAJc3RhcnR0aW1lID0gamlmZmllczsKLQl0aW1lb3V0ID0gamlmZmllcyArICgyMDAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJbXNsZWVwKDEwKTsKIAkJaWYgKHN0djAyOTdfcmVhZHJlZyhzdGF0ZSwgMHg0MykgJiAweDA4KQpAQCAtNjI5LDcgKzYyOSw3IEBACiAJbXNsZWVwKDIwKTsKIAogCS8qIHdhaXQgZm9yIGVxdWFsaXNlciBwYXJ0aWFsIGNvbnZlcmdlbmNlICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoNTAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NDIsNyArNjQyLDcgQEAKIAl9CiAKIAkvKiB3YWl0IGZvciBlcXVhbGlzZXIgZnVsbCBjb252ZXJnZW5jZSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgKGRlbGF5ICogSFopIC8gMTAwMDsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NTksNyArNjU5LDcgQEAKIAlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDgsIDApOwogCiAJLyogd2FpdCBmb3IgbWFpbiBsb2NrICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoMjAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCW1zbGVlcCgxMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggMGJlYjM3MC4uYWIwYzAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTQ5LDEwICs0OSw4IEBACiAJLyogcHJpdmF0ZSBkZW1vZCBkYXRhICovCiAJdTggaW5pdGlhbGlzZWQ7CiAJZW51bSB0ZGExMDA0eF9kZW1vZCBkZW1vZF90eXBlOwotCXU4IGZ3X3ZlcnNpb247CiB9OwogCi0KIHN0YXRpYyBpbnQgZGVidWc7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXApAQCAtMTIyLDYgKzEyMCw4IEBACiAjZGVmaW5lIFREQTEwMDQ2SF9HUElPX09VVF9TRUwJIDB4NDEKICNkZWZpbmUgVERBMTAwNDZIX0dQSU9fU0VMRUNUCSAweDQyCiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfQ09ORgkgMHg0MworI2RlZmluZSBUREExMDA0NkhfQUdDX1RIUgkgMHg0NAorI2RlZmluZSBUREExMDA0NkhfQUdDX1JFTk9STQkgMHg0NQogI2RlZmluZSBUREExMDA0NkhfQUdDX0dBSU5TCSAweDQ2CiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfVFVOX01JTgkgMHg0NwogI2RlZmluZSBUREExMDA0NkhfQUdDX1RVTl9NQVgJIDB4NDgKQEAgLTI3NCwxNCArMjc0LDI2IEBACiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKIAljYXNlIEJBTkRXSURUSF82X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzZtaHosIHNpemVvZihiYW5kd2lkdGhfNm1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDA5KTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg0Zik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF83X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzdtaHosIHNpemVvZihiYW5kd2lkdGhfN21oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBhKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg3OSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF84X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzhtaHosIHNpemVvZihiYW5kd2lkdGhfOG1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHhhMyk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzE1LDIwICszMjcsMzUgQEAKIAkJbWVtY3B5KGJ1ZiArIDEsIG1lbSArIHBvcywgdHhfc2l6ZSk7CiAJCWZ3X21zZy5sZW4gPSB0eF9zaXplICsgMTsKIAkJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmZndfbXNnLCAxKSAhPSAxKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBFcnJvciBkdXJpbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAidGRhMTAwNHg6IEVycm9yIGR1cmluZyBmaXJtd2FyZSB1cGxvYWRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcG9zICs9IHR4X3NpemU7CiAKIAkJZHByaW50aygiJXM6IGZ3X3Bvcz0weCV4XG4iLCBfX0ZVTkNUSU9OX18sIHBvcyk7CiAJfQorCS8vIGdpdmUgdGhlIERTUCBhIGNoYW5jZSB0byBzZXR0bGUgMDMvMTAvMDUgSGFjCisJbXNsZWVwKDEwMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSwgdTggZHNwVmVyc2lvbikKK3N0YXRpYyBpbnQgdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUpCiB7CiAJdTggZGF0YTEsIGRhdGEyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikgeworCQl0aW1lb3V0ID0gamlmZmllcyArIDIgKiBIWjsKKwkJd2hpbGUoISh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1NUQVRVU19DRCkgJiAweDIwKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiB0aW1lb3V0IHdhaXRpbmcgZm9yIERTUCByZWFkeVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2xlZXAoMSk7CisJCX0KKwl9IGVsc2UKKwkJbXNsZWVwKDEwMCk7CiAKIAkvLyBjaGVjayB1cGxvYWQgd2FzIE9LCiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCAweDEwLCAwKTsgLy8gd2Ugd2FudCB0byByZWFkIGZyb20gdGhlIERTUApAQCAtMzM2LDkgKzM2MywxMSBAQAogCiAJZGF0YTEgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMSk7CiAJZGF0YTIgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMik7Ci0JaWYgKChkYXRhMSAhPSAweDY3KSB8fCAoZGF0YTIgIT0gZHNwVmVyc2lvbikpCisJaWYgKGRhdGExICE9IDB4NjcgfHwgZGF0YTIgPCAweDIwIHx8IGRhdGEyID4gMHgyZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gaW52YWxpZFxuIiwgZGF0YTIpOwogCQlyZXR1cm4gLUVJTzsKLQorCX0KKwlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gb2tcbiIsIGRhdGEyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ5LDE0ICszNzgsMTQgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCAweDJjKSA9PSAwKQorCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KLQlwcmludGsoInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgVERBMTAwNDVfREVGQVVMVF9GSVJNV0FSRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHdhaXRpbmcgZm9yIGZpcm13YXJlIHVwbG9hZCAoJXMpLi4uXG4iLCBUREExMDA0NV9ERUZBVUxUX0ZJUk1XQVJFKTsKIAlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ1X0RFRkFVTFRfRklSTVdBUkUpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJ0ZGExMDA0eDogbm8gZmlybXdhcmUgdXBsb2FkICh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zNzAsOTUgKzM5OSw5MyBAQAogCXRkYTEwMDQ1aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOwogCiAJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ1SF9GV1BBR0UsIFREQTEwMDQ1SF9DT0RFX0lOKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CiAKIAkvKiB3YWl0IGZvciBEU1AgdG8gaW5pdGlhbGlzZSAqLwogCS8qIERTUFJFQURZIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIG9uIHRoZSBUREExMDA0NUggKi8KIAltc2xlZXAoMTAwKTsKIAotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MmMpOworCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IHRkYTEwMDQ2X2dldF9md192ZXJzaW9uKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUsCi0JCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3N0YXRpYyB2b2lkIHRkYTEwMDQ2X2luaXRfcGxscyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyIHBhdHRlcm5bXSA9IHsgMHg2NywgMHgwMCwgMHg1MCwgMHg2MiwgMHg1ZSwgMHgxOCwgMHg2NyB9OwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCS8qIGFyZWEgZ3Vlc3NlZCBmcm9tIGZpcm13YXJlIHYyMCwgdjIxIGFuZCB2MjUgKi8KLQlmb3IgKGkgPSAweDY2MDsgaSA8IDB4NzAwOyBpKyspIHsKLQkJaWYgKCFtZW1jbXAoJmZ3LT5kYXRhW2ldLCBwYXR0ZXJuLCBzaXplb2YocGF0dGVybikpKSB7Ci0JCQlzdGF0ZS0+ZndfdmVyc2lvbiA9IGZ3LT5kYXRhW2kgKyBzaXplb2YocGF0dGVybildOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHVzaW5nIGZpcm13YXJlIHYlMDJ4XG4iLAotCQkJCQlzdGF0ZS0+ZndfdmVyc2lvbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDEsIDB4ZjApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAorCWlmIChzdGF0ZS0+Y29uZmlnLT54dGFsX2ZyZXEgPT0gVERBMTAwNDZfWFRBTF80TSApIHsKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdXAgUExMcyBmb3IgYSA0IE1IeiBYdGFsXG4iLCBfX0ZVTkNUSU9OX18pOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCAwKTsgLy8gUExMIFAgPSBOID0gMAorCX0gZWxzZSB7CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHVwIFBMTHMgZm9yIGEgMTYgTUh6IFh0YWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIDMpOyAvLyBQTEwgUCA9IDAsIE4gPSAzCiAJfQotCi0JcmV0dXJuIC1FSU5WQUw7CisJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOworCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSkgeworCWNhc2UgVERBMTAwNDZfRlJFUV8zNjE3OgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4ZDQpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MmMpOworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0ZSRVFfMzYxMzoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweGQ0KTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA0NToKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweGEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA1MjoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBjKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDA2KTsKKwkJYnJlYWs7CisJfQorCXRkYTEwMDQ2aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOyAvLyBkZWZhdWx0IGJhbmR3aWR0aCA4IE1IegogfQogCiBzdGF0aWMgaW50IHRkYTEwMDQ2X2Z3dXBsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogcmVzZXQgKyB3YWtlIHVwIGNoaXAgKi8KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDApOwogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMSwgMCk7Ci0JbXNsZWVwKDEwMCk7CisJLyogbGV0IHRoZSBjbG9ja3MgcmVjb3ZlciBmcm9tIHNsZWVwICovCisJbXNsZWVwKDUpOwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCBzdGF0ZS0+ZndfdmVyc2lvbikgPT0gMCkKKwlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCi0JcHJpbnRrKCJ0ZGExMDA0eDogd2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkICglcykuLi5cbiIsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOwotCXJldCA9IHN0YXRlLT5jb25maWctPnJlcXVlc3RfZmlybXdhcmUoZmUsICZmdywgVERBMTAwNDZfREVGQVVMVF9GSVJNV0FSRSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGZ3LT5zaXplIDwgMjQ0NzgpIHsgLyogc2l6ZSBvZiBmaXJtd2FyZSB2MjAsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBvZiB2MjAsIHYyMSBhbmQgdjI1ICovCi0JCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIGZpbGUgc2VlbXMgdG8gYmUgdG9vIHNtYWxsICglZCBieXRlcylcbiIsIGZ3LT5zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gdGRhMTAwNDZfZ2V0X2Z3X3ZlcnNpb24oc3RhdGUsIGZ3KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoInRkYTEwMDR4OiB1bmFibGUgdG8gZmluZCBmaXJtd2FyZSB2ZXJzaW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBzZXQgcGFyYW1ldGVycyAqLwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCBzdGF0ZS0+Y29uZmlnLT5uX2kyYyk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDJjKTsKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDgsIDgpOyAvLyBnb2luZyB0byBib290IGZyb20gSE9TVAorCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CiAKLQlyZXQgPSB0ZGExMDA0eF9kb191cGxvYWQoc3RhdGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSwgVERBMTAwNDZIX0NPREVfQ1BULCBUREExMDA0NkhfQ09ERV9JTik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgY29tcGxldGVcbiIpOwotCi0JLyogd2FpdCBmb3IgRFNQIHRvIGluaXRpYWxpc2UgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCXdoaWxlICghKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfU1RBVFVTX0NEKSAmIDB4MjApKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBEU1AgZmFpbGVkIHRvIGluaXRpYWxpc2VkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTzsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZSAhPSBOVUxMKSB7CisJCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCisJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQuLi5cbiIpOworCQlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CisgICAJICAgCQlyZXR1cm4gcmV0OwogCQl9Ci0JCW1zbGVlcCgxKTsKKwkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCA4LCA4KTsgLy8gZ29pbmcgdG8gYm9vdCBmcm9tIEhPU1QKKwkJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ2SF9DT0RFX0NQVCwgVERBMTAwNDZIX0NPREVfSU4pOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJLyogYm9vdCBmcm9tIGZpcm13YXJlIGVlcHJvbSAqLworCQkvKiBIYWMgTm90ZTogd2UgbWlnaHQgbmVlZCB0byBkbyBzb21lIEdQSU8gTWFnaWMgaGVyZSAqLworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogYm9vdGluZyBmcm9tIGVlcHJvbVxuIik7CisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgNCwgNCk7CisJCW1zbGVlcCgzMDApOwogCX0KLQotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIHN0YXRlLT5md192ZXJzaW9uKTsKKwlyZXR1cm4gdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKTsKIH0KIAogc3RhdGljIGludCB0ZGExMDA0eF9lbmNvZGVfZmVjKGludCBmZWMpCkBAIC01NjAsMTIgKzU4NywxMCBAQAogCiAJaWYgKHRkYTEwMDQ2X2Z3dXBsb2FkKGZlKSkgewogCQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOyAvLyB3YWtlIHVwIHRoZSBjaGlwCi0KLQkvLyBJbml0IHRoZSBQTEwKKwkvLyBJbml0IHRoZSB0dW5lciBQTEwKIAlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKIAkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CiAJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKQEAgLTU3NCwzMiArNTk5LDQ0IEBACiAKIAkvLyB0ZGEgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDB4MjAsIDApOyAvLyBkaXNhYmxlIERTUCB3YXRjaGRvZyB0aW1lcgotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDMSwgMHg0MCwgMHg0MCk7Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgOCwgMCk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzEsIDB4ODAsIDApOyAvLyBkaXNhYmxlIHB1bHNlIGtpbGxlcgotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIHN0YXRlLT5jb25maWctPm5faTJjKTsgLy8gUExMIFAgPSBOID0gMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9PRkZTRVQsIDk5KTsgLy8gRlJFUU9GRlMgPSA5OQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7IC8vIH0gUEhZMiA9IC0xMTIyMQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHgyYyk7IC8vIH0KLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAwKTsgLy8gQUdDIHNldHVwCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjAsIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQVVUTywgNyk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORkMxLCA4KTsgLy8gZGlzYWJsZSBwdWxzZSBraWxsZXIKKworCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5hZ2NfY29uZmlnKSB7CisJY2FzZSBUREExMDA0Nl9BR0NfREVGQVVMVDoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfQ09ORiwgMHgwMCk7IC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHOgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDBhKTsgLy8gQUdDIHNldHVwCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHg2MCk7IC8vIHNldCBBR0MgcG9sYXJpdGllcworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0FHQ19JRk9fQVVUT19QT1M6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDAwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1g6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwRSk7IC8vIEdhaW4gUmVub3JtYWxpemUKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCX0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUxLCAweDYxKTsgLy8gVHVybiBib3RoIEFHQyBvdXRwdXRzIG9uCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVFVOX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RVTl9NQVgsIDB4ZmYpOyAvLyB9IEFHQyBtaW4vbWF4IHZhbHVlcwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01BWCwgMHhmZik7ICAvLyB9Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MzAsIDB4MTApOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0dBSU5TLCAxKTsgLy8gSUYgZ2FpbiAyLCBUVU4gZ2FpbiAxCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgMHg4MCwgMCk7IC8vIGNyeXN0YWwgaXMgNTBwcG0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MWEpOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMSwgNyk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMiwgMHgzMSwgMCk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4OWUsIDApOyAvLyBkaXNhYmxlIEFHQ19UVU4KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORl9UUzIsIDB4YzApOyAvLyBNUEVHMiBpbnRlcmZhY2UgY29uZmlnCisJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgMHgzYSwgMHg4MCwgc3RhdGUtPmNvbmZpZy0+aW52ZXJ0X29jbGsgPDwgNyk7CisKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUyLCAweGUxKTsgLy8gdHJpc3RhdGUgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fT1VUX1NFTCwgMHhjYyk7IC8vIEdQSU8gb3V0cHV0IGNvbmZpZwotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9HUElPX1NFTEVDVCwgOCwgOCk7IC8vIEdQSU8gc2VsZWN0Ci0JdGRhMTAwNDZoX3NldF9iYW5kd2lkdGgoc3RhdGUsIEJBTkRXSURUSF84X01IWik7IC8vIGRlZmF1bHQgYmFuZHdpZHRoIDggTUh6Ci0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCAweDNhLCAweDgwLCBzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA3KTsKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fU0VMRUNULCA4KTsgLy8gR1BJTyBzZWxlY3QKIAogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC02MjksOSArNjY2LDYgQEAKIAlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBmZV9wYXJhbXMpOwogCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKIAotCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikKLQkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCA0LCA0KTsKLQogCS8vIEhhcmRjb2RlZCB0byB1c2UgYXV0byBhcyBtdWNoIGFzIHBvc3NpYmxlIG9uIHRoZSBUREExMDA0NSBhcyBpdAogCS8vIGlzIHZlcnkgdW5yZWxpYWJsZSBpZiBBVVRPIG1vZGUgaXMgX25vdF8gdXNlZC4KIAlpZiAoc3RhdGUtPmRlbW9kX3R5cGUgPT0gVERBMTAwNFhfREVNT0RfVERBMTAwNDUpIHsKQEAgLTEwODksNiArMTEyMywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6CisJCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAgIT0gTlVMTCkgeworCQkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CisJCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAoZmUpOworCQkJdGRhMTAwNHhfZGlzYWJsZV90dW5lcl9pMmMoc3RhdGUpOworCQl9CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMSwgMSk7CiAJCWJyZWFrOwogCX0KQEAgLTExMDAsOCArMTEzOSw5IEBACiBzdGF0aWMgaW50IHRkYTEwMDR4X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gODAwOwotCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDE2NjY2NzsKLQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAxNjY2NjcqMjsKKwkvKiBEcmlmdCBjb21wZW5zYXRpb24gbWFrZXMgbm8gc2Vuc2UgZm9yIERWQi1UICovCisJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMDsKKwlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMjE2LDcgKzEyNTYsNiBAQAogCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKIAlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OwotCXN0YXRlLT5md192ZXJzaW9uID0gMHgyMDsJLyogZHVtbXkgZGVmYXVsdCB2YWx1ZSAqLwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDQ2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCmluZGV4IGM4ZTFkNTQuLjg2NTljNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCkBAIC0yNiw2ICsyNiwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKK2VudW0gdGRhMTAwNDZfeHRhbCB7CisJVERBMTAwNDZfWFRBTF80TSwKKwlUREExMDA0Nl9YVEFMXzE2TSwKK307CisKK2VudW0gdGRhMTAwNDZfYWdjIHsKKwlUREExMDA0Nl9BR0NfREVGQVVMVCwJCS8qIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gKi8KKwlUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHLAkvKiBJRiBBR0Mgb25seSwgYXV0b21hdGljLCBuZWd0aXZlICovCisJVERBMTAwNDZfQUdDX0lGT19BVVRPX1BPUywJLyogSUYgQUdDIG9ubHksIGF1dG9tYXRpYywgcG9zaXRpdmUgKi8KKwlUREExMDA0Nl9BR0NfVERBODI3WCwJICAgIC8qIElGIEFHQyBvbmx5LCBzcGVjaWFsIHNldHVwIGZvciB0ZGE4Mjd4ICovCit9OworCitlbnVtIHRkYTEwMDQ2X2lmIHsKKwlUREExMDA0Nl9GUkVRXzM2MTcsCQkvKiBvcmlnaW5hbCBjb25maWcsIDM2LDE2NiBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzM2MTMsCQkvKiAzNiwxMyBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA0NSwJCS8qIGxvdyBJRiwgNC4wLCA0LjUsIG9yIDUuMCBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA1MiwJCS8qIGxvdyBJRiwgNS4xNjY3IE1IWiBmb3IgdGRhOTg4OSAqLworfTsKKwogc3RydWN0IHRkYTEwMDR4X2NvbmZpZwogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCkBAIC0zNywxNCArNTYsMjIgQEAKIAkvKiBEb2VzIHRoZSBPQ0xLIHNpZ25hbCBuZWVkIGludmVydGVkPyAqLwogCXU4IGludmVydF9vY2xrOwogCi0JLyogdmFsdWUgb2YgTl9JMkMgb2YgdGhlIENPTkZfUExMMyByZWdpc3RlciAqLwotCXU4IG5faTJjOworCS8qIFh0YWwgZnJlcXVlbmN5LCA0IG9yIDE2TUh6Ki8KKwllbnVtIHRkYTEwMDQ2X3h0YWwgeHRhbF9mcmVxOworCisJLyogSUYgZnJlcXVlbmN5ICovCisJZW51bSB0ZGExMDA0Nl9pZiBpZl9mcmVxOworCisJLyogQUdDIGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIHRkYTEwMDQ2X2FnYyBhZ2NfY29uZmlnOwogCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKKwl2b2lkICgqcGxsX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAJaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIAogCS8qIHJlcXVlc3QgZmlybXdhcmUgZm9yIGRldmljZSAqLworCS8qIHNldCB0aGlzIHRvIE5VTEwgaWYgdGhlIGNhcmQgaGFzIGEgZmlybXdhcmUgRUVQUk9NICovCiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODB4eC5jCmluZGV4IDAzMmQzNDguLjg4ZTEyNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgweHguYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyODQyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBEVkJfUExVVE8yCisJdHJpc3RhdGUgIlBsdXRvMiBjYXJkcyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorCXNlbGVjdCBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwlzZWxlY3QgRFZCX1REQTEwMDRYCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBQbHV0bzIgRlBHQSBsaWtlIHRoZSBTYXRlbGNvCisJICBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIERWQi1UIFJlY2VpdmVyLgorCisgICAgICAgICAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAorCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBQQ0kgYnVzLCBzbyB5b3UgbmVlZAorCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUViBvbiB5b3VyIGNvbXB1dGVyLgorCisJICBTYXkgWSBvciBNIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhODRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX0RWQl9QTFVUTzIpID0gcGx1dG8yLm8KKworRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZTBiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAqIHBsdXRvMi5jIC0gU2F0ZWxjbyBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIFJlY2VpdmVyIFtEVkItVF0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kcmVhcyBPYmVycml0dGVyIDxvYmlAbGludXh0di5vcmc+CisgKgorICogYmFzZWQgb24gcGx1dG8yLmMgMS4xMCAtIGh0dHA6Ly9pbnN0aW5jdC13cDgubm8taXAub3JnL3BsdXRvLworICogCWJ5IERhbnkgU2FsbWFuIDxzYWxtYW5kYW55QHlhaG9vLmZyPgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRERgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJkZW11eC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yl9uZXQuaCIKKyNpbmNsdWRlICJkdmJkZXYuaCIKKyNpbmNsdWRlICJ0ZGExMDA0eC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkicGx1dG8yIgorCisjZGVmaW5lIFJFR19QSURuKG4pCQkoKG4pIDw8IDIpCS8qIFBJRCBuIHBhdHRlcm4gcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19QQ0FSCQkweDAwMjAJCS8qIFBDIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RTQ1IJCTB4MDAyNAkJLyogVFMgY3RybCAmIHN0YXR1cyAqLworI2RlZmluZSBSRUdfTUlTQwkJMHgwMDI4CQkvKiBtaXNjZWxsYW5lb3VzICovCisjZGVmaW5lIFJFR19NTUFDCQkweDAwMmMJCS8qIE1TQiBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBSRUdfSU1BQwkJMHgwMDMwCQkvKiBJU0IgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX0xNQUMJCTB4MDAzNAkJLyogTFNCIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFJFR19TUElECQkweDAwMzgJCS8qIFNQSSBkYXRhICovCisjZGVmaW5lIFJFR19TTENTCQkweDAwM2MJCS8qIHNlcmlhbCBsaW5rcyBjdHJsL3N0YXR1cyAqLworCisjZGVmaW5lIFBJRDBfTk9GSUwJCSgweDAwMDEgPDwgMTYpCisjZGVmaW5lIFBJRG5fRU5QCQkoMHgwMDAxIDw8IDE1KQorI2RlZmluZSBQSUQwX0VORAkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgUElEMF9BRklMCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBQSURuX1BJRAkJKDB4MWZmZiA8PCAgMCkKKworI2RlZmluZSBUU0NSX05CUEFDS0VUUwkJKDB4MDBmZiA8PCAyNCkKKyNkZWZpbmUgVFNDUl9ERU0JCSgweDAwMDEgPDwgMTcpCisjZGVmaW5lIFRTQ1JfREUJCQkoMHgwMDAxIDw8IDE2KQorI2RlZmluZSBUU0NSX1JTVE4JCSgweDAwMDEgPDwgMTUpCisjZGVmaW5lIFRTQ1JfTVNLTwkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgVFNDUl9NU0tBCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBUU0NSX01TS0wJCSgweDAwMDEgPDwgMTIpCisjZGVmaW5lIFRTQ1JfT1ZSCQkoMHgwMDAxIDw8IDExKQorI2RlZmluZSBUU0NSX0FGVUwJCSgweDAwMDEgPDwgMTApCisjZGVmaW5lIFRTQ1JfTE9DSwkJKDB4MDAwMSA8PCAgOSkKKyNkZWZpbmUgVFNDUl9JQUNLCQkoMHgwMDAxIDw8ICA4KQorI2RlZmluZSBUU0NSX0FERUYJCSgweDAwN2YgPDwgIDApCisKKyNkZWZpbmUgTUlTQ19EVlIJCSgweDBmZmYgPDwgIDQpCisjZGVmaW5lIE1JU0NfQUxFRAkJKDB4MDAwMSA8PCAgMykKKyNkZWZpbmUgTUlTQ19GUlNUCQkoMHgwMDAxIDw8ICAyKQorI2RlZmluZSBNSVNDX0xFRDEJCSgweDAwMDEgPDwgIDEpCisjZGVmaW5lIE1JU0NfTEVEMAkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBTUElEX1NQSURSCQkoMHgwMGZmIDw8ICAwKQorCisjZGVmaW5lIFNMQ1NfU0NMCQkoMHgwMDAxIDw8ICA3KQorI2RlZmluZSBTTENTX1NEQQkJKDB4MDAwMSA8PCAgNikKKyNkZWZpbmUgU0xDU19DU04JCSgweDAwMDEgPDwgIDIpCisjZGVmaW5lIFNMQ1NfT1ZSCQkoMHgwMDAxIDw8ICAxKQorI2RlZmluZSBTTENTX1NXQwkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBUU19ETUFfUEFDS0VUUwkJKDgpCisjZGVmaW5lIFRTX0RNQV9CWVRFUwkJKDE4OCAqIFRTX0RNQV9QQUNLRVRTKQorCisjZGVmaW5lIEkyQ19BRERSX1REQTEwMDQ2CTB4MTAKKyNkZWZpbmUgSTJDX0FERFJfVFVBNjAzNAkweGMyCisjZGVmaW5lIE5IV0ZJTFRFUlMJCTgKKworc3RydWN0IHBsdXRvIHsKKwkvKiBwY2kgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1OCBfX2lvbWVtICppb19tZW07CisKKwkvKiBkdmIgKi8KKwlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOworCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOworCXN0cnVjdCBkbXhkZXYgZG14ZGV2OworCXN0cnVjdCBkdmJfYWRhcHRlciBkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKKwl1bnNpZ25lZCBpbnQgZnVsbF90c191c2VyczsKKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKKwkvKiBpMmMgKi8KKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2JpdDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CisJdW5zaWduZWQgaW50IGkyY2J1ZzsKKworCS8qIGlycSAqLworCXVuc2lnbmVkIGludCBvdmVyZmxvdzsKKworCS8qIGRtYSAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTggZG1hX2J1ZltUU19ETUFfQllURVNdOworCXU4IGR1bW15WzQwOTZdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGx1dG8gKmZlZWRfdG9fcGx1dG8oc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVlZC0+ZGVtdXgsIHN0cnVjdCBwbHV0bywgZGVtdXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbHV0byAqZnJvbnRlbmRfdG9fcGx1dG8oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZS0+ZHZiLCBzdHJ1Y3QgcGx1dG8sIGR2Yl9hZGFwdGVyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGx1dG9fcmVhZHJlZyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbCgmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsdXRvX3dyaXRlcmVnKHN0cnVjdCBwbHV0byAqcGx1dG8sIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgJnBsdXRvLT5pb19tZW1bcmVnXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbHV0b19ydyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIGJpdHMpCit7CisJdTMyIHZhbCA9IHJlYWRsKCZwbHV0by0+aW9fbWVtW3JlZ10pOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gYml0czsKKwl3cml0ZWwodmFsLCAmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgU0xDU19TREEpOworCWVsc2UKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlpZiAoc3RhdGUpCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIFNMQ1NfU0NMKTsKKwllbHNlCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIDApOworCisJLyogdHJ5IHRvIGRldGVjdCBpMmNfaW5iKCkgdG8gd29ya2Fyb3VuZCBoYXJkd2FyZSBidWc6CisJICogcmVzZXQgU0RBIHRvIGhpZ2ggYWZ0ZXIgU0NMIGhhcyBiZWVuIHNldCB0byBsb3cgKi8KKwlpZiAoKHN0YXRlKSAmJiAocGx1dG8tPmkyY2J1ZyA9PSAwKSkgeworCQlwbHV0by0+aTJjYnVnID0gMTsKKwl9IGVsc2UgeworCQlpZiAoKCFzdGF0ZSkgJiYgKHBsdXRvLT5pMmNidWcgPT0gMSkpCisJCQlwbHV0b19zZXRzZGEocGx1dG8sIDEpOworCQlwbHV0by0+aTJjYnVnID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TREE7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TQ0w7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3Jlc2V0X2Zyb250ZW5kKHN0cnVjdCBwbHV0byAqcGx1dG8sIGludCByZWVuYWJsZSkKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX01JU0MpOworCisJaWYgKHZhbCAmIE1JU0NfRlJTVCkgeworCQl2YWwgJj0gfk1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KKwlpZiAocmVlbmFibGUpIHsKKwkJdmFsIHw9IE1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgcGx1dG9fcmVzZXRfdHMoc3RydWN0IHBsdXRvICpwbHV0bywgaW50IHJlZW5hYmxlKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisKKwlpZiAodmFsICYgVFNDUl9SU1ROKSB7CisJCXZhbCAmPSB+VFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorCWlmIChyZWVuYWJsZSkgeworCQl2YWwgfD0gVFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbHV0b19zZXRfZG1hX2FkZHIoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1BDQVIsIGNwdV90b19sZTMyKHBsdXRvLT5kbWFfYWRkcikpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19kbWFfbWFwKHN0cnVjdCBwbHV0byAqcGx1dG8pCit7CisJcGx1dG8tPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYnVmLAorCQkJVFNfRE1BX0JZVEVTLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcmV0dXJuIHBjaV9kbWFfbWFwcGluZ19lcnJvcihwbHV0by0+ZG1hX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kbWFfdW5tYXAoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwY2lfdW5tYXBfc2luZ2xlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZlZWRfdG9fcGx1dG8oZik7CisKKwkvKiBlbmFibGUgUElEIGZpbHRlcmluZyAqLworCWlmIChwbHV0by0+dXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCB8IFBJRDBfTk9GSUwsIDApOworCisJaWYgKChmLT5waWQgPCAweDIwMDApICYmIChmLT5pbmRleCA8IE5IV0ZJTFRFUlMpKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oZi0+aW5kZXgpLCBQSURuX0VOUCB8IFBJRG5fUElELCBQSURuX0VOUCB8IGYtPnBpZCk7CisJZWxzZSBpZiAocGx1dG8tPmZ1bGxfdHNfdXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfTk9GSUwsIFBJRDBfTk9GSUwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZmVlZF90b19wbHV0byhmKTsKKworCS8qIGRpc2FibGUgUElEIGZpbHRlcmluZyAqLworCWlmICgtLXBsdXRvLT51c2VycyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCwgUElEMF9BRklMKTsKKworCWlmICgoZi0+cGlkIDwgMHgyMDAwKSAmJiAoZi0+aW5kZXggPCBOSFdGSUxURVJTKSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKGYtPmluZGV4KSwgUElEbl9FTlAgfCBQSURuX1BJRCwgMHgxZmZmKTsKKwllbHNlIGlmICgtLXBsdXRvLT5mdWxsX3RzX3VzZXJzID09IDApCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9OT0ZJTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fZG1hX2VuZChzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1bnNpZ25lZCBpbnQgbmJwYWNrZXRzKQoreworCS8qIHN5bmNocm9uaXplIHRoZSBETUEgdHJhbnNmZXIgd2l0aCB0aGUgQ1BVCisJICogZmlyc3Qgc28gdGhhdCB3ZSBzZWUgdXBkYXRlZCBjb250ZW50cy4gKi8KKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYWRkciwKKwkJCVRTX0RNQV9CWVRFUywgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIFdvcmthcm91bmQgZm9yIGJyb2tlbiBoYXJkd2FyZToKKwkgKiBbMV0gT24gc3RhcnR1cCBOQlBBQ0tFVFMgc2VlbXMgdG8gY29udGFpbiBhbiB1bmluaXRpYWxpemVkIHZhbHVlLAorCSAqICAgICBidXQgbm8gcGFja2V0cyBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKwkgKiBbMl0gU29tZXRpbWVzIChhY3R1YWxseSB2ZXJ5IG9mdGVuKSBOQlBBQ0tFVFMgc3RheXMgYXQgemVybworCSAqICAgICBhbHRob3VnaCBvbmUgcGFja2V0IGhhcyBiZWVuIHRyYW5zZmVyZWQuCisJICovCisJaWYgKChuYnBhY2tldHMgPT0gMCkgfHwgKG5icGFja2V0cyA+IFRTX0RNQV9QQUNLRVRTKSkgeworCQl1bnNpZ25lZCBpbnQgaSA9IDAsIHZhbGlkOworCQl3aGlsZSAocGx1dG8tPmRtYV9idWZbaV0gPT0gMHg0NykKKwkJCWkgKz0gMTg4OworCQl2YWxpZCA9IGkgLyAxODg7CisJCWlmIChuYnBhY2tldHMgIT0gdmFsaWQpIHsKKwkJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJuYnBhY2tldHM9JXUgdmFsaWQ9JXVcbiIsCisJCQkJCW5icGFja2V0cywgdmFsaWQpOworCQkJbmJwYWNrZXRzID0gdmFsaWQ7CisJCX0KKwl9CisKKwlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoJnBsdXRvLT5kZW11eCwgcGx1dG8tPmRtYV9idWYsIG5icGFja2V0cyk7CisKKwkvKiBjbGVhciB0aGUgZG1hIGJ1ZmZlci4gdGhpcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBpZGVudGlmeQorCSAqIG5ldyB2YWxpZCB0cyBwYWNrZXRzIGFib3ZlICovCisJbWVtc2V0KHBsdXRvLT5kbWFfYnVmLCAwLCBuYnBhY2tldHMgKiAxODgpOworCisJLyogcmVzZXQgdGhlIGRtYSBhZGRyZXNzICovCisJcGx1dG9fc2V0X2RtYV9hZGRyKHBsdXRvKTsKKworCS8qIHN5bmMgdGhlIGJ1ZmZlciBhbmQgZ2l2ZSBpdCBiYWNrIHRvIHRoZSBjYXJkICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbHV0b19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGV2X2lkOworCXUzMiB0c2NyOworCisJLyogY2hlY2sgd2hldGhlciBhbiBpbnRlcnJ1cHQgb2NjdXJlZCBvbiB0aGlzIGRldmljZSAqLworCXRzY3IgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisJaWYgKCEodHNjciAmIChUU0NSX0RFIHwgVFNDUl9PVlIpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHRzY3IgPT0gMHhmZmZmZmZmZikgeworCQkvLyBGSVhNRTogbWF5YmUgcmVjb3ZlciBzb21laG93CisJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJjYXJkIGh1bmcgdXAgOihcbiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogZG1hIGVuZCBpbnRlcnJ1cHQgKi8KKwlpZiAodHNjciAmIFRTQ1JfREUpIHsKKwkJcGx1dG9fZG1hX2VuZChwbHV0bywgKHRzY3IgJiBUU0NSX05CUEFDS0VUUykgPj4gMjQpOworCQkvKiBvdmVyZmxvdyBpbnRlcnJ1cHQgKi8KKwkJaWYgKHRzY3IgJiBUU0NSX09WUikKKwkJCXBsdXRvLT5vdmVyZmxvdysrOworCQlpZiAocGx1dG8tPm92ZXJmbG93KSB7CisJCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAib3ZlcmZsb3cgaXJxICglZClcbiIsCisJCQkJCXBsdXRvLT5vdmVyZmxvdyk7CisJCQlwbHV0b19yZXNldF90cyhwbHV0bywgMSk7CisJCQlwbHV0by0+b3ZlcmZsb3cgPSAwOworCQl9CisJfSBlbHNlIGlmICh0c2NyICYgVFNDUl9PVlIpIHsKKwkJcGx1dG8tPm92ZXJmbG93Kys7CisJfQorCisJLyogQUNLIHRoZSBpbnRlcnJ1cHQgKi8KKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHRzY3IgfCBUU0NSX0lBQ0spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGx1dG9fZW5hYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogc2V0IHRoZSBudW1iZXIgb2YgcGFja2V0cyAqLworCXZhbCAmPSB+VFNDUl9BREVGOworCXZhbCB8PSBUU19ETUFfUEFDS0VUUyAvIDI7CisJLyogZGlzYWJsZSBBRlVMIGFuZCBMT0NLIGludGVycnVwdHMgKi8KKwl2YWwgfD0gKFRTQ1JfTVNLQSB8IFRTQ1JfTVNLTCk7CisJLyogZW5hYmxlIERNQSBhbmQgT1ZFUkZMT1cgaW50ZXJydXB0cyAqLworCXZhbCAmPSB+KFRTQ1JfREVNIHwgVFNDUl9NU0tPKTsKKwkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwl2YWwgfD0gVFNDUl9JQUNLOworCisJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19UU0NSLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kaXNhYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXZhbCB8PSAoVFNDUl9ERU0gfCBUU0NSX01TS08gfCBUU0NSX01TS0EgfCBUU0NSX01TS0wpOworCS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXZhbCB8PSBUU0NSX0lBQ0s7CisKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsdXRvX2h3X2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b19yZXNldF9mcm9udGVuZChwbHV0bywgMSk7CisKKwkvKiBzZXQgYXV0b21hdGljIExFRCBjb250cm9sIGJ5IEZQR0EgKi8KKwlwbHV0b19ydyhwbHV0bywgUkVHX01JU0MsIE1JU0NfQUxFRCwgTUlTQ19BTEVEKTsKKworCS8qIHNldCBkYXRhIGVuZGlhbmVzcyAqLworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9FTkQsIFBJRDBfRU5EKTsKKyNlbHNlCisJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKDApLCBQSUQwX0VORCwgMCk7CisjZW5kaWYKKwkvKiBtYXAgRE1BIGFuZCBzZXQgYWRkcmVzcyAqLworCXBsdXRvX2RtYV9tYXAocGx1dG8pOworCXBsdXRvX3NldF9kbWFfYWRkcihwbHV0byk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXBsdXRvX2VuYWJsZV9pcnFzKHBsdXRvKTsKKworCS8qIHJlc2V0IFRTIGxvZ2ljICovCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX2h3X2V4aXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlwbHV0b19kaXNhYmxlX2lycXMocGx1dG8pOworCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDApOworCisJLyogTEVEOiBkaXNhYmxlIGF1dG9tYXRpYyBjb250cm9sLCBlbmFibGUgeWVsbG93LCBkaXNhYmxlIGdyZWVuICovCisJcGx1dG9fcncocGx1dG8sIFJFR19NSVNDLCBNSVNDX0FMRUQgfCBNSVNDX0xFRDEgfCBNSVNDX0xFRDAsIE1JU0NfTEVEMSk7CisKKwkvKiB1bm1hcCBETUEgKi8KKwlwbHV0b19kbWFfdW5tYXAocGx1dG8pOworCisJcGx1dG9fcmVzZXRfZnJvbnRlbmQocGx1dG8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBkaXZpZGUodTMyIG51bWVyYXRvciwgdTMyIGRlbm9taW5hdG9yKQoreworCWlmIChkZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gfjA7CisKKwlyZXR1cm4gKG51bWVyYXRvciArIGRlbm9taW5hdG9yIC8gMikgLyBkZW5vbWluYXRvcjsKK30KKworLyogTEcgSW5ub3RlayBURFRFLUUwMDFQIChJbmZpbmVvbiBUVUE2MDM0KSAqLworc3RhdGljIGludCBsZ190ZHRwZTAwMXBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZyb250ZW5kX3RvX3BsdXRvKGZlKTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisJdTMyIGRpdjsKKworCS8vIEZyZWYgPSAxNjYuNjY3IEh6CisJLy8gRnJlZiAqIDMgPSA1MDAuMDAwIEh6CisJLy8gSUYgPSAzNjE2NjY2NworCS8vIElGIC8gRnJlZiA9IDIxNworCS8vZGl2ID0gZGl2aWRlKHAtPmZyZXF1ZW5jeSArIDM2MTY2NjY3LCAxNjY2NjcpOworCWRpdiA9IGRpdmlkZShwLT5mcmVxdWVuY3kgKiAzLCA1MDAwMDApICsgMjE3OworCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOworCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOworCisJaWYgKHAtPmZyZXF1ZW5jeSA8IDYxMTAwMDAwMCkKKwkJYnVmWzJdID0gMHhiNDsKKwllbHNlIGlmIChwLT5mcmVxdWVuY3kgPCA4MTEwMDAwMDApCisJCWJ1ZlsyXSA9IDB4YmM7CisJZWxzZQorCQlidWZbMl0gPSAweGY0OworCisJLy8gVkhGOiAxNzQtMjMwIE1IegorCS8vIGNlbnRlcjogMzUwIE1IegorCS8vIFVIRjogNDcwLTg2MiBNSHoKKwlpZiAocC0+ZnJlcXVlbmN5IDwgMzUwMDAwMDAwKQorCQlidWZbM10gPSAweDAyOworCWVsc2UKKwkJYnVmWzNdID0gMHgwNDsKKworCWlmIChwLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYnVmWzNdIHw9IDB4MDg7CisKKwlpZiAoc2l6ZW9mKGJ1ZikgPT0gNikgeworCQlidWZbNF0gPSBidWZbMl07CisJCWJ1Zls0XSAmPSB+MHgxYzsKKwkJYnVmWzRdIHw9ICAweDE4OworCisJCWJ1Zls1XSA9ICgwIDw8IDcpIHwgKDIgPDwgNCk7CisJfQorCisJbXNnLmFkZHIgPSBJMkNfQUREUl9UVUE2MDM0ID4+IDE7CisJbXNnLmZsYWdzID0gMDsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSBzaXplb2YoYnVmKTsKKworCXJldCA9IGkyY190cmFuc2ZlcigmcGx1dG8tPmkyY19hZGFwLCAmbXNnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlIGlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZnJvbnRlbmRfdG9fcGx1dG8oZmUpOworCisJcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZwbHV0by0+cGRldi0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGx1dG8yX2ZlX2NvbmZpZyBfX2RldmluaXRkYXRhID0geworCS5kZW1vZF9hZGRyZXNzID0gSTJDX0FERFJfVERBMTAwNDYgPj4gMSwKKwkuaW52ZXJ0ID0gMSwKKwkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAorCS5wbGxfc2V0ID0gbGdfdGR0cGUwMDFwX3BsbF9zZXQsCisJLnBsbF9zbGVlcCA9IE5VTEwsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZyb250ZW5kX2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlpbnQgcmV0OworCisJcGx1dG8tPmZlID0gdGRhMTAwNDZfYXR0YWNoKCZwbHV0bzJfZmVfY29uZmlnLCAmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAoIXBsdXRvLT5mZSkgeworCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBmcm9udGVuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmcGx1dG8tPmR2Yl9hZGFwdGVyLCBwbHV0by0+ZmUpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChwbHV0by0+ZmUtPm9wcy0+cmVsZWFzZSkKKwkJCXBsdXRvLT5mZS0+b3BzLT5yZWxlYXNlKHBsdXRvLT5mZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX3JldihzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTUlTQykgJiBNSVNDX0RWUjsKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgImJvYXJkIHJldmlzaW9uICVkLiVkXG4iLAorCQkJKHZhbCA+PiAxMikgJiAweDBmLCAodmFsID4+IDQpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX21hYyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1OCAqbWFjKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTU1BQyk7CisJbWFjWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzFdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfSU1BQyk7CisJbWFjWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzNdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTE1BQyk7CisJbWFjWzRdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzVdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19yZWFkX3NlcmlhbChzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGx1dG8tPnBkZXY7CisJdW5zaWduZWQgaW50IGksIGo7CisJdTggX19pb21lbSAqY2lzOworCisJY2lzID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOworCWlmICghY2lzKQorCQlyZXR1cm4gLUVJTzsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTL04gIik7CisKKwlmb3IgKGkgPSAweGUwOyBpIDwgMHgxMDA7IGkgKz0gNCkgeworCQl1MzIgdmFsID0gcmVhZGwoJmNpc1tpXSk7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaiArPSA4KSB7CisJCQlpZiAoKHZhbCAmIDB4ZmYpID09IDB4ZmYpCisJCQkJZ290byBvdXQ7CisJCQlwcmludGsoIiVjIiwgdmFsICYgMHhmZik7CisJCQl2YWwgPj49IDg7CisJCX0KKwl9CitvdXQ6CisJcHJpbnRrKCJcbiIpOworCXBjaV9pb3VubWFwKHBkZXYsIGNpcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGx1dG8yX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXI7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg7CisJc3RydWN0IGRteF9kZW11eCAqZG14OworCWludCByZXQgPSAtRU5PTUVNOworCisJcGx1dG8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGx1dG8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBsdXRvKQorCQlnb3RvIG91dDsKKworCW1lbXNldChwbHV0bywgMCwgc2l6ZW9mKHN0cnVjdCBwbHV0bykpOworCXBsdXRvLT5wZGV2ID0gcGRldjsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9rZnJlZTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDZjLCAweDgwMDApOworCisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBsdXRvLT5pb19tZW0gPSBwY2lfaW9tYXAocGRldiwgMCwgMHg0MCk7CisJaWYgKCFwbHV0by0+aW9fbWVtKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHBsdXRvKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGx1dG9faXJxLCBTQV9TSElSUSwgRFJJVkVSX05BTUUsIHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGNpX2lvdW5tYXA7CisKKwlyZXQgPSBwbHV0b19od19pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwkvKiBpMmMgKi8KKwlpMmNfc2V0X2FkYXBkYXRhKCZwbHV0by0+aTJjX2FkYXAsIHBsdXRvKTsKKwlzdHJjcHkocGx1dG8tPmkyY19hZGFwLm5hbWUsIERSSVZFUl9OQU1FKTsKKwlwbHV0by0+aTJjX2FkYXAub3duZXIgPSBUSElTX01PRFVMRTsKKwlwbHV0by0+aTJjX2FkYXAuaWQgPSBJMkNfQUxHT19CSVQ7CisJcGx1dG8tPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisJcGx1dG8tPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXBsdXRvLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmcGx1dG8tPmkyY19iaXQ7CisJcGx1dG8tPmkyY19iaXQuZGF0YSA9IHBsdXRvOworCXBsdXRvLT5pMmNfYml0LnNldHNkYSA9IHBsdXRvX3NldHNkYTsKKwlwbHV0by0+aTJjX2JpdC5zZXRzY2wgPSBwbHV0b19zZXRzY2w7CisJcGx1dG8tPmkyY19iaXQuZ2V0c2RhID0gcGx1dG9fZ2V0c2RhOworCXBsdXRvLT5pMmNfYml0LmdldHNjbCA9IHBsdXRvX2dldHNjbDsKKwlwbHV0by0+aTJjX2JpdC51ZGVsYXkgPSAxMDsKKwlwbHV0by0+aTJjX2JpdC50aW1lb3V0ID0gMTA7CisKKwkvKiBSYWlzZSBTQ0wgYW5kIFNEQSAqLworCXBsdXRvX3NldHNkYShwbHV0bywgMSk7CisJcGx1dG9fc2V0c2NsKHBsdXRvLCAxKTsKKworCXJldCA9IGkyY19iaXRfYWRkX2J1cygmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGx1dG9faHdfZXhpdDsKKworCS8qIGR2YiAqLworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2kyY19iaXRfZGVsX2J1czsKKworCWR2Yl9hZGFwdGVyID0gJnBsdXRvLT5kdmJfYWRhcHRlcjsKKworCXBsdXRvX3JlYWRfcmV2KHBsdXRvKTsKKwlwbHV0b19yZWFkX3NlcmlhbChwbHV0byk7CisJcGx1dG9fcmVhZF9tYWMocGx1dG8sIGR2Yl9hZGFwdGVyLT5wcm9wb3NlZF9tYWMpOworCisJZHZiZGVtdXggPSAmcGx1dG8tPmRlbXV4OworCWR2YmRlbXV4LT5maWx0ZXJudW0gPSAyNTY7CisJZHZiZGVtdXgtPmZlZWRudW0gPSAyNTY7CisJZHZiZGVtdXgtPnN0YXJ0X2ZlZWQgPSBwbHV0b19zdGFydF9mZWVkOworCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBwbHV0b19zdG9wX2ZlZWQ7CisJZHZiZGVtdXgtPmRteC5jYXBhYmlsaXRpZXMgPSAoRE1YX1RTX0ZJTFRFUklORyB8CisJCQlETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJcmV0ID0gZHZiX2RteF9pbml0KGR2YmRlbXV4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcjsKKworCWRteCA9ICZkdmJkZW11eC0+ZG14OworCisJcGx1dG8tPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCXBsdXRvLT5tZW1fZnJvbnRlbmQuc291cmNlID0gRE1YX01FTU9SWV9GRTsKKwlwbHV0by0+ZG14ZGV2LmZpbHRlcm51bSA9IE5IV0ZJTFRFUlM7CisJcGx1dG8tPmRteGRldi5kZW11eCA9IGRteDsKKworCXJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmcGx1dG8tPmRteGRldiwgZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14ZGV2X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOworCisJcmV0ID0gZG14LT5jb25uZWN0X2Zyb250ZW5kKGRteCwgJnBsdXRvLT5od19mcm9udGVuZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlbW92ZV9tZW1fZnJvbnRlbmQ7CisKKwlyZXQgPSBmcm9udGVuZF9pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZGlzY29ubmVjdF9mcm9udGVuZDsKKworCWR2Yl9uZXRfaW5pdChkdmJfYWRhcHRlciwgJnBsdXRvLT5kdmJuZXQsIGRteCk7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX2Rpc2Nvbm5lY3RfZnJvbnRlbmQ6CisJZG14LT5kaXNjb25uZWN0X2Zyb250ZW5kKGRteCk7CitlcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKK2Vycl9yZW1vdmVfaHdfZnJvbnRlbmQ6CisJZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmcGx1dG8tPmh3X2Zyb250ZW5kKTsKK2Vycl9kdmJfZG14ZGV2X3JlbGVhc2U6CisJZHZiX2RteGRldl9yZWxlYXNlKCZwbHV0by0+ZG14ZGV2KTsKK2Vycl9kdmJfZG14X3JlbGVhc2U6CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKK2Vycl9kdmJfdW5yZWdpc3Rlcl9hZGFwdGVyOgorCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZHZiX2FkYXB0ZXIpOworZXJyX2kyY19iaXRfZGVsX2J1czoKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CitlcnJfcGx1dG9faHdfZXhpdDoKKwlwbHV0b19od19leGl0KHBsdXRvKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHBsdXRvKTsKK2Vycl9wY2lfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBwbHV0by0+aW9fbWVtKTsKK2Vycl9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9rZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocGx1dG8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGx1dG8yX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIgPSAmcGx1dG8tPmR2Yl9hZGFwdGVyOworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gJnBsdXRvLT5kZW11eDsKKwlzdHJ1Y3QgZG14X2RlbXV4ICpkbXggPSAmZHZiZGVtdXgtPmRteDsKKworCWRteC0+Y2xvc2UoZG14KTsKKwlkdmJfbmV0X3JlbGVhc2UoJnBsdXRvLT5kdmJuZXQpOworCWlmIChwbHV0by0+ZmUpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKHBsdXRvLT5mZSk7CisKKwlkbXgtPmRpc2Nvbm5lY3RfZnJvbnRlbmQoZG14KTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWR2Yl9kbXhkZXZfcmVsZWFzZSgmcGx1dG8tPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyKTsKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CisJcGx1dG9faHdfZXhpdChwbHV0byk7CisJZnJlZV9pcnEocGRldi0+aXJxLCBwbHV0byk7CisJcGNpX2lvdW5tYXAocGRldiwgcGx1dG8tPmlvX21lbSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHBsdXRvKTsKK30KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1NDTQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NDTQkweDA0MzIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1BMVVRPMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMVVRPMgkweDAwMDEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGx1dG8yX2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NDTSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfUExVVE8yLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwgeworCQkvKiBlbXB0eSAqLworCX0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGx1dG8yX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBsdXRvMl9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgPSBwbHV0bzJfaWRfdGFibGUsCisJLnByb2JlID0gcGx1dG8yX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbHV0bzJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsdXRvMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGx1dG8yX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwbHV0bzJfaW5pdCk7Cittb2R1bGVfZXhpdChwbHV0bzJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgT2JlcnJpdHRlciA8b2JpQGxpbnV4dHYub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbHV0bzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCA3ZmZhMmM3Li5iZjNjMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAlzZWxlY3QgRFZCX1NUVjAyOTcKIAlzZWxlY3QgRFZCX0w2NDc4MQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFNBQTcxNDYgYW5kIEFWNzExMCBiYXNlZCBEVkIgY2FyZHMgYXMgcHJvZHVjZWQgCisJICBTdXBwb3J0IGZvciBTQUE3MTQ2IGFuZCBBVjcxMTAgYmFzZWQgRFZCIGNhcmRzIGFzIHByb2R1Y2VkCiAJICBieSBGdWppdHN1LVNpZW1lbnMsIFRlY2hub3RyZW5kLCBIYXVwcGF1Z2UgYW5kIG90aGVycy4KIAogCSAgVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgZnVsbGZlYXR1cmVkIGNhcmRzIHdpdGgKQEAgLTMzLDcgKzMzLDcgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGZpcm13YXJlIGludG8gdGhlIGRyaXZlciB5b3UgbmVlZCB0byBzYXkKIAkgIFkgaGVyZSBhbmQgcHJvdmlkZSB0aGUgY29ycmVjdCBwYXRoIG9mIHRoZSBmaXJtd2FyZS4gWW91IG5lZWQgdGhpcwogCSAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHdob2xlIGRyaXZlciBzdGF0aWNhbGx5IGludG8gdGhlCi0JICBrZXJuZWwuIAorCSAga2VybmVsLgogCiAJICBBbGwgb3RoZXIgcGVvcGxlIHNheSBOLgogCkBAIC02Niw2ICs2Niw3IEBACiAJc2VsZWN0IERWQl9MNjQ3ODEKIAlzZWxlY3QgRFZCX1REQTgwODMKIAlzZWxlY3QgRFZCX1REQTEwMDIxCisJc2VsZWN0IERWQl9TNUgxNDIwCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApAQCAtMTE5LDkgKzEyMCw5IEBACiAJc2VsZWN0IERWQl9WRVMxWDkzCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJaGVscAotCSAgU3VwcG9ydCBmb3IgQnVkZ2V0IFBhdGNoIChmdWxsIFRTKSBtb2RpZmljYXRpb24gb24gCisJICBTdXBwb3J0IGZvciBCdWRnZXQgUGF0Y2ggKGZ1bGwgVFMpIG1vZGlmaWNhdGlvbiBvbgogCSAgU0FBNzE0NitBVjcxMTAgYmFzZWQgY2FyZHMgKERWQi1TIGNhcmRzKS4gVGhpcwotCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlIAorCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlCiAJICBjYXJkIGlzIGRyaXZlbiBpbiBCdWRnZXQtb25seSBtb2RlLiBDYXJkIGlzCiAJICByZXF1aXJlZCB0byBoYXZlIGxvYWRlZCBmaXJtd2FyZSB0byB0dW5lIHByb3Blcmx5LgogCSAgRmlybXdhcmUgY2FuIGJlIGxvYWRlZCBieSBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggOGUzM2E4NS4uZTRjNmU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTExNiwxMyArMTE2LDE4IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfYXY3MTEwX2F2KHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gYXY3MTEwLT5kZXY7CiAKIAkvKiBzZXQgaW50ZXJuYWwgdm9sdW1lIGNvbnRyb2wgdG8gbWF4aW11bSAqLwogCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfVEk7Ci0JYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgaW50ZXJuYWwgdm9sdW1lIHRvIG1heGltdW06JWRcbiIscmV0KTsKIAotCWF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCXJldCA9IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCWlmIChyZXQgPCAwKQorCQlwcmludGsoImR2Yi10dHBjaTpjYW5ub3Qgc2V0IHZpZGVvIG1vZGU6JWRcbiIscmV0KTsKIAogCS8qIGhhbmRsZSBkaWZmZXJlbnQgY2FyZCB0eXBlcyAqLwogCS8qIHJlbWFpbmluZyBpbml0cyBhY2NvcmRpbmcgdG8gY2FyZCBhbmQgZnJvbnRlbmQgdHlwZSAqLwpAQCAtMTU2LDggKzE2MSwxMiBAQAogCiAJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX05PTkUgfHwgYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTVNQKSB7CiAJCS8vIHN3aXRjaCBEVkIgU0NBUlQgb24KLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIE1haW5Td2l0Y2gsIDEsIDApOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgTWFpblN3aXRjaCwgMSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHN3aXRjaCBvbiBTQ0FSVChNYWluKTolZFxuIixyZXQpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzd2l0Y2ggb24gU0NBUlQoQUQpOiVkXG4iLHJldCk7CiAJCWlmIChyZ2Jfb24gJiYKIAkJICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTEwYSkgJiYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDAwKSkgewogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMSwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gUkdCIG9uLCBTQ0FSVCBwaW4gMTYKQEAgLTE2NSw4ICsxNzQsMTIgQEAKIAkJfQogCX0KIAotCWF2NzExMF9zZXRfdm9sdW1lKGF2NzExMCwgYXY3MTEwLT5taXhlci52b2x1bWVfbGVmdCwgYXY3MTEwLT5taXhlci52b2x1bWVfcmlnaHQpOwotCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgdm9sdW1lIDolZFxuIixyZXQpOworCXJldCA9IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXR1cCBpcmMgY29uZmlnIDolZFxuIixyZXQpOwogfQogCiBzdGF0aWMgdm9pZCByZWNvdmVyX2FybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApCkBAIC0yNTgsOCArMjcxLDkgQEAKICAqCiAgKiAgSWYgd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbnRyb2xzIHdlIHdvdWxkIGhhdmUgdG8gZG8gbXVjaCBtb3JlLi4uCiAgKi8KLXZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJfY29uZmlnKQoraW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKIHsKKwlpbnQgcmV0ID0gMDsKIAlzdGF0aWMgc3RydWN0IGF2NzExMCAqbGFzdDsKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwpAQCAtMjcwLDkgKzI4NCwxMCBAQAogCQlsYXN0ID0gYXY3MTEwOwogCiAJaWYgKGF2NzExMCkgewotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOwogCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgKCppcmNfaGFuZGxlcikodTMyKTsKQEAgLTc2NSwxMyArNzgwLDE0IEBACiAJCQkgICAgIHBjcnBpZCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCk7CiB9CiAKLXZvaWQgQ2hhbmdlUElEcyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB2cGlkLCB1MTYgYXBpZCwgdTE2IHR0cGlkLAoraW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJdTE2IHN1YnBpZCwgdTE2IHBjcnBpZCkKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+cGlkX211dGV4KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCEodnBpZCAmIDB4ODAwMCkpCiAJCWF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSA9IHZwaWQ7CkBAIC03ODYsMTAgKzgwMiwxMSBAQAogCiAJaWYgKGF2NzExMC0+ZmVfc3luY2VkKSB7CiAJCXBjcnBpZCA9IGF2NzExMC0+cGlkc1tETVhfUEVTX1BDUl07Ci0JCVNldFBJRHMoYXY3MTEwLCB2cGlkLCBhcGlkLCB0dHBpZCwgc3VicGlkLCBwY3JwaWQpOworCQlyZXQgPSBTZXRQSURzKGF2NzExMCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCwgcGNycGlkKTsKIAl9CiAKIAl1cCgmYXY3MTEwLT5waWRfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtODMyLDExICs4NDksMTMgQEAKIAlyZXQgPSBhdjcxMTBfZndfcmVxdWVzdChhdjcxMTAsIGJ1ZiwgMjAsICZoYW5kbGUsIDEpOwogCWlmIChyZXQgIT0gMCB8fCBoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCJkdmItdHRwY2k6ICVzIGVycm9yICBidWYgJTA0eCAlMDR4ICUwNHggJTA0eCAgIgotCQkJCSJyZXQgJXggIGhhbmRsZSAlMDR4XG4iLAorCQkJCSJyZXQgJWQgIGhhbmRsZSAlMDR4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQkJCXJldCwgaGFuZGxlKTsKIAkJZHZiZG14ZmlsdGVyLT5od19oYW5kbGUgPSAweGZmZmY7Ci0JCXJldHVybiAtMTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtMTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IGR2YmRteGZpbHRlcjsKQEAgLTg1OSw3ICs4NzgsNyBAQAogCWlmIChoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCIlcyB0cmllZCB0byBzdG9wIGludmFsaWQgZmlsdGVyICUwNHgsIGZpbHRlciB0eXBlID0gJXhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBoYW5kbGUsIGR2YmRteGZpbHRlci0+dHlwZSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IE5VTEw7CkBAIC04NzMsMTggKzg5MiwyMCBAQAogCQkJCSJyZXNwICUwNHggJTA0eCAgcGlkICVkXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgcmV0LAogCQkJCWFuc3dbMF0sIGFuc3dbMV0sIGR2YmRteGZpbHRlci0+ZmVlZC0+cGlkKTsKLQkJcmV0ID0gLTE7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLTE7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKIAotc3RhdGljIHZvaWQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKSBkdmJkbXgtPnByaXY7CiAJdTE2ICpwaWQgPSBkdmJkbXgtPnBpZHMsIG5waWRzWzVdOwogCWludCBpOworCWludCByZXQgPSAwOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKQEAgLTg5MywzNiArOTE0LDQ5IEBACiAJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCWlmICgoaSA9PSAyKSAmJiBucGlkc1tpXSAmJiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkpIHsKIAkJbnBpZHNbaV0gPSAwOwotCQlDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKLQkJU3RhcnRIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOwotCQlyZXR1cm47CisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZHZiZG14ZmVlZC0+ZmlsdGVyKTsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkKLQkJQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDwgMiAmJiBucGlkc1swXSkKIAkJaWYgKGF2NzExMC0+ZmVfc3luY2VkKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJeworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJaWYgKChkdmJkbXhmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSkgewogCQlpZiAoZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gMCAmJiAhKGR2YmRteC0+cGlkc1swXSAmIDB4ODAwMCkpCi0JCQlhdjcxMTBfYXZfc3RhcnRfcmVjb3JkKGF2NzExMCwgUlBfQVVESU8sIGR2YmRteGZlZWQpOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX0FVRElPLCBkdmJkbXhmZWVkKTsKIAkJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlID09IDEgJiYgIShkdmJkbXgtPnBpZHNbMV0gJiAweDgwMDApKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX1ZJREVPLCBkdmJkbXhmZWVkKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoYXY3MTEwLCBSUF9WSURFTywgZHZiZG14ZmVlZCk7CiAJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGR2Yl9mZWVkX3N0b3BfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RvcF9waWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopIGR2YmRteC0+cHJpdjsKIAl1MTYgKnBpZCA9IGR2YmRteC0+cGlkcywgbnBpZHNbNV07CiAJaW50IGk7CiAKKwlpbnQgcmV0ID0gMDsKKwogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDEpIHsKLQkJYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWlmICghYXY3MTEwLT5yZWNfbW9kZSkKIAkJCWR2YmRteC0+cmVjb3JkaW5nID0gMDsKIAkJaWYgKCFhdjcxMTAtPnBsYXlpbmcpCkBAIC05MzMsMjQgKzk2NywyNyBAQAogCXN3aXRjaCAoaSkgewogCWNhc2UgMjogLy90ZWxldGV4dAogCQlpZiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkKLQkJCVN0b3BIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOworCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGR2YmRteGZlZWQtPmZpbHRlcik7CiAJCW5waWRzWzJdID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAwOgogCWNhc2UgMToKIAljYXNlIDQ6CiAJCWlmICghcGlkc19vZmYpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCQlicmVhazsKIAl9Ci0JQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKCFyZXQpCisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gZGVtdXgtPnByaXY7CisJaW50IHJldCA9IDA7CiAKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtOTcxLDIxICsxMDA4LDIyIEBACiAJCQkJCSAgICEoZGVtdXgtPnBpZHNbMV0gJiAweDgwMDApKSB7CiAJCQkJCSAgICAgICBkdmJfcmluZ2J1ZmZlcl9mbHVzaF9zcGlubG9ja193YWtldXAoJmF2NzExMC0+YXZvdXQpOwogCQkJCQkgICAgICAgZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwotCQkJCQkgICAgICAgYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLFJQX0FWKTsKLQkJCQkJICAgICAgIGRlbXV4LT5wbGF5aW5nID0gMTsKKwkJCQkJICAgICAgIHJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCxSUF9BVik7CisJCQkJCSAgICAgICBpZiAoIXJldCkKKwkJCQkJCSAgICAgICBkZW11eC0+cGxheWluZyA9IDE7CiAJCQkJCX0KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJZHZiX2ZlZWRfc3RhcnRfcGlkKGZlZWQpOworCQkJCXJldCA9IGR2Yl9mZWVkX3N0YXJ0X3BpZChmZWVkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIGlmICgoZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkgJiYKIAkJCSAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpIHsKLQkJCVN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKIAkJfQogCX0KIAotCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgeworCWVsc2UgaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKQEAgLTk5NiwxMiArMTAzNCwxNSBAQAogCQkJaWYgKGRlbXV4LT5maWx0ZXJbaV0uZmlsdGVyLnBhcmVudCAhPSAmZmVlZC0+ZmVlZC5zZWMpCiAJCQkJY29udGludWU7CiAJCQlkZW11eC0+ZmlsdGVyW2ldLnN0YXRlID0gRE1YX1NUQVRFX0dPOwotCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKQotCQkJCVN0YXJ0SFdGaWx0ZXIoJmRlbXV4LT5maWx0ZXJbaV0pOworCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJcmV0ID0gU3RhcnRIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwMDksNyArMTA1MCw3IEBACiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSBkZW11eC0+cHJpdjsKLQorCWludCBpLCByYywgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1RTKSB7CkBAIC0xMDIyLDI2ICsxMDYzLDI5IEBACiAJCX0KIAkJaWYgKGZlZWQtPnRzX3R5cGUgJiBUU19ERUNPREVSICYmCiAJCSAgICBmZWVkLT5wZXNfdHlwZSA8IERNWF9UU19QRVNfT1RIRVIpIHsKLQkJCWR2Yl9mZWVkX3N0b3BfcGlkKGZlZWQpOworCQkJcmV0ID0gZHZiX2ZlZWRfc3RvcF9waWQoZmVlZCk7CiAJCX0gZWxzZQogCQkJaWYgKChmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSAmJgogCQkJICAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpCi0JCQkJU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CisJCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CiAJfQogCi0JaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKQorCWlmICghcmV0ICYmIGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CisJCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKSB7CiAJCQlpZiAoZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9PSBETVhfU1RBVEVfR08gJiYKIAkJCSAgICBkZW11eC0+ZmlsdGVyW2ldLmZpbHRlci5wYXJlbnQgPT0gJmZlZWQtPmZlZWQuc2VjKSB7CiAJCQkJZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9IERNWF9TVEFURV9SRUFEWTsKLQkJCQlpZiAoZGVtdXgtPmRteC5mcm9udGVuZC0+c291cmNlICE9IERNWF9NRU1PUllfRkUpCi0JCQkJCVN0b3BIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJCXJjID0gU3RvcEhXRmlsdGVyKCZkZW11eC0+ZmlsdGVyW2ldKTsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSByYzsKKwkJCQkJLyoga2VlcCBnb2luZywgc3RvcCBhcyBtYW55IGZpbHRlcnMgYXMgcG9zc2libGUgKi8KKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwOTMsNyArMTEzNyw3IEBACiAJcmV0ID0gYXY3MTEwX2Z3X3JlcXVlc3QoYXY3MTEwLCAmdGFnLCAwLCBmd3N0YywgNCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdjcxMTBfZndfcmVxdWVzdCBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAJfQogCWRwcmludGsoMiwgImZ3c3RjID0gJTA0aHggJTA0aHggJTA0aHggJTA0aHhcbiIsCiAJCWZ3c3RjWzBdLCBmd3N0Y1sxXSwgZndzdGNbMl0sIGZ3c3RjWzNdKTsKQEAgLTExMTksMTggKzExNjMsMTQgQEAKIAogCXN3aXRjaCAodG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT046Ci0JCVNldDIySyhhdjcxMTAsIDEpOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDEpOwogCiAJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCVNldDIySyhhdjcxMTAsIDApOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDApOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0xMTM4LDkgKzExNzgsNyBAQAogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZGlzZXFjX3NlbmQoYXY3MTEwLCBjbWQtPm1zZ19sZW4sIGNtZC0+bXNnLCAtMSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXY3MTEwX2Rpc2VxY19zZW5kKGF2NzExMCwgY21kLT5tc2dfbGVuLCBjbWQtPm1zZywgLTEpOwogfQogCiBzdGF0aWMgaW50IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKQEAgLTExNDgsOSArMTE4Niw3IEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwogfQogCiAvKiBzaW1wbGlmaWVkIGNvZGUgZnJvbSBidWRnZXQtY29yZS5jICovCkBAIC0xOTkyLDc2ICsyMDI4LDg1IEBACiAKIAogCi1zdGF0aWMgdm9pZCBhdjcxMTBfZmVfbG9ja19maXgoc3RydWN0IGF2NzExMCogYXY3MTEwLCBmZV9zdGF0dXNfdCBzdGF0dXMpCitzdGF0aWMgaW50IGF2NzExMF9mZV9sb2NrX2ZpeChzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAsIGZlX3N0YXR1c190IHN0YXR1cykKIHsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgc3luY2VkID0gKHN0YXR1cyAmIEZFX0hBU19MT0NLKSA/IDEgOiAwOwogCiAJYXY3MTEwLT5mZV9zdGF0dXMgPSBzdGF0dXM7CiAKIAlpZiAoYXY3MTEwLT5mZV9zeW5jZWQgPT0gc3luY2VkKQotCQlyZXR1cm47Ci0KLQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoYXY3MTEwLT5wbGF5aW5nKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5waWRfbXV0ZXgpKQotCQlyZXR1cm47CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlpZiAoYXY3MTEwLT5mZV9zeW5jZWQpIHsKLQkJU2V0UElEcyhhdjcxMTAsIGF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSwKKwlpZiAoc3luY2VkKSB7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19BVURJT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19URUxFVEVYVF0sIDAsCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19QQ1JdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNjYW4sIDApOwogCX0gZWxzZSB7Ci0JCVNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElEX0ZJTFRFUiwgRmx1c2hUU1F1ZXVlLCAwKTsKLQkJYXY3MTEwX3dhaXRfbXNnc3RhdGUoYXY3MTEwLCBHUE1RQnVzeSk7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJRF9GSUxURVIsIEZsdXNoVFNRdWV1ZSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBhdjcxMTBfd2FpdF9tc2dzdGF0ZShhdjcxMTAsIEdQTVFCdXN5KTsKKwkJfQogCX0KIAorCWlmICghcmV0KQorCQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwogCXVwKCZhdjcxMTAtPnBpZF9tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX3NldF9mcm9udGVuZChmZSwgcGFyYW1zKTsKKworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfZnJvbnRlbmQoZmUsIHBhcmFtcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfaW5pdChmZSk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2luaXQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7Ci0JaW50IHJldDsKIAogCS8qIGNhbGwgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24gKi8KLQlyZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKSB7Ci0JCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsICpzdGF0dXMpOwotCX0KLQotCXJldHVybiAwOworCWludCByZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOworCWlmICghcmV0KQorCQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKQorCQkJcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgKnN0YXR1cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3Jlc2V0X292ZXJsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKLQlyZXR1cm4gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0yMDY5LDQwICsyMTE0LDUwIEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX2J1cnN0KGZlLCBtaW5pY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzZXFjX3NlbmRfYnVyc3QoZmUsIG1pbmljbWQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3RvbmUoZmUsIHRvbmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdG9uZShmZSwgdG9uZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdm9sdGFnZShmZSwgdm9sdGFnZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IGF2NzExMCogYXY3MTEwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAppbmRleCA0ZjY5YjRkLi41MDhiNzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaApAQCAtMTE5LDggKzExOSw3IEBACiAJdm9sYXRpbGUgaW50CQlibXBfc3RhdGU7CiAjZGVmaW5lIEJNUF9OT05FICAgICAwCiAjZGVmaW5lIEJNUF9MT0FESU5HICAxCi0jZGVmaW5lIEJNUF9MT0FESU5HUyAyCi0jZGVmaW5lIEJNUF9MT0FERUQgICAzCisjZGVmaW5lIEJNUF9MT0FERUQgICAyCiAJd2FpdF9xdWV1ZV9oZWFkX3QJYm1wcTsKIAogCkBAIC0yNTUsMTIgKzI1NCwxMiBAQAogfTsKIAogCi1leHRlcm4gdm9pZCBDaGFuZ2VQSURzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHZwaWQsIHUxNiBhcGlkLCB1MTYgdHRwaWQsCitleHRlcm4gaW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJICAgICAgIHUxNiBzdWJwaWQsIHUxNiBwY3JwaWQpOwogCiBleHRlcm4gdm9pZCBhdjcxMTBfcmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwogZXh0ZXJuIHZvaWQgYXY3MTEwX3VucmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcgKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZyk7CitleHRlcm4gaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnIChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcl9jb25maWcpOwogCiBleHRlcm4gaW50IGF2NzExMF9pcl9pbml0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGF2NzExMF9pcl9leGl0ICh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggY2NmOTQ2MS4uMDY5NmE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsICwgZHZiX2RlbXV4X2ZlZWQ6JXBcbiIsIGF2NzExMCwgZHZiZG14ZmVlZCk7CkBAIC0xMzcsNyArMTM4LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMF0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzBdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfVklERU86CkBAIC0xNDUsNyArMTQ2LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMV0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzFdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBWaWRlb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfQVY6CkBAIC0xNTcsMTQgKzE1OCwxNSBAQAogCQkJCSAgICAgICBkdmJkbXgtPnBlc2ZpbHRlclsxXS0+cGlkLAogCQkJCSAgICAgICBkdmJfZmlsdGVyX3BlczJ0c19jYiwKIAkJCQkgICAgICAgKHZvaWQgKikgZHZiZG14LT5wZXNmaWx0ZXJbMV0pOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEFWX1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBhdjcxMTBfYXZfc3RhcnRfcGxheShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdikKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKIAogCWlmIChhdjcxMTAtPnJlY19tb2RlKQpAQCAtMTgyLDU0ICsxODQsNTcgQEAKIAlhdjcxMTAtPnBsYXlpbmcgfD0gYXY7CiAJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAljYXNlIFJQX0FVRElPOgotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBSUF9WSURFTzoKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBWaWRlb1BFUywgMCk7CiAJCWF2NzExMC0+c2luZm8gPSAwOwogCQlicmVhazsKIAljYXNlIFJQX0FWOgogCQlhdjcxMTAtPnNpbmZvID0gMDsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBhdjcxMTAtPnBsYXlpbmc7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+cGxheWluZzsKKwlyZXR1cm4gcmV0OwogfQogCi12b2lkIGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQoraW50IGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQogeworCWludCByZXQgPSAwOwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKCEoYXY3MTEwLT5wbGF5aW5nICYgYXYpICYmICEoYXY3MTEwLT5yZWNfbW9kZSAmIGF2KSkKLQkJcmV0dXJuOwotCisJCXJldHVybiAwOwogCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1N0b3AsIDApOwogCWlmIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJYXY3MTEwLT5wbGF5aW5nICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJY2FzZSBSUF9BVURJTzoKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFJQX1ZJREVPOgotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKLQkJCWF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIGF2NzExMC0+dmlkbW9kZSk7CisJCQlyZXQgPSBhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBhdjcxMTAtPnZpZG1vZGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewogCQlhdjcxMTAtPnJlY19tb2RlICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnJlY19tb2RlKSB7CiAJCWNhc2UgUlBfQVVESU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfVklERU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIFZpZGVvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKIAkJCWJyZWFrOwogCQl9CiAJfQorCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzE3LDE5ICszMjIsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK2ludCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKIHsKKwlpbnQgcmV0OwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCi0JYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfRU5DT0RFUiwgTG9hZFZpZENvZGUsIDEsIG1vZGUpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIExvYWRWaWRDb2RlLCAxLCBtb2RlKTsKIAotCWlmICghYXY3MTEwLT5wbGF5aW5nKSB7Ci0JCUNoYW5nZVBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCisJaWYgKCFyZXQgJiYgIWF2NzExMC0+cGxheWluZykgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfVklERU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfQVVESU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfVEVMRVRFWFRdLAogCQkJICAgMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfUENSXSk7Ci0JCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJREZJTFRFUiwgU2NhbiwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC0zNDAsMTcgKzM0OCwxOCBAQAogCVZJREVPX01PREVfUEFMLCBWSURFT19NT0RFX1BBTCwgVklERU9fTU9ERV9QQUwsIFZJREVPX01PREVfUEFMLAogfTsKIAotc3RhdGljIHZvaWQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKIHsKIAlpbnQgaTsKIAlpbnQgaHNpemUsIHZzaXplOwogCWludCBzdzsKIAl1OCAqcDsKKwlpbnQgcmV0ID0gMDsKIAogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKGF2NzExMC0+c2luZm8pCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJZm9yIChpID0gNzsgaSA8IGNvdW50IC0gMTA7IGkrKykgewogCQlwID0gYnVmICsgaTsKIAkJaWYgKHBbMF0gfHwgcFsxXSB8fCBwWzJdICE9IDB4MDEgfHwgcFszXSAhPSAweGIzKQpAQCAtMzU5LDExICszNjgsMTQgQEAKIAkJaHNpemUgPSAoKHBbMV0gJjB4RjApID4+IDQpIHwgKHBbMF0gPDwgNCk7CiAJCXZzaXplID0gKChwWzFdICYweDBGKSA8PCA4KSB8IChwWzJdKTsKIAkJc3cgPSAocFszXSAmIDB4MEYpOwotCQlhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBzdzJtb2RlW3N3XSk7Ci0JCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKLQkJYXY3MTEwLT5zaW5mbyA9IDE7CisJCXJldCA9IGF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIHN3Mm1vZGVbc3ddKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKKwkJCWF2NzExMC0+c2luZm8gPSAxOworCQl9CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTk3NCw3ICs5ODYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpIHsKIAkJaWYgKCBjbWQgIT0gVklERU9fR0VUX1NUQVRVUyAmJiBjbWQgIT0gVklERU9fR0VUX0VWRU5UICYmCkBAIC05ODcsNDkgKzk5OSw1NyBAQAogCWNhc2UgVklERU9fU1RPUDoKIAkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19TVE9QUEVEOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gVklERU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfVklERU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9WSURFTyk7CiAJCWVsc2UKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TVE9QLAorCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsCiAJCQkgICAgICAgYXY3MTEwLT52aWRlb3N0YXRlLnZpZGVvX2JsYW5rID8gMCA6IDEpOwotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX05PTkU7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fUExBWToKIAkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPT0gVklERU9fRlJFRVpFRCkgewogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKIAkJfQogCiAJCWlmIChhdjcxMTAtPnZpZGVvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTUVNT1JZKSB7CiAJCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJYXY3MTEwLT5wbGF5aW5nICY9IH5SUF9WSURFTzsKIAkJCX0KLQkJCWF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQl9IGVsc2UgewotCQkJLy9hdjcxMTBfYXZfc3RvcChhdjcxMTAsIFJQX1ZJREVPKTsKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwogCQl9Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fRlJFRVpFOgogCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX0ZSRUVaRUQ7CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRlJFRVpFOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19GUkVFWkU7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19DT05USU5VRToKIAkJaWYgKGF2NzExMC0+cGxheWluZyAmIFJQX1ZJREVPKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOwotCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKLQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfTk9ORTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fU0VMRUNUX1NPVVJDRToKQEAgLTEwNDUsNyArMTA2NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19HRVRfRVZFTlQ6Ci0JCXJldD1kdmJfdmlkZW9fZ2V0X2V2ZW50KGF2NzExMCwgcGFyZywgZmlsZS0+Zl9mbGFncyk7CisJCXJldCA9IGR2Yl92aWRlb19nZXRfZXZlbnQoYXY3MTEwLCBwYXJnLCBmaWxlLT5mX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX0dFVF9TSVpFOgpAQCAtMTEwNSwyNSArMTEyNSwzMiBAQAogCWNhc2UgVklERU9fRkFTVF9GT1JXQVJEOgogCQkvL25vdGU6IGFyZyBpcyBpZ25vcmVkIGJ5IGZpcm13YXJlCiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCSAgICAgIF9fU2Nhbl9JLCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1NjYW5fSSwgMiwgQVZfUEVTLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRkFTVDsKLQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7CisJCWlmICghcmV0KSB7CisJCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX0ZBU1Q7CisJCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX1BMQVlJTkc7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX1NMT1dNT1RJT046CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcmUlBfVklERU8pIHsKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1Nsb3csIDIsIDAsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19TbG93LCAyLCAwLCAwKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQl9IGVsc2UgewotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU0xPVywgYXJnKTsKIAkJfQotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX1NMT1c7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfU0xPVzsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fR0VUX0NBUEFCSUxJVElFUzoKQEAgLTExMzYsMTggKzExNjMsMjEgQEAKIAkJYXY3MTEwX2lwYWNrX3Jlc2V0KCZhdjcxMTAtPmlwYWNrWzFdKTsKIAogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkgICAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKKwkJCQkJICAgIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfRkFTVCkKLQkJCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkJICAgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCQkgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfU0xPVykgewotCQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCQkgICAgICBfX1Nsb3csIDIsIDAsIDApOwotCQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOworCQkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAorCQkJCQkJICAgIF9fU2xvdywgMiwgMCwgMCk7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQkJfQogCQkJaWYgKGF2NzExMC0+dHJpY2ttb2RlID09IFRSSUNLX0ZSRUVaRSkKLQkJCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMSk7CisJCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMTcwLDcgKzEyMDAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSAmJgogCSAgICAoY21kICE9IEFVRElPX0dFVF9TVEFUVVMpKQpAQCAtMTE3OSwyOCArMTIwOSwzMiBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBBVURJT19TVE9QOgogCQlpZiAoYXY3MTEwLT5hdWRpb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gQVVESU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfQVVESU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9BVURJTyk7CiAJCWVsc2UKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLnBsYXlfc3RhdGUgPSBBVURJT19TVE9QUEVEOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fU1RPUFBFRDsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1BMQVk6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTUVNT1JZKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLCBSUF9BVURJTyk7Ci0JCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CisJCQlyZXQgPSBhdjcxMTBfYXZfc3RhcnRfcGxheShhdjcxMTAsIFJQX0FVRElPKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdWRjb20oYXY3MTEwLCBBVURJT19DTURfVU5NVVRFKTsKKwkJaWYgKCFyZXQpCisJCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CiAJCWJyZWFrOwogCiAJY2FzZSBBVURJT19QQVVTRToKLQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BBVVNFRDsKKwkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUEFVU0VEOwogCQlicmVhazsKIAogCWNhc2UgQVVESU9fQ09OVElOVUU6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9PSBBVURJT19QQVVTRUQpIHsKIAkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUExBWUlORzsKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFIHwgQVVESU9fQ01EX1BDTTE2KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUgfCBBVURJT19DTURfUENNMTYpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMjEwLDE0ICsxMjQ0LDE1IEBACiAKIAljYXNlIEFVRElPX1NFVF9NVVRFOgogCXsKLQkJYXVkY29tKGF2NzExMCwgYXJnID8gQVVESU9fQ01EX01VVEUgOiBBVURJT19DTURfVU5NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9NVVRFIDogQVVESU9fQ01EX1VOTVVURSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgQVVESU9fU0VUX0FWX1NZTkM6CiAJCWF2NzExMC0+YXVkaW9zdGF0ZS5BVl9zeW5jX3N0YXRlID0gKGludCkgYXJnOwotCQlhdWRjb20oYXY3MTEwLCBhcmcgPyBBVURJT19DTURfU1lOQ19PTiA6IEFVRElPX0NNRF9TWU5DX09GRik7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9TWU5DX09OIDogQVVESU9fQ01EX1NZTkNfT0ZGKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1NFVF9CWVBBU1NfTU9ERToKQEAgLTEyMjksMjEgKzEyNjQsMjQgQEAKIAogCQlzd2l0Y2goYXY3MTEwLT5hdWRpb3N0YXRlLmNoYW5uZWxfc2VsZWN0KSB7CiAJCWNhc2UgQVVESU9fU1RFUkVPOgotCQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX1NURVJFTyk7Ci0JCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKLQkJCQlpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAyLCAweDQ5KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9TVEVSRU8pOworCQkJaWYgKCFyZXQpCisJCQkJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX0NSWVNUQUwpCisJCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVURJT19NT05PX0xFRlQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19MKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NGEpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fTCk7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFVRElPX01PTk9fUklHSFQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19SKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDUpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fUik7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0NSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTI2NCw4ICsxMzAyLDggQEAKIAkJZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwogCQlhdjcxMTBfaXBhY2tfcmVzZXQoJmF2NzExMC0+aXBhY2tbMF0pOwogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCi0JCQkgICAgICAgX19QbGF5LCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CiAJCWJyZWFrOwogCWNhc2UgQVVESU9fU0VUX0lEOgogCkBAIC0xMjc0LDcgKzEzMTIsNyBAQAogCXsKIAkJc3RydWN0IGF1ZGlvX21peGVyICphbWl4ID0gKHN0cnVjdCBhdWRpb19taXhlciAqKXBhcmc7CiAKLQkJYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKKwkJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgQVVESU9fU0VUX1NUUkVBTVRZUEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCmluZGV4IGNjNWU3YTcuLjQ1ZGMxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCkBAIC0zLDE0ICszLDE0IEBACiAKIHN0cnVjdCBhdjcxMTA7CiAKLWV4dGVybiB2b2lkIGF2NzExMF9zZXRfdmlkbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKTsKK2V4dGVybiBpbnQgYXY3MTEwX3NldF92aWRtb2RlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IG1vZGUpOwogCiBleHRlcm4gaW50IGF2NzExMF9yZWNvcmRfY2Ioc3RydWN0IGR2Yl9maWx0ZXJfcGVzMnRzICpwMnQsIHU4ICpidWYsIHNpemVfdCBsZW4pOwogZXh0ZXJuIGludCBhdjcxMTBfcGVzX3BsYXkodm9pZCAqZGVzdCwgc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpidWYsIGludCBkbGVuKTsKIGV4dGVybiBpbnQgYXY3MTEwX3dyaXRlX3RvX2RlY29kZXIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKIAogZXh0ZXJuIGludCBhdjcxMTBfc2V0X3ZvbHVtZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCB2b2xsZWZ0LCBpbnQgdm9scmlnaHQpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX2F2X3N0b3Aoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYpOworZXh0ZXJuIGludCBhdjcxMTBfYXZfc3RvcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdik7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCk7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9wbGF5KHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKaW5kZXggN2ZhNGEwZS4uMTIyMDgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCXVkZWxheSg1KTsKIAl9Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRVRJTUVET1VUOwogfQogCiBzdGF0aWMgaW50IGxvYWRfZHJhbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiAqZGF0YSwgaW50IGxlbikKQEAgLTE1NSw3ICsxNTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBibG9ja3M7IGkrKykgewogCQlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQlVGRkVSX0VNUFRZKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogdGltZW91dCBhdCBibG9jayAlZFxuIiwgaSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlkcHJpbnRrKDQsICJ3cml0aW5nIERSQU0gYmxvY2sgJWRcbiIsIGkpOwogCQltd2RlYmkoYXY3MTEwLCBERUJJU1dBQiwgYm9vdGJsb2NrLApAQCAtMTcwLDcgKzE3MCw3IEBACiAJaWYgKHJlc3QgPiAwKSB7CiAJCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGxvYWRfZHJhbSgpOiB0aW1lb3V0IGF0IGxhc3QgYmxvY2tcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJaWYgKHJlc3QgPiA0KQogCQkJbXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIGJvb3RibG9jaywKQEAgLTE4NSwxMyArMTg1LDEzIEBACiAJfQogCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYWZ0ZXIgbGFzdCBibG9ja1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU0laRSwgMCwgMik7CiAJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9GVUxMLCAyKTsKIAlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQk9PVF9DT01QTEVURSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogZmluYWwgaGFuZHNoYWtlIHRpbWVvdXRcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogCWlmIChzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShhdjcxMTAtPmRldiwgMSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9ib290YXJtKCk6ICIKIAkJICAgICAgICJzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZSgpIHRpbWVkIG91dFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbWRlbGF5KDEpOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJaWYgKHNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKGF2NzExMC0+ZGV2LCAxKSkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX2Jvb3Rhcm0oKTogIgogCQkgICAgICAgInNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKCkgdGltZWQgb3V0IGFmdGVyIGxvYWRpbmcgRFJBTVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbXNsZWVwKDMwKTsJLyogdGhlIGZpcm13YXJlIG5lZWRzIHNvbWUgdGltZSB0byBpbml0aWFsaXplICovCkBAIC0zMDgsNiArMzA4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXUzMiBzdGF0OworCWludCBlcnI7CiAKIAlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDw9IDB4MjYxYykgewogCQkvKiBub3Qgc3VwcG9ydGVkIGJ5IG9sZCBmaXJtd2FyZSAqLwpAQCAtMzE4LDE3ICszMTksMTcgQEAKIAkvKiBuZXcgZmlybXdhcmUgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJZm9yICg7OykgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSk7CiAJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+ZGNvbWxvY2spKQogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJc3RhdCA9IHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgTVNHU1RBVEUsIDAsIDIpOwogCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKSB7CisJCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIE1TR1NUQVRFICUwNHhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBzdGF0ICYgZmxhZ3MpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJbXNsZWVwKDEpOwogCX0KQEAgLTM0Miw2ICszNDMsNyBAQAogCWNoYXIgKnR5cGUgPSBOVUxMOwogCXUxNiBmbGFnc1syXSA9IHswLCAwfTsKIAl1MzIgc3RhdDsKKwlpbnQgZXJyOwogCiAvLwlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtMzUxLDI0ICszNTMsMzAgQEAKIAl9CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIGlkbGVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCiAJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHhmZmZmLCAyKTsKIAogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSkpIHsKKwl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfU0hBS0UpOworCQlpZiAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiAlcygpOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2VuZGlmCiAKQEAgLTQwMSw2ICs0MDksNyBAQAogCQkvKiBub24taW1tZWRpYXRlIENPTU1BTkQgdHlwZSAqLwogCQlzdGFydCA9IGppZmZpZXM7CiAJCWZvciAoOzspIHsKKwkJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKIAkJCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKIAkJCWlmIChzdGF0ICYgZmxhZ3NbMF0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBRVUVVRSBvdmVyZmxvd1xuIiwKQEAgLTQwOSwxMCArNDE4LDEwIEBACiAJCQl9CiAJCQlpZiAoKHN0YXQgJiBmbGFnc1sxXSkgPT0gMCkKIAkJCQlicmVhazsKLQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSkpIHsKKwkJCWlmIChlcnIpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgb24gYnVzeSAlcyBRVUVVRVxuIiwKIAkJCQkJX19GVU5DVElPTl9fLCB0eXBlKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCQl9CiAJCQltc2xlZXAoMSk7CiAJCX0KQEAgLTQzMiwxMyArNDQxLDE2IEBACiAKICNpZmRlZiBDT01fREVCVUcKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQ09NTUFORCB0byBjb21wbGV0ZVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EICVkIHRvIGNvbXBsZXRlXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgKGJ1ZlswXSA+PiA4KSAmIDB4ZmYpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KIAogCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKQEAgLTQ3MCw3ICs0ODIsNyBAQAogCiAJcmV0ID0gX19hdjcxMTBfc2VuZF9md19jbWQoYXY3MTEwLCBidWYsIGxlbmd0aCk7CiAJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQhPS1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IGF2NzExMF9zZW5kX2Z3X2NtZCBlcnJvciAlZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDk1LDcgKzUwNyw3IEBACiAJfQogCiAJcmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCBudW0gKyAyKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9md19jbWQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUxOCw3ICs1MzAsNyBAQAogCX0KIAogCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNtZCwgMTgpOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX3NlbmRfY2lfY21kIGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC01NTEsMjYgKzU2MywzMiBAQAogCX0KIAogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01NQU5ELCAwLCAyKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIENPTU1BTkQgdG8gY29tcGxldGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQogI2lmZGVmIF9OT0hBTkRTSEFLRQogCQltc2xlZXAoMSk7CiAjZW5kaWYKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIHRvIGNvbXBsZXRlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOwotCQl9CiAJfQogCiAjaWZuZGVmIF9OT0hBTkRTSEFLRQogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyICkpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBIQU5EU0hBS0VfUkVHXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KICNlbmRpZgogCkBAIC02NjcsMTAgKzY4NSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJYnVmW2kgKyA0XSA9IG1zZ1tpXTsKIAotCWlmICgocmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCAxOCkpKQorCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGJ1ZiwgMTgpOworCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBhdjcxMTBfZGlzZXFjX3NlbmQgZXJyb3IgJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTcwNSwxOCArNzIzLDIyIEBACiBzdGF0aWMgaW50IEZsdXNoVGV4dChzdHJ1Y3QgYXY3MTEwICphdjcxMTApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5kY29tbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJc3RhcnQgPSBqaWZmaWVzOwotCXdoaWxlIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9PU0QpKSB7CisJd2hpbGUgKDEpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTczMywyNSArNzU1LDMxIEBACiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCkpIHsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfT1NEKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCXJldCA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fKTsKIAkJCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CisJCW1zbGVlcCgxKTsKIAl9CiAjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC8gMjsgaSsrKQpAQCAtNzYxLDcgKzc4OSw3IEBACiAJCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSArIGkgKiAyLCAwLCAyKTsKIAlyZXQgPSBfX2F2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNidWYsIDUpOwogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBXcml0ZVRleHQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxNiw5ICs4NDQsMjUgQEAKIAlPU0RfQklUTUFQMSwgT1NEX0JJVE1BUDIsIDAsIE9TRF9CSVRNQVA0LCAwLCAwLCAwLCBPU0RfQklUTUFQOAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgTG9hZEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiBmb3JtYXQsCitzdGF0aWMgaW5saW5lIGludCBXYWl0VW50aWxCbXBMb2FkZWQoc3RydWN0IGF2NzExMCAqYXY3MTEwKQoreworCWludCByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdjcxMTAtPmJtcHEsCisJCQkJYXY3MTEwLT5ibXBfc3RhdGUgIT0gQk1QX0xPQURJTkcsIDEwKkhaKTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJcHJpbnRrKCJkdmItdHRwY2k6IHdhcm5pbmc6IHRpbWVvdXQgd2FpdGluZyBpbiBMb2FkQml0bWFwOiAlZCwgJWRcbiIsCisJCSAgICAgICByZXQsIGF2NzExMC0+Ym1wX3N0YXRlKTsKKwkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBMb2FkQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwKIAkJCSAgICAgdTE2IGR4LCB1MTYgZHksIGludCBpbmMsIHU4IF9fdXNlciAqIGRhdGEpCiB7CisJdTE2IGZvcm1hdDsKIAlpbnQgYnBwOwogCWludCBpOwogCWludCBkLCBkZWx0YTsKQEAgLTgyNywxNCArODcxLDcgQEAKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXY3MTEwLT5ibXBxLCBhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gTG9hZEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKLQl9Ci0JQlVHX09OIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORyk7CisJZm9ybWF0ID0gYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dOwogCiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTE9BRElORzsKIAlpZgkoZm9ybWF0ID09IE9TRF9CSVRNQVA4KSB7CkBAIC04NDcsMTggKzg4NCwxOCBAQAogCQlicHA9MTsgZGVsdGEgPSA4OwogCX0gZWxzZSB7CiAJCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWF2NzExMC0+Ym1wbGVuID0gKChkeCAqIGR5ICogYnBwICsgNykgJiB+NykgLyA4OwogCWF2NzExMC0+Ym1wcCA9IDA7CiAJaWYgKGF2NzExMC0+Ym1wbGVuID4gMzI3NjgpIHsKIAkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGR5OyBpKyspIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGF2NzExMC0+Ym1wYnVmICsgMTAyNCArIGkgKiBkeCwgZGF0YSArIGkgKiBpbmMsIGR4KSkgewogCQkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCWlmIChmb3JtYXQgIT0gT1NEX0JJVE1BUDgpIHsKQEAgLTg3MywzNyArOTEwLDI3IEBACiAJfQogCWF2NzExMC0+Ym1wbGVuICs9IDEwMjQ7CiAJZHByaW50ayg0LCAiYXY3MTEwX2Z3X2NtZDogTG9hZEJtcCBzaXplICVkXG4iLCBhdjcxMTAtPmJtcGxlbik7Ci0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCWlmICghcmV0KQorCQlyZXQgPSBXYWl0VW50aWxCbXBMb2FkZWQoYXY3MTEwKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IEJsaXRCaXRtYXAoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgd2luLCB1MTYgeCwgdTE2IHksIHUxNiB0cmFucykKK3N0YXRpYyBpbnQgQmxpdEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB4LCB1MTYgeSkKIHsKLQlpbnQgcmV0OwotCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlID09IEJNUF9OT05FKTsKLQotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF2NzExMC0+Ym1wcSwKLQkJCQlhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgMTAqSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gQmxpdEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAocmV0ID09IDApID8gLUVUSU1FRE9VVCA6IHJldDsKLQl9Ci0KLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlICE9IEJNUF9MT0FERUQpOwotCi0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgd2luLCB4LCB5LCB0cmFucyk7CisJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgYXY3MTEwLT5vc2R3aW4sIHgsIHksIDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBSZWxlYXNlQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAotCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEKQorCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEICYmIEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8IDB4MjYxZSkKIAkJcmV0dXJuIC0xOworCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORykKKwkJZHByaW50aygxLCJSZWxlYXNlQml0bWFwIGNhbGxlZCB3aGlsZSBCTVBfTE9BRElOR1xuIik7CiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfT1NELCBSZWxlYXNlQm1wLCAwKTsKIH0KQEAgLTkyNCwxOCArOTUxLDIyIEBACiAJcmV0dXJuIENyIHwgKENiIDw8IDE2KSB8IChZIDw8IDgpOwogfQogCi1zdGF0aWMgdm9pZCBPU0RTZXRDb2xvcihzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGNvbG9yLCB1OCByLCB1OCBnLCB1OCBiLCB1OCBibGVuZCkKK3N0YXRpYyBpbnQgT1NEU2V0Q29sb3Ioc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1OCBjb2xvciwgdTggciwgdTggZywgdTggYiwgdTggYmxlbmQpCiB7CisJaW50IHJldDsKKwogCXUxNiBjaCwgY2w7CiAJdTMyIHl1djsKIAogCXl1diA9IGJsZW5kID8gUkdCMllVVihyLGcsYikgOiAwOwogCWNsID0gKHl1diAmIDB4ZmZmZik7CiAJY2ggPSAoKHl1diA+PiAxNikgJiAweGZmZmYpOwotCVNldENvbG9yXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCi0JCSAgY29sb3IsIGNoLCBjbCk7Ci0JU2V0QmxlbmRfKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGJwcDJwYWxbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJICBjb2xvciwgKChibGVuZCA+PiA0KSAmIDB4MGYpKTsKKwlyZXQgPSBTZXRDb2xvcl8oYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgYnBwMnBhbFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAorCQkJY29sb3IsIGNoLCBjbCk7CisJaWYgKCFyZXQpCisJCXJldCA9IFNldEJsZW5kXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCisJCQkJY29sb3IsICgoYmxlbmQgPj4gNCkgJiAweDBmKSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBPU0RTZXRQYWxldHRlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIF9fdXNlciAqIGNvbG9ycywgdTggZmlyc3QsIHU4IGxhc3QpCkBAIC05NjgsMTQgKzk5OSwxNCBAQAogewogCXVpbnQgdywgaCwgYnBwLCBicGwsIHNpemUsIGxwYiwgYm51bSwgYnJlc3Q7CiAJaW50IGk7Ci0JaW50IHJjOworCWludCByYyxyZWxlYXNlX3JjOwogCiAJdyA9IHgxIC0geDAgKyAxOwogCWggPSB5MSAtIHkwICsgMTsKIAlpZiAoaW5jIDw9IDApCiAJCWluYyA9IHc7CiAJaWYgKHcgPD0gMCB8fCB3ID4gNzIwIHx8IGggPD0gMCB8fCBoID4gNTc2KQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCWJwcCA9IGF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSArIDE7CiAJYnBsID0gKCh3ICogYnBwICsgNykgJiB+NykgLyA4OwogCXNpemUgPSBoICogYnBsOwpAQCAtOTgzLDE3NiArMTAxNCwxODYgQEAKIAlibnVtID0gc2l6ZSAvIChscGIgKiBicGwpOwogCWJyZXN0ID0gc2l6ZSAtIGJudW0gKiBscGIgKiBicGw7CiAKKwlpZiAoYXY3MTEwLT5ibXBfc3RhdGUgPT0gQk1QX0xPQURJTkcpIHsKKwkJLyogcG9zc2libGUgaWYgc3lzY2FsbCBpcyByZXBlYXRlZCBieSAtRVJFU1RBUlRTWVMgYW5kIGlmIGZpcm13YXJlIGNhbm5vdCBhYm9ydCAqLworCQlCVUdfT04gKEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA+PSAweDI2MWUpOworCQlyYyA9IFdhaXRVbnRpbEJtcExvYWRlZChhdjcxMTApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCS8qIGp1c3QgY29udGludWUuIFRoaXMgc2hvdWxkIHdvcmsgZm9yIGFsbCBmdyB2ZXJzaW9ucworCQkgKiBpZiBibnVtPT0xICYmICFicmVzdCAmJiBMb2FkQml0bWFwIHdhcyBzdWNjZXNzZnVsCisJCSAqLworCX0KKworCXJjID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgYm51bTsgaSsrKSB7Ci0JCXJjID0gTG9hZEJpdG1hcChhdjcxMTAsIGJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJCSAgIHcsIGxwYiwgaW5jLCBkYXRhKTsKKwkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgdywgbHBiLCBpbmMsIGRhdGEpOwogCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCB4MCwgeTAgKyBpICogbHBiLCAwKTsKKwkJCWJyZWFrOworCQlyYyA9IEJsaXRCaXRtYXAoYXY3MTEwLCB4MCwgeTAgKyBpICogbHBiKTsKIAkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CiAJCWRhdGEgKz0gbHBiICogaW5jOwogCX0KLQlpZiAoYnJlc3QpIHsKLQkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAotCQkJICAgdywgYnJlc3QgLyBicGwsIGluYywgZGF0YSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJcmMgPSBCbGl0Qml0bWFwKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIHgwLCB5MCArIGJudW0gKiBscGIsIDApOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7CisJaWYgKCFyYyAmJiBicmVzdCkgeworCQlyYyA9IExvYWRCaXRtYXAoYXY3MTEwLCB3LCBicmVzdCAvIGJwbCwgaW5jLCBkYXRhKTsKKwkJaWYgKCFyYykKKwkJCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIHgwLCB5MCArIGJudW0gKiBscGIpOwogCX0KLQlSZWxlYXNlQml0bWFwKGF2NzExMCk7Ci0JcmV0dXJuIDA7CisJcmVsZWFzZV9yYyA9IFJlbGVhc2VCaXRtYXAoYXY3MTEwKTsKKwlpZiAoIXJjKQorCQlyYyA9IHJlbGVhc2VfcmM7CisJaWYgKHJjKQorCQlkcHJpbnRrKDEsInJldHVybnMgJWRcbiIscmMpOworCXJldHVybiByYzsKIH0KIAogaW50IGF2NzExMF9vc2RfY21kKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgb3NkX2NtZF90ICpkYykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhdjcxMTAtPm9zZF9zZW1hKTsKLQlpZiAocmV0KQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+b3NkX3NlbWEpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JLyogc3R1cGlkLCBidXQgT1NEIGZ1bmN0aW9ucyBkb24ndCBwcm92aWRlIGEgcmV0dXJuIGNvZGUgYW55d2F5ICovCi0JcmV0ID0gMDsKLQogCXN3aXRjaCAoZGMtPmNtZCkgewogCWNhc2UgT1NEX0Nsb3NlOgotCQlEZXN0cm95T1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRGVzdHJveU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlbjoKIAkJYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dID0gKGRjLT5jb2xvciAtIDEpICYgNzsKLQkJQ3JlYXRlT1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJCWJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKIAkJCQlkYy0+eDEgLSBkYy0+eDAgKyAxLCBkYy0+eTEgLSBkYy0+eTAgKyAxKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCQlpZiAoIWRjLT5kYXRhKSB7Ci0JCQlNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKLQkJCVNldENvbG9yQmxlbmQoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCQlyZXQgPSBNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TaG93OgotCQlNb3ZlV2luZG93UmVsKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd1JlbChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAwLCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfSGlkZToKLQkJSGlkZVdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKLQkJZ290byBvdXQ7CisJCXJldCA9IEhpZGVXaW5kb3coYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCWJyZWFrOwogCWNhc2UgT1NEX0NsZWFyOgotCQlEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgMCwgMCwgNzIwLCA1NzYsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfRmlsbDoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOworCQlicmVhazsKIAljYXNlIE9TRF9TZXRDb2xvcjoKLQkJT1NEU2V0Q29sb3IoYXY3MTEwLCBkYy0+Y29sb3IsIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEsIGRjLT55MSk7Ci0JCWdvdG8gb3V0OworCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfU2V0UGFsZXR0ZToKLQl7Ci0JCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KSB7CisJCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KQogCQkJcmV0ID0gT1NEU2V0UGFsZXR0ZShhdjcxMTAsIGRjLT5kYXRhLCBkYy0+Y29sb3IsIGRjLT54MCk7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKKwkJZWxzZSB7CiAJCQlpbnQgaSwgbGVuID0gZGMtPngwLWRjLT5jb2xvcisxOwogCQkJdTggX191c2VyICpjb2xvcnMgPSAodTggX191c2VyICopZGMtPmRhdGE7CiAJCQl1OCByLCBnLCBiLCBibGVuZDsKLQorCQkJcmV0ID0gMDsKIAkJCWZvciAoaSA9IDA7IGk8bGVuOyBpKyspIHsKIAkJCQlpZiAoZ2V0X3VzZXIociwgY29sb3JzICsgaSAqIDQpIHx8CiAJCQkJICAgIGdldF91c2VyKGcsIGNvbG9ycyArIGkgKiA0ICsgMSkgfHwKIAkJCQkgICAgZ2V0X3VzZXIoYiwgY29sb3JzICsgaSAqIDQgKyAyKSB8fAogCQkJCSAgICBnZXRfdXNlcihibGVuZCwgY29sb3JzICsgaSAqIDQgKyAzKSkgewogCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCQlnb3RvIG91dDsKKwkJCQkJYnJlYWs7CiAJCQkJICAgIH0KLQkJCQlPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JY2FzZSBPU0RfU2V0VHJhbnM6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRQaXhlbDoKLQkJRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKKwkJcmV0ID0gRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKIAkJCSBkYy0+eDAsIGRjLT55MCwgMCwgMCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfR2V0UGl4ZWw6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRSb3c6CiAJCWRjLT55MSA9IGRjLT55MDsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBPU0RfU2V0QmxvY2s6CiAJCXJldCA9IE9TRFNldEJsb2NrKGF2NzExMCwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxLCBkYy0+Y29sb3IsIGRjLT5kYXRhKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxSb3c6Ci0JCURyYXdCbG9jayhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCwKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAogCQkJICBkYy0+eDEtZGMtPngwKzEsIGRjLT55MSwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxCbG9jazoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAorCQlyZXQgPSBEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTAsCiAJCQkgIGRjLT54MSAtIGRjLT54MCArIDEsIGRjLT55MSAtIGRjLT55MCArIDEsIGRjLT5jb2xvcik7Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9MaW5lOgotCQlEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAorCQlyZXQgPSBEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEgLSBkYy0+eDAsIGRjLT55MSAtIGRjLT55MCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfUXVlcnk6Ci0JCWdvdG8gb3V0OwotCWNhc2UgT1NEX1Rlc3Q6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9UZXh0OgogCXsKIAkJY2hhciB0ZXh0YnVmWzI0MF07CiAKIAkJaWYgKHN0cm5jcHlfZnJvbV91c2VyKHRleHRidWYsIGRjLT5kYXRhLCAyNDApIDwgMCkgewogCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAkJdGV4dGJ1ZlsyMzldID0gMDsKIAkJaWYgKGRjLT54MSA+IDMpCiAJCQlkYy0+eDEgPSAzOwotCQlTZXRGb250KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MSwKKwkJcmV0ID0gU2V0Rm9udChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDEsCiAJCQkodTE2KSAoZGMtPmNvbG9yICYgMHhmZmZmKSwgKHUxNikgKGRjLT5jb2xvciA+PiAxNikpOwotCQlGbHVzaFRleHQoYXY3MTEwKTsKLQkJV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKLQkJZ290byBvdXQ7CisJCWlmICghcmV0KQorCQkJcmV0ID0gRmx1c2hUZXh0KGF2NzExMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgT1NEX1NldFdpbmRvdzoKLQkJaWYgKGRjLT54MCA8IDEgfHwgZGMtPngwID4gNykgeworCQlpZiAoZGMtPngwIDwgMSB8fCBkYy0+eDAgPiA3KQogCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OworCQllbHNlIHsKKwkJCWF2NzExMC0+b3Nkd2luID0gZGMtPngwOworCQkJcmV0ID0gMDsKIAkJfQotCQlhdjcxMTAtPm9zZHdpbiA9IGRjLT54MDsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX01vdmVXaW5kb3c6Ci0JCU1vdmVXaW5kb3dBYnMoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTApOwotCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gU2V0Q29sb3JCbGVuZChhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlblJhdzoKIAkJaWYgKGRjLT5jb2xvciA8IE9TRF9CSVRNQVAxIHx8IGRjLT5jb2xvciA+IE9TRF9DVVJTT1IpIHsKIAkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChkYy0+Y29sb3IgPj0gT1NEX0JJVE1BUDEgJiYgZGMtPmNvbG9yIDw9IE9TRF9CSVRNQVA4SFIpIHsKKwkJaWYgKGRjLT5jb2xvciA+PSBPU0RfQklUTUFQMSAmJiBkYy0+Y29sb3IgPD0gT1NEX0JJVE1BUDhIUikKIAkJCWF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSA9ICgxIDw8IChkYy0+Y29sb3IgJiAzKSkgLSAxOwotCQl9Ci0JCWVsc2UgeworCQllbHNlCiAJCQlhdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl0gPSAwOwotCQl9Ci0JCUNyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCiAJCQkJZGMtPngxIC0gZGMtPngwICsgMSwgZGMtPnkxIC0gZGMtPnkwICsgMSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAkJaWYgKCFkYy0+ZGF0YSkgewotCQkJTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7Ci0JCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOworCQkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJdXAoJmF2NzExMC0+b3NkX3NlbWEpOworCWlmIChyZXQ9PS1FUkVTVEFSVFNZUykKKwkJZHByaW50aygxLCAiYXY3MTEwX29zZF9jbWQoJWQpIHJldHVybnMgd2l0aCAtRVJFU1RBUlRTWVNcbiIsZGMtPmNtZCk7CisJZWxzZSBpZiAocmV0KQorCQlkcHJpbnRrKDEsICJhdjcxMTBfb3NkX2NtZCglZCkgcmV0dXJucyB3aXRoICVkXG4iLGRjLT5jbWQscmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKaW5kZXggNTIwNjFlMS4uZmVkZDIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKQEAgLTQ1OCwyNyArNDU4LDI3IEBACiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0FVRElPREFDLCBBdWRpb0RBQywgMiwgYWRkciwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdjc3MTBfc2V0X3ZpZGVvX21vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKQogewotCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIFNldFZpZE1vZGUsIDEsIG1vZGUpOworCXJldHVybiBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9FTkNPREVSLCBTZXRWaWRNb2RlLCAxLCBtb2RlKTsKIH0KIAotc3RhdGljIGludCBpbmxpbmUgdmlkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSwgdTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgaW50IHZpZGNvbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBjb20sIHUzMiBhcmcpCiB7CiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX01JU0MsIEFWNzExMF9GV19WSURFT19DT01NQU5ELCA0LAogCQkJICAgICAoY29tPj4xNiksIChjb20mMHhmZmZmKSwKIAkJCSAgICAgKGFyZz4+MTYpLCAoYXJnJjB4ZmZmZikpOwogfQogCi1zdGF0aWMgaW50IGlubGluZSBhdWRjb20oc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgY29tKQorc3RhdGljIGlubGluZSBpbnQgYXVkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSkKIHsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfTUlTQywgQVY3MTEwX0ZXX0FVRElPX0NPTU1BTkQsIDIsCiAJCQkgICAgIChjb20+PjE2KSwgKGNvbSYweGZmZmYpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKIHsKLQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgKHN0YXRlID8gT04yMksgOiBPRkYyMkspLCAwKTsKKwlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIChzdGF0ZSA/IE9OMjJLIDogT0ZGMjJLKSwgMCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lwYWNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwppbmRleCAyNDY2NDA3Li42OTllZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwpAQCAtMjQsNyArMjQsNyBAQAogCQkgICAgICB2b2lkICgqZnVuYykodTggKmJ1ZiwgaW50IHNpemUsIHZvaWQgKnByaXYpKQogewogCWlmICghKHAtPmJ1ZiA9IHZtYWxsb2Moc2l6ZSpzaXplb2YodTgpKSkpIHsKLQkJcHJpbnRrICgiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpcGFja1xuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaXBhY2tcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcC0+c2l6ZSA9IHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCmluZGV4IDZlMGY1ZDMuLjk3NDZkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCkBAIC01NzAsOSArNTcwLDkgQEAKIAogCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwogCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4ZTsKLQlidWZbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQ1MDAwMDAgPyAweGExIDoKLQkJICBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ1NDAwMDAwMCA/IDB4OTIgOiAweDM0KTsKKwlidWZbMl0gPSAweDg2OworCWJ1ZlszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCA/IDB4MDEgOgorCQkgIHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQ1MDAwMDAwID8gMHgwMiA6IDB4MDQpOwogCiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CkBAIC02OTUsOCArNjk1LDEyIEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDgsCiAJLmludmVydCA9IDEsCiAJLmludmVydF9vY2xrID0gMSwKKwkueHRhbF9mcmVxID0gVERBMTAwNDZfWFRBTF80TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAogCS5wbGxfaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0LAogCS5wbGxfc2V0ID0gcGhpbGlwc190dTEyMTZfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC0xMDE4LDcgKzEwMjIsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOwogCiBzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGJ1ZGdldF9leHRlbnNpb24gPSB7Ci0JLm5hbWUgPSAiYnVkZ2V0IGR2YiAvdyB2aWRlbyBpblwwIiwKKwkubmFtZSA9ICJidWRnZXRfYXYiLAogCS5wY2lfdGJsID0gcGNpX3RibCwKIAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggZGNlMTE2MS4uYTEyNjcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlpbnQgc2xvdF9zdGF0dXM7CiAJc3RydWN0IGR2Yl9jYV9lbjUwMjIxIGNhOwogCWNoYXIgaXJfZGV2X25hbWVbNTBdOworCXU4IHR1bmVyX3BsbF9hZGRyZXNzOyAvKiB1c2VkIGZvciBwaGlsaXBzX3RkbTEzMTZsIGNvbmZpZ3MgKi8KIH07CiAKIC8qIGZyb20gcmVhZGluZyB0aGUgZm9sbG93aW5nIHJlbW90ZXM6CkBAIC03MjMsNyArNzI0LDcgQEAKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXN0YXRpYyB1OCB0ZDEzMTZfaW5pdFtdID0geyAweDBiLCAweGY1LCAweDg1LCAweGFiIH07CiAJc3RhdGljIHU4IGRpc2FibGVfbWM0NEJDMzc0Y1tdID0geyAweDFkLCAweDc0LCAweGEwLCAweDY4IH07Ci0Jc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MywuZmxhZ3MgPSAwLC5idWYgPSB0ZDEzMTZfaW5pdCwubGVuID0KKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBidWRnZXRfY2ktPnR1bmVyX3BsbF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IHRkMTMxNl9pbml0LC5sZW4gPQogCQkJc2l6ZW9mKHRkMTMxNl9pbml0KSB9OwogCiAJLy8gc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24KQEAgLTc0Niw3ICs3NDcsNyBAQAogewogCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjMsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OwogCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOwogCXU4IGJhbmQsIGNwLCBmaWx0ZXI7CiAKQEAgLTgzOCw4ICs4MzksMTIgQEAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKIAkuaW52ZXJ0ID0gMCwKIAkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAorCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCisJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCiAJLnBsbF9pbml0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdCwKIAkucGxsX3NldCA9IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTg2NSwxMiArODcwLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMTE6CQkvLyBIYXVwcGF1Z2UvVFQgTm92YS1UIGJ1ZGdldCAodGRhMTAwNDUvUGhpbGlwcyB0ZG0xMzE2bCh0ZGE2NjUxdHQpICsgVERBOTg4OSkKKwkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjM7CiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0NV9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDEyOgkJLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBDSSBidWRnZXQgKHRkYTEwMDQ1L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSArIFREQTk4ODkpCisJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOworCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQorCQkJdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9PSBOVUxMKSB7CkBAIC05NTAsMTEgKzk2NSwxMyBAQAogCiBNQUtFX0JVREdFVF9JTkZPKHR0YmNpLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtQ0kgUENJIiwgQlVER0VUX1RUX0hXX0RJU0VRQyk7CiBNQUtFX0JVREdFVF9JTkZPKHR0YnQyLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtVAkgUENJIiwgQlVER0VUX1RUKTsKK01BS0VfQlVER0VUX0lORk8odHRidGNpLCAiVFQtQnVkZ2V0LVQtQ0kgUENJIiwgQlVER0VUX1RUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBjKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBmKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidDIsIDB4MTNjMiwgMHgxMDExKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidGNpLCAweDEzYzIsIDB4MTAxMiksCiAJewogCSAudmVuZG9yID0gMCwKIAkgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwppbmRleCAwODNmZDQ0Li45OTYxOTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJsNjQ3ODEuaCIKICNpbmNsdWRlICJ0ZGE4MDgzLmgiCisjaW5jbHVkZSAiczVoMTQyMC5oIgogCiBzdGF0aWMgdm9pZCBTZXQyMksgKHN0cnVjdCBidWRnZXQgKmJ1ZGdldCwgaW50IHN0YXRlKQogewpAQCAtMTc3LDYgKzE3OCw2MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxuYnAyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKKwl1OCBidWY7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlzd2l0Y2godm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWJ1ZiA9IChidWYgJiAweGY3KSB8IDB4MDQ7CisJCWJyZWFrOworCisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJYnVmID0gKGJ1ZiAmIDB4ZjcpIHwgMHgwYzsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnVmID0gYnVmICYgMHhmMDsKKwkJYnJlYWs7CisJfQorCisJbXNnLmZsYWdzID0gMDsKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBhcmcpCit7CisJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OworCXU4IGJ1ZjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHgwOCwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSAmYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKworCWlmIChhcmcpIHsKKwkJYnVmID0gYnVmIHwgMHgxMDsKKwl9IGVsc2UgeworCQlidWYgPSBidWYgJiAweGVmOworCX0KKworCW1zZy5mbGFncyA9IDA7CisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxuYnAyMV9pbml0KHN0cnVjdCBidWRnZXQqIGJ1ZGdldCkKK3sKKwl1OCBidWYgPSAweDAwOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKTsKK30KKwogc3RhdGljIGludCBhbHBzX2JzcnYyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKQEAgLTM5NSw2ICs0NTIsMzggQEAKIAkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDUxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IHM1aDE0MjBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCkKK3sKKwlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwOworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHhjMjsKKworCWlmIChkaXYgPCAxNDUwKQorCQlkYXRhWzNdID0gMHgwMDsKKwllbHNlIGlmIChkaXYgPCAxODUwKQorCQlkYXRhWzNdID0gMHg0MDsKKwllbHNlIGlmIChkaXYgPCAyMDAwKQorCQlkYXRhWzNdID0gMHg4MDsKKwllbHNlCisJCWRhdGFbM10gPSAweGMwOworCisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJKmZyZXFvdXQgPSBkaXYgKiAxMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHM1aDE0MjBfY29uZmlnIHM1aDE0MjBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg1MywKKwkucGxsX3NldCA9IHM1aDE0MjBfcGxsX3NldCwKK307CisKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQpCiB7CiAJdTggYiA9IDB4ZmY7CkBAIC00NTksNiArNTQ4LDE1IEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDE2OiAvLyBIYXVwcGF1Z2UvVFQgTm92YS1TIFNFIChzYW1zdW5nIHM1aDE0MjAvPz8/Pyh0ZGE4MjYwKSkKKwkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBzNWgxNDIwX2F0dGFjaCgmczVoMTQyMF9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdm9sdGFnZSA9IGxuYnAyMV9zZXRfdm9sdGFnZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlID0gbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlOworCQkJbG5icDIxX2luaXQoYnVkZ2V0KTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kID09IE5VTEwpIHsKQEAgLTUzMiw2ICs2MzAsNyBAQAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJjLCAgMHgxM2MyLCAweDEwMDQpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJ0LCAgMHgxM2MyLCAweDEwMDUpLAogCU1BS0VfRVhURU5TSU9OX1BDSShzYXRlbCwgMHgxM2MyLCAweDEwMTMpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJzLCAgMHgxM2MyLCAweDEwMTYpLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczEsMHgxMTMxLCAweDRmNjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczAsMHgxMTMxLCAweDRmNjEpLAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggNGFhNzE0YS4uYzZjMWQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IKIAlzZWxlY3QgRFZCX0NYMjI3MDAKIAlzZWxlY3QgRFZCX1REQTEwMDRYCisJc2VsZWN0IERWQl9WRVMxODIwCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9TVFYwMjk5CiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKaW5kZXggYWZhMGU3YS4uYWE0M2I1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiZG14ZGV2LmgiCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiAjaW5jbHVkZSAiZHZiX25ldC5oIgorI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJjeDIyNzAwLmgiCiAjaW5jbHVkZSAidGRhMTAwNHguaCIKICNpbmNsdWRlICJzdHYwMjk5LmgiCkBAIC0xMzY3LDYgKzEzNjgsNDcgQEAKIAkucGxsX3NldCA9IHR0dXNiX25vdmFzX2dydW5kaWdfMjk1MDRfNDkxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IGFscHNfdGRiZTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCit7CisJc3RydWN0IHR0dXNiKiB0dHVzYiA9IGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzU5Mzc1MDAgKyAzMTI1MCkgLyA2MjUwMDsKKworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHg4NSB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOworCWRhdGFbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQwMDAwMDAgPyAweDg4IDogcGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDAgPyAweDg0IDogMHg4MSk7CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmdHR1c2ItPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdmVzMTgyMF9jb25maWcgYWxwc190ZGJlMl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA5LAorCS54aW4gPSA1Nzg0MDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAorCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAorfTsKKworc3RhdGljIHU4IHJlYWRfcHdtKHN0cnVjdCB0dHVzYiogdHR1c2IpCit7CisJdTggYiA9IDB4ZmY7CisJdTggcHdtOworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geyB7IC5hZGRyID0gMHg1MCwuZmxhZ3MgPSAwLC5idWYgPSAmYiwubGVuID0gMSB9LAorCQkJCXsgLmFkZHIgPSAweDUwLC5mbGFncyA9IEkyQ19NX1JELC5idWYgPSAmcHdtLC5sZW4gPSAxfSB9OworCisJaWYgKChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB8fCAocHdtID09IDB4ZmYpKQorCQlwd20gPSAweDQ4OworCisJcmV0dXJuIHB3bTsKK30KIAogCiBzdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCB0dHVzYiogdHR1c2IpCkBAIC0xMzk0LDYgKzE0MzYsMTIgQEAKIAogCQlicmVhazsKIAorCWNhc2UgMHgxMDA0OiAvLyBIYXVwcGF1Z2UvVFQgRFZCLUMgYnVkZ2V0ICh2ZXMxODIwL0FMUFMgVERCRTIoc3A1NjU5KSkKKwkJdHR1c2ItPmZlID0gdmVzMTgyMF9hdHRhY2goJmFscHNfdGRiZTJfY29uZmlnLCAmdHR1c2ItPmkyY19hZGFwLCByZWFkX3B3bSh0dHVzYikpOworCQlpZiAodHR1c2ItPmZlICE9IE5VTEwpCisJCQlicmVhazsKKwkJYnJlYWs7CisKIAljYXNlIDB4MTAwNTogLy8gSGF1cHBhdWdlL1RUIE5vdmEtVVNCLXQgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkMTMxNih0ZGE2NjUxdHQpIE9SIGN4MjI3MDAvQUxQUyBURE1CNyg/PykpCiAJCS8vIHRyeSB0aGUgQUxQUyBURE1CNyBmaXJzdAogCQl0dHVzYi0+ZmUgPSBjeDIyNzAwX2F0dGFjaCgmYWxwc190ZG1iN19jb25maWcsICZ0dHVzYi0+aTJjX2FkYXApOwpAQCAtMTU3MCw3ICsxNjE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHR0dXNiX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwMyl9LAotLyoJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwNCl9LFVOREVGSU5FRCBIQVJEV0FSRSAtIG1haWwgbGludXh0di5vcmcgbGlzdCovCS8qIHRvIGJlIGNvbmZpcm1lZCA/Pz8/ICAqLworCXtVU0JfREVWSUNFKDB4YjQ4LCAweDEwMDQpfSwKIAl7VVNCX0RFVklDRSgweGI0OCwgMHgxMDA1KX0sCiAJe30KIH07CkBAIC0xNTc4LDcgKzE2MjYsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHR0dXNiX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHR0dXNiX2RyaXZlciA9IHsKLSAgICAgIC5uYW1lCQk9ICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgVVNCLU5vdmEiLAorICAgICAgLm5hbWUJCT0gInR0dXNiIiwKICAgICAgIC5wcm9iZQkJPSB0dHVzYl9wcm9iZSwKICAgICAgIC5kaXNjb25uZWN0CT0gdHR1c2JfZGlzY29ubmVjdCwKICAgICAgIC5pZF90YWJsZQkJPSB0dHVzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA1MDViZGFmLi40NWM5YTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0xMjgxLDYgKzEyODEsNyBAQAogCWlmIChmaXJtd2FyZV9zaXplIDwgNjApIHsKIAkJcHJpbnRrKCIlczogZmlybXdhcmUgc2l6ZSB0b28gc21hbGwgZm9yIERTUCBjb2RlICglenUgPCA2MCkuXG4iLAogCQkJX19GVU5DVElPTl9fLCBmaXJtd2FyZV9zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEyOTQsNiArMTI5NSw3IEBACiAJCXByaW50aygiJXM6IGNyYzMyIGNoZWNrIG9mIERTUCBjb2RlIGZhaWxlZCAoY2FsY3VsYXRlZCAiCiAJCSAgICAgICAiMHglMDh4ICE9IDB4JTA4eCBpbiBmaWxlKSwgZmlsZSBpbnZhbGlkLlxuIiwKIAkJCV9fRlVOQ1RJT05fXywgY3JjMzJfY3N1bSwgY3JjMzJfY2hlY2spOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1jcHkoaWRzdHJpbmcsICZmaXJtd2FyZVszNl0sIDIwKTsKQEAgLTEzMDgsMTUgKzEzMTAsMTkgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQxLCBzaXplb2YoYjApLCBiMCwgTlVMTCwgTlVMTCk7CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiByZXN1bHQ7CisJfQogCiAJdHJhbnNfY291bnQgPSAwOwogCWogPSAwOwogCiAJYiA9IGttYWxsb2MoQVJNX1BBQ0tFVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYiA9PSBOVUxMKQorCWlmIChiID09IE5VTEwpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmaXJtd2FyZV9zaXplOyBpICs9IENPTU1BTkRfUEFDS0VUX1NJWkUpIHsKIAkJc2l6ZSA9IGZpcm13YXJlX3NpemUgLSBpOwpAQCAtMTM0NSw2ICsxMzUxLDcgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQzLCBzaXplb2YoYjEpLCBiMSwgTlVMTCwgTlVMTCk7CiAKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlrZnJlZShiKTsKIAogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwppbmRleCAxNjk5Y2M5Li43MjVhZjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKQEAgLTE1Nyw3ICsxNTcsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE2NywxMCArMTY4LDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJzX29wczsKQEAgLTE4MSw3ICsxNzgsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE5MywxMCArMTkxLDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJ0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCBmOTM4M2U3Li5mNDYxNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC03LDE5ICs3LDYgQEAKIAogY29tbWVudCAiVmlkZW8gQWRhcHRlcnMiCiAKLWNvbmZpZyBDT05GSUdfVFVORVJfTVVMVElfSTJDCi0JYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIG11bHRpcGxlIEkyQyBkZXZpY2VzIG9uIFZpZGVvIEFkYXB0ZXJzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVklERU9fREVWICYmIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIFNvbWUgdmlkZW8gYWRhcHRlcnMgaGF2ZSBtb3JlIHRoYW4gb25lIHR1bmVyIGluc2lkZS4gVGhpcyBwYXRjaAotCSAgZW5hYmxlcyBzdXBwb3J0IGZvciB1c2luZyBtb3JlIHRoYW4gb25lIHR1bmVyLiBUaGlzIGlzIHJlcXVpcmVkCi0JICBmb3Igc29tZSBjYXJkcyB0byBhbGxvdyB0dW5uaW5nICBib3RoIHZpZGVvIGFuZCByYWRpby4KLQkgIEl0IGFsc28gaW1wcm92ZXMgSTJDIGF1dG9kZXRlY3Rpb24gZm9yIHRoZXNlIGNhcmRzLgotCi0JICBPbmx5IGZldyB0dW5lcnMgY3VycmVudGx5IGlzIHN1cHBvcnRpbmcgdGhpcy4gTW9yZSB0byBjb21lLgotCi0JICBJdCBpcyBzYWZlIHRvIHNheSAnWScgaGVyZSBldmVuIGlmIHlvdXIgY2FyZCBoYXMgb25seSBvbmUgSTJDIHR1bmVyLgotCiBjb25maWcgVklERU9fQlQ4NDgKIAl0cmlzdGF0ZSAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgogCWRlcGVuZHMgb24gVklERU9fREVWICYmIFBDSSAmJiBJMkMKQEAgLTM0NCw2ICszMzEsNyBAQAogCXNlbGVjdCBEVkJfTVQzNTIKIAlzZWxlY3QgRFZCX09SNTExMzIKIAlzZWxlY3QgRFZCX0NYMjI3MDIKKwlzZWxlY3QgRFZCX0xHRFQzMzAyCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQi9BVFNDIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQ29ubmV4YW50IDIzODh4IGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCAyZGM5MDZmLi44MTBlN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTcsOCArNyw3IEBACiB6b3Jhbi1vYmpzICAgICAgOj0JenIzNjEyMC5vIHpyMzYxMjBfaTJjLm8genIzNjEyMF9tZW0ubwogenIzNjA2Ny1vYmpzCTo9CXpvcmFuX3Byb2Nmcy5vIHpvcmFuX2RldmljZS5vIFwKIAkJCXpvcmFuX2RyaXZlci5vIHpvcmFuX2NhcmQubwotdHVuZXItb2Jqcwk6PQl0dW5lci1jb3JlLm8gdHVuZXItc2ltcGxlLm8gbXQyMHh4Lm8gdGRhODI5MC5vCi0KK3R1bmVyLW9ianMJOj0JdHVuZXItY29yZS5vIHR1bmVyLXNpbXBsZS5vIG10MjB4eC5vIHRkYTgyOTAubyB0ZWE1NzY3Lm8KIG9iai0kKENPTkZJR19WSURFT19ERVYpICs9IHZpZGVvZGV2Lm8gdjRsMi1jb21tb24ubyB2NGwxLWNvbXBhdC5vCiAKIG9iai0kKENPTkZJR19WSURFT19CVDg0OCkgKz0gYnR0di5vIG1zcDM0MDAubyB0dmF1ZGlvLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCmluZGV4IDlhNjQyYzdkLi5hMDcwNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCkBAIC0xMzgsMjUgKzEzOCwxMyBAQAogCiAgICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CiAKLSNpZiAwCi0JLy8gRnVsbCAzMC8yNSBGcmFtZSByYXRlCi0JcHJpbnRrKCJGdWxsIDMwLzI1IEZyYW1lIHJhdGVcbiIpOwotCWJ1ZlswXT1CVDgzMl9WUF9DT05UUk9MMDsgLy8gUmVnLjM5Ci0gICAgICAgIGJ1ZlsxXT0gMHgwMDsKLSAgICAgICAgaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQotICAgICAgICAgICAgICAgIHByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3IgRkZSOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKIAotICAgICAgICBidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOwotI2VuZGlmCi0KLSNpZiAxCiAJLy8gZm9yIHRlc3RpbmcgKGV2ZW4gd29ya3Mgd2hlbiBubyBjYW1lcmEgYXR0YWNoZWQpCiAJcHJpbnRrKCJidDgzMjogKioqIEdlbmVyYXRlIE5UU0MgTSBCYXJzICoqKioqXG4iKTsKIAlidWZbMF09QlQ4MzJfVlBfVEVTVENPTlRST0wwOyAvLyBSZWcuIDQyCiAJYnVmWzFdPTM7IC8vIEdlbmVyYXRlIE5UU0MgU3lzdGVtIE0gYmFycywgR2VuZXJhdGUgRnJhbWUgdGltaW5nIGludGVybmFsbHkKICAgICAgICAgaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQogICAgICAgICAgICAgICAgIHByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3IgTUJBUjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7Ci0jZW5kaWYKIAogCXByaW50aygiQnQ4MzI6IENhbWVyYSBQcmVzZW50OiAlc1xuIiwKIAkJKGJ1ZlsxK0JUODMyX0NBTV9TVEFUVVNdICYgQlQ4MzJfNTZfQ0FNRVJBX1BSRVNFTlQpID8gInllcyI6Im5vIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCmluZGV4IDI1MTA5MmUuLjJkYmY1ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtY2FyZHMuYyx2IDEuNDkgMjAwNS8wNi8xMCAxNzoyMDoyNCBtY2hlaGFiIEV4cCAkCisgICAgJElkOiBidHR2LWNhcmRzLmMsdiAxLjUzIDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAKICAgICBidHR2LWNhcmRzLmMKIApAQCAtMzksOSArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAiYnR0dnAuaCIKLSNpZiAwIC8qIG5vdCB3b3JraW5nIHlldCAqLwotI2luY2x1ZGUgImJ0ODMyLmgiCi0jZW5kaWYKIAogLyogZndkIGRlY2wgKi8KIHN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKQEAgLTUxMywxMyArNTEwLDggQEAKIAkuc3ZocwkJPSAyLAogCS5ncGlvbWFzawk9IDB4MDFmZTAwLAogCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLSNpZiAwCi0JLy8gb2xkCi0JLmF1ZGlvbXV4CT0geyAweDAxYzAwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAotI2Vsc2UKIAkvLyAyMDAzLTEwLTIwIGJ5ICJBbnRvbiBBLiBBcmFwb3YiIDxhcmFwb3ZAbWFpbC5ydT4KIAkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCi0jZW5kaWYKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTc2NiwxNCArNzU4LDkgQEAKIAkudHVuZXIJCT0gMCwKIAkuc3ZocwkJPSAyLAogCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLCAwfSwgLy8gVFYsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvcgotI2lmIDAKLQkuZ3Bpb21hc2sJPSAweGMzMzAwMCwKLQkuYXVkaW9tdXgJPSB7IDB4NDIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKLSNlbHNlCiAJLyogQWxleGFuZGVyIFZhcmFraW4gPGF2YXJha2luQGhvdG1haWwuY29tPiBbc3RlcmVvIHZlcnNpb25dICovCiAJLmdwaW9tYXNrCT0gMHhiMzMwMDAsCiAJLmF1ZGlvbXV4CT0geyAweDEyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCi0jZW5kaWYKIAkvKiBBdWRpbyBSb3V0aW5nIGZvciAiV2luRmFzdCAyMDAwIFhQIiAobm8gdHYgc3RlcmVvICEpCiAJCWdwaW8yMyAtLSBoZWY0MDUyOm5FbmFibGUgKDB4ODAwMDAwKQogCQlncGlvMTIgLS0gaGVmNDA1MjpBMQpAQCAtMTYwMywyMCArMTU5MCwxMSBAQAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSNpZiAwIC8qIFRPRE8gLi4uICovCi0gICAgICAgLnN2aHMgICAgICAgICAgID0gT1NQUkVZNTQwX1NWSURfQU5BTE9HLAotICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgICAgICAgW09TUFJFWTU0MF9DT01QX0FOQUxPR10gPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPU1BSRVk1NDBfU1ZJRF9BTkFMT0ddID0gMywgfSwKLSNlbmRpZgogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKLSNpZiAwIC8qIFRPRE8gLi4uICovCi0gICAgICAgLm11eHNlbF9ob29rICAgID0gb3NwcmV5XzU0MF9tdXhzZWwsCi0gICAgICAgLnBpY3R1cmVfaG9vayAgID0gb3NwcmV5XzU0MF9zZXRfcGljdHVyZSwKLSNlbmRpZgogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNTQ2LDIxICsyNTI0LDEyIEBACiAJYnRhb3IoKDIpPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CiAJZ3Bpb19iaXRzKDMsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxbaW5wdXQmN10pOwogCi0jaWYgMAotICAgICAgIC8qIHN2aHMgKi8KLSAgICAgICAvKiB3YWtlIGNocm9tYSBBREMgKi8KLSAgICAgICBidGFuZCh+QlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7Ci0gICAgICAgLyogc2V0IHRvIFlDIHZpZGVvICovCi0gICAgICAgYnRvcihCVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X0VfQ09OVFJPTCk7Ci0gICAgICAgYnRvcihCVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7Ci0jZWxzZQogICAgICAgIC8qIGNvbXBvc2l0ZSAqLwogICAgICAgIC8qIHNldCBjaHJvbWEgQURDIHRvIHNsZWVwICovCiAgICAgICAgYnRvcihCVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKICAgICAgICAvKiBzZXQgdG8gY29tcG9zaXRlIHZpZGVvICovCiAgICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKICAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9PX0NPTlRST0wpOwotI2VuZGlmCiAKICAgICAgICAvKiBzd2l0Y2ggc3luYyBkcml2ZSBvZmYgKi8KICAgICAgICBncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwpAQCAtMjgxMywxMCArMjc4MiwxOCBAQAogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwogCXByaW50aygiYnR0diVkOiB1c2luZyB0dW5lcj0lZFxuIixidHYtPmMubnIsYnR2LT50dW5lcl90eXBlKTsKIAlpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKLQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX0NPTkZJR19QSU5OQUNMRSwKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQVVEQ19DT05GSUdfUElOTkFDTEUsCiAJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOwotCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCi0JCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsVFVORVJfU0VUX1RZUEUsJmJ0di0+dHVuZXJfdHlwZSk7CisJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgeworCSAgICAgICAgc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKworCSAgICAgICAgdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJdHVuX3NldHVwLnR5cGUgPSBidHYtPnR1bmVyX3R5cGU7CisJCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKworCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwl9CisKIAlidHYtPnN2aHMgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnN2aHM7CiAJaWYgKHN2aHNbYnR2LT5jLm5yXSAhPSBVTlNFVCkKIAkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwpAQCAtMzEyNSwxNCArMzEwMiw2IEBACiAgICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfU0VDQU0sCiAgICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfUEFMLAogCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07Ci0jaWYgMAotaW50IHR1bmVyXzBfZm1fdGFibGVbXSA9IHsKLSAgICAgICAgUEhJTElQU19GUjEyMzZfTlRTQywgIFBISUxJUFNfRlIxMjE2X1BBTCwKLSAgICAgICAgUEhJTElQU19GUjEyMTZfUEFMLCAgIFBISUxJUFNfRlIxMjE2X1BBTCwKLSAgICAgICAgUEhJTElQU19GUjEyMTZfUEFMLCAgIFBISUxJUFNfRlIxMjE2X1BBTCwKLSAgICAgICAgUEhJTElQU19GUjEyMzZfU0VDQU0sIFBISUxJUFNfRlIxMjM2X1NFQ0FNLAotICAgICAgICBQSElMSVBTX0ZSMTIzNl9TRUNBTSwgUEhJTElQU19GUjEyMTZfUEFMfTsKLSNlbmRpZgogCiBzdGF0aWMgaW50IHR1bmVyXzFfdGFibGVbXSA9IHsKICAgICAgICAgVFVORVJfVEVNSUNfTlRTQywgIFRVTkVSX1RFTUlDX1BBTCwKQEAgLTMyMTgsMzYgKzMxODcsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KQogewotI2lmIDAgLyogbm90IHdvcmtpbmcgeWV0ICovCi0JaW50IHJlc2V0Yml0PTA7Ci0KLQlzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7Ci0JY2FzZSBCVFRWX1BYRUxWV1BMVFZQQUs6Ci0JCXJlc2V0Yml0ID0gMHg0MDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgQlRUVl9NT0RURUNfMjA1OgotCQlyZXNldGJpdCA9IDE8PDk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCXJlcXVlc3RfbW9kdWxlKCJidDgzMiIpOwotCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEJUODMyX0hFWERVTVAsIE5VTEwpOwotCi0JcHJpbnRrKCJidHR2JWQ6IFJlc2V0IEJ0ODMyIFtsaW5lPTB4JXhdXG4iLGJ0di0+Yy5ucixyZXNldGJpdCk7Ci0JZ3Bpb193cml0ZSgwKTsKLQlncGlvX2lub3V0KHJlc2V0Yml0LCByZXNldGJpdCk7Ci0JdWRlbGF5KDUpOwotCWdwaW9fYml0cyhyZXNldGJpdCwgcmVzZXRiaXQpOwotCXVkZWxheSg1KTsKLQlncGlvX2JpdHMocmVzZXRiaXQsIDApOwotCXVkZWxheSg1KTsKLQotCS8vIGJ0ODMyIG9uIHBpeGVsdmlldyBjaGFuZ2VzIGZyb20gaTJjIDB4OGEgdG8gMHg4OCBhZnRlcgotCS8vIGJlaW5nIHJlc2V0IGFzIGFib3ZlLiBTbyB3ZSBtdXN0IGZvbGxvdyBieSB0aGlzOgotCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEJUODMyX1JFQVRUQUNILCBOVUxMKTsKLSNlbmRpZgogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzU3MiwxMSArMzUxMSw2IEBACiB7CiAJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKIAl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8qIGFkZCAxMC43TUh6IChzZWUgZG9jcykgKi8KLSNpZiAwCi0JLyogYnJlYWtzIE1pcm8gUENUViAqLwotCXZhbHVlID0gdGVhNTc1N19yZWFkKGJ0dik7Ci0JZHByaW50aygiYnR0diVkOiB0ZWE1NzU3IHJlYWRiYWNrPTB4JXhcbiIsYnR2LT5jLm5yLHZhbHVlKTsKLSNlbmRpZgogfQogCiAKQEAgLTM2NTYsMTMgKzM1OTAsOCBAQAogewogCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAKIAl2YWwgPSBncGlvX3JlYWQoKTsKIAlpZiAoc2V0KSB7CkBAIC0zODUxLDEzICszNzgwLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsID0gMDsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAKIAlpZiAoc2V0KSB7CiAJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewpAQCAtMzg4OCwxMyArMzgxMiw4IEBACiB7CiAJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAJaWYgKHNldCkgewogCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKIAkJCXZhbCA9IDB4MDAwMDsKQEAgLTQzNzEsMTEgKzQyOTAsNiBAQAogCQlsYXRlbmN5ID0gMHgwQTsKICNlbmRpZgogCi0jaWYgMAotCS8qIHByaW50IHdoaWNoIGNoaXBzZXQgd2UgaGF2ZSAqLwotCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgsZGV2KSkpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIGlzICVzXG4iLHBjaV9uYW1lKGRldikpOwotI2VuZGlmCiAKIAkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCiAJaWYgKHRyaXRvbjEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKaW5kZXggMjkwMjg5YS4uNTFhMGY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBidHR2LWRyaXZlci5jLHYgMS4zOCAyMDA1LzA2LzEwIDE3OjIwOjI0IG1jaGVoYWIgRXhwICQKKyAgICAkSWQ6IGJ0dHYtZHJpdmVyLmMsdiAxLjQyIDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAKICAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKIApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTc2LDYgKzc3LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2hpdGVjcnVzaF9sb3dlciA9IDB4N0Y7CiBzdGF0aWMgdW5zaWduZWQgaW50IHZjcl9oYWNrICAgID0gMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2lzd2l0Y2ggPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB1dl9yYXRpbyAgICA9IDUwOworc3RhdGljIHVuc2lnbmVkIGludCBmdWxsX2x1bWFfcmFuZ2UgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjb3JpbmcgICAgICA9IDA7CiAKIC8qIEFQSSBmZWF0dXJlcyAodHVybiBvbi9vZmYgc3R1ZmYgZm9yIHRlc3RpbmcpICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHY0bDIgICAgICAgID0gMTsKQEAgLTEwNiw2ICsxMTAsOSBAQAogbW9kdWxlX3BhcmFtKHdoaXRlY3J1c2hfdXBwZXIsICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHdoaXRlY3J1c2hfbG93ZXIsICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHZjcl9oYWNrLCAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHV2X3JhdGlvLCAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGZ1bGxfbHVtYV9yYW5nZSwgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGNvcmluZywgICAgICAgICAgICBpbnQsIDA0NDQpOwogCiBtb2R1bGVfcGFyYW1fYXJyYXkocmFkaW8sIGludCwgTlVMTCwgMDQ0NCk7CiAKQEAgLTEyNCw2ICsxMzEsOSBAQAogTU9EVUxFX1BBUk1fREVTQyh3aGl0ZWNydXNoX2xvd2VyLCJzZXRzIHRoZSB3aGl0ZSBjcnVzaCBsb3dlciB2YWx1ZSwgZGVmYXVsdCBpcyAxMjciKTsKIE1PRFVMRV9QQVJNX0RFU0ModmNyX2hhY2ssImVuYWJsZXMgdGhlIFZDUiBoYWNrIChpbXByb3ZlcyBzeW5jaCBvbiBwb29yIFZDUiB0YXBlcyksIGRlZmF1bHQgaXMgMCAobm8pIik7CiBNT0RVTEVfUEFSTV9ERVNDKGlycV9pc3dpdGNoLCJzd2l0Y2ggaW5wdXRzIGluIGlycSBoYW5kbGVyIik7CitNT0RVTEVfUEFSTV9ERVNDKHV2X3JhdGlvLCJyYXRpbyBiZXR3ZWVuIHUgYW5kIHYgZ2FpbnMsIGRlZmF1bHQgaXMgNTAiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9sdW1hX3JhbmdlLCJ1c2UgdGhlIGZ1bGwgbHVtYSByYW5nZSwgZGVmYXVsdCBpcyAwIChubykiKTsKK01PRFVMRV9QQVJNX0RFU0MoY29yaW5nLCJzZXQgdGhlIGx1bWEgY29yaW5nIGxldmVsLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oImJ0dHYgLSB2NGwvdjRsMiBkcml2ZXIgbW9kdWxlIGZvciBidDg0OC84NzggYmFzZWQgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIgJiBNYXJjdXMgTWV0emxlciAmIEdlcmQgS25vcnIiKTsKQEAgLTQ4NCw3ICs0OTQsMTAgQEAKICNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9WQ1JfSEFDSyAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNSkKICNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9XSElURUNSVVNIX1VQUEVSICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYpCiAjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfV0hJVEVDUlVTSF9MT1dFUiAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA3KQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0xBU1RQMSAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1VWX1JBVElPICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0ZVTExfTFVNQV9SQU5HRSAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOSkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT1JJTkcgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDExKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG5vX2N0bCA9IHsKIAkubmFtZSAgPSAiNDIiLApAQCAtNjE4LDggKzYzMSwzMiBAQAogCQkuc3RlcCAgICAgICAgICA9IDEsCiAJCS5kZWZhdWx0X3ZhbHVlID0gMHg3RiwKIAkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfVVZfUkFUSU8sCisJCS5uYW1lICAgICAgICAgID0gInV2IHJhdGlvIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEwMCwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDUwLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9GVUxMX0xVTUFfUkFOR0UsCisJCS5uYW1lICAgICAgICAgID0gImZ1bGwgbHVtYSByYW5nZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9DT1JJTkcsCisJCS5uYW1lICAgICAgICAgID0gImNvcmluZyIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAzLAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCX0KIAorCisKIH07CiBzdGF0aWMgY29uc3QgaW50IEJUVFZfQ1RMUyA9IEFSUkFZX1NJWkUoYnR0dl9jdGxzKTsKIApAQCAtNjYyLDEyICs2OTksMTAgQEAKIHN0YXRpYwogdm9pZCBmcmVlX2J0cmVzKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2ZoICpmaCwgaW50IGJpdHMpCiB7Ci0jaWYgMSAvKiBERUJVRyAqLwogCWlmICgoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpIHsKIAkJLyogdHJ5aW5nIHRvIGZyZWUgcmVzc291cmNlcyBub3QgYWxsb2NhdGVkIGJ5IHVzIC4uLiAqLwogCQlwcmludGsoImJ0dHY6IEJVRyEgKGJ0cmVzKVxuIik7CiAJfQotI2VuZGlmCiAJZG93bigmYnR2LT5yZXNsb2NrKTsKIAlmaC0+cmVzb3VyY2VzICAmPSB+Yml0czsKIAlidHYtPnJlc291cmNlcyAmPSB+Yml0czsKQEAgLTgzMyw4ICs4NjgsOCBAQAogCWJ0di0+c2F0dXJhdGlvbiA9IGNvbG9yOwogCiAJLyogMC01MTEgZm9yIHRoZSBjb2xvciAqLwotCXZhbF91ICAgPSBjb2xvciA+PiA3OwotCXZhbF92ICAgPSAoKGNvbG9yPj43KSoxODBMKS8yNTQ7CisJdmFsX3UgICA9ICgoY29sb3IgKiBidHYtPm9wdF91dl9yYXRpbykgLyA1MCkgPj4gNzsKKwl2YWxfdiAgID0gKCgoY29sb3IgKiAoMTAwIC0gYnR2LT5vcHRfdXZfcmF0aW8pIC8gNTApID4+NykqMTgwTCkvMjU0OwogICAgICAgICBoaWJpdHMgID0gKHZhbF91ID4+IDcpICYgMjsKIAloaWJpdHMgfD0gKHZhbF92ID4+IDgpICYgMTsKICAgICAgICAgYnR3cml0ZSh2YWxfdSAmIDB4ZmYsIEJUODQ4X1NBVF9VX0xPKTsKQEAgLTkwNywxMSArOTQyLDYgQEAKIAlpMmNfbXV4ID0gbXV4ID0gKGJ0di0+YXVkaW8gJiBBVURJT19NVVRFKSA/IEFVRElPX09GRiA6IGJ0di0+YXVkaW87CiAJaWYgKGJ0di0+b3B0X2F1dG9tdXRlICYmICFzaWduYWwgJiYgIWJ0di0+cmFkaW9fdXNlcikKIAkJbXV4ID0gQVVESU9fT0ZGOwotI2lmIDAKLQlwcmludGsoImJ0dHYlZDogYW11eDogbW9kZT0lZCBhdWRpbz0lZCBzaWduYWw9JXMgbXV4PSVkLyVkIGlycT0lc1xuIiwKLQkgICAgICAgYnR2LT5jLm5yLCBtb2RlLCBidHYtPmF1ZGlvLCBzaWduYWwgPyAieWVzIiA6ICJubyIsCi0JICAgICAgIG11eCwgaTJjX211eCwgaW5faW50ZXJydXB0KCkgPyAieWVzIiA6ICJubyIpOwotI2VuZGlmCiAKIAl2YWwgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W211eF07CiAJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssdmFsKTsKQEAgLTk1OCwxMSArOTg4LDYgQEAKIAljYXNlIEJUVFZfVk9PRE9PVFZfRk06CiAJCWJ0dHZfdGRhOTg4MF9zZXRub3JtKGJ0dixub3JtKTsKIAkJYnJlYWs7Ci0jaWYgMAotCWNhc2UgQlRUVl9PU1BSRVk1NDA6Ci0JCW9zcHJleV81NDBfc2V0X25vcm0oYnR2LG5vcm0pOwotCQlicmVhazsKLSNlbmRpZgogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTExNTEsNiArMTE3NiwxNSBAQAogCWNhc2UgVjRMMl9DSURfUFJJVkFURV9XSElURUNSVVNIX0xPV0VSOgogCQljLT52YWx1ZSA9IGJ0di0+b3B0X3doaXRlY3J1c2hfbG93ZXI7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9VVl9SQVRJTzoKKwkJYy0+dmFsdWUgPSBidHYtPm9wdF91dl9yYXRpbzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0ZVTExfTFVNQV9SQU5HRToKKwkJYy0+dmFsdWUgPSBidHYtPm9wdF9mdWxsX2x1bWFfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT1JJTkc6CisJCWMtPnZhbHVlID0gYnR2LT5vcHRfY29yaW5nOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMjQ3LDYgKzEyODEsMTggQEAKIAkJYnR2LT5vcHRfd2hpdGVjcnVzaF9sb3dlciA9IGMtPnZhbHVlOwogCQlidHdyaXRlKGMtPnZhbHVlLCBCVDg0OF9XQ19ET1dOKTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1VWX1JBVElPOgorCQlidHYtPm9wdF91dl9yYXRpbyA9IGMtPnZhbHVlOworCQlidDg0OF9zYXQoYnR2LCBidHYtPnNhdHVyYXRpb24pOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRlVMTF9MVU1BX1JBTkdFOgorCQlidHYtPm9wdF9mdWxsX2x1bWFfcmFuZ2UgPSBjLT52YWx1ZTsKKwkJYnRhb3IoKGMtPnZhbHVlPDw3KSwgfkJUODQ4X09GT1JNX1JBTkdFLCBCVDg0OF9PRk9STSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT1JJTkc6CisJCWJ0di0+b3B0X2NvcmluZyA9IGMtPnZhbHVlOworCQlidGFvcigoYy0+dmFsdWU8PDUpLCB+QlQ4NDhfT0ZPUk1fQ09SRTMyLCBCVDg0OF9PRk9STSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3OTIsNyArMTgzOCw3IEBACiAKIAkJaWYgKHVubGlrZWx5KGYtPnR1bmVyICE9IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh1bmxpa2VseShmLT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKSkKKwkJaWYgKHVubGlrZWx5IChmLT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlkb3duKCZidHYtPmxvY2spOwogCQlidHYtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CkBAIC0zMTE3LDExICszMTYzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogCQltZW1zZXQodiwwLHNpemVvZigqdikpOwogICAgICAgICAgICAgICAgIHN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLSAgICAgICAgICAgICAgICAvKiBqYXBhbjogICAgICAgICAgNzYuMCBNSHogLSAgODkuOSBNSHoKLSAgICAgICAgICAgICAgICAgICB3ZXN0ZXJuIGV1cm9wZTogODcuNSBNSHogLSAxMDguMCBNSHoKLSAgICAgICAgICAgICAgICAgICBydXNzaWE6ICAgICAgICAgNjUuMCBNSHogLSAxMDguMCBNSHogKi8KLSAgICAgICAgICAgICAgICB2LT5yYW5nZWxvdz0oaW50KSg2NSoxNik7Ci0gICAgICAgICAgICAgICAgdi0+cmFuZ2VoaWdoPShpbnQpKDEwOCoxNik7CiAgICAgICAgICAgICAgICAgYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixjbWQsdik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTM4MTMsNyArMzg1NCw3IEBACiAJCSAgICAgICBidHYtPmMubnIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0gICAgICAgIGlmIChwY2lfc2V0X2RtYV9tYXNrKGRldiwgMHhmZmZmZmZmZikpIHsKKyAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iLAogCQkgICAgICAgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0zODc2LDYgKzM5MTcsOSBAQAogCWJ0di0+b3B0X3Zjcl9oYWNrICAgPSB2Y3JfaGFjazsKIAlidHYtPm9wdF93aGl0ZWNydXNoX3VwcGVyICA9IHdoaXRlY3J1c2hfdXBwZXI7CiAJYnR2LT5vcHRfd2hpdGVjcnVzaF9sb3dlciAgPSB3aGl0ZWNydXNoX2xvd2VyOworCWJ0di0+b3B0X3V2X3JhdGlvICAgPSB1dl9yYXRpbzsKKwlidHYtPm9wdF9mdWxsX2x1bWFfcmFuZ2UgICA9IGZ1bGxfbHVtYV9yYW5nZTsKKwlidHYtPm9wdF9jb3JpbmcgICAgID0gY29yaW5nOwogCiAJLyogZmlsbCBzdHJ1Y3QgYnR0diB3aXRoIHNvbWUgdXNlZnVsIGRlZmF1bHRzICovCiAJYnR2LT5pbml0LmJ0diAgICAgICAgID0gYnR2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCmluZGV4IGRhNDQ4YTUuLjIzNGE4NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogYnR0di1pMmMuYyx2IDEuMjEgMjAwNS8wNi8xMCAxNzoyMDoyNCBtY2hlaGFiIEV4cCAkCisgICAgJElkOiBidHR2LWkyYy5jLHYgMS4yNSAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogCiAgICAgYnR0di1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQogCkBAIC0yOTUsMTQgKzI5NSwyNiBAQAogewogICAgICAgICBzdHJ1Y3QgYnR0diAqYnR2ID0gaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOwogCi0JaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKLQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixUVU5FUl9TRVRfVFlQRSwmYnR2LT50dW5lcl90eXBlKTsKKwlpZiAoYnR0dl9kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogJXMgaTJjIGF0dGFjaCBbYWRkcj0weCV4LGNsaWVudD0lc11cbiIsCisJCQlidHYtPmMubnIsY2xpZW50LT5kcml2ZXItPm5hbWUsY2xpZW50LT5hZGRyLAorCQkJaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CisJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKSB7CisJICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCisJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kIChjbGllbnQsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCX0KKwogCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQotCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfQ09ORklHX1BJTk5BQ0xFLAorCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsQVVEQ19DT05GSUdfUElOTkFDTEUsCiAJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOwotICAgICAgICBpZiAoYnR0dl9kZWJ1ZykKLQkJcHJpbnRrKCJidHR2JWQ6IGkyYyBhdHRhY2ggW2NsaWVudD0lc11cbiIsCi0JCSAgICAgICBidHYtPmMubnIsIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOwogICAgICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMKaW5kZXggYmRjNWNlNi4uOWVkMjFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jCkBAIC0zMzQsMTAgKzMzNCw2IEBACiAJfQogCiAJdmRlbGF5ID0gdHZub3JtLT52ZGVsYXk7Ci0jaWYgMCAvKiBGSVhNRSAqLwotCWlmICh2ZGVsYXkgPCBidHYtPnZiaS5saW5lcyoyKQotCQl2ZGVsYXkgPSBidHYtPnZiaS5saW5lcyoyOwotI2VuZGlmCiAKICAgICAgICAgeHNmID0gKHdpZHRoKnNjYWxlZHR3aWR0aCkvc3dpZHRoOwogICAgICAgICBnZW8tPmhzY2FsZSA9ICAoKHRvdGFsd2lkdGgqNDA5NlVMKS94c2YtNDA5Nik7CkBAIC03NzYsMTMgKzc3Miw4IEBACiAJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+Ym90dG9tLCBmbXQsIG92LCAwLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6Ci0jaWYgMAotCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPnRvcCwgICAgZm10LCBvdiwgMSwgMCk7Ci0JCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+Ym90dG9tLCBmbXQsIG92LCAwLCAxKTsKLSNlbHNlCiAJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+dG9wLCAgICBmbXQsIG92LCAwLCAxKTsKIAkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT5ib3R0b20sIGZtdCwgb3YsIDEsIDApOwotI2VuZGlmCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oCmluZGV4IDdiNmYxZTguLmYzMjkzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogYnR0dnAuaCx2IDEuMTcgMjAwNS8wMi8xNiAxMjoxNDoxMCBrcmF4ZWwgRXhwICQKKyAgICAkSWQ6IGJ0dHZwLmgsdiAxLjE5IDIwMDUvMDYvMTYgMjE6Mzg6NDUgbnNoIEV4cCAkCiAKICAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKIApAQCAtMzI2LDYgKzMyNiw5IEBACiAJaW50IG9wdF92Y3JfaGFjazsKIAlpbnQgb3B0X3doaXRlY3J1c2hfdXBwZXI7CiAJaW50IG9wdF93aGl0ZWNydXNoX2xvd2VyOworCWludCBvcHRfdXZfcmF0aW87CisJaW50IG9wdF9mdWxsX2x1bWFfcmFuZ2U7CisJaW50IG9wdF9jb3Jpbmc7CiAKIAkvKiByYWRpbyBkYXRhL3N0YXRlICovCiAJaW50IGhhc19yYWRpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggOTFmOGFmZS4uNGYzOTY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTY5MCwxMSArNjkwLDkgQEAKIAlpbnQgYml0cmF0ZV9tb2RlID0gMTsKIAlpbnQgYml0cmF0ZSA9IDc1MDAwMDA7CiAJaW50IGJpdHJhdGVfcGVhayA9IDc1MDAwMDA7Ci0jaWYgMQogCWJpdHJhdGVfbW9kZSA9IEJMQUNLQklSRF9WSURFT19DQlI7CiAJYml0cmF0ZSA9IDQwMDAqMTAyNDsKIAliaXRyYXRlX3BlYWsgPSA0MDAwKjEwMjQ7Ci0jZW5kaWYKIAogCS8qIGFzc2lnbiBzdHJlYW0gdHlwZSAqLwogCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIEJMQUNLQklSRF9TVFJFQU1fUFJPR1JBTSk7CkBAIC04MTAsOSArODA4LDYgQEAKIAljeF93cml0ZShNT19WQk9TX0NPTlRST0wsIDB4ODRBMDApOyAvKiBubyA2NTYgbW9kZSwgOC1iaXQgcGl4ZWxzLCBkaXNhYmxlIFZCSSAqLwogCWN4X2NsZWFyKE1PX09VVFBVVF9GT1JNQVQsIDB4MDAwOCk7IC8qIE5vcm1hbCBZLWxpbWl0cyB0byBsZXQgdGhlIG1wZWcgZW5jb2RlciBzeW5jICovCiAKLSNpZiAwIC8qIEZJWE1FICovCi0Jc2V0X3NjYWxlKGRldiwgNzIwLCA0ODAsIFY0TDJfRklFTERfSU5URVJMQUNFRCk7Ci0jZW5kaWYKIAlibGFja2JpcmRfY29kZWNfc2V0dGluZ3MoZGV2KTsKIAltc2xlZXAoMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IGIzZmIwNDMuLjNkMGM3ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtY2FyZHMuYyx2IDEuNzYgMjAwNS8wNi8wOCAwMToyODowOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtY2FyZHMuYyx2IDEuODYgMjAwNS8wNy8xNCAwMzowNjo0MyBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIGNhcmQtc3BlY2lmaWMgc3R1ZmYuCkBAIC00MDEsNyArNDAxLDcgQEAKIAkJLmR2YiAgICAgICAgICAgID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxXSA9IHsKLQkJLm5hbWUgICAgICAgICAgID0gIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQxIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQxIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBObyBhbmFsb2cgdHVuZXIgKi8KIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTQ0NSw4ICs0NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDAwMDA3ZjgsCiAgICAgICAgICAgICAgICAgfSwKIAl9LAotCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEXSA9IHsKLQkJLm5hbWUJCT0gIkRWaUNPIC0gRnVzaW9uSERUViAzIEdvbGQiLAorCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1FdID0geworCQkubmFtZQkJPSAiRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtUSIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01JQ1JPVFVORV80MDQyRkk1LAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtNDY0LDYgKzQ2NCw5IEBACiAJCSAgIEdQSU9bM10gc2VsZWN0cyBSRiBpbnB1dCBjb25uZWN0b3Igb24gdHVuZXIgbW9kdWxlCiAJCSAgICAwIC0gUkYgY29ubmVjdG9yIGxhYmVsZWQgQ0FCTEUKIAkJICAgIDEgLSBSRiBjb25uZWN0b3IgbGFiZWxlZCBBTlQKKwkJICAgR1BJT1s0XSBzZWxlY3RzIGhpZ2ggUkYgZm9yIFFBTTI1NiBtb2RlCisJCSAgICAwIC0gbm9ybWFsIFJGCisJCSAgICAxIC0gaGlnaCBSRgogCQkqLwogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLApAQCAtNDgyLDYgKzQ4NSw3IEBACiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMAk9IDB4MGYwMCwKIAkJfX0sCisJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKICAgICAgICAgW0NYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgTm92YS1UIERWQi1UIiwKQEAgLTUyMCw3ICs1MjQsNyBAQAogCQkuYmxhY2tiaXJkID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfUExVU10gPSB7Ci0JCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UIFBsdXMiLAorCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBQbHVzIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBObyBhbmFsb2cgdHVuZXIgKi8KIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTY3OCw5ICs2ODIsOSBAQAogCQkubmFtZSAgICAgICAgICAgPSAiUGl4ZWxWaWV3IFBsYXlUViBVbHRyYSBQcm8gKFN0ZXJlbykiLAogCQkvKiBNYXkgYmUgYWxzbyBUVU5FUl9ZTUVDX1RWRl81NTMzTUYgZm9yIE5UU0MvTSBvciBQQUwvTSAqLwogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKLQkJLnJhZGlvX3R5cGUgICAgID0gVFVORVJfVEVBNTc2NywKLQkJLnR1bmVyX2FkZHIJPSAweGMyPj4xLAotCQkucmFkaW9fYWRkcgk9IDB4YzA+PjEsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgPSAwLApAQCAtNzAwLDIxICs3MDQsMTcgQEAKIAkJIH0sCiAJfSwKICAgICAgICAgW0NYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkRWaUNPIC0gRnVzaW9uSERUViAzIEdvbGQtVCIsCisJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEhPTVNPTl9EVFQ3NjExLAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCi0JCS8qICBTZWUgRFZpQ08gRnVzaW9uSERUViAzIEdvbGQgZm9yIEdQSU8gZG9jdW1lbnRhdGlvbi4gICovCi0gICAgICAgICAgICAgICAgLmlucHV0ICAgICAgICAgID0ge3sKKwkJLyogIFNlZSBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1RIGZvciBHUElPIGRvY3VtZW50YXRpb24uICAqLworCQkuaW5wdXQgICAgICAgICAgPSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjBkLAogICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MGYwNSwKLSAgICAgICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKICAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MGYwMCwKQEAgLTcyMyw3ICs3MjMsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MGYwMCwKICAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKICAgICAgICAgfSwKKyAgICAgICAgW0NYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0ldID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBRFMgVGVjaCBJbnN0YW50IFRWIERWQi1UIFBDSSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDFdID0geworCQkubmFtZSAgICAgICAgICAgPSAiVGVycmFUZWMgQ2luZXJneSAxNDAwIERWQi1UIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9EVkIsCisJCQkudm11eCAgID0gMCwKKwkJfX0sCisJCS5kdmIgICAgICAgICAgICA9IDEsCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9iY291bnQgPSBBUlJBWV9TSVpFKGN4ODhfYm9hcmRzKTsKIApAQCAtNzk0LDcgKzgyMyw3IEBACiAJfSx7CiAJCS5zdWJ2ZW5kb3IgPSAweDE4YWMsCiAJCS5zdWJkZXZpY2UgPSAweGQ4MTAsCi0JCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xELAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9RLAogCX0sewogCQkuc3VidmVuZG9yID0gMHgxOGFjLAogCQkuc3ViZGV2aWNlID0gMHhkODIwLApAQCAtODQzLDcgKzg3MiwxNSBAQAogCQkuc3VidmVuZG9yID0gMHgxMGZjLAogCQkuc3ViZGV2aWNlID0gMHhkMDM1LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9JT0RBVEFfR1ZCQ1RWN0UsCi0JfQorCX0seworCQkuc3VidmVuZG9yID0gMHgxNDIxLAorCQkuc3ViZGV2aWNlID0gMHgwMzM0LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9BRFNURUNIX0RWQl9UX1BDSSwKKyAJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE1M2IsCisJCS5zdWJkZXZpY2UgPSAweDExNjYsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDEsCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9pZGNvdW50ID0gQVJSQVlfU0laRShjeDg4X3N1Ymlkcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwppbmRleCBjMDQ2YTIzLi41ZTg2OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC1jb3JlLmMsdiAxLjI4IDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAorICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMzMgMjAwNS8wNy8wNyAxNDoxNzo0NyBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCkBAIC00NzAsMjUgKzQ3MCw2IEBACiAJcmV0dXJuIGluY3JbcmlzYyA+PiAyOF0gPyBpbmNyW3Jpc2MgPj4gMjhdIDogMTsKIH0KIAotI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCwgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCi12b2lkIGN4ODhfcmlzY19kaXNhc20oc3RydWN0IGN4ODhfY29yZSAqY29yZSwKLQkJICAgICAgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYykKLXsKLQl1bnNpZ25lZCBpbnQgaSxqLG47Ci0KLQlwcmludGsoIiVzOiByaXNjIGRpc2FzbTogJXAgW2RtYT0weCUwOGx4XVxuIiwKLQkgICAgICAgY29yZS0+bmFtZSwgcmlzYy0+Y3B1LCAodW5zaWduZWQgbG9uZylyaXNjLT5kbWEpOwotCWZvciAoaSA9IDA7IGkgPCAocmlzYy0+c2l6ZSA+PiAyKTsgaSArPSBuKSB7Ci0JCXByaW50aygiJXM6ICAgJTA0ZDogIiwgY29yZS0+bmFtZSwgaSk7Ci0JCW4gPSBjeDg4X3Jpc2NfZGVjb2RlKHJpc2MtPmNwdVtpXSk7Ci0JCWZvciAoaiA9IDE7IGogPCBuOyBqKyspCi0JCQlwcmludGsoIiVzOiAgICUwNGQ6IDB4JTA4eCBbIGFyZyAjJWQgXVxuIiwKLQkJCSAgICAgICBjb3JlLT5uYW1lLCBpK2osIHJpc2MtPmNwdVtpK2pdLCBqKTsKLQkJaWYgKHJpc2MtPmNwdVtpXSA9PSBSSVNDX0pVTVApCi0JCQlicmVhazsKLQl9Ci19Ci0jZW5kaWYKIAogdm9pZCBjeDg4X3NyYW1fY2hhbm5lbF9kdW1wKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCiAJCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpCkBAIC01NTEsMjEgKzUzMiw2IEBACiAJImJyZGdfZXJyIiwgInNyY19kbWFfZXJyIiwgImRzdF9kbWFfZXJyIiwgImlwYl9kbWFfZXJyIiwKIAkiaTJjIiwgImkyY19yYWNrIiwgImlyX3NtcCIsICJncGlvMCIsICJncGlvMSIKIH07Ci1jaGFyICpjeDg4X3ZpZF9pcnFzWzMyXSA9IHsKLQkieV9yaXNjaTEiLCAidV9yaXNjaTEiLCAidl9yaXNjaTEiLCAidmJpX3Jpc2MxIiwKLQkieV9yaXNjaTIiLCAidV9yaXNjaTIiLCAidl9yaXNjaTIiLCAidmJpX3Jpc2MyIiwKLQkieV9vZmxvdyIsICAidV9vZmxvdyIsICAidl9vZmxvdyIsICAidmJpX29mbG93IiwKLQkieV9zeW5jIiwgICAidV9zeW5jIiwgICAidl9zeW5jIiwgICAidmJpX3N5bmMiLAotCSJvcGNfZXJyIiwgICJwYXJfZXJyIiwgICJyaXBfZXJyIiwgICJwY2lfYWJvcnQiLAotfTsKLWNoYXIgKmN4ODhfbXBlZ19pcnFzWzMyXSA9IHsKLQkidHNfcmlzY2kxIiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkidHNfcmlzY2kyIiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkidHNfb2Zsb3ciLCAgTlVMTCwgTlVMTCwgTlVMTCwKLQkidHNfc3luYyIsICAgTlVMTCwgTlVMTCwgTlVMTCwKLQkib3BjX2VyciIsICJwYXJfZXJyIiwgInJpcF9lcnIiLCAicGNpX2Fib3J0IiwKLQkidHNfZXJyPyIsCi19OwogCiB2b2lkIGN4ODhfcHJpbnRfaXJxYml0cyhjaGFyICpuYW1lLCBjaGFyICp0YWcsIGNoYXIgKipzdHJpbmdzLAogCQkJdTMyIGJpdHMsIHUzMiBtYXNrKQpAQCAtNjE1LDE2ICs1ODEsMTEgQEAKIAkJCWJyZWFrOwogCQlidWYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LAogCQkJCSBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKLSNpZiAwCi0JCWlmIChidWYtPmNvdW50ID4gY291bnQpCi0JCQlicmVhazsKLSNlbHNlCiAJCS8qIGNvdW50IGNvbWVzIGZyb20gdGhlIGh3IGFuZCBpcyBpcyAxNmJpdCB3aWRlIC0tCiAJCSAqIHRoaXMgdHJpY2sgaGFuZGxlcyB3cmFwLWFyb3VuZHMgY29ycmVjdGx5IGZvcgogCQkgKiB1cCB0byAzMjc2NyBidWZmZXJzIGluIGZsaWdodC4uLiAqLwogCQlpZiAoKHMxNikgKGNvdW50IC0gYnVmLT5jb3VudCkgPCAwKQogCQkJYnJlYWs7Ci0jZW5kaWYKIAkJZG9fZ2V0dGltZW9mZGF5KCZidWYtPnZiLnRzKTsKIAkJZHByaW50aygyLCJbJXAvJWRdIHdha2V1cCByZWc9JWQgYnVmPSVkXG4iLGJ1ZixidWYtPnZiLmksCiAJCQljb3VudCwgYnVmLT5jb3VudCk7CkBAIC05NTIsMTIgKzkxMywxMCBAQAogCQlub3JtLT5jeGlmb3JtYXQsIGN4X3JlYWQoTU9fSU5QVVRfRk9STUFUKSAmIDB4MGYpOwogCWN4X2FuZG9yKE1PX0lOUFVUX0ZPUk1BVCwgMHhmLCBub3JtLT5jeGlmb3JtYXQpOwogCi0jaWYgMQogCS8vIEZJWE1FOiBhcy1pcyBmcm9tIERTY2FsZXIKIAlkcHJpbnRrKDEsInNldF90dm5vcm06IE1PX09VVFBVVF9GT1JNQVQgMHglMDh4IFtvbGQ9MHglMDh4XVxuIiwKIAkJbm9ybS0+Y3hvZm9ybWF0LCBjeF9yZWFkKE1PX09VVFBVVF9GT1JNQVQpKTsKIAljeF93cml0ZShNT19PVVRQVVRfRk9STUFULCBub3JtLT5jeG9mb3JtYXQpOwotI2VuZGlmCiAKIAkvLyBNT19TQ09OVl9SRUcgPSBhZGMgY2xvY2sgLyB2aWRlbyBkZWMgY2xvY2sgKiAyXjE3CiAJdG1wNjQgID0gYWRjX2Nsb2NrICogKHU2NCkoMSA8PCAxNyk7CkBAIC0xMDA2LDIxICs5NjUsNyBAQAogCXNldF90dmF1ZGlvKGNvcmUpOwogCiAJLy8gdGVsbCBpMmMgY2hpcHMKLSNpZmRlZiBWNEwyX0kyQ19DTElFTlRTCiAJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsVklESU9DX1NfU1RELCZub3JtLT5pZCk7Ci0jZWxzZQotCXsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgYzsKLQkJbWVtc2V0KCZjLDAsc2l6ZW9mKGMpKTsKLQkJYy5jaGFubmVsID0gY29yZS0+aW5wdXQ7Ci0JCWMubm9ybSA9IFZJREVPX01PREVfUEFMOwotCQlpZiAoKG5vcm0tPmlkICYgKFY0TDJfU1REX05UU0NfTXxWNEwyX1NURF9OVFNDX01fSlApKSkKLQkJCWMubm9ybSA9IFZJREVPX01PREVfTlRTQzsKLQkJaWYgKG5vcm0tPmlkICYgVjRMMl9TVERfU0VDQU0pCi0JCQljLm5vcm0gPSBWSURFT19NT0RFX1NFQ0FNOwotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NTQ0hBTiwmYyk7Ci0JfQotI2VuZGlmCiAKIAkvLyBkb25lCiAJcmV0dXJuIDA7CkBAIC0xMjMwLDggKzExNzUsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEVYUE9SVF9TWU1CT0woY3g4OF9wcmludF9pb2N0bCk7Ci1FWFBPUlRfU1lNQk9MKGN4ODhfdmlkX2lycXMpOwotRVhQT1JUX1NZTUJPTChjeDg4X21wZWdfaXJxcyk7CiBFWFBPUlRfU1lNQk9MKGN4ODhfcHJpbnRfaXJxYml0cyk7CiAKIEVYUE9SVF9TWU1CT0woY3g4OF9jb3JlX2lycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDFhMjU5YzMuLjZhZDE0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC1kdmIuYyx2IDEuMzMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtZHZiLmMsdiAxLjQyIDIwMDUvMDcvMTIgMTU6NDQ6NTUgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiBNUEVHIFRyYW5zcG9ydCBTdHJlYW0gKERWQikgcm91dGluZXMKQEAgLTMwLDIwICszMCwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKLS8qIHRob3NlIHR3byBmcm9udGVuZHMgbmVlZCBtZXJnaW5nIHZpYSBsaW51eHR2IGN2cyAuLi4gKi8KLSNkZWZpbmUgSEFWRV9DWDIyNzAyIDEKLSNkZWZpbmUgSEFWRV9PUjUxMTMyIDEKKyNkZWZpbmUgQ09ORklHX0RWQl9NVDM1MiAxCisjZGVmaW5lIENPTkZJR19EVkJfQ1gyMjcwMiAxCisjZGVmaW5lIENPTkZJR19EVkJfT1I1MTEzMiAxCisjZGVmaW5lIENPTkZJR19EVkJfTEdEVDMzMDIgMQogCiAjaW5jbHVkZSAiY3g4OC5oIgogI2luY2x1ZGUgImR2Yi1wbGwuaCIKLSNpbmNsdWRlICJtdDM1Mi5oIgotI2luY2x1ZGUgIm10MzUyX3ByaXYuaCIKLSNpZiBIQVZFX0NYMjI3MDIKKworI2lmIENPTkZJR19EVkJfTVQzNTIKKyMgaW5jbHVkZSAibXQzNTIuaCIKKyMgaW5jbHVkZSAibXQzNTJfcHJpdi5oIgorI2VuZGlmCisjaWYgQ09ORklHX0RWQl9DWDIyNzAyCiAjIGluY2x1ZGUgImN4MjI3MDIuaCIKICNlbmRpZgotI2lmIEhBVkVfT1I1MTEzMgorI2lmIENPTkZJR19EVkJfT1I1MTEzMgogIyBpbmNsdWRlICJvcjUxMTMyLmgiCiAjZW5kaWYKKyNpZiBDT05GSUdfRFZCX0xHRFQzMzAyCisjIGluY2x1ZGUgImxnZHQzMzAyLmgiCisjZW5kaWYKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOwpAQCAtMTAwLDYgKzEwNyw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisjaWYgQ09ORklHX0RWQl9NVDM1Mgogc3RhdGljIGludCBkdmljb19mdXNpb25oZHR2X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RhdGljIHU4IGNsb2NrX2NvbmZpZyBbXSAgPSB7IENMT0NLX0NUTCwgIDB4MzgsIDB4MzkgfTsKQEAgLTE2NywyMiArMTc1LDI1IEBACiAJLmRlbW9kX2luaXQgICAgPSBkbnR2X2xpdmVfZHZidF9kZW1vZF9pbml0LAogCS5wbGxfc2V0ICAgICAgID0gbXQzNTJfcGxsX3NldCwKIH07CisjZW5kaWYKIAotI2lmIEhBVkVfQ1gyMjcwMgorI2lmIENPTkZJR19EVkJfQ1gyMjcwMgogc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg0MywKKwkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKIAkucGxsX2FkZHJlc3MgICA9IDB4NjAsCiAJLnBsbF9kZXNjICAgICAgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1NzksCiB9OwogCiBzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGhhdXBwYXVnZV9ub3ZhdF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDQzLAorCS5vdXRwdXRfbW9kZSAgID0gQ1gyMjcwMl9TRVJJQUxfT1VUUFVULAogCS5wbGxfYWRkcmVzcyAgID0gMHg2MSwKIAkucGxsX2Rlc2MgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU5eCwKIH07CiAjZW5kaWYKIAotI2lmIEhBVkVfT1I1MTEzMgorI2lmIENPTkZJR19EVkJfT1I1MTEzMgogc3RhdGljIGludCBvcjUxMTMyX3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQlpbnQgaXNfcHVuY3R1cmVkKQogewpAQCAtMTk5LDYgKzIxMCwzMiBAQAogfTsKICNlbmRpZgogCisjaWYgQ09ORklHX0RWQl9MR0RUMzMwMgorc3RhdGljIGludCBsZ2R0MzMwMl9zZXRfdHNfcGFyYW0oc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKKwlpZiAoaXNfcHVuY3R1cmVkKQorCQlkZXYtPnRzX2dlbl9jbnRybCB8PSAweDA0OworCWVsc2UKKwkJZGV2LT50c19nZW5fY250cmwgJj0gfjB4MDQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnIGZ1c2lvbmhkdHZfM19nb2xkX3EgPSB7CisJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAorCS5wbGxfYWRkcmVzcyAgICAgID0gMHg2MSwKKwkucGxsX2Rlc2MgICAgICAgICA9ICZkdmJfcGxsX21pY3JvdHVuZV80MDQyLAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMDJfc2V0X3RzX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBsZ2R0MzMwMl9jb25maWcgZnVzaW9uaGR0dl8zX2dvbGRfdCA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCisJLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAorCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExLAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMDJfc2V0X3RzX3BhcmFtLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLwpAQCAtMjA3LDE2ICsyNDQsMTggQEAKIAogCS8qIGluaXQgZnJvbnRlbmQgKi8KIAlzd2l0Y2ggKGRldi0+Y29yZS0+Ym9hcmQpIHsKLSNpZiBIQVZFX0NYMjI3MDIKKyNpZiBDT05GSUdfRFZCX0NYMjI3MDIKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX25vdmF0X2NvbmZpZywKIAkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDE6CiAJY2FzZSBDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmY29ubmV4YW50X3JlZmJvYXJkX2NvbmZpZywKIAkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJYnJlYWs7CiAjZW5kaWYKKyNpZiBDT05GSUdfRFZCX01UMzUyCiAJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxOgogCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MTsKIAkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX2xnX3oyMDE7CkBAIC0yMzEsMTcgKzI3MCw0OSBAQAogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UOgogCWNhc2UgQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1Q6CisJY2FzZSBDWDg4X0JPQVJEX0FEU1RFQ0hfRFZCX1RfUENJOgogCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MTsKIAkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Vua25vd25fMTsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBtdDM1Ml9hdHRhY2goJmRudHZfbGl2ZV9kdmJ0X2NvbmZpZywKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWJyZWFrOwotI2lmIEhBVkVfT1I1MTEzMgorI2VuZGlmCisjaWYgQ09ORklHX0RWQl9PUjUxMTMyCiAJY2FzZSBDWDg4X0JPQVJEX1BDSERUVl9IRDMwMDA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gb3I1MTEzMl9hdHRhY2goJnBjaGR0dl9oZDMwMDAsCiAJCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKICNlbmRpZgorI2lmIENPTkZJR19EVkJfTEdEVDMzMDIKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUToKKwkJZGV2LT50c19nZW5fY250cmwgPSAweDA4OworCQl7CisJCS8qIERvIGEgaGFyZHdhcmUgcmVzZXQgb2YgY2hpcCBiZWZvcmUgdXNpbmcgaXQuICovCisJCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkJY3hfY2xlYXIoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDEwMCk7CisJCWN4X3NldChNT19HUDBfSU8sIDkpOyAvLyBBTlQgY29ubmVjdG9yIHRvbyBGSVhNRQorCQltZGVsYXkoMjAwKTsKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBsZ2R0MzMwMl9hdHRhY2goJmZ1c2lvbmhkdHZfM19nb2xkX3EsCisJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UOgorCQlkZXYtPnRzX2dlbl9jbnRybCA9IDB4MDg7CisJCXsKKwkJLyogRG8gYSBoYXJkd2FyZSByZXNldCBvZiBjaGlwIGJlZm9yZSB1c2luZyBpdC4gKi8KKwkJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCQljeF9jbGVhcihNT19HUDBfSU8sIDEpOworCQltZGVsYXkoMTAwKTsKKwkJY3hfc2V0KE1PX0dQMF9JTywgOSk7IC8qIEFOVCBjb25uZWN0b3IgdG9vIEZJWE1FICovCisJCW1kZWxheSgyMDApOworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzAyX2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGRfdCwKKwkJCQkJCSAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCiAJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwppbmRleCBlMjBhZGVmLi44NDAzYzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBjeDg4LWkyYy5jLHYgMS4yMyAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKKyAgICAkSWQ6IGN4ODgtaTJjLmMsdiAxLjI4IDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAKICAgICBjeDg4LWkyYy5jICAtLSAgYWxsIHRoZSBpMmMgY29kZSBpcyBoZXJlCiAKQEAgLTkxLDI1ICs5MSwzMiBAQAogCiBzdGF0aWMgaW50IGF0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLSAgICAgICAgc3RydWN0IHR1bmVyX2FkZHIgdHVuX2FkZHI7CisgICAgICAgIHN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKIAotCWRwcmludGsoMSwgImkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAotCQljbGllbnQtPmFkZHIsIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCWRwcmludGsoMSwgIiVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAorCQljbGllbnQtPmRyaXZlci0+bmFtZSxjbGllbnQtPmFkZHIsaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CiAJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKIAkJcmV0dXJuIDA7CiAKICAgICAgICAgaWYgKGNvcmUtPnJhZGlvX3R5cGUgIT0gVU5TRVQpIHsKLSAgICAgICAgICAgICAgICB0dW5fYWRkci52NGwyX3R1bmVyID0gVjRMMl9UVU5FUl9SQURJTzsKLSAgICAgICAgICAgICAgICB0dW5fYWRkci50eXBlID0gY29yZS0+cmFkaW9fdHlwZTsKLSAgICAgICAgICAgICAgICB0dW5fYWRkci5hZGRyID0gY29yZS0+cmFkaW9fYWRkcjsKLSAgICAgICAgICAgICAgICBjbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9hZGRyKTsKKwkJaWYgKChjb3JlLT5yYWRpb19hZGRyPT1BRERSX1VOU0VUKXx8KGNvcmUtPnJhZGlvX2FkZHI9PWNsaWVudC0+YWRkcikpIHsKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPOworCQkJdHVuX3NldHVwLnR5cGUgPSBjb3JlLT5yYWRpb190eXBlOworCQkJdHVuX3NldHVwLmFkZHIgPSBjb3JlLT5yYWRpb19hZGRyOworCisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZCAoY2xpZW50LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwkJfQogICAgICAgICB9CiAgICAgICAgIGlmIChjb3JlLT50dW5lcl90eXBlICE9IFVOU0VUKSB7Ci0gICAgICAgICAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotICAgICAgICAgICAgICAgIHR1bl9hZGRyLnR5cGUgPSBjb3JlLT50dW5lcl90eXBlOwotICAgICAgICAgICAgICAgIHR1bl9hZGRyLmFkZHIgPSBjb3JlLT50dW5lcl9hZGRyOwotICAgICAgICAgICAgICAgIGNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX2FkZHIpOworCQlpZiAoKGNvcmUtPnR1bmVyX2FkZHI9PUFERFJfVU5TRVQpfHwoY29yZS0+dHVuZXJfYWRkcj09Y2xpZW50LT5hZGRyKSkgeworCisJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFY7CisJCQl0dW5fc2V0dXAudHlwZSA9IGNvcmUtPnR1bmVyX3R5cGU7CisJCQl0dW5fc2V0dXAuYWRkciA9IGNvcmUtPnR1bmVyX2FkZHI7CisKKwkJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kIChjbGllbnQsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CisJCX0KICAgICAgICAgfQogCiAJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKQEAgLTE1Nyw2ICsxNjQsNyBAQAogfTsKIAogc3RhdGljIGNoYXIgKmkyY19kZXZzWzEyOF0gPSB7CisJWyAweDFjID4+IDEgXSA9ICJsZ2R0MzMwMiIsCiAJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3L2N4MjI3MDIiLAogCVsgMHhhMCA+PiAxIF0gPSAiZWVwcm9tIiwKIAlbIDB4YzAgPj4gMSBdID0gInR1bmVyIChhbmFsb2cpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IGRjMGRjZjIuLjIxNDg4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtaW5wdXQuYyx2IDEuMTEgMjAwNS8wNS8yMiAyMDo1Nzo1NiBuc2ggRXhwICQKKyAqICRJZDogY3g4OC1pbnB1dC5jLHYgMS4xNSAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKICAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBHUElPIGF0dGFjaGVkIHJlbW90ZSBjb250cm9sIGludGVyZmFjZXMKICAqIG9uIENvbmV4YW50IDIzODh4IGJhc2VkIFRWL0RWQiBjYXJkcy4KQEAgLTM4LDExOSArMzgsMjA2IEBACiAKIC8qIERpZ2l0YWxOb3cgRE5UViBMaXZlIERWQi1UIFJlbW90ZSAqLwogc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJfdFtJUl9LRVlUQUJfU0laRV0gPSB7Ci0JWyAweDAwIF0gPSBLRVlfRVNDLCAgICAgICAgIC8vICdnbyB1cCBhIGxldmVsPycKLQlbIDB4MDEgXSA9IEtFWV9LUDEsICAgICAgICAgLy8gJzEnCi0JWyAweDAyIF0gPSBLRVlfS1AyLCAgICAgICAgIC8vICcyJwotCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAvLyAnMycKLQlbIDB4MDQgXSA9IEtFWV9LUDQsICAgICAgICAgLy8gJzQnCi0JWyAweDA1IF0gPSBLRVlfS1A1LCAgICAgICAgIC8vICc1JwotCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAvLyAnNicKLQlbIDB4MDcgXSA9IEtFWV9LUDcsICAgICAgICAgLy8gJzcnCi0JWyAweDA4IF0gPSBLRVlfS1A4LCAgICAgICAgIC8vICc4JwotCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAvLyAnOScKLQlbIDB4MGEgXSA9IEtFWV9LUDAsICAgICAgICAgLy8gJzAnCi0JWyAweDBiIF0gPSBLRVlfVFVORVIsICAgICAgIC8vICd0di9mbScKLQlbIDB4MGMgXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gJ3NjYW4nCi0JWyAweDBkIF0gPSBLRVlfU1RPUCwgICAgICAgIC8vICdzdG9wJwotCVsgMHgwZSBdID0gS0VZX1BBVVNFLCAgICAgICAvLyAncGF1c2UnCi0JWyAweDBmIF0gPSBLRVlfTElTVCwgICAgICAgIC8vICdzb3VyY2UnCisJWzB4MDBdID0gS0VZX0VTQywJCS8qICdnbyB1cCBhIGxldmVsPycgKi8KKwkvKiBLZXlzIDAgdG8gOSAqLworCVsweDBhXSA9IEtFWV9LUDAsCisJWzB4MDFdID0gS0VZX0tQMSwKKwlbMHgwMl0gPSBLRVlfS1AyLAorCVsweDAzXSA9IEtFWV9LUDMsCisJWzB4MDRdID0gS0VZX0tQNCwKKwlbMHgwNV0gPSBLRVlfS1A1LAorCVsweDA2XSA9IEtFWV9LUDYsCisJWzB4MDddID0gS0VZX0tQNywKKwlbMHgwOF0gPSBLRVlfS1A4LAorCVsweDA5XSA9IEtFWV9LUDksCiAKLQlbIDB4MTAgXSA9IEtFWV9NVVRFLCAgICAgICAgLy8gJ211dGUnCi0JWyAweDExIF0gPSBLRVlfUkVXSU5ELCAgICAgIC8vICdiYWNrd2FyZCA8PCcKLQlbIDB4MTIgXSA9IEtFWV9QT1dFUiwgICAgICAgLy8gJ3Bvd2VyJwotCVsgMHgxMyBdID0gS0VZX1MsICAgICAgICAgICAvLyAnc25hcCcKLQlbIDB4MTQgXSA9IEtFWV9BVURJTywgICAgICAgLy8gJ3N0ZXJlbycKLQlbIDB4MTUgXSA9IEtFWV9DTEVBUiwgICAgICAgLy8gJ3Jlc2V0JwotCVsgMHgxNiBdID0gS0VZX1BMQVksICAgICAgICAvLyAncGxheScKLQlbIDB4MTcgXSA9IEtFWV9FTlRFUiwgICAgICAgLy8gJ2VudGVyJwotCVsgMHgxOCBdID0gS0VZX1pPT00sICAgICAgICAvLyAnZnVsbCBzY3JlZW4nCi0JWyAweDE5IF0gPSBLRVlfRkFTVEZPUldBUkQsIC8vICdmb3J3YXJkID4+JwotCVsgMHgxYSBdID0gS0VZX0NIQU5ORUxVUCwgICAvLyAnY2hhbm5lbCArJwotCVsgMHgxYiBdID0gS0VZX1ZPTFVNRVVQLCAgICAvLyAndm9sdW1lICsnCi0JWyAweDFjIF0gPSBLRVlfSU5GTywgICAgICAgIC8vICdwcmV2aWV3JwotCVsgMHgxZCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyAncmVjb3JkJwotCVsgMHgxZSBdID0gS0VZX0NIQU5ORUxET1dOLCAvLyAnY2hhbm5lbCAtJwotCVsgMHgxZiBdID0gS0VZX1ZPTFVNRURPV04sICAvLyAndm9sdW1lIC0nCisJWzB4MGJdID0gS0VZX1RVTkVSLAkJLyogdHYvZm0gKi8KKwlbMHgwY10gPSBLRVlfU0VBUkNILAkJLyogc2NhbiAqLworCVsweDBkXSA9IEtFWV9TVE9QLAorCVsweDBlXSA9IEtFWV9QQVVTRSwKKwlbMHgwZl0gPSBLRVlfTElTVCwJCS8qIHNvdXJjZSAqLworCisJWzB4MTBdID0gS0VZX01VVEUsCisJWzB4MTFdID0gS0VZX1JFV0lORCwJCS8qIGJhY2t3YXJkIDw8ICovCisJWzB4MTJdID0gS0VZX1BPV0VSLAorCVsweDEzXSA9IEtFWV9TLAkJCS8qIHNuYXAgKi8KKwlbMHgxNF0gPSBLRVlfQVVESU8sCQkvKiBzdGVyZW8gKi8KKwlbMHgxNV0gPSBLRVlfQ0xFQVIsCQkvKiByZXNldCAqLworCVsweDE2XSA9IEtFWV9QTEFZLAorCVsweDE3XSA9IEtFWV9FTlRFUiwKKwlbMHgxOF0gPSBLRVlfWk9PTSwJCS8qIGZ1bGwgc2NyZWVuICovCisJWzB4MTldID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWzB4MWFdID0gS0VZX0NIQU5ORUxVUCwKKwlbMHgxYl0gPSBLRVlfVk9MVU1FVVAsCisJWzB4MWNdID0gS0VZX0lORk8sCQkvKiBwcmV2aWV3ICovCisJWzB4MWRdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZCAqLworCVsweDFlXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbMHgxZl0gPSBLRVlfVk9MVU1FRE9XTiwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogSU8tREFUQSBCQ1RWN0UgUmVtb3RlICovCiBzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfaW9kYXRhX2JjdHY3ZVtJUl9LRVlUQUJfU0laRV0gPSB7Ci0JWyAweDQwIF0gPSBLRVlfVFYsICAgICAgICAgICAgICAvLyBUVgotCVsgMHgyMCBdID0gS0VZX1JBRElPLCAgICAgICAgICAgLy8gRk0KLQlbIDB4NjAgXSA9IEtFWV9FUEcsICAgICAgICAgICAgIC8vIEVQRwotCVsgMHgwMCBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gcG93ZXIKKwlbMHg0MF0gPSBLRVlfVFYsCisJWzB4MjBdID0gS0VZX1JBRElPLAkJLyogRk0gKi8KKwlbMHg2MF0gPSBLRVlfRVBHLAorCVsweDAwXSA9IEtFWV9QT1dFUiwKIAotCVsgMHg1MCBdID0gS0VZX0tQMSwgICAgICAgICAgICAgLy8gMQotCVsgMHgzMCBdID0gS0VZX0tQMiwgICAgICAgICAgICAgLy8gMgotCVsgMHg3MCBdID0gS0VZX0tQMywgICAgICAgICAgICAgLy8gMwotCVsgMHgxMCBdID0gS0VZX0wsICAgICAgICAgICAgICAgLy8gTGl2ZQorCS8qIEtleXMgMCB0byA5ICovCisJWzB4NDRdID0gS0VZX0tQMCwJCS8qIDEwICovCisJWzB4NTBdID0gS0VZX0tQMSwKKwlbMHgzMF0gPSBLRVlfS1AyLAorCVsweDcwXSA9IEtFWV9LUDMsCisJWzB4NDhdID0gS0VZX0tQNCwKKwlbMHgyOF0gPSBLRVlfS1A1LAorCVsweDY4XSA9IEtFWV9LUDYsCisJWzB4NThdID0gS0VZX0tQNywKKwlbMHgzOF0gPSBLRVlfS1A4LAorCVsweDc4XSA9IEtFWV9LUDksCiAKLQlbIDB4NDggXSA9IEtFWV9LUDQsICAgICAgICAgICAgIC8vIDQKLQlbIDB4MjggXSA9IEtFWV9LUDUsICAgICAgICAgICAgIC8vIDUKLQlbIDB4NjggXSA9IEtFWV9LUDYsICAgICAgICAgICAgIC8vIDYKLQlbIDB4MDggXSA9IEtFWV9ULCAgICAgICAgICAgICAgIC8vIFRpbWUgU2hpZnQKKwlbMHgxMF0gPSBLRVlfTCwJCQkvKiBMaXZlICovCisJWzB4MDhdID0gS0VZX1QsCQkJLyogVGltZSBTaGlmdCAqLwogCi0JWyAweDU4IF0gPSBLRVlfS1A3LCAgICAgICAgICAgICAvLyA3Ci0JWyAweDM4IF0gPSBLRVlfS1A4LCAgICAgICAgICAgICAvLyA4Ci0JWyAweDc4IF0gPSBLRVlfS1A5LCAgICAgICAgICAgICAvLyA5Ci0JWyAweDE4IF0gPSBLRVlfUExBWVBBVVNFLCAgICAgICAvLyBQbGF5CisJWzB4MThdID0gS0VZX1BMQVlQQVVTRSwJCS8qIFBsYXkgKi8KIAotCVsgMHg0NCBdID0gS0VZX0tQMCwgICAgICAgICAgICAgLy8gMTAKLQlbIDB4MjQgXSA9IEtFWV9FTlRFUiwgICAgICAgICAgIC8vIDExCi0JWyAweDY0IF0gPSBLRVlfRVNDLCAgICAgICAgICAgICAvLyAxMgotCVsgMHgwNCBdID0gS0VZX00sICAgICAgICAgICAgICAgLy8gTXVsdGkKKwlbMHgyNF0gPSBLRVlfRU5URVIsCQkvKiAxMSAqLworCVsweDY0XSA9IEtFWV9FU0MsCQkvKiAxMiAqLworCVsweDA0XSA9IEtFWV9NLAkJCS8qIE11bHRpICovCiAKLQlbIDB4NTQgXSA9IEtFWV9WSURFTywgICAgICAgICAgIC8vIFZJREVPCi0JWyAweDM0IF0gPSBLRVlfQ0hBTk5FTFVQLCAgICAgICAvLyBjaGFubmVsICsKLQlbIDB4NzQgXSA9IEtFWV9WT0xVTUVVUCwgICAgICAgIC8vIHZvbHVtZSArCi0JWyAweDE0IF0gPSBLRVlfTVVURSwgICAgICAgICAgICAvLyBNdXRlCisJWzB4NTRdID0gS0VZX1ZJREVPLAorCVsweDM0XSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4NzRdID0gS0VZX1ZPTFVNRVVQLAorCVsweDE0XSA9IEtFWV9NVVRFLAogCi0JWyAweDRjIF0gPSBLRVlfUywgICAgICAgICAgICAgICAvLyBTVklERU8KLQlbIDB4MmMgXSA9IEtFWV9DSEFOTkVMRE9XTiwgICAgIC8vIGNoYW5uZWwgLQotCVsgMHg2YyBdID0gS0VZX1ZPTFVNRURPV04sICAgICAgLy8gdm9sdW1lIC0KLQlbIDB4MGMgXSA9IEtFWV9aT09NLCAgICAgICAgICAgIC8vIFpvb20KKwlbMHg0Y10gPSBLRVlfUywJCQkvKiBTVklERU8gKi8KKwlbMHgyY10gPSBLRVlfQ0hBTk5FTERPV04sCisJWzB4NmNdID0gS0VZX1ZPTFVNRURPV04sCisJWzB4MGNdID0gS0VZX1pPT00sCiAKLQlbIDB4NWMgXSA9IEtFWV9QQVVTRSwgICAgICAgICAgIC8vIHBhdXNlCi0JWyAweDNjIF0gPSBLRVlfQywgICAgICAgICAgICAgICAvLyB8fCAocmVkKQotCVsgMHg3YyBdID0gS0VZX1JFQ09SRCwgICAgICAgICAgLy8gcmVjb3JkaW5nCi0JWyAweDFjIF0gPSBLRVlfU1RPUCwgICAgICAgICAgICAvLyBzdG9wCisJWzB4NWNdID0gS0VZX1BBVVNFLAorCVsweDNjXSA9IEtFWV9DLAkJCS8qIHx8IChyZWQpICovCisJWzB4N2NdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZGluZyAqLworCVsweDFjXSA9IEtFWV9TVE9QLAogCi0JWyAweDQxIF0gPSBLRVlfUkVXSU5ELCAgICAgICAgICAvLyBiYWNrd2FyZCA8PAotCVsgMHgyMSBdID0gS0VZX1BMQVksICAgICAgICAgICAgLy8gcGxheQotCVsgMHg2MSBdID0gS0VZX0ZBU1RGT1JXQVJELCAgICAgLy8gZm9yd2FyZCA+PgotCVsgMHgwMSBdID0gS0VZX05FWFQsICAgICAgICAgICAgLy8gc2tpcCA+fAorCVsweDQxXSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsweDIxXSA9IEtFWV9QTEFZLAorCVsweDYxXSA9IEtFWV9GQVNURk9SV0FSRCwJLyogZm9yd2FyZCA+PiAqLworCVsweDAxXSA9IEtFWV9ORVhULAkJLyogc2tpcCA+fCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBBRFMgVGVjaCBJbnN0YW50IFRWIERWQi1UIFBDSSBSZW1vdGUgKi8KK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hZHN0ZWNoX2R2Yl90X3BjaVtJUl9LRVlUQUJfU0laRV0gPSB7CisJLyogS2V5cyAwIHRvIDkgKi8KKwlbMHg0ZF0gPSBLRVlfMCwKKwlbMHg1N10gPSBLRVlfMSwKKwlbMHg0Zl0gPSBLRVlfMiwKKwlbMHg1M10gPSBLRVlfMywKKwlbMHg1Nl0gPSBLRVlfNCwKKwlbMHg0ZV0gPSBLRVlfNSwKKwlbMHg1ZV0gPSBLRVlfNiwKKwlbMHg1NF0gPSBLRVlfNywKKwlbMHg0Y10gPSBLRVlfOCwKKwlbMHg1Y10gPSBLRVlfOSwKKworCVsweDViXSA9IEtFWV9QT1dFUiwKKwlbMHg1Zl0gPSBLRVlfTVVURSwKKwlbMHg1NV0gPSBLRVlfR09UTywKKwlbMHg1ZF0gPSBLRVlfU0VBUkNILAorCVsweDE3XSA9IEtFWV9FUEcsCQkvKiBHdWlkZSAqLworCVsweDFmXSA9IEtFWV9NRU5VLAorCVsweDBmXSA9IEtFWV9VUCwKKwlbMHg0Nl0gPSBLRVlfRE9XTiwKKwlbMHgxNl0gPSBLRVlfTEVGVCwKKwlbMHgxZV0gPSBLRVlfUklHSFQsCisJWzB4MGVdID0gS0VZX1NFTEVDVCwJCS8qIEVudGVyICovCisJWzB4NWFdID0gS0VZX0lORk8sCisJWzB4NTJdID0gS0VZX0VYSVQsCisJWzB4NTldID0gS0VZX1BSRVZJT1VTLAorCVsweDUxXSA9IEtFWV9ORVhULAorCVsweDU4XSA9IEtFWV9SRVdJTkQsCisJWzB4NTBdID0gS0VZX0ZPUldBUkQsCisJWzB4NDRdID0gS0VZX1BMQVlQQVVTRSwKKwlbMHgwN10gPSBLRVlfU1RPUCwKKwlbMHgxYl0gPSBLRVlfUkVDT1JELAorCVsweDEzXSA9IEtFWV9UVU5FUiwJCS8qIExpdmUgKi8KKwlbMHgwYV0gPSBLRVlfQSwKKwlbMHgxMl0gPSBLRVlfQiwKKwlbMHgwM10gPSBLRVlfUFJPRzEsCQkvKiAxICovCisJWzB4MDFdID0gS0VZX1BST0cyLAkJLyogMiAqLworCVsweDAwXSA9IEtFWV9QUk9HMywJCS8qIDMgKi8KKwlbMHgwNl0gPSBLRVlfRFZELAorCVsweDQ4XSA9IEtFWV9BVVgsCQkvKiBQaG90byAqLworCVsweDQwXSA9IEtFWV9WSURFTywKKwlbMHgxOV0gPSBLRVlfQVVESU8sCQkvKiBNdXNpYyAqLworCVsweDBiXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MDhdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDE1XSA9IEtFWV9WT0xVTUVVUCwKKwlbMHgxY10gPSBLRVlfVk9MVU1FRE9XTiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTVNJIFRWQG55d2hlcmUgcmVtb3RlICovCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfbXNpX3R2YW55d2hlcmVbSVJfS0VZVEFCX1NJWkVdID0geworCS8qIEtleXMgMCB0byA5ICovCisJWzB4MDBdID0gS0VZXzAsCisJWzB4MDFdID0gS0VZXzEsCisJWzB4MDJdID0gS0VZXzIsCisJWzB4MDNdID0gS0VZXzMsCisJWzB4MDRdID0gS0VZXzQsCisJWzB4MDVdID0gS0VZXzUsCisJWzB4MDZdID0gS0VZXzYsCisJWzB4MDddID0gS0VZXzcsCisJWzB4MDhdID0gS0VZXzgsCisJWzB4MDldID0gS0VZXzksCisKKwlbMHgwY10gPSBLRVlfTVVURSwKKwlbMHgwZl0gPSBLRVlfU0NSRUVOLAkJLyogRnVsbCBTY3JlZW4gKi8KKwlbMHgxMF0gPSBLRVlfRiwJCQkvKiBGdW50aW9uICovCisJWzB4MTFdID0gS0VZX1QsCQkJLyogVGltZSBzaGlmdCAqLworCVsweDEyXSA9IEtFWV9QT1dFUiwKKwlbMHgxM10gPSBLRVlfTUVESUEsCQkvKiBNVFMgKi8KKwlbMHgxNF0gPSBLRVlfU0xPVywKKwlbMHgxNl0gPSBLRVlfUkVXSU5ELAkJLyogYmFja3dhcmQgPDwgKi8KKwlbMHgxN10gPSBLRVlfRU5URVIsCQkvKiBSZXR1cm4gKi8KKwlbMHgxOF0gPSBLRVlfRkFTVEZPUldBUkQsCS8qIGZvcndhcmQgPj4gKi8KKwlbMHgxYV0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDFiXSA9IEtFWV9WT0xVTUVVUCwKKwlbMHgxZV0gPSBLRVlfQ0hBTk5FTERPV04sCisJWzB4MWZdID0gS0VZX1ZPTFVNRURPV04sCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCBjeDg4X0lSIHsKLQlzdHJ1Y3QgY3g4OF9jb3JlCSpjb3JlOwotCXN0cnVjdCBpbnB1dF9kZXYgICAgICAgIGlucHV0OwotCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAgIGlyOwotCWNoYXIgICAgICAgICAgICAgICAgICAgIG5hbWVbMzJdOwotCWNoYXIgICAgICAgICAgICAgICAgICAgIHBoeXNbMzJdOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CisJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKKwlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgaXI7CisJY2hhciBuYW1lWzMyXTsKKwljaGFyIHBoeXNbMzJdOwogCiAJLyogc2FtcGxlIGZyb20gZ3BpbyBwaW4gMTYgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzE2XTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzY291bnQ7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgcmVsZWFzZTsKKwlpbnQgc2FtcGxpbmc7CisJdTMyIHNhbXBsZXNbMTZdOworCWludCBzY291bnQ7CisJdW5zaWduZWQgbG9uZyByZWxlYXNlOwogCiAJLyogcG9sbCBleHRlcm5hbCBkZWNvZGVyICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgcG9sbGluZzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHRpbWVyOwotCXUzMgkJCWdwaW9fYWRkcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBsYXN0X2dwaW87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXljb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5ZG93bjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleXVwOworCWludCBwb2xsaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXUzMiBncGlvX2FkZHI7CisJdTMyIGxhc3RfZ3BpbzsKKwl1MzIgbWFza19rZXljb2RlOworCXUzMiBtYXNrX2tleWRvd247CisJdTMyIG1hc2tfa2V5dXA7CiB9OwogCiBzdGF0aWMgaW50IGlyX2RlYnVnID0gMDsKLW1vZHVsZV9wYXJhbShpcl9kZWJ1ZywgaW50LCAwNjQ0KTsgICAgLyogZGVidWcgbGV2ZWwgW0lSXSAqLworbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwkvKiBkZWJ1ZyBsZXZlbCBbSVJdICovCiBNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtJUl0iKTsKIAogI2RlZmluZSBpcl9kcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoaXJfZGVidWcpIFwKQEAgLTE3NCwzNyArMjYxLDM3IEBACiAJLyogZXh0cmFjdCBkYXRhICovCiAJZGF0YSA9IGlyX2V4dHJhY3RfYml0cyhncGlvLCBpci0+bWFza19rZXljb2RlKTsKIAlpcl9kcHJpbnRrKCJpcnEgZ3Bpbz0weCV4IGNvZGU9JWQgfCAlcyVzJXNcbiIsCi0JCWdwaW8sIGRhdGEsCi0JCWlyLT5wb2xsaW5nICAgICAgICAgICAgICAgPyAicG9sbCIgIDogImlycSIsCi0JCShncGlvICYgaXItPm1hc2tfa2V5ZG93bikgPyAiIGRvd24iIDogIiIsCi0JCShncGlvICYgaXItPm1hc2tfa2V5dXApICAgPyAiIHVwIiAgIDogIiIpOworCQkgICBncGlvLCBkYXRhLAorCQkgICBpci0+cG9sbGluZyA/ICJwb2xsIiA6ICJpcnEiLAorCQkgICAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pID8gIiBkb3duIiA6ICIiLAorCQkgICAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSA/ICIgdXAiIDogIiIpOwogCiAJaWYgKGlyLT5tYXNrX2tleWRvd24pIHsKIAkJLyogYml0IHNldCBvbiBrZXlkb3duICovCiAJCWlmIChncGlvICYgaXItPm1hc2tfa2V5ZG93bikgewotCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CiAJCX0gZWxzZSB7Ci0JCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCZpci0+aXIpOworCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwgJmlyLT5pcik7CiAJCX0KIAogCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5dXApIHsKIAkJLyogYml0IGNsZWFyZWQgb24ga2V5ZG93biAqLwogCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkgewotCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CiAJCX0gZWxzZSB7Ci0JCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCZpci0+aXIpOworCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwgJmlyLT5pcik7CiAJCX0KIAogCX0gZWxzZSB7CiAJCS8qIGNhbid0IGRpc3Rpbmd1aXNoIGtleWRvd24vdXAgOi0vICovCi0JCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwmaXItPmlyLGRhdGEsZGF0YSk7Ci0JCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CisJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsICZpci0+aXIpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgaXJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBjeDg4X0lSICppciA9IChzdHJ1Y3QgY3g4OF9JUiopZGF0YTsKKwlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSAoc3RydWN0IGN4ODhfSVIgKilkYXRhOwogCiAJc2NoZWR1bGVfd29yaygmaXItPndvcmspOwogfQpAQCAtMjI3LDQ3ICszMTQsNjEgQEAKIAlJUl9LRVlUQUJfVFlQRSAqaXJfY29kZXMgPSBOVUxMOwogCWludCBpcl90eXBlID0gSVJfVFlQRV9PVEhFUjsKIAotCWlyID0ga21hbGxvYyhzaXplb2YoKmlyKSxHRlBfS0VSTkVMKTsKKwlpciA9IGttYWxsb2Moc2l6ZW9mKCppciksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGlyKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoaXIsMCxzaXplb2YoKmlyKSk7CisJbWVtc2V0KGlyLCAwLCBzaXplb2YoKmlyKSk7CiAKIAkvKiBkZXRlY3QgJiBjb25maWd1cmUgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CiAJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKIAljYXNlIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfZG50dl9saXZlX2R2Yl90OwotCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AxX0lPOworCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJfdDsKKwkJaXItPmdwaW9fYWRkciA9IE1PX0dQMV9JTzsKIAkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY7Ci0JCWlyLT5tYXNrX2tleXVwICAgPSAweDYwOwotCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCWlyLT5tYXNrX2tleXVwID0gMHg2MDsKKwkJaXItPnBvbGxpbmcgPSA1MDsgLyogbXMgKi8KIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXc7Ci0JCWlyX3R5cGUgICAgICAgICAgPSBJUl9UWVBFX1JDNTsKLQkJaXItPnNhbXBsaW5nICAgICA9IDE7CisJCWlyX2NvZGVzID0gaXJfY29kZXNfaGF1cHBhdWdlX25ldzsKKwkJaXJfdHlwZSA9IElSX1RZUEVfUkM1OworCQlpci0+c2FtcGxpbmcgPSAxOwogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVDIwMDBYUF9FWFBFUlQ6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc193aW5mYXN0OwotCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AwX0lPOworCQlpcl9jb2RlcyA9IGlyX2NvZGVzX3dpbmZhc3Q7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDBfSU87CiAJCWlyLT5tYXNrX2tleWNvZGUgPSAweDhmODsKLQkJaXItPm1hc2tfa2V5dXAgICA9IDB4MTAwOwotCQlpci0+cG9sbGluZyAgICAgID0gMTsgLy8gbXMKKwkJaXItPm1hc2tfa2V5dXAgPSAweDEwMDsKKwkJaXItPnBvbGxpbmcgPSAxOyAvKiBtcyAqLwogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSU9EQVRBX0dWQkNUVjdFOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfaW9kYXRhX2JjdHY3ZTsKLQkJaXItPmdwaW9fYWRkciAgICA9IE1PX0dQMF9JTzsKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHhmZDsKIAkJaXItPm1hc2tfa2V5ZG93biA9IDB4MDI7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSA1OyAvLyBtcworCQlpci0+cG9sbGluZyA9IDU7IC8qIG1zICovCiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9QSVhFTFZJRVdfUExBWVRWX1VMVFJBX1BSTzoKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3BpeGVsdmlldzsKLQkJaXItPmdwaW9fYWRkciAgICA9IE1PX0dQMV9JTzsKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc19waXhlbHZpZXc7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CiAJCWlyLT5tYXNrX2tleWNvZGUgPSAweDFmOwotCQlpci0+bWFza19rZXl1cCAgID0gMHg4MDsKLQkJaXItPnBvbGxpbmcgICAgICA9IDE7IC8vIG1zCisJCWlyLT5tYXNrX2tleXVwID0gMHg4MDsKKwkJaXItPnBvbGxpbmcgPSAxOyAvKiBtcyAqLworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0k6CisJCWlyX2NvZGVzID0gaXJfY29kZXNfYWRzdGVjaF9kdmJfdF9wY2k7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweGJmOworCQlpci0+bWFza19rZXl1cCA9IDB4NDA7CisJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9NU0lfVFZBTllXSEVSRV9NQVNURVI6CisJCWlyX2NvZGVzID0gaXJfY29kZXNfbXNpX3R2YW55d2hlcmU7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDFmOworCQlpci0+bWFza19rZXl1cCA9IDB4NDA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KIAkJYnJlYWs7CiAJfQogCkBAIC0yNzksOCArMzgwLDcgQEAKIAkvKiBpbml0IGlucHV0IGRldmljZSAqLwogCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiY3g4OCBJUiAoJXMpIiwKIAkJIGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5uYW1lKTsKLQlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAotCQkgcGNpX25hbWUocGNpKSk7CisJc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICJwY2ktJXMvaXIwIiwgcGNpX25hbWUocGNpKSk7CiAKIAlpcl9pbnB1dF9pbml0KCZpci0+aW5wdXQsICZpci0+aXIsIGlyX3R5cGUsIGlyX2NvZGVzKTsKIAlpci0+aW5wdXQubmFtZSA9IGlyLT5uYW1lOwpAQCAtMjg4LDEwICszODgsMTAgQEAKIAlpci0+aW5wdXQuaWQuYnVzdHlwZSA9IEJVU19QQ0k7CiAJaXItPmlucHV0LmlkLnZlcnNpb24gPSAxOwogCWlmIChwY2ktPnN1YnN5c3RlbV92ZW5kb3IpIHsKLQkJaXItPmlucHV0LmlkLnZlbmRvciAgPSBwY2ktPnN1YnN5c3RlbV92ZW5kb3I7CisJCWlyLT5pbnB1dC5pZC52ZW5kb3IgPSBwY2ktPnN1YnN5c3RlbV92ZW5kb3I7CiAJCWlyLT5pbnB1dC5pZC5wcm9kdWN0ID0gcGNpLT5zdWJzeXN0ZW1fZGV2aWNlOwogCX0gZWxzZSB7Ci0JCWlyLT5pbnB1dC5pZC52ZW5kb3IgID0gcGNpLT52ZW5kb3I7CisJCWlyLT5pbnB1dC5pZC52ZW5kb3IgPSBwY2ktPnZlbmRvcjsKIAkJaXItPmlucHV0LmlkLnByb2R1Y3QgPSBwY2ktPmRldmljZTsKIAl9CiAKQEAgLTMwMywxMyArNDAzLDEzIEBACiAJCUlOSVRfV09SSygmaXItPndvcmssIGN4ODhfaXJfd29yaywgaXIpOwogCQlpbml0X3RpbWVyKCZpci0+dGltZXIpOwogCQlpci0+dGltZXIuZnVuY3Rpb24gPSBpcl90aW1lcjsKLQkJaXItPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpaXI7CisJCWlyLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaXI7CiAJCXNjaGVkdWxlX3dvcmsoJmlyLT53b3JrKTsKIAl9CiAJaWYgKGlyLT5zYW1wbGluZykgewotCQljb3JlLT5wY2lfaXJxbWFzayB8PSAoMTw8MTgpOyAgIC8vIElSX1NNUF9JTlQKLQkJY3hfd3JpdGUoTU9fRERTX0lPLCAweGE4MGE4MCk7ICAvLyA0IGtIeiBzYW1wbGUgcmF0ZQotCQljeF93cml0ZShNT19ERFNDRkdfSU8sICAgMHg1KTsgIC8vIGVuYWJsZQorCQljb3JlLT5wY2lfaXJxbWFzayB8PSAoMSA8PCAxOCk7CS8qIElSX1NNUF9JTlQgKi8KKwkJY3hfd3JpdGUoTU9fRERTX0lPLCAweGE4MGE4MCk7CS8qIDQga0h6IHNhbXBsZSByYXRlICovCisJCWN4X3dyaXRlKE1PX0REU0NGR19JTywgMHg1KTsJLyogZW5hYmxlICovCiAJfQogCiAJLyogYWxsIGRvbmUgKi8KQEAgLTM0NSw3ICs0NDUsNyBAQAogdm9pZCBjeDg4X2lyX2lycShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQogewogCXN0cnVjdCBjeDg4X0lSICppciA9IGNvcmUtPmlyOwotCXUzMiBzYW1wbGVzLHJjNTsKKwl1MzIgc2FtcGxlcywgcmM1OwogCWludCBpOwogCiAJaWYgKE5VTEwgPT0gaXIpCkBAIC0zNTQsNyArNDU0LDcgQEAKIAkJcmV0dXJuOwogCiAJc2FtcGxlcyA9IGN4X3JlYWQoTU9fU0FNUExFX0lPKTsKLQlpZiAoMCAhPSBzYW1wbGVzICAmJiAgMHhmZmZmZmZmZiAhPSBzYW1wbGVzKSB7CisJaWYgKDAgIT0gc2FtcGxlcyAmJiAweGZmZmZmZmZmICE9IHNhbXBsZXMpIHsKIAkJLyogcmVjb3JkIHNhbXBsZSBkYXRhICovCiAJCWlmIChpci0+c2NvdW50IDwgQVJSQVlfU0laRShpci0+c2FtcGxlcykpCiAJCQlpci0+c2FtcGxlc1tpci0+c2NvdW50KytdID0gc2FtcGxlczsKQEAgLTM2Miw4ICs0NjIsOCBAQAogCX0KIAlpZiAoIWlyLT5zY291bnQpIHsKIAkJLyogbm90aGluZyB0byBzYW1wbGUgKi8KLQkJaWYgKGlyLT5pci5rZXlwcmVzc2VkICYmIHRpbWVfYWZ0ZXIoamlmZmllcyxpci0+cmVsZWFzZSkpCi0JCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCZpci0+aXIpOworCQlpZiAoaXItPmlyLmtleXByZXNzZWQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBpci0+cmVsZWFzZSkpCisJCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCAmaXItPmlyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzczLDE0ICs0NzMsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaXItPnNjb3VudDsgaSsrKQogCQlpci0+c2FtcGxlc1tpXSA9IH5pci0+c2FtcGxlc1tpXTsKIAlpZiAoaXJfZGVidWcpCi0JCWlyX2R1bXBfc2FtcGxlcyhpci0+c2FtcGxlcyxpci0+c2NvdW50KTsKKwkJaXJfZHVtcF9zYW1wbGVzKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50KTsKIAogCS8qIGRlY29kZSBpdCAqLwogCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgotCQlyYzUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcyxpci0+c2NvdW50LDUsNyk7Ci0JCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIscmM1KTsKKwkJcmM1ID0gaXJfZGVjb2RlX2JpcGhhc2UoaXItPnNhbXBsZXMsIGlyLT5zY291bnQsIDUsIDcpOworCQlpcl9kcHJpbnRrKCJiaXBoYXNlIGRlY29kZWQ6ICV4XG4iLCByYzUpOwogCQlpZiAoKHJjNSAmIDB4ZmZmZmYwMDApICE9IDB4MzAwMCkKIAkJCWJyZWFrOwogCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIHJjNSAmIDB4M2YsIHJjNSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKaW5kZXggOWFkZTJhZS4uZmUyNzY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtbXBlZy5jLHYgMS4yNiAyMDA1LzA2LzAzIDEzOjMxOjUxIG1jaGVoYWIgRXhwICQKKyAqICRJZDogY3g4OC1tcGVnLmMsdiAxLjMxIDIwMDUvMDcvMDcgMTQ6MTc6NDcgbWNoZWhhYiBFeHAgJAogICoKICAqICBTdXBwb3J0IGZvciB0aGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHRyYW5zZmVycwogICogIFBDSSBmdW5jdGlvbiAjMiBvZiB0aGUgY3gyMzg4eC4KQEAgLTY0LDE3ICs2NCwyMSBAQAogCS8qIHdyaXRlIFRTIGxlbmd0aCB0byBjaGlwICovCiAJY3hfd3JpdGUoTU9fVFNfTE5HVEgsIGJ1Zi0+dmIud2lkdGgpOwogCi0jaWYgMQogCS8qIEZJWE1FOiB0aGlzIG5lZWRzIGEgcmV2aWV3LgogCSAqIGFsc286IG1vdmUgdG8gY3g4OC1ibGFja2JpcmQgKyBjeDg4LWR2YiBzb3VyY2UgZmlsZXM/ICovCiAKIAlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmR2YikgewogCQkvKiBuZWdlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCi0JCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHg0MCk7CisJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHgwMDQwIHwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKIAkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDAwKTsKLQkJY3hfd3JpdGUoVFNfSFdfU09QX0NOVFJMLDQ3PDwxNnwxODg8PDR8MHgwMCk7Ci0JCWN4X3dyaXRlKFRTX1NPUF9TVEFULDB4MDApOworCQljeF93cml0ZShUU19IV19TT1BfQ05UUkwsMHg0Nzw8MTZ8MTg4PDw0fDB4MDEpOworCQlpZiAoKGNvcmUtPmJvYXJkID09IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSkgfHwKKwkJICAgIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1QpKSB7CisJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOworCQl9IGVsc2UgeworCQkJY3hfd3JpdGUoVFNfU09QX1NUQVQsIDB4MDApOworCQl9CiAJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CkBAIC05Myw3ICs5Nyw2IEBACiAJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHgwNik7IC8qIHB1bmN0dXJlZCBjbG9jayBUUyAmIHBvc2VkZ2UgZHJpdmVuICovCiAJCXVkZWxheSgxMDApOwogCX0KLSNlbmRpZgogCiAJLyogcmVzZXQgY291bnRlciAqLwogCWN4X3dyaXRlKE1PX1RTX0dQQ05UUkwsIEdQX0NPVU5UX0NPTlRST0xfUkVTRVQpOwpAQCAtMjY1LDYgKzI2OCwxNSBAQAogCWRvX2NhbmNlbF9idWZmZXJzKGRldiwidGltZW91dCIsMSk7CiB9CiAKK3N0YXRpYyBjaGFyICpjeDg4X21wZWdfaXJxc1szMl0gPSB7CisJInRzX3Jpc2NpMSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX3Jpc2NpMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX29mbG93IiwgIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX3N5bmMiLCAgIE5VTEwsIE5VTEwsIE5VTEwsCisJIm9wY19lcnIiLCAicGFyX2VyciIsICJyaXBfZXJyIiwgInBjaV9hYm9ydCIsCisJInRzX2Vycj8iLAorfTsKKwogc3RhdGljIHZvaWQgY3g4ODAyX21wZWdfaXJxKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKQEAgLTI3NywxMCArMjg5LDcgQEAKIAkJcmV0dXJuOwogCiAJY3hfd3JpdGUoTU9fVFNfSU5UU1RBVCwgc3RhdHVzKTsKLSNpZiAwCi0JY3g4OF9wcmludF9pcnFiaXRzKGNvcmUtPm5hbWUsICJpcnEgbXBlZyAiLAotCQkJY3g4OF9tcGVnX2lycXMsIHN0YXR1cywgbWFzayk7Ci0jZW5kaWYKKwogCWlmIChkZWJ1ZyB8fCAoc3RhdHVzICYgbWFzayAmIH4weGZmKSkKIAkJY3g4OF9wcmludF9pcnFiaXRzKGNvcmUtPm5hbWUsICJpcnEgbXBlZyAiLAogCQkJCSAgIGN4ODhfbXBlZ19pcnFzLCBzdGF0dXMsIG1hc2spOwpAQCAtNDM2LDEwICs0NDUsOCBAQAogCX0KIAlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAKLSNpZiAxCiAJLyogRklYTUUgLS0gc2h1dGRvd24gZGV2aWNlICovCiAJY3g4OF9zaHV0ZG93bihkZXYtPmNvcmUpOwotI2VuZGlmCiAKIAlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKIAlpZiAoMCAhPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKSkgewpAQCAtNDYxLDEwICs0NjgsOCBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAotI2lmIDEKIAkvKiBGSVhNRTogcmUtaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwogCWN4ODhfcmVzZXQoZGV2LT5jb3JlKTsKLSNlbmRpZgogCiAJLyogcmVzdGFydCB2aWRlbyt2YmkgY2FwdHVyZSAqLwogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXJlZy5oCmluZGV4IDYzYWQzM2YuLjM3ZjgyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXJlZy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGN4ODgtcmVnLmgsdiAxLjcgMjAwNS8wNi8wMyAxMzozMTo1MSBtY2hlaGFiIEV4cCAkCisgICAgJElkOiBjeDg4LXJlZy5oLHYgMS44IDIwMDUvMDcvMDcgMTM6NTg6MzggbWNoZWhhYiBFeHAgJAogCiAgICAgY3g4OHgtaHcuaCAtIENYMjM4OHggcmVnaXN0ZXIgb2Zmc2V0cwogCkBAIC02MDQsMjAgKzYwNCwxMSBAQAogI2RlZmluZSBFTl9JMlNJTl9TVFIyREFDICAgICAgICAweDAwMDA0MDAwCiAjZGVmaW5lIEVOX0kyU0lOX0VOQUJMRSAgICAgICAgIDB4MDAwMDgwMDAKIAotI2lmIDAKLS8qIG9sZCAqLwotI2RlZmluZSBFTl9ETVRSWF9TVU1ESUZGICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEVOX0RNVFJYX1NVTVIgICAgICAgICAgIDB4MDAwMDA4ODAKLSNkZWZpbmUgRU5fRE1UUlhfTFIgICAgICAgICAgICAgMHgwMDAwMDkwMAotI2RlZmluZSBFTl9ETVRSWF9NT05PICAgICAgICAgICAweDAwMDAwOTgwCi0jZWxzZQotLyogZHNjYWxlciBjdnMgKi8KICNkZWZpbmUgRU5fRE1UUlhfU1VNRElGRiAgICAgICAgKDAgPDwgNykKICNkZWZpbmUgRU5fRE1UUlhfU1VNUiAgICAgICAgICAgKDEgPDwgNykKICNkZWZpbmUgRU5fRE1UUlhfTFIgICAgICAgICAgICAgKDIgPDwgNykKICNkZWZpbmUgRU5fRE1UUlhfTU9OTyAgICAgICAgICAgKDMgPDwgNykKICNkZWZpbmUgRU5fRE1UUlhfQllQQVNTICAgICAgICAgKDEgPDwgMTEpCi0jZW5kaWYKIAogLy8gVmlkZW8KICNkZWZpbmUgVklEX0NBUFRVUkVfQ09OVFJPTAkJMHgzMTAxODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwppbmRleCA0NmQ3OGIxLi45MTIwN2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGN4ODgtdHZhdWRpby5jLHYgMS4zNiAyMDA1LzA2LzA1IDA1OjUzOjQ1IG1jaGVoYWIgRXhwICQKKyAgICAkSWQ6IGN4ODgtdHZhdWRpby5jLHYgMS4zNyAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWF1ZGlvLmMgLSBDb25leGFudCBDWDIzODgwLzIzODgxIGF1ZGlvIGRvd25zdHJlYW0gZHJpdmVyIGRyaXZlcgogCkBAIC0yNzgsODAgKzI3OCw2IEBACiAJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9OSUNBTShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQotewotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgbmljYW1fY29tbW9uW10gPSB7Ci0JCS8qIGZyb20gZHNjYWxlciAqLwotICAgIAkJeyBBVURfUkFURV9BREoxLCAgICAgICAgICAgMHgwMDAwMDAxMCB9LAotICAgIAkJeyBBVURfUkFURV9BREoyLCAgICAgICAgICAgMHgwMDAwMDA0MCB9LAotICAgIAkJeyBBVURfUkFURV9BREozLCAgICAgICAgICAgMHgwMDAwMDEwMCB9LAotICAgIAkJeyBBVURfUkFURV9BREo0LCAgICAgICAgICAgMHgwMDAwMDQwMCB9LAotICAgIAkJeyBBVURfUkFURV9BREo1LCAgICAgICAgICAgMHgwMDAwMTAwMCB9LAotICAgIC8vCQl7IEFVRF9ETURfUkFfRERTLCAgICAgICAgICAweDAwYzBkNWNlIH0sCi0KLQkJLy8gRGVlbXBoYXNpcyAxOgotCQl7IEFVRF9ERUVNUEhHQUlOX1IsICAgICAgICAweDAwMDAyM2MyIH0sCi0JCXsgQVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgIDB4MDAwMmE3YmMgfSwKLQkJeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDAzMDIzZSB9LAotCQl7IEFVRF9ERUVNUEhERU5PTTFfUiwgICAgICAweDAwMDBmM2QwIH0sCi0JCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKLQotI2lmIDAKLQkJLy8gRGVlbXBoYXNpcyAyOiAob3RoZXIgdHYgbm9ybT8pCi0JCXsgQVVEX0RFRU1QSEdBSU5fUiwgICAgICAgIDB4MDAwMGM2MDAgfSwKLQkJeyBBVURfREVFTVBITlVNRVIxX1IsICAgICAgMHgwMDA2NjczOCB9LAotCQl7IEFVRF9ERUVNUEhOVU1FUjJfUiwgICAgICAweDAwMDY2NzM5IH0sCi0JCXsgQVVEX0RFRU1QSERFTk9NMV9SLCAgICAgIDB4MDAwMWU4OGMgfSwKLQkJeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAxZTg4YyB9LAotI2VuZGlmCi0KLQkJeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9FUlJMT0dQRVJJT0RfUiwgICAgICAweDAwMDAwZmZmIH0sCi0JCXsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgIDB4MDAwMDAzZmYgfSwKLQkJeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgMHgwMDAwMDBmZiB9LAotCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQzX1IsICAweDAwMDAwMDNmIH0sCi0JCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgIDB4MDAwMDAwMDMgfSwKLQotCQkvLyBzZXR1cCBRQU0gcmVnaXN0ZXJzCi0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgIDB4MDYgfSwKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUxLCAgMHg4MiB9LAotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDE2IH0sCi0JCXsgQVVEX1FBTV9NT0RFLCAgICAgICAgICAgIDB4MDUgfSwKLQotICAgICAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKLSAgICAgICAgfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX3BhbF9pW10gPSB7Ci0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTIgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgMHgzYSB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAweDkzIH0sCi0KLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0JfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2RlZmF1bHRbXSA9IHsKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxNiB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAweDM0IH0sCi0JCXsgQVVEX1BIQUNDX0ZSRVFfOExTQiwgICAgIDB4NGMgfSwKLQotICAgICAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKLQl9OwotCi0gICAgICAgIHNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMTAsCi0JCQlFTl9ETVRSWF9MUiB8IEVOX0RNVFJYX0JZUEFTUyB8IEVOX05JQ0FNX0FVVE9fU1RFUkVPKTsKLSAgICAgICAgc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9jb21tb24pOwotCXN3aXRjaCAoY29yZS0+dHZhdWRpbykgewotCWNhc2UgV1dfTklDQU1fSToKLQkJZHByaW50aygiJXMgUEFMLUkgTklDQU0gKHN0YXR1czogdW5rbm93bilcbiIsX19GVU5DVElPTl9fKTsKLQkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9wYWxfaSk7Ci0JCWJyZWFrOwotCWNhc2UgV1dfTklDQU1fQkdES0w6Ci0JCWRwcmludGsoIiVzIFBBTC1CR0RLIE5JQ0FNIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fZGVmYXVsdCk7Ci0JCWJyZWFrOwotCX07Ci0gICAgICAgIHNldF9hdWRpb19maW5pc2goY29yZSk7Ci19Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX05JQ0FNX0woc3RydWN0IGN4ODhfY29yZSAqY29yZSwgaW50IHN0ZXJlbykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCmluZGV4IGU0Y2E3MzUuLjU1ODhhM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtdmlkZW8uYyx2IDEuNjMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtdmlkZW8uYyx2IDEuODAgMjAwNS8wNy8xMyAwODo0OTowOCBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtODYsMTMgKzg2LDYgQEAKIAkJLmlkICAgICAgICA9IFY0TDJfU1REX05UU0NfTV9KUCwKIAkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0TlRTQ0phcGFuLAogCQkuY3hvZm9ybWF0ID0gMHgxODFmMDAwOCwKLSNpZiAwCi0JfSx7Ci0JCS5uYW1lICAgICAgPSAiTlRTQy00LjQzIiwKLQkJLmlkICAgICAgICA9IEZJWE1FLAotCQkuY3hpZm9ybWF0ID0gVmlkZW9Gb3JtYXROVFNDNDQzLAotCQkuY3hvZm9ybWF0ID0gMHgxODFmMDAwOCwKLSNlbmRpZgogCX0sewogCQkubmFtZSAgICAgID0gIlBBTC1CRyIsCiAJCS5pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfQkcsCkBAIC0yNDgsNiArMjQxLDcgQEAKIAkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKIAkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkJfSwKKwkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDAsCiAJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19DT05UUl9CUklHSFQsCiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweGZmMDAsCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSA4LApAQCAtMjYxLDcgKzI1NSw3IEBACiAJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCi0JCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAorCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMTI4LAogCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fSFVFLAogCQkubWFzayAgICAgICAgICAgICAgICAgID0gMHgwMGZmLAogCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gMCwKQEAgLTY3NCwyMzEgKzY2OCw2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgMCAvKiBvdmVybGF5IHN1cHBvcnQgbm90IGZpbmlzaGVkIHlldCAqLwotc3RhdGljIHUzMiogb3ZfcmlzY19maWVsZChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwKLQkJCSAgdTMyICpycCwgc3RydWN0IGJ0Y3hfc2tpcGxpc3QgKnNraXBzLAotCQkJICB1MzIgc3luY19saW5lLCBpbnQgc2tpcF9ldmVuLCBpbnQgc2tpcF9vZGQpCi17Ci0JaW50IGxpbmUsbWF4eSxzdGFydCxlbmQsc2tpcCxuc2tpcHM7Ci0JdTMyIHJpLHJhOwotCXUzMiBhZGRyOwotCi0JLyogc3luYyBpbnN0cnVjdGlvbiAqLwotCSoocnArKykgPSBjcHVfdG9fbGUzMihSSVNDX1JFU1lOQyB8IHN5bmNfbGluZSk7Ci0KLQlhZGRyICA9ICh1bnNpZ25lZCBsb25nKWRldi0+ZmJ1Zi5iYXNlOwotCWFkZHIgKz0gZGV2LT5mYnVmLmZtdC5ieXRlc3BlcmxpbmUgKiBmaC0+d2luLncudG9wOwotCWFkZHIgKz0gKGZoLT5mbXQtPmRlcHRoID4+IDMpICAgICAgKiBmaC0+d2luLncubGVmdDsKLQotCS8qIHNjYW4gbGluZXMgKi8KLQlmb3IgKG1heHkgPSAtMSwgbGluZSA9IDA7IGxpbmUgPCBmaC0+d2luLncuaGVpZ2h0OwotCSAgICAgbGluZSsrLCBhZGRyICs9IGRldi0+ZmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lKSB7Ci0JCWlmICgobGluZSUyKSA9PSAwICAmJiAgc2tpcF9ldmVuKQotCQkJY29udGludWU7Ci0JCWlmICgobGluZSUyKSA9PSAxICAmJiAgc2tpcF9vZGQpCi0JCQljb250aW51ZTsKLQotCQkvKiBjYWxjdWxhdGUgY2xpcHBpbmcgKi8KLQkJaWYgKGxpbmUgPiBtYXh5KQotCQkJYnRjeF9jYWxjX3NraXBzKGxpbmUsIGZoLT53aW4udy53aWR0aCwgJm1heHksCi0JCQkJCXNraXBzLCAmbnNraXBzLCBmaC0+Y2xpcHMsIGZoLT5uY2xpcHMpOwotCi0JCS8qIHdyaXRlIG91dCByaXNjIGNvZGUgKi8KLQkJZm9yIChzdGFydCA9IDAsIHNraXAgPSAwOyBzdGFydCA8IGZoLT53aW4udy53aWR0aDsgc3RhcnQgPSBlbmQpIHsKLQkJCWlmIChza2lwID49IG5za2lwcykgewotCQkJCXJpICA9IFJJU0NfV1JJVEU7Ci0JCQkJZW5kID0gZmgtPndpbi53LndpZHRoOwotCQkJfSBlbHNlIGlmIChzdGFydCA8IHNraXBzW3NraXBdLnN0YXJ0KSB7Ci0JCQkJcmkgID0gUklTQ19XUklURTsKLQkJCQllbmQgPSBza2lwc1tza2lwXS5zdGFydDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmkgID0gUklTQ19TS0lQOwotCQkJCWVuZCA9IHNraXBzW3NraXBdLmVuZDsKLQkJCQlza2lwKys7Ci0JCQl9Ci0JCQlpZiAoUklTQ19XUklURSA9PSByaSkKLQkJCQlyYSA9IGFkZHIgKyAoZmgtPmZtdC0+ZGVwdGg+PjMpKnN0YXJ0OwotCQkJZWxzZQotCQkJCXJhID0gMDsKLQotCQkJaWYgKDAgPT0gc3RhcnQpCi0JCQkJcmkgfD0gUklTQ19TT0w7Ci0JCQlpZiAoZmgtPndpbi53LndpZHRoID09IGVuZCkKLQkJCQlyaSB8PSBSSVNDX0VPTDsKLQkJCXJpIHw9IChmaC0+Zm10LT5kZXB0aD4+MykgKiAoZW5kLXN0YXJ0KTsKLQotCQkJKihycCsrKT1jcHVfdG9fbGUzMihyaSk7Ci0JCQlpZiAoMCAhPSByYSkKLQkJCQkqKHJwKyspPWNwdV90b19sZTMyKHJhKTsKLQkJfQotCX0KLQlrZnJlZShza2lwcyk7Ci0JcmV0dXJuIHJwOwotfQotCi1zdGF0aWMgaW50IG92X3Jpc2NfZnJhbWUoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsCi0JCQkgc3RydWN0IGN4ODhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGJ0Y3hfc2tpcGxpc3QgKnNraXBzOwotCXUzMiBpbnN0cnVjdGlvbnMsZmllbGRzOwotCXUzMiAqcnA7Ci0JaW50IHJjOwotCi0JLyogc2tpcCBsaXN0IGZvciB3aW5kb3cgY2xpcHBpbmcgKi8KLQlpZiAoTlVMTCA9PSAoc2tpcHMgPSBrbWFsbG9jKHNpemVvZigqc2tpcHMpICogZmgtPm5jbGlwcyxHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZmllbGRzID0gMDsKLQlpZiAoVjRMMl9GSUVMRF9IQVNfVE9QKGZoLT53aW4uZmllbGQpKQotCQlmaWVsZHMrKzsKLQlpZiAoVjRMMl9GSUVMRF9IQVNfQk9UVE9NKGZoLT53aW4uZmllbGQpKQotCQlmaWVsZHMrKzsKLQotICAgICAgICAvKiBlc3RpbWF0ZSByaXNjIG1lbTogd29yc3QgY2FzZSBpcyAoY2xpcCsxKSAqIGxpbmVzIGluc3RydWN0aW9ucwotICAgICAgICAgICArIHN5bmNzICsganVtcCAoYWxsIDIgZHdvcmRzKSAqLwotCWluc3RydWN0aW9ucyAgPSAoZmgtPm5jbGlwcysxKSAqIGZoLT53aW4udy5oZWlnaHQ7Ci0JaW5zdHJ1Y3Rpb25zICs9IDMgKyA0OwotCWlmICgocmMgPSBidGN4X3Jpc2NtZW1fYWxsb2MoZGV2LT5wY2ksJmJ1Zi0+cmlzYyxpbnN0cnVjdGlvbnMqOCkpIDwgMCkgewotCQlrZnJlZShza2lwcyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiB3cml0ZSByaXNjIGluc3RydWN0aW9ucyAqLwotCXJwID0gYnVmLT5yaXNjLmNwdTsKLQlzd2l0Y2ggKGZoLT53aW4uZmllbGQpIHsKLQljYXNlIFY0TDJfRklFTERfVE9QOgotCQlycCA9IG92X3Jpc2NfZmllbGQoZGV2LCBmaCwgcnAsIHNraXBzLCAwLCAgICAgMCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006Ci0JCXJwID0gb3ZfcmlzY19maWVsZChkZXYsIGZoLCBycCwgc2tpcHMsIDB4MjAwLCAwLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6Ci0JCXJwID0gb3ZfcmlzY19maWVsZChkZXYsIGZoLCBycCwgc2tpcHMsIDAsICAgICAwLCAxKTsKLQkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMHgyMDAsIDEsIDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQlidWYtPnJpc2Muam1wID0gcnA7Ci0Ja2ZyZWUoc2tpcHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcmlmeV93aW5kb3coc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IHY0bDJfd2luZG93ICp3aW4pCi17Ci0JZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwotCWludCBtYXh3LCBtYXhoOwotCi0JaWYgKE5VTEwgPT0gZGV2LT5mYnVmLmJhc2UpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh3aW4tPncud2lkdGggPCA0OCB8fCB3aW4tPncuaGVpZ2h0IDwgIDMyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAod2luLT5jbGlwY291bnQgPiAyMDQ4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZpZWxkID0gd2luLT5maWVsZDsKLQltYXh3ICA9IG5vcm1fbWF4dyhjb3JlLT50dm5vcm0pOwotCW1heGggID0gbm9ybV9tYXhoKGNvcmUtPnR2bm9ybSk7Ci0KLQlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9ICh3aW4tPncuaGVpZ2h0ID4gbWF4aC8yKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVjRMMl9GSUVMRF9UT1A7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChmaWVsZCkgewotICAgICAgICBjYXNlIFY0TDJfRklFTERfVE9QOgotICAgICAgICBjYXNlIFY0TDJfRklFTERfQk9UVE9NOgotICAgICAgICAgICAgICAgIG1heGggPSBtYXhoIC8gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotCXdpbi0+ZmllbGQgPSBmaWVsZDsKLQlpZiAod2luLT53LndpZHRoID4gbWF4dykKLQkJd2luLT53LndpZHRoID0gbWF4dzsKLQlpZiAod2luLT53LmhlaWdodCA+IG1heGgpCi0JCXdpbi0+dy5oZWlnaHQgPSBtYXhoOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldHVwX3dpbmRvdyhzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwKLQkJCXN0cnVjdCB2NGwyX3dpbmRvdyAqd2luKQotewotCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzID0gTlVMTDsKLQlpbnQgbixzaXplLHJldHZhbCA9IDA7Ci0KLQlpZiAoTlVMTCA9PSBmaC0+Zm10KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR2YWwgPSB2ZXJpZnlfd2luZG93KGRldix3aW4pOwotCWlmICgwICE9IHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCS8qIGNvcHkgY2xpcHMgIC0tICBsdWNraWx5IHY0bDEgKyB2NGwyIGFyZSBiaW5hcnkKLQkgICBjb21wYXRpYmxlIGhlcmUgLi4uKi8KLQluID0gd2luLT5jbGlwY291bnQ7Ci0Jc2l6ZSA9IHNpemVvZigqY2xpcHMpKihuKzQpOwotCWNsaXBzID0ga21hbGxvYyhzaXplLEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGNsaXBzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAobiA+IDApIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNsaXBzLHdpbi0+Y2xpcHMsc2l6ZW9mKHN0cnVjdCB2NGwyX2NsaXApKm4pKSB7Ci0JCQlrZnJlZShjbGlwcyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCS8qIGNsaXAgYWdhaW5zdCBzY3JlZW4gKi8KLQlpZiAoTlVMTCAhPSBkZXYtPmZidWYuYmFzZSkKLQkJbiA9IGJ0Y3hfc2NyZWVuX2NsaXBzKGRldi0+ZmJ1Zi5mbXQud2lkdGgsIGRldi0+ZmJ1Zi5mbXQuaGVpZ2h0LAotCQkJCSAgICAgICZ3aW4tPncsIGNsaXBzLCBuKTsKLQlidGN4X3NvcnRfY2xpcHMoY2xpcHMsbik7Ci0KLQkvKiA0LWJ5dGUgYWxpZ25tZW50cyAqLwotCXN3aXRjaCAoZmgtPmZtdC0+ZGVwdGgpIHsKLQljYXNlIDg6Ci0JY2FzZSAyNDoKLQkJYnRjeF9hbGlnbigmd2luLT53LCBjbGlwcywgbiwgMyk7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JCWJ0Y3hfYWxpZ24oJndpbi0+dywgY2xpcHMsIG4sIDEpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQkvKiBubyBhbGlnbm1lbnQgZml4dXBzIG5lZWRlZCAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlkb3duKCZmaC0+dmlkcS5sb2NrKTsKLQlpZiAoZmgtPmNsaXBzKQotCQlrZnJlZShmaC0+Y2xpcHMpOwotCWZoLT5jbGlwcyAgICA9IGNsaXBzOwotCWZoLT5uY2xpcHMgICA9IG47Ci0JZmgtPndpbiAgICAgID0gKndpbjsKLSNpZiAwCi0JZmgtPm92LnNldHVwX29rID0gMTsKLSNlbmRpZgotCi0JLyogdXBkYXRlIG92ZXJsYXkgaWYgbmVlZGVkICovCi0JcmV0dmFsID0gMDsKLSNpZiAwCi0JaWYgKGNoZWNrX2J0cmVzKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgewotCQlzdHJ1Y3QgYnR0dl9idWZmZXIgKm5ldzsKLQotCQluZXcgPSB2aWRlb2J1Zl9hbGxvYyhzaXplb2YoKm5ldykpOwotCQlidHR2X292ZXJsYXlfcmlzYyhidHYsICZmaC0+b3YsIGZoLT5vdmZtdCwgbmV3KTsKLQkJcmV0dmFsID0gYnR0dl9zd2l0Y2hfb3ZlcmxheShidHYsZmgsbmV3KTsKLQl9Ci0jZW5kaWYKLQl1cCgmZmgtPnZpZHEubG9jayk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTMyNyw5ICsxMDk2LDYgQEAKIAlzdHJ1Y3QgY3g4ODAwX2ZoICAqZmggICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ICA9IGZoLT5kZXY7CiAJc3RydWN0IGN4ODhfY29yZSAgKmNvcmUgPSBkZXYtPmNvcmU7Ci0jaWYgMAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYKIAlpbnQgZXJyOwogCiAJaWYgKHZpZGVvX2RlYnVnID4gMSkKQEAgLTEzNTAsMTIgKzExMTYsNiBAQAogCQkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CiAJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKIAkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFICAgfAotI2lmIDAKLQkJCVY0TDJfVFVORVJfQ0FQX0xPVyAgICAgfAotI2VuZGlmCi0jaWYgMAotCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8Ci0jZW5kaWYKIAkJCTA7CiAJCWlmIChVTlNFVCAhPSBjb3JlLT50dW5lcl90eXBlKQogCQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CkBAIC0xNDU2LDM2ICsxMjE2LDYgQEAKIAl9CiAKIAotI2lmIDAKLQkvKiBuZWVkcyByZXZpZXcgKi8KLQljYXNlIFZJRElPQ19HX0FVRElPOgotCXsKLQkJc3RydWN0IHY0bDJfYXVkaW8gKmEgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBuID0gYS0+aW5kZXg7Ci0KLQkJbWVtc2V0KGEsMCxzaXplb2YoKmEpKTsKLQkJYS0+aW5kZXggPSBuOwotCQlzd2l0Y2ggKG4pIHsKLQkJY2FzZSAwOgotCQkJaWYgKChDWDg4X1ZNVVhfVEVMRVZJU0lPTiA9PSBJTlBVVChuKS0+dHlwZSkKLQkJCSAgICB8fCAoQ1g4OF9WTVVYX0NBQkxFID09IElOUFVUKG4pLT50eXBlKSkgewotCQkJCXN0cmNweShhLT5uYW1lLCJUZWxldmlzaW9uIik7Ci0JCQkJLy8gRklYTUUgZmlndXJlIG91dCBpZiBzdGVyZW8gcmVjZWl2ZWQgYW5kIHNldCBWNEwyX0FVRENBUF9TVEVSRU8uCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJaWYgKENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQgPT0gY29yZS0+Ym9hcmQpIHsKLQkJCQlzdHJjcHkoYS0+bmFtZSwiTGluZSBJbiIpOwotCQkJCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkvLyBBdWRpbyBpbnB1dCBub3QgYXZhaWxhYmxlLgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0jZW5kaWYKIAogCS8qIC0tLSBjYXB0dXJlIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CkBAIC0xNTg4LDEzICsxMzE4LDE2IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CiAKKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwogCQlpZiAoVU5TRVQgPT0gY29yZS0+dHVuZXJfdHlwZSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZi0+dHVuZXIgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCiAJCWYtPnR5cGUgPSBmaC0+cmFkaW8gPyBWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCWYtPmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKKworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19HX0ZSRVFVRU5DWSxmKTsKKwogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CkBAIC0xNjEyLDExICsxMzQ1LDEyIEBACiAJCWRvd24oJmRldi0+bG9jayk7CiAJCWRldi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKIAkJY3g4OF9uZXdzdGF0aW9uKGNvcmUpOwotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKIAkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfU19GUkVRVUVOQ1ksZik7Ci0jZWxzZQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ1NGUkVRLCZkZXYtPmZyZXEpOwotI2VuZGlmCisKKwkJLyogV2hlbiBjaGFuZ2luZyBjaGFubmVscyBpdCBpcyByZXF1aXJlZCB0byByZXNldCBUVkFVRElPICovCisJCW1zbGVlcCAoMTApOworCQljeDg4X3NldF90dmF1ZGlvKGNvcmUpOworCiAJCXVwKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNzE0LDExICsxNDQ4LDcgQEAKIAkJCXNpemVvZihjYXAtPmNhcmQpKTsKIAkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwogCQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKLQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUgotI2lmIDAKLQkJCQkgICAgfCBWNEwyX1RVTkVSX0NBUF9MT1cKLSNlbmRpZgotCQkJCSAgICA7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19HX1RVTkVSOgpAQCAtMTczMCwxOSArMTQ2MCw4IEBACiAKIAkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKIAkJc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOwotICAgICAgICAgICAgICAgIHQtPnJhbmdlbG93ICA9IChpbnQpKDY1KjE2KTsKLSAgICAgICAgICAgICAgICB0LT5yYW5nZWhpZ2ggPSAoaW50KSgxMDgqMTYpOwogCi0jaWZkZWYgVjRMMl9JMkNfQ0xJRU5UUwogCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19HX1RVTkVSLHQpOwotI2Vsc2UKLQkJewotCQkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OwotCQkJbWVtc2V0KCZ2dCwwLHNpemVvZih2dCkpOwotCQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldixWSURJT0NHVFVORVIsJnZ0KTsKLQkJCXQtPnNpZ25hbCA9IHZ0LnNpZ25hbDsKLQkJfQotI2VuZGlmCiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CkBAIC0xNzc1LDggKzE0OTQsMjkgQEAKIAkJKmlkID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCWNhc2UgVklESU9DX1NfQVVESU86CisJY2FzZSBWSURJT0NTVFVORVI6CisJeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisKKwkJaWYgKHYtPnR1bmVyKSAvKiBPbmx5IHR1bmVyIDAgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DU1RVTkVSLHYpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KIAljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CisKKwkJaWYgKDAgIT0gdC0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19TX1RVTkVSLHQpOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1NfQVVESU86CiAJY2FzZSBWSURJT0NfU19JTlBVVDoKIAljYXNlIFZJRElPQ19TX1NURDoKIAkJcmV0dXJuIDA7CkBAIC0xODQ3LDYgKzE1ODcsMTQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKIH0KIAorc3RhdGljIGNoYXIgKmN4ODhfdmlkX2lycXNbMzJdID0geworCSJ5X3Jpc2NpMSIsICJ1X3Jpc2NpMSIsICJ2X3Jpc2NpMSIsICJ2YmlfcmlzYzEiLAorCSJ5X3Jpc2NpMiIsICJ1X3Jpc2NpMiIsICJ2X3Jpc2NpMiIsICJ2YmlfcmlzYzIiLAorCSJ5X29mbG93IiwgICJ1X29mbG93IiwgICJ2X29mbG93IiwgICJ2Ymlfb2Zsb3ciLAorCSJ5X3N5bmMiLCAgICJ1X3N5bmMiLCAgICJ2X3N5bmMiLCAgICJ2Ymlfc3luYyIsCisJIm9wY19lcnIiLCAgInBhcl9lcnIiLCAgInJpcF9lcnIiLCAgInBjaV9hYm9ydCIsCit9OworCiBzdGF0aWMgdm9pZCBjeDg4MDBfdmlkX2lycShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC0yMDE0LDcgKzE3NjIsNiBAQAogewogCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXY7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKLQlzdHJ1Y3QgdHVuZXJfYWRkciB0dW5fYWRkcjsKIAlpbnQgZXJyOwogCiAJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CkBAIC0yMDg4LDIyICsxODM1LDYgQEAKIAkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CiAJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKIAkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKLQlpZiAoY29yZS0+cmFkaW9fdHlwZSAhPSBVTlNFVCkgewotCSAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfUkFESU87Ci0JCXR1bl9hZGRyLnR5cGUgPSBjb3JlLT5yYWRpb190eXBlOwotCQl0dW5fYWRkci5hZGRyID0gY29yZS0+cmFkaW9fYWRkcjsKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX2FkZHIpOwotCX0KLQlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewotCSAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCQl0dW5fYWRkci50eXBlID0gY29yZS0+dHVuZXJfdHlwZTsKLQkJdHVuX2FkZHIuYWRkciA9IGNvcmUtPnR1bmVyX2FkZHI7Ci0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9hZGRyKTsKLQl9Ci0KLQlpZiAoY29yZS0+dGRhOTg4N19jb25mKQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFREQTk4ODdfU0VUX0NPTkZJRywmY29yZS0+dGRhOTg4N19jb25mKTsKLQogCS8qIHJlZ2lzdGVyIHY0bCBkZXZpY2VzICovCiAJZGV2LT52aWRlb19kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLAogCQkJCQkmY3g4ODAwX3ZpZGVvX3RlbXBsYXRlLCJ2aWRlbyIpOwpAQCAtMjIxMywxMCArMTk0NCw4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAotI2lmIDEKIAkvKiBGSVhNRSAtLSBzaHV0ZG93biBkZXZpY2UgKi8KIAljeDg4X3NodXRkb3duKGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOwogCWlmICgwICE9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpKSB7CkBAIC0yMjM4LDEwICsxOTY3LDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKLSNpZiAxCiAJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KIAljeDg4X3Jlc2V0KGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCS8qIHJlc3RhcnQgdmlkZW8rdmJpIGNhcHR1cmUgKi8KIAlzcGluX2xvY2soJmRldi0+c2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggODY3ZTk4OC4uYjAwOGY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC5oLHYgMS42MiAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKKyAqICRJZDogY3g4OC5oLHYgMS42OSAyMDA1LzA3LzEzIDE3OjI1OjI1IG1jaGVoYWIgRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMKICAqCkBAIC0zNSw4ICszNSw4IEBACiAjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCiAjaW5jbHVkZSAiY3g4OC1yZWcuaCIKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNkZWZpbmUgQ1g4OF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwwLDQpCisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2RlZmluZSBDWDg4X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDAsNSkKIAogI2lmbmRlZiBUUlVFCiAjIGRlZmluZSBUUlVFICgxPT0xKQpAQCAtNTEsOCArNTEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRlZmluZXMgYW5kIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSNkZWZpbmUgVjRMMl9JMkNfQ0xJRU5UUyAxCi0KICNkZWZpbmUgRk9STUFUX0ZMQUdTX1BBQ0tFRCAgICAgICAweDAxCiAjZGVmaW5lIEZPUk1BVF9GTEFHU19QTEFOQVIgICAgICAgMHgwMgogCkBAIC04NCw5ICs4Miw5IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX21heHcoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQogewogCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNzY4IDogNjQwOwotLy8JcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA3MjAgOiA2NDA7CiB9CiAKKwogc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgbm9ybV9tYXhoKHN0cnVjdCBjeDg4X3R2bm9ybSAqbm9ybSkKIHsKIAlyZXR1cm4gKG5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSA/IDU3NiA6IDQ4MDsKQEAgLTE1OSw3ICsxNTcsNyBAQAogI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVCAgICAgICAgICAgIDE0CiAjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVDEgMTUKICNkZWZpbmUgQ1g4OF9CT0FSRF9LV09STERfTFRWODgzICAgICAgICAgICAxNgotI2RlZmluZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEIDE3CisjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSAgMTcKICNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxICAgICAgICAxOAogI2RlZmluZSBDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMSAgICAgICAgIDE5CiAjZGVmaW5lIENYODhfQk9BUkRfUFJPVklERU9fUFYyNTkgICAgICAgICAgMjAKQEAgLTE2NywxMCArMTY1LDEyIEBACiAjZGVmaW5lIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMCAgICAgICAgICAgMjIKICNkZWZpbmUgQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1QgICAgICAgICAyMwogI2RlZmluZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU4gICAgICAgIDI0Ci0jZGVmaW5lIENYODhfQk9BUkRfRElHSVRBTExPR0lDX01FQwkgICAgICAgMjUKKyNkZWZpbmUgQ1g4OF9CT0FSRF9ESUdJVEFMTE9HSUNfTUVDICAgICAgICAyNQogI2RlZmluZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RSAgICAgICAgIDI2CiAjZGVmaW5lIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9VTFRSQV9QUk8gMjcKICNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UICAyOAorI2RlZmluZSBDWDg4X0JPQVJEX0FEU1RFQ0hfRFZCX1RfUENJICAgICAgICAgIDI5CisjZGVmaW5lIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMSAgMzAKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCkBAIC0yMjAsNyArMjIwLDYgQEAKICNkZWZpbmUgUkVTT1VSQ0VfVkJJICAgICAgICAgICA0CiAKICNkZWZpbmUgQlVGRkVSX1RJTUVPVVQgICAgIChIWi8yKSAgLyogMC41IHNlY29uZHMgKi8KLS8vI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaKjIpCiAKIC8qIGJ1ZmZlciBmb3Igb25lIHZpZGVvIGZyYW1lICovCiBzdHJ1Y3QgY3g4OF9idWZmZXIgewpAQCAtMzM2LDExICszMzUsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICpwY2k7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgcGNpX3JldixwY2lfbGF0OwogCi0jaWYgMAotCS8qIHZpZGVvIG92ZXJsYXkgKi8KLQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAgICBmYnVmOwotCXN0cnVjdCBjeDg4X2J1ZmZlciAgICAgICAgICpzY3JlZW47Ci0jZW5kaWYKIAogCS8qIGNhcHR1cmUgcXVldWVzICovCiAJc3RydWN0IGN4ODhfZG1hcXVldWUgICAgICAgdmlkcTsKQEAgLTQzNSw4ICs0MjksNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGN4ODgtY29yZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLWV4dGVybiBjaGFyICpjeDg4X3ZpZF9pcnFzWzMyXTsKLWV4dGVybiBjaGFyICpjeDg4X21wZWdfaXJxc1szMl07CiBleHRlcm4gdm9pZCBjeDg4X3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKIAkJCSAgICAgICB1MzIgYml0cywgdTMyIG1hc2spOwogZXh0ZXJuIHZvaWQgY3g4OF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKaW5kZXggOTI2NjRmNy4uOWZjNTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBpci1rYmQtaTJjLmMsdiAxLjEwIDIwMDQvMTIvMDkgMTI6NTE6MzUga3JheGVsIEV4cCAkCisgKiAkSWQ6IGlyLWtiZC1pMmMuYyx2IDEuMTEgMjAwNS8wNy8wNyAxNjo0MjoxMSBtY2hlaGFiIEV4cCAkCiAgKgogICoga2V5Ym9hcmQgaW5wdXQgZHJpdmVyIGZvciBpMmMgSVIgcmVtb3RlIGNvbnRyb2xzCiAgKgpAQCAtNjYsMjYgKzY2LDI2IEBACiAJWyAyOSBdID0gS0VZX1BBR0VET1dOLAogCVsgMTkgXSA9IEtFWV9TT1VORCwKIAotCVsgMjQgXSA9IEtFWV9LUFBMVVNNSU5VUywJLy8gQ0ggKy8tCi0JWyAyMiBdID0gS0VZX1NVQlRJVExFLAkJLy8gQ0MKLQlbIDEzIF0gPSBLRVlfVEVYVCwJCS8vIFRUWAotCVsgMTEgXSA9IEtFWV9UViwJCS8vIEFJUi9DQkwKLQlbIDE3IF0gPSBLRVlfUEMsCQkvLyBQQy9UVgotCVsgMjMgXSA9IEtFWV9PSywJCS8vIENIIFJUTgotCVsgMjUgXSA9IEtFWV9NT0RFLCAJCS8vIEZVTkMKLQlbIDEyIF0gPSBLRVlfU0VBUkNILCAJCS8vIEFVVE9TQ0FOCisJWyAyNCBdID0gS0VZX0tQUExVU01JTlVTLAkvKiBDSCArLy0gKi8KKwlbIDIyIF0gPSBLRVlfU1VCVElUTEUsCQkvKiBDQyAqLworCVsgMTMgXSA9IEtFWV9URVhULAkJLyogVFRYICovCisJWyAxMSBdID0gS0VZX1RWLAkJLyogQUlSL0NCTCAqLworCVsgMTcgXSA9IEtFWV9QQywJCS8qIFBDL1RWICovCisJWyAyMyBdID0gS0VZX09LLAkJLyogQ0ggUlROICovCisJWyAyNSBdID0gS0VZX01PREUsIAkJLyogRlVOQyAqLworCVsgMTIgXSA9IEtFWV9TRUFSQ0gsIAkJLyogQVVUT1NDQU4gKi8KIAogCS8qIE5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCB0aGVzZSBvbmVzISAqLwotCVsgMTUgXSA9IEtFWV9TRUxFQ1QsIAkJLy8gU09VUkNFCi0JWyAxMCBdID0gS0VZX0tQUExVUywJCS8vICsxMDAKLQlbIDIwIF0gPSBLRVlfS1BFUVVBTCwJCS8vIFNZTkMKLQlbIDI4IF0gPSBLRVlfTUVESUEsICAgICAgICAgICAgIC8vIFBDL1RWCisJWyAxNSBdID0gS0VZX1NFTEVDVCwgCQkvKiBTT1VSQ0UgKi8KKwlbIDEwIF0gPSBLRVlfS1BQTFVTLAkJLyogKzEwMCAqLworCVsgMjAgXSA9IEtFWV9LUEVRVUFMLAkJLyogU1lOQyAqLworCVsgMjggXSA9IEtFWV9NRURJQSwgICAgICAgICAgICAgLyogUEMvVFYgKi8KIH07CiAKIHN0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19wdXJwbGV0dltJUl9LRVlUQUJfU0laRV0gPSB7CiAJWyAweDMgIF0gPSBLRVlfUE9XRVIsCiAJWyAweDZmIF0gPSBLRVlfTVVURSwKLQlbIDB4MTAgXSA9IEtFWV9CQUNLU1BBQ0UsCS8vIFJlY2FsbAorCVsgMHgxMCBdID0gS0VZX0JBQ0tTUEFDRSwJLyogUmVjYWxsICovCiAKIAlbIDB4MTEgXSA9IEtFWV9LUDAsCiAJWyAweDQgIF0gPSBLRVlfS1AxLApAQCAtOTcsNyArOTcsNyBAQAogCVsgMHhjICBdID0gS0VZX0tQNywKIAlbIDB4ZCAgXSA9IEtFWV9LUDgsCiAJWyAweGUgIF0gPSBLRVlfS1A5LAotCVsgMHgxMiBdID0gS0VZX0tQRE9ULAkJLy8gMTAwKworCVsgMHgxMiBdID0gS0VZX0tQRE9ULAkJLyogMTAwKyAqLwogCiAJWyAweDcgIF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAweGIgIF0gPSBLRVlfVk9MVU1FRE9XTiwKQEAgLTEwOSwyNSArMTA5LDE2IEBACiAJWyAweDEzIF0gPSBLRVlfQ0hBTk5FTERPV04sCiAJWyAweDQ4IF0gPSBLRVlfWk9PTSwKIAotCVsgMHgxYiBdID0gS0VZX1ZJREVPLAkJLy8gVmlkZW8gc291cmNlCi0jaWYgMAotCVsgMHgxZiBdID0gS0VZX1MsICAgICAgIAkvLyBTbmFwc2hvdAotI2VuZGlmCi0JWyAweDQ5IF0gPSBLRVlfTEFOR1VBR0UsCS8vIE1UUyBTZWxlY3QKLQlbIDB4MTkgXSA9IEtFWV9TRUFSQ0gsCQkvLyBBdXRvIFNjYW4KKwlbIDB4MWIgXSA9IEtFWV9WSURFTywJCS8qIFZpZGVvIHNvdXJjZSAqLworCVsgMHg0OSBdID0gS0VZX0xBTkdVQUdFLAkvKiBNVFMgU2VsZWN0ICovCisJWyAweDE5IF0gPSBLRVlfU0VBUkNILAkJLyogQXV0byBTY2FuICovCiAKIAlbIDB4NGIgXSA9IEtFWV9SRUNPUkQsCiAJWyAweDQ2IF0gPSBLRVlfUExBWSwKLQlbIDB4NDUgXSA9IEtFWV9QQVVTRSwgICAJLy8gUGF1c2UKKwlbIDB4NDUgXSA9IEtFWV9QQVVTRSwgICAJLyogUGF1c2UgKi8KIAlbIDB4NDQgXSA9IEtFWV9TVE9QLAotI2lmIDAKLQlbIDB4NDMgXSA9IEtFWV9ULCAgICAJCS8vIFRpbWUgU2hpZnQKLQlbIDB4NDcgXSA9IEtFWV9ZLCAgICAJCS8vIFRpbWUgU2hpZnQgT0ZGCi0JWyAweDRhIF0gPSBLRVlfTywgICAgCQkvLyBUT1AKLQlbIDB4MTcgXSA9IEtFWV9GLCAgICAJCS8vIFNVUkYgQ0gKLSNlbmRpZgotCVsgMHg0MCBdID0gS0VZX0ZPUldBUkQsICAgCS8vIEZvcndhcmQgPwotCVsgMHg0MiBdID0gS0VZX1JFV0lORCwgICAJLy8gQmFja3dhcmQgPworCVsgMHg0MCBdID0gS0VZX0ZPUldBUkQsICAgCS8qIEZvcndhcmQgPyAqLworCVsgMHg0MiBdID0gS0VZX1JFV0lORCwgICAJLyogQmFja3dhcmQgPyAqLwogCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCmluZGV4IGI0ZWU5ZGYuLjYyMzkyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCkBAIC01NjcsMTAgKzU2Nyw2IEBACiAJc3dpdGNoIChhdWRtb2RlKSB7CiAJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgogCQlzcmMgPSAweDAwMjAgfCBuaWNhbTsKLSNpZiAwCi0JCS8qIHNwYXRpYWwgZWZmZWN0ICovCi0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDUsMHg0MDAwKTsKLSNlbmRpZgogCQlicmVhazsKIAljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgogCQlpZiAobXNwLT5tb2RlID09IE1TUF9NT0RFX0FNX05JQ0FNKSB7CkBAIC03NDEsMTYgKzczNywxNCBAQAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCXNjaGVkdWxlKCk7CiAJCX0gZWxzZSB7Ci0jaWYgMAotCQkJLyogaG1tLCB0aGF0IG9uZSBkb2Vzbid0IHJldHVybiBvbiB3YWtldXAgLi4uICovCi0JCQltc2xlZXBfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKLSNlbHNlCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLSNlbmRpZgogCQl9CiAJfQotCXRyeV90b19mcmVlemUoKTsKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKKwkJcmVmcmlnZXJhdG9yICgpOworCX0KKwogCXJlbW92ZV93YWl0X3F1ZXVlKCZtc3AtPndxLCAmd2FpdCk7CiAJcmV0dXJuIG1zcC0+cmVzdGFydDsKIH0KQEAgLTExNTQsMTcgKzExNDgsMTAgQEAKIAkJCQkJICAgIE1TUF9DQVJSSUVSKDEwLjcpKTsKIAkJCS8qIHNjYXJ0IHJvdXRpbmcgKi8KIAkJCW1zcDM0MDBjX3NldF9zY2FydChjbGllbnQsU0NBUlRfSU4yLDApOwotI2lmIDAKLQkJCS8qIHJhZGlvIGZyb20gU0NBUlRfSU4yICovCi0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwOCwgMHgwMjIwKTsKLQkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA5LCAweDAyMjApOwotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MGIsIDB4MDIyMCk7Ci0jZWxzZQogCQkJLyogbXNwMzR4eCBkb2VzIHJhZGlvIGRlY29kaW5nICovCiAJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwOCwgMHgwMDIwKTsKIAkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA5LCAweDAwMjApOwogCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MGIsIDB4MDAyMCk7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIDB4MDAwMzoKIAkJY2FzZSAweDAwMDQ6CkBAIC0xNTA3LDEwICsxNDk0LDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotI2lmIDAKLQkvKiB0aGlzIHdpbGwgdHVybiBvbiBhIDFrSHogYmVlcCAtIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uICovCi0JbXNwMzQwMGNfd3JpdGUoYyxJMkNfTVNQMzQwMENfREZQLCAweDAwMTQsIDB4MTA0MCk7Ci0jZW5kaWYKIAltc3AzNDAwY19zZXR2b2x1bWUoYywgbXNwLT5tdXRlZCwgbXNwLT52b2x1bWUsIG1zcC0+YmFsYW5jZSk7CiAKIAlzbnByaW50ZihjLT5uYW1lLCBzaXplb2YoYy0+bmFtZSksICJNU1AzNCUwMmQlYy0lYyVkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCmluZGV4IDk1YWQxN2IuLjJmYjdjMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IG10MjB4eC5jLHYgMS40IDIwMDUvMDMvMDQgMDk6MjQ6NTYga3JheGVsIEV4cCAkCisgKiAkSWQ6IG10MjB4eC5jLHYgMS41IDIwMDUvMDYvMTYgMDg6Mjk6NDkgbnNoIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29udHJvbHMgbWljcm90dW5lIHR1bmVycywgbXQyMDMyICsgbXQyMDUwIGF0IHRoZSBtb21lbnQuCkBAIC0yOTUsOCArMjk1LDggQEAKIAlpbnQgaWYyID0gdC0+cmFkaW9faWYyOwogCiAJLy8gcGVyIE1hbnVhbCBmb3IgRk0gdHVuaW5nOiBmaXJzdCBpZiBjZW50ZXIgZnJlcS4gMTA4NSBNSHoKLSAgICAgICAgbXQyMDMyX3NldF9pZl9mcmVxKGMsIGZyZXEqNjI1MDAgLyogZnJlcSoxMDAwKjEwMDAvMTYgKi8sCi0JCQkgICAxMDg1KjEwMDAqMTAwMCxpZjIsaWYyLGlmMik7CisgICAgICAgIG10MjAzMl9zZXRfaWZfZnJlcShjLCBmcmVxICogMTAwMCAvIDE2LAorCQkJICAgICAgMTA4NSoxMDAwKjEwMDAsaWYyLGlmMixpZjIpOwogfQogCiAvLyBJbml0YWxpemF0aW9uIGFzIGRlc2NyaWJlZCBpbiAiTVQyMDN4IFByb2dyYW1taW5nIFByb2NlZHVyZXMiLCBSZXYgMS4yLCBGZWIuMjAwMQpAQCAtNTExLDIyICs1MTEsNiBAQAogCXR1bmVyX2luZm8oIm1pY3JvdHVuZTogY29tcGFueWNvZGU9JTA0eCBwYXJ0PSUwMnggcmV2PSUwMnhcbiIsCiAJCSAgIGNvbXBhbnlfY29kZSxidWZbMHgxM10sYnVmWzB4MTRdKTsKIAotI2lmIDAKLQkvKiBzZWVtcyB0byBjYXVzZSBtb3JlIHByb2JsZW1zIHRoYW4gaXQgc29sdmVzIC4uLiAqLwotCXN3aXRjaCAoY29tcGFueV9jb2RlKSB7Ci0JY2FzZSAweDMwYmY6Ci0JY2FzZSAweDNjYmY6Ci0JY2FzZSAweDNkYmY6Ci0JY2FzZSAweDRkNTQ6Ci0JY2FzZSAweDhlODE6Ci0JY2FzZSAweDhlOTE6Ci0JCS8qIG9rICg/KSAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl0dW5lcl93YXJuKCJ0dW5lcjogbWljcm90dW5lOiB1bmtub3duIGNvbXBhbnljb2RlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2VuZGlmCiAKIAlpZiAoYnVmWzB4MTNdIDwgQVJSQVlfU0laRShtaWNyb3R1bmVfcGFydCkgJiYKIAkgICAgTlVMTCAhPSBtaWNyb3R1bmVfcGFydFtidWZbMHgxM11dKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKaW5kZXggNzBiZjFmMS4uNDg2MjM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCkBAIC0zMjYsNiArMzI2LDcgQEAKIAlzdHJ1Y3QgbXhiKiBteGIgPSAoc3RydWN0IG14YiopZGV2LT5leHRfcHJpdjsKIAlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9pbml0IGluaXQ7CiAJc3RydWN0IGkyY19tc2cgbXNnOworCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAKIAlpbnQgaSA9IDAsIGVyciA9IDA7CiAJc3RydWN0CXRlYTY0MTVjX211bHRpcGxleCB2bTsJCkBAIC0zNDksOCArMzUwLDEwIEBACiAJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfVkJJX0JZUEFTUywgJmkpOwogCiAJLyogc2VsZWN0IGEgdHVuZXIgdHlwZSAqLwotCWkgPSA1OyAKLQlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lcixUVU5FUl9TRVRfVFlQRSwgJmkpOworCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsKKwl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CisJdHVuX3NldHVwLnR5cGUgPSA1OworCW14Yi0+dHVuZXItPmRyaXZlci0+Y29tbWFuZChteGItPnR1bmVyLFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwogCQogCS8qIG11dGUgYXVkaW8gb24gdGVhNjQyMHMgKi8KIAlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwppbmRleCBlNmQwYTE4Li43OWQwNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCkBAIC0xNTUsMTAgKzE1NSw2IEBACiAJCS50YXJnZXQgID0gMjU2LAogCX0sCiAKLSNpZiAwCi0JLyogRklYTUU6IHNpemU/IHZpYSBTX0ZNVD8gKi8KLQkudmlkZW9fZm9ybWF0ID0gTVBFR19WSURFT19GT1JNQVRfRDEsCi0jZW5kaWYKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IDBjNzgxZTIuLjg4YjcxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtMSw2ICsxLDUgQEAKLQogLyoKLSAqICRJZDogc2FhNzEzNC1jYXJkcy5jLHYgMS41OCAyMDA1LzA2LzA3IDE4OjA1OjAwIG5zaCBFeHAgJAorICogJElkOiBzYWE3MTM0LWNhcmRzLmMsdiAxLjgwIDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogY2FyZC1zcGVjaWZpYyBzdHVmZi4KQEAgLTQ3LDYgKzQ2LDEwIEBACiAJCS5uYW1lCQk9ICJVTktOT1dOL0dFTkVSSUMiLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9ICJkZWZhdWx0IiwKIAkJCS52bXV4ID0gMCwKQEAgLTU4LDYgKzYxLDEwIEBACiAJCS5uYW1lCQk9ICJQcm90ZXVzIFBybyBbcGhpbGlwcyByZWZlcmVuY2UgZGVzaWduXSIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAwLApAQCAtODMsNiArOTAsMTAgQEAKIAkJLm5hbWUJCT0gIkxpZmVWaWV3IEZseVZJREVPMzAwMCIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC05MCw3ICsxMDEsNyBAQAogCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQl9LHsKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKQEAgLTExNywxMiArMTI4LDIxIEBACiAJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDIwMDAsCiAJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDBdID0gewogCQkvKiAiVEMgV2FuIiA8dGN3YW5AY3MudXNtLm15PiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VklERU8yMDAwIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtMTQ2LDE0ICsxNjYsMTQgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHgyMDAwLAotICAgICAgICAgICAgICAgIH0sCisJCX0sCiAJCS5tdXRlID0gewogCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQl9LAogCX0sCkBAIC0xNjIsNiArMTgyLDEwIEBACiAJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlUViBQbGF0aW51bSBNaW5pIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKQEAgLTE4Myw2ICsyMDcsMTAgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkxpZmVWaWV3IEZseVRWIFBsYXRpbnVtIEZNIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmdwaW9tYXNrICAgICAgID0gMHgxRTAwMCwJLyogU2V0IEdQMTYgYW5kIHVudXNlZCAxNSwxNCwxMyB0byBPdXRwdXQgKi8KIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTE5MCw3ICsyMTgsNyBAQAogCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHgxMDAwMCwJLyogR1AxNj0xIHNlbGVjdHMgVFYgaW5wdXQgKi8KIAkJCS50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKKwkJfSx7CiAvKgkJCS5uYW1lID0gbmFtZV90dl9tb25vLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKQEAgLTIwMCwyOSArMjI4LDM4IEBACiAqLwkJCS5uYW1lID0gbmFtZV9jb21wMSwJLyogQ29tcG9zaXRlIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCiAJCQkudm11eCA9IDAsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKKy8qCQkJLmdwaW8gPSAweDQwMDAsICAgICAgICAgKi8KIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDIsCS8qIENvbXBvc2l0ZSBpbnB1dCAqLwogCQkJLnZtdXggPSAzLAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCisvKgkJCS5ncGlvID0gMHg0MDAwLCAgICAgICAgICovCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywJLyogUy1WaWRlbyBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLwogCQkJLnZtdXggPSA4LAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCisvKgkJCS5ncGlvID0gMHg0MDAwLCAgICAgICAgICovCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IFRWLAogCQkJLmdwaW8gPSAweDAwMDAwLAkvKiBHUDE2PTAgc2VsZWN0cyBGTSByYWRpbyBhbnRlbm5hICovCiAJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDEwMDAwLAorCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfRU1QUkVTU10gPSB7CiAJCS8qICJHZXJ0IFZlcnZvb3J0IiA8Z2VydC52ZXJ2b29ydEBwaGlsaXBzLmNvbT4gKi8KIAkJLm5hbWUJCT0gIkVNUFJFU1MiLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gMCwKQEAgLTI0NSwzMyArMjgyLDQwIEBACiAJCS52aWRlb19vdXQgPSBDQ0lSNjU2LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfTU9OU1RFUlRWXSA9IHsKLSAgICAgICAgICAgICAgIC8qICJLLk9odGEiIDxhbHBoYTI5MkBicmVtZW4ub3IuanA+ICovCi0gICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU0tOZXQgTW9uc3RlciBUViIsCi0gICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCi0gICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgIH19LAotICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICB9LAorCQkvKiAiSy5PaHRhIiA8YWxwaGEyOTJAYnJlbWVuLm9yLmpwPiAqLworCQkubmFtZSAgICAgICAgICAgPSAiU0tOZXQgTW9uc3RlciBUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9NRDk3MTddID0gewogCQkubmFtZQkJPSAiVGV2aW9uIE1EIDk3MTciLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCkBAIC0zMDIsMTAgKzM0NiwxMyBAQAogCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfVFZTVEFUSU9OX1JEU10gPSB7Ci0gICAgICAgICAgICAgICAgLyogVHlwaG9vbiBUViBUdW5lciBSRFM6IEFydC5Oci4gNTA2OTQgKi8KKwkJLyogVHlwaG9vbiBUViBUdW5lciBSRFM6IEFydC5Oci4gNTA2OTQgKi8KIAkJLm5hbWUJCT0gIktOQyBPbmUgVFYtU3RhdGlvbiBSRFMgLyBUeXBob29uIFRWIFR1bmVyIFJEUyIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtMzE0LDEwICszNjEsMTAgQEAKIAkJCS50diAgID0gMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CiAKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCkBAIC0zMjgsMTAgKzM3NSwxMCBAQAogCQkJLmFtdXggPSBMSU5FMSwKIAkJfSx7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gIkNWaWQgb3ZlciBTVmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfX0sCisJCQkubmFtZSA9ICJDVmlkIG92ZXIgU1ZpZCIsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggPSBMSU5FMiwKQEAgLTM0MSw2ICszODgsOSBAQAogCQkubmFtZQkJPSAiS05DIE9uZSBUVi1TdGF0aW9uIERWUiIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZgk9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmdwaW9tYXNrCT0gMHg4MjAwMDAsCiAJCS5pbnB1dHMJCT0ge3sKQEAgLTM2OSwzMiArNDE5LDM4IEBACiAJCS52aWRlb19vdXQJPSBDQ0lSNjU2LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNDAwIFRWIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH19Ci0gICAgICAgIH0sCisJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDQwMCBUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLCAvKiBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yICovCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fQorCX0sCiAJW1NBQTcxMzRfQk9BUkRfTUQ1MDQ0XSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIk1lZGlvbiA1MDQ0IiwKLQkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywgLy8gd2FzOiAweDAwMjAwMDAwLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LCAvKiB3YXM6IDB4MDAyMDAwMDAsICovCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTQyNiw1NyArNDgyLDY1IEBACiAJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9LV09STERdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJLd29ybGQvS3Vyb3V0b1NoaWtvdSBTQUE3MTMwLVRWUENJIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZC9LdXJvdXRvU2hpa291IFNBQTcxMzAtVFZQQ0kiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDBdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDYwMCBUViIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH19LAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwgLyogQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICB9LAotICAgICAgICB9LAorCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9NRDcxMzRdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiTWVkaW9uIDcxMzQiLAotCQkvLy5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAogCQkuaW5wdXRzID0ge3sKQEAgLTUwNCw2ICs1NjgsOSBAQAogCQkubmFtZSAgICAgICAgICAgPSAiVHlwaG9vbiBUVitSYWRpbyA5MDAzMSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lICAgPSBuYW1lX3R2LApAQCAtNTIzLDExICs1OTAsMTQgQEAKIAkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggICA9IExJTkUyLAogCQl9LAotICAgICAgICB9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfRUxTQV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJFTFNBIEVYLVZJU0lPTiAzMDBUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0hJVEFDSElfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKQEAgLTU0MiwxMSArNjEyLDE0IEBACiAJCQkuYW11eCA9IExJTkUyLAogCQkJLnR2ICAgPSAxLAogCQl9fSwKLSAgICAgICAgfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0VMU0FfNTAwVFZdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiRUxTQSBFWC1WSVNJT04gNTAwVFYiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9ISVRBQ0hJX05UU0MsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDcsCkBAIC01NjIsODMgKzYzNSwxMDAgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCiAJCX19LAotICAgICAgICB9LAotCVtTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzRdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzQiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSwKIAl9LAotCVtTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzVdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzUiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCVtTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzRdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTM0IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDYsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzVdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTM1IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MjAwMDAwLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHgwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA2LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA2LAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHgwMDAwLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IFRWLAogCQkJLmdwaW8gPSAweDIwMDAwMCwKLSAgICAgICAgICAgICAgICB9LAorCQl9LAorCQkubXV0ZSAgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5ncGlvID0gMHgwMDAwLAorCQl9LAorCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9WQTEwMDBQT1dFUl0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFPUEVOIFZBMTAwMCBQT1dFUiIsCisJCS5uYW1lICAgICAgICAgICA9ICJBT1BFTiBWQTEwMDAgUE9XRVIiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfX0sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF8xME1PT05TVFZNQVNURVJdID0gewogCQkvKiAibGlsaWNoZW5nIiA8bGxjQGxpbnV4ZmFucy5vcmc+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICIxME1PT05TIFBDSSBUViBDQVBUVVJFIENBUkQiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtNjYyLDE0ICs3NTIsMTQgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHgyMDAwLAotICAgICAgICAgICAgICAgIH0sCisJCX0sCiAJCS5tdXRlID0gewogCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQl9LAogCX0sCkBAIC02NzgsNiArNzY4LDkgQEAKIAkJLm5hbWUJCT0gIkJNSyBNUEVYIE5vIFR1bmVyIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDQsCkBAIC03MDYsODAgKzc5OSw5NCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvTWF0ZSBUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAotICAgIFtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNdID0geworCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU10gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIEdvbGQrIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCiAJCS5ncGlvbWFzayAgICAgICA9IDB4ODAwYzAwMDAsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8gPSAweDA2YzAwMDEyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvID0gMHgwYWMyMDAxMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbyA9IDB4MDhjMjAwMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDA2YzAwMDEyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MGFjMjAwMTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwOGMyMDAxMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCQkJCS8qIHJhZGlvIGFuZCBwcm9iYWJseSBtdXRlIGlzIG1pc3NpbmcgKi8KKwl9LAogCVtTQUE3MTM0X0JPQVJEX0NST05PU19QTFVTXSA9IHsKLQkJLyogZ3BpbyBwaW5zOgotCQkgICAwICAuLiAzICAgQkFTRV9JRAotCQkgICA0ICAuLiA3ICAgUFJPVEVDVF9JRAotCQkgICA4ICAuLiAxMSAgVVNFUl9PVVQKLQkJICAgMTIgLi4gMTMgIFVTRVJfSU4KLQkJICAgMTQgLi4gMTUgIFZJRElOX1NFTCAqLworCQkvKgorCQlncGlvIHBpbnM6CisJCQkwICAuLiAzICAgQkFTRV9JRAorCQkJNCAgLi4gNyAgIFBST1RFQ1RfSUQKKwkJCTggIC4uIDExICBVU0VSX09VVAorCQkJMTIgLi4gMTMgIFVTRVJfSU4KKwkJCTE0IC4uIDE1ICBWSURJTl9TRUwKKwkJKi8KIAkJLm5hbWUgICAgICAgICAgID0gIk1hdHJveCBDcm9ub3NQbHVzIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4Y2YwMCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAogCQkJLmdwaW8gPSAyIDw8IDE0LAogCQl9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMCwKIAkJCS5ncGlvID0gMSA8PCAxNCwKIAkJfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCQkubmFtZSA9IG5hbWVfY29tcDMsCisJCQkudm11eCA9IDAsCiAJCQkuZ3BpbyA9IDAgPDwgMTQsCiAJCX0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorCQkJLm5hbWUgPSBuYW1lX2NvbXA0LAorCQkJLnZtdXggPSAwLAogCQkJLmdwaW8gPSAzIDw8IDE0LAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCiAJCQkuZ3BpbyA9IDIgPDwgMTQsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfTUQyODE5XSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBNMTU2IC8gTWVkaW9uIDI4MTkiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC04MDksNiArOTE2LDkgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkJNSyBNUEVYIFR1bmVyIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDEsCkBAIC04MjUsNjIgKzkzNSw3MiBAQAogCQl9fSwKIAkJLm1wZWcgICAgICA9IFNBQTcxMzRfTVBFR19FTVBSRVNTLAogCQkudmlkZW9fb3V0ID0gQ0NJUjY1NiwKLSAgICAgICAgfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfQVNVU1RFS19UVkZNNzEzM10gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzMyIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLQkJLy8gcHJvYmFibHkgd3JvbmcsIHRoZSA3MTMzIG9uZSBpcyB0aGUgTlRTQyB2ZXJzaW9uIC4uLgotCQkvLyAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDLAotICAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzNdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTMzIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLyogcHJvYmFibHkgd3JvbmcsIHRoZSA3MTMzIG9uZSBpcyB0aGUgTlRTQyB2ZXJzaW9uIC4uLgorCQkqIC50dW5lcl90eXBlICA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMyAqLworCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisKIAkJfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAorCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA2LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWX1NURVJFT10gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgU3RlcmVvIChzYWE3MTM0KSIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTdGVyZW8gKHNhYTcxMzQpIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfSU5URVJDQVJSSUVSLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAyXSA9IHsKIAkJLyogT2duamVuIE5hc3RpYyA8b2duamVuQGxvZ29zb2Z0LmJhPiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiTWFubGkgTXVjaFRWIE0tVFYwMDIvQmVob2xkIFRWIDQwMyBGTSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LApAQCAtOTA1LDYgKzEwMjUsOSBAQAogCQkubmFtZSAgICAgICAgICAgPSAiTWFubGkgTXVjaFRWIE0tVFYwMDEvQmVob2xkIFRWIDQwMSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LApAQCAtOTIxLDE0ICsxMDQ0LDE3IEBACiAJCX19LAogCQkubXV0ZSA9IHsKIAkJCS5uYW1lID0gbmFtZV9tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX0sCi0gICAgICAgIH0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9URzMwMDBUVl0gPSB7CiAJCS8qIFRyYW5zR2VhciAzMDAwVFYgKi8KIAkJLm5hbWUgICAgICAgICAgID0gIk5hZ2FzZSBTYW5neW8gVHJhbnNHZWFyIDMwMDBUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCkBAIC05NDQsODEgKzEwNzAsOTAgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCX19LAogCX0sCi0gICAgICAgIFtTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJFbGl0ZWdyb3VwIEVDUyBUVlAzWFAgRk0xMjE2IFR1bmVyIENhcmQoUEFMLUJHLEZNKSAiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LCAgLy8geHRhbCAzMi4xIE1IegotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90dl9tb25vLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKKwlbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyMTYgVHVuZXIgQ2FyZChQQUwtQkcsRk0pICIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LCAgLyogeHRhbCAzMi4xIE1IeiAqLworCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCiAJCX0sewogCQkJLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCiAJCQkudm11eCAgID0gMCwKIAkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1XSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIzNiBUdW5lciBDYXJkIChOVFNDLEZNKSIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90dl9tb25vLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSAiQ1ZpZCBvdmVyIFNWaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjVdID0geworCQkubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIzNiBUdW5lciBDYXJkIChOVFNDLEZNKSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gTElORTIsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSA4LAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSAiQ1ZpZCBvdmVyIFNWaWQiLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0FWQUNTU01BUlRUVl0gPSB7CiAJCS8qIFJvbWFuIFBzem9uY3plbmtvIDxyb21rYUBrb2xvcy5tYXRoLnVuaS5sb2R6LnBsPiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiQVZBQ1MgU21hcnRUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IFRWLAogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQl9LHsKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKQEAgLTEwNDcsNiArMTE4Miw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgRFZEIEVaTWFrZXIiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gMywKQEAgLTEwNTUsMjggKzExOTMsMzQgQEAKIAkJCS52bXV4ID0gOCwKIAkJfX0sCiAJfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfTk9WQUNfUFJJTUVUVjcxMzNdID0gewotICAgICAgICAgICAgICAgIC8qIHRvc2hpaUBuZXRic2Qub3JnICovCi0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIk5vdmFsIFByaW1lIFRWIDcxMzMiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUxQU19UU0JIMV9OVFNDLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9OT1ZBQ19QUklNRVRWNzEzM10gPSB7CisJCS8qIHRvc2hpaUBuZXRic2Qub3JnICovCisJCS5uYW1lICAgICAgICAgICA9ICJOb3ZhbCBQcmltZSBUViA3MTMzIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUxQU19UU0JIMV9OVFNDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQl9fSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1XSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgU3R1ZGlvIDMwNSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0xMDk3LDM1ICsxMjQxLDQxIEBACiAJCQkuYW11eCA9IExJTkUyLAogCQl9fSwKIAkJLnJhZGlvID0gewotCQkJIC5uYW1lID0gbmFtZV9yYWRpbywKLQkJCSAuYW11eCA9IExJTkUyLAotCQkgfSwKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCiAJCS5tdXRlID0gewotCQkJIC5uYW1lID0gbmFtZV9tdXRlLAotCQkJIC5hbXV4ID0gTElORTEsCisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX0sCiAJfSwKLSAgCVtTQUE3MTMzX0JPQVJEX1VQTU9TVF9QVVJQTEVfVFZdID0gewotICAJCS5uYW1lICAgICAgICAgICA9ICJVUE1PU1QgUFVSUExFIFRWIiwKLSAgCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMywKLSAgCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gIAkJLmlucHV0cyAgICAgICAgID0ge3sKLSAgCQkJLm5hbWUgPSBuYW1lX3R2LAotICAJCQkudm11eCA9IDcsCi0gIAkJCS5hbXV4ID0gVFYsCi0gIAkJCS50diAgID0gMSwKLSAgCQl9LHsKLSAgCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgCQkJLnZtdXggPSA3LAotICAJCQkuYW11eCA9IExJTkUxLAotICAJCX19LAorCVtTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFZdID0geworCQkubmFtZSAgICAgICAgICAgPSAiVVBNT1NUIFBVUlBMRSBUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDcsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDcsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0lURU1TX01UVjAwNV0gPSB7CiAJCS8qIE5vcm1hbiBKb25hcyA8bm9ybWFuam9uYXNAYXJjb3IuZGU+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJJdGVtcyBNdWNoVFYgUGx1cyAvIElULTAwNSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDMsCkBAIC0xMTQ5LDI3ICsxMjk5LDMwIEBACiAJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDIwMCBUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwgLyogQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfX0sCiAJCS5tdXRlID0gewotCQkJIC5uYW1lID0gbmFtZV9tdXRlLAotCQkJIC5hbXV4ID0gTElORTIsCisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTIsCiAJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSXSA9IHsKQEAgLTExNzcsODQgKzEzMzAsOTYgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkNvbXBybyBWaWRlb01hdGUgVFYgUFZSL0ZNIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrCT0gMHg4MDhjMDA4MCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHgwMDA4MCwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHgwMDA4MCwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTJfTEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyX0xFRlQsCisJCQkudHYgICA9IDEsCiAJCQkuZ3BpbyA9IDB4MDAwODAsCi0gICAgICAgICAgICAgICAgfX0sCisJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDgwMDAwLAotCQkgfSwKKwkJfSwKIAkJLm11dGUgPSB7CiAJCQkubmFtZSA9IG5hbWVfbXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDQwMDAwLAogCQl9LAotICAgICAgICB9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk1dID0geworCX0sCisJW1NBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNXSA9IHsKIAkJLyogTWljaGFlbCBSb2RyaWd1ZXotVG9ycmVudCA8bXJ0b3JyZW50QGFzdS5lZHU+ICovCi0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNhYnJlbnQgU0JULVRWRk0gKHNhYTcxMzApIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisJCS5uYW1lICAgICAgICAgICA9ICJTYWJyZW50IFNCVC1UVkZNIChzYWE3MTMwKSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLAogCQl9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAorCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfWk9MSURfWFBFUlRfVFY3MTM0XSA9IHsKIAkJLyogSGVsZ2UgSmVuc2VuIDxoZWxnZS5qZW5zZW5Ac2xvZy5kaz4gKi8KLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiOlpvbGlkIFhwZXJ0IFRWNzEzNCIsCisJCS5uYW1lICAgICAgICAgICA9ICI6Wm9saWQgWHBlcnQgVFY3MTM0IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfX0sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9FTVBJUkVfUENJX1RWX1JBRElPX0xFXSA9IHsKIAkJLyogIk1hdHRlbyBBeiIgPG1hdHRlLmF6QG5vc3BhbS5saWJlcm8uaXQ+IDstKSAqLwogCQkubmFtZSAgICAgICAgICAgPSAiRW1waXJlIFBDSSBUVi1SYWRpbyBMRSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4NDAwMCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLApAQCAtMTI3MywxOCArMTQzOCwxOCBAQAogCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQl9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX3JhZGlvLAotCQkJIC5hbXV4ID0gTElORTEsCi0JCQkgLmdwaW8gPSAweDgwMDAsCi0JCSB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX0sCiAJCS5tdXRlID0gewotCQkJIC5uYW1lID0gbmFtZV9tdXRlLAotCQkJIC5hbXV4ID0gVFYsCi0JCQkgLmdwaW8gPTB4ODAwMCwKLQkJIH0KKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0weDgwMDAsCisJCX0KIAl9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwN10gPSB7CisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDddID0gewogCQkvKgogCQlOaWNrb2xheSBWLiBTaG15cmV2IDxuc2hteXJldkB5YW5kZXgucnU+CiAJCUxvdHMgb2YgdGhhbmtzIHRvIEFuZHJleSBab2xvdGFyZXYgPHpvbG90YXJldl9hbmRyZXlAbWFpbC5ydT4KQEAgLTEyOTIsNiArMTQ1Nyw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIFN0dWRpbyAzMDciLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDAzLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewpAQCAtMTMyMSwxMyArMTQ4OSwyMSBAQAogCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHgwMSwKIAkJfSwKLSAgICAgICAgfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTV0gPSB7CisJCS5tdXRlICA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk1dID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQXZlcm1lZGlhIEFWZXJUViBHTyAwMDcgRk0iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMDMwMDAwMywKLS8vCQkuZ3Bpb21hc2sgICAgICAgPSAweDhjMjQwMDAzLAorCQkvKiAuZ3Bpb21hc2sgICAgICAgPSAweDhjMjQwMDAzLCAqLwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLApAQCAtMTM1MCwxNiArMTUyNiwyNCBAQAogCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHgwMDMwMDAwMSwKIAkJfSwKLSAgICAgICAgfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDEsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVU10gPSB7Ci0JCS8qIEpvbiBXZXN0Z2F0ZSA8b3J5bkBvcnluLmZzY2sudHY+ICovCi0JCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgQ2FyZGJ1cyBUVi9SYWRpbyIsCi0JCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkvKiBLZWVzLkJsb21AY3dpLm5sICovCisJCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgQ2FyZGJ1cyBUVi9SYWRpbyAoRTUwMCkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCi0JCQkuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCkBAIC0xMzY4LDEwICsxNTUyLDEwIEBACiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKLQkJCS5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUxLAogCQl9fSwKIAkJLnJhZGlvID0gewotICAgICAgICAgICAgICAgIAkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUxLAogCQl9LAogCX0sCkBAIC0xMzc5LDExOSArMTU2MywxMzQgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNDAwIG1vYmlsZSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkU1X1BBTCwKLSAgCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgIAkJCS5uYW1lID0gbmFtZV90diwKKwkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICB9LHsKKwkJfSx7CiAJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LM10gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIE1LMyIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIE1LMyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCi0gIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsIC8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVU10gPSB7Ci0gCQkvKiBEeWxhbiBXYWxrZGVuIDxkeWxhbl93YWxrZGVuQGhvdG1haWwuY29tPiAqLwotIAkJLm5hbWUJCT0gIkNvbXBybyBWaWRlb01hdGUgR29sZCsgUGFsIiwKLSAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCi0gCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAotIAkJLmdwaW9tYXNrCT0gMHgxY2U3ODAsCi0gCQkuaW5wdXRzCQk9IHt7Ci0gCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAJCQkudm11eCA9IDAsCQkvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yIC0gb2s/Ci0gCQkJLmFtdXggPSBMSU5FMSwKLSAJCQkuZ3BpbyA9IDB4MDA4MDgwLAotIAkJfSx7Ci0gCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAotIAkJCS52bXV4ID0gMywKLSAJCQkuYW11eCA9IExJTkUxLAotIAkJCS5ncGlvID0gMHgwMDgwODAsCi0gCQl9LHsKLSAJCQkubmFtZSA9IG5hbWVfdHYsCi0gCQkJLnZtdXggPSAxLAotIAkJCS5hbXV4ID0gVFYsCi0gCQkJLnR2ICAgPSAxLAotIAkJCS5ncGlvID0gMHgwMDgwODAsCi0gCQl9fSwKLSAJCS5yYWRpbyA9IHsKLSAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCi0gCQkJLmFtdXggPSBMSU5FMiwKLSAJCQkuZ3BpbyA9IDB4ODAwMDAsCi0gCQl9LAotIAkJLm11dGUgPSB7Ci0gCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gCQkJLmFtdXggPSBMSU5FMiwKLSAJCQkuZ3BpbyA9IDB4MGM4MDAwLAotIAkJfSwKLSAJfSwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVNdID0geworCQkvKiBEeWxhbiBXYWxrZGVuIDxkeWxhbl93YWxrZGVuQGhvdG1haWwuY29tPiAqLworCQkubmFtZQkJPSAiQ29tcHJvIFZpZGVvTWF0ZSBHb2xkKyBQYWwiLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sJPSAweDFjZTc4MCwKKwkJLmlucHV0cwkJPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gMCwJCS8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgLSBvaz8gKi8KKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg4MDAwMCwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MGM4MDAwLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgMzAwaSBEVkItVCArIFBBTCIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIDMwMGkgRFZCLVQgKyBQQUwiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCiAJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfUFJPVklERU9fUFY5NTJdID0gewogCQkvKiBhbmRyZWFzLmtyZXRzY2htZXJAd2ViLmRlICovCiAJCS5uYW1lCQk9ICJQcm9WaWRlbyBQVjk1MiIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLApAQCAtMTUxNSwxMCArMTcxNCwxMyBAQAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNV0gPSB7CiAJCS8qIG11Y2ggbGlrZSB0aGUgInN0dWRpbyIgdmVyc2lvbiBidXQgd2l0aG91dCByYWRpbwotCQkgKiBhbmQgYW5vdGhlciB0dW5lciAoc2lyc3Bpcml0dXNAeWFuZGV4LnJ1KSAqLworCQkqIGFuZCBhbm90aGVyIHR1bmVyIChzaXJzcGlyaXR1c0B5YW5kZXgucnUpICovCiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgQXZlclRWLzMwNSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtMTUzOSwxMTUgKzE3NDEsMjY4IEBACiAJCQkuYW11eCA9IExJTkUyLAogCQl9fSwKIAkJLm11dGUgPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX211dGUsCi0JCQkgLmFtdXggPSBMSU5FMSwKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU9dID0gewogCQkvKiBMaWZlVmlldyBGbHlEVkItVCBEVU8gKi8KLQkJLyogIk5pY28gU2FiYmkgPG5zYWJiaUB0aXNjYWxpLml0PiAqLworCQkvKiAiTmljbyBTYWJiaSA8bnNhYmJpQHRpc2NhbGkuaXQ+ICBIYXJ0bXV0IEhhY2ttYW5uIGhhcnRtdXQuaGFja21hbm5AdC1vbmxpbmUuZGUqLwogCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5RFZCLVQgRFVPIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAotLy8JCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBUViwKLS8vCQkJLmdwaW8gPSAweDAwMDAsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCX0sewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAkvKiBDb21wb3NpdGUgc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KIAkJCS52bXV4ID0gMCwKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9jb21wMiwJLyogQ29tcG9zaXRlIGlucHV0ICovCiAJCQkudm11eCA9IDMsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAkvKiBTLVZpZGVvIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCiAJCQkudm11eCA9IDgsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfX0sCiAJfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwN10gPSB7Ci0gICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICBEYXZ5ZG92IFZsYWRpbWlyIDx2bGFkaW1pckBpcW1lZGlhLmNvbT4KLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQXZlcm1lZGlhIEFWZXJUViAzMDciLAotICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsCi0gICAgICAgICAgICAgICAudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAotCVtTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkiLAorCVtTQUE3MTM0X0JPQVJEX1BISUxJUFNfVE9VR0hdID0geworCQkubmFtZSAgICAgICAgICAgPSAiUGhpbGlwcyBUT1VHSCBEVkItVCByZWZlcmVuY2UgZGVzaWduIiwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9BQlNFTlQsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfX0sCiAJfSwKLSAJW1NBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlRdID0gewotIAkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZC9UZXZpb24gVi1TdHJlYW0gWHBlcnQgVFYgUFZSNzEzNCIsCi0gCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUxfSSwKLSAJCS5ncGlvbWFzawk9IDB4MDcwMCwKLSAJCS5pbnB1dHMgPSB7ewotIAkJCS5uYW1lICAgPSBuYW1lX3R2LAotIAkJCS52bXV4ICAgPSAxLAotIAkJCS5hbXV4ICAgPSBUViwKLSAJCQkudHYgICAgID0gMSwKLSAJCQkuZ3BpbyAgID0gMHgwMDAsCi0gCQl9LHsKLSAJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKLSAJCQkudm11eCAgID0gMywKLSAJCQkuYW11eCAgID0gTElORTEsCi0gCQkJLmdwaW8gICA9IDB4MjAwLAkJLy9ncGlvIGJ5IERTY2FsZXIKLSAJCX0sewotIAkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKLSAJCQkudm11eCAgID0gMCwKLSAJCQkuYW11eCAgID0gTElORTEsCi0gCQkJLmdwaW8gICA9IDB4MjAwLAotIAkJfX0sCi0gCQkucmFkaW8gPSB7Ci0gCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCi0gCQkJLmFtdXggICA9IExJTkUxLAotIAkJCS5ncGlvICAgPSAweDEwMCwKLSAJCX0sCi0gCX0sCi0gfTsKKwlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3XSA9IHsKKwkJLyoKKwkJRGF2eWRvdiBWbGFkaW1pciA8dmxhZGltaXJAaXFtZWRpYS5jb20+CisJCSovCisJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIDMwNyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfVFZdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9LV09STERfVlNUUkVBTV9YUEVSVF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJLd29ybGQvVGV2aW9uIFYtU3RyZWFtIFhwZXJ0IFRWIFBWUjcxMzQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTF9JLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5ncGlvbWFzawk9IDB4MDcwMCwKKwkJLmlucHV0cyA9IHt7CisJCQkubmFtZSAgID0gbmFtZV90diwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IFRWLAorCQkJLnR2ICAgICA9IDEsCisJCQkuZ3BpbyAgID0gMHgwMDAsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDIwMCwJCS8qIGdwaW8gYnkgRFNjYWxlciAqLworCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MjAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgxMDAsCisJCX0sCisJCS5tdXRlICA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTXSA9IHsKKwkJLm5hbWUJCT0gIlR5cGhvb24gRFZCLVQgRHVvIERpZ2l0YWwvQW5hbG9nIENhcmRidXMiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLyogLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLCAqLworCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJLyoJLmdwaW8gPSAweDAwMDAsICAgICAgKi8KKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJLyoJLmdwaW8gPSAweDQwMDAsICAgICAgKi8KKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCS8qIENvbXBvc2l0ZSBpbnB1dCAqLworCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJLyoJLmdwaW8gPSAweDQwMDAsICAgICAgKi8KKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAkvKiBTLVZpZGVvIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkvKgkuZ3BpbyA9IDB4NDAwMCwgICAgICAqLworCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTSUldID0geworCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvTWF0ZSBUViBHb2xkK0lJIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVFVORVJfVEVBNTc2NywKKwkJLnR1bmVyX2FkZHIgICAgID0gMHg2MywKKwkJLnJhZGlvX2FkZHIgICAgID0gMHg2MCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHg4YzE4ODAsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHg4MDA4MDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHg4MDEwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHg4MDAwMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDg4MDAwMCwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4ODQwMDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfS1dPUkxEX1hQRVJUXSA9IHsKKwkJLyoKKwkJRklYTUU6CisJCS0gUmVtb3RlIGNvbnRyb2wgZG9lc24ndCBpbml0aWFsaXplIHByb3Blcmx5LgorCQktIEF1ZGlvIHZvbHVtZSBzdGFydHMgbXV0ZWQsCisJCXRoZW4gZ3JhZHVhbGx5IGluY3JlYXNlcyBhZnRlciBjaGFubmVsIGNoYW5nZS4KKwkJLSBPdmVybGF5IHNjYWxpbmcgcHJvYmxlbXMgKGFwcGxpY2F0aW9uIGVycm9yPykKKwkJLSBDb21wb3NpdGUgUy1WaWRlbyB1bnRlc3RlZC4KKwkJRnJvbTogS29ucmFkIFJ6ZXBlY2tpIDxoYW5uaWJhbEBtZWdhcG9saXMucGw+CisJCSovCisJCS5uYW1lICAgICAgICAgICA9ICJLd29ybGQgWHBlcnQgVFYgUFZSNzEzNCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTkFfOTUzM19ESSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVFVORVJfVEVBNTc2NywKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAorCQkucmFkaW9fYWRkcgk9IDB4NjAsCisJCS5ncGlvbWFzawk9IDB4MDcwMCwKKwkJLmlucHV0cyA9IHt7CisJCQkubmFtZSAgID0gbmFtZV90diwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IFRWLAorCQkJLnR2ICAgICA9IDEsCisJCQkuZ3BpbyAgID0gMHgwMDAsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDIwMCwJCS8qIGdwaW8gYnkgRFNjYWxlciAqLworCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MjAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgxMDAsCisJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAwMCwKKwkJfSwKKwl9LAorfTsKKwogCiBjb25zdCB1bnNpZ25lZCBpbnQgc2FhNzEzNF9iY291bnQgPSBBUlJBWV9TSVpFKHNhYTcxMzRfYm9hcmRzKTsKIApAQCAtMTY2MSwxMyArMjAxNiwxMyBAQAogCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9URVVTX1BSTywKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLnN1YmRldmljZSAgICA9IDB4MjAwMSwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUFJPVEVVU19QUk8sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCkBAIC0xNjc2LDcwICsyMDMxLDcwIEBACiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMTMxLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRlODUsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDExMzEsCisJCS5zdWJkZXZpY2UgICAgPSAweDRlODUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX01PTlNURVJUViwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMTQyLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAsCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MTE0MywKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNTNCLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDExNTgsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzMsCi0gICAgICAgIH0seworCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCisJCS5zdWJkZXZpY2UgICAgPSAweDExNDIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKKwkJLnN1YmRldmljZSAgICA9IDB4MTE0MywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxNTNCLAorCQkuc3ViZGV2aWNlICAgID0gMHgxMTU4LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMywKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxNTNiLAogCQkuc3ViZGV2aWNlICAgID0gMHgxMTYyLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwX0NBUkRCVVMsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCiAJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMCwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDRlNDIsCQkJCS8vIlR5cGhvb24gUENJIENhcHR1cmUgVFYgQ2FyZCIgQXJ0Lk5vLiA1MDY3MwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDAxMzgsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLAotICAgICAgICB9LHsKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHg0ZTQyLAkJCQkvKiAiVHlwaG9vbiBQQ0kgQ2FwdHVyZSBUViBDYXJkIiBBcnQuTm8uIDUwNjczICovCisJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMCwKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAogCQkuc3ViZGV2aWNlICAgID0gMHgwMTM4LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDAsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKIAkJLnN1YmRldmljZSAgICA9IDB4MDIxMiwgLyogbWluaXBjaSwgTFIyMTIgKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAkvKiBBbmltYXRpb24gVGVjaG5vbG9naWVzIChMaWZlVmlldykgKi8KIAkJLnN1YmRldmljZSAgICA9IDB4MDIxNCwgLyogU3RhbmRhcmQgUENJLCBMUjIxNFdGICovCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVRWUExBVElOVU1fRk0sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE0ODksIC8qIEtZRSAqLwogCQkuc3ViZGV2aWNlICAgID0gMHgwMjE0LCAvKiBHZW5pdXMgVmlkZW9Xb25kZXIgUHJvVFYgKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSwgLyogaXMgYW4gTFIyMTRXRiBhY3R1YWxseSAqLwotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNmJlLApAQCAtMTc1OCwzNiArMjExMywzNiBAQAogCQkuc3ViZGV2aWNlICAgID0gMHgyMjZiLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9FTFNBXzUwMFRWLAogCX0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NDg0MiwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAorCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4NDIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQsCiAJfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQ1LAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzUsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg0NSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNSwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4MzAsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQzLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzMsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDgzMCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDAsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKLSAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg0MywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RFS19UVkZNNzEzMywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODQwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAorCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCkBAIC0xODA4LDExOCArMjE2MywxMTggQEAKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExMzEsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKwkJLnN1YmRldmljZSAgICA9IDB4NzEzMywKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVkExMDAwUE9XRVIsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgyMDAxLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF8xME1PT05TVFZNQVNURVIsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhjMTAwLAorCQkuc3VidmVuZG9yICAgID0gMHgxODViLAorCQkuc3ViZGV2aWNlICAgID0gMHhjMTAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFYsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhjMTAwLAorCQkuc3VidmVuZG9yICAgID0gMHgxODViLAorCQkuc3ViZGV2aWNlICAgID0gMHhjMTAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX01BVFJPWCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0OGQwLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9NQVRST1gsCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4ZDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NST05PU19QTFVTLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhhNzBiLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhhNzBiLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9NRDI4MTksCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIxMTUsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweDIxMTUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1LAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgyMTA4LAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgyMTA4LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1LAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMGZmLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgxMGZmLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfRFZEX0VaTUFLRVIsCi0gICAgICAgIH0seworCX0sewogCQkvKiBBVmVyTWVkaWEgQ2FyZEJ1cyAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhkNmVlLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhkNmVlLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUywKIAl9LHsKIAkJLyogVHJhbnNHZWFyIDMwMDBUViAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwNTBjLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgwNTBjLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9URzMwMDBUViwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMWJkLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDAwMmIsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl9TVEVSRU8sCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDAyZCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMDE5LAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRjYjQsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUCwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0Y2I1LAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNSwKLSAgICAgICAgfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTJhYiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwODAwLAotIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzNfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViwKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxMWJkLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMDJiLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWX1NURVJFTywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxMWJkLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMDJkLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEwMTksCisJCS5zdWJkZXZpY2UgICAgPSAweDRjYjQsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFAsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKKwkJLnN1YmRldmljZSAgICA9IDB4NGNiNSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1LAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEyYWIsCisJCS5zdWJkZXZpY2UgICAgPSAweDA4MDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFYsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKIAkJLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKIAkJLnN1YmRldmljZSAgICA9IDB4MTE1MiwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTIwMCwKLSAJfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCisJCS5zdWJkZXZpY2UgICAgPSAweGMxMDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlIsCi0gCX0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKwkJLnN1YmRldmljZSAgICA9IDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTSwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKQEAgLTE5MzksMTggKzIyOTQsMjQgQEAKIAkJLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKIAkJLnN1YmRldmljZSAgICA9IDB4YzIwMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVUywKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IDB4MTU0MCwKIAkJLnN1YmRldmljZSAgICA9IDB4OTUyNCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUFJPVklERU9fUFY5NTIsCiAKLSAJfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKLQkJLnN1YmRldmljZSAgICA9IDB4MDMwNiwKKwkJLnN1YmRldmljZSAgICA9IDB4MDUwMiwgICAgICAgICAgICAgICAgLyogQ2FyZGJ1cyB2ZXJzaW9uICovCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU8sCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKKwkJLnN1YmRldmljZSAgICA9IDB4MDMwNiwgICAgICAgICAgICAgICAgLyogUENJIHZlcnNpb24gKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTywKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKQEAgLTE5NTksMzEgKzIzMjAsNDQgQEAKIAkJLnN1YmRldmljZSAgICA9IDB4ZjMxZiwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTSwKIAotIAl9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLQkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1LAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAweDIwMDQsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVE9VR0gsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4MTQyMSwKIAkJLnN1YmRldmljZSAgICA9IDB4MDM1MCwJCS8qIFBDSSB2ZXJzaW9uICovCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWLAogCi0gCX0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4MTQyMSwKIAkJLnN1YmRldmljZSAgICA9IDB4MDM3MCwJCS8qIGNhcmRidXMgdmVyc2lvbiAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9UViwKIAotIAl9LHsKKwl9LHsgICAgIC8qIFR5cGhvb24gRFZCLVQgRHVvIERpZ2l0YWwvQW5hbG9nIENhcmRidXMgKi8KKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg0ZTQyLAorCQkuc3ViZGV2aWNlICAgID0gMHgwNTAyLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTLAorCisJfSx7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCi0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuc3ViZGV2aWNlICAgID0gMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTk9BVVRPLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5zdWJkZXZpY2UgICAgPSAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9OT0FVVE8sCiAJfSx7CkBAIC0xOTkxLDI2ICsyMzY1LDI2IEBACiAJCS8qIC0tLSBkZWZhdWx0IGNhdGNoIC0tLSAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VOS05PV04sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKIAl9LHsKIAkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLwpAQCAtMjAyMSw0NiArMjM5NSw5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZmx5dmlkZW8gdHdlYWtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2lmIDAKLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgICptb2RlbDsKLQlpbnQgICB0dW5lcl90eXBlOwotfSBmbHlfbGlzdFsweDIwXSA9IHsKLQkvKiBkZWZhdWx0IGNhdGNoIC4uLiAqLwotCVsgMCAuLi4gMHgxZiBdID0gewotCQkubW9kZWwgICAgICA9ICJVTktOT1dOIiwKLQkJLnR1bmVyX3R5cGUgPSBUVU5FUl9BQlNFTlQsCi0JfSwKLQkvKiAuLi4gdGhlIG9uZXMga25vd24gc28gZmFyICovCi0JWyAweDA1IF0gPSB7Ci0JCS5tb2RlbCAgICAgID0gIlBBTC1CRyIsCi0JCS50dW5lcl90eXBlID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAotCX0sCi0JWyAweDEwIF0gPSB7Ci0JCS5tb2RlbCAgICAgID0gIlBBTC1CRyAvIFBBTC1ESyIsCi0JCS50dW5lcl90eXBlID0gVFVORVJfUEhJTElQU19QQUwsCi0JfSwKLQlbIDB4MTUgXSA9IHsKLQkJLm1vZGVsICAgICAgPSAiTlRTQyIsCi0JCS50dW5lcl90eXBlID0gVFVORVJfQUJTRU5UIC8qIEZJWE1FICovLAotCX0sCi19OwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGJvYXJkX2ZseXZpZGVvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewotI2lmIDAKLQkvKiBub24td29ya2luZyBhdHRlbXB0IHRvIGRldGVjdCB0aGUgY29ycmVjdCB0dW5lciB0eXBlIC4uLiAqLwotCXUzMiB2YWx1ZTsKLQlpbnQgaW5kZXg7Ci0KLQl2YWx1ZSA9IGRldi0+Z3Bpb192YWx1ZTsKLQlpbmRleCA9ICh2YWx1ZSAmIDB4MWYwMCkgPj4gODsKLQlwcmludGsoS0VSTl9JTkZPICIlczogZmx5dmlkZW86IGdwaW8gaXMgMHgleCBbbW9kZWw9JXMsdHVuZXI9JWRdXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHZhbHVlLCBmbHlfbGlzdFtpbmRleF0ubW9kZWwsCi0JICAgICAgIGZseV9saXN0W2luZGV4XS50dW5lcl90eXBlKTsKLQlkZXYtPnR1bmVyX3R5cGUgPSBmbHlfbGlzdFtpbmRleF0udHVuZXJfdHlwZTsKLSNlbmRpZgogCXByaW50aygiJXM6IHRoZXJlIGFyZSBkaWZmZXJlbnQgZmx5dmlkZW8gY2FyZHMgd2l0aCBkaWZmZXJlbnQgdHVuZXJzXG4iCiAJICAgICAgICIlczogb3V0IHRoZXJlLCB5b3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhlIHR1bmVyPTxucj4gaW5zbW9kXG4iCiAJICAgICAgICIlczogb3B0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlLlxuIiwKQEAgLTIwNzEsNyArMjQwOCw3IEBACiAKIGludCBzYWE3MTM0X2JvYXJkX2luaXQxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewotCS8vIEFsd2F5cyBwcmludCBncGlvLCBvZnRlbiBtYW51ZmFjdHVyZXJzIGVuY29kZSB0dW5lciB0eXBlIGFuZCBvdGhlciBpbmZvLgorCS8qIEFsd2F5cyBwcmludCBncGlvLCBvZnRlbiBtYW51ZmFjdHVyZXJzIGVuY29kZSB0dW5lciB0eXBlIGFuZCBvdGhlciBpbmZvLiAqLwogCXNhYV93cml0ZWwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgMCk7CiAJZGV2LT5ncGlvX3ZhbHVlID0gc2FhX3JlYWRsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJvYXJkIGluaXQ6IGdwaW8gaXMgJXhcbiIsIGRldi0+bmFtZSwgZGV2LT5ncGlvX3ZhbHVlKTsKQEAgLTIwODIsNyArMjQxOSw3IEBACiAJCWRldi0+aGFzX3JlbW90ZSA9IDE7CiAJCWJvYXJkX2ZseXZpZGVvKGRldik7CiAJCWJyZWFrOwotICAgICAgICBjYXNlIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTToKKwljYXNlIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTToKIAljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzM6CkBAIC0yMDkwLDIzICsyNDI3LDI1IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNToKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUQyODE5OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfVlNUUkVBTV9YUEVSVDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1hQRVJUOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNToKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNToKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk06Ci0vLwljYXNlIFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNOiAgLyogbm90IGZpbmlzaGVkIHlldCAqLworLyogICAgICBjYXNlIFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNOiAgKi8gLyogbm90IGZpbmlzaGVkIHlldCAqLwogCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSOgotIAljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAxOgotIAljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAyOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTSUk6CisJY2FzZSBTQUE3MTM0X0JPQVJEX01BTkxJX01UVjAwMToKKwljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAyOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkFDU1NNQVJUVFY6CiAJCWRldi0+aGFzX3JlbW90ZSA9IDE7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRDUwNDQ6CiAJCXByaW50aygiJXM6IHNlZW1zIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBNRDUwNDRcbiIKLQkJICAgICAgICIlczogKHdpdGggdGhlIHNhbWUgSUQpIG91dCB0aGVyZS4gIElmIHNvdW5kIGRvZXNuJ3Qgd29yayBmb3JcbiIKLQkJICAgICAgICIlczogeW91IHRyeSB0aGUgYXVkaW9fY2xvY2tfb3ZlcnJpZGU9MHgyMDAwMDAgaW5zbW9kIG9wdGlvbi5cbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsZGV2LT5uYW1lLGRldi0+bmFtZSk7CisJCSIlczogKHdpdGggdGhlIHNhbWUgSUQpIG91dCB0aGVyZS4gIElmIHNvdW5kIGRvZXNuJ3Qgd29yayBmb3JcbiIKKwkJIiVzOiB5b3UgdHJ5IHRoZSBhdWRpb19jbG9ja19vdmVycmlkZT0weDIwMDAwMCBpbnNtb2Qgb3B0aW9uLlxuIiwKKwkJZGV2LT5uYW1lLGRldi0+bmFtZSxkZXYtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMF9DQVJEQlVTOgogCQkvKiBwb3dlci11cCB0dW5lciBjaGlwICovCkBAIC0yMTE0LDExICsyNDUzLDE5IEBACiAJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweDAwMDQwMDAwLCAweDAwMDAwMDAwKTsKIAkJbXNsZWVwKDEpOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfVEhZUEhPT05fRFZCVF9EVU9fQ0FSREJVUzoKKwkvKiB0dXJuIHRoZSBmYW4gb24gSGFjOiBzdGF0aWMgZm9yIHRoZSB0aW1lIGJlaW5nICovCisJCXNhYV93cml0ZWIoU0FBNzEzNF9HUElPX0dQTU9ERTMsIDB4MDgpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzMsIDB4MDYpOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0NBUkRCVVM6CisJCS8qIHBvd2VyLXVwIHR1bmVyIGNoaXAgKi8KKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAgIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJCW1zbGVlcCgxKTsKKwkJYnJlYWs7CiAJfQotCWlmIChkZXYtPmhhc19yZW1vdGUpCi0JCWRldi0+aXJxMl9tYXNrIHw9IChTQUE3MTM0X0lSUTJfSU5URV9HUElPMTggIHwKLQkJCQkgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMThBIHwKLQkJCQkgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTYgICk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMzksMTAgKzI0ODYsODUgQEAKIAkJCWJyZWFrOwogCQlkZXYtPmJvYXJkID0gYm9hcmQ7CiAJCXByaW50aygiJXM6IGJvYXJkIHR5cGUgZml4dXA6ICVzXG4iLCBkZXYtPm5hbWUsCi0JCSAgICAgICBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwkJc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7CiAJCWRldi0+dHVuZXJfdHlwZSA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnR1bmVyX3R5cGU7Ci0JCWlmIChUVU5FUl9BQlNFTlQgIT0gZGV2LT50dW5lcl90eXBlKQotCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixUVU5FUl9TRVRfVFlQRSwmZGV2LT50dW5lcl90eXBlKTsKKworCQlpZiAoVFVORVJfQUJTRU5UICE9IGRldi0+dHVuZXJfdHlwZSkgeworCQkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisKKwkJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQkJCXR1bl9zZXR1cC50eXBlID0gZGV2LT50dW5lcl90eXBlOworCQkJCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKworCQkJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyAoZGV2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwkJfQorCQlicmVhazsKK2Nhc2UgU0FBNzEzNF9CT0FSRF9NRDcxMzQ6CisJCXsKKwkJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKwkJdTggc3ViYWRkcjsKKwkJdTggZGF0YVszXTsKKwkJaW50IHJldCwgdHVuZXJfdDsKKworCQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHt7LmFkZHI9MHg1MCwgLmZsYWdzPTAsIC5idWY9JnN1YmFkZHIsIC5sZW4gPSAxfSwKKwkJCQkJey5hZGRyPTB4NTAsIC5mbGFncz1JMkNfTV9SRCwgLmJ1Zj1kYXRhLCAubGVuID0gM319OworCQlzdWJhZGRyPSAweDE0OworCQl0dW5lcl90ID0gMDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCBtc2csIDIpOworCQlpZiAocmV0ICE9IDIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRUVQUk9NIHJlYWQgZmFpbHVyZVxuIik7CisJCX0gZWxzZSBpZiAoKGRhdGFbMF0gIT0gMCkgJiYgKGRhdGFbMF0gIT0gMHhmZikpIHsKKwkJCS8qIG9sZCBjb25maWcgc3RydWN0dXJlICovCisJCQlzdWJhZGRyID0gZGF0YVswXSArIDI7CisJCQltc2dbMV0ubGVuID0gMjsKKwkJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgbXNnLCAyKTsKKwkJCXR1bmVyX3QgPSAoZGF0YVswXSA8PCA4KSArIGRhdGFbMV07CisJCQlzd2l0Y2ggKHR1bmVyX3QpeworCQkJY2FzZSAweDAxMDM6CisJCQkJZGV2LT50dW5lcl90eXBlID0gVFVORVJfUEhJTElQU19QQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDEwQzoKKwkJCQlkZXYtPnR1bmVyX3R5cGUgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBDYW50IGRldGVybWluZSB0dW5lciB0eXBlICV4IGZyb20gRUVQUk9NXG4iLCBkZXYtPm5hbWUsIHR1bmVyX3QpOworCQkJfQorCQl9IGVsc2UgaWYgKChkYXRhWzFdICE9IDApICYmIChkYXRhWzFdICE9IDB4ZmYpKSB7CisJCQkvKiBuZXcgY29uZmlnIHN0cnVjdHVyZSAqLworCQkJc3ViYWRkciA9IGRhdGFbMV0gKyAxOworCQkJbXNnWzFdLmxlbiA9IDE7CisJCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsIG1zZywgMik7CisJCQlzdWJhZGRyID0gZGF0YVswXSArIDE7CisJCQltc2dbMV0ubGVuID0gMjsKKwkJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgbXNnLCAyKTsKKwkJCXR1bmVyX3QgPSAoZGF0YVsxXSA8PCA4KSArIGRhdGFbMF07CisJCQlzd2l0Y2ggKHR1bmVyX3QpIHsKKwkJCWNhc2UgMHgwMDA1OgorCQkJCWRldi0+dHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAwMWQ6CisJCQkJZGV2LT50dW5lcl90eXBlID0gVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszOworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlcyBCb2FyZCBoYXMgRFZCLVRcbiIsIGRldi0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgQ2FudCBkZXRlcm1pbmUgdHVuZXIgdHlwZSAleCBmcm9tIEVFUFJPTVxuIiwgZGV2LT5uYW1lLCB0dW5lcl90KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgdW5leHBlY3RlZCBjb25maWcgc3RydWN0dXJlXG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgVHVuZXIgdHlwZSBpcyAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPnR1bmVyX3R5cGUpOworCQlpZiAoZGV2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMykgeworCQkJZGV2LT50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQxX0FDVElWRSB8IFREQTk4ODdfUE9SVDJfQUNUSVZFOworCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixUREE5ODg3X1NFVF9DT05GSUcsICZkZXYtPnRkYTk4ODdfY29uZik7CisJCX0KKworCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQl0dW5fc2V0dXAudHlwZSA9IGRldi0+dHVuZXJfdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyAoZGV2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCZ0dW5fc2V0dXApOworCQl9CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwppbmRleCBmNjFlZDE4Li4xZGJlNjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1jb3JlLmMsdiAxLjMwIDIwMDUvMDUvMjIgMTk6MjM6MzkgbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtY29yZS5jLHYgMS4zOSAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogZHJpdmVyIGNvcmUKQEAgLTE4Myw0NiArMTgzLDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAwCi1zdGF0aWMgY2hhciAqZGVjMV9iaXRzWzhdID0gewotCSJEQ1NURDAiLCAiRENTQ1QxIiwgIldJUEEiLCAiR0xJTUIiLAotCSJHTElNVCIsICJTTFRDQSIsICJITENLIgotfTsKLXN0YXRpYyBjaGFyICpkZWMyX2JpdHNbOF0gPSB7Ci0JIlJEQ0FQIiwgIkNPUFJPIiwgIkNPTFNUUiIsICJUWVBFMyIsCi0JTlVMTCwgIkZJRFQiLCAiSExWTE4iLCAiSU5UTCIKLX07Ci1zdGF0aWMgY2hhciAqc2NhbGUxX2JpdHNbOF0gPSB7Ci0JIlZJRF9BIiwgIlZCSV9BIiwgTlVMTCwgTlVMTCwgIlZJRF9CIiwgIlZCSV9CIgotfTsKLXN0YXRpYyBjaGFyICpzY2FsZTJfYml0c1s4XSA9IHsKLQkiVFJFUlIiLCAiQ0ZFUlIiLCAiTERFUlIiLCAiV0FTUlNUIiwKLQkiRklEU0NJIiwgIkZJRFNDTyIsICJENl5ENSIsICJUQVNLIgotfTsKLQotc3RhdGljIHZvaWQgZHVtcF9zdGF0dXNyZWcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCByZWcsCi0JCQkgICBjaGFyICpyZWduYW1lLCBjaGFyICoqYml0cykKLXsKLQlpbnQgdmFsdWUsaTsKLQotCXZhbHVlID0gc2FhX3JlYWRiKHJlZyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczoiLCBkZXYtPm5hbWUsIHJlZ25hbWUpOwotCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChOVUxMID09IGJpdHNbaV0pCi0JCQljb250aW51ZTsKLQkJcHJpbnRrKCIgJXM9JWQiLCBiaXRzW2ldLCAodmFsdWUgJiAoMSA8PCBpKSkgPyAxIDogMCk7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9zdGF0dXNyZWdzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQotewotCWR1bXBfc3RhdHVzcmVnKGRldixTQUE3MTM0X1NUQVRVU19WSURFTzEsImRlYzEiLGRlYzFfYml0cyk7Ci0JZHVtcF9zdGF0dXNyZWcoZGV2LFNBQTcxMzRfU1RBVFVTX1ZJREVPMiwiZGVjMiIsZGVjMl9iaXRzKTsKLQlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TQ0FMRVJfU1RBVFVTMCwic2NhbGUwIixzY2FsZTFfYml0cyk7Ci0JZHVtcF9zdGF0dXNyZWcoZGV2LFNBQTcxMzRfU0NBTEVSX1NUQVRVUzEsInNjYWxlMSIsc2NhbGUyX2JpdHMpOwotfQotI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBkZWxheWVkIHJlcXVlc3RfbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjE2LDEwICs1NzYsNiBAQAogCQlpZiAoaXJxX2RlYnVnKQogCQkJcHJpbnRfaXJxc3RhdHVzKGRldixsb29wLHJlcG9ydCxzdGF0dXMpOwogCi0jaWYgMAotCQlpZiAocmVwb3J0ICYgU0FBNzEzNF9JUlFfUkVQT1JUX0NPTkZfRVJSKQotCQkJZHVtcF9zdGF0dXNyZWdzKGRldik7Ci0jZW5kaWYKIAogCQlpZiAocmVwb3J0ICYgU0FBNzEzNF9JUlFfUkVQT1JUX1JEQ0FQIC8qIF9JTlRMICovKQogCQkJc2FhNzEzNF9pcnFfdmlkZW9faW50bChkZXYpOwpAQCAtNzExLDcgKzY2Nyw2IEBACiAJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VWRkUxIHwKIAkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRVZGRTIgfAogCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FU0ZFICB8Ci0JCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VCQURDIHwKIAkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRUJEQUMpOwogCiAJLyogZW5hYmxlIHBlcmlwaGVyYWwgZGV2aWNlcyAqLwpAQCAtNzI2LDE0ICs2ODEsMjggQEAKIC8qIGxhdGUgaW5pdCAod2l0aCBpMmMgKyBpcnEpICovCiBzdGF0aWMgaW50IHNhYTcxMzRfaHdpbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKKwl1bnNpZ25lZCBpbnQgaXJxMl9tYXNrOwogCWRwcmludGsoImh3aW5pdDJcbiIpOwogCiAJc2FhNzEzNF92aWRlb19pbml0MihkZXYpOwogCXNhYTcxMzRfdHZhdWRpb19pbml0MihkZXYpOwogCiAJLyogZW5hYmxlIElSUSdzICovCisgICAJaXJxMl9tYXNrID0KKwkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMyAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzIgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMxICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMCAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX1BFICAgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9BUjsKKworCWlmIChkZXYtPmhhc19yZW1vdGUpCisJCWlycTJfbWFzayB8PSAoU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4ICB8CisJCQkgICAgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMThBIHwKKwkJCSAgICAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xNiAgKTsKKwogCXNhYV93cml0ZWwoU0FBNzEzNF9JUlExLCAwKTsKLQlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMiwgZGV2LT5pcnEyX21hc2spOworCXNhYV93cml0ZWwoU0FBNzEzNF9JUlEyLCBpcnEyX21hc2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NTQsMTMgKzkyMyw2IEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSAjMSAqLwotICAgCWRldi0+aXJxMl9tYXNrID0KLQkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMyAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzIgICAgfAotCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMxICAgIHwKLQkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMCAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX1BFICAgICAgfAotCQlTQUE3MTM0X0lSUTJfSU5URV9BUjsKIAlzYWE3MTM0X2JvYXJkX2luaXQxKGRldik7CiAJc2FhNzEzNF9od2luaXQxKGRldik7CiAKQEAgLTk5MCw2ICs5NTIsNyBAQAogCQlyZXF1ZXN0X21vZHVsZSgic2FhNjc1MmhzIik7CiAJCXJlcXVlc3RfbW9kdWxlX2RlcGVuZCgic2FhNzEzNC1lbXByZXNzIiwmbmVlZF9lbXByZXNzKTsKIAl9CisKICAgCWlmIChjYXJkX2lzX2R2YihkZXYpKQogCQlyZXF1ZXN0X21vZHVsZV9kZXBlbmQoInNhYTcxMzQtZHZiIiwmbmVlZF9kdmIpOwogCkBAIC0xMTQ0LDkgKzExMDcsNiBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSwKIAkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwwKSk7CiAKLSNpZiAwICAvKiBjYXVzZXMgc29tZSB0cm91YmxlIHdoZW4gcmVpbnNlcnRpbmcgdGhlIGRyaXZlciAuLi4gKi8KLQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7Ci0jZW5kaWYKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CiAKIAkvKiBmcmVlIG1lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCBhYThlMmNmLi4zMzRiYzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtMSw4ICsxLDExIEBACiAvKgotICogJElkOiBzYWE3MTM0LWR2Yi5jLHYgMS4xMyAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKKyAqICRJZDogc2FhNzEzNC1kdmIuYyx2IDEuMTggMjAwNS8wNy8wNCAxNjowNTo1MCBta3J1Zmt5IEV4cCAkCiAgKgogICogKGMpIDIwMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQogICoKKyAqICBFeHRlbmRlZCAzIC8gMjAwNSBieSBIYXJ0bXV0IEhhY2ttYW5uIHRvIHN1cHBvcnQgdmFyaW91cworICogIGNhcmRzIHdpdGggdGhlIHRkYTEwMDQ2IERWQi1UIGNoYW5uZWwgZGVjb2RlcgorICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKQEAgLTI3LDIzICszMCwzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKKyNkZWZpbmUgQ09ORklHX0RWQl9NVDM1MiAxCisjZGVmaW5lIENPTkZJR19EVkJfVERBMTAwNFggMQorCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCiAKLSNpbmNsdWRlICJkdmItcGxsLmgiCi0jaW5jbHVkZSAibXQzNTIuaCIKLSNpbmNsdWRlICJtdDM1Ml9wcml2LmgiIC8qIEZJWE1FICovCi0jaW5jbHVkZSAidGRhMTAwNHguaCIKKyNpZiBDT05GSUdfRFZCX01UMzUyCisjIGluY2x1ZGUgIm10MzUyLmgiCisjIGluY2x1ZGUgIm10MzUyX3ByaXYuaCIgLyogRklYTUUgKi8KKyNlbmRpZgorI2lmIENPTkZJR19EVkJfVERBMTAwNFgKKyMgaW5jbHVkZSAidGRhMTAwNHguaCIKKyNlbmRpZgogCiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYW50ZW5uYV9wd3IgPSAwOworCiBtb2R1bGVfcGFyYW0oYW50ZW5uYV9wd3IsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFudGVubmFfcHdyLCJlbmFibGUgYW50ZW5uYSBwb3dlciAoUGlubmFjbGUgMzAwaSkiKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNpZiBDT05GSUdfRFZCX01UMzUyCiBzdGF0aWMgaW50IHBpbm5hY2xlX2FudGVubmFfcHdyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgb24pCiB7CiAJdTMyIG9rOwpAQCAtMTM4LDUxICsxNDksMzkwIEBACiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9waW5uYWNsZV9pbml0LAogCS5wbGxfc2V0ICAgICAgID0gbXQzNTJfcGlubmFjbGVfcGxsX3NldCwKIH07CisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgbWVkaW9uX2NhcmRidXNfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKLXsKLQkvKiBhbnl0aGluZyB0byBkbyBoZXJlID8/PyAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1lZGlvbl9jYXJkYnVzX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKKyNpZiBDT05GSUdfRFZCX1REQTEwMDRYCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZjsKKwlzdGF0aWMgdTggdHUxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhmNSwgMHg4NSwgMHhhYiB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gdHUxMjE2X2luaXQsLmxlbiA9IHNpemVvZih0dTEyMTZfaW5pdCkgfTsKIAotCS8qCi0JICogdGhpcyBpbnN0cnVjdHMgdHVuZXIubyB0byBzZXQgdGhlIGZyZXF1ZW5jeSwgdGhlIGNhbGwgd2lsbAotCSAqIGVuZCB1cCBpbiB0dW5lcl9jb21tYW5kKCksIFZJRElPQ19TX0ZSRVFVRU5DWSBzd2l0Y2guCi0JICogdGRhOTg4Ny5vIHdpbGwgc2VlIHRoYXQgYXMgd2VsbC4KLQkgKi8KLQlmLnR1bmVyICAgICA9IDA7Ci0JZi50eXBlICAgICAgPSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY7Ci0JZi5mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeSAvIDEwMDAgKiAxNiAvIDEwMDA7Ci0Jc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfU19GUkVRVUVOQ1ksJmYpOworCS8qIHNldHVwIFBMTCBjb25maWd1cmF0aW9uICovCisJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJbXNsZWVwKDEpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmVfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1Zls0XTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHR1bmVyX2J1ZiwubGVuID0KKwkJCXNpemVvZih0dW5lcl9idWYpIH07CisJaW50IHR1bmVyX2ZyZXF1ZW5jeSA9IDA7CisJdTggYmFuZCwgY3AsIGZpbHRlcjsKKworCS8qIGRldGVybWluZSBjaGFyZ2UgcHVtcCAqLworCXR1bmVyX2ZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzYxNjYwMDA7CisJaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg3MDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxMzAwMDAwMDApCisJCWNwID0gMzsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxNjAwMDAwMDApCisJCWNwID0gNTsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAyMDAwMDAwMDApCisJCWNwID0gNjsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAyOTAwMDAwMDApCisJCWNwID0gMzsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0MjAwMDAwMDApCisJCWNwID0gNTsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0ODAwMDAwMDApCisJCWNwID0gNjsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA2MjAwMDAwMDApCisJCWNwID0gMzsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4MzAwMDAwMDApCisJCWNwID0gNTsKKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4OTUwMDAwMDApCisJCWNwID0gNzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZGV0ZXJtaW5lIGJhbmQgKi8KKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0OTAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNjEwMDAwMDApCisJCWJhbmQgPSAxOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQ0MDAwMDAwKQorCQliYW5kID0gMjsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDg2MTAwMDAwMCkKKwkJYmFuZCA9IDQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNldHVwIFBMTCBmaWx0ZXIgKi8KKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQlmaWx0ZXIgPSAwOworCQlicmVhazsKKworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQlmaWx0ZXIgPSAwOworCQlicmVhazsKKworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQlmaWx0ZXIgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNhbGN1bGF0ZSBkaXZpc29yCisJICogKCgzNjE2NjAwMCsoKDEwMDAwMDAvNikvMikpICsgRmlucHV0KS8oMTAwMDAwMC82KQorCSAqLworCXR1bmVyX2ZyZXF1ZW5jeSA9ICgoKHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMCkgKiA2KSArIDIxNzQ5NikgLyAxMDAwOworCisJLyogc2V0dXAgdHVuZXIgYnVmZmVyICovCisJdHVuZXJfYnVmWzBdID0gKHR1bmVyX2ZyZXF1ZW5jeSA+PiA4KSAmIDB4N2Y7CisJdHVuZXJfYnVmWzFdID0gdHVuZXJfZnJlcXVlbmN5ICYgMHhmZjsKKwl0dW5lcl9idWZbMl0gPSAweGNhOworCXR1bmVyX2J1ZlszXSA9IChjcCA8PCA1KSB8IChmaWx0ZXIgPDwgMykgfCBiYW5kOworCisJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwltc2xlZXAoMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCAmZGV2LT5wY2ktPmRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIG1lZGlvbl9jYXJkYnVzID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwgIC8qIG5vdCBzdXJlIHRoaXMgaXMgY29ycmVjdCAqLwotCS5pbnZlcnQgICAgICAgID0gMCwKLSAgICAgICAgLmludmVydF9vY2xrICAgPSAwLAotICAgICAgICAucGxsX2luaXQgICAgICA9IG1lZGlvbl9jYXJkYnVzX2luaXQsCi0gICAgICAgIC5wbGxfc2V0ICAgICAgID0gbWVkaW9uX2NhcmRidXNfcGxsX3NldCwKLSAgICAgICAgLnJlcXVlc3RfZmlybXdhcmUgPSBmZV9yZXF1ZXN0X2Zpcm13YXJlLAorc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGhpbGlwc190dTEyMTZfY29uZmlnID0geworCisJLmRlbW9kX2FkZHJlc3MgPSAweDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMSwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKKwkucGxsX2luaXQgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190dTEyMTZfcGxsX3NldCwKKwkucGxsX3NsZWVwICAgICA9IE5VTEwsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3R1MTIxNl9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKworc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCS8qIHRoaXMgbWVzc2FnZSBpcyB0byBzZXQgdXAgQVRDIGFuZCBBTEMgKi8KKwlzdGF0aWMgdTggZm1kMTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZGMsIDB4OWMsIDB4YTAgfTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGZtZDEyMTZfaW5pdCwubGVuID0gc2l6ZW9mKGZtZDEyMTZfaW5pdCkgfTsKKworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCW1zbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaGlsaXBzX2ZtZDEyMTZfYW5hbG9nKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwkvKiB0aGlzIG1lc3NhZ2UgYWN0dWFsbHkgdHVybnMgdGhlIHR1bmVyIGJhY2sgdG8gYW5hbG9nIG1vZGUgKi8KKwlzdGF0aWMgdTggZm1kMTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZGMsIDB4OWMsIDB4NjAgfTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGZtZDEyMTZfaW5pdCwubGVuID0gc2l6ZW9mKGZtZDEyMTZfaW5pdCkgfTsKKworCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSk7CisJbXNsZWVwKDEpOworCWZtZDEyMTZfaW5pdFsyXSA9IDB4ODY7CisJZm1kMTIxNl9pbml0WzNdID0gMHg1NDsKKwlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworCW1zbGVlcCgxKTsKK30KKworc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1Zls0XTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IHR1bmVyX2J1ZiwubGVuID0KKwkJCXNpemVvZih0dW5lcl9idWYpIH07CisJaW50IHR1bmVyX2ZyZXF1ZW5jeSA9IDA7CisJaW50IGRpdmlkZXIgPSAwOworCXU4IGJhbmQsIG1vZGUsIGNwOworCisJLyogZGV0ZXJtaW5lIGNoYXJnZSBwdW1wICovCisJdHVuZXJfZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3kgKyAzNjEzMDAwMDsKKwlpZiAodHVuZXJfZnJlcXVlbmN5IDwgODcwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCS8qIGxvdyBiYW5kICovCisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTgwMDAwMDAwKSB7CisJCWJhbmQgPSAxOworCQltb2RlID0gNzsKKwkJY3AgICA9IDA7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxOTUwMDAwMDApIHsKKwkJYmFuZCA9IDE7CisJCW1vZGUgPSA2OworCQljcCAgID0gMTsKKwkvKiBtaWQgYmFuZAkqLworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMzY2MDAwMDAwKSB7CisJCWlmIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKSB7CisJCQliYW5kID0gMTA7CisJCX0gZWxzZSB7CisJCQliYW5kID0gMjsKKwkJfQorCQltb2RlID0gNzsKKwkJY3AgICA9IDA7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0NzgwMDAwMDApIHsKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopIHsKKwkJCWJhbmQgPSAxMDsKKwkJfSBlbHNlIHsKKwkJCWJhbmQgPSAyOworCQl9CisJCW1vZGUgPSA2OworCQljcCAgID0gMTsKKwkvKiBoaWdoIGJhbmQgKi8KKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDY2MjAwMDAwMCkgeworCQlpZiAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikgeworCQkJYmFuZCA9IDEyOworCQl9IGVsc2UgeworCQkJYmFuZCA9IDQ7CisJCX0KKwkJbW9kZSA9IDc7CisJCWNwICAgPSAwOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgODQwMDAwMDAwKSB7CisJCWlmIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKSB7CisJCQliYW5kID0gMTI7CisJCX0gZWxzZSB7CisJCQliYW5kID0gNDsKKwkJfQorCQltb2RlID0gNjsKKwkJY3AgICA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopIHsKKwkJCWJhbmQgPSAxMjsKKwkJfSBlbHNlIHsKKwkJCWJhbmQgPSA0OworCQl9CisJCW1vZGUgPSA3OworCQljcCAgID0gMTsKKworCX0KKwkvKiBjYWxjdWxhdGUgZGl2aXNvciAqLworCS8qICgoMzYxNjYwMDAgKyBGaW5wdXQpIC8gMTY2NjY2KSByb3VuZGVkISAqLworCWRpdmlkZXIgPSAodHVuZXJfZnJlcXVlbmN5ICsgODMzMzMpIC8gMTY2NjY3OworCisJLyogc2V0dXAgdHVuZXIgYnVmZmVyICovCisJdHVuZXJfYnVmWzBdID0gKGRpdmlkZXIgPj4gOCkgJiAweDdmOworCXR1bmVyX2J1ZlsxXSA9IGRpdmlkZXIgJiAweGZmOworCXR1bmVyX2J1ZlsyXSA9IDB4ODAgfCAoY3AgPDwgNikgfCAobW9kZSAgPDwgMykgfCA0OworCXR1bmVyX2J1ZlszXSA9IDB4NDAgfCBiYW5kOworCisJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgbWVkaW9uX2NhcmRidXMgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19JRk9fQVVUT19ORUcsCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTMsCisJLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldCwKKwkucGxsX3NsZWVwCSAgID0gcGhpbGlwc19mbWQxMjE2X2FuYWxvZywKKwkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHRkYTgyN3hfZGF0YSB7CisJdTMyIGxvbWF4OworCXU4ICBzcGQ7CisJdTggIGJzOworCXU4ICBicDsKKwl1OCAgY3A7CisJdTggIGdjMzsKKwl1OCBkaXYxcDU7Cit9OworCitzdGF0aWMgc3RydWN0IHRkYTgyN3hfZGF0YSB0ZGE4Mjd4X2R2YnRbXSA9IHsKKwl7IC5sb21heCA9ICA2MjAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDIsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAgNjYwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAzLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gIDc2MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMSwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9ICA4NDAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDIsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAgOTMwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAyLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gIDk4MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMywgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDEwOTAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDMsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxMjMwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gMTMzMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMywgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDE1MTAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDEsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxNTQwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTgxMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDE4NTAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAyMTcwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAzLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMjQ0MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMiwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDI2NTAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDMsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAzMDIwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAxLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMzI0MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMiwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDM3MDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDIsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA0NTQwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAzLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNDkzMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMiwgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDUzMDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDMsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSA1NTQwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAxLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNjA0MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMSwgLmJwID0gNCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDY5NjAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDIsIC5icCA9IDQsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA3NDAwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAyLCAuYnAgPSA0LCAuY3AgPSAxLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gODIwMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMywgLmJwID0gNCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDg2NTAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDMsIC5icCA9IDQsIC5jcCA9IDEsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAgICAgICAgIDAsIC5zcGQgPSAwLCAuYnMgPSAwLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9Cit9OworCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1ZlsxNF07CisKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHR1bmVyX2J1ZiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgLmxlbiA9IHNpemVvZih0dW5lcl9idWYpIH07CisJaW50IGksIHR1bmVyX2ZyZXEsIGlmX2ZyZXE7CisJdTMyIE47CisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpIHsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJaWZfZnJlcSA9IDQwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQlpZl9mcmVxID0gNDUwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCSAgIC8qIDggTUh6IG9yIEF1dG8gKi8KKwkJaWZfZnJlcSA9IDUwMDAwMDA7CisJCWJyZWFrOworCX0KKwl0dW5lcl9mcmVxID0gcGFyYW1zLT5mcmVxdWVuY3kgKyBpZl9mcmVxOworCisJaSA9IDA7CisJd2hpbGUgKHRkYTgyN3hfZHZidFtpXS5sb21heCA8IHR1bmVyX2ZyZXEpIHsKKwkJaWYodGRhODI3eF9kdmJ0W2kgKyAxXS5sb21heCA9PSAwKQorCQkJYnJlYWs7CisJCWkrKzsKKwl9CisKKwlOID0gKCh0dW5lcl9mcmVxICsgMTI1MDAwKSAvIDI1MDAwMCkgPDwgKHRkYTgyN3hfZHZidFtpXS5zcGQgKyAyKTsKKwl0dW5lcl9idWZbMF0gPSAwOworCXR1bmVyX2J1ZlsxXSA9IChOPj44KSB8IDB4NDA7CisJdHVuZXJfYnVmWzJdID0gTiAmIDB4ZmY7CisJdHVuZXJfYnVmWzNdID0gMDsKKwl0dW5lcl9idWZbNF0gPSAweDUyOworCXR1bmVyX2J1Zls1XSA9ICh0ZGE4Mjd4X2R2YnRbaV0uc3BkIDw8IDYpICsgKHRkYTgyN3hfZHZidFtpXS5kaXYxcDUgPDwgNSkgKworCQkJCSAgICh0ZGE4Mjd4X2R2YnRbaV0uYnMgPDwgMykgKyB0ZGE4Mjd4X2R2YnRbaV0uYnA7CisJdHVuZXJfYnVmWzZdID0gKHRkYTgyN3hfZHZidFtpXS5nYzMgPDwgNCkgKyAweDhmOworCXR1bmVyX2J1Zls3XSA9IDB4YmY7CisJdHVuZXJfYnVmWzhdID0gMHgyYTsKKwl0dW5lcl9idWZbOV0gPSAweDA1OworCXR1bmVyX2J1ZlsxMF0gPSAweGZmOworCXR1bmVyX2J1ZlsxMV0gPSAweDAwOworCXR1bmVyX2J1ZlsxMl0gPSAweDAwOworCXR1bmVyX2J1ZlsxM10gPSAweDQwOworCisJdHVuZXJfbXNnLmxlbiA9IDE0OworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJbXNsZWVwKDUwMCk7CisJLyogY29ycmVjdCBDUCB2YWx1ZSAqLworCXR1bmVyX2J1ZlswXSA9IDB4MzA7CisJdHVuZXJfYnVmWzFdID0gMHg1MCArIHRkYTgyN3hfZHZidFtpXS5jcDsKKwl0dW5lcl9tc2cubGVuID0gMjsKKwlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXN0YXRpYyB1OCB0ZGE4Mjd4X3NsZWVwW10gPSB7IDB4MzAsIDB4ZDB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gdGRhODI3eF9zbGVlcCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbiA9IHNpemVvZih0ZGE4Mjd4X3NsZWVwKSB9OworCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIHRkYTgyN3hfbGlmZXZpZXdfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9zZXQsCisJLnBsbF9zbGVlcAkgICA9IHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogc3RhdGljIGludCBkdmJfaW5pdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKIAkvKiBpbml0IHN0cnVjdCB2aWRlb2J1Zl9kdmIgKi8KQEAgLTE5NywxOCArNTQ3LDMxIEBACiAJCQkgICAgZGV2KTsKIAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworI2lmIENPTkZJR19EVkJfTVQzNTIKIAljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTDoKIAkJcHJpbnRrKCIlczogcGlubmFjbGUgMzAwaSBkdmIgc2V0dXBcbiIsZGV2LT5uYW1lKTsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBtdDM1Ml9hdHRhY2goJnBpbm5hY2xlXzMwMGksCiAJCQkJCQkgJmRldi0+aTJjX2FkYXApOwogCQlicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19EVkJfVERBMTAwNFgKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUQ3MTM0OgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmbWVkaW9uX2NhcmRidXMsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoTlVMTCA9PSBkZXYtPmR2Yi5mcm9udGVuZCkKLQkJCXByaW50aygiJXM6IEhtbSwgbG9va3MgbGlrZSB0aGlzIGlzIHRoZSBvbGQgTUQ3MTM0ICIKLQkJCSAgICAgICAidmVyc2lvbiB3aXRob3V0IERWQi1UIHN1cHBvcnRcbiIsZGV2LT5uYW1lKTsKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVE9VR0g6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3R1MTIxNl9jb25maWcsCisJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTzoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAorCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1RIWVBIT09OX0RWQlRfRFVPX0NBUkRCVVM6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZ0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZywKKwkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlczogSHVoPyB1bmtub3duIERWQiBjYXJkP1xuIixkZXYtPm5hbWUpOwogCQlicmVhazsKQEAgLTIyNyw4ICs1OTAsNiBAQAogewogCXN0YXRpYyBpbnQgb24gID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMl9JTkFDVElWRTsKIAotCXByaW50aygiJXM6ICVzXG4iLGRldi0+bmFtZSxfX0ZVTkNUSU9OX18pOwotCiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUw6CiAJCS8qIG90aGVyd2lzZSB3ZSBkb24ndCBkZXRlY3QgdGhlIHR1bmVyIG9uIG5leHQgaW5zbW9kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCmluZGV4IGI2ZjAwMmUuLjkzZGQ2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1pMmMuYyx2IDEuMTEgMjAwNS8wNi8xMiAwMTozNjoxNCBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtaTJjLmMsdiAxLjE5IDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogaTJjIGludGVyZmFjZSBzdXBwb3J0CkBAIC0xOTcsMTAgKzE5Nyw2IEBACiAJZW51bSBpMmNfc3RhdHVzIHN0YXR1czsKIAlfX3UzMiBkd29yZDsKIAotI2lmIDAKLQlpMmNfc2V0X2F0dHIoZGV2LGF0dHIpOwotCXNhYV93cml0ZWIoU0FBNzEzNF9JMkNfREFUQSwgZGF0YSk7Ci0jZWxzZQogCS8qIGhhdmUgdG8gd3JpdGUgYm90aCBhdHRyICsgZGF0YSBpbiBvbmUgMzJiaXQgd29yZCAqLwogCWR3b3JkICA9IHNhYV9yZWFkbChTQUE3MTM0X0kyQ19BVFRSX1NUQVRVUyA+PiAyKTsKIAlkd29yZCAmPSAweDBmOwpAQCAtMjEwLDcgKzIwNiw2IEBACiAvLwlkd29yZCB8PSAweDQwIDw8IDE2OyAgLyogNDAwIGtIeiAqLwogCWR3b3JkIHw9IDB4ZjAgPDwgMjQ7CiAJc2FhX3dyaXRlbChTQUE3MTM0X0kyQ19BVFRSX1NUQVRVUyA+PiAyLCBkd29yZCk7Ci0jZW5kaWYKIAlkMnByaW50ayhLRVJOX0RFQlVHICIlczogaTJjIGRhdGEgPT4gMHgleFxuIixkZXYtPm5hbWUsZGF0YSk7CiAKIAlpZiAoIWkyY19pc19idXN5X3dhaXQoZGV2KSkKQEAgLTMzMSwxMiArMzI2LDQ0IEBACiAKIHN0YXRpYyBpbnQgYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotICAgICAgICBzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGNsaWVudC0+YWRhcHRlci0+YWxnb19kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gY2xpZW50LT5hZGFwdGVyLT5hbGdvX2RhdGE7CiAJaW50IHR1bmVyID0gZGV2LT50dW5lcl90eXBlOwogCWludCBjb25mICA9IGRldi0+dGRhOTg4N19jb25mOworCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAKLQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFRVTkVSX1NFVF9UWVBFLCZ0dW5lcik7Ci0Jc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixUREE5ODg3X1NFVF9DT05GSUcsJmNvbmYpOworCWQxcHJpbnRrKCAiJXMgaTJjIGF0dGFjaCBbYWRkcj0weCV4LGNsaWVudD0lc11cbiIsCisJCWNsaWVudC0+ZHJpdmVyLT5uYW1lLGNsaWVudC0+YWRkcixpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKKworCWlmICghY2xpZW50LT5kcml2ZXItPmNvbW1hbmQpCisJCXJldHVybiAwOworCisJaWYgKHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnJhZGlvX3R5cGUgIT0gVU5TRVQpIHsKKworCQl0dW5fc2V0dXAudHlwZSA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnJhZGlvX3R5cGU7CisJCXR1bl9zZXR1cC5hZGRyID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW9fYWRkcjsKKworCQlpZiAoKHR1bl9zZXR1cC5hZGRyID09IEFERFJfVU5TRVQpIHx8ICh0dW5fc2V0dXAuYWRkciA9PSBjbGllbnQtPmFkZHIpKSB7CisJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTzsKKworCQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwkJfQorICAgICAgICB9CisKKwlpZiAodHVuZXIgIT0gVU5TRVQpIHsKKworCSAgICAgICAgdHVuX3NldHVwLnR5cGUgPSB0dW5lcjsKKwkgICAgICAgIHR1bl9zZXR1cC5hZGRyID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0udHVuZXJfYWRkcjsKKworCQlpZiAoKHR1bl9zZXR1cC5hZGRyID09IEFERFJfVU5TRVQpfHwodHVuX3NldHVwLmFkZHIgPT0gY2xpZW50LT5hZGRyKSkgeworCisJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFY7CisKKwkJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwkJfQorICAgICAgICB9CisKKwljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsIFREQTk4ODdfU0VUX0NPTkZJRywgJmNvbmYpOworCiAgICAgICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCBhYmEyYjlkLi4yMTM3NDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LWlucHV0LmMsdiAxLjE5IDIwMDUvMDYvMDcgMTg6MDI6MjYgbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtaW5wdXQuYyx2IDEuMjEgMjAwNS8wNi8yMiAyMzozNzozNCBuc2ggRXhwICQKICAqCiAgKiBoYW5kbGUgc2FhNzEzNCBJUiByZW1vdGVzIHZpYSBsaW51eCBrZXJuZWwgaW5wdXQgbGF5ZXIuCiAgKgpAQCAtNjgsMTAgKzY4LDggQEAKIAlbICAgIDYgXSA9IEtFWV9BR0FJTiwgICAgICAgIC8vIFJlY2FsCiAJWyAgIDE2IF0gPSBLRVlfS1BFTlRFUiwgICAgICAvLyBFbnRlcgogCi0jaWYgMSAvKiBGSVhNRSAqLwogCVsgICAyNiBdID0gS0VZX0YyMiwgICAgICAgICAgLy8gU3RlcmVvCiAJWyAgIDI0IF0gPSBLRVlfRURJVCwgICAgICAgICAvLyBBViBTb3VyY2UKLSNlbmRpZgogfTsKIAogc3RhdGljIElSX0tFWVRBQl9UWVBFIGNpbmVyZ3lfY29kZXNbSVJfS0VZVEFCX1NJWkVdID0gewpAQCAtMTcyLDQ1ICsxNzAsNDUgQEAKIH07CiAKIHN0YXRpYyBJUl9LRVlUQUJfVFlQRSBhdmFjc3NtYXJ0X2NvZGVzW0lSX0tFWVRBQl9TSVpFXSA9IHsKLSAgICAgICAgWyAzMCBdID0gS0VZX1BPV0VSLAkJLy8gcG93ZXIKKwlbIDMwIF0gPSBLRVlfUE9XRVIsCQkvLyBwb3dlcgogCVsgMjggXSA9IEtFWV9TRUFSQ0gsCQkvLyBzY2FuCi0gICAgICAgIFsgIDcgXSA9IEtFWV9TRUxFQ1QsCQkvLyBzb3VyY2UKKwlbICA3IF0gPSBLRVlfU0VMRUNULAkJLy8gc291cmNlCiAKIAlbIDIyIF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAyMCBdID0gS0VZX1ZPTFVNRURPV04sCi0gICAgICAgIFsgMzEgXSA9IEtFWV9DSEFOTkVMVVAsCisJWyAzMSBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDIzIF0gPSBLRVlfQ0hBTk5FTERPV04sCiAJWyAyNCBdID0gS0VZX01VVEUsCiAKIAlbICAyIF0gPSBLRVlfS1AwLAotICAgICAgICBbICAxIF0gPSBLRVlfS1AxLAotICAgICAgICBbIDExIF0gPSBLRVlfS1AyLAotICAgICAgICBbIDI3IF0gPSBLRVlfS1AzLAotICAgICAgICBbICA1IF0gPSBLRVlfS1A0LAotICAgICAgICBbICA5IF0gPSBLRVlfS1A1LAotICAgICAgICBbIDIxIF0gPSBLRVlfS1A2LAorCVsgIDEgXSA9IEtFWV9LUDEsCisJWyAxMSBdID0gS0VZX0tQMiwKKwlbIDI3IF0gPSBLRVlfS1AzLAorCVsgIDUgXSA9IEtFWV9LUDQsCisJWyAgOSBdID0gS0VZX0tQNSwKKwlbIDIxIF0gPSBLRVlfS1A2LAogCVsgIDYgXSA9IEtFWV9LUDcsCi0gICAgICAgIFsgMTAgXSA9IEtFWV9LUDgsCisJWyAxMCBdID0gS0VZX0tQOCwKIAlbIDE4IF0gPSBLRVlfS1A5LAogCVsgMTYgXSA9IEtFWV9LUERPVCwKIAogCVsgIDMgXSA9IEtFWV9UVU5FUiwJCS8vIHR2L2ZtCi0gICAgICAgIFsgIDQgXSA9IEtFWV9SRVdJTkQsCQkvLyBmbSB0dW5pbmcgbGVmdCBvciBmdW5jdGlvbiBsZWZ0Ci0gICAgICAgIFsgMTIgXSA9IEtFWV9GT1JXQVJELAkJLy8gZm0gdHVuaW5nIHJpZ2h0IG9yIGZ1bmN0aW9uIHJpZ2h0CisJWyAgNCBdID0gS0VZX1JFV0lORCwJCS8vIGZtIHR1bmluZyBsZWZ0IG9yIGZ1bmN0aW9uIGxlZnQKKwlbIDEyIF0gPSBLRVlfRk9SV0FSRCwJCS8vIGZtIHR1bmluZyByaWdodCBvciBmdW5jdGlvbiByaWdodAogCiAJWyAgMCBdID0gS0VZX1JFQ09SRCwKLSAgICAgICAgWyAgOCBdID0gS0VZX1NUT1AsCi0gICAgICAgIFsgMTcgXSA9IEtFWV9QTEFZLAorCVsgIDggXSA9IEtFWV9TVE9QLAorCVsgMTcgXSA9IEtFWV9QTEFZLAogCiAJWyAyNSBdID0gS0VZX1pPT00sCiAJWyAxNCBdID0gS0VZX01FTlUsCQkvLyBmdW5jdGlvbgogCVsgMTkgXSA9IEtFWV9BR0FJTiwJCS8vIHJlY2FsbAogCVsgMjkgXSA9IEtFWV9SRVNUQVJULAkJLy8gcmVzZXQKKwlbIDI2IF0gPSBLRVlfU0hVRkZMRSwJCS8vIHNuYXBzaG90L3NodWZmbGUKIAogLy8gRklYTUUKIAlbIDEzIF0gPSBLRVlfRjIxLAkJLy8gbXRzCi0gICAgICAgIFsgMTUgXSA9IEtFWV9GMjIsCQkvLyBtaW4KLQlbIDI2IF0gPSBLRVlfRjIzLAkJLy8gZnJlZXplCisJWyAxNSBdID0gS0VZX0YyMiwJCS8vIG1pbgogfTsKIAogLyogQWxleCBIZXJtYW5uIDxnYWFmQGdteC5uZXQ+ICovCkBAIC00ODksMTMgKzQ4NywxNCBAQAogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1OgotICAgICAgICAgICAgICAgIGlyX2NvZGVzICAgICA9IGV6dHZfY29kZXM7Ci0gICAgICAgICAgICAgICAgbWFza19rZXljb2RlID0gMHgwMDAxN2M7Ci0gICAgICAgICAgICAgICAgbWFza19rZXl1cCAgID0gMHgwMDAwMDI7CisJCWlyX2NvZGVzICAgICA9IGV6dHZfY29kZXM7CisJCW1hc2tfa2V5Y29kZSA9IDB4MDAwMTdjOworCQltYXNrX2tleXVwICAgPSAweDAwMDAwMjsKIAkJcG9sbGluZyAgICAgID0gNTA7IC8vIG1zCi0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfWFBFUlQ6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWQUNTU01BUlRUVjoKLQkgICAgICAgIGlyX2NvZGVzICAgICA9IGF2YWNzc21hcnRfY29kZXM7CisJCWlyX2NvZGVzICAgICA9IGF2YWNzc21hcnRfY29kZXM7CiAJCW1hc2tfa2V5Y29kZSA9IDB4MDAwMDFGOwogCQltYXNrX2tleXVwICAgPSAweDAwMDAyMDsKIAkJcG9sbGluZyAgICAgID0gNTA7IC8vIG1zCkBAIC01MjQsNiArNTIzLDcgQEAKIAkJcG9sbGluZyAgICAgID0gNTA7IC8vIG1zCiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTSUk6CiAJCWlyX2NvZGVzICAgICA9IHZpZGVvbWF0ZV90dl9wdnJfY29kZXM7CiAJCW1hc2tfa2V5Y29kZSA9IDB4MDAwMDNGOwogCQltYXNrX2tleXVwICAgPSAweDQwMDAwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LW9zcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKaW5kZXggODE3MzI5MC4uYjViZWRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LW9zcy5jLHYgMS4xNCAyMDA1LzA1LzE4IDIyOjQ1OjE2IGhoYWNrbWFubiBFeHAgJAorICogJElkOiBzYWE3MTM0LW9zcy5jLHYgMS4xNyAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIG9zcyBkc3AgaW50ZXJmYWNlCkBAIC01NTYsMjEgKzU1NiwyOCBAQAogc3RhdGljIGludAogbWl4ZXJfcmVjc3JjXzcxMzMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7Ci0JdTMyIHZhbHVlID0gMHhiYmJiYmI7CisJdTMyIGFuYWJhciwgeGJhcmluOwogCisJeGJhcmluID0gMHgwMzsgLy8gYWRjCisgICAgYW5hYmFyID0gMDsKIAlzd2l0Y2ggKGRldi0+b3NzLmlucHV0KSB7CiAJY2FzZSBUVjoKLQkJdmFsdWUgPSAweGJiYmIxMDsgIC8qIE1BSU4gKi8KKwkJeGJhcmluID0gMDsgLy8gRGVtb2R1bGF0b3IKKyAgICAgICAgYW5hYmFyID0gMjsgLy8gREFDcwogCQlicmVhazsKIAljYXNlIExJTkUxOgotCQl2YWx1ZSA9IDB4YmJiYjMyOyAgLyogQVVYMSAqLworCQlhbmFiYXIgPSAwOyAgLy8gYXV4MSwgYXV4MQogCQlicmVhazsKIAljYXNlIExJTkUyOgogCWNhc2UgTElORTJfTEVGVDoKLQkJdmFsdWUgPSAweGJiYmI1NDsgIC8qIEFVWDIgKi8KKwkJYW5hYmFyID0gOTsgIC8vIGF1eDIsIGF1eDIKIAkJYnJlYWs7CiAJfQotCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgdmFsdWUpOworICAgIC8qIG91dHB1dCB4YmFyIGFsd2F5cyBtYWluIGNoYW5uZWwgKi8KKwlzYWFfZHNwX3dyaXRlbChkZXYsIDB4NDZjID4+IDIsIDB4YmJiYjEwKTsKKwlzYWFfZHNwX3dyaXRlbChkZXYsIDB4NDY0ID4+IDIsIHhiYXJpbik7CisJc2FhX3dyaXRlbCgweDU5NCA+PiAyLCBhbmFiYXIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCmluZGV4IDM0NWViMmEuLjRkZDlmMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdHMuYyx2IDEuMTQgMjAwNS8wMi8wMyAxMDoyNDozMyBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC10cy5jLHYgMS4xNSAyMDA1LzA2LzE0IDIyOjQ4OjE4IGhoYWNrbWFubiBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCkBAIC0yMjEsMTAgKzIyMSwxMCBAQAogCWlmIChkZXYtPnRzX3EuY3VycikgewogCQlmaWVsZCA9IGRldi0+dHNfcS5jdXJyLT52Yi5maWVsZDsKIAkJaWYgKGZpZWxkID09IFY0TDJfRklFTERfVE9QKSB7Ci0JCQlpZiAoKHN0YXR1cyAmIDB4MTAwMDAwKSAhPSAweDAwMDAwMCkKKwkJCWlmICgoc3RhdHVzICYgMHgxMDAwMDApICE9IDB4MTAwMDAwKQogCQkJCWdvdG8gZG9uZTsKIAkJfSBlbHNlIHsKLQkJCWlmICgoc3RhdHVzICYgMHgxMDAwMDApICE9IDB4MTAwMDAwKQorCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgwMDAwMDApCiAJCQkJZ290byBkb25lOwogCQl9CiAJCXNhYTcxMzRfYnVmZmVyX2ZpbmlzaChkZXYsJmRldi0+dHNfcSxTVEFURV9ET05FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYwppbmRleCAzNjE3ZTdmLi5lZWFmYTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10dmF1ZGlvLmMsdiAxLjI1IDIwMDUvMDYvMDcgMTk6MDA6MzggbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtdHZhdWRpby5jLHYgMS4zMCAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHR2IGF1ZGlvIGRlY29kZXIgKGZtIHN0ZXJlbywgbmljYW0sIC4uLikKQEAgLTE2OSw3ICsxNjksNyBAQAogCWludCBjbG9jayA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLmF1ZGlvX2Nsb2NrOwogCiAJaWYgKFVOU0VUICE9IGF1ZGlvX2Nsb2NrX292ZXJyaWRlKQotCSAgICAgICAgY2xvY2sgPSBhdWRpb19jbG9ja19vdmVycmlkZTsKKwkJY2xvY2sgPSBhdWRpb19jbG9ja19vdmVycmlkZTsKIAogCS8qIGluaXQgYWxsIGF1ZGlvIHJlZ2lzdGVycyAqLwogCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19QTExfQ1RSTCwgICAweDAwKTsKQEAgLTIxOSwxNCArMjE5LDE3IEBACiAJaW4gICA9IGRldi0+aW5wdXQ7CiAJbXV0ZSA9IChkZXYtPmN0bF9tdXRlIHx8CiAJCShkZXYtPmF1dG9tdXRlICAmJiAgKCZjYXJkKGRldikucmFkaW8pICE9IGluKSk7Ci0JaWYgKFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwID09IGRldi0+cGNpLT5kZXZpY2UgJiYKLQkgICAgY2FyZChkZXYpLm11dGUubmFtZSkgewotCQkvKiA3MTMwIC0gd2UnbGwgbXV0ZSB1c2luZyBzb21lIHVuY29ubmVjdGVkIGF1ZGlvIGlucHV0ICovCisJaWYgKGNhcmQoZGV2KS5tdXRlLm5hbWUpIHsKKwkJLyoKKwkJICogNzEzMCAtIHdlJ2xsIG11dGUgdXNpbmcgc29tZSB1bmNvbm5lY3RlZCBhdWRpbyBpbnB1dAorCQkgKiA3MTM0IC0gd2UnbGwgcHJvYmFibHkgc2hvdWxkIHN3aXRjaCBleHRlcm5hbCBtdXggd2l0aCBncGlvCisJCSAqLwogCQlpZiAobXV0ZSkKIAkJCWluID0gJmNhcmQoZGV2KS5tdXRlOwogCX0KKwogCWlmIChkZXYtPmh3X211dGUgID09IG11dGUgJiYKLQkgICAgZGV2LT5od19pbnB1dCA9PSBpbikgeworCQlkZXYtPmh3X2lucHV0ID09IGluKSB7CiAJCWRwcmludGsoIm11dGUvaW5wdXQ6IG5vdGhpbmcgdG8gZG8gW211dGU9JWQsaW5wdXQ9JXNdXG4iLAogCQkJbXV0ZSxpbi0+bmFtZSk7CiAJCXJldHVybjsKQEAgLTI2MCw2ICsyNjMsNyBAQAogCS8qIHN3aXRjaCBncGlvLWNvbm5lY3RlZCBleHRlcm5hbCBhdWRpbyBtdXggKi8KIAlpZiAoMCA9PSBjYXJkKGRldikuZ3Bpb21hc2spCiAJCXJldHVybjsKKwogCW1hc2sgPSBjYXJkKGRldikuZ3Bpb21hc2s7CiAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAgIG1hc2ssIG1hc2spOwogCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCBtYXNrLCBpbi0+Z3Bpbyk7CkBAIC0zMzksMTMgKzM0Myw4IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc2NoZWR1bGUoKTsKIAkJfSBlbHNlIHsKLSNpZiAwCi0JCQkvKiBobW0sIHRoYXQgb25lIGRvZXNuJ3QgcmV0dXJuIG9uIHdha2V1cCAuLi4gKi8KLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwotI2Vsc2UKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotI2VuZGlmCiAJCX0KIAl9CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+dGhyZWFkLndxLCAmd2FpdCk7CkBAIC00MDAsMjcgKzM5OSwxMCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkIHNpZmRlYnVnX2R1bXBfcmVncyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKLXsKLQlwcmludF9yZWdiKEFVRElPX1NUQVRVUyk7Ci0JcHJpbnRfcmVnYihJREVOVF9TSUYpOwotCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDEpOwotCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDIpOwotCXByaW50X3JlZ2IoRENYT19JREVOVF9DVFJMKTsKLQlwcmludF9yZWdiKERFTU9EVUxBVE9SKTsKLQlwcmludF9yZWdiKEFHQ19HQUlOX1NFTEVDVCk7Ci0JcHJpbnRfcmVnYihNT05JVE9SX1NFTEVDVCk7Ci0JcHJpbnRfcmVnYihGTV9ERUVNUEhBU0lTKTsKLQlwcmludF9yZWdiKEZNX0RFTUFUUklYKTsKLQlwcmludF9yZWdiKFNJRl9TQU1QTEVfRlJFUSk7Ci0JcHJpbnRfcmVnYihBTkFMT0dfSU9fU0VMRUNUKTsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHR2YXVkaW9fZ2V0c3RlcmVvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvICphdWRpbykKIHsKLQlfX3UzMiBpZHAsbmljYW07CisJX191MzIgaWRwLCBuaWNhbSwgbmljYW1fc3RhdHVzOwogCWludCByZXR2YWwgPSAtMTsKIAogCXN3aXRjaCAoYXVkaW8tPm1vZGUpIHsKQEAgLTQ0MiwxOCArNDI0LDI0IEBACiAJCWJyZWFrOwogCWNhc2UgVFZBVURJT19OSUNBTV9GTToKIAljYXNlIFRWQVVESU9fTklDQU1fQU06Ci0JCW5pY2FtID0gc2FhX3JlYWRiKFNBQTcxMzRfTklDQU1fU1RBVFVTKTsKKwkJbmljYW0gPSBzYWFfcmVhZGIoU0FBNzEzNF9BVURJT19TVEFUVVMpOwogCQlkcHJpbnRrKCJnZXRzdGVyZW86IG5pY2FtPTB4JXhcbiIsbmljYW0pOwotCQlzd2l0Y2ggKG5pY2FtICYgMHgwYikgewotCQljYXNlIDB4MDg6Ci0JCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwOToKLQkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDBhOgotCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCWJyZWFrOworCQlpZiAobmljYW0gJiAweDEpIHsKKwkJCW5pY2FtX3N0YXR1cyA9IHNhYV9yZWFkYihTQUE3MTM0X05JQ0FNX1NUQVRVUyk7CisJCQlkcHJpbnRrKCJnZXRzdGVyZW86IG5pY2FtX3N0YXR1cz0weCV4XG4iLCBuaWNhbV9zdGF0dXMpOworCisJCQlzd2l0Y2ggKG5pY2FtX3N0YXR1cyAmIDB4MDMpIHsKKwkJCSAgICBjYXNlIDB4MDE6CisJCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDB4MDI6CisJCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCQlicmVhazsKKwkJCSAgICBkZWZhdWx0OgorCQkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBObyBuaWNhbSBkZXRlY3RlZCAqLwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTQ4OSwxNSArNDc3LDE1IEBACiAJCWJyZWFrOwogCWNhc2UgVFZBVURJT19GTV9LX1NURVJFTzoKIAljYXNlIFRWQVVESU9fRk1fQkdfU1RFUkVPOgorCWNhc2UgVFZBVURJT19OSUNBTV9BTToKKwljYXNlIFRWQVVESU9fTklDQU1fRk06CiAJCWRwcmludGsoInNldHN0ZXJlbyBbZm1dID0+ICVzXG4iLAogCQkJbmFtZVsgbW9kZSAlIEFSUkFZX1NJWkUobmFtZSkgXSk7CiAJCXJlZyA9IGZtWyBtb2RlICUgQVJSQVlfU0laRShmbSkgXTsKIAkJc2FhX3dyaXRlYihTQUE3MTM0X0ZNX0RFTUFUUklYLCByZWcpOwogCQlicmVhazsKIAljYXNlIFRWQVVESU9fRk1fU0FUX1NURVJFTzoKLQljYXNlIFRWQVVESU9fTklDQU1fQU06Ci0JY2FzZSBUVkFVRElPX05JQ0FNX0ZNOgotCQkvKiBGSVhNRSAqLworCQkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNTk2LDcgKzU4NCw3IEBACiAJCS8qIGZpbmQgdGhlIGV4YWN0IHR2IGF1ZGlvIG5vcm0gKi8KIAkJZm9yIChhdWRpbyA9IFVOU0VULCBpID0gMDsgaSA8IFRWQVVESU87IGkrKykgewogCQkJaWYgKGRldi0+dHZub3JtLT5pZCAhPSBVTlNFVCAmJgotCQkJICAgICEoZGV2LT50dm5vcm0tPmlkICYgdHZhdWRpb1tpXS5zdGQpKQorCQkJCSEoZGV2LT50dm5vcm0tPmlkICYgdHZhdWRpb1tpXS5zdGQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHR2YXVkaW9baV0uY2FycjEgIT0gY2FycmllcikKIAkJCQljb250aW51ZTsKQEAgLTcwMywyNCArNjkxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgc2FhX2RzcF9yZWFkbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywgdTMyICp2YWx1ZSkKLXsKLQlpbnQgZXJyOwotCi0JZDJwcmludGsoImRzcCByZWFkIHJlZyAweCV4XG4iLCByZWc8PDIpOwotCXNhYV9yZWFkbChyZWcpOwotCWVyciA9IHNhYV9kc3Bfd2FpdF9iaXQoZGV2LFNBQTcxMzVfRFNQX1JXU1RBVEVfUkRCKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQkqdmFsdWUgPSBzYWFfcmVhZGwocmVnKTsKLQlkMnByaW50aygiZHNwIHJlYWQgICA9PiAweCUwNnhcbiIsICp2YWx1ZSAmIDB4ZmZmZmZmKTsKLQllcnIgPSBzYWFfZHNwX3dhaXRfYml0KGRldixTQUE3MTM1X0RTUF9SV1NUQVRFX0lEQSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIAogaW50IHNhYV9kc3Bfd3JpdGVsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7CkBAIC03NTMsMzEgKzcyMyw1MCBAQAogc3RhdGljIGludCBtdXRlX2lucHV0XzcxMzMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7CiAJdTMyIHJlZyA9IDA7CisJdTMyIHhiYXJpbiwgeGJhcm91dDsKIAlpbnQgbWFzazsKKwlzdHJ1Y3Qgc2FhNzEzNF9pbnB1dCAqaW47CiAKKwkvKiBIYWMgMDUwNiByb3V0ZSBPU1Mgc291bmQgc2ltdWx0YW5vdXNseSAgKi8KKwl4YmFyaW4gPSAweDAzOwogCXN3aXRjaCAoZGV2LT5pbnB1dC0+YW11eCkgewogCWNhc2UgVFY6CiAJCXJlZyA9IDB4MDI7CisJCXhiYXJpbiA9IDA7CiAJCWJyZWFrOwogCWNhc2UgTElORTE6CiAJCXJlZyA9IDB4MDA7CiAJCWJyZWFrOwogCWNhc2UgTElORTI6CiAJY2FzZSBMSU5FMl9MRUZUOgotCQlyZWcgPSAweDAxOworCQlyZWcgPSAweDA5OwogCQlicmVhazsKIAl9Ci0JaWYgKGRldi0+Y3RsX211dGUpCisJc2FhX2RzcF93cml0ZWwoZGV2LCAweDQ2NCA+PiAyLCB4YmFyaW4pOworCWlmIChkZXYtPmN0bF9tdXRlKSB7CiAJCXJlZyA9IDB4MDc7CisJCXhiYXJvdXQgPSAweGJiYmJiYjsKKwl9IGVsc2UKKwkJeGJhcm91dCA9IDB4YmJiYjEwOworCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgeGJhcm91dCk7CisKIAlzYWFfd3JpdGVsKDB4NTk0ID4+IDIsIHJlZyk7CiAKKwogCS8qIHN3aXRjaCBncGlvLWNvbm5lY3RlZCBleHRlcm5hbCBhdWRpbyBtdXggKi8KICAgICAgICAgaWYgKDAgIT0gY2FyZChkZXYpLmdwaW9tYXNrKSB7CiAgICAgICAgIAltYXNrID0gY2FyZChkZXYpLmdwaW9tYXNrOworCisJCWlmIChjYXJkKGRldikubXV0ZS5uYW1lICYmIGRldi0+Y3RsX211dGUpCisJCQlpbiA9ICZjYXJkKGRldikubXV0ZTsKKwkJZWxzZQorCQkJaW4gPSBkZXYtPmlucHV0OworCiAgICAgICAgIAlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgbWFzaywgbWFzayk7Ci0gICAgICAgIAlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgbWFzaywgZGV2LT5pbnB1dC0+Z3Bpbyk7Ci0gICAgICAgIAlzYWE3MTM0X3RyYWNrX2dwaW8oZGV2LGRldi0+aW5wdXQtPm5hbWUpOworICAgICAgICAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIG1hc2ssIGluLT5ncGlvKTsKKyAgICAgICAgCXNhYTcxMzRfdHJhY2tfZ3BpbyhkZXYsaW4tPm5hbWUpOwogCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCmluZGV4IDNjMzNjNTkuLjI5ZTUxY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCkBAIC0xMzAsMTMgKzEzMCw3IEBACiAJbGluZXMgICA9IG5vcm0tPnZiaV92X3N0b3BfMCAtIG5vcm0tPnZiaV92X3N0YXJ0XzAgKzE7CiAJaWYgKGxpbmVzID4gVkJJX0xJTkVfQ09VTlQpCiAJCWxpbmVzID0gVkJJX0xJTkVfQ09VTlQ7Ci0jaWYgMQogCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7Ci0jZWxzZQotCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOwotCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQotCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2VuZGlmCiAJc2l6ZSA9IGxpbmVzICogbGxlbmd0aCAqIDI7CiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3OCwxMyArMTcyLDcgQEAKIAlpbnQgbGxlbmd0aCxsaW5lczsKIAogCWxpbmVzICAgPSBkZXYtPnR2bm9ybS0+dmJpX3Zfc3RvcF8wIC0gZGV2LT50dm5vcm0tPnZiaV92X3N0YXJ0XzAgKzE7Ci0jaWYgMQogCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7Ci0jZWxzZQotCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOwotCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQotCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2VuZGlmCiAJKnNpemUgPSBsaW5lcyAqIGxsZW5ndGggKiAyOwogCWlmICgwID09ICpjb3VudCkKIAkJKmNvdW50ID0gdmJpYnVmczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IGMwYTJlZTUuLmE0YzJmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmlkZW8uYyx2IDEuMzAgMjAwNS8wNi8wNyAxOTowMDozOCBuc2ggRXhwICQKKyAqICRJZDogc2FhNzEzNC12aWRlby5jLHYgMS4zNiAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIAkJLmhfc3RhcnQgICAgICAgPSAwLAogCQkuaF9zdG9wICAgICAgICA9IDcxOSwKLQkJLnZpZGVvX3Zfc3RhcnQgPSAyMywKKyAgCQkudmlkZW9fdl9zdGFydCA9IDIzLAogICAJCS52aWRlb192X3N0b3AgID0gMjYyLAogICAJCS52Ymlfdl9zdGFydF8wID0gMTAsCiAgIAkJLnZiaV92X3N0b3BfMCAgPSAyMSwKQEAgLTEyMDQsNyArMTIwNCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlpbnQgcmFkaW8gPSAwOwotCiAJbGlzdF9mb3JfZWFjaChsaXN0LCZzYWE3MTM0X2Rldmxpc3QpIHsKIAkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKIAkJaWYgKGgtPnZpZGVvX2RldiAmJiAoaC0+dmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikpCkBAIC0xMjU2LDEyICsxMjU1LDEyIEBACiAJaWYgKGZoLT5yYWRpbykgewogCQkvKiBzd2l0Y2ggdG8gcmFkaW8gbW9kZSAqLwogCQlzYWE3MTM0X3R2YXVkaW9fc2V0aW5wdXQoZGV2LCZjYXJkKGRldikucmFkaW8pOwotCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLE5VTEwpOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLCBOVUxMKTsKIAl9IGVsc2UgewogCQkvKiBzd2l0Y2ggdG8gdmlkZW8vdmJpIG1vZGUgKi8KIAkJdmlkZW9fbXV4KGRldixkZXYtPmN0bF9pbnB1dCk7CiAJfQotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTEzMDQsMTAgKzEzMDMsMTAgQEAKIAl9IGVsc2UgewogCQlkb3duKCZmaC0+Y2FwLmxvY2spOwogCQlpZiAoVU5TRVQgPT0gZmgtPmNhcC5yZWFkX29mZikgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBjYXB0dXJlIGEgbmV3IGZyYW1lICovCisJCQkvKiBuZWVkIHRvIGNhcHR1cmUgYSBuZXcgZnJhbWUgKi8KIAkJCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9MTEVSUjsKKwkJCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJCQlyZXR1cm4gUE9MTEVSUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IGZoLT5jYXAub3BzLT5idWZfcHJlcGFyZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmLGZoLT5jYXAuZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwpAQCAtMTM2Myw2ICsxMzYyLDM2IEBACiAJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WQkkpOwogCX0KIAorCS8qIHRzLWNhcHR1cmUgd2lsbCBub3Qgd29yayBpbiBwbGFuYXIgbW9kZSwgc28gdHVybiBpdCBvZmYgSGFjOiAwNC4wNSovCisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQSwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQiwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9BLCAweDFmLCAwKTsKKwlzYWFfYW5kb3JiKFNBQTcxMzRfT0ZNVF9EQVRBX0IsIDB4MWYsIDApOworCisJaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX1REQTgyOTApIHsKKwkJdTggZGF0YVsyXTsKKwkJaW50IHJldDsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPUkyQ19BRERSX1REQTgyOTAsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSAyfTsKKwkJZGF0YVswXSA9IDB4MjE7CisJCWRhdGFbMV0gPSAweGMwOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCQlpZiAocmV0ICE9IDEpCisJCQlwcmludGsoS0VSTl9FUlIgIlREQTgyOTAgYWNjZXNzIGZhaWx1cmVcbiIpOworCQltc2cuYWRkciA9IEkyQ19BRERSX1REQTgyNzU7CisJCWRhdGFbMF0gPSAweDMwOworCQlkYXRhWzFdID0gMHhkMDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUREE4Mjc1IGFjY2VzcyBmYWlsdXJlXG4iKTsKKwkJbXNnLmFkZHIgPSBJMkNfQUREUl9UREE4MjkwOworCQlkYXRhWzBdID0gMHgyMTsKKwkJZGF0YVsxXSA9IDB4ODA7CisJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisJCWRhdGFbMF0gPSAweDAwOworCQlkYXRhWzFdID0gMHgwMjsKKwkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwl9CisKIAkvKiBmcmVlIHN0dWZmICovCiAJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+Y2FwKTsKIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmkpOwpAQCAtMTM5OSwxMyArMTQyOCw2IEBACiAJZi0+Zm10LnZiaS5jb3VudFsxXSA9IGYtPmZtdC52YmkuY291bnRbMF07CiAJZi0+Zm10LnZiaS5mbGFncyA9IDA7IC8qIFZCSV9VTlNZTkMgVkJJX0lOVEVSTEFDRUQgKi8KIAotI2lmIDAKLQlpZiAoVjRMMl9TVERfUEFMID09IG5vcm0tPmlkKSB7Ci0JCS8qIEZJWE1FICovCi0JCWYtPmZtdC52Ymkuc3RhcnRbMF0gKz0gMzsKLQkJZi0+Zm10LnZiaS5zdGFydFsxXSArPSAzKjI7Ci0JfQotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgc2FhNzEzNF9nX2ZtdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoLApAQCAtMjEyMCw4ICsyMTQyLDYgQEAKIAogCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCQlzdHJjcHkodC0+bmFtZSwgIlJhZGlvIik7Ci0gICAgICAgICAgICAgICAgdC0+cmFuZ2Vsb3cgID0gKGludCkoNjUqMTYpOwotICAgICAgICAgICAgICAgIHQtPnJhbmdlaGlnaCA9IChpbnQpKDEwOCoxNik7CiAKIAkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0dfVFVORVIsIHQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCBkNmIxYzBkLi42ODM2YzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LmgsdiAxLjQxIDIwMDUvMDYvMDcgMTg6MDI6MjYgbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQuaCx2IDEuNDggMjAwNS8wNy8wMSAwODoyMjoyNCBuc2ggRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICoKQEAgLTQ2LDggKzQ2LDYgQEAKICNlbmRpZgogI2RlZmluZSBVTlNFVCAoLTFVKQogCi0vKiAyLjQgLyAyLjUgZHJpdmVyIGNvbXBhdGliaWxpdHkgc3R1ZmYgKi8KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTE1OSw3ICsxNTcsNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9EVkRfRVpNQUtFUiAzMwogI2RlZmluZSBTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzIDM0CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDUgMzUKLSNkZWZpbmUgU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWIDM2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViAzNgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0lURU1TX01UVjAwNSAgICAgMzcKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwICAgICAgIDM4CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JIDM5CkBAIC0xNzYsMTMgKzE3NCwxNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUwgNTAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiAgIDUxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNSAgICA1MgotI2RlZmluZSBTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzUgNTMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM1IDUzCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSA1NAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU8gNTUKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3ICAgIDU2CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTSA1NwogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWIDU4CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlQgNTkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTIDYwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCA2MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSSA2MgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVCA2MwogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApAQCAtMjEzLDYgKzIxNSwxMCBAQAogCiAJLyogaTJjIGNoaXAgaW5mbyAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR1bmVyX3R5cGU7CisJdW5zaWduZWQgaW50CQlyYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIJCXR1bmVyX2FkZHI7CisJdW5zaWduZWQgY2hhcgkJcmFkaW9fYWRkcjsKKwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAogCS8qIHBlcmlwaGVyYWwgSS9PICovCkBAIC00MDMsOSArNDA5LDEyIEBACiAJLyogY29uZmlnIGluZm8gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBib2FyZDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCAJCSAgIHJhZGlvX3R5cGU7CisJdW5zaWduZWQgY2hhcgkJICAgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCQkgICByYWRpb19hZGRyOworCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdGRhOTg4N19jb25mOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGdwaW9fdmFsdWU7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaXJxMl9tYXNrOwogCiAJLyogaTJjIGkvbyAqLwogCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgIGkyY19hZGFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwppbmRleCAwN2JhNmQzLi43Y2IxZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwpAQCAtMjQzLDE5ICsyNDMsNiBAQAogfQogCiAvKiBJIGRvbid0IHRoaW5rIHdlIGV2ZXIgYWN0dWFsbHkgX3JlYWRfIHRoZSBjaGlwLi4uICovCi0jaWYgMAotc3RhdGljIGludCB0ZGE3NDMyX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKLQlkMnByaW50aygidGRhNzQzMjogSW4gdGRhNzQzMl9yZWFkXG4iKTsKLQlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCZidWZmZXIsMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhNzQzMjogSS9PIGVycm9yLCB0cnlpbmcgKHJlYWQpXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkcHJpbnRrKCJ0ZGE3NDMyOiBSZWFkIDB4JTAyeFxuIiwgYnVmZmVyKTsKLQlyZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdGRhNzQzMl9zZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKaW5kZXggYjI3Y2MzNC4uYThiNmE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiB0ZGE4MjkwLmMsdiAxLjcgMjAwNS8wMy8wNyAxMjowMTo1MSBrcmF4ZWwgRXhwICQKKyAqICRJZDogdGRhODI5MC5jLHYgMS4xNSAyMDA1LzA3LzA4IDIwOjIxOjMzIG1jaGVoYWIgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb250cm9scyB0aGUgcGhpbGlwcyB0ZGE4MjkwKzc1IHR1bmVyIGNoaXAgY29tYm8uCkBAIC02OSw3ICs2OSw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfZW5hYmxlX2JyaWRnZVsyXSA9IAl7IDB4MjEsIDB4QzAgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19kaXNhYmxlX2JyaWRnZVsyXSA9IAl7IDB4MjEsIDB4ODAgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19pbml0X3RkYTgyNzVbMTRdID0gCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJCQkJCSAgMHg3QywgMHgwNCwgMHhBMywgMHgzRiwKKwkJCQkJCSAgMHhmQywgMHgwNCwgMHhBMywgMHgzRiwKIAkJCQkJCSAgMHgyQSwgMHgwNCwgMHhGRiwgMHgwMCwKIAkJCQkJCSAgMHgwMCwgMHg0MCB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX3NldF9WU1syXSA9IAkJeyAweDMwLCAweDZGIH07CkBAIC0xMzYsMTggKzEzNiwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfZnJlcXVlbmN5KHN0cnVjdCB0dW5lciAqdCwgdTE2IGlmYykKK3N0YXRpYyB2b2lkIHNldF9mcmVxdWVuY3koc3RydWN0IHR1bmVyICp0LCB1MTYgaWZjLCB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKLQl1MzIgTiA9ICgoKHQtPmZyZXE8PDMpK2lmYykmMHgzZmZmYyk7CisJdTMyIE47CiAKLQlOID0gTiA+PiBnZXRfZnJlcV9lbnRyeShkaXZfdGFibGUsIHQtPmZyZXEpOworCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pCisJCWZyZXEgPSBmcmVxIC8gMTAwMDsKKworCU4gPSAoKChmcmVxPDwzKStpZmMpJjB4M2ZmZmMpOworCisJTiA9IE4gPj4gZ2V0X2ZyZXFfZW50cnkoZGl2X3RhYmxlLCBmcmVxKTsKIAl0LT5pMmNfc2V0X2ZyZXFbMF0gPSAwOwogCXQtPmkyY19zZXRfZnJlcVsxXSA9ICh1bnNpZ25lZCBjaGFyKShOPj44KTsKIAl0LT5pMmNfc2V0X2ZyZXFbMl0gPSAodW5zaWduZWQgY2hhcikgTjsKIAl0LT5pMmNfc2V0X2ZyZXFbM10gPSAweDQwOwogCXQtPmkyY19zZXRfZnJlcVs0XSA9IDB4NTI7Ci0JdC0+aTJjX3NldF9mcmVxWzVdID0gZ2V0X2ZyZXFfZW50cnkoYmFuZF90YWJsZSwgdC0+ZnJlcSk7Ci0JdC0+aTJjX3NldF9mcmVxWzZdID0gZ2V0X2ZyZXFfZW50cnkoYWdjX3RhYmxlLCAgdC0+ZnJlcSk7CisJdC0+aTJjX3NldF9mcmVxWzVdID0gZ2V0X2ZyZXFfZW50cnkoYmFuZF90YWJsZSwgZnJlcSk7CisJdC0+aTJjX3NldF9mcmVxWzZdID0gZ2V0X2ZyZXFfZW50cnkoYWdjX3RhYmxlLCAgZnJlcSk7CiAJdC0+aTJjX3NldF9mcmVxWzddID0gMHg4ZjsKIH0KIApAQCAtMTc5LDE0ICsxODQsMTQgQEAKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKIAlzZXRfYXVkaW8odCk7Ci0Jc2V0X2ZyZXF1ZW5jeSh0LCA4NjQpOworCXNldF9mcmVxdWVuY3kodCwgODY0LCBmcmVxKTsKIAl0ZGE4MjkwX3R1bmUoYyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc2V0X2ZyZXF1ZW5jeSh0LCA3MDQpOworCXNldF9mcmVxdWVuY3kodCwgNzA0LCBmcmVxKTsKIAl0ZGE4MjkwX3R1bmUoYyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKaW5kZXggOTdiMTEzZS4uNTY2ZTFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKQEAgLTEyMywxOSArMTIzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgdGRhOTg3NV9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JdW5zaWduZWQgY2hhciBidWZmZXI7Ci0JZHByaW50aygiSW4gdGRhOTg3NV9yZWFkXG4iKTsKLQlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCZidWZmZXIsMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhOTg3NTogSS9PIGVycm9yLCB0cnlpbmcgKHJlYWQpXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkcHJpbnRrKCJSZWFkIDB4JTAyeFxuIiwgYnVmZmVyKTsKLQlyZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgaTJjX3JlYWRfcmVnaXN0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IHJlZykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKaW5kZXggMzk3NzM2My4uMTA4YzNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCQlpZiAodC0+cmFkaW9fbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKIAkJCW5vcm0gPSAmcmFkaW9fbW9ubzsKIAkJZWxzZQotCQkgICAgICAgIG5vcm0gPSAmcmFkaW9fc3RlcmVvOworCQkJbm9ybSA9ICZyYWRpb19zdGVyZW87CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHZub3Jtcyk7IGkrKykgewogCQkJaWYgKHR2bm9ybXNbaV0uc3RkICYgdC0+c3RkKSB7CkBAIC01NjYsMTkgKzU2Niw5IEBACiAJaWYgKFVOU0VUICE9IHQtPnBpbm5hY2xlX2lkKSB7CiAJCXRkYTk4ODdfc2V0X3Bpbm5hY2xlKHQsYnVmKTsKIAl9Ci0KIAl0ZGE5ODg3X3NldF9jb25maWcodCxidWYpOwogCXRkYTk4ODdfc2V0X2luc21vZCh0LGJ1Zik7CiAKLSNpZiAwCi0JLyogVGhpcyBhcy1pcyBicmVha3Mgc29tZSBjYXJkcywgbXVzdCBiZSBmaXhlZCBpbiBhCi0JICogY2FyZC1zcGVjaWZpYyB3YXksIHByb2JhYmx5IHVzaW5nIFREQTk4ODdfU0VUX0NPTkZJRyB0bwotCSAqIHR1cm4gb24vb2ZmIHBvcnQyICovCi0JaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0wpIHsKLQkJLyogc2VjYW0gZml4dXAgKEZJWE1FOiBtb3ZlIHRoaXMgdG8gdHZub3JtcyBhcnJheT8pICovCi0JCWJ1ZlsxXSAmPSB+Y091dHB1dFBvcnQySW5hY3RpdmU7Ci0JfQotI2VuZGlmCiAKIAlkcHJpbnRrKFBSRUZJWCAid3JpdGluZzogYj0weCUwMnggYz0weCUwMnggZT0weCUwMnhcbiIsCiAJCWJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKQEAgLTYxNSw4ICs2MDUsOCBAQAogCXQtPnBpbm5hY2xlX2lkID0gVU5TRVQ7CiAJdC0+cmFkaW9fbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAKLSAgICAgICAgaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5jbGllbnQsIHQpOwotICAgICAgICBpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoJnQtPmNsaWVudCwgdCk7CisJaTJjX2F0dGFjaF9jbGllbnQoJnQtPmNsaWVudCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyN2FjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogRm9yIFBoaWxpcHMgVEVBNTc2NyBGTSBDaGlwIHVzZWQgb24gc29tZSBUViBDYXJkcyBsaWtlIFByb2xpbmsgUGl4ZWx2aWV3CisgKiBJMkMgYWRkcmVzcyBpcyBhbGx3YXlzIDB4QzAuCisgKgorICogJElkOiB0ZWE1NzY3LmMsdiAxLjIxIDIwMDUvMDcvMTQgMDM6MDY6NDMgbWNoZWhhYiBFeHAgJAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgKG1jaGVoYWJAYnJ0dXJiby5jb20uYnIpCisgKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKiB0ZWE1NzY3IGF1dG9kZXRlY3Rpb24gdGhhbmtzIHRvIFRvcnN0ZW4gU2VlYm90aCBhbmQgQXRzdXNoaSBOYWthZ2F3YQorICogZnJvbSB0aGVpciBjb250cmlidXRpb25zIG9uIERTY2FsZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisKKyNkZWZpbmUgUFJFRklYICJURUE1NzY3ICIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXcml0ZSBtb2RlIHJlZ2lzdGVyIHZhbHVlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGaXJzdCByZWdpc3RlciAqLworI2RlZmluZSBURUE1NzY3X01VVEUJCTB4ODAJLyogTXV0ZXMgb3V0cHV0ICovCisjZGVmaW5lIFRFQTU3NjdfU0VBUkNICQkweDQwCS8qIEFjdGl2YXRlcyBzdGF0aW9uIHNlYXJjaCAqLworLyogQml0cyAwLTUgZm9yIGRpdmlkZXIgTVNCICovCisKKy8qIFNlY29uZCByZWdpc3RlciAqLworLyogQml0cyAwLTcgZm9yIGRpdmlkZXIgTFNCICovCisKKy8qIFRoaXJkIHJlZ2lzdGVyICovCisKKy8qIFN0YXRpb24gc2VhcmNoIGZyb20gYm90dG9uIHRvIHVwICovCisjZGVmaW5lIFRFQTU3NjdfU0VBUkNIX1VQCTB4ODAKKworLyogU2VhcmNoZXMgd2l0aCBBREMgb3V0cHV0ID0gMTAgKi8KKyNkZWZpbmUgVEVBNTc2N19TUkNIX0hJR0hfTFZMCTB4NjAKKworLyogU2VhcmNoZXMgd2l0aCBBREMgb3V0cHV0ID0gMTAgKi8KKyNkZWZpbmUgVEVBNTc2N19TUkNIX01JRF9MVkwJMHg0MAorCisvKiBTZWFyY2hlcyB3aXRoIEFEQyBvdXRwdXQgPSA1ICovCisjZGVmaW5lIFRFQTU3NjdfU1JDSF9MT1dfTFZMCTB4MjAKKworLyogaWYgb24sIGRpdj00KihGcmYrRmlmKS9GcmVmIG90aGVyd2lzZSwgZGl2PTQqKEZyZi1GaWYpL0ZyZXEpICovCisjZGVmaW5lIFRFQTU3NjdfSElHSF9MT19JTkpFQ1QJMHgxMAorCisvKiBEaXNhYmxlIHN0ZXJlbyAqLworI2RlZmluZSBURUE1NzY3X01PTk8JCTB4MDgKKworLyogRGlzYWJsZSByaWdodCBjaGFubmVsIGFuZCB0dXJucyB0byBtb25vICovCisjZGVmaW5lIFRFQTU3NjdfTVVURV9SSUdIVAkweDA0CisKKy8qIERpc2FibGUgbGVmdCBjaGFubmVsIGFuZCB0dXJucyB0byBtb25vICovCisjZGVmaW5lIFRFQTU3NjdfTVVURV9MRUZUCTB4MDIKKworI2RlZmluZSBURUE1NzY3X1BPUlQxX0hJR0gJMHgwMQorCisvKiBGb3J0aCByZWdpc3RlciAqLworI2RlZmluZSBURUE1NzY3X1BPUlQyX0hJR0gJMHg4MAorLyogQ2hpcHMgc3RvcHMgd29ya2luZy4gT25seSBJMkMgYnVzIHJlbWFpbnMgb24gKi8KKyNkZWZpbmUgVEVBNTc2N19TVERCWQkJMHg0MAorCisvKiBKYXBhbiBmcmVxICg3Ni0xMDggTUh6LiBJZiBkaXNhYmxlZCwgODcuNS0xMDggTUh6ICovCisjZGVmaW5lIFRFQTU3NjdfSkFQQU5fQkFORAkweDIwCisKKy8qIFVuc2VsZWN0ZWQgbWVhbnMgMzIuNzY4IEtIeiBmcmVxIGFzIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIFh0YWwgYXQgMTMgTUh6ICovCisjZGVmaW5lIFRFQTU3NjdfWFRBTF8zMjc2OAkweDEwCisKKy8qIEN1dHMgd2VhayBzaWduYWxzICovCisjZGVmaW5lIFRFQTU3NjdfU09GVF9NVVRFCTB4MDgKKworLyogQWN0aXZhdGVzIGhpZ2ggY3V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgVEVBNTc2N19ISUdIX0NVVF9DVFJMCTB4MDQKKworLyogQWN0aXZhdGVzIHN0ZXJlbyBub2lzZSBjb250cm9sICovCisjZGVmaW5lIFRFQTU3NjdfU1RfTk9JU0VfQ1RMCTB4MDIKKworLyogSWYgYWN0aXZhdGUgUE9SVCAxIGluZGljYXRlcyBTRUFSQ0ggb3IgZWxzZSBpdCBpcyB1c2VkIGFzIFBPUlQxICovCisjZGVmaW5lIFRFQTU3NjdfU1JDSF9JTkQJMHgwMQorCisvKiBGaXZldGggcmVnaXN0ZXIgKi8KKworLyogQnkgYWN0aXZhdGluZywgaXQgd2lsbCB1c2UgWHRhbCBhdCAxMyBNSHogYXMgcmVmZXJlbmNlIGZvciBkaXZpZGVyICovCisjZGVmaW5lIFRFQTU3NjdfUExMUkVGX0VOQUJMRQkweDgwCisKKy8qIEJ5IGFjdGl2YXRpbmcsIGRlZW1waGFzaXM9NTAsIG9yIGVsc2UsIGRlZW1waGFzaXMgb2YgNTB1cyAqLworI2RlZmluZSBURUE1NzY3X0RFRU1QSF83NQkwWDQwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZCBtb2RlIHJlZ2lzdGVyIHZhbHVlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZpcnN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRFQTU3NjdfUkVBRFlfRkxBR19NQVNLCTB4ODAKKyNkZWZpbmUgVEVBNTc2N19CQU5EX0xJTUlUX01BU0sJMFg0MAorLyogQml0cyAwLTUgZm9yIGRpdmlkZXIgTVNCIGFmdGVyIHNlYXJjaCBvciBwcmVzZXQgKi8KKworLyogU2Vjb25kIHJlZ2lzdGVyICovCisvKiBCaXRzIDAtNyBmb3IgZGl2aWRlciBMU0IgYWZ0ZXIgc2VhcmNoIG9yIHByZXNldCAqLworCisvKiBUaGlyZCByZWdpc3RlciAqLworI2RlZmluZSBURUE1NzY3X1NURVJFT19NQVNLCTB4ODAKKyNkZWZpbmUgVEVBNTc2N19JRl9DTlRSX01BU0sJMHg3ZgorCisvKiBGb3VyIHJlZ2lzdGVyICovCisjZGVmaW5lIFRFQTU3NjdfQURDX0xFVkVMX01BU0sJMHhmMAorCisvKiBzaG91bGQgYmUgMCAqLworI2RlZmluZSBURUE1NzY3X0NISVBfSURfTUFTSwkweDBmCisKKy8qIEZpdmV0aCByZWdpc3RlciAqLworLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisjZGVmaW5lIFRFQTU3NjdfUkVTRVJWRURfTUFTSwkweGZmCisKK2VudW0gdGVhNTc2N194dGFsX2ZyZXEgeworICAgICAgICBURUE1NzY3X0xPV19MT18zMjc2OCAgICA9IDAsCisgICAgICAgIFRFQTU3NjdfSElHSF9MT18zMjc2OCAgID0gMSwKKyAgICAgICAgVEVBNTc2N19MT1dfTE9fMTNNSHogICAgPSAyLAorICAgICAgICBURUE1NzY3X0hJR0hfTE9fMTNNSHogICA9IDMsCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2V0X3R2X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCXR1bmVyX3dhcm4oIlRoaXMgdHVuZXIgZG9lc24ndCBzdXBwb3J0IFRWIGZyZXEuXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVhNTc2N19zdGF0dXNfZHVtcCh1bnNpZ25lZCBjaGFyICpidWZmZXIpCit7CisJdW5zaWduZWQgaW50IGRpdiwgZnJxOworCisJaWYgKFRFQTU3NjdfUkVBRFlfRkxBR19NQVNLICYgYnVmZmVyWzBdKQorCQlwcmludGsoUFJFRklYICJSZWFkeSBGbGFnIE9OXG4iKTsKKwllbHNlCisJCXByaW50ayhQUkVGSVggIlJlYWR5IEZsYWcgT0ZGXG4iKTsKKworCWlmIChURUE1NzY3X0JBTkRfTElNSVRfTUFTSyAmIGJ1ZmZlclswXSkKKwkJcHJpbnRrKFBSRUZJWCAiVHVuZXIgYXQgYmFuZCBsaW1pdFxuIik7CisJZWxzZQorCQlwcmludGsoUFJFRklYICJUdW5lciBub3QgYXQgYmFuZCBsaW1pdFxuIik7CisKKwlkaXYgPSAoKGJ1ZmZlclswXSAmIDB4M2YpIDw8IDgpIHwgYnVmZmVyWzFdOworCisJc3dpdGNoIChURUE1NzY3X0hJR0hfTE9fMzI3NjgpIHsKKwljYXNlIFRFQTU3NjdfSElHSF9MT18xM01IejoKKwkJZnJxID0gKGRpdiAqIDUwMDAwIC0gNzAwMDAwIC0gMjI1MDAwKSAvIDQ7CS8qIEZyZXEgaW4gS0h6ICovCisJCWJyZWFrOworCWNhc2UgVEVBNTc2N19MT1dfTE9fMTNNSHo6CisJCWZycSA9IChkaXYgKiA1MDAwMCArIDcwMDAwMCArIDIyNTAwMCkgLyA0OwkvKiBGcmVxIGluIEtIeiAqLworCQlicmVhazsKKwljYXNlIFRFQTU3NjdfTE9XX0xPXzMyNzY4OgorCQlmcnEgPSAoZGl2ICogMzI3NjggKyA3MDAwMDAgKyAyMjUwMDApIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KKwkJYnJlYWs7CisJY2FzZSBURUE1NzY3X0hJR0hfTE9fMzI3Njg6CisJZGVmYXVsdDoKKwkJZnJxID0gKGRpdiAqIDMyNzY4IC0gNzAwMDAwIC0gMjI1MDAwKSAvIDQ7CS8qIEZyZXEgaW4gS0h6ICovCisJCWJyZWFrOworCX0KKwlidWZmZXJbMF0gPSAoZGl2ID4+IDgpICYgMHgzZjsKKwlidWZmZXJbMV0gPSBkaXYgJiAweGZmOworCisJcHJpbnRrKFBSRUZJWCAiRnJlcXVlbmN5ICVkLiUwM2QgS0h6IChkaXZpZGVyID0gMHglMDR4KVxuIiwKKwkgICAgICAgZnJxIC8gMTAwMCwgZnJxICUgMTAwMCwgZGl2KTsKKworCWlmIChURUE1NzY3X1NURVJFT19NQVNLICYgYnVmZmVyWzJdKQorCQlwcmludGsoUFJFRklYICJTdGVyZW9cbiIpOworCWVsc2UKKwkJcHJpbnRrKFBSRUZJWCAiTW9ub1xuIik7CisKKwlwcmludGsoUFJFRklYICJJRiBDb3VudGVyID0gJWRcbiIsIGJ1ZmZlclsyXSAmIFRFQTU3NjdfSUZfQ05UUl9NQVNLKTsKKworCXByaW50ayhQUkVGSVggIkFEQyBMZXZlbCA9ICVkXG4iLAorCSAgICAgICAoYnVmZmVyWzNdICYgVEVBNTc2N19BRENfTEVWRUxfTUFTSykgPj4gNCk7CisKKwlwcmludGsoUFJFRklYICJDaGlwIElEID0gJWRcbiIsIChidWZmZXJbM10gJiBURUE1NzY3X0NISVBfSURfTUFTSykpOworCisJcHJpbnRrKFBSRUZJWCAiUmVzZXJ2ZWQgPSAweCUwMnhcbiIsCisJICAgICAgIChidWZmZXJbNF0gJiBURUE1NzY3X1JFU0VSVkVEX01BU0spKTsKK30KKworLyogRnJlcSBzaG91bGQgYmUgc3BlY2lmeWVkIGF0IDYyLjUgSHogKi8KK3N0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1XTsKKwl1bnNpZ25lZCBkaXY7CisJaW50IHJjOworCisJdHVuZXJfZGJnIChQUkVGSVggInJhZGlvIGZyZXEgPSAlZC4lMDNkIE1IelxuIiwgZnJxLzE2MDAwLChmcnEvMTYpJTEwMDApOworCisJLyogUm91bmRzIGZyZXEgdG8gbmV4dCBkZWNpbWFsIHZhbHVlIC0gZm9yIDYyLjUgS0h6IHN0ZXAgKi8KKwkvKiBmcnEgPSAyMCooZnJxLzE2KStyYWRpb19mcnFbZnJxJTE2XTsgKi8KKworCWJ1ZmZlclsyXSA9IFRFQTU3NjdfUE9SVDFfSElHSDsKKwlidWZmZXJbM10gPSBURUE1NzY3X1BPUlQyX0hJR0ggfCBURUE1NzY3X0hJR0hfQ1VUX0NUUkwgfAorCQkgICAgVEVBNTc2N19TVF9OT0lTRV9DVEwgfCBURUE1NzY3X0pBUEFOX0JBTkQ7CisJYnVmZmVyWzRdID0gMDsKKworCWlmICh0LT5tb2RlID09IFRfU1RBTkRCWSkgeworCQl0dW5lcl9kYmcoIlRFQTU3Njcgc2V0IHRvIHN0YW5kYnkgbW9kZVxuIik7CisJCWJ1ZmZlclszXSB8PSBURUE1NzY3X1NUREJZOworCX0KKworCWlmICh0LT5hdWRtb2RlID09IFY0TDJfVFVORVJfTU9ERV9NT05PKSB7CisJCXR1bmVyX2RiZygiVEVBNTc2NyBzZXQgdG8gbW9ub1xuIik7CisJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X01PTk87CisJfSBlbHNlIHsKKwkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBzdGVyZW9cbiIpOworCX0KKworCS8qIFNob3VsZCBiZSByZXBsYWNlZCAqLworCXN3aXRjaCAoVEVBNTc2N19ISUdIX0xPXzMyNzY4KSB7CisJY2FzZSBURUE1NzY3X0hJR0hfTE9fMTNNSHo6CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDEzIE1IelxuIik7CisJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUOworCQlidWZmZXJbNF0gfD0gVEVBNTc2N19QTExSRUZfRU5BQkxFOworCQlkaXYgPSAoZnJxICogNDAwMCAvIDE2ICsgNzAwMDAwICsgMjI1MDAwICsgMjUwMDApIC8gNTAwMDA7CisJCWJyZWFrOworCWNhc2UgVEVBNTc2N19MT1dfTE9fMTNNSHo6CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gTE9XIExPIGluamVjdCB4dGFsIEAgMTMgTUh6XG4iKTsKKworCQlidWZmZXJbNF0gfD0gVEVBNTc2N19QTExSRUZfRU5BQkxFOworCQlkaXYgPSAoZnJxICogNDAwMCAvIDE2IC0gNzAwMDAwIC0gMjI1MDAwICsgMjUwMDApIC8gNTAwMDA7CisJCWJyZWFrOworCWNhc2UgVEVBNTc2N19MT1dfTE9fMzI3Njg6CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gTE9XIExPIGluamVjdCB4dGFsIEAgMzIsNzY4IE1IelxuIik7CisJCWJ1ZmZlclszXSB8PSBURUE1NzY3X1hUQUxfMzI3Njg7CisJCS8qIGNvbnN0IDcwMD00MDAwKjE3NSBLaHogLSB0byBhZGp1c3QgZnJlcSB0byByaWdodCB2YWx1ZSAqLworCQlkaXYgPSAoKGZycSAqIDQwMDAgLyAxNiAtIDcwMDAwMCAtIDIyNTAwMCkgKyAxNjM4NCkgPj4gMTU7CisJCWJyZWFrOworCWNhc2UgVEVBNTc2N19ISUdIX0xPXzMyNzY4OgorCWRlZmF1bHQ6CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDMyLDc2OCBNSHpcbiIpOworCisJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUOworCQlidWZmZXJbM10gfD0gVEVBNTc2N19YVEFMXzMyNzY4OworCQlkaXYgPSAoKGZycSAqICg0MDAwIC8gMTYpICsgNzAwMDAwICsgMjI1MDAwKSArIDE2Mzg0KSA+PiAxNTsKKwkJYnJlYWs7CisJfQorCWJ1ZmZlclswXSA9IChkaXYgPj4gOCkgJiAweDNmOworCWJ1ZmZlclsxXSA9IGRpdiAmIDB4ZmY7CisKKwlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA1KSkpCisJCXR1bmVyX3dhcm4oImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNSlcbiIsIHJjKTsKKworCWlmICh0dW5lcl9kZWJ1ZykgeworCQlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYywgYnVmZmVyLCA1KSkpCisJCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7CisJCWVsc2UKKwkJCXRlYTU3Njdfc3RhdHVzX2R1bXAoYnVmZmVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGVhNTc2N19zaWduYWwoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV07CisJaW50IHJjOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYywgYnVmZmVyLCA1KSkpCisJCXR1bmVyX3dhcm4oImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNSlcbiIsIHJjKTsKKworCXJldHVybiAoKGJ1ZmZlclszXSAmIFRFQTU3NjdfQURDX0xFVkVMX01BU0spIDw8ICgxMyAtIDQpKTsKK30KKworc3RhdGljIGludCB0ZWE1NzY3X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1XTsKKwlpbnQgcmM7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmICg1ICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDUpKSkKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA1KVxuIiwgcmMpOworCisJcmMgPSBidWZmZXJbMl0gJiBURUE1NzY3X1NURVJFT19NQVNLOworCisJdHVuZXJfZGJnKCJURUE1NzY3IHJhZGlvIFNUIEdFVCA9ICUwMnhcbiIsIHJjKTsKKworCXJldHVybiAoKGJ1ZmZlclsyXSAmIFRFQTU3NjdfU1RFUkVPX01BU0spID8gVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDogMCk7Cit9CisKK2ludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwlpbnQgcmM7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNSkpKSB7CisJCXR1bmVyX3dhcm4oIkl0IGlzIG5vdCBhIFRFQTU3NjcuIFJlY2VpdmVkICVpIGJ5dGVzLlxuIiwgcmMpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCS8qIElmIGFsbCBieXRlcyBhcmUgdGhlIHNhbWUgdGhlbiBpdCdzIGEgVFYgdHVuZXIgYW5kIG5vdCBhIHRlYTU3NjcgY2hpcC4gKi8KKwlpZiAoYnVmZmVyWzBdID09IGJ1ZmZlclsxXSAmJiBidWZmZXJbMF0gPT0gYnVmZmVyWzJdICYmCisJICAgIGJ1ZmZlclswXSA9PSBidWZmZXJbM10gJiYgYnVmZmVyWzBdID09IGJ1ZmZlcls0XSkgeworCQl0dW5lcl93YXJuKCJBbGwgYnl0ZXMgYXJlIGVxdWFsLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwkvKiAgU3RhdHVzIGJ5dGVzOgorCSAqICBCeXRlIDQ6IGJpdCAzOjEgOiBDSSAoQ2hpcCBJZGVudGlmaWNhdGlvbikgPT0gMAorCSAqICAgICAgICAgIGJpdCAwICAgOiBpbnRlcm5hbGx5IHNldCB0byAwCisJICogIEJ5dGUgNTogYml0IDc6MCA6ID09IDAKKwkgKi8KKwlpZiAoISgoYnVmZmVyWzNdICYgMHgwZikgPT0gMHgwMCkgJiYgKGJ1ZmZlcls0XSA9PSAweDAwKSkgeworCQl0dW5lcl93YXJuKCJDaGlwIElEIGlzIG5vdCB6ZXJvLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwl0dW5lcl93YXJuKCJURUE1NzY3IGRldGVjdGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZWE1NzY3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKHRlYTU3NjdfYXV0b2RldGVjdGlvbihjKSA9PSBFSU5WQUwpCisJCXJldHVybiBFSU5WQUw7CisKKwl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLCB0LT50eXBlLCAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKKwlzdHJsY3B5KGMtPm5hbWUsICJ0ZWE1NzY3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKKworCXQtPnR2X2ZyZXEgPSBzZXRfdHZfZnJlcTsKKwl0LT5yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CisJdC0+aGFzX3NpZ25hbCA9IHRlYTU3Njdfc2lnbmFsOworCXQtPmlzX3N0ZXJlbyA9IHRlYTU3Njdfc3RlcmVvOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKaW5kZXggNTE3NDhjNi4uN2Q4MjVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJc3dpdGNoIChjbWQpIAogCXsKLQkJY2FzZSBUVU5FUl9TRVRfVFZGUkVROgorCQljYXNlIFZJRElPQ1NGUkVROgogCQkJc2V0X3R2X2ZyZXEoY2xpZW50LCAqaWFyZyk7CiAJCQlicmVhazsKIAkgICAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IGVhYWJmYzguLmIyNWE5YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogdHVuZXItY29yZS5jLHYgMS4xNSAyMDA1LzA2LzEyIDAxOjM2OjE0IG1jaGVoYWIgRXhwICQKKyAqICRJZDogdHVuZXItY29yZS5jLHYgMS41OCAyMDA1LzA3LzE0IDAzOjA2OjQzIG1jaGVoYWIgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb3JlIGNvcmUsIGkuZS4ga2VybmVsIGludGVyZmFjZXMsIHJlZ2lzdGVyaW5nIGFuZCBzbyBvbgpAQCAtMjMsNDUgKzIzLDM5IEBACiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KIAotLyoKLSAqIGNvbW1lbnQgbGluZSBiZWxsb3cgdG8gcmV0dXJuIHRvIG9sZCBiZWhhdm9yLCB3aGVyZSBvbmx5IG9uZSBJMkMgZGV2aWNlIGlzIHN1cHBvcnRlZAotICovCi0jZGVmaW5lIENPTkZJR19UVU5FUl9NVUxUSV9JMkMgLyoqLwotCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKIC8qIHN0YW5kYXJkIGkyYyBpbnNtb2Qgb3B0aW9ucyAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDRiLCAvKiB0ZGE4MjkwICovCisJMHg0YiwJCQkvKiB0ZGE4MjkwICovCiAJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKIAkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLAogCUkyQ19DTElFTlRfRU5ECiB9OworCiBJMkNfQ0xJRU5UX0lOU01PRDsKIAogLyogaW5zbW9kIG9wdGlvbnMgdXNlZCBhdCBpbml0IHRpbWUgPT4gcmVhZC9vbmx5ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGFkZHIgID0gIDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGFkZHIgPSAwOwogbW9kdWxlX3BhcmFtKGFkZHIsIGludCwgMDQ0NCk7CiAKLS8qIGluc21vZCBvcHRpb25zIHVzZWQgYXQgcnVudGltZSA9PiByZWFkL3dyaXRlICovCi11bnNpZ25lZCBpbnQgdHVuZXJfZGVidWcgICA9IDA7Ci1tb2R1bGVfcGFyYW0odHVuZXJfZGVidWcsICAgICAgIGludCwgMDY0NCk7CitzdGF0aWMgdW5zaWduZWQgaW50IG5vX2F1dG9kZXRlY3QgPSAwOworbW9kdWxlX3BhcmFtKG5vX2F1dG9kZXRlY3QsIGludCwgMDQ0NCk7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHZfcmFuZ2VbMl0gICAgPSB7IDQ0LCA5NTggfTsKKy8qIGluc21vZCBvcHRpb25zIHVzZWQgYXQgcnVudGltZSA9PiByZWFkL3dyaXRlICovCit1bnNpZ25lZCBpbnQgdHVuZXJfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKHR1bmVyX2RlYnVnLCBpbnQsIDA2NDQpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHR2X3JhbmdlWzJdID0geyA0NCwgOTU4IH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX3JhbmdlWzJdID0geyA2NSwgMTA4IH07CiAKLW1vZHVsZV9wYXJhbV9hcnJheSh0dl9yYW5nZSwgICAgaW50LCBOVUxMLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheSh0dl9yYW5nZSwgaW50LCBOVUxMLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheShyYWRpb19yYW5nZSwgaW50LCBOVUxMLCAwNjQ0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkZXZpY2UgZHJpdmVyIGZvciB2YXJpb3VzIFRWIGFuZCBUVitGTSByYWRpbyB0dW5lcnMiKTsKIE1PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIsIEdlcmQgS25vcnIsIEd1bnRoZXIgTWF5ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCB0aGlzX2FkYXA7Ci0jaWZkZWYgQ09ORklHX1RVTkVSX01VTFRJX0kyQwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGZpcnN0X3R1bmVyLCB0dl90dW5lciwgcmFkaW9fdHVuZXI7Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CiAKQEAgLTczLDM1ICs2NywxOSBAQAogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAogCWlmICh0LT50eXBlID09IFVOU0VUKSB7Ci0JCXR1bmVyX2luZm8oInR1bmVyIHR5cGUgbm90IHNldFxuIik7CisJCXR1bmVyX3dhcm4gKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChOVUxMID09IHQtPnR2X2ZyZXEpIHsKLQkJdHVuZXJfaW5mbygiSHVoPyB0dl9zZXQgaXMgTlVMTD9cbiIpOworCQl0dW5lcl93YXJuICgiVHVuZXIgaGFzIG5vIHdheSB0byBzZXQgdHYgZnJlcVxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGZyZXEgPCB0dl9yYW5nZVswXSoxNiB8fCBmcmVxID4gdHZfcmFuZ2VbMV0qMTYpIHsKLQotCQlpZiAoZnJlcSA+PSB0dl9yYW5nZVswXSoxNjM2NCAmJiBmcmVxIDw9IHR2X3JhbmdlWzFdKjE2Mzg0KSB7Ci0JCQkvKiBWNEwyX1RVTkVSX0NBUF9MT1cgZnJlcXVlbmN5ICovCi0KLQkJCXR1bmVyX2RiZygiVjRMMl9UVU5FUl9DQVBfTE9XIGZyZXEgc2VsZWN0ZWQgZm9yIFRWLiBUdW5lcnMgeWV0IGRvZXNuJ3Qgc3VwcG9ydCBjb252ZXJ0aW5nIGl0IHRvIHZhbGlkIGZyZXEuXG4iKTsKLQotCQkJdC0+dHZfZnJlcShjLGZyZXE+PjEwKTsKLQotCQkJcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0JCQkvKiBGSVhNRTogYmV0dGVyIGRvIHRoYXQgY2hpcC1zcGVjaWZpYywgYnV0Ci0JCQkgICByaWdodCBub3cgd2UgZG9uJ3QgaGF2ZSB0aGF0IGluIHRoZSBjb25maWcKLQkJCSAgIHN0cnVjdCBhbmQgdGhpcyB3YXkgaXMgc3RpbGwgYmV0dGVyIHRoYW4gbm8KLQkJCSAgIGNoZWNrIGF0IGFsbCAqLwotCQkJdHVuZXJfaW5mbygiVFYgZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCi0JCQkJICAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNix0dl9yYW5nZVswXSx0dl9yYW5nZVsxXSk7Ci0JCQlyZXR1cm47Ci0JCX0KKwlpZiAoZnJlcSA8IHR2X3JhbmdlWzBdICogMTYgfHwgZnJlcSA+IHR2X3JhbmdlWzFdICogMTYpIHsKKwkJdHVuZXJfZGJnICgiVFYgZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCisJCQkgICBmcmVxIC8gMTYsIGZyZXEgJSAxNiAqIDEwMCAvIDE2LCB0dl9yYW5nZVswXSwKKwkJCSAgIHR2X3JhbmdlWzFdKTsKIAl9Ci0JdHVuZXJfZGJnKCI2Mi41IEtoeiBmcmVxIHN0ZXAgc2VsZWN0ZWQgZm9yIFRWLlxuIik7Ci0JdC0+dHZfZnJlcShjLGZyZXEpOworCXQtPnR2X2ZyZXEoYywgZnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKQEAgLTEwOSwzOCArODcsMjEgQEAKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKIAlpZiAodC0+dHlwZSA9PSBVTlNFVCkgewotCQl0dW5lcl9pbmZvKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOworCQl0dW5lcl93YXJuICgidHVuZXIgdHlwZSBub3Qgc2V0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoTlVMTCA9PSB0LT5yYWRpb19mcmVxKSB7Ci0JCXR1bmVyX2luZm8oIm5vIHJhZGlvIHR1bmluZyBmb3IgdGhpcyBvbmUsIHNvcnJ5LlxuIik7CisJCXR1bmVyX3dhcm4gKCJ0dW5lciBoYXMgbm8gd2F5IHRvIHNldCByYWRpbyBmcmVxdWVuY3lcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChmcmVxIDwgcmFkaW9fcmFuZ2VbMF0qMTYgfHwgZnJlcSA+IHJhZGlvX3JhbmdlWzFdKjE2KSB7Ci0JCWlmIChmcmVxID49IHR2X3JhbmdlWzBdKjE2MzY0ICYmIGZyZXEgPD0gdHZfcmFuZ2VbMV0qMTYzODQpIHsKLQkJCS8qIFY0TDJfVFVORVJfQ0FQX0xPVyBmcmVxdWVuY3kgKi8KLQkJCWlmICh0LT50eXBlID09IFRVTkVSX1RFQTU3NjcpIHsKLQkJCQl0dW5lcl9pbmZvKCJyYWRpbyBmcmVxIHN0ZXAgNjIuNUh6ICglZC4lMDZkKVxuIiwoZnJlcT4+MTQpLGZyZXElKDE8PDE0KSoxMDAwMCk7Ci0JCQkJdC0+cmFkaW9fZnJlcShjLGZyZXE+PjEwKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXR1bmVyX2RiZygiVjRMMl9UVU5FUl9DQVBfTE9XIGZyZXEgc2VsZWN0ZWQgZm9yIFJhZGlvLiBUdW5lcnMgeWV0IGRvZXNuJ3Qgc3VwcG9ydCBjb252ZXJ0aW5nIGl0IHRvIHZhbGlkIGZyZXEuXG4iKTsKLQotCQkJdHVuZXJfaW5mbygicmFkaW8gZnJlcSAoJWQuJTA2ZClcbiIsKGZyZXE+PjE0KSxmcmVxJSgxPDwxNCkqMTAwMDApOwotCi0JCQl0LT5yYWRpb19mcmVxKGMsZnJlcT4+MTApOwotCQkJcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCXR1bmVyX2luZm8oInJhZGlvIGZyZXEgKCVkLiUwMmQpIG91dCBvZiByYW5nZSAoJWQtJWQpXG4iLAotCQkJICAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNiwKLQkJCQkgICByYWRpb19yYW5nZVswXSxyYWRpb19yYW5nZVsxXSk7Ci0JCQlyZXR1cm47Ci0JCX0KKwlpZiAoZnJlcSA8PSByYWRpb19yYW5nZVswXSAqIDE2MDAwIHx8IGZyZXEgPj0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMCkgeworCQl0dW5lcl9kYmcgKCJyYWRpbyBmcmVxICglZC4lMDJkKSBvdXQgb2YgcmFuZ2UgKCVkLSVkKVxuIiwKKwkJCSAgIGZyZXEgLyAxNjAwMCwgZnJlcSAlIDE2MDAwICogMTAwIC8gMTYwMDAsCisJCQkgICByYWRpb19yYW5nZVswXSwgcmFkaW9fcmFuZ2VbMV0pOwogCX0KLQl0dW5lcl9kYmcoIjYyLjUgS2h6IGZyZXEgc3RlcCBzZWxlY3RlZCBmb3IgUmFkaW8uXG4iKTsKLQl0LT5yYWRpb19mcmVxKGMsZnJlcSk7CisKKwl0LT5yYWRpb19mcmVxKGMsIGZyZXEpOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGxvbmcgZnJlcSkKQEAgLTE1MCw0MiArMTExLDQ1IEBACiAJc3dpdGNoICh0LT5tb2RlKSB7CiAJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgogCQl0dW5lcl9kYmcoInJhZGlvIGZyZXEgc2V0IHRvICVsdS4lMDJsdVxuIiwKLQkJCSAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNik7Ci0JCXNldF9yYWRpb19mcmVxKGMsZnJlcSk7CisJCQkgIGZyZXEgLyAxNjAwMCwgZnJlcSAlIDE2MDAwICogMTAwIC8gMTYwMDApOworCQlzZXRfcmFkaW9fZnJlcShjLCBmcmVxKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKIAljYXNlIFY0TDJfVFVORVJfRElHSVRBTF9UVjoKIAkJdHVuZXJfZGJnKCJ0diBmcmVxIHNldCB0byAlbHUuJTAybHVcbiIsCi0JCQkgIGZyZXEvMTYsZnJlcSUxNioxMDAvMTYpOworCQkJICBmcmVxIC8gMTYsIGZyZXEgJSAxNiAqIDEwMCAvIDE2KTsKIAkJc2V0X3R2X2ZyZXEoYywgZnJlcSk7CiAJCWJyZWFrOwogCX0KIAl0LT5mcmVxID0gZnJlcTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCB0eXBlKQorc3RhdGljIHZvaWQgc2V0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCB0eXBlLAorCQkgICAgIHVuc2lnbmVkIGludCBuZXdfbW9kZV9tYXNrKQogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0XTsKIAotCXR1bmVyX2RiZyAoIkkyQyBhZGRyIDB4JTAyeCB3aXRoIHR5cGUgJWRcbiIsYy0+YWRkcjw8MSx0eXBlKTsKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAodHlwZSA9PSBVTlNFVCB8fCB0eXBlID09IFRVTkVSX0FCU0VOVCkKLQkJcmV0dXJuOwotCWlmICh0eXBlID49IHR1bmVyX2NvdW50KQotCQlyZXR1cm47Ci0KLQlpZiAoTlVMTCA9PSB0LT5pMmMuZGV2LmRyaXZlcikgewotCQkvKiBub3QgcmVnaXN0ZXJlZCB5ZXQgKi8KLQkJdC0+dHlwZSA9IHR5cGU7CisJaWYgKHR5cGUgPT0gVU5TRVQgfHwgdHlwZSA9PSBUVU5FUl9BQlNFTlQpIHsKKwkJdHVuZXJfZGJnICgidHVuZXIgMHglMDJ4OiBUdW5lciB0eXBlIGFic2VudFxuIixjLT5hZGRyKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodC0+aW5pdGlhbGl6ZWQpCi0JCS8qIHJ1biBvbmx5IG9uY2UgKi8KLQkJcmV0dXJuOwogCi0JdC0+aW5pdGlhbGl6ZWQgPSAxOworCWlmICh0eXBlID49IHR1bmVyX2NvdW50KSB7CisJCXR1bmVyX3dhcm4gKCJ0dW5lciAweCUwMng6IFR1bmVyIGNvdW50IGdyZWF0ZXIgdGhhbiAlZFxuIixjLT5hZGRyLHR1bmVyX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgY29kZSBkZXRlY3RzIGNhbGxzIGJ5IGNhcmQgYXR0YWNoX2luZm9ybSAqLworCWlmIChOVUxMID09IHQtPmkyYy5kZXYuZHJpdmVyKSB7CisJCXR1bmVyX2RiZyAoInR1bmVyIDB4JTAyeDogY2FsbGVkIGR1cmluZyBpMmNfY2xpZW50IHJlZ2lzdGVyIGJ5IGFkYXB0ZXIncyBhdHRhY2hfaW5mb3JtXG4iLCBjLT5hZGRyKTsKKworCQl0LT50eXBlPXR5cGU7CisJCXJldHVybjsKKwl9CiAKIAl0LT50eXBlID0gdHlwZTsKKwogCXN3aXRjaCAodC0+dHlwZSkgewogCWNhc2UgVFVORVJfTVQyMDMyOgogCQltaWNyb3R1bmVfaW5pdChjKTsKQEAgLTE5MywxMjcgKzE1NywxOTcgQEAKIAljYXNlIFRVTkVSX1BISUxJUFNfVERBODI5MDoKIAkJdGRhODI5MF9pbml0KGMpOwogCQlicmVhazsKKwljYXNlIFRVTkVSX1RFQTU3Njc6CisJCWlmICh0ZWE1NzY3X3R1bmVyX2luaXQoYykgPT0gRUlOVkFMKSB7CisJCQl0LT50eXBlID0gVFVORVJfQUJTRU5UOworCQkJdC0+bW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOworCQkJcmV0dXJuOworCQl9CisJCXQtPm1vZGVfbWFzayA9IFRfUkFESU87CisJCWJyZWFrOworCWNhc2UgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszOgorCQlidWZmZXJbMF0gPSAweDBiOworCQlidWZmZXJbMV0gPSAweGRjOworCQlidWZmZXJbMl0gPSAweDljOworCQlidWZmZXJbM10gPSAweDYwOworCQlpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA0KTsKKwkJbWRlbGF5KDEpOworCQlidWZmZXJbMl0gPSAweDg2OworCQlidWZmZXJbM10gPSAweDU0OworCQlpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA0KTsKKwkJZGVmYXVsdF90dW5lcl9pbml0KGMpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CiAJCWJyZWFrOwogCX0KKworCWlmICh0LT5tb2RlX21hc2sgPT0gVF9VTklOSVRJQUxJWkVEKQorCQl0LT5tb2RlX21hc2sgPSBuZXdfbW9kZV9tYXNrOworCisJc2V0X2ZyZXEoYywgdC0+ZnJlcSk7CisJdHVuZXJfZGJnKCIlcyAlcyBJMkMgYWRkciAweCUwMnggd2l0aCB0eXBlICVkIHVzZWQgZm9yIDB4JTAyeFxuIiwKKwkJICBjLT5hZGFwdGVyLT5uYW1lLCBjLT5kcml2ZXItPm5hbWUsIGMtPmFkZHIgPDwgMSwgdHlwZSwKKwkJICB0LT5tb2RlX21hc2spOwogfQogCi0jaWZkZWYgQ09ORklHX1RVTkVSX01VTFRJX0kyQwotI2RlZmluZSBDSEVDS19BRERSKHRwLGNtZCx0dW4pCWlmIChjbGllbnQtPmFkZHIhPXRwKSB7IFwKLQkJCSAgcmV0dXJuIDA7IH0gZWxzZSBcCi0JCQkgIHR1bmVyX2luZm8gKCJDbWQgJXMgYWNjZXB0ZWQgdG8gInR1biJcbiIsY21kKTsKLSNkZWZpbmUgQ0hFQ0tfTU9ERShjbWQpCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsgXAotCQkgCUNIRUNLX0FERFIocmFkaW9fdHVuZXIsY21kLCJyYWRpbyIpIH0gZWxzZSBcCi0JCQl7IENIRUNLX0FERFIodHZfdHVuZXIsY21kLCJUViIpOyB9Ci0jZWxzZQotI2RlZmluZSBDSEVDS19BRERSKHRwLGNtZCx0dW4pIHR1bmVyX2luZm8gKCJDbWQgJXMgYWNjZXB0ZWQgdG8gInR1biJcbiIsY21kKTsKLSNkZWZpbmUgQ0hFQ0tfTU9ERShjbWQpIHR1bmVyX2luZm8gKCJDbWQgJXMgYWNjZXB0ZWRcbiIsY21kKTsKLSNlbmRpZgorLyoKKyAqIFRoaXMgZnVuY3Rpb24gYXBwbHkgdHVuZXIgY29uZmlnIHRvIHR1bmVyIHNwZWNpZmllZAorICogYnkgdHVuX3NldHVwIHN0cnVjdHVyZS4gSSBhZGRyIGlzIHVuc2V0LCB0aGVuIGFkbWluIHN0YXR1cworICogYW5kIHR1biBhZGRyIHN0YXR1cyBpcyBtb3JlIHByZWNpc2UgdGhlbiBjdXJyZW50IHN0YXR1cywKKyAqIGl0J3MgYXBwbGllZC4gT3RoZXJ3aXNlIHN0YXR1cyBhbmQgdHlwZSBhcmUgYXBwbGllZCBvbmx5IHRvCisgKiB0dW5lciB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgYWRkci4KKyovCiAKLSNpZmRlZiBDT05GSUdfVFVORVJfTVVMVElfSTJDCi0KLXN0YXRpYyB2b2lkIHNldF9hZGRyKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdHVuZXJfYWRkciAqdHVuX2FkZHIpCitzdGF0aWMgdm9pZCBzZXRfYWRkcihzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHR1bmVyX3NldHVwICp0dW5fc2V0dXApCiB7Ci0JLyogQUREUl9VTlNFVCBkZWZhdWx0cyB0byBmaXJzdCBhdmFpbGFibGUgdHVuZXIgKi8KLQlpZiAoIHR1bl9hZGRyLT5hZGRyID09IEFERFJfVU5TRVQgKSB7Ci0JCWlmIChmaXJzdF90dW5lciAhPSBjLT5hZGRyKQotCQkJcmV0dXJuOwotCQlzd2l0Y2ggKHR1bl9hZGRyLT52NGwyX3R1bmVyKSB7Ci0JCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKLQkgCQlyYWRpb190dW5lcj1jLT5hZGRyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0dl90dW5lcj1jLT5hZGRyOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBTZXRzIHR1bmVyIHRvIGl0cyBjb25maWd1cmVkIHZhbHVlICovCi0JCXN3aXRjaCAodHVuX2FkZHItPnY0bDJfdHVuZXIpIHsKLQkJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgotIAkJCXJhZGlvX3R1bmVyPXR1bl9hZGRyLT5hZGRyOwotCQkJaWYgKCB0dW5fYWRkci0+YWRkciA9PSBjLT5hZGRyICkgc2V0X3R5cGUoYyx0dW5fYWRkci0+dHlwZSk7Ci0JCQlyZXR1cm47Ci0JCWRlZmF1bHQ6Ci0JCQl0dl90dW5lcj10dW5fYWRkci0+YWRkcjsKLQkJCWlmICggdHVuX2FkZHItPmFkZHIgPT0gYy0+YWRkciApIHNldF90eXBlKGMsdHVuX2FkZHItPnR5cGUpOwotCQkJcmV0dXJuOwotCQl9CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKHR1bl9zZXR1cC0+YWRkciA9PSBBRERSX1VOU0VUKSB7CisJCWlmICh0LT5tb2RlX21hc2sgJiB0dW5fc2V0dXAtPm1vZGVfbWFzaykKKwkJCXNldF90eXBlKGMsIHR1bl9zZXR1cC0+dHlwZSwgdHVuX3NldHVwLT5tb2RlX21hc2spOworCX0gZWxzZSBpZiAodHVuX3NldHVwLT5hZGRyID09IGMtPmFkZHIpIHsKKwkJc2V0X3R5cGUoYywgdHVuX3NldHVwLT50eXBlLCB0dW5fc2V0dXAtPm1vZGVfbWFzayk7CiAJfQotCXNldF90eXBlKGMsdHVuX2FkZHItPnR5cGUpOwogfQotI2Vsc2UKLSNkZWZpbmUgc2V0X2FkZHIoYyx0dW5fYWRkcikgc2V0X3R5cGUoYywodHVuX2FkZHIpLT50eXBlKQotI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21vZGUoc3RydWN0IHR1bmVyICp0LCBjaGFyICpjbWQpCit7CisJaWYgKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgeworCQlzd2l0Y2ggKHQtPm1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgorCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIHJhZGlvXG4iLCBjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CisJCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgYW5hbG9nIFRWXG4iLCBjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgorCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIGRpZ2l0YWwgVFZcbiIsIGNtZCk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVJTlZBTDsKK30KIAogc3RhdGljIGNoYXIgcGFsW10gPSAiLSI7CiBtb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCBzaXplb2YocGFsKSwgMDY0NCk7CitzdGF0aWMgY2hhciBzZWNhbVtdID0gIi0iOworbW9kdWxlX3BhcmFtX3N0cmluZyhzZWNhbSwgc2VjYW0sIHNpemVvZihzZWNhbSksIDA2NDQpOwogCisvKiBnZXQgbW9yZSBwcmVjaXNlIG5vcm0gaW5mbyBmcm9tIGluc21vZCBvcHRpb24gKi8KIHN0YXRpYyBpbnQgdHVuZXJfZml4dXBfc3RkKHN0cnVjdCB0dW5lciAqdCkKIHsKIAlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1BBTCkgPT0gVjRMMl9TVERfUEFMKSB7Ci0JCS8qIGdldCBtb3JlIHByZWNpc2Ugbm9ybSBpbmZvIGZyb20gaW5zbW9kIG9wdGlvbiAqLwogCQlzd2l0Y2ggKHBhbFswXSkgewogCQljYXNlICdiJzoKIAkJY2FzZSAnQic6CiAJCWNhc2UgJ2cnOgogCQljYXNlICdHJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHXG4iKTsKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1CR1xuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfQkc7CiAJCQlicmVhazsKIAkJY2FzZSAnaSc6CiAJCWNhc2UgJ0knOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfSTsKIAkJCWJyZWFrOwogCQljYXNlICdkJzoKIAkJY2FzZSAnRCc6CiAJCWNhc2UgJ2snOgogCQljYXNlICdLJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLURLXG4iKTsKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1ES1xuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfREs7CiAJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCWNhc2UgJ20nOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU1cbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX007CisJCQlicmVhazsKKwkJY2FzZSAnTic6CisJCWNhc2UgJ24nOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5cbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX047CisJCQlicmVhazsKIAkJfQogCX0KKwlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgeworCQlzd2l0Y2ggKHNlY2FtWzBdKSB7CisJCWNhc2UgJ2QnOgorCQljYXNlICdEJzoKKwkJY2FzZSAnayc6CisJCWNhc2UgJ0snOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1ES1xuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9ESzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJY2FzZSAnTCc6CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUxcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogc3RhdGljIHZhciBVc2VkIG9ubHkgaW4gdHVuZXJfYXR0YWNoIGFuZCB0dW5lcl9wcm9iZSAqLworc3RhdGljIHVuc2lnbmVkIGRlZmF1bHRfbW9kZV9tYXNrOworCisvKiBEdXJpbmcgY2xpZW50IGF0dGFjaCwgc2V0X3R5cGUgaXMgY2FsbGVkIGJ5IGFkYXB0ZXIncyBhdHRhY2hfaW5mb3JtIGNhbGxiYWNrLgorICAgc2V0X3R5cGUgbXVzdCB0aGVuIGJlIGNvbXBsZXRlZCBieSB0dW5lcl9hdHRhY2guCisgKi8KIHN0YXRpYyBpbnQgdHVuZXJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQogewogCXN0cnVjdCB0dW5lciAqdDsKIAotI2lmbmRlZiBDT05GSUdfVFVORVJfTVVMVElfSTJDCi0JaWYgKHRoaXNfYWRhcCA+IDApCi0JCXJldHVybiAtMTsKLSNlbHNlCi0JLyogYnkgZGVmYXVsdCwgZmlyc3QgSTJDIGNhcmQgaXMgYm90aCB0diBhbmQgcmFkaW8gdHVuZXIgKi8KLQlpZiAodGhpc19hZGFwID09IDApIHsKLQkJZmlyc3RfdHVuZXIgPSBhZGRyOwotCQl0dl90dW5lciA9IGFkZHI7Ci0JCXJhZGlvX3R1bmVyID0gYWRkcjsKLQl9Ci0jZW5kaWYKLQl0aGlzX2FkYXArKzsKKwljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CisJY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwogCi0gICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLSAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwotCi0gICAgICAgIHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHVuZXIpLEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoTlVMTCA9PSB0KQotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICBtZW1zZXQodCwwLHNpemVvZihzdHJ1Y3QgdHVuZXIpKTsKLSAgICAgICAgbWVtY3B5KCZ0LT5pMmMsJmNsaWVudF90ZW1wbGF0ZSxzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKwl0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR1bmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHQsIDAsIHNpemVvZihzdHJ1Y3QgdHVuZXIpKTsKKwltZW1jcHkoJnQtPmkyYywgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAJaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5pMmMsIHQpOwotCXQtPnR5cGUgICAgICAgPSBVTlNFVDsKLQl0LT5yYWRpb19pZjIgID0gMTA3MDAqMTAwMDsgLyogMTAuN01IeiAtIEZNIHJhZGlvICovCisJdC0+dHlwZSA9IFVOU0VUOworCXQtPnJhZGlvX2lmMiA9IDEwNzAwICogMTAwMDsJLyogMTAuN01IeiAtIEZNIHJhZGlvICovCisJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJdC0+bW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOwogCi0gICAgICAgIGkyY19hdHRhY2hfY2xpZW50KCZ0LT5pMmMpOwotCXR1bmVyX2luZm8oImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCi0JCSAgIGFkZHIgPDwgMSwgYWRhcC0+bmFtZSk7CiAKLQlzZXRfdHlwZSgmdC0+aTJjLCB0LT50eXBlKTsKKwl0dW5lcl9pbmZvKCJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyIDw8IDEsIGFkYXAtPm5hbWUpOworCisJLyogVEVBNTc2NyBhdXRvZGV0ZWN0aW9uIGNvZGUgLSBvbmx5IGZvciBhZGRyID0gMHhjMCAqLworCWlmICghbm9fYXV0b2RldGVjdCkgeworCQlpZiAoYWRkciA9PSAweDYwKSB7CisJCQlpZiAodGVhNTc2N19hdXRvZGV0ZWN0aW9uKCZ0LT5pMmMpICE9IEVJTlZBTCkgeworCQkJCXQtPnR5cGUgPSBUVU5FUl9URUE1NzY3OworCQkJCXQtPm1vZGVfbWFzayA9IFRfUkFESU87CisJCQkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKKwkJCQl0LT5mcmVxID0gODcuNSAqIDE2OyAvKiBTZXRzIGZyZXEgdG8gRk0gcmFuZ2UgKi8KKwkJCQlkZWZhdWx0X21vZGVfbWFzayAmPSB+VF9SQURJTzsKKworCQkJCWkyY19hdHRhY2hfY2xpZW50ICgmdC0+aTJjKTsKKwkJCQlzZXRfdHlwZSgmdC0+aTJjLHQtPnR5cGUsIHQtPm1vZGVfbWFzayk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplcyBvbmx5IHRoZSBmaXJzdCBhZGFwdGVyIGZvdW5kICovCisJaWYgKGRlZmF1bHRfbW9kZV9tYXNrICE9IFRfVU5JTklUSUFMSVpFRCkgeworCQl0dW5lcl9kYmcgKCJTZXR0aW5nIG1vZGVfbWFzayB0byAweCUwMnhcbiIsIGRlZmF1bHRfbW9kZV9tYXNrKTsKKwkJdC0+bW9kZV9tYXNrID0gZGVmYXVsdF9tb2RlX21hc2s7CisJCXQtPmZyZXEgPSA0MDAgKiAxNjsgLyogU2V0cyBmcmVxIHRvIFZIRiBIaWdoICovCisJCWRlZmF1bHRfbW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOworCX0KKworCS8qIFNob3VsZCBiZSBqdXN0IGJlZm9yZSByZXR1cm4gKi8KKwlpMmNfYXR0YWNoX2NsaWVudCAoJnQtPmkyYyk7CisJc2V0X3R5cGUgKCZ0LT5pMmMsdC0+dHlwZSwgdC0+bW9kZV9tYXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIzLDEzICszNTcsOCBAQAogCQlub3JtYWxfaTJjWzBdID0gYWRkcjsKIAkJbm9ybWFsX2kyY1sxXSA9IEkyQ19DTElFTlRfRU5EOwogCX0KLQl0aGlzX2FkYXAgPSAwOwogCi0jaWZkZWYgQ09ORklHX1RVTkVSX01VTFRJX0kyQwotCWZpcnN0X3R1bmVyID0gMDsKLQl0dl90dW5lciA9IDA7Ci0JcmFkaW9fdHVuZXIgPSAwOwotI2VuZGlmCisJZGVmYXVsdF9tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CiAKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHR1bmVyX2F0dGFjaCk7CkBAIC0zNDEsOSArMzcwLDEwIEBACiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWVycj1pMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKIAlpZiAoZXJyKSB7Ci0JCXR1bmVyX3dhcm4gKCJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXR1bmVyX3dhcm4KKwkJICAgICgiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzUxLDM3ICszODEsNjUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTV0lUQ0hfVjRMMglpZiAoIXQtPnVzaW5nX3Y0bDIgJiYgdHVuZXJfZGVidWcpIFwKLQkJICAgICAgICAgIHR1bmVyX2luZm8oInN3aXRjaGluZyB0byB2NGwyXG4iKTsgXAotCSAgICAgICAgICAgICAgICAgIHQtPnVzaW5nX3Y0bDIgPSAxOwotI2RlZmluZSBDSEVDS19WNEwyCWlmICh0LT51c2luZ192NGwyKSB7IGlmICh0dW5lcl9kZWJ1ZykgXAotCQkJICB0dW5lcl9pbmZvKCJpZ25vcmUgdjRsMSBjYWxsXG4iKTsgXAotCQkgICAgICAgICAgcmV0dXJuIDA7IH0KKy8qCisgKiBTd2l0Y2ggdHVuZXIgdG8gb3RoZXIgbW9kZS4gSWYgdHVuZXIgc3VwcG9ydCBib3RoIHR2IGFuZCByYWRpbywKKyAqIHNldCBhbm90aGVyIGZyZXF1ZW5jeSB0byBzb21lIHZhbHVlIChUaGlzIGlzIG5lZWRlZCBmb3Igc29tZSBwYWwKKyAqIHR1bmVycyB0byBhdm9pZCBsb2NraW5nKS4gT3RoZXJ3aXNlLCBqdXN0IHB1dCBzZWNvbmQgdHVuZXIgaW4KKyAqIHN0YW5kYnkgbW9kZS4KKyAqLwogCi1zdGF0aWMgaW50Ci10dW5lcl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9tb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB0dW5lciAqdCwgaW50IG1vZGUsIGNoYXIgKmNtZCkKK3sKKwlpZiAobW9kZSAhPSB0LT5tb2RlKSB7CisKKwkJdC0+bW9kZSA9IG1vZGU7CisJCWlmIChjaGVja19tb2RlKHQsIGNtZCkgPT0gRUlOVkFMKSB7CisJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gbW9kZSkgeworCQkJCXNldF90dl9mcmVxKGNsaWVudCwgNDAwICogMTYpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfcmFkaW9fZnJlcShjbGllbnQsIDg3LjUgKiAxNjAwMCk7CisJCQl9CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIHN3aXRjaF92NGwyKCkJaWYgKCF0LT51c2luZ192NGwyKSBcCisJCSAgICAgICAgICAgIHR1bmVyX2RiZygic3dpdGNoaW5nIHRvIHY0bDJcbiIpOyBcCisJICAgICAgICAgICAgICAgIHQtPnVzaW5nX3Y0bDIgPSAxOworCitzdGF0aWMgaW5saW5lIGludCBjaGVja192NGwyKHN0cnVjdCB0dW5lciAqdCkKK3sKKwlpZiAodC0+dXNpbmdfdjRsMikgeworCQl0dW5lcl9kYmcgKCJpZ25vcmUgdjRsMSBjYWxsXG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCAqaWFyZyA9IChpbnQqKWFyZzsKKwl1bnNpZ25lZCBpbnQgKmlhcmcgPSAoaW50ICopYXJnOwogCi0gICAgICAgIHN3aXRjaCAoY21kKSB7CisJc3dpdGNoIChjbWQpIHsKIAkvKiAtLS0gY29uZmlndXJhdGlvbiAtLS0gKi8KLQljYXNlIFRVTkVSX1NFVF9UWVBFOgotCQlzZXRfdHlwZShjbGllbnQsKmlhcmcpOwotCQlicmVhazsKIAljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6Ci0JCXNldF9hZGRyKGNsaWVudCwoc3RydWN0IHR1bmVyX2FkZHIgKilhcmcpOworCQl0dW5lcl9kYmcgKCJDYWxsaW5nIHNldF90eXBlX2FkZHIgZm9yIHR5cGU9JWQsIGFkZHI9MHglMDJ4LCBtb2RlPTB4JTAyeFxuIiwKKwkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPnR5cGUsCisJCQkJKChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpLT5hZGRyLAorCQkJCSgoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKS0+bW9kZV9tYXNrKTsKKworCQlzZXRfYWRkcihjbGllbnQsIChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpOwogCQlicmVhazsKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJQ0hFQ0tfQUREUih0dl90dW5lciwiQVVEQ19TRVRfUkFESU8iLCJUViIpOwotCi0JCWlmIChWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKLQkJCXNldF90dl9mcmVxKGNsaWVudCw0MDAgKiAxNik7Ci0JCX0KKwkJc2V0X21vZGUoY2xpZW50LHQsVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIik7CiAJCWJyZWFrOwogCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6Ci0JCUNIRUNLX0FERFIodHZfdHVuZXIsIkFVRENfQ09ORklHX1BJTk5BQ0xFIiwiVFYiKTsKKwkJaWYgKGNoZWNrX21vZGUodCwgIkFVRENfQ09ORklHX1BJTk5BQ0xFIikgPT0gRUlOVkFMKQorCQkJcmV0dXJuIDA7CiAJCXN3aXRjaCAoKmlhcmcpIHsKIAkJY2FzZSAyOgogCQkJdHVuZXJfZGJnKCJwaW5uYWNsZSBwYWxcbiIpOwpAQCAtMzkyLDE4OCArNDUwLDI0MSBAQAogCQkJdC0+cmFkaW9faWYyID0gNDEzMDAgKiAxMDAwOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgICAgICAgICBicmVhazsKLQorCQlicmVhazsKKwljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKKwkJYnJlYWs7CiAJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCiAJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCiAJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwogCWNhc2UgVklESU9DU0NIQU46Ci0JewotCQlzdGF0aWMgY29uc3QgdjRsMl9zdGRfaWQgbWFwW10gPSB7Ci0JCQlbIFZJREVPX01PREVfUEFMICAgXSA9IFY0TDJfU1REX1BBTCwKLQkJCVsgVklERU9fTU9ERV9OVFNDICBdID0gVjRMMl9TVERfTlRTQ19NLAotCQkJWyBWSURFT19NT0RFX1NFQ0FNIF0gPSBWNEwyX1NURF9TRUNBTSwKLQkJCVsgNCAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfUEFMX00sCi0JCQlbIDUgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX1BBTF9OLAotCQkJWyA2IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9OVFNDX01fSlAsCi0JCX07Ci0JCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKKwkJeworCQkJc3RhdGljIGNvbnN0IHY0bDJfc3RkX2lkIG1hcFtdID0geworCQkJCVtWSURFT19NT0RFX1BBTF0gPSBWNEwyX1NURF9QQUwsCisJCQkJW1ZJREVPX01PREVfTlRTQ10gPSBWNEwyX1NURF9OVFNDX00sCisJCQkJW1ZJREVPX01PREVfU0VDQU1dID0gVjRMMl9TVERfU0VDQU0sCisJCQkJWzQgLyogYnR0diAqLyBdID0gVjRMMl9TVERfUEFMX00sCisJCQkJWzUgLyogYnR0diAqLyBdID0gVjRMMl9TVERfUEFMX04sCisJCQkJWzYgLyogYnR0diAqLyBdID0gVjRMMl9TVERfTlRTQ19NX0pQLAorCQkJfTsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKIAotCQlDSEVDS19WNEwyOwotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCUNIRUNLX0FERFIodHZfdHVuZXIsIlZJRElPQ1NDSEFOIiwiVFYiKTsKKwkJCWlmIChjaGVja192NGwyKHQpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKIAotCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCi0JCQl0LT5zdGQgPSBtYXBbdmMtPm5vcm1dOwotCQl0dW5lcl9maXh1cF9zdGQodCk7Ci0JCWlmICh0LT5mcmVxKQotCQkJc2V0X3R2X2ZyZXEoY2xpZW50LHQtPmZyZXEpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NTRlJFUToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgKnYgPSBhcmc7CisJCQlpZiAoc2V0X21vZGUoY2xpZW50LHQsVjRMMl9UVU5FUl9BTkFMT0dfVFYsICJWSURJT0NTQ0hBTiIpPT1FSU5WQUwpCisJCQkJcmV0dXJuIDA7CiAKLQkJQ0hFQ0tfTU9ERSgiVklESU9DU0ZSRVEiKTsKLQkJQ0hFQ0tfVjRMMjsKLQkJc2V0X2ZyZXEoY2xpZW50LCp2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DR1RVTkVSOgotCXsKLQkJc3RydWN0IHZpZGVvX3R1bmVyICp2dCA9IGFyZzsKLQotCQlDSEVDS19BRERSKHJhZGlvX3R1bmVyLCJWSURJT0NHVFVORVIiLCJyYWRpbyIpOwotCQlDSEVDS19WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSB7Ci0JCQlpZiAodC0+aGFzX3NpZ25hbCkKLQkJCQl2dC0+c2lnbmFsID0gdC0+aGFzX3NpZ25hbChjbGllbnQpOwotCQkJaWYgKHQtPmlzX3N0ZXJlbykgewotCQkJCWlmICh0LT5pc19zdGVyZW8oY2xpZW50KSkKLQkJCQkJdnQtPiBmbGFncyB8PSBWSURFT19UVU5FUl9TVEVSRU9fT047Ci0JCQkJZWxzZQotCQkJCQl2dC0+IGZsYWdzICY9IDB4ZmZmZiBeIFZJREVPX1RVTkVSX1NURVJFT19PTjsKLQkJCX0KLQkJCXZ0LT5mbGFncyB8PSBWNEwyX1RVTkVSX0NBUF9MT1c7IC8qIEFsbG93IGZyZXFzIGF0IDYyLjUgSHogKi8KKwkJCWlmICh2Yy0+bm9ybSA8IEFSUkFZX1NJWkUobWFwKSkKKwkJCQl0LT5zdGQgPSBtYXBbdmMtPm5vcm1dOworCQkJdHVuZXJfZml4dXBfc3RkKHQpOworCQkJaWYgKHQtPmZyZXEpCisJCQkJc2V0X3R2X2ZyZXEoY2xpZW50LCB0LT5mcmVxKTsKKwkJCXJldHVybiAwOwogCQl9CisJY2FzZSBWSURJT0NTRlJFUToKKwkJeworCQkJdW5zaWduZWQgbG9uZyAqdiA9IGFyZzsKIAotCQlyZXR1cm4gMDsKLQl9CisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DU0ZSRVEiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoY2hlY2tfdjRsMih0KSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisKKwkJCXNldF9mcmVxKGNsaWVudCwgKnYpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0dUVU5FUjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2dCA9IGFyZzsKKworCQkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ0dUVU5FUiIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChjaGVja192NGwyKHQpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgeworCQkJCWlmICh0LT5oYXNfc2lnbmFsKQorCQkJCQl2dC0+c2lnbmFsID0gdC0+aGFzX3NpZ25hbChjbGllbnQpOworCQkJCWlmICh0LT5pc19zdGVyZW8pIHsKKwkJCQkJaWYgKHQtPmlzX3N0ZXJlbyhjbGllbnQpKQorCQkJCQkJdnQtPmZsYWdzIHw9CisJCQkJCQkgICAgVklERU9fVFVORVJfU1RFUkVPX09OOworCQkJCQllbHNlCisJCQkJCQl2dC0+ZmxhZ3MgJj0KKwkJCQkJCSAgICB+VklERU9fVFVORVJfU1RFUkVPX09OOworCQkJCX0KKwkJCQl2dC0+ZmxhZ3MgfD0gVklERU9fVFVORVJfTE9XOwkvKiBBbGxvdyBmcmVxcyBhdCA2Mi41IEh6ICovCisKKwkJCQl2dC0+cmFuZ2Vsb3cgPSByYWRpb19yYW5nZVswXSAqIDE2MDAwOworCQkJCXZ0LT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOworCisJCQl9IGVsc2UgeworCQkJCXZ0LT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7CisJCQkJdnQtPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBWSURJT0NHQVVESU86Ci0JewotCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnZhID0gYXJnOworCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnZhID0gYXJnOwogCi0JCUNIRUNLX0FERFIocmFkaW9fdHVuZXIsIlZJRElPQ0dBVURJTyIsInJhZGlvIik7Ci0JCUNIRUNLX1Y0TDI7Ci0JCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUgICYmICB0LT5pc19zdGVyZW8pCi0JCQl2YS0+bW9kZSA9IHQtPmlzX3N0ZXJlbyhjbGllbnQpCi0JCQkJPyBWSURFT19TT1VORF9TVEVSRU8KLQkJCQk6IFZJREVPX1NPVU5EX01PTk87Ci0JCXJldHVybiAwOwotCX0KKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NHQVVESU8iKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoY2hlY2tfdjRsMih0KSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUgJiYgdC0+aXNfc3RlcmVvKQorCQkJCXZhLT5tb2RlID0gdC0+aXNfc3RlcmVvKGNsaWVudCkKKwkJCQkgICAgPyBWSURFT19TT1VORF9TVEVSRU8gOiBWSURFT19TT1VORF9NT05POworCQkJcmV0dXJuIDA7CisJCX0KIAogCWNhc2UgVklESU9DX1NfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQl7CisJCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CiAKLQkJU1dJVENIX1Y0TDI7Ci0JCXQtPm1vZGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQkJQ0hFQ0tfQUREUih0dl90dW5lciwiVklESU9DX1NfU1REIiwiVFYiKTsKKwkJCWlmIChzZXRfbW9kZSAoY2xpZW50LCB0LCBWNEwyX1RVTkVSX0FOQUxPR19UViwgIlZJRElPQ19TX1NURCIpCisJCQkJCT09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKIAotCQl0LT5zdGQgPSAqaWQ7Ci0JCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKLQkJaWYgKHQtPmZyZXEpCi0JCQlzZXRfZnJlcShjbGllbnQsdC0+ZnJlcSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKwkJCXN3aXRjaF92NGwyKCk7CiAKLQkJQ0hFQ0tfTU9ERSgiVklESU9DX1NfRlJFUVVFTkNZIik7Ci0JCVNXSVRDSF9WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSBmLT50eXBlICYmCi0JCSAgICBWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpCi0JCQlzZXRfdHZfZnJlcShjbGllbnQsNDAwKjE2KTsKLQkJdC0+bW9kZSAgPSBmLT50eXBlOwotCQlzZXRfZnJlcShjbGllbnQsZi0+ZnJlcXVlbmN5KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCXsKLQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCUNIRUNLX01PREUoIlZJRElPQ19HX0ZSRVFVRU5DWSIpOwotCQlTV0lUQ0hfVjRMMjsKLQkJZi0+dHlwZSA9IHQtPm1vZGU7Ci0JCWYtPmZyZXF1ZW5jeSA9IHQtPmZyZXE7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19HX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOwotCi0JCUNIRUNLX01PREUoIlZJRElPQ19HX1RVTkVSIik7Ci0JCVNXSVRDSF9WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSB7Ci0JCQlpZiAodC0+aGFzX3NpZ25hbCkKLQkJCQl0dW5lciAtPiBzaWduYWwgPSB0LT5oYXNfc2lnbmFsKGNsaWVudCk7Ci0JCQlpZiAodC0+aXNfc3RlcmVvKSB7Ci0JCQkJaWYgKHQtPmlzX3N0ZXJlbyhjbGllbnQpKSB7Ci0JCQkJCXR1bmVyIC0+IGNhcGFiaWxpdHkgfD0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPOwotCQkJCQl0dW5lciAtPiByeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCQl9IGVsc2UgewotCQkJCQl0dW5lciAtPiByeHN1YmNoYW5zICY9IDB4ZmZmZiBeIFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCQl9Ci0JCQl9CisJCQl0LT5zdGQgPSAqaWQ7CisJCQl0dW5lcl9maXh1cF9zdGQodCk7CisJCQlpZiAodC0+ZnJlcSkKKwkJCQlzZXRfZnJlcShjbGllbnQsIHQtPmZyZXEpOworCQkJYnJlYWs7CiAJCX0KLQkJLyogV293IHRvIGRlYWwgd2l0aCBWNEwyX1RVTkVSX0NBUF9MT1cgPyBGb3Igbm93LCBpdCBhY2NlcHRzIGZyb20gbG93IGF0IDYyLjVLSHogc3RlcCAgdG8gaGlnaCBhdCA2Mi41IEh6ICovCi0JCXR1bmVyLT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7Ci0vLwkJdHVuZXItPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7Ci0vLwkJdHVuZXItPnJhbmdlbG93ID0gdHZfcmFuZ2VbMF0gKiAxNjM4NDsKLQkJdHVuZXItPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTYzODQ7Ci0JCWJyZWFrOwotCX0KKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOworCisJCQl0LT5mcmVxID0gZi0+ZnJlcXVlbmN5OworCQkJc3dpdGNoX3Y0bDIoKTsKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IGYtPnR5cGUgJiYKKwkJCSAgICBWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKKwkJCSAgICAgICAgaWYgKHNldF9tb2RlIChjbGllbnQsIHQsIGYtPnR5cGUsICJWSURJT0NfU19GUkVRVUVOQ1kiKQorCQkJCQkgICAgPT0gRUlOVkFMKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNldF9mcmVxKGNsaWVudCx0LT5mcmVxKTsKKworCQkJYnJlYWs7CisJCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOworCisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX0dfRlJFUVVFTkNZIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJc3dpdGNoX3Y0bDIoKTsKKwkJCWYtPnR5cGUgPSB0LT5tb2RlOworCQkJZi0+ZnJlcXVlbmN5ID0gdC0+ZnJlcTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJeworCQkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOworCisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX0dfVFVORVIiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlzd2l0Y2hfdjRsMigpOworCisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSB7CisKKwkJCQlpZiAodC0+aGFzX3NpZ25hbCkKKwkJCQkJdHVuZXItPnNpZ25hbCA9IHQtPmhhc19zaWduYWwoY2xpZW50KTsKKworCQkJCWlmICh0LT5pc19zdGVyZW8pIHsKKwkJCQkJaWYgKHQtPmlzX3N0ZXJlbyhjbGllbnQpKSB7CisJCQkJCQl0dW5lci0+cnhzdWJjaGFucyA9CisJCQkJCQkgICAgVjRMMl9UVU5FUl9TVUJfU1RFUkVPIHwKKwkJCQkJCSAgICBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJCQl9IGVsc2UgeworCQkJCQkJdHVuZXItPnJ4c3ViY2hhbnMgPQorCQkJCQkJICAgIFY0TDJfVFVORVJfU1VCX01PTk87CisJCQkJCX0KKwkJCQl9CisKKwkJCQl0dW5lci0+Y2FwYWJpbGl0eSB8PQorCQkJCSAgICBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9TVEVSRU87CisKKwkJCQl0dW5lci0+YXVkbW9kZSA9IHQtPmF1ZG1vZGU7CisKKwkJCQl0dW5lci0+cmFuZ2Vsb3cgPSByYWRpb19yYW5nZVswXSAqIDE2MDAwOworCQkJCXR1bmVyLT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOworCQkJfSBlbHNlIHsKKwkJCQl0dW5lci0+cmFuZ2Vsb3cgPSB0dl9yYW5nZVswXSAqIDE2OworCQkJCXR1bmVyLT5yYW5nZWhpZ2ggPSB0dl9yYW5nZVsxXSAqIDE2OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIgPSBhcmc7CisKKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NfU19UVU5FUiIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKworCQkJc3dpdGNoX3Y0bDIoKTsKKworCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgeworCQkJCXQtPmF1ZG1vZGUgPSB0dW5lci0+YXVkbW9kZTsKKwkJCQlzZXRfcmFkaW9fZnJlcShjbGllbnQsIHQtPmZyZXEpOworCQkJfQorCQkJYnJlYWs7CisJCX0KIAlkZWZhdWx0OgotCQl0dW5lcl9kYmcgKCJVbmltcGxlbWVudGVkIElPQ1RMIDB4JTA4eCBjYWxsZWQgdG8gdHVuZXIuXG4iLCBjbWQpOwotCQkvKiBub3RoaW5nICovCisJCXR1bmVyX2RiZygiVW5pbXBsZW1lbnRlZCBJT0NUTCAweCUwOHgoZGlyPSVkLHRwPTB4JTAyeCxucj0lZCxzej0lZClcbiIsCisJCQkJCSBjbWQsIF9JT0NfRElSKGNtZCksIF9JT0NfVFlQRShjbWQpLAorCQkJCQlfSU9DX05SKGNtZCksIF9JT0NfU0laRShjbWQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHVuZXJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgdHVuZXJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mIChkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YSAoYyk7CiAKLQl0dW5lcl9kYmcoInN1c3BlbmRcbiIpOworCXR1bmVyX2RiZyAoInN1c3BlbmRcbiIpOwogCS8qIEZJWE1FOiBwb3dlciBkb3duID8/PyAqLwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR1bmVyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHR1bmVyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwotCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZiAoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEgKGMpOwogCi0JdHVuZXJfZGJnKCJyZXN1bWVcbiIpOworCXR1bmVyX2RiZyAoInJlc3VtZVxuIik7CiAJaWYgKHQtPmZyZXEpCi0JCXNldF9mcmVxKGMsdC0+ZnJlcSk7CisJCXNldF9mcmVxKGMsIHQtPmZyZXEpOwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewotCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotICAgICAgICAubmFtZSAgICAgICAgICAgPSAidHVuZXIiLAotICAgICAgICAuaWQgICAgICAgICAgICAgPSBJMkNfRFJJVkVSSURfVFVORVIsCi0gICAgICAgIC5mbGFncyAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCi0gICAgICAgIC5hdHRhY2hfYWRhcHRlciA9IHR1bmVyX3Byb2JlLAotICAgICAgICAuZGV0YWNoX2NsaWVudCAgPSB0dW5lcl9kZXRhY2gsCi0gICAgICAgIC5jb21tYW5kICAgICAgICA9IHR1bmVyX2NvbW1hbmQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAidHVuZXIiLAorCS5pZCA9IEkyQ19EUklWRVJJRF9UVU5FUiwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHR1bmVyX3Byb2JlLAorCS5kZXRhY2hfY2xpZW50ID0gdHVuZXJfZGV0YWNoLAorCS5jb21tYW5kID0gdHVuZXJfY29tbWFuZCwKIAkuZHJpdmVyID0gewotCQkuc3VzcGVuZCA9IHR1bmVyX3N1c3BlbmQsCi0JCS5yZXN1bWUgID0gdHVuZXJfcmVzdW1lLAotCX0sCisJCSAgIC5zdXNwZW5kID0gdHVuZXJfc3VzcGVuZCwKKwkJICAgLnJlc3VtZSA9IHR1bmVyX3Jlc3VtZSwKKwkJICAgfSwKIH07Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KLXsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CiAJSTJDX0RFVk5BTUUoIih0dW5lciB1bnNldCkiKSwKLQkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAotICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCisJLmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCisJLmRyaXZlciA9ICZkcml2ZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB0dW5lcl9pbml0X21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKaW5kZXggNTM5ZjMwNS4uYTNmOGU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogdHVuZXItc2ltcGxlLmMsdiAxLjIxIDIwMDUvMDYvMTAgMTk6NTM6MjYgbnNoIEV4cCAkCisgKiAkSWQ6IHR1bmVyLXNpbXBsZS5jLHYgMS4zOSAyMDA1LzA3LzA3IDAxOjQ5OjMwIG1rcnVma3kgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb250cm9scyBhbGwgdGhvc2Ugc2ltcGxlIDQtY29udHJvbC1ieXRlcyBzdHlsZSB0dW5lcnMuCkBAIC01NCw2ICs1NCwyNyBAQAogI2RlZmluZSBQSElMSVBTX01GX1NFVF9QQUxfTAkweDAzIC8vIEZyYW5jZQogI2RlZmluZSBQSElMSVBTX01GX1NFVF9QQUxfTDIJMHgwMiAvLyBMJwogCisvKiBDb250cm9sIGJ5dGUgKi8KKworI2RlZmluZSBUVU5FUl9SQVRJT19NQVNLICAgICAgICAweDA2IC8qIEJpdCBjYjE6Y2IyICovCisjZGVmaW5lIFRVTkVSX1JBVElPX1NFTEVDVF81MCAgIDB4MDAKKyNkZWZpbmUgVFVORVJfUkFUSU9fU0VMRUNUXzMyICAgMHgwMgorI2RlZmluZSBUVU5FUl9SQVRJT19TRUxFQ1RfMTY2ICAweDA0CisjZGVmaW5lIFRVTkVSX1JBVElPX1NFTEVDVF82MiAgIDB4MDYKKworI2RlZmluZSBUVU5FUl9DSEFSR0VfUFVNUCAgICAgICAweDQwICAvKiBCaXQgY2I2ICovCisKKy8qIFN0YXR1cyBieXRlICovCisKKyNkZWZpbmUgVFVORVJfUE9SCSAgMHg4MAorI2RlZmluZSBUVU5FUl9GTCAgICAgICAgICAweDQwCisjZGVmaW5lIFRVTkVSX01PREUgICAgICAgIDB4MzgKKyNkZWZpbmUgVFVORVJfQUZDICAgICAgICAgMHgwNworI2RlZmluZSBUVU5FUl9TSUdOQUwgICAgICAweDA3CisjZGVmaW5lIFRVTkVSX1NURVJFTyAgICAgIDB4MTAKKworI2RlZmluZSBUVU5FUl9QTExfTE9DS0VEICAgMHg0MAorI2RlZmluZSBUVU5FUl9TVEVSRU9fTUszICAgMHgwNAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTIwNywyOCArMjI4LDIzIEBACiAJeyAiTEcgUEFMIChUQVBFIHNlcmllcykiLCBMR0lOTk9URUssIFBBTCwKICAgICAgICAgICAxNioxNzAuMDAsIDE2KjQ1MC4wMCwgMHgwMSwweDAyLDB4MDgsMHhjZSw2MjN9LAogCi0gICAgICAgIHsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KSIsIFBoaWxpcHMsIFBBTCwKLSAgICAgICAgICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4Y2UsNjIzIH0sCi0gICAgICAgIHsgIlBoaWxpcHMgRlExMjM2QSBNSzQiLCBQaGlsaXBzLCBOVFNDLAotICAgICAgICAgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKLQotCS8qIFNob3VsZCB3b3JrIGZvciBUVkY4NTMxTUYsIFRWRjg4MzFNRiwgVFZGODczMU1GICovCi0JeyAiWW1lYyBUVmlzaW9uIFRWRi04NTMxTUYiLCBQaGlsaXBzLCBOVFNDLAorCXsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KSIsIFBoaWxpcHMsIFBBTCwKKwkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKKwl7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKKwkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKKwl7ICJZbWVjIFRWaXNpb24gVFZGLTg1MzFNRi84ODMxTUYvODczMU1GIiwgUGhpbGlwcywgTlRTQywKIAkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogCXsgIlltZWMgVFZpc2lvbiBUVkYtNTUzM01GIiwgUGhpbGlwcywgTlRTQywKIAkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAogCiAJeyAiVGhvbXNvbiBERFQgNzYxMSAoQVRTQy9OVFNDKSIsIFRIT01TT04sIEFUU0MsCiAJICAxNioxNTcuMjUsMTYqNDU0LjAwLDB4MzksMHgzYSwweDNjLDB4OGUsNzMyfSwKLQl7ICJUZW5hIFRORjk1MzMtRC9JRiIsIExHSU5OT1RFSywgUEFMLAotCSAgMTYqMTYwLjI1LCAxNio0NjQuMjUsIDB4MDEsMHgwMiwweDA4LDB4OGUsNjIzfSwKLQotCS8qCi0JICogVGhpcyBlbnRyeSBpcyBmb3IgVEVBNTc2NyBGTSByYWRpbyBvbmx5IGNoaXAgdXNlZCBvbiBzZXZlcmFsIGJvYXJkcwotCSAqIHcvVFYgdHVuZXIKLQkgKi8KLQl7IFRFQTU3NjdfVFVORVJfTkFNRSwgUGhpbGlwcywgUkFESU8sCi0JICAtMSwgLTEsIDAsIDAsIDAsIFRFQTU3NjdfTE9XX0xPXzMyNzY4LDB9LAorCXsgIlRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERiIsIFBoaWxpcHMsIFBBTCwKKyAgICAgICAgICAxNioxNjAuMjUsMTYqNDY0LjI1LDB4MDEsMHgwMiwweDA0LDB4OGUsNjIzfSwKKwl7ICJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyIsIFBoaWxpcHMsIFJBRElPLAorICAgICAgICAgIC8qIHNlZSB0ZWE1NzY3LmMgZm9yIGRldGFpbHMgKi99LAorCXsgIlBoaWxpcHMgRk1EMTIxNk1FIE1LMyBIeWJyaWQgVHVuZXIiLCBQaGlsaXBzLCBQQUwsCisJICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4NTEsMHg1MiwweDU0LDB4ODYsNjIzIH0sCiB9OwogCiB1bnNpZ25lZCBjb25zdCBpbnQgdHVuZXJfY291bnQgPSBBUlJBWV9TSVpFKHR1bmVycyk7CkBAIC0yNDUsMTUgKzI2MSw2IEBACiAJcmV0dXJuIGJ5dGU7CiB9CiAKLSNkZWZpbmUgVFVORVJfUE9SICAgICAgIDB4ODAKLSNkZWZpbmUgVFVORVJfRkwgICAgICAgIDB4NDAKLSNkZWZpbmUgVFVORVJfTU9ERSAgICAgIDB4MzgKLSNkZWZpbmUgVFVORVJfQUZDICAgICAgIDB4MDcKLQotI2RlZmluZSBUVU5FUl9TVEVSRU8gICAgICAgMHgxMCAvKiByYWRpbyBtb2RlICovCi0jZGVmaW5lIFRVTkVSX1NURVJFT19NSzMgICAweDA0IC8qIHJhZGlvIG1vZGUgKi8KLSNkZWZpbmUgVFVORVJfU0lHTkFMICAgICAgIDB4MDcgLyogcmFkaW8gbW9kZSAqLwotCiBzdGF0aWMgaW50IHR1bmVyX3NpZ25hbChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAlyZXR1cm4gKHR1bmVyX2dldHN0YXR1cyhjKSAmIFRVTkVSX1NJR05BTCkgPDwgMTM7CkBAIC0yNzksMjIgKzI4Niw2IEBACiAJcmV0dXJuIHN0ZXJlbzsKIH0KIAotI2lmIDAgLyogdW51c2VkICovCi1zdGF0aWMgaW50IHR1bmVyX2lzbG9ja2VkIChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLSAgICAgICAgcmV0dXJuICh0dW5lcl9nZXRzdGF0dXMgKGMpICYgVFVORVJfRkwpOwotfQotCi1zdGF0aWMgaW50IHR1bmVyX2FmY3N0YXR1cyAoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0gICAgICAgIHJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX0FGQykgLSAyOwotfQotCi1zdGF0aWMgaW50IHR1bmVyX21vZGUgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotICAgICAgICByZXR1cm4gKHR1bmVyX2dldHN0YXR1cyAoYykgJiBUVU5FUl9NT0RFKSA+PiAzOwotfQotI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzc3LDcgKzM2OCw3IEBACiAKIAljYXNlIFRVTkVSX01JQ1JPVFVORV80MDQyRkk1OgogCQkvKiBTZXQgdGhlIGNoYXJnZSBwdW1wIGZvciBmYXN0IHR1bmluZyAqLwotCQl0dW4tPmNvbmZpZyB8PSAweDQwOworCQl0dW4tPmNvbmZpZyB8PSBUVU5FUl9DSEFSR0VfUFVNUDsKIAkJYnJlYWs7CiAJfQogCkBAIC00MjYsMTQgKzQxNywxMyBAQAogCQkJCXR1bmVyX3dhcm4oImkyYyBpL28gcmVhZCBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQkvKiBiaXQgNiBpcyBQTEwgbG9ja2VkIGluZGljYXRvciAqLwotCQkJaWYgKHN0YXR1c19ieXRlICYgMHg0MCkKKwkJCWlmIChzdGF0dXNfYnl0ZSAmIFRVTkVSX1BMTF9MT0NLRUQpCiAJCQkJYnJlYWs7CiAJCQl1ZGVsYXkoMTApOwogCQl9CiAKIAkJLyogU2V0IHRoZSBjaGFyZ2UgcHVtcCBmb3Igb3B0aW1pemVkIHBoYXNlIG5vaXNlIGZpZ3VyZSAqLwotCQl0dW4tPmNvbmZpZyAmPSB+MHg0MDsKKwkJdHVuLT5jb25maWcgJj0gflRVTkVSX0NIQVJHRV9QVU1QOwogCQlidWZmZXJbMF0gPSAoZGl2Pj44KSAmIDB4N2Y7CiAJCWJ1ZmZlclsxXSA9IGRpdiAgICAgICYgMHhmZjsKIAkJYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CkBAIC00NTQsMjYgKzQ0NCwyMiBAQAogCXVuc2lnbmVkIGRpdjsKIAlpbnQgcmM7CiAKLQl0dW49JnR1bmVyc1t0LT50eXBlXTsKLQlkaXYgPSBmcmVxICsgKGludCkoMTYqMTAuNyk7Ci0JYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CisJdHVuID0gJnR1bmVyc1t0LT50eXBlXTsKKwlkaXYgPSAoMjAgKiBmcmVxIC8gMTYwMDApICsgKGludCkoMjAqMTAuNyk7IC8qIElGIDEwLjcgTUh6ICovCisJYnVmZmVyWzJdID0gKHR1bi0+Y29uZmlnICYgflRVTkVSX1JBVElPX01BU0spIHwgVFVORVJfUkFUSU9fU0VMRUNUXzUwOyAvKiA1MCBrSHogc3RlcCAqLwogCiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9URU5BXzk1MzNfREk6CiAJY2FzZSBUVU5FUl9ZTUVDX1RWRl81NTMzTUY6Ci0KLQkJLypUaGVzZSB2YWx1ZXMgYXJlIGVtcGlyaWNhbGx5IGRldGVybWluYXRlZCAqLwotCQlkaXYgPSAoZnJlcSoxMjIpLzE2IC0gMjA7Ci0JCWJ1ZmZlclsyXSA9IDB4ODg7IC8qIGNvdWxkIGJlIGFsc28gMHg4MCAqLwotCQlidWZmZXJbM10gPSAweDE5OyAvKiBjb3VsZCBiZSBhbHNvIDB4MTAsIDB4MTgsIDB4OTkgKi8KLQkJYnJlYWs7CisJCXR1bmVyX2RiZyAoIlRoaXMgdHVuZXIgZG9lc24ndCBoYXZlIEZNLiBNb3N0IGNhcmRzIGhhcyBhIFRFQTU3NjcgZm9yIEZNXG4iKTsKKwkJcmV0dXJuOwogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM6CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzM6CisJY2FzZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzM6CiAJCWJ1ZmZlclszXSA9IDB4MTk7CiAJCWJyZWFrOwogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyNTZfSUgzOgotCQlkaXYgPSAoMjAgKiBmcmVxKS8xNiArIDMzMyAqIDI7Ci0JICAgICAgICBidWZmZXJbMl0gPSAweDgwOworCQlkaXYgPSAoMjAgKiBmcmVxKSAvIDE2MDAwICsgKGludCkoMzMuMyAqIDIwKTsgIC8qIElGIDMzLjMgTUh6ICovCiAJCWJ1ZmZlclszXSA9IDB4MTk7CiAJCWJyZWFrOwogCWNhc2UgVFVORVJfTEdfUEFMX0ZNOgpAQCAtNTA1LDYgKzQ5MSw3IEBACiAJdC0+cmFkaW9fZnJlcSA9IGRlZmF1bHRfc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IHR1bmVyX3NpZ25hbDsKIAl0LT5pc19zdGVyZW8gID0gdHVuZXJfc3RlcmVvOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggOWE0OTNiZS4uZDhiNzhmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTg2NCwxMyArODY0LDggQEAKIAkJICogQnV0IGNoYW5naW5nIHRoZSBtb2RlIHRvIFZJREVPX1NPVU5EX01PTk8gd291bGQgc3dpdGNoCiAJCSAqIGV4dGVybmFsIDQwNTIgbXVsdGlwbGV4ZXIgaW4gYXVkaW9faG9vaygpLgogCQkgKi8KLSNpZiAwCi0JCWlmKChuc3IgJiAweDAyKSAmJiAhKGRzciAmIDB4MTApKSAvKiBOU1IuUy9NQj0xIGFuZCBEU1IuQU1TVEFUPTAgKi8KLQkJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOwotI2Vsc2UKIAkJaWYobnNyICYgMHgwMikgLyogTlNSLlMvTUI9MSAqLwogCQkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87Ci0jZW5kaWYKIAkJaWYobnNyICYgMHgwMSkgLyogTlNSLkQvU0I9MSAqLwogCQkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKaW5kZXggMGYwM2MyNS4uZThkOTQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpAQCAtNDAwLDE0ICs0MDAsNiBAQAogCQl9CiAJfQogCi0jaWYgMAotCWlmICh0X2Zvcm1hdCA8IHNpemVvZihoYXVwcGF1Z2VfdHVuZXJfZm10KS9zaXplb2Yoc3RydWN0IEhBVVBQQVVHRV9UVU5FUl9GTVQpKSB7Ci0JCXR2ZWUtPnR1bmVyX2Zvcm1hdHMgPSBoYXVwcGF1Z2VfdHVuZXJfZm10W3RfZm9ybWF0XS5pZDsKLQkJdF9mbXRfbmFtZSA9IGhhdXBwYXVnZV90dW5lcl9mbXRbdF9mb3JtYXRdLm5hbWU7Ci0JfSBlbHNlIHsKLQkJdF9mbXRfbmFtZSA9ICI8dW5rbm93bj4iOwotCX0KLSNlbmRpZgogCiAJVFZFRVBST01fS0VSTl9JTkZPKCJIYXVwcGF1Z2U6IG1vZGVsID0gJWQsIHJldiA9ICVzLCBzZXJpYWwjID0gJWRcbiIsCiAJCSAgIHR2ZWUtPm1vZGVsLApAQCAtNDgyLDYgKzQ3NCw3IEBACiAJMHhhMCA+PiAxLAogCUkyQ19DTElFTlRfRU5ELAogfTsKKwogSTJDX0NMSUVOVF9JTlNNT0Q7CiAKIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfdHZlZXByb207CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IDhiNjIzMjcuLmZmYmU2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0xMzYzLDE5ICsxMzYzLDcgQEAKIAl1MzIgZGV2aWNlX3N0YXRlOwogCU1QVF9BREFQVEVSICppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlzd2l0Y2goc3RhdGUpCi0JewotCQljYXNlIDE6IC8qIFMxICovCi0JCQlkZXZpY2Vfc3RhdGU9MTsgLyogRDEgKi87Ci0JCQlicmVhazsKLQkJY2FzZSAzOiAvKiBTMyAqLwotCQljYXNlIDQ6IC8qIFM0ICovCi0JCQlkZXZpY2Vfc3RhdGU9MzsgLyogRDMgKi87Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUFHQUlOIC8qRklYTUUqLzsKLQkJCWJyZWFrOwotCX0KKwlkZXZpY2Vfc3RhdGU9cGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSk7CiAKIAlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAogCSJwY2ktc3VzcGVuZDogcGRldj0weCVwLCBzbG90PSVzLCBFbnRlcmluZyBvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggMjlmNjZkZS4uMTM3NzFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtMzQ3LDkgKzM0Nyw3IEBACiAJLmlkX3RhYmxlCT0gbXB0ZmNfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBtcHRmY19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1wdHNjc2loX3JlbW92ZSksCi0JLmRyaXZlciAgICAgICAgID0gewotCQkuc2h1dGRvd24gPSBtcHRzY3NpaF9zaHV0ZG93biwKLSAgICAgICAgfSwKKwkuc2h1dGRvd24JPSBtcHRzY3NpaF9zaHV0ZG93biwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IG1wdHNjc2loX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBtcHRzY3NpaF9yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggMzY0YzQ5Yy4uYjlkNGY3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAjZW5kaWYKIAogdm9pZCAJCW1wdHNjc2loX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKLXZvaWQgCQltcHRzY3NpaF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICopOwordm9pZCAJCW1wdHNjc2loX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICopOwogI2lmZGVmIENPTkZJR19QTQogaW50IAkJbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGludCAJCW1wdHNjc2loX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CkBAIC05ODgsNyArOTg4LDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLQltcHRzY3NpaF9zaHV0ZG93bigmcGRldi0+ZGV2KTsKKwltcHRzY3NpaF9zaHV0ZG93bihwZGV2KTsKIAogCXN6MT0wOwogCkBAIC0xMDI2LDkgKzEwMjYsOSBAQAogICoKICAqLwogdm9pZAotbXB0c2NzaWhfc2h1dGRvd24oc3RydWN0IGRldmljZSAqIGRldikKK21wdHNjc2loX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCU1QVF9BREFQVEVSIAkJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCU1QVF9BREFQVEVSIAkJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0IAkqaG9zdCA9IGlvYy0+c2g7CiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogaW50CiBtcHRzY3NpaF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JbXB0c2NzaWhfc2h1dGRvd24oJnBkZXYtPmRldik7CisJbXB0c2NzaWhfc2h1dGRvd24ocGRldik7CiAJcmV0dXJuIG1wdF9zdXNwZW5kKHBkZXYsc3RhdGUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKaW5kZXggYzIwMmNlOC4uNTFjMDI1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtODIsOSArODIsOSBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIG1wdHNjc2loX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKLWV4dGVybiB2b2lkIG1wdHNjc2loX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKik7CitleHRlcm4gdm9pZCBtcHRzY3NpaF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqKTsKICNpZmRlZiBDT05GSUdfUE0KLWV4dGVybiBpbnQgbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKTsKK2V4dGVybiBpbnQgbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGV4dGVybiBpbnQgbXB0c2NzaWhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZgogZXh0ZXJuIGludCBtcHRzY3NpaF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGZ1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKaW5kZXggYTBhMmUwYS4uZGZhODgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCkBAIC00MDIsOSArNDAyLDcgQEAKIAkuaWRfdGFibGUJPSBtcHRzcGlfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBtcHRzcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtcHRzY3NpaF9yZW1vdmUpLAotCS5kcml2ZXIgICAgICAgICA9IHsKLQkJLnNodXRkb3duID0gbXB0c2NzaWhfc2h1dGRvd24sCi0gICAgICAgIH0sCisJLnNodXRkb3duCT0gbXB0c2NzaWhfc2h1dGRvd24sCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBtcHRzY3NpaF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gbXB0c2NzaWhfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9jb25maWctb3NtLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvbmZpZy1vc20uYwppbmRleCBkMDI2NzYwLi5mZTJlN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvbmZpZy1vc20uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvbmZpZy1vc20uYwpAQCAtMTUsNyArMTUsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCA0Y2VjZGFmLi43ZmM2OTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtNiw4ICs2LDcgQEAKIAogY29uZmlnIElCTV9BU00KIAl0cmlzdGF0ZSAiRGV2aWNlIGRyaXZlciBmb3IgSUJNIFJTQSBzZXJ2aWNlIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFg4NiAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXZpY2UgZHJpdmVyIHN1cHBvcnQgZm9yIGluLWJhbmQgYWNjZXNzIHRvIHRoZQogCSAgSUJNIFJTQSAoQ29uZG9yKSBzZXJ2aWNlIHByb2Nlc3NvciBpbiBlU2VydmVyIHhTZXJpZXMgc3lzdGVtcy4KQEAgLTIyLDcgKzIxLDcgQEAKIAkgIAogCSAgV0FSTklORzogVGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBvciBmdW5jdGlvbgogCSAgY29ycmVjdGx5IG9uIHlvdXIgSUJNIHNlcnZlci4gUGxlYXNlIGNvbnN1bHQgdGhlIElCTSBTZXJ2ZXJQcm92ZW4KLQkgIHdlYnNpdGUgPGh0dHA6Ly93d3cucGMuaWJtL3d3L2VzZXJ2ZXIveHNlcmllcy9zZXJ2ZXJwcm92ZW4+IGZvcgorCSAgd2Vic2l0ZSA8aHR0cDovL3d3dy5wYy5pYm0uY29tL3d3L2VzZXJ2ZXIveHNlcmllcy9zZXJ2ZXJwcm92ZW4+IGZvcgogCSAgaW5mb3JtYXRpb24gb24gdGhlIHNwZWNpZmljIGRyaXZlciBsZXZlbCBhbmQgc3VwcG9ydCBzdGF0ZW1lbnQKIAkgIGZvciB5b3VyIElCTSBzZXJ2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY2kuYyBiL2RyaXZlcnMvbW1jL21tY2kuYwppbmRleCAzYTVmNmFjLi43YTQyOTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jaS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvcHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KQEAgLTcwLDYgKzcxLDcgQEAKIHN0YXRpYyB2b2lkIG1tY2lfc3RhcnRfZGF0YShzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7CiAJdW5zaWduZWQgaW50IGRhdGFjdHJsLCB0aW1lb3V0LCBpcnFtYXNrOworCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGtzOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAogCURCRyhob3N0LCAiYmxrc3ogJTA0eCBibGtzICUwNHggZmxhZ3MgJTA4eFxuIiwKQEAgLTgxLDkgKzgzLDEwIEBACiAKIAltbWNpX2luaXRfc2coaG9zdCwgZGF0YSk7CiAKLQl0aW1lb3V0ID0gZGF0YS0+dGltZW91dF9jbGtzICsKLQkJICAoKHVuc2lnbmVkIGxvbmcgbG9uZylkYXRhLT50aW1lb3V0X25zICogaG9zdC0+Y2NsaykgLwotCQkgICAxMDAwMDAwMDAwVUxMOworCWNsa3MgPSAodW5zaWduZWQgbG9uZyBsb25nKWRhdGEtPnRpbWVvdXRfbnMgKiBob3N0LT5jY2xrOworCWRvX2RpdihjbGtzLCAxMDAwMDAwMDAwVUwpOworCisJdGltZW91dCA9IGRhdGEtPnRpbWVvdXRfY2xrcyArICh1bnNpZ25lZCBpbnQpY2xrczsKIAogCWJhc2UgPSBob3N0LT5iYXNlOwogCXdyaXRlbCh0aW1lb3V0LCBiYXNlICsgTU1DSURBVEFUSU1FUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmMgYi9kcml2ZXJzL21tYy93YnNkLmMKaW5kZXggYjdmYmQzMC4uMGM0MWQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuYwpAQCAtNTQsMjggKzU0LDYgQEAKICNkZWZpbmUgREJHRih4Li4uKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLXZvaWQgREJHX1JFRyhpbnQgcmVnLCB1OCB2YWx1ZSkKLXsKLQlpbnQgaTsKLQkKLQlwcmludGsoS0VSTl9ERUJVRyAid2JzZDogUmVnaXN0ZXIgJWQ6IDB4JTAyWCAlM2QgJyVjJyAiLAotCQlyZWcsIChpbnQpdmFsdWUsIChpbnQpdmFsdWUsICh2YWx1ZSA8IDB4MjApPycuJzp2YWx1ZSk7Ci0JCi0JZm9yIChpID0gNztpID49IDA7aS0tKQotCXsKLQkJaWYgKHZhbHVlICYgKDEgPDwgaSkpCi0JCQlwcmludGsoIngiKTsKLQkJZWxzZQotCQkJcHJpbnRrKCIuIik7Ci0JfQotCQotCXByaW50aygiXG4iKTsKLX0KLSNlbHNlCi0jZGVmaW5lIERCR19SRUcociwgdikgZG8ge30gIHdoaWxlICgwKQotI2VuZGlmCi0KIC8qCiAgKiBEZXZpY2UgcmVzb3VyY2VzCiAgKi8KQEAgLTkyLDYgKzcwLDEzIEBACiAKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKK3N0YXRpYyBjb25zdCBpbnQgY29uZmlnX3BvcnRzW10gPSB7IDB4MkUsIDB4NEUgfTsKK3N0YXRpYyBjb25zdCBpbnQgdW5sb2NrX2NvZGVzW10gPSB7IDB4ODMsIDB4ODcgfTsKKworc3RhdGljIGNvbnN0IGludCB2YWxpZF9pZHNbXSA9IHsKKwkweDcxMTIsCisJfTsKKwogI2lmZGVmIENPTkZJR19QTlAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbm9wbnAgPSAwOwogI2Vsc2UKQEAgLTEwNTEsNiArMTAzNiwyMCBAQAogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBjYXJkIGRldGVjdGlvbgorICovCitzdGF0aWMgdm9pZCB3YnNkX2RldGVjdF9jYXJkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKWRhdGE7CisJCisJQlVHX09OKGhvc3QgPT0gTlVMTCk7CisJCisJREJHKCJFeGVjdXRpbmcgY2FyZCBkZXRlY3Rpb25cbiIpOworCQorCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CQorfQorCisvKgogICogVGFza2xldHMKICAqLwogCkBAIC0xMDc1LDcgKzEwNzQsNiBAQAogewogCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopcGFyYW07CiAJdTggY3NyOwotCWludCBjaGFuZ2UgPSAwOwogCQogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAJCkBAIC0xMDk0LDE0ICsxMDkyLDIwIEBACiAJCXsKIAkJCURCRygiQ2FyZCBpbnNlcnRlZFxuIik7CiAJCQlob3N0LT5mbGFncyB8PSBXQlNEX0ZDQVJEX1BSRVNFTlQ7Ci0JCQljaGFuZ2UgPSAxOworCQkJCisJCQkvKgorCQkJICogRGVsYXkgY2FyZCBkZXRlY3Rpb24gdG8gYWxsb3cgZWxlY3RyaWNhbCBjb25uZWN0aW9ucworCQkJICogdG8gc3RhYmlsaXNlLgorCQkJICovCisJCQltb2RfdGltZXIoJmhvc3QtPnRpbWVyLCBqaWZmaWVzICsgSFovMik7CiAJCX0KKwkJCisJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIAl9CiAJZWxzZSBpZiAoaG9zdC0+ZmxhZ3MgJiBXQlNEX0ZDQVJEX1BSRVNFTlQpCiAJewogCQlEQkcoIkNhcmQgcmVtb3ZlZFxuIik7CiAJCWhvc3QtPmZsYWdzICY9IH5XQlNEX0ZDQVJEX1BSRVNFTlQ7Ci0JCWNoYW5nZSA9IDE7CiAJCQogCQlpZiAoaG9zdC0+bXJxKQogCQl7CkBAIC0xMTEyLDE1ICsxMTE2LDE0IEBACiAJCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSBNTUNfRVJSX0ZBSUxFRDsKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpbmlzaF90YXNrbGV0KTsKIAkJfQotCX0KLQkKLQkvKgotCSAqIFVubG9jayBmaXJzdCBzaW5jZSB3ZSBtaWdodCBnZXQgYSBjYWxsIGJhY2suCi0JICovCi0Jc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkKKwkJLyoKKwkJICogVW5sb2NrIGZpcnN0IHNpbmNlIHdlIG1pZ2h0IGdldCBhIGNhbGwgYmFjay4KKwkJICovCisJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIAotCWlmIChjaGFuZ2UpCiAJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB3YnNkX3Rhc2tsZXRfZmlmbyh1bnNpZ25lZCBsb25nIHBhcmFtKQpAQCAtMTMyNSw2ICsxMzI4LDEzIEBACiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCQogCS8qCisJICogU2V0IHVwIGRldGVjdGlvbiB0aW1lcgorCSAqLworCWluaXRfdGltZXIoJmhvc3QtPnRpbWVyKTsKKwlob3N0LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaG9zdDsKKwlob3N0LT50aW1lci5mdW5jdGlvbiA9IHdic2RfZGV0ZWN0X2NhcmQ7CisJCisJLyoKIAkgKiBNYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cy4gV29yc3QgY2FzZSBpcyBvbmUgc2VjdG9yIHBlciBzZWdtZW50CiAJICogc28gdGhpcyB3aWxsIGJlIDY0a0IvNTEyLgogCSAqLwpAQCAtMTM1MSwxMSArMTM2MSwxNyBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfZnJlZV9tbWMoc3RydWN0IGRldmljZSogZGV2KQogewogCXN0cnVjdCBtbWNfaG9zdCogbW1jOworCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3Q7CiAJCiAJbW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaWYgKCFtbWMpCiAJCXJldHVybjsKIAkKKwlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlCVUdfT04oaG9zdCA9PSBOVUxMKTsKKwkKKwlkZWxfdGltZXJfc3luYygmaG9zdC0+dGltZXIpOworCQogCW1tY19mcmVlX2hvc3QobW1jKTsKIAkKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3dic2QuaCBiL2RyaXZlcnMvbW1jL3dic2QuaAppbmRleCA4NjRmMzA4Mi4uNjYxYTlmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5oCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuaApAQCAtOCwxMyArOCw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi1jb25zdCBpbnQgY29uZmlnX3BvcnRzW10gPSB7IDB4MkUsIDB4NEUgfTsKLWNvbnN0IGludCB1bmxvY2tfY29kZXNbXSA9IHsgMHg4MywgMHg4NyB9OwotCi1jb25zdCBpbnQgdmFsaWRfaWRzW10gPSB7Ci0JMHg3MTEyLAotCX07Ci0KICNkZWZpbmUgTE9DS19DT0RFCQkweEFBCiAKICNkZWZpbmUgV0JTRF9DT05GX1NXUlNUCQkweDAyCkBAIC0xODcsNCArMTgwLDYgQEAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGltZW91dF90YXNrbGV0OwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlmaW5pc2hfdGFza2xldDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJYmxvY2tfdGFza2xldDsKKwkKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsJCS8qIENhcmQgZGV0ZWN0aW9uIHRpbWVyICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvYWZzLmMgYi9kcml2ZXJzL210ZC9hZnMuYwppbmRleCA4MDFlNmM3Li43MzYzZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9hZnMuYworKysgYi9kcml2ZXJzL210ZC9hZnMuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJICovCiAJZm9yIChpZHggPSBvZmYgPSAwOyBvZmYgPCBtdGQtPnNpemU7IG9mZiArPSBtdGQtPmVyYXNlc2l6ZSkgewogCQlzdHJ1Y3QgaW1hZ2VfaW5mb19zdHJ1Y3QgaWlzOwotCQl1X2ludCBpaXNfcHRyLCBpbWdfcHRyLCBzaXplOworCQl1X2ludCBpaXNfcHRyLCBpbWdfcHRyOwogCiAJCS8qIFJlYWQgdGhlIGZvb3Rlci4gKi8KIAkJcmV0ID0gYWZzX3JlYWRfZm9vdGVyKG10ZCwgJmltZ19wdHIsICZpaXNfcHRyLCBvZmYsIG1hc2spOwpAQCAtMjM2LDIxICsyMzYsOSBAQAogCQkJY29udGludWU7CiAKIAkJc3RyY3B5KHN0ciwgaWlzLm5hbWUpOwotCQlzaXplID0gbXRkLT5lcmFzZXNpemUgKyBvZmYgLSBpbWdfcHRyOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIHRvIHN1cHBvcnQgSkZGUzIgcGFydGl0aW9ucyBvbiB0aGlzIGxheW91dCwKLQkJICogd2UgbXVzdCBsaWUgdG8gTVREIGFib3V0IHRoZSByZWFsIHNpemUgb2YgSkZGUzIKLQkJICogcGFydGl0aW9uczsgdGhpcyBlbnN1cmVzIHRoYXQgdGhlIEFGUyBmbGFzaCBmb290ZXIKLQkJICogd29uJ3QgYmUgZXJhc2VkIGJ5IEpGRlMyLiAgUGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIKLQkJICogSkZGUzIgcGFydGl0aW9ucyBhcmUgZ2l2ZW4gaW1hZ2UgbnVtYmVycyBiZXR3ZWVuCi0JCSAqIDEwMDAgYW5kIDIwMDAgaW5jbHVzaXZlLgotCQkgKi8KLQkJaWYgKGlpcy5pbWFnZU51bWJlciA+PSAxMDAwICYmIGlpcy5pbWFnZU51bWJlciA8IDIwMDApCi0JCQlzaXplIC09IG10ZC0+ZXJhc2VzaXplOwogCiAJCXBhcnRzW2lkeF0ubmFtZQkJPSBzdHI7Ci0JCXBhcnRzW2lkeF0uc2l6ZQkJPSBzaXplOworCQlwYXJ0c1tpZHhdLnNpemUJCT0gKGlpcy5sZW5ndGggKyBtdGQtPmVyYXNlc2l6ZSAtIDEpICYgfihtdGQtPmVyYXNlc2l6ZSAtIDEpOwogCQlwYXJ0c1tpZHhdLm9mZnNldAk9IGltZ19wdHI7CiAJCXBhcnRzW2lkeF0ubWFza19mbGFncwk9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCmluZGV4IGQ2ODJkYmMuLmRmOTVkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKICMgZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwotIyAkSWQ6IEtjb25maWcsdiAxLjEzIDIwMDQvMTIvMDEgMTU6NDk6MTAgbmljbyBFeHAgJAorIyAkSWQ6IEtjb25maWcsdiAxLjE1IDIwMDUvMDYvMDYgMjM6MDQ6MzUgdHBveW5vciBFeHAgJAogCiBtZW51ICJSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycyIKIAlkZXBlbmRzIG9uIE1URCE9bgpAQCAtMTU1LDYgKzE1NSwzMSBAQAogCSAgSWYgeW91ciBmbGFzaCBjaGlwcyBhcmUgaW50ZXJsZWF2ZWQgaW4gZWlnaHRzIC0gaS5lLiB5b3UgaGF2ZSBlaWdodAogCSAgZmxhc2ggY2hpcHMgYWRkcmVzc2VkIGJ5IGVhY2ggYnVzIGN5Y2xlLCB0aGVuIHNheSAnWScuCiAKK2NvbmZpZyBNVERfT1RQCisJYm9vbCAiUHJvdGVjdGlvbiBSZWdpc3RlcnMgYWthIG9uZS10aW1lIHByb2dyYW1tYWJsZSAoT1RQKSBiaXRzIgorCWRlcGVuZHMgb24gTVREX0NGSV9BRFZfT1BUSU9OUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciByZWFkaW5nLCB3cml0aW5nIGFuZCBsb2NraW5nIHNvIGNhbGxlZAorCSAgIlByb3RlY3Rpb24gUmVnaXN0ZXJzIiBwcmVzZW50IG9uIHNvbWUgZmxhc2ggY2hpcHMuCisJICBBIHN1YnNldCBvZiB0aGVtIGFyZSBwcmUtcHJvZ3JhbW1lZCBhdCB0aGUgZmFjdG9yeSB3aXRoIGEKKwkgIHVuaXF1ZSBzZXQgb2YgdmFsdWVzLiBUaGUgcmVzdCBpcyB1c2VyLXByb2dyYW1tYWJsZS4KKworCSAgVGhlIHVzZXItcHJvZ3JhbW1hYmxlIFByb3RlY3Rpb24gUmVnaXN0ZXJzIGNvbnRhaW4gb25lLXRpbWUKKwkgIHByb2dyYW1tYWJsZSAoT1RQKSBiaXRzOyB3aGVuIHByb2dyYW1tZWQsIHJlZ2lzdGVyIGJpdHMgY2Fubm90IGJlCisJICBlcmFzZWQuIEVhY2ggUHJvdGVjdGlvbiBSZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQgbXVsdGlwbGUgdGltZXMgdG8KKwkgIHByb2dyYW0gaW5kaXZpZHVhbCBiaXRzLCBhcyBsb25nIGFzIHRoZSByZWdpc3RlciByZW1haW5zIHVubG9ja2VkLgorCisJICBFYWNoIFByb3RlY3Rpb24gUmVnaXN0ZXIgaGFzIGFuIGFzc29jaWF0ZWQgTG9jayBSZWdpc3RlciBiaXQuIFdoZW4gYQorCSAgTG9jayBSZWdpc3RlciBiaXQgaXMgcHJvZ3JhbW1lZCwgdGhlIGFzc29jaWF0ZWQgUHJvdGVjdGlvbiBSZWdpc3RlcgorCSAgY2FuIG9ubHkgYmUgcmVhZDsgaXQgY2FuIG5vIGxvbmdlciBiZSBwcm9ncmFtbWVkLiBBZGRpdGlvbmFsbHksCisJICBiZWNhdXNlIHRoZSBMb2NrIFJlZ2lzdGVyIGJpdHMgdGhlbXNlbHZlcyBhcmUgT1RQLCB3aGVuIHByb2dyYW1tZWQsCisJICBMb2NrIFJlZ2lzdGVyIGJpdHMgY2Fubm90IGJlIGVyYXNlZC4gVGhlcmVmb3JlLCB3aGVuIGEgUHJvdGVjdGlvbgorCSAgUmVnaXN0ZXIgaXMgbG9ja2VkLCBpdCBjYW5ub3QgYmUgdW5sb2NrZWQuCisKKwkgIFRoaXMgZmVhdHVyZSBzaG91bGQgdGhlcmVmb3JlIGJlIHVzZWQgd2l0aCBleHRyZW1lIGNhcmUuIEFueSBtaXN0YWtlCisJICBpbiB0aGUgcHJvZ3JhbW1pbmcgb2YgT1RQIGJpdHMgd2lsbCB3YXN0ZSB0aGVtLgorCiBjb25maWcgTVREX0NGSV9JTlRFTEVYVAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBJbnRlbC9TaGFycCBmbGFzaCBjaGlwcyIKIAlkZXBlbmRzIG9uIE1URF9HRU5fUFJPQkUKQEAgLTI3NSw3ICszMDAsNyBAQAogCiBjb25maWcgTVREX1hJUAogCWJvb2wgIlhJUCBhd2FyZSBNVEQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTTVAgJiYgTVREX0NGSV9JTlRFTEVYVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uICFTTVAgJiYgKE1URF9DRklfSU5URUxFWFQgfHwgTVREX0NGSV9BTURTVEQpICYmIEVYUEVSSU1FTlRBTCAmJiBBUk0KIAlkZWZhdWx0IHkgaWYgWElQX0tFUk5FTAogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIE1URCBzdXBwb3J0IHRvIHdvcmsgd2l0aCBmbGFzaCBtZW1vcnkgd2hpY2ggaXMgYWxzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9hbWRfZmxhc2guYwppbmRleCA0MWUyZTNlLi4yZGFmZWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9hbWRfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9hbWRfZmxhc2guYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBBdXRob3I6IEpvbmFzIEhvbG1iZXJnIDxqb25hcy5ob2xtYmVyZ0BheGlzLmNvbT4KICAqCi0gKiAkSWQ6IGFtZF9mbGFzaC5jLHYgMS4yNiAyMDA0LzExLzIwIDEyOjQ5OjA0IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGFtZF9mbGFzaC5jLHYgMS4yNyAyMDA1LzAyLzA0IDA3OjQzOjA5IGpvbmFzaGcgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKQEAgLTY3LDcgKzY3LDYgQEAKICNkZWZpbmUgQU0yOUxWMTYwRFQJMHgyMkM0CiAjZGVmaW5lIEFNMjlMVjE2MERCCTB4MjI0OQogI2RlZmluZSBBTTI5QkRTMzIzRCAgICAgMHgyMkQxCi0jZGVmaW5lIEFNMjlCRFM2NDNECTB4MjI3RQogCiAvKiBBdG1lbCAqLwogI2RlZmluZSBBVDQ5eFYxNngJMHgwMEMwCkBAIC02MTgsMTcgKzYxNyw2IEBACiAJCQl7IC5vZmZzZXQgPSAweDNmMDAwMCwgLmVyYXNlc2l6ZSA9IDB4MDIwMDAsIC5udW1ibG9ja3MgPSAgOCB9LAogCQl9CiAJfSwgewotCQkubWZyX2lkID0gTUFOVUZBQ1RVUkVSX0FNRCwKLQkJLmRldl9pZCA9IEFNMjlCRFM2NDNELAotCQkubmFtZSA9ICJBTUQgQU0yOUJEUzY0M0QiLAotCQkuc2l6ZSA9IDB4MDA4MDAwMDAsCi0JCS5udW1lcmFzZXJlZ2lvbnMgPSAzLAotCQkucmVnaW9ucyA9IHsKLQkJCXsgLm9mZnNldCA9IDB4MDAwMDAwLCAuZXJhc2VzaXplID0gMHgxMDAwMCwgLm51bWJsb2NrcyA9IDk2IH0sCi0JCQl7IC5vZmZzZXQgPSAweDYwMDAwMCwgLmVyYXNlc2l6ZSA9IDB4MTAwMDAsIC5udW1ibG9ja3MgPSAzMSB9LAotCQkJeyAub2Zmc2V0ID0gMHg3ZjAwMDAsIC5lcmFzZXNpemUgPSAweDAyMDAwLCAubnVtYmxvY2tzID0gIDggfSwKLQkJfQotCX0sIHsKIAkJLm1mcl9pZCA9IE1BTlVGQUNUVVJFUl9BVE1FTCwKIAkJLmRldl9pZCA9IEFUNDl4VjE2eCwKIAkJLm5hbWUgPSAiQXRtZWwgQVQ0OXhWMTZ4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKaW5kZXggYzI2OGJjZC4uMGNmY2Q4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKQEAgLTQsNyArNCw3IEBACiAgKgogICogKEMpIDIwMDAgUmVkIEhhdC4gR1BMJ2QKICAqCi0gKiAkSWQ6IGNmaV9jbWRzZXRfMDAwMS5jLHYgMS4xNjQgMjAwNC8xMS8xNiAxODoyOTowMCBkd213MiBFeHAgJAorICogJElkOiBjZmlfY21kc2V0XzAwMDEuYyx2IDEuMTc4IDIwMDUvMDUvMTkgMTc6MDU6NDMgbmljbyBFeHAgJAogICoKICAqIAogICogMTAvMTAvMjAwMAlOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3hpcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CkBAIC00OCwxNiArNDksMjUgQEAKICNkZWZpbmUgTTUwTFBXMDgwICAgICAgIDB4MDAyRgogCiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7Ci0vL3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYWRfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwotLy9zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3dyaXRlX3dvcmRzKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIGNvbnN0IHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3dyaXRlX2J1ZmZlcnMoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgY29uc3QgdV9jaGFyICopOwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfZXJhc2VfdmFyc2l6ZShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IGVyYXNlX2luZm8gKik7CiBzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfc3luYyAoc3RydWN0IG10ZF9pbmZvICopOwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOworI2lmZGVmIENPTkZJR19NVERfT1RQCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYWRfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfd3JpdGVfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfbG9ja191c2VyX3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QpOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfZ2V0X2ZhY3RfcHJvdF9pbmZvIChzdHJ1Y3QgbXRkX2luZm8gKiwKKwkJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqLCBzaXplX3QpOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfZ2V0X3VzZXJfcHJvdF9pbmZvIChzdHJ1Y3QgbXRkX2luZm8gKiwKKwkJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqLCBzaXplX3QpOworI2VuZGlmCiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9zdXNwZW5kIChzdHJ1Y3QgbXRkX2luZm8gKik7CiBzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfcmVzdW1lIChzdHJ1Y3QgbXRkX2luZm8gKik7CitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWJvb3QgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwogCiBzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfZGVzdHJveShzdHJ1Y3QgbXRkX2luZm8gKik7CiAKQEAgLTI1Miw3ICsyNjIsOCBAQAogCQlpbnQgbmJfcGFydHMsIGk7CiAKIAkJLyogUHJvdGVjdGlvbiBSZWdpc3RlciBpbmZvICovCi0JCWV4dHJhX3NpemUgKz0gKGV4dHAtPk51bVByb3RlY3Rpb25GaWVsZHMgLSAxKSAqICg0ICsgNik7CisJCWV4dHJhX3NpemUgKz0gKGV4dHAtPk51bVByb3RlY3Rpb25GaWVsZHMgLSAxKSAqCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvKTsKIAogCQkvKiBCdXJzdCBSZWFkIGluZm8gKi8KIAkJZXh0cmFfc2l6ZSArPSA2OwpAQCAtMzI0LDcgKzMzNSw5IEBACiAJbXRkLT5yZXN1bWUgID0gY2ZpX2ludGVsZXh0X3Jlc3VtZTsKIAltdGQtPmZsYWdzICAgPSBNVERfQ0FQX05PUkZMQVNIOwogCW10ZC0+bmFtZSAgICA9IG1hcC0+bmFtZTsKLQkKKworCW10ZC0+cmVib290X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjZmlfaW50ZWxleHRfcmVib290OworCiAJaWYgKGNmaS0+Y2ZpX21vZGUgPT0gQ0ZJX01PREVfQ0ZJKSB7CiAJCS8qIAogCQkgKiBJdCdzIGEgcmVhbCBDRkkgY2hpcCwgbm90IG9uZSBmb3Igd2hpY2ggdGhlIHByb2JlCkBAIC00MjIsOSArNDM1LDEzIEBACiAJCSAgICAgICBtdGQtPmVyYXNlcmVnaW9uc1tpXS5udW1ibG9ja3MpOwogCX0KIAotI2lmIDAKLQltdGQtPnJlYWRfdXNlcl9wcm90X3JlZyA9IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWc7CisjaWZkZWYgQ09ORklHX01URF9PVFAKIAltdGQtPnJlYWRfZmFjdF9wcm90X3JlZyA9IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWc7CisJbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnOworCW10ZC0+d3JpdGVfdXNlcl9wcm90X3JlZyA9IGNmaV9pbnRlbGV4dF93cml0ZV91c2VyX3Byb3RfcmVnOworCW10ZC0+bG9ja191c2VyX3Byb3RfcmVnID0gY2ZpX2ludGVsZXh0X2xvY2tfdXNlcl9wcm90X3JlZzsKKwltdGQtPmdldF9mYWN0X3Byb3RfaW5mbyA9IGNmaV9pbnRlbGV4dF9nZXRfZmFjdF9wcm90X2luZm87CisJbXRkLT5nZXRfdXNlcl9wcm90X2luZm8gPSBjZmlfaW50ZWxleHRfZ2V0X3VzZXJfcHJvdF9pbmZvOwogI2VuZGlmCiAKIAkvKiBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgcG90ZW50aWFsIHRvIGRpc3RvcnQgdGhlIHJlYWxpdHkKQEAgLTQzMyw2ICs0NTAsNyBAQAogCQlnb3RvIHNldHVwX2VycjsKIAogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZtdGQtPnJlYm9vdF9ub3RpZmllcik7CiAJcmV0dXJuIG10ZDsKIAogIHNldHVwX2VycjoKQEAgLTQ3MSw3ICs0ODksOCBAQAogCQlpbnQgb2ZmcywgbnVtcmVnaW9ucywgbnVtcGFydHMsIHBhcnRzaGlmdCwgbnVtdmlydGNoaXBzLCBpLCBqOwogCiAJCS8qIFByb3RlY3Rpb24gUmVnaXN0ZXIgaW5mbyAqLwotCQlvZmZzID0gKGV4dHAtPk51bVByb3RlY3Rpb25GaWVsZHMgLSAxKSAqICg0ICsgNik7CisJCW9mZnMgPSAoZXh0cC0+TnVtUHJvdGVjdGlvbkZpZWxkcyAtIDEpICoKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2ZpX2ludGVsZXh0X290cGluZm8pOwogCiAJCS8qIEJ1cnN0IFJlYWQgaW5mbyAqLwogCQlvZmZzICs9IDY7CkBAIC01NjMsNyArNTgyLDcgQEAKICByZXNldHRpbWU6CiAJdGltZW8gPSBqaWZmaWVzICsgSFo7CiAgcmV0cnk6Ci0JaWYgKGNoaXAtPnByaXYgJiYgKG1vZGUgPT0gRkxfV1JJVElORyB8fCBtb2RlID09IEZMX0VSQVNJTkcpKSB7CisJaWYgKGNoaXAtPnByaXYgJiYgKG1vZGUgPT0gRkxfV1JJVElORyB8fCBtb2RlID09IEZMX0VSQVNJTkcgfHwgbW9kZSA9PSBGTF9PVFBfV1JJVEUpKSB7CiAJCS8qCiAJCSAqIE9LLiBXZSBoYXZlIHBvc3NpYmlsaXR5IGZvciBjb250ZW5zaW9uIG9uIHRoZSB3cml0ZS9lcmFzZQogCQkgKiBvcGVyYXRpb25zIHdoaWNoIGFyZSBnbG9iYWwgdG8gdGhlIHJlYWwgY2hpcCBhbmQgbm90IHBlcgpAQCAtODA3LDEwICs4MjYsNiBAQAogICogYXNzZW1ibHkgdG8gbWFrZSBzdXJlIGlubGluZSBmdW5jdGlvbnMgd2VyZSBhY3R1YWxseSBpbmxpbmVkIGFuZCB0aGF0IGdjYwogICogZGlkbid0IGVtaXQgY2FsbHMgdG8gaXRzIG93biBzdXBwb3J0IGZ1bmN0aW9ucykuIEFsc28gY29uZmlndXJpbmcgTVREIENGSQogICogc3VwcG9ydCB0byBhIHNpbmdsZSBidXN3aWR0aCBhbmQgYSBzaW5nbGUgaW50ZXJsZWF2ZSBpcyBhbHNvIHJlY29tbWVuZGVkLgotICogTm90ZSB0aGF0IG5vdCBvbmx5IElSUXMgYXJlIGRpc2FibGVkIGJ1dCB0aGUgcHJlZW1wdGlvbiBjb3VudCBpcyBhbHNvCi0gKiBpbmNyZWFzZWQgdG8gcHJldmVudCBvdGhlciBsb2NraW5nIHByaW1pdGl2ZXMgKG5hbWVseSBzcGluX3VubG9jaykgZnJvbQotICogZGVjcmVtZW50aW5nIHRoZSBwcmVlbXB0IGNvdW50IHRvIHplcm8gYW5kIHNjaGVkdWxpbmcgdGhlIENQVSBhd2F5IHdoaWxlCi0gKiBub3QgaW4gYXJyYXkgbW9kZS4KICAqLwogCiBzdGF0aWMgdm9pZCB4aXBfZGlzYWJsZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKQEAgLTgxOCw3ICs4MzMsNiBAQAogewogCS8qIFRPRE86IGNoaXBzIHdpdGggbm8gWElQIHVzZSBzaG91bGQgaWdub3JlIGFuZCByZXR1cm4gKi8KIAkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOyAvKiBlbnN1cmUgbW11IG1hcHBpbmcgaXMgdXAgdG8gZGF0ZSAqLwotCXByZWVtcHRfZGlzYWJsZSgpOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiB9CiAKQEAgLTgzMSw5ICs4NDUsOCBAQAogCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCX0KIAkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOwotCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOyAvKiBmaWxsIGluc3RydWN0aW9uIHByZWZldGNoICovCisJeGlwX2lwcmVmZXRjaCgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiAvKgpAQCAtOTA5LDcgKzkyMiw3IEBACiAJCQkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOwogCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CiAJCQljb25kX3Jlc2NoZWQoKTsKIApAQCAtOTE5LDE1ICs5MzIsMTUgQEAKIAkJCSAqIGEgc3VzcGVuZGVkIGVyYXNlIHN0YXRlLiAgSWYgc28gbGV0J3Mgd2FpdAogCQkJICogdW50aWwgaXQncyBkb25lLgogCQkJICovCi0JCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQl3aGlsZSAoY2hpcC0+c3RhdGUgIT0gbmV3c3RhdGUpIHsKIAkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQkJc2NoZWR1bGUoKTsKIAkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJfQogCQkJLyogRGlzYWxsb3cgWElQIGFnYWluICovCiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtOTU2LDEyICs5NjksMTQgQEAKICAqIFRoZSBJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRSgpIG1hY3JvIGlzIG5vcm1hbGx5IHVzZWQgaW4gcGFyYWxsZWwgd2hpbGUKICAqIHRoZSBmbGFzaCBpcyBhY3RpdmVseSBwcm9ncmFtbWluZyBvciBlcmFzaW5nIHNpbmNlIHdlIGhhdmUgdG8gcG9sbCBmb3IKICAqIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW55d2F5LiAgV2UgY2FuJ3QgZG8gdGhhdCBpbiBhIGdlbmVyaWMgd2F5IHdpdGgKLSAqIGEgWElQIHNldHVwIHNvIGRvIGl0IGJlZm9yZSB0aGUgYWN0dWFsIGZsYXNoIG9wZXJhdGlvbiBpbiB0aGlzIGNhc2UuCisgKiBhIFhJUCBzZXR1cCBzbyBkbyBpdCBiZWZvcmUgdGhlIGFjdHVhbCBmbGFzaCBvcGVyYXRpb24gaW4gdGhpcyBjYXNlCisgKiBhbmQgc3R1YiBpdCBvdXQgZnJvbSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWS4KICAqLwotI3VuZGVmIElOVkFMSURBVEVfQ0FDSEVEX1JBTkdFCi0jZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKHguLi4pCi0jZGVmaW5lIFhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKSBcCi0JZG8geyBpZihtYXAtPmludmFsX2NhY2hlKSBtYXAtPmludmFsX2NhY2hlKG1hcCwgZnJvbSwgc2l6ZSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGZyb20sIHNpemUpICBcCisJSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBsZW4sIHVzZWMpICBcCisJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCB1c2VjKQogCiAvKgogICogRXh0cmEgbm90ZXM6CkBAIC05ODQsMTEgKzk5OSwyMyBAQAogCiAjZGVmaW5lIHhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKQogI2RlZmluZSB4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKQotCi0jZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIGNmaV91ZGVsYXkodXNlYykKLQogI2RlZmluZSBYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKHguLi4pCiAKKyNkZWZpbmUgVURFTEFZKG1hcCwgY2hpcCwgYWRyLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBsZW4sIHVzZWMpICBcCitkbyB7ICBcCisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOyAgXAorCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOyAgXAorCWNmaV91ZGVsYXkodXNlYyk7ICBcCisJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsgIFwKK30gd2hpbGUgKDApCisKICNlbmRpZgogCiBzdGF0aWMgaW50IGRvX3BvaW50X29uZWNoaXAgKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCBsb2ZmX3QgYWRyLCBzaXplX3QgbGVuKQpAQCAtMTE3NiwxMTEgKzEyMDMsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWYgMAotc3RhdGljIGludCBfX3hpcHJhbSBjZmlfaW50ZWxleHRfcmVhZF9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICptdGQsCi0JCQkJCQlsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKLQkJCQkJCXNpemVfdCAqcmV0bGVuLAotCQkJCQkJdV9jaGFyICpidWYsCi0JCQkJCQlpbnQgYmFzZV9vZmZzdCwgaW50IHJlZ19zeikKLXsKLQlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCAqZXh0cCA9IGNmaS0+Y21kc2V0X3ByaXY7Ci0Jc3RydWN0IGZsY2hpcCAqY2hpcDsKLQlpbnQgb2ZzX2ZhY3RvciA9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7Ci0JaW50IGNvdW50ID0gbGVuOwotCWludCBjaGlwX251bSwgb2Zmc3Q7Ci0JaW50IHJldDsKLQotCWNoaXBfbnVtID0gKCh1bnNpZ25lZCBpbnQpZnJvbS9yZWdfc3opOwotCW9mZnN0ID0gZnJvbSAtIChyZWdfc3oqY2hpcF9udW0pK2Jhc2Vfb2Zmc3Q7Ci0KLQl3aGlsZSAoY291bnQpIHsKLQkvKiBDYWxjdWxhdGUgd2hpY2ggY2hpcCAmIHByb3RlY3Rpb24gcmVnaXN0ZXIgb2Zmc2V0IHdlIG5lZWQgKi8KLQotCQlpZiAoY2hpcF9udW0gPj0gY2ZpLT5udW1jaGlwcykKLQkJCWdvdG8gb3V0OwotCi0JCWNoaXAgPSAmY2ZpLT5jaGlwc1tjaGlwX251bV07Ci0JCQotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwotCQlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0LCBGTF9KRURFQ19RVUVSWSk7Ci0JCWlmIChyZXQpIHsKLQkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJCXJldHVybiAobGVuLWNvdW50KT86cmV0OwotCQl9Ci0KLQkJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7Ci0KLQkJaWYgKGNoaXAtPnN0YXRlICE9IEZMX0pFREVDX1FVRVJZKSB7Ci0JCQltYXBfd3JpdGUobWFwLCBDTUQoMHg5MCksIGNoaXAtPnN0YXJ0KTsKLQkJCWNoaXAtPnN0YXRlID0gRkxfSkVERUNfUVVFUlk7Ci0JCX0KLQotCQl3aGlsZSAoY291bnQgJiYgKChvZmZzdC1iYXNlX29mZnN0KSA8IHJlZ19zeikpIHsKLQkJCSpidWYgPSBtYXBfcmVhZDgobWFwLChjaGlwLT5zdGFydCsoKGV4dHAtPlByb3RSZWdBZGRyKzEpKm9mc19mYWN0b3IpK29mZnN0KSk7Ci0JCQlidWYrKzsKLQkJCW9mZnN0Kys7Ci0JCQljb3VudC0tOwotCQl9Ci0KLQkJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0KTsKLQkJcHV0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7Ci0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQotCQkvKiBNb3ZlIG9uIHRvIHRoZSBuZXh0IGNoaXAgKi8KLQkJY2hpcF9udW0rKzsKLQkJb2Zmc3QgPSBiYXNlX29mZnN0OwotCX0KLQkKLSBvdXQ6CQotCXJldHVybiBsZW4tY291bnQ7Ci19Ci0JCi1zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwotCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwotCXN0cnVjdCBjZmlfcHJpX2ludGVsZXh0ICpleHRwPWNmaS0+Y21kc2V0X3ByaXY7Ci0JaW50IGJhc2Vfb2Zmc3QscmVnX3N6OwotCQotCS8qIENoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIHByb3RlY3Rpb24gcmVnaXN0ZXJzICovCi0JaWYoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCY2NCkpewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBmbGFzaCBkZXZpY2UgaGFzIG5vIHByb3RlY3Rpb24gZGF0YSB0byByZWFkIVxuIixtYXAtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQliYXNlX29mZnN0PSgxPDxleHRwLT5GYWN0UHJvdFJlZ1NpemUpOwotCXJlZ19zej0oMTw8ZXh0cC0+VXNlclByb3RSZWdTaXplKTsKLQotCXJldHVybiBjZmlfaW50ZWxleHRfcmVhZF9wcm90X3JlZyhtdGQsIGZyb20sIGxlbiwgcmV0bGVuLCBidWYsIGJhc2Vfb2Zmc3QsIHJlZ19zeik7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYWRfZmFjdF9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCi17Ci0Jc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7Ci0Jc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7Ci0Jc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHA9Y2ZpLT5jbWRzZXRfcHJpdjsKLQlpbnQgYmFzZV9vZmZzdCxyZWdfc3o7Ci0JCi0JLyogQ2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgcHJvdGVjdGlvbiByZWdpc3RlcnMgKi8KLQlpZighZXh0cCB8fCAhKGV4dHAtPkZlYXR1cmVTdXBwb3J0JjY0KSl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaGlzIGZsYXNoIGRldmljZSBoYXMgbm8gcHJvdGVjdGlvbiBkYXRhIHRvIHJlYWQhXG4iLG1hcC0+bmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWJhc2Vfb2Zmc3Q9MDsKLQlyZWdfc3o9KDE8PGV4dHAtPkZhY3RQcm90UmVnU2l6ZSk7Ci0KLQlyZXR1cm4gY2ZpX2ludGVsZXh0X3JlYWRfcHJvdF9yZWcobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBiYXNlX29mZnN0LCByZWdfc3opOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgX194aXByYW0gZG9fd3JpdGVfb25ld29yZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRyLCBtYXBfd29yZCBkYXR1bSkKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRyLCBtYXBfd29yZCBkYXR1bSwgaW50IG1vZGUpCiB7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7Ci0JbWFwX3dvcmQgc3RhdHVzLCBzdGF0dXNfT0s7CisJbWFwX3dvcmQgc3RhdHVzLCBzdGF0dXNfT0ssIHdyaXRlX2NtZDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvOwogCWludCB6LCByZXQ9MDsKIApAQCAtMTI4OCw5ICsxMjE1LDE0IEBACiAKIAkvKiBMZXQncyBkZXRlcm1pbmUgdGhpcyBhY2NvcmRpbmcgdG8gdGhlIGludGVybGVhdmUgb25seSBvbmNlICovCiAJc3RhdHVzX09LID0gQ01EKDB4ODApOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRkxfV1JJVElORzogICB3cml0ZV9jbWQgPSBDTUQoMHg0MCk7IGJyZWFrOworCWNhc2UgRkxfT1RQX1dSSVRFOiB3cml0ZV9jbWQgPSBDTUQoMHhjMCk7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KIAogCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7Ci0JcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBhZHIsIEZMX1dSSVRJTkcpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBtb2RlKTsKIAlpZiAocmV0KSB7CiAJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKQEAgLTEyOTksMTkgKzEyMzEsMTggQEAKIAlYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBtYXBfYmFua3dpZHRoKG1hcCkpOwogCUVOQUJMRV9WUFAobWFwKTsKIAl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcik7Ci0JbWFwX3dyaXRlKG1hcCwgQ01EKDB4NDApLCBhZHIpOworCW1hcF93cml0ZShtYXAsIHdyaXRlX2NtZCwgYWRyKTsKIAltYXBfd3JpdGUobWFwLCBkYXR1bSwgYWRyKTsKLQljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CisJY2hpcC0+c3RhdGUgPSBtb2RlOwogCi0Jc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBtYXBfYmFua3dpZHRoKG1hcCkpOwotCVVERUxBWShtYXAsIGNoaXAsIGFkciwgY2hpcC0+d29yZF93cml0ZV90aW1lKTsKLQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIG1hcF9iYW5rd2lkdGgobWFwKSwKKwkJCQljaGlwLT53b3JkX3dyaXRlX3RpbWUpOwogCiAJdGltZW8gPSBqaWZmaWVzICsgKEhaLzIpOwogCXogPSAwOwogCWZvciAoOzspIHsKLQkJaWYgKGNoaXAtPnN0YXRlICE9IEZMX1dSSVRJTkcpIHsKKwkJaWYgKGNoaXAtPnN0YXRlICE9IG1vZGUpIHsKIAkJCS8qIFNvbWVvbmUncyBzdXNwZW5kZWQgdGhlIHdyaXRlLiBTbGVlcCAqLwogCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTEzMzksMTAgKzEyNzAsOCBAQAogCQl9CiAKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQl6Kys7CiAJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMSk7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJfQogCWlmICgheikgewogCQljaGlwLT53b3JkX3dyaXRlX3RpbWUtLTsKQEAgLTEzOTksNyArMTMyOCw3IEBACiAJCWRhdHVtID0gbWFwX3dvcmRfbG9hZF9wYXJ0aWFsKG1hcCwgZGF0dW0sIGJ1ZiwgZ2FwLCBuKTsKIAogCQlyZXQgPSBkb193cml0ZV9vbmV3b3JkKG1hcCwgJmNmaS0+Y2hpcHNbY2hpcG51bV0sCi0JCQkJCSAgICAgICBidXNfb2ZzLCBkYXR1bSk7CisJCQkJCSAgICAgICBidXNfb2ZzLCBkYXR1bSwgRkxfV1JJVElORyk7CiAJCWlmIChyZXQpIAogCQkJcmV0dXJuIHJldDsKIApAQCAtMTQyMCw3ICsxMzQ5LDcgQEAKIAkJbWFwX3dvcmQgZGF0dW0gPSBtYXBfd29yZF9sb2FkKG1hcCwgYnVmKTsKIAogCQlyZXQgPSBkb193cml0ZV9vbmV3b3JkKG1hcCwgJmNmaS0+Y2hpcHNbY2hpcG51bV0sCi0JCQkJb2ZzLCBkYXR1bSk7CisJCQkJICAgICAgIG9mcywgZGF0dW0sIEZMX1dSSVRJTkcpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTQ0NCw3ICsxMzczLDcgQEAKIAkJZGF0dW0gPSBtYXBfd29yZF9sb2FkX3BhcnRpYWwobWFwLCBkYXR1bSwgYnVmLCAwLCBsZW4pOwogCiAJCXJldCA9IGRvX3dyaXRlX29uZXdvcmQobWFwLCAmY2ZpLT5jaGlwc1tjaGlwbnVtXSwKLQkJCQkJICAgICAgIG9mcywgZGF0dW0pOworCQkJCSAgICAgICBvZnMsIGRhdHVtLCBGTF9XUklUSU5HKTsKIAkJaWYgKHJldCkgCiAJCQlyZXR1cm4gcmV0OwogCQkKQEAgLTE1MDYsOSArMTQzNSw3IEBACiAJCWlmIChtYXBfd29yZF9hbmRlcXVhbChtYXAsIHN0YXR1cywgc3RhdHVzX09LLCBzdGF0dXNfT0spKQogCQkJYnJlYWs7CiAKLQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlVREVMQVkobWFwLCBjaGlwLCBjbWRfYWRyLCAxKTsKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAogCQlpZiAoKyt6ID4gMjApIHsKIAkJCS8qIEFyZ2guIE5vdCByZWFkeSBmb3Igd3JpdGUgdG8gYnVmZmVyICovCkBAIC0xNTU0LDEwICsxNDgxLDkgQEAKIAltYXBfd3JpdGUobWFwLCBDTUQoMHhkMCksIGNtZF9hZHIpOwogCWNoaXAtPnN0YXRlID0gRkxfV1JJVElORzsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsKLQlVREVMQVkobWFwLCBjaGlwLCBjbWRfYWRyLCBjaGlwLT5idWZmZXJfd3JpdGVfdGltZSk7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIAorCQkJCWNtZF9hZHIsIGxlbiwKKwkJCQljaGlwLT5idWZmZXJfd3JpdGVfdGltZSk7CiAKIAl0aW1lbyA9IGppZmZpZXMgKyAoSFovMik7CiAJeiA9IDA7CkBAIC0xNTg5LDEwICsxNTE1LDggQEAKIAkJfQogCQkKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCQlVREVMQVkobWFwLCBjaGlwLCBjbWRfYWRyLCAxKTsKIAkJeisrOwotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlVREVMQVkobWFwLCBjaGlwLCBjbWRfYWRyLCAxKTsKIAl9CiAJaWYgKCF6KSB7CiAJCWNoaXAtPmJ1ZmZlcl93cml0ZV90aW1lLS07CkBAIC0xNzIwLDEwICsxNjQ0LDkgQEAKIAljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CiAJY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkID0gMDsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsKLQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIGNoaXAtPmVyYXNlX3RpbWUqMTAwMC8yKTsKLQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIGxlbiwKKwkJCQljaGlwLT5lcmFzZV90aW1lKjEwMDAvMik7CiAKIAkvKiBGSVhNRS4gVXNlIGEgdGltZXIgdG8gY2hlY2sgdGhpcywgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gKi8KIAkvKiBPbmNlIHRoZSBzdGF0ZSBtYWNoaW5lJ3Mga25vd24gdG8gYmUgd29ya2luZyBJJ2xsIGRvIHRoYXQgKi8KQEAgLTE3NjgsOSArMTY5MSw3IEBACiAJCX0KIAkJCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCAxMDAwMDAwL0haKTsKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAl9CiAKIAkvKiBXZSd2ZSBicm9rZW4gdGhpcyBiZWZvcmUuIEl0IGRvZXNuJ3QgaHVydCB0byBiZSBzYWZlICovCkBAIC0xNzgwLDQ0ICsxNzAxLDM0IEBACiAKIAkvKiBjaGVjayBmb3IgbG9jayBiaXQgKi8KIAlpZiAobWFwX3dvcmRfYml0c3NldChtYXAsIHN0YXR1cywgQ01EKDB4M2EpKSkgewotCQl1bnNpZ25lZCBjaGFyIGNoaXBzdGF0dXM7CisJCXVuc2lnbmVkIGxvbmcgY2hpcHN0YXR1czsKIAogCQkvKiBSZXNldCB0aGUgZXJyb3IgYml0cyAqLwogCQltYXBfd3JpdGUobWFwLCBDTUQoMHg1MCksIGFkcik7CiAJCW1hcF93cml0ZShtYXAsIENNRCgweDcwKSwgYWRyKTsKIAkJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcik7CiAKLQkJY2hpcHN0YXR1cyA9IHN0YXR1cy54WzBdOwotCQlpZiAoIW1hcF93b3JkX2VxdWFsKG1hcCwgc3RhdHVzLCBDTUQoY2hpcHN0YXR1cykpKSB7Ci0JCQlpbnQgaSwgdzsKLQkJCWZvciAodz0wOyB3PG1hcF93b3JkcyhtYXApOyB3KyspIHsKLQkJCQlmb3IgKGkgPSAwOyBpPGNmaV9pbnRlcmxlYXZlKGNmaSk7IGkrKykgewotCQkJCQljaGlwc3RhdHVzIHw9IHN0YXR1cy54W3ddID4+IChjZmktPmRldmljZV90eXBlICogOCk7Ci0JCQkJfQotCQkJfQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3RhdHVzIGlzIG5vdCBpZGVudGljYWwgZm9yIGFsbCBjaGlwczogMHglbHguIE1lcmdpbmcgdG8gZ2l2ZSAweCUwMnhcbiIsCi0JCQkgICAgICAgc3RhdHVzLnhbMF0sIGNoaXBzdGF0dXMpOwotCQl9CisJCWNoaXBzdGF0dXMgPSBNRVJHRVNUQVRVUyhzdGF0dXMpOwogCiAJCWlmICgoY2hpcHN0YXR1cyAmIDB4MzApID09IDB4MzApIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiQ2hpcCByZXBvcnRzIGltcHJvcGVyIGNvbW1hbmQgc2VxdWVuY2U6IHN0YXR1cyAweCV4XG4iLCBjaGlwc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiQ2hpcCByZXBvcnRzIGltcHJvcGVyIGNvbW1hbmQgc2VxdWVuY2U6IHN0YXR1cyAweCVseFxuIiwgY2hpcHN0YXR1cyk7CiAJCQlyZXQgPSAtRUlPOwogCQl9IGVsc2UgaWYgKGNoaXBzdGF0dXMgJiAweDAyKSB7CiAJCQkvKiBQcm90ZWN0aW9uIGJpdCBzZXQgKi8KIAkJCXJldCA9IC1FUk9GUzsKIAkJfSBlbHNlIGlmIChjaGlwc3RhdHVzICYgMHg4KSB7CiAJCQkvKiBWb2x0YWdlICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJDaGlwIHJlcG9ydHMgdm9sdGFnZSBsb3cgb24gZXJhc2U6IHN0YXR1cyAweCV4XG4iLCBjaGlwc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNoaXAgcmVwb3J0cyB2b2x0YWdlIGxvdyBvbiBlcmFzZTogc3RhdHVzIDB4JWx4XG4iLCBjaGlwc3RhdHVzKTsKIAkJCXJldCA9IC1FSU87CiAJCX0gZWxzZSBpZiAoY2hpcHN0YXR1cyAmIDB4MjApIHsKIAkJCWlmIChyZXRyaWVzLS0pIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JXguIFJldHJ5aW5nLi4uXG4iLCBhZHIsIGNoaXBzdGF0dXMpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJDaGlwIGVyYXNlIGZhaWxlZCBhdCAweCUwOGx4OiBzdGF0dXMgMHglbHguIFJldHJ5aW5nLi4uXG4iLCBhZHIsIGNoaXBzdGF0dXMpOwogCQkJCXRpbWVvID0gamlmZmllcyArIEhaOwogCQkJCXB1dF9jaGlwKG1hcCwgY2hpcCwgYWRyKTsKIAkJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQkJZ290byByZXRyeTsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0RFQlVHICJDaGlwIGVyYXNlIGZhaWxlZCBhdCAweCUwOGx4OiBzdGF0dXMgMHgleFxuIiwgYWRyLCBjaGlwc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDaGlwIGVyYXNlIGZhaWxlZCBhdCAweCUwOGx4OiBzdGF0dXMgMHglbHhcbiIsIGFkciwgY2hpcHN0YXR1cyk7CiAJCQlyZXQgPSAtRUlPOwogCQl9CiAJfSBlbHNlIHsKQEAgLTE4ODIsNiArMTc5Myw3IEBACiAJCQogCQlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfU1lOQ0lORykgewogCQkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKKwkJCWNoaXAtPm9sZHN0YXRlID0gRkxfUkVBRFk7CiAJCQl3YWtlX3VwKCZjaGlwLT53cSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwpAQCAtMTg5Nyw4ICsxODA5LDkgQEAKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAlpbnQgc3RhdHVzLCBvZnNfZmFjdG9yID0gY2ZpLT5pbnRlcmxlYXZlICogY2ZpLT5kZXZpY2VfdHlwZTsKIAorCWFkciArPSBjaGlwLT5zdGFydDsKIAl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcisoMipvZnNfZmFjdG9yKSk7Ci0JY2ZpX3NlbmRfZ2VuX2NtZCgweDkwLCAweDU1LCAwLCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CisJbWFwX3dyaXRlKG1hcCwgQ01EKDB4OTApLCBhZHIrKDIqb2ZzX2ZhY3RvcikpOwogCWNoaXAtPnN0YXRlID0gRkxfSkVERUNfUVVFUlk7CiAJc3RhdHVzID0gY2ZpX3JlYWRfcXVlcnkobWFwLCBhZHIrKDIqb2ZzX2ZhY3RvcikpOwogCXhpcF9lbmFibGUobWFwLCBjaGlwLCAwKTsKQEAgLTE5MTUsNiArMTgyOCw3IEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRyLCBpbnQgbGVuLCB2b2lkICp0aHVuaykKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCAqZXh0cCA9IGNmaS0+Y21kc2V0X3ByaXY7CiAJbWFwX3dvcmQgc3RhdHVzLCBzdGF0dXNfT0s7CiAJdW5zaWduZWQgbG9uZyB0aW1lbyA9IGppZmZpZXMgKyBIWjsKIAlpbnQgcmV0OwpAQCAtMTk0NCw5ICsxODU4LDEzIEBACiAJfSBlbHNlCiAJCUJVRygpOwogCi0Jc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkvKgorCSAqIElmIEluc3RhbnQgSW5kaXZpZHVhbCBCbG9jayBMb2NraW5nIHN1cHBvcnRlZCB0aGVuIG5vIG5lZWQKKwkgKiB0byBkZWxheS4KKwkgKi8KKworCWlmICghZXh0cCB8fCAhKGV4dHAtPkZlYXR1cmVTdXBwb3J0ICYgKDEgPDwgNSkpKQorCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEwMDAwMDAvSFopOwogCiAJLyogRklYTUUuIFVzZSBhIHRpbWVyIHRvIGNoZWNrIHRoaXMsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuICovCiAJLyogT25jZSB0aGUgc3RhdGUgbWFjaGluZSdzIGtub3duIHRvIGJlIHdvcmtpbmcgSSdsbCBkbyB0aGF0ICovCkBAIC0xOTczLDkgKzE4OTEsNyBAQAogCQl9CiAJCQogCQkvKiBMYXRlbmN5IGlzc3Vlcy4gRHJvcCB0aGUgbG9jaywgd2FpdCBhIHdoaWxlIGFuZCByZXRyeSAqLwotCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMSk7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJfQogCQogCS8qIERvbmUgYW5kIGhhcHB5LiAqLwpAQCAtMjAzNCw2ICsxOTUwLDI3NCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfTVREX09UUAorCit0eXBlZGVmIGludCAoKm90cF9vcF90KShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgCisJCQl1X2xvbmcgZGF0YV9vZmZzZXQsIHVfY2hhciAqYnVmLCB1X2ludCBzaXplLAorCQkJdV9sb25nIHByb3Rfb2Zmc2V0LCB1X2ludCBncm91cG5vLCB1X2ludCBncm91cHNpemUpOworCitzdGF0aWMgaW50IF9feGlwcmFtCitkb19vdHBfcmVhZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdV9sb25nIG9mZnNldCwKKwkgICAgdV9jaGFyICpidWYsIHVfaW50IHNpemUsIHVfbG9uZyBwcm90LCB1X2ludCBncnBubywgdV9pbnQgZ3Jwc3opCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJaW50IHJldDsKKworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCwgRkxfSkVERUNfUVVFUlkpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGxldCdzIGVuc3VyZSB3ZSdyZSBub3QgcmVhZGluZyBiYWNrIGNhY2hlZCBkYXRhIGZyb20gYXJyYXkgbW9kZSAqLworCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgY2hpcC0+c3RhcnQgKyBvZmZzZXQsIHNpemUpOworCisJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7CisJaWYgKGNoaXAtPnN0YXRlICE9IEZMX0pFREVDX1FVRVJZKSB7CisJCW1hcF93cml0ZShtYXAsIENNRCgweDkwKSwgY2hpcC0+c3RhcnQpOworCQljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOworCX0KKwltYXBfY29weV9mcm9tKG1hcCwgYnVmLCBjaGlwLT5zdGFydCArIG9mZnNldCwgc2l6ZSk7CisJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0KTsKKworCS8qIHRoZW4gZW5zdXJlIHdlIGRvbid0IGtlZXAgT1RQIGRhdGEgaW4gdGhlIGNhY2hlICovCisJSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBjaGlwLT5zdGFydCArIG9mZnNldCwgc2l6ZSk7CisKKwlwdXRfY2hpcChtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX290cF93cml0ZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdV9sb25nIG9mZnNldCwKKwkgICAgIHVfY2hhciAqYnVmLCB1X2ludCBzaXplLCB1X2xvbmcgcHJvdCwgdV9pbnQgZ3Jwbm8sIHVfaW50IGdycHN6KQoreworCWludCByZXQ7CisKKwl3aGlsZSAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIGJ1c19vZnMgPSBvZmZzZXQgJiB+KG1hcF9iYW5rd2lkdGgobWFwKS0xKTsKKwkJaW50IGdhcCA9IG9mZnNldCAtIGJ1c19vZnM7CisJCWludCBuID0gbWluX3QoaW50LCBzaXplLCBtYXBfYmFua3dpZHRoKG1hcCktZ2FwKTsKKwkJbWFwX3dvcmQgZGF0dW0gPSBtYXBfd29yZF9mZihtYXApOworCisJCWRhdHVtID0gbWFwX3dvcmRfbG9hZF9wYXJ0aWFsKG1hcCwgZGF0dW0sIGJ1ZiwgZ2FwLCBuKTsKKwkJcmV0ID0gZG9fd3JpdGVfb25ld29yZChtYXAsIGNoaXAsIGJ1c19vZnMsIGRhdHVtLCBGTF9PVFBfV1JJVEUpOworCQlpZiAocmV0KSAKKwkJCXJldHVybiByZXQ7CisKKwkJb2Zmc2V0ICs9IG47CisJCWJ1ZiArPSBuOworCQlzaXplIC09IG47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX290cF9sb2NrKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCB1X2xvbmcgb2Zmc2V0LAorCSAgICB1X2NoYXIgKmJ1ZiwgdV9pbnQgc2l6ZSwgdV9sb25nIHByb3QsIHVfaW50IGdycG5vLCB1X2ludCBncnBzeikKK3sKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwltYXBfd29yZCBkYXR1bTsKKworCS8qIG1ha2Ugc3VyZSBhcmVhIG1hdGNoZXMgZ3JvdXAgYm91bmRhcmllcyAqLworCWlmIChzaXplICE9IGdycHN6KQorCQlyZXR1cm4gLUVYREVWOworCisJZGF0dW0gPSBtYXBfd29yZF9mZihtYXApOworCWRhdHVtID0gbWFwX3dvcmRfY2xyKG1hcCwgZGF0dW0sIENNRCgxIDw8IGdycG5vKSk7CisJcmV0dXJuIGRvX3dyaXRlX29uZXdvcmQobWFwLCBjaGlwLCBwcm90LCBkYXR1bSwgRkxfT1RQX1dSSVRFKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfb3RwX3dhbGsoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCQkJCSBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYsCisJCQkJIG90cF9vcF90IGFjdGlvbiwgaW50IHVzZXJfcmVncykKK3sKKwlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCAqZXh0cCA9IGNmaS0+Y21kc2V0X3ByaXY7CisJc3RydWN0IGZsY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgY2ZpX2ludGVsZXh0X290cGluZm8gKm90cDsKKwl1X2xvbmcgZGV2c2l6ZSwgcmVnX3Byb3Rfb2Zmc2V0LCBkYXRhX29mZnNldDsKKwl1X2ludCBjaGlwX251bSwgY2hpcF9zdGVwLCBmaWVsZCwgcmVnX2ZhY3Rfc2l6ZSwgcmVnX3VzZXJfc2l6ZTsKKwl1X2ludCBncm91cHMsIGdyb3Vwbm8sIGdyb3Vwc2l6ZSwgcmVnX2ZhY3RfZ3JvdXBzLCByZWdfdXNlcl9ncm91cHM7CisJaW50IHJldDsKKworCSpyZXRsZW4gPSAwOworCisJLyogQ2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgT1RQIHJlZ2lzdGVycyAqLworCWlmICghZXh0cCB8fCAhKGV4dHAtPkZlYXR1cmVTdXBwb3J0ICYgNjQpIHx8ICFleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkvKiB3ZSBuZWVkIHJlYWwgY2hpcHMgaGVyZSBub3QgdmlydHVhbCBvbmVzICovCisJZGV2c2l6ZSA9ICgxIDw8IGNmaS0+Y2ZpcS0+RGV2U2l6ZSkgKiBjZmktPmludGVybGVhdmU7CisJY2hpcF9zdGVwID0gZGV2c2l6ZSA+PiBjZmktPmNoaXBzaGlmdDsKKwljaGlwX251bSA9IDA7CisKKwkvKiBTb21lIGNoaXBzIGhhdmUgT1RQIGxvY2F0ZWQgaW4gdGhlIF90b3BfIHBhcnRpdGlvbiBvbmx5LgorCSAgIEZvciBleGFtcGxlOiBJbnRlbCAyOEYyNTZMMThUIChUIG1lYW5zIHRvcC1wYXJhbWV0ZXIgZGV2aWNlKSAqLworCWlmIChjZmktPm1mciA9PSBNQU5VRkFDVFVSRVJfSU5URUwpIHsKKwkJc3dpdGNoIChjZmktPmlkKSB7CisJCWNhc2UgMHg4ODBiOgorCQljYXNlIDB4ODgwYzoKKwkJY2FzZSAweDg4MGQ6CisJCQljaGlwX251bSA9IGNoaXBfc3RlcCAtIDE7CisJCX0KKwl9CisKKwlmb3IgKCA7IGNoaXBfbnVtIDwgY2ZpLT5udW1jaGlwczsgY2hpcF9udW0gKz0gY2hpcF9zdGVwKSB7CisJCWNoaXAgPSAmY2ZpLT5jaGlwc1tjaGlwX251bV07CisJCW90cCA9IChzdHJ1Y3QgY2ZpX2ludGVsZXh0X290cGluZm8gKikmZXh0cC0+ZXh0cmFbMF07CisKKwkJLyogZmlyc3QgT1RQIHJlZ2lvbiAqLworCQlmaWVsZCA9IDA7CisJCXJlZ19wcm90X29mZnNldCA9IGV4dHAtPlByb3RSZWdBZGRyOworCQlyZWdfZmFjdF9ncm91cHMgPSAxOworCQlyZWdfZmFjdF9zaXplID0gMSA8PCBleHRwLT5GYWN0UHJvdFJlZ1NpemU7CisJCXJlZ191c2VyX2dyb3VwcyA9IDE7CisJCXJlZ191c2VyX3NpemUgPSAxIDw8IGV4dHAtPlVzZXJQcm90UmVnU2l6ZTsKKworCQl3aGlsZSAobGVuID4gMCkgeworCQkJLyogZmxhc2ggZ2VvbWV0cnkgZml4dXAgKi8KKwkJCWRhdGFfb2Zmc2V0ID0gcmVnX3Byb3Rfb2Zmc2V0ICsgMTsKKwkJCWRhdGFfb2Zmc2V0ICo9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7CisJCQlyZWdfcHJvdF9vZmZzZXQgKj0gY2ZpLT5pbnRlcmxlYXZlICogY2ZpLT5kZXZpY2VfdHlwZTsKKwkJCXJlZ19mYWN0X3NpemUgKj0gY2ZpLT5pbnRlcmxlYXZlOworCQkJcmVnX3VzZXJfc2l6ZSAqPSBjZmktPmludGVybGVhdmU7CisKKwkJCWlmICh1c2VyX3JlZ3MpIHsKKwkJCQlncm91cHMgPSByZWdfdXNlcl9ncm91cHM7CisJCQkJZ3JvdXBzaXplID0gcmVnX3VzZXJfc2l6ZTsKKwkJCQkvKiBza2lwIG92ZXIgZmFjdG9yeSByZWcgYXJlYSAqLworCQkJCWdyb3Vwbm8gPSByZWdfZmFjdF9ncm91cHM7CisJCQkJZGF0YV9vZmZzZXQgKz0gcmVnX2ZhY3RfZ3JvdXBzICogcmVnX2ZhY3Rfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJZ3JvdXBzID0gcmVnX2ZhY3RfZ3JvdXBzOworCQkJCWdyb3Vwc2l6ZSA9IHJlZ19mYWN0X3NpemU7CisJCQkJZ3JvdXBubyA9IDA7CisJCQl9CisKKwkJCXdoaWxlIChsZW4gPiAwICYmIGdyb3VwcyA+IDApIHsKKwkJCQlpZiAoIWFjdGlvbikgeworCQkJCQkvKgorCQkJCQkgKiBTcGVjaWFsIGNhc2U6IGlmIGFjdGlvbiBpcyBOVUxMCisJCQkJCSAqIHdlIGZpbGwgYnVmIHdpdGggb3RwX2luZm8gcmVjb3Jkcy4KKwkJCQkJICovCisJCQkJCXN0cnVjdCBvdHBfaW5mbyAqb3RwaW5mbzsKKwkJCQkJbWFwX3dvcmQgbG9ja3dvcmQ7CisJCQkJCWxlbiAtPSBzaXplb2Yoc3RydWN0IG90cF9pbmZvKTsKKwkJCQkJaWYgKGxlbiA8PSAwKQorCQkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJCXJldCA9IGRvX290cF9yZWFkKG1hcCwgY2hpcCwKKwkJCQkJCQkgIHJlZ19wcm90X29mZnNldCwKKwkJCQkJCQkgICh1X2NoYXIgKikmbG9ja3dvcmQsCisJCQkJCQkJICBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJCQkJICAwLCAwLCAgMCk7CisJCQkJCWlmIChyZXQpCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCQlvdHBpbmZvID0gKHN0cnVjdCBvdHBfaW5mbyAqKWJ1ZjsKKwkJCQkJb3RwaW5mby0+c3RhcnQgPSBmcm9tOworCQkJCQlvdHBpbmZvLT5sZW5ndGggPSBncm91cHNpemU7CisJCQkJCW90cGluZm8tPmxvY2tlZCA9CisJCQkJCSAgICFtYXBfd29yZF9iaXRzc2V0KG1hcCwgbG9ja3dvcmQsCisJCQkJCQkJICAgICBDTUQoMSA8PCBncm91cG5vKSk7CisJCQkJCWZyb20gKz0gZ3JvdXBzaXplOworCQkJCQlidWYgKz0gc2l6ZW9mKCpvdHBpbmZvKTsKKwkJCQkJKnJldGxlbiArPSBzaXplb2YoKm90cGluZm8pOworCQkJCX0gZWxzZSBpZiAoZnJvbSA+PSBncm91cHNpemUpIHsKKwkJCQkJZnJvbSAtPSBncm91cHNpemU7CisJCQkJCWRhdGFfb2Zmc2V0ICs9IGdyb3Vwc2l6ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgc2l6ZSA9IGdyb3Vwc2l6ZTsKKwkJCQkJZGF0YV9vZmZzZXQgKz0gZnJvbTsKKwkJCQkJc2l6ZSAtPSBmcm9tOworCQkJCQlmcm9tID0gMDsKKwkJCQkJaWYgKHNpemUgPiBsZW4pCisJCQkJCQlzaXplID0gbGVuOworCQkJCQlyZXQgPSBhY3Rpb24obWFwLCBjaGlwLCBkYXRhX29mZnNldCwKKwkJCQkJCSAgICAgYnVmLCBzaXplLCByZWdfcHJvdF9vZmZzZXQsCisJCQkJCQkgICAgIGdyb3Vwbm8sIGdyb3Vwc2l6ZSk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJYnVmICs9IHNpemU7CisJCQkJCWxlbiAtPSBzaXplOworCQkJCQkqcmV0bGVuICs9IHNpemU7CisJCQkJCWRhdGFfb2Zmc2V0ICs9IHNpemU7CisJCQkJfQorCQkJCWdyb3Vwbm8rKzsKKwkJCQlncm91cHMtLTsKKwkJCX0KKworCQkJLyogbmV4dCBPVFAgcmVnaW9uICovCisJCQlpZiAoKytmaWVsZCA9PSBleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzKQorCQkJCWJyZWFrOworCQkJcmVnX3Byb3Rfb2Zmc2V0ID0gb3RwLT5Qcm90UmVnQWRkcjsKKwkJCXJlZ19mYWN0X2dyb3VwcyA9IG90cC0+RmFjdEdyb3VwczsKKwkJCXJlZ19mYWN0X3NpemUgPSAxIDw8IG90cC0+RmFjdFByb3RSZWdTaXplOworCQkJcmVnX3VzZXJfZ3JvdXBzID0gb3RwLT5Vc2VyR3JvdXBzOworCQkJcmVnX3VzZXJfc2l6ZSA9IDEgPDwgb3RwLT5Vc2VyUHJvdFJlZ1NpemU7CisJCQlvdHArKzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLAorCQkJCQkgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwKKwkJCQkJICAgIHVfY2hhciAqYnVmKQoreworCXJldHVybiBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwKKwkJCQkgICAgIGJ1ZiwgZG9fb3RwX3JlYWQsIDApOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLAorCQkJCQkgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwKKwkJCQkJICAgIHVfY2hhciAqYnVmKQoreworCXJldHVybiBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwKKwkJCQkgICAgIGJ1ZiwgZG9fb3RwX3JlYWQsIDEpOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF93cml0ZV91c2VyX3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCQkJICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLAorCQkJCQkgICAgIHVfY2hhciAqYnVmKQoreworCXJldHVybiBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwKKwkJCQkgICAgIGJ1ZiwgZG9fb3RwX3dyaXRlLCAxKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfbG9ja191c2VyX3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCQkgICBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgcmV0bGVuOworCXJldHVybiBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCBmcm9tLCBsZW4sICZyZXRsZW4sCisJCQkJICAgICBOVUxMLCBkb19vdHBfbG9jaywgMSk7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2dldF9mYWN0X3Byb3RfaW5mbyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgCisJCQkJCSAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCByZXRsZW47CisJaW50IHJldDsKKworCXJldCA9IGNmaV9pbnRlbGV4dF9vdHBfd2FsayhtdGQsIDAsIGxlbiwgJnJldGxlbiwgKHVfY2hhciAqKWJ1ZiwgTlVMTCwgMCk7CisJcmV0dXJuIHJldCA/IDogcmV0bGVuOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9nZXRfdXNlcl9wcm90X2luZm8oc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJCSAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCByZXRsZW47CisJaW50IHJldDsKKworCXJldCA9IGNmaV9pbnRlbGV4dF9vdHBfd2FsayhtdGQsIDAsIGxlbiwgJnJldGxlbiwgKHVfY2hhciAqKWJ1ZiwgTlVMTCwgMSk7CisJcmV0dXJuIHJldCA/IDogcmV0bGVuOworfQorCisjZW5kaWYKKwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfc3VzcGVuZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKQEAgLTIxMjUsMTAgKzIzMDksNDYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3Jlc2V0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCWludCBpLCByZXQ7CisKKwlmb3IgKGk9MDsgaSA8IGNmaS0+bnVtY2hpcHM7IGkrKykgeworCQlzdHJ1Y3QgZmxjaGlwICpjaGlwID0gJmNmaS0+Y2hpcHNbaV07CisKKwkJLyogZm9yY2UgdGhlIGNvbXBsZXRpb24gb2YgYW55IG9uZ29pbmcgb3BlcmF0aW9uCisJCSAgIGFuZCBzd2l0Y2ggdG8gYXJyYXkgbW9kZSBzbyBhbnkgYm9vdGxvYWRlciBpbiAKKwkJICAgZmxhc2ggaXMgYWNjZXNzaWJsZSBmb3Igc29mdCByZWJvb3QuICovCisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQsIEZMX1NZTkNJTkcpOworCQlpZiAoIXJldCkgeworCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZmYpLCBjaGlwLT5zdGFydCk7CisJCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOworCQl9CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICAgIHZvaWQgKnYpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisKKwltdGQgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBtdGRfaW5mbywgcmVib290X25vdGlmaWVyKTsKKwljZmlfaW50ZWxleHRfcmVzZXQobXRkKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKIHN0YXRpYyB2b2lkIGNmaV9pbnRlbGV4dF9kZXN0cm95KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCWNmaV9pbnRlbGV4dF9yZXNldChtdGQpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZtdGQtPnJlYm9vdF9ub3RpZmllcik7CiAJa2ZyZWUoY2ZpLT5jbWRzZXRfcHJpdik7CiAJa2ZyZWUoY2ZpLT5jZmlxKTsKIAlrZnJlZShjZmktPmNoaXBzWzBdLnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwppbmRleCBmY2E4ZmY2Li44NTA1ZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwpAQCAtNCwxNiArNCwyMCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCBDcm9zc25ldCBDby4gPGluZm9AY3Jvc3NuZXQuY28uanA+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQXJjb20gQ29udHJvbCBTeXN0ZW1zIEx0ZCA8bGludXhAYXJjb20uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CiAgKgogICogMl9ieV84IHJvdXRpbmVzIGFkZGVkIGJ5IFNpbW9uIE11bnRvbgogICoKICAqIDRfYnlfMTYgd29yayBieSBDYXJvbHluIEouIFNtaXRoCiAgKgorICogWElQIHN1cHBvcnQgaG9va3MgYnkgVml0YWx5IFdvb2wgKGJhc2VkIG9uIGNvZGUgZm9yIEludGVsIGZsYXNoIAorICogYnkgTmljb2xhcyBQaXRyZSkKKyAqIAogICogT2NjYXNpb25hbGx5IG1haW50YWluZWQgYnkgVGhheW5lIEhhcmJhdWdoIHRoYXJiYXVnaCBhdCBsbnhpIGRvdCBjb20KICAqCiAgKiBUaGlzIGNvZGUgaXMgR1BMCiAgKgotICogJElkOiBjZmlfY21kc2V0XzAwMDIuYyx2IDEuMTE0IDIwMDQvMTIvMTEgMTU6NDM6NTMgZGVkZWtpbmQgRXhwICQKKyAqICRJZDogY2ZpX2NtZHNldF8wMDAyLmMsdiAxLjExOCAyMDA1LzA3LzA0IDIyOjM0OjI5IGdsZWl4bmVyIEV4cCAkCiAgKgogICovCiAKQEAgLTM0LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9jZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQveGlwLmg+CiAKICNkZWZpbmUgQU1EX0JPT1RMT0NfQlVHCiAjZGVmaW5lIEZPUkNFX1dPUkRfV1JJVEUgMApAQCAtNDMsNiArNDgsNyBAQAogI2RlZmluZSBNQU5VRkFDVFVSRVJfQU1ECTB4MDAwMQogI2RlZmluZSBNQU5VRkFDVFVSRVJfU1NUCTB4MDBCRgogI2RlZmluZSBTU1Q0OUxGMDA0QgkgICAgICAgIDB4MDA2MAorI2RlZmluZSBTU1Q0OUxGMDA4QQkJMHgwMDVhCiAKIHN0YXRpYyBpbnQgY2ZpX2FtZHN0ZF9yZWFkIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IGNmaV9hbWRzdGRfd3JpdGVfd29yZHMoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgY29uc3QgdV9jaGFyICopOwpAQCAtMTkxLDYgKzE5Nyw3IEBACiB9Owogc3RhdGljIHN0cnVjdCBjZmlfZml4dXAgamVkZWNfZml4dXBfdGFibGVbXSA9IHsKIAl7IE1BTlVGQUNUVVJFUl9TU1QsIFNTVDQ5TEYwMDRCLCBmaXh1cF91c2VfZndoX2xvY2ssIE5VTEwsIH0sCisJeyBNQU5VRkFDVFVSRVJfU1NULCBTU1Q0OUxGMDA4QSwgZml4dXBfdXNlX2Z3aF9sb2NrLCBOVUxMLCB9LAogCXsgMCwgMCwgTlVMTCwgTlVMTCB9CiB9OwogCkBAIC0zOTEsNyArMzk4LDcgQEAKICAqIGNvcnJlY3RseSBhbmQgaXMgdGhlcmVmb3JlIG5vdCBkb25lCShwYXJ0aWN1bGFyeSB3aXRoIGludGVybGVhdmVkIGNoaXBzCiAgKiBhcyBlYWNoIGNoaXAgbXVzdCBiZSBjaGVja2VkIGluZGVwZW5kYW50bHkgb2YgdGhlIG90aGVycykuCiAgKi8KLXN0YXRpYyBpbnQgY2hpcF9yZWFkeShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGludCBfX3hpcHJhbSBjaGlwX3JlYWR5KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJbWFwX3dvcmQgZCwgdDsKIApAQCAtNDAxLDYgKzQwOCwzMiBAQAogCXJldHVybiBtYXBfd29yZF9lcXVhbChtYXAsIGQsIHQpOwogfQogCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGNoaXAgaXMgcmVhZHkgYW5kIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS4KKyAqCisgKiBSZWFkeSBpcyBvbmUgb2Y6IHJlYWQgbW9kZSwgcXVlcnkgbW9kZSwgZXJhc2Utc3VzcGVuZC1yZWFkIG1vZGUgKGluIGFueQorICogbm9uLXN1c3BlbmRlZCBzZWN0b3IpIGFuZCBpdCBpcyBpbmRpY2F0ZWQgYnkgbm8gYml0cyB0b2dnbGluZy4KKyAqCisgKiBFcnJvciBhcmUgaW5kaWNhdGVkIGJ5IHRvZ2dsaW5nIGJpdHMgb3IgYml0cyBoZWxkIHdpdGggdGhlIHdyb25nIHZhbHVlLAorICogb3Igd2l0aCBiaXRzIHRvZ2dsaW5nLgorICoKKyAqIE5vdGUgdGhhdCBhbnl0aGluZyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gY2hlY2tpbmcgaWYgbm8gYml0cyBhcmUgdG9nZ2xpbmcKKyAqIChpbmNsdWRpbmcgY2hlY2tpbmcgRFE1IGZvciBhbiBlcnJvciBzdGF0dXMpIGlzIHRyaWNreSB0byBnZXQgd29ya2luZworICogY29ycmVjdGx5IGFuZCBpcyB0aGVyZWZvcmUgbm90IGRvbmUJKHBhcnRpY3VsYXJ5IHdpdGggaW50ZXJsZWF2ZWQgY2hpcHMKKyAqIGFzIGVhY2ggY2hpcCBtdXN0IGJlIGNoZWNrZWQgaW5kZXBlbmRhbnRseSBvZiB0aGUgb3RoZXJzKS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX194aXByYW0gY2hpcF9nb29kKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIGFkZHIsIG1hcF93b3JkIGV4cGVjdGVkKQoreworCW1hcF93b3JkIG9sZGQsIGN1cmQ7CisKKwlvbGRkID0gbWFwX3JlYWQobWFwLCBhZGRyKTsKKwljdXJkID0gbWFwX3JlYWQobWFwLCBhZGRyKTsKKworCXJldHVybgltYXBfd29yZF9lcXVhbChtYXAsIG9sZGQsIGN1cmQpICYmIAorCQltYXBfd29yZF9lcXVhbChtYXAsIGN1cmQsIGV4cGVjdGVkKTsKK30KKwogc3RhdGljIGludCBnZXRfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIGludCBtb2RlKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtNDIwLDEyICs0NTMsMTIgQEAKIAogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJXYWl0aW5nIGZvciBjaGlwIHRvIGJlIHJlYWR5IHRpbWVkIG91dC5cbiIpOwotCQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQotCQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNmaV91ZGVsYXkoMSk7Ci0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQkvKiBTb21lb25lIGVsc2UgbWlnaHQgaGF2ZSBiZWVuIHBsYXlpbmcgd2l0aCBpdC4gKi8KIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTQ3MywxNSArNTA2LDIzIEBACiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQkKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQljZmlfdWRlbGF5KDEpOwotCQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJLyogTm9ib2R5IHdpbGwgdG91Y2ggaXQgd2hpbGUgaXQncyBpbiBzdGF0ZSBGTF9FUkFTRV9TVVNQRU5ESU5HLgogCQkJICAgU28gd2UgY2FuIGp1c3QgbG9vcCBoZXJlLiAqLwogCQl9CiAJCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CiAJCXJldHVybiAwOwogCisJY2FzZSBGTF9YSVBfV0hJTEVfRVJBU0lORzoKKwkJaWYgKG1vZGUgIT0gRkxfUkVBRFkgJiYgbW9kZSAhPSBGTF9QT0lOVCAmJgorCQkgICAgKCFjZmlwIHx8ICEoY2ZpcC0+RXJhc2VTdXNwZW5kJjIpKSkKKwkJCWdvdG8gc2xlZXA7CisJCWNoaXAtPm9sZHN0YXRlID0gY2hpcC0+c3RhdGU7CisJCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJCXJldHVybiAwOworCiAJY2FzZSBGTF9QT0lOVDoKIAkJLyogT25seSBpZiB0aGVyZSdzIG5vIG9wZXJhdGlvbiBzdXNwZW5kZWQuLi4gKi8KIAkJaWYgKG1vZGUgPT0gRkxfUkVBRFkgJiYgY2hpcC0+b2xkc3RhdGUgPT0gRkxfUkVBRFkpCkBAIC00OTEsMTAgKzUzMiwxMCBAQAogCXNsZWVwOgogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXNjaGVkdWxlKCk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJZ290byByZXNldHRpbWU7CiAJfQogfQpAQCAtNTEyLDYgKzU1MywxMSBAQAogCQljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CiAJCWJyZWFrOwogCisJY2FzZSBGTF9YSVBfV0hJTEVfRVJBU0lORzoKKwkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKKwkJY2hpcC0+b2xkc3RhdGUgPSBGTF9SRUFEWTsKKwkJYnJlYWs7CisKIAljYXNlIEZMX1JFQURZOgogCWNhc2UgRkxfU1RBVFVTOgogCQkvKiBXZSBzaG91bGQgcmVhbGx5IG1ha2Ugc2V0X3ZwcCgpIGNvdW50LCByYXRoZXIgdGhhbiBkb2luZyB0aGlzICovCkBAIC01MjMsNiArNTY5LDE5OCBAQAogCXdha2VfdXAoJmNoaXAtPndxKTsKIH0KIAorI2lmZGVmIENPTkZJR19NVERfWElQCisKKy8qCisgKiBObyBpbnRlcnJ1cHQgd2hhdCBzbyBldmVyIGNhbiBiZSBzZXJ2aWNlZCB3aGlsZSB0aGUgZmxhc2ggaXNuJ3QgaW4gYXJyYXkKKyAqIG1vZGUuICBUaGlzIGlzIGVuc3VyZWQgYnkgdGhlIHhpcF9kaXNhYmxlKCkgYW5kIHhpcF9lbmFibGUoKSBmdW5jdGlvbnMKKyAqIGVuY2xvc2luZyBhbnkgY29kZSBwYXRoIHdoZXJlIHRoZSBmbGFzaCBpcyBrbm93biBub3QgdG8gYmUgaW4gYXJyYXkgbW9kZS4KKyAqIEFuZCB3aXRoaW4gYSBYSVAgZGlzYWJsZWQgY29kZSBwYXRoLCBvbmx5IGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCBfX3hpcHJhbQorICogbWF5IGJlIGNhbGxlZCBhbmQgbm90aGluZyBlbHNlIChpdCdzIGEgZ29vZCB0aGluZyB0byBpbnNwZWN0IGdlbmVyYXRlZAorICogYXNzZW1ibHkgdG8gbWFrZSBzdXJlIGlubGluZSBmdW5jdGlvbnMgd2VyZSBhY3R1YWxseSBpbmxpbmVkIGFuZCB0aGF0IGdjYworICogZGlkbid0IGVtaXQgY2FsbHMgdG8gaXRzIG93biBzdXBwb3J0IGZ1bmN0aW9ucykuIEFsc28gY29uZmlndXJpbmcgTVREIENGSQorICogc3VwcG9ydCB0byBhIHNpbmdsZSBidXN3aWR0aCBhbmQgYSBzaW5nbGUgaW50ZXJsZWF2ZSBpcyBhbHNvIHJlY29tbWVuZGVkLgorICovCisKK3N0YXRpYyB2b2lkIHhpcF9kaXNhYmxlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLAorCQkJdW5zaWduZWQgbG9uZyBhZHIpCit7CisJLyogVE9ETzogY2hpcHMgd2l0aCBubyBYSVAgdXNlIHNob3VsZCBpZ25vcmUgYW5kIHJldHVybiAqLworCSh2b2lkKSBtYXBfcmVhZChtYXAsIGFkcik7IC8qIGVuc3VyZSBtbXUgbWFwcGluZyBpcyB1cCB0byBkYXRlICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworc3RhdGljIHZvaWQgX194aXByYW0geGlwX2VuYWJsZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBsb25nIGFkcikKK3sKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKworCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9QT0lOVCAmJiBjaGlwLT5zdGF0ZSAhPSBGTF9SRUFEWSkgeworCQltYXBfd3JpdGUobWFwLCBDTUQoMHhmMCksIGFkcik7CisJCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJfQorCSh2b2lkKSBtYXBfcmVhZChtYXAsIGFkcik7CisJeGlwX2lwcmVmZXRjaCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworLyoKKyAqIFdoZW4gYSBkZWxheSBpcyByZXF1aXJlZCBmb3IgdGhlIGZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSwgdGhlCisgKiB4aXBfdWRlbGF5KCkgZnVuY3Rpb24gaXMgcG9sbGluZyBmb3IgYm90aCB0aGUgZ2l2ZW4gdGltZW91dCBhbmQgcGVuZGluZworICogKGJ1dCBzdGlsbCBtYXNrZWQpIGhhcmR3YXJlIGludGVycnVwdHMuICBXaGVuZXZlciB0aGVyZSBpcyBhbiBpbnRlcnJ1cHQKKyAqIHBlbmRpbmcgdGhlbiB0aGUgZmxhc2ggZXJhc2Ugb3BlcmF0aW9uIGlzIHN1c3BlbmRlZCwgYXJyYXkgbW9kZSByZXN0b3JlZCAKKyAqIGFuZCBpbnRlcnJ1cHRzIHVubWFza2VkLiAgVGFzayBzY2hlZHVsaW5nIG1pZ2h0IGFsc28gaGFwcGVuIGF0IHRoYXQKKyAqIHBvaW50LiAgVGhlIENQVSBldmVudHVhbGx5IHJldHVybnMgZnJvbSB0aGUgaW50ZXJydXB0IG9yIHRoZSBjYWxsIHRvCisgKiBzY2hlZHVsZSgpIGFuZCB0aGUgc3VzcGVuZGVkIGZsYXNoIG9wZXJhdGlvbiBpcyByZXN1bWVkIGZvciB0aGUgcmVtYWluaW5nCisgKiBvZiB0aGUgZGVsYXkgcGVyaW9kLgorICoKKyAqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gX3dpbGxfIGZvb2wgaW50ZXJydXB0IGxhdGVuY3kgdHJhY2luZyB0b29scy4KKyAqLworCitzdGF0aWMgdm9pZCBfX3hpcHJhbSB4aXBfdWRlbGF5KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLAorCQkJCXVuc2lnbmVkIGxvbmcgYWRyLCBpbnQgdXNlYykKK3sKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaV9hbWRzdGQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OworCW1hcF93b3JkIHN0YXR1cywgT0sgPSBDTUQoMHg4MCk7CisJdW5zaWduZWQgbG9uZyBzdXNwZW5kZWQsIHN0YXJ0ID0geGlwX2N1cnJ0aW1lKCk7CisJZmxzdGF0ZV90IG9sZHN0YXRlOworCisJZG8geworCQljcHVfcmVsYXgoKTsKKwkJaWYgKHhpcF9pcnFwZW5kaW5nKCkgJiYgZXh0cCAmJgorCQkgICAgKChjaGlwLT5zdGF0ZSA9PSBGTF9FUkFTSU5HICYmIChleHRwLT5FcmFzZVN1c3BlbmQgJiAyKSkpICYmCisJCSAgICAoY2ZpX2ludGVybGVhdmVfaXNfMShjZmkpIHx8IGNoaXAtPm9sZHN0YXRlID09IEZMX1JFQURZKSkgeworCQkJLyoKKwkJCSAqIExldCdzIHN1c3BlbmQgdGhlIGVyYXNlIG9wZXJhdGlvbiB3aGVuIHN1cHBvcnRlZC4gIAorCQkJICogTm90ZSB0aGF0IHdlIGN1cnJlbnRseSBkb24ndCB0cnkgdG8gc3VzcGVuZCAKKwkJCSAqIGludGVybGVhdmVkIGNoaXBzIGlmIHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciAKKwkJCSAqIG9wZXJhdGlvbiBzdXNwZW5kZWQgKGltYWdpbmUgd2hhdCBoYXBwZW5zCisJCQkgKiB3aGVuIG9uZSBjaGlwIHdhcyBhbHJlYWR5IGRvbmUgd2l0aCB0aGUgY3VycmVudAorCQkJICogb3BlcmF0aW9uIHdoaWxlIGFub3RoZXIgY2hpcCBzdXNwZW5kZWQgaXQsIHRoZW4KKwkJCSAqIHdlIHJlc3VtZSB0aGUgd2hvbGUgdGhpbmcgYXQgb25jZSkuICBZZXMsIGl0CisJCQkgKiBjYW4gaGFwcGVuIQorCQkJICovCisJCQltYXBfd3JpdGUobWFwLCBDTUQoMHhiMCksIGFkcik7CisJCQl1c2VjIC09IHhpcF9lbGFwc2VkX3NpbmNlKHN0YXJ0KTsKKwkJCXN1c3BlbmRlZCA9IHhpcF9jdXJydGltZSgpOworCQkJZG8geworCQkJCWlmICh4aXBfZWxhcHNlZF9zaW5jZShzdXNwZW5kZWQpID4gMTAwMDAwKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBjaGlwIGRvZXNuJ3Qgd2FudCB0byBzdXNwZW5kCisJCQkJCSAqIGFmdGVyIHdhaXRpbmcgZm9yIDEwMCBtc2Vjcy4KKwkJCQkJICogVGhpcyBpcyBhIGNyaXRpY2FsIGVycm9yIGJ1dCB0aGVyZQorCQkJCQkgKiBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS4KKwkJCQkJICovCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJc3RhdHVzID0gbWFwX3JlYWQobWFwLCBhZHIpOworCQkJfSB3aGlsZSAoIW1hcF93b3JkX2FuZGVxdWFsKG1hcCwgc3RhdHVzLCBPSywgT0spKTsKKworCQkJLyogU3VzcGVuZCBzdWNjZWVkZWQgKi8KKwkJCW9sZHN0YXRlID0gY2hpcC0+c3RhdGU7CisJCQlpZiAoIW1hcF93b3JkX2JpdHNzZXQobWFwLCBzdGF0dXMsIENNRCgweDQwKSkpCisJCQkJYnJlYWs7CisJCQljaGlwLT5zdGF0ZSA9IEZMX1hJUF9XSElMRV9FUkFTSU5HOworCQkJY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkID0gMTsKKwkJCW1hcF93cml0ZShtYXAsIENNRCgweGYwKSwgYWRyKTsKKwkJCSh2b2lkKSBtYXBfcmVhZChtYXAsIGFkcik7CisJCQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCS8qCisJCQkgKiBXZSdyZSBiYWNrLiAgSG93ZXZlciBzb21lb25lIGVsc2UgbWlnaHQgaGF2ZQorCQkJICogZGVjaWRlZCB0byBnbyB3cml0ZSB0byB0aGUgY2hpcCBpZiB3ZSBhcmUgaW4KKwkJCSAqIGEgc3VzcGVuZGVkIGVyYXNlIHN0YXRlLiAgSWYgc28gbGV0J3Mgd2FpdAorCQkJICogdW50aWwgaXQncyBkb25lLgorCQkJICovCisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJd2hpbGUgKGNoaXAtPnN0YXRlICE9IEZMX1hJUF9XSElMRV9FUkFTSU5HKSB7CisJCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOworCQkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOworCQkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQl9CisJCQkvKiBEaXNhbGxvdyBYSVAgYWdhaW4gKi8KKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkJCS8qIFJlc3VtZSB0aGUgd3JpdGUgb3IgZXJhc2Ugb3BlcmF0aW9uICovCisJCQltYXBfd3JpdGUobWFwLCBDTUQoMHgzMCksIGFkcik7CisJCQljaGlwLT5zdGF0ZSA9IG9sZHN0YXRlOworCQkJc3RhcnQgPSB4aXBfY3VycnRpbWUoKTsKKwkJfSBlbHNlIGlmICh1c2VjID49IDEwMDAwMDAvSFopIHsKKwkJCS8qCisJCQkgKiBUcnkgdG8gc2F2ZSBvbiBDUFUgcG93ZXIgd2hlbiB3YWl0aW5nIGRlbGF5CisJCQkgKiBpcyBhdCBsZWFzdCBhIHN5c3RlbSB0aW1lciB0aWNrIHBlcmlvZC4KKwkJCSAqIE5vIG5lZWQgdG8gYmUgZXh0cmVtZWx5IGFjY3VyYXRlIGhlcmUuCisJCQkgKi8KKwkJCXhpcF9jcHVfaWRsZSgpOworCQl9CisJCXN0YXR1cyA9IG1hcF9yZWFkKG1hcCwgYWRyKTsKKwl9IHdoaWxlICghbWFwX3dvcmRfYW5kZXF1YWwobWFwLCBzdGF0dXMsIE9LLCBPSykKKwkJICYmIHhpcF9lbGFwc2VkX3NpbmNlKHN0YXJ0KSA8IHVzZWMpOworfQorCisjZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIHhpcF91ZGVsYXkobWFwLCBjaGlwLCBhZHIsIHVzZWMpCisKKy8qCisgKiBUaGUgSU5WQUxJREFURV9DQUNIRURfUkFOR0UoKSBtYWNybyBpcyBub3JtYWxseSB1c2VkIGluIHBhcmFsbGVsIHdoaWxlCisgKiB0aGUgZmxhc2ggaXMgYWN0aXZlbHkgcHJvZ3JhbW1pbmcgb3IgZXJhc2luZyBzaW5jZSB3ZSBoYXZlIHRvIHBvbGwgZm9yCisgKiB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGFueXdheS4gIFdlIGNhbid0IGRvIHRoYXQgaW4gYSBnZW5lcmljIHdheSB3aXRoCisgKiBhIFhJUCBzZXR1cCBzbyBkbyBpdCBiZWZvcmUgdGhlIGFjdHVhbCBmbGFzaCBvcGVyYXRpb24gaW4gdGhpcyBjYXNlCisgKiBhbmQgc3R1YiBpdCBvdXQgZnJvbSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWS4KKyAqLworI2RlZmluZSBYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkgIFwKKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGZyb20sIHNpemUpCisKKyNkZWZpbmUgSU5WQUxJREFURV9DQUNIRV9VREVMQVkobWFwLCBjaGlwLCBhZHIsIGxlbiwgdXNlYykgIFwKKwlVREVMQVkobWFwLCBjaGlwLCBhZHIsIHVzZWMpCisKKy8qCisgKiBFeHRyYSBub3RlczoKKyAqCisgKiBBY3RpdmF0aW5nIHRoaXMgWElQIHN1cHBvcnQgY2hhbmdlcyB0aGUgd2F5IHRoZSBjb2RlIHdvcmtzIGEgYml0LiAgRm9yCisgKiBleGFtcGxlIHRoZSBjb2RlIHRvIHN1c3BlbmQgdGhlIGN1cnJlbnQgcHJvY2VzcyB3aGVuIGNvbmN1cnJlbnQgYWNjZXNzCisgKiBoYXBwZW5zIGlzIG5ldmVyIGV4ZWN1dGVkIGJlY2F1c2UgeGlwX3VkZWxheSgpIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZQorICogc2FtZSBjaGlwIHN0YXRlIGFzIGl0IHdhcyBlbnRlcmVkIHdpdGguICBUaGlzIGlzIHdoeSB0aGVyZSBpcyBubyBjYXJlIGZvcgorICogdGhlIHByZXNlbmNlIG9mIGFkZF93YWl0X3F1ZXVlKCkgb3Igc2NoZWR1bGUoKSBjYWxscyBmcm9tIHdpdGhpbiBhIGNvdXBsZQorICogeGlwX2Rpc2FibGUoKSdkICBhcmVhcyBvZiBjb2RlLCBsaWtlIGluIGRvX2VyYXNlX29uZWJsb2NrIGZvciBleGFtcGxlLgorICogVGhlIHF1ZXVlaW5nIGFuZCBzY2hlZHVsaW5nIGFyZSBhbHdheXMgaGFwcGVuaW5nIHdpdGhpbiB4aXBfdWRlbGF5KCkuCisgKgorICogU2ltaWxhcmx5LCBnZXRfY2hpcCgpIGFuZCBwdXRfY2hpcCgpIGp1c3QgaGFwcGVuIHRvIGFsd2F5cyBiZSBleGVjdXRlZAorICogd2l0aCBjaGlwLT5zdGF0ZSBzZXQgdG8gRkxfUkVBRFkgKG9yIEZMX1hJUF9XSElMRV8qKSB3aGVyZSBmbGFzaCBzdGF0ZQorICogaXMgaW4gYXJyYXkgbW9kZSwgdGhlcmVmb3JlIG5ldmVyIGV4ZWN1dGluZyBtYW55IGNhc2VzIHRoZXJlaW4gYW5kIG5vdAorICogY2F1c2luZyBhbnkgcHJvYmxlbSB3aXRoIFhJUC4KKyAqLworCisjZWxzZQorCisjZGVmaW5lIHhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKQorI2RlZmluZSB4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKQorI2RlZmluZSBYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKHguLi4pCisKKyNkZWZpbmUgVURFTEFZKG1hcCwgY2hpcCwgYWRyLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBsZW4sIHVzZWMpICBcCitkbyB7ICBcCisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOyAgXAorCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOyAgXAorCWNmaV91ZGVsYXkodXNlYyk7ICBcCisJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsgIFwKK30gd2hpbGUgKDApCisKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBkb19yZWFkX29uZWNoaXAoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIGxvZmZfdCBhZHIsIHNpemVfdCBsZW4sIHVfY2hhciAqYnVmKQogewpAQCAtNTM1LDEwICs3NzMsMTAgQEAKIAkvKiBFbnN1cmUgY21kIHJlYWQvd3JpdGVzIGFyZSBhbGlnbmVkLiAqLyAKIAljbWRfYWRkciA9IGFkciAmIH4obWFwX2Jhbmt3aWR0aChtYXApLTEpOyAKIAotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBjbWRfYWRkciwgRkxfUkVBRFkpOwogCWlmIChyZXQpIHsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNTUxLDcgKzc4OSw3IEBACiAKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGNtZF9hZGRyKTsKIAotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC02MDUsNyArODQzLDcgQEAKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAogIHJldHJ5OgotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAlpZiAoY2hpcC0+c3RhdGUgIT0gRkxfUkVBRFkpewogI2lmIDAKQEAgLTYxNCw3ICs4NTIsNyBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJCXNjaGVkdWxlKCk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwpAQCAtNjQzLDcgKzg4MSw3IEBACiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDAwLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAkKIAl3YWtlX3VwKCZjaGlwLT53cSk7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY5Miw3ICs5MzAsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgZG9fd3JpdGVfb25ld29yZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIG1hcF93b3JkIGRhdHVtKQorc3RhdGljIGludCBfX3hpcHJhbSBkb193cml0ZV9vbmV3b3JkKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nIGFkciwgbWFwX3dvcmQgZGF0dW0pCiB7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAJdW5zaWduZWQgbG9uZyB0aW1lbyA9IGppZmZpZXMgKyBIWjsKQEAgLTcxMiwxMCArOTUwLDEwIEBACiAKIAlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTczNSw3ICs5NzMsOSBAQAogCQlnb3RvIG9wX2RvbmU7CiAJfQogCisJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwX2Jhbmt3aWR0aChtYXApKTsKIAlFTkFCTEVfVlBQKG1hcCk7CisJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIpOwogIHJldHJ5OgogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKQEAgLTc0Myw5ICs5ODMsOSBAQAogCW1hcF93cml0ZShtYXAsIGRhdHVtLCBhZHIpOwogCWNoaXAtPnN0YXRlID0gRkxfV1JJVElORzsKIAotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JY2ZpX3VkZWxheShjaGlwLT53b3JkX3dyaXRlX3RpbWUpOwotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIG1hcF9iYW5rd2lkdGgobWFwKSwKKwkJCQljaGlwLT53b3JkX3dyaXRlX3RpbWUpOwogCiAJLyogU2VlIGNvbW1lbnQgYWJvdmUgZm9yIHRpbWVvdXQgdmFsdWUuICovCiAJdGltZW8gPSBqaWZmaWVzICsgdVdyaXRlVGltZW91dDsgCkBAIC03NTYsMzkgKzk5Niw0MyBAQAogCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CiAJCQl0aW1lbyA9IGppZmZpZXMgKyAoSFogLyAyKTsgLyogRklYTUUgKi8KLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKQotCQkJZ290byBvcF9kb25lOworCQkJYnJlYWs7CiAKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpIHsKKwkJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl9CiAKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJY2ZpX3VkZWxheSgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMSk7CiAJfQorCS8qIERpZCB3ZSBzdWNjZWVkPyAqLworCWlmICghY2hpcF9nb29kKG1hcCwgYWRyLCBkYXR1bSkpIHsKKwkJLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLworCQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOworCQkvKiBGSVhNRSAtIHNob3VsZCBoYXZlIHJlc2V0IGRlbGF5IGJlZm9yZSBjb250aW51aW5nICovCiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJNVEQgJXMoKTogc29mdHdhcmUgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlpZiAoKytyZXRyeV9jbnQgPD0gTUFYX1dPUkRfUkVUUklFUykgCisJCQlnb3RvIHJldHJ5OwogCi0JLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwotCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7Ci0JLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwotCWlmICgrK3JldHJ5X2NudCA8PSBNQVhfV09SRF9SRVRSSUVTKSAKLQkJZ290byByZXRyeTsKLQotCXJldCA9IC1FSU87CisJCXJldCA9IC1FSU87CisJfQorCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOwogIG9wX2RvbmU6CiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtODIwLDcgKzEwNjQsNyBAQAogCQltYXBfd29yZCB0bXBfYnVmOwogCiAgcmV0cnk6Ci0JCWNmaV9zcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fbG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQlpZiAoY2ZpLT5jaGlwc1tjaGlwbnVtXS5zdGF0ZSAhPSBGTF9SRUFEWSkgewogI2lmIDAKQEAgLTgyOSw3ICsxMDczLDcgQEAKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CiAKLQkJCWNmaV9zcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNmaS0+Y2hpcHNbY2hpcG51bV0ud3EsICZ3YWl0KTsKQEAgLTg0Myw3ICsxMDg3LDcgQEAKIAkJLyogTG9hZCAndG1wX2J1Zicgd2l0aCBvbGQgY29udGVudHMgb2YgZmxhc2ggKi8KIAkJdG1wX2J1ZiA9IG1hcF9yZWFkKG1hcCwgYnVzX29mcytjaGlwc3RhcnQpOwogCi0JCWNmaV9zcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSBidWZmZXIgKi8KIAkJbiA9IG1pbl90KGludCwgbGVuLCBtYXBfYmFua3dpZHRoKG1hcCktaSk7CkBAIC04OTgsNyArMTE0Miw3IEBACiAJCW1hcF93b3JkIHRtcF9idWY7CiAKICByZXRyeTE6Ci0JCWNmaV9zcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fbG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQlpZiAoY2ZpLT5jaGlwc1tjaGlwbnVtXS5zdGF0ZSAhPSBGTF9SRUFEWSkgewogI2lmIDAKQEAgLTkwNyw3ICsxMTUxLDcgQEAKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CiAKLQkJCWNmaV9zcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNmaS0+Y2hpcHNbY2hpcG51bV0ud3EsICZ3YWl0KTsKQEAgLTkyMCw3ICsxMTY0LDcgQEAKIAogCQl0bXBfYnVmID0gbWFwX3JlYWQobWFwLCBvZnMgKyBjaGlwc3RhcnQpOwogCi0JCWNmaV9zcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJdG1wX2J1ZiA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIHRtcF9idWYsIGJ1ZiwgMCwgbGVuKTsKIAkKQEAgLTkzOSw4ICsxMTgzLDkgQEAKIC8qCiAgKiBGSVhNRTogaW50ZXJsZWF2ZWQgbW9kZSBub3QgdGVzdGVkLCBhbmQgcHJvYmFibHkgbm90IHN1cHBvcnRlZCEKICAqLwotc3RhdGljIGlubGluZSBpbnQgZG9fd3JpdGVfYnVmZmVyKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCAKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRyLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3N0YXRpYyBpbnQgX194aXByYW0gZG9fd3JpdGVfYnVmZmVyKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkciwgY29uc3QgdV9jaGFyICpidWYsIAorCQkJCSAgICBpbnQgbGVuKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC05NTQsMTAgKzExOTksMTAgQEAKIAlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAJY21kX2FkciA9IGFkcjsKIAotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBhZHIsIEZMX1dSSVRJTkcpOwogCWlmIChyZXQpIHsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtOTY2LDcgKzEyMTEsMTAgQEAKIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBXUklURSAweCUuOGx4KDB4JS44bHgpXG4iLAogCSAgICAgICBfX2Z1bmNfXywgYWRyLCBkYXR1bS54WzBdICk7CiAKKwlYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOwogCUVOQUJMRV9WUFAobWFwKTsKKwl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGNtZF9hZHIpOworCQogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAkvL2NmaV9zZW5kX2dlbl9jbWQoMHhBMCwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CkBAIC05OTYsOSArMTI0NCw5IEBACiAJbWFwX3dyaXRlKG1hcCwgQ01EKDB4MjkpLCBjbWRfYWRyKTsKIAljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCWNmaV91ZGVsYXkoY2hpcC0+YnVmZmVyX3dyaXRlX3RpbWUpOwotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIG1hcF9iYW5rd2lkdGgobWFwKSwKKwkJCQljaGlwLT53b3JkX3dyaXRlX3RpbWUpOwogCiAJdGltZW8gPSBqaWZmaWVzICsgdVdyaXRlVGltZW91dDsgCiAJCQpAQCAtMTAwOSwzOCArMTI1NywzOSBAQAogCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CiAJCQl0aW1lbyA9IGppZmZpZXMgKyAoSFogLyAyKTsgLyogRklYTUUgKi8KLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKQorCQlpZiAoY2hpcF9yZWFkeShtYXAsIGFkcikpIHsKKwkJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOwogCQkJZ290byBvcF9kb25lOworCQl9CiAJCSAgICAKIAkJaWYoIHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKQogCQkJYnJlYWs7CiAKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJY2ZpX3VkZWxheSgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMSk7CiAJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCi0JICAgICAgIF9fZnVuY19fICk7Ci0KIAkvKiByZXNldCBvbiBhbGwgZmFpbHVyZXMuICovCiAJbWFwX3dyaXRlKCBtYXAsIENNRCgweEYwKSwgY2hpcC0+c3RhcnQgKTsKKwl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAkvKiBGSVhNRSAtIHNob3VsZCBoYXZlIHJlc2V0IGRlbGF5IGJlZm9yZSBjb250aW51aW5nICovCiAKKwlwcmludGsoS0VSTl9XQVJOSU5HICJNVEQgJXMoKTogc29mdHdhcmUgdGltZW91dFxuIiwKKwkgICAgICAgX19mdW5jX18gKTsKKwogCXJldCA9IC1FSU87CiAgb3BfZG9uZToKIAljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCXB1dF9jaGlwKG1hcCwgY2hpcCwgYWRyKTsKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTMwLDcgKzEzNzksNyBAQAogICogSGFuZGxlIGRldmljZXMgd2l0aCBvbmUgZXJhc2UgcmVnaW9uLCB0aGF0IG9ubHkgaW1wbGVtZW50CiAgKiB0aGUgY2hpcCBlcmFzZSBjb21tYW5kLgogICovCi1zdGF0aWMgaW5saW5lIGludCBkb19lcmFzZV9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwKQorc3RhdGljIGludCBfX3hpcHJhbSBkb19lcmFzZV9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC0xMTQwLDE3ICsxMzg5LDIwIEBACiAKIAlhZHIgPSBjZmktPmFkZHJfdW5sb2NrMTsKIAotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBhZHIsIEZMX1dSSVRJTkcpOwogCWlmIChyZXQpIHsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBjaGlwLT5zdGFydCApOwogCisJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwLT5zaXplKTsKIAlFTkFCTEVfVlBQKG1hcCk7CisJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIpOworCiAJY2ZpX3NlbmRfZ2VuX2NtZCgweEFBLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAljZmlfc2VuZF9nZW5fY21kKDB4NTUsIGNmaS0+YWRkcl91bmxvY2syLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg4MCwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CkBAIC0xMTYyLDkgKzE0MTQsOSBAQAogCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDA7CiAJY2hpcC0+aW5fcHJvZ3Jlc3NfYmxvY2tfYWRkciA9IGFkcjsKIAotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JbXNsZWVwKGNoaXAtPmVyYXNlX3RpbWUvMik7Ci0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJSU5WQUxJREFURV9DQUNIRV9VREVMQVkobWFwLCBjaGlwLAorCQkJCWFkciwgbWFwLT5zaXplLAorCQkJCWNoaXAtPmVyYXNlX3RpbWUqNTAwKTsKIAogCXRpbWVvID0gamlmZmllcyArIChIWioyMCk7CiAKQEAgLTExNzMsMTAgKzE0MjUsMTAgQEAKIAkJCS8qIFNvbWVvbmUncyBzdXNwZW5kZWQgdGhlIGVyYXNlLiBTbGVlcCAqLwogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGNoaXAtPmVyYXNlX3N1c3BlbmRlZCkgewpAQCAtMTE4NywzNiArMTQzOSwzNiBAQAogCQl9CiAKIAkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKQotCQkJZ290byBvcF9kb25lOwotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKIAkJCWJyZWFrOwogCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCisJCQkJX19mdW5jX18gKTsKKwkJCWJyZWFrOworCQl9CisKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCAxMDAwMDAwL0haKTsKKwl9CisJLyogRGlkIHdlIHN1Y2NlZWQ/ICovCisJaWYgKCFjaGlwX2dvb2QobWFwLCBhZHIsIG1hcF93b3JkX2ZmKG1hcCkpKSB7CisJCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KKwkJbWFwX3dyaXRlKCBtYXAsIENNRCgweEYwKSwgY2hpcC0+c3RhcnQgKTsKKwkJLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLworCisJCXJldCA9IC1FSU87CiAJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCi0JICAgICAgIF9fZnVuY19fICk7Ci0KLQkvKiByZXNldCBvbiBhbGwgZmFpbHVyZXMuICovCi0JbWFwX3dyaXRlKCBtYXAsIENNRCgweEYwKSwgY2hpcC0+c3RhcnQgKTsKLQkvKiBGSVhNRSAtIHNob3VsZCBoYXZlIHJlc2V0IGRlbGF5IGJlZm9yZSBjb250aW51aW5nICovCi0KLQlyZXQgPSAtRUlPOwotIG9wX2RvbmU6CiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50IGRvX2VyYXNlX29uZWJsb2NrKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nIGFkciwgaW50IGxlbiwgdm9pZCAqdGh1bmspCitzdGF0aWMgaW50IF9feGlwcmFtIGRvX2VyYXNlX29uZWJsb2NrKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nIGFkciwgaW50IGxlbiwgdm9pZCAqdGh1bmspCiB7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAJdW5zaWduZWQgbG9uZyB0aW1lbyA9IGppZmZpZXMgKyBIWjsKQEAgLTEyMjUsMTcgKzE0NzcsMjAgQEAKIAogCWFkciArPSBjaGlwLT5zdGFydDsKIAotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBhZHIsIEZMX0VSQVNJTkcpOwogCWlmIChyZXQpIHsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBhZHIgKTsKIAorCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7CiAJRU5BQkxFX1ZQUChtYXApOworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAljZmlfc2VuZF9nZW5fY21kKDB4ODAsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMTI0NiwxMCArMTUwMSwxMCBAQAogCWNoaXAtPnN0YXRlID0gRkxfRVJBU0lORzsKIAljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAwOwogCWNoaXAtPmluX3Byb2dyZXNzX2Jsb2NrX2FkZHIgPSBhZHI7Ci0JCi0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQltc2xlZXAoY2hpcC0+ZXJhc2VfdGltZS8yKTsKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIGxlbiwKKwkJCQljaGlwLT5lcmFzZV90aW1lKjUwMCk7CiAKIAl0aW1lbyA9IGppZmZpZXMgKyAoSFoqMjApOwogCkBAIC0xMjU4LDEwICsxNTEzLDEwIEBACiAJCQkvKiBTb21lb25lJ3Mgc3VzcGVuZGVkIHRoZSBlcmFzZS4gU2xlZXAgKi8KIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChjaGlwLT5lcmFzZV9zdXNwZW5kZWQpIHsKQEAgLTEyNzEsMzEgKzE1MjYsMzMgQEAKIAkJCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDA7CiAJCX0KIAotCQlpZiAoY2hpcF9yZWFkeShtYXAsIGFkcikpCi0JCQlnb3RvIG9wX2RvbmU7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKQorCQlpZiAoY2hpcF9yZWFkeShtYXAsIGFkcikpIHsKKwkJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOwogCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpIHsKKwkJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCisJCQkJX19mdW5jX18gKTsKKwkJCWJyZWFrOworCQl9CiAKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCAxMDAwMDAwL0haKTsKIAl9Ci0JCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCi0JICAgICAgIF9fZnVuY19fICk7Ci0JCi0JLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwotCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7Ci0JLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLworCS8qIERpZCB3ZSBzdWNjZWVkPyAqLworCWlmICghY2hpcF9nb29kKG1hcCwgYWRyLCBtYXBfd29yZF9mZihtYXApKSkgeworCQkvKiByZXNldCBvbiBhbGwgZmFpbHVyZXMuICovCisJCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7CisJCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KIAotCXJldCA9IC1FSU87Ci0gb3BfZG9uZToKKwkJcmV0ID0gLUVJTzsKKwl9CisKIAljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCXB1dF9jaGlwKG1hcCwgY2hpcCwgYWRyKTsKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzU1LDcgKzE2MTIsNyBAQAogCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKIAlyZXRyeToKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAkJc3dpdGNoKGNoaXAtPnN0YXRlKSB7CiAJCWNhc2UgRkxfUkVBRFk6CkBAIC0xMzY5LDE0ICsxNjI2LDE0IEBACiAJCQkgKiB3aXRoIHRoZSBjaGlwIG5vdyBhbnl3YXkuCiAJCQkgKi8KIAkJY2FzZSBGTF9TWU5DSU5HOgotCQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAJCQkvKiBOb3QgYW4gaWRsZSBzdGF0ZSAqLwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CiAJCQkKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAkJCXNjaGVkdWxlKCk7CiAKQEAgLTEzOTEsMTMgKzE2NDgsMTMgQEAKIAlmb3IgKGktLTsgaSA+PTA7IGktLSkgewogCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQogCQlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfU1lOQ0lORykgewogCQkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKIAkJCXdha2VfdXAoJmNoaXAtPndxKTsKIAkJfQotCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJfQogfQogCkBAIC0xNDEzLDcgKzE2NzAsNyBAQAogCWZvciAoaT0wOyAhcmV0ICYmIGk8Y2ZpLT5udW1jaGlwczsgaSsrKSB7CiAJCWNoaXAgPSAmY2ZpLT5jaGlwc1tpXTsKIAotCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAogCQlzd2l0Y2goY2hpcC0+c3RhdGUpIHsKIAkJY2FzZSBGTF9SRUFEWToKQEAgLTE0MzMsNyArMTY5MCw3IEBACiAJCQlyZXQgPSAtRUFHQUlOOwogCQkJYnJlYWs7CiAJCX0KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCX0KIAogCS8qIFVubG9jayB0aGUgY2hpcHMgYWdhaW4gKi8KQEAgLTE0NDIsMTMgKzE2OTksMTMgQEAKIAkJZm9yIChpLS07IGkgPj0wOyBpLS0pIHsKIAkJCWNoaXAgPSAmY2ZpLT5jaGlwc1tpXTsKIAotCQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkKIAkJCWlmIChjaGlwLT5zdGF0ZSA9PSBGTF9QTV9TVVNQRU5ERUQpIHsKIAkJCQljaGlwLT5zdGF0ZSA9IGNoaXAtPm9sZHN0YXRlOwogCQkJCXdha2VfdXAoJmNoaXAtPndxKTsKIAkJCX0KLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCX0KIAl9CiAJCkBAIC0xNDY3LDcgKzE3MjQsNyBAQAogCQogCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQogCQlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfUE1fU1VTUEVOREVEKSB7CiAJCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwpAQCAtMTQ3Nyw3ICsxNzM0LDcgQEAKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fRVJSICJBcmdoLiBDaGlwIG5vdCBpbiBQTV9TVVNQRU5ERUQgc3RhdGUgdXBvbiByZXN1bWUoKVxuIik7CiAKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMjAuYwppbmRleCA4YzI0ZTE4Li5jODk0Zjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMjAuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMjAuYwpAQCAtNCw3ICs0LDcgQEAKICAqCiAgKiAoQykgMjAwMCBSZWQgSGF0LiBHUEwnZAogICoKLSAqICRJZDogY2ZpX2NtZHNldF8wMDIwLmMsdiAxLjE3IDIwMDQvMTEvMjAgMTI6NDk6MDQgZHdtdzIgRXhwICQKKyAqICRJZDogY2ZpX2NtZHNldF8wMDIwLmMsdiAxLjE5IDIwMDUvMDcvMTMgMTU6NTI6NDUgZHdtdzIgRXhwICQKICAqIAogICogMTAvMTAvMjAwMAlOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CiAgKiAJLSBjb21wbGV0ZWx5IHJldmFtcGVkIG1ldGhvZCBmdW5jdGlvbnMgc28gdGhleSBhcmUgYXdhcmUgYW5kCkBAIC0xNiw2ICsxNiw4IEBACiAgKgktIG1vZGlmaWVkIEludGVsIENvbW1hbmQgU2V0IDB4MDAwMSB0byBzdXBwb3J0IFNUIEFkdmFuY2VkIEFyY2hpdGVjdHVyZQogICoJICAoY29tbWFuZCBzZXQgMHgwMDIwKQogICoJLSBhZGRlZCBhIHdyaXRldiBmdW5jdGlvbgorICogMDcvMTMvMjAwNQlKb2VybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CisgKiAJLSBQbHVnZ2VkIG1lbW9yeSBsZWFrIGluIGNmaV9zdGFhX3dyaXRldigpLgogICovCiAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CkBAIC03MTksNiArNzIxLDcgQEAKIHdyaXRlX2Vycm9yOgogCWlmIChyZXRsZW4pCiAJCSpyZXRsZW4gPSB0b3RsZW47CisJa2ZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oIGIvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaAppbmRleCBmYmY0NDcwLi5lMWE1Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKQEAgLTU4LDEwICs1OCwxMCBAQAogCSAqIHRvIGZsYXNoIG1lbW9yeSAtIHRoYXQgbWVhbnMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHN0YXR1cwogCSAqIGFuZCB0aW1lb3V0LgogCSAqLwotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBhZHIsIEZMX0xPQ0tJTkcpOwogCWlmIChyZXQpIHsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNzEsNyArNzEsNyBAQAogCS8qIERvbmUgYW5kIGhhcHB5LiAqLwogCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CiAJcHV0X2NoaXAobWFwLCBjaGlwLCBhZHIpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9nZW5fcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2dlbl9wcm9iZS5jCmluZGV4IGZjOTgyYzQuLmRjMDY1YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2dlbl9wcm9iZS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2dlbl9wcm9iZS5jCkBAIC0yLDcgKzIsNyBAQAogICogUm91dGluZXMgY29tbW9uIHRvIGFsbCBDRkktdHlwZSBwcm9iZXMuCiAgKiAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KICAqIEdQTCdkCi0gKiAkSWQ6IGdlbl9wcm9iZS5jLHYgMS4yMSAyMDA0LzA4LzE0IDE1OjE0OjA1IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGdlbl9wcm9iZS5jLHYgMS4yMiAyMDA1LzAxLzI0IDIzOjQ5OjUwIHJtayBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE2Miw3ICsxNjIsNyBAQAogCWludCBtYXhfY2hpcHMgPSBtYXBfYmFua3dpZHRoKG1hcCk7IC8qIEFuZCBtaW5pbXVtIDEgKi8KIAlpbnQgbnJfY2hpcHMsIHR5cGU7CiAKLQlmb3IgKG5yX2NoaXBzID0gbWluX2NoaXBzOyBucl9jaGlwcyA8PSBtYXhfY2hpcHM7IG5yX2NoaXBzIDw8PSAxKSB7CisJZm9yIChucl9jaGlwcyA9IG1heF9jaGlwczsgbnJfY2hpcHMgPj0gbWluX2NoaXBzOyBucl9jaGlwcyA+Pj0gMSkgewogCiAJCWlmICghY2ZpX2ludGVybGVhdmVfc3VwcG9ydGVkKG5yX2NoaXBzKSkKIAkJICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKaW5kZXggMzAzMjVhMi4uMzBkYTQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCkBAIC0xLDcgKzEsNyBAQAogLyogCiAgICBDb21tb24gRmxhc2ggSW50ZXJmYWNlIHByb2JlIGNvZGUuCiAgICAoQykgMjAwMCBSZWQgSGF0LiBHUEwnZC4KLSAgICRJZDogamVkZWNfcHJvYmUuYyx2IDEuNjEgMjAwNC8xMS8xOSAyMDo1MjoxNiB0aGF5bmUgRXhwICQKKyAgICRJZDogamVkZWNfcHJvYmUuYyx2IDEuNjMgMjAwNS8wMi8xNCAxNjozMDozMiBiamQgRXhwICQKICAgIFNlZSBKRURFQyAoaHR0cDovL3d3dy5qZWRlYy5vcmcvKSBzdGFuZGFyZCBKRVNEMjFDIChzZWN0aW9uIDMuNSkKICAgIGZvciB0aGUgc3RhbmRhcmQgdGhpcyBwcm9iZSBnb2VzIGJhY2sgdG8uCiAKQEAgLTE0Miw2ICsxNDIsNyBAQAogI2RlZmluZSBTU1QyOUxFNTEyCTB4MDAzZAogI2RlZmluZSBTU1QzOUxGODAwCTB4Mjc4MQogI2RlZmluZSBTU1QzOUxGMTYwCTB4Mjc4MgorI2RlZmluZSBTU1QzOVZGMTYwMQkweDIzNGIKICNkZWZpbmUgU1NUMzlMRjUxMgkweDAwRDQKICNkZWZpbmUgU1NUMzlMRjAxMAkweDAwRDUKICNkZWZpbmUgU1NUMzlMRjAyMAkweDAwRDYKQEAgLTE0NDgsNiArMTQ0OSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBFUkFTRUlORk8oMHgxMDAwLDI1NiksCiAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KQogICAgICAgICAgICAgICAgfQorCX0sIHsKKyAgICAgICAgICAgICAgIC5tZnJfaWQgICAgICAgICA9IE1BTlVGQUNUVVJFUl9TU1QsICAgICAvKiBzaG91bGQgYmUgQ0ZJICovCisgICAgICAgICAgICAgICAuZGV2X2lkICAgICAgICAgPSBTU1QzOVZGMTYwMSwKKyAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTU1QgMzlWRjE2MDEiLAorICAgICAgICAgICAgICAgLnVhZGRyICAgICAgICAgID0geworICAgICAgICAgICAgICAgICAgICAgICBbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwgIC8qIHg4ICovCisgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBICAgLyogeDE2ICovCisgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgLkRldlNpemUgICAgICAgID0gU0laRV8yTWlCLAorICAgICAgICAgICAgICAgLkNtZFNldCAgICAgICAgID0gUF9JRF9BTURfU1RELAorICAgICAgICAgICAgICAgLk51bUVyYXNlUmVnaW9ucz0gMiwKKyAgICAgICAgICAgICAgIC5yZWdpb25zICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpLAorICAgICAgICAgICAgICAgICAgICAgICBFUkFTRUlORk8oMHgxMDAwLDI1NikKKyAgICAgICAgICAgICAgIH0KIAogICAgICAgIH0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCS8qIEZJWE1FIC0gQ0ZJIGRldmljZT8gKi8KQEAgLTE4NTYsNiArMTg3MiwxNiBAQAogCWNhc2UgQ0ZJX0RFVklDRVRZUEVfWDg6CiAJCW1mciA9IChfX3U4KWZpbmZvLT5tZnJfaWQ7CiAJCWlkID0gKF9fdTgpZmluZm8tPmRldl9pZDsKKworCQkvKiBiamQ6IGl0IHNlZW1zIHRoYXQgaWYgd2UgZG8gdGhpcywgd2UgY2FuIGVuZCB1cAorCQkgKiBkZXRlY3RpbmcgMTZiaXQgZmxhc2hlcyBhcyBhbiA4Yml0IGRldmljZSwgZXZlbiB0aG91Z2gKKwkJICogdGhlcmUgYXJlbid0LgorCQkgKi8KKwkJaWYgKGZpbmZvLT5kZXZfaWQgPiAweGZmKSB7CisJCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIiVzKCk6IElEIGlzIG5vdCA4Yml0XG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWdvdG8gbWF0Y2hfZG9uZTsKKwkJfQogCQlicmVhazsKIAljYXNlIENGSV9ERVZJQ0VUWVBFX1gxNjoKIAkJbWZyID0gKF9fdTE2KWZpbmZvLT5tZnJfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jIGIvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYwppbmRleCA2MGFiNGI4Li5lZjI0ODM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjbWRsaW5lcGFydC5jLHYgMS4xNyAyMDA0LzExLzI2IDExOjE4OjQ3IGxhdmluZW4gRXhwICQKKyAqICRJZDogY21kbGluZXBhcnQuYyx2IDEuMTggMjAwNS8wNi8wNyAxNTowNDoyNiBqb2VybiBFeHAgJAogICoKICAqIFJlYWQgZmxhc2ggcGFydGl0aW9uIHRhYmxlIGZyb20gY29tbWFuZCBsaW5lCiAgKgpAQCAtMjM5LDcgKzIzOSw4IEBACiAJCQkJJm51bV9wYXJ0cywJLyogb3V0OiBudW1iZXIgb2YgcGFydHMgKi8KIAkJCQkwLAkJLyogZmlyc3QgcGFydGl0aW9uICovCiAJCQkJKHVuc2lnbmVkIGNoYXIqKikmdGhpc19tdGQsIC8qIG91dDogZXh0cmEgbWVtICovCi0JCQkJbXRkX2lkX2xlbiArIDEgKyBzaXplb2YoKnRoaXNfbXRkKSk7CisJCQkJbXRkX2lkX2xlbiArIDEgKyBzaXplb2YoKnRoaXNfbXRkKSArIAorCQkJCXNpemVvZih2b2lkKiktMSAvKmFsaWdubWVudCovKTsKIAkJaWYoIXBhcnRzKQogCQl7CiAJCQkvKgpAQCAtMjUyLDYgKzI1Myw5IEBACiAJCQkgcmV0dXJuIDA7CiAJCSB9CiAKKwkJLyogYWxpZ24gdGhpc19tdGQgKi8KKwkJdGhpc19tdGQgPSAoc3RydWN0IGNtZGxpbmVfbXRkX3BhcnRpdGlvbiAqKSAKKwkJCUFMSUdOKCh1bnNpZ25lZCBsb25nKXRoaXNfbXRkLCBzaXplb2Yodm9pZCopKTsKIAkJLyogZW50ZXIgcmVzdWx0cyAqLwkgICAgCiAJCXRoaXNfbXRkLT5wYXJ0cyA9IHBhcnRzOwogCQl0aGlzX210ZC0+bnVtX3BhcnRzID0gbnVtX3BhcnRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKaW5kZXggY2ZlNmNjZi4uNGE3YTgwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCkBAIC0xLDEwICsxLDkgQEAKIC8qCi0gKiAkSWQ6IGJsb2NrMm10ZC5jLHYgMS4yMyAyMDA1LzAxLzA1IDE3OjA1OjQ2IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGJsb2NrMm10ZC5jLHYgMS4yOCAyMDA1LzAzLzE5IDIyOjQwOjQ0IGdsZWl4bmVyIEV4cCAkCiAgKgogICogYmxvY2sybXRkLmMgLSBjcmVhdGUgYW4gbXRkIGZyb20gYSBibG9jayBkZXZpY2UKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMglTaW1vbiBFdmFucyA8c3BzZUBzZWNyZXQub3JnLnVrPgotICogQ29weXJpZ2h0IChDKSAyMDA0CQlHYXJldGggQnVsdCA8R2FyZXRoQEVuY3J5cHRlYy5uZXQ+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNQlK9nJuIEVuZ2VsIDxqb2VybkB3aC5maC13ZWRlbC5kZT4KICAqCiAgKiBMaWNlbmNlOiBHUEwKQEAgLTIwLDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAotI2RlZmluZSBWRVJTSU9OICIkUmV2aXNpb246IDEuMjMgJCIKKyNkZWZpbmUgVkVSU0lPTiAiJFJldmlzaW9uOiAxLjI4ICQiCiAKIAogI2RlZmluZSBFUlJPUihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiYmxvY2sybXRkOiAiIGZtdCAiXG4iICwgIyMgYXJncykKQEAgLTg5LDcgKzg4LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSogcGFnZV9yZWFkYWhlYWQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGludCBpbmRleCkKIHsKIAlmaWxsZXJfdCAqZmlsbGVyID0gKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7Ci0JLy9kb19wYWdlX2NhY2hlX3JlYWRhaGVhZChtYXBwaW5nLCBpbmRleCwgWFhYLCA2NCk7CiAJY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsIGluZGV4KTsKIAlyZXR1cm4gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCBmaWxsZXIsIE5VTEwpOwogfQpAQCAtMTU3LDcgKzE1NSw3IEBACiAJc3RydWN0IGJsb2NrMm10ZF9kZXYgKmRldiA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaW5kZXggPSBmcm9tID4+IFBBR0VfU0hJRlQ7Ci0JaW50IG9mZnNldCA9IGZyb20gJiAoUEFHRV9TSElGVC0xKTsKKwlpbnQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX1NJWkUtMSk7CiAJaW50IGNweWxlbjsKIAogCWlmIChmcm9tID4gbXRkLT5zaXplKQpAQCAtMzcwLDE2ICszNjgsMTYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHBhcnNlX251bTMyKHUzMiAqbnVtMzIsIGNvbnN0IGNoYXIgKnRva2VuKQorc3RhdGljIGludCBwYXJzZV9udW0oc2l6ZV90ICpudW0sIGNvbnN0IGNoYXIgKnRva2VuKQogewogCWNoYXIgKmVuZHA7Ci0JdW5zaWduZWQgbG9uZyBuOworCXNpemVfdCBuOwogCi0JbiA9IHVzdHJ0b3VsKHRva2VuLCAmZW5kcCwgMCk7CisJbiA9IChzaXplX3QpIHVzdHJ0b3VsKHRva2VuLCAmZW5kcCwgMCk7CiAJaWYgKCplbmRwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSpudW0zMiA9IG47CisJKm51bSA9IG47CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyMiw3ICs0MjAsNyBAQAogCWNoYXIgYnVmWzgwKzEyXSwgKnN0cj1idWY7IC8qIDgwIGZvciBkZXZpY2UsIDEyIGZvciBlcmFzZSBzaXplICovCiAJY2hhciAqdG9rZW5bMl07CiAJY2hhciAqbmFtZTsKLQl1MzIgZXJhc2Vfc2l6ZSA9IFBBR0VfU0laRTsKKwlzaXplX3QgZXJhc2Vfc2l6ZSA9IFBBR0VfU0laRTsKIAlpbnQgaSwgcmV0OwogCiAJaWYgKHN0cm5sZW4odmFsLCBzaXplb2YoYnVmKSkgPj0gc2l6ZW9mKGJ1ZikpCkBAIC00NDksNyArNDQ3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodG9rZW5bMV0pIHsKLQkJcmV0ID0gcGFyc2VfbnVtMzIoJmVyYXNlX3NpemUsIHRva2VuWzFdKTsKKwkJcmV0ID0gcGFyc2VfbnVtKCZlcmFzZV9zaXplLCB0b2tlblsxXSk7CiAJCWlmIChyZXQpCiAJCQlwYXJzZV9lcnIoImlsbGVnYWwgZXJhc2Ugc2l6ZSIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXMwMi1udi5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tczAyLW52LmMKaW5kZXggMzgwZmYwOC4uZjUwMjZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tczAyLW52LmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tczAyLW52LmMKQEAgLTYsNyArNiw3IEBACiAgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgotICoJJElkOiBtczAyLW52LmMsdiAxLjggMjAwNS8wMS8wNSAxODowNToxMiBkd213MiBFeHAgJAorICoJJElkOiBtczAyLW52LmMsdiAxLjEwIDIwMDUvMDYvMjAgMTI6MjQ6NDEgbWFjcm8gRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtOTksOCArOTksOCBAQAogCSAqIFRoZSBmaXJtd2FyZSB3cml0ZXMgTVMwMk5WX0lEIGF0IE1TMDJOVl9NQUdJQyBhbmQgYWxzbwogCSAqIGEgZGlhZ25vc3RpYyBzdGF0dXMgYXQgTVMwMk5WX0RJQUcuCiAJICovCi0JbXMwMm52X2RpYWdwID0gKG1zMDJudl91aW50ICopKEtTRUcxQUREUihhZGRyICsgTVMwMk5WX0RJQUcpKTsKLQltczAybnZfbWFnaWNwID0gKG1zMDJudl91aW50ICopKEtTRUcxQUREUihhZGRyICsgTVMwMk5WX01BR0lDKSk7CisJbXMwMm52X2RpYWdwID0gKG1zMDJudl91aW50ICopKENLU0VHMUFERFIoYWRkciArIE1TMDJOVl9ESUFHKSk7CisJbXMwMm52X21hZ2ljcCA9IChtczAybnZfdWludCAqKShDS1NFRzFBRERSKGFkZHIgKyBNUzAyTlZfTUFHSUMpKTsKIAllcnIgPSBnZXRfZGJlKG1zMDJudl9tYWdpYywgbXMwMm52X21hZ2ljcCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIDA7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJZ290byBlcnJfb3V0X2Nzcl9yZXM7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAibXRkJWQ6ICVzIGF0IDB4JTA4bHgsIHNpemUgJXVNaUIuXG4iLAorCXByaW50ayhLRVJOX0lORk8gIm10ZCVkOiAlcyBhdCAweCUwOGx4LCBzaXplICV6dU1pQi5cbiIsCiAJCW10ZC0+aW5kZXgsIG1zMDJudl9uYW1lLCBhZGRyLCBzaXplID4+IDIwKTsKIAogCW1wLT5uZXh0ID0gcm9vdF9tczAybnZfbXRkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKaW5kZXggZWRhYzQxNS4uYmI3MTNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qCiAgKiBtdGRyYW0gLSBhIHRlc3QgbXRkIGRldmljZQotICogJElkOiBtdGRyYW0uYyx2IDEuMzUgMjAwNS8wMS8wNSAxODowNToxMiBkd213MiBFeHAgJAorICogJElkOiBtdGRyYW0uYyx2IDEuMzcgMjAwNS8wNC8yMSAwMzo0MjoxMSBqb2VybiBFeHAgJAogICogQXV0aG9yOiBBbGV4YW5kZXIgTGFyc3NvbiA8YWxleEBjZW5kaW8uc2U+CiAgKgogICogQ29weXJpZ2h0IChjKSAxOTk5IEFsZXhhbmRlciBMYXJzc29uIDxhbGV4QGNlbmRpby5zZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBKb2VybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CiAgKgogICogVGhpcyBjb2RlIGlzIEdQTAogICoKQEAgLTE4LDIxMyArMTksMTQwIEBACiAjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KIAotI2lmbmRlZiBDT05GSUdfTVREUkFNX0FCU19QT1MKLSAgI2RlZmluZSBDT05GSUdfTVREUkFNX0FCU19QT1MgMAotI2VuZGlmCi0KLSNpZiBDT05GSUdfTVREUkFNX0FCU19QT1MgPiAwCi0gICNpbmNsdWRlIDxhc20vaW8uaD4KLSNlbmRpZgotCi0jaWZkZWYgTU9EVUxFCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplID0gQ09ORklHX01URFJBTV9UT1RBTF9TSVpFOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZXJhc2Vfc2l6ZSA9IENPTkZJR19NVERSQU1fRVJBU0VfU0laRTsKLW1vZHVsZV9wYXJhbSh0b3RhbF9zaXplLHVsb25nLDApOwotTU9EVUxFX1BBUk1fREVTQyh0b3RhbF9zaXplLCAiVG90YWwgZGV2aWNlIHNpemUgaW4gS2lCIik7Ci1tb2R1bGVfcGFyYW0oZXJhc2Vfc2l6ZSx1bG9uZywwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZXJhc2Vfc2l6ZSwgIkRldmljZSBlcmFzZSBibG9jayBzaXplIGluIEtpQiIpOwogI2RlZmluZSBNVERSQU1fVE9UQUxfU0laRSAodG90YWxfc2l6ZSAqIDEwMjQpCiAjZGVmaW5lIE1URFJBTV9FUkFTRV9TSVpFIChlcmFzZV9zaXplICogMTAyNCkKLSNlbHNlCi0jZGVmaW5lIE1URFJBTV9UT1RBTF9TSVpFIChDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgKiAxMDI0KQotI2RlZmluZSBNVERSQU1fRVJBU0VfU0laRSAoQ09ORklHX01URFJBTV9FUkFTRV9TSVpFICogMTAyNCkKLSNlbmRpZgogCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW0odG90YWxfc2l6ZSwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyh0b3RhbF9zaXplLCAiVG90YWwgZGV2aWNlIHNpemUgaW4gS2lCIik7Cittb2R1bGVfcGFyYW0oZXJhc2Vfc2l6ZSwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhlcmFzZV9zaXplLCAiRGV2aWNlIGVyYXNlIGJsb2NrIHNpemUgaW4gS2lCIik7CisjZW5kaWYKIAogLy8gV2UgY291bGQgc3RvcmUgdGhlc2UgaW4gdGhlIG10ZCBzdHJ1Y3R1cmUsIGJ1dCB3ZSBvbmx5IHN1cHBvcnQgMSBkZXZpY2UuLgogc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXRkX2luZm87CiAKLQotc3RhdGljIGludAotcmFtX2VyYXNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCitzdGF0aWMgaW50IHJhbV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQogewotICBERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicmFtX2VyYXNlKHBvczolbGQsIGxlbjolbGQpXG4iLCAobG9uZylpbnN0ci0+YWRkciwgKGxvbmcpaW5zdHItPmxlbik7Ci0gIGlmIChpbnN0ci0+YWRkciArIGluc3RyLT5sZW4gPiBtdGQtPnNpemUpIHsKLSAgICBERUJVRyhNVERfREVCVUdfTEVWRUwxLCAicmFtX2VyYXNlKCkgb3V0IG9mIGJvdW5kcyAoJWxkID4gJWxkKVxuIiwgKGxvbmcpKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbiksIChsb25nKW10ZC0+c2l6ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLQkKLSAgbWVtc2V0KChjaGFyICopbXRkLT5wcml2ICsgaW5zdHItPmFkZHIsIDB4ZmYsIGluc3RyLT5sZW4pOwotCQotICBpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKLSAgbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKwlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICByZXR1cm4gMDsKKwltZW1zZXQoKGNoYXIgKiltdGQtPnByaXYgKyBpbnN0ci0+YWRkciwgMHhmZiwgaW5zdHItPmxlbik7CisKKwlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKKwltdGRfZXJhc2VfY2FsbGJhY2soaW5zdHIpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFtX3BvaW50IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKiptdGRidWYpCitzdGF0aWMgaW50IHJhbV9wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKiptdGRidWYpCiB7Ci0gIGlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQotICAgIHJldHVybiAtRUlOVkFMOwotCQotICAqbXRkYnVmID0gbXRkLT5wcml2ICsgZnJvbTsKLSAgKnJldGxlbiA9IGxlbjsKLSAgcmV0dXJuIDA7CisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJKm10ZGJ1ZiA9IG10ZC0+cHJpdiArIGZyb207CisJKnJldGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFtX3VucG9pbnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmFkZHIsIGxvZmZfdCBmcm9tLAotCQkJIHNpemVfdCBsZW4pCitzdGF0aWMgdm9pZCByYW1fdW5wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICogYWRkciwgbG9mZl90IGZyb20sCisJCXNpemVfdCBsZW4pCiB7Ci0gIERFQlVHKE1URF9ERUJVR19MRVZFTDIsICJyYW1fdW5wb2ludFxuIik7CiB9CiAKIHN0YXRpYyBpbnQgcmFtX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAotCSAgICAgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQorCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCiB7Ci0gIERFQlVHKE1URF9ERUJVR19MRVZFTDIsICJyYW1fcmVhZChwb3M6JWxkLCBsZW46JWxkKVxuIiwgKGxvbmcpZnJvbSwgKGxvbmcpbGVuKTsKLSAgaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpIHsKLSAgICBERUJVRyhNVERfREVCVUdfTEVWRUwxLCAicmFtX3JlYWQoKSBvdXQgb2YgYm91bmRzICglbGQgPiAlbGQpXG4iLCAobG9uZykoZnJvbSArIGxlbiksIChsb25nKW10ZC0+c2l6ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgbWVtY3B5KGJ1ZiwgbXRkLT5wcml2ICsgZnJvbSwgbGVuKTsKKwltZW1jcHkoYnVmLCBtdGQtPnByaXYgKyBmcm9tLCBsZW4pOwogCi0gICpyZXRsZW49bGVuOwotICByZXR1cm4gMDsKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJhbV93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAotCSAgICAgIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKKwkJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQogewotICBERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicmFtX3dyaXRlKHBvczolbGQsIGxlbjolbGQpXG4iLCAobG9uZyl0bywgKGxvbmcpbGVuKTsKLSAgaWYgKHRvICsgbGVuID4gbXRkLT5zaXplKSB7Ci0gICAgREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgInJhbV93cml0ZSgpIG91dCBvZiBib3VuZHMgKCVsZCA+ICVsZClcbiIsIChsb25nKSh0byArIGxlbiksIChsb25nKW10ZC0+c2l6ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KKwlpZiAodG8gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOwogCi0gIG1lbWNweSAoKGNoYXIgKiltdGQtPnByaXYgKyB0bywgYnVmLCBsZW4pOworCW1lbWNweSgoY2hhciAqKW10ZC0+cHJpdiArIHRvLCBidWYsIGxlbik7CiAKLSAgKnJldGxlbj1sZW47Ci0gIHJldHVybiAwOworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX210ZHJhbSh2b2lkKQogewotICBpZiAobXRkX2luZm8pIHsKLSAgICBkZWxfbXRkX2RldmljZShtdGRfaW5mbyk7Ci0jaWYgQ09ORklHX01URFJBTV9UT1RBTF9TSVpFID4gMAotICAgIGlmIChtdGRfaW5mby0+cHJpdikKLSNpZiBDT05GSUdfTVREUkFNX0FCU19QT1MgPiAwCi0gICAgICBpb3VubWFwKG10ZF9pbmZvLT5wcml2KTsKLSNlbHNlCi0gICAgICB2ZnJlZShtdGRfaW5mby0+cHJpdik7Ci0jZW5kaWYJCi0jZW5kaWYKLSAgICBrZnJlZShtdGRfaW5mbyk7Ci0gIH0KKwlpZiAobXRkX2luZm8pIHsKKwkJZGVsX210ZF9kZXZpY2UobXRkX2luZm8pOworCQlpZiAobXRkX2luZm8tPnByaXYpCisJCQl2ZnJlZShtdGRfaW5mby0+cHJpdik7CisJCWtmcmVlKG10ZF9pbmZvKTsKKwl9CiB9CiAKLWludCBtdGRyYW1faW5pdF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKm1hcHBlZF9hZGRyZXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpuYW1lKQoraW50IG10ZHJhbV9pbml0X2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdm9pZCAqbWFwcGVkX2FkZHJlc3MsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSkKIHsKLSAgIG1lbXNldChtdGQsIDAsIHNpemVvZigqbXRkKSk7CisJbWVtc2V0KG10ZCwgMCwgc2l6ZW9mKCptdGQpKTsKIAotICAgLyogU2V0dXAgdGhlIE1URCBzdHJ1Y3R1cmUgKi8KLSAgIG10ZC0+bmFtZSA9IG5hbWU7Ci0gICBtdGQtPnR5cGUgPSBNVERfUkFNOwotICAgbXRkLT5mbGFncyA9IE1URF9DQVBfUkFNOwotICAgbXRkLT5zaXplID0gc2l6ZTsKLSAgIG10ZC0+ZXJhc2VzaXplID0gTVREUkFNX0VSQVNFX1NJWkU7Ci0gICBtdGQtPnByaXYgPSBtYXBwZWRfYWRkcmVzczsKKwkvKiBTZXR1cCB0aGUgTVREIHN0cnVjdHVyZSAqLworCW10ZC0+bmFtZSA9IG5hbWU7CisJbXRkLT50eXBlID0gTVREX1JBTTsKKwltdGQtPmZsYWdzID0gTVREX0NBUF9SQU07CisJbXRkLT5zaXplID0gc2l6ZTsKKwltdGQtPmVyYXNlc2l6ZSA9IE1URFJBTV9FUkFTRV9TSVpFOworCW10ZC0+cHJpdiA9IG1hcHBlZF9hZGRyZXNzOwogCi0gICBtdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0gICBtdGQtPmVyYXNlID0gcmFtX2VyYXNlOwotICAgbXRkLT5wb2ludCA9IHJhbV9wb2ludDsKLSAgIG10ZC0+dW5wb2ludCA9IHJhbV91bnBvaW50OwotICAgbXRkLT5yZWFkID0gcmFtX3JlYWQ7Ci0gICBtdGQtPndyaXRlID0gcmFtX3dyaXRlOworCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwltdGQtPmVyYXNlID0gcmFtX2VyYXNlOworCW10ZC0+cG9pbnQgPSByYW1fcG9pbnQ7CisJbXRkLT51bnBvaW50ID0gcmFtX3VucG9pbnQ7CisJbXRkLT5yZWFkID0gcmFtX3JlYWQ7CisJbXRkLT53cml0ZSA9IHJhbV93cml0ZTsKIAotICAgaWYgKGFkZF9tdGRfZGV2aWNlKG10ZCkpIHsKLSAgICAgcmV0dXJuIC1FSU87Ci0gICB9Ci0gICAKLSAgIHJldHVybiAwOworCWlmIChhZGRfbXRkX2RldmljZShtdGQpKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOwogfQogCi0jaWYgQ09ORklHX01URFJBTV9UT1RBTF9TSVpFID4gMAotI2lmIENPTkZJR19NVERSQU1fQUJTX1BPUyA+IDAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfbXRkcmFtKHZvaWQpCi17Ci0gIHZvaWQgKmFkZHI7Ci0gIGludCBlcnI7Ci0gIC8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5ICovCi0gICBtdGRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksIEdGUF9LRVJORUwpOwotICAgaWYgKCFtdGRfaW5mbykKLSAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAKLSAgYWRkciA9IGlvcmVtYXAoQ09ORklHX01URFJBTV9BQlNfUE9TLCBNVERSQU1fVE9UQUxfU0laRSk7Ci0gIGlmICghYWRkcikgewotICAgIERFQlVHKE1URF9ERUJVR19MRVZFTDEsIAotICAgICAgICAgICJGYWlsZWQgdG8gaW9yZW1hcCkgbWVtb3J5IHJlZ2lvbiBvZiBzaXplICVsZCBhdCBBQlNfUE9TOiVsZFxuIiwgCi0gICAgICAgICAgKGxvbmcpTVREUkFNX1RPVEFMX1NJWkUsIChsb25nKUNPTkZJR19NVERSQU1fQUJTX1BPUyk7Ci0gICAga2ZyZWUobXRkX2luZm8pOwotICAgIG10ZF9pbmZvID0gTlVMTDsKLSAgICByZXR1cm4gLUVOT01FTTsKLSAgfQotICBlcnIgPSBtdGRyYW1faW5pdF9kZXZpY2UobXRkX2luZm8sIGFkZHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVREUkFNX1RPVEFMX1NJWkUsICJtdGRyYW0gdGVzdCBkZXZpY2UiKTsKLSAgaWYgKGVycikgCi0gIHsKLSAgICBpb3VubWFwKGFkZHIpOwotICAgIGtmcmVlKG10ZF9pbmZvKTsKLSAgICBtdGRfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIGVycjsKLSAgfQotICBtZW1zZXQobXRkX2luZm8tPnByaXYsIDB4ZmYsIE1URFJBTV9UT1RBTF9TSVpFKTsKLSAgcmV0dXJuIGVycjsKLX0KLQotI2Vsc2UgLyogQ09ORklHX01URFJBTV9BQlNfUE9TID4gMCAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X210ZHJhbSh2b2lkKQogewotICB2b2lkICphZGRyOwotICBpbnQgZXJyOwotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSAqLwotICAgbXRkX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKLSAgIGlmICghbXRkX2luZm8pCi0gICAgIHJldHVybiAtRU5PTUVNOworCXZvaWQgKmFkZHI7CisJaW50IGVycjsKIAotICBhZGRyID0gdm1hbGxvYyhNVERSQU1fVE9UQUxfU0laRSk7Ci0gIGlmICghYWRkcikgewotICAgIERFQlVHKE1URF9ERUJVR19MRVZFTDEsIAotICAgICAgICAgICJGYWlsZWQgdG8gdm1hbGxvYyBtZW1vcnkgcmVnaW9uIG9mIHNpemUgJWxkXG4iLCAKLSAgICAgICAgICAobG9uZylNVERSQU1fVE9UQUxfU0laRSk7Ci0gICAga2ZyZWUobXRkX2luZm8pOwotICAgIG10ZF9pbmZvID0gTlVMTDsKLSAgICByZXR1cm4gLUVOT01FTTsKLSAgfQotICBlcnIgPSBtdGRyYW1faW5pdF9kZXZpY2UobXRkX2luZm8sIGFkZHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVREUkFNX1RPVEFMX1NJWkUsICJtdGRyYW0gdGVzdCBkZXZpY2UiKTsKLSAgaWYgKGVycikgCi0gIHsKLSAgICB2ZnJlZShhZGRyKTsKLSAgICBrZnJlZShtdGRfaW5mbyk7Ci0gICAgbXRkX2luZm8gPSBOVUxMOwotICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgbWVtc2V0KG10ZF9pbmZvLT5wcml2LCAweGZmLCBNVERSQU1fVE9UQUxfU0laRSk7Ci0gIHJldHVybiBlcnI7CisJaWYgKCF0b3RhbF9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5ICovCisJbXRkX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZF9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkZHIgPSB2bWFsbG9jKE1URFJBTV9UT1RBTF9TSVpFKTsKKwlpZiAoIWFkZHIpIHsKKwkJa2ZyZWUobXRkX2luZm8pOworCQltdGRfaW5mbyA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllcnIgPSBtdGRyYW1faW5pdF9kZXZpY2UobXRkX2luZm8sIGFkZHIsIE1URFJBTV9UT1RBTF9TSVpFLCAibXRkcmFtIHRlc3QgZGV2aWNlIik7CisJaWYgKGVycikgeworCQl2ZnJlZShhZGRyKTsKKwkJa2ZyZWUobXRkX2luZm8pOworCQltdGRfaW5mbyA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCW1lbXNldChtdGRfaW5mby0+cHJpdiwgMHhmZiwgTVREUkFNX1RPVEFMX1NJWkUpOworCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYgLyogIShDT05GSUdfTVREUkFNX0FCU19QT1MgPiAwKSAqLwotCi0jZWxzZSAvKiBDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgPiAwICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfbXRkcmFtKHZvaWQpCi17Ci0gIHJldHVybiAwOwotfQotI2VuZGlmIC8qICEoQ09ORklHX01URFJBTV9UT1RBTF9TSVpFID4gMCkgKi8KIAogbW9kdWxlX2luaXQoaW5pdF9tdGRyYW0pOwogbW9kdWxlX2V4aXQoY2xlYW51cF9tdGRyYW0pOwpAQCAtMjMyLDQgKzE2MCwzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgTGFyc3NvbiA8YWxleGxAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2ltdWxhdGVkIE1URCBkcml2ZXIgZm9yIHRlc3RpbmciKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9waHJhbS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9waHJhbS5jCmluZGV4IDVmOGUxNjQuLmE0MjNhMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvcGhyYW0uYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqICRJZDogcGhyYW0uYyx2IDEuMTEgMjAwNS8wMS8wNSAxODowNToxMyBkd213MiBFeHAgJAorICogJElkOiBwaHJhbS5jLHYgMS4xNCAyMDA1LzAzLzA3IDIxOjQzOjM4IGpvZXJuIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChjKSA/Pz8/CQlKb2NoZW4gU2No5HVibGUgPHBzaW9uaWNAcHNpb25pYy5kZT4KICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0CUr2cm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgpAQCAtMTUsOSArMTUsNyBAQAogICoKICAqIEV4YW1wbGU6CiAgKglwaHJhbT1zd2FwLDY0TWksMTI4TWkgcGhyYW09dGVzdCw5MDBNaSwxTWkKLSAqCiAgKi8KLQogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM2LDcgKzM0LDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQocGhyYW1fbGlzdCk7CiAKIAotCiBzdGF0aWMgaW50IHBocmFtX2VyYXNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCiB7CiAJdV9jaGFyICpzdGFydCA9IG10ZC0+cHJpdjsKQEAgLTcxLDcgKzY4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGhyYW1fdW5wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICphZGRyLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHBocmFtX3VucG9pbnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYWRkciwgbG9mZl90IGZyb20sCisJCXNpemVfdCBsZW4pCiB7CiB9CiAKQEAgLTgwLDggKzc4LDExIEBACiB7CiAJdV9jaGFyICpzdGFydCA9IG10ZC0+cHJpdjsKIAotCWlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCWlmIChmcm9tID49IG10ZC0+c2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuID4gbXRkLT5zaXplIC0gZnJvbSkKKwkJbGVuID0gbXRkLT5zaXplIC0gZnJvbTsKIAkKIAltZW1jcHkoYnVmLCBzdGFydCArIGZyb20sIGxlbik7CiAKQEAgLTk0LDggKzk1LDExIEBACiB7CiAJdV9jaGFyICpzdGFydCA9IG10ZC0+cHJpdjsKIAotCWlmICh0byArIGxlbiA+IG10ZC0+c2l6ZSkKKwlpZiAodG8gPj0gbXRkLT5zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4gPiBtdGQtPnNpemUgLSB0bykKKwkJbGVuID0gbXRkLT5zaXplIC0gdG87CiAJCiAJbWVtY3B5KHN0YXJ0ICsgdG8sIGJ1ZiwgbGVuKTsKIApAQCAtMTA3LDkgKzExMSw5IEBACiAKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfZGV2aWNlcyh2b2lkKQogewotCXN0cnVjdCBwaHJhbV9tdGRfbGlzdCAqdGhpczsKKwlzdHJ1Y3QgcGhyYW1fbXRkX2xpc3QgKnRoaXMsICpzYWZlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmcGhyYW1fbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzLCBzYWZlLCAmcGhyYW1fbGlzdCwgbGlzdCkgewogCQlkZWxfbXRkX2RldmljZSgmdGhpcy0+bXRkKTsKIAkJaW91bm1hcCh0aGlzLT5tdGQucHJpdik7CiAJCWtmcmVlKHRoaXMpOwpAQCAtMTQ1LDcgKzE0OSw3IEBACiAJbmV3LT5tdGQud3JpdGUgPSBwaHJhbV93cml0ZTsKIAluZXctPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwogCW5ldy0+bXRkLnR5cGUgPSBNVERfUkFNOwotCW5ldy0+bXRkLmVyYXNlc2l6ZSA9IDA7CisJbmV3LT5tdGQuZXJhc2VzaXplID0gUEFHRV9TSVpFOwogCiAJcmV0ID0gLUVBR0FJTjsKIAlpZiAoYWRkX210ZF9kZXZpY2UoJm5ldy0+bXRkKSkgewpAQCAtMjE0LDYgKzIxOCwxNSBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBraWxsX2ZpbmFsX25ld2xpbmUoY2hhciAqc3RyKQoreworCWNoYXIgKm5ld2xpbmUgPSBzdHJyY2hyKHN0ciwgJ1xuJyk7CisJaWYgKG5ld2xpbmUgJiYgIW5ld2xpbmVbMV0pCisJCSpuZXdsaW5lID0gMDsKK30KKworCiAjZGVmaW5lIHBhcnNlX2VycihmbXQsIGFyZ3MuLi4pIGRvIHsJXAogCUVSUk9SKGZtdCAsICMjIGFyZ3MpOwlcCiAJcmV0dXJuIDA7CQlcCkBAIC0yMzIsNiArMjQ1LDcgQEAKIAkJcGFyc2VfZXJyKCJwYXJhbWV0ZXIgdG9vIGxvbmdcbiIpOwogCiAJc3RyY3B5KHN0ciwgdmFsKTsKKwlraWxsX2ZpbmFsX25ld2xpbmUoc3RyKTsKIAogCWZvciAoaT0wOyBpPDM7IGkrKykKIAkJdG9rZW5baV0gPSBzdHJzZXAoJnN0ciwgIiwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvc2xyYW0uYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc2xyYW0uYwppbmRleCA1YWIxNWU2Li44NGZhOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9zbHJhbS5jCkBAIC0xLDYgKzEsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSAgJElkOiBzbHJhbS5jLHYgMS4zMyAyMDA1LzAxLzA1IDE4OjA1OjEzIGR3bXcyIEV4cCAkCisgICRJZDogc2xyYW0uYyx2IDEuMzQgMjAwNS8wMS8wNiAyMToxNjo0MiBqd2JveWVyIEV4cCAkCiAKICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBtZXRob2QgdG8gYWNjZXNzIG1lbW9yeSBub3QgdXNlZCBieSB0aGUga2VybmVsCiAgIGl0c2VsZiAoaS5lLiBpZiB0aGUga2VybmVsIGNvbW1hbmRsaW5lIG1lbT14eHggaXMgdXNlZCkuIFRvIGFjdHVhbGx5CkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogCiAjZGVmaW5lIFNMUkFNX01BWF9ERVZJQ0VTX1BBUkFNUyA2CQkvKiAzIHBhcmFtZXRlcnMgLyBkZXZpY2UgKi8KKyNkZWZpbmUgU0xSQU1fQkxLX1NaIDB4NDAwMAogCiAjZGVmaW5lIFQoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmbXQsICMjIGFyZ3MpCiAjZGVmaW5lIEUoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9OT1RJQ0UgZm10LCAjIyBhcmdzKQpAQCAtMTA4LDYgKzEwOSw5IEBACiB7CiAJc2xyYW1fcHJpdl90ICpwcml2ID0gbXRkLT5wcml2OwogCisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCiAJKm10ZGJ1ZiA9IHByaXYtPnN0YXJ0ICsgZnJvbTsKIAkqcmV0bGVuID0gbGVuOwogCXJldHVybigwKTsKQEAgLTEyMSw3ICsxMjUsMTMgQEAKIAkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQogewogCXNscmFtX3ByaXZfdCAqcHJpdiA9IG10ZC0+cHJpdjsKLQkKKworCWlmIChmcm9tID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCQlsZW4gPSBtdGQtPnNpemUgLSBmcm9tOworCiAJbWVtY3B5KGJ1ZiwgcHJpdi0+c3RhcnQgKyBmcm9tLCBsZW4pOwogCiAJKnJldGxlbiA9IGxlbjsKQEAgLTEzMyw2ICsxNDMsOSBAQAogewogCXNscmFtX3ByaXZfdCAqcHJpdiA9IG10ZC0+cHJpdjsKIAorCWlmICh0byArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltZW1jcHkocHJpdi0+c3RhcnQgKyB0bywgYnVmLCBsZW4pOwogCiAJKnJldGxlbiA9IGxlbjsKQEAgLTE4OCw3ICsyMDEsNyBAQAogCSgqY3VybXRkKS0+bXRkaW5mby0+bmFtZSA9IG5hbWU7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT5zaXplID0gbGVuZ3RoOwogCSgqY3VybXRkKS0+bXRkaW5mby0+ZmxhZ3MgPSBNVERfQ0xFQVJfQklUUyB8IE1URF9TRVRfQklUUyB8Ci0JCQkJCU1URF9XUklURUJfV1JJVEVBQkxFIHwgTVREX1ZPTEFUSUxFOworCQkJCQlNVERfV1JJVEVCX1dSSVRFQUJMRSB8IE1URF9WT0xBVElMRSB8IE1URF9DQVBfUkFNOwogICAgICAgICAoKmN1cm10ZCktPm10ZGluZm8tPmVyYXNlID0gc2xyYW1fZXJhc2U7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT5wb2ludCA9IHNscmFtX3BvaW50OwogCSgqY3VybXRkKS0+bXRkaW5mby0+dW5wb2ludCA9IHNscmFtX3VucG9pbnQ7CkBAIC0xOTYsNyArMjA5LDcgQEAKIAkoKmN1cm10ZCktPm10ZGluZm8tPndyaXRlID0gc2xyYW1fd3JpdGU7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT5vd25lciA9IFRISVNfTU9EVUxFOwogCSgqY3VybXRkKS0+bXRkaW5mby0+dHlwZSA9IE1URF9SQU07Ci0JKCpjdXJtdGQpLT5tdGRpbmZvLT5lcmFzZXNpemUgPSAweDA7CisJKCpjdXJtdGQpLT5tdGRpbmZvLT5lcmFzZXNpemUgPSBTTFJBTV9CTEtfU1o7CiAKIAlpZiAoYWRkX210ZF9kZXZpY2UoKCpjdXJtdGQpLT5tdGRpbmZvKSkJewogCQlFKCJzbHJhbTogRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldyBkZXZpY2VcbiIpOwpAQCAtMjYxLDcgKzI3NCw3IEBACiAJfQogCVQoInNscmFtOiBkZXZuYW1lPSVzLCBkZXZzdGFydD0weCVseCwgZGV2bGVuZ3RoPTB4JWx4XG4iLAogCQkJZGV2bmFtZSwgZGV2c3RhcnQsIGRldmxlbmd0aCk7Ci0JaWYgKChkZXZzdGFydCA8IDApIHx8IChkZXZsZW5ndGggPCAwKSkgeworCWlmICgoZGV2c3RhcnQgPCAwKSB8fCAoZGV2bGVuZ3RoIDwgMCkgfHwgKGRldmxlbmd0aCAlIFNMUkFNX0JMS19TWiAhPSAwKSkgewogCQlFKCJzbHJhbTogSWxsZWdhbCBzdGFydCAvIGxlbmd0aCBwYXJhbWV0ZXIuXG4iKTsKIAkJcmV0dXJuKC1FSU5WQUwpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Z0bC5jIGIvZHJpdmVycy9tdGQvZnRsLmMKaW5kZXggMThjYzg4NC4uZDlhYjYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvZnRsLmMKQEAgLTEsNSArMSw1IEBACiAvKiBUaGlzIHZlcnNpb24gcG9ydGVkIHRvIHRoZSBMaW51eC1NVEQgc3lzdGVtIGJ5IGR3bXcyQGluZnJhZGVhZC5vcmcKLSAqICRJZDogZnRsLmMsdiAxLjU0IDIwMDQvMTEvMTYgMTg6MzM6MTUgZHdtdzIgRXhwICQKKyAqICRJZDogZnRsLmMsdiAxLjU1IDIwMDUvMDEvMTcgMTM6NDc6MjEgaHZyIEV4cCAkCiAgKgogICogRml4ZXM6IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogICogLSBmaXhlcyBzb21lIGxlYWtzIG9uIGZhaWx1cmUgaW4gYnVpbGRfbWFwcyBhbmQgZnRsX25vdGlmeV9hZGQsIGNsZWFudXBzCkBAIC0zNTcsNiArMzU3LDcgQEAKICAgICBpZiAoIWVyYXNlKSAKICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogCisgICAgZXJhc2UtPm10ZCA9IHBhcnQtPm1iZC5tdGQ7CiAgICAgZXJhc2UtPmNhbGxiYWNrID0gZnRsX2VyYXNlX2NhbGxiYWNrOwogICAgIGVyYXNlLT5hZGRyID0geGZlci0+T2Zmc2V0OwogICAgIGVyYXNlLT5sZW4gPSAxIDw8IHBhcnQtPmhlYWRlci5FcmFzZVVuaXRTaXplOwpAQCAtMTA5Niw3ICsxMDk3LDcgQEAKIAogaW50IGluaXRfZnRsKHZvaWQpCiB7Ci0JREVCVUcoMCwgIiRJZDogZnRsLmMsdiAxLjU0IDIwMDQvMTEvMTYgMTg6MzM6MTUgZHdtdzIgRXhwICRcbiIpOworCURFQlVHKDAsICIkSWQ6IGZ0bC5jLHYgMS41NSAyMDA1LzAxLzE3IDEzOjQ3OjIxIGh2ciBFeHAgJFxuIik7CiAKIAlyZXR1cm4gcmVnaXN0ZXJfbXRkX2Jsa3RyYW5zKCZmdGxfdHIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IDg0ODAwNTcuLjQ0NzgxYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiAjIGRyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwotIyAkSWQ6IEtjb25maWcsdiAxLjQyIDIwMDUvMDEvMDUgMTY6NTk6NTAgZHdtdzIgRXhwICQKKyMgJElkOiBLY29uZmlnLHYgMS41NSAyMDA1LzA3LzAyIDAxOjUzOjI0IHRwb3lub3IgRXhwICQKIAogbWVudSAiTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcyIKIAlkZXBlbmRzIG9uIE1URCE9bgpAQCAtMTIyLDE2ICsxMjIsNiBAQAogCSAgTW9yZSBpbmZvIGF0CiAJICA8aHR0cDovL3d3dy5hcmNvbWNvbnRyb2xzLmNvbS9wcm9kdWN0cy9pY3AvcGMxMDQvcHJvY2Vzc29ycy9TQkNfR1gxLmh0bT4uCiAKLWNvbmZpZyBNVERfRUxBTl8xMDROQwotCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBBcmNvbSBFTEFOLTEwNE5DIgotCWRlcGVuZHMgb24gWDg2ICYmIE1URF9DRklfSU5URUxFWFQgJiYgTVREX1BBUlRJVElPTlMgJiYgTVREX0NPTVBMRVhfTUFQUElOR1MKLQloZWxwCi0JICBUaGlzIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgb24tYm9hcmQgZmxhc2ggb2YgdGhlIEFyY29tIENvbnRyb2wKLQkgIFN5c3RlbSdzIEVMQU4tMTA0TkMgZGV2ZWxvcG1lbnQgYm9hcmQuIEJ5IGRlZmF1bHQgdGhlIGZsYXNoCi0JICBpcyBzcGxpdCBpbnRvIDMgcGFydGl0aW9ucyB3aGljaCBhcmUgYWNjZXNzZWQgYXMgc2VwYXJhdGUgTVRECi0JICBkZXZpY2VzLiBUaGlzIGJvYXJkIHV0aWxpemVzIEludGVsIFN0cmF0YUZsYXNoLiBNb3JlIGluZm8gYXQKLQkgIDxodHRwOi8vd3d3LmFyY29tY29udHJvbHMuY29tL3Byb2R1Y3RzL2ljcC9wYzEwNC9wcm9jZXNzb3JzL0VMQU4xMDROQy5odG0+LgotCiBjb25maWcgTVREX0xVQkJPQ0sKIAl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gSW50ZWwgTHViYm9jayBYU2NhbGUgZXZhbCBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfTFVCQk9DSyAmJiBNVERfQ0ZJX0lOVEVMRVhUICYmIE1URF9QQVJUSVRJT05TCkBAIC0xMzksNiArMTI5LDE0IEBACiAJICBUaGlzIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgb24tYm9hcmQgZmxhc2ggb2YgdGhlIEludGVsCiAJICAnTHViYm9jaycgWFNjYWxlIGV2YWx1YXRpb24gYm9hcmQuCiAKK2NvbmZpZyBNVERfTUFJTlNUT05FCisJdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIEludGVsIE1haW5zdG9uZSBYU2NhbGUgZXZhbCBib2FyZCIKKwlkZXBlbmRzIG9uIE1BQ0hfTUFJTlNUT05FICYmIE1URF9DRklfSU5URUxFWFQKKwlzZWxlY3QgTVREX1BBUlRJVElPTlMKKwloZWxwCisJICBUaGlzIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgb24tYm9hcmQgZmxhc2ggb2YgdGhlIEludGVsCisJICAnTWFpbnN0b25lIFBYQTI3eCBldmFsdWF0aW9uIGJvYXJkLgorCiBjb25maWcgTVREX09DVEFHT04KIAl0cmlzdGF0ZSAiSkVERUMgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBPY3RhZ29uIDUwNjYgU0JDIgogCWRlcGVuZHMgb24gWDg2ICYmIE1URF9KRURFQyAmJiBNVERfQ09NUExFWF9NQVBQSU5HUwpAQCAtMjEzLDc0ICsyMTEsMTEgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBmbGFzaCBjaGlwcyBvbiBORVR0ZWwvU2VjdXJlRWRnZS9TbmFwR2VhciBib2FyZHMuCiAKLWNvbmZpZyBNVERfUEIxWFhYCi0JdHJpc3RhdGUgIkZsYXNoIGRldmljZXMgb24gQWxjaGVteSBQQjF4eHggYm9hcmRzIgotCWRlcGVuZHMgb24gTUlQUyAmJiAoIE1JUFNfUEIxMDAwIHx8IE1JUFNfUEIxMTAwIHx8IE1JUFNfUEIxNTAwICkKK2NvbmZpZyBNVERfQUxDSEVNWQorCXRyaXN0YXRlICcgIEFNRCBBbGNoZW15IFBiMXh4eC9EYjF4eHgvUkRLIE1URCBzdXBwb3J0JyAKKwlkZXBlbmRzIG9uIE1JUFMgJiYgU09DX0FVMVgwMAogCWhlbHAKLQkgIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBQYjEwMDAvUGIxMTAwL1BiMTUwMCBib2FyZHMKLQotY29uZmlnIE1URF9QQjFYWFhfQk9PVAotCWJvb2wgIlBCMXgwMCBib290IGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9QQjFYWFggJiYgKCBNSVBTX1BCMTEwMCB8fCBNSVBTX1BCMTUwMCApCi0JaGVscAotCSAgVXNlIHRoZSBmaXJzdCBvZiB0aGUgdHdvIDMyTWlCIGZsYXNoIGJhbmtzIG9uIFBiMTEwMC9QYjE1MDAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX1BCMVhYWF9VU0VSJyBiZWxvdywgdG8gdXNlCi0JICBib3RoIGJhbmtzLgotCi1jb25maWcgTVREX1BCMVhYWF9VU0VSCi0JYm9vbCAiUEIxeDAwIHVzZXIgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX1BCMVhYWCAmJiAoIE1JUFNfUEIxMTAwIHx8IE1JUFNfUEIxNTAwICkKLQlkZWZhdWx0IHkgaWYgTVREX1BCMVhYX0JPT1QgPSBuCi0JaGVscAotCSAgVXNlIHRoZSBzZWNvbmQgb2YgdGhlIHR3byAzMk1pQiBmbGFzaCBiYW5rcyBvbiBQYjExMDAvUGIxNTAwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9QQjFYWFhfQk9PVCcgYWJvdmUsIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KLQotY29uZmlnIE1URF9QQjE1NTAKLQl0cmlzdGF0ZSAiRmxhc2ggZGV2aWNlcyBvbiBBbGNoZW15IFBCMTU1MCBib2FyZCIKLQlkZXBlbmRzIG9uIE1JUFMgJiYgTUlQU19QQjE1NTAKLQloZWxwCi0JICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgUGIxNTUwIGJvYXJkCi0KLWNvbmZpZyBNVERfUEIxNTUwX0JPT1QKLQlib29sICJQQjE1NTAgYm9vdCBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfUEIxNTUwCi0JaGVscAotCSAgVXNlIHRoZSBmaXJzdCBvZiB0aGUgdHdvIDY0TWlCIGZsYXNoIGJhbmtzIG9uIFBiMTU1MCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfUEIxNTUwX1VTRVInIGJlbG93LCB0byB1c2UKLQkgIGJvdGggYmFua3MuCi0KLWNvbmZpZyBNVERfUEIxNTUwX1VTRVIKLQlib29sICJQQjE1NTAgdXNlciBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfUEIxNTUwCi0JZGVmYXVsdCB5IGlmIE1URF9QQjE1NTBfQk9PVCA9IG4KLQloZWxwCi0JICBVc2UgdGhlIHNlY29uZCBvZiB0aGUgdHdvIDY0TWlCIGZsYXNoIGJhbmtzIG9uIFBiMTU1MCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfUEIxNTUwX0JPT1QnIGFib3ZlLCB0byB1c2UKLQkgIGJvdGggYmFua3MuCi0KLWNvbmZpZyBNVERfREIxNTUwCi0JdHJpc3RhdGUgIkZsYXNoIGRldmljZXMgb24gQWxjaGVteSBEQjE1NTAgYm9hcmQiCi0JZGVwZW5kcyBvbiBNSVBTICYmIE1JUFNfREIxNTUwCi0JaGVscAotCSAgRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IERiMTU1MCBib2FyZAotCi1jb25maWcgTVREX0RCMTU1MF9CT09UCi0JYm9vbCAiREIxNTUwIGJvb3QgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX0RCMTU1MAotCWhlbHAKLQkgIFVzZSB0aGUgZmlyc3Qgb2YgdGhlIHR3byA2NE1pQiBmbGFzaCBiYW5rcyBvbiBEYjE1NTAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX0RCMTU1MF9VU0VSJyBiZWxvdywgdG8gdXNlCi0JICBib3RoIGJhbmtzLgotCi1jb25maWcgTVREX0RCMTU1MF9VU0VSCi0JYm9vbCAiREIxNTUwIHVzZXIgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX0RCMTU1MAotCWRlZmF1bHQgeSBpZiBNVERfREIxNTUwX0JPT1QgPSBuCi0JaGVscAotCSAgVXNlIHRoZSBzZWNvbmQgb2YgdGhlIHR3byA2NE1pQiBmbGFzaCBiYW5rcyBvbiBEYjE1NTAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX0RCMTU1MF9CT09UJyBhYm92ZSwgdG8gdXNlCi0JICBib3RoIGJhbmtzLgorCSAgRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBTUQgQWxjaGVteSBQYi9EYi9SREsgUmVmZXJlbmNlIEJvYXJkcwogCiBjb25maWcgTVREX0RJTE5FVFBDCiAJdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIERJTC9OZXQgUEMiCkBAIC01ODgsNiArNTIzLDE1IEBACiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwcyBvbiB0aGUgSW50ZXJmYWNlIE1QQy0xMjExKENUUC9QQ0kvTVBDLVNIMDIpLgogCSAgSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLCBzYXkgJ1knLgogCitjb25maWcgTVREX09NQVBfTk9SCisJdHJpc3RhdGUgIlRJIE9NQVAgYm9hcmQgbWFwcGluZ3MiCisJZGVwZW5kcyBvbiBNVERfQ0ZJICYmIEFSQ0hfT01BUAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIE5PUiBmbGFzaCBjaGlwcyBvbiBUSSBPTUFQLWJhc2VkCisJICBib2FyZHMgZGVmaW5pbmcgZmxhc2ggcGxhdGZvcm0gZGV2aWNlcyBhbmQgZmxhc2ggcGxhdGZvcm0gZGF0YS4KKwkgIFRoZXNlIGJvYXJkcyBpbmNsdWRlIHRoZSBJbm5vdmF0b3IsIEgyLCBIMywgT1NLLCBQZXJzZXVzMiwgYW5kCisJICBtb3JlLiAgSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLCBzYXkgJ1knLgorCiAjIFRoaXMgbmVlZHMgQ0ZJIG9yIEpFREVDLCBkZXBlbmRpbmcgb24gdGhlIGNhcmRzIGZvdW5kLgogY29uZmlnIE1URF9QQ0kKIAl0cmlzdGF0ZSAiUENJIE1URCBkcml2ZXIiCkBAIC02MDcsNiArNTUxLDE2IEBACiAJICBjYXJkcyBhcmUgdXN1YWxseSBhcm91bmQgNC0xNk1pQiBpbiBzaXplLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUKIAkgIENvbXBhY3QgRmxhc2ggY2FyZHMgd2hpY2ggYXJlIHRyZWF0ZWQgYXMgSURFIGRldmljZXMuCiAKK2NvbmZpZyBNVERfUENNQ0lBX0FOT05ZTU9VUworCWJvb2wgIlVzZSBQQ01DSUEgTVREIGRyaXZlcnMgZm9yIGFub255bW91cyBQQ01DSUEgY2FyZHMiCisJZGVwZW5kcyBvbiBNVERfUENNQ0lBCisJZGVmYXVsdCBOCisJaGVscAorCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgUENNQ0lBIGNhcmRzIHdoaWNoIGRvIG5vdCByZXBvcnQKKwkgIGFueXRoaW5nIGFib3V0IHRoZW1zZWx2ZXMgYXJlIGFzc3VtZWQgdG8gYmUgTVREIGNhcmRzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTVREX1VDTElOVVgKIAl0cmlzdGF0ZSAiR2VuZXJpYyB1Q2xpbnV4IFJBTS9ST00gZmlsZXN5c3RlbSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTVREX1BBUlRJVElPTlMgJiYgIU1NVQpAQCAtNjM3LDEzICs1OTEsMTQgQEAKICAgICAgICAgICBNYXAgZHJpdmVyIGZvciBEeS00IFNWTUUvRE1WLTE4MiBib2FyZC4KIAogY29uZmlnIE1URF9CQVNUCi0JdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpIgotCWRlcGVuZHMgb24gQVJDSF9CQVNUCisJdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpIG9yIFRob3Jjb20gVlIxMDAwIgorCWRlcGVuZHMgb24gQVJDSF9CQVNUIHx8IE1BQ0hfVlIxMDAwCiAJc2VsZWN0IE1URF9QQVJUSVRJT05TCiAJc2VsZWN0IE1URF9NQVBfQkFOS19XSURUSF8xNgogCXNlbGVjdCBNVERfSkVERUNQUk9CRQogCWhlbHAKLQkgIE1hcCBkcml2ZXIgZm9yIE5PUiBmbGFzaCBvbiB0aGUgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCkuCisJICBNYXAgZHJpdmVyIGZvciBOT1IgZmxhc2ggb24gdGhlIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpLCBvciB0aGUKKwkgIFRob3Jjb20gVlIxMDAwCiAKIAkgIE5vdGUsIHRoaXMgZHJpdmVyICpjYW5ub3QqIG92ZXItcmlkZSB0aGUgV1AgbGluayBvbiB0aGUKIAkgIGJvYXJkLCBvciBjdXJyZW50bHkgZGV0ZWN0IHRoZSBzdGF0ZSBvZiB0aGUgbGluay4KQEAgLTY1OSw1ICs2MTQsMTUgQEAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwIG9uIHRoZSBTaGFycCBTTCBTZXJpZXMgb2YgUERBcy4KIAorY29uZmlnIE1URF9QTEFUUkFNCisJdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIHBsYXRmb3JtIGRldmljZSBSQU0gKG10ZC1yYW0pIgorCWRlcGVuZHMgb24gTVRECisJc2VsZWN0IE1URF9SQU0KKwloZWxwCisJICBNYXAgZHJpdmVyIGZvciBSQU0gYXJlYXMgZGVzY3JpYmVkIHZpYSB0aGUgcGxhdGZvcm0gZGV2aWNlCisJICBzeXN0ZW0uCisKKwkgIFRoaXMgc2VsZWN0aW9uIGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgbWFwX3JhbSBkcml2ZXIuCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKaW5kZXggN2ZmZTAyYi4uN2JjYmM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBsaW51eC9kcml2ZXJzL21hcHMvTWFrZWZpbGUKICMKLSMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjIzIDIwMDUvMDEvMDUgMTc6MDY6MzYgZHdtdzIgRXhwICQKKyMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjMwIDIwMDUvMDcvMDIgMDE6NTM6MjQgdHBveW5vciBFeHAgJAogCiBpZmVxICgkKENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUykseSkKIG9iai0kKENPTkZJR19NVEQpCQkrPSBtYXBfZnVuY3MubwpAQCAtMTUsNyArMTUsNiBAQAogb2JqLSQoQ09ORklHX01URF9DU1RNX01JUFNfSVhYKQkrPSBjc3RtX21pcHNfaXh4Lm8KIG9iai0kKENPTkZJR19NVERfREMyMTI4NSkJKz0gZGMyMTI4NS5vCiBvYmotJChDT05GSUdfTVREX0RJTE5FVFBDKQkrPSBkaWxuZXRwYy5vCi1vYmotJChDT05GSUdfTVREX0VMQU5fMTA0TkMpCSs9IGVsYW4tMTA0bmMubwogb2JqLSQoQ09ORklHX01URF9FUFhBMTBEQikJKz0gZXB4YTEwZGItZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9JUTgwMzEwKQkrPSBpcTgwMzEwLm8KIG9iai0kKENPTkZJR19NVERfTDQ0MEdYKQkrPSBsNDQwZ3gubwpAQCAtMjMsNiArMjIsNyBAQAogb2JqLSQoQ09ORklHX01URF9JQ0hYUk9NKQkrPSBpY2h4cm9tLm8KIG9iai0kKENPTkZJR19NVERfVFNVTkFNSSkJKz0gdHN1bmFtaV9mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0xVQkJPQ0spCSs9IGx1YmJvY2stZmxhc2gubworb2JqLSQoQ09ORklHX01URF9NQUlOU1RPTkUpCSs9IG1haW5zdG9uZS1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX01CWDg2MCkJKz0gbWJ4ODYwLm8KIG9iai0kKENPTkZJR19NVERfQ0VJVkEpCQkrPSBjZWl2YS5vCiBvYmotJChDT05GSUdfTVREX09DVEFHT04pCSs9IG9jdGFnb24tNTA2Ni5vCkBAIC00NCwxMCArNDQsNyBAQAogb2JqLSQoQ09ORklHX01URF9PQ0VMT1QpCSs9IG9jZWxvdC5vCiBvYmotJChDT05GSUdfTVREX1NPTFVUSU9ORU5HSU5FKSs9IHNvbHV0aW9uZW5naW5lLm8KIG9iai0kKENPTkZJR19NVERfUENJKQkJKz0gcGNpLm8KLW9iai0kKENPTkZJR19NVERfUEIxWFhYKQkrPSBwYjF4eHgtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9EQjFYMDApICAgICAgICArPSBkYjF4MDAtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9QQjE1NTApICAgICAgICArPSBwYjE1NTAtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9EQjE1NTApICAgICAgICArPSBkYjE1NTAtZmxhc2gubworb2JqLSQoQ09ORklHX01URF9BTENIRU1ZKSAgICAgICArPSBhbGNoZW15LWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTEFTQVQpCQkrPSBsYXNhdC5vCiBvYmotJChDT05GSUdfTVREX0FVVENQVTEyKQkrPSBhdXRjcHUxMi1udnJhbS5vCiBvYmotJChDT05GSUdfTVREX0VEQjczMTIpCSs9IGVkYjczMTIubwpAQCAtNzEsMyArNjgsNSBAQAogb2JqLSQoQ09ORklHX01URF9XUlNCQzgyNjApCSs9IHdyX3NiYzgyeHhfZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9ETVYxODIpCSs9IGRtdjE4Mi5vCiBvYmotJChDT05GSUdfTVREX1NIQVJQX1NMKQkrPSBzaGFycHNsLWZsYXNoLm8KK29iai0kKENPTkZJR19NVERfUExBVFJBTSkJKz0gcGxhdC1yYW0ubworb2JqLSQoQ09ORklHX01URF9PTUFQX05PUikJKz0gb21hcF9ub3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2FsY2hlbXktZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFNRCBBbGNoZW15IGV2YWx1YXRpb24gYm9hcmRzCisgKiAKKyAqICRJZDogYWxjaGVteS1mbGFzaC5jLHYgMS4xIDIwMDUvMDIvMjcgMjE6NTA6MjEgcHBvcG92IEV4cCAkCisgKgorICogKEMpIDIwMDMsIDIwMDQgUGV0ZSBQb3BvdiA8cHBvcG92QGVtYmVkZGVkYWxsZXkuY29tPgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiAJREVCVUdfUlcKKyNkZWZpbmUJREJHKHguLi4pCXByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjEwMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTAwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAwODAwMDAwIC8qIDhNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfUEIxNTAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJQYjE1MDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjExMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTEwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDA0MDAwMDAwIC8qIDY0TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTU1MAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxNTUwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTIwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxMjAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggMiAvKiAxNi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTAwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxMDAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDIwMDAwMDAgLyogMzJNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJEYjE1MDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMjAwMDAwMCAvKiAzMk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19EQjExMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkRiMTEwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAyMDAwMDAwIC8qIDMyTUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTU1MAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxNTUwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTIwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxMjAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDQwMDAwMDAgLyogNjRNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCAyIC8qIDE2LWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfSFlEUk9HRU4zCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJIeWRyb2dlbjMgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMjAwMDAwMCAvKiAzMk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2RlZmluZSBVU0VfTE9DQUxfQUNDRVNTT1JTIC8qIHdoeT8gKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkJvc3BvcnVzIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDEwMDAwMDAgLyogMTZNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCAyIC8qIDE2LWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJNaXJhZ2UgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2RlZmluZSBVU0VfTE9DQUxfQUNDRVNTT1JTIC8qIHdoeT8gKi8KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1hcF9pbmZvIGFsY2hlbXlfbWFwID0geworCS5uYW1lID0JQk9BUkRfTUFQX05BTUUsCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYWxjaGVteV9wYXJ0aXRpb25zW10gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubmFtZSA9ICJVc2VyIEZTIiwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IEJPQVJEX0ZMQVNIX1NJWkUgLSAweDAwNDAwMDAwLAorICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKKyAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgLm5hbWUgPSAiWUFNT04iLAorICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQorICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKKwkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKyAgICAgICAgfQorfTsKKworI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOworCitpbnQgX19pbml0IGFsY2hlbXlfbXRkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisJaW50IG5iX3BhcnRzID0gMDsKKwl1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOworCXVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7CisJCisJLyogRGVmYXVsdCBmbGFzaCBidXN3aWR0aCAqLworCWFsY2hlbXlfbWFwLmJhbmt3aWR0aCA9IEJPQVJEX0ZMQVNIX1dJRFRIOworCisJd2luZG93X2FkZHIgPSAweDIwMDAwMDAwIC0gQk9BUkRfRkxBU0hfU0laRTsKKwl3aW5kb3dfc2l6ZSA9IEJPQVJEX0ZMQVNIX1NJWkU7CisjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFX1dIWQorCS8qIEJvb3QgUk9NIGZsYXNoIGJhbmsgb25seTsgbm8gdXNlciBiYW5rICovCisJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOworCXdpbmRvd19zaXplID0gMHgwNDAwMDAwMDsKKwkvKiBVU0VSRlMgZnJvbSAweDFDMDAgMDAwMCB0byAweDFGQzAwMDAwICovCisJYWxjaGVteV9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDAzQzAwMDAwOworI2VuZGlmCisKKwkvKgorCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KKwkgKi8KKwlwYXJ0cyA9IGFsY2hlbXlfcGFydGl0aW9uczsKKwluYl9wYXJ0cyA9IE5CX09GKGFsY2hlbXlfcGFydGl0aW9ucyk7CisJYWxjaGVteV9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOworCisJLyoKKwkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCisJICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgorCSAqLworCXByaW50ayhLRVJOX05PVElDRSBCT0FSRF9NQVBfTkFNRSAiOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAorCQkJYWxjaGVteV9tYXAuYmFua3dpZHRoKjgpOworCWFsY2hlbXlfbWFwLnZpcnQgPSBpb3JlbWFwKHdpbmRvd19hZGRyLCB3aW5kb3dfc2l6ZSk7CisJbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZhbGNoZW15X21hcCk7CisJaWYgKCFteW10ZCkgeworCQlpb3VubWFwKGFsY2hlbXlfbWFwLnZpcnQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsY2hlbXlfbXRkX2NsZWFudXAodm9pZCkKK3sKKwlpZiAobXltdGQpIHsKKwkJZGVsX210ZF9wYXJ0aXRpb25zKG15bXRkKTsKKwkJbWFwX2Rlc3Ryb3kobXltdGQpOworCQlpb3VubWFwKGFsY2hlbXlfbWFwLnZpcnQpOworCX0KK30KKworbW9kdWxlX2luaXQoYWxjaGVteV9tdGRfaW5pdCk7Cittb2R1bGVfZXhpdChhbGNoZW15X210ZF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zLCBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTihCT0FSRF9NQVBfTkFNRSAiIE1URCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMgYi9kcml2ZXJzL210ZC9tYXBzL2FtZDc2eHJvbS5jCmluZGV4IDUxZTk3YjAuLmU4YTkwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbWQ3Nnhyb20uYwpAQCAtMiw3ICsyLDcgQEAKICAqIGFtZDc2eHJvbS5jCiAgKgogICogTm9ybWFsIG1hcHBpbmdzIG9mIGNoaXBzIGluIHBoeXNpY2FsIG1lbW9yeQotICogJElkOiBhbWQ3Nnhyb20uYyx2IDEuMTkgMjAwNC8xMS8yOCAwOTo0MDozOSBkd213MiBFeHAgJAorICogJElkOiBhbWQ3Nnhyb20uYyx2IDEuMjAgMjAwNS8wMy8xOCAxNDowNDozNSBnbGVpeG5lciBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMxNCw3ICszMTQsNyBAQAogCX0KIAlyZXR1cm4gLUVOWElPOwogI2lmIDAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhbWQ3Nnhyb21fZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYW1kNzZ4cm9tX2RyaXZlcik7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9iYXN0LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYwppbmRleCA0NGRlM2E4Li4wYzQ1NDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYwpAQCAtMSwxNCArMSwxNSBAQAogLyogbGludXgvZHJpdmVycy9tdGQvbWFwcy9iYXN0X2ZsYXNoLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCiAgKiBTaW10ZWMgQmFzdCAoRUIyNDEwSVRYKSBOT1IgTVREIE1hcHBpbmcgZHJpdmVyCiAgKgogICogQ2hhbmdlbG9nOgogICoJMjAtU2VwLTIwMDQgIEJKRCAgSW5pdGlhbCB2ZXJzaW9uCisgKgkxNy1KYW4tMjAwNSAgQkpEICBBZGQgd2hvbGUgZGV2aWNlIGlmIG5vIHBhcnRpdGlvbnMgZm91bmQKICAqCi0gKiAkSWQ6IGJhc3QtZmxhc2guYyx2IDEuMSAyMDA0LzA5LzIxIDE0OjI5OjA0IGJqZCBFeHAgJAorICogJElkOiBiYXN0LWZsYXNoLmMsdiAxLjIgMjAwNS8wMS8xOCAxMToxMzo0NyBiamQgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ2LDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LWNwbGQuaD4KIAogI2lmZGVmIENPTkZJR19NVERfQkFTVF9NQVhTSVpFCi0jZGVmaW5lIEFSRUFfTUFYU0laRSAoQ09ORklHX01URF9CQVNUX01BWFNJWkUgKiAoMTAyNCoxMDI0KSkKKyNkZWZpbmUgQVJFQV9NQVhTSVpFIChDT05GSUdfTVREX0JBU1RfTUFYU0laRSAqIFNaXzFNKQogI2Vsc2UKLSNkZWZpbmUgQVJFQV9NQVhTSVpFICgzMioxMDI0KjEwMjQpCisjZGVmaW5lIEFSRUFfTUFYU0laRSAoMzIgKiBTWl8xTSkKICNlbmRpZgogCiAjZGVmaW5lIFBGWCAiYmFzdC1mbGFzaDogIgpAQCAtMTg5LDYgKzE5MCw4IEBACiAJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsIGVycik7CiAJCWlmIChlcnIpIAogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IGFkZC9wYXJzZSBwYXJ0aXRpb25zXG4iKTsKKwl9IGVsc2UgeworCQllcnIgPSBhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpOwogCX0KIAogCWlmIChlcnIgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvZGIxNTUwLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2RiMTU1MC1mbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEzODg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZGIxNTUwLWZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBEYjE1NTAgYm9hcmQKLSAqIAotICogJElkOiBkYjE1NTAtZmxhc2guYyx2IDEuNyAyMDA0LzExLzA0IDEzOjI0OjE0IGdsZWl4bmVyIEV4cCAkCi0gKgotICogKEMpIDIwMDQgRW1iZWRkZWQgRWRnZSwgTExDLCBiYXNlZCBvbiBkYjE1NTAtZmxhc2guYzoKLSAqIChDKSAyMDAzLCAyMDA0IFBldGUgUG9wb3YgPHBwb3BvdkBlbWJlZGRlZGFsbGV5LmNvbT4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWZkZWYgCURFQlVHX1JXCi0jZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQkKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB3aW5kb3dfYWRkcjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplOwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gZGIxNTUwX21hcCA9IHsKLQkubmFtZSA9CSJEYjE1NTAgZmxhc2giLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZmxhc2hfYmFua3dpZHRoID0gNDsKLQotLyogCi0gKiBTdXBwb3J0IG9ubHkgNjRNQiBOT1IgRmxhc2ggcGFydHMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX0RCMTU1MF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX1VTRVIpCi0jZGVmaW5lIERCMTU1MF9CT1RIX0JBTktTCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX1VTRVIpCi0jZGVmaW5lIERCMTU1MF9CT09UX09OTFkKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfVVNFUikKLSNkZWZpbmUgREIxNTUwX1VTRVJfT05MWQotI2VuZGlmCi0KLSNpZmRlZiBEQjE1NTBfQk9USF9CQU5LUwotLyogYm90aCBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IGJhbmsgYW5kIHRoZSBmaXJzdCAKLSAqIHBhcnQgb2YgdGhlIHNlY29uZCBiYW5rIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgamZmcy9qZmZzMgotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxQzAwIDAwMDAgMUZGRiBGRkZGIENFMCA2NE1CIEJvb3QgTk9SIEZsYXNoCi0JICogMTgwMCAwMDAwIDFCRkYgRkZGRiBDRTAgNjRNQiBQYXJhbSBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAoMHgxRkMwMDAwMCAtIDB4MTgwMDAwMDApLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoREIxNTUwX0JPT1RfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAweDAzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgeWFtb24gZW52ICovCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxpZiBkZWZpbmVkKERCMTU1MF9VU0VSX09OTFkpCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAoMHg0MDAwMDAwIC0gMHgyMDAwMDApLCAvKiByZXNlcnZlIDJNQiBmb3IgcmF3IGtlcm5lbCAqLwotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAicmF3IGtlcm5lbCIsCi0JCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX0RCMTU1MCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTkJfT0YoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChEQjE1NTBfQk9USF9CQU5LUykKLQkJCXdpbmRvd19hZGRyID0gMHgxODAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg4MDAwMDAwOyAKLSNlbGlmIGRlZmluZWQoREIxNTUwX0JPT1RfT05MWSkKLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOyAKLSNlbHNlIC8qIFVTRVIgT05MWSAqLwotCQkJd2luZG93X2FkZHIgPSAweDE4MDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2luaXQgZGIxNTUwX210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JCi0JLyogRGVmYXVsdCBmbGFzaCBiYW5rd2lkdGggKi8KLQlkYjE1NTBfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQotCWlmIChzZXR1cF9mbGFzaF9wYXJhbXMoKSkgCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKgotCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KLQkgKi8KLQlwYXJ0cyA9IGRiMTU1MF9wYXJ0aXRpb25zOwotCW5iX3BhcnRzID0gTkJfT0YoZGIxNTUwX3BhcnRpdGlvbnMpOwotCWRiMTU1MF9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiRGIxNTUwIGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJZGIxNTUwX21hcC5iYW5rd2lkdGgqOCk7Ci0JZGIxNTUwX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmZGIxNTUwX21hcCk7Ci0JaWYgKCFteW10ZCkgcmV0dXJuIC1FTlhJTzsKLQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRiMTU1MF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChteW10ZCkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JCWlvdW5tYXAoKHZvaWQgKikgZGIxNTUwX21hcC52aXJ0KTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGRiMTU1MF9tdGRfaW5pdCk7Ci1tb2R1bGVfZXhpdChkYjE1NTBfbXRkX2NsZWFudXApOwotCi1NT0RVTEVfQVVUSE9SKCJFbWJlZGRlZCBFZGdlLCBMTEMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGIxNTUwIG10ZCBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2RiMXgwMC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9kYjF4MDAtZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhNjhlYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2RiMXgwMC1mbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgRGIxeHh4IGJvYXJkcwotICogCi0gKiAkSWQ6IGRiMXgwMC1mbGFzaC5jLHYgMS42IDIwMDQvMTEvMDQgMTM6MjQ6MTQgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiAoQykgMjAwMyBQZXRlIFBvcG92IDxwcG9wb3ZAZW1iZWRkZWRhbGxleS5jb20+Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmZGVmIAlERUJVR19SVwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikJCi0jZW5kaWYKLQotLyogTVREIENPTkZJRyBPUFRJT05TICovCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX0RCMVgwMF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX1VTRVIpCi0jZGVmaW5lIERCMVgwMF9CT1RIX0JBTktTCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX1VTRVIpCi0jZGVmaW5lIERCMVgwMF9CT09UX09OTFkKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfVVNFUikKLSNkZWZpbmUgREIxWDAwX1VTRVJfT05MWQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBmbGFzaF9zaXplOwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgKmJjc3IgPSAodW5zaWduZWQgc2hvcnQgKikweEFFMDAwMDAwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgZmxhc2hfYmFua3dpZHRoID0gNDsKLQotLyogCi0gKiBUaGUgRGIxeCBib2FyZHMgc3VwcG9ydCBkaWZmZXJlbnQgZmxhc2ggZGVuc2l0aWVzLiBXZSBzZXR1cAotICogdGhlIG10ZF9wYXJ0aXRpb24gc3RydWN0dXJlcyBiZWxvdyBmb3IgZGVmYXVsdCBvZiA2NE1iaXQgCi0gKiBmbGFzaCBkZW5zaXRpZXMsIGFuZCBvdmVycmlkZSB0aGUgcGFydGl0aW9ucyBzaXplcywgaWYKLSAqIG5lY2Vzc2FyeSwgYWZ0ZXIgd2UgY2hlY2sgdGhlIGJvYXJkIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotCi0jaWZkZWYgREIxWDAwX0JPVEhfQkFOS1MKLS8qIGJvdGggYmFua3Mgd2lsbCBiZSB1c2VkLiBDb21iaW5lIHRoZSBmaXJzdCBiYW5rIGFuZCB0aGUgZmlyc3QgCi0gKiBwYXJ0IG9mIHRoZSBzZWNvbmQgYmFuayB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGpmZnMvamZmczIKLSAqIHBhcnRpdGlvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMXgwMF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MWMwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAweDAxMDAwMDAsCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJyYXcga2VybmVsIiwKLQkJLnNpemUgICAgICAgICA9ICAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgZW52ICovCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMXgwMF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MDBjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgMHgwMTAwMDAwLAotCQkub2Zmc2V0ICAgICAgID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAicmF3IGtlcm5lbCIsCi0JCS5zaXplICAgICAgICAgPSAgKDB4MzAwMDAwLTB4NDAwMDApLCAvKiBsYXN0IDI1NktCIGlzIGVudiAqLwotCQkub2Zmc2V0ICAgICAgID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoREIxWDAwX1VTRVJfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjF4MDBfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAweDBlMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAicmF3IGtlcm5lbCIsCi0JCS5zaXplICAgICAgICAgPSAgTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCAgICAgICA9ICBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxzZQotI2Vycm9yIE1URF9EQjFYMDAgZGVmaW5lIGNvbWJvIGVycm9yIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSNlbmRpZgotI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCi0KLSNkZWZpbmUgTkFNRSAgICAgCSJEYjF4MDAgTGludXggRmxhc2giCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gZGIxeHh4X210ZF9tYXAgPSB7Ci0JLm5hbWUJCT0gTkFNRSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFyc2VkX3BhcnRzOwotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqZGIxeHh4X210ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0Jc3dpdGNoICgoYmNzclsyXSA+PiAxNCkgJiAweDMpIHsKLQkJY2FzZSAwOiAvKiA2NE1iaXQgZGV2aWNlcyAqLwotCQkJZmxhc2hfc2l6ZSA9IDB4ODAwMDAwOyAvKiA4TUIgcGVyIHBhcnQgKi8KLSNpZiBkZWZpbmVkKERCMVgwMF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDFFMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDIwMDAwMDA7IAotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotCQkJd2luZG93X2FkZHIgPSAweDFGMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDEwMDAwMDA7IAotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MTAwMDAwMDsgCi0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQkvKiAxMjggTWJpdCBkZXZpY2VzICovCi0JCQlmbGFzaF9zaXplID0gMHgxMDAwMDAwOyAvKiAxNk1CIHBlciBwYXJ0ICovCi0jaWYgZGVmaW5lZChEQjFYMDBfQk9USF9CQU5LUykKLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxQzAwIDAwMDAgdG8gMHgxRkMwIDAwMDAgKi8KLQkJCWRiMXgwMF9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDNDMDAwMDA7Ci0jZWxpZiBkZWZpbmVkKERCMVgwMF9CT09UX09OTFkpCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MjAwMDAwMDsKLQkJCS8qIFVTRVJGUyBmcm9tIDB4MUUwMCAwMDAwIHRvIDB4MUZDMCAwMDAwICovCi0JCQlkYjF4MDBfcGFydGl0aW9uc1swXS5zaXplID0gMHgxQzAwMDAwOwotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUMwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MjAwMDAwMDsKLQkJCS8qIFVTRVJGUyBmcm9tIDB4MUMwMCAwMDAwIHRvIDB4MURFMDAwMDAgKi8KLQkJCWRiMXgwMF9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDFERTAwMDA7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkvKiAyNTYgTWJpdCBkZXZpY2VzICovCi0JCQlmbGFzaF9zaXplID0gMHg0MDAwMDAwOyAvKiA2NE1CIHBlciBwYXJ0ICovCi0jaWYgZGVmaW5lZChEQjFYMDBfQk9USF9CQU5LUykKLQkJCXJldHVybiAxOwotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotCQkJLyogQm9vdCBST00gZmxhc2ggYmFuayBvbmx5OyBubyB1c2VyIGJhbmsgKi8KLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxQzAwIDAwMDAgdG8gMHgxRkMwMDAwMCAqLwotCQkJZGIxeDAwX3BhcnRpdGlvbnNbMF0uc2l6ZSA9IDB4M0MwMDAwMDsKLSNlbHNlIC8qIFVTRVIgT05MWSAqLwotCQkJcmV0dXJuIDE7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7Ci0JfQotCWRiMXh4eF9tdGRfbWFwLnNpemUgPSB3aW5kb3dfc2l6ZTsKLQlkYjF4eHhfbXRkX21hcC5iYW5rd2lkdGggPSBmbGFzaF9iYW5rd2lkdGg7Ci0JZGIxeHh4X210ZF9tYXAucGh5cyA9IHdpbmRvd19hZGRyOwotCWRiMXh4eF9tdGRfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBkYjF4MDBfbXRkX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5iX3BhcnRzID0gMDsKLQkKLQlpZiAoc2V0dXBfZmxhc2hfcGFyYW1zKCkpIAotCQlyZXR1cm4gLUVOWElPOwotCi0JLyoKLQkgKiBTdGF0aWMgcGFydGl0aW9uIGRlZmluaXRpb24gc2VsZWN0aW9uCi0JICovCi0JcGFydHMgPSBkYjF4MDBfcGFydGl0aW9uczsKLQluYl9wYXJ0cyA9IE5CX09GKGRiMXgwMF9wYXJ0aXRpb25zKTsKLQotCS8qCi0JICogTm93IGxldCdzIHByb2JlIGZvciB0aGUgYWN0dWFsIGZsYXNoLiAgRG8gaXQgaGVyZSBzaW5jZQotCSAqIHNwZWNpZmljIG1hY2hpbmUgc2V0dGluZ3MgbWlnaHQgaGF2ZSBiZWVuIHNldCBhYm92ZS4KLQkgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIkRiMXh4eCBmbGFzaDogcHJvYmluZyAlZC1iaXQgZmxhc2ggYnVzXG4iLCAKLQkJCWRiMXh4eF9tdGRfbWFwLmJhbmt3aWR0aCo4KTsKLQlkYjF4eHhfbXRkX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCWRiMXh4eF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZkYjF4eHhfbXRkX21hcCk7Ci0JaWYgKCFkYjF4eHhfbXRkKSByZXR1cm4gLUVOWElPOwotCWRiMXh4eF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhZGRfbXRkX3BhcnRpdGlvbnMoZGIxeHh4X210ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRiMXgwMF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChkYjF4eHhfbXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhkYjF4eHhfbXRkKTsKLQkJbWFwX2Rlc3Ryb3koZGIxeHh4X210ZCk7Ci0JCWlmIChwYXJzZWRfcGFydHMpCi0JCQlrZnJlZShwYXJzZWRfcGFydHMpOwotCX0KLX0KLQotbW9kdWxlX2luaXQoZGIxeDAwX210ZF9pbml0KTsKLW1vZHVsZV9leGl0KGRiMXgwMF9tdGRfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlBldGUgUG9wb3YiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGIxeDAwIG10ZCBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2VsYW4tMTA0bmMuYyBiL2RyaXZlcnMvbXRkL21hcHMvZWxhbi0xMDRuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2NWY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZWxhbi0xMDRuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qIGVsYW4tMTA0bmMuYyAtLSBNVEQgbWFwIGRyaXZlciBmb3IgQXJjb20gQ29udHJvbCBTeXN0ZW1zIEVMQU4tMTA0TkMKLSAKLSAgIENvcHlyaWdodCAoQykgMjAwMCBBcmNvbSBDb250cm9sIFN5c3RlbSBMdGQKLSAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCi0KLSAgICRJZDogZWxhbi0xMDRuYy5jLHYgMS4yNSAyMDA0LzExLzI4IDA5OjQwOjM5IGR3bXcyIEV4cCAkCi0KLVRoZSBFTEFOLTEwNE5DIGhhcyB1cCB0byA4IE1pYnl0ZSBvZiBJbnRlbCBTdHJhdGFGbGFzaCAoMjhGMzIwLzI4RjY0MCkgaW4geDE2Ci1tb2RlLiAgVGhpcyBkcml2ZXJzIHVzZXMgdGhlIENGSSBwcm9iZSBhbmQgSW50ZWwgRXh0ZW5kZWQgQ29tbWFuZCBTZXQgZHJpdmVycy4KLQotVGhlIGZsYXNoIGlzIGFjY2Vzc2VkIGFzIGZvbGxvd3M6Ci0KLSAgIDMyIGtieXRlIG1lbW9yeSB3aW5kb3cgYXQgMHhiMDAwMC0weGI3ZmZmCi0gICAKLSAgIDE2IGJpdCBJL08gcG9ydCAoMHgyMikgZm9yIHNvbWUgc29ydCBvZiBwYWdpbmcuCi0KLVRoZSBzaW5nbGUgZmxhc2ggZGV2aWNlIGlzIGRpdmlkZWQgaW50byAzIHBhcnRpdGlvbiB3aGljaCBhcHBlYXIgYXMgc2VwYXJhdGUKLU1URCBkZXZpY2VzLgotCi1MaW51eCB0aGlua3MgdGhhdCB0aGUgSS9PIHBvcnQgaXMgdXNlZCBieSB0aGUgUElDIGFuZCBoZW5jZSBjaGVja19yZWdpb24oKSB3aWxsCi1hbHdheXMgZmFpbC4gIFNvIHdlIGRvbid0IGRvIGl0LiAgSSBqdXN0IGhvcGUgaXQgZG9lc24ndCBicmVhayBhbnl0aGluZy4KLSovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2RlZmluZSBXSU5ET1dfU1RBUlQgMHhiMDAwMAotLyogTnVtYmVyIG9mIGJpdHMgaW4gb2Zmc2V0LiAqLwotI2RlZmluZSBXSU5ET1dfU0hJRlQgMTUKLSNkZWZpbmUgV0lORE9XX0xFTkdUSCAoMSA8PCBXSU5ET1dfU0hJRlQpCi0vKiBUaGUgYml0cyBmb3IgdGhlIG9mZnNldCBpbnRvIHRoZSB3aW5kb3cuICovCi0jZGVmaW5lIFdJTkRPV19NQVNLIChXSU5ET1dfTEVOR1RILTEpCi0jZGVmaW5lIFBBR0VfSU8gMHgyMgotI2RlZmluZSBQQUdFX0lPX1NJWkUgMgotCi1zdGF0aWMgdm9sYXRpbGUgaW50IHBhZ2VfaW5fd2luZG93ID0gLTE7IC8vIEN1cnJlbnQgcGFnZSBpbiB3aW5kb3cuCi1zdGF0aWMgdm9pZCBfX2lvbWVtICppb21hcGFkcjsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWxhbl8xMDRuY19zcGluKTsKLQotLyogcGFydGl0aW9uX2luZm8gZ2l2ZXMgZGV0YWlscyBvbiB0aGUgbG9naWNhbCBwYXJ0aXRpb25zIHRoYXQgdGhlIHNwbGl0IHRoZSAKLSAqIHNpbmdsZSBmbGFzaCBkZXZpY2UgaW50by4gSWYgdGhlIHNpemUgaWYgemVybyB3ZSB1c2UgdXAgdG8gdGhlIGVuZCBvZiB0aGUKLSAqIGRldmljZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdPXsKLSAgICB7IC5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2ggYm9vdCBwYXJ0aXRpb24iLCAKLSAgICAgIC5vZmZzZXQgPSAwLCAKLSAgICAgIC5zaXplID0gNjQwKjEwMjQgfSwKLSAgICB7IC5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2ggcGFydGl0aW9uIDEiLCAKLSAgICAgIC5vZmZzZXQgPSA2NDAqMTAyNCwgCi0gICAgICAuc2l6ZSA9IDg5NioxMDI0IH0sCi0gICAgeyAubmFtZSA9ICJFTEFOLTEwNE5DIGZsYXNoIHBhcnRpdGlvbiAyIiwgCi0gICAgICAub2Zmc2V0ID0gKDY0MCs4OTYpKjEwMjQgfQotfTsKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMgKHNpemVvZihwYXJ0aXRpb25faW5mbykvc2l6ZW9mKHBhcnRpdGlvbl9pbmZvWzBdKSkKLQotLyoKLSAqIElmIG5vIGlkZWEgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgVGhpcyBpcyB0YWtlbiBmcm9tIHRoZSBGbGFzaEZYIHN0dWZmLgotICovCi0jZGVmaW5lIFJPTUNTIDEKLQotc3RhdGljIGlubGluZSB2b2lkIGVsYW5fMTA0bmNfc2V0dXAodm9pZCkKLXsKLSAgICB1MTYgdDsKLQotICAgIG91dHcoIDB4MDAyMyArIFJPTUNTKjIsIFBBR0VfSU8gKTsKLSAgICB0PWluYiggUEFHRV9JTysxICk7Ci0KLSAgICB0PSh0ICYgMHhmOSkgfCAweDA0OwotCi0gICAgb3V0dyggKCgweDAwMjMgKyBST01DUyoyKSB8ICh0IDw8IDgpKSwgUEFHRV9JTyApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWxhbl8xMDRuY19wYWdlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKLXsKLQl1bnNpZ25lZCBsb25nIHBhZ2UgPSBvZnMgPj4gV0lORE9XX1NISUZUOwotICAgICAgIAotCWlmKCBwYWdlIT1wYWdlX2luX3dpbmRvdyApIHsKLQkJaW50IGNtZDE7Ci0JCWludCBjbWQyOwotCi0JCWNtZDE9KHBhZ2UgJiAweDcwMCkgKyAweDA4MzMgKyBST01DUyoweDQwMDA7Ci0JCWNtZDI9KChwYWdlICYgMHhmZikgPDwgOCkgKyAweDAwMzI7Ci0KLQkJb3V0dyggY21kMSwgUEFHRV9JTyApOwotCQlvdXR3KCBjbWQyLCBQQUdFX0lPICk7Ci0KLQkJcGFnZV9pbl93aW5kb3cgPSBwYWdlOwotCX0KLX0KLQotCi1zdGF0aWMgbWFwX3dvcmQgZWxhbl8xMDRuY19yZWFkMTYoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQotewotCW1hcF93b3JkIHJldDsKLQlzcGluX2xvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JZWxhbl8xMDRuY19wYWdlKG1hcCwgb2ZzKTsKLQlyZXQueFswXSA9IHJlYWR3KGlvbWFwYWRyICsgKG9mcyAmIFdJTkRPV19NQVNLKSk7Ci0Jc3Bpbl91bmxvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZWxhbl8xMDRuY19jb3B5X2Zyb20oc3RydWN0IG1hcF9pbmZvICptYXAsIHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIGZyb20sIHNzaXplX3QgbGVuKQotewotCXdoaWxlIChsZW4pIHsKLQkJdW5zaWduZWQgbG9uZyB0aGlzbGVuID0gbGVuOwotCQlpZiAobGVuID4gKFdJTkRPV19MRU5HVEggLSAoZnJvbSAmIFdJTkRPV19NQVNLKSkpCi0JCQl0aGlzbGVuID0gV0lORE9XX0xFTkdUSC0oZnJvbSAmIFdJTkRPV19NQVNLKTsKLQkJCi0JCXNwaW5fbG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJZWxhbl8xMDRuY19wYWdlKG1hcCwgZnJvbSk7Ci0JCW1lbWNweV9mcm9taW8odG8sIGlvbWFwYWRyICsgKGZyb20gJiBXSU5ET1dfTUFTSyksIHRoaXNsZW4pOwotCQlzcGluX3VubG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJdG8gKz0gdGhpc2xlbjsKLQkJZnJvbSArPSB0aGlzbGVuOwotCQlsZW4gLT0gdGhpc2xlbjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVsYW5fMTA0bmNfd3JpdGUxNihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgZCwgdW5zaWduZWQgbG9uZyBhZHIpCi17Ci0Jc3Bpbl9sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCWVsYW5fMTA0bmNfcGFnZShtYXAsIGFkcik7Ci0Jd3JpdGV3KGQueFswXSwgaW9tYXBhZHIgKyAoYWRyICYgV0lORE9XX01BU0spKTsKLQlzcGluX3VubG9jaygmZWxhbl8xMDRuY19zcGluKTsKLX0KLQotc3RhdGljIHZvaWQgZWxhbl8xMDRuY19jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKLXsJCi0Jd2hpbGUobGVuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGhpc2xlbiA9IGxlbjsKLQkJaWYgKGxlbiA+IChXSU5ET1dfTEVOR1RIIC0gKHRvICYgV0lORE9XX01BU0spKSkKLQkJCXRoaXNsZW4gPSBXSU5ET1dfTEVOR1RILSh0byAmIFdJTkRPV19NQVNLKTsKLQkJCi0JCXNwaW5fbG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJZWxhbl8xMDRuY19wYWdlKG1hcCwgdG8pOwotCQltZW1jcHlfdG9pbyhpb21hcGFkciArICh0byAmIFdJTkRPV19NQVNLKSwgZnJvbSwgdGhpc2xlbik7Ci0JCXNwaW5fdW5sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCQl0byArPSB0aGlzbGVuOwotCQlmcm9tICs9IHRoaXNsZW47Ci0JCWxlbiAtPSB0aGlzbGVuOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBlbGFuXzEwNG5jX21hcCA9IHsKLQkubmFtZSA9ICJFTEFOLTEwNE5DIGZsYXNoIiwKLQkucGh5cyA9IE5PX1hJUCwKLQkuc2l6ZSA9IDgqMTAyNCoxMDI0LCAvKiB0aGlzIG11c3QgYmUgc2V0IHRvIGEgbWF4aW11bSBwb3NzaWJsZSBhbW91bnQKLQkJCW9mIGZsYXNoIHNvIHRoZSBjZmkgcHJvYmUgcm91dGluZXMgZmluZCBhbGwKLQkJCXRoZSBjaGlwcyAqLwotCS5iYW5rd2lkdGggPSAyLAotCS5yZWFkID0gZWxhbl8xMDRuY19yZWFkMTYsCi0JLmNvcHlfZnJvbSA9IGVsYW5fMTA0bmNfY29weV9mcm9tLAotCS53cml0ZSA9IGVsYW5fMTA0bmNfd3JpdGUxNiwKLQkuY29weV90byA9IGVsYW5fMTA0bmNfY29weV90bwotfTsKLQotLyogTVREIGRldmljZSBmb3IgYWxsIG9mIHRoZSBmbGFzaC4gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmFsbF9tdGQ7Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXBfZWxhbl8xMDRuYyh2b2lkKQotewotCWlmKCBhbGxfbXRkICkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMoIGFsbF9tdGQgKTsKLQkJbWFwX2Rlc3Ryb3koIGFsbF9tdGQgKTsKLQl9Ci0KLQlpb3VubWFwKGlvbWFwYWRyKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9lbGFuXzEwNG5jKHZvaWQpCi17Ci0JLyogVXJnISBXZSB1c2UgSS9PIHBvcnQgMHgyMiB3aXRob3V0IHJlcXVlc3RfcmVnaW9uKClpbmcgaXQsCi0JICAgYmVjYXVzZSBpdCdzIGFscmVhZHkgYWxsb2NhdGVkIHRvIHRoZSBQSUMuICovCi0KLSAgCWlvbWFwYWRyID0gaW9yZW1hcChXSU5ET1dfU1RBUlQsIFdJTkRPV19MRU5HVEgpOwotCWlmICghaW9tYXBhZHIpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiIlczogZmFpbGVkIHRvIGlvcmVtYXAgbWVtb3J5IHJlZ2lvblxuIiwKLQkJCWVsYW5fMTA0bmNfbWFwLm5hbWUgKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcHJpbnRrKCBLRVJOX0lORk8iJXM6IElPOjB4JXgtMHgleCBNRU06MHgleC0weCV4XG4iLAotCQllbGFuXzEwNG5jX21hcC5uYW1lLAotCQlQQUdFX0lPLCBQQUdFX0lPK1BBR0VfSU9fU0laRS0xLAotCQlXSU5ET1dfU1RBUlQsIFdJTkRPV19TVEFSVCtXSU5ET1dfTEVOR1RILTEgKTsKLQotCWVsYW5fMTA0bmNfc2V0dXAoKTsKLQotCS8qIFByb2JlIGZvciBjaGlwLiAqLwotCWFsbF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICAmZWxhbl8xMDRuY19tYXAgKTsKLQlpZiggIWFsbF9tdGQgKSB7Ci0JCWNsZWFudXBfZWxhbl8xMDRuYygpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQkKLQlhbGxfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JLyogQ3JlYXRlIE1URCBkZXZpY2VzIGZvciBlYWNoIHBhcnRpdGlvbi4gKi8KLQlhZGRfbXRkX3BhcnRpdGlvbnMoIGFsbF9tdGQsIHBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfZWxhbl8xMDRuYyk7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2VsYW5fMTA0bmMpOwotCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1URCBtYXAgZHJpdmVyIGZvciBBcmNvbSBDb250cm9sIFN5c3RlbXMgRUxBTi0xMDROQyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pY2h4cm9tLmMgYi9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYwppbmRleCAyOWQxY2MxLi5lNTA1MjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYwpAQCAtMiw3ICsyLDcgQEAKICAqIGljaHhyb20uYwogICoKICAqIE5vcm1hbCBtYXBwaW5ncyBvZiBjaGlwcyBpbiBwaHlzaWNhbCBtZW1vcnkKLSAqICRJZDogaWNoeHJvbS5jLHYgMS4xNiAyMDA0LzExLzI4IDA5OjQwOjM5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGljaHhyb20uYyx2IDEuMTggMjAwNS8wNy8wNyAxMDoyNjoyMCBkd213MiBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMzOCw5ICszMzgsOSBAQAogCXsgMCwgfSwKIH07CiAKKyNpZiAwCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWNoeHJvbV9wY2lfdGJsKTsKIAotI2lmIDAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpY2h4cm9tX2RyaXZlciA9IHsKIAkubmFtZSA9CQlNT0RfTkFNRSwKIAkuaWRfdGFibGUgPQlpY2h4cm9tX3BjaV90YmwsCkBAIC0zNjYsNyArMzY2LDcgQEAKIAl9CiAJcmV0dXJuIC1FTlhJTzsKICNpZiAwCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaWNoeHJvbV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpY2h4cm9tX2RyaXZlcik7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwppbmRleCBjNWI1ZjQ0Li4zZTk0YjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGl4cDIwMDAuYyx2IDEuNSAyMDA0LzExLzE2IDE3OjE1OjQ4IGRzYXhlbmEgRXhwICQKKyAqICRJZDogaXhwMjAwMC5jLHYgMS42IDIwMDUvMDMvMTggMTQ6MDc6NDYgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBkcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwogICoKQEAgLTIxNiwxMSArMjE2LDYgQEAKIAkJZ290byBFcnJvcjsKIAl9CiAKLQkvKgotCSAqIFNldHVwIHJlYWQgbW9kZSBmb3IgRkxBU0gKLQkgKi8KLQkqSVhQMjAwMF9TTE9XUE9SVF9GUk0gPSAxOwotCiAjaWYgZGVmaW5lZChfX0FSTUVCX18pCiAJLyoKIAkgKiBFbmFibGUgZXJyYXR1bSA0NCB3b3JrYXJvdW5kIGZvciBOUFVzIHdpdGggYnJva2VuIHNsb3dwb3J0CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL21haW5zdG9uZS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9tYWluc3RvbmUtZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U5M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9tYWluc3RvbmUtZmxhc2guYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICRJZDogICQKKyAqCisgKiBNYXAgZHJpdmVyIGZvciB0aGUgTWFpbnN0b25lIGRldmVsb3BlciBwbGF0Zm9ybS4KKyAqCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENvcHlyaWdodDoJKEMpIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWFpbnN0b25lLmg+CisKKworI2RlZmluZSBST01fQUREUgkweDAwMDAwMDAwCisjZGVmaW5lIEZMQVNIX0FERFIJMHgwNDAwMDAwMAorCisjZGVmaW5lIFdJTkRPV19TSVpFIAkweDA0MDAwMDAwCisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9tYXBfaW52YWxfY2FjaGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgZnJvbSwKKwkJCQkgICAgICBzc2l6ZV90IGxlbikKK3sKKwljb25zaXN0ZW50X3N5bmMoKGNoYXIgKiltYXAtPmNhY2hlZCArIGZyb20sIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBtYWluc3RvbmVfbWFwc1syXSA9IHsgeworCS5zaXplID0JCVdJTkRPV19TSVpFLAorCS5waHlzID0JCVBYQV9DUzBfUEhZUywKKwkuaW52YWxfY2FjaGUgPSAJbWFpbnN0b25lX21hcF9pbnZhbF9jYWNoZSwKK30sIHsKKwkuc2l6ZSA9CQlXSU5ET1dfU0laRSwKKwkucGh5cyA9CQlQWEFfQ1MxX1BIWVMsCisJLmludmFsX2NhY2hlID0gCW1haW5zdG9uZV9tYXBfaW52YWxfY2FjaGUsCit9IH07CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBtYWluc3RvbmVfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgPQkJIkJvb3Rsb2FkZXIiLAorCQkuc2l6ZSA9CQkweDAwMDQwMDAwLAorCQkub2Zmc2V0ID0JMCwKKwkJLm1hc2tfZmxhZ3MgPQlNVERfV1JJVEVBQkxFICAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LHsKKwkJLm5hbWUgPQkJIktlcm5lbCIsCisJCS5zaXplID0JCTB4MDA0MDAwMDAsCisJCS5vZmZzZXQgPQkweDAwMDQwMDAwLAorCX0seworCQkubmFtZSA9CQkiRmlsZXN5c3RlbSIsCisJCS5zaXplID0JCU1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgPQkweDAwNDQwMDAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGRzWzJdOworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydHNbMl07CitzdGF0aWMgaW50IG5yX3BhcnNlZF9wYXJ0c1syXTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiUmVkQm9vdCIsICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9tYWluc3RvbmUodm9pZCkKK3sKKwlpbnQgU1c3ID0gMDsgIC8qIEZJWE1FOiBnZXQgZnJvbSBTQ1IgKE1zdCBkb2Mgc2VjdGlvbiAzLjIuMS4xKSAqLworCWludCByZXQgPSAwLCBpOworCisJbWFpbnN0b25lX21hcHNbMF0uYmFua3dpZHRoID0gKEJPT1RfREVGICYgMSkgPyAyIDogNDsKKwltYWluc3RvbmVfbWFwc1sxXS5iYW5rd2lkdGggPSA0OworCisJLyogQ29tcGVuc2F0ZSBmb3IgU1c3IHdoaWNoIHN3YXBzIHRoZSBmbGFzaCBiYW5rcyAqLworCW1haW5zdG9uZV9tYXBzW1NXN10ubmFtZSA9ICJwcm9jZXNzb3IgZmxhc2giOworCW1haW5zdG9uZV9tYXBzW1NXNyBeIDFdLm5hbWUgPSAibWFpbiBib2FyZCBmbGFzaCI7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1haW5zdG9uZSBjb25maWd1cmVkIHRvIGJvb3QgZnJvbSAlc1xuIiwKKwkgICAgICAgbWFpbnN0b25lX21hcHNbMF0ubmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW1haW5zdG9uZV9tYXBzW2ldLnZpcnQgPSBpb3JlbWFwKG1haW5zdG9uZV9tYXBzW2ldLnBoeXMsCisJCQkJCQkgV0lORE9XX1NJWkUpOworCQlpZiAoIW1haW5zdG9uZV9tYXBzW2ldLnZpcnQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBpb3JlbWFwICVzXG4iLCAKKwkJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FTk9NRU07CisJCQljb250aW51ZTsKKwkJfQorCQltYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQgPSAKKwkJCWlvcmVtYXBfY2FjaGVkKG1haW5zdG9uZV9tYXBzW2ldLnBoeXMsIFdJTkRPV19TSVpFKTsKKwkJaWYgKCFtYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gaW9yZW1hcCBjYWNoZWQgJXNcbiIsCisJCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSk7CisJCXNpbXBsZV9tYXBfaW5pdCgmbWFpbnN0b25lX21hcHNbaV0pOworCisJCXByaW50ayhLRVJOX05PVElDRSAKKwkJICAgICAgICJQcm9iaW5nICVzIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHglMDhseCIKKwkJICAgICAgICIgKCVkLWJpdCBiYW5rd2lkdGgpXG4iLAorCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSwgbWFpbnN0b25lX21hcHNbaV0ucGh5cywgCisJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5iYW5rd2lkdGggKiA4KTsKKworCQlteW10ZHNbaV0gPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZtYWluc3RvbmVfbWFwc1tpXSk7CisJCQorCQlpZiAoIW15bXRkc1tpXSkgeworCQkJaW91bm1hcCgodm9pZCAqKW1haW5zdG9uZV9tYXBzW2ldLnZpcnQpOworCQkJaWYgKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCkKKwkJCQlpb3VubWFwKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUlPOworCQkJY29udGludWU7CisJCX0KKwkJbXltdGRzW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG15bXRkc1tpXSwgcHJvYmVzLAorCQkJCQkgICAmcGFyc2VkX3BhcnRzW2ldLCAwKTsKKworCQlpZiAocmV0ID4gMCkKKwkJCW5yX3BhcnNlZF9wYXJ0c1tpXSA9IHJldDsKKwl9CisKKwlpZiAoIW15bXRkc1swXSAmJiAhbXltdGRzWzFdKQorCQlyZXR1cm4gcmV0OworCQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKCFteW10ZHNbaV0pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGlzIGFic2VudC4gU2tpcHBpbmdcbiIsIAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQl9IGVsc2UgaWYgKG5yX3BhcnNlZF9wYXJ0c1tpXSkgeworCQkJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkc1tpXSwgcGFyc2VkX3BhcnRzW2ldLCAKKwkJCQkJICAgbnJfcGFyc2VkX3BhcnRzW2ldKTsKKwkJfSBlbHNlIGlmICghaSkgeworCQkJcHJpbnRrKCJVc2luZyBzdGF0aWMgcGFydGl0aW9ucyBvbiAlc1xuIiwKKwkJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lKTsKKwkJCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZHNbaV0sIG1haW5zdG9uZV9wYXJ0aXRpb25zLCAKKwkJCQkJICAgQVJSQVlfU0laRShtYWluc3RvbmVfcGFydGl0aW9ucykpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJSZWdpc3RlcmluZyAlcyBhcyB3aG9sZSBkZXZpY2VcbiIsIAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQkJYWRkX210ZF9kZXZpY2UobXltdGRzW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbWFpbnN0b25lKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoIW15bXRkc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChucl9wYXJzZWRfcGFydHNbaV0gfHwgIWkpCisJCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGRzW2ldKTsKKwkJZWxzZQorCQkJZGVsX210ZF9kZXZpY2UobXltdGRzW2ldKTsKKworCQltYXBfZGVzdHJveShteW10ZHNbaV0pOworCQlpb3VubWFwKCh2b2lkICopbWFpbnN0b25lX21hcHNbaV0udmlydCk7CisJCWlmIChtYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQpCisJCQlpb3VubWFwKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCk7CisJCWtmcmVlKHBhcnNlZF9wYXJ0c1tpXSk7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X21haW5zdG9uZSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX21haW5zdG9uZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIEludGVsIE1haW5zdG9uZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9tYXBfZnVuY3MuYyBiL2RyaXZlcnMvbXRkL21hcHMvbWFwX2Z1bmNzLmMKaW5kZXggMzhmNmE3YS4uOTEwNWU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9tYXBfZnVuY3MuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL21hcF9mdW5jcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbWFwX2Z1bmNzLmMsdiAxLjkgMjAwNC8wNy8xMyAyMjozMzoxNSBkd213MiBFeHAgJAorICogJElkOiBtYXBfZnVuY3MuYyx2IDEuMTAgMjAwNS8wNi8wNiAyMzowNDozNiB0cG95bm9yIEV4cCAkCiAgKgogICogT3V0LW9mLWxpbmUgbWFwIEkvTyBmdW5jdGlvbnMgZm9yIHNpbXBsZSBtYXBzIHdoZW4gQ09ORklHX0NPTVBMRVhfTUFQUElOR1MKICAqIGlzIGVuYWJsZWQuCkBAIC05LDIzICs5LDI0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3hpcC5oPgogCi1zdGF0aWMgbWFwX3dvcmQgc2ltcGxlX21hcF9yZWFkKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKK3N0YXRpYyBtYXBfd29yZCBfX3hpcHJhbSBzaW1wbGVfbWFwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQogewogCXJldHVybiBpbmxpbmVfbWFwX3JlYWQobWFwLCBvZnMpOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfbWFwX3dyaXRlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBjb25zdCBtYXBfd29yZCBkYXR1bSwgdW5zaWduZWQgbG9uZyBvZnMpCitzdGF0aWMgdm9pZCBfX3hpcHJhbSBzaW1wbGVfbWFwX3dyaXRlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBjb25zdCBtYXBfd29yZCBkYXR1bSwgdW5zaWduZWQgbG9uZyBvZnMpCiB7CiAJaW5saW5lX21hcF93cml0ZShtYXAsIGRhdHVtLCBvZnMpOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfbWFwX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgc3NpemVfdCBsZW4pCitzdGF0aWMgdm9pZCBfX3hpcHJhbSBzaW1wbGVfbWFwX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgc3NpemVfdCBsZW4pCiB7CiAJaW5saW5lX21hcF9jb3B5X2Zyb20obWFwLCB0bywgZnJvbSwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgc2ltcGxlX21hcF9jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHNpbXBsZV9tYXBfY29weV90byhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyB0bywgY29uc3Qgdm9pZCAqZnJvbSwgc3NpemVfdCBsZW4pCiB7CiAJaW5saW5lX21hcF9jb3B5X3RvKG1hcCwgdG8sIGZyb20sIGxlbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNzE0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIEZsYXNoIG1lbW9yeSBzdXBwb3J0IGZvciB2YXJpb3VzIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIAorICoKKyAqCUFzc2VtYmxlZCB1c2luZyBkcml2ZXIgY29kZSBjb3B5cmlnaHQgdGhlIGNvbXBhbmllcyBhYm92ZQorICoJYW5kIHdyaXR0ZW4gYnkgRGF2aWQgQnJvd25lbGwsIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+LAorICogCVRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZCBvdGhlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAvKiAiUmVkQm9vdCIsICovICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKyNlbmRpZgorCitzdHJ1Y3Qgb21hcGZsYXNoX2luZm8geworCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKKwlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7CisJc3RydWN0IG1hcF9pbmZvCQltYXA7Cit9OworCitzdGF0aWMgdm9pZCBvbWFwX3NldF92cHAoc3RydWN0IG1hcF9pbmZvICptYXAsIGludCBlbmFibGUpCit7CisJc3RhdGljIGludAljb3VudDsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKGNvdW50KysgPT0gMCkKKwkJCU9NQVBfRU1JRlNfQ09ORklHX1JFRyB8PSBPTUFQX0VNSUZTX0NPTkZJR19XUDsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgJiYgKC0tY291bnQgPT0gMCkpCisJCQlPTUFQX0VNSUZTX0NPTkZJR19SRUcgJj0gfk9NQVBfRU1JRlNfQ09ORklHX1dQOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgb21hcGZsYXNoX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBvbWFwZmxhc2hfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmxhc2hfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBvbWFwZmxhc2hfaW5mbykpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSwgImZsYXNoIikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9mcmVlX2luZm87CisJfQorCisJaW5mby0+bWFwLnZpcnQJCT0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoIWluZm8tPm1hcC52aXJ0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisJaW5mby0+bWFwLm5hbWUJCT0gcGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAucGh5cwkJPSByZXMtPnN0YXJ0OworCWluZm8tPm1hcC5zaXplCQk9IHNpemU7CisJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBkYXRhLT53aWR0aDsKKwlpbmZvLT5tYXAuc2V0X3ZwcAk9IG9tYXBfc2V0X3ZwcDsKKworCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKKwlpbmZvLT5tdGQgPSBkb19tYXBfcHJvYmUocGRhdGEtPm1hcF9uYW1lLCAmaW5mby0+bWFwKTsKKwlpZiAoIWluZm8tPm10ZCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKwlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVzLCAmaW5mby0+cGFydHMsIDApOworCWlmIChlcnIgPiAwKQorCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKKwllbHNlIGlmIChlcnIgPCAwICYmIHBkYXRhLT5wYXJ0cykKKwkJYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOworCWVsc2UKKyNlbmRpZgorCQlhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGluZm8pOworCisJcmV0dXJuIDA7CisKK291dF9pb3VubWFwOgorCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOworb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSk7CitvdXRfZnJlZV9pbmZvOgorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb21hcGZsYXNoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwZmxhc2hfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKKworCWlmIChpbmZvKSB7CisJCWlmIChpbmZvLT5wYXJ0cykgeworCQkJZGVsX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCk7CisJCQlrZnJlZShpbmZvLT5wYXJ0cyk7CisJCX0gZWxzZQorCQkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKKwkJbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPm1hcC5waHlzLCBpbmZvLT5tYXAuc2l6ZSk7CisJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBpbmZvLT5tYXAudmlydCk7CisJCWtmcmVlKGluZm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgb21hcGZsYXNoX2RyaXZlciA9IHsKKwkubmFtZQk9ICJvbWFwZmxhc2giLAorCS5idXMJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCT0gb21hcGZsYXNoX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChvbWFwZmxhc2hfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmbGFzaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmb21hcGZsYXNoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwZmxhc2hfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZvbWFwZmxhc2hfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob21hcGZsYXNoX2luaXQpOworbW9kdWxlX2V4aXQob21hcGZsYXNoX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBOT1IgbWFwIGRyaXZlciBmb3IgVEkgT01BUCBib2FyZHMiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wYjE1NTAtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcGIxNTUwLWZsYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjQ3MjZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGIxNTUwLWZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBQYjE1NTAgYm9hcmQKLSAqIAotICogJElkOiBwYjE1NTAtZmxhc2guYyx2IDEuNiAyMDA0LzExLzA0IDEzOjI0OjE1IGdsZWl4bmVyIEV4cCAkCi0gKgotICogKEMpIDIwMDQgRW1iZWRkZWQgRWRnZSwgTExDLCBiYXNlZCBvbiBwYjE1NTAtZmxhc2guYzoKLSAqIChDKSAyMDAzIFBldGUgUG9wb3YgPHBwb3BvdkBwYWNiZWxsLm5ldD4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vcGIxNTUwLmg+Ci0KLSNpZmRlZiAJREVCVUdfUlcKLSNkZWZpbmUJREJHKHguLi4pCXByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUJREJHKHguLi4pCQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7Ci0KLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBwYjE1NTBfbWFwID0gewotCS5uYW1lID0JIlBiMTU1MCBmbGFzaCIsCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFzaF9iYW5rd2lkdGggPSA0OwotCi0vKiAKLSAqIFN1cHBvcnQgb25seSA2NE1CIE5PUiBGbGFzaCBwYXJ0cwotICovCi0KLSNpZmRlZiBQQjE1NTBfQk9USF9CQU5LUwotLyogYm90aCBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IGJhbmsgYW5kIHRoZSBmaXJzdCAKLSAqIHBhcnQgb2YgdGhlIHNlY29uZCBiYW5rIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgamZmcy9qZmZzMgotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxQzAwIDAwMDAgMUZGRiBGRkZGIENFMCA2NE1CIEJvb3QgTk9SIEZsYXNoCi0JICogMTgwMCAwMDAwIDFCRkYgRkZGRiBDRTAgNjRNQiBQYXJhbSBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAoMHgxRkMwMDAwMCAtIDB4MTgwMDAwMDApLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoUEIxNTUwX0JPT1RfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAweDAzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgeWFtb24gZW52ICovCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxpZiBkZWZpbmVkKFBCMTU1MF9VU0VSX09OTFkpCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAoMHg0MDAwMDAwIC0gMHgyMDAwMDApLCAvKiByZXNlcnZlIDJNQiBmb3IgcmF3IGtlcm5lbCAqLwotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAicmF3IGtlcm5lbCIsCi0JCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX1BCMTU1MCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTkJfT0YoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0JdTE2IGJvb3Rfc3dhcGJvb3Q7Ci0JYm9vdF9zd2FwYm9vdCA9IChhdV9yZWFkbChNRU1fU1RTVEFUKSAmICgweDc8PDEpKSB8IAotCQkoKGJjc3ItPnN0YXR1cyA+PiA2KSAgJiAweDEpOwotCXByaW50aygiUGIxNTUwIE1URDogYm9vdDpzd2FwICVkXG4iLCBib290X3N3YXBib290KTsKLQotCXN3aXRjaCAoYm9vdF9zd2FwYm9vdCkgewotCQljYXNlIDA6IC8qIDUxMk1iaXQgZGV2aWNlcywgYm90aCBlbmFibGVkICovCi0JCWNhc2UgMTogCi0JCWNhc2UgODoKLQkJY2FzZSA5OiAKLSNpZiBkZWZpbmVkKFBCMTU1MF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDE4MDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDgwMDAwMDA7IAotI2VsaWYgZGVmaW5lZChQQjE1NTBfQk9PVF9PTkxZKQotCQkJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4NDAwMDAwMDsgCi0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDB4QzoKLQkJY2FzZSAweEQ6Ci0JCWNhc2UgMHhFOgotCQljYXNlIDB4RjogCi0JCQkvKiA2NCBNQiBCb290IE5PUiBGbGFzaCBpcyBkaXNhYmxlZCAqLwotCQkJLyogYW5kIHRoZSBzdGFydCBhZGRyZXNzIGlzIG1vdmVkIHRvIDB4MEMwMDAwMCAqLwotCQkJd2luZG93X2FkZHIgPSAweDBDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJQYjE1NTAgTVREOiB1bnN1cHBvcnRlZCBib290OnN3YXAgc2V0dGluZ1xuIik7Ci0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2luaXQgcGIxNTUwX210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JCi0JLyogRGVmYXVsdCBmbGFzaCBiYW5rd2lkdGggKi8KLQlwYjE1NTBfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQotCWlmIChzZXR1cF9mbGFzaF9wYXJhbXMoKSkgCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKgotCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KLQkgKi8KLQlwYXJ0cyA9IHBiMTU1MF9wYXJ0aXRpb25zOwotCW5iX3BhcnRzID0gTkJfT0YocGIxNTUwX3BhcnRpdGlvbnMpOwotCXBiMTU1MF9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiUGIxNTUwIGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJcGIxNTUwX21hcC5iYW5rd2lkdGgqOCk7Ci0JcGIxNTUwX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmcGIxNTUwX21hcCk7Ci0JaWYgKCFteW10ZCkgcmV0dXJuIC1FTlhJTzsKLQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBiMTU1MF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChteW10ZCkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChwYjE1NTBfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQocGIxNTUwX210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiRW1iZWRkZWQgRWRnZSwgTExDIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBiMTU1MCBtdGQgbWFwIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wYjF4eHgtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcGIxeHh4LWZsYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTczMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wYjF4eHgtZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IFBiMXh4eCBib2FyZHMKLSAqIAotICogKEMpIDIwMDEgUGV0ZSBQb3BvdiA8cHBvcG92QG12aXN0YS5jb20+Ci0gKiAKLSAqICRJZDogcGIxeHh4LWZsYXNoLmMsdiAxLjE0IDIwMDQvMTEvMDQgMTM6MjQ6MTUgZ2xlaXhuZXIgRXhwICQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmZGVmIAlERUJVR19SVwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikJCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NSVBTX1BCMTAwMAotCi0jZGVmaW5lIFdJTkRPV19BRERSIDB4MUY4MDAwMDAKLSNkZWZpbmUgV0lORE9XX1NJWkUgMHg4MDAwMDAKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMXh4eF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJ5YW1vbiBlbnYiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDAwMjAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gICBNVERfV1JJVEVBQkxFfSwKLQl7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDAzZTAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgyMDAwMCx9LAotCXsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiYm9vdCBjb2RlIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDEwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDQwMDAwMCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gICBNVERfV1JJVEVBQkxFfSwKLQl7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdy9rZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4NTAwMDAwfQotfTsKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjE1MDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfUEIxMTAwKQotCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX1BCMTUwMF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfUEIxNTAwX1VTRVIpCi0vKiBib3RoIDMyTUIgYmFua3Mgd2lsbCBiZSB1c2VkLiBDb21iaW5lIHRoZSBmaXJzdCAzMk1CIGJhbmsgYW5kIHRoZQotICogZmlyc3QgMjhNQiBvZiB0aGUgc2Vjb25kIGJhbmsgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBqZmZzL2pmZnMyCi0gKiBwYXJ0aXRpb24uCi0gKi8KLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxQzAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDQwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4M2MwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInlhbW9uIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDAxMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDJjMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDNkMDAwMDAKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfVVNFUikKLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxRTAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDIwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MWMwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInlhbW9uIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDAxMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgxYzAwMDAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDJjMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDFkMDAwMDAKLSAgICAgICAgfQotfTsKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfUEIxNTAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfVVNFUikKLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxQzAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDIwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgICAweDFlMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgICAweDAyMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgIDB4MWUwMDAwMCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX1BCMTUwMCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0jZWxzZQotI2Vycm9yIFVuc3VwcG9ydGVkIGJvYXJkCi0jZW5kaWYKLQotI2RlZmluZSBOQU1FICAgICAJIlBiMXgwMCBMaW51eCBGbGFzaCIKLSNkZWZpbmUgUEFERFIgICAgCVdJTkRPV19BRERSCi0jZGVmaW5lIEJVU1dJRFRICTQKLSNkZWZpbmUgU0laRQkJV0lORE9XX1NJWkUKLSNkZWZpbmUgUEFSVElUSU9OUwk0Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gcGIxeHh4X210ZF9tYXAgPSB7Ci0JLm5hbWUJCT0gTkFNRSwKLQkuc2l6ZQkJPSBTSVpFLAotCS5iYW5rd2lkdGgJPSBCVVNXSURUSCwKLQkucGh5cwkJPSBQQUREUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnBiMXh4eF9tdGQ7Ci0KLWludCBfX2luaXQgcGIxeHh4X210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JY2hhciAqcGFydF90eXBlOwotCQotCS8qCi0JICogU3RhdGljIHBhcnRpdGlvbiBkZWZpbml0aW9uIHNlbGVjdGlvbgotCSAqLwotCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCXBhcnRzID0gcGIxeHh4X3BhcnRpdGlvbnM7Ci0JbmJfcGFydHMgPSBBUlJBWV9TSVpFKHBiMXh4eF9wYXJ0aXRpb25zKTsKLQotCS8qCi0JICogTm93IGxldCdzIHByb2JlIGZvciB0aGUgYWN0dWFsIGZsYXNoLiAgRG8gaXQgaGVyZSBzaW5jZQotCSAqIHNwZWNpZmljIG1hY2hpbmUgc2V0dGluZ3MgbWlnaHQgaGF2ZSBiZWVuIHNldCBhYm92ZS4KLQkgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlBiMXh4eCBmbGFzaDogcHJvYmluZyAlZC1iaXQgZmxhc2ggYnVzXG4iLCAKLQkJCUJVU1dJRFRIKjgpOwotCXBiMXh4eF9tdGRfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSk7Ci0KLQlzaW1wbGVfbWFwX2luaXQoJnBiMXh4eF9tdGRfbWFwKTsKLQotCXBiMXh4eF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZwYjF4eHhfbXRkX21hcCk7Ci0JaWYgKCFwYjF4eHhfbXRkKSByZXR1cm4gLUVOWElPOwotCXBiMXh4eF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhZGRfbXRkX3BhcnRpdGlvbnMocGIxeHh4X210ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBiMXh4eF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChwYjF4eHhfbXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhwYjF4eHhfbXRkKTsKLQkJbWFwX2Rlc3Ryb3kocGIxeHh4X210ZCk7Ci0JCWlvdW5tYXAoKHZvaWQgKikgcGIxeHh4X210ZF9tYXAudmlydCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChwYjF4eHhfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQocGIxeHh4X210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQYjF4eHggQ0ZJIG1hcCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGNpLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BjaS5jCmluZGV4IDA4YjYwYmQuLjE4ZGJkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGNpLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wY2kuYwpAQCAtNyw3ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiAgJElkOiBwY2kuYyx2IDEuOSAyMDA0LzExLzI4IDA5OjQwOjQwIGR3bXcyIEV4cCAkCisgKiAgJElkOiBwY2kuYyx2IDEuMTAgMjAwNS8wMy8xOCAxNDowNDozNSBnbGVpeG5lciBFeHAgJAogICogCiAgKiBHZW5lcmljIFBDSSBtZW1vcnkgbWFwIGRyaXZlci4gIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBib2FyZHM6CiAgKiAgLSBJbnRlbCBJUTgwMzEwIEFUVS4KQEAgLTM3MCw3ICszNzAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdGRfcGNpX21hcHNfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm10ZF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXRkX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXRkX3BjaV9tYXBzX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCmluZGV4IGUzN2I0YzEuLmZmN2M1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtODAwLDExICs3OTksNiBAQAogCiAJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGNtY2lhbXRkX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCURFQlVHKDIsICJDYWxsaW5nIFJlZ2lzdGVyQ2xpZW50Iik7CkBAIC04MTgsMTQgKzgxMiw0MiBAQAogCXJldHVybiBsaW5rOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgcGNtY2lhbXRkX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfRlVOQ19JRCgxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklPIERBVEEiLCAiUENTLTJNIiwgIjJNQiBTUkFNIiwgMHg1NDdlNjZkYywgMHgxZmVkMzZjZCwgMHgzNmVhZGQyMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICIyTUIgU1JBTSIsIDB4YjU2OWE2ZTUsIDB4MzZlYWRkMjEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJQk0iLCAiNE1CIEZMQVNIIiwgMHhiNTY5YTZlNSwgMHg4YmM1NGQyYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICI4TUIgRkxBU0giLCAweGI1NjlhNmU1LCAweDZkZjFiZTNlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSW50ZWwiLCAiUzJFMjBTVyIsIDB4ODE2Y2M4MTUsIDB4ZDE0YzlkY2YpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJbnRlbCIsICJTMkU4IFNXIiwgMHg4MTZjYzgxNSwgMHhhMmQ3ZGVkYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImludGVsIiwgIlNFUklFUzItMDIgIiwgMHg0MGFkZTcxMSwgMHgxNDVjZWE1YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImludGVsIiwgIlNFUklFUzItMDQgIiwgMHg0MGFkZTcxMSwgMHg0MjA2NGRkYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImludGVsIiwgIlNFUklFUzItMjAgIiwgMHg0MGFkZTcxMSwgMHgyNWVlNWNiMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImludGVsIiwgIlZBTFVFIFNFUklFUyAxMDAgIiwgMHg0MGFkZTcxMSwgMHhkZjg1MDZkOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktJTkdNQVggVEVDSE5PTE9HWSBJTkMuIiwgIlNSQU0gMjU2SyBCeXRlcyIsIDB4NTRkMGM2OWMsIDB4YWQxMmMyOWMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNYXh0b3IiLCAiTUFYRkwgTW9iaWxlTWF4IEZsYXNoIE1lbW9yeSBDYXJkIiwgMHhiNjg5NjhjOCwgMHgyZGZiNDdiMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNFSUtPIEVQU09OIiwgIldXQjEwMUVOMjAiLCAweGY5ODc2YmFmLCAweGFkMGIyMDdiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU0VJS08gRVBTT04iLCAiV1dCNTEzRU4yMCIsIDB4Zjk4NzZiYWYsIDB4ZThkODg0YWQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTdGFyZmlzaCwgSW5jLiIsICJSRVgtMzAwMCIsIDB4MDVkZGNhNDcsIDB4ZTdkNjdiY2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTdGFyZmlzaCwgSW5jLiIsICJSRVgtNDEwMCIsIDB4MDVkZGNhNDcsIDB4N2JjMzI5NDQpLAorCS8qIHRoZSBmb2xsb3dpbmcgd2FzIGNvbW1lbnRlZCBvdXQgaW4gcGNtY2lhLWNzLTMuMi43ICovCisJLyogUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlJBVE9DIFN5c3RlbXMsSW5jLiIsICJTbWFydE1lZGlhIEFEQVBURVIgUEMgQ2FyZCIsIDB4ZjRhMmZlZmUsIDB4NTg4NWIyYWUpLCAqLworI2lmZGVmIENPTkZJR19NVERfUENNQ0lBX0FOT05ZTU9VUworCXsgLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9BTk9OWU1PVVMsIH0sCisjZW5kaWYKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcGNtY2lhbXRkX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBwY21jaWFtdGRfZHJpdmVyID0gewogCS5kcnYJCT0gewogCQkubmFtZQk9ICJwY21jaWFtdGQiCiAJfSwKIAkuYXR0YWNoCQk9IHBjbWNpYW10ZF9hdHRhY2gsCisJLmV2ZW50CQk9IHBjbWNpYW10ZF9ldmVudCwKIAkuZGV0YWNoCQk9IHBjbWNpYW10ZF9kZXRhY2gsCi0JLm93bmVyCQk9IFRISVNfTU9EVUxFCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZF90YWJsZQk9IHBjbWNpYW10ZF9pZHMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYyBiL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThiMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCkBAIC0wLDAgKzEsMjc4IEBACisvKiBkcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKKyAqCisgKiAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBHZW5lcmljIHBsYXRmcm9tIGRldmljZSBiYXNlZCBSQU0gbWFwCisgKgorICogJElkOiBwbGF0LXJhbS5jLHYgMS4zIDIwMDUvMDMvMTkgMjI6NDE6MjcgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggbXRkIHBsYXRmb3JtIHJhbSBkZXZpY2UgY3JlYXRlZCAqLworCitzdHJ1Y3QgcGxhdHJhbV9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtdGRfaW5mbwkJKm10ZDsKKwlzdHJ1Y3QgbWFwX2luZm8JCSBtYXA7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRpdGlvbnM7CisJc3RydWN0IHJlc291cmNlCQkqYXJlYTsKKwlzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbQkqcGRhdGE7Cit9OworCisvKiB0b19wbGF0cmFtX2luZm8oKQorICoKKyAqIGRldmljZSBwcml2YXRlIGRhdGEgdG8gc3RydWN0IHBsYXRyYW1faW5mbyBjb252ZXJzaW9uCisqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbGF0cmFtX2luZm8gKnRvX3BsYXRyYW1faW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGxhdHJhbV9pbmZvICopZGV2X2dldF9kcnZkYXRhKGRldik7Cit9CisKKy8qIHBsYXRyYW1fc2V0cncKKyAqCisgKiBjYWxsIHRoZSBwbGF0Zm9ybSBkZXZpY2UncyBzZXQgcncvcm8gY29udHJvbAorICoKKyAqIHRvID0gMCA9PiByZWFkLW9ubHkKKyAqICAgID0gMSA9PiByZWFkLXdyaXRlCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdHJhbV9zZXRydyhzdHJ1Y3QgcGxhdHJhbV9pbmZvICppbmZvLCBpbnQgdG8pCit7CisJaWYgKGluZm8tPnBkYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChpbmZvLT5wZGF0YS0+c2V0X3J3ICE9IE5VTEwpCisJCShpbmZvLT5wZGF0YS0+c2V0X3J3KShpbmZvLT5kZXYsIHRvKTsKK30KKworLyogcGxhdHJhbV9yZW1vdmUKKyAqCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgZHJpdmVyJ3MgY29udHJvbAorKi8KKworc3RhdGljIGludCBwbGF0cmFtX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRyYW1faW5mbyAqaW5mbyA9IHRvX3BsYXRyYW1faW5mbyhkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlkZXZfZGJnKGRldiwgInJlbW92aW5nIGRldmljZVxuIik7CisKKwlpZiAoaW5mbyA9PSBOVUxMKSAKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5mby0+bXRkKSB7CisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJCWlmIChpbmZvLT5wYXJ0aXRpb25zKSB7CisJCQlkZWxfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkKTsKKwkJCWtmcmVlKGluZm8tPnBhcnRpdGlvbnMpOworCQl9CisjZW5kaWYKKwkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKKwkJbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKKwl9CisKKwkvKiBlbnN1cmUgcmFtIGlzIGxlZnQgcmVhZC1vbmx5ICovCisKKwlwbGF0cmFtX3NldHJ3KGluZm8sIFBMQVRSQU1fUk8pOworCisJLyogcmVsZWFzZSByZXNvdXJjZXMgKi8KKworCWlmIChpbmZvLT5hcmVhKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoaW5mby0+YXJlYSk7CisJCWtmcmVlKGluZm8tPmFyZWEpOworCX0KKworCWlmIChpbmZvLT5tYXAudmlydCAhPSBOVUxMKQorCQlpb3VubWFwKGluZm8tPm1hcC52aXJ0KTsKKwkKKwlrZnJlZShpbmZvKTsKKworCXJldHVybiAwOworfQorCisvKiBwbGF0cmFtX3Byb2JlCisgKgorICogY2FsbGVkIGZyb20gZGV2aWNlIGRyaXZlIHN5c3RlbSB3aGVuIGEgZGV2aWNlIG1hdGNoaW5nIG91cgorICogZHJpdmVyIGlzIGZvdW5kLgorKi8KKworc3RhdGljIGludCBwbGF0cmFtX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZCA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtCSpwZGF0YTsKKwlzdHJ1Y3QgcGxhdHJhbV9pbmZvICppbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnIgPSAwOworCisJZGV2X2RiZyhkZXYsICJwcm9iZSBlbnRlcmVkXG4iKTsKKwkKKwlpZiAoZGV2LT5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBleGl0X2Vycm9yOworCX0KKworCXBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSBmb3IgZmxhc2ggaW5mb1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9lcnJvcjsKKwl9CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CisKKwlpbmZvLT5kZXYgPSBkZXY7CisJaW5mby0+cGRhdGEgPSBwZGF0YTsKKworCS8qIGdldCB0aGUgcmVzb3VyY2UgZm9yIHRoZSBtZW1vcnkgbWFwcGluZyAqLworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkLCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgcmVzb3VyY2Ugc3BlY2lmaWVkXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJZGV2X2RiZyhkZXYsICJnb3QgcGxhdGZvcm0gcmVzb3VyY2UgJXAgKDB4JWx4KVxuIiwgcmVzLCByZXMtPnN0YXJ0KTsKKworCS8qIHNldHVwIG1hcCBwYXJhbWV0ZXJzICovCisKKwlpbmZvLT5tYXAucGh5cyA9IHJlcy0+c3RhcnQ7CisJaW5mby0+bWFwLnNpemUgPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDE7CisJaW5mby0+bWFwLm5hbWUgPSBwZGF0YS0+bWFwbmFtZSAhPSBOVUxMID8gcGRhdGEtPm1hcG5hbWUgOiBwZC0+bmFtZTsKKwlpbmZvLT5tYXAuYmFua3dpZHRoID0gcGRhdGEtPmJhbmt3aWR0aDsKKworCS8qIHJlZ2lzdGVyIG91ciB1c2FnZSBvZiB0aGUgbWVtb3J5IGFyZWEgKi8KKworCWluZm8tPmFyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgaW5mby0+bWFwLnNpemUsIHBkLT5uYW1lKTsKKwlpZiAoaW5mby0+YXJlYSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIHJlbWFwIHRoZSBtZW1vcnkgYXJlYSAqLworCisJaW5mby0+bWFwLnZpcnQgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIGluZm8tPm1hcC5zaXplKTsKKwlkZXZfZGJnKGRldiwgInZpcnQgJXAsICVsdSBieXRlc1xuIiwgaW5mby0+bWFwLnZpcnQsIGluZm8tPm1hcC5zaXplKTsKKworCWlmIChpbmZvLT5tYXAudmlydCA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGlvcmVtYXAoKSByZWdpb25cbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlzaW1wbGVfbWFwX2luaXQoJmluZm8tPm1hcCk7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2VkIG1hcCwgcHJvYmluZyBmb3IgbXRkXG4iKTsKKworCS8qIHByb2JlIGZvciB0aGUgcmlnaHQgbXRkIG1hcCBkcml2ZXIgKi8KKworCWluZm8tPm10ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JhbSIgLCAmaW5mby0+bWFwKTsKKwlpZiAoaW5mby0+bXRkID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcHJvYmUgZm9yIG1hcF9yYW1cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlwbGF0cmFtX3NldHJ3KGluZm8sIFBMQVRSQU1fUlcpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYXZhaWxhYmxlIHBhcnRpdGlvbnMsIG9yIHdldGhlcgorCSAqIHRvIGFkZCB0aGlzIGRldmljZSB3aG9sZSAqLworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJaWYgKHBkYXRhLT5ucl9wYXJ0aXRpb25zID4gMCkgeworCQljb25zdCBjaGFyICoqcHJvYmVzID0geyBOVUxMIH07CisKKwkJaWYgKHBkYXRhLT5wcm9iZXMpCisJCQlwcm9iZXMgPSAoY29uc3QgY2hhciAqKilwZGF0YS0+cHJvYmVzOworCisJCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcHJvYmVzLAorCQkJCQkgICAmaW5mby0+cGFydGl0aW9ucywgMCk7CisJCWlmIChlcnIgPiAwKSB7CisJCQllcnIgPSBhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBpbmZvLT5wYXJ0aXRpb25zLAorCQkJCQkJIGVycik7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX01URF9QQVJUSVRJT05TICovCisKKwlpZiAoYWRkX210ZF9kZXZpY2UoaW5mby0+bXRkKSkgeworCQlkZXZfZXJyKGRldiwgImFkZF9tdGRfZGV2aWNlKCkgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwl9CisJCisJZGV2X2luZm8oZGV2LCAicmVnaXN0ZXJlZCBtdGQgZGV2aWNlXG4iKTsKKwlyZXR1cm4gZXJyOworCisgZXhpdF9mcmVlOgorCXBsYXRyYW1fcmVtb3ZlKGRldik7CisgZXhpdF9lcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCisvKiBkZXZpY2UgZHJpdmVyIGluZm8gKi8KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHBsYXRyYW1fZHJpdmVyID0geworCS5uYW1lCQk9ICJtdGQtcmFtIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gcGxhdHJhbV9wcm9iZSwKKwkucmVtb3ZlCQk9IHBsYXRyYW1fcmVtb3ZlLAorfTsKKworLyogbW9kdWxlIGluaXQvZXhpdCAqLworCitzdGF0aWMgaW50IF9faW5pdCBwbGF0cmFtX2luaXQodm9pZCkKK3sKKwlwcmludGsoIkdlbmVyaWMgcGxhdGZvcm0gUkFNIE1URCwgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZwbGF0cmFtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbGF0cmFtX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmcGxhdHJhbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwbGF0cmFtX2luaXQpOworbW9kdWxlX2V4aXQocGxhdHJhbV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgcGxhdGZvcm0gUkFNIG1hcCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc2NiMl9mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMKaW5kZXggNWJiM2I2MC4uOTdhOGRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogTVREIG1hcCBkcml2ZXIgZm9yIEJJT1MgRmxhc2ggb24gSW50ZWwgU0NCMiBib2FyZHMKLSAqICRJZDogc2NiMl9mbGFzaC5jLHYgMS4xMSAyMDA0LzExLzI4IDA5OjQwOjQwIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHNjYjJfZmxhc2guYyx2IDEuMTIgMjAwNS8wMy8xOCAxNDowNDozNSBnbGVpeG5lciBFeHAgJAogICogQ29weXJpZ2h0IChDKSAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqIFRpbSBIb2NraW4gPHRob2NraW5Ac3VuLmNvbT4KICAqCkBAIC0yMzgsNyArMjM4LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBzY2IyX2ZsYXNoX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzY2IyX2ZsYXNoX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNjYjJfZmxhc2hfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3NoYXJwc2wtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCmluZGV4IGIzYjM5Y2IuLmQxNWRhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxIExpbmVvIEphcGFuLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFNIQVJQCiAgKgotICogJElkOiBzaGFycHNsLWZsYXNoLmMsdiAxLjIgMjAwNC8xMS8yNCAyMDozODowNiBycHVyZGllIEV4cCAkCisgKiAkSWQ6IHNoYXJwc2wtZmxhc2guYyx2IDEuNSAyMDA1LzAzLzIxIDA4OjQyOjExIHJwdXJkaWUgRXhwICQKICAqCiAgKiBiYXNlZCBvbiBycHhsaXRlLmMsdiAxLjE1IDIwMDEvMTAvMDIgMTU6MDU6MTQgZHdtdzIgRXhwCiAgKiAgICAgICAgICBIYW5kbGUgbWFwcGluZyBvZiB0aGUgZmxhc2ggb24gdGhlIFJQWCBMaXRlIGFuZCBDTExGIGJvYXJkcwpAQCAtMjQsMTMgKzI0LDE0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2RlZmluZSBXSU5ET1dfQUREUiAweDAwMDAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MDEwMDAwMDAKKyNkZWZpbmUgV0lORE9XX1NJWkUgMHgwMDgwMDAwMAogI2RlZmluZSBCQU5LX1dJRFRIIDIKIAogc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7CkBAIC00NCw5ICs0NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzaGFycHNsX3BhcnRpdGlvbnNbMV0gPSB7CiAJewotCQluYW1lOgkJIkZpbGVzeXN0ZW0iLAotCQlzaXplOgkJMHgwMDZkMDAwMCwKLQkJb2Zmc2V0OgkJMHgwMDEyMDAwMAorCQluYW1lOgkJIkJvb3QgUFJPTSBGaWxlc3lzdGVtIiwKIAl9CiB9OwogCkBAIC01OCwxMiArNTcsMTYgQEAKIAlpbnQgbmJfcGFydHMgPSAwOwogCWNoYXIgKnBhcnRfdHlwZSA9ICJzdGF0aWMiOwogCi0JcHJpbnRrKEtFUk5fTk9USUNFICJTaGFycCBTTCBzZXJpZXMgZmxhc2ggZGV2aWNlOiAleCBhdCAleFxuIiwgV0lORE9XX1NJWkUsIFdJTkRPV19BRERSKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlNoYXJwIFNMIHNlcmllcyBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLCAKKwkJV0lORE9XX1NJWkUsIFdJTkRPV19BRERSKTsKIAlzaGFycHNsX21hcC52aXJ0ID0gaW9yZW1hcChXSU5ET1dfQUREUiwgV0lORE9XX1NJWkUpOwogCWlmICghc2hhcnBzbF9tYXAudmlydCkgewogCQlwcmludGsoIkZhaWxlZCB0byBpb3JlbWFwXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQorCisJc2ltcGxlX21hcF9pbml0KCZzaGFycHNsX21hcCk7CisKIAlteW10ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JvbSIsICZzaGFycHNsX21hcCk7CiAJaWYgKCFteW10ZCkgewogCQlpb3VubWFwKHNoYXJwc2xfbWFwLnZpcnQpOwpAQCAtNzIsNiArNzUsMjIgQEAKIAogCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCisJaWYgKG1hY2hpbmVfaXNfY29yZ2koKSB8fCBtYWNoaW5lX2lzX3NoZXBoZXJkKCkgfHwgbWFjaGluZV9pc19odXNreSgpIAorCQl8fCBtYWNoaW5lX2lzX3Bvb2RsZSgpKSB7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5zaXplPTB4MDA2ZDAwMDA7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5vZmZzZXQ9MHgwMDEyMDAwMDsKKwl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfdG9zYSgpKSB7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5zaXplPTB4MDA2YTAwMDA7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5vZmZzZXQ9MHgwMDE2MDAwMDsKKwl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfc3BpdHooKSkgeworCQlzaGFycHNsX3BhcnRpdGlvbnNbMF0uc2l6ZT0weDAwNmIwMDAwOworCQlzaGFycHNsX3BhcnRpdGlvbnNbMF0ub2Zmc2V0PTB4MDAxNDAwMDA7CisJfSBlbHNlIHsKKwkJbWFwX2Rlc3Ryb3kobXltdGQpOworCQlpb3VubWFwKHNoYXJwc2xfbWFwLnZpcnQpOwkKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQogCXBhcnRzID0gc2hhcnBzbF9wYXJ0aXRpb25zOwogCW5iX3BhcnRzID0gTkJfT0Yoc2hhcnBzbF9wYXJ0aXRpb25zKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY2hhci5jIGIvZHJpdmVycy9tdGQvbXRkY2hhci5jCmluZGV4IDUxMGFkNzguLjFlZDYwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGNoYXIuYworKysgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBtdGRjaGFyLmMsdiAxLjY2IDIwMDUvMDEvMDUgMTg6MDU6MTEgZHdtdzIgRXhwICQKKyAqICRJZDogbXRkY2hhci5jLHYgMS43MyAyMDA1LzA3LzA0IDE3OjM2OjQxIGdsZWl4bmVyIEV4cCAkCiAgKgogICogQ2hhcmFjdGVyLWRldmljZSBhY2Nlc3MgdG8gcmF3IE1URCBkZXZpY2VzLgogICoKQEAgLTE1LDI3ICsxNSwzMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2lmZGVmIENPTkZJR19ERVZGU19GUwotI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCitzdGF0aWMgc3RydWN0IGNsYXNzICptdGRfY2xhc3M7CiAKIHN0YXRpYyB2b2lkIG10ZF9ub3RpZnlfYWRkKHN0cnVjdCBtdGRfaW5mbyogbXRkKQogewogCWlmICghbXRkKQogCQlyZXR1cm47CiAKLQlkZXZmc19ta19jZGV2KE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIpLAotCQkgICAgICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sICJtdGQvJWQiLCBtdGQtPmluZGV4KTsKLQkJCi0JZGV2ZnNfbWtfY2RldihNS0RFVihNVERfQ0hBUl9NQUpPUiwgbXRkLT5pbmRleCoyKzEpLAotCQkgICAgICBTX0lGQ0hSIHwgU19JUlVHTywgIm10ZC8lZHJvIiwgbXRkLT5pbmRleCk7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZShtdGRfY2xhc3MsIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIpLAorCQkJICAgIE5VTEwsICJtdGQlZCIsIG10ZC0+aW5kZXgpOworCQorCWNsYXNzX2RldmljZV9jcmVhdGUobXRkX2NsYXNzLCAKKwkJCSAgICBNS0RFVihNVERfQ0hBUl9NQUpPUiwgbXRkLT5pbmRleCoyKzEpLAorCQkJICAgIE5VTEwsICJtdGQlZHJvIiwgbXRkLT5pbmRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIG10ZF9ub3RpZnlfcmVtb3ZlKHN0cnVjdCBtdGRfaW5mbyogbXRkKQogewogCWlmICghbXRkKQogCQlyZXR1cm47Ci0JZGV2ZnNfcmVtb3ZlKCJtdGQvJWQiLCBtdGQtPmluZGV4KTsKLQlkZXZmc19yZW1vdmUoIm10ZC8lZHJvIiwgbXRkLT5pbmRleCk7CisKKwljbGFzc19kZXZpY2VfZGVzdHJveShtdGRfY2xhc3MsIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIpKTsKKwljbGFzc19kZXZpY2VfZGVzdHJveShtdGRfY2xhc3MsIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSkpOwogfQogCiBzdGF0aWMgc3RydWN0IG10ZF9ub3RpZmllciBub3RpZmllciA9IHsKQEAgLTQzLDI1ICs0NiwyNSBAQAogCS5yZW1vdmUJPSBtdGRfbm90aWZ5X3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdGRjaGFyX2RldmZzX2luaXQodm9pZCkKLXsKLQlkZXZmc19ta19kaXIoIm10ZCIpOwotCXJlZ2lzdGVyX210ZF91c2VyKCZub3RpZmllcik7Ci19CisvKgorICogV2UgdXNlIGZpbGUtPnByaXZhdGVfZGF0YSB0byBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIE1URGRldmljZS4KKyAqIFNpbmNlIGFsaWdobWVudCBpcyBhdCBsZWFzdCAzMiBiaXRzLCB3ZSBoYXZlIDIgYml0cyBmcmVlIGZvciBPVFAKKyAqIG1vZGVzIGFzIHdlbGwuCisgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIG10ZGNoYXJfZGV2ZnNfZXhpdCh2b2lkKQotewotCXVucmVnaXN0ZXJfbXRkX3VzZXIoJm5vdGlmaWVyKTsKLQlkZXZmc19yZW1vdmUoIm10ZCIpOwotfQotI2Vsc2UgLyogIURFVkZTICovCi0jZGVmaW5lIG10ZGNoYXJfZGV2ZnNfaW5pdCgpIGRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBtdGRjaGFyX2RldmZzX2V4aXQoKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgorI2RlZmluZSBUT19NVEQoZmlsZSkgKHN0cnVjdCBtdGRfaW5mbyAqKSgobG9uZykoKGZpbGUpLT5wcml2YXRlX2RhdGEpICYgfjNMKQorCisjZGVmaW5lIE1URF9NT0RFX09UUF9GQUNUCTEKKyNkZWZpbmUgTVREX01PREVfT1RQX1VTRVIJMgorI2RlZmluZSBNVERfTU9ERShmaWxlKQkJKChsb25nKSgoZmlsZSktPnByaXZhdGVfZGF0YSkgJiAzKQorCisjZGVmaW5lIFNFVF9NVERfTU9ERShmaWxlLCBtb2RlKSBcCisJZG8geyBsb25nIF9fcCA9IChsb25nKSgoZmlsZSktPnByaXZhdGVfZGF0YSk7IFwKKwkgICAgIChmaWxlKS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikoKF9fcCAmIH4zTCkgfCBtb2RlKTsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGxvZmZfdCBtdGRfbHNlZWsgKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKIHsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IFRPX01URChmaWxlKTsKIAogCXN3aXRjaCAob3JpZykgewogCWNhc2UgMDoKQEAgLTEzNCw3ICsxMzcsNyBAQAogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIk1URF9jbG9zZVxuIik7CiAKLQltdGQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbXRkID0gVE9fTVREKGZpbGUpOwogCQogCWlmIChtdGQtPnN5bmMpCiAJCW10ZC0+c3luYyhtdGQpOwpAQCAtMTUxLDcgKzE1NCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IG10ZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gVE9fTVREKGZpbGUpOwogCXNpemVfdCByZXRsZW49MDsKIAlzaXplX3QgdG90YWxfcmV0bGVuPTA7CiAJaW50IHJldD0wOwpAQCAtMTc4LDcgKzE4MSwxNiBAQAogCQlpZiAoIWtidWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJCi0JCXJldCA9IE1URF9SRUFEKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCXN3aXRjaCAoTVREX01PREUoZmlsZSkpIHsKKwkJY2FzZSBNVERfTU9ERV9PVFBfRkFDVDoKKwkJCXJldCA9IG10ZC0+cmVhZF9mYWN0X3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCQlicmVhazsKKwkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJCXJldCA9IG10ZC0+cmVhZF91c2VyX3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IE1URF9SRUFEKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCX0KIAkJLyogTmFuZCByZXR1cm5zIC1FQkFETVNHIG9uIGVjYyBlcnJvcnMsIGJ1dCBpdCByZXR1cm5zCiAJCSAqIHRoZSBkYXRhLiBGb3Igb3VyIHVzZXJzcGFjZSB0b29scyBpdCBpcyBpbXBvcnRhbnQKIAkJICogdG8gZHVtcCBhcmVhcyB3aXRoIGVjYyBlcnJvcnMgISAKQEAgLTE5Niw2ICsyMDgsOCBAQAogCiAJCQljb3VudCAtPSByZXRsZW47CiAJCQlidWYgKz0gcmV0bGVuOworCQkJaWYgKHJldGxlbiA9PSAwKQorCQkJCWNvdW50ID0gMDsKIAkJfQogCQllbHNlIHsKIAkJCWtmcmVlKGtidWYpOwpAQCAtMjEwLDcgKzIyNCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IG10ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IFRPX01URChmaWxlKTsKIAljaGFyICprYnVmOwogCXNpemVfdCByZXRsZW47CiAJc2l6ZV90IHRvdGFsX3JldGxlbj0wOwpAQCAtMjQ1LDcgKzI1OSwyMCBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJCi0JICAgICAgICByZXQgPSAoKihtdGQtPndyaXRlKSkobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJc3dpdGNoIChNVERfTU9ERShmaWxlKSkgeworCQljYXNlIE1URF9NT0RFX09UUF9GQUNUOgorCQkJcmV0ID0gLUVST0ZTOworCQkJYnJlYWs7CisJCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCQlpZiAoIW10ZC0+d3JpdGVfdXNlcl9wcm90X3JlZykgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gbXRkLT53cml0ZV91c2VyX3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9ICgqKG10ZC0+d3JpdGUpKShtdGQsICpwcG9zLCBsZW4sICZyZXRsZW4sIGtidWYpOworCQl9CiAJCWlmICghcmV0KSB7CiAJCQkqcHBvcyArPSByZXRsZW47CiAJCQl0b3RhbF9yZXRsZW4gKz0gcmV0bGVuOwpAQCAtMjc2LDcgKzMwMyw3IEBACiBzdGF0aWMgaW50IG10ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBUT19NVEQoZmlsZSk7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldCA9IDA7CiAJdV9sb25nIHNpemU7CkBAIC01MTgsNiArNTQ1LDgwIEBACiAJCWJyZWFrOwogCX0KIAorI2lmZGVmIENPTkZJR19NVERfT1RQCisJY2FzZSBPVFBTRUxFQ1Q6CisJeworCQlpbnQgbW9kZTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCBhcmdwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJU0VUX01URF9NT0RFKGZpbGUsIDApOworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBNVERfT1RQX0ZBQ1RPUlk6CisJCQlpZiAoIW10ZC0+cmVhZF9mYWN0X3Byb3RfcmVnKQorCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJZWxzZQorCQkJCVNFVF9NVERfTU9ERShmaWxlLCBNVERfTU9ERV9PVFBfRkFDVCk7CisJCQlicmVhazsKKwkJY2FzZSBNVERfT1RQX1VTRVI6CisJCQlpZiAoIW10ZC0+cmVhZF9mYWN0X3Byb3RfcmVnKQorCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJZWxzZQorCQkJCVNFVF9NVERfTU9ERShmaWxlLCBNVERfTU9ERV9PVFBfVVNFUik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCWNhc2UgTVREX09UUF9PRkY6CisJCQlicmVhazsKKwkJfQorCQlmaWxlLT5mX3BvcyA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgT1RQR0VUUkVHSU9OQ09VTlQ6CisJY2FzZSBPVFBHRVRSRUdJT05JTkZPOgorCXsKKwkJc3RydWN0IG90cF9pbmZvICpidWYgPSBrbWFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJc3dpdGNoIChNVERfTU9ERShmaWxlKSkgeworCQljYXNlIE1URF9NT0RFX09UUF9GQUNUOgorCQkJaWYgKG10ZC0+Z2V0X2ZhY3RfcHJvdF9pbmZvKQorCQkJCXJldCA9IG10ZC0+Z2V0X2ZhY3RfcHJvdF9pbmZvKG10ZCwgYnVmLCA0MDk2KTsKKwkJCWJyZWFrOworCQljYXNlIE1URF9NT0RFX09UUF9VU0VSOgorCQkJaWYgKG10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvKQorCQkJCXJldCA9IG10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvKG10ZCwgYnVmLCA0MDk2KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXQgPj0gMCkgeworCQkJaWYgKGNtZCA9PSBPVFBHRVRSRUdJT05DT1VOVCkgeworCQkJCWludCBuYnIgPSByZXQgLyBzaXplb2Yoc3RydWN0IG90cF9pbmZvKTsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJm5iciwgc2l6ZW9mKGludCkpOworCQkJfSBlbHNlCisJCQkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsIGJ1ZiwgcmV0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCQlrZnJlZShidWYpOworCQlicmVhazsKKwl9CisKKwljYXNlIE9UUExPQ0s6CisJeworCQlzdHJ1Y3Qgb3RwX2luZm8gaW5mbzsKKworCQlpZiAoTVREX01PREUoZmlsZSkgIT0gTVREX01PREVfT1RQX1VTRVIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmdwLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICghbXRkLT5sb2NrX3VzZXJfcHJvdF9yZWcpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJldCA9IG10ZC0+bG9ja191c2VyX3Byb3RfcmVnKG10ZCwgaW5mby5zdGFydCwgaW5mby5sZW5ndGgpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9UVFk7CiAJfQpAQCAtNTQzLDEzICs2NDQsMjIgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JbXRkY2hhcl9kZXZmc19pbml0KCk7CisJbXRkX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibXRkIik7CisKKwlpZiAoSVNfRVJSKG10ZF9jbGFzcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjcmVhdGluZyBtdGQgY2xhc3MuXG4iKTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoTVREX0NIQVJfTUFKT1IsICJtdGQiKTsKKwkJcmV0dXJuIFBUUl9FUlIobXRkX2NsYXNzKTsKKwl9CisKKwlyZWdpc3Rlcl9tdGRfdXNlcigmbm90aWZpZXIpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9tdGRjaGFyKHZvaWQpCiB7Ci0JbXRkY2hhcl9kZXZmc19leGl0KCk7CisJdW5yZWdpc3Rlcl9tdGRfdXNlcigmbm90aWZpZXIpOworCWNsYXNzX2Rlc3Ryb3kobXRkX2NsYXNzKTsKIAl1bnJlZ2lzdGVyX2NocmRldihNVERfQ0hBUl9NQUpPUiwgIm10ZCIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMgYi9kcml2ZXJzL210ZC9tdGRjb3JlLmMKaW5kZXggOWMwMzE1ZC4uZGM4NmRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29yZS5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IG10ZGNvcmUuYyx2IDEuNDQgMjAwNC8xMS8xNiAxODoyODo1OSBkd213MiBFeHAgJAorICogJElkOiBtdGRjb3JlLmMsdiAxLjQ1IDIwMDUvMDIvMTggMTQ6MzQ6NTAgZGVkZWtpbmQgRXhwICQKICAqCiAgKiBDb3JlIHJlZ2lzdHJhdGlvbiBhbmQgY2FsbGJhY2sgcm91dGluZXMgZm9yIE1URAogICogZHJpdmVycyBhbmQgdXNlcnMuCkBAIC0xNDksOCArMTQ5LDggQEAKIH0KIAogLyoqCi0gKglyZWdpc3Rlcl9tdGRfdXNlciAtIHVucmVnaXN0ZXIgYSAndXNlcicgb2YgTVREIGRldmljZXMuCi0gKglAbmV3OiBwb2ludGVyIHRvIG5vdGlmaWVyIGluZm8gc3RydWN0dXJlCisgKgl1bnJlZ2lzdGVyX210ZF91c2VyIC0gdW5yZWdpc3RlciBhICd1c2VyJyBvZiBNVEQgZGV2aWNlcy4KKyAqCUBvbGQ6IHBvaW50ZXIgdG8gbm90aWZpZXIgaW5mbyBzdHJ1Y3R1cmUKICAqCiAgKglSZW1vdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGFpciBmcm9tIHRoZSBsaXN0IG9mICd1c2VycycgdG8gYmUKICAqCW5vdGlmaWVkIHVwb24gYWRkaXRpb24gb3IgcmVtb3ZhbCBvZiBNVEQgZGV2aWNlcy4gQ2F1c2VzIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkcGFydC5jIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCmluZGV4IDk2ZWJiNTIuLmI5MmU2YmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCkBAIC01LDcgKzUsNyBAQAogICoKICAqIFRoaXMgY29kZSBpcyBHUEwKICAqCi0gKiAkSWQ6IG10ZHBhcnQuYyx2IDEuNTEgMjAwNC8xMS8xNiAxODoyODo1OSBkd213MiBFeHAgJAorICogJElkOiBtdGRwYXJ0LmMsdiAxLjUzIDIwMDUvMDIvMDggMTc6MTE6MTMgbmljbyBFeHAgJAogICoKICAqIAkwMi0yMS0yMDAyCVRob21hcyBHbGVpeG5lciA8Z2xlaXhuZXJAYXV0cm9uaXguZGU+CiAgKgkJCWFkZGVkIHN1cHBvcnQgZm9yIHJlYWRfb29iLCB3cml0ZV9vb2IKQEAgLTExNiw2ICsxMTYsMTMgQEAKIAkJCQkJbGVuLCByZXRsZW4sIGJ1Zik7CiB9CiAKK3N0YXRpYyBpbnQgcGFydF9nZXRfdXNlcl9wcm90X2luZm8gKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CisJcmV0dXJuIHBhcnQtPm1hc3Rlci0+Z2V0X3VzZXJfcHJvdF9pbmZvIChwYXJ0LT5tYXN0ZXIsIGJ1ZiwgbGVuKTsKK30KKwogc3RhdGljIGludCBwYXJ0X3JlYWRfZmFjdF9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCAKIAkJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKIHsKQEAgLTEyNCw2ICsxMzEsMTMgQEAKIAkJCQkJbGVuLCByZXRsZW4sIGJ1Zik7CiB9CiAKK3N0YXRpYyBpbnQgcGFydF9nZXRfZmFjdF9wcm90X2luZm8gKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CisJcmV0dXJuIHBhcnQtPm1hc3Rlci0+Z2V0X2ZhY3RfcHJvdF9pbmZvIChwYXJ0LT5tYXN0ZXIsIGJ1ZiwgbGVuKTsKK30KKwogc3RhdGljIGludCBwYXJ0X3dyaXRlIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAogCQkJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQogewpAQCAtMTgyLDYgKzE5NiwxMiBAQAogCQkJCQlsZW4sIHJldGxlbiwgYnVmKTsKIH0KIAorc3RhdGljIGludCBwYXJ0X2xvY2tfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuKSAKK3sKKwlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CisJcmV0dXJuIHBhcnQtPm1hc3Rlci0+bG9ja191c2VyX3Byb3RfcmVnIChwYXJ0LT5tYXN0ZXIsIGZyb20sIGxlbik7Cit9CisKIHN0YXRpYyBpbnQgcGFydF93cml0ZXYgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCAgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCiAJCQkgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbikKIHsKQEAgLTQwOSw2ICs0MjksMTIgQEAKIAkJCXNsYXZlLT5tdGQucmVhZF9mYWN0X3Byb3RfcmVnID0gcGFydF9yZWFkX2ZhY3RfcHJvdF9yZWc7CiAJCWlmKG1hc3Rlci0+d3JpdGVfdXNlcl9wcm90X3JlZykKIAkJCXNsYXZlLT5tdGQud3JpdGVfdXNlcl9wcm90X3JlZyA9IHBhcnRfd3JpdGVfdXNlcl9wcm90X3JlZzsKKwkJaWYobWFzdGVyLT5sb2NrX3VzZXJfcHJvdF9yZWcpCisJCQlzbGF2ZS0+bXRkLmxvY2tfdXNlcl9wcm90X3JlZyA9IHBhcnRfbG9ja191c2VyX3Byb3RfcmVnOworCQlpZihtYXN0ZXItPmdldF91c2VyX3Byb3RfaW5mbykKKwkJCXNsYXZlLT5tdGQuZ2V0X3VzZXJfcHJvdF9pbmZvID0gcGFydF9nZXRfdXNlcl9wcm90X2luZm87CisJCWlmKG1hc3Rlci0+Z2V0X2ZhY3RfcHJvdF9pbmZvKQorCQkJc2xhdmUtPm10ZC5nZXRfZmFjdF9wcm90X2luZm8gPSBwYXJ0X2dldF9mYWN0X3Byb3RfaW5mbzsKIAkJaWYgKG1hc3Rlci0+c3luYykKIAkJCXNsYXZlLT5tdGQuc3luYyA9IHBhcnRfc3luYzsKIAkJaWYgKCFpICYmIG1hc3Rlci0+c3VzcGVuZCAmJiBtYXN0ZXItPnJlc3VtZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IGY3ODAxZWIuLjM2ZDM0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiAjIGRyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwotIyAkSWQ6IEtjb25maWcsdiAxLjI2IDIwMDUvMDEvMDUgMTI6NDI6MjQgZHdtdzIgRXhwICQKKyMgJElkOiBLY29uZmlnLHYgMS4zMSAyMDA1LzA2LzIwIDEyOjAzOjIxIGJqZCBFeHAgJAogCiBtZW51ICJOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzIgogCWRlcGVuZHMgb24gTVREIT1uCkBAIC01OCwyMCArNTgsNiBAQAogY29uZmlnIE1URF9OQU5EX0lEUwogCXRyaXN0YXRlCiAKLWNvbmZpZyBNVERfTkFORF9UWDQ5MjVOREZNQwotCXRyaXN0YXRlICJTbWFydE1lZGlhIENhcmQgb24gVG9zaGliYSBSQlRYNDkyNSByZWZlcmVuY2UgYm9hcmQiCi0JZGVwZW5kcyBvbiBUT1NISUJBX1JCVFg0OTI1ICYmIE1URF9OQU5EICYmIFRPU0hJQkFfUkJUWDQ5MjVfTVBMRVhfTkFORAotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24gdGhlCi0JICBUb3NoaWJhIFJCVFg0OTI1IHJlZmVyZW5jZSBib2FyZCwgd2hpY2ggaXMgYSBTbWFydE1lZGlhQ2FyZC4KLQotY29uZmlnIE1URF9OQU5EX1RYNDkzOE5ERk1DCi0JdHJpc3RhdGUgIk5BTkQgRmxhc2ggZGV2aWNlIG9uIFRvc2hpYmEgUkJUWDQ5MzggcmVmZXJlbmNlIGJvYXJkIgotCWRlcGVuZHMgb24gVE9TSElCQV9SQlRYNDkzOCAmJiBNVERfTkFORCAmJiBUT1NISUJBX1JCVFg0OTM4X01QTEVYX05BTkQgCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKLQkgIFRvc2hpYmEgUkJUWDQ5MzggcmVmZXJlbmNlIGJvYXJkLgotCiBjb25maWcgTVREX05BTkRfQVUxNTUwCiAJdHJpc3RhdGUgIkF1MTU1MCBOQU5EIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT0NfQVUxNTUwICYmIE1URF9OQU5ECkBAIC05NSwxMCArODEsMTEgQEAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgTkFORCBmbGFzaCBkcml2ZXIgb24gdGhlIFBQQ2hhbWVsZW9uIEVWQiBCb2FyZC4KIAogY29uZmlnIE1URF9OQU5EX1MzQzI0MTAKLQl0cmlzdGF0ZSAiTkFORCBGbGFzaCBzdXBwb3J0IGZvciBTM0MyNDEwIFNvQyIKKwl0cmlzdGF0ZSAiTkFORCBGbGFzaCBzdXBwb3J0IGZvciBTM0MyNDEwL1MzQzI0NDAgU29DIgogCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIE1URF9OQU5ECiAJaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgb24gdGhlIFMzQzI0MTAuCisJICBUaGlzIGVuYWJsZXMgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUgUzNDMjQxMCBhbmQgUzNDMjQ0MAorCSAgU29DcwogCiAJICBObyBib2FyZCBzcGVjZmljIHN1cHBvcnQgaXMgZG9uZSBieSB0aGlzIGRyaXZlciwgZWFjaCBib2FyZAogCSAgbXVzdCBhZHZlcnRpc2UgYSBwbGF0Zm9ybV9kZXZpY2UgZm9yIHRoZSBkcml2ZXIgdG8gYXR0YWNoLiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCmluZGV4IGQ5ZGM4Y2MuLjQxNzQyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQpAQCAtMTAsOCArMTAsNiBAQAogb2JqLSQoQ09ORklHX01URF9OQU5EX1RPVE8pCQkrPSB0b3RvLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9BVVRDUFUxMikJCSs9IGF1dGNwdTEyLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9FREI3MzEyKQkJKz0gZWRiNzMxMi5vCi1vYmotJChDT05GSUdfTVREX05BTkRfVFg0OTI1TkRGTUMpCSs9IHR4NDkyNW5kZm1jLm8KLW9iai0kKENPTkZJR19NVERfTkFORF9UWDQ5MzhOREZNQykJKz0gdHg0OTM4bmRmbWMubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0FVMTU1MCkJCSs9IGF1MTU1MG5kLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9QUENIQU1FTEVPTkVWQikJKz0gcHBjaGFtZWxlb25ldmIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX1MzQzI0MTApCQkrPSBzM2MyNDEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZGlza29uY2hpcC5jIGIvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMKaW5kZXggMDIxMzVjMy4uZmRiNWQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqICAKICAqIEludGVyZmFjZSB0byBnZW5lcmljIE5BTkQgY29kZSBmb3IgTS1TeXN0ZW1zIERpc2tPbkNoaXAgZGV2aWNlcwogICoKLSAqICRJZDogZGlza29uY2hpcC5jLHYgMS40NSAyMDA1LzAxLzA1IDE4OjA1OjE0IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGRpc2tvbmNoaXAuYyx2IDEuNTQgMjAwNS8wNC8wNyAxNDoyMjo1NSBkYnJvd24gRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNSwxMyArMzUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvaW5mdGwuaD4KIAogLyogV2hlcmUgdG8gbG9vayBmb3IgdGhlIGRldmljZXM/ICovCi0jaWZuZGVmIENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTCi0jZGVmaW5lIENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTIDAKKyNpZm5kZWYgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVBfUFJPQkVfQUREUkVTUworI2RlZmluZSBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTIDAKICNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGRvY19sb2NhdGlvbnNbXSA9IHsKICNpZiBkZWZpbmVkIChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLSNpZmRlZiBDT05GSUdfTVREX0RJU0tPTkNISVBfUFJPQkVfSElHSAorI2lmZGVmIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0hJR0gKIAkweGZmZmM4MDAwLCAweGZmZmNhMDAwLCAweGZmZmNjMDAwLCAweGZmZmNlMDAwLCAKIAkweGZmZmQwMDAwLCAweGZmZmQyMDAwLCAweGZmZmQ0MDAwLCAweGZmZmQ2MDAwLAogCTB4ZmZmZDgwMDAsIDB4ZmZmZGEwMDAsIDB4ZmZmZGMwMDAsIDB4ZmZmZGUwMDAsIApAQCAtODEsMTEgKzgxLDYgQEAKIAlzdHJ1Y3QgbXRkX2luZm8gKm5leHRkb2M7CiB9OwogCi0vKiBNYXggbnVtYmVyIG9mIGVyYXNlYmxvY2tzIHRvIHNjYW4gKGZyb20gc3RhcnQgb2YgZGV2aWNlKSBmb3IgdGhlIChJKU5GVEwKLSAgIE1lZGlhSGVhZGVyLiAgVGhlIHNwZWMgc2F5cyB0byBqdXN0IGtlZXAgZ29pbmcsIEkgdGhpbmssIGJ1dCB0aGF0J3MganVzdAotICAgc2lsbHkuICovCi0jZGVmaW5lIE1BWF9NRURJQUhFQURFUl9TQ0FOIDgKLQogLyogVGhpcyBpcyB0aGUgc3luZHJvbWUgY29tcHV0ZWQgYnkgdGhlIEhXIGVjYyBnZW5lcmF0b3IgdXBvbiByZWFkaW5nIGFuIGVtcHR5CiAgICBwYWdlLCBvbmUgd2l0aCBhbGwgMHhmZiBmb3IgZGF0YSBhbmQgc3RvcmVkIGVjYyBjb2RlLiAqLwogc3RhdGljIHVfY2hhciBlbXB0eV9yZWFkX3N5bmRyb21lWzZdID0geyAweDI2LCAweGZmLCAweDZkLCAweDQ3LCAweDczLCAweDdhIH07CkBAIC0xMTEsMTAgKzEwNiwxMSBAQAogc3RhdGljIGludCBub19lY2NfZmFpbHVyZXM9MDsKIG1vZHVsZV9wYXJhbShub19lY2NfZmFpbHVyZXMsIGludCwgMCk7CiAKLSNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKIHN0YXRpYyBpbnQgbm9fYXV0b3BhcnQ9MDsKIG1vZHVsZV9wYXJhbShub19hdXRvcGFydCwgaW50LCAwKTsKLSNlbmRpZgorCitzdGF0aWMgaW50IHNob3dfZmlybXdhcmVfcGFydGl0aW9uPTA7Cittb2R1bGVfcGFyYW0oc2hvd19maXJtd2FyZV9wYXJ0aXRpb24sIGludCwgMCk7CiAKICNpZmRlZiBNVERfTkFORF9ESVNLT05DSElQX0JCVFdSSVRFCiBzdGF0aWMgaW50IGluZnRsX2JidF93cml0ZT0xOwpAQCAtMTIzLDcgKzExOSw3IEBACiAjZW5kaWYKIG1vZHVsZV9wYXJhbShpbmZ0bF9iYnRfd3JpdGUsIGludCwgMCk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvY19jb25maWdfbG9jYXRpb24gPSBDT05GSUdfTVREX0RJU0tPTkNISVBfUFJPQkVfQUREUkVTUzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvY19jb25maWdfbG9jYXRpb24gPSBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTOwogbW9kdWxlX3BhcmFtKGRvY19jb25maWdfbG9jYXRpb24sIHVsb25nLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZG9jX2NvbmZpZ19sb2NhdGlvbiwgIlBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGF0IHdoaWNoIHRvIHByb2JlIGZvciBEaXNrT25DaGlwIik7CiAKQEAgLTQxMCw3ICs0MDYsMTIgQEAKIAlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVEFMRSk7CiAJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIDApOwogCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKLQorCQorCS8qIFdlIGNhbnQnIHVzZSBkZXZfcmVhZHkgaGVyZSwgYnV0IGF0IGxlYXN0IHdlIHdhaXQgZm9yIHRoZQorCSAqIGNvbW1hbmQgdG8gY29tcGxldGUgCisJICovCisJdWRlbGF5KDUwKTsKKwkKIAlyZXQgPSB0aGlzLT5yZWFkX2J5dGUobXRkKSA8PCA4OwogCXJldCB8PSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKIApAQCAtNDI5LDYgKzQzMCw4IEBACiAJCWRvYzIwMDBfd3JpdGVfYnl0ZShtdGQsIDApOwogCQlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkFMRSk7CiAKKwkJdWRlbGF5KDUwKTsKKwogCQlpZGVudC5kd29yZCA9IHJlYWRsKGRvY3B0ciArIERvQ18ya19DRFNOX0lPKTsKIAkJaWYgKCgoaWRlbnQuYnl0ZVswXSA8PCA4KSB8IGlkZW50LmJ5dGVbMV0pID09IHJldCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiRGlza09uQ2hpcCAyMDAwIHJlc3BvbmRzIHRvIERXT1JEIGFjY2Vzc1xuIik7CkBAIC0xMDQ2LDExICsxMDQ5LDIxIEBACiAJCQogLy91X2NoYXIgbXlkYXRhYnVmWzUyOF07CiAKKy8qIFRoZSBzdHJhbmdlIG91dC1vZi1vcmRlciAub29iZnJlZSBsaXN0IGJlbG93IGlzIGEgKHBvc3NpYmx5IHVubmVlZGVkKQorICogYXR0ZW1wdCB0byByZXRhaW4gY29tcGF0aWJpbGl0eS4gIEl0IHVzZWQgdG8gcmVhZDoKKyAqIAkub29iZnJlZSA9IHsgezgsIDh9IH0KKyAqIFNpbmNlIHRoYXQgbGVhdmVzIHR3byBieXRlcyB1bnVzYWJsZSwgaXQgd2FzIGNoYW5nZWQuICBCdXQgdGhlIGZvbGxvd2luZworICogc2NoZW1lIG1pZ2h0IGFmZmVjdCBleGlzdGluZyBqZmZzMiBpbnN0YWxscyBieSBtb3ZpbmcgdGhlIGNsZWFubWFya2VyOgorICogCS5vb2JmcmVlID0geyB7NiwgMTB9IH0KKyAqIGpmZnMyIHNlZW1zIHRvIGhhbmRsZSB0aGUgYWJvdmUgZ3JhY2VmdWxseSwgYnV0IHRoZSBjdXJyZW50IHNjaGVtZSBzZWVtcworICogc2FmZXIuICBUaGUgb25seSBwcm9ibGVtIHdpdGggaXQgaXMgdGhhdCBhbnkgY29kZSB0aGF0IHBhcnNlcyBvb2JmcmVlIG11c3QKKyAqIGJlIGFibGUgdG8gaGFuZGxlIG91dC1vZi1vcmRlciBzZWdtZW50cy4KKyAqLwogc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gZG9jMjAweF9vb2JpbmZvID0gewogICAgICAgICAudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAogICAgICAgICAuZWNjYnl0ZXMgPSA2LAogICAgICAgICAuZWNjcG9zID0gezAsIDEsIDIsIDMsIDQsIDV9LAotICAgICAgICAub29iZnJlZSA9IHsgezgsIDh9IH0KKyAgICAgICAgLm9vYmZyZWUgPSB7IHs4LCA4fSwgezYsIDJ9IH0KIH07CiAgCiAvKiBGaW5kIHRoZSAoSSlORlRMIE1lZGlhIEhlYWRlciwgYW5kIG9wdGlvbmFsbHkgYWxzbyB0aGUgbWlycm9yIG1lZGlhIGhlYWRlci4KQEAgLTEwNjQsMTIgKzEwNzcsMTEgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKLQl1bnNpZ25lZCBvZmZzLCBlbmQgPSAoTUFYX01FRElBSEVBREVSX1NDQU4gPDwgdGhpcy0+cGh5c19lcmFzZV9zaGlmdCk7CisJdW5zaWduZWQgb2ZmczsKIAlpbnQgcmV0OwogCXNpemVfdCByZXRsZW47CiAKLQllbmQgPSBtaW4oZW5kLCBtdGQtPnNpemUpOyAvLyBwYXJhbm9pYQotCWZvciAob2ZmcyA9IDA7IG9mZnMgPCBlbmQ7IG9mZnMgKz0gbXRkLT5lcmFzZXNpemUpIHsKKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbXRkLT5zaXplOyBvZmZzICs9IG10ZC0+ZXJhc2VzaXplKSB7CiAJCXJldCA9IG10ZC0+cmVhZChtdGQsIG9mZnMsIG10ZC0+b29iYmxvY2ssICZyZXRsZW4sIGJ1Zik7CiAJCWlmIChyZXRsZW4gIT0gbXRkLT5vb2JibG9jaykgY29udGludWU7CiAJCWlmIChyZXQpIHsKQEAgLTExMTEsNiArMTEyMyw3IEBACiAJdV9jaGFyICpidWY7CiAJc3RydWN0IE5GVExNZWRpYUhlYWRlciAqbWg7CiAJY29uc3QgdW5zaWduZWQgcHNpemUgPSAxIDw8IHRoaXMtPnBhZ2Vfc2hpZnQ7CisJaW50IG51bXBhcnRzID0gMDsKIAl1bnNpZ25lZCBibG9ja3MsIG1heGJsb2NrczsKIAlpbnQgb2ZmcywgbnVtaGVhZGVyczsKIApAQCAtMTEyMiw4ICsxMTM1LDEwIEBACiAJaWYgKCEobnVtaGVhZGVycz1maW5kX21lZGlhX2hlYWRlcnMobXRkLCBidWYsICJBTkFORCIsIDEpKSkgZ290byBvdXQ7CiAJbWggPSAoc3RydWN0IE5GVExNZWRpYUhlYWRlciAqKSBidWY7CiAKLS8vI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotLy8JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQorCW1oLT5OdW1FcmFzZVVuaXRzID0gbGUxNl90b19jcHUobWgtPk51bUVyYXNlVW5pdHMpOworCW1oLT5GaXJzdFBoeXNpY2FsRVVOID0gbGUxNl90b19jcHUobWgtPkZpcnN0UGh5c2ljYWxFVU4pOworCW1oLT5Gb3JtYXR0ZWRTaXplID0gbGUzMl90b19jcHUobWgtPkZvcm1hdHRlZFNpemUpOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiICAgIERhdGFPcmdJRCAgICAgICAgPSAlc1xuIgogCQkJICIgICAgTnVtRXJhc2VVbml0cyAgICA9ICVkXG4iCiAJCQkgIiAgICBGaXJzdFBoeXNpY2FsRVVOID0gJWRcbiIKQEAgLTExMzIsNyArMTE0Nyw2IEBACiAJCW1oLT5EYXRhT3JnSUQsIG1oLT5OdW1FcmFzZVVuaXRzLAogCQltaC0+Rmlyc3RQaHlzaWNhbEVVTiwgbWgtPkZvcm1hdHRlZFNpemUsCiAJCW1oLT5Vbml0U2l6ZUZhY3Rvcik7Ci0vLyNlbmRpZgogCiAJYmxvY2tzID0gbXRkLT5zaXplID4+IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQ7CiAJbWF4YmxvY2tzID0gbWluKDMyNzY4VSwgbXRkLT5lcmFzZXNpemUgLSBwc2l6ZSk7CkBAIC0xMTc1LDIzICsxMTg5LDI4IEBACiAJb2ZmcyA8PD0gdGhpcy0+cGFnZV9zaGlmdDsKIAlvZmZzICs9IG10ZC0+ZXJhc2VzaXplOwogCi0JLy9wYXJ0c1swXS5uYW1lID0gIiBEaXNrT25DaGlwIEJvb3QgLyBNZWRpYSBIZWFkZXIgcGFydGl0aW9uIjsKLQkvL3BhcnRzWzBdLm9mZnNldCA9IDA7Ci0JLy9wYXJ0c1swXS5zaXplID0gb2ZmczsKLQotCXBhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgQkRUTCBwYXJ0aXRpb24iOwotCXBhcnRzWzBdLm9mZnNldCA9IG9mZnM7Ci0JcGFydHNbMF0uc2l6ZSA9IChtaC0+TnVtRXJhc2VVbml0cyAtIG51bWhlYWRlcnMpIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKLQotCW9mZnMgKz0gcGFydHNbMF0uc2l6ZTsKLQlpZiAob2ZmcyA8IG10ZC0+c2l6ZSkgewotCQlwYXJ0c1sxXS5uYW1lID0gIiBEaXNrT25DaGlwIFJlbWFpbmRlciBwYXJ0aXRpb24iOwotCQlwYXJ0c1sxXS5vZmZzZXQgPSBvZmZzOwotCQlwYXJ0c1sxXS5zaXplID0gbXRkLT5zaXplIC0gb2ZmczsKLQkJcmV0ID0gMjsKLQkJZ290byBvdXQ7CisJaWYgKHNob3dfZmlybXdhcmVfcGFydGl0aW9uID09IDEpIHsKKwkJcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBGaXJtd2FyZSAvIE1lZGlhIEhlYWRlciBwYXJ0aXRpb24iOworCQlwYXJ0c1swXS5vZmZzZXQgPSAwOworCQlwYXJ0c1swXS5zaXplID0gb2ZmczsKKwkJbnVtcGFydHMgPSAxOwogCX0KLQlyZXQgPSAxOworCisJcGFydHNbbnVtcGFydHNdLm5hbWUgPSAiIERpc2tPbkNoaXAgQkRUTCBwYXJ0aXRpb24iOworCXBhcnRzW251bXBhcnRzXS5vZmZzZXQgPSBvZmZzOworCXBhcnRzW251bXBhcnRzXS5zaXplID0gKG1oLT5OdW1FcmFzZVVuaXRzIC0gbnVtaGVhZGVycykgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OworCisJb2ZmcyArPSBwYXJ0c1tudW1wYXJ0c10uc2l6ZTsKKwludW1wYXJ0cysrOworCisJaWYgKG9mZnMgPCBtdGQtPnNpemUpIHsKKwkJcGFydHNbbnVtcGFydHNdLm5hbWUgPSAiIERpc2tPbkNoaXAgUmVtYWluZGVyIHBhcnRpdGlvbiI7CisJCXBhcnRzW251bXBhcnRzXS5vZmZzZXQgPSBvZmZzOworCQlwYXJ0c1tudW1wYXJ0c10uc2l6ZSA9IG10ZC0+c2l6ZSAtIG9mZnM7CisJCW51bXBhcnRzKys7CisJfQorCisJcmV0ID0gbnVtcGFydHM7CiBvdXQ6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTIzMyw4ICsxMjUyLDYgQEAKIAltaC0+Rm9ybWF0RmxhZ3MgPSBsZTMyX3RvX2NwdShtaC0+Rm9ybWF0RmxhZ3MpOwogCW1oLT5QZXJjZW50VXNlZCA9IGxlMzJfdG9fY3B1KG1oLT5QZXJjZW50VXNlZCk7CiAgCi0vLyNpZmRlZiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UKLS8vCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikKIAlwcmludGsoS0VSTl9JTkZPICIgICAgYm9vdFJlY29yZElEICAgICAgICAgID0gJXNcbiIKIAkJCSAiICAgIE5vT2ZCb290SW1hZ2VCbG9ja3MgICA9ICVkXG4iCiAJCQkgIiAgICBOb09mQmluYXJ5UGFydGl0aW9ucyAgPSAlZFxuIgpAQCAtMTI1Miw3ICsxMjY5LDYgQEAKIAkJKCh1bnNpZ25lZCBjaGFyICopICZtaC0+T3Nha1ZlcnNpb24pWzJdICYgMHhmLAogCQkoKHVuc2lnbmVkIGNoYXIgKikgJm1oLT5Pc2FrVmVyc2lvbilbM10gJiAweGYsCiAJCW1oLT5QZXJjZW50VXNlZCk7Ci0vLyNlbmRpZgogCiAJdnNoaWZ0ID0gdGhpcy0+cGh5c19lcmFzZV9zaGlmdCArIG1oLT5CbG9ja011bHRpcGxpZXJCaXRzOwogCkBAIC0xMjc4LDggKzEyOTQsNiBAQAogCQlpcC0+c3BhcmVVbml0cyA9IGxlMzJfdG9fY3B1KGlwLT5zcGFyZVVuaXRzKTsKIAkJaXAtPlJlc2VydmVkMCA9IGxlMzJfdG9fY3B1KGlwLT5SZXNlcnZlZDApOwogCi0vLyNpZmRlZiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UKLS8vCQlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpCiAJCXByaW50ayhLRVJOX0lORk8JIiAgICBQQVJUSVRJT05bJWRdIC0+XG4iCiAJCQkiICAgICAgICB2aXJ0dWFsVW5pdHMgICAgPSAlZFxuIgogCQkJIiAgICAgICAgZmlyc3RVbml0ICAgICAgID0gJWRcbiIKQEAgLTEyODksMTYgKzEzMDMsMTQgQEAKIAkJCWksIGlwLT52aXJ0dWFsVW5pdHMsIGlwLT5maXJzdFVuaXQsCiAJCQlpcC0+bGFzdFVuaXQsIGlwLT5mbGFncywKIAkJCWlwLT5zcGFyZVVuaXRzKTsKLS8vI2VuZGlmCiAKLS8qCi0JCWlmICgoaSA9PSAwKSAmJiAoaXAtPmZpcnN0VW5pdCA+IDApKSB7CisJCWlmICgoc2hvd19maXJtd2FyZV9wYXJ0aXRpb24gPT0gMSkgJiYKKwkJICAgIChpID09IDApICYmIChpcC0+Zmlyc3RVbml0ID4gMCkpIHsKIAkJCXBhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgSVBMIC8gTWVkaWEgSGVhZGVyIHBhcnRpdGlvbiI7CiAJCQlwYXJ0c1swXS5vZmZzZXQgPSAwOwogCQkJcGFydHNbMF0uc2l6ZSA9IG10ZC0+ZXJhc2VzaXplICogaXAtPmZpcnN0VW5pdDsKIAkJCW51bXBhcnRzID0gMTsKIAkJfQotKi8KIAogCQlpZiAoaXAtPmZsYWdzICYgSU5GVExfQklOQVJZKQogCQkJcGFydHNbbnVtcGFydHNdLm5hbWUgPSAiIERpc2tPbkNoaXAgQkRLIHBhcnRpdGlvbiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCA0NGQ1YjEyLi5lZWU1MTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKQEAgLTI4LDYgKzI4LDI0IEBACiAgKgkJYW1vbmcgbXVsdGlwbGUgaW5kZXBlbmRlbmQgZGV2aWNlcy4gU3VnZ2VzdGlvbnMgYW5kIGluaXRpYWwgcGF0Y2gKICAqCQlmcm9tIEJlbiBEb29rcyA8YmVuLW10ZEBmbHVmZi5vcmc+CiAgKgorICogIDEyLTA1LTIwMDQJZG1hcmxpbjogYWRkIHdvcmthcm91bmQgZm9yIFJlbmVzYXMgQUctQU5EIGNoaXBzICJkaXN0dXJiIiBpc3N1ZS4KKyAqCQlCYXNpY2FsbHksIGFueSBibG9jayBub3QgcmV3cml0dGVuIG1heSBsb3NlIGRhdGEgd2hlbiBzdXJyb3VuZGluZyBibG9ja3MKKyAqCQlhcmUgcmV3cml0dGVuIG1hbnkgdGltZXMuICBKRkZTMiBlbnN1cmVzIHRoaXMgZG9lc24ndCBoYXBwZW4gZm9yIGJsb2NrcyAKKyAqCQlpdCB1c2VzLCBidXQgdGhlIEJhZCBCbG9jayBUYWJsZShzKSBtYXkgbm90IGJlIHJld3JpdHRlbi4gIFRvIGVuc3VyZSB0aGV5CisgKgkJZG8gbm90IGxvc2UgZGF0YSwgZm9yY2UgdGhlbSB0byBiZSByZXdyaXR0ZW4gd2hlbiBzb21lIG9mIHRoZSBzdXJyb3VuZGluZworICoJCWJsb2NrcyBhcmUgZXJhc2VkLiAgUmF0aGVyIHRoYW4gdHJhY2tpbmcgYSBzcGVjaWZpYyBuZWFyYnkgYmxvY2sgKHdoaWNoIAorICoJCWNvdWxkIGl0c2VsZiBnbyBiYWQpLCB1c2UgYSBwYWdlIGFkZHJlc3MgJ21hc2snIHRvIHNlbGVjdCBzZXZlcmFsIGJsb2NrcyAKKyAqCQlpbiB0aGUgc2FtZSBhcmVhLCBhbmQgcmV3cml0ZSB0aGUgQkJUIHdoZW4gYW55IG9mIHRoZW0gYXJlIGVyYXNlZC4KKyAqCisgKiAgMDEtMDMtMjAwNQlkbWFybGluOiBhZGRlZCBzdXBwb3J0IGZvciB0aGUgZGV2aWNlIHJlY292ZXJ5IGNvbW1hbmQgc2VxdWVuY2UgZm9yIFJlbmVzYXMgCisgKgkJQUctQU5EIGNoaXBzLiAgSWYgdGhlcmUgd2FzIGEgc3VkZGVuIGxvc3Mgb2YgcG93ZXIgZHVyaW5nIGFuIGVyYXNlIG9wZXJhdGlvbiwKKyAqIAkJYSAiZGV2aWNlIHJlY292ZXJ5IiBvcGVyYXRpb24gbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiBwb3dlciBpcyByZXN0b3JlZAorICogCQl0byBlbnN1cmUgY29ycmVjdCBvcGVyYXRpb24uCisgKgorICogIDAxLTIwLTIwMDUJZG1hcmxpbjogYWRkZWQgc3VwcG9ydCBmb3Igb3B0aW9uYWwgaGFyZHdhcmUgc3BlY2lmaWMgY2FsbGJhY2sgcm91dGluZSB0byAKKyAqCQlwZXJmb3JtIGV4dHJhIGVycm9yIHN0YXR1cyBjaGVja3Mgb24gZXJhc2UgYW5kIHdyaXRlIGZhaWx1cmVzLiAgVGhpcyByZXF1aXJlZAorICoJCWFkZGluZyBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIG5hbmRfcmVhZF9lY2MuCisgKgogICogQ3JlZGl0czoKICAqCURhdmlkIFdvb2Rob3VzZSBmb3IgYWRkaW5nIG11bHRpY2hpcCBzdXBwb3J0ICAKICAqCQpAQCAtNDEsNyArNTksNyBAQAogICoJVGhlIEFHLUFORCBjaGlwcyBoYXZlIG5pY2UgZmVhdHVyZXMgZm9yIHNwZWVkIGltcHJvdmVtZW50LAogICoJd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LiBSZWFkIC8gcHJvZ3JhbSA0IHBhZ2VzIGluIG9uZSBnby4KICAqCi0gKiAkSWQ6IG5hbmRfYmFzZS5jLHYgMS4xMjYgMjAwNC8xMi8xMyAxMToyMjoyNSBsYXZpbmVuIEV4cCAkCisgKiAkSWQ6IG5hbmRfYmFzZS5jLHYgMS4xNDcgMjAwNS8wNy8xNSAwNzoxODowNiBnbGVpeG5lciBFeHAgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTQ5LDE3ICsxNjcsMjEgQEAKIAogCS8qIERlLXNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KIAl0aGlzLT5zZWxlY3RfY2hpcChtdGQsIC0xKTsKLQkvKiBEbyB3ZSBoYXZlIGEgaGFyZHdhcmUgY29udHJvbGxlciA/ICovCisKIAlpZiAodGhpcy0+Y29udHJvbGxlcikgeworCQkvKiBSZWxlYXNlIHRoZSBjb250cm9sbGVyIGFuZCB0aGUgY2hpcCAqLwogCQlzcGluX2xvY2soJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOwogCQl0aGlzLT5jb250cm9sbGVyLT5hY3RpdmUgPSBOVUxMOworCQl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOworCQl3YWtlX3VwKCZ0aGlzLT5jb250cm9sbGVyLT53cSk7CiAJCXNwaW5fdW5sb2NrKCZ0aGlzLT5jb250cm9sbGVyLT5sb2NrKTsKKwl9IGVsc2UgeworCQkvKiBSZWxlYXNlIHRoZSBjaGlwICovCisJCXNwaW5fbG9jaygmdGhpcy0+Y2hpcF9sb2NrKTsKKwkJdGhpcy0+c3RhdGUgPSBGTF9SRUFEWTsKKwkJd2FrZV91cCgmdGhpcy0+d3EpOworCQlzcGluX3VubG9jaygmdGhpcy0+Y2hpcF9sb2NrKTsKIAl9Ci0JLyogUmVsZWFzZSB0aGUgY2hpcCAqLwotCXNwaW5fbG9jayAoJnRoaXMtPmNoaXBfbG9jayk7Ci0JdGhpcy0+c3RhdGUgPSBGTF9SRUFEWTsKLQl3YWtlX3VwICgmdGhpcy0+d3EpOwotCXNwaW5fdW5sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKIH0KIAogLyoqCkBAIC00NDMsNyArNDY1LDggQEAKIAkKIAkvKiBHZXQgYmxvY2sgbnVtYmVyICovCiAJYmxvY2sgPSAoKGludCkgb2ZzKSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7Ci0JdGhpcy0+YmJ0W2Jsb2NrID4+IDJdIHw9IDB4MDEgPDwgKChibG9jayAmIDB4MDMpIDw8IDEpOworCWlmICh0aGlzLT5iYnQpCisJCXRoaXMtPmJidFtibG9jayA+PiAyXSB8PSAweDAxIDw8ICgoYmxvY2sgJiAweDAzKSA8PCAxKTsKIAogCS8qIERvIHdlIGhhdmUgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgPyAqLwogCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKQpAQCAtNDY2LDcgKzQ4OSw3IEBACiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKIAkvKiBDaGVjayB0aGUgV1AgYml0ICovCiAJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9TVEFUVVMsIC0xLCAtMSk7Ci0JcmV0dXJuICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIDB4ODApID8gMCA6IDE7IAorCXJldHVybiAodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiBOQU5EX1NUQVRVU19XUCkgPyAwIDogMTsgCiB9CiAKIC8qKgpAQCAtNDkwLDYgKzUxMywyMiBAQAogCXJldHVybiBuYW5kX2lzYmFkX2JidCAobXRkLCBvZnMsIGFsbG93YmJ0KTsKIH0KIAorLyogCisgKiBXYWl0IGZvciB0aGUgcmVhZHkgcGluLCBhZnRlciBhIGNvbW1hbmQKKyAqIFRoZSB0aW1lb3V0IGlzIGNhdGNoZWQgbGF0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfd2FpdF9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVuc2lnbmVkIGxvbmcJdGltZW8gPSBqaWZmaWVzICsgMjsKKworCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgb3IgdGltZW91dCBvY2N1cmVzICovCisJZG8geworCQlpZiAodGhpcy0+ZGV2X3JlYWR5KG10ZCkpCisJCQlyZXR1cm47CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW8pKTsJCit9CisKIC8qKgogICogbmFuZF9jb21tYW5kIC0gW0RFRkFVTFRdIFNlbmQgY29tbWFuZCB0byBOQU5EIGRldmljZQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTU3MSw3ICs2MTAsNyBAQAogCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwogCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKIAkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOworCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiBOQU5EX1NUQVRVU19SRUFEWSkpOwogCQlyZXR1cm47CiAKIAkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLwkKQEAgLTU4NSwxMiArNjI0LDExIEBACiAJCQlyZXR1cm47CiAJCX0JCiAJfQotCQogCS8qIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluCiAJICogYW55IGNhc2Ugb24gYW55IG1hY2hpbmUuICovCiAJbmRlbGF5ICgxMDApOwotCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgKi8KLQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKKworCW5hbmRfd2FpdF9yZWFkeShtdGQpOwogfQogCiAvKioKQEAgLTYxOSw3ICs2NTcsNyBAQAogCS8qIEJlZ2luIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KIAl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwogCS8qIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLiAqLwotCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb21tYW5kKTsKKwl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKGNvbW1hbmQgJiAweGZmKSk7CiAJLyogRW5kIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KIAl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwogCkBAIC02NDcsOCArNjg1LDggQEAKIAkKIAkvKiAKIAkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzIAotCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQotCSovCisJICogc3RhdHVzLCBzZXF1ZW50aWFsIGluLCBhbmQgZGVwbGV0ZTEgbmVlZCBubyBkZWxheQorCSAqLwogCXN3aXRjaCAoY29tbWFuZCkgewogCQkJCiAJY2FzZSBOQU5EX0NNRF9DQUNIRURQUk9HOgpAQCAtNjU3LDggKzY5NSwxOSBAQAogCWNhc2UgTkFORF9DTURfRVJBU0UyOgogCWNhc2UgTkFORF9DTURfU0VRSU46CiAJY2FzZSBOQU5EX0NNRF9TVEFUVVM6CisJY2FzZSBOQU5EX0NNRF9ERVBMRVRFMToKIAkJcmV0dXJuOwogCisJLyogCisJICogcmVhZCBlcnJvciBzdGF0dXMgY29tbWFuZHMgcmVxdWlyZSBvbmx5IGEgc2hvcnQgZGVsYXkKKwkgKi8KKwljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjoKKwljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjA6CisJY2FzZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IxOgorCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMjoKKwljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjM6CisJCXVkZWxheSh0aGlzLT5jaGlwX2RlbGF5KTsKKwkJcmV0dXJuOwogCiAJY2FzZSBOQU5EX0NNRF9SRVNFVDoKIAkJaWYgKHRoaXMtPmRldl9yZWFkeSkJCkBAIC02NjcsNyArNzE2LDcgQEAKIAkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQ0xFKTsKIAkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIE5BTkRfQ01EX1NUQVRVUyk7CiAJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7Ci0JCXdoaWxlICggISh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIDB4NDApKTsKKwkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgTkFORF9TVEFUVVNfUkVBRFkpKTsKIAkJcmV0dXJuOwogCiAJY2FzZSBOQU5EX0NNRF9SRUFEMDoKQEAgLTY5MCwxMiArNzM5LDEyIEBACiAJCQlyZXR1cm47CiAJCX0JCiAJfQotCQorCiAJLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KIAkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KIAluZGVsYXkgKDEwMCk7Ci0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiB9CiAKIC8qKgpAQCAtNzA4LDM3ICs3NTcsMzQgQEAKICAqLwogc3RhdGljIHZvaWQgbmFuZF9nZXRfZGV2aWNlIChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG5ld19zdGF0ZSkKIHsKLQlzdHJ1Y3QgbmFuZF9jaGlwICphY3RpdmUgPSB0aGlzOwotCisJc3RydWN0IG5hbmRfY2hpcCAqYWN0aXZlOworCXNwaW5sb2NrX3QgKmxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxOwogCURFQ0xBUkVfV0FJVFFVRVVFICh3YWl0LCBjdXJyZW50KTsKIAotCS8qIAotCSAqIEdyYWIgdGhlIGxvY2sgYW5kIHNlZSBpZiB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZSAKLQkqLworCWxvY2sgPSAodGhpcy0+Y29udHJvbGxlcikgPyAmdGhpcy0+Y29udHJvbGxlci0+bG9jayA6ICZ0aGlzLT5jaGlwX2xvY2s7CisJd3EgPSAodGhpcy0+Y29udHJvbGxlcikgPyAmdGhpcy0+Y29udHJvbGxlci0+d3EgOiAmdGhpcy0+d3E7CiByZXRyeToKKwlhY3RpdmUgPSB0aGlzOworCXNwaW5fbG9jayhsb2NrKTsKKwogCS8qIEhhcmR3YXJlIGNvbnRyb2xsZXIgc2hhcmVkIGFtb25nIGluZGVwZW5kZW5kIGRldmljZXMgKi8KIAlpZiAodGhpcy0+Y29udHJvbGxlcikgewotCQlzcGluX2xvY2sgKCZ0aGlzLT5jb250cm9sbGVyLT5sb2NrKTsKIAkJaWYgKHRoaXMtPmNvbnRyb2xsZXItPmFjdGl2ZSkKIAkJCWFjdGl2ZSA9IHRoaXMtPmNvbnRyb2xsZXItPmFjdGl2ZTsKIAkJZWxzZQogCQkJdGhpcy0+Y29udHJvbGxlci0+YWN0aXZlID0gdGhpczsKLQkJc3Bpbl91bmxvY2sgKCZ0aGlzLT5jb250cm9sbGVyLT5sb2NrKTsKIAl9Ci0JCi0JaWYgKGFjdGl2ZSA9PSB0aGlzKSB7Ci0JCXNwaW5fbG9jayAoJnRoaXMtPmNoaXBfbG9jayk7Ci0JCWlmICh0aGlzLT5zdGF0ZSA9PSBGTF9SRUFEWSkgewotCQkJdGhpcy0+c3RhdGUgPSBuZXdfc3RhdGU7Ci0JCQlzcGluX3VubG9jayAoJnRoaXMtPmNoaXBfbG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CQotCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUgKCZhY3RpdmUtPndxLCAmd2FpdCk7Ci0Jc3Bpbl91bmxvY2sgKCZhY3RpdmUtPmNoaXBfbG9jayk7Ci0Jc2NoZWR1bGUgKCk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUgKCZhY3RpdmUtPndxLCAmd2FpdCk7CisJaWYgKGFjdGl2ZSA9PSB0aGlzICYmIHRoaXMtPnN0YXRlID09IEZMX1JFQURZKSB7CisJCXRoaXMtPnN0YXRlID0gbmV3X3N0YXRlOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJcmV0dXJuOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUod3EsICZ3YWl0KTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlzY2hlZHVsZSgpOworCXJlbW92ZV93YWl0X3F1ZXVlKHdxLCAmd2FpdCk7CiAJZ290byByZXRyeTsKIH0KIApAQCAtNzg1LDcgKzgzMSw3IEBACiAJCQlpZiAodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiBOQU5EX1NUQVRVU19SRUFEWSkKIAkJCQlicmVhazsKIAkJfQotCQl5aWVsZCAoKTsKKwkJY29uZF9yZXNjaGVkKCk7CiAJfQogCXN0YXR1cyA9IChpbnQpIHRoaXMtPnJlYWRfYnl0ZShtdGQpOwogCXJldHVybiBzdGF0dXM7CkBAIC04NzEsOCArOTE3LDE0IEBACiAJaWYgKCFjYWNoZWQpIHsKIAkJLyogY2FsbCB3YWl0IHJlYWR5IGZ1bmN0aW9uICovCiAJCXN0YXR1cyA9IHRoaXMtPndhaXRmdW5jIChtdGQsIHRoaXMsIEZMX1dSSVRJTkcpOworCisJCS8qIFNlZSBpZiBvcGVyYXRpb24gZmFpbGVkIGFuZCBhZGRpdGlvbmFsIHN0YXR1cyBjaGVja3MgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAoKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpICYmICh0aGlzLT5lcnJzdGF0KSkgeworCQkJc3RhdHVzID0gdGhpcy0+ZXJyc3RhdChtdGQsIHRoaXMsIEZMX1dSSVRJTkcsIHN0YXR1cywgcGFnZSk7CisJCX0KKwogCQkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDEpIHsKKwkJaWYgKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpIHsKIAkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAiJXM6ICIgIkZhaWxlZCB3cml0ZSwgcGFnZSAweCUwOHgsICIsIF9fRlVOQ1RJT05fXywgcGFnZSk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtOTc1LDcgKzEwMjcsNyBAQAogCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgCiAJCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwogCQllbHNlCi0JCQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsJCisJCQluYW5kX3dhaXRfcmVhZHkobXRkKTsKIAogCQkvKiBBbGwgZG9uZSwgcmV0dXJuIGhhcHB5ICovCiAJCWlmICghbnVtcGFnZXMpCkBAIC05OTcsMjMgKzEwNDksMjQgQEAKICNlbmRpZgogCiAvKioKLSAqIG5hbmRfcmVhZCAtIFtNVEQgSW50ZXJmYWNlXSBNVEQgY29tcGFiaWxpdHkgZnVuY3Rpb24gZm9yIG5hbmRfcmVhZF9lY2MKKyAqIG5hbmRfcmVhZCAtIFtNVEQgSW50ZXJmYWNlXSBNVEQgY29tcGFiaWxpdHkgZnVuY3Rpb24gZm9yIG5hbmRfZG9fcmVhZF9lY2MKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQogICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICAqIEByZXRsZW46CXBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzCiAgKiBAYnVmOgl0aGUgZGF0YWJ1ZmZlciB0byBwdXQgZGF0YQogICoKLSAqIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIG5hbmRfcmVhZF9lY2Mgd2l0aCBvb2IgYnVmZmVyIGFuZCBvb2JzZWwgPSBOVUxMCi0qLworICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9kb19yZWFkX2VjYyB3aXRoIG9vYiBidWZmZXIgYW5kIG9vYnNlbCA9IE5VTEwKKyAqIGFuZCBmbGFncyA9IDB4ZmYKKyAqLwogc3RhdGljIGludCBuYW5kX3JlYWQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCiB7Ci0JcmV0dXJuIG5hbmRfcmVhZF9lY2MgKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgTlVMTCk7Ci19CQkJICAgCisJcmV0dXJuIG5hbmRfZG9fcmVhZF9lY2MgKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgJm10ZC0+b29iaW5mbywgMHhmZik7Cit9CiAKIAogLyoqCi0gKiBuYW5kX3JlYWRfZWNjIC0gW01URCBJbnRlcmZhY2VdIFJlYWQgZGF0YSB3aXRoIEVDQworICogbmFuZF9yZWFkX2VjYyAtIFtNVEQgSW50ZXJmYWNlXSBNVEQgY29tcGFiaWxpdHkgZnVuY3Rpb24gZm9yIG5hbmRfZG9fcmVhZF9lY2MKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQogICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKQEAgLTEwMjIsMTEgKzEwNzUsMzkgQEAKICAqIEBvb2JfYnVmOglmaWxlc3lzdGVtIHN1cHBsaWVkIG9vYiBkYXRhIGJ1ZmZlcgogICogQG9vYnNlbDoJb29iIHNlbGVjdGlvbiBzdHJ1Y3R1cmUKICAqCi0gKiBOQU5EIHJlYWQgd2l0aCBFQ0MKKyAqIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIG5hbmRfZG9fcmVhZF9lY2Mgd2l0aCBmbGFncyA9IDB4ZmYKICAqLwogc3RhdGljIGludCBuYW5kX3JlYWRfZWNjIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCiAJCQkgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBvb2JfYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpCiB7CisJLyogdXNlIHVzZXJzcGFjZSBzdXBwbGllZCBvb2JpbmZvLCBpZiB6ZXJvICovCisJaWYgKG9vYnNlbCA9PSBOVUxMKQorCQlvb2JzZWwgPSAmbXRkLT5vb2JpbmZvOworCXJldHVybiBuYW5kX2RvX3JlYWRfZWNjKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sIGJ1Ziwgb29iX2J1Ziwgb29ic2VsLCAweGZmKTsKK30KKworCisvKioKKyAqIG5hbmRfZG9fcmVhZF9lY2MgLSBbTVREIEludGVyZmFjZV0gUmVhZCBkYXRhIHdpdGggRUNDCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcworICogQGJ1ZjoJdGhlIGRhdGFidWZmZXIgdG8gcHV0IGRhdGEKKyAqIEBvb2JfYnVmOglmaWxlc3lzdGVtIHN1cHBsaWVkIG9vYiBkYXRhIGJ1ZmZlciAoY2FuIGJlIE5VTEwpCisgKiBAb29ic2VsOglvb2Igc2VsZWN0aW9uIHN0cnVjdHVyZQorICogQGZsYWdzOglmbGFnIHRvIGluZGljYXRlIGlmIG5hbmRfZ2V0X2RldmljZS9uYW5kX3JlbGVhc2VfZGV2aWNlIHNob3VsZCBiZSBwcmVmb3JtZWQKKyAqCQlhbmQgaG93IG1hbnkgY29ycmVjdGVkIGVycm9yIGJpdHMgYXJlIGFjY2VwdGFibGU6CisgKgkJICBiaXRzIDAuLjcgLSBudW1iZXIgb2YgdG9sZXJhYmxlIGVycm9ycworICoJCSAgYml0ICA4ICAgIC0gMCA9PSBkbyBub3QgZ2V0L3JlbGVhc2UgY2hpcCwgMSA9PSBnZXQvcmVsZWFzZSBjaGlwCisgKgorICogTkFORCByZWFkIHdpdGggRUNDCisgKi8KK2ludCBuYW5kX2RvX3JlYWRfZWNjIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQkgICAgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBvb2JfYnVmLCAKKwkJCSAgICAgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsLCBpbnQgZmxhZ3MpCit7CisKIAlpbnQgaSwgaiwgY29sLCByZWFscGFnZSwgcGFnZSwgZW5kLCBlY2MsIGNoaXBuciwgc25kY21kID0gMTsKIAlpbnQgcmVhZCA9IDAsIG9vYiA9IDAsIGVjY19zdGF0dXMgPSAwLCBlY2NfZmFpbGVkID0gMDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwpAQCAtMTA1MSwxMiArMTEzMiw5IEBACiAJfQogCiAJLyogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlICovCi0JbmFuZF9nZXRfZGV2aWNlICh0aGlzLCBtdGQgLEZMX1JFQURJTkcpOworCWlmIChmbGFncyAmIE5BTkRfR0VUX0RFVklDRSkKKwkJbmFuZF9nZXRfZGV2aWNlICh0aGlzLCBtdGQsIEZMX1JFQURJTkcpOwogCi0JLyogdXNlIHVzZXJzcGFjZSBzdXBwbGllZCBvb2JpbmZvLCBpZiB6ZXJvICovCi0JaWYgKG9vYnNlbCA9PSBOVUxMKQotCQlvb2JzZWwgPSAmbXRkLT5vb2JpbmZvOwotCQogCS8qIEF1dG9wbGFjZSBvZiBvb2IgZGF0YSA/IFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lICovCiAJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkKIAkJb29ic2VsID0gdGhpcy0+YXV0b29vYjsKQEAgLTExMTgsNyArMTE5Niw4IEBACiAJCX0JCiAKIAkJLyogZ2V0IG9vYiBhcmVhLCBpZiB3ZSBoYXZlIG5vIG9vYiBidWZmZXIgZnJvbSBmcy1kcml2ZXIgKi8KLQkJaWYgKCFvb2JfYnVmIHx8IG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkKKwkJaWYgKCFvb2JfYnVmIHx8IG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSB8fAorCQkJb29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKIAkJCW9vYl9kYXRhID0gJnRoaXMtPmRhdGFfYnVmW2VuZF07CiAKIAkJZWNjc3RlcHMgPSB0aGlzLT5lY2NzdGVwczsKQEAgLTExNTUsNyArMTIzNCw4IEBACiAJCQkJCS8qIFdlIGNhbGMgZXJyb3IgY29ycmVjdGlvbiBkaXJlY3RseSwgaXQgY2hlY2tzIHRoZSBodwogCQkJCQkgKiBnZW5lcmF0b3IgZm9yIGFuIGVycm9yLCByZWFkcyBiYWNrIHRoZSBzeW5kcm9tZSBhbmQKIAkJCQkJICogZG9lcyB0aGUgZXJyb3IgY29ycmVjdGlvbiBvbiB0aGUgZmx5ICovCi0JCQkJCWlmICh0aGlzLT5jb3JyZWN0X2RhdGEobXRkLCAmZGF0YV9wb2lbZGF0aWR4XSwgJm9vYl9kYXRhW2ldLCAmZWNjX2NvZGVbaV0pID09IC0xKSB7CisJCQkJCWVjY19zdGF0dXMgPSB0aGlzLT5jb3JyZWN0X2RhdGEobXRkLCAmZGF0YV9wb2lbZGF0aWR4XSwgJm9vYl9kYXRhW2ldLCAmZWNjX2NvZGVbaV0pOworCQkJCQlpZiAoKGVjY19zdGF0dXMgPT0gLTEpIHx8IChlY2Nfc3RhdHVzID4gKGZsYWdzICYmIDB4ZmYpKSkgewogCQkJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3JlYWRfZWNjOiAiIAogCQkJCQkJCSJGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4IG9uIGNoaXAgJWRcbiIsIHBhZ2UsIGNoaXBucik7CiAJCQkJCQllY2NfZmFpbGVkKys7CkBAIC0xMTk0LDcgKzEyNzQsNyBAQAogCQkJCXBbaV0gPSBlY2Nfc3RhdHVzOwogCQkJfQogCQkJCi0JCQlpZiAoZWNjX3N0YXR1cyA9PSAtMSkgewkKKwkJCWlmICgoZWNjX3N0YXR1cyA9PSAtMSkgfHwgKGVjY19zdGF0dXMgPiAoZmxhZ3MgJiYgMHhmZikpKSB7CQogCQkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAibmFuZF9yZWFkX2VjYzogIiAiRmFpbGVkIEVDQyByZWFkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZSk7CiAJCQkJZWNjX2ZhaWxlZCsrOwogCQkJfQpAQCAtMTIwNiwxNCArMTI4NiwxNCBAQAogCQkJLyogd2l0aG91dCBhdXRvcGxhY2UuIExlZ2FjeSBtb2RlIHVzZWQgYnkgWUFGRlMxICovCiAJCQlzd2l0Y2gob29ic2VsLT51c2VlY2MpIHsKIAkJCWNhc2UgTVREX05BTkRFQ0NfQVVUT1BMQUNFOgorCQkJY2FzZSBNVERfTkFOREVDQ19BVVRPUExfVVNSOgogCQkJCS8qIFdhbGsgdGhyb3VnaCB0aGUgYXV0b3BsYWNlIGNodW5rcyAqLwotCQkJCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgbXRkLT5vb2JhdmFpbDsgaSsrKSB7CisJCQkJZm9yIChpID0gMDsgb29ic2VsLT5vb2JmcmVlW2ldWzFdOyBpKyspIHsKIAkJCQkJaW50IGZyb20gPSBvb2JzZWwtPm9vYmZyZWVbaV1bMF07CiAJCQkJCWludCBudW0gPSBvb2JzZWwtPm9vYmZyZWVbaV1bMV07CiAJCQkJCW1lbWNweSgmb29iX2J1Zltvb2JdLCAmb29iX2RhdGFbZnJvbV0sIG51bSk7Ci0JCQkJCWorPSBudW07CisJCQkJCW9vYiArPSBudW07CiAJCQkJfQotCQkJCW9vYiArPSBtdGQtPm9vYmF2YWlsOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNVERfTkFOREVDQ19QTEFDRToKIAkJCQkvKiBZQUZGUzEgbGVnYWN5IG1vZGUgKi8KQEAgLTEyMzksNyArMTMxOSw3IEBACiAJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSAKIAkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CiAJCWVsc2UKLQkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwkKKwkJCW5hbmRfd2FpdF9yZWFkeShtdGQpOwogCQkJCiAJCWlmIChyZWFkID09IGxlbikKIAkJCWJyZWFrOwkKQEAgLTEyNjQsNyArMTM0NCw4IEBACiAJfQogCiAJLyogRGVzZWxlY3QgYW5kIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIGRldmljZSAqLwotCW5hbmRfcmVsZWFzZV9kZXZpY2UobXRkKTsKKwlpZiAoZmxhZ3MgJiBOQU5EX0dFVF9ERVZJQ0UpCisJCW5hbmRfcmVsZWFzZV9kZXZpY2UobXRkKTsKIAogCS8qCiAJICogUmV0dXJuIHN1Y2Nlc3MsIGlmIG5vIEVDQyBmYWlsdXJlcywgZWxzZSAtRUJBRE1TRwpAQCAtMTMyOCwxNiArMTQwOSw2IEBACiAJCXRoaXNsZW4gPSBtaW5fdChpbnQsIHRoaXNsZW4sIGxlbik7CiAJCXRoaXMtPnJlYWRfYnVmKG10ZCwgJmJ1ZltpXSwgdGhpc2xlbik7CiAJCWkgKz0gdGhpc2xlbjsKLQkJCi0JCS8qIEFwcGx5IGRlbGF5IG9yIHdhaXQgZm9yIHJlYWR5L2J1c3kgcGluIAotCQkgKiBEbyB0aGlzIGJlZm9yZSB0aGUgQVVUT0lOQ1IgY2hlY2ssIHNvIG5vIHByb2JsZW1zCi0JCSAqIGFyaXNlIGlmIGEgY2hpcCB3aGljaCBkb2VzIGF1dG8gaW5jcmVtZW50Ci0JCSAqIGlzIG1hcmtlZCBhcyBOT0FVVE9JTkNSIGJ5IHRoZSBib2FyZCBkcml2ZXIuCi0JCSovCi0JCWlmICghdGhpcy0+ZGV2X3JlYWR5KSAKLQkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7Ci0JCWVsc2UKLQkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwkKIAogCQkvKiBSZWFkIG1vcmUgPyAqLwogCQlpZiAoaSA8IGxlbikgewpAQCAtMTM1MSw2ICsxNDIyLDE2IEBACiAJCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOwogCQkJfQogCQkJCQorCQkJLyogQXBwbHkgZGVsYXkgb3Igd2FpdCBmb3IgcmVhZHkvYnVzeSBwaW4gCisJCQkgKiBEbyB0aGlzIGJlZm9yZSB0aGUgQVVUT0lOQ1IgY2hlY2ssIHNvIG5vIHByb2JsZW1zCisJCQkgKiBhcmlzZSBpZiBhIGNoaXAgd2hpY2ggZG9lcyBhdXRvIGluY3JlbWVudAorCQkJICogaXMgbWFya2VkIGFzIE5PQVVUT0lOQ1IgYnkgdGhlIGJvYXJkIGRyaXZlci4KKwkJCSAqLworCQkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIAorCQkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CisJCQllbHNlCisJCQkJbmFuZF93YWl0X3JlYWR5KG10ZCk7CisKIAkJCS8qIENoZWNrLCBpZiB0aGUgY2hpcCBzdXBwb3J0cyBhdXRvIHBhZ2UgaW5jcmVtZW50IAogCQkJICogb3IgaWYgd2UgaGF2ZSBoaXQgYSBibG9jayBib3VuZGFyeS4gCiAJCQkqLyAKQEAgLTE0MTcsNyArMTQ5OCw3IEBACiAJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSAKIAkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CiAJCWVsc2UKLQkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwkKKwkJCW5hbmRfd2FpdF9yZWFkeShtdGQpOwogCQkJCiAJCS8qIENoZWNrLCBpZiB0aGUgY2hpcCBzdXBwb3J0cyBhdXRvIHBhZ2UgaW5jcmVtZW50ICovIAogCQlpZiAoIU5BTkRfQ0FOQVVUT0lOQ1IodGhpcykgfHwgIShwYWdlICYgYmxvY2tjaGVjaykpCkBAIC0xNTY3LDYgKzE2NDgsOCBAQAogCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOwogCQlhdXRvcGxhY2UgPSAxOwogCX0JCisJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTF9VU1IpCisJCWF1dG9wbGFjZSA9IDE7CiAKIAkvKiBTZXR1cCB2YXJpYWJsZXMgYW5kIG9vYiBidWZmZXIgKi8KIAl0b3RhbHBhZ2VzID0gbGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQ7CkBAIC0xNzMzLDcgKzE4MTYsNyBAQAogCXN0YXR1cyA9IHRoaXMtPndhaXRmdW5jIChtdGQsIHRoaXMsIEZMX1dSSVRJTkcpOwogCiAJLyogU2VlIGlmIGRldmljZSB0aGlua3MgaXQgc3VjY2VlZGVkICovCi0JaWYgKHN0YXR1cyAmIDB4MDEpIHsKKwlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgewogCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfd3JpdGVfb29iOiAiICJGYWlsZWQgd3JpdGUsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CkBAIC0xODQxLDYgKzE5MjQsOCBAQAogCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOwogCQlhdXRvcGxhY2UgPSAxOwogCX0JCisJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTF9VU1IpCisJCWF1dG9wbGFjZSA9IDE7CiAKIAkvKiBTZXR1cCBzdGFydCBwYWdlICovCiAJcGFnZSA9IChpbnQpICh0byA+PiB0aGlzLT5wYWdlX3NoaWZ0KTsKQEAgLTE5ODcsNiArMjA3Miw3IEBACiAJcmV0dXJuIG5hbmRfZXJhc2VfbmFuZCAobXRkLCBpbnN0ciwgMCk7CiB9CiAgCisjZGVmaW5lIEJCVF9QQUdFX01BU0sJMHhmZmZmZmYzZgogLyoqCiAgKiBuYW5kX2VyYXNlX2ludGVybiAtIFtOQU5EIEludGVyZmFjZV0gZXJhc2UgYmxvY2socykKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCkBAIC0xOTk5LDYgKzIwODUsMTAgQEAKIHsKIAlpbnQgcGFnZSwgbGVuLCBzdGF0dXMsIHBhZ2VzX3Blcl9ibG9jaywgcmV0LCBjaGlwbnI7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlpbnQgcmV3cml0ZV9iYnRbTkFORF9NQVhfQ0hJUFNdPXswfTsJLyogZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIHBhZ2UsIGlmIGJidCBuZWVkcyB0byBiZSByZXdyaXR0ZW4uICovCisJdW5zaWduZWQgaW50IGJidF9tYXNrZWRfcGFnZTsJCS8qIGJidCBtYXNrIHRvIGNvbXBhcmUgdG8gcGFnZSBiZWluZyBlcmFzZWQuICovCisJCQkJCQkvKiBJdCBpcyB1c2VkIHRvIHNlZSBpZiB0aGUgY3VycmVudCBwYWdlIGlzIGluIHRoZSBzYW1lICovCisJCQkJCQkvKiAgIDI1NiBibG9jayBncm91cCBhbmQgdGhlIHNhbWUgYmFuayBhcyB0aGUgYmJ0LiAqLwogCiAJREVCVUcgKE1URF9ERUJVR19MRVZFTDMsCiAJICAgICAgICJuYW5kX2VyYXNlOiBzdGFydCA9IDB4JTA4eCwgbGVuID0gJWlcbiIsICh1bnNpZ25lZCBpbnQpIGluc3RyLT5hZGRyLCAodW5zaWduZWQgaW50KSBpbnN0ci0+bGVuKTsKQEAgLTIwNDQsNiArMjEzNCwxMyBAQAogCQlnb3RvIGVyYXNlX2V4aXQ7CiAJfQogCisJLyogaWYgQkJUIHJlcXVpcmVzIHJlZnJlc2gsIHNldCB0aGUgQkJUIHBhZ2UgbWFzayB0byBzZWUgaWYgdGhlIEJCVCBzaG91bGQgYmUgcmV3cml0dGVuICovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBCQlRfQVVUT19SRUZSRVNIKSB7CisJCWJidF9tYXNrZWRfcGFnZSA9IHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSAmIEJCVF9QQUdFX01BU0s7CisJfSBlbHNlIHsKKwkJYmJ0X21hc2tlZF9wYWdlID0gMHhmZmZmZmZmZjsJLyogc2hvdWxkIG5vdCBtYXRjaCBhbnl0aGluZyAqLworCX0KKwogCS8qIExvb3AgdGhyb3VnaCB0aGUgcGFnZXMgKi8KIAlsZW4gPSBpbnN0ci0+bGVuOwogCkBAIC0yMDY2LDEzICsyMTYzLDI2IEBACiAJCQogCQlzdGF0dXMgPSB0aGlzLT53YWl0ZnVuYyAobXRkLCB0aGlzLCBGTF9FUkFTSU5HKTsKIAorCQkvKiBTZWUgaWYgb3BlcmF0aW9uIGZhaWxlZCBhbmQgYWRkaXRpb25hbCBzdGF0dXMgY2hlY2tzIGFyZSBhdmFpbGFibGUgKi8KKwkJaWYgKChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSAmJiAodGhpcy0+ZXJyc3RhdCkpIHsKKwkJCXN0YXR1cyA9IHRoaXMtPmVycnN0YXQobXRkLCB0aGlzLCBGTF9FUkFTSU5HLCBzdGF0dXMsIHBhZ2UpOworCQl9CisKIAkJLyogU2VlIGlmIGJsb2NrIGVyYXNlIHN1Y2NlZWRlZCAqLwotCQlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgewogCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX2VyYXNlOiAiICJGYWlsZWQgZXJhc2UsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKIAkJCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9GQUlMRUQ7CiAJCQlpbnN0ci0+ZmFpbF9hZGRyID0gKHBhZ2UgPDwgdGhpcy0+cGFnZV9zaGlmdCk7CiAJCQlnb3RvIGVyYXNlX2V4aXQ7CiAJCX0KKworCQkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCwgc2V0IHRoZSBCQlQgcmV3cml0ZSBmbGFnIHRvIHRoZSBwYWdlIGJlaW5nIGVyYXNlZCAqLworCQlpZiAodGhpcy0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0gpIHsKKwkJCWlmICgoKHBhZ2UgJiBCQlRfUEFHRV9NQVNLKSA9PSBiYnRfbWFza2VkX3BhZ2UpICYmIAorCQkJICAgICAocGFnZSAhPSB0aGlzLT5iYnRfdGQtPnBhZ2VzW2NoaXBucl0pKSB7CisJCQkJcmV3cml0ZV9iYnRbY2hpcG5yXSA9IChwYWdlIDw8IHRoaXMtPnBhZ2Vfc2hpZnQpOworCQkJfQorCQl9CiAJCQogCQkvKiBJbmNyZW1lbnQgcGFnZSBhZGRyZXNzIGFuZCBkZWNyZW1lbnQgbGVuZ3RoICovCiAJCWxlbiAtPSAoMSA8PCB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0KTsKQEAgLTIwODMsNiArMjE5MywxMyBAQAogCQkJY2hpcG5yKys7CiAJCQl0aGlzLT5zZWxlY3RfY2hpcChtdGQsIC0xKTsKIAkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKworCQkJLyogaWYgQkJUIHJlcXVpcmVzIHJlZnJlc2ggYW5kIEJCVC1QRVJDSElQLCAKKwkJCSAqICAgc2V0IHRoZSBCQlQgcGFnZSBtYXNrIHRvIHNlZSBpZiB0aGlzIEJCVCBzaG91bGQgYmUgcmV3cml0dGVuICovCisJCQlpZiAoKHRoaXMtPm9wdGlvbnMgJiBCQlRfQVVUT19SRUZSRVNIKSAmJiAodGhpcy0+YmJ0X3RkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkpIHsKKwkJCQliYnRfbWFza2VkX3BhZ2UgPSB0aGlzLT5iYnRfdGQtPnBhZ2VzW2NoaXBucl0gJiBCQlRfUEFHRV9NQVNLOworCQkJfQorCiAJCX0KIAl9CiAJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CkBAIC0yMDk3LDYgKzIyMTQsMTggQEAKIAkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCiAJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCisJLyogaWYgQkJUIHJlcXVpcmVzIHJlZnJlc2ggYW5kIGVyYXNlIHdhcyBzdWNjZXNzZnVsLCByZXdyaXRlIGFueSBzZWxlY3RlZCBiYWQgYmxvY2sgdGFibGVzICovCisJaWYgKCh0aGlzLT5vcHRpb25zICYgQkJUX0FVVE9fUkVGUkVTSCkgJiYgKCFyZXQpKSB7CisJCWZvciAoY2hpcG5yID0gMDsgY2hpcG5yIDwgdGhpcy0+bnVtY2hpcHM7IGNoaXBucisrKSB7CisJCQlpZiAocmV3cml0ZV9iYnRbY2hpcG5yXSkgeworCQkJCS8qIHVwZGF0ZSB0aGUgQkJUIGZvciBjaGlwICovCisJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX2VyYXNlX25hbmQ6IG5hbmRfdXBkYXRlX2JidCAoJWQ6MHglMHggMHglMHgpXG4iLCAKKwkJCQkJY2hpcG5yLCByZXdyaXRlX2JidFtjaGlwbnJdLCB0aGlzLT5iYnRfdGQtPnBhZ2VzW2NoaXBucl0pOworCQkJCW5hbmRfdXBkYXRlX2JidCAobXRkLCByZXdyaXRlX2JidFtjaGlwbnJdKTsKKwkJCX0KKwkJfQorCX0KKwogCS8qIFJldHVybiBtb3JlIG9yIGxlc3MgaGFwcHkgKi8KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjE2OCw3ICsyMjk3LDcgQEAKICAqLwogaW50IG5hbmRfc2NhbiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtYXhjaGlwcykKIHsKLQlpbnQgaSwgaiwgbmFuZF9tYWZfaWQsIG5hbmRfZGV2X2lkLCBidXN3OworCWludCBpLCBuYW5kX21hZl9pZCwgbmFuZF9kZXZfaWQsIGJ1c3csIG1hZl9pZDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCiAJLyogR2V0IGJ1c3dpZHRoIHRvIHNlbGVjdCB0aGUgY29ycmVjdCBmdW5jdGlvbnMqLwpAQCAtMjI1NiwxMiArMjM4NSwxOCBAQAogCQkJYnVzdyA9IG5hbmRfZmxhc2hfaWRzW2ldLm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2OwogCQl9CiAKKwkJLyogVHJ5IHRvIGlkZW50aWZ5IG1hbnVmYWN0dXJlciAqLworCQlmb3IgKG1hZl9pZCA9IDA7IG5hbmRfbWFudWZfaWRzW21hZl9pZF0uaWQgIT0gMHgwOyBtYWZfaWQrKykgeworCQkJaWYgKG5hbmRfbWFudWZfaWRzW21hZl9pZF0uaWQgPT0gbmFuZF9tYWZfaWQpCisJCQkJYnJlYWs7CisJCX0KKwogCQkvKiBDaGVjaywgaWYgYnVzd2lkdGggaXMgY29ycmVjdC4gSGFyZHdhcmUgZHJpdmVycyBzaG91bGQgc2V0CiAJCSAqIHRoaXMgY29ycmVjdCAhICovCiAJCWlmIChidXN3ICE9ICh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikpIHsKIAkJCXByaW50ayAoS0VSTl9JTkZPICJOQU5EIGRldmljZTogTWFudWZhY3R1cmVyIElEOiIKIAkJCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwgCi0JCQkJbmFuZF9tYW51Zl9pZHNbaV0ubmFtZSAsIG10ZC0+bmFtZSk7CisJCQkJbmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5uYW1lICwgbXRkLT5uYW1lKTsKIAkJCXByaW50ayAoS0VSTl9XQVJOSU5HIAogCQkJCSJOQU5EIGJ1cyB3aWR0aCAlZCBpbnN0ZWFkICVkIGJpdFxuIiwgCiAJCQkJCSh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgPyAxNiA6IDgsCkBAIC0yMzAwLDE0ICsyNDM1LDkgQEAKIAkJaWYgKG10ZC0+b29iYmxvY2sgPiA1MTIgJiYgdGhpcy0+Y21kZnVuYyA9PSBuYW5kX2NvbW1hbmQpCiAJCQl0aGlzLT5jbWRmdW5jID0gbmFuZF9jb21tYW5kX2xwOwogCQkJCQotCQkvKiBUcnkgdG8gaWRlbnRpZnkgbWFudWZhY3R1cmVyICovCi0JCWZvciAoaiA9IDA7IG5hbmRfbWFudWZfaWRzW2pdLmlkICE9IDB4MDsgaisrKSB7Ci0JCQlpZiAobmFuZF9tYW51Zl9pZHNbal0uaWQgPT0gbmFuZF9tYWZfaWQpCi0JCQkJYnJlYWs7Ci0JCX0KIAkJcHJpbnRrIChLRVJOX0lORk8gIk5BTkQgZGV2aWNlOiBNYW51ZmFjdHVyZXIgSUQ6IgogCQkJIiAweCUwMngsIENoaXAgSUQ6IDB4JTAyeCAoJXMgJXMpXG4iLCBuYW5kX21hZl9pZCwgbmFuZF9kZXZfaWQsIAotCQkJbmFuZF9tYW51Zl9pZHNbal0ubmFtZSAsIG5hbmRfZmxhc2hfaWRzW2ldLm5hbWUpOworCQkJbmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5uYW1lICwgbmFuZF9mbGFzaF9pZHNbaV0ubmFtZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjM4OCwxMiArMjUxOCw5IEBACiAJCiAJLyogVGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHRoZSBmaWxlc3lzdGVtIHRvIHBsYWNlIGZzIGRlcGVuZGVuZAogCSAqIG9vYiBkYXRhICovCi0JaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSB7Ci0JCW10ZC0+b29iYXZhaWwgPSBtdGQtPm9vYnNpemUgLSAodGhpcy0+YXV0b29vYi0+ZWNjYnl0ZXMgKyAyKTsKLQkJaWYgKHRoaXMtPmF1dG9vb2ItPmVjY2J5dGVzICYgMHgwMSkKLQkJCW10ZC0+b29iYXZhaWwtLTsKLQl9IGVsc2UKLQkJbXRkLT5vb2JhdmFpbCA9IG10ZC0+b29ic2l6ZSAtICh0aGlzLT5hdXRvb29iLT5lY2NieXRlcyArIDEpOworCW10ZC0+b29iYXZhaWwgPSAwOworCWZvciAoaSA9IDA7IHRoaXMtPmF1dG9vb2ItPm9vYmZyZWVbaV1bMV07IGkrKykKKwkJbXRkLT5vb2JhdmFpbCArPSB0aGlzLT5hdXRvb29iLT5vb2JmcmVlW2ldWzFdOwogCiAJLyogCiAJICogY2hlY2sgRUNDIG1vZGUsIGRlZmF1bHQgdG8gc29mdHdhcmUKQEAgLTI1MjQsNiArMjY1MSwxMCBAQAogCW1lbWNweSgmbXRkLT5vb2JpbmZvLCB0aGlzLT5hdXRvb29iLCBzaXplb2YobXRkLT5vb2JpbmZvKSk7CiAKIAltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCisJLyogQ2hlY2ssIGlmIHdlIHNob3VsZCBza2lwIHRoZSBiYWQgYmxvY2sgdGFibGUgc2NhbiAqLworCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9TS0lQX0JCVFNDQU4pCisJCXJldHVybiAwOwogCiAJLyogQnVpbGQgYmFkIGJsb2NrIHRhYmxlICovCiAJcmV0dXJuIHRoaXMtPnNjYW5fYmJ0IChtdGQpOwpAQCAtMjU1NSw4ICsyNjg2LDggQEAKIAkJa2ZyZWUgKHRoaXMtPmRhdGFfYnVmKTsKIH0KIAotRVhQT1JUX1NZTUJPTCAobmFuZF9zY2FuKTsKLUVYUE9SVF9TWU1CT0wgKG5hbmRfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MX0dQTCAobmFuZF9zY2FuKTsKK0VYUE9SVF9TWU1CT0xfR1BMIChuYW5kX3JlbGVhc2UpOwogCiBNT0RVTEVfTElDRU5TRSAoIkdQTCIpOwogTU9EVUxFX0FVVEhPUiAoIlN0ZXZlbiBKLiBIaWxsIDxzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tPiwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKaW5kZXggOWExOTQ5Ny4uNzUzNWVmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYwpAQCAtNiw3ICs2LDcgQEAKICAqICAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQogICoKLSAqICRJZDogbmFuZF9iYnQuYyx2IDEuMjggMjAwNC8xMS8xMyAxMDoxOTowOSBnbGVpeG5lciBFeHAgJAorICogJElkOiBuYW5kX2JidC5jLHYgMS4zNSAyMDA1LzA3LzE1IDEzOjUzOjQ3IGdsZWl4bmVyIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC03Nyw3ICs3Nyw3IEBACiAqLwogc3RhdGljIGludCBjaGVja19wYXR0ZXJuICh1aW50OF90ICpidWYsIGludCBsZW4sIGludCBwYWdsZW4sIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCiB7Ci0JaW50IGksIGVuZDsKKwlpbnQgaSwgZW5kID0gMDsKIAl1aW50OF90ICpwID0gYnVmOwogCiAJZW5kID0gcGFnbGVuICsgdGQtPm9mZnM7CkBAIC05NSw5ICs5NSw5IEBACiAJCQlyZXR1cm4gLTE7CiAJfQogCi0JcCArPSB0ZC0+bGVuOwotCWVuZCArPSB0ZC0+bGVuOwogCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkgeworCQlwICs9IHRkLT5sZW47CisJCWVuZCArPSB0ZC0+bGVuOwogCQlmb3IgKGkgPSBlbmQ7IGkgPCBsZW47IGkrKykgewogCQkJaWYgKCpwKysgIT0gMHhmZikKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDYsNiArMTA2LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKiAKKyAqIGNoZWNrX3Nob3J0X3BhdHRlcm4gLSBbR0VORVJJQ10gY2hlY2sgaWYgYSBwYXR0ZXJuIGlzIGluIHRoZSBidWZmZXIKKyAqIEBidWY6CXRoZSBidWZmZXIgdG8gc2VhcmNoCisgKiBAdGQ6CQlzZWFyY2ggcGF0dGVybiBkZXNjcmlwdG9yCisgKgorICogQ2hlY2sgZm9yIGEgcGF0dGVybiBhdCB0aGUgZ2l2ZW4gcGxhY2UuIFVzZWQgdG8gc2VhcmNoIGJhZCBibG9jaworICogdGFibGVzIGFuZCBnb29kIC8gYmFkIGJsb2NrIGlkZW50aWZpZXJzLiBTYW1lIGFzIGNoZWNrX3BhdHRlcm4sIGJ1dCAKKyAqIG5vIG9wdGlvbmFsIGVtcHR5IGNoZWNrCisgKgorKi8KK3N0YXRpYyBpbnQgY2hlY2tfc2hvcnRfcGF0dGVybiAodWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQoreworCWludCBpOworCXVpbnQ4X3QgKnAgPSBidWY7CisKKwkvKiBDb21wYXJlIHRoZSBwYXR0ZXJuICovCisJZm9yIChpID0gMDsgaSA8IHRkLT5sZW47IGkrKykgeworCQlpZiAocFt0ZC0+b2ZmcyArIGldICE9IHRkLT5wYXR0ZXJuW2ldKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiByZWFkX2JidCAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgZnJvbSBwYWdlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMjUyLDcgKzI3NSw3IEBACiAgKiBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQogICogZm9yIHRoZSBnaXZlbiBnb29kL2JhZCBibG9jayBpZGVudGlmeSBwYXR0ZXJuCiAgKi8KLXN0YXRpYyB2b2lkIGNyZWF0ZV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQsIGludCBjaGlwKQorc3RhdGljIGludCBjcmVhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLCBpbnQgY2hpcCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCWludCBpLCBqLCBudW1ibG9ja3MsIGxlbiwgc2NhbmxlbjsKQEAgLTI3MCw5ICsyOTMsMTcgQEAKIAkJZWxzZQkKIAkJCWxlbiA9IDE7CiAJfQotCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOwotCXJlYWRsZW4gPSBsZW4gKiBtdGQtPm9vYmJsb2NrOwotCW9vYmxlbiA9IGxlbiAqIG10ZC0+b29ic2l6ZTsKKworCWlmICghKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkVNUFRZKSkgeworCQkvKiBXZSBuZWVkIG9ubHkgcmVhZCBmZXcgYnl0ZXMgZnJvbSB0aGUgT09CIGFyZWEgKi8KKwkJc2NhbmxlbiA9IG9vYmxlbiA9IDA7CisJCXJlYWRsZW4gPSBiZC0+bGVuOworCX0gZWxzZSB7CisJCS8qIEZ1bGwgcGFnZSBjb250ZW50IHNob3VsZCBiZSByZWFkICovCisJCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOworCQlyZWFkbGVuID0gbGVuICogbXRkLT5vb2JibG9jazsKKwkJb29ibGVuID0gbGVuICogbXRkLT5vb2JzaXplOworCX0KIAogCWlmIChjaGlwID09IC0xKSB7CiAJCS8qIE5vdGUgdGhhdCBudW1ibG9ja3MgaXMgMiAqIChyZWFsIG51bWJsb2NrcykgaGVyZSwgc2VlIGkrPTIgYmVsb3cgYXMgaXQKQEAgLTI4NCw3ICszMTUsNyBAQAogCQlpZiAoY2hpcCA+PSB0aGlzLT5udW1jaGlwcykgewogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImNyZWF0ZV9iYnQoKTogY2hpcG5yICglZCkgPiBhdmFpbGFibGUgY2hpcHMgKCVkKVxuIiwKIAkJCQljaGlwICsgMSwgdGhpcy0+bnVtY2hpcHMpOwotCQkJcmV0dXJuOwkKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCW51bWJsb2NrcyA9IHRoaXMtPmNoaXBzaXplID4+ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKTsKIAkJc3RhcnRibG9jayA9IGNoaXAgKiBudW1ibG9ja3M7CkBAIC0yOTMsMTggKzMyNCw0MiBAQAogCX0KIAkKIAlmb3IgKGkgPSBzdGFydGJsb2NrOyBpIDwgbnVtYmxvY2tzOykgewotCQluYW5kX3JlYWRfcmF3IChtdGQsIGJ1ZiwgZnJvbSwgcmVhZGxlbiwgb29ibGVuKTsKKwkJaW50IHJldDsKKwkJCisJCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkKKwkJCWlmICgocmV0ID0gbmFuZF9yZWFkX3JhdyAobXRkLCBidWYsIGZyb20sIHJlYWRsZW4sIG9vYmxlbikpKQorCQkJCXJldHVybiByZXQ7CisKIAkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0JCQlpZiAoY2hlY2tfcGF0dGVybiAoJmJ1ZltqICogc2Nhbmxlbl0sIHNjYW5sZW4sIG10ZC0+b29iYmxvY2ssIGJkKSkgewotCQkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOwotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAotCQkJCQlpID4+IDEsICh1bnNpZ25lZCBpbnQpIGZyb20pOwotCQkJCWJyZWFrOworCQkJaWYgKCEoYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FORU1QVFkpKSB7CisJCQkJc2l6ZV90IHJldGxlbjsKKwkJCQkKKwkJCQkvKiBSZWFkIHRoZSBmdWxsIG9vYiB1bnRpbCByZWFkX29vYiBpcyBmaXhlZCB0byAKKwkJCQkgKiBoYW5kbGUgc2luZ2xlIGJ5dGUgcmVhZHMgZm9yIDE2IGJpdCBidXN3aWR0aCAqLworCQkJCXJldCA9IG10ZC0+cmVhZF9vb2IobXRkLCBmcm9tICsgaiAqIG10ZC0+b29iYmxvY2ssCisJCQkJCQkJbXRkLT5vb2JzaXplLCAmcmV0bGVuLCBidWYpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisKKwkJCQlpZiAoY2hlY2tfc2hvcnRfcGF0dGVybiAoYnVmLCBiZCkpIHsKKwkJCQkJdGhpcy0+YmJ0W2kgPj4gM10gfD0gMHgwMyA8PCAoaSAmIDB4Nik7CisJCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAorCQkJCQkJaSA+PiAxLCAodW5zaWduZWQgaW50KSBmcm9tKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2hlY2tfcGF0dGVybiAoJmJ1ZltqICogc2Nhbmxlbl0sIHNjYW5sZW4sIG10ZC0+b29iYmxvY2ssIGJkKSkgeworCQkJCQl0aGlzLT5iYnRbaSA+PiAzXSB8PSAweDAzIDw8IChpICYgMHg2KTsKKwkJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkJhZCBlcmFzZWJsb2NrICVkIGF0IDB4JTA4eFxuIiwgCisJCQkJCQlpID4+IDEsICh1bnNpZ25lZCBpbnQpIGZyb20pOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJaSArPSAyOwogCQlmcm9tICs9ICgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CiAJfQorCXJldHVybiAwOwogfQogCiAvKioKQEAgLTU4OSwxNCArNjQ0LDEyIEBACiAgKiBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhIG1lbW9yeSBiYXNlZCBiYnQgYnkgc2Nhbm5pbmcgdGhlIGRldmljZSAKICAqIGZvciBtYW51ZmFjdHVyZXIgLyBzb2Z0d2FyZSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MKICovCi1zdGF0aWMgaW50IG5hbmRfbWVtb3J5X2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQpCitzdGF0aWMgaW5saW5lIGludCBuYW5kX21lbW9yeV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAKLQkvKiBFbnN1cmUgdGhhdCB3ZSBvbmx5IHNjYW4gZm9yIHRoZSBwYXR0ZXJuIGFuZCBub3RoaW5nIGVsc2UgKi8KLQliZC0+b3B0aW9ucyA9IDA7Ci0JY3JlYXRlX2JidCAobXRkLCB0aGlzLT5kYXRhX2J1ZiwgYmQsIC0xKTsKLQlyZXR1cm4gMDsKKwliZC0+b3B0aW9ucyAmPSB+TkFORF9CQlRfU0NBTkVNUFRZOworCXJldHVybiBjcmVhdGVfYmJ0IChtdGQsIHRoaXMtPmRhdGFfYnVmLCBiZCwgLTEpOwogfQogCiAvKioKQEAgLTgwOCw4ICs4NjEsMTQgQEAKIAkvKiBJZiBubyBwcmltYXJ5IHRhYmxlIGRlY3JpcHRvciBpcyBnaXZlbiwgc2NhbiB0aGUgZGV2aWNlCiAJICogdG8gYnVpbGQgYSBtZW1vcnkgYmFzZWQgYmFkIGJsb2NrIHRhYmxlCiAJICovCi0JaWYgKCF0ZCkKLQkJcmV0dXJuIG5hbmRfbWVtb3J5X2JidChtdGQsIGJkKTsKKwlpZiAoIXRkKSB7CisJCWlmICgocmVzID0gbmFuZF9tZW1vcnlfYmJ0KG10ZCwgYmQpKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAibmFuZF9iYnQ6IENhbid0IHNjYW4gZmxhc2ggYW5kIGJ1aWxkIHRoZSBSQU0tYmFzZWQgQkJUXG4iKTsKKwkJCWtmcmVlICh0aGlzLT5iYnQpOworCQkJdGhpcy0+YmJ0ID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KIAogCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igb25lIGVyYXNlYmxvY2sgaW5jbC4gb29iICovCiAJbGVuID0gKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKQEAgLTkwNCwxNCArOTYzLDExIEBACiB9CiAKIC8qIERlZmluZSBzb21lIGdlbmVyaWMgYmFkIC8gZ29vZCBibG9jayBzY2FuIHBhdHRlcm4gd2hpY2ggYXJlIHVzZWQgCi0gKiB3aGlsZSBzY2FubmluZyBhIGRldmljZSBmb3IgZmFjdG9yeSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MKLSAqIAotICogVGhlIG1lbW9yeSBiYXNlZCBwYXR0ZXJucyBqdXN0IAotICovCisgKiB3aGlsZSBzY2FubmluZyBhIGRldmljZSBmb3IgZmFjdG9yeSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MuICovCiBzdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5bXSA9IHsgMHhmZiwgMHhmZiB9OwogCiBzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIHNtYWxscGFnZV9tZW1vcnliYXNlZCA9IHsKLQkub3B0aW9ucyA9IDAsCisJLm9wdGlvbnMgPSBOQU5EX0JCVF9TQ0FOMk5EUEFHRSwKIAkub2ZmcyA9IDUsCiAJLmxlbiA9IDEsCiAJLnBhdHRlcm4gPSBzY2FuX2ZmX3BhdHRlcm4KQEAgLTEwNDIsNyArMTA5OCw3IEBACiAJcmVzID0gKHRoaXMtPmJidFtibG9jayA+PiAzXSA+PiAoYmxvY2sgJiAweDA2KSkgJiAweDAzOwogCiAJREVCVUcgKE1URF9ERUJVR19MRVZFTDIsICJuYW5kX2lzYmFkX2JidCgpOiBiYnQgaW5mbyBmb3Igb2ZmcyAweCUwOHg6IChibG9jayAlZCkgMHglMDJ4XG4iLCAKLQkJKHVuc2lnbmVkIGludClvZmZzLCByZXMsIGJsb2NrID4+IDEpOworCQkodW5zaWduZWQgaW50KW9mZnMsIGJsb2NrID4+IDEsIHJlcyk7CiAKIAlzd2l0Y2ggKChpbnQpcmVzKSB7CiAJY2FzZSAweDAwOglyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYwppbmRleCAyZDhjNDMyLi5lZmUyNDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2lkcy5jCkBAIC0yLDggKzIsOCBAQAogICogIGRyaXZlcnMvbXRkL25hbmRpZHMuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGhvbWFzIEdsZWl4bmVyICh0Z2x4QGxpbnV0cm9uaXguZGUpCi0gICoKLSAqICRJZDogbmFuZF9pZHMuYyx2IDEuMTAgMjAwNC8wNS8yNiAxMzo0MDoxMiBnbGVpeG5lciBFeHAgJAorICoKKyAqICRJZDogbmFuZF9pZHMuYyx2IDEuMTQgMjAwNS8wNi8yMyAwOTozODo1MCBnbGVpeG5lciBFeHAgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNTYsMTcgKzU2LDI0IEBACiAJeyJOQU5EIDY0TWlCIDMsM1YgMTYtYml0IiwgCTB4NTYsIDUxMiwgNjQsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCiAJCiAJeyJOQU5EIDEyOE1pQiAxLDhWIDgtYml0IiwgCTB4NzgsIDUxMiwgMTI4LCAweDQwMDAsIDB9LAorCXsiTkFORCAxMjhNaUIgMSw4ViA4LWJpdCIsIAkweDM5LCA1MTIsIDEyOCwgMHg0MDAwLCAwfSwKIAl7Ik5BTkQgMTI4TWlCIDMsM1YgOC1iaXQiLCAJMHg3OSwgNTEyLCAxMjgsIDB4NDAwMCwgMH0sCiAJeyJOQU5EIDEyOE1pQiAxLDhWIDE2LWJpdCIsIAkweDcyLCA1MTIsIDEyOCwgMHg0MDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKKwl7Ik5BTkQgMTI4TWlCIDEsOFYgMTYtYml0IiwgCTB4NDksIDUxMiwgMTI4LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAogCXsiTkFORCAxMjhNaUIgMywzViAxNi1iaXQiLCAJMHg3NCwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCisJeyJOQU5EIDEyOE1pQiAzLDNWIDE2LWJpdCIsIAkweDU5LCA1MTIsIDEyOCwgMHg0MDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKIAkKIAl7Ik5BTkQgMjU2TWlCIDMsM1YgOC1iaXQiLCAJMHg3MSwgNTEyLCAyNTYsIDB4NDAwMCwgMH0sCiAKLQl7Ik5BTkQgNTEyTWlCIDMsM1YgOC1iaXQiLCAJMHhEQywgNTEyLCA1MTIsIDB4NDAwMCwgMH0sCi0JCiAJLyogVGhlc2UgYXJlIHRoZSBuZXcgY2hpcHMgd2l0aCBsYXJnZSBwYWdlIHNpemUuIFRoZSBwYWdlc2l6ZQogCSogYW5kIHRoZSBlcmFzZXNpemUgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBleHRlbmRlZCBpZCBieXRlcwogCSovCisJLyo1MTIgTWVnYWJpdCAqLworCXsiTkFORCA2NE1pQiAxLDhWIDgtYml0IiwgCTB4QTIsIDAsICA2NCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKKwl7Ik5BTkQgNjRNaUIgMywzViA4LWJpdCIsIAkweEYyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDY0TWlCIDEsOFYgMTYtYml0IiwgCTB4QjIsIDAsICA2NCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDY0TWlCIDMsM1YgMTYtYml0IiwgCTB4QzIsIDAsICA2NCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisJCiAJLyogMSBHaWdhYml0ICovCiAJeyJOQU5EIDEyOE1pQiAxLDhWIDgtYml0IiwgCTB4QTEsIDAsIDEyOCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKIAl7Ik5BTkQgMTI4TWlCIDMsM1YgOC1iaXQiLCAJMHhGMSwgMCwgMTI4LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LApAQCAtMTAzLDcgKzExMCw3IEBACiAJICogQW55d2F5IEpGRlMyIHdvdWxkIGluY3JlYXNlIHRoZSBlcmFzZWJsb2NrIHNpemUgc28gd2UgY2hvc2UgYSBjb21iaW5lZCBvbmUgd2hpY2ggY2FuIGJlIGVyYXNlZCBpbiBvbmUgZ28KIAkgKiBUaGVyZSBhcmUgbW9yZSBzcGVlZCBpbXByb3ZlbWVudHMgZm9yIHJlYWRzIGFuZCB3cml0ZXMgcG9zc2libGUsIGJ1dCBub3QgaW1wbGVtZW50ZWQgbm93IAogCSAqLwotCXsiQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwJMHgwMSwgMjA0OCwgMTI4LCAweDQwMDAsIE5BTkRfSVNfQU5EIHwgTkFORF9OT19BVVRPSU5DUiB8IE5BTkRfNFBBR0VfQVJSQVl9LAorCXsiQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwJMHgwMSwgMjA0OCwgMTI4LCAweDQwMDAsIE5BTkRfSVNfQU5EIHwgTkFORF9OT19BVVRPSU5DUiB8IE5BTkRfNFBBR0VfQVJSQVkgfCBCQlRfQVVUT19SRUZSRVNIfSwKIAogCXtOVUxMLH0KIH07CkBAIC0xMTgsNiArMTI1LDcgQEAKIAl7TkFORF9NRlJfTkFUSU9OQUwsICJOYXRpb25hbCJ9LAogCXtOQU5EX01GUl9SRU5FU0FTLCAiUmVuZXNhcyJ9LAogCXtOQU5EX01GUl9TVE1JQ1JPLCAiU1QgTWljcm8ifSwKKyAgICAgICAge05BTkRfTUZSX0hZTklYLCAiSHluaXgifSwKIAl7MHgwLCAiVW5rbm93biJ9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCmluZGV4IDEzZmVlZmQuLjc1NGI2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCkBAIC0yMiw3ICsyMiw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCiAgKgotICogJElkOiBuYW5kc2ltLmMsdiAxLjcgMjAwNC8xMi8wNiAxMTo1MzowNiBkZWRla2luZCBFeHAgJAorICogJElkOiBuYW5kc2ltLmMsdiAxLjggMjAwNS8wMy8xOSAxNTozMzo1NiBkZWRla2luZCBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTE0ODQsMzMgKzE0ODQsNiBAQAogfQogCiAvKgotICogSGF2aW5nIG9ubHkgTkFORCBjaGlwIElEcyB3ZSBjYWxsIG5hbmRfc2NhbiB3aGljaCBkZXRlY3RzIE5BTkQgZmxhc2gKLSAqIHBhcmFtZXRlcnMgYW5kIHRoZW4gY2FsbHMgc2Nhbl9iYnQgaW4gb3JkZXIgdG8gc2Nhbi9maW5kL2J1aWxkIHRoZQotICogTkFORCBmbGFzaCBiYWQgYmxvY2sgdGFibGUuIEJ1dCBzaW5jZSBhdCB0aGF0IG1vbWVudCB0aGUgTkFORCBmbGFzaAotICogaW1hZ2UgaXNuJ3QgYWxsb2NhdGVkIGluIHRoZSBzaW11bGF0b3IsIGVycm9ycyBhcmlzZS4gVG8gYXZvaWQgdGhpcwotICogd2UgcmVkZWZpbmUgdGhlIHNjYW5fYmJ0IGNhbGxiYWNrIGFuZCBpbml0aWFsaXplIHRoZSBuYW5kc2ltIHN0cnVjdHVyZQotICogYmVmb3JlIHRoZSBmbGFzaCBtZWRpYSBzY2FubmluZy4KLSAqLwotaW50IG5zX3NjYW5fYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoteyAKLQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gKHN0cnVjdCBuYW5kX2NoaXAgKiltdGQtPnByaXY7Ci0Jc3RydWN0IG5hbmRzaW0gICAqbnMgICA9IChzdHJ1Y3QgbmFuZHNpbSAqKShjaGlwLT5wcml2KTsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCFOU19JU19JTklUSUFMSVpFRChucykpCi0JCWlmICgocmV0dmFsID0gaW5pdF9uYW5kc2ltKG10ZCkpICE9IDApIHsKLQkJCU5TX0VSUigic2Nhbl9iYnQ6IGNhbid0IGluaXRpYWxpemUgdGhlIG5hbmRzaW0gc3RydWN0dXJlXG4iKTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0KLQlpZiAoKHJldHZhbCA9IG5hbmRfZGVmYXVsdF9iYnQobXRkKSkgIT0gMCkgewotCQlmcmVlX25hbmRzaW0obnMpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgogICogTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgKi8KIGludCBfX2luaXQgbnNfaW5pdF9tb2R1bGUodm9pZCkKQEAgLTE1NDQsNyArMTUxNyw2IEBACiAJY2hpcC0+aHdjb250cm9sICA9IG5zX2h3Y29udHJvbDsKIAljaGlwLT5yZWFkX2J5dGUgID0gbnNfbmFuZF9yZWFkX2J5dGU7CiAJY2hpcC0+ZGV2X3JlYWR5ICA9IG5zX2RldmljZV9yZWFkeTsKLQljaGlwLT5zY2FuX2JidCAgID0gbnNfc2Nhbl9iYnQ7CiAJY2hpcC0+d3JpdGVfYnl0ZSA9IG5zX25hbmRfd3JpdGVfYnl0ZTsKIAljaGlwLT53cml0ZV9idWYgID0gbnNfbmFuZF93cml0ZV9idWY7CiAJY2hpcC0+cmVhZF9idWYgICA9IG5zX25hbmRfcmVhZF9idWY7CkBAIC0xNTUyLDYgKzE1MjQsNyBAQAogCWNoaXAtPndyaXRlX3dvcmQgPSBuc19uYW5kX3dyaXRlX3dvcmQ7CiAJY2hpcC0+cmVhZF93b3JkICA9IG5zX25hbmRfcmVhZF93b3JkOwogCWNoaXAtPmVjY21vZGUgICAgPSBOQU5EX0VDQ19TT0ZUOworCWNoaXAtPm9wdGlvbnMgICB8PSBOQU5EX1NLSVBfQkJUU0NBTjsKIAogCS8qIAogCSAqIFBlcmZvcm0gbWluaW11bSBuYW5kc2ltIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbiB0byBoYW5kbGUKQEAgLTE1ODAsNiArMTU1MywxNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAorCWlmICgocmV0dmFsID0gaW5pdF9uYW5kc2ltKG5zbXRkKSkgIT0gMCkgeworCQlOU19FUlIoInNjYW5fYmJ0OiBjYW4ndCBpbml0aWFsaXplIHRoZSBuYW5kc2ltIHN0cnVjdHVyZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCQorCWlmICgocmV0dmFsID0gbmFuZF9kZWZhdWx0X2JidChuc210ZCkpICE9IDApIHsKKwkJZnJlZV9uYW5kc2ltKG5hbmQpOworCQlnb3RvIGVycm9yOworCX0KKwogCS8qIFJlZ2lzdGVyIE5BTkQgYXMgb25lIGJpZyBwYXJ0aXRpb24gKi8KIAlhZGRfbXRkX3BhcnRpdGlvbnMobnNtdGQsICZuYW5kLT5wYXJ0LCAxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKaW5kZXggMDIzMDVhMi4uMDMxMDUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCkBAIC02LDcgKzYsNyBAQAogICogIERlcml2ZWQgZnJvbSBkcml2ZXJzL210ZC9uYW5kL3NwaWEuYwogICogICAgICAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tKQogICoKLSAqICRJZDogcnRjX2Zyb200LmMsdiAxLjcgMjAwNC8xMS8wNCAxMjo1MzoxMCBnbGVpeG5lciBFeHAgJAorICogJElkOiBydGNfZnJvbTQuYyx2IDEuOSAyMDA1LzAxLzI0IDIwOjQwOjExIGRtYXJsaW4gRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTgzLDEzICs4MywxOCBAQAogI2RlZmluZSBSVENfRlJPTTRfUlNfRUNDX0NISwkJKFJUQ19GUk9NNF9OQU5EX0FERFJfRlBHQSB8IDB4MDAwMDAwNzApCiAjZGVmaW5lIFJUQ19GUk9NNF9SU19FQ0NfQ0hLX0VSUk9SCSgxIDw8IDcpCiAKKyNkZWZpbmUgRVJSX1NUQVRfRUNDX0FWQUlMQUJMRQkJMHgyMAorCiAvKiBVbmRlZmluZSBmb3Igc29mdHdhcmUgRUNDICovCiAjZGVmaW5lIFJUQ19GUk9NNF9IV0VDQwkxCiAKKy8qIERlZmluZSBhcyAxIGZvciBubyB2aXJ0dWFsIGVyYXNlIGJsb2NrcyAoaW4gSkZGUzIpICovCisjZGVmaW5lIFJUQ19GUk9NNF9OT19WSVJUQkxPQ0tTCTAKKwogLyoKICAqIE1vZHVsZSBzdHVmZgogICovCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpydGNfZnJvbTRfZmlvX2Jhc2UgPSBQMlNFR0FERFIoUlRDX0ZST000X0ZJT19CQVNFKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJ0Y19mcm9tNF9maW9fYmFzZSA9ICh2b2lkICopUDJTRUdBRERSKFJUQ19GUk9NNF9GSU9fQkFTRSk7CiAKIGNvbnN0IHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdID0gewogICAgICAgICB7CkBAIC0yNjcsNyArMjcyLDYgQEAKIH0KIAogCi0KIC8qCiAgKiBydGNfZnJvbTRfbmFuZF9kZXZpY2VfcmVhZHkgLSBoYXJkd2FyZSBzcGVjaWZpYyByZWFkeS9idXN5IGNoZWNrCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMjg2LDYgKzI5MCw0MCBAQAogCiB9CiAKKworLyoKKyAqIGRlcGxldGUgLSBjb2RlIHRvIHBlcmZvcm0gZGV2aWNlIHJlY292ZXJ5IGluIGNhc2UgdGhlcmUgd2FzIGEgcG93ZXIgbG9zcworICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOglDaGlwIHRvIHNlbGVjdCAoMCA9PSBzbG90IDMsIDEgPT0gc2xvdCA0KQorICoKKyAqIElmIHRoZXJlIHdhcyBhIHN1ZGRlbiBsb3NzIG9mIHBvd2VyIGR1cmluZyBhbiBlcmFzZSBvcGVyYXRpb24sIGEgCisgKiAiZGV2aWNlIHJlY292ZXJ5IiBvcGVyYXRpb24gbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiBwb3dlciBpcyByZXN0b3JlZAorICogdG8gZW5zdXJlIGNvcnJlY3Qgb3BlcmF0aW9uLiAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHRoZSByZXF1aXJlZCBzdGVwcworICogZm9yIHRoZSByZXF1ZXN0ZWQgY2hpcC4KKyAqCisgKiBTZWUgcGFnZSA4NiBvZiB0aGUgZGF0YSBzaGVldCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRlcGxldGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKQoreworICAgICAgICBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisgICAgICAgIC8qIHdhaXQgdW50aWwgZGV2aWNlIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkvKiBTZW5kIHRoZSBjb21tYW5kcyBmb3IgZGV2aWNlIHJlY292ZXJ5LCBwaGFzZSAxICovCisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9ERVBMRVRFMSwgMHgwMDAwLCAweDAwMDApOworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTIsIC0xLCAtMSk7CisKKwkvKiBTZW5kIHRoZSBjb21tYW5kcyBmb3IgZGV2aWNlIHJlY292ZXJ5LCBwaGFzZSAyICovCisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9ERVBMRVRFMSwgMHgwMDAwLCAweDAwMDQpOworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTIsIC0xLCAtMSk7CisKK30KKworCiAjaWZkZWYgUlRDX0ZST000X0hXRUNDCiAvKgogICogcnRjX2Zyb200X2VuYWJsZV9od2VjYyAtIGhhcmR3YXJlIHNwZWNpZmljIGhhcmR3YXJlIEVDQyBlbmFibGUgZnVuY3Rpb24KQEAgLTMyOSw2ICszNjcsNyBAQAogCiB9CiAKKwogLyoKICAqIHJ0Y19mcm9tNF9jYWxjdWxhdGVfZWNjIC0gaGFyZHdhcmUgc3BlY2lmaWMgY29kZSB0byByZWFkIEVDQyBjb2RlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMzU2LDYgKzM5NSw3IEBACiAJZWNjX2NvZGVbN10gfD0gMHgwZjsJLyogc2V0IHRoZSBsYXN0IGZvdXIgYml0cyAobm90IHVzZWQpICovCiB9CiAKKwogLyoKICAqIHJ0Y19mcm9tNF9jb3JyZWN0X2RhdGEgLSBoYXJkd2FyZSBzcGVjaWZpYyBjb2RlIHRvIGNvcnJlY3QgZGF0YSB1c2luZyBFQ0MgY29kZQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTM2NSwxNiArNDA1LDE0IEBACiAgKgogICogVGhlIEZQR0EgdGVsbHMgdXMgZmFzdCwgaWYgdGhlcmUncyBhbiBlcnJvciBvciBub3QuIElmIG5vLCB3ZSBnbyBiYWNrIGhhcHB5CiAgKiBlbHNlIHdlIHJlYWQgdGhlIGVjYyByZXN1bHRzIGZyb20gdGhlIGZwZ2EgYW5kIGNhbGwgdGhlIHJzIGxpYnJhcnkgdG8gZGVjb2RlCi0gKiBhbmQgaG9wZWZ1bGx5IGNvcnJlY3QgdGhlIGVycm9yCisgKiBhbmQgaG9wZWZ1bGx5IGNvcnJlY3QgdGhlIGVycm9yLgogICoKLSAqIEZvciBub3cgSSB1c2UgdGhlIGNvZGUsIHdoaWNoIHdlIHJlYWQgZnJvbSB0aGUgRkxBU0ggdG8gdXNlIHRoZSBSUyBsaWIsCi0gKiBhcyB0aGUgc3luZHJvbSBjb252ZXJzaW9uIGhhcyBhIHVucmVzb2x2ZWQgaXNzdWUuCiAgKi8KIHN0YXRpYyBpbnQgcnRjX2Zyb200X2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjMSwgdV9jaGFyICplY2MyKQogewogCWludCBpLCBqLCByZXM7CiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOyAKLQl1aW50MTZfdCBwYXJbNl0sIHN5bls2XSwgdG1wOworCXVpbnQxNl90IHBhcls2XSwgc3luWzZdOwogCXVpbnQ4X3QgZWNjWzhdOwogICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcnNfZWNjOwogCkBAIC00MTYsMTUgKzQ1NCw4NiBAQAogCX0KIAogCS8qIExldCB0aGUgbGlicmFyeSBjb2RlIGRvIGl0cyBtYWdpYy4qLwotCXJlcyA9IGRlY29kZV9yczgocnNfZGVjb2RlciwgYnVmLCBwYXIsIDUxMiwgc3luLCAwLCBOVUxMLCAweGZmLCBOVUxMKTsKKwlyZXMgPSBkZWNvZGVfcnM4KHJzX2RlY29kZXIsICh1aW50OF90ICopYnVmLCBwYXIsIDUxMiwgc3luLCAwLCBOVUxMLCAweGZmLCBOVUxMKTsKIAlpZiAocmVzID4gMCkgewogCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgInJ0Y19mcm9tNF9jb3JyZWN0X2RhdGE6ICIgCiAJCQkiRUNDIGNvcnJlY3RlZCAlZCBlcnJvcnMgb24gcmVhZFxuIiwgcmVzKTsKIAl9CiAJcmV0dXJuIHJlczsKIH0KKworCisvKioKKyAqIHJ0Y19mcm9tNF9lcnJzdGF0IC0gcGVyZm9ybSBhZGRpdGlvbmFsIGVycm9yIHN0YXR1cyBjaGVja3MKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGhpczoJTkFORCBjaGlwIHN0cnVjdHVyZQorICogQHN0YXRlOglzdGF0ZSBvciB0aGUgb3BlcmF0aW9uCisgKiBAc3RhdHVzOglzdGF0dXMgY29kZSByZXR1cm5lZCBmcm9tIHJlYWQgc3RhdHVzCisgKiBAcGFnZToJc3RhcnRwYWdlIGluc2lkZSB0aGUgY2hpcCwgbXVzdCBiZSBjYWxsZWQgd2l0aCAocGFnZSAmIHRoaXMtPnBhZ2VtYXNrKQorICogCisgKiBQZXJmb3JtIGFkZGl0aW9uYWwgZXJyb3Igc3RhdHVzIGNoZWNrcyBvbiBlcmFzZSBhbmQgd3JpdGUgZmFpbHVyZXMgCisgKiB0byBkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZSBjb3JyZWN0YWJsZS4gIEZvciB0aGlzIGRldmljZSwgY29ycmVjdGFibGUgCisgKiAxLWJpdCBlcnJvcnMgb24gZXJhc2UgYW5kIHdyaXRlIGFyZSBjb25zaWRlcmVkIGFjY2VwdGFibGUuCisgKgorICogbm90ZTogc2VlIHBhZ2VzIDM0Li4zNyBvZiBkYXRhIHNoZWV0IGZvciBkZXRhaWxzLgorICoKKyAqLworc3RhdGljIGludCBydGNfZnJvbTRfZXJyc3RhdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlLCBpbnQgc3RhdHVzLCBpbnQgcGFnZSkKK3sKKwlpbnQJZXJfc3RhdD0wOworCWludAlydG4sIHJldGxlbjsKKwlzaXplX3QJbGVuOworCXVpbnQ4X3QgKmJ1ZjsKKwlpbnQJaTsKKworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX0NMRUFSLCAtMSwgLTEpOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBGTF9FUkFTSU5HKSB7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJaWYgKHN0YXR1cyAmIDE8PChpKzEpKSB7CisJCQkJdGhpcy0+Y21kZnVuYyAobXRkLCAoTkFORF9DTURfU1RBVFVTX0VSUk9SICsgaSArIDEpLCAtMSwgLTEpOworCQkJCXJ0biA9IHRoaXMtPnJlYWRfYnl0ZShtdGQpOworCQkJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX1JFU0VULCAtMSwgLTEpOworCQkJCWlmICghKHJ0biAmIEVSUl9TVEFUX0VDQ19BVkFJTEFCTEUpKSB7CisJCQkJCWVyX3N0YXQgfD0gMTw8KGkrMSk7CS8qIGVycl9lY2Nfbm90X2F2YWlsICovCisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChzdGF0ZSA9PSBGTF9XUklUSU5HKSB7CisJCS8qIHNpbmdsZSBiYW5rIHdyaXRlIGxvZ2ljICovCisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX0VSUk9SLCAtMSwgLTEpOworCQlydG4gPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwkJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9TVEFUVVNfUkVTRVQsIC0xLCAtMSk7CisJCWlmICghKHJ0biAmIEVSUl9TVEFUX0VDQ19BVkFJTEFCTEUpKSB7CisJCQllcl9zdGF0IHw9IDE8PDE7CS8qIGVycl9lY2Nfbm90X2F2YWlsICovCisJCX0gZWxzZSB7CisJCQlsZW4gPSBtdGQtPm9vYmJsb2NrOworCQkJYnVmID0ga21hbGxvYyAobGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghYnVmKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiAicnRjX2Zyb200X2VycnN0YXQ6IE91dCBvZiBtZW1vcnkhXG4iKTsKKwkJCQllcl9zdGF0ID0gMTsJCQkvKiBpZiB3ZSBjYW4ndCBjaGVjaywgYXNzdW1lIGZhaWxlZCAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiByZWNvdmVyeSByZWFkICovCisJCQkJLyogcGFnZSByZWFkICovCisJCQkJcnRuID0gbmFuZF9kb19yZWFkX2VjYyAobXRkLCBwYWdlLCBsZW4sICZyZXRsZW4sIGJ1ZiwgTlVMTCwgdGhpcy0+YXV0b29vYiwgMSk7CisJCQkJaWYgKHJ0bikgewkvKiBpZiByZWFkIGZhaWxlZCBvciA+IDEtYml0IGVycm9yIGNvcnJlY3RlZCAqLworCQkJCQllcl9zdGF0IHw9IDE8PDE7CS8qIEVDQyByZWFkIGZhaWxlZCAqLworCQkJCX0KKwkJCQlrZnJlZShidWYpOworCQkJfQorCQl9CisJfQorCisJcnRuID0gc3RhdHVzOworCWlmIChlcl9zdGF0ID09IDApIHsJCQkJLyogaWYgRUNDIGlzIGF2YWlsYWJsZSAgICovCisJCXJ0biA9IChzdGF0dXMgJiB+TkFORF9TVEFUVVNfRkFJTCk7CS8qICAgY2xlYXIgdGhlIGVycm9yIGJpdCAqLworCX0KKworCXJldHVybiBydG47Cit9CiAjZW5kaWYKIAorCiAvKgogICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAgKi8KQEAgLTQzMiw2ICs1NDEsNyBAQAogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7CiAJdW5zaWduZWQgc2hvcnQgYmNyMSwgYmNyMiwgd2NyMjsKKwlpbnQgaTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTVREIGRldmljZSBzdHJ1Y3R1cmUgYW5kIHByaXZhdGUgZGF0YSAqLwogCXJ0Y19mcm9tNF9tdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICsgc2l6ZW9mIChzdHJ1Y3QgbmFuZF9jaGlwKSwKQEAgLTQ4Myw2ICs1OTMsOCBAQAogCiAgICAgICAgIHRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19IVzhfNTEyOwogCXRoaXMtPm9wdGlvbnMgfD0gTkFORF9IV0VDQ19TWU5EUk9NRTsKKwkvKiByZXR1cm4gdGhlIHN0YXR1cyBvZiBleHRyYSBzdGF0dXMgYW5kIEVDQyBjaGVja3MgKi8KKwl0aGlzLT5lcnJzdGF0ID0gcnRjX2Zyb200X2VycnN0YXQ7CiAJLyogc2V0IHRoZSBuYW5kX29vYmluZm8gdG8gc3VwcG9ydCBGUEdBIEgvVyBlcnJvciBkZXRlY3Rpb24gKi8KIAl0aGlzLT5hdXRvb29iID0gJnJ0Y19mcm9tNF9uYW5kX29vYmluZm87CiAJdGhpcy0+ZW5hYmxlX2h3ZWNjID0gcnRjX2Zyb200X2VuYWJsZV9od2VjYzsKQEAgLTUwNCw2ICs2MTYsMTggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwkvKiBQZXJmb3JtICdkZXZpY2UgcmVjb3ZlcnknIGZvciBlYWNoIGNoaXAgaW4gY2FzZSB0aGVyZSB3YXMgYSBwb3dlciBsb3NzLiAqLworCWZvciAoaT0wOyBpIDwgdGhpcy0+bnVtY2hpcHM7IGkrKykgeworCQlkZXBsZXRlKHJ0Y19mcm9tNF9tdGQsIGkpOworCX0KKworI2lmIFJUQ19GUk9NNF9OT19WSVJUQkxPQ0tTCisJLyogdXNlIGEgc21hbGxlciBlcmFzZSBibG9jayB0byBtaW5pbWl6ZSB3YXN0ZWQgc3BhY2Ugd2hlbiBhIGJsb2NrIGlzIGJhZCAqLworCS8qIG5vdGU6IHRoaXMgdXNlcyBlaWdodCB0aW1lcyBhcyBtdWNoIFJBTSBhcyB1c2luZyB0aGUgZGVmYXVsdCBhbmQgbWFrZXMgKi8KKwkvKiAgICAgICBtb3VudHMgdGFrZSBmb3VyIHRpbWVzIGFzIGxvbmcuICovCisJcnRjX2Zyb200X210ZC0+ZmxhZ3MgfD0gTVREX05PX1ZJUlRCTE9DS1M7CisjZW5kaWYKKwogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCiAJYWRkX210ZF9wYXJ0aXRpb25zKHJ0Y19mcm9tNF9tdGQsIHBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMKaW5kZXggZDA1ZTliOS4uODkxZTNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMKQEAgLTEsMTcgKzEsMjQgQEAKIC8qIGxpbnV4L2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgogICoKLSAqIFNhbXN1bmcgUzNDMjQxMCBOQU5EIGRyaXZlcgorICogU2Ftc3VuZyBTM0MyNDEwL1MzQzI0MCBOQU5EIGRyaXZlcgogICoKICAqIENoYW5nZWxvZzoKICAqCTIxLVNlcC0yMDA0ICBCSkQgIEluaXRpYWwgdmVyc2lvbgogICoJMjMtU2VwLTIwMDQgIEJKRCAgTXVsaXRwbGUgZGV2aWNlIHN1cHBvcnQKICAqCTI4LVNlcC0yMDA0ICBCSkQgIEZpeGVkIEVDQyBwbGFjZW1lbnQgZm9yIEhhcmR3YXJlIG1vZGUKICAqCTEyLU9jdC0yMDA0ICBCSkQgIEZpeGVkIGVycm9ycyBpbiB1c2Ugb2YgcGxhdGZvcm0gZGF0YQorICoJMTgtRmViLTIwMDUgIEJKRCAgRml4IHNwYXJzZSBlcnJvcnMKKyAqCTE0LU1hci0yMDA1ICBCSkQgIEFwcGxpZWQgdGdseCdzIGNvZGUgcmVkdWN0aW9uIHBhdGNoCisgKgkwMi1NYXktMjAwNSAgQkpEICBGaXhlZCBzM2MyNDQwIHN1cHBvcnQKKyAqCTAyLU1heS0yMDA1ICBCSkQgIFJlZHVjZWQgaHdjb250cm9sIGRlY29kZQorICoJMjAtSnVuLTIwMDUgIEJKRCAgVXBkYXRlZCBzM2MyNDQwIHN1cHBvcnQsIGZpeGVkIHRpbWluZyBidWcKKyAqCTA4LUp1bC0yMDA1ICBCSkQgIEZpeCBPT1BTIHdoZW4gbm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZAogICoKLSAqICRJZDogczNjMjQxMC5jLHYgMS43IDIwMDUvMDEvMDUgMTg6MDU6MTQgZHdtdzIgRXhwICQKKyAqICRJZDogczNjMjQxMC5jLHYgMS4xNCAyMDA1LzA3LzA2IDIwOjA1OjA2IGJqZCBFeHAgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNjksMTAgKzc2LDEwIEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gbmFuZF9od19lY2Nvb2IgPSB7Ci0JLnVzZWVjYyA9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKLQkuZWNjYnl0ZXMgPSAzLAotCS5lY2Nwb3MgPSB7MCwgMSwgMiB9LAotCS5vb2JmcmVlID0geyB7OCwgOH0gfQorCS51c2VlY2MJCT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcwk9IDMsCisJLmVjY3BvcwkJPSB7MCwgMSwgMiB9LAorCS5vb2JmcmVlCT0geyB7OCwgOH0gfQogfTsKIAogLyogY29udHJvbGxlciBhbmQgbXRkIGluZm9ybWF0aW9uICovCkBAIC05OSw4ICsxMDYsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlCQkJKmRldmljZTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCQkqYXJlYTsKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKLQl2b2lkCQkJCSpyZWdzOworCXZvaWQgX19pb21lbQkJCSpyZWdzOwogCWludAkJCQltdGRfY291bnQ7CisKKwl1bnNpZ25lZCBjaGFyCQkJaXNfczNjMjQ0MDsKIH07CiAKIC8qIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCkBAIC0xNjUsMTIgKzE3NCwxMiBAQAogCS8qIGNhbGN1bGF0ZSB0aGUgdGltaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY29udHJvbGxlciAqLwogCiAJaWYgKHBsYXQgIT0gTlVMTCkgewotCQl0YWNscyA9IHMzYzI0MTBfbmFuZF9jYWxjX3JhdGUocGxhdC0+dGFjbHMsIGNsa3JhdGUsIDgpOworCQl0YWNscyAgPSBzM2MyNDEwX25hbmRfY2FsY19yYXRlKHBsYXQtPnRhY2xzLCBjbGtyYXRlLCA0KTsKIAkJdHdycGgwID0gczNjMjQxMF9uYW5kX2NhbGNfcmF0ZShwbGF0LT50d3JwaDAsIGNsa3JhdGUsIDgpOwogCQl0d3JwaDEgPSBzM2MyNDEwX25hbmRfY2FsY19yYXRlKHBsYXQtPnR3cnBoMSwgY2xrcmF0ZSwgOCk7CiAJfSBlbHNlIHsKIAkJLyogZGVmYXVsdCB0aW1pbmdzICovCi0JCXRhY2xzID0gODsKKwkJdGFjbHMgPSA0OwogCQl0d3JwaDAgPSA4OwogCQl0d3JwaDEgPSA4OwogCX0KQEAgLTE4NSwxMCArMTk0LDE2IEBACiAJICAgICAgIHRvX25zKHR3cnBoMCwgY2xrcmF0ZSksCiAJICAgICAgIHRvX25zKHR3cnBoMSwgY2xrcmF0ZSkpOwogCi0JY2ZnICA9IFMzQzI0MTBfTkZDT05GX0VOOwotCWNmZyB8PSBTM0MyNDEwX05GQ09ORl9UQUNMUyh0YWNscy0xKTsKLQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVFdSUEgwKHR3cnBoMC0xKTsKLQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVFdSUEgxKHR3cnBoMS0xKTsKKwlpZiAoIWluZm8tPmlzX3MzYzI0NDApIHsKKwkJY2ZnICA9IFMzQzI0MTBfTkZDT05GX0VOOworCQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVEFDTFModGFjbHMtMSk7CisJCWNmZyB8PSBTM0MyNDEwX05GQ09ORl9UV1JQSDAodHdycGgwLTEpOworCQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVFdSUEgxKHR3cnBoMS0xKTsKKwl9IGVsc2UgeworCQljZmcgICA9IFMzQzI0NDBfTkZDT05GX1RBQ0xTKHRhY2xzLTEpOworCQljZmcgIHw9IFMzQzI0NDBfTkZDT05GX1RXUlBIMCh0d3JwaDAtMSk7CisJCWNmZyAgfD0gUzNDMjQ0MF9ORkNPTkZfVFdSUEgxKHR3cnBoMS0xKTsKKwl9CiAKIAlwcl9kZWJ1ZyhQRlggIk5GX0NPTkYgaXMgMHglbHhcbiIsIGNmZyk7CiAKQEAgLTIwMywxNyArMjE4LDIyIEBACiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvOwogCXN0cnVjdCBzM2MyNDEwX25hbmRfbXRkICpubXRkOyAKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXZvaWQgX19pb21lbSAqcmVnOwogCXVuc2lnbmVkIGxvbmcgY3VyOworCXVuc2lnbmVkIGxvbmcgYml0OwogCiAJbm10ZCA9IHRoaXMtPnByaXY7CiAJaW5mbyA9IG5tdGQtPmluZm87CiAKLQljdXIgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCWJpdCA9IChpbmZvLT5pc19zM2MyNDQwKSA/IFMzQzI0NDBfTkZDT05UX25GQ0UgOiBTM0MyNDEwX05GQ09ORl9uRkNFOworCXJlZyA9IGluZm8tPnJlZ3MrKChpbmZvLT5pc19zM2MyNDQwKSA/IFMzQzI0NDBfTkZDT05UOlMzQzI0MTBfTkZDT05GKTsKKworCWN1ciA9IHJlYWRsKHJlZyk7CiAKIAlpZiAoY2hpcCA9PSAtMSkgewotCQljdXIgfD0gUzNDMjQxMF9ORkNPTkZfbkZDRTsKKwkJY3VyIHw9IGJpdDsKIAl9IGVsc2UgewotCQlpZiAoY2hpcCA+IG5tdGQtPnNldC0+bnJfY2hpcHMpIHsKKwkJaWYgKG5tdGQtPnNldCAhPSBOVUxMICYmIGNoaXAgPiBubXRkLT5zZXQtPm5yX2NoaXBzKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjaGlwICVkIG91dCBvZiByYW5nZVxuIiwgY2hpcCk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIyMywxNDMgKzI0Myw3NiBAQAogCQkJCShpbmZvLT5wbGF0Zm9ybS0+c2VsZWN0X2NoaXApKG5tdGQtPnNldCwgY2hpcCk7CiAJCX0KIAotCQljdXIgJj0gflMzQzI0MTBfTkZDT05GX25GQ0U7CisJCWN1ciAmPSB+Yml0OwogCX0KIAotCXdyaXRlbChjdXIsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7CisJd3JpdGVsKGN1ciwgcmVnKTsKIH0KIAotLyogY29tbWFuZCBhbmQgY29udHJvbCBmdW5jdGlvbnMgKi8KKy8qIGNvbW1hbmQgYW5kIGNvbnRyb2wgZnVuY3Rpb25zIAorICoKKyAqIE5vdGUsIHRoZXNlIGFsbCB1c2UgdGdseCdzIG1ldGhvZCBvZiBjaGFuZ2luZyB0aGUgSU9fQUREUl9XIGZpZWxkCisgKiB0byBtYWtlIHRoZSBjb2RlIHNpbXBsZXIsIGFuZCB1c2UgdGhlIG5hbmQgbGF5ZXIncyBjb2RlIHRvIGlzc3VlIHRoZQorICogY29tbWFuZCBhbmQgYWRkcmVzcyBzZXF1ZW5jZXMgdmlhIHRoZSBwcm9wZXIgSU8gcG9ydHMuCisgKgorKi8KIAogc3RhdGljIHZvaWQgczNjMjQxMF9uYW5kX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOwotCXVuc2lnbmVkIGxvbmcgY3VyOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgTkFORF9DVExfU0VUTkNFOgotCQljdXIgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOwotCQljdXIgJj0gflMzQzI0MTBfTkZDT05GX25GQ0U7Ci0JCXdyaXRlbChjdXIsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7Ci0JCWJyZWFrOwotCiAJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCWN1ciA9IHJlYWRsKGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7Ci0JCWN1ciB8PSBTM0MyNDEwX05GQ09ORl9uRkNFOwotCQl3cml0ZWwoY3VyLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYWxsZWQgZm9yIE5DRVxuIiwgX19GVU5DVElPTl9fKTsKIAkJYnJlYWs7CiAKLQkJLyogd2UgZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQgdGhlc2UgKi8KIAljYXNlIE5BTkRfQ1RMX1NFVENMRToKLQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKKwkJY2hpcC0+SU9fQUREUl9XID0gaW5mby0+cmVncyArIFMzQzI0MTBfTkZDTUQ7CisJCWJyZWFrOworCiAJY2FzZSBOQU5EX0NUTF9TRVRBTEU6Ci0JY2FzZSBOQU5EX0NUTF9DTFJBTEU6Ci0JCXByX2RlYnVnKFBGWCAiczNjMjQxMF9uYW5kX2h3Y29udHJvbCglZCkgdW51c2VkbiIsIGNtZCk7CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQUREUjsKKwkJYnJlYWs7CisKKwkJLyogTkFORF9DVExfQ0xSQ0xFOiAqLworCQkvKiBOQU5EX0NUTF9DTFJBTEU6ICovCisJZGVmYXVsdDoKKwkJY2hpcC0+SU9fQUREUl9XID0gaW5mby0+cmVncyArIFMzQzI0MTBfTkZEQVRBOwogCQlicmVhazsKIAl9CiB9CiAKLS8qIHMzYzI0MTBfbmFuZF9jb21tYW5kCi0gKgotICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHNlbmRpbmcgY29tbWFuZHMgYW5kIHRoZSByZWxldmFudCBhZGRyZXNzCi0gKiBpbmZvcm1hdGlvbiB0byB0aGUgY2hpcCwgdmlhIHRoZSBoYXJkd2FyZSBjb250cm9sbGVyLiBTaW5jZSB0aGUKLSAqIFMzQzI0MTAgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IEFMRS9DTEUgc2lnbmFsaW5nIGF1dG9tYXRpY2FsbHksIHdlCi0gKiBkbyBub3QgbmVlZCB0byB1c2UgaHdjb250cm9sLgotKi8KKy8qIGNvbW1hbmQgYW5kIGNvbnRyb2wgZnVuY3Rpb25zICovCiAKLXN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9jb21tYW5kIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwKLQkJCQkgIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCitzdGF0aWMgdm9pZCBzM2MyNDQwX25hbmRfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kKQogewotCXJlZ2lzdGVyIHN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7Ci0JcmVnaXN0ZXIgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAKLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLgotCSAqLwotCWlmIChjb21tYW5kID09IE5BTkRfQ01EX1NFUUlOKSB7Ci0JCWludCByZWFkY21kOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBOQU5EX0NUTF9TRVROQ0U6CisJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbGxlZCBmb3IgTkNFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKIAotCQlpZiAoY29sdW1uID49IG10ZC0+b29iYmxvY2spIHsKLQkJCS8qIE9PQiBhcmVhICovCi0JCQljb2x1bW4gLT0gbXRkLT5vb2JibG9jazsKLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFET09COwotCQl9IGVsc2UgaWYgKGNvbHVtbiA8IDI1NikgewotCQkJLyogRmlyc3QgMjU2IGJ5dGVzIC0tPiBSRUFEMCAqLwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQUQwOwotCQl9IGVsc2UgewotCQkJY29sdW1uIC09IDI1NjsKLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMTsKLQkJfQotCQkKLQkJd3JpdGViKHJlYWRjbWQsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ01EKTsKLQl9Ci0Jd3JpdGViKGNvbW1hbmQsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ01EKTsKKwljYXNlIE5BTkRfQ1RMX1NFVENMRToKKwkJY2hpcC0+SU9fQUREUl9XID0gaW5mby0+cmVncyArIFMzQzI0NDBfTkZDTUQ7CisJCWJyZWFrOwogCi0JLyogU2V0IEFMRSBhbmQgY2xlYXIgQ0xFIHRvIHN0YXJ0IGFkZHJlc3MgY3ljbGUgKi8KKwljYXNlIE5BTkRfQ1RMX1NFVEFMRToKKwkJY2hpcC0+SU9fQUREUl9XID0gaW5mby0+cmVncyArIFMzQzI0NDBfTkZBRERSOworCQlicmVhazsKIAotCWlmIChjb2x1bW4gIT0gLTEgfHwgcGFnZV9hZGRyICE9IC0xKSB7Ci0KLQkJLyogU2VyaWFsbHkgaW5wdXQgYWRkcmVzcyAqLwotCQlpZiAoY29sdW1uICE9IC0xKSB7Ci0JCQkvKiBBZGp1c3QgY29sdW1ucyBmb3IgMTYgYml0IGJ1c3dpZHRoICovCi0JCQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpCi0JCQkJY29sdW1uID4+PSAxOwotCQkJd3JpdGViKGNvbHVtbiwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJfQotCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7Ci0JCQl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpIChwYWdlX2FkZHIpLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkFERFIpOwotCQkJd3JpdGViKCh1bnNpZ25lZCBjaGFyKSAocGFnZV9hZGRyID4+IDgpLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkFERFIpOwotCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgaGlnaGVyIGRlbnNpdHkgZGV2aWNlcyAqLwotCQkJaWYgKHRoaXMtPmNoaXBzaXplICYgMHgwYzAwMDAwMCkgCi0JCQkJd3JpdGViKCh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiAxNikgJiAweDBmKSwKLQkJCQkgICAgICAgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJfQotCQkvKiBMYXRjaCBpbiBhZGRyZXNzICovCi0JfQotCQotCS8qIAotCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgCi0JICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5Ci0JKi8KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCQotCWNhc2UgTkFORF9DTURfUEFHRVBST0c6Ci0JY2FzZSBOQU5EX0NNRF9FUkFTRTE6Ci0JY2FzZSBOQU5EX0NNRF9FUkFTRTI6Ci0JY2FzZSBOQU5EX0NNRF9TRVFJTjoKLQljYXNlIE5BTkRfQ01EX1NUQVRVUzoKLQkJcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9SRVNFVDoKLQkJaWYgKHRoaXMtPmRldl9yZWFkeSkJCi0JCQlicmVhazsKLQotCQl1ZGVsYXkodGhpcy0+Y2hpcF9kZWxheSk7Ci0JCXdyaXRlYihOQU5EX0NNRF9TVEFUVVMsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ01EKTsKLQotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7Ci0JCXJldHVybjsKLQotCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQorCQkvKiBOQU5EX0NUTF9DTFJDTEU6ICovCisJCS8qIE5BTkRfQ1RMX0NMUkFMRTogKi8KIAlkZWZhdWx0OgotCQkvKiAKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGJ1c3kgcGluLCB3ZSBhcHBseSB0aGUgZ2l2ZW4KLQkJICogY29tbWFuZCBkZWxheQotCQkqLwotCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgewotCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKLQkJCXJldHVybjsKLQkJfQkKKwkJY2hpcC0+SU9fQUREUl9XID0gaW5mby0+cmVncyArIFMzQzI0NDBfTkZEQVRBOworCQlicmVhazsKIAl9Ci0JCi0JLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KLQkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KLQluZGVsYXkgKDEwMCk7Ci0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwogfQogCi0KIC8qIHMzYzI0MTBfbmFuZF9kZXZyZWFkeSgpCiAgKgogICogcmV0dXJucyAwIGlmIHRoZSBuYW5kIGlzIGJ1c3ksIDEgaWYgaXQgaXMgcmVhZHkKQEAgLTM2OSw5ICszMjIsMTIgQEAKIHsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOwogCQorCWlmIChpbmZvLT5pc19zM2MyNDQwKQorCQlyZXR1cm4gcmVhZGIoaW5mby0+cmVncyArIFMzQzI0NDBfTkZTVEFUKSAmIFMzQzI0NDBfTkZTVEFUX1JFQURZOwogCXJldHVybiByZWFkYihpbmZvLT5yZWdzICsgUzNDMjQxMF9ORlNUQVQpICYgUzNDMjQxMF9ORlNUQVRfQlVTWTsKIH0KIAorCiAvKiBFQ0MgaGFuZGxpbmcgZnVuY3Rpb25zICovCiAKIHN0YXRpYyBpbnQgczNjMjQxMF9uYW5kX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsCkBAIC0zOTQsNiArMzUwLDEyIEBACiAJcmV0dXJuIC0xOwogfQogCisvKiBFQ0MgZnVuY3Rpb25zCisgKgorICogVGhlc2UgYWxsb3cgdGhlIHMzYzI0MTAgYW5kIHMzYzI0NDAgdG8gdXNlIHRoZSBjb250cm9sbGVyJ3MgRUNDCisgKiBnZW5lcmF0b3IgYmxvY2sgdG8gRUNDIHRoZSBkYXRhIGFzIGl0IHBhc3NlcyB0aHJvdWdoXQorKi8KKwogc3RhdGljIHZvaWQgczNjMjQxMF9uYW5kX2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKQEAgLTQwNCw2ICszNjYsMTUgQEAKIAl3cml0ZWwoY3RybCwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKIH0KIAorc3RhdGljIHZvaWQgczNjMjQ0MF9uYW5kX2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCit7CisJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisKKwljdHJsID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0NDBfTkZDT05UKTsKKwl3cml0ZWwoY3RybCB8IFMzQzI0NDBfTkZDT05UX0lOSVRFQ0MsIGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQ09OVCk7Cit9CisKIHN0YXRpYyBpbnQgczNjMjQxMF9uYW5kX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsCiAJCQkJICAgICAgY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpCiB7CkBAIC00MjAsNyArMzkxLDI2IEBACiB9CiAKIAotLyogb3Zlci1yaWRlIHRoZSBzdGFuZGFyZCBmdW5jdGlvbnMgZm9yIGEgbGl0dGxlIG1vcmUgc3BlZWQ/ICovCitzdGF0aWMgaW50IHMzYzI0NDBfbmFuZF9jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCSAgICAgIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7CisJdW5zaWduZWQgbG9uZyBlY2MgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORk1FQ0MwKTsKKworCWVjY19jb2RlWzBdID0gZWNjOworCWVjY19jb2RlWzFdID0gZWNjID4+IDg7CisJZWNjX2NvZGVbMl0gPSBlY2MgPj4gMTY7CisKKwlwcl9kZWJ1ZygiY2FsY3VsYXRlX2VjYzogcmV0dXJuaW5nIGVjYyAlMDJ4LCUwMngsJTAyeFxuIiwKKwkJIGVjY19jb2RlWzBdLCBlY2NfY29kZVsxXSwgZWNjX2NvZGVbMl0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogb3Zlci1yaWRlIHRoZSBzdGFuZGFyZCBmdW5jdGlvbnMgZm9yIGEgbGl0dGxlIG1vcmUgc3BlZWQuIFdlIGNhbgorICogdXNlIHJlYWQvd3JpdGUgYmxvY2sgdG8gbW92ZSB0aGUgZGF0YSBidWZmZXJzIHRvL2Zyb20gdGhlIGNvbnRyb2xsZXIKKyovCiAKIHN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC01MjMsMTEgKzUxMywxMCBAQAogewogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmbm10ZC0+Y2hpcDsKIAotCWNoaXAtPklPX0FERFJfUgkgICA9IChjaGFyICopaW5mby0+cmVncyArIFMzQzI0MTBfTkZEQVRBOwotCWNoaXAtPklPX0FERFJfVyAgICA9IChjaGFyICopaW5mby0+cmVncyArIFMzQzI0MTBfTkZEQVRBOworCWNoaXAtPklPX0FERFJfUgkgICA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKKwljaGlwLT5JT19BRERSX1cgICAgPSBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkRBVEE7CiAJY2hpcC0+aHdjb250cm9sICAgID0gczNjMjQxMF9uYW5kX2h3Y29udHJvbDsKIAljaGlwLT5kZXZfcmVhZHkgICAgPSBzM2MyNDEwX25hbmRfZGV2cmVhZHk7Ci0JY2hpcC0+Y21kZnVuYyAgICAgID0gczNjMjQxMF9uYW5kX2NvbW1hbmQ7CiAJY2hpcC0+d3JpdGVfYnVmICAgID0gczNjMjQxMF9uYW5kX3dyaXRlX2J1ZjsKIAljaGlwLT5yZWFkX2J1ZiAgICAgPSBzM2MyNDEwX25hbmRfcmVhZF9idWY7CiAJY2hpcC0+c2VsZWN0X2NoaXAgID0gczNjMjQxMF9uYW5kX3NlbGVjdF9jaGlwOwpAQCAtNTM2LDYgKzUyNSwxMiBAQAogCWNoaXAtPm9wdGlvbnMJICAgPSAwOwogCWNoaXAtPmNvbnRyb2xsZXIgICA9ICZpbmZvLT5jb250cm9sbGVyOwogCisJaWYgKGluZm8tPmlzX3MzYzI0NDApIHsKKwkJY2hpcC0+SU9fQUREUl9SCSA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GREFUQTsKKwkJY2hpcC0+SU9fQUREUl9XICA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GREFUQTsKKwkJY2hpcC0+aHdjb250cm9sICA9IHMzYzI0NDBfbmFuZF9od2NvbnRyb2w7CisJfQorCiAJbm10ZC0+aW5mbwkgICA9IGluZm87CiAJbm10ZC0+bXRkLnByaXYJICAgPSBjaGlwOwogCW5tdGQtPnNldAkgICA9IHNldDsKQEAgLTU0Niw2ICs1NDEsMTEgQEAKIAkJY2hpcC0+Y2FsY3VsYXRlX2VjYyA9IHMzYzI0MTBfbmFuZF9jYWxjdWxhdGVfZWNjOwogCQljaGlwLT5lY2Ntb2RlCSAgICA9IE5BTkRfRUNDX0hXM181MTI7CiAJCWNoaXAtPmF1dG9vb2IgICAgICAgPSAmbmFuZF9od19lY2Nvb2I7CisKKwkJaWYgKGluZm8tPmlzX3MzYzI0NDApIHsKKwkJCWNoaXAtPmVuYWJsZV9od2VjYyAgPSBzM2MyNDQwX25hbmRfZW5hYmxlX2h3ZWNjOworCQkJY2hpcC0+Y2FsY3VsYXRlX2VjYyA9IHMzYzI0NDBfbmFuZF9jYWxjdWxhdGVfZWNjOworCQl9CiAJfSBlbHNlIHsKIAkJY2hpcC0+ZWNjbW9kZQkgICAgPSBOQU5EX0VDQ19TT0ZUOwogCX0KQEAgLTU1OSw3ICs1NTksNyBAQAogICogbmFuZCBsYXllciB0byBsb29rIGZvciBkZXZpY2VzCiAqLwogCi1zdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHMzYzI0eHhfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpc19zM2MyNDQwKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kICpwbGF0ID0gdG9fbmFuZF9wbGF0KGRldik7CkBAIC01ODUsNiArNTg1LDcgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKIAogCXNwaW5fbG9ja19pbml0KCZpbmZvLT5jb250cm9sbGVyLmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNvbnRyb2xsZXIud3EpOwogCiAJLyogZ2V0IHRoZSBjbG9jayBzb3VyY2UgYW5kIGVuYWJsZSBpdCAqLwogCkBAIC02MDAsNyArNjAxLDggQEAKIAogCS8qIGFsbG9jYXRlIGFuZCBtYXAgdGhlIHJlc291cmNlICovCiAKLQlyZXMgPSBwZGV2LT5yZXNvdXJjZTsgIC8qIGFzc3VtZSB0aGF0IHRoZSBmbGFzaCBoYXMgb25lIHJlc291cmNlICovCisJLyogY3VycmVudGx5IHdlIGFzc3VtZSB3ZSBoYXZlIHRoZSBvbmUgcmVzb3VyY2UgKi8KKwlyZXMgID0gcGRldi0+cmVzb3VyY2U7CiAJc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CiAKIAlpbmZvLT5hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHNpemUsIHBkZXYtPm5hbWUpOwpAQCAtNjExLDkgKzYxMywxMCBAQAogCQlnb3RvIGV4aXRfZXJyb3I7CiAJfQogCi0JaW5mby0+ZGV2aWNlID0gZGV2OwotCWluZm8tPnBsYXRmb3JtID0gcGxhdDsKLQlpbmZvLT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpbmZvLT5kZXZpY2UgICAgID0gZGV2OworCWluZm8tPnBsYXRmb3JtICAgPSBwbGF0OworCWluZm8tPnJlZ3MgICAgICAgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHNpemUpOworCWluZm8tPmlzX3MzYzI0NDAgPSBpc19zM2MyNDQwOwogCiAJaWYgKGluZm8tPnJlZ3MgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVzZXJ2ZSByZWdpc3RlciByZWdpb25cbiIpOwpAQCAtNjc4LDYgKzY4MSwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIGRyaXZlciBkZXZpY2UgcmVnaXN0cmF0aW9uICovCisKK3N0YXRpYyBpbnQgczNjMjQxMF9uYW5kX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gczNjMjR4eF9uYW5kX3Byb2JlKGRldiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQ0MF9uYW5kX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gczNjMjR4eF9uYW5kX3Byb2JlKGRldiwgMSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDEwX25hbmRfZHJpdmVyID0gewogCS5uYW1lCQk9ICJzM2MyNDEwLW5hbmQiLAogCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLApAQCAtNjg1LDE0ICs3MDAsMjQgQEAKIAkucmVtb3ZlCQk9IHMzYzI0MTBfbmFuZF9yZW1vdmUsCiB9OwogCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgczNjMjQ0MF9uYW5kX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiczNjMjQ0MC1uYW5kIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gczNjMjQ0MF9uYW5kX3Byb2JlLAorCS5yZW1vdmUJCT0gczNjMjQxMF9uYW5kX3JlbW92ZSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHMzYzI0MTBfbmFuZF9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJTM0MyNDEwIE5BTkQgRHJpdmVyLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCXByaW50aygiUzNDMjRYWCBOQU5EIERyaXZlciwgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKworCWRyaXZlcl9yZWdpc3RlcigmczNjMjQ0MF9uYW5kX2RyaXZlcik7CiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmczNjMjQxMF9uYW5kX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNDEwX25hbmRfZXhpdCh2b2lkKQogeworCWRyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNDQwX25hbmRfZHJpdmVyKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmczNjMjQxMF9uYW5kX2RyaXZlcik7CiB9CiAKQEAgLTcwMSw0ICs3MjYsNCBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0MTAgTVREIE5BTkQgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0WFggTVREIE5BTkQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYyBiL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMjk1NzI3OS4uOTg1M2I4NwotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFJpY2hhcmQgUHVyZGllCiAgKgotICogICRJZDogc2hhcnBzbC5jLHYgMS4zIDIwMDUvMDEvMDMgMTQ6NTM6NTAgcnB1cmRpZSBFeHAgJAorICogICRJZDogc2hhcnBzbC5jLHYgMS40IDIwMDUvMDEvMjMgMTE6MDk6MTkgcnB1cmRpZSBFeHAgJAogICoKICAqICBCYXNlZCBvbiBTaGFycCdzIE5BTkQgZHJpdmVyIHNoYXJwX3NsLmMKICAqCkBAIC0yMTYsNyArMjE2LDcgQEAKIAkJbnJfcGFydGl0aW9ucyA9IERFRkFVTFRfTlVNX1BBUlRJVElPTlM7CiAJCXNoYXJwc2xfcGFydGl0aW9uX2luZm8gPSBzaGFycHNsX25hbmRfZGVmYXVsdF9wYXJ0aXRpb25faW5mbzsKIAkJaWYgKG1hY2hpbmVfaXNfcG9vZGxlKCkpIHsKLQkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZT0yMiAqIDEwMjQgKiAxMDI0OworCQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mb1sxXS5zaXplPTMwICogMTAyNCAqIDEwMjQ7CiAJCX0gZWxzZSBpZiAobWFjaGluZV9pc19jb3JnaSgpIHx8IG1hY2hpbmVfaXNfc2hlcGhlcmQoKSkgewogCQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mb1sxXS5zaXplPTI1ICogMTAyNCAqIDEwMjQ7CiAJCX0gZWxzZSBpZiAobWFjaGluZV9pc19odXNreSgpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3R4NDkyNW5kZm1jLmMgYi9kcml2ZXJzL210ZC9uYW5kL3R4NDkyNW5kZm1jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTY4ODguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC90eDQ5MjVuZGZtYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qCi0gKiAgZHJpdmVycy9tdGQvdHg0OTI1bmRmbWMuYwotICoKLSAqICBPdmVydmlldzoKLSAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKLSAqICAgVG9zaGliYSBSQlRYNDkyNSByZWZlcmVuY2UgYm9hcmQsIHdoaWNoIGlzIGEgU21hcnRNZWRpYUNhcmQuIEl0IHN1cHBvcnRzIAotICogICAxNk1pQiwgMzJNaUIgYW5kIDY0TWlCIGNhcmRzLgotICoKLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgc291cmNlQG12aXN0YS5jb20KLSAqCi0gKiBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvYXV0Y3B1MTIuYwotICogICAgICAgQ29weXJpZ2h0IChjKSAyMDAxIFRob21hcyBHbGVpeG5lciAoZ2xlaXhuZXJAYXV0cm9uaXguZGUpCi0gKgotICogJElkOiB0eDQ5MjVuZGZtYy5jLHYgMS41IDIwMDQvMTAvMDUgMTM6NTA6MjAgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbiAKLSAqIAotICogMjAwMyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90eDQ5MjUvdHg0OTI1X25hbmQuaD4KLQotZXh0ZXJuIHN0cnVjdCBuYW5kX29vYmluZm8gamZmczJfb29iaW5mbzsKLQotLyoKLSAqIE1URCBzdHJ1Y3R1cmUgZm9yIFJCVFg0OTI1IGJvYXJkCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnR4NDkyNW5kZm1jX210ZCA9IE5VTEw7Ci0KLS8qCi0gKiBEZWZpbmUgcGFydGl0aW9ucyBmb3IgZmxhc2ggZGV2aWNlcwotICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mbzE2a1tdID0gewotCXsgLm5hbWUgPSAiUkJUWDQ5MjUgZmxhc2ggcGFydGl0aW9uIDEiLAotCSAgLm9mZnNldCA9ICAwLAotCSAgLnNpemUgPSAgICA4ICogMHgwMDEwMDAwMCB9LAotCXsgLm5hbWUgPSAiUkJUWDQ5MjUgZmxhc2ggcGFydGl0aW9uIDIiLAotCSAgLm9mZnNldCA9ICA4ICogMHgwMDEwMDAwMCwKLQkgIC5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mbzMya1tdID0gewotCXsgLm5hbWUgPSAiUkJUWDQ5MjUgZmxhc2ggcGFydGl0aW9uIDEiLAotCSAgLm9mZnNldCA9ICAwLAotCSAgLnNpemUgPSAgICA4ICogMHgwMDEwMDAwMCB9LAotCXsgLm5hbWUgPSAiUkJUWDQ5MjUgZmxhc2ggcGFydGl0aW9uIDIiLAotCSAgLm9mZnNldCA9IDggKiAweDAwMTAwMDAwLAotCSAgLnNpemUgPSAgMjQgKiAweDAwMTAwMDAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm82NGtbXSA9IHsKLQl7IC5uYW1lID0gIlVzZXIgRlMiLAotCSAgLm9mZnNldCA9ICAwLAotCSAgLnNpemUgPSAgIDE2ICogMHgwMDEwMDAwMCB9LAotCXsgLm5hbWUgPSAiUkJUWDQ5MjUgZmxhc2ggcGFydGl0aW9uIDIiLAotCSAgLm9mZnNldCA9IDE2ICogMHgwMDEwMDAwMCwKLQkgIC5zaXplID0gICA0OCAqIDB4MDAxMDAwMDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvMTI4a1tdID0gewotCXsgLm5hbWUgPSAiU2tpcCBiYWQgc2VjdGlvbiIsCi0JICAub2Zmc2V0ID0gIDAsCi0JICAuc2l6ZSA9ICAgMTYgKiAweDAwMTAwMDAwIH0sCi0JeyAubmFtZSA9ICJVc2VyIEZTIiwKLQkgIC5vZmZzZXQgPSAxNiAqIDB4MDAxMDAwMDAsCi0JICAuc2l6ZSA9ICAgMTEyICogMHgwMDEwMDAwMCB9LAotfTsKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMxNksgIDIKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMzMksgIDIKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlM2NEsgIDIKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMxMjhLIDIKLQotLyogCi0gKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcwotKi8KLXN0YXRpYyB2b2lkIHR4NDkyNW5kZm1jX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKLXsKLQotCXN3aXRjaChjbWQpewotCi0JCWNhc2UgTkFORF9DVExfU0VUQ0xFOiAKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfQ0xFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQ0xFOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfQ0xFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUQUxFOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9BTEU7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJBTEU6IAotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUTkNFOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUk5DRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0NFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUV1A6Ci0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX1dFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSV1A6Ci0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCX0KLX0KLQotLyoKLSoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCi0qLwotc3RhdGljIGludCB0eDQ5MjVuZGZtY19kZXZpY2VfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCi17Ci0JaW50IHJlYWR5OwotCXJlYWR5ID0gKHR4NDkyNV9uZGZtY3B0ci0+c3IgJiBUWDQ5MjVfTkRTRlJfQlVTWSkgPyAwIDogMTsKLQlyZXR1cm4gcmVhZHk7Ci19Ci12b2lkIHR4NDkyNW5kZm1jX2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCi17Ci0JLyogcmVzZXQgZmlyc3QgKi8KLQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX01BU0s7Ci0JdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfRUNDX0NOVExfTUFTSzsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX0VOQUI7Ci19Ci1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19kaXNhYmxlX2VjYyh2b2lkKQotewotCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX01BU0s7Ci19Ci1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19lbmFibGVfcmVhZF9lY2Modm9pZCkKLXsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9NQVNLOwotCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfRUNDX0NOVExfUkVBRDsKLX0KLXZvaWQgdHg0OTI1bmRmbWNfcmVhZGVjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpewotCWludCBpOwotCXVfY2hhciAqZWNjID0gZWNjX2NvZGU7Ci0gICAgICAgIHR4NDkyNW5kZm1jX2VuYWJsZV9yZWFkX2VjYygpOwotCWZvciAoaSA9IDA7aSA8IDY7aSsrLGVjYysrKQotCQkqZWNjID0gdHg0OTI1X3JlYWRfbmZtYygmKHR4NDkyNV9uZGZtY3B0ci0+ZHRyKSk7Ci0gICAgICAgIHR4NDkyNW5kZm1jX2Rpc2FibGVfZWNjKCk7Ci19Ci12b2lkIHR4NDkyNW5kZm1jX2RldmljZV9zZXR1cCh2b2lkKQotewotCi0JKih1bnNpZ25lZCBjaGFyICopMHhiYjAwNTAwMCAmPSB+MHgwODsKLQotICAgICAgICAvKiByZXNldCBOREZNQyAqLwotICAgICAgICB0eDQ5MjVfbmRmbWNwdHItPnJzdHIgfD0gVFg0OTI1X05ERlJTVFJfUlNUOwotCXdoaWxlICh0eDQ5MjVfbmRmbWNwdHItPnJzdHIgJiBUWDQ5MjVfTkRGUlNUUl9SU1QpOyAgICAgICAKLQotCS8qIHNldHVwIEJ1c1NlcGFyZXRlLCBIb2xkIFRpbWUsIFN0cm9iZSBQdWxzZSBXaWR0aCAqLwotCXR4NDkyNV9uZGZtY3B0ci0+bWNyID0gVFg0OTI1X0JTUFJUID8gVFg0OTI1X05ERk1DUl9CU1BSVCA6IDA7Ci0JdHg0OTI1X25kZm1jcHRyLT5zcHIgPSBUWDQ5MjVfSE9MRCA8PCA0IHwgVFg0OTI1X1NQVzsgICAgICAgICAgICAgCi19Ci1zdGF0aWMgdV9jaGFyIHR4NDkyNW5kZm1jX25hbmRfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotICAgICAgICBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotICAgICAgICByZXR1cm4gdHg0OTI1X3JlYWRfbmZtYyh0aGlzLT5JT19BRERSX1IpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19uYW5kX3dyaXRlX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciBieXRlKQotewotICAgICAgICBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotICAgICAgICB0eDQ5MjVfd3JpdGVfbmZtYyhieXRlLCB0aGlzLT5JT19BRERSX1cpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19uYW5kX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCWZvciAoaT0wOyBpPGxlbjsgaSsrKQotCQl0eDQ5MjVfd3JpdGVfbmZtYyhidWZbaV0sIHRoaXMtPklPX0FERFJfVyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkyNW5kZm1jX25hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJYnVmW2ldID0gdHg0OTI1X3JlYWRfbmZtYyh0aGlzLT5JT19BRERSX1IpOwotfQotCi1zdGF0aWMgaW50IHR4NDkyNW5kZm1jX25hbmRfdmVyaWZ5X2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCWZvciAoaT0wOyBpPGxlbjsgaSsrKQotCQlpZiAoYnVmW2ldICE9IHR4NDkyNV9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZW5kIGNvbW1hbmQgdG8gTkFORCBkZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfbmFuZF9jb21tYW5kIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwgaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JLyogQmVnaW4gY29tbWFuZCBsYXRjaCBjeWNsZSAqLwotCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7Ci0JLyoKLQkgKiBXcml0ZSBvdXQgdGhlIGNvbW1hbmQgdG8gdGhlIGRldmljZS4KLQkgKi8KLQlpZiAoY29tbWFuZCA9PSBOQU5EX0NNRF9TRVFJTikgewotCQlpbnQgcmVhZGNtZDsKLQotCQlpZiAoY29sdW1uID49IG10ZC0+b29iYmxvY2spIHsKLQkJCS8qIE9PQiBhcmVhICovCi0JCQljb2x1bW4gLT0gbXRkLT5vb2JibG9jazsKLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFET09COwotCQl9IGVsc2UgaWYgKGNvbHVtbiA8IDI1NikgewotCQkJLyogRmlyc3QgMjU2IGJ5dGVzIC0tPiBSRUFEMCAqLwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQUQwOwotCQl9IGVsc2UgewotCQkJY29sdW1uIC09IDI1NjsKLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMTsKLQkJfQotCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgcmVhZGNtZCk7Ci0JfQotCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb21tYW5kKTsKLQotCS8qIFNldCBBTEUgYW5kIGNsZWFyIENMRSB0byBzdGFydCBhZGRyZXNzIGN5Y2xlICovCi0JdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQotCWlmIChjb2x1bW4gIT0gLTEgfHwgcGFnZV9hZGRyICE9IC0xKSB7Ci0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVEFMRSk7Ci0KLQkJLyogU2VyaWFsbHkgaW5wdXQgYWRkcmVzcyAqLwotCQlpZiAoY29sdW1uICE9IC0xKQotCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbHVtbik7Ci0JCWlmIChwYWdlX2FkZHIgIT0gLTEpIHsKLQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKHBhZ2VfYWRkciAmIDB4ZmYpKTsKLQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gOCkgJiAweGZmKSk7Ci0JCQkvKiBPbmUgbW9yZSBhZGRyZXNzIGN5Y2xlIGZvciBoaWdoZXIgZGVuc2l0eSBkZXZpY2VzICovCi0JCQlpZiAobXRkLT5zaXplICYgMHgwYzAwMDAwMCkgCi0JCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiAxNikgJiAweDBmKSk7Ci0JCX0KLQkJLyogTGF0Y2ggaW4gYWRkcmVzcyAqLwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOwotCX0KLQkKLQkvKiAKLQkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzIAotCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQotCSovCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JCQkKLQljYXNlIE5BTkRfQ01EX1BBR0VQUk9HOgotCQkvKiBUdXJuIG9mZiBXRSAqLwotCQl0aGlzLT5od2NvbnRyb2wgKG10ZCwgTkFORF9DVExfQ0xSV1ApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWNhc2UgTkFORF9DTURfU0VRSU46Ci0JCS8qIFR1cm4gb24gV0UgKi8KLQkJdGhpcy0+aHdjb250cm9sIChtdGQsIE5BTkRfQ1RMX1NFVFdQKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX0VSQVNFMToKLQljYXNlIE5BTkRfQ01EX0VSQVNFMjoKLQljYXNlIE5BTkRfQ01EX1NUQVRVUzoKLQkJcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9SRVNFVDoKLQkJaWYgKHRoaXMtPmRldl9yZWFkeSkJCi0JCQlicmVhazsKLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQ0xFKTsKLQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIE5BTkRfQ01EX1NUQVRVUyk7Ci0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7Ci0JCXdoaWxlICggISh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIDB4NDApKTsKLQkJcmV0dXJuOwotCi0JLyogVGhpcyBhcHBsaWVzIHRvIHJlYWQgY29tbWFuZHMgKi8JCi0JZGVmYXVsdDoKLQkJLyogCi0JCSAqIElmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBidXN5IHBpbiwgd2UgYXBwbHkgdGhlIGdpdmVuCi0JCSAqIGNvbW1hbmQgZGVsYXkKLQkJKi8KLQkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIHsKLQkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7Ci0JCQlyZXR1cm47Ci0JCX0JCi0JfQotCQotCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgKi8KLQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKLX0KLQotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotZXh0ZXJuIGludCBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsIHN0cnVjdCBtdGRfcGFydGl0aW8KLW4gKipwcGFydHMsIGNoYXIgKik7Ci0jZW5kaWYKLQotLyoKLSAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQotICovCi1leHRlcm4gaW50IG5hbmRfY29ycmVjdF9kYXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYyk7Ci1pbnQgX19pbml0IHR4NDkyNW5kZm1jX2luaXQgKHZvaWQpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQlpbnQgZXJyID0gMDsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTVREIGRldmljZSBzdHJ1Y3R1cmUgYW5kIHByaXZhdGUgZGF0YSAqLwotCXR4NDkyNW5kZm1jX210ZCA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICsgc2l6ZW9mIChzdHJ1Y3QgbmFuZF9jaGlwKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXR4NDkyNW5kZm1jX210ZCkgewotCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgUkJUWDQ5MjUgTkFORCBNVEQgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLSAgICAgICAgdHg0OTI1bmRmbWNfZGV2aWNlX3NldHVwKCk7Ci0KLQkvKiBpbyBpcyBpbmRpcmVjdCB2aWEgYSByZWdpc3RlciBzbyBkb24ndCBuZWVkIHRvIGlvcmVtYXAgYWRkcmVzcyAqLwotCi0JLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCi0JdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmdHg0OTI1bmRmbWNfbXRkWzFdKTsKLQotCS8qIEluaXRpYWxpemUgc3RydWN0dXJlcyAqLwotCW1lbXNldCgoY2hhciAqKSB0eDQ5MjVuZGZtY19tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQoKGNoYXIgKikgdGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKLQotCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCi0JdHg0OTI1bmRmbWNfbXRkLT5wcml2ID0gdGhpczsKLQotCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KLQl0aGlzLT5JT19BRERSX1IgPSAodm9pZCBfX2lvbWVtICopJih0eDQ5MjVfbmRmbWNwdHItPmR0cik7Ci0JdGhpcy0+SU9fQUREUl9XID0gKHZvaWQgX19pb21lbSAqKSYodHg0OTI1X25kZm1jcHRyLT5kdHIpOwotCXRoaXMtPmh3Y29udHJvbCA9IHR4NDkyNW5kZm1jX2h3Y29udHJvbDsKLQl0aGlzLT5lbmFibGVfaHdlY2MgPSB0eDQ5MjVuZGZtY19lbmFibGVfaHdlY2M7Ci0JdGhpcy0+Y2FsY3VsYXRlX2VjYyA9IHR4NDkyNW5kZm1jX3JlYWRlY2M7Ci0JdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7Ci0JdGhpcy0+ZWNjbW9kZSA9IE5BTkRfRUNDX0hXNl81MTI7CQotCXRoaXMtPmRldl9yZWFkeSA9IHR4NDkyNW5kZm1jX2RldmljZV9yZWFkeTsKLQkvKiAyMCB1cyBjb21tYW5kIGRlbGF5IHRpbWUgKi8KLQl0aGlzLT5jaGlwX2RlbGF5ID0gMjA7CQkKLSAgICAgICAgdGhpcy0+cmVhZF9ieXRlID0gdHg0OTI1bmRmbWNfbmFuZF9yZWFkX2J5dGU7Ci0gICAgICAgIHRoaXMtPndyaXRlX2J5dGUgPSB0eDQ5MjVuZGZtY19uYW5kX3dyaXRlX2J5dGU7Ci0JdGhpcy0+Y21kZnVuYyA9IHR4NDkyNW5kZm1jX25hbmRfY29tbWFuZDsKLQl0aGlzLT53cml0ZV9idWYgPSB0eDQ5MjVuZGZtY19uYW5kX3dyaXRlX2J1ZjsKLQl0aGlzLT5yZWFkX2J1ZiA9IHR4NDkyNW5kZm1jX25hbmRfcmVhZF9idWY7Ci0JdGhpcy0+dmVyaWZ5X2J1ZiA9IHR4NDkyNW5kZm1jX25hbmRfdmVyaWZ5X2J1ZjsKLQotCS8qIFNjYW4gdG8gZmluZCBleGlzdGFuY2Ugb2YgdGhlIGRldmljZSAqLwotCWlmIChuYW5kX3NjYW4gKHR4NDkyNW5kZm1jX210ZCwgMSkpIHsKLQkJZXJyID0gLUVOWElPOwotCQlnb3RvIG91dF9pb3I7Ci0JfQotCi0JLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBtdGRfcGFydHNfbmIgPSAwOwotICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgPSAwOwotICAgICAgICAgICAgICAgIG10ZF9wYXJ0c19uYiA9IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsICZtdGRfcGFydHMsICJ0eDQ5MjVuZGZtYyIpOwotICAgICAgICAgICAgICAgIGlmIChtdGRfcGFydHNfbmIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkX210ZF9wYXJ0aXRpb25zKHR4NDkyNW5kZm1jX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tdGRfZGV2aWNlKHR4NDkyNW5kZm1jX210ZCk7Ci0gICAgICAgIH0KLSNlbHNlIC8qIGlmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUyAqLwotCXN3aXRjaCh0eDQ5MjVuZGZtY19tdGQtPnNpemUpewotCQljYXNlIDB4MDEwMDAwMDA6IGFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsIHBhcnRpdGlvbl9pbmZvMTZrLCBOVU1fUEFSVElUSU9OUzE2Syk7IGJyZWFrOwotCQljYXNlIDB4MDIwMDAwMDA6IGFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsIHBhcnRpdGlvbl9pbmZvMzJrLCBOVU1fUEFSVElUSU9OUzMySyk7IGJyZWFrOwotCQljYXNlIDB4MDQwMDAwMDA6IGFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsIHBhcnRpdGlvbl9pbmZvNjRrLCBOVU1fUEFSVElUSU9OUzY0Syk7IGJyZWFrOyAKLQkJY2FzZSAweDA4MDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzEyOGssIE5VTV9QQVJUSVRJT05TMTI4Syk7IGJyZWFrOyAKLQkJZGVmYXVsdDogewotCQkJcHJpbnRrICgiVW5zdXBwb3J0ZWQgU21hcnRNZWRpYSBkZXZpY2VcbiIpOyAKLQkJCWVyciA9IC1FTlhJTzsKLQkJCWdvdG8gb3V0X2lvcjsKLQkJfQotCX0KLSNlbmRpZiAvKiBpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgKi8KLQlnb3RvIG91dDsKLQotb3V0X2lvcjoKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1tb2R1bGVfaW5pdCh0eDQ5MjVuZGZtY19pbml0KTsKLQotLyoKLSAqIENsZWFuIHVwIHJvdXRpbmUKLSAqLwotI2lmZGVmIE1PRFVMRQotc3RhdGljIHZvaWQgX19leGl0IHR4NDkyNW5kZm1jX2NsZWFudXAgKHZvaWQpCi17Ci0JLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCi0JbmFuZF9yZWxlYXNlICh0eDQ5MjVuZGZtY19tdGQpOwotCi0JLyogRnJlZSB0aGUgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KLQlrZnJlZSAodHg0OTI1bmRmbWNfbXRkKTsKLX0KLW1vZHVsZV9leGl0KHR4NDkyNW5kZm1jX2NsZWFudXApOwotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFsaWNlIEhlbm5lc3N5IDxhaGVubmVzc3lAbXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR2x1ZSBsYXllciBmb3IgU21hcnRNZWRpYUNhcmQgb24gVG9zaGliYSBSQlRYNDkyNSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90eDQ5MzhuZGZtYy5jIGIvZHJpdmVycy9tdGQvbmFuZC90eDQ5MzhuZGZtYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI2ZTU4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKgotICogZHJpdmVycy9tdGQvbmFuZC90eDQ5MzhuZGZtYy5jCi0gKgotICogIE92ZXJ2aWV3OgotICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGNvbm5lY3RlZCB0bwotICogICBUWDQ5MzggaW50ZXJuYWwgTkFORCBNZW1vcnkgQ29udHJvbGxlci4KLSAqICAgVFg0OTM4IE5ERk1DIGlzIGFsbW9zdCBzYW1lIGFzIFRYNDkyNSBOREZNQywgYnV0IHJlZ2lzdGVyIHNpemUgYXJlIDY0IGJpdC4KLSAqCi0gKiBBdXRob3I6IHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogQmFzZWQgb24gc3BpYS5jIGJ5IFN0ZXZlbiBKLiBIaWxsCi0gKgotICogJElkOiB0eDQ5MzhuZGZtYy5jLHYgMS40IDIwMDQvMTAvMDUgMTM6NTA6MjAgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uIAotICoKLSAqIDIwMDMgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCi0gKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdHg0OTM4L3JidHg0OTM4Lmg+Ci0KLWV4dGVybiBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGpmZnMyX29vYmluZm87Ci0KLS8qCi0gKiBNVEQgc3RydWN0dXJlIGZvciBUWDQ5MzggTkRGTUMKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqdHg0OTM4bmRmbWNfbXRkOwotCi0vKgotICogRGVmaW5lIHBhcnRpdGlvbnMgZm9yIGZsYXNoIGRldmljZQotICovCi0jZGVmaW5lIGZsdXNoX3diKCkJKHZvaWQpdHg0OTM4X25kZm1jcHRyLT5tY3I7Ci0KLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMgIAkzCi0jZGVmaW5lIE5VTUJFUl9PRl9DSVNfQkxPQ0tTCTI0Ci0jZGVmaW5lIFNJWkVfT0ZfQkxPQ0sJCTB4MDAwMDQwMDAKLSNkZWZpbmUgTlVNQkVSX09GX0JMT0NLX1BFUl9aT05FIDEwMjQKLSNkZWZpbmUgU0laRV9PRl9aT05FCQkoTlVNQkVSX09GX0JMT0NLX1BFUl9aT05FICogU0laRV9PRl9CTE9DSykKLSNpZm5kZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0vKgotICogWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBzYW1wbGUgb2YgTVREIHBhcnRpdGlvbnMgCi0gKiBvbiB0aGUgTkFORCBGbGFzaCBNZW1vcnkgMzJNQiBvciBtb3JlLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgZmlndXJlIHNob3dzIHRoZSBpbWFnZSBvZiB0aGUgc2FtcGxlIHBhcnRpdGlvbiBvbgotICogdGhlIDMyTUIgTkFORCBGbGFzaCBNZW1vcnkuIAotICoKLSAqICAgQmxvY2sgTm8uCi0gKiAgICAwICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgLS0tLS0tCi0gKiAgICAgIHwgICAgICAgICAgICAgQ0lTICAgICAgICAgICAgIHwgICBeCi0gKiAgIDI0ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICB8Ci0gKiAgICAgIHwgICAgICAgICBrZXJuZWwgaW1hZ2UgICAgICAgIHwgICB8IFpvbmUgMAotICogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgfAotICogMTAyMyB8ICAgICAgICAgdW51c2VkIGFyZWEgICAgICAgICB8ICAgdgotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLQotICogMTAyNCB8ICAgICAgICAgICAgSkZGUzIgICAgICAgICAgICB8ICAgXgotICogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAotICogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCBab25lIDEKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHYKLSAqIDIwNDcgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAtLS0tLS0KLSAqCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tOVU1fUEFSVElUSU9OU10gPSB7Ci0JewotCQkubmFtZSA9ICJSQlRYNDkzOCBDSVMgQXJlYSIsCi0gCQkub2Zmc2V0ID0gIDAsCi0gCQkuc2l6ZSA9ICAgIChOVU1CRVJfT0ZfQ0lTX0JMT0NLUyAqIFNJWkVfT0ZfQkxPQ0spLAotIAkJLm1hc2tfZmxhZ3MgID0gTVREX1dSSVRFQUJMRQkvKiBUaGlzIHBhcnRpdGlvbiBpcyBOT1Qgd3JpdGFibGUgKi8KLSAJfSwKLSAJewotIAkJLm5hbWUgPSAiUkJUWDQ5Mzgga2VybmVsIGltYWdlIiwKLSAJCS5vZmZzZXQgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotIAkJLnNpemUgPSAgICA4ICogMHgwMDEwMDAwMCwJLyogOE1CIChEZXBlbmRzIG9uIHNpemUgb2Yga2VybmVsIGltYWdlKSAqLwotIAkJLm1hc2tfZmxhZ3MgID0gTVREX1dSSVRFQUJMRQkvKiBUaGlzIHBhcnRpdGlvbiBpcyBOT1Qgd3JpdGFibGUgKi8KLSAJfSwKLSAJewotIAkJLm5hbWUgPSAiUm9vdCBGUyAoSkZGUzIpIiwKLSAJCS5vZmZzZXQgPSAgKDAgKyBTSVpFX09GX1pPTkUpLCAgICAvKiBzdGFydCBhZGRyZXNzIG9mIG5leHQgem9uZSAqLwotIAkJLnNpemUgPSAgICBNVERQQVJUX1NJWl9GVUxMCi0gCX0sCi19OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHR4NDkzOG5kZm1jX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIE5BTkRfQ1RMX1NFVENMRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyIHw9IFRYNDkzOF9OREZNQ1JfQ0xFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQ0xFOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgJj0gflRYNDkzOF9OREZNQ1JfQ0xFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUQUxFOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgfD0gVFg0OTM4X05ERk1DUl9BTEU7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJBTEU6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciAmPSB+VFg0OTM4X05ERk1DUl9BTEU7Ci0JCQlicmVhazsKLQkJLyogVFg0OTM4X05ERk1DUl9DRSBiaXQgaXMgMDpoaWdoIDE6bG93ICovCi0JCWNhc2UgTkFORF9DVExfU0VUTkNFOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgfD0gVFg0OTM4X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUk5DRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MzhfTkRGTUNSX0NFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUV1A6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciB8PSBUWDQ5MzhfTkRGTUNSX1dFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSV1A6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciAmPSB+VFg0OTM4X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCX0KLX0KLXN0YXRpYyBpbnQgdHg0OTM4bmRmbWNfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCWZsdXNoX3diKCk7Ci0JcmV0dXJuICEodHg0OTM4X25kZm1jcHRyLT5zciAmIFRYNDkzOF9OREZTUl9CVVNZKTsKLX0KLXN0YXRpYyB2b2lkIHR4NDkzOG5kZm1jX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQotewotCXUzMiBtY3IgPSB0eDQ5MzhfbmRmbWNwdHItPm1jcjsKLQltY3IgJj0gflRYNDkzOF9OREZNQ1JfRUNDX0FMTDsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX09GRjsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX1JFQUQ7Ci0JZWNjX2NvZGVbMV0gPSB0eDQ5MzhfbmRmbWNwdHItPmR0cjsKLQllY2NfY29kZVswXSA9IHR4NDkzOF9uZGZtY3B0ci0+ZHRyOwotCWVjY19jb2RlWzJdID0gdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19PRkY7Ci19Ci1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQotewotCXUzMiBtY3IgPSB0eDQ5MzhfbmRmbWNwdHItPm1jcjsKLQltY3IgJj0gflRYNDkzOF9OREZNQ1JfRUNDX0FMTDsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX1JFU0VUOwotCXR4NDkzOF9uZGZtY3B0ci0+bWNyID0gbWNyIHwgVFg0OTM4X05ERk1DUl9FQ0NfT0ZGOwotCXR4NDkzOF9uZGZtY3B0ci0+bWNyID0gbWNyIHwgVFg0OTM4X05ERk1DUl9FQ0NfT047Ci19Ci0KLXN0YXRpYyB1X2NoYXIgdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQlyZXR1cm4gdHg0OTM4X3JlYWRfbmZtYyh0aGlzLT5JT19BRERSX1IpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19uYW5kX3dyaXRlX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciBieXRlKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0JdHg0OTM4X3dyaXRlX25mbWMoYnl0ZSwgdGhpcy0+SU9fQUREUl9XKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJdHg0OTM4X3dyaXRlX25mbWMoYnVmW2ldLCB0aGlzLT5JT19BRERSX1cpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19uYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCWJ1ZltpXSA9IHR4NDkzOF9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIGludCB0eDQ5MzhuZGZtY19uYW5kX3ZlcmlmeV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJaWYgKGJ1ZltpXSAhPSB0eDQ5MzhfcmVhZF9uZm1jKHRoaXMtPklPX0FERFJfUikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIHR4NDkzOG5kZm1jX25hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCS8qIEJlZ2luIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KLQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCi0JICovCi0JaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfU0VRSU4pIHsKLQkJaW50IHJlYWRjbWQ7Ci0KLQkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7Ci0JCQkvKiBPT0IgYXJlYSAqLwotCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKLQkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKLQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbiAtPSAyNTY7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7Ci0JCX0KLQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIHJlYWRjbWQpOwotCX0KLQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29tbWFuZCk7Ci0KLQkvKiBTZXQgQUxFIGFuZCBjbGVhciBDTEUgdG8gc3RhcnQgYWRkcmVzcyBjeWNsZSAqLwotCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7Ci0KLQlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgewotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRBTEUpOwotCi0JCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KLQkJaWYgKGNvbHVtbiAhPSAtMSkKLQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb2x1bW4pOwotCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpIChwYWdlX2FkZHIgJiAweGZmKSk7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDgpICYgMHhmZikpOwotCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgaGlnaGVyIGRlbnNpdHkgZGV2aWNlcyAqLwotCQkJaWYgKG10ZC0+c2l6ZSAmIDB4MGMwMDAwMDApIAotCQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gMTYpICYgMHgwZikpOwotCQl9Ci0JCS8qIExhdGNoIGluIGFkZHJlc3MgKi8KLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKLQl9Ci0JCi0JLyogCi0JICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycyAKLQkgKiBzdGF0dXMgYW5kIHNlcXVlbnRpYWwgaW4gbmVlZHMgbm8gZGVsYXkKLQkqLwotCXN3aXRjaCAoY29tbWFuZCkgewotCQkJCi0JY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzoKLQkJLyogVHVybiBvZmYgV0UgKi8KLQkJdGhpcy0+aHdjb250cm9sIChtdGQsIE5BTkRfQ1RMX0NMUldQKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX1NFUUlOOgotCQkvKiBUdXJuIG9uIFdFICovCi0JCXRoaXMtPmh3Y29udHJvbCAobXRkLCBOQU5EX0NUTF9TRVRXUCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9FUkFTRTE6Ci0JY2FzZSBOQU5EX0NNRF9FUkFTRTI6Ci0JY2FzZSBOQU5EX0NNRF9TVEFUVVM6Ci0JCXJldHVybjsKLQotCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWlmICh0aGlzLT5kZXZfcmVhZHkpCQotCQkJYnJlYWs7Ci0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7Ci0JCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9TVEFUVVMpOwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7Ci0JCXJldHVybjsKLQotCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQotCWRlZmF1bHQ6Ci0JCS8qIAotCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgotCQkgKiBjb21tYW5kIGRlbGF5Ci0JCSovCi0JCWlmICghdGhpcy0+ZGV2X3JlYWR5KSB7Ci0JCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwotCQkJcmV0dXJuOwotCQl9CQotCX0KLQkKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCi0Jd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLWV4dGVybiBpbnQgcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywgY2hhciAqKTsKLSNlbmRpZgotLyoKLSAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQotICovCi1pbnQgX19pbml0IHR4NDkzOG5kZm1jX2luaXQgKHZvaWQpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQlpbnQgYnNwcnQgPSAwLCBob2xkID0gMHhmLCBzcHcgPSAweGY7Ci0JaW50IHByb3RlY3RlZCA9IDA7Ci0KLQlpZiAoKCpyYnR4NDkzOF9waW9zZWxfcHRyICYgMHgwYykgIT0gMHgwOCkgewotCQlwcmludGsoIlRYNDkzOCBOREZNQzogZGlzYWJsZWQgYnkgSU9DIFBJT1NFTFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlic3BydCA9IDE7Ci0JaG9sZCA9IDI7Ci0Jc3B3ID0gOSAtIDE7CS8qIDggR0JVU0NMSyA9IDgwbnMgKEAgR0JVU0NMSyAxMDBNSHopICovCi0KLQlpZiAoKHR4NDkzOF9jY2ZncHRyLT5wY2ZnICYKLQkgICAgIChUWDQ5MzhfUENGR19BVEFfU0VMfFRYNDkzOF9QQ0ZHX0lTQV9TRUx8VFg0OTM4X1BDRkdfTkRGX1NFTCkpCi0JICAgICE9IFRYNDkzOF9QQ0ZHX05ERl9TRUwpIHsKLQkJcHJpbnRrKCJUWDQ5MzggTkRGTUM6IGRpc2FibGVkIGJ5IFBDRkcuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogcmVzZXQgTkRGTUMgKi8KLQl0eDQ5MzhfbmRmbWNwdHItPnJzdHIgfD0gVFg0OTM4X05ERlJTVFJfUlNUOwotCXdoaWxlICh0eDQ5MzhfbmRmbWNwdHItPnJzdHIgJiBUWDQ5MzhfTkRGUlNUUl9SU1QpCi0JCTsKLQkvKiBzZXR1cCBCdXNTZXBhcmV0ZSwgSG9sZCBUaW1lLCBTdHJvYmUgUHVsc2UgV2lkdGggKi8KLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IGJzcHJ0ID8gVFg0OTM4X05ERk1DUl9CU1BSVCA6IDA7Ci0JdHg0OTM4X25kZm1jcHRyLT5zcHIgPSBob2xkIDw8IDQgfCBzcHc7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KLQl0eDQ5MzhuZGZtY19tdGQgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eDQ5MzhuZGZtY19tdGQpIHsKLQkJcHJpbnRrICgiVW5hYmxlIHRvIGFsbG9jYXRlIFRYNDkzOCBOREZNQyBNVEQgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBHZXQgcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KLQl0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikgKCZ0eDQ5MzhuZGZtY19tdGRbMV0pOwotCi0JLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzICovCi0JbWVtc2V0KChjaGFyICopIHR4NDkzOG5kZm1jX210ZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykpOwotCW1lbXNldCgoY2hhciAqKSB0aGlzLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwotCi0JLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KLQl0eDQ5MzhuZGZtY19tdGQtPnByaXYgPSB0aGlzOwotCi0JLyogU2V0IGFkZHJlc3Mgb2YgTkFORCBJTyBsaW5lcyAqLwotCXRoaXMtPklPX0FERFJfUiA9ICh1bnNpZ25lZCBsb25nKSZ0eDQ5MzhfbmRmbWNwdHItPmR0cjsKLQl0aGlzLT5JT19BRERSX1cgPSAodW5zaWduZWQgbG9uZykmdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JdGhpcy0+aHdjb250cm9sID0gdHg0OTM4bmRmbWNfaHdjb250cm9sOwotCXRoaXMtPmRldl9yZWFkeSA9IHR4NDkzOG5kZm1jX2Rldl9yZWFkeTsKLQl0aGlzLT5jYWxjdWxhdGVfZWNjID0gdHg0OTM4bmRmbWNfY2FsY3VsYXRlX2VjYzsKLQl0aGlzLT5jb3JyZWN0X2RhdGEgPSBuYW5kX2NvcnJlY3RfZGF0YTsKLQl0aGlzLT5lbmFibGVfaHdlY2MgPSB0eDQ5MzhuZGZtY19lbmFibGVfaHdlY2M7Ci0JdGhpcy0+ZWNjbW9kZSA9IE5BTkRfRUNDX0hXM18yNTY7Ci0JdGhpcy0+Y2hpcF9kZWxheSA9IDEwMDsKLQl0aGlzLT5yZWFkX2J5dGUgPSB0eDQ5MzhuZGZtY19uYW5kX3JlYWRfYnl0ZTsKLQl0aGlzLT53cml0ZV9ieXRlID0gdHg0OTM4bmRmbWNfbmFuZF93cml0ZV9ieXRlOwotCXRoaXMtPmNtZGZ1bmMgPSB0eDQ5MzhuZGZtY19uYW5kX2NvbW1hbmQ7Ci0JdGhpcy0+d3JpdGVfYnVmID0gdHg0OTM4bmRmbWNfbmFuZF93cml0ZV9idWY7Ci0JdGhpcy0+cmVhZF9idWYgPSB0eDQ5MzhuZGZtY19uYW5kX3JlYWRfYnVmOwotCXRoaXMtPnZlcmlmeV9idWYgPSB0eDQ5MzhuZGZtY19uYW5kX3ZlcmlmeV9idWY7Ci0KLQkvKiBTY2FuIHRvIGZpbmQgZXhpc3RhbmNlIG9mIHRoZSBkZXZpY2UgKi8KLQlpZiAobmFuZF9zY2FuICh0eDQ5MzhuZGZtY19tdGQsIDEpKSB7Ci0JCWtmcmVlICh0eDQ5MzhuZGZtY19tdGQpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWlmIChwcm90ZWN0ZWQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVFg0OTM4IE5ERk1DOiB3cml0ZSBwcm90ZWN0ZWQuXG4iKTsKLQkJdHg0OTM4bmRmbWNfbXRkLT5mbGFncyAmPSB+KE1URF9XUklURUFCTEUgfCBNVERfRVJBU0VBQkxFKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQl7Ci0JCWludCBtdGRfcGFydHNfbmIgPSAwOwotCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gMDsKLQkJbXRkX3BhcnRzX25iID0gcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKHR4NDkzOG5kZm1jX210ZCwgJm10ZF9wYXJ0cywgInR4NDkzOG5kZm1jIik7Ci0JCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQkJYWRkX210ZF9wYXJ0aXRpb25zKHR4NDkzOG5kZm1jX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOwotCQllbHNlCi0JCQlhZGRfbXRkX2RldmljZSh0eDQ5MzhuZGZtY19tdGQpOwotCX0KLSNlbHNlCi0JYWRkX210ZF9wYXJ0aXRpb25zKHR4NDkzOG5kZm1jX210ZCwgcGFydGl0aW9uX2luZm8sIE5VTV9QQVJUSVRJT05TICk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQodHg0OTM4bmRmbWNfaW5pdCk7Ci0KLS8qCi0gKiBDbGVhbiB1cCByb3V0aW5lCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCB0eDQ5MzhuZGZtY19jbGVhbnVwICh2b2lkKQotewotCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLwotCW5hbmRfcmVsZWFzZSAodHg0OTM4bmRmbWNfbXRkKTsKLQotCS8qIEZyZWUgdGhlIE1URCBkZXZpY2Ugc3RydWN0dXJlICovCi0Ja2ZyZWUgKHR4NDkzOG5kZm1jX210ZCk7Ci19Ci1tb2R1bGVfZXhpdCh0eDQ5MzhuZGZtY19jbGVhbnVwKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQWxpY2UgSGVubmVzc3kgPGFoZW5uZXNzeUBtdmlzdGEuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCb2FyZC1zcGVjaWZpYyBnbHVlIGxheWVyIGZvciBOQU5EIGZsYXNoIG9uIFRYNDkzOCBOREZNQyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDMuYyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKaW5kZXggMjlkZmQ0Ny4uNWM1ZWViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDMuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC0xNzEsMTIgKzE3MSw3IEBACiAJZXJyID0gZG9fZWwyX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTM1Niw2ICszNTEsMTAgQEAKICAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAorICAgIHJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChyZXR2YWwpCisJZ290byBvdXQxOworCiAgICAgaWYgKGRldi0+bWVtX3N0YXJ0KQogCXByaW50aygiJXM6ICVzIC0gJWRrQiBSQU0sIDhrQiBzaGFyZWQgbWVtIHdpbmRvdyBhdCAlIzZseC0lIzZseC5cbiIsCiAJCWRldi0+bmFtZSwgZWlfc3RhdHVzLm5hbWUsICh3b3JkbGVuZ3RoKzEpPDwzLApAQCAtNzE1LDExICs3MTQsOCBAQAogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJZGV2LT5tZW1fZW5kID0geGN2clt0aGlzX2Rldl07CS8qIGxvdyA0Yml0cyA9IHhjdnIgc2VsLiAqLwogCQlpZiAoZG9fZWwyX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfZWwyW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfZWwyW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiM2M1MDMuYzogTm8gM2M1MDMgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDUuYyBiL2RyaXZlcnMvbmV0LzNjNTA1LmMKaW5kZXggNzZmYThjYy4uYWQxN2YxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDUuYworKysgYi9kcml2ZXJzL25ldC8zYzUwNS5jCkBAIC0xMzE3LDggKzEzMTcsNyBAQAogCWlmIChvcmlnX0hTUiAmIERJUikgewogCQkvKiBJZiBIQ1IuRElSIGlzIHVwLCB3ZSBwdWxsIGl0IGRvd24uIEhTUi5ESVIgc2hvdWxkIGZvbGxvdy4gKi8KIAkJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQ09OVFJPTCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgzMCpIWi8xMDApOworCQltc2xlZXAoMzAwKTsKIAkJaWYgKGluYl9zdGF0dXMoYWRkcikgJiBESVIpIHsKIAkJCWlmIChlbHBfZGVidWcgPiAwKQogCQkJCXByaW50ayhub3Rmb3VuZF9tc2csIDIpOwpAQCAtMTMyNyw4ICsxMzI2LDcgQEAKIAl9IGVsc2UgewogCQkvKiBJZiBIQ1IuRElSIGlzIGRvd24sIHdlIHB1bGwgaXQgdXAuIEhTUi5ESVIgc2hvdWxkIGZvbGxvdy4gKi8KIAkJb3V0YihESVIsIGRldi0+YmFzZV9hZGRyICsgUE9SVF9DT05UUk9MKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDMwKkhaLzEwMCk7CisJCW1zbGVlcCgzMDApOwogCQlpZiAoIShpbmJfc3RhdHVzKGFkZHIpICYgRElSKSkgewogCQkJaWYgKGVscF9kZWJ1ZyA+IDApCiAJCQkJcHJpbnRrKG5vdGZvdW5kX21zZywgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwOS5jIGIvZHJpdmVycy9uZXQvM2M1MDkuYwppbmRleCBlODQzMTA5Li45Nzc5MzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKQEAgLTIxNyw2ICsyMTcsNyBAQAogc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBlbDNfZWlzYV9pZHNbXSA9IHsKIAkJeyAiVENNNTA5MiIgfSwKIAkJeyAiVENNNTA5MyIgfSwKKwkJeyAiVENNNTA5NSIgfSwKIAkJeyAiIiB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUxNS5jIGIvZHJpdmVycy9uZXQvM2M1MTUuYwppbmRleCBjNGNmNGZjLi45MWQxYzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUxNS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTE1LmMKQEAgLTM2NSw3ICszNjUsNyBAQAogI2VuZGlmIC8qIF9fSVNBUE5QX18gKi8KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb3Jrc2NyZXdfc2NhbihpbnQgdW5pdCk7Ci1zdGF0aWMgdm9pZCBjb3Jrc2NyZXdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKK3N0YXRpYyBpbnQgY29ya3NjcmV3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCiAJCQkgICAgc3RydWN0IHBucF9kZXYgKmlkZXYsIGludCBjYXJkX251bWJlcik7CiBzdGF0aWMgaW50IGNvcmtzY3Jld19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgY29ya3NjcmV3X3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTUzOSwxMCArNTM5LDkgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gIjNjNTE1IFJlc291cmNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgJSM0LjR4LCBEQ1IgJTQuNHguXG4iLAogCQkgICAgIAkJaW5sKGlvYWRkciArIDB4MjAwMiksIGludyhpb2FkZHIgKyAweDIwMDApKTsKIAkJCS8qIGlycSA9IGludyhpb2FkZHIgKyAweDIwMDIpICYgMTU7ICovIC8qIFVzZSB0aGUgaXJxIGZyb20gaXNhcG5wICovCi0JCQljb3Jrc2NyZXdfc2V0dXAoZGV2LCBpb2FkZHIsIGlkZXYsIGNhcmRzX2ZvdW5kKyspOwogCQkJU0VUX05FVERFVl9ERVYoZGV2LCAmaWRldi0+ZGV2KTsKIAkJCXBucF9jYXJkcysrOwotCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQllcnIgPSBjb3Jrc2NyZXdfc2V0dXAoZGV2LCBpb2FkZHIsIGlkZXYsIGNhcmRzX2ZvdW5kKyspOwogCQkJaWYgKCFlcnIpCiAJCQkJcmV0dXJuIGRldjsKIAkJCWNsZWFudXBfY2FyZChkZXYpOwpAQCAtNTU4LDggKzU1Nyw3IEBACiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiM2M1MTUgUmVzb3VyY2UgY29uZmlndXJhdGlvbiByZWdpc3RlciAlIzQuNHgsIERDUiAlNC40eC5cbiIsCiAJCSAgICAgaW5sKGlvYWRkciArIDB4MjAwMiksIGludyhpb2FkZHIgKyAweDIwMDApKTsKLQkJY29ya3NjcmV3X3NldHVwKGRldiwgaW9hZGRyLCBOVUxMLCBjYXJkc19mb3VuZCsrKTsKLQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWVyciA9IGNvcmtzY3Jld19zZXR1cChkZXYsIGlvYWRkciwgTlVMTCwgY2FyZHNfZm91bmQrKyk7CiAJCWlmICghZXJyKQogCQkJcmV0dXJuIGRldjsKIAkJY2xlYW51cF9jYXJkKGRldik7CkBAIC01NjgsNyArNTY2LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgY29ya3NjcmV3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCitzdGF0aWMgaW50IGNvcmtzY3Jld19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLAogCQkJICAgIHN0cnVjdCBwbnBfZGV2ICppZGV2LCBpbnQgY2FyZF9udW1iZXIpCiB7CiAJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CkBAIC02OTEsNiArNjg5LDggQEAKIAlkZXYtPmdldF9zdGF0cyA9ICZjb3Jrc2NyZXdfZ2V0X3N0YXRzOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworCisJcmV0dXJuIHJlZ2lzdGVyX25ldGRldihkZXYpOwogfQogDAogCkBAIC04MjIsNyArODIyLDcgQEAKIAkJCQlicmVhazsJLyogQmFkIG5ld3MhICAqLwogCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwotCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPnRhaWwpOworCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPmRhdGEpOwogCQl9CiAJCXZwLT5yeF9yaW5nW2kgLSAxXS5uZXh0ID0gaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSk7CS8qIFdyYXAgdGhlIHJpbmcuICovCiAJCW91dGwoaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSksIGlvYWRkciArIFVwTGlzdFB0cik7CkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogCQkJCWJyZWFrOwkvKiBCYWQgbmV3cyEgICovCiAJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCi0JCQl2cC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPnRhaWwpOworCQkJdnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKIAkJCXZwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOwogCQl9CiAJCXZwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOwkvKiBDbGVhciBjb21wbGV0ZSBiaXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyMy5jIGIvZHJpdmVycy9uZXQvM2M1MjMuYwppbmRleCA4ZjZiMmZhLi45ZTFmZTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUyMy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKQEAgLTU3Miw2ICs1NzIsMTAgQEAKICAgICAgICAgZGV2LT5mbGFncyY9fklGRl9NVUxUSUNBU1Q7ICAgICAvKiBNdWx0aWNhc3QgZG9lc24ndCB3b3JrICovCiAjZW5kaWYKIAorCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX291dDsKKwogCXJldHVybiAwOwogZXJyX291dDoKIAltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIE5VTEwsIE5VTEwpOwpAQCAtNjAwLDEyICs2MDQsNyBAQAogCWVyciA9IGRvX2VsbWNfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMTI3NSw2ICsxMjc0LDcgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJFdGhlckxpbmsvTUMgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJMaW5rL01DIElSUSBudW1iZXIocykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogaW50IGluaXRfbW9kdWxlKHZvaWQpCiB7CkBAIC0xMjg4LDEyICsxMjg4LDkgQEAKIAkJZGV2LT5pcnE9aXJxW3RoaXNfZGV2XTsKIAkJZGV2LT5iYXNlX2FkZHI9aW9bdGhpc19kZXZdOwogCQlpZiAoZG9fZWxtY19wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2VsbWNbdGhpc19kZXZdID0gZGV2OwotCQkJCWZvdW5kKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9lbG1jW3RoaXNfZGV2XSA9IGRldjsKKwkJCWZvdW5kKys7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlpZiAoaW9bdGhpc19kZXZdPT0wKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggODBlYzlhYS4uMDc3NDZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC0xODAyLDcgKzE4MDIsNyBAQAogCQkJCWJyZWFrOwkJCS8qIEJhZCBuZXdzISAgKi8KIAkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwotCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBza2ItPnRhaWwsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBza2ItPmRhdGEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl9CiAJCWlmIChpICE9IFJYX1JJTkdfU0laRSkgewogCQkJaW50IGo7CkBAIC0yNjMyLDcgKzI2MzIsNyBAQAogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShWT1JURVhfUENJKHZwKSwgZG1hLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCiAJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKLQkJCQkJICAgdnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJCSAgIHZwLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhLAogCQkJCQkgICBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoVk9SVEVYX1BDSSh2cCksIGRtYSwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCQl2cC0+cnhfY29weSsrOwpAQCAtMjY3OCw3ICsyNjc4LDcgQEAKIAkJCX0KIAkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwotCQkJdnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT50YWlsLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXZwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAkJfQogCQl2cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOWNwLmMgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwppbmRleCA3MmNkZjE5Li43YjI5M2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtNjEsNiArNjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CkBAIC01OTUsNyArNTk2LDcgQEAKIAogCQltYXBwaW5nID0KIAkJY3AtPnJ4X3NrYltyeF90YWlsXS5tYXBwaW5nID0KLQkJCXBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LCBuZXdfc2tiLT50YWlsLAorCQkJcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsIG5ld19za2ItPmRhdGEsCiAJCQkJICAgICAgIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJY3AtPnJ4X3NrYltyeF90YWlsXS5za2IgPSBuZXdfc2tiOwogCkBAIC0xMTAwLDcgKzExMDEsNyBAQAogCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CiAKIAkJY3AtPnJ4X3NrYltpXS5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsCi0JCQlza2ItPnRhaWwsIGNwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2ItPmRhdGEsIGNwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWNwLT5yeF9za2JbaV0uc2tiID0gc2tiOwogCiAJCWNwLT5yeF9yaW5nW2ldLm9wdHMyID0gMDsKQEAgLTE1MTUsMjIgKzE1MTYsMjIgQEAKIAkJCQkgIHN0cnVjdCBldGh0b29sX3N0YXRzICplc3RhdHMsIHU2NCAqdG1wX3N0YXRzKQogewogCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgaW50IHdvcmsgPSAxMDA7CiAJaW50IGk7CiAKKwltZW1zZXQoY3AtPm5pY19zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBjcF9kbWFfc3RhdHMpKTsKKwogCS8qIGJlZ2luIE5JQyBzdGF0aXN0aWNzIGR1bXAgKi8KIAljcHczMihTdGF0c0FkZHIgKyA0LCAoY3AtPm5pY19zdGF0c19kbWEgPj4gMTYpID4+IDE2KTsKIAljcHczMihTdGF0c0FkZHIsIChjcC0+bmljX3N0YXRzX2RtYSAmIDB4ZmZmZmZmZmYpIHwgRHVtcFN0YXRzKTsKIAljcHIzMihTdGF0c0FkZHIpOwogCi0Jd2hpbGUgKHdvcmstLSA+IDApIHsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CiAJCWlmICgoY3ByMzIoU3RhdHNBZGRyKSAmIER1bXBTdGF0cykgPT0gMCkKIAkJCWJyZWFrOwotCQljcHVfcmVsYXgoKTsKKwkJdWRlbGF5KDEwKTsKIAl9Ci0KLQlpZiAoY3ByMzIoU3RhdHNBZGRyKSAmIER1bXBTdGF0cykKLQkJcmV0dXJuIC8qIC1FSU8gKi87CisJY3B3MzIoU3RhdHNBZGRyLCAwKTsKKwljcHczMihTdGF0c0FkZHIgKyA0LCAwKTsKIAogCWkgPSAwOwogCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfb2spOwpAQCAtMTczMiwxOSArMTczMywxOSBAQAogCiAJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLwogCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYKLQkgICAgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpICYmCi0JICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkgICAgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CiAJCXBjaV91c2luZ19kYWMgPSAxOwogCX0gZWxzZSB7CiAJCXBjaV91c2luZ19kYWMgPSAwOwogCi0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKIAkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKIAkJCWdvdG8gZXJyX291dF9yZXM7CiAJCX0KLQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgY29uc2lzdGVudCBETUEgY29uZmlndXJhdGlvbiwgIgogCQkJICAgICAgICJhYm9ydGluZy5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODI1OTYuYyBiL2RyaXZlcnMvbmV0LzgyNTk2LmMKaW5kZXggNjVmOTdiMS4uMTNiNzQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC01NDYsMTEgKzU0NiwxMSBAQAogCQlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fYnVzKHJiZCsxKSk7CiAJCXJiZC0+Yl9hZGRyID0gV1NXQVByYmQodmlydF90b19idXMocmJkKSk7CiAJCXJiZC0+c2tiID0gc2tiOwotCQlyYmQtPnZfZGF0YSA9IHNrYi0+dGFpbDsKLQkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIodmlydF90b19idXMoc2tiLT50YWlsKSk7CisJCXJiZC0+dl9kYXRhID0gc2tiLT5kYXRhOworCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcih2aXJ0X3RvX2J1cyhza2ItPmRhdGEpKTsKIAkJcmJkLT5zaXplID0gUEtUX0JVRl9TWjsKICNpZmRlZiBfX21jNjgwMDBfXwotCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMoc2tiLT50YWlsKSwgUEtUX0JVRl9TWik7CisJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpLCBQS1RfQlVGX1NaKTsKICNlbmRpZgogCX0KIAlscC0+cmJkX2hlYWQgPSBscC0+cmJkczsKQEAgLTgxNiwxMCArODE2LDEwIEBACiAJCQkJcnhfaW5fcGxhY2UgPSAxOwogCQkJCXJiZC0+c2tiID0gbmV3c2tiOwogCQkJCW5ld3NrYi0+ZGV2ID0gZGV2OwotCQkJCXJiZC0+dl9kYXRhID0gbmV3c2tiLT50YWlsOwotCQkJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKHZpcnRfdG9fYnVzKG5ld3NrYi0+dGFpbCkpOworCQkJCXJiZC0+dl9kYXRhID0gbmV3c2tiLT5kYXRhOworCQkJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKHZpcnRfdG9fYnVzKG5ld3NrYi0+ZGF0YSkpOwogI2lmZGVmIF9fbWM2ODAwMF9fCi0JCQkJY2FjaGVfY2xlYXIodmlydF90b19waHlzKG5ld3NrYi0+dGFpbCksIFBLVF9CVUZfU1opOworCQkJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhuZXdza2ItPmRhdGEpLCBQS1RfQlVGX1NaKTsKICNlbmRpZgogCQkJfQogCQkJZWxzZQpAQCAtODQwLDcgKzg0MCw3IEBACiAJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKIAkJCQlza2ItPmxlbiA9IHBrdF9sZW47CiAjaWZkZWYgX19tYzY4MDAwX18KLQkJCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMocmJkLT5za2ItPnRhaWwpLAorCQkJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhyYmQtPnNrYi0+ZGF0YSksCiAJCQkJCQlwa3RfbGVuKTsKICNlbmRpZgogCQkJCW5ldGlmX3J4KHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCBmYTlmNzZjLi41MzRiNTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTMsNiArMyw4IEBACiAjIE5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAorbWVudSAiTmV0d29yayBkZXZpY2Ugc3VwcG9ydCIKKwogY29uZmlnIE5FVERFVklDRVMKIAlkZXBlbmRzIG9uIE5FVAogCWJvb2wgIk5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCkBAIC0xMzIwLDcgKzEzMjIsNyBAQAogCiBjb25maWcgQ1M4OXgwCiAJdHJpc3RhdGUgIkNTODl4MCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoSVNBIHx8IEFSQ0hfSVhEUDJYMDEpCisJZGVwZW5kcyBvbiAoTkVUX1BDSSAmJiAoSVNBIHx8IEFSQ0hfSVhEUDJYMDEpKSB8fCBBUkNIX1BOWDAxMDUKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgYQogCSAgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKQEAgLTE0ODgsMTQgKzE0OTAsMTQgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIDgxMzljcC4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCiAKIGNvbmZpZyA4MTM5VE9PCi0JdHJpc3RhdGUgIlJlYWxUZWsgUlRMLTgxMzkgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBzdXBwb3J0IgorCXRyaXN0YXRlICJSZWFsVGVrIFJUTC04MTI5LzgxMzAvODEzOSBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBNSUkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgRmFzdCBFdGhlcm5ldCBQQ0kgbmV0d29yayBjYXJkcyBiYXNlZCBvbgotCSAgdGhlIFJUTDgxMzkgY2hpcHMuIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc2F5IFkgYW5kIHJlYWQKLQkgIHRoZSBFdGhlcm5ldC1IT1dUTyA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCSAgdGhlIFJUTCA4MTI5LzgxMzAvODEzOSBjaGlwcy4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBhbmQKKwkgIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIDgxMzl0b28uICBUaGlzIGlzIHJlY29tbWVuZGVkLgpAQCAtMjU0Miw4ICsyNTQ0LDI1IEBACiAKIGNvbmZpZyBORVRDT05TT0xFCiAJdHJpc3RhdGUgIk5ldHdvcmsgY29uc29sZSBsb2dnaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBJTkVUICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAlJZiB5b3Ugd2FudCB0byBsb2cga2VybmVsIG1lc3NhZ2VzIG92ZXIgdGhlIG5ldHdvcmssIGVuYWJsZSB0aGlzLgogCVNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0Y29uc29sZS50eHQ+IGZvciBkZXRhaWxzLgogCitjb25maWcgTkVUUE9MTAorCWRlZl9ib29sIE5FVENPTlNPTEUKKworY29uZmlnIE5FVFBPTExfUlgKKwlib29sICJOZXRwb2xsIHN1cHBvcnQgZm9yIHRyYXBwaW5nIGluY29taW5nIHBhY2tldHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBORVRQT0xMCisKK2NvbmZpZyBORVRQT0xMX1RSQVAKKwlib29sICJOZXRwb2xsIHRyYWZmaWMgdHJhcHBpbmciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBORVRQT0xMCisKK2NvbmZpZyBORVRfUE9MTF9DT05UUk9MTEVSCisJZGVmX2Jvb2wgTkVUUE9MTAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCmluZGV4IDI0ZmJhMzYuLjkxNzkxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCkBAIC0xNDYsMTIgKzE0Niw3IEBACiAJZXJyID0gZG9fYWMzMjAwX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI3Myw3ICsyNjgsMTQgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQyOwogCXJldHVybiAwOworb3V0MjoKKwlpZiAoZWlfc3RhdHVzLnJlZzApCisJCWlvdW5tYXAoKHZvaWQgKilkZXYtPm1lbV9zdGFydCk7CiBvdXQxOgogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogb3V0OgpAQCAtMzkyLDExICszOTQsOCBAQAogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJZGV2LT5tZW1fc3RhcnQgPSBtZW1bdGhpc19kZXZdOwkJLyogQ3VycmVudGx5IGlnbm9yZWQgYnkgZHJpdmVyICovCiAJCWlmIChkb19hYzMyMDBfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9hYzMyW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfYWMzMltmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjMzIwMC5jOiBObyBhYzMyMDAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmMgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwppbmRleCA2ZWVhM2E4Li5kYmVjYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWMuYworKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMTE2Nyw5ICsxMTY4LDkgQEAKIAkvKgogCSAqIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4KIAkgKi8KLQlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKIAkJYXAtPnBjaV91c2luZ19kYWMgPSAxOwotCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCkpIHsKKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlhcC0+cGNpX3VzaW5nX2RhYyA9IDA7CiAJfSBlbHNlIHsKIAkJZWNvZGUgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKaW5kZXggYjdkZDcyNi4uODYxODAxMiAxMDA3NTUKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC04Nyw2ICs4Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CQogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTIwMDYsMTIgKzIwMDcsMTEgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIERNQSAqLwotCWlmKCFwY2lfZG1hX3N1cHBvcnRlZChwZGV2LCAweGZmZmZmZmZmKSl7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBETUEgbm90IHN1cHBvcnRlZCwiCiAJCQkiZXhpdGluZy5cbiIpOwotCQlnb3RvICBlcnJfZnJlZV9yZWc7Ci0JfSBlbHNlCi0JCXBkZXYtPmRtYV9tYXNrID0gMHhmZmZmZmZmZjsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQogCQogCXJlZ19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwogCXJlZ19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZwppbmRleCA2OWM0ODhkLi5iMTRlODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZwpAQCAtMSw2ICsxLDMzIEBACiAjCiAjIEFwcGxldGFsayBkcml2ZXIgY29uZmlndXJhdGlvbgogIworY29uZmlnIEFUQUxLCisJdHJpc3RhdGUgIkFwcGxldGFsayBwcm90b2NvbCBzdXBwb3J0IgorCXNlbGVjdCBMTEMKKwktLS1oZWxwLS0tCisJICBBcHBsZVRhbGsgaXMgdGhlIHByb3RvY29sIHRoYXQgQXBwbGUgY29tcHV0ZXJzIGNhbiB1c2UgdG8gY29tbXVuaWNhdGUKKwkgIG9uIGEgbmV0d29yay4gIElmIHlvdXIgTGludXggYm94IGlzIGNvbm5lY3RlZCB0byBzdWNoIGEgbmV0d29yayBhbmQgeW91CisJICB3aXNoIHRvIGNvbm5lY3QgdG8gaXQsIHNheSBZLiAgWW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIG5ldGF0YWxrIHBhY2thZ2UKKwkgIHNvIHRoYXQgeW91ciBMaW51eCBib3ggY2FuIGFjdCBhcyBhIHByaW50IGFuZCBmaWxlIHNlcnZlciBmb3IgTWFjcyBhcworCSAgd2VsbCBhcyBhY2Nlc3MgQXBwbGVUYWxrIHByaW50ZXJzLiAgQ2hlY2sgb3V0CisJICA8aHR0cDovL3d3dy56ZXR0YWJ5dGUubmV0L25ldGF0YWxrLz4gb24gdGhlIFdXVyBmb3IgZGV0YWlscy4KKwkgIEV0aGVyVGFsayBpcyB0aGUgbmFtZSB1c2VkIGZvciBBcHBsZVRhbGsgb3ZlciBFdGhlcm5ldCBhbmQgdGhlCisJICBjaGVhcGVyIGFuZCBzbG93ZXIgTG9jYWxUYWxrIGlzIEFwcGxlVGFsayBvdmVyIGEgcHJvcHJpZXRhcnkgQXBwbGUKKwkgIG5ldHdvcmsgdXNpbmcgc2VyaWFsIGxpbmtzLiAgRXRoZXJUYWxrIGFuZCBMb2NhbFRhbGsgYXJlIGZ1bGx5CisJICBzdXBwb3J0ZWQgYnkgTGludXguCisKKwkgIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbm5lY3QgTGludXgsIFdpbmRvd3MgbWFjaGluZXMgYW5kCisJICBNYWNzIGlzIG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly93d3cuZWF0cy5jb20vbGludXhfbWFjX3dpbi5odG1sPi4gIFRoZQorCSAgTkVULTMtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjb250YWlucyB2YWx1YWJsZQorCSAgaW5mb3JtYXRpb24gYXMgd2VsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXBwbGV0YWxrLiBZb3UgYWxtb3N0IGNlcnRhaW5seSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlIHNvIHlvdSBjYW4gcmVzdGFydCB5b3VyIEFwcGxlVGFsayBzdGFjayB3aXRob3V0IHJlYm9vdGluZworCSAgeW91ciBtYWNoaW5lLiBJIGhlYXIgdGhhdCB0aGUgR05VIGJveWNvdHQgb2YgQXBwbGUgaXMgb3Zlciwgc28KKwkgIGV2ZW4gcG9saXRpY2FsbHkgY29ycmVjdCBwZW9wbGUgYXJlIGFsbG93ZWQgdG8gc2F5IFkgaGVyZS4KKwogY29uZmlnIERFVl9BUFBMRVRBTEsKIAlib29sICJBcHBsZXRhbGsgaW50ZXJmYWNlcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVRBTEsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwppbmRleCAyZTI4YzIwLi45NDJhMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCkBAIC02OCw3ICs2OCw2IEBACiAJdm9pZCBfX2lvbWVtCSpkbWFfYmFzZTsKIAl1bnNpZ25lZCBpbnQJaWQ7CiAJdm9pZCBfX2lvbWVtCSpjdHJsX3BvcnQ7Ci0Jdm9pZCBfX2lvbWVtCSpiYXNlOwogCXVuc2lnbmVkIGNoYXIJY3RybDsKIAl1MzIJCXN1cHBvcnRlZDsKIH07CkBAIC0xNzgsNyArMTc3LDcgQEAKIAlzd2l0Y2ggKGV0aGVyaF9wcml2KGRldiktPmlkKSB7CiAJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwOgogCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMEE6Ci0JCWFkZHIgPSBldGhlcmhfcHJpdihkZXYpLT5iYXNlICsgRU4wX1JDTlRISTsKKwkJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOwogCiAJCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CiAJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgpAQCAtMjE5LDcgKzIxOCw3IEBACiAJc3dpdGNoIChldGhlcmhfcHJpdihkZXYpLT5pZCkgewogCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMDoKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDBBOgotCQlhZGRyID0gZXRoZXJoX3ByaXYoZGV2KS0+YmFzZSArIEVOMF9SQ05USEk7CisJCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKIAkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKIAkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6CiAJCQlzdGF0ID0gMTsKQEAgLTI4Miw3ICsyODEsNyBAQAogZXRoZXJoX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqYWRkciA9IGV0aGVyaF9wcml2KGRldiktPmJhc2U7CisJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKIAogCXdyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBhZGRyKTsKIApAQCAtMzI4LDcgKzMyNyw3IEBACiAKIAllaV9sb2NhbC0+ZG1haW5nID0gMTsKIAotCWFkZHIgPSBldGhlcmhfcHJpdihkZXYpLT5iYXNlOworCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOwogCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CiAKIAljb3VudCA9IChjb3VudCArIDEpICYgfjE7CkBAIC0zODgsNyArMzg3LDcgQEAKIAogCWVpX2xvY2FsLT5kbWFpbmcgPSAxOwogCi0JYWRkciA9IGV0aGVyaF9wcml2KGRldiktPmJhc2U7CisJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CiAJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKIAogCWJ1ZiA9IHNrYi0+ZGF0YTsKQEAgLTQyOCw3ICs0MjcsNyBAQAogCiAJZWlfbG9jYWwtPmRtYWluZyA9IDE7CiAKLQlhZGRyID0gZXRoZXJoX3ByaXYoZGV2KS0+YmFzZTsKKwlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKIAlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOwogCiAJd3JpdGViIChFODM5MF9OT0RNQSB8IEU4MzkwX1BBR0UwIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOwpAQCAtNjk3LDggKzY5Niw3IEBACiAJCWVoLT5jdHJsX3BvcnQgPSBlaC0+aW9jX2Zhc3Q7CiAJfQogCi0JZWgtPmJhc2UgPSBlaC0+bWVtYyArIGRhdGEtPm5zODM5MF9vZmZzZXQ7Ci0JZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyllaC0+YmFzZTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWVoLT5tZW1jICsgZGF0YS0+bnM4MzkwX29mZnNldDsKIAllaC0+ZG1hX2Jhc2UgPSBlaC0+bWVtYyArIGRhdGEtPmRhdGFwb3J0X29mZnNldDsKIAllaC0+Y3RybF9wb3J0ICs9IGRhdGEtPmN0cmxwb3J0X29mZnNldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXQxNzAwLmMgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwppbmRleCBiOGFiMmI2Li5lNjEzY2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdDE3MDAuYworKysgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpAQCAtMzQsMTAgKzM0LDYgQEAKIAlvbmx5IGlzIGl0IGRpZmZpY3VsdCB0byBkZXRlY3QsIGl0IGFsc28gbW92ZXMgYXJvdW5kIGluIEkvTyBzcGFjZSBpbgogCXJlc3BvbnNlIHRvIGluYigpcyBmcm9tIG90aGVyIGRldmljZSBwcm9iZXMhCiAqLwotLyoKLQk5OS8wMy8wMyAgQWxsaWVkIFRlbGVzaXMgUkUxMDAwIFBsdXMgc3VwcG9ydCBieSBULkhhZ2F3YQotCTk5LzEyLzMwCXBvcnQgdG8gMi4zLjM1IGJ5IEsuVGFrYWkKLSovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwppbmRleCAzZmU4YmE5Li45NDkzOWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iNDQuYworKysgYi9kcml2ZXJzL25ldC9iNDQuYwpAQCAtMTI4NSw2ICsxMjg1LDkgQEAKIAliNDRfaW5pdF9odyhicCk7CiAJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0lOSVRfQ09NUExFVEU7CiAKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCWI0NF9jaGVja19waHkoYnApOworCiAJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CiAKIAlpbml0X3RpbWVyKCZicC0+dGltZXIpOwpAQCAtMTkyNyw2ICsxOTMwLDcgQEAKIAliNDRfZnJlZV9yaW5ncyhicCk7CiAKIAlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MzYsNiArMTk0MCw4IEBACiAJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmMgYi9kcml2ZXJzL25ldC9ibWFjLmMKaW5kZXggMDBlNTI1Ny4uOGRjNjU3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JtYWMuYwpAQCAtMTI2MSw3ICsxMjYxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBibWFjX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWFjX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCWludCBqLCByZXYsIHJldDsKIAlzdHJ1Y3QgYm1hY19kYXRhICpicDsKQEAgLTE2NDUsMTYgKzE2NDUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBibWFjX21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJtYWNfbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gImJtYWMiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSCwKIAkuZGF0YQkJPSAodm9pZCAqKTAsCiAJfSwKIAl7Ci0JLm5hbWUgCQk9IE9GX0FOWV9NQVRDSCwKIAkudHlwZQkJPSAibmV0d29yayIsCiAJLmNvbXBhdGlibGUJPSAiYm1hYysiLAogCS5kYXRhCQk9ICh2b2lkICopMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwppbmRleCA2MjMzYzRmLi5hMmU4ZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCkBAIC0yMzQ2LDcgKzIzNDYsNiBAQAogewogCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdGFydF9hdDsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgZXRoaGRyICpkYXRhID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJaW50IHNsYXZlX2FnZ19ubzsKIAlpbnQgc2xhdmVzX2luX2FnZzsKIAlpbnQgYWdnX2lkOwpAQCAtMjM3Nyw3ICsyMzc2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2xhdmVfYWdnX25vID0gKGRhdGEtPmhfZGVzdFs1XV5ib25kLT5kZXYtPmRldl9hZGRyWzVdKSAlIHNsYXZlc19pbl9hZ2c7CisJc2xhdmVfYWdnX25vID0gYm9uZC0+eG1pdF9oYXNoX3BvbGljeShza2IsIGRldiwgc2xhdmVzX2luX2FnZyk7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CiAJCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2cgPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LmFnZ3JlZ2F0b3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCAyNjlhNWU0Li4yYzkzMGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTQ3NSw3ICs0NzUsMTggQEAKICAqICAgICAgICBTb2x1dGlvbiBpcyB0byBtb3ZlIGNhbGwgdG8gZGV2X3JlbW92ZV9wYWNrIG91dHNpZGUgb2YgdGhlCiAgKiAgICAgICAgc3BpbmxvY2suCiAgKiAgICAgICAgU2V0IHZlcnNpb24gdG8gMi42LjEuCi0gKgorICogMjAwNS8wNi8wNSAtIEpheSBWb3NidXJnaCA8ZnViYXJAdXMuaWJtLmNvbT4KKyAqIAktIFN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgZ3JhdHVpdG91cyBBUlBzIGluIGFjdGl2ZS1iYWNrdXAgbW9kZS4KKyAqIAkgIEluY2x1ZGVzIHN1cHBvcnQgZm9yIFZMQU4gdGFnZ2luZyBhbGwgYm9uZGluZy1nZW5lcmF0ZWQgQVJQcworICogCSAgYXMgbmVlZGVkLiAgU2V0IHZlcnNpb24gdG8gMi42LjIuCisgKiAyMDA1LzA2LzA4IC0gSmFzb24gR2FibGVyIDxqeWdhYmxlciBhdCBsYmwgZG90IGdvdj4KKyAqCS0gYWx0ZXJuYXRlIGhhc2hpbmcgcG9saWN5IHN1cHBvcnQgZm9yIG1vZGUgMgorICoJICAqIEFkZGVkIGtlcm5lbCBwYXJhbWV0ZXIgInhtaXRfaGFzaF9wb2xpY3kiIHRvIGFsbG93IHRoZSBzZWxlY3Rpb24KKyAqCSAgICBvZiBkaWZmZXJlbnQgaGFzaGluZyBwb2xpY2llcyBmb3IgbW9kZSAyLiAgVGhlIG9yaWdpbmFsIG1vZGUgMgorICoJICAgIHBvbGljeSBpcyB0aGUgZGVmYXVsdCwgbm93IGZvdW5kIGluIHhtaXRfaGFzaF9wb2xpY3lfbGF5ZXIyKCkuCisgKgkgICogQWRkZWQgeG1pdF9oYXNoX3BvbGljeV9sYXllcjM0KCkKKyAqCS0gTW9kaWZpZWQgYnkgSmF5IFZvc2J1cmdoIDxmdWJhckB1cy5pYm0uY29tPiB0byBhbHNvIHN1cHBvcnQgbW9kZSA0LgorICoJICBTZXQgdmVyc2lvbiB0byAyLjYuMy4KICAqLwogCiAvLyNkZWZpbmUgQk9ORElOR19ERUJVRyAxCkBAIC00OTAsNyArNTAxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01MTksNiArNTMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlICJib25kaW5nLmgiCiAjaW5jbHVkZSAiYm9uZF8zYWQuaCIKICNpbmNsdWRlICJib25kX2FsYi5oIgpAQCAtNTM3LDYgKzU1Miw3IEBACiBzdGF0aWMgY2hhciAqbW9kZQk9IE5VTEw7CiBzdGF0aWMgY2hhciAqcHJpbWFyeQk9IE5VTEw7CiBzdGF0aWMgY2hhciAqbGFjcF9yYXRlCT0gTlVMTDsKK3N0YXRpYyBjaGFyICp4bWl0X2hhc2hfcG9saWN5ID0gTlVMTDsKIHN0YXRpYyBpbnQgYXJwX2ludGVydmFsID0gQk9ORF9MSU5LX0FSUF9JTlRFUlY7CiBzdGF0aWMgY2hhciAqYXJwX2lwX3RhcmdldFtCT05EX01BWF9BUlBfVEFSR0VUU10gPSB7IE5VTEwsIH07CiAKQEAgLTU1Niw2ICs1NzIsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhwcmltYXJ5LCAiUHJpbWFyeSBuZXR3b3JrIGRldmljZSB0byB1c2UiKTsKIG1vZHVsZV9wYXJhbShsYWNwX3JhdGUsIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGFjcF9yYXRlLCAiTEFDUERVIHR4IHJhdGUgdG8gcmVxdWVzdCBmcm9tIDgwMi4zYWQgcGFydG5lciAoc2xvdy9mYXN0KSIpOworbW9kdWxlX3BhcmFtKHhtaXRfaGFzaF9wb2xpY3ksIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoeG1pdF9oYXNoX3BvbGljeSwgIlhPUiBoYXNoaW5nIG1ldGhvZCA6IDAgZm9yIGxheWVyIDIgKGRlZmF1bHQpLCAxIGZvciBsYXllciAzKzQiKTsKIG1vZHVsZV9wYXJhbShhcnBfaW50ZXJ2YWwsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFycF9pbnRlcnZhbCwgImFycCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiKTsKIG1vZHVsZV9wYXJhbV9hcnJheShhcnBfaXBfdGFyZ2V0LCBjaGFycCwgTlVMTCwgMCk7CkBAIC01NzQsOCArNTkyLDggQEAKIAogc3RhdGljIHUzMiBhcnBfdGFyZ2V0W0JPTkRfTUFYX0FSUF9UQVJHRVRTXSA9IHsgMCwgfSA7CiBzdGF0aWMgaW50IGFycF9pcF9jb3VudAk9IDA7Ci1zdGF0aWMgdTMyIG15X2lwCT0gMDsKIHN0YXRpYyBpbnQgYm9uZF9tb2RlCT0gQk9ORF9NT0RFX1JPVU5EUk9CSU47CitzdGF0aWMgaW50IHhtaXRfaGFzaHR5cGU9IEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIyOwogc3RhdGljIGludCBsYWNwX2Zhc3QJPSAwOwogc3RhdGljIGludCBhcHBfYWJpX3Zlcgk9IDA7CiBzdGF0aWMgaW50IG9yaWdfYXBwX2FiaV92ZXIgPSAtMTsgLyogVGhpcyBpcyB1c2VkIHRvIHNhdmUgdGhlIGZpcnN0IEFCSSB2ZXJzaW9uCkBAIC01ODUsNyArNjAzLDYgQEAKIAkJCQkgICAqIGNvbW1hbmQgY29tZXMgZnJvbSBhbiBhcHBsaWNhdGlvbiB1c2luZwogCQkJCSAgICogYW5vdGhlciBBQkkgdmVyc2lvbi4KIAkJCQkgICAqLwotCiBzdHJ1Y3QgYm9uZF9wYXJtX3RibCB7CiAJY2hhciAqbW9kZW5hbWU7CiAJaW50IG1vZGU7CkBAIC02MDgsOSArNjI1LDE2IEBACiB7CU5VTEwsCQkJLTF9LAogfTsKIAorc3RhdGljIHN0cnVjdCBib25kX3Bhcm1fdGJsIHhtaXRfaGFzaHR5cGVfdGJsW10gPSB7Cit7CSJsYXllcjIiLAkJQk9ORF9YTUlUX1BPTElDWV9MQVlFUjJ9LAorewkibGF5ZXIzKzQiLAkJQk9ORF9YTUlUX1BPTElDWV9MQVlFUjM0fSwKK3sJTlVMTCwJCQktMX0sCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvcndhcmQgZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9tb2RlX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBtb2RlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9tb2RlX29wcyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgYm9uZF9zZW5kX2dyYXR1aXRvdXNfYXJwKHN0cnVjdCBib25kaW5nICpib25kKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC02NTksNiArNjgzLDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZ2bGFuLT52bGFuX2xpc3QpOwogCXZsYW4tPnZsYW5faWQgPSB2bGFuX2lkOworCXZsYW4tPnZsYW5faXAgPSAwOwogCiAJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CiAKQEAgLTE0NjgsMTYgKzE0OTMsNiBAQAogCQl9CiAJfQogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKLQkJaWYgKG9sZF9hY3RpdmUpIHsKLQkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKG9sZF9hY3RpdmUpOwotCQl9Ci0KLQkJaWYgKG5ld19hY3RpdmUpIHsKLQkJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhuZXdfYWN0aXZlKTsKLQkJfQotCX0KLQogCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CiAJCWJvbmRfbWNfc3dhcChib25kLCBuZXdfYWN0aXZlLCBvbGRfYWN0aXZlKTsKIAl9CkBAIC0xNDg4LDYgKzE1MDMsMTcgQEAKIAl9IGVsc2UgewogCQlib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSA9IG5ld19hY3RpdmU7CiAJfQorCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKKwkJaWYgKG9sZF9hY3RpdmUpIHsKKwkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKG9sZF9hY3RpdmUpOworCQl9CisKKwkJaWYgKG5ld19hY3RpdmUpIHsKKwkJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhuZXdfYWN0aXZlKTsKKwkJfQorCQlib25kX3NlbmRfZ3JhdHVpdG91c19hcnAoYm9uZCk7CisJfQogfQogCiAvKioKQEAgLTI2OTQsMTUgKzI3MjAsMTgwIEBACiAJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOwogfQogCisKK3N0YXRpYyB1MzIgYm9uZF9nbGVhbl9kZXZfaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2OworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwl1MzIgYWRkciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWRldiA9IF9faW5fZGV2X2dldChkZXYpOworCWlmICghaWRldikKKwkJZ290byBvdXQ7CisKKwlpZmEgPSBpZGV2LT5pZmFfbGlzdDsKKwlpZiAoIWlmYSkKKwkJZ290byBvdXQ7CisKKwlhZGRyID0gaWZhLT5pZmFfbG9jYWw7CitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9oYXNfaXAoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW4sICp2bGFuX25leHQ7CisKKwlpZiAoYm9uZC0+bWFzdGVyX2lwKQorCQlyZXR1cm4gMTsKKworCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB2bGFuX25leHQsICZib25kLT52bGFuX2xpc3QsCisJCQkJIHZsYW5fbGlzdCkgeworCQlpZiAodmxhbi0+dmxhbl9pcCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2UgZ28gdG8gdGhlIChsYXJnZSkgdHJvdWJsZSBvZiBWTEFOIHRhZ2dpbmcgQVJQIGZyYW1lcyBiZWNhdXNlCisgKiBzd2l0Y2hlcyBpbiBWTEFOIG1vZGUgKGVzcGVjaWFsbHkgaWYgcG9ydHMgYXJlIGNvbmZpZ3VyZWQgYXMKKyAqICJuYXRpdmUiIHRvIGEgVkxBTikgbWlnaHQgbm90IHBhc3Mgbm9uLXRhZ2dlZCBmcmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfYXJwX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiwgaW50IGFycF9vcCwgdTMyIGRlc3RfaXAsIHUzMiBzcmNfaXAsIHVuc2lnbmVkIHNob3J0IHZsYW5faWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWRwcmludGsoImFycCAlZCBvbiBzbGF2ZSAlczogZHN0ICV4IHNyYyAleCB2aWQgJWRcbiIsIGFycF9vcCwKKwkgICAgICAgc2xhdmVfZGV2LT5uYW1lLCBkZXN0X2lwLCBzcmNfaXAsIHZsYW5faWQpOworCSAgICAgICAKKwlza2IgPSBhcnBfY3JlYXRlKGFycF9vcCwgRVRIX1BfQVJQLCBkZXN0X2lwLCBzbGF2ZV9kZXYsIHNyY19pcCwKKwkJCSBOVUxMLCBzbGF2ZV9kZXYtPmRldl9hZGRyLCBOVUxMKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBBUlAgcGFja2V0IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmxhbl9pZCkgeworCQlza2IgPSB2bGFuX3B1dF90YWcoc2tiLCB2bGFuX2lkKTsKKwkJaWYgKCFza2IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBmYWlsZWQgdG8gaW5zZXJ0IFZMQU4gdGFnXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlhcnBfeG1pdChza2IpOworfQorCisKIHN0YXRpYyB2b2lkIGJvbmRfYXJwX3NlbmRfYWxsKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQogewotCWludCBpOworCWludCBpLCB2bGFuX2lkLCBydjsKIAl1MzIgKnRhcmdldHMgPSBib25kLT5wYXJhbXMuYXJwX3RhcmdldHM7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW4sICp2bGFuX25leHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKIAogCWZvciAoaSA9IDA7IChpIDwgQk9ORF9NQVhfQVJQX1RBUkdFVFMpICYmIHRhcmdldHNbaV07IGkrKykgewotCQlhcnBfc2VuZChBUlBPUF9SRVFVRVNULCBFVEhfUF9BUlAsIHRhcmdldHNbaV0sIHNsYXZlLT5kZXYsCi0JCQkgbXlfaXAsIE5VTEwsIHNsYXZlLT5kZXYtPmRldl9hZGRyLAotCQkJIE5VTEwpOworCQlkcHJpbnRrKCJiYXNhOiB0YXJnZXQgJXhcbiIsIHRhcmdldHNbaV0pOworCQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQkJZHByaW50aygiYmFzYTogZW1wdHkgdmxhbjogYXJwX3NlbmRcbiIpOworCQkJYm9uZF9hcnBfc2VuZChzbGF2ZS0+ZGV2LCBBUlBPUF9SRVFVRVNULCB0YXJnZXRzW2ldLAorCQkJCSAgICAgIGJvbmQtPm1hc3Rlcl9pcCwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIElmIFZMQU5zIGFyZSBjb25maWd1cmVkLCB3ZSBkbyBhIHJvdXRlIGxvb2t1cCB0bworCQkgKiBkZXRlcm1pbmUgd2hpY2ggVkxBTiBpbnRlcmZhY2Ugd291bGQgYmUgdXNlZCwgc28gd2UKKwkJICogY2FuIHRhZyB0aGUgQVJQIHdpdGggdGhlIHByb3BlciBWTEFOIHRhZy4KKwkJICovCisJCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCQlmbC5mbDRfZHN0ID0gdGFyZ2V0c1tpXTsKKwkJZmwuZmw0X3RvcyA9IFJUT19PTkxJTks7CisKKwkJcnYgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKTsKKwkJaWYgKHJ2KSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAiOiAlczogbm8gcm91dGUgdG8gYXJwX2lwX3RhcmdldCAldS4ldS4ldS4ldVxuIiwKKwkJCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lLCBOSVBRVUFEKGZsLmZsNF9kc3QpKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhpcyB0YXJnZXQgaXMgbm90IG9uIGEgVkxBTgorCQkgKi8KKwkJaWYgKHJ0LT51LmRzdC5kZXYgPT0gYm9uZC0+ZGV2KSB7CisJCQlkcHJpbnRrKCJiYXNhOiBydGRldiA9PSBib25kLT5kZXY6IGFycF9zZW5kXG4iKTsKKwkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVRVUVTVCwgdGFyZ2V0c1tpXSwKKwkJCQkgICAgICBib25kLT5tYXN0ZXJfaXAsIDApOworCQkJY29udGludWU7CisJCX0KKworCQl2bGFuX2lkID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW4sIHZsYW5fbmV4dCwgJmJvbmQtPnZsYW5fbGlzdCwKKwkJCQkJIHZsYW5fbGlzdCkgeworCQkJdmxhbl9kZXYgPSBib25kLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZsYW4tPnZsYW5faWRdOworCQkJaWYgKHZsYW5fZGV2ID09IHJ0LT51LmRzdC5kZXYpIHsKKwkJCQl2bGFuX2lkID0gdmxhbi0+dmxhbl9pZDsKKwkJCQlkcHJpbnRrKCJiYXNhOiB2bGFuIG1hdGNoIG9uICVzICVkXG4iLAorCQkJCSAgICAgICB2bGFuX2Rldi0+bmFtZSwgdmxhbl9pZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAodmxhbl9pZCkgeworCQkJYm9uZF9hcnBfc2VuZChzbGF2ZS0+ZGV2LCBBUlBPUF9SRVFVRVNULCB0YXJnZXRzW2ldLAorCQkJCSAgICAgIHZsYW4tPnZsYW5faXAsIHZsYW5faWQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJICAgICAgICI6ICVzOiBubyBwYXRoIHRvIGFycF9pcF90YXJnZXQgJXUuJXUuJXUuJXUgdmlhIHJ0LmRldiAlc1xuIiwKKwkJCSAgICAgICBib25kLT5kZXYtPm5hbWUsIE5JUFFVQUQoZmwuZmw0X2RzdCksCisJCQkgICAgICAgcnQtPnUuZHN0LmRldiA/IHJ0LT51LmRzdC5kZXYtPm5hbWUgOiAiTlVMTCIpOworCQl9CisJfQorfQorCisvKgorICogS2ljayBvdXQgYSBncmF0dWl0b3VzIEFSUCBmb3IgYW4gSVAgb24gdGhlIGJvbmRpbmcgbWFzdGVyIHBsdXMgb25lCisgKiBmb3IgZWFjaCBWTEFOIGFib3ZlIHVzLgorICovCitzdGF0aWMgdm9pZCBib25kX3NlbmRfZ3JhdHVpdG91c19hcnAoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOworCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldjsKKworCWRwcmludGsoImJvbmRfc2VuZF9ncmF0X2FycDogYm9uZCAlcyBzbGF2ZSAlc1xuIiwgYm9uZC0+ZGV2LT5uYW1lLAorCQkJCXNsYXZlID8gc2xhdmUtPmRldi0+bmFtZSA6ICJOVUxMIik7CisJaWYgKCFzbGF2ZSkKKwkJcmV0dXJuOworCisJaWYgKGJvbmQtPm1hc3Rlcl9pcCkgeworCQlib25kX2FycF9zZW5kKHNsYXZlLT5kZXYsIEFSUE9QX1JFUExZLCBib25kLT5tYXN0ZXJfaXAsCisJCQkJICBib25kLT5tYXN0ZXJfaXAsIDApOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7CisJCXZsYW5fZGV2ID0gYm9uZC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2bGFuLT52bGFuX2lkXTsKKwkJaWYgKHZsYW4tPnZsYW5faXApIHsKKwkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVQTFksIHZsYW4tPnZsYW5faXAsCisJCQkJICAgICAgdmxhbi0+dmxhbl9pcCwgdmxhbi0+dmxhbl9pZCk7CisJCX0KIAl9CiB9CiAKQEAgLTI3ODEsNyArMjk3Miw3IEBACiAJCQkgKi8KIAkJCWlmICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT50cmFuc19zdGFydCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSB8fAogCQkJICAgICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA+PSAoMipkZWx0YV9pbl90aWNrcykpICYmCi0JCQkgICAgIG15X2lwKSkgeworCQkJICAgICBib25kX2hhc19pcChib25kKSkpIHsKIAogCQkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOwogCQkJCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQkFDS1VQOwpAQCAtMjkyMCw3ICszMTExLDcgQEAKIAkJCWlmICgoc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpICYmCiAJCQkgICAgKCFib25kLT5jdXJyZW50X2FycF9zbGF2ZSkgJiYKIAkJCSAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gMypkZWx0YV9pbl90aWNrcykgJiYKLQkJCSAgICAgbXlfaXApKSB7CisJCQkgICAgIGJvbmRfaGFzX2lwKGJvbmQpKSkgewogCQkJCS8qIGEgYmFja3VwIHNsYXZlIGhhcyBnb25lIGRvd247IHRocmVlIHRpbWVzCiAJCQkJICogdGhlIGRlbHRhIGFsbG93cyB0aGUgY3VycmVudCBzbGF2ZSB0byBiZQogCQkJCSAqIHRha2VuIG91dCBiZWZvcmUgdGhlIGJhY2t1cCBzbGF2ZS4KQEAgLTI5NjYsOCArMzE1Nyw4IEBACiAJCSAqIGlmIGl0IGlzIHVwIGFuZCBuZWVkcyB0byB0YWtlIG92ZXIgYXMgdGhlIGN1cnJfYWN0aXZlX3NsYXZlCiAJCSAqLwogCQlpZiAoKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPnRyYW5zX3N0YXJ0KSA+PSAoMipkZWx0YV9pbl90aWNrcykpIHx8Ci0JCSAgICAgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPmxhc3RfcngpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgJiYKLQkJICAgICAgbXlfaXApKSAmJgorCSAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSAmJgorCSAgICAgYm9uZF9oYXNfaXAoYm9uZCkpKSAmJgogCQkgICAgKChqaWZmaWVzIC0gc2xhdmUtPmppZmZpZXMpID49IDIqZGVsdGFfaW5fdGlja3MpKSB7CiAKIAkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOwpAQCAtMzAxOSw3ICszMjEwLDcgQEAKIAkJLyogdGhlIGN1cnJlbnQgc2xhdmUgbXVzdCB0eCBhbiBhcnAgdG8gZW5zdXJlIGJhY2t1cCBzbGF2ZXMKIAkJICogcnggdHJhZmZpYwogCQkgKi8KLQkJaWYgKHNsYXZlICYmIG15X2lwKSB7CisJCWlmIChzbGF2ZSAmJiBib25kX2hhc19pcChib25kKSkgewogCQkJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgc2xhdmUpOwogCQl9CiAJfQpAQCAtMzQ3MSwxMCArMzY2Miw2NyBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAorLyoKKyAqIGJvbmRfaW5ldGFkZHJfZXZlbnQ6IGhhbmRsZSBpbmV0YWRkciBub3RpZmllciBjaGFpbiBldmVudHMuCisgKgorICogV2Uga2VlcCB0cmFjayBvZiBkZXZpY2UgSVBzIHByaW1hcmlseSB0byB1c2UgYXMgc291cmNlIGFkZHJlc3NlcyBpbgorICogQVJQIG1vbml0b3IgcHJvYmVzIChyYXRoZXIgdGhhbiBzcGV3aW5nIG91dCBicm9hZGNhc3RzIGFsbCB0aGUgdGltZSkuCisgKgorICogV2UgdHJhY2sgb25lIElQIGZvciB0aGUgbWFpbiBkZXZpY2UgKGlmIGl0IGhhcyBvbmUpLCBwbHVzIG9uZSBwZXIgVkxBTi4KKyAqLworc3RhdGljIGludCBib25kX2luZXRhZGRyX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IHB0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXYsICpldmVudF9kZXYgPSBpZmEtPmlmYV9kZXYtPmRldjsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgKmJvbmRfbmV4dDsKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbiwgKnZsYW5fbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShib25kLCBib25kX25leHQsICZib25kX2Rldl9saXN0LCBib25kX2xpc3QpIHsKKwkJaWYgKGJvbmQtPmRldiA9PSBldmVudF9kZXYpIHsKKwkJCXN3aXRjaCAoZXZlbnQpIHsKKwkJCWNhc2UgTkVUREVWX1VQOgorCQkJCWJvbmQtPm1hc3Rlcl9pcCA9IGlmYS0+aWZhX2xvY2FsOworCQkJCXJldHVybiBOT1RJRllfT0s7CisJCQljYXNlIE5FVERFVl9ET1dOOgorCQkJCWJvbmQtPm1hc3Rlcl9pcCA9IGJvbmRfZ2xlYW5fZGV2X2lwKGJvbmQtPmRldik7CisJCQkJcmV0dXJuIE5PVElGWV9PSzsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQkJfQorCQl9CisKKwkJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmxhbiwgdmxhbl9uZXh0LCAmYm9uZC0+dmxhbl9saXN0LAorCQkJCQkgdmxhbl9saXN0KSB7CisJCQl2bGFuX2RldiA9IGJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmxhbi0+dmxhbl9pZF07CisJCQlpZiAodmxhbl9kZXYgPT0gZXZlbnRfZGV2KSB7CisJCQkJc3dpdGNoIChldmVudCkgeworCQkJCWNhc2UgTkVUREVWX1VQOgorCQkJCQl2bGFuLT52bGFuX2lwID0gaWZhLT5pZmFfbG9jYWw7CisJCQkJCXJldHVybiBOT1RJRllfT0s7CisJCQkJY2FzZSBORVRERVZfRE9XTjoKKwkJCQkJdmxhbi0+dmxhbl9pcCA9CisJCQkJCQlib25kX2dsZWFuX2Rldl9pcCh2bGFuX2Rldik7CisJCQkJCXJldHVybiBOT1RJRllfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYm9uZF9uZXRkZXZfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBib25kX25ldGRldl9ldmVudCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYm9uZF9pbmV0YWRkcl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGJvbmRfaW5ldGFkZHJfZXZlbnQsCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2tldCB0eXBlIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIHJlZ2lzdGVyIHRvIHJlY2VpdmUgbGFjcGR1cyBvbiBhIGJvbmQgKi8KQEAgLTM0OTYsNiArMzc0NCw0NiBAQAogCWRldl9yZW1vdmVfcGFjaygmKEJPTkRfQURfSU5GTyhib25kKS5hZF9wa3RfdHlwZSkpOwogfQogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFzaGluZyBQb2xpY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBIYXNoIGZvciB0aGUgdGhlIG91dHB1dCBkZXZpY2UgYmFzZWQgdXBvbiBsYXllciAzIGFuZCBsYXllciA0IGRhdGEuIElmCisgKiB0aGUgcGFja2V0IGlzIGEgZnJhZyBvciBub3QgVENQIG9yIFVEUCwganVzdCB1c2UgbGF5ZXIgMyBkYXRhLiAgSWYgaXQgaXMKKyAqIGFsdG9nZXRoZXIgbm90IElQLCBtaW1pYyBib25kX3htaXRfaGFzaF9wb2xpY3lfbDIoKQorICovCitzdGF0aWMgaW50IGJvbmRfeG1pdF9oYXNoX3BvbGljeV9sMzQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBpbnQgY291bnQpCit7CisJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJdTE2ICpsYXllcjRoZHIgPSAodTE2ICopKCh1MzIgKilpcGggKyBpcGgtPmlobCk7CisJaW50IGxheWVyNF94b3IgPSAwOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpIHsKKwkJaWYgKCEoaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgJiYKKwkJICAgIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQIHx8CisJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkpIHsKKwkJCWxheWVyNF94b3IgPSBodG9ucygoKmxheWVyNGhkciBeICoobGF5ZXI0aGRyICsgMSkpKTsKKwkJfQorCQlyZXR1cm4gKGxheWVyNF94b3IgXgorCQkJKChudG9obChpcGgtPnNhZGRyIF4gaXBoLT5kYWRkcikpICYgMHhmZmZmKSkgJSBjb3VudDsKKworCX0KKworCXJldHVybiAoZGF0YS0+aF9kZXN0WzVdIF4gYm9uZF9kZXYtPmRldl9hZGRyWzVdKSAlIGNvdW50OworfQorCisvKgorICogSGFzaCBmb3IgdGhlIG91dHB1dCBkZXZpY2UgYmFzZWQgdXBvbiBsYXllciAyIGRhdGEKKyAqLworc3RhdGljIGludCBib25kX3htaXRfaGFzaF9wb2xpY3lfbDIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZXRoaGRyICpkYXRhID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisKKwlyZXR1cm4gKGRhdGEtPmhfZGVzdFs1XSBeIGJvbmRfZGV2LT5kZXZfYWRkcls1XSkgJSBjb3VudDsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgZW50cnkgcG9pbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50IGJvbmRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCkBAIC00MDYwLDE3ICs0MzQ4LDYgQEAKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OwogCWludCByZXMgPSAxOwogCi0JLyogaWYgd2UgYXJlIHNlbmRpbmcgYXJwIHBhY2tldHMsIHRyeSB0byBhdCBsZWFzdAotCSAgIGlkZW50aWZ5IG91ciBvd24gaXAgYWRkcmVzcyAqLwotCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsICYmICFteV9pcCAmJgotCQkoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkpKSB7Ci0JCWNoYXIgKnRoZV9pcCA9IChjaGFyICopc2tiLT5kYXRhICsKLQkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgKwotCQkJCXNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCi0JCQkJRVRIX0FMRU47Ci0JCW1lbWNweSgmbXlfaXAsIHRoZV9pcCwgNCk7Ci0JfQotCiAJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKIAlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CiAKQEAgLTQwOTMsMTQgKzQzNzAsMTMgQEAKIH0KIAogLyoKLSAqIGluIFhPUiBtb2RlLCB3ZSBkZXRlcm1pbmUgdGhlIG91dHB1dCBkZXZpY2UgYnkgcGVyZm9ybWluZyB4b3Igb24KLSAqIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGh3IGFkcmVzc2VzLiAgSWYgdGhpcyBkZXZpY2UgaXMgbm90Ci0gKiBlbmFibGVkLCBmaW5kIHRoZSBuZXh0IHNsYXZlIGZvbGxvd2luZyB0aGlzIHhvciBzbGF2ZS4KKyAqIEluIGJvbmRfeG1pdF94b3IoKSAsIHdlIGRldGVybWluZSB0aGUgb3V0cHV0IGRldmljZSBieSB1c2luZyBhIHByZS0KKyAqIGRldGVybWluZWQgeG1pdF9oYXNoX3BvbGljeSgpLCBJZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGlzIG5vdCBlbmFibGVkLAorICogZmluZCB0aGUgbmV4dCBhY3RpdmUgc2xhdmUuCiAgKi8KIHN0YXRpYyBpbnQgYm9uZF94bWl0X3hvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCiB7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKLQlzdHJ1Y3QgZXRoaGRyICpkYXRhID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN0YXJ0X2F0OwogCWludCBzbGF2ZV9ubzsKIAlpbnQgaTsKQEAgLTQxMTIsNyArNDM4OCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNsYXZlX25vID0gKGRhdGEtPmhfZGVzdFs1XV5ib25kX2Rldi0+ZGV2X2FkZHJbNV0pICUgYm9uZC0+c2xhdmVfY250OworCXNsYXZlX25vID0gYm9uZC0+eG1pdF9oYXNoX3BvbGljeShza2IsIGJvbmRfZGV2LCBib25kLT5zbGF2ZV9jbnQpOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewogCQlzbGF2ZV9uby0tOwpAQCAtNDIwOCw4ICs0NDg0LDEwIEBACiAvKgogICogc2V0IGJvbmQgbW9kZSBzcGVjaWZpYyBuZXQgZGV2aWNlIG9wZXJhdGlvbnMKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGJvbmRfc2V0X21vZGVfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgaW50IG1vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9zZXRfbW9kZV9vcHMoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBtb2RlKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiA9IGJvbmQtPmRldjsKKwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQk9ORF9NT0RFX1JPVU5EUk9CSU46CiAJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX3htaXRfcm91bmRyb2JpbjsKQEAgLTQyMTksMTIgKzQ0OTcsMjAgQEAKIAkJYnJlYWs7CiAJY2FzZSBCT05EX01PREVfWE9SOgogCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X3hvcjsKKwkJaWYgKGJvbmQtPnBhcmFtcy54bWl0X3BvbGljeSA9PSBCT05EX1hNSVRfUE9MSUNZX0xBWUVSMzQpCisJCQlib25kLT54bWl0X2hhc2hfcG9saWN5ID0gYm9uZF94bWl0X2hhc2hfcG9saWN5X2wzNDsKKwkJZWxzZQorCQkJYm9uZC0+eG1pdF9oYXNoX3BvbGljeSA9IGJvbmRfeG1pdF9oYXNoX3BvbGljeV9sMjsKIAkJYnJlYWs7CiAJY2FzZSBCT05EX01PREVfQlJPQURDQVNUOgogCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X2Jyb2FkY2FzdDsKIAkJYnJlYWs7CiAJY2FzZSBCT05EX01PREVfODAyM0FEOgogCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF8zYWRfeG1pdF94b3I7CisJCWlmIChib25kLT5wYXJhbXMueG1pdF9wb2xpY3kgPT0gQk9ORF9YTUlUX1BPTElDWV9MQVlFUjM0KQorCQkJYm9uZC0+eG1pdF9oYXNoX3BvbGljeSA9IGJvbmRfeG1pdF9oYXNoX3BvbGljeV9sMzQ7CisJCWVsc2UKKwkJCWJvbmQtPnhtaXRfaGFzaF9wb2xpY3kgPSBib25kX3htaXRfaGFzaF9wb2xpY3lfbDI7CiAJCWJyZWFrOwogCWNhc2UgQk9ORF9NT0RFX1RMQjoKIAljYXNlIEJPTkRfTU9ERV9BTEI6CkBAIC00MjczLDcgKzQ1NTksNyBAQAogCWJvbmRfZGV2LT5jaGFuZ2VfbXR1ID0gYm9uZF9jaGFuZ2VfbXR1OwogCWJvbmRfZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBib25kX3NldF9tYWNfYWRkcmVzczsKIAotCWJvbmRfc2V0X21vZGVfb3BzKGJvbmRfZGV2LCBib25kLT5wYXJhbXMubW9kZSk7CisJYm9uZF9zZXRfbW9kZV9vcHMoYm9uZCwgYm9uZC0+cGFyYW1zLm1vZGUpOwogCiAJYm9uZF9kZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKIApAQCAtNDM4NCw2ICs0NjcwLDI1IEBACiAJCX0KIAl9CiAKKwlpZiAoeG1pdF9oYXNoX3BvbGljeSkgeworCQlpZiAoKGJvbmRfbW9kZSAhPSBCT05EX01PREVfWE9SKSAmJgorCQkgICAgKGJvbmRfbW9kZSAhPSBCT05EX01PREVfODAyM0FEKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6IHhvcl9tb2RlIHBhcmFtIGlzIGlycmVsZXZhbnQgaW4gbW9kZSAlc1xuIiwKKwkJCSAgICAgICBib25kX21vZGVfbmFtZShib25kX21vZGUpKTsKKwkJfSBlbHNlIHsKKwkJCXhtaXRfaGFzaHR5cGUgPSBib25kX3BhcnNlX3Bhcm0oeG1pdF9oYXNoX3BvbGljeSwKKwkJCQkJCQl4bWl0X2hhc2h0eXBlX3RibCk7CisJCQlpZiAoeG1pdF9oYXNodHlwZSA9PSAtMSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgIAkiOiBFcnJvcjogSW52YWxpZCB4bWl0X2hhc2hfcG9saWN5IFwiJXNcIlxuIiwKKwkJCSAgICAgICAJeG1pdF9oYXNoX3BvbGljeSA9PSBOVUxMID8gIk5VTEwiIDoKKwkJCQkgICAgICAgeG1pdF9oYXNoX3BvbGljeSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKIAlpZiAobGFjcF9yYXRlKSB7CiAJCWlmIChib25kX21vZGUgIT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQpAQCAtNDU5NSw2ICs0OTAwLDcgQEAKIAogCS8qIGZpbGwgcGFyYW1zIHN0cnVjdCB3aXRoIHRoZSBwcm9wZXIgdmFsdWVzICovCiAJcGFyYW1zLT5tb2RlID0gYm9uZF9tb2RlOworCXBhcmFtcy0+eG1pdF9wb2xpY3kgPSB4bWl0X2hhc2h0eXBlOwogCXBhcmFtcy0+bWlpbW9uID0gbWlpbW9uOwogCXBhcmFtcy0+YXJwX2ludGVydmFsID0gYXJwX2ludGVydmFsOwogCXBhcmFtcy0+dXBkZWxheSA9IHVwZGVsYXk7CkBAIC00NjY5LDYgKzQ5NzUsNyBAQAogCiAJcnRubF91bmxvY2soKTsKIAlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJvbmRfbmV0ZGV2X25vdGlmaWVyKTsKKwlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmYm9uZF9pbmV0YWRkcl9ub3RpZmllcik7CiAKIAlyZXR1cm4gMDsKIApAQCAtNDY4NCw2ICs0OTkxLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBib25kaW5nX2V4aXQodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYm9uZF9uZXRkZXZfbm90aWZpZXIpOworCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmJvbmRfaW5ldGFkZHJfbm90aWZpZXIpOwogCiAJcnRubF9sb2NrKCk7CiAJYm9uZF9mcmVlX2FsbCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAppbmRleCA4YzMyNTMwLi5kMjdmMzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtMjUsNiArMjUsMTAgQEAKICAqCiAgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CiAgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICoKKyAqIDIwMDUvMDUvMDUgLSBKYXNvbiBHYWJsZXIgPGp5Z2FibGVyIGF0IGxibCBkb3QgZ292PgorICogICAgICAtIGFkZGVkICJ4bWl0X3BvbGljeSIga2VybmVsIHBhcmFtZXRlciBmb3IgYWx0ZXJuYXRlIGhhc2hpbmcgcG9saWN5CisgKgkgIHN1cHBvcnQgZm9yIG1vZGUgMgogICovCiAKICNpZm5kZWYgX0xJTlVYX0JPTkRJTkdfSApAQCAtMzYsOCArNDAsOCBAQAogI2luY2x1ZGUgImJvbmRfM2FkLmgiCiAjaW5jbHVkZSAiYm9uZF9hbGIuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTgkiMi42LjEiCi0jZGVmaW5lIERSVl9SRUxEQVRFCSJPY3RvYmVyIDI5LCAyMDA0IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi42LjMiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lIDgsIDIwMDUiCiAjZGVmaW5lIERSVl9OQU1FCSJib25kaW5nIgogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkV0aGVybmV0IENoYW5uZWwgQm9uZGluZyBEcml2ZXIiCiAKQEAgLTEzNyw2ICsxNDEsNyBAQAogCiBzdHJ1Y3QgYm9uZF9wYXJhbXMgewogCWludCBtb2RlOworCWludCB4bWl0X3BvbGljeTsKIAlpbnQgbWlpbW9uOwogCWludCBhcnBfaW50ZXJ2YWw7CiAJaW50IHVzZV9jYXJyaWVyOwpAQCAtMTQ5LDYgKzE1NCw3IEBACiAKIHN0cnVjdCB2bGFuX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZsYW5fbGlzdDsKKwl1MzIgdmxhbl9pcDsKIAl1bnNpZ25lZCBzaG9ydCB2bGFuX2lkOwogfTsKIApAQCAtMTk3LDYgKzIwMyw4IEBACiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAlzdHJ1Y3QgICBsaXN0X2hlYWQgYm9uZF9saXN0OwogCXN0cnVjdCAgIGRldl9tY19saXN0ICptY19saXN0OworCWludCAgICAgICgqeG1pdF9oYXNoX3BvbGljeSkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKKwl1MzIgICAgICBtYXN0ZXJfaXA7CiAJdTE2ICAgICAgZmxhZ3M7CiAJc3RydWN0ICAgYWRfYm9uZF9pbmZvIGFkX2luZm87CiAJc3RydWN0ICAgYWxiX2JvbmRfaW5mbyBhbGJfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5jIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKaW5kZXggNWM1ZjU0MC4uYjk2ZDZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKQEAgLTE3NCw2ICsxNzQsMTMgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0lYRFAyWDAxX0NTODkwMF9WSVJUX0JBU0UsIDB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0lSUV9JWERQMlgwMV9DUzg5MDAsIDAsIDAsIDB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KQorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjZGVmaW5lIENJUlJVU19ERUZBVUxUX0JBU0UJSU9fQUREUkVTUyhFWFRfU1RBVElDMl9zMF9CQVNFICsgMHgyMDAwMDApCS8qID0gUGh5c2ljYWwgYWRkcmVzcyAweDQ4MjAwMDAwICovCisjZGVmaW5lIENJUlJVU19ERUZBVUxUX0lSUQlWSF9JTlRDX0lOVF9OVU1fQ0FTQ0FERURfSU5URVJSVVBUXzEgLyogRXZlbnQgaW5wdXRzIGJhbmsgMSAtIElEIDM1L2JpdCAzICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0NJUlJVU19ERUZBVUxUX0JBU0UsIDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0NJUlJVU19ERUZBVUxUX0lSUSwgMCwgMCwgMH07CiAjZWxzZQogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CiAgICB7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MmEwLCAweDJjMCwgMHgyZTAsIDB9OwpAQCAtMzE5LDEzICszMjYsNyBAQAogCX0KIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0Jb3V0dyhQUF9DaGlwSUQsIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjczg5eDA6IG5vIGNzODkwMCBvciBjczg5MjAgZGV0ZWN0ZWQuICBCZSBzdXJlIHRvIGRpc2FibGUgUG5QIHdpdGggU0VUVVBcbiIpOwpAQCAtNDM3LDYgKzQzOCwzMCBAQAogI2VuZGlmCiAgICAgICAgIH0KIAorI2lmZGVmIENPTkZJR19BUkNIX1BOWDAxMDUKKwlpbml0aWFsaXplX2ViaSgpOworCisJLyogTWFwIEdQSU8gcmVnaXN0ZXJzIGZvciB0aGUgcGlucyBjb25uZWN0ZWQgdG8gdGhlIENTODkwMGEuICovCisJaWYgKG1hcF9jaXJydXNfZ3BpbygpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXNldF9jaXJydXMoKTsKKworCS8qIE1hcCBldmVudC1yb3V0ZXIgcmVnaXN0ZXJzLiAqLworCWlmIChtYXBfZXZlbnRfcm91dGVyKCkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVuYWJsZV9jaXJydXNfaXJxKCk7CisKKwl1bm1hcF9jaXJydXNfZ3BpbygpOworCXVubWFwX2V2ZW50X3JvdXRlcigpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspCisJCXJlYWRyZWcoZGV2LCAwKTsKKyNlbmRpZgorCiAJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHdlIGNhbiBmaW5kIGFub3RoZXIgYm9hcmQgaWYgYXV0b0lSUSBmYWlscy4gKi8KIAkvKiBXVEYgaXMgZ29pbmcgb24gaGVyZT8gKi8KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciAmIH4zLCBORVRDQVJEX0lPX0VYVEVOVCwgRFJWX05BTUUpKSB7CkBAIC02NzgsNyArNzAzLDcgQEAKIAl9IGVsc2UgewogCQlpID0gbHAtPmlzYV9jb25maWcgJiBJTlRfTk9fTUFTSzsKIAkJaWYgKGxwLT5jaGlwX3R5cGUgPT0gQ1M4OTAwKSB7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMDUpCiAJCSAgICAgICAgaSA9IGNzODkwMF9pcnFfbWFwWzBdOwogI2Vsc2UKIAkJCS8qIFRyYW5zbGF0ZSB0aGUgSVJRIHVzaW5nIHRoZSBJUlEgbWFwcGluZyB0YWJsZS4gKi8KQEAgLTczNSw3ICs3NjAsMTMgQEAKIAlwcmludGsoIlxuIik7CiAJaWYgKG5ldF9kZWJ1ZykKIAkJcHJpbnRrKCJjczg5eDBfcHJvYmUxKCkgc3VjY2Vzc2Z1bFxuIik7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDM7CiAJcmV0dXJuIDA7CitvdXQzOgorCW91dHcoUFBfQ2hpcElELCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKIG91dDI6CiAJcmVsZWFzZV9yZWdpb24oaW9hZGRyICYgfjMsIE5FVENBUkRfSU9fRVhURU5UKTsKIG91dDE6CkBAIC0xMTQ1LDcgKzExNzYsNyBAQAogCWludCBpOwogCWludCByZXQ7CiAKLSNpZm5kZWYgQ09ORklHX1NIX0hJQ09TSDQgLyogdXNlcyBpcnEjMSwgc28gdGhpcyB3b24ndCB3b3JrICovCisjaWYgIWRlZmluZWQoQ09ORklHX1NIX0hJQ09TSDQpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMDUpIC8qIHVzZXMgaXJxIzEsIHNvIHRoaXMgd29uJ3Qgd29yayAqLwogCWlmIChkZXYtPmlycSA8IDIpIHsKIAkJLyogQWxsb3cgaW50ZXJydXB0cyB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNoaXAgKi8KIC8qIENpcnJ1cycgcmVsZWFzZSBoYWQgdGhpczogKi8KQEAgLTExNzYsNyArMTIwNyw3IEBACiAJZWxzZQogI2VuZGlmCiAJewotI2lmbmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KQogCQlpZiAoKCgxIDw8IGRldi0+aXJxKSAmIGxwLT5pcnFfbWFwKSA9PSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgaXMgbm90IGluIG91ciBtYXAgb2YgYWxsb3dhYmxlIElSUXMsIHdoaWNoIGlzICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGxwLT5pcnFfbWFwKTsKQEAgLTEyNjEsNiArMTI5Miw5IEBACiAJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCXzI7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OiByZXN1bHQgPSBscC0+YWRhcHRlcl9jbmYgJiAoQV9DTkZfMTBCX1QgfCBBX0NORl9BVUkgfCBBX0NORl8xMEJfMik7CiAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfQVJDSF9QTlgwMTA1CisJcmVzdWx0ID0gQV9DTkZfMTBCX1Q7CisjZW5kaWYKICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBFRVBST00gaXMgY29uZmlndXJlZCBmb3IgdW5hdmFpbGFibGUgbWVkaWFcbiIsIGRldi0+bmFtZSk7CiAgICAgICAgIHJlbGVhc2VfaXJxOgpAQCAtMTgzMSwxMyArMTg2NSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLSAgICAgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzODl4MC5jOiBObyBjYXJkIGZvdW5kIGF0IDB4JXhcbiIsIGlvKTsKLSAgICAgICAgICAgICAgICByZXQgPSAtRU5YSU87Ci0JCW91dHcoUFBfQ2hpcElELCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKLQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKLQkJZ290byBvdXQ7Ci0gICAgICAgIH0KIAlkZXZfY3M4OXgwID0gZGV2OwogCXJldHVybiAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmggYi9kcml2ZXJzL25ldC9jczg5eDAuaAppbmRleCBiMGVmN2FkLi5iZDNhZDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuaAorKysgYi9kcml2ZXJzL25ldC9jczg5eDAuaApAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKIC8qIElYRFAyNDAxL0lYRFAyODAxIHVzZXMgZHdvcmQtYWxpZ25lZCByZWdpc3RlciBhZGRyZXNzaW5nICovCiAjZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKChyZWcpICogMikKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCBhNmFhNTY1Li41YWNkMzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTE5MSw2ICsxOTEsNyBAQAogICoJCUZlYiAyMDAxCWRhdmVqCQlQQ0kgZW5hYmxlIGNsZWFudXBzLgogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCiAgKgkJMTQgQXVnIDIwMDQJbWFjcm8JCUZpeCBkZXZpY2UgbmFtZXMgcmVwb3J0ZWQuCisgKgkJMTQgSnVuIDIwMDUJbWFjcm8JCVVzZSBpcnFyZXR1cm5fdC4KICAqLwogCiAvKiBJbmNsdWRlIGZpbGVzICovCkBAIC0yMTcsOCArMjE4LDggQEAKIAogLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBzdHJpbmcgc2hvdWxkIGJlIHVwZGF0ZWQgcHJpb3IgdG8gZWFjaCBuZXcgcmVsZWFzZSEgICovCiAjZGVmaW5lIERSVl9OQU1FICJkZWZ4eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gInYxLjA3IgotI2RlZmluZSBEUlZfUkVMREFURSAiMjAwNC8wOC8xNCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gInYxLjA4IgorI2RlZmluZSBEUlZfUkVMREFURSAiMjAwNS8wNi8xNCIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQogCURSVl9OQU1FICI6ICIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFCkBAIC0yNDcsNyArMjQ4LDggQEAKIHN0YXRpYyB2b2lkCQlkZnhfaW50X3ByX2hhbHRfaWQoREZYX2JvYXJkX3QgKmJwKTsKIHN0YXRpYyB2b2lkCQlkZnhfaW50X3R5cGVfMF9wcm9jZXNzKERGWF9ib2FyZF90ICpicCk7CiBzdGF0aWMgdm9pZAkJZGZ4X2ludF9jb21tb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZAkJZGZ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdAlkZnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIHN0YXRpYyBzdHJ1Y3QJCW5ldF9kZXZpY2Vfc3RhdHMgKmRmeF9jdGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQJCWRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNDM3LDcgKzQzOSw4IEBACiAJfQogCiAJU0VUX01PRFVMRV9PV05FUihkZXYpOwotCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJaWYgKHBkZXYgIT0gTlVMTCkKKwkJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAogCWJwID0gZGV2LT5wcml2OwogCkBAIC0xMjI1LDcgKzEyMjgsNyBAQAogCQogCS8qIFJlZ2lzdGVyIElSUSAtIHN1cHBvcnQgc2hhcmVkIGludGVycnVwdHMgYnkgcGFzc2luZyBkZXZpY2UgcHRyICovCiAKLQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilkZnhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZnhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVxdWVzdGVkIElSUSAlZCBpcyBidXN5XG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKIAkJcmV0dXJuIHJldDsKQEAgLTE2ODAsMTMgKzE2ODMsMTMgQEAKICAqID09PT09PT09PT09PT09PT09CiAgKiA9IGRmeF9pbnRlcnJ1cHQgPQogICogPT09PT09PT09PT09PT09PT0KLSAqICAgCisgKgogICogT3ZlcnZpZXc6CiAgKiAgIEludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmUKLSAqICAKKyAqCiAgKiBSZXR1cm5zOgotICogICBOb25lCi0gKiAgICAgICAKKyAqICAgV2hldGhlciBhIHZhbGlkIGludGVycnVwdCB3YXMgc2Vlbi4KKyAqCiAgKiBBcmd1bWVudHM6CiAgKiAgIGlycQktIGludGVycnVwdCB2ZWN0b3IKICAqICAgZGV2X2lkCS0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KQEAgLTE2OTksNyArMTcwMiw4IEBACiAgKiAgIHN0cnVjdHVyZSBjb250ZXh0LgogICoKICAqIFJldHVybiBDb2RlczoKLSAqICAgTm9uZQorICogICBJUlFfSEFORExFRCAtIGFuIElSUSB3YXMgaGFuZGxlZC4KKyAqICAgSVJRX05PTkUgICAgLSBubyBJUlEgd2FzIGhhbmRsZWQuCiAgKgogICogQXNzdW1wdGlvbnM6CiAgKiAgIFRoZSBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VtZW50IGF0IHRoZSBoYXJkd2FyZSBsZXZlbCAoZWcuIEFDS2luZyB0aGUgUElDCkBAIC0xNzEyLDYwICsxNzE2LDcwIEBACiAgKiAgIEludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGVuIHJlZW5hYmxlZCBhdCB0aGUgYWRhcHRlci4KICAqLwogCi1zdGF0aWMgdm9pZCBkZnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MJKnJlZ3MpCi0Jeworc3RhdGljIGlycXJldHVybl90IGRmeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gZGV2X2lkOwogCURGWF9ib2FyZF90CQkqYnA7CS8qIHByaXZhdGUgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgKi8KLQl1OAkJCQl0bXA7CS8qIHVzZWQgZm9yIGRpc2FibGluZy9lbmFibGluZyBpbnRzICovCiAKIAkvKiBHZXQgYm9hcmQgcG9pbnRlciBvbmx5IGlmIGRldmljZSBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KIAogCWJwID0gZGV2LT5wcml2OwogCi0Jc3Bpbl9sb2NrKCZicC0+bG9jayk7Ci0JCiAJLyogU2VlIGlmIHdlJ3JlIGFscmVhZHkgc2VydmljaW5nIGFuIGludGVycnVwdCAqLwogCiAJLyogU2VydmljZSBhZGFwdGVyIGludGVycnVwdHMgKi8KIAotCWlmIChicC0+YnVzX3R5cGUgPT0gREZYX0JVU19UWVBFX1BDSSkKLQkJewotCQkvKiBEaXNhYmxlIFBEUS1QRkkgaW50ZXJydXB0cyBhdCBQRkkgKi8KKwlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9QQ0kpIHsKKwkJdTMyIHN0YXR1czsKIAotCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLCBQRklfTU9ERV9NX0RNQV9FTkIpOworCQlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBGSV9LX1JFR19TVEFUVVMsICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiBQRklfU1RBVFVTX01fUERRX0lOVCkpCisJCQlyZXR1cm4gSVJRX05PTkU7CisKKwkJc3Bpbl9sb2NrKCZicC0+bG9jayk7CisKKwkJLyogRGlzYWJsZSBQRFEtUEZJIGludGVycnVwdHMgYXQgUEZJICovCisJCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBGSV9LX1JFR19NT0RFX0NUUkwsCisJCQkJICAgIFBGSV9NT0RFX01fRE1BX0VOQik7CiAKIAkJLyogQ2FsbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciB0aGlzIGFkYXB0ZXIgKi8KLQogCQlkZnhfaW50X2NvbW1vbihkZXYpOwogCiAJCS8qIENsZWFyIFBEUSBpbnRlcnJ1cHQgc3RhdHVzIGJpdCBhbmQgcmVlbmFibGUgaW50ZXJydXB0cyAqLwotCi0JCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBGSV9LX1JFR19TVEFUVVMsIFBGSV9TVEFUVVNfTV9QRFFfSU5UKTsKKwkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX1NUQVRVUywKKwkJCQkgICAgUEZJX1NUQVRVU19NX1BEUV9JTlQpOwogCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLAotCQkJCQkoUEZJX01PREVfTV9QRFFfSU5UX0VOQiArIFBGSV9NT0RFX01fRE1BX0VOQikpOwotCQl9Ci0JZWxzZQotCQl7Ci0JCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUgRVNJQyAqLworCQkJCSAgICAoUEZJX01PREVfTV9QRFFfSU5UX0VOQiB8CisJCQkJICAgICBQRklfTU9ERV9NX0RNQV9FTkIpKTsKIAotCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmdG1wKTsKLQkJdG1wICY9IH5QSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQjsKLQkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsIHRtcCk7CisJCXNwaW5fdW5sb2NrKCZicC0+bG9jayk7CisJfSBlbHNlIHsKKwkJdTggc3RhdHVzOworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiBQSV9DT05GSUdfU1RBVF8wX01fUEVORCkpCisJCQlyZXR1cm4gSVJRX05PTkU7CisKKwkJc3Bpbl9sb2NrKCZicC0+bG9jayk7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBFU0lDICovCisJCXN0YXR1cyAmPSB+UElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCBzdGF0dXMpOwogCiAJCS8qIENhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyICovCi0KIAkJZGZ4X2ludF9jb21tb24oZGV2KTsKIAogCQkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBFU0lDICovCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZzdGF0dXMpOworCQlzdGF0dXMgfD0gUElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCBzdGF0dXMpOwogCi0JCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZ0bXApOwotCQl0bXAgfD0gUElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7Ci0JCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCB0bXApOwotCQl9Ci0KLQlzcGluX3VubG9jaygmYnAtPmxvY2spOworCQlzcGluX3VubG9jaygmYnAtPmxvY2spOwogCX0KIAorCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogDAogLyoKICAqID09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGwyay5jIGIvZHJpdmVycy9uZXQvZGwyay5jCmluZGV4IGFhNDJiN2EuLjQzMGM2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RsMmsuYworKysgYi9kcml2ZXJzL25ldC9kbDJrLmMKQEAgLTU0Nyw3ICs1NDcsNyBAQAogCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCQkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CiAJCQkJICAgIGNwdV90b19sZTY0IChwY2lfbWFwX3NpbmdsZQotCQkJCQkgKG5wLT5wZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osCisJCQkJCSAobnAtPnBkZXYsIHNrYi0+ZGF0YSwgbnAtPnJ4X2J1Zl9zeiwKIAkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJCX0KIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyB8PQpAQCAtNjE4LDcgKzYxOCw3IEBACiAJCS8qIFJ1Ymljb24gbm93IHN1cHBvcnRzIDQwIGJpdHMgb2YgYWRkcmVzc2luZyBzcGFjZS4gKi8KIAkJbnAtPnJ4X3JpbmdbaV0uZnJhZ2luZm8gPQogCQkgICAgY3B1X3RvX2xlNjQgKCBwY2lfbWFwX3NpbmdsZSAoCi0JCQkgCSAgbnAtPnBkZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCSAJICBucC0+cGRldiwgc2tiLT5kYXRhLCBucC0+cnhfYnVmX3N6LAogCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvIHw9IGNwdV90b19sZTY0IChucC0+cnhfYnVmX3N6KSA8PCA0ODsKIAl9CkBAIC05MDYsNyArOTA2LDcgQEAKIAkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKIAkJCQlldGhfY29weV9hbmRfc3VtIChza2IsCi0JCQkJCQkgIG5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLAorCQkJCQkJICBucC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKIAkJCQkJCSAgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dCAoc2tiLCBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBkZXYsCkBAIC05NTAsNyArOTUwLDcgQEAKIAkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0KIAkJCSAgICBjcHVfdG9fbGU2NCAocGNpX21hcF9zaW5nbGUKLQkJCQkJIChucC0+cGRldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJCQkgKG5wLT5wZGV2LCBza2ItPmRhdGEsIG5wLT5yeF9idWZfc3osCiAJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCX0KIAkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvIHw9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IGY0YmEwZmYuLjVmZGRjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogc3RhdGljIHZvaWQgZG05MDAwX2luYmxrXzhiaXQodm9pZCBfX2lvbWVtICpyZWcsIHZvaWQgKmRhdGEsIGludCBjb3VudCkKIHsKLQlyZWFkc2IocmVnLCBkYXRhLCBjb3VudCsxKTsKKwlyZWFkc2IocmVnLCBkYXRhLCBjb3VudCk7CiB9CiAKIApAQCAtMzY0LDcgKzM2NCw3IEBACiAJfQogCiAJaWYgKGRiLT5hZGRyX3JlcyAhPSBOVUxMKSB7Ci0JCXJlbGVhc2VfcmVzb3VyY2UoZGItPmRhdGFfcmVxKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShkYi0+YWRkcl9yZXMpOwogCQlrZnJlZShkYi0+YWRkcl9yZXEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCA0YTQ3ZGY1Li5kMGZhMjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CkBAIC0xMDkyLDExICsxMDkzLDE2IEBACiAJfQogCiAJaWYoKG5pYy0+bWFjID49IG1hY184MjU1MF9EMTAyKSB8fCAoKG5pYy0+ZmxhZ3MgJiBpY2gpICYmIAotCQkobWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfVFBJU1RBVFVTKSAmIDB4ODAwMCkgJiYgCi0JCShuaWMtPmVlcHJvbVtlZXByb21fY25mZ19tZGl4XSAmIGVlcHJvbV9tZGl4X2VuYWJsZWQpKSkKLQkJLyogZW5hYmxlL2Rpc2FibGUgTURJL01ESS1YIGF1dG8tc3dpdGNoaW5nICovCi0JCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OQ09ORklHLAotCQkJbmljLT5taWkuZm9yY2VfbWVkaWEgPyAwIDogTkNPTkZJR19BVVRPX1NXSVRDSCk7CisJICAgKG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX1RQSVNUQVRVUykgJiAweDgwMDApKSkgeworCQkvKiBlbmFibGUvZGlzYWJsZSBNREkvTURJLVggYXV0by1zd2l0Y2hpbmcuCisJCSAgIE1ESS9NREktWCBhdXRvLXN3aXRjaGluZyBpcyBkaXNhYmxlZCBmb3IgODI1NTFFUi9RTSBjaGlwcyAqLworCQlpZigobmljLT5tYWMgPT0gbWFjXzgyNTUxX0UpIHx8IChuaWMtPm1hYyA9PSBtYWNfODI1NTFfRikgfHwKKwkJICAgKG5pYy0+bWFjID09IG1hY184MjU1MV8xMCkgfHwgKG5pYy0+bWlpLmZvcmNlX21lZGlhKSB8fCAKKwkJICAgIShuaWMtPmVlcHJvbVtlZXByb21fY25mZ19tZGl4XSAmIGVlcHJvbV9tZGl4X2VuYWJsZWQpKSAKKwkJCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OQ09ORklHLCAwKTsKKwkJZWxzZQorCQkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05DT05GSUcsIE5DT05GSUdfQVVUT19TV0lUQ0gpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTY2NSw4ICsxNjcxLDEwIEBACiAJaWYoc3RhdF9hY2sgJiBzdGF0X2Fja19ybnIpCiAJCW5pYy0+cnVfcnVubmluZyA9IFJVX1NVU1BFTkRFRDsKIAotCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKLQluZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCWlmKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKSB7CisJCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKKwkJX19uZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTIyODYsNyArMjI5NCw3IEBACiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCi0JaWYoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRlVMTCkpKSB7CisJaWYoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CkBAIC0yMzM0LDExICsyMzQyLDExIEBACiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAotCWUxMDBfcGh5X2luaXQobmljKTsKLQogCWlmKChlcnIgPSBlMTAwX2VlcHJvbV9sb2FkKG5pYykpKQogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAorCWUxMDBfcGh5X2luaXQobmljKTsKKwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBuaWMtPmVlcHJvbSwgRVRIX0FMRU4pOwogCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkludmFsaWQgTUFDIGFkZHJlc3MgZnJvbSAiCkBAIC0yNDM5LDkgKzI0NDcsOCBAQAogI2VuZGlmCiAKIAotc3RhdGljIHZvaWQgZTEwMF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBlMTAwX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC0yNDYyLDExICsyNDY5LDcgQEAKIAkuc3VzcGVuZCA9ICAgICAgZTEwMF9zdXNwZW5kLAogCS5yZXN1bWUgPSAgICAgICBlMTAwX3Jlc3VtZSwKICNlbmRpZgotCi0JLmRyaXZlciA9IHsKLQkJLnNodXRkb3duID0gZTEwMF9zaHV0ZG93biwKLQl9Ci0KKwkuc2h1dGRvd24gPQllMTAwX3NodXRkb3duLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZTEwMF9pbml0X21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKaW5kZXggYWYxZTgyYy4uMDkyNzU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCkBAIC0xNDAsNyArMTQwLDcgQEAKICNkZWZpbmUgRTEwMDBfUlhfQlVGRkVSX1dSSVRFCTE2CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLwogCiAjZGVmaW5lIEFVVE9fQUxMX01PREVTICAgICAgICAgICAgMAotI2RlZmluZSBFMTAwMF9FRVBST01fODI1NDRfQVBNICAgIDB4MDQwMAorI2RlZmluZSBFMTAwMF9FRVBST01fODI1NDRfQVBNICAgIDB4MDAwNAogI2RlZmluZSBFMTAwMF9FRVBST01fQVBNRSAgICAgICAgIDB4MDQwMAogCiAjaWZuZGVmIEUxMDAwX01BU1RFUl9TTEFWRQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIgKi8KIHN0cnVjdCBlMTAwMF9idWZmZXIgewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdWludDY0X3QgZG1hOworCWRtYV9hZGRyX3QgZG1hOwogCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKIAl1aW50MTZfdCBsZW5ndGg7CiAJdWludDE2X3QgbmV4dF90b193YXRjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCAyMzcyNDdmLi5mMTMzZmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewpAQCAtMTQxLDkgKzE0MSw5IEBACiAJCQkJICAgICBTVVBQT1JURURfRklCUkUgfAogCQkJCSAgICAgU1VQUE9SVEVEX0F1dG9uZWcpOwogCi0JCWVjbWQtPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJICAgICBTVVBQT1JURURfRklCUkUgfAotCQkJCSAgICAgU1VQUE9SVEVEX0F1dG9uZWcpOworCQllY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkgICAgIEFEVkVSVElTRURfRklCUkUgfAorCQkJCSAgICAgQURWRVJUSVNFRF9BdXRvbmVnKTsKIAogCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKIApAQCAtMTc5LDEzICsxNzksMjQgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlpZihlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCWh3LT5hdXRvbmVnID0gMTsKLQkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDB4MDAyRjsKLQkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAweDAwMkY7CisJCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpCisJCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJICAgICBBRFZFUlRJU0VEX0ZJQlJFIHwKKwkJCQkgICAgIEFEVkVSVElTRURfQXV0b25lZzsKKwkJZWxzZSAKKwkJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCQkgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbHwKKwkJCQkJCSAgQURWRVJUSVNFRF9BdXRvbmVnIHwKKwkJCQkJCSAgQURWRVJUSVNFRF9UUDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBody0+YXV0b25lZ19hZHZlcnRpc2VkOwogCX0gZWxzZQogCQlpZihlMTAwMF9zZXRfc3BkX2RwbHgoYWRhcHRlciwgZWNtZC0+c3BlZWQgKyBlY21kLT5kdXBsZXgpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDYsNyArMjE3LDcgQEAKIGUxMDAwX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCXBhdXNlLT5hdXRvbmVnID0gCkBAIC0yMjYsNyArMjM3LDcgQEAKIGUxMDAwX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAkKIAlhZGFwdGVyLT5mY19hdXRvbmVnID0gcGF1c2UtPmF1dG9uZWc7CkBAIC0yNTksMTQgKzI3MCwxNCBAQAogc3RhdGljIHVpbnQzMl90CiBlMTAwMF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlyZXR1cm4gYWRhcHRlci0+cnhfY3N1bTsKIH0KIAogc3RhdGljIGludAogZTEwMDBfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYWRhcHRlci0+cnhfY3N1bSA9IGRhdGE7CiAKIAlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKQEAgLTI4Niw3ICsyOTcsNyBAQAogc3RhdGljIGludAogZTEwMDBfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSB7CiAJCWlmICghZGF0YSkKQEAgLTMwNiw4ICszMTcsOCBAQAogc3RhdGljIGludAogZTEwMDBfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OwotCWlmICgoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0NCkgfHwKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaWYoKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDQpIHx8CiAJICAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIAogCQlyZXR1cm4gZGF0YSA/IC1FSU5WQUwgOiAwOwogCkBAIC0zMjIsMTQgKzMzMywxNCBAQAogc3RhdGljIHVpbnQzMl90CiBlMTAwMF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJcmV0dXJuIGFkYXB0ZXItPm1zZ19lbmFibGU7CiB9CiAKIHN0YXRpYyB2b2lkCiBlMTAwMF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYWRhcHRlci0+bXNnX2VuYWJsZSA9IGRhdGE7CiB9CiAKQEAgLTM0NCw3ICszNTUsNyBAQAogZTEwMDBfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1aW50MzJfdCAqcmVnc19idWZmID0gcDsKIAl1aW50MTZfdCBwaHlfZGF0YTsKQEAgLTQzMiw3ICs0NDMsNyBAQAogc3RhdGljIGludAogZTEwMDBfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJcmV0dXJuIGFkYXB0ZXItPmh3LmVlcHJvbS53b3JkX3NpemUgKiAyOwogfQogCkBAIC00NDAsNyArNDUxLDcgQEAKIGUxMDAwX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdWludDE2X3QgKmVlcHJvbV9idWZmOwogCWludCBmaXJzdF93b3JkLCBsYXN0X3dvcmQ7CkBAIC00ODYsNyArNDk3LDcgQEAKIGUxMDAwX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdWludDE2X3QgKmVlcHJvbV9idWZmOwogCXZvaWQgKnB0cjsKQEAgLTU0Nyw3ICs1NTgsNyBAQAogZTEwMDBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGUxMDAwX2RyaXZlcl9uYW1lLCAzMik7CiAJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBlMTAwMF9kcml2ZXJfdmVyc2lvbiwgMzIpOwpAQCAtNTYzLDcgKzU3NCw3IEBACiBlMTAwMF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGUgPSBhZGFwdGVyLT5ody5tYWNfdHlwZTsKIAlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOwpAQCAtNTg0LDcgKzU5NSw3IEBACiBlMTAwMF9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGUgPSBhZGFwdGVyLT5ody5tYWNfdHlwZTsKIAlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOwpAQCAtNjUxLDYgKzY2Miw5IEBACiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFIsICh0ZXN0W3BhdF0gJiBXKSk7ICAgICAgICAgICAgIFwKIAkJdmFsdWUgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFIpOyAgICAgICAgICAgICAgICAgICAgICAgXAogCQlpZih2YWx1ZSAhPSAodGVzdFtwYXRdICYgVyAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlEUFJJTlRLKERSViwgRVJSLCAicGF0dGVybiB0ZXN0IHJlZyAlMDRYIGZhaWxlZDogZ290ICIgXAorCQkJICAgICAgICAiMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwgICAgICAgICAgICAgICAgICAgIFwKKwkJCSAgICAgICAgRTEwMDBfIyNSLCB2YWx1ZSwgKHRlc3RbcGF0XSAmIFcgJiBNKSk7ICAgICAgICBcCiAJCQkqZGF0YSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSA/ICAgICAgICAgXAogCQkJCUUxMDAwXzgyNTQyXyMjUiA6IEUxMDAwXyMjUjsgICAgICAgICAgICAgICAgICAgXAogCQkJcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTY2Myw3ICs2NzcsOSBAQAogCXVpbnQzMl90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFIsIFcgJiBNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXZhbHVlID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmICgoVyAmIE0pICE9ICh2YWx1ZSAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmKChXICYgTSkgIT0gKHZhbHVlICYgTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCURQUklOVEsoRFJWLCBFUlIsICJzZXQvY2hlY2sgcmVnICUwNFggdGVzdCBmYWlsZWQ6IGdvdCAweCUwOFggIlwKKwkJICAgICAgICAiZXhwZWN0ZWQgMHglMDhYXG4iLCBFMTAwMF8jI1IsICh2YWx1ZSAmIE0pLCAoVyAmIE0pKTsgXAogCQkqZGF0YSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSA/ICAgICAgICAgICAgICAgICBcCiAJCQlFMTAwMF84MjU0Ml8jI1IgOiBFMTAwMF8jI1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlyZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02NzMsMTggKzY4OSwzMyBAQAogc3RhdGljIGludAogZTEwMDBfcmVnX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQogewotCXVpbnQzMl90IHZhbHVlOwotCXVpbnQzMl90IGk7CisJdWludDMyX3QgdmFsdWUsIGJlZm9yZSwgYWZ0ZXI7CisJdWludDMyX3QgaSwgdG9nZ2xlOwogCiAJLyogVGhlIHN0YXR1cyByZWdpc3RlciBpcyBSZWFkIE9ubHksIHNvIGEgd3JpdGUgc2hvdWxkIGZhaWwuCiAJICogU29tZSBiaXRzIHRoYXQgZ2V0IHRvZ2dsZWQgYXJlIGlnbm9yZWQuCiAJICovCi0JdmFsdWUgPSAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgKDB4RkZGRkY4MzMpKTsKLQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsICgweEZGRkZGRkZGKSk7Ci0JaWYodmFsdWUgIT0gKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmICgweEZGRkZGODMzKSkpIHsKKyAgICAgICAgc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NzM6CisJCXRvZ2dsZSA9IDB4N0ZGRkYwMzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRvZ2dsZSA9IDB4RkZGRkY4MzM7CisJCWJyZWFrOworCX0KKworCWJlZm9yZSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKTsKKwl2YWx1ZSA9IChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiB0b2dnbGUpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUywgdG9nZ2xlKTsKKwlhZnRlciA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIHRvZ2dsZTsKKwlpZih2YWx1ZSAhPSBhZnRlcikgeworCQlEUFJJTlRLKERSViwgRVJSLCAiZmFpbGVkIFNUQVRVUyByZWdpc3RlciB0ZXN0IGdvdDogIgorCQkgICAgICAgICIweCUwOFggZXhwZWN0ZWQ6IDB4JTA4WFxuIiwgYWZ0ZXIsIHZhbHVlKTsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gMTsKIAl9CisJLyogcmVzdG9yZSBwcmV2aW91cyBzdGF0dXMgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsIGJlZm9yZSk7CiAKIAlSRUdfUEFUVEVSTl9URVNUKEZDQUwsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCVJFR19QQVRURVJOX1RFU1QoRkNBSCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CkBAIC03NjYsNyArNzk3LDcgQEAKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOwotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWFkYXB0ZXItPnRlc3RfaWNyIHw9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSUNSKTsKIApAQCAtMTIxNCw2ICsxMjQ1LDcgQEAKIAljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgogCWNhc2UgZTEwMDBfODI1NDc6CiAJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTczOgogCQlyZXR1cm4gZTEwMDBfaW50ZWdyYXRlZF9waHlfbG9vcGJhY2soYWRhcHRlcik7CiAJCWJyZWFrOwogCkBAIC0xNDIyLDcgKzE0NTQsNyBAQAogZTEwMDBfZGlhZ190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCSAgIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1aW50NjRfdCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYm9vbGVhbl90IGlmX3J1bm5pbmcgPSBuZXRpZl9ydW5uaW5nKG5ldGRldik7CiAKIAlpZihldGhfdGVzdC0+ZmxhZ3MgPT0gRVRIX1RFU1RfRkxfT0ZGTElORSkgewpAQCAtMTQ4Miw3ICsxNTE0LDcgQEAKIHN0YXRpYyB2b2lkCiBlMTAwMF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCXN3aXRjaChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKQEAgLTE1MjcsNyArMTU1OSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCXN3aXRjaChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKQEAgLTE1ODgsMjIgKzE2MjAsMzEgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlpZighZGF0YSB8fCBkYXRhID4gKHVpbnQzMl90KShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKIAkJZGF0YSA9ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CiAKLQlpZighYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24pIHsKLQkJaW5pdF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIpOwotCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKLQkJYWRhcHRlci0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyOworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NzMpIHsKKwkJaWYoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CisJCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lcik7CisJCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKKwkJCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKKwkJfQorCQllMTAwMF9zZXR1cF9sZWQoJmFkYXB0ZXItPmh3KTsKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwl9CisJZWxzZSB7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIExFRENUTCwgKEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LX1JBVEUgfAorCQkJRTEwMDBfTEVEQ1RMX0xFRDFfQkxJTksgfCBFMTAwMF9MRURDVExfTEVEMl9CTElOSyB8IAorCQkJKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTiA8PCBFMTAwMF9MRURDVExfTEVEMl9NT0RFX1NISUZUKSB8CisJCQkoRTEwMDBfTEVEQ1RMX01PREVfTElOS19BQ1RJVklUWSA8PCBFMTAwMF9MRURDVExfTEVEMV9NT0RFX1NISUZUKSB8CisJCQkoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiA8PCBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKSkpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CiAJfQogCi0JZTEwMDBfc2V0dXBfbGVkKCZhZGFwdGVyLT5odyk7Ci0JbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7Ci0KLQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7Ci0JZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKIAllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CiAJY2xlYXJfYml0KEUxMDAwX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpOwogCWUxMDAwX2NsZWFudXBfbGVkKCZhZGFwdGVyLT5odyk7CkBAIC0xNjE0LDcgKzE2NTUsNyBAQAogc3RhdGljIGludAogZTEwMDBfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJZTEwMDBfZG93bihhZGFwdGVyKTsKIAkJZTEwMDBfdXAoYWRhcHRlcik7CkBAIC0xNjMyLDcgKzE2NzMsNyBAQAogZTEwMDBfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgCiAJCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdWludDY0X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBpOwogCiAJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKaW5kZXggNzIzNTg5Yi4uMDQ1ZjU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC0zNTQsMTggKzM1NCwyNyBAQAogICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgICAgICAvKiBUaGUgU1RBVFVTX1RCSU1PREUgYml0IGlzIHJlc2VydmVkIG9yIHJldXNlZCBmb3IgdGhlIHRoaXMKKyAgICAgICAgICAgICAqIGRldmljZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7Ci0gICAgICAgICAgICBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19UQklNT0RFKSB7CiAgICAgICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOwogICAgICAgICAgICAgICAgIC8qIHRiaV9jb21wYXRpYmlsaXR5IG5vdCB2YWxpZCBvbiBmaWJlciAqLwogICAgICAgICAgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IEZBTFNFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogVGhpcyBpcyBhbiA4MjU0MiAoZmliZXIgb25seSkgKi8KLSAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTE4OSw5ICsxMTk4LDkgQEAKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7CiAgICAgICAgIGlmKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQorICAgIH0KIAotICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKaW5kZXggYTAyNjNlZS4uOTNlOWY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCkBAIC02Niw2ICs2Niw3IEBACiAgICAgZTEwMDBfZWVwcm9tX3NwaSwKICAgICBlMTAwMF9lZXByb21fbWljcm93aXJlLAogICAgIGUxMDAwX2VlcHJvbV9mbGFzaCwKKyAgICBlMTAwMF9lZXByb21fbm9uZSwgLyogTm8gTlZNIHN1cHBvcnQgKi8KICAgICBlMTAwMF9udW1fZWVwcm9tX3R5cGVzCiB9IGUxMDAwX2VlcHJvbV90eXBlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggMTM3MjI2ZC4uY2I3ZjA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgImUxMDAwLmgiCiAKIC8qIENoYW5nZSBMb2cKKyAqIDYuMC41OCAgICAgICA0LzIwLzA1CisgKiAgIG8gQWNjZXB0ZWQgZXRodG9vbCBjbGVhbnVwIHBhdGNoIGZyb20gU3RlcGhlbiBIZW1taW5nZXIgCiAgKiA2LjAuNDQrCTIvMTUvMDUKICAqICAgbyBhcHBsaWVkIEFudG9uJ3MgcGF0Y2ggdG8gcmVzb2x2ZSB0eCBoYW5nIGluIGhhcmR3YXJlCiAgKiAgIG8gQXBwbGllZCBBbmRyZXcgTW9ydG9ucyBwYXRjaCAtIGUxMDAwIHN0b3BzIHdvcmtpbmcgYWZ0ZXIgcmVzdW1lCkBAIC00MSw5ICs0Myw5IEBACiAjZWxzZQogI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKICNlbmRpZgotI2RlZmluZSBEUlZfVkVSU0lPTiAiNi4wLjU0LWsyIkRSSVZFUk5BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSI2LjAuNjAtazIiRFJJVkVSTkFQSQogY2hhciBlMTAwMF9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047Ci1jaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA0IEludGVsIENvcnBvcmF0aW9uLiI7CitjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA1IEludGVsIENvcnBvcmF0aW9uLiI7CiAKIC8qIGUxMDAwX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCiAgKgpAQCAtNTE3LDcgKzUxOSw3IEBACiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOwotCWFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OwogCWFkYXB0ZXItPnBkZXYgPSBwZGV2OwogCWFkYXB0ZXItPmh3LmJhY2sgPSBhZGFwdGVyOwpAQCAtNzM4LDcgKzc0MCw3IEBACiBlMTAwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdWludDMyX3QgbWFuYywgc3dzbTsKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC04NzEsNyArODczLDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IGVycjsKIAogCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCkBAIC05MTksNyArOTIxLDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJZTEwMDBfZG93bihhZGFwdGVyKTsKIApAQCAtMTU5OSw3ICsxNjAxLDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAogCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQpAQCAtMTYzNCw3ICsxNjM2LDcgQEAKIHN0YXRpYyB2b2lkCiBlMTAwMF9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjIxMyw3ICsyMjE1LDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdW5zaWduZWQgaW50IGZpcnN0LCBtYXhfcGVyX3R4ZCA9IEUxMDAwX01BWF9EQVRBX1BFUl9UWEQ7CiAJdW5zaWduZWQgaW50IG1heF90eGRfcHdyID0gRTEwMDBfTUFYX1RYRF9QV1I7CiAJdW5zaWduZWQgaW50IHR4X2ZsYWdzID0gMDsKQEAgLTIzNDQsNyArMjM0Niw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCS8qIERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0ICovCiAJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKQEAgLTIzNTMsNyArMjM1NSw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJZTEwMDBfZG93bihhZGFwdGVyKTsKIAllMTAwMF91cChhZGFwdGVyKTsKQEAgLTIzNzAsNyArMjM3Miw3IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgogZTEwMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwogCXJldHVybiAmYWRhcHRlci0+bmV0X3N0YXRzOwpAQCAtMjM4Nyw3ICsyMzg5LDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOwogCiAJaWYoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKQEAgLTI1OTgsNyArMjYwMCw3IEBACiBlMTAwMF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOwotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXVpbnQzMl90IGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOwogI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQpAQCAtMjY2MSw3ICsyNjYzLDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKIAlpbnQgdHhfY2xlYW5lZDsKIAlpbnQgd29ya19kb25lID0gMDsKQEAgLTI2NzIsOCArMjY3NCw4IEBACiAJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CiAJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CiAJCi0JLyogSWYgbm8gVHggYW5kIG5vIFJ4IHdvcmsgZG9uZSwgZXhpdCB0aGUgcG9sbGluZyBtb2RlICovCiAJaWYgKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lID09IDApKSB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJLyogSWYgbm8gVHggYW5kIG5vdCBlbm91Z2ggUnggd29yayBkb25lLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KIAkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAkJcmV0dXJuIDA7CkBAIC0yNzY5LDEzICsyNzcxLDEzIEBACiAJCQlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKIAkJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CiAJCQllb3BfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGVvcCk7Ci0JCQlEUFJJTlRLKFRYX0VSUiwgRVJSLCAiRGV0ZWN0ZWQgVHggVW5pdCBIYW5nXG4iCisJCQlEUFJJTlRLKERSViwgRVJSLCAiRGV0ZWN0ZWQgVHggVW5pdCBIYW5nXG4iCiAJCQkJCSIgIFRESCAgICAgICAgICAgICAgICAgIDwleD5cbiIKIAkJCQkJIiAgVERUICAgICAgICAgICAgICAgICAgPCV4PlxuIgogCQkJCQkiICBuZXh0X3RvX3VzZSAgICAgICAgICA8JXg+XG4iCiAJCQkJCSIgIG5leHRfdG9fY2xlYW4gICAgICAgIDwleD5cbiIKIAkJCQkJImJ1ZmZlcl9pbmZvW25leHRfdG9fY2xlYW5dXG4iCi0JCQkJCSIgIGRtYSAgICAgICAgICAgICAgICAgIDwlbGx4PlxuIgorCQkJCQkiICBkbWEgICAgICAgICAgICAgICAgICA8JXp4PlxuIgogCQkJCQkiICB0aW1lX3N0YW1wICAgICAgICAgICA8JWx4PlxuIgogCQkJCQkiICBuZXh0X3RvX3dhdGNoICAgICAgICA8JXg+XG4iCiAJCQkJCSIgIGppZmZpZXMgICAgICAgICAgICAgIDwlbHg+XG4iCkBAIC0yOTk0LDcgKzI5OTYsNyBAQAogCiAJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CiAJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOwotCXN0YXRlcnIgPSByeF9kZXNjLT53Yi5taWRkbGUuc3RhdHVzX2Vycm9yOworCXN0YXRlcnIgPSBsZTMyX3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUuc3RhdHVzX2Vycm9yKTsKIAogCXdoaWxlKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9ERCkgewogCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKQEAgLTMwNjUsMTYgKzMwNjcsMTYgQEAKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQogCQlpZih1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKIAkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAotCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuICYKLQkJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spKTsKKwkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUudmxhbikgJgorCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKIAkJfSBlbHNlIHsKIAkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCX0KICNlbHNlIC8qIENPTkZJR19FMTAwMF9OQVBJICovCiAJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfVlApKSkgewogCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYWRhcHRlci0+dmxncnAsCi0JCQkJbGUxNl90b19jcHUocnhfZGVzYy0+d2IubWlkZGxlLnZsYW4gJgotCQkJCQlFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSykpOworCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuKSAmCisJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOwogCQl9IGVsc2UgewogCQkJbmV0aWZfcngoc2tiKTsKIAkJfQpAQCAtMzA4Nyw3ICszMDg5LDcgQEAKIAkJaWYodW5saWtlbHkoKytpID09IHJ4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAKIAkJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOwotCQlzdGF0ZXJyID0gcnhfZGVzYy0+d2IubWlkZGxlLnN0YXR1c19lcnJvcjsKKwkJc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IpOwogCX0KIAlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKIAlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlcik7CkBAIC0zMzcxLDExICszMzczLDEyIEBACiBzdGF0aWMgaW50CiBlMTAwMF9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOwogCWludCByZXR2YWw7CiAJdWludDE2X3QgbWlpX3JlZzsKIAl1aW50MTZfdCBzcGRkcGx4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0zMzg1LDIyICszMzg4LDI5IEBACiAJCWRhdGEtPnBoeV9pZCA9IGFkYXB0ZXItPmh3LnBoeV9hZGRyOwogCQlicmVhazsKIAljYXNlIFNJT0NHTUlJUkVHOgotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYgKGUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0gJiAweDFGLAotCQkJCSAgICZkYXRhLT52YWxfb3V0KSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKKwkJaWYoZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSAmIDB4MUYsCisJCQkJICAgJmRhdGEtPnZhbF9vdXQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgU0lPQ1NNSUlSRUc6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAoZGF0YS0+cmVnX251bSAmIH4oMHgxRikpCisJCWlmKGRhdGEtPnJlZ19udW0gJiB+KDB4MUYpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCW1paV9yZWcgPSBkYXRhLT52YWxfaW47Ci0JCWlmIChlMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSwKLQkJCQkJbWlpX3JlZykpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJCWlmKGUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtLAorCQkJCQltaWlfcmVnKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIC1FSU87Ci0JCWlmIChhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisJCX0KKwkJaWYoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgewogCQkJc3dpdGNoIChkYXRhLT5yZWdfbnVtKSB7CiAJCQljYXNlIFBIWV9DVFJMOgogCQkJCWlmKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKQEAgLTM0MjAsOCArMzQzMCwxMiBAQAogCQkJCQkJICAgSEFMRl9EVVBMRVg7CiAJCQkJCXJldHZhbCA9IGUxMDAwX3NldF9zcGRfZHBseChhZGFwdGVyLAogCQkJCQkJCQkgICAgc3BkZHBseCk7Ci0JCQkJCWlmKHJldHZhbCkKKwkJCQkJaWYocmV0dmFsKSB7CisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkJCSZhZGFwdGVyLT5zdGF0c19sb2NrLCAKKwkJCQkJCQlmbGFncyk7CiAJCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCQl9CiAJCQkJfQogCQkJCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQkJCQllMTAwMF9kb3duKGFkYXB0ZXIpOwpAQCAtMzQzMSw4ICszNDQ1LDExIEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIE04OEUxMDAwX1BIWV9TUEVDX0NUUkw6CiAJCQljYXNlIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMOgotCQkJCWlmIChlMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KSkKKwkJCQlpZihlMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KSkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkJJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKIAkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMzQ0OCw2ICszNDY1LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTM1MDQsNyArMzUyMiw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1aW50MzJfdCBjdHJsLCByY3RsOwogCiAJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CkBAIC0zNTQ0LDcgKzM1NjIsNyBAQAogc3RhdGljIHZvaWQKIGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVpbnQzMl90IHZmdGEsIGluZGV4OwogCWlmKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCiAJCUUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSAmJgpAQCAtMzU2MCw3ICszNTc4LDcgQEAKIHN0YXRpYyB2b2lkCiBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdWludDMyX3QgdmZ0YSwgaW5kZXg7CiAKIAllMTAwMF9pcnFfZGlzYWJsZShhZGFwdGVyKTsKQEAgLTM2MDEsNiArMzYxOSwxMyBAQAogewogCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSAwOwogCisJLyogRmliZXIgTklDcyBvbmx5IGFsbG93IDEwMDAgZ2JwcyBGdWxsIGR1cGxleCAqLworCWlmKChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCisJCXNwZGRwbHggIT0gKFNQRUVEXzEwMDAgKyBEVVBMRVhfRlVMTCkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiVW5zdXBwb3J0ZWQgU3BlZWQvRHVwbGV4IGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzd2l0Y2goc3BkZHBseCkgewogCWNhc2UgU1BFRURfMTAgKyBEVVBMRVhfSEFMRjoKIAkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwX2hhbGY7CkBAIC0zNjQ3LDcgKzM2NzIsNyBAQAogZTEwMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdWludDMyX3QgY3RybCwgY3RybF9leHQsIHJjdGwsIG1hbmMsIHN0YXR1cywgc3dzbTsKIAl1aW50MzJfdCB3dWZjID0gYWRhcHRlci0+d29sOwogCkBAIC0zNzQwLDEyICszNzY1LDEyIEBACiBlMTAwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKLQl1aW50MzJfdCBtYW5jLCByZXQsIHN3c207CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVpbnQzMl90IG1hbmMsIHJldF92YWwsIHN3c207CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXJldF92YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKQEAgLTM3ODgsNyArMzgxMyw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlkaXNhYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOwogCWUxMDAwX2ludHIoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOwogCWVuYWJsZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UyMTAwLmMgYi9kcml2ZXJzL25ldC9lMjEwMC5jCmluZGV4IDUxYzlmYTIuLmY1YTRkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTIxMDAuYwpAQCAtMTYyLDEyICsxNjIsNyBAQAogCWVyciA9IGRvX2UyMTAwX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI4Niw2ICsyODEsOSBAQAogI2VuZGlmCiAJTlM4MzkwX2luaXQoZGV2LCAwKTsKIAorCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OwogCXJldHVybiAwOwogb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRTIxX0lPX0VYVEVOVCk7CkBAIC00NTMsMTEgKzQ1MSw4IEBACiAJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKIAkJZGV2LT5tZW1fZW5kID0geGN2clt0aGlzX2Rldl07CS8qIGxvdyA0Yml0cyA9IHhjdnIgc2VsLiAqLwogCQlpZiAoZG9fZTIxMDBfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9lMjFbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9lMjFbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlMjEwMC5jOiBObyBFMjEwMCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXByby5jIGIvZHJpdmVycy9uZXQvZWVwcm8uYwppbmRleCBjZDI0NzU2Li5kY2IzMDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXByby5jCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKQEAgLTYwMCwxMiArNjAwLDcgQEAKIAllcnIgPSBkb19lZXByb19wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC03NTgsNiArNzUzLDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwOwogCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZXJyOwogCiAJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHdlIGNhbiBmaW5kIGFub3RoZXIgYm9hcmQgaWYgYXV0b0lSUSBmYWlscy4gKi8KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUVQUk9fSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsgCkBAIC04NzMsMTAgKzg2OSwxNiBAQAogCiAJLyogcmVzZXQgODI1OTUgKi8KIAllZXByb19yZXNldChpb2FkZHIpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnI7CiAJcmV0dXJuIDA7CiBleGl0OgorCWVyciA9IC1FTk9ERVY7CitlcnI6CiAgCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFRVBST19JT19FWFRFTlQpOwotIAlyZXR1cm4gLUVOT0RFVjsKKyAJcmV0dXJuIGVycjsKIH0KIAogLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCkBAIC0xODM0LDExICsxODM2LDggQEAKIAkJZGV2LT5pcnEgPSBpcnFbaV07CiAKIAkJaWYgKGRvX2VlcHJvX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfZWVwcm9bbl9lZXBybysrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFRVBST19JT19FWFRFTlQpOworCQkJZGV2X2VlcHJvW25fZWVwcm8rK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCmluZGV4IDk4YjNhMmYuLjE3OTU0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZWVwcm8xMDAuYwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAkJaWYgKHNrYiA9PSBOVUxMKQogCQkJYnJlYWs7CQkJLyogT0suICBKdXN0IGluaXRpYWxseSBzaG9ydCBvZiBSeCBidWZzLiAqLwogCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCi0JCXJ4ZiA9IChzdHJ1Y3QgUnhGRCAqKXNrYi0+dGFpbDsKKwkJcnhmID0gKHN0cnVjdCBSeEZEICopc2tiLT5kYXRhOwogCQlzcC0+cnhfcmluZ3BbaV0gPSByeGY7CiAJCXNwLT5yeF9yaW5nX2RtYVtpXSA9CiAJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgcnhmLApAQCAtMTY2MSw3ICsxNjYxLDcgQEAKIAkJc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IE5VTEw7CiAJCXJldHVybiBOVUxMOwogCX0KLQlyeGYgPSBzcC0+cnhfcmluZ3BbZW50cnldID0gKHN0cnVjdCBSeEZEICopc2tiLT50YWlsOworCXJ4ZiA9IHNwLT5yeF9yaW5ncFtlbnRyeV0gPSAoc3RydWN0IFJ4RkQgKilza2ItPmRhdGE7CiAJc3AtPnJ4X3JpbmdfZG1hW2VudHJ5XSA9CiAJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCByeGYsCiAJCQkJCSAgIFBLVF9CVUZfU1ogKyBzaXplb2Yoc3RydWN0IFJ4RkQpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTgwOCwxMCArMTgwOCwxMCBAQAogCiAjaWYgMSB8fCBVU0VfSVBfQ1NVTQogCQkJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogI2Vsc2UKLQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKIAkJCQkJICAgcGt0X2xlbik7CiAjZW5kaWYKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXhwcmVzcy5jIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwppbmRleCBmYzhlNzk0Li44MmJkMzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKQEAgLTQzNiwxMSArNDM2LDggQEAKIAluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOwogCiAJZXJyID0gZG9fZXhwcmVzc19wcm9iZShkZXYpOwotCWlmICghZXJyKSB7Ci0JCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCQlpZiAoIWVycikKLQkJCXJldHVybiBkZXY7Ci0JfQorCWlmICghZXJyKQorCQlyZXR1cm4gZGV2OwogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KQEAgLTEyMDUsNyArMTIwMiw4IEBACiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZWV4cF9zZXRfbXVsdGljYXN0OwogCWRldi0+dHhfdGltZW91dCA9IGVleHBfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gMipIWjsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIH0KIAogLyoKQEAgLTE3MTYsNyArMTcxNCw3IEBACiAJCQkJYnJlYWs7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImVleHByZXNzLmM6IE1vZHVsZSBhdXRvcHJvYmUgbm90IHJlY29tbWVuZGVkLCBnaXZlIGlvPXh4LlxuIik7CiAJCX0KLQkJaWYgKGRvX2V4cHJlc3NfcHJvYmUoZGV2KSA9PSAwICYmIHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJaWYgKGRvX2V4cHJlc3NfcHJvYmUoZGV2KSA9PSAwKSB7CiAJCQlkZXZfZWV4cFt0aGlzX2Rldl0gPSBkZXY7CiAJCQlmb3VuZCsrOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lcGljMTAwLmMgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKaW5kZXggODFlYmFlZC4uODdmNTIyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCiAJCWVwLT5yeF9yaW5nW2ldLmJ1ZmFkZHIgPSBwY2lfbWFwX3NpbmdsZShlcC0+cGNpX2RldiwgCi0JCQlza2ItPnRhaWwsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2ItPmRhdGEsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWVwLT5yeF9yaW5nW2ldLnJ4c3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CiAJfQogCWVwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOwpAQCAtMTI3NCw3ICsxMjc0LDcgQEAKIAkJCQkJCQkgICAgZXAtPnJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIsCiAJCQkJCQkJICAgIGVwLT5yeF9idWZfc3osCiAJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIGVwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgZXAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZXAtPnBjaV9kZXYsCiAJCQkJCQkJICAgICAgIGVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyLApAQCAtMTMwOCw3ICsxMzA4LDcgQEAKIAkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJZXAtPnJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIgPSBwY2lfbWFwX3NpbmdsZShlcC0+cGNpX2RldiwgCi0JCQkJc2tiLT50YWlsLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYi0+ZGF0YSwgZXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXdvcmtfZG9uZSsrOwogCQl9CiAJCWVwLT5yeF9yaW5nW2VudHJ5XS5yeHN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXFsLmMgYi9kcml2ZXJzL25ldC9lcWwuYwppbmRleCBkZDY4NjU4Li5hYTE1NjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lcWwuYworKysgYi9kcml2ZXJzL25ldC9lcWwuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAjZGVmaW5lIGVxbF9pc19zbGF2ZShkZXYpCSgoZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgPT0gSUZGX1NMQVZFKQogI2RlZmluZSBlcWxfaXNfbWFzdGVyKGRldikJKChkZXYtPmZsYWdzICYgSUZGX01BU1RFUikgPT0gSUZGX01BU1RFUikKIAotc3RhdGljIHZvaWQgZXFsX2tpbGxfb25lX3NsYXZlKHNsYXZlX3QgKnNsYXZlKTsKK3N0YXRpYyB2b2lkIGVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZV9xdWV1ZV90ICpxdWV1ZSwgc2xhdmVfdCAqc2xhdmUpOwogCiBzdGF0aWMgdm9pZCBlcWxfdGltZXIodW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJaWYgKHNsYXZlLT5ieXRlc19xdWV1ZWQgPCAwKQogCQkJCXNsYXZlLT5ieXRlc19xdWV1ZWQgPSAwOwogCQl9IGVsc2UgewotCQkJZXFsX2tpbGxfb25lX3NsYXZlKHNsYXZlKTsKKwkJCWVxbF9raWxsX29uZV9zbGF2ZSgmZXFsLT5xdWV1ZSwgc2xhdmUpOwogCQl9CiAKIAl9CkBAIC0yMTQsOSArMjE0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZV90ICpzbGF2ZSkKK3N0YXRpYyB2b2lkIGVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZV9xdWV1ZV90ICpxdWV1ZSwgc2xhdmVfdCAqc2xhdmUpCiB7CiAJbGlzdF9kZWwoJnNsYXZlLT5saXN0KTsKKwlxdWV1ZS0+bnVtX3NsYXZlcy0tOwogCXNsYXZlLT5kZXYtPmZsYWdzICY9IH5JRkZfU0xBVkU7CiAJZGV2X3B1dChzbGF2ZS0+ZGV2KTsKIAlrZnJlZShzbGF2ZSk7CkBAIC0yMzIsOCArMjMzLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCBoZWFkKSB7CiAJCXNsYXZlX3QgKnMgPSBsaXN0X2VudHJ5KHRoaXMsIHNsYXZlX3QsIGxpc3QpOwogCi0JCWVxbF9raWxsX29uZV9zbGF2ZShzKTsKLQkJcXVldWUtPm51bV9zbGF2ZXMtLTsKKwkJZXFsX2tpbGxfb25lX3NsYXZlKHF1ZXVlLCBzKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBXZSBmb3VuZCBhIGRlYWQgc2xhdmUsIGtpbGwgaXQuICovCi0JCQllcWxfa2lsbF9vbmVfc2xhdmUoc2xhdmUpOworCQkJZXFsX2tpbGxfb25lX3NsYXZlKHF1ZXVlLCBzbGF2ZSk7CiAJCX0KIAl9CiAJcmV0dXJuIGJlc3Rfc2xhdmU7CkBAIC0zOTMsNyArMzkzLDcgQEAKIAogCQlkdXBsaWNhdGVfc2xhdmUgPSBfX2VxbF9maW5kX3NsYXZlX2RldihxdWV1ZSwgc2xhdmUtPmRldik7CiAJCWlmIChkdXBsaWNhdGVfc2xhdmUgIT0gMCkKLQkJCWVxbF9raWxsX29uZV9zbGF2ZShkdXBsaWNhdGVfc2xhdmUpOworCQkJZXFsX2tpbGxfb25lX3NsYXZlKHF1ZXVlLCBkdXBsaWNhdGVfc2xhdmUpOwogCiAJCWxpc3RfYWRkKCZzbGF2ZS0+bGlzdCwgJnF1ZXVlLT5hbGxfc2xhdmVzKTsKIAkJcXVldWUtPm51bV9zbGF2ZXMrKzsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCQkJCQkJCSAgICAgIHNsYXZlX2Rldik7CiAKIAkJCWlmIChzbGF2ZSkgewotCQkJCWVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZSk7CisJCQkJZXFsX2tpbGxfb25lX3NsYXZlKCZlcWwtPnF1ZXVlLCBzbGF2ZSk7CiAJCQkJcmV0ID0gMDsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXMzMjEwLmMgYi9kcml2ZXJzL25ldC9lczMyMTAuYwppbmRleCBmMWU4MTUwLi41MGY4ZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lczMyMTAuYworKysgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpAQCAtMTc3LDEyICsxNzcsNyBAQAogCWVyciA9IGRvX2VzX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTMxMCw2ICszMDUsMTAgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQxOwogCXJldHVybiAwOwogb3V0MToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKQEAgLTQ0NSwxMSArNDQ0LDggQEAKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKIAkJaWYgKGRvX2VzX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfZXMzMjEwW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfZXMzMjEwW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMzMjEwLmM6IE5vIGVzMzIxMCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGgxNmkuYyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCmluZGV4IGNjYWU2YmEuLmYzMmE2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aDE2aS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCkBAIC00NzMsMTMgKzQ3Myw3IEBACiAJZXJyID0gZG9fZXRoMTZpX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFVEgxNklfSU9fRVhURU5UKTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC01NjksNyArNTYzLDEzIEBACiAJZGV2LT50eF90aW1lb3V0IAk9IGV0aDE2aV90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOwogCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDE7CiAJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRVRIMTZJX0lPX0VYVEVOVCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTE0NjIsMTIgKzE0NjIsOCBAQAogCQl9CiAKIAkJaWYgKGRvX2V0aDE2aV9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2V0aDE2aVtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOworCQkJZGV2X2V0aDE2aVtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImV0aDE2aS5jIE5vIEV0aDE2aSBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsCiAJCSAgICAgICBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXdyazMuYyBiL2RyaXZlcnMvbmV0L2V3cmszLmMKaW5kZXggZGNmOTY5Yi4uYjk4N2Y5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXdyazMuYworKysgYi9kcml2ZXJzL25ldC9ld3JrMy5jCkBAIC0xMzA4LDE1ICsxMzA4LDkgQEAKIAlpZiAoaW9hZGRyIDwgMHgxMDAwKQogCQlnb3RvIG91dDsKIAotCWlmIChpb2FkZHIgPT0gMCkgewkvKiBBdXRvcHJvYmluZyAqLwotCQlpb2Jhc2UgPSBFSVNBX1NMT1RfSU5DOwkJLyogR2V0IHRoZSBmaXJzdCBzbG90IGFkZHJlc3MgKi8KLQkJaSA9IDE7Ci0JCW1heFNsb3RzID0gTUFYX0VJU0FfU0xPVFM7Ci0JfSBlbHNlIHsJCS8qIFByb2JlIGEgc3BlY2lmaWMgbG9jYXRpb24gKi8KLQkJaW9iYXNlID0gaW9hZGRyOwotCQlpID0gKGlvYWRkciA+PiAxMik7Ci0JCW1heFNsb3RzID0gaSArIDE7Ci0JfQorCWlvYmFzZSA9IGlvYWRkcjsKKwlpID0gKGlvYWRkciA+PiAxMik7CisJbWF4U2xvdHMgPSBpICsgMTsKIAogCWZvciAoaSA9IDE7IChpIDwgbWF4U2xvdHMpICYmIChkZXYgIT0gTlVMTCk7IGkrKywgaW9iYXNlICs9IEVJU0FfU0xPVF9JTkMpIHsKIAkJaWYgKEVJU0Ffc2lnbmF0dXJlKG5hbWUsIEVJU0FfSUQpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggZDA1ZTlkZC4uNTVkYmU5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVhbG54LmMKKysrIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKQEAgLTExMDcsNyArMTEwNyw3IEBACiAKIAkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJbnAtPmxhY2tfcnhidWYtPnNrYnVmZiA9IHNrYjsKLQkJbnAtPmxhY2tfcnhidWYtPmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCW5wLT5sYWNrX3J4YnVmLT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAogCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJbnAtPmxhY2tfcnhidWYtPnN0YXR1cyA9IFJYT1dOOwogCQkrK25wLT5yZWFsbHlfcnhfY291bnQ7CkBAIC0xMzAwLDcgKzEzMDAsNyBAQAogCQkrK25wLT5yZWFsbHlfcnhfY291bnQ7CiAJCW5wLT5yeF9yaW5nW2ldLnNrYnVmZiA9IHNrYjsKIAkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KLQkJbnAtPnJ4X3JpbmdbaV0uYnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJbnAtPnJ4X3JpbmdbaV0uYnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IFJYT1dOOwogCQlucC0+cnhfcmluZ1tpXS5jb250cm9sIHw9IFJYSUM7CkBAIC0xNDIzLDggKzE0MjMsNyBAQAogCQlpZiAoY3VyLT5za2J1ZmYpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIGN1ci0+YnVmZmVyLAogCQkJCWN1ci0+c2tidWZmLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJZGV2X2tmcmVlX3NrYihjdXItPnNrYnVmZik7Ci0JCQkvKiBvciBkZXZfa2ZyZWVfc2tiX2lycShjdXItPnNrYnVmZik7ID8gKi8KKwkJCWRldl9rZnJlZV9za2JfYW55KGN1ci0+c2tidWZmKTsKIAkJCWN1ci0+c2tidWZmID0gTlVMTDsKIAkJfQogCQljdXItPnN0YXR1cyA9IDA7CkBAIC0xNzM4LDExICsxNzM3LDExIEBACiAKICNpZiAhIGRlZmluZWQoX19hbHBoYV9fKQogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCAKLQkJCQkJbnAtPmN1cl9yeC0+c2tidWZmLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQkJbnAtPmN1cl9yeC0+c2tidWZmLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAjZWxzZQogCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCi0JCQkJCW5wLT5jdXJfcngtPnNrYnVmZi0+dGFpbCwgcGt0X2xlbik7CisJCQkJCW5wLT5jdXJfcngtPnNrYnVmZi0+ZGF0YSwgcGt0X2xlbik7CiAjZW5kaWYKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBjaV9kZXYsCiAJCQkJCQkJICAgICAgIG5wLT5jdXJfcngtPmJ1ZmZlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNGViY2QwNS4uNjRmMGY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTgyLDYgKzgyLDkgQEAKICAqCTAuMzE6IDE0IE5vdiAyMDA0OiBldGh0b29sIHN1cHBvcnQgZm9yIGdldHRpbmcvc2V0dGluZyBsaW5rCiAgKgkgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLgogICoJMC4zMjogMTYgQXByIDIwMDU6IFJYX0VSUk9SNCBoYW5kbGluZyBhZGRlZC4KKyAqCTAuMzM6IDE2IE1heSAyMDA1OiBTdXBwb3J0IGZvciBNQ1A1MSBhZGRlZC4KKyAqCTAuMzQ6IDE4IEp1biAyMDA1OiBBZGQgREVWX05FRURfTElOS1RJTUVSIHRvIGFsbCBuRm9yY2Ugbmljcy4KKyAqCTAuMzU6IDI2IEp1biAyMDA1OiBTdXBwb3J0IGZvciBNQ1A1NSBhZGRlZC4KICAqCiAgKiBLbm93biBidWdzOgogICogV2Ugc3VzcGVjdCB0aGF0IG9uIHNvbWUgaGFyZHdhcmUgbm8gVFggZG9uZSBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQuCkBAIC05Myw3ICs5Niw3IEBACiAgKiBERVZfTkVFRF9USU1FUklSUSB3aWxsIG5vdCBoYXJtIHlvdSBvbiBzYW5lIGhhcmR3YXJlLCBvbmx5IGdlbmVyYXRpbmcgYSBmZXcKICAqIHN1cGVyZmx1b3VzIHRpbWVyIGludGVycnVwdHMgZnJvbSB0aGUgbmljLgogICovCi0jZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC4zMiIKKyNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjM1IgogI2RlZmluZSBEUlZfTkFNRQkJCSJmb3JjZWRldGgiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTIwMDUsNyArMjAwOCw5IEBACiAJLyogaGFuZGxlIGRpZmZlcmVudCBkZXNjcmlwdG9yIHZlcnNpb25zICovCiAJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMSB8fAogCQlwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIgfHwKLQkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zKQorCQlwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMgfHwgICAgCisJCXBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTIgfHwKKwkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMykKIAkJbnAtPmRlc2NfdmVyID0gREVTQ19WRVJfMTsKIAllbHNlCiAJCW5wLT5kZXNjX3ZlciA9IERFU0NfVkVSXzI7CkBAIC0yMjE1LDU2ICsyMjIwLDg0IEBACiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNCwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKIAkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF81LAogCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAogCX0sCiAJewkvKiBuRm9yY2UzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzYsCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIG5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNywKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXsJLyogQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfOCwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXsJLyogQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfOSwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXsJLyogTUNQMDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTAsCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIE1DUDA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzExLAogCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorCX0sCisJewkvKiBNQ1A1MSBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMiwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKKwl9LAorCXsJLyogTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTMsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCisJfSwKKwl7CS8qIE1DUDU1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE0LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorCX0sCisJewkvKiBNQ1A1NSBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xNSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXswLH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IGI0M2IyYjEuLjY1MTgzMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBkcml2ZXJzL25ldC9naWFuZmFyLmMKICAqCiAgKiBHaWFuZmFyIEV0aGVybmV0IERyaXZlcgpAQCAtMjIsMTAgKzIyLDkgQEAKICAqICBCLVYgKzEuNjIKICAqCiAgKiAgVGhlb3J5IG9mIG9wZXJhdGlvbgotICogIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgVHJpcGxlLXNwZWVkIEV0aGVybmV0Ci0gKiAgY29udHJvbGxlcnMgb24gdGhlIEZyZWVzY2FsZSA4NTQwLzg1NjAgaW50ZWdyYXRlZCBwcm9jZXNzb3JzLAotICogIGFzIHdlbGwgYXMgdGhlIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciBvbiB0aGUgODU0MC4gIAotICogIAorICogIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgbm9uLUNQTSBldGhlcm5ldCBjb250cm9sbGVycworICogIG9uIHRoZSA4NXh4IGFuZCA4M3h4IGZhbWlseSBvZiBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMKKyAqCiAgKiAgVGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB0aHJvdWdoIHBsYXRmb3JtX2RldmljZS4gIFN0cnVjdHVyZXMgd2hpY2gKICAqICBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGJ5IHRoZSBib2FyZCBhcmUgZGVmaW5lZCBpbiBhCiAgKiAgYm9hcmQgc3RydWN0dXJlIGluIGFyY2gvcHBjL3BsYXRmb3JtcyAodGhvdWdoIEkgZG8gbm90CkBAIC0zOSwxMiArMzgsMTIgQEAKICAqCiAgKiAgVGhlIEdpYW5mYXIgRXRoZXJuZXQgQ29udHJvbGxlciB1c2VzIGEgcmluZyBvZiBidWZmZXIKICAqICBkZXNjcmlwdG9ycy4gIFRoZSBiZWdpbm5pbmcgaXMgaW5kaWNhdGVkIGJ5IGEgcmVnaXN0ZXIKLSAqICBwb2ludGluZyB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcuIAotICogIFRoZSBlbmQgaXMgZGV0ZXJtaW5lZCBieSBhICJ3cmFwIiBiaXQgYmVpbmcgc2V0IGluIHRoZSAKKyAqICBwb2ludGluZyB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcuCisgKiAgVGhlIGVuZCBpcyBkZXRlcm1pbmVkIGJ5IGEgIndyYXAiIGJpdCBiZWluZyBzZXQgaW4gdGhlCiAgKiAgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSByaW5nLgogICoKICAqICBXaGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkLCB0aGUgUlhGIGJpdCBpbiB0aGUKLSAqICBJRVZFTlQgcmVnaXN0ZXIgaXMgc2V0LCB0cmlnZ2VyaW5nIGFuIGludGVycnVwdCB3aGVuIHRoZSAKKyAqICBJRVZFTlQgcmVnaXN0ZXIgaXMgc2V0LCB0cmlnZ2VyaW5nIGFuIGludGVycnVwdCB3aGVuIHRoZQogICogIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBJTUFTSyByZWdpc3RlciBpcyBhbHNvIHNldCAoaWYKICAqICBpbnRlcnJ1cHQgY29hbGVzY2luZyBpcyBhY3RpdmUsIHRoZW4gdGhlIGludGVycnVwdCBtYXkgbm90CiAgKiAgaGFwcGVuIGltbWVkaWF0ZWx5LCBidXQgd2lsbCB3YWl0IHVudGlsIGVpdGhlciBhIHNldCBudW1iZXIKQEAgLTUyLDcgKzUxLDcgQEAKICAqICBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHNpZ25hbCB0aGVyZSBpcyB3b3JrIHRvIGJlIGRvbmUsIGFuZAogICogIGV4aXQuICBXaXRob3V0IE5BUEksIHRoZSBwYWNrZXQocykgd2lsbCBiZSBoYW5kbGVkCiAgKiAgaW1tZWRpYXRlbHkuICBCb3RoIG1ldGhvZHMgd2lsbCBzdGFydCBhdCB0aGUgbGFzdCBrbm93biBlbXB0eQotICogIGRlc2NyaXB0b3IsIGFuZCBwcm9jZXNzIGV2ZXJ5IHN1YnNlcXVlbnQgZGVzY3JpcHRvciB1bnRpbCB0aGVyZSAKKyAqICBkZXNjcmlwdG9yLCBhbmQgcHJvY2VzcyBldmVyeSBzdWJzZXF1ZW50IGRlc2NyaXB0b3IgdW50aWwgdGhlcmUKICAqICBhcmUgbm9uZSBsZWZ0IHdpdGggZGF0YSAoTkFQSSB3aWxsIHN0b3AgYWZ0ZXIgYSBzZXQgbnVtYmVyIG9mCiAgKiAgcGFja2V0cyB0byBnaXZlIHRpbWUgdG8gb3RoZXIgdGFza3MsIGJ1dCB3aWxsIGV2ZW50dWFsbHkKICAqICBwcm9jZXNzIGFsbCB0aGUgcGFja2V0cykuICBUaGUgZGF0YSBhcnJpdmVzIGluc2lkZSBhCkBAIC04Myw5ICs4MiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMTIzLDcgKzEyNiw3IEBACiBzdGF0aWMgaW50IGdmYXJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX3RyYW5zbWl0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotaXJxcmV0dXJuX3QgZ2Zhcl9yZWNlaXZlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBwaHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogc3RhdGljIHZvaWQgZ2Zhcl9waHlfY2hhbmdlKHZvaWQgKmRhdGEpOwpAQCAtMTM5LDkgKzE0MiwxMiBAQAogI2lmZGVmIENPTkZJR19HRkFSX05BUEkKIHN0YXRpYyBpbnQgZ2Zhcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKICNlbmRpZgotc3RhdGljIGludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpOworaW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCk7CiBzdGF0aWMgaW50IGdmYXJfcHJvY2Vzc19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuZ3RoKTsKIHN0YXRpYyB2b2lkIGdmYXJfcGh5X3N0YXJ0dXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGdmYXJfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgICAgICAgICAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CitzdGF0aWMgdm9pZCBnZmFyX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKIAogZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBnZmFyX2V0aHRvb2xfb3BzOwogCkBAIC0xNDksNiArMTU1LDEzIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdpYW5mYXIgRXRoZXJuZXQgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK2ludCBnZmFyX3VzZXNfZmNiKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYpCit7CisJaWYgKHByaXYtPnZsYW5fZW5hYmxlIHx8IHByaXYtPnJ4X2NzdW1fZW5hYmxlKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQogc3RhdGljIGludCBnZmFyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAl1MzIgdGVtcHZhbDsKQEAgLTE1OSw3ICsxNzIsNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgaWR4OwogCWludCBlcnIgPSAwOwotCWludCBkZXZfZXRodG9vbF9vcHMgPSAwOwogCiAJZWluZm8gPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIApAQCAtMjY1LDE1ICsyNzcsNjkgQEAKIAlkZXYtPm10dSA9IDE1MDA7CiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBnZmFyX3NldF9tdWx0aTsKIAotCS8qIEluZGV4IGludG8gdGhlIGFycmF5IG9mIHBvc3NpYmxlIGV0aHRvb2wKLQkgKiBvcHMgdG8gY2F0Y2ggYWxsIDQgcG9zc2liaWxpdGllcyAqLwotCWlmKChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19STU9OKSA9PSAwKQotCQlkZXZfZXRodG9vbF9vcHMgKz0gMTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmdmYXJfZXRodG9vbF9vcHM7CiAKLQlpZigocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ09BTEVTQ0UpID09IDApCi0JCWRldl9ldGh0b29sX29wcyArPSAyOworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19DU1VNKSB7CisJCXByaXYtPnJ4X2NzdW1fZW5hYmxlID0gMTsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJfSBlbHNlCisJCXByaXYtPnJ4X2NzdW1fZW5hYmxlID0gMDsKIAotCWRldi0+ZXRodG9vbF9vcHMgPSBnZmFyX29wX2FycmF5W2Rldl9ldGh0b29sX29wc107CisJcHJpdi0+dmxncnAgPSBOVUxMOworCisJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1ZMQU4pIHsKKwkJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gZ2Zhcl92bGFuX3J4X3JlZ2lzdGVyOworCQlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBnZmFyX3ZsYW5fcnhfa2lsbF92aWQ7CisKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisKKwkJcHJpdi0+dmxhbl9lbmFibGUgPSAxOworCX0KKworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19FWFRFTkRFRF9IQVNIKSB7CisJCXByaXYtPmV4dGVuZGVkX2hhc2ggPSAxOworCQlwcml2LT5oYXNoX3dpZHRoID0gOTsKKworCQlwcml2LT5oYXNoX3JlZ3NbMF0gPSAmcHJpdi0+cmVncy0+aWdhZGRyMDsKKwkJcHJpdi0+aGFzaF9yZWdzWzFdID0gJnByaXYtPnJlZ3MtPmlnYWRkcjE7CisJCXByaXYtPmhhc2hfcmVnc1syXSA9ICZwcml2LT5yZWdzLT5pZ2FkZHIyOworCQlwcml2LT5oYXNoX3JlZ3NbM10gPSAmcHJpdi0+cmVncy0+aWdhZGRyMzsKKwkJcHJpdi0+aGFzaF9yZWdzWzRdID0gJnByaXYtPnJlZ3MtPmlnYWRkcjQ7CisJCXByaXYtPmhhc2hfcmVnc1s1XSA9ICZwcml2LT5yZWdzLT5pZ2FkZHI1OworCQlwcml2LT5oYXNoX3JlZ3NbNl0gPSAmcHJpdi0+cmVncy0+aWdhZGRyNjsKKwkJcHJpdi0+aGFzaF9yZWdzWzddID0gJnByaXYtPnJlZ3MtPmlnYWRkcjc7CisJCXByaXYtPmhhc2hfcmVnc1s4XSA9ICZwcml2LT5yZWdzLT5nYWRkcjA7CisJCXByaXYtPmhhc2hfcmVnc1s5XSA9ICZwcml2LT5yZWdzLT5nYWRkcjE7CisJCXByaXYtPmhhc2hfcmVnc1sxMF0gPSAmcHJpdi0+cmVncy0+Z2FkZHIyOworCQlwcml2LT5oYXNoX3JlZ3NbMTFdID0gJnByaXYtPnJlZ3MtPmdhZGRyMzsKKwkJcHJpdi0+aGFzaF9yZWdzWzEyXSA9ICZwcml2LT5yZWdzLT5nYWRkcjQ7CisJCXByaXYtPmhhc2hfcmVnc1sxM10gPSAmcHJpdi0+cmVncy0+Z2FkZHI1OworCQlwcml2LT5oYXNoX3JlZ3NbMTRdID0gJnByaXYtPnJlZ3MtPmdhZGRyNjsKKwkJcHJpdi0+aGFzaF9yZWdzWzE1XSA9ICZwcml2LT5yZWdzLT5nYWRkcjc7CisKKwl9IGVsc2UgeworCQlwcml2LT5leHRlbmRlZF9oYXNoID0gMDsKKwkJcHJpdi0+aGFzaF93aWR0aCA9IDg7CisKKwkJcHJpdi0+aGFzaF9yZWdzWzBdID0gJnByaXYtPnJlZ3MtPmdhZGRyMDsKKyAgICAgICAgICAgICAgICBwcml2LT5oYXNoX3JlZ3NbMV0gPSAmcHJpdi0+cmVncy0+Z2FkZHIxOworCQlwcml2LT5oYXNoX3JlZ3NbMl0gPSAmcHJpdi0+cmVncy0+Z2FkZHIyOworCQlwcml2LT5oYXNoX3JlZ3NbM10gPSAmcHJpdi0+cmVncy0+Z2FkZHIzOworCQlwcml2LT5oYXNoX3JlZ3NbNF0gPSAmcHJpdi0+cmVncy0+Z2FkZHI0OworCQlwcml2LT5oYXNoX3JlZ3NbNV0gPSAmcHJpdi0+cmVncy0+Z2FkZHI1OworCQlwcml2LT5oYXNoX3JlZ3NbNl0gPSAmcHJpdi0+cmVncy0+Z2FkZHI2OworCQlwcml2LT5oYXNoX3JlZ3NbN10gPSAmcHJpdi0+cmVncy0+Z2FkZHI3OworCX0KKworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19QQURESU5HKQorCQlwcml2LT5wYWRkaW5nID0gREVGQVVMVF9QQURESU5HOworCWVsc2UKKwkJcHJpdi0+cGFkZGluZyA9IDA7CisKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSBwcml2LT5wYWRkaW5nOworCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pCisJCWRldi0+aGFyZF9oZWFkZXJfbGVuICs9IEdNQUNfRkNCX0xFTjsKIAogCXByaXYtPnJ4X2J1ZmZlcl9zaXplID0gREVGQVVMVF9SWF9CVUZGRVJfU0laRTsKICNpZmRlZiBDT05GSUdfR0ZBUl9CVUZTVEFTSApAQCAtMjg5LDYgKzM1NSw5IEBACiAJcHJpdi0+cnhjb3VudCA9IERFRkFVTFRfUlhDT1VOVDsKIAlwcml2LT5yeHRpbWUgPSBERUZBVUxUX1JYVElNRTsKIAorCS8qIEVuYWJsZSBtb3N0IG1lc3NhZ2VzIGJ5IGRlZmF1bHQgKi8KKwlwcml2LT5tc2dfZW5hYmxlID0gKE5FVElGX01TR19JRlVQIDw8IDEgKSAtIDE7CisKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAogCWlmIChlcnIpIHsKQEAgLTM2MCw4ICs0MjksOSBAQAogCQkJR0ZQX0tFUk5FTCk7CiAKIAlpZihOVUxMID09IG1paV9pbmZvKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtaWlfaW5mb1xuIiwgCi0JCQkJZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIG1paV9pbmZvXG4iLAorCQkJCQlkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQxMCw3ICs0ODAsOCBAQAogCWN1cnBoeSA9IGdldF9waHlfaW5mbyhwcml2LT5taWlfaW5mbyk7CiAKIAlpZiAoY3VycGh5ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gUEhZIGZvdW5kXG4iLCBkZXYtPm5hbWUpOworCQlpZiAobmV0aWZfbXNnX2lmdXAocHJpdikpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CiAJCWVyciA9IC0xOwogCQlnb3RvIG5vX3BoeTsKIAl9CkBAIC00MjEsNyArNDkyLDcgQEAKIAlpZihjdXJwaHktPmluaXQpIHsKIAkJZXJyID0gY3VycGh5LT5pbml0KHByaXYtPm1paV9pbmZvKTsKIAotCQlpZiAoZXJyKSAKKwkJaWYgKGVycikKIAkJCWdvdG8gcGh5X2luaXRfZmFpbDsKIAl9CiAKQEAgLTQ0NiwxNCArNTE3LDE0IEBACiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aW1hc2ssIElNQVNLX0lOSVRfQ0xFQVIpOwogCiAJLyogSW5pdCBoYXNoIHJlZ2lzdGVycyB0byB6ZXJvICovCi0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIwLCAwKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjEsIDApOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMiwgMCk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIzLCAwKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjQsIDApOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyNSwgMCk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI2LCAwKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjcsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjAsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjEsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjIsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjMsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjQsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjUsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjYsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlnYWRkcjcsIDApOwogCiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHIwLCAwKTsKIAlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjEsIDApOwpAQCAtNDY0LDkgKzUzNSw2IEBACiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHI2LCAwKTsKIAlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjcsIDApOwogCi0JLyogWmVybyBvdXQgcmN0cmwgKi8KLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yY3RybCwgMHgwMDAwMDAwMCk7Ci0KIAkvKiBaZXJvIG91dCB0aGUgcm1vbiBtaWIgcmVnaXN0ZXJzIGlmIGl0IGhhcyB0aGVtICovCiAJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04pIHsKIAkJbWVtc2V0KCh2b2lkICopICYocHJpdi0+cmVncy0+cm1vbiksIDAsCkBAIC00OTcsMjAgKzU2NSwxNCBAQAogCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRiaXBhLCBUQklQQV9WQUxVRSk7CiB9CiAKLXZvaWQgc3RvcF9nZmFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisKKy8qIEhhbHQgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcyAqLwordm9pZCBnZmFyX2hhbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdGVtcHZhbDsKIAotCS8qIExvY2sgaXQgZG93biAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBUZWxsIHRoZSBrZXJuZWwgdGhlIGxpbmsgaXMgZG93biAqLwotCXByaXYtPm1paV9pbmZvLT5saW5rID0gMDsKLQlhZGp1c3RfbGluayhkZXYpOwotCiAJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLwogCWdmYXJfd3JpdGUoJnJlZ3MtPmltYXNrLCBJTUFTS19JTklUX0NMRUFSKTsKIApAQCAtNTMzLDEzICs1OTUsMjkgQEAKIAl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcxKTsKIAl0ZW1wdmFsICY9IH4oTUFDQ0ZHMV9SWF9FTiB8IE1BQ0NGRzFfVFhfRU4pOwogCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzEsIHRlbXB2YWwpOworfQorCit2b2lkIHN0b3BfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBnZmFyICpyZWdzID0gcHJpdi0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTG9jayBpdCBkb3duICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGUgbGluayBpcyBkb3duICovCisJcHJpdi0+bWlpX2luZm8tPmxpbmsgPSAwOworCWFkanVzdF9saW5rKGRldik7CisKKwlnZmFyX2hhbHQoZGV2KTsKIAogCWlmIChwcml2LT5laW5mby0+Ym9hcmRfZmxhZ3MgJiBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSKSB7CiAJCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KIAkJbWlpX2NsZWFyX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8pOwogCiAJCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KLQkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLCAKKwkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLAogCQkJCU1JSV9JTlRFUlJVUFRfRElTQUJMRUQpOwogCX0KIApAQCAtNTY2LDcgKzY0NCw3IEBACiAJCQlzaXplb2Yoc3RydWN0IHR4YmQ4KSpwcml2LT50eF9yaW5nX3NpemUKIAkJCSsgc2l6ZW9mKHN0cnVjdCByeGJkOCkqcHJpdi0+cnhfcmluZ19zaXplLAogCQkJcHJpdi0+dHhfYmRfYmFzZSwKLQkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UpKTsKKwkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UwKSk7CiB9CiAKIC8qIElmIHRoZXJlIGFyZSBhbnkgdHggc2ticyBvciByeCBza2JzIHN0aWxsIGFyb3VuZCwgZnJlZSB0aGVtLgpAQCAtNjIwLDYgKzY5OCwzNCBAQAogCX0KIH0KIAordm9pZCBnZmFyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXUzMiB0ZW1wdmFsOworCisJLyogRW5hYmxlIFJ4IGFuZCBUeCBpbiBNQUNDRkcxICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMSk7CisJdGVtcHZhbCB8PSAoTUFDQ0ZHMV9SWF9FTiB8IE1BQ0NGRzFfVFhfRU4pOworCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzEsIHRlbXB2YWwpOworCisJLyogSW5pdGlhbGl6ZSBETUFDVFJMIHRvIGhhdmUgV1dSIGFuZCBXT1AgKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5kbWFjdHJsKTsKKwl0ZW1wdmFsIHw9IERNQUNUUkxfSU5JVF9TRVRUSU5HUzsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCS8qIENsZWFyIFRITFQsIHNvIHRoYXQgdGhlIERNQSBzdGFydHMgcG9sbGluZyBub3cgKi8KKwlnZmFyX3dyaXRlKCZyZWdzLT50c3RhdCwgVFNUQVRfQ0xFQVJfVEhBTFQpOworCisJLyogTWFrZSBzdXJlIHdlIGFyZW4ndCBzdG9wcGVkICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCAmPSB+KERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCisJLyogVW5tYXNrIHRoZSBpbnRlcnJ1cHRzIHdlIGxvb2sgZm9yICovCisJZ2Zhcl93cml0ZSgmcmVncy0+aW1hc2ssIElNQVNLX0RFRkFVTFQpOworfQorCiAvKiBCcmluZyB0aGUgY29udHJvbGxlciB1cCBhbmQgcnVubmluZyAqLwogaW50IHN0YXJ0dXBfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNjMwLDMzICs3MzYsMzQgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7Ci0JdTMyIHRlbXB2YWw7CiAJaW50IGVyciA9IDA7CisJdTMyIHJjdHJsID0gMDsKIAogCWdmYXJfd3JpdGUoJnJlZ3MtPmltYXNrLCBJTUFTS19JTklUX0NMRUFSKTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLwotCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCAKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwKIAkJCXNpemVvZiAoc3RydWN0IHR4YmQ4KSAqIHByaXYtPnR4X3Jpbmdfc2l6ZSArCiAJCQlzaXplb2YgKHN0cnVjdCByeGJkOCkgKiBwcml2LT5yeF9yaW5nX3NpemUsCiAJCQkmYWRkciwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAodmFkZHIgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIGRlc2NyaXB0b3JzIVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMhXG4iLAorCQkJCQlkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlwcml2LT50eF9iZF9iYXNlID0gKHN0cnVjdCB0eGJkOCAqKSB2YWRkcjsKIAogCS8qIGVuZXQgRE1BIG9ubHkgdW5kZXJzdGFuZHMgcGh5c2ljYWwgYWRkcmVzc2VzICovCi0JZ2Zhcl93cml0ZSgmcmVncy0+dGJhc2UsIGFkZHIpOworCWdmYXJfd3JpdGUoJnJlZ3MtPnRiYXNlMCwgYWRkcik7CiAKIAkvKiBTdGFydCB0aGUgcnggZGVzY3JpcHRvciByaW5nIHdoZXJlIHRoZSB0eCByaW5nIGxlYXZlcyBvZmYgKi8KIAlhZGRyID0gYWRkciArIHNpemVvZiAoc3RydWN0IHR4YmQ4KSAqIHByaXYtPnR4X3Jpbmdfc2l6ZTsKIAl2YWRkciA9IHZhZGRyICsgc2l6ZW9mIChzdHJ1Y3QgdHhiZDgpICogcHJpdi0+dHhfcmluZ19zaXplOwogCXByaXYtPnJ4X2JkX2Jhc2UgPSAoc3RydWN0IHJ4YmQ4ICopIHZhZGRyOwotCWdmYXJfd3JpdGUoJnJlZ3MtPnJiYXNlLCBhZGRyKTsKKwlnZmFyX3dyaXRlKCZyZWdzLT5yYmFzZTAsIGFkZHIpOwogCiAJLyogU2V0dXAgdGhlIHNrYnVmZiByaW5ncyAqLwogCXByaXYtPnR4X3NrYnVmZiA9CkBAIC02NjQsOCArNzcxLDkgQEAKIAkJCQkJcHJpdi0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKIAogCWlmIChwcml2LT50eF9za2J1ZmYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdHhfc2tidWZmXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIHR4X3NrYnVmZlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byB0eF9za2JfZmFpbDsKIAl9CkBAIC02NzgsOCArNzg2LDkgQEAKIAkJCQkJcHJpdi0+cnhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKIAogCWlmIChwcml2LT5yeF9za2J1ZmYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcnhfc2tidWZmXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJ4X3NrYnVmZlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byByeF9za2JfZmFpbDsKIAl9CkBAIC03MjYsMTIgKzgzNSwxMyBAQAogCS8qIElmIHRoZSBkZXZpY2UgaGFzIG11bHRpcGxlIGludGVycnVwdHMsIHJlZ2lzdGVyIGZvcgogCSAqIHRoZW0uICBPdGhlcndpc2UsIG9ubHkgcmVnaXN0ZXIgZm9yIHRoZSBvbmUgKi8KIAlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUikgewotCQkvKiBJbnN0YWxsIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIEVycm9yLCAKKwkJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBFcnJvciwKIAkJICogVHJhbnNtaXQsIGFuZCBSZWNlaXZlICovCiAJCWlmIChyZXF1ZXN0X2lycShwcml2LT5pbnRlcnJ1cHRFcnJvciwgZ2Zhcl9lcnJvciwKIAkJCQkwLCAiZW5ldF9lcnJvciIsIGRldikgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOworCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCisJCQkJCWRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOwogCiAJCQllcnIgPSAtMTsKIAkJCWdvdG8gZXJyX2lycV9mYWlsOwpAQCAtNzM5LDggKzg0OSw5IEBACiAKIAkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdFRyYW5zbWl0LCBnZmFyX3RyYW5zbWl0LAogCQkJCTAsICJlbmV0X3R4IiwgZGV2KSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCk7CisJCQlpZiAobmV0aWZfbXNnX2ludHIocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCk7CiAKIAkJCWVyciA9IC0xOwogCkBAIC03NDksOCArODYwLDkgQEAKIAogCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0UmVjZWl2ZSwgZ2Zhcl9yZWNlaXZlLAogCQkJCTAsICJlbmV0X3J4IiwgZGV2KSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWQgKHJlY2VpdmUwKVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdFJlY2VpdmUpOworCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWQgKHJlY2VpdmUwKVxuIiwKKwkJCQkJCWRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0UmVjZWl2ZSk7CiAKIAkJCWVyciA9IC0xOwogCQkJZ290byByeF9pcnFfZmFpbDsKQEAgLTc1OCw4ICs4NzAsOSBAQAogCX0gZWxzZSB7CiAJCWlmIChyZXF1ZXN0X2lycShwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZ2Zhcl9pbnRlcnJ1cHQsCiAJCQkJMCwgImdmYXJfaW50ZXJydXB0IiwgZGV2KSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRFcnJvcik7CisJCQlpZiAobmV0aWZfbXNnX2ludHIocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRFcnJvcik7CiAKIAkJCWVyciA9IC0xOwogCQkJZ290byBlcnJfaXJxX2ZhaWw7CkBAIC03ODcsMjggKzkwMCwyMiBAQAogCWVsc2UKIAkJZ2Zhcl93cml0ZSgmcmVncy0+cnhpYywgMCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5yeGNsZWFudXBxKTsKKwlpZiAocHJpdi0+cnhfY3N1bV9lbmFibGUpCisJCXJjdHJsIHw9IFJDVFJMX0NIRUNLU1VNTUlORzsKIAotCS8qIEVuYWJsZSBSeCBhbmQgVHggaW4gTUFDQ0ZHMSAqLwotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzEpOwotCXRlbXB2YWwgfD0gKE1BQ0NGRzFfUlhfRU4gfCBNQUNDRkcxX1RYX0VOKTsKLQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcxLCB0ZW1wdmFsKTsKKwlpZiAocHJpdi0+ZXh0ZW5kZWRfaGFzaCkKKwkJcmN0cmwgfD0gUkNUUkxfRVhUSEFTSDsKIAotCS8qIEluaXRpYWxpemUgRE1BQ1RSTCB0byBoYXZlIFdXUiBhbmQgV09QICovCi0JdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7Ci0JdGVtcHZhbCB8PSBETUFDVFJMX0lOSVRfU0VUVElOR1M7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisJaWYgKHByaXYtPnZsYW5fZW5hYmxlKQorCQlyY3RybCB8PSBSQ1RSTF9WTEFOOwogCi0JLyogQ2xlYXIgVEhMVCwgc28gdGhhdCB0aGUgRE1BIHN0YXJ0cyBwb2xsaW5nIG5vdyAqLwotCWdmYXJfd3JpdGUoJnJlZ3MtPnRzdGF0LCBUU1RBVF9DTEVBUl9USEFMVCk7CisJLyogSW5pdCByY3RybCBiYXNlZCBvbiBvdXIgc2V0dGluZ3MgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yY3RybCwgcmN0cmwpOwogCi0JLyogTWFrZSBzdXJlIHdlIGFyZW4ndCBzdG9wcGVkICovCi0JdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7Ci0JdGVtcHZhbCAmPSB+KERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50Y3RybCwgVENUUkxfSU5JVF9DU1VNKTsKIAotCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyB3ZSBsb29rIGZvciAqLwotCWdmYXJfd3JpdGUoJnJlZ3MtPmltYXNrLCBJTUFTS19ERUZBVUxUKTsKKwlnZmFyX3N0YXJ0KGRldik7CiAKIAlyZXR1cm4gMDsKIApAQCAtODI0LDcgKzkzMSw3IEBACiAJCQlzaXplb2Yoc3RydWN0IHR4YmQ4KSpwcml2LT50eF9yaW5nX3NpemUKIAkJCSsgc2l6ZW9mKHN0cnVjdCByeGJkOCkqcHJpdi0+cnhfcmluZ19zaXplLAogCQkJcHJpdi0+dHhfYmRfYmFzZSwKLQkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UpKTsKKwkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UwKSk7CiAKIAlpZiAocHJpdi0+bWlpX2luZm8tPnBoeWluZm8tPmNsb3NlKQogCQlwcml2LT5taWlfaW5mby0+cGh5aW5mby0+Y2xvc2UocHJpdi0+bWlpX2luZm8pOwpAQCAtODU3LDExICs5NjQsNjIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgc3RydWN0IHR4ZmNiICpnZmFyX2FkZF9mY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHR4YmQ4ICpiZHApCit7CisJc3RydWN0IHR4ZmNiICpmY2IgPSAoc3RydWN0IHR4ZmNiICopc2tiX3B1c2ggKHNrYiwgR01BQ19GQ0JfTEVOKTsKKworCW1lbXNldChmY2IsIDAsIEdNQUNfRkNCX0xFTik7CisKKwkvKiBGbGFnIHRoZSBiZCBzbyB0aGUgY29udHJvbGxlciBsb29rcyBmb3IgdGhlIEZDQiAqLworCWJkcC0+c3RhdHVzIHw9IFRYQkRfVE9FOworCisJcmV0dXJuIGZjYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdmYXJfdHhfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHR4ZmNiICpmY2IpCit7CisJaW50IGxlbjsKKworCS8qIElmIHdlJ3JlIGhlcmUsIGl0J3MgYSBJUCBwYWNrZXQgd2l0aCBhIFRDUCBvciBVRFAKKwkgKiBwYXlsb2FkLiAgV2Ugc2V0IGl0IHRvIGNoZWNrc3VtLCB1c2luZyBhIHBzZXVkby1oZWFkZXIKKwkgKiB3ZSBwcm92aWRlCisJICovCisJZmNiLT5pcCA9IDE7CisJZmNiLT50dXAgPSAxOworCWZjYi0+Y3R1ID0gMTsKKwlmY2ItPm5waCA9IDE7CisKKwkvKiBOb3RpZnkgdGhlIGNvbnRyb2xsZXIgd2hhdCB0aGUgcHJvdG9jb2wgaXMgKi8KKwlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKQorCQlmY2ItPnVkcCA9IDE7CisKKwkvKiBsM29zIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBmcmFtZSAoc2tiLT5kYXRhKSBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBJUCBoZHIuCisJICogbDRvcyBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlCisJICogbDMgaGRyIGFuZCB0aGUgbDQgaGRyICovCisJZmNiLT5sM29zID0gKHUxNikoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEgLSBHTUFDX0ZDQl9MRU4pOworCWZjYi0+bDRvcyA9ICh1MTYpKHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7CisKKwlsZW4gPSBza2ItPm5oLmlwaC0+dG90X2xlbiAtIGZjYi0+bDRvczsKKworCS8qIFByb3ZpZGUgdGhlIHBzZXVkb2hlYWRlciBjc3VtICovCisJZmNiLT5waGNzID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCXNrYi0+bmguaXBoLT5kYWRkciwgbGVuLAorCQkJc2tiLT5uaC5pcGgtPnByb3RvY29sLCAwKTsKK30KKwordm9pZCBnZmFyX3R4X3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHR4ZmNiICpmY2IpCit7CisJZmNiLT52bG4gPSAxOworCWZjYi0+dmxjdGwgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKK30KKwogLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuIGEgZnJhbWUgaXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbi4gKi8KIC8qIEl0IGlzIHBvaW50ZWQgdG8gYnkgdGhlIGRldi0+aGFyZF9zdGFydF94bWl0IGZ1bmN0aW9uIHBvaW50ZXIgKi8KIHN0YXRpYyBpbnQgZ2Zhcl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR4ZmNiICpmY2IgPSBOVUxMOwogCXN0cnVjdCB0eGJkOCAqdHhiZHA7CiAKIAkvKiBVcGRhdGUgdHJhbnNtaXQgc3RhdHMgKi8KQEAgLTg3Niw5ICsxMDM0LDI0IEBACiAJLyogQ2xlYXIgYWxsIGJ1dCB0aGUgV1JBUCBzdGF0dXMgZmxhZ3MgKi8KIAl0eGJkcC0+c3RhdHVzICY9IFRYQkRfV1JBUDsKIAorCS8qIFNldCB1cCBjaGVja3N1bW1pbmcgKi8KKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pIAorCQkJJiYgKENIRUNLU1VNX0hXID09IHNrYi0+aXBfc3VtbWVkKSkgeworCQlmY2IgPSBnZmFyX2FkZF9mY2Ioc2tiLCB0eGJkcCk7CisJCWdmYXJfdHhfY2hlY2tzdW0oc2tiLCBmY2IpOworCX0KKworCWlmIChwcml2LT52bGFuX2VuYWJsZSAmJgorCQkJdW5saWtlbHkocHJpdi0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSkgeworCQlpZiAoTlVMTCA9PSBmY2IpCisJCQlmY2IgPSBnZmFyX2FkZF9mY2Ioc2tiLCB0eGJkcCk7CisKKwkJZ2Zhcl90eF92bGFuKHNrYiwgZmNiKTsKKwl9CisKIAkvKiBTZXQgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciAqLwogCXR4YmRwLT5sZW5ndGggPSBza2ItPmxlbjsKLQl0eGJkcC0+YnVmUHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCAKKwl0eGJkcC0+YnVmUHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAogCQkJc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOwogCiAJLyogU2F2ZSB0aGUgc2tiIHBvaW50ZXIgc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KQEAgLTk3MiwxNSArMTE0NSw3OCBAQAogfQogCiAKKy8qIEVuYWJsZXMgYW5kIGRpc2FibGVzIFZMQU4gaW5zZXJ0aW9uL2V4dHJhY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGdmYXJfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRlbXB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcHJpdi0+dmxncnAgPSBncnA7CisKKwlpZiAoZ3JwKSB7CisJCS8qIEVuYWJsZSBWTEFOIHRhZyBpbnNlcnRpb24gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+dGN0cmwpOworCQl0ZW1wdmFsIHw9IFRDVFJMX1ZMSU5TOworCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRjdHJsLCB0ZW1wdmFsKTsKKwkJCisJCS8qIEVuYWJsZSBWTEFOIHRhZyBleHRyYWN0aW9uICovCisJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnJjdHJsKTsKKwkJdGVtcHZhbCB8PSBSQ1RSTF9WTEVYOworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yY3RybCwgdGVtcHZhbCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBWTEFOIHRhZyBpbnNlcnRpb24gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+dGN0cmwpOworCQl0ZW1wdmFsICY9IH5UQ1RSTF9WTElOUzsKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dGN0cmwsIHRlbXB2YWwpOworCisJCS8qIERpc2FibGUgVkxBTiB0YWcgZXh0cmFjdGlvbiAqLworCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5yY3RybCk7CisJCXRlbXB2YWwgJj0gflJDVFJMX1ZMRVg7CisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJjdHJsLCB0ZW1wdmFsKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgZ2Zhcl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQxNl90IHZpZCkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwcml2LT52bGdycCkKKwkJcHJpdi0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworCiBzdGF0aWMgaW50IGdmYXJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKIAlpbnQgdGVtcHNpemUsIHRlbXB2YWw7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IG9sZHNpemUgPSBwcml2LT5yeF9idWZmZXJfc2l6ZTsKLQlpbnQgZnJhbWVfc2l6ZSA9IG5ld19tdHUgKyAxODsKKwlpbnQgZnJhbWVfc2l6ZSA9IG5ld19tdHUgKyBFVEhfSExFTjsKKworCWlmIChwcml2LT52bGFuX2VuYWJsZSkKKwkJZnJhbWVfc2l6ZSArPSBWTEFOX0VUSF9ITEVOOworCisJaWYgKGdmYXJfdXNlc19mY2IocHJpdikpCisJCWZyYW1lX3NpemUgKz0gR01BQ19GQ0JfTEVOOworCisJZnJhbWVfc2l6ZSArPSBwcml2LT5wYWRkaW5nOwogCiAJaWYgKChmcmFtZV9zaXplIDwgNjQpIHx8IChmcmFtZV9zaXplID4gSlVNQk9fRlJBTUVfU0laRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBNVFUgc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIE1UVSBzZXR0aW5nXG4iLAorCQkJCQlkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTExMjAsNyArMTM1Niw3IEBACiAJc2tiLT5kZXYgPSBkZXY7CiAKIAliZHAtPmJ1ZlB0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKLQkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5ULCAKKwkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5ULAogCQkJRE1BX0ZST01fREVWSUNFKTsKIAogCWJkcC0+bGVuZ3RoID0gMDsKQEAgLTExOTAsMTEgKzE0MjYsMTAgQEAKIAogCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJfSBlbHNlIHsKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBjYWxsZWQgdHdpY2UgKCV4KVsleF1cbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aWV2ZW50KSwKLQkJICAgICAgIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aW1hc2spKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBjYWxsZWQgdHdpY2UgKCV4KVsleF1cbiIsCisJCQkJZGV2LT5uYW1lLCBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCksCisJCQkJZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzaykpOwogCX0KICNlbHNlCiAKQEAgLTEyMDksMTUgKzE0NDQsNDMgQEAKIAllbHNlCiAJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJ4aWMsIDApOwogCi0JLyogSnVzdCBpbiBjYXNlIHdlIG5lZWQgdG8gd2FrZSB0aGUgcmluZyBwYXJhbSBjaGFuZ2VyICovCi0JcHJpdi0+cnhjbGVhbiA9IDE7Ci0KIAlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CiAjZW5kaWYKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZ2Zhcl9yeF92bGFuKHN0cnVjdCBza19idWZmICpza2IsCisJCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycCwgdW5zaWduZWQgc2hvcnQgdmxjdGwpCit7CisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorCXJldHVybiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCB2bGdycCwgdmxjdGwpOworI2Vsc2UKKwlyZXR1cm4gdmxhbl9od2FjY2VsX3J4KHNrYiwgdmxncnAsIHZsY3RsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2Zhcl9yeF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnhmY2IgKmZjYikKK3sKKwkvKiBJZiB2YWxpZCBoZWFkZXJzIHdlcmUgZm91bmQsIGFuZCB2YWxpZCBzdW1zCisJICogd2VyZSB2ZXJpZmllZCwgdGhlbiB3ZSB0ZWxsIHRoZSBrZXJuZWwgdGhhdCBubworCSAqIGNoZWNrc3VtbWluZyBpcyBuZWNlc3NhcnkuICBPdGhlcndpc2UsIGl0IGlzICovCisJaWYgKGZjYi0+Y2lwICYmICFmY2ItPmVpcCAmJiBmY2ItPmN0dSAmJiAhZmNiLT5ldHUpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcnhmY2IgKmdmYXJfZ2V0X2ZjYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeGZjYiAqZmNiID0gKHN0cnVjdCByeGZjYiAqKXNrYi0+ZGF0YTsKKworCS8qIFJlbW92ZSB0aGUgRkNCIGZyb20gdGhlIHNrYiAqLworCXNrYl9wdWxsKHNrYiwgR01BQ19GQ0JfTEVOKTsKKworCXJldHVybiBmY2I7Cit9CiAKIC8qIGdmYXJfcHJvY2Vzc19mcmFtZSgpIC0tIGhhbmRsZSBvbmUgaW5jb21pbmcgcGFja2V0IGlmIHNrYgogICogaXNuJ3QgTlVMTC4gICovCkBAIC0xMjI1LDM1ICsxNDg4LDUxIEBACiAJCWludCBsZW5ndGgpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJ4ZmNiICpmY2IgPSBOVUxMOwogCiAJaWYgKHNrYiA9PSBOVUxMKSB7Ci0jaWZkZWYgQlJJRUZfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1pc3Npbmcgc2tiISEuXG4iLAotCQkJCWRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWlzc2luZyBza2IhIS5cbiIsIGRldi0+bmFtZSk7CiAJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfc2tibWlzc2luZysrOwogCX0gZWxzZSB7CisJCWludCByZXQ7CisKIAkJLyogUHJlcCB0aGUgc2tiIGZvciB0aGUgcGFja2V0ICovCiAJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCisJCS8qIEdyYWIgdGhlIEZDQiBpZiB0aGVyZSBpcyBvbmUgKi8KKwkJaWYgKGdmYXJfdXNlc19mY2IocHJpdikpCisJCQlmY2IgPSBnZmFyX2dldF9mY2Ioc2tiKTsKKworCQkvKiBSZW1vdmUgdGhlIHBhZGRlZCBieXRlcywgaWYgdGhlcmUgYXJlIGFueSAqLworCQlpZiAocHJpdi0+cGFkZGluZykKKwkJCXNrYl9wdWxsKHNrYiwgcHJpdi0+cGFkZGluZyk7CisKKwkJaWYgKHByaXYtPnJ4X2NzdW1fZW5hYmxlKQorCQkJZ2Zhcl9yeF9jaGVja3N1bShza2IsIGZjYik7CisKIAkJLyogVGVsbCB0aGUgc2tiIHdoYXQga2luZCBvZiBwYWNrZXQgdGhpcyBpcyAqLwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAJCS8qIFNlbmQgdGhlIHBhY2tldCB1cCB0aGUgc3RhY2sgKi8KLQkJaWYgKFJFQ0VJVkUoc2tiKSA9PSBORVRfUlhfRFJPUCkgeworCQlpZiAodW5saWtlbHkocHJpdi0+dmxncnAgJiYgZmNiLT52bG4pKQorCQkJcmV0ID0gZ2Zhcl9yeF92bGFuKHNrYiwgcHJpdi0+dmxncnAsIGZjYi0+dmxjdGwpOworCQllbHNlCisJCQlyZXQgPSBSRUNFSVZFKHNrYik7CisKKwkJaWYgKE5FVF9SWF9EUk9QID09IHJldCkKIAkJCXByaXYtPmV4dHJhX3N0YXRzLmtlcm5lbF9kcm9wcGVkKys7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogLyogZ2Zhcl9jbGVhbl9yeF9yaW5nKCkgLS0gUHJvY2Vzc2VzIGVhY2ggZnJhbWUgaW4gdGhlIHJ4IHJpbmcKLSAqICAgdW50aWwgdGhlIGJ1ZGdldC9xdW90YSBoYXMgYmVlbiByZWFjaGVkLiBSZXR1cm5zIHRoZSBudW1iZXIgCisgKiAgIHVudGlsIHRoZSBidWRnZXQvcXVvdGEgaGFzIGJlZW4gcmVhY2hlZC4gUmV0dXJucyB0aGUgbnVtYmVyCiAgKiAgIG9mIGZyYW1lcyBoYW5kbGVkCiAgKi8KLXN0YXRpYyBpbnQgZ2Zhcl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByeF93b3JrX2xpbWl0KQoraW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCkKIHsKIAlzdHJ1Y3QgcnhiZDggKmJkcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTM1NSw5ICsxNjM0LDYgQEAKIAkJCQkgICBta19pY192YWx1ZShwcml2LT5yeGNvdW50LCBwcml2LT5yeHRpbWUpKTsKIAkJZWxzZQogCQkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywgMCk7Ci0KLQkJLyogU2lnbmFsIHRvIHRoZSByaW5nIHNpemUgY2hhbmdlciB0aGF0IGl0J3Mgc2FmZSB0byBnbyAqLwotCQlwcml2LT5yeGNsZWFuID0gMTsKIAl9CiAKIAlyZXR1cm4gKHJ4X3dvcmtfbGltaXQgPCAwKSA/IDEgOiAwOwpAQCAtMTM5MywxMCArMTY2OSw4IEBACiAJCWlmIChldmVudHMgJiBJRVZFTlRfQ1JMKQogCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAkJaWYgKGV2ZW50cyAmIElFVkVOVF9YRlVOKSB7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHR4IHVuZGVycnVuLiBkcm9wcGVkIHBhY2tldFxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotI2VuZGlmCisJCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHggdW5kZXJydW4uIGRyb3BwZWQgcGFja2V0XG4iLCBkZXYtPm5hbWUpOwogCQkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJcHJpdi0+ZXh0cmFfc3RhdHMudHhfdW5kZXJydW4rKzsKIApAQCAtMTQxNSwzNiArMTY4OSwzMCBAQAogCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yc3RhdCwgUlNUQVRfQ0xFQVJfUkhBTFQpOwogI2VuZGlmCiAKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocmhhbHQ6ICV4KVxuIiwgZGV2LT5uYW1lLAotCQkgICAgICAgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5yc3RhdCkpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXN5IGVycm9yIChyaGFsdDogJXgpXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCWdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cnN0YXQpKTsKIAl9CiAJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJSKSB7CiAJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQlwcml2LT5leHRyYV9zdGF0cy5yeF9iYWJyKys7CiAKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFiYmxpbmcgZXJyb3JcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYmJsaW5nIGVycm9yXG4iLCBkZXYtPm5hbWUpOwogCX0KIAlpZiAoZXZlbnRzICYgSUVWRU5UX0VCRVJSKSB7CiAJCXByaXYtPmV4dHJhX3N0YXRzLmViZXJyKys7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVCRVJSXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKIAl9Ci0JaWYgKGV2ZW50cyAmIElFVkVOVF9SWEMpIHsKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogY29udHJvbCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKLSNlbmRpZgotCX0KKwlpZiAoKGV2ZW50cyAmIElFVkVOVF9SWEMpICYmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY29udHJvbCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmIChldmVudHMgJiBJRVZFTlRfQkFCVCkgewogCQlwcml2LT5leHRyYV9zdGF0cy50eF9iYWJ0Kys7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTUxMCw3ICsxNzc4LDcgQEAKICAqIElmLCBhZnRlciBHRkFSX0FOX1RJTUVPVVQgc2Vjb25kcywgaXQgaGFzIG5vdAogICogZmluaXNoZWQsIHdlIHN3aXRjaCB0byBmb3JjZWQuCiAgKiBFaXRoZXIgd2F5LCBvbmNlIHRoZSBwcm9jZXNzIGhhcyBjb21wbGV0ZWQsIHdlIGVpdGhlcgotICogcmVxdWVzdCB0aGUgaW50ZXJydXB0LCBvciBzd2l0Y2ggdGhlIHRpbWVyIG92ZXIgdG8gCisgKiByZXF1ZXN0IHRoZSBpbnRlcnJ1cHQsIG9yIHN3aXRjaCB0aGUgdGltZXIgb3ZlciB0bwogICogdXNpbmcgZ2Zhcl9waHlfdGltZXIgdG8gY2hlY2sgc3RhdHVzICovCiBzdGF0aWMgdm9pZCBnZmFyX3BoeV9zdGFydHVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTE1MzUsOCArMTgwMyw5IEBACiAKIAkJLyogRm9yY2luZyBmYWlsZWQhICBHaXZlIHVwICovCiAJCWlmKHJlc3VsdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRm9yY2luZyBmYWlsZWQhXG4iLAotCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGb3JjaW5nIGZhaWxlZCFcbiIsCisJCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTE1NDYsMTYgKzE4MTUsMTcgQEAKIAogCS8qIEdyYWIgdGhlIFBIWSBpbnRlcnJ1cHQsIGlmIG5lY2Vzc2FyeS9wb3NzaWJsZSAqLwogCWlmIChwcml2LT5laW5mby0+Ym9hcmRfZmxhZ3MgJiBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSKSB7Ci0JCWlmIChyZXF1ZXN0X2lycShwcml2LT5laW5mby0+aW50ZXJydXB0UEhZLCAKKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmVpbmZvLT5pbnRlcnJ1cHRQSFksCiAJCQkJCXBoeV9pbnRlcnJ1cHQsCi0JCQkJCVNBX1NISVJRLCAKLQkJCQkJInBoeV9pbnRlcnJ1cHQiLCAKKwkJCQkJU0FfU0hJUlEsCisJCQkJCSJwaHlfaW50ZXJydXB0IiwKIAkJCQkJbWlpX2luZm8tPmRldikgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkIChQSFkpXG4iLAotCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lLAorCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWQgKFBIWSlcbiIsCisJCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lLAogCQkJCQlwcml2LT5laW5mby0+aW50ZXJydXB0UEhZKTsKIAkJfSBlbHNlIHsKLQkJCW1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbywgCisJCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sCiAJCQkJCU1JSV9JTlRFUlJVUFRfRU5BQkxFRCk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTE1OTIsMTUgKzE4NjIsMTcgQEAKIAkJCQl0ZW1wdmFsICY9IH4oTUFDQ0ZHMl9GVUxMX0RVUExFWCk7CiAJCQkJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMiwgdGVtcHZhbCk7CiAKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSGFsZiBEdXBsZXhcbiIsCi0JCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSGFsZiBEdXBsZXhcbiIsCisJCQkJCQkJZGV2LT5uYW1lKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMik7CiAJCQkJdGVtcHZhbCB8PSBNQUNDRkcyX0ZVTExfRFVQTEVYOwogCQkJCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOwogCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bGwgRHVwbGV4XG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWlmIChuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bGwgRHVwbGV4XG4iLAorCQkJCQkJCWRldi0+bmFtZSk7CiAJCQl9CiAKIAkJCXByaXYtPm9sZGR1cGxleCA9IG1paV9pbmZvLT5kdXBsZXg7CkBAIC0xNjIyLDI3ICsxODk0LDMyIEBACiAJCQkJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMiwgdGVtcHZhbCk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgIiVzOiBBY2shICBTcGVlZCAoJWQpIGlzIG5vdCAxMC8xMDAvMTAwMCFcbiIsCi0JCQkJICAgICAgIGRldi0+bmFtZSwgbWlpX2luZm8tPnNwZWVkKTsKKwkJCQlpZiAobmV0aWZfbXNnX2xpbmsocHJpdikpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCQkiJXM6IEFjayEgIFNwZWVkICglZCkgaXMgbm90IDEwLzEwMC8xMDAwIVxuIiwKKwkJCQkJCQlkZXYtPm5hbWUsIG1paV9pbmZvLT5zcGVlZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTcGVlZCAlZEJUXG4iLCBkZXYtPm5hbWUsCi0JCQkgICAgICAgbWlpX2luZm8tPnNwZWVkKTsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3BlZWQgJWRCVFxuIiwgZGV2LT5uYW1lLAorCQkJCQkJbWlpX2luZm8tPnNwZWVkKTsKIAogCQkJcHJpdi0+b2xkc3BlZWQgPSBtaWlfaW5mby0+c3BlZWQ7CiAJCX0KIAogCQlpZiAoIXByaXYtPm9sZGxpbmspIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIHVwXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIHVwXG4iLCBkZXYtPm5hbWUpOwogCQkJcHJpdi0+b2xkbGluayA9IDE7CiAJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCQluZXRpZl9zY2hlZHVsZShkZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHByaXYtPm9sZGxpbmspIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobmV0aWZfbXNnX2xpbmsocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgZG93blxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CiAJCQlwcml2LT5vbGRsaW5rID0gMDsKIAkJCXByaXYtPm9sZHNwZWVkID0gMDsKIAkJCXByaXYtPm9sZGR1cGxleCA9IC0xOwpAQCAtMTY2NCw4ICsxOTQxLDkgQEAKIAl1MzIgdGVtcHZhbDsKIAogCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgcHJvbWlzY3VvdXMgbW9kZS5cbiIsCi0JCQkJZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgcHJvbWlzY3VvdXMgbW9kZS5cbiIsCisJCQkJCWRldi0+bmFtZSk7CiAJCS8qIFNldCBSQ1RSTCB0byBQUk9NICovCiAJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKIAkJdGVtcHZhbCB8PSBSQ1RSTF9QUk9NOwpAQCAtMTY3OSw2ICsxOTU3LDE0IEBACiAJCiAJaWYoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewogCQkvKiBTZXQgdGhlIGhhc2ggdG8gcnggYWxsIG11bHRpY2FzdCBmcmFtZXMgKi8KKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMCwgMHhmZmZmZmZmZik7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjEsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5pZ2FkZHIyLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMywgMHhmZmZmZmZmZik7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjQsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5pZ2FkZHI1LCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNiwgMHhmZmZmZmZmZik7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjcsIDB4ZmZmZmZmZmYpOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjAsIDB4ZmZmZmZmZmYpOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjEsIDB4ZmZmZmZmZmYpOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjIsIDB4ZmZmZmZmZmYpOwpAQCAtMTY4OSw2ICsxOTc1LDE0IEBACiAJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyNywgMHhmZmZmZmZmZik7CiAJfSBlbHNlIHsKIAkJLyogemVybyBvdXQgdGhlIGhhc2ggKi8KKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMCwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMSwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMiwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMywgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNCwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNSwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNiwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNywgMHgwKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIwLCAweDApOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjEsIDB4MCk7CiAJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyMiwgMHgwKTsKQEAgLTE3MjcsMTYgKzIwMjEsMTUgQEAKIHsKIAl1MzIgdGVtcHZhbDsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7Ci0JdTMyICpoYXNoID0gJnJlZ3MtPmdhZGRyMDsKIAl1MzIgcmVzdWx0ID0gZXRoZXJfY3JjKE1BQ19BRERSX0xFTiwgYWRkcik7Ci0JdTggd2hpY2hyZWcgPSAoKHJlc3VsdCA+PiAyOSkgJiAweDcpOwotCXU4IHdoaWNoYml0ID0gKChyZXN1bHQgPj4gMjQpICYgMHgxZik7CisJaW50IHdpZHRoID0gcHJpdi0+aGFzaF93aWR0aDsKKwl1OCB3aGljaGJpdCA9IChyZXN1bHQgPj4gKDMyIC0gd2lkdGgpKSAmIDB4MWY7CisJdTggd2hpY2hyZWcgPSByZXN1bHQgPj4gKDMyIC0gd2lkdGggKyA1KTsKIAl1MzIgdmFsdWUgPSAoMSA8PCAoMzEtd2hpY2hiaXQpKTsKIAotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJmhhc2hbd2hpY2hyZWddKTsKKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKHByaXYtPmhhc2hfcmVnc1t3aGljaHJlZ10pOwogCXRlbXB2YWwgfD0gdmFsdWU7Ci0JZ2Zhcl93cml0ZSgmaGFzaFt3aGljaHJlZ10sIHRlbXB2YWwpOworCWdmYXJfd3JpdGUocHJpdi0+aGFzaF9yZWdzW3doaWNocmVnXSwgdGVtcHZhbCk7CiAKIAlyZXR1cm47CiB9CkBAIC0xNzU0LDEwICsyMDQ3LDkgQEAKIAlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZXZlbnQsIElFVkVOVF9FUlJfTUFTSyk7CiAKIAkvKiBIbW0uLi4gKi8KLSNpZiBkZWZpbmVkIChCUklFRl9HRkFSX0VSUk9SUykgfHwgZGVmaW5lZCAoVkVSQk9TRV9HRkFSX0VSUk9SUykKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIGludGVycnVwdCAoaWV2ZW50PTB4JTA4eCBpbWFzaz0weCUwOHgpXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGV2ZW50cywgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzaykpOwotI2VuZGlmCisJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikgfHwgbmV0aWZfbXNnX3R4X2Vycihwcml2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciBpbnRlcnJ1cHQgKGlldmVudD0weCUwOHggaW1hc2s9MHglMDh4KVxuIiwKKwkJCQlkZXYtPm5hbWUsIGV2ZW50cywgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzaykpOwogCiAJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudGVycyAqLwogCWlmIChldmVudHMgJiBJRVZFTlRfVFhFKSB7CkBAIC0xNzY4LDE5ICsyMDYwLDE3IEBACiAJCWlmIChldmVudHMgJiBJRVZFTlRfQ1JMKQogCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAkJaWYgKGV2ZW50cyAmIElFVkVOVF9YRlVOKSB7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmRlcnJ1bi4gIHBhY2tldCBkcm9wcGVkLlxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotI2VuZGlmCisJCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuZGVycnVuLiAgcGFja2V0IGRyb3BwZWQuXG4iLAorCQkJCQkJZGV2LT5uYW1lKTsKIAkJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCXByaXYtPmV4dHJhX3N0YXRzLnR4X3VuZGVycnVuKys7CiAKIAkJCS8qIFJlYWN0aXZhdGUgdGhlIFR4IFF1ZXVlcyAqLwogCQkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dHN0YXQsIFRTVEFUX0NMRUFSX1RIQUxUKTsKIAkJfQotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgRXJyb3JcbiIsIGRldi0+bmFtZSk7CiAJfQogCWlmIChldmVudHMgJiBJRVZFTlRfQlNZKSB7CiAJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwpAQCAtMTc5MywzNSArMjA4MywzMSBAQAogCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yc3RhdCwgUlNUQVRfQ0xFQVJfUkhBTFQpOwogI2VuZGlmCiAKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocmhhbHQ6ICV4KVxuIiwgZGV2LT5uYW1lLAotCQkgICAgICAgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5yc3RhdCkpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXN5IGVycm9yIChyaGFsdDogJXgpXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCWdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cnN0YXQpKTsKIAl9CiAJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJSKSB7CiAJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQlwcml2LT5leHRyYV9zdGF0cy5yeF9iYWJyKys7CiAKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFiYmxpbmcgZXJyb3JcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYmJsaW5nIGVycm9yXG4iLCBkZXYtPm5hbWUpOwogCX0KIAlpZiAoZXZlbnRzICYgSUVWRU5UX0VCRVJSKSB7CiAJCXByaXYtPmV4dHJhX3N0YXRzLmViZXJyKys7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVCRVJSXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKIAl9Ci0JaWYgKGV2ZW50cyAmIElFVkVOVF9SWEMpCi0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvbnRyb2wgZnJhbWVcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwlpZiAoKGV2ZW50cyAmIElFVkVOVF9SWEMpICYmIG5ldGlmX21zZ19yeF9zdGF0dXMocHJpdikpCisJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb250cm9sIGZyYW1lXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJUKSB7CiAJCXByaXYtPmV4dHJhX3N0YXRzLnR4X2JhYnQrKzsKLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFidCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFidCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCmluZGV4IGMyZjc4M2EuLjI4YWYwODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBkcml2ZXJzL25ldC9naWFuZmFyLmgKICAqCiAgKiBHaWFuZmFyIEV0aGVybmV0IERyaXZlcgpAQCAtNTMsNiArNTMsMTIgQEAKIC8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIGJlIGhhbmRsZWQgaW4gb25lIGNhbGwgb2YgZ2Zhcl9wb2xsICovCiAjZGVmaW5lIEdGQVJfREVWX1dFSUdIVCA2NAogCisvKiBMZW5ndGggZm9yIEZDQiAqLworI2RlZmluZSBHTUFDX0ZDQl9MRU4gOAorCisvKiBEZWZhdWx0IHBhZGRpbmcgYW1vdW50ICovCisjZGVmaW5lIERFRkFVTFRfUEFERElORyAyCisKIC8qIE51bWJlciBvZiBieXRlcyB0byBhbGlnbiB0aGUgcnggYnVmcyB0byAqLwogI2RlZmluZSBSWEJVRl9BTElHTk1FTlQgNjQKIApAQCAtOTEsNyArOTcsNyBAQAogI2RlZmluZSBKVU1CT19GUkFNRV9TSVpFIDk2MDAKIAogLyogTGF0ZW5jeSBvZiBpbnRlcmZhY2UgY2xvY2sgaW4gbmFub3NlY29uZHMgKi8KLS8qIEludGVyZmFjZSBjbG9jayBsYXRlbmN5ICwgaW4gdGhpcyBjYXNlLCBtZWFucyB0aGUgCisvKiBJbnRlcmZhY2UgY2xvY2sgbGF0ZW5jeSAsIGluIHRoaXMgY2FzZSwgbWVhbnMgdGhlCiAgKiB0aW1lIGRlc2NyaWJlZCBieSBhIHZhbHVlIG9mIDEgaW4gdGhlIGludGVycnVwdAogICogY29hbGVzY2luZyByZWdpc3RlcnMnIHRpbWUgZmllbGRzLiAgU2luY2UgdGhvc2UgZmllbGRzCiAgKiByZWZlciB0byB0aGUgdGltZSBpdCB0YWtlcyBmb3IgNjQgY2xvY2tzIHRvIHBhc3MsIHRoZQpAQCAtMTY2LDkgKzE3MiwyOCBAQAogCQkJCW1rX2ljX2ljZnQoY291bnQpIHwgXAogCQkJCW1rX2ljX2ljdHQodGltZSkpCiAKKyNkZWZpbmUgUkNUUkxfUEFMX01BU0sJCTB4MDAxZjAwMDAKKyNkZWZpbmUgUkNUUkxfVkxFWAkJMHgwMDAwMjAwMAorI2RlZmluZSBSQ1RSTF9GSUxSRU4JCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkNUUkxfR0hUWAkJMHgwMDAwMDQwMAorI2RlZmluZSBSQ1RSTF9JUENTRU4JCTB4MDAwMDAyMDAKKyNkZWZpbmUgUkNUUkxfVFVDU0VOCQkweDAwMDAwMTAwCisjZGVmaW5lIFJDVFJMX1BSU0RFUF9NQVNLCTB4MDAwMDAwYzAKKyNkZWZpbmUgUkNUUkxfUFJTREVQX0lOSVQJMHgwMDAwMDBjMAogI2RlZmluZSBSQ1RSTF9QUk9NCQkweDAwMDAwMDA4CisjZGVmaW5lIFJDVFJMX0NIRUNLU1VNTUlORwkoUkNUUkxfSVBDU0VOIFwKKwkJfCBSQ1RSTF9UVUNTRU4gfCBSQ1RSTF9QUlNERVBfSU5JVCkKKyNkZWZpbmUgUkNUUkxfRVhUSEFTSAkJKFJDVFJMX0dIVFgpCisjZGVmaW5lIFJDVFJMX1ZMQU4JCShSQ1RSTF9QUlNERVBfSU5JVCkKKworCiAjZGVmaW5lIFJTVEFUX0NMRUFSX1JIQUxUICAgICAgIDB4MDA4MDAwMDAKIAorI2RlZmluZSBUQ1RSTF9JUENTRU4JCTB4MDAwMDQwMDAKKyNkZWZpbmUgVENUUkxfVFVDU0VOCQkweDAwMDAyMDAwCisjZGVmaW5lIFRDVFJMX1ZMSU5TCQkweDAwMDAxMDAwCisjZGVmaW5lIFRDVFJMX0lOSVRfQ1NVTQkJKFRDVFJMX1RVQ1NFTiB8IFRDVFJMX0lQQ1NFTikKKwogI2RlZmluZSBJRVZFTlRfSU5JVF9DTEVBUgkweGZmZmZmZmZmCiAjZGVmaW5lIElFVkVOVF9CQUJSCQkweDgwMDAwMDAwCiAjZGVmaW5lIElFVkVOVF9SWEMJCTB4NDAwMDAwMDAKQEAgLTE4NywxMiArMjEyLDE2IEBACiAjZGVmaW5lIElFVkVOVF9SWEIwCQkweDAwMDA4MDAwCiAjZGVmaW5lIElFVkVOVF9HUlNDCQkweDAwMDAwMTAwCiAjZGVmaW5lIElFVkVOVF9SWEYwCQkweDAwMDAwMDgwCisjZGVmaW5lIElFVkVOVF9GSVIJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSUVWRU5UX0ZJUQkJMHgwMDAwMDAwNAorI2RlZmluZSBJRVZFTlRfRFBFCQkweDAwMDAwMDAyCisjZGVmaW5lIElFVkVOVF9QRVJSCQkweDAwMDAwMDAxCiAjZGVmaW5lIElFVkVOVF9SWF9NQVNLICAgICAgICAgIChJRVZFTlRfUlhCMCB8IElFVkVOVF9SWEYwKQogI2RlZmluZSBJRVZFTlRfVFhfTUFTSyAgICAgICAgICAoSUVWRU5UX1RYQiB8IElFVkVOVF9UWEYpCiAjZGVmaW5lIElFVkVOVF9FUlJfTUFTSyAgICAgICAgIFwKIChJRVZFTlRfUlhDIHwgSUVWRU5UX0JTWSB8IElFVkVOVF9FQkVSUiB8IElFVkVOVF9NU1JPIHwgXAogIElFVkVOVF9CQUJUIHwgSUVWRU5UX1RYQyB8IElFVkVOVF9UWEUgfCBJRVZFTlRfTEMgXAotIHwgSUVWRU5UX0NSTCB8IElFVkVOVF9YRlVOKQorIHwgSUVWRU5UX0NSTCB8IElFVkVOVF9YRlVOIHwgSUVWRU5UX0RQRSB8IElFVkVOVF9QRVJSKQogCiAjZGVmaW5lIElNQVNLX0lOSVRfQ0xFQVIJMHgwMDAwMDAwMAogI2RlZmluZSBJTUFTS19CQUJSICAgICAgICAgICAgICAweDgwMDAwMDAwCkBAIC0yMTIsMTAgKzI0MSwxNSBAQAogI2RlZmluZSBJTUFTS19SWEIwICAgICAgICAgICAgICAweDAwMDA4MDAwCiAjZGVmaW5lIElNQVNLX0dUU0MgICAgICAgICAgICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgSU1BU0tfUlhGRU4wCQkweDAwMDAwMDgwCisjZGVmaW5lIElNQVNLX0ZJUgkJMHgwMDAwMDAwOAorI2RlZmluZSBJTUFTS19GSVEJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSU1BU0tfRFBFCQkweDAwMDAwMDAyCisjZGVmaW5lIElNQVNLX1BFUlIJCTB4MDAwMDAwMDEKICNkZWZpbmUgSU1BU0tfUlhfRElTQUJMRUQgfihJTUFTS19SWEZFTjAgfCBJTUFTS19CU1kpCiAjZGVmaW5lIElNQVNLX0RFRkFVTFQgIChJTUFTS19UWEVFTiB8IElNQVNLX1RYRkVOIHwgSU1BU0tfVFhCRU4gfCBcCiAJCUlNQVNLX1JYRkVOMCB8IElNQVNLX0JTWSB8IElNQVNLX0VCRVJSIHwgSU1BU0tfQkFCUiB8IFwKLQkJSU1BU0tfWEZVTiB8IElNQVNLX1JYQyB8IElNQVNLX0JBQlQpCisJCUlNQVNLX1hGVU4gfCBJTUFTS19SWEMgfCBJTUFTS19CQUJUIHwgSU1BU0tfRFBFIFwKKwkJfCBJTUFTS19QRVJSKQogCiAKIC8qIEF0dHJpYnV0ZSBmaWVsZHMgKi8KQEAgLTI1NCw2ICsyODgsMTggQEAKICNkZWZpbmUgVFhCRF9SRVRSWUxJTUlUCQkweDAwNDAKICNkZWZpbmUJVFhCRF9SRVRSWUNPVU5UTUFTSwkweDAwM2MKICNkZWZpbmUgVFhCRF9VTkRFUlJVTgkJMHgwMDAyCisjZGVmaW5lIFRYQkRfVE9FCQkweDAwMDIKKworLyogVHggRkNCIHBhcmFtIGJpdHMgKi8KKyNkZWZpbmUgVFhGQ0JfVkxOCQkweDgwCisjZGVmaW5lIFRYRkNCX0lQCQkweDQwCisjZGVmaW5lIFRYRkNCX0lQNgkJMHgyMAorI2RlZmluZSBUWEZDQl9UVVAJCTB4MTAKKyNkZWZpbmUgVFhGQ0JfVURQCQkweDA4CisjZGVmaW5lIFRYRkNCX0NJUAkJMHgwNAorI2RlZmluZSBUWEZDQl9DVFUJCTB4MDIKKyNkZWZpbmUgVFhGQ0JfTlBICQkweDAxCisjZGVmaW5lIFRYRkNCX0RFRkFVTFQgCQkoVFhGQ0JfSVB8VFhGQ0JfVFVQfFRYRkNCX0NUVXxUWEZDQl9OUEgpCiAKIC8qIFJ4QkQgc3RhdHVzIGZpZWxkIGJpdHMgKi8KICNkZWZpbmUgUlhCRF9FTVBUWQkJMHg4MDAwCkBAIC0yNzMsNiArMzE5LDE4IEBACiAjZGVmaW5lIFJYQkRfVFJVTkNBVEVECQkweDAwMDEKICNkZWZpbmUgUlhCRF9TVEFUUwkJMHgwMWZmCiAKKy8qIFJ4IEZDQiBzdGF0dXMgZmllbGQgYml0cyAqLworI2RlZmluZSBSWEZDQl9WTE4JCTB4ODAwMAorI2RlZmluZSBSWEZDQl9JUAkJMHg0MDAwCisjZGVmaW5lIFJYRkNCX0lQNgkJMHgyMDAwCisjZGVmaW5lIFJYRkNCX1RVUAkJMHgxMDAwCisjZGVmaW5lIFJYRkNCX0NJUAkJMHgwODAwCisjZGVmaW5lIFJYRkNCX0NUVQkJMHgwNDAwCisjZGVmaW5lIFJYRkNCX0VJUAkJMHgwMjAwCisjZGVmaW5lIFJYRkNCX0VUVQkJMHgwMTAwCisjZGVmaW5lIFJYRkNCX1BFUlJfTUFTSwkJMHgwMDBjCisjZGVmaW5lIFJYRkNCX1BFUlJfQkFETDMJMHgwMDA4CisKIHN0cnVjdCB0eGJkOAogewogCXUxNglzdGF0dXM7CS8qIFN0YXR1cyBGaWVsZHMgKi8KQEAgLTI4MCw2ICszMzgsMjIgQEAKIAl1MzIJYnVmUHRyOwkvKiBCdWZmZXIgUG9pbnRlciAqLwogfTsKIAorc3RydWN0IHR4ZmNiIHsKKwl1OAl2bG46MSwKKwkJaXA6MSwKKwkJaXA2OjEsCisJCXR1cDoxLAorCQl1ZHA6MSwKKwkJY2lwOjEsCisJCWN0dToxLAorCQlucGg6MTsKKwl1OAlyZXNlcnZlZDsKKwl1OAlsNG9zOwkvKiBMZXZlbCA0IEhlYWRlciBPZmZzZXQgKi8KKwl1OAlsM29zOyAJLyogTGV2ZWwgMyBIZWFkZXIgT2Zmc2V0ICovCisJdTE2CXBoY3M7CS8qIFBzZXVkby1oZWFkZXIgQ2hlY2tzdW0gKi8KKwl1MTYJdmxjdGw7CS8qIFZMQU4gY29udHJvbCB3b3JkICovCit9OworCiBzdHJ1Y3QgcnhiZDgKIHsKIAl1MTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCkBAIC0yODcsNiArMzYxLDIxIEBACiAJdTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KIH07CiAKK3N0cnVjdCByeGZjYiB7CisJdTE2CXZsbjoxLAorCQlpcDoxLAorCQlpcDY6MSwKKwkJdHVwOjEsCisJCWNpcDoxLAorCQljdHU6MSwKKwkJZWlwOjEsCisJCWV0dToxOworCXU4CXJxOwkvKiBSZWNlaXZlIFF1ZXVlIGluZGV4ICovCisJdTgJcHJvOwkvKiBMYXllciA0IFByb3RvY29sICovCisJdTE2CXJlc2VydmVkOworCXUxNgl2bGN0bDsJLyogVkxBTiBjb250cm9sIHdvcmQgKi8KK307CisKIHN0cnVjdCBybW9uX21pYgogewogCXUzMgl0cjY0OwkvKiAweC42ODAgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSA2NC1ieXRlIEZyYW1lIENvdW50ZXIgKi8KQEAgLTM3MSw5MCArNDYwLDE5MSBAQAogCiAKIHN0cnVjdCBnZmFyIHsKLQl1OAlyZXMxWzE2XTsKLQl1MzIJaWV2ZW50OwkJCS8qIDB4LjAxMCAtIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAqLwotCXUzMglpbWFzazsJCQkvKiAweC4wMTQgLSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotCXUzMgllZGlzOwkJCS8qIDB4LjAxOCAtIEVycm9yIERpc2FibGVkIFJlZ2lzdGVyICovCisJdTMyCXRzZWNfaWQ7CS8qIDB4LjAwMCAtIENvbnRyb2xsZXIgSUQgcmVnaXN0ZXIgKi8KKwl1OAlyZXMxWzEyXTsKKwl1MzIJaWV2ZW50OwkJLyogMHguMDEwIC0gSW50ZXJydXB0IEV2ZW50IFJlZ2lzdGVyICovCisJdTMyCWltYXNrOwkJLyogMHguMDE0IC0gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKwl1MzIJZWRpczsJCS8qIDB4LjAxOCAtIEVycm9yIERpc2FibGVkIFJlZ2lzdGVyICovCiAJdTgJcmVzMls0XTsKLQl1MzIJZWNudHJsOwkJCS8qIDB4LjAyMCAtIEV0aGVybmV0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLQl1MzIJbWluZmxyOwkJCS8qIDB4LjAyNCAtIE1pbmltdW0gRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCi0JdTMyCXB0djsJCQkvKiAweC4wMjggLSBQYXVzZSBUaW1lIFZhbHVlIFJlZ2lzdGVyICovCi0JdTMyCWRtYWN0cmw7CQkvKiAweC4wMmMgLSBETUEgQ29udHJvbCBSZWdpc3RlciAqLwotCXUzMgl0YmlwYTsJCQkvKiAweC4wMzAgLSBUQkkgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJZWNudHJsOwkJLyogMHguMDIwIC0gRXRoZXJuZXQgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgltaW5mbHI7CQkvKiAweC4wMjQgLSBNaW5pbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCXUzMglwdHY7CQkvKiAweC4wMjggLSBQYXVzZSBUaW1lIFZhbHVlIFJlZ2lzdGVyICovCisJdTMyCWRtYWN0cmw7CS8qIDB4LjAyYyAtIERNQSBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXRiaXBhOwkJLyogMHguMDMwIC0gVEJJIFBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCiAJdTgJcmVzM1s4OF07Ci0JdTMyCWZpZm9fdHhfdGhyOwkJLyogMHguMDhjIC0gRklGTyB0cmFuc21pdCB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwl1MzIJZmlmb190eF90aHI7CS8qIDB4LjA4YyAtIEZJRk8gdHJhbnNtaXQgdGhyZXNob2xkIHJlZ2lzdGVyICovCiAJdTgJcmVzNFs4XTsKLQl1MzIJZmlmb190eF9zdGFydmU7CQkvKiAweC4wOTggLSBGSUZPIHRyYW5zbWl0IHN0YXJ2ZSByZWdpc3RlciAqLworCXUzMglmaWZvX3R4X3N0YXJ2ZTsJLyogMHguMDk4IC0gRklGTyB0cmFuc21pdCBzdGFydmUgcmVnaXN0ZXIgKi8KIAl1MzIJZmlmb190eF9zdGFydmVfc2h1dG9mZjsJLyogMHguMDljIC0gRklGTyB0cmFuc21pdCBzdGFydmUgc2h1dG9mZiByZWdpc3RlciAqLwotCXU4CXJlczVbOTZdOwotCXUzMgl0Y3RybDsJCQkvKiAweC4xMDAgLSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCXRzdGF0OwkJCS8qIDB4LjEwNCAtIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciAqLwotCXU4CXJlczZbNF07Ci0JdTMyCXRiZGxlbjsJCQkvKiAweC4xMGMgLSBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBEYXRhIExlbmd0aCBSZWdpc3RlciAqLwotCXUzMgl0eGljOwkJCS8qIDB4LjExMCAtIFRyYW5zbWl0IEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLQl1OAlyZXM3WzE2XTsKLQl1MzIJY3RicHRyOwkJCS8qIDB4LjEyNCAtIEN1cnJlbnQgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotCXU4CXJlczhbOTJdOwotCXUzMgl0YnB0cjsJCQkvKiAweC4xODQgLSBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBQb2ludGVyIExvdyBSZWdpc3RlciAqLwotCXU4CXJlczlbMTI0XTsKLQl1MzIJdGJhc2U7CQkJLyogMHguMjA0IC0gVHJhbnNtaXQgRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl1OAlyZXMxMFsxNjhdOwotCXUzMglvc3RiZDsJCQkvKiAweC4yYjAgLSBPdXQtb2YtU2VxdWVuY2UgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KLQl1MzIJb3N0YmRwOwkJCS8qIDB4LjJiNCAtIE91dC1vZi1TZXF1ZW5jZSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBQb2ludGVyIFJlZ2lzdGVyICovCi0JdTgJcmVzMTFbNzJdOwotCXUzMglyY3RybDsJCQkvKiAweC4zMDAgLSBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQl1MzIJcnN0YXQ7CQkJLyogMHguMzA0IC0gUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLQl1OAlyZXMxMls0XTsKLQl1MzIJcmJkbGVuOwkJCS8qIDB4LjMwYyAtIFJ4QkQgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KLQl1MzIJcnhpYzsJCQkvKiAweC4zMTAgLSBSZWNlaXZlIEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLQl1OAlyZXMxM1sxNl07Ci0JdTMyCWNyYnB0cjsJCQkvKiAweC4zMjQgLSBDdXJyZW50IFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciAqLwotCXU4CXJlczE0WzI0XTsKLQl1MzIJbXJibHI7CQkJLyogMHguMzQwIC0gTWF4aW11bSBSZWNlaXZlIEJ1ZmZlciBMZW5ndGggUmVnaXN0ZXIgKi8KLQl1OAlyZXMxNVs2NF07Ci0JdTMyCXJicHRyOwkJCS8qIDB4LjM4NCAtIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciAqLwotCXU4CXJlczE2WzEyNF07Ci0JdTMyCXJiYXNlOwkJCS8qIDB4LjQwNCAtIFJlY2VpdmUgRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgKi8KLQl1OAlyZXMxN1syNDhdOwotCXUzMgltYWNjZmcxOwkJLyogMHguNTAwIC0gTUFDIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLwotCXUzMgltYWNjZmcyOwkJLyogMHguNTA0IC0gTUFDIENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLwotCXUzMglpcGdpZmc7CQkJLyogMHguNTA4IC0gSW50ZXIgUGFja2V0IEdhcC9JbnRlciBGcmFtZSBHYXAgUmVnaXN0ZXIgKi8KLQl1MzIJaGFmZHVwOwkJCS8qIDB4LjUwYyAtIEhhbGYgRHVwbGV4IFJlZ2lzdGVyICovCi0JdTMyCW1heGZybTsJCQkvKiAweC41MTAgLSBNYXhpbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCXU4CXJlczVbNF07CisJdTMyCWZpZm9fcnhfcGF1c2U7CS8qIDB4LjBhNCAtIEZJRk8gcmVjZWl2ZSBwYXVzZSB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwl1MzIJZmlmb19yeF9hbGFybTsJLyogMHguMGE4IC0gRklGTyByZWNlaXZlIGFsYXJtIHRocmVzaG9sZCByZWdpc3RlciAqLworCXU4CXJlczZbODRdOworCXUzMgl0Y3RybDsJCS8qIDB4LjEwMCAtIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJdHN0YXQ7CQkvKiAweC4xMDQgLSBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJZGZ2bGFuOwkJLyogMHguMTA4IC0gRGVmYXVsdCBWTEFOIENvbnRyb2wgd29yZCAqLworCXUzMgl0YmRsZW47CQkvKiAweC4xMGMgLSBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBEYXRhIExlbmd0aCBSZWdpc3RlciAqLworCXUzMgl0eGljOwkJLyogMHguMTEwIC0gVHJhbnNtaXQgSW50ZXJydXB0IENvYWxlc2NpbmcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXUzMgl0cXVldWU7CQkvKiAweC4xMTQgLSBUcmFuc21pdCBxdWV1ZSBjb250cm9sIHJlZ2lzdGVyICovCisJdTgJcmVzN1s0MF07CisJdTMyCXRyMDN3dDsJCS8qIDB4LjE0MCAtIFR4QkQgUmluZ3MgMC0zIHJvdW5kLXJvYmluIHdlaWdodGluZ3MgKi8KKwl1MzIJdHI0N3d0OwkJLyogMHguMTQ0IC0gVHhCRCBSaW5ncyA0LTcgcm91bmQtcm9iaW4gd2VpZ2h0aW5ncyAqLworCXU4CXJlczhbNTJdOworCXUzMgl0YmRicGg7CQkvKiAweC4xN2MgLSBUeCBkYXRhIGJ1ZmZlciBwb2ludGVyIGhpZ2ggKi8KKwl1OAlyZXM5YVs0XTsKKwl1MzIJdGJwdHIwOwkJLyogMHguMTg0IC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDAgKi8KKwl1OAlyZXM5Yls0XTsKKwl1MzIJdGJwdHIxOwkJLyogMHguMThjIC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDEgKi8KKwl1OAlyZXM5Y1s0XTsKKwl1MzIJdGJwdHIyOwkJLyogMHguMTk0IC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDIgKi8KKwl1OAlyZXM5ZFs0XTsKKwl1MzIJdGJwdHIzOwkJLyogMHguMTljIC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDMgKi8KKwl1OAlyZXM5ZVs0XTsKKwl1MzIJdGJwdHI0OwkJLyogMHguMWE0IC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDQgKi8KKwl1OAlyZXM5Zls0XTsKKwl1MzIJdGJwdHI1OwkJLyogMHguMWFjIC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDUgKi8KKwl1OAlyZXM5Z1s0XTsKKwl1MzIJdGJwdHI2OwkJLyogMHguMWI0IC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDYgKi8KKwl1OAlyZXM5aFs0XTsKKwl1MzIJdGJwdHI3OwkJLyogMHguMWJjIC0gVHhCRCBQb2ludGVyIGZvciByaW5nIDcgKi8KKwl1OAlyZXM5WzY0XTsKKwl1MzIJdGJhc2VoOwkJLyogMHguMjAwIC0gVHhCRCBiYXNlIGFkZHJlc3MgaGlnaCAqLworCXUzMgl0YmFzZTA7CQkvKiAweC4yMDQgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDAgKi8KKwl1OAlyZXMxMGFbNF07CisJdTMyCXRiYXNlMTsJCS8qIDB4LjIwYyAtIFR4QkQgQmFzZSBBZGRyZXNzIG9mIHJpbmcgMSAqLworCXU4CXJlczEwYls0XTsKKwl1MzIJdGJhc2UyOwkJLyogMHguMjE0IC0gVHhCRCBCYXNlIEFkZHJlc3Mgb2YgcmluZyAyICovCisJdTgJcmVzMTBjWzRdOworCXUzMgl0YmFzZTM7CQkvKiAweC4yMWMgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDMgKi8KKwl1OAlyZXMxMGRbNF07CisJdTMyCXRiYXNlNDsJCS8qIDB4LjIyNCAtIFR4QkQgQmFzZSBBZGRyZXNzIG9mIHJpbmcgNCAqLworCXU4CXJlczEwZVs0XTsKKwl1MzIJdGJhc2U1OwkJLyogMHguMjJjIC0gVHhCRCBCYXNlIEFkZHJlc3Mgb2YgcmluZyA1ICovCisJdTgJcmVzMTBmWzRdOworCXUzMgl0YmFzZTY7CQkvKiAweC4yMzQgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDYgKi8KKwl1OAlyZXMxMGdbNF07CisJdTMyCXRiYXNlNzsJCS8qIDB4LjIzYyAtIFR4QkQgQmFzZSBBZGRyZXNzIG9mIHJpbmcgNyAqLworCXU4CXJlczEwWzE5Ml07CisJdTMyCXJjdHJsOwkJLyogMHguMzAwIC0gUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXJzdGF0OwkJLyogMHguMzA0IC0gUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1OAlyZXMxMls4XTsKKwl1MzIJcnhpYzsJCS8qIDB4LjMxMCAtIFJlY2VpdmUgSW50ZXJydXB0IENvYWxlc2NpbmcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXUzMglycXVldWU7CQkvKiAweC4zMTQgLSBSZWNlaXZlIHF1ZXVlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1OAlyZXMxM1syNF07CisJdTMyCXJiaWZ4OwkJLyogMHguMzMwIC0gUmVjZWl2ZSBiaXQgZmllbGQgZXh0cmFjdCBjb250cm9sIHJlZ2lzdGVyICovCisJdTMyCXJxZmFyOwkJLyogMHguMzM0IC0gUmVjZWl2ZSBxdWV1ZSBmaWxpbmcgdGFibGUgYWRkcmVzcyByZWdpc3RlciAqLworCXUzMglycWZjcjsJCS8qIDB4LjMzOCAtIFJlY2VpdmUgcXVldWUgZmlsaW5nIHRhYmxlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1MzIJcnFmcHI7CQkvKiAweC4zM2MgLSBSZWNlaXZlIHF1ZXVlIGZpbGluZyB0YWJsZSBwcm9wZXJ0eSByZWdpc3RlciAqLworCXUzMgltcmJscjsJCS8qIDB4LjM0MCAtIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoIFJlZ2lzdGVyICovCisJdTgJcmVzMTRbNTZdOworCXUzMglyYmRicGg7CQkvKiAweC4zN2MgLSBSeCBkYXRhIGJ1ZmZlciBwb2ludGVyIGhpZ2ggKi8KKwl1OAlyZXMxNWFbNF07CisJdTMyCXJicHRyMDsJCS8qIDB4LjM4NCAtIFJ4QkQgcG9pbnRlciBmb3IgcmluZyAwICovCisJdTgJcmVzMTViWzRdOworCXUzMglyYnB0cjE7CQkvKiAweC4zOGMgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgMSAqLworCXU4CXJlczE1Y1s0XTsKKwl1MzIJcmJwdHIyOwkJLyogMHguMzk0IC0gUnhCRCBwb2ludGVyIGZvciByaW5nIDIgKi8KKwl1OAlyZXMxNWRbNF07CisJdTMyCXJicHRyMzsJCS8qIDB4LjM5YyAtIFJ4QkQgcG9pbnRlciBmb3IgcmluZyAzICovCisJdTgJcmVzMTVlWzRdOworCXUzMglyYnB0cjQ7CQkvKiAweC4zYTQgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgNCAqLworCXU4CXJlczE1Zls0XTsKKwl1MzIJcmJwdHI1OwkJLyogMHguM2FjIC0gUnhCRCBwb2ludGVyIGZvciByaW5nIDUgKi8KKwl1OAlyZXMxNWdbNF07CisJdTMyCXJicHRyNjsJCS8qIDB4LjNiNCAtIFJ4QkQgcG9pbnRlciBmb3IgcmluZyA2ICovCisJdTgJcmVzMTVoWzRdOworCXUzMglyYnB0cjc7CQkvKiAweC4zYmMgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgNyAqLworCXU4CXJlczE2WzY0XTsKKwl1MzIJcmJhc2VoOwkJLyogMHguNDAwIC0gUnhCRCBiYXNlIGFkZHJlc3MgaGlnaCAqLworCXUzMglyYmFzZTA7CQkvKiAweC40MDQgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDAgKi8KKwl1OAlyZXMxN2FbNF07CisJdTMyCXJiYXNlMTsJCS8qIDB4LjQwYyAtIFJ4QkQgYmFzZSBhZGRyZXNzIG9mIHJpbmcgMSAqLworCXU4CXJlczE3Yls0XTsKKwl1MzIJcmJhc2UyOwkJLyogMHguNDE0IC0gUnhCRCBiYXNlIGFkZHJlc3Mgb2YgcmluZyAyICovCisJdTgJcmVzMTdjWzRdOworCXUzMglyYmFzZTM7CQkvKiAweC40MWMgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDMgKi8KKwl1OAlyZXMxN2RbNF07CisJdTMyCXJiYXNlNDsJCS8qIDB4LjQyNCAtIFJ4QkQgYmFzZSBhZGRyZXNzIG9mIHJpbmcgNCAqLworCXU4CXJlczE3ZVs0XTsKKwl1MzIJcmJhc2U1OwkJLyogMHguNDJjIC0gUnhCRCBiYXNlIGFkZHJlc3Mgb2YgcmluZyA1ICovCisJdTgJcmVzMTdmWzRdOworCXUzMglyYmFzZTY7CQkvKiAweC40MzQgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDYgKi8KKwl1OAlyZXMxN2dbNF07CisJdTMyCXJiYXNlNzsJCS8qIDB4LjQzYyAtIFJ4QkQgYmFzZSBhZGRyZXNzIG9mIHJpbmcgNyAqLworCXU4CXJlczE3WzE5Ml07CisJdTMyCW1hY2NmZzE7CS8qIDB4LjUwMCAtIE1BQyBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjY2ZnMjsJLyogMHguNTA0IC0gTUFDIENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworCXUzMglpcGdpZmc7CQkvKiAweC41MDggLSBJbnRlciBQYWNrZXQgR2FwL0ludGVyIEZyYW1lIEdhcCBSZWdpc3RlciAqLworCXUzMgloYWZkdXA7CQkvKiAweC41MGMgLSBIYWxmIER1cGxleCBSZWdpc3RlciAqLworCXUzMgltYXhmcm07CQkvKiAweC41MTAgLSBNYXhpbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLwogCXU4CXJlczE4WzEyXTsKLQl1MzIJbWlpbWNmZzsJCS8qIDB4LjUyMCAtIE1JSSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLQl1MzIJbWlpbWNvbTsJCS8qIDB4LjUyNCAtIE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgUmVnaXN0ZXIgKi8KLQl1MzIJbWlpbWFkZDsJCS8qIDB4LjUyOCAtIE1JSSBNYW5hZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl1MzIJbWlpbWNvbjsJCS8qIDB4LjUyYyAtIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KLQl1MzIJbWlpbXN0YXQ7CQkvKiAweC41MzAgLSBNSUkgTWFuYWdlbWVudCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQl1MzIJbWlpbWluZDsJCS8qIDB4LjUzNCAtIE1JSSBNYW5hZ2VtZW50IEluZGljYXRvciBSZWdpc3RlciAqLworCXUzMgltaWltY2ZnOwkvKiAweC41MjAgLSBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyCW1paW1jb207CS8qIDB4LjUyNCAtIE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWFkZDsJLyogMHguNTI4IC0gTUlJIE1hbmFnZW1lbnQgQWRkcmVzcyBSZWdpc3RlciAqLworCXUzMgltaWltY29uOwkvKiAweC41MmMgLSBNSUkgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCW1paW1zdGF0OwkvKiAweC41MzAgLSBNSUkgTWFuYWdlbWVudCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWluZDsJLyogMHguNTM0IC0gTUlJIE1hbmFnZW1lbnQgSW5kaWNhdG9yIFJlZ2lzdGVyICovCiAJdTgJcmVzMTlbNF07Ci0JdTMyCWlmc3RhdDsJCQkvKiAweC41M2MgLSBJbnRlcmZhY2UgU3RhdHVzIFJlZ2lzdGVyICovCi0JdTMyCW1hY3N0bmFkZHIxOwkJLyogMHguNTQwIC0gU3RhdGlvbiBBZGRyZXNzIFBhcnQgMSBSZWdpc3RlciAqLwotCXUzMgltYWNzdG5hZGRyMjsJCS8qIDB4LjU0NCAtIFN0YXRpb24gQWRkcmVzcyBQYXJ0IDIgUmVnaXN0ZXIgKi8KLQl1OAlyZXMyMFszMTJdOwotCXN0cnVjdCBybW9uX21pYglybW9uOwotCXU4CXJlczIxWzE5Ml07Ci0JdTMyCWlhZGRyMDsJCQkvKiAweC44MDAgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciAwICovCi0JdTMyCWlhZGRyMTsJCQkvKiAweC44MDQgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciAxICovCi0JdTMyCWlhZGRyMjsJCQkvKiAweC44MDggLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciAyICovCi0JdTMyCWlhZGRyMzsJCQkvKiAweC44MGMgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciAzICovCi0JdTMyCWlhZGRyNDsJCQkvKiAweC44MTAgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciA0ICovCi0JdTMyCWlhZGRyNTsJCQkvKiAweC44MTQgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciA1ICovCi0JdTMyCWlhZGRyNjsJCQkvKiAweC44MTggLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciA2ICovCi0JdTMyCWlhZGRyNzsJCQkvKiAweC44MWMgLSBJbmRpdmR1YWwgYWRkcmVzcyByZWdpc3RlciA3ICovCisJdTMyCWlmc3RhdDsJCS8qIDB4LjUzYyAtIEludGVyZmFjZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjc3RuYWRkcjE7CS8qIDB4LjU0MCAtIFN0YXRpb24gQWRkcmVzcyBQYXJ0IDEgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjc3RuYWRkcjI7CS8qIDB4LjU0NCAtIFN0YXRpb24gQWRkcmVzcyBQYXJ0IDIgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjMDFhZGRyMTsJLyogMHguNTQ4IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMSwgcGFydCAxICovCisJdTMyCW1hYzAxYWRkcjI7CS8qIDB4LjU0YyAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEsIHBhcnQgMiAqLworCXUzMgltYWMwMmFkZHIxOwkvKiAweC41NTAgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAyLCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDJhZGRyMjsJLyogMHguNTU0IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMiwgcGFydCAyICovCisJdTMyCW1hYzAzYWRkcjE7CS8qIDB4LjU1OCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDMsIHBhcnQgMSAqLworCXUzMgltYWMwM2FkZHIyOwkvKiAweC41NWMgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAzLCBwYXJ0IDIgKi8KKwl1MzIJbWFjMDRhZGRyMTsJLyogMHguNTYwIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgNCwgcGFydCAxICovCisJdTMyCW1hYzA0YWRkcjI7CS8qIDB4LjU2NCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDQsIHBhcnQgMiAqLworCXUzMgltYWMwNWFkZHIxOwkvKiAweC41NjggLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA1LCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDVhZGRyMjsJLyogMHguNTZjIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgNSwgcGFydCAyICovCisJdTMyCW1hYzA2YWRkcjE7CS8qIDB4LjU3MCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDYsIHBhcnQgMSAqLworCXUzMgltYWMwNmFkZHIyOwkvKiAweC41NzQgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA2LCBwYXJ0IDIgKi8KKwl1MzIJbWFjMDdhZGRyMTsJLyogMHguNTc4IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgNywgcGFydCAxICovCisJdTMyCW1hYzA3YWRkcjI7CS8qIDB4LjU3YyAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDcsIHBhcnQgMiAqLworCXUzMgltYWMwOGFkZHIxOwkvKiAweC41ODAgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA4LCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDhhZGRyMjsJLyogMHguNTg0IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgOCwgcGFydCAyICovCisJdTMyCW1hYzA5YWRkcjE7CS8qIDB4LjU4OCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDksIHBhcnQgMSAqLworCXUzMgltYWMwOWFkZHIyOwkvKiAweC41OGMgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA5LCBwYXJ0IDIgKi8KKwl1MzIJbWFjMTBhZGRyMTsJLyogMHguNTkwIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTAsIHBhcnQgMSovCisJdTMyCW1hYzEwYWRkcjI7CS8qIDB4LjU5NCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEwLCBwYXJ0IDIqLworCXUzMgltYWMxMWFkZHIxOwkvKiAweC41OTggLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxMSwgcGFydCAxKi8KKwl1MzIJbWFjMTFhZGRyMjsJLyogMHguNTljIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTEsIHBhcnQgMiovCisJdTMyCW1hYzEyYWRkcjE7CS8qIDB4LjVhMCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEyLCBwYXJ0IDEqLworCXUzMgltYWMxMmFkZHIyOwkvKiAweC41YTQgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxMiwgcGFydCAyKi8KKwl1MzIJbWFjMTNhZGRyMTsJLyogMHguNWE4IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTMsIHBhcnQgMSovCisJdTMyCW1hYzEzYWRkcjI7CS8qIDB4LjVhYyAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEzLCBwYXJ0IDIqLworCXUzMgltYWMxNGFkZHIxOwkvKiAweC41YjAgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxNCwgcGFydCAxKi8KKwl1MzIJbWFjMTRhZGRyMjsJLyogMHguNWI0IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTQsIHBhcnQgMiovCisJdTMyCW1hYzE1YWRkcjE7CS8qIDB4LjViOCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDE1LCBwYXJ0IDEqLworCXUzMgltYWMxNWFkZHIyOwkvKiAweC41YmMgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxNSwgcGFydCAyKi8KKwl1OAlyZXMyMFsxOTJdOworCXN0cnVjdCBybW9uX21pYglybW9uOwkvKiAweC42ODAtMHguNzNjICovCisJdTMyCXJyZWo7CQkvKiAweC43NDAgLSBSZWNlaXZlIGZpbGVyIHJlamVjdGVkIHBhY2tldCBjb3VudGVyICovCisJdTgJcmVzMjFbMTg4XTsKKwl1MzIJaWdhZGRyMDsJLyogMHguODAwIC0gSW5kaXZkdWFsL0dyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMCovCisJdTMyCWlnYWRkcjE7CS8qIDB4LjgwNCAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDEqLworCXUzMglpZ2FkZHIyOwkvKiAweC44MDggLSBJbmRpdmR1YWwvR3JvdXAgYWRkcmVzcyByZWdpc3RlciAyKi8KKwl1MzIJaWdhZGRyMzsJLyogMHguODBjIC0gSW5kaXZkdWFsL0dyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMyovCisJdTMyCWlnYWRkcjQ7CS8qIDB4LjgxMCAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDQqLworCXUzMglpZ2FkZHI1OwkvKiAweC44MTQgLSBJbmRpdmR1YWwvR3JvdXAgYWRkcmVzcyByZWdpc3RlciA1Ki8KKwl1MzIJaWdhZGRyNjsJLyogMHguODE4IC0gSW5kaXZkdWFsL0dyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgNiovCisJdTMyCWlnYWRkcjc7CS8qIDB4LjgxYyAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDcqLwogCXU4CXJlczIyWzk2XTsKLQl1MzIJZ2FkZHIwOwkJCS8qIDB4Ljg4MCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDAgKi8KLQl1MzIJZ2FkZHIxOwkJCS8qIDB4Ljg4NCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KLQl1MzIJZ2FkZHIyOwkJCS8qIDB4Ljg4OCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQl1MzIJZ2FkZHIzOwkJCS8qIDB4Ljg4YyAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KLQl1MzIJZ2FkZHI0OwkJCS8qIDB4Ljg5MCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KLQl1MzIJZ2FkZHI1OwkJCS8qIDB4Ljg5NCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDUgKi8KLQl1MzIJZ2FkZHI2OwkJCS8qIDB4Ljg5OCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDYgKi8KLQl1MzIJZ2FkZHI3OwkJCS8qIDB4Ljg5YyAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDcgKi8KLQl1OAlyZXMyM1s4NTZdOwotCXUzMglhdHRyOwkJCS8qIDB4LmJmOCAtIEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KLQl1MzIJYXR0cmVsaTsJCS8qIDB4LmJmYyAtIEF0dHJpYnV0ZXMgRXh0cmFjdCBMZW5ndGggYW5kIEV4dHJhY3QgSW5kZXggUmVnaXN0ZXIgKi8KKwl1MzIJZ2FkZHIwOwkJLyogMHguODgwIC0gR3JvdXAgYWRkcmVzcyByZWdpc3RlciAwICovCisJdTMyCWdhZGRyMTsJCS8qIDB4Ljg4NCAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMSAqLworCXUzMglnYWRkcjI7CQkvKiAweC44ODggLSBHcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwl1MzIJZ2FkZHIzOwkJLyogMHguODhjIC0gR3JvdXAgYWRkcmVzcyByZWdpc3RlciAzICovCisJdTMyCWdhZGRyNDsJCS8qIDB4Ljg5MCAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgNCAqLworCXUzMglnYWRkcjU7CQkvKiAweC44OTQgLSBHcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDUgKi8KKwl1MzIJZ2FkZHI2OwkJLyogMHguODk4IC0gR3JvdXAgYWRkcmVzcyByZWdpc3RlciA2ICovCisJdTMyCWdhZGRyNzsJCS8qIDB4Ljg5YyAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgNyAqLworCXU4CXJlczIzYVszNTJdOworCXUzMglmaWZvY2ZnOwkvKiAweC5hMDAgLSBGSUZPIGludGVyZmFjZSBjb25maWcgcmVnaXN0ZXIgKi8KKwl1OAlyZXMyM2JbMjUyXTsKKwl1OAlyZXMyM2NbMjQ4XTsKKwl1MzIJYXR0cjsJCS8qIDB4LmJmOCAtIEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KKwl1MzIJYXR0cmVsaTsJLyogMHguYmZjIC0gQXR0cmlidXRlcyBFeHRyYWN0IExlbmd0aCBhbmQgRXh0cmFjdCBJbmRleCBSZWdpc3RlciAqLwogCXU4CXJlczI0WzEwMjRdOwogCiB9OwpAQCAtNDk2LDYgKzY4Niw4IEBACiAJc3RydWN0IHR4YmQ4ICpjdXJfdHg7CSAgICAgICAgLyogTmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KIAlzdHJ1Y3QgdHhiZDggKmRpcnR5X3R4OwkJLyogVGhlIFJpbmcgZW50cnkgdG8gYmUgZnJlZWQuICovCiAJc3RydWN0IGdmYXIgKnJlZ3M7CS8qIFBvaW50ZXIgdG8gdGhlIEdGQVIgbWVtb3J5IG1hcHBlZCBSZWdpc3RlcnMgKi8KKwl1MzIgKmhhc2hfcmVnc1sxNl07CisJaW50IGhhc2hfd2lkdGg7CiAJc3RydWN0IGdmYXIgKnBoeXJlZ3M7CiAJc3RydWN0IHdvcmtfc3RydWN0IHRxOwogCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9pbmZvX3RpbWVyOwpAQCAtNTA2LDkgKzY5OCwxMiBAQAogCXVuc2lnbmVkIGludCByeF9zdGFzaF9zaXplOwogCXVuc2lnbmVkIGludCB0eF9yaW5nX3NpemU7CiAJdW5zaWduZWQgaW50IHJ4X3Jpbmdfc2l6ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByeGNsZWFudXBxOwotCXVuc2lnbmVkIGludCByeGNsZWFuOwogCisJdW5zaWduZWQgY2hhciB2bGFuX2VuYWJsZToxLAorCQlyeF9jc3VtX2VuYWJsZToxLAorCQlleHRlbmRlZF9oYXNoOjE7CisJdW5zaWduZWQgc2hvcnQgcGFkZGluZzsKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CiAJLyogSW5mbyBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgYnkgYm9hcmQgc2V0dXAgY29kZSAqLwogCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRUcmFuc21pdDsKIAl1bnNpZ25lZCBpbnQgaW50ZXJydXB0UmVjZWl2ZTsKQEAgLTUxOSw2ICs3MTQsOCBAQAogCWludCBvbGRzcGVlZDsKIAlpbnQgb2xkZHVwbGV4OwogCWludCBvbGRsaW5rOworCisJdWludDMyX3QgbXNnX2VuYWJsZTsKIH07CiAKIGV4dGVybiBpbmxpbmUgdTMyIGdmYXJfcmVhZCh2b2xhdGlsZSB1bnNpZ25lZCAqYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMKaW5kZXggMjgwNDZlOS4uYTQ1MWRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMKQEAgLTQ2LDE2ICs0NiwxOCBAQAogCiBleHRlcm4gaW50IHN0YXJ0dXBfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHN0b3BfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIGdmYXJfaGFsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGdmYXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCk7CiAKLXZvaWQgZ2Zhcl9maWxsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwKK3N0YXRpYyB2b2lkIGdmYXJfZmlsbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZHVtbXksCiAJCSAgICAgdTY0ICogYnVmKTsKLXZvaWQgZ2Zhcl9nc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1Zik7Ci1pbnQgZ2Zhcl9nY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKTsKLWludCBnZmFyX3Njb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpOwotdm9pZCBnZmFyX2dyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscyk7Ci1pbnQgZ2Zhcl9zcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpOwotdm9pZCBnZmFyX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pOworc3RhdGljIHZvaWQgZ2Zhcl9nc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1Zik7CitzdGF0aWMgaW50IGdmYXJfZ2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscyk7CitzdGF0aWMgaW50IGdmYXJfc2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscyk7CitzdGF0aWMgdm9pZCBnZmFyX2dyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscyk7CitzdGF0aWMgaW50IGdmYXJfc3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKTsKK3N0YXRpYyB2b2lkIGdmYXJfZ2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbyk7CiAKIHN0YXRpYyBjaGFyIHN0YXRfZ3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0gewogCSJyeC1kcm9wcGVkLWJ5LWtlcm5lbCIsCkBAIC0xMTgsNTcgKzEyMCw1NiBAQAogCSJ0eC1mcmFnbWVudGVkLWZyYW1lcyIsCiB9OwogCisvKiBGaWxsIGluIGEgYnVmZmVyIHdpdGggdGhlIHN0cmluZ3Mgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUKKyAqIHN0YXRzICovCitzdGF0aWMgdm9pZCBnZmFyX2dzdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICogYnVmKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19STU9OKQorCQltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLCBHRkFSX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7CisJZWxzZQorCQltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLAorCQkJCUdGQVJfRVhUUkFfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsKK30KKwogLyogRmlsbCBpbiBhbiBhcnJheSBvZiA2NC1iaXQgc3RhdGlzdGljcyBmcm9tIHZhcmlvdXMgc291cmNlcy4KICAqIFRoaXMgYXJyYXkgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBldGh0b29sX3N0YXRzCiAgKiBzdHJ1Y3R1cmUsIGFuZCByZXR1cm5lZCB0byB1c2VyIHNwYWNlCiAgKi8KLXZvaWQgZ2Zhcl9maWxsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwgdTY0ICogYnVmKQorc3RhdGljIHZvaWQgZ2Zhcl9maWxsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwgdTY0ICogYnVmKQogewogCWludCBpOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiAqcm1vbiA9ICh1MzIgKikgJiBwcml2LT5yZWdzLT5ybW9uOwogCXU2NCAqZXh0cmEgPSAodTY0ICopICYgcHJpdi0+ZXh0cmFfc3RhdHM7Ci0Jc3RydWN0IGdmYXJfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBnZmFyX3N0YXRzICopIGJ1ZjsKIAotCWZvciAoaSA9IDA7IGkgPCBHRkFSX1JNT05fTEVOOyBpKyspIHsKLQkJc3RhdHMtPnJtb25baV0gPSAodTY0KSAocm1vbltpXSk7Ci0JfQorCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19STU9OKSB7CisJCXUzMiAqcm1vbiA9ICh1MzIgKikgJiBwcml2LT5yZWdzLT5ybW9uOworCQlzdHJ1Y3QgZ2Zhcl9zdGF0cyAqc3RhdHMgPSAoc3RydWN0IGdmYXJfc3RhdHMgKikgYnVmOwogCi0JZm9yIChpID0gMDsgaSA8IEdGQVJfRVhUUkFfU1RBVFNfTEVOOyBpKyspIHsKLQkJc3RhdHMtPmV4dHJhW2ldID0gZXh0cmFbaV07Ci0JfQorCQlmb3IgKGkgPSAwOyBpIDwgR0ZBUl9STU9OX0xFTjsgaSsrKQorCQkJc3RhdHMtPnJtb25baV0gPSAodTY0KSAocm1vbltpXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IEdGQVJfRVhUUkFfU1RBVFNfTEVOOyBpKyspCisJCQlzdGF0cy0+ZXh0cmFbaV0gPSBleHRyYVtpXTsKKwl9IGVsc2UKKwkJZm9yIChpID0gMDsgaSA8IEdGQVJfRVhUUkFfU1RBVFNfTEVOOyBpKyspCisJCQlidWZbaV0gPSBleHRyYVtpXTsKIH0KIAogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0YXRzIChhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBzdHJpbmdzKSAqLwotaW50IGdmYXJfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZ2Zhcl9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiBHRkFSX1NUQVRTX0xFTjsKLX0KLQotdm9pZCBnZmFyX2dzdHJpbmdzX25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1ZikKLXsKLQltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLCBHRkFSX0VYVFJBX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7Ci19Ci0KLXZvaWQgZ2Zhcl9maWxsX3N0YXRzX25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKLQkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LCB1NjQgKiBidWYpCi17Ci0JaW50IGk7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JdTY0ICpleHRyYSA9ICh1NjQgKikgJiBwcml2LT5leHRyYV9zdGF0czsKIAotCWZvciAoaSA9IDA7IGkgPCBHRkFSX0VYVFJBX1NUQVRTX0xFTjsgaSsrKSB7Ci0JCWJ1ZltpXSA9IGV4dHJhW2ldOwotCX0KKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTikKKwkJcmV0dXJuIEdGQVJfU1RBVFNfTEVOOworCWVsc2UKKwkJcmV0dXJuIEdGQVJfRVhUUkFfU1RBVFNfTEVOOwogfQogCi0KLWludCBnZmFyX3N0YXRzX2NvdW50X25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBHRkFSX0VYVFJBX1NUQVRTX0xFTjsKLX0KIC8qIEZpbGxzIGluIHRoZSBkcnZpbmZvIHN0cnVjdHVyZSB3aXRoIHNvbWUgYmFzaWMgaW5mbyAqLwotdm9pZCBnZmFyX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdAorc3RhdGljIHZvaWQgZ2Zhcl9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QKIAkgICAgICBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBHRkFSX0lORk9TVFJfTEVOKTsKQEAgLTE4Miw3ICsxODMsNyBAQAogfQogCiAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZ3MgaW4gdGhlIGV0aHRvb2xfY21kIHN0cnVjdHVyZSAqLwotaW50IGdmYXJfZ3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBnZmFyX2dzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1aW50IGdpZ2FiaXRfc3VwcG9ydCA9IApAQCAtMjE2LDEzICsyMTcsMTMgQEAKIH0KIAogLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZSAqLwotaW50IGdmYXJfcmVnbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGdmYXJfcmVnbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIHNpemVvZiAoc3RydWN0IGdmYXIpOwogfQogCiAvKiBSZXR1cm4gYSBkdW1wIG9mIHRoZSBHRkFSIHJlZ2lzdGVyIHNwYWNlICovCi12b2lkIGdmYXJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnYnVmKQorc3RhdGljIHZvaWQgZ2Zhcl9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpyZWdidWYpCiB7CiAJaW50IGk7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yMzMsMTMgKzIzNCw2IEBACiAJCWJ1ZltpXSA9IHRoZXJlZ3NbaV07CiB9CiAKLS8qIEZpbGwgaW4gYSBidWZmZXIgd2l0aCB0aGUgc3RyaW5ncyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZQotICogc3RhdHMgKi8KLXZvaWQgZ2Zhcl9nc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1ZikKLXsKLQltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLCBHRkFSX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7Ci19Ci0KIC8qIENvbnZlcnQgbWljcm9zZWNvbmRzIHRvIGV0aGVybmV0IGNsb2NrIHRpY2tzLCB3aGljaCBjaGFuZ2VzCiAgKiBkZXBlbmRpbmcgb24gd2hhdCBzcGVlZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nIGF0ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGdmYXJfdXNlY3MydGlja3Moc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50IHVzZWNzKQpAQCAtMjkxLDkgKzI4NSwxMiBAQAogCiAvKiBHZXQgdGhlIGNvYWxlc2NpbmcgcGFyYW1ldGVycywgYW5kIHB1dCB0aGVtIGluIHRoZSBjdmFscwogICogc3RydWN0dXJlLiAgKi8KLWludCBnZmFyX2djb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCitzdGF0aWMgaW50IGdmYXJfZ2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscykKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAoIShwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19DT0FMRVNDRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWN2YWxzLT5yeF9jb2FsZXNjZV91c2VjcyA9IGdmYXJfdGlja3MydXNlY3MocHJpdiwgcHJpdi0+cnh0aW1lKTsKIAljdmFscy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBwcml2LT5yeGNvdW50OwpAQCAtMzM3LDEwICszMzQsMTMgQEAKICAqIEJvdGggY3ZhbHMtPipfdXNlY3MgYW5kIGN2YWxzLT4qX2ZyYW1lcyBoYXZlIHRvIGJlID4gMAogICogaW4gb3JkZXIgZm9yIGNvYWxlc2NpbmcgdG8gYmUgYWN0aXZlCiAgKi8KLWludCBnZmFyX3Njb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCitzdGF0aWMgaW50IGdmYXJfc2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscykKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWlmICghKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJLyogU2V0IHVwIHJ4IGNvYWxlc2NpbmcgKi8KIAlpZiAoKGN2YWxzLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSB8fAogCSAgICAoY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQpAQCAtMzc5LDcgKzM3OSw3IEBACiAvKiBGaWxscyBpbiBydmFscyB3aXRoIHRoZSBjdXJyZW50IHJpbmcgcGFyYW1ldGVycy4gIEN1cnJlbnRseSwKICAqIHJ4LCByeF9taW5pLCBhbmQgcnhfanVtYm8gcmluZ3MgYXJlIHRoZSBzYW1lIHNpemUsIGFzIG1pbmkgYW5kCiAgKiBqdW1ibyBhcmUgaWdub3JlZCBieSB0aGUgZHJpdmVyICovCi12b2lkIGdmYXJfZ3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKQorc3RhdGljIHZvaWQgZ2Zhcl9ncmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTQwMSw5ICs0MDEsOCBAQAogICogbmVjZXNzYXJ5IHNvIHRoYXQgd2UgZG9uJ3QgbWVzcyB0aGluZ3MgdXAgd2hpbGUgd2UncmUgaW4KICAqIG1vdGlvbi4gIFdlIHdhaXQgZm9yIHRoZSByaW5nIHRvIGJlIGNsZWFuIGJlZm9yZSByZWFsbG9jYXRpbmcKICAqIHRoZSByaW5ncy4gKi8KLWludCBnZmFyX3NyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscykKK3N0YXRpYyBpbnQgZ2Zhcl9zcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpCiB7Ci0JdTMyIHRlbXB2YWw7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVyciA9IDA7CiAKQEAgLTQyNSw0NCArNDI0LDExNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBTdG9wIHRoZSBjb250cm9sbGVyIHNvIHdlIGRvbid0IHJ4IGFueSBtb3JlIGZyYW1lcyAqLwotCS8qIEJ1dCBmaXJzdCwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBiaXRzICovCi0JdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7Ci0JdGVtcHZhbCAmPSB+KERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOwotCi0JdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7Ci0JdGVtcHZhbCB8PSAoRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUyk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7Ci0KLQl3aGlsZSAoIShnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCkgJiAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpKQotCQljcHVfcmVsYXgoKTsKLQotCS8qIE5vdGUgdGhhdCByeCBpcyBub3QgY2xlYW4gcmlnaHQgbm93ICovCi0JcHJpdi0+cnhjbGVhbiA9IDA7Ci0KIAlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgewotCQkvKiBUZWxsIHRoZSBkcml2ZXIgdG8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgZnJhbWVzICovCi0JCWdmYXJfcmVjZWl2ZSgwLCAodm9pZCAqKSBkZXYsIE5VTEwpOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCS8qIE5vdyB3YWl0IGZvciBpdCB0byBiZSBkb25lICovCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcml2LT5yeGNsZWFudXBxLCBwcml2LT5yeGNsZWFuKTsKKwkJLyogSGFsdCBUWCBhbmQgUlgsIGFuZCBwcm9jZXNzIHRoZSBmcmFtZXMgd2hpY2gKKwkJICogaGF2ZSBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZ2Zhcl9oYWx0KGRldik7CisJCWdmYXJfY2xlYW5fcnhfcmluZyhkZXYsIHByaXYtPnJ4X3Jpbmdfc2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCQkvKiBPaywgYWxsIHBhY2tldHMgaGF2ZSBiZWVuIGhhbmRsZWQuICBOb3cgd2UgYnJpbmcgaXQgZG93biwKLQkJICogY2hhbmdlIHRoZSByaW5nIHNpemUsIGFuZCBicmluZyBpdCB1cCAqLwotCisJCS8qIE5vdyB3ZSB0YWtlIGRvd24gdGhlIHJpbmdzIHRvIHJlYnVpbGQgdGhlbSAqLwogCQlzdG9wX2dmYXIoZGV2KTsKIAl9CiAKKwkvKiBDaGFuZ2UgdGhlIHNpemUgKi8KIAlwcml2LT5yeF9yaW5nX3NpemUgPSBydmFscy0+cnhfcGVuZGluZzsKIAlwcml2LT50eF9yaW5nX3NpemUgPSBydmFscy0+dHhfcGVuZGluZzsKIAorCS8qIFJlYnVpbGQgdGhlIHJpbmdzIHdpdGggdGhlIG5ldyBzaXplICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWVyciA9IHN0YXJ0dXBfZ2ZhcihkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBnZmFyX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIShwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19DU1VNKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBIYWx0IFRYIGFuZCBSWCwgYW5kIHByb2Nlc3MgdGhlIGZyYW1lcyB3aGljaAorCQkgKiBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlnZmFyX2hhbHQoZGV2KTsKKwkJZ2Zhcl9jbGVhbl9yeF9yaW5nKGRldiwgcHJpdi0+cnhfcmluZ19zaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJCS8qIE5vdyB3ZSB0YWtlIGRvd24gdGhlIHJpbmdzIHRvIHJlYnVpbGQgdGhlbSAqLworCQlzdG9wX2dmYXIoZGV2KTsKKwl9CisKKwlwcml2LT5yeF9jc3VtX2VuYWJsZSA9IGRhdGE7CisKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKIAkJZXJyID0gc3RhcnR1cF9nZmFyKGRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdWludDMyX3QgZ2Zhcl9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHByaXYtPnJ4X2NzdW1fZW5hYmxlOworfQorCitzdGF0aWMgaW50IGdmYXJfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDMyX3QgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJZ2Zhcl9oYWx0KGRldik7CisKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07CisKKwlnZmFyX3N0YXJ0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZmFyX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIShwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19DU1VNKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pICE9IDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZmFyX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreyAgICAgICAKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gcHJpdi0+bXNnX2VuYWJsZTsKK30gICAgICAgCisgICAgICAgIAorc3RhdGljIHZvaWQgZ2Zhcl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDMyX3QgZGF0YSkKK3sgICAgICAgCisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+bXNnX2VuYWJsZSA9IGRhdGE7Cit9CisKKwogc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCkBAIC00NzYsNTIgKzU0NywxMCBAQAogCS5nZXRfc3RyaW5ncyA9IGdmYXJfZ3N0cmluZ3MsCiAJLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzLAotfTsKLQotc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfbm9ybW9uX25vY29hbGVzY2VfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAotCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCi0JLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAotCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCi0JLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKLQkuZ2V0X3JpbmdwYXJhbSA9IGdmYXJfZ3JpbmdwYXJhbSwKLQkuc2V0X3JpbmdwYXJhbSA9IGdmYXJfc3JpbmdwYXJhbSwKLQkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzX25vcm1vbiwKLQkuZ2V0X3N0YXRzX2NvdW50ID0gZ2Zhcl9zdGF0c19jb3VudF9ub3Jtb24sCi0JLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzX25vcm1vbiwKLX07Ci0KLXN0cnVjdCBldGh0b29sX29wcyBnZmFyX25vY29hbGVzY2VfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAotCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCi0JLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAotCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCi0JLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKLQkuZ2V0X3JpbmdwYXJhbSA9IGdmYXJfZ3JpbmdwYXJhbSwKLQkuc2V0X3JpbmdwYXJhbSA9IGdmYXJfc3JpbmdwYXJhbSwKLQkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzLAotCS5nZXRfc3RhdHNfY291bnQgPSBnZmFyX3N0YXRzX2NvdW50LAotCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0cywKLX07Ci0KLXN0cnVjdCBldGh0b29sX29wcyBnZmFyX25vcm1vbl9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzID0gZ2Zhcl9nc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvID0gZ2Zhcl9nZHJ2aW5mbywKLQkuZ2V0X3JlZ3NfbGVuID0gZ2Zhcl9yZWdsZW4sCi0JLmdldF9yZWdzID0gZ2Zhcl9nZXRfcmVncywKLQkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAotCS5nZXRfY29hbGVzY2UgPSBnZmFyX2djb2FsZXNjZSwKLQkuc2V0X2NvYWxlc2NlID0gZ2Zhcl9zY29hbGVzY2UsCi0JLmdldF9yaW5ncGFyYW0gPSBnZmFyX2dyaW5ncGFyYW0sCi0JLnNldF9yaW5ncGFyYW0gPSBnZmFyX3NyaW5ncGFyYW0sCi0JLmdldF9zdHJpbmdzID0gZ2Zhcl9nc3RyaW5nc19ub3Jtb24sCi0JLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnRfbm9ybW9uLAotCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0c19ub3Jtb24sCi19OwotCi1zdHJ1Y3QgZXRodG9vbF9vcHMgKmdmYXJfb3BfYXJyYXlbXSA9IHsKLQkmZ2Zhcl9ldGh0b29sX29wcywKLQkmZ2Zhcl9ub3Jtb25fZXRodG9vbF9vcHMsCi0JJmdmYXJfbm9jb2FsZXNjZV9ldGh0b29sX29wcywKLQkmZ2Zhcl9ub3Jtb25fbm9jb2FsZXNjZV9ldGh0b29sX29wcworCS5nZXRfcnhfY3N1bSA9IGdmYXJfZ2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtID0gZ2Zhcl9nZXRfdHhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBnZmFyX3NldF9yeF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGdmYXJfc2V0X3R4X2NzdW0sCisJLmdldF9tc2dsZXZlbCA9IGdmYXJfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBnZmFyX3NldF9tc2dsZXZlbCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuYwppbmRleCAwMmIxNmFiLi43Yzk2NWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19tYXJ2ZWxsID0gewogCS5waHlfaWQJCT0gMHgwMTQxMGMwMCwKIAkucGh5X2lkX21hc2sJPSAweGZmZmZmZjAwLAotCS5uYW1lCQk9ICJNYXJ2ZWxsIDg4RTExMDEiLAorCS5uYW1lCQk9ICJNYXJ2ZWxsIDg4RTExMDEvODhFMTExMSIsCiAJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCiAJLmNvbmZpZ19hbmVnCT0gJm1hcnZlbGxfY29uZmlnX2FuZWcsCiAJLnJlYWRfc3RhdHVzCT0gJm1hcnZlbGxfcmVhZF9zdGF0dXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKaW5kZXggM2Q5NjcxNC4uZDlkZjFkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCiAgICAgICAgICAgICAgICAgaG1wLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAotCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQlza2ItPmRhdGEsIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKERlc2NPd24gfCAKIAkJCURlc2NFbmRQYWNrZXQgfCBEZXNjSW50ciB8IChobXAtPnJ4X2J1Zl9zeiAtIDIpKTsKIAl9CkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCQlza2ItPmRldiA9IGRldjsgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KICAgICAgICAgICAgICAgICBobXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCi0JCQlza2ItPnRhaWwsIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXNrYi0+ZGF0YSwgaG1wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQkvKiAtMiBiZWNhdXNlIGl0IGRvZXNuJ3QgUkVBTExZIGhhdmUgdGhhdCBmaXJzdCAyIGJ5dGVzIC1LRFUgKi8KIAkJaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKERlc2NPd24gfCAKIAkJCURlc2NFbmRQYWNrZXQgfCBEZXNjSW50ciB8IChobXAtPnJ4X2J1Zl9zeiAtMikpOwpAQCAtMTUwOSw3ICsxNTA5LDcgQEAKIAkJCQkJICAgIGRlc2MtPmFkZHIsCiAJCQkJCSAgICBobXAtPnJ4X2J1Zl9zeiwKIAkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCWJ1Zl9hZGRyID0gKHU4ICopIGhtcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbDsKKwkJYnVmX2FkZHIgPSAodTggKikgaG1wLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhOwogCQlmcmFtZV9zdGF0dXMgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMTJdKSkpOwogCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDQpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiICBoYW1hY2hpX3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsCkBAIC0xNjc4LDcgKzE2NzgsNyBAQAogCQkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KICAgICAgICAgICAgICAgICAJZGVzYy0+YWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCi0JCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQkJc2tiLT5kYXRhLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCX0KIAkJZGVzYy0+c3RhdHVzX25fbGVuZ3RoID0gY3B1X3RvX2xlMzIoaG1wLT5yeF9idWZfc3opOwogCQlpZiAoZW50cnkgPj0gUlhfUklOR19TSVpFLTEpCkBAIC0xNzcyLDkgKzE3NzIsOSBAQAogCQkJCSAgIHJlYWRsKGlvYWRkciArIFJ4Q3VyUHRyKSA9PSAobG9uZykmaG1wLT5yeF9yaW5nW2ldID8gJz4nIDogJyAnLAogCQkJCSAgIGksIGhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGgsIGhtcC0+cnhfcmluZ1tpXS5hZGRyKTsKIAkJCWlmIChoYW1hY2hpX2RlYnVnID4gNikgewotCQkJCWlmICgqKHU4KilobXAtPnJ4X3NrYnVmZltpXS0+dGFpbCAhPSAweDY5KSB7CisJCQkJaWYgKCoodTgqKWhtcC0+cnhfc2tidWZmW2ldLT5kYXRhICE9IDB4NjkpIHsKIAkJCQkJdTE2ICphZGRyID0gKHUxNiAqKQotCQkJCQkJaG1wLT5yeF9za2J1ZmZbaV0tPnRhaWw7CisJCQkJCQlobXAtPnJ4X3NrYnVmZltpXS0+ZGF0YTsKIAkJCQkJaW50IGo7CiAKIAkJCQkJZm9yIChqID0gMDsgaiA8IDB4NTA7IGorKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKaW5kZXggZWNlMWIxYS4uYzI3ZTQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOwogCX0KIAkKLQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmc2NjLT50eF9xdWV1ZSkpCisJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnNjYy0+dHhfcXVldWUpKQogCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZzY2MtPnR4X3F1ZXVlKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKQEAgLTExMjYsOCArMTEyNiw3IEBACiAJCiAJaWYgKHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfV0FJVCkJLyogbWF4a2V5dXAgb3IgaWRsZSB0aW1lb3V0ICovCiAJewotCQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NjLT50eF9xdWV1ZSkgPT0gMCkJLyogbm90aGluZyB0byBzZW5kICovCi0JCXsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2NjLT50eF9xdWV1ZSkpIHsJLyogbm90aGluZyB0byBzZW5kICovCiAJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKIAkJCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOwkvKiB0X21heGtleXVwIGxvY2tlZCBpdC4gKi8KIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwLXBsdXMuYyBiL2RyaXZlcnMvbmV0L2hwLXBsdXMuYwppbmRleCA0ODM0MzE0Li4wYWJmNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocC1wbHVzLmMKKysrIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCkBAIC0xNTksMTIgKzE1OSw3IEBACiAJZXJyID0gZG9faHBwX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI3MSw2ICsyNjYsOSBAQAogCS8qIExlYXZlIHRoZSA4MzkwIGFuZCBIUCBjaGlwIHJlc2V0LiAqLwogCW91dHcoaW53KGlvYWRkciArIEhQUF9PUFRJT04pICYgfkVuYWJsZUlSUSwgaW9hZGRyICsgSFBQX09QVElPTik7CiAKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAlyZXR1cm4gMDsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQX0lPX0VYVEVOVCk7CkBAIC00NjMsMTEgKzQ2MSw4IEBACiAJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWlmIChkb19ocHBfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9ocHBbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9ocHBbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJocC1wbHVzLmM6IE5vIEhQLVBsdXMgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAuYyBiL2RyaXZlcnMvbmV0L2hwLmMKaW5kZXggMDI2ODg4Ni4uNTljZjg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAuYworKysgYi9kcml2ZXJzL25ldC9ocC5jCkBAIC0xMjMsMTIgKzEyMyw3IEBACiAJZXJyID0gZG9faHBfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMjI3LDcgKzIyMiwxMiBAQAogCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmaHBfYmxvY2tfb3V0cHV0OwogCWhwX2luaXRfY2FyZChkZXYpOwogCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQxOwogCXJldHVybiAwOworb3V0MToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQX0lPX0VYVEVOVCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTQzMiwxMSArNDMyLDggQEAKIAkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOwogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJaWYgKGRvX2hwX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfaHBbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9ocFtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwLmM6IE5vIEhQIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IGIzYTg5OGMuLmNmMGFjNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtMTA2LDYgKzEwNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZWlzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNDE3LDEyICs0MTgsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci0gb3V0MToKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOwogIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC01NjIsNyArNTU4LDcgQEAKIAkJCSAqIEFsc28sIHdlIGNhbiBoYXZlIEVJU0EgQnVzbWFzdGVyIGNhcmRzIChub3QgdGVzdGVkKSwKIAkJCSAqIHNvIGJld2FyZSAhISEgLSBKZWFuIElJICovCiAJCQlpZigoYnVzID09IEhQMTAwX0JVU19QQ0kpICYmCi0JCQkgICAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCAweGZmZmZmZmZmKSkpIHsKKwkJCSAgIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKIAkJCQkvKiBHcmFjZWZ1bGx5IGZhbGxiYWNrIHRvIHNoYXJlZCBtZW1vcnkgKi8KIAkJCQlnb3RvIGJ1c21hc3RlcmZhaWw7CiAJCQl9CkBAIC03NzYsMTEgKzc3MiwyMiBAQAogCQlwcmludGsoIldhcm5pbmchIExpbmsgZG93bi5cbiIpOwogCX0KIAorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MzsKKwogCXJldHVybiAwOworb3V0MzoKKwlpZiAobG9jYWxfbW9kZSA9PSAxKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBNQVhfUklOR1NJWkUgKyAweDBmLCAKKwkJCQkgICAgbHAtPnBhZ2VfdmFkZHJfYWxnbiwgCisJCQkJICAgIHZpcnRfdG9fd2hhdGV2ZXIoZGV2LCBscC0+cGFnZV92YWRkcl9hbGduKSk7CisJaWYgKG1lbV9wdHJfdmlydCkKKwkJaW91bm1hcChtZW1fcHRyX3ZpcnQpOwogb3V0MjoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKIG91dDE6Ci0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhpcyBwcm9jZWR1cmUgcHV0cyB0aGUgY2FyZCBpbnRvIGEgc3RhYmxlIGluaXQgc3RhdGUgKi8KQEAgLTI4NzUsMTggKzI4ODIsMTIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDE7CiAKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDI7Ci0JCiAjaWZkZWYgSFAxMDBfREVCVUcKIAlwcmludGsoImhwMTAwOiAlczogRUlTQSBhZGFwdGVyIGZvdW5kIGF0IDB4JXhcbiIsIGRldi0+bmFtZSwgCiAJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKICNlbmRpZgogCWdlbmRldi0+ZHJpdmVyX2RhdGEgPSBkZXY7CiAJcmV0dXJuIDA7Ci0gb3V0MjoKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOwogIG91dDE6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gZXJyOwpAQCAtMjk1MSwxNyArMjk1MiwxMiBAQAogCWVyciA9IGhwMTAwX3Byb2JlMShkZXYsIGlvYWRkciwgSFAxMDBfQlVTX1BDSSwgcGRldik7CiAJaWYgKGVycikgCiAJCWdvdG8gb3V0MTsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDI7CiAJCiAjaWZkZWYgSFAxMDBfREVCVUcKIAlwcmludGsoImhwMTAwOiAlczogUENJIGFkYXB0ZXIgZm91bmQgYXQgMHgleFxuIiwgZGV2LT5uYW1lLCBpb2FkZHIpOwogI2VuZGlmCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAJcmV0dXJuIDA7Ci0gb3V0MjoKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOwogIG91dDE6CiAJZnJlZV9uZXRkZXYoZGV2KTsKICBvdXQwOgpAQCAtMzAzMiwxNSArMzAyOCw5IEBACiAJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAogCQllcnIgPSBocDEwMF9pc2FfcHJvYmUoZGV2LCBocDEwMF9wb3J0W2ldKTsKLQkJaWYgKCFlcnIpIHsKLQkJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCQkJaWYgKCFlcnIpIAotCQkJCWhwMTAwX2Rldmxpc3RbY2FyZHMrK10gPSBkZXY7Ci0JCQllbHNlCi0JCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKLQkJfQotCi0JCWlmIChlcnIpCisJCWlmICghZXJyKQorCQkJaHAxMDBfZGV2bGlzdFtjYXJkcysrXSA9IGRldjsKKwkJZWxzZQogCQkJZnJlZV9uZXRkZXYoZGV2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzYS1za2VsZXRvbi5jIGIvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMKaW5kZXggNTBiZWJiNS4uODhhZThhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMKKysrIGIvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMKQEAgLTE3NiwxMiArMTc2LDcgQEAKIAllcnIgPSBkb19uZXRjYXJkX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTMxNiw3ICszMTEsMTUgQEAKIAogICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gJm5ldF90eF90aW1lb3V0OwogICAgICAgICBkZXYtPndhdGNoZG9nX3RpbWVvCT0gTVlfVFhfVElNRU9VVDsgCisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDI7CiAJcmV0dXJuIDA7CitvdXQyOgorI2lmZGVmIGp1bXBlcmVkX2RtYQorCWZyZWVfZG1hKGRldi0+ZG1hKTsKKyNlbmRpZgogb3V0MToKICNpZmRlZiBqdW1wZXJlZF9pbnRlcnJ1cHRzCiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CkBAIC02OTEsMTEgKzY5NCw4IEBACiAJZGV2LT5kbWEgICAgICAgPSBkbWE7CiAJZGV2LT5tZW1fc3RhcnQgPSBtZW07CiAJaWYgKGRvX25ldGNhcmRfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKQotCQkJdGhpc19kZXZpY2UgPSBkZXY7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJdGhpc19kZXZpY2UgPSBkZXY7CisJCXJldHVybiAwOwogCX0KIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiAtRU5YSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwppbmRleCAzNWY2YTdjLi4wOTdiOTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTQ3LDcgKzQ3LDkgQEAKICNlbHNlCiAjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgogI2VuZGlmCi1jaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjAuOTUtazIiRFJJVkVSTkFQSTsKKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4wLjk1LWsyIkRSSVZFUk5BUEkKK2NoYXIgaXhnYl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBjaGFyIGl4Z2JfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIjsKIAogLyogaXhnYl9wY2lfdGJsIC0gUENJIERldmljZSBJRCBUYWJsZQpAQCAtMTQwLDYgKzE0Miw3IEBACiBNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiwgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbChSKSBQUk8vMTBHYkUgTmV0d29yayBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIAogLyogc29tZSBkZWZpbmVzIGZvciBjb250cm9sbGluZyBkZXNjcmlwdG9yIGZldGNoZXMgaW4gaC93ICovCiAjZGVmaW5lIFJYRENUTF9QVEhSRVNIX0RFRkFVTFQgMTI4CS8qIGNoaXAgY29uc2lkZXJzIHByZWZlY2ggYmVsb3cgdGhpcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKaW5kZXggZGVjNTU3Zi4uYjQ5MjliZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9sYW5jZS5jCkBAIC0zNTYsMTEgKzM1Niw4IEBACiAJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOwogCQlkZXYtPmRtYSA9IGRtYVt0aGlzX2Rldl07CiAJCWlmIChkb19sYW5jZV9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2xhbmNlW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfbGFuY2VbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlicmVhazsKQEAgLTQ0OCwxMiArNDQ1LDcgQEAKIAllcnIgPSBkb19sYW5jZV9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC03MjQsNiArNzE2LDkgQEAKIAlkZXYtPnR4X3RpbWVvdXQgPSBsYW5jZV90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZG1hOwogCXJldHVybiAwOwogb3V0X2RtYToKIAlpZiAoZGV2LT5kbWEgIT0gNCkKQEAgLTg2Nyw3ICs4NjIsNyBAQAogCQlscC0+cnhfc2tidWZmW2ldID0gc2tiOwogCQlpZiAoc2tiKSB7CiAJCQlza2ItPmRldiA9IGRldjsKLQkJCXJ4X2J1ZmYgPSBza2ItPnRhaWw7CisJCQlyeF9idWZmID0gc2tiLT5kYXRhOwogCQl9IGVsc2UKIAkJCXJ4X2J1ZmYgPSBrbWFsbG9jKFBLVF9CVUZfU1osIEdGUF9ETUEgfCBnZnApOwogCQlpZiAocnhfYnVmZiA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCmluZGV4IDVlMjYzZmMuLjQxYmFkMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYworKysgYi9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKQEAgLTU1MywxNCArNTUzLDE0IEBACiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCXBhbmljKCIlczogYWxsb2Nfc2tiKCkgZmFpbGVkIiwgX19GSUxFX18pOwogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGxwLT5kZXYsIHNrYi0+dGFpbCxQS1RfQlVGX1NaLAorCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGxwLT5kZXYsIHNrYi0+ZGF0YSxQS1RfQlVGX1NaLAogCQkJCQkgIERNQV9GUk9NX0RFVklDRSk7CiAJCXNrYi0+ZGV2ID0gZGV2OwogCQlyYmQtPnZfbmV4dCA9IHJiZCsxOwogCQlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLHJiZCsxKSk7CiAJCXJiZC0+Yl9hZGRyID0gV1NXQVByYmQodmlydF90b19kbWEobHAscmJkKSk7CiAJCXJiZC0+c2tiID0gc2tiOwotCQlyYmQtPnZfZGF0YSA9IHNrYi0+dGFpbDsKKwkJcmJkLT52X2RhdGEgPSBza2ItPmRhdGE7CiAJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKGRtYV9hZGRyKTsKIAkJcmJkLT5zaXplID0gUEtUX0JVRl9TWjsKIAl9CkBAIC03ODMsOCArNzgzLDggQEAKIAkJCQlyeF9pbl9wbGFjZSA9IDE7CiAJCQkJcmJkLT5za2IgPSBuZXdza2I7CiAJCQkJbmV3c2tiLT5kZXYgPSBkZXY7Ci0JCQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBuZXdza2ItPnRhaWwsIFBLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7Ci0JCQkJcmJkLT52X2RhdGEgPSBuZXdza2ItPnRhaWw7CisJCQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBuZXdza2ItPmRhdGEsIFBLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7CisJCQkJcmJkLT52X2RhdGEgPSBuZXdza2ItPmRhdGE7CiAJCQkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIoZG1hX2FkZHIpOwogCQkJCUNIRUNLX1dCQUNLX0lOVihyYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xuZTM5MC5jIGIvZHJpdmVycy9uZXQvbG5lMzkwLmMKaW5kZXggMTc5YTk3Yy4uMjdmMGQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG5lMzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbG5lMzkwLmMKQEAgLTE2NywxMiArMTY3LDcgQEAKIAllcnIgPSBkb19sbmUzOTBfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMjk2LDcgKzI5MSwxNCBAQAogCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIHVubWFwOwogCXJldHVybiAwOwordW5tYXA6CisJaWYgKGVpX3N0YXR1cy5yZWcwKQorCQlpb3VubWFwKCh2b2lkICopZGV2LT5tZW1fc3RhcnQpOwogY2xlYW51cDoKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDI2LDExICs0MjgsOCBAQAogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJZGV2LT5tZW1fc3RhcnQgPSBtZW1bdGhpc19kZXZdOwogCQlpZiAoZG9fbG5lMzkwX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfbG5lW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfbG5lW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG5lMzkwLmM6IE5vIExORTM5MCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNlLmMgYi9kcml2ZXJzL25ldC9tYWNlLmMKaW5kZXggNmVkMmQ3ZC4uODFkMGEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L21hY2UuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgbWFjZV9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgbWFjZV9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hY2UgPSBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTAwOSwxMiArMTAwOSwxMCBAQAogICAgIHJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtYWNlX21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1hY2VfbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gIm1hY2UiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmggYi9kcml2ZXJzL25ldC9teXJpX2NvZGUuaAppbmRleCA4NTFlYmE4Li5lOWM2ZTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpX2NvZGUuaAorKysgYi9kcml2ZXJzL25ldC9teXJpX2NvZGUuaApAQCAtNDc3NSwxMjg4ICs0Nzc1LDcgQEAKIC8qIFRoaXMgaXMgdGhlIExBTmFpIGRhdGEgKi8gCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFuYWk0X2RhdGFfb2ZmID0gMHg5NEYwOyAvKiBoYWxmLXdvcmQgb2Zmc2V0ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBsYW5haTRfZGF0YVsyMDQ3Ml0gX19pbml0ZGF0YSA9IHsKLTB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgCi0weDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCB9IDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxhbmFpNF9kYXRhWzIwNDcyXSBfX2luaXRkYXRhOwogCiAKICNpZmRlZiBTWU1CT0xfREVGSU5FU19DT01QSUxFRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwppbmRleCBhYWQ1NDk0Li5mMDk5NmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYworKysgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwpAQCAtMzY5LDcgKzM2OSw3IEBACiAgKiBhc3N1bWUgODAyLjMgaWYgdGhlIHR5cGUgZmllbGQgaXMgc2hvcnQgZW5vdWdoIHRvIGJlIGEgbGVuZ3RoLgogICogVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLgogICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbXlyaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCmluZGV4IGJhYmI1OWUuLjlkNmQyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYworKysgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKQEAgLTE5MjYsNyArMTkyNiw3IEBACiAJCQkJYnJlYWs7IC8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCiAJCQlza2ItPmRldiA9IGRldjsgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJbnAtPnJ4X2RtYVtlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKLQkJCQlza2ItPnRhaWwsIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2ItPmRhdGEsIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIobnAtPnJ4X2RtYVtlbnRyeV0pOwogCQl9CiAJCW5wLT5yeF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeik7CkBAIC0yMjgwLDcgKzIyODAsNyBAQAogCQkJCQlidWZsZW4sCiAJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCi0JCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBjaV9kZXYsCiAJCQkJCW5wLT5yeF9kbWFbZW50cnldLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKaW5kZXggODRlMjkxZS4uOGY0MDM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYworKysgYi9kcml2ZXJzL25ldC9uZS1oODMwMC5jCkBAIC0xODAsMTIgKzE4MCw3IEBACiAJZXJyID0gZG9fbmVfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMzI1LDggKzMyMCwxMyBAQAogCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7Ci0JcmV0dXJuIDA7CiAKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcnE7CisJcmV0dXJuIDA7CitvdXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCk7CiAJcmV0dXJuIHJldDsKQEAgLTYzMywxMSArNjMzLDggQEAKIAkJZXJyID0gaW5pdF9yZWdfb2Zmc2V0KGRldiwgZGV2LT5iYXNlX2FkZHIpOwogCQlpZiAoIWVycikgewogCQkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgewotCQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKIAkJCX0KIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUuYyBiL2RyaXZlcnMvbmV0L25lLmMKaW5kZXggNDk2NDMzOS4uNmM1NzA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUuYworKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC0yMjksMTIgKzIyOSw3IEBACiAJZXJyID0gZG9fbmVfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNTM0LDggKzUyOSwxNCBAQAogCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcnE7CiAJcmV0dXJuIDA7CiAKK291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBlcnJfb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKIAlyZXR1cm4gcmV0OwpAQCAtODI2LDExICs4MjcsOCBAQAogCQlkZXYtPm1lbV9lbmQgPSBiYWRbdGhpc19kZXZdOwogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCWlmIChmb3VuZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lMi5jIGIvZHJpdmVycy9uZXQvbmUyLmMKaW5kZXggNmViZWYyNy4uNmQ2MmFkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUyLmMKKysrIGIvZHJpdmVycy9uZXQvbmUyLmMKQEAgLTMwMSwxMiArMzAxLDcgQEAKIAllcnIgPSBkb19uZTJfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNTE3LDcgKzUxMiwxNCBAQAogCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDE7CiAJcmV0dXJuIDA7CitvdXQxOgorCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oIGVpX3N0YXR1cy5wcml2LCBOVUxMLCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihiYXNlX2FkZHIsIE5FX0lPX0VYVEVOVCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTc5OCwxMSArODAwLDggQEAKIAkJZGV2LT5tZW1fZW5kID0gYmFkW3RoaXNfZGV2XTsKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWlmIChkb19uZTJfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X25lW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwppbmRleCBhMWE2YzA4Li5mMWMwMWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L25lMmstcGNpLmMKQEAgLTY2MCw2ICs2NjAsNyBAQAogCiAJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKIAogCXJldHVybiAwOwpAQCAtNjcxLDYgKzY3Miw4IEBACiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCU5TODM5MF9pbml0KGRldiwgMSk7CiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKaW5kZXggYzMzNmI0Ni4uZTY0ZGY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpAQCAtMTAxLDYgKzEwMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTczLDcgKzU3NCw3IEBACiAKIAlkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSA9IChuZXh0X2VtcHR5ICsgMSkgJSBOUl9SWF9ERVNDOwogCWNtZHN0cyA9IFJFQUxfUlhfQlVGX1NJWkUgfCBDTURTVFNfSU5UUjsKLQlidWYgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwlidWYgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCSAgICAgUkVBTF9SWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAlidWlsZF9yeF9kZXNjKGRldiwgc2csIDAsIGJ1ZiwgY21kc3RzLCAwKTsKIAkvKiB1cGRhdGUgbGluayBvZiBwcmV2aW91cyByeCAqLwpAQCAtNjAzLDcgKzYwNCw3IEBACiAJCWlmICh1bmxpa2VseSghc2tiKSkKIAkJCWJyZWFrOwogCi0JCXJlcyA9IChsb25nKXNrYi0+dGFpbCAmIDB4ZjsKKwkJcmVzID0gKGxvbmcpc2tiLT5kYXRhICYgMHhmOwogCQlyZXMgPSAweDEwIC0gcmVzOwogCQlyZXMgJj0gMHhmOwogCQlza2JfcmVzZXJ2ZShza2IsIHJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCmluZGV4IGM2ZThiMjVmLi43MWZkNDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwpAQCAtODYsNyArODYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMzEyLDExICszMTEsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGM1NzRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0xMjg2LDEzICsxMjgwLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB0YzU3NF9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDU3NCksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgwLCAweDAxMDEsIDB4MDU1NiwgIjNDQ0ZFTTU1Ni5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHRjNTc0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB0YzU3NF9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICIzYzU3NF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHRjNTc0X2F0dGFjaCwKKwkuZXZlbnQJCT0gdGM1NzRfZXZlbnQsCiAJLmRldGFjaAkJPSB0YzU3NF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gdGM1NzRfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF90YzU3NCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwppbmRleCA4OWFiZGRhLi5kODNmZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMjYsMTEgKzIyNSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ0YzU4OV9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTEwNTcsMTMgKzEwNTEsMjYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHRjNTg5X2lkc1tdID0geworCVBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMDEsIDB4MDU2MiksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEoMCwgIk1vdG9yb2xhIE1BUlFVSVMiLCAweGYwM2U0ZTc3KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDU4OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkZhcmFsbG9uIiwgIkVOZXQiLCAweDU4ZDkzZmM0LCAweDk5MmMyMjAyKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDAsIDB4MDEwMSwgMHgwMDM1LCAiM0NYRU01NTYuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgwLCAweDAxMDEsIDB4MDAzZCwgIjNDWEVNNTU2LmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgdGM1ODlfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHRjNTg5X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gIjNjNTg5X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gdGM1ODlfYXR0YWNoLAorCS5ldmVudAkJPSB0YzU4OV9ldmVudCwKIAkuZGV0YWNoCQk9IHRjNTg5X2RldGFjaCwKKyAgICAgICAgLmlkX3RhYmxlICAgICAgID0gdGM1ODlfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF90YzU4OSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwppbmRleCA4NTNiNTg2Li44YmI0ZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgIi4uLzgzOTAuaCIKIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTgxLDExICsxODAsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYXhuZXRfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC04NTAsMTMgKzg0NCw0MyBAQAogICAgIG91dHN3KG5pY19iYXNlICsgQVhORVRfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYXhuZXRfaWRzW10gPSB7CisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDE2YywgMHgwMDgxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxOGEsIDB4MDMwMSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjZmLCAweDAzMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzAzKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwOSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDExMDYpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4OGEwMSwgMHhjMWFiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjQoIkZhc3QgRXRoZXJuZXQiLCAiMTYtYml0IFBDIENhcmQiLCAiQVg4ODE5MCIsIDB4YjRiZTE0ZTMsIDB4OWExMmViNmEsIDB4YWI5YmU1ZWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBU0lYIiwgIkFYODgxOTAiLCAweDA5NTk4MjNiLCAweGFiOWJlNWVmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQmlsbGlvbnRvbiIsICJMTkEtMTAwQiIsIDB4NTUyYWI2ODIsIDB4YmMzYjg3ZTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDSEVFVEFIIEVUSEVSQ0FSRCIsICJFTjIyMjgiLCAweDAwZmE3YmM4LCAweDAwZTk5MGNjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ05ldCIsICJDTkYzMDEiLCAweGJjNDc3ZGRlLCAweDc4YzVmNDBiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAiY29yZWdhIEZFdGhlciBQQ0MtVFhEIiwgMHg1MjYxNDQwZiwgMHg0MzY3NjhjNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgImNvcmVnYSBGRXRoZXJJSSBQQ0MtVFhEIiwgMHg1MjYxNDQwZiwgMHg3MzBkZjcyZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkR5bmFsaW5rIiwgIkwxMDBDMTYiLCAweDU1NjMyZmQ1LCAweDY2YmMyYTkwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJFdGhlckZhc3QgMTAvMTAwIFBDIENhcmQgKFBDTVBDMTAwIFYzKSIsIDB4MDczM2NjODEsIDB4MjMyMDE5YTgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNRUxDTyIsICJMUEMzLVRYIiwgMHg0ODFlMDA5NCwgMHhmOTFhZjYwOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICIxMDBCQVNFIiwgMHgyODFmMWM1ZCwgMHg3YzJhZGQwNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGYXN0RXRoZXJDYXJkIiwgMHgyODFmMWM1ZCwgMHg3ZWYyNjExNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGRVA1MDEiLCAweDI4MWYxYzVkLCAweDJlMjcyMDU4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxNCgiTmV0d29yayBFdmVyeXdoZXJlIiwgIkFYODgxOTAiLCAweDgyMGE2N2I2LCAgMHhhYjliZTVlZiksCisJLyogdGhpcyBpcyBub3Qgc3BlY2lmaWMgZW5vdWdoICovCisJLyogUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjFiLCAweDAyMDIpLCAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgYXhuZXRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGF4bmV0X2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImF4bmV0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYXhuZXRfYXR0YWNoLAorCS5ldmVudAkJPSBheG5ldF9ldmVudCwKIAkuZGV0YWNoCQk9IGF4bmV0X2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBheG5ldF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2F4bmV0X2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCmluZGV4IDQyOTRlMWUuLmI5MzU1ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjAwLDExICsxOTksNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmY29tMjAwMjBfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC00ODMsNyArNDc3LDExIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGNvbTIwMDIwX2V2ZW50ICovCiAKLQorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGNvbTIwMDIwX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb250ZW1wb3JhcnkgQ29udHJvbCBTeXN0ZW1zLCBJbmMuIiwgIlBDTTIwIEFyY25ldCBBZGFwdGVyIiwgMHg1OTk5MTY2NiwgMHg5NWRmZmZhZiksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGNvbTIwMDIwX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBjb20yMDAyMF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtNDkxLDcgKzQ4OSw5IEBACiAJCS5uYW1lCT0gImNvbTIwMDIwX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gY29tMjAwMjBfYXR0YWNoLAorCS5ldmVudAkJPSBjb20yMDAyMF9ldmVudCwKIAkuZGV0YWNoCQk9IGNvbTIwMDIwX2RldGFjaCwKKwkuaWRfdGFibGUJPSBjb20yMDAyMF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2NvbTIwMDIwX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwppbmRleCAwNDI0ODY1Li45ZDgxOTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yODgsMTEgKzI4Nyw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZmbXZqMTh4X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDM1LDcgKzQyOSw5IEBACiAJCXBjbWNpYV9nZXRfc3RhdHVzKGhhbmRsZSwgJnN0YXR1cyk7CiAJCWlmIChzdGF0dXMuQ2FyZFN0YXRlICYgQ1NfRVZFTlRfM1ZDQVJEKQogCQkgICAgbGluay0+Y29uZi5WY2MgPSAzMzsgLyogaW5zZXJ0ZWQgaW4gMy4zViBzbG90ICovCi0JICAgIH0gZWxzZSBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX0dOMzQxMCkgeworCSAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19HTjM0MTAKKwkJCXx8IGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19OUDk2MTAKKwkJCXx8IGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19NTjMyMDApIHsKIAkJLyogTXVsdGlGdW5jdGlvbiBDYXJkICovCiAJCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IDB4ODAwOwogCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHg0NzsKQEAgLTc2NCwxMyArNzYwLDQwIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGZtdmoxOHhfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGZtdmoxOHhfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDA0LCAweDAwMDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFQUdMRSBUZWNobm9sb2d5IiwgIk5FMjAwIEVUSEVSTkVUIExBTiBNQkgxMDMwMiAwNCIsIDB4NTI4Yzg4YzQsIDB4NzRmOTFlNTkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFaWdlciBMYWJzLEluYyIsICJFUFgtMTBCVCBQQyBDYXJkIEV0aGVybmV0IDEwQlQiLCAweDUzYWY1NTZlLCAweDg3N2Y5OTIyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRWlnZXIgbGFicyxJbmMuIiwgIkVQWC0xMEJUIFBDIENhcmQgRXRoZXJuZXQgMTBCVCIsIDB4ZjQ3ZTZjNjYsIDB4ODc3Zjk5MjIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJGVUpJVFNVIiwgIkxBTiBDYXJkKEZNVi1KMTgyKSIsIDB4NmVlNWEzZDgsIDB4NWJhZjMxZGIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJGVUpJVFNVIiwgIk1CSDEwMzA4IiwgMHg2ZWU1YTNkOCwgMHgzZjA0ODc1ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkZVSklUU1UgVE9XQSIsICJMQTUwMSIsIDB4Yjg0NTExODgsIDB4MTI5MzliYTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJISVRBQ0hJIiwgIkhULTQ4NDAtMTEiLCAweGY0ZjQzOTQ5LCAweDc3MzkxMGY0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmV4dENvbUsuSy4iLCAiTkM1MzEwQiBWZXIxLjAgICAgICAgIiwgMHg4Y2VmNGQzYSwgMHgwNzVmYzdiNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5leHRDb21LLksuIiwgIk5DNTMxMCBWZXIxLjAgICAgICAgICIsIDB4OGNlZjRkM2EsIDB4YmNjZjQzZTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJSQVRPQyBTeXN0ZW0gSW5jLiIsICIxMEJBU0VfVCBDQVJEIFIyODAiLCAweDg1YzEwZTE3LCAweGQ5NDEzNjY2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVERLIiwgIkxBQy1DRDAyeCIsIDB4MWVhZTk0NzUsIDB4OGZhMGVlNzApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUREsiLCAiTEFDLUNGMDEwIiwgMHgxZWFlOTQ3NSwgMHg3NjgzYmM5YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiQ09OVEVDIENvLixMdGQuIiwgMHg1OGQ4ZmVlMiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiUENNQ0lBIExBTiBNQkgxMDMwNCAgRVMiLCAweDI1OTlmNDU0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJQQ01DSUEgTUJIMTAzMDIiLCAweDhmNDAwNWRhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJVQktLLFYyLjAiLCAweDkwODg4MDgwKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIlRESyIsICJHbG9iYWxOZXR3b3JrZXIgMzQxMC8zNDEyIiwgMHgxZWFlOTQ3NSwgMHhkOWE5M2JlZCksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEwNSwgMHgwZDBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTA1LCAweDBlMGEpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgZm12ajE4eF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgZm12ajE4eF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJmbXZqMTh4X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZm12ajE4eF9hdHRhY2gsCisJLmV2ZW50CQk9IGZtdmoxOHhfZXZlbnQsCiAJLmRldGFjaAkJPSBmbXZqMTh4X2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBmbXZqMTh4X2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfZm12ajE4eF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYwppbmRleCAzMTA3Y2NmLi5iNmMxNDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYwpAQCAtNTcsNyArNTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWJtdHIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTE5LDkgKzExOCw2IEBACiAKIHN0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKIAotZXh0ZXJuIGludCBpYm10cl9wcm9iZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIGlycXJldHVybl90IHRva19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogdHlwZWRlZiBzdHJ1Y3QgaWJtdHJfZGV2X3QgewpAQCAtMTkzLDExICsxODksNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaWJtdHJfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01MTEsMTMgKzUwMiwyMiBAQAogICAgIHJldHVybjsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGlibXRyX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIzQ29tIiwgIlRva2VuTGluayBWZWxvY2l0eSBQQyBDYXJkIiwgMHg0MTI0MGU1YiwgMHg4MmMzNzM0ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICJUT0tFTiBSSU5HIiwgMHhiNTY5YTZlNSwgMHhiZjhlZWQ0NyksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBpYm10cl9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgaWJtdHJfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiaWJtdHJfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBpYm10cl9hdHRhY2gsCisJLmV2ZW50CQk9IGlibXRyX2V2ZW50LAogCS5kZXRhY2gJCT0gaWJtdHJfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IGlibXRyX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaWJtdHJfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwppbmRleCA0NjAzODA3Li5kYmI5NDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC0xNDYsNyArMTQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtNTAyLDExICs1MDEsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbm1jbGFuX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTY3NSwxMyArMTY2OSwyMiBAQAogCiB9IC8qIHNldF9tdWx0aWNhc3RfbGlzdCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbm1jbGFuX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOZXcgTWVkaWEgQ29ycG9yYXRpb24iLCAiRXRoZXJuZXQiLCAweDA4NWE4NTBiLCAweDAwYjJlOTQxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUG9ydGFibGUgQWRkLW9ucyIsICJFdGhlcm5ldCIsIDB4MGViZjFkNjAsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgbm1jbGFuX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBubWNsYW5fY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAibm1jbGFuX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gbm1jbGFuX2F0dGFjaCwKKwkuZXZlbnQJCT0gbm1jbGFuX2V2ZW50LAogCS5kZXRhY2gJCT0gbm1jbGFuX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBubWNsYW5faWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9ubWNsYW5fY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggMTgxYjZlZC4uZTE2NjRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDwuLi9kcml2ZXJzL25ldC84MzkwLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTI3NiwxMSArMjc1LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnBjbmV0X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTE1NSwxMSArMTE0OSwxMyBAQAogc3RhdGljIGlycXJldHVybl90IGVpX2lycV93cmFwcGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKLSAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBwY25ldF9kZXZfdCAqaW5mbzsKICAgICBpcnFyZXR1cm5fdCByZXQgPSBlaV9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOwogCi0gICAgaWYgKHJldCA9PSBJUlFfSEFORExFRCkKKyAgICBpZiAocmV0ID09IElSUV9IQU5ETEVEKSB7CisJICAgIGluZm8gPSBQUklWKGRldik7CiAJICAgIGluZm8tPnN0YWxlID0gMDsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1MCw3ICsxMzQ2LDcgQEAKICAgICBpZiAoY291bnQgJiAweDAxKQogCWJ1Zltjb3VudC0xXSA9IGluYihuaWNfYmFzZSArIFBDTkVUX0RBVEFQT1JUKSwgeGZlcl9jb3VudCsrOwogCi0gICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKyAgICAvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZSBiZWVuCiAgICAgICAgZW5jb3VudGVyaW5nIHByb2JsZW1zIHRoYXQgaXQgaXMgc3RpbGwgaGVyZS4gKi8KICNpZmRlZiBQQ01DSUFfREVCVUcKICAgICBpZiAoZWlfZGVidWcgPiA0KSB7CQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLwpAQCAtMTQyNCw3ICsxNDIwLDcgQEAKICAgICBkbWFfc3RhcnQgPSBqaWZmaWVzOwogCiAjaWZkZWYgUENNQ0lBX0RFQlVHCi0gICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKyAgICAvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZSBiZWVuCiAgICAgICAgZW5jb3VudGVyaW5nIHByb2JsZW1zIHRoYXQgaXQgaXMgc3RpbGwgaGVyZS4gKi8KICAgICBpZiAoZWlfZGVidWcgPiA0KSB7CS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCiAJaW50IGFkZHIsIHRyaWVzID0gMjA7CkBAIC0xNjM1LDEzICsxNjMxLDIxNyBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHBjbmV0X2lkc1tdID0geworCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAwNTcsIDB4MDAyMSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEwNCwgMHgwMDBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTA1LCAweGVhMTUpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNDMsIDB4MzM0MSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDE0MywgMHhjMGFiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMjFiLCAweDAxMDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDA4YTEsIDB4YzBhYiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJBbnlDb20iLCAiRmFzdCBFdGhlcm5ldCAiLCAweDU3OGJhNmU3LCAweDAyZDkyZDFlKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIkQtTGluayIsICJETUUzMzZUIiwgMHgxYTQyNGExYywgMHhiMjM4OTdmZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJHcmV5IENlbGwiLCAiR0NTMzAwMCIsIDB4MmExNTFmYWMsIDB4NDhiOTMyYWUpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiTGlua3N5cyIsICJFdGhlckZhc3QgMTAmMTAwICsgNTZLIFBDIENhcmQgKFBDTUxNNTYpIiwgMHgwNzMzY2M4MSwgMHhiMzc2NTAzMyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJMSU5LU1lTIiwgIlBDTUxNMzM2IiwgMHhmN2NiMGIwNywgMHg3YTgyMWI1OCksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJQQ01DSUFzIiwgIkNvbWJvQ2FyZCIsIDB4ZGNmZTEyZDMsIDB4Y2Q4OTA2Y2MpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiUENNQ0lBcyIsICJMYW5Nb2RlbSIsIDB4ZGNmZTEyZDMsIDB4YzY3YzY0OGYpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigwLCAiSUJNIiwgIkhvbWUgYW5kIEF3YXkgMjguOCBQQyBDYXJkICAgICAgICIsIDB4YjU2OWE2ZTUsIDB4NWJkNGZmMmMpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigwLCAiSUJNIiwgIkhvbWUgYW5kIEF3YXkgQ3JlZGl0IENhcmQgQWRhcHRlciIsIDB4YjU2OWE2ZTUsIDB4NGJkZjE1YzMpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigwLCAiSUJNIiwgInc5NSBIb21lIGFuZCBBd2F5IENyZWRpdCBDYXJkICIsIDB4YjU2OWE2ZTUsIDB4YWU5MTFjMTUpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMjMoMCwgIkFQRVggREFUQSIsICJNVUxUSUNBUkQiLCAiRVRIRVJORVQtTU9ERU0iLCAweDExYzJkYTA5LCAweDcyODlkYzVkLCAweGFhZDk1ZTFmKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMigwLCAiRkFYL01vZGVtL0V0aGVybmV0IENvbWJvIENhcmQgIiwgMHgxZWQ1OTMwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDU3LCAweDEwMDQpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwNCwgMHgwMDBkKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDQsIDB4MDA3NSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA0LCAweDAxNDUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE0OSwgMHgwMjMwKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNDksIDB4NDUzMCksCisvKglQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNDksIDB4YzFhYiksIGNvbmZsaWN0IHdpdGggYXhuZXRfY3MgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxODYsIDB4MDExMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWJmLCAweDIzMjgpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFiZiwgMHg4MDQxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyMTMsIDB4MjQ1MiksCisvKglQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyMWIsIDB4MDIwMiksIGNvbmZsaWN0IHdpdGggYXhuZXRfY3MgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjZmLCAweDAzMDcpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzBhKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTEwMyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDExMjEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIyNDA4TEFOIiwgIkV0aGVybmV0IiwgMHgzNTJmZmY3ZiwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJDYXJkd2VsbCIsICJQQ01DSUEiLCAiRVRIRVJORVQiLCAweDk1MzM2NzJlLCAweDI4MWYxYzVkLCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkNOZXQgICIsICJDTjMwQkMiLCAiRVRIRVJORVQiLCAweDlmZTU1ZDNkLCAweDg1NjAxMTk4LCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkRpZ2l0YWwiLCAiRXRoZXJuZXQiLCAiQWRhcHRlciIsIDB4OTk5OWFiMzUsIDB4MDBiMmU5NDEsIDB4NGIwZDgyOWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiRWRpbWF4IFRlY2hub2xvZ3kgSW5jLiIsICJQQ01DSUEiLCAiRXRoZXJuZXQgQ2FyZCIsIDB4NzM4YTAwMTksIDB4MjgxZjFjNWQsIDB4NWU5ZDkyYzApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiRUZBICAgIiwgIkVGQTIwNyIsICJFVEhFUk5FVCIsIDB4M2QyOTRiZTQsIDB4ZWI5YWFiNmMsIDB4M2ZmNzE3NWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiSS1PIERBVEEiLCAiUENMQSIsICJFVEhFUk5FVCIsIDB4MWQ1NWQ3ZWMsIDB4ZTRjNjRkMzQsIDB4M2ZmNzE3NWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiSU8gREFUQSIsICJQQ0xBVEUiLCAiRVRIRVJORVQiLCAweDU0N2U2NmRjLCAweDZiMjYwNzUzLCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIktpbmdNYXggVGVjaG5vbG9neSBJbmMuIiwgIkVOMTAtVDIiLCAiUENNQ0lBIEV0aGVybmV0IENhcmQiLCAweDkzMmI3MTg5LCAweDY5OWU0NDM2LCAweDZmNjY1MmUwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlBDTUNJQSIsICJQQ01DSUEtRVRIRVJORVQtQ0FSRCIsICJVRTIyMTYiLCAweDI4MWYxYzVkLCAweGQ0Y2QyZjIwLCAweGI4N2FkZDgyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlBDTUNJQSIsICJQQ01DSUEtRVRIRVJORVQtQ0FSRCIsICJVRTI2MjAiLCAweDI4MWYxYzVkLCAweGQ0Y2QyZjIwLCAweDdkM2Q4M2E4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCIyNDEyTEFOIiwgMHg2N2YyMzZhYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFDQ1RPTiIsICJFTjIyMTIiLCAweGRmYzZiNWIyLCAweGNiMTEyYTExKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQUNDVE9OIiwgIkVOMjIxNi1QQ01DSUEtRVRIRVJORVQiLCAweGRmYzZiNWIyLCAweDU1NDJiZmZmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQWxsaWVkIFRlbGVzaXMsIEsuSy4iLCAiQ2VudHJlQ09NIExBMTAwLVBDTS1UIFYyIDEwMC8xME0gTEFOIFBDIENhcmQiLCAweGJiN2ZiZGQ3LCAweGNkOTFjYzY4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQWxsaWVkIFRlbGVzaXMsIEsuSy4iLCAiQ2VudHJlQ09NIExBLVBDTSIsIDB4YmI3ZmJkZDcsIDB4NWJhMTBkNDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbGxpZWQgVGVsZXNpcyBLLksuIiwgIkxBMTAwLVBDTSBWMiIsIDB4MzY2MzRhNjYsIDB4YzZkMDU5OTcpLAorICAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFsbGllZCBUZWxlc2lzLCBLLksuIiwgIkNlbnRyZUNPTSBMQS1QQ01fVjIiLCAweGJiN2ZCZGQ3LCAweDI4ZTI5OWY4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQWxsaWVkIFRlbGVzaXMgSy5LLiIsICJMQS1QQ00gVjMiLCAweDM2NjM0YTY2LCAweDYyMjQxZDk2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQW1iaUNvbSIsICJBTUI4MDEwIiwgMHg1MDcwYTdmOSwgMHg4MmY5NmU5NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFtYmlDb20iLCAiQU1CODYxMCIsIDB4NTA3MGE3ZjksIDB4ODY3NDEyMjQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbWJpQ29tIEluYyIsICJBTUI4MDAyIiwgMHg5M2IxNTU3MCwgMHg3NWVjM2VmYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFtYmlDb20gSW5jIiwgIkFNQjgwMDJUIiwgMHg5M2IxNTU3MCwgMHg0NjFjNTI0NyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFtYmlDb20gSW5jIiwgIkFNQjgwMTAiLCAweDkzYjE1NTcwLCAweDgyZjk2ZTk2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQW55Q29tIiwgIkVDTyBFdGhlcm5ldCIsIDB4NTc4YmE2ZTcsIDB4MGE5ODg4YzEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbnlDb20iLCAiRUNPIEV0aGVybmV0IDEwLzEwMCIsIDB4NTc4YmE2ZTcsIDB4OTM5ZmVkYmQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBUk9XQU5BIiwgIlBDTUNJQSBFdGhlcm5ldCBMQU4gQ2FyZCIsIDB4MzEzYWRiYzgsIDB4MDhkOWYxOTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBU0FOVEUiLCAiRnJpZW5kbHlOZXQgUEMgQ2FyZCIsIDB4M2E3YWRlMGYsIDB4NDFjNjQ1MDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCaWxsaW9udG9uIiwgIkxOVC0xMFRCIiwgMHg1NTJhYjY4MiwgMHhlZWIxYmE2YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNGIiwgIjEwQmFzZS1FdGhlcm5ldCIsIDB4NDRlYmY4NjMsIDB4OTNhZTRkNzkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDTmV0IiwgIkNONDBCQyBFdGhlcm5ldCIsIDB4YmM0NzdkZGUsIDB4ZmJhNzc1YTcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDT01QVS1TSEFDSyIsICJCQVNFbGluZSBQQ01DSUEgMTAgTUJpdCBFdGhlcm5ldGFkYXB0ZXIiLCAweGZhMmU0MjRkLCAweGU5MTkwZDhhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ09NUFUtU0hBQ0siLCAiRkFTVGxpbmUgUENNQ0lBIDEwLzEwMCBGYXN0LUV0aGVybmV0IiwgMHhmYTJlNDI0ZCwgMHgzOTUzZDliOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNPTlRFQyIsICJDLU5FVChQQylDLTEwTCIsIDB4MjFjYWI1NTIsIDB4ZjZmOTA3MjIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EiLCAiRkV0aGVyIFBDQy1UWEYiLCAweDBhMjE1MDFhLCAweGE1MTU2NGEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAiY29yZWdhIEV0aGVySUkgUENDLVQiLCAweDUyNjE0NDBmLCAweGZhOWQ4NWJkKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29yZWdhIEsuSy4iLCAiY29yZWdhIEV0aGVySUkgUENDLVREIiwgMHhkNGZkY2JkOCwgMHhjNDliZDczZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgImNvcmVnYSBFdGhlciBQQ0MtVCIsIDB4NTI2MTQ0MGYsIDB4NjcwNWZjYWEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICJjb3JlZ2EgRmFzdEV0aGVyIFBDQy1UWCIsIDB4NTI2MTQ0MGYsIDB4NDg1ZTg1ZDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb3JlZ2EsSy5LLiIsICJFdGhlcm5ldCBMQU4gQ2FyZCIsIDB4MTEwZDI2ZDksIDB4OWZkMmYwYTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EsSy5LLiIsICJFdGhlcm5ldCBMQU4gQ2FyZCIsIDB4OTc5MWE5MGUsIDB4OWZkMmYwYTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb3VwbGVybGVzc1BDTUNJQSIsICIxMDBCQVNFIiwgMHhlZTVhZjBhZCwgMHg3YzJhZGQwNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkN5USd2ZSIsICJFTEEtMDEwIiwgMHg3NzAwODk3OSwgMHg5ZDhkNDQ1ZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkN5USd2ZSIsICJFTEEtMTEwRSAxMC8xMDBNIExBTiBDYXJkIiwgMHg3NzAwODk3OSwgMHhmZDE4NDgxNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRhdGFUcmVrLiIsICJOZXRDYXJkICIsIDB4NWNkNjZkOWQsIDB4ODQ2OTdjZTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEYXluYSBDb21tdW5pY2F0aW9ucywgSW5jLiIsICJDb21tdW5pQ2FyZCBFIiwgMHgwYzYyOTMyNSwgMHhiNGU3ZGJhZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRpZ2ljb20iLCAiUGFsbGFkaW8gTEFOIDEwLzEwMCIsIDB4Njk3NDAzZDgsIDB4ZTE2MGI5OTUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEaWdpY29tIiwgIlBhbGxhZGlvIExBTiAxMC8xMDAgRG9uZ2xlc3MiLCAweDY5NzQwM2Q4LCAweGE2ZDNiMjMzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRElHSVRBTCIsICJERVBDTS1YWCIsIDB4Njk2MTZjYjMsIDB4ZTYwMGU3NmUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJELUxpbmsiLCAiREUtNjUwIiwgMHgxYTQyNGExYywgMHhmMjhjODM5OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkQtTGluayIsICJERS02NjAiLCAweDFhNDI0YTFjLCAweGQ5YTFkMDViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRC1MaW5rIiwgIkRGRS02NTAiLCAweDFhNDI0YTFjLCAweDBmMDA3M2Y5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRHVhbCBTcGVlZCIsICIxMC8xMDAgUEMgQ2FyZCIsIDB4NzI1Yjg0MmQsIDB4ZjFlZmVlODQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEdWFsIFNwZWVkIiwgIjEwLzEwMCBQb3J0IEF0dGFjaGVkIFBDIENhcmQiLCAweDcyNWI4NDJkLCAweDJkYjFmOGU5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRHluYWxpbmsiLCAiTDEwQkMiLCAweDU1NjMyZmQ1LCAweGRjNjVmMmIxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRFlOQUxJTksiLCAiTDEwQkMiLCAweDZhMjZkMWNmLCAweGRjNjVmMmIxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRFlOQUxJTksiLCAiTDEwQyIsIDB4NmEyNmQxY2YsIDB4YzRmODRlZmIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFLUNBUkQiLCAiRS1DQVJEIiwgMHg2NzAxZGExMSwgMHg2NzAxZGExMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVJR0VSIExhYnMgSW5jLiIsICJFdGhlcm5ldCAxMEJhc2VUIGNhcmQiLCAweDUzYzg2NGM2LCAweGVkZDA1OWY2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUlHRVIgTGFicyBJbmMuIiwgIkV0aGVybmV0IENvbWJvIGNhcmQiLCAweDUzYzg2NGM2LCAweDkyOWM0ODZjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRXRoZXJuZXQiLCAiQWRhcHRlciIsIDB4MDBiMmU5NDEsIDB4NGIwZDgyOWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFdGhlcm5ldCBBZGFwdGVyIiwgIkUyMDAwIFBDTUNJQSBFdGhlcm5ldCIsIDB4OTY3NjczMDEsIDB4NzFmYmJjNjEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFdGhlcm5ldCBQQ01DSUEgYWRhcHRlciIsICJFUC0yMTAiLCAweDhkZDg2MTgxLCAweGYyYjUyNTE3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRmFzdCBFdGhlcm5ldCIsICJBZGFwdGVyIiwgMHhiNGJlMTRlMywgMHg0YjBkODI5ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkdyZXkgQ2VsbCIsICJHQ1MyMDAwIiwgMHgyYTE1MWZhYywgMHhmMDA1NTVjYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkdyZXkgQ2VsbCIsICJHQ1MyMjIwIiwgMHgyYTE1MWZhYywgMHhjMWI3ZTMyNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkdWQyIsICJOSUMtMjAwMHAiLCAweDc2ZTE3MWJkLCAweDZlYjFjOTQ3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSUJNIENvcnAuIiwgIkV0aGVybmV0IiwgMHhlMzczNmM4OCwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklDLUNBUkQiLCAiSUMtQ0FSRCIsIDB4NjBjYjA5YTYsIDB4NjBjYjA5YTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJTyBEQVRBIiwgIlBDRVRUWCIsIDB4NTQ3ZTY2ZGMsIDB4NmZjNTQ1OWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJpUG9ydCIsICIxMC8xMDAgRXRoZXJuZXQgQ2FyZCIsIDB4NTZjNTM4ZDIsIDB4MTFiMGZmYzApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLQU5TQUkgRUxFQ1RSSUMgQ08uLExURCIsICJLTEEtUENNL1QiLCAweGIxOGRjM2I0LCAweGNjNTFhOTU2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS0NJIiwgIlBFNTIwIFBDTUNJQSBFdGhlcm5ldCBBZGFwdGVyIiwgMHhhODliODdkMywgMHgxZWI4OGU2NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktJTkdNQVgiLCAiRU4xMFQyVCIsIDB4N2JjYjQ1OWEsIDB4YTVjODFmYTUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLaW5nc3RvbiIsICJLTkUtUEMyIiwgMHgxMTI4ZTYzMywgMHhjZTJhODliMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktpbmdzdG9uIFRlY2hub2xvZ3kgQ29ycC4iLCAiRXRoZVJ4IFBDIENhcmQgRXRoZXJuZXQgQWRhcHRlciIsIDB4MzEzYzdiZTMsIDB4MGFmYjU0YTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMYW5lZWQiLCAiTEQtMTAvMTAwQ0QiLCAweDFiNzgyN2IyLCAweGNkYTcxZDFjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGFuZWVkIiwgIkxELUNERiIsIDB4MWI3ODI3YjIsIDB4ZmVjNzFlNDApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMYW5lZWQiLCAiTEQtQ0RML1QiLCAweDFiNzgyN2IyLCAweDc5ZmJhNGY3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGFuZWVkIiwgIkxELUNEUyIsIDB4MWI3ODI3YjIsIDB4OTMxYWZhYWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIkNvbWJvIFBDTUNJQSBFdGhlcm5ldENhcmQgKEVDMlQpIiwgMHgwNzMzY2M4MSwgMHgzMmVlOGM3OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxJTktTWVMiLCAiRS1DQVJEIiwgMHhmN2NiMGIwNywgMHg2NzAxZGExMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiRXRoZXJGYXN0IDEwLzEwMCBJbnRlZ3JhdGVkIFBDIENhcmQgKFBDTTEwMCkiLCAweDA3MzNjYzgxLCAweDQ1M2MzZjlkKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJFdGhlckZhc3QgMTAvMTAwIFBDIENhcmQgKFBDTVBDMTAwKSIsIDB4MDczM2NjODEsIDB4NjZjNWEzODkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIkV0aGVyRmFzdCAxMC8xMDAgUEMgQ2FyZCAoUENNUEMxMDAgVjIpIiwgMHgwNzMzY2M4MSwgMHgzYTNiMjhlOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiSG9tZUxpbmsgUGhvbmVsaW5lICIsIDB4MDczM2NjODEsIDB4NWUwN2NmYTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMb2dpdGVjIiwgIkxQTS1MTjEwMFRYIiwgMHg4OGZjZGVkYSwgMHg2ZDc3MjczNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxvZ2l0ZWMiLCAiTFBNLUxOMjBUIiwgMHg4OGZjZGVkYSwgMHg4MTA5MDkyMiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxPTkdTSElORSIsICJQQ01DSUEgRXRoZXJuZXQgQ2FyZCIsIDB4Zjg2NmIwYjAsIDB4NmY2NjUyZTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNQUNOSUNBIiwgIk1FMS1KRUlEQSIsIDB4MjA4NDFiNjgsIDB4YWY4YTM1NzgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNYWNzZW5zZSIsICJNUEMtMTAiLCAweGQ4MzAyOTdmLCAweGQyNjVjMzA3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLixMVEQuIiwgIkNGLVZFTDIxMSIsIDB4NDQ0NDUzNzYsIDB4OGRlZDQxZDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNQVhURUNIIiwgIlBDTjIwMDAiLCAweDc4ZDY0YmMwLCAweGNhMGNhNGI4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUVMQ08iLCAiTFBDMi1UIiwgMHg0ODFlMDA5NCwgMHhhMmViMGNmMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1FTENPIiwgIkxQQzItVFgiLCAweDQ4MWUwMDk0LCAweDQxYTY5MTZjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTWljcm9jb20gQy5FLiIsICJUcmF2ZWwgQ2FyZCBMQU4gMTAvMTAwIiwgMHg0YjkxY2VjNywgMHhlNzAyMjBkNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1pY3JvZHluZSIsICJORTQyMDAiLCAweDJlNmRhNTliLCAweDA0NzhlNDcyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUlET1JJIEVMRUMuIiwgIkxULVBDTVQiLCAweDY0OGQ1NWMxLCAweGJkZTUyNmM3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciIsICJJbmZvTW92ZXIgNDEwMCIsIDB4MzZlMTE5MWYsIDB4NjBjMjI5YjkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOYXRpb25hbCBTZW1pY29uZHVjdG9yIiwgIkluZm9Nb3ZlciBORTQxMDAiLCAweDM2ZTExOTFmLCAweGE2NjE3ZWM4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTkVDIiwgIlBDLTk4MDFOLUoxMiIsIDB4MThkZjBiYTAsIDB4YmM5MTJkNzYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJORVRHRUFSIiwgIkZBNDEwVFgiLCAweDlhYTc5ZGMzLCAweDYwZTViYzBlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTkVUR0VBUiIsICJGQTQxMSIsIDB4OWFhNzlkYzMsIDB4NDBmYWQ4NzUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOZXR3b3JrIEV2ZXJ5d2hlcmUiLCAiRmFzdCBFdGhlcm5ldCAxMC8xMDAgUEMgQ2FyZCIsIDB4ODIwYTY3YjYsIDB4MzFlZDFhNWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOZXh0Q29tIEsuSy4iLCAiTmV4dCBIYXdrIiwgMHhhZWRhZWM3NCwgMHhhZDA1MGVmMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICIxMC8xMDBNYnBzIEV0aGVybmV0IENhcmQiLCAweDI4MWYxYzVkLCAweDZlNDE3NzNiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkV0aGVybmV0IiwgMHgyODFmMWM1ZCwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJFVEhFUk5FVCIsIDB4MjgxZjFjNWQsIDB4M2ZmNzE3NWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRXRoZXJuZXQgMTBCYXNlVCBDYXJkIiwgMHgyODFmMWM1ZCwgMHg0ZGUyZjZjOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJFdGhlcm5ldCBDYXJkIiwgMHgyODFmMWM1ZCwgMHg1ZTlkOTJjMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJFdGhlcm5ldCBDb21ibyBjYXJkIiwgMHgyODFmMWM1ZCwgMHg5MjljNDg2YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJFVEhFUk5FVCBWMS4wIiwgMHgyODFmMWM1ZCwgMHg0ZDg4MTdjOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGYXN0RXRoZXJuZXQiLCAweDI4MWYxYzVkLCAweGZlODcxZWViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkZhc3QtRXRoZXJuZXQiLCAweDI4MWYxYzVkLCAweDQ1ZjFmM2I0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkZBU1QgRVRIRVJORVQgQ0FSRCIsIDB4MjgxZjFjNWQsIDB4ZWM1ZGJjYTcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEgTEFOIiwgIkV0aGVybmV0IiwgMHg3NTAwZTI0NiwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJMTlQtMTBUTiIsIDB4MjgxZjFjNWQsIDB4ZTcwN2Y2NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUFzIiwgIkNvbWJvQ2FyZCIsIDB4ZGNmZTEyZDMsIDB4Y2Q4OTA2Y2MpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiVUUyMjEyIiwgMHgyODFmMWM1ZCwgMHhiZjE3MTk5YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICIgICAgRXRoZXJuZXQgTkUyMDAwIENvbXBhdGlibGUiLCAweDI4MWYxYzVkLCAweDQyZDVkN2UxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUFJFVEVDIiwgIkV0aGVybmV0IENvbXBhY3RMQU4gMTBiYXNlVCAzLjNWIiwgMHhlYmY5MTE1NSwgMHgzMDA3NGM4MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBSRVRFQyIsICJFdGhlcm5ldCBDb21wYWN0TEFOIDEwQmFzZVQgMy4zViIsIDB4ZWJmOTExNTUsIDB4N2Y1YTRmNTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQc2lvbiBEYWNvbSIsICJHb2xkIENhcmQgRXRoZXJuZXQiLCAweGY1ZjAyNWMyLCAweDNhMzBlMTEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiPVJFTElBPT0iLCAiRXRoZXJuZXQiLCAweGNkZDA2NDRhLCAweDAwYjJlOTQxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUlAiLCAiMTYyNUIgRXRoZXJuZXQgTkUyMDAwIENvbXBhdGlibGUiLCAweGUzZTY2ZTIyLCAweGI5NjE1MGRmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUlBUSSIsICJFUDQwMCBFdGhlcm5ldCBORTIwMDAgQ29tcGF0aWJsZSIsIDB4ZGM2Zjg4ZmQsIDB4NGE3ZTJhZTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJSUFRJIiwgIkVQNDAxIEV0aGVybmV0IE5FMjAwMCBDb21wYXRpYmxlIiwgMHhkYzZmODhmZCwgMHg0YmNiZDdmZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlJQVEkgTFRELiIsICJFUDQwMCIsIDB4YzUzYWM1MTUsIDB4ODFlMzkzODgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTQ00iLCAiRXRoZXJuZXQgQ29tYm8gY2FyZCIsIDB4YmRjM2IxMDIsIDB4OTI5YzQ4NmMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTZWlrbyBFcHNvbiBDb3JwLiIsICJFdGhlcm5ldCIsIDB4MDk5Mjg3MzAsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUMiLCAiRVpDYXJkLTEwLVBDTUNJQSIsIDB4YzRmOGIxOGIsIDB4ZmIyMWQyNjUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTb2NrZXQgQ29tbXVuaWNhdGlvbnMgSW5jIiwgIlNvY2tldCBFQSBQQ01DSUEgTEFOIEFkYXB0ZXIgUmV2aXNpb24gRCIsIDB4YzcwYTQ3NjAsIDB4MmFkZTQ4M2UpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTb2NrZXQgQ29tbXVuaWNhdGlvbnMgSW5jIiwgIlNvY2tldCBFQSBQQ01DSUEgTEFOIEFkYXB0ZXIgUmV2aXNpb24gRSIsIDB4YzcwYTQ3NjAsIDB4NWRkOTc4YTgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUREsiLCAiTEFLLUNEMDMxIGZvciBQQ01DSUEiLCAweDFlYWU5NDc1LCAweDBlZDM4NmZhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVGVsZWNvbSBEZXZpY2UgSy5LLiIsICJTdXBlclNvY2tldCBSRTQ1MFQiLCAweDQ2NmIwNWYwLCAweDhiNzRiYzRmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVGVsZWNvbSBEZXZpY2UgSy5LLiIsICJTdXBlclNvY2tldCBSRTU1MFQiLCAweDQ2NmIwNWYwLCAweDMzYzhkYjJhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiSHlwZXJ0ZWMiLCAgIkVQNDAxIiwgMHg4Nzg3YmVjNywgMHhmNmU0YTMxZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIktpbmdNYXggVGVjaG5vbG9neSBJbmMuIiwgIkV0aGVybmV0IENhcmQiLCAweDkzMmI3MTg5LCAweDVlOWQ5MmMwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiTE9OR1NISU5FIiwgIkVQNDAxIiwgMHhmODY2YjBiMCwgMHhmNmU0YTMxZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIlhpcmNvbSIsICJDRkUtMTAiLCAweDJlM2VlODQ1LCAweDIyYTQ5Zjg5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJDeVEndmUgMTAgQmFzZS1UIExBTiBDQVJEIiwgMHg5NGZhZjM2MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiRVAtMjEwIFBDTUNJQSBMQU4gQ0FSRC4iLCAweDg4NTBiNGRlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJFVEhFUi1DMTYiLCAweDA2YTg1MTRmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJJQy1DQVJEIiwgMHg2MGNiMDlhNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiTkUyMDAwIENvbXBhdGlibGUiLCAweDc1YjhhZDVhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQyKCJFTi02MjAwUDIiLCAweGE5OTZkMDc4KSwKKwkvKiB0b28gZ2VuZXJpYyEgKi8KKwkvKiBQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIjEwLzEwMCBFdGhlcm5ldCBDYXJkIiwgMHgyODFmMWM1ZCwgMHgxMWIwZmZjMCksICovCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigwLCAiUENNQ0lBIiwgIkVOMjIxOC1MQU4vTU9ERU0iLCAweDI4MWYxYzVkLCAweDU3MGYzNDhlLCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDAsICJQQ01DSUEiLCAiVUUyMjE4LUxBTi9NT0RFTSIsIDB4MjgxZjFjNWQsIDB4NmZkY2FjZWUsICJQQ01MTTI4LmNpcyIpLAorCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIlBzaW9uIERhY29tIiwgIkdvbGQgQ2FyZCBWMzQgRXRoZXJuZXQiLCAweGY1ZjAyNWMyLCAweDMzOGU4MTU1LCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDAsICJQc2lvbiBEYWNvbSIsICJHb2xkIENhcmQgVjM0IEV0aGVybmV0IEdTTSIsIDB4ZjVmMDI1YzIsIDB4NGFlODVkMzUsICJQQ01MTTI4LmNpcyIpLAorCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIkxJTktTWVMiLCAiUENNTE0yOCIsIDB4ZjdjYjBiMDcsIDB4NjY4ODE4NzQsICJQQ01MTTI4LmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIkRBWU5BIENPTU1VTklDQVRJT05TIiwgIkxBTiBBTkQgTU9ERU0gTVVMVElGVU5DVElPTiIsIDB4OGZkZjhmODksIDB4ZGQ1ZWQ5ZTgsICJEUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lENCgwLCAiTlNDIE1GIExBTi9Nb2RlbSIsIDB4NThmYzYwNTYsICJEUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMCwgMHgwMTc1LCAweDAwMDAsICJEUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgweGMwMGYsIDB4MDAwMiwgIkxBLVBDTS5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIktUSSIsICJQRTUyMCBQTFVTIiwgMHhhZDE4MDM0NSwgMHg5ZDU4ZDM5MiwgIlBFNTIwLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiTkRDIiwgIkV0aGVybmV0IiwgMHgwMWM0M2FlMSwgMHgwMGIyZTk0MSwgIk5FMksuY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJQTVggICAiLCAiUEUtMjAwIiwgMHgzNGYzZjFjOCwgMHgxMGI1OWY4YywgIlBFLTIwMC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIlRBTUFSQUNLIiwgIkV0aGVybmV0IiwgMHhjZjQzNGZiYSwgMHgwMGIyZTk0MSwgInRhbWFyYWNrLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBwY25ldF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcGNuZXRfZHJpdmVyID0gewogCS5kcnYJCT0gewogCQkubmFtZQk9ICJwY25ldF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHBjbmV0X2F0dGFjaCwKKwkuZXZlbnQJCT0gcGNuZXRfZXZlbnQsCiAJLmRldGFjaAkJPSBwY25ldF9kZXRhY2gsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZF90YWJsZQk9IHBjbmV0X2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGNuZXRfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKaW5kZXggODVhMTUyMS4uMGQ4YmI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTQxLDggKzQxLDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMjcsNiArMTI3LDEyIEBACiAgICAgaW50CQkJCXJ4X292cm47CiB9OwogCitzdHJ1Y3Qgc21jX2NmZ19tZW0geworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X2NoYXIgYnVmWzI1NV07Cit9OworCiAvKiBTcGVjaWFsIGRlZmluaXRpb25zIGZvciBNZWdhaGVydHogbXVsdGlmdW5jdGlvbiBjYXJkcyAqLwogI2RlZmluZSBNRUdBSEVSVFpfSVNSCQkweDAzODAKIApAQCAtMzY0LDEwICszNzAsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNtYzkxYzkyX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDk4LDE0ICs1MDAsMjQgQEAKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwotICAgIHVfY2hhciBidWZbMjU1XTsKLSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OworICAgIHN0cnVjdCBzbWNfY2ZnX21lbSAqY2ZnX21lbTsKKyAgICB0dXBsZV90ICp0dXBsZTsKKyAgICBjaXNwYXJzZV90ICpwYXJzZTsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZjsKKyAgICB1X2NoYXIgKmJ1ZjsKICAgICB3aW5fcmVxX3QgcmVxOwogICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaSwgazsKIAorICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWNmZ19tZW0pCisgICAgICAgIHJldHVybiBDU19PVVRfT0ZfUkVTT1VSQ0U7CisKKyAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKKyAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKKyAgICBjZiA9ICZwYXJzZS0+Y2Z0YWJsZV9lbnRyeTsKKyAgICBidWYgPSBjZmdfbWVtLT5idWY7CisKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwogICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KQEAgLTUxNCwxMiArNTI2LDEyIEBACiAgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKICAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSA4OwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKIAotICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICBpID0gZmlyc3RfdHVwbGUobGluay0+aGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIC8qIFRoZSBNZWdhaGVydHogY29tYm8gY2FyZHMgaGF2ZSBtb2RlbS1saWtlIENJUyBlbnRyaWVzLCBzbwogICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0cnkgYSBidW5jaCBvZiBwb3J0IGNvbWJpbmF0aW9ucy4gKi8KICAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7CkBAIC01MzIsMTAgKzU0NCwxMCBAQAogCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKIAl9CiAJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JaSA9IG5leHRfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisJaSA9IG5leHRfdHVwbGUobGluay0+aGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIH0KICAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQotCXJldHVybiBpOworCWdvdG8gZnJlZV9jZmdfbWVtOwogICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwogCiAgICAgLyogQWxsb2NhdGUgYSBtZW1vcnkgd2luZG93LCBmb3IgYWNjZXNzaW5nIHRoZSBJU1IgKi8KQEAgLTU0NCw3ICs1NTYsNyBAQAogICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CiAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKICAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQotCXJldHVybiBpOworCWdvdG8gZnJlZV9jZmdfbWVtOwogICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKICAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKICAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQpAQCAtNTU2LDYgKzU2OCw4IEBACiAJJiYgKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfRU0zMjg4KSkKIAltaHpfMzI4OF9wb3dlcihsaW5rKTsKIAorZnJlZV9jZmdfbWVtOgorICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybiBpOwogfQogCkBAIC01NjMsMzkgKzU3Nyw2MSBAQAogewogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwotICAgIHVfY2hhciBidWZbMjU1XSwgKnN0YXRpb25fYWRkcjsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CisgICAgdV9jaGFyICpidWYsICpzdGF0aW9uX2FkZHI7CisgICAgaW50IHJjOwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKwlyZXR1cm4gLTE7CisKKyAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKKyAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKKyAgICBidWYgPSBjZmdfbWVtLT5idWY7CisKKyAgICB0dXBsZS0+QXR0cmlidXRlcyA9IHR1cGxlLT5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUtPlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUtPlR1cGxlRGF0YU1heCA9IDI1NTsKIAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBDSVMuICBJdCBpcyBzdG9yZWQgYXMgdGhlIGxhc3QKICAgICAgICAoZm91cnRoKSBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0gICAgaWYgKGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQogICAgIC8qIFVnaCAtLSB0aGUgRU0xMTQ0IGNhcmQgaGFzIHR3byBWRVJTXzEgdHVwbGVzIT8hICovCi0gICAgaWYgKG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gQ1NfU1VDQ0VTUykKLQlmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKLSAgICBpZiAocGFyc2UudmVyc2lvbl8xLm5zID4gMykgewotCXN0YXRpb25fYWRkciA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzNdOwotCWlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIHN0YXRpb25fYWRkcikgPT0gMCkKLQkgICAgcmV0dXJuIDA7CisgICAgaWYgKG5leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworICAgIGlmIChwYXJzZS0+dmVyc2lvbl8xLm5zID4gMykgeworCXN0YXRpb25fYWRkciA9IHBhcnNlLT52ZXJzaW9uXzEuc3RyICsgcGFyc2UtPnZlcnNpb25fMS5vZnNbM107CisJaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CisJCXJjID0gMDsKKwkJZ290byBmcmVlX2NmZ19tZW07CisJfQogICAgIH0KIAogICAgIC8qIEFub3RoZXIgcG9zc2liaWxpdHk6IGZvciB0aGUgRU0zMjg4LCBpbiBhIHNwZWNpYWwgdHVwbGUgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDgxOwotICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICBpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQotCXJldHVybiAtMTsKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gMHg4MTsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSAhPSBDU19TVUNDRVNTKSB7CisJcmMgPSAtMTsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgICB9CisgICAgaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSAhPSBDU19TVUNDRVNTKSB7CisJcmMgPSAtMTsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgICB9CiAgICAgYnVmWzEyXSA9ICdcMCc7Ci0gICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgYnVmKSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgcmV0dXJuIC0xOworICAgIGlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIGJ1ZikgPT0gMCkgeworCXJjID0gMDsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgIH0KKyAgICByYyA9IC0xOworZnJlZV9jZmdfbWVtOgorICAga2ZyZWUoY2ZnX21lbSk7CisgICByZXR1cm4gcmM7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjY1LDE5ICs3MDEsMjkgQEAKIHN0YXRpYyBpbnQgc21jX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X2NoYXIgYnVmWzI1NV07Ci0gICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2Y7CisgICAgdV9jaGFyICpidWY7CiAgICAgaW50IGk7CiAKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKwlyZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOworCisgICAgdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7CisgICAgcGFyc2UgPSAmY2ZnX21lbS0+cGFyc2U7CisgICAgY2YgPSAmcGFyc2UtPmNmdGFibGVfZW50cnk7CisgICAgYnVmID0gY2ZnX21lbS0+YnVmOworCisgICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSB0dXBsZS0+VHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLT5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CisgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCiAgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLT5oYW5kbGUsIHR1cGxlLCBwYXJzZSk7CiAgICAgd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewogCWlmIChpID09IENTX1NVQ0NFU1MpIHsKIAkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKQEAgLTY4NiwxMCArNzMyLDEyIEBACiAJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CiAJICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOwogCX0KLQlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKwlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsIHR1cGxlLCBwYXJzZSk7CiAgICAgfQogICAgIGlmIChpID09IENTX1NVQ0NFU1MpCiAJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBrZnJlZShjZmdfbWVtKTsKICAgICByZXR1cm4gaTsKIH0KIApAQCAtNjk3LDQxICs3NDUsNTggQEAKIHsKICAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOwogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CiAgICAgY2lzdHBsX2xhbl9ub2RlX2lkX3QgKm5vZGVfaWQ7Ci0gICAgdV9jaGFyIGJ1ZlsyNTVdLCAqc3RhdGlvbl9hZGRyOwotICAgIGludCBpOworICAgIHVfY2hhciAqYnVmLCAqc3RhdGlvbl9hZGRyOworICAgIGludCBpLCByYzsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWNmZ19tZW0pCisJcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKworICAgIHR1cGxlID0gJmNmZ19tZW0tPnR1cGxlOworICAgIHBhcnNlID0gJmNmZ19tZW0tPnBhcnNlOworICAgIGJ1ZiA9IGNmZ19tZW0tPmJ1ZjsKKworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OwogCiAgICAgLyogQ2hlY2sgZm9yIGEgTEFOIGZ1bmN0aW9uIGV4dGVuc2lvbiB0dXBsZSAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKLSAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKLQlpZiAocGFyc2UuZnVuY2UudHlwZSA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQpCisJaWYgKHBhcnNlLT5mdW5jZS50eXBlID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKIAkgICAgYnJlYWs7Ci0JaSA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisJaSA9IG5leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIH0KICAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSB7Ci0Jbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGE7CisJbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLT5mdW5jZS5kYXRhOwogCWlmIChub2RlX2lkLT5uYiA9PSA2KSB7CiAJICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBub2RlX2lkLT5pZFtpXTsKLQkgICAgcmV0dXJuIDA7CisJICAgIHJjID0gMDsKKwkgICAgZ290byBmcmVlX2NmZ19tZW07CiAJfQogICAgIH0KICAgICAvKiBUcnkgdGhlIHRoaXJkIHN0cmluZyBpbiB0aGUgVmVyc2lvbiAxIFZlcnNpb24vSUQgdHVwbGUuICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLSAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gQ1NfU1VDQ0VTUykKLQlyZXR1cm4gLTE7Ci0gICAgc3RhdGlvbl9hZGRyID0gcGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbMl07Ci0gICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKQotCXJldHVybiAwOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQorICAgIHN0YXRpb25fYWRkciA9IHBhcnNlLT52ZXJzaW9uXzEuc3RyICsgcGFyc2UtPnZlcnNpb25fMS5vZnNbMl07CisgICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CisJcmMgPSAwOworCWdvdG8gZnJlZV9jZmdfbWVtOworICAgIH0KIAotICAgIHJldHVybiAtMTsKKyAgICByYyA9IC0xOworZnJlZV9jZmdfbWVtOgorICAgIGtmcmVlKGNmZ19tZW0pOworICAgIHJldHVybiByYzsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC03NzMsMjYgKzgzOCwzNiBAQAogewogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICB1X2NoYXIgYnVmWzI1NV07Ci0gICAgaW50IGk7CisgICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOworICAgIHR1cGxlX3QgKnR1cGxlOworICAgIHVfY2hhciAqYnVmOworICAgIGludCBpLCByYzsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7CisgICAgYnVmID0gY2ZnX21lbS0+YnVmOworCisgICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIHR1cGxlLT5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CisgICAgdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKIAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHR1cGxlIDB4OTAsIHN1YnR1cGxlIDB4MDQgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDkwOwotICAgIGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gMHg5MDsKKyAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKTsKICAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSk7CisJaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKIAlpZiAoKGkgIT0gQ1NfU1VDQ0VTUykgfHwgKGJ1ZlswXSA9PSAweDA0KSkKIAkgICAgYnJlYWs7Ci0JaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisJaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKTsKICAgICB9Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQlyZXR1cm4gLTE7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJZGV2LT5kZXZfYWRkcltpXSA9IGJ1ZltpKzJdOwogCkBAIC04MTQsOCArODg5LDEwIEBACiAJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfQVVJX1BXUiksCiAJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfUkVTRVRfSVNSKSk7CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmMgPSAwOworZnJlZV9jZmdfbWVtOgorICAga2ZyZWUoY2ZnX21lbSk7CisgICByZXR1cm4gcmM7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODg3LDkgKzk2NCwxMCBAQAogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X3Nob3J0IGJ1ZlszMl07CisgICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOworICAgIHR1cGxlX3QgKnR1cGxlOworICAgIGNpc3BhcnNlX3QgKnBhcnNlOworICAgIHVfY2hhciAqYnVmOwogICAgIGNoYXIgKm5hbWU7CiAgICAgaW50IGksIGosIHJldjsKICAgICBraW9fYWRkcl90IGlvYWRkcjsKQEAgLTg5NywyMSArOTc1LDI5IEBACiAKICAgICBERUJVRygwLCAic21jOTFjOTJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICBjZmdfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtY19jZmdfbWVtKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFjZmdfbWVtKQorCWdvdG8gY29uZmlnX2ZhaWxlZDsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIHR1cGxlID0gJmNmZ19tZW0tPnR1cGxlOworICAgIHBhcnNlID0gJmNmZ19tZW0tPnBhcnNlOworICAgIGJ1ZiA9IGNmZ19tZW0tPmJ1ZjsKKworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gNjQ7CisKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIENTX0VYSVRfVEVTVChpLCBQYXJzZVR1cGxlLCBjb25maWdfZmFpbGVkKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7Ci0Jc21jLT5tYW5maWQgPSBwYXJzZS5tYW5maWQubWFuZjsKLQlzbWMtPmNhcmRpZCA9IHBhcnNlLm1hbmZpZC5jYXJkOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpID09IENTX1NVQ0NFU1MpIHsKKwlzbWMtPm1hbmZpZCA9IHBhcnNlLT5tYW5maWQubWFuZjsKKwlzbWMtPmNhcmRpZCA9IHBhcnNlLT5tYW5maWQuY2FyZDsKICAgICB9CiAKICAgICAvKiBDb25maWd1cmUgY2FyZCAqLwpAQCAtMTA0Niw3ICsxMTMyLDcgQEAKICAgICAJICAgIHByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CiAJfQogICAgIH0KLQorICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybjsKIAogY29uZmlnX3VuZG86CkBAIC0xMDU0LDYgKzExNDAsNyBAQAogY29uZmlnX2ZhaWxlZDoJCQkvKiBDU19FWElUX1RFU1QoKSBjYWxscyBqdW1wIHRvIGhlcmUuLi4gKi8KICAgICBzbWM5MWM5Ml9yZWxlYXNlKGxpbmspOwogICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAga2ZyZWUoY2ZnX21lbSk7CiAKIH0gLyogc21jOTFjOTJfY29uZmlnICovCiAKQEAgLTIwMDYsNyArMjA5Myw3IEBACiAgICAgfQogCiAgICAgLyogSWdub3JlIGNvbGxpc2lvbnMgdW5sZXNzIHdlJ3ZlIGhhZCBubyByeCdzIHJlY2VudGx5ICovCi0gICAgaWYgKGppZmZpZXMgLSBkZXYtPmxhc3RfcnggPiBIWikgeworICAgIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+bGFzdF9yeCArIEhaKSkgewogCWlmIChzbWMtPnR4X2VyciB8fCAoc21jLT5tZWRpYV9zdGF0dXMgJiBFUEhfMTZDT0wpKQogCSAgICBtZWRpYSB8PSBFUEhfMTZDT0w7CiAgICAgfQpAQCAtMjIzNiwxMyArMjMyMyw0NyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNtYzkxYzkyX2lkc1tdID0geworCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMDksIDB4MDUwMSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDE0MCwgMHgwMDBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIzKDAsICJNRUdBSEVSVFoiLCAiQ0MvWEpFTTMyODgiLCAiREFUQS9GQVgvQ0VMTCBFVEhFUk5FVCBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4MDRjZDI5ODgsIDB4NDZhNTJkNjMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMjMoMCwgIk1FR0FIRVJUWiIsICJDQy9YSkVNMzMzNiIsICJEQVRBL0ZBWC9DRUxMIEVUSEVSTkVUIE1PREVNIiwgMHhmNTEwZGIwNCwgMHgwMTQzYjc3MywgMHg0NmE1MmQ2MyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygwLCAiTUVHQUhFUlRaIiwgIkVNMTE0NFQiLCAiUENNQ0lBIE1PREVNIiwgMHhmNTEwZGIwNCwgMHg4NTZkNjZjOCwgMHhiZDZjNDNlZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygwLCAiTUVHQUhFUlRaIiwgIlhKRU0xMTQ0L0NDRU0xMTQ0IiwgIlBDTUNJQSBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4NTJkMjFlMWUsIDB4YmQ2YzQzZWYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiR2F0ZXdheSAyMDAwIiwgIlhKRU0zMzM2IiwgMHhkZDk5ODliZSwgMHg2NjJjMzk0YyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJNRUdBSEVSVFoiLCAiWEpFTTExNDQvQ0NFTTExNDQiLCAweGY1MTBkYjA0LCAweDUyZDIxZTFlKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIk9zaXRlY2giLCAiVHJ1bXBjYXJkIiwgMHgwYzJmODBjZCwgMHgwNTczYzI5ZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJPc2l0ZWNoIiwgIlRydW1wY2FyZCIsIDB4MGMyZjgwY2QsIDB4MDU3M2MyOWYpLAorCVBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNmMsIDB4MDAyMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTZjLCAweDAwMjMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQkFTSUNTIGJ5IE5ldyBNZWRpYSBDb3Jwb3JhdGlvbiIsICJFdGhlcm5ldCIsICJTTUM5MUM5NCIsIDB4MjNjNzhhOWQsIDB4MDBiMmU5NDEsIDB4Y2VmMzk3ZmIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBUkdPU1kiLCAiRmFzdCBFdGhlcm5ldCBQQ0NhcmQiLCAweDc4ZjMwOGRjLCAweGRjZWE2OGJjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiZGl0IENvLiwgTHRkLiIsICJQQyBDYXJkLTEwLzEwMEJUWCIsIDB4ZTU5MzY1YzgsIDB4NmEyMTYxZDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEWU5BTElOSyIsICJMMTAwQyIsIDB4NmEyNmQxY2YsIDB4YzE2Y2U5YzUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJGYXJhbGxvbiIsICJGYXJhbGxvbiBFbmV0IiwgMHg1OGQ5M2ZjNCwgMHgyNDQ3MzRlOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1lZ2FoZXJ0eiIsICJDQzEwQlQvMiIsIDB4MzMyMzQ3NDgsIDB4M2M5NWI5NTMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNRUxDTy9TTUMiLCAiTFBDLVRYIiwgMHhhMmNkOGU2ZCwgMHg0MmRhNjYyYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk9zaXRlY2giLCAiVHJ1bXBjYXJkIiwgMHgwYzJmODBjZCwgMHgwNTczYzI5ZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk9zaXRlY2giLCAiVHJ1bXBjYXJkIiwgMHgwYzJmODBjZCwgMHgwNTczYzI5ZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGYXN0IEV0aGVybmV0IFBDQ2FyZCIsIDB4MjgxZjFjNWQsIDB4ZGNlYTY4YmMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQc2lvbiIsICIxME1iIEV0aGVybmV0IiwgMHg0ZWYwMGIyMSwgMHg4NDRiZTllOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNNQyIsICJFdGhlckVaIEV0aGVybmV0IDgwMjAiLCAweGM0ZjhiMThiLCAweDRhMGVlYjJkKSwKKwkvKiBUaGVzZSBjb25mbGljdCB3aXRoIG90aGVyIGNhcmRzISAqLworCS8qIFBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE4NiwgMHgwMTAwKSwgKi8KKwkvKiBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDhhMDEsIDB4YzFhYiksICovCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzbWM5MWM5Ml9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc21jOTFjOTJfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAic21jOTFjOTJfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBzbWM5MWM5Ml9hdHRhY2gsCisJLmV2ZW50CQk9IHNtYzkxYzkyX2V2ZW50LAogCS5kZXRhY2gJCT0gc21jOTFjOTJfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHNtYzkxYzkyX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc21jOTFjOTJfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCmluZGV4IDU4MTc3ZDYuLjlmMzNiYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtODEsNyArODEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02MTksMTEgKzYxOCw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ4aXJjMnBzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIGlmICgoZXJyID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZykpKSB7CkBAIC0xOTgzLDEzICsxOTc3LDQyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB4aXJjMnBzX2lkc1tdID0geworCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAwODksIDB4MTEwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEzOCwgMHgxMTBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMCwgIlhpcmNvbSIsICJDRU0yOCIsIDB4MmUzZWU4NDUsIDB4MGVhOTc4ZWEpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygwLCAiWGlyY29tIiwgIkNFTTMzIiwgMHgyZTNlZTg0NSwgMHg4MDYwOTAyMyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDAsICJYaXJjb20iLCAiQ0VNNTYiLCAweDJlM2VlODQ1LCAweGE2NTBjMzJhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMCwgIlhpcmNvbSIsICJSRU0xMCIsIDB4MmUzZWU4NDUsIDB4NzZkZjFkMjkpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygwLCAiWGlyY29tIiwgIlhFTTU2MDAiLCAweDJlM2VlODQ1LCAweGYxNDAzNzE5KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIlhpcmNvbSIsICJDcmVkaXRDYXJkIEV0aGVybmV0IiwgMHgyZTNlZTg0NSwgMHhjMGU3NzhjMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWJmLCAweDAxMGEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJUb3NoaWJhIEluZm9ybWF0aW9uIFN5c3RlbXMiLCAiVFBDRU5FVCIsIDB4MWIzYjk0ZmUsIDB4ZjM4MWMxYTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiQ0UzLTEwLzEwMCIsIDB4MmUzZWU4NDUsIDB4MGVjMGFjMzcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiUFMtQ0UyLTEwIiwgMHgyZTNlZTg0NSwgMHg5NDdkOTA3MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIlhpcmNvbSIsICJSMkUtMTAwQlRYIiwgMHgyZTNlZTg0NSwgMHgyNDY0YTZlMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIlhpcmNvbSIsICJSRS0xMCIsIDB4MmUzZWU4NDUsIDB4M2UwOGQ2MDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiWEUyMDAwIiwgMHgyZTNlZTg0NSwgMHhmNzE4OGU0NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNvbXBhcSIsICJFdGhlcm5ldCBMQU4gQ2FyZCIsIDB4NTRmN2M0OWMsIDB4OWZkMmYwYTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb21wYXEiLCAiTmV0ZWxsaWdlbnQgMTAvMTAwIFBDIENhcmQiLCAweDU0ZjdjNDljLCAweGVmZTk2NzY5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSW50ZWwiLCAiRXRoZXJFeHByZXNzKFRNKSBQUk8vMTAwIFBDIENhcmQgTW9iaWxlIEFkYXB0ZXIxNiIsIDB4ODE2Y2M4MTUsIDB4MTc0Mzk3ZGIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUb3NoaWJhIiwgIjEwLzEwMCBFdGhlcm5ldCBQQyBDYXJkIiwgMHg0NGEwOWQ5YywgMHhiNDRkZWVjZiksCisJLyogYWxzbyBtYXRjaGVzIENGRS0xMCBjYXJkcyEgKi8KKwkvKiBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDUsIDB4MDEwYSksICovCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB4aXJjMnBzX2lkcyk7CisKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHhpcmMycHNfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAieGlyYzJwc19jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHhpcmMycHNfYXR0YWNoLAorCS5ldmVudAkJPSB4aXJjMnBzX2V2ZW50LAogCS5kZXRhY2gJCT0geGlyYzJwc19kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0geGlyYzJwc19pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCmluZGV4IDEzZjExNDguLjExM2I2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYworKysgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgIGlmICgoIWRhdGEpIHx8IChkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpKQogICAgIGRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKIAotICAgIHNjaGVkdWxlX3RpbWVvdXQoZGF0YSAqIEhaKTsKKyAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CiAgICAgZGVsX3RpbWVyX3N5bmMoJmxwLT5ibGlua190aW1lcik7CiAKICAgICAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYmNycyAqLwpAQCAtMTYwMiw3ICsxNjAyLDcgQEAKIAogCXJtYigpOwogCWlmIChscC0+cnhfZG1hX2FkZHJbaV0gPT0gMCkKLQkgICAgbHAtPnJ4X2RtYV9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHJ4X3NrYnVmZi0+dGFpbCwKKwkgICAgbHAtPnJ4X2RtYV9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHJ4X3NrYnVmZi0+ZGF0YSwKIAkJICAgIFBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAlscC0+cnhfcmluZ1tpXS5iYXNlID0gKHUzMilsZTMyX3RvX2NwdShscC0+cnhfZG1hX2FkZHJbaV0pOwogCWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgyLVBLVF9CVUZfU1opOwpAQCAtMTk4Myw3ICsxOTgzLDcgQEAKIAkJCWxwLT5yeF9za2J1ZmZbZW50cnldID0gbmV3c2tiOwogCQkJbmV3c2tiLT5kZXYgPSBkZXY7CiAJCQlscC0+cnhfZG1hX2FkZHJbZW50cnldID0KLQkJCSAgICBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwgbmV3c2tiLT50YWlsLAorCQkJICAgIHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBuZXdza2ItPmRhdGEsCiAJCQkJICAgIFBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlID0gbGUzMl90b19jcHUobHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSk7CiAJCQlyeF9pbl9wbGFjZSA9IDE7CkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogCQkJCQkJUEtUX0JVRl9TWi0yLAogCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLAotCQkJICAgICh1bnNpZ25lZCBjaGFyICopKGxwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKShscC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSksCiAJCQkgICAgcGt0X2xlbiwwKTsKIAkJICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShscC0+cGNpX2RldiwKIAkJCQkJCSAgIGxwLT5yeF9kbWFfYWRkcltlbnRyeV0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKaW5kZXggZjRiNjI0MC4uMjE1MzdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGxpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgKglpbiBmYXIgdG9vIG1hbnkgb2xkIHN5c3RlbXMgbm90IGFsbCBldmVuIHJ1bm5pbmcgTGludXguCiAgKi8KICAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwbGlwX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgcGxpcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCmluZGV4IDVlNDhiOWEuLjU5ZTgxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwogCXBwcF9hc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJmFwLT5ycXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZhcC0+cnF1ZXVlKSkKIAkJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CiAJYXBfcHV0KGFwKTsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKaW5kZXggYWI3MjZhYi4uYTMyNjY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC0xMjM3LDggKzEyMzcsOCBAQAogCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CiAJCW5hdmFpbCArPSBwY2gtPmF2YWlsID0gKHBjaC0+Y2hhbiAhPSBOVUxMKTsKIAkJaWYgKHBjaC0+YXZhaWwpIHsKLQkJCWlmIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID09IDAKLQkJCSAgICB8fCAhcGNoLT5oYWRfZnJhZykgeworCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcGNoLT5maWxlLnhxKSB8fAorCQkJICAgICFwY2gtPmhhZF9mcmFnKSB7CiAJCQkJcGNoLT5hdmFpbCA9IDI7CiAJCQkJKytuZnJlZTsKIAkJCX0KQEAgLTEzNzQsOCArMTM3NCw4IEBACiAKIAkJLyogdHJ5IHRvIHNlbmQgaXQgZG93biB0aGUgY2hhbm5lbCAqLwogCQljaGFuID0gcGNoLT5jaGFuOwotCQlpZiAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKQotCQkgICAgfHwgIWNoYW4tPm9wcy0+c3RhcnRfeG1pdChjaGFuLCBmcmFnKSkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkgfHwKKwkJICAgICFjaGFuLT5vcHMtPnN0YXJ0X3htaXQoY2hhbiwgZnJhZykpCiAJCQlza2JfcXVldWVfdGFpbCgmcGNoLT5maWxlLnhxLCBmcmFnKTsKIAkJcGNoLT5oYWRfZnJhZyA9IDE7CiAJCXAgKz0gZmxlbjsKQEAgLTE0MTIsNyArMTQxMiw3IEBACiAKIAlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOwogCWlmIChwY2gtPmNoYW4gIT0gMCkgewotCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA+IDApIHsKKwkJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkpIHsKIAkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwY2gtPmZpbGUueHEpOwogCQkJaWYgKCFwY2gtPmNoYW4tPm9wcy0+c3RhcnRfeG1pdChwY2gtPmNoYW4sIHNrYikpIHsKIAkJCQkvKiBwdXQgdGhlIHBhY2tldCBiYWNrIGFuZCB0cnkgYWdhaW4gbGF0ZXIgKi8KQEAgLTE0MjYsNyArMTQyNiw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKIAkvKiBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgZnJvbSB0aGUgYXR0YWNoZWQgdW5pdCB0byBiZSBzZW50ICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnBjaC0+ZmlsZS54cSkgPT0gMCkgeworCWlmIChza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkpIHsKIAkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CiAJCXBwcCA9IHBjaC0+cHBwOwogCQlpZiAocHBwICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jIGIvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYwppbmRleCBmZDlmNTAxLi40ZDUxYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CiAJcHBwX3N5bmNfaW5wdXQoYXAsIGJ1ZiwgY2ZsYWdzLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwotCWlmIChza2JfcXVldWVfbGVuKCZhcC0+cnF1ZXVlKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXAtPnJxdWV1ZSkpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOwogCXNwX3B1dChhcCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IGNlNDQ5ZmUuLmQ1YWZlMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtMTg3Niw3ICsxODc2LDcgQEAKIAlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAJKnNrX2J1ZmYgPSBza2I7CiAKLQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT50YWlsLCByeF9idWZfc3osCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgcnhfYnVmX3N6LAogCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJcnRsODE2OV9tYXBfdG9fYXNpYyhkZXNjLCBtYXBwaW5nLCByeF9idWZfc3opOwpAQCAtMjMzNiw3ICsyMzM2LDcgQEAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3Rfc2l6ZSArIE5FVF9JUF9BTElHTik7CiAJCWlmIChza2IpIHsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKLQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBza19idWZmWzBdLT50YWlsLCBwa3Rfc2l6ZSwgMCk7CisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+ZGF0YSwgcGt0X3NpemUsIDApOwogCQkJKnNrX2J1ZmYgPSBza2I7CiAJCQlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOwogCQkJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCA5YzIyNGViLi5lYTYzOGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0xNjk4LDExICsxNjk5LDkgQEAKICNlbHNlCiAJCWJhID0gJm5pYy0+YmFbcmluZ19ub11bYmxvY2tfbm9dW29mZl07CiAJCXNrYl9yZXNlcnZlKHNrYiwgQlVGMF9MRU4pOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOwotCQl0bXAgKz0gQUxJR05fU0laRTsKLQkJdG1wICY9IH5BTElHTl9TSVpFOwotCQlza2ItPmRhdGEgPSAodm9pZCAqKSB0bXA7Ci0JCXNrYi0+dGFpbCA9ICh2b2lkICopIHRtcDsKKwkJdG1wID0gKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEgJiBBTElHTl9TSVpFKTsKKwkJaWYgKHRtcCkKKwkJCXNrYl9yZXNlcnZlKHNrYiwgKEFMSUdOX1NJWkUgKyAxKSAtIHRtcCk7CiAKIAkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeERfdCkpOwogCQlyeGRwLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlCkBAIC00NTkzLDE5ICs0NTkyLDE5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CiAJCURCR19QUklOVChJTklUX0RCRywgInMyaW9faW5pdF9uaWM6IFVzaW5nIDY0Yml0IERNQVxuIik7CiAJCWRtYV9mbGFnID0gVFJVRTsKIAogCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrCi0JCSAgICAocGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQkgICAgKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewogCQkJREJHX1BSSU5UKEVSUl9EQkcsCiAJCQkJICAiVW5hYmxlIHRvIG9idGFpbiA2NGJpdCBETUEgZm9yIFwKIAkJCQkJY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CiAJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMKSkgeworCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CiAJCURCR19QUklOVChJTklUX0RCRywgInMyaW9faW5pdF9uaWM6IFVzaW5nIDMyYml0IERNQVxuIik7CiAJfSBlbHNlIHsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMDAwLmMgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwppbmRleCBlMTUzNjljLi5kNjM4OGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEwMDAuYworKysgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwpAQCAtOTAsNyArOTAsNiBAQAogCiAKIC8qIFNCMTAwMCBoYXJkd2FyZSByb3V0aW5lcyB0byBiZSB1c2VkIGR1cmluZyBvcGVuL2NvbmZpZ3VyYXRpb24gcGhhc2VzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmljZWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOwogc3RhdGljIGlubGluZSBpbnQgY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyKGNvbnN0IGludCBpb2FkZHJbXSwKIAljb25zdCBjaGFyKiBuYW1lKTsKIHN0YXRpYyBpbmxpbmUgaW50IGNhcmRfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLApAQCAtMjU0LDEzICsyNTMsNiBAQAogCiBzdGF0aWMgY29uc3QgaW50IFRpbWVPdXRKaWZmaWVzID0gKDg3NSAqIEhaKSAvIDEwMDsKIAotc3RhdGljIGlubGluZSB2b2lkIG5pY2VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQotewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoSFopOwotCXJldHVybjsKLX0KLQogLyogQ2FyZCBXYWl0IEZvciBCdXN5IENsZWFyIChjYW5ub3QgYmUgdXNlZCBkdXJpbmcgYW4gaW50ZXJydXB0KSAqLwogc3RhdGljIGlubGluZSBpbnQKIGNhcmRfd2FpdF9mb3JfYnVzeV9jbGVhcihjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCkBAIC00NzUsNyArNDY3LDcgQEAKIAl1ZGVsYXkoMTAwMCk7CiAJb3V0YigweDAsIHBvcnQpOwogCWluYihwb3J0KTsKLQluaWNlZGVsYXkoNjAwMDApOworCXNzbGVlcCgxKTsKIAlvdXRiKDB4NCwgcG9ydCk7CiAJaW5iKHBvcnQpOwogCXVkZWxheSgxMDAwKTsKQEAgLTUzNyw3ICs1MjksNyBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CiAJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKIAotCW5pY2VkZWxheSg1MDAwMCk7CisJc3NsZWVwKDEpOwogCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKIAkJcmV0dXJuIHN0YXR1czsKIAlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDEsIHN0KSkpCkBAIC05NDQsNyArOTM2LDcgQEAKIAkvKiBpbml0aWFsaXplIHNiMTAwMCAqLwogCWlmICgoc3RhdHVzID0gc2IxMDAwX3Jlc2V0KGlvYWRkciwgbmFtZSkpKQogCQlyZXR1cm4gc3RhdHVzOwotCW5pY2VkZWxheSgyMDAwMDApOworCXNzbGVlcCgxKTsKIAlpZiAoKHN0YXR1cyA9IHNiMTAwMF9jaGVja19DUkMoaW9hZGRyLCBuYW1lKSkpCiAJCXJldHVybiBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwppbmRleCBmZDJlN2MzLi43YWJkNTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCkBAIC05NjMsMTEgKzk2MywxMSBAQAogCS8qCiAJICogRG8gbm90IGludGVycnVwdCBwZXIgRE1BIHRyYW5zZmVyLgogCSAqLwotCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+dGFpbCkgfAorCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+ZGF0YSkgfAogCQlWX0RNQV9EU0NSQV9BX1NJWkUoTlVNQ0FDSEVCTEtTKHBrdHNpemUrRVRIRVJfQUxJR04pKSB8CiAJCTA7CiAjZWxzZQotCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+dGFpbCkgfAorCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+ZGF0YSkgfAogCQlWX0RNQV9EU0NSQV9BX1NJWkUoTlVNQ0FDSEVCTEtTKHBrdHNpemUrRVRIRVJfQUxJR04pKSB8CiAJCU1fRE1BX0RTQ1JBX0lOVEVSUlVQVDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2hhcGVyLmMgYi9kcml2ZXJzL25ldC9zaGFwZXIuYwppbmRleCAyMGVkZWIzLi4zYWQwYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaGFwZXIuYworKysgYi9kcml2ZXJzL25ldC9zaGFwZXIuYwpAQCAtMTM1LDEwICsxMzUsOCBAQAogewogCXN0cnVjdCBzaGFwZXIgKnNoYXBlciA9IGRldi0+cHJpdjsKICAJc3RydWN0IHNrX2J1ZmYgKnB0cjsKLSAgIAotCWlmIChkb3duX3RyeWxvY2soJnNoYXBlci0+c2VtKSkKLQkJcmV0dXJuIC0xOwotCisgIAorCXNwaW5fbG9jaygmc2hhcGVyLT5sb2NrKTsKICAJcHRyPXNoYXBlci0+c2VuZHEucHJldjsKICAJCiAgCS8qCkBAIC0yMzIsNyArMjMwLDcgQEAKICAgICAgICAgICAgICAgICBzaGFwZXItPnN0YXRzLmNvbGxpc2lvbnMrKzsKICAJfQogCXNoYXBlcl9raWNrKHNoYXBlcik7Ci0JdXAoJnNoYXBlci0+c2VtKTsKKwlzcGluX3VubG9jaygmc2hhcGVyLT5sb2NrKTsKICAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MSwxMSArMjY5LDkgQEAKIHsKIAlzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIgPSAoc3RydWN0IHNoYXBlciAqKWRhdGE7CiAKLQlpZiAoIWRvd25fdHJ5bG9jaygmc2hhcGVyLT5zZW0pKSB7Ci0JCXNoYXBlcl9raWNrKHNoYXBlcik7Ci0JCXVwKCZzaGFwZXItPnNlbSk7Ci0JfSBlbHNlCi0JCW1vZF90aW1lcigmc2hhcGVyLT50aW1lciwgamlmZmllcyk7CisJc3Bpbl9sb2NrKCZzaGFwZXItPmxvY2spOworCXNoYXBlcl9raWNrKHNoYXBlcik7CisJc3Bpbl91bmxvY2soJnNoYXBlci0+bG9jayk7CiB9CiAKIC8qCkBAIC0zMzIsMjEgKzMyOCw2IEBACiAKIAogLyoKLSAqCUZsdXNoIHRoZSBzaGFwZXIgcXVldWVzIG9uIGEgY2xvc2Vkb3duCi0gKi8KLSAKLXN0YXRpYyB2b2lkIHNoYXBlcl9mbHVzaChzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWRvd24oJnNoYXBlci0+c2VtKTsKLQl3aGlsZSgoc2tiPXNrYl9kZXF1ZXVlKCZzaGFwZXItPnNlbmRxKSkhPU5VTEwpCi0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQlzaGFwZXJfa2ljayhzaGFwZXIpOwotCXVwKCZzaGFwZXItPnNlbSk7Ci19Ci0KLS8qCiAgKglCcmluZyB0aGUgaW50ZXJmYWNlIHVwLiBXZSBqdXN0IGRpc2FsbG93IHRoaXMgdW50aWwgYSAKICAqCWJpbmQuCiAgKi8KQEAgLTM3NSw3ICszNTYsMTUgQEAKIHN0YXRpYyBpbnQgc2hhcGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNoYXBlciAqc2hhcGVyPWRldi0+cHJpdjsKLQlzaGFwZXJfZmx1c2goc2hhcGVyKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2hhcGVyLT5zZW5kcSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXNwaW5fbG9ja19iaCgmc2hhcGVyLT5sb2NrKTsKKwlzaGFwZXJfa2ljayhzaGFwZXIpOworCXNwaW5fdW5sb2NrX2JoKCZzaGFwZXItPmxvY2spOworCiAJZGVsX3RpbWVyX3N5bmMoJnNoYXBlci0+dGltZXIpOwogCXJldHVybiAwOwogfQpAQCAtNTc2LDYgKzU2NSw3IEBACiAJaW5pdF90aW1lcigmc2gtPnRpbWVyKTsKIAlzaC0+dGltZXIuZnVuY3Rpb249c2hhcGVyX3RpbWVyOwogCXNoLT50aW1lci5kYXRhPSh1bnNpZ25lZCBsb25nKXNoOworCXNwaW5fbG9ja19pbml0KCZzaC0+bG9jayk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXM5MDAuYyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCmluZGV4IDMxMDdhZWQuLjIzYjcxM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczkwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTMsOCArOTQsNiBAQAogCiAvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCiAjZGVmaW5lIFRYX1RJTUVPVVQgICg0KkhaKQotLyogU2lTIDkwMCBpcyBjYXBhYmxlIG9mIDMyIGJpdHMgQk0gRE1BICovCi0jZGVmaW5lIFNJUzkwMF9ETUFfTUFTSyAweGZmZmZmZmZmCiAKIGVudW0gewogCVNJU185MDAgPSAwLApAQCAtNDE0LDcgKzQxMyw3IEBACiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CiAJaWYocmV0KSByZXR1cm4gcmV0OwogCQotCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIFNJUzkwMF9ETUFfTUFTSyk7CisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgRE1BXzMyQklUX01BU0spOwogCWlmKGkpewogCQlwcmludGsoS0VSTl9FUlIgInNpczkwMC5jOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIKIAkJCSIzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CkBAIC0xMTU1LDcgKzExNTQsNyBAQAogCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOwogCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKICAgICAgICAgICAgICAgICBzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSBwY2lfbWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+dGFpbCwgUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEsIFJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCX0KIAlzaXNfcHJpdi0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KSAoaSAtIE5VTV9SWF9ERVNDKTsKIApAQCAtMTc3Nyw3ICsxNzc2LDcgQEAKIAkJCXNpc19wcml2LT5yeF9za2J1ZmZbZW50cnldID0gc2tiOwogCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOwogICAgICAgICAgICAgICAgIAlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uYnVmcHRyID0gCi0JCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwgCisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgCiAJCQkJCVJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJc2lzX3ByaXYtPmRpcnR5X3J4Kys7CiAJCX0KQEAgLTE4MTAsNyArMTgwOSw3IEBACiAJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKICAgICAgICAgICAgICAgICAJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9Ci0JCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCQlwY2lfbWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLAogCQkJCQlSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKaW5kZXggMWNjYjI5OC4uODI1NzBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKQEAgLTExMiw2ICsxMTIsNyBAQAogI2luY2x1ZGUJPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZQk8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgCTxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZQk8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUJImgvc2tkcnYxc3QuaCIKICNpbmNsdWRlCSJoL3NrZHJ2Mm5kLmgiCkBAIC00OTEyLDggKzQ5MTMsOCBAQAogCQlnb3RvIG91dDsKICAKIAkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSAmJgotCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmYpKQorCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSAmJgorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkKIAkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3NrZnAvTWFrZWZpbGUKaW5kZXggNmNmY2NmYi4uY2IyMzU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9za2ZwL01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogCiBza2ZwLW9ianMgOj0gIHNrZmRkaS5vICAgIGh3bXRtLm8gICAgZnBsdXN0bS5vICBzbXQubyAgICAgIGNmbS5vICAgICBcCiAgICAgICAgICAgICAgIGVjbS5vICAgICAgIHBjbXBsYy5vICAgcG1mLm8gICAgICBxdWV1ZS5vICAgIHJtdC5vICAgICBcCi0JICAgICAgc210ZGVmLm8gICAgc210aW5pdC5vICBzbXR0aW1lci5vIHNyZi5vICAgICAgbG5rc3RhdC5vIFwKLSAgICAgICAgICAgICAgc210cGFyc2UubyAgaHd0Lm8gICAgICBkcnZmYmkubyAgIGVzcy5vCisJICAgICAgc210ZGVmLm8gICAgc210aW5pdC5vICBzbXR0aW1lci5vIHNyZi5vICAgICAgaHd0Lm8gICAgIFwKKwkgICAgICBkcnZmYmkubyAgIGVzcy5vCiAKICMgTk9URToKICMgICBDb21waWxpbmcgdGhpcyBkcml2ZXIgcHJvZHVjZXMgc29tZSB3YXJuaW5ncyAoYW5kIHNvbWUgbW9yZSBhcmUgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2RydmZiaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYwppbmRleCAwNTJlODQxLi41YjQ3NTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2RydmZiaS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZHJ2ZmJpLmMKQEAgLTEwNSw4ICsxMDUsOCBAQAogI2VuZGlmCiAKIAotLyogUHJvdG90eXBlcyBvZiBsb2NhbCBmdW5jdGlvbnMuICovCi12b2lkIHNtdF9zdG9wX3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKTsKKy8qIFByb3RvdHlwZSBvZiBhIGxvY2FsIGZ1bmN0aW9uLiAqLworc3RhdGljIHZvaWQgc210X3N0b3Bfd2F0Y2hkb2coc3RydWN0IHNfc21jICpzbWMpOwogCiAjaWZkZWYgTUNBCiBzdGF0aWMgaW50IHJlYWRfY2FyZF9pZCgpIDsKQEAgLTYzMSw3ICs2MzEsNyBAQAogICoJTEVEX1lfT0ZGCWp1c3Qgc3dpdGNoIHllbGxvdyBMRUQgb2ZmCiAgKglMRURfWV9PTglqdXN0IHN3aXRjaCB5ZWxsbyBMRUQgb24KICAqLwotdm9pZCBsZWRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxlZF9ldmVudCkKK3N0YXRpYyB2b2lkIGxlZF9pbmRpY2F0aW9uKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGVkX2V2ZW50KQogewogCS8qIHVzZSBzbWMtPmh3Lm1hY19yaW5nX2lzX3VwID09IFRSVUUgCiAJICogYXMgaW5kaWNhdGlvbiBmb3IgUmluZyBPcGVyYXRpb25hbApAQCAtNzY0LDEyMiArNzY0LDYgQEAKICNlbmRpZgogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUEgaW5pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZglJU0EKLQotLyoKLSAqIGluaXQgRE1BCi0gKi8KLXZvaWQgaW5pdF9kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCi17Ci0JU0tfVU5VU0VEKHNtYykgOwotCi0JLyoKLQkgKiBzZXQgY2FzY2FkZSBtb2RlLAotCSAqIGNsZWFyIG1hc2sgYml0IChlbmFibGUgRE1BIGNhbm5hbCkKLQkgKi8KLQlpZiAoZG1hID4gMykgewotCQlvdXRwKDB4ZDYsKGRtYSAmIDB4MDMpIHwgMHhjMCkgOwotCQlvdXRwKDB4ZDQsIGRtYSAmIDB4MDMpIDsKLQl9Ci0JZWxzZSB7Ci0JCW91dHAoMHgwYiwoZG1hICYgMHgwMykgfCAweGMwKSA7Ci0JCW91dHAoMHgwYSxkbWEgJiAweDAzKSA7Ci0JfQotfQotCi0vKgotICogZGlzYWJsZSBETUEKLSAqLwotdm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCVNLX1VOVVNFRChzbWMpIDsKLQotCS8qCi0JICogc2V0IG1hc2sgYml0IChkaXNhYmxlIERNQSBjYW5uYWwpCi0JICovCi0JaWYgKGRtYSA+IDMpIHsKLQkJb3V0cCgweGQ0LChkbWEgJiAweDAzKSB8IDB4MDQpIDsKLQl9Ci0JZWxzZSB7Ci0JCW91dHAoMHgwYSwoZG1hICYgMHgwMykgfCAweDA0KSA7Ci0JfQotfQotCi0jZW5kaWYJLyogSVNBICovCi0KLSNpZmRlZglFSVNBCi0KLS8qYXJyYXlzIHdpdGggaW8gYWRkcmVzc2VzIG9mIGRtYSBjb250cm9sbGVyIGxlbmd0aCBhbmQgYWRkcmVzcyByZWdpc3RlcnMqLwotc3RhdGljIGNvbnN0IGludCBjbnRyWzhdID0geyAweDAwMSwweDAwMywweDAwNSwweDAwNywwLDB4MGM2LDB4MGNhLDB4MGNlIH0gOwotc3RhdGljIGNvbnN0IGludCBiYXNlWzhdID0geyAweDAwMCwweDAwMiwweDAwNCwweDAwNiwwLDB4MGM0LDB4MGM4LDB4MGNjIH0gOwotc3RhdGljIGNvbnN0IGludCBwYWdlWzhdID0geyAweDA4NywweDA4MywweDA4MSwweDA4MiwwLDB4MDhiLDB4MDg5LDB4MDhhIH0gOwotCi12b2lkIGluaXRfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCS8qCi0JICogZXh0ZW5kZWQgbW9kZSByZWdpc3RlcgotCSAqIDMyIGJpdCBJTwotCSAqIHR5cGUgYwotCSAqIFRDIG91dHB1dAotCSAqIGRpc2FibGUgc3RvcAotCSAqLwotCi0JLyogbW9kZSByZWFkICh3cml0ZSkgZGVtYW5kICovCi0Jc21jLT5ody5kbWFfcm1vZGUgPSAoZG1hICYgMykgfCAweDA4IHwgMHgwIDsKLQlzbWMtPmh3LmRtYV93bW9kZSA9IChkbWEgJiAzKSB8IDB4MDQgfCAweDAgOwotCi0JLyogMzIgYml0IElPJ3MsIGJ1cnN0IERNQSBtb2RlICh0eXBlICJDIikgKi8KLQlzbWMtPmh3LmRtYV9lbW9kZSA9IChkbWEgJiAzKSB8IDB4MDggfCAweDMwIDsKLQotCW91dHAoKGRtYSA8IDQpID8gMHg0MGIgOiAweDRkNixzbWMtPmh3LmRtYV9lbW9kZSkgOwotCi0JLyogZGlzYWJsZSBjaGFpbmluZyAqLwotCW91dHAoKGRtYSA8IDQpID8gMHg0MGEgOiAweDRkNCwoZG1hJjMpKSA7Ci0KLQkvKmxvYWQgZG1hIGNvbnRyb2xsZXIgYWRkcmVzc2VzIGZvciBmYXN0IGFjY2VzcyBkdXJpbmcgc2V0IGRtYSovCi0Jc21jLT5ody5kbWFfYmFzZV93b3JkX2NvdW50ID0gY250cltzbWMtPmh3LmRtYV07Ci0Jc21jLT5ody5kbWFfYmFzZV9hZGRyZXNzID0gYmFzZVtzbWMtPmh3LmRtYV07Ci0Jc21jLT5ody5kbWFfYmFzZV9hZGRyZXNzX3BhZ2UgPSBwYWdlW3NtYy0+aHcuZG1hXTsKLQotfQotCi12b2lkIGRpc19kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCi17Ci0JU0tfVU5VU0VEKHNtYykgOwotCi0Jb3V0cCgoZG1hIDwgNCkgPyAweDBhIDogMHhkNCwoZG1hJjMpfDQpIDsvKiBtYXNrIGJpdCAqLwotfQotI2VuZGlmCS8qIEVJU0EgKi8KLQotI2lmZGVmCU1DQQotdm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKLXsKLQlTS19VTlVTRUQoc21jKSA7Ci0JU0tfVU5VU0VEKGRtYSkgOwotfQotCi12b2lkIGRpc19kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCi17Ci0JU0tfVU5VU0VEKHNtYykgOwotCVNLX1VOVVNFRChkbWEpIDsKLX0KLSNlbmRpZgotCi0jaWZkZWYJUENJCi12b2lkIGluaXRfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCVNLX1VOVVNFRChzbWMpIDsKLQlTS19VTlVTRUQoZG1hKSA7Ci19Ci0KLXZvaWQgZGlzX2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKLXsKLQlTS19VTlVTRUQoc21jKSA7Ci0JU0tfVU5VU0VEKGRtYSkgOwotfQotI2VuZGlmCi0KICNpZmRlZiBNVUxUX09FTQogc3RhdGljIGludCBpc19lcXVhbF9udW0oY2hhciBjb21wMVtdLCBjaGFyIGNvbXAyW10sIGludCBudW0pCiB7CkBAIC0xNDA3LDcgKzEyOTEsNyBAQAogI2VuZGlmCS8qIERFQlVHICovCiB9CiAKLXZvaWQgc210X3N0b3Bfd2F0Y2hkb2coc3RydWN0IHNfc21jICpzbWMpCitzdGF0aWMgdm9pZCBzbXRfc3RvcF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYykKIHsKIAlTS19VTlVTRUQoc21jKSA7CS8qIE1ha2UgTElOVCBoYXBweS4gKi8KICNpZm5kZWYJREVCVUcKQEAgLTE0MjIsMTA0ICsxMzA2LDYgQEAKIH0KIAogI2lmZGVmCVBDSQotc3RhdGljIGNoYXIgZ2V0X3JvbV9ieXRlKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGFkZHIpCi17Ci0JR0VUX1BBR0UoYWRkcikgOwotCXJldHVybiAoUkVBRF9QUk9NKEFERFIoQjJfRkRQKSkpIDsKLX0KLQotLyoKLSAqIFJPTSBpbWFnZSBkZWZpbmVzCi0gKi8KLSNkZWZpbmUJUk9NX1NJR18xCTAKLSNkZWZpbmUgUk9NX1NJR18yCTEKLSNkZWZpbmUgUENJX0RBVEFfMQkweDE4Ci0jZGVmaW5lIFBDSV9EQVRBXzIJMHgxOQotCi0vKgotICogUENJIGRhdGEgc3RydWN0dXJlIGRlZmluZXMKLSAqLwotI2RlZmluZQlWUERfREFUQV8xCTB4MDgKLSNkZWZpbmUJVlBEX0RBVEFfMgkweDA5Ci0jZGVmaW5lIElNQUdFX0xFTl8xCTB4MTAKLSNkZWZpbmUgSU1BR0VfTEVOXzIJMHgxMQotI2RlZmluZQlDT0RFX1RZUEUJMHgxNAotI2RlZmluZQlJTkRJQ0FUT1IJMHgxNQotCi0vKgotICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfdnBkX3JlYWQpCi0gKgltYWNfZHJ2X3ZwZF9yZWFkKHNtYyxidWYsc2l6ZSxpbWFnZSkKLSAqCi0gKiBmdW5jdGlvbglET1dOQ0FMTAkoRkRESVdBUkUpCi0gKgkJcmVhZHMgdGhlIFZQRCBkYXRhIG9mIHRoZSBGUFJPTSBhbmQgd3JpdGVzIGl0IGludG8gdGhlCi0gKgkJYnVmZmVyCi0gKgotICogcGFyYQlidWYJcG9pbnRzIHRvIHRoZSBidWZmZXIgZm9yIHRoZSBWUEQgZGF0YQotICoJc2l6ZQlzaXplIG9mIHRoZSBWUEQgZGF0YSBidWZmZXIKLSAqCWltYWdlCWJvb3QgaW1hZ2U7IGNvZGUgdHlwZSBvZiB0aGUgYm9vdCBpbWFnZQotICoJCWltYWdlID0gMAlJbnRlbCB4ODYsIFBDLUFUIGNvbXBhdGlibGUKLSAqCQkJMQlPUEVOQk9PVCBzdGFuZGFyZCBmb3IgUENJCi0gKgkJCTItRkYJcmVzZXJ2ZWQKLSAqCi0gKiByZXR1cm5zCWxlbgludW1iZXIgb2YgVlBEIGRhdGEgYnl0ZXMgcmVhZCBmb3JtIHRoZSBGUFJPTQotICoJCTwwCW51bWJlciBvZiByZWFkIGJ5dGVzCi0gKgkJPjAJZXJyb3I6IGRhdGEgaW52YWxpZAotICoKLSAqCUVORF9NQU5VQUxfRU5UUlkKLSAqLwotaW50IG1hY19kcnZfdnBkX3JlYWQoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNoYXIgaW1hZ2UpCi17Ci0JdV9zaG9ydAlpYmFzZSA7Ci0JdV9zaG9ydCBwY2lfYmFzZSA7Ci0JdV9zaG9ydCB2cGQgOwotCWludAlsZW4gOwotCi0JbGVuID0gMCA7Ci0JaWJhc2UgPSAwIDsKLQkvKgotCSAqIGFzIGxvbmcgaW1hZ2VzIGRlZmluZWQKLQkgKi8KLQl3aGlsZSAoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStST01fU0lHXzEpID09IDB4NTUgJiYKLQkJKHVfY2hhcikgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStST01fU0lHXzIpID09IDB4YWEpIHsKLQkJLyoKLQkJICogZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGF0YSBzdHJ1Y3R1cmUKLQkJICovCi0JCXBjaV9iYXNlID0gaWJhc2UgKyBnZXRfcm9tX2J5dGUoc21jLGliYXNlK1BDSV9EQVRBXzEpICsKLQkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStQQ0lfREFUQV8yKSA8PCA4KSA7Ci0KLQkJaWYgKGltYWdlID09IGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrQ09ERV9UWVBFKSkgewotCQkJLyoKLQkJCSAqIHdlIGhhdmUgdGhlIHJpZ2h0IGltYWdlLCByZWFkIHRoZSBWUEQgZGF0YQotCQkJICovCi0JCQl2cGQgPSBpYmFzZSArIGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrVlBEX0RBVEFfMSkgKwotCQkJCShnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK1ZQRF9EQVRBXzIpIDw8IDgpIDsKLQkJCWlmICh2cGQgPT0gaWJhc2UpIHsKLQkJCQlicmVhayA7CQkvKiBubyBWUEQgZGF0YSAqLwotCQkJfQotCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyBsZW4rKyxidWYrKyx2cGQrKykgewotCQkJCSpidWYgPSBnZXRfcm9tX2J5dGUoc21jLHZwZCkgOwotCQkJfQotCQkJYnJlYWsgOwotCQl9Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIHRyeSB0aGUgbmV4dCBpbWFnZQotCQkJICovCi0JCQlpZiAoZ2V0X3JvbV9ieXRlKHNtYyxwY2lfYmFzZStJTkRJQ0FUT1IpICYgMHg4MCkgewotCQkJCWJyZWFrIDsJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGltYWdlICovCi0JCQl9Ci0JCQlpYmFzZSA9IGliYXNlICsgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStJTUFHRV9MRU5fMSkgKwotCQkJCShnZXRfcm9tX2J5dGUoc21jLGliYXNlK0lNQUdFX0xFTl8yKSA8PCA4KSA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4obGVuKSA7Ci19Ci0KLXZvaWQgbWFjX2Rydl9wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZml4X3ZhbHVlKQotewotCXNtYy0+aHcucGNpX2ZpeF92YWx1ZSA9IGZpeF92YWx1ZSA7Ci19CiAKIHZvaWQgbWFjX2RvX3BjaV9maXgoc3RydWN0IHNfc21jICpzbWMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jIGIvZHJpdmVycy9uZXQvc2tmcC9lc3MuYwppbmRleCBmZDM5YjRiLi42MmIwMTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZXNzLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogdm9pZCBlc3NfcGFyYV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMpOwogaW50IGVzc19yYWZfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCiAJCQkgIGludCBmcyk7Ci1pbnQgcHJvY2Vzc19id19hbGxvYyhzdHJ1Y3Qgc19zbWMgKnNtYywgbG9uZyBpbnQgcGF5bG9hZCwgbG9uZyBpbnQgb3ZlcmhlYWQpOworc3RhdGljIGludCBwcm9jZXNzX2J3X2FsbG9jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIGludCBwYXlsb2FkLCBsb25nIGludCBvdmVyaGVhZCk7CiAKIAogLyoKQEAgLTM3NSw3ICszNzUsNyBAQAogICogZGV0ZXJtaW5lcyB0aGUgc3luY2hyb25vdXMgYmFuZHdpZHRoLCBzZXQgdGhlIFRTWU5DIHJlZ2lzdGVyIGFuZCB0aGUKICAqIG1pYiB2YXJpYWJsZXMgU0JBUGF5bG9hZCwgU0JBT3ZlcmhlYWQgYW5kIGZkZGlNQUNULU5FRy4KICAqLwotaW50IHByb2Nlc3NfYndfYWxsb2Moc3RydWN0IHNfc21jICpzbWMsIGxvbmcgaW50IHBheWxvYWQsIGxvbmcgaW50IG92ZXJoZWFkKQorc3RhdGljIGludCBwcm9jZXNzX2J3X2FsbG9jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIGludCBwYXlsb2FkLCBsb25nIGludCBvdmVyaGVhZCkKIHsKIAkvKgogCSAqIGRldGVybWluZSB0aGUgc3luY2hyb25vdXMgYmFuZHdpZHRoIChzeW5jX2J3KSBpbiBieXRlcyBwZXIgVC1ORUcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYyBiL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jCmluZGV4IDc2ZTc4NDQuLmEyZWQ0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jCkBAIC0xMTE3LDMwICsxMTE3LDYgQEAKIC8qCiAJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzIpCiAKLQlpbnQgbWFjX3NldF9mdW5jX2FkZHIoc21jLGZfYWRkcikKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0JdV9sb25nIGZfYWRkciA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKLQkJU2V0IGEgVG9rZW4tUmluZyBmdW5jdGlvbmFsIGFkZHJlc3MsIHRoZSBhZGRyZXNzIHdpbGwKLQkJYmUgYWN0aXZhdGVkIGFmdGVyIGNhbGxpbmcgbWFjX3VwZGF0ZV9tdWx0aWNhc3QoKQotCi1QYXJhCWZfYWRkcglmdW5jdGlvbmFsIGJpdHMgaW4gbm9uLWNhbm9uaWNhbCBmb3JtYXQKLQotUmV0dXJucwkwOiBhbHdheXMgc3VjY2VzcwotCi0JRU5EX01BTlVBTF9FTlRSWSgpCi0gKi8KLWludCBtYWNfc2V0X2Z1bmNfYWRkcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZfYWRkcikKLXsKLQlzbWMtPmh3LmZwLmZ1bmNfYWRkciA9IGZfYWRkciA7Ci0JcmV0dXJuKDApIDsKLX0KLQotCi0vKgotCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQotCiAJaW50IG1hY19hZGRfbXVsdGljYXN0KHNtYyxhZGRyLGNhbikKIAlzdHJ1Y3Qgc19zbWMgKnNtYyA7CiAJc3RydWN0IGZkZGlfYWRkciAqYWRkciA7CkBAIC0xMjAzLDUyICsxMTc5LDYgQEAKIH0KIAogLyoKLQlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MikKLQotCXZvaWQgbWFjX2RlbF9tdWx0aWNhc3Qoc21jLGFkZHIsY2FuKQotCXN0cnVjdCBzX3NtYyAqc21jIDsKLQlzdHJ1Y3QgZmRkaV9hZGRyICphZGRyIDsKLQlpbnQgY2FuIDsKLQotRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgZnBsdXN0bS5jKQotCQlEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgbXVsdGljYXN0IHRhYmxlCi0KLVBhcmEJYWRkcglwb2ludGVyIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKLQljYW4JPSAwOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBwaHlzaWNhbCBmb3JtYXQKLQkJPSAxOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBjYW5vbmljYWwgZm9ybWF0Ci0JCXwgMHg4MAlwZXJtYW5lbnQKLQotCUVORF9NQU5VQUxfRU5UUlkoKQotICovCi12b2lkIG1hY19kZWxfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyLCBpbnQgY2FuKQotewotCVNLX0xPQ19ERUNMKHN0cnVjdCBmZGRpX2FkZHIsb3duKSA7Ci0Jc3RydWN0IHNfZnBtYwkqdGIgOwotCi0JaWYgKCEodGIgPSBtYWNfZ2V0X21jX3RhYmxlKHNtYyxhZGRyLCZvd24sMSxjYW4gJiB+MHg4MCkpKQotCQlyZXR1cm4gOwotCS8qCi0JICogcGVybWFuZW50IGFkZHJlc3NlcyBtdXN0IGJlIGRlbGV0ZWQgd2l0aCBwZXJtIGJpdAotCSAqIGFuZCB2aWNlIHZlcnNhCi0JICovCi0JaWYgKCggdGItPnBlcm0gJiYgIChjYW4gJiAweDgwKSkgfHwKLQkgICAgKCF0Yi0+cGVybSAmJiAhKGNhbiAmIDB4ODApKSkgewotCQkvKgotCQkgKiBkZWxldGUgaXQKLQkJICovCi0JCWlmICh0Yi0+bikgewotCQkJdGItPm4tLSA7Ci0JCQlpZiAodGItPnBlcm0pIHsKLQkJCQlzbWMtPmh3LmZwLnNtdF9zbG90c191c2VkLS0gOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc21jLT5ody5mcC5vc19zbG90c191c2VkLS0gOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgogICogbW9kZQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9jbXRkZWYuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9jbXRkZWYuaAppbmRleCA2MDM5ODJkLi5mMmY3NzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2gvY210ZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL2NtdGRlZi5oCkBAIC01MDcsNyArNTA3LDYgQEAKIAkJICAgICAgaW50ICpyZW1vdGUsIGludCAqbWFjKTsKIHZvaWQgcGxjX2NvbmZpZ19tdXgoc3RydWN0IHNfc21jICpzbWMsIGludCBtdXgpOwogdm9pZCBzbV9sZW1fZXZhbHVhdGUoc3RydWN0IHNfc21jICpzbWMpOwotdm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIG1hY191cGRhdGVfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIHNtX3BtX2xzX2xhdGNoKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5LCBpbnQgb25fb2ZmKTsKIHZvaWQgc21fbWFfY29udHJvbChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpOwpAQCAtNTQxLDExICs1NDAsOSBAQAogdV9sb25nIHNtdF9nZXRfdGltZSh2b2lkKTsKIHVfbG9uZyBzbXRfZ2V0X3RpZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIHNtdF90aW1lcl9kb25lKHN0cnVjdCBzX3NtYyAqc21jKTsKLXZvaWQgc210X3NldF9kZWZhdWx0cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIHNtdF9maXh1cF9taWIoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBzbXRfcmVzZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMsIGludCBsZXZlbCk7CiB2b2lkIHNtdF9hZ2VudF90YXNrKHN0cnVjdCBzX3NtYyAqc21jKTsKLXZvaWQgc210X3BsZWFzZV9yZWNvbm5lY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCByZWNvbm5fdGltZSk7CiBpbnQgc210X2NoZWNrX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKIAkJICAgY29uc3QgdV9zaG9ydCBsaXN0W10pOwogdm9pZCBkcml2ZXJfZ2V0X2JpYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYmlhX2FkZHIpOwpAQCAtNTY4LDcgKzU2NSw2IEBACiBpbnQgcGNtX3Jvb3RlZF9zdGF0aW9uKHN0cnVjdCBzX3NtYyAqc21jKTsKIGludCBjZm1fZ2V0X21hY19pbnB1dChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiBpbnQgY2ZtX2dldF9tYWNfb3V0cHV0KHN0cnVjdCBzX3NtYyAqc21jKTsKLWludCBwb3J0X3RvX21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOwogaW50IGNlbV9idWlsZF9wYXRoKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICp0bywgaW50IHBhdGhfaW5kZXgpOwogaW50IHNtX21hY19nZXRfdHhfc3RhdGUoc3RydWN0IHNfc21jICpzbWMpOwogY2hhciAqZ2V0X3BjbXN0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnApOwpAQCAtNTgwLDggKzU3Niw2IEBACiB2b2lkIHNtdF9zZXRfdGltZXN0YW1wKHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgKnApOwogdm9pZCBtYWNfc2V0X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsCWludCBtb2RlKTsKIGludCBtYWNfYWRkX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYWRkciwgaW50IGNhbik7Ci1pbnQgbWFjX3NldF9mdW5jX2FkZHIoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBmX2FkZHIpOwotdm9pZCBtYWNfZGVsX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYWRkciwgaW50IGNhbik7CiB2b2lkIG1hY191cGRhdGVfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgbWFjX2NsZWFyX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIHNldF9mb3JtYWNfdHN5bmMoc3RydWN0IHNfc21jICpzbWMsIGxvbmcgc3luY19idyk7CkBAIC01OTksNyArNTkzLDYgQEAKIGludCBzbXRfc2V0X21hY19vcHZhbHVlcyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CiAKICNpZmRlZiBUQUdfTU9ERQotdm9pZCBtYWNfZHJ2X3BjaV9maXgoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBmaXhfdmFsdWUpOwogdm9pZCBtYWNfZG9fcGNpX2ZpeChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIG1hY19kcnZfY2xlYXJfdHhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBtYWNfZHJ2X3JlcGFpcl9kZXNjcihzdHJ1Y3Qgc19zbWMgKnNtYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oCmluZGV4IDRlMzYwYWYuLjFhNjA2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oCkBAIC0yNjIsMzEgKzI2Miw2IEBACiAJCQkJCShzbWMpLT5ody5mcC50eF9xW3F1ZXVlXS50eF9jdXJyX3B1dAogCiAvKgotICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9UWF9DSEVDSykKLSAqCXZvaWQgSFdNX1RYX0NIRUNLKHNtYyxmcmFtZV9zdGF0dXMsbG93X3dhdGVyKQotICoKLSAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQotICoJCVRoaXMgbWFjcm8gaXMgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgYmVmb3JlIGl0IGxlZnQgaXQncwotICoJCWRyaXZlcl9zZW5kIGZ1bmN0aW9uLiBUaGlzIG1hY3JvIGNhbGxzIG1hY19kcnZfY2xlYXJfdHhkCi0gKgkJaWYgdGhlIGZyZWUgVHhEcyBvZiB0aGUgY3VycmVudCB0cmFuc21pdCBxdWV1ZSBpcyBlcXVhbCBvcgotICoJCWxvd2VyIHRoYW4gdGhlIGdpdmVuIGxvdyB3YXRlciBtYXJrLgotICoKLSAqIHBhcmEJZnJhbWVfc3RhdHVzCXN0YXR1cyBvZiB0aGUgZnJhbWUsIHNlZSBkZXNpZ24gZGVzY3JpcHRpb24KLSAqCWxvd193YXRlcglsb3cgd2F0ZXIgbWFyayBvZiBmcmVlIFR4RCdzCi0gKgotICoJRU5EX01BTlVBTF9FTlRSWQotICovCi0jaWZuZGVmIEhXTV9OT19GTE9XX0NUTAotI2RlZmluZQlIV01fVFhfQ0hFQ0soc21jLGZyYW1lX3N0YXR1cyxsb3dfd2F0ZXIpIHtcCi0JaWYgKChsb3dfd2F0ZXIpPj0oc21jKS0+aHcuZnAudHhfcVsoZnJhbWVfc3RhdHVzKSZRVUVVRV9BMF0udHhfZnJlZSkge1wKLQkJbWFjX2Rydl9jbGVhcl90eGQoc21jKSA7XAotCX1cCi19Ci0jZWxzZQotI2RlZmluZQlIV01fVFhfQ0hFQ0soc21jLGZyYW1lX3N0YXR1cyxsb3dfd2F0ZXIpCW1hY19kcnZfY2xlYXJfdHhkKHNtYykKLSNlbmRpZgotCi0vKgogICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfUlhfRlJBR19MRU4pCiAgKglpbnQgSFdNX0dFVF9SWF9GUkFHX0xFTihyeGQpCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmggYi9kcml2ZXJzL25ldC9za2ZwL2gvb3NkZWYxc3QuaAppbmRleCA1MzU5ZWI1Li43NjNjYTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2gvb3NkZWYxc3QuaAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvb3NkZWYxc3QuaApAQCAtMjAsNiArMjAsOCBAQAogLy8gSFdNIChIYXJkV2FyZSBNb2R1bGUpIERlZmluaXRpb25zCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOCiAjZGVmaW5lIExJVFRMRV9FTkRJQU4KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2h3bXRtLmMgYi9kcml2ZXJzL25ldC9za2ZwL2h3bXRtLmMKaW5kZXggMThkNDI5MC4uNDM4ZjQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9od210bS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaHdtdG0uYwpAQCAtODYsNiArODYsNyBAQAogc3RhdGljIHVfbG9uZyByZXBhaXJfcnhkX3Jpbmcoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3NtdF9yeF9xdWV1ZSAqcXVldWUpOwogc3RhdGljIFNNYnVmKiBnZXRfbGxjX3J4KHN0cnVjdCBzX3NtYyAqc21jKTsKIHN0YXRpYyBTTWJ1ZiogZ2V0X3R4ZF9tYihzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiAKIC8qCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQ2LDcgKzE0Nyw2IEBACiAqLwogdm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBmZGRpX2lzcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Ci12b2lkIG1hY19kcnZfY2xlYXJfdHhkKHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgc210X2ZyZWVfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKIHZvaWQgaW5pdF9kcml2ZXJfZnBsdXMoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKQEAgLTE1OCw3ICsxNTgsNiBAQAogdm9pZCBod21fcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBmYXIgKnZpcnQsIHVfbG9uZyBwaHlzLCBpbnQgbGVuLAogCQkgaW50IGZyYW1lX3N0YXR1cyk7CiAKLWludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKTsKIGludCBtYWNfZHJ2X2luaXQoc3RydWN0IHNfc21jICpzbWMpOwogaW50IGh3bV90eF9pbml0KHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgZmMsIGludCBmcmFnX2NvdW50LCBpbnQgZnJhbWVfbGVuLAogCQlpbnQgZnJhbWVfc3RhdHVzKTsKQEAgLTE0NDgsMzUgKzE0NDcsNiBAQAogCU5ERF9UUkFDRSgiUkhmRSIscixBSVhfUkVWRVJTRShyLT5yeGRfcmJhZHIpLDApIDsKIH0KIAotI2lmbmRlZglORElTX09TMgotLyoKLSAqCUJFR0lOX01BTlVBTF9FTlRSWShtYWNfZHJ2X3J4X2ZyYWcpCi0gKglpbnQgbWFjX2Rydl9yeF9mcmFnKHNtYyx2aXJ0LGxlbikKLSAqCi0gKiBmdW5jdGlvbglET1dOQ0FMTAkoaHdtdG0uYykKLSAqCQltYWNfZHJ2X3J4X2ZyYWcgZmlsbHMgdGhlIGZyYWdtZW50IHdpdGggYSBwYXJ0IG9mIHRoZSBmcmFtZS4KLSAqCi0gKiBwYXJhCXZpcnQJdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZnJhZ21lbnQKLSAqCWxlbgl0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBmcmFnbWVudAotICoKLSAqIHJldHVybiAwOglzdWNjZXNzIGNvZGUsIG5vIGVycm9ycyBwb3NzaWJsZQotICoKLSAqCUVORF9NQU5VQUxfRU5UUlkKLSAqLwotaW50IG1hY19kcnZfcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgdm9pZCBmYXIgKnZpcnQsIGludCBsZW4pCi17Ci0JTkREX1RSQUNFKCJSSFNCIix2aXJ0LGxlbixzbWMtPm9zLmh3bS5yLm1iX3BvcykgOwotCi0JREJfUlgoInJlY2VpdmUgZnJvbSBxdWV1ZTogbGVuL3ZpcnQ6ID0gJWQvJXgiLGxlbix2aXJ0LDQpIDsKLQltZW1jcHkoKGNoYXIgZmFyICopdmlydCxzbWMtPm9zLmh3bS5yLm1iX3BvcyxsZW4pIDsKLQlzbWMtPm9zLmh3bS5yLm1iX3BvcyArPSBsZW4gOwotCi0JTkREX1RSQUNFKCJSSFNFIixzbWMtPm9zLmh3bS5yLm1iX3BvcywwLDApIDsKLQlyZXR1cm4oMCkgOwotfQotI2VuZGlmCi0KLQogLyoKICAqCUJFR0lOTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9jbGVhcl9yeF9xdWV1ZSkKICAqCkBAIC0xOTc4LDcgKzE5NDgsNyBAQAogICoKICAqCUVORF9NQU5VQUxfRU5UUlkKICAqLwotdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3N0YXRpYyB2b2lkIG1hY19kcnZfY2xlYXJfdHhkKHN0cnVjdCBzX3NtYyAqc21jKQogewogCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSAqcXVldWUgOwogCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnQxIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9sbmtzdGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTI0ODAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9sbmtzdGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKLSAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgotICoKLSAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLQlJQk0gRkRESSByZWFkIGVycm9yIGxvZyBmdW5jdGlvbgotKi8KLQotI2luY2x1ZGUgImgvdHlwZXMuaCIKLSNpbmNsdWRlICJoL2ZkZGkuaCIKLSNpbmNsdWRlICJoL3NtYy5oIgotI2luY2x1ZGUgImgvbG5rc3RhdC5oIgotCi0jaWZuZGVmCWxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpbG5rc3RhdC5jCTEuOCA5Ny8wNC8xMSAoQykgU0sgIiA7Ci0jZW5kaWYKLQotI2lmZGVmCXN1bgotI2RlZmluZSBfZmFyCi0jZW5kaWYKLQotI2RlZmluZSBFTF9JU19PSyh4LGwpCSgoKChpbnQpJigoKHN0cnVjdCBzX2Vycm9yX2xvZyAqKTApLT54KSkgKyBcCi0JCQlzaXplb2YoZXItPngpKSA8PSBsKQotCi0vKgotCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsxMSkKLQotCXVfbG9uZyBzbXRfZ2V0X2Vycm9yX3dvcmQoc21jKQotCXN0cnVjdCBzX3NtYyAqc21jIDsKLQotRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQotCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgZXJyb3Igd29yayBmb3IgQUlYIGV2ZW50cy4KLQotUmV0dXJuCXNtdF9lcnJvcl93b3JkCVRoZXNlIGJpdHMgYXJlIHN1cHBvcnRlZDoKLQotCQlTTVRfRVJMX0FMQwk9PSAJW1BTL1BBXS5mZGRpUE9SVExlckZsYWcKLQkJU01UX0VSTF9CTEMJPT0JW1BCXS5mZGRpUE9SVExlckZsYWcKLQkJU01UX0VSTF9OQ0MJPT0JZmRkaU1BQ05vdENvcGllZEZsYWcKLQkJU01UX0VSTF9GRUMJPT0JZmRkaU1BQ0ZyYW1lRXJyb3JGbGFnCi0KLQlFTkRfTUFOVUFMX0VOVFJZKCkKLSAqLwotdV9sb25nIHNtdF9nZXRfZXJyb3Jfd29yZChzdHJ1Y3Qgc19zbWMgKnNtYykKLXsKLQl1X2xvbmcJc3Q7Ci0KLQkvKgotCSAqIHNtdCBlcnJvciB3b3JkIGxvdwotCSAqLwotCXN0ID0gMCA7Ci0JaWYgKHNtYy0+cy5zYXMgPT0gU01UX1NBUykgewotCQlpZiAoc21jLT5taWIucFtQU10uZmRkaVBPUlRMZXJGbGFnKQotCQkJc3QgfD0gU01UX0VSTF9BTEMgOwotCX0KLQllbHNlIHsKLQkJaWYgKHNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTGVyRmxhZykKLQkJCXN0IHw9IFNNVF9FUkxfQUxDIDsKLQkJaWYgKHNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyRmxhZykKLQkJCXN0IHw9IFNNVF9FUkxfQkxDIDsKLQl9Ci0JaWYgKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZEZsYWcpCi0JCXN0IHw9IFNNVF9FUkxfTkNDIDsJCS8qIG5vdCBjb3BpZWQgY29uZGl0aW9uICovCi0JaWYgKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0ZyYW1lRXJyb3JGbGFnKQotCQlzdCB8PSBTTVRfRVJMX0ZFQyA7CQkvKiBmcmFtZSBlcnJvciBjb25kaXRpb24gKi8KLQotCXJldHVybiBzdDsKLX0KLQotLyoKLQlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCi0KLQl1X2xvbmcgc210X2dldF9ldmVudF93b3JkKHNtYykKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGxua3N0YXQuYykKLQkJVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgU01UIGV2ZW50IHdvcmsgZm9yIEFJWCBldmVudHMuCi0KLVJldHVybglzbXRfZXZlbnRfd29yZAlhbHdheXMgMAotCi0JRU5EX01BTlVBTF9FTlRSWSgpCi0gKi8KLXVfbG9uZyBzbXRfZ2V0X2V2ZW50X3dvcmQoc3RydWN0IHNfc21jICpzbWMpCi17Ci0JcmV0dXJuICh1X2xvbmcpIDA7Ci19Ci0KLS8qCi0JQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzExKQotCi0JdV9sb25nIHNtdF9nZXRfcG9ydF9ldmVudF93b3JkKHNtYykKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGxua3N0YXQuYykKLQkJVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgU01UIHBvcnQgZXZlbnQgd29yayBmb3IgQUlYIGV2ZW50cy4KLQotUmV0dXJuCXNtdF9wb3J0X2V2ZW50X3dvcmQJYWx3YXlzIDAKLQotCUVORF9NQU5VQUxfRU5UUlkoKQotICovCi11X2xvbmcgc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc3RydWN0IHNfc21jICpzbWMpCi17Ci0JcmV0dXJuICh1X2xvbmcpIDA7Ci19Ci0KLS8qCi0JQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzExKQotCi0JdV9sb25nIHNtdF9yZWFkX2Vycm9ybG9nKHNtYyxwLGxlbikKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0JY2hhciBfZmFyICpwIDsKLQlpbnQgbGVuIDsKLQotRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQotCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgZXJyb3IgbG9nIGZpZWxkIGZvciBBSVggZXZlbnRzLgotCi1QYXJhCXAJcG9pbnRlciB0byB0aGUgZXJyb3IgbG9nIGZpZWxkCi0JbGVuCWxlbiBvZiB0aGUgZXJyb3IgbG9nIGZpZWxkCi0KLVJldHVybglsZW4JdXNlZCBsZW4gb2YgdGhlIGVycm9yIGxvZyBmaWVsZAotCi0JRU5EX01BTlVBTF9FTlRSWSgpCi0gKi8KLWludCBzbXRfcmVhZF9lcnJvcmxvZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBfZmFyICpwLCBpbnQgbGVuKQotewotCWludAkJCWkgOwotCWludAkJCXN0IDsKLQlzdHJ1Y3Qgc19lcnJvcl9sb2cgX2ZhcgkqZXIgOwotCi0JZXIgPSAoc3RydWN0IHNfZXJyb3JfbG9nIF9mYXIgKikgcCA7Ci0JaWYgKGxlbiA+IHNpemVvZihzdHJ1Y3Qgc19lcnJvcl9sb2cpKQotCQlsZW4gPSBzaXplb2Yoc3RydWN0IHNfZXJyb3JfbG9nKSA7Ci0JZm9yIChpID0gMCA7IGkgPCBsZW4gOyBpKyspCi0JCSpwKysgPSAwIDsKLQkvKgotCSAqIHNldCBjb3VudAotCSAqLwotCWlmIChFTF9JU19PSyhzZXRfY291bnRfaGlnaCxsZW4pKSB7Ci0JCWVyLT5zZXRfY291bnRfbG93ID0gKHVfc2hvcnQpc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50IDsKLQkJZXItPnNldF9jb3VudF9oaWdoID0KLQkJCSh1X3Nob3J0KShzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQuY291bnQgPj4gMTZMKSA7Ci0JfQotCS8qCi0JICogYWNpCi0JICovCi0JaWYgKEVMX0lTX09LKGFjaV9pZF9jb2RlLGxlbikpIHsKLQkJZXItPmFjaV9pZF9jb2RlID0gMCA7Ci0JfQotCS8qCi0JICogcHVyZ2UgY291bnRlciBpcyBtaXNzZWQgZnJhbWVzOyAxNiBiaXRzIG9ubHkKLQkgKi8KLQlpZiAoRUxfSVNfT0socHVyZ2VfZnJhbWVfY291bnRlcixsZW4pKSB7Ci0JCWlmIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNDb3BpZWRfQ3QgPiAweGZmZmYpCi0JCQllci0+cHVyZ2VfZnJhbWVfY291bnRlciA9IDB4ZmZmZiA7Ci0JCWVsc2UKLQkJCWVyLT5wdXJnZV9mcmFtZV9jb3VudGVyID0KLQkJCQkodV9zaG9ydClzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNDb3BpZWRfQ3QgOwotCX0KLQkvKgotCSAqIENNVCBhbmQgUk1UIHN0YXRlIG1hY2hpbmVzCi0JICovCi0JaWYgKEVMX0lTX09LKGVjbV9zdGF0ZSxsZW4pKQotCQllci0+ZWNtX3N0YXRlID0gc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlIDsKLQotCWlmIChFTF9JU19PSyhwY21fYl9zdGF0ZSxsZW4pKSB7Ci0JCWlmIChzbWMtPnMuc2FzID09IFNNVF9TQVMpIHsKLQkJCWVyLT5wY21fYV9zdGF0ZSA9IHNtYy0+eVtQU10ubWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKLQkJCWVyLT5wY21fYl9zdGF0ZSA9IDAgOwotCQl9Ci0JCWVsc2UgewotCQkJZXItPnBjbV9hX3N0YXRlID0gc21jLT55W1BBXS5taWItPmZkZGlQT1JUUENNU3RhdGUgOwotCQkJZXItPnBjbV9iX3N0YXRlID0gc21jLT55W1BCXS5taWItPmZkZGlQT1JUUENNU3RhdGUgOwotCQl9Ci0JfQotCWlmIChFTF9JU19PSyhjZm1fc3RhdGUsbGVuKSkKLQkJZXItPmNmbV9zdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA7Ci0JaWYgKEVMX0lTX09LKHJtdF9zdGF0ZSxsZW4pKQotCQllci0+cm10X3N0YXRlID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgOwotCi0JLyoKLQkgKiBzbXQgZXJyb3Igd29yZCBsb3cgKHdlIG9ubHkgbmVlZCB0aGUgbG93IG9yZGVyIDE2IGJpdHMuKQotCSAqLwotCi0Jc3QgPSBzbXRfZ2V0X2Vycm9yX3dvcmQoc21jKSAmIDB4ZmZmZiA7Ci0KLQlpZiAoRUxfSVNfT0soc210X2Vycm9yX2xvdyxsZW4pKQotCQllci0+c210X2Vycm9yX2xvdyA9IHN0IDsKLQotCWlmIChFTF9JU19PSyh1Y29kZV92ZXJzaW9uX2xldmVsLGxlbikpCi0JCWVyLT51Y29kZV92ZXJzaW9uX2xldmVsID0gMHgwMTAxIDsKLQlyZXR1cm4obGVuKSA7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMgYi9kcml2ZXJzL25ldC9za2ZwL3BjbXBsYy5jCmluZGV4IDU3MWYwNTUuLmNkMGFhNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9wY21wbGMuYwpAQCAtMTg2MSwxMyArMTg2MSw2IEBACiAjZW5kaWYKIH0KIAotdm9pZCBwY21fc2V0X2xjdF9zaG9ydChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG4pCi17Ci0JaWYgKG4gPD0gMCB8fCBuID4gMTAwMCkKLQkJcmV0dXJuIDsKLQlzbWMtPnMubGN0X3Nob3J0ID0gbiA7Ci19Ci0KICNpZmRlZglERUJVRwogLyoKICAqIGZpbGwgc3RhdGUgc3RydWN0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3BtZi5jIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwppbmRleCBmMmI0NDZkLi5lZmM2MzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3BtZi5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcG1mLmMKQEAgLTM2LDEyICszNiwxMyBAQAogc3RhdGljIGludCBzbXRfY2hlY2tfc2V0X2NvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20pOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzX3BfdGFiKiBzbXRfZ2V0X3B0YWIodV9zaG9ydCBwYXJhKTsKIHN0YXRpYyBpbnQgc210X21pYl9waHlzKHN0cnVjdCBzX3NtYyAqc21jKTsKLWludCBzbXRfc2V0X3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcGFyYSAqcGEsIGludCBpbmRleCwgaW50IGxvY2FsLAotCQkgaW50IHNldCk7CitzdGF0aWMgaW50IHNtdF9zZXRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wYXJhICpwYSwgaW50IGluZGV4LAorCQkJaW50IGxvY2FsLCBpbnQgc2V0KTsKIHZvaWQgc210X2FkZF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19wY29uICpwY29uLCB1X3Nob3J0IHBhcmEsCiAJCSAgaW50IGluZGV4LCBpbnQgbG9jYWwpOwogc3RhdGljIFNNYnVmICpzbXRfYnVpbGRfcG1mX3Jlc3BvbnNlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqcmVxLAogCQkJCSAgICAgaW50IHNldCwgaW50IGxvY2FsKTsKK3N0YXRpYyBpbnQgcG9ydF90b19taWIoc3RydWN0IHNfc21jICpzbWMsIGludCBwKTsKIAogI2RlZmluZSBNT0ZGU1MoZSkJKChpbnQpJigoKHN0cnVjdCBmZGRpX21pYiAqKTApLT5lKSkKICNkZWZpbmUgTU9GRlNBKGUpCSgoaW50KSAoKChzdHJ1Y3QgZmRkaV9taWIgKikwKS0+ZSkpCkBAIC0xMDc4LDggKzEwNzksOCBAQAogLyoKICAqIHNldCBwYXJhbWV0ZXIKICAqLwotaW50IHNtdF9zZXRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wYXJhICpwYSwgaW50IGluZGV4LCBpbnQgbG9jYWwsCi0JCSBpbnQgc2V0KQorc3RhdGljIGludCBzbXRfc2V0X3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcGFyYSAqcGEsIGludCBpbmRleCwKKwkJCWludCBsb2NhbCwgaW50IHNldCkKIHsKICNkZWZpbmUgSUZTRVQoeCkJaWYgKHNldCkgKHgpCiAKQEAgLTE1NDksNyArMTU1MCw3IEBACiAjZW5kaWYKIH0KIAotaW50IHBvcnRfdG9fbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKK3N0YXRpYyBpbnQgcG9ydF90b19taWIoc3RydWN0IHNfc21jICpzbWMsIGludCBwKQogewogI2lmZGVmCUNPTkNFTlRSQVRPUgogCVNLX1VOVVNFRChzbWMpIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCmluZGV4IGM4OGFhZDYuLjRiNWVkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwpAQCAtMTQ5LDcgKzE0OSw2IEBACiBleHRlcm4gdm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKIGV4dGVybiB2b2lkIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3R4X2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBxdWV1ZSk7Ci1leHRlcm4gdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2ZkZGlfcGNpX3RibFtdID0gewogCXsgUENJX1ZFTkRPUl9JRF9TSywgUENJX0RFVklDRV9JRF9TS19GUCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210LmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdC5jCmluZGV4IDcxOTM1ZWEuLmYxN2MwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zbXQuYwpAQCAtODYsNyArODYsNyBAQAogc3RhdGljIHZvaWQgc210X3NlbmRfc2lmX29wZXJhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKIAkJCQkgICB1X2xvbmcgdGlkLCBpbnQgbG9jYWwpOwogI2lmZGVmIExJVFRMRV9FTkRJQU4KLXN0YXRpYyB2b2lkIHNtdF9zdHJpbmdfc3dhcCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNtdF9zdHJpbmdfc3dhcChjaGFyICpkYXRhLCBjb25zdCBjaGFyICpmb3JtYXQsIGludCBsZW4pOwogI2VuZGlmCiBzdGF0aWMgdm9pZCBzbXRfYWRkX2ZyYW1lX2xlbihTTWJ1ZiAqbWIsIGludCBsZW4pOwogc3RhdGljIHZvaWQgc210X2ZpbGxfdW5hKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfdW5hICp1bmEpOwpAQCAtMTEwLDcgKzExMCw3IEBACiBzdGF0aWMgdm9pZCBzbXRfZmlsbF9lY2hvKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfZWNobyAqZWNobywgdV9sb25nIHNlZWQsCiAJCQkgIGludCBsZW4pOwogCi12b2lkIHNtdF9jbGVhcl91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIHNtdF9jbGVhcl91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKTsKIHN0YXRpYyB2b2lkIHNtdF9jbGVhcl9vbGRfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CiAjaWZkZWYJQ09OQ0VOVFJBVE9SCiBzdGF0aWMgaW50IGVudGl0eV90b19pbmRleCh2b2lkKTsKQEAgLTExOCw3ICsxMTgsNyBAQAogc3RhdGljIHZvaWQgdXBkYXRlX2RhYyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJlcG9ydCk7CiBzdGF0aWMgaW50IGRpdl9yYXRpbyh1X2xvbmcgdXBwZXIsIHVfbG9uZyBsb3dlcik7CiAjaWZkZWYgIFVTRV9DQU5fQUREUgotdm9pZAlod21fY29udl9jYW4oc3RydWN0IHNfc21jICpzbWMsIGNoYXIgKmRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQJaHdtX2NvbnZfY2FuKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKICNlbHNlCiAjZGVmaW5lCQlod21fY29udl9jYW4oc21jLGRhdGEsbGVuKQogI2VuZGlmCkBAIC0yMTYsMjQgKzIxNiw2IEBACiAJREJfU01UKCJTTVQgYWdlbnQgdGFza1xuIiwwLDApIDsKIH0KIAotdm9pZCBzbXRfcGxlYXNlX3JlY29ubmVjdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJlY29ubl90aW1lKQotLyogc3RydWN0IHNfc21jCSpzbWM7ICBQb2ludGVyIHRvIFNNVCBjb250ZXh0ICovCi0vKiBpbnQgcmVjb25uX3RpbWU7ICAgIFdhaXQgZm9yIHJlY29ubmVjdCB0aW1lIGluIHNlY29uZHMgKi8KLXsKLQkvKgotCSAqIFRoZSBwbGVhc2UgcmVjb25uZWN0IHZhcmlhYmxlIGlzIHVzZWQgYXMgYSB0aW1lci4KLQkgKiBJdCBpcyBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgc210X2V2ZW50IGlzIGNhbGxlZC4KLQkgKiBUaGlzIGhhcHBlbnMgZXZlcnkgc2Vjb25kIG9yIHdoZW4gc210X2ZvcmNlX2lycSBpcyBjYWxsZWQuCi0JICogTm90ZTogc210X2ZvcmNlX2lycSAoKSBpcyBjYWxsZWQgb24gc29tZSBwYWNrZXQgcmVjZWl2ZXMgYW5kCi0JICogICAgICAgd2hlbiBhIG11bHRpY2FzdCBhZGRyZXNzIGlzIGNoYW5nZWQuIFNpbmNlIG5vdGhpbmcKLQkgKiAgICAgICBpcyByZWNlaXZlZCBkdXJpbmcgdGhlIGRpc2Nvbm5lY3QgYW5kIHRoZSBtdWx0aWNhc3QKLQkgKiAgICAgICBhZGRyZXNzIGNoYW5nZXMgY2FuIGJlIHZpZXdlZCBhcyBub3QgdmVyeSBvZnRlbiBhbmQKLQkgKiAgICAgICB0aGUgdGltZXIgcnVucyBvdXQgY2xvc2UgdG8gaXRzIGdpdmVuIHZhbHVlCi0JICogICAgICAgKHJlY29ubl90aW1lKS4KLQkgKi8KLQlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgPSByZWNvbm5fdGltZSA7Ci19Ci0KICNpZm5kZWYgU01UX1JFQUxfVE9LRU5fQ1QKIHZvaWQgc210X2VtdWxhdGVfdG9rZW5fY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWNfaW5kZXgpCiB7CkBAIC0xNTc0LDcgKzE1NTYsNyBAQAogICogY2xlYXIgRE5BIGFuZCBVTkEKICAqIGNhbGxlZCBmcm9tIENGTSBpZiBjb25maWd1cmF0aW9uIGNoYW5nZXMKICAqLwotdm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYykKK3N0YXRpYyB2b2lkIHNtdF9jbGVhcl91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKQogewogCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyID0gU01UX1Vua25vd24gOwogCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIgPSBTTVRfVW5rbm93biA7CkBAIC0yMDU4LDMwICsyMDQwLDEwIEBACiB9CiAKIC8qCi0gKiBjaGFuZ2UgdG5lZwotICoJc2V0IFRfUmVxIGluIE1JQiAoUGF0aCBBdHRyaWJ1dGUpCi0gKgljYWxjdWxhdGUgbmV3IHZhbHVlcyBmb3IgTUFDCi0gKglpZiBjaGFuZ2UgcmVxdWlyZWQKLSAqCQlkaXNjb25uZWN0Ci0gKgkJc2V0IHJlY29ubmVjdAotICoJZW5kCi0gKi8KLXZvaWQgc210X2NoYW5nZV90X25lZyhzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHRuZWcpCi17Ci0Jc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhNYXhUX1JlcSA9IHRuZWcgOwotCi0JaWYgKHNtdF9zZXRfbWFjX29wdmFsdWVzKHNtYykpIHsKLQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOwotCQlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgPSAxIDsKLQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19ESVNDT05ORUNUKSA7Ci0JfQotfQotCi0vKgogICogY2Fub25pY2FsIGNvbnZlcnNpb24gb2YgPGxlbj4gYnl0ZXMgYmVnaW5uaW5nIGZvcm0gKmRhdGEKICAqLwogI2lmZGVmICBVU0VfQ0FOX0FERFIKLXZvaWQgaHdtX2NvbnZfY2FuKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgaHdtX2NvbnZfY2FuKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpkYXRhLCBpbnQgbGVuKQogewogCWludCBpIDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXRkZWYuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc210ZGVmLmMKaW5kZXggNWEwYzhkYi4uNGUwN2ZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9zbXRkZWYuYworKysgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCkBAIC03NiwxMSArNzYsNiBAQAogc3RhdGljIHZvaWQgc210X2luaXRfbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGV2ZWwpOwogc3RhdGljIGludCBzZXRfbWluX21heChpbnQgbWF4ZmxhZywgdV9sb25nIG1pYiwgdV9sb25nIGxpbWl0LCB1X2xvbmcgKm9wZXIpOwogCi12b2lkIHNtdF9zZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMpCi17Ci0Jc210X3Jlc2V0X2RlZmF1bHRzKHNtYywwKSA7Ci19Ci0KICNkZWZpbmUgTVMyQkNMSyh4KQkoKHgpKjEyNTAwTCkKICNkZWZpbmUgVVMyQkNMSyh4KQkoKHgpKjEyNTBMKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NtdHBhcnNlLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdHBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Nzc5ZTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCi0gKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KLSAqCi0gKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLQlwYXJzZXIgZm9yIFNNVCBwYXJhbWV0ZXJzCi0qLwotCi0jaW5jbHVkZSAiaC90eXBlcy5oIgotI2luY2x1ZGUgImgvZmRkaS5oIgotI2luY2x1ZGUgImgvc21jLmgiCi0jaW5jbHVkZSAiaC9zbXRfcC5oIgotCi0jZGVmaW5lIEtFUk5FTAotI2luY2x1ZGUgImgvc210c3RhdGUuaCIKLQotI2lmbmRlZglsaW50Ci1zdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdHBhcnNlLmMJMS4xMiA5OC8xMC8wNiAoQykgU0sgIiA7Ci0jZW5kaWYKLQotI2lmZGVmCXN1bgotI2RlZmluZSBfZmFyCi0jZW5kaWYKLQotLyoKLSAqIGNvbnZlcnQgdG8gQkNMSyB1bml0cwotICovCi0jZGVmaW5lIE1TMkJDTEsoeCkgICAgICAoKHgpKjEyNTAwTCkKLSNkZWZpbmUgVVMyQkNMSyh4KSAgICAgICgoeC8xMCkqMTI1TCkKLQotLyoKLSAqIHBhcmFtZXRlciB0YWJsZQotICovCi1zdGF0aWMgc3RydWN0IHNfcHRhYiB7Ci0JY2hhcgkqcHRfbmFtZSA7Ci0JdV9zaG9ydAlwdF9udW0gOwotCXVfc2hvcnQJcHRfdHlwZSA7Ci0JdV9sb25nCXB0X21pbiA7Ci0JdV9sb25nCXB0X21heCA7Ci19IHB0YWJbXSA9IHsKLQl7ICJQTUZQQVNTV0QiLDAsCTAgfSAsCi0JeyAiVVNFUkRBVEEiLDEsCQkwIH0gLAotCXsgIkxFUkNVVE9GRkEiLDIsCTEsCTQsCTE1CX0gLAotCXsgIkxFUkNVVE9GRkIiLDMsCTEsCTQsCTE1CX0gLAotCXsgIkxFUkFMQVJNQSIsNCwJMSwJNCwJMTUJfSAsCi0JeyAiTEVSQUxBUk1CIiw1LAkxLAk0LAkxNQl9ICwKLQl7ICJUTUFYIiw2LAkJMSwJNSwJMTY1CX0gLAotCXsgIlRNSU4iLDcsCQkxLAk1LAkxNjUJfSAsCi0JeyAiVFJFUSIsOCwJCTEsCTUsCTE2NQl9ICwKLQl7ICJUVlgiLDksCQkxLAkyNTAwLAkxMDAwMAl9ICwKLSNpZmRlZiBFU1MKLQl7ICJTQkFQQVlMT0FEIiwxMCwJMSwJMCwJMTU2Mgl9ICwKLQl7ICJTQkFPVkVSSEVBRCIsMTEsCTEsCTUwLAk1MDAwCX0gLAotCXsgIk1BWFRORUciLDEyLAkJMSwJNSwJMTY1CX0gLAotCXsgIk1JTlNFR01FTlRTSVpFIiwxMywJMSwJMCwJNDQ3OAl9ICwKLQl7ICJTQkFDQVRFR09SWSIsMTQsCTEsCTAsCTB4ZmZmZgl9ICwKLQl7ICJTWU5DSFRYTU9ERSIsMTUsCTAgfSAsCi0jZW5kaWYKLSNpZmRlZiBTQkEKLQl7ICJTQkFDT01NQU5EIiwxNiwJMCB9ICwKLQl7ICJTQkFBVkFJTEFCTEUiLDE3LAkxLAkwLAkxMDAJfSAsCi0jZW5kaWYKLQl7IE5VTEwgfQotfSA7Ci0KLS8qIERlZmluZSBtYXhpbXVtIHN0cmluZyBzaXplIGZvciB2YWx1ZXMgYW5kIGtleWJ1ZmZlciAqLwotI2RlZmluZSBNQVhfVkFMCTQwCi0KLS8qCi0gKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAqLwotc3RhdGljIHVfbG9uZyBwYXJzZV9udW0oaW50IHR5cGUsIGNoYXIgX2ZhciAqdmFsdWUsIGNoYXIgKnYsIHVfbG9uZyBtbiwKLQkJCXVfbG9uZyBteCwgaW50IHNjYWxlKTsKLXN0YXRpYyBpbnQgcGFyc2Vfd29yZChjaGFyICpidWYsIGNoYXIgX2ZhciAqdGV4dCk7Ci0KLSNpZmRlZiBTSU0KLSNkZWZpbmUgREJfTUFJTihhLGIsYykJcHJpbnRmKGEsYixjKQotI2Vsc2UKLSNkZWZpbmUgREJfTUFJTihhLGIsYykKLSNlbmRpZgotCi0vKgotICogQkVHSU5fTUFOVUFMX0VOVFJZKCkKLSAqCi0gKglpbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKixjaGFyIF9mYXIgKmtleXdvcmQsaW50IHR5cGUsCi0JCWNoYXIgX2ZhciAqdmFsdWUpCi0gKgotICoJcGFyc2UgU01UIHBhcmFtZXRlcgotICoJKmtleXdvcmQKLSAqCQlwb2ludGVyIHRvIGtleXdvcmQsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKLSAqCSp2YWx1ZQlwb2ludGVyIHRvIHZhbHVlLCBlaXRoZXIgY2hhciAqIG9yIHVfbG9uZyAqCi0gKgkJaWYgY2hhciAqCi0gKgkJCXBvaW50ZXIgdG8gdmFsdWUsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKLSAqCQlpZiB1X2xvbmcgKgotICoJCQljb250YWlucyBiaW5hcnkgdmFsdWUKLSAqCi0gKgl0eXBlCTA6IGludGVnZXIKLSAqCQkxOiBzdHJpbmcKLSAqCXJldHVybgotICoJCTAJcGFyYW1ldGVyIHBhcnNlZCBvawotICoJCSE9IDAJZXJyb3IKLSAqCU5PVEU6Ci0gKgkJZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIERTICE9IFNTCi0gKgotICoKLSAqIEVORF9NQU5VQUxfRU5UUlkoKQotICovCi1pbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBfZmFyICprZXl3b3JkLCBpbnQgdHlwZSwKLQkJICBjaGFyIF9mYXIgKnZhbHVlKQotewotCWNoYXIJCWtleWJ1ZltNQVhfVkFMKzFdOwotCWNoYXIJCXZhbGJ1ZltNQVhfVkFMKzFdOwotCWNoYXIJCWMgOwotCWNoYXIgCQkqcCA7Ci0JY2hhcgkJKnYgOwotCWNoYXIJCSpkIDsKLQl1X2xvbmcJCXZhbCA9IDAgOwotCXN0cnVjdCBzX3B0YWIJKnB0IDsKLQlpbnQJCXN0IDsKLQlpbnQJCWkgOwotCi0JLyoKLQkgKiBwYXJzZSBrZXl3b3JkCi0JICovCi0JaWYgKChzdCA9IHBhcnNlX3dvcmQoa2V5YnVmLGtleXdvcmQpKSkKLQkJcmV0dXJuKHN0KSA7Ci0JLyoKLQkgKiBwYXJzZSB2YWx1ZSBpZiBnaXZlbiBhcyBzdHJpbmcKLQkgKi8KLQlpZiAodHlwZSA9PSAxKSB7Ci0JCWlmICgoc3QgPSBwYXJzZV93b3JkKHZhbGJ1Zix2YWx1ZSkpKQotCQkJcmV0dXJuKHN0KSA7Ci0JfQotCS8qCi0JICogc2VhcmNoIGluIHRhYmxlCi0JICovCi0Jc3QgPSAwIDsKLQlmb3IgKHB0ID0gcHRhYiA7ICh2ID0gcHQtPnB0X25hbWUpIDsgcHQrKykgewotCQlmb3IgKHAgPSBrZXlidWYgOyAoYyA9ICpwKSA7IHArKyx2KyspIHsKLQkJCWlmIChjICE9ICp2KQotCQkJCWJyZWFrIDsKLQkJfQotCQlpZiAoIWMgJiYgISp2KQotCQkJYnJlYWsgOwotCX0KLQlpZiAoIXYpCi0JCXJldHVybigtMSkgOwotI2lmCTAKLQlwcmludGYoIj0+JXM8PT0+JXM8PVxuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKLSNlbmRpZgotCS8qCi0JICogc2V0IHZhbHVlIGluIE1JQgotCSAqLwotCWlmIChwdC0+cHRfdHlwZSkKLQkJdmFsID0gcGFyc2VfbnVtKHR5cGUsdmFsdWUsdmFsYnVmLHB0LT5wdF9taW4scHQtPnB0X21heCwxKSA7Ci0Jc3dpdGNoIChwdC0+cHRfbnVtKSB7Ci0JY2FzZSAwIDoKLQkJdiA9IHZhbGJ1ZiA7Ci0JCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpUFJQTUZQYXNzd2QgOwotCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOyBpKyspCi0JCQkqZCsrID0gKnYrKyA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOwotCQlicmVhayA7Ci0JY2FzZSAxIDoKLQkJdiA9IHZhbGJ1ZiA7Ci0JCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpU01UVXNlckRhdGEgOwotCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOyBpKyspCi0JCQkqZCsrID0gKnYrKyA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOwotCQlicmVhayA7Ci0JY2FzZSAyIDoKLQkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQ3V0b2ZmID0gKHVfY2hhcikgdmFsIDsKLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCi0JCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9DdXRvZmYpIDsKLQkJYnJlYWsgOwotCWNhc2UgMyA6Ci0JCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0N1dG9mZiA9ICh1X2NoYXIpIHZhbCA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAotCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDQgOgotCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9BbGFybSA9ICh1X2NoYXIpIHZhbCA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAotCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQWxhcm0pIDsKLQkJYnJlYWsgOwotCWNhc2UgNSA6Ci0JCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0FsYXJtID0gKHVfY2hhcikgdmFsIDsKLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCi0JCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlcl9BbGFybSkgOwotCQlicmVhayA7Ci0JY2FzZSA2IDoJCQkvKiBUTUFYICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA9Ci0JCQkodV9sb25nKSAtTVMyQkNMSygobG9uZyl2YWwpIDsKLQkJYnJlYWsgOwotCWNhc2UgNyA6CQkJLyogVE1JTiAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKLQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NaW4gPQotCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDggOgkJCS8qIFRSRVEgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPQotCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDkgOgkJCS8qIFRWWCAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZCBcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVFZYTG93ZXJCb3VuZCA9Ci0JCQkodV9sb25nKSAtVVMyQkNMSygobG9uZyl2YWwpIDsKLQkJYnJlYWsgOwotI2lmZGVmCUVTUwotCWNhc2UgMTAgOgkJCS8qIFNCQVBBWUxPQUQgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCWlmIChzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAhPSB2YWwpIHsKLQkJCXNtYy0+ZXNzLnJhZl9hY3RfdGltZXJfcG9sbCA9IFRSVUUgOwotCQkJc21jLT5taWIuZmRkaUVTU1BheWxvYWQgPSB2YWwgOwotCQl9Ci0JCWJyZWFrIDsKLQljYXNlIDExIDoJCQkvKiBTQkFPVkVSSEVBRCAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKLQkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gdmFsIDsKLQkJYnJlYWsgOwotCWNhc2UgMTIgOgkJCS8qIE1BWFRORUcgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmZkZGlFU1NNYXhUTmVnID0gKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDEzIDoJCQkvKiBNSU5TRUdNRU5UU0laRSAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKLQkJc21jLT5taWIuZmRkaUVTU01pblNlZ21lbnRTaXplID0gdmFsIDsKLQkJYnJlYWsgOwotCWNhc2UgMTQgOgkJCS8qIFNCQUNBVEVHT1JZICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5mZGRpRVNTQ2F0ZWdvcnkgPQotCQkJKHNtYy0+bWliLmZkZGlFU1NDYXRlZ29yeSAmIDB4ZmZmZikgfAotCQkJKCh1X2xvbmcpKHZhbCA8PCAxNikpIDsKLQkJYnJlYWsgOwotCWNhc2UgMTUgOgkJCS8qIFNZTkNIVFhNT0RFICovCi0JCS8qIGRvIG5vdCB1c2UgbWVtY21wKHZhbGJ1ZiwiQUxMIiwzKSBiZWNhdXNlIERTICE9IFNTICovCi0JCWlmICh2YWxidWZbMF0gPT0gJ0EnICYmIHZhbGJ1ZlsxXSA9PSAnTCcgJiYgdmFsYnVmWzJdID09ICdMJykgewotCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gVFJVRSA7Ci0JCQlEQl9NQUlOKCJTRVQgJXMgPSAlc1xuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKLQkJfQotCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNQTElUIiw1KSkgeyAqLwotCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1AnICYmIHZhbGJ1ZlsyXSA9PSAnTCcgJiYKLQkJCXZhbGJ1ZlszXSA9PSAnSScgJiYgdmFsYnVmWzRdID09ICdUJykgewotCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7Ci0JCQlzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUgPSBGQUxTRSA7Ci0JCX0KLQkJYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYJU0JBCi0JY2FzZSAxNiA6CQkJLyogU0JBQ09NTUFORCAqLwotCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUQVJUIiw1KSkgeyAqLwotCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1QnICYmIHZhbGJ1ZlsyXSA9PSAnQScgJiYKLQkJCXZhbGJ1ZlszXSA9PSAnUicgJiYgdmFsYnVmWzRdID09ICdUJykgewotCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7Ci0JCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUQVJUIDsKLQkJfQotCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUT1AiLDQpKSB7ICovCi0JCWlmICh2YWxidWZbMF0gPT0gJ1MnICYmIHZhbGJ1ZlsxXSA9PSAnVCcgJiYgdmFsYnVmWzJdID09ICdPJyAmJgotCQkJdmFsYnVmWzNdID09ICdQJykgewotCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7Ci0JCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUT1AgOwotCQl9Ci0JCWJyZWFrIDsKLQljYXNlIDE3IDoJCQkvKiBTQkFBVkFJTEFCTEUgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmZkZGlTQkFBdmFpbGFibGUgPSAodV9jaGFyKSB2YWwgOwotCQlicmVhayA7Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuKDApIDsKLX0KLQotc3RhdGljIGludCBwYXJzZV93b3JkKGNoYXIgKmJ1ZiwgY2hhciBfZmFyICp0ZXh0KQotewotCWNoYXIJCWMgOwotCWNoYXIgCQkqcCA7Ci0JaW50CQlwX2xlbiA7Ci0JaW50CQlxdW90ZSA7Ci0JaW50CQlpIDsKLQlpbnQJCW9rIDsKLQotCS8qCi0JICogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlCi0JICovCi0JcCA9IGJ1ZiA7Ci0JZm9yIChpID0gMCA7IGkgPCBNQVhfVkFMIDsgaSsrKQotCQkqcCsrID0gMCA7Ci0JcCA9IGJ1ZiA7Ci0JcF9sZW4gPSAwIDsKLQlvayA9IDAgOwotCXdoaWxlICggKGMgPSAqdGV4dCsrKSAmJiAoYyAhPSAnXG4nKSAmJiAoYyAhPSAnXHInKSkgewotCQlpZiAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnXHQnKSkgewotCQkJb2sgPSAxIDsKLQkJCWJyZWFrIDsKLQkJfQotCX0KLQlpZiAoIW9rKQotCQlyZXR1cm4oLTEpIDsKLQlpZiAoYyA9PSAnIicpIHsKLQkJcXVvdGUgPSAxIDsKLQl9Ci0JZWxzZSB7Ci0JCXF1b3RlID0gMCA7Ci0JCXRleHQtLSA7Ci0JfQotCS8qCi0JICogcGFyc2UgdmFsYnVmCi0JICovCi0Jb2sgPSAwIDsKLQl3aGlsZSAoIW9rICYmIHBfbGVuIDwgTUFYX1ZBTC0xICYmIChjID0gKnRleHQrKykgJiYgKGMgIT0gJ1xuJykKLQkJJiYgKGMgIT0gJ1xyJykpIHsKLQkJc3dpdGNoIChxdW90ZSkgewotCQljYXNlIDAgOgotCQkJaWYgKChjID09ICcgJykgfHwgKGMgPT0gJ1x0JykgfHwgKGMgPT0gJz0nKSkgewotCQkJCW9rID0gMSA7Ci0JCQkJYnJlYWsgOwotCQkJfQotCQkJKnArKyA9IGMgOwotCQkJcF9sZW4rKyA7Ci0JCQlicmVhayA7Ci0JCWNhc2UgMiA6Ci0JCQkqcCsrID0gYyA7Ci0JCQlwX2xlbisrIDsKLQkJCXF1b3RlID0gMSA7Ci0JCQlicmVhayA7Ci0JCWNhc2UgMSA6Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJyInIDoKLQkJCQlvayA9IDEgOwotCQkJCWJyZWFrIDsKLQkJCWNhc2UgJ1xcJyA6Ci0JCQkJcXVvdGUgPSAyIDsKLQkJCQlicmVhayA7Ci0JCQlkZWZhdWx0IDoKLQkJCQkqcCsrID0gYyA7Ci0JCQkJcF9sZW4rKyA7Ci0JCQl9Ci0JCX0KLQl9Ci0JKnArKyA9IDAgOwotCWZvciAocCA9IGJ1ZiA7IChjID0gKnApIDsgcCsrKSB7Ci0JCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKLQkJCSpwID0gYyArICdBJyAtICdhJyA7Ci0JfQotCXJldHVybigwKSA7Ci19Ci0KLXN0YXRpYyB1X2xvbmcgcGFyc2VfbnVtKGludCB0eXBlLCBjaGFyIF9mYXIgKnZhbHVlLCBjaGFyICp2LCB1X2xvbmcgbW4sCi0JCQl1X2xvbmcgbXgsIGludCBzY2FsZSkKLXsKLQl1X2xvbmcJeCA9IDAgOwotCWNoYXIJYyA7Ci0KLQlpZiAodHlwZSA9PSAwKSB7CQkvKiBpbnRlZ2VyICovCi0JCXVfbG9uZyBfZmFyCSpsIDsKLQkJdV9sb25nCQl1MSA7Ci0KLQkJbCA9ICh1X2xvbmcgX2ZhciAqKSB2YWx1ZSA7Ci0JCXUxID0gKmwgOwotCQkvKgotCQkgKiBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgdGFrZSB0aGUgbG93ZXIgbGltaXQKLQkJICovCi0JCWlmICgobG9uZyl1MSA8IDApIHsKLQkJCWlmICgtICgobG9uZyl1MSkgPiAobG9uZykgbXgpIHsKLQkJCQl1MSA9IDAgOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdTEgPSAodV9sb25nKSAtICgobG9uZyl1MSkgOwotCQkJfQotCQl9Ci0JCXggPSB1MSA7Ci0JfQotCWVsc2UgewkJCQkvKiBzdHJpbmcgKi8KLQkJaW50CXNpZ24gPSAwIDsKLQotCQlpZiAoKnYgPT0gJy0nKSB7Ci0JCQlzaWduID0gMSA7Ci0JCX0KLQkJd2hpbGUgKChjID0gKnYrKykgJiYgKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7Ci0JCQl4ID0geCAqIDEwICsgYyAtICcwJyA7Ci0JCX0KLQkJaWYgKHNjYWxlID09IDEwKSB7Ci0JCQl4ICo9IDEwIDsKLQkJCWlmIChjID09ICcuJykgewotCQkJCWlmICgoYyA9ICp2KyspICYmIChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgewotCQkJCQl4ICs9IGMgLSAnMCcgOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2lnbikKLQkJCXggPSAodV9sb25nKSAtICgobG9uZyl4KSA7Ci0JfQotCS8qCi0JICogaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlCi0JICoJYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBsaW1pdHMKLQkgKgkJdGFrZSB0aGUgbG93ZXIgbGltaXQKLQkgKgllbHNlCi0JICoJCXRha2UgdGhlIGFic291dGUgdmFsdWUKLQkgKi8KLQlpZiAoKGxvbmcpeCA8IDApIHsKLQkJaWYgKC0gKChsb25nKXgpID4gKGxvbmcpIG14KSB7Ci0JCQl4ID0gMCA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl4ID0gKHVfbG9uZykgLSAoKGxvbmcpeCkgOwotCQl9Ci0JfQotCWlmICh4IDwgbW4pCi0JCXJldHVybihtbikgOwotCWVsc2UgaWYgKHggPiBteCkKLQkJcmV0dXJuKG14KSA7Ci0JcmV0dXJuKHgpIDsKLX0KLQotI2lmIDAKLXN0cnVjdAlzX3NtYwlTTUMgOwotbWFpbigpCi17Ci0JY2hhcgkqcCA7Ci0JY2hhcgkqdiA7Ci0JY2hhcglidWZbMTAwXSA7Ci0JaW50CXRvZ2dsZSA9IDAgOwotCi0Jd2hpbGUgKGdldHMoYnVmKSkgewotCQlwID0gYnVmIDsKLQkJd2hpbGUgKCpwICYmICgoKnAgPT0gJyAnKSB8fCAoKnAgPT0gJ1x0JykpKQotCQkJcCsrIDsKLQotCQl3aGlsZSAoKnAgJiYgKCgqcCAhPSAnICcpICYmICgqcCAhPSAnXHQnKSkpCi0JCQlwKysgOwotCi0JCXYgPSBwIDsKLQkJd2hpbGUgKCp2ICYmICgoKnYgPT0gJyAnKSB8fCAoKnYgPT0gJ1x0JykpKQotCQkJdisrIDsKLQkJaWYgKCgqdiA+PSAnMCcpICYmICgqdiA8PSAnOScpKSB7Ci0JCQl0b2dnbGUgPSAhdG9nZ2xlIDsKLQkJCWlmICh0b2dnbGUpIHsKLQkJCQl1X2xvbmcJbCA7Ci0JCQkJbCA9IGF0b2wodikgOwotCQkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMCwoY2hhciBfZmFyICopJmwpIDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzbXRfcGFyc2VfYXJnKCZTTUMsYnVmLDEsKGNoYXIgX2ZhciAqKXApIDsKLQkJfQotCQllbHNlIHsKLQkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMSwoY2hhciBfZmFyICopcCkgOwotCQl9Ci0JfQotCWV4aXQoMCkgOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCAzMGU4ZDU4Li41Y2FjYzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC03LDcgKzcsNyBAQAogICogb2YgdGhlIG9yaWdpbmFsIGRyaXZlciBzdWNoIGFzIGxpbmsgZmFpbC1vdmVyIGFuZCBsaW5rIG1hbmFnZW1lbnQgYmVjYXVzZQogICogdGhvc2Ugc2hvdWxkIGJlIGRvbmUgYXQgaGlnaGVyIGxldmVscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDIsMTkgKzQyLDIwIEBACiAjaW5jbHVkZSAic2tnZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2tnZSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjYiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC43IgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiICIKIAogI2RlZmluZSBERUZBVUxUX1RYX1JJTkdfU0laRQkxMjgKICNkZWZpbmUgREVGQVVMVF9SWF9SSU5HX1NJWkUJNTEyCiAjZGVmaW5lIE1BWF9UWF9SSU5HX1NJWkUJMTAyNAogI2RlZmluZSBNQVhfUlhfUklOR19TSVpFCTQwOTYKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQJMTI4CisjZGVmaW5lIFJYX0JVRl9TSVpFCQkxNTM2CiAjZGVmaW5lIFBIWV9SRVRSSUVTCSAgICAgICAgMTAwMAogI2RlZmluZSBFVEhfSlVNQk9fTVRVCQk5MDAwCiAjZGVmaW5lIFRYX1dBVENIRE9HCQkoNSAqIEhaKQogI2RlZmluZSBOQVBJX1dFSUdIVAkJNjQKICNkZWZpbmUgQkxJTktfSFoJCShIWi80KQotI2RlZmluZSBMSU5LX1BPTExfSFoJCShIWi8xMCkKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXNLb25uZWN0IEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4iKTsKQEAgLTcwLDI4ICs3MSwxNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwPW5vbmUsLi4uLDE2PWFsbCkiKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNrZ2VfaWRfdGFibGVbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDOTQwLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0M5NDBCLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfR0UsCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCi0JeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9ZVSwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg5RTAwLCAvKiBTSy05RXh4ICAqLwotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9ETElOSywgUENJX0RFVklDRV9JRF9ETElOS19ER0U1MTBULAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzMjAsIC8qIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwMDUsIC8qIE1hcnZlbGwgKDExYWIpLCBCZWxraW4gKi8KLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ05FVCwgUENJX0RFVklDRV9JRF9DTkVUX0dJR0FDQVJELAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCBQQ0lfREVWSUNFX0lEX0xJTktTWVNfRUcxMDMyLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCBQQ0lfREVWSUNFX0lEX0xJTktTWVNfRUcxMDY0LAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk0MCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0M5NDBCKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9HRSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfWVUpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg5RTAwKSB9LCAvKiBTSy05RXh4ICAqLworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCBQQ0lfREVWSUNFX0lEX0RMSU5LX0RHRTUxMFQpLCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDMyMCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwMDUpIH0sIC8qIEJlbGtpbiAqLworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NORVQsIFBDSV9ERVZJQ0VfSURfQ05FVF9HSUdBQ0FSRCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCBQQ0lfREVWSUNFX0lEX0xJTktTWVNfRUcxMDMyKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xJTktTWVMsIFBDSV9ERVZJQ0VfSURfTElOS1NZU19FRzEwNjQpIH0sCiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2tnZV9pZF90YWJsZSk7CkBAIC05OSwxOSArODksMjIgQEAKIHN0YXRpYyBpbnQgc2tnZV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgc2tnZV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgc2tnZV90eF9jbGVhbihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKTsKLXN0YXRpYyB2b2lkIHNrZ2VfeG1fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOwotc3RhdGljIHZvaWQgc2tnZV9nbV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCk7CitzdGF0aWMgdm9pZCB4bV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCk7CitzdGF0aWMgdm9pZCBnbV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCk7CiBzdGF0aWMgdm9pZCBnZW5lc2lzX2dldF9zdGF0cyhzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLCB1NjQgKmRhdGEpOwogc3RhdGljIHZvaWQgeXVrb25fZ2V0X3N0YXRzKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UsIHU2NCAqZGF0YSk7CiBzdGF0aWMgdm9pZCB5dWtvbl9pbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpOwogc3RhdGljIHZvaWQgeXVrb25fcmVzZXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCk7CiBzdGF0aWMgdm9pZCBnZW5lc2lzX21hY19pbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpOwogc3RhdGljIHZvaWQgZ2VuZXNpc19yZXNldChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIGdlbmVzaXNfbGlua191cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKTsKIAorLyogQXZvaWQgY29uZGl0aW9uYWxzIGJ5IHVzaW5nIGFycmF5ICovCiBzdGF0aWMgY29uc3QgaW50IHR4cWFkZHJbXSA9IHsgUV9YQTEsIFFfWEEyIH07CiBzdGF0aWMgY29uc3QgaW50IHJ4cWFkZHJbXSA9IHsgUV9SMSwgUV9SMiB9Owogc3RhdGljIGNvbnN0IHUzMiByeGlycW1hc2tbXSA9IHsgSVNfUjFfRiwgSVNfUjJfRiB9Owogc3RhdGljIGNvbnN0IHUzMiB0eGlycW1hc2tbXSA9IHsgSVNfWEExX0YsIElTX1hBMl9GIH07CitzdGF0aWMgY29uc3QgdTMyIHBvcnRpcnFtYXNrW10gPSB7IElTX1BPUlRfMSwgSVNfUE9SVF8yIH07CiAKIC8qIERvbid0IG5lZWQgdG8gbG9vayBhdCB3aG9sZSAxNksuCiAgKiBsYXN0IGludGVyZXN0aW5nIHJlZ2lzdGVyIGlzIGRlc2NyaXB0b3IgcG9sbCB0aW1lci4KQEAgLTE1NCw3ICsxNDcsNyBAQAogc3RhdGljIGludCB3b2xfc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKIHsKIAlyZXR1cm4gISgoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTIHx8Ci0JCSAgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04gJiYgY2hpcF9yZXYoaHcpID09IDApKSk7CisJCSAgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04gJiYgaHctPmNoaXBfcmV2ID09IDApKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNrZ2VfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCkBAIC0xNzAsNyArMTYzLDcgQEAKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKIAotCWlmKHdvbC0+d29sb3B0cyAhPSBXQUtFX01BR0lDICYmIHdvbC0+d29sb3B0cyAhPSAwKQorCWlmICh3b2wtPndvbG9wdHMgIT0gV0FLRV9NQUdJQyAmJiB3b2wtPndvbG9wdHMgIT0gMCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKHdvbC0+d29sb3B0cyA9PSBXQUtFX01BR0lDICYmICF3b2xfc3VwcG9ydGVkKGh3KSkKQEAgLTE5MCw2ICsxODMsMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogRGV0ZXJtaW5lIHN1cHBvcnRlZC9hZHZlcmlzZWQgbW9kZXMgYmFzZWQgb24gaGFyZHdhcmUuCisgKiBOb3RlOiBldGh0b29vbCBBRFZFUlRJU0VEX3h4eCA9PSBTVVBQT1JURURfeHh4CisgKi8KK3N0YXRpYyB1MzIgc2tnZV9zdXBwb3J0ZWRfbW9kZXMoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQoreworCXUzMiBzdXBwb3J0ZWQ7CisKKwlpZiAoaXNjb3BwZXIoaHcpKSB7CisJCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCisJCQl8IFNVUFBPUlRFRF9BdXRvbmVnfCBTVVBQT1JURURfVFA7CisKKwkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwkJCXN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCQkJICAgICB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQkJICAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkJCSAgICAgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCk7CisKKwkJZWxzZSBpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKKwkJCXN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOworCX0gZWxzZQorCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUKKwkJCXwgU1VQUE9SVEVEX0F1dG9uZWc7CisKKwlyZXR1cm4gc3VwcG9ydGVkOworfQogCiBzdGF0aWMgaW50IHNrZ2VfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKQEAgLTE5OCwzOCArMjIxLDEzIEBACiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAKIAllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJZWNtZC0+c3VwcG9ydGVkID0gc2tnZV9zdXBwb3J0ZWRfbW9kZXMoaHcpOwogCiAJaWYgKGlzY29wcGVyKGh3KSkgewotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQotCQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCi0JCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKLQkJCQl8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQOwotCQllbHNlIHsKLQkJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKLQkJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKLQkJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCi0JCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAotCQkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCi0JCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwKLQkJCQl8IFNVUFBPUlRFRF9BdXRvbmVnfCBTVVBQT1JURURfVFA7Ci0KLQkJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OKQotCQkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOwotCi0JCQllbHNlIGlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFKQotCQkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgotCQkJCQkJICAgICB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7Ci0JCX0KLQogCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKIAkJZWNtZC0+cGh5X2FkZHJlc3MgPSBody0+cGh5X2FkZHI7Ci0JfSBlbHNlIHsKLQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCi0JCQl8IFNVUFBPUlRFRF9GSUJSRQotCQkJfCBTVVBQT1JURURfQXV0b25lZzsKLQorCX0gZWxzZQogCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKLQl9CiAKIAllY21kLT5hZHZlcnRpc2luZyA9IHNrZ2UtPmFkdmVydGlzaW5nOwogCWVjbWQtPmF1dG9uZWcgPSBza2dlLT5hdXRvbmVnOwpAQCAtMjM4LDY1ICsyMzYsNTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBza2dlX21vZGVzKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKLXsKLQl1MzIgbW9kZXMgPSBBRFZFUlRJU0VEX0F1dG9uZWcKLQkJfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZgotCQl8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZgotCQl8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7Ci0KLQlpZiAoaXNjb3BwZXIoaHcpKSB7Ci0JCW1vZGVzIHw9IEFEVkVSVElTRURfVFA7Ci0JCXN3aXRjaChody0+Y2hpcF9pZCkgewotCQljYXNlIENISVBfSURfR0VORVNJUzoKLQkJCW1vZGVzICY9IH4oQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCi0JCQkJICAgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYKLQkJCQkgICB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsCi0JCQkJICAgfCBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZik7Ci0JCQlicmVhazsKLQotCQljYXNlIENISVBfSURfWVVLT046Ci0JCQltb2RlcyAmPSB+QURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0hJUF9JRF9ZVUtPTl9GRToKLQkJCW1vZGVzICY9IH4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZnxBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJbW9kZXMgfD0gQURWRVJUSVNFRF9GSUJSRTsKLQkJbW9kZXMgJj0gfkFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7Ci0JfQotCXJldHVybiBtb2RlczsKLX0KLQogc3RhdGljIGludCBza2dlX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CiAJY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJdTMyIHN1cHBvcnRlZCA9IHNrZ2Vfc3VwcG9ydGVkX21vZGVzKGh3KTsKIAogCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIHNrZ2VfbW9kZXMoaHcpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gc3VwcG9ydGVkOworCQlza2dlLT5kdXBsZXggPSAtMTsKKwkJc2tnZS0+c3BlZWQgPSAtMTsKIAl9IGVsc2UgeworCQl1MzIgc2V0dGluZzsKKwogCQlzd2l0Y2goZWNtZC0+c3BlZWQpIHsKIAkJY2FzZSBTUEVFRF8xMDAwOgotCQkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkUpCisJCQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisJCQllbHNlIGlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQkJc2V0dGluZyA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZjsKKwkJCWVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQljYXNlIFNQRUVEXzEwMDoKKwkJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJc2V0dGluZyA9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOworCQkJZWxzZSBpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCiAJCWNhc2UgU1BFRURfMTA6Ci0JCQlpZiAoaXNjb3BwZXIoaHcpIHx8IGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwkJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJc2V0dGluZyA9IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGw7CisJCQllbHNlIGlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQkJc2V0dGluZyA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGY7CisJCQllbHNlCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CisKKwkJaWYgKChzZXR0aW5nICYgc3VwcG9ydGVkKSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc2tnZS0+c3BlZWQgPSBlY21kLT5zcGVlZDsKKwkJc2tnZS0+ZHVwbGV4ID0gZWNtZC0+ZHVwbGV4OwogCX0KIAogCXNrZ2UtPmF1dG9uZWcgPSBlY21kLT5hdXRvbmVnOwotCXNrZ2UtPnNwZWVkID0gZWNtZC0+c3BlZWQ7Ci0Jc2tnZS0+ZHVwbGV4ID0gZWNtZC0+ZHVwbGV4OwogCXNrZ2UtPmFkdmVydGlzaW5nID0gZWNtZC0+YWR2ZXJ0aXNpbmc7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CkBAIC0zOTMsNyArMzgzLDcgQEAKIHsKIAlpbnQgaTsKIAotCXN3aXRjaChzdHJpbmdzZXQpIHsKKwlzd2l0Y2ggKHN0cmluZ3NldCkgewogCWNhc2UgRVRIX1NTX1NUQVRTOgogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShza2dlX3N0YXRzKTsgaSsrKQogCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLApAQCAtNTExLDE0ICs1MDEsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBPbmx5IFl1a29uIElJIHN1cHBvcnRzIFRTTyAobm90IGltcGxlbWVudGVkIHlldCkgKi8KLXN0YXRpYyBpbnQgc2tnZV9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCWlmIChkYXRhKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHNrZ2VfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplY21kKQogewpAQCAtNTQwLDkgKzUyMiw5IEBACiAJc2tnZS0+YXV0b25lZyA9IGVjbWQtPmF1dG9uZWc7CiAJaWYgKGVjbWQtPnJ4X3BhdXNlICYmIGVjbWQtPnR4X3BhdXNlKQogCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfU1lNTUVUUklDOwotCWVsc2UgaWYoZWNtZC0+cnhfcGF1c2UgJiYgIWVjbWQtPnR4X3BhdXNlKQorCWVsc2UgaWYgKGVjbWQtPnJ4X3BhdXNlICYmICFlY21kLT50eF9wYXVzZSkKIAkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1JFTV9TRU5EOwotCWVsc2UgaWYoIWVjbWQtPnJ4X3BhdXNlICYmIGVjbWQtPnR4X3BhdXNlKQorCWVsc2UgaWYgKCFlY21kLT5yeF9wYXVzZSAmJiBlY21kLT50eF9wYXVzZSkKIAkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX0xPQ19TRU5EOwogCWVsc2UKIAkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX05PTkU7CkBAIC01NTksOCArNTQxLDYgQEAKIHsKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQogCQlyZXR1cm4gNTMyMTU7IC8qIG9yOiAgNTMuMTI1IE1IeiAqLwotCWVsc2UgaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUMpCi0JCXJldHVybiAxMjUwMDA7IC8qIG9yOiAxMjUuMDAwIE1IeiAqLwogCWVsc2UKIAkJcmV0dXJuIDc4MjE1OyAvKiBvcjogIDc4LjEyNSBNSHogKi8KIH0KQEAgLTY0MywzMCArNjIzLDE4IEBACiBzdGF0aWMgdm9pZCBza2dlX2xlZF9vbihzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQogewogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIExOS19MRURfUkVHKSwgTElOS0xFRF9PTik7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09OKTsKIAkJc2tnZV93cml0ZTgoaHcsIEIwX0xFRCwgTEVEX1NUQVRfT04pOwogCi0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfVFNUKSwgTEVEX1RfT04pOwotCQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0xFRF9WQUwpLCAxMDApOwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9UU1QpLCBMRURfVF9PTik7CisJCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9WQUwpLCAxMDApOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKIAotCQlzd2l0Y2ggKGh3LT5waHlfdHlwZSkgewotCQljYXNlIFNLX1BIWV9CQ09NOgotCQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsCi0JCQkJCSAgUEhZX0JfUEVDX0xFRF9PTik7Ci0JCQlicmVhazsKLQkJY2FzZSBTS19QSFlfTE9ORToKLQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTE9ORV9MRURfQ0ZHLAotCQkJCQkgIDB4MDgwMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9MRURfVFNUKSwgTEVEX1RfT04pOwotCQkJc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9MRURfVkFMKSwgMTAwKTsKLQkJCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9MRURfQ1RSTCksIExFRF9TVEFSVCk7Ci0JCX0KKwkJLyogRm9yIEJyb2FkY29tIFBoeSBvbmx5ICovCisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgUEhZX0JfUEVDX0xFRF9PTik7CiAJfSBlbHNlIHsKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9DVFJMLCAwKTsKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLAorCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9DVFJMLCAwKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKIAkJCQkgIFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09OKSAgfAogCQkJCSAgUEhZX01fTEVEX01PXzEwKE1PX0xFRF9PTikgICB8CiAJCQkJICBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PTikgIHwKQEAgLTY3OCwyOCArNjQ2LDE3IEBACiBzdGF0aWMgdm9pZCBza2dlX2xlZF9vZmYoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfT0ZGKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfT0ZGKTsKIAkJc2tnZV93cml0ZTgoaHcsIEIwX0xFRCwgTEVEX1NUQVRfT0ZGKTsKIAotCQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0xFRF9WQUwpLCAwKTsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1RfT0ZGKTsKKwkJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgUlhfTEVEX1ZBTCksIDApOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1RfT0ZGKTsKIAotCQlzd2l0Y2ggKGh3LT5waHlfdHlwZSkgewotCQljYXNlIFNLX1BIWV9CQ09NOgotCQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsCi0JCQkJCSAgUEhZX0JfUEVDX0xFRF9PRkYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0tfUEhZX0xPTkU6Ci0JCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0xPTkVfTEVEX0NGRywKLQkJCQkJICBQSFlfTF9MQ19MRURUKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9MRURfVkFMKSwgMCk7Ci0JCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfVF9PRkYpOwotCQl9CisJCS8qIEJyb2FkY29tIG9ubHkgKi8KKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCBQSFlfQl9QRUNfTEVEX09GRik7CiAJfSBlbHNlIHsKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9DVFJMLCAwKTsKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLAorCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9DVFJMLCAwKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKIAkJCQkgIFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09GRikgIHwKIAkJCQkgIFBIWV9NX0xFRF9NT18xMChNT19MRURfT0ZGKSAgIHwKIAkJCQkgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09GRikgIHwKQEAgLTczMCw3ICs2ODcsNyBAQAogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYoIWRhdGEgfHwgZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKQorCWlmICghZGF0YSB8fCBkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCiAJCWRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKIAogCS8qIHN0YXJ0IGJsaW5raW5nICovCkBAIC03NjMsOCArNzIwLDYgQEAKIAkuc2V0X3BhdXNlcGFyYW0gPSBza2dlX3NldF9wYXVzZXBhcmFtLAogCS5nZXRfY29hbGVzY2UJPSBza2dlX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlCT0gc2tnZV9zZXRfY29hbGVzY2UsCi0JLmdldF90c28JPSBldGh0b29sX29wX2dldF90c28sCi0JLnNldF90c28JPSBza2dlX3NldF90c28sCiAJLmdldF9zZwkJPSBldGh0b29sX29wX2dldF9zZywKIAkuc2V0X3NnCQk9IHNrZ2Vfc2V0X3NnLAogCS5nZXRfdHhfY3N1bQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCkBAIC03OTMsNiArNzQ4LDcgQEAKIAogCWZvciAoaSA9IDAsIGUgPSByaW5nLT5zdGFydCwgZCA9IHZhZGRyOyBpIDwgcmluZy0+Y291bnQ7IGkrKywgZSsrLCBkKyspIHsKIAkJZS0+ZGVzYyA9IGQ7CisJCWUtPnNrYiA9IE5VTEw7CiAJCWlmIChpID09IHJpbmctPmNvdW50IC0gMSkgewogCQkJZS0+bmV4dCA9IHJpbmctPnN0YXJ0OwogCQkJZC0+bmV4dF9vZmZzZXQgPSBiYXNlOwpAQCAtODA2LDI0ICs3NjIsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU2V0dXAgYnVmZmVyIGZvciByZWNlaXZpbmcgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNrZ2VfcnhfYWxsb2Moc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwKLQkJCQlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplKQorc3RhdGljIHN0cnVjdCBza19idWZmICpza2dlX3J4X2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IHNrZ2UtPm5ldGRldi0+bXR1ICsgRVRIX0hMRU47IC8qIFZMQU4/ICovCi0Jc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTY0IG1hcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAotCXNrYiA9IGRldl9hbGxvY19za2IoYnVmc2l6ZSArIE5FVF9JUF9BTElHTik7Ci0JaWYgKHVubGlrZWx5KCFza2IpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IG91dCBvZiBtZW1vcnkgZm9yIHJlY2VpdmVcbiIsCi0JCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobGlrZWx5KHNrYikpIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAl9CisJcmV0dXJuIHNrYjsKK30KIAotCXNrYi0+ZGV2ID0gc2tnZS0+bmV0ZGV2OwotCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKy8qIEFsbG9jYXRlIGFuZCBzZXR1cCBhIG5ldyBidWZmZXIgZm9yIHJlY2VpdmluZyAqLworc3RhdGljIHZvaWQgc2tnZV9yeF9zZXR1cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLCBzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZCA9IGUtPmRlc2M7CisJdTY0IG1hcDsKIAogCW1hcCA9IHBjaV9tYXBfc2luZ2xlKHNrZ2UtPmh3LT5wZGV2LCBza2ItPmRhdGEsIGJ1ZnNpemUsCiAJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CkBAIC04NDEsNTUgKzc5Niw2OSBAQAogCXJkLT5jb250cm9sID0gQk1VX09XTiB8IEJNVV9TVEYgfCBCTVVfSVJRX0VPRiB8IEJNVV9UQ1BfQ0hFQ0sgfCBidWZzaXplOwogCXBjaV91bm1hcF9hZGRyX3NldChlLCBtYXBhZGRyLCBtYXApOwogCXBjaV91bm1hcF9sZW5fc2V0KGUsIG1hcGxlbiwgYnVmc2l6ZSk7Ci0JcmV0dXJuIDA7CiB9CiAKLS8qIEZyZWUgYWxsIHVudXNlZCBidWZmZXJzIGluIHJlY2VpdmUgcmluZywgYXNzdW1lcyByZWNlaXZlciBzdG9wcGVkICovCisvKiBSZXN1bWUgcmVjZWl2aW5nIHVzaW5nIGV4aXN0aW5nIHNrYiwKKyAqIE5vdGU6IERNQSBhZGRyZXNzIGlzIG5vdCBjaGFuZ2VkIGJ5IGNoaXAuCisgKiAJIE1UVSBub3QgY2hhbmdlZCB3aGlsZSByZWNlaXZlciBhY3RpdmUuCisgKi8KK3N0YXRpYyB2b2lkIHNrZ2VfcnhfcmV1c2Uoc3RydWN0IHNrZ2VfZWxlbWVudCAqZSwgdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOworCisJcmQtPmNzdW0yID0gMDsKKwlyZC0+Y3N1bTJfc3RhcnQgPSBFVEhfSExFTjsKKworCXdtYigpOworCisJcmQtPmNvbnRyb2wgPSBCTVVfT1dOIHwgQk1VX1NURiB8IEJNVV9JUlFfRU9GIHwgQk1VX1RDUF9DSEVDSyB8IHNpemU7Cit9CisKKworLyogRnJlZSBhbGwgIGJ1ZmZlcnMgaW4gcmVjZWl2ZSByaW5nLCBhc3N1bWVzIHJlY2VpdmVyIHN0b3BwZWQgKi8KIHN0YXRpYyB2b2lkIHNrZ2VfcnhfY2xlYW4oc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKIAlzdHJ1Y3Qgc2tnZV9yaW5nICpyaW5nID0gJnNrZ2UtPnJ4X3Jpbmc7CiAJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKIAotCWZvciAoZSA9IHJpbmctPnRvX2NsZWFuOyBlICE9IHJpbmctPnRvX3VzZTsgZSA9IGUtPm5leHQpIHsKKwllID0gcmluZy0+c3RhcnQ7CisJZG8gewogCQlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZCA9IGUtPmRlc2M7CiAJCXJkLT5jb250cm9sID0gMDsKLQotCQlwY2lfdW5tYXBfc2luZ2xlKGh3LT5wZGV2LAotCQkJCSBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKLQkJCQkgcGNpX3VubWFwX2xlbihlLCBtYXBsZW4pLAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlkZXZfa2ZyZWVfc2tiKGUtPnNrYik7Ci0JCWUtPnNrYiA9IE5VTEw7Ci0JfQotCXJpbmctPnRvX2NsZWFuID0gZTsKKwkJaWYgKGUtPnNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShody0+cGRldiwKKwkJCQkJIHBjaV91bm1hcF9hZGRyKGUsIG1hcGFkZHIpLAorCQkJCQkgcGNpX3VubWFwX2xlbihlLCBtYXBsZW4pLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoZS0+c2tiKTsKKwkJCWUtPnNrYiA9IE5VTEw7CisJCX0KKwl9IHdoaWxlICgoZSA9IGUtPm5leHQpICE9IHJpbmctPnN0YXJ0KTsKIH0KIAorCiAvKiBBbGxvY2F0ZSBidWZmZXJzIGZvciByZWNlaXZlIHJpbmcKLSAqIEZvciByZWNlaXZlOiB0b191c2UgICBpcyByZWZpbGwgbG9jYXRpb24KLSAqICAgICAgICAgICAgICB0b19jbGVhbiBpcyBuZXh0IHJlY2VpdmVkIGZyYW1lLgotICoKLSAqIGlmICh0b191c2UgPT0gdG9fY2xlYW4pCi0gKgkgdGhlbiByaW5nIGFsbCBmcmFtZXMgaW4gcmluZyBuZWVkIGJ1ZmZlcnMKLSAqIGlmICh0b191c2UtPm5leHQgPT0gdG9fY2xlYW4pCi0gKgkgdGhlbiByaW5nIGFsbCBmcmFtZXMgaW4gcmluZyBoYXZlIGJ1ZmZlcnMKKyAqIEZvciByZWNlaXZlOiAgdG9fY2xlYW4gaXMgbmV4dCByZWNlaXZlZCBmcmFtZS4KICAqLwogc3RhdGljIGludCBza2dlX3J4X2ZpbGwoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9yaW5nICpyaW5nID0gJnNrZ2UtPnJ4X3Jpbmc7CiAJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKLQlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IHNrZ2UtPnJ4X2J1Zl9zaXplOwogCi0JZm9yIChlID0gcmluZy0+dG9fdXNlOyBlLT5uZXh0ICE9IHJpbmctPnRvX2NsZWFuOyBlID0gZS0+bmV4dCkgewotCQlpZiAoc2tnZV9yeF9hbGxvYyhza2dlLCBlKSkgewotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQl9CisJZSA9IHJpbmctPnN0YXJ0OworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrZ2VfcnhfYWxsb2Moc2tnZS0+bmV0ZGV2LCBidWZzaXplKTsKIAotCX0KLQlyaW5nLT50b191c2UgPSBlOworCQlpZiAoIXNrYikKKwkJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0dXJuIHJldDsKKwkJc2tnZV9yeF9zZXR1cChza2dlLCBlLCBza2IsIGJ1ZnNpemUpOworCX0gd2hpbGUgKCAoZSA9IGUtPm5leHQpICE9IHJpbmctPnN0YXJ0KTsKKworCXJpbmctPnRvX2NsZWFuID0gcmluZy0+c3RhcnQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNrZ2VfbGlua191cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQpAQCAtOTE5LDUwICs4ODgsNTAgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIGRvd24uXG4iLCBza2dlLT5uZXRkZXYtPm5hbWUpOwogfQogCi1zdGF0aWMgdTE2IHNrZ2VfeG1fcGh5X3JlYWQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgIHUxNiByZWcpCitzdGF0aWMgdTE2IHhtX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcpCiB7CiAJaW50IGk7CiAJdTE2IHY7CiAKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9BRERSLCByZWcgfCBody0+cGh5X2FkZHIpOwotCXYgPSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fUEhZX0RBVEEpOwotCWlmIChody0+cGh5X3R5cGUgIT0gU0tfUEhZX1hNQUMpIHsKLQkJZm9yIChpID0gMDsgaSA8IFBIWV9SRVRSSUVTOyBpKyspIHsKLQkJCXVkZWxheSgxKTsKLQkJCWlmIChza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKLQkJCSAgICAmIFhNX01NVV9QSFlfUkRZKQotCQkJCWdvdG8gcmVhZHk7Ci0JCX0KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfQUREUiwgcmVnIHwgaHctPnBoeV9hZGRyKTsKKwl2ID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSk7CiAKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBwaHkgcmVhZCB0aW1lZCBvdXRcbiIsCi0JCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JcmVhZHk6Ci0JCXYgPSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fUEhZX0RBVEEpOworCS8qIE5lZWQgdG8gd2FpdCBmb3IgZXh0ZXJuYWwgUEhZICovCisJZm9yIChpID0gMDsgaSA8IFBIWV9SRVRSSUVTOyBpKyspIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKQorCQkgICAgJiBYTV9NTVVfUEhZX1JEWSkKKwkJCWdvdG8gcmVhZHk7CiAJfQogCisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBwaHkgcmVhZCB0aW1lZCBvdXRcbiIsCisJICAgICAgIGh3LT5kZXZbcG9ydF0tPm5hbWUpOworCXJldHVybiAwOworIHJlYWR5OgorCXYgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBKTsKKwogCXJldHVybiB2OwogfQogCi1zdGF0aWMgdm9pZCBza2dlX3htX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKQorc3RhdGljIHZvaWQgeG1fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpCiB7CiAJaW50IGk7CiAKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9BRERSLCByZWcgfCBody0+cGh5X2FkZHIpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9BRERSLCByZWcgfCBody0+cGh5X2FkZHIpOwogCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7Ci0JCWlmICghKHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKSAmIFhNX01NVV9QSFlfQlVTWSkpCisJCWlmICghKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX0JVU1kpKQogCQkJZ290byByZWFkeTsKLQkJY3B1X3JlbGF4KCk7CisJCXVkZWxheSgxKTsKIAl9CiAJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBwaHkgd3JpdGUgZmFpbGVkIHRvIGNvbWUgcmVhZHlcbiIsCiAJICAgICAgIGh3LT5kZXZbcG9ydF0tPm5hbWUpOwogCiAKICByZWFkeToKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBLCB2YWwpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBLCB2YWwpOwogCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CiAJCXVkZWxheSgxKTsKLQkJaWYgKCEoc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpICYgWE1fTU1VX1BIWV9CVVNZKSkKKwkJaWYgKCEoeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKSAmIFhNX01NVV9QSFlfQlVTWSkpCiAJCQlyZXR1cm47CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcGh5IHdyaXRlIHRpbWVkIG91dFxuIiwKQEAgLTk5OSwzNCArOTY4LDExMiBAQAogCiBzdGF0aWMgdm9pZCBnZW5lc2lzX3Jlc2V0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7Ci0JaW50IGk7Ci0JdTY0IHplcm8gPSAwOworCWNvbnN0IHU4IHplcm9bOF0gID0geyAwIH07CiAKIAkvKiByZXNldCB0aGUgc3RhdGlzdGljcyBtb2R1bGUgKi8KLQlza2dlX3htX3dyaXRlMzIoaHcsIHBvcnQsIFhNX0dQX1BPUlQsIFhNX0dQX1JFU19TVEFUKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssIDB4ZmZmZik7CS8qIGRpc2FibGUgWE1BQyBJUlFzICovCi0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCAwKTsJCS8qIGNsZWFyIE1vZGUgUmVnICovCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9UWF9DTUQsIDApOwkvKiByZXNldCBUWCBDTUQgUmVnICovCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIDApOwkvKiByZXNldCBSWCBDTUQgUmVnICovCisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fR1BfUE9SVCwgWE1fR1BfUkVTX1NUQVQpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssIDB4ZmZmZik7CS8qIGRpc2FibGUgWE1BQyBJUlFzICovCisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgMCk7CQkvKiBjbGVhciBNb2RlIFJlZyAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX0NNRCwgMCk7CS8qIHJlc2V0IFRYIENNRCBSZWcgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIDApOwkvKiByZXNldCBSWCBDTUQgUmVnICovCiAKLQkvKiBkaXNhYmxlIGFsbCBQSFkgSVJRcyAqLwotCWlmICAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKQotCQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAweGZmZmYpOworCS8qIGRpc2FibGUgQnJvYWRjb20gUEhZIElSUSAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAweGZmZmYpOwogCi0Jc2tnZV94bV9vdXRoYXNoKGh3LCBwb3J0LCBYTV9IU00sICh1OCAqKSAmemVybyk7Ci0JZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCi0JCXNrZ2VfeG1fb3V0YWRkcihodywgcG9ydCwgWE1fRVhNKGkpLCAodTggKikgJnplcm8pOwotCXNrZ2VfeG1fb3V0aGFzaChodywgcG9ydCwgWE1fU1JDX0NISywgKHU4ICopICZ6ZXJvKTsKKwl4bV9vdXRoYXNoKGh3LCBwb3J0LCBYTV9IU00sIHplcm8pOwogfQogCiAKLXN0YXRpYyB2b2lkIGdlbmVzaXNfbWFjX2luaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKKy8qIENvbnZlcnQgbW9kZSB0byBNSUkgdmFsdWVzICAqLworc3RhdGljIGNvbnN0IHUxNiBwaHlfcGF1c2VfbWFwW10gPSB7CisJW0ZMT1dfTU9ERV9OT05FXSA9CTAsCisJW0ZMT1dfTU9ERV9MT0NfU0VORF0gPQlQSFlfQU5fUEFVU0VfQVNZTSwKKwlbRkxPV19NT0RFX1NZTU1FVFJJQ10gPSBQSFlfQU5fUEFVU0VfQ0FQLAorCVtGTE9XX01PREVfUkVNX1NFTkRdICA9IFBIWV9BTl9QQVVTRV9DQVAgfCBQSFlfQU5fUEFVU0VfQVNZTSwKK307CisKKworLyogQ2hlY2sgc3RhdHVzIG9mIEJyb2FkY29tIHBoeSBsaW5rICovCitzdGF0aWMgdm9pZCBiY29tX2NoZWNrX2xpbmsoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldltwb3J0XSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IHN0YXR1czsKKworCS8qIHJlYWQgdHdpY2UgYmVjYXVzZSBvZiBsYXRjaCAqLworCSh2b2lkKSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fU1RBVCk7CisJc3RhdHVzID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX1NUQVQpOworCisJcHJfZGVidWcoImJjb21fY2hlY2tfbGluayBzdGF0dXM9MHgleFxuIiwgc3RhdHVzKTsKKworCWlmICgoc3RhdHVzICYgUEhZX1NUX0xTWU5DKSA9PSAwKSB7CisJCXUxNiBjbWQgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOworCQljbWQgJj0gfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCk7CisJCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsIGNtZCk7CisJCS8qIGR1bW15IHJlYWQgdG8gZW5zdXJlIHdyaXRpbmcgKi8KKwkJKHZvaWQpIHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CisKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCXNrZ2VfbGlua19kb3duKHNrZ2UpOworCX0gZWxzZSB7CisJCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCisJCSAgICAoc3RhdHVzICYgUEhZX1NUX0FOX09WRVIpKSB7CisJCQl1MTYgbHBhID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0FVTkVfTFApOworCQkJdTE2IGF1eCA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfU1RBVCk7CisKKwkJCWlmIChscGEgJiBQSFlfQl9BTl9SRikgeworCQkJCXByaW50ayhLRVJOX05PVElDRSBQRlggIiVzOiByZW1vdGUgZmF1bHRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvKiBDaGVjayBEdXBsZXggbWlzbWF0Y2ggKi8KKwkJCXN3aXRjaChhdXggJiBQSFlfQl9BU19BTl9SRVNfTVNLKSB7CisJCQljYXNlIFBIWV9CX1JFU18xMDAwRkQ6CisJCQkJc2tnZS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV9CX1JFU18xMDAwSEQ6CisJCQkJc2tnZS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX05PVElDRSBQRlggIiVzOiBkdXBsZXggbWlzbWF0Y2hcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisKKwkJCS8qIFdlIGFyZSB1c2luZyBJRUVFIDgwMi4zei9ENS4wIFRhYmxlIDM3LTQgKi8KKwkJCXN3aXRjaCAoYXV4ICYgUEhZX0JfQVNfUEFVU0VfTVNLKSB7CisJCQljYXNlIFBIWV9CX0FTX1BBVVNFX01TSzoKKwkJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfU1lNTUVUUklDOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfQl9BU19QUlI6CisJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1JFTV9TRU5EOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfQl9BU19QUlQ6CisJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX0xPQ19TRU5EOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfTk9ORTsKKwkJCX0KKworCQkJc2tnZS0+c3BlZWQgPSBTUEVFRF8xMDAwOworCQl9CisKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQlnZW5lc2lzX2xpbmtfdXAoc2tnZSk7CisJfQorfQorCisvKiBCcm9hZGNvbSA1NDAwIG9ubHkgc3VwcG9ydHMgZ2lhZ2FiaXQhIFN5c0tvbm5lY3QgZGlkIG5vdCBwdXQgYW4gYWRkaXRpb25hbAorICogUGh5IG9uIGZvciAxMDAgb3IgMTBNYml0IG9wZXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBiY29tX3BoeV9pbml0KHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UsIGludCBqdW1ibykKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CiAJaW50IGk7Ci0JdTMyIHI7Ci0JdTE2IGlkMTsKLQl1MTYgY3RybDEsIGN0cmwyLCBjdHJsMywgY3RybDQsIGN0cmw1OworCXUxNiBpZDEsIHIsIGV4dCwgY3RsOwogCiAJLyogbWFnaWMgd29ya2Fyb3VuZCBwYXR0ZXJucyBmb3IgQnJvYWRjb20gKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IHsKQEAgLTEwNDIsMTYgKzEwODksMTIwIEBACiAJCXsgMHgxNywgMHgwMDEzIH0sIHsgMHgxNSwgMHgwQTA0IH0sIHsgMHgxOCwgMHgwNDIwIH0sCiAJfTsKIAorCXByX2RlYnVnKCJiY29tX3BoeV9pbml0XG4iKTsKKworCS8qIHJlYWQgSWQgZnJvbSBleHRlcm5hbCBQSFkgKGFsbCBoYXZlIHRoZSBzYW1lIGFkZHJlc3MpICovCisJaWQxID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9YTUFDX0lEMSk7CisKKwkvKiBPcHRpbWl6ZSBNRElPIHRyYW5zZmVyIGJ5IHN1cHByZXNzaW5nIHByZWFtYmxlLiAqLworCXIgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOworCXIgfD0gIFhNX01NVV9OT19QUkU7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCxyKTsKKworCXN3aXRjaChpZDEpIHsKKwljYXNlIFBIWV9CQ09NX0lEMV9DMDoKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSBmb3IgdGhlIEMwIHR5cGUuCisJCSAqIFdyaXRlIG1hZ2ljIHBhdHRlcm5zIHRvIHJlc2VydmVkIHJlZ2lzdGVycy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEMwaGFjayk7IGkrKykKKwkJCXhtX3BoeV93cml0ZShodywgcG9ydCwKKwkJCQkgICAgIEMwaGFja1tpXS5yZWcsIEMwaGFja1tpXS52YWwpOworCisJCWJyZWFrOworCWNhc2UgUEhZX0JDT01fSUQxX0ExOgorCQkvKgorCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQTEgdHlwZS4KKwkJICogV3JpdGUgbWFnaWMgcGF0dGVybnMgdG8gcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQTFoYWNrKTsgaSsrKQorCQkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LAorCQkJCSAgICAgQTFoYWNrW2ldLnJlZywgQTFoYWNrW2ldLnZhbCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUEhZcy4KKwkgKiBEaXNhYmxlIFBvd2VyIE1hbmFnZW1lbnQgYWZ0ZXIgcmVzZXQuCisJICovCisJciA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCk7CisJciB8PSBQSFlfQl9BQ19ESVNfUE07CisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgcik7CisKKwkvKiBEdW1teSByZWFkICovCisJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKKworCWV4dCA9IFBIWV9CX1BFQ19FTl9MVFI7IC8qIGVuYWJsZSB0eCBsZWQgKi8KKwljdGwgPSBQSFlfQ1RfU1AxMDAwOwkvKiBhbHdheXMgMTAwMG1iaXQgKi8KKworCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCS8qCisJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgIzEgZm9yIHRoZSBDNSB0eXBlLgorCQkgKiAxMDAwQmFzZS1UIExpbmsgQWNxdWlzaXRpb24gRmFpbHVyZSBpbiBTbGF2ZSBNb2RlCisJCSAqIFNldCBSZXBlYXRlci9EVEUgYml0IDEwIG9mIHRoZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIKKwkJICovCisJCXUxNiBhZHYgPSBQSFlfQl8xMDAwQ19SRDsKKwkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCWFkdiB8PSBQSFlfQl8xMDAwQ19BSEQ7CisJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQlhZHYgfD0gUEhZX0JfMTAwMENfQUZEOworCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsIGFkdik7CisKKwkJY3RsIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOworCX0gZWxzZSB7CisJCWlmIChza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljdGwgfD0gUEhZX0NUX0RVUF9NRDsKKwkJLyogRm9yY2UgdG8gc2xhdmUgKi8KKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV8xMDAwVF9DVFJMLCBQSFlfQl8xMDAwQ19NU0UpOworCX0KKworCS8qIFNldCBhdXRvbmVnb3RpYXRpb24gcGF1c2UgcGFyYW1ldGVycyAqLworCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQVVORV9BRFYsCisJCSAgICAgcGh5X3BhdXNlX21hcFtza2dlLT5mbG93X2NvbnRyb2xdIHwgUEhZX0FOX0NTTUEpOworCisJLyogSGFuZGxlIEp1bWJvIGZyYW1lcyAqLworCWlmIChqdW1ibykgeworCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLAorCQkJICAgICBQSFlfQl9BQ19UWF9UU1QgfCBQSFlfQl9BQ19MT05HX1BBQ0spOworCisJCWV4dCB8PSBQSFlfQl9QRUNfSElHSF9MQTsKKworCX0KKworCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgZXh0KTsKKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwsIGN0bCk7CisKKwkvKiBVc2UgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnJ1cHQgKi8KKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCBQSFlfQl9ERUZfTVNLKTsKKworCWJjb21fY2hlY2tfbGluayhodywgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVzaXNfbWFjX2luaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQganVtYm8gPSBody0+ZGV2W3BvcnRdLT5tdHUgPiBFVEhfREFUQV9MRU47CisJaW50IGk7CisJdTMyIHI7CisJY29uc3QgdTggemVyb1s2XSAgPSB7IDAgfTsKKworCS8qIENsZWFyIE1JQiBjb3VudGVycyAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01ELAorCQkJWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOworCS8qIENsZWFyIHR3byB0aW1lcyBhY2NvcmRpbmcgdG8gRXJyYXRhICMzICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fU1RBVF9DTUQsCisJCQlYTV9TQ19DTFJfUlhDIHwgWE1fU0NfQ0xSX1RYQyk7CiAKIAkvKiBpbml0aWFsaXplIFJ4LCBUeCBhbmQgTGluayBMRUQgKi8KLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09OKTsKLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX0xJTktTWU5DX09OKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIExOS19MRURfUkVHKSwgTElOS0xFRF9PTik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfTElOS1NZTkNfT04pOwogCi0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOwogCiAJLyogVW5yZXNldCB0aGUgWE1BQy4gKi8KLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9DTFJfTUFDX1JTVCk7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX0NMUl9NQUNfUlNUKTsKIAogCS8qCiAJICogUGVyZm9ybSBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBleHRlcm5hbCBQSFlzLApAQCAtMTA1OSw2NyArMTIxMCw1NiBAQAogCSAqIEdNSUkgbW9kZS4KIAkgKi8KIAlzcGluX2xvY2tfYmgoJmh3LT5waHlfbG9jayk7Ci0JaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQykgewotCQkvKiBUYWtlIFBIWSBvdXQgb2YgcmVzZXQuICovCi0JCXIgPSBza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOwotCQlpZiAocG9ydCA9PSAwKQotCQkJciB8PSBHUF9ESVJfMHxHUF9JT18wOwotCQllbHNlCi0JCQlyIHw9IEdQX0RJUl8yfEdQX0lPXzI7CisJLyogVGFrZSBleHRlcm5hbCBQaHkgb3V0IG9mIHJlc2V0ICovCisJciA9IHNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CisJaWYgKHBvcnQgPT0gMCkKKwkJciB8PSBHUF9ESVJfMHxHUF9JT18wOworCWVsc2UKKwkJciB8PSBHUF9ESVJfMnxHUF9JT18yOwogCi0JCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sIHIpOwotCQlza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOworCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sIHIpOworCXNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CisJc3Bpbl91bmxvY2tfYmgoJmh3LT5waHlfbG9jayk7CiAKLQkJLyogRW5hYmxlIEdNSUkgbW9kZSBvbiB0aGUgWE1BQy4gKi8KLQkJc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9IV19DRkcsIFhNX0hXX0dNSUlfTUQpOworCS8qIEVuYWJsZSBHTUlJIGludGVyZmFjICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSFdfQ0ZHLCBYTV9IV19HTUlJX01EKTsKIAotCQlpZDEgPSBza2dlX3htX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfWE1BQ19JRDEpOworCWJjb21fcGh5X2luaXQoc2tnZSwganVtYm8pOwogCi0JCS8qIE9wdGltaXplIE1ESU8gdHJhbnNmZXIgYnkgc3VwcHJlc3NpbmcgcHJlYW1ibGUuICovCi0JCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKLQkJCQlza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKLQkJCQl8IFhNX01NVV9OT19QUkUpOworCS8qIFNldCBTdGF0aW9uIEFkZHJlc3MgKi8KKwl4bV9vdXRhZGRyKGh3LCBwb3J0LCBYTV9TQSwgZGV2LT5kZXZfYWRkcik7CiAKLQkJaWYgKGlkMSA9PSBQSFlfQkNPTV9JRDFfQzApIHsKLQkJCS8qCi0JCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQzAgdHlwZS4KLQkJCSAqIFdyaXRlIG1hZ2ljIHBhdHRlcm5zIHRvIHJlc2VydmVkIHJlZ2lzdGVycy4KLQkJCSAqLwotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQzBoYWNrKTsgaSsrKQotCQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LAotCQkJCQkgIEMwaGFja1tpXS5yZWcsIEMwaGFja1tpXS52YWwpOworCS8qIFdlIGRvbid0IHVzZSBtYXRjaCBhZGRyZXNzZXMgc28gY2xlYXIgKi8KKwlmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKKwkJeG1fb3V0YWRkcihodywgcG9ydCwgWE1fRVhNKGkpLCB6ZXJvKTsKIAotCQl9IGVsc2UgaWYgKGlkMSA9PSBQSFlfQkNPTV9JRDFfQTEpIHsKLQkJCS8qCi0JCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQTEgdHlwZS4KLQkJCSAqIFdyaXRlIG1hZ2ljIHBhdHRlcm5zIHRvIHJlc2VydmVkIHJlZ2lzdGVycy4KLQkJCSAqLwotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQTFoYWNrKTsgaSsrKQotCQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LAotCQkJCQkgIEExaGFja1tpXS5yZWcsIEExaGFja1tpXS52YWwpOwotCQl9Ci0KLQkJLyoKLQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUEhZcy4KLQkJICogRGlzYWJsZSBQb3dlciBNYW5hZ2VtZW50IGFmdGVyIHJlc2V0LgotCQkgKi8KLQkJciA9IHNrZ2VfeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMKTsKLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCByIHwgUEhZX0JfQUNfRElTX1BNKTsKLQl9Ci0KLQkvKiBEdW1teSByZWFkICovCi0Jc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX0lTUkMpOwotCi0JciA9IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKLQlza2dlX3htX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIHJ8WE1fTURfQ1NBKTsKKwkvKiBjb25maWd1cmUgUnggSGlnaCBXYXRlciBNYXJrIChYTV9SWF9ISV9XTSkgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9ISV9XTSwgMTQ1MCk7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRoZSBGQ1MgYXBwZW5kZWQgdG8gdGhlIHBhY2tldC4gKi8KLQlyID0gc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1JYX0NNRCk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIHIgfCBYTV9SWF9TVFJJUF9GQ1MpOworCXIgPSBYTV9SWF9MRU5FUlJfT0sgfCBYTV9SWF9TVFJJUF9GQ1M7CisJaWYgKGp1bWJvKQorCQlyIHw9IFhNX1JYX0JJR19QS19PSzsKKworCWlmIChza2dlLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKKwkJLyoKKwkJICogSWYgaW4gbWFudWFsIGhhbGYgZHVwbGV4IG1vZGUgdGhlIG90aGVyIHNpZGUgbWlnaHQgYmUgaW4KKwkJICogZnVsbCBkdXBsZXggbW9kZSwgc28gaWdub3JlIGlmIGEgY2FycmllciBleHRlbnNpb24gaXMgbm90IHNlZW4KKwkJICogb24gZnJhbWVzIHJlY2VpdmVkCisJCSAqLworCQlyIHw9IFhNX1JYX0RJU19DRVhUOworCX0KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIHIpOworCiAKIAkvKiBXZSB3YW50IHNob3J0IGZyYW1lcyBwYWRkZWQgdG8gNjAgYnl0ZXMuICovCi0JciA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9UWF9DTUQpOwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fVFhfQ01ELCByIHwgWE1fVFhfQVVUT19QQUQpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX0NNRCwgWE1fVFhfQVVUT19QQUQpOworCisJLyoKKwkgKiBCdW1wIHVwIHRoZSB0cmFuc21pdCB0aHJlc2hvbGQuIFRoaXMgaGVscHMgaG9sZCBvZmYgdHJhbnNtaXQKKwkgKiB1bmRlcnJ1bnMgd2hlbiB3ZSdyZSBibGFzdGluZyB0cmFmZmljIGZyb20gYm90aCBwb3J0cyBhdCBvbmNlLgorCSAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX1RIUiwgNTEyKTsKIAogCS8qCiAJICogRW5hYmxlIHRoZSByZWNlcHRpb24gb2YgYWxsIGVycm9yIGZyYW1lcy4gVGhpcyBpcyBpcwpAQCAtMTEzNSwxOSArMTI3NSwyMiBAQAogCSAqIGNhc2UgdGhlIFhNQUMgd2lsbCBzdGFydCB0cmFuc2ZlcmluZyBmcmFtZXMgb3V0IG9mIHRoZQogCSAqIFJYIEZJRk8gYXMgc29vbiBhcyB0aGUgRklGTyB0aHJlc2hvbGQgaXMgcmVhY2hlZC4KIAkgKi8KLQlyID0gc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpOwotCXNrZ2VfeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwKLQkJICAgICBYTV9NRF9SWF9DUkNFfFhNX01EX1JYX0xPTkd8WE1fTURfUlhfUlVOVHwKLQkJICAgICBYTV9NRF9SWF9FUlJ8WE1fTURfUlhfSVJMRSk7CisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgWE1fREVGX01PREUpOwogCi0Jc2tnZV94bV9vdXRhZGRyKGh3LCBwb3J0LCBYTV9TQSwgaHctPmRldltwb3J0XS0+ZGV2X2FkZHIpOwotCXNrZ2VfeG1fb3V0YWRkcihodywgcG9ydCwgWE1fRVhNKDApLCBody0+ZGV2W3BvcnRdLT5kZXZfYWRkcik7CiAKIAkvKgotCSAqIEJ1bXAgdXAgdGhlIHRyYW5zbWl0IHRocmVzaG9sZC4gVGhpcyBoZWxwcyBob2xkIG9mZiB0cmFuc21pdAotCSAqIHVuZGVycnVucyB3aGVuIHdlJ3JlIGJsYXN0aW5nIHRyYWZmaWMgZnJvbSBib3RoIHBvcnRzIGF0IG9uY2UuCisJICogSW5pdGlhbGl6ZSB0aGUgUmVjZWl2ZSBDb3VudGVyIEV2ZW50IE1hc2sgKFhNX1JYX0VWX01TSykKKwkgKgktIEVuYWJsZSBhbGwgYml0cyBleGNlcHRpbmcgJ09jdGV0cyBSeCBPSyBMb3cgQ250T3YnCisJICoJICBhbmQgJ09jdGV0cyBSeCBPSyBIaSBDbnQgT3YnLgogCSAqLwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fVFhfVEhSLCA1MTIpOworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX1JYX0VWX01TSywgWE1SX0RFRl9NU0spOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBUcmFuc21pdCBDb3VudGVyIEV2ZW50IE1hc2sgKFhNX1RYX0VWX01TSykKKwkgKgktIEVuYWJsZSBhbGwgYml0cyBleGNlcHRpbmcgJ09jdGV0cyBUeCBPSyBMb3cgQ250T3YnCisJICoJICBhbmQgJ09jdGV0cyBUeCBPSyBIaSBDbnQgT3YnLgorCSAqLworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX1RYX0VWX01TSywgWE1UX0RFRl9NU0spOwogCiAJLyogQ29uZmlndXJlIE1BQyBhcmJpdGVyICovCiAJc2tnZV93cml0ZTE2KGh3LCBCM19NQV9UT19DVFJMLCBNQV9SU1RfQ0xSKTsKQEAgLTExNjQsMTM3ICsxMzA3LDMwIEBACiAJc2tnZV93cml0ZTgoaHcsIEIzX01BX1JDSU5JX1RYMiwgMCk7CiAKIAkvKiBDb25maWd1cmUgUnggTUFDIEZJRk8gKi8KLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9DTFIpOwotCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9USU1fUEFUKTsKLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX0VOQV9PUF9NRCk7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX0NMUik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9USU1fUEFUKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOwogCiAJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCi0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9UWF9DVFJMX0RFRik7Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9UWF9DVFJMX0RFRik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDIpLCBNRkZfRU5BX09QX01EKTsKIAotCWlmIChody0+ZGV2W3BvcnRdLT5tdHUgPiBFVEhfREFUQV9MRU4pIHsKKwlpZiAoanVtYm8pIHsKIAkJLyogRW5hYmxlIGZyYW1lIGZsdXNoaW5nIGlmIGp1bWJvIGZyYW1lcyB1c2VkICovCi0JCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCxSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX0ZMVVNIKTsKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCxSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX0ZMVVNIKTsKIAl9IGVsc2UgewogCQkvKiBlbmFibGUgdGltZW91dCB0aW1lcnMgaWYgbm9ybWFsIGZyYW1lcyAqLwogCQlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsCi0JCQkgICAgIHBvcnQgPT0gMCA/IFBBX0VOQV9UT19UWDEgOiBQQV9FTkFfVE9fVFgyKTsKKwkJCSAgICAgKHBvcnQgPT0gMCkgPyBQQV9FTkFfVE9fVFgxIDogUEFfRU5BX1RPX1RYMik7CiAJfQotCi0KLQlyID0gc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1JYX0NNRCk7Ci0JaWYgKGh3LT5kZXZbcG9ydF0tPm10dSA+IEVUSF9EQVRBX0xFTikKLQkJc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIHIgfCBYTV9SWF9CSUdfUEtfT0spOwotCWVsc2UKLQkJc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9SWF9DTUQsIHIgJiB+KFhNX1JYX0JJR19QS19PSykpOwotCi0Jc3dpdGNoIChody0+cGh5X3R5cGUpIHsKLQljYXNlIFNLX1BIWV9YTUFDOgotCQlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQkJY3RybDEgPSBQSFlfWF9BTl9GRCB8IFBIWV9YX0FOX0hEOwotCi0JCQlzd2l0Y2ggKHNrZ2UtPmZsb3dfY29udHJvbCkgewotCQkJY2FzZSBGTE9XX01PREVfTk9ORToKLQkJCQljdHJsMSB8PSBQSFlfWF9QX05PX1BBVVNFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfTE9DX1NFTkQ6Ci0JCQkJY3RybDEgfD0gUEhZX1hfUF9BU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfU1lNTUVUUklDOgotCQkJCWN0cmwxIHw9IFBIWV9YX1BfU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfUkVNX1NFTkQ6Ci0JCQkJY3RybDEgfD0gUEhZX1hfUF9CT1RIX01EOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX1hNQUNfQVVORV9BRFYsIGN0cmwxKTsKLQkJCWN0cmwyID0gUEhZX0NUX0FORSB8IFBIWV9DVF9SRV9DRkc7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsMiA9IDA7Ci0JCQlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQotCQkJCWN0cmwyIHw9IFBIWV9DVF9EVVBfTUQ7Ci0JCX0KLQotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX1hNQUNfQ1RSTCwgY3RybDIpOwotCQlicmVhazsKLQotCWNhc2UgU0tfUEhZX0JDT006Ci0JCWN0cmwxID0gUEhZX0NUX1NQMTAwMDsKLQkJY3RybDIgPSAwOwotCQljdHJsMyA9IFBIWV9TRUxfVFlQRTsKLQkJY3RybDQgPSBQSFlfQl9QRUNfRU5fTFRSOwotCQljdHJsNSA9IFBIWV9CX0FDX1RYX1RTVDsKLQotCQlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQkJLyoKLQkJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgIzEgZm9yIHRoZSBDNSB0eXBlLgotCQkJICogMTAwMEJhc2UtVCBMaW5rIEFjcXVpc2l0aW9uIEZhaWx1cmUgaW4gU2xhdmUgTW9kZQotCQkJICogU2V0IFJlcGVhdGVyL0RURSBiaXQgMTAgb2YgdGhlIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlcgotCQkJICovCi0JCQljdHJsMiB8PSBQSFlfQl8xMDAwQ19SRDsKLQkJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCi0JCQkJY3RybDIgfD0gUEhZX0JfMTAwMENfQUhEOwotCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKLQkJCQljdHJsMiB8PSBQSFlfQl8xMDAwQ19BRkQ7Ci0KLQkJCS8qIFNldCBGbG93LWNvbnRyb2wgY2FwYWJpbGl0aWVzICovCi0JCQlzd2l0Y2ggKHNrZ2UtPmZsb3dfY29udHJvbCkgewotCQkJY2FzZSBGTE9XX01PREVfTk9ORToKLQkJCQljdHJsMyB8PSBQSFlfQl9QX05PX1BBVVNFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfTE9DX1NFTkQ6Ci0JCQkJY3RybDMgfD0gUEhZX0JfUF9BU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfU1lNTUVUUklDOgotCQkJCWN0cmwzIHw9IFBIWV9CX1BfU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfUkVNX1NFTkQ6Ci0JCQkJY3RybDMgfD0gUEhZX0JfUF9CT1RIX01EOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBSZXN0YXJ0IEF1dG8tbmVnb3RpYXRpb24gKi8KLQkJCWN0cmwxIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOwotCQl9IGVsc2UgewotCQkJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJCQljdHJsMSB8PSBQSFlfQ1RfRFVQX01EOwotCi0JCQljdHJsMiB8PSBQSFlfQl8xMDAwQ19NU0U7CS8qIHNldCBpdCB0byBTbGF2ZSAqLwotCQl9Ci0KLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsIGN0cmwyKTsKLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVTkVfQURWLCBjdHJsMyk7Ci0KLQkJaWYgKHNrZ2UtPm5ldGRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKSB7Ci0JCQljdHJsNCB8PSBQSFlfQl9QRUNfSElHSF9MQTsKLQkJCWN0cmw1IHw9IFBIWV9CX0FDX0xPTkdfUEFDSzsKLQotCQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsUEhZX0JDT01fQVVYX0NUUkwsIGN0cmw1KTsKLQkJfQotCi0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCBjdHJsNCk7Ci0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLCBjdHJsMSk7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19iaCgmaHctPnBoeV9sb2NrKTsKLQotCS8qIENsZWFyIE1JQiBjb3VudGVycyAqLwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fU1RBVF9DTUQsCi0JCQlYTV9TQ19DTFJfUlhDIHwgWE1fU0NfQ0xSX1RYQyk7Ci0JLyogQ2xlYXIgdHdvIHRpbWVzIGFjY29yZGluZyB0byBFcnJhdGEgIzMgKi8KLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01ELAotCQkJWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOwotCi0JLyogU3RhcnQgcG9sbGluZyBmb3IgbGluayBzdGF0dXMgKi8KLQltb2RfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2ssIGppZmZpZXMgKyBMSU5LX1BPTExfSFopOwogfQogCiBzdGF0aWMgdm9pZCBnZW5lc2lzX3N0b3Aoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKIAlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJdTMyIHJlZzsKIAogCS8qIENsZWFyIFR4IHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgSVJRICovCiAJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9DVFJMLApAQCAtMTMwNCwzMyArMTM0MCwzMCBAQAogCSAqIElmIHRoZSB0cmFuc2ZlciBzdHVja3MgYXQgdGhlIE1BQyB0aGUgU1RPUCBjb21tYW5kIHdpbGwgbm90CiAJICogdGVybWluYXRlIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBYTUFDJ3MgdHJhbnNtaXQgRklGTyAhCiAJICovCi0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLAotCQkJc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpfFhNX01EX0ZURik7CisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwKKwkJCXhtX3JlYWQzMihodywgcG9ydCwgWE1fTU9ERSl8WE1fTURfRlRGKTsKIAogCiAJLyogUmVzZXQgdGhlIE1BQyAqLwotCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX1NFVF9NQUNfUlNUKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfU0VUX01BQ19SU1QpOwogCiAJLyogRm9yIGV4dGVybmFsIFBIWXMgdGhlcmUgbXVzdCBiZSBzcGVjaWFsIGhhbmRsaW5nICovCi0JaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQykgewotCQl1MzIgcmVnID0gc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKLQotCQlpZiAocG9ydCA9PSAwKSB7Ci0JCQlyZWcgfD0gR1BfRElSXzA7Ci0JCQlyZWcgJj0gfkdQX0lPXzA7Ci0JCX0gZWxzZSB7Ci0JCQlyZWcgfD0gR1BfRElSXzI7Ci0JCQlyZWcgJj0gfkdQX0lPXzI7Ci0JCX0KLQkJc2tnZV93cml0ZTMyKGh3LCBCMl9HUF9JTywgcmVnKTsKLQkJc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKKwlyZWcgPSBza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOworCWlmIChwb3J0ID09IDApIHsKKwkJcmVnIHw9IEdQX0RJUl8wOworCQlyZWcgJj0gfkdQX0lPXzA7CisJfSBlbHNlIHsKKwkJcmVnIHw9IEdQX0RJUl8yOworCQlyZWcgJj0gfkdQX0lPXzI7CiAJfQorCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sIHJlZyk7CisJc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKIAotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKLQkJCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKQorCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsCisJCQl4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpCiAJCQkmIH4oWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpKTsKIAotCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwl4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOwogfQogCiAKQEAgLTEzNDEsMTEgKzEzNzQsMTEgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CiAKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsCisJeG1fd3JpdGUxNihodywgcG9ydCwKIAkJCVhNX1NUQVRfQ01ELCBYTV9TQ19TTlBfVFhDIHwgWE1fU0NfU05QX1JYQyk7CiAKIAkvKiB3YWl0IGZvciB1cGRhdGUgdG8gY29tcGxldGUgKi8KLQl3aGlsZSAoc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01EKQorCXdoaWxlICh4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01EKQogCSAgICAgICAmIChYTV9TQ19TTlBfVFhDIHwgWE1fU0NfU05QX1JYQykpIHsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCiAJCQlicmVhazsKQEAgLTEzNTMsNjggKzEzODYsNjAgQEAKIAl9CiAKIAkvKiBzcGVjaWFsIGNhc2UgZm9yIDY0IGJpdCBvY3RldCBjb3VudGVyICovCi0JZGF0YVswXSA9ICh1NjQpIHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9UWE9fT0tfSEkpIDw8IDMyCi0JCXwgc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX1RYT19PS19MTyk7Ci0JZGF0YVsxXSA9ICh1NjQpIHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9SWE9fT0tfSEkpIDw8IDMyCi0JCXwgc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX1JYT19PS19MTyk7CisJZGF0YVswXSA9ICh1NjQpIHhtX3JlYWQzMihodywgcG9ydCwgWE1fVFhPX09LX0hJKSA8PCAzMgorCQl8IHhtX3JlYWQzMihodywgcG9ydCwgWE1fVFhPX09LX0xPKTsKKwlkYXRhWzFdID0gKHU2NCkgeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9SWE9fT0tfSEkpIDw8IDMyCisJCXwgeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9SWE9fT0tfTE8pOwogCiAJZm9yIChpID0gMjsgaSA8IEFSUkFZX1NJWkUoc2tnZV9zdGF0cyk7IGkrKykKLQkJZGF0YVtpXSA9IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBza2dlX3N0YXRzW2ldLnhtYWNfb2Zmc2V0KTsKKwkJZGF0YVtpXSA9IHhtX3JlYWQzMihodywgcG9ydCwgc2tnZV9zdGF0c1tpXS54bWFjX29mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbmVzaXNfbWFjX2ludHIoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldltwb3J0XSk7Ci0JdTE2IHN0YXR1cyA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKKwl1MTYgc3RhdHVzID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKIAotCXByX2RlYnVnKCJnZW5lc2lzX2ludHIgc3RhdHVzICV4XG4iLCBzdGF0dXMpOwotCWlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX1hNQUMpIHsKLQkJLyogTEluayBkb3duLCBzdGFydCBwb2xsaW5nIGZvciBzdGF0ZSBjaGFuZ2UgKi8KLQkJaWYgKHN0YXR1cyAmIFhNX0lTX0lOUF9BU1MpIHsKLQkJCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywKLQkJCQkJc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX0lNU0spIHwgWE1fSVNfSU5QX0FTUyk7Ci0JCQltb2RfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2ssIGppZmZpZXMgKyBMSU5LX1BPTExfSFopOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cyAmIFhNX0lTX0FORCkKLQkJCW1vZF90aW1lcigmc2tnZS0+bGlua19jaGVjaywgamlmZmllcyArIExJTktfUE9MTF9IWik7Ci0JfQorCWlmIChuZXRpZl9tc2dfaW50cihza2dlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlczogbWFjIGludGVycnVwdCBzdGF0dXMgMHgleFxuIiwKKwkJICAgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgJiBYTV9JU19UWEZfVVIpIHsKLQkJc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBYTV9NRF9GVEYpOworCQl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBYTV9NRF9GVEYpOwogCQkrK3NrZ2UtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9yczsKIAl9CiAJaWYgKHN0YXR1cyAmIFhNX0lTX1JYRl9PVikgewotCQlza2dlX3htX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIFhNX01EX0ZSRik7CisJCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIFhNX01EX0ZSRik7CiAJCSsrc2tnZS0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzOwogCX0KIH0KIAotc3RhdGljIHZvaWQgc2tnZV9nbV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKK3N0YXRpYyB2b2lkIGdtX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKQogewogCWludCBpOwogCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0RBVEEsIHZhbCk7Ci0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0NUUkwsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NNSV9EQVRBLCB2YWwpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCwKIAkJCSBHTV9TTUlfQ1RfUEhZX0FEKGh3LT5waHlfYWRkcikgfCBHTV9TTUlfQ1RfUkVHX0FEKHJlZykpOwogCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CiAJCXVkZWxheSgxKTsKIAotCQlpZiAoIShza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1NNSV9DVFJMKSAmIEdNX1NNSV9DVF9CVVNZKSkKKwkJaWYgKCEoZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0NUUkwpICYgR01fU01JX0NUX0JVU1kpKQogCQkJYnJlYWs7CiAJfQogfQogCi1zdGF0aWMgdTE2IHNrZ2VfZ21fcGh5X3JlYWQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZykKK3N0YXRpYyB1MTYgZ21fcGh5X3JlYWQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZykKIHsKIAlpbnQgaTsKIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NNSV9DVFJMLAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCwKIAkJCSBHTV9TTUlfQ1RfUEhZX0FEKGh3LT5waHlfYWRkcikKIAkJCSB8IEdNX1NNSV9DVF9SRUdfQUQocmVnKSB8IEdNX1NNSV9DVF9PUF9SRCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFVFJJRVM7IGkrKykgewogCQl1ZGVsYXkoMSk7Ci0JCWlmIChza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1NNSV9DVFJMKSAmIEdNX1NNSV9DVF9SRF9WQUwpCisJCWlmIChnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCkgJiBHTV9TTUlfQ1RfUkRfVkFMKQogCQkJZ290byByZWFkeTsKIAl9CiAKQEAgLTE0MjIsMjQgKzE0NDcsNyBAQAogCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKIAlyZXR1cm4gMDsKICByZWFkeToKLQlyZXR1cm4gc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfREFUQSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbmVzaXNfbGlua19kb3duKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCi17Ci0Jc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7Ci0JaW50IHBvcnQgPSBza2dlLT5wb3J0OwotCi0JcHJfZGVidWcoImdlbmVzaXNfbGlua19kb3duXG4iKTsKLQotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKLQkJCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKQotCQkJJiB+KFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKSk7Ci0KLQkvKiBkdW1teSByZWFkIHRvIGVuc3VyZSB3cml0aW5nICovCi0JKHZvaWQpIHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKLQotCXNrZ2VfbGlua19kb3duKHNrZ2UpOworCXJldHVybiBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfREFUQSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbmVzaXNfbGlua191cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQpAQCAtMTQ1MCw3ICsxNDU4LDcgQEAKIAl1MzIgbW9kZSwgbXNrOwogCiAJcHJfZGVidWcoImdlbmVzaXNfbGlua191cFxuIik7Ci0JY21kID0gc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOworCWNtZCA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CiAKIAkvKgogCSAqIGVuYWJsaW5nIHBhdXNlIGZyYW1lIHJlY2VwdGlvbiBpcyByZXF1aXJlZCBmb3IgMTAwMEJUCkBAIC0xNDU4LDE0ICsxNDY2LDE1IEBACiAJICovCiAJaWYgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfTk9ORSB8fAogCSAgICBza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX0xPQ19TRU5EKQorCQkvKiBEaXNhYmxlIFBhdXNlIEZyYW1lIFJlY2VwdGlvbiAqLwogCQljbWQgfD0gWE1fTU1VX0lHTl9QRjsKIAllbHNlCiAJCS8qIEVuYWJsZSBQYXVzZSBGcmFtZSBSZWNlcHRpb24gKi8KIAkJY21kICY9IH5YTV9NTVVfSUdOX1BGOwogCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELCBjbWQpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsIGNtZCk7CiAKLQltb2RlID0gc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpOworCW1vZGUgPSB4bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpOwogCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1NZTU1FVFJJQyB8fAogCSAgICBza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX0xPQ19TRU5EKSB7CiAJCS8qCkBAIC0xNDc5LDEwICsxNDg4LDEwIEBACiAJCS8qIFhNX1BBVVNFX0RBID0gJzAxMDAwMEMyODAwMScgKGRlZmF1bHQpICovCiAJCS8qIFhNX01BQ19QVElNRSA9IDB4ZmZmZiAobWF4aW11bSkgKi8KIAkJLyogcmVtZW1iZXIgdGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGluIGJpZyBlbmRpYW4gKCEpICovCi0JCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTUFDX1BUSU1FLCAweGZmZmYpOworCQl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NQUNfUFRJTUUsIDB4ZmZmZik7CiAKIAkJbW9kZSB8PSBYTV9QQVVTRV9NT0RFOwotCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9FTkFfUEFVU0UpOworCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX1BBVVNFKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBkaXNhYmxlIHBhdXNlIGZyYW1lIGdlbmVyYXRpb24gaXMgcmVxdWlyZWQgZm9yIDEwMDBCVApAQCAtMTQ5MSwxMjUgKzE1MDAsNjggQEAKIAkJLyogRGlzYWJsZSBQYXVzZSBNb2RlIGluIE1vZGUgUmVnaXN0ZXIgKi8KIAkJbW9kZSAmPSB+WE1fUEFVU0VfTU9ERTsKIAotCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9ESVNfUEFVU0UpOworCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRElTX1BBVVNFKTsKIAl9CiAKLQlza2dlX3htX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIG1vZGUpOworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIG1vZGUpOwogCiAJbXNrID0gWE1fREVGX01TSzsKLQlpZiAoaHctPnBoeV90eXBlICE9IFNLX1BIWV9YTUFDKQotCQltc2sgfD0gWE1fSVNfSU5QX0FTUzsJLyogZGlzYWJsZSBHUDAgaW50ZXJydXB0IGJpdCAqLworCS8qIGRpc2FibGUgR1AwIGludGVycnVwdCBiaXQgZm9yIGV4dGVybmFsIFBoeSAqLworCW1zayB8PSBYTV9JU19JTlBfQVNTOwogCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9JTVNLLCBtc2spOwotCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9JTVNLLCBtc2spOworCXhtX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CiAKIAkvKiBnZXQgTU1VIENvbW1hbmQgUmVnLiAqLwotCWNtZCA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKLQlpZiAoaHctPnBoeV90eXBlICE9IFNLX1BIWV9YTUFDICYmIHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwljbWQgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOworCWlmIChza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCWNtZCB8PSBYTV9NTVVfR01JSV9GRDsKIAotCWlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pIHsKLQkJLyoKLQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUGh5cwotCQkgKiBFbmFibGUgUG93ZXIgTWFuYWdlbWVudCBhZnRlciBsaW5rIHVwCi0JCSAqLwotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsCi0JCQkJICBza2dlX3htX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCkKLQkJCQkgICYgflBIWV9CX0FDX0RJU19QTSk7Ci0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywKLQkJCQkgIFBIWV9CX0RFRl9NU0spOwotCX0KKwkvKgorCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBoeXMKKwkgKiBFbmFibGUgUG93ZXIgTWFuYWdlbWVudCBhZnRlciBsaW5rIHVwCisJICovCisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwKKwkJICAgICB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwpCisJCSAgICAgJiB+UEhZX0JfQUNfRElTX1BNKTsKKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCBQSFlfQl9ERUZfTVNLKTsKIAogCS8qIGVuYWJsZSBSeC9UeCAqLwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELAogCQkJY21kIHwgWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpOwogCXNrZ2VfbGlua191cChza2dlKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBnZW5lc2lzX2Jjb21faW50cihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQorc3RhdGljIGlubGluZSB2b2lkIGJjb21fcGh5X2ludHIoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKIAlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7Ci0JdTE2IHN0YXQgPSBza2dlX3htX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfU1RBVCk7CisJdTE2IGlzcmM7CiAKLQlwcl9kZWJ1ZygiZ2VuZXNpc19iY29tIGludHIgc3RhdD0leFxuIiwgc3RhdCk7CisJaXNyYyA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfU1RBVCk7CisJaWYgKG5ldGlmX21zZ19pbnRyKHNrZ2UpKQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiBwaHkgaW50ZXJydXB0IHN0YXR1cyAweCV4XG4iLAorCQkgICAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lLCBpc3JjKTsKKworCWlmIChpc3JjICYgUEhZX0JfSVNfUFNFKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdW5jb3JyZWN0YWJsZSBwYWlyIHN3YXAgZXJyb3JcbiIsCisJCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKIAogCS8qIFdvcmthcm91bmQgQkNvbSBFcnJhdGE6CiAJICoJZW5hYmxlIGFuZCBkaXNhYmxlIGxvb3BiYWNrIG1vZGUgaWYgIk5PIEhDRCIgb2NjdXJzLgogCSAqLwotCWlmIChzdGF0ICYgUEhZX0JfSVNfTk9fSERDTCkgewotCQl1MTYgY3RybCA9IHNrZ2VfeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwpOwotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQ1RSTCwKKwlpZiAoaXNyYyAmIFBIWV9CX0lTX05PX0hEQ0wpIHsKKwkJdTE2IGN0cmwgPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQ1RSTCk7CisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQ1RSTCwKIAkJCQkgIGN0cmwgfCBQSFlfQ1RfTE9PUCk7Ci0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLAorCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwsCiAJCQkJICBjdHJsICYgflBIWV9DVF9MT09QKTsKIAl9CiAKLQlzdGF0ID0gc2tnZV94bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fU1RBVCk7Ci0JaWYgKHN0YXQgJiAoUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19MU1RfQ0hBTkdFKSkgewotCQl1MTYgYXV4ID0gc2tnZV94bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQVVYX1NUQVQpOwotCQlpZiAoICEoYXV4ICYgUEhZX0JfQVNfTFMpICYmIG5ldGlmX2NhcnJpZXJfb2soc2tnZS0+bmV0ZGV2KSkKLQkJCWdlbmVzaXNfbGlua19kb3duKHNrZ2UpOworCWlmIChpc3JjICYgKFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCisJCWJjb21fY2hlY2tfbGluayhodywgcG9ydCk7CiAKLQkJZWxzZSBpZiAoc3RhdCAmIFBIWV9CX0lTX0xTVF9DSEFOR0UpIHsKLQkJCWlmIChhdXggJiBQSFlfQl9BU19BTl9DKSB7Ci0JCQkJc3dpdGNoIChhdXggJiBQSFlfQl9BU19BTl9SRVNfTVNLKSB7Ci0JCQkJY2FzZSBQSFlfQl9SRVNfMTAwMEZEOgotCQkJCQlza2dlLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQSFlfQl9SRVNfMTAwMEhEOgotCQkJCQlza2dlLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJc3dpdGNoIChhdXggJiBQSFlfQl9BU19QQVVTRV9NU0spIHsKLQkJCQljYXNlIFBIWV9CX0FTX1BBVVNFX01TSzoKLQkJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTU1FVFJJQzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQSFlfQl9BU19QUlI6Ci0JCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9SRU1fU0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQSFlfQl9BU19QUlQ6Ci0JCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX05PTkU7Ci0JCQkJfQotCQkJCXNrZ2UtPnNwZWVkID0gU1BFRURfMTAwMDsKLQkJCX0KLQkJCWdlbmVzaXNfbGlua191cChza2dlKTsKLQkJfQotCQllbHNlCi0JCQltb2RfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2ssIGppZmZpZXMgKyBMSU5LX1BPTExfSFopOwotCX0KLX0KLQotLyogUGVyb2RpYyBwb2xsIG9mIHBoeSBzdGF0dXMgdG8gY2hlY2sgZm9yIGxpbmsgdHJhbnNpc3Rpb24gICovCi1zdGF0aWMgdm9pZCBza2dlX2xpbmtfdGltZXIodW5zaWduZWQgbG9uZyBfX2FyZykKLXsKLQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gKHN0cnVjdCBza2dlX3BvcnQgKikgX19hcmc7Ci0Jc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7Ci0JaW50IHBvcnQgPSBza2dlLT5wb3J0OwotCi0JaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfR0VORVNJUyB8fCAhbmV0aWZfcnVubmluZyhza2dlLT5uZXRkZXYpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5waHlfbG9jayk7Ci0JaWYgKGh3LT5waHlfdHlwZSA9PSBTS19QSFlfQkNPTSkKLQkJZ2VuZXNpc19iY29tX2ludHIoc2tnZSk7Ci0JZWxzZSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCQkJaWYgKHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKSAmIFhNX0lTX0lOUF9BU1MpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPT0gMykKLQkJCW1vZF90aW1lcigmc2tnZS0+bGlua19jaGVjaywgamlmZmllcyArIExJTktfUE9MTF9IWik7Ci0JCWVsc2UKLQkJCWdlbmVzaXNfbGlua191cChza2dlKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5waHlfbG9jayk7CiB9CiAKIC8qIE1hcnZlbGwgUGh5IEluaXRhaWxpemF0aW9uICovCkBAIC0xNjIxLDMxICsxNTczLDI3IEBACiAKIAlwcl9kZWJ1ZygieXVrb25faW5pdFxuIik7CiAJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJdTE2IGVjdHJsID0gc2tnZV9nbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOworCQl1MTYgZWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOwogCiAJCWVjdHJsICY9IH4oUEhZX01fRUNfTV9EU0NfTVNLIHwgUEhZX01fRUNfU19EU0NfTVNLIHwKIAkJCSAgUEhZX01fRUNfTUFDX1NfTVNLKTsKIAkJZWN0cmwgfD0gUEhZX01fRUNfTUFDX1MoTUFDX1RYX0NMS18yNV9NSFopOwogCi0JCS8qIG9uIFBIWSA4OEUxMTExIHRoZXJlIGlzIGEgY2hhbmdlIGZvciBkb3duc2hpZnQgY29udHJvbCAqLwotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQykKLQkJCWVjdHJsIHw9IFBIWV9NX0VDX01fRFNDXzIoMCkgfCBQSFlfTV9FQ19ET1dOX1NfRU5BOwotCQllbHNlCi0JCQllY3RybCB8PSBQSFlfTV9FQ19NX0RTQygwKSB8IFBIWV9NX0VDX1NfRFNDKDEpOworCQllY3RybCB8PSBQSFlfTV9FQ19NX0RTQygwKSB8IFBIWV9NX0VDX1NfRFNDKDEpOwogCi0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgZWN0cmwpOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMLCBlY3RybCk7CiAJfQogCi0JY3RybCA9IHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwpOworCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQ1RSTCk7CiAJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQogCQljdHJsICY9IH5QSFlfQ1RfQU5FOwogCiAJY3RybCB8PSBQSFlfQ1RfUkVTRVQ7Ci0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwsIGN0cmwpOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQ1RSTCwgY3RybCk7CiAKIAljdHJsID0gMDsKIAljdDEwMDAgPSAwOwotCWFkdiA9IFBIWV9TRUxfVFlQRTsKKwlhZHYgPSBQSFlfQU5fQ1NNQTsKIAogCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCWlmIChpc2NvcHBlcihodykpIHsKQEAgLTE2NjEsNDEgKzE2MDksMTIgQEAKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTBfRkQ7CiAJCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTBfSEQ7Ci0KLQkJCS8qIFNldCBGbG93LWNvbnRyb2wgY2FwYWJpbGl0aWVzICovCi0JCQlzd2l0Y2ggKHNrZ2UtPmZsb3dfY29udHJvbCkgewotCQkJY2FzZSBGTE9XX01PREVfTk9ORToKLQkJCQlhZHYgfD0gUEhZX0JfUF9OT19QQVVTRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgotCQkJCWFkdiB8PSBQSFlfQl9QX0FTWU1fTUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZMT1dfTU9ERV9TWU1NRVRSSUM6Ci0JCQkJYWR2IHw9IFBIWV9CX1BfU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfUkVNX1NFTkQ6Ci0JCQkJYWR2IHw9IFBIWV9CX1BfQk9USF9NRDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsJLyogc3BlY2lhbCBkZWZpbmVzIGZvciBGSUJFUiAoODhFMTAxMVMgb25seSkgKi8KKwkJfSBlbHNlCS8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCiAJCQlhZHYgfD0gUEhZX01fQU5fMTAwMFhfQUhEIHwgUEhZX01fQU5fMTAwMFhfQUZEOwogCi0JCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLwotCQkJc3dpdGNoIChza2dlLT5mbG93X2NvbnRyb2wpIHsKLQkJCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCQkJYWR2IHw9IFBIWV9NX1BfTk9fUEFVU0VfWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgotCQkJCWFkdiB8PSBQSFlfTV9QX0FTWU1fTURfWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1NZTU1FVFJJQzoKLQkJCQlhZHYgfD0gUEhZX01fUF9TWU1fTURfWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1JFTV9TRU5EOgotCQkJCWFkdiB8PSBQSFlfTV9QX0JPVEhfTURfWDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLworCQlhZHYgfD0gcGh5X3BhdXNlX21hcFtza2dlLT5mbG93X2NvbnRyb2xdOworCiAJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLwogCQljdHJsIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOwogCX0gZWxzZSB7CkBAIC0xNzE3LDM2ICsxNjM2LDIzIEBACiAJCWN0cmwgfD0gUEhZX0NUX1JFU0VUOwogCX0KIAotCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX1lVS09OX0ZFKQotCQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfQ1RSTCwgY3QxMDAwKTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWXzEwMDBUX0NUUkwsIGN0MTAwMCk7CiAKLQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYsIGFkdik7Ci0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwsIGN0cmwpOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYsIGFkdik7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKIAogCS8qIFNldHVwIFBoeSBMRUQncyAqLwogCWxlZGN0cmwgPSBQSFlfTV9MRURfUFVMU19EVVIoUFVMU18xNzBNUyk7CiAJbGVkb3ZlciA9IDA7CiAKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSkgewotCQkvKiBvbiA4OEUzMDgyIHRoZXNlIGJpdHMgYXJlIGF0IDExLi45IChzaGlmdGVkIGxlZnQpICovCi0JCWxlZGN0cmwgfD0gUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpIDw8IDE7CisJbGVkY3RybCB8PSBQSFlfTV9MRURfQkxJTktfUlQoQkxJTktfODRNUykgfCBQSFlfTV9MRURDX1RYX0NUUkw7CiAKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0ZFX0xFRF9QQVIsCi0JCQkJICAoKHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0ZFX0xFRF9QQVIpCi0KLQkJCQkgICAgJiB+UEhZX01fRkVMUF9MRUQxX01TSykKLQkJCQkgICB8IFBIWV9NX0ZFTFBfTEVEMV9DVFJMKExFRF9QQVJfQ1RSTF9BQ1RfQkwpKSk7Ci0JfSBlbHNlIHsKLQkJLyogc2V0IFR4IExFRCAoTEVEX1RYKSB0byBibGluayBtb2RlIG9uIFJ4IE9SIFR4IGFjdGl2aXR5ICovCi0JCWxlZGN0cmwgfD0gUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpIHwgUEhZX01fTEVEQ19UWF9DVFJMOwotCi0JCS8qIHR1cm4gb2ZmIHRoZSBSeCBMRUQgKExFRF9SWCkgKi8KLQkJbGVkb3ZlciB8PSBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09GRik7Ci0JfQorCS8qIHR1cm4gb2ZmIHRoZSBSeCBMRUQgKExFRF9SWCkgKi8KKwlsZWRvdmVyIHw9IFBIWV9NX0xFRF9NT19SWChNT19MRURfT0ZGKTsKIAogCS8qIGRpc2FibGUgYmxpbmsgbW9kZSAoTEVEX0RVUExFWCkgb24gY29sbGlzaW9ucyAqLwogCWN0cmwgfD0gUEhZX01fTEVEQ19EUF9DVFJMOwotCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgbGVkY3RybCk7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgbGVkY3RybCk7CiAKIAlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgfHwgc2tnZS0+c3BlZWQgPT0gU1BFRURfMTAwKSB7CiAJCS8qIHR1cm4gb24gMTAwIE1icHMgTEVEIChMRURfTElOSzEwMCkgKi8KQEAgLTE3NTQsMjUgKzE2NjAsMjUgQEAKIAl9CiAKIAlpZiAobGVkb3ZlcikKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLCBsZWRvdmVyKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwgbGVkb3Zlcik7CiAKIAkvKiBFbmFibGUgcGh5IGludGVycnVwdCBvbiBhdXRvbmVnb3RpYXRpb24gY29tcGxldGUgKG9yIGxpbmsgdXApICovCiAJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCi0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fSVNfQU5fQ09NUEwpOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9JU19BTl9DT01QTCk7CiAJZWxzZQotCQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0RFRl9NU0spOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9ERUZfTVNLKTsKIH0KIAogc3RhdGljIHZvaWQgeXVrb25fcmVzZXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKLQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIDApOy8qIGRpc2FibGUgUEhZIElSUXMgKi8KLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gxLCAwKTsJLyogY2xlYXIgTUMgaGFzaCAqLwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDIsIDApOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDMsIDApOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDQsIDApOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIDApOy8qIGRpc2FibGUgUEhZIElSUXMgKi8KKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMSwgMCk7CS8qIGNsZWFyIE1DIGhhc2ggKi8KKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMiwgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDMsIDApOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0g0LCAwKTsKIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCi0JCQkgc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMKQorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMLAorCQkJIGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwpCiAJCQkgfCBHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpOwogfQogCkBAIC0xNzg1LDE3ICsxNjkxLDE3IEBACiAKIAkvKiBXQSBjb2RlIGZvciBDT01BIG1vZGUgLS0gc2V0IFBIWSByZXNldCAqLwogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0xJVEUgJiYKLQkgICAgY2hpcF9yZXYoaHcpID09IENISVBfUkVWX1lVX0xJVEVfQTMpCisJICAgIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKQogCQlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLAogCQkJICAgICAoc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKSB8IEdQX0RJUl85IHwgR1BfSU9fOSkpOwogCiAJLyogaGFyZCByZXNldCAqLwotCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9TRVQpOwotCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9TRVQpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIEdQQ19SU1RfU0VUKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUlNUX1NFVCk7CiAKIAkvKiBXQSBjb2RlIGZvciBDT01BIG1vZGUgLS0gY2xlYXIgUEhZIHJlc2V0ICovCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fTElURSAmJgotCSAgICBjaGlwX3JldihodykgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykKKwkgICAgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpCiAJCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sCiAJCQkgICAgIChza2dlX3JlYWQzMihodywgQjJfR1BfSU8pIHwgR1BfRElSXzkpCiAJCQkgICAgICYgfkdQX0lPXzkpOwpAQCAtMTgwNiwxMyArMTcxMiwxMyBAQAogCXJlZyB8PSBpc2NvcHBlcihodykgPyBHUENfSFdDRkdfR01JSV9DT1AgOiBHUENfSFdDRkdfR01JSV9GSUI7CiAKIAkvKiBDbGVhciBHTUMgcmVzZXQgKi8KLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIHJlZyB8IEdQQ19SU1RfU0VUKTsKLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIHJlZyB8IEdQQ19SU1RfQ0xSKTsKLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTiB8IEdNQ19SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCByZWcgfCBHUENfUlNUX1NFVCk7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgcmVnIHwgR1BDX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTiB8IEdNQ19SU1RfQ0xSKTsKIAlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpIHsKIAkJcmVnID0gR01fR1BDUl9BVV9BTExfRElTOwotCQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAotCQkJCSBza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpIHwgcmVnKTsKKwkJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCisJCQkJIGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpIHwgcmVnKTsKIAogCQlzd2l0Y2ggKHNrZ2UtPnNwZWVkKSB7CiAJCWNhc2UgU1BFRURfMTAwMDoKQEAgLTE4MjgsNyArMTczNCw3IEBACiAJCXJlZyA9IEdNX0dQQ1JfU1BFRURfMTAwMCB8IEdNX0dQQ1JfU1BFRURfMTAwIHwgR01fR1BDUl9EVVBfRlVMTDsKIAlzd2l0Y2ggKHNrZ2UtPmZsb3dfY29udHJvbCkgewogCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09GRik7CisJCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOwogCQlyZWcgfD0gR01fR1BDUl9GQ19UWF9ESVMgfCBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUzsKIAkJYnJlYWs7CiAJY2FzZSBGTE9XX01PREVfTE9DX1NFTkQ6CkBAIC0xODM2LDcgKzE3NDIsNyBAQAogCQlyZWcgfD0gR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVM7CiAJfQogCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKIAlza2dlX3JlYWQxNihodywgR01BQ19JUlFfU1JDKTsKIAogCXNwaW5fbG9ja19iaCgmaHctPnBoeV9sb2NrKTsKQEAgLTE4NDQsMjUgKzE3NTAsMjUgQEAKIAlzcGluX3VubG9ja19iaCgmaHctPnBoeV9sb2NrKTsKIAogCS8qIE1JQiBjbGVhciAqLwotCXJlZyA9IHNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fUEhZX0FERFIpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcgfCBHTV9QQVJfTUlCX0NMUik7CisJcmVnID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fUEhZX0FERFIpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9QSFlfQUREUiwgcmVnIHwgR01fUEFSX01JQl9DTFIpOwogCiAJZm9yIChpID0gMDsgaSA8IEdNX01JQl9DTlRfU0laRTsgaSsrKQotCQlza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX01JQl9DTlRfQkFTRSArIDgqaSk7Ci0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fUEhZX0FERFIsIHJlZyk7CisJCWdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX01JQl9DTlRfQkFTRSArIDgqaSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcpOwogCiAJLyogdHJhbnNtaXQgY29udHJvbCAqLwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RYX0NUUkwsIFRYX0NPTF9USFIoVFhfQ09MX0RFRikpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9DVFJMLCBUWF9DT0xfVEhSKFRYX0NPTF9ERUYpKTsKIAogCS8qIHJlY2VpdmUgY29udHJvbCByZWc6IHVuaWNhc3QgKyBtdWx0aWNhc3QgKyBubyBGQ1MgICovCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwKIAkJCSBHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX0NSQ19ESVMgfCBHTV9SWENSX01DRl9FTkEpOwogCiAJLyogdHJhbnNtaXQgZmxvdyBjb250cm9sICovCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfRkxPV19DVFJMLCAweGZmZmYpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9GTE9XX0NUUkwsIDB4ZmZmZik7CiAKIAkvKiB0cmFuc21pdCBwYXJhbWV0ZXIgKi8KLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9QQVJBTSwKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfUEFSQU0sCiAJCQkgVFhfSkFNX0xFTl9WQUwoVFhfSkFNX0xFTl9ERUYpIHwKIAkJCSBUWF9KQU1fSVBHX1ZBTChUWF9KQU1fSVBHX0RFRikgfAogCQkJIFRYX0lQR19KQU1fREFUQShUWF9JUEdfSkFNX0RFRikpOwpAQCAtMTg3MiwzMyArMTc3OCwzMyBAQAogCWlmIChody0+ZGV2W3BvcnRdLT5tdHUgPiAxNTAwKQogCQlyZWcgfD0gR01fU01PRF9KVU1CT19FTkE7CiAKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TRVJJQUxfTU9ERSwgcmVnKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fU0VSSUFMX01PREUsIHJlZyk7CiAKIAkvKiBwaHlzaWNhbCBhZGRyZXNzOiB1c2VkIGZvciBwYXVzZSBmcmFtZXMgKi8KLQlza2dlX2dtX3NldF9hZGRyKGh3LCBwb3J0LCBHTV9TUkNfQUREUl8xTCwgYWRkcik7CisJZ21hX3NldF9hZGRyKGh3LCBwb3J0LCBHTV9TUkNfQUREUl8xTCwgYWRkcik7CiAJLyogdmlydHVhbCBhZGRyZXNzIGZvciBkYXRhICovCi0Jc2tnZV9nbV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMkwsIGFkZHIpOworCWdtYV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMkwsIGFkZHIpOwogCiAJLyogZW5hYmxlIGludGVycnVwdCBtYXNrIGZvciBjb3VudGVyIG92ZXJmbG93cyAqLwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RYX0lSUV9NU0ssIDApOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0lSUV9NU0ssIDApOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RSX0lSUV9NU0ssIDApOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9JUlFfTVNLLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfSVJRX01TSywgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RSX0lSUV9NU0ssIDApOwogCiAJLyogSW5pdGlhbGl6ZSBNYWMgRmlmbyAqLwogCiAJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCi0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9HTUZfRkxfTVNLKSwgUlhfRkZfRkxfREVGX01TSyk7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX01TSyksIFJYX0ZGX0ZMX0RFRl9NU0spOwogCXJlZyA9IEdNRl9PUEVSX09OIHwgR01GX1JYX0ZfRkxfT047CiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fTElURSAmJgotCSAgICBjaGlwX3JldihodykgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykKKwkgICAgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpCiAJCXJlZyAmPSB+R01GX1JYX0ZfRkxfT047Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX0NMUik7Ci0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgcmVnKTsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0dNRl9GTF9USFIpLCBSWF9HTUZfRkxfVEhSX0RFRik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCByZWcpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9USFIpLCBSWF9HTUZfRkxfVEhSX0RFRik7CiAKIAkvKiBDb25maWd1cmUgVHggTUFDIEZJRk8gKi8KLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfT1BFUl9PTik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfT1BFUl9PTik7CiB9CiAKIHN0YXRpYyB2b2lkIHl1a29uX3N0b3Aoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKQEAgLTE5MDcsMTkgKzE4MTMsMTkgQEAKIAlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CiAKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9MSVRFICYmCi0JICAgIGNoaXBfcmV2KGh3KSA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CisJICAgIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CiAJCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sCiAJCQkgICAgIHNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTykgfCBHUF9ESVJfOSB8IEdQX0lPXzkpOwogCX0KIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCi0JCQkgc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKQorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAorCQkJIGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpCiAJCQkgJiB+KEdNX0dQQ1JfUlhfRU5BfEdNX0dQQ1JfUlhfRU5BKSk7Ci0Jc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKKwlnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKIAogCS8qIHNldCBHUEhZIENvbnRyb2wgcmVzZXQgKi8KLQlza2dlX2dtYV93cml0ZTMyKGh3LCBwb3J0LCBHUEhZX0NUUkwsIEdQQ19SU1RfU0VUKTsKLQlza2dlX2dtYV93cml0ZTMyKGh3LCBwb3J0LCBHTUFDX0NUUkwsIEdNQ19SU1RfU0VUKTsKKwlnbWFfd3JpdGUzMihodywgcG9ydCwgR1BIWV9DVFJMLCBHUENfUlNUX1NFVCk7CisJZ21hX3dyaXRlMzIoaHcsIHBvcnQsIEdNQUNfQ1RSTCwgR01DX1JTVF9TRVQpOwogfQogCiBzdGF0aWMgdm9pZCB5dWtvbl9nZXRfc3RhdHMoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwgdTY0ICpkYXRhKQpAQCAtMTkyOCwzOSArMTgzNCw0MCBAQAogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKIAlpbnQgaTsKIAotCWRhdGFbMF0gPSAodTY0KSBza2dlX2dtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1RYT19PS19ISSkgPDwgMzIKLQkJfCBza2dlX2dtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1RYT19PS19MTyk7Ci0JZGF0YVsxXSA9ICh1NjQpIHNrZ2VfZ21hX3JlYWQzMihodywgcG9ydCwgR01fUlhPX09LX0hJKSA8PCAzMgotCQl8IHNrZ2VfZ21hX3JlYWQzMihodywgcG9ydCwgR01fUlhPX09LX0xPKTsKKwlkYXRhWzBdID0gKHU2NCkgZ21hX3JlYWQzMihodywgcG9ydCwgR01fVFhPX09LX0hJKSA8PCAzMgorCQl8IGdtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1RYT19PS19MTyk7CisJZGF0YVsxXSA9ICh1NjQpIGdtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1JYT19PS19ISSkgPDwgMzIKKwkJfCBnbWFfcmVhZDMyKGh3LCBwb3J0LCBHTV9SWE9fT0tfTE8pOwogCiAJZm9yIChpID0gMjsgaSA8IEFSUkFZX1NJWkUoc2tnZV9zdGF0cyk7IGkrKykKLQkJZGF0YVtpXSA9IHNrZ2VfZ21hX3JlYWQzMihodywgcG9ydCwKKwkJZGF0YVtpXSA9IGdtYV9yZWFkMzIoaHcsIHBvcnQsCiAJCQkJCSAgc2tnZV9zdGF0c1tpXS5nbWFfb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgeXVrb25fbWFjX2ludHIoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldltwb3J0XSk7Ci0JdTggc3RhdHVzID0gc2tnZV9yZWFkOChodywgU0tHRU1BQ19SRUcocG9ydCwgR01BQ19JUlFfU1JDKSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJdTggc3RhdHVzID0gc2tnZV9yZWFkOChodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX1NSQykpOwogCi0JcHJfZGVidWcoInl1a29uX2ludHIgc3RhdHVzICV4XG4iLCBzdGF0dXMpOworCWlmIChuZXRpZl9tc2dfaW50cihza2dlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlczogbWFjIGludGVycnVwdCBzdGF0dXMgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwogCWlmIChzdGF0dXMgJiBHTV9JU19SWF9GRl9PUikgewogCQkrK3NrZ2UtPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9yczsKLQkJc2tnZV9nbWFfd3JpdGU4KGh3LCBwb3J0LCBSWF9HTUZfQ1RSTF9ULCBHTUZfQ0xJX1JYX0ZPKTsKKwkJZ21hX3dyaXRlOChodywgcG9ydCwgUlhfR01GX0NUUkxfVCwgR01GX0NMSV9SWF9GTyk7CiAJfQogCWlmIChzdGF0dXMgJiBHTV9JU19UWF9GRl9VUikgewogCQkrK3NrZ2UtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9yczsKLQkJc2tnZV9nbWFfd3JpdGU4KGh3LCBwb3J0LCBUWF9HTUZfQ1RSTF9ULCBHTUZfQ0xJX1RYX0ZVKTsKKwkJZ21hX3dyaXRlOChodywgcG9ydCwgVFhfR01GX0NUUkxfVCwgR01GX0NMSV9UWF9GVSk7CiAJfQogCiB9CiAKIHN0YXRpYyB1MTYgeXVrb25fc3BlZWQoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCB1MTYgYXV4KQogewotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFKQotCQlyZXR1cm4gKGF1eCAmIFBIWV9NX1BTX1NQRUVEXzEwMCkgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMDsKLQotCXN3aXRjaChhdXggJiBQSFlfTV9QU19TUEVFRF9NU0spIHsKKwlzd2l0Y2ggKGF1eCAmIFBIWV9NX1BTX1NQRUVEX01TSykgewogCWNhc2UgUEhZX01fUFNfU1BFRURfMTAwMDoKIAkJcmV0dXJuIFNQRUVEXzEwMDA7CiAJY2FzZSBQSFlfTV9QU19TUEVFRF8xMDA6CkBAIC0xOTgxLDE1ICsxODg4LDE1IEBACiAJLyogRW5hYmxlIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KIAlza2dlX3dyaXRlOChodywgR01BQ19JUlFfTVNLLCBHTUFDX0RFRl9NU0spOwogCi0JcmVnID0gc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKIAlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMIHx8IHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCiAJCXJlZyB8PSBHTV9HUENSX0RVUF9GVUxMOwogCiAJLyogZW5hYmxlIFJ4L1R4ICovCiAJcmVnIHw9IEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkE7Ci0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKIAotCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fREVGX01TSyk7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fREVGX01TSyk7CiAJc2tnZV9saW5rX3VwKHNrZ2UpOwogfQogCkBAIC0xOTk5LDE2ICsxOTA2LDE1IEBACiAJaW50IHBvcnQgPSBza2dlLT5wb3J0OwogCiAJcHJfZGVidWcoInl1a29uX2xpbmtfZG93blxuIik7Ci0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsKLQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgR01fR1BfQ1RSTCwKLQkJCSAgc2tnZV9nbV9waHlfcmVhZChodywgcG9ydCwgR01fR1BfQ1RSTCkKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCisJCQkgIGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBHTV9HUF9DVFJMKQogCQkJICAmIH4oR01fR1BDUl9SWF9FTkEgfCBHTV9HUENSX1RYX0VOQSkpOwogCi0JaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfWVVLT05fRkUgJiYKLQkgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9SRU1fU0VORCkgeworCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1JFTV9TRU5EKSB7CiAJCS8qIHJlc3RvcmUgQXN5bW1ldHJpYyBQYXVzZSBiaXQgKi8KLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLAotCQkJCSAgc2tnZV9nbV9waHlfcmVhZChodywgcG9ydCwKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwKKwkJCQkgIGdtX3BoeV9yZWFkKGh3LCBwb3J0LAogCQkJCQkJICAgUEhZX01BUlZfQVVORV9BRFYpCiAJCQkJICB8IFBIWV9NX0FOX0FTUCk7CiAKQEAgLTIwMjcsMjAgKzE5MzMsMjEgQEAKIAljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOwogCXUxNiBpc3RhdHVzLCBwaHlzdGF0OwogCi0JaXN0YXR1cyA9IHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9TVEFUKTsKLQlwaHlzdGF0ID0gc2tnZV9nbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX1NUQVQpOwotCXByX2RlYnVnKCJ5dWtvbiBwaHkgaW50ciBpc3RhdD0leCBwaHlfc3RhdD0leFxuIiwgaXN0YXR1cywgcGh5c3RhdCk7CisJaXN0YXR1cyA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfU1RBVCk7CisJcGh5c3RhdCA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfU1RBVCk7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoc2tnZSkpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHBoeSBpbnRlcnJ1cHQgc3RhdHVzIDB4JXggMHgleFxuIiwKKwkJICAgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgaXN0YXR1cywgcGh5c3RhdCk7CiAKIAlpZiAoaXN0YXR1cyAmIFBIWV9NX0lTX0FOX0NPTVBMKSB7Ci0JCWlmIChza2dlX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0xQKQorCQlpZiAoZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfTFApCiAJCSAgICAmIFBIWV9NX0FOX1JGKSB7CiAJCQlyZWFzb24gPSAicmVtb3RlIGZhdWx0IjsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAKLQkJaWYgKCEoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDKQotCQkgICAgJiYgKHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWXzEwMDBUX1NUQVQpCi0JCQkmIFBIWV9CXzEwMDBTX01TRikpIHsKKwkJaWYgKGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl8xMDAwVF9TVEFUKSAmIFBIWV9CXzEwMDBTX01TRikgewogCQkJcmVhc29uID0gIm1hc3Rlci9zbGF2ZSBmYXVsdCI7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQpAQCAtMjA1NCwxMCArMTk2MSw2IEBACiAJCQk/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CiAJCXNrZ2UtPnNwZWVkID0geXVrb25fc3BlZWQoaHcsIHBoeXN0YXQpOwogCi0JCS8qIFR4ICYgUnggUGF1c2UgRW5hYmxlZCBiaXRzIGFyZSBhdCA5Li44ICovCi0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMKQotCQkJcGh5c3RhdCA+Pj0gNjsKLQogCQkvKiBXZSBhcmUgdXNpbmcgSUVFRSA4MDIuM3ovRDUuMCBUYWJsZSAzNy00ICovCiAJCXN3aXRjaCAocGh5c3RhdCAmIFBIWV9NX1BTX1BBVVNFX01TSykgewogCQljYXNlIFBIWV9NX1BTX1BBVVNFX01TSzoKQEAgLTIwNzUsOSArMTk3OCw5IEBACiAKIAkJaWYgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfTk9ORSB8fAogCQkgICAgKHNrZ2UtPnNwZWVkIDwgU1BFRURfMTAwMCAmJiBza2dlLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpKQotCQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCQkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKIAkJZWxzZQotCQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CisJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CiAJCXl1a29uX2xpbmtfdXAoc2tnZSk7CiAJCXJldHVybjsKIAl9CkBAIC0yMTYxLDYgKzIwNjQsMTIgQEAKIAlpZiAobmV0aWZfbXNnX2lmdXAoc2tnZSkpCiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogZW5hYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOwogCisJaWYgKGRldi0+bXR1ID4gUlhfQlVGX1NJWkUpCisJCXNrZ2UtPnJ4X2J1Zl9zaXplID0gZGV2LT5tdHUgKyBFVEhfSExFTiArIE5FVF9JUF9BTElHTjsKKwllbHNlCisJCXNrZ2UtPnJ4X2J1Zl9zaXplID0gUlhfQlVGX1NJWkU7CisKKwogCXJ4X3NpemUgPSBza2dlLT5yeF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBza2dlX3J4X2Rlc2MpOwogCXR4X3NpemUgPSBza2dlLT50eF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBza2dlX3R4X2Rlc2MpOwogCXNrZ2UtPm1lbV9zaXplID0gdHhfc2l6ZSArIHJ4X3NpemU7CkBAIC0yMTczLDcgKzIwODIsOCBAQAogCWlmICgoZXJyID0gc2tnZV9yaW5nX2FsbG9jKCZza2dlLT5yeF9yaW5nLCBza2dlLT5tZW0sIHNrZ2UtPmRtYSkpKQogCQlnb3RvIGZyZWVfcGNpX21lbTsKIAotCWlmIChza2dlX3J4X2ZpbGwoc2tnZSkpCisJZXJyID0gc2tnZV9yeF9maWxsKHNrZ2UpOworCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9yeF9yaW5nOwogCiAJaWYgKChlcnIgPSBza2dlX3JpbmdfYWxsb2MoJnNrZ2UtPnR4X3JpbmcsIHNrZ2UtPm1lbSArIHJ4X3NpemUsCkBAIC0yMTgyLDYgKzIwOTIsMTAgQEAKIAogCXNrZ2UtPnR4X2F2YWlsID0gc2tnZS0+dHhfcmluZy5jb3VudCAtIDE7CiAKKwkvKiBFbmFibGUgSVJRIGZyb20gcG9ydCAqLworCWh3LT5pbnRyX21hc2sgfD0gcG9ydGlycW1hc2tbcG9ydF07CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKKwogCS8qIEluaXRpYWx6ZSBNQUMgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQogCQlnZW5lc2lzX21hY19pbml0KGh3LCBwb3J0KTsKQEAgLTIxODksNyArMjEwMyw3IEBACiAJCXl1a29uX21hY19pbml0KGh3LCBwb3J0KTsKIAogCS8qIENvbmZpZ3VyZSBSQU1idWZmZXJzICovCi0JY2h1bmsgPSBody0+cmFtX3NpemUgLyAoaXNkdWFscG9ydChodykgPyA0IDogMik7CisJY2h1bmsgPSBody0+cmFtX3NpemUgLyAoKGh3LT5wb3J0cyArIDEpKjIpOwogCXJhbV9hZGRyID0gaHctPnJhbV9vZmZzZXQgKyAyICogY2h1bmsgKiBwb3J0OwogCiAJc2tnZV9yYW1zZXQoaHcsIHJ4cWFkZHJbcG9ydF0sIHJhbV9hZGRyLCBjaHVuayk7CkBAIC0yMjI3LDcgKzIxNDEsNiBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAogCWRlbF90aW1lcl9zeW5jKCZza2dlLT5sZWRfYmxpbmspOwotCWRlbF90aW1lcl9zeW5jKCZza2dlLT5saW5rX2NoZWNrKTsKIAogCS8qIFN0b3AgdHJhbnNtaXR0ZXIgKi8KIAlza2dlX3dyaXRlOChodywgUV9BRERSKHR4cWFkZHJbcG9ydF0sIFFfQ1NSKSwgQ1NSX1NUT1ApOwpAQCAtMjI0MCwxMiArMjE1MywxMiBAQAogCQl5dWtvbl9zdG9wKHNrZ2UpOwogCiAJLyogRGlzYWJsZSBGb3JjZSBTeW5jIGJpdCBhbmQgRW5hYmxlIEFsbG9jIGJpdCAqLwotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWEFfQ1RSTCksCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWEFfQ1RSTCksCiAJCSAgICBUWEFfRElTX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKIAogCS8qIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciAqLwotCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhBX0lUSV9JTkkpLCAwTCk7Ci0Jc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWEFfTElNX0lOSSksIDBMKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWEFfSVRJX0lOSSksIDBMKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWEFfTElNX0lOSSksIDBMKTsKIAogCS8qIFJlc2V0IFBDSSBGSUZPICovCiAJc2tnZV93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKQEAgLTIyNjAsMTMgKzIxNzMsMTMgQEAKIAlza2dlX3dyaXRlMzIoaHcsIFFfQUREUihyeHFhZGRyW3BvcnRdLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfU1RPUCk7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9TVE9QKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX1NFVCk7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1NUT1ApOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1NUT1ApOwogCX0gZWxzZSB7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX1NFVCk7CiAJfQogCiAJLyogdHVybiBvZmYgbGVkJ3MgKi8KQEAgLTIyOTksMTAgKzIyMTIsMTAgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAoIXNwaW5fdHJ5bG9jaygmc2tnZS0+dHhfbG9jaykpIHsKLSAJCS8qIENvbGxpc2lvbiAtIHRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLyAKLSAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgCi0gCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsgCi0gCX0gCisgCQkvKiBDb2xsaXNpb24gLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KKyAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOworIAl9CiAKIAlpZiAodW5saWtlbHkoc2tnZS0+dHhfYXZhaWwgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsxKSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC0yMzMzLDcgKzIyNDYsNyBAQAogCQkgKiBkb2VzLiAgTG9va3MgbGlrZSBoYXJkd2FyZSBpcyB3cm9uZz8KIAkJICovCiAJCWlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAKLQkgICAgICAgICAgICAmJiBjaGlwX3JldihodykgPT0gMCAmJiBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OKQorCSAgICAgICAgICAgICYmIGh3LT5jaGlwX3JldiA9PSAwICYmIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04pCiAJCQljb250cm9sID0gQk1VX1RDUF9DSEVDSzsKIAkJZWxzZQogCQkJY29udHJvbCA9IEJNVV9VRFBfQ0hFQ0s7CkBAIC0yMzk0LDYgKzIzMDcsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tnZV90eF9mcmVlKHN0cnVjdCBza2dlX2h3ICpodywgc3RydWN0IHNrZ2VfZWxlbWVudCAqZSkKIHsKKwkvKiBUaGlzIHJpbmcgZWxlbWVudCBjYW4gYmUgc2tiIG9yIGZyYWdtZW50ICovCiAJaWYgKGUtPnNrYikgewogCQlwY2lfdW5tYXBfc2luZ2xlKGh3LT5wZGV2LAogCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGUsIG1hcGFkZHIpLApAQCAtMjQzOCwxNiArMjM1MiwxNyBAQAogc3RhdGljIGludCBza2dlX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CiAJaW50IGVyciA9IDA7CisJaW50IHJ1bm5pbmcgPSBuZXRpZl9ydW5uaW5nKGRldik7CiAKLQlpZihuZXdfbXR1IDwgRVRIX1pMRU4gfHwgbmV3X210dSA+IEVUSF9KVU1CT19NVFUpCisJaWYgKG5ld19tdHUgPCBFVEhfWkxFTiB8fCBuZXdfbXR1ID4gRVRIX0pVTUJPX01UVSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkZXYtPm10dSA9IG5ld19tdHU7CiAKLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJaWYgKHJ1bm5pbmcpCiAJCXNrZ2VfZG93bihkZXYpOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAocnVubmluZykKIAkJc2tnZV91cChkZXYpOwotCX0KIAogCXJldHVybiBlcnI7CiB9CkBAIC0yNDYyLDcgKzIzNzcsOSBAQAogCXUzMiBtb2RlOwogCXU4IGZpbHRlcls4XTsKIAotCW1vZGUgPSBza2dlX3htX3JlYWQzMihodywgcG9ydCwgWE1fTU9ERSk7CisJcHJfZGVidWcoImdlbmVzaXNfc2V0X211bHRpY2FzdCBmbGFncz0leCBjb3VudD0lZFxuIiwgZGV2LT5mbGFncywgZGV2LT5tY19jb3VudCk7CisKKwltb2RlID0geG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKIAltb2RlIHw9IFhNX01EX0VOQV9IQVNIOwogCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCiAJCW1vZGUgfD0gWE1fTURfRU5BX1BST007CkBAIC0yNDczLDE3ICsyMzkwLDE2IEBACiAJCW1lbXNldChmaWx0ZXIsIDB4ZmYsIHNpemVvZihmaWx0ZXIpKTsKIAllbHNlIHsKIAkJbWVtc2V0KGZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwotCQlmb3IoaSA9IDA7IGxpc3QgJiYgaSA8IGNvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KSB7Ci0JCQl1MzIgY3JjID0gY3JjMzJfbGUofjAsIGxpc3QtPmRtaV9hZGRyLCBFVEhfQUxFTik7Ci0JCQl1OCBiaXQgPSA2MyAtIChjcmMgJiA2Myk7Ci0KKwkJZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgY291bnQ7IGkrKywgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCXUzMiBjcmMsIGJpdDsKKwkJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgbGlzdC0+ZG1pX2FkZHIpOworCQkJYml0ID0gfmNyYyAmIDB4M2Y7CiAJCQlmaWx0ZXJbYml0LzhdIHw9IDEgPDwgKGJpdCU4KTsKIAkJfQogCX0KIAotCXNrZ2VfeG1fb3V0aGFzaChodywgcG9ydCwgWE1fSFNNLCBmaWx0ZXIpOwotCi0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBtb2RlKTsKKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBtb2RlKTsKKwl4bV9vdXRoYXNoKGh3LCBwb3J0LCBYTV9IU00sIGZpbHRlcik7CiB9CiAKIHN0YXRpYyB2b2lkIHl1a29uX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI0OTcsNyArMjQxMyw3IEBACiAKIAltZW1zZXQoZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7CiAKLQlyZWcgPSBza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwpOworCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwpOwogCXJlZyB8PSBHTV9SWENSX1VDRl9FTkE7CiAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAJCS8qIHByb21pc2Npb3VzICovCkBAIC0yNTEwLDIzICsyNDI2LDIzIEBACiAJCWludCBpOwogCQlyZWcgfD0gR01fUlhDUl9NQ0ZfRU5BOwogCi0JCWZvcihpID0gMDsgbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlmb3IgKGkgPSAwOyBsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KSB7CiAJCQl1MzIgYml0ID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBsaXN0LT5kbWlfYWRkcikgJiAweDNmOwogCQkJZmlsdGVyW2JpdC84XSB8PSAxIDw8IChiaXQlOCk7CiAJCX0KIAl9CiAKIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDEsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDEsCiAJCQkgKHUxNilmaWx0ZXJbMF0gfCAoKHUxNilmaWx0ZXJbMV0gPDwgOCkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDIsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDIsCiAJCQkgKHUxNilmaWx0ZXJbMl0gfCAoKHUxNilmaWx0ZXJbM10gPDwgOCkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDMsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDMsCiAJCQkgKHUxNilmaWx0ZXJbNF0gfCAoKHUxNilmaWx0ZXJbNV0gPDwgOCkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDQsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDQsCiAJCQkgKHUxNilmaWx0ZXJbNl0gfCAoKHUxNilmaWx0ZXJbN10gPDwgOCkpOwogCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwgcmVnKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYmFkX3BoeV9zdGF0dXMoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCB1MzIgc3RhdHVzKQpAQCAtMjU0NSwyOCArMjQ2MSw3NiBAQAogCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiByeCBlcnIsIHNsb3QgJWQgY29udHJvbCAweCV4IHN0YXR1cyAweCV4XG4iLAogCQkgICAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lLCBzbG90LCBjb250cm9sLCBzdGF0dXMpOwogCi0JaWYgKChjb250cm9sICYgKEJNVV9FT0Z8Qk1VX1NURikpICE9IChCTVVfU1RGfEJNVV9FT0YpCi0JICAgIHx8IChjb250cm9sICYgQk1VX0JCQykgPiBza2dlLT5uZXRkZXYtPm10dSArIFZMQU5fRVRIX0hMRU4pCisJaWYgKChjb250cm9sICYgKEJNVV9FT0Z8Qk1VX1NURikpICE9IChCTVVfU1RGfEJNVV9FT0YpKQogCQlza2dlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCWVsc2UgewotCQlpZiAoc2tnZS0+aHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7Ci0JCQlpZiAoc3RhdHVzICYgKFhNUl9GU19SVU5UfFhNUl9GU19MTkdfRVJSKSkKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJaWYgKHN0YXR1cyAmIFhNUl9GU19GUkFfRVJSKQotCQkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiBYTVJfRlNfRkNTX0VSUikKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQl9IGVsc2UgewotCQkJaWYgKHN0YXR1cyAmIChHTVJfRlNfTE9OR19FUlJ8R01SX0ZTX1VOX1NJWkUpKQotCQkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgR01SX0ZTX0ZSQUdNRU5UKQotCQkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiBHTVJfRlNfQ1JDX0VSUikKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQl9CisJZWxzZSBpZiAoc2tnZS0+aHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJCWlmIChzdGF0dXMgJiAoWE1SX0ZTX1JVTlR8WE1SX0ZTX0xOR19FUlIpKQorCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFhNUl9GU19GUkFfRVJSKQorCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgWE1SX0ZTX0ZDU19FUlIpCisJCQlza2dlLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOworCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgJiAoR01SX0ZTX0xPTkdfRVJSfEdNUl9GU19VTl9TSVpFKSkKKwkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBHTVJfRlNfRlJBR01FTlQpCisJCQlza2dlLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBHTVJfRlNfQ1JDX0VSUikKKwkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJfQogfQogCisvKiBHZXQgcmVjZWl2ZSBidWZmZXIgZnJvbSBkZXNjcmlwdG9yLgorICogSGFuZGxlcyBjb3B5IG9mIHNtYWxsIGJ1ZmZlcnMgYW5kIHJlYWxsb2NhdGlvbiBmYWlsdXJlcworICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza2dlX3J4X2dldChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLAorCQkJCQkgIHN0cnVjdCBza2dlX2VsZW1lbnQgKmUsCisJCQkJCSAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgKnNrYjsKKworCWlmIChsZW4gPCBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQluc2tiID0gc2tnZV9yeF9hbGxvYyhza2dlLT5uZXRkZXYsIGxlbiArIE5FVF9JUF9BTElHTik7CisJCWlmICh1bmxpa2VseSghbnNrYikpCisJCQlyZXR1cm4gTlVMTDsKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2tnZS0+aHctPnBkZXYsCisJCQkJCSAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKKwkJCQkJICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbWVtY3B5KG5za2ItPmRhdGEsIGUtPnNrYi0+ZGF0YSwgbGVuKTsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNrZ2UtPmh3LT5wZGV2LAorCQkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIoZSwgbWFwYWRkciksCisJCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJaWYgKHNrZ2UtPnJ4X2NzdW0pIHsKKwkJCXN0cnVjdCBza2dlX3J4X2Rlc2MgKnJkID0gZS0+ZGVzYzsKKwkJCW5za2ItPmNzdW0gPSBsZTE2X3RvX2NwdShyZC0+Y3N1bTIpOworCQkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJCX0KKwkJc2tnZV9yeF9yZXVzZShlLCBza2dlLT5yeF9idWZfc2l6ZSk7CisJCXJldHVybiBuc2tiOworCX0gZWxzZSB7CisJCW5za2IgPSBza2dlX3J4X2FsbG9jKHNrZ2UtPm5ldGRldiwgc2tnZS0+cnhfYnVmX3NpemUpOworCQlpZiAodW5saWtlbHkoIW5za2IpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcGNpX3VubWFwX3NpbmdsZShza2dlLT5ody0+cGRldiwKKwkJCQkgcGNpX3VubWFwX2FkZHIoZSwgbWFwYWRkciksCisJCQkJIHBjaV91bm1hcF9sZW4oZSwgbWFwbGVuKSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiID0gZS0+c2tiOworCQlpZiAoc2tnZS0+cnhfY3N1bSkgeworCQkJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOworCQkJc2tiLT5jc3VtID0gbGUxNl90b19jcHUocmQtPmNzdW0yKTsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJCX0KKworCQlza2dlX3J4X3NldHVwKHNrZ2UsIGUsIG5za2IsIHNrZ2UtPnJ4X2J1Zl9zaXplKTsKKwkJcmV0dXJuIHNrYjsKKwl9Cit9CisKKwogc3RhdGljIGludCBza2dlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCiB7CiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yNTc1LDEzICsyNTM5LDEyIEBACiAJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKIAl1bnNpZ25lZCBpbnQgdG9fZG8gPSBtaW4oZGV2LT5xdW90YSwgKmJ1ZGdldCk7CiAJdW5zaWduZWQgaW50IHdvcmtfZG9uZSA9IDA7Ci0JaW50IGRvbmU7Ci0Jc3RhdGljIGNvbnN0IHUzMiBpcnFtYXNrW10gPSB7IElTX1BPUlRfMSwgSVNfUE9SVF8yIH07CiAKLQlmb3IgKGUgPSByaW5nLT50b19jbGVhbjsgZSAhPSByaW5nLT50b191c2UgJiYgd29ya19kb25lIDwgdG9fZG87Ci0JICAgICBlID0gZS0+bmV4dCkgeworCXByX2RlYnVnKCJza2dlX3BvbGxcbiIpOworCisJZm9yIChlID0gcmluZy0+dG9fY2xlYW47IHdvcmtfZG9uZSA8IHRvX2RvOyBlID0gZS0+bmV4dCkgewogCQlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZCA9IGUtPmRlc2M7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBlLT5za2I7CisJCXN0cnVjdCBza19idWZmICpza2I7CiAJCXUzMiBjb250cm9sLCBsZW4sIHN0YXR1czsKIAogCQlybWIoKTsKQEAgLTI1OTAsMTkgKzI1NTMsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWxlbiA9IGNvbnRyb2wgJiBCTVVfQkJDOwotCQllLT5za2IgPSBOVUxMOwotCi0JCXBjaV91bm1hcF9zaW5nbGUoaHctPnBkZXYsCi0JCQkJIHBjaV91bm1hcF9hZGRyKGUsIG1hcGFkZHIpLAotCQkJCSBwY2lfdW5tYXBfbGVuKGUsIG1hcGxlbiksCi0JCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0KIAkJc3RhdHVzID0gcmQtPnN0YXR1czsKLQkJaWYgKChjb250cm9sICYgKEJNVV9FT0Z8Qk1VX1NURikpICE9IChCTVVfU1RGfEJNVV9FT0YpCi0JCSAgICAgfHwgbGVuID4gZGV2LT5tdHUgKyBWTEFOX0VUSF9ITEVOCi0JCSAgICAgfHwgYmFkX3BoeV9zdGF0dXMoaHcsIHN0YXR1cykpIHsKKworCQlpZiAodW5saWtlbHkoKGNvbnRyb2wgJiAoQk1VX0VPRnxCTVVfU1RGKSkgIT0gKEJNVV9TVEZ8Qk1VX0VPRikKKwkJCSAgICAgfHwgYmFkX3BoeV9zdGF0dXMoaHcsIHN0YXR1cykpKSB7CiAJCQlza2dlX3J4X2Vycm9yKHNrZ2UsIGUgLSByaW5nLT5zdGFydCwgY29udHJvbCwgc3RhdHVzKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXNrZ2VfcnhfcmV1c2UoZSwgc2tnZS0+cnhfYnVmX3NpemUpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMjYxMCw0MyArMjU2NiwzNyBAQAogCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlczogcnggc2xvdCAldGQgc3RhdHVzIDB4JXggbGVuICVkXG4iLAogCQkJICAgZGV2LT5uYW1lLCBlIC0gcmluZy0+c3RhcnQsIHJkLT5zdGF0dXMsIGxlbik7CiAKLQkJc2tiX3B1dChza2IsIGxlbik7Ci0JCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYiA9IHNrZ2VfcnhfZ2V0KHNrZ2UsIGUsIGxlbik7CisJCWlmIChsaWtlbHkoc2tiKSkgeworCQkJc2tiX3B1dChza2IsIGxlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCi0JCWlmIChza2dlLT5yeF9jc3VtKSB7Ci0JCQlza2ItPmNzdW0gPSBsZTE2X3RvX2NwdShyZC0+Y3N1bTIpOwotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKLQkJfQorCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAKLQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQotCQkrK3dvcmtfZG9uZTsKKwkJCSsrd29ya19kb25lOworCQl9IGVsc2UKKwkJCXNrZ2VfcnhfcmV1c2UoZSwgc2tnZS0+cnhfYnVmX3NpemUpOwogCX0KIAlyaW5nLT50b19jbGVhbiA9IGU7CiAKLQkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKLQlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKLQlkb25lID0gd29ya19kb25lIDwgdG9fZG87Ci0KLQlpZiAoc2tnZV9yeF9maWxsKHNrZ2UpKQotCQlkb25lID0gMDsKLQogCS8qIHJlc3RhcnQgcmVjZWl2ZXIgKi8KIAl3bWIoKTsKIAlza2dlX3dyaXRlOChodywgUV9BRERSKHJ4cWFkZHJbc2tnZS0+cG9ydF0sIFFfQ1NSKSwKIAkJICAgIENTUl9TVEFSVCB8IENTUl9JUlFfQ0xfRik7CiAKLQlpZiAoZG9uZSkgewotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlody0+aW50cl9tYXNrIHw9IGlycW1hc2tbc2tnZS0+cG9ydF07Ci0JCS8qIE9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBkYXRhIGNhbiBnZXQgaW50ZXJydXB0ZWQgKi8KLQkJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKLQkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQorCSpidWRnZXQgLT0gd29ya19kb25lOworCWRldi0+cXVvdGEgLT0gd29ya19kb25lOwogCi0JcmV0dXJuICFkb25lOworCWlmICh3b3JrX2RvbmUgPj0gIHRvX2RvKQorCQlyZXR1cm4gMTsgLyogbm90IGRvbmUgKi8KKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCWh3LT5pbnRyX21hc2sgfD0gcG9ydGlycW1hc2tbc2tnZS0+cG9ydF07CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI2NTcsNyArMjYwNyw3IEBACiAJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKIAogCXNwaW5fbG9jaygmc2tnZS0+dHhfbG9jayk7Ci0JZm9yKGUgPSByaW5nLT50b19jbGVhbjsgZSAhPSByaW5nLT50b191c2U7IGUgPSBlLT5uZXh0KSB7CisJZm9yIChlID0gcmluZy0+dG9fY2xlYW47IGUgIT0gcmluZy0+dG9fdXNlOyBlID0gZS0+bmV4dCkgewogCQlzdHJ1Y3Qgc2tnZV90eF9kZXNjICp0ZCA9IGUtPmRlc2M7CiAJCXUzMiBjb250cm9sOwogCkBAIC0yNjkwLDEyICsyNjQwLDEyIEBACiAJICAgICAgIDogKHBvcnQgPT0gMCA/ICIocG9ydCBBKSI6ICIocG9ydCBCIikpOwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKLQkJc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLAorCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLAogCQkJICAgICBNRkZfQ0xSX1BFUlIpOwogCWVsc2UKIAkJLyogSFctQnVnICM4OiBjbGVhcmVkIGJ5IEdNRl9DTElfVFhfRkMgaW5zdGVhZCBvZiBHTUZfQ0xJX1RYX1BFICovCi0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwKLQkJCSAgICAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJiBjaGlwX3JldihodykgPT0gMCkKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwKKwkJCSAgICAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJiBody0+Y2hpcF9yZXYgPT0gMCkKIAkJCSAgICA/IEdNRl9DTElfVFhfRkMgOiBHTUZfQ0xJX1RYX1BFKTsKIH0KIApAQCAtMjcwMywxNiArMjY1MywxNiBAQAogewogCXUxNiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBza2dlX3JlYWQxNihodywgU0tHRVBDSV9SRUcoUENJX1NUQVRVUykpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzKTsKIAlza2dlX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VQQ0lfUkVHKFBDSV9TVEFUVVMpLAotCQkgICAgIHN0YXR1cyB8IFBDSV9TVEFUVVNfRVJST1JfQklUUyk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfU1RBVFVTLAorCQkJICAgICAgc3RhdHVzIHwgUENJX1NUQVRVU19FUlJPUl9CSVRTKTsKIAlza2dlX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CiB9CiAKIHN0YXRpYyB2b2lkIHNrZ2VfbWFjX2ludHIoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSAKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQogCQlnZW5lc2lzX21hY19pbnRyKGh3LCBwb3J0KTsKIAllbHNlCiAJCXl1a29uX21hY19pbnRyKGh3LCBwb3J0KTsKQEAgLTI3MjYsOSArMjY3Niw5IEBACiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewogCQkvKiBjbGVhciB4bWFjIGVycm9ycyAqLwogCQlpZiAoaHdzdGF0dXMgJiAoSVNfTk9fU1RBVF9NMXxJU19OT19USVNUX00xKSkKLQkJCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcoMCwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlNUQVQpOworCQkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcoMCwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlNUQVQpOwogCQlpZiAoaHdzdGF0dXMgJiAoSVNfTk9fU1RBVF9NMnxJU19OT19USVNUX00yKSkKLQkJCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcoMCwgUlhfTUZGX0NUUkwyKSwgTUZGX0NMUl9JTlNUQVQpOworCQkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcoMCwgUlhfTUZGX0NUUkwyKSwgTUZGX0NMUl9JTlNUQVQpOwogCX0gZWxzZSB7CiAJCS8qIFRpbWVzdGFtcCAodW51c2VkKSBvdmVyZmxvdyAqLwogCQlpZiAoaHdzdGF0dXMgJiBJU19JUlFfVElTVF9PVikKQEAgLTI4MDMsOCArMjc1Myw4IEBACiAKIAkJCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX0dFTkVTSVMpCiAJCQkJeXVrb25fcGh5X2ludHIoc2tnZSk7Ci0JCQllbHNlIGlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pCi0JCQkJZ2VuZXNpc19iY29tX2ludHIoc2tnZSk7CisJCQllbHNlCisJCQkJYmNvbV9waHlfaW50cihza2dlKTsKIAkJfQogCX0KIAlzcGluX3VubG9jaygmaHctPnBoeV9sb2NrKTsKQEAgLTI4MjQsMTkgKzI3NzQsMTQgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJc3RhdHVzICY9IGh3LT5pbnRyX21hc2s7Ci0KLQlpZiAoKHN0YXR1cyAmIElTX1IxX0YpICYmIG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoaHctPmRldlswXSkpIHsKLQkJc3RhdHVzICY9IH5JU19SMV9GOworCWlmIChzdGF0dXMgJiBJU19SMV9GKSB7CiAJCWh3LT5pbnRyX21hc2sgJj0gfklTX1IxX0Y7Ci0JCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7Ci0JCV9fbmV0aWZfcnhfc2NoZWR1bGUoaHctPmRldlswXSk7CisJCW5ldGlmX3J4X3NjaGVkdWxlKGh3LT5kZXZbMF0pOwogCX0KIAotCWlmICgoc3RhdHVzICYgSVNfUjJfRikgJiYgbmV0aWZfcnhfc2NoZWR1bGVfcHJlcChody0+ZGV2WzFdKSkgewotCQlzdGF0dXMgJj0gfklTX1IyX0Y7CisJaWYgKHN0YXR1cyAmIElTX1IyX0YpIHsKIAkJaHctPmludHJfbWFzayAmPSB+SVNfUjJfRjsKLQkJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKLQkJX19uZXRpZl9yeF9zY2hlZHVsZShody0+ZGV2WzFdKTsKKwkJbmV0aWZfcnhfc2NoZWR1bGUoaHctPmRldlsxXSk7CiAJfQogCiAJaWYgKHN0YXR1cyAmIElTX1hBMV9GKQpAQCAtMjg0NSw5ICsyNzkwLDI3IEBACiAJaWYgKHN0YXR1cyAmIElTX1hBMl9GKQogCQlza2dlX3R4X2ludHIoaHctPmRldlsxXSk7CiAKKwlpZiAoc3RhdHVzICYgSVNfUEFfVE9fUlgxKSB7CisJCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihody0+ZGV2WzBdKTsKKwkJKytza2dlLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCXNrZ2Vfd3JpdGUxNihodywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1JYMSk7CisJfQorCisJaWYgKHN0YXR1cyAmIElTX1BBX1RPX1JYMikgeworCQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldlsxXSk7CisJCSsrc2tnZS0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzOworCQlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19SWDIpOworCX0KKworCWlmIChzdGF0dXMgJiBJU19QQV9UT19UWDEpCisJCXNrZ2Vfd3JpdGUxNihodywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1RYMSk7CisKKwlpZiAoc3RhdHVzICYgSVNfUEFfVE9fVFgyKQorCQlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19UWDIpOworCiAJaWYgKHN0YXR1cyAmIElTX01BQzEpCiAJCXNrZ2VfbWFjX2ludHIoaHcsIDApOwotCQorCiAJaWYgKHN0YXR1cyAmIElTX01BQzIpCiAJCXNrZ2VfbWFjX2ludHIoaHcsIDEpOwogCkBAIC0yODU5LDggKzI4MjIsNyBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZody0+ZXh0X3Rhc2tsZXQpOwogCX0KIAotCWlmIChzdGF0dXMpCi0JCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTI5MDQsOSArMjg2Niw2IEBACiAJeyBDSElQX0lEX1lVS09OLAkgIll1a29uIiB9LAogCXsgQ0hJUF9JRF9ZVUtPTl9MSVRFLAkgIll1a29uLUxpdGUifSwKIAl7IENISVBfSURfWVVLT05fTFAsCSAiWXVrb24tTFAifSwKLQl7IENISVBfSURfWVVLT05fWEwsCSAiWXVrb24tMiBYTCJ9LAotCXsgQ0hJUF9JRF9ZVUtPTl9FQywJICJZVUtPTi0yIEVDIn0sCi0JeyBDSElQX0lEX1lVS09OX0ZFLAkgIllVS09OLTIgRkUifSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpza2dlX2JvYXJkX25hbWUoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQpAQCAtMjkzMCw4ICsyODg5LDggQEAKIHN0YXRpYyBpbnQgc2tnZV9yZXNldChzdHJ1Y3Qgc2tnZV9odyAqaHcpCiB7CiAJdTE2IGN0c3Q7Ci0JdTggdDg7Ci0JaW50IGksIHBvcnRzOworCXU4IHQ4LCBtYWNfY2ZnOworCWludCBpOwogCiAJY3RzdCA9IHNrZ2VfcmVhZDE2KGh3LCBCMF9DVFNUKTsKIApAQCAtMjk1MiwxMiArMjkxMSw5IEBACiAJaHctPnBoeV90eXBlID0gc2tnZV9yZWFkOChodywgQjJfRV8xKSAmIDB4ZjsKIAlody0+cG1kX3R5cGUgPSBza2dlX3JlYWQ4KGh3LCBCMl9QTURfVFlQKTsKIAotCXN3aXRjaChody0+Y2hpcF9pZCkgeworCXN3aXRjaCAoaHctPmNoaXBfaWQpIHsKIAljYXNlIENISVBfSURfR0VORVNJUzoKIAkJc3dpdGNoIChody0+cGh5X3R5cGUpIHsKLQkJY2FzZSBTS19QSFlfWE1BQzoKLQkJCWh3LT5waHlfYWRkciA9IFBIWV9BRERSX1hNQUM7Ci0JCQlicmVhazsKIAkJY2FzZSBTS19QSFlfQkNPTToKIAkJCWh3LT5waHlfYWRkciA9IFBIWV9BRERSX0JDT007CiAJCQlicmVhazsKQEAgLTI5ODYsOCArMjk0Miw5IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlody0+bWFjX2NmZyA9IHNrZ2VfcmVhZDgoaHcsIEIyX01BQ19DRkcpOwotCXBvcnRzID0gaXNkdWFscG9ydChodykgPyAyIDogMTsKKwltYWNfY2ZnID0gc2tnZV9yZWFkOChodywgQjJfTUFDX0NGRyk7CisJaHctPnBvcnRzID0gKG1hY19jZmcgJiBDRkdfU05HX01BQykgPyAxIDogMjsKKwlody0+Y2hpcF9yZXYgPSAobWFjX2NmZyAmIENGR19DSElQX1JfTVNLKSA+PiA0OwogCiAJLyogcmVhZCB0aGUgYWRhcHRlcnMgUkFNIHNpemUgKi8KIAl0OCA9IHNrZ2VfcmVhZDgoaHcsIEIyX0VfMCk7CkBAIC0zMDEwLDkgKzI5NjcsOSBAQAogCQkvKiBzd2l0Y2ggcG93ZXIgdG8gVkNDIChXQSBmb3IgVkFVWCBwcm9ibGVtKSAqLwogCQlza2dlX3dyaXRlOChodywgQjBfUE9XRVJfQ1RSTCwKIAkJCSAgICBQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfCBQQ19WQVVYX09GRiB8IFBDX1ZDQ19PTik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7Ci0JCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfU0VUKTsKLQkJCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcoaSwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspIHsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfU0VUKTsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfQ0xSKTsKIAkJfQogCX0KIApAQCAtMzAyMiw4ICsyOTc5LDggQEAKIAlza2dlX3dyaXRlOChodywgQjBfTEVELCBMRURfU1RBVF9PTik7CiAKIAkvKiBlbmFibGUgdGhlIFR4IEFyYml0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspCi0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhpLCBUWEFfQ1RSTCksIFRYQV9FTkFfQVJCKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspCisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcoaSwgVFhBX0NUUkwpLCBUWEFfRU5BX0FSQik7CiAKIAkvKiBJbml0aWFsaXplIHJhbSBpbnRlcmZhY2UgKi8KIAlza2dlX3dyaXRlMTYoaHcsIEIzX1JJX0NUUkwsIFJJX1JTVF9DTFIpOwpAQCAtMzA1MCwxNiArMzAwNywxNCBAQAogCXNrZ2Vfd3JpdGUzMihodywgQjJfSVJRTV9JTkksIHNrZ2VfdXNlY3MyY2xrKGh3LCAxMDApKTsKIAlza2dlX3dyaXRlMzIoaHcsIEIyX0lSUU1fQ1RSTCwgVElNX1NUQVJUKTsKIAotCWh3LT5pbnRyX21hc2sgPSBJU19IV19FUlIgfCBJU19FWFRfUkVHIHwgSVNfUE9SVF8xOwotCWlmIChpc2R1YWxwb3J0KGh3KSkKLQkJaHctPmludHJfbWFzayB8PSBJU19QT1JUXzI7CisJaHctPmludHJfbWFzayA9IElTX0hXX0VSUiB8IElTX0VYVF9SRUc7CiAJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKIAogCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX0dFTkVTSVMpCiAJCXNrZ2Vfd3JpdGU4KGh3LCBHTUFDX0lSUV9NU0ssIDApOwogCiAJc3Bpbl9sb2NrX2JoKCZody0+cGh5X2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CiAJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCiAJCQlnZW5lc2lzX3Jlc2V0KGh3LCBpKTsKIAkJZWxzZQpAQCAtMzA3MSw3ICszMDI2LDggQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBuZXR3b3JrIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpza2dlX2RldmluaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc2tnZV9kZXZpbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsCisJCQkJICAgICAgIGludCBoaWdobWVtKQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqc2tnZSkpOwpAQCAtMzEwNCw2ICszMDYwLDggQEAKICNlbmRpZgogCWRldi0+aXJxID0gaHctPnBkZXYtPmlycTsKIAlkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9MTFRYOworCWlmIChoaWdobWVtKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAogCXNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNrZ2UtPm5ldGRldiA9IGRldjsKQEAgLTMxMTcsNyArMzA3NSw3IEBACiAJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTU1FVFJJQzsKIAlza2dlLT5kdXBsZXggPSAtMTsKIAlza2dlLT5zcGVlZCA9IC0xOwotCXNrZ2UtPmFkdmVydGlzaW5nID0gc2tnZV9tb2Rlcyhodyk7CisJc2tnZS0+YWR2ZXJ0aXNpbmcgPSBza2dlX3N1cHBvcnRlZF9tb2Rlcyhodyk7CiAKIAlody0+ZGV2W3BvcnRdID0gZGV2OwogCkBAIC0zMTI1LDEwICszMDgzLDYgQEAKIAogCXNwaW5fbG9ja19pbml0KCZza2dlLT50eF9sb2NrKTsKIAotCWluaXRfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2spOwotCXNrZ2UtPmxpbmtfY2hlY2suZnVuY3Rpb24gPSBza2dlX2xpbmtfdGltZXI7Ci0Jc2tnZS0+bGlua19jaGVjay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNrZ2U7Ci0KIAlpbml0X3RpbWVyKCZza2dlLT5sZWRfYmxpbmspOwogCXNrZ2UtPmxlZF9ibGluay5mdW5jdGlvbiA9IHNrZ2VfYmxpbmtfdGltZXI7CiAJc2tnZS0+bGVkX2JsaW5rLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2tnZTsKQEAgLTMyMzIsMTQgKzMxODYsMTEgQEAKIAogCXByaW50ayhLRVJOX0lORk8gUEZYICJhZGRyIDB4JWx4IGlycSAlZCBjaGlwICVzIHJldiAlZFxuIiwKIAkgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwZGV2LT5pcnEsCi0JICAgICAgIHNrZ2VfYm9hcmRfbmFtZShodyksIGNoaXBfcmV2KGh3KSk7CisJICAgICAgIHNrZ2VfYm9hcmRfbmFtZShodyksIGh3LT5jaGlwX3Jldik7CiAKLQlpZiAoKGRldiA9IHNrZ2VfZGV2aW5pdChodywgMCkpID09IE5VTEwpCisJaWYgKChkZXYgPSBza2dlX2RldmluaXQoaHcsIDAsIHVzaW5nX2RhYykpID09IE5VTEwpCiAJCWdvdG8gZXJyX291dF9sZWRfb2ZmOwogCi0JaWYgKHVzaW5nX2RhYykKLQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7Ci0KIAlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CkBAIC0zMjQ4LDEwICszMTk5LDcgQEAKIAogCXNrZ2Vfc2hvd19hZGRyKGRldik7CiAKLQlpZiAoaXNkdWFscG9ydChodykgJiYgKGRldjEgPSBza2dlX2RldmluaXQoaHcsIDEpKSkgewotCQlpZiAodXNpbmdfZGFjKQotCQkJZGV2MS0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCisJaWYgKGh3LT5wb3J0cyA+IDEgJiYgKGRldjEgPSBza2dlX2RldmluaXQoaHcsIDEsIHVzaW5nX2RhYykpKSB7CiAJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2MSkgPT0gMCkKIAkJCXNrZ2Vfc2hvd19hZGRyKGRldjEpOwogCQllbHNlIHsKQEAgLTMyODgsNyArMzIzNiw3IEBACiAJc3RydWN0IHNrZ2VfaHcgKmh3ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MCwgKmRldjE7CiAKLQlpZighaHcpCisJaWYgKCFodykKIAkJcmV0dXJuOwogCiAJaWYgKChkZXYxID0gaHctPmRldlsxXSkpCkBAIC0zMzExLDEyICszMjU5LDEyIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc2tnZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IHNrZ2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBza2dlX2h3ICpodyAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGksIHdvbCA9IDA7CiAKLQlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W2ldOwogCiAJCWlmIChkZXYpIHsKQEAgLTMzMzEsNyArMzI3OSw3IEBACiAJfQogCiAJcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIHN0YXRlLCB3b2wpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgd29sKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiAKQEAgLTMzNDksMTEgKzMyOTcsMTEgQEAKIAogCXNrZ2VfcmVzZXQoaHcpOwogCi0JZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAkJaWYgKGRldikgewogCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwotCQkJaWYobmV0aWZfcnVubmluZyhkZXYpKQorCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJCQlza2dlX3VwKGRldik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmggYi9kcml2ZXJzL25ldC9za2dlLmgKaW5kZXggMzZjNjJiNi4uZmNlZDNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuaApAQCAtNywzMSArNyw3IEBACiAvKiBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwogI2RlZmluZSBQQ0lfREVWX1JFRzEJMHg0MAogI2RlZmluZSBQQ0lfREVWX1JFRzIJMHg0NAotI2lmbmRlZiBQQ0lfVlBECi0jZGVmaW5lIFBDSV9WUEQJCTB4NTAKLSNlbmRpZgotCi0vKglQQ0lfT1VSX1JFR18yCQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDIgKi8KLWVudW0gewotCVBDSV9WUERfV1JfVEhSICA9IDB4ZmY8PDI0LCAvKiBCaXQgMzEuLjI0OglWUEQgV3JpdGUgVGhyZXNob2xkICovCi0JUENJX0RFVl9TRUwJPSAweDdmPDwxNywgLyogQml0IDIzLi4xNzoJRUVQUk9NIERldmljZSBTZWxlY3QgKi8KLQlQQ0lfVlBEX1JPTV9TWiAgPSA3ICAgPDwxNCwgLyogQml0IDE2Li4xNDoJVlBEIFJPTSBTaXplCSovCi0gCQkJCSAgICAvKiBCaXQgMTMuLjEyOglyZXNlcnZlZAkqLwotCVBDSV9FTl9EVU1NWV9SRCA9IDE8PDMsIC8qIEVuYWJsZSBEdW1teSBSZWFkICovCi0JUENJX1JFVl9ERVNDICAgID0gMTw8MiwgLyogUmV2ZXJzZSBEZXNjLiBCeXRlcyAqLwotCVBDSV9VU0VEQVRBNjQgICA9IDE8PDAsIC8qIFVzZSA2NEJpdCBEYXRhIGJ1cyBleHQgKi8KLX07Ci0KLS8qCVBDSV9WUERfQURSX1JFRwkJMTYgYml0CVZQRCBBZGRyZXNzIFJlZ2lzdGVyICovCi1lbnVtIHsKLQlQQ0lfVlBEX0ZMQUcJPSAxPDwxNSwgIC8qIHN0YXJ0cyBWUEQgcmQvd3IgY3ljbGUgKi8KLQlQQ0lfVlBEX0FEUl9NU0sgPTB4N2ZmZkwsIC8qIEJpdCAxNC4uIDA6CVZQRCBBZGRyZXNzIE1hc2sgKi8KLQlWUERfUkVTX0lECT0gMHg4MiwKLQlWUERfUkVTX1JFQUQJPSAweDkwLAotCVZQRF9SRVNfV1JJVEUJPSAweDgxLAotCVZQRF9SRVNfRU5ECT0gMHg3OCwKLX07Ci0KKyNkZWZpbmUgIFBDSV9SRVZfREVTQwkgMHg0CiAKICNkZWZpbmUgUENJX1NUQVRVU19FUlJPUl9CSVRTIChQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSB8IFwKIAkJCSAgICAgICBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBcCkBAIC0zOSw3ICsxNSw2IEBACiAJCQkgICAgICAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIHwgXAogCQkJICAgICAgIFBDSV9TVEFUVVNfUEFSSVRZKQogCi0KIGVudW0gY3NyX3JlZ3MgewogCUIwX1JBUAk9IDB4MDAwMCwKIAlCMF9DVFNUCT0gMHgwMDA0LApAQCAtMjI5LDggKzIwNCwxMSBAQAogCUlTX1hBMl9GCT0gMTw8MSwJCS8qIFFfWEEyIEVuZCBvZiBGcmFtZSAqLwogCUlTX1hBMl9DCT0gMTw8MCwJCS8qIFFfWEEyIEVuY29kaW5nIEVycm9yICovCiAKLQlJU19QT1JUXzEJPSBJU19YQTFfRnwgSVNfUjFfRnwgSVNfTUFDMSwKLQlJU19QT1JUXzIJPSBJU19YQTJfRnwgSVNfUjJfRnwgSVNfTUFDMiwKKwlJU19UT19QT1JUMQk9IElTX1BBX1RPX1JYMSB8IElTX1BBX1RPX1RYMSwKKwlJU19UT19QT1JUMgk9IElTX1BBX1RPX1JYMiB8IElTX1BBX1RPX1RYMiwKKworCUlTX1BPUlRfMQk9IElTX1hBMV9GfCBJU19SMV9GIHwgSVNfVE9fUE9SVDEgfCBJU19NQUMxLAorCUlTX1BPUlRfMgk9IElTX1hBMl9GfCBJU19SMl9GIHwgSVNfVE9fUE9SVDIgfCBJU19NQUMyLAogfTsKIAogCkBAIC0yODgsMTQgKzI2Niw2IEBACiAJQ0hJUF9SRVZfWVVfTElURV9BMyAgPSA3LAkvKiBDaGlwIFJldi4gZm9yIFlVS09OLUxpdGUgQTMgKi8KIH07CiAKLS8qCUIyX0xEX1RFU1QJCSA4IGJpdAlFUFJPTSBsb2FkZXIgdGVzdCByZWdpc3RlciAqLwotZW51bSB7Ci0JTERfVF9PTgkJPSAxPDwzLAkvKiBMb2FkZXIgVGVzdCBtb2RlIG9uICovCi0JTERfVF9PRkYJPSAxPDwyLAkvKiBMb2FkZXIgVGVzdCBtb2RlIG9mZiAqLwotCUxEX1RfU1RFUAk9IDE8PDEsCS8qIERlY3JlbWVudCBGUFJPTSBhZGRyLiBDb3VudGVyICovCi0JTERfU1RBUlQJPSAxPDwwLAkvKiBTdGFydCBsb2FkaW5nIEZQUk9NICovCi19OwotCiAvKglCMl9USV9DVFJMCQkgOCBiaXQJVGltZXIgY29udHJvbCAqLwogLyoJQjJfSVJRTV9DVFJMCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBDb250cm9sICovCiBlbnVtIHsKQEAgLTMxMywxNiArMjgzLDYgQEAKIAlUSU1fVF9TVEVQCT0gMTw8MCwJLyogVGVzdCBzdGVwICovCiB9OwogCi0vKglCMjhfRFBUX0lOSQkzMiBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEluaXQgVmFsICovCi0vKglCMjhfRFBUX1ZBTAkzMiBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN1cnIgVmFsICovCi0vKglCMjhfRFBUX0NUUkwJIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBDdHJsIFJlZyAqLwotZW51bSB7Ci0JRFBUX01TSwk9IDB4MDBmZmZmZmZMLAkvKiBCaXQgMjMuLiAwOglEZXNjIFBvbGwgVGltZXIgQml0cyAqLwotCi0JRFBUX1NUQVJUCT0gMTw8MSwJLyogU3RhcnQgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCi0JRFBUX1NUT1AJPSAxPDwwLAkvKiBTdG9wICBEZXNjcmlwdG9yIFBvbGwgVGltZXIgKi8KLX07Ci0KIC8qCUIyX0dQX0lPCQkzMiBiaXQJR2VuZXJhbCBQdXJwb3NlIEkvTyBSZWdpc3RlciAqLwogZW51bSB7CiAJR1BfRElSXzkgPSAxPDwyNSwgLyogSU9fOSBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KQEAgLTM0OCwzMCArMzA4LDYgQEAKIAlHUF9JT18wCT0gMTw8MCwJLyogSU9fMCBwaW4gKi8KIH07CiAKLS8qIFJ4L1R4IFBhdGggcmVsYXRlZCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXJzICovCi0vKglCM19NQV9UT19URVNUCTE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IFRlc3QgUmVnICovCi0vKglCM19NQV9SQ19URVNUCTE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBUZXN0IFJlZyAqLwotLyoJQjNfUEFfVEVTVAkJMTYgYml0CVBhY2tldCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KLS8qCQkJQml0IDE1LCAxMSwgNywgYW5kIDMgYXJlIHJlc2VydmVkIGluIEIzX1BBX1RFU1QgKi8KLWVudW0gewotCVRYMl9UX0VWCT0gMTw8MTUsLyogVFgyIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCi0JVFgyX1RfT04JPSAxPDwxNCwvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KLQlUWDJfVF9PRkYJPSAxPDwxMywvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KLQlUWDJfVF9TVEVQCT0gMTw8MTIsLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBTdGVwICovCi0JVFgxX1RfRVYJPSAxPDwxMSwvKiBUWDEgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KLQlUWDFfVF9PTgk9IDE8PDEwLC8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLwotCVRYMV9UX09GRgk9IDE8PDksCS8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgVHN0IE9mZiAqLwotCVRYMV9UX1NURVAJPSAxPDw4LAkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KLQlSWDJfVF9FVgk9IDE8PDcsCS8qIFJYMiBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLwotCVJYMl9UX09OCT0gMTw8NiwJLyogUlgyIFRpbWVvdXQvUmVjdiBUaW1lciBUZXN0IE9uICovCi0JUlgyX1RfT0ZGCT0gMTw8NSwJLyogUlgyIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCi0JUlgyX1RfU1RFUAk9IDE8PDQsCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLwotCVJYMV9UX0VWCT0gMTw8MywJLyogUlgxIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCi0JUlgxX1RfT04JPSAxPDwyLAkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KLQlSWDFfVF9PRkYJPSAxPDwxLAkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KLQlSWDFfVF9TVEVQCT0gMTw8MCwJLyogUlgxIFRpbWVvdXQvUmVjdiBUaW1lciBTdGVwICovCi19OwotCiAvKiBEZXNjcmlwdG9yIEJpdCBEZWZpbml0aW9uICovCiAvKglUeEN0cmwJCVRyYW5zbWl0IEJ1ZmZlciBDb250cm9sIEZpZWxkICovCiAvKglSeEN0cmwJCVJlY2VpdmUgIEJ1ZmZlciBDb250cm9sIEZpZWxkICovCkBAIC00MjgsMTQgKzM2NCw2IEBACiAJUklfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIFJBTSBJbnRlcmZhY2UgUmVzZXQgKi8KIH07CiAKLS8qCUIzX1JJX1RFU1QJCSA4IGJpdAlSQU0gSWZhY2UgVGVzdCBSZWdpc3RlciAqLwotZW51bSB7Ci0JUklfVF9FVgk9IDE8PDMsCS8qIFRpbWVvdXQgRXZlbnQgb2NjdXJlZCAqLwotCVJJX1RfT04JPSAxPDwyLAkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT24gKi8KLQlSSV9UX09GRgk9IDE8PDEsCS8qIFRpbWVvdXQgVGltZXIgVGVzdCBPZmYgKi8KLQlSSV9UX1NURVAJPSAxPDwwLAkvKiBUaW1lb3V0IFRpbWVyIFN0ZXAgKi8KLX07Ci0KIC8qIE1BQyBBcmJpdGVyIFJlZ2lzdGVycyAqLwogLyoJQjNfTUFfVE9fQ1RSTAkxNiBiaXQJTUFDIEFyYml0ZXIgVGltZW91dCBDdHJsIFJlZyAqLwogZW51bSB7CkBAIC00NTIsMTkgKzM4MCw2IEBACiAjZGVmaW5lIFNLX1BLVF9UT19NQVgJMHhmZmZmCQkvKiBNYXhpbXVtIHZhbHVlICovCiAjZGVmaW5lIFNLX1JJX1RPXzUzCTM2CQkvKiBSQU0gaW50ZXJmYWNlIHRpbWVvdXQgKi8KIAotCi0vKglCM19NQV9SQ19DVFJMCTE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBDdHJsIFJlZyAqLwotZW51bSB7Ci0JTUFfRU5BX1JFQ19UWDIJPSAxPDw3LAkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFRYMiAqLwotCU1BX0RJU19SRUNfVFgyCT0gMTw8NiwJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBUWDIgKi8KLQlNQV9FTkFfUkVDX1RYMQk9IDE8PDUsCS8qIEVuYWJsZSAgUmVjb3ZlcnkgVGltZXIgVFgxICovCi0JTUFfRElTX1JFQ19UWDEJPSAxPDw0LAkvKiBEaXNhYmxlIFJlY292ZXJ5IFRpbWVyIFRYMSAqLwotCU1BX0VOQV9SRUNfUlgyCT0gMTw8MywJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBSWDIgKi8KLQlNQV9ESVNfUkVDX1JYMgk9IDE8PDIsCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgUlgyICovCi0JTUFfRU5BX1JFQ19SWDEJPSAxPDwxLAkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFJYMSAqLwotCU1BX0RJU19SRUNfUlgxCT0gMTw8MCwJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBSWDEgKi8KLX07Ci0KIC8qIFBhY2tldCBBcmJpdGVyIFJlZ2lzdGVycyAqLwogLyoJQjNfUEFfQ1RSTAkJMTYgYml0CVBhY2tldCBBcmJpdGVyIEN0cmwgUmVnaXN0ZXIgKi8KIGVudW0gewpAQCAtNDg4LDcgKzQwMyw3IEBACiAJCQkJCQlQQV9FTkFfVE9fVFgxIHwgUEFfRU5BX1RPX1RYMikKIAogCi0vKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKy8qIFRyYW5zbWl0IEFyYml0ZXIgUmVnaXN0ZXJzIE1BQyAxIGFuZCAyLCB1c2UgU0tfUkVHKCkgdG8gYWNjZXNzICovCiAvKglUWEFfSVRJX0lOSQkJMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBJbml0IFZhbCAqLwogLyoJVFhBX0lUSV9WQUwJCTMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgVmFsdWUgKi8KIC8qCVRYQV9MSU1fSU5JCQkzMiBiaXQJVHggQXJiIExpbWl0IENvdW50ZXIgSW5pdCBWYWwgKi8KQEAgLTUxMSw3ICs0MjYsNyBAQAogLyoKICAqCUJhbmsgNCAtIDUKICAqLwotLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzICovCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIFNLX1JFRygpIHRvIGFjY2VzcyAqLwogZW51bSB7CiAJVFhBX0lUSV9JTkkJPSAweDAyMDAsLyogMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBJbml0IFZhbCovCiAJVFhBX0lUSV9WQUwJPSAweDAyMDQsLyogMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBWYWx1ZSAqLwpAQCAtNTM3LDcgKzQ1Miw3IEBACiAKIC8qIFF1ZXVlIFJlZ2lzdGVyIE9mZnNldHMsIHVzZSBRX0FERFIoKSB0byBhY2Nlc3MgKi8KIGVudW0gewotCUI4X1FfUkVHUyA9IDB4MDQwMCwgLyogYmFzZSBvZiBRdWV1ZSByZWdpc3RlcnMgKi8JCisJQjhfUV9SRUdTID0gMHgwNDAwLCAvKiBiYXNlIG9mIFF1ZXVlIHJlZ2lzdGVycyAqLwogCVFfRAk9IDB4MDAsCS8qIDgqMzIJYml0CUN1cnJlbnQgRGVzY3JpcHRvciAqLwogCVFfREFfTAk9IDB4MjAsCS8qIDMyIGJpdAlDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyBMb3cgZFdvcmQgKi8KIAlRX0RBX0gJPSAweDI0LAkvKiAzMiBiaXQJQ3VycmVudCBEZXNjcmlwdG9yIEFkZHJlc3MgSGlnaCBkV29yZCAqLwpAQCAtNjE4LDggKzUzMyw3IEBACiBlbnVtIHsKIAlQSFlfQUREUl9YTUFDCT0gMDw8OCwKIAlQSFlfQUREUl9CQ09NCT0gMTw8OCwKLQlQSFlfQUREUl9MT05FCT0gMzw8OCwKLQlQSFlfQUREUl9OQVQJPSAwPDw4LAorCiAvKiBHUEhZIGFkZHJlc3MgKGJpdHMgMTUuLjExIG9mIFNNSSBjb250cm9sIHJlZykgKi8KIAlQSFlfQUREUl9NQVJWCT0gMCwKIH07CkBAIC05ODYsNyArOTAwLDcgQEAKIAlMSU5LTEVEX0JMSU5LX09GRiAgICA9IDB4MTAsCiAJTElOS0xFRF9CTElOS19PTiAgICAgPSAweDIwLAogfTsKLQkKKwogLyogR01BQyBhbmQgR1BIWSBDb250cm9sIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KIGVudW0gewogCUdNQUNfQ1RSTAk9IDB4MGYwMCwvKiAzMiBiaXQJR01BQyBDb250cm9sIFJlZyAqLwpAQCAtMTE1MSw1NCArMTA2NSw2IEBACiAJUEhZX01BUlZfRkVfU1BFQ18yCT0gMHgxYywvKiAxNiBiaXQgci93CVNwZWNpZmljIENvbnRyb2wgUmVnLiAyICovCiB9OwogCi0vKiBMZXZlbCBPbmUtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQyAqLwotZW51bSB7Ci0JUEhZX0xPTkVfQ1RSTAkJPSAweDAwLC8qIDE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQlQSFlfTE9ORV9TVEFUCQk9IDB4MDEsLyogMTYgYml0IHIvbwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCi0JUEhZX0xPTkVfSUQwCQk9IDB4MDIsLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCi0JUEhZX0xPTkVfSUQxCQk9IDB4MDMsLyogMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCi0JUEhZX0xPTkVfQVVORV9BRFYJPSAweDA0LC8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KLQlQSFlfTE9ORV9BVU5FX0xQCT0gMHgwNSwvKiAxNiBiaXQgci9vCUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqLwotCVBIWV9MT05FX0FVTkVfRVhQCT0gMHgwNiwvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCi0JUEhZX0xPTkVfTkVQRwkJPSAweDA3LC8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCi0JUEhZX0xPTkVfTkVQR19MUAk9IDB4MDgsLyogMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICovCi0JLyogTGV2ZWwgT25lLXNwZWNpZmljIHJlZ2lzdGVycyAqLwotCVBIWV9MT05FXzEwMDBUX0NUUkwJPSAweDA5LC8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLwotCVBIWV9MT05FXzEwMDBUX1NUQVQJPSAweDBhLC8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCi0JUEhZX0xPTkVfRVhUX1NUQVQJPSAweDBmLC8qIDE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLwotCVBIWV9MT05FX1BPUlRfQ0ZHCT0gMHgxMCwvKiAxNiBiaXQgci93CVBvcnQgQ29uZmlndXJhdGlvbiBSZWcqLwotCVBIWV9MT05FX1FfU1RBVAkJPSAweDExLC8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZyAqLwotCVBIWV9MT05FX0lOVF9FTkFCCT0gMHgxMiwvKiAxNiBiaXQgci93CUludGVycnVwdCBFbmFibGUgUmVnICovCi0JUEhZX0xPTkVfSU5UX1NUQVQJPSAweDEzLC8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KLQlQSFlfTE9ORV9MRURfQ0ZHCT0gMHgxNCwvKiAxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqLwotCVBIWV9MT05FX1BPUlRfQ1RSTAk9IDB4MTUsLyogMTYgYml0IHIvdwlQb3J0IENvbnRyb2wgUmVnICovCi0JUEhZX0xPTkVfQ0lNCQk9IDB4MTYsLyogMTYgYml0IHIvbwlDSU0gUmVnICovCi19OwotCi0vKiBOYXRpb25hbC1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciBYTUFDICovCi1lbnVtIHsKLQlQSFlfTkFUX0NUUkwJCT0gMHgwMCwvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCi0JUEhZX05BVF9TVEFUCQk9IDB4MDEsLyogMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCi0JUEhZX05BVF9JRDAJCT0gMHgwMiwvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KLQlQSFlfTkFUX0lEMQkJPSAweDAzLC8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLwotCVBIWV9OQVRfQVVORV9BRFYJPSAweDA0LC8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KLQlQSFlfTkFUX0FVTkVfTFAJCT0gMHgwNSwvKiAxNiBiaXQgci9vCUxpbmsgUGFydG5lciBBYmlsaXR5IFJlZyAqLwotCVBIWV9OQVRfQVVORV9FWFAJPSAweDA2LC8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KLQlQSFlfTkFUX05FUEcJCT0gMHgwNywvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLwotCVBIWV9OQVRfTkVQR19MUAkJPSAweDA4LC8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciBSZWcgKi8KLQkvKiBOYXRpb25hbC1zcGVjaWZpYyByZWdpc3RlcnMgKi8KLQlQSFlfTkFUXzEwMDBUX0NUUkwJPSAweDA5LC8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLwotCVBIWV9OQVRfMTAwMFRfU1RBVAk9IDB4MGEsLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KLQlQSFlfTkFUX0VYVF9TVEFUCT0gMHgwZiwvKiAxNiBiaXQgci9vCUV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLwotCVBIWV9OQVRfRVhUX0NUUkwxCT0gMHgxMCwvKiAxNiBiaXQgci9vCUV4dGVuZGVkIENvbnRyb2wgUmVnMSAqLwotCVBIWV9OQVRfUV9TVEFUMQkJPSAweDExLC8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzEgKi8KLQlQSFlfTkFUXzEwQl9PUAkJPSAweDEyLC8qIDE2IGJpdCByL28JMTBCYXNlLVQgT3BlcmF0aW9ucyBSZWcgKi8KLQlQSFlfTkFUX0VYVF9DVFJMMgk9IDB4MTMsLyogMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKi8KLQlQSFlfTkFUX1FfU1RBVDIJCT0gMHgxNCwvKiAxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcyICovCi0KLQlQSFlfTkFUX1BIWV9BRERSCT0gMHgxOSwvKiAxNiBiaXQgci9vCVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCi19OwotCiBlbnVtIHsKIAlQSFlfQ1RfUkVTRVQJPSAxPDwxNSwgLyogQml0IDE1OiAoc2MpCWNsZWFyIGFsbCBQSFkgcmVsYXRlZCByZWdzICovCiAJUEhZX0NUX0xPT1AJPSAxPDwxNCwgLyogQml0IDE0OgllbmFibGUgTG9vcGJhY2sgb3ZlciBQSFkgKi8KQEAgLTEyNTMsOCArMTExOSwyOSBAQAogCVBIWV9NQVJWX0lEMV9ZMgk9IDB4MEM5MSwgLyogWXVrb24tMiAoUEhZIDg4RTExMTIpICovCiB9OwogCisvKiBBZHZlcnRpc2VtZW50IHJlZ2lzdGVyIGJpdHMgKi8KIGVudW0gewogCVBIWV9BTl9OWFRfUEcJPSAxPDwxNSwgLyogQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLworCVBIWV9BTl9BQ0sJPSAxPDwxNCwgLyogQml0IDE0Ogkocm8pIEFja25vd2xlZGdlIFJlY2VpdmVkICovCisJUEhZX0FOX1JGCT0gMTw8MTMsIC8qIEJpdCAxMzoJUmVtb3RlIEZhdWx0IEJpdHMgKi8KKworCVBIWV9BTl9QQVVTRV9BU1lNID0gMTw8MTEsLyogQml0IDExOglUcnkgZm9yIGFzeW1tZXRyaWMgKi8KKwlQSFlfQU5fUEFVU0VfQ0FQID0gMTw8MTAsIC8qIEJpdCAxMDoJVHJ5IGZvciBwYXVzZSAqLworCVBIWV9BTl8xMDBCQVNFNAk9IDE8PDksIC8qIEJpdCA5OglUcnkgZm9yIDEwMG1icHMgNGsgcGFja2V0cyAqLworCVBIWV9BTl8xMDBGVUxMCT0gMTw8OCwgLyogQml0IDg6CVRyeSBmb3IgMTAwbWJwcyBmdWxsLWR1cGxleCAqLworCVBIWV9BTl8xMDBIQUxGCT0gMTw8NywgLyogQml0IDc6CVRyeSBmb3IgMTAwbWJwcyBoYWxmLWR1cGxleCAqLworCVBIWV9BTl8xMEZVTEwJPSAxPDw2LCAvKiBCaXQgNjoJVHJ5IGZvciAxMG1icHMgZnVsbC1kdXBsZXggKi8KKwlQSFlfQU5fMTBIQUxGCT0gMTw8NSwgLyogQml0IDU6CVRyeSBmb3IgMTBtYnBzIGhhbGYtZHVwbGV4ICovCisJUEhZX0FOX0NTTUEJPSAxPDwwLCAvKiBCaXQgMDoJT25seSBzZWxlY3RvciBzdXBwb3J0ZWQgKi8KKwlQSFlfQU5fU0VMCT0gMHgxZiwgLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisJUEhZX0FOX0ZVTEwJPSBQSFlfQU5fMTAwRlVMTCB8IFBIWV9BTl8xMEZVTEwgfCBQSFlfQU5fQ1NNQSwKKwlQSFlfQU5fQUxMCT0gUEhZX0FOXzEwSEFMRiB8IFBIWV9BTl8xMEZVTEwgfAorCQkgIAkgIFBIWV9BTl8xMDBIQUxGIHwgUEhZX0FOXzEwMEZVTEwsCit9OworCisvKiBYbWFjIFNwZWNpZmljICovCitlbnVtIHsKKwlQSFlfWF9BTl9OWFRfUEcJPSAxPDwxNSwgLyogQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLwogCVBIWV9YX0FOX0FDSwk9IDE8PDE0LCAvKiBCaXQgMTQ6CShybykgQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KIAlQSFlfWF9BTl9SRkIJPSAzPDwxMiwvKiBCaXQgMTMuLjEyOglSZW1vdGUgRmF1bHQgQml0cyAqLwogCkBAIC0xMjYzLDgyICsxMTUwLDYgQEAKIAlQSFlfWF9BTl9GRAk9IDE8PDUsIC8qIEJpdCAgNToJRnVsbCBEdXBsZXggKi8KIH07CiAKLWVudW0gewotCVBIWV9CX0FOX1JGCT0gMTw8MTMsIC8qIEJpdCAxMzoJUmVtb3RlIEZhdWx0ICovCi0KLQlQSFlfQl9BTl9BU1AJPSAxPDwxMSwgLyogQml0IDExOglBc3ltbWV0cmljIFBhdXNlICovCi0JUEhZX0JfQU5fUEMJPSAxPDwxMCwgLyogQml0IDEwOglQYXVzZSBDYXBhYmxlICovCi0JUEhZX0JfQU5fU0VMCT0gMHgxZiwgLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCi19OwotCi1lbnVtIHsKLQlQSFlfTF9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLwotCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCi0JUEhZX0xfQU5fQVNQCT0gMTw8MTEsIC8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLwotCVBIWV9MX0FOX1BDCT0gMTw8MTAsIC8qIEJpdCAxMDoJUGF1c2UgQ2FwYWJsZSAqLwotCi0JUEhZX0xfQU5fU0VMCT0gMHgxZiwgLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCi19OwotCi0vKiAgUEhZX05BVF9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqLwotLyogIFBIWV9OQVRfQVVORV9MUAkxNiBiaXQgci9vCUxpbmsgUGFydG5lciBBYmlsaXR5IFJlZyAqKioqKi8KLS8qICBQSFlfQU5fTlhUX1BHCShzZWUgWE1BQykgQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLwotZW51bSB7Ci0JUEhZX05fQU5fUkYJPSAxPDwxMywgLyogQml0IDEzOglSZW1vdGUgRmF1bHQgKi8KLQotCVBIWV9OX0FOXzEwMEYJPSAxPDwxMSwgLyogQml0IDExOgkxMDBCYXNlLVQyIEZEIFN1cHBvcnQgKi8KLQlQSFlfTl9BTl8xMDBICT0gMTw8MTAsIC8qIEJpdCAxMDoJMTAwQmFzZS1UMiBIRCBTdXBwb3J0ICovCi0KLQlQSFlfTl9BTl9TRUwJPSAweDFmLCAvKiBCaXQgNC4uMDoJU2VsZWN0b3IgRmllbGQsIDAwMDAxPUV0aGVybmV0Ki8KLX07Ci0KLS8qIGZpZWxkIHR5cGUgZGVmaW5pdGlvbiBmb3IgUEhZX3hfQU5fU0VMICovCi1lbnVtIHsKLQlQSFlfU0VMX1RZUEUJID0gMSwJLyogMDAwMDEgPSBFdGhlcm5ldCAqLwotfTsKLQotZW51bSB7Ci0JUEhZX0FORV9MUF9OUAk9IDE8PDMsIC8qIEJpdCAgMzoJTGluayBQYXJ0bmVyIGNhbiBOZXh0IFBhZ2UgKi8KLQlQSFlfQU5FX0xPQ19OUAk9IDE8PDIsIC8qIEJpdCAgMjoJTG9jYWwgUEhZIGNhbiBOZXh0IFBhZ2UgKi8KLQlQSFlfQU5FX1JYX1BHCT0gMTw8MSwgLyogQml0ICAxOglQYWdlIFJlY2VpdmVkICovCi19OwotCi1lbnVtIHsKLQlQSFlfQU5FX1BBUl9ERgk9IDE8PDQsIC8qIEJpdCAgNDoJUGFyYWxsZWwgRGV0ZWN0aW9uIEZhdWx0ICovCi0KLQlQSFlfQU5FX0xQX0NBUAk9IDE8PDAsIC8qIEJpdCAgMDoJTGluayBQYXJ0bmVyIEF1dG8tTmVnLiBDYXAuICovIAkKLX07Ci0KLWVudW0gewotCVBIWV9OUF9NT1JFCT0gMTw8MTUsIC8qIEJpdCAxNToJTW9yZSwgTmV4dCBQYWdlcyB0byBmb2xsb3cgKi8KLQlQSFlfTlBfQUNLMQk9IDE8PDE0LCAvKiBCaXQgMTQ6IChybykJQWNrMSwgZm9yIHJlY2VpdmluZyBhIG1lc3NhZ2UgKi8KLQlQSFlfTlBfTVNHX1ZBTAk9IDE8PDEzLCAvKiBCaXQgMTM6CU1lc3NhZ2UgUGFnZSB2YWxpZCAqLwotCVBIWV9OUF9BQ0syCT0gMTw8MTIsIC8qIEJpdCAxMjoJQWNrMiwgY29tcGx5IHdpdGggbXNnIGNvbnRlbnQgKi8KLQlQSFlfTlBfVE9HCT0gMTw8MTEsIC8qIEJpdCAxMToJVG9nZ2xlIEJpdCwgZW5zdXJlIHN5bmMgKi8KLQlQSFlfTlBfTVNHCT0gMHgwN2ZmLCAvKiBCaXQgMTAuLjA6CU1lc3NhZ2UgZnJvbS90byBMaW5rIFBhcnRuZXIgKi8KLX07Ci0KLWVudW0gewotCVBIWV9YX0VYX0ZECT0gMTw8MTUsIC8qIEJpdCAxNToJRGV2aWNlIFN1cHBvcnRzIEZ1bGwgRHVwbGV4ICovCi0JUEhZX1hfRVhfSEQJPSAxPDwxNCwgLyogQml0IDE0OglEZXZpY2UgU3VwcG9ydHMgSGFsZiBEdXBsZXggKi8KLX07Ci0KLWVudW0gewotCVBIWV9YX1JTX1BBVVNFCT0gMzw8NywvKiBCaXQgIDguLjc6CXNlbGVjdGVkIFBhdXNlIE1vZGUgKi8KLQlQSFlfWF9SU19IRAk9IDE8PDYsIC8qIEJpdCAgNjoJSGFsZiBEdXBsZXggTW9kZSBzZWxlY3RlZCAqLwotCVBIWV9YX1JTX0ZECT0gMTw8NSwgLyogQml0ICA1OglGdWxsIER1cGxleCBNb2RlIHNlbGVjdGVkICovCi0JUEhZX1hfUlNfQUJMTUlTCT0gMTw8NCwgLyogQml0ICA0OglkdXBsZXggb3IgcGF1c2UgY2FwIG1pc21hdGNoICovCi0JUEhZX1hfUlNfUEFVTUlTCT0gMTw8MywgLyogQml0ICAzOglwYXVzZSBjYXBhYmlsaXR5IG1pc21hdGNoICovCi19OwotCi0vKiogUmVtb3RlIEZhdWx0IEJpdHMgKFBIWV9YX0FOX1JGQikgZW5jb2RpbmcgICovCi1lbnVtIHsKLQlYX1JGQl9PSwk9IDA8PDEyLC8qIEJpdCAxMy4uMTIJTm8gZXJyb3JzLCBMaW5rIE9LICovCi0JWF9SRkJfTEYJPSAxPDwxMiwgLyogQml0IDEzLi4xMglMaW5rIEZhaWx1cmUgKi8KLQlYX1JGQl9PRkYJPSAyPDwxMiwvKiBCaXQgMTMuLjEyCU9mZmxpbmUgKi8KLQlYX1JGQl9BTl9FUlIJPSAzPDwxMiwvKiBCaXQgMTMuLjEyCUF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KLX07Ci0KIC8qIFBhdXNlIEJpdHMgKFBIWV9YX0FOX1BBVVNFIGFuZCBQSFlfWF9SU19QQVVTRSkgZW5jb2RpbmcgKi8KIGVudW0gewogCVBIWV9YX1BfTk9fUEFVU0UJPSAwPDw3LC8qIEJpdCAgOC4uNzoJbm8gUGF1c2UgTW9kZSAqLwpAQCAtMTQxOCw2ICsxMjI5LDE2IEBACiAJUEhZX0JfUEVTX01MVDNfRVIJPSAxPDwwLCAvKiBCaXQgIDA6CU1MVDMgY29kZSBFcnJvciAqLwogfTsKIAorLyogIFBIWV9CQ09NX0FVTkVfQURWCTE2IGJpdCByL3cJQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50ICoqKioqLworLyogIFBIWV9CQ09NX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfQl9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCisJUEhZX0JfQU5fQVNQCT0gMTw8MTEsIC8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworCVBIWV9CX0FOX1BDCT0gMTw8MTAsIC8qIEJpdCAxMDoJUGF1c2UgQ2FwYWJsZSAqLworfTsKKworCiAvKioqKiogIFBIWV9CQ09NX0ZDX0NUUgkJMTYgYml0IHIvdwlGYWxzZSBDYXJyaWVyIENvdW50ZXIgKioqKiovCiBlbnVtIHsKIAlQSFlfQl9GQ19DVFIJPSAweGZmLCAvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnRlciAqLwpAQCAtMTQ3OCw3ICsxMjk5LDkgQEAKIAlQSFlfQl9JU19MU1RfQ0hBTkdFCT0gMTw8MSwgLyogQml0ICAxOglMaW5rIFN0YXR1cyBDaGFuZ2VkICovCiAJUEhZX0JfSVNfQ1JDX0VSCT0gMTw8MCwgLyogQml0ICAwOglDUkMgRXJyb3IgKi8KIH07Ci0jZGVmaW5lIFBIWV9CX0RFRl9NU0sJKH4oUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19MU1RfQ0hBTkdFKSkKKyNkZWZpbmUgUEhZX0JfREVGX01TSwlcCisJKH4oUEhZX0JfSVNfUFNFIHwgUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19EVVBfQ0hBTkdFIHwgXAorCSAgICBQSFlfQl9JU19MU1BfQ0hBTkdFIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCiAKIC8qIFBhdXNlIEJpdHMgKFBIWV9CX0FOX0FTUCBhbmQgUEhZX0JfQU5fUEMpIGVuY29kaW5nICovCiBlbnVtIHsKQEAgLTE0OTUsMTY2ICsxMzE4LDYgQEAKIAlQSFlfQl9SRVNfMTAwMEhECT0gNjw8OCwvKiBCaXQgMTAuLjg6CTEwMDBCYXNlLVQgSGFsZiBEdXAuICovCiB9OwogCi0vKgotICogTGV2ZWwgT25lLVNwZWNpZmljCi0gKi8KLS8qKioqKiAgUEhZX0xPTkVfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF8xMDAwQ19URVNUCT0gNzw8MTMsLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLwotCVBIWV9MXzEwMDBDX01TRQk9IDE8PDEyLCAvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KLQlQSFlfTF8xMDAwQ19NU0MJPSAxPDwxMSwgLyogQml0IDExOglNL1MgQ29uZmlndXJhdGlvbiAqLwotCVBIWV9MXzEwMDBDX1JECT0gMTw8MTAsIC8qIEJpdCAxMDoJUmVwZWF0ZXIvRFRFICovCi0JUEhZX0xfMTAwMENfQUZECT0gMTw8OSwgLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KLQlQSFlfTF8xMDAwQ19BSEQJPSAxPDw4LCAvKiBCaXQgIDg6CUFkdmVydGlzZSBIYWxmIER1cGxleCAqLwotfTsKLQotLyoqKioqICBQSFlfTE9ORV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfMTAwMFNfTVNGCT0gMTw8MTUsIC8qIEJpdCAxNToJTWFzdGVyL1NsYXZlIEZhdWx0ICovCi0JUEhZX0xfMTAwMFNfTVNSCT0gMTw8MTQsIC8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLwotCVBIWV9MXzEwMDBTX0xSUwk9IDE8PDEzLCAvKiBCaXQgMTM6CUxvY2FsIFJlY2VpdmVyIFN0YXR1cyAqLwotCVBIWV9MXzEwMDBTX1JSUwk9IDE8PDEyLCAvKiBCaXQgMTI6CVJlbW90ZSBSZWNlaXZlciBTdGF0dXMgKi8KLQlQSFlfTF8xMDAwU19MUF9GRCA9IDE8PDExLCAvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KLQlQSFlfTF8xMDAwU19MUF9IRCA9IDE8PDEwLCAvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KLQotCVBIWV9MXzEwMDBTX0lFQwkgPSAweGZmLCAvKiBCaXQgIDcuLjA6CUlkbGUgRXJyb3IgQ291bnQgKi8KLQotLyoqKioqICBQSFlfTE9ORV9FWFRfU1RBVAkxNiBiaXQgci9vCUV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KLQlQSFlfTF9FU19YX0ZEX0NBUCA9IDE8PDE1LCAvKiBCaXQgMTU6CTEwMDBCYXNlLVggRkQgY2FwYWJsZSAqLwotCVBIWV9MX0VTX1hfSERfQ0FQID0gMTw8MTQsIC8qIEJpdCAxNDoJMTAwMEJhc2UtWCBIRCBjYXBhYmxlICovCi0JUEhZX0xfRVNfVF9GRF9DQVAgPSAxPDwxMywgLyogQml0IDEzOgkxMDAwQmFzZS1UIEZEIGNhcGFibGUgKi8KLQlQSFlfTF9FU19UX0hEX0NBUCA9IDE8PDEyLCAvKiBCaXQgMTI6CTEwMDBCYXNlLVQgSEQgY2FwYWJsZSAqLwotfTsKLQotLyoqKioqICBQSFlfTE9ORV9QT1JUX0NGRwkxNiBiaXQgci93CVBvcnQgQ29uZmlndXJhdGlvbiBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9QQ19SRVBfTU9ERQk9IDE8PDE1LCAvKiBCaXQgMTU6CVJlcGVhdGVyIE1vZGUgKi8KLQotCVBIWV9MX1BDX1RYX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CVR4IG91dHB1dCBEaXNhYmxlZCAqLwotCVBIWV9MX1BDX0JZX1NDUgk9IDE8PDEyLCAvKiBCaXQgMTI6CUJ5cGFzcyBTY3JhbWJsZXIgKi8KLQlQSFlfTF9QQ19CWV80NQk9IDE8PDExLCAvKiBCaXQgMTE6CUJ5cGFzcyA0QjVCLURlY29kZXIgKi8KLQlQSFlfTF9QQ19KQUJfRElTCT0gMTw8MTAsIC8qIEJpdCAxMDoJSmFiYmVyIERpc2FibGVkICovCi0JUEhZX0xfUENfU1FFCT0gMTw8OSwgLyogQml0ICA5OglFbmFibGUgSGVhcnRiZWF0ICovCi0JUEhZX0xfUENfVFBfTE9PUAk9IDE8PDgsIC8qIEJpdCAgODoJVFAgTG9vcGJhY2sgKi8KLQlQSFlfTF9QQ19TU1MJPSAxPDw3LCAvKiBCaXQgIDc6CVNtYXJ0IFNwZWVkIFNlbGVjdGlvbiAqLwotCVBIWV9MX1BDX0ZJRk9fU0laRQk9IDE8PDYsIC8qIEJpdCAgNjoJRklGTyBTaXplICovCi0JUEhZX0xfUENfUFJFX0VOCT0gMTw8NSwgLyogQml0ICA1OglQcmVhbWJsZSBFbmFibGUgKi8KLQlQSFlfTF9QQ19DSU0JPSAxPDw0LCAvKiBCaXQgIDQ6CUNhcnJpZXIgSW50ZWdyaXR5IE1vbiAqLwotCVBIWV9MX1BDXzEwX1NFUgk9IDE8PDMsIC8qIEJpdCAgMzoJVXNlIFNlcmlhbCBPdXRwdXQgKi8KLQlQSFlfTF9QQ19BTklTT0wJPSAxPDwyLCAvKiBCaXQgIDI6CVVuaXNvbGF0ZSBQb3J0ICovCi0JUEhZX0xfUENfVEVOX0JJVAk9IDE8PDEsIC8qIEJpdCAgMToJMTBiaXQgaWZhY2UgbW9kZSBvbiAqLwotCVBIWV9MX1BDX0FMVENMT0NLCT0gMTw8MCwgLyogQml0ICAwOiAocm8pCUFMVENMT0NLIE1vZGUgb24gKi8KLX07Ci0KLS8qKioqKiAgUEhZX0xPTkVfUV9TVEFUCQkxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9RU19EX1JBVEUJPSAzPDwxNCwvKiBCaXQgMTUuLjE0OglEYXRhIFJhdGUgKi8KLQlQSFlfTF9RU19UWF9TVEFUCT0gMTw8MTMsIC8qIEJpdCAxMzoJVHJhbnNtaXR0aW5nICovCi0JUEhZX0xfUVNfUlhfU1RBVAk9IDE8PDEyLCAvKiBCaXQgMTI6CVJlY2VpdmluZyAqLwotCVBIWV9MX1FTX0NPTF9TVEFUCT0gMTw8MTEsIC8qIEJpdCAxMToJQ29sbGlzaW9uICovCi0JUEhZX0xfUVNfTF9TVEFUCT0gMTw8MTAsIC8qIEJpdCAxMDoJTGluayBpcyB1cCAqLwotCVBIWV9MX1FTX0RVUF9NT0QJPSAxPDw5LCAvKiBCaXQgIDk6CUZ1bGwvSGFsZiBEdXBsZXggKi8KLQlQSFlfTF9RU19BTgk9IDE8PDgsIC8qIEJpdCAgODoJQXV0b05lZyBpcyBPbiAqLwotCVBIWV9MX1FTX0FOX0MJPSAxPDw3LCAvKiBCaXQgIDc6CUFOIGlzIENvbXBsZXRlICovCi0JUEhZX0xfUVNfTExFCT0gNzw8NCwvKiBCaXQgIDYuLjQ6CUxpbmUgTGVuZ3RoIEVzdGltLiAqLwotCVBIWV9MX1FTX1BBVVNFCT0gMTw8MywgLyogQml0ICAzOglMUCBhZHZlcnRpc2VkIFBhdXNlICovCi0JUEhZX0xfUVNfQVNfUEFVU0UJPSAxPDwyLCAvKiBCaXQgIDI6CUxQIGFkdi4gYXN5bS4gUGF1c2UgKi8KLQlQSFlfTF9RU19JU09MQVRFCT0gMTw8MSwgLyogQml0ICAxOglDSU0gSXNvbGF0ZWQgKi8KLQlQSFlfTF9RU19FVkVOVAk9IDE8PDAsIC8qIEJpdCAgMDoJRXZlbnQgaGFzIG9jY3VycmVkICovCi19OwotCi0vKioqKiogIFBIWV9MT05FX0lOVF9FTkFCCTE2IGJpdCByL3cJSW50ZXJydXB0IEVuYWJsZSBSZWcgKioqKiovCi0vKioqKiogIFBIWV9MT05FX0lOVF9TVEFUCTE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9JU19BTl9GCT0gMTw8MTMsIC8qIEJpdCAxMzoJQXV0by1OZWdvdGlhdGlvbiBmYXVsdCAqLwotCVBIWV9MX0lTX0NST1NTCT0gMTw8MTEsIC8qIEJpdCAxMToJQ3Jvc3NvdmVyIHVzZWQgKi8KLQlQSFlfTF9JU19QT0wJPSAxPDwxMCwgLyogQml0IDEwOglQb2xhcml0eSBjb3JyZWN0LiB1c2VkICovCi0JUEhZX0xfSVNfU1MJPSAxPDw5LCAvKiBCaXQgIDk6CVNtYXJ0IFNwZWVkIERvd25ncmFkZSAqLwotCVBIWV9MX0lTX0NGVUxMCT0gMTw8OCwgLyogQml0ICA4OglDb3VudGVyIEZ1bGwgKi8KLQlQSFlfTF9JU19BTl9DCT0gMTw8NywgLyogQml0ICA3OglBdXRvTmVnIENvbXBsZXRlICovCi0JUEhZX0xfSVNfU1BFRUQJPSAxPDw2LCAvKiBCaXQgIDY6CVNwZWVkIENoYW5nZWQgKi8KLQlQSFlfTF9JU19EVVAJPSAxPDw1LCAvKiBCaXQgIDU6CUR1cGxleCBDaGFuZ2VkICovCi0JUEhZX0xfSVNfTFMJPSAxPDw0LCAvKiBCaXQgIDQ6CUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KLQlQSFlfTF9JU19JU09MCT0gMTw8MywgLyogQml0ICAzOglJc29sYXRlIE9jY3VyZWQgKi8KLQlQSFlfTF9JU19NRElOVAk9IDE8PDIsIC8qIEJpdCAgMjogKHJvKQlTVEFUOiBNSUkgSW50IFBlbmRpbmcgKi8KLQlQSFlfTF9JU19JTlRFTgk9IDE8PDEsIC8qIEJpdCAgMToJRU5BQjogRW5hYmxlIElSUXMgKi8KLQlQSFlfTF9JU19GT1JDRQk9IDE8PDAsIC8qIEJpdCAgMDoJRU5BQjogRm9yY2UgSW50ZXJydXB0ICovCi19OwotCi0vKiBpbnQuIG1hc2sgKi8KLSNkZWZpbmUgUEhZX0xfREVGX01TSwkoUEhZX0xfSVNfTFMgfCBQSFlfTF9JU19JU09MIHwgUEhZX0xfSVNfSU5URU4pCi0KLS8qKioqKiAgUEhZX0xPTkVfTEVEX0NGRwkxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqKioqKi8KLWVudW0gewotCVBIWV9MX0xDX0xFREMJPSAzPDwxNCwvKiBCaXQgMTUuLjE0OglDb2wvQmxpbmsvT24vT2ZmICovCi0JUEhZX0xfTENfTEVEUgk9IDM8PDEyLC8qIEJpdCAxMy4uMTI6CVJ4L0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX0xFRFQJPSAzPDwxMCwvKiBCaXQgMTEuLjEwOglUeC9CbGluay9Pbi9PZmYgKi8KLQlQSFlfTF9MQ19MRURHCT0gMzw8OCwvKiBCaXQgIDkuLjg6CUdpZ2EvQmxpbmsvT24vT2ZmICovCi0JUEhZX0xfTENfTEVEUwk9IDM8PDYsLyogQml0ICA3Li42OgkxMC0xMDAvQmxpbmsvT24vT2ZmICovCi0JUEhZX0xfTENfTEVETAk9IDM8PDQsLyogQml0ICA1Li40OglMaW5rL0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX0xFREYJPSAzPDwyLC8qIEJpdCAgMy4uMjoJRHVwbGV4L0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX1BTVFJFQ0g9IDE8PDEsIC8qIEJpdCAgMToJU3RyZWNoIExFRCBQdWxzZXMgKi8KLQlQSFlfTF9MQ19GUkVRCT0gMTw8MCwgLyogQml0ICAwOgkzMC8xMDAgbXMgKi8KLX07Ci0KLS8qKioqKiAgUEhZX0xPTkVfUE9SVF9DVFJMCTE2IGJpdCByL3cJUG9ydCBDb250cm9sIFJlZyAqKioqKi8KLWVudW0gewotCVBIWV9MX1BDX1RYX1RDTEsgPSAxPDwxNSwgLyogQml0IDE1OglFbmFibGUgVFhfVENMSyAqLwotCVBIWV9MX1BDX0FMVF9OUAkgPSAxPDwxMywgLyogQml0IDE0OglBbHRlcm5hdGUgTmV4dCBQYWdlICovCi0JUEhZX0xfUENfR01JSV9BTFQ9IDE8PDEyLCAvKiBCaXQgMTM6CUFsdGVybmF0ZSBHTUlJIGRyaXZlciAqLwotCVBIWV9MX1BDX1RFTl9DUlMgPSAxPDwxMCwgLyogQml0IDEwOglFeHRlbmQgQ1JTKi8KLX07Ci0KLS8qKioqKiAgUEhZX0xPTkVfQ0lNCQkxNiBiaXQgci9vCUNJTSBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9DSU1fSVNPTAkgICAgPSAweGZmPDw4LC8qIEJpdCAxNS4uODoJSXNvbGF0ZSBDb3VudCAqLwotCVBIWV9MX0NJTV9GQUxTRV9DQVIgPSAweGZmLCAgIC8qIEJpdCAgNy4uMDoJRmFsc2UgQ2FycmllciBDb3VudCAqLwotfTsKLQotLyoKLSAqIFBhdXNlIEJpdHMgKFBIWV9MX0FOX0FTUCBhbmQgUEhZX0xfQU5fUEMpIGVuY29kaW5nCi0gKi8KLWVudW0gewotCVBIWV9MX1BfTk9fUEFVU0U9IDA8PDEwLC8qIEJpdCAxMS4uMTA6CW5vIFBhdXNlIE1vZGUgKi8KLQlQSFlfTF9QX1NZTV9NRAk9IDE8PDEwLCAvKiBCaXQgMTEuLjEwOglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLwotCVBIWV9MX1BfQVNZTV9NRAk9IDI8PDEwLC8qIEJpdCAxMS4uMTA6CWFzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLwotCVBIWV9MX1BfQk9USF9NRAk9IDM8PDEwLC8qIEJpdCAxMS4uMTA6CWJvdGggUGF1c2UgTW9kZSAqLwotfTsKLQotLyoKLSAqIE5hdGlvbmFsLVNwZWNpZmljCi0gKi8KLS8qKioqKiAgUEhZX05BVF8xMDAwVF9DVFJMCTE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqKioqKi8KLWVudW0gewotCVBIWV9OXzEwMDBDX1RFU1Q9IDc8PDEzLC8qIEJpdCAxNS4uMTM6CVRlc3QgTW9kZXMgKi8KLQlQSFlfTl8xMDAwQ19NU0UJPSAxPDwxMiwgLyogQml0IDEyOglNYXN0ZXIvU2xhdmUgRW5hYmxlICovCi0JUEhZX05fMTAwMENfTVNDCT0gMTw8MTEsIC8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KLQlQSFlfTl8xMDAwQ19SRAk9IDE8PDEwLCAvKiBCaXQgMTA6CVJlcGVhdGVyL0RURSAqLwotCVBIWV9OXzEwMDBDX0FGRAk9IDE8PDksIC8qIEJpdCAgOToJQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4ICovCi0JUEhZX05fMTAwMENfQUhECT0gMTw8OCwgLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KLQlQSFlfTl8xMDAwQ19BUEMJPSAxPDw3LCAvKiBCaXQgIDc6CUFzeW1tZXRyaWMgUGF1c2UgQ2FwLiAqL307Ci0KLQotLyoqKioqICBQSFlfTkFUXzEwMDBUX1NUQVQJMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTl8xMDAwU19NU0YJPSAxPDwxNSwgLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KLQlQSFlfTl8xMDAwU19NU1IJPSAxPDwxNCwgLyogQml0IDE0OglNYXN0ZXIvU2xhdmUgUmVzdWx0ICovCi0JUEhZX05fMTAwMFNfTFJTCT0gMTw8MTMsIC8qIEJpdCAxMzoJTG9jYWwgUmVjZWl2ZXIgU3RhdHVzICovCi0JUEhZX05fMTAwMFNfUlJTCT0gMTw8MTIsIC8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyovCi0JUEhZX05fMTAwMFNfTFBfRkQ9IDE8PDExLCAvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KLQlQSFlfTl8xMDAwU19MUF9IRD0gMTw8MTAsIC8qIEJpdCAxMDoJTGluayBQYXJ0bmVyIGNhbiBIRCAqLwotCVBIWV9OXzEwMDBDX0xQX0FQQz0gMTw8OSwgLyogQml0ICA5OglMUCBBc3ltLiBQYXVzZSBDYXAuICovCi0JUEhZX05fMTAwMFNfSUVDCT0gMHhmZiwgLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCi19OwotCi0vKioqKiogIFBIWV9OQVRfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCi1lbnVtIHsKLQlQSFlfTl9FU19YX0ZEX0NBUD0gMTw8MTUsIC8qIEJpdCAxNToJMTAwMEJhc2UtWCBGRCBjYXBhYmxlICovCi0JUEhZX05fRVNfWF9IRF9DQVA9IDE8PDE0LCAvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLwotCVBIWV9OX0VTX1RfRkRfQ0FQPSAxPDwxMywgLyogQml0IDEzOgkxMDAwQmFzZS1UIEZEIGNhcGFibGUgKi8KLQlQSFlfTl9FU19UX0hEX0NBUD0gMTw8MTIsIC8qIEJpdCAxMjoJMTAwMEJhc2UtVCBIRCBjYXBhYmxlICovCi19OwotCiAvKiogTWFydmVsbC1TcGVjaWZpYyAqLwogZW51bSB7CiAJUEhZX01fQU5fTlhUX1BHCT0gMTw8MTUsIC8qIFJlcXVlc3QgTmV4dCBQYWdlICovCkBAIC0xNzE4LDcgKzEzODEsNyBAQAogCVBIWV9NX1BDX0VOX0RFVF9QTFVTCT0gMzw8OCwgLyogRW5lcmd5IERldGVjdCBQbHVzIChNb2RlIDIpICovCiB9OwogCi0jZGVmaW5lIFBIWV9NX1BDX01ESV9YTU9ERSh4KQkoKCh4KTw8NSkgJiBQSFlfTV9QQ19NRElYX01TSykJCisjZGVmaW5lIFBIWV9NX1BDX01ESV9YTU9ERSh4KQkoKCh4KTw8NSkgJiBQSFlfTV9QQ19NRElYX01TSykKIAogZW51bSB7CiAJUEhZX01fUENfTUFOX01ESQk9IDAsIC8qIDAwID0gTWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCkBAIC0yMTA1LDcgKzE3NjgsNyBAQAogCUdNX0dQU1JfRkNfUlhfRElTCT0gMTw8MiwJLyogQml0ICAyOglSeCBGbG93LUNvbnRyb2wgTW9kZSBEaXNhYmxlZCAqLwogCUdNX0dQU1JfUFJPTV9FTgkJPSAxPDwxLAkvKiBCaXQgIDE6CVByb21pc2N1b3VzIE1vZGUgRW5hYmxlZCAqLwogfTsKLQkKKwogLyoJR01fR1BfQ1RSTAkxNiBiaXQgci93CUdlbmVyYWwgUHVycG9zZSBDb250cm9sIFJlZ2lzdGVyICovCiBlbnVtIHsKIAlHTV9HUENSX1BST01fRU5BCT0gMTw8MTQsCS8qIEJpdCAxNDoJRW5hYmxlIFByb21pc2N1b3VzIE1vZGUgKi8KQEAgLTIxMjcsNyArMTc5MCw3IEBACiAKICNkZWZpbmUgR01fR1BDUl9TUEVFRF8xMDAwCShHTV9HUENSX0dJR1NfRU5BIHwgR01fR1BDUl9TUEVFRF8xMDApCiAjZGVmaW5lIEdNX0dQQ1JfQVVfQUxMX0RJUwkoR01fR1BDUl9BVV9EVVBfRElTIHwgR01fR1BDUl9BVV9GQ1RfRElTfEdNX0dQQ1JfQVVfU1BEX0RJUykKLQkKKwogLyoJR01fVFhfQ1RSTAkJCTE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLwogZW51bSB7CiAJR01fVFhDUl9GT1JDRV9KQU0JPSAxPDwxNSwgLyogQml0IDE1OglGb3JjZSBKYW0gLyBGbG93LUNvbnRyb2wgKi8KQEAgLTIxMzgsNyArMTgwMSw3IEBACiAKICNkZWZpbmUgVFhfQ09MX1RIUih4KQkJKCgoeCk8PDEwKSAmIEdNX1RYQ1JfQ09MX1RIUl9NU0spCiAjZGVmaW5lIFRYX0NPTF9ERUYJCTB4MDQKLQkKKwogLyoJR01fUlhfQ1RSTAkJCTE2IGJpdCByL3cJUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCiBlbnVtIHsKIAlHTV9SWENSX1VDRl9FTkEJPSAxPDwxNSwgLyogQml0IDE1OglFbmFibGUgVW5pY2FzdCBmaWx0ZXJpbmcgKi8KQEAgLTIxNDYsNyArMTgwOSw3IEBACiAJR01fUlhDUl9DUkNfRElTCT0gMTw8MTMsIC8qIEJpdCAxMzoJUmVtb3ZlIDQtYnl0ZSBDUkMgKi8KIAlHTV9SWENSX1BBU1NfRkMJPSAxPDwxMiwgLyogQml0IDEyOglQYXNzIEZDIHBhY2tldHMgdG8gRklGTyAqLwogfTsKLQkKKwogLyoJR01fVFhfUEFSQU0JCTE2IGJpdCByL3cJVHJhbnNtaXQgUGFyYW1ldGVyIFJlZ2lzdGVyICovCiBlbnVtIHsKIAlHTV9UWFBBX0pBTUxFTl9NU0sJPSAweDAzPDwxNCwJLyogQml0IDE1Li4xNDoJSmFtIExlbmd0aCAqLwpAQCAtMjE3MSw3ICsxODM0LDcgQEAKIAlHTV9TTU9EX0pVTUJPX0VOQQk9IDE8PDgsCS8qIEJpdCAgODoJRW5hYmxlIEp1bWJvIChNYXguIEZyYW1lIExlbikgKi8KIAkgR01fU01PRF9JUEdfTVNLCT0gMHgxZgkvKiBCaXQgNC4uMDoJSW50ZXItUGFja2V0IEdhcCAoSVBHKSAqLwogfTsKLQkKKwogI2RlZmluZSBEQVRBX0JMSU5EX1ZBTCh4KQkoKCh4KTw8MTEpICYgR01fU01PRF9EQVRBQkxfTVNLKQogI2RlZmluZSBEQVRBX0JMSU5EX0RFRgkJMHgwNAogCkBAIC0yMTg2LDcgKzE4NDksNyBAQAogCUdNX1NNSV9DVF9SRF9WQUwJPSAxPDw0LAkvKiBCaXQgIDQ6CVJlYWQgVmFsaWQgKFJlYWQgY29tcGxldGVkKSAqLwogCUdNX1NNSV9DVF9CVVNZCQk9IDE8PDMsCS8qIEJpdCAgMzoJQnVzeSAoT3BlcmF0aW9uIGluIHByb2dyZXNzKSAqLwogfTsKLQkKKwogI2RlZmluZSBHTV9TTUlfQ1RfUEhZX0FEKHgpCSgoKHgpPDwxMSkgJiBHTV9TTUlfQ1RfUEhZX0FfTVNLKQogI2RlZmluZSBHTV9TTUlfQ1RfUkVHX0FEKHgpCSgoKHgpPDw2KSAmIEdNX1NNSV9DVF9SRUdfQV9NU0spCiAKQEAgLTIxOTUsNyArMTg1OCw3IEBACiAJR01fUEFSX01JQl9DTFIJPSAxPDw1LAkvKiBCaXQgIDU6CVNldCBNSUIgQ2xlYXIgQ291bnRlciBNb2RlICovCiAJR01fUEFSX01JQl9UU1QJPSAxPDw0LAkvKiBCaXQgIDQ6CU1JQiBMb2FkIENvdW50ZXIgKFRlc3QgTW9kZSkgKi8KIH07Ci0JCisKIC8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzIEVuY29kaW5nICovCiBlbnVtIHsKIAlHTVJfRlNfTEVOCT0gMHhmZmZmPDwxNiwgLyogQml0IDMxLi4xNjoJUnggRnJhbWUgTGVuZ3RoICovCkBAIC0yMjE3LDEyICsxODgwLDEyIEBACiAvKgogICogR01SX0ZTX0FOWV9FUlIgKGFuYWxvZ291cyB0byBYTVJfRlNfQU5ZX0VSUikKICAqLwotCUdNUl9GU19BTllfRVJSCT0gR01SX0ZTX0NSQ19FUlIgfCBHTVJfRlNfTE9OR19FUlIgfCAKLQkJICAJICBHTVJfRlNfTUlJX0VSUiB8IEdNUl9GU19CQURfRkMgfCBHTVJfRlNfR09PRF9GQyB8IAorCUdNUl9GU19BTllfRVJSCT0gR01SX0ZTX0NSQ19FUlIgfCBHTVJfRlNfTE9OR19FUlIgfAorCQkgIAkgIEdNUl9GU19NSUlfRVJSIHwgR01SX0ZTX0JBRF9GQyB8IEdNUl9GU19HT09EX0ZDIHwKIAkJCSAgR01SX0ZTX0pBQkJFUiwKIC8qIFJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrIChkZWZhdWx0KSAqLwogCVJYX0ZGX0ZMX0RFRl9NU0sgPSBHTVJfRlNfQ1JDX0VSUiB8IEdNUl9GU19SWF9GRl9PViB8R01SX0ZTX01JSV9FUlIgfAotCQkJICAgR01SX0ZTX0JBRF9GQyB8IEdNUl9GU19HT09EX0ZDIHwgR01SX0ZTX1VOX1NJWkUgfCAKKwkJCSAgIEdNUl9GU19CQURfRkMgfCBHTVJfRlNfR09PRF9GQyB8IEdNUl9GU19VTl9TSVpFIHwKIAkJCSAgIEdNUl9GU19KQUJCRVIsCiB9OwogCkBAIC0yNTQwLDEwICsyMjAzLDYgQEAKIH07CiAKIAotLyoJWE1fUEhZX0FERFIJMTYgYml0IHIvdwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZSBYTV9QSFlfQUREUl9TWgkweDFmCS8qIEJpdCAgNC4uMDoJUEhZIEFkZHJlc3MgYml0cyAqLwotCi0KIC8qCVhNX0dQX1BPUlQJMzIgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgUG9ydCBSZWdpc3RlciAqLwogZW51bSB7CiAJWE1fR1BfQU5JUAk9IDE8PDYsCS8qIEJpdCAgNjogKHJvKQlBdXRvLU5lZy4gaW4gcHJvZ3Jlc3MgKi8KQEAgLTI2NjIsOCArMjMyMSw4IEBACiB9OwogCiAjZGVmaW5lIFhNX1BBVVNFX01PREUJKFhNX01EX1NQT0VfRSB8IFhNX01EX1NQT0xfSSB8IFhNX01EX1NQT0hfSSkKLSNkZWZpbmUgWE1fREVGX01PREUJCShYTV9NRF9SWF9SVU5UIHwgWE1fTURfUlhfSVJMRSB8IFhNX01EX1JYX0xPTkcgfFwKLQkJCQlYTV9NRF9SWF9DUkNFIHwgWE1fTURfUlhfRVJSIHwgWE1fTURfQ1NBIHwgWE1fTURfQ0FBKQorI2RlZmluZSBYTV9ERUZfTU9ERQkoWE1fTURfUlhfUlVOVCB8IFhNX01EX1JYX0lSTEUgfCBYTV9NRF9SWF9MT05HIHxcCisJCQkgWE1fTURfUlhfQ1JDRSB8IFhNX01EX1JYX0VSUiB8IFhNX01EX0NTQSkKIAogLyoJWE1fU1RBVF9DTUQJMTYgYml0IHIvdwlTdGF0aXN0aWNzIENvbW1hbmQgUmVnaXN0ZXIgKi8KIGVudW0gewpAQCAtMjc5MywyOCArMjQ1MiwyMCBAQAogCXUzMgkJICAgICBpbnRyX21hc2s7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgKmRldlsyXTsKIAotCXU4CQkgICAgIG1hY19jZmc7CiAJdTgJICAgICAJICAgICBjaGlwX2lkOworCXU4CQkgICAgIGNoaXBfcmV2OwogCXU4CQkgICAgIHBoeV90eXBlOwogCXU4CQkgICAgIHBtZF90eXBlOwogCXUxNgkJICAgICBwaHlfYWRkcjsKKwl1OAkJICAgICBwb3J0czsKIAogCXUzMgkgICAgIAkgICAgIHJhbV9zaXplOwogCXUzMgkgICAgIAkgICAgIHJhbV9vZmZzZXQ7Ci0JCisKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZXh0X3Rhc2tsZXQ7CiAJc3BpbmxvY2tfdAkgICAgIHBoeV9sb2NrOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgaXNkdWFscG9ydChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCi17Ci0JcmV0dXJuICEoaHctPm1hY19jZmcgJiBDRkdfU05HX01BQyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggY2hpcF9yZXYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQotewotCXJldHVybiAoaHctPm1hY19jZmcgJiBDRkdfQ0hJUF9SX01TSykgPj4gNDsKLX0KIAogc3RhdGljIGlubGluZSBpbnQgaXNjb3BwZXIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQogewpAQCAtMjgyNyw3ICsyNDc4LDcgQEAKIAlGTE9XX01PREVfUkVNX1NFTkQJPSAyLCAvKiBTeW1tZXRyaWMgb3IganVzdCByZW1vdGUgKi8KIAlGTE9XX01PREVfU1lNTUVUUklDCT0gMywgLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSAqLwogfTsKLQkKKwogc3RydWN0IHNrZ2VfcG9ydCB7CiAJdTMyCQkgICAgIG1zZ19lbmFibGU7CiAJc3RydWN0IHNrZ2VfaHcJICAgICAqaHc7CkBAIC0yODUzLDggKzI1MDQsOCBAQAogCXZvaWQJCSAgICAgKm1lbTsJLyogUENJIG1lbW9yeSBmb3IgcmluZ3MgKi8KIAlkbWFfYWRkcl90CSAgICAgZG1hOwogCXVuc2lnbmVkIGxvbmcJICAgICBtZW1fc2l6ZTsKKwl1bnNpZ25lZCBpbnQJICAgICByeF9idWZfc2l6ZTsKIAotCXN0cnVjdCB0aW1lcl9saXN0ICAgIGxpbmtfY2hlY2s7CiAJc3RydWN0IHRpbWVyX2xpc3QgICAgbGVkX2JsaW5rOwogfTsKIApAQCAtMjg2Myw3ICsyNTE0LDYgQEAKIHN0YXRpYyBpbmxpbmUgdTMyIHNrZ2VfcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHJlZykKIHsKIAlyZXR1cm4gcmVhZGwoaHctPnJlZ3MgKyByZWcpOwotCiB9CiAKIHN0YXRpYyBpbmxpbmUgdTE2IHNrZ2VfcmVhZDE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHJlZykKQEAgLTI4OTIsMTE0ICsyNTQyLDg3IEBACiB9CiAKIC8qIE1BQyBSZWxhdGVkIFJlZ2lzdGVycyBpbnNpZGUgdGhlIGRldmljZS4gKi8KLSNkZWZpbmUgU0tHRU1BQ19SRUcocG9ydCxyZWcpCSgoKHBvcnQpPDw3KSsocmVnKSkKLQotLyogUENJIGNvbmZpZyBzcGFjZSBjYW4gYmUgYWNjZXNzZWQgdmlhIG1lbW9yeSBtYXBwZWQgc3BhY2UgKi8KLSNkZWZpbmUgU0tHRVBDSV9SRUcocmVnKSAoKHJlZykrIDB4MzgwKQotCi0jZGVmaW5lIFNLR0VYTV9SRUcocG9ydCwgcmVnKSBcCisjZGVmaW5lIFNLX1JFRyhwb3J0LHJlZykJKCgocG9ydCk8PDcpKyhyZWcpKQorI2RlZmluZSBTS19YTUFDX1JFRyhwb3J0LCByZWcpIFwKIAkoKEJBU0VfWE1BQ18xICsgKHBvcnQpICogKEJBU0VfWE1BQ18yIC0gQkFTRV9YTUFDXzEpKSB8IChyZWcpIDw8IDEpCiAKLXN0YXRpYyBpbmxpbmUgdTMyIHNrZ2VfeG1fcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHUzMiB4bV9yZWFkMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKIHsKLQlyZXR1cm4gc2tnZV9yZWFkMzIoaHcsIFNLR0VYTV9SRUcocG9ydCxyZWcpKTsKKwl1MzIgdjsKKwl2ID0gc2tnZV9yZWFkMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQsIHJlZykpOworCXYgfD0gKHUzMilza2dlX3JlYWQxNihodywgU0tfWE1BQ19SRUcocG9ydCwgcmVnKzIpKSA8PCAxNjsKKwlyZXR1cm4gdjsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgc2tnZV94bV9yZWFkMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdTE2IHhtX3JlYWQxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnKQogewotCXJldHVybiBza2dlX3JlYWQxNihodywgU0tHRVhNX1JFRyhwb3J0LHJlZykpOworCXJldHVybiBza2dlX3JlYWQxNihodywgU0tfWE1BQ19SRUcocG9ydCxyZWcpKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBza2dlX3htX3JlYWQ4KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHZvaWQgeG1fd3JpdGUzMihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTMyIHYpCiB7Ci0JcmV0dXJuIHNrZ2VfcmVhZDgoaHcsIFNLR0VYTV9SRUcocG9ydCxyZWcpKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQsciksIHYgJiAweGZmZmYpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfWE1BQ19SRUcocG9ydCxyKzIpLCB2ID4+IDE2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfeG1fd3JpdGUzMihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTMyIHYpCitzdGF0aWMgaW5saW5lIHZvaWQgeG1fd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTE2IHYpCiB7Ci0Jc2tnZV93cml0ZTMyKGh3LCBTS0dFWE1fUkVHKHBvcnQsciksIHYpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfWE1BQ19SRUcocG9ydCxyKSwgdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3htX3dyaXRlMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUxNiB2KQotewotCXNrZ2Vfd3JpdGUxNihodywgU0tHRVhNX1JFRyhwb3J0LHIpLCB2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfeG1fd3JpdGU4KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1OCB2KQotewotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFWE1fUkVHKHBvcnQsciksIHYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tnZV94bV9vdXRoYXNoKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCitzdGF0aWMgaW5saW5lIHZvaWQgeG1fb3V0aGFzaChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnLAogCQkJCSAgIGNvbnN0IHU4ICpoYXNoKQogewotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgcmVnLCAKLQkJCSh1MTYpaGFzaFswXSB8ICgodTE2KWhhc2hbMV0gPDwgOCkpOwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzIsIAotCQkJKHUxNiloYXNoWzJdIHwgKCh1MTYpaGFzaFszXSA8PCA4KSk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNCwgCi0JCQkodTE2KWhhc2hbNF0gfCAoKHUxNiloYXNoWzVdIDw8IDgpKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys2LCAKLQkJCSh1MTYpaGFzaFs2XSB8ICgodTE2KWhhc2hbN10gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgICAodTE2KWhhc2hbMF0gfCAoKHUxNiloYXNoWzFdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrMiwgKHUxNiloYXNoWzJdIHwgKCh1MTYpaGFzaFszXSA8PCA4KSk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzQsICh1MTYpaGFzaFs0XSB8ICgodTE2KWhhc2hbNV0gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys2LCAodTE2KWhhc2hbNl0gfCAoKHUxNiloYXNoWzddIDw8IDgpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfeG1fb3V0YWRkcihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnLAorc3RhdGljIGlubGluZSB2b2lkIHhtX291dGFkZHIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZywKIAkJCQkgICBjb25zdCB1OCAqYWRkcikKIHsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgCi0JCQkodTE2KWFkZHJbMF0gfCAoKHUxNilhZGRyWzFdIDw8IDgpKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgCi0JCQkodTE2KWFkZHJbMl0gfCAoKHUxNilhZGRyWzNdIDw8IDgpKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgCi0JCQkodTE2KWFkZHJbNF0gfCAoKHUxNilhZGRyWzVdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsICAgKHUxNilhZGRyWzBdIHwgKCh1MTYpYWRkclsxXSA8PCA4KSk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzIsICh1MTYpYWRkclsyXSB8ICgodTE2KWFkZHJbM10gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LCAodTE2KWFkZHJbNF0gfCAoKHUxNilhZGRyWzVdIDw8IDgpKTsKIH0KIAorI2RlZmluZSBTS19HTUFDX1JFRyhwb3J0LHJlZykgXAorCShCQVNFX0dNQUNfMSArIChwb3J0KSAqIChCQVNFX0dNQUNfMi1CQVNFX0dNQUNfMSkgKyAocmVnKSkKIAotI2RlZmluZSBTS0dFR01BX1JFRyhwb3J0LHJlZykgXAotCSgocmVnKSArIEJBU0VfR01BQ18xICsgXAotCSAocG9ydCkgKiAoQkFTRV9HTUFDXzItQkFTRV9HTUFDXzEpKQotCi1zdGF0aWMgaW5saW5lIHUxNiBza2dlX2dtYV9yZWFkMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdTE2IGdtYV9yZWFkMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKIHsKLQlyZXR1cm4gc2tnZV9yZWFkMTYoaHcsIFNLR0VHTUFfUkVHKHBvcnQscmVnKSk7CisJcmV0dXJuIHNrZ2VfcmVhZDE2KGh3LCBTS19HTUFDX1JFRyhwb3J0LHJlZykpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBza2dlX2dtYV9yZWFkMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdTMyIGdtYV9yZWFkMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKIHsKLQlyZXR1cm4gKHUzMikgc2tnZV9yZWFkMTYoaHcsIFNLR0VHTUFfUkVHKHBvcnQscmVnKSkKLQkJfCAoKHUzMilza2dlX3JlYWQxNihodywgU0tHRUdNQV9SRUcocG9ydCxyZWcrNCkpIDw8IDE2KTsKKwlyZXR1cm4gKHUzMikgc2tnZV9yZWFkMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQscmVnKSkKKwkJfCAoKHUzMilza2dlX3JlYWQxNihodywgU0tfR01BQ19SRUcocG9ydCxyZWcrNCkpIDw8IDE2KTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBza2dlX2dtYV9yZWFkOChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnKQorc3RhdGljIGlubGluZSB2b2lkIGdtYV93cml0ZTE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1MTYgdikKIHsKLQlyZXR1cm4gc2tnZV9yZWFkOChodywgU0tHRUdNQV9SRUcocG9ydCxyZWcpKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQsciksIHYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tnZV9nbWFfd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTE2IHYpCitzdGF0aWMgaW5saW5lIHZvaWQgZ21hX3dyaXRlMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUzMiB2KQogewotCXNrZ2Vfd3JpdGUxNihodywgU0tHRUdNQV9SRUcocG9ydCxyKSwgdik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19HTUFDX1JFRyhwb3J0LCByKSwgKHUxNikgdik7CisJc2tnZV93cml0ZTMyKGh3LCBTS19HTUFDX1JFRyhwb3J0LCByKzQpLCAodTE2KSh2ID4+IDE2KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX2dtYV93cml0ZTMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1MzIgdikKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbWFfd3JpdGU4KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1OCB2KQogewotCXNrZ2Vfd3JpdGUxNihodywgU0tHRUdNQV9SRUcocG9ydCwgciksICh1MTYpIHYpOwotCXNrZ2Vfd3JpdGUzMihodywgU0tHRUdNQV9SRUcocG9ydCwgcis0KSwgKHUxNikodiA+PiAxNikpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19HTUFDX1JFRyhwb3J0LHIpLCB2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfZ21hX3dyaXRlOChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTggdikKLXsKLQlza2dlX3dyaXRlOChodywgU0tHRUdNQV9SRUcocG9ydCxyKSwgdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX2dtX3NldF9hZGRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCitzdGF0aWMgaW5saW5lIHZvaWQgZ21hX3NldF9hZGRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCiAJCQkJICAgIGNvbnN0IHU4ICphZGRyKQogewotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywKLQkJCSAodTE2KSBhZGRyWzBdIHwgKCh1MTYpIGFkZHJbMV0gPDwgOCkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LAotCQkJICh1MTYpIGFkZHJbMl0gfCAoKHUxNikgYWRkclszXSA8PCA4KSk7Ci0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgcmVnKzgsCi0JCQkgKHUxNikgYWRkcls0XSB8ICgodTE2KSBhZGRyWzVdIDw8IDgpKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgcmVnLCAgKHUxNikgYWRkclswXSB8ICgodTE2KSBhZGRyWzFdIDw8IDgpKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgcmVnKzQsKHUxNikgYWRkclsyXSB8ICgodTE2KSBhZGRyWzNdIDw8IDgpKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgcmVnKzgsKHUxNikgYWRkcls0XSB8ICgodTE2KSBhZGRyWzVdIDw8IDgpKTsKIH0KLQkJCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCmluZGV4IGM3OWUwYWQuLjQwNGVhNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaXAuYworKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9zbGlwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSAic2xpcC5oIgogI2lmZGVmIENPTkZJR19JTkVUCkBAIC0xMzgzLDEwICsxMzg0LDggQEAKIAkvKiBGaXJzdCBvZiBhbGw6IGNoZWNrIGZvciBhY3RpdmUgZGlzY2lwbGluZXMgYW5kIGhhbmd1cCB0aGVtLgogCSAqLwogCWRvIHsKLQkJaWYgKGJ1c3kpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApOwotCQl9CisJCWlmIChidXN5KQorCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKIAogCQlidXN5ID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHNsaXBfbWF4ZGV2OyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwppbmRleCA5OTAyMDFmLi5mMDBjNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAiODM5MC5oIgotI2luY2x1ZGUgInNtYy1tY2EuaCIKIAogI2RlZmluZSBEUlZfTkFNRSAic21jLW1jYSIKIApAQCAtMTAwLDYgKzk5LDYzIEBACiBNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lvLCAiU01DIFVsdHJhL0V0aGVyRVogTUNBIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CiBNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lycSwgIlNNQyBVbHRyYS9FdGhlckVaIE1DQSBJUlEgbnVtYmVyKHMpIik7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyOworfSBhZGRyX3RhYmxlW10gPSB7CisgICAgeyAweDA4MDAgfSwKKyAgICB7IDB4MTgwMCB9LAorICAgIHsgMHgyODAwIH0sCisgICAgeyAweDM4MDAgfSwKKyAgICB7IDB4NDgwMCB9LAorICAgIHsgMHg1ODAwIH0sCisgICAgeyAweDY4MDAgfSwKKyAgICB7IDB4NzgwMCB9LAorICAgIHsgMHg4ODAwIH0sCisgICAgeyAweDk4MDAgfSwKKyAgICB7IDB4YTgwMCB9LAorICAgIHsgMHhiODAwIH0sCisgICAgeyAweGM4MDAgfSwKKyAgICB7IDB4ZDgwMCB9LAorICAgIHsgMHhlODAwIH0sCisgICAgeyAweGY4MDAgfQorfTsKKworI2RlZmluZSBNRU1fTUFTSyA2NAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBtZW1faW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OworICB1bnNpZ25lZCBjaGFyIG51bV9wYWdlczsKK30gbWVtX3RhYmxlW10gPSB7CisgICAgeyAxNiwgMHgwYzAwMDAsIDQwIH0sCisgICAgeyAxOCwgMHgwYzQwMDAsIDQwIH0sCisgICAgeyAyMCwgMHgwYzgwMDAsIDQwIH0sCisgICAgeyAyMiwgMHgwY2MwMDAsIDQwIH0sCisgICAgeyAyNCwgMHgwZDAwMDAsIDQwIH0sCisgICAgeyAyNiwgMHgwZDQwMDAsIDQwIH0sCisgICAgeyAyOCwgMHgwZDgwMDAsIDQwIH0sCisgICAgeyAzMCwgMHgwZGMwMDAsIDQwIH0sCisgICAgezE0NCwgMHhmYzAwMDAsIDQwIH0sCisgICAgezE0OCwgMHhmYzgwMDAsIDQwIH0sCisgICAgezE1NCwgMHhmZDAwMDAsIDQwIH0sCisgICAgezE1NiwgMHhmZDgwMDAsIDQwIH0sCisgICAgeyAgMCwgMHgwYzAwMDAsIDIwIH0sCisgICAgeyAgMSwgMHgwYzIwMDAsIDIwIH0sCisgICAgeyAgMiwgMHgwYzQwMDAsIDIwIH0sCisgICAgeyAgMywgMHgwYzYwMDAsIDIwIH0KK307CisKKyNkZWZpbmUgSVJRX01BU0sgMjQzCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgIHVuc2lnbmVkIGNoYXIgbmV3X2lycTsKKyAgIHVuc2lnbmVkIGNoYXIgb2xkX2lycTsKK30gaXJxX3RhYmxlW10gPSB7CisgICB7ICAzLCAgMyB9LAorICAgeyAgNCwgIDQgfSwKKyAgIHsgMTAsIDEwIH0sCisgICB7IDE0LCAxNSB9Cit9OworCiBzdGF0aWMgc2hvcnQgc21jX21jYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJMHg2MWM4LAogCTB4NjFjOSwKQEAgLTEyNiw3ICsxODIsNyBAQAogCiBzdGF0aWMgaW50IHVsdHJhX2ZvdW5kID0gMDsKIAotaW50IF9faW5pdCB1bHRyYW1jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpnZW5fZGV2KQorc3RhdGljIGludCBfX2luaXQgdWx0cmFtY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZ2VuX2RldikKIHsKIAl1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuaCBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1MDExNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9zbWMtbWNhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogZGp3ZWlzIHdlaXNkMzQ1OEB1bmkuZWR1Ci0gKiBtb3N0IG9mIHRoaXMgZmlsZSB3YXMgdGFrZW4gZnJvbSBwczJlc2RpLmgKLSAqLwotCi1zdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyOwotfSBhZGRyX3RhYmxlW10gPSB7Ci0gICAgeyAweDA4MDAgfSwKLSAgICB7IDB4MTgwMCB9LAotICAgIHsgMHgyODAwIH0sCi0gICAgeyAweDM4MDAgfSwKLSAgICB7IDB4NDgwMCB9LAotICAgIHsgMHg1ODAwIH0sCi0gICAgeyAweDY4MDAgfSwKLSAgICB7IDB4NzgwMCB9LAotICAgIHsgMHg4ODAwIH0sCi0gICAgeyAweDk4MDAgfSwKLSAgICB7IDB4YTgwMCB9LAotICAgIHsgMHhiODAwIH0sCi0gICAgeyAweGM4MDAgfSwKLSAgICB7IDB4ZDgwMCB9LAotICAgIHsgMHhlODAwIH0sCi0gICAgeyAweGY4MDAgfQotfTsKLQotI2RlZmluZSBNRU1fTUFTSyA2NAotCi1zdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIG1lbV9pbmRleDsKLSAgdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgbnVtX3BhZ2VzOwotfSBtZW1fdGFibGVbXSA9IHsKLSAgICB7IDE2LCAweDBjMDAwMCwgNDAgfSwKLSAgICB7IDE4LCAweDBjNDAwMCwgNDAgfSwKLSAgICB7IDIwLCAweDBjODAwMCwgNDAgfSwKLSAgICB7IDIyLCAweDBjYzAwMCwgNDAgfSwKLSAgICB7IDI0LCAweDBkMDAwMCwgNDAgfSwKLSAgICB7IDI2LCAweDBkNDAwMCwgNDAgfSwKLSAgICB7IDI4LCAweDBkODAwMCwgNDAgfSwKLSAgICB7IDMwLCAweDBkYzAwMCwgNDAgfSwKLSAgICB7MTQ0LCAweGZjMDAwMCwgNDAgfSwKLSAgICB7MTQ4LCAweGZjODAwMCwgNDAgfSwKLSAgICB7MTU0LCAweGZkMDAwMCwgNDAgfSwKLSAgICB7MTU2LCAweGZkODAwMCwgNDAgfSwKLSAgICB7ICAwLCAweDBjMDAwMCwgMjAgfSwKLSAgICB7ICAxLCAweDBjMjAwMCwgMjAgfSwKLSAgICB7ICAyLCAweDBjNDAwMCwgMjAgfSwKLSAgICB7ICAzLCAweDBjNjAwMCwgMjAgfQotfTsKLQotI2RlZmluZSBJUlFfTUFTSyAyNDMKLXN0cnVjdCB7Ci0gICB1bnNpZ25lZCBjaGFyIG5ld19pcnE7Ci0gICB1bnNpZ25lZCBjaGFyIG9sZF9pcnE7Ci19IGlycV90YWJsZVtdID0gewotICAgeyAgMywgIDMgfSwKLSAgIHsgIDQsICA0IH0sCi0gICB7IDEwLCAxMCB9LAotICAgeyAxNCwgMTUgfQotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggYjU2NGM2Ny4uNmQ5ZGFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTE5NCwxMiArMTk0LDcgQEAKIAllcnIgPSBkb191bHRyYV9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0zMjUsNiArMzIwLDkgQEAKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7CiAKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAlyZXR1cm4gMDsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFVMVFJBX0lPX0VYVEVOVCk7CkBAIC01ODMsMTEgKzU4MSw4IEBACiAJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWlmIChkb191bHRyYV9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X3VsdHJhW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfdWx0cmFbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbWMtdWx0cmEuYzogTm8gU01DIFVsdHJhIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggZmQ4MDA0OC4uMTQzOGZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTMxNSwxNSArMzE1LDI1IEBACiAJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CiAJdW5zaWduZWQgaW50IGN0bCwgY2ZnOworCXN0cnVjdCBza19idWZmICpwZW5kaW5nX3NrYjsKIAogCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CiAKLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgYmxvY2sgVFggdGFza2xldCAqLwogCXNwaW5fbG9jaygmbHAtPmxvY2spOwogCVNNQ19TRUxFQ1RfQkFOSygyKTsKIAlTTUNfU0VUX0lOVF9NQVNLKDApOworCXBlbmRpbmdfc2tiID0gbHAtPnBlbmRpbmdfdHhfc2tiOworCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKIAorCS8qIGZyZWUgYW55IHBlbmRpbmcgdHggc2tiICovCisJaWYgKHBlbmRpbmdfc2tiKSB7CisJCWRldl9rZnJlZV9za2IocGVuZGluZ19za2IpOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KKwogCS8qCiAJICogVGhpcyByZXNldHMgdGhlIHJlZ2lzdGVycyBtb3N0bHkgdG8gZGVmYXVsdHMsIGJ1dCBkb2Vzbid0CiAJICogYWZmZWN0IEVFUFJPTS4gIFRoYXQgc2VlbXMgdW5uZWNlc3NhcnkKQEAgLTM4OSwxNCArMzk5LDYgQEAKIAlTTUNfU0VMRUNUX0JBTksoMik7CiAJU01DX1NFVF9NTVVfQ01EKE1DX1JFU0VUKTsKIAlTTUNfV0FJVF9NTVVfQlVTWSgpOwotCi0JLyogY2xlYXIgYW55dGhpbmcgc2F2ZWQgKi8KLQlpZiAobHAtPnBlbmRpbmdfdHhfc2tiICE9IE5VTEwpIHsKLQkJZGV2X2tmcmVlX3NrYiAobHAtPnBlbmRpbmdfdHhfc2tiKTsKLQkJbHAtPnBlbmRpbmdfdHhfc2tiID0gTlVMTDsKLQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKLQl9CiB9CiAKIC8qCkBAIC00NDAsNiArNDQyLDcgQEAKIHsKIAlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CiAKIAlEQkcoMiwgIiVzOiAlc1xuIiwgQ0FSRE5BTUUsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQ0Nyw3ICs0NTAsMTEgQEAKIAlzcGluX2xvY2soJmxwLT5sb2NrKTsKIAlTTUNfU0VMRUNUX0JBTksoMik7CiAJU01DX1NFVF9JTlRfTUFTSygwKTsKKwlwZW5kaW5nX3NrYiA9IGxwLT5wZW5kaW5nX3R4X3NrYjsKKwlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJaWYgKHBlbmRpbmdfc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHBlbmRpbmdfc2tiKTsKIAogCS8qIGFuZCB0ZWxsIHRoZSBjYXJkIHRvIHN0YXkgYXdheSBmcm9tIHRoYXQgbmFzdHkgb3V0c2lkZSB3b3JsZCAqLwogCVNNQ19TRUxFQ1RfQkFOSygwKTsKQEAgLTYyNyw3ICs2MzQsMTIgQEAKIAl9CiAKIAlza2IgPSBscC0+cGVuZGluZ190eF9za2I7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXNtY19zcGVjaWFsX3VubG9jaygmbHAtPmxvY2spOworCQlyZXR1cm47CisJfQogCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7CisKIAlwYWNrZXRfbm8gPSBTTUNfR0VUX0FSKCk7CiAJaWYgKHVubGlrZWx5KHBhY2tldF9ubyAmIEFSX0ZBSUxFRCkpIHsKIAkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKQEAgLTcwMiw3ICs3MTQsNiBAQAogCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CiAKIAlCVUdfT04obHAtPnBlbmRpbmdfdHhfc2tiICE9IE5VTEwpOwotCWxwLT5wZW5kaW5nX3R4X3NrYiA9IHNrYjsKIAogCS8qCiAJICogVGhlIE1NVSB3YW50cyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHRoZSBudW1iZXIgb2YgMjU2IGJ5dGVzCkBAIC03MTgsNyArNzI5LDYgQEAKIAludW1QYWdlcyA9ICgoc2tiLT5sZW4gJiB+MSkgKyAoNiAtIDEpKSA+PiA4OwogCWlmICh1bmxpa2VseShudW1QYWdlcyA+IDcpKSB7CiAJCXByaW50aygiJXM6IEZhciB0b28gYmlnIHBhY2tldCBlcnJvci5cbiIsIGRldi0+bmFtZSk7Ci0JCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7CiAJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtNzQ1LDYgKzc1NSw3IEBACiAKIAlzbWNfc3BlY2lhbF91bmxvY2soJmxwLT5sb2NrKTsKIAorCWxwLT5wZW5kaW5nX3R4X3NrYiA9IHNrYjsKICAgIAlpZiAoIXBvbGxfY291bnQpIHsKIAkJLyogb2ggd2VsbCwgd2FpdCB1bnRpbCB0aGUgY2hpcCBmaW5kcyBtZW1vcnkgbGF0ZXIgKi8KIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpAQCAtMTA2Miw3ICsxMDczLDcgQEAKIAkgICBhYm92ZSkuIGxpbmt3YXRjaF9ldmVudCgpIGFsc28gd2FudHMgdGhlIG5ldGxpbmsgc2VtYXBob3JlLgogCSovCiAJd2hpbGUobHAtPndvcmtfcGVuZGluZykKLQkJc2NoZWR1bGUoKTsKKwkJeWllbGQoKTsKIAogCWJtY3IgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHksIE1JSV9CTUNSKTsKIAlzbWNfcGh5X3dyaXRlKGRldiwgcGh5LCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfUERPV04pOwpAQCAtMTYwNiwxNCArMTYxNyw4IEBACiAKIAkvKiBjbGVhciBldmVyeXRoaW5nICovCiAJc21jX3NodXRkb3duKGRldik7Ci0KKwl0YXNrbGV0X2tpbGwoJmxwLT50eF90YXNrKTsKIAlzbWNfcGh5X3Bvd2VyZG93bihkZXYpOwotCi0JaWYgKGxwLT5wZW5kaW5nX3R4X3NrYikgewotCQlkZXZfa2ZyZWVfc2tiKGxwLT5wZW5kaW5nX3R4X3NrYik7Ci0JCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTMsNyArMTk5OCw3IEBACiAgICAgICAJaWYgKHJldHZhbCkKICAgICAgIAkJZ290byBlcnJfb3V0OwogCi0Jc2V0X2lycV90eXBlKGRldi0+aXJxLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV90eXBlKGRldi0+aXJxLCBTTUNfSVJRX1RSSUdHRVJfVFlQRSk7CiAKICNpZmRlZiBTTUNfVVNFX1BYQV9ETUEKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IDk0NjUyOGUuLjcwODlkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCkBAIC0xODIsNiArMTgyLDE2IEBACiAjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCiAjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKIAorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisKKyNkZWZpbmUJU01DX0lSUV9UUklHR0VSX1RZUEUgKCggXAorCQkgICBtYWNoaW5lX2lzX29tYXBfaDIoKSBcCisJCXx8IG1hY2hpbmVfaXNfb21hcF9oMygpIFwKKwkJfHwgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSAmJiAhY3B1X2lzX29tYXAxNTAoKSkgXAorCSkgPyBJUlFUX0ZBTExJTkcgOiBJUlFUX1JJU0lORykKKworCiAjZWxpZglkZWZpbmVkKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCiAKICNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCkBAIC0zMDAsNiArMzEwLDkgQEAKIAogI2VuZGlmCiAKKyNpZm5kZWYJU01DX0lSUV9UUklHR0VSX1RZUEUKKyNkZWZpbmUJU01DX0lSUV9UUklHR0VSX1RZUEUJSVJRVF9SSVNJTkcKKyNlbmRpZgogCiAjaWZkZWYgU01DX1VTRV9QWEFfRE1BCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKaW5kZXggMTJlMmI2OC4uODhiODlkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYworKysgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCQlucC0+cnhfaW5mb1tpXS5za2IgPSBza2I7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwotCQlucC0+cnhfaW5mb1tpXS5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbnAtPnJ4X2luZm9baV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJLyogR3Jyciwgd2UgY2Fubm90IG9mZnNldCB0byBjb3JyZWN0bHkgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KIAkJbnAtPnJ4X3JpbmdbaV0ucnhhZGRyID0gY3B1X3RvX2RtYShucC0+cnhfaW5mb1tpXS5tYXBwaW5nIHwgUnhEZXNjVmFsaWQpOwpAQCAtMTU3Miw3ICsxNTcyLDcgQEAKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKIAkJCQkJCSAgICBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywKIAkJCQkJCSAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9pbmZvW2VudHJ5XS5za2ItPnRhaWwsIHBrdF9sZW4sIDApOworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9pbmZvW2VudHJ5XS5za2ItPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAogCQkJCQkJICAgICAgIG5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nLAogCQkJCQkJICAgICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CkBAIC0xNjk2LDcgKzE2OTYsNyBAQAogCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCWJyZWFrOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLwogCQkJbnAtPnJ4X2luZm9bZW50cnldLm1hcHBpbmcgPQotCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlucC0+cnhfcmluZ1tlbnRyeV0ucnhhZGRyID0KIAkJCQljcHVfdG9fZG1hKG5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nIHwgUnhEZXNjVmFsaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKaW5kZXggMDhjYjcxNy4uZDUwMGE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMigKLQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osCisJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBucC0+cnhfYnVmX3N6LAogCQkJCVBDSV9ETUFfRlJPTURFVklDRSkpOwogCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBMYXN0RnJhZyk7CiAJfQpAQCAtMTM0MSw3ICsxMzQxLDcgQEAKIAkJCQkJCQkgICAgbnAtPnJ4X2J1Zl9zeiwKIAkJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBjaV9kZXYsCiAJCQkJCQkJICAgICAgIGRlc2MtPmZyYWdbMF0uYWRkciwKIAkJCQkJCQkgICAgICAgbnAtPnJ4X2J1Zl9zeiwKQEAgLTE0MDAsNyArMTQwMCw3IEBACiAJCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciA9IGNwdV90b19sZTMyKAotCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCX0KIAkJLyogUGVyaGFwcyB3ZSBuZWVkIG5vdCByZXNldCB0aGlzIGZpZWxkLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCA1Y2Q1MGZkLi4yNjA4ZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTI5ODksMTAgKzI5OTAsMTAgQEAKIAkgKi8KIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0gJiYKLQkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKIAkJcGNpX3VzaW5nX2RhYyA9IDE7CiAJfSBlbHNlIHsKLQkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmKTsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgIgogCQkJICAgICAgICJhYm9ydGluZy5cbiIpOwpAQCAtMzA3OCw3ICszMDc5LDkgQEAKIAlncC0+cGh5X21paS5kZXYgPSBkZXY7CiAJZ3AtPnBoeV9taWkubWRpb19yZWFkID0gX3BoeV9yZWFkOwogCWdwLT5waHlfbWlpLm1kaW9fd3JpdGUgPSBfcGh5X3dyaXRlOwotCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJZ3AtPnBoeV9taWkucGxhdGZvcm1fZGF0YSA9IGdwLT5vZl9ub2RlOworI2VuZGlmCiAJLyogQnkgZGVmYXVsdCwgd2Ugc3RhcnQgd2l0aCBhdXRvbmVnICovCiAJZ3AtPndhbnRfYXV0b25lZyA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYwppbmRleCAwZmNhNDE0Li5kM2RkYjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jCkBAIC0zMiw2ICszMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNlbmRpZgorCiAjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgogCiAvKiBMaW5rIG1vZGVzIG9mIHRoZSBCQ001NDAwIFBIWSAqLwpAQCAtMjgxLDEwICsyODUsMTIgQEAKIHN0YXRpYyBpbnQgYmNtNTQyMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCiB7CiAJdTE2IGRhdGE7Ci0JaW50IHJldjsKKwl1bnNpZ25lZCBpbnQgaWQ7CiAKLQlyZXYgPSBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSAmIDB4MDAwZjsKLQlpZiAocmV2ID09IDApIHsKKwlpZCA9IChwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQxKSA8PCAxNiB8IHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDIpKTsKKworCS8qIFJldmlzaW9uIDAgb2YgNTQyMSBuZWVkcyBzb21lIGZpeHVwcyAqLworCWlmIChpZCA9PSAweDAwMjA2MGUwKSB7CiAJCS8qIFRoaXMgaXMgYm9ycm93ZWQgZnJvbSBNYWNPUwogCQkgKi8KIAkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHgxMDA3KTsKQEAgLTI5NywyMSArMzAzLDI4IEBACiAJCWRhdGEgPSBwaHlfcmVhZChwaHksIDB4MTUpOwogCQlwaHlfd3JpdGUocGh5LCAweDE1LCBkYXRhIHwgMHgwMjAwKTsKIAl9Ci0jaWYgMAotCS8qIFRoaXMgaGFzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSBJIGVuYWJsZSBpdCAqLwotCS8qIEVuYWJsZSBhdXRvbWF0aWMgbG93LXBvd2VyICovCi0JcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5MDAyKTsKLQlwaHlfd3JpdGUocGh5LCAweDFjLCAweGE4MjEpOwotCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTQxZCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBiY201NDIxazJfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQotewotCS8qIEluaXQgY29kZSBib3Jyb3dlZCBmcm9tIE9GICovCi0JcGh5X3dyaXRlKHBoeSwgNCwgMHgwMWUxKTsKLQlwaHlfd3JpdGUocGh5LCA5LCAweDAzMDApOworCS8qIFBpY2sgdXAgc29tZSBpbml0IGNvZGUgZnJvbSBPRiBmb3IgSzIgdmVyc2lvbiAqLworCWlmICgoaWQgJiAweGZmZmZmZmYwKSA9PSAweDAwMjA2MmUwKSB7CisJCXBoeV93cml0ZShwaHksIDQsIDB4MDFlMSk7CisJCXBoeV93cml0ZShwaHksIDksIDB4MDMwMCk7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgbG93IHBvd2VyICovCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKHBoeS0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZfZ2V0X3BhcmVudChwaHktPnBsYXRmb3JtX2RhdGEpOworCQlpbnQgY2FuX2xvd19wb3dlciA9IDE7CisJCWlmIChucCA9PSBOVUxMIHx8IGdldF9wcm9wZXJ0eShucCwgIm5vLWF1dG9sb3dwb3dlciIsIE5VTEwpKQorCQkJY2FuX2xvd19wb3dlciA9IDA7CisJCWlmIChjYW5fbG93X3Bvd2VyKSB7CisJCQkvKiBFbmFibGUgYXV0b21hdGljIGxvdy1wb3dlciAqLworCQkJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5MDAyKTsKKwkJCXBoeV93cml0ZShwaHksIDB4MWMsIDB4YTgyMSk7CisJCQlwaHlfd3JpdGUocGh5LCAweDFjLCAweDk0MWQpOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjIsNyArNzc1LDcgQEAKIAogLyogQnJvYWRjb20gQkNNIDU0MjEgYnVpbHQtaW4gSzIgKi8KIHN0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQyMWsyX3BoeV9vcHMgPSB7Ci0JLmluaXQJCT0gYmNtNTQyMWsyX2luaXQsCisJLmluaXQJCT0gYmNtNTQyMV9pbml0LAogCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAogCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAogCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKQEAgLTc3OSw2ICs3OTIsMjUgQEAKIAkub3BzCQk9ICZiY201NDIxazJfcGh5X29wcwogfTsKIAorLyogQnJvYWRjb20gQkNNIDU0NjIgYnVpbHQtaW4gVmVzdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQ2MlZfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDIxX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDExX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQ2MlZfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwZDAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQ2Mi1WZXN0YSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0NjJWX3BoeV9vcHMKK307CisKIC8qIE1hcnZlbGwgODhFMTEwMSAoQXBwbGUgc2VlbSB0byBkZWFsIHdpdGggMiBkaWZmZXJlbnQgcmV2cywKICAqIEkgbWFza2VkIG91dCB0aGUgOCBsYXN0IGJpdHMgdG8gZ2V0IGJvdGgsIGJ1dCBzb21lIHNwZWNzCiAgKiB3b3VsZCBiZSB1c2VmdWwgaGVyZSkgLS1CZW5ILgpAQCAtODI0LDYgKzg1Niw3IEBACiAJJmJjbTU0MTFfcGh5X2RlZiwKIAkmYmNtNTQyMV9waHlfZGVmLAogCSZiY201NDIxazJfcGh5X2RlZiwKKwkmYmNtNTQ2MlZfcGh5X2RlZiwKIAkmbWFydmVsbF9waHlfZGVmLAogCSZnZW5taWlfcGh5X2RlZiwKIAlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmggYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmgKaW5kZXggODIyY2I1OC4uNDMwNTQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaApAQCAtNDMsOSArNDMsMTAgQEAKIAlpbnQJCQlwYXVzZTsKIAogCS8qIFByb3ZpZGVkIGJ5IGhvc3QgY2hpcCAqLwotCXN0cnVjdCBuZXRfZGV2aWNlKglkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKIAl2b2lkICgqbWRpb193cml0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcsIGludCB2YWwpOworCXZvaWQJCQkqcGxhdGZvcm1fZGF0YTsKIH07CiAKIC8qIFBhc3MgaW4gYSBzdHJ1Y3QgbWlpX3BoeSB3aXRoIGRldiwgbWRpb19yZWFkIGFuZCBtZGlvX3dyaXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IDdlMzcxYjEuLjU0NjQwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC02Niw4ICs2Niw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjMyIgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjQsIDIwMDUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdWx5IDUsIDIwMDUiCiAKICNkZWZpbmUgVEczX0RFRl9NQUNfTU9ERQkwCiAjZGVmaW5lIFRHM19ERUZfUlhfTU9ERQkJMApAQCAtNTExNyw3ICs1MTE3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfY29hbGVzY2Uoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAl0dzMyKEhPU1RDQ19SWENPTF9USUNLUywgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKIAl0dzMyKEhPU1RDQ19UWENPTF9USUNLUywgZWMtPnR4X2NvYWxlc2NlX3VzZWNzKTsKQEAgLTU0NjAsNyArNTQ2MCw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCi0JdGczX3NldF9jb2FsZXNjZSh0cCwgJnRwLT5jb2FsKTsKKwlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CiAKIAkvKiBzZXQgc3RhdHVzIGJsb2NrIERNQSBhZGRyZXNzICovCiAJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsCkBAIC03ODIxLDYgKzc4MjEsNjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIG1heF9yeGNvYWxfdGlja19pbnQgPSAwLCBtYXhfdHhjb2FsX3RpY2tfaW50ID0gMDsKKwl1MzIgbWF4X3N0YXRfY29hbF90aWNrcyA9IDAsIG1pbl9zdGF0X2NvYWxfdGlja3MgPSAwOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCW1heF9yeGNvYWxfdGlja19pbnQgPSBNQVhfUlhDT0FMX1RJQ0tfSU5UOworCQltYXhfdHhjb2FsX3RpY2tfaW50ID0gTUFYX1RYQ09BTF9USUNLX0lOVDsKKwkJbWF4X3N0YXRfY29hbF90aWNrcyA9IE1BWF9TVEFUX0NPQUxfVElDS1M7CisJCW1pbl9zdGF0X2NvYWxfdGlja3MgPSBNSU5fU1RBVF9DT0FMX1RJQ0tTOworCX0KKworCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1JYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1RYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX1JYTUFYX0ZSQU1FUykgfHwKKwkgICAgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9UWE1BWF9GUkFNRVMpIHx8CisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxID4gbWF4X3J4Y29hbF90aWNrX2ludCkgfHwKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPiBtYXhfdHhjb2FsX3RpY2tfaW50KSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA+IE1BWF9SWENPQUxfTUFYRl9JTlQpIHx8CisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxID4gTUFYX1RYQ09BTF9NQVhGX0lOVCkgfHwKKwkgICAgKGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcyA+IG1heF9zdGF0X2NvYWxfdGlja3MpIHx8CisJICAgIChlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPCBtaW5fc3RhdF9jb2FsX3RpY2tzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBObyByeCBpbnRlcnJ1cHRzIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGJvdGggYXJlIHplcm8gKi8KKwlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSAmJgorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vIHR4IGludGVycnVwdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYm90aCBhcmUgemVybyAqLworCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID09IDApICYmCisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBjb3B5IHJlbGV2YW50IHBhcmFtZXRlcnMsIGlnbm9yZSBhbGwgb3RoZXJzLiAqLworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnR4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IGVjLT5yeF9jb2FsZXNjZV91c2Vjc19pcnE7CisJdHAtPmNvYWwudHhfY29hbGVzY2VfdXNlY3NfaXJxID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzX2lycTsKKwl0cC0+Y29hbC5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisJdHAtPmNvYWwuc3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSBlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXRnM19mdWxsX2xvY2sodHAsIDApOworCQlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CisJCXRnM19mdWxsX3VubG9jayh0cCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLApAQCAtNzg1Niw2ICs3OTEwLDcgQEAKIAkuZ2V0X3N0YXRzX2NvdW50CT0gdGczX2dldF9zdGF0c19jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSB0ZzNfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9jb2FsZXNjZQkJPSB0ZzNfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gdGczX3NldF9jb2FsZXNjZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfZ2V0X2VlcHJvbV9zaXplKHN0cnVjdCB0ZzMgKnRwKQpAQCAtOTgwMCw2ICs5ODU1LDEyIEBACiAJCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IExPV19UWENPTF9USUNLU19DTFJUQ0tTOwogCQllYy0+dHhfY29hbGVzY2VfdXNlY3NfaXJxID0gREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUzsKIAl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IDA7CisJCWVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPSAwOworCQllYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSAwOworCX0KIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdGczX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaAppbmRleCA5OWM1Zjk2Li43MGFkNDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuaAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtODc5LDMxICs4NzksNDEgQEAKICNkZWZpbmUgIExPV19SWENPTF9USUNLU19DTFJUQ0tTCSAweDAwMDAwMDE0CiAjZGVmaW5lICBERUZBVUxUX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA0OAogI2RlZmluZSAgSElHSF9SWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIE1BWF9SWENPTF9USUNLUwkJIDB4MDAwMDAzZmYKICNkZWZpbmUgSE9TVENDX1RYQ09MX1RJQ0tTCQkweDAwMDAzYzBjCiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1MJCSAweDAwMDAwMDk2CiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1NfQ0xSVENLUwkgMHgwMDAwMDA0OAogI2RlZmluZSAgREVGQVVMVF9UWENPTF9USUNLUwkJIDB4MDAwMDAxMmMKICNkZWZpbmUgIEhJR0hfVFhDT0xfVElDS1MJCSAweDAwMDAwMTQ1CisjZGVmaW5lICBNQVhfVFhDT0xfVElDS1MJCSAweDAwMDAwM2ZmCiAjZGVmaW5lIEhPU1RDQ19SWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTAKICNkZWZpbmUgIExPV19SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA1CiAjZGVmaW5lICBERUZBVUxUX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDgKICNkZWZpbmUgIEhJR0hfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAxMgorI2RlZmluZSAgTUFYX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAogI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKICNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgogI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lICBNQVhfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDBmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzE4CiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9SWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfUlhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzFjCiAjZGVmaW5lICBERUZBVUxUX1RYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfVFhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzIwCiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQorI2RlZmluZSAgTUFYX1JYQ09BTF9NQVhGX0lOVAkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyNAogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIE1BWF9UWENPQUxfTUFYRl9JTlQJCSAweDAwMDAwMGZmCiAjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKICNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisjZGVmaW5lICBNQVhfU1RBVF9DT0FMX1RJQ0tTCQkgMHhkNjkzZDQwMAorI2RlZmluZSAgTUlOX1NUQVRfQ09BTF9USUNLUwkJIDB4MDAwMDAwNjQKIC8qIDB4M2MyYyAtLT4gMHgzYzMwIHVudXNlZCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzMwIC8qIDY0LWJpdCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzOCAvKiA2NC1iaXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uYyBiL2RyaXZlcnMvbmV0L3RsYW4uYwppbmRleCBjZjMxYzA2Li45NDJmYWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5jCkBAIC0xNzEsNiArMTcxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9laXNhLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01NjYsNyArNTY3LDcgQEAKIAogCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bZW50LT5kcml2ZXJfZGF0YV07CiAKLQkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkYpOworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogTm8gc3VpdGFibGUgUENJIG1hcHBpbmcgYXZhaWxhYmxlLlxuIik7CiAJCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCmluZGV4IDBkMWRjZjQuLjQxZTBjZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCkBAIC0yNzYsNyArMjc2LDggQEAKIAlyZXR1cm4gOyAKIH0KICAKLWludCBfX2RldmluaXQgeGxfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpIAorc3RhdGljIGludCBfX2RldmluaXQgeGxfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KSAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IDsgCiAJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaAppbmRleCA4MTM1NGFmLi4wNDAwYzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmgKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5X21pY3JvY29kZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIHN0YXRpYyBpbnQgbWNfc2l6ZSA9IDI0ODgwIDsgCiAKLXU4IG1pY3JvY29kZVtdID0geyAKK3N0YXRpYyBjb25zdCB1OCBtaWNyb2NvZGVbXSA9IHsgCiAgMHhmZSwweDNhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAogLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKICwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jCmluZGV4IGJkNGEyYmMuLjg3MTAzYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jCkBAIC00NjgsMTQgKzQ2OCwzIEBACiBtb2R1bGVfaW5pdChhYnlzc19pbml0KTsKIG1vZHVsZV9leGl0KGFieXNzX3JtbW9kKTsKIAotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBhYnlzcy5jIgotICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBhYnlzcy5jIgotICogIGMtc2V0LXN0eWxlICJLJlIiCi0gKiAgYy1pbmRlbnQtbGV2ZWw6IDgKLSAqICBjLWJhc2ljLW9mZnNldDogOAotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCmluZGV4IDM4NzM5MTcuLmU3YjAwMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogLyogdGhpcyBhbGxvd3MgZGlzcGxheWluZyBmdWxsIGFkYXB0ZXIgaW5mb3JtYXRpb24gKi8KIAotY2hhciAqY2hhbm5lbF9kZWZbXSBfX2RldmluaXRkYXRhID0geyAiSVNBIiwgIk1DQSIsICJJU0EgUCZQIiB9Oworc3RhdGljIGNoYXIgKmNoYW5uZWxfZGVmW10gX19kZXZpbml0ZGF0YSA9IHsgIklTQSIsICJNQ0EiLCAiSVNBIFAmUCIgfTsKIAogc3RhdGljIGNoYXIgcGNjaGFubmVsaWRbXSBfX2RldmluaXRkYXRhID0gewogCTB4MDUsIDB4MDAsIDB4MDQsIDB4MDksCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkweDAzLCAweDA4LCAweDAyLCAweDAwCiB9OwogCi1jaGFyIF9fZGV2aW5pdCAqYWRhcHRlcl9kZWYoY2hhciB0eXBlKQorc3RhdGljIGNoYXIgX19kZXZpbml0ICphZGFwdGVyX2RlZihjaGFyIHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSAweEY6IHJldHVybiAiUEMgQWRhcHRlciB8IFBDIEFkYXB0ZXIgSUkgfCBBZGFwdGVyL0EiOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAKICNkZWZpbmUgVFJDX0lOSVQgMHgwMQkJLyogIFRyYWNlIGluaXRpYWxpemF0aW9uICYgUFJPQkVzICovCiAjZGVmaW5lIFRSQ19JTklUViAweDAyCQkvKiAgdmVyYm9zZSBpbml0IHRyYWNlIHBvaW50cyAgICAgKi8KLXVuc2lnbmVkIGNoYXIgaWJtdHJfZGVidWdfdHJhY2UgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaWJtdHJfZGVidWdfdHJhY2UgPSAwOwogCiBzdGF0aWMgaW50IAlpYm10cl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQJaWJtdHJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOwpAQCAtMTkyLDIwICsxOTIsMjAgQEAKIHN0YXRpYyBpbnQgCXRyZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IAl0b2tfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgCXRva19pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIAkJdG9rX29wZW5fYWRhcHRlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKK3N0YXRpYyB2b2lkCXRva19vcGVuX2FkYXB0ZXIodW5zaWduZWQgbG9uZyBkZXZfYWRkcik7CiBzdGF0aWMgdm9pZCAJb3Blbl9zYXAodW5zaWduZWQgY2hhciB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIAl0b2tfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAJdG9rX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAJdG9rX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogc3RhdGljIHZvaWQgCWluaXRpYWxfdG9rX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIAl0cl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIAl0cl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgCQlpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCp0bXIsc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCp0bXIsc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZAl0b2tfcmVydW4odW5zaWduZWQgbG9uZyBkZXZfYWRkcik7Ci12b2lkIAkJaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCWlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgc3RydWN0IAluZXRfZGV2aWNlX3N0YXRzICp0b2tfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IAkJaWJtdHJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3N0YXRpYyBpbnQJaWJtdHJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKIHN0YXRpYyB2b2lkCWZpbmRfdHVyYm9fYWRhcHRlcnMoaW50ICppb2xpc3QpOwogCiBzdGF0aWMgaW50IGlibXRyX3BvcnRsaXN0W0lCTVRSX01BWF9BREFQVEVSUysxXSBfX2RldmluaXRkYXRhID0gewpAQCAtOTI4LDcgKzkyOCw3IEBACiAjZGVmaW5lIERMQ19NQVhfU0FQX09GU1QgICAgICAgIDMyCiAjZGVmaW5lIERMQ19NQVhfU1RBX09GU1QgICAgICAgIDMzCiAKLXZvaWQgdG9rX29wZW5fYWRhcHRlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKQorc3RhdGljIHZvaWQgdG9rX29wZW5fYWRhcHRlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2FkZHI7CiAJc3RydWN0IHRva19pbmZvICp0aTsKQEAgLTEwOTksNyArMTA5OSw3IEBACiAJcmV0dXJuIHRpLT5zcmFtX3ZpcnQgKyBpbmRleDsKIH0KIAotdm9pZCBkaXJfb3Blbl9hZGFwdGVyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZGlyX29wZW5fYWRhcHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgICAgICAgc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OwogICAgICAgICB1bnNpZ25lZCBjaGFyIHJldF9jb2RlOwpAQCAtMTE3Miw3ICsxMTcyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHRva19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAkvKiAgdW5zaWduZWQgY2hhciBzdGF0dXNfZXZlbiA7ICovCkBAIC0xODQwLDcgKzE4NDAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgaWJtdHJfcmVzZXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRtciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlibXRyX3Jlc2V0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0bXIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdG1yLT5leHBpcmVzID0gamlmZmllcyArIFRSX1JFVFJZX0lOVEVSVkFMOwogCXRtci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CkBAIC0xODcyLDcgKzE4NzIsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0b2tfaW5mbyAqdGk7CiAKQEAgLTE5MDUsNyArMTkwNSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3N0YXRpYyBpbnQgaWJtdHJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KQogewogCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuYwppbmRleCA5OWUwYjAzLi45NzcxMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuYwpAQCAtMTE4LDYgKzExOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC0yNTcsNyArMjU4LDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRlVMTCk7CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gc3VpdGFibGUgUENJIG1hcHBpbmcgYXZhaWxhYmxlLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwpAQCAtNDU0LDggKzQ1NSw3IEBACiAJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSB8IEJDVExfU09GVFJFU0VULCBzdHJlYW1lcl9tbWlvICsgQkNUTCk7CiAJdCA9IGppZmZpZXM7CiAJLyogSG9sZCBzb2Z0IHJlc2V0IGJpdCBmb3IgYSB3aGlsZSAqLwotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChIWik7CisJc3NsZWVwKDEpOwogCQogCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCkgJiB+QkNUTF9TT0ZUUkVTRVQsCiAJICAgICAgIHN0cmVhbWVyX21taW8gKyBCQ1RMKTsKQEAgLTUxMSw4ICs1MTEsNyBAQAogCXdyaXRldyhTSVNSX01JLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLX1NVTSk7CiAKIAl3aGlsZSAoISgocmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpKSAmIFNJU1JfU1JCX1JFUExZKSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CiAJCWlmIChqaWZmaWVzIC0gdCA+IDQwICogSFopIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJJQk0gUENJIHRva2VucmluZyBjYXJkIG5vdCByZXNwb25kaW5nXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCmluZGV4IGNmYWUyYmIuLjY1OWNiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpAQCAtNjI1LDcgKzYyNSw3IEBACiAvKgogICogRGlzYWJsZSB0aGUgYm9hcmQsIGFuZCBwdXQgYmFjayBpbnRvIHBvd2VyLXVwIHN0YXRlLgogICovCi12b2lkIG1hZGdlbWNfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbWFkZ2VtY19jaGlwc2V0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCiAJbWFkZ2VtY19zZXRpbnQoZGV2LCAwKTsKQEAgLTc4NiwxNSArNzg2LDMgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIG1hZGdlbWMuYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgbWFkZ2VtYy5jIgotICogIGMtc2V0LXN0eWxlICJLJlIiCi0gKiAgYy1pbmRlbnQtbGV2ZWw6IDgKLSAqICBjLWJhc2ljLW9mZnNldDogOAotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCmluZGV4IDY3NWIwNjMuLjQwYWQwZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Byb3Rlb24uYwpAQCAtNDE5LDE0ICs0MTksMyBAQAogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHByb3Rlb24uYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgcHJvdGVvbi5jIgotICogIGMtc2V0LXN0eWxlICJLJlIiCi0gKiAgYy1pbmRlbnQtbGV2ZWw6IDgKLSAqICBjLWJhc2ljLW9mZnNldDogOAotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc2tpc2EuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jCmluZGV4IDNmYWI1NGEuLmYyNjc5NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jCkBAIC00MjksMTQgKzQyOSwzIEBACiB9CiAjZW5kaWYgLyogTU9EVUxFICovCiAKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgc2tpc2EuYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgc2tpc2EuYyIKLSAqICBjLXNldC1zdHlsZSAiSyZSIgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCA1YzhhZWFjLi42N2QyYjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtNzcsNyArNzcsNyBAQAogCiAvKiBTTUMgTmFtZSBvZiB0aGUgQWRhcHRlci4gKi8KIHN0YXRpYyBjaGFyIHNtY3RyX25hbWVbXSA9ICJTTUMgVG9rZW5DYXJkIjsKLWNoYXIgKnNtY3RyX21vZGVsID0gIlVua25vd24iOworc3RhdGljIGNoYXIgKnNtY3RyX21vZGVsID0gIlVua25vd24iOwogCiAvKiBVc2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCAyIGZvciBkZWJ1ZywgYW5kCiAgKiAzIGZvciB2ZXJ5IHZlcmJvc2UgZGVidWcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHJfZmlybXdhcmUuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oCmluZGV4IDUzZjJjYmMuLjQ4OTk0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TTUNUUikgfHwgZGVmaW5lZChDT05GSUdfU01DVFJfTU9EVUxFKQogCi11bnNpZ25lZCBjaGFyIHNtY3RyX2NvZGVbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNtY3RyX2NvZGVbXSA9IHsKIAkweDBCQywgMHgwMUQsIDB4MDEyLCAweDAzQiwgMHgwNjMsIDB4MEI0LCAweDBFOSwgMHgwMDAsCiAJMHgwMDAsIDB4MDFGLCAweDAwMCwgMHgwMDEsIDB4MDAxLCAweDAwMCwgMHgwMDIsIDB4MDA1LAogCTB4MDAxLCAweDAwMCwgMHgwMDYsIDB4MDAzLCAweDAwMSwgMHgwMDAsIDB4MDA0LCAweDAwOSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKaW5kZXggZGY0M2I0NC4uNWUwYjBjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKQEAgLTIzNzksNyArMjM3OSw3IEBACiBFWFBPUlRfU1lNQk9MKHRtc2Rldl90ZXJtKTsKIEVYUE9SVF9TWU1CT0wodG1zMzgwdHJfd2FpdCk7CiAKLXN0cnVjdCBtb2R1bGUgKlRNUzM4MF9tb2R1bGUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBtb2R1bGUgKlRNUzM4MF9tb2R1bGUgPSBOVUxMOwogCiBpbnQgaW5pdF9tb2R1bGUodm9pZCkKIHsKQEAgLTIzOTcsMTQgKzIzOTcsMyBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKLSAqICBjLXNldC1zdHlsZSAiSyZSIgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jCmluZGV4IDM3ZGRiNWMuLjJlMThjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zcGNpLmMKQEAgLTI1NCwxNCArMjU0LDMgQEAKIG1vZHVsZV9pbml0KHRtc19wY2lfaW5pdCk7CiBtb2R1bGVfZXhpdCh0bXNfcGNpX3JtbW9kKTsKIAotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyB0bXNwY2kuYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zcGNpLmMiCi0gKiAgYy1zZXQtc3R5bGUgIksmUiIKLSAqICBjLWluZGVudC1sZXZlbDogOAotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwppbmRleCBkZDM1N2RkLi5mYzM1M2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCkBAIC00NDYsMTMgKzQ0NiwxMyBAQAogCiAJCQltYXBwaW5nID0KIAkJCWRlLT5yeF9za2JbcnhfdGFpbF0ubWFwcGluZyA9Ci0JCQkJcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsIGNvcHlfc2tiLT50YWlsLAorCQkJCXBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LCBjb3B5X3NrYi0+ZGF0YSwKIAkJCQkJICAgICAgIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCWRlLT5yeF9za2JbcnhfdGFpbF0uc2tiID0gY29weV9za2I7CiAJCX0gZWxzZSB7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGUtPnBkZXYsIG1hcHBpbmcsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCBSWF9PRkZTRVQpOwotCQkJbWVtY3B5KHNrYl9wdXQoY29weV9za2IsIGxlbiksIHNrYi0+dGFpbCwgbGVuKTsKKwkJCW1lbWNweShza2JfcHV0KGNvcHlfc2tiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CiAKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCQlza2ItPmRldiA9IGRlLT5kZXY7CiAKIAkJZGUtPnJ4X3NrYltpXS5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsCi0JCQlza2ItPnRhaWwsIGRlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2ItPmRhdGEsIGRlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWRlLT5yeF9za2JbaV0uc2tiID0gc2tiOwogCiAJCWRlLT5yeF9yaW5nW2ldLm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggZTI1ZjMzZC4uNzRlOTA3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMzU0LDcgKzM1NSw3IEBACiAJU0VUX01PRFVMRV9PV05FUihkZXYpOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAKLQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IDMyLWJpdCBQQ0kgRE1BIG5vdCBhdmFpbGFibGUuXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0X2ZyZWU7CkBAIC03NDMsMTEgKzc0NCw2IEBACiAKIAlETUZFX0RCVUcoMCwgImRtZmVfaW50ZXJydXB0KCkiLCAwKTsKIAotCWlmICghZGV2KSB7Ci0JCURNRkVfREJVRygxLCAiZG1mZV9pbnRlcnJ1cHQoKSB3aXRob3V0IERFVklDRSBhcmciLCAwKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOwogCiAJLyogR290IERNOTEwWCBzdGF0dXMgKi8KQEAgLTk0OSw4ICs5NDUsOCBAQAogCiAJCQkJLyogUmVjZWl2ZWQgUGFja2V0IENSQyBjaGVjayBuZWVkIG9yIG5vdCAqLwogCQkJCWlmICggKGRiLT5kbTkxMHhfY2hrX21vZGUgJiAxKSAmJgotCQkJCQkoY2FsX0NSQyhza2ItPnRhaWwsIHJ4bGVuLCAxKSAhPQotCQkJCQkoKih1MzIgKikgKHNrYi0+dGFpbCtyeGxlbikgKSkpIHsgLyogRklYTUUgKD8pICovCisJCQkJCShjYWxfQ1JDKHNrYi0+ZGF0YSwgcnhsZW4sIDEpICE9CisJCQkJCSgqKHUzMiAqKSAoc2tiLT5kYXRhK3J4bGVuKSApKSkgeyAvKiBGSVhNRSAoPykgKi8KIAkJCQkJLyogRm91bmQgYSBlcnJvciByZWNlaXZlZCBwYWNrZXQgKi8KIAkJCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKIAkJCQkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDM7CkBAIC05NjMsNyArOTU5LDcgQEAKIAkJCQkJCS8qIHNpemUgbGVzcyB0aGFuIENPUFlfU0laRSwgYWxsb2NhdGUgYSByeGxlbiBTS0IgKi8KIAkJCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogMTZieXRlIGFsaWduICovCi0JCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHJ4bGVuKSwgcnhwdHItPnJ4X3NrYl9wdHItPnRhaWwsIHJ4bGVuKTsKKwkJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcnhsZW4pLCByeHB0ci0+cnhfc2tiX3B0ci0+ZGF0YSwgcnhsZW4pOwogCQkJCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXNrYi0+ZGV2ID0gZGV2OwpAQCAtMTI1Niw3ICsxMjUyLDcgQEAKIAogCWlmICghKHJ4cHRyLT5yZGVzMCAmIGNwdV90b19sZTMyKDB4ODAwMDAwMDApKSkgewogCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsKLQkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPnRhaWwsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKKwkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPmRhdGEsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKIAkJd21iKCk7CiAJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwogCQlkYi0+cnhfYXZhaWxfY250Kys7CkBAIC0xNDY3LDcgKzE0NjMsNyBAQAogCQlpZiAoICggc2tiID0gZGV2X2FsbG9jX3NrYihSWF9BTExPQ19TSVpFKSApID09IE5VTEwgKQogCQkJYnJlYWs7CiAJCXJ4cHRyLT5yeF9za2JfcHRyID0gc2tiOyAvKiBGSVhNRSAoPykgKi8KLQkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPnRhaWwsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKKwkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPmRhdGEsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKIAkJd21iKCk7CiAJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwogCQlyeHB0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CkBAIC0xODA2LDcgKzE4MDIsNyBAQAogCWlmICggKCAoaW50KSBzcm9tWzE4XSAmIDB4ZmYpID09IFNST01fVjQxX0NPREUpIHsKIAkJLyogU1JPTSBWNC4wMSAqLwogCQkvKiBHZXQgTklDIHN1cHBvcnQgbWVkaWEgbW9kZSAqLwotCQlkYi0+TklDX2NhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdXAoc3JvbSArIDM0KTsKKwkJZGItPk5JQ19jYXBhYmlsaXR5ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKilzcm9tICsgMzQvMik7CiAJCWRiLT5QSFlfcmVnNCA9IDA7CiAJCWZvciAodG1wX3JlZyA9IDE7IHRtcF9yZWcgPCAweDEwOyB0bXBfcmVnIDw8PSAxKSB7CiAJCQlzd2l0Y2goIGRiLT5OSUNfY2FwYWJpbGl0eSAmIHRtcF9yZWcgKSB7CkBAIC0xODE4LDcgKzE4MTQsOCBAQAogCQl9CiAKIAkJLyogTWVkaWEgTW9kZSBGb3JjZSBvciBub3QgY2hlY2sgKi8KLQkJZG1mZV9tb2RlID0gbGUzMl90b19jcHVwKHNyb20gKyAzNCkgJiBsZTMyX3RvX2NwdXAoc3JvbSArIDM2KTsKKwkJZG1mZV9tb2RlID0gbGUzMl90b19jcHVwKChfX2xlMzIgKilzcm9tICsgMzQvNCkgJgorCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopc3JvbSArIDM2LzQpOwogCQlzd2l0Y2goZG1mZV9tb2RlKSB7CiAJCWNhc2UgMHg0OiBkbWZlX21lZGlhX21vZGUgPSBETUZFXzEwME1IRjsgYnJlYWs7CS8qIDEwME1IRiAqLwogCQljYXNlIDB4MjogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xME1GRDsgYnJlYWs7CS8qIDEwTUZEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCmluZGV4IGFjNWJmNDkuLmZiZDlhYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCkBAIC02Myw2ICs2MywyMiBAQAogCSAqLwogCXsgMHgxZTAwLCAweDAwMDAsIDB4MDAwYiwgMHg4ZjAxLCAweDAxMDMsIDB4MDMwMCwgMHgwODIxLCAweDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4MDFlMSB9CiAgIH0sCisgIHsiQ29iYWx0IE1pY3Jvc2VydmVyIiwgMCwgMHgxMCwgMHhFMCwgezB4MWUwMCwgLyogMCA9PSBjb250cm9sbGVyICMsIDFlID09IG9mZnNldAkqLworCQkJCQkgMHgwMDAwLCAvKiAwID09IGhpZ2ggb2Zmc2V0LCAwID09IGdhcAkJKi8KKwkJCQkJIDB4MDgwMCwgLyogRGVmYXVsdCBBdXRvc2VsZWN0CQkJKi8KKwkJCQkJIDB4ODAwMSwgLyogMSBsZWFmLCBleHRlbmRlZCB0eXBlLCBib2d1cyBsZW4JKi8KKwkJCQkJIDB4MDAwMywgLyogVHlwZSAzIChNSUkpLCBQSFkgIzAJCSovCisJCQkJCSAweDA0MDAsIC8qIDAgaW5pdCBpbnN0ciwgNCByZXNldCBpbnN0cgkJKi8KKwkJCQkJIDB4MDgwMSwgLyogU2V0IGNvbnRyb2wgbW9kZSwgR1AwIG91dHB1dAkqLworCQkJCQkgMHgwMDAwLCAvKiBEcml2ZSBHUDAgTG93IChSU1QgaXMgYWN0aXZlIGxvdykJKi8KKwkJCQkJIDB4MDgwMCwgLyogY29udHJvbCBtb2RlLCBHUDAgaW5wdXQgKHVuZHJpdmVuKQkqLworCQkJCQkgMHgwMDAwLCAvKiBjbGVhciBjb250cm9sIG1vZGUJCQkqLworCQkJCQkgMHg3ODAwLCAvKiAxMDBUWCBGRFggKyBIRFgsIDEwYlQgRkRYICsgSERYCSovCisJCQkJCSAweDAxZTAsIC8qIEFkdmVydGlzZSBhbGwgYWJvdmUJCQkqLworCQkJCQkgMHg1MDAwLCAvKiBGRFggYWxsIGFib3ZlCQkJKi8KKwkJCQkJIDB4MTgwMCwgLyogU2V0IGZhc3QgVFRNIGluIDEwMGJ0IG1vZGVzCQkqLworCQkJCQkgMHgwMDAwLCAvKiBQSFkgY2Fubm90IGJlIHVucGx1Z2dlZAkJKi8KKyAgfX0sCiAgIHtOVUxMfX07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMgYi9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwppbmRleCBhZmI1Y2RhLi5iYjM1NTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwpAQCAtNzgsNyArNzgsNyBAQAogCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCWJyZWFrOwogCi0JCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwKKwkJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLCBQS1RfQlVGX1NaLAogCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CiAKQEAgLTE5OSwxMiArMTk5LDEyIEBACiAJCQkJCQkJCSAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAogCQkJCQkJCQkgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogI2lmICEgZGVmaW5lZChfX2FscGhhX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuKTsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRwLT5wZGV2LApAQCAtNDIzLDEyICs0MjMsMTIgQEAKIAkJCQkJCQkgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCiAJCQkJCQkJICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKLQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+ZGF0YSwKIAkJCQkJCSBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAjZWxzZQogCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCi0JCQkJICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisJCQkJICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPmRhdGEsCiAJCQkJICAgICAgIHBrdF9sZW4pOwogI2VuZGlmCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRwLT5wZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKaW5kZXggOTE5YzQwYy4uZTI2YzMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCkBAIC00MDAsNiArNDAwLDkgQEAKIAl9CiAKIAl0cC0+Y3NyNiA9IG5ld19jc3I2IHwgKHRwLT5jc3I2ICYgMHhmZGZmKSB8ICh0cC0+ZnVsbF9kdXBsZXggPyAweDAyMDAgOiAwKTsKKworCW1kZWxheSgxKTsKKwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IGUwYWUzZWQuLmQ0NWQ4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTI0Miw2ICsyNDIsNyBAQAogIAl7IDB4MTBiOSwgMHg1MjYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBVTEk1MjZYIH0sCS8qIEFMaSAxNTYzIGludGVncmF0ZWQgZXRoZXJuZXQgKi8KICAJeyAweDEwYjksIDB4NTI2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVUxJNTI2WCB9LAkvKiBBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0ICovCiAJeyAweDEwYjcsIDB4OTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwgLyogM0NvbSAzQ1NPSE8xMDBCLVRYICovCisJeyAweDE0ZWEsIDB4YWIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwgLyogUGxhbmV4IEZOVy0zNjAyLVRYICovCiAJeyB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR1bGlwX3BjaV90YmwpOwpAQCAtNjI0LDcgKzYyNSw3IEBACiAJCXRwLT5yeF9idWZmZXJzW2ldLnNrYiA9IHNrYjsKIAkJaWYgKHNrYiA9PSBOVUxMKQogCQkJYnJlYWs7Ci0JCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT50YWlsLAorCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkJIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXRwLT5yeF9idWZmZXJzW2ldLm1hcHBpbmcgPSBtYXBwaW5nOwogCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCkBAIC0xNTE0LDggKzE1MTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDEyKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29iYWx0IE1BQyBhZGRyZXNzIGluIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCiAgICAgICAgICAgICAgICAgICAgICAgIHNhX29mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lZGlhIHRhYmxlIGVpdGhlciAqLwotICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZmxhZ3MgJj0gfkhBU19NRURJQV9UQUJMRTsKKwkJICAgICAgIC8qIEVuc3VyZSBvdXIgbWVkaWEgdGFibGUgZml4dXAgZ2V0J3MgYXBwbGllZCAqLworCQkgICAgICAgbWVtY3B5KGVlX2RhdGEgKyAxNiwgZWVfZGF0YSwgOCk7CiAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfR1NDCkBAIC0xNzU2LDExICsxNzU3LDE5IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudCAoZGV2KSkgewotCQluZXRpZl9kZXZpY2VfZGV0YWNoIChkZXYpOwotCQl0dWxpcF9kb3duIChkZXYpOwotCQkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KLQl9CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJdHVsaXBfZG93bihkZXYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NjgsMTUgKzE3NzcsMjYgQEAKIHN0YXRpYyBpbnQgdHVsaXBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldHZhbDsKIAotCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiAhbmV0aWZfZGV2aWNlX3ByZXNlbnQgKGRldikpIHsKLSNpZiAxCi0JCXBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKLSNlbmRpZgotCQkvKiBwY2lfcG93ZXJfb24ocGRldik7ICovCi0JCXR1bGlwX3VwIChkZXYpOwotCQluZXRpZl9kZXZpY2VfYXR0YWNoIChkZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR1bGlwX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAidHVsaXA6IHJlcXVlc3RfaXJxIGZhaWxlZCBpbiByZXN1bWVcbiIpOworCQlyZXR1cm4gcmV0dmFsOwogCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXR1bGlwX3VwKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKaW5kZXggY2FmZjJmNS4uNWIxYWYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCkBAIC0xMjEsNiArMTIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtMzk0LDcgKzM5NSw3IEBACiAKIAlpcnEgPSBwZGV2LT5pcnE7CiAKLQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LDB4RkZGRmZmZmYpKSB7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIldpbmJvbmQtODQwOiBEZXZpY2UgJXMgZGlzYWJsZWQgZHVlIHRvIERNQSBsaW1pdGF0aW9ucy5cbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCXJldHVybiAtRUlPOwpAQCAtODQ4LDcgKzg0OSw3IEBACiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCi0JCW5wLT5yeF9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsc2tiLT50YWlsLAorCQlucC0+cnhfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LHNrYi0+ZGF0YSwKIAkJCQkJc2tiLT5sZW4sUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQlucC0+cnhfcmluZ1tpXS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbaV07CkBAIC0xMjY4LDcgKzEyNjksNyBAQAogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldixucC0+cnhfYWRkcltlbnRyeV0sCiAJCQkJCQkJICAgIG5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCiAJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAogCQkJCQkJCSAgICAgICBucC0+cnhfc2tidWZmW2VudHJ5XS0+bGVuLApAQCAtMTMxNCw3ICsxMzE1LDcgQEAKIAkJCQlicmVhazsJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLwogCQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJbnAtPnJ4X2FkZHJbZW50cnldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCi0JCQkJCQkJc2tiLT50YWlsLAorCQkJCQkJCXNrYi0+ZGF0YSwKIAkJCQkJCQlza2ItPmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbZW50cnldOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jCmluZGV4IGI4YTliMzkuLjg4N2Q3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jCkBAIC04OTksNyArODk5LDcgQEAKIAkJCWJyZWFrOwogCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IFJ4MERlc2NPd25lZDsJLyogT3duZWQgYnkgWGlyY29tIGNoaXAgKi8KLQkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyhza2ItPmRhdGEpOwogCX0KIAl0cC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKIApAQCAtMTI5MSw3ICsxMjkxLDcgQEAKIAkJCWlmIChza2IgPT0gTlVMTCkKIAkJCQlicmVhazsKIAkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KLQkJCXRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT50YWlsKTsKKwkJCXRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT5kYXRhKTsKIAkJCXdvcmtfZG9uZSsrOwogCQl9CiAJCXRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBSeDBEZXNjT3duZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDdiZmVlMzYuLmVmZmFiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAogCXBvbGxfd2FpdChmaWxlLCAmdHVuLT5yZWFkX3dhaXQsIHdhaXQpOwogIAotCWlmIChza2JfcXVldWVfbGVuKCZ0dW4tPnJlYWRxKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHVuLT5yZWFkcSkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXJldHVybiBtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCmluZGV4IDhmMzM5MjkuLmVjZmE2ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYworKysgYi9kcml2ZXJzL25ldC90eXBob29uLmMKQEAgLTE2NjEsNyArMTY2MSw3IEBACiAjZW5kaWYKIAogCXNrYi0+ZGV2ID0gdHAtPmRldjsKLQlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPnRhaWwsCisJZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLAogCQkJCSAgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCS8qIFNpbmNlIG5vIGNhcmQgZG9lcyA2NCBiaXQgREFDLCB0aGUgaGlnaCBiaXRzIHdpbGwgbmV2ZXIKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLAogCQkJCQkJICAgIFBLVF9CVUZfU1osCiAJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWV0aF9jb3B5X2FuZF9zdW0obmV3X3NrYiwgc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0obmV3X3NrYiwgc2tiLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsCiAJCQkJCQkgICAgICAgUEtUX0JVRl9TWiwKIAkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTkwNiw5ICsxOTA2LDkgQEAKIAkgKi8KIAluZXRpZl9jYXJyaWVyX29mZih0cC0+ZGV2KTsKIAotCXBjaV9lbmFibGVfd2FrZSh0cC0+cGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDEpOworCXBjaV9lbmFibGVfd2FrZSh0cC0+cGRldiwgc3RhdGUsIDEpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlyZXR1cm4gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgc3RhdGUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yMjc0LDcgKzIyNzQsNyBAQAogCQlnb3RvIG5lZWRfcmVzdW1lOwogCX0KIAotCWlmKHR5cGhvb25fc2xlZXAodHAsIHN0YXRlLCB0cC0+d29sX2V2ZW50cykgPCAwKSB7CisJaWYodHlwaG9vbl9zbGVlcCh0cCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIHRwLT53b2xfZXZlbnRzKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHB1dCBjYXJkIHRvIHNsZWVwXG4iLCBkZXYtPm5hbWUpOwogCQlnb3RvIG5lZWRfcmVzdW1lOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKaW5kZXggN2I1N2Q1NS4uZmM3NzM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTE4Niw2ICsxODYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC01MDYsNyArNTA3LDcgQEAKIHN0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgaW50ICByaGluZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpnZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAKICNkZWZpbmUgUkhJTkVfV0FJVF9GT1IoY29uZGl0aW9uKSBkbyB7CQkJCQlcCiAJaW50IGk9MTAyNDsJCQkJCQkJXApAQCAtNzQwLDcgKzc0MSw3IEBACiAJCWdvdG8gZXJyX291dDsKIAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWQgKi8KLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZik7CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCBieSAiCiAJCSAgICAgICAidGhlIGNhcmQhP1xuIik7CkBAIC05ODksNyArOTkwLDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAKIAkJcnAtPnJ4X3NrYnVmZl9kbWFbaV0gPQotCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+dGFpbCwgcnAtPnJ4X2J1Zl9zeiwKKwkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPmRhdGEsIHJwLT5yeF9idWZfc3osCiAJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJcnAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHJwLT5yeF9za2J1ZmZfZG1hW2ldKTsKQEAgLTEzOTcsNyArMTM5OCw3IEBACiAJd2hpbGUgKHJwLT5kaXJ0eV90eCAhPSBycC0+Y3VyX3R4KSB7CiAJCXR4c3RhdHVzID0gbGUzMl90b19jcHUocnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyk7CiAJCWlmIChkZWJ1ZyA+IDYpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiIFR4IHNjYXZlbmdlICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRyAiVHggc2NhdmVuZ2UgJWQgc3RhdHVzICU4Ljh4LlxuIiwKIAkJCSAgICAgICBlbnRyeSwgdHhzdGF0dXMpOwogCQlpZiAodHhzdGF0dXMgJiBEZXNjT3duKQogCQkJYnJlYWs7CkBAIC0xNDY4LDcgKzE0NjksNyBAQAogCQlpbnQgZGF0YV9zaXplID0gZGVzY19zdGF0dXMgPj4gMTY7CiAKIAkJaWYgKGRlYnVnID4gNCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIgcmhpbmVfcngoKSBzdGF0dXMgaXMgJTguOHguXG4iLAorCQkJcHJpbnRrKEtFUk5fREVCVUcgInJoaW5lX3J4KCkgc3RhdHVzIGlzICU4Ljh4LlxuIiwKIAkJCSAgICAgICBkZXNjX3N0YXR1cyk7CiAJCWlmICgtLWJvZ3VzY250IDwgMCkKIAkJCWJyZWFrOwpAQCAtMTQ4Niw3ICsxNDg3LDcgQEAKIAkJCX0gZWxzZSBpZiAoZGVzY19zdGF0dXMgJiBSeEVycikgewogCQkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLwogCQkJCWlmIChkZWJ1ZyA+IDIpCi0JCQkJCXByaW50ayhLRVJOX0RFQlVHICIgcmhpbmVfcngoKSBSeCAiCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJyaGluZV9yeCgpIFJ4ICIKIAkJCQkJICAgICAgICJlcnJvciB3YXMgJTguOHguXG4iLAogCQkJCQkgICAgICAgZGVzY19zdGF0dXMpOwogCQkJCXJwLT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTE1MTcsNyArMTUxOCw3IEBACiAJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKLQkJCQkJCSBycC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJCSBycC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKIAkJCQkJCSBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJwLT5wZGV2LApAQCAtMTU2MCw3ICsxNTYxLDcgQEAKIAkJCQlicmVhazsJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KIAkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0gPQotCQkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPnRhaWwsCisJCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCiAJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0pOwpAQCAtMTg5NCw5ICsxODk1LDggQEAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCitzdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGdlbmRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CkBAIC0xOTU1LDcgKzE5NTUsNyBAQAogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJwLT5sb2NrLCBmbGFncyk7Ci0JcmhpbmVfc2h1dGRvd24oJnBkZXYtPmRldik7CisJcmhpbmVfc2h1dGRvd24ocGRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnAtPmxvY2ssIGZsYWdzKTsKIAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwpAQCAtMjAwOSw5ICsyMDA5LDcgQEAKIAkuc3VzcGVuZAk9IHJoaW5lX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSByaGluZV9yZXN1bWUsCiAjZW5kaWYgLyogQ09ORklHX1BNICovCi0JLmRyaXZlciA9IHsKLQkJLnNodXRkb3duID0gcmhpbmVfc2h1dGRvd24sCi0JfQorCS5zaHV0ZG93biA9CXJoaW5lX3NodXRkb3duLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCmluZGV4IDE1ZTcxMDIuLmFiYzVjZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC0xMzM1LDcgKzEzMzUsNyBAQAogCQkJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04pCiAJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CiAKLQkJCW1lbWNweShuZXdfc2tiLT5kYXRhLCByeF9za2JbMF0tPnRhaWwsIHBrdF9zaXplKTsKKwkJCW1lbWNweShuZXdfc2tiLT5kYXRhLCByeF9za2JbMF0tPmRhdGEsIHBrdF9zaXplKTsKIAkJCSpyeF9za2IgPSBuZXdfc2tiOwogCQkJcmV0ID0gMDsKIAkJfQpAQCAtMTQ1Niw5ICsxNDU2LDkgQEAKIAkgKglEbyB0aGUgZ3ltbmFzdGljcyB0byBnZXQgdGhlIGJ1ZmZlciBoZWFkIGZvciBkYXRhIGF0CiAJICoJNjRieXRlIGFsaWdubWVudC4KIAkgKi8KLQlza2JfcmVzZXJ2ZShyZF9pbmZvLT5za2IsICh1bnNpZ25lZCBsb25nKSByZF9pbmZvLT5za2ItPnRhaWwgJiA2Myk7CisJc2tiX3Jlc2VydmUocmRfaW5mby0+c2tiLCAodW5zaWduZWQgbG9uZykgcmRfaW5mby0+c2tiLT5kYXRhICYgNjMpOwogCXJkX2luZm8tPnNrYi0+ZGV2ID0gdnB0ci0+ZGV2OwotCXJkX2luZm8tPnNrYl9kbWEgPSBwY2lfbWFwX3NpbmdsZSh2cHRyLT5wZGV2LCByZF9pbmZvLT5za2ItPnRhaWwsIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZF9pbmZvLT5za2JfZG1hID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiLT5kYXRhLCB2cHRyLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCiAJLyoKIAkgKglGaWxsIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hdGNoCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwppbmRleCA3NTc1Yjc5Li4yYzgzY2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTg2MSw4ICs4NjEsNyBAQAogLyoKICAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmYXJzeW5jX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IGZhcnN5bmNfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKQEAgLTk4MSw2ICs5ODAsNyBAQAogCS8qIFdhaXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJd2hpbGUgKG1idmFsID4gTkFLKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKaW5kZXggYzFiNjg5Ni4uNDhjMDNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCkBAIC03Miw3ICs3Miw3IEBACiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgNCk7CiAJY2lzY29faGFyZF9oZWFkZXIoc2tiLCBkZXYsIENJU0NPX0tFRVBBTElWRSwgTlVMTCwgTlVMTCwgMCk7Ci0JZGF0YSA9IChjaXNjb19wYWNrZXQqKXNrYi0+dGFpbDsKKwlkYXRhID0gKGNpc2NvX3BhY2tldCopc2tiLT5kYXRhOwogCiAJZGF0YS0+dHlwZSA9IGh0b25sKHR5cGUpOwogCWRhdGEtPnBhcjEgPSBodG9ubChwYXIxKTsKQEAgLTkxLDggKzkxLDcgQEAKIAogCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaXNjb190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IGNpc2NvX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAloZGxjX2hlYWRlciAqZGF0YSA9IChoZGxjX2hlYWRlciopc2tiLT5kYXRhOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCmluZGV4IDdjZDYxOTUuLmI4MTI2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCkBAIC02Niw4ICs2Niw3IEBACiAKIAogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcHBwX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IHBwcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhdy5jCmluZGV4IGM0MWZiNzAuLjk0NTZkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhdy5jCkBAIC0yNCw4ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGRsYy5oPgogCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByYXdfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgcmF3X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2RsYV9mci5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnIuYwppbmRleCAyZWZjY2IwLi5jNWY1ZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2RsYV9mci5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMKQEAgLTE1Miw2ICsxNTIsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogZm9yIGluYigpLCBvdXRiKCksIGV0Yy4gKi8KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CSAJLyogZm9yIGRvX2dldHRpbWVvZmRheSAqLwkKICNpbmNsdWRlIDxsaW51eC9pbi5oPgkJLyogc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CS8qIHRpbWVfYWZ0ZXIoKSBtYWNybyAqLwogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KQEAgLTc3Myw3ICs3NzQsNyBAQAogICAgICAgIAlmb3IoOzspIHsKIAkJaWYoY2FyZC0+dS5mLnVwZGF0ZV9jb21tc19zdGF0cyA9PSAwKQogCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAoMSAqIEhaKSl7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCArIDEgKiBIWikpewogICAgIAkJCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAwOwogIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CkBAIC00Nzk5LDcgKzQ4MDAsNyBAQAogewogCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKIAl2b2xhdGlsZSBzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOwotCXUzMiB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOwogCWludCByZXNldF9jcml0aWNhbD0wOwogCQpAQCAtNDgyMSw3ICs0ODIyLDcgQEAKIAkJaWYoIShjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVU5DT05GSUcpKQogCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAoMSAqIEhaKSl7CisgICAgICAgICAgICAgCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQgKyAxICogSFopKXsKICAgICAJCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZGVsZXRlIERMQ0kgJWlcbiIsCiAJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5kbGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2Z0MS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKaW5kZXggNWUzMTI0OC4uOWQ2NTI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4JLyogdGltZV9hZnRlcigpIG1hY3JvICovCiAKICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTE2NCw3ICsxNjUsNyBAQAogCiAJCXRpbWVvdXQgPSBqaWZmaWVzOwogCQl3aGlsZSAobWItPnJldHVybl9jb2RlICE9ICdJJykJLyogV2FpdCAxcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZSAqLwotCQkJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAxKkhaKSBicmVhazsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQgKyAxKkhaKSkgYnJlYWs7CiAKIAkJaWYgKG1iLT5yZXR1cm5fY29kZSAhPSAnSScpIHsKIAkJCXByaW50ayhLRVJOX0lORk8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfcHBwLmMKaW5kZXggMTc2MWNiNi4uYTRiNDg5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfcHBwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfcHBwLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkvKiBBUlBIUkRfKiBkZWZpbmVzICovCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCiAjaW5jbHVkZSA8bGludXgvaW4uaD4JCS8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgkvKiB0aW1lX2FmdGVyKCkgbWFjcm8gKi8KIAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ4Miw3ICs0ODMsNyBAQAogCQlpZihwcHBfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPT0gMCl7CiAJCQlicmVhazsKIAkJfQotICAgICAgICAgICAgICAgIGlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gKDEgKiBIWikpeworICAgICAgICAgICAgICAgIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQgKyAxICogSFopKXsKICAgICAJCQlwcHBfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAwOwogIAkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9CiAJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV94MjUuYwppbmRleCAzYTkzZDJmLi44YTk1ZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2RsYV94MjUuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYV94MjUuYwpAQCAtOTEsNiArOTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgkvKiBXQU5QSVBFIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4JLyogdGltZV9hZnRlcigpIG1hY3JvICovCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEV4cGVyaW1lbnRhbCBkZWxheSAqLwpAQCAtODY3LDcgKzg2OCw3IEBACiAJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpKXsJCiAJCQlicmVhazsKIAkJfQotCQlpZiAoKGppZmZpZXMtdGltZW91dCkgPiAxKkhaKXsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCArIDEqSFopKXsKIAkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMgYi9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMKaW5kZXggNmFhNjk4Ny4uODEyYTExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3dhbnBpcGVfbXVsdHBwcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW5waXBlX211bHRwcHAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgkvKiBXQU5QSVBFIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkvKiBBUlBIUkRfKiBkZWZpbmVzICovCisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgkvKiB0aW1lX2FmdGVyKCkgbWFjcm8gKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLwogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4JCkBAIC0yNzAsOSArMjcxLDkgQEAKIAkgICAJcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzLiAgV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGxldGVkIGluIGxlc3MKICAgICAgICAgICAgCXRoYW4gMSBzZWNvbmQuICovCiAKLQkJdGltZW91dCA9IGppZmZpZXM7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOwogCQl3aGlsZSAobWItPnJldHVybl9jb2RlICE9ICdJJykJLyogV2FpdCAxcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZSAqLwotCQkJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAxKkhaKSBicmVhazsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSBicmVhazsKIAogCQlpZiAobWItPnJldHVybl9jb2RlICE9ICdJJykgewogCQkJcHJpbnRrKEtFUk5fSU5GTwpAQCAtNDkzLDExICs0OTQsMTEgQEAKIAljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkID0gVE1SX0lOVF9FTkFCTEVEX1VQREFURTsKICAgCiAJLyogd2FpdCBhIG1heGltdW0gb2YgMSBzZWNvbmQgZm9yIHRoZSBzdGF0aXN0aWNzIHRvIGJlIHVwZGF0ZWQgKi8gCi0gICAgICAgIHRpbWVvdXQgPSBqaWZmaWVzOworICAgICAgICB0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKICAgICAgICAgZm9yKDs7KSB7CiAJCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApCiAJCQlicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAgICAgICAgICAgICBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSl7CiAgICAgCQkJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAwOwogIAkJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0KIAkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FueGwuYyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCmluZGV4IDFlN2I0NzcuLjljMWUxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGRsYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAKQEAgLTYyNCw4ICs2MjUsOCBAQAogCS8qIEZJWE1FIHdoZW4gUENJL0RNQSBzdWJzeXN0ZW1zIGFyZSBmaXhlZC4KIAkgICBXZSBzZXQgYm90aCBkbWFfbWFzayBhbmQgY29uc2lzdGVudF9kbWFfbWFzayBiYWNrIHRvIDMyIGJpdHMKIAkgICB0byBpbmRpY2F0ZSB0aGUgY2FyZCBjYW4gZG8gMzItYml0IERNQSBhZGRyZXNzaW5nICovCi0JaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKSB8fAotCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkYpKSB7CisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykgfHwKKwkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTDogTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2QuYyBiL2RyaXZlcnMvbmV0L3dkLmMKaW5kZXggMWYwNWQ5Yi4uYjAzZmVhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2QuYworKysgYi9kcml2ZXJzL25ldC93ZC5jCkBAIC0xNDksMTIgKzE0OSw3IEBACiAJZXJyID0gZG9fd2RfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMTY0LDYgKzE1OSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB3ZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKIHsKIAlpbnQgaTsKKwlpbnQgZXJyOwogCWludCBjaGVja3N1bSA9IDA7CiAJaW50IGFuY2llbnQgPSAwOwkJCS8qIEFuIG9sZCBjYXJkIHdpdGhvdXQgY29uZmlnIHJlZ2lzdGVycy4gKi8KIAlpbnQgd29yZDE2ID0gMDsJCQkJLyogMCA9IDggYml0LCAxID0gMTYgYml0ICovCkBAIC0zNTYsNyArMzUyLDEwIEBACiAJCW91dGIoaW5iKGlvYWRkcis0KXwweDgwLCBpb2FkZHIrNCk7CiAjZW5kaWYKIAotCXJldHVybiAwOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTUyNywxMSArNTI2LDggQEAKIAkJZGV2LT5tZW1fc3RhcnQgPSBtZW1bdGhpc19kZXZdOwogCQlkZXYtPm1lbV9lbmQgPSBtZW1fZW5kW3RoaXNfZGV2XTsKIAkJaWYgKGRvX3dkX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfd2RbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl93ZFtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIndkLmM6IE5vIHdkODB4MyBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggZDcyZTAzOC4uNDdmM2M1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtOTAwLDcgKzkwMCw3IEBACiAJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CS8vIGQtZGF0YQogfSBhaXJvbmV0X2lvY3RsOwogCi1zdGF0aWMgY2hhciAqc3d2ZXJzaW9uID0gIjIuMSI7CitzdGF0aWMgY2hhciBzd3ZlcnNpb25bXSA9ICIyLjEiOwogI2VuZGlmIC8qIENJU0NPX0VYVCAqLwogCiAjZGVmaW5lIE5VTV9NT0RVTEVTICAgICAgIDIKQEAgLTEyMDksNyArMTIwOSw3IEBACiAJdW5zaWduZWQgY2hhcgkJX19pb21lbSAqcGNpYXV4OwogCXVuc2lnbmVkIGNoYXIJCSpzaGFyZWQ7CiAJZG1hX2FkZHJfdAkJc2hhcmVkX2RtYTsKLQlpbnQJCQlwb3dlcjsKKwlwbV9tZXNzYWdlX3QJCXBvd2VyOwogCVNzaWRSaWQJCQkqU1NJRDsKIAlBUExpc3RSaWQJCSpBUExpc3Q7CiAjZGVmaW5lCVBDSV9TSEFSRURfTEVOCQkyKk1QSV9NQVhfRklEUypQS1RTSVpFK1JJRFNJWkUKQEAgLTIzNzQsNyArMjM3NCw3IEBACiAJLyoKIAkgKiBDbGVhbiBvdXQgdHggcXVldWUKIAkgKi8KLQlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmIHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKSA+IDApIHsKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmICFza2JfcXVldWVfZW1wdHkoJmFpLT50eHEpKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCQlmb3IgKDsoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKTspCiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0zMjg3LDcgKzMyODcsNyBAQAogCQkJCWlmIChzdGF0dXMgJiBFVl9UWEVYQykKIAkJCQkJZ2V0X3R4X2Vycm9yKGFwcml2LCAtMSk7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwcml2LT5hdXhfbG9jaywgZmxhZ3MpOwotCQkJCWlmIChza2JfcXVldWVfbGVuICgmYXByaXYtPnR4cSkpIHsKKwkJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXByaXYtPnR4cSkpIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXByaXYtPmF1eF9sb2NrLGZsYWdzKTsKIAkJCQkJbXBpX3NlbmRfcGFja2V0IChkZXYpOwogCQkJCX0gZWxzZSB7CkBAIC01NDk5LDkgKzU0OTksOSBAQAogCWNtZC5jbWQ9SE9TVFNMRUVQOwogCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CiAKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgc3RhdGUsIDEpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgMSk7CiAJcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgc3RhdGUpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKIH0KIAogc3RhdGljIGludCBhaXJvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC01NTEyLDcgKzU1MTIsNyBAQAogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgYWktPnBvd2VyLCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBhaS0+cG93ZXIpLCAwKTsKIAogCWlmIChhaS0+cG93ZXIgPiAxKSB7CiAJCXJlc2V0X2NhcmQoZGV2LCAwKTsKQEAgLTU1NDEsNyArNTU0MSw3IEBACiAJfQogCXdyaXRlQ29uZmlnUmlkKGFpLCAwKTsKIAllbmFibGVfTUFDKGFpLCAmcnNwLCAwKTsKLQlhaS0+cG93ZXIgPSAwOworCWFpLT5wb3dlciA9IFBNU0dfT047CiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAllbmFibGVfaW50ZXJydXB0cyhhaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKaW5kZXggZmJmNTNhZi4uYmYyNTU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIxMCwxMSArMjA5LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFpcm9fZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01NTksMTMgKzU1MywyNCBAQAogCXJldHVybiAwOwogfSAvKiBhaXJvX2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBhaXJvX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1ZiwgMHgwMDBhKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWYsIDB4MDAwNSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTVmLCAweDAwMDcpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwNSwgMHgwMDA3KSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGFpcm9faWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGFpcm9fZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiYWlyb19jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGFpcm9fYXR0YWNoLAorCS5ldmVudAkJPSBhaXJvX2V2ZW50LAogCS5kZXRhY2gJCT0gYWlyb19kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gYWlyb19pZHMsCiB9OwogCiBzdGF0aWMgaW50IGFpcm9fY3NfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCmluZGV4IGI0ZjRiZDcuLjlkNDk2NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1haXJwb3J0X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorYWlycG9ydF9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjY2LDE2ICsyNjYsMTYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgQXBwbGUgQWlycG9ydCB3aXJlbGVzcyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOwogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIGFpcnBvcnRfbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWlycG9ydF9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAicmFkaW8iLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJe30sCiB9OwogCitNT0RVTEVfREVWSUNFX1RBQkxFIChvZiwgYWlycG9ydF9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGFpcnBvcnRfZHJpdmVyID0gCiB7CiAJLm5hbWUgCQk9IERSSVZFUl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCmluZGV4IDRmMzA0YzZlLi4wZTFhYzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCkBAIC0zMyw4ICszMyw2IEBACiAKICNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKIAotc3RhdGljIGludCBhcmxhbl9lbnRyeV9kZWJ1ZzsKLXN0YXRpYyBpbnQgYXJsYW5fZXhpdF9kZWJ1ZzsKIHN0YXRpYyBpbnQgdGVzdE1lbW9yeSA9IHRlc3RNZW1vcnlVTktOT1dOOwogc3RhdGljIGludCBpcnEgPSBpcnFVTktOT1dOOwogc3RhdGljIGludCB0eFNjcmFtYmxlZCA9IDE7CkBAIC00MywxNSArNDEsMTMgQEAKIG1vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0obWRlYnVnLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHRlc3RNZW1vcnksIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oYXJsYW5fZW50cnlfZGVidWcsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oYXJsYW5fZXhpdF9kZWJ1ZywgaW50LCAwKTsKIG1vZHVsZV9wYXJhbSh0eFNjcmFtYmxlZCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiKHVudXNlZCkiKTsKIE1PRFVMRV9QQVJNX0RFU0ModGVzdE1lbW9yeSwgIih1bnVzZWQpIik7CiBNT0RVTEVfUEFSTV9ERVNDKG1kZWJ1ZywgIkFybGFuIG11bHRpY2FzdCBkZWJ1Z2dpbmcgKDAtMSkiKTsKICNlbmRpZgogCi1tb2R1bGVfcGFyYW0oYXJsYW5fZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGFybGFuX2RlYnVnLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHNwcmVhZGluZ0NvZGUsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0oY2hhbm5lbE51bWJlciwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbShjaGFubmVsU2V0LCBpbnQsIDApOwpAQCAtNjMsMTcgKzU5LDE5IEBACiBtb2R1bGVfcGFyYW0odHhfZGVsYXlfbXMsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0ocmV0cmllcywgaW50LCAwKTsKIG1vZHVsZV9wYXJhbSh0eF9xdWV1ZV9sZW4sIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oYXJsYW5fRUVQUk9NX2JhZCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZGVidWcsICJBcmxhbiBkZWJ1ZyBlbmFibGUgKDAtMSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChFRVBST01fYmFkLCBhcmxhbl9FRVBST01fYmFkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFybGFuIGRlYnVnIGVuYWJsZSAoMC0xKSIpOwogTU9EVUxFX1BBUk1fREVTQyhyZXRyaWVzLCAiQXJsYW4gbWF4aW11bSBwYWNrZXQgcmV0cmFuc21pc2lvbnMiKTsKICNpZmRlZiBBUkxBTl9FTlRSWV9FWElUX0RFQlVHR0lORwotTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBlbnRyeSBkZWJ1Z2dpbmciKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZXhpdF9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBleGl0IGRlYnVnZ2luZyIpOwotTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdCBkZWJ1Z2dpbmciKTsKLSNlbHNlCi1NT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2RlYnVnLCAiKGlnbm9yZWQpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGFybGFuX2V4aXRfZGVidWcsICIoaWdub3JlZCkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsICIoaWdub3JlZCkiKTsKK3N0YXRpYyBpbnQgYXJsYW5fZW50cnlfZGVidWc7CitzdGF0aWMgaW50IGFybGFuX2V4aXRfZGVidWc7CitzdGF0aWMgaW50IGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGVudHJ5X2RlYnVnLCBhcmxhbl9lbnRyeV9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChleGl0X2RlYnVnLCBhcmxhbl9leGl0X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGVudHJ5X2FuZF9leGl0X2RlYnVnLCBhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZW50cnlfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKGV4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZXhpdCBkZWJ1Z2dpbmciKTsKK01PRFVMRV9QQVJNX0RFU0MoZW50cnlfYW5kX2V4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQgZGVidWdnaW5nIik7CiAjZW5kaWYKIAogc3RydWN0IGFybGFuX2NvbmZfc3RydSBhcmxhbl9jb25mW01BWF9BUkxBTlNdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKaW5kZXggYTRlZDI4ZC4uZmYwMzFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjE4LDExICsyMTcsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYXRtZWxfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC02NDYsMTMgKzY0MCwzNiBAQAogfSAvKiBhdG1lbF9ldmVudCAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBhdG1lbF9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDYyMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTAxLCAweDA2OTYpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFiZiwgMHgzMzAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIjExV0FWRSIsICIxMVdQNjExQUwtRSIsIDB4OWViMmRhMWYsIDB4YzlhMGQzZjkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVE1FTCIsICJBVDc2QzUwMkFSIiwgMHhhYmRhNDE2NCwgMHg0MWIzN2UxZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFUTUVMIiwgIkFUNzZDNTA0IiwgMHhhYmRhNDE2NCwgMHg1MDQwNjcwYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFUTUVMIiwgIkFUNzZDNTA0QSIsIDB4YWJkYTQxNjQsIDB4ZTE1ZWQ4N2YpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCVCIsICJWb3lhZ2VyIDEwMjAgTGFwdG9wIEFkYXB0ZXIiLCAweGFlNDliODZhLCAweDFlOTU3Y2Q1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ05ldCIsICJDTldMQyAxMU1icHMgV2lyZWxlc3MgUEMgQ2FyZCBWLTUiLCAweGJjNDc3ZGRlLCAweDUwMmZhZTZiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSUVFRSA4MDIuMTFiIiwgIldpcmVsZXNzIExBTiBQQyBDYXJkIiwgMHg1Yjg3ODcyNCwgMHgxMjJmMWRmNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk9FTSIsICIxMU1icHMgV2lyZWxlc3MgTEFOIFBDIENhcmQgVi0zIiwgMHhmZWE1NGM5MCwgMHgxYzViMGY2OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNNQyIsICIyNjMyVyIsIDB4YzRmOGIxOGIsIDB4MzBmMzg3NzQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUMiLCAiMjYzMlctVjIiLCAweGM0ZjhiMThiLCAweDE3MmQxMzc3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV2lyZWxlc3MiLCAiUEMiLCAweGE0MDdlY2RkLCAweDU1NmU0ZDdlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0xBTiIsICI4MDIuMTFiIFBDIENBUkQiLCAweDU3NWM1MTZjLCAweGIxZjZkYmM0KSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgYXRtZWxfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGF0bWVsX2RyaXZlciA9IHsKLSAgICAgICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0gICAgICAgIC5kcnYgICAgICAgICAgICA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgID0gImF0bWVsX2NzIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImF0bWVsX2NzIiwKICAgICAgICAgfSwKLSAgICAgICAgLmF0dGFjaCAgICAgICAgID0gYXRtZWxfYXR0YWNoLAotICAgICAgICAuZGV0YWNoICAgICAgICAgPSBhdG1lbF9kZXRhY2gsCisJLmF0dGFjaCAgICAgICAgID0gYXRtZWxfYXR0YWNoLAorCS5ldmVudAkJPSBhdG1lbF9ldmVudCwKKwkuZGV0YWNoCQk9IGF0bWVsX2RldGFjaCwKKwkuaWRfdGFibGUJPSBhdG1lbF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IGF0bWVsX2NzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwppbmRleCAzODIyNDFlLi41ZjUwN2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCkBAIC02Miw3ICs2Miw2IEBACiAjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KICNlbmRpZgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC00OTEsMTEgKzQ5MCw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZuZXR3YXZlX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTY2OCwxMyArMTY2MiwyMSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbmV0d2F2ZV9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiWGlyY29tIiwgIkNyZWRpdENhcmQgTmV0d2F2ZSIsIDB4MmUzZWU4NDUsIDB4NTRlMjhhMjgpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgbmV0d2F2ZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbmV0d2F2ZV9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gbmV0d2F2ZV9hdHRhY2gsCisJLmV2ZW50CQk9IG5ldHdhdmVfZXZlbnQsCiAJLmRldGFjaAkJPSBuZXR3YXZlX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBuZXR3YXZlX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbmV0d2F2ZV9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCmluZGV4IGIxMDc4YmFhLi5hYWJjZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCkBAIC00NiwzODIgKzQ2LDkgQEAKICAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuICAqLwogCiAvKgotICogdjAuMDEgLT4gdjAuMDIgLSAyMS8zLzIwMDEgLSBKZWFuIElJCi0gKglvIEFsbG93IHRvIHVzZSByZWd1bGFyIGV0aFggZGV2aWNlIG5hbWUgaW5zdGVhZCBvZiBkbGR3ZFgKLSAqCW8gV2FybmluZyBvbiBJQlNTIHdpdGggRVNTSUQ9YW55IGZvciBmaXJtd2FyZSA2LjA2Ci0gKglvIFB1dCBwcm9wZXIgcmFuZ2UudGhyb3VnaHB1dCB2YWx1ZXMgKG9wdGltaXN0aWMpCi0gKglvIElXU1BZIHN1cHBvcnQgKElPQ1RMIGFuZCBzdGF0IGdhdGhlciBpbiBSeCBwYXRoKQotICoJbyBBbGxvdyBzZXR0aW5nIGZyZXF1ZW5jeSBpbiBBZC1Ib2MgbW9kZQotICoJbyBEaXNhYmxlIFdFUCBzZXR0aW5nIGlmICFoYXNfd2VwIHRvIHdvcmsgb24gb2xkIGZpcm13YXJlCi0gKglvIEZpeCB0eHBvd2VyIHJhbmdlCi0gKglvIFN0YXJ0IGFkZGluZyBzdXBwb3J0IGZvciBTYW1zdW5nL0NvbXBhcSBmaXJtd2FyZQotICoKLSAqIHYwLjAyIC0+IHYwLjAzIC0gMjMvMy8yMDAxIC0gSmVhbiBJSQotICoJbyBTdGFydCBhZGRpbmcgU3ltYm9sIHN1cHBvcnQgLSBuZWVkIHRvIGNoZWNrIGFsbCB0aGF0Ci0gKglvIEZpeCBQcmlzbTIvU3ltYm9sIFdFUCB0byBhY2NlcHQgMTI4IGJpdHMga2V5cwotICoJbyBBZGQgU3ltYm9sIFdFUCAoYWRkIGF1dGhlbnRpY2F0aW9uIHR5cGUpCi0gKglvIEFkZCBQcmlzbTIvU3ltYm9sIHJhdGUKLSAqCW8gQWRkIFBNIHRpbWVvdXQgKGhvbGRvdmVyIGR1cmF0aW9uKQotICoJbyBFbmFibGUgIml3Y29uZmlnIGV0aDAga2V5IG9mZiIgYW5kIGZyaWVuZHMgKHRvZ2dsZSBmbGFncykKLSAqCW8gRW5hYmxlICJpd2NvbmZpZyBldGgwIHBvd2VyIHVuaWNhc3QvYWxsIiAodG9nZ2xlIGZsYWdzKQotICoJbyBUcnkgd2l0aCBhbiBJbnRlbCBjYXJkLiBJdCByZXBvcnQgZmlybXdhcmUgMS4wMSwgYmVoYXZlIGxpa2UKLSAqCSAgYW4gYW50aXF1YXRlZCBmaXJtd2FyZSwgaG93ZXZlciBvbiB3aW5kb3dzIGl0IHNheXMgMi4wMC4gWXVjayAhCi0gKglvIFdvcmthcm91bmQgZmlybXdhcmUgYnVnIGluIGFsbG9jYXRlIGJ1ZmZlciAoSW50ZWwgMS4wMSkKLSAqCW8gRmluaXNoIGV4dGVybmFsIHJlbmFtaW5nIHRvIG9yaW5vY28uLi4KLSAqCW8gVGVzdGluZyB3aXRoIHZhcmlvdXMgV2F2ZWxhbiBmaXJtd2FyZXMKLSAqCi0gKiB2MC4wMyAtPiB2MC4wNCAtIDMwLzMvMjAwMSAtIEplYW4gSUkKLSAqCW8gVXBkYXRlIHRvIFdpcmVsZXNzIDExIC0+IGFkZCByZXRyeSBsaW1pdC9saWZldGltZSBzdXBwb3J0Ci0gKglvIFRlc3RlZCB3aXRoIGEgRC1MaW5rIERXTCA2NTAgY2FyZCwgZmlsbCBpbiBmaXJtd2FyZSBzdXBwb3J0Ci0gKglvIFdhcm5pbmcgb24gVmNjIG1pc21hdGNoIChELUxpbmsgMy4zdiBjYXJkIGluIEx1Y2VudCA1diBvbmx5IHNsb3QpCi0gKglvIEZpeGVkIHRoZSBQcmlzbTIgV0VQIGJ1Z3MgdGhhdCBJIGludHJvZHVjZWQgaW4gdjAuMDMgOi0oCi0gKgkgIEl0IHdvcmtzIG9uIEQtTGluayAqb25seSogYWZ0ZXIgYSB0Y3BkdW1wLiBXZWlyZC4uLgotICoJICBBbmQgc3RpbGwgZG9lc24ndCB3b3JrIG9uIEludGVsIGNhcmQuIEdycnJyLi4uCi0gKglvIFVwZGF0ZSB0aGUgbW9kZSBhZnRlciBhIHNldHBvcnQzCi0gKglvIEFkZCBwcmVhbWJsZSBzZXR0aW5nIGZvciBTeW1ib2wgY2FyZHMgKG5vdCB5ZXQgZW5hYmxlZCkKLSAqCW8gRG9uJ3QgY29tcGxhaW4gYXMgbXVjaCBhYm91dCBTeW1ib2wgY2FyZHMuLi4KLSAqCi0gKiB2MC4wNCAtPiB2MC4wNGIgLSAyMi80LzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqICAgICAgbyBSZW1vdmVkIHRoZSAnZXRoJyBwYXJhbWV0ZXIgLSBhbHdheXMgdXNlIGV0aFhYIGFzIHRoZQotICogICAgICAgIGludGVyZmFjZSBuYW1lIGluc3RlYWQgb2YgZGxkd2RYWC4gIFRoZSBvdGhlciB3YXMgcmFjeQotICogICAgICAgIGFueXdheS4KLSAqCW8gQ2xlYW4gdXAgUklEIGRlZmluaXRpb25zIGluIGhlcm1lcy5oLCBvdGhlciBjbGVhbnVwcwotICoKLSAqIHYwLjA0YiAtPiB2MC4wNGMgLSAyNC80LzIwMDEgLSBKZWFuIElJCi0gKglvIFRpbSBIdXJsZXkgPHRpbXN0ZXIgQVQgc2Vpa2kuYmxpenRlY2guY29tPiByZXBvcnRlZCBhIEQtTGluayBjYXJkCi0gKgkgIHdpdGggdmVuZG9yIDAyIGFuZCBmaXJtd2FyZSAwLjA4LiBBZGRlZCBpbiB0aGUgY2FwYWJpbGl0aWVzLi4uCi0gKglvIFRlc3RlZCBMdWNlbnQgZmlybXdhcmUgNy4yOCwgZXZlcnl0aGluZyB3b3Jrcy4uLgotICoKLSAqIHYwLjA0YyAtPiB2MC4wNSAtIDMvNS8yMDAxIC0gQmVuamFtaW4gSGVycmVuc2NobWlkdAotICoJbyBTcGluLW9mZiBQY21jaWEgY29kZS4gVGhpcyBmaWxlIGlzIHJlbmFtZWQgb3Jpbm9jby5jLAotICoJICBhbmQgb3Jpbm9jb19jcy5jIG5vdyBjb250YWlucyBvbmx5IHRoZSBQY21jaWEgc3BlY2lmaWMgc3R1ZmYKLSAqCW8gQWRkIEFpcnBvcnQgZHJpdmVyIHN1cHBvcnQgb24gdG9wIG9mIG9yaW5vY28uYyAoc2VlIGFpcnBvcnQuYykKLSAqCi0gKiB2MC4wNSAtPiB2MC4wNWEgLSA0LzUvMjAwMSAtIEplYW4gSUkKLSAqCW8gUmV2ZXJ0IHRvIG9sZCBQY21jaWEgY29kZSB0byBmaXggYnJlYWthZ2Ugb2YgQmVuJ3MgY2hhbmdlcy4uLgotICoKLSAqIHYwLjA1YSAtPiB2MC4wNWIgLSA0LzUvMjAwMSAtIEplYW4gSUkKLSAqCW8gYWRkIG1vZHVsZSBwYXJhbWV0ZXIgJ2lnbm9yZV9jaXNfdmNjJyBmb3IgRC1MaW5rIEAgNVYKLSAqCW8gRC1MaW5rIGZpcm13YXJlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNhc3QuIFdlIGp1c3QgcHJpbnQgYSBmZXcKLSAqCSAgZXJyb3IgbWVzc2FnZXMsIGJ1dCBvdGhlcndpc2UgZXZlcnl0aGluZyB3b3Jrcy4uLgotICoJbyBGb3IgRGF2aWQgOiBzZXQvZ2V0cG9ydDMgd29ya3MgZmluZSwganVzdCB1cGdyYWRlIGl3cHJpdi4uLgotICoKLSAqIHYwLjA1YiAtPiB2MC4wNWMgLSA1LzUvMjAwMSAtIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKLSAqCW8gQWRhcHQgYWlycG9ydC5jIHRvIGxhdGVzdCBjaGFuZ2VzIGluIG9yaW5vY28uYwotICoJbyBSZW1vdmUgZGVmZXJyZWQgcG93ZXIgZW5hYmxpbmcgY29kZQotICoKLSAqIHYwLjA1YyAtPiB2MC4wNWQgLSA1LzUvMjAwMSAtIEplYW4gSUkKLSAqCW8gV29ya2Fyb3VuZCB0byBTTkFQIGRlY2Fwc3VsYXRlIGZyYW1lIGZyb20gTGlua3N5cyBBUAotICoJICBvcmlnaW5hbCBwYXRjaCBmcm9tIDogRG9uZyBMaXUgPGRsaXUgQVQgcmVzZWFyY2guYmVsbC1sYWJzLmNvbT4KLSAqCSAgKG5vdGUgOiB0aGUgbWVtY21wIGJ1ZyB3YXMgbWluZSAtIGZpeGVkKQotICoJbyBSZW1vdmUgc2V0X3JldHJ5IHN0dWZmLCBubyBmaXJtd2FyZSBzdXBwb3J0IGl0IChibG9hdC0tKS4KLSAqCi0gKiB2MC4wNWQgLT4gdjAuMDYgLSAyNS81LzIwMDEgLSBKZWFuIElJCi0gKgkJT3JpZ2luYWwgcGF0Y2ggZnJvbSAiSG9uZyBMaW4iIDxhbGluIEFUIHJlZGhhdC5jb20+LAotICoJCSJJYW4gS2lubmVyIiA8aWtpbm5lciBBVCByZWRoYXQuY29tPgotICoJCWFuZCAiRGF2aWQgU21pdGgiIDxkc21pdGggQVQgcmVkaGF0LmNvbT4KLSAqCW8gSW5pdCBvZiBwcml2LT50eF9yYXRlX2N0cmwgaW4gZmlybXdhcmUgc3BlY2lmaWMgc2VjdGlvbi4KLSAqCW8gUHJpc20yL1N5bWJvbCByYXRlLCB1cHRvIHNob3VsZCBiZSAweEYgYW5kIG5vdCAweDE1LiBEb2ggIQotICoJbyBTcGVjdHJ1bSBjYXJkIGFsd2F5cyBuZWVkIGNvcl9yZXNldCAoZm9yIGV2ZXJ5IHJlc2V0KQotICoJbyBGaXggY29yX3Jlc2V0IHRvIG5vdCBsb3NlIGJpdCA3IGluIHRoZSByZWdpc3RlcgotICoJbyBmbHVzaF9zdGFsZV9saW5rcyB0byByZW1vdmUgem9tYmllIFBjbWNpYSBpbnN0YW5jZXMKLSAqCW8gQWNrIHByZXZpb3VzIGhlcm1lcyBldmVudCBiZWZvcmUgcmVzZXQKLSAqCQlNZSAod2l0aCBteSBsaXR0bGUgaGFuZHMpCi0gKglvIEFsbG93IG9yaW5vY28uYyB0byBjYWxsIGNvcl9yZXNldCB2aWEgcHJpdi0+Y2FyZF9yZXNldF9oYW5kbGVyCi0gKglvIEFkZCBwcml2LT5uZWVkX2NhcmRfcmVzZXQgdG8gdG9nZ2xlIHRoaXMgZmVhdHVyZQotICoJbyBGaXggdmFyaW91cyBidWdsZXRzIHdoZW4gc2V0dGluZyBXRVAgaW4gU3ltYm9sIGZpcm13YXJlCi0gKgkgIE5vdywgZW5jcnlwdGlvbiBpcyBmdWxseSBmdW5jdGlvbmFsIG9uIFN5bWJvbCBjYXJkcy4gWW91cGkgIQotICoKLSAqIHYwLjA2IC0+IHYwLjA2YiAtIDI1LzUvMjAwMSAtIEplYW4gSUkKLSAqCW8gSUJTUyBvbiBTeW1ib2wgdXNlIHBvcnRfbW9kZSA9IDQuIFBsZWFzZSBkb24ndCBhc2suLi4KLSAqCi0gKiB2MC4wNmIgLT4gdjAuMDZjIC0gMjkvNS8yMDAxIC0gSmVhbiBJSQotICoJbyBTaG93IGZpcnN0IHNweSBhZGRyZXNzIGluIC9wcm9jL25ldC93aXJlbGVzcyBmb3IgSUJTUyBtb2RlIGFzIHdlbGwKLSAqCi0gKiB2MC4wNmMgLT4gdjAuMDZkIC0gNi83LzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqICAgICAgbyBDaGFuZ2UgYSBidW5jaCBvZiBLRVJOX0lORk8gbWVzc2FnZXMgdG8gS0VSTl9ERUJVRywgYXMgcGVyIExpbnVzJwotICogICAgICAgIHdpc2hlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KLSAqCW8gUmVtb3ZlZCBib2d1cyBtZXNzYWdlIG9uIENSQyBlcnJvci4KLSAqCW8gTWVyZ2VkIGZpeGVzIGZvciB2MC4wOCBQcmlzbSAyIGZpcm13YXJlIGZyb20gV2lsbGlhbSBXYWdob3JuCi0gKgkgIDx3aWxsd2FnaG9ybiBBVCB5YWhvby5jby51az4KLSAqCW8gU2xpZ2h0IGNsZWFudXAvcmUtYXJyYW5nZW1lbnQgb2YgZmlybXdhcmUgZGV0ZWN0aW9uIGNvZGUuCi0gKgotICogdjAuMDZkIC0+IHYwLjA2ZSAtIDEvOC8yMDAxIC0gRGF2aWQgR2lic29uCi0gKglvIFJlbW92ZWQgc29tZSByZWR1bmRhbnQgZ2xvYmFsIGluaXRpYWxpemVycyAob3Jpbm9jb19jcy5jKS4KLSAqCW8gQWRkZWQgc29tZSBtb2R1bGUgbWV0YWRhdGEKLSAqCi0gKiB2MC4wNmUgLT4gdjAuMDZmIC0gMTQvOC8yMDAxIC0gRGF2aWQgR2lic29uCi0gKglvIFdvcmRpbmcgZml4IHRvIGxpY2Vuc2UKLSAqCW8gQWRkZWQgYSAndXNlX2FsdGVybmF0ZV9lbmNhcHMnIG1vZHVsZSBwYXJhbWV0ZXIgZm9yIEFQcyB3aGljaCBuZWVkIGFuCi0gKgkgIG91aSBvZiAwMDowMDowMC4gIFdlIHJlYWxseSBuZWVkIGEgYmV0dGVyIHdheSBvZiBoYW5kbGluZyB0aGlzLCBidXQKLSAqCSAgdGhlIG1vZHVsZSBmbGFnIGlzIGJldHRlciB0aGFuIG5vdGhpbmcgZm9yIG5vdy4KLSAqCi0gKiB2MC4wNmYgLT4gdjAuMDcgLSAyMC84LzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqCW8gUmVtb3ZlZCBCQVAgZXJyb3IgcmV0cmllcyBmcm9tIGhlcm1lc19iYXBfc2VlaygpLiAgRm9yIFR4IHdlIG5vdwotICoJICBsZXQgdGhlIHVwcGVyIGxheWVycyBoYW5kbGUgdGhlIHJldHJ5LCB3ZSByZXRyeSBleHBsaWNpdGx5IGluIHRoZQotICoJICBSeCBwYXRoLCBidXQgZG9uJ3QgbWFrZSBhcyBtdWNoIG5vaXNlIGFib3V0IGl0LgotICoJbyBGaXJtd2FyZSBkZXRlY3Rpb24gY2xlYW51cHMuCi0gKgotICogdjAuMDcgLT4gdjAuMDdhIC0gMS8xMC8zMDAxIC0gSmVhbiBJSQotICoJbyBBZGQgY29kZSB0byByZWFkIFN5bWJvbCBmaXJtd2FyZSByZXZpc2lvbiwgaW5zcGlyZWQgYnkgbGF0ZXN0IGNvZGUKLSAqCSAgaW4gU3BlY3RydW0yNCBieSBMZWUgSm9obiBLZXlzZXItQWxsZW4gLSBUaGFua3MgTGVlICEKLSAqCW8gVGhhbmtzIHRvIEphcmVkIFZhbGVudGluZSA8aGlkZGVuIEFUIHhtaXNzaW9uLmNvbT4gZm9yICJwcm92aWRpbmciIG1lCi0gKgkgIGEgM0NvbSBjYXJkIHdpdGggYSByZWNlbnQgZmlybXdhcmUsIGZpbGwgb3V0IFN5bWJvbCBmaXJtd2FyZQotICoJICBjYXBhYmlsaXRpZXMgb2YgbGF0ZXN0IHJldiAoMi4yMCksIGFzIHdlbGwgYXMgb2xkZXIgU3ltYm9sIGNhcmRzLgotICoJbyBEaXNhYmxlIFBvd2VyIE1hbmFnZW1lbnQgaW4gbmV3ZXIgU3ltYm9sIGZpcm13YXJlLCB0aGUgQVBJIAotICoJICBoYXMgY2hhbmdlZCAoZG9jdW1lbnRhdGlvbiBuZWVkZWQpLgotICoKLSAqIHYwLjA3YSAtPiB2MC4wOCAtIDMvMTAvMjAwMSAtIERhdmlkIEdpYnNvbgotICoJbyBGaXhlZCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVycnVuIGZvdW5kIGJ5IHRoZSBTdGFuZm9yZCBjaGVja2VyIChpbgotICoJICBkbGR3ZF9pb2N0bF9zZXRpd2VuY29kZSgpKS4gIENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFueXdheSwgc28gbm90Ci0gKgkgIGEgYmlnIHByb2JsZW0uCi0gKglvIFR1cm5lZCBoYXNfYmlnX3dlcCBvbiBmb3IgSW50ZXJzaWwgY2FyZHMuICBUaGF0J3Mgbm90IHRydWUgZm9yIGFsbCBvZgotICoJICB0aGVtIGJ1dCB3ZSBzaG91bGQgYXQgbGVhc3QgbGV0IHRoZSBjYXBhYmxlIG9uZXMgdHJ5LgotICoJbyBXYWl0IGZvciBCVVNZIHRvIGNsZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgaGVybWVzX2JhcF9zZWVrKCkuICBJCi0gKgkgIHJlYWxpemVkIHRoYXQgbXkgYXNzdW1wdGlvbiB0aGF0IHRoZSBkcml2ZXIncyBzZXJpYWxpemF0aW9uCi0gKgkgIHdvdWxkIHByZXZlbnQgdGhlIEJBUCBiZWluZyBidXN5IG9uIGVudHJ5IHdhcyBwb3NzaWJseSBmYWxzZSwgYmVjYXVzZQotICoJICB0aGluZ3Mgb3RoZXIgdGhhbiBzZWVrcyBtYXkgbWFrZSB0aGUgQkFQIGJ1c3kuCi0gKglvIFVzZSAiYWx0ZXJuYXRlIiAob3VpIDAwOjAwOjAwKSBlbmNhcHN1bGF0aW9uIGJ5IGRlZmF1bHQuCi0gKgkgIFNldHRpbmcgdXNlX29sZF9lbmNhcHMgd2lsbCBtaW1pYyB0aGUgb2xkIGJlaGF2aW91ciwgYnV0IEkgdGhpbmsgd2UKLSAqCSAgd2lsbCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzLgotICoJbyBEb24ndCB0cnkgdG8gbWFrZSBfX2luaXRkYXRhIGNvbnN0ICh0aGUgdmVyc2lvbiBzdHJpbmcpLiAgVGhpcyBjYW4ndAotICoJICB3b3JrIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgX19pbml0ZGF0YSBzZWN0aW9uaW5nIHdvcmtzLgotICoJbyBBZGRlZCBNT0RVTEVfTElDRU5TRSB0YWdzLgotICoJbyBTdXBwb3J0IGZvciBQTFggKHRyYW5zcGFyZW50IFBDTUNJQS0+UENJIGJyaWRnZSkgY2FyZHMuCi0gKglvIENoYW5nZWQgdG8gdXNpbmcgdGhlIG5ldyB0eXBlLWZhc2Npc3QgbWluL21heC4KLSAqCi0gKiB2MC4wOCAtPiB2MC4wOGEgLSA5LzEwLzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqCW8gSW5zZXJ0ZWQgc29tZSBtaXNzaW5nIGFja25vd2xlZGdlbWVudHMvaW5mbyBpbnRvIHRoZSBDaGFuZ2Vsb2cuCi0gKglvIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgbm9ybWFsaXphdGlvbiBvZiBzaWduYWwgbGV2ZWwgcmVwb3J0aW5nLgotICoJbyBGaXhlZCBiYWQgYnVnIGluIFdFUCBrZXkgaGFuZGxpbmcgb24gSW50ZXJzaWwgYW5kIFN5bWJvbCBmaXJtd2FyZSwKLSAqCSAgd2hpY2ggbGVkIHRvIGFuIGluc3RhbnQgY3Jhc2ggb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KLSAqCi0gKiB2MC4wOGEgLT4gdjAuMDhiIC0gMjAvMTEvMjAwMSAtIERhdmlkIEdpYnNvbgotICoJbyBMb3RzIG9mIGNsZWFudXAgYW5kIGJ1Z2ZpeGVzIGluIG9yaW5vY29fcGx4LmMKLSAqCW8gQ2xlYW51cCB0byBoYW5kbGluZyBvZiBUeCByYXRlIHNldHRpbmcuCi0gKglvIFJlbW92ZWQgc3VwcG9ydCBmb3Igb2xkIGVuY2Fwc3VsYXRpb24gbWV0aG9kLgotICoJbyBSZW1vdmVkIG9sZCAiZGxkd2QiIG5hbWVzLgotICoJbyBTcGxpdCBSSUQgY29uc3RhbnRzIGludG8gYSBuZXcgZmlsZSBoZXJtZXNfcmlkLmgKLSAqCW8gUmVuYW1lZCBSSUQgY29uc3RhbnRzIHRvIG1hdGNoIGxpbnV4LXdsYW4tbmcgYW5kIHByaXNtMi5vCi0gKglvIEJ1Z2ZpeGVzIGluIGhlcm1lcy5jCi0gKglvIFBva2UgdGhlIFBMWCdzIElOVENTUiByZWdpc3Rlciwgc28gaXQgYWN0dWFsbHkgc3RhcnRzCi0gKgkgIGdlbmVyYXRpbmcgaW50ZXJydXB0cy4gIFRoZXNlIGNhcmRzIG1pZ2h0IGFjdHVhbGx5IHdvcmsgbm93LgotICoJbyBVcGRhdGUgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyB2MTIgKEplYW4gSUkpCi0gKglvIFN1cHBvcnQgZm9yIHRhbGxpZXMgYW5kIGlucXVpcmUgY29tbWFuZCAoSmVhbiBJSSkKLSAqCW8gQWlycG9ydCB1cGRhdGVzIGZvciBuZXdlciBQUEMga2VybmVscyAoQmVuSCkKLSAqCi0gKiB2MC4wOGIgLT4gdjAuMDkgLSAyMS8xMi8yMDAxIC0gRGF2aWQgR2lic29uCi0gKglvIFNvbWUgbmV3IFBDSSBJRHMgZm9yIFBMWCBjYXJkcy4KLSAqCW8gUmVtb3ZlZCBicm9rZW4gYXR0ZW1wdCB0byBkbyBBTExNVUxUSSByZWNlcHRpb24uICBKdXN0IHVzZQotICoJICBwcm9taXNjdW91cyBtb2RlIGluc3RlYWQKLSAqCW8gUHJlbGltaW5hcnkgd29yayBmb3IgbGlzdC1BUCAoSmVhbiBJSSkKLSAqCW8gQWlycG9ydCB1cGRhdGVzIGZyb20gKEJlbkgpCi0gKglvIEVsaW1pbmF0ZWQgcmFjeSBod19yZWFkeSBzdHVmZgotICoJbyBGaXhlZCBnZW5lcmF0aW9uIG9mIGZha2UgZXZlbnRzIGluIGlycSBoYW5kbGVyLiAgVGhpcyBzaG91bGQKLSAqCSAgZmluYWxseSBraWxsIHRoZSBFSU8gcHJvYmxlbXMgKEplYW4gSUkgJiBkZ2lic29uKQotICoJbyBGaXhlZCBicmVha2FnZSBvZiBiaXRyYXRlIHNldC9nZXQgb24gQWdlcmUgZmlybXdhcmUgKEplYW4gSUkpCi0gKgotICogdjAuMDkgLT4gdjAuMDlhIC0gMi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gRml4ZWQgc3R1cGlkIG1pc3Rha2UgaW4gbXVsdGljYXN0IGxpc3QgaGFuZGxpbmcsIHRyaWdnZXJpbmcKLSAqCSAgYSBCVUcoKQotICoKLSAqIHYwLjA5YSAtPiB2MC4wOWIgLSAxNi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gRml4ZWQgZXZlbiBzdHVwaWRlciBtaXN0YWtlIGluIG5ldyBpbnRlcnJ1cHQgaGFuZGxpbmcsIHdoaWNoCi0gKgkgIHNlcmlvdXNseSBicm9rZSB0aGluZ3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KLSAqCW8gUmVtb3ZlZCBhIGJ1bmNoIG9mIHJlZHVuZGFudCBpbmNsdWRlcyBhbmQgZXhwb3J0cy4KLSAqCW8gUmVtb3ZlZCBhIHJlZHVuZGFudCBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCBwYWlyIGluIGFpcnBvcnQuYwotICoJbyBEb24ndCBhdHRlbXB0IHRvIGRvIGhhcmR3YXJlIGxldmVsIG11bHRpY2FzdCByZWNlcHRpb24gb24KLSAqCSAgSW50ZXJzaWwgZmlybXdhcmUsIGp1c3QgZ28gcHJvbWlzYyBpbnN0ZWFkLgotICoJbyBUeXBvIGZpeGVkIGluIGhlcm1lc19pc3N1ZV9jbWQoKQotICoJbyBFbGltaW5hdGVkIFdJUkVMRVNTX1NQWSAjaWZkZWZzCi0gKglvIFN0YXR1cyBjb2RlIHJlcG9ydGVkIG9uIFR4IGV4Y2VwdGlvbnMKLSAqCW8gTW92ZWQgbmV0aWZfd2FrZV9xdWV1ZSgpIGZyb20gQUxMT0MgaW50ZXJydXB0cyB0byBUWCBhbmQgVFhFWEMKLSAqCSAgaW50ZXJydXB0cywgd2hpY2ggc2hvdWxkIGZpeCB0aGUgdGltZW91dHMgd2UncmUgc2VlaW5nLgotICoKLSAqIHYwLjA5YiAtPiB2MC4xMCAtIDI1IEZlYiAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIFJlbW92ZWQgbmVzdGVkIHN0cnVjdHVyZXMgdXNlZCBmb3IgaGVhZGVyIHBhcnNpbmcsIHNvIHRoZQotICoJICBkcml2ZXIgc2hvdWxkIG5vdyB3b3JrIHdpdGhvdXQgaGFja2VyeSBvbiBBUk0KLSAqCW8gRml4IGZvciBXRVAgaGFuZGxpbmcgb24gSW50ZXJzaWwgKEhhd2sgTmV3dG9uKQotICoJbyBFbGltaW5hdGVkIHRoZSAvcHJvYy9oZXJtZXMvZXRoWFgvcmVncyBkZWJ1Z2dpbmcgZmlsZS4gIEl0Ci0gKgkgIHdhcyBuZXZlciB2ZXJ5IHVzZWZ1bC4KLSAqCW8gTWFrZSBSeCBlcnJvcnMgbGVzcyBub2lzeS4KLSAqCi0gKiB2MC4xMCAtPiB2MC4xMSAtIDUgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gTGFpZCB0aGUgZ3JvdW5kd29yayBpbiBoZXJtZXMuW2NoXSBmb3IgZGV2aWNlcyB3aGljaCBtYXAKLSAqCSAgaW50byBQQ0kgbWVtb3J5IHNwYWNlIHJhdGhlciB0aGFuIElPIHNwYWNlLgotICoJbyBGaXhlZCBidWcgaW4gbXVsdGljYXN0IGhhbmRsaW5nIChjbGVhcmVkIG11bHRpY2FzdCBsaXN0IHdoZW4KLSAqCSAgbGVhdmluZyBwcm9taXNjdW91cyBtb2RlKS4KLSAqCW8gUmVsZWdhdGVkIFR4IGVycm9yIG1lc3NhZ2VzIHRvIGRlYnVnLgotICoJbyBDbGVhbmVkIHVwIC8gY29ycmVjdGVkIGhhbmRsaW5nIG9mIGFsbG9jYXRpb24gbGVuZ3Rocy4KLSAqCW8gU2V0IE9XTlNTSUQgaW4gSUJTUyBtb2RlIGZvciBXaW5YUCBpbnRlcm9wZXJhYmlsaXR5IChqaW1jKS4KLSAqCW8gQ2hhbmdlIHRvIHVzaW5nIGFsbG9jX2V0aGVyZGV2KCkgZm9yIHN0cnVjdHVyZSBhbGxvY2F0aW9ucy4gCi0gKglvIENoZWNrIGZvciBhbmQgZHJvcCB1bmRlcnNpemVkIHBhY2tldHMuCi0gKglvIEZpeGVkIGEgcmFjZSBpbiBzdG9wcGluZy93YWtpbmcgdGhlIHF1ZXVlLiAgVGhpcyBzaG91bGQgZml4Ci0gKgkgIHRoZSB0aW1lb3V0IHByb2JsZW1zIChQYXZlbCBSb3NraW4pCi0gKglvIFJldmVydGVkIHRvIG5ldGlmX3dha2VfcXVldWUoKSBvbiB0aGUgQUxMT0MgZXZlbnQuCi0gKglvIEZpeGVzIGZvciByZWNlbnQgU3ltYm9sIGZpcm13YXJlcyB3aGljaCBsYWNrIEFQIGRlbnNpdHkKLSAqCSAgKFBhdmVsIFJvc2tpbikuCi0gKgotICogdjAuMTEgLT4gdjAuMTFhIC0gMjkgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gSGFuZGxlIGRpZmZlcmVudCByZWdpc3RlciBzcGFjaW5nLCBuZWNlc3NhcnkgZm9yIFByaXNtIDIuNQotICoJICBQQ0kgYWRhcHRvcnMgKFN0ZXZlIEhpbGwpLgotICoJbyBDbGVhbmVkIHVwIGluaXRpYWxpemF0aW9uIG9mIGNhcmQgc3RydWN0dXJlcyBpbiBvcmlub2NvX2NzCi0gKgkgIGFuZCBhaXJwb3J0LiAgUmVtb3ZlZCBjYXJkLT5wcml2IGZpZWxkLgotICoJbyBNYWtlIHJlc3BvbnNlIHN0cnVjdHVyZSBvcHRpb25hbCBmb3IgaGVybWVzX2RvY21kX3dhaXQoKQotICoJICBQYXZlbCBSb3NraW4pCi0gKglvIEFkZGVkIFBDSSBpZCBmb3IgTm9ydGVsIGVtb2JpbGl0eSB0byBvcmlub2NvX3BseC5jLgotICoJbyBDbGVhbnVwIHRvIGhhbmRsaW5nIG9mIFN5bWJvbCdzIGFsbG9jYXRpb24gYnVnLiAoUGF2ZWwgUm9za2luKQotICoJbyBDbGVhbnVwcyB0byBmaXJtd2FyZSBjYXBhYmlsaXR5IGRldGVjdGlvbi4KLSAqCW8gQXJyYW5nZSBmb3Igb3Jpbm9jb19wY2kuYyB0byBvdmVycmlkZSBmaXJtd2FyZSBkZXRlY3Rpb24uCi0gKgkgIFdlIHNob3VsZCBiZSBhYmxlIHRvIHN1cHBvcnQgdGhlIFBDSSBJbnRlcnNpbCBjYXJkcyBub3cuCi0gKglvIENsZWFudXAgaGFuZGxpbmcgb2YgcmVzZXRfY29yIGFuZCBoYXJkX3Jlc2V0IChQYXZlbCBSb3NraW4pLgotICoJbyBSZW1vdmUgZXJyb25lb3VzIHVzZSBvZiBVU0VSX0JBUCBpbiB0aGUgVHhFeGMgaGFuZGxlciAoSm91bmkKLSAqCSAgTWFsaW5lbikuCi0gKglvIE1ha2VmaWxlIGNoYW5nZXMgZm9yIGJldHRlciBpbnRlZ3JhdGlvbiBpbnRvIERhdmlkIEhpbmRzCi0gKgkgIHBjbWNpYS1jcyBwYWNrYWdlLgotICoKLSAqIHYwLjExYSAtPiB2MC4xMWIgLSAxIE1heSAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gb3Jpbm9jb19wbHhfaW5pdF9vbmUoKQotICoJbyBGaXhlZCBtdWx0aXBsZSBiYWQga2ZyZWUoKSBidWdzIGludHJvZHVjZWQgYnkgdGhlCi0gKgkgIGFsbG9jX29yaW5vY29kZXYoKSBjaGFuZ2VzLgotICoKLSAqIHYwLjExYiAtPiB2MC4xMiAtIDE5IEp1biAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIFN1cHBvcnQgY2hhbmdpbmcgdGhlIE1BQyBhZGRyZXNzLgotICoJbyBDb3JyZWN0IGRpc3BsYXkgb2YgSW50ZXJzaWwgZmlybXdhcmUgcmV2aXNpb24gbnVtYmVycy4KLSAqCW8gRW50aXJlbHkgcmV2aXNlZCBsb2NraW5nIHNjaGVtZS4gIFNob3VsZCBiZSBib3RoIHNpbXBsZXIgYW5kCi0gKgkgICBiZXR0ZXIuCi0gKglvIE1lcmdlZCBzb21lIGNvbW1vbiBjb2RlIGluIG9yaW5vY29fcGx4LCBvcmlub2NvX3BjaSBhbmQKLSAqCSAgYWlycG9ydCBieSBjcmVhdGluZyBvcmlub2NvX2RlZmF1bHRfe29wZW4sc3RvcCxyZXNldH0oKQotICoJICB3aGljaCBhcmUgdXNlZCBhcyB0aGUgZGV2LT5vcGVuLCBkZXYtPnN0b3AsIHByaXYtPnJlc2V0Ci0gKgkgIGNhbGxiYWNrcyBpZiBub25lIGFyZSBzcGVjaWZpZWQgd2hlbiBhbGxvY19vcmlub2NvZGV2KCkgaXMKLSAqCSAgY2FsbGVkLgotICoJbyBSZW1vdmVkIG9yaW5vY29fcGx4X2ludGVycnVwdCgpIGFuZCBvcmlub2NvX3BjaV9pbnRlcnJ1cHQoKS4KLSAqCSAgVGhleSBkaWRuJ3QgZG8gYW55dGhpbmcuCi0gKgotICogdjAuMTIgLT4gdjAuMTJhIC0gNCBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBTb21lIHJlYXJyYW5nZW1lbnQgb2YgY29kZS4KLSAqCW8gTnVtZXJvdXMgZml4dXBzIHRvIGxvY2tpbmcgYW5kIHJlc3QgaGFuZGxpbmcsIHBhcnRpY3VsYXJseQotICoJICBmb3IgUENNQ0lBLgotICoJbyBUaGlzIGFsbG93cyBvcGVuIGFuZCBzdG9wIG5ldF9kZXZpY2UgbWV0aG9kcyB0byBiZSBpbgotICoJICBvcmlub2NvLmMgbm93LCByYXRoZXIgdGhhbiBpbiB0aGUgaW5pdCBtb2R1bGVzLgotICoJbyBJbiBvcmlub2NvX2NzLmMgbGluay0+cHJpdiBub3cgcG9pbnRzIHRvIHRoZSBzdHJ1Y3QKLSAqCSAgbmV0X2RldmljZSBub3QgdG8gdGhlIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUuCi0gKglvIEFkZGVkIGEgY2hlY2sgZm9yIHVuZGVyc2l6ZWQgU05BUCBmcmFtZXMsIHdoaWNoIGNvdWxkIGNhdXNlCi0gKgkgIGNyYXNoZXMuCi0gKgotICogdjAuMTJhIC0+IHYwLjEyYiAtIDExIEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIEZpeCBody0+bnVtX2luaXQgdGVzdGluZyBjb2RlLCBzbyBudW1faW5pdCBpcyBhY3R1YWxseQotICoJICBpbmNyZW1lbnRlZC4KLSAqCW8gRml4IHZlcnkgc3R1cGlkIGJ1ZyBpbiBvcmlub2NvX2NzIHdoaWNoIGJyb2tlIGNvbXBpbGUgd2l0aAotICoJICBDT05GSUdfU01QLgotICoJbyBTcXVhc2hlZCBhIHdhcm5pbmcuCi0gKgotICogdjAuMTJiIC0+IHYwLjEyYyAtIDI2IEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIENoYW5nZSB0byBDOVggc3R5bGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMuCi0gKglvIEFkZCBzdXBwb3J0IGZvciAzQ29tIEFpckNvbm5lY3QgUENJLgotICoJbyBObyBsb25nZXIgaWdub3JlIHRoZSBoYXJkX3Jlc2V0IGFyZ3VtZW50IHRvCi0gKgkgIGFsbG9jX29yaW5vY29kZXYoKS4gIE9vcHMuCi0gKgotICogdjAuMTJjIC0+IHYwLjEzYmV0YTEgLSAxMyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBSZXZlcnQgdGhlIGJyb2tlbiAwLjEyKiBsb2NraW5nIHNjaGVtZSBhbmQgZ28gdG8gYSBuZXcgeWV0Ci0gKgkgIHNpbXBsZXIgc2NoZW1lLgotICoJbyBEbyBmaXJtd2FyZSByZXNldHMgb25seSBpbiBvcmlub2NvX2luaXQoKSBhbmQgd2hlbiB3YWtpbmcKLSAqCSAgdGhlIGNhcmQgZnJvbSBoYXJkIHNsZWVwLgotICoKLSAqIHYwLjEzYmV0YTEgLT4gdjAuMTMgLSAyNyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBSZS1pbnRyb2R1Y2VkIGZ1bGwgcmVzZXRzICh2aWEgc2NoZWR1bGVfdGFzaygpKSBvbiBUeAotICoJICB0aW1lb3V0LgotICoKLSAqIHYwLjEzIC0+IHYwLjEzYSAtIDMwIFNlcCAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIE1pbm9yIGNsZWFudXBzIHRvIGluZm8gZnJhbWUgaGFuZGxpbmcuICBBZGQgYmFzaWMgc3VwcG9ydAotICoJICBmb3IgbGlua3N0YXR1cyBpbmZvIGZyYW1lcy4KLSAqCW8gSW5jbHVkZSByZXF1aXJlZCBrZXJuZWwgaGVhZGVycyBpbiBvcmlub2NvLmgsIHRvIGF2b2lkCi0gKgkgIGNvbXBpbGUgcHJvYmxlbXMuCi0gKgotICogdjAuMTNhIC0+IHYwLjEzYiAtIDEwIEZlYiAyMDAzIC0gRGF2aWQgR2lic29uCi0gKglvIEltcGxlbWVudGVkIGhhcmQgcmVzZXQgZm9yIEFpcnBvcnQgY2FyZHMKLSAqCW8gRXhwZXJpbWVudGFsIHN1c3BlbmQvcmVzdW1lIGltcGxlbWVudGF0aW9uIGZvciBvcmlub2NvX3BjaQotICoJbyBBYm9saXNoZWQgL3Byb2MgZGVidWdnaW5nIHN1cHBvcnQsIHJlcGxhY2VkIHdpdGggYSBkZWJ1Z2dpbmcKLSAqCSAgaXdwcml2LiAgTm93IGl0J3MgdWdseSBhbmQgc2ltcGxlIGluc3RlYWQgb2YgdWdseSBhbmQgY29tcGxleC4KLSAqCW8gQnVnZml4IGluIGhlcm1lcy5jIGlmIHRoZSBmaXJtd2FyZSByZXR1cm5lZCBhIHJlY29yZCBsZW5ndGgKLSAqCSAgb2YgMCwgd2UgY291bGQgZ28gY2xvYmJlcmluZyBtZW1vcnkuCi0gKglvIEJ1Z2ZpeCBpbiBvcmlub2NvX3N0b3AoKSAtIGl0IHVzZWQgdG8gZmFpbCBpZiBod191bmF2YWlsYWJsZQotICoJICB3YXMgc2V0LCB3aGljaCB3YXMgdXN1YWxseSB0cnVlIG9uIFBDTUNJQSBob3QgcmVtb3Zlcy4KLSAqIAlvIFRyYWNrIExJTktTVEFUVVMgbWVzc2FnZXMsIHNpbGVudGx5IGRyb3AgVHggcGFja2V0cyBiZWZvcmUKLSAqIAkgIHdlIGFyZSBjb25uZWN0ZWQgKGF2b2lkcyBjb25mdXNpbmcgdGhlIGZpcm13YXJlKSwgYW5kIG9ubHkKLSAqIAkgIGdpdmUgTElOS1NUQVRVUyBwcmludGsoKXMgaWYgdGhlIHN0YXR1cyBoYXMgY2hhbmdlZC4KLSAqCi0gKiB2MC4xM2IgLT4gdjAuMTNjIC0gMTEgTWFyIDIwMDMgLSBEYXZpZCBHaWJzb24KLSAqCW8gQ2xlYW51cDogdXNlIGRldiBpbnN0ZWFkIG9mIHByaXYgaW4gdmFyaW91cyBwbGFjZXMuCi0gKglvIEJ1ZyBmaXg6IERvbid0IFJlbGVhc2VDb25maWd1cmF0aW9uIG9uIFJFU0VUX1BIWVNJQ0FMIGV2ZW50Ci0gKgkgIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAoZHJpdmVyIGluaXRpYXRlZCkgaGFyZCByZXNldC4KLSAqCW8gQnVnIGZpeDogRVRIX1pMRU4gaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSB0aGUgaGVhZGVyCi0gKgkgIChEaW9ueXN1cyBCbGF6YWtpcyAmIE1hbmlzaCBLYXJpcikKLSAqCW8gQ29udmVydCB0byB1c2luZyB3b3JrcXVldWVzIGluc3RlYWQgb2YgdGFza3F1ZXVlcyAoYW5kCi0gKgkgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1hY3JvcyBmb3IgcHJlIDIuNS40MSBrZXJuZWxzKS4KLSAqCW8gRHJvcCByZWR1bmRhbnQgKEkgdGhpbmsuLi4pIE1PRF97SU5DLERFQ31fVVNFX0NPVU5UIGluCi0gKgkgIGFpcnBvcnQuYwotICoJbyBOZXcgb3Jpbm9jb190bWQuYyBpbml0IG1vZHVsZSBmcm9tIEpvZXJnIERvcmNoYWluIGZvcgotICoJICBUTUQ3MTYwIGJhc2VkIFBDSSB0byBQQ01DSUEgYnJpZGdlcyAoc2ltaWxhciB0bwotICoJICBvcmlub2NvX3BseC5jKS4KLSAqCi0gKiB2MC4xM2MgLT4gdjAuMTNkIC0gMjIgQXByIDIwMDMgLSBEYXZpZCBHaWJzb24KLSAqCW8gTWFrZSBod191bmF2YWlsYWJsZSBhIGNvdW50ZXIsIHJhdGhlciB0aGFuIGp1c3QgYSBmbGFnLCB0aGlzCi0gKgkgIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBzb21lIHJhY2VzIChzdWNoIGFzIGEgY2FyZCBiZWluZwotICoJICByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2Ygb3Jpbm9jb19yZXNldCgpLgotICoJbyBSZXN0b3JlIFJlbGVhc2UvUmVxdWVzdENvbmZpZ3VyYXRpb24gaW4gdGhlIFBDTUNJQSBldmVudCBoYW5kbGVyCi0gKgkgIHdoZW4gZGVhbGluZyB3aXRoIGEgZHJpdmVyIGluaXRpYXRlZCBoYXJkIHJlc2V0LiAgVGhpcyBpcwotICoJICBuZWNlc3NhcnkgdG8gcHJldmVudCBoYW5ncyBkdWUgdG8gYSBzcHVyaW91cyBpbnRlcnJ1cHQgd2hpbGUKLSAqCSAgdGhlIHJlc2V0IGlzIGluIHByb2dyZXNzLgotICoJbyBDbGVhciB0aGUgODAyLjExIGhlYWRlciB3aGVuIHRyYW5zbWl0dGluZywgZXZlbiB0aG91Z2ggd2UKLSAqCSAgZG9uJ3QgdXNlIGl0LiAgVGhpcyBmaXhlcyBhIGxvbmcgc3RhbmRpbmcgYnVnIG9uIHNvbWUKLSAqCSAgZmlybXdhcmVzLCB3aGljaCBzZWVtIHRvIGdldCBjb25mdXNlZCBpZiB0aGF0IGlzbid0IGRvbmUuCi0gKglvIEJlIGxlc3MgZWFnZXIgdG8gZGUtZW5jYXBzdWxhdGUgU05BUCBmcmFtZXMsIG9ubHkgZG8gc28gaWYKLSAqCSAgdGhlIE9VSSBpcyAwMDowMDowMCBvciAwMDowMDpmOCwgbGVhdmUgb3RoZXJzIGFsb25lLiAgVGhlIG9sZAotICoJICBiZWhhdmlvdXIgYnJva2UgQ0RQIChDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wpLgotICoJbyBVc2UgZGV2IGluc3RlYWQgb2YgcHJpdiBmb3IgZnJlZV9pcnEoKSBhcyB3ZWxsIGFzCi0gKgkgIHJlcXVlc3RfaXJxKCkgKG9vcHMpLgotICoJbyBBdHRlbXB0IHRvIHJlc2V0IHJhdGhlciB0aGFuIGdpdmluZyB1cCBpZiB3ZSBnZXQgdG9vIG1hbnkKLSAqCSAgSVJRcy4KLSAqCW8gQ2hhbmdlZCBzZW1hbnRpY3Mgb2YgX19vcmlub2NvX2Rvd24oKSBzbyBpdCBjYW4gYmUgY2FsbGVkCi0gKgkgIHNhZmVseSB3aXRoIGh3X3VuYXZhaWxhYmxlIHNldC4gIEl0IGFsc28gbm93IGNsZWFycyB0aGUKLSAqCSAgbGlua3N0YXR1cyAoc2luY2Ugd2UncmUgZ29pbmcgdG8gaGF2ZSB0byByZWFzc29jaWF0ZSkuCi0gKgotICogdjAuMTNkIC0+IHYwLjEzZSAtIDEyIE1heSAyMDAzIC0gRGF2aWQgR2lic29uCi0gKglvIFN1cHBvcnQgZm9yIHBvc3QtMi41LjY4IHJldHVybiB2YWx1ZXMgZnJvbSBpcnEgaGFuZGxlci4KLSAqCW8gRml4ZWQgYnVnIHdoZXJlIHVuZGVybGVuZ3RoIHBhY2tldHMgd291bGQgYmUgZG91YmxlIGNvdW50ZWQKLSAqCSAgaW4gdGhlIHJ4X2Ryb3BwZWQgc3RhdGlzdGljcy4KLSAqCW8gUHJvdmlkZWQgYSBtb2R1bGUgcGFyYW1ldGVyIHRvIHN1cHByZXNzIGxpbmtzdGF0dXMgbWVzc2FnZXMuCi0gKgotICogdjAuMTNlIC0+IHYwLjE0YWxwaGExIC0gMzAgU2VwIDIwMDMgLSBEYXZpZCBHaWJzb24KLSAqCW8gUmVwbGFjZWQgcHJpdi0+Y29ubmVjdGVkIGxvZ2ljIHdpdGggbmV0aWZfY2Fycmllcl9vbi9vZmYoKQotICoJICBjYWxscy4KLSAqCW8gUmVtb3ZlIGhhc19pYnNzX2FueSBhbmQgbmV2ZXIgc2V0IHRoZSBDUkVBVEVJQlNTIFJJRCB3aGVuCi0gKgkgIHRoZSBFU1NJRCBpcyBlbXB0eS4gIFRvbyBtYW55IGZpcm13YXJlcyBicmVhayBpZiB3ZSBkby4KLSAqCW8gMi42IG1lcmdlczogUmVwbGFjZSBwZGV2LT5zbG90X25hbWUgd2l0aCBwY2lfbmFtZSgpLCByZW1vdmUKLSAqCSAgX19kZXZpbml0ZGF0YSBmcm9tIFBDSSBJRCB0YWJsZXMsIHVzZSBmcmVlX25ldGRldigpLgotICoJbyBFbmFibGVkIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24gZm9yIEFnZXJlIGZpcm13YXJlIChmcm9tCi0gKgkgIFJvYmVydCBKLiBNb29yZSA8Um9iZXJ0LkouTW9vcmUgQVQgYWxsYW5iYW5rLmNvbT4KLSAqCW8gTW92ZSBuZXRpZl93YWtlX3F1ZXVlKCkgKGJhY2spIHRvIHRoZSBUeCBjb21wbGV0aW9uIGZyb20gdGhlCi0gKgkgIEFMTE9DIGV2ZW50LiAgVGhpcyBzZWVtcyB0byBwcmV2ZW50L21pdGlnYXRlIHRoZSByb2xsaW5nCi0gKgkgIGVycm9yIC0xMTAgcHJvYmxlbXMgYXQgbGVhc3Qgb24gc29tZSBJbnRlcnNpbCBmaXJtd2FyZXMuCi0gKgkgIFRoZW9yZXRpY2FsbHkgcmVkdWNlcyBwZXJmb3JtYW5jZSwgYnV0IEkgY2FuJ3QgbWVhc3VyZSBpdC4KLSAqCSAgUGF0Y2ggZnJvbSBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZSBBVCBzYW1iYS5vcmc+Ci0gKgotICogdjAuMTRhbHBoYTEgLT4gdjAuMTRhbHBoYTIgLSAyMCBPY3QgMjAwMyAtIERhdmlkIEdpYnNvbgotICoJbyBDb3JyZWN0bHkgdHVybiBvZmYgc2hhcmVkLWtleSBhdXRoZW50aWNhdGlvbiB3aGVuIHJlcXVlc3RlZAotICoJICAoYnVnZml4IGZyb20gUm9iZXJ0IEouIE1vb3JlKS4KLSAqCW8gQ29ycmVjdCBhaXJwb3J0IHNsZWVwIGludGVyZmFjZXMgZm9yIGN1cnJlbnQgMi42IGtlcm5lbHMuCi0gKglvIEFkZCBjb2RlIGZvciBrZXkgY2hhbmdlIHdpdGhvdXQgZGlzYWJsaW5nL2VuYWJsaW5nIHRoZSBNQUMKLSAqCSAgcG9ydC4gIFRoaXMgaXMgc3VwcG9zZWQgdG8gYWxsb3cgODAyLjF4IHRvIHdvcmsgc2FuZWx5LCBidXQKLSAqCSAgZG9lc24ndCBzZWVtIHRvIHlldC4KLSAqCiAgKiBUT0RPCi0gKglvIE5ldyB3aXJlbGVzcyBleHRlbnNpb25zIEFQSSAocGF0Y2ggZnJvbSBNb3VzdGFmYQotICoJICBZb3Vzc2VmLCB1cGRhdGVkIGJ5IEppbSBDYXJ0ZXIgYW5kIFBhdmVsIFJvc2tpbikuCiAgKglvIEhhbmRsZSBkZS1lbmNhcHN1bGF0aW9uIHdpdGhpbiBuZXR3b3JrIGxheWVyLCBwcm92aWRlIDgwMi4xMQogICoJICBoZWFkZXJzIChwYXRjaCBmcm9tIFRob21hcyAnRGVudCcgTWlybGFjaGVyKQotICoJbyBSRiBtb25pdG9yIG1vZGUgc3VwcG9ydAogICoJbyBGaXggcG9zc2libGUgcmFjZXMgaW4gU1BZIGhhbmRsaW5nLgogICoJbyBEaXNjb25uZWN0IHdpcmVsZXNzIGV4dGVuc2lvbnMgZnJvbSBmdW5kYW1lbnRhbCBjb25maWd1cmF0aW9uLgogICoJbyAobWF5YmUpIFNvZnR3YXJlIFdFUCBzdXBwb3J0IChwYXRjaCBmcm9tIFN0YW5vIE1lZHVuYSkuCkBAIC00NjIsNyArODksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQ5Niw2ICsxMjYsMTAgQEAKIG1vZHVsZV9wYXJhbShpZ25vcmVfZGlzY29ubmVjdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2Rpc2Nvbm5lY3QsICJEb24ndCByZXBvcnQgbG9zdCBsaW5rIHRvIHRoZSBuZXR3b3JrIGxheWVyIik7CiAKK3N0YXRpYyBpbnQgZm9yY2VfbW9uaXRvcjsgLyogPSAwICovCittb2R1bGVfcGFyYW0oZm9yY2VfbW9uaXRvciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfbW9uaXRvciwgIkFsbG93IG1vbml0b3IgbW9kZSBmb3IgYWxsIGZpcm13YXJlIHZlcnNpb25zIik7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIENvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uIGFuZCBjb21wYXRpYmlsaXR5IHN0dWZmICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTUxMSw2ICsxNDUsMTAgQEAKIC8qIEludGVybmFsIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyogODAyLjIgTExDL1NOQVAgaGVhZGVyIHVzZWQgZm9yIEV0aGVybmV0IGVuY2Fwc3VsYXRpb24gb3ZlciA4MDIuMTEgKi8KK3N0YXRpYyBjb25zdCB1OCBlbmNhcHNfaGRyW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisjZGVmaW5lIEVOQ0FQU19PVkVSSEVBRAkJKHNpemVvZihlbmNhcHNfaGRyKSArIDIpCisKICNkZWZpbmUgT1JJTk9DT19NSU5fTVRVCQkyNTYKICNkZWZpbmUgT1JJTk9DT19NQVhfTVRVCQkoSUVFRTgwMl8xMV9EQVRBX0xFTiAtIEVOQ0FQU19PVkVSSEVBRCkKIApAQCAtNTM3LDYgKzE3NSwxMSBAQAogCQkJCSB8IEhFUk1FU19FVl9XVEVSUiB8IEhFUk1FU19FVl9JTkZPIFwKIAkJCQkgfCBIRVJNRVNfRVZfSU5GRFJPUCApCiAKKyNkZWZpbmUgTUFYX1JJRF9MRU4gMTAyNAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIG9yaW5vY29faGFuZGxlcl9kZWY7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9yaW5vY29fZXRodG9vbF9vcHM7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERhdGEgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU3MSwyNiArMjE0LDQ1IEBACiAvKiBEYXRhIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBoZWFkZXJfc3RydWN0IHsKLQkvKiA4MDIuMyAqLwotCXU4IGRlc3RbRVRIX0FMRU5dOwotCXU4IHNyY1tFVEhfQUxFTl07Ci0JdTE2IGxlbjsKLQkvKiA4MDIuMiAqLworLyogVXNlZCBpbiBFdmVudCBoYW5kbGluZy4KKyAqIFdlIGF2b2lkIG5lc3RlZCBzdHJ1Y3RyZXMgYXMgdGhleSBicmVhayBvbiBBUk0gLS0gTW91c3RhZmEgKi8KK3N0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvcl84MDJfMTEgeworCS8qIGhlcm1lc190eF9kZXNjcmlwdG9yICovCisJdTE2IHN0YXR1czsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiByZXNlcnZlZDI7CisJdTMyIHN3X3N1cHBvcnQ7CisJdTggcmV0cnlfY291bnQ7CisJdTggdHhfcmF0ZTsKKwl1MTYgdHhfY29udHJvbDsKKworCS8qIGllZWU4MDJfMTFfaGRyICovCisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXUxNiBkYXRhX2xlbjsKKworCS8qIGV0aGhkciAqLworCXVuc2lnbmVkIGNoYXIgICBoX2Rlc3RbRVRIX0FMRU5dOyAgICAgICAvKiBkZXN0aW5hdGlvbiBldGggYWRkciAqLworCXVuc2lnbmVkIGNoYXIgICBoX3NvdXJjZVtFVEhfQUxFTl07ICAgICAvKiBzb3VyY2UgZXRoZXIgYWRkciAgICAqLworCXVuc2lnbmVkIHNob3J0ICBoX3Byb3RvOyAgICAgICAgICAgICAgICAvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLworCisJLyogcDgwMjJfaGRyICovCiAJdTggZHNhcDsKIAl1OCBzc2FwOwogCXU4IGN0cmw7Ci0JLyogU05BUCAqLwogCXU4IG91aVszXTsKKwogCXUxNiBldGhlcnR5cGU7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotLyogODAyLjIgTExDL1NOQVAgaGVhZGVyIHVzZWQgZm9yIEV0aGVybmV0IGVuY2Fwc3VsYXRpb24gb3ZlciA4MDIuMTEgKi8KLXU4IGVuY2Fwc19oZHJbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQotI2RlZmluZSBFTkNBUFNfT1ZFUkhFQUQJCShzaXplb2YoZW5jYXBzX2hkcikgKyAyKQotCisvKiBSeCBmcmFtZSBoZWFkZXIgZXhjZXB0IGNvbXBhdGliaWxpdHkgODAyLjMgaGVhZGVyICovCiBzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgeworCS8qIENvbnRyb2wgKi8KIAl1MTYgc3RhdHVzOwogCXUzMiB0aW1lOwogCXU4IHNpbGVuY2U7CkBAIC01OTgsMTMgKzI2MCwyNCBAQAogCXU4IHJhdGU7CiAJdTggcnhmbG93OwogCXUzMiByZXNlcnZlZDsKKworCS8qIDgwMi4xMSBoZWFkZXIgKi8KKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisKKwkvKiBEYXRhIGxlbmd0aCAqLworCXUxNiBkYXRhX2xlbjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgX19vcmlub2NvX3Byb2dyYW1fcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIF9fb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKQEAgLTYyOCw2ICszMDEsMTAgQEAKIAkJCXByaXYtPmNyZWF0ZWlic3MgPSAxOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQlwcml2LT5wb3J0X3R5cGUgPSAzOworCQlwcml2LT5jcmVhdGVpYnNzID0gMDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBwcml2LT5pd19tb2RlIGluIHNldF9wb3J0X3R5cGUoKVxuIiwKIAkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUpOwpAQCAtODE0LDcgKzQ5MSw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmICghIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCWlmICghIG5ldGlmX2NhcnJpZXJfb2soZGV2KSB8fCAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpKSB7CiAJCS8qIE9vcHMsIHRoZSBmaXJtd2FyZSBoYXNuJ3QgZXN0YWJsaXNoZWQgYSBjb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldCAodGhpcyBzZWVtcyB0byBiZSB0aGUKICAgICAgICAgICAgICAgICAgICBzYWZlc3QgYXBwcm9hY2gpLiAqLwpAQCAtOTUxLDI2ICs2MjgsNTUgQEAKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CiAJdTE2IGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFRYQ09NUExGSUQpOwotCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvcl84MDJfMTEgaGRyOwogCWludCBlcnIgPSAwOwogCiAJaWYgKGZpZCA9PSBEVU1NWV9GSUQpCiAJCXJldHVybjsgLyogTm90aGluZydzIHJlYWxseSBoYXBwZW5lZCAqLwogCi0JZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwgZmlkLCAwKTsKKwkvKiBSZWFkIHRoZSBmcmFtZSBoZWFkZXIgKi8KKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmaGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3IpICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHIpLAorCQkJICAgICAgIGZpZCwgMCk7CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gcmVhZCBkZXNjcmlwdG9yIG9uIFR4IGVycm9yICIKIAkJICAgICAgICIoRklEPSUwNFggZXJyb3IgJWQpXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBmaWQsIGVycik7Ci0JfSBlbHNlIHsKLQkJREVCVUcoMSwgIiVzOiBUeCBlcnJvciwgc3RhdHVzICVkXG4iLAotCQkgICAgICBkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KGRlc2Muc3RhdHVzKSk7CisJCXJldHVybjsKIAl9CiAJCi0Jc3RhdHMtPnR4X2Vycm9ycysrOworCURFQlVHKDEsICIlczogVHggZXJyb3IsIGVyciAlZCAoRklEPSUwNFgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgZXJyLCBmaWQpOworICAgIAorCS8qIFdlIHByb2R1Y2UgYSBUWERST1AgZXZlbnQgb25seSBmb3IgcmV0cnkgb3IgbGlmZXRpbWUKKwkgKiBleGNlZWRlZCwgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgc3RhdHVzIHRoYXQgcmVhbGx5IG1lYW4KKwkgKiB0aGF0IHRoaXMgcGFydGljdWxhciBub2RlIHdlbnQgYXdheS4KKwkgKiBPdGhlciBlcnJvcnMgbWVhbnMgdGhhdCAqd2UqIHNjcmV3ZWQgdXAuIC0gSmVhbiBJSSAqLworCWhkci5zdGF0dXMgPSBsZTE2X3RvX2NwdShoZHIuc3RhdHVzKTsKKwlpZiAoaGRyLnN0YXR1cyAmIChIRVJNRVNfVFhTVEFUX1JFVFJZRVJSIHwgSEVSTUVTX1RYU1RBVF9BR0VERVJSKSkgeworCQl1bmlvbiBpd3JlcV9kYXRhCXdycXU7CisKKwkJLyogQ29weSA4MDIuMTEgZGVzdCBhZGRyZXNzLgorCQkgKiBXZSB1c2UgdGhlIDgwMi4xMSBoZWFkZXIgYmVjYXVzZSB0aGUgZnJhbWUgbWF5CisJCSAqIG5vdCBiZSA4MDIuMyBvciBtYXkgYmUgbWFuZ2xlZC4uLgorCQkgKiBJbiBBZC1Ib2MgbW9kZSwgaXQgd2lsbCBiZSB0aGUgbm9kZSBhZGRyZXNzLgorCQkgKiBJbiBtYW5hZ2VkIG1vZGUsIGl0IHdpbGwgYmUgbW9zdCBsaWtlbHkgdGhlIEFQIGFkZHIKKwkJICogVXNlciBzcGFjZSB3aWxsIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgaXQgdG8KKwkJICogd2hhdGV2ZXIgaXQgbmVlZHMgKElQIGFkZHJlc3Mgb3IgZWxzZSkuCisJCSAqIC0gSmVhbiBJSSAqLworCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsIGhkci5hZGRyMSwgRVRIX0FMRU4pOworCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlRYRFJPUCwgJndycXUsIE5VTEwpOworCX0KIAogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKIH0KIAogc3RhdGljIHZvaWQgb3Jpbm9jb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMDQ3LDE4ICs3NTMsMTI3IEBACiAJfQogfQogCisvKgorICogb3Jpbm9jb19yeF9tb25pdG9yIC0gaGFuZGxlIHJlY2VpdmVkIG1vbml0b3IgZnJhbWVzLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWRldgkJbmV0d29yayBkZXZpY2UKKyAqCXJ4ZmlkCQlyZWNlaXZlZCBGSUQKKyAqCWRlc2MJCXJ4IGRlc2NyaXB0b3Igb2YgdGhlIGZyYW1lCisgKgorICogQ2FsbCBjb250ZXh0OiBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19yeF9tb25pdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByeGZpZCwKKwkJCSAgICAgICBzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJdTMyIGhkcmxlbiA9IDMwOwkvKiByZXR1cm4gZnVsbCBoZWFkZXIgYnkgZGVmYXVsdCAqLworCXUzMiBkYXRhbGVuID0gMDsKKwl1MTYgZmM7CisJaW50IGVycjsKKwlpbnQgbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKworCWxlbiA9IGxlMTZfdG9fY3B1KGRlc2MtPmRhdGFfbGVuKTsKKworCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIGFuZCB0aGUgZGF0YSAqLworCWZjID0gbGUxNl90b19jcHUoZGVzYy0+ZnJhbWVfY3RsKTsKKwlzd2l0Y2ggKGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykKKwkJICAgICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykpCisJCQloZHJsZW4gPSAzMDsKKwkJZWxzZQorCQkJaGRybGVuID0gMjQ7CisJCWRhdGFsZW4gPSBsZW47CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCWhkcmxlbiA9IDI0OworCQlkYXRhbGVuID0gbGVuOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCXN3aXRjaCAoZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QU1BPTEw6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQ6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLOgorCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSAxMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gZnJhbWUgdHlwZSAqLworCQlicmVhazsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLworCWlmIChkYXRhbGVuID4gSUVFRTgwMjExX0RBVEFfTEVOICsgMTIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvdmVyc2l6ZWQgbW9uaXRvciBmcmFtZSwgIgorCQkgICAgICAgImRhdGEgbGVuZ3RoID0gJWRcbiIsIGRldi0+bmFtZSwgZGF0YWxlbik7CisJCWVyciA9IC1FSU87CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWdvdG8gdXBkYXRlX3N0YXRzOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoaGRybGVuICsgZGF0YWxlbik7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBhbGxvY2F0ZSBza2IgZm9yIG1vbml0b3IgZnJhbWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogQ29weSB0aGUgODAyLjExIGhlYWRlciB0byB0aGUgc2tiICovCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBoZHJsZW4pLCAmKGRlc2MtPmZyYW1lX2N0bCksIGhkcmxlbik7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCisJLyogSWYgYW55LCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgdG8gdGhlIHNrYiAqLworCWlmIChkYXRhbGVuID4gMCkgeworCQllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCBza2JfcHV0KHNrYiwgZGF0YWxlbiksCisJCQkJICAgICAgIEFMSUdOKGRhdGFsZW4sIDIpLCByeGZpZCwKKwkJCQkgICAgICAgSEVSTUVTXzgwMl8yX09GRlNFVCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgbW9uaXRvciBmcmFtZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlnb3RvIGRyb3A7CisJCX0KKwl9CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpOworCQorCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwluZXRpZl9yeChza2IpOworCXJldHVybjsKKworIGRyb3A6CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyB1cGRhdGVfc3RhdHM6CisJc3RhdHMtPnJ4X2Vycm9ycysrOworCXN0YXRzLT5yeF9kcm9wcGVkKys7Cit9CisKIHN0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXUxNiByeGZpZCwgc3RhdHVzOwotCWludCBsZW5ndGgsIGRhdGFfbGVuLCBkYXRhX29mZjsKLQljaGFyICpwOworCXUxNiByeGZpZCwgc3RhdHVzLCBmYzsKKwlpbnQgbGVuZ3RoOwogCXN0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciBkZXNjOwotCXN0cnVjdCBoZWFkZXJfc3RydWN0IGhkcjsKLQlzdHJ1Y3QgZXRoaGRyICplaDsKKwlzdHJ1Y3QgZXRoaGRyICpoZHI7CiAJaW50IGVycjsKIAogCXJ4ZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgUlhGSUQpOwpAQCAtMTA2OCw1MyArODgzLDQ2IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIFJ4IGRlc2NyaXB0b3IuICIKIAkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOwotCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZHJvcDsKKwkJZ290byB1cGRhdGVfc3RhdHM7CiAJfQogCiAJc3RhdHVzID0gbGUxNl90b19jcHUoZGVzYy5zdGF0dXMpOwogCi0JaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfRVJSKSB7Ci0JCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX1VOREVDUllQVEFCTEUpIHsKLQkJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlKys7Ci0JCQlERUJVRygxLCAiJXM6IFVuZGVjcnlwdGFibGUgZnJhbWUgb24gUnguIEZyYW1lIGRyb3BwZWQuXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOwotCQkJREVCVUcoMSwgIiVzOiBCYWQgQ1JDIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lKTsKLQkJfQotCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZHJvcDsKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9CQURDUkMpIHsKKwkJREVCVUcoMSwgIiVzOiBCYWQgQ1JDIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJZ290byB1cGRhdGVfc3RhdHM7CiAJfQogCi0JLyogRm9yIG5vdyB3ZSBpZ25vcmUgdGhlIDgwMi4xMSBoZWFkZXIgY29tcGxldGVseSwgYXNzdW1pbmcKLSAgICAgICAgICAgdGhhdCB0aGUgY2FyZCdzIGZpcm13YXJlIGhhcyBoYW5kbGVkIGFueXRoaW5nIHZpdGFsICovCi0KLQllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmaGRyLCBzaXplb2YoaGRyKSwKLQkJCSAgICAgICByeGZpZCwgSEVSTUVTXzgwMl8zX09GRlNFVCk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGZyYW1lIGhlYWRlci4gIgotCQkgICAgICAgIkZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGVycik7Ci0JCXN0YXRzLT5yeF9lcnJvcnMrKzsKLQkJZ290byBkcm9wOworCS8qIEhhbmRsZSBmcmFtZXMgaW4gbW9uaXRvciBtb2RlICovCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCW9yaW5vY29fcnhfbW9uaXRvcihkZXYsIHJ4ZmlkLCAmZGVzYyk7CisJCXJldHVybjsKIAl9CiAKLQlsZW5ndGggPSBudG9ocyhoZHIubGVuKTsKLQkKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9VTkRFQ1JZUFRBQkxFKSB7CisJCURFQlVHKDEsICIlczogVW5kZWNyeXB0YWJsZSBmcmFtZSBvbiBSeC4gRnJhbWUgZHJvcHBlZC5cbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlKys7CisJCWdvdG8gdXBkYXRlX3N0YXRzOworCX0KKworCWxlbmd0aCA9IGxlMTZfdG9fY3B1KGRlc2MuZGF0YV9sZW4pOworCWZjID0gbGUxNl90b19jcHUoZGVzYy5mcmFtZV9jdGwpOworCiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCWlmIChsZW5ndGggPCAzKSB7IC8qIE5vIGZvciBldmVuIGFuIDgwMi4yIExMQyBoZWFkZXIgKi8KIAkJLyogQXQgbGVhc3Qgb24gU3ltYm9sIGZpcm13YXJlIHdpdGggUENGIHdlIGdldCBxdWl0ZSBhCiAgICAgICAgICAgICAgICAgICAgbG90IG9mIHRoZXNlIGxlZ2l0aW1hdGVseSAtIFBvbGwgZnJhbWVzIHdpdGggbm8KICAgICAgICAgICAgICAgICAgICBkYXRhLiAqLwotCQlzdGF0cy0+cnhfZHJvcHBlZCsrOwotCQlnb3RvIGRyb3A7CisJCXJldHVybjsKIAl9CiAJaWYgKGxlbmd0aCA+IElFRUU4MDJfMTFfREFUQV9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBmcmFtZSByZWNlaXZlZCAoJWQgYnl0ZXMpXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBsZW5ndGgpOwogCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOwotCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZHJvcDsKKwkJZ290byB1cGRhdGVfc3RhdHM7CiAJfQogCiAJLyogV2UgbmVlZCBzcGFjZSBmb3IgdGhlIHBhY2tldCBkYXRhIGl0c2VsZiwgcGx1cyBhbiBldGhlcm5ldApAQCAtMTEyNiw2MCArOTM0LDUzIEBACiAJaWYgKCFza2IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGFsbG9jYXRlIHNrYiBmb3IgUnhcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwotCQlnb3RvIGRyb3A7CisJCWdvdG8gdXBkYXRlX3N0YXRzOwogCX0KIAotCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIFRoaXMgd2F5IHRoZSBJUCBoZWFkZXIgaXMgYWxpZ25lZCAqLworCS8qIFdlJ2xsIHByZXBlbmQgdGhlIGhlYWRlciwgc28gcmVzZXJ2ZSBzcGFjZSBmb3IgaXQuICBUaGUgd29yc3QKKwkgICBjYXNlIGlzIG5vIGRlY2Fwc3VsYXRpb24sIHdoZW4gODAyLjMgaGVhZGVyIGlzIHByZXBlbmRlZCBhbmQKKwkgICBub3RoaW5nIGlzIHJlbW92ZWQuICAyIGlzIGZvciBhbGlnbmluZyB0aGUgSVAgaGVhZGVyLiAgKi8KKwlza2JfcmVzZXJ2ZShza2IsIEVUSF9ITEVOICsgMik7CisKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCBza2JfcHV0KHNrYiwgbGVuZ3RoKSwKKwkJCSAgICAgICBBTElHTihsZW5ndGgsIDIpLCByeGZpZCwKKwkJCSAgICAgICBIRVJNRVNfODAyXzJfT0ZGU0VUKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGRyb3A7CisJfQogCiAJLyogSGFuZGxlIGRlY2Fwc3VsYXRpb24KIAkgKiBJbiBtb3N0IGNhc2VzLCB0aGUgZmlybXdhcmUgdGVsbCB1cyBhYm91dCBTTkFQIGZyYW1lcy4KIAkgKiBGb3Igc29tZSByZWFzb24sIHRoZSBTTkFQIGZyYW1lcyBzZW50IGJ5IExpbmtTeXMgQVBzCiAJICogYXJlIG5vdCBwcm9wZXJseSByZWNvZ25pc2VkIGJ5IG1vc3QgZmlybXdhcmVzLgogCSAqIFNvLCBjaGVjayBvdXJzZWx2ZXMgKi8KLQlpZiAoKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01TR1RZUEUpID09IEhFUk1FU19SWFNUQVRfMTA0MikgfHwKLQkgICAgKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01TR1RZUEUpID09IEhFUk1FU19SWFNUQVRfVFVOTkVMKSB8fAotCSAgICBpc19ldGhlcnNuYXAoJmhkcikpIHsKKwlpZiAobGVuZ3RoID49IEVOQ0FQU19PVkVSSEVBRCAmJgorCSAgICAoKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01TR1RZUEUpID09IEhFUk1FU19SWFNUQVRfMTA0MikgfHwKKwkgICAgICgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUX1RVTk5FTCkgfHwKKwkgICAgIGlzX2V0aGVyc25hcChza2ItPmRhdGEpKSkgewogCQkvKiBUaGVzZSBpbmRpY2F0ZSBhIFNOQVAgd2l0aGluIDgwMi4yIExMQyB3aXRoaW4KIAkJICAgODAyLjExIGZyYW1lIHdoaWNoIHdlJ2xsIG5lZWQgdG8gZGUtZW5jYXBzdWxhdGUgdG8KIAkJICAgdGhlIG9yaWdpbmFsIEV0aGVybmV0SUkgZnJhbWUuICovCi0KLQkJaWYgKGxlbmd0aCA8IEVOQ0FQU19PVkVSSEVBRCkgeyAvKiBObyByb29tIGZvciBmdWxsIExMQytTTkFQICovCi0JCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJZ290byBkcm9wOwotCQl9Ci0KLQkJLyogUmVtb3ZlIFNOQVAgaGVhZGVyLCByZWNvbnN0cnVjdCBFdGhlcm5ldElJIGZyYW1lICovCi0JCWRhdGFfbGVuID0gbGVuZ3RoIC0gRU5DQVBTX09WRVJIRUFEOwotCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQgKyBzaXplb2YoaGRyKTsKLQotCQllaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1dChza2IsIEVUSF9ITEVOKTsKLQotCQltZW1jcHkoZWgsICZoZHIsIDIgKiBFVEhfQUxFTik7Ci0JCWVoLT5oX3Byb3RvID0gaGRyLmV0aGVydHlwZTsKKwkJaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHVzaChza2IsIEVUSF9ITEVOIC0gRU5DQVBTX09WRVJIRUFEKTsKIAl9IGVsc2UgewotCQkvKiBBbGwgb3RoZXIgY2FzZXMgaW5kaWNhdGUgYSBnZW51aW5lIDgwMi4zIGZyYW1lLiAgTm8KLQkJICAgZGVjYXBzdWxhdGlvbiBuZWVkZWQuICBXZSBqdXN0IHRocm93IHRoZSB3aG9sZQotCQkgICB0aGluZyBpbiwgYW5kIGhvcGUgdGhlIHByb3RvY29sIGxheWVyIGNhbiBkZWFsIHdpdGgKLQkJICAgaXQgYXMgODAyLjMgKi8KLQkJZGF0YV9sZW4gPSBsZW5ndGg7Ci0JCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVDsKLQkJLyogRklYTUU6IHdlIHJlLXJlYWQgZnJvbSB0aGUgY2FyZCBkYXRhIHdlIGFscmVhZHkgcmVhZCBoZXJlICovCisJCS8qIDgwMi4zIGZyYW1lIC0gcHJlcGVuZCA4MDIuMyBoZWFkZXIgYXMgaXMgKi8KKwkJaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKKwkJaGRyLT5oX3Byb3RvID0gaHRvbnMobGVuZ3RoKTsKIAl9Ci0KLQlwID0gc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKLQllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCBwLCBBTElHTihkYXRhX2xlbiwgMiksCi0JCQkgICAgICAgcnhmaWQsIGRhdGFfb2ZmKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUuICIKLQkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOwotCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZHJvcDsKLQl9CisJbWVtY3B5KGhkci0+aF9kZXN0LCBkZXNjLmFkZHIxLCBFVEhfQUxFTik7CisJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKQorCQltZW1jcHkoaGRyLT5oX3NvdXJjZSwgZGVzYy5hZGRyMywgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KGhkci0+aF9zb3VyY2UsIGRlc2MuYWRkcjIsIEVUSF9BTEVOKTsKIAogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykKKwkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJCiAJLyogUHJvY2VzcyB0aGUgd2lyZWxlc3Mgc3RhdHMgaWYgbmVlZGVkICovCiAJb3Jpbm9jb19zdGF0X2dhdGhlcihkZXYsIHNrYiwgJmRlc2MpOwpAQCAtMTE5MiwxMSArOTkzLDEwIEBACiAJcmV0dXJuOwogCiAgZHJvcDoJCisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyB1cGRhdGVfc3RhdHM6CisJc3RhdHMtPnJ4X2Vycm9ycysrOwogCXN0YXRzLT5yeF9kcm9wcGVkKys7Ci0KLQlpZiAoc2tiKQotCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCXJldHVybjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTI0MCw2ICsxMDQwLDk5IEBACiAJICAgICAgIGRldi0+bmFtZSwgcywgc3RhdHVzKTsKIH0KIAorLyogU2VhcmNoIHNjYW4gcmVzdWx0cyBmb3IgcmVxdWVzdGVkIEJTU0lELCBqb2luIGl0IGlmIGZvdW5kICovCitzdGF0aWMgdm9pZCBvcmlub2NvX2pvaW5fYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGpvaW5fcmVxIHsKKwkJdTggYnNzaWRbRVRIX0FMRU5dOworCQl1MTYgY2hhbm5lbDsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSByZXE7CisJY29uc3QgaW50IGF0b21fbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbywgYXRpbSk7CisJc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbyAqYXRvbTsKKwlpbnQgb2Zmc2V0ID0gNDsKKwl1OCAqYnVmOworCXUxNiBsZW47CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHNjYW4gcmVzdWx0cyAqLworCWJ1ZiA9IGttYWxsb2MoTUFYX1NDQU5fTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBidWYpCisJCXJldHVybjsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlnb3RvIG91dDsKKworCS8qIFNhbml0eSBjaGVja3MgaW4gY2FzZSB1c2VyIGNoYW5nZWQgc29tZXRoaW5nIGluIHRoZSBtZWFudGltZSAqLworCWlmICghIHByaXYtPmJzc2lkX2ZpeGVkKQorCQlnb3RvIG91dDsKKworCWlmIChzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBSZWFkIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBmaXJtd2FyZSAqLworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsCisJCQkgICAgICBIRVJNRVNfUklEX1NDQU5SRVNVTFRTVEFCTEUsCisJCQkgICAgICBNQVhfU0NBTl9MRU4sICZsZW4sIGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVhZCBzY2FuIHJlc3VsdHNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZW4gPSBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKGxlbik7CisKKwkvKiBHbyB0aHJvdWdoIHRoZSBzY2FuIHJlc3VsdHMgbG9va2luZyBmb3IgdGhlIGNoYW5uZWwgb2YgdGhlIEFQCisJICogd2Ugd2VyZSByZXF1ZXN0ZWQgdG8gam9pbiAqLworCWZvciAoOyBvZmZzZXQgKyBhdG9tX2xlbiA8PSBsZW47IG9mZnNldCArPSBhdG9tX2xlbikgeworCQlhdG9tID0gKHN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8gKikgKGJ1ZiArIG9mZnNldCk7CisJCWlmIChtZW1jbXAoJmF0b20tPmJzc2lkLCBwcml2LT5kZXNpcmVkX2Jzc2lkLCBFVEhfQUxFTikgPT0gMCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJREVCVUcoMSwgIiVzOiBSZXF1ZXN0ZWQgQVAgbm90IGZvdW5kIGluIHNjYW4gcmVzdWx0c1xuIiwKKwkgICAgICBkZXYtPm5hbWUpOworCWdvdG8gb3V0OworCisgZm91bmQ6CisJbWVtY3B5KHJlcS5ic3NpZCwgcHJpdi0+ZGVzaXJlZF9ic3NpZCwgRVRIX0FMRU4pOworCXJlcS5jaGFubmVsID0gYXRvbS0+Y2hhbm5lbDsJLyogYm90aCBhcmUgbGl0dGxlLWVuZGlhbiAqLworCWVyciA9IEhFUk1FU19XUklURV9SRUNPUkQoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkpPSU5SRVFVRVNULAorCQkJCSAgJnJlcSk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaXNzdWluZyBqb2luIHJlcXVlc3RcbiIsIGRldi0+bmFtZSk7CisKKyBvdXQ6CisJa2ZyZWUoYnVmKTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworfQorCisvKiBTZW5kIG5ldyBCU1NJRCB0byB1c2Vyc3BhY2UgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fc2VuZF93ZXZlbnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm47CisKKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIElSUV9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVEJTU0lELAorCQkJICAgICAgRVRIX0FMRU4sIE5VTEwsIHdycXUuYXBfYWRkci5zYV9kYXRhKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybjsKKworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTMwNyw2ICsxMjAwLDkgQEAKIAkJdTE2IG5ld3N0YXR1czsKIAkJaW50IGNvbm5lY3RlZDsKIAorCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCQlicmVhazsKKwogCQlpZiAobGVuICE9IHNpemVvZihsaW5rc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuZXhwZWN0ZWQgc2l6ZSBmb3IgbGlua3N0YXR1cyBmcmFtZSAoJWQgYnl0ZXMpXG4iLAogCQkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKQEAgLTEzMTksNiArMTIxNSwxNSBAQAogCQkJYnJlYWs7CiAJCW5ld3N0YXR1cyA9IGxlMTZfdG9fY3B1KGxpbmtzdGF0dXMubGlua3N0YXR1cyk7CiAKKwkJLyogU3ltYm9sIGZpcm13YXJlIHVzZXMgIm91dCBvZiByYW5nZSIgdG8gc2lnbmFsIHRoYXQKKwkJICogdGhlIGhvc3RzY2FuIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQuICAqLworCQlpZiAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX09VVF9PRl9SQU5HRSAmJgorCQkgICAgcHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX1NZTUJPTCAmJgorCQkgICAgcHJpdi0+aGFzX2hvc3RzY2FuICYmIHByaXYtPnNjYW5faW5wcm9ncmVzcykgeworCQkJaGVybWVzX2lucXVpcmUoaHcsIEhFUk1FU19JTlFfSE9TVFNDQU5fU1lNQk9MKTsKKwkJCWJyZWFrOworCQl9CisKIAkJY29ubmVjdGVkID0gKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQpCiAJCQl8fCAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX0NIQU5HRSkKIAkJCXx8IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0UpOwpAQCAtMTMyOCwxMiArMTIzMyw4OSBAQAogCQllbHNlIGlmICghaWdub3JlX2Rpc2Nvbm5lY3QpCiAJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCi0JCWlmIChuZXdzdGF0dXMgIT0gcHJpdi0+bGFzdF9saW5rc3RhdHVzKQorCQlpZiAobmV3c3RhdHVzICE9IHByaXYtPmxhc3RfbGlua3N0YXR1cykgeworCQkJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gbmV3c3RhdHVzOwogCQkJcHJpbnRfbGlua3N0YXR1cyhkZXYsIG5ld3N0YXR1cyk7Ci0KLQkJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gbmV3c3RhdHVzOworCQkJLyogVGhlIGluZm8gZnJhbWUgY29udGFpbnMgb25seSBvbmUgd29yZCB3aGljaCBpcyB0aGUKKwkJCSAqIHN0YXR1cyAoc2VlIGhlcm1lcy5oKS4gVGhlIHN0YXR1cyBpcyBwcmV0dHkgYm9yaW5nCisJCQkgKiBpbiBpdHNlbGYsIHRoYXQncyB3aHkgd2UgZXhwb3J0IHRoZSBuZXcgQlNTSUQuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPndldmVudF93b3JrKTsKKwkJfQogCX0KIAlicmVhazsKKwljYXNlIEhFUk1FU19JTlFfU0NBTjoKKwkJaWYgKCFwcml2LT5zY2FuX2lucHJvZ3Jlc3MgJiYgcHJpdi0+YnNzaWRfZml4ZWQgJiYKKwkJICAgIHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9JTlRFUlNJTCkgeworCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+am9pbl93b3JrKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgSEVSTUVTX0lOUV9IT1NUU0NBTjoKKwljYXNlIEhFUk1FU19JTlFfSE9TVFNDQU5fU1lNQk9MOiB7CisJCS8qIFJlc3VsdCBvZiBhIHNjYW5uaW5nLiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAorCQkgKiBjZWxscyBpbiB0aGUgdmljaW5pdHkgLSBKZWFuIElJICovCisJCXVuaW9uIGl3cmVxX2RhdGEJd3JxdTsKKwkJdW5zaWduZWQgY2hhciAqYnVmOworCisJCS8qIFNhbml0eSBjaGVjayAqLworCQlpZiAobGVuID4gNDA5NikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNjYW4gcmVzdWx0cyB0b28gbGFyZ2UgKCVkIGJ5dGVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGFyZSBhIHN0cmljdCBwcm9kdWNlci4gSWYgdGhlIHByZXZpb3VzIHNjYW4gcmVzdWx0cworCQkgKiBoYXZlIG5vdCBiZWVuIGNvbnN1bWVkLCB3ZSBqdXN0IGhhdmUgdG8gZHJvcCB0aGlzCisJCSAqIGZyYW1lLiBXZSBjYW4ndCByZW1vdmUgdGhlIHByZXZpb3VzIHJlc3VsdHMgb3Vyc2VsdmVzLAorCQkgKiB0aGF0IHdvdWxkIGJlICp2ZXJ5KiByYWN5Li4uIEplYW4gSUkgKi8KKwkJaWYgKHByaXYtPnNjYW5fcmVzdWx0ICE9IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcmV2aW91cyBzY2FuIHJlc3VsdHMgbm90IGNvbnN1bWVkLCBkcm9wcGluZyBpbmZvIGZyYW1lLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQWxsb2NhdGUgYnVmZmVyIGZvciByZXN1bHRzICovCisJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJLyogTm8gbWVtb3J5LCBzbyBjYW4ndCBwcmludGsoKS4uLiAqLworCQkJYnJlYWs7CisKKwkJLyogUmVhZCBzY2FuIGRhdGEgKi8KKwkJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgKHZvaWQgKikgYnVmLCBsZW4sCisJCQkJICAgICAgIGluZm9maWQsIHNpemVvZihpbmZvKSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworI2lmZGVmIE9SSU5PQ09fREVCVUcKKwkJeworCQkJaW50CWk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiU2NhbiByZXN1bHQgWyUwMlgiLCBidWZbMF0pOworCQkJZm9yKGkgPSAxOyBpIDwgKGxlbiAqIDIpOyBpKyspCisJCQkJcHJpbnRrKCI6JTAyWCIsIGJ1ZltpXSk7CisJCQlwcmludGsoIl1cbiIpOworCQl9CisjZW5kaWYJLyogT1JJTk9DT19ERUJVRyAqLworCisJCS8qIEFsbG93IHRoZSBjbGllbnRzIHRvIGFjY2VzcyB0aGUgcmVzdWx0cyAqLworCQlwcml2LT5zY2FuX2xlbiA9IGxlbjsKKwkJcHJpdi0+c2Nhbl9yZXN1bHQgPSBidWY7CisKKwkJLyogU2VuZCBhbiBlbXB0eSBldmVudCB0byB1c2VyIHNwYWNlLgorCQkgKiBXZSBkb24ndCBzZW5kIHRoZSByZWNlaXZlZCBkYXRhIG9uIHRoZSBldmVudCBiZWNhdXNlCisJCSAqIGl0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZG8gY29tcGxleCB0cmFuc2NvZGluZywgYW5kCisJCSAqIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIHdvcmsgZG9uZSBpbiB0aGUgaXJxIGhhbmRsZXIKKwkJICogVXNlIGEgcmVxdWVzdCB0byBleHRyYWN0IHRoZSBkYXRhIC0gSmVhbiBJSSAqLworCQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKKwkJd3JxdS5kYXRhLmZsYWdzID0gMDsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CisJfQorCWJyZWFrOworCWNhc2UgSEVSTUVTX0lOUV9TRUNfU1RBVF9BR0VSRToKKwkJLyogU2VjdXJpdHkgc3RhdHVzIChBZ2VyZSBzcGVjaWZpYykgKi8KKwkJLyogSWdub3JlIHRoaXMgZnJhbWUgZm9yIG5vdyAqLworCQlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX0FHRVJFKQorCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5rbm93biBpbmZvcm1hdGlvbiBmcmFtZSByZWNlaXZlZDogIgogCQkgICAgICAgInR5cGUgMHglMDR4LCBsZW5ndGggJWRcbiIsIGRldi0+bmFtZSwgdHlwZSwgbGVuKTsKQEAgLTE0NzAsNiArMTQ1MiwzNiBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIFNldCBmaXhlZCBBUCBhZGRyZXNzICovCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXRfd2FwKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJvYW1pbmdfZmxhZzsKKwlpbnQgZXJyID0gMDsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisKKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6CisJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCQlpZiAocHJpdi0+YnNzaWRfZml4ZWQpCisJCQlyb2FtaW5nX2ZsYWcgPSAyOworCQllbHNlCisJCQlyb2FtaW5nX2ZsYWcgPSAxOworCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZST0FNSU5HTU9ERSwKKwkJCQkJICAgcm9hbWluZ19mbGFnKTsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJZXJyID0gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNQU5EQVRPUllCU1NJRF9TWU1CT0wsCisJCQkJCSAgJnByaXYtPmRlc2lyZWRfYnNzaWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKwogLyogQ2hhbmdlIHRoZSBXRVAga2V5cyBhbmQvb3IgdGhlIGN1cnJlbnQga2V5cy4gIENhbiBiZSBjYWxsZWQKICAqIGVpdGhlciBmcm9tIF9fb3Jpbm9jb19od19zZXR1cF93ZXAoKSBvciBkaXJlY3RseSBmcm9tCiAgKiBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKCkuICBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgYXNzb2NpYXRpb24KQEAgLTE2NTUsNiArMTY2NywxMyBAQAogCQl9CiAJfQogCisJLyogU2V0IHRoZSBkZXNpcmVkIEJTU0lEICovCisJZXJyID0gX19vcmlub2NvX2h3X3NldF93YXAocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIEFQIGFkZHJlc3NcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQogCS8qIFNldCB0aGUgZGVzaXJlZCBFU1NJRCAqLwogCWlkYnVmLmxlbiA9IGNwdV90b19sZTE2KHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CiAJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihpZGJ1Zi52YWwpKTsKQEAgLTE3OTMsNiArMTgxMiwyMCBAQAogCQl9CiAJfQogCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCS8qIEVuYWJsZSBtb25pdG9yIG1vZGUgKi8KKwkJZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwkJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfVEVTVCB8IAorCQkJCQkgICAgSEVSTUVTX1RFU1RfTU9OSVRPUiwgMCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBtb25pdG9yIG1vZGUgKi8KKwkJZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCQllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9URVNUIHwKKwkJCQkJICAgIEhFUk1FU19URVNUX1NUT1AsIDAsIE5VTEwpOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJLyogU2V0IHByb21pc2N1aXR5IC8gbXVsdGljYXN0Ki8KIAlwcml2LT5wcm9taXNjdW91cyA9IDA7CiAJcHJpdi0+bWNfY291bnQgPSAwOwpAQCAtMTg2OSw1NSArMTkwMiw2IEBACiAJCWRldi0+ZmxhZ3MgJj0gfklGRl9QUk9NSVNDOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29fcmVjb25maWd1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JaWYgKHByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCkgewotCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCXJldHVybiAtRUJVU1k7Ci0JCQotCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBkaXNhYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0gX19vcmlub2NvX3Byb2dyYW1fcmlkcyhkZXYpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byByZWNvbmZpZ3VyZSBjYXJkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0gaGVybWVzX2VuYWJsZV9wb3J0KGh3LCAwKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZW5hYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0gb3V0OgotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyBpbnN0ZWFkLi4uXG4iLCBkZXYtPm5hbWUpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKLQkJZXJyID0gMDsKLQl9Ci0KLQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwotCXJldHVybiBlcnI7Ci0KLX0KLQogLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29udGV4dCwgd2l0aG91dCBsb2NrcyBoZWxkIC0gdXNlCiAgKiBzY2hlZHVsZV93b3JrKCkgKi8KIHN0YXRpYyB2b2lkIG9yaW5vY29fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE5NDYsNiArMTkzMCwxMSBAQAogCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAorIAkvKiBTY2FubmluZyBzdXBwb3J0OiBDbGVhbnVwIG9mIGRyaXZlciBzdHJ1Y3QgKi8KKwlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7CisJcHJpdi0+c2Nhbl9yZXN1bHQgPSBOVUxMOworCXByaXYtPnNjYW5faW5wcm9ncmVzcyA9IDA7CisKIAlpZiAocHJpdi0+aGFyZF9yZXNldCkgewogCQllcnIgPSAoKnByaXYtPmhhcmRfcmVzZXQpKHByaXYpOwogCQlpZiAoZXJyKSB7CkBAIC0yMTg0LDYgKzIxNzMsOCBAQAogCQlwcml2LT5oYXNfbXdvID0gKGZpcm12ZXIgPj0gMHg2MDAwMCk7CiAJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4NDAwMjApOyAvKiBEb24ndCB3b3JrIGluIDcuNTIgPyAqLwogCQlwcml2LT5pYnNzX3BvcnQgPSAxOworCQlwcml2LT5oYXNfaG9zdHNjYW4gPSAoZmlybXZlciA+PSAweDgwMDBhKTsKKwkJcHJpdi0+YnJva2VuX21vbml0b3IgPSAoZmlybXZlciA+PSAweDgwMDAwKTsKIAogCQkvKiBUZXN0ZWQgd2l0aCBBZ2VyZSBmaXJtd2FyZSA6CiAJCSAqCTEuMTYgOyA0LjA4IDsgNC41MiA7IDYuMDQgOyA2LjE2IDsgNy4yOCA9PiBKZWFuIElJCkBAIC0yMjI5LDYgKzIyMjAsOCBAQAogCQlwcml2LT5pYnNzX3BvcnQgPSA0OwogIAkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gKGZpcm12ZXIgPT0gMHgyNTAxMykgfHwKICAJCQkJCSAgIChmaXJtdmVyID49IDB4MzAwMDAgJiYgZmlybXZlciA8PSAweDMxMDAwKTsKKwkJcHJpdi0+aGFzX2hvc3RzY2FuID0gKGZpcm12ZXIgPj0gMHgzMTAwMSkgfHwKKwkJCQkgICAgIChmaXJtdmVyID49IDB4MjkwNTcgJiYgZmlybXZlciA8IDB4MzAwMDApOwogCQkvKiBUZXN0ZWQgd2l0aCBJbnRlbCBmaXJtd2FyZSA6IDB4MjAwMTUgPT4gSmVhbiBJSSAqLwogCQkvKiBUZXN0ZWQgd2l0aCAzQ29tIGZpcm13YXJlIDogMHgxNTAxMiAmIDB4MjIwMDEgPT4gSmVhbiBJSSAqLwogCQlicmVhazsKQEAgLTIyNDgsNiArMjI0MSw3IEBACiAJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHgwMDA3MDApOyAvKiBGSVhNRSAqLwogCQlwcml2LT5oYXNfYmlnX3dlcCA9IHByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDAwMDgwMCk7CiAJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4MDAwNzAwKTsKKwkJcHJpdi0+aGFzX2hvc3RzY2FuID0gKGZpcm12ZXIgPj0gMHgwMTAzMDEpOwogCiAJCWlmIChmaXJtdmVyID49IDB4MDAwODAwKQogCQkJcHJpdi0+aWJzc19wb3J0ID0gMDsKQEAgLTI0NTYsOCArMjQ1MCw5IEBACiAJZGV2LT50eF90aW1lb3V0ID0gb3Jpbm9jb190eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsgLyogMSBzZWNvbmQgdGltZW91dCAqLwogCWRldi0+Z2V0X3N0YXRzID0gb3Jpbm9jb19nZXRfc3RhdHM7CisJZGV2LT5ldGh0b29sX29wcyA9ICZvcmlub2NvX2V0aHRvb2xfb3BzOwogCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gb3Jpbm9jb19nZXRfd2lyZWxlc3Nfc3RhdHM7Ci0JZGV2LT5kb19pb2N0bCA9IG9yaW5vY29faW9jdGw7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmb3Jpbm9jb19oYW5kbGVyX2RlZjsKIAlkZXYtPmNoYW5nZV9tdHUgPSBvcmlub2NvX2NoYW5nZV9tdHU7CiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBvcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdDsKIAkvKiB3ZSB1c2UgdGhlIGRlZmF1bHQgZXRoX21hY19hZGRyIGZvciBzZXR0aW5nIHRoZSBNQUMgYWRkciAqLwpAQCAtMjQ3Myw2ICsyNDY4LDggQEAKIAkJCQkgICAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvdWNoZXMgdGhlCiAJCQkJICAgKiBoYXJkd2FyZSAqLwogCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19yZXNldCwgZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPmpvaW5fd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19qb2luX2FwLCBkZXYpOworCUlOSVRfV09SSygmcHJpdi0+d2V2ZW50X3dvcmssICh2b2lkICgqKSh2b2lkICopKW9yaW5vY29fc2VuZF93ZXZlbnRzLCBkZXYpOwogCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSAweGZmZmY7CkBAIC0yNDgzLDYgKzI0ODAsOSBAQAogCiB2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJa2ZyZWUocHJpdi0+c2Nhbl9yZXN1bHQpOwogCWZyZWVfbmV0ZGV2KGRldik7CiB9CiAKQEAgLTI0OTAsMjQgKzI0OTAsNiBAQAogLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Jzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCi0JCQkJY2hhciBidWZbRVRIX0FMRU5dKQotewotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKLQlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRCU1NJRCwKLQkJCSAgICAgIEVUSF9BTEVOLCBOVUxMLCBidWYpOwotCi0Jb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgb3Jpbm9jb19od19nZXRfZXNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50ICphY3RpdmUsCiAJCQkJY2hhciBidWZbSVdfRVNTSURfTUFYX1NJWkUrMV0pCiB7CkBAIC0yNjMzLDE0MCArMjYxNSwyNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpycnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBjaGFyICpuYW1lLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZXJyID0gMDsKLQlpbnQgbW9kZTsKLQlzdHJ1Y3QgaXdfcmFuZ2UgcmFuZ2U7CiAJaW50IG51bXJhdGVzOwotCWludCBpLCBrOworCWludCBlcnI7CisKKwllcnIgPSBvcmlub2NvX2h3X2dldF9iaXRyYXRlbGlzdChwcml2LCAmbnVtcmF0ZXMsIE5VTEwsIDApOworCisJaWYgKCFlcnIgJiYgKG51bXJhdGVzID4gMikpCisJCXN0cmNweShuYW1lLCAiSUVFRSA4MDIuMTFiIik7CisJZWxzZQorCQlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExLURTIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyLAorCQkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJycS0+cG9pbnRlciwgc2l6ZW9mKHJhbmdlKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcnJxLT5sZW5ndGggPSBzaXplb2YocmFuZ2UpOworCXN0YXRpYyBjb25zdCB1OCBvZmZfYWRkcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJc3RhdGljIGNvbnN0IHU4IGFueV9hZGRyW10gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIAogCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbW9kZSA9IHByaXYtPml3X21vZGU7CisJLyogRW5hYmxlIGF1dG9tYXRpYyByb2FtaW5nIC0gbm8gc2FuaXR5IGNoZWNrcyBhcmUgbmVlZGVkICovCisJaWYgKG1lbWNtcCgmYXBfYWRkci0+c2FfZGF0YSwgb2ZmX2FkZHIsIEVUSF9BTEVOKSA9PSAwIHx8CisJICAgIG1lbWNtcCgmYXBfYWRkci0+c2FfZGF0YSwgYW55X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCXByaXYtPmJzc2lkX2ZpeGVkID0gMDsKKwkJbWVtc2V0KHByaXYtPmRlc2lyZWRfYnNzaWQsIDAsIEVUSF9BTEVOKTsKKworCQkvKiAib2ZmIiBtZWFucyBrZWVwIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKGFwX2FkZHItPnNhX2RhdGFbMF0gPT0gMCkgeworCQkJX19vcmlub2NvX2h3X3NldF93YXAocHJpdik7CisJCQllcnIgPSAwOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfQUdFUkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEx1Y2VudC9BZ2VyZSBmaXJtd2FyZSBkb2Vzbid0ICIKKwkJICAgICAgICJzdXBwb3J0IG1hbnVhbCByb2FtaW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1hbnVhbCByb2FtaW5nIHN1cHBvcnRlZCBvbmx5IGluICIKKwkJICAgICAgICJtYW5hZ2VkIG1vZGVcbiIsIGRldi0+bmFtZSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJbnRlcnNpbCBmaXJtd2FyZSBoYW5ncyB3aXRob3V0IERlc2lyZWQgRVNTSUQgKi8KKwlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMICYmCisJICAgIHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEZXNpcmVkIEVTU0lEIG11c3QgYmUgc2V0IGZvciAiCisJCSAgICAgICAibWFudWFsIHJvYW1pbmdcbiIsIGRldi0+bmFtZSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGaW5hbGx5LCBlbmFibGUgbWFudWFsIHJvYW1pbmcgKi8KKwlwcml2LT5ic3NpZF9maXhlZCA9IDE7CisJbWVtY3B5KHByaXYtPmRlc2lyZWRfYnNzaWQsICZhcF9hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0d2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsCisJCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVEJTU0lELAorCQkJICAgICAgRVRIX0FMRU4sIE5VTEwsIGFwX2FkZHItPnNhX2RhdGEpOworCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOworCXJldHVybiBlcnI7Cit9CiAKLQkvKiBNdWNoIG9mIHRoaXMgc2hhbWVsZXNzbHkgdGFrZW4gZnJvbSB3dmxhbl9jcy5jLiBObyBpZGVhCi0JICogd2hhdCBpdCBhbGwgbWVhbnMgLWRnaWJzb24gKi8KLQlyYW5nZS53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwotCXJhbmdlLndlX3ZlcnNpb25fc291cmNlID0gMTE7CitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1MzIgKm1vZGUsCisJCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXJhbmdlLm1pbl9ud2lkID0gcmFuZ2UubWF4X253aWQgPSAwOyAvKiBXZSBkb24ndCB1c2UgbndpZHMgKi8KKwlpZiAocHJpdi0+aXdfbW9kZSA9PSAqbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoKm1vZGUpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWlmICghcHJpdi0+aGFzX2lic3MgJiYgIXByaXYtPmhhc19wb3J0MykKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJaWYgKHByaXYtPmJyb2tlbl9tb25pdG9yICYmICFmb3JjZV9tb25pdG9yKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTW9uaXRvciBtb2RlIHN1cHBvcnQgaXMgIgorCQkJICAgICAgICJidWdneSBpbiB0aGlzIGZpcm13YXJlLCBub3QgZW5hYmxpbmdcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKSB7CisJCXByaXYtPml3X21vZGUgPSAqbW9kZTsKKwkJc2V0X3BvcnRfdHlwZShwcml2KTsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdTMyICptb2RlLAorCQkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCSptb2RlID0gcHJpdi0+aXdfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgc3RydWN0IGl3X3BvaW50ICpycnEsCisJCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWludCBudW1yYXRlczsKKwlpbnQgaSwgazsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwlycnEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CiAKIAkvKiBTZXQgYXZhaWxhYmxlIGNoYW5uZWxzL2ZyZXF1ZW5jaWVzICovCi0JcmFuZ2UubnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7CiAJayA9IDA7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CiAJCWlmIChwcml2LT5jaGFubmVsX21hc2sgJiAoMSA8PCBpKSkgewotCQkJcmFuZ2UuZnJlcVtrXS5pID0gaSArIDE7Ci0JCQlyYW5nZS5mcmVxW2tdLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIDEwMDAwMDsKLQkJCXJhbmdlLmZyZXFba10uZSA9IDE7CisJCQlyYW5nZS0+ZnJlcVtrXS5pID0gaSArIDE7CisJCQlyYW5nZS0+ZnJlcVtrXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVtrXS5lID0gMTsKIAkJCWsrKzsKIAkJfQogCQkKIAkJaWYgKGsgPj0gSVdfTUFYX0ZSRVFVRU5DSUVTKQogCQkJYnJlYWs7CiAJfQotCXJhbmdlLm51bV9mcmVxdWVuY3kgPSBrOworCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gazsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOwogCi0JcmFuZ2Uuc2Vuc2l0aXZpdHkgPSAzOworCWlmIChwcml2LT5oYXNfd2VwKSB7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gT1JJTk9DT19NQVhfS0VZUzsKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSBTTUFMTF9LRVlfU0laRTsKKwkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CiAKLQlpZiAoKG1vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKHByaXYtPnNweV9udW1iZXIgPT0gMCkpeworCQlpZiAocHJpdi0+aGFzX2JpZ193ZXApIHsKKwkJCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gTEFSR0VfS0VZX1NJWkU7CisJCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwkJfQorCX0KKworCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAocHJpdi0+c3B5X251bWJlciA9PSAwKSl7CiAJCS8qIFF1YWxpdHkgc3RhdHMgbWVhbmluZ2xlc3MgaW4gYWQtaG9jIG1vZGUgKi8KLQkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7Ci0JCXJhbmdlLm1heF9xdWFsLmxldmVsID0gMDsKLQkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAwOwotCQlyYW5nZS5hdmdfcXVhbC5xdWFsID0gMDsKLQkJcmFuZ2UuYXZnX3F1YWwubGV2ZWwgPSAwOwotCQlyYW5nZS5hdmdfcXVhbC5ub2lzZSA9IDA7CiAJfSBlbHNlIHsKLQkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDB4OGIgLSAweDJmOwotCQlyYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDB4MmYgLSAweDk1IC0gMTsKLQkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAweDJmIC0gMHg5NSAtIDE7CisJCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMHg4YiAtIDB4MmY7CisJCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDB4MmYgLSAweDk1IC0gMTsKKwkJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMHgyZiAtIDB4OTUgLSAxOwogCQkvKiBOZWVkIHRvIGdldCBiZXR0ZXIgdmFsdWVzICovCi0JCXJhbmdlLmF2Z19xdWFsLnF1YWwgPSAweDI0OwotCQlyYW5nZS5hdmdfcXVhbC5sZXZlbCA9IDB4QzI7Ci0JCXJhbmdlLmF2Z19xdWFsLm5vaXNlID0gMHg5RTsKKwkJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAweDI0OworCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAweEMyOworCQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAweDlFOwogCX0KIAogCWVyciA9IG9yaW5vY29faHdfZ2V0X2JpdHJhdGVsaXN0KHByaXYsICZudW1yYXRlcywKLQkJCQkJIHJhbmdlLmJpdHJhdGUsIElXX01BWF9CSVRSQVRFUyk7CisJCQkJCSByYW5nZS0+Yml0cmF0ZSwgSVdfTUFYX0JJVFJBVEVTKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCXJhbmdlLm51bV9iaXRyYXRlcyA9IG51bXJhdGVzOwotCQorCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBudW1yYXRlczsKKwogCS8qIFNldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBtYXggVENQIHRocm91Z2hwdXQgaW4gYml0L3MgdGhhdCB3ZSBjYW4KIAkgKiBleHBlY3QgdXNpbmcgdGhpcyBpbnRlcmZhY2UuIE1heSBiZSB1c2UgZm9yIFFvUyBzdHVmZi4uLgogCSAqIEplYW4gSUkgKi8KLQlpZihudW1yYXRlcyA+IDIpCi0JCXJhbmdlLnRocm91Z2hwdXQgPSA1ICogMTAwMCAqIDEwMDA7CS8qIH41IE1iL3MgKi8KKwlpZiAobnVtcmF0ZXMgPiAyKQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDUgKiAxMDAwICogMTAwMDsJLyogfjUgTWIvcyAqLwogCWVsc2UKLQkJcmFuZ2UudGhyb3VnaHB1dCA9IDEuNSAqIDEwMDAgKiAxMDAwOwkvKiB+MS41IE1iL3MgKi8KKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSAxLjUgKiAxMDAwICogMTAwMDsJLyogfjEuNSBNYi9zICovCiAKLQlyYW5nZS5taW5fcnRzID0gMDsKLQlyYW5nZS5tYXhfcnRzID0gMjM0NzsKLQlyYW5nZS5taW5fZnJhZyA9IDI1NjsKLQlyYW5nZS5tYXhfZnJhZyA9IDIzNDY7CisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKIAotCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQotCQlyZXR1cm4gLUVCVVNZOwotCWlmIChwcml2LT5oYXNfd2VwKSB7Ci0JCXJhbmdlLm1heF9lbmNvZGluZ190b2tlbnMgPSBPUklOT0NPX01BWF9LRVlTOworCXJhbmdlLT5taW5fcG1wID0gMDsKKwlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1MDAwOworCXJhbmdlLT5taW5fcG10ID0gMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9VTklDQVNUX1I7CiAKLQkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVswXSA9IFNNQUxMX0tFWV9TSVpFOwotCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOwotCi0JCWlmIChwcml2LT5oYXNfYmlnX3dlcCkgewotCQkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVsxXSA9IExBUkdFX0tFWV9TSVpFOwotCQkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMjsKLQkJfQotCX0gZWxzZSB7Ci0JCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDA7Ci0JCXJhbmdlLm1heF9lbmNvZGluZ190b2tlbnMgPSAwOwotCX0KLQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwotCQkKLQlyYW5nZS5taW5fcG1wID0gMDsKLQlyYW5nZS5tYXhfcG1wID0gNjU1MzUwMDA7Ci0JcmFuZ2UubWluX3BtdCA9IDA7Ci0JcmFuZ2UubWF4X3BtdCA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCi0JcmFuZ2UucG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOwotCXJhbmdlLnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7Ci0JcmFuZ2UucG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9VTklDQVNUX1I7Ci0KLQlyYW5nZS5udW1fdHhwb3dlciA9IDE7Ci0JcmFuZ2UudHhwb3dlclswXSA9IDE1OyAvKiAxNWRCbSAqLwotCXJhbmdlLnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKLQotCXJhbmdlLnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOwotCXJhbmdlLnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7Ci0JcmFuZ2Uucl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7Ci0JcmFuZ2UubWluX3JldHJ5ID0gMDsKLQlyYW5nZS5tYXhfcmV0cnkgPSA2NTUzNTsJLyogPz8/ICovCi0JcmFuZ2UubWluX3JfdGltZSA9IDA7Ci0JcmFuZ2UubWF4X3JfdGltZSA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCi0KLQlpZiAoY29weV90b191c2VyKHJycS0+cG9pbnRlciwgJnJhbmdlLCBzaXplb2YocmFuZ2UpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CS8qID8/PyAqLworCXJhbmdlLT5taW5fcl90aW1lID0gMDsKKwlyYW5nZS0+bWF4X3JfdGltZSA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCiAKIAlUUkFDRV9FWElUKGRldi0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsCisJCQkJICAgICBjaGFyICprZXlidWYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKQEAgLTI3NzQsOCArMjg4Nyw3IEBACiAJaW50IGVuYWJsZSA9IHByaXYtPndlcF9vbjsKIAlpbnQgcmVzdHJpY3RlZCA9IHByaXYtPndlcF9yZXN0cmljdDsKIAl1MTYgeGxlbiA9IDA7Ci0JaW50IGVyciA9IDA7Ci0JY2hhciBrZXlidWZbT1JJTk9DT19NQVhfS0VZX1NJWkVdOworCWludCBlcnIgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghIHByaXYtPmhhc193ZXApCkBAIC0yNzg4LDkgKzI5MDAsNiBAQAogCiAJCWlmICggKGVycS0+bGVuZ3RoID4gU01BTExfS0VZX1NJWkUpICYmICFwcml2LT5oYXNfYmlnX3dlcCApCiAJCQlyZXR1cm4gLUUyQklHOwotCQkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGtleWJ1ZiwgZXJxLT5wb2ludGVyLCBlcnEtPmxlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKQEAgLTI4NjQsMTIgKzI5NzMsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwKKwkJCQkgICAgIGNoYXIgKmtleWJ1ZikKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwogCXUxNiB4bGVuID0gMDsKLQljaGFyIGtleWJ1ZltPUklOT0NPX01BWF9LRVlfU0laRV07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghIHByaXYtPmhhc193ZXApCkBAIC0yODk4LDUxICszMDA5LDQ3IEBACiAJbWVtY3B5KGtleWJ1ZiwgcHJpdi0+a2V5c1tpbmRleF0uZGF0YSwgT1JJTk9DT19NQVhfS0VZX1NJWkUpOwogCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQotCWlmIChlcnEtPnBvaW50ZXIpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGtleWJ1ZiwgeGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsCisJCQkJICBjaGFyICplc3NpZGJ1ZikKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBOb3RlIDogRVNTSUQgaXMgaWdub3JlZCBpbiBBZC1Ib2MgZGVtbyBtb2RlLCBidXQgd2UgY2FuIHNldCBpdAogCSAqIGFueXdheS4uLiAtIEplYW4gSUkgKi8KIAotCW1lbXNldCgmZXNzaWRidWYsIDAsIHNpemVvZihlc3NpZGJ1ZikpOwotCi0JaWYgKGVycS0+ZmxhZ3MpIHsKLQkJLyogaXdjb25maWcgaW5jbHVkZXMgdGhlIE5VTCBpbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAqLwotCQlpZiAoZXJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSsxKQotCQkJcmV0dXJuIC1FMkJJRzsKLQkJCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmZXNzaWRidWYsIGVycS0+cG9pbnRlciwgZXJxLT5sZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKLQl9CisJLyogSHVtLi4uIFNob3VsZCBub3QgdXNlIFdpcmVsZXNzIEV4dGVuc2lvbiBjb25zdGFudCAobWF5IGNoYW5nZSksCisJICogc2hvdWxkIHVzZSBvdXIgb3duLi4uIC0gSmVhbiBJSSAqLworCWlmIChlcnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUUyQklHOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CiAKLQltZW1jcHkocHJpdi0+ZGVzaXJlZF9lc3NpZCwgZXNzaWRidWYsIHNpemVvZihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisJLyogTlVMTCB0aGUgc3RyaW5nIChmb3IgTlVMTCB0ZXJtaW5hdGlvbiAmIEVTU0lEID0gQU5ZKSAtIEplYW4gSUkgKi8KKwltZW1zZXQocHJpdi0+ZGVzaXJlZF9lc3NpZCwgMCwgc2l6ZW9mKHByaXYtPmRlc2lyZWRfZXNzaWQpKTsKKworCS8qIElmIG5vdCBBTlksIGdldCB0aGUgbmV3IEVTU0lEICovCisJaWYgKGVycS0+ZmxhZ3MpIHsKKwkJbWVtY3B5KHByaXYtPmRlc2lyZWRfZXNzaWQsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCk7CisJfQogCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCXJldHVybiAwOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLAorCQkJCSAgY2hhciAqZXNzaWRidWYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JY2hhciBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKIAlpbnQgYWN0aXZlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yOTU2LDUxICszMDYzLDQ2IEBACiAJfSBlbHNlIHsKIAkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCQlyZXR1cm4gLUVCVVNZOwotCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihlc3NpZGJ1ZikpOworCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CiAJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAJfQogCiAJZXJxLT5mbGFncyA9IDE7CiAJZXJxLT5sZW5ndGggPSBzdHJsZW4oZXNzaWRidWYpICsgMTsKLQlpZiAoZXJxLT5wb2ludGVyKQotCQlpZiAoY29weV90b191c2VyKGVycS0+cG9pbnRlciwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwogCiAJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOwogCQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRuaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wb2ludCAqbnJxLAorCQkJCSBjaGFyICpuaWNrYnVmKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWNoYXIgbmlja2J1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG5ycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCiAJCXJldHVybiAtRTJCSUc7CiAKLQltZW1zZXQobmlja2J1ZiwgMCwgc2l6ZW9mKG5pY2tidWYpKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihuaWNrYnVmLCBucnEtPnBvaW50ZXIsIG5ycS0+bGVuZ3RoKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQluaWNrYnVmW25ycS0+bGVuZ3RoXSA9ICdcMCc7Ci0JCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CiAKLQltZW1jcHkocHJpdi0+bmljaywgbmlja2J1Ziwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwltZW1zZXQocHJpdi0+bmljaywgMCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwltZW1jcHkocHJpdi0+bmljaywgbmlja2J1ZiwgbnJxLT5sZW5ndGgpOwogCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCXJldHVybiAwOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRuaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqbnJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldG5pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpucnEsCisJCQkJIGNoYXIgKm5pY2tidWYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JY2hhciBuaWNrYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKQEAgLTMwMTEsMjMgKzMxMTMsMjIgQEAKIAogCW5ycS0+bGVuZ3RoID0gc3RybGVuKG5pY2tidWYpKzE7CiAKLQlpZiAoY29weV90b191c2VyKG5ycS0+cG9pbnRlciwgbmlja2J1Ziwgc2l6ZW9mKG5pY2tidWYpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X2ZyZXEgKmZycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19mcmVxICpmcnEsCisJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBjaGFuID0gLTE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogCi0JLyogV2UgY2FuIG9ubHkgdXNlIHRoaXMgaW4gQWQtSG9jIGRlbW8gbW9kZSB0byBzZXQgdGhlIG9wZXJhdGluZwotCSAqIGZyZXF1ZW5jeSwgb3IgaW4gSUJTUyBtb2RlIHRvIHNldCB0aGUgZnJlcXVlbmN5IHdoZXJlIHRoZSBJQlNTCi0JICogd2lsbCBiZSBjcmVhdGVkIC0gSmVhbiBJSSAqLwotCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfQURIT0MpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBJbiBpbmZyYXN0cnVjdHVyZSBtb2RlIHRoZSBBUCBzZXRzIHRoZSBjaGFubmVsICovCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWlmICggKGZycS0+ZSA9PSAwKSAmJiAoZnJxLT5tIDw9IDEwMDApICkgewogCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCkBAIC0zMDUxLDEzICszMTUyLDQ0IEBACiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKKwogCXByaXYtPmNoYW5uZWwgPSBjaGFuOworCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkvKiBGYXN0IGNoYW5uZWwgY2hhbmdlIC0gbm8gY29tbWl0IGlmIHN1Y2Nlc3NmdWwgKi8KKwkJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCQllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9URVNUIHwKKwkJCQkJICAgIEhFUk1FU19URVNUX1NFVF9DSEFOTkVMLAorCQkJCQljaGFuLCBOVUxMKTsKKwl9CiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19mcmVxICpmcnEsCisJCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0bXA7CisKKwkvKiBMb2NraW5nIGRvbmUgaW4gdGhlcmUgKi8KKwl0bXAgPSBvcmlub2NvX2h3X2dldF9mcmVxKHByaXYpOworCWlmICh0bXAgPCAwKSB7CisJCXJldHVybiB0bXA7CisJfQorCisJZnJxLT5tID0gdG1wOworCWZycS0+ZSA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpzcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnNycSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwpAQCAtMzA4Myw3ICszMjE1LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqc3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICpzcnEsCisJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCB2YWwgPSBzcnEtPnZhbHVlOwpAQCAtMzEwMCwxMCArMzIzNSwxMyBAQAogCXByaXYtPmFwX2RlbnNpdHkgPSB2YWw7CiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCXJldHVybiAwOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwKKwkJCQljaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgdmFsID0gcnJxLT52YWx1ZTsKQEAgLTMxMjEsMTMgKzMyNTksMzAgQEAKIAlwcml2LT5ydHNfdGhyZXNoID0gdmFsOwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwKKwkJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJycS0+dmFsdWUgPSBwcml2LT5ydHNfdGhyZXNoOworCXJycS0+ZGlzYWJsZWQgPSAocnJxLT52YWx1ZSA9PSAyMzQ3KTsKKwlycnEtPmZpeGVkID0gMTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqZnJxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKQEAgLTMxNTksMTEgKzMzMTQsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqZnJxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAl1MTYgdmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTMxOTYsMTAgKzMzNTQsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqcnJxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZXJyID0gMDsKIAlpbnQgcmF0ZW1vZGUgPSAtMTsKIAlpbnQgYml0cmF0ZTsgLyogMTAwcyBvZiBraWxvYml0cyAqLwogCWludCBpOwpAQCAtMzIzNSwxMCArMzM5NSwxMyBAQAogCXByaXYtPmJpdHJhdGVtb2RlID0gcmF0ZW1vZGU7CiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwpAQCAtMzMwMywxMCArMzQ2NiwxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnBycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wYXJhbSAqcHJxLAorCQkJCSAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCkBAIC0zMzU1LDcgKzM1MjEsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpwcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnBycSwKKwkJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKQEAgLTM0MDMsNyArMzU3MiwxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wYXJhbSAqcnJxLAorCQkJCSAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwpAQCAtMzQ1NCwxMCArMzYyNiwzOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdm9pZCAqd3JxdSwKKwkJCSAgICAgICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCisJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChpbmZvLT5jbWQgPT0gKFNJT0NJV0ZJUlNUUFJJViArIDB4MSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGb3JjaW5nIHJlc2V0IVxuIiwgZGV2LT5uYW1lKTsKKworCQkvKiBGaXJtd2FyZSByZXNldCAqLworCQlvcmlub2NvX3Jlc2V0KGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGb3JjZSBzY2hlZHVsaW5nIHJlc2V0IVxuIiwgZGV2LT5uYW1lKTsKKworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgdm9pZCAqd3JxdSwKKwkJCQkgICAgIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9ICooIChpbnQgKikgZXh0cmEgKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCkBAIC0zNDY5LDI4ICszNjY5LDI4IEBACiAJc2V0X3BvcnRfdHlwZShwcml2KTsKIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgdm9pZCAqd3JxdSwKKwkJCQkgICAgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJcmV0dXJuIC1FQlVTWTsKKwlpbnQgKnZhbCA9IChpbnQgKikgZXh0cmE7CiAKIAkqdmFsID0gcHJpdi0+aWJzc19wb3J0OwotCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHBvcnQzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHBvcnQzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgdm9pZCAqd3JxdSwKKwkJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJaW50IHZhbCA9ICooIChpbnQgKikgZXh0cmEgKTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zNTE5LDUxICszNzE5LDEzMSBAQAogCQllcnIgPSAtRUlOVkFMOwogCX0KIAotCWlmICghIGVycikKKwlpZiAoISBlcnIpIHsKIAkJLyogQWN0dWFsbHkgdXBkYXRlIHRoZSBtb2RlIHdlIGFyZSB1c2luZyAqLwogCQlzZXRfcG9ydF90eXBlKHByaXYpOworCQllcnIgPSAtRUlOUFJPR1JFU1M7CisJfQogCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHZvaWQgKndycXUsCisJCQkJICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKwlpbnQgKnZhbCA9IChpbnQgKikgZXh0cmE7CisKKwkqdmFsID0gcHJpdi0+cHJlZmVyX3BvcnQzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB2b2lkICp3cnF1LAorCQkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmFsOworCisJaWYgKCEgcHJpdi0+aGFzX3ByZWFtYmxlKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiA4MDIuMTFiIGhhcyByZWNlbnRseSBkZWZpbmVkIHNvbWUgc2hvcnQgcHJlYW1ibGUuCisJICogQmFzaWNhbGx5LCB0aGUgUGh5IGhlYWRlciBoYXMgYmVlbiByZWR1Y2VkIGluIHNpemUuCisJICogVGhpcyBpbmNyZWFzZSBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBhdCBoaWdoIHJhdGVzCisJICogKHRoZSBwcmVhbWJsZSBpcyB0cmFuc21pdHRlZCBhdCAxTWIvcyksIHVuZm9ydHVuYXRlbHkKKwkgKiB0aGlzIGdpdmUgY29tcGF0aWJpbGl0eSB0cm91Ymxlcy4uLiAtIEplYW4gSUkgKi8KKwl2YWwgPSAqKCAoaW50ICopIGV4dHJhICk7CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCSp2YWwgPSBwcml2LT5wcmVmZXJfcG9ydDM7CisJaWYgKHZhbCkKKwkJcHJpdi0+cHJlYW1ibGUgPSAxOworCWVsc2UKKwkJcHJpdi0+cHJlYW1ibGUgPSAwOworCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRwcmVhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHZvaWQgKndycXUsCisJCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgKnZhbCA9IChpbnQgKikgZXh0cmE7CisKKwlpZiAoISBwcml2LT5oYXNfcHJlYW1ibGUpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCSp2YWwgPSBwcml2LT5wcmVhbWJsZTsKIAlyZXR1cm4gMDsKIH0KIAorLyogaW9jdGwgaW50ZXJmYWNlIHRvIGhlcm1lc19yZWFkX2x0digpCisgKiBUbyB1c2Ugd2l0aCBpd3ByaXYsIHBhc3MgdGhlIFJJRCBhcyB0aGUgdG9rZW4gYXJndW1lbnQsIGUuZy4KKyAqIGl3cHJpdiBnZXRfcmlkIFsweGZjMDBdCisgKiBBdCBsZWFzdCBXaXJlbGVzcyBUb29scyAyNSBpcyByZXF1aXJlZCB0byB1c2UgaXdwcml2LgorICogRm9yIFdpcmVsZXNzIFRvb2xzIDI1IGFuZCAyNiBhcHBlbmQgImR1bW15IiBhcmUgdGhlIGVuZC4gKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwKKwkJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IHJpZCA9IGRhdGEtPmZsYWdzOworCXUxNiBsZW5ndGg7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSXQncyBhICJnZXQiIGZ1bmN0aW9uLCBidXQgd2UgZG9uJ3Qgd2FudCB1c2VycyB0byBhY2Nlc3MgdGhlCisJICogV0VQIGtleSBhbmQgb3RoZXIgcmF3IGZpcm13YXJlIGRhdGEgKi8KKwlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHJpZCA8IDB4ZmMwMCB8fCByaWQgPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCByaWQsIE1BWF9SSURfTEVOLCAmbGVuZ3RoLAorCQkJICAgICAgZXh0cmEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZGF0YS0+bGVuZ3RoID0gbWluX3QodTE2LCBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKGxlbmd0aCksCisJCQkgICAgIE1BWF9SSURfTEVOKTsKKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKIC8qIFNweSBpcyB1c2VkIGZvciBsaW5rIHF1YWxpdHkvc3RyZW5ndGggbWVhc3VyZW1lbnRzIGluIEFkLUhvYyBtb2RlCiAgKiBKZWFuIElJICovCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0c3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqc3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BvaW50ICpzcnEsCisJCQkJY2hhciAqZXh0cmEpCisKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgYWRkcmVzc1tJV19NQVhfU1BZXTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwogCWludCBudW1iZXIgPSBzcnEtPmxlbmd0aDsKIAlpbnQgaTsKLQlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogQ2hlY2sgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgKi8KLQlpZiAobnVtYmVyID4gSVdfTUFYX1NQWSkKLQkJcmV0dXJuIC1FMkJJRzsKLQotCS8qIEdldCB0aGUgZGF0YSBpbiB0aGUgZHJpdmVyICovCi0JaWYgKHNycS0+cG9pbnRlcikgewotCQlpZiAoY29weV9mcm9tX3VzZXIoYWRkcmVzcywgc3JxLT5wb2ludGVyLAotCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQogCS8qIE1ha2Ugc3VyZSBub2JvZHkgbWVzcyB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hpbGUgd2UgZG8gKi8KIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM1ODcsMTQgKzM4NjcsMTcgQEAKIAkvKiBOb3csIGxldCB0aGUgb3RoZXJzIHBsYXkgKi8KIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwogCi0JcmV0dXJuIGVycjsKKwkvKiBEbyBOT1QgY2FsbCBjb21taXQgaGFuZGxlciAqLworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0c3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqc3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BvaW50ICpzcnEsCisJCQkJY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07Ci0Jc3RydWN0IGl3X3F1YWxpdHkgc3B5X3N0YXRbSVdfTUFYX1NQWV07CisJc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAlpbnQgbnVtYmVyOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNjAzLDcgKzM4ODYsMTIgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCW51bWJlciA9IHByaXYtPnNweV9udW1iZXI7Ci0JaWYgKChudW1iZXIgPiAwKSAmJiAoc3JxLT5wb2ludGVyKSkgeworCS8qIENyZWF0ZSBhZGRyZXNzIHN0cnVjdCAqLworCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBwcml2LT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOworCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CisJfQorCWlmIChudW1iZXIgPiAwKSB7CiAJCS8qIENyZWF0ZSBhZGRyZXNzIHN0cnVjdCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIHByaXYtPnNweV9hZGRyZXNzW2ldLApAQCAtMzYxNCwzNDQgKzM5MDIsNTAzIEBACiAJCS8qIEluIHRoZW9yeSwgd2Ugc2hvdWxkIGRpc2FibGUgaXJxcyB3aGlsZSBjb3B5aW5nIHRoZSBzdGF0cwogCQkgKiBiZWNhdXNlIHRoZSByeCBwYXRoIG1pZ2h0IHVwZGF0ZSBpdCBpbiB0aGUgbWlkZGxlLi4uCiAJCSAqIEJhaCwgd2hvIGNhcmUgPyAtIEplYW4gSUkgKi8KLQkJbWVtY3B5KCZzcHlfc3RhdCwgcHJpdi0+c3B5X3N0YXQsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX1NQWSk7Ci0JCWZvciAoaT0wOyBpIDwgbnVtYmVyOyBpKyspCi0JCQlwcml2LT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMDsKKwkJbWVtY3B5KGV4dHJhICArIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlciksCisJCSAgICAgICBwcml2LT5zcHlfc3RhdCwgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIG51bWJlcik7CiAJfQorCS8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MuICovCisJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKQorCQlwcml2LT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMDsKIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQkvKiBQdXNoIHN0dWZmIHRvIHVzZXIgc3BhY2UgKi8KIAlzcnEtPmxlbmd0aCA9IG51bWJlcjsKLQlpZihjb3B5X3RvX3VzZXIoc3JxLT5wb2ludGVyLCBhZGRyZXNzLAotCQkJIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYoY29weV90b191c2VyKHNycS0+cG9pbnRlciArIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSpudW1iZXIpLAotCQkJJnNweV9zdGF0LCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogbnVtYmVyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotb3Jpbm9jb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQorLyogVHJpZ2dlciBhIHNjYW4gKGxvb2sgZm9yIG90aGVyIGNlbGxzIGluIHRoZSB2aWNpbml0eSAqLworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICpzcnEsCisJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJxOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wOwotCWludCBjaGFuZ2VkID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKwkvKiBOb3RlIDogeW91IG1heSBoYXZlIHJlYWxpc2VkIHRoYXQsIGFzIHRoaXMgaXMgYSBTRVQgb3BlcmF0aW9uLAorCSAqIHRoaXMgaXMgcHJpdmlsZWRnZWQgYW5kIHRoZXJlZm9yZSBhIG5vcm1hbCB1c2VyIGNhbid0CisJICogcGVyZm9ybSBzY2FubmluZy4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2hpbGUgdGhlIGRldmljZSBwZXJmb3JtIHNjYW5uaW5nLAorCSAqIHRyYWZmaWMgZG9lc24ndCBmbG93LCBzbyBpdCdzIGEgcGVyZmVjdCBEb1MuLi4KKwkgKiBKZWFuIElJICovCiAKLQkvKiBJbiB0aGVvcnksIHdlIGNvdWxkIGFsbG93IG1vc3Qgb2YgdGhlIHRoZSBTRVQgc3R1ZmYgdG8gYmUKLQkgKiBkb25lLiBJbiBwcmFjdGljZSwgdGhlIGxhcHNlIG9mIHRpbWUgYXQgc3RhcnR1cCB3aGVuIHRoZQotCSAqIGNhcmQgaXMgbm90IHJlYWR5IGlzIHZlcnkgc2hvcnQsIHNvIHdoeSBib3RoZXIuLi4gIE5vdGUKLQkgKiB0aGF0IG5ldGlmX2RldmljZV9wcmVzZW50IGlzIGRpZmZlcmVudCBmcm9tIHVwL2Rvd24KLQkgKiAoaWZjb25maWcpLCB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IHlldCB1cCwgaXQgaXMgdXN1YWxseQotCSAqIGFscmVhZHkgcmVhZHkuLi4gIEplYW4gSUkgKi8KLQlpZiAoISBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DR0lXTkFNRToKLQkJc3RyY3B5KHdycS0+dS5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiKTsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU0lPQ0dJV0FQOgotCQl3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCWVyciA9IG9yaW5vY29faHdfZ2V0X2Jzc2lkKHByaXYsIHdycS0+dS5hcF9hZGRyLnNhX2RhdGEpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1JBTkdFOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2UoZGV2LCAmd3JxLT51LmRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV01PREU6Ci0JCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJc3dpdGNoICh3cnEtPnUubW9kZSkgewotCQljYXNlIElXX01PREVfQURIT0M6Ci0JCQlpZiAoISAocHJpdi0+aGFzX2lic3MgfHwgcHJpdi0+aGFzX3BvcnQzKSApCi0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCWVsc2UgewotCQkJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0FESE9DOwotCQkJCWNoYW5nZWQgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV19NT0RFX0lORlJBOgotCQkJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2V0X3BvcnRfdHlwZShwcml2KTsKLQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdNT0RFOgotCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXdycS0+dS5tb2RlID0gcHJpdi0+aXdfbW9kZTsKLQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdFTkNPREU6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0aXdlbmNvZGUoZGV2LCAmd3JxLT51LmVuY29kaW5nKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXRU5DT0RFOgotCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7Ci0JCQllcnIgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCi0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUoZGV2LCAmd3JxLT51LmVuY29kaW5nKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdFU1NJRDoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRlc3NpZChkZXYsICZ3cnEtPnUuZXNzaWQpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdFU1NJRDoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChkZXYsICZ3cnEtPnUuZXNzaWQpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV05JQ0tOOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldG5pY2soZGV2LCAmd3JxLT51LmRhdGEpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdOSUNLTjoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRuaWNrKGRldiwgJndycS0+dS5kYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdGUkVROgotCQl0bXAgPSBvcmlub2NvX2h3X2dldF9mcmVxKHByaXYpOwotCQlpZiAodG1wIDwgMCkgewotCQkJZXJyID0gdG1wOwotCQl9IGVsc2UgewotCQkJd3JxLT51LmZyZXEubSA9IHRtcDsKLQkJCXdycS0+dS5mcmVxLmUgPSAxOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXRlJFUToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRmcmVxKGRldiwgJndycS0+dS5mcmVxKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXU0VOUzoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRzZW5zKGRldiwgJndycS0+dS5zZW5zKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdTRU5TOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHNlbnMoZGV2LCAmd3JxLT51LnNlbnMpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdSVFM6Ci0JCXdycS0+dS5ydHMudmFsdWUgPSBwcml2LT5ydHNfdGhyZXNoOwotCQl3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMjM0Nyk7Ci0JCXdycS0+dS5ydHMuZml4ZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV1JUUzoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRydHMoZGV2LCAmd3JxLT51LnJ0cyk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV0ZSQUc6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhkZXYsICZ3cnEtPnUuZnJhZyk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV0ZSQUc6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhkZXYsICZ3cnEtPnUuZnJhZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXUkFURToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRyYXRlKGRldiwgJndycS0+dS5iaXRyYXRlKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXUkFURToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRyYXRlKGRldiwgJndycS0+dS5iaXRyYXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdQT1dFUjoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRwb3dlcihkZXYsICZ3cnEtPnUucG93ZXIpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdQT1dFUjoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRwb3dlcihkZXYsICZ3cnEtPnUucG93ZXIpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1RYUE9XOgotCQkvKiBUaGUgY2FyZCBvbmx5IHN1cHBvcnRzIG9uZSB0eCBwb3dlciwgc28gdGhpcyBpcyBlYXN5ICovCi0JCXdycS0+dS50eHBvd2VyLnZhbHVlID0gMTU7IC8qIGRCbSAqLwotCQl3cnEtPnUudHhwb3dlci5maXhlZCA9IDE7Ci0JCXdycS0+dS50eHBvd2VyLmRpc2FibGVkID0gMDsKLQkJd3JxLT51LnR4cG93ZXIuZmxhZ3MgPSBJV19UWFBPV19EQk07Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXUkVUUlk6Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1JFVFJZOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHJldHJ5KGRldiwgJndycS0+dS5yZXRyeSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXU1BZOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHNweShkZXYsICZ3cnEtPnUuZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXU1BZOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHNweShkZXYsICZ3cnEtPnUuZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXUFJJVjoKLQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpIHsKLQkJCXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0gewotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgwLCAwLCAwLCAiZm9yY2VfcmVzZXQiIH0sCi0JCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDEsIDAsIDAsICJjYXJkX3Jlc2V0IiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgyLAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAwLCAic2V0X3BvcnQzIiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgzLCAwLAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAiZ2V0X3BvcnQzIiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg0LAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAwLCAic2V0X3ByZWFtYmxlIiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg1LCAwLAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAiZ2V0X3ByZWFtYmxlIiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg2LAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAwLCAic2V0X2lic3Nwb3J0IiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg3LCAwLAotCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCQkJICAiZ2V0X2lic3Nwb3J0IiB9LAotCQkJfTsKLQotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgIAotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgwOiAvKiBmb3JjZV9yZXNldCAqLwotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgxOiAvKiBjYXJkX3Jlc2V0ICovCi0JCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCWVyciA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0JCQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNlIHNjaGVkdWxpbmcgcmVzZXQhXG4iLCBkZXYtPm5hbWUpOwotCi0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgyOiAvKiBzZXRfcG9ydDMgKi8KLQkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQkJZXJyID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHBvcnQzKGRldiwgd3JxKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDM6IC8qIGdldF9wb3J0MyAqLwotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHBvcnQzKGRldiwgd3JxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NDogLyogc2V0X3ByZWFtYmxlICovCi0JCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCWVyciA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogODAyLjExYiBoYXMgcmVjZW50bHkgZGVmaW5lZCBzb21lIHNob3J0IHByZWFtYmxlLgotCQkgKiBCYXNpY2FsbHksIHRoZSBQaHkgaGVhZGVyIGhhcyBiZWVuIHJlZHVjZWQgaW4gc2l6ZS4KLQkJICogVGhpcyBpbmNyZWFzZSBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBhdCBoaWdoIHJhdGVzCi0JCSAqICh0aGUgcHJlYW1ibGUgaXMgdHJhbnNtaXR0ZWQgYXQgMU1iL3MpLCB1bmZvcnR1bmF0ZWx5Ci0JCSAqIHRoaXMgZ2l2ZSBjb21wYXRpYmlsaXR5IHRyb3VibGVzLi4uIC0gSmVhbiBJSSAqLwotCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKLQkJCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7Ci0KLQkJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQotCQkJCXJldHVybiAtRUJVU1k7Ci0JCQlpZiAodmFsKQotCQkJCXByaXYtPnByZWFtYmxlID0gMTsKLQkJCWVsc2UKLQkJCQlwcml2LT5wcmVhbWJsZSA9IDA7Ci0JCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwotCQkJY2hhbmdlZCA9IDE7Ci0JCX0gZWxzZQotCQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDU6IC8qIGdldF9wcmVhbWJsZSAqLwotCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKLQkJCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOwotCi0JCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJKnZhbCA9IHByaXYtPnByZWFtYmxlOwotCQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQkJfSBlbHNlCi0JCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDY6IC8qIHNldF9pYnNzcG9ydCAqLwotCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7Ci0JCQllcnIgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCi0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQoZGV2LCB3cnEpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NzogLyogZ2V0X2lic3Nwb3J0ICovCi0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aWJzc3BvcnQoZGV2LCB3cnEpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FT1BOT1RTVVBQOworCS8qIFNjYW5uaW5nIHdpdGggcG9ydCAwIGRpc2FibGVkIHdvdWxkIGZhaWwgKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSAtRU5FVERPV047CisJCWdvdG8gb3V0OwogCX0KLQkKLQlpZiAoISBlcnIgJiYgY2hhbmdlZCAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJZXJyID0gb3Jpbm9jb19yZWNvbmZpZ3VyZShkZXYpOwotCX0JCQogCi0JVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCS8qIEluIG1vbml0b3IgbW9kZSwgdGhlIHNjYW4gcmVzdWx0cyBhcmUgYWx3YXlzIGVtcHR5LgorCSAqIFByb2JlIHJlc3BvbnNlcyBhcmUgcGFzc2VkIHRvIHRoZSBkcml2ZXIgYXMgcmVjZWl2ZWQKKwkgKiBmcmFtZXMgYW5kIGNvdWxkIGJlIHByb2Nlc3NlZCBpbiBzb2Z0d2FyZS4gKi8KKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KIAorCS8qIE5vdGUgOiBiZWNhdXNlIHdlIGRvbid0IGxvY2sgb3V0IHRoZSBpcnEgaGFuZGxlciwgdGhlIHdheQorCSAqIHdlIGFjY2VzcyBzY2FuIHZhcmlhYmxlcyBpbiBwcml2IGlzIGNyaXRpY2FsLgorCSAqCW8gc2Nhbl9pbnByb2dyZXNzIDogbm90IHRvdWNoZWQgYnkgaXJxIGhhbmRsZXIKKwkgKglvIHNjYW5fbW9kZSA6IG5vdCB0b3VjaGVkIGJ5IGlycSBoYW5kbGVyCisJICoJbyBzY2FuX3Jlc3VsdCA6IGlycSBpcyBzdHJpY3QgcHJvZHVjZXIsIG5vbi1pcnEgaXMgc3RyaWN0CisJICoJCWNvbnN1bWVyLgorCSAqCW8gc2Nhbl9sZW4gOiBzeW5jaHJvbmlzZWQgd2l0aCBzY2FuX3Jlc3VsdAorCSAqIEJlZm9yZSBtb2RpZnlpbmcgYW55dGhpbmcgb24gdGhvc2UgdmFyaWFibGVzLCBwbGVhc2UgdGhpbmsgaGFyZCAhCisJICogSmVhbiBJSSAqLworCisJLyogSWYgdGhlcmUgaXMgc3RpbGwgc29tZSBsZWZ0LW92ZXIgc2NhbiByZXN1bHRzLCBnZXQgcmlkIG9mIGl0ICovCisJaWYgKHByaXYtPnNjYW5fcmVzdWx0ICE9IE5VTEwpIHsKKwkJLyogV2hhdCdzIGxpa2VseSBpcyB0aGF0IGEgY2xpZW50IGRpZCBjcmFzaCBvciB3YXMga2lsbGVkCisJCSAqIGJldHdlZW4gdHJpZ2dlcmluZyB0aGUgc2NhbiByZXF1ZXN0IGFuZCByZWFkaW5nIHRoZQorCQkgKiByZXN1bHRzLCBzbyB3ZSBuZWVkIHRvIHJlc2V0IGV2ZXJ5dGhpbmcuCisJCSAqIFNvbWUgY2xpZW50cyB0aGF0IGFyZSB0b28gc2xvdyBtYXkgc3VmZmVyIGZyb20gdGhhdC4uLgorCQkgKiBKZWFuIElJICovCisJCWtmcmVlKHByaXYtPnNjYW5fcmVzdWx0KTsKKwkJcHJpdi0+c2Nhbl9yZXN1bHQgPSBOVUxMOworCX0KKworCS8qIFNhdmUgZmxhZ3MgKi8KKwlwcml2LT5zY2FuX21vZGUgPSBzcnEtPmZsYWdzOworCisJLyogQWx3YXlzIHRyaWdnZXIgc2Nhbm5pbmcsIGV2ZW4gaWYgaXQncyBpbiBwcm9ncmVzcy4KKwkgKiBUaGlzIHdheSwgaWYgdGhlIGluZm8gZnJhbWUgZ2V0IGxvc3QsIHdlIHdpbGwgcmVjb3ZlciBzb21ld2hhdAorCSAqIGdyYWNlZnVsbHkgIC0gSmVhbiBJSSAqLworCisJaWYgKHByaXYtPmhhc19ob3N0c2NhbikgeworCQlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwkJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgIEhFUk1FU19SSURfQ05GSE9TVFNDQU5fU1lNQk9MLAorCQkJCQkJICAgSEVSTUVTX0hPU1RTQ0FOX1NZTUJPTF9PTkNFIHwKKwkJCQkJCSAgIEhFUk1FU19IT1NUU0NBTl9TWU1CT0xfQkNBU1QpOworCQkJYnJlYWs7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDogeworCQkJdTE2IHJlcVszXTsKKworCQkJcmVxWzBdID0gY3B1X3RvX2xlMTYoMHgzZmZmKTsJLyogQWxsIGNoYW5uZWxzICovCisJCQlyZXFbMV0gPSBjcHVfdG9fbGUxNigweDAwMDEpOwkvKiByYXRlIDEgTWJwcyAqLworCQkJcmVxWzJdID0gMDsJCQkvKiBBbnkgRVNTSUQgKi8KKwkJCWVyciA9IEhFUk1FU19XUklURV9SRUNPUkQoaHcsIFVTRVJfQkFQLAorCQkJCQkJICBIRVJNRVNfUklEX0NORkhPU1RTQ0FOLCAmcmVxKTsKKwkJfQorCQlicmVhazsKKwkJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZTQ0FOU1NJRF9BR0VSRSwKKwkJCQkJCSAgIDApOwkvKiBBbnkgRVNTSUQgKi8KKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX1NDQU4pOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJZXJyID0gaGVybWVzX2lucXVpcmUoaHcsIEhFUk1FU19JTlFfU0NBTik7CisKKwkvKiBPbmUgbW9yZSBjbGllbnQgKi8KKwlpZiAoISBlcnIpCisJCXByaXYtPnNjYW5faW5wcm9ncmVzcyA9IDE7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQogCisvKiBUcmFuc2xhdGUgc2NhbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIGNhcmQgdG8gYSBjYXJkIGluZGVwZW5kYW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSSAqLworc3RhdGljIGlubGluZSBpbnQgb3Jpbm9jb190cmFuc2xhdGVfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgY2hhciAqYnVmZmVyLAorCQkJCQkgY2hhciAqc2NhbiwKKwkJCQkJIGludCBzY2FuX2xlbikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCQlvZmZzZXQ7CQkvKiBJbiB0aGUgc2NhbiBkYXRhICovCisJdW5pb24gaGVybWVzX3NjYW5faW5mbyAqYXRvbTsKKwlpbnQJCQlhdG9tX2xlbjsKKwl1MTYJCQljYXBhYmlsaXRpZXM7CisJdTE2CQkJY2hhbm5lbDsKKwlzdHJ1Y3QgaXdfZXZlbnQJCWl3ZTsJCS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKwljaGFyICoJCQljdXJyZW50X2V2ID0gYnVmZmVyOworCWNoYXIgKgkJCWVuZF9idWYgPSBidWZmZXIgKyBJV19TQ0FOX01BWF9EQVRBOworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQlhdG9tX2xlbiA9IHNpemVvZihzdHJ1Y3QgYWdlcmVfc2Nhbl9hcGluZm8pOworIAkJb2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJLyogTGFjayBvZiBkb2N1bWVudGF0aW9uIG5lY2Vzc2l0YXRlcyB0aGlzIGhhY2suCisJCSAqIERpZmZlcmVudCBmaXJtd2FyZXMgaGF2ZSA2OCBvciA3NiBieXRlIGxvbmcgYXRvbXMuCisJCSAqIFdlIHRyeSBtb2R1bG8gZmlyc3QuICBJZiB0aGUgbGVuZ3RoIGRpdmlkZXMgYnkgYm90aCwKKwkJICogd2UgY2hlY2sgd2hhdCB3b3VsZCBiZSB0aGUgY2hhbm5lbCBpbiB0aGUgc2Vjb25kCisJCSAqIGZyYW1lIGZvciBhIDY4LWJ5dGUgYXRvbS4gIDc2LWJ5dGUgYXRvbXMgaGF2ZSAwIHRoZXJlLgorCQkgKiBWYWxpZCBjaGFubmVsIGNhbm5vdCBiZSAwLiAgKi8KKwkJaWYgKHNjYW5fbGVuICUgNzYpCisJCQlhdG9tX2xlbiA9IDY4OworCQllbHNlIGlmIChzY2FuX2xlbiAlIDY4KQorCQkJYXRvbV9sZW4gPSA3NjsKKwkJZWxzZSBpZiAoc2Nhbl9sZW4gPj0gMTI5MiAmJiBzY2FuWzY4XSA9PSAwKQorCQkJYXRvbV9sZW4gPSA3NjsKKwkJZWxzZQorCQkJYXRvbV9sZW4gPSA2ODsKKwkJb2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCQlvZmZzZXQgPSA0OworCQlpZiAocHJpdi0+aGFzX2hvc3RzY2FuKQorCQkJYXRvbV9sZW4gPSBzY2FuWzBdICsgKHNjYW5bMV0gPDwgOCk7CisJCWVsc2UKKwkJCWF0b21fbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbywgYXRpbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIHRoYXQgd2UgZ290IGFuIHdob2xlIG51bWJlciBvZiBhdG9tcyAqLworCWlmICgoc2Nhbl9sZW4gLSBvZmZzZXQpICUgYXRvbV9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5leHBlY3RlZCBzY2FuIGRhdGEgbGVuZ3RoICVkLCAiCisJCSAgICAgICAiYXRvbV9sZW4gJWQsIG9mZnNldCAlZFxuIiwgZGV2LT5uYW1lLCBzY2FuX2xlbiwKKwkJICAgICAgIGF0b21fbGVuLCBvZmZzZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWFkIHRoZSBlbnRyaWVzIG9uZSBieSBvbmUgKi8KKwlmb3IgKDsgb2Zmc2V0ICsgYXRvbV9sZW4gPD0gc2Nhbl9sZW47IG9mZnNldCArPSBhdG9tX2xlbikgeworCQkvKiBHZXQgbmV4dCBhdG9tICovCisJCWF0b20gPSAodW5pb24gaGVybWVzX3NjYW5faW5mbyAqKSAoc2NhbiArIG9mZnNldCk7CisKKwkJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgYXRvbS0+YS5ic3NpZCwgRVRIX0FMRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisJCS8qIE90aGVyIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIGdpdmUgdGhlbSAqLworCisJCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBsZTE2X3RvX2NwdShhdG9tLT5hLmVzc2lkX2xlbik7CisJCWlmIChpd2UudS5kYXRhLmxlbmd0aCA+IDMyKQorCQkJaXdlLnUuZGF0YS5sZW5ndGggPSAzMjsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBhdG9tLT5hLmVzc2lkKTsKKworCQkvKiBBZGQgbW9kZSAqLworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGF0b20tPmEuY2FwYWJpbGl0aWVzKTsKKwkJaWYgKGNhcGFiaWxpdGllcyAmIDB4MykgeworCQkJaWYgKGNhcGFiaWxpdGllcyAmIDB4MSkKKwkJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCQllbHNlCisJCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCQl9CisKKwkJY2hhbm5lbCA9IGF0b20tPnMuY2hhbm5lbDsKKwkJaWYgKCAoY2hhbm5lbCA+PSAxKSAmJiAoY2hhbm5lbCA8PSBOVU1fQ0hBTk5FTFMpICkgeworCQkJLyogQWRkIGZyZXF1ZW5jeSAqLworCQkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQkJaXdlLnUuZnJlcS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbY2hhbm5lbC0xXSAqIDEwMDAwMDsKKwkJCWl3ZS51LmZyZXEuZSA9IDE7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCQkgICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwkJfQorCisJCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkJaXdlLmNtZCA9IElXRVZRVUFMOworCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSAweDEwOwkvKiBubyBsaW5rIHF1YWxpdHkgKi8KKwkJaXdlLnUucXVhbC5sZXZlbCA9IChfX3U4KSBsZTE2X3RvX2NwdShhdG9tLT5hLmxldmVsKSAtIDB4OTU7CisJCWl3ZS51LnF1YWwubm9pc2UgPSAoX191OCkgbGUxNl90b19jcHUoYXRvbS0+YS5ub2lzZSkgLSAweDk1OworCQkvKiBXaXJlbGVzcyB0b29scyBwcmlvciB0byAyNy5wcmUyMiB3aWxsIHNob3cgbGluayBxdWFsaXR5CisJCSAqIGFueXdheSwgc28gd2UgcHJvdmlkZSBhIHJlYXNvbmFibGUgdmFsdWUuICovCisJCWlmIChpd2UudS5xdWFsLmxldmVsID4gaXdlLnUucXVhbC5ub2lzZSkKKwkJCWl3ZS51LnF1YWwucXVhbCA9IGl3ZS51LnF1YWwubGV2ZWwgLSBpd2UudS5xdWFsLm5vaXNlOworCQllbHNlCisJCQlpd2UudS5xdWFsLnF1YWwgPSAwOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChjYXBhYmlsaXRpZXMgJiAweDEwKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBhdG9tLT5hLmVzc2lkKTsKKworCQkvKiBCaXQgcmF0ZSBpcyBub3QgYXZhaWxhYmxlIGluIEx1Y2VudC9BZ2VyZSBmaXJtd2FyZXMgKi8KKwkJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgIT0gRklSTVdBUkVfVFlQRV9BR0VSRSkgeworCQkJY2hhciAqCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisJCQlpbnQJaTsKKwkJCWludAlzdGVwOworCisJCQlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX1NZTUJPTCkKKwkJCQlzdGVwID0gMjsKKwkJCWVsc2UKKwkJCQlzdGVwID0gMTsKKworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCQkJLyogVGhvc2UgdHdvIGZsYWdzIGFyZSBpZ25vcmVkLi4uICovCisJCQlpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQkvKiBNYXggMTAgdmFsdWVzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkgKz0gc3RlcCkgeworCQkJCS8qIE5VTEwgdGVybWluYXRlZCAqLworCQkJCWlmIChhdG9tLT5wLnJhdGVzW2ldID09IDB4MCkKKwkJCQkJYnJlYWs7CisJCQkJLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKChhdG9tLT5wLnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOworCQkJCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoY3VycmVudF9ldiwgY3VycmVudF92YWwsCisJCQkJCQkJCSAgIGVuZF9idWYsICZpd2UsCisJCQkJCQkJCSAgIElXX0VWX1BBUkFNX0xFTik7CisJCQl9CisJCQkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KKwkJCWlmICgoY3VycmVudF92YWwgLSBjdXJyZW50X2V2KSA+IElXX0VWX0xDUF9MRU4pCisJCQkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCQl9CisKKwkJLyogVGhlIG90aGVyIGRhdGEgaW4gdGhlIHNjYW4gcmVzdWx0IGFyZSBub3QgcmVhbGx5CisJCSAqIGludGVyZXN0aW5nLCBzbyBmb3Igbm93IGRyb3AgaXQgLSBKZWFuIElJICovCisJfQorCXJldHVybiBjdXJyZW50X2V2IC0gYnVmZmVyOworfQorCisvKiBSZXR1cm4gcmVzdWx0cyBvZiBhIHNjYW4gKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wb2ludCAqc3JxLAorCQkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBJZiBubyByZXN1bHRzIHlldCwgYXNrIHRvIHRyeSBhZ2FpbiBsYXRlciAqLworCWlmIChwcml2LT5zY2FuX3Jlc3VsdCA9PSBOVUxMKSB7CisJCWlmIChwcml2LT5zY2FuX2lucHJvZ3Jlc3MpCisJCQkvKiBJbXBvcnRhbnQgbm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIGNhbGxlcgorCQkJICogdW50aWwgcmVzdWx0cyBhcmUgcmVhZHkgZm9yIHZhcmlvdXMgcmVhc29ucy4KKwkJCSAqIEZpcnN0LCBtYW5hZ2luZyB3YWl0IHF1ZXVlcyBpcyBjb21wbGV4IGFuZCByYWN5LgorCQkJICogU2Vjb25kLCB3ZSBncmFiIHNvbWUgcnRuZXRsaW5rIGxvY2sgYmVmb3JlIGNvbW1pbmcKKwkJCSAqIGhlcmUgKGluIGRldl9pb2N0bCgpKS4KKwkJCSAqIFRoaXJkLCB3ZSBnZW5lcmF0ZSBhbiBXaXJlbGVzcyBFdmVudCwgc28gdGhlCisJCQkgKiBjYWxsZXIgY2FuIHdhaXQgaXRzZWxmIG9uIHRoYXQgLSBKZWFuIElJICovCisJCQllcnIgPSAtRUFHQUlOOworCQllbHNlCisJCQkvKiBDbGllbnQgZXJyb3IsIG5vIHNjYW4gcmVzdWx0cy4uLgorCQkJICogVGhlIGNhbGxlciBuZWVkIHRvIHJlc3RhcnQgdGhlIHNjYW4uICovCisJCQllcnIgPSAtRU5PREFUQTsKKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIHNvbWUgcmVzdWx0cyB0byBwdXNoIGJhY2sgdG8gdXNlciBzcGFjZSAqLworCisJCS8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgKi8KKwkJc3JxLT5sZW5ndGggPSBvcmlub2NvX3RyYW5zbGF0ZV9zY2FuKGRldiwgZXh0cmEsCisJCQkJCQkgICAgIHByaXYtPnNjYW5fcmVzdWx0LAorCQkJCQkJICAgICBwcml2LT5zY2FuX2xlbik7CisKKwkJLyogUmV0dXJuIGZsYWdzICovCisJCXNycS0+ZmxhZ3MgPSAoX191MTYpIHByaXYtPnNjYW5fbW9kZTsKKworCQkvKiBSZXN1bHRzIGFyZSBoZXJlLCBzbyBzY2FuIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAqLworCQlwcml2LT5zY2FuX2lucHJvZ3Jlc3MgPSAwOworCisJCS8qIEluIGFueSBjYXNlLCBTY2FuIHJlc3VsdHMgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRoZQorCQkgKiByZXNldCBmdW5jdGlvbiBhbmQgd2hlbiBleGl0aW5nIHRoZSBkcml2ZXIuCisJCSAqIFRoZSBwZXJzb24gdHJpZ2dlcmluZyB0aGUgc2Nhbm5pbmcgbWF5IG5ldmVyIGNvbWUgdG8KKwkJICogcGljayB0aGUgcmVzdWx0cywgc28gd2UgbmVlZCB0byBkbyBpdCBpbiB0aG9zZSBwbGFjZXMuCisJCSAqIEplYW4gSUkgKi8KKworI2lmZGVmIFNDQU5fU0lOR0xFX1JFQUQKKwkJLyogSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgb25seSBvbmUgY2xpZW50ICh0aGUgZmlyc3QKKwkJICogb25lKSB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgcmVzdWx0IChhbmQgb25seSBvbmUKKwkJICogdGltZSkuIElmIHRoZXJlIGlzIG11bHRpcGxlIGNvbmN1cmVudCBjbGllbnRzIHRoYXQKKwkJICogd2FudCB0byByZWFkIHNjYW4gcmVzdWx0cywgdGhpcyBiZWhhdmlvciBpcyBub3QKKwkJICogYWR2aXNhYmxlIC0gSmVhbiBJSSAqLworCQlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7CisJCXByaXYtPnNjYW5fcmVzdWx0ID0gTlVMTDsKKyNlbmRpZiAvKiBTQ0FOX1NJTkdMRV9SRUFEICovCisJCS8qIEhlcmUsIGlmIHRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgbGFzdCBzY2FuLAorCQkgKiB3ZSBtYXkgd2FudCB0byBjbGVhbiB1cCBzY2FuIHJlc3VsdHMuLi4gLSBKZWFuIElJICovCisJfQorCSAgCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBDb21taXQgaGFuZGxlciwgY2FsbGVkIGFmdGVyIHNldCBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl2b2lkICp3cnF1LAorCQkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIXByaXYtPm9wZW4pCisJCXJldHVybiAwOworCisJaWYgKHByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCkgeworCQlvcmlub2NvX3Jlc2V0KGRldik7CisJCXJldHVybiAwOworCX0KKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGVybWVzX2Rpc2FibGVfcG9ydChodywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGRpc2FibGUgcG9ydCAiCisJCSAgICAgICAid2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLCBkZXYtPm5hbWUpOworCQlwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIHJlY29uZmlndXJlIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZXJtZXNfZW5hYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBlbmFibGUgcG9ydCB3aGlsZSByZWNvbmZpZ3VyaW5nIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXR0aW5nIGluc3RlYWQuLi5cbiIsIGRldi0+bmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQllcnIgPSAwOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3Mgb3Jpbm9jb19wcml2dGFiW10gPSB7CisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDAsIDAsIDAsICJmb3JjZV9yZXNldCIgfSwKKwl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MSwgMCwgMCwgImNhcmRfcmVzZXQiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDIsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAgMCwgInNldF9wb3J0MyIgfSwKKwl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MywgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICAiZ2V0X3BvcnQzIiB9LAorCXsgU0lPQ0lXRklSU1RQUklWICsgMHg0LCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIDAsICJzZXRfcHJlYW1ibGUiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDUsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAgImdldF9wcmVhbWJsZSIgfSwKKwl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICAwLCAic2V0X2lic3Nwb3J0IiB9LAorCXsgU0lPQ0lXRklSU1RQUklWICsgMHg3LCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgICJnZXRfaWJzc3BvcnQiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDksIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgTUFYX1JJRF9MRU4sCisJICAiZ2V0X3JpZCIgfSwKK307CisKKworLyoKKyAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycworICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCW9yaW5vY29faGFuZGxlcltdID0geworCVtTSU9DU0lXQ09NTUlULVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9jb21taXQsCisJW1NJT0NHSVdOQU1FICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldG5hbWUsCisJW1NJT0NTSVdGUkVRICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGZyZXEsCisJW1NJT0NHSVdGUkVRICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGZyZXEsCisJW1NJT0NTSVdNT0RFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldG1vZGUsCisJW1NJT0NHSVdNT0RFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldG1vZGUsCisJW1NJT0NTSVdTRU5TICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHNlbnMsCisJW1NJT0NHSVdTRU5TICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHNlbnMsCisJW1NJT0NHSVdSQU5HRSAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2UsCisJW1NJT0NTSVdTUFkgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHNweSwKKwlbU0lPQ0dJV1NQWSAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0c3B5LAorCVtTSU9DU0lXQVAgICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXR3YXAsCisJW1NJT0NHSVdBUCAgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHdhcCwKKwlbU0lPQ1NJV1NDQU4gIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0c2NhbiwKKwlbU0lPQ0dJV1NDQU4gIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0c2NhbiwKKwlbU0lPQ1NJV0VTU0lEIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0ZXNzaWQsCisJW1NJT0NHSVdFU1NJRCAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGVzc2lkLAorCVtTSU9DU0lXTklDS04gLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRuaWNrLAorCVtTSU9DR0lXTklDS04gLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRuaWNrLAorCVtTSU9DU0lXUkFURSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRyYXRlLAorCVtTSU9DR0lXUkFURSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRyYXRlLAorCVtTSU9DU0lXUlRTICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRydHMsCisJW1NJT0NHSVdSVFMgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHJ0cywKKwlbU0lPQ1NJV0ZSQUcgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0ZnJhZywKKwlbU0lPQ0dJV0ZSQUcgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0ZnJhZywKKwlbU0lPQ0dJV1JFVFJZIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cmV0cnksCisJW1NJT0NTSVdFTkNPREUtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlLAorCVtTSU9DR0lXRU5DT0RFLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRpd2VuY29kZSwKKwlbU0lPQ1NJV1BPV0VSIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cG93ZXIsCisJW1NJT0NHSVdQT1dFUiAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHBvd2VyLAorfTsKKworCisvKgorICBBZGRlZCB0eXBlY2FzdGluZyBzaW5jZSB3ZSBubyBsb25nZXIgdXNlIGl3cmVxX2RhdGEgLS0gTW91c3RhZmEKKyAqLworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJb3Jpbm9jb19wcml2YXRlX2hhbmRsZXJbXSA9IHsKKwlbMF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfcmVzZXQsCisJWzFdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3Jlc2V0LAorCVsyXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRwb3J0MywKKwlbM10gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cG9ydDMsCisJWzRdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHByZWFtYmxlLAorCVs1XSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRwcmVhbWJsZSwKKwlbNl0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQsCisJWzddIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0LAorCVs5XSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRyaWQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIG9yaW5vY29faGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZCA9IEFSUkFZX1NJWkUob3Jpbm9jb19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUgPSBBUlJBWV9TSVpFKG9yaW5vY29fcHJpdmF0ZV9oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IEFSUkFZX1NJWkUob3Jpbm9jb19wcml2dGFiKSwKKwkuc3RhbmRhcmQgPSBvcmlub2NvX2hhbmRsZXIsCisJLnByaXZhdGUgPSBvcmlub2NvX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzID0gb3Jpbm9jb19wcml2dGFiLAorfTsKKworc3RhdGljIHZvaWQgb3Jpbm9jb19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpIC0gMSk7CisJc3RybmNweShpbmZvLT52ZXJzaW9uLCBEUklWRVJfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7CisJc3RybmNweShpbmZvLT5md192ZXJzaW9uLCBwcml2LT5md19uYW1lLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikgLSAxKTsKKwlpZiAoZGV2LT5jbGFzc19kZXYuZGV2KQorCQlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwKKwkJCXNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxKTsKKwllbHNlCisJCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSwKKwkJCSAiUENNQ0lBICVwIiwgcHJpdi0+aHcuaW9iYXNlKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcmlub2NvX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IG9yaW5vY29fZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaAppbmRleCBmNzQ5YjUwLi4yZjIxM2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCkBAIC03LDcgKzcsNyBAQAogI2lmbmRlZiBfT1JJTk9DT19ICiAjZGVmaW5lIF9PUklOT0NPX0gKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xNGFscGhhMiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTVyYzIiCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0yMiw2ICsyMiw4IEBACiAKICNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAogCisjZGVmaW5lIE1BWF9TQ0FOX0xFTgkJNDA5NgorCiAjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWV9TSVpFCTE0CiAjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWVMJNAogCkBAIC0zMCw2ICszMiwyMCBAQAogCWNoYXIgZGF0YVtPUklOT0NPX01BWF9LRVlfU0laRV07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorc3RydWN0IGhlYWRlcl9zdHJ1Y3QgeworCS8qIDgwMi4zICovCisJdTggZGVzdFtFVEhfQUxFTl07CisJdTggc3JjW0VUSF9BTEVOXTsKKwl1MTYgbGVuOworCS8qIDgwMi4yICovCisJdTggZHNhcDsKKwl1OCBzc2FwOworCXU4IGN0cmw7CisJLyogU05BUCAqLworCXU4IG91aVszXTsKKwl1MTYgZXRoZXJ0eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKIHR5cGVkZWYgZW51bSB7CiAJRklSTVdBUkVfVFlQRV9BR0VSRSwKIAlGSVJNV0FSRV9UWVBFX0lOVEVSU0lMLApAQCAtNDgsNiArNjQsOCBAQAogCS8qIGRyaXZlciBzdGF0ZSAqLwogCWludCBvcGVuOwogCXUxNiBsYXN0X2xpbmtzdGF0dXM7CisJc3RydWN0IHdvcmtfc3RydWN0IGpvaW5fd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2V2ZW50X3dvcms7CiAKIAkvKiBOZXQgZGV2aWNlIHN0dWZmICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CkBAIC03NCw3ICs5Miw5IEBACiAJdW5zaWduZWQgaW50IGhhc19wbToxOwogCXVuc2lnbmVkIGludCBoYXNfcHJlYW1ibGU6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX3NlbnNpdGl2aXR5OjE7CisJdW5zaWduZWQgaW50IGhhc19ob3N0c2NhbjoxOwogCXVuc2lnbmVkIGludCBicm9rZW5fZGlzYWJsZXBvcnQ6MTsKKwl1bnNpZ25lZCBpbnQgYnJva2VuX21vbml0b3I6MTsKIAogCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1hdGVycyAqLwogCXUzMiBpd19tb2RlOwpAQCAtODQsNiArMTA0LDggQEAKIAlpbnQgYml0cmF0ZW1vZGU7CiAgCWNoYXIgbmlja1tJV19FU1NJRF9NQVhfU0laRSsxXTsKIAljaGFyIGRlc2lyZWRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJY2hhciBkZXNpcmVkX2Jzc2lkW0VUSF9BTEVOXTsKKwlpbnQgYnNzaWRfZml4ZWQ7CiAJdTE2IGZyYWdfdGhyZXNoLCBtd29fcm9idXN0OwogCXUxNiBjaGFubmVsOwogCXUxNiBhcF9kZW5zaXR5LCBydHNfdGhyZXNoOwpAQCAtOTgsNiArMTIwLDEyIEBACiAJLyogQ29uZmlndXJhdGlvbiBkZXBlbmRlbnQgdmFyaWFibGVzICovCiAJaW50IHBvcnRfdHlwZSwgY3JlYXRlaWJzczsKIAlpbnQgcHJvbWlzY3VvdXMsIG1jX2NvdW50OworCisJLyogU2Nhbm5pbmcgc3VwcG9ydCAqLworCWludAlzY2FuX2lucHJvZ3Jlc3M7CS8qIFNjYW4gcGVuZGluZy4uLiAqLworCXUzMglzY2FuX21vZGU7CQkvKiBUeXBlIG9mIHNjYW4gZG9uZSAqLworCWNoYXIgKglzY2FuX3Jlc3VsdDsJCS8qIFJlc3VsdCBvZiBwcmV2aW91cyBzY2FuICovCisJaW50CXNjYW5fbGVuOwkJLyogTGVuZ2h0IG9mIHJlc3VsdCAqLwogfTsKIAogI2lmZGVmIE9SSU5PQ09fREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwppbmRleCA3NGE4MjI3Li4zNjhkMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xODYsMTEgKzE4NSw2IEBACiAJZGV2X2xpc3QgPSBsaW5rOwogCiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmb3Jpbm9jb19jc19ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7IC8qIEZJWE1FOiB3aGF0IGRvZXMgdGhpcyBtZWFuPyAqLwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTYwOCwxMyArNjAyLDY1IEBACiAJIiAoRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwgIgogCSJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiwgZXQgYWwpIjsKIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG9yaW5vY29fY3NfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDczMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA4OSwgMHgwMDAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzgsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFlYiwgMHgwODBhKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNjEsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjY4LCAweDAwMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzA1KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjhhLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwNjczKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyYWEsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMmFjLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MTRlYSwgMHhiMDAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDUwYzIsIDB4NzMwMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg5MDA1LCAweDAwMjEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzI1MCwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDA1KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIjNDb20iLCAiM0NSV0U3MzdBIEFpckNvbm5lY3QgV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAweDQxMjQwZTViLCAweDU2MDEwYWYzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkluc3RhbnQgV2lyZWxlc3MgIiwgIiBOZXR3b3JrIFBDIENBUkQiLCAiVmVyc2lvbiAwMS4wMiIsIDB4MTFkOTAxYWYsIDB4NmU5YmQ5MjYsIDB4NGI3NGJhYTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBQ1RJT05URUMiLCAiUFJJU00gV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAweDM5MzA4OWRhLCAweGE3MWU2OWQ1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQXZheWEgQ29tbXVuaWNhdGlvbiIsICJBdmF5YSBXaXJlbGVzcyBQQyBDYXJkIiwgMHhkOGE0M2I3OCwgMHgwZDM0MTE2OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJVRkZBTE8iLCAiV0xJLVBDTS1MMTFHIiwgMHgyZGVjZWNlMywgMHhmNTdjYTRiMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNhYmxldHJvbiIsICJSb2FtQWJvdXQgODAyLjExIERTIiwgMHgzMmQ0NDVmNSwgMHhlZGVmZmQ5MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgIldpcmVsZXNzIExBTiBQQ0MtMTEiLCAweDUyNjE0NDBmLCAweGE2NDA1NTg0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAiV2lyZWxlc3MgTEFOIFBDQ0EtMTEiLCAweDUyNjE0NDBmLCAweGRmNjExNWY5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRCIsICJMaW5rIERSQy02NTAgMTFNYnBzIFdMQU4gQ2FyZCIsIDB4NzFiMTg1ODksIDB4ZjE0NGUzYWMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEIiwgIkxpbmsgRFdMLTY1MCAxMU1icHMgV0xBTiBDYXJkIiwgMHg3MWIxODU4OSwgMHhiNmYxYjBhYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMU0EiLCAiQWlyTGFuY2VyIE1DLTExIiwgMHg0NTA3YTMzYSwgMHhlZjU0ZjBlMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkh5cGVyTGluayIsICJXaXJlbGVzcyBQQyBDYXJkIDExTWJwcyIsIDB4NTZjYzNmMWEsIDB4MGJjZjIyMGMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJTlRFUlNJTCIsICJIRkEzODR4L0lFRUUiLCAweDc0YzVlNDBkLCAweGRiNDcyYTE4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTHVjZW50IFRlY2hub2xvZ2llcyIsICJXYXZlTEFOL0lFRUUiLCAweDIzZWI5OTQ5LCAweGM1NjJlNzJhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUVMQ08iLCAiV0xJLVBDTS1MMTEiLCAweDQ4MWUwMDk0LCAweDczNjBlNDEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUVMQ08iLCAiV0xJLVBDTS1MMTFHIiwgMHg0ODFlMDA5NCwgMHhmNTdjYTRiMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1pY3Jvc29mdCIsICJXaXJlbGVzcyBOb3RlYm9vayBBZGFwdGVyIE1OLTUyMCIsIDB4NTk2MWJmODUsIDB4NmVlYzhjMDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOQ1IiLCAiV2F2ZUxBTi9JRUVFIiwgMHgyNDM1OGNkNCwgMHhjNTYyZTcyYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5FVEdFQVIgTUE0MDFSQSBXaXJlbGVzcyBQQyIsICJDYXJkIiwgMHgwMzA2NDY3ZiwgMHg5NzYyZThmMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBMQU5FWCIsICJHZW9XYXZlL0dXLUNGMTEwIiwgMHgyMDlmNDBhYiwgMHhkOTcxNTI2NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBST1hJTSIsICJMQU4gUEMgQ0FSRCBIQVJNT05ZIDgwMjExQiIsIDB4YzY1MzZhNWUsIDB4MDkwYzNjZDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQUk9YSU0iLCAiTEFOIFBDSSBDQVJEIEhBUk1PTlkgODAyMTFCIiwgMHhjNjUzNmE1ZSwgMHg5ZjQ5NGUyNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNBTVNVTkciLCAiMTFNYnBzIFdMQU4gQ2FyZCIsIDB4NDNkNzRjYjQsIDB4NTc5YmQ5MWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIlN5bWJvbCBUZWNobm9sb2dpZXMiLCAweDNmMDJiNGQ2KSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIG9yaW5vY29fY3NfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG9yaW5vY29fZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSBEUklWRVJfTkFNRSwKIAl9LAogCS5hdHRhY2gJCT0gb3Jpbm9jb19jc19hdHRhY2gsCisJLmV2ZW50CQk9IG9yaW5vY29fY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBvcmlub2NvX2NzX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBvcmlub2NvX2NzX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMKaW5kZXggNDQ4MWVjMS4uYWRjNzQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwpAQCAtMTEyLDEwICsxMTIsMTAgQEAKIHZvaWQKIGlzbDM4eHhfdHJpZ2dlcl9kZXZpY2UoaW50IGFzbGVlcCwgdm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSkKIHsKLQlzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CiAJdTMyIHJlZywgY291bnRlciA9IDA7CiAKICNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKIAlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNsMzh4eCB0cmlnZ2VyIGRldmljZVxuIik7CiAjZW5kaWYKIApAQCAtMTI2LDExICsxMjYsMTEgQEAKIAkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUpOwogCQlERUJVRyhTSE9XX1RSQUNJTkcsICIlMDhsaS4lMDhsaSBEZXZpY2Ugd2FrZXVwIHRyaWdnZXJlZFxuIiwKIAkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMpOwotI2VuZGlmCiAKIAkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIHJlYWQgJTA4eFxuIiwKIAkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCiAJCSAgICAgIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKSk7CisjZW5kaWYKIAkJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CiAKIAkJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0lOVF9JREVOVF9SRUcpOwpAQCAtMTQ4LDEwICsxNDgsMTIgQEAKIAkJCQljb3VudGVyKys7CiAJCQl9CiAKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUwogCQkJREVCVUcoU0hPV19UUkFDSU5HLAogCQkJICAgICAgIiUwOGxpLiUwOGxpIERldmljZSByZWdpc3RlciByZWFkICUwOHhcbiIsCiAJCQkgICAgICBjdXJyZW50X3RpbWUudHZfc2VjLCAobG9uZyljdXJyZW50X3RpbWUudHZfdXNlYywKIAkJCSAgICAgIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKSk7CisjZW5kaWYKIAkJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOwogCiAjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKaW5kZXggNmU1YmRhNS4uMGUwYmE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTM5MywxMSArMzkyLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnJheV9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIApAQCAtMjkwNCwxMyArMjg5OCwyMSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCByYXlfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWE2LCAweDAwMDApLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcmF5X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciByYXlfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAicmF5X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gcmF5X2F0dGFjaCwKKwkuZXZlbnQJCT0gcmF5X2V2ZW50LAogCS5kZXRhY2gJCT0gcmF5X2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSByYXlfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9yYXlfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwppbmRleCBlYzgzMjk3Li5mNjEzMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC00Njg0LDEyICs0Njg0LDYgQEAKIAogICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgY2xpZW50X3JlZy5FdmVudE1hc2sgPSAKLSAgICBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUgfAotICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ3YXZlbGFuX2V2ZW50OwogICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTQ4ODksMTMgKzQ4ODMsMjQgQEAKICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB3YXZlbGFuX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVCZUIiwiV2F2ZUxBTi9QQ01DSUEiLCAweGU3YzVhZmZkLCAweDFiYzUwOTc1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRGlnaXRhbCIsICJSb2FtQWJvdXQvRFMiLCAweDk5OTlhYjM1LCAweDAwZDA1ZTA2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTHVjZW50IFRlY2hub2xvZ2llcyIsICJXYXZlTEFOL1BDTUNJQSIsIDB4MjNlYjk5NDksIDB4MWJjNTA5NzUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOQ1IiLCAiV2F2ZUxBTi9QQ01DSUEiLCAweDI0MzU4Y2Q0LCAweDFiYzUwOTc1KSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHdhdmVsYW5faWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdhdmVsYW5fZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAid2F2ZWxhbl9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHdhdmVsYW5fYXR0YWNoLAorCS5ldmVudAkJPSB3YXZlbGFuX2V2ZW50LAogCS5kZXRhY2gJCT0gd2F2ZWxhbl9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gd2F2ZWxhbl9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaAppbmRleCBlYTJlZjhkLi42NzdmZjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaApAQCAtNDUyLDcgKzQ1Miw2IEBACiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogCiAvKiBXYXZlbGFuIGRlY2xhcmF0aW9ucyAqLwogI2luY2x1ZGUgImk4MjU5My5oIgkvKiBEZWZpbml0aW9ucyBmb3IgdGhlIEludGVsIGNoaXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKaW5kZXggMTQzM2U1YS4uZGQ5MDIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKIAogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIwMDUsMTMgKzIwMDQsNiBAQAogCWxpbmstPm5leHQJCSA9IHdsMzUwMV9kZXZfbGlzdDsKIAl3bDM1MDFfZGV2X2xpc3QJCSA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbwkgPSAmd2wzNTAxX2Rldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrCSA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwKLQkJCQkgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8Ci0JCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJCQkgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwKLQkJCQkgICBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gd2wzNTAxX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTIyMzksMTMgKzIyMzEsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHdsMzUwMV9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwMSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHdsMzUwMV9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgd2wzNTAxX2RyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJ2ICAgICAgICAgICAgPSB7Ci0JCS5uYW1lICAgPSAid2wzNTAxX2NzIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIndsMzUwMV9jcyIsCiAJfSwKLQkuYXR0YWNoICAgICAgICAgPSB3bDM1MDFfYXR0YWNoLAotCS5kZXRhY2ggICAgICAgICA9IHdsMzUwMV9kZXRhY2gsCisJLmF0dGFjaAkJPSB3bDM1MDFfYXR0YWNoLAorCS5ldmVudAkJPSB3bDM1MDFfZXZlbnQsCisJLmRldGFjaAkJPSB3bDM1MDFfZGV0YWNoLAorCS5pZF90YWJsZQk9IHdsMzUwMV9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB3bDM1MDFfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKaW5kZXggOWRhOTI1NC4uMWMyNTA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKKysrIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKQEAgLTc4Niw3ICs3ODYsNyBAQAogCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogCQl5cC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoeXAtPnBjaV9kZXYsCi0JCQlza2ItPnRhaWwsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJc2tiLT5kYXRhLCB5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAl9CiAJeXAtPnJ4X3JpbmdbaS0xXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CiAJeXAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CkBAIC0xMTExLDcgKzExMTEsNyBAQAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeXAtPnBjaV9kZXYsIGRlc2MtPmFkZHIsCiAJCQl5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlkZXNjX3N0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPnJlc3VsdF9zdGF0dXMpID4+IDE2OwotCQlidWZfYWRkciA9IHJ4X3NrYi0+dGFpbDsKKwkJYnVmX2FkZHIgPSByeF9za2ItPmRhdGE7CiAJCWRhdGFfc2l6ZSA9IChsZTMyX3RvX2NwdShkZXNjLT5kYmRtYV9jbWQpIC0gCiAJCQlsZTMyX3RvX2NwdShkZXNjLT5yZXN1bHRfc3RhdHVzKSkgJiAweGZmZmY7CiAJCWZyYW1lX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKHMxNiopJihidWZfYWRkcltkYXRhX3NpemUgLSAyXSkpKTsKQEAgLTExODUsNyArMTE4NSw3IEBACiAJCQkJCWJyZWFrOwogCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwotCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCByeF9za2ItPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCByeF9za2ItPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoeXAtPnBjaV9kZXYsIGRlc2MtPmFkZHIsCiAJCQkJCQkJCQkJCSAgIHlwLT5yeF9idWZfc3osCkBAIC0xMjExLDcgKzEyMTEsNyBAQAogCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwKLQkJCQlza2ItPnRhaWwsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJCXNrYi0+ZGF0YSwgeXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCX0KIAkJeXAtPnJ4X3JpbmdbZW50cnldLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKIAkJeXAtPnJ4X3JpbmdbZW50cnldLnJlc3VsdF9zdGF0dXMgPSAwOwkvKiBDbGVhciBjb21wbGV0ZSBiaXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9kaW5vLmMgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKaW5kZXggYjBkMmE3My4uMmYyZGJlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYworKysgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKQEAgLTk5Myw2ICs5OTMsNyBAQAogCWJ1cyA9IHBjaV9zY2FuX2J1c19wYXJlbnRlZCgmZGV2LT5kZXYsIGRpbm9fY3VycmVudF9idXMsCiAJCQkJICAgICZkaW5vX2NmZ19vcHMsIE5VTEwpOwogCWlmKGJ1cykgeworCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiAJCS8qIFRoaXMgY29kZSAqZGVwZW5kcyogb24gc2Nhbm5pbmcgYmVpbmcgc2luZ2xlIHRocmVhZGVkCiAJCSAqIGlmIGl0IGlzbid0LCB0aGlzIGdsb2JhbCBidXMgbnVtYmVyIGNvdW50IHdpbGwgZmFpbAogCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYyBiL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYwppbmRleCBkYzgzODgwLi43ZmRkODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jCkBAIC0xNTcwLDYgKzE1NzAsOCBAQAogCWxiYV9idXMgPSBsYmFfZGV2LT5oYmEuaGJhX2J1cyA9CiAJCXBjaV9zY2FuX2J1c19wYXJlbnRlZCgmZGV2LT5kZXYsIGxiYV9kZXYtPmhiYS5idXNfbnVtLnN0YXJ0LAogCQkJCWNmZ19vcHMsIE5VTEwpOworCWlmIChsYmFfYnVzKQorCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGxiYV9idXMpOwogCiAJLyogVGhpcyBpcyBpbiBsaWV1IG9mIGNhbGxpbmcgcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpICovCiAJaWYgKGlzX3BkY19wYXQoKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKaW5kZXggYTNmYTgxOC4uMjRlNmFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnRfcGMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTMzLDExICsxMzIsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGFycG9ydF9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTM3MywxMyArMzY3LDIzIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIHBhcnBvcnRfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHBhcnBvcnRfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9GVU5DX0lEKDMpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDAzKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcGFycG9ydF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcGFycG9ydF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJwYXJwb3J0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gcGFycG9ydF9hdHRhY2gsCisJLmV2ZW50CQk9IHBhcnBvcnRfZXZlbnQsCiAJLmRldGFjaAkJPSBwYXJwb3J0X2RldGFjaCwKKwkuaWRfdGFibGUJPSBwYXJwb3J0X2lkcywKKwogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9wYXJwb3J0X2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwppbmRleCA4MGVkZmEzLi40NTk4YzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKQEAgLTMwMDgsNyArMzAwOCw3IEBACiAJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpICE9IE5VTEwpIHsKLQkJaWQgPSBwY2lfbWF0Y2hfZGV2aWNlIChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOworCQlpZCA9IHBjaV9tYXRjaF9pZChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoaWQgPT0gTlVMTCB8fCBpZC0+ZHJpdmVyX2RhdGEgPj0gbGFzdF9zaW8pCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCA3ZGVhNDk0Li4zNjU3ZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogIwogIyBTb21lIGFyY2hpdGVjdHVyZXMgdXNlIHRoZSBnZW5lcmljIFBDSSBzZXR1cCBmdW5jdGlvbnMKICMKK29iai0kKENPTkZJR19YODYpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfQUxQSEEpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCiBvYmotJChDT05GSUdfQVJNKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwogb2JqLSQoQ09ORklHX1BBUklTQykgKz0gc2V0dXAtYnVzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2J1cy5jIGIvZHJpdmVycy9wY2kvYnVzLmMKaW5kZXggZGJkMzM2MC4uZmVkYWU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvYnVzLmMKQEAgLTEyMSwxMCArMTIxLDEzIEBACiAJCSAqIElmIHRoZXJlIGlzIGFuIHVuYXR0YWNoZWQgc3Vib3JkaW5hdGUgYnVzLCBhdHRhY2gKIAkJICogaXQgYW5kIHRoZW4gc2NhbiBmb3IgdW5hdHRhY2hlZCBQQ0kgZGV2aWNlcy4KIAkJICovCi0JCWlmIChkZXYtPnN1Ym9yZGluYXRlICYmIGxpc3RfZW1wdHkoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUpKSB7Ci0JCQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZkZXYtPnN1Ym9yZGluYXRlLT5ub2RlLCAmZGV2LT5idXMtPmNoaWxkcmVuKTsKLQkJCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQkgICAgICAgaWYgKGxpc3RfZW1wdHkoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUpKSB7CisJCQkgICAgICAgc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQkJICAgICAgIGxpc3RfYWRkX3RhaWwoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUsCisJCQkJCSAgICAgICAmZGV2LT5idXMtPmNoaWxkcmVuKTsKKwkJCSAgICAgICBzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwkJICAgICAgIH0KIAkJCXBjaV9idXNfYWRkX2RldmljZXMoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKIAkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPnN1Ym9yZGluYXRlLT5jbGFzc19kZXYua29iaiwgJmRldi0+ZGV2LmtvYmosICJicmlkZ2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwppbmRleCAzOTAzZjhjLi5iODQ0YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy5jCkBAIC01NCw3ICs1NCw3IEBACiAKIAllbnZwW2krK10gPSBzY3JhdGNoOwogCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLAotCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4XG4iLAorCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKIAkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKIAkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAogCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCmluZGV4IDFhNGQ0Y2EuLjljNGEzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKQEAgLTE4Nyw5ICsxODcsMTAgQEAKIAogY29uZmlnIEhPVFBMVUdfUENJX1NHSQogCXRyaXN0YXRlICJTR0kgUENJIEhvdHBsdWcgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhPVFBMVUdfUENJICYmIElBNjRfU0dJX1NOMgorCWRlcGVuZHMgb24gSE9UUExVR19QQ0kgJiYgKElBNjRfU0dJX1NOMiB8fCBJQTY0X0dFTkVSSUMpCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBTR0kgSUE2NCBBbHRpeCBzeXN0ZW0uCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU0dJIEFsdGl4IEhvdHBsdWcKKwkgIERyaXZlciBmb3IgUENJIGRldmljZXMuCiAKIAkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCA5M2MxMjBkLi4zMWEzMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9TSFBDKQkJKz0gc2hwY2hwLm8KIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9SUEEpCQkrPSBycGFwaHAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1JQQV9ETFBBUikJKz0gcnBhZGxwYXJfaW8ubworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1NHSSkJCSs9IHNnaV9ob3RwbHVnLm8KIAogcGNpX2hvdHBsdWctb2Jqcwk6PQlwY2lfaG90cGx1Z19jb3JlLm8KIApAQCAtMzYsOSArMzcsNyBAQAogCQkJCWlibXBocF9ocGMubwogCiBhY3BpcGhwLW9ianMJCTo9CWFjcGlwaHBfY29yZS5vCVwKLQkJCQlhY3BpcGhwX2dsdWUubwlcCi0JCQkJYWNwaXBocF9wY2kubwlcCi0JCQkJYWNwaXBocF9yZXMubworCQkJCWFjcGlwaHBfZ2x1ZS5vCiAKIHJwYXBocC1vYmpzCQk6PQlycGFwaHBfY29yZS5vCVwKIAkJCQlycGFwaHBfcGNpLm8JXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCBkOTQ5OTg3Li4yOTM2MDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaApAQCAtNyw2ICs3LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE1hdHRoZXcgV2lsY294IChtYXR0aGV3LndpbGNveEBocC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBIZXdsZXR0IFBhY2thcmQKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTUyLDcgKzU0LDYgQEAKIAogc3RydWN0IGFjcGlwaHBfYnJpZGdlOwogc3RydWN0IGFjcGlwaHBfc2xvdDsKLXN0cnVjdCBwY2lfcmVzb3VyY2U7CiAKIC8qCiAgKiBzdHJ1Y3Qgc2xvdCAtIHNsb3QgaW5mb3JtYXRpb24gZm9yIGVhY2ggKnBoeXNpY2FsKiBzbG90CkBAIC02NSwxNSArNjYsNiBAQAogCXN0cnVjdCBhY3BpcGhwX3Nsb3QJKmFjcGlfc2xvdDsKIH07CiAKLS8qCi0gKiBzdHJ1Y3QgcGNpX3Jlc291cmNlIC0gZGVzY3JpYmVzIHBjaSByZXNvdXJjZSAobWVtLCBwZm1lbSwgaW8sIGJ1cykKLSAqLwotc3RydWN0IHBjaV9yZXNvdXJjZSB7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqIG5leHQ7Ci0JdTY0IGJhc2U7Ci0JdTMyIGxlbmd0aDsKLX07Ci0KIC8qKgogICogc3RydWN0IGhwcF9wYXJhbSAtIEFDUEkgMi4wIF9IUFAgSG90IFBsdWcgUGFyYW1ldGVycwogICogQGNhY2hlX2xpbmVfc2l6ZSBpbiBEV09SRApAQCAtMTAxLDEwICs5Myw2IEBACiAJaW50IHR5cGU7CiAJaW50IG5yX3Nsb3RzOwogCi0JdTggc2VnOwotCXU4IGJ1czsKLQl1OCBzdWI7Ci0KIAl1MzIgZmxhZ3M7CiAKIAkvKiBUaGlzIGJ1cyAoaG9zdCBicmlkZ2UpIG9yIFNlY29uZGFyeSBidXMgKFBDSS10by1QQ0kgYnJpZGdlKSAqLwpAQCAtMTE3LDEyICsxMDUsNiBAQAogCXN0cnVjdCBocHBfcGFyYW0gaHBwOwogCiAJc3BpbmxvY2tfdCByZXNfbG9jazsKLQotCS8qIGF2YWlsYWJsZSByZXNvdXJjZXMgb24gdGhpcyBidXMgKi8KLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICptZW1faGVhZDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpwX21lbV9oZWFkOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKmlvX2hlYWQ7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqYnVzX2hlYWQ7CiB9OwogCiAKQEAgLTE2MywxMiArMTQ1LDYgQEAKIAogCXU4CQlmdW5jdGlvbjsJLyogcGNpIGZ1bmN0aW9uIyAqLwogCXUzMgkJZmxhZ3M7CQkvKiBzZWUgYmVsb3cgKi8KLQotCS8qIHJlc291cmNlcyB1c2VkIGZvciB0aGlzIGZ1bmN0aW9uICovCi0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbWVtX2hlYWQ7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcF9tZW1faGVhZDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICppb19oZWFkOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKmJ1c19oZWFkOwogfTsKIAogLyoqCkBAIC0yNDMsMjUgKzIxOSw2IEBACiBleHRlcm4gdTggYWNwaXBocF9nZXRfYWRhcHRlcl9zdGF0dXMgKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHUzMiBhY3BpcGhwX2dldF9hZGRyZXNzIChzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KTsKIAotLyogYWNwaXBocF9wY2kuYyAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICphY3BpcGhwX2FsbG9jYXRlX3BjaWRldiAoc3RydWN0IHBjaV9idXMgKnBidXMsIGludCBkZXYsIGludCBmbik7Ci1leHRlcm4gaW50IGFjcGlwaHBfY29uZmlndXJlX3Nsb3QgKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpOwotZXh0ZXJuIGludCBhY3BpcGhwX2NvbmZpZ3VyZV9mdW5jdGlvbiAoc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYyk7Ci1leHRlcm4gdm9pZCBhY3BpcGhwX3VuY29uZmlndXJlX2Z1bmN0aW9uIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsKLWV4dGVybiBpbnQgYWNwaXBocF9kZXRlY3RfcGNpX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSk7Ci1leHRlcm4gaW50IGFjcGlwaHBfaW5pdF9mdW5jX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsKLQotLyogYWNwaXBocF9yZXMuYyAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X2lvX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCwgdTMyIHNpemUpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCwgdTMyIHNpemUpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X3Jlc291cmNlX3dpdGhfYmFzZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQsIHU2NCBiYXNlLCB1MzIgc2l6ZSk7Ci1leHRlcm4gaW50IGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfbWFrZV9yZXNvdXJjZSAodTY0IGJhc2UsIHUzMiBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgYWNwaXBocF9tb3ZlX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqZnJvbSwgc3RydWN0IHBjaV9yZXNvdXJjZSAqKnRvKTsKLWV4dGVybiB2b2lkIGFjcGlwaHBfZnJlZV9yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKnJlcyk7Ci1leHRlcm4gdm9pZCBhY3BpcGhwX2R1bXBfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlKTsgLyogZGVidWcgKi8KLWV4dGVybiB2b2lkIGFjcGlwaHBfZHVtcF9mdW5jX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsgLyogZGVidWcgKi8KLQogLyogdmFyaWFibGVzICovCiBleHRlcm4gaW50IGFjcGlwaHBfZGVidWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jCmluZGV4IDQ1MzllNjEuLjYwYzRjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwpAQCAtNyw2ICs3LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE1hdHRoZXcgV2lsY294IChtYXR0aGV3LndpbGNveEBocC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBIZXdsZXR0IFBhY2thcmQKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTUzLDggKzU1LDggQEAKIHN0YXRpYyBpbnQgbnVtX3Nsb3RzOwogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2F0dGVudGlvbl9pbmZvICphdHRlbnRpb25faW5mbzsKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC40IgotI2RlZmluZSBEUklWRVJfQVVUSE9SCSJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEB1cy5pYm0uY29tPiwgVGFrYXlvc2hpIEtvY2hpIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC41IgorI2RlZmluZSBEUklWRVJfQVVUSE9SCSJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEB1cy5pYm0uY29tPiwgVGFrYXlvc2hpIEtvY2hpIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+LCBNYXR0aGV3IFdpbGNveCA8d2lsbHlAaHAuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkFDUEkgSG90IFBsdWcgUENJIENvbnRyb2xsZXIgRHJpdmVyIgogCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwpAQCAtMjgxLDggKzI4Myw3IEBACiAvKioKICAqIGdldF9hZGRyZXNzIC0gZ2V0IHBjaSBhZGRyZXNzIG9mIGEgc2xvdAogICogQGhvdHBsdWdfc2xvdDogc2xvdCB0byBnZXQgc3RhdHVzCi0gKiBAYnVzZGV2OiBwb2ludGVyIHRvIHN0cnVjdCBwY2lfYnVzZGV2IChzZWcsIGJ1cywgZGV2KQotICoKKyAqIEB2YWx1ZTogcG9pbnRlciB0byBzdHJ1Y3QgcGNpX2J1c2RldiAoc2VnLCBidXMsIGRldikKICAqLwogc3RhdGljIGludCBnZXRfYWRkcmVzcyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHUzMiAqdmFsdWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCBlN2Y0MTI5Li40MjRlN2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTQsNiArNCwxMCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSGlyb3NoaSBBb25vIChoLWFvbm9AYXAuanAubmVjLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMiwyMDAzIE5FQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgTWF0dGhldyBXaWxjb3ggKG1hdHRoZXcud2lsY294QGhwLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IEhld2xldHQgUGFja2FyZAorICogQ29weXJpZ2h0IChDKSAyMDA1IFJhamVzaCBTaGFoIChyYWplc2guc2hhaEBpbnRlbC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24KICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTI2LDYgKzMwLDE2IEBACiAgKgogICovCiAKKy8qCisgKiBMaWZldGltZSBydWxlcyBmb3IgcGNpX2RldjoKKyAqICAtIFRoZSBvbmUgaW4gYWNwaXBocF9mdW5jIGhhcyBpdHMgcmVmY291bnQgZWxldmF0ZWQgYnkgcGNpX2dldF9zbG90KCkKKyAqICAgIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQgb3Igd2hlbiBhbiBpbnNlcnRpb24gZXZlbnQgb2NjdXJzLiAgSXQgbG9zZXMKKyAqICAgIGEgcmVmY291bnQgd2hlbiBpdHMgZWplY3RlZCBvciB0aGUgZHJpdmVyIHVubG9hZHMuCisgKiAgLSBUaGUgb25lIGluIGFjcGlwaHBfYnJpZGdlIGhhcyBpdHMgcmVmY291bnQgZWxldmF0ZWQgYnkgcGNpX2dldF9zbG90KCkKKyAqICAgIHdoZW4gdGhlIGJyaWRnZSBpcyBzY2FubmVkIGFuZCBpdCBsb3NlcyBhIHJlZmNvdW50IHdoZW4gdGhlIGJyaWRnZQorICogICAgaXMgcmVtb3ZlZC4KKyAqLworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC0xNzgsMjEgKzE5MiwxOCBAQAogCiAJCWJyaWRnZS0+bnJfc2xvdHMrKzsKIAotCQlkYmcoImZvdW5kIEFDUEkgUENJIEhvdHBsdWcgc2xvdCBhdCBQQ0kgJTAyeDolMDJ4IFNsb3Q6JWRcbiIsCi0JCSAgICBzbG90LT5icmlkZ2UtPmJ1cywgc2xvdC0+ZGV2aWNlLCBzbG90LT5zdW4pOworCQlkYmcoImZvdW5kIEFDUEkgUENJIEhvdHBsdWcgc2xvdCAlZCBhdCBQQ0kgJTA0eDolMDJ4OiUwMnhcbiIsCisJCQkJc2xvdC0+c3VuLCBwY2lfZG9tYWluX25yKGJyaWRnZS0+cGNpX2J1cyksCisJCQkJYnJpZGdlLT5wY2lfYnVzLT5udW1iZXIsIHNsb3QtPmRldmljZSk7CiAJfQogCiAJbmV3ZnVuYy0+c2xvdCA9IHNsb3Q7CiAJbGlzdF9hZGRfdGFpbCgmbmV3ZnVuYy0+c2libGluZywgJnNsb3QtPmZ1bmNzKTsKIAogCS8qIGFzc29jaWF0ZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgKi8KLQluZXdmdW5jLT5wY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChicmlkZ2UtPmJ1cywKKwluZXdmdW5jLT5wY2lfZGV2ID0gcGNpX2dldF9zbG90KGJyaWRnZS0+cGNpX2J1cywKIAkJCQkJIFBDSV9ERVZGTihkZXZpY2UsIGZ1bmN0aW9uKSk7CiAJaWYgKG5ld2Z1bmMtPnBjaV9kZXYpIHsKLQkJaWYgKGFjcGlwaHBfaW5pdF9mdW5jX3Jlc291cmNlKG5ld2Z1bmMpIDwgMCkgewotCQkJa2ZyZWUobmV3ZnVuYyk7Ci0JCQlyZXR1cm4gQUVfRVJST1I7Ci0JCX0KIAkJc2xvdC0+ZmxhZ3MgfD0gKFNMT1RfRU5BQkxFRCB8IFNMT1RfUE9XRVJFRE9OKTsKIAl9CiAKQEAgLTIyNyw2MiArMjM4LDYgQEAKIH0KIAogCi0vKiBkZWNvZGUgQUNQSSBfQ1JTIGRhdGEgYW5kIGNvbnZlcnQgaW50byBvdXIgaW50ZXJuYWwgcmVzb3VyY2UgbGlzdAotICogVEJEOiBfVFJBLCBldGMuCi0gKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotZGVjb2RlX2FjcGlfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqKSBjb250ZXh0OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlczsKLQotCWlmIChyZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzE2ICYmCi0JICAgIHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTMzIgJiYKLQkgICAgcmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1M2NCkKLQkJcmV0dXJuIEFFX09LOwotCi0JYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQocmVzb3VyY2UsICZhZGRyZXNzKTsKLQotCWlmIChhZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyID09IEFDUElfUFJPRFVDRVIgJiYgYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApIHsKLQkJZGJnKCJyZXNvdXJjZSB0eXBlOiAlZDogMHglbGx4IC0gMHglbGx4XG4iLCBhZGRyZXNzLnJlc291cmNlX3R5cGUsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHJlc3MubWluX2FkZHJlc3NfcmFuZ2UsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHJlc3MubWF4X2FkZHJlc3NfcmFuZ2UpOwotCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZSwKLQkJCQkgICAgYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCk7Ci0JCWlmICghcmVzKSB7Ci0JCQllcnIoIm91dCBvZiBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0KLQkJc3dpdGNoIChhZGRyZXNzLnJlc291cmNlX3R5cGUpIHsKLQkJY2FzZSBBQ1BJX01FTU9SWV9SQU5HRToKLQkJCWlmIChhZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID09IEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWSkgewotCQkJCXJlcy0+bmV4dCA9IGJyaWRnZS0+cF9tZW1faGVhZDsKLQkJCQlicmlkZ2UtPnBfbWVtX2hlYWQgPSByZXM7Ci0JCQl9IGVsc2UgewotCQkJCXJlcy0+bmV4dCA9IGJyaWRnZS0+bWVtX2hlYWQ7Ci0JCQkJYnJpZGdlLT5tZW1faGVhZCA9IHJlczsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFDUElfSU9fUkFOR0U6Ci0JCQlyZXMtPm5leHQgPSBicmlkZ2UtPmlvX2hlYWQ7Ci0JCQlicmlkZ2UtPmlvX2hlYWQgPSByZXM7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6Ci0JCQlyZXMtPm5leHQgPSBicmlkZ2UtPmJ1c19oZWFkOwotCQkJYnJpZGdlLT5idXNfaGVhZCA9IHJlczsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogaW52YWxpZCB0eXBlICovCi0JCQlrZnJlZShyZXMpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KIC8qIGRlY29kZSBBQ1BJIDIuMCBfSFBQIGhvdCBwbHVnIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyB2b2lkIGRlY29kZV9ocHAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCiB7CkBAIC0zNDYsMzQgKzMwMSwyOSBAQAogCS8qIGRlY29kZSBBQ1BJIDIuMCBfSFBQIChob3QgcGx1ZyBwYXJhbWV0ZXJzKSAqLwogCWRlY29kZV9ocHAoYnJpZGdlKTsKIAotCS8qIHN1YnRyYWN0IGFsbCByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQlhY3BpcGhwX2RldGVjdF9wY2lfcmVzb3VyY2UoYnJpZGdlKTsKLQogCS8qIHJlZ2lzdGVyIGFsbCBzbG90IG9iamVjdHMgdW5kZXIgdGhpcyBicmlkZ2UgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGJyaWRnZS0+aGFuZGxlLCAodTMyKTEsCiAJCQkJICAgICByZWdpc3Rlcl9zbG90LCBicmlkZ2UsIE5VTEwpOwogCiAJLyogaW5zdGFsbCBub3RpZnkgaGFuZGxlciAqLwotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihicmlkZ2UtPmhhbmRsZSwKKwlpZiAoYnJpZGdlLT50eXBlICE9IEJSSURHRV9UWVBFX0hPU1QpIHsKKwkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGJyaWRnZS0+aGFuZGxlLAogCQkJCQkgICAgIEFDUElfU1lTVEVNX05PVElGWSwKIAkJCQkJICAgICBoYW5kbGVfaG90cGx1Z19ldmVudF9icmlkZ2UsCiAJCQkJCSAgICAgYnJpZGdlKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQllcnIoImZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHQgbm90aWZ5IGhhbmRsZXJcbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWVycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVycnVwdCBub3RpZnkgaGFuZGxlclxuIik7CisJCX0KIAl9CiAKIAlsaXN0X2FkZCgmYnJpZGdlLT5saXN0LCAmYnJpZGdlX2xpc3QpOwotCi0JZGJnKCJCcmlkZ2UgcmVzb3VyY2U6XG4iKTsKLQlhY3BpcGhwX2R1bXBfcmVzb3VyY2UoYnJpZGdlKTsKIH0KIAogCiAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBob3N0IGJyaWRnZSBkYXRhIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgYWRkX2hvc3RfYnJpZGdlKGFjcGlfaGFuZGxlICpoYW5kbGUsIGludCBzZWcsIGludCBidXMpCitzdGF0aWMgdm9pZCBhZGRfaG9zdF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHBjaV9idXMgKnBjaV9idXMpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwogCiAJYnJpZGdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlwaHBfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CkBAIC0zODQsNTIgKzMzNCwxOSBAQAogCiAJYnJpZGdlLT50eXBlID0gQlJJREdFX1RZUEVfSE9TVDsKIAlicmlkZ2UtPmhhbmRsZSA9IGhhbmRsZTsKLQlicmlkZ2UtPnNlZyA9IHNlZzsKLQlicmlkZ2UtPmJ1cyA9IGJ1czsKIAotCWJyaWRnZS0+cGNpX2J1cyA9IHBjaV9maW5kX2J1cyhzZWcsIGJ1cyk7CisJYnJpZGdlLT5wY2lfYnVzID0gcGNpX2J1czsKIAogCXNwaW5fbG9ja19pbml0KCZicmlkZ2UtPnJlc19sb2NrKTsKIAotCS8qIHRvIGJlIG92ZXJyaWRkZW4gd2hlbiB3ZSBkZWNvZGUgX0NSUwkqLwotCWJyaWRnZS0+c3ViID0gYnJpZGdlLT5idXM7Ci0KLQkvKiBkZWNvZGUgcmVzb3VyY2VzICovCi0KLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJZGVjb2RlX2FjcGlfcmVzb3VyY2UsIGJyaWRnZSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZXJyKCJmYWlsZWQgdG8gZGVjb2RlIGJyaWRnZSByZXNvdXJjZXNcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKCZicmlkZ2UtPmlvX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmYnJpZGdlLT5tZW1faGVhZCk7Ci0JYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKCZicmlkZ2UtPnBfbWVtX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmYnJpZGdlLT5idXNfaGVhZCk7Ci0KLQlkYmcoIkFDUEkgX0NSUyByZXNvdXJjZTpcbiIpOwotCWFjcGlwaHBfZHVtcF9yZXNvdXJjZShicmlkZ2UpOwotCi0JaWYgKGJyaWRnZS0+YnVzX2hlYWQpIHsKLQkJYnJpZGdlLT5idXMgPSBicmlkZ2UtPmJ1c19oZWFkLT5iYXNlOwotCQlicmlkZ2UtPnN1YiA9IGJyaWRnZS0+YnVzX2hlYWQtPmJhc2UgKyBicmlkZ2UtPmJ1c19oZWFkLT5sZW5ndGggLSAxOwotCX0KLQogCWluaXRfYnJpZGdlX21pc2MoYnJpZGdlKTsKIH0KIAogCiAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBQQ0ktdG8tUENJIGJyaWRnZSBkYXRhIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgYWRkX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgaW50IHNlZywgaW50IGJ1cywgaW50IGRldiwgaW50IGZuKQorc3RhdGljIHZvaWQgYWRkX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7Ci0JdTggdG1wODsKLQl1MTYgdG1wMTY7Ci0JdTY0IGJhc2U2NCwgbGltaXQ2NDsKLQl1MzIgYmFzZSwgbGltaXQsIGJhc2UzMnUsIGxpbWl0MzJ1OwogCiAJYnJpZGdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlwaHBfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJyaWRnZSA9PSBOVUxMKSB7CkBAIC00NDEsMTMzICszNTgsMjIgQEAKIAogCWJyaWRnZS0+dHlwZSA9IEJSSURHRV9UWVBFX1AyUDsKIAlicmlkZ2UtPmhhbmRsZSA9IGhhbmRsZTsKLQlicmlkZ2UtPnNlZyA9IHNlZzsKIAotCWJyaWRnZS0+cGNpX2RldiA9IHBjaV9maW5kX3Nsb3QoYnVzLCBQQ0lfREVWRk4oZGV2LCBmbikpOwotCWlmICghYnJpZGdlLT5wY2lfZGV2KSB7Ci0JCWVycigiQ2FuJ3QgZ2V0IHBjaV9kZXZcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JYnJpZGdlLT5wY2lfYnVzID0gYnJpZGdlLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZTsKKwlicmlkZ2UtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKKwlicmlkZ2UtPnBjaV9idXMgPSBwY2lfZGV2LT5zdWJvcmRpbmF0ZTsKIAlpZiAoIWJyaWRnZS0+cGNpX2J1cykgewogCQllcnIoIlRoaXMgaXMgbm90IGEgUENJLXRvLVBDSSBicmlkZ2UhXG4iKTsKLQkJa2ZyZWUoYnJpZGdlKTsKLQkJcmV0dXJuOworCQlnb3RvIGVycjsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmYnJpZGdlLT5yZXNfbG9jayk7CiAKLQlicmlkZ2UtPmJ1cyA9IGJyaWRnZS0+cGNpX2J1cy0+bnVtYmVyOwotCWJyaWRnZS0+c3ViID0gYnJpZGdlLT5wY2lfYnVzLT5zdWJvcmRpbmF0ZTsKLQotCS8qCi0JICogZGVjb2RlIHJlc291cmNlcyB1bmRlciB0aGlzIFAyUCBicmlkZ2UKLQkgKi8KLQotCS8qIEkvTyByZXNvdXJjZXMgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShicmlkZ2UtPnBjaV9kZXYsIFBDSV9JT19CQVNFLCAmdG1wOCk7Ci0JYmFzZSA9IHRtcDg7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfSU9fTElNSVQsICZ0bXA4KTsKLQlsaW1pdCA9IHRtcDg7Ci0KLQlzd2l0Y2ggKGJhc2UgJiBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLKSB7Ci0JY2FzZSBQQ0lfSU9fUkFOR0VfVFlQRV8xNjoKLQkJYmFzZSA9IChiYXNlIDw8IDgpICYgMHhmMDAwOwotCQlsaW1pdCA9ICgobGltaXQgPDwgOCkgJiAweGYwMDApICsgMHhmZmY7Ci0JCWJyaWRnZS0+aW9faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCQlpZiAoIWJyaWRnZS0+aW9faGVhZCkgewotCQkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCWtmcmVlKGJyaWRnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGJnKCIxNmJpdCBJL08gcmFuZ2U6ICUwNHgtJTA0eFxuIiwKLQkJICAgICh1MzIpYnJpZGdlLT5pb19oZWFkLT5iYXNlLAotCQkgICAgKHUzMikoYnJpZGdlLT5pb19oZWFkLT5iYXNlICsgYnJpZGdlLT5pb19oZWFkLT5sZW5ndGggLSAxKSk7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0lPX1JBTkdFX1RZUEVfMzI6Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX0lPX0JBU0VfVVBQRVIxNiwgJnRtcDE2KTsKLQkJYmFzZSA9ICgodTMyKXRtcDE2IDw8IDE2KSB8ICgoYmFzZSA8PCA4KSAmIDB4ZjAwMCk7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsICZ0bXAxNik7Ci0JCWxpbWl0ID0gKCgodTMyKXRtcDE2IDw8IDE2KSB8ICgobGltaXQgPDwgOCkgJiAweGYwMDApKSArIDB4ZmZmOwotCQlicmlkZ2UtPmlvX2hlYWQgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoKHU2NCliYXNlLCBsaW1pdCAtIGJhc2UgKyAxKTsKLQkJaWYgKCFicmlkZ2UtPmlvX2hlYWQpIHsKLQkJCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlrZnJlZShicmlkZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRiZygiMzJiaXQgSS9PIHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JCSAgICAodTMyKWJyaWRnZS0+aW9faGVhZC0+YmFzZSwKLQkJICAgICh1MzIpKGJyaWRnZS0+aW9faGVhZC0+YmFzZSArIGJyaWRnZS0+aW9faGVhZC0+bGVuZ3RoIC0gMSkpOwotCQlicmVhazsKLQljYXNlIDB4MGY6Ci0JCWRiZygiSS9PIHNwYWNlIHVuc3VwcG9ydGVkXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJd2FybigiVW5rbm93biBJL08gcmFuZ2UgdHlwZVxuIik7Ci0JfQotCi0JLyogTWVtb3J5IHJlc291cmNlcyAobWFuZGF0b3J5IGZvciBQMlAgYnJpZGdlKSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX01FTU9SWV9CQVNFLCAmdG1wMTYpOwotCWJhc2UgPSAodG1wMTYgJiAweGZmZjApIDw8IDE2OwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX01FTU9SWV9MSU1JVCwgJnRtcDE2KTsKLQlsaW1pdCA9ICgodG1wMTYgJiAweGZmZjApIDw8IDE2KSB8IDB4ZmZmZmY7Ci0JYnJpZGdlLT5tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCWlmICghYnJpZGdlLT5tZW1faGVhZCkgewotCQllcnIoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCWRiZygiMzJiaXQgTWVtb3J5IHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JICAgICh1MzIpYnJpZGdlLT5tZW1faGVhZC0+YmFzZSwKLQkgICAgKHUzMikoYnJpZGdlLT5tZW1faGVhZC0+YmFzZSArIGJyaWRnZS0+bWVtX2hlYWQtPmxlbmd0aC0xKSk7Ci0KLQkvKiBQcmVmZXRjaGFibGUgTWVtb3J5IHJlc291cmNlcyAob3B0aW9uYWwpICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgJnRtcDE2KTsKLQliYXNlID0gdG1wMTY7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsICZ0bXAxNik7Ci0JbGltaXQgPSB0bXAxNjsKLQotCXN3aXRjaCAoYmFzZSAmIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLKSB7Ci0JY2FzZSBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyOgotCQliYXNlID0gKGJhc2UgJiAweGZmZjApIDw8IDE2OwotCQlsaW1pdCA9ICgobGltaXQgJiAweGZmZjApIDw8IDE2KSB8IDB4ZmZmZmY7Ci0JCWJyaWRnZS0+cF9tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCQlpZiAoIWJyaWRnZS0+cF9tZW1faGVhZCkgewotCQkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCWtmcmVlKGJyaWRnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGJnKCIzMmJpdCBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JCSAgICAodTMyKWJyaWRnZS0+cF9tZW1faGVhZC0+YmFzZSwKLQkJICAgICh1MzIpKGJyaWRnZS0+cF9tZW1faGVhZC0+YmFzZSArIGJyaWRnZS0+cF9tZW1faGVhZC0+bGVuZ3RoIC0gMSkpOwotCQlicmVhazsKLQljYXNlIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQ6Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UtPnBjaV9kZXYsIFBDSV9QUkVGX0JBU0VfVVBQRVIzMiwgJmJhc2UzMnUpOwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyLCAmbGltaXQzMnUpOwotCQliYXNlNjQgPSAoKHU2NCliYXNlMzJ1IDw8IDMyKSB8ICgoYmFzZSAmIDB4ZmZmMCkgPDwgMTYpOwotCQlsaW1pdDY0ID0gKCgodTY0KWxpbWl0MzJ1IDw8IDMyKSB8ICgobGltaXQgJiAweGZmZjApIDw8IDE2KSkgKyAweGZmZmZmOwotCi0JCWJyaWRnZS0+cF9tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShiYXNlNjQsIGxpbWl0NjQgLSBiYXNlNjQgKyAxKTsKLQkJaWYgKCFicmlkZ2UtPnBfbWVtX2hlYWQpIHsKLQkJCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlrZnJlZShicmlkZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRiZygiNjRiaXQgUHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZTogJTA4eCUwOHgtJTA4eCUwOHhcbiIsCi0JCSAgICAodTMyKShicmlkZ2UtPnBfbWVtX2hlYWQtPmJhc2UgPj4gMzIpLAotCQkgICAgKHUzMikoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICYgMHhmZmZmZmZmZiksCi0JCSAgICAodTMyKSgoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICsgYnJpZGdlLT5wX21lbV9oZWFkLT5sZW5ndGggLSAxKSA+PiAzMiksCi0JCSAgICAodTMyKSgoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICsgYnJpZGdlLT5wX21lbV9oZWFkLT5sZW5ndGggLSAxKSAmIDB4ZmZmZmZmZmYpKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDBmOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQl3YXJuKCJVbmtub3duIHByZWZldGNoYWxlIG1lbW9yeSB0eXBlXG4iKTsKLQl9Ci0KIAlpbml0X2JyaWRnZV9taXNjKGJyaWRnZSk7CisJcmV0dXJuOworIGVycjoKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwlrZnJlZShicmlkZ2UpOworCXJldHVybjsKIH0KIAogCkBAIC01NzcsMTQgKzM4MywxMCBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBkdW1teV9oYW5kbGU7Ci0JdW5zaWduZWQgbG9uZyAqc2VnYnVzID0gY29udGV4dDsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQlpbnQgc2VnLCBidXMsIGRldmljZSwgZnVuY3Rpb247CisJaW50IGRldmljZSwgZnVuY3Rpb247CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKLQotCS8qIGdldCBQQ0kgYWRkcmVzcyAqLwotCXNlZyA9ICgqc2VnYnVzID4+IDgpICYgMHhmZjsKLQlidXMgPSAqc2VnYnVzICYgMHhmZjsKKwlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cyA9IGNvbnRleHQ7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0FEUiIsICZkdW1teV9oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTU5OSwyMCArNDAxLDE5IEBACiAJZGV2aWNlID0gKHRtcCA+PiAxNikgJiAweGZmZmY7CiAJZnVuY3Rpb24gPSB0bXAgJiAweGZmZmY7CiAKLQlkZXYgPSBwY2lfZmluZF9zbG90KGJ1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKKwlkZXYgPSBwY2lfZ2V0X3Nsb3QocGNpX2J1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKIAotCWlmICghZGV2KQotCQlyZXR1cm4gQUVfT0s7Ci0KLQlpZiAoIWRldi0+c3Vib3JkaW5hdGUpCi0JCXJldHVybiBBRV9PSzsKKwlpZiAoIWRldiB8fCAhZGV2LT5zdWJvcmRpbmF0ZSkKKwkJZ290byBvdXQ7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCiAJaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApIHsKIAkJZGJnKCJmb3VuZCBQQ0ktdG8tUENJIGJyaWRnZSBhdCBQQ0kgJXNcbiIsIHBjaV9uYW1lKGRldikpOwotCQlhZGRfcDJwX2JyaWRnZShoYW5kbGUsIHNlZywgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uKTsKKwkJYWRkX3AycF9icmlkZ2UoaGFuZGxlLCBkZXYpOwogCX0KIAorIG91dDoKKwlwY2lfZGV2X3B1dChkZXYpOwogCXJldHVybiBBRV9PSzsKIH0KIApAQCAtNjI0LDYgKzQyNSw3IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHNlZywgYnVzOwogCWFjcGlfaGFuZGxlIGR1bW15X2hhbmRsZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1czsKIAogCS8qIGlmIHRoZSBicmlkZ2UgZG9lc24ndCBoYXZlIF9TVEEsIHdlIGFzc3VtZSBpdCBpcyBhbHdheXMgdGhlcmUgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX1NUQSIsICZkdW1teV9oYW5kbGUpOwpAQCAtNjUzLDE4ICs0NTUsMjIgQEAKIAkJYnVzID0gMDsKIAl9CiAKLQkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCi0JaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApIHsKLQkJZGJnKCJmb3VuZCBQQ0kgaG9zdC1idXMgYnJpZGdlIHdpdGggaG90LXBsdWdnYWJsZSBzbG90c1xuIik7Ci0JCWFkZF9ob3N0X2JyaWRnZShoYW5kbGUsIHNlZywgYnVzKTsKKwlwY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHNlZywgYnVzKTsKKwlpZiAoIXBjaV9idXMpIHsKKwkJZXJyKCJDYW4ndCBmaW5kIGJ1cyAlMDR4OiUwMnhcbiIsIHNlZywgYnVzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdG1wID0gc2VnIDw8IDggfCBidXM7CisJLyogY2hlY2sgaWYgdGhpcyBicmlkZ2UgaGFzIGVqZWN0YWJsZSBzbG90cyAqLworCWlmIChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGhhbmRsZSkgPiAwKSB7CisJCWRiZygiZm91bmQgUENJIGhvc3QtYnVzIGJyaWRnZSB3aXRoIGhvdC1wbHVnZ2FibGUgc2xvdHNcbiIpOworCQlhZGRfaG9zdF9icmlkZ2UoaGFuZGxlLCBwY2lfYnVzKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJLyogc2VhcmNoIFAyUCBicmlkZ2VzIHVuZGVyIHRoaXMgaG9zdCBicmlkZ2UgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAotCQkJCSAgICAgZmluZF9wMnBfYnJpZGdlLCAmdG1wLCBOVUxMKTsKKwkJCQkgICAgIGZpbmRfcDJwX2JyaWRnZSwgcGNpX2J1cywgTlVMTCk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXdhcm4oImZpbmRfcDJwX2JyaWRnZSBmYWllZCAoZXJyb3IgY29kZSA9IDB4JXgpXG4iLHN0YXR1cyk7CkBAIC02NzIsMTIgKzQ3OCwyMDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCWxpc3RfZm9yX2VhY2goaGVhZCwgJmJyaWRnZV9saXN0KSB7CisJCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gbGlzdF9lbnRyeShoZWFkLAorCQkJCQkJc3RydWN0IGFjcGlwaHBfYnJpZGdlLCBsaXN0KTsKKwkJaWYgKGJyaWRnZS0+aGFuZGxlID09IGhhbmRsZSkKKwkJCXJldHVybiBicmlkZ2U7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYnJpZGdlKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0bXA7CisJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gYnJpZGdlLT5oYW5kbGU7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihoYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQllcnIoImZhaWxlZCB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOworCisJc2xvdCA9IGJyaWRnZS0+c2xvdHM7CisJd2hpbGUgKHNsb3QpIHsKKwkJc3RydWN0IGFjcGlwaHBfc2xvdCAqbmV4dCA9IHNsb3QtPm5leHQ7CisJCWxpc3RfZm9yX2VhY2hfc2FmZSAobGlzdCwgdG1wLCAmc2xvdC0+ZnVuY3MpIHsKKwkJCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CisJCQlmdW5jID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKKwkJCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGZ1bmMtPmhhbmRsZSwKKwkJCQkJCUFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJCWhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CisJCQlwY2lfZGV2X3B1dChmdW5jLT5wY2lfZGV2KTsKKwkJCWxpc3RfZGVsKGxpc3QpOworCQkJa2ZyZWUoZnVuYyk7CisJCX0KKwkJa2ZyZWUoc2xvdCk7CisJCXNsb3QgPSBuZXh0OworCX0KKworCXBjaV9kZXZfcHV0KGJyaWRnZS0+cGNpX2Rldik7CisJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CisJa2ZyZWUoYnJpZGdlKTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitjbGVhbnVwX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7CisKKwlpZiAoIShicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKSkpCisJCXJldHVybiBBRV9PSzsKKwljbGVhbnVwX2JyaWRnZShicmlkZ2UpOworCXJldHVybiBBRV9PSzsKK30KIAogc3RhdGljIHZvaWQgcmVtb3ZlX2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JLyogTm8tb3AgZm9yIG5vdyAuLiAqLworCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOworCisJYnJpZGdlID0gYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGhhbmRsZSk7CisJaWYgKGJyaWRnZSkgeworCQljbGVhbnVwX2JyaWRnZShicmlkZ2UpOworCX0gZWxzZSB7CisJCS8qIGNsZWFuLXVwIHAycCBicmlkZ2VzIHVuZGVyIHRoaXMgaG9zdCBicmlkZ2UgKi8KKwkJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCisJCQkJKHUzMikxLCBjbGVhbnVwX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwpOworCX0KIH0KIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogZ2V0X2FwaWNfcGNpX2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX3BjaV9pZCBpZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X3BjaV9pZChoYW5kbGUsICZpZCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1cyA9IHBjaV9maW5kX2J1cyhpZC5zZWdtZW50LCBpZC5idXMpOworCWlmICghYnVzKQorCQlyZXR1cm4gTlVMTDsKKworCWRldiA9IHBjaV9nZXRfc2xvdChidXMsIFBDSV9ERVZGTihpZC5kZXZpY2UsIGlkLmZ1bmN0aW9uKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKChkZXYtPmNsYXNzICE9IFBDSV9DTEFTU19TWVNURU1fUElDX0lPQVBJQykgJiYKKwkgICAgKGRldi0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQykpCisJeworCQlwY2lfZGV2X3B1dChkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IGdldF9nc2lfYmFzZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiAqZ3NpX2Jhc2UpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGdzYjsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXZvaWQgKnRhYmxlOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HU0IiLCBOVUxMLCAmZ3NiKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJKmdzaV9iYXNlID0gKHUzMilnc2I7CisJCXJldHVybiAwOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9NQVQiLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWJ1ZmZlci5sZW5ndGggfHwgIWJ1ZmZlci5wb2ludGVyKQorCQlyZXR1cm4gLTE7CisKKwlvYmogPSBidWZmZXIucG9pbnRlcjsKKwlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCisJCWdvdG8gb3V0OworCisJdGFibGUgPSBvYmotPmJ1ZmZlci5wb2ludGVyOworCXN3aXRjaCAoKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKXRhYmxlKS0+dHlwZSkgeworCWNhc2UgQUNQSV9NQURUX0lPU0FQSUM6CisJCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwljYXNlIEFDUElfTUFEVF9JT0FQSUM6CisJCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICopdGFibGUpLT5nbG9iYWxfaXJxX2Jhc2U7CisJCXJlc3VsdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyBvdXQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMKK2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgc3RhOworCWFjcGlfaGFuZGxlIHRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgZ3NpX2Jhc2U7CisJdTY0IHBoeXNfYWRkcjsKKworCS8qIEV2YWx1YXRlIF9TVEEgaWYgcHJlc2VudCAqLworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHN0YSAhPSBBQ1BJX1NUQV9BTEwpCisJCXJldHVybiBBRV9DVFJMX0RFUFRIOworCisJLyogU2NhbiBvbmx5IFBDSSBidXMgc2NvcGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0hJRCIsICZ0bXApOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIEFFX0NUUkxfREVQVEg7CisKKwlpZiAoZ2V0X2dzaV9iYXNlKGhhbmRsZSwgJmdzaV9iYXNlKSkKKwkJcmV0dXJuIEFFX09LOworCisJcGRldiA9IGdldF9hcGljX3BjaV9pbmZvKGhhbmRsZSk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gQUVfT0s7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJCXJldHVybiBBRV9PSzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgIkkvTyBBUElDKGFjcGlwaHApIikpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwkJcmV0dXJuIEFFX09LOworCX0KKworCXBoeXNfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBwaHlzX2FkZHIsIGdzaV9iYXNlKSkgeworCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJCXJldHVybiBBRV9PSzsKKwl9CisKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3N0YXRpYyBpbnQgYWNwaXBocF9jb25maWd1cmVfaW9hcGljcyhhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBwb3dlcl9vbl9zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7CkBAIC03MTksOCArNzE4LDYgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKIAogCWludCByZXR2YWwgPSAwOwogCkBAIC03MzEsNyArNzI4LDcgQEAKIAlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKIAkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CiAKLQkJaWYgKGZ1bmMtPnBjaV9kZXYgJiYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfUFMzKSkgeworCQlpZiAoZnVuYy0+ZmxhZ3MgJiBGVU5DX0hBU19QUzMpIHsKIAkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9QUzMiLCBOVUxMLCBOVUxMKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXdhcm4oIiVzOiBfUFMzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTc0MiwyNyArNzM5LDYgQEAKIAkJfQogCX0KIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQotCQkvKiBXZSBkb24ndCB3YW50IHRvIGNhbGwgX0VKMCBvbiBub24tZXhpc3RpbmcgZnVuY3Rpb25zLiAqLwotCQlpZiAoZnVuYy0+cGNpX2RldiAmJiAoZnVuYy0+ZmxhZ3MgJiBGVU5DX0hBU19FSjApKSB7Ci0JCQkvKiBfRUowIG1ldGhvZCB0YWtlIG9uZSBhcmd1bWVudCAqLwotCQkJYXJnX2xpc3QuY291bnQgPSAxOwotCQkJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7Ci0JCQlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCQkJYXJnLmludGVnZXIudmFsdWUgPSAxOwotCi0JCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChmdW5jLT5oYW5kbGUsICJfRUowIiwgJmFyZ19saXN0LCBOVUxMKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXdhcm4oIiVzOiBfRUowIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR2YWwgPSAtMTsKLQkJCQlnb3RvIGVycl9leGl0OwotCQkJfSBlbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KIAkvKiBUQkQ6IGV2YWx1YXRlIF9TVEEgdG8gY2hlY2sgaWYgdGhlIHNsb3QgaXMgZGlzYWJsZWQgKi8KIAogCXNsb3QtPmZsYWdzICY9ICh+U0xPVF9QT1dFUkVET04pOwpAQCAtNzgyLDcwICs3NTgsNTYgQEAKICAqLwogc3RhdGljIGludCBlbmFibGVfZGV2aWNlKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7Ci0JdTggYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmNoaWxkOworCXN0cnVjdCBwY2lfYnVzICpidXMgPSBzbG90LT5icmlkZ2UtPnBjaV9idXM7CiAJc3RydWN0IGxpc3RfaGVhZCAqbDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCWludCByZXR2YWwgPSAwOwotCWludCBudW07CisJaW50IG51bSwgbWF4LCBwYXNzOwogCiAJaWYgKHNsb3QtPmZsYWdzICYgU0xPVF9FTkFCTEVEKQogCQlnb3RvIGVycl9leGl0OwogCiAJLyogc2FuaXR5IGNoZWNrOiBkZXYgc2hvdWxkIGJlIE5VTEwgd2hlbiBob3QtcGx1Z2dlZCBpbiAqLwotCWRldiA9IHBjaV9maW5kX3Nsb3Qoc2xvdC0+YnJpZGdlLT5idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKKwlkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLCAwKSk7CiAJaWYgKGRldikgewogCQkvKiBUaGlzIGNhc2Ugc2hvdWxkbid0IGhhcHBlbiAqLwogCQllcnIoInBjaV9kZXYgc3RydWN0dXJlIGFscmVhZHkgZXhpc3RzLlxuIik7CisJCXBjaV9kZXZfcHV0KGRldik7CiAJCXJldHZhbCA9IC0xOwogCQlnb3RvIGVycl9leGl0OwogCX0KIAotCS8qIGFsbG9jYXRlIHJlc291cmNlcyB0byBkZXZpY2UgKi8KLQlyZXR2YWwgPSBhY3BpcGhwX2NvbmZpZ3VyZV9zbG90KHNsb3QpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyX2V4aXQ7Ci0KLQkvKiByZXR1cm5lZCBgZGV2JyBpcyB0aGUgKmZpcnN0IGZ1bmN0aW9uKiBvbmx5ISAqLwotCW51bSA9IHBjaV9zY2FuX3Nsb3Qoc2xvdC0+YnJpZGdlLT5wY2lfYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLCAwKSk7Ci0JaWYgKG51bSkKLQkJcGNpX2J1c19hZGRfZGV2aWNlcyhzbG90LT5icmlkZ2UtPnBjaV9idXMpOwotCWRldiA9IHBjaV9maW5kX3Nsb3Qoc2xvdC0+YnJpZGdlLT5idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKLQotCWlmICghZGV2KSB7CisJbnVtID0gcGNpX3NjYW5fc2xvdChidXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKKwlpZiAobnVtID09IDApIHsKIAkJZXJyKCJObyBuZXcgZGV2aWNlIGZvdW5kXG4iKTsKIAkJcmV0dmFsID0gLTE7CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCi0JaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCAmYnVzKTsKLQkJY2hpbGQgPSAoc3RydWN0IHBjaV9idXMqKSBwY2lfYWRkX25ld19idXMoZGV2LT5idXMsIGRldiwgYnVzKTsKLQkJcGNpX2RvX3NjYW5fYnVzKGNoaWxkKTsKKwltYXggPSBidXMtPnNlY29uZGFyeTsKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQkJaWYgKFBDSV9TTE9UKGRldi0+ZGV2Zm4pICE9IHNsb3QtPmRldmljZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgfHwKKwkJCSAgICBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKQorCQkJCW1heCA9IHBjaV9zY2FuX2JyaWRnZShidXMsIGRldiwgbWF4LCBwYXNzKTsKKwkJfQogCX0KIAorCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOworCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwogCS8qIGFzc29jaWF0ZSBwY2lfZGV2IHRvIG91ciByZXByZXNlbnRhdGlvbiAqLwogCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewogCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQotCQlmdW5jLT5wY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChzbG90LT5icmlkZ2UtPmJ1cywKLQkJCQkJICAgICAgUENJX0RFVkZOKHNsb3QtPmRldmljZSwKKwkJZnVuYy0+cGNpX2RldiA9IHBjaV9nZXRfc2xvdChidXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsCiAJCQkJCQkJZnVuYy0+ZnVuY3Rpb24pKTsKLQkJaWYgKCFmdW5jLT5wY2lfZGV2KQotCQkJY29udGludWU7Ci0KLQkJLyogY29uZmlndXJlIGRldmljZSAqLwotCQlyZXR2YWwgPSBhY3BpcGhwX2NvbmZpZ3VyZV9mdW5jdGlvbihmdW5jKTsKLQkJaWYgKHJldHZhbCkKLQkJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCiAJc2xvdC0+ZmxhZ3MgfD0gU0xPVF9FTkFCTEVEOwogCi0JZGJnKCJBdmFpbGFibGUgcmVzb3VyY2VzOlxuIik7Ci0JYWNwaXBocF9kdW1wX3Jlc291cmNlKHNsb3QtPmJyaWRnZSk7Ci0KICBlcnJfZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtODY2LDkgKzgyOCwxMiBAQAogCiAJbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7CiAJCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOworCQlpZiAoIWZ1bmMtPnBjaV9kZXYpCisJCQljb250aW51ZTsKIAotCQlpZiAoZnVuYy0+cGNpX2RldikKLQkJCWFjcGlwaHBfdW5jb25maWd1cmVfZnVuY3Rpb24oZnVuYyk7CisJCXBjaV9yZW1vdmVfYnVzX2RldmljZShmdW5jLT5wY2lfZGV2KTsKKwkJcGNpX2Rldl9wdXQoZnVuYy0+cGNpX2Rldik7CisJCWZ1bmMtPnBjaV9kZXYgPSBOVUxMOwogCX0KIAogCXNsb3QtPmZsYWdzICY9ICh+U0xPVF9FTkFCTEVEKTsKQEAgLTkyMCw2ICs4ODUsMzkgQEAKIH0KIAogLyoqCisgKiBhY3BpcGhwX2VqZWN0X3Nsb3QgLSBwaHlzaWNhbGx5IGVqZWN0IHRoZSBzbG90CisgKi8KK3N0YXRpYyBpbnQgYWNwaXBocF9lamVjdF9zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisKKwlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKKwkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBjYWxsIF9FSjAgb24gbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gKi8KKwkJaWYgKChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX0VKMCkpIHsKKwkJCS8qIF9FSjAgbWV0aG9kIHRha2Ugb25lIGFyZ3VtZW50ICovCisJCQlhcmdfbGlzdC5jb3VudCA9IDE7CisJCQlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwkJCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJCQlhcmcuaW50ZWdlci52YWx1ZSA9IDE7CisKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9FSjAiLCAmYXJnX2xpc3QsIE5VTEwpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJd2FybigiJXM6IF9FSjAgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKICAqIGFjcGlwaHBfY2hlY2tfYnJpZGdlIC0gcmUtZW51bWVyYXRlIGRldmljZXMKICAqCiAgKiBJdGVyYXRlIG92ZXIgYWxsIHNsb3RzIHVuZGVyIHRoaXMgYnJpZGdlIGFuZCBtYWtlIHN1cmUgdGhhdCBpZiBhCkBAIC05NDIsNiArOTQwLDggQEAKIAkJCWlmIChyZXR2YWwpIHsKIAkJCQllcnIoIkVycm9yIG9jY3VycmVkIGluIGRpc2FibGluZ1xuIik7CiAJCQkJZ290byBlcnJfZXhpdDsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaXBocF9lamVjdF9zbG90KHNsb3QpOwogCQkJfQogCQkJZGlzYWJsZWQrKzsKIAkJfSBlbHNlIHsKQEAgLTk2Miw2ICs5NjIsMTQ0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIHZvaWQgcHJvZ3JhbV9ocHAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCit7CisJdTE2IHBjaV9jbWQsIHBjaV9iY3RsOworCXN0cnVjdCBwY2lfZGV2ICpjZGV2OworCisJLyogUHJvZ3JhbSBocHAgdmFsdWVzIGZvciB0aGlzIGRldmljZSAqLworCWlmICghKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCB8fAorCQkJKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSAmJgorCQkJKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpKSkKKwkJcmV0dXJuOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQlicmlkZ2UtPmhwcC5jYWNoZV9saW5lX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJYnJpZGdlLT5ocHAubGF0ZW5jeV90aW1lcik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCWlmIChicmlkZ2UtPmhwcC5lbmFibGVfU0VSUikKKwkJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9TRVJSOworCWVsc2UKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfU0VSUjsKKwlpZiAoYnJpZGdlLT5ocHAuZW5hYmxlX1BFUlIpCisJCXBjaV9jbWQgfD0gUENJX0NPTU1BTkRfUEFSSVRZOworCWVsc2UKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfUEFSSVRZOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKworCS8qIFByb2dyYW0gYnJpZGdlIGNvbnRyb2wgdmFsdWUgYW5kIGNoaWxkIGRldmljZXMgKi8KKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ19MQVRFTkNZX1RJTUVSLAorCQkJCWJyaWRnZS0+aHBwLmxhdGVuY3lfdGltZXIpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9CUklER0VfQ09OVFJPTCwgJnBjaV9iY3RsKTsKKwkJaWYgKGJyaWRnZS0+aHBwLmVuYWJsZV9TRVJSKQorCQkJcGNpX2JjdGwgfD0gUENJX0JSSURHRV9DVExfU0VSUjsKKwkJZWxzZQorCQkJcGNpX2JjdGwgJj0gflBDSV9CUklER0VfQ1RMX1NFUlI7CisJCWlmIChicmlkZ2UtPmhwcC5lbmFibGVfUEVSUikKKwkJCXBjaV9iY3RsIHw9IFBDSV9CUklER0VfQ1RMX1BBUklUWTsKKwkJZWxzZQorCQkJcGNpX2JjdGwgJj0gflBDSV9CUklER0VfQ1RMX1BBUklUWTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0JSSURHRV9DT05UUk9MLCBwY2lfYmN0bCk7CisJCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzLAorCQkJCQlidXNfbGlzdCkKKwkJCQlwcm9ncmFtX2hwcChjZGV2LCBicmlkZ2UpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhY3BpcGhwX3NldF9ocHBfdmFsdWVzKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwltZW1zZXQoJmJyaWRnZSwgMCwgc2l6ZW9mKGJyaWRnZSkpOworCWJyaWRnZS5oYW5kbGUgPSBoYW5kbGU7CisJZGVjb2RlX2hwcCgmYnJpZGdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCisJCXByb2dyYW1faHBwKGRldiwgJmJyaWRnZSk7CisKK30KKworLyoKKyAqIFJlbW92ZSBkZXZpY2VzIGZvciB3aGljaCB3ZSBjb3VsZCBub3QgYXNzaWduIHJlc291cmNlcywgY2FsbAorICogYXJjaCBzcGVjaWZpYyBjb2RlIHRvIGZpeC11cCB0aGUgYnVzCisgKi8KK3N0YXRpYyB2b2lkIGFjcGlwaHBfc2FuaXRpemVfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHR5cGVfbWFzayA9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlmb3IgKGk9MDsgaTxQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNlW2ldOworCQkJaWYgKChyZXMtPmZsYWdzICYgdHlwZV9tYXNrKSAmJiAhcmVzLT5zdGFydCAmJgorCQkJCQlyZXMtPmVuZCkgeworCQkJCS8qIENvdWxkIG5vdCBhc3NpZ24gYSByZXF1aXJlZCByZXNvdXJjZXMKKwkJCQkgKiBmb3IgdGhpcyBkZXZpY2UsIHJlbW92ZSBpdCAqLworCQkJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKiBQcm9ncmFtIHJlc291cmNlcyBpbiBuZXdseSBpbnNlcnRlZCBicmlkZ2UgKi8KK3N0YXRpYyBpbnQgYWNwaXBocF9jb25maWd1cmVfYnJpZGdlIChhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfcGNpX2lkIHBjaV9pZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCisJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF9wY2lfaWQoaGFuZGxlLCAmcGNpX2lkKSkpIHsKKwkJZXJyKCJjYW5ub3QgZ2V0IFBDSSBkb21haW4gYW5kIGJ1cyBudW1iZXIgZm9yIGJyaWRnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlidXMgPSBwY2lfZmluZF9idXMocGNpX2lkLnNlZ21lbnQsIHBjaV9pZC5idXMpOworCWlmICghYnVzKSB7CisJCWVycigiY2Fubm90IGZpbmQgYnVzICVkOiVkXG4iLAorCQkJCXBjaV9pZC5zZWdtZW50LCBwY2lfaWQuYnVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKwlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKKwlhY3BpcGhwX3Nhbml0aXplX2J1cyhidXMpOworCWFjcGlwaHBfc2V0X2hwcF92YWx1ZXMoaGFuZGxlLCBidXMpOworCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOworCWFjcGlwaHBfY29uZmlndXJlX2lvYXBpY3MoaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JyaWRnZV9pbnNlcnRpb24oYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgKnBkZXZpY2U7CisJYWNwaV9oYW5kbGUgcGhhbmRsZTsKKworCWlmICgodHlwZSAhPSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0spICYmCisJCQkodHlwZSAhPSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0spKSB7CisJCWVycigidW5leHBlY3RlZCBub3RpZmljYXRpb24gdHlwZSAlZFxuIiwgdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGhhbmRsZSk7CisJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGhhbmRsZSwgJnBkZXZpY2UpKSB7CisJCWRiZygibm8gcGFyZW50IGRldmljZSwgYXNzdW1pbmcgTlVMTFxuIik7CisJCXBkZXZpY2UgPSBOVUxMOworCX0KKwlpZiAoYWNwaV9idXNfYWRkKCZkZXZpY2UsIHBkZXZpY2UsIGhhbmRsZSwgQUNQSV9CVVNfVFlQRV9ERVZJQ0UpKSB7CisJCWVycigiY2Fubm90IGFkZCBicmlkZ2UgdG8gYWNwaSBsaXN0XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWFjcGlwaHBfY29uZmlndXJlX2JyaWRnZShoYW5kbGUpICYmCisJCSFhY3BpX2J1c19zdGFydChkZXZpY2UpKQorCQlhZGRfYnJpZGdlKGhhbmRsZSk7CisJZWxzZQorCQllcnIoImNhbm5vdCBjb25maWd1cmUgYW5kIHN0YXJ0IGJyaWRnZVxuIik7CisKK30KKwogLyoKICAqIEFDUEkgZXZlbnQgaGFuZGxlcnMKICAqLwpAQCAtOTgyLDggKzExMjAsMTkgQEAKIAljaGFyIG9iam5hbWVbNjRdOwogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IC5sZW5ndGggPSBzaXplb2Yob2JqbmFtZSksCiAJCQkJICAgICAgLnBvaW50ZXIgPSBvYmpuYW1lIH07CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CiAKLQlicmlkZ2UgPSAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICopY29udGV4dDsKKwlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7CisJCS8qIFRoaXMgYnJpZGdlIG11c3QgaGF2ZSBqdXN0IGJlZW4gcGh5c2ljYWxseSBpbnNlcnRlZCAqLworCQloYW5kbGVfYnJpZGdlX2luc2VydGlvbihoYW5kbGUsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJYnJpZGdlID0gYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGhhbmRsZSk7CisJaWYgKCFicmlkZ2UpIHsKKwkJZXJyKCJjYW5ub3QgZ2V0IGJyaWRnZSBpbmZvXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCkBAIC0xMDMxLDcgKzExODAsNiBAQAogCX0KIH0KIAotCiAvKioKICAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMgLSBoYW5kbGUgQUNQSSBldmVudCBvbiBmdW5jdGlvbnMgKGkuZS4gc2xvdHMpCiAgKgpAQCAtMTA3NCw3ICsxMjIyLDggQEAKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CiAJCS8qIHJlcXVlc3QgZGV2aWNlIGVqZWN0ICovCiAJCWRiZygiJXM6IERldmljZSBlamVjdCBub3RpZnkgb24gJXNcbiIsIF9fRlVOQ1RJT05fXywgb2JqbmFtZSk7Ci0JCWFjcGlwaHBfZGlzYWJsZV9zbG90KGZ1bmMtPnNsb3QpOworCQlpZiAoIShhY3BpcGhwX2Rpc2FibGVfc2xvdChmdW5jLT5zbG90KSkpCisJCQlhY3BpcGhwX2VqZWN0X3Nsb3QoZnVuYy0+c2xvdCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEwODMsNiArMTIzMiw0NyBAQAogCX0KIH0KIAorc3RhdGljIGludCBpc19yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWludCBpOworCisJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaW5mbyA9IGJ1ZmZlci5wb2ludGVyOworCQlpZiAoKGluZm8tPnZhbGlkICYgQUNQSV9WQUxJRF9ISUQpICYmCisJCQkhc3RyY21wKFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkJCWluZm8tPmhhcmR3YXJlX2lkLnZhbHVlKSkgeworCQkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChpbmZvLT52YWxpZCAmIEFDUElfVkFMSURfQ0lEKSB7CisJCQlmb3IgKGk9MDsgaSA8IGluZm8tPmNvbXBhdGliaWxpdHlfaWQuY291bnQ7IGkrKykgeworCQkJCWlmICghc3RyY21wKFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkJCWluZm8tPmNvbXBhdGliaWxpdHlfaWQuaWRbaV0udmFsdWUpKSB7CisJCQkJCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitmaW5kX3Jvb3RfYnJpZGdlcyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlpbnQgKmNvdW50ID0gKGludCAqKWNvbnRleHQ7CisKKwlpZiAoaXNfcm9vdF9icmlkZ2UoaGFuZGxlKSkgeworCQlhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlLCBOVUxMKTsKKwkJCSgqY291bnQpKys7CisJfQorCXJldHVybiBBRV9PSyA7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9wY2lfZHJpdmVyIGFjcGlfcGNpX2hwX2RyaXZlciA9IHsKIAkuYWRkID0JCWFkZF9icmlkZ2UsCkBAIC0xMDk1LDE1ICsxMjg1LDE1IEBACiAgKi8KIGludCBfX2luaXQgYWNwaXBocF9nbHVlX2luaXQodm9pZCkKIHsKLQlpbnQgbnVtOworCWludCBudW0gPSAwOwogCi0JaWYgKGxpc3RfZW1wdHkoJnBjaV9yb290X2J1c2VzKSkKLQkJcmV0dXJuIC0xOwotCi0JbnVtID0gYWNwaV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3BjaV9ocF9kcml2ZXIpOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCUFDUElfVUlOVDMyX01BWCwgZmluZF9yb290X2JyaWRnZXMsICZudW0sIE5VTEwpOwogCiAJaWYgKG51bSA8PSAwKQogCQlyZXR1cm4gLTE7CisJZWxzZQorCQlhY3BpX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGNpX2hwX2RyaXZlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTYsNDYgKzEzMDYsNiBAQAogICovCiB2b2lkIF9fZXhpdCBhY3BpcGhwX2dsdWVfZXhpdCh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmwxLCAqbDIsICpuMSwgKm4yOwotCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QsICpuZXh0OwotCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlIChsMSwgbjEsICZicmlkZ2VfbGlzdCkgewotCQlicmlkZ2UgPSAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICopbDE7Ci0JCXNsb3QgPSBicmlkZ2UtPnNsb3RzOwotCQl3aGlsZSAoc2xvdCkgewotCQkJbmV4dCA9IHNsb3QtPm5leHQ7Ci0JCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGwyLCBuMiwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQkJZnVuYyA9IGxpc3RfZW50cnkobDIsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCQkJCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmZnVuYy0+aW9faGVhZCk7Ci0JCQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5tZW1faGVhZCk7Ci0JCQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5wX21lbV9oZWFkKTsKLQkJCQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPmJ1c19oZWFkKTsKLQkJCQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihmdW5jLT5oYW5kbGUsCi0JCQkJCQkJCSAgICBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQkJCQkJCSAgICBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7Ci0JCQkJa2ZyZWUoZnVuYyk7Ci0JCQl9Ci0JCQlrZnJlZShzbG90KTsKLQkJCXNsb3QgPSBuZXh0OwotCQl9Ci0JCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGJyaWRnZS0+aGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQkJCQkgICAgaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJZXJyKCJmYWlsZWQgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKLQotCQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmJyaWRnZS0+aW9faGVhZCk7Ci0JCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmYnJpZGdlLT5tZW1faGVhZCk7Ci0JCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmYnJpZGdlLT5wX21lbV9oZWFkKTsKLQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZicmlkZ2UtPmJ1c19oZWFkKTsKLQotCQlrZnJlZShicmlkZ2UpOwotCX0KLQogCWFjcGlfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3BjaV9ocF9kcml2ZXIpOwogfQogCkBAIC0xMTczLDExICsxMzIzLDE0IEBACiAKIAlsaXN0X2Zvcl9lYWNoIChub2RlLCAmYnJpZGdlX2xpc3QpIHsKIAkJYnJpZGdlID0gKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqKW5vZGU7Ci0JCWRiZygiQnVzJWQgJWRzbG90KHMpXG4iLCBicmlkZ2UtPmJ1cywgYnJpZGdlLT5ucl9zbG90cyk7CisJCWRiZygiQnVzICUwNHg6JTAyeCBoYXMgJWQgc2xvdCVzXG4iLAorCQkJCXBjaV9kb21haW5fbnIoYnJpZGdlLT5wY2lfYnVzKSwKKwkJCQlicmlkZ2UtPnBjaV9idXMtPm51bWJlciwgYnJpZGdlLT5ucl9zbG90cywKKwkJCQlicmlkZ2UtPm5yX3Nsb3RzID09IDEgPyAiIiA6ICJzIik7CiAJCW51bV9zbG90cyArPSBicmlkZ2UtPm5yX3Nsb3RzOwogCX0KIAotCWRiZygiVG90YWwgJWRzbG90c1xuIiwgbnVtX3Nsb3RzKTsKKwlkYmcoIlRvdGFsICVkIHNsb3RzXG4iLCBudW1fc2xvdHMpOwogCXJldHVybiBudW1fc2xvdHM7CiB9CiAKQEAgLTEyNTQsNyArMTQwNyw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKioKICAqIGFjcGlwaHBfZGlzYWJsZV9zbG90IC0gcG93ZXIgb2ZmIHNsb3QKICAqLwpAQCAtMTI3NCwxMyArMTQyNiw2IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfZXhpdDsKIAotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmc2xvdC0+YnJpZGdlLT5pb19oZWFkKTsKLQlhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoJnNsb3QtPmJyaWRnZS0+bWVtX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmc2xvdC0+YnJpZGdlLT5wX21lbV9oZWFkKTsKLQlhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoJnNsb3QtPmJyaWRnZS0+YnVzX2hlYWQpOwotCWRiZygiQXZhaWxhYmxlIHJlc291cmNlczpcbiIpOwotCWFjcGlwaHBfZHVtcF9yZXNvdXJjZShzbG90LT5icmlkZ2UpOwotCiAgZXJyX2V4aXQ6CiAJdXAoJnNsb3QtPmNyaXRfc2VjdCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTEyOTMsMTEgKzE0MzgsNyBAQAogICovCiB1OCBhY3BpcGhwX2dldF9wb3dlcl9zdGF0dXMoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKLQl1bnNpZ25lZCBpbnQgc3RhOwotCi0Jc3RhID0gZ2V0X3Nsb3Rfc3RhdHVzKHNsb3QpOwotCi0JcmV0dXJuIChzdGEgJiBBQ1BJX1NUQV9FTkFCTEVEKSA/IDEgOiAwOworCXJldHVybiAoc2xvdC0+ZmxhZ3MgJiBTTE9UX1BPV0VSRURPTik7CiB9CiAKIApAQCAtMTMzNSw5ICsxNDc2LDEwIEBACiB1MzIgYWNwaXBocF9nZXRfYWRkcmVzcyhzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KQogewogCXUzMiBhZGRyZXNzOworCXN0cnVjdCBwY2lfYnVzICpwY2lfYnVzID0gc2xvdC0+YnJpZGdlLT5wY2lfYnVzOwogCi0JYWRkcmVzcyA9ICgoc2xvdC0+YnJpZGdlLT5zZWcpIDw8IDE2KSB8Ci0JCSAgKChzbG90LT5icmlkZ2UtPmJ1cykgPDwgOCkgfAorCWFkZHJlc3MgPSAocGNpX2RvbWFpbl9ucihwY2lfYnVzKSA8PCAxNikgfAorCQkgIChwY2lfYnVzLT5udW1iZXIgPDwgOCkgfAogCQkgIHNsb3QtPmRldmljZTsKIAogCXJldHVybiBhZGRyZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ5N2M5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogQUNQSSBQQ0kgSG90UGx1ZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBtYW5hZ2VtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIElCTSBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDAyIFRha2F5b3NoaSBLb2NoaSAodC1rb2NoaUBicS5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIEhpcm9zaGkgQW9ubyAoaC1hb25vQGFwLmpwLm5lYy5jb20pCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgTkVDIENvcnBvcmF0aW9uCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSAiLi4vcGNpLmgiCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKLSNpbmNsdWRlICJhY3BpcGhwLmgiCi0KLSNkZWZpbmUgTVlfTkFNRSAiYWNwaXBocF9wY2kiCi0KLQotLyogYWxsb2NhdGUgbWVtL3BtZW0vaW8gcmVzb3VyY2UgdG8gYSBuZXcgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgaW5pdF9jb25maWdfc3BhY2UgKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0JdTMyIGJhciwgbGVuOwotCXUzMiBhZGRyZXNzW10gPSB7Ci0JCVBDSV9CQVNFX0FERFJFU1NfMCwKLQkJUENJX0JBU0VfQUREUkVTU18xLAotCQlQQ0lfQkFTRV9BRERSRVNTXzIsCi0JCVBDSV9CQVNFX0FERFJFU1NfMywKLQkJUENJX0JBU0VfQUREUkVTU180LAotCQlQQ0lfQkFTRV9BRERSRVNTXzUsCi0JCTAKLQl9OwotCWludCBjb3VudDsKLQlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IHBjaV9idXMgKnBidXM7Ci0JaW50IGJ1cywgZGV2aWNlLCBmdW5jdGlvbjsKLQl1bnNpZ25lZCBpbnQgZGV2Zm47Ci0JdTE2IHRtcDsKLQotCWJyaWRnZSA9IGZ1bmMtPnNsb3QtPmJyaWRnZTsKLQlwYnVzID0gYnJpZGdlLT5wY2lfYnVzOwotCWJ1cyA9IGJyaWRnZS0+YnVzOwotCWRldmljZSA9IGZ1bmMtPnNsb3QtPmRldmljZTsKLQlmdW5jdGlvbiA9IGZ1bmMtPmZ1bmN0aW9uOwotCWRldmZuID0gUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pOwotCi0JZm9yIChjb3VudCA9IDA7IGFkZHJlc3NbY291bnRdOyBjb3VudCsrKSB7CS8qIGZvciA2IEJBUnMgKi8KLQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCSAgIGFkZHJlc3NbY291bnRdLCAweEZGRkZGRkZGKTsKLQkJcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwgYWRkcmVzc1tjb3VudF0sICZiYXIpOwotCi0JCWlmICghYmFyKQkvKiBUaGlzIEJBUiBpcyBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCWNvbnRpbnVlOwotCi0JCWRiZygiRGV2aWNlICUwMnguJTAyeCBCQVIgJWQgd2FudHMgJXhcbiIsIGRldmljZSwgZnVuY3Rpb24sIGNvdW50LCBiYXIpOwotCi0JCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7Ci0JCQkvKiBUaGlzIGlzIElPICovCi0KLQkJCWxlbiA9IGJhciAmIChQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgJiAweEZGRkYpOwotCQkJbGVuID0gbGVuICYgfihsZW4gLSAxKTsKLQotCQkJZGJnKCJsZW4gaW4gSU8gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCXNwaW5fbG9jaygmYnJpZGdlLT5yZXNfbG9jayk7Ci0JCQlyZXMgPSBhY3BpcGhwX2dldF9pb19yZXNvdXJjZSgmYnJpZGdlLT5pb19oZWFkLCBsZW4pOwotCQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCi0JCQlpZiAoIXJlcykgewotCQkJCWVycigiY2Fubm90IGFsbG9jYXRlIHJlcXVlc3RlZCBpbyBmb3IgJTAyeDolMDJ4LiVkIGxlbiAleFxuIiwKLQkJCQkgICAgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uLCBsZW4pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKHBidXMsIGRldmZuLAotCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkgICAodTMyKXJlcy0+YmFzZSk7Ci0JCQlyZXMtPm5leHQgPSBmdW5jLT5pb19oZWFkOwotCQkJZnVuYy0+aW9faGVhZCA9IHJlczsKLQotCQl9IGVsc2UgewotCQkJLyogVGhpcyBpcyBNZW1vcnkgKi8KLQkJCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkgewotCQkJCS8qIHBmbWVtICovCi0KLQkJCQlsZW4gPSBiYXIgJiAweEZGRkZGRkYwOwotCQkJCWxlbiA9IH5sZW4gKyAxOwotCi0JCQkJZGJnKCJsZW4gaW4gUEZNRU0gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQkJCXJlcyA9IGFjcGlwaHBfZ2V0X3Jlc291cmNlKCZicmlkZ2UtPnBfbWVtX2hlYWQsIGxlbik7Ci0JCQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCi0JCQkJaWYgKCFyZXMpIHsKLQkJCQkJZXJyKCJjYW5ub3QgYWxsb2NhdGUgcmVxdWVzdGVkIHBmbWVtIGZvciAlMDJ4OiUwMnguJWQgbGVuICV4XG4iLAotCQkJCQkgICAgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uLCBsZW4pOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCi0JCQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkJICAgKHUzMilyZXMtPmJhc2UpOwotCi0JCQkJaWYgKGJhciAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsJLyogdGFrZXMgdXAgYW5vdGhlciBkd29yZCAqLwotCQkJCQlkYmcoImluc2lkZSB0aGUgcGZtZW0gNjQgY2FzZSwgY291bnQgJWRcbiIsIGNvdW50KTsKLQkJCQkJY291bnQgKz0gMTsKLQkJCQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCQkJCSAgIGFkZHJlc3NbY291bnRdLAotCQkJCQkJCQkgICAodTMyKShyZXMtPmJhc2UgPj4gMzIpKTsKLQkJCQl9Ci0KLQkJCQlyZXMtPm5leHQgPSBmdW5jLT5wX21lbV9oZWFkOwotCQkJCWZ1bmMtPnBfbWVtX2hlYWQgPSByZXM7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogcmVndWxhciBtZW1vcnkgKi8KLQotCQkJCWxlbiA9IGJhciAmIDB4RkZGRkZGRjA7Ci0JCQkJbGVuID0gfmxlbiArIDE7Ci0KLQkJCQlkYmcoImxlbiBpbiBNRU0gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQkJCXJlcyA9IGFjcGlwaHBfZ2V0X3Jlc291cmNlKCZicmlkZ2UtPm1lbV9oZWFkLCBsZW4pOwotCQkJCXNwaW5fdW5sb2NrKCZicmlkZ2UtPnJlc19sb2NrKTsKLQotCQkJCWlmICghcmVzKSB7Ci0JCQkJCWVycigiY2Fubm90IGFsbG9jYXRlIHJlcXVlc3RlZCBwZm1lbSBmb3IgJTAyeDolMDJ4LiVkIGxlbiAleFxuIiwKLQkJCQkJICAgIGJ1cywgZGV2aWNlLCBmdW5jdGlvbiwgbGVuKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKHBidXMsIGRldmZuLAotCQkJCQkJCSAgIGFkZHJlc3NbY291bnRdLAotCQkJCQkJCSAgICh1MzIpcmVzLT5iYXNlKTsKLQotCQkJCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSB7Ci0JCQkJCS8qIHRha2VzIHVwIGFub3RoZXIgZHdvcmQgKi8KLQkJCQkJZGJnKCJpbnNpZGUgbWVtIDY0IGNhc2UsIHJlZy4gbWVtLCBjb3VudCAlZFxuIiwgY291bnQpOwotCQkJCQljb3VudCArPSAxOwotCQkJCQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwKLQkJCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkJCSAgICh1MzIpKHJlcy0+YmFzZSA+PiAzMikpOwotCQkJCX0KLQotCQkJCXJlcy0+bmV4dCA9IGZ1bmMtPm1lbV9oZWFkOwotCQkJCWZ1bmMtPm1lbV9oZWFkID0gcmVzOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBkaXNhYmxlIGV4cGFuc2lvbiByb20gKi8KLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwgUENJX1JPTV9BRERSRVNTLCAweDAwMDAwMDAwKTsKLQotCS8qIHNldCBQQ0kgcGFyYW1ldGVycyBmcm9tIF9IUFAgKi8KLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19ieXRlKHBidXMsIGRldmZuLCBQQ0lfQ0FDSEVfTElORV9TSVpFLAotCQkJCSAgYnJpZGdlLT5ocHAuY2FjaGVfbGluZV9zaXplKTsKLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19ieXRlKHBidXMsIGRldmZuLCBQQ0lfTEFURU5DWV9USU1FUiwKLQkJCQkgIGJyaWRnZS0+aHBwLmxhdGVuY3lfdGltZXIpOwotCi0JcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBidXMsIGRldmZuLCBQQ0lfQ09NTUFORCwgJnRtcCk7Ci0JaWYgKGJyaWRnZS0+aHBwLmVuYWJsZV9TRVJSKQotCQl0bXAgfD0gUENJX0NPTU1BTkRfU0VSUjsKLQlpZiAoYnJpZGdlLT5ocHAuZW5hYmxlX1BFUlIpCi0JCXRtcCB8PSBQQ0lfQ09NTUFORF9QQVJJVFk7Ci0JcGNpX2J1c193cml0ZV9jb25maWdfd29yZChwYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsIHRtcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGV0ZWN0X3VzZWRfcmVzb3VyY2UgLSBzdWJ0cmFjdCByZXNvdXJjZSB1bmRlciBkZXYgZnJvbSBicmlkZ2UgKi8KLXN0YXRpYyBpbnQgZGV0ZWN0X3VzZWRfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBjb3VudDsKLQotCWRiZygiRGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgY291bnQrKykgewotCQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0JCXN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkOwotCQl1bnNpZ25lZCBsb25nIGJhc2UgPSBkZXYtPnJlc291cmNlW2NvdW50XS5zdGFydDsKLQkJdW5zaWduZWQgbG9uZyBsZW4gPSBkZXYtPnJlc291cmNlW2NvdW50XS5lbmQgLSBiYXNlICsgMTsKLQkJdW5zaWduZWQgbG9uZyBmbGFncyA9IGRldi0+cmVzb3VyY2VbY291bnRdLmZsYWdzOwotCi0JCWlmICghZmxhZ3MpCi0JCQljb250aW51ZTsKLQotCQlkYmcoIkJBUlslZF0gMHglbHggLSAweCVseCAoMHglbHgpXG4iLCBjb3VudCwgYmFzZSwKLQkJCQliYXNlICsgbGVuIC0gMSwgZmxhZ3MpOwotCi0JCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJCWhlYWQgPSAmYnJpZGdlLT5pb19oZWFkOwotCQl9IGVsc2UgaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgewotCQkJaGVhZCA9ICZicmlkZ2UtPnBfbWVtX2hlYWQ7Ci0JCX0gZWxzZSB7Ci0JCQloZWFkID0gJmJyaWRnZS0+bWVtX2hlYWQ7Ci0JCX0KLQotCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQlyZXMgPSBhY3BpcGhwX2dldF9yZXNvdXJjZV93aXRoX2Jhc2UoaGVhZCwgYmFzZSwgbGVuKTsKLQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQlpZiAocmVzKQotCQkJa2ZyZWUocmVzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIGFjcGlwaHBfZGV0ZWN0X3BjaV9yZXNvdXJjZSAtIGRldGVjdCByZXNvdXJjZXMgdW5kZXIgYnJpZGdlCi0gKiBAYnJpZGdlOiBkZXRlY3QgYWxsIHJlc291cmNlcyBhbHJlYWR5IHVzZWQgdW5kZXIgdGhpcyBicmlkZ2UKLSAqCi0gKiBjb2xsZWN0IGFsbCByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIGFsbCBkZXZpY2VzIHVuZGVyIGEgYnJpZGdlLgotICovCi1pbnQgYWNwaXBocF9kZXRlY3RfcGNpX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlsaXN0X2Zvcl9lYWNoIChsLCAmYnJpZGdlLT5wY2lfYnVzLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHBjaV9kZXZfYihsKTsKLQkJZGV0ZWN0X3VzZWRfcmVzb3VyY2UoYnJpZGdlLCBkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qKgotICogYWNwaXBocF9pbml0X3Nsb3RfcmVzb3VyY2UgLSBnYXRoZXIgcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24gb2YgYSBzbG90Ci0gKiBAc2xvdDogQUNQSSBzbG90IG9iamVjdCB0byBiZSBjaGVja2VkLCBzaG91bGQgaGF2ZSB2YWxpZCBwY2lfZGV2IG1lbWJlcgotICoKLSAqIFRCRDogUENJLXRvLVBDSSBicmlkZ2UgY2FzZQotICogICAgICB1c2UgcGNpX2Rldi0+cmVzb3VyY2VbXQotICovCi1pbnQgYWNwaXBocF9pbml0X2Z1bmNfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0JdTY0IGJhc2U7Ci0JdTMyIGJhciwgbGVuOwotCXUzMiBhZGRyZXNzW10gPSB7Ci0JCVBDSV9CQVNFX0FERFJFU1NfMCwKLQkJUENJX0JBU0VfQUREUkVTU18xLAotCQlQQ0lfQkFTRV9BRERSRVNTXzIsCi0JCVBDSV9CQVNFX0FERFJFU1NfMywKLQkJUENJX0JBU0VfQUREUkVTU180LAotCQlQQ0lfQkFTRV9BRERSRVNTXzUsCi0JCTAKLQl9OwotCWludCBjb3VudDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQotCWRldiA9IGZ1bmMtPnBjaV9kZXY7Ci0JZGJnKCJIb3QtcGx1Z2dhYmxlIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0KLQlmb3IgKGNvdW50ID0gMDsgYWRkcmVzc1tjb3VudF07IGNvdW50KyspIHsJLyogZm9yIDYgQkFScyAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBhZGRyZXNzW2NvdW50XSwgJmJhcik7Ci0KLQkJaWYgKCFiYXIpCS8qIFRoaXMgQkFSIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotCQkJY29udGludWU7Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGFkZHJlc3NbY291bnRdLCAweEZGRkZGRkZGKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgYWRkcmVzc1tjb3VudF0sICZsZW4pOwotCi0JCWlmIChsZW4gJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7Ci0JCQkvKiBUaGlzIGlzIElPICovCi0JCQliYXNlID0gYmFyICYgMHhGRkZGRkZGQzsKLQkJCWxlbiA9IGxlbiAmIChQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgJiAweEZGRkYpOwotCQkJbGVuID0gbGVuICYgfihsZW4gLSAxKTsKLQotCQkJZGJnKCJCQVJbJWRdICUwOHggLSAlMDh4IChJTylcbiIsIGNvdW50LCAodTMyKWJhc2UsICh1MzIpYmFzZSArIGxlbiAtIDEpOwotCi0JCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYmFzZSwgbGVuKTsKLQkJCWlmICghcmVzKQotCQkJCWdvdG8gbm9fbWVtb3J5OwotCi0JCQlyZXMtPm5leHQgPSBmdW5jLT5pb19oZWFkOwotCQkJZnVuYy0+aW9faGVhZCA9IHJlczsKLQotCQl9IGVsc2UgewotCQkJLyogVGhpcyBpcyBNZW1vcnkgKi8KLQkJCWJhc2UgPSBiYXIgJiAweEZGRkZGRkYwOwotCQkJaWYgKGxlbiAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIKSB7Ci0JCQkJLyogcGZtZW0gKi8KLQotCQkJCWxlbiAmPSAweEZGRkZGRkYwOwotCQkJCWxlbiA9IH5sZW4gKyAxOwotCi0JCQkJaWYgKGxlbiAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsJLyogdGFrZXMgdXAgYW5vdGhlciBkd29yZCAqLwotCQkJCQlkYmcoInByZWZldGNoIG1lbSA2NFxuIik7Ci0JCQkJCWNvdW50ICs9IDE7Ci0JCQkJfQotCQkJCWRiZygiQkFSWyVkXSAlMDh4IC0gJTA4eCAoUE1FTSlcbiIsIGNvdW50LCAodTMyKWJhc2UsICh1MzIpYmFzZSArIGxlbiAtIDEpOwotCQkJCXJlcyA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShiYXNlLCBsZW4pOwotCQkJCWlmICghcmVzKQotCQkJCQlnb3RvIG5vX21lbW9yeTsKLQotCQkJCXJlcy0+bmV4dCA9IGZ1bmMtPnBfbWVtX2hlYWQ7Ci0JCQkJZnVuYy0+cF9tZW1faGVhZCA9IHJlczsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKiByZWd1bGFyIG1lbW9yeSAqLwotCi0JCQkJbGVuICY9IDB4RkZGRkZGRjA7Ci0JCQkJbGVuID0gfmxlbiArIDE7Ci0KLQkJCQlpZiAobGVuICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkgewotCQkJCQkvKiB0YWtlcyB1cCBhbm90aGVyIGR3b3JkICovCi0JCQkJCWRiZygibWVtIDY0XG4iKTsKLQkJCQkJY291bnQgKz0gMTsKLQkJCQl9Ci0JCQkJZGJnKCJCQVJbJWRdICUwOHggLSAlMDh4IChNRU0pXG4iLCBjb3VudCwgKHUzMiliYXNlLCAodTMyKWJhc2UgKyBsZW4gLSAxKTsKLQkJCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYmFzZSwgbGVuKTsKLQkJCQlpZiAoIXJlcykKLQkJCQkJZ290byBub19tZW1vcnk7Ci0KLQkJCQlyZXMtPm5leHQgPSBmdW5jLT5tZW1faGVhZDsKLQkJCQlmdW5jLT5tZW1faGVhZCA9IHJlczsKLQotCQkJfQotCQl9Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGFkZHJlc3NbY291bnRdLCBiYXIpOwotCX0KLSNpZiAxCi0JYWNwaXBocF9kdW1wX2Z1bmNfcmVzb3VyY2UoZnVuYyk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotCi0gbm9fbWVtb3J5OgotCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5pb19oZWFkKTsKLQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPm1lbV9oZWFkKTsKLQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPnBfbWVtX2hlYWQpOwotCi0JcmV0dXJuIC0xOwotfQotCi0KLS8qKgotICogYWNwaXBocF9jb25maWd1cmVfc2xvdCAtIGFsbG9jYXRlIFBDSSByZXNvdXJjZXMKLSAqIEBzbG90OiBzbG90IHRvIGJlIGNvbmZpZ3VyZWQKLSAqCi0gKiBpbml0aWFsaXplcyBhIFBDSSBmdW5jdGlvbnMgb24gYSBkZXZpY2UgaW5zZXJ0ZWQKLSAqIGludG8gdGhlIHNsb3QKLSAqCi0gKi8KLWludCBhY3BpcGhwX2NvbmZpZ3VyZV9zbG90IChzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KQotewotCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKLQl1OCBoZHI7Ci0JdTMyIGR2aWQ7Ci0JaW50IHJldHZhbCA9IDA7Ci0JaW50IGlzX211bHRpID0gMDsKLQotCXBjaV9idXNfcmVhZF9jb25maWdfYnl0ZShzbG90LT5icmlkZ2UtPnBjaV9idXMsCi0JCQkJIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApLAotCQkJCSBQQ0lfSEVBREVSX1RZUEUsICZoZHIpOwotCi0JaWYgKGhkciAmIDB4ODApCi0JCWlzX211bHRpID0gMTsKLQotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQkJaWYgKGlzX211bHRpIHx8IGZ1bmMtPmZ1bmN0aW9uID09IDApIHsKLQkJCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQoc2xvdC0+YnJpZGdlLT5wY2lfYnVzLAotCQkJCQkJICBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLAotCQkJCQkJCSAgICBmdW5jLT5mdW5jdGlvbiksCi0JCQkJCQkgIFBDSV9WRU5ET1JfSUQsICZkdmlkKTsKLQkJCWlmIChkdmlkICE9IDB4ZmZmZmZmZmYpIHsKLQkJCQlyZXR2YWwgPSBpbml0X2NvbmZpZ19zcGFjZShmdW5jKTsKLQkJCQlpZiAocmV0dmFsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogYWNwaXBocF9jb25maWd1cmVfZnVuY3Rpb24gLSBjb25maWd1cmUgUENJIGZ1bmN0aW9uCi0gKiBAZnVuYzogZnVuY3Rpb24gdG8gYmUgY29uZmlndXJlZAotICoKLSAqIGluaXRpYWxpemVzIGEgUENJIGZ1bmN0aW9ucyBvbiBhIGRldmljZSBpbnNlcnRlZAotICogaW50byB0aGUgc2xvdAotICoKLSAqLwotaW50IGFjcGlwaHBfY29uZmlndXJlX2Z1bmN0aW9uIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKQotewotCS8qIGFsbCBoYW5kbGVkIGJ5IHRoZSBwY2kgY29yZSBub3cgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBhY3BpcGhwX3VuY29uZmlndXJlX2Z1bmN0aW9uIC0gdW5jb25maWd1cmUgUENJIGZ1bmN0aW9uCi0gKiBAZnVuYzogZnVuY3Rpb24gdG8gYmUgdW5jb25maWd1cmVkCi0gKgotICovCi12b2lkIGFjcGlwaHBfdW5jb25maWd1cmVfZnVuY3Rpb24gKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0Jc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7Ci0KLQkvKiBpZiBwY2lfZGV2IGlzIE5VTEwsIGlnbm9yZSBpdCAqLwotCWlmICghZnVuYy0+cGNpX2RldikKLQkJcmV0dXJuOwotCi0JcGNpX3JlbW92ZV9idXNfZGV2aWNlKGZ1bmMtPnBjaV9kZXYpOwotCi0JLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCi0JYnJpZGdlID0gZnVuYy0+c2xvdC0+YnJpZGdlOwotCi0Jc3Bpbl9sb2NrKCZicmlkZ2UtPnJlc19sb2NrKTsKLQlhY3BpcGhwX21vdmVfcmVzb3VyY2UoJmZ1bmMtPmlvX2hlYWQsICZicmlkZ2UtPmlvX2hlYWQpOwotCWFjcGlwaHBfbW92ZV9yZXNvdXJjZSgmZnVuYy0+bWVtX2hlYWQsICZicmlkZ2UtPm1lbV9oZWFkKTsKLQlhY3BpcGhwX21vdmVfcmVzb3VyY2UoJmZ1bmMtPnBfbWVtX2hlYWQsICZicmlkZ2UtPnBfbWVtX2hlYWQpOwotCWFjcGlwaHBfbW92ZV9yZXNvdXJjZSgmZnVuYy0+YnVzX2hlYWQsICZicmlkZ2UtPmJ1c19oZWFkKTsKLQlzcGluX3VubG9jaygmYnJpZGdlLT5yZXNfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfcmVzLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfcmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGIxZmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qCi0gKiBBQ1BJIFBDSSBIb3RQbHVnIFV0aWxpdHkgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSBJQk0gQ29ycC4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIFRha2F5b3NoaSBLb2NoaSAodC1rb2NoaUBicS5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIE5FQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Z3JlZ2toQHVzLmlibS5jb20+LCA8dC1rb2NoaUBicS5qcC5uZWMuY29tPgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCi0jaW5jbHVkZSAiYWNwaXBocC5oIgotCi0jZGVmaW5lIE1ZX05BTUUgImFjcGlwaHBfcmVzIgotCi0KLS8qCi0gKiBzb3J0X2J5X3NpemUgLSBzb3J0IG5vZGVzIGJ5IHRoZWlyIGxlbmd0aCwgc21hbGxlc3QgZmlyc3QKLSAqLwotc3RhdGljIGludCBzb3J0X2J5X3NpemUoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqY3VycmVudF9yZXM7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbmV4dF9yZXM7Ci0JaW50IG91dF9vZl9vcmRlciA9IDE7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiAxOwotCi0JaWYgKCEoKCpoZWFkKS0+bmV4dCkpCi0JCXJldHVybiAwOwotCi0Jd2hpbGUgKG91dF9vZl9vcmRlcikgewotCQlvdXRfb2Zfb3JkZXIgPSAwOwotCi0JCS8qIFNwZWNpYWwgY2FzZSBmb3Igc3dhcHBpbmcgbGlzdCBoZWFkICovCi0JCWlmICgoKCpoZWFkKS0+bmV4dCkgJiYKLQkJICAgICgoKmhlYWQpLT5sZW5ndGggPiAoKmhlYWQpLT5uZXh0LT5sZW5ndGgpKSB7Ci0JCQlvdXRfb2Zfb3JkZXIrKzsKLQkJCWN1cnJlbnRfcmVzID0gKmhlYWQ7Ci0JCQkqaGVhZCA9ICgqaGVhZCktPm5leHQ7Ci0JCQljdXJyZW50X3Jlcy0+bmV4dCA9ICgqaGVhZCktPm5leHQ7Ci0JCQkoKmhlYWQpLT5uZXh0ID0gY3VycmVudF9yZXM7Ci0JCX0KLQotCQljdXJyZW50X3JlcyA9ICpoZWFkOwotCi0JCXdoaWxlIChjdXJyZW50X3Jlcy0+bmV4dCAmJiBjdXJyZW50X3Jlcy0+bmV4dC0+bmV4dCkgewotCQkJaWYgKGN1cnJlbnRfcmVzLT5uZXh0LT5sZW5ndGggPiBjdXJyZW50X3Jlcy0+bmV4dC0+bmV4dC0+bGVuZ3RoKSB7Ci0JCQkJb3V0X29mX29yZGVyKys7Ci0JCQkJbmV4dF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQljdXJyZW50X3Jlcy0+bmV4dCA9IGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzID0gY3VycmVudF9yZXMtPm5leHQ7Ci0JCQkJbmV4dF9yZXMtPm5leHQgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQljdXJyZW50X3Jlcy0+bmV4dCA9IG5leHRfcmVzOwotCQkJfSBlbHNlCi0JCQkJY3VycmVudF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJfQotCX0gIC8qIEVuZCBvZiBvdXRfb2Zfb3JkZXIgbG9vcCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZiAwCi0vKgotICogc29ydF9ieV9tYXhfc2l6ZSAtIHNvcnQgbm9kZXMgYnkgdGhlaXIgbGVuZ3RoLCBsYXJnZXN0IGZpcnN0Ci0gKi8KLXN0YXRpYyBpbnQgc29ydF9ieV9tYXhfc2l6ZShzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpjdXJyZW50X3JlczsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpuZXh0X3JlczsKLQlpbnQgb3V0X29mX29yZGVyID0gMTsKLQotCWlmICghKCpoZWFkKSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoISgoKmhlYWQpLT5uZXh0KSkKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAob3V0X29mX29yZGVyKSB7Ci0JCW91dF9vZl9vcmRlciA9IDA7Ci0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciBzd2FwcGluZyBsaXN0IGhlYWQgKi8KLQkJaWYgKCgoKmhlYWQpLT5uZXh0KSAmJgotCQkgICAgKCgqaGVhZCktPmxlbmd0aCA8ICgqaGVhZCktPm5leHQtPmxlbmd0aCkpIHsKLQkJCW91dF9vZl9vcmRlcisrOwotCQkJY3VycmVudF9yZXMgPSAqaGVhZDsKLQkJCSpoZWFkID0gKCpoZWFkKS0+bmV4dDsKLQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gKCpoZWFkKS0+bmV4dDsKLQkJCSgqaGVhZCktPm5leHQgPSBjdXJyZW50X3JlczsKLQkJfQotCi0JCWN1cnJlbnRfcmVzID0gKmhlYWQ7Ci0KLQkJd2hpbGUgKGN1cnJlbnRfcmVzLT5uZXh0ICYmIGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0KSB7Ci0JCQlpZiAoY3VycmVudF9yZXMtPm5leHQtPmxlbmd0aCA8IGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0LT5sZW5ndGgpIHsKLQkJCQlvdXRfb2Zfb3JkZXIrKzsKLQkJCQluZXh0X3JlcyA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gY3VycmVudF9yZXMtPm5leHQtPm5leHQ7Ci0JCQkJY3VycmVudF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQluZXh0X3Jlcy0+bmV4dCA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gbmV4dF9yZXM7Ci0JCQl9IGVsc2UKLQkJCQljdXJyZW50X3JlcyA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQl9Ci0JfSAgLyogRW5kIG9mIG91dF9vZl9vcmRlciBsb29wICovCi0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKioKLSAqIGdldF9pb19yZXNvdXJjZSAtIGdldCByZXNvdXJjZSBmb3IgSS9PIHBvcnRzCi0gKgotICogdGhpcyBmdW5jdGlvbiBzb3J0cyB0aGUgcmVzb3VyY2UgbGlzdCBieSBzaXplIGFuZCB0aGVuCi0gKiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9mICJzaXplIiBsZW5ndGggdGhhdCBpcyBub3QgaW4gdGhlCi0gKiBJU0EgYWxpYXNpbmcgd2luZG93LiAgSWYgaXQgZmluZHMgYSBub2RlIGxhcmdlciB0aGFuICJzaXplIgotICogaXQgd2lsbCBzcGxpdCBpdCB1cC4KLSAqCi0gKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICogZGlmZmVyZW5jZSBmcm9tIGdldF9yZXNvdXJjZSBpcyBoYW5kbGluZyBvZiBJU0EgYWxpYXNpbmcgc3BhY2UuCi0gKgotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9pb19yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQsIHUzMiBzaXplKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnByZXZub2RlOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKm5vZGU7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqc3BsaXRfbm9kZTsKLQl1NjQgdGVtcF9xd29yZDsKLQotCWlmICghKCpoZWFkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKGhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChzb3J0X2J5X3NpemUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChub2RlID0gKmhlYWQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0JCWlmIChub2RlLT5sZW5ndGggPCBzaXplKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG5vZGUtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQkvKiB0aGlzIG9uZSBpc24ndCBiYXNlIGFsaWduZWQgcHJvcGVybHkKLQkJCSAgIHNvIHdlJ2xsIG1ha2UgYSBuZXcgZW50cnkgYW5kIHNwbGl0IGl0IHVwICovCi0JCQl0ZW1wX3F3b3JkID0gKG5vZGUtPmJhc2UgfCAoc2l6ZS0xKSkgKyAxOwotCi0JCQkvKiBTaG9ydCBjaXJjdWl0IGlmIGFkanVzdGVkIHNpemUgaXMgdG9vIHNtYWxsICovCi0JCQlpZiAoKG5vZGUtPmxlbmd0aCAtICh0ZW1wX3F3b3JkIC0gbm9kZS0+YmFzZSkpIDwgc2l6ZSkKLQkJCQljb250aW51ZTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShub2RlLT5iYXNlLCB0ZW1wX3F3b3JkIC0gbm9kZS0+YmFzZSk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbm9kZS0+YmFzZSA9IHRlbXBfcXdvcmQ7Ci0JCQlub2RlLT5sZW5ndGggLT0gc3BsaXRfbm9kZS0+bGVuZ3RoOwotCi0JCQkvKiBQdXQgaXQgaW4gdGhlIGxpc3QgKi8KLQkJCXNwbGl0X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OwotCQkJbm9kZS0+bmV4dCA9IHNwbGl0X25vZGU7Ci0JCX0gLyogRW5kIG9mIG5vbi1hbGlnbmVkIGJhc2UgKi8KLQotCQkvKiBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRvbyBzbWFsbCBzaW5jZSB3ZSBhbHJlYWR5IGRpZCAqLwotCQlpZiAobm9kZS0+bGVuZ3RoID4gc2l6ZSkgewotCQkJLyogdGhpcyBvbmUgaXMgbG9uZ2VyIHRoYW4gd2UgbmVlZAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXNwbGl0X25vZGUgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2Uobm9kZS0+YmFzZSArIHNpemUsIG5vZGUtPmxlbmd0aCAtIHNpemUpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW5vZGUtPmxlbmd0aCA9IHNpemU7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAgLyogRW5kIG9mIHRvbyBiaWcgb24gdG9wIGVuZCAqLwotCi0JCS8qIEZvciBJTyBtYWtlIHN1cmUgaXQncyBub3QgaW4gdGhlIElTQSBhbGlhc2luZyBzcGFjZSAqLwotCQlpZiAoKG5vZGUtPmJhc2UgJiAweDMwMEwpICYmICEobm9kZS0+YmFzZSAmIDB4ZmZmZmYwMDApKQotCQkJY29udGludWU7Ci0KLQkJLyogSWYgd2UgZ290IGhlcmUsIHRoZW4gaXQgaXMgdGhlIHJpZ2h0IHNpemUKLQkJICAgTm93IHRha2UgaXQgb3V0IG9mIHRoZSBsaXN0ICovCi0JCWlmICgqaGVhZCA9PSBub2RlKSB7Ci0JCQkqaGVhZCA9IG5vZGUtPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2bm9kZSA9ICpoZWFkOwotCQkJd2hpbGUgKHByZXZub2RlLT5uZXh0ICE9IG5vZGUpCi0JCQkJcHJldm5vZGUgPSBwcmV2bm9kZS0+bmV4dDsKLQotCQkJcHJldm5vZGUtPm5leHQgPSBub2RlLT5uZXh0OwotCQl9Ci0JCW5vZGUtPm5leHQgPSBOVUxMOwotCQkvKiBTdG9wIGxvb3BpbmcgKi8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG5vZGU7Ci19Ci0KLQotI2lmIDAKLS8qKgotICogZ2V0X21heF9yZXNvdXJjZSAtIGdldCB0aGUgbGFyZ2VzdCByZXNvdXJjZQotICoKLSAqIEdldHMgdGhlIGxhcmdlc3Qgbm9kZSB0aGF0IGlzIGF0IGxlYXN0ICJzaXplIiBiaWcgZnJvbSB0aGUKLSAqIGxpc3QgcG9pbnRlZCB0byBieSBoZWFkLiAgSXQgYWxpZ25zIHRoZSBub2RlIG9uIHRvcCBhbmQgYm90dG9tCi0gKiB0byAic2l6ZSIgYWxpZ25tZW50IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9tYXhfcmVzb3VyY2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1MzIgc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICptYXg7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqdGVtcDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpzcGxpdF9ub2RlOwotCXU2NCB0ZW1wX3F3b3JkOwotCi0JaWYgKCEoKmhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKHNvcnRfYnlfbWF4X3NpemUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChtYXggPSAqaGVhZDttYXg7IG1heCA9IG1heC0+bmV4dCkgewotCi0JCS8qIElmIG5vdCBiaWcgZW5vdWdoIHdlIGNvdWxkIHByb2JhYmx5IGp1c3QgYmFpbCwKLQkJICAgaW5zdGVhZCB3ZSdsbCBjb250aW51ZSB0byB0aGUgbmV4dC4gKi8KLQkJaWYgKG1heC0+bGVuZ3RoIDwgc2l6ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChtYXgtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQkvKiB0aGlzIG9uZSBpc24ndCBiYXNlIGFsaWduZWQgcHJvcGVybHkKLQkJCSAgIHNvIHdlJ2xsIG1ha2UgYSBuZXcgZW50cnkgYW5kIHNwbGl0IGl0IHVwICovCi0JCQl0ZW1wX3F3b3JkID0gKG1heC0+YmFzZSB8IChzaXplLTEpKSArIDE7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobWF4LT5sZW5ndGggLSAodGVtcF9xd29yZCAtIG1heC0+YmFzZSkpIDwgc2l6ZSkKLQkJCQljb250aW51ZTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShtYXgtPmJhc2UsIHRlbXBfcXdvcmQgLSBtYXgtPmJhc2UpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW1heC0+YmFzZSA9IHRlbXBfcXdvcmQ7Ci0JCQltYXgtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBuZXh0IGluIHRoZSBsaXN0ICovCi0JCQlzcGxpdF9ub2RlLT5uZXh0ID0gbWF4LT5uZXh0OwotCQkJbWF4LT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfQotCi0JCWlmICgobWF4LT5iYXNlICsgbWF4LT5sZW5ndGgpICYgKHNpemUgLSAxKSkgewotCQkJLyogdGhpcyBvbmUgaXNuJ3QgZW5kIGFsaWduZWQgcHJvcGVybHkgYXQgdGhlIHRvcAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXRlbXBfcXdvcmQgPSAoKG1heC0+YmFzZSArIG1heC0+bGVuZ3RoKSAmIH4oc2l6ZSAtIDEpKTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSh0ZW1wX3F3b3JkLAotCQkJCQkJCSAgIG1heC0+bGVuZ3RoICsgbWF4LT5iYXNlIC0gdGVtcF9xd29yZCk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbWF4LT5sZW5ndGggLT0gc3BsaXRfbm9kZS0+bGVuZ3RoOwotCi0JCQkvKiBQdXQgaXQgaW4gdGhlIGxpc3QgKi8KLQkJCXNwbGl0X25vZGUtPm5leHQgPSBtYXgtPm5leHQ7Ci0JCQltYXgtPm5leHQgPSBzcGxpdF9ub2RlOwotCQl9Ci0KLQkJLyogTWFrZSBzdXJlIGl0IGRpZG4ndCBzaHJpbmsgdG9vIG11Y2ggd2hlbiB3ZSBhbGlnbmVkIGl0ICovCi0JCWlmIChtYXgtPmxlbmd0aCA8IHNpemUpCi0JCQljb250aW51ZTsKLQotCQkvKiBOb3cgdGFrZSBpdCBvdXQgb2YgdGhlIGxpc3QgKi8KLQkJdGVtcCA9IChzdHJ1Y3QgcGNpX3Jlc291cmNlKikgKmhlYWQ7Ci0JCWlmICh0ZW1wID09IG1heCkgewotCQkJKmhlYWQgPSBtYXgtPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAodGVtcCAmJiB0ZW1wLT5uZXh0ICE9IG1heCkgewotCQkJCXRlbXAgPSB0ZW1wLT5uZXh0OwotCQkJfQotCi0JCQl0ZW1wLT5uZXh0ID0gbWF4LT5uZXh0OwotCQl9Ci0KLQkJbWF4LT5uZXh0ID0gTlVMTDsKLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQkvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgY291bGRuJ3QgZmluZCBvbmUgKi8KLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0vKioKLSAqIGdldF9yZXNvdXJjZSAtIGdldCByZXNvdXJjZSAobWVtLCBwZm1lbSkKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIHNvcnRzIHRoZSByZXNvdXJjZSBsaXN0IGJ5IHNpemUgYW5kIHRoZW4KLSAqIHJldHVybnMgdGhlIGZpcnN0IG5vZGUgb2YgInNpemUiIGxlbmd0aC4gIElmIGl0IGZpbmRzIGEgbm9kZQotICogbGFyZ2VyIHRoYW4gInNpemUiIGl0IHdpbGwgc3BsaXQgaXQgdXAuCi0gKgotICogc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgotICoKLSAqLwotc3RydWN0IHBjaV9yZXNvdXJjZSAqYWNwaXBocF9nZXRfcmVzb3VyY2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1MzIgc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpwcmV2bm9kZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpub2RlOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnNwbGl0X25vZGU7Ci0JdTY0IHRlbXBfcXdvcmQ7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZShoZWFkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoc29ydF9ieV9zaXplKGhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAobm9kZSA9ICpoZWFkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgewotCQlkYmcoIiVzOiByZXFfc2l6ZSA9JXggbm9kZT0lcCwgYmFzZT0leCwgbGVuZ3RoPSV4XG4iLAotCQkgICAgX19GVU5DVElPTl9fLCBzaXplLCBub2RlLCAodTMyKW5vZGUtPmJhc2UsIG5vZGUtPmxlbmd0aCk7Ci0JCWlmIChub2RlLT5sZW5ndGggPCBzaXplKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG5vZGUtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQlkYmcoIiVzOiBub3QgYWxpZ25lZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCS8qIHRoaXMgb25lIGlzbid0IGJhc2UgYWxpZ25lZCBwcm9wZXJseQotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXRlbXBfcXdvcmQgPSAobm9kZS0+YmFzZSB8IChzaXplLTEpKSArIDE7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobm9kZS0+bGVuZ3RoIC0gKHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKSkgPCBzaXplKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzcGxpdF9ub2RlID0gYWNwaXBocF9tYWtlX3Jlc291cmNlKG5vZGUtPmJhc2UsIHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKTsKLQotCQkJaWYgKCFzcGxpdF9ub2RlKQotCQkJCXJldHVybiBOVUxMOwotCi0JCQlub2RlLT5iYXNlID0gdGVtcF9xd29yZDsKLQkJCW5vZGUtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAvKiBFbmQgb2Ygbm9uLWFsaWduZWQgYmFzZSAqLwotCi0JCS8qIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdG9vIHNtYWxsIHNpbmNlIHdlIGFscmVhZHkgZGlkICovCi0JCWlmIChub2RlLT5sZW5ndGggPiBzaXplKSB7Ci0JCQlkYmcoIiVzOiB0b28gYmlnXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogdGhpcyBvbmUgaXMgbG9uZ2VyIHRoYW4gd2UgbmVlZAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXNwbGl0X25vZGUgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2Uobm9kZS0+YmFzZSArIHNpemUsIG5vZGUtPmxlbmd0aCAtIHNpemUpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW5vZGUtPmxlbmd0aCA9IHNpemU7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAgLyogRW5kIG9mIHRvbyBiaWcgb24gdG9wIGVuZCAqLwotCi0JCWRiZygiJXM6IGdvdCBvbmUhISFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCS8qIElmIHdlIGdvdCBoZXJlLCB0aGVuIGl0IGlzIHRoZSByaWdodCBzaXplCi0JCSAgIE5vdyB0YWtlIGl0IG91dCBvZiB0aGUgbGlzdCAqLwotCQlpZiAoKmhlYWQgPT0gbm9kZSkgewotCQkJKmhlYWQgPSBub2RlLT5uZXh0OwotCQl9IGVsc2UgewotCQkJcHJldm5vZGUgPSAqaGVhZDsKLQkJCXdoaWxlIChwcmV2bm9kZS0+bmV4dCAhPSBub2RlKQotCQkJCXByZXZub2RlID0gcHJldm5vZGUtPm5leHQ7Ci0KLQkJCXByZXZub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKLQkJfQotCQlub2RlLT5uZXh0ID0gTlVMTDsKLQkJLyogU3RvcCBsb29waW5nICovCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbm9kZTsKLX0KLQotLyoqCi0gKiBnZXRfcmVzb3VyY2Vfd2l0aF9iYXNlIC0gZ2V0IHJlc291cmNlIHdpdGggc3BlY2lmaWMgYmFzZSBhZGRyZXNzCi0gKgotICogdGhpcyBmdW5jdGlvbgotICogcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBvZiAic2l6ZSIgbGVuZ3RoIGxvY2F0ZWQgYXQgc3BlY2lmaWVkIGJhc2UgYWRkcmVzcy4KLSAqIElmIGl0IGZpbmRzIGEgbm9kZSBsYXJnZXIgdGhhbiAic2l6ZSIgaXQgd2lsbCBzcGxpdCBpdCB1cC4KLSAqCi0gKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9yZXNvdXJjZV93aXRoX2Jhc2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1NjQgYmFzZSwgdTMyIHNpemUpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcHJldm5vZGU7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpzcGxpdF9ub2RlOwotCXU2NCB0ZW1wX3F3b3JkOwotCi0JaWYgKCEoKmhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChub2RlID0gKmhlYWQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0JCWRiZygiOiAxc3QgcmVxX2Jhc2U9JXggcmVxX3NpemUgPSV4IG5vZGU9JXAsIGJhc2U9JXgsIGxlbmd0aD0leFxuIiwKLQkJICAgICh1MzIpYmFzZSwgc2l6ZSwgbm9kZSwgKHUzMilub2RlLT5iYXNlLCBub2RlLT5sZW5ndGgpOwotCQlpZiAobm9kZS0+YmFzZSA+IGJhc2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKG5vZGUtPmJhc2UgKyBub2RlLT5sZW5ndGgpIDwgKGJhc2UgKyBzaXplKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChub2RlLT5iYXNlIDwgYmFzZSkgewotCQkJZGJnKCI6IHNwbGl0IDFcbiIpOwotCQkJLyogdGhpcyBvbmUgaXNuJ3QgYmFzZSBhbGlnbmVkIHByb3Blcmx5Ci0JCQkgICBzbyB3ZSdsbCBtYWtlIGEgbmV3IGVudHJ5IGFuZCBzcGxpdCBpdCB1cCAqLwotCQkJdGVtcF9xd29yZCA9IGJhc2U7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobm9kZS0+bGVuZ3RoIC0gKHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKSkgPCBzaXplKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzcGxpdF9ub2RlID0gYWNwaXBocF9tYWtlX3Jlc291cmNlKG5vZGUtPmJhc2UsIHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKTsKLQotCQkJaWYgKCFzcGxpdF9ub2RlKQotCQkJCXJldHVybiBOVUxMOwotCi0JCQlub2RlLT5iYXNlID0gdGVtcF9xd29yZDsKLQkJCW5vZGUtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfQotCi0JCWRiZygiOiAybmQgcmVxX2Jhc2U9JXggcmVxX3NpemUgPSV4IG5vZGU9JXAsIGJhc2U9JXgsIGxlbmd0aD0leFxuIiwKLQkJICAgICh1MzIpYmFzZSwgc2l6ZSwgbm9kZSwgKHUzMilub2RlLT5iYXNlLCBub2RlLT5sZW5ndGgpOwotCi0JCS8qIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdG9vIHNtYWxsIHNpbmNlIHdlIGFscmVhZHkgZGlkICovCi0JCWlmIChub2RlLT5sZW5ndGggPiBzaXplKSB7Ci0JCQlkYmcoIjogc3BsaXQgMlxuIik7Ci0JCQkvKiB0aGlzIG9uZSBpcyBsb25nZXIgdGhhbiB3ZSBuZWVkCi0JCQkgICBzbyB3ZSdsbCBtYWtlIGEgbmV3IGVudHJ5IGFuZCBzcGxpdCBpdCB1cCAqLwotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShub2RlLT5iYXNlICsgc2l6ZSwgbm9kZS0+bGVuZ3RoIC0gc2l6ZSk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbm9kZS0+bGVuZ3RoID0gc2l6ZTsKLQotCQkJLyogUHV0IGl0IGluIHRoZSBsaXN0ICovCi0JCQlzcGxpdF9ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKLQkJCW5vZGUtPm5leHQgPSBzcGxpdF9ub2RlOwotCQl9ICAvKiBFbmQgb2YgdG9vIGJpZyBvbiB0b3AgZW5kICovCi0KLQkJZGJnKCI6IGdvdCBvbmUhISFcbiIpOwotCQkvKiBJZiB3ZSBnb3QgaGVyZSwgdGhlbiBpdCBpcyB0aGUgcmlnaHQgc2l6ZQotCQkgICBOb3cgdGFrZSBpdCBvdXQgb2YgdGhlIGxpc3QgKi8KLQkJaWYgKCpoZWFkID09IG5vZGUpIHsKLQkJCSpoZWFkID0gbm9kZS0+bmV4dDsKLQkJfSBlbHNlIHsKLQkJCXByZXZub2RlID0gKmhlYWQ7Ci0JCQl3aGlsZSAocHJldm5vZGUtPm5leHQgIT0gbm9kZSkKLQkJCQlwcmV2bm9kZSA9IHByZXZub2RlLT5uZXh0OwotCi0JCQlwcmV2bm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCX0KLQkJbm9kZS0+bmV4dCA9IE5VTEw7Ci0JCS8qIFN0b3AgbG9vcGluZyAqLwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG5vZGU7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUKLSAqCi0gKiBTb3J0cyBhbGwgb2YgdGhlIG5vZGVzIGluIHRoZSBsaXN0IGluIGFzY2VuZGluZyBvcmRlciBieQotICogdGhlaXIgYmFzZSBhZGRyZXNzZXMuICBBbHNvIGRvZXMgZ2FyYmFnZSBjb2xsZWN0aW9uIGJ5Ci0gKiBjb21iaW5pbmcgYWRqYWNlbnQgbm9kZXMuCi0gKgotICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MKLSAqLwotaW50IGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTE7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTI7Ci0JaW50IG91dF9vZl9vcmRlciA9IDE7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiAxOwotCi0JZGJnKCIqaGVhZC0+bmV4dCA9ICVwXG4iLCgqaGVhZCktPm5leHQpOwotCi0JaWYgKCEoKmhlYWQpLT5uZXh0KQotCQlyZXR1cm4gMDsJLyogb25seSBvbmUgaXRlbSBvbiB0aGUgbGlzdCwgYWxyZWFkeSBzb3J0ZWQhICovCi0KLQlkYmcoIipoZWFkLT5iYXNlID0gMHgleFxuIiwodTMyKSgqaGVhZCktPmJhc2UpOwotCWRiZygiKmhlYWQtPm5leHQtPmJhc2UgPSAweCV4XG4iLCAodTMyKSgqaGVhZCktPm5leHQtPmJhc2UpOwotCXdoaWxlIChvdXRfb2Zfb3JkZXIpIHsKLQkJb3V0X29mX29yZGVyID0gMDsKLQotCQkvKiBTcGVjaWFsIGNhc2UgZm9yIHN3YXBwaW5nIGxpc3QgaGVhZCAqLwotCQlpZiAoKCgqaGVhZCktPm5leHQpICYmCi0JCSAgICAoKCpoZWFkKS0+YmFzZSA+ICgqaGVhZCktPm5leHQtPmJhc2UpKSB7Ci0JCQlub2RlMSA9ICpoZWFkOwotCQkJKCpoZWFkKSA9ICgqaGVhZCktPm5leHQ7Ci0JCQlub2RlMS0+bmV4dCA9ICgqaGVhZCktPm5leHQ7Ci0JCQkoKmhlYWQpLT5uZXh0ID0gbm9kZTE7Ci0JCQlvdXRfb2Zfb3JkZXIrKzsKLQkJfQotCi0JCW5vZGUxID0gKCpoZWFkKTsKLQotCQl3aGlsZSAobm9kZTEtPm5leHQgJiYgbm9kZTEtPm5leHQtPm5leHQpIHsKLQkJCWlmIChub2RlMS0+bmV4dC0+YmFzZSA+IG5vZGUxLT5uZXh0LT5uZXh0LT5iYXNlKSB7Ci0JCQkJb3V0X29mX29yZGVyKys7Ci0JCQkJbm9kZTIgPSBub2RlMS0+bmV4dDsKLQkJCQlub2RlMS0+bmV4dCA9IG5vZGUxLT5uZXh0LT5uZXh0OwotCQkJCW5vZGUxID0gbm9kZTEtPm5leHQ7Ci0JCQkJbm9kZTItPm5leHQgPSBub2RlMS0+bmV4dDsKLQkJCQlub2RlMS0+bmV4dCA9IG5vZGUyOwotCQkJfSBlbHNlCi0JCQkJbm9kZTEgPSBub2RlMS0+bmV4dDsKLQkJfQotCX0gIC8qIEVuZCBvZiBvdXRfb2Zfb3JkZXIgbG9vcCAqLwotCi0Jbm9kZTEgPSAqaGVhZDsKLQotCXdoaWxlIChub2RlMSAmJiBub2RlMS0+bmV4dCkgewotCQlpZiAoKG5vZGUxLT5iYXNlICsgbm9kZTEtPmxlbmd0aCkgPT0gbm9kZTEtPm5leHQtPmJhc2UpIHsKLQkJCS8qIENvbWJpbmUgKi8KLQkJCWRiZygiOC4uXG4iKTsKLQkJCW5vZGUxLT5sZW5ndGggKz0gbm9kZTEtPm5leHQtPmxlbmd0aDsKLQkJCW5vZGUyID0gbm9kZTEtPm5leHQ7Ci0JCQlub2RlMS0+bmV4dCA9IG5vZGUxLT5uZXh0LT5uZXh0OwotCQkJa2ZyZWUobm9kZTIpOwotCQl9IGVsc2UKLQkJCW5vZGUxID0gbm9kZTEtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX21ha2VfcmVzb3VyY2UgLSBtYWtlIHJlc291cmNlIHN0cnVjdHVyZQotICogQGJhc2U6IGJhc2UgYWRkcmVzcyBvZiBhIHJlc291cmNlCi0gKiBAbGVuZ3RoOiBsZW5ndGggb2YgYSByZXNvdXJjZQotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX21ha2VfcmVzb3VyY2UgKHU2NCBiYXNlLCB1MzIgbGVuZ3RoKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlczsKLQotCXJlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVzKSB7Ci0JCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX3Jlc291cmNlKSk7Ci0JCXJlcy0+YmFzZSA9IGJhc2U7Ci0JCXJlcy0+bGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX21vdmVfcmVzb3VyY2UgLSBtb3ZlIGxpbmtlZCByZXNvdXJjZXMgZnJvbSBvbmUgdG8gYW5vdGhlcgotICogQGZyb206IGhlYWQgb2YgbGlua2VkIHJlc291cmNlIGxpc3QKLSAqIEB0bzogaGVhZCBvZiBsaW5rZWQgcmVzb3VyY2UgbGlzdAotICovCi12b2lkIGFjcGlwaHBfbW92ZV9yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmZyb20sIHN0cnVjdCBwY2lfcmVzb3VyY2UgKip0bykKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICp0bXA7Ci0KLQl3aGlsZSAoKmZyb20pIHsKLQkJdG1wID0gKCpmcm9tKS0+bmV4dDsKLQkJKCpmcm9tKS0+bmV4dCA9ICp0bzsKLQkJKnRvID0gKmZyb207Ci0JCSpmcm9tID0gdG1wOwotCX0KLQotCS8qICpmcm9tID0gTlVMTCBpcyBndWFyYW50ZWVkICovCi19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX2ZyZWVfcmVzb3VyY2UgLSBmcmVlIGFsbCBsaW5rZWQgcmVzb3VyY2VzCi0gKiBAcmVzOiBoZWFkIG9mIGxpbmtlZCByZXNvdXJjZSBsaXN0Ci0gKi8KLXZvaWQgYWNwaXBocF9mcmVlX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqcmVzKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnRtcDsKLQotCXdoaWxlICgqcmVzKSB7Ci0JCXRtcCA9ICgqcmVzKS0+bmV4dDsKLQkJa2ZyZWUoKnJlcyk7Ci0JCSpyZXMgPSB0bXA7Ci0JfQotCi0JLyogKnJlcyA9IE5VTEwgaXMgZ3VhcmFudGVlZCAqLwotfQotCi0KLS8qIGRlYnVnIHN1cHBvcnQgZnVuY3Rpb25zOyAgd2lsbCBnbyBhd2F5IHNvbWV0aW1lIDopICovCi1zdGF0aWMgdm9pZCBkdW1wX3Jlc291cmNlKHN0cnVjdCBwY2lfcmVzb3VyY2UgKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcDsKLQlpbnQgY250OwotCi0JcCA9IGhlYWQ7Ci0JY250ID0gMDsKLQotCXdoaWxlIChwKSB7Ci0JCWRiZygiWyUwMmRdICUwOHggLSAlMDh4XG4iLAotCQkgICAgY250KyssICh1MzIpcC0+YmFzZSwgKHUzMilwLT5iYXNlICsgcC0+bGVuZ3RoIC0gMSk7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLX0KLQotdm9pZCBhY3BpcGhwX2R1bXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCi17Ci0JZGJnKCJJL08gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGJyaWRnZS0+aW9faGVhZCk7Ci0JZGJnKCJNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGJyaWRnZS0+bWVtX2hlYWQpOwotCWRiZygiUE1FTSByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoYnJpZGdlLT5wX21lbV9oZWFkKTsKLQlkYmcoIkJVUyByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoYnJpZGdlLT5idXNfaGVhZCk7Ci19Ci0KLXZvaWQgYWNwaXBocF9kdW1wX2Z1bmNfcmVzb3VyY2Uoc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYykKLXsKLQlkYmcoIkkvTyByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoZnVuYy0+aW9faGVhZCk7Ci0JZGJnKCJNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGZ1bmMtPm1lbV9oZWFkKTsKLQlkYmcoIlBNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGZ1bmMtPnBfbWVtX2hlYWQpOwotCWRiZygiQlVTIHJlc291cmNlOlxuIik7Ci0JZHVtcF9yZXNvdXJjZShmdW5jLT5idXNfaGVhZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKaW5kZXggYWZiY2NmYS4uOGM2ZDM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwpAQCAtNjAsNiArNjAsNyBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqY3BxaHBfcm9tX3N0YXJ0Owogc3RhdGljIGludCBwb3dlcl9tb2RlOwogc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuOS44IgogI2RlZmluZSBEUklWRVJfQVVUSE9SCSJEYW4gWmluayA8ZGFuLnppbmtAY29tcGFxLmNvbT4sIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IgpAQCAtMTI3MSw3ICsxMjcyLDYgQEAKIHsKIAlpbnQgbG9vcDsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAogCWlmIChpbml0aWFsaXplZCkKIAkJcmV0dXJuIDA7CkBAIC0xNDQxLDcgKzE0NDEsOCBAQAogCX0KIAogCS8vIFN0b3AgdGhlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20KLQljcHFocF9ldmVudF9zdG9wX3RocmVhZCgpOworCWlmIChpbml0aWFsaXplZCkKKwkJY3BxaHBfZXZlbnRfc3RvcF90aHJlYWQoKTsKIAogCS8vdW5tYXAgdGhlIHJvbSBhZGRyZXNzCiAJaWYgKGNwcWhwX3JvbV9zdGFydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjMwNDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHdvcmsgd2FzIGJhc2VkIG9uIHRoZSAyLjQvMi42IGtlcm5lbCBkZXZlbG9wbWVudCBieSBEaWNrIFJlaWduZXIuCisgKiBXb3JrIHRvIGFkZCBCSU9TIFBST00gc3VwcG9ydCB3YXMgY29tcGxldGVkIGJ5IE1pa2UgSGFiZWNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vbDEuaD4KKyNpbmNsdWRlIDxhc20vc24vbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKworI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlNHSSAocHJhcml0QHNnaS5jb20sIGRpY2tpZUBzZ2kuY29tLCBoYWJlY2tAc2dpLmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IEhvdCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciIpOworCisjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQSAgICAgNAorI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQICAgICAgIDIgICAgIC8qIHNsb3QgYWxyZWFkeSB1cCAqLworI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04gICAgIDMgICAgIC8qIHNsb3QgYWxyZWFkeSBkb3duICovCisjZGVmaW5lIFBDSV9MMV9FUlIgICAgICAgICAgICAgICAgNyAgICAgLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCisjZGVmaW5lIFBDSV9FTVBUWV8zM01IWiAgICAgICAgICAxNSAgICAgLyogZW1wdHkgMzMgTUh6IGJ1cyAqLworI2RlZmluZSBQQ0lfTDFfUVNJWkUgICAgICAgICAgICAxMjggICAgIC8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJIDMyCS8qIG1heCBudW1iZXIgb2YgaG90cGx1ZyBzbG90cyAqLworI2RlZmluZSBTR0lfSE9UUExVR19QUk9NX1JFVgkweDA0MjAgIC8qIE1pbi4gcmVxdWlyZWQgUFJPTSB2ZXJzaW9uICovCisKKy8qIGludGVybmFsIGxpc3QgaGVhZCAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc25faHBfbGlzdDsKKworLyogaG90cGx1Z19zbG90IHN0cnVjdCdzIHByaXZhdGUgcG9pbnRlciAqLworc3RydWN0IHNsb3QgeworCWludCBkZXZpY2VfbnVtOworCXN0cnVjdCBwY2lfYnVzICpwY2lfYnVzOworCS8qIHRoaXMgc3RydWN0IGZvciBnbHVlIGludGVybmFsIG9ubHkgKi8KKwlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CisJc3RydWN0IGxpc3RfaGVhZCBocF9saXN0OworfTsKKworc3RydWN0IHBjaWJyX3Nsb3RfZW5hYmxlX3Jlc3AgeworCWludCByZXNwX3N1Yl9lcnJubzsKKwljaGFyIHJlc3BfbDFfbXNnW1BDSV9MMV9RU0laRSArIDFdOworfTsKKworc3RydWN0IHBjaWJyX3Nsb3RfZGlzYWJsZV9yZXNwIHsKKwlpbnQgcmVzcF9zdWJfZXJybm87CisJY2hhciByZXNwX2wxX21zZ1tQQ0lfTDFfUVNJWkUgKyAxXTsKK307CisKK2VudW0gc25fcGNpX3JlcV9lIHsKKwlQQ0lfUkVRX1NMT1RfRUxJR0lCTEUsCisJUENJX1JFUV9TTE9UX0RJU0FCTEUKK307CisKK3N0YXRpYyBpbnQgZW5hYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CitzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKK3N0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworCitzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgc25faG90cGx1Z19zbG90X29wcyA9IHsKKwkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5lbmFibGVfc2xvdCAgICAgICAgICAgID0gZW5hYmxlX3Nsb3QsCisJLmRpc2FibGVfc2xvdCAgICAgICAgICAgPSBkaXNhYmxlX3Nsb3QsCisJLmdldF9wb3dlcl9zdGF0dXMgICAgICAgPSBnZXRfcG93ZXJfc3RhdHVzLAorfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc25faG90cGx1Z19zZW0pOworCitzdGF0aWMgaW50IHNuX3BjaV9zbG90X3ZhbGlkKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzLCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJaW50IGJyaWNrdHlwZTsKKwlpbnQgYnVzX251bTsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgdmFsaWQgc2xvdCBvbiAncGNpX2J1cycgKi8KKwlpZiAoIShwY2lidXNfaW5mby0+cGJpX3ZhbGlkX2RldmljZXMgJiAoMSA8PCBkZXZpY2UpKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWJyaWNrdHlwZSA9IE1PRFVMRV9HRVRfQlRZUEUocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCk7CisJYnVzX251bSA9IHBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtICYgMHhmOworCisJLyogRG8gbm90IGFsbG93IGhvdHBsdWcgb3BlcmF0aW9ucyBvbiBiYXNlIEkvTyBjYXJkcyAqLworCWlmICgoYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV9JWCB8fCAgYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV9JQSkgJiYKKwkgICAgKGJ1c19udW0gPT0gMSAmJiBkZXZpY2UgIT0gMSkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbl9wY2lfYnVzX3ZhbGlkKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzKQoreworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJaW50IGFzaWNfdHlwZTsKKwlpbnQgYnJpY2t0eXBlOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpOworCisJLyogRG9uJ3QgcmVnaXN0ZXIgc2xvdHMgaGFuZ2luZyBvZmYgdGhlIFRJT0NBIGJ1cyAqLworCWFzaWNfdHlwZSA9IHBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX2FzaWNfdHlwZTsKKwlpZiAoYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DQSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIE9ubHkgcmVnaXN0ZXIgc2xvdHMgaW4gSS9PIEJyaWNrcyB0aGF0IHN1cHBvcnQgaG90cGx1ZyAqLworCWJyaWNrdHlwZSA9IE1PRFVMRV9HRVRfQlRZUEUocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCk7CisJc3dpdGNoIChicmlja3R5cGUpIHsKKwljYXNlIEwxX0JSSUNLVFlQRV9JWDoKKwljYXNlIEwxX0JSSUNLVFlQRV9QWDoKKwljYXNlIEwxX0JSSUNLVFlQRV9JQToKKwljYXNlIEwxX0JSSUNLVFlQRV9QQToKKwkJcmV0dXJuIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBFUk07CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHNuX2hwX3Nsb3RfcHJpdmF0ZV9hbGxvYyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCSAgICBzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCXN0cnVjdCBzbG90ICpzbG90OworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpOworCisJYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzbG90KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisKKwlic3NfaG90cGx1Z19zbG90LT5uYW1lID0ga21hbGxvYygzMywgR0ZQX0tFUk5FTCk7CisJaWYgKCFic3NfaG90cGx1Z19zbG90LT5uYW1lKSB7CisJCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbG90LT5kZXZpY2VfbnVtID0gZGV2aWNlOworCXNsb3QtPnBjaV9idXMgPSBwY2lfYnVzOworCisJc3ByaW50Zihic3NfaG90cGx1Z19zbG90LT5uYW1lLCAibW9kdWxlXyVjJWMlYyVjJS4yZF9iXyVkX3NfJWQiLAorCQknMCcrUkFDS19HRVRfQ0xBU1MoTU9EVUxFX0dFVF9SQUNLKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKSwKKwkJJzAnK1JBQ0tfR0VUX0dST1VQKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCisJCScwJytSQUNLX0dFVF9OVU0oTU9EVUxFX0dFVF9SQUNLKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKSwKKwkJTU9EVUxFX0dFVF9CVENIQVIocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCksCisJCU1PRFVMRV9HRVRfQlBPUyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSwKKwkJKChpbnQpcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pICYgMHhmLAorCQlkZXZpY2UgKyAxKTsKKworCXNsb3QtPmhvdHBsdWdfc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3Q7CisJbGlzdF9hZGQoJnNsb3QtPmhwX2xpc3QsICZzbl9ocF9saXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdCAqIHNuX2hwX2Rlc3Ryb3kodm9pZCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmc25faHBfbGlzdCkgeworCQlzbG90ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc2xvdCwgaHBfbGlzdCk7CisJCWJzc19ob3RwbHVnX3Nsb3QgPSBzbG90LT5ob3RwbHVnX3Nsb3Q7CisJCWxpc3RfZGVsKCYoKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSktPgorCQkJIGhwX2xpc3QpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGJzc19ob3RwbHVnX3Nsb3Q7Cit9CisKK3N0YXRpYyB2b2lkIHNuX2J1c19hbGxvY19kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOworCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKKworCXNuX3BjaV9maXh1cF9zbG90KGRldik7CisKKwkvKiBSZWN1cnNpdmVseSBzZXRzIHVwIHRoZSBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJc3Vib3JkaW5hdGVfYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKKwkJbGlzdF9mb3JfZWFjaChub2RlLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzKSB7CisJCQljaGlsZCA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJCXNuX2J1c19hbGxvY19kYXRhKGNoaWxkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc25fYnVzX2ZyZWVfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CisJc3RydWN0IHBjaV9idXMgKnN1Ym9yZGluYXRlX2J1czsKKwlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7CisKKwkvKiBSZWN1cnNpdmVseSBjbGVhbiB1cCBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJc3Vib3JkaW5hdGVfYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKKwkJbGlzdF9mb3JfZWFjaChub2RlLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzKSB7CisJCQljaGlsZCA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJCXNuX2J1c19mcmVlX2RhdGEoY2hpbGQpOworCQl9CisJfQorCXNuX3BjaV91bmZpeHVwX3Nsb3QoZGV2KTsKK30KKworc3RhdGljIHU4IHNuX3Bvd2VyX3N0YXR1c19nZXQoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwl1OCByZXR2YWw7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisJcmV0dmFsID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKKworCXJldHVybiByZXR2YWwgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQgc25fc2xvdF9tYXJrX2VuYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCWludCBkZXZpY2VfbnVtKQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOworCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzIHw9ICgxIDw8IGRldmljZV9udW0pOworfQorCitzdGF0aWMgdm9pZCBzbl9zbG90X21hcmtfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCSBpbnQgZGV2aWNlX251bSkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKwlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmPSB+KDEgPDwgZGV2aWNlX251bSk7Cit9CisKK3N0YXRpYyBpbnQgc25fc2xvdF9lbmFibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKKwkJCSAgaW50IGRldmljZV9udW0pCit7CisJc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJc3RydWN0IHBjaWJyX3Nsb3RfZW5hYmxlX3Jlc3AgcmVzcDsKKwlpbnQgcmM7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisKKwkvKgorCSAqIFBvd2VyLW9uIGFuZCBpbml0aWFsaXplIHRoZSBzbG90IGluIHRoZSBTTgorCSAqIFBDSSBpbmZyYXN0cnVjdHVyZS4KKwkgKi8KKwlyYyA9IHNhbF9wY2licl9zbG90X2VuYWJsZShwY2lidXNfaW5mbywgZGV2aWNlX251bSwgJnJlc3ApOworCisJaWYgKHJjID09IFBDSV9TTE9UX0FMUkVBRFlfVVApIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAiaXMgYWxyZWFkeSBhY3RpdmVcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyYyA9PSBQQ0lfTDFfRVJSKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJMMSBmYWlsdXJlICVkIHdpdGggbWVzc2FnZTogJXMiLAorCQkJcmVzcC5yZXNwX3N1Yl9lcnJubywgcmVzcC5yZXNwX2wxX21zZyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKHJjKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJpbnNlcnQgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAorCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzbl9zbG90X21hcmtfZW5hYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25fc2xvdF9kaXNhYmxlKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJCQkgICBpbnQgZGV2aWNlX251bSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwlzdHJ1Y3QgcGNpYnJfc2xvdF9kaXNhYmxlX3Jlc3AgcmVzcDsKKwlpbnQgcmM7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisKKwlyYyA9IHNhbF9wY2licl9zbG90X2Rpc2FibGUocGNpYnVzX2luZm8sIGRldmljZV9udW0sIGFjdGlvbiwgJnJlc3ApOworCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgIlNsb3QgJXMgYWxyZWFkeSBpbmFjdGl2ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFICYmIHJjID09IFBDSV9FTVBUWV8zM01IWikgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkiQ2Fubm90IHJlbW92ZSBsYXN0IDMzTUh6IGNhcmRcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFICYmIHJjID09IFBDSV9MMV9FUlIpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJIkwxIGZhaWx1cmUgJWQgd2l0aCBtZXNzYWdlIFxuJXNcbiIsCisJCQlyZXNwLnJlc3Bfc3ViX2Vycm5vLCByZXNwLnJlc3BfbDFfbXNnKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiByYykgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkicmVtb3ZlIGZhaWxlZCB3aXRoIGVycm9yICVkIHN1Yi1lcnJvciAlZFxuIiwKKwkJCXJjLCByZXNwLnJlc3Bfc3ViX2Vycm5vKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgIXJjKQorCQlyZXR1cm4gMDsKKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUgJiYgIXJjKSB7CisJCXNuX3Nsb3RfbWFya19kaXNhYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJyZW1vdmUgc3VjY2Vzc2Z1bFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUgJiYgcmMpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCJyZW1vdmUgZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqbmV3X2J1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZnVuYywgbnVtX2Z1bmNzOworCWludCBuZXdfcHBiID0gMDsKKwlpbnQgcmM7CisKKwkvKiBTZXJpYWxpemUgdGhlIExpbnV4IFBDSSBpbmZyYXN0cnVjdHVyZSAqLworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKworCS8qCisJICogUG93ZXItb24gYW5kIGluaXRpYWxpemUgdGhlIHNsb3QgaW4gdGhlIFNOCisJICogUENJIGluZnJhc3RydWN0dXJlLgorCSAqLworCXJjID0gc25fc2xvdF9lbmFibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSk7CisJaWYgKHJjKSB7CisJCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJCXJldHVybiByYzsKKwl9CisKKwludW1fZnVuY3MgPSBwY2lfc2Nhbl9zbG90KHNsb3QtPnBjaV9idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtKzEsCisJCQkJCQkJICAgUENJX0ZVTkMoMCkpKTsKKwlpZiAoIW51bV9mdW5jcykgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJubyBkZXZpY2UgaW4gc2xvdFxuIik7CisJCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKHBjaV9kb21haW5fbnIoc2xvdC0+cGNpX2J1cyksCisJCQkJc2xvdC0+cGNpX2J1cy0+bnVtYmVyLAorCQkJCXNsb3QtPnBjaV9idXMpOworCS8qCisJICogTWFwIFNOIHJlc291cmNlcyBmb3IgYWxsIGZ1bmN0aW9ucyBvbiB0aGUgY2FyZAorCSAqIHRvIHRoZSBMaW51eCBQQ0kgaW50ZXJmYWNlIGFuZCB0ZWxsIHRoZSBkcml2ZXJzCisJICogYWJvdXQgdGhlbS4KKwkgKi8KKwlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgbnVtX2Z1bmNzOyAgZnVuYysrKSB7CisJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAorCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtICsgMSwKKwkJCQkJICAgICBQQ0lfRlVOQyhmdW5jKSkpOworCisKKwkJaWYgKGRldikgeworCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLAorCQkJCQkJICAgICAmc2VjX2J1cyk7CisJCQkJbmV3X2J1cyA9IHBjaV9hZGRfbmV3X2J1cyhkZXYtPmJ1cywgZGV2LAorCQkJCQkJCSAgc2VjX2J1cyk7CisJCQkJcGNpX3NjYW5fY2hpbGRfYnVzKG5ld19idXMpOworCQkJCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKHBjaV9kb21haW5fbnIobmV3X2J1cyksCisJCQkJCQkJbmV3X2J1cy0+bnVtYmVyLAorCQkJCQkJCW5ld19idXMpOworCQkJCW5ld19wcGIgPSAxOworCQkJfQorCQkJc25fYnVzX2FsbG9jX2RhdGEoZGV2KTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CisJCX0KKwl9CisKKwkvKiBDYWxsIHRoZSBkcml2ZXIgZm9yIHRoZSBuZXcgZGV2aWNlICovCisJcGNpX2J1c19hZGRfZGV2aWNlcyhzbG90LT5wY2lfYnVzKTsKKwkvKiBDYWxsIHRoZSBkcml2ZXJzIGZvciB0aGUgbmV3IGRldmljZXMgc3Vib3JkaW5hdGUgdG8gUFBCICovCisJaWYgKG5ld19wcGIpCisJCXBjaV9idXNfYWRkX2RldmljZXMobmV3X2J1cyk7CisKKwl1cCgmc25faG90cGx1Z19zZW0pOworCisJaWYgKHJjID09IDApCisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJpbnNlcnQgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCWVsc2UKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJImluc2VydCBvcGVyYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkaXNhYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZnVuYzsKKwlpbnQgcmM7CisKKwkvKiBBY3F1aXJlIHVwZGF0ZSBhY2Nlc3MgdG8gdGhlIGJ1cyAqLworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKworCS8qIGlzIGl0IG9rYXkgdG8gYnJpbmcgdGhpcyBzbG90IGRvd24/ICovCisJcmMgPSBzbl9zbG90X2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSwKKwkJCSAgICAgUENJX1JFUV9TTE9UX0VMSUdJQkxFKTsKKwlpZiAocmMpCisJCWdvdG8gbGVhdmluZzsKKworCS8qIEZyZWUgdGhlIFNOIHJlc291cmNlcyBhc3NpZ25lZCB0byB0aGUgTGludXggZGV2aWNlLiovCisJZm9yIChmdW5jID0gMDsgZnVuYyA8IDg7ICBmdW5jKyspIHsKKwkJZGV2ID0gcGNpX2dldF9zbG90KHNsb3QtPnBjaV9idXMsCisJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0rMSwKKwkJCQkgICAJICAgICBQQ0lfRlVOQyhmdW5jKSkpOworCQlpZiAoZGV2KSB7CisJCQkvKgorCQkJICogU29tZSBkcml2ZXJzIG1heSB1c2UgZG1hIGFjY2Vzc2VzIGR1cmluZyB0aGUKKwkJCSAqIGRyaXZlciByZW1vdmUgZnVuY3Rpb24uIFdlIHJlbGVhc2UgdGhlIHN5c2RhdGEKKwkJCSAqIGFyZWFzIGFmdGVyIHRoZSBkcml2ZXIgcmVtb3ZlIGZ1bmN0aW9ucyBoYXZlCisJCQkgKiBiZWVuIGNhbGxlZC4KKwkJCSAqLworCQkJc25fYnVzX3N0b3JlX3N5c2RhdGEoZGV2KTsKKwkJCXNuX2J1c19mcmVlX2RhdGEoZGV2KTsKKwkJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJfQorCX0KKworCS8qIGZyZWUgdGhlIGNvbGxlY3RlZCBzeXNkYXRhIHBvaW50ZXJzICovCisJc25fYnVzX2ZyZWVfc3lzZGF0YSgpOworCisJLyogRGVhY3RpdmF0ZSBzbG90ICovCisJcmMgPSBzbl9zbG90X2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSwKKwkJCSAgICAgUENJX1JFUV9TTE9UX0RJU0FCTEUpOworIGxlYXZpbmc6CisJLyogUmVsZWFzZSB0aGUgYnVzIGxvY2sgKi8KKwl1cCgmc25faG90cGx1Z19zZW0pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQoreworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKwkqdmFsdWUgPSBzbl9wb3dlcl9zdGF0dXNfZ2V0KGJzc19ob3RwbHVnX3Nsb3QpOworCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuX3JlbGVhc2Vfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPmluZm8pOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPm5hbWUpOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QpOworfQorCitzdGF0aWMgaW50IHNuX2hvdHBsdWdfc2xvdF9yZWdpc3RlcihzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cykKK3sKKwlpbnQgZGV2aWNlOworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3Q7CisJaW50IHJjID0gMDsKKworCS8qCisJICogQ3VycmVudGx5IG9ubHkgZm91ciBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQsCisJICogaW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXliZSBtb3JlIC0tIHVwIHRvIDMyLgorCSAqLworCisJZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBTTl9NQVhfSFBfU0xPVFMgOyBkZXZpY2UrKykgeworCQlpZiAoc25fcGNpX3Nsb3RfdmFsaWQocGNpX2J1cywgZGV2aWNlKSAhPSAxKQorCQkJY29udGludWU7CisKKwkJYnNzX2hvdHBsdWdfc2xvdCA9IGtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdCksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZiAoIWJzc19ob3RwbHVnX3Nsb3QpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gYWxsb2NfZXJyOworCQl9CisKKwkJYnNzX2hvdHBsdWdfc2xvdC0+aW5mbyA9CisJCQlrY2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+aW5mbykgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhbGxvY19lcnI7CisJCX0KKworCQlpZiAoc25faHBfc2xvdF9wcml2YXRlX2FsbG9jKGJzc19ob3RwbHVnX3Nsb3QsCisJCQkJCSAgICAgcGNpX2J1cywgZGV2aWNlKSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhbGxvY19lcnI7CisJCX0KKworCQlic3NfaG90cGx1Z19zbG90LT5vcHMgPSAmc25faG90cGx1Z19zbG90X29wczsKKwkJYnNzX2hvdHBsdWdfc2xvdC0+cmVsZWFzZSA9ICZzbl9yZWxlYXNlX3Nsb3Q7CisKKwkJcmMgPSBwY2lfaHBfcmVnaXN0ZXIoYnNzX2hvdHBsdWdfc2xvdCk7CisJCWlmIChyYykKKwkJCWdvdG8gcmVnaXN0ZXJfZXJyOworCX0KKwlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJSZWdpc3RlcmVkIGJ1cyB3aXRoIGhvdHBsdWdcbiIpOworCXJldHVybiByYzsKKworcmVnaXN0ZXJfZXJyOgorCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgImJ1cyBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBlcnIgPSAlZFxuIiwKKwkgICAgICAgIHJjKTsKKworYWxsb2NfZXJyOgorCWlmIChyYyA9PSAtRU5PTUVNKQorCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisKKwkvKiBkZXN0cm95IFRISVMgZWxlbWVudCAqLworCWlmIChic3NfaG90cGx1Z19zbG90KQorCQlzbl9yZWxlYXNlX3Nsb3QoYnNzX2hvdHBsdWdfc2xvdCk7CisKKwkvKiBkZXN0cm95IGFueXRoaW5nIGVsc2Ugb24gdGhlIGxpc3QgKi8KKwl3aGlsZSAoKGJzc19ob3RwbHVnX3Nsb3QgPSBzbl9ocF9kZXN0cm95KCkpKQorCQlwY2lfaHBfZGVyZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzbl9wY2lfaG90cGx1Z19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9idXMgKnBjaV9idXMgPSBOVUxMOworCWludCByYzsKKwlpbnQgcmVnaXN0ZXJlZCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7CisKKwlpZiAoc25fc2FsX3JldigpIDwgU0dJX0hPVFBMVUdfUFJPTV9SRVYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUFJPTSB2ZXJzaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQuMDVcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXdoaWxlICgocGNpX2J1cyA9IHBjaV9maW5kX25leHRfYnVzKHBjaV9idXMpKSkgeworCQlpZiAoIXBjaV9idXMtPnN5c2RhdGEpCisJCQljb250aW51ZTsKKworCQlyYyA9IHNuX3BjaV9idXNfdmFsaWQocGNpX2J1cyk7CisJCWlmIChyYyAhPSAxKSB7CisJCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJub3QgYSB2YWxpZCBob3RwbHVnIGJ1c1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJ2YWxpZCBob3RwbHVnIGJ1c1xuIik7CisKKwkJcmMgPSBzbl9ob3RwbHVnX3Nsb3RfcmVnaXN0ZXIocGNpX2J1cyk7CisJCWlmICghcmMpCisJCQlyZWdpc3RlcmVkID0gMTsKKwkJZWxzZSB7CisJCQlyZWdpc3RlcmVkID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlZ2lzdGVyZWQgPT0gMSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBzbl9wY2lfaG90cGx1Z19leGl0KHZvaWQpCit7CisJc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdDsKKworCXdoaWxlICgoYnNzX2hvdHBsdWdfc2xvdCA9IHNuX2hwX2Rlc3Ryb3koKSkpIHsKKwkJcGNpX2hwX2RlcmVnaXN0ZXIoYnNzX2hvdHBsdWdfc2xvdCk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZzbl9ocF9saXN0KSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJuYWwgbGlzdCBpcyBub3QgZW1wdHlcbiIsIF9fRklMRV9fKTsKK30KKworbW9kdWxlX2luaXQoc25fcGNpX2hvdHBsdWdfaW5pdCk7Cittb2R1bGVfZXhpdChzbl9wY2lfaG90cGx1Z19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMzAyMDZhYy4uYjVhYjlhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0yOCwxMCArMjgsMTAgQEAKIHN0YXRpYyBrbWVtX2NhY2hlX3QqIG1zaV9jYWNoZXA7CiAKIHN0YXRpYyBpbnQgcGNpX21zaV9lbmFibGUgPSAxOwotc3RhdGljIGludCBsYXN0X2FsbG9jX3ZlY3RvciA9IDA7Ci1zdGF0aWMgaW50IG5yX3JlbGVhc2VkX3ZlY3RvcnMgPSAwOworc3RhdGljIGludCBsYXN0X2FsbG9jX3ZlY3RvcjsKK3N0YXRpYyBpbnQgbnJfcmVsZWFzZWRfdmVjdG9yczsKIHN0YXRpYyBpbnQgbnJfcmVzZXJ2ZWRfdmVjdG9ycyA9IE5SX0hQX1JFU0VSVkVEX1ZFQ1RPUlM7Ci1zdGF0aWMgaW50IG5yX21zaXhfZGV2aWNlcyA9IDA7CitzdGF0aWMgaW50IG5yX21zaXhfZGV2aWNlczsKIAogI2lmbmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIGludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OwpAQCAtMTcwLDQ0ICsxNzAsMzAgQEAKIAlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21zaSh1bnNpZ25lZCBpbnQgdmVjdG9yKTsKLXN0YXRpYyB2b2lkIHNodXRkb3duX21zaV9pcnEodW5zaWduZWQgaW50IHZlY3RvcikKLXsKLQlyZWxlYXNlX21zaSh2ZWN0b3IpOwotfQotCi0jZGVmaW5lIHNodXRkb3duX21zaV9pcnFfd29fbWFza2JpdAlzaHV0ZG93bl9tc2lfaXJxCi1zdGF0aWMgdm9pZCBlbmFibGVfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpIHt9Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKSB7fQotc3RhdGljIHZvaWQgYWNrX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKSB7fQotc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKQotewotCW1vdmVfbXNpKHZlY3Rvcik7Ci0JYWNrX0FQSUNfaXJxKCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKQogeworCXN0YXJ0dXBfbXNpX2lycV93b19tYXNrYml0KHZlY3Rvcik7CisJdW5tYXNrX01TSV9pcnEodmVjdG9yKTsKKwlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9tc2lfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1zaV9sb2NrLCBmbGFncyk7CiAJZW50cnkgPSBtc2lfZGVzY1t2ZWN0b3JdOwotCWlmICghZW50cnkgfHwgIWVudHJ5LT5kZXYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNpX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVudHJ5LT5tc2lfYXR0cmliLnN0YXRlID0gMTsJLyogTWFyayBpdCBhY3RpdmUgKi8KKwlpZiAoZW50cnkgJiYgZW50cnktPmRldikKKwkJZW50cnktPm1zaV9hdHRyaWIuc3RhdGUgPSAwOwkvKiBNYXJrIGl0IG5vdCBhY3RpdmUgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2lfbG9jaywgZmxhZ3MpOwotCi0JdW5tYXNrX01TSV9pcnEodmVjdG9yKTsKLQlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwogfQogCi0jZGVmaW5lIHNodXRkb3duX21zaV9pcnFfd19tYXNrYml0CXNodXRkb3duX21zaV9pcnEKLSNkZWZpbmUgZW5hYmxlX21zaV9pcnFfd19tYXNrYml0CXVubWFza19NU0lfaXJxCi0jZGVmaW5lIGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQJbWFza19NU0lfaXJxCi0jZGVmaW5lIGFja19tc2lfaXJxX3dfbWFza2JpdAkJbWFza19NU0lfaXJxCitzdGF0aWMgdm9pZCBlbmRfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJbW92ZV9tc2kodmVjdG9yKTsKKwlhY2tfQVBJQ19pcnEoKTsKK30KIAogc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7CkBAIC0yMTYsNiArMjAyLDEwIEBACiAJYWNrX0FQSUNfaXJxKCk7CiB9CiAKK3N0YXRpYyB2b2lkIGRvX25vdGhpbmcodW5zaWduZWQgaW50IHZlY3RvcikKK3sKK30KKwogLyoKICAqIEludGVycnVwdCBUeXBlIGZvciBNU0ktWCBQQ0kvUENJLVgvUENJLUV4cHJlc3MgRGV2aWNlcywKICAqIHdoaWNoIGltcGxlbWVudCB0aGUgTVNJLVggQ2FwYWJpbGl0eSBTdHJ1Y3R1cmUuCkBAIC0yMjMsMTAgKzIxMywxMCBAQAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBtc2l4X2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJQQ0ktTVNJLVgiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQsCi0JLmFjawkJPSBhY2tfbXNpX2lycV93X21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IHVubWFza19NU0lfaXJxLAorCS5kaXNhYmxlCT0gbWFza19NU0lfaXJxLAorCS5hY2sJCT0gbWFza19NU0lfaXJxLAogCS5lbmQJCT0gZW5kX21zaV9pcnFfd19tYXNrYml0LAogCS5zZXRfYWZmaW5pdHkJPSBzZXRfbXNpX2lycV9hZmZpbml0eQogfTsKQEAgLTIzOSwxMCArMjI5LDEwIEBACiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1zaV9pcnFfd19tYXNrYml0X3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIlBDSS1NU0kiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQsCi0JLmFjawkJPSBhY2tfbXNpX2lycV93X21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IHVubWFza19NU0lfaXJxLAorCS5kaXNhYmxlCT0gbWFza19NU0lfaXJxLAorCS5hY2sJCT0gbWFza19NU0lfaXJxLAogCS5lbmQJCT0gZW5kX21zaV9pcnFfd19tYXNrYml0LAogCS5zZXRfYWZmaW5pdHkJPSBzZXRfbXNpX2lycV9hZmZpbml0eQogfTsKQEAgLTI1NSwxMCArMjQ1LDEwIEBACiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1zaV9pcnFfd29fbWFza2JpdF90eXBlID0gewogCS50eXBlbmFtZQk9ICJQQ0ktTVNJIiwKIAkuc3RhcnR1cAk9IHN0YXJ0dXBfbXNpX2lycV93b19tYXNrYml0LAotCS5zaHV0ZG93bgk9IHNodXRkb3duX21zaV9pcnFfd29fbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dvX21hc2tiaXQsCi0JLmRpc2FibGUJPSBkaXNhYmxlX21zaV9pcnFfd29fbWFza2JpdCwKLQkuYWNrCQk9IGFja19tc2lfaXJxX3dvX21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IGRvX25vdGhpbmcsCisJLmRpc2FibGUJPSBkb19ub3RoaW5nLAorCS5hY2sJCT0gZG9fbm90aGluZywKIAkuZW5kCQk9IGVuZF9tc2lfaXJxX3dvX21hc2tiaXQsCiAJLnNldF9hZmZpbml0eQk9IHNldF9tc2lfaXJxX2FmZmluaXR5CiB9OwpAQCAtNDA3LDcgKzM5Nyw3IEBACiB7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAotCWVudHJ5ID0gKHN0cnVjdCBtc2lfZGVzYyopIGttZW1fY2FjaGVfYWxsb2MobXNpX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhtc2lfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTc5NiwxOCArNzg2LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJlbGVhc2VfbXNpKHVuc2lnbmVkIGludCB2ZWN0b3IpCi17Ci0Jc3RydWN0IG1zaV9kZXNjICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zaV9sb2NrLCBmbGFncyk7Ci0JZW50cnkgPSBtc2lfZGVzY1t2ZWN0b3JdOwotCWlmIChlbnRyeSAmJiBlbnRyeS0+ZGV2KQotCQllbnRyeS0+bXNpX2F0dHJpYi5zdGF0ZSA9IDA7CS8qIE1hcmsgaXQgbm90IGFjdGl2ZSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zaV9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgbXNpX2ZyZWVfdmVjdG9yKHN0cnVjdCBwY2lfZGV2KiBkZXYsIGludCB2ZWN0b3IsIGludCByZWFzc2lnbikKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwpAQCAtOTI0LDcgKzkwMiw3IEBACiAvKioKICAqIHBjaV9lbmFibGVfbXNpeCAtIGNvbmZpZ3VyZSBkZXZpY2UncyBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQogICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpX2RldiBkYXRhIHN0cnVjdHVyZSBvZiBNU0ktWCBkZXZpY2UgZnVuY3Rpb24KLSAqIEBkYXRhOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIE1TSS1YIGVudHJpZXMKKyAqIEBlbnRyaWVzOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIE1TSS1YIGVudHJpZXMKICAqIEBudmVjOiBudW1iZXIgb2YgTVNJLVggdmVjdG9ycyByZXF1ZXN0ZWQgZm9yIGFsbG9jYXRpb24gYnkgZGV2aWNlIGRyaXZlcgogICoKICAqIFNldHVwIHRoZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBvZiBkZXZpY2UgZnVuY3Rpb24gd2l0aCB0aGUgbnVtYmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuaCBiL2RyaXZlcnMvcGNpL21zaS5oCmluZGV4IGJlZjIxYWUuLjM5MGYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5oCisrKyBiL2RyaXZlcnMvcGNpL21zaS5oCkBAIC00MSwxMSArNDEsMTEgQEAKICNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklSTUFTSwkJKDcgPDwgMCkKICNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklUTUFTSwkJKDEgPDwgMCkKIAotI2RlZmluZSBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVAkwCi0jZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFJfT0ZGU0VUCTQKLSNkZWZpbmUgUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQJCTgKLSNkZWZpbmUgUENJX01TSVhfRU5UUllfVkVDVE9SX0NUUkxfT0ZGU0VUCTEyCiAjZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1NJWkUJCQkxNgorI2RlZmluZSAgUENJX01TSVhfRU5UUllfTE9XRVJfQUREUl9PRkZTRVQJMAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfVVBQRVJfQUREUl9PRkZTRVQJNAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQJCTgKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMX09GRlNFVAkxMgogCiAjZGVmaW5lIG1zaV9jb250cm9sX3JlZyhiYXNlKQkJKGJhc2UgKyBQQ0lfTVNJX0ZMQUdTKQogI2RlZmluZSBtc2lfbG93ZXJfYWRkcmVzc19yZWcoYmFzZSkJKGJhc2UgKyBQQ0lfTVNJX0FERFJFU1NfTE8pCkBAIC02NCw3ICs2NCw2IEBACiAjZGVmaW5lIG1zaV9lbmFibGUoY29udHJvbCwgbnVtKSBtdWx0aV9tc2lfZW5hYmxlKGNvbnRyb2wsIG51bSk7IFwKIAljb250cm9sIHw9IFBDSV9NU0lfRkxBR1NfRU5BQkxFCiAKLSNkZWZpbmUgbXNpeF9jb250cm9sX3JlZwkJbXNpX2NvbnRyb2xfcmVnCiAjZGVmaW5lIG1zaXhfdGFibGVfb2Zmc2V0X3JlZyhiYXNlKQkoYmFzZSArIDB4MDQpCiAjZGVmaW5lIG1zaXhfcGJhX29mZnNldF9yZWcoYmFzZSkJKGJhc2UgKyAweDA4KQogI2RlZmluZSBtc2l4X2VuYWJsZShjb250cm9sKQkgCWNvbnRyb2wgfD0gUENJX01TSVhfRkxBR1NfRU5BQkxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBiYzAxZDM0Li5lOWUzN2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTEsOSArMSwxMCBAQAogLyoKICAqIEZpbGU6CXBjaS1hY3BpLmMKLSAqIFB1cnBvc2U6CVByb3ZpZGUgUENJIHN1cHBvcnRzIGluIEFDUEkKKyAqIFB1cnBvc2U6CVByb3ZpZGUgUENJIHN1cHBvcnQgaW4gQUNQSQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbAotICogQ29weXJpZ2h0IChDKSBUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVG9tIExvbmcgTmd1eWVuIDx0b20ubC5uZ3V5ZW5AaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xNiw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KKyNpbmNsdWRlICJwY2kuaCIKIAogc3RhdGljIHUzMiBjdHJsc2V0X2J1ZlszXSA9IHswLCAwLCAwfTsKIHN0YXRpYyB1MzIgZ2xvYmFsX2N0cmxzZXRzID0gMDsKQEAgLTIwNywzICsyMDksMTA1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX29zY19jb250cm9sX3NldCk7CisKKy8qCisgKiBfU3hEIHJldHVybnMgdGhlIEQtc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBwb3dlcgorICogKGxvd2VzdCBELXN0YXRlIG51bWJlcikgc3VwcG9ydGVkIGluIHRoZSBTLXN0YXRlICJ4Ii4KKyAqCisgKiBJZiB0aGUgZGV2aWNlcyBkb2VzIG5vdCBoYXZlIGEgX1BSVworICogKFBvd2VyIFJlc291cmNlcyBmb3IgV2FrZSkgc3VwcG9ydGluZyBzeXN0ZW0gd2FrZXVwIGZyb20gIngiCisgKiB0aGVuIHRoZSBPUyBpcyBmcmVlIHRvIGNob29zZSBhIGxvd2VyIHBvd2VyIChoaWdoZXIgbnVtYmVyCisgKiBELXN0YXRlKSB0aGFuIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBfU3hELgorICoKKyAqIEJ1dCBpZiBfUFJXIGlzIGVuYWJsZWQgYXQgUy1zdGF0ZSAieCIsIHRoZSBPUworICogbXVzdCBub3QgY2hvb3NlIGEgcG93ZXIgbG93ZXIgdGhhbiBfU3hEIC0tCisgKiB1bmxlc3MgdGhlIGRldmljZSBoYXMgYW4gX1N4VyBtZXRob2Qgc3BlY2lmeWluZworICogdGhlIGxvd2VzdCBwb3dlciAoaGlnaGVzdCBELXN0YXRlIG51bWJlcikgdGhlIGRldmljZQorICogbWF5IGVudGVyIHdoaWxlIHN0aWxsIGFibGUgdG8gd2FrZSB0aGUgc3lzdGVtLgorICoKKyAqIGllLiBkZXBlbmRpbmcgb24gZ2xvYmFsIE9TIHBvbGljeToKKyAqCisgKiBpZiAoX1BSVyBhdCBTLXN0YXRlIHgpCisgKgljaG9vc2UgZnJvbSBoaWdoZXN0IHBvd2VyIF9TeEQgdG8gbG93ZXN0IHBvd2VyIF9TeFcKKyAqIGVsc2UgLy8gbm8gX1BSVyBhdCBTLXN0YXRlIHgKKyAqIAljaG9vc2UgaGlnaGVzdCBwb3dlciBfU3hEIG9yIGFueSBsb3dlciBwb3dlcgorICoKKyAqIGN1cnJlbnRseSB3ZSBzaW1wbHkgcmV0dXJuIF9TeEQsIGlmIHByZXNlbnQuCisgKi8KKworc3RhdGljIGludCBhY3BpX3BjaV9jaG9vc2Vfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBUQkQgKi8KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGFjcGlfcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKK3sKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJmRldi0+ZGV2KTsKKwlzdGF0aWMgaW50IHN0YXRlX2NvbnZbXSA9IHsKKwkJWzBdID0gMCwKKwkJWzFdID0gMSwKKwkJWzJdID0gMiwKKwkJWzNdID0gMywKKwkJWzRdID0gMworCX07CisJaW50IGFjcGlfc3RhdGUgPSBzdGF0ZV9jb252WyhpbnQgX19mb3JjZSkgc3RhdGVdOworCisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBhY3BpX2J1c19zZXRfcG93ZXIoaGFuZGxlLCBhY3BpX3N0YXRlKTsKK30KKworCisvKiBBQ1BJIGJ1cyB0eXBlICovCitzdGF0aWMgaW50IHBjaV9hY3BpX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXY7CisJYWNwaV9pbnRlZ2VyCWFkZHI7CisKKwlwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCS8qIFBsZWFzZSByZWYgdG8gQUNQSSBzcGVjIGZvciB0aGUgc3ludGF4IG9mIF9BRFIgKi8KKwlhZGRyID0gKFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKSA8PCAxNikgfCBQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbik7CisJKmhhbmRsZSA9IGFjcGlfZ2V0X2NoaWxkKERFVklDRV9BQ1BJX0hBTkRMRShkZXYtPnBhcmVudCksIGFkZHIpOworCWlmICghKmhhbmRsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2FjcGlfZmluZF9yb290X2JyaWRnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICpoYW5kbGUpCit7CisJaW50IG51bTsKKwl1bnNpZ25lZCBpbnQgc2VnLCBidXM7CisKKwkvKgorCSAqIFRoZSBzdHJpbmcgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJvb3QgYnJpZGdlJ3MgbmFtZQorCSAqIFBsZWFzZSBsb29rIGF0ICdwY2lfc2Nhbl9idXNfcGFyZW50ZWQnCisJICovCisJbnVtID0gc3NjYW5mKGRldi0+YnVzX2lkLCAicGNpJTA0eDolMDJ4IiwgJnNlZywgJmJ1cyk7CisJaWYgKG51bSAhPSAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkqaGFuZGxlID0gYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHNlZywgYnVzKTsKKwlpZiAoISpoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfYnVzX3R5cGUgcGNpX2FjcGlfYnVzID0geworCS5idXMgPSAmcGNpX2J1c190eXBlLAorCS5maW5kX2RldmljZSA9IHBjaV9hY3BpX2ZpbmRfZGV2aWNlLAorCS5maW5kX2JyaWRnZSA9IHBjaV9hY3BpX2ZpbmRfcm9vdF9icmlkZ2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfYWNwaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoJnBjaV9hY3BpX2J1cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisJcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSA9IGFjcGlfcGNpX2Nob29zZV9zdGF0ZTsKKwlwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlID0gYWNwaV9wY2lfc2V0X3Bvd2VyX3N0YXRlOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChwY2lfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCBlNjViZjJiLi5lNDExNWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktZHluaWRzLmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIC8qCkBAIC0xOCwzNiArMTcsMTIgQEAKICAqIER5bmFtaWMgZGV2aWNlIElEcyBhcmUgZGlzYWJsZWQgZm9yICFDT05GSUdfSE9UUExVRwogICovCiAKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotLyoqCi0gKiBwY2lfZGV2aWNlX3Byb2JlX2R5bmFtaWMoKQotICoKLSAqIFdhbGsgdGhlIGR5bmFtaWMgSUQgbGlzdCBsb29raW5nIGZvciBhIG1hdGNoLgotICogcmV0dXJucyAwIGFuZCBzZXRzIHBjaV9kZXYtPmRyaXZlciB3aGVuIGRydiBjbGFpbXMgcGNpX2RldiwgZWxzZSBlcnJvci4KLSAqLwotc3RhdGljIGludAotcGNpX2RldmljZV9wcm9iZV9keW5hbWljKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCWludCBlcnJvciA9IC1FTk9ERVY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXN0cnVjdCBkeW5pZCAqZHluaWQ7CitzdHJ1Y3QgcGNpX2R5bmlkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IHBjaV9kZXZpY2VfaWQgaWQ7Cit9OwogCi0Jc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJmRydi0+ZHluaWRzLmxpc3QpIHsKLQkJZHluaWQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGR5bmlkLCBub2RlKTsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKCZkeW5pZC0+aWQsIHBjaV9kZXYpKSB7Ci0JCQlzcGluX3VubG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JCQllcnJvciA9IGRydi0+cHJvYmUocGNpX2RldiwgJmR5bmlkLT5pZCk7Ci0JCQlpZiAoZXJyb3IgPj0gMCkgewotCQkJCXBjaV9kZXYtPmRyaXZlciA9IGRydjsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JcmV0dXJuIGVycm9yOwotfQorI2lmZGVmIENPTkZJR19IT1RQTFVHCiAKIC8qKgogICogc3RvcmVfbmV3X2lkCkBAIC01OCw4ICszMyw3IEBACiBzdGF0aWMgaW5saW5lIHNzaXplX3QKIHN0b3JlX25ld19pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZHluaWQgKmR5bmlkOwotCXN0cnVjdCBidXNfdHlwZSAqIGJ1czsKKwlzdHJ1Y3QgcGNpX2R5bmlkICpkeW5pZDsKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqcGRydiA9IHRvX3BjaV9kcml2ZXIoZHJpdmVyKTsKIAlfX3UzMiB2ZW5kb3I9UENJX0FOWV9JRCwgZGV2aWNlPVBDSV9BTllfSUQsIHN1YnZlbmRvcj1QQ0lfQU5ZX0lELAogCQlzdWJkZXZpY2U9UENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOwpAQCAtOTEsMzcgKzY1LDIyIEBACiAJbGlzdF9hZGRfdGFpbCgmcGRydi0+ZHluaWRzLmxpc3QsICZkeW5pZC0+bm9kZSk7CiAJc3Bpbl91bmxvY2soJnBkcnYtPmR5bmlkcy5sb2NrKTsKIAotCWJ1cyA9IGdldF9idXMocGRydi0+ZHJpdmVyLmJ1cyk7Ci0JaWYgKGJ1cykgewotCQlpZiAoZ2V0X2RyaXZlcigmcGRydi0+ZHJpdmVyKSkgewotCQkJZG93bl93cml0ZSgmYnVzLT5zdWJzeXMucndzZW0pOwotCQkJZHJpdmVyX2F0dGFjaCgmcGRydi0+ZHJpdmVyKTsKLQkJCXVwX3dyaXRlKCZidXMtPnN1YnN5cy5yd3NlbSk7Ci0JCQlwdXRfZHJpdmVyKCZwZHJ2LT5kcml2ZXIpOwotCQl9Ci0JCXB1dF9idXMoYnVzKTsKKwlpZiAoZ2V0X2RyaXZlcigmcGRydi0+ZHJpdmVyKSkgeworCQlkcml2ZXJfYXR0YWNoKCZwZHJ2LT5kcml2ZXIpOworCQlwdXRfZHJpdmVyKCZwZHJ2LT5kcml2ZXIpOwogCX0KIAogCXJldHVybiBjb3VudDsKIH0KLQogc3RhdGljIERSSVZFUl9BVFRSKG5ld19pZCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfbmV3X2lkKTsKLXN0YXRpYyBpbmxpbmUgdm9pZAotcGNpX2luaXRfZHluaWRzKHN0cnVjdCBwY2lfZHluaWRzICpkeW5pZHMpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmR5bmlkcy0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmR5bmlkcy0+bGlzdCk7Ci19CiAKIHN0YXRpYyB2b2lkCiBwY2lfZnJlZV9keW5pZHMoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBkeW5pZCAqZHluaWQ7CisJc3RydWN0IHBjaV9keW5pZCAqZHluaWQsICpuOwogCiAJc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZHJ2LT5keW5pZHMubGlzdCkgewotCQlkeW5pZCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZHluaWQsIG5vZGUpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkeW5pZCwgbiwgJmRydi0+ZHluaWRzLmxpc3QsIG5vZGUpIHsKIAkJbGlzdF9kZWwoJmR5bmlkLT5ub2RlKTsKIAkJa2ZyZWUoZHluaWQpOwogCX0KQEAgLTEzOCw4MyArOTcsNzAgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQKLXBjaV9idXNfbWF0Y2hfZHluaWRzKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0Jc3RydWN0IGR5bmlkICpkeW5pZDsKLQotCXNwaW5fbG9jaygmcGNpX2Rydi0+ZHluaWRzLmxvY2spOwotCWxpc3RfZm9yX2VhY2gocG9zLCAmcGNpX2Rydi0+ZHluaWRzLmxpc3QpIHsKLQkJZHluaWQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGR5bmlkLCBub2RlKTsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKCZkeW5pZC0+aWQsIHBjaV9kZXYpKSB7Ci0JCQlzcGluX3VubG9jaygmcGNpX2Rydi0+ZHluaWRzLmxvY2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJnBjaV9kcnYtPmR5bmlkcy5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQogI2Vsc2UgLyogIUNPTkZJR19IT1RQTFVHICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfZGV2aWNlX3Byb2JlX2R5bmFtaWMoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2luaXRfZHluaWRzKHN0cnVjdCBwY2lfZHluaWRzICpkeW5pZHMpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2ZyZWVfZHluaWRzKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpIHt9CiBzdGF0aWMgaW5saW5lIGludCBwY2lfY3JlYXRlX25ld2lkX2ZpbGUoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9idXNfbWF0Y2hfZHluaWRzKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydikKLXsKLQlyZXR1cm4gMDsKLX0KICNlbmRpZgogCiAvKioKLSAqIHBjaV9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGEgUENJIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZQorICogcGNpX21hdGNoX2lkIC0gU2VlIGlmIGEgcGNpIGRldmljZSBtYXRjaGVzIGEgZ2l2ZW4gcGNpX2lkIHRhYmxlCiAgKiBAaWRzOiBhcnJheSBvZiBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAotICogCisgKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdC4KKyAqCiAgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYSBQQ0kgZGV2aWNlIHByZXNlbnQgaW4gdGhlCi0gKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuUmV0dXJucyB0aGUgbWF0Y2hpbmcKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gIFJldHVybnMgdGhlIG1hdGNoaW5nCiAgKiBwY2lfZGV2aWNlX2lkIHN0cnVjdHVyZSBvciAlTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KKyAqCisgKiBEZXByZWNpYXRlZCwgZG9uJ3QgdXNlIHRoaXMgYXMgaXQgd2lsbCBub3QgY2F0Y2ggYW55IGR5bmFtaWMgaWRzCisgKiB0aGF0IGEgZHJpdmVyIG1pZ2h0IHdhbnQgdG8gY2hlY2sgZm9yLgogICovCi1jb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqCi1wY2lfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYpCitjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX21hdGNoX2lkKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsCisJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXdoaWxlIChpZHMtPnZlbmRvciB8fCBpZHMtPnN1YnZlbmRvciB8fCBpZHMtPmNsYXNzX21hc2spIHsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKGlkcywgZGV2KSkKLQkJCXJldHVybiBpZHM7Ci0JCWlkcysrOworCWlmIChpZHMpIHsKKwkJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgeworCQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKGlkcywgZGV2KSkKKwkJCQlyZXR1cm4gaWRzOworCQkJaWRzKys7CisJCX0KIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgotICogcGNpX2RldmljZV9wcm9iZV9zdGF0aWMoKQotICogCi0gKiByZXR1cm5zIDAgYW5kIHNldHMgcGNpX2Rldi0+ZHJpdmVyIHdoZW4gZHJ2IGNsYWltcyBwY2lfZGV2LCBlbHNlIGVycm9yLgorICogcGNpX21hdGNoX2RldmljZSAtIFRlbGwgaWYgYSBQQ0kgZGV2aWNlIHN0cnVjdHVyZSBoYXMgYSBtYXRjaGluZworICogICAgICAgICAgICAgICAgICAgIFBDSSBkZXZpY2UgaWQgc3RydWN0dXJlCisgKiBAaWRzOiBhcnJheSBvZiBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCisgKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICogQGRydjogdGhlIFBDSSBkcml2ZXIgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhIFBDSSBkZXZpY2UgcHJlc2VudCBpbiB0aGUKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gIFJldHVybnMgdGhlIG1hdGNoaW5nCisgKiBwY2lfZGV2aWNlX2lkIHN0cnVjdHVyZSBvciAlTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KICAqLwotc3RhdGljIGludAotcGNpX2RldmljZV9wcm9iZV9zdGF0aWMoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17CQkgICAKLQlpbnQgZXJyb3IgPSAtRU5PREVWOworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9kZXZpY2Uoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwKKwkJCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorewogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgcGNpX2R5bmlkICpkeW5pZDsKIAotCWlmICghZHJ2LT5pZF90YWJsZSkKLQkJcmV0dXJuIGVycm9yOwotCWlkID0gcGNpX21hdGNoX2RldmljZShkcnYtPmlkX3RhYmxlLCBwY2lfZGV2KTsKKwlpZCA9IHBjaV9tYXRjaF9pZChkcnYtPmlkX3RhYmxlLCBkZXYpOwogCWlmIChpZCkKLQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKLQlpZiAoZXJyb3IgPj0gMCkgewotCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7Ci0JCWVycm9yID0gMDsKKwkJcmV0dXJuIGlkOworCisJLyogc3RhdGljIGlkcyBkaWRuJ3QgbWF0Y2gsIGxldHMgbG9vayBhdCB0aGUgZHluYW1pYyBvbmVzICovCisJc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGR5bmlkLCAmZHJ2LT5keW5pZHMubGlzdCwgbm9kZSkgeworCQlpZiAocGNpX21hdGNoX29uZV9kZXZpY2UoJmR5bmlkLT5pZCwgZGV2KSkgeworCQkJc3Bpbl91bmxvY2soJmRydi0+ZHluaWRzLmxvY2spOworCQkJcmV0dXJuICZkeW5pZC0+aWQ7CisJCX0KIAl9Ci0JcmV0dXJuIGVycm9yOworCXNwaW5fdW5sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCkBAIC0yMjUsMTMgKzE3MSwyMCBAQAogICovCiBzdGF0aWMgaW50CiBfX3BjaV9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17CQkgICAKK3sKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICghcGNpX2Rldi0+ZHJpdmVyICYmIGRydi0+cHJvYmUpIHsKLQkJZXJyb3IgPSBwY2lfZGV2aWNlX3Byb2JlX3N0YXRpYyhkcnYsIHBjaV9kZXYpOwotCQlpZiAoZXJyb3IgPT0gLUVOT0RFVikKLQkJCWVycm9yID0gcGNpX2RldmljZV9wcm9iZV9keW5hbWljKGRydiwgcGNpX2Rldik7CisJCWVycm9yID0gLUVOT0RFVjsKKworCQlpZCA9IHBjaV9tYXRjaF9kZXZpY2UoZHJ2LCBwY2lfZGV2KTsKKwkJaWYgKGlkKQorCQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKKwkJaWYgKGVycm9yID49IDApIHsKKwkJCXBjaV9kZXYtPmRyaXZlciA9IGRydjsKKwkJCWVycm9yID0gMDsKKwkJfQogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zNzEsMTIgKzMyNCw2IEBACiAJLnN5c2ZzX29wcyA9ICZwY2lfZHJpdmVyX3N5c2ZzX29wcywKIH07CiAKLXN0YXRpYyBpbnQKLXBjaV9wb3B1bGF0ZV9kcml2ZXJfZGlyKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIHBjaV9jcmVhdGVfbmV3aWRfZmlsZShkcnYpOwotfQotCiAvKioKICAqIHBjaV9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIG5ldyBwY2kgZHJpdmVyCiAgKiBAZHJ2OiB0aGUgZHJpdmVyIHN0cnVjdHVyZSB0byByZWdpc3RlcgpAQCAtNDAxLDEzICszNDgsMTUgQEAKIAkJZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSBwY2lfZGV2aWNlX3NodXRkb3duOwogCWRydi0+ZHJpdmVyLm93bmVyID0gZHJ2LT5vd25lcjsKIAlkcnYtPmRyaXZlci5rb2JqLmt0eXBlID0gJnBjaV9kcml2ZXJfa29ial90eXBlOwotCXBjaV9pbml0X2R5bmlkcygmZHJ2LT5keW5pZHMpOworCisJc3Bpbl9sb2NrX2luaXQoJmRydi0+ZHluaWRzLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkcnYtPmR5bmlkcy5saXN0KTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKIAlpZiAoIWVycm9yKQotCQlwY2lfcG9wdWxhdGVfZHJpdmVyX2RpcihkcnYpOworCQllcnJvciA9IHBjaV9jcmVhdGVfbmV3aWRfZmlsZShkcnYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDYzLDIxICs0MTIsMTcgQEAKICAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy5SZXR1cm5zIHRoZSBtYXRjaGluZwogICogcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUgb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCiAgKi8KLXN0YXRpYyBpbnQgcGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikgCitzdGF0aWMgaW50IHBjaV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewotCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqIHBjaV9kcnYgPSB0b19wY2lfZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKiBpZHMgPSBwY2lfZHJ2LT5pZF90YWJsZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydiA9IHRvX3BjaV9kcml2ZXIoZHJ2KTsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZm91bmRfaWQ7CiAKLQlpZiAoIWlkcykKLQkJcmV0dXJuIDA7Ci0KLQlmb3VuZF9pZCA9IHBjaV9tYXRjaF9kZXZpY2UoaWRzLCBwY2lfZGV2KTsKKwlmb3VuZF9pZCA9IHBjaV9tYXRjaF9kZXZpY2UocGNpX2RydiwgcGNpX2Rldik7CiAJaWYgKGZvdW5kX2lkKQogCQlyZXR1cm4gMTsKIAotCXJldHVybiBwY2lfYnVzX21hdGNoX2R5bmlkcyhwY2lfZGV2LCBwY2lfZHJ2KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01MzYsNiArNDgxLDcgQEAKIAogcG9zdGNvcmVfaW5pdGNhbGwocGNpX2RyaXZlcl9pbml0KTsKIAorRVhQT1JUX1NZTUJPTChwY2lfbWF0Y2hfaWQpOwogRVhQT1JUX1NZTUJPTChwY2lfbWF0Y2hfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlZ2lzdGVyX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MKHBjaV91bnJlZ2lzdGVyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGExNWY5NDAuLmNjOWQ2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC02MCwxNSArNjAsMTggQEAKIAljaGFyICogc3RyID0gYnVmOwogCWludCBpOwogCWludCBtYXggPSA3OworCXU2NCBzdGFydCwgZW5kOwogCiAJaWYgKHBjaV9kZXYtPnN1Ym9yZGluYXRlKQogCQltYXggPSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJc3RyICs9IHNwcmludGYoc3RyLCIweCUwMTZseCAweCUwMTZseCAweCUwMTZseFxuIiwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldixpKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfZW5kKHBjaV9kZXYsaSksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2ZsYWdzKHBjaV9kZXYsaSkpOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICAmcGNpX2Rldi0+cmVzb3VyY2VbaV07CisJCXBjaV9yZXNvdXJjZV90b191c2VyKHBjaV9kZXYsIGksIHJlcywgJnN0YXJ0LCAmZW5kKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCIweCUwMTZsbHggMHglMDE2bGx4IDB4JTAxNmxseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5mbGFncyk7CiAJfQogCXJldHVybiAoc3RyIC0gYnVmKTsKIH0KQEAgLTMxMyw4ICszMTYsMjEgQEAKIAkJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAoc3RydWN0IHJlc291cmNlICopYXR0ci0+cHJpdmF0ZTsKIAllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfdHlwZTsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgaTsKIAotCXZtYS0+dm1fcGdvZmYgKz0gcmVzLT5zdGFydCA+PiBQQUdFX1NISUZUOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfUk9NX1JFU09VUkNFOyBpKyspCisJCWlmIChyZXMgPT0gJnBkZXYtPnJlc291cmNlW2ldKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gUENJX1JPTV9SRVNPVVJDRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBwY2lfbW1hcF9wYWdlX3JhbmdlKCkgZXhwZWN0cyB0aGUgc2FtZSBraW5kIG9mIGVudHJ5IGFzIGNvbWluZworCSAqIGZyb20gL3Byb2MvYnVzL3BjaS8gd2hpY2ggaXMgYSAidXNlciB2aXNpYmxlIiB2YWx1ZS4gSWYgdGhpcyBpcworCSAqIGRpZmZlcmVudCBmcm9tIHRoZSByZXNvdXJjZSBpdHNlbGYsIGFyY2ggd2lsbCBkbyBuZWNlc3NhcnkgZml4dXAuCisJICovCisJcGNpX3Jlc291cmNlX3RvX3VzZXIocGRldiwgaSwgcmVzLCAmc3RhcnQsICZlbmQpOworCXZtYS0+dm1fcGdvZmYgKz0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAltbWFwX3R5cGUgPSByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0gPyBwY2lfbW1hcF9tZW0gOiBwY2lfbW1hcF9pbzsKIAogCXJldHVybiBwY2lfbW1hcF9wYWdlX3JhbmdlKHBkZXYsIHZtYSwgbW1hcF90eXBlLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggZjA0YjlmZi4uMWIzNGZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogICogLUVJTyBpZiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBQQ0kgUE0uCiAgKiAwIGlmIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRoZSBwb3dlciBzdGF0ZS4KICAqLwotCitpbnQgKCpwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCB0KTsKIGludAogcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKQEAgLTI5OSwxMSArMjk5LDIwIEBACiAJCW1zbGVlcCgxMCk7CiAJZWxzZSBpZiAoc3RhdGUgPT0gUENJX0QyIHx8IGRldi0+Y3VycmVudF9zdGF0ZSA9PSBQQ0lfRDIpCiAJCXVkZWxheSgyMDApOwotCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOwogCisJLyoKKwkgKiBHaXZlIGZpcm13YXJlIGEgY2hhbmNlIHRvIGJlIGNhbGxlZCwgc3VjaCBhcyBBQ1BJIF9QUngsIF9QU3gKKwkgKiBGaXJtd2FyZSBtZXRob2QgYWZ0ZXIgbmF0aWNlIG1ldGhvZCA/CisJICovCisJaWYgKHBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUpCisJCXBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBzdGF0ZSk7CisKKwlkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKIAlyZXR1cm4gMDsKIH0KIAoraW50ICgqcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKyAKIC8qKgogICogcGNpX2Nob29zZV9zdGF0ZSAtIENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZApAQCAtMzE2LDEwICszMjUsMTcgQEAKIAogcGNpX3Bvd2VyX3QgcGNpX2Nob29zZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CisJaW50IHJldDsKKwogCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUE0pKQogCQlyZXR1cm4gUENJX0QwOwogCi0Jc3dpdGNoIChzdGF0ZSkgeworCWlmIChwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKSB7CisJCXJldCA9IHBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUoZGV2LCBzdGF0ZSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXN0YXRlID0gcmV0OworCX0KKyAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgMDogcmV0dXJuIFBDSV9EMDsKIAljYXNlIDM6IHJldHVybiBQQ0lfRDNob3Q7CiAJZGVmYXVsdDoKQEAgLTMzNCwxMCArMzUwLDYgQEAKIC8qKgogICogcGNpX3NhdmVfc3RhdGUgLSBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZwogICogQGRldjogLSBQQ0kgZGV2aWNlIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoCi0gKiBAYnVmZmVyOiAtIGJ1ZmZlciB0byBob2xkIGNvbmZpZyBzcGFjZSBjb250ZXh0Ci0gKgotICogQGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgUENJIDIuMiBjb25maWcgc3BhY2UgCi0gKiAoPj0gNjQgYnl0ZXMpLgogICovCiBpbnQKIHBjaV9zYXZlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0zNTIsOCArMzY0LDYgQEAKIC8qKiAKICAqIHBjaV9yZXN0b3JlX3N0YXRlIC0gUmVzdG9yZSB0aGUgc2F2ZWQgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKLSAqIEBidWZmZXI6IC0gc2F2ZWQgUENJIGNvbmZpZyBzcGFjZQotICoKICAqLwogaW50IAogcGNpX3Jlc3RvcmVfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggNzQ0ZGEwZC4uZDk0ZDdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTExLDYgKzExLDEwIEBACiAJCQkJICB2b2lkICgqYWxpZ25mKSh2b2lkICosIHN0cnVjdCByZXNvdXJjZSAqLAogCQkJCQkgIAkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyksCiAJCQkJICB2b2lkICphbGlnbmZfZGF0YSk7CisvKiBGaXJtd2FyZSBjYWxsYmFja3MgKi8KK2V4dGVybiBpbnQgKCpwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworZXh0ZXJuIGludCAoKnBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKTsKKwogLyogUENJIC9wcm9jIGZ1bmN0aW9ucyAqLwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gaW50IHBjaV9wcm9jX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnYuaCBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCmluZGV4IDUzN2IzNzIuLmE2M2JkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCkBAIC0yNyw2ICsyNywxMSBAQAogCiAjZGVmaW5lIGdldF9kZXNjcmlwdG9yX2lkKHR5cGUsIHNlcnZpY2UpICgoKHR5cGUgLSA0KSA8PCA0KSB8IHNlcnZpY2UpCiAKK3N0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCB7CisJaW50IGludGVycnVwdF9tb2RlOwkvKiBbMDpJTlR4IHwgMTpNU0kgfCAyOk1TSS1YXSAqLworCXVuc2lnbmVkIGludCBzYXZlZF9tc2lfY29uZmlnX3NwYWNlWzVdOworfTsKKwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwY2llX3BvcnRfYnVzX3R5cGU7CiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwppbmRleCBmNWM1ZjEwLi4zOTNlMGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTI3NSwxMCArMjc1LDE3IEBACiAKIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dDsKIAlpbnQgc3RhdHVzLCB0eXBlLCBjYXBhYmlsaXRpZXMsIGlycV9tb2RlLCBpOwogCWludCB2ZWN0b3JzW1BDSUVfUE9SVF9ERVZJQ0VfTUFYU0VSVklDRVNdOwogCXUxNiByZWcxNjsKIAorCS8qIEFsbG9jYXRlIHBvcnQgZGV2aWNlIGV4dGVuc2lvbiAqLworCWlmICghKHBfZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBfZXh0KTsKKwogCS8qIEdldCBwb3J0IHR5cGUgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsCiAJCXBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkgKwpAQCAtMjg4LDYgKzI5NSw3IEBACiAJLyogTm93IGdldCBwb3J0IHNlcnZpY2VzICovCiAJY2FwYWJpbGl0aWVzID0gZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkoZGV2KTsKIAlpcnFfbW9kZSA9IGFzc2lnbl9pbnRlcnJ1cHRfbW9kZShkZXYsIHZlY3RvcnMsIGNhcGFiaWxpdGllcyk7CisJcF9leHQtPmludGVycnVwdF9tb2RlID0gaXJxX21vZGU7CiAKIAkvKiBBbGxvY2F0ZSBjaGlsZCBzZXJ2aWNlcyBpZiBhbnkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUzsgaSsrKSB7CkBAIC0zMTcsNyArMzI1LDcgQEAKIHN0YXRpYyBpbnQgc3VzcGVuZF9pdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpzZXJ2aWNlX2RyaXZlcjsKLQl1MzIgc3RhdGUgPSAodTMyKWRhdGE7CisJcG1fbWVzc2FnZV90IHN0YXRlID0gKiAocG1fbWVzc2FnZV90ICopIGRhdGE7CiAKICAJaWYgKChkZXYtPmJ1cyA9PSAmcGNpZV9wb3J0X2J1c190eXBlKSAmJgogIAkgICAgKGRldi0+ZHJpdmVyKSkgewpAQCAtMzI4LDkgKzMzNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoraW50IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgKHZvaWQgKilzdGF0ZSwgc3VzcGVuZF9pdGVyKTsKKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdGUsIHN1c3BlbmRfaXRlcik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCBlOTA5NWVlLi4zMGJhYzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC0yOSw2ICsyOSw3OCBAQAogLyogZ2xvYmFsIGRhdGEgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZV9uYW1lW10gPSAicGNpZXBvcnQtZHJpdmVyIjsKIAorc3RhdGljIHZvaWQgcGNpX3NhdmVfbXNpX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpID0gMCwgcG9zOworCXUxNiBjb250cm9sOworCisgICAJaWYgKChwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpKSA8PSAwKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MsICZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwljb250cm9sID0gcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbMF0gPj4gMTY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9BRERSRVNTX0xPLAorCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTXzY0QklUKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfQUREUkVTU19ISSwKKwkJCSZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9EQVRBXzY0LAorCQkJJnBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCX0gZWxzZQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0RBVEFfMzIsCisJCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQpCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfTUFTS19CSVQsCisJCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9yZXN0b3JlX21zaV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCAqcF9leHQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaSA9IDAsIHBvczsKKwl1MTYgY29udHJvbDsKKworICAgCWlmICgocG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfTVNJKSkgPD0gMCkKKwkJcmV0dXJuOworCisJY29udHJvbCA9IHBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10gPj4gMTY7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX01TSV9GTEFHUywgY29udHJvbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfQUREUkVTU19MTywKKwkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTXzY0QklUKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0FERFJFU1NfSEksCisJCQlwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfREFUQV82NCwKKwkJCXBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCX0gZWxzZQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9EQVRBXzMyLAorCQkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQpCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX01BU0tfQklULAorCQkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9zYXZlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCAqcF9leHQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKGRldik7CisJaWYgKHBfZXh0LT5pbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTVNJX01PREUpCisJCXBjaV9zYXZlX21zaV9zdGF0ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCWlmIChwX2V4dC0+aW50ZXJydXB0X21vZGUgPT0gUENJRV9QT1JUX01TSV9NT0RFKQorCQlwY2lfcmVzdG9yZV9tc2lfc3RhdGUoZGV2KTsKKwlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCXBjaV9zZXRfbWFzdGVyKGRldik7Cit9CisKIC8qCiAgKiBwY2llX3BvcnRkcnZfcHJvYmUgLSBQcm9iZSBQQ0ktRXhwcmVzcyBwb3J0IGRldmljZXMKICAqIEBkZXY6IFBDSS1FeHByZXNzIHBvcnQgZGV2aWNlIGJlaW5nIHByb2JlZApAQCAtNjQsMTYgKzEzNiwyMSBAQAogc3RhdGljIHZvaWQgcGNpZV9wb3J0ZHJ2X3JlbW92ZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShkZXYpOworCWtmcmVlKHBjaV9nZXRfZHJ2ZGF0YShkZXYpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CisJaW50IHJldCA9IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKKworCXBjaWVfcG9ydGRydl9zYXZlX2NvbmZpZyhkZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwlwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoZGV2KTsKIAlyZXR1cm4gcGNpZV9wb3J0X2RldmljZV9yZXN1bWUoZGV2KTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggZmQ0OGIyMC4uZGYzYmRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yMzksOSArMjM5LDggQEAKIAogCWlmIChkZXYtPnRyYW5zcGFyZW50KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVHJhbnNwYXJlbnQgYnJpZGdlIC0gJXNcbiIsIHBjaV9uYW1lKGRldikpOwotCQlmb3IoaSA9IDA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykKLQkJCWNoaWxkLT5yZXNvdXJjZVtpXSA9IGNoaWxkLT5wYXJlbnQtPnJlc291cmNlW2ldOwotCQlyZXR1cm47CisJCWZvcihpID0gMzsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKQorCQkJY2hpbGQtPnJlc291cmNlW2ldID0gY2hpbGQtPnBhcmVudC0+cmVzb3VyY2VbaSAtIDNdOwogCX0KIAogCWZvcihpPTA7IGk8MzsgaSsrKQpAQCAtMzc0LDggKzM3MywxMSBAQAogCXN0cnVjdCBwY2lfYnVzICpjaGlsZDsKIAogCWNoaWxkID0gcGNpX2FsbG9jX2NoaWxkX2J1cyhwYXJlbnQsIGRldiwgYnVzbnIpOwotCWlmIChjaGlsZCkKKwlpZiAoY2hpbGQpIHsKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOwogCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bm9kZSwgJnBhcmVudC0+Y2hpbGRyZW4pOworCQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl9CiAJcmV0dXJuIGNoaWxkOwogfQogCkBAIC0zOTUsNiArMzk3LDE2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcnBjYXAgKyBQQ0lfRVhQX1JUQ1RMLCBycGN0bCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKHN0cnVjdCBwY2lfYnVzICpjaGlsZCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gY2hpbGQtPnBhcmVudDsKKwl3aGlsZSAocGFyZW50LT5wYXJlbnQgJiYgcGFyZW50LT5zdWJvcmRpbmF0ZSA8IG1heCkgeworCQlwYXJlbnQtPnN1Ym9yZGluYXRlID0gbWF4OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOworCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwl9Cit9CisKIHVuc2lnbmVkIGludCBfX2RldmluaXQgcGNpX3NjYW5fY2hpbGRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKgpAQCAtNDExLDcgKzQyMyw3IEBACiB7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCWludCBpc19jYXJkYnVzID0gKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpOwotCXUzMiBidXNlczsKKwl1MzIgYnVzZXMsIGk7CiAJdTE2IGJjdGw7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUFJJTUFSWV9CVVMsICZidXNlcyk7CkBAIC00NDcsNyArNDU5LDcgQEAKIAkJCXJldHVybiBtYXg7CiAJCX0KIAotCQljaGlsZCA9IHBjaV9hbGxvY19jaGlsZF9idXMoYnVzLCBkZXYsIGJ1c25yKTsKKwkJY2hpbGQgPSBwY2lfYWRkX25ld19idXMoYnVzLCBkZXYsIGJ1c25yKTsKIAkJaWYgKCFjaGlsZCkKIAkJCXJldHVybiBtYXg7CiAJCWNoaWxkLT5wcmltYXJ5ID0gYnVzZXMgJiAweEZGOwpAQCAtNDcwLDcgKzQ4MiwxMSBAQAogCQkvKiBDbGVhciBlcnJvcnMgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX1NUQVRVUywgMHhmZmZmKTsKIAotCQljaGlsZCA9IHBjaV9hbGxvY19jaGlsZF9idXMoYnVzLCBkZXYsICsrbWF4KTsKKwkJLyogUHJldmVudCBhc3NpZ25pbmcgYSBidXMgbnVtYmVyIHRoYXQgYWxyZWFkeSBleGlzdHMuCisJCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgYnJpZGdlIGlzIGhvdC1wbHVnZ2VkICovCisJCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSkpCisJCQlyZXR1cm4gbWF4OworCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhidXMsIGRldiwgKyttYXgpOwogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5wcmltYXJ5KSAgICAgPDwgIDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5zZWNvbmRhcnkpICAgPDwgIDgpCkBAIC00OTIsNyArNTA4LDEzIEBACiAKIAkJaWYgKCFpc19jYXJkYnVzKSB7CiAJCQljaGlsZC0+YnJpZGdlX2N0bCA9IFBDSV9CUklER0VfQ1RMX05PX0lTQTsKLQorCQkJLyoKKwkJCSAqIEFkanVzdCBzdWJvcmRpbmF0ZSBidXNuciBpbiBwYXJlbnQgYnVzZXMuCisJCQkgKiBXZSBkbyB0aGlzIGJlZm9yZSBzY2FubmluZyBmb3IgY2hpbGRyZW4gYmVjYXVzZQorCQkJICogc29tZSBkZXZpY2VzIG1heSBub3QgYmUgZGV0ZWN0ZWQgaWYgdGhlIGJpb3MKKwkJCSAqIHdhcyBsYXp5LgorCQkJICovCisJCQlwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKGNoaWxkLCBtYXgpOwogCQkJLyogTm93IHdlIGNhbiBzY2FuIGFsbCBzdWJvcmRpbmF0ZSBidXNlcy4uLiAqLwogCQkJbWF4ID0gcGNpX3NjYW5fY2hpbGRfYnVzKGNoaWxkKTsKIAkJfSBlbHNlIHsKQEAgLTUwMSw3ICs1MjMsMTIgQEAKIAkJCSAqIGFzIGNhcmRzIHdpdGggYSBQQ0ktdG8tUENJIGJyaWRnZSBjYW4gYmUKIAkJCSAqIGluc2VydGVkIGxhdGVyLgogCQkJICovCi0JCQltYXggKz0gQ0FSREJVU19SRVNFUlZFX0JVU05SOworCQkJZm9yIChpPTA7IGk8Q0FSREJVU19SRVNFUlZFX0JVU05SOyBpKyspCisJCQkJaWYgKHBjaV9maW5kX2J1cyhwY2lfZG9tYWluX25yKGJ1cyksCisJCQkJCQkJbWF4K2krMSkpCisJCQkJCWJyZWFrOworCQkJbWF4ICs9IGk7CisJCQlwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKGNoaWxkLCBtYXgpOwogCQl9CiAJCS8qCiAJCSAqIFNldCB0aGUgc3Vib3JkaW5hdGUgYnVzIG51bWJlciB0byBpdHMgcmVhbCB2YWx1ZS4KQEAgLTc1Nyw3ICs3ODQsOSBAQAogCSAqIGFuZCB0aGUgYnVzIGxpc3QgZm9yIGZpeHVwIGZ1bmN0aW9ucywgZXRjLgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmdsb2JhbF9saXN0KTsKKwlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5idXNfbGlzdCwgJmJ1cy0+ZGV2aWNlcyk7CisJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CiAKIAlyZXR1cm4gZGV2OwogfQpAQCAtODc4LDcgKzkwNyw5IEBACiAJCXByX2RlYnVnKCJQQ0k6IEJ1cyAlMDR4OiUwMnggYWxyZWFkeSBrbm93blxuIiwgcGNpX2RvbWFpbl9ucihiKSwgYnVzKTsKIAkJZ290byBlcnJfb3V0OwogCX0KKwlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYi0+bm9kZSwgJnBjaV9yb290X2J1c2VzKTsKKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKIAogCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CiAJZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CkBAIC05MTEsOCArOTQyLDYgQEAKIAogCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOwogCi0JcGNpX2J1c19hZGRfZGV2aWNlcyhiKTsKLQogCXJldHVybiBiOwogCiBzeXNfY3JlYXRlX2xpbmtfZXJyOgpAQCAtOTIyLDcgKzk1MSw5IEBACiBjbGFzc19kZXZfcmVnX2VycjoKIAlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogZGV2X3JlZ19lcnI6CisJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOwogCWxpc3RfZGVsKCZiLT5ub2RlKTsKKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKIGVycl9vdXQ6CiAJa2ZyZWUoZGV2KTsKIAlrZnJlZShiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2MuYyBiL2RyaXZlcnMvcGNpL3Byb2MuYwppbmRleCBlNjhiYmZiLi43OTg4ZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9jLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYy5jCkBAIC0zNTUsMTQgKzM1NSwyMCBAQAogCQkJZGV2LT5kZXZpY2UsCiAJCQlkZXYtPmlycSk7CiAJLyogSGVyZSBzaG91bGQgYmUgNyBhbmQgbm90IFBDSV9OVU1fUkVTT1VSQ0VTIGFzIHdlIG5lZWQgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSAqLwotCWZvcihpPTA7IGk8NzsgaSsrKQorCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQl1NjQgc3RhcnQsIGVuZDsKKwkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCBMT05HX0ZPUk1BVCwKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgfAorCQkJKCh1bnNpZ25lZCBsb25nKXN0YXJ0KSB8CiAJCQkoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIFBDSV9SRUdJT05fRkxBR19NQVNLKSk7Ci0JZm9yKGk9MDsgaTw3OyBpKyspCisJfQorCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQl1NjQgc3RhcnQsIGVuZDsKKwkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCBMT05HX0ZPUk1BVCwKIAkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPCBkZXYtPnJlc291cmNlW2ldLmVuZCA/Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxIDogMCk7CisJCQkodW5zaWduZWQgbG9uZykoZW5kIC0gc3RhcnQpICsgMSA6IDApOworCX0KIAlzZXFfcHV0YyhtLCAnXHQnKTsKIAlpZiAoZHJ2KQogCQlzZXFfcHJpbnRmKG0sICIlcyIsIGRydi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDk2ODAzM2YuLjE1MjFmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC03NjcsNiArNzY3LDcgQEAKIAlpZiAodW5saWtlbHkoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVNVU1RFSykpIHsKIAkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIpCiAJCQlzd2l0Y2goZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQljYXNlIDB4ODAyNTogLyogUDRCLUxYICovCiAJCQljYXNlIDB4ODA3MDogLyogUDRCICovCiAJCQljYXNlIDB4ODA4ODogLyogUDRCNTMzICovCiAJCQljYXNlIDB4MTYyNjogLyogTDNDIG5vdGVib29rICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yZW1vdmUuYyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCmluZGV4IDk2ZjA3N2YuLjI3YTI5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisrKyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC0xOCwxNyArMTgsMjEgQEAKIAogc3RhdGljIHZvaWQgcGNpX2Rlc3Ryb3lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JcGNpX3Byb2NfZGV0YWNoX2RldmljZShkZXYpOwotCXBjaV9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKGRldik7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Z2xvYmFsX2xpc3QpKSB7CisJCXBjaV9wcm9jX2RldGFjaF9kZXZpY2UoZGV2KTsKKwkJcGNpX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQlsaXN0X2RlbCgmZGV2LT5nbG9iYWxfbGlzdCk7CisJCWRldi0+Z2xvYmFsX2xpc3QubmV4dCA9IGRldi0+Z2xvYmFsX2xpc3QucHJldiA9IE5VTEw7CisJCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCX0KIAogCS8qIFJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIGRldmljZSBsaXN0cywgYW5kIHByZXZlbnQgYW55IGZ1cnRoZXIKIAkgKiBsaXN0IGFjY2Vzc2VzIGZyb20gdGhpcyBkZXZpY2UgKi8KIAlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOwotCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKIAlkZXYtPmJ1c19saXN0Lm5leHQgPSBkZXYtPmJ1c19saXN0LnByZXYgPSBOVUxMOwotCWRldi0+Z2xvYmFsX2xpc3QubmV4dCA9IGRldi0+Z2xvYmFsX2xpc3QucHJldiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CiAKIAlwY2lfZnJlZV9yZXNvdXJjZXMoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggYTkwYTUzMy4uMDVmYTkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTM3OSw2ICszNzksNyBAQAogRVhQT1JUX1NZTUJPTChwY2lfZGV2X3ByZXNlbnQpOwogCiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2J1cyk7CitFWFBPUlRfU1lNQk9MKHBjaV9maW5kX25leHRfYnVzKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfZGV2aWNlX3JldmVyc2UpOwogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9zbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggMWJhODRiZS4uOWZlNDhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTcyLDcgKzcyLDExIEBACiAJZm9yIChsaXN0ID0gaGVhZC5uZXh0OyBsaXN0OykgewogCQlyZXMgPSBsaXN0LT5yZXM7CiAJCWlkeCA9IHJlcyAtICZsaXN0LT5kZXYtPnJlc291cmNlWzBdOwotCQlwY2lfYXNzaWduX3Jlc291cmNlKGxpc3QtPmRldiwgaWR4KTsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UobGlzdC0+ZGV2LCBpZHgpKSB7CisJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZW5kID0gMDsKKwkJCXJlcy0+ZmxhZ3MgPSAwOworCQl9CiAJCXRtcCA9IGxpc3Q7CiAJCWxpc3QgPSBsaXN0LT5uZXh0OwogCQlrZnJlZSh0bXApOwpAQCAtMjcwLDYgKzI3NCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKIAkJciA9IGJ1cy0+cmVzb3VyY2VbaV07CisJCWlmIChyID09ICZpb3BvcnRfcmVzb3VyY2UgfHwgciA9PSAmaW9tZW1fcmVzb3VyY2UpCisJCQljb250aW51ZTsKIAkJaWYgKHIgJiYgKHItPmZsYWdzICYgdHlwZV9tYXNrKSA9PSB0eXBlICYmICFyLT5wYXJlbnQpCiAJCQlyZXR1cm4gcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCAxNGU0MTI0Li42NDg1Zjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTEsOCArMSw1IEBACiAjCi0jIFBDTUNJQSBidXMgc3Vic3lzdGVtIGNvbmZpZ3VyYXRpb24KLSMKLSMgUmlnaHQgbm93IHRoZSBub24tQ2FyZEJ1cyBjaG9pY2VzIGFyZSBub3Qgc3VwcG9ydGVkCi0jIGJ5IHRoZSBpbnRlZ3JhdGVkIGtlcm5lbCBkcml2ZXIuCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIGJ1cyBzdWJzeXN0ZW0gY29uZmlndXJhdGlvbgogIwogCiBtZW51ICJQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0IgpAQCAtMTQsOCArMTEsOCBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhdHRhY2ggUENNQ0lBLSBvciBQQy1jYXJkcyB0byB5b3VyIExpbnV4CiAJICBjb21wdXRlci4gIFRoZXNlIGFyZSBjcmVkaXQtY2FyZCBzaXplIGRldmljZXMgc3VjaCBhcyBuZXR3b3JrIGNhcmRzLAogCSAgbW9kZW1zIG9yIGhhcmQgZHJpdmVzIG9mdGVuIHVzZWQgd2l0aCBsYXB0b3BzIGNvbXB1dGVycy4gIFRoZXJlIGFyZQotCSAgYWN0dWFsbHkgdHdvIHZhcmlldGllcyBvZiB0aGVzZSBjYXJkczogdGhlIG9sZGVyIDE2IGJpdCBQQ01DSUEgY2FyZHMKLQkgIGFuZCB0aGUgbmV3ZXIgMzIgYml0IENhcmRCdXMgY2FyZHMuCisJICBhY3R1YWxseSB0d28gdmFyaWV0aWVzIG9mIHRoZXNlIGNhcmRzOiAxNiBiaXQgUENNQ0lBIGFuZCAzMiBiaXQKKwkgIENhcmRCdXMgY2FyZHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNtY2lhX2NvcmUuCkBAIC0zMiw3ICsyOSw3IEBACiAKIAkgIFRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOgogCSAgICBwY21jaWFfY29yZS5wY19kZWJ1Zz1OCi0JICAgIGRzLnBjX2RlYnVnPU4KKwkgICAgcGNtY2lhLnBjX2RlYnVnPU4KIAkgICAgc2ExMXh4X2NvcmUucGNfZGVidWc9TgogCiAJICBUaGUgbW9kdWxlIG9wdGlvbiBpcyBjYWxsZWQgcGNfZGVidWc9TgpAQCAtNDIsMjIgKzM5LDUwIEBACiAKIGNvbmZpZyBQQ01DSUEKIAl0cmlzdGF0ZSAiMTYtYml0IFBDTUNJQSBzdXBwb3J0IgorCXNlbGVjdCBDUkMzMgogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIDE2LWJpdCBQQ01DSUEgY2FyZHMuIE1vc3Qgb2xkZXIKIAkgICBQQy1jYXJkcyBhcmUgc3VjaCAxNi1iaXQgUENNQ0lBIGNhcmRzLCBzbyB1bmxlc3MgeW91IGtub3cgeW91J3JlCiAJICAgb25seSB1c2luZyAzMi1iaXQgQ2FyZEJ1cyBjYXJkcywgc2F5IFkgb3IgTSBoZXJlLgogCi0JICAgVG8gdXNlIDE2LWJpdCBQQ01DSUEgY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIAotCSAgIERhdmlkIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KLSAJICAgZm9yIGxvY2F0aW9uKS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIFBDTUNJQS1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCSAgIFRvIHVzZSAxNi1iaXQgUENNQ0lBIGNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgaW4KKwkgICBtb3N0IGNhc2VzLiAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4gZm9yCisJICAgbG9jYXRpb24gYW5kIGRldGFpbHMpLgogCiAJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGVzLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNtY2lhLgogCiAJICAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIFBDTUNJQV9MT0FEX0NJUworCWJvb2wgIkxvYWQgQ0lTIHVwZGF0ZXMgZnJvbSB1c2Vyc3BhY2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZXX0xPQURFUgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNvbWUgUENNQ0lBIGNhcmRzIHJlcXVpcmUgYW4gdXBkYXRlZCBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZSAoQ0lTKQorCSAgdG8gYmUgbG9hZGVkIGZyb20gdXNlcnNwYWNlIHRvIHdvcmsgY29ycmVjdGx5LiBJZiB5b3Ugc2F5IFkgaGVyZSwKKwkgIGFuZCB5b3VyIHVzZXJzcGFjZSBpcyBhcnJhbmdlZCBjb3JyZWN0bHksIHRoaXMgd2lsbCBiZSBsb2FkZWQKKwkgIGF1dG9tYXRpY2FsbHkgdXNpbmcgdGhlIGluLWtlcm5lbCBmaXJtd2FyZSBsb2FkZXIgYW5kIHRoZSBob3RwbHVnCisJICBzdWJzeXN0ZW0sIGluc3RlYWQgb2YgcmVseWluZyBvbiBjYXJkbWdyIGZyb20gcGNtY2lhLWNzIHRvIGRvIHNvLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUENNQ0lBX0lPQ1RMCisJYm9vbCAiUENNQ0lBIGNvbnRyb2wgaW9jdGwgKG9ic29sZXRlKSIKKwlkZXBlbmRzIG9uIFBDTUNJQQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgZGVwcmVjYXRlZCBpb2N0bCBpbnRlcmZhY2UgdG8gdGhlIFBDTUNJQQorCSAgc3Vic3lzdGVtIHdpbGwgYmUgYnVpbHQuIEl0IGlzIG5lZWRlZCBieSBjYXJkbWdyIGFuZCBjYXJkY3RsCisJICAocGNtY2lhLWNzKSB0byBmdW5jdGlvbiBwcm9wZXJseS4KKworCSAgWW91IHNob3VsZCB1c2UgdGhlIG5ldyBwY21jaWF1dGlscyBwYWNrYWdlIGluc3RlYWQgKHNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPiBmb3IgbG9jYXRpb24gYW5kIGRldGFpbHMpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgQ0FSREJVUwogCWJvb2wgIjMyLWJpdCBDYXJkQnVzIHN1cHBvcnQiCQogCWRlcGVuZHMgb24gUENJCkBAIC03OCw4ICsxMDMsNyBAQAogY29uZmlnIFlFTlRBCiAJdHJpc3RhdGUgIkNhcmRCdXMgeWVudGEtY29tcGF0aWJsZSBicmlkZ2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQotI2ZpeG1lOiByZW1vdmUgZGVwZW5kZW5kY3kgb24gQ0FSREJVUwotCWRlcGVuZHMgb24gQ0FSREJVUworCXNlbGVjdCBDQVJEQlVTIGlmICFFTUJFRERFRAogCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBDYXJkQnVzIGhvc3QgYnJpZGdlcy4gIFZpcnR1YWxseQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQppbmRleCA1MGMyOTM2Li5lZjY5NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsOCBAQAogcGNtY2lhX2NvcmUtJChDT05GSUdfQ0FSREJVUykJCQkrPSBjYXJkYnVzLm8KIG9iai0kKENPTkZJR19QQ0NBUkQpCQkJCSs9IHBjbWNpYV9jb3JlLm8KIAotcGNtY2lhLXkJCQkJCSs9IGRzLm8gcGNtY2lhX2NvbXBhdC5vCitwY21jaWEteQkJCQkJKz0gZHMubyBwY21jaWFfY29tcGF0Lm8gcGNtY2lhX3Jlc291cmNlLm8KK3BjbWNpYS0kKENPTkZJR19QQ01DSUFfSU9DVEwpCQkJKz0gcGNtY2lhX2lvY3RsLm8KIG9iai0kKENPTkZJR19QQ01DSUEpCQkJCSs9IHBjbWNpYS5vCiAKIG9iai0kKENPTkZJR19QQ0NBUkRfTk9OU1RBVElDKQkJCSs9IHJzcmNfbm9uc3RhdGljLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmggYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCmluZGV4IDQxN2JjMTUuLmQ1MTIyYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX19BU01fQVUxMDAwX1BDTUNJQV9ICiAKIC8qIGluY2x1ZGUgdGhlIHdvcmxkICovCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYwppbmRleCBkZjE5Y2UxLi5kNDE0YTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfcGIxeDAwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF94eHMxNTAwLmMKaW5kZXggMWRmYzc3Ni4uZjExM2I2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfeHhzMTUwMC5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCmluZGV4IDNjY2I1MjQuLjFkNzU1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2Npc3RwbC5jIGIvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKaW5kZXggZTI5YTZkZC4uZGQ3NjUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKQEAgLTg5LDggKzg5LDEwIEBACiBzZXRfY2lzX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGNhcmRfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAgICAgcGNjYXJkX21lbV9tYXAgKm1lbSA9ICZzLT5jaXNfbWVtOworICAgIGludCByZXQ7CisKICAgICBpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSAmJiBtZW0tPnJlcyA9PSBOVUxMKSB7Ci0JbWVtLT5yZXMgPSBmaW5kX21lbV9yZWdpb24oMCwgcy0+bWFwX3NpemUsIHMtPm1hcF9zaXplLCAwLCBzKTsKKwltZW0tPnJlcyA9IHBjbWNpYV9maW5kX21lbV9yZWdpb24oMCwgcy0+bWFwX3NpemUsIHMtPm1hcF9zaXplLCAwLCBzKTsKIAlpZiAobWVtLT5yZXMgPT0gTlVMTCkgewogCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgImNzOiB1bmFibGUgdG8gbWFwIGNhcmQgbWVtb3J5IVxuIik7CiAJICAgIHJldHVybiBOVUxMOwpAQCAtOTksNyArMTAxLDEyIEBACiAgICAgfQogICAgIG1lbS0+Y2FyZF9zdGFydCA9IGNhcmRfb2Zmc2V0OwogICAgIG1lbS0+ZmxhZ3MgPSBmbGFnczsKLSAgICBzLT5vcHMtPnNldF9tZW1fbWFwKHMsIG1lbSk7CisgICAgcmV0ID0gcy0+b3BzLT5zZXRfbWVtX21hcChzLCBtZW0pOworICAgIGlmIChyZXQpIHsKKwlpb3VubWFwKHMtPmNpc192aXJ0KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBpZiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgewogCWlmIChzLT5jaXNfdmlydCkKIAkgICAgaW91bm1hcChzLT5jaXNfdmlydCk7CkBAIC0xMTksMTMgKzEyNiwxMyBAQAogI2RlZmluZSBJU19BVFRSCQkxCiAjZGVmaW5lIElTX0lORElSRUNUCTgKIAotaW50IHJlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsIHVfaW50IGFkZHIsCitpbnQgcGNtY2lhX3JlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsIHVfaW50IGFkZHIsCiAJCSB1X2ludCBsZW4sIHZvaWQgKnB0cikKIHsKICAgICB2b2lkIF9faW9tZW0gKnN5cywgKmVuZDsKICAgICB1bnNpZ25lZCBjaGFyICpidWYgPSBwdHI7CiAgICAgCi0gICAgY3NfZGJnKHMsIDMsICJyZWFkX2Npc19tZW0oJWQsICUjeCwgJXUpXG4iLCBhdHRyLCBhZGRyLCBsZW4pOworICAgIGNzX2RiZyhzLCAzLCAicGNtY2lhX3JlYWRfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CiAKICAgICBpZiAoYXR0ciAmIElTX0lORElSRUNUKSB7CiAJLyogSW5kaXJlY3QgYWNjZXNzZXMgdXNlIGEgYnVuY2ggb2Ygc3BlY2lhbCByZWdpc3RlcnMgYXQgZml4ZWQKQEAgLTE4MiwxNCArMTg5LDE2IEBACiAJICAqKHVfY2hhciAqKShwdHIrMiksICoodV9jaGFyICopKHB0ciszKSk7CiAgICAgcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWFkX2Npc19tZW0pOwogCi12b2lkIHdyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLCB1X2ludCBhZGRyLAorCit2b2lkIHBjbWNpYV93cml0ZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwgdV9pbnQgYWRkciwKIAkJICAgdV9pbnQgbGVuLCB2b2lkICpwdHIpCiB7CiAgICAgdm9pZCBfX2lvbWVtICpzeXMsICplbmQ7CiAgICAgdW5zaWduZWQgY2hhciAqYnVmID0gcHRyOwogICAgIAotICAgIGNzX2RiZyhzLCAzLCAid3JpdGVfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CisgICAgY3NfZGJnKHMsIDMsICJwY21jaWFfd3JpdGVfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CiAKICAgICBpZiAoYXR0ciAmIElTX0lORElSRUNUKSB7CiAJLyogSW5kaXJlY3QgYWNjZXNzZXMgdXNlIGEgYnVuY2ggb2Ygc3BlY2lhbCByZWdpc3RlcnMgYXQgZml4ZWQKQEAgLTIzOSw2ICsyNDgsOCBAQAogCX0KICAgICB9CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV93cml0ZV9jaXNfbWVtKTsKKwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjc0LDcgKzI4NSw3IEBACiAJcmV0ID0gcmVhZF9jYl9tZW0ocywgYXR0ciwgYWRkciwgbGVuLCBwdHIpOwogICAgIGVsc2UKICNlbmRpZgotCXJldCA9IHJlYWRfY2lzX21lbShzLCBhdHRyLCBhZGRyLCBsZW4sIHB0cik7CisJcmV0ID0gcGNtY2lhX3JlYWRfY2lzX21lbShzLCBhdHRyLCBhZGRyLCBsZW4sIHB0cik7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJLyogQ29weSBkYXRhIGludG8gdGhlIGNhY2hlICovCkBAIC0zNDgsNyArMzU5LDcgQEAKIAkJCXJlYWRfY2JfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CiAJCWVsc2UKICNlbmRpZgotCQkJcmVhZF9jaXNfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CisJCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CiAKIAkJaWYgKG1lbWNtcChidWYsIGNpcy0+Y2FjaGUsIGxlbikgIT0gMCkgewogCQkJa2ZyZWUoYnVmKTsKQEAgLTM4MSw2ICszOTIsNyBAQAogICAgIG1lbWNweShzLT5mYWtlX2NpcywgY2lzLT5EYXRhLCBjaXMtPkxlbmd0aCk7CiAgICAgcmV0dXJuIENTX1NVQ0NFU1M7CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXBsYWNlX2Npcyk7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCA0OGU0ZjA0Li5lMzkxNzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC00MywzNiArNDIsMTEgQEAKICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KICNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgogCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfT1BUICIgW3BjaV0iCi0jZWxzZQotI2RlZmluZSBQQ0lfT1BUICIiCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotI2RlZmluZSBDQl9PUFQgIiBbY2FyZGJ1c10iCi0jZWxzZQotI2RlZmluZSBDQl9PUFQgIiIKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QTQotI2RlZmluZSBQTV9PUFQgIiBbcG1dIgotI2Vsc2UKLSNkZWZpbmUgUE1fT1BUICIiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChDT05GSUdfQ0FSREJVUykgJiYgIWRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1BNKQotI2RlZmluZSBPUFRJT05TICIgbm9uZSIKLSNlbHNlCi0jZGVmaW5lIE9QVElPTlMgUENJX09QVCBDQl9PUFQgUE1fT1BUCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJlbGVhc2UgPSAiTGludXggS2VybmVsIENhcmQgU2VydmljZXMiOwotc3RhdGljIGNvbnN0IGNoYXIgKm9wdGlvbnMgPSAib3B0aW9uczogIiBPUFRJT05TOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIAogTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBLZXJuZWwgQ2FyZCBTZXJ2aWNlc1xub3B0aW9uczoiIE9QVElPTlMpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBLZXJuZWwgQ2FyZCBTZXJ2aWNlcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwNDQ0KQpAQCAtODksOSArNjMsNiBAQAogLyogQWNjZXNzIHNwZWVkIGZvciBhdHRyaWJ1dGUgbWVtb3J5IHdpbmRvd3MgKi8KIElOVF9NT0RVTEVfUEFSTShjaXNfc3BlZWQsCTMwMCk7CQkvKiBucyAqLwogCi0vKiBBY2Nlc3Mgc3BlZWQgZm9yIElPIHdpbmRvd3MgKi8KLUlOVF9NT0RVTEVfUEFSTShpb19zcGVlZCwJMCk7CQkvKiBucyAqLwotCiAjaWZkZWYgREVCVUcKIHN0YXRpYyBpbnQgcGNfZGVidWc7CiAKQEAgLTEwMywzNCArNzQsMjYgQEAKIH0KICNlbmRpZgogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc29ja2V0X3N0YXRlX3QgZGVhZF9zb2NrZXQgPSB7CiAJLmNzY19tYXNrCT0gU1NfREVURUNULAogfTsKK0VYUE9SVF9TWU1CT0woZGVhZF9zb2NrZXQpOwogCiAKIC8qIExpc3Qgb2YgYWxsIHNvY2tldHMsIHByb3RlY3RlZCBieSBhIHJ3c2VtICovCiBMSVNUX0hFQUQocGNtY2lhX3NvY2tldF9saXN0KTsKLURFQ0xBUkVfUldTRU0ocGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9saXN0KTsKKworREVDTEFSRV9SV1NFTShwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogRVhQT1JUX1NZTUJPTChwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCiAKLSNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCi0vKiBtYXNrIG9mSVJRcyBhbHJlYWR5IHJlc2VydmVkIGJ5IG90aGVyIGNhcmRzLCB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgdGhlbSAqLwotc3RhdGljIHU4IHBjbWNpYV91c2VkX2lycVtOUl9JUlFTXTsKLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBMb3ctbGV2ZWwgUEMgQ2FyZCBpbnRlcmZhY2UgZHJpdmVycyBuZWVkIHRvIHJlZ2lzdGVyIHdpdGggQ2FyZAotICAgIFNlcnZpY2VzIHVzaW5nIHRoZXNlIGNhbGxzLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KIC8qKgotICogc29ja2V0IGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIHVzZSB0aGUgZm9sbG93aW5nIGNhbGxiYWNrcyBpbiB0aGVpciAKKyAqIExvdy1sZXZlbCBQQ01DSUEgc29ja2V0IGRyaXZlcnMgbmVlZCB0byByZWdpc3RlciB3aXRoIHRoZSBQQ0NhcmQKKyAqIGNvcmUgdXNpbmcgcGNtY2lhX3JlZ2lzdGVyX3NvY2tldC4KKyAqCisgKiBzb2NrZXQgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGluIHRoZWlyCiAgKiAuZHJ2IHN0cnVjdDoKICAqICAtIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQKICAqICAtIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZQpAQCAtMjMwLDggKzE5Myw4IEBACiAJfQogCiAJLyogdHJ5IHRvIG9idGFpbiBhIHNvY2tldCBudW1iZXIgW3llcywgaXQgZ2V0cyB1Z2x5IGlmIHdlCi0JICogcmVnaXN0ZXIgbW9yZSB0aGFuIDJec2l6ZW9mKHVuc2lnbmVkIGludCkgcGNtY2lhIAotCSAqIHNvY2tldHMuLi4gYnV0IHRoZSBzb2NrZXQgbnVtYmVyIGlzIGRlcHJlY2F0ZWQgCisJICogcmVnaXN0ZXIgbW9yZSB0aGFuIDJec2l6ZW9mKHVuc2lnbmVkIGludCkgcGNtY2lhCisJICogc29ja2V0cy4uLiBidXQgdGhlIHNvY2tldCBudW1iZXIgaXMgZGVwcmVjYXRlZAogCSAqIGFueXdheXMsIHNvIEkgZG9uJ3QgY2FyZV0gKi8KIAlkb3duX3dyaXRlKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCWlmIChsaXN0X2VtcHR5KCZwY21jaWFfc29ja2V0X2xpc3QpKQpAQCAtMjUyLDYgKzIxNSwxMyBAQAogCWxpc3RfYWRkX3RhaWwoJnNvY2tldC0+c29ja2V0X2xpc3QsICZwY21jaWFfc29ja2V0X2xpc3QpOwogCXVwX3dyaXRlKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCisjaWZuZGVmIENPTkZJR19DQVJEQlVTCisJLyoKKwkgKiBJZiB3ZSBkbyBub3Qgc3VwcG9ydCBDYXJkYnVzLCBlbnN1cmUgdGhhdAorCSAqIHRoZSBDYXJkYnVzIHNvY2tldCBjYXBhYmlsaXR5IGlzIGRpc2FibGVkLgorCSAqLworCXNvY2tldC0+ZmVhdHVyZXMgJj0gflNTX0NBUF9DQVJEQlVTOworI2VuZGlmCiAKIAkvKiBzZXQgcHJvcGVyIHZhbHVlcyBpbiBzb2NrZXQtPmRldiAqLwogCXNvY2tldC0+ZGV2LmNsYXNzX2RhdGEgPSBzb2NrZXQ7CkBAIC0zNDAsNTQgKzMxMCw0OSBAQAogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3NvY2tldF9ieV9ucik7CiAKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzb2NrZXRfc2V0dXAoKSBhbmQgc2h1dGRvd25fc29ja2V0KCkgYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBldmVudAotICAgIGhhbmRsZXIgd2hlbiBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBldmVudHMgYXJlIHJlY2VpdmVkLgotICAgIHNvY2tldF9zZXR1cCgpIHR1cm5zIG9uIHNvY2tldCBwb3dlciBhbmQgcmVzZXRzIHRoZSBzb2NrZXQsIGluIHR3byBzdGFnZXMuCi0gICAgc2h1dGRvd25fc29ja2V0KCkgdW5jb25maWd1cmVzIGEgc29ja2V0IGFuZCB0dXJucyBvZmYgc29ja2V0IHBvd2VyLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQorLyoqCisgKiBzb2NrZXRfc2V0dXAoKSBhbmQgc2h1dGRvd25fc29ja2V0KCkgYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBldmVudAorICogaGFuZGxlciB3aGVuIGNhcmQgaW5zZXJ0aW9uIGFuZCByZW1vdmFsIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCisgKiBzb2NrZXRfc2V0dXAoKSB0dXJucyBvbiBzb2NrZXQgcG93ZXIgYW5kIHJlc2V0cyB0aGUgc29ja2V0LCBpbiB0d28gc3RhZ2VzLgorICogc2h1dGRvd25fc29ja2V0KCkgdW5jb25maWd1cmVzIGEgc29ja2V0IGFuZCB0dXJucyBvZmYgc29ja2V0IHBvd2VyLgorICovCiBzdGF0aWMgdm9pZCBzaHV0ZG93bl9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7Ci0gICAgY3NfZGJnKHMsIDEsICJzaHV0ZG93bl9zb2NrZXRcbiIpOworCWNzX2RiZyhzLCAxLCAic2h1dGRvd25fc29ja2V0XG4iKTsKIAotICAgIC8qIEJsYW5rIG91dCB0aGUgc29ja2V0IHN0YXRlICovCi0gICAgcy0+c29ja2V0ID0gZGVhZF9zb2NrZXQ7Ci0gICAgcy0+b3BzLT5pbml0KHMpOwotICAgIHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKLSAgICBzLT5pcnEuQXNzaWduZWRJUlEgPSBzLT5pcnEuQ29uZmlnID0gMDsKLSAgICBzLT5sb2NrX2NvdW50ID0gMDsKLSAgICBkZXN0cm95X2Npc19jYWNoZShzKTsKKwkvKiBCbGFuayBvdXQgdGhlIHNvY2tldCBzdGF0ZSAqLworCXMtPnNvY2tldCA9IGRlYWRfc29ja2V0OworCXMtPm9wcy0+aW5pdChzKTsKKwlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CisJcy0+aXJxLkFzc2lnbmVkSVJRID0gcy0+aXJxLkNvbmZpZyA9IDA7CisJcy0+bG9ja19jb3VudCA9IDA7CisJZGVzdHJveV9jaXNfY2FjaGUocyk7CiAjaWZkZWYgQ09ORklHX0NBUkRCVVMKLSAgICBjYl9mcmVlKHMpOworCWNiX2ZyZWUocyk7CiAjZW5kaWYKLSAgICBzLT5mdW5jdGlvbnMgPSAwOwotICAgIGlmIChzLT5jb25maWcpIHsKLQlrZnJlZShzLT5jb25maWcpOwotCXMtPmNvbmZpZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgewotCWludCBzdGF0dXM7Ci0Jcy0+b3BzLT5nZXRfc3RhdHVzKHMsICZzdGF0dXMpOwotCWlmIChzdGF0dXMgJiBTU19QT1dFUk9OKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENNQ0lBOiBzb2NrZXQgJXA6ICoqKiBEQU5HRVIgKioqIHVuYWJsZSB0byByZW1vdmUgc29ja2V0IHBvd2VyXG4iLCBzKTsKKwlzLT5mdW5jdGlvbnMgPSAwOworCWlmIChzLT5jb25maWcpIHsKKwkJa2ZyZWUocy0+Y29uZmlnKTsKKwkJcy0+Y29uZmlnID0gTlVMTDsKIAl9Ci0gICAgfQorCisJeworCQlpbnQgc3RhdHVzOworCQlzLT5vcHMtPmdldF9zdGF0dXMocywgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBTU19QT1dFUk9OKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQTogc29ja2V0ICVwOiAqKiogREFOR0VSICoqKiB1bmFibGUgdG8gcmVtb3ZlIHNvY2tldCBwb3dlclxuIiwgcyk7CisJCX0KKwl9CiB9IC8qIHNodXRkb3duX3NvY2tldCAqLwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgIFRoZSBjZW50cmFsIGV2ZW50IGhhbmRsZXIuICBTZW5kX2V2ZW50KCkgc2VuZHMgYW4gZXZlbnQgdG8gdGhlCi0gICAgMTYtYml0IHN1YnN5c3RlbSwgd2hpY2ggdGhlbiBjYWxscyB0aGUgcmVsZXZhbnQgZGV2aWNlIGRyaXZlcnMuCi0gICAgUGFyc2VfZXZlbnRzKCkgaW50ZXJwcmV0cyB0aGUgZXZlbnQgYml0cyBmcm9tCi0gICAgYSBjYXJkIHN0YXR1cyBjaGFuZ2UgcmVwb3J0LiAgRG9fc2h1dGRvd24oKSBoYW5kbGVzIHRoZSBoaWdoCi0gICAgcHJpb3JpdHkgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIGEgY2FyZCByZW1vdmFsLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KKy8qKgorICogVGhlIGNlbnRyYWwgZXZlbnQgaGFuZGxlci4gIFNlbmRfZXZlbnQoKSBzZW5kcyBhbiBldmVudCB0byB0aGUKKyAqIDE2LWJpdCBzdWJzeXN0ZW0sIHdoaWNoIHRoZW4gY2FsbHMgdGhlIHJlbGV2YW50IGRldmljZSBkcml2ZXJzLgorICogUGFyc2VfZXZlbnRzKCkgaW50ZXJwcmV0cyB0aGUgZXZlbnQgYml0cyBmcm9tCisgKiBhIGNhcmQgc3RhdHVzIGNoYW5nZSByZXBvcnQuICBEb19zaHV0ZG93bigpIGhhbmRsZXMgdGhlIGhpZ2gKKyAqIHByaW9yaXR5IHN0dWZmIGFzc29jaWF0ZWQgd2l0aCBhIGNhcmQgcmVtb3ZhbC4KKyAqLwogCiAvKiBOT1RFOiBzZW5kX2V2ZW50IG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHNrdC0+c2VtIGhlbGQuICovCiAKQEAgLTQ5MCwxMSArNDU1LDExIEBACiAJfQogCiAJaWYgKHN0YXR1cyAmIFNTX0NBUkRCVVMpIHsKKwkJaWYgKCEoc2t0LT5mZWF0dXJlcyAmIFNTX0NBUF9DQVJEQlVTKSkgeworCQkJY3NfZXJyKHNrdCwgImNhcmRidXMgY2FyZHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJCXJldHVybiBDU19CQURfVFlQRTsKKwkJfQogCQlza3QtPnN0YXRlIHw9IFNPQ0tFVF9DQVJEQlVTOwotI2lmbmRlZiBDT05GSUdfQ0FSREJVUwotCQljc19lcnIoc2t0LCAiY2FyZGJ1cyBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOwotCQlyZXR1cm4gQ1NfQkFEX1RZUEU7Ci0jZW5kaWYKIAl9CiAKIAkvKgpAQCAtNzQ2LDQyMCArNzExLDkgQEAKIAkJd2FrZV91cCgmcy0+dGhyZWFkX3dhaXQpOwogCX0KIH0gLyogcGNtY2lhX3BhcnNlX2V2ZW50cyAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcGFyc2VfZXZlbnRzKTsKIAogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFNwZWNpYWwgc3R1ZmYgZm9yIG1hbmFnaW5nIElPIHdpbmRvd3MsIGJlY2F1c2UgdGhleSBhcmUgc2NhcmNlLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgYWxsb2NfaW9fc3BhY2Uoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVfaW50IGF0dHIsIGlvYWRkcl90ICpiYXNlLAotCQkJICBpb2FkZHJfdCBudW0sIHVfaW50IGxpbmVzKQotewotICAgIGludCBpOwotICAgIGtpb19hZGRyX3QgdHJ5LCBhbGlnbjsKLQotICAgIGFsaWduID0gKCpiYXNlKSA/IChsaW5lcyA/IDE8PGxpbmVzIDogMCkgOiAxOwotICAgIGlmIChhbGlnbiAmJiAoYWxpZ24gPCBudW0pKSB7Ci0JaWYgKCpiYXNlKSB7Ci0JICAgIGNzX2RiZyhzLCAwLCAib2RkIElPIHJlcXVlc3Q6IG51bSAlI3ggYWxpZ24gJSNseFxuIiwKLQkJICAgbnVtLCBhbGlnbik7Ci0JICAgIGFsaWduID0gMDsKLQl9IGVsc2UKLQkgICAgd2hpbGUgKGFsaWduICYmIChhbGlnbiA8IG51bSkpIGFsaWduIDw8PSAxOwotICAgIH0KLSAgICBpZiAoKmJhc2UgJiB+KGFsaWduLTEpKSB7Ci0JY3NfZGJnKHMsIDAsICJvZGQgSU8gcmVxdWVzdDogYmFzZSAlI3ggYWxpZ24gJSNseFxuIiwKLQkgICAgICAgKmJhc2UsIGFsaWduKTsKLQlhbGlnbiA9IDA7Ci0gICAgfQotICAgIGlmICgocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgJiYgcy0+aW9fb2Zmc2V0KSB7Ci0JKmJhc2UgPSBzLT5pb19vZmZzZXQgfCAoKmJhc2UgJiAweDBmZmYpOwotCXJldHVybiAwOwotICAgIH0KLSAgICAvKiBDaGVjayBmb3IgYW4gYWxyZWFkeS1hbGxvY2F0ZWQgd2luZG93IHRoYXQgbXVzdCBjb25mbGljdCB3aXRoCi0gICAgICAgd2hhdCB3YXMgYXNrZWQgZm9yLiAgSXQgaXMgYSBoYWNrIGJlY2F1c2UgaXQgZG9lcyBub3QgY2F0Y2ggYWxsCi0gICAgICAgcG90ZW50aWFsIGNvbmZsaWN0cywganVzdCB0aGUgbW9zdCBvYnZpb3VzIG9uZXMuICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykKLQlpZiAoKHMtPmlvW2ldLk51bVBvcnRzICE9IDApICYmCi0JICAgICgocy0+aW9baV0uQmFzZVBvcnQgJiAoYWxpZ24tMSkpID09ICpiYXNlKSkKLQkgICAgcmV0dXJuIDE7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykgewotCWlmIChzLT5pb1tpXS5OdW1Qb3J0cyA9PSAwKSB7Ci0JICAgIHMtPmlvW2ldLnJlcyA9IGZpbmRfaW9fcmVnaW9uKCpiYXNlLCBudW0sIGFsaWduLCBzKTsKLQkgICAgaWYgKHMtPmlvW2ldLnJlcykgewotCQlzLT5pb1tpXS5BdHRyaWJ1dGVzID0gYXR0cjsKLQkJcy0+aW9baV0uQmFzZVBvcnQgPSAqYmFzZSA9IHMtPmlvW2ldLnJlcy0+c3RhcnQ7Ci0JCXMtPmlvW2ldLk51bVBvcnRzID0gcy0+aW9baV0uSW5Vc2UgPSBudW07Ci0JCWJyZWFrOwotCSAgICB9IGVsc2UKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChzLT5pb1tpXS5BdHRyaWJ1dGVzICE9IGF0dHIpCi0JICAgIGNvbnRpbnVlOwotCS8qIFRyeSB0byBleHRlbmQgdG9wIG9mIHdpbmRvdyAqLwotCXRyeSA9IHMtPmlvW2ldLkJhc2VQb3J0ICsgcy0+aW9baV0uTnVtUG9ydHM7Ci0JaWYgKCgqYmFzZSA9PSAwKSB8fCAoKmJhc2UgPT0gdHJ5KSkKLQkgICAgaWYgKGFkanVzdF9pb19yZWdpb24ocy0+aW9baV0ucmVzLCBzLT5pb1tpXS5yZXMtPnN0YXJ0LAotCQkJCSBzLT5pb1tpXS5yZXMtPmVuZCArIG51bSwgcykgPT0gMCkgewotCQkqYmFzZSA9IHRyeTsKLQkJcy0+aW9baV0uTnVtUG9ydHMgKz0gbnVtOwotCQlzLT5pb1tpXS5JblVzZSArPSBudW07Ci0JCWJyZWFrOwotCSAgICB9Ci0JLyogVHJ5IHRvIGV4dGVuZCBib3R0b20gb2Ygd2luZG93ICovCi0JdHJ5ID0gcy0+aW9baV0uQmFzZVBvcnQgLSBudW07Ci0JaWYgKCgqYmFzZSA9PSAwKSB8fCAoKmJhc2UgPT0gdHJ5KSkKLQkgICAgaWYgKGFkanVzdF9pb19yZWdpb24ocy0+aW9baV0ucmVzLCBzLT5pb1tpXS5yZXMtPnN0YXJ0IC0gbnVtLAotCQkJCSBzLT5pb1tpXS5yZXMtPmVuZCwgcykgPT0gMCkgewotCQlzLT5pb1tpXS5CYXNlUG9ydCA9ICpiYXNlID0gdHJ5OwotCQlzLT5pb1tpXS5OdW1Qb3J0cyArPSBudW07Ci0JCXMtPmlvW2ldLkluVXNlICs9IG51bTsKLQkJYnJlYWs7Ci0JICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChpID09IE1BWF9JT19XSU4pOwotfSAvKiBhbGxvY19pb19zcGFjZSAqLwotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2lvX3NwYWNlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpb2FkZHJfdCBiYXNlLAotCQkJICAgICBpb2FkZHJfdCBudW0pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7Ci0JaWYgKChzLT5pb1tpXS5CYXNlUG9ydCA8PSBiYXNlKSAmJgotCSAgICAocy0+aW9baV0uQmFzZVBvcnQrcy0+aW9baV0uTnVtUG9ydHMgPj0gYmFzZStudW0pKSB7Ci0JICAgIHMtPmlvW2ldLkluVXNlIC09IG51bTsKLQkgICAgLyogRnJlZSB0aGUgd2luZG93IGlmIG5vIG9uZSBlbHNlIGlzIHVzaW5nIGl0ICovCi0JICAgIGlmIChzLT5pb1tpXS5JblVzZSA9PSAwKSB7Ci0JCXMtPmlvW2ldLk51bVBvcnRzID0gMDsKLQkJcmVsZWFzZV9yZXNvdXJjZShzLT5pb1tpXS5yZXMpOwotCQlrZnJlZShzLT5pb1tpXS5yZXMpOwotCQlzLT5pb1tpXS5yZXMgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBBY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigpIHJlYWRzIGFuZCB3cml0ZXMgY29uZmlndXJhdGlvbgotICAgIHJlZ2lzdGVycyBpbiBhdHRyaWJ1dGUgbWVtb3J5LiAgTWVtb3J5IHdpbmRvdyAwIGlzIHJlc2VydmVkIGZvcgotICAgIHRoaXMgYW5kIHRoZSB0dXBsZSByZWFkaW5nIHNlcnZpY2VzLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJCSB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCi0JCQkJCSBjb25mX3JlZ190ICpyZWcpCi17Ci0gICAgY29uZmlnX3QgKmM7Ci0gICAgaW50IGFkZHI7Ci0gICAgdV9jaGFyIHZhbDsKLQotICAgIGlmICghcyB8fCAhcy0+Y29uZmlnKQotCXJldHVybiBDU19OT19DQVJEOyAgICAKLQotICAgIGMgPSAmcy0+Y29uZmlnW2Z1bmN0aW9uXTsKLQotICAgIGlmIChjID09IE5VTEwpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0KLSAgICBpZiAoIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKQotCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQotICAgIGFkZHIgPSAoYy0+Q29uZmlnQmFzZSArIHJlZy0+T2Zmc2V0KSA+PiAxOwotICAgIAotICAgIHN3aXRjaCAocmVnLT5BY3Rpb24pIHsKLSAgICBjYXNlIENTX1JFQUQ6Ci0JcmVhZF9jaXNfbWVtKHMsIDEsIGFkZHIsIDEsICZ2YWwpOwotCXJlZy0+VmFsdWUgPSB2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDU19XUklURToKLQl2YWwgPSByZWctPlZhbHVlOwotCXdyaXRlX2Npc19tZW0ocywgMSwgYWRkciwgMSwgJnZhbCk7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlyZXR1cm4gQ1NfQkFEX0FSR1M7Ci0JYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBhY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlciAqLwotRVhQT1JUX1NZTUJPTChwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCi0JCQkJICBjb25maWdfaW5mb190ICpjb25maWcpCi17Ci0gICAgY29uZmlnX3QgKmM7Ci0gICAgCi0gICAgaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0KLSAgICBjb25maWctPkZ1bmN0aW9uID0gZnVuY3Rpb247Ci0KLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotICAgIGlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSB7Ci0JbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZ19pbmZvX3QpKTsKLQljb25maWctPlZjYyA9IHMtPnNvY2tldC5WY2M7Ci0JY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKLQljb25maWctPk9wdGlvbiA9IHMtPmNiX2Rldi0+c3Vib3JkaW5hdGUtPm51bWJlcjsKLQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVU19DT05GSUcpIHsKLQkgICAgY29uZmlnLT5BdHRyaWJ1dGVzID0gQ09ORl9WQUxJRF9DTElFTlQ7Ci0JICAgIGNvbmZpZy0+SW50VHlwZSA9IElOVF9DQVJEQlVTOwotCSAgICBjb25maWctPkFzc2lnbmVkSVJRID0gcy0+aXJxLkFzc2lnbmVkSVJROwotCSAgICBpZiAoY29uZmlnLT5Bc3NpZ25lZElSUSkKLQkJY29uZmlnLT5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQkgICAgY29uZmlnLT5CYXNlUG9ydDEgPSBzLT5pb1swXS5CYXNlUG9ydDsKLQkgICAgY29uZmlnLT5OdW1Qb3J0czEgPSBzLT5pb1swXS5OdW1Qb3J0czsKLQl9Ci0JcmV0dXJuIENTX1NVQ0NFU1M7Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgYyA9IChzLT5jb25maWcgIT0gTlVMTCkgPyAmcy0+Y29uZmlnW2Z1bmN0aW9uXSA6IE5VTEw7Ci0gICAgCi0gICAgaWYgKChjID09IE5VTEwpIHx8ICEoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSkgewotCWNvbmZpZy0+QXR0cmlidXRlcyA9IDA7Ci0JY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOwotCWNvbmZpZy0+VnBwMSA9IGNvbmZpZy0+VnBwMiA9IHMtPnNvY2tldC5WcHA7Ci0JcmV0dXJuIENTX1NVQ0NFU1M7Ci0gICAgfQotICAgIAotICAgIC8qICEhISBUaGlzIGlzIGEgaGFjayAhISEgKi8KLSAgICBtZW1jcHkoJmNvbmZpZy0+QXR0cmlidXRlcywgJmMtPkF0dHJpYnV0ZXMsIHNpemVvZihjb25maWdfdCkpOwotICAgIGNvbmZpZy0+QXR0cmlidXRlcyB8PSBDT05GX1ZBTElEX0NMSUVOVDsKLSAgICBjb25maWctPkNhcmRWYWx1ZXMgPSBjLT5DYXJkVmFsdWVzOwotICAgIGNvbmZpZy0+SVJRQXR0cmlidXRlcyA9IGMtPmlycS5BdHRyaWJ1dGVzOwotICAgIGNvbmZpZy0+QXNzaWduZWRJUlEgPSBzLT5pcnEuQXNzaWduZWRJUlE7Ci0gICAgY29uZmlnLT5CYXNlUG9ydDEgPSBjLT5pby5CYXNlUG9ydDE7Ci0gICAgY29uZmlnLT5OdW1Qb3J0czEgPSBjLT5pby5OdW1Qb3J0czE7Ci0gICAgY29uZmlnLT5BdHRyaWJ1dGVzMSA9IGMtPmlvLkF0dHJpYnV0ZXMxOwotICAgIGNvbmZpZy0+QmFzZVBvcnQyID0gYy0+aW8uQmFzZVBvcnQyOwotICAgIGNvbmZpZy0+TnVtUG9ydHMyID0gYy0+aW8uTnVtUG9ydHMyOwotICAgIGNvbmZpZy0+QXR0cmlidXRlczIgPSBjLT5pby5BdHRyaWJ1dGVzMjsKLSAgICBjb25maWctPklPQWRkckxpbmVzID0gYy0+aW8uSU9BZGRyTGluZXM7Ci0gICAgCi0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGdldF9jb25maWd1cmF0aW9uX2luZm8gKi8KLUVYUE9SVF9TWU1CT0wocGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8pOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHZlcnNpb24gb2YgQ2FyZCBTZXJ2aWNlcy4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oc2VydmluZm9fdCAqaW5mbykKLXsKLSAgICB1bnNpZ25lZCBpbnQgc29ja2V0X2NvdW50ID0gMDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0gICAgaW5mby0+U2lnbmF0dXJlWzBdID0gJ0MnOwotICAgIGluZm8tPlNpZ25hdHVyZVsxXSA9ICdTJzsKLSAgICBkb3duX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7Ci0gICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwY21jaWFfc29ja2V0X2xpc3QpCi0JICAgIHNvY2tldF9jb3VudCsrOwotICAgIHVwX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7Ci0gICAgaW5mby0+Q291bnQgPSBzb2NrZXRfY291bnQ7Ci0gICAgaW5mby0+UmV2aXNpb24gPSBDU19SRUxFQVNFX0NPREU7Ci0gICAgaW5mby0+Q1NMZXZlbCA9IDB4MDIxMDsKLSAgICBpbmZvLT5WZW5kb3JTdHJpbmcgPSAoY2hhciAqKXJlbGVhc2U7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGdldF9jYXJkX3NlcnZpY2VzX2luZm8gKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9nZXRfd2luZG93KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB3aW5kb3dfaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlkeCwgd2luX3JlcV90ICpyZXEpCi17Ci0gICAgd2luZG93X3QgKndpbjsKLSAgICBpbnQgdzsKLQotICAgIGlmICghcyB8fCAhKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOwotICAgIGZvciAodyA9IGlkeDsgdyA8IE1BWF9XSU47IHcrKykKLQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfV0lOX1JFUSh3KSkgYnJlYWs7Ci0gICAgaWYgKHcgPT0gTUFYX1dJTikKLQlyZXR1cm4gQ1NfTk9fTU9SRV9JVEVNUzsKLSAgICB3aW4gPSAmcy0+d2luW3ddOwotICAgIHJlcS0+QmFzZSA9IHdpbi0+Y3RsLnJlcy0+c3RhcnQ7Ci0gICAgcmVxLT5TaXplID0gd2luLT5jdGwucmVzLT5lbmQgLSB3aW4tPmN0bC5yZXMtPnN0YXJ0ICsgMTsKLSAgICByZXEtPkFjY2Vzc1NwZWVkID0gd2luLT5jdGwuc3BlZWQ7Ci0gICAgcmVxLT5BdHRyaWJ1dGVzID0gMDsKLSAgICBpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfQVRUUklCKQotCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fTUVNT1JZX1RZUEVfQU07Ci0gICAgaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX0FDVElWRSkKLQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0VOQUJMRTsKLSAgICBpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfMTZCSVQpCi0JcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9EQVRBX1dJRFRIXzE2OwotICAgIGlmICh3aW4tPmN0bC5mbGFncyAmIE1BUF9VU0VfV0FJVCkKLQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOwotICAgICpoYW5kbGUgPSB3aW47Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGdldF93aW5kb3cgKi8KLUVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF93aW5kb3cpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUmV0dXJuIHRoZSBQQ0kgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBhIGNhcmQuLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0KLXN0cnVjdCBwY2lfYnVzICpwY21jaWFfbG9va3VwX2J1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKLXsKLQlpZiAoIXMgfHwgIShzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gcy0+Y2JfZGV2LT5zdWJvcmRpbmF0ZTsKLX0KLQotRVhQT1JUX1NZTUJPTChwY21jaWFfbG9va3VwX2J1cyk7Ci0KLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIEdldCB0aGUgY3VycmVudCBzb2NrZXQgc3RhdGUgYml0cy4gIFdlIGRvbid0IHN1cHBvcnQgdGhlIGxhdGNoZWQKLSAgICBTb2NrZXRTdGF0ZSB5ZXQ6IEkgaGF2ZW4ndCBzZWVuIGFueSBwb2ludCBmb3IgaXQuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjY2FyZF9nZXRfc3RhdHVzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIGNzX3N0YXR1c190ICpzdGF0dXMpCi17Ci0gICAgY29uZmlnX3QgKmM7Ci0gICAgaW50IHZhbDsKLSAgICAKLSAgICBzLT5vcHMtPmdldF9zdGF0dXMocywgJnZhbCk7Ci0gICAgc3RhdHVzLT5DYXJkU3RhdGUgPSBzdGF0dXMtPlNvY2tldFN0YXRlID0gMDsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PSAodmFsICYgU1NfREVURUNUKSA/IENTX0VWRU5UX0NBUkRfREVURUNUIDogMDsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PSAodmFsICYgU1NfQ0FSREJVUykgPyBDU19FVkVOVF9DQl9ERVRFQ1QgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU18zVkNBUkQpID8gQ1NfRVZFTlRfM1ZDQVJEIDogMDsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PSAodmFsICYgU1NfWFZDQVJEKSA/IENTX0VWRU5UX1hWQ0FSRCA6IDA7Ci0gICAgaWYgKHMtPnN0YXRlICYgU09DS0VUX1NVU1BFTkQpCi0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0gQ1NfRVZFTlRfUE1fU1VTUEVORDsKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLSAgICAKLSAgICBjID0gKHMtPmNvbmZpZyAhPSBOVUxMKSA/ICZzLT5jb25maWdbZnVuY3Rpb25dIDogTlVMTDsKLSAgICBpZiAoKGMgIT0gTlVMTCkgJiYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkgJiYKLQkoYy0+SW50VHlwZSAmIChJTlRfTUVNT1JZX0FORF9JTyB8IElOVF9aT09NRURfVklERU8pKSkgewotCXVfY2hhciByZWc7Ci0JaWYgKGMtPlByZXNlbnQgJiBQUkVTRU5UX1BJTl9SRVBMQUNFKSB7Ci0JICAgIHJlYWRfY2lzX21lbShzLCAxLCAoYy0+Q29uZmlnQmFzZStDSVNSRUdfUFJSKT4+MSwgMSwgJnJlZyk7Ci0JICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCShyZWcgJiBQUlJfV1BfU1RBVFVTKSA/IENTX0VWRU5UX1dSSVRFX1BST1RFQ1QgOiAwOwotCSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCQkocmVnICYgUFJSX1JFQURZX1NUQVRVUykgPyBDU19FVkVOVF9SRUFEWV9DSEFOR0UgOiAwOwotCSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCQkocmVnICYgUFJSX0JWRDJfU1RBVFVTKSA/IENTX0VWRU5UX0JBVFRFUllfTE9XIDogMDsKLQkgICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJKHJlZyAmIFBSUl9CVkQxX1NUQVRVUykgPyBDU19FVkVOVF9CQVRURVJZX0RFQUQgOiAwOwotCX0gZWxzZSB7Ci0JICAgIC8qIE5vIFBSUj8gIFRoZW4gYXNzdW1lIHdlJ3JlIGFsd2F5cyByZWFkeSAqLwotCSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PSBDU19FVkVOVF9SRUFEWV9DSEFOR0U7Ci0JfQotCWlmIChjLT5QcmVzZW50ICYgUFJFU0VOVF9FWFRfU1RBVFVTKSB7Ci0JICAgIHJlYWRfY2lzX21lbShzLCAxLCAoYy0+Q29uZmlnQmFzZStDSVNSRUdfRVNSKT4+MSwgMSwgJnJlZyk7Ci0JICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCShyZWcgJiBFU1JfUkVRX0FUVE4pID8gQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04gOiAwOwotCX0KLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSAgICB9Ci0gICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkodmFsICYgU1NfV1JQUk9UKSA/IENTX0VWRU5UX1dSSVRFX1BST1RFQ1QgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JKHZhbCAmIFNTX0JBVERFQUQpID8gQ1NfRVZFTlRfQkFUVEVSWV9ERUFEIDogMDsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCSh2YWwgJiBTU19CQVRXQVJOKSA/IENTX0VWRU5UX0JBVFRFUllfTE9XIDogMDsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCSh2YWwgJiBTU19SRUFEWSkgPyBDU19FVkVOVF9SRUFEWV9DSEFOR0UgOiAwOwotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBnZXRfc3RhdHVzICovCi1FWFBPUlRfU1lNQk9MKHBjY2FyZF9nZXRfc3RhdHVzKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBDaGFuZ2UgdGhlIGNhcmQgYWRkcmVzcyBvZiBhbiBhbHJlYWR5IG9wZW4gbWVtb3J5IHdpbmRvdy4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX2dldF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKQotewotICAgIGlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgcmVxLT5QYWdlID0gMDsKLSAgICByZXEtPkNhcmRPZmZzZXQgPSB3aW4tPmN0bC5jYXJkX3N0YXJ0OwotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBnZXRfbWVtX3BhZ2UgKi8KLQotaW50IHBjbWNpYV9tYXBfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICBpZiAoKHdpbiA9PSBOVUxMKSB8fCAod2luLT5tYWdpYyAhPSBXSU5ET1dfTUFHSUMpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIGlmIChyZXEtPlBhZ2UgIT0gMCkKLQlyZXR1cm4gQ1NfQkFEX1BBR0U7Ci0gICAgcyA9IHdpbi0+c29jazsKLSAgICB3aW4tPmN0bC5jYXJkX3N0YXJ0ID0gcmVxLT5DYXJkT2Zmc2V0OwotICAgIGlmIChzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZ3aW4tPmN0bCkgIT0gMCkKLQlyZXR1cm4gQ1NfQkFEX09GRlNFVDsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogbWFwX21lbV9wYWdlICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgTW9kaWZ5IGEgbG9ja2VkIHNvY2tldCBjb25maWd1cmF0aW9uCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLAotCQkJCW1vZGNvbmZfdCAqbW9kKQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIGNvbmZpZ190ICpjOwotICAgIAotICAgIGlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7IGMgPSBDT05GSUcoaGFuZGxlKTsKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLSAgICBpZiAoIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKQotCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLSAgICAKLSAgICBpZiAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9JUlFfQ0hBTkdFX1ZBTElEKSB7Ci0JaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgewotCSAgICBjLT5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQkgICAgcy0+c29ja2V0LmlvX2lycSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKLQl9IGVsc2UgewotCSAgICBjLT5BdHRyaWJ1dGVzICY9IH5DT05GX0VOQUJMRV9JUlE7Ci0JICAgIHMtPnNvY2tldC5pb19pcnEgPSAwOwotCX0KLQlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7Ci0gICAgfQotCi0gICAgaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVkNDX0NIQU5HRV9WQUxJRCkKLQlyZXR1cm4gQ1NfQkFEX1ZDQzsKLQotICAgIC8qIFdlIG9ubHkgYWxsb3cgY2hhbmdpbmcgVnBwMSBhbmQgVnBwMiB0byB0aGUgc2FtZSB2YWx1ZSAqLwotICAgIGlmICgobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAxX0NIQU5HRV9WQUxJRCkgJiYKLQkobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAyX0NIQU5HRV9WQUxJRCkpIHsKLQlpZiAobW9kLT5WcHAxICE9IG1vZC0+VnBwMikKLQkgICAgcmV0dXJuIENTX0JBRF9WUFA7Ci0JYy0+VnBwMSA9IGMtPlZwcDIgPSBzLT5zb2NrZXQuVnBwID0gbW9kLT5WcHAxOwotCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCi0JICAgIHJldHVybiBDU19CQURfVlBQOwotICAgIH0gZWxzZSBpZiAoKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMV9DSEFOR0VfVkFMSUQpIHx8Ci0JICAgICAgIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkKLQlyZXR1cm4gQ1NfQkFEX1ZQUDsKLQotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBtb2RpZnlfY29uZmlndXJhdGlvbiAqLwotCiAvKiByZWdpc3RlciBwY21jaWFfY2FsbGJhY2sgKi8KIGludCBwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrICpjKQogewpAQCAtMTE4OCw1NDMgKzc0MiwxNiBAQAogfQogRVhQT1JUX1NZTUJPTChwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLWludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgcGNjYXJkX2lvX21hcCBpbyA9IHsgMCwgMCwgMCwgMCwgMSB9OwotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIGludCBpOwotICAgIAotICAgIGlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSB8fAotCSEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DT05GSUdfTE9DS0VEKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBoYW5kbGUtPnN0YXRlICY9IH5DTElFTlRfQ09ORklHX0xPQ0tFRDsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7Ci0gICAgCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLSAgICBpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKQotCXJldHVybiBDU19TVUNDRVNTOwotI2VuZGlmCi0gICAgCi0gICAgaWYgKCEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKLQljb25maWdfdCAqYyA9IENPTkZJRyhoYW5kbGUpOwotCWlmICgtLShzLT5sb2NrX2NvdW50KSA9PSAwKSB7Ci0JICAgIHMtPnNvY2tldC5mbGFncyA9IFNTX09VVFBVVF9FTkE7ICAgLyogSXMgdGhpcyBjb3JyZWN0PyAqLwotCSAgICBzLT5zb2NrZXQuVnBwID0gMDsKLQkgICAgcy0+c29ja2V0LmlvX2lycSA9IDA7Ci0JICAgIHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKLQl9Ci0JaWYgKGMtPnN0YXRlICYgQ09ORklHX0lPX1JFUSkKLQkgICAgZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykgewotCQlpZiAocy0+aW9baV0uTnVtUG9ydHMgPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQlzLT5pb1tpXS5Db25maWctLTsKLQkJaWYgKHMtPmlvW2ldLkNvbmZpZyAhPSAwKQotCQkgICAgY29udGludWU7Ci0JCWlvLm1hcCA9IGk7Ci0JCXMtPm9wcy0+c2V0X2lvX21hcChzLCAmaW8pOwotCSAgICB9Ci0JYy0+c3RhdGUgJj0gfkNPTkZJR19MT0NLRUQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiByZWxlYXNlX2NvbmZpZ3VyYXRpb24gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSZWxlYXNlX2lvKCkgcmVsZWFzZXMgdGhlIEkvTyByYW5nZXMgYWxsb2NhdGVkIGJ5IGEgY2xpZW50LiAgVGhpcwotICAgIG1heSBiZSBpbnZva2VkIHNvbWUgdGltZSBhZnRlciBhIGNhcmQgZWplY3Rpb24gaGFzIGFscmVhZHkgZHVtcGVkCi0gICAgdGhlIGFjdHVhbCBzb2NrZXQgY29uZmlndXJhdGlvbiwgc28gaWYgdGhlIGNsaWVudCBpcyAic3RhbGUiLCB3ZQotICAgIGRvbid0IGJvdGhlciBjaGVja2luZyB0aGUgcG9ydCByYW5nZXMgYWdhaW5zdCB0aGUgY3VycmVudCBzb2NrZXQKLSAgICB2YWx1ZXMuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9yZWxlYXNlX2lvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlvX3JlcV90ICpyZXEpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgCi0gICAgaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpIHx8ICEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9JT19SRVEpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIGhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9JT19SRVE7Ci0gICAgcyA9IFNPQ0tFVChoYW5kbGUpOwotICAgIAotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0gICAgaWYgKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfQ0FSREJVUykKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSNlbmRpZgotICAgIAotICAgIGlmICghKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfU1RBTEUpKSB7Ci0JY29uZmlnX3QgKmMgPSBDT05GSUcoaGFuZGxlKTsKLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQotCSAgICByZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7Ci0JaWYgKChjLT5pby5CYXNlUG9ydDEgIT0gcmVxLT5CYXNlUG9ydDEpIHx8Ci0JICAgIChjLT5pby5OdW1Qb3J0czEgIT0gcmVxLT5OdW1Qb3J0czEpIHx8Ci0JICAgIChjLT5pby5CYXNlUG9ydDIgIT0gcmVxLT5CYXNlUG9ydDIpIHx8Ci0JICAgIChjLT5pby5OdW1Qb3J0czIgIT0gcmVxLT5OdW1Qb3J0czIpKQotCSAgICByZXR1cm4gQ1NfQkFEX0FSR1M7Ci0JYy0+c3RhdGUgJj0gfkNPTkZJR19JT19SRVE7Ci0gICAgfQotCi0gICAgcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOwotICAgIGlmIChyZXEtPk51bVBvcnRzMikKLQlyZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQyLCByZXEtPk51bVBvcnRzMik7Ci0gICAgCi0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIHJlbGVhc2VfaW8gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfcmVsZWFzZV9pcnEoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaXJxX3JlcV90ICpyZXEpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpIHx8ICEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9JUlFfUkVRKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBoYW5kbGUtPnN0YXRlICY9IH5DTElFTlRfSVJRX1JFUTsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7Ci0gICAgCi0gICAgaWYgKCEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKLQljb25maWdfdCAqYyA9IENPTkZJRyhoYW5kbGUpOwotCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCi0JICAgIHJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQlpZiAoYy0+aXJxLkF0dHJpYnV0ZXMgIT0gcmVxLT5BdHRyaWJ1dGVzKQotCSAgICByZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKLQlpZiAocy0+aXJxLkFzc2lnbmVkSVJRICE9IHJlcS0+QXNzaWduZWRJUlEpCi0JICAgIHJldHVybiBDU19CQURfSVJROwotCWlmICgtLXMtPmlycS5Db25maWcgPT0gMCkgewotCSAgICBjLT5zdGF0ZSAmPSB+Q09ORklHX0lSUV9SRVE7Ci0JICAgIHMtPmlycS5Bc3NpZ25lZElSUSA9IDA7Ci0JfQotICAgIH0KLSAgICAKLSAgICBpZiAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSB7Ci0JZnJlZV9pcnEocmVxLT5Bc3NpZ25lZElSUSwgcmVxLT5JbnN0YW5jZSk7Ci0gICAgfQotCi0jaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQotICAgIHBjbWNpYV91c2VkX2lycVtyZXEtPkFzc2lnbmVkSVJRXS0tOwotI2VuZGlmCi0KLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogY3NfcmVsZWFzZV9pcnEgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfcmVsZWFzZV93aW5kb3cod2luZG93X2hhbmRsZV90IHdpbikKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICAKLSAgICBpZiAoKHdpbiA9PSBOVUxMKSB8fCAod2luLT5tYWdpYyAhPSBXSU5ET1dfTUFHSUMpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIHMgPSB3aW4tPnNvY2s7Ci0gICAgaWYgKCEod2luLT5oYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1dJTl9SRVEod2luLT5pbmRleCkpKQotCXJldHVybiBDU19CQURfSEFORExFOwotCi0gICAgLyogU2h1dCBkb3duIG1lbW9yeSB3aW5kb3cgKi8KLSAgICB3aW4tPmN0bC5mbGFncyAmPSB+TUFQX0FDVElWRTsKLSAgICBzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZ3aW4tPmN0bCk7Ci0gICAgcy0+c3RhdGUgJj0gflNPQ0tFVF9XSU5fUkVRKHdpbi0+aW5kZXgpOwotCi0gICAgLyogUmVsZWFzZSBzeXN0ZW0gbWVtb3J5ICovCi0gICAgaWYgKHdpbi0+Y3RsLnJlcykgewotCXJlbGVhc2VfcmVzb3VyY2Uod2luLT5jdGwucmVzKTsKLQlrZnJlZSh3aW4tPmN0bC5yZXMpOwotCXdpbi0+Y3RsLnJlcyA9IE5VTEw7Ci0gICAgfQotICAgIHdpbi0+aGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX1dJTl9SRVEod2luLT5pbmRleCk7Ci0KLSAgICB3aW4tPm1hZ2ljID0gMDsKLSAgICAKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogcmVsZWFzZV93aW5kb3cgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsCi0JCQkJIGNvbmZpZ19yZXFfdCAqcmVxKQotewotICAgIGludCBpOwotICAgIHVfaW50IGJhc2U7Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgY29uZmlnX3QgKmM7Ci0gICAgcGNjYXJkX2lvX21hcCBpb21hcDsKLSAgICAKLSAgICBpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgcyA9IFNPQ0tFVChoYW5kbGUpOwotICAgIGlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOwotICAgIAotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0gICAgaWYgKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfQ0FSREJVUykKLQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLSNlbmRpZgotICAgIAotICAgIGlmIChyZXEtPkludFR5cGUgJiBJTlRfQ0FSREJVUykKLQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLSAgICBjID0gQ09ORklHKGhhbmRsZSk7Ci0gICAgaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKLQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7Ci0KLSAgICAvKiBEbyBwb3dlciBjb250cm9sLiAgV2UgZG9uJ3QgYWxsb3cgY2hhbmdlcyBpbiBWY2MuICovCi0gICAgaWYgKHMtPnNvY2tldC5WY2MgIT0gcmVxLT5WY2MpCi0JcmV0dXJuIENTX0JBRF9WQ0M7Ci0gICAgaWYgKHJlcS0+VnBwMSAhPSByZXEtPlZwcDIpCi0JcmV0dXJuIENTX0JBRF9WUFA7Ci0gICAgcy0+c29ja2V0LlZwcCA9IHJlcS0+VnBwMTsKLSAgICBpZiAocy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpKQotCXJldHVybiBDU19CQURfVlBQOwotICAgIAotICAgIGMtPlZjYyA9IHJlcS0+VmNjOyBjLT5WcHAxID0gYy0+VnBwMiA9IHJlcS0+VnBwMTsKLSAgICAKLSAgICAvKiBQaWNrIG1lbW9yeSBvciBJL08gY2FyZCwgRE1BIG1vZGUsIGludGVycnVwdCAqLwotICAgIGMtPkludFR5cGUgPSByZXEtPkludFR5cGU7Ci0gICAgYy0+QXR0cmlidXRlcyA9IHJlcS0+QXR0cmlidXRlczsKLSAgICBpZiAocmVxLT5JbnRUeXBlICYgSU5UX01FTU9SWV9BTkRfSU8pCi0Jcy0+c29ja2V0LmZsYWdzIHw9IFNTX0lPQ0FSRDsKLSAgICBpZiAocmVxLT5JbnRUeXBlICYgSU5UX1pPT01FRF9WSURFTykKLQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfWlZDQVJEIHwgU1NfSU9DQVJEOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9ETUEpCi0Jcy0+c29ja2V0LmZsYWdzIHw9IFNTX0RNQV9NT0RFOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9TUEtSKQotCXMtPnNvY2tldC5mbGFncyB8PSBTU19TUEtSX0VOQTsKLSAgICBpZiAocmVxLT5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQotCXMtPnNvY2tldC5pb19pcnEgPSBzLT5pcnEuQXNzaWduZWRJUlE7Ci0gICAgZWxzZQotCXMtPnNvY2tldC5pb19pcnEgPSAwOwotICAgIHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKLSAgICBzLT5sb2NrX2NvdW50Kys7Ci0gICAgCi0gICAgLyogU2V0IHVwIENJUyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwotICAgIGJhc2UgPSBjLT5Db25maWdCYXNlID0gcmVxLT5Db25maWdCYXNlOwotICAgIGMtPlByZXNlbnQgPSBjLT5DYXJkVmFsdWVzID0gcmVxLT5QcmVzZW50OwotICAgIGlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0NPUFkpIHsKLQljLT5Db3B5ID0gcmVxLT5Db3B5OwotCXdyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfU0NSKT4+MSwgMSwgJmMtPkNvcHkpOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9PUFRJT04pIHsKLQlpZiAocy0+ZnVuY3Rpb25zID09IDEpIHsKLQkgICAgYy0+T3B0aW9uID0gcmVxLT5Db25maWdJbmRleCAmIENPUl9DT05GSUdfTUFTSzsKLQl9IGVsc2UgewotCSAgICBjLT5PcHRpb24gPSByZXEtPkNvbmZpZ0luZGV4ICYgQ09SX01GQ19DT05GSUdfTUFTSzsKLQkgICAgYy0+T3B0aW9uIHw9IENPUl9GVU5DX0VOQXxDT1JfSVJFUV9FTkE7Ci0JICAgIGlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0lPQkFTRV8wKQotCQljLT5PcHRpb24gfD0gQ09SX0FERFJfREVDT0RFOwotCX0KLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSVJRX1JFUSkKLQkgICAgaWYgKCEoYy0+aXJxLkF0dHJpYnV0ZXMgJiBJUlFfRk9SQ0VEX1BVTFNFKSkKLQkJYy0+T3B0aW9uIHw9IENPUl9MRVZFTF9SRVE7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19DT1IpPj4xLCAxLCAmYy0+T3B0aW9uKTsKLQltZGVsYXkoNDApOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9TVEFUVVMpIHsKLQljLT5TdGF0dXMgPSByZXEtPlN0YXR1czsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0NDU1IpPj4xLCAxLCAmYy0+U3RhdHVzKTsKLSAgICB9Ci0gICAgaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfUElOX1JFUExBQ0UpIHsKLQljLT5QaW4gPSByZXEtPlBpbjsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX1BSUik+PjEsIDEsICZjLT5QaW4pOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9FWFRfU1RBVFVTKSB7Ci0JYy0+RXh0U3RhdHVzID0gcmVxLT5FeHRTdGF0dXM7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19FU1IpPj4xLCAxLCAmYy0+RXh0U3RhdHVzKTsKLSAgICB9Ci0gICAgaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9CQVNFXzApIHsKLQl1X2NoYXIgYiA9IGMtPmlvLkJhc2VQb3J0MSAmIDB4ZmY7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT0JBU0VfMCk+PjEsIDEsICZiKTsKLQliID0gKGMtPmlvLkJhc2VQb3J0MSA+PiA4KSAmIDB4ZmY7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT0JBU0VfMSk+PjEsIDEsICZiKTsKLSAgICB9Ci0gICAgaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9TSVpFKSB7Ci0JdV9jaGFyIGIgPSBjLT5pby5OdW1Qb3J0czEgKyBjLT5pby5OdW1Qb3J0czIgLSAxOwotCXdyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfSU9TSVpFKT4+MSwgMSwgJmIpOwotICAgIH0KLSAgICAKLSAgICAvKiBDb25maWd1cmUgSS9PIHdpbmRvd3MgKi8KLSAgICBpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKSB7Ci0JaW9tYXAuc3BlZWQgPSBpb19zcGVlZDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKQotCSAgICBpZiAocy0+aW9baV0uTnVtUG9ydHMgIT0gMCkgewotCQlpb21hcC5tYXAgPSBpOwotCQlpb21hcC5mbGFncyA9IE1BUF9BQ1RJVkU7Ci0JCXN3aXRjaCAocy0+aW9baV0uQXR0cmlidXRlcyAmIElPX0RBVEFfUEFUSF9XSURUSCkgewotCQljYXNlIElPX0RBVEFfUEFUSF9XSURUSF8xNjoKLQkJICAgIGlvbWFwLmZsYWdzIHw9IE1BUF8xNkJJVDsgYnJlYWs7Ci0JCWNhc2UgSU9fREFUQV9QQVRIX1dJRFRIX0FVVE86Ci0JCSAgICBpb21hcC5mbGFncyB8PSBNQVBfQVVUT1NaOyBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlvbWFwLnN0YXJ0ID0gcy0+aW9baV0uQmFzZVBvcnQ7Ci0JCWlvbWFwLnN0b3AgPSBpb21hcC5zdGFydCArIHMtPmlvW2ldLk51bVBvcnRzIC0gMTsKLQkJcy0+b3BzLT5zZXRfaW9fbWFwKHMsICZpb21hcCk7Ci0JCXMtPmlvW2ldLkNvbmZpZysrOwotCSAgICB9Ci0gICAgfQotICAgIAotICAgIGMtPnN0YXRlIHw9IENPTkZJR19MT0NLRUQ7Ci0gICAgaGFuZGxlLT5zdGF0ZSB8PSBDTElFTlRfQ09ORklHX0xPQ0tFRDsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogcmVxdWVzdF9jb25maWd1cmF0aW9uICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKLSAgICBSZXF1ZXN0X2lvKCkgcmVzZXJ2ZXMgcmFuZ2VzIG9mIHBvcnQgYWRkcmVzc2VzIGZvciBhIHNvY2tldC4KLSAgICBJIGhhdmUgbm90IGltcGxlbWVudGVkIHJhbmdlIHNoYXJpbmcgb3IgYWxpYXMgYWRkcmVzc2luZy4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX3JlcXVlc3RfaW8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW9fcmVxX3QgKnJlcSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICBjb25maWdfdCAqYzsKLSAgICAKLSAgICBpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgcyA9IFNPQ0tFVChoYW5kbGUpOwotICAgIGlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOwotCi0gICAgaWYgKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfQ0FSREJVUykgewotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0JaGFuZGxlLT5zdGF0ZSB8PSBDTElFTlRfSU9fUkVROwotCXJldHVybiBDU19TVUNDRVNTOwotI2Vsc2UKLQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfRlVOQ1RJT047Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBpZiAoIXJlcSkKLQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLSAgICBjID0gQ09ORklHKGhhbmRsZSk7Ci0gICAgaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKLQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7Ci0gICAgaWYgKGMtPnN0YXRlICYgQ09ORklHX0lPX1JFUSkKLQlyZXR1cm4gQ1NfSU5fVVNFOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMxICYgKElPX1NIQVJFRCB8IElPX0ZPUkNFX0FMSUFTX0FDQ0VTUykpCi0JcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7Ci0gICAgaWYgKChyZXEtPk51bVBvcnRzMiA+IDApICYmCi0JKHJlcS0+QXR0cmlidXRlczIgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkpCi0JcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7Ci0KLSAgICBpZiAoYWxsb2NfaW9fc3BhY2UocywgcmVxLT5BdHRyaWJ1dGVzMSwgJnJlcS0+QmFzZVBvcnQxLAotCQkgICAgICAgcmVxLT5OdW1Qb3J0czEsIHJlcS0+SU9BZGRyTGluZXMpKQotCXJldHVybiBDU19JTl9VU0U7Ci0KLSAgICBpZiAocmVxLT5OdW1Qb3J0czIpIHsKLQlpZiAoYWxsb2NfaW9fc3BhY2UocywgcmVxLT5BdHRyaWJ1dGVzMiwgJnJlcS0+QmFzZVBvcnQyLAotCQkJICAgcmVxLT5OdW1Qb3J0czIsIHJlcS0+SU9BZGRyTGluZXMpKSB7Ci0JICAgIHJlbGVhc2VfaW9fc3BhY2UocywgcmVxLT5CYXNlUG9ydDEsIHJlcS0+TnVtUG9ydHMxKTsKLQkgICAgcmV0dXJuIENTX0lOX1VTRTsKLQl9Ci0gICAgfQotCi0gICAgYy0+aW8gPSAqcmVxOwotICAgIGMtPnN0YXRlIHw9IENPTkZJR19JT19SRVE7Ci0gICAgaGFuZGxlLT5zdGF0ZSB8PSBDTElFTlRfSU9fUkVROwotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiByZXF1ZXN0X2lvICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUmVxdWVzdF9pcnEoKSByZXNlcnZlcyBhbiBpcnEgZm9yIHRoaXMgY2xpZW50LgotCi0gICAgQWxzbywgc2luY2UgTGludXggb25seSByZXNlcnZlcyBpcnEncyB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5Ci0gICAgaG9va2VkLCB3ZSBkb24ndCBndWFyYW50ZWUgdGhhdCBhbiBpcnEgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUKLSAgICB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZC4gIE5vdyB0aGF0IEkgdGhpbmsgYWJvdXQgaXQsCi0gICAgdGhlcmUgbWlnaHQgYmUgYSB3YXkgdG8gZml4IHRoaXMgdXNpbmcgYSBkdW1teSBoYW5kbGVyLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCi1zdGF0aWMgaXJxcmV0dXJuX3QgdGVzdF9hY3Rpb24oaW50IGNwbCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0jZW5kaWYKLQotaW50IHBjbWNpYV9yZXF1ZXN0X2lycShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpcnFfcmVxX3QgKnJlcSkKLXsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQljb25maWdfdCAqYzsKLQlpbnQgcmV0ID0gQ1NfSU5fVVNFLCBpcnEgPSAwOwotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGhhbmRsZV90b19wZGV2KGhhbmRsZSk7Ci0KLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQkJcmV0dXJuIENTX05PX0NBUkQ7Ci0JYyA9IENPTkZJRyhoYW5kbGUpOwotCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCi0JCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSVJRX1JFUSkKLQkJcmV0dXJuIENTX0lOX1VTRTsKLQotI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKLQlpZiAocy0+aXJxLkFzc2lnbmVkSVJRICE9IDApIHsKLQkJLyogSWYgdGhlIGludGVycnVwdCBpcyBhbHJlYWR5IGFzc2lnbmVkLCBpdCBtdXN0IGJlIHRoZSBzYW1lICovCi0JCWlycSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKLQl9IGVsc2UgewotCQlpbnQgdHJ5OwotCQl1MzIgbWFzayA9IHMtPmlycV9tYXNrOwotCQl2b2lkICpkYXRhID0gTlVMTDsKLQotCQlmb3IgKHRyeSA9IDA7IHRyeSA8IDY0OyB0cnkrKykgewotCQkJaXJxID0gdHJ5ICUgMzI7Ci0KLQkJCS8qIG1hcmtlZCBhcyBhdmFpbGFibGUgYnkgZHJpdmVyLCBhbmQgbm90IGJsb2NrZWQgYnkgdXNlcnNwYWNlPyAqLwotCQkJaWYgKCEoKG1hc2sgPj4gaXJxKSAmIDEpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiBhdm9pZCBhbiBJUlEgd2hpY2ggaXMgYWxyZWFkeSB1c2VkIGJ5IGEgUENNQ0lBIGNhcmQgKi8KLQkJCWlmICgodHJ5IDwgMzIpICYmIHBjbWNpYV91c2VkX2lycVtpcnFdKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiByZWdpc3RlciB0aGUgY29ycmVjdCBkcml2ZXIsIGlmIHBvc3NpYmxlLCBvZiBjaGVjayB3aGV0aGVyCi0JCQkgKiByZWdpc3RlcmluZyBhIGR1bW15IGhhbmRsZSB3b3JrcywgaS5lLiBpZiB0aGUgSVJRIGlzbid0Ci0JCQkgKiBtYXJrZWQgYXMgdXNlZCBieSB0aGUga2VybmVsIHJlc291cmNlIG1hbmFnZW1lbnQgY29yZSAqLwotCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLAotCQkJCQkgIChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpID8gcmVxLT5IYW5kbGVyIDogdGVzdF9hY3Rpb24sCi0JCQkJCSAgKChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcpIHx8Ci0JCQkJCSAgIChzLT5mdW5jdGlvbnMgPiAxKSB8fAotCQkJCQkgICAoaXJxID09IHMtPnBjaV9pcnEpKSA/IFNBX1NISVJRIDogMCwKLQkJCQkJICBwX2Rldi0+ZGV2LmJ1c19pZCwKLQkJCQkJICAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSA/IHJlcS0+SW5zdGFuY2UgOiBkYXRhKTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJaWYgKCEocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSkKLQkJCQkJZnJlZV9pcnEoaXJxLCBkYXRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCWlmIChyZXQpIHsKLQkJaWYgKCFzLT5wY2lfaXJxKQotCQkJcmV0dXJuIHJldDsKLQkJaXJxID0gcy0+cGNpX2lycTsKLQl9Ci0KLQlpZiAocmV0ICYmIHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgewotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCByZXEtPkhhbmRsZXIsCi0JCQkJKChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcpIHx8Ci0JCQkJIChzLT5mdW5jdGlvbnMgPiAxKSB8fAotCQkJCSAoaXJxID09IHMtPnBjaV9pcnEpKSA/IFNBX1NISVJRIDogMCwKLQkJCQlwX2Rldi0+ZGV2LmJ1c19pZCwgcmVxLT5JbnN0YW5jZSkpCi0JCQlyZXR1cm4gQ1NfSU5fVVNFOwotCX0KLQotCWMtPmlycS5BdHRyaWJ1dGVzID0gcmVxLT5BdHRyaWJ1dGVzOwotCXMtPmlycS5Bc3NpZ25lZElSUSA9IHJlcS0+QXNzaWduZWRJUlEgPSBpcnE7Ci0Jcy0+aXJxLkNvbmZpZysrOwotCi0JYy0+c3RhdGUgfD0gQ09ORklHX0lSUV9SRVE7Ci0JaGFuZGxlLT5zdGF0ZSB8PSBDTElFTlRfSVJRX1JFUTsKLQotI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKLQlwY21jaWFfdXNlZF9pcnFbaXJxXSsrOwotI2VuZGlmCi0KLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogcGNtY2lhX3JlcXVlc3RfaXJxICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUmVxdWVzdF93aW5kb3coKSBlc3RhYmxpc2hlcyBhIG1hcHBpbmcgYmV0d2VlbiBjYXJkIG1lbW9yeSBzcGFjZQotICAgIGFuZCBzeXN0ZW0gbWVtb3J5IHNwYWNlLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgd2luX3JlcV90ICpyZXEsIHdpbmRvd19oYW5kbGVfdCAqd2gpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgd2luZG93X3QgKndpbjsKLSAgICB1X2xvbmcgYWxpZ247Ci0gICAgaW50IHc7Ci0gICAgCi0gICAgaWYgKENIRUNLX0hBTkRMRSgqaGFuZGxlKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBzID0gKCpoYW5kbGUpLT5Tb2NrZXQ7Ci0gICAgaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIChXSU5fUEFHRUQgfCBXSU5fU0hBUkVEKSkKLQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKLQotICAgIC8qIFdpbmRvdyBzaXplIGRlZmF1bHRzIHRvIHNtYWxsZXN0IGF2YWlsYWJsZSAqLwotICAgIGlmIChyZXEtPlNpemUgPT0gMCkKLQlyZXEtPlNpemUgPSBzLT5tYXBfc2l6ZTsKLSAgICBhbGlnbiA9ICgoKHMtPmZlYXR1cmVzICYgU1NfQ0FQX01FTV9BTElHTikgfHwKLQkgICAgICAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX1NUUklDVF9BTElHTikpID8KLQkgICAgIHJlcS0+U2l6ZSA6IHMtPm1hcF9zaXplKTsKLSAgICBpZiAocmVxLT5TaXplICYgKHMtPm1hcF9zaXplLTEpKQotCXJldHVybiBDU19CQURfU0laRTsKLSAgICBpZiAoKHJlcS0+QmFzZSAmJiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkpIHx8Ci0JKHJlcS0+QmFzZSAmIChhbGlnbi0xKSkpCi0JcmV0dXJuIENTX0JBRF9CQVNFOwotICAgIGlmIChyZXEtPkJhc2UpCi0JYWxpZ24gPSAwOwotCi0gICAgLyogQWxsb2NhdGUgc3lzdGVtIG1lbW9yeSB3aW5kb3cgKi8KLSAgICBmb3IgKHcgPSAwOyB3IDwgTUFYX1dJTjsgdysrKQotCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1dJTl9SRVEodykpKSBicmVhazsKLSAgICBpZiAodyA9PSBNQVhfV0lOKQotCXJldHVybiBDU19PVVRfT0ZfUkVTT1VSQ0U7Ci0KLSAgICB3aW4gPSAmcy0+d2luW3ddOwotICAgIHdpbi0+bWFnaWMgPSBXSU5ET1dfTUFHSUM7Ci0gICAgd2luLT5pbmRleCA9IHc7Ci0gICAgd2luLT5oYW5kbGUgPSAqaGFuZGxlOwotICAgIHdpbi0+c29jayA9IHM7Ci0KLSAgICBpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgewotCXdpbi0+Y3RsLnJlcyA9IGZpbmRfbWVtX3JlZ2lvbihyZXEtPkJhc2UsIHJlcS0+U2l6ZSwgYWxpZ24sCi0JCQkJICAgICAgIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fTUFQX0JFTE9XXzFNQiksIHMpOwotCWlmICghd2luLT5jdGwucmVzKQotCSAgICByZXR1cm4gQ1NfSU5fVVNFOwotICAgIH0KLSAgICAoKmhhbmRsZSktPnN0YXRlIHw9IENMSUVOVF9XSU5fUkVRKHcpOwotCi0gICAgLyogQ29uZmlndXJlIHRoZSBzb2NrZXQgY29udHJvbGxlciAqLwotICAgIHdpbi0+Y3RsLm1hcCA9IHcrMTsKLSAgICB3aW4tPmN0bC5mbGFncyA9IDA7Ci0gICAgd2luLT5jdGwuc3BlZWQgPSByZXEtPkFjY2Vzc1NwZWVkOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fTUVNT1JZX1RZUEUpCi0Jd2luLT5jdGwuZmxhZ3MgfD0gTUFQX0FUVFJJQjsKLSAgICBpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX0VOQUJMRSkKLQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfQUNUSVZFOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fREFUQV9XSURUSF8xNikKLQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfMTZCSVQ7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9VU0VfV0FJVCkKLQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfVVNFX1dBSVQ7Ci0gICAgd2luLT5jdGwuY2FyZF9zdGFydCA9IDA7Ci0gICAgaWYgKHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKSAhPSAwKQotCXJldHVybiBDU19CQURfQVJHUzsKLSAgICBzLT5zdGF0ZSB8PSBTT0NLRVRfV0lOX1JFUSh3KTsKLQotICAgIC8qIFJldHVybiB3aW5kb3cgaGFuZGxlICovCi0gICAgaWYgKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1NUQVRJQ19NQVApIHsKLQlyZXEtPkJhc2UgPSB3aW4tPmN0bC5zdGF0aWNfc3RhcnQ7Ci0gICAgfSBlbHNlIHsKLQlyZXEtPkJhc2UgPSB3aW4tPmN0bC5yZXMtPnN0YXJ0OwotICAgIH0KLSAgICAqd2ggPSB3aW47Ci0gICAgCi0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIHJlcXVlc3Rfd2luZG93ICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgSSdtIG5vdCBzdXJlIHdoaWNoICJyZXNldCIgZnVuY3Rpb24gdGhpcyBpcyBzdXBwb3NlZCB0byB1c2UsCi0gICAgYnV0IGZvciBub3csIGl0IHVzZXMgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UncyByZXNldCwgbm90IHRoZQotICAgIENJUyByZWdpc3Rlci4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogSSdtIG5vdCBzdXJlIHdoaWNoICJyZXNldCIgZnVuY3Rpb24gdGhpcyBpcyBzdXBwb3NlZCB0byB1c2UsCisgKiBidXQgZm9yIG5vdywgaXQgdXNlcyB0aGUgbG93LWxldmVsIGludGVyZmFjZSdzIHJlc2V0LCBub3QgdGhlCisgKiBDSVMgcmVnaXN0ZXIuCisgKi8KIAogaW50IHBjY2FyZF9yZXNldF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaW50IHJldDsKLSAgICAKKwogCWNzX2RiZyhza3QsIDEsICJyZXNldHRpbmcgc29ja2V0XG4iKTsKIAogCWRvd24oJnNrdC0+c2t0X3NlbSk7CkBAIC0xNzU3LDE3ICs3ODQsMTQgQEAKIH0gLyogcmVzZXRfY2FyZCAqLwogRVhQT1JUX1NZTUJPTChwY2NhcmRfcmVzZXRfY2FyZCk7CiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICAgVGhlc2Ugc2h1dCBkb3duIG9yIHdha2UgdXAgYSBzb2NrZXQuICBUaGV5IGFyZSBzb3J0IG9mIHVzZXIKLSAgICBpbml0aWF0ZWQgdmVyc2lvbnMgb2YgdGhlIEFQTSBzdXNwZW5kIGFuZCByZXN1bWUgYWN0aW9ucy4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCisvKiBUaGVzZSBzaHV0IGRvd24gb3Igd2FrZSB1cCBhIHNvY2tldC4gIFRoZXkgYXJlIHNvcnQgb2YgdXNlcgorICogaW5pdGlhdGVkIHZlcnNpb25zIG9mIHRoZSBBUE0gc3VzcGVuZCBhbmQgcmVzdW1lIGFjdGlvbnMuCisgKi8KIGludCBwY21jaWFfc3VzcGVuZF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaW50IHJldDsKLSAgICAKKwogCWNzX2RiZyhza3QsIDEsICJzdXNwZW5kaW5nIHNvY2tldFxuIik7CiAKIAlkb3duKCZza3QtPnNrdF9zZW0pOwpAQCAtMTc4Niw2ICs4MTAsOCBAQAogCiAJcmV0dXJuIHJldDsKIH0gLyogc3VzcGVuZF9jYXJkICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9zdXNwZW5kX2NhcmQpOworCiAKIGludCBwY21jaWFfcmVzdW1lX2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKQEAgLTE4MDksMTMgKzgzNSwxMCBAQAogCiAJcmV0dXJuIHJldDsKIH0gLyogcmVzdW1lX2NhcmQgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3Jlc3VtZV9jYXJkKTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSAgICBUaGVzZSBoYW5kbGUgdXNlciByZXF1ZXN0cyB0byBlamVjdCBvciBpbnNlcnQgYSBjYXJkLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KKy8qIFRoZXNlIGhhbmRsZSB1c2VyIHJlcXVlc3RzIHRvIGVqZWN0IG9yIGluc2VydCBhIGNhcmQuICovCiBpbnQgcGNtY2lhX2VqZWN0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpbnQgcmV0OwpAQCAtMTg0Miw2ICs4NjUsOCBAQAogCiAJcmV0dXJuIHJldDsKIH0gLyogZWplY3RfY2FyZCAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfZWplY3RfY2FyZCk7CisKIAogaW50IHBjbWNpYV9pbnNlcnRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogewpAQCAtMTg2NSwzNyArODkwLDM4IEBACiAKIAlyZXR1cm4gcmV0OwogfSAvKiBpbnNlcnRfY2FyZCAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIE9TLXNwZWNpZmljIG1vZHVsZSBnbHVlIGdvZXMgaGVyZQotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBpbiBhbHBoYSBvcmRlciAqLwotRVhQT1JUX1NZTUJPTChwY21jaWFfZWplY3RfY2FyZCk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfY2FyZF9zZXJ2aWNlc19pbmZvKTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9tZW1fcGFnZSk7CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9pbnNlcnRfY2FyZCk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9tYXBfbWVtX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX3JlbGVhc2VfaW8pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV9pcnEpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV93aW5kb3cpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVwbGFjZV9jaXMpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX3JlcXVlc3RfaW8pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9pcnEpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF93aW5kb3cpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVzdW1lX2NhcmQpOwotRVhQT1JUX1NZTUJPTChwY21jaWFfc3VzcGVuZF9jYXJkKTsKIAotRVhQT1JUX1NZTUJPTChkZWFkX3NvY2tldCk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9wYXJzZV9ldmVudHMpOworCitzdGF0aWMgaW50IHBjbWNpYV9zb2NrZXRfaG90cGx1ZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLAorCQkJCWludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCwgZGV2KTsKKwlpbnQgaSA9IDAsIGxlbmd0aCA9IDA7CisKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsCisJCQkJJmxlbmd0aCwgIlNPQ0tFVF9OTz0ldSIsIHMtPnNvY2spKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIHBjbWNpYV91bmxvYWQ7CisKK3N0YXRpYyB2b2lkIHBjbWNpYV9yZWxlYXNlX3NvY2tldF9jbGFzcyhzdHJ1Y3QgY2xhc3MgKmRhdGEpCit7CisJY29tcGxldGUoJnBjbWNpYV91bmxvYWQpOworfQorCiAKIHN0cnVjdCBjbGFzcyBwY21jaWFfc29ja2V0X2NsYXNzID0gewogCS5uYW1lID0gInBjbWNpYV9zb2NrZXQiLAorICAgICAgICAuaG90cGx1ZyA9IHBjbWNpYV9zb2NrZXRfaG90cGx1ZywKIAkucmVsZWFzZSA9IHBjbWNpYV9yZWxlYXNlX3NvY2tldCwKKwkuY2xhc3NfcmVsZWFzZSA9IHBjbWNpYV9yZWxlYXNlX3NvY2tldF9jbGFzcywKIH07CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9zb2NrZXRfY2xhc3MpOwogCkBAIC0xOTAzLDkgKzkyOSw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjbWNpYV9jcyh2b2lkKQogewogCWludCByZXQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHJlbGVhc2UpOwotCXByaW50ayhLRVJOX0lORk8gIiAgJXNcbiIsIG9wdGlvbnMpOwogCisJaW5pdF9jb21wbGV0aW9uKCZwY21jaWFfdW5sb2FkKTsKIAlyZXQgPSBjbGFzc19yZWdpc3RlcigmcGNtY2lhX3NvY2tldF9jbGFzcyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIChyZXQpOwpAQCAtMTkxNCwxMyArOTM5LDEyIEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3BjbWNpYV9jcyh2b2lkKQogewotICAgIHByaW50ayhLRVJOX0lORk8gInVubG9hZGluZyBLZXJuZWwgQ2FyZCBTZXJ2aWNlc1xuIik7Ci0gICAgY2xhc3NfaW50ZXJmYWNlX3VucmVnaXN0ZXIoJnBjY2FyZF9zeXNmc19pbnRlcmZhY2UpOwotICAgIGNsYXNzX3VucmVnaXN0ZXIoJnBjbWNpYV9zb2NrZXRfY2xhc3MpOworCWNsYXNzX2ludGVyZmFjZV91bnJlZ2lzdGVyKCZwY2NhcmRfc3lzZnNfaW50ZXJmYWNlKTsKKwljbGFzc191bnJlZ2lzdGVyKCZwY21jaWFfc29ja2V0X2NsYXNzKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBjbWNpYV91bmxvYWQpOwogfQogCiBzdWJzeXNfaW5pdGNhbGwoaW5pdF9wY21jaWFfY3MpOwogbW9kdWxlX2V4aXQoZXhpdF9wY21jaWFfY3MpOwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaCBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKaW5kZXggNzkzM2E3ZC4uNmJiZmJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCkBAIC05OSwyMyArOTksMTEgQEAKIAl9CiB9CiAKLSNkZWZpbmUgQ0hFQ0tfSEFORExFKGgpIFwKLSAgICAoKChoKSA9PSBOVUxMKSB8fCAoKGgpLT5jbGllbnRfbWFnaWMgIT0gQ0xJRU5UX01BR0lDKSkKLQogI2RlZmluZSBDSEVDS19TT0NLRVQocykgXAogICAgICgoKHMpID49IHNvY2tldHMpIHx8IChzb2NrZXRfdGFibGVbc10tPm9wcyA9PSBOVUxMKSkKIAotI2RlZmluZSBTT0NLRVQoaCkgKGgtPlNvY2tldCkKLSNkZWZpbmUgQ09ORklHKGgpICgmU09DS0VUKGgpLT5jb25maWdbKGgpLT5GdW5jdGlvbl0pCi0KLSNkZWZpbmUgQ0hFQ0tfUkVHSU9OKHIpIFwKLSAgICAoKChyKSA9PSBOVUxMKSB8fCAoKHIpLT5yZWdpb25fbWFnaWMgIT0gUkVHSU9OX01BR0lDKSkKLQotI2RlZmluZSBDSEVDS19FUkFTRVEocSkgXAotICAgICgoKHEpID09IE5VTEwpIHx8ICgocSktPmVyYXNlcV9tYWdpYyAhPSBFUkFTRVFfTUFHSUMpKQotCi0jZGVmaW5lIEVWRU5UKGgsIGUsIHApIFwKLSAgICAoKGgpLT5ldmVudF9oYW5kbGVyKChlKSwgKHApLCAmKGgpLT5ldmVudF9jYWxsYmFja19hcmdzKSkKKyNkZWZpbmUgU09DS0VUKGgpIChoLT5zb2NrZXQpCisjZGVmaW5lIENPTkZJRyhoKSAoJlNPQ0tFVChoKS0+Y29uZmlnWyhoKS0+ZnVuY10pCiAKIC8qIEluIGNhcmRidXMuYyAqLwogaW50IGNiX2FsbG9jKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKQEAgLTEyMyw5ICsxMTEsOSBAQAogaW50IHJlYWRfY2JfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgc3BhY2UsIHVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKTsKIAogLyogSW4gY2lzdHBsLmMgKi8KLWludCByZWFkX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAoraW50IHBjbWNpYV9yZWFkX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAogCQkgdV9pbnQgYWRkciwgdV9pbnQgbGVuLCB2b2lkICpwdHIpOwotdm9pZCB3cml0ZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwKK3ZvaWQgcGNtY2lhX3dyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAogCQkgICB1X2ludCBhZGRyLCB1X2ludCBsZW4sIHZvaWQgKnB0cik7CiB2b2lkIHJlbGVhc2VfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiB2b2lkIGRlc3Ryb3lfY2lzX2NhY2hlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKQEAgLTEzNCwxMyArMTIyLDEyIEBACiAKIC8qIEluIHJzcmNfbWdyICovCiB2b2lkIHBjbWNpYV92YWxpZGF0ZV9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwotc3RydWN0IHJlc291cmNlICpmaW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sIHVuc2lnbmVkIGxvbmcgYWxpZ24sCitzdHJ1Y3QgcmVzb3VyY2UgKnBjbWNpYV9maW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sIHVuc2lnbmVkIGxvbmcgYWxpZ24sCiAJCSAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLWludCBhZGp1c3RfaW9fcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCitpbnQgcGNtY2lhX2FkanVzdF9pb19yZWdpb24oc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgcl9zdGFydCwKIAkJICAgICB1bnNpZ25lZCBsb25nIHJfZW5kLCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci1zdHJ1Y3QgcmVzb3VyY2UgKmZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgdV9sb25nIGFsaWduLAorc3RydWN0IHJlc291cmNlICpwY21jaWFfZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLCB1X2xvbmcgYWxpZ24sCiAJCSAgICBpbnQgbG93LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci1pbnQgYWRqdXN0X3Jlc291cmNlX2luZm8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgYWRqdXN0X3QgKmFkaik7CiB2b2lkIHJlbGVhc2VfcmVzb3VyY2VfZGIoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwogCiAvKiBJbiBzb2NrZXRfc3lzZnMuYyAqLwpAQCAtMTU5LDcgKzE0Niw3IEBACiBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrewogCXN0cnVjdCBtb2R1bGUJKm93bmVyOwogCWludAkJKCpldmVudCkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpOwotCWludAkJKCpyZXNvdXJjZXNfZG9uZSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwl2b2lkCQkoKnJlcXVlcnkpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiB9OwogCiBpbnQgcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjbWNpYV9jYWxsYmFjayAqYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCA1NjllNTVmLi4zZTNjNmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTEwLDQ0ICsxMCwyOSBAQAogICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogKEMpIDE5OTkJCURhdmlkIEEuIEhpbmRzCi0gKiAoQykgMjAwMyAtIDIwMDQJRG9taW5payBCcm9kb3dza2kKKyAqIChDKSAyMDAzIC0gMjAwNQlEb21pbmlrIEJyb2Rvd3NraQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2J1bGttZW0uaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAKICNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRzX2ludGVybmFsLmgiCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCkBAIC03MCw0OSArNTUsOSBAQAogI2RlZmluZSBkc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKIAotLyogRGV2aWNlIHVzZXIgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgTUFYX0VWRU5UUwkzMgotI2RlZmluZSBVU0VSX01BR0lDCTB4N2VhNAotI2RlZmluZSBDSEVDS19VU0VSKHUpIFwKLSAgICAoKCh1KSA9PSBOVUxMKSB8fCAoKHUpLT51c2VyX21hZ2ljICE9IFVTRVJfTUFHSUMpKQotdHlwZWRlZiBzdHJ1Y3QgdXNlcl9pbmZvX3QgewotICAgIHVfaW50CQl1c2VyX21hZ2ljOwotICAgIGludAkJCWV2ZW50X2hlYWQsIGV2ZW50X3RhaWw7Ci0gICAgZXZlbnRfdAkJZXZlbnRbTUFYX0VWRU5UU107Ci0gICAgc3RydWN0IHVzZXJfaW5mb190CSpuZXh0OwotICAgIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqc29ja2V0OwotfSB1c2VyX2luZm9fdDsKLQotLyogU29ja2V0IHN0YXRlIGluZm9ybWF0aW9uICovCi1zdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgewotCXN0cnVjdCBrcmVmCQlyZWZjb3VudDsKLQlzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrCWNhbGxiYWNrOwotCWludAkJCXN0YXRlOwotCXVzZXJfaW5mb190CQkqdXNlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlxdWV1ZTsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldAkqcGFyZW50OwotCi0JLyogdGhlIFBDTUNJQSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGlzIHNvY2tldCAobm9ybWFsbHkgb25lLCBtb3JlCi0JICogZm9yIG11bHRpZnVuY3Rpb24gZGV2aWNlczogKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWRldmljZXNfbGlzdDsKLQl1OAkJCWRldmljZV9jb3VudDsgLyogdGhlIG51bWJlciBvZiBkZXZpY2VzLCB1c2VkCi0JCQkJCSAgICAgICAqIG9ubHkgaW50ZXJuYWxseSBhbmQgc3ViamVjdAotCQkJCQkgICAgICAgKiB0byBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KLX07Ci1zdGF0aWMgc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKLQotI2RlZmluZSBEU19TT0NLRVRfUFJFU0VOVAkJMHgwMQotI2RlZmluZSBEU19TT0NLRVRfQlVTWQkJCTB4MDIKLSNkZWZpbmUgRFNfU09DS0VUX1JFTU9WQUxfUEVORElORwkweDEwCi0jZGVmaW5lIERTX1NPQ0tFVF9ERUFECQkJMHg4MAotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBtYWpvcl9kZXYgPSAtMTsKLQotc3RhdGljIGludCB1bmJpbmRfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMpOworc3RhdGljIGludCB1bmJpbmRfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCkBAIC0yMTMsMTcgKzE1OCwxNSBAQAogfTsKIAogCi1pbnQgcGNtY2lhX3JlcG9ydF9lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBlcnJvcl9pbmZvX3QgKmVycikKK3N0YXRpYyBpbnQgcGNtY2lhX3JlcG9ydF9lcnJvcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGVycm9yX2luZm9fdCAqZXJyKQogewogCWludCBpOwogCWNoYXIgKnNlcnY7CiAKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCisJaWYgKCFwX2RldikKIAkJcHJpbnRrKEtFUk5fTk9USUNFKTsKLQllbHNlIHsKLQkJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gaGFuZGxlX3RvX3BkZXYoaGFuZGxlKTsKKwllbHNlCiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZXJ2aWNlX3RhYmxlKTsgaSsrKQogCQlpZiAoc2VydmljZV90YWJsZVtpXS5rZXkgPT0gZXJyLT5mdW5jKQpAQCAtMjQzLDQxICsxODYsMTE2IEBACiAKIAlyZXR1cm4gQ1NfU1VDQ0VTUzsKIH0gLyogcmVwb3J0X2Vycm9yICovCi1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXBvcnRfZXJyb3IpOwogCiAvKiBlbmQgb2YgY29kZSB3aGljaCB3YXMgaW4gY3MuYyBiZWZvcmUgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotdm9pZCBjc19lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpbnQgZnVuYywgaW50IHJldCkKK3ZvaWQgY3NfZXJyb3Ioc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpbnQgZnVuYywgaW50IHJldCkKIHsKIAllcnJvcl9pbmZvX3QgZXJyID0geyBmdW5jLCByZXQgfTsKLQlwY21jaWFfcmVwb3J0X2Vycm9yKGhhbmRsZSwgJmVycik7CisJcGNtY2lhX3JlcG9ydF9lcnJvcihwX2RldiwgJmVycik7CiB9CiBFWFBPUlRfU1lNQk9MKGNzX2Vycm9yKTsKIAorCitzdGF0aWMgdm9pZCBwY21jaWFfY2hlY2tfZHJpdmVyKHN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydikKK3sKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCAqZGlkID0gcF9kcnYtPmlkX3RhYmxlOworCXVuc2lnbmVkIGludCBpOworCXUzMiBoYXNoOworCisJaWYgKCFwX2Rydi0+YXR0YWNoIHx8ICFwX2Rydi0+ZXZlbnQgfHwgIXBfZHJ2LT5kZXRhY2gpCisJCXByaW50ayhLRVJOX0RFQlVHICJwY21jaWE6ICVzIGRvZXMgbWlzc2VzIGEgY2FsbGJhY2sgZnVuY3Rpb24iLAorCQkgICAgICAgcF9kcnYtPmRydi5uYW1lKTsKKworCXdoaWxlIChkaWQgJiYgZGlkLT5tYXRjaF9mbGFncykgeworCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCWlmICghZGlkLT5wcm9kX2lkW2ldKQorCQkJCWNvbnRpbnVlOworCisJCQloYXNoID0gY3JjMzIoMCwgZGlkLT5wcm9kX2lkW2ldLCBzdHJsZW4oZGlkLT5wcm9kX2lkW2ldKSk7CisJCQlpZiAoaGFzaCA9PSBkaWQtPnByb2RfaWRfaGFzaFtpXSkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbWNpYTogJXM6IGludmFsaWQgaGFzaCBmb3IgIgorCQkJICAgICAgICJwcm9kdWN0IHN0cmluZyBcIiVzXCI6IGlzIDB4JXgsIHNob3VsZCAiCisJCQkgICAgICAgImJlIDB4JXhcbiIsIHBfZHJ2LT5kcnYubmFtZSwgZGlkLT5wcm9kX2lkW2ldLAorCQkJICAgICAgIGRpZC0+cHJvZF9pZF9oYXNoW2ldLCBoYXNoKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJwY21jaWE6IHNlZSAiCisJCQkJIkRvY3VtZW50YXRpb24vcGNtY2lhL2RldmljZXRhYmxlLnR4dCBmb3IgIgorCQkJCSJkZXRhaWxzXG4iKTsKKwkJfQorCQlkaWQrKzsKKwl9CisKKwlyZXR1cm47Cit9CisKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTE9BRF9DSVMKKworLyoqCisgKiBwY21jaWFfbG9hZF9maXJtd2FyZSAtIGxvYWQgQ0lTIGZyb20gdXNlcnNwYWNlIGlmIGRldmljZS1wcm92aWRlZCBpcyBicm9rZW4KKyAqIEBkZXYgLSB0aGUgcGNtY2lhIGRldmljZSB3aGljaCBuZWVkcyBhIENJUyBvdmVycmlkZQorICogQGZpbGVuYW1lIC0gcmVxdWVzdGVkIGZpbGVuYW1lIGluIC9saWIvZmlybXdhcmUvY2lzLworICoKKyAqIFRoaXMgdXNlcyB0aGUgaW4ta2VybmVsIGZpcm13YXJlIGxvYWRpbmcgbWVjaGFuaXNtIHRvIHVzZSBhICJmYWtlIENJUyIgaWYKKyAqIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlIGNhcmQgaXMgYnJva2VuLiBUaGUgZmlybXdhcmUgZmlsZXMgcmVzaWRlIGluCisgKiAvbGliL2Zpcm13YXJlL2Npcy8gaW4gdXNlcnNwYWNlLgorICovCitzdGF0aWMgaW50IHBjbWNpYV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYsIGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGRldi0+c29ja2V0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY2hhciBwYXRoWzIwXTsKKwlpbnQgcmV0PS1FTk9NRU07CisJY2lzZHVtcF90ICpjaXM7CisKKwlpZiAoIWZpbGVuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRzX2RiZygxLCAidHJ5aW5nIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGZpbGVuYW1lKTsKKworCWlmIChzdHJsZW4oZmlsZW5hbWUpID4gMTQpCisJCXJldHVybiAtRUlOVkFMOworCisJc25wcmludGYocGF0aCwgMjAsICIlcyIsIGZpbGVuYW1lKTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgcGF0aCwgJmRldi0+ZGV2KSA9PSAwKSB7CisJCWlmIChmdy0+c2l6ZSA+PSBDSVNUUExfTUFYX0NJU19TSVpFKQorCQkJZ290byByZWxlYXNlOworCisJCWNpcyA9IGttYWxsb2Moc2l6ZW9mKGNpc2R1bXBfdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNpcykKKwkJCWdvdG8gcmVsZWFzZTsKKworCQltZW1zZXQoY2lzLCAwLCBzaXplb2YoY2lzZHVtcF90KSk7CisKKwkJY2lzLT5MZW5ndGggPSBmdy0+c2l6ZSArIDE7CisJCW1lbWNweShjaXMtPkRhdGEsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkJaWYgKCFwY21jaWFfcmVwbGFjZV9jaXMocywgY2lzKSkKKwkJCXJldCA9IDA7CisJfQorIHJlbGVhc2U6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfUENNQ0lBX0xPQURfQ0lTICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYsIGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2VuZGlmCisKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyICogZ2V0X3BjbWNpYV9kcml2ZXIgKGRldl9pbmZvX3QgKmRldl9pbmZvKTsKLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKiBnZXRfc29ja2V0X2luZm9fYnlfbnIodW5zaWduZWQgaW50IG5yKTsKLQotc3RhdGljIHZvaWQgcGNtY2lhX3JlbGVhc2VfYnVzX3NvY2tldChzdHJ1Y3Qga3JlZiAqcmVmY291bnQpCi17Ci0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzID0gY29udGFpbmVyX29mKHJlZmNvdW50LCBzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQsIHJlZmNvdW50KTsKLQlwY21jaWFfcHV0X3NvY2tldChzLT5wYXJlbnQpOwotCWtmcmVlKHMpOwotfQotCi1zdGF0aWMgdm9pZCBwY21jaWFfcHV0X2J1c19zb2NrZXQoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzKQotewotCWtyZWZfcHV0KCZzLT5yZWZjb3VudCwgcGNtY2lhX3JlbGVhc2VfYnVzX3NvY2tldCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnBjbWNpYV9nZXRfYnVzX3NvY2tldChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMpCi17Ci0Ja3JlZl9nZXQoJnMtPnJlZmNvdW50KTsKLQlyZXR1cm4gKHMpOwotfQogCiAvKioKICAqIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIFBDTUNJQSBkcml2ZXIgd2l0aCB0aGUgYnVzIGNvcmUKQEAgLTI5Miw2ICszMTAsOCBAQAogCWlmICghZHJpdmVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXBjbWNpYV9jaGVja19kcml2ZXIoZHJpdmVyKTsKKwogCS8qIGluaXRpYWxpemUgY29tbW9uIGZpZWxkcyAqLwogCWRyaXZlci0+ZHJ2LmJ1cyA9ICZwY21jaWFfYnVzX3R5cGU7CiAJZHJpdmVyLT5kcnYub3duZXIgPSBkcml2ZXItPm93bmVyOwpAQCAtMzExLDQyICszMzEsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BjY2FyZCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2soc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgdm9pZCAqZCkKLXsKLQljaGFyICoqcCA9IGQ7Ci0Jc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2ID0gY29udGFpbmVyX29mKGRyaXZlciwKLQkJCQkJCSAgIHN0cnVjdCBwY21jaWFfZHJpdmVyLCBkcnYpOwotCi0JKnAgKz0gc3ByaW50ZigqcCwgIiUtMjQuMjRzIDEgJWRcbiIsIHBfZHJ2LT5kcnYubmFtZSwKLSNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAotCQkgICAgICAocF9kcnYtPm93bmVyKSA/IG1vZHVsZV9yZWZjb3VudChwX2Rydi0+b3duZXIpIDogMQotI2Vsc2UKLQkJICAgICAgMQotI2VuZGlmCi0JKTsKLQlkID0gKHZvaWQgKikgcDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByb2NfcmVhZF9kcml2ZXJzKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBwb3MsCi0JCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JY2hhciAqcCA9IGJ1ZjsKLQotCWJ1c19mb3JfZWFjaF9kcnYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgCi0JCQkgKHZvaWQgKikgJnAsIHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKTsKLQotCXJldHVybiAocCAtIGJ1Zik7Ci19Ci0jZW5kaWYKIAogLyogcGNtY2lhX2RldmljZSBoYW5kbGluZyAqLwogCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCitzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9nZXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICp0bXBfZGV2OwogCXRtcF9kZXYgPSBnZXRfZGV2aWNlKCZwX2Rldi0+ZGV2KTsKQEAgLTM1NSw3ICszNDMsNyBAQAogCXJldHVybiB0b19wY21jaWFfZGV2KHRtcF9kZXYpOwogfQogCi1zdGF0aWMgdm9pZCBwY21jaWFfcHV0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCit2b2lkIHBjbWNpYV9wdXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKIHsKIAlpZiAocF9kZXYpCiAJCXB1dF9kZXZpY2UoJnBfZGV2LT5kZXYpOwpAQCAtMzY1LDcgKzM1Myw3IEBACiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCWRzX2RiZygxLCAicmVsZWFzaW5nIGRldiAlcFxuIiwgcF9kZXYpOwotCXBjbWNpYV9wdXRfYnVzX3NvY2tldChwX2Rldi0+c29ja2V0LT5wY21jaWEpOworCXBjbWNpYV9wdXRfc29ja2V0KHBfZGV2LT5zb2NrZXQpOwogCWtmcmVlKHBfZGV2KTsKIH0KIApAQCAtMzkwLDcgKzM3OCw3IEBACiAKIAlpZiAocF9kcnYtPmF0dGFjaCkgewogCQlwX2Rldi0+aW5zdGFuY2UgPSBwX2Rydi0+YXR0YWNoKCk7Ci0JCWlmICgoIXBfZGV2LT5pbnN0YW5jZSkgfHwgKHBfZGV2LT5jbGllbnQuc3RhdGUgJiBDTElFTlRfVU5CT1VORCkpIHsKKwkJaWYgKCghcF9kZXYtPmluc3RhbmNlKSB8fCAocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1VOQk9VTkQpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImRzOiB1bmFibGUgdG8gY3JlYXRlIGluc3RhbmNlICIKIAkJCSAgICAgICAib2YgJyVzJyFcbiIsIHBfZHJ2LT5kcnYubmFtZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtNTAwLDQyICs0ODgsNDUgQEAKICAqLwogc3RhdGljIERFQ0xBUkVfTVVURVgoZGV2aWNlX2FkZF9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlICogcGNtY2lhX2RldmljZV9hZGQoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCitzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9kZXZpY2VfYWRkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzID0gcGNtY2lhX2dldF9idXNfc29ja2V0KHMpOworCXMgPSBwY21jaWFfZ2V0X3NvY2tldChzKTsKIAlpZiAoIXMpCiAJCXJldHVybiBOVUxMOwogCiAJZG93bigmZGV2aWNlX2FkZF9sb2NrKTsKIAorCS8qIG1heCBvZiAyIGRldmljZXMgcGVyIGNhcmQgKi8KKwlpZiAocy0+ZGV2aWNlX2NvdW50ID09IDIpCisJCWdvdG8gZXJyX3B1dDsKKwogCXBfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjbWNpYV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfZGV2KQogCQlnb3RvIGVycl9wdXQ7CiAJbWVtc2V0KHBfZGV2LCAwLCBzaXplb2Yoc3RydWN0IHBjbWNpYV9kZXZpY2UpKTsKIAotCXBfZGV2LT5zb2NrZXQgPSBzLT5wYXJlbnQ7CisJcF9kZXYtPnNvY2tldCA9IHM7CiAJcF9kZXYtPmRldmljZV9ubyA9IChzLT5kZXZpY2VfY291bnQrKyk7CiAJcF9kZXYtPmZ1bmMgICA9IGZ1bmN0aW9uOwogCiAJcF9kZXYtPmRldi5idXMgPSAmcGNtY2lhX2J1c190eXBlOwotCXBfZGV2LT5kZXYucGFyZW50ID0gcy0+cGFyZW50LT5kZXYuZGV2OworCXBfZGV2LT5kZXYucGFyZW50ID0gcy0+ZGV2LmRldjsKIAlwX2Rldi0+ZGV2LnJlbGVhc2UgPSBwY21jaWFfcmVsZWFzZV9kZXY7CiAJc3ByaW50ZiAocF9kZXYtPmRldi5idXNfaWQsICIlZC4lZCIsIHBfZGV2LT5zb2NrZXQtPnNvY2ssIHBfZGV2LT5kZXZpY2Vfbm8pOwogCiAJLyogY29tcGF0ICovCi0JcF9kZXYtPmNsaWVudC5jbGllbnRfbWFnaWMgPSBDTElFTlRfTUFHSUM7Ci0JcF9kZXYtPmNsaWVudC5Tb2NrZXQgPSBzLT5wYXJlbnQ7Ci0JcF9kZXYtPmNsaWVudC5GdW5jdGlvbiA9IGZ1bmN0aW9uOwotCXBfZGV2LT5jbGllbnQuc3RhdGUgPSBDTElFTlRfVU5CT1VORDsKKwlwX2Rldi0+c3RhdGUgPSBDTElFTlRfVU5CT1VORDsKIAogCS8qIEFkZCB0byB0aGUgbGlzdCBpbiBwY21jaWFfYnVzX3NvY2tldCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJnBfZGV2LT5zb2NrZXRfZGV2aWNlX2xpc3QsICZzLT5kZXZpY2VzX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKKwlwY21jaWFfZGV2aWNlX3F1ZXJ5KHBfZGV2KTsKKwogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJnBfZGV2LT5kZXYpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2RlbCgmcF9kZXYtPnNvY2tldF9kZXZpY2VfbGlzdCk7CkBAIC01NTMsNyArNTQ0LDcgQEAKIAlzLT5kZXZpY2VfY291bnQtLTsKICBlcnJfcHV0OgogCXVwKCZkZXZpY2VfYWRkX2xvY2spOwotCXBjbWNpYV9wdXRfYnVzX3NvY2tldChzKTsKKwlwY21jaWFfcHV0X3NvY2tldChzKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtNTgxLDI2ICs1NzIsMjUzIEBACiAJZWxzZQogCQlub19mdW5jcyA9IDE7CiAKLQkvKiB0aGlzIGRvZXNuJ3QgaGFuZGxlIG11bHRpZnVuY3Rpb24gZGV2aWNlcyBvbiBvbmUgcGNtY2lhIGZ1bmN0aW9uCi0JICogeWV0LiAqLwogCWZvciAoaT0wOyBpIDwgbm9fZnVuY3M7IGkrKykKLQkJcGNtY2lhX2RldmljZV9hZGQocy0+cGNtY2lhLCBpKTsKKwkJcGNtY2lhX2RldmljZV9hZGQocywgaSk7CiAKIAlyZXR1cm4gKHJldCk7CiB9CiAKIAorc3RhdGljIHZvaWQgcGNtY2lhX2RlbGF5ZWRfYWRkX3BzZXVkb19kZXZpY2Uodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGRhdGE7CisJcGNtY2lhX2RldmljZV9hZGQocywgMCk7CisJcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY21jaWFfYWRkX3BzZXVkb19kZXZpY2Uoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCit7CisJaWYgKCFzLT5wY21jaWFfc3RhdGUuZGV2aWNlX2FkZF9wZW5kaW5nKSB7CisJCXNjaGVkdWxlX3dvcmsoJnMtPmRldmljZV9hZGQpOworCQlzLT5wY21jaWFfc3RhdGUuZGV2aWNlX2FkZF9wZW5kaW5nID0gMTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHBjbWNpYV9yZXF1ZXJ5KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqIF9kYXRhKQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlpZiAoIXBfZGV2LT5kZXYuZHJpdmVyKQorCQlwY21jaWFfZGV2aWNlX3F1ZXJ5KHBfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwY21jaWFfYnVzX3Jlc2NhbihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWludCBub19kZXZpY2VzPTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIG11c3QgYmUgY2FsbGVkIHdpdGggc2t0X3NlbSBoZWxkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJnNrdC0+ZGV2aWNlc19saXN0KSkKKwkJbm9fZGV2aWNlcz0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKiBpZiBubyBkZXZpY2VzIHdlcmUgYWRkZWQgZm9yIHRoaXMgc29ja2V0IHlldCBiZWNhdXNlIG9mCisJICogbWlzc2luZyByZXNvdXJjZSBpbmZvcm1hdGlvbiBvciBvdGhlciB0cm91YmxlLCB3ZSBuZWVkIHRvCisJICogZG8gdGhpcyBub3cuICovCisJaWYgKG5vX2RldmljZXMpIHsKKwkJaW50IHJldCA9IHBjbWNpYV9jYXJkX2FkZChza3QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuOworCX0KKworCS8qIHNvbWUgZGV2aWNlIGluZm9ybWF0aW9uIG1pZ2h0IGhhdmUgY2hhbmdlZCBiZWNhdXNlIG9mIGEgQ0lTCisJICogdXBkYXRlIG9yIGJlY2F1c2Ugd2UgY2FuIGZpbmFsbHkgcmVhZCBpdCBjb3JyZWN0bHkuLi4gc28KKwkgKiBkZXRlcm1pbmUgaXQgYWdhaW4sIG92ZXJ3cml0aW5nIG9sZCB2YWx1ZXMgaWYgbmVjZXNzYXJ5LiAqLworCWJ1c19mb3JfZWFjaF9kZXYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgTlVMTCwgcGNtY2lhX3JlcXVlcnkpOworCisJLyogd2UgcmUtc2NhbiBhbGwgZGV2aWNlcywgbm90IGp1c3QgdGhlIG9uZXMgY29ubmVjdGVkIHRvIHRoaXMKKwkgKiBzb2NrZXQuIFRoaXMgZG9lcyBub3QgbWF0dGVyLCB0aG91Z2guICovCisJYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwY21jaWFfZGV2bWF0Y2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQpCit7CisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUQpIHsKKwkJaWYgKCghZGV2LT5oYXNfbWFuZl9pZCkgfHwgKGRldi0+bWFuZl9pZCAhPSBkaWQtPm1hbmZfaWQpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUQpIHsKKwkJaWYgKCghZGV2LT5oYXNfY2FyZF9pZCkgfHwgKGRldi0+Y2FyZF9pZCAhPSBkaWQtPmNhcmRfaWQpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OKSB7CisJCWlmIChkZXYtPmZ1bmMgIT0gZGlkLT5mdW5jdGlvbikKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMSkgeworCQlpZiAoIWRldi0+cHJvZF9pZFswXSkKKwkJCXJldHVybiAwOworCQlpZiAoc3RyY21wKGRpZC0+cHJvZF9pZFswXSwgZGV2LT5wcm9kX2lkWzBdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMikgeworCQlpZiAoIWRldi0+cHJvZF9pZFsxXSkKKwkJCXJldHVybiAwOworCQlpZiAoc3RyY21wKGRpZC0+cHJvZF9pZFsxXSwgZGV2LT5wcm9kX2lkWzFdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMykgeworCQlpZiAoIWRldi0+cHJvZF9pZFsyXSkKKwkJCXJldHVybiAwOworCQlpZiAoc3RyY21wKGRpZC0+cHJvZF9pZFsyXSwgZGV2LT5wcm9kX2lkWzJdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENCkgeworCQlpZiAoIWRldi0+cHJvZF9pZFszXSkKKwkJCXJldHVybiAwOworCQlpZiAoc3RyY21wKGRpZC0+cHJvZF9pZFszXSwgZGV2LT5wcm9kX2lkWzNdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8pIHsKKwkJLyogaGFuZGxlIHBzZXVkbyBtdWx0aWZ1bmN0aW9uIGRldmljZXM6CisJCSAqIHRoZXJlIGFyZSBhdCBtb3N0IHR3byBwc2V1ZG8gbXVsdGlmdW5jdGlvbiBkZXZpY2VzLgorCQkgKiBpZiB3ZSdyZSBtYXRjaGluZyBhZ2FpbnN0IHRoZSBmaXJzdCwgc2NoZWR1bGUgYQorCQkgKiBjYWxsIHdoaWNoIHdpbGwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSB0d28KKwkJICogcHNldWRvIGRldmljZXMsIGFuZCBpZiBub3QsIGFkZCB0aGUgc2Vjb25kIG9uZS4KKwkJICovCisJCWlmIChkZXYtPmRldmljZV9ubyA9PSAwKQorCQkJcGNtY2lhX2FkZF9wc2V1ZG9fZGV2aWNlKGRldi0+c29ja2V0KTsKKworCQlpZiAoZGV2LT5kZXZpY2Vfbm8gIT0gZGlkLT5kZXZpY2Vfbm8pCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ19JRCkgeworCQlpZiAoKCFkZXYtPmhhc19mdW5jX2lkKSB8fCAoZGV2LT5mdW5jX2lkICE9IGRpZC0+ZnVuY19pZCkpCisJCQlyZXR1cm4gMDsKKworCQkvKiBpZiB0aGlzIGlzIGEgcHNldWRvLW11bHRpLWZ1bmN0aW9uIGRldmljZSwKKwkJICogd2UgbmVlZCBleHBsaWNpdCBtYXRjaGVzICovCisJCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8pCisJCQlyZXR1cm4gMDsKKwkJaWYgKGRldi0+ZGV2aWNlX25vKQorCQkJcmV0dXJuIDA7CisKKwkJLyogYWxzbywgRlVOQ19JRCBtYXRjaGluZyBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYnkgdXNlcnNwYWNlCisJCSAqIGFmdGVyIGl0IGhhcyByZS1jaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gcG9zc2libGUgbW9kdWxlCisJCSAqIHdpdGggYSBwcm9kX2lkL21hbmZfaWQvY2FyZF9pZCBtYXRjaC4KKwkJICovCisJCWlmICghZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTKSB7CisJCWlmICghZGV2LT5zb2NrZXQtPmZha2VfY2lzKQorCQkJcGNtY2lhX2xvYWRfZmlybXdhcmUoZGV2LCBkaWQtPmNpc2ZpbGUpOworCisJCWlmICghZGV2LT5zb2NrZXQtPmZha2VfY2lzKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0FOT05ZTU9VUykgeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQkJaWYgKGRldi0+cHJvZF9pZFtpXSkKKwkJCQlyZXR1cm4gMDsKKwkJaWYgKGRldi0+aGFzX21hbmZfaWQgfHwgZGV2LT5oYXNfY2FyZF9pZCB8fCBkZXYtPmhhc19mdW5jX2lkKQorCQkJcmV0dXJuIDA7CisJfQorCisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSBkaWQ7CisKKwlyZXR1cm4gMTsKK30KKworCiBzdGF0aWMgaW50IHBjbWNpYV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCXN0cnVjdCBwY21jaWFfZHJpdmVyICogcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRydik7CisJc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgKmRpZCA9IHBfZHJ2LT5pZF90YWJsZTsKIAogCS8qIG1hdGNoaW5nIGJ5IGNhcmRtZ3IgKi8KIAlpZiAocF9kZXYtPmNhcmRtZ3IgPT0gcF9kcnYpCiAJCXJldHVybiAxOwogCisJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7CisJCWlmIChwY21jaWFfZGV2bWF0Y2gocF9kZXYsIGRpZCkpCisJCQlyZXR1cm4gMTsKKwkJZGlkKys7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVRworCitzdGF0aWMgaW50IHBjbWNpYV9idXNfaG90cGx1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXY7CisJaW50IGksIGxlbmd0aCA9IDA7CisJdTMyIGhhc2hbNF0gPSB7IDAsIDAsIDAsIDB9OworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CisKKwkvKiBjYWxjdWxhdGUgaGFzaGVzICovCisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlmICghcF9kZXYtPnByb2RfaWRbaV0pCisJCQljb250aW51ZTsKKwkJaGFzaFtpXSA9IGNyYzMyKDAsIHBfZGV2LT5wcm9kX2lkW2ldLCBzdHJsZW4ocF9kZXYtPnByb2RfaWRbaV0pKTsKKwl9CisKKwlpID0gMDsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJTT0NLRVRfTk89JXUiLAorCQkJCXBfZGV2LT5zb2NrZXQtPnNvY2spKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJERVZJQ0VfTk89JTAyWCIsCisJCQkJcF9kZXYtPmRldmljZV9ubykpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGFkZF9ob3RwbHVnX2Vudl92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCWJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJIk1PREFMSUFTPXBjbWNpYTptJTA0WGMlMDRYZiUwMlhmbiUwMlhwZm4lMDJYIgorCQkJCSJwYSUwOFhwYiUwOFhwYyUwOFhwZCUwOFgiLAorCQkJCXBfZGV2LT5oYXNfbWFuZl9pZCA/IHBfZGV2LT5tYW5mX2lkIDogMCwKKwkJCQlwX2Rldi0+aGFzX2NhcmRfaWQgPyBwX2Rldi0+Y2FyZF9pZCA6IDAsCisJCQkJcF9kZXYtPmhhc19mdW5jX2lkID8gcF9kZXYtPmZ1bmNfaWQgOiAwLAorCQkJCXBfZGV2LT5mdW5jLAorCQkJCXBfZGV2LT5kZXZpY2Vfbm8sCisJCQkJaGFzaFswXSwKKwkJCQloYXNoWzFdLAorCQkJCWhhc2hbMl0sCisJCQkJaGFzaFszXSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW52cFtpXSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBwY21jaWFfYnVzX2hvdHBsdWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAorCQkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqIHBlci1kZXZpY2Ugc3lzZnMgb3V0cHV0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBwY21jaWFfZGV2aWNlX2F0dHIoZmllbGQsIHRlc3QsIGZvcm1hdCkJCQkJXApAQCAtNjI2LDYgKzg0NCw0MyBAQAogcGNtY2lhX2RldmljZV9zdHJpbmdhdHRyKHByb2RfaWQzLCBwcm9kX2lkWzJdKTsKIHBjbWNpYV9kZXZpY2Vfc3RyaW5nYXR0cihwcm9kX2lkNCwgcHJvZF9pZFszXSk7CiAKK3N0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlpbnQgaTsKKwl1MzIgaGFzaFs0XSA9IHsgMCwgMCwgMCwgMH07CisKKwkvKiBjYWxjdWxhdGUgaGFzaGVzICovCisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlmICghcF9kZXYtPnByb2RfaWRbaV0pCisJCQljb250aW51ZTsKKwkJaGFzaFtpXSA9IGNyYzMyKDAscF9kZXYtPnByb2RfaWRbaV0sc3RybGVuKHBfZGV2LT5wcm9kX2lkW2ldKSk7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBjbWNpYTptJTA0WGMlMDRYZiUwMlhmbiUwMlhwZm4lMDJYIgorCQkJCSJwYSUwOFhwYiUwOFhwYyUwOFhwZCUwOFhcbiIsCisJCQkJcF9kZXYtPmhhc19tYW5mX2lkID8gcF9kZXYtPm1hbmZfaWQgOiAwLAorCQkJCXBfZGV2LT5oYXNfY2FyZF9pZCA/IHBfZGV2LT5jYXJkX2lkIDogMCwKKwkJCQlwX2Rldi0+aGFzX2Z1bmNfaWQgPyBwX2Rldi0+ZnVuY19pZCA6IDAsCisJCQkJcF9kZXYtPmZ1bmMsIHBfZGV2LT5kZXZpY2Vfbm8sCisJCQkJaGFzaFswXSwgaGFzaFsxXSwgaGFzaFsyXSwgaGFzaFszXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjbWNpYV9zdG9yZV9hbGxvd19mdW5jX2lkX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKyAgICAgICAgaWYgKCFjb3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnBfZGV2LT5zb2NrZXQtPnNrdF9zZW0pOworCXBfZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoID0gMTsKKwl1cCgmcF9kZXYtPnNvY2tldC0+c2t0X3NlbSk7CisKKwlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwY21jaWFfZGV2X2F0dHJzW10gPSB7CiAJX19BVFRSKGZ1bmN0aW9uLCAwNDQ0LCBmdW5jX3Nob3csIE5VTEwpLAogCV9fQVRUUl9STyhmdW5jX2lkKSwKQEAgLTYzNSw0NiArODkwLDE0IEBACiAJX19BVFRSX1JPKHByb2RfaWQyKSwKIAlfX0FUVFJfUk8ocHJvZF9pZDMpLAogCV9fQVRUUl9STyhwcm9kX2lkNCksCisJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFIoYWxsb3dfZnVuY19pZF9tYXRjaCwgMDIwMCwgTlVMTCwgcGNtY2lhX3N0b3JlX2FsbG93X2Z1bmNfaWRfbWF0Y2gpLAogCV9fQVRUUl9OVUxMLAogfTsKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgIFRoZXNlIG1hbmFnZSBhIHJpbmcgYnVmZmVyIG9mIGV2ZW50cyBwZW5kaW5nIGZvciBvbmUgdXNlciBwcm9jZXNzCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBxdWV1ZV9lbXB0eSh1c2VyX2luZm9fdCAqdXNlcikKLXsKLSAgICByZXR1cm4gKHVzZXItPmV2ZW50X2hlYWQgPT0gdXNlci0+ZXZlbnRfdGFpbCk7Ci19Ci0KLXN0YXRpYyBldmVudF90IGdldF9xdWV1ZWRfZXZlbnQodXNlcl9pbmZvX3QgKnVzZXIpCi17Ci0gICAgdXNlci0+ZXZlbnRfdGFpbCA9ICh1c2VyLT5ldmVudF90YWlsKzEpICUgTUFYX0VWRU5UUzsKLSAgICByZXR1cm4gdXNlci0+ZXZlbnRbdXNlci0+ZXZlbnRfdGFpbF07Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2V2ZW50KHVzZXJfaW5mb190ICp1c2VyLCBldmVudF90IGV2ZW50KQotewotICAgIHVzZXItPmV2ZW50X2hlYWQgPSAodXNlci0+ZXZlbnRfaGVhZCsxKSAlIE1BWF9FVkVOVFM7Ci0gICAgaWYgKHVzZXItPmV2ZW50X2hlYWQgPT0gdXNlci0+ZXZlbnRfdGFpbCkKLQl1c2VyLT5ldmVudF90YWlsID0gKHVzZXItPmV2ZW50X3RhaWwrMSkgJSBNQVhfRVZFTlRTOwotICAgIHVzZXItPmV2ZW50W3VzZXItPmV2ZW50X2hlYWRdID0gZXZlbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpCi17Ci0gICAgdXNlcl9pbmZvX3QgKnVzZXI7Ci0gICAgZm9yICh1c2VyID0gcy0+dXNlcjsgdXNlcjsgdXNlciA9IHVzZXItPm5leHQpCi0JcXVldWVfZXZlbnQodXNlciwgZXZlbnQpOwotICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmcy0+cXVldWUpOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCiAgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuCiAgICAgCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTY4OCw2ICs5MTEsNyBAQAogc3RhdGljIGludCBzZW5kX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqIF9kYXRhKQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnY7CiAJc3RydWN0IHNlbmRfZXZlbnRfZGF0YSAqZGF0YSA9IF9kYXRhOwogCiAJLyogd2UgZ2V0IGNhbGxlZCBmb3IgYWxsIHNvY2tldHMsIGJ1dCBtYXkgb25seSBwYXNzIHRoZSBldmVudApAQCAtNjk1LDMyICs5MTksMjkgQEAKIAlpZiAocF9kZXYtPnNvY2tldCAhPSBkYXRhLT5za3QpCiAJCXJldHVybiAwOwogCi0JaWYgKHBfZGV2LT5jbGllbnQuc3RhdGUgJiAoQ0xJRU5UX1VOQk9VTkR8Q0xJRU5UX1NUQUxFKSkKKwlwX2RydiA9IHRvX3BjbWNpYV9kcnYocF9kZXYtPmRldi5kcml2ZXIpOworCWlmICghcF9kcnYpCiAJCXJldHVybiAwOwogCi0JaWYgKHBfZGV2LT5jbGllbnQuRXZlbnRNYXNrICYgZGF0YS0+ZXZlbnQpCi0JCXJldHVybiBFVkVOVCgmcF9kZXYtPmNsaWVudCwgZGF0YS0+ZXZlbnQsIGRhdGEtPnByaW9yaXR5KTsKKwlpZiAocF9kZXYtPnN0YXRlICYgKENMSUVOVF9VTkJPVU5EfENMSUVOVF9TVEFMRSkpCisJCXJldHVybiAwOworCisJaWYgKHBfZHJ2LT5ldmVudCkKKwkJcmV0dXJuIHBfZHJ2LT5ldmVudChkYXRhLT5ldmVudCwgZGF0YS0+cHJpb3JpdHksCisJCQkJICAgICZwX2Rldi0+ZXZlbnRfY2FsbGJhY2tfYXJncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzZW5kX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IHNlbmRfZXZlbnRfZGF0YSBwcml2YXRlOwotCXN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqc2t0ID0gcGNtY2lhX2dldF9idXNfc29ja2V0KHMtPnBjbWNpYSk7Ci0KLQlpZiAoIXNrdCkKLQkJcmV0dXJuIDA7CiAKIAlwcml2YXRlLnNrdCA9IHM7CiAJcHJpdmF0ZS5ldmVudCA9IGV2ZW50OwogCXByaXZhdGUucHJpb3JpdHkgPSBwcmlvcml0eTsKIAotCXJldCA9IGJ1c19mb3JfZWFjaF9kZXYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgJnByaXZhdGUsIHNlbmRfZXZlbnRfY2FsbGJhY2spOwotCi0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHNrdCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gYnVzX2Zvcl9lYWNoX2RldigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCAmcHJpdmF0ZSwgc2VuZF9ldmVudF9jYWxsYmFjayk7CiB9IC8qIHNlbmRfZXZlbnQgKi8KIAogCkBAIC03MzEsMjUgKzk1MiwyNSBAQAogCiBzdGF0aWMgaW50IGRzX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QsIGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMgPSBza3QtPnBjbWNpYTsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBjbWNpYV9nZXRfc29ja2V0KHNrdCk7CiAJaW50IHJldCA9IDA7CiAKIAlkc19kYmcoMSwgImRzX2V2ZW50KDB4JTA2eCwgJWQsIDB4JXApXG4iLAotCSAgICAgICBldmVudCwgcHJpb3JpdHksIHMpOworCSAgICAgICBldmVudCwgcHJpb3JpdHksIHNrdCk7CiAgICAgCiAJc3dpdGNoIChldmVudCkgewogCiAJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6Ci0JCXMtPnN0YXRlICY9IH5EU19TT0NLRVRfUFJFU0VOVDsKKwkJcy0+cGNtY2lhX3N0YXRlLnByZXNlbnQgPSAwOwogCSAgICAJc2VuZF9ldmVudChza3QsIGV2ZW50LCBwcmlvcml0eSk7Ci0JCXVuYmluZF9yZXF1ZXN0KHMpOwotCQloYW5kbGVfZXZlbnQocywgZXZlbnQpOworCQl1bmJpbmRfcmVxdWVzdChza3QpOworCQloYW5kbGVfZXZlbnQoc2t0LCBldmVudCk7CiAJCWJyZWFrOwogCQogCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046Ci0JCXMtPnN0YXRlIHw9IERTX1NPQ0tFVF9QUkVTRU5UOworCQlzLT5wY21jaWFfc3RhdGUucHJlc2VudCA9IDE7CiAJCXBjbWNpYV9jYXJkX2FkZChza3QpOwotCQloYW5kbGVfZXZlbnQocywgZXZlbnQpOworCQloYW5kbGVfZXZlbnQoc2t0LCBldmVudCk7CiAJCWJyZWFrOwogCiAJY2FzZSBDU19FVkVOVF9FSkVDVElPTl9SRVFVRVNUOgpAQCAtNzU3LDEzOCArOTc4LDIzIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJaGFuZGxlX2V2ZW50KHMsIGV2ZW50KTsKKwkJaGFuZGxlX2V2ZW50KHNrdCwgZXZlbnQpOwogCQlzZW5kX2V2ZW50KHNrdCwgZXZlbnQsIHByaW9yaXR5KTsKIAkJYnJlYWs7CiAgICAgfQogCisgICAgcGNtY2lhX3B1dF9zb2NrZXQocyk7CisKICAgICByZXR1cm4gMDsKIH0gLyogZHNfZXZlbnQgKi8KIAogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgIGJpbmRfcmVxdWVzdCgpIGFuZCBiaW5kX2RldmljZSgpIGFyZSBtZXJnZWQgYnkgbm93LiBSZWdpc3Rlcl9jbGllbnQoKQotICAgIGlzIGNhbGxlZCByaWdodCBhdCB0aGUgZW5kIG9mIGJpbmRfcmVxdWVzdCgpLCBkdXJpbmcgdGhlIGRyaXZlcidzCi0gICAgLT5hdHRhY2goKSBjYWxsLiBJbmRpdmlkdWFsIGRlc2NyaXB0aW9uczoKLQotICAgIGJpbmRfcmVxdWVzdCgpIGNvbm5lY3RzIGEgc29ja2V0IHRvIGEgcGFydGljdWxhciBjbGllbnQgZHJpdmVyLgotICAgIEl0IGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZGV2aWNlIElEIGluIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQKLSAgICBkcml2ZXJzLCBiaW5kcyBpdCB0byB0aGUgc29ja2V0LCBhbmQgdHJpZXMgdG8gY3JlYXRlIGFuIGluc3RhbmNlCi0gICAgb2YgdGhlIGRldmljZS4gIHVuYmluZF9yZXF1ZXN0KCkgZGVsZXRlcyBhIGRyaXZlciBpbnN0YW5jZS4KLSAgICAKLSAgICBCaW5kX2RldmljZSgpIGFzc29jaWF0ZXMgYSBkZXZpY2UgZHJpdmVyIHdpdGggYSBwYXJ0aWN1bGFyIHNvY2tldC4KLSAgICBJdCBpcyBub3JtYWxseSBjYWxsZWQgYnkgRHJpdmVyIFNlcnZpY2VzIGFmdGVyIGl0IGhhcyBpZGVudGlmaWVkCi0gICAgYSBuZXdseSBpbnNlcnRlZCBjYXJkLiAgQW4gaW5zdGFuY2Ugb2YgdGhhdCBkcml2ZXIgd2lsbCB0aGVuIGJlCi0gICAgZWxpZ2libGUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgb2YgdGhpcyBzb2NrZXQuCi0KLSAgICBSZWdpc3Rlcl9jbGllbnQoKSB1c2VzIHRoZSBkZXZfaW5mb190IGhhbmRsZSB0byBtYXRjaCB0aGUKLSAgICBjYWxsZXIgd2l0aCBhIHNvY2tldC4gIFRoZSBkcml2ZXIgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBib3VuZAotICAgIHRvIGEgc29ja2V0IHdpdGggYmluZF9kZXZpY2UoKSAtLSBpbiBmYWN0LCBiaW5kX2RldmljZSgpCi0gICAgYWxsb2NhdGVzIHRoZSBjbGllbnQgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSB1c2VkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBiaW5kX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzLCBiaW5kX2luZm9fdCAqYmluZF9pbmZvKQoraW50IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKipoYW5kbGUsIGNsaWVudF9yZWdfdCAqcmVxKQogewotCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKLQlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXY7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXMgPSBwY21jaWFfZ2V0X2J1c19zb2NrZXQocyk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRzX2RiZygyLCAiYmluZF9yZXF1ZXN0KCVkLCAnJXMnKVxuIiwgcy0+cGFyZW50LT5zb2NrLAotCSAgICAgICAoY2hhciAqKWJpbmRfaW5mby0+ZGV2X2luZm8pOwotCi0JcF9kcnYgPSBnZXRfcGNtY2lhX2RyaXZlcigmYmluZF9pbmZvLT5kZXZfaW5mbyk7Ci0JaWYgKCFwX2RydikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wdXQ7Ci0JfQotCi0JaWYgKCF0cnlfbW9kdWxlX2dldChwX2Rydi0+b3duZXIpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3B1dF9kcml2ZXI7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgewotCQlpZiAocF9kZXYtPmZ1bmMgPT0gYmluZF9pbmZvLT5mdW5jdGlvbikgewotCQkJaWYgKChwX2Rldi0+ZGV2LmRyaXZlciA9PSAmcF9kcnYtPmRydikpIHsKLQkJCQlpZiAocF9kZXYtPmNhcmRtZ3IpIHsKLQkJCQkJLyogaWYgdGhlcmUncyBhbHJlYWR5IGEgZGV2aWNlCi0JCQkJCSAqIHJlZ2lzdGVyZWQsIGFuZCBpdCB3YXMgcmVnaXN0ZXJlZAotCQkJCQkgKiBieSB1c2Vyc3BhY2UgYmVmb3JlLCB3ZSBuZWVkIHRvCi0JCQkJCSAqIHJldHVybiB0aGUgImluc3RhbmNlIi4gKi8KLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJCQkJYmluZF9pbmZvLT5pbnN0YW5jZSA9IHBfZGV2LT5pbnN0YW5jZTsKLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlnb3RvIGVycl9wdXRfbW9kdWxlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIHRoZSBjb3JyZWN0IGRyaXZlciBtYW5hZ2VkIHRvIGJpbmQKLQkJCQkJICogaXRzZWxmIG1hZ2ljYWxseSB0byB0aGUgY29ycmVjdAotCQkJCQkgKiBkZXZpY2UuICovCi0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCQkJCXBfZGV2LT5jYXJkbWdyID0gcF9kcnY7Ci0JCQkJCXJldCA9IDA7Ci0JCQkJCWdvdG8gZXJyX3B1dF9tb2R1bGU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghcF9kZXYtPmRldi5kcml2ZXIpIHsKLQkJCQkvKiB0aGVyZSdzIGFscmVhZHkgYSBkZXZpY2UgYXZhaWxhYmxlIHdoZXJlCi0JCQkJICogbm8gZGV2aWNlIGhhcyBiZWVuIGJvdW5kIHRvIHlldC4gU28gd2UgZG9uJ3QKLQkJCQkgKiBuZWVkIHRvIHJlZ2lzdGVyIGEgZGV2aWNlISAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCQkJZ290byByZXNjYW47Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQotCXBfZGV2ID0gcGNtY2lhX2RldmljZV9hZGQocywgYmluZF9pbmZvLT5mdW5jdGlvbik7Ci0JaWYgKCFwX2RldikgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9wdXRfbW9kdWxlOwotCX0KLQotcmVzY2FuOgotCXBfZGV2LT5jYXJkbWdyID0gcF9kcnY7Ci0KLQlwY21jaWFfZGV2aWNlX3F1ZXJ5KHBfZGV2KTsKLQotCS8qCi0JICogUHJldmVudCB0aGlzIHJhY2luZyB3aXRoIGEgY2FyZCBpbnNlcnRpb24uCi0JICovCi0JZG93bigmcy0+cGFyZW50LT5za3Rfc2VtKTsKLQlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7Ci0JdXAoJnMtPnBhcmVudC0+c2t0X3NlbSk7Ci0KLQkvKiBjaGVjayB3aGV0aGVyIHRoZSBkcml2ZXIgaW5kZWVkIG1hdGNoZWQuIEkgZG9uJ3QgY2FyZSBpZiB0aGlzCi0JICogaXMgcmFjeSBvciBub3QsIGJlY2F1c2UgaXQgY2FuIG9ubHkgaGFwcGVuIG9uIGNhcmRtZ3IgYWNjZXNzCi0JICogcGF0aHMuLi4KLQkgKi8KLQlpZiAoIShwX2Rldi0+ZGV2LmRyaXZlciA9PSAmcF9kcnYtPmRydikpCi0JCXBfZGV2LT5jYXJkbWdyID0gTlVMTDsKLQotIGVycl9wdXRfbW9kdWxlOgotCW1vZHVsZV9wdXQocF9kcnYtPm93bmVyKTsKLSBlcnJfcHV0X2RyaXZlcjoKLQlwdXRfZHJpdmVyKCZwX2Rydi0+ZHJ2KTsKLSBlcnJfcHV0OgotCXBjbWNpYV9wdXRfYnVzX3NvY2tldChzKTsKLQotCXJldHVybiAocmV0KTsKLX0gLyogYmluZF9yZXF1ZXN0ICovCi0KLQotaW50IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoY2xpZW50X2hhbmRsZV90ICpoYW5kbGUsIGNsaWVudF9yZWdfdCAqcmVxKQotewotCWNsaWVudF90ICpjbGllbnQgPSBOVUxMOwotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCXN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqc2t0ID0gTlVMTDsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IE5VTEw7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnYgPSBOVUxMOwogCiAJLyogTG9vayBmb3IgdW5ib3VuZCBjbGllbnQgd2l0aCBtYXRjaGluZyBkZXZfaW5mbyAqLwogCWRvd25fcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKQEAgLTg5OCw1NiArMTAwNCw0NSBAQAogCQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykKIAkJCWNvbnRpbnVlOwogCi0JCXNrdCA9IHMtPnBjbWNpYTsKLQkJaWYgKCFza3QpCi0JCQljb250aW51ZTsKLQkJc2t0ID0gcGNtY2lhX2dldF9idXNfc29ja2V0KHNrdCk7Ci0JCWlmICghc2t0KQorCQlzID0gcGNtY2lhX2dldF9zb2NrZXQocyk7CisJCWlmICghcykKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnNrdC0+ZGV2aWNlc19saXN0LCBzb2NrZXRfZGV2aWNlX2xpc3QpIHsKLQkJCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7CiAJCQlwX2RldiA9IHBjbWNpYV9nZXRfZGV2KHBfZGV2KTsKIAkJCWlmICghcF9kZXYpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIShwX2Rldi0+Y2xpZW50LnN0YXRlICYgQ0xJRU5UX1VOQk9VTkQpIHx8CisJCQlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfVU5CT1VORCkgfHwKIAkJCSAgICAoIXBfZGV2LT5kZXYuZHJpdmVyKSkgewogCQkJCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihwX2Rldi0+ZGV2LmRyaXZlcik7CiAJCQlpZiAoIXN0cm5jbXAocF9kcnYtPmRydi5uYW1lLCAoY2hhciAqKXJlcS0+ZGV2X2luZm8sIERFVl9OQU1FX0xFTikpIHsKLQkJCQljbGllbnQgPSAmcF9kZXYtPmNsaWVudDsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCQkJCWdvdG8gZm91bmQ7CiAJCQl9CiAJCQlwY21jaWFfcHV0X2RldihwX2Rldik7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJcGNtY2lhX3B1dF9idXNfc29ja2V0KHNrdCk7CisJCXBjbWNpYV9wdXRfc29ja2V0KHMpOwogCX0KICBmb3VuZDoKIAl1cF9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwotCWlmICghcF9kZXYgfHwgIWNsaWVudCkKKwlpZiAoIXBfZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBjbWNpYV9wdXRfYnVzX3NvY2tldChza3QpOyAvKiBzYWZlLCBhcyB3ZSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UgZnJvbSBiaW5kX2RldmljZSAqLworCXBjbWNpYV9wdXRfc29ja2V0KHMpOyAvKiBzYWZlLCBhcyB3ZSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UgZnJvbSBiaW5kX2RldmljZSAqLwogCi0JKmhhbmRsZSA9IGNsaWVudDsKLQljbGllbnQtPnN0YXRlICY9IH5DTElFTlRfVU5CT1VORDsKLQljbGllbnQtPlNvY2tldCA9IHM7Ci0JY2xpZW50LT5FdmVudE1hc2sgPSByZXEtPkV2ZW50TWFzazsKLQljbGllbnQtPmV2ZW50X2hhbmRsZXIgPSByZXEtPmV2ZW50X2hhbmRsZXI7Ci0JY2xpZW50LT5ldmVudF9jYWxsYmFja19hcmdzID0gcmVxLT5ldmVudF9jYWxsYmFja19hcmdzOwotCWNsaWVudC0+ZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfaGFuZGxlID0gY2xpZW50OworCSpoYW5kbGUgPSBwX2RldjsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9VTkJPVU5EOworCXBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzID0gcmVxLT5ldmVudF9jYWxsYmFja19hcmdzOworCXBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9oYW5kbGUgPSBwX2RldjsKIAotCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKQotCQljbGllbnQtPnN0YXRlIHw9IENMSUVOVF9DQVJEQlVTOwogCi0JaWYgKCghKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSAmJiAocy0+ZnVuY3Rpb25zID09IDApICYmCi0JICAgIChjbGllbnQtPkZ1bmN0aW9uICE9IEJJTkRfRk5fQUxMKSkgeworCWlmICghcy0+ZnVuY3Rpb25zKSB7CiAJCWNpc3RwbF9sb25nbGlua19tZmNfdCBtZmM7Ci0JCWlmIChwY2NhcmRfcmVhZF90dXBsZShzLCBjbGllbnQtPkZ1bmN0aW9uLCBDSVNUUExfTE9OR0xJTktfTUZDLCAmbWZjKQorCQlpZiAocGNjYXJkX3JlYWRfdHVwbGUocywgcF9kZXYtPmZ1bmMsIENJU1RQTF9MT05HTElOS19NRkMsICZtZmMpCiAJCSAgICA9PSBDU19TVUNDRVNTKQogCQkJcy0+ZnVuY3Rpb25zID0gbWZjLm5mbjsKIAkJZWxzZQpAQCAtOTYwLDEzICsxMDU1LDEzIEBACiAJfQogCiAJZHNfZGJnKDEsICJyZWdpc3Rlcl9jbGllbnQoKTogY2xpZW50IDB4JXAsIGRldiAlc1xuIiwKLQkgICAgICAgY2xpZW50LCBwX2Rldi0+ZGV2LmJ1c19pZCk7Ci0JaWYgKGNsaWVudC0+RXZlbnRNYXNrICYgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKQotCQlFVkVOVChjbGllbnQsIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSwgQ1NfRVZFTlRfUFJJX0xPVyk7CisJICAgICAgIHBfZGV2LCBwX2Rldi0+ZGV2LmJ1c19pZCk7CiAKIAlpZiAoKHMtPnN0YXRlICYgKFNPQ0tFVF9QUkVTRU5UfFNPQ0tFVF9DQVJEQlVTKSkgPT0gU09DS0VUX1BSRVNFTlQpIHsKLQkJaWYgKGNsaWVudC0+RXZlbnRNYXNrICYgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04pCi0JCQlFVkVOVChjbGllbnQsIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OLCBDU19FVkVOVF9QUklfTE9XKTsKKwkJaWYgKHBfZHJ2LT5ldmVudCkKKwkJCXBfZHJ2LT5ldmVudChDU19FVkVOVF9DQVJEX0lOU0VSVElPTiwgQ1NfRVZFTlRfUFJJX0xPVywKKwkJCQkgICAgICZwX2Rldi0+ZXZlbnRfY2FsbGJhY2tfYXJncyk7CisKIAl9CiAKIAlyZXR1cm4gQ1NfU1VDQ0VTUzsKQEAgLTk3OCwxMDYgKzEwNzMsMTUgQEAKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlZ2lzdGVyX2NsaWVudCk7CiAKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNtY2lhX2xvb2t1cF9idXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwotCi1zdGF0aWMgaW50IGdldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMsIGJpbmRfaW5mb190ICpiaW5kX2luZm8sIGludCBmaXJzdCkKLXsKLQlkZXZfbm9kZV90ICpub2RlOwotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQkvKgotCSAqIFNvbWUgdW5iZWxpZXZhYmx5IHVnbHkgY29kZSB0byBhc3NvY2lhdGUgdGhlIFBDSSBjYXJkYnVzCi0JICogZGV2aWNlIGFuZCBpdHMgZHJpdmVyIHdpdGggdGhlIFBDTUNJQSAiYmluZCIgaW5mb3JtYXRpb24uCi0JICovCi0JewotCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCi0JCWJ1cyA9IHBjbWNpYV9sb29rdXBfYnVzKHMtPnBhcmVudCk7Ci0JCWlmIChidXMpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JCQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCQkJbGlzdCA9IGJ1cy0+ZGV2aWNlcy5uZXh0OwotCQkJd2hpbGUgKGxpc3QgIT0gJmJ1cy0+ZGV2aWNlcykgewotCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGNpX2Rldl9iKGxpc3QpOwotCQkJCWxpc3QgPSBsaXN0LT5uZXh0OwotCi0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWRldiA9IHBkZXY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIFRyeSB0byBoYW5kbGUgIm5leHQiIGhlcmUgc29tZSB3YXk/ICovCi0JCQl9Ci0JCQlpZiAoZGV2ICYmIGRldi0+ZHJpdmVyKSB7Ci0JCQkJc3RybGNweShiaW5kX2luZm8tPm5hbWUsIGRldi0+ZHJpdmVyLT5uYW1lLCBERVZfTkFNRV9MRU4pOwotCQkJCWJpbmRfaW5mby0+bWFqb3IgPSAwOwotCQkJCWJpbmRfaW5mby0+bWlub3IgPSAwOwotCQkJCWJpbmRfaW5mby0+bmV4dCA9IE5VTEw7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgewotCQlpZiAocF9kZXYtPmZ1bmMgPT0gYmluZF9pbmZvLT5mdW5jdGlvbikgewotCQkJcF9kZXYgPSBwY21jaWFfZ2V0X2RldihwX2Rldik7Ci0JCQlpZiAoIXBfZGV2KQotCQkJCWNvbnRpbnVlOwotCQkJZ290byBmb3VuZDsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiAtRU5PREVWOwotCi0gZm91bmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmICgoIXBfZGV2LT5pbnN0YW5jZSkgfHwKLQkgICAgKHBfZGV2LT5pbnN0YW5jZS0+c3RhdGUgJiBERVZfQ09ORklHX1BFTkRJTkcpKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyX3B1dDsKLQl9Ci0KLQlpZiAoZmlyc3QpCi0JCW5vZGUgPSBwX2Rldi0+aW5zdGFuY2UtPmRldjsKLQllbHNlCi0JCWZvciAobm9kZSA9IHBfZGV2LT5pbnN0YW5jZS0+ZGV2OyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKLQkJCWlmIChub2RlID09IGJpbmRfaW5mby0+bmV4dCkKLQkJCQlicmVhazsKLQlpZiAoIW5vZGUpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfcHV0OwotCX0KLQotCXN0cmxjcHkoYmluZF9pbmZvLT5uYW1lLCBub2RlLT5kZXZfbmFtZSwgREVWX05BTUVfTEVOKTsKLQliaW5kX2luZm8tPm1ham9yID0gbm9kZS0+bWFqb3I7Ci0JYmluZF9pbmZvLT5taW5vciA9IG5vZGUtPm1pbm9yOwotCWJpbmRfaW5mby0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0KLSBlcnJfcHV0OgotCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKLQlyZXR1cm4gKHJldCk7Ci19IC8qIGdldF9kZXZpY2VfaW5mbyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQogLyogdW5iaW5kIF9hbGxfIGRldmljZXMgYXR0YWNoZWQgdG8gYSBnaXZlbiBwY21jaWFfYnVzX3NvY2tldC4gVGhlCiAgKiBkcml2ZXJzIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCBFVkVOVF9DQVJEX1JFTU9WQUwgYmVmb3JlLgogICovCi1zdGF0aWMgaW50IHVuYmluZF9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcykKK3N0YXRpYyBpbnQgdW5iaW5kX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UJKnBfZGV2OwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0JZHNfZGJnKDIsICJ1bmJpbmRfcmVxdWVzdCglZClcbiIsIHMtPnBhcmVudC0+c29jayk7CisJZHNfZGJnKDIsICJ1bmJpbmRfcmVxdWVzdCglZClcbiIsIHMtPnNvY2spOwogCiAJcy0+ZGV2aWNlX2NvdW50ID0gMDsKIApAQCAtMTA5MCw3ICsxMDk0LDcgQEAKIAkJfQogCQlwX2RldiA9IGxpc3RfZW50cnkoKCZzLT5kZXZpY2VzX2xpc3QpLT5uZXh0LCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgc29ja2V0X2RldmljZV9saXN0KTsKIAkJbGlzdF9kZWwoJnBfZGV2LT5zb2NrZXRfZGV2aWNlX2xpc3QpOwotCQlwX2Rldi0+Y2xpZW50LnN0YXRlIHw9IENMSUVOVF9TVEFMRTsKKwkJcF9kZXYtPnN0YXRlIHw9IENMSUVOVF9TVEFMRTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKIAogCQlkZXZpY2VfdW5yZWdpc3RlcigmcF9kZXYtPmRldik7CkBAIC0xMDk5LDMxICsxMTAzLDI1IEBACiAJcmV0dXJuIDA7CiB9IC8qIHVuYmluZF9yZXF1ZXN0ICovCiAKLWludCBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQoY2xpZW50X2hhbmRsZV90IGhhbmRsZSkKK2ludCBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwogCWludCBpOwotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGhhbmRsZV90b19wZGV2KGhhbmRsZSk7CiAKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOworCXMgPSBwX2Rldi0+c29ja2V0OworCWRzX2RiZygxLCAiZGVyZWdpc3Rlcl9jbGllbnQoJXApXG4iLCBwX2Rldik7CiAKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JZHNfZGJnKDEsICJkZXJlZ2lzdGVyX2NsaWVudCglcClcbiIsIGhhbmRsZSk7Ci0KLQlpZiAoaGFuZGxlLT5zdGF0ZSAmIChDTElFTlRfSVJRX1JFUXxDTElFTlRfSU9fUkVRfENMSUVOVF9DT05GSUdfTE9DS0VEKSkKKwlpZiAocF9kZXYtPnN0YXRlICYgKENMSUVOVF9JUlFfUkVRfENMSUVOVF9JT19SRVF8Q0xJRU5UX0NPTkZJR19MT0NLRUQpKQogCQlnb3RvIHdhcm5fb3V0OwogCWZvciAoaSA9IDA7IGkgPCBNQVhfV0lOOyBpKyspCi0JCWlmIChoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1dJTl9SRVEoaSkpCisJCWlmIChwX2Rldi0+c3RhdGUgJiBDTElFTlRfV0lOX1JFUShpKSkKIAkJCWdvdG8gd2Fybl9vdXQ7CiAKLQlpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkgewotCQloYW5kbGUtPmNsaWVudF9tYWdpYyA9IDA7Ci0JCWhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9TVEFMRTsKKwlpZiAocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSB7CisJCXBfZGV2LT5zdGF0ZSAmPSB+Q0xJRU5UX1NUQUxFOwogCQlwY21jaWFfcHV0X2RldihwX2Rldik7CiAJfSBlbHNlIHsKLQkJaGFuZGxlLT5zdGF0ZSA9IENMSUVOVF9VTkJPVU5EOwotCQloYW5kbGUtPmV2ZW50X2hhbmRsZXIgPSBOVUxMOworCQlwX2Rldi0+c3RhdGUgPSBDTElFTlRfVU5CT1VORDsKIAl9CiAKIAlyZXR1cm4gQ1NfU1VDQ0VTUzsKQEAgLTExMzMsNDMzICsxMTMxLDU4IEBACiB9IC8qIGRlcmVnaXN0ZXJfY2xpZW50ICovCiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudCk7CiAKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBUaGUgdXNlci1tb2RlIFBDIENhcmQgZGV2aWNlIGludGVyZmFjZQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBkc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgIHNvY2tldF90IGkgPSBpbWlub3IoaW5vZGUpOwotICAgIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqczsKLSAgICB1c2VyX2luZm9fdCAqdXNlcjsKLQotICAgIGRzX2RiZygwLCAiZHNfb3Blbihzb2NrZXQgJWQpXG4iLCBpKTsKLQotICAgIHMgPSBnZXRfc29ja2V0X2luZm9fYnlfbnIoaSk7Ci0gICAgaWYgKCFzKQotCSAgICByZXR1cm4gLUVOT0RFVjsKLSAgICBzID0gcGNtY2lhX2dldF9idXNfc29ja2V0KHMpOwotICAgIGlmICghcykKLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7Ci0JICAgIGlmIChzLT5zdGF0ZSAmIERTX1NPQ0tFVF9CVVNZKSB7Ci0JCSAgICBwY21jaWFfcHV0X2J1c19zb2NrZXQocyk7Ci0JCSAgICByZXR1cm4gLUVCVVNZOwotCSAgICB9Ci0JZWxzZQotCSAgICBzLT5zdGF0ZSB8PSBEU19TT0NLRVRfQlVTWTsKLSAgICB9Ci0gICAgCi0gICAgdXNlciA9IGttYWxsb2Moc2l6ZW9mKHVzZXJfaW5mb190KSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCF1c2VyKSB7Ci0JICAgIHBjbWNpYV9wdXRfYnVzX3NvY2tldChzKTsKLQkgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIHVzZXItPmV2ZW50X3RhaWwgPSB1c2VyLT5ldmVudF9oZWFkID0gMDsKLSAgICB1c2VyLT5uZXh0ID0gcy0+dXNlcjsKLSAgICB1c2VyLT51c2VyX21hZ2ljID0gVVNFUl9NQUdJQzsKLSAgICB1c2VyLT5zb2NrZXQgPSBzOwotICAgIHMtPnVzZXIgPSB1c2VyOwotICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IHVzZXI7Ci0gICAgCi0gICAgaWYgKHMtPnN0YXRlICYgRFNfU09DS0VUX1BSRVNFTlQpCi0JcXVldWVfZXZlbnQodXNlciwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04pOwotICAgIHJldHVybiAwOwotfSAvKiBkc19vcGVuICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IGRzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyLCAqKmxpbms7Ci0KLSAgICBkc19kYmcoMCwgImRzX3JlbGVhc2Uoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGlub2RlKSk7Ci0KLSAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQotCWdvdG8gb3V0OwotCi0gICAgcyA9IHVzZXItPnNvY2tldDsKLQotICAgIC8qIFVubGluayB1c2VyIGRhdGEgc3RydWN0dXJlICovCi0gICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgewotCXMtPnN0YXRlICY9IH5EU19TT0NLRVRfQlVTWTsKLSAgICB9Ci0gICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLSAgICBmb3IgKGxpbmsgPSAmcy0+dXNlcjsgKmxpbms7IGxpbmsgPSAmKCpsaW5rKS0+bmV4dCkKLQlpZiAoKmxpbmsgPT0gdXNlcikgYnJlYWs7Ci0gICAgaWYgKGxpbmsgPT0gTlVMTCkKLQlnb3RvIG91dDsKLSAgICAqbGluayA9IHVzZXItPm5leHQ7Ci0gICAgdXNlci0+dXNlcl9tYWdpYyA9IDA7Ci0gICAga2ZyZWUodXNlcik7Ci0gICAgcGNtY2lhX3B1dF9idXNfc29ja2V0KHMpOwotb3V0OgotICAgIHJldHVybiAwOwotfSAvKiBkc19yZWxlYXNlICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgc3NpemVfdCBkc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotICAgIGludCByZXQ7Ci0KLSAgICBkc19kYmcoMiwgImRzX3JlYWQoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7Ci0gICAgCi0gICAgaWYgKGNvdW50IDwgNCkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JcmV0dXJuIC1FSU87Ci0gICAgCi0gICAgcyA9IHVzZXItPnNvY2tldDsKLSAgICBpZiAocy0+c3RhdGUgJiBEU19TT0NLRVRfREVBRCkKLSAgICAgICAgcmV0dXJuIC1FSU87Ci0KLSAgICByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocy0+cXVldWUsICFxdWV1ZV9lbXB0eSh1c2VyKSk7Ci0gICAgaWYgKHJldCA9PSAwKQotCXJldCA9IHB1dF91c2VyKGdldF9xdWV1ZWRfZXZlbnQodXNlciksIChpbnQgX191c2VyICopYnVmKSA/IC1FRkFVTFQgOiA0OwotCi0gICAgcmV0dXJuIHJldDsKLX0gLyogZHNfcmVhZCAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIHNzaXplX3QgZHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSAgICBkc19kYmcoMiwgImRzX3dyaXRlKHNvY2tldCAlZClcbiIsIGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOwotCi0gICAgaWYgKGNvdW50ICE9IDQpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKLQlyZXR1cm4gLUVCQURGOwotCi0gICAgcmV0dXJuIC1FSU87Ci19IC8qIGRzX3dyaXRlICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBObyBrZXJuZWwgbG9jayAtIGZpbmUgKi8KLXN0YXRpYyB1X2ludCBkc19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotICAgIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqczsKLSAgICB1c2VyX2luZm9fdCAqdXNlcjsKLQotICAgIGRzX2RiZygyLCAiZHNfcG9sbChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKLSAgICAKLSAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQotCXJldHVybiBQT0xMRVJSOwotICAgIHMgPSB1c2VyLT5zb2NrZXQ7Ci0gICAgLyoKLSAgICAgKiBXZSBkb24ndCBjaGVjayBmb3IgYSBkZWFkIHNvY2tldCBoZXJlIHNpbmNlIHRoYXQKLSAgICAgKiB3aWxsIHNlbmQgY2FyZG1nciBpbnRvIGFuIGVuZGxlc3Mgc3Bpbi4KLSAgICAgKi8KLSAgICBwb2xsX3dhaXQoZmlsZSwgJnMtPnF1ZXVlLCB3YWl0KTsKLSAgICBpZiAoIXF1ZXVlX2VtcHR5KHVzZXIpKQotCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotICAgIHJldHVybiAwOwotfSAvKiBkc19wb2xsICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1leHRlcm4gaW50IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbyhhZGp1c3RfdCAqYWRqKTsKLQotc3RhdGljIGludCBkc19pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQotewotICAgIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqczsKLSAgICB2b2lkIF9fdXNlciAqdWFyZyA9IChjaGFyIF9fdXNlciAqKWFyZzsKLSAgICB1X2ludCBzaXplOwotICAgIGludCByZXQsIGVycjsKLSAgICBkc19pb2N0bF9hcmdfdCAqYnVmOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotCi0gICAgZHNfZGJnKDIsICJkc19pb2N0bChzb2NrZXQgJWQsICUjeCwgJSNseClcbiIsIGltaW5vcihpbm9kZSksIGNtZCwgYXJnKTsKLSAgICAKLSAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQotCXJldHVybiAtRUlPOwotCi0gICAgcyA9IHVzZXItPnNvY2tldDsKLSAgICBpZiAocy0+c3RhdGUgJiBEU19TT0NLRVRfREVBRCkKLSAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgCi0gICAgc2l6ZSA9IChjbWQgJiBJT0NTSVpFX01BU0spID4+IElPQ1NJWkVfU0hJRlQ7Ci0gICAgaWYgKHNpemUgPiBzaXplb2YoZHNfaW9jdGxfYXJnX3QpKSByZXR1cm4gLUVJTlZBTDsKLQotICAgIC8qIFBlcm1pc3Npb24gY2hlY2sgKi8KLSAgICBpZiAoIShjbWQgJiBJT0NfT1VUKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQlyZXR1cm4gLUVQRVJNOwotCQotICAgIGlmIChjbWQgJiBJT0NfSU4pIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWFyZywgc2l6ZSkpIHsKLQkgICAgZHNfZGJnKDMsICJkc19pb2N0bCgpOiB2ZXJpZnlfcmVhZCA9ICVkXG4iLCAtRUZBVUxUKTsKLQkgICAgcmV0dXJuIC1FRkFVTFQ7Ci0JfQotICAgIH0KLSAgICBpZiAoY21kICYgSU9DX09VVCkgewotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFyZywgc2l6ZSkpIHsKLQkgICAgZHNfZGJnKDMsICJkc19pb2N0bCgpOiB2ZXJpZnlfd3JpdGUgPSAlZFxuIiwgLUVGQVVMVCk7Ci0JICAgIHJldHVybiAtRUZBVUxUOwotCX0KLSAgICB9Ci0gICAgYnVmID0ga21hbGxvYyhzaXplb2YoZHNfaW9jdGxfYXJnX3QpLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIWJ1ZikKLQlyZXR1cm4gLUVOT01FTTsKLSAgICAKLSAgICBlcnIgPSByZXQgPSAwOwotICAgIAotICAgIGlmIChjbWQgJiBJT0NfSU4pIF9fY29weV9mcm9tX3VzZXIoKGNoYXIgKilidWYsIHVhcmcsIHNpemUpOwotICAgIAotICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTzoKLQlyZXQgPSBwY21jaWFfYWRqdXN0X3Jlc291cmNlX2luZm8oJmJ1Zi0+YWRqdXN0KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9DQVJEX1NFUlZJQ0VTX0lORk86Ci0JcmV0ID0gcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oJmJ1Zi0+c2VydmluZm8pOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0NPTkZJR1VSQVRJT05fSU5GTzoKLQlpZiAoYnVmLT5jb25maWcuRnVuY3Rpb24gJiYKLQkgICAoYnVmLT5jb25maWcuRnVuY3Rpb24gPj0gcy0+cGFyZW50LT5mdW5jdGlvbnMpKQotCSAgICByZXQgPSBDU19CQURfQVJHUzsKLQllbHNlCi0JICAgIHJldCA9IHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHMtPnBhcmVudCwKLQkJCWJ1Zi0+Y29uZmlnLkZ1bmN0aW9uLCAmYnVmLT5jb25maWcpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1RVUExFOgotCWRvd24oJnMtPnBhcmVudC0+c2t0X3NlbSk7Ci0JcGNtY2lhX3ZhbGlkYXRlX21lbShzLT5wYXJlbnQpOwotCXVwKCZzLT5wYXJlbnQtPnNrdF9zZW0pOwotCXJldCA9IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocy0+cGFyZW50LCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+dHVwbGUpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX05FWFRfVFVQTEU6Ci0JcmV0ID0gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMtPnBhcmVudCwgQklORF9GTl9BTEwsICZidWYtPnR1cGxlKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9UVVBMRV9EQVRBOgotCWJ1Zi0+dHVwbGUuVHVwbGVEYXRhID0gYnVmLT50dXBsZV9wYXJzZS5kYXRhOwotCWJ1Zi0+dHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YSk7Ci0JcmV0ID0gcGNjYXJkX2dldF90dXBsZV9kYXRhKHMtPnBhcmVudCwgJmJ1Zi0+dHVwbGUpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfUEFSU0VfVFVQTEU6Ci0JYnVmLT50dXBsZS5UdXBsZURhdGEgPSBidWYtPnR1cGxlX3BhcnNlLmRhdGE7Ci0JcmV0ID0gcGNjYXJkX3BhcnNlX3R1cGxlKCZidWYtPnR1cGxlLCAmYnVmLT50dXBsZV9wYXJzZS5wYXJzZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19SRVNFVF9DQVJEOgotCXJldCA9IHBjY2FyZF9yZXNldF9jYXJkKHMtPnBhcmVudCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfU1RBVFVTOgotCWlmIChidWYtPnN0YXR1cy5GdW5jdGlvbiAmJgotCSAgIChidWYtPnN0YXR1cy5GdW5jdGlvbiA+PSBzLT5wYXJlbnQtPmZ1bmN0aW9ucykpCi0JICAgIHJldCA9IENTX0JBRF9BUkdTOwotCWVsc2UKLQlyZXQgPSBwY2NhcmRfZ2V0X3N0YXR1cyhzLT5wYXJlbnQsIGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uLCAmYnVmLT5zdGF0dXMpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfVkFMSURBVEVfQ0lTOgotCWRvd24oJnMtPnBhcmVudC0+c2t0X3NlbSk7Ci0JcGNtY2lhX3ZhbGlkYXRlX21lbShzLT5wYXJlbnQpOwotCXVwKCZzLT5wYXJlbnQtPnNrdF9zZW0pOwotCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocy0+cGFyZW50LCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+Y2lzaW5mbyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19TVVNQRU5EX0NBUkQ6Ci0JcmV0ID0gcGNtY2lhX3N1c3BlbmRfY2FyZChzLT5wYXJlbnQpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfUkVTVU1FX0NBUkQ6Ci0JcmV0ID0gcGNtY2lhX3Jlc3VtZV9jYXJkKHMtPnBhcmVudCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19FSkVDVF9DQVJEOgotCWVyciA9IHBjbWNpYV9lamVjdF9jYXJkKHMtPnBhcmVudCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19JTlNFUlRfQ0FSRDoKLQllcnIgPSBwY21jaWFfaW5zZXJ0X2NhcmQocy0+cGFyZW50KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0FDQ0VTU19DT05GSUdVUkFUSU9OX1JFR0lTVEVSOgotCWlmICgoYnVmLT5jb25mX3JlZy5BY3Rpb24gPT0gQ1NfV1JJVEUpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JICAgIGVyciA9IC1FUEVSTTsKLQkgICAgZ290byBmcmVlX291dDsKLQl9Ci0JaWYgKGJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24gJiYKLQkgICAoYnVmLT5jb25mX3JlZy5GdW5jdGlvbiA+PSBzLT5wYXJlbnQtPmZ1bmN0aW9ucykpCi0JICAgIHJldCA9IENTX0JBRF9BUkdTOwotCWVsc2UKLQkgICAgcmV0ID0gcGNjYXJkX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHMtPnBhcmVudCwKLQkJCWJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24sICZidWYtPmNvbmZfcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9GSVJTVF9SRUdJT046Ci0gICAgY2FzZSBEU19HRVRfTkVYVF9SRUdJT046Ci0gICAgY2FzZSBEU19CSU5EX01URDoKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJZXJyID0gLUVQRVJNOwotCQlnb3RvIGZyZWVfb3V0OwotCX0gZWxzZSB7Ci0JCXN0YXRpYyBpbnQgcHJpbnRlZCA9IDA7Ci0JCWlmICghcHJpbnRlZCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiMi42LiBrZXJuZWxzIHVzZSBwY21jaWFtdGQgaW5zdGVhZCBvZiBtZW1vcnlfY3MuYyBhbmQgZG8gbm90IHJlcXVpcmUgc3BlY2lhbFxuIik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJNVEQgaGFuZGxpbmcgYW55IG1vcmUuXG4iKTsKLQkJCXByaW50ZWQrKzsKLQkJfQotCX0KLQllcnIgPSAtRUlOVkFMOwotCWdvdG8gZnJlZV9vdXQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfRklSU1RfV0lORE9XOgotCXJldCA9IHBjbWNpYV9nZXRfd2luZG93KHMtPnBhcmVudCwgJmJ1Zi0+d2luX2luZm8uaGFuZGxlLCAwLAotCQkJJmJ1Zi0+d2luX2luZm8ud2luZG93KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9ORVhUX1dJTkRPVzoKLQlyZXQgPSBwY21jaWFfZ2V0X3dpbmRvdyhzLT5wYXJlbnQsICZidWYtPndpbl9pbmZvLmhhbmRsZSwKLQkJCWJ1Zi0+d2luX2luZm8uaGFuZGxlLT5pbmRleCArIDEsICZidWYtPndpbl9pbmZvLndpbmRvdyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfTUVNX1BBR0U6Ci0JcmV0ID0gcGNtY2lhX2dldF9tZW1fcGFnZShidWYtPndpbl9pbmZvLmhhbmRsZSwKLQkJCSAgICZidWYtPndpbl9pbmZvLm1hcCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19SRVBMQUNFX0NJUzoKLQlyZXQgPSBwY21jaWFfcmVwbGFjZV9jaXMocy0+cGFyZW50LCAmYnVmLT5jaXNkdW1wKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0JJTkRfUkVRVUVTVDoKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJZXJyID0gLUVQRVJNOwotCQlnb3RvIGZyZWVfb3V0OwotCX0KLQllcnIgPSBiaW5kX3JlcXVlc3QocywgJmJ1Zi0+YmluZF9pbmZvKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9ERVZJQ0VfSU5GTzoKLQllcnIgPSBnZXRfZGV2aWNlX2luZm8ocywgJmJ1Zi0+YmluZF9pbmZvLCAxKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9ORVhUX0RFVklDRToKLQllcnIgPSBnZXRfZGV2aWNlX2luZm8ocywgJmJ1Zi0+YmluZF9pbmZvLCAwKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1VOQklORF9SRVFVRVNUOgotCWVyciA9IDA7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQllcnIgPSAtRUlOVkFMOwotICAgIH0KLSAgICAKLSAgICBpZiAoKGVyciA9PSAwKSAmJiAocmV0ICE9IENTX1NVQ0NFU1MpKSB7Ci0JZHNfZGJnKDIsICJkc19pb2N0bDogcmV0ID0gJWRcbiIsIHJldCk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIENTX0JBRF9TT0NLRVQ6IGNhc2UgQ1NfTk9fQ0FSRDoKLQkgICAgZXJyID0gLUVOT0RFVjsgYnJlYWs7Ci0JY2FzZSBDU19CQURfQVJHUzogY2FzZSBDU19CQURfQVRUUklCVVRFOiBjYXNlIENTX0JBRF9JUlE6Ci0JY2FzZSBDU19CQURfVFVQTEU6Ci0JICAgIGVyciA9IC1FSU5WQUw7IGJyZWFrOwotCWNhc2UgQ1NfSU5fVVNFOgotCSAgICBlcnIgPSAtRUJVU1k7IGJyZWFrOwotCWNhc2UgQ1NfT1VUX09GX1JFU09VUkNFOgotCSAgICBlcnIgPSAtRU5PU1BDOyBicmVhazsKLQljYXNlIENTX05PX01PUkVfSVRFTVM6Ci0JICAgIGVyciA9IC1FTk9EQVRBOyBicmVhazsKLQljYXNlIENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOgotCSAgICBlcnIgPSAtRU5PU1lTOyBicmVhazsKLQlkZWZhdWx0OgotCSAgICBlcnIgPSAtRUlPOyBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKGNtZCAmIElPQ19PVVQpIHsKLSAgICAgICAgaWYgKF9fY29weV90b191c2VyKHVhcmcsIChjaGFyICopYnVmLCBzaXplKSkKLSAgICAgICAgICAgIGVyciA9IC1FRkFVTFQ7Ci0gICAgfQotCi1mcmVlX291dDoKLSAgICBrZnJlZShidWYpOwotICAgIHJldHVybiBlcnI7Ci19IC8qIGRzX2lvY3RsICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBkc19vcGVuLAotCS5yZWxlYXNlCT0gZHNfcmVsZWFzZSwKLQkuaW9jdGwJCT0gZHNfaW9jdGwsCi0JLnJlYWQJCT0gZHNfcmVhZCwKLQkud3JpdGUJCT0gZHNfd3JpdGUsCi0JLnBvbGwJCT0gZHNfcG9sbCwKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrIHBjbWNpYV9idXNfY2FsbGJhY2sgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmV2ZW50ID0gZHNfZXZlbnQsCisJLnJlcXVlcnkgPSBwY21jaWFfYnVzX3Jlc2NhbiwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjbWNpYV9idXNfYWRkX3NvY2tldChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldCA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7Ci0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwogCWludCByZXQ7CiAKLQlzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXMpCi0JCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0KSk7Ci0KLQkvKiBnZXQgcmVmZXJlbmNlIHRvIHBhcmVudCBzb2NrZXQgKi8KLQlzLT5wYXJlbnQgPSBwY21jaWFfZ2V0X3NvY2tldChzb2NrZXQpOwotCWlmICghcy0+cGFyZW50KSB7CisJc29ja2V0ID0gcGNtY2lhX2dldF9zb2NrZXQoc29ja2V0KTsKKwlpZiAoIXNvY2tldCkgewogCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQSBvYnRhaW5pbmcgcmVmZXJlbmNlIHRvIHNvY2tldCAlcCBmYWlsZWRcbiIsIHNvY2tldCk7Ci0JCWtmcmVlIChzKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Ja3JlZl9pbml0KCZzLT5yZWZjb3VudCk7Ci0gICAgCiAJLyoKIAkgKiBVZ2x5LiBCdXQgd2Ugd2FudCB0byB3YWl0IGZvciB0aGUgc29ja2V0IHRocmVhZHMgdG8gaGF2ZSBzdGFydGVkIHVwLgogCSAqIFdlIHJlYWxseSBzaG91bGQgbGV0IHRoZSBkcml2ZXJzIHRoZW1zZWx2ZXMgZHJpdmUgc29tZSBvZiB0aGlzLi4KIAkgKi8KIAltc2xlZXAoMjUwKTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPnF1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmcy0+ZGV2aWNlc19saXN0KTsKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ja2V0LT5xdWV1ZSk7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmc29ja2V0LT5kZXZpY2VzX2xpc3QpOworCUlOSVRfV09SSygmc29ja2V0LT5kZXZpY2VfYWRkLCBwY21jaWFfZGVsYXllZF9hZGRfcHNldWRvX2RldmljZSwgc29ja2V0KTsKKwltZW1zZXQoJnNvY2tldC0+cGNtY2lhX3N0YXRlLCAwLCBzaXplb2YodTgpKTsKKwlzb2NrZXQtPmRldmljZV9jb3VudCA9IDA7CiAKLQkvKiBTZXQgdXAgaG90bGluZSB0byBDYXJkIFNlcnZpY2VzICovCi0Jcy0+Y2FsbGJhY2sub3duZXIgPSBUSElTX01PRFVMRTsKLQlzLT5jYWxsYmFjay5ldmVudCA9ICZkc19ldmVudDsKLQlzLT5jYWxsYmFjay5yZXNvdXJjZXNfZG9uZSA9ICZwY21jaWFfY2FyZF9hZGQ7Ci0Jc29ja2V0LT5wY21jaWEgPSBzOwotCi0JcmV0ID0gcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzb2NrZXQsICZzLT5jYWxsYmFjayk7CisJcmV0ID0gcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzb2NrZXQsICZwY21jaWFfYnVzX2NhbGxiYWNrKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENNQ0lBIHJlZ2lzdHJhdGlvbiBQQ0NhcmQgY29yZSBmYWlsZWQgZm9yIHNvY2tldCAlcFxuIiwgc29ja2V0KTsKLQkJcGNtY2lhX3B1dF9idXNfc29ja2V0KHMpOwotCQlzb2NrZXQtPnBjbWNpYSA9IE5VTEw7CisJCXBjbWNpYV9wdXRfc29ja2V0KHNvY2tldCk7CiAJCXJldHVybiAocmV0KTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBwY21jaWFfYnVzX3JlbW92ZV9zb2NrZXQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOwogCi0JaWYgKCFzb2NrZXQgfHwgIXNvY2tldC0+cGNtY2lhKQorCWlmICghc29ja2V0KQogCQlyZXR1cm47CiAKKwlzb2NrZXQtPnBjbWNpYV9zdGF0ZS5kZWFkID0gMTsKIAlwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHNvY2tldCwgTlVMTCk7CiAKLQlzb2NrZXQtPnBjbWNpYS0+c3RhdGUgfD0gRFNfU09DS0VUX0RFQUQ7Ci0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHNvY2tldC0+cGNtY2lhKTsKLQlzb2NrZXQtPnBjbWNpYSA9IE5VTEw7CisJcGNtY2lhX3B1dF9zb2NrZXQoc29ja2V0KTsKIAogCXJldHVybjsKIH0KQEAgLTE1NzUsMzQgKzExOTgsMjAgQEAKIAogc3RydWN0IGJ1c190eXBlIHBjbWNpYV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJwY21jaWEiLAorCS5ob3RwbHVnID0gcGNtY2lhX2J1c19ob3RwbHVnLAogCS5tYXRjaCA9IHBjbWNpYV9idXNfbWF0Y2gsCiAJLmRldl9hdHRycyA9IHBjbWNpYV9kZXZfYXR0cnMsCiB9OwotRVhQT1JUX1NZTUJPTChwY21jaWFfYnVzX3R5cGUpOwogCiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGNtY2lhX2J1cyh2b2lkKQogewotCWludCBpOwotCiAJc3Bpbl9sb2NrX2luaXQoJnBjbWNpYV9kZXZfbGlzdF9sb2NrKTsKIAogCWJ1c19yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKIAljbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKIAotCS8qIFNldCB1cCBjaGFyYWN0ZXIgZGV2aWNlIGZvciB1c2VyIG1vZGUgY2xpZW50cyAqLwotCWkgPSByZWdpc3Rlcl9jaHJkZXYoMCwgInBjbWNpYSIsICZkc19mb3BzKTsKLQlpZiAoaSA8IDApCi0JCXByaW50ayhLRVJOX05PVElDRSAidW5hYmxlIHRvIGZpbmQgYSBmcmVlIGRldmljZSAjIGZvciAiCi0JCSAgICAgICAiRHJpdmVyIFNlcnZpY2VzIChlcnJvcj0lZClcbiIsIGkpOwotCWVsc2UKLQkJbWFqb3JfZGV2ID0gaTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcHJvY19wY2NhcmQgPSBwcm9jX21rZGlyKCJwY2NhcmQiLCBwcm9jX2J1cyk7Ci0JaWYgKHByb2NfcGNjYXJkKQotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJkcml2ZXJzIiwwLHByb2NfcGNjYXJkLHByb2NfcmVhZF9kcml2ZXJzLE5VTEwpOwotI2VuZGlmCisJcGNtY2lhX3NldHVwX2lvY3RsKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MTIsNDggKzEyMjEsMTMgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcGNtY2lhX2J1cyh2b2lkKQogewotCWNsYXNzX2ludGVyZmFjZV91bnJlZ2lzdGVyKCZwY21jaWFfYnVzX2ludGVyZmFjZSk7CisJcGNtY2lhX2NsZWFudXBfaW9jdGwoKTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKHByb2NfcGNjYXJkKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXJzIiwgcHJvY19wY2NhcmQpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicGNjYXJkIiwgcHJvY19idXMpOwotCX0KLSNlbmRpZgotCWlmIChtYWpvcl9kZXYgIT0gLTEpCi0JCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yX2RldiwgInBjbWNpYSIpOworCWNsYXNzX2ludGVyZmFjZV91bnJlZ2lzdGVyKCZwY21jaWFfYnVzX2ludGVyZmFjZSk7CiAKIAlidXNfdW5yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKIH0KIG1vZHVsZV9leGl0KGV4aXRfcGNtY2lhX2J1cyk7CiAKIAotCi0vKiBoZWxwZXJzIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqIGdldF9zb2NrZXRfaW5mb19ieV9ucih1bnNpZ25lZCBpbnQgbnIpCi17Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzID0gcGNtY2lhX2dldF9zb2NrZXRfYnlfbnIobnIpOwotCWlmIChzICYmIHMtPnBjbWNpYSkKLQkJcmV0dXJuIHMtPnBjbWNpYTsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi0vKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBhY2Nlc3Npbmcgb2YgZHJpdmVyIC0tLSBieSBuYW1lISAqLwotCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgKiBnZXRfcGNtY2lhX2RyaXZlciAoZGV2X2luZm9fdCAqZGV2X2luZm8pCi17Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKLQlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnY7Ci0KLQlkcnYgPSBkcml2ZXJfZmluZCgoY2hhciAqKSBkZXZfaW5mbywgJnBjbWNpYV9idXNfdHlwZSk7Ci0JaWYgKCFkcnYpCi0JCXJldHVybiBOVUxMOwotCi0JcF9kcnYgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KTsKLQotCXJldHVybiAocF9kcnYpOwotfQotCiBNT0RVTEVfQUxJQVMoImRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvZHNfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU5YmQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY21jaWEvZHNfaW50ZXJuYWwuaApAQCAtMCwwICsxLDIxIEBACisvKiBkc19pbnRlcm5hbC5oIC0gaW50ZXJuYWwgaGVhZGVyIGZvciAxNi1iaXQgUENNQ0lBIGRldmljZXMgbWFuYWdlbWVudCAqLworCitleHRlcm4gc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlOworCitleHRlcm4gc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOworZXh0ZXJuIHZvaWQgcGNtY2lhX3B1dF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKKworc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZGV2aWNlX2FkZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmN0aW9uKTsKKworI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKK2V4dGVybiB2b2lkIF9faW5pdCBwY21jaWFfc2V0dXBfaW9jdGwodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCk7CitleHRlcm4gdm9pZCBoYW5kbGVfZXZlbnQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpOworZXh0ZXJuIGludCBoYW5kbGVfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwY21jaWFfc2V0dXBfaW9jdGwodm9pZCkgeyByZXR1cm47IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCkgeyByZXR1cm47IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfZXZlbnQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkgeyByZXR1cm4gQ1NfU1VDQ0VTUzsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9oZDY0NDY1X3NzLmMgYi9kcml2ZXJzL3BjbWNpYS9oZDY0NDY1X3NzLmMKaW5kZXggNWFiNTVhZS4uMzE2ZjhiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2hkNjQ0NjVfc3MuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2hkNjQ0NjUuaD4KICNpbmNsdWRlIDxhc20vaGQ2NDQ2NS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCmluZGV4IDkwYTMzNWEuLmE3MTMwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCkBAIC01Myw3ICs1Myw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KQEAgLTY2OSwxMSArNjY4LDEzIEBACiAgICAgaWYgKChzdGF0ICYgSTM2NV9DU19ERVRFQ1QpICYmIChzdGF0ICYgSTM2NV9DU19QT1dFUk9OKSAmJgogCShpMzY1X2dldChzb2NrLCBJMzY1X0lOVENUTCkgJiBJMzY1X1BDX0lPQ0FSRCkgJiYKIAkoaTM2NV9nZXQoc29jaywgSTM2NV9BRERSV0lOKSAmIEkzNjVfRU5BX0lPKDApKSAmJgotCShjaGVja19yZWdpb24oc3RhcnQsIHN0b3Atc3RhcnQrMSkgIT0gMCkgJiYKLQkoKHN0YXJ0ICYgMHhmZWVmKSAhPSAweDAyZTgpKQotCXJldHVybiAxOwotICAgIGVsc2UKLQlyZXR1cm4gMDsKKwkoKHN0YXJ0ICYgMHhmZWVmKSAhPSAweDAyZTgpKSB7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzdGFydCwgc3RvcC1zdGFydCsxLCAiaTgyMzY1IikpCisJICAgIHJldHVybiAxOworCXJlbGVhc2VfcmVnaW9uKHN0YXJ0LCBzdG9wLXN0YXJ0KzEpOworICAgIH0KKworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTY5Niw4ICs2OTcsNiBAQAogICAgIHN0cnVjdCBpODIzNjVfc29ja2V0ICp0ID0gJnNvY2tldFtzb2NrZXRzLW5zXTsKIAogICAgIGJhc2UgPSBzb2NrZXRzLW5zOwotICAgIGlmICh0LT5pb2FkZHIgPiAwKSByZXF1ZXN0X3JlZ2lvbih0LT5pb2FkZHIsIDIsICJpODIzNjUiKTsKLSAgICAKICAgICBpZiAoYmFzZSA9PSAwKSBwcmludGsoIlxuIik7CiAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAlcyIsIHBjaWNbdHlwZV0ubmFtZSk7CiAgICAgcHJpbnRrKCIgSVNBLXRvLVBDTUNJQSBhdCBwb3J0ICUjbHggb2ZzIDB4JTAyeCIsCkBAIC04MDMsNyArODAyLDcgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIGlmIChjaGVja19yZWdpb24oaTM2NV9iYXNlLCAyKSAhPSAwKSB7CisgICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbihpMzY1X2Jhc2UsIDIsICJpODIzNjUiKSkgewogCWlmIChzb2NrZXRzID09IDApCiAJICAgIHByaW50aygicG9ydCBjb25mbGljdCBhdCAlI2x4XG4iLCBpMzY1X2Jhc2UpOwogCXJldHVybjsKQEAgLTE0NDEsNiArMTQ0MCw3IEBACiAJaTM2NV9zZXQoaSwgSTM2NV9DU0NJTlQsIDApOwogCXJlbGVhc2VfcmVnaW9uKHNvY2tldFtpXS5pb2FkZHIsIDIpOwogICAgIH0KKyAgICByZWxlYXNlX3JlZ2lvbihpMzY1X2Jhc2UsIDIpOwogI2lmZGVmIENPTkZJR19QTlAKICAgICBpZiAoaTgyMzY1X3BucGRldikKICAgICAJCXBucF9kaXNhYmxlX2RldihpODIzNjVfcG5wZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCmluZGV4IGIxMTExYzYuLjY1ZjNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwppbmRleCBjMDk5N2M0Li43YjE0ZDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jb21wYXQuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jb21wYXQuYwppbmRleCA2OGI4MDA4Li5lYmIxNjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfY29tcGF0LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2NvbXBhdC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CkBAIC0yOCw5OCArMjcsMzkgQEAKIAogI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCiAKLWludCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlKQoraW50IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB0dXBsZV90ICp0dXBsZSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBoYW5kbGUtPkZ1bmN0aW9uLCB0dXBsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIHR1cGxlKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9maXJzdF90dXBsZSk7CiAKLWludCBwY21jaWFfZ2V0X25leHRfdHVwbGUoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUpCitpbnQgcGNtY2lhX2dldF9uZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgdHVwbGVfdCAqdHVwbGUpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBoYW5kbGUtPkZ1bmN0aW9uLCB0dXBsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfbmV4dF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgdHVwbGUpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X25leHRfdHVwbGUpOwogCi1pbnQgcGNtY2lhX2dldF90dXBsZV9kYXRhKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlKQoraW50IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIHR1cGxlX3QgKnR1cGxlKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCXJldHVybiBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocywgdHVwbGUpOworCXJldHVybiBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocF9kZXYtPnNvY2tldCwgdHVwbGUpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3R1cGxlX2RhdGEpOwogCi1pbnQgcGNtY2lhX3BhcnNlX3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKK2ludCBwY21jaWFfcGFyc2VfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCiB7CiAJcmV0dXJuIHBjY2FyZF9wYXJzZV90dXBsZSh0dXBsZSwgcGFyc2UpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfcGFyc2VfdHVwbGUpOwogCi1pbnQgcGNtY2lhX3ZhbGlkYXRlX2NpcyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjaXNpbmZvX3QgKmluZm8pCitpbnQgcGNtY2lhX3ZhbGlkYXRlX2NpcyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNpc2luZm9fdCAqaW5mbykKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCBoYW5kbGUtPkZ1bmN0aW9uLCBpbmZvKTsKKwlyZXR1cm4gcGNjYXJkX3ZhbGlkYXRlX2NpcyhwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgaW5mbyk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV92YWxpZGF0ZV9jaXMpOwogCi1pbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwKLQkJCQkgIGNvbmZpZ19pbmZvX3QgKmNvbmZpZykKKworaW50IHBjbWNpYV9yZXNldF9jYXJkKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY2xpZW50X3JlcV90ICpyZXEpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0KLQlpZiAoKENIRUNLX0hBTkRMRShoYW5kbGUpKSB8fCAhY29uZmlnKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlyZXR1cm4gcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8ocywgaGFuZGxlLT5GdW5jdGlvbiwgY29uZmlnKTsKLX0KLUVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8pOwotCi1pbnQgcGNtY2lhX3Jlc2V0X2NhcmQoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY2xpZW50X3JlcV90ICpyZXEpCi17Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdDsKLSAgICAKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXNrdCA9IFNPQ0tFVChoYW5kbGUpOwotCWlmICghc2t0KQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQotCXJldHVybiBwY2NhcmRfcmVzZXRfY2FyZChza3QpOworCXJldHVybiBwY2NhcmRfcmVzZXRfY2FyZChwX2Rldi0+c29ja2V0KTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3Jlc2V0X2NhcmQpOwotCi1pbnQgcGNtY2lhX2dldF9zdGF0dXMoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY3Nfc3RhdHVzX3QgKnN0YXR1cykKLXsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX2dldF9zdGF0dXMocywgaGFuZGxlLT5GdW5jdGlvbiwgc3RhdHVzKTsKLX0KLUVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9zdGF0dXMpOwotCi1pbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsCi0JCQkJCSBjb25mX3JlZ190ICpyZWcpCi17Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzLCBoYW5kbGUtPkZ1bmN0aW9uLCByZWcpOwotfQotRVhQT1JUX1NZTUJPTChwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmE2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYwpAQCAtMCwwICsxLDc1OSBAQAorLyoKKyAqIHBjbWNpYV9pb2N0bC5jIC0tIGlvY3RsIGludGVyZmFjZSBmb3IgY2FyZG1nciBhbmQgY2FyZGN0bAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgKiA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogKEMpIDE5OTkJCURhdmlkIEEuIEhpbmRzCisgKiAoQykgMjAwMyAtIDIwMDQJRG9taW5payBCcm9kb3dza2kKKyAqLworCisvKgorICogVGhpcyBmaWxlIHdpbGwgZ28gYXdheSBzb29uLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisKKyNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRzX2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgbWFqb3JfZGV2ID0gLTE7CisKKworLyogRGV2aWNlIHVzZXIgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTUFYX0VWRU5UUwkzMgorI2RlZmluZSBVU0VSX01BR0lDCTB4N2VhNAorI2RlZmluZSBDSEVDS19VU0VSKHUpIFwKKyAgICAoKCh1KSA9PSBOVUxMKSB8fCAoKHUpLT51c2VyX21hZ2ljICE9IFVTRVJfTUFHSUMpKQorCit0eXBlZGVmIHN0cnVjdCB1c2VyX2luZm9fdCB7CisJdV9pbnQJCQl1c2VyX21hZ2ljOworCWludAkJCWV2ZW50X2hlYWQsIGV2ZW50X3RhaWw7CisJZXZlbnRfdAkJCWV2ZW50W01BWF9FVkVOVFNdOworCXN0cnVjdCB1c2VyX2luZm9fdAkqbmV4dDsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldAkqc29ja2V0OworfSB1c2VyX2luZm9fdDsKKworCisjaWZkZWYgREVCVUcKK2V4dGVybiBpbnQgZHNfcGNfZGVidWc7CisjZGVmaW5lIGNzX3NvY2tldF9uYW1lKHNrdCkgICAgKChza3QpLT5kZXYuY2xhc3NfaWQpCisKKyNkZWZpbmUgZHNfZGJnKGx2bCwgZm10LCBhcmcuLi4pIGRvIHsJCVwKKwlpZiAoZHNfcGNfZGVidWcgPj0gbHZsKQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHICJkczogIiBmbXQgLCAjIyBhcmcpOwkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBhY2Nlc3Npbmcgb2YgZHJpdmVyIC0tLSBieSBuYW1lISAqLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgKiBnZXRfcGNtY2lhX2RyaXZlciAoZGV2X2luZm9fdCAqZGV2X2luZm8pCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnY7CisKKwlkcnYgPSBkcml2ZXJfZmluZCgoY2hhciAqKSBkZXZfaW5mbywgJnBjbWNpYV9idXNfdHlwZSk7CisJaWYgKCFkcnYpCisJCXJldHVybiBOVUxMOworCisJcF9kcnYgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KTsKKworCXJldHVybiAocF9kcnYpOworfQorCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19wY2NhcmQgPSBOVUxMOworCitzdGF0aWMgaW50IHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsIHZvaWQgKmQpCit7CisJY2hhciAqKnAgPSBkOworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IGNvbnRhaW5lcl9vZihkcml2ZXIsCisJCQkJCQkgICBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KTsKKworCSpwICs9IHNwcmludGYoKnAsICIlLTI0LjI0cyAxICVkXG4iLCBwX2Rydi0+ZHJ2Lm5hbWUsCisjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKKwkJICAgICAgKHBfZHJ2LT5vd25lcikgPyBtb2R1bGVfcmVmY291bnQocF9kcnYtPm93bmVyKSA6IDEKKyNlbHNlCisJCSAgICAgIDEKKyNlbmRpZgorCSk7CisJZCA9ICh2b2lkICopIHA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX3JlYWRfZHJpdmVycyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgcG9zLAorCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnAgPSBidWY7CisKKwlidXNfZm9yX2VhY2hfZHJ2KCZwY21jaWFfYnVzX3R5cGUsIE5VTEwsCisJCQkgKHZvaWQgKikgJnAsIHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKTsKKworCXJldHVybiAocCAtIGJ1Zik7Cit9CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGVzZSBtYW5hZ2UgYSByaW5nIGJ1ZmZlciBvZiBldmVudHMgcGVuZGluZyBmb3Igb25lIHVzZXIgcHJvY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgaW50IHF1ZXVlX2VtcHR5KHVzZXJfaW5mb190ICp1c2VyKQoreworICAgIHJldHVybiAodXNlci0+ZXZlbnRfaGVhZCA9PSB1c2VyLT5ldmVudF90YWlsKTsKK30KKworc3RhdGljIGV2ZW50X3QgZ2V0X3F1ZXVlZF9ldmVudCh1c2VyX2luZm9fdCAqdXNlcikKK3sKKyAgICB1c2VyLT5ldmVudF90YWlsID0gKHVzZXItPmV2ZW50X3RhaWwrMSkgJSBNQVhfRVZFTlRTOworICAgIHJldHVybiB1c2VyLT5ldmVudFt1c2VyLT5ldmVudF90YWlsXTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfZXZlbnQodXNlcl9pbmZvX3QgKnVzZXIsIGV2ZW50X3QgZXZlbnQpCit7CisgICAgdXNlci0+ZXZlbnRfaGVhZCA9ICh1c2VyLT5ldmVudF9oZWFkKzEpICUgTUFYX0VWRU5UUzsKKyAgICBpZiAodXNlci0+ZXZlbnRfaGVhZCA9PSB1c2VyLT5ldmVudF90YWlsKQorCXVzZXItPmV2ZW50X3RhaWwgPSAodXNlci0+ZXZlbnRfdGFpbCsxKSAlIE1BWF9FVkVOVFM7CisgICAgdXNlci0+ZXZlbnRbdXNlci0+ZXZlbnRfaGVhZF0gPSBldmVudDsKK30KKwordm9pZCBoYW5kbGVfZXZlbnQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpCit7CisgICAgdXNlcl9pbmZvX3QgKnVzZXI7CisgICAgZm9yICh1c2VyID0gcy0+dXNlcjsgdXNlcjsgdXNlciA9IHVzZXItPm5leHQpCisJcXVldWVfZXZlbnQodXNlciwgZXZlbnQpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmcy0+cXVldWUpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgYmluZF9yZXF1ZXN0KCkgYW5kIGJpbmRfZGV2aWNlKCkgYXJlIG1lcmdlZCBieSBub3cuIFJlZ2lzdGVyX2NsaWVudCgpCisgICAgaXMgY2FsbGVkIHJpZ2h0IGF0IHRoZSBlbmQgb2YgYmluZF9yZXF1ZXN0KCksIGR1cmluZyB0aGUgZHJpdmVyJ3MKKyAgICAtPmF0dGFjaCgpIGNhbGwuIEluZGl2aWR1YWwgZGVzY3JpcHRpb25zOgorCisgICAgYmluZF9yZXF1ZXN0KCkgY29ubmVjdHMgYSBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIGNsaWVudCBkcml2ZXIuCisgICAgSXQgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBkZXZpY2UgSUQgaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZAorICAgIGRyaXZlcnMsIGJpbmRzIGl0IHRvIHRoZSBzb2NrZXQsIGFuZCB0cmllcyB0byBjcmVhdGUgYW4gaW5zdGFuY2UKKyAgICBvZiB0aGUgZGV2aWNlLiAgdW5iaW5kX3JlcXVlc3QoKSBkZWxldGVzIGEgZHJpdmVyIGluc3RhbmNlLgorCisgICAgQmluZF9kZXZpY2UoKSBhc3NvY2lhdGVzIGEgZGV2aWNlIGRyaXZlciB3aXRoIGEgcGFydGljdWxhciBzb2NrZXQuCisgICAgSXQgaXMgbm9ybWFsbHkgY2FsbGVkIGJ5IERyaXZlciBTZXJ2aWNlcyBhZnRlciBpdCBoYXMgaWRlbnRpZmllZAorICAgIGEgbmV3bHkgaW5zZXJ0ZWQgY2FyZC4gIEFuIGluc3RhbmNlIG9mIHRoYXQgZHJpdmVyIHdpbGwgdGhlbiBiZQorICAgIGVsaWdpYmxlIHRvIHJlZ2lzdGVyIGFzIGEgY2xpZW50IG9mIHRoaXMgc29ja2V0LgorCisgICAgUmVnaXN0ZXJfY2xpZW50KCkgdXNlcyB0aGUgZGV2X2luZm9fdCBoYW5kbGUgdG8gbWF0Y2ggdGhlCisgICAgY2FsbGVyIHdpdGggYSBzb2NrZXQuICBUaGUgZHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gYm91bmQKKyAgICB0byBhIHNvY2tldCB3aXRoIGJpbmRfZGV2aWNlKCkgLS0gaW4gZmFjdCwgYmluZF9kZXZpY2UoKQorICAgIGFsbG9jYXRlcyB0aGUgY2xpZW50IHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgdXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYmluZF9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBiaW5kX2luZm9fdCAqYmluZF9pbmZvKQoreworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXMgPSBwY21jaWFfZ2V0X3NvY2tldChzKTsKKwlpZiAoIXMpCisJCXJldHVybiAtRUlOVkFMOworCisJZHNfZGJnKDIsICJiaW5kX3JlcXVlc3QoJWQsICclcycpXG4iLCBzLT5zb2NrLAorCSAgICAgICAoY2hhciAqKWJpbmRfaW5mby0+ZGV2X2luZm8pOworCisJcF9kcnYgPSBnZXRfcGNtY2lhX2RyaXZlcigmYmluZF9pbmZvLT5kZXZfaW5mbyk7CisJaWYgKCFwX2RydikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXQ7CisJfQorCisJaWYgKCF0cnlfbW9kdWxlX2dldChwX2Rydi0+b3duZXIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9kcml2ZXI7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgeworCQlpZiAocF9kZXYtPmZ1bmMgPT0gYmluZF9pbmZvLT5mdW5jdGlvbikgeworCQkJaWYgKChwX2Rldi0+ZGV2LmRyaXZlciA9PSAmcF9kcnYtPmRydikpIHsKKwkJCQlpZiAocF9kZXYtPmNhcmRtZ3IpIHsKKwkJCQkJLyogaWYgdGhlcmUncyBhbHJlYWR5IGEgZGV2aWNlCisJCQkJCSAqIHJlZ2lzdGVyZWQsIGFuZCBpdCB3YXMgcmVnaXN0ZXJlZAorCQkJCQkgKiBieSB1c2Vyc3BhY2UgYmVmb3JlLCB3ZSBuZWVkIHRvCisJCQkJCSAqIHJldHVybiB0aGUgImluc3RhbmNlIi4gKi8KKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwkJCQkJYmluZF9pbmZvLT5pbnN0YW5jZSA9IHBfZGV2LT5pbnN0YW5jZTsKKwkJCQkJcmV0ID0gLUVCVVNZOworCQkJCQlnb3RvIGVycl9wdXRfbW9kdWxlOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIHRoZSBjb3JyZWN0IGRyaXZlciBtYW5hZ2VkIHRvIGJpbmQKKwkJCQkJICogaXRzZWxmIG1hZ2ljYWxseSB0byB0aGUgY29ycmVjdAorCQkJCQkgKiBkZXZpY2UuICovCisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJCQkJCXBfZGV2LT5jYXJkbWdyID0gcF9kcnY7CisJCQkJCXJldCA9IDA7CisJCQkJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisJCQkJfQorCQkJfSBlbHNlIGlmICghcF9kZXYtPmRldi5kcml2ZXIpIHsKKwkJCQkvKiB0aGVyZSdzIGFscmVhZHkgYSBkZXZpY2UgYXZhaWxhYmxlIHdoZXJlCisJCQkJICogbm8gZGV2aWNlIGhhcyBiZWVuIGJvdW5kIHRvIHlldC4gU28gd2UgZG9uJ3QKKwkJCQkgKiBuZWVkIHRvIHJlZ2lzdGVyIGEgZGV2aWNlISAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJCQkJZ290byByZXNjYW47CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKworCXBfZGV2ID0gcGNtY2lhX2RldmljZV9hZGQocywgYmluZF9pbmZvLT5mdW5jdGlvbik7CisJaWYgKCFwX2RldikgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9wdXRfbW9kdWxlOworCX0KKworcmVzY2FuOgorCXBfZGV2LT5jYXJkbWdyID0gcF9kcnY7CisKKwkvKiBpZiBhIGRyaXZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIHdlIGNhbiBhYm9ydCAqLworCWlmIChwX2Rldi0+ZGV2LmRyaXZlcikKKwkJZ290byBlcnJfcHV0X21vZHVsZTsKKworCS8qCisJICogUHJldmVudCB0aGlzIHJhY2luZyB3aXRoIGEgY2FyZCBpbnNlcnRpb24uCisJICovCisJZG93bigmcy0+c2t0X3NlbSk7CisJYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCXVwKCZzLT5za3Rfc2VtKTsKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRyaXZlciBpbmRlZWQgbWF0Y2hlZC4gSSBkb24ndCBjYXJlIGlmIHRoaXMKKwkgKiBpcyByYWN5IG9yIG5vdCwgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4gb24gY2FyZG1nciBhY2Nlc3MKKwkgKiBwYXRocy4uLgorCSAqLworCWlmICghKHBfZGV2LT5kZXYuZHJpdmVyID09ICZwX2Rydi0+ZHJ2KSkKKwkJcF9kZXYtPmNhcmRtZ3IgPSBOVUxMOworCisgZXJyX3B1dF9tb2R1bGU6CisJbW9kdWxlX3B1dChwX2Rydi0+b3duZXIpOworIGVycl9wdXRfZHJpdmVyOgorCXB1dF9kcml2ZXIoJnBfZHJ2LT5kcnYpOworIGVycl9wdXQ6CisJcGNtY2lhX3B1dF9zb2NrZXQocyk7CisKKwlyZXR1cm4gKHJldCk7Cit9IC8qIGJpbmRfcmVxdWVzdCAqLworCisjaWZkZWYgQ09ORklHX0NBUkRCVVMKKworc3RhdGljIHN0cnVjdCBwY2lfYnVzICpwY21jaWFfbG9va3VwX2J1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlpZiAoIXMgfHwgIShzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcy0+Y2JfZGV2LT5zdWJvcmRpbmF0ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgYmluZF9pbmZvX3QgKmJpbmRfaW5mbywgaW50IGZpcnN0KQoreworCWRldl9ub2RlX3QgKm5vZGU7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCS8qCisJICogU29tZSB1bmJlbGlldmFibHkgdWdseSBjb2RlIHRvIGFzc29jaWF0ZSB0aGUgUENJIGNhcmRidXMKKwkgKiBkZXZpY2UgYW5kIGl0cyBkcml2ZXIgd2l0aCB0aGUgUENNQ0lBICJiaW5kIiBpbmZvcm1hdGlvbi4KKwkgKi8KKwl7CisJCXN0cnVjdCBwY2lfYnVzICpidXM7CisKKwkJYnVzID0gcGNtY2lhX2xvb2t1cF9idXMocyk7CisJCWlmIChidXMpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJCQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCQkJbGlzdCA9IGJ1cy0+ZGV2aWNlcy5uZXh0OworCQkJd2hpbGUgKGxpc3QgIT0gJmJ1cy0+ZGV2aWNlcykgeworCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGNpX2Rldl9iKGxpc3QpOworCQkJCWxpc3QgPSBsaXN0LT5uZXh0OworCisJCQkJaWYgKGZpcnN0KSB7CisJCQkJCWRldiA9IHBkZXY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIFRyeSB0byBoYW5kbGUgIm5leHQiIGhlcmUgc29tZSB3YXk/ICovCisJCQl9CisJCQlpZiAoZGV2ICYmIGRldi0+ZHJpdmVyKSB7CisJCQkJc3RybGNweShiaW5kX2luZm8tPm5hbWUsIGRldi0+ZHJpdmVyLT5uYW1lLCBERVZfTkFNRV9MRU4pOworCQkJCWJpbmRfaW5mby0+bWFqb3IgPSAwOworCQkJCWJpbmRfaW5mby0+bWlub3IgPSAwOworCQkJCWJpbmRfaW5mby0+bmV4dCA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgeworCQlpZiAocF9kZXYtPmZ1bmMgPT0gYmluZF9pbmZvLT5mdW5jdGlvbikgeworCQkJcF9kZXYgPSBwY21jaWFfZ2V0X2RldihwX2Rldik7CisJCQlpZiAoIXBfZGV2KQorCQkJCWNvbnRpbnVlOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiAtRU5PREVWOworCisgZm91bmQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICgoIXBfZGV2LT5pbnN0YW5jZSkgfHwKKwkgICAgKHBfZGV2LT5pbnN0YW5jZS0+c3RhdGUgJiBERVZfQ09ORklHX1BFTkRJTkcpKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX3B1dDsKKwl9CisKKwlpZiAoZmlyc3QpCisJCW5vZGUgPSBwX2Rldi0+aW5zdGFuY2UtPmRldjsKKwllbHNlCisJCWZvciAobm9kZSA9IHBfZGV2LT5pbnN0YW5jZS0+ZGV2OyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKKwkJCWlmIChub2RlID09IGJpbmRfaW5mby0+bmV4dCkKKwkJCQlicmVhazsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcHV0OworCX0KKworCXN0cmxjcHkoYmluZF9pbmZvLT5uYW1lLCBub2RlLT5kZXZfbmFtZSwgREVWX05BTUVfTEVOKTsKKwliaW5kX2luZm8tPm1ham9yID0gbm9kZS0+bWFqb3I7CisJYmluZF9pbmZvLT5taW5vciA9IG5vZGUtPm1pbm9yOworCWJpbmRfaW5mby0+bmV4dCA9IG5vZGUtPm5leHQ7CisKKyBlcnJfcHV0OgorCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKKwlyZXR1cm4gKHJldCk7Cit9IC8qIGdldF9kZXZpY2VfaW5mbyAqLworCisKK3N0YXRpYyBpbnQgZHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBzb2NrZXRfdCBpID0gaW1pbm9yKGlub2RlKTsKKyAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKyAgICB1c2VyX2luZm9fdCAqdXNlcjsKKworICAgIGRzX2RiZygwLCAiZHNfb3Blbihzb2NrZXQgJWQpXG4iLCBpKTsKKworICAgIHMgPSBwY21jaWFfZ2V0X3NvY2tldF9ieV9ucihpKTsKKyAgICBpZiAoIXMpCisJICAgIHJldHVybiAtRU5PREVWOworICAgIHMgPSBwY21jaWFfZ2V0X3NvY2tldChzKTsKKyAgICBpZiAoIXMpCisJICAgIHJldHVybiAtRU5PREVWOworCisgICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgeworCSAgICBpZiAocy0+cGNtY2lhX3N0YXRlLmJ1c3kpIHsKKwkJICAgIHBjbWNpYV9wdXRfc29ja2V0KHMpOworCQkgICAgcmV0dXJuIC1FQlVTWTsKKwkgICAgfQorCWVsc2UKKwkgICAgcy0+cGNtY2lhX3N0YXRlLmJ1c3kgPSAxOworICAgIH0KKworICAgIHVzZXIgPSBrbWFsbG9jKHNpemVvZih1c2VyX2luZm9fdCksIEdGUF9LRVJORUwpOworICAgIGlmICghdXNlcikgeworCSAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorICAgIHVzZXItPmV2ZW50X3RhaWwgPSB1c2VyLT5ldmVudF9oZWFkID0gMDsKKyAgICB1c2VyLT5uZXh0ID0gcy0+dXNlcjsKKyAgICB1c2VyLT51c2VyX21hZ2ljID0gVVNFUl9NQUdJQzsKKyAgICB1c2VyLT5zb2NrZXQgPSBzOworICAgIHMtPnVzZXIgPSB1c2VyOworICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IHVzZXI7CisKKyAgICBpZiAocy0+cGNtY2lhX3N0YXRlLnByZXNlbnQpCisJcXVldWVfZXZlbnQodXNlciwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04pOworICAgIHJldHVybiAwOworfSAvKiBkc19vcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGRzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisgICAgdXNlcl9pbmZvX3QgKnVzZXIsICoqbGluazsKKworICAgIGRzX2RiZygwLCAiZHNfcmVsZWFzZShzb2NrZXQgJWQpXG4iLCBpbWlub3IoaW5vZGUpKTsKKworICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgaWYgKENIRUNLX1VTRVIodXNlcikpCisJZ290byBvdXQ7CisKKyAgICBzID0gdXNlci0+c29ja2V0OworCisgICAgLyogVW5saW5rIHVzZXIgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CisJcy0+cGNtY2lhX3N0YXRlLmJ1c3kgPSAwOworICAgIH0KKyAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworICAgIGZvciAobGluayA9ICZzLT51c2VyOyAqbGluazsgbGluayA9ICYoKmxpbmspLT5uZXh0KQorCWlmICgqbGluayA9PSB1c2VyKSBicmVhazsKKyAgICBpZiAobGluayA9PSBOVUxMKQorCWdvdG8gb3V0OworICAgICpsaW5rID0gdXNlci0+bmV4dDsKKyAgICB1c2VyLT51c2VyX21hZ2ljID0gMDsKKyAgICBrZnJlZSh1c2VyKTsKKyAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKK291dDoKKyAgICByZXR1cm4gMDsKK30gLyogZHNfcmVsZWFzZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHNzaXplX3QgZHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworICAgIHVzZXJfaW5mb190ICp1c2VyOworICAgIGludCByZXQ7CisKKyAgICBkc19kYmcoMiwgImRzX3JlYWQoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisKKyAgICBpZiAoY291bnQgPCA0KQorCXJldHVybiAtRUlOVkFMOworCisgICAgdXNlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBpZiAoQ0hFQ0tfVVNFUih1c2VyKSkKKwlyZXR1cm4gLUVJTzsKKworICAgIHMgPSB1c2VyLT5zb2NrZXQ7CisgICAgaWYgKHMtPnBjbWNpYV9zdGF0ZS5kZWFkKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIHJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzLT5xdWV1ZSwgIXF1ZXVlX2VtcHR5KHVzZXIpKTsKKyAgICBpZiAocmV0ID09IDApCisJcmV0ID0gcHV0X3VzZXIoZ2V0X3F1ZXVlZF9ldmVudCh1c2VyKSwgKGludCBfX3VzZXIgKilidWYpID8gLUVGQVVMVCA6IDQ7CisKKyAgICByZXR1cm4gcmV0OworfSAvKiBkc19yZWFkICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3NpemVfdCBkc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworICAgIGRzX2RiZygyLCAiZHNfd3JpdGUoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisKKyAgICBpZiAoY291bnQgIT0gNCkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQorCXJldHVybiAtRUJBREY7CisKKyAgICByZXR1cm4gLUVJTzsKK30gLyogZHNfd3JpdGUgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLworc3RhdGljIHVfaW50IGRzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisgICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisgICAgdXNlcl9pbmZvX3QgKnVzZXI7CisKKyAgICBkc19kYmcoMiwgImRzX3BvbGwoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisKKyAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQorCXJldHVybiBQT0xMRVJSOworICAgIHMgPSB1c2VyLT5zb2NrZXQ7CisgICAgLyoKKyAgICAgKiBXZSBkb24ndCBjaGVjayBmb3IgYSBkZWFkIHNvY2tldCBoZXJlIHNpbmNlIHRoYXQKKyAgICAgKiB3aWxsIHNlbmQgY2FyZG1nciBpbnRvIGFuIGVuZGxlc3Mgc3Bpbi4KKyAgICAgKi8KKyAgICBwb2xsX3dhaXQoZmlsZSwgJnMtPnF1ZXVlLCB3YWl0KTsKKyAgICBpZiAoIXF1ZXVlX2VtcHR5KHVzZXIpKQorCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworICAgIHJldHVybiAwOworfSAvKiBkc19wb2xsICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitleHRlcm4gaW50IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbyhhZGp1c3RfdCAqYWRqKTsKKworc3RhdGljIGludCBkc19pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworICAgIHZvaWQgX191c2VyICp1YXJnID0gKGNoYXIgX191c2VyICopYXJnOworICAgIHVfaW50IHNpemU7CisgICAgaW50IHJldCwgZXJyOworICAgIGRzX2lvY3RsX2FyZ190ICpidWY7CisgICAgdXNlcl9pbmZvX3QgKnVzZXI7CisKKyAgICBkc19kYmcoMiwgImRzX2lvY3RsKHNvY2tldCAlZCwgJSN4LCAlI2x4KVxuIiwgaW1pbm9yKGlub2RlKSwgY21kLCBhcmcpOworCisgICAgdXNlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBpZiAoQ0hFQ0tfVVNFUih1c2VyKSkKKwlyZXR1cm4gLUVJTzsKKworICAgIHMgPSB1c2VyLT5zb2NrZXQ7CisgICAgaWYgKHMtPnBjbWNpYV9zdGF0ZS5kZWFkKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIHNpemUgPSAoY21kICYgSU9DU0laRV9NQVNLKSA+PiBJT0NTSVpFX1NISUZUOworICAgIGlmIChzaXplID4gc2l6ZW9mKGRzX2lvY3RsX2FyZ190KSkgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBQZXJtaXNzaW9uIGNoZWNrICovCisgICAgaWYgKCEoY21kICYgSU9DX09VVCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJcmV0dXJuIC1FUEVSTTsKKworICAgIGlmIChjbWQgJiBJT0NfSU4pIHsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWFyZywgc2l6ZSkpIHsKKwkgICAgZHNfZGJnKDMsICJkc19pb2N0bCgpOiB2ZXJpZnlfcmVhZCA9ICVkXG4iLCAtRUZBVUxUKTsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorICAgIH0KKyAgICBpZiAoY21kICYgSU9DX09VVCkgeworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFyZywgc2l6ZSkpIHsKKwkgICAgZHNfZGJnKDMsICJkc19pb2N0bCgpOiB2ZXJpZnlfd3JpdGUgPSAlZFxuIiwgLUVGQVVMVCk7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKyAgICB9CisgICAgYnVmID0ga21hbGxvYyhzaXplb2YoZHNfaW9jdGxfYXJnX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWJ1ZikKKwlyZXR1cm4gLUVOT01FTTsKKworICAgIGVyciA9IHJldCA9IDA7CisKKyAgICBpZiAoY21kICYgSU9DX0lOKSBfX2NvcHlfZnJvbV91c2VyKChjaGFyICopYnVmLCB1YXJnLCBzaXplKTsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTzoKKwlyZXQgPSBwY21jaWFfYWRqdXN0X3Jlc291cmNlX2luZm8oJmJ1Zi0+YWRqdXN0KTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9DT05GSUdVUkFUSU9OX0lORk86CisJaWYgKGJ1Zi0+Y29uZmlnLkZ1bmN0aW9uICYmCisJICAgKGJ1Zi0+Y29uZmlnLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpCisJICAgIHJldCA9IENTX0JBRF9BUkdTOworCWVsc2UKKwkgICAgcmV0ID0gcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8ocywKKwkJCWJ1Zi0+Y29uZmlnLkZ1bmN0aW9uLCAmYnVmLT5jb25maWcpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1RVUExFOgorCWRvd24oJnMtPnNrdF9zZW0pOworCXBjbWNpYV92YWxpZGF0ZV9tZW0ocyk7CisJdXAoJnMtPnNrdF9zZW0pOworCXJldCA9IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocywgQklORF9GTl9BTEwsICZidWYtPnR1cGxlKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9ORVhUX1RVUExFOgorCXJldCA9IHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+dHVwbGUpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX1RVUExFX0RBVEE6CisJYnVmLT50dXBsZS5UdXBsZURhdGEgPSBidWYtPnR1cGxlX3BhcnNlLmRhdGE7CisJYnVmLT50dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmLT50dXBsZV9wYXJzZS5kYXRhKTsKKwlyZXQgPSBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocywgJmJ1Zi0+dHVwbGUpOworCWJyZWFrOworICAgIGNhc2UgRFNfUEFSU0VfVFVQTEU6CisJYnVmLT50dXBsZS5UdXBsZURhdGEgPSBidWYtPnR1cGxlX3BhcnNlLmRhdGE7CisJcmV0ID0gcGNjYXJkX3BhcnNlX3R1cGxlKCZidWYtPnR1cGxlLCAmYnVmLT50dXBsZV9wYXJzZS5wYXJzZSk7CisJYnJlYWs7CisgICAgY2FzZSBEU19SRVNFVF9DQVJEOgorCXJldCA9IHBjY2FyZF9yZXNldF9jYXJkKHMpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX1NUQVRVUzoKKwlpZiAoYnVmLT5zdGF0dXMuRnVuY3Rpb24gJiYKKwkgICAoYnVmLT5zdGF0dXMuRnVuY3Rpb24gPj0gcy0+ZnVuY3Rpb25zKSkKKwkgICAgcmV0ID0gQ1NfQkFEX0FSR1M7CisJZWxzZQorCXJldCA9IHBjY2FyZF9nZXRfc3RhdHVzKHMsIGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uLCAmYnVmLT5zdGF0dXMpOworCWJyZWFrOworICAgIGNhc2UgRFNfVkFMSURBVEVfQ0lTOgorCWRvd24oJnMtPnNrdF9zZW0pOworCXBjbWNpYV92YWxpZGF0ZV9tZW0ocyk7CisJdXAoJnMtPnNrdF9zZW0pOworCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgQklORF9GTl9BTEwsICZidWYtPmNpc2luZm8pOworCWJyZWFrOworICAgIGNhc2UgRFNfU1VTUEVORF9DQVJEOgorCXJldCA9IHBjbWNpYV9zdXNwZW5kX2NhcmQocyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19SRVNVTUVfQ0FSRDoKKwlyZXQgPSBwY21jaWFfcmVzdW1lX2NhcmQocyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19FSkVDVF9DQVJEOgorCWVyciA9IHBjbWNpYV9lamVjdF9jYXJkKHMpOworCWJyZWFrOworICAgIGNhc2UgRFNfSU5TRVJUX0NBUkQ6CisJZXJyID0gcGNtY2lhX2luc2VydF9jYXJkKHMpOworCWJyZWFrOworICAgIGNhc2UgRFNfQUNDRVNTX0NPTkZJR1VSQVRJT05fUkVHSVNURVI6CisJaWYgKChidWYtPmNvbmZfcmVnLkFjdGlvbiA9PSBDU19XUklURSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkgICAgZXJyID0gLUVQRVJNOworCSAgICBnb3RvIGZyZWVfb3V0OworCX0KKwlpZiAoYnVmLT5jb25mX3JlZy5GdW5jdGlvbiAmJgorCSAgIChidWYtPmNvbmZfcmVnLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpCisJICAgIHJldCA9IENTX0JBRF9BUkdTOworCWVsc2UKKwkgICAgcmV0ID0gcGNjYXJkX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHMsCisJCQlidWYtPmNvbmZfcmVnLkZ1bmN0aW9uLCAmYnVmLT5jb25mX3JlZyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfRklSU1RfUkVHSU9OOgorICAgIGNhc2UgRFNfR0VUX05FWFRfUkVHSU9OOgorICAgIGNhc2UgRFNfQklORF9NVEQ6CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBmcmVlX291dDsKKwl9IGVsc2UgeworCQlzdGF0aWMgaW50IHByaW50ZWQgPSAwOworCQlpZiAoIXByaW50ZWQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjIuNi4ga2VybmVscyB1c2UgcGNtY2lhbXRkIGluc3RlYWQgb2YgbWVtb3J5X2NzLmMgYW5kIGRvIG5vdCByZXF1aXJlIHNwZWNpYWxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREIGhhbmRsaW5nIGFueSBtb3JlLlxuIik7CisJCQlwcmludGVkKys7CisJCX0KKwl9CisJZXJyID0gLUVJTlZBTDsKKwlnb3RvIGZyZWVfb3V0OworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1dJTkRPVzoKKwlyZXQgPSBwY21jaWFfZ2V0X3dpbmRvdyhzLCAmYnVmLT53aW5faW5mby5oYW5kbGUsIDAsCisJCQkmYnVmLT53aW5faW5mby53aW5kb3cpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX05FWFRfV0lORE9XOgorCXJldCA9IHBjbWNpYV9nZXRfd2luZG93KHMsICZidWYtPndpbl9pbmZvLmhhbmRsZSwKKwkJCWJ1Zi0+d2luX2luZm8uaGFuZGxlLT5pbmRleCArIDEsICZidWYtPndpbl9pbmZvLndpbmRvdyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfTUVNX1BBR0U6CisJcmV0ID0gcGNtY2lhX2dldF9tZW1fcGFnZShidWYtPndpbl9pbmZvLmhhbmRsZSwKKwkJCSAgICZidWYtPndpbl9pbmZvLm1hcCk7CisJYnJlYWs7CisgICAgY2FzZSBEU19SRVBMQUNFX0NJUzoKKwlyZXQgPSBwY21jaWFfcmVwbGFjZV9jaXMocywgJmJ1Zi0+Y2lzZHVtcCk7CisJYnJlYWs7CisgICAgY2FzZSBEU19CSU5EX1JFUVVFU1Q6CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBmcmVlX291dDsKKwl9CisJZXJyID0gYmluZF9yZXF1ZXN0KHMsICZidWYtPmJpbmRfaW5mbyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfREVWSUNFX0lORk86CisJZXJyID0gZ2V0X2RldmljZV9pbmZvKHMsICZidWYtPmJpbmRfaW5mbywgMSk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfTkVYVF9ERVZJQ0U6CisJZXJyID0gZ2V0X2RldmljZV9pbmZvKHMsICZidWYtPmJpbmRfaW5mbywgMCk7CisJYnJlYWs7CisgICAgY2FzZSBEU19VTkJJTkRfUkVRVUVTVDoKKwllcnIgPSAwOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJZXJyID0gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9PSAwKSAmJiAocmV0ICE9IENTX1NVQ0NFU1MpKSB7CisJZHNfZGJnKDIsICJkc19pb2N0bDogcmV0ID0gJWRcbiIsIHJldCk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIENTX0JBRF9TT0NLRVQ6IGNhc2UgQ1NfTk9fQ0FSRDoKKwkgICAgZXJyID0gLUVOT0RFVjsgYnJlYWs7CisJY2FzZSBDU19CQURfQVJHUzogY2FzZSBDU19CQURfQVRUUklCVVRFOiBjYXNlIENTX0JBRF9JUlE6CisJY2FzZSBDU19CQURfVFVQTEU6CisJICAgIGVyciA9IC1FSU5WQUw7IGJyZWFrOworCWNhc2UgQ1NfSU5fVVNFOgorCSAgICBlcnIgPSAtRUJVU1k7IGJyZWFrOworCWNhc2UgQ1NfT1VUX09GX1JFU09VUkNFOgorCSAgICBlcnIgPSAtRU5PU1BDOyBicmVhazsKKwljYXNlIENTX05PX01PUkVfSVRFTVM6CisJICAgIGVyciA9IC1FTk9EQVRBOyBicmVhazsKKwljYXNlIENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOgorCSAgICBlcnIgPSAtRU5PU1lTOyBicmVhazsKKwlkZWZhdWx0OgorCSAgICBlcnIgPSAtRUlPOyBicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKGNtZCAmIElPQ19PVVQpIHsKKyAgICAgICAgaWYgKF9fY29weV90b191c2VyKHVhcmcsIChjaGFyICopYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGVyciA9IC1FRkFVTFQ7CisgICAgfQorCitmcmVlX291dDoKKyAgICBrZnJlZShidWYpOworICAgIHJldHVybiBlcnI7Cit9IC8qIGRzX2lvY3RsICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkc19vcGVuLAorCS5yZWxlYXNlCT0gZHNfcmVsZWFzZSwKKwkuaW9jdGwJCT0gZHNfaW9jdGwsCisJLnJlYWQJCT0gZHNfcmVhZCwKKwkud3JpdGUJCT0gZHNfd3JpdGUsCisJLnBvbGwJCT0gZHNfcG9sbCwKK307CisKK3ZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKSB7CisJaW50IGk7CisKKwkvKiBTZXQgdXAgY2hhcmFjdGVyIGRldmljZSBmb3IgdXNlciBtb2RlIGNsaWVudHMgKi8KKwlpID0gcmVnaXN0ZXJfY2hyZGV2KDAsICJwY21jaWEiLCAmZHNfZm9wcyk7CisJaWYgKGkgPCAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgInVuYWJsZSB0byBmaW5kIGEgZnJlZSBkZXZpY2UgIyBmb3IgIgorCQkgICAgICAgIkRyaXZlciBTZXJ2aWNlcyAoZXJyb3I9JWQpXG4iLCBpKTsKKwllbHNlCisJCW1ham9yX2RldiA9IGk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfcGNjYXJkID0gcHJvY19ta2RpcigicGNjYXJkIiwgcHJvY19idXMpOworCWlmIChwcm9jX3BjY2FyZCkKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVycyIsMCxwcm9jX3BjY2FyZCxwcm9jX3JlYWRfZHJpdmVycyxOVUxMKTsKKyNlbmRpZgorfQorCisKK3ZvaWQgX19leGl0IHBjbWNpYV9jbGVhbnVwX2lvY3RsKHZvaWQpIHsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmIChwcm9jX3BjY2FyZCkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVycyIsIHByb2NfcGNjYXJkKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInBjY2FyZCIsIHByb2NfYnVzKTsKKwl9CisjZW5kaWYKKwlpZiAobWFqb3JfZGV2ICE9IC0xKQorCQl1bnJlZ2lzdGVyX2NocmRldihtYWpvcl9kZXYsICJwY21jaWEiKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0ZjRmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCkBAIC0wLDAgKzEsOTQzIEBACisvKgorICogUENNQ0lBIDE2LWJpdCByZXNvdXJjZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICoKKyAqIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICogPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAqIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OQkgICAgIERhdmlkIEEuIEhpbmRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgIERvbWluaWsgQnJvZG93c2tpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZHNfaW50ZXJuYWwuaCIKKworCisvKiBBY2Nlc3Mgc3BlZWQgZm9yIElPIHdpbmRvd3MgKi8KK3N0YXRpYyBpbnQgaW9fc3BlZWQgPSAwOworbW9kdWxlX3BhcmFtKGlvX3NwZWVkLCBpbnQsIDA0NDQpOworCisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCisvKiBtYXNrIG9mIElSUXMgYWxyZWFkeSByZXNlcnZlZCBieSBvdGhlciBjYXJkcywgd2Ugc2hvdWxkIGF2b2lkIHVzaW5nIHRoZW0gKi8KK3N0YXRpYyB1OCBwY21jaWFfdXNlZF9pcnFbTlJfSVJRU107CisjZW5kaWYKKworCisjaWZkZWYgREVCVUcKK2V4dGVybiBpbnQgZHNfcGNfZGVidWc7CisjZGVmaW5lIGNzX3NvY2tldF9uYW1lKHNrdCkgICAgKChza3QpLT5kZXYuY2xhc3NfaWQpCisKKyNkZWZpbmUgZHNfZGJnKHNrdCwgbHZsLCBmbXQsIGFyZy4uLikgZG8gewkJCVwKKwlpZiAoZHNfcGNfZGVidWcgPj0gbHZsKQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAicGNtY2lhX3Jlc291cmNlOiAlczogIiBmbXQsCVwKKwkJCWNzX3NvY2tldF9uYW1lKHNrdCkgLCAjIyBhcmcpOwkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworCisKKy8qKiBhbGxvY19pb19zcGFjZQorICoKKyAqIFNwZWNpYWwgc3R1ZmYgZm9yIG1hbmFnaW5nIElPIHdpbmRvd3MsIGJlY2F1c2UgdGhleSBhcmUgc2NhcmNlCisgKi8KKworc3RhdGljIGludCBhbGxvY19pb19zcGFjZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdV9pbnQgYXR0ciwgaW9hZGRyX3QgKmJhc2UsCisJCQkgIGlvYWRkcl90IG51bSwgdV9pbnQgbGluZXMpCit7CisJaW50IGk7CisJa2lvX2FkZHJfdCB0cnksIGFsaWduOworCisJYWxpZ24gPSAoKmJhc2UpID8gKGxpbmVzID8gMTw8bGluZXMgOiAwKSA6IDE7CisJaWYgKGFsaWduICYmIChhbGlnbiA8IG51bSkpIHsKKwkJaWYgKCpiYXNlKSB7CisJCQlkc19kYmcocywgMCwgIm9kZCBJTyByZXF1ZXN0OiBudW0gJSN4IGFsaWduICUjbHhcbiIsCisJCQkgICAgICAgbnVtLCBhbGlnbik7CisJCQlhbGlnbiA9IDA7CisJCX0gZWxzZQorCQkJd2hpbGUgKGFsaWduICYmIChhbGlnbiA8IG51bSkpIGFsaWduIDw8PSAxOworCX0KKwlpZiAoKmJhc2UgJiB+KGFsaWduLTEpKSB7CisJCWRzX2RiZyhzLCAwLCAib2RkIElPIHJlcXVlc3Q6IGJhc2UgJSN4IGFsaWduICUjbHhcbiIsCisJCSAgICAgICAqYmFzZSwgYWxpZ24pOworCQlhbGlnbiA9IDA7CisJfQorCWlmICgocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgJiYgcy0+aW9fb2Zmc2V0KSB7CisJCSpiYXNlID0gcy0+aW9fb2Zmc2V0IHwgKCpiYXNlICYgMHgwZmZmKTsKKwkJcy0+aW9bMF0uQXR0cmlidXRlcyA9IGF0dHI7CisJCXJldHVybiAwOworCX0KKwkvKiBDaGVjayBmb3IgYW4gYWxyZWFkeS1hbGxvY2F0ZWQgd2luZG93IHRoYXQgbXVzdCBjb25mbGljdCB3aXRoCisJICogd2hhdCB3YXMgYXNrZWQgZm9yLiAgSXQgaXMgYSBoYWNrIGJlY2F1c2UgaXQgZG9lcyBub3QgY2F0Y2ggYWxsCisJICogcG90ZW50aWFsIGNvbmZsaWN0cywganVzdCB0aGUgbW9zdCBvYnZpb3VzIG9uZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykKKwkJaWYgKChzLT5pb1tpXS5OdW1Qb3J0cyAhPSAwKSAmJgorCQkgICAgKChzLT5pb1tpXS5CYXNlUG9ydCAmIChhbGlnbi0xKSkgPT0gKmJhc2UpKQorCQkJcmV0dXJuIDE7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykgeworCQlpZiAocy0+aW9baV0uTnVtUG9ydHMgPT0gMCkgeworCQkJcy0+aW9baV0ucmVzID0gcGNtY2lhX2ZpbmRfaW9fcmVnaW9uKCpiYXNlLCBudW0sIGFsaWduLCBzKTsKKwkJCWlmIChzLT5pb1tpXS5yZXMpIHsKKwkJCQlzLT5pb1tpXS5BdHRyaWJ1dGVzID0gYXR0cjsKKwkJCQlzLT5pb1tpXS5CYXNlUG9ydCA9ICpiYXNlID0gcy0+aW9baV0ucmVzLT5zdGFydDsKKwkJCQlzLT5pb1tpXS5OdW1Qb3J0cyA9IHMtPmlvW2ldLkluVXNlID0gbnVtOworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAocy0+aW9baV0uQXR0cmlidXRlcyAhPSBhdHRyKQorCQkJY29udGludWU7CisJCS8qIFRyeSB0byBleHRlbmQgdG9wIG9mIHdpbmRvdyAqLworCQl0cnkgPSBzLT5pb1tpXS5CYXNlUG9ydCArIHMtPmlvW2ldLk51bVBvcnRzOworCQlpZiAoKCpiYXNlID09IDApIHx8ICgqYmFzZSA9PSB0cnkpKQorCQkJaWYgKHBjbWNpYV9hZGp1c3RfaW9fcmVnaW9uKHMtPmlvW2ldLnJlcywgcy0+aW9baV0ucmVzLT5zdGFydCwKKwkJCQkJCSAgICBzLT5pb1tpXS5yZXMtPmVuZCArIG51bSwgcykgPT0gMCkgeworCQkJCSpiYXNlID0gdHJ5OworCQkJCXMtPmlvW2ldLk51bVBvcnRzICs9IG51bTsKKwkJCQlzLT5pb1tpXS5JblVzZSArPSBudW07CisJCQkJYnJlYWs7CisJCQl9CisJCS8qIFRyeSB0byBleHRlbmQgYm90dG9tIG9mIHdpbmRvdyAqLworCQl0cnkgPSBzLT5pb1tpXS5CYXNlUG9ydCAtIG51bTsKKwkJaWYgKCgqYmFzZSA9PSAwKSB8fCAoKmJhc2UgPT0gdHJ5KSkKKwkJCWlmIChwY21jaWFfYWRqdXN0X2lvX3JlZ2lvbihzLT5pb1tpXS5yZXMsIHMtPmlvW2ldLnJlcy0+c3RhcnQgLSBudW0sCisJCQkJCQkgICAgcy0+aW9baV0ucmVzLT5lbmQsIHMpID09IDApIHsKKwkJCQlzLT5pb1tpXS5CYXNlUG9ydCA9ICpiYXNlID0gdHJ5OworCQkJCXMtPmlvW2ldLk51bVBvcnRzICs9IG51bTsKKwkJCQlzLT5pb1tpXS5JblVzZSArPSBudW07CisJCQkJYnJlYWs7CisJCQl9CisJfQorCXJldHVybiAoaSA9PSBNQVhfSU9fV0lOKTsKK30gLyogYWxsb2NfaW9fc3BhY2UgKi8KKworCitzdGF0aWMgdm9pZCByZWxlYXNlX2lvX3NwYWNlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpb2FkZHJfdCBiYXNlLAorCQkJICAgICBpb2FkZHJfdCBudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7CisJCWlmICgocy0+aW9baV0uQmFzZVBvcnQgPD0gYmFzZSkgJiYKKwkJICAgIChzLT5pb1tpXS5CYXNlUG9ydCtzLT5pb1tpXS5OdW1Qb3J0cyA+PSBiYXNlK251bSkpIHsKKwkJCXMtPmlvW2ldLkluVXNlIC09IG51bTsKKwkJCS8qIEZyZWUgdGhlIHdpbmRvdyBpZiBubyBvbmUgZWxzZSBpcyB1c2luZyBpdCAqLworCQkJaWYgKHMtPmlvW2ldLkluVXNlID09IDApIHsKKwkJCQlzLT5pb1tpXS5OdW1Qb3J0cyA9IDA7CisJCQkJcmVsZWFzZV9yZXNvdXJjZShzLT5pb1tpXS5yZXMpOworCQkJCWtmcmVlKHMtPmlvW2ldLnJlcyk7CisJCQkJcy0+aW9baV0ucmVzID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30gLyogcmVsZWFzZV9pb19zcGFjZSAqLworCisKKy8qKiBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIKKyAqCisgKiBBY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigpIHJlYWRzIGFuZCB3cml0ZXMgY29uZmlndXJhdGlvbgorICogcmVnaXN0ZXJzIGluIGF0dHJpYnV0ZSBtZW1vcnkuICBNZW1vcnkgd2luZG93IDAgaXMgcmVzZXJ2ZWQgZm9yCisgKiB0aGlzIGFuZCB0aGUgdHVwbGUgcmVhZGluZyBzZXJ2aWNlcy4KKyAqLworCitpbnQgcGNjYXJkX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkJCQkgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQkJCQkgY29uZl9yZWdfdCAqcmVnKQoreworCWNvbmZpZ190ICpjOworCWludCBhZGRyOworCXVfY2hhciB2YWw7CisKKwlpZiAoIXMgfHwgIXMtPmNvbmZpZykKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisKKwljID0gJnMtPmNvbmZpZ1tmdW5jdGlvbl07CisKKwlpZiAoYyA9PSBOVUxMKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKworCWlmICghKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpCisJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKKworCWFkZHIgPSAoYy0+Q29uZmlnQmFzZSArIHJlZy0+T2Zmc2V0KSA+PiAxOworCisJc3dpdGNoIChyZWctPkFjdGlvbikgeworCWNhc2UgQ1NfUkVBRDoKKwkJcGNtY2lhX3JlYWRfY2lzX21lbShzLCAxLCBhZGRyLCAxLCAmdmFsKTsKKwkJcmVnLT5WYWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBDU19XUklURToKKwkJdmFsID0gcmVnLT5WYWx1ZTsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgYWRkciwgMSwgJnZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBDU19CQURfQVJHUzsKKwkJYnJlYWs7CisJfQorCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIgKi8KKworaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJCSBjb25mX3JlZ190ICpyZWcpCit7CisJcmV0dXJuIHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihwX2Rldi0+c29ja2V0LAorCQkJCQkJICAgIHBfZGV2LT5mdW5jLCByZWcpOworfQorRVhQT1JUX1NZTUJPTChwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpOworCisKKworaW50IHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkJCSAgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQoreworCWNvbmZpZ190ICpjOworCisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiBDU19OT19DQVJEOworCisJY29uZmlnLT5GdW5jdGlvbiA9IGZ1bmN0aW9uOworCisjaWZkZWYgQ09ORklHX0NBUkRCVVMKKwlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgeworCQltZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoY29uZmlnX2luZm9fdCkpOworCQljb25maWctPlZjYyA9IHMtPnNvY2tldC5WY2M7CisJCWNvbmZpZy0+VnBwMSA9IGNvbmZpZy0+VnBwMiA9IHMtPnNvY2tldC5WcHA7CisJCWNvbmZpZy0+T3B0aW9uID0gcy0+Y2JfZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyOworCQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVU19DT05GSUcpIHsKKwkJCWNvbmZpZy0+QXR0cmlidXRlcyA9IENPTkZfVkFMSURfQ0xJRU5UOworCQkJY29uZmlnLT5JbnRUeXBlID0gSU5UX0NBUkRCVVM7CisJCQljb25maWctPkFzc2lnbmVkSVJRID0gcy0+aXJxLkFzc2lnbmVkSVJROworCQkJaWYgKGNvbmZpZy0+QXNzaWduZWRJUlEpCisJCQkJY29uZmlnLT5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKwkJCWNvbmZpZy0+QmFzZVBvcnQxID0gcy0+aW9bMF0uQmFzZVBvcnQ7CisJCQljb25maWctPk51bVBvcnRzMSA9IHMtPmlvWzBdLk51bVBvcnRzOworCQl9CisJCXJldHVybiBDU19TVUNDRVNTOworCX0KKyNlbmRpZgorCisJYyA9IChzLT5jb25maWcgIT0gTlVMTCkgPyAmcy0+Y29uZmlnW2Z1bmN0aW9uXSA6IE5VTEw7CisKKwlpZiAoKGMgPT0gTlVMTCkgfHwgIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKSB7CisJCWNvbmZpZy0+QXR0cmlidXRlcyA9IDA7CisJCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKKwkJY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKKwkJcmV0dXJuIENTX1NVQ0NFU1M7CisJfQorCisJLyogISEhIFRoaXMgaXMgYSBoYWNrICEhISAqLworCW1lbWNweSgmY29uZmlnLT5BdHRyaWJ1dGVzLCAmYy0+QXR0cmlidXRlcywgc2l6ZW9mKGNvbmZpZ190KSk7CisJY29uZmlnLT5BdHRyaWJ1dGVzIHw9IENPTkZfVkFMSURfQ0xJRU5UOworCWNvbmZpZy0+Q2FyZFZhbHVlcyA9IGMtPkNhcmRWYWx1ZXM7CisJY29uZmlnLT5JUlFBdHRyaWJ1dGVzID0gYy0+aXJxLkF0dHJpYnV0ZXM7CisJY29uZmlnLT5Bc3NpZ25lZElSUSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKKwljb25maWctPkJhc2VQb3J0MSA9IGMtPmlvLkJhc2VQb3J0MTsKKwljb25maWctPk51bVBvcnRzMSA9IGMtPmlvLk51bVBvcnRzMTsKKwljb25maWctPkF0dHJpYnV0ZXMxID0gYy0+aW8uQXR0cmlidXRlczE7CisJY29uZmlnLT5CYXNlUG9ydDIgPSBjLT5pby5CYXNlUG9ydDI7CisJY29uZmlnLT5OdW1Qb3J0czIgPSBjLT5pby5OdW1Qb3J0czI7CisJY29uZmlnLT5BdHRyaWJ1dGVzMiA9IGMtPmlvLkF0dHJpYnV0ZXMyOworCWNvbmZpZy0+SU9BZGRyTGluZXMgPSBjLT5pby5JT0FkZHJMaW5lczsKKworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyAqLworCitpbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQoreworCXJldHVybiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywKKwkJCQkJICAgICBjb25maWcpOworfQorRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyk7CisKKworLyoqIHBjbWNpYV9nZXRfd2luZG93CisgKi8KK2ludCBwY21jaWFfZ2V0X3dpbmRvdyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgd2luZG93X2hhbmRsZV90ICpoYW5kbGUsCisJCSAgICAgIGludCBpZHgsIHdpbl9yZXFfdCAqcmVxKQoreworCXdpbmRvd190ICp3aW47CisJaW50IHc7CisKKwlpZiAoIXMgfHwgIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisJZm9yICh3ID0gaWR4OyB3IDwgTUFYX1dJTjsgdysrKQorCQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfV0lOX1JFUSh3KSkKKwkJCWJyZWFrOworCWlmICh3ID09IE1BWF9XSU4pCisJCXJldHVybiBDU19OT19NT1JFX0lURU1TOworCXdpbiA9ICZzLT53aW5bd107CisJcmVxLT5CYXNlID0gd2luLT5jdGwucmVzLT5zdGFydDsKKwlyZXEtPlNpemUgPSB3aW4tPmN0bC5yZXMtPmVuZCAtIHdpbi0+Y3RsLnJlcy0+c3RhcnQgKyAxOworCXJlcS0+QWNjZXNzU3BlZWQgPSB3aW4tPmN0bC5zcGVlZDsKKwlyZXEtPkF0dHJpYnV0ZXMgPSAwOworCWlmICh3aW4tPmN0bC5mbGFncyAmIE1BUF9BVFRSSUIpCisJCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fTUVNT1JZX1RZUEVfQU07CisJaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX0FDVElWRSkKKwkJcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9FTkFCTEU7CisJaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQXzE2QklUKQorCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0RBVEFfV0lEVEhfMTY7CisJaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX1VTRV9XQUlUKQorCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOworCSpoYW5kbGUgPSB3aW47CisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9nZXRfd2luZG93ICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfd2luZG93KTsKKworCisvKiogcGNjYXJkX2dldF9zdGF0dXMKKyAqCisgKiBHZXQgdGhlIGN1cnJlbnQgc29ja2V0IHN0YXRlIGJpdHMuICBXZSBkb24ndCBzdXBwb3J0IHRoZSBsYXRjaGVkCisgKiBTb2NrZXRTdGF0ZSB5ZXQ6IEkgaGF2ZW4ndCBzZWVuIGFueSBwb2ludCBmb3IgaXQuCisgKi8KKworaW50IHBjY2FyZF9nZXRfc3RhdHVzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCSAgICAgIGNzX3N0YXR1c190ICpzdGF0dXMpCit7CisJY29uZmlnX3QgKmM7CisJaW50IHZhbDsKKworCXMtPm9wcy0+Z2V0X3N0YXR1cyhzLCAmdmFsKTsKKwlzdGF0dXMtPkNhcmRTdGF0ZSA9IHN0YXR1cy0+U29ja2V0U3RhdGUgPSAwOworCXN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19ERVRFQ1QpID8gQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QgOiAwOworCXN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19DQVJEQlVTKSA/IENTX0VWRU5UX0NCX0RFVEVDVCA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTXzNWQ0FSRCkgPyBDU19FVkVOVF8zVkNBUkQgOiAwOworCXN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19YVkNBUkQpID8gQ1NfRVZFTlRfWFZDQVJEIDogMDsKKwlpZiAocy0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCkKKwkJc3RhdHVzLT5DYXJkU3RhdGUgfD0gQ1NfRVZFTlRfUE1fU1VTUEVORDsKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisKKwljID0gKHMtPmNvbmZpZyAhPSBOVUxMKSA/ICZzLT5jb25maWdbZnVuY3Rpb25dIDogTlVMTDsKKwlpZiAoKGMgIT0gTlVMTCkgJiYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkgJiYKKwkgICAgKGMtPkludFR5cGUgJiAoSU5UX01FTU9SWV9BTkRfSU8gfCBJTlRfWk9PTUVEX1ZJREVPKSkpIHsKKwkJdV9jaGFyIHJlZzsKKwkJaWYgKGMtPlByZXNlbnQgJiBQUkVTRU5UX1BJTl9SRVBMQUNFKSB7CisJCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIDEsIChjLT5Db25maWdCYXNlK0NJU1JFR19QUlIpPj4xLCAxLCAmcmVnKTsKKwkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCQkJKHJlZyAmIFBSUl9XUF9TVEFUVVMpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7CisJCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkJCShyZWcgJiBQUlJfUkVBRFlfU1RBVFVTKSA/IENTX0VWRU5UX1JFQURZX0NIQU5HRSA6IDA7CisJCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkJCShyZWcgJiBQUlJfQlZEMl9TVEFUVVMpID8gQ1NfRVZFTlRfQkFUVEVSWV9MT1cgOiAwOworCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0KKwkJCQkocmVnICYgUFJSX0JWRDFfU1RBVFVTKSA/IENTX0VWRU5UX0JBVFRFUllfREVBRCA6IDA7CisJCX0gZWxzZSB7CisJCQkvKiBObyBQUlI/ICBUaGVuIGFzc3VtZSB3ZSdyZSBhbHdheXMgcmVhZHkgKi8KKwkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9IENTX0VWRU5UX1JFQURZX0NIQU5HRTsKKwkJfQorCQlpZiAoYy0+UHJlc2VudCAmIFBSRVNFTlRfRVhUX1NUQVRVUykgeworCQkJcGNtY2lhX3JlYWRfY2lzX21lbShzLCAxLCAoYy0+Q29uZmlnQmFzZStDSVNSRUdfRVNSKT4+MSwgMSwgJnJlZyk7CisJCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkJCShyZWcgJiBFU1JfUkVRX0FUVE4pID8gQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04gOiAwOworCQl9CisJCXJldHVybiBDU19TVUNDRVNTOworCX0KKwlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkodmFsICYgU1NfV1JQUk9UKSA/IENTX0VWRU5UX1dSSVRFX1BST1RFQ1QgOiAwOworCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCSh2YWwgJiBTU19CQVRERUFEKSA/IENTX0VWRU5UX0JBVFRFUllfREVBRCA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0KKwkJKHZhbCAmIFNTX0JBVFdBUk4pID8gQ1NfRVZFTlRfQkFUVEVSWV9MT1cgOiAwOworCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCSh2YWwgJiBTU19SRUFEWSkgPyBDU19FVkVOVF9SRUFEWV9DSEFOR0UgOiAwOworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY2NhcmRfZ2V0X3N0YXR1cyAqLworCitpbnQgcGNtY2lhX2dldF9zdGF0dXMoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY3Nfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKwlzID0gU09DS0VUKGhhbmRsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfc3RhdHVzKHMsIGhhbmRsZS0+ZnVuYywgc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9zdGF0dXMpOworCisKKworLyoqIHBjbWNpYV9nZXRfbWVtX3BhZ2UKKyAqCisgKiBDaGFuZ2UgdGhlIGNhcmQgYWRkcmVzcyBvZiBhbiBhbHJlYWR5IG9wZW4gbWVtb3J5IHdpbmRvdy4KKyAqLworaW50IHBjbWNpYV9nZXRfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSkKK3sKKwlpZiAoKHdpbiA9PSBOVUxMKSB8fCAod2luLT5tYWdpYyAhPSBXSU5ET1dfTUFHSUMpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlyZXEtPlBhZ2UgPSAwOworCXJlcS0+Q2FyZE9mZnNldCA9IHdpbi0+Y3RsLmNhcmRfc3RhcnQ7CisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9nZXRfbWVtX3BhZ2UgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9tZW1fcGFnZSk7CisKKworaW50IHBjbWNpYV9tYXBfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKwlpZiAoKHdpbiA9PSBOVUxMKSB8fCAod2luLT5tYWdpYyAhPSBXSU5ET1dfTUFHSUMpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlpZiAocmVxLT5QYWdlICE9IDApCisJCXJldHVybiBDU19CQURfUEFHRTsKKwlzID0gd2luLT5zb2NrOworCXdpbi0+Y3RsLmNhcmRfc3RhcnQgPSByZXEtPkNhcmRPZmZzZXQ7CisJaWYgKHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKSAhPSAwKQorCQlyZXR1cm4gQ1NfQkFEX09GRlNFVDsKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX21hcF9tZW1fcGFnZSAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfbWFwX21lbV9wYWdlKTsKKworCisvKiogcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uCisgKgorICogTW9kaWZ5IGEgbG9ja2VkIHNvY2tldCBjb25maWd1cmF0aW9uCisgKi8KK2ludCBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCW1vZGNvbmZfdCAqbW9kKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCWNvbmZpZ190ICpjOworCisJcyA9IHBfZGV2LT5zb2NrZXQ7CisJYyA9IENPTkZJRyhwX2Rldik7CisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiBDU19OT19DQVJEOworCWlmICghKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpCisJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKKworCWlmIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX0lSUV9DSEFOR0VfVkFMSUQpIHsKKwkJaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgeworCQkJYy0+QXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCQlzLT5zb2NrZXQuaW9faXJxID0gcy0+aXJxLkFzc2lnbmVkSVJROworCQl9IGVsc2UgeworCQkJYy0+QXR0cmlidXRlcyAmPSB+Q09ORl9FTkFCTEVfSVJROworCQkJcy0+c29ja2V0LmlvX2lycSA9IDA7CisJCX0KKwkJcy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpOworCX0KKworCWlmIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZDQ19DSEFOR0VfVkFMSUQpCisJCXJldHVybiBDU19CQURfVkNDOworCisJLyogV2Ugb25seSBhbGxvdyBjaGFuZ2luZyBWcHAxIGFuZCBWcHAyIHRvIHRoZSBzYW1lIHZhbHVlICovCisJaWYgKChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDFfQ0hBTkdFX1ZBTElEKSAmJgorCSAgICAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAyX0NIQU5HRV9WQUxJRCkpIHsKKwkJaWYgKG1vZC0+VnBwMSAhPSBtb2QtPlZwcDIpCisJCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwkJYy0+VnBwMSA9IGMtPlZwcDIgPSBzLT5zb2NrZXQuVnBwID0gbW9kLT5WcHAxOworCQlpZiAocy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpKQorCQkJcmV0dXJuIENTX0JBRF9WUFA7CisJfSBlbHNlIGlmICgobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAxX0NIQU5HRV9WQUxJRCkgfHwKKwkJICAgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMl9DSEFOR0VfVkFMSUQpKQorCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBtb2RpZnlfY29uZmlndXJhdGlvbiAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24pOworCisKK2ludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKK3sKKwlwY2NhcmRfaW9fbWFwIGlvID0geyAwLCAwLCAwLCAwLCAxIH07CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWludCBpOworCisJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX0NPTkZJR19MT0NLRUQpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9DT05GSUdfTE9DS0VEOworCisJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgeworCQljb25maWdfdCAqYyA9IENPTkZJRyhwX2Rldik7CisJCWlmICgtLShzLT5sb2NrX2NvdW50KSA9PSAwKSB7CisJCQlzLT5zb2NrZXQuZmxhZ3MgPSBTU19PVVRQVVRfRU5BOyAgIC8qIElzIHRoaXMgY29ycmVjdD8gKi8KKwkJCXMtPnNvY2tldC5WcHAgPSAwOworCQkJcy0+c29ja2V0LmlvX2lycSA9IDA7CisJCQlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CisJCX0KKwkJaWYgKGMtPnN0YXRlICYgQ09ORklHX0lPX1JFUSkKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspIHsKKwkJCQlpZiAocy0+aW9baV0uTnVtUG9ydHMgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJcy0+aW9baV0uQ29uZmlnLS07CisJCQkJaWYgKHMtPmlvW2ldLkNvbmZpZyAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpby5tYXAgPSBpOworCQkJCXMtPm9wcy0+c2V0X2lvX21hcChzLCAmaW8pOworCQkJfQorCQljLT5zdGF0ZSAmPSB+Q09ORklHX0xPQ0tFRDsKKwl9CisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbiAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKTsKKworCisvKiogcGNtY2lhX3JlbGVhc2VfaW8KKyAqCisgKiBSZWxlYXNlX2lvKCkgcmVsZWFzZXMgdGhlIEkvTyByYW5nZXMgYWxsb2NhdGVkIGJ5IGEgY2xpZW50LiAgVGhpcworICogbWF5IGJlIGludm9rZWQgc29tZSB0aW1lIGFmdGVyIGEgY2FyZCBlamVjdGlvbiBoYXMgYWxyZWFkeSBkdW1wZWQKKyAqIHRoZSBhY3R1YWwgc29ja2V0IGNvbmZpZ3VyYXRpb24sIHNvIGlmIHRoZSBjbGllbnQgaXMgInN0YWxlIiwgd2UKKyAqIGRvbid0IGJvdGhlciBjaGVja2luZyB0aGUgcG9ydCByYW5nZXMgYWdhaW5zdCB0aGUgY3VycmVudCBzb2NrZXQKKyAqIHZhbHVlcy4KKyAqLworaW50IHBjbWNpYV9yZWxlYXNlX2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CisKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfSU9fUkVRKSkKKwkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcF9kZXYtPnN0YXRlICY9IH5DTElFTlRfSU9fUkVROworCisJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgeworCQljb25maWdfdCAqYyA9IENPTkZJRyhwX2Rldik7CisJCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCisJCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJCWlmICgoYy0+aW8uQmFzZVBvcnQxICE9IHJlcS0+QmFzZVBvcnQxKSB8fAorCQkgICAgKGMtPmlvLk51bVBvcnRzMSAhPSByZXEtPk51bVBvcnRzMSkgfHwKKwkJICAgIChjLT5pby5CYXNlUG9ydDIgIT0gcmVxLT5CYXNlUG9ydDIpIHx8CisJCSAgICAoYy0+aW8uTnVtUG9ydHMyICE9IHJlcS0+TnVtUG9ydHMyKSkKKwkJCXJldHVybiBDU19CQURfQVJHUzsKKwkJYy0+c3RhdGUgJj0gfkNPTkZJR19JT19SRVE7CisJfQorCisJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOworCWlmIChyZXEtPk51bVBvcnRzMikKKwkJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MiwgcmVxLT5OdW1Qb3J0czIpOworCisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9yZWxlYXNlX2lvICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2lvKTsKKworCitpbnQgcGNtY2lhX3JlbGVhc2VfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaXJxX3JlcV90ICpyZXEpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9JUlFfUkVRKSkKKwkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcF9kZXYtPnN0YXRlICY9IH5DTElFTlRfSVJRX1JFUTsKKworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKKwkJY29uZmlnX3QgKmMgPSBDT05GSUcocF9kZXYpOworCQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQorCQkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOworCQlpZiAoYy0+aXJxLkF0dHJpYnV0ZXMgIT0gcmVxLT5BdHRyaWJ1dGVzKQorCQkJcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7CisJCWlmIChzLT5pcnEuQXNzaWduZWRJUlEgIT0gcmVxLT5Bc3NpZ25lZElSUSkKKwkJCXJldHVybiBDU19CQURfSVJROworCQlpZiAoLS1zLT5pcnEuQ29uZmlnID09IDApIHsKKwkJCWMtPnN0YXRlICY9IH5DT05GSUdfSVJRX1JFUTsKKwkJCXMtPmlycS5Bc3NpZ25lZElSUSA9IDA7CisJCX0KKwl9CisKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSB7CisJCWZyZWVfaXJxKHJlcS0+QXNzaWduZWRJUlEsIHJlcS0+SW5zdGFuY2UpOworCX0KKworI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKKwlwY21jaWFfdXNlZF9pcnFbcmVxLT5Bc3NpZ25lZElSUV0tLTsKKyNlbmRpZgorCisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9yZWxlYXNlX2lycSAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV9pcnEpOworCisKK2ludCBwY21jaWFfcmVsZWFzZV93aW5kb3cod2luZG93X2hhbmRsZV90IHdpbikKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKworCWlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCisJCXJldHVybiBDU19CQURfSEFORExFOworCXMgPSB3aW4tPnNvY2s7CisJaWYgKCEod2luLT5oYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1dJTl9SRVEod2luLT5pbmRleCkpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKworCS8qIFNodXQgZG93biBtZW1vcnkgd2luZG93ICovCisJd2luLT5jdGwuZmxhZ3MgJj0gfk1BUF9BQ1RJVkU7CisJcy0+b3BzLT5zZXRfbWVtX21hcChzLCAmd2luLT5jdGwpOworCXMtPnN0YXRlICY9IH5TT0NLRVRfV0lOX1JFUSh3aW4tPmluZGV4KTsKKworCS8qIFJlbGVhc2Ugc3lzdGVtIG1lbW9yeSAqLworCWlmICh3aW4tPmN0bC5yZXMpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZSh3aW4tPmN0bC5yZXMpOworCQlrZnJlZSh3aW4tPmN0bC5yZXMpOworCQl3aW4tPmN0bC5yZXMgPSBOVUxMOworCX0KKwl3aW4tPmhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9XSU5fUkVRKHdpbi0+aW5kZXgpOworCisJd2luLT5tYWdpYyA9IDA7CisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlbGVhc2Vfd2luZG93ICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX3dpbmRvdyk7CisKKworaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSBjb25maWdfcmVxX3QgKnJlcSkKK3sKKwlpbnQgaTsKKwl1X2ludCBiYXNlOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKKwljb25maWdfdCAqYzsKKwlwY2NhcmRfaW9fbWFwIGlvbWFwOworCisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiBDU19OT19DQVJEOworCisJaWYgKHJlcS0+SW50VHlwZSAmIElOVF9DQVJEQlVTKQorCQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKKwljID0gQ09ORklHKHBfZGV2KTsKKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQorCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisKKwkvKiBEbyBwb3dlciBjb250cm9sLiAgV2UgZG9uJ3QgYWxsb3cgY2hhbmdlcyBpbiBWY2MuICovCisJaWYgKHMtPnNvY2tldC5WY2MgIT0gcmVxLT5WY2MpCisJCXJldHVybiBDU19CQURfVkNDOworCWlmIChyZXEtPlZwcDEgIT0gcmVxLT5WcHAyKQorCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwlzLT5zb2NrZXQuVnBwID0gcmVxLT5WcHAxOworCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCisJCXJldHVybiBDU19CQURfVlBQOworCisJYy0+VmNjID0gcmVxLT5WY2M7IGMtPlZwcDEgPSBjLT5WcHAyID0gcmVxLT5WcHAxOworCisJLyogUGljayBtZW1vcnkgb3IgSS9PIGNhcmQsIERNQSBtb2RlLCBpbnRlcnJ1cHQgKi8KKwljLT5JbnRUeXBlID0gcmVxLT5JbnRUeXBlOworCWMtPkF0dHJpYnV0ZXMgPSByZXEtPkF0dHJpYnV0ZXM7CisJaWYgKHJlcS0+SW50VHlwZSAmIElOVF9NRU1PUllfQU5EX0lPKQorCQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfSU9DQVJEOworCWlmIChyZXEtPkludFR5cGUgJiBJTlRfWk9PTUVEX1ZJREVPKQorCQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfWlZDQVJEIHwgU1NfSU9DQVJEOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9ETUEpCisJCXMtPnNvY2tldC5mbGFncyB8PSBTU19ETUFfTU9ERTsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfU1BLUikKKwkJcy0+c29ja2V0LmZsYWdzIHw9IFNTX1NQS1JfRU5BOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCXMtPnNvY2tldC5pb19pcnEgPSBzLT5pcnEuQXNzaWduZWRJUlE7CisJZWxzZQorCQlzLT5zb2NrZXQuaW9faXJxID0gMDsKKwlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CisJcy0+bG9ja19jb3VudCsrOworCisJLyogU2V0IHVwIENJUyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCWJhc2UgPSBjLT5Db25maWdCYXNlID0gcmVxLT5Db25maWdCYXNlOworCWMtPlByZXNlbnQgPSBjLT5DYXJkVmFsdWVzID0gcmVxLT5QcmVzZW50OworCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0NPUFkpIHsKKwkJYy0+Q29weSA9IHJlcS0+Q29weTsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfU0NSKT4+MSwgMSwgJmMtPkNvcHkpOworCX0KKwlpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9PUFRJT04pIHsKKwkJaWYgKHMtPmZ1bmN0aW9ucyA9PSAxKSB7CisJCQljLT5PcHRpb24gPSByZXEtPkNvbmZpZ0luZGV4ICYgQ09SX0NPTkZJR19NQVNLOworCQl9IGVsc2UgeworCQkJYy0+T3B0aW9uID0gcmVxLT5Db25maWdJbmRleCAmIENPUl9NRkNfQ09ORklHX01BU0s7CisJCQljLT5PcHRpb24gfD0gQ09SX0ZVTkNfRU5BfENPUl9JUkVRX0VOQTsKKwkJCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0lPQkFTRV8wKQorCQkJCWMtPk9wdGlvbiB8PSBDT1JfQUREUl9ERUNPREU7CisJCX0KKwkJaWYgKGMtPnN0YXRlICYgQ09ORklHX0lSUV9SRVEpCisJCQlpZiAoIShjLT5pcnEuQXR0cmlidXRlcyAmIElSUV9GT1JDRURfUFVMU0UpKQorCQkJCWMtPk9wdGlvbiB8PSBDT1JfTEVWRUxfUkVROworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19DT1IpPj4xLCAxLCAmYy0+T3B0aW9uKTsKKwkJbWRlbGF5KDQwKTsKKwl9CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfU1RBVFVTKSB7CisJCWMtPlN0YXR1cyA9IHJlcS0+U3RhdHVzOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19DQ1NSKT4+MSwgMSwgJmMtPlN0YXR1cyk7CisJfQorCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX1BJTl9SRVBMQUNFKSB7CisJCWMtPlBpbiA9IHJlcS0+UGluOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19QUlIpPj4xLCAxLCAmYy0+UGluKTsKKwl9CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfRVhUX1NUQVRVUykgeworCQljLT5FeHRTdGF0dXMgPSByZXEtPkV4dFN0YXR1czsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfRVNSKT4+MSwgMSwgJmMtPkV4dFN0YXR1cyk7CisJfQorCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0lPQkFTRV8wKSB7CisJCXVfY2hhciBiID0gYy0+aW8uQmFzZVBvcnQxICYgMHhmZjsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfSU9CQVNFXzApPj4xLCAxLCAmYik7CisJCWIgPSAoYy0+aW8uQmFzZVBvcnQxID4+IDgpICYgMHhmZjsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfSU9CQVNFXzEpPj4xLCAxLCAmYik7CisJfQorCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0lPU0laRSkgeworCQl1X2NoYXIgYiA9IGMtPmlvLk51bVBvcnRzMSArIGMtPmlvLk51bVBvcnRzMiAtIDE7CisJCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0lPU0laRSk+PjEsIDEsICZiKTsKKwl9CisKKwkvKiBDb25maWd1cmUgSS9PIHdpbmRvd3MgKi8KKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKSB7CisJCWlvbWFwLnNwZWVkID0gaW9fc3BlZWQ7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspCisJCQlpZiAocy0+aW9baV0uTnVtUG9ydHMgIT0gMCkgeworCQkJCWlvbWFwLm1hcCA9IGk7CisJCQkJaW9tYXAuZmxhZ3MgPSBNQVBfQUNUSVZFOworCQkJCXN3aXRjaCAocy0+aW9baV0uQXR0cmlidXRlcyAmIElPX0RBVEFfUEFUSF9XSURUSCkgeworCQkJCWNhc2UgSU9fREFUQV9QQVRIX1dJRFRIXzE2OgorCQkJCQlpb21hcC5mbGFncyB8PSBNQVBfMTZCSVQ7IGJyZWFrOworCQkJCWNhc2UgSU9fREFUQV9QQVRIX1dJRFRIX0FVVE86CisJCQkJCWlvbWFwLmZsYWdzIHw9IE1BUF9BVVRPU1o7IGJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpb21hcC5zdGFydCA9IHMtPmlvW2ldLkJhc2VQb3J0OworCQkJCWlvbWFwLnN0b3AgPSBpb21hcC5zdGFydCArIHMtPmlvW2ldLk51bVBvcnRzIC0gMTsKKwkJCQlzLT5vcHMtPnNldF9pb19tYXAocywgJmlvbWFwKTsKKwkJCQlzLT5pb1tpXS5Db25maWcrKzsKKwkJCX0KKwl9CisKKwljLT5zdGF0ZSB8PSBDT05GSUdfTE9DS0VEOworCXBfZGV2LT5zdGF0ZSB8PSBDTElFTlRfQ09ORklHX0xPQ0tFRDsKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbiAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKTsKKworCisvKiogcGNtY2lhX3JlcXVlc3RfaW8KKyAqCisgKiBSZXF1ZXN0X2lvKCkgcmVzZXJ2ZXMgcmFuZ2VzIG9mIHBvcnQgYWRkcmVzc2VzIGZvciBhIHNvY2tldC4KKyAqIEkgaGF2ZSBub3QgaW1wbGVtZW50ZWQgcmFuZ2Ugc2hhcmluZyBvciBhbGlhcyBhZGRyZXNzaW5nLgorICovCitpbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKKwljb25maWdfdCAqYzsKKworCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKworCWlmICghcmVxKQorCQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKKwljID0gQ09ORklHKHBfZGV2KTsKKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQorCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJaWYgKGMtPnN0YXRlICYgQ09ORklHX0lPX1JFUSkKKwkJcmV0dXJuIENTX0lOX1VTRTsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzMSAmIChJT19TSEFSRUQgfCBJT19GT1JDRV9BTElBU19BQ0NFU1MpKQorCQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKKwlpZiAoKHJlcS0+TnVtUG9ydHMyID4gMCkgJiYKKwkgICAgKHJlcS0+QXR0cmlidXRlczIgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkpCisJCXJldHVybiBDU19CQURfQVRUUklCVVRFOworCisJaWYgKGFsbG9jX2lvX3NwYWNlKHMsIHJlcS0+QXR0cmlidXRlczEsICZyZXEtPkJhc2VQb3J0MSwKKwkJCSAgIHJlcS0+TnVtUG9ydHMxLCByZXEtPklPQWRkckxpbmVzKSkKKwkJcmV0dXJuIENTX0lOX1VTRTsKKworCWlmIChyZXEtPk51bVBvcnRzMikgeworCQlpZiAoYWxsb2NfaW9fc3BhY2UocywgcmVxLT5BdHRyaWJ1dGVzMiwgJnJlcS0+QmFzZVBvcnQyLAorCQkJCSAgIHJlcS0+TnVtUG9ydHMyLCByZXEtPklPQWRkckxpbmVzKSkgeworCQkJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOworCQkJcmV0dXJuIENTX0lOX1VTRTsKKwkJfQorCX0KKworCWMtPmlvID0gKnJlcTsKKwljLT5zdGF0ZSB8PSBDT05GSUdfSU9fUkVROworCXBfZGV2LT5zdGF0ZSB8PSBDTElFTlRfSU9fUkVROworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfcmVxdWVzdF9pbyAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9pbyk7CisKKworLyoqIHBjbWNpYV9yZXF1ZXN0X2lycQorICoKKyAqIFJlcXVlc3RfaXJxKCkgcmVzZXJ2ZXMgYW4gaXJxIGZvciB0aGlzIGNsaWVudC4KKyAqCisgKiBBbHNvLCBzaW5jZSBMaW51eCBvbmx5IHJlc2VydmVzIGlycSdzIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKKyAqIGhvb2tlZCwgd2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgYW4gaXJxIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlCisgKiB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZC4gIE5vdyB0aGF0IEkgdGhpbmsgYWJvdXQgaXQsCisgKiB0aGVyZSBtaWdodCBiZSBhIHdheSB0byBmaXggdGhpcyB1c2luZyBhIGR1bW15IGhhbmRsZXIuCisgKi8KKworI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKK3N0YXRpYyBpcnFyZXR1cm5fdCB0ZXN0X2FjdGlvbihpbnQgY3BsLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBJUlFfTk9ORTsKK30KKyNlbmRpZgorCitpbnQgcGNtY2lhX3JlcXVlc3RfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaXJxX3JlcV90ICpyZXEpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWNvbmZpZ190ICpjOworCWludCByZXQgPSBDU19JTl9VU0UsIGlycSA9IDA7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisJYyA9IENPTkZJRyhwX2Rldik7CisJaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKKwkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOworCWlmIChjLT5zdGF0ZSAmIENPTkZJR19JUlFfUkVRKQorCQlyZXR1cm4gQ1NfSU5fVVNFOworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQorCWlmIChzLT5pcnEuQXNzaWduZWRJUlEgIT0gMCkgeworCQkvKiBJZiB0aGUgaW50ZXJydXB0IGlzIGFscmVhZHkgYXNzaWduZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgKi8KKwkJaXJxID0gcy0+aXJxLkFzc2lnbmVkSVJROworCX0gZWxzZSB7CisJCWludCB0cnk7CisJCXUzMiBtYXNrID0gcy0+aXJxX21hc2s7CisJCXZvaWQgKmRhdGEgPSBOVUxMOworCisJCWZvciAodHJ5ID0gMDsgdHJ5IDwgNjQ7IHRyeSsrKSB7CisJCQlpcnEgPSB0cnkgJSAzMjsKKworCQkJLyogbWFya2VkIGFzIGF2YWlsYWJsZSBieSBkcml2ZXIsIGFuZCBub3QgYmxvY2tlZCBieSB1c2Vyc3BhY2U/ICovCisJCQlpZiAoISgobWFzayA+PiBpcnEpICYgMSkpCisJCQkJY29udGludWU7CisKKwkJCS8qIGF2b2lkIGFuIElSUSB3aGljaCBpcyBhbHJlYWR5IHVzZWQgYnkgYSBQQ01DSUEgY2FyZCAqLworCQkJaWYgKCh0cnkgPCAzMikgJiYgcGNtY2lhX3VzZWRfaXJxW2lycV0pCisJCQkJY29udGludWU7CisKKwkJCS8qIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IGRyaXZlciwgaWYgcG9zc2libGUsIG9mIGNoZWNrIHdoZXRoZXIKKwkJCSAqIHJlZ2lzdGVyaW5nIGEgZHVtbXkgaGFuZGxlIHdvcmtzLCBpLmUuIGlmIHRoZSBJUlEgaXNuJ3QKKwkJCSAqIG1hcmtlZCBhcyB1c2VkIGJ5IHRoZSBrZXJuZWwgcmVzb3VyY2UgbWFuYWdlbWVudCBjb3JlICovCisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsCisJCQkJCSAgKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgPyByZXEtPkhhbmRsZXIgOiB0ZXN0X2FjdGlvbiwKKwkJCQkJICAoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKKwkJCQkJICAgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8CisJCQkJCSAgIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAorCQkJCQkgIHBfZGV2LT5kZXYuYnVzX2lkLAorCQkJCQkgIChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpID8gcmVxLT5JbnN0YW5jZSA6IGRhdGEpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlpZiAoIShyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpKQorCQkJCQlmcmVlX2lycShpcnEsIGRhdGEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJaWYgKHJldCkgeworCQlpZiAoIXMtPnBjaV9pcnEpCisJCQlyZXR1cm4gcmV0OworCQlpcnEgPSBzLT5wY2lfaXJxOworCX0KKworCWlmIChyZXQgJiYgcmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSB7CisJCWlmIChyZXF1ZXN0X2lycShpcnEsIHJlcS0+SGFuZGxlciwKKwkJCQkoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKKwkJCQkgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8CisJCQkJIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAorCQkJCXBfZGV2LT5kZXYuYnVzX2lkLCByZXEtPkluc3RhbmNlKSkKKwkJCXJldHVybiBDU19JTl9VU0U7CisJfQorCisJYy0+aXJxLkF0dHJpYnV0ZXMgPSByZXEtPkF0dHJpYnV0ZXM7CisJcy0+aXJxLkFzc2lnbmVkSVJRID0gcmVxLT5Bc3NpZ25lZElSUSA9IGlycTsKKwlzLT5pcnEuQ29uZmlnKys7CisKKwljLT5zdGF0ZSB8PSBDT05GSUdfSVJRX1JFUTsKKwlwX2Rldi0+c3RhdGUgfD0gQ0xJRU5UX0lSUV9SRVE7CisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCisJcGNtY2lhX3VzZWRfaXJxW2lycV0rKzsKKyNlbmRpZgorCisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9yZXF1ZXN0X2lycSAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9pcnEpOworCisKKy8qKiBwY21jaWFfcmVxdWVzdF93aW5kb3cKKyAqCisgKiBSZXF1ZXN0X3dpbmRvdygpIGVzdGFibGlzaGVzIGEgbWFwcGluZyBiZXR3ZWVuIGNhcmQgbWVtb3J5IHNwYWNlCisgKiBhbmQgc3lzdGVtIG1lbW9yeSBzcGFjZS4KKyAqLworaW50IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKnBfZGV2LCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9ICgqcF9kZXYpLT5zb2NrZXQ7CisJd2luZG93X3QgKndpbjsKKwl1X2xvbmcgYWxpZ247CisJaW50IHc7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisJaWYgKHJlcS0+QXR0cmlidXRlcyAmIChXSU5fUEFHRUQgfCBXSU5fU0hBUkVEKSkKKwkJcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7CisKKwkvKiBXaW5kb3cgc2l6ZSBkZWZhdWx0cyB0byBzbWFsbGVzdCBhdmFpbGFibGUgKi8KKwlpZiAocmVxLT5TaXplID09IDApCisJCXJlcS0+U2l6ZSA9IHMtPm1hcF9zaXplOworCWFsaWduID0gKCgocy0+ZmVhdHVyZXMgJiBTU19DQVBfTUVNX0FMSUdOKSB8fAorCQkgIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fU1RSSUNUX0FMSUdOKSkgPworCQkgcmVxLT5TaXplIDogcy0+bWFwX3NpemUpOworCWlmIChyZXEtPlNpemUgJiAocy0+bWFwX3NpemUtMSkpCisJCXJldHVybiBDU19CQURfU0laRTsKKwlpZiAoKHJlcS0+QmFzZSAmJiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkpIHx8CisJICAgIChyZXEtPkJhc2UgJiAoYWxpZ24tMSkpKQorCQlyZXR1cm4gQ1NfQkFEX0JBU0U7CisJaWYgKHJlcS0+QmFzZSkKKwkJYWxpZ24gPSAwOworCisJLyogQWxsb2NhdGUgc3lzdGVtIG1lbW9yeSB3aW5kb3cgKi8KKwlmb3IgKHcgPSAwOyB3IDwgTUFYX1dJTjsgdysrKQorCQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9XSU5fUkVRKHcpKSkgYnJlYWs7CisJaWYgKHcgPT0gTUFYX1dJTikKKwkJcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKworCXdpbiA9ICZzLT53aW5bd107CisJd2luLT5tYWdpYyA9IFdJTkRPV19NQUdJQzsKKwl3aW4tPmluZGV4ID0gdzsKKwl3aW4tPmhhbmRsZSA9ICpwX2RldjsKKwl3aW4tPnNvY2sgPSBzOworCisJaWYgKCEocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkpIHsKKwkJd2luLT5jdGwucmVzID0gcGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbihyZXEtPkJhc2UsIHJlcS0+U2l6ZSwgYWxpZ24sCisJCQkJCQkgICAgICAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX01BUF9CRUxPV18xTUIpLCBzKTsKKwkJaWYgKCF3aW4tPmN0bC5yZXMpCisJCQlyZXR1cm4gQ1NfSU5fVVNFOworCX0KKwkoKnBfZGV2KS0+c3RhdGUgfD0gQ0xJRU5UX1dJTl9SRVEodyk7CisKKwkvKiBDb25maWd1cmUgdGhlIHNvY2tldCBjb250cm9sbGVyICovCisJd2luLT5jdGwubWFwID0gdysxOworCXdpbi0+Y3RsLmZsYWdzID0gMDsKKwl3aW4tPmN0bC5zcGVlZCA9IHJlcS0+QWNjZXNzU3BlZWQ7CisJaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9NRU1PUllfVFlQRSkKKwkJd2luLT5jdGwuZmxhZ3MgfD0gTUFQX0FUVFJJQjsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX0VOQUJMRSkKKwkJd2luLT5jdGwuZmxhZ3MgfD0gTUFQX0FDVElWRTsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX0RBVEFfV0lEVEhfMTYpCisJCXdpbi0+Y3RsLmZsYWdzIHw9IE1BUF8xNkJJVDsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX1VTRV9XQUlUKQorCQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfVVNFX1dBSVQ7CisJd2luLT5jdGwuY2FyZF9zdGFydCA9IDA7CisJaWYgKHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKSAhPSAwKQorCQlyZXR1cm4gQ1NfQkFEX0FSR1M7CisJcy0+c3RhdGUgfD0gU09DS0VUX1dJTl9SRVEodyk7CisKKwkvKiBSZXR1cm4gd2luZG93IGhhbmRsZSAqLworCWlmIChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSB7CisJCXJlcS0+QmFzZSA9IHdpbi0+Y3RsLnN0YXRpY19zdGFydDsKKwl9IGVsc2UgeworCQlyZXEtPkJhc2UgPSB3aW4tPmN0bC5yZXMtPnN0YXJ0OworCX0KKwkqd2ggPSB3aW47CisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlcXVlc3Rfd2luZG93ICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9yc3JjX21nci5jIGIvZHJpdmVycy9wY21jaWEvcnNyY19tZ3IuYwppbmRleCBiNjg0M2Y4Li4wNjY4Mzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9yc3JjX21nci5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJCS8qIHlvdSBjYW4ndCB1c2UgdGhlIG9sZCBpbnRlcmZhY2UgaWYgdGhlIG5ldwogCQkJICogb25lIHdhcyB1c2VkIGJlZm9yZSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKLQkJCWlmICgocy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSkgJiYKKwkJCWlmICgocy0+cmVzb3VyY2Vfc2V0dXBfbmV3KSAmJgogCQkJICAgICEocy0+cmVzb3VyY2Vfc2V0dXBfb2xkKSkgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAkJCQljb250aW51ZTsKQEAgLTEwNSwyOSArMTA1LDMyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV92YWxpZGF0ZV9tZW0pOwogCi1pbnQgYWRqdXN0X2lvX3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAoraW50IHBjbWNpYV9hZGp1c3RfaW9fcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCiAJCSAgICAgdW5zaWduZWQgbG9uZyByX2VuZCwgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJaWYgKHMtPnJlc291cmNlX29wcy0+YWRqdXN0X2lvX3JlZ2lvbikKIAkJcmV0dXJuIHMtPnJlc291cmNlX29wcy0+YWRqdXN0X2lvX3JlZ2lvbihyZXMsIHJfc3RhcnQsIHJfZW5kLCBzKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2FkanVzdF9pb19yZWdpb24pOwogCi1zdHJ1Y3QgcmVzb3VyY2UgKmZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwKK3N0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwKIAkJICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJaWYgKHMtPnJlc291cmNlX29wcy0+ZmluZF9pbykKIAkJcmV0dXJuIHMtPnJlc291cmNlX29wcy0+ZmluZF9pbyhiYXNlLCBudW0sIGFsaWduLCBzKTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2ZpbmRfaW9fcmVnaW9uKTsKIAotc3RydWN0IHJlc291cmNlICpmaW5kX21lbV9yZWdpb24odV9sb25nIGJhc2UsIHVfbG9uZyBudW0sIHVfbG9uZyBhbGlnbiwKK3N0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgdV9sb25nIGFsaWduLAogCQkJCSBpbnQgbG93LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlpZiAocy0+cmVzb3VyY2Vfb3BzLT5maW5kX21lbSkKIAkJcmV0dXJuIHMtPnJlc291cmNlX29wcy0+ZmluZF9tZW0oYmFzZSwgbnVtLCBhbGlnbiwgbG93LCBzKTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbik7CiAKIHZvaWQgcmVsZWFzZV9yZXNvdXJjZV9kYihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCmluZGV4IDU4NzZiYWIuLmM0MjQ1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYwpAQCAtMzcyLDYgKzM3Miw5IEBACiAJICAgYmFzZSwgYmFzZStudW0tMSk7CiAgICAgYmFkID0gZmFpbCA9IDA7CiAgICAgc3RlcCA9IChudW0gPCAweDIwMDAwKSA/IDB4MjAwMCA6ICgobnVtPj40KSAmIH4weDFmZmYpOworICAgIC8qIGRvbid0IGFsbG93IHRvbyBsYXJnZSBzdGVwcyAqLworICAgIGlmIChzdGVwID4gMHg4MDAwMDApCisJc3RlcCA9IDB4ODAwMDAwOwogICAgIC8qIGNpc19yZWFkYWJsZSB3YW50cyB0byBtYXAgMnggbWFwX3NpemUgKi8KICAgICBpZiAoc3RlcCA8IDIgKiBzLT5tYXBfc2l6ZSkKIAlzdGVwID0gMiAqIHMtPm1hcF9zaXplOwpAQCAtNDY1LDggKzQ2OCw3IEBACiAKIAlmb3IgKG0gPSBzX2RhdGEtPm1lbV9kYi5uZXh0OyBtICE9ICZzX2RhdGEtPm1lbV9kYjsgbSA9IG1tLm5leHQpIHsKIAkJbW0gPSAqbTsKLQkJaWYgKGRvX21lbV9wcm9iZShtbS5iYXNlLCBtbS5udW0sIHMpKQotCQkJYnJlYWs7CisJCWRvX21lbV9wcm9iZShtbS5iYXNlLCBtbS5udW0sIHMpOwogCX0KIH0KIApAQCAtNjAxLDcgKzYwMyw3IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdHJ1Y3QgcmVzb3VyY2UgKm5vbnN0YXRpY19maW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpub25zdGF0aWNfZmluZF9pb19yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgbnVtLAogCQkgICB1bnNpZ25lZCBsb25nIGFsaWduLCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IG1ha2VfcmVzb3VyY2UoMCwgbnVtLCBJT1JFU09VUkNFX0lPLCBzLT5kZXYuY2xhc3NfaWQpOwpAQCAtNjM1LDggKzYzNyw4IEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RydWN0IHJlc291cmNlICogbm9uc3RhdGljX2ZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgdV9sb25nIGFsaWduLAotCQkJCSBpbnQgbG93LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKiBub25zdGF0aWNfZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLAorCQl1X2xvbmcgYWxpZ24sIGludCBsb3csIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gbWFrZV9yZXNvdXJjZSgwLCBudW0sIElPUkVTT1VSQ0VfTUVNLCBzLT5kZXYuY2xhc3NfaWQpOwogCXN0cnVjdCBzb2NrZXRfZGF0YSAqc19kYXRhID0gcy0+cmVzb3VyY2VfZGF0YTsKQEAgLTY4MywyNyArNjg1LDIzIEBACiB9CiAKIAotc3RhdGljIGludCBhZGp1c3RfbWVtb3J5KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKQorc3RhdGljIGludCBhZGp1c3RfbWVtb3J5KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgYWN0aW9uLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQl1X2xvbmcgYmFzZSwgbnVtOwogCXN0cnVjdCBzb2NrZXRfZGF0YSAqZGF0YSA9IHMtPnJlc291cmNlX2RhdGE7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBlbmQgLSBzdGFydCArIDE7CisJaW50IHJldCA9IDA7CiAKLQliYXNlID0gYWRqLT5yZXNvdXJjZS5tZW1vcnkuQmFzZTsKLQludW0gPSBhZGotPnJlc291cmNlLm1lbW9yeS5TaXplOwotCWlmICgobnVtID09IDApIHx8IChiYXNlK251bS0xIDwgYmFzZSkpCi0JCXJldHVybiBDU19CQURfU0laRTsKLQotCXJldCA9IENTX1NVQ0NFU1M7CisJaWYgKGVuZCA8PSBzdGFydCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkb3duKCZyc3JjX3NlbSk7Ci0Jc3dpdGNoIChhZGotPkFjdGlvbikgeworCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBBRERfTUFOQUdFRF9SRVNPVVJDRToKLQkJcmV0ID0gYWRkX2ludGVydmFsKCZkYXRhLT5tZW1fZGIsIGJhc2UsIG51bSk7CisJCXJldCA9IGFkZF9pbnRlcnZhbCgmZGF0YS0+bWVtX2RiLCBzdGFydCwgc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0U6Ci0JCXJldCA9IHN1Yl9pbnRlcnZhbCgmZGF0YS0+bWVtX2RiLCBiYXNlLCBudW0pOwotCQlpZiAocmV0ID09IENTX1NVQ0NFU1MpIHsKKwkJcmV0ID0gc3ViX2ludGVydmFsKCZkYXRhLT5tZW1fZGIsIHN0YXJ0LCBzaXplKTsKKwkJaWYgKCFyZXQpIHsKIAkJCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQ7CiAJCQlkb3duX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNvY2tldCwgJnBjbWNpYV9zb2NrZXRfbGlzdCwgc29ja2V0X2xpc3QpCkBAIC03MTIsNyArNzEwLDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXQgPSBDU19VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJdXAoJnJzcmNfc2VtKTsKIApAQCAtNzIwLDM2ICs3MTgsMzUgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFkanVzdF9pbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgYWRqdXN0X3QgKmFkaikKK3N0YXRpYyBpbnQgYWRqdXN0X2lvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgYWN0aW9uLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3Qgc29ja2V0X2RhdGEgKmRhdGEgPSBzLT5yZXNvdXJjZV9kYXRhOwotCWtpb19hZGRyX3QgYmFzZSwgbnVtOwotCWludCByZXQgPSBDU19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKwlpbnQgcmV0ID0gMDsKIAotCWJhc2UgPSBhZGotPnJlc291cmNlLmlvLkJhc2VQb3J0OwotCW51bSA9IGFkai0+cmVzb3VyY2UuaW8uTnVtUG9ydHM7Ci0JaWYgKChiYXNlIDwgMCkgfHwgKGJhc2UgPiAweGZmZmYpKQotCQlyZXR1cm4gQ1NfQkFEX0JBU0U7Ci0JaWYgKChudW0gPD0gMCkgfHwgKGJhc2UrbnVtID4gMHgxMDAwMCkgfHwgKGJhc2UrbnVtIDw9IGJhc2UpKQotCQlyZXR1cm4gQ1NfQkFEX1NJWkU7CisJaWYgKGVuZCA8PSBzdGFydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZW5kID4gSU9fU1BBQ0VfTElNSVQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZG93bigmcnNyY19zZW0pOwotCXN3aXRjaCAoYWRqLT5BY3Rpb24pIHsKKwlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQUREX01BTkFHRURfUkVTT1VSQ0U6Ci0JCWlmIChhZGRfaW50ZXJ2YWwoJmRhdGEtPmlvX2RiLCBiYXNlLCBudW0pICE9IDApIHsKLQkJCXJldCA9IENTX0lOX1VTRTsKKwkJaWYgKGFkZF9pbnRlcnZhbCgmZGF0YS0+aW9fZGIsIHN0YXJ0LCBzaXplKSAhPSAwKSB7CisJCQlyZXQgPSAtRUJVU1k7CiAJCQlicmVhazsKIAkJfQogI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKIAkJaWYgKHByb2JlX2lvKQotCQkJZG9faW9fcHJvYmUocywgYmFzZSwgbnVtKTsKKwkJCWRvX2lvX3Byb2JlKHMsIHN0YXJ0LCBzaXplKTsKICNlbmRpZgogCQlicmVhazsKIAljYXNlIFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFOgotCQlzdWJfaW50ZXJ2YWwoJmRhdGEtPmlvX2RiLCBiYXNlLCBudW0pOworCQlzdWJfaW50ZXJ2YWwoJmRhdGEtPmlvX2RiLCBzdGFydCwgc2l6ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAJdXAoJnJzcmNfc2VtKTsKQEAgLTc2MCwxNSArNzU3LDgyIEBACiAKIHN0YXRpYyBpbnQgbm9uc3RhdGljX2FkanVzdF9yZXNvdXJjZV9pbmZvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKQogeworCXVuc2lnbmVkIGxvbmcgZW5kOworCiAJc3dpdGNoIChhZGotPlJlc291cmNlKSB7CiAJY2FzZSBSRVNfTUVNT1JZX1JBTkdFOgotCQlyZXR1cm4gYWRqdXN0X21lbW9yeShzLCBhZGopOworCQllbmQgPSBhZGotPnJlc291cmNlLm1lbW9yeS5CYXNlICsgYWRqLT5yZXNvdXJjZS5tZW1vcnkuU2l6ZSAtIDE7CisJCXJldHVybiBhZGp1c3RfbWVtb3J5KHMsIGFkai0+QWN0aW9uLCBhZGotPnJlc291cmNlLm1lbW9yeS5CYXNlLCBlbmQpOwogCWNhc2UgUkVTX0lPX1JBTkdFOgotCQlyZXR1cm4gYWRqdXN0X2lvKHMsIGFkaik7CisJCWVuZCA9IGFkai0+cmVzb3VyY2UuaW8uQmFzZVBvcnQgKyBhZGotPnJlc291cmNlLmlvLk51bVBvcnRzIC0gMTsKKwkJcmV0dXJuIGFkanVzdF9pbyhzLCBhZGotPkFjdGlvbiwgYWRqLT5yZXNvdXJjZS5pby5CYXNlUG9ydCwgZW5kKTsKIAl9CiAJcmV0dXJuIENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogfQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBub25zdGF0aWNfYXV0b2FkZF9yZXNvdXJjZXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIGRvbmUgPSAwOworCisJaWYgKCFzLT5jYl9kZXYgfHwgIXMtPmNiX2Rldi0+YnVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCS8qIElmIHRoaXMgaXMgdGhlIHJvb3QgYnVzLCB0aGUgcmlzayBvZiBoaXR0aW5nCisJICogc29tZSBzdHJhbmdlIHN5c3RlbSBkZXZpY2VzIHdoaWNoIGFyZW4ndCBwcm90ZWN0ZWQKKwkgKiBieSBlaXRoZXIgQUNQSSByZXNvdXJjZSB0YWJsZXMgb3IgcHJvcGVybHkgcmVxdWVzdGVkCisJICogcmVzb3VyY2VzIGlzIHRvbyBiaWcuIFRoZXJlZm9yZSwgZG9uJ3QgZG8gYXV0by1hZGRpbmcKKwkgKiBvZiByZXNvdXJjZXMgYXQgdGhlIG1vbWVudC4KKwkgKi8KKwlpZiAocy0+Y2JfZGV2LT5idXMtPm51bWJlciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCisJZm9yIChpPTA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQlyZXMgPSBzLT5jYl9kZXYtPmJ1cy0+cmVzb3VyY2VbaV07CisJCWlmICghcmVzKQorCQkJY29udGludWU7CisKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlpZiAocmVzID09ICZpb3BvcnRfcmVzb3VyY2UpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IHBhcmVudCBQQ0kgYnJpZGdlIEkvTyB3aW5kb3c6IDB4JWx4IC0gMHglbHhcbiIsCisJCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQkJaWYgKCFhZGp1c3RfaW8ocywgQUREX01BTkFHRURfUkVTT1VSQ0UsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKSkKKwkJCQlkb25lIHw9IElPUkVTT1VSQ0VfSU87CisKKwkJfQorCisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJCWlmIChyZXMgPT0gJmlvbWVtX3Jlc291cmNlKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicGNtY2lhOiBwYXJlbnQgUENJIGJyaWRnZSBNZW1vcnkgd2luZG93OiAweCVseCAtIDB4JWx4XG4iLAorCQkJICAgICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwkJCWlmICghYWRqdXN0X21lbW9yeShzLCBBRERfTUFOQUdFRF9SRVNPVVJDRSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpKQorCQkJCWRvbmUgfD0gSU9SRVNPVVJDRV9NRU07CisJCX0KKwl9CisKKwkvKiBpZiB3ZSBnb3QgYXQgbGVhc3Qgb25lIG9mIElPLCBhbmQgb25lIG9mIE1FTSwgd2UgY2FuIGJlIGdsYWQgYW5kCisJICogYWN0aXZhdGUgdGhlIFBDTUNJQSBzdWJzeXN0ZW0gKi8KKwlpZiAoZG9uZSAmIChJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfSU8pKQorCQlzLT5yZXNvdXJjZV9zZXR1cF9kb25lID0gMTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBub25zdGF0aWNfYXV0b2FkZF9yZXNvdXJjZXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNlbmRpZgorCisKIHN0YXRpYyBpbnQgbm9uc3RhdGljX2luaXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJc3RydWN0IHNvY2tldF9kYXRhICpkYXRhOwpAQCAtNzgzLDYgKzg0Nyw4IEBACiAKIAlzLT5yZXNvdXJjZV9kYXRhID0gKHZvaWQgKikgZGF0YTsKIAorCW5vbnN0YXRpY19hdXRvYWRkX3Jlc291cmNlcyhzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04NDUsMTcgKzkxMSwxNiBAQAogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIGVuZF9hZGRyOwotCXVuc2lnbmVkIGludCBhZGQgPSAxOwotCWFkanVzdF90IGFkajsKKwl1bnNpZ25lZCBpbnQgYWRkID0gQUREX01BTkFHRURfUkVTT1VSQ0U7CiAJc3NpemVfdCByZXQgPSAwOwogCiAJcmV0ID0gc3NjYW5mIChidWYsICIrIDB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKIAlpZiAocmV0ICE9IDIpIHsKIAkJcmV0ID0gc3NjYW5mIChidWYsICItIDB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKLQkJYWRkID0gMDsKKwkJYWRkID0gUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0U7CiAJCWlmIChyZXQgIT0gMikgewogCQkJcmV0ID0gc3NjYW5mIChidWYsICIweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7Ci0JCQlhZGQgPSAxOworCQkJYWRkID0gQUREX01BTkFHRURfUkVTT1VSQ0U7CiAJCQlpZiAocmV0ICE9IDIpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg2MywxMiArOTI4LDkgQEAKIAlpZiAoZW5kX2FkZHIgPD0gc3RhcnRfYWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhZGouQWN0aW9uID0gYWRkID8gQUREX01BTkFHRURfUkVTT1VSQ0UgOiBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRTsKLQlhZGouUmVzb3VyY2UgPSBSRVNfSU9fUkFOR0U7Ci0JYWRqLnJlc291cmNlLmlvLkJhc2VQb3J0ID0gc3RhcnRfYWRkcjsKLQlhZGoucmVzb3VyY2UuaW8uTnVtUG9ydHMgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHIgKyAxOwotCi0JcmV0ID0gYWRqdXN0X2lvKHMsICZhZGopOworCXJldCA9IGFkanVzdF9pbyhzLCBhZGQsIHN0YXJ0X2FkZHIsIGVuZF9hZGRyKTsKKwlpZiAoIXJldCkKKwkJcy0+cmVzb3VyY2Vfc2V0dXBfbmV3ID0gMTsKIAogCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KQEAgLTkwMSwxNyArOTYzLDE2IEBACiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7Ci0JdW5zaWduZWQgaW50IGFkZCA9IDE7Ci0JYWRqdXN0X3QgYWRqOworCXVuc2lnbmVkIGludCBhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAlzc2l6ZV90IHJldCA9IDA7CiAKIAlyZXQgPSBzc2NhbmYgKGJ1ZiwgIisgMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwogCWlmIChyZXQgIT0gMikgewogCQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIi0gMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwotCQlhZGQgPSAwOworCQlhZGQgPSBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRTsKIAkJaWYgKHJldCAhPSAyKSB7CiAJCQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIjB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKLQkJCWFkZCA9IDE7CisJCQlhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAkJCWlmIChyZXQgIT0gMikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtOTE5LDEyICs5ODAsOSBAQAogCWlmIChlbmRfYWRkciA8PSBzdGFydF9hZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWFkai5BY3Rpb24gPSBhZGQgPyBBRERfTUFOQUdFRF9SRVNPVVJDRSA6IFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFOwotCWFkai5SZXNvdXJjZSA9IFJFU19NRU1PUllfUkFOR0U7Ci0JYWRqLnJlc291cmNlLm1lbW9yeS5CYXNlID0gc3RhcnRfYWRkcjsKLQlhZGoucmVzb3VyY2UubWVtb3J5LlNpemUgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHIgKyAxOwotCi0JcmV0ID0gYWRqdXN0X21lbW9yeShzLCAmYWRqKTsKKwlyZXQgPSBhZGp1c3RfbWVtb3J5KHMsIGFkZCwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOworCWlmICghcmV0KQorCQlzLT5yZXNvdXJjZV9zZXR1cF9uZXcgPSAxOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKaW5kZXggZjFiYjc5MS4uZTk4YmIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaCBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaAppbmRleCA3MDBhMTU1Li42ZjE0MTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmgKKysrIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oCkBAIC0xMSw3ICsxMSw2IEBACiAKIC8qIGluY2x1ZGUgdGhlIHdvcmxkICovCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCmluZGV4IDhlZWQwMzkuLjEwNDBhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgpAQCAtMTYzLDMwICsxNjIsMTY2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIXMtPnJlc291cmNlX3NldHVwX2RvbmUpIHsKKwlpZiAoIXMtPnJlc291cmNlX3NldHVwX2RvbmUpCiAJCXMtPnJlc291cmNlX3NldHVwX2RvbmUgPSAxOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Ci0KLQkJZG93bigmcy0+c2t0X3NlbSk7Ci0JCWlmICgocy0+Y2FsbGJhY2spICYmCi0JCSAgICAocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkgJiYKLQkJICAgICEocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykpIHsKLQkJCWlmICh0cnlfbW9kdWxlX2dldChzLT5jYWxsYmFjay0+b3duZXIpKSB7Ci0JCQkJcy0+Y2FsbGJhY2stPnJlc291cmNlc19kb25lKHMpOwotCQkJCW1vZHVsZV9wdXQocy0+Y2FsbGJhY2stPm93bmVyKTsKLQkJCX0KLQkJfQotCQl1cCgmcy0+c2t0X3NlbSk7Ci0KLQkJcmV0dXJuIGNvdW50OwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CiAKKwlkb3duKCZzLT5za3Rfc2VtKTsKKwlpZiAoKHMtPmNhbGxiYWNrKSAmJgorCSAgICAocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkgJiYKKwkgICAgIShzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSkgeworCQlpZiAodHJ5X21vZHVsZV9nZXQocy0+Y2FsbGJhY2stPm93bmVyKSkgeworCQkJcy0+Y2FsbGJhY2stPnJlcXVlcnkocyk7CisJCQltb2R1bGVfcHV0KHMtPmNhbGxiYWNrLT5vd25lcik7CisJCX0KKwl9CisJdXAoJnMtPnNrdF9zZW0pOworCiAJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9yZXNvdXJjZXNfc2V0dXBfZG9uZSwgMDYwMCwgcGNjYXJkX3Nob3dfcmVzb3VyY2UsIHBjY2FyZF9zdG9yZV9yZXNvdXJjZSk7CiAKIAorc3RhdGljIHNzaXplX3QgcGNjYXJkX2V4dHJhY3RfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwl0dXBsZV90IHR1cGxlOworCWludCBzdGF0dXMsIGk7CisJbG9mZl90IHBvaW50ZXIgPSAwOworCXNzaXplX3QgcmV0ID0gMDsKKwl1X2NoYXIgKnR1cGxlYnVmZmVyOworCXVfY2hhciAqdGVtcGJ1ZmZlcjsKKworCXR1cGxlYnVmZmVyID0ga21hbGxvYyhzaXplb2YodV9jaGFyKSAqIDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0dXBsZWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZW1wYnVmZmVyID0ga21hbGxvYyhzaXplb2YodV9jaGFyKSAqIDI1OCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZW1wYnVmZmVyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV90dXBsZTsKKwl9CisKKwltZW1zZXQoJnR1cGxlLCAwLCBzaXplb2YodHVwbGVfdCkpOworCisJdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9MSU5LIHwgVFVQTEVfUkVUVVJOX0NPTU1PTjsKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBSRVRVUk5fRklSU1RfVFVQTEU7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCisJc3RhdHVzID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgJnR1cGxlKTsKKwl3aGlsZSAoIXN0YXR1cykgeworCQl0dXBsZS5UdXBsZURhdGEgPSB0dXBsZWJ1ZmZlcjsKKwkJdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OworCQltZW1zZXQodHVwbGVidWZmZXIsIDAsIHNpemVvZih1X2NoYXIpICogMjU1KTsKKworCQlzdGF0dXMgPSBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocywgJnR1cGxlKTsKKwkJaWYgKHN0YXR1cykKKwkJCWJyZWFrOworCisJCWlmIChvZmYgPCAocG9pbnRlciArIDIgKyB0dXBsZS5UdXBsZURhdGFMZW4pKSB7CisJCQl0ZW1wYnVmZmVyWzBdID0gdHVwbGUuVHVwbGVDb2RlICYgMHhmZjsKKwkJCXRlbXBidWZmZXJbMV0gPSB0dXBsZS5UdXBsZUxpbmsgJiAweGZmOworCQkJZm9yIChpID0gMDsgaSA8IHR1cGxlLlR1cGxlRGF0YUxlbjsgaSsrKQorCQkJCXRlbXBidWZmZXJbaSArIDJdID0gdHVwbGVidWZmZXJbaV0gJiAweGZmOworCisJCQlmb3IgKGkgPSAwOyBpIDwgKDIgKyB0dXBsZS5UdXBsZURhdGFMZW4pOyBpKyspIHsKKwkJCQlpZiAoKChpICsgcG9pbnRlcikgPj0gb2ZmKSAmJgorCQkJCSAgICAoaSArIHBvaW50ZXIpIDwgKG9mZiArIGNvdW50KSkgeworCQkJCQlidWZbcmV0XSA9IHRlbXBidWZmZXJbaV07CisJCQkJCXJldCsrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBvaW50ZXIgKz0gMiArIHR1cGxlLlR1cGxlRGF0YUxlbjsKKworCQlpZiAocG9pbnRlciA+PSAob2ZmICsgY291bnQpKQorCQkJYnJlYWs7CisKKwkJaWYgKHR1cGxlLlR1cGxlQ29kZSA9PSBDSVNUUExfRU5EKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgJnR1cGxlKTsKKwl9CisKKwlrZnJlZSh0ZW1wYnVmZmVyKTsKKyBmcmVlX3R1cGxlOgorCWtmcmVlKHR1cGxlYnVmZmVyKTsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfY2lzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDB4MjAwOworCisJaWYgKG9mZiA+PSBzaXplKQorCQljb3VudCA9IDA7CisJZWxzZSB7CisJCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCQljaXNpbmZvX3QgY2lzaW5mbzsKKworCQlpZiAob2ZmICsgY291bnQgPiBzaXplKQorCQkJY291bnQgPSBzaXplIC0gb2ZmOworCisJCXMgPSB0b19zb2NrZXQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjbGFzc19kZXZpY2UsIGtvYmopKTsKKworCQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAocGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCBCSU5EX0ZOX0FMTCwgJmNpc2luZm8pKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghY2lzaW5mby5DaGFpbnMpCisJCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkJY291bnQgPSBwY2NhcmRfZXh0cmFjdF9jaXMocywgYnVmLCBvZmYsIGNvdW50KTsKKwl9CisKKwlyZXR1cm4gKGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX2NpcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjbGFzc19kZXZpY2UsIGtvYmopKTsKKwljaXNkdW1wX3QgKmNpczsKKwlzc2l6ZV90IHJldCA9IGNvdW50OworCisJaWYgKG9mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPj0gMHgyMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiAtRU5PREVWOworCisJY2lzID0ga21hbGxvYyhzaXplb2YoY2lzZHVtcF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjaXMsIDAsIHNpemVvZihjaXNkdW1wX3QpKTsKKworCWNpcy0+TGVuZ3RoID0gY291bnQgKyAxOworCW1lbWNweShjaXMtPkRhdGEsIGJ1ZiwgY291bnQpOworCisJaWYgKHBjbWNpYV9yZXBsYWNlX2NpcyhzLCBjaXMpKQorCQlyZXQgID0gLUVJTzsKKworCWtmcmVlKGNpcyk7CisKKwlpZiAoIXJldCkgeworCQlkb3duKCZzLT5za3Rfc2VtKTsKKwkJaWYgKChzLT5jYWxsYmFjaykgJiYgKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpICYmCisJCSAgICAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSB7CisJCQlpZiAodHJ5X21vZHVsZV9nZXQocy0+Y2FsbGJhY2stPm93bmVyKSkgeworCQkJCXMtPmNhbGxiYWNrLT5yZXF1ZXJ5KHMpOworCQkJCW1vZHVsZV9wdXQocy0+Y2FsbGJhY2stPm93bmVyKTsKKwkJCX0KKwkJfQorCQl1cCgmcy0+c2t0X3NlbSk7CisJfQorCisKKwlyZXR1cm4gKHJldCk7Cit9CisKKwogc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpwY2NhcmRfc29ja2V0X2F0dHJpYnV0ZXNbXSA9IHsKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF90eXBlLAogCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX3ZvbHRhZ2UsCkBAIC0xOTksNiArMzM0LDEzIEBACiAJTlVMTCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBwY2NhcmRfY2lzX2F0dHIgPSB7CisJLmF0dHIgPSB7IC5uYW1lID0gImNpcyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsIC5vd25lciA9IFRISVNfTU9EVUxFfSwKKwkuc2l6ZSA9IDB4MjAwLAorCS5yZWFkID0gcGNjYXJkX3Nob3dfY2lzLAorCS53cml0ZSA9IHBjY2FyZF9zdG9yZV9jaXMsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2NhcmRfc3lzZnNfYWRkX3NvY2tldChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKiphdHRyOwpAQCAtMjA5LDYgKzM1MSw4IEBACiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAl9CisJaWYgKCFyZXQpCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmY2xhc3NfZGV2LT5rb2JqLCAmcGNjYXJkX2Npc19hdHRyKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMTcsNiArMzYxLDcgQEAKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqKmF0dHI7CiAKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmNsYXNzX2Rldi0+a29iaiwgJnBjY2FyZF9jaXNfYXR0cik7CiAJZm9yIChhdHRyID0gcGNjYXJkX3NvY2tldF9hdHRyaWJ1dGVzOyAqYXR0cjsgYXR0cisrKQogCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY2xhc3NfZGV2LCAqYXR0cik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS90Y2ljLmMgYi9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKaW5kZXggYWFjYmJiNS4uZDVhNjFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdGNpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3RjaWMuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS90aTExM3guaCBiL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCmluZGV4IGM3YmE5OTguLmZiZTIzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCkBAIC0xNTQsOCArMTU0LDYgQEAKICNkZWZpbmUgRU5FX1RFU1RfQzkJCQkweGM5CS8qIDhiaXQgKi8KICNkZWZpbmUgRU5FX1RFU1RfQzlfVExURU5BQkxFCQkweDAyCiAKLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotCiAvKgogICogVGV4YXMgSW5zdHJ1bWVudHMgQ2FyZEJ1cyBjb250cm9sbGVyIG92ZXJyaWRlcy4KICAqLwpAQCAtODQzLDcgKzg0MSw1IEBACiAJcmV0dXJuIHRpMTJ4eF9vdmVycmlkZShzb2NrZXQpOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0NBUkRCVVMgKi8KLQogI2VuZGlmIC8qIF9MSU5VWF9USTExM1hfSCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IGJlZTA1MzYuLjY4Mzc0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC01MjgsNjAgKzUyNywyOSBAQAogICogVXNlIGFuIGFkYXB0aXZlIGFsbG9jYXRpb24gZm9yIHRoZSBtZW1vcnkgcmVzb3VyY2UsCiAgKiBzb21ldGltZXMgdGhlIG1lbW9yeSBiZWhpbmQgcGNpIGJyaWRnZXMgaXMgbGltaXRlZDoKICAqIDEvOCBvZiB0aGUgc2l6ZSBvZiB0aGUgaW8gd2luZG93IG9mIHRoZSBwYXJlbnQuCi0gKiBtYXggNCBNQiwgbWluIDE2IGtCLgorICogbWF4IDQgTUIsIG1pbiAxNiBrQi4gV2UgdHJ5IHZlcnkgaGFyZCB0byBub3QgZ2V0IGJlbG93CisgKiB0aGUgIkFDQyIgdmFsdWVzLCB0aG91Z2guCiAgKi8KICNkZWZpbmUgQlJJREdFX01FTV9NQVggNCoxMDI0KjEwMjQKKyNkZWZpbmUgQlJJREdFX01FTV9BQ0MgMTI4KjEwMjQKICNkZWZpbmUgQlJJREdFX01FTV9NSU4gMTYqMTAyNAogCi0jZGVmaW5lIEJSSURHRV9JT19NQVggMjU2CisjZGVmaW5lIEJSSURHRV9JT19NQVggNTEyCisjZGVmaW5lIEJSSURHRV9JT19BQ0MgMjU2CiAjZGVmaW5lIEJSSURHRV9JT19NSU4gMzIKIAogI2lmbmRlZiBQQ0lCSU9TX01JTl9DQVJEQlVTX0lPCiAjZGVmaW5lIFBDSUJJT1NfTUlOX0NBUkRCVVNfSU8gUENJQklPU19NSU5fSU8KICNlbmRpZgogCi1zdGF0aWMgdm9pZCB5ZW50YV9hbGxvY2F0ZV9yZXMoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCBpbnQgbnIsIHVuc2lnbmVkIHR5cGUpCitzdGF0aWMgaW50IHllbnRhX3NlYXJjaF9vbmVfcmVzKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJdTMyIG1pbikKIHsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCXN0cnVjdCByZXNvdXJjZSAqcm9vdCwgKnJlczsKLQl1MzIgc3RhcnQsIGVuZDsKLQl1MzIgYWxpZ24sIHNpemUsIG1pbjsKLQl1bnNpZ25lZCBvZmZzZXQ7Ci0JdW5zaWduZWQgbWFzazsKKwl1MzIgYWxpZ24sIHNpemUsIHN0YXJ0LCBlbmQ7CiAKLQkvKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIG1lbW9yeSBsaW1pdCBpcyA0a0IsIG9uIElPIGl0J3MgNCBieXRlcyAqLwotCW1hc2sgPSB+MHhmZmY7Ci0JaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKQotCQltYXNrID0gfjM7Ci0KLQlvZmZzZXQgPSAweDFjICsgOCpucjsKLQlidXMgPSBzb2NrZXQtPmRldi0+c3Vib3JkaW5hdGU7Ci0JcmVzID0gc29ja2V0LT5kZXYtPnJlc291cmNlICsgUENJX0JSSURHRV9SRVNPVVJDRVMgKyBucjsKLQlyZXMtPm5hbWUgPSBidXMtPm5hbWU7Ci0JcmVzLT5mbGFncyA9IHR5cGU7Ci0JcmVzLT5zdGFydCA9IDA7Ci0JcmVzLT5lbmQgPSAwOwotCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7Ci0KLQlpZiAoIXJvb3QpCi0JCXJldHVybjsKLQotCXN0YXJ0ID0gY29uZmlnX3JlYWRsKHNvY2tldCwgb2Zmc2V0KSAmIG1hc2s7Ci0JZW5kID0gY29uZmlnX3JlYWRsKHNvY2tldCwgb2Zmc2V0KzQpIHwgfm1hc2s7Ci0JaWYgKHN0YXJ0ICYmIGVuZCA+IHN0YXJ0ICYmICFvdmVycmlkZV9iaW9zKSB7Ci0JCXJlcy0+c3RhcnQgPSBzdGFydDsKLQkJcmVzLT5lbmQgPSBlbmQ7Ci0JCWlmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkKLQkJCXJldHVybjsKLQkJcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgJXM6IFByZWFzc2lnbmVkIHJlc291cmNlICVkIGJ1c3ksIHJlY29uZmlndXJpbmcuLi5cbiIsCi0JCQkJcGNpX25hbWUoc29ja2V0LT5kZXYpLCBucik7Ci0JCXJlcy0+c3RhcnQgPSByZXMtPmVuZCA9IDA7Ci0JfQotCi0JaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKSB7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCWFsaWduID0gMTAyNDsKIAkJc2l6ZSA9IEJSSURHRV9JT19NQVg7Ci0JCW1pbiA9IEJSSURHRV9JT19NSU47CiAJCXN0YXJ0ID0gUENJQklPU19NSU5fQ0FSREJVU19JTzsKIAkJZW5kID0gfjBVOwogCX0gZWxzZSB7CkBAIC01OTYsMjYgKzU2NCwxMDcgQEAKIAkJCQlpKys7CiAJCQlzaXplID0gMSA8PCBpOwogCQl9Ci0JCWlmIChzaXplIDwgQlJJREdFX01FTV9NSU4pCi0JCQlzaXplID0gQlJJREdFX01FTV9NSU47Ci0JCW1pbiA9IEJSSURHRV9NRU1fTUlOOworCQlpZiAoc2l6ZSA8IG1pbikKKwkJCXNpemUgPSBtaW47CiAJCWFsaWduID0gc2l6ZTsKIAkJc3RhcnQgPSBQQ0lCSU9TX01JTl9NRU07CiAJCWVuZCA9IH4wVTsKIAl9Ci0JCisKIAlkbyB7Ci0JCWlmIChhbGxvY2F0ZV9yZXNvdXJjZShyb290LCByZXMsIHNpemUsIHN0YXJ0LCBlbmQsIGFsaWduLCBOVUxMLCBOVUxMKT09MCkgewotCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIG9mZnNldCwgcmVzLT5zdGFydCk7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgb2Zmc2V0KzQsIHJlcy0+ZW5kKTsKLQkJCXJldHVybjsKKwkJaWYgKGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2l6ZSwgc3RhcnQsIGVuZCwgYWxpZ24sCisJCQkJICAgICAgTlVMTCwgTlVMTCk9PTApIHsKKwkJCXJldHVybiAxOwogCQl9CiAJCXNpemUgPSBzaXplLzI7CiAJCWFsaWduID0gc2l6ZTsKIAl9IHdoaWxlIChzaXplID49IG1pbik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHllbnRhX3NlYXJjaF9yZXMoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCSAgICB1MzIgbWluKQoreworCWludCBpOworCWZvciAoaT0wOyBpPFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqIHJvb3QgPSBzb2NrZXQtPmRldi0+YnVzLT5yZXNvdXJjZVtpXTsKKwkJaWYgKCFyb290KQorCQkJY29udGludWU7CisKKwkJaWYgKChyZXMtPmZsYWdzIF4gcm9vdC0+ZmxhZ3MpICYKKwkJICAgIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIKSkKKwkJCWNvbnRpbnVlOyAvKiBXcm9uZyB0eXBlICovCisKKwkJaWYgKHllbnRhX3NlYXJjaF9vbmVfcmVzKHJvb3QsIHJlcywgbWluKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeWVudGFfYWxsb2NhdGVfcmVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgaW50IG5yLCB1bnNpZ25lZCB0eXBlLCBpbnQgYWRkcl9zdGFydCwgaW50IGFkZHJfZW5kKQoreworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IHJlc291cmNlICpyb290LCAqcmVzOworCXUzMiBzdGFydCwgZW5kOworCXVuc2lnbmVkIG1hc2s7CisKKwlyZXMgPSBzb2NrZXQtPmRldi0+cmVzb3VyY2UgKyBQQ0lfQlJJREdFX1JFU09VUkNFUyArIG5yOworCS8qIEFscmVhZHkgYWxsb2NhdGVkPyAqLworCWlmIChyZXMtPnBhcmVudCkKKwkJcmV0dXJuOworCisJLyogVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBtZW1vcnkgbGltaXQgaXMgNGtCLCBvbiBJTyBpdCdzIDQgYnl0ZXMgKi8KKwltYXNrID0gfjB4ZmZmOworCWlmICh0eXBlICYgSU9SRVNPVVJDRV9JTykKKwkJbWFzayA9IH4zOworCisJYnVzID0gc29ja2V0LT5kZXYtPnN1Ym9yZGluYXRlOworCXJlcy0+bmFtZSA9IGJ1cy0+bmFtZTsKKwlyZXMtPmZsYWdzID0gdHlwZTsKKworCXN0YXJ0ID0gY29uZmlnX3JlYWRsKHNvY2tldCwgYWRkcl9zdGFydCkgJiBtYXNrOworCWVuZCA9IGNvbmZpZ19yZWFkbChzb2NrZXQsIGFkZHJfZW5kKSB8IH5tYXNrOworCWlmIChzdGFydCAmJiBlbmQgPiBzdGFydCAmJiAhb3ZlcnJpZGVfYmlvcykgeworCQlyZXMtPnN0YXJ0ID0gc3RhcnQ7CisJCXJlcy0+ZW5kID0gZW5kOworCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKHNvY2tldC0+ZGV2LCByZXMpOworCQlpZiAocm9vdCAmJiAocmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpID09IDApKQorCQkJcmV0dXJuOworCQlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogUHJlYXNzaWduZWQgcmVzb3VyY2UgJWQgYnVzeSBvciBub3QgYXZhaWxhYmxlLCByZWNvbmZpZ3VyaW5nLi4uXG4iLAorCQkJCXBjaV9uYW1lKHNvY2tldC0+ZGV2KSwgbnIpOworCX0KKworCWlmICh0eXBlICYgSU9SRVNPVVJDRV9JTykgeworCQlpZiAoKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NQVgpKSB8fAorCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19BQ0MpKSB8fAorCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NSU4pKSkgeworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfc3RhcnQsIHJlcy0+c3RhcnQpOworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKKwkJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NQVgpKSB8fAorCQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX0FDQykpIHx8CisJCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpIHsKKwkJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7CisJCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7CisJCQl9CisJCQkvKiBBcHByb3hpbWF0aW5nIHByZWZldGNoYWJsZSBieSBub24tcHJlZmV0Y2hhYmxlICovCisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCX0KKwkJaWYgKCh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01BWCkpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9BQ0MpKSB8fAorCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpIHsKKwkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBhZGRyX3N0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBhZGRyX2VuZCwgcmVzLT5lbmQpOworCQl9CisJfQorCiAJcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgJXM6IG5vIHJlc291cmNlIG9mIHR5cGUgJXggYXZhaWxhYmxlLCB0cnlpbmcgdG8gY29udGludWUuLi5cbiIsCi0JCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIHR5cGUpOwotCXJlcy0+c3RhcnQgPSByZXMtPmVuZCA9IDA7CisJICAgICAgIHBjaV9uYW1lKHNvY2tldC0+ZGV2KSwgdHlwZSk7CisJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gcmVzLT5mbGFncyA9IDA7CiB9CiAKIC8qCkBAIC02MjMsMTAgKzY3MiwxNCBAQAogICovCiBzdGF0aWMgdm9pZCB5ZW50YV9hbGxvY2F0ZV9yZXNvdXJjZXMoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0KQogewotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDAsIElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfUFJFRkVUQ0gpOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDEsIElPUkVTT1VSQ0VfTUVNKTsKLQl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAyLCBJT1JFU09VUkNFX0lPKTsKLQl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAzLCBJT1JFU09VUkNFX0lPKTsJLyogUENJIGlzbid0IGNsZXZlciBlbm91Z2ggdG8gdXNlIHRoaXMgb25lIHlldCAqLworCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDAsIElPUkVTT1VSQ0VfSU8sCisJCQkgICBQQ0lfQ0JfSU9fQkFTRV8wLCBQQ0lfQ0JfSU9fTElNSVRfMCk7CisJeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMSwgSU9SRVNPVVJDRV9JTywKKwkJCSAgIFBDSV9DQl9JT19CQVNFXzEsIFBDSV9DQl9JT19MSU1JVF8xKTsKKwl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAyLCBJT1JFU09VUkNFX01FTXxJT1JFU09VUkNFX1BSRUZFVENILAorCQkJICAgUENJX0NCX01FTU9SWV9CQVNFXzAsIFBDSV9DQl9NRU1PUllfTElNSVRfMCk7CisJeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMywgSU9SRVNPVVJDRV9NRU0sCisJCQkgICBQQ0lfQ0JfTUVNT1JZX0JBU0VfMSwgUENJX0NCX01FTU9SWV9MSU1JVF8xKTsKIH0KIAogCkBAIC04NjUsMTQgKzkxOCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCB5ZW50YV9nZXRfc29ja2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHUzMiBpc2FfaXJxX21hc2spCiB7Ci0Jc29ja2V0LT5zb2NrZXQuZmVhdHVyZXMgfD0gU1NfQ0FQX1BBR0VfUkVHUyB8IFNTX0NBUF9QQ0NBUkQgfCBTU19DQVBfQ0FSREJVUzsKLQlzb2NrZXQtPnNvY2tldC5tYXBfc2l6ZSA9IDB4MTAwMDsKIAlzb2NrZXQtPnNvY2tldC5wY2lfaXJxID0gc29ja2V0LT5jYl9pcnE7CiAJaWYgKGlzYV9wcm9iZSkKIAkJc29ja2V0LT5zb2NrZXQuaXJxX21hc2sgPSB5ZW50YV9wcm9iZV9pcnEoc29ja2V0LCBpc2FfaXJxX21hc2spOwogCWVsc2UKIAkJc29ja2V0LT5zb2NrZXQuaXJxX21hc2sgPSAwOwotCXNvY2tldC0+c29ja2V0LmNiX2RldiA9IHNvY2tldC0+ZGV2OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IElTQSBJUlEgbWFzayAweCUwNHgsIFBDSSBpcnEgJWRcbiIsCiAJICAgICAgIHNvY2tldC0+c29ja2V0LmlycV9tYXNrLCBzb2NrZXQtPmNiX2lycSk7CkBAIC05MzgsNiArOTg4LDkgQEAKIAlzb2NrZXQtPnNvY2tldC5kZXYuZGV2ID0gJmRldi0+ZGV2OwogCXNvY2tldC0+c29ja2V0LmRyaXZlcl9kYXRhID0gc29ja2V0OwogCXNvY2tldC0+c29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7CisJc29ja2V0LT5zb2NrZXQuZmVhdHVyZXMgPSBTU19DQVBfUEFHRV9SRUdTIHwgU1NfQ0FQX1BDQ0FSRDsKKwlzb2NrZXQtPnNvY2tldC5tYXBfc2l6ZSA9IDB4MTAwMDsKKwlzb2NrZXQtPnNvY2tldC5jYl9kZXYgPSBkZXY7CiAKIAkvKiBwcmVwYXJlIHN0cnVjdCB5ZW50YV9zb2NrZXQgKi8KIAlzb2NrZXQtPmRldiA9IGRldjsKQEAgLTEwMDgsNiArMTA2MSwxMCBAQAogCQlzb2NrZXQtPnBvbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNvY2tldDsKIAkJc29ja2V0LT5wb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJCWFkZF90aW1lcigmc29ja2V0LT5wb2xsX3RpbWVyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IG5vIFBDSSBJUlEsIENhcmRCdXMgc3VwcG9ydCBkaXNhYmxlZCBmb3IgdGhpcyBzb2NrZXQuXG4iCisJCSAgICAgICBLRVJOX0lORk8gIlllbnRhOiBjaGVjayB5b3VyIEJJT1MgQ2FyZEJ1cywgQklPUyBJUlEgb3IgQUNQSSBzZXR0aW5ncy5cbiIpOworCX0gZWxzZSB7CisJCXNvY2tldC0+c29ja2V0LmZlYXR1cmVzIHw9IFNTX0NBUF9DQVJEQlVTOwogCX0KIAogCS8qIEZpZ3VyZSBvdXQgd2hhdCB0aGUgZGFuZyB0aGluZyBjYW4gZG8gZm9yIHRoZSBQQ01DSUEgbGF5ZXIuLi4gKi8KQEAgLTEwNDgsNiArMTEwNSw3IEBACiAJCXBjaV9zYXZlX3N0YXRlKGRldik7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDE2KjQsICZzb2NrZXQtPnNhdmVkX3N0YXRlWzBdKTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMTcqNCwgJnNvY2tldC0+c2F2ZWRfc3RhdGVbMV0pOworCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKIAogCQkvKgogCQkgKiBTb21lIGxhcHRvcHMgKElCTSBUMjIpIGRvIG5vdCBsaWtlIHVzIHB1dHRpbmcgdGhlIENhcmRidXMKQEAgLTEwNzEsNiArMTEyOSw4IEBACiAJCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAxNio0LCBzb2NrZXQtPnNhdmVkX3N0YXRlWzBdKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDE3KjQsIHNvY2tldC0+c2F2ZWRfc3RhdGVbMV0pOworCQlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCQlwY2lfc2V0X21hc3RlcihkZXYpOwogCiAJCWlmIChzb2NrZXQtPnR5cGUgJiYgc29ja2V0LT50eXBlLT5yZXN0b3JlX3N0YXRlKQogCQkJc29ja2V0LT50eXBlLT5yZXN0b3JlX3N0YXRlKHNvY2tldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggZGQ2MWUwOS4uNzU1NzVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQkJYWNwaV9yZWdpc3Rlcl9nc2kocmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdLAogCQkJCQlyZXMtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwsCiAJCQkJCXJlcy0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93KSk7Ci0JCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEocmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdKTsKKwkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0sIDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkJCQlhY3BpX3JlZ2lzdGVyX2dzaShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0sCiAJCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCwKIAkJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cpKTsKLQkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pOworCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6CkBAIC00NDQsNiArNDQ0LDcgQEAKIAogc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgewogCXN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb247CisJc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbl9pbmRlcGVuZGVudDsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2OwogfTsKIApAQCAtNTA3LDcgKzUwOCwxNCBAQAogCQkJcGFyc2VfZGF0YS0+b3B0aW9uID0gb3B0aW9uOwkKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUlNUWVBFX0VORF9EUEY6Ci0JCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CisJCQkvKm9ubHkgb25lIEVuZERlcGVuZGVudEZuIGlzIGFsbG93ZWQqLworCQkJaWYgKCFwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQpIHsKKwkJCQlwbnBfd2FybigiUG5QQUNQSTogbW9yZSB0aGFuIG9uZSBFbmREZXBlbmRlbnRGbiIpOworCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCX0KKwkJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IHBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudDsKKwkJCXBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudCA9IE5VTEw7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXBucF93YXJuKCJQblBBQ1BJOiB1bmtub3duIHJlc291cmNlIHR5cGUgJWQiLCByZXMtPmlkKTsKIAkJCXJldHVybiBBRV9FUlJPUjsKQEAgLTUyNSw2ICs1MzMsNyBAQAogCXBhcnNlX2RhdGEub3B0aW9uID0gcG5wX3JlZ2lzdGVyX2luZGVwZW5kZW50X29wdGlvbihkZXYpOwogCWlmICghcGFyc2VfZGF0YS5vcHRpb24pCiAJCXJldHVybiBBRV9FUlJPUjsKKwlwYXJzZV9kYXRhLm9wdGlvbl9pbmRlcGVuZGVudCA9IHBhcnNlX2RhdGEub3B0aW9uOwogCXBhcnNlX2RhdGEuZGV2ID0gZGV2OwogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLCAKIAkJcG5wYWNwaV9vcHRpb25fcmVzb3VyY2UsICZwYXJzZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYwppbmRleCA3OWJjZTdiLi45MDAxYjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCkBAIC02NCw3ICs2NCw3IEBACiAJCX0KIAkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uc3RhcnQgPQogCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5lbmQgPSAodW5zaWduZWQgbG9uZykgaXJxOwotCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaXJxKTsKKwkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGlycSwgMSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9yZXNvdXJjZS5jIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwppbmRleCAyZDEzMjJkLi44ODdhZDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQkJaWYgKHRlc3RfYml0KGksIGRhdGEtPm1hcCkpCi0JCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGkpOworCQkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpLCAwKTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggNjA0NDBkYi4uMjRjMGFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCW5ld19za2IgPSBOVUxMOwkJLyogYXNzdW1lIG5vIGRpY2UgKi8KIAlwa3RfY250ID0gMDsKIAlDTEFXX0RCRl9URVhUKDQsdHJhY2UsIlBhY2tTS0JlIik7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJnBfY2gtPmNvbGxlY3RfcXVldWUpID4gMCkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZwX2NoLT5jb2xsZWN0X3F1ZXVlKSkgewogCS8qIHNvbWUgZGF0YSAqLwogCQloZWxkX3NrYiA9IHNrYl9kZXF1ZXVlKCZwX2NoLT5jb2xsZWN0X3F1ZXVlKTsKIAkJaWYgKHBfZW52LT5wYWNraW5nICE9IERPX1BBQ0tFRCkKQEAgLTEyNTQsNyArMTI1NCw3IEBACiAJcHJpdnB0ciA9IChzdHJ1Y3QgY2xhd19wcml2YmsgKikgZGV2LT5wcml2OwogICAgICAgICBjbGF3X2ZyZWVfd3J0X2J1ZiggZGV2ICk7CiAJaWYgKChwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50ID4gMCkgJiYKLQkgICAgKHNrYl9xdWV1ZV9sZW4oJnBfY2gtPmNvbGxlY3RfcXVldWUpID4gMCkpIHsKKwkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSkpIHsKIAkgIAlwa19za2IgPSBjbGF3X3BhY2tfc2tiKHByaXZwdHIpOwogCQl3aGlsZSAocGtfc2tiICE9IE5VTEwpIHsKIAkJCXJjID0gY2xhd19od190eCggcGtfc2tiLCBkZXYsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGN0dHkuYwppbmRleCAzMDgwMzkzLi45NjhmMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjdHR5LmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCQkJCQlza2JfcXVldWVfaGVhZCgmaW5mby0+cnhfcXVldWUsIHNrYik7CiAJCQkJZWxzZSB7CiAJCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCQlyZXQgPSBza2JfcXVldWVfbGVuKCZpbmZvLT5yeF9xdWV1ZSk7CisJCQkJCXJldCA9ICFza2JfcXVldWVfZW1wdHkoJmluZm8tPnJ4X3F1ZXVlKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUzMCw3ICs1MzAsNyBAQAogCQl0b3RhbCArPSBjOwogCQljb3VudCAtPSBjOwogCX0KLQlpZiAoc2tiX3F1ZXVlX2xlbigmaW5mby0+dHhfcXVldWUpKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmluZm8tPnR4X3F1ZXVlKSkgewogCQlpbmZvLT5sc3IgJj0gflVBUlRfTFNSX1RFTVQ7CiAJCXRhc2tsZXRfc2NoZWR1bGUoJmluZm8tPnRhc2tsZXQpOwogCX0KQEAgLTU5NCw3ICs1OTQsNyBAQAogCQlyZXR1cm47CiAJaWYgKGN0Y190dHlfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3RjX3R0eV9mbHVzaF9jaGFycyIpKQogCQlyZXR1cm47Ci0JaWYgKHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwgKCFza2JfcXVldWVfbGVuKCZpbmZvLT50eF9xdWV1ZSkpKQorCWlmICh0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8IHNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+dHhfcXVldWUpKQogCQlyZXR1cm47CiAJdGFza2xldF9zY2hlZHVsZSgmaW5mby0+dGFza2xldCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwppbmRleCAzY2I4OGM3Li44ZjRkMjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKQEAgLTIyMTAsNyArMjIxMCw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKK3N0YXRpYyBpbmxpbmUgX19iZTE2CiBxZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvc2J1cy9jaGFyL0tjb25maWcKaW5kZXggOTBkOGVmMS4uYTQxNzc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnCkBAIC03MSwyMCArNzEsNiBAQAogCiAjIFhYWCBXaHkgZG9uJ3Qgd2UgZG8gInNvdXJjZSBkcml2ZXJzL2NoYXIvQ29uZmlnLmluIiBzb21ld2hlcmU/CiAjIG5vIHNoaXQKLWNvbmZpZyBBUE1fUlRDX0lTX0dNVAotCWJvb2wKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTUEFSQzMyICYmIFBDSQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91ciBSVEMgKFJlYWwgVGltZSBDbG9jayBhLmsuYS4gaGFyZHdhcmUgY2xvY2spCi0JICBzdG9yZXMgdGhlIHRpbWUgaW4gR01UIChHcmVlbndpY2ggTWVhbiBUaW1lKS4gU2F5IE4gaWYgeW91ciBSVEMKLQkgIHN0b3JlcyBsb2NhbHRpbWUuCi0KLQkgIEl0IGlzIGluIGZhY3QgcmVjb21tZW5kZWQgdG8gc3RvcmUgR01UIGluIHlvdXIgUlRDLCBiZWNhdXNlIHRoZW4geW91Ci0JICBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSBjaGFuZ2VzLiBUaGUgb25seQotCSAgcmVhc29uIG5vdCB0byB1c2UgR01UIGluIHlvdXIgUlRDIGlzIGlmIHlvdSBhbHNvIHJ1biBhIGJyb2tlbiBPUwotCSAgdGhhdCBkb2Vzbid0IHVuZGVyc3RhbmQgR01ULgotCiBjb25maWcgUlRDCiAJdHJpc3RhdGUgIlBDLXN0eWxlIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTCAmJiBTUEFSQzMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCmluZGV4IDY1MGQ1ZTkuLmQ5NmNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCkBAIC0xNTE1LDggKzE1MTUsNyBAQAogCQkgKi8KIAkJdGltZW91dCA9IGppZmZpZXMrSFo7CiAJCXdoaWxlKHBvcnQtPlNSRVIgJiBTUkVSX1RYRU1QVFkpICB7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQocG9ydC0+dGltZW91dCk7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPnRpbWVvdXQpKTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNTMzLDggKzE1MzIsNyBAQAogCXBvcnQtPnR0eSA9IDA7CiAJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgewogCQlpZiAocG9ydC0+Y2xvc2VfZGVsYXkpIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJc2NoZWR1bGVfdGltZW91dChwb3J0LT5jbG9zZV9kZWxheSk7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPmNsb3NlX2RlbGF5KSk7CiAJCX0KIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCmluZGV4IGQ1MjU5ZjcuLmI4YTJjNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYwpAQCAtNCwxMyArNCwxNCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICAqLwogCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KLSNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwogc3RhdGljIGludCBlcnJubzsKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JwcC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMKaW5kZXggOGYwZjQ2OS4uODczMDJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMKQEAgLTc5LDEwICs3OSw2IEBACiAKICAgICAgIHVuc2lnbmVkIGNoYXIgcnVuX2xlbmd0aDsKICAgICAgIHVuc2lnbmVkIGNoYXIgcmVwZWF0X2J5dGU7Ci0KLSAgICAgIC8qIFRoZXNlIG1lbWJlcnMgbWFuYWdlIHRpbWVvdXRzIGZvciBwcm9ncmFtbWVkIGRlbGF5cyAqLwotICAgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKLSAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2xpc3Q7CiB9OwogCiBzdGF0aWMgc3RydWN0IGluc3QgaW5zdGFuY2VzW0JQUF9OT107CkBAIC0yOTcsMTYgKzI5MywxMCBAQAogCiAjZW5kaWYgLyogX19zcGFyY19fICovCiAKLXN0YXRpYyB2b2lkIGJwcF93YWtlX3VwKHVuc2lnbmVkIGxvbmcgdmFsKQoteyB3YWtlX3VwKCZpbnN0YW5jZXNbdmFsXS53YWl0X3F1ZXVlKTsgfQotCiBzdGF0aWMgdm9pZCBzbm9vemUodW5zaWduZWQgbG9uZyBzbm9vemVfdGltZSwgdW5zaWduZWQgbWlub3IpCiB7Ci0gICAgICBpbml0X3RpbWVyKCZpbnN0YW5jZXNbbWlub3JdLnRpbWVyX2xpc3QpOwotICAgICAgaW5zdGFuY2VzW21pbm9yXS50aW1lcl9saXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgc25vb3plX3RpbWUgKyAxOwotICAgICAgaW5zdGFuY2VzW21pbm9yXS50aW1lcl9saXN0LmRhdGEgICAgPSBtaW5vcjsKLSAgICAgIGFkZF90aW1lcigmaW5zdGFuY2VzW21pbm9yXS50aW1lcl9saXN0KTsKLSAgICAgIHNsZWVwX29uICgmaW5zdGFuY2VzW21pbm9yXS53YWl0X3F1ZXVlKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChzbm9vemVfdGltZSArIDEpOwogfQogCiBzdGF0aWMgaW50IHdhaXRfZm9yKHVuc2lnbmVkIHNob3J0IHNldCwgdW5zaWduZWQgc2hvcnQgY2xyLApAQCAtODgwLDExICs4NzAsOCBAQAogICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQgPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0uZGlyZWN0aW9uID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLm1vZGUgPSBDT01QQVRJQklMSVRZOwotICAgICAgaW5zdGFuY2VzW2lkeF0ud2FpdF9xdWV1ZSA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fbGVuZ3RoID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLnJ1bl9mbGFnID0gMDsKLSAgICAgIGluaXRfdGltZXIoJmluc3RhbmNlc1tpZHhdLnRpbWVyX2xpc3QpOwotICAgICAgaW5zdGFuY2VzW2lkeF0udGltZXJfbGlzdC5mdW5jdGlvbiA9IGJwcF93YWtlX3VwOwogICAgICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbihscEFkZHIsMywgZGV2X25hbWUpKSByZXR1cm47CiAKICAgICAgIC8qCkBAIC05NzcsMTEgKzk2NCw4IEBACiAgICAgICBpbnN0YW5jZXNbaWR4XS5lbmhhbmNlZCA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5kaXJlY3Rpb24gPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0ubW9kZSA9IENPTVBBVElCSUxJVFk7Ci0gICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnN0YW5jZXNbaWR4XS53YWl0X3F1ZXVlKTsKICAgICAgIGluc3RhbmNlc1tpZHhdLnJ1bl9sZW5ndGggPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0ucnVuX2ZsYWcgPSAwOwotICAgICAgaW5pdF90aW1lcigmaW5zdGFuY2VzW2lkeF0udGltZXJfbGlzdCk7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS50aW1lcl9saXN0LmZ1bmN0aW9uID0gYnBwX3dha2VfdXA7CiAKICAgICAgIGlmICghcnApIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IGY2ZWQzNWIuLjlhOGM1NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqICAgICAgICAgICAgICBEYW5pZWxlIEJlbGx1Y2NpIDxiZWxsdWNkYUB0aXNjYWxpLml0PgogICovCiAKKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM1LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9lbnZjdHJsLmg+CiAKLSNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwogc3RhdGljIGludCBlcnJubzsKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKQEAgLTEwMDcsNyArMTAwOCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXBvbGxfaW50ZXJ2YWwgPSA1ICogSFo7IC8qIFRPRE8gZW52X21vbl9pbnRlcnZhbCAqLworCXBvbGxfaW50ZXJ2YWwgPSA1MDAwOyAvKiBUT0RPIGVudl9tb25faW50ZXJ2YWwgKi8KIAogCWRhZW1vbml6ZSgia2VudmN0cmxkIik7CiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwpAQCAtMTAxNiwxMCArMTAxNyw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJlbnZjdHJsOiAlcyBzdGFydGluZy4uLlxuIiwgY3VycmVudC0+Y29tbSk7CiAJZm9yICg7OykgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dChwb2xsX2ludGVydmFsKTsKLQotCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJaWYobXNsZWVwX2ludGVycnVwdGlibGUocG9sbF9pbnRlcnZhbCkpCiAJCQlicmVhazsKIAogCQlmb3IgKHdoaWNoY3B1ID0gMDsgd2hpY2hjcHUgPCBFTlZDVFJMX01BWF9DUFU7ICsrd2hpY2hjcHUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19pMmMuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19pMmMuYwppbmRleCA5NWUzY2ViLi4xZmFmMWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci92ZmNfaTJjLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5jCkBAIC04OCwxNCArODgsMTYgQEAKIAogdm9pZCB2ZmNfaTJjX2RlbGF5X25vX2J1c3koc3RydWN0IHZmY19kZXYgKmRldiwgdW5zaWduZWQgbG9uZyB1c2VjcykgCiB7CisJREVGSU5FX1dBSVQod2FpdCk7CiAJaW5pdF90aW1lcigmZGV2LT5wb2xsX3RpbWVyKTsKLQlkZXYtPnBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAKLQkJKCh1bnNpZ25lZCBsb25nKXVzZWNzKihIWikpLzEwMDAwMDA7CisJZGV2LT5wb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyh1c2Vjcyk7CiAJZGV2LT5wb2xsX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpZGV2OwogCWRldi0+cG9sbF90aW1lci5mdW5jdGlvbj0odm9pZCAqKSh1bnNpZ25lZCBsb25nKXZmY19pMmNfZGVsYXlfd2FrZXVwOwogCWFkZF90aW1lcigmZGV2LT5wb2xsX3RpbWVyKTsKLQlzbGVlcF9vbigmZGV2LT5wb2xsX3dhaXQpOworCXByZXBhcmVfdG9fd2FpdCgmZGV2LT5wb2xsX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGUoKTsKIAlkZWxfdGltZXIoJmRldi0+cG9sbF90aW1lcik7CisJZmluaXNoX3dhaXQoJmRldi0+cG9sbF93YWl0LCAmd2FpdCk7CiB9CiAKIHZvaWQgaW5saW5lIHZmY19pMmNfZGVsYXkoc3RydWN0IHZmY19kZXYgKmRldikgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwppbmRleCAzNGRiYzM3Li5iYzZlNDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKQEAgLTE5MTYsOSArMTkxNiw5IEBACiB9IC8qIEVuZCBfX3R3YV9zaHV0ZG93bigpICovCiAKIC8qIFdyYXBwZXIgZm9yIF9fdHdhX3NodXRkb3duICovCi1zdGF0aWMgdm9pZCB0d2Ffc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHdhX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CiAKIAlfX3R3YV9zaHV0ZG93bih0d19kZXYpOwpAQCAtMjE0MCw5ICsyMTQwLDcgQEAKIAkuaWRfdGFibGUJPSB0d2FfcGNpX3RibCwKIAkucHJvYmUJCT0gdHdhX3Byb2JlLAogCS5yZW1vdmUJCT0gdHdhX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLnNodXRkb3duID0gdHdhX3NodXRkb3duCi0JfQorCS5zaHV0ZG93bgk9IHR3YV9zaHV0ZG93bgogfTsKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LXh4eHguYwppbmRleCBiNmRjNTc2Li45NzNjNTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKQEAgLTIyNjQsOSArMjI2NCw5IEBACiB9IC8qIEVuZCBfX3R3X3NodXRkb3duKCkgKi8KIAogLyogV3JhcHBlciBmb3IgX190d19zaHV0ZG93biAqLwotc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKIAogCV9fdHdfc2h1dGRvd24odHdfZGV2KTsKQEAgLTI0NTEsOSArMjQ1MSw3IEBACiAJLmlkX3RhYmxlCT0gdHdfcGNpX3RibCwKIAkucHJvYmUJCT0gdHdfcHJvYmUsCiAJLnJlbW92ZQkJPSB0d19yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5zaHV0ZG93biA9IHR3X3NodXRkb3duCi0JfQorCS5zaHV0ZG93bgk9IHR3X3NodXRkb3duLAogfTsKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwppbmRleCBkMDA1YWQ3Li44NTM4NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JdXNlcl9zcmJjbWQgPSBrbWFsbG9jKEdGUF9LRVJORUwsIGZpYnNpemUpOworCXVzZXJfc3JiY21kID0ga21hbGxvYyhmaWJzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzZXJfc3JiY21kKSB7CiAJCWRwcmludGsoKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IG1ha2UgYSBjb3B5IG9mIHRoZSBzcmJcbiIpKTsKIAkJcmNvZGUgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoY2kuYyBiL2RyaXZlcnMvc2NzaS9haGNpLmMKaW5kZXggOWE1NDdjYS4uYzU2MjM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0zMDQsMjYgKzMwNCwxOSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OwogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwOwotCWludCByYzsKIAl2b2lkICptZW0sICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CiAJdm9pZCAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCWRtYV9hZGRyX3QgbWVtX2RtYTsKIAotCXJjID0gYXRhX3BvcnRfc3RhcnQoYXApOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCiAJcHAgPSBrbWFsbG9jKHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBwKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KKwlpZiAoIXBwKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKIAogCW1lbSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIEFIQ0lfUE9SVF9QUklWX0RNQV9TWiwgJm1lbV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghbWVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0X2tmcmVlOworCQlrZnJlZShwcCk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQobWVtLCAwLCBBSENJX1BPUlRfUFJJVl9ETUFfU1opOwogCkBAIC0zNzMsMTIgKzM2Niw2IEBACiAJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLwogCiAJcmV0dXJuIDA7Ci0KLWVycl9vdXRfa2ZyZWU6Ci0Ja2ZyZWUocHApOwotZXJyX291dDoKLQlhdGFfcG9ydF9zdG9wKGFwKTsKLQlyZXR1cm4gcmM7CiB9CiAKIApAQCAtNDA0LDcgKzM5MSw2IEBACiAJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osCiAJCQkgIHBwLT5jbWRfc2xvdCwgcHAtPmNtZF9zbG90X2RtYSk7CiAJa2ZyZWUocHApOwotCWF0YV9wb3J0X3N0b3AoYXApOwogfQogCiBzdGF0aWMgdTMyIGFoY2lfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggODBkMDIyNi4uYmFiZDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtNjAxMiw3ICs2MDEyLDcgQEAKIAogLyoqCiAgKiBpcHJfc2h1dGRvd24gLSBTaHV0ZG93biBoYW5kbGVyLgotICogQGRldjoJZGV2aWNlIHN0cnVjdAorICogQHBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHVwb24gc3lzdGVtIHNodXRkb3duL3JlYm9vdC4gSXQgd2lsbCBpc3N1ZQogICogYW4gYWRhcHRlciBzaHV0ZG93biB0byB0aGUgYWRhcHRlciB0byBmbHVzaCB0aGUgd3JpdGUgY2FjaGUuCkBAIC02MDIwLDkgKzYwMjAsOSBAQAogICogUmV0dXJuIHZhbHVlOgogICogCW5vbmUKICAqKi8KLXN0YXRpYyB2b2lkIGlwcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcHJfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwpAQCAtNjA2OCw5ICs2MDY4LDcgQEAKIAkuaWRfdGFibGUgPSBpcHJfcGNpX3RhYmxlLAogCS5wcm9iZSA9IGlwcl9wcm9iZSwKIAkucmVtb3ZlID0gaXByX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkuc2h1dGRvd24gPSBpcHJfc2h1dGRvd24sCi0JfSwKKwkuc2h1dGRvd24gPSBpcHJfc2h1dGRvd24sCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKaW5kZXggZmUxYzcyOS4uNzNiMWY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKQEAgLTE0MDgsNyArMTQwOCw5IEBACiAJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEFfUkVTRVQpIHsKIAkJLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KIAkJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDEpOwotCQl1ZGVsYXkoNDAwKTsJCQkvKiBGSVhNRTogYSBndWVzcyAqLworCQkvKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0CisJCSAqIEFIQ0ktMS4xIDEwLjQuMiBzYXlzIGF0IGxlYXN0IDEgbXMuICovCisJCW1kZWxheSgxKTsKIAl9CiAJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOyAvKiBwaHkgd2FrZS9jbGVhciByZXNldCAqLwogCkBAIC0xOTIwLDYgKzE5MjIsNyBAQAogCSJISVRBQ0hJIENEUi04MzM1IiwKIAkiSElUQUNISSBDRFItODQzNSIsCiAJIlRvc2hpYmEgQ0QtUk9NIFhNLTYyMDJCIiwKKwkiVE9TSElCQSBDRC1ST00gWE0tMTcwMkJDIiwKIAkiQ0QtNTMyRS1BIiwKIAkiRS1JREUgQ0QtUk9NIENSLTg0MCIsCiAJIkNELVJPTSBEcml2ZS9GNUEiLApAQCAtMTkyNyw3ICsxOTMwLDYgQEAKIAkiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsCiAJIlNBTVNVTkcgQ0QtUk9NIFNDIiwKIAkiU2FuRGlzayBTRFAzQi02NCIsCi0JIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsCiAJIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsCiAJIl9ORUMgRFY1ODAwQSIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwppbmRleCA3YTRhZGM0Li43OTRmYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwpAQCAtMTE3Niw4ICsxMTc2LDEyIEBACiAJCW5fc2VjdG9ycyA9IGF0YV9pZF91MzIoYXJncy0+aWQsIDYwKTsKIAluX3NlY3RvcnMtLTsJCS8qIEFUQSBUb3RhbFVzZXJTZWN0b3JzIC0gMSAqLwogCi0JdG1wID0gbl9zZWN0b3JzOwkvKiBub3RlOiB0cnVuY2F0ZXMsIGlmIGxiYTQ4ICovCiAJaWYgKGFyZ3MtPmNtZC0+Y21uZFswXSA9PSBSRUFEX0NBUEFDSVRZKSB7CisJCWlmKCBuX3NlY3RvcnMgPj0gMHhmZmZmZmZmZlVMTCApCisJCQl0bXAgPSAweGZmZmZmZmZmIDsgIC8qIFJldHVybiBtYXggY291bnQgb24gb3ZlcmZsb3cgKi8KKwkJZWxzZQorCQkJdG1wID0gbl9zZWN0b3JzIDsKKwogCQkvKiBzZWN0b3IgY291bnQsIDMyLWJpdCAqLwogCQlyYnVmWzBdID0gdG1wID4+ICg4ICogMyk7CiAJCXJidWZbMV0gPSB0bXAgPj4gKDggKiAyKTsKQEAgLTExOTEsMTAgKzExOTUsMTIgQEAKIAogCX0gZWxzZSB7CiAJCS8qIHNlY3RvciBjb3VudCwgNjQtYml0ICovCi0JCXJidWZbMl0gPSBuX3NlY3RvcnMgPj4gKDggKiA3KTsKLQkJcmJ1ZlszXSA9IG5fc2VjdG9ycyA+PiAoOCAqIDYpOwotCQlyYnVmWzRdID0gbl9zZWN0b3JzID4+ICg4ICogNSk7Ci0JCXJidWZbNV0gPSBuX3NlY3RvcnMgPj4gKDggKiA0KTsKKwkJdG1wID0gbl9zZWN0b3JzID4+ICg4ICogNCk7CisJCXJidWZbMl0gPSB0bXAgPj4gKDggKiAzKTsKKwkJcmJ1ZlszXSA9IHRtcCA+PiAoOCAqIDIpOworCQlyYnVmWzRdID0gdG1wID4+ICg4ICogMSk7CisJCXJidWZbNV0gPSB0bXA7CisJCXRtcCA9IG5fc2VjdG9yczsKIAkJcmJ1Zls2XSA9IHRtcCA+PiAoOCAqIDMpOwogCQlyYnVmWzddID0gdG1wID4+ICg4ICogMik7CiAJCXJidWZbOF0gPSB0bXAgPj4gKDggKiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKaW5kZXggZWRkNDdkMS4uOTMyZGNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKKysrIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKQEAgLTQyNCw3ICs0MjQsNyBAQAogCS51c2VfY2x1c3RlcmluZwk9IERJU0FCTEVfQ0xVU1RFUklORywKIH07CiAKLXN0YXRpYyBpbnQgbWFjNTNjOTRfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgbWFjNTNjOTRfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtYWNpb19nZXRfcGNpX2RldihtZGV2KTsKQEAgLTU0NCwxNSArNTQ0LDE0IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtYWM1M2M5NF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYWM1M2M5NF9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiNTNjOTQiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRSAob2YsIG1hYzUzYzk0X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgbWFjNTNjOTRfZHJpdmVyID0gCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IDZmZTg4NGEuLjZmMzA4ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC01MDA1LDkgKzUwMDUsOSBAQAogfQogCiBzdGF0aWMgdm9pZAotbWVnYXJhaWRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorbWVnYXJhaWRfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWhvc3QtPmhvc3RkYXRhOwogCiAJX19tZWdhcmFpZF9zaHV0ZG93bihhZGFwdGVyKTsKQEAgLTUwMzksOSArNTAzOSw3IEBACiAJLmlkX3RhYmxlCT0gbWVnYXJhaWRfcGNpX3RibCwKIAkucHJvYmUJCT0gbWVnYXJhaWRfcHJvYmVfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWVnYXJhaWRfcmVtb3ZlX29uZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5zaHV0ZG93biA9IG1lZ2FyYWlkX3NodXRkb3duLAotCX0sCisJLnNodXRkb3duCT0gbWVnYXJhaWRfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtZWdhcmFpZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVzaC5jIGIvZHJpdmVycy9zY3NpL21lc2guYwppbmRleCBiMDU3MzdhLi5mZjE5MzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVzaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKQEAgLTE4NDcsNyArMTg0Nyw3IEBACiAJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcsCiB9OwogCi1zdGF0aWMgaW50IG1lc2hfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgbWVzaF9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lc2ggPSBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KTsKIAlzdHJ1Y3QgcGNpX2RldiogcGRldiA9IG1hY2lvX2dldF9wY2lfZGV2KG1kZXYpOwpAQCAtMjAxMiwyMCArMjAxMiwxOCBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWVzaF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtZXNoX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJtZXNoIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXsKLQkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAogCS50eXBlCQk9ICJzY3NpIiwKIAkuY29tcGF0aWJsZQk9ICJjaHJwLG1lc2gwIgogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRSAob2YsIG1lc2hfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBtZXNoX2RyaXZlciA9IAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKaW5kZXggZTYwYjRjMC4uN2M1MzA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICJhaGExNTJ4LmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTEzNCwxMSArMTMzLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFoYTE1MnhfZXZlbnQ7Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTMxOCwxMyArMzEyLDI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBhaGExNTJ4X2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTmV3IE1lZGlhIiwgIlNDU0kiLCAiQnVzIFRvYXN0ZXIiLCAweGNkZjdlNGNjLCAweDM1ZjI2NDc2LCAweGE4ODUxZDZlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk5PVEVXT1JUSFkiLCAiU0NTSSIsICJCdXMgVG9hc3RlciIsIDB4YWQ4OWM2ZTgsIDB4MzVmMjY0NzYsIDB4YTg4NTFkNmUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBZGFwdGVjLCBJbmMuIiwgIkFQQS0xNDYwIFNDU0kgSG9zdCBBZGFwdGVyIiwgMHgyNGJhOTczOCwgMHgzYTNjM2QyMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5ldyBNZWRpYSBDb3Jwb3JhdGlvbiIsICJNdWx0aW1lZGlhIFNvdW5kL1NDU0kiLCAweDA4NWE4NTBiLCAweDgwYTY1MzVjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTk9URVdPUlRIWSIsICJOV0NPTUIwMiBTQ1NJL0FVRElPIENPTUJPIENBUkQiLCAweGFkODljNmU4LCAweDVmOWE2MTViKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGFoYTE1MnhfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGFoYTE1MnhfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiYWhhMTUyeF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGFoYTE1MnhfYXR0YWNoLAorCS5ldmVudAkJPSBhaGExNTJ4X2V2ZW50LAogCS5kZXRhY2gJCT0gYWhhMTUyeF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gYWhhMTUyeF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2FoYTE1MnhfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCmluZGV4IDNkZjdiYzcuLmRiOGY1Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiZmRvbWFpbi5oIgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMjAsMTEgKzExOSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZmZG9tYWluX2V2ZW50OwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0yOTksMTMgKzI5MywyNCBAQAogICAgIHJldHVybiAwOwogfSAvKiBmZG9tYWluX2V2ZW50ICovCiAKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGZkb21haW5faWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSBDb3JwLiIsICJTQ1NJIFBDTUNJQSBDYXJkIiwgMHhlMzczNmM4OCwgMHg4NTljYWQyMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU0NTSSBQQ01DSUEgQWRhcHRlciBDYXJkIiwgMHg4ZGFjYjU3ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIiBTSU1QTEUgVEVDSE5PTE9HWSBDb3Jwb3JhdGlvbiIsICJTQ1NJIFBDTUNJQSBDcmVkaXQgQ2FyZCBDb250cm9sbGVyIiwgMHgxODJiZGFmZSwgMHhjODBkMTA2ZiksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBmZG9tYWluX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBmZG9tYWluX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImZkb21haW5fY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBmZG9tYWluX2F0dGFjaCwKKwkuZXZlbnQJCT0gZmRvbWFpbl9ldmVudCwKIAkuZGV0YWNoCQk9IGZkb21haW5fZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IGZkb21haW5faWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9mZG9tYWluX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwppbmRleCAzZGRkYjMyLi4zY2QzYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTY0MiwxMSArMTY0MSw2IEBACiAJbGluay0+bmV4dCAgICAgICAgICAgICAgID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgICAgICAgICAgICAgICAgID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvCSA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzawkgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVAl8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQJfCBDU19FVkVOVF9QTV9SRVNVTUUJIDsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbnNwX2NzX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTIxMjUsMTMgKzIxMTksMjcgQEAKICAqCW1vZHVsZSBlbnRyeSBwb2ludAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG5zcF9jc19pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklPIERBVEEiLCAiQ0JTQzE2ICAgICAgICIsICIxIiwgMHg1NDdlNjZkYywgMHgwZDYzYTNmZCwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLTUUgICAgIiwgIlNDU0ktQ0FSRC0wMDEiLCAiMSIsIDB4NTM0YzAyYmMsIDB4NTIwMDg0MDgsIDB4NTFkZTAwM2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiS01FICAgICIsICJTQ1NJLUNBUkQtMDAyIiwgIjEiLCAweDUzNGMwMmJjLCAweGNiMDlkNWIyLCAweDUxZGUwMDNhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIktNRSAgICAiLCAiU0NTSS1DQVJELTAwMyIsICIxIiwgMHg1MzRjMDJiYywgMHhiYzBlZTUyNCwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLTUUgICAgIiwgIlNDU0ktQ0FSRC0wMDQiLCAiMSIsIDB4NTM0YzAyYmMsIDB4MjI2YTcwODcsIDB4NTFkZTAwM2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiV0JUIiwgIk5pbmphU0NTSS0zIiwgIlIxLjAiLCAweGM3YmE4MDVmLCAweGZkYzdjOTdkLCAweDY5NzM3MTBlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIldPUktCSVQiLCAiVWx0cmFOaW5qYS0xNiIsICIxIiwgMHgyODE5MTQxOCwgMHhiNzBmNGIwOSwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIG5zcF9jc19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbnNwX2RyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJ2ICAgICAgICAgICAgPSB7Ci0JCS5uYW1lICAgPSAibnNwX2NzIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIm5zcF9jcyIsCiAJfSwKLQkuYXR0YWNoICAgICAgICAgPSBuc3BfY3NfYXR0YWNoLAotCS5kZXRhY2ggICAgICAgICA9IG5zcF9jc19kZXRhY2gsCisJLmF0dGFjaAkJPSBuc3BfY3NfYXR0YWNoLAorCS5ldmVudAkJPSBuc3BfY3NfZXZlbnQsCisJLmRldGFjaAkJPSBuc3BfY3NfZGV0YWNoLAorCS5pZF90YWJsZQk9IG5zcF9jc19pZHMsCiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwppbmRleCBhMDE3NWY1Li43YTUxNmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICIuLi9xbG9naWNmYXM0MDguaCIKIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTk0LDggKzE5Myw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZxbG9naWNfZXZlbnQ7Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTM5NSw2ICszOTIsMjcgQEAKIAlyZXR1cm4gMDsKIH0JCQkJLyogcWxvZ2ljX2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBxbG9naWNfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVJZ2VyIExhYnMiLCAiUENNQ0lBLXRvLVNDU0kgQWRhcHRlciIsIDB4ODgzOTVmYTcsIDB4MzNiN2E1ZTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFUFNPTiIsICJTQ1NJLTIgUEMgQ2FyZCBTQzIwMCIsIDB4ZDM2MTc3MmYsIDB4Mjk5ZDE3NTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNQUNOSUNBIiwgIk1JUkFDTEUgU0NTSS1JSSBtUFMxMTAiLCAweDIwODQxYjY4LCAweGFiM2MzYjZkKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUlET1JJIEVMRUNUUk9OSUNTICIsICJDTi1TQzQzIiwgMHg2NTM0MzgyYSwgMHhkNjdlZWU3OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5FQyIsICJQQy05ODAxTi1KMDNSIiwgMHgxOGRmMGJhMCwgMHgyNDY2MmU4YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktNRSAiLCAiS1hMQzAwMyIsIDB4ODIzNzVhMjcsIDB4ZjY4ZTViZjcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLTUUgIiwgIktYTEMwMDQiLCAweDgyMzc1YTI3LCAweDY4ZWFjZTU0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS01FIiwgIktYTEMxMDEiLCAweDNmYWVlNjc2LCAweDE5NDI1MGVjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUUxPR0lDIENPUlBPUkFUSU9OIiwgInBjMDUiLCAweGQ3N2IyOTMwLCAweGE4NWIyNzM1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUUxPR0lDIENPUlBPUkFUSU9OIiwgInBjMDUgcmV2IDEuMTAiLCAweGQ3N2IyOTMwLCAweDcwZjhiNWY4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIktNRSIsICJLWExDMDAyIiwgIjAwIiwgMHgzZmFlZTY3NiwgMHg4MTg5NmI2MSwgMHhmOTlmMDY1ZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlJBVE9DIFN5c3RlbSBJbmMuIiwgIlNDU0kyIENBUkQgMzciLCAweDg1YzEwZTE3LCAweDFhMjY0MGMxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVE9TSElCQSIsICJTQ1NDMjAwQSBQQyBDQVJEIFNDU0kiLCAweGI0NTg1YTFhLCAweGE2ZjA2ZWJlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVE9TSElCQSIsICJTQ1NDMjAwQiBQQyBDQVJEIFNDU0ktMTAiLCAweGI0NTg1YTFhLCAweDBhODhkZWEwKSwKKwkvKiB0aGVzZSBjb25mbGljdCB3aXRoIG90aGVyIGNhcmRzISAqLworCS8qIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTUFDTklDQSIsICJNSVJBQ0xFIFNDU0kiLCAibVBTMTAwIiwgMHgyMDg0MWI2OCwgMHhmOGRlZGFlYiwgMHg4OWY3ZmFmYiksICovCisJLyogUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJNQUNOSUNBIiwgIk1JUkFDTEUgU0NTSSIsICJtUFMxMDAiLCAweDIwODQxYjY4LCAweGY4ZGVkYWViLCAweDg5ZjdmYWZiKSwgKi8KKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHFsb2dpY19pZHMpOwogCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcWxvZ2ljX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC00MDIsNyArNDIwLDkgQEAKIAkubmFtZQkJPSAicWxvZ2ljX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gcWxvZ2ljX2F0dGFjaCwKKwkuZXZlbnQJCT0gcWxvZ2ljX2V2ZW50LAogCS5kZXRhY2gJCT0gcWxvZ2ljX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBxbG9naWNfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9xbG9naWNfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCmluZGV4IDE2NjdkYTkuLmI0YjNhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYwpAQCAtOTc5LDEwICs5NzksNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmU1lNNTNDNTAwX2V2ZW50OwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0gQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC05OTksMTMgKzk5NSwyMyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTWU01M0M1MDAgUENNQ0lBIFNDU0kgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBzeW01M2M1MDBfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJBU0lDUyBieSBOZXcgTWVkaWEgQ29ycG9yYXRpb24iLCAiU0NTSSBTeW01M0M1MDAiLCAweDIzYzc4YTlkLCAweDAwOTllN2Y3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmV3IE1lZGlhIENvcnBvcmF0aW9uIiwgIlNDU0kgQnVzIFRvYXN0ZXIgU3ltNTNDNTAwIiwgMHgwODVhODUwYiwgMHg0NTQzMmViOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMigiU0NTSTkwMDAiLCAweDIxNjQ4ZjQ0KSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHN5bTUzYzUwMF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc3ltNTNjNTAwX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInN5bTUzYzUwMF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IFNZTTUzQzUwMF9hdHRhY2gsCisJLmV2ZW50CQk9IFNZTTUzQzUwMF9ldmVudCwKIAkuZGV0YWNoCQk9IFNZTTUzQzUwMF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gc3ltNTNjNTAwX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IGNhYjUzNTguLjdhOTFjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC02MjEsNyArNjIxLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgKnNncDsKIAotCUJVR19PTihpbmRleCA+IFNHX01FTVBPT0xfTlIpOworCUJVR19PTihpbmRleCA+PSBTR19NRU1QT09MX05SKTsKIAogCXNncCA9IHNjc2lfc2dfcG9vbHMgKyBpbmRleDsKIAltZW1wb29sX2ZyZWUoc2dsLCBzZ3AtPnBvb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKaW5kZXggZmViOGU3My4uZDI3ZmI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCkBAIC0xNDk3LDIzICsxNDk3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KLS8qCi0gKiByZWdpc3Rlcl9zZXJpYWwgYW5kIHVucmVnaXN0ZXJfc2VyaWFsIGFsbG93cyBmb3Igc2VyaWFsIHBvcnRzIHRvIGJlCi0gKiBjb25maWd1cmVkIGF0IHJ1bi10aW1lLCB0byBzdXBwb3J0IFBDTUNJQSBtb2RlbXMuCi0gKi8KLS8qIFNQQVJDOiBVbnVzZWQgYXQgdGhpcyB0aW1lLCBqdXN0IGhlcmUgdG8gbWFrZSB0aGluZ3MgbGluay4gKi8KLWludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgdW5yZWdpc3Rlcl9zZXJpYWwoaW50IGxpbmUpCi17Ci0JcmV0dXJuOwotfQotCQogbW9kdWxlX2luaXQocnM2ODMyOF9pbml0KTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggZDhiOWQyYi4uN2U4ZmM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtNzcsMjMgKzc3LDkgQEAKICAqLwogI2RlZmluZSBpc19yZWFsX2ludGVycnVwdChpcnEpCSgoaXJxKSAhPSAwKQogCi0vKgotICogVGhpcyBjb252ZXJ0cyBmcm9tIG91ciBuZXcgQ09ORklHXyBzeW1ib2xzIHRvIHRoZSBzeW1ib2xzCi0gKiB0aGF0IGFzbS9zZXJpYWwuaCBleHBlY3RzLiAgWW91IF9ORUVEXyB0byBjb21tZW50IG91dCB0aGUKLSAqIGxpbnV4L2NvbmZpZy5oIGluY2x1ZGUgY29udGFpbmVkIGluc2lkZSBhc20vc2VyaWFsLmggZm9yCi0gKiB0aGlzIHRvIHdvcmsuCi0gKi8KLSN1bmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSN1bmRlZiBDT05GSUdfU0VSSUFMX0RFVEVDVF9JUlEKLSN1bmRlZiBDT05GSUdfU0VSSUFMX01VTFRJUE9SVAotI3VuZGVmIENPTkZJR19IVUI2Ci0KICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUQogI2RlZmluZSBDT05GSUdfU0VSSUFMX0RFVEVDVF9JUlEgMQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX01VTFRJUE9SVAotI2RlZmluZSBDT05GSUdfU0VSSUFMX01VTFRJUE9SVCAxCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUwogI2RlZmluZSBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMgMQogI2VuZGlmCkBAIC0xMTksNyArMTA1LDcgQEAKIAlTRVJJQUxfUE9SVF9ERk5TIC8qIGRlZmluZWQgaW4gYXNtL3NlcmlhbC5oICovCiB9OwogCi0jZGVmaW5lIFVBUlRfTlIJKEFSUkFZX1NJWkUob2xkX3NlcmlhbF9wb3J0KSArIENPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUykKKyNkZWZpbmUgVUFSVF9OUglDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFMKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9SU0EKIApAQCAtMTAwNywyMSArOTkzLDI0IEBACiAJdXAtPnBvcnQuaXJxID0gKGlycSA+IDApID8gaXJxIDogMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF90eChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCit7CisJaWYgKHAtPmllciAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJcC0+aWVyICY9IH5VQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KHAsIFVBUlRfSUVSLCBwLT5pZXIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7CiAKLQlpZiAodXAtPmllciAmIFVBUlRfSUVSX1RIUkkpIHsKLQkJdXAtPmllciAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwotCX0KKwlfX3N0b3BfdHgodXApOwogCiAJLyoKLQkgKiBXZSBvbmx5IGRvIHRoaXMgZnJvbSB1YXJ0X3N0b3AgLSBpZiB3ZSBydW4gb3V0IG9mCi0JICogY2hhcmFjdGVycyB0byBzZW5kLCB3ZSBkb24ndCB3YW50IHRvIHByZXZlbnQgdGhlCi0JICogRklGTyBmcm9tIGVtcHR5aW5nLgorCSAqIFdlIHJlYWxseSB3YW50IHRvIHN0b3AgdGhlIHRyYW5zbWl0dGVyIGZyb20gc2VuZGluZy4KIAkgKi8KLQlpZiAodXAtPnBvcnQudHlwZSA9PSBQT1JUXzE2Qzk1MCAmJiB0dHlfc3RvcCkgeworCWlmICh1cC0+cG9ydC50eXBlID09IFBPUlRfMTZDOTUwKSB7CiAJCXVwLT5hY3IgfD0gVUFSVF9BQ1JfVFhESVM7CiAJCXNlcmlhbF9pY3Jfd3JpdGUodXAsIFVBUlRfQUNSLCB1cC0+YWNyKTsKIAl9CkBAIC0xMDQ1LDEwICsxMDM0LDExIEBACiAJCQkJdHJhbnNtaXRfY2hhcnModXApOwogCQl9CiAJfQorCiAJLyoKLQkgKiBXZSBvbmx5IGRvIHRoaXMgZnJvbSB1YXJ0X3N0YXJ0CisJICogUmUtZW5hYmxlIHRoZSB0cmFuc21pdHRlciBpZiB3ZSBkaXNhYmxlZCBpdC4KIAkgKi8KLQlpZiAodHR5X3N0YXJ0ICYmIHVwLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkM5NTApIHsKKwlpZiAodXAtPnBvcnQudHlwZSA9PSBQT1JUXzE2Qzk1MCAmJiB1cC0+YWNyICYgVUFSVF9BQ1JfVFhESVMpIHsKIAkJdXAtPmFjciAmPSB+VUFSVF9BQ1JfVFhESVM7CiAJCXNlcmlhbF9pY3Jfd3JpdGUodXAsIFVBUlRfQUNSLCB1cC0+YWNyKTsKIAl9CkBAIC0xMTY5LDcgKzExNTksNyBAQAogCQlyZXR1cm47CiAJfQogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZ1cC0+cG9ydCkpIHsKLQkJc2VyaWFsODI1MF9zdG9wX3R4KCZ1cC0+cG9ydCwgMCk7CisJCV9fc3RvcF90eCh1cCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExODgsNyArMTE3OCw3IEBACiAJREVCVUdfSU5UUigiVEhSRS4uLiIpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJc2VyaWFsODI1MF9zdG9wX3R4KCZ1cC0+cG9ydCwgMCk7CisJCV9fc3RvcF90eCh1cCk7CiB9CiAKIHN0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQpAQCAtMTM5MCwxMyArMTM4MCwxMCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWw4MjUwX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCXN0YXR1cyA9IHNlcmlhbF9pbih1cCwgVUFSVF9NU1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKQEAgLTIwNzQsNyArMjA2MSw4IEBACiAJCXVwLT5wb3J0Lm9wcyA9ICZzZXJpYWw4MjUwX3BvcHM7CiAJfQogCi0JZm9yIChpID0gMCwgdXAgPSBzZXJpYWw4MjUwX3BvcnRzOyBpIDwgQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpOworCWZvciAoaSA9IDAsIHVwID0gc2VyaWFsODI1MF9wb3J0czsKKwkgICAgIGkgPCBBUlJBWV9TSVpFKG9sZF9zZXJpYWxfcG9ydCkgJiYgaSA8IFVBUlRfTlI7CiAJICAgICBpKyssIHVwKyspIHsKIAkJdXAtPnBvcnQuaW9iYXNlICAgPSBvbGRfc2VyaWFsX3BvcnRbaV0ucG9ydDsKIAkJdXAtPnBvcnQuaXJxICAgICAgPSBpcnFfY2Fub25pY2FsaXplKG9sZF9zZXJpYWxfcG9ydFtpXS5pcnEpOwpAQCAtMjMyMywxMCArMjMxMSwxMSBAQAogewogCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CisJaW50IHJldCwgaTsKIAogCW1lbXNldCgmcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCB1YXJ0X3BvcnQpKTsKIAotCWZvciAoOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKykgeworCWZvciAoaSA9IDA7IHAgJiYgcC0+ZmxhZ3MgIT0gMDsgcCsrLCBpKyspIHsKIAkJcG9ydC5pb2Jhc2UJPSBwLT5pb2Jhc2U7CiAJCXBvcnQubWVtYmFzZQk9IHAtPm1lbWJhc2U7CiAJCXBvcnQuaXJxCT0gcC0+aXJxOwpAQCAtMjMzNSwxMCArMjMyNCwxNiBAQAogCQlwb3J0LmlvdHlwZQk9IHAtPmlvdHlwZTsKIAkJcG9ydC5mbGFncwk9IHAtPmZsYWdzOwogCQlwb3J0Lm1hcGJhc2UJPSBwLT5tYXBiYXNlOworCQlwb3J0Lmh1YjYJPSBwLT5odWI2OwogCQlwb3J0LmRldgk9IGRldjsKIAkJaWYgKHNoYXJlX2lycXMpCiAJCQlwb3J0LmZsYWdzIHw9IFVQRl9TSEFSRV9JUlE7Ci0JCXNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7CisJCXJldCA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byByZWdpc3RlciBwb3J0IGF0IGluZGV4ICVkICIKKwkJCQkiKElPJWx4IE1FTSVseCBJUlElZCk6ICVkXG4iLCBpLAorCQkJCXAtPmlvYmFzZSwgcC0+bWFwYmFzZSwgcC0+aXJxLCByZXQpOworCQl9CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNjZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYzI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNjZW50LmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC84MjUwX2FjY2VudC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgRGF0YSB0YWtlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNkZWZpbmUgUE9SVChfYmFzZSxfaXJxKQkJCQlcCisJewkJCQkJCVwKKwkJLmlvYmFzZQkJPSBfYmFzZSwJCVwKKwkJLmlycQkJPSBfaXJxLAkJCVwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAkJXAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwJCVwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAlcCisJfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGFjY2VudF9kYXRhW10gPSB7CisJUE9SVCgweDMzMCwgNCksCisJUE9SVCgweDMzOCwgNCksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYWNjZW50X2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMiwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gYWNjZW50X2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjY2VudF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWNjZW50X2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KGFjY2VudF9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjgyNTAgc2VyaWFsIHByb2JlIG1vZHVsZSBmb3IgQWNjZW50IEFzeW5jIGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWM5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgRGF0YSB0YWtlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNkZWZpbmUgUE9SVChfYmFzZSxfaXJxKQkJCQlcCisJewkJCQkJCVwKKwkJLmlvYmFzZQkJPSBfYmFzZSwJCVwKKwkJLmlycQkJPSBfaXJxLAkJCVwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAkJXAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwJCVwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAlcCisJfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGJvY2FfZGF0YVtdID0geworCVBPUlQoMHgxMDAsIDEyKSwKKwlQT1JUKDB4MTA4LCAxMiksCisJUE9SVCgweDExMCwgMTIpLAorCVBPUlQoMHgxMTgsIDEyKSwKKwlQT1JUKDB4MTIwLCAxMiksCisJUE9SVCgweDEyOCwgMTIpLAorCVBPUlQoMHgxMzAsIDEyKSwKKwlQT1JUKDB4MTM4LCAxMiksCisJUE9SVCgweDE0MCwgMTIpLAorCVBPUlQoMHgxNDgsIDEyKSwKKwlQT1JUKDB4MTUwLCAxMiksCisJUE9SVCgweDE1OCwgMTIpLAorCVBPUlQoMHgxNjAsIDEyKSwKKwlQT1JUKDB4MTY4LCAxMiksCisJUE9SVCgweDE3MCwgMTIpLAorCVBPUlQoMHgxNzgsIDEyKSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBib2NhX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMywKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gYm9jYV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBib2NhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZib2NhX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KGJvY2FfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MjUwIHNlcmlhbCBwcm9iZSBtb2R1bGUgZm9yIEJvY2EgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI0ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgRGF0YSB0YWtlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNkZWZpbmUgUE9SVChfYmFzZSxfaXJxKQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pb2Jhc2UJCT0gX2Jhc2UsCQkJCVwKKwkJLmlycQkJPSBfaXJxLAkJCQkJXAorCQkudWFydGNsawk9IDE4NDMyMDAsCQkJCVwKKwkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCQkJCVwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZPVVJQT1JULAlcCisJfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGZvdXJwb3J0X2RhdGFbXSA9IHsKKwlQT1JUKDB4MWEwLCA5KSwKKwlQT1JUKDB4MWE4LCA5KSwKKwlQT1JUKDB4MWIwLCA5KSwKKwlQT1JUKDB4MWI4LCA5KSwKKwlQT1JUKDB4MmEwLCA1KSwKKwlQT1JUKDB4MmE4LCA1KSwKKwlQT1JUKDB4MmIwLCA1KSwKKwlQT1JUKDB4MmI4LCA1KSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmb3VycG9ydF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDEsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IGZvdXJwb3J0X2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZvdXJwb3J0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZmb3VycG9ydF9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChmb3VycG9ydF9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjgyNTAgc2VyaWFsIHByb2JlIG1vZHVsZSBmb3IgQVNUIEZvdXJwb3J0IGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjM5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgRGF0YSB0YWtlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNkZWZpbmUgSFVCNihjYXJkLHBvcnQpCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pb2Jhc2UJCT0gMHgzMDIsCQkJCVwKKwkJLmlycQkJPSAzLAkJCQkJXAorCQkudWFydGNsawk9IDE4NDMyMDAsCQkJCVwKKwkJLmlvdHlwZQkJPSBVUElPX0hVQjYsCQkJCVwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAkJCVwKKwkJLmh1YjYJCT0gKGNhcmQpIDw8IDYgfCAocG9ydCkgPDwgMyB8IDEsCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgaHViNl9kYXRhW10gPSB7CisJSFVCNigwLDApLAorCUhVQjYoMCwxKSwKKwlIVUI2KDAsMiksCisJSFVCNigwLDMpLAorCUhVQjYoMCw0KSwKKwlIVUI2KDAsNSksCisJSFVCNigxLDApLAorCUhVQjYoMSwxKSwKKwlIVUI2KDEsMiksCisJSFVCNigxLDMpLAorCUhVQjYoMSw0KSwKKwlIVUI2KDEsNSksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaHViNl9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDQsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IGh1YjZfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaHViNl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaHViNl9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChodWI2X2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiODI1MCBzZXJpYWwgcHJvYmUgbW9kdWxlIGZvciBIdWI2IGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX21jYS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM0MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc2VyaWFsLzgyNTBfbWNhLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFJ1c3NlbGwgS2luZy4KKyAqICBEYXRhIHRha2VuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9zZXJpYWwuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworLyoKKyAqIEZJWE1FOiBTaG91bGQgd2UgYmUgZG9pbmcgQVVUT19JUlEgaGVyZT8KKyAqLworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRCisjZGVmaW5lIE1DQV9GTEFHUwlVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfQVVUT19JUlEKKyNlbHNlCisjZGVmaW5lIE1DQV9GTEFHUwlVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QKKyNlbmRpZgorCisjZGVmaW5lIFBPUlQoX2Jhc2UsX2lycSkJCQlcCisJewkJCQkJXAorCQkuaW9iYXNlCQk9IF9iYXNlLAlcCisJCS5pcnEJCT0gX2lycSwJCVwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAlcCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAlcCisJCS5mbGFncwkJPSBNQ0FfRkxBR1MsCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgbWNhX2RhdGFbXSA9IHsKKwlQT1JUKDB4MzIyMCwgMyksCisJUE9SVCgweDMyMjgsIDMpLAorCVBPUlQoMHg0MjIwLCAzKSwKKwlQT1JUKDB4NDIyOCwgMyksCisJUE9SVCgweDUyMjAsIDMpLAorCVBPUlQoMHg1MjI4LCAzKSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtY2FfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSA1LAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBtY2FfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWNhX2luaXQodm9pZCkKK3sKKwlpZiAoIU1DQV9idXMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1jYV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChtY2FfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MjUwIHNlcmlhbCBwcm9iZSBtb2R1bGUgZm9yIE1DQSBwb3J0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKaW5kZXggZGU1NGJkYy4uMzU2ZjU1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCkBAIC0zODksNiArMzg5LDkgQEAKICAqICAgICAtIDEweCBjYXJkcyBoYXZlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIElPIGFuZC9vciBtZW1vcnkgc3BhY2U7CiAgKiAgICAgLSAyMHggY2FyZHMgaGF2ZSBjb250cm9sIHJlZ2lzdGVycyBpbiBzdGFuZGFyZCBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4KICAqCisgKiBUaGVyZSBhcmUgYWxzbyBRdWFydGV0IFNlcmlhbCBjYXJkcyB3aGljaCB1c2UgT3hmb3JkIFNlbWljb25kdWN0b3IKKyAqIDE2OTU0IHF1YWQgVUFSVCBQQ0kgY2hpcCBjbG9ja2VkIGJ5IDE4LjQzMiBNSHogcXVhcnR6LgorICoKICAqIE5vdGU6IHNvbWUgU0lJRyBjYXJkcyBhcmUgcHJvYmVkIGJ5IHRoZSBwYXJwb3J0X3NlcmlhbCBvYmplY3QuCiAgKi8KIApAQCAtMTAyNiw2ICsxMDI5LDggQEAKIAlwYm5fYjBfMl85MjE2MDAsCiAJcGJuX2IwXzRfOTIxNjAwLAogCisJcGJuX2IwXzRfMTE1MjAwMCwKKwogCXBibl9iMF9idF8xXzExNTIwMCwKIAlwYm5fYjBfYnRfMl8xMTUyMDAsCiAJcGJuX2IwX2J0XzhfMTE1MjAwLApAQCAtMTE1OCw2ICsxMTYzLDEyIEBACiAJCS5iYXNlX2JhdWQJPSA5MjE2MDAsCiAJCS51YXJ0X29mZnNldAk9IDgsCiAJfSwKKwlbcGJuX2IwXzRfMTE1MjAwMF0gPSB7CisJCS5mbGFncwkJPSBGTF9CQVNFMCwKKwkJLm51bV9wb3J0cwk9IDQsCisJCS5iYXNlX2JhdWQJPSAxMTUyMDAwLAorCQkudWFydF9vZmZzZXQJPSA4LAorCX0sCiAKIAlbcGJuX2IwX2J0XzFfMTE1MjAwXSA9IHsKIAkJLmZsYWdzCQk9IEZMX0JBU0UwfEZMX0JBU0VfQkFSUywKQEAgLTE3NTUsMzMgKzE3NjYsMzAgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY2lzZXJpYWxfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBwY2lfc2VyaWFsX3F1aXJrICpxdWlyazsKKwlpbnQgaTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCi0JaWYgKHByaXYpIHsKLQkJc3RydWN0IHBjaV9zZXJpYWxfcXVpcmsgKnF1aXJrOwotCQlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnI7IGkrKykKKwkJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQocHJpdi0+bGluZVtpXSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPm5yOyBpKyspCi0JCQlzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydChwcml2LT5saW5lW2ldKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9CQVJfUkVTT1VSQ0VTOyBpKyspIHsKLQkJCWlmIChwcml2LT5yZW1hcHBlZF9iYXJbaV0pCi0JCQkJaW91bm1hcChwcml2LT5yZW1hcHBlZF9iYXJbaV0pOwotCQkJcHJpdi0+cmVtYXBwZWRfYmFyW2ldID0gTlVMTDsKLQkJfQotCi0JCS8qCi0JCSAqIEZpbmQgdGhlIGV4aXQgcXVpcmtzLgotCQkgKi8KLQkJcXVpcmsgPSBmaW5kX3F1aXJrKGRldik7Ci0JCWlmIChxdWlyay0+ZXhpdCkKLQkJCXF1aXJrLT5leGl0KGRldik7Ci0KLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0KLQkJa2ZyZWUocHJpdik7CisJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fQkFSX1JFU09VUkNFUzsgaSsrKSB7CisJCWlmIChwcml2LT5yZW1hcHBlZF9iYXJbaV0pCisJCQlpb3VubWFwKHByaXYtPnJlbWFwcGVkX2JhcltpXSk7CisJCXByaXYtPnJlbWFwcGVkX2JhcltpXSA9IE5VTEw7CiAJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBleGl0IHF1aXJrcy4KKwkgKi8KKwlxdWlyayA9IGZpbmRfcXVpcmsoZGV2KTsKKwlpZiAocXVpcmstPmV4aXQpCisJCXF1aXJrLT5leGl0KGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKworCWtmcmVlKHByaXYpOwogfQogCiBzdGF0aWMgaW50IHBjaXNlcmlhbF9zdXNwZW5kX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0xOTc4LDYgKzE5ODYsOSBAQAogCQlQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgUENJX1NVQkRFVklDRV9JRF9TUEVDSUFMSVhfU1BFRUQ0LCAwLCAwLAogCQlwYm5fYjBfNF85MjE2MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NCwKKwkJUENJX1NVQlZFTkRPUl9JRF9TSUlHLCBQQ0lfU1VCREVWSUNFX0lEX1NJSUdfUVVBUlRFVF9TRVJJQUwsIDAsIDAsCisJCXBibl9iMF80XzExNTIwMDAgfSwKKwl7CVBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IwXzRfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX09YU0VNSSwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCAyNWZjZWYyLi45NzAzNGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTg2LDE0ICs4NiwxNCBAQAogCSAgbmFtZXNwYWNlLCBzYXkgWSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFNFUklBTF84MjUwX05SX1VBUlRTCi0JaW50ICJNYXhpbXVtIG51bWJlciBvZiBub24tbGVnYWN5IDgyNTAvMTY1NTAgc2VyaWFsIHBvcnRzIgorCWludCAiTWF4aW11bSBudW1iZXIgb2YgODI1MC8xNjU1MCBzZXJpYWwgcG9ydHMiCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MAogCWRlZmF1bHQgIjQiCi0JLS0taGVscC0tLQotCSAgU2V0IHRoaXMgdG8gdGhlIG51bWJlciBvZiBub24tbGVnYWN5IHNlcmlhbCBwb3J0cyB5b3Ugd2FudAotCSAgdGhlIGRyaXZlciB0byBzdXBwb3J0LiAgVGhpcyBpbmNsdWRlcyBhbnkgcG9ydHMgZGlzY292ZXJlZAotCSAgdmlhIEFDUEkgb3IgUENJIGVudW1lcmF0aW9uIGFuZCBhbnkgcG9ydHMgdGhhdCBtYXkgYmUgYWRkZWQKLQkgIGF0IHJ1bi10aW1lIHZpYSBob3QtcGx1Zy4KKwloZWxwCisJICBTZXQgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHNlcmlhbCBwb3J0cyB5b3Ugd2FudCB0aGUgZHJpdmVyCisJICB0byBzdXBwb3J0LiAgVGhpcyBpbmNsdWRlcyBhbnkgcG9ydHMgZGlzY292ZXJlZCB2aWEgQUNQSSBvcgorCSAgUENJIGVudW1lcmF0aW9uIGFuZCBhbnkgcG9ydHMgdGhhdCBtYXkgYmUgYWRkZWQgYXQgcnVuLXRpbWUKKwkgIHZpYSBob3QtcGx1Zywgb3IgYW55IElTQSBtdWx0aS1wb3J0IHNlcmlhbCBjYXJkcy4KIAogY29uZmlnIFNFUklBTF84MjUwX0VYVEVOREVECiAJYm9vbCAiRXh0ZW5kZWQgODI1MC8xNjU1MCBzZXJpYWwgZHJpdmVyIG9wdGlvbnMiCkBAIC0xNDEsMzEgKzE0MSw3NCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgU0VSSUFMXzgyNTBfTVVMVElQT1JUCi0JYm9vbCAiU3VwcG9ydCBzcGVjaWFsIG11bHRpcG9ydCBib2FyZHMiCi0JZGVwZW5kcyBvbiBTRVJJQUxfODI1MF9FWFRFTkRFRAotCWhlbHAKLQkgIFNvbWUgbXVsdGlwb3J0IHNlcmlhbCBwb3J0cyBoYXZlIHNwZWNpYWwgcG9ydHMgd2hpY2ggYXJlIHVzZWQgdG8KLQkgIHNpZ25hbCB3aGVuIHRoZXJlIGFyZSBhbnkgc2VyaWFsIHBvcnRzIG9uIHRoZSBib2FyZCB3aGljaCBuZWVkCi0JICBzZXJ2aWNpbmcuIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBzZXJpYWwgZHJpdmVyIHRvIHRha2UgYWR2YW50YWdlCi0JICBvZiB0aG9zZSBzcGVjaWFsIEkvTyBwb3J0cy4KLQogY29uZmlnIFNFUklBTF84MjUwX1JTQQogCWJvb2wgIlN1cHBvcnQgUlNBIHNlcmlhbCBwb3J0cyIKIAlkZXBlbmRzIG9uIFNFUklBTF84MjUwX0VYVEVOREVECiAJaGVscAogCSAgOjo6IFRvIGJlIHdyaXR0ZW4gOjo6CiAKLWNvbW1lbnQgIk5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCisjCisjIE11bHRpLXBvcnQgc2VyaWFsIGNhcmRzCisjCisKK2NvbmZpZyBTRVJJQUxfODI1MF9GT1VSUE9SVAorCXRyaXN0YXRlICJTdXBwb3J0IEZvdXJwb3J0IGNhcmRzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQVNUIEZvdXJQb3J0IHNlcmlhbCBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9mb3VycG9ydC4KKworY29uZmlnIFNFUklBTF84MjUwX0FDQ0VOVAorCXRyaXN0YXRlICJTdXBwb3J0IEFjY2VudCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFjY2VudCBBc3luYyBzZXJpYWwgYm9hcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfYWNjZW50LgorCisKK2NvbmZpZyBTRVJJQUxfODI1MF9CT0NBCisJdHJpc3RhdGUgIlN1cHBvcnQgQm9jYSBjYXJkcyIKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgQm9jYSBzZXJpYWwgYm9hcmQuICBQbGVhc2UgcmVhZCB0aGUgQm9jYQorCSAgbWluaS1IT1dUTywgYXZhaWFsYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2JvY2EuCisKKworY29uZmlnIFNFUklBTF84MjUwX0hVQjYKKwl0cmlzdGF0ZSAiU3VwcG9ydCBIdWI2IGNhcmRzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBIVUI2IHNlcmlhbCBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9odWI2LgorCitjb25maWcgU0VSSUFMXzgyNTBfTUNBCisJdHJpc3RhdGUgIlN1cHBvcnQgODI1MC10eXBlIHBvcnRzIG9uIE1DQSBidXNlcyIKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgTUNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1DQSBzZXJpYWwgcG9ydHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfbWNhLgogCiBjb25maWcgU0VSSUFMXzgyNTBfQUNPUk4KIAl0cmlzdGF0ZSAiQWNvcm4gZXhwYW5zaW9uIGNhcmQgc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX0FDT1JOICYmIFNFUklBTF84MjUwCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIFNFUklBTF84MjUwCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYW4gQXRvbXdpZGUgU2VyaWFsIGNhcmQgb3IgU2VyaWFsIFBvcnQgY2FyZCBmb3IgYW4gQWNvcm4KIAkgIHN5c3RlbSwgc2F5IFkgdG8gdGhpcyBvcHRpb24uICBUaGUgZHJpdmVyIGNhbiBoYW5kbGUgMSwgMiwgb3IgMyBwb3J0CiAJICBjYXJkcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbW1lbnQgIk5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCisKIGNvbmZpZyBTRVJJQUxfQU1CQV9QTDAxMAogCXRyaXN0YXRlICJBUk0gQU1CQSBQTDAxMCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNX0FNQkEKQEAgLTI2MywxMyArMzA2LDYgQEAKIAkgIHlvdXIgYm9vdCBsb2FkZXIgYWJvdXQgaG93IHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUga2VybmVsIGF0CiAJICBib290IHRpbWUuKQogCi1jb25maWcgU0VSSUFMX0JBU1RfU0lPCi0JYm9vbCAiU3VwcG9ydCBmb3IgQkFTVCBTdXBlcklPIHNlcmlhbCBwb3J0cyIKLQlkZXBlbmRzIG9uIEFSQ0hfQkFTVCAmJiBTRVJJQUxfODI1MD15Ci0JaGVscAotCSAgU3VwcG9ydCBmb3IgcmVnaXN0ZXJpbiB0aGUgU3VwZXJJTyBjaGlwIG9uIEJBU1QgYm9hcmQgd2l0aAotCSAgdGhlIDgyNTAvMTY1NTAgdWFydCBjb2RlLgotCiBjb25maWcgU0VSSUFMX0RaCiAJYm9vbCAiREVDc3RhdGlvbiBEWiBzZXJpYWwgZHJpdmVyIgogCWRlcGVuZHMgb24gTUFDSF9ERUNTVEFUSU9OICYmIE1JUFMzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCA4ZjFjZGRlLi4xMWM3ZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsMTEgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9DUykgKz0gc2VyaWFsX2NzLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9BQ09STikgKz0gODI1MF9hY29ybi5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSkgKz0gODI1MF9lYXJseS5vCitvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfRk9VUlBPUlQpICs9IDgyNTBfZm91cnBvcnQubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0FDQ0VOVCkgKz0gODI1MF9hY2NlbnQubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0JPQ0EpICs9IDgyNTBfYm9jYS5vCitvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfSFVCNikgKz0gODI1MF9odWI2Lm8KK29iai0kKENPTkZJR19TRVJJQUxfODI1MF9NQ0EpICs9IDgyNTBfbWNhLm8KIG9iai0kKENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMCkgKz0gYW1iYS1wbDAxMC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTEpICs9IGFtYmEtcGwwMTEubwogb2JqLSQoQ09ORklHX1NFUklBTF9DTFBTNzExWCkgKz0gY2xwczcxMXgubwpAQCAtMzksNyArNDQsNiBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9BVTFYMDApICs9IGF1MXgwMF91YXJ0Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfRFopICs9IGR6Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0hfU0NJKSArPSBzaC1zY2kubwotb2JqLSQoQ09ORklHX1NFUklBTF9CQVNUX1NJTykgKz0gYmFzdF9zaW8ubwogb2JqLSQoQ09ORklHX1NFUklBTF9TR0lfTDFfQ09OU09MRSkgKz0gc25fY29uc29sZS5vCiBvYmotJChDT05GSUdfU0VSSUFMX0NQTSkgKz0gY3BtX3VhcnQvCiBvYmotJChDT05GSUdfU0VSSUFMX0lNWCkgKz0gaW14Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2F1MXgwMF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9hdTF4MDBfdWFydC5jCmluZGV4IDU0MDBkYzIuLjYxMDRhZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F1MXgwMF91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYwpAQCAtNTU2LDEzICs1NTYsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAlzdGF0dXMgPSBzZXJpYWxfaW4odXAsIFVBUlRfTVNSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlyZXQgPSAwOwogCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9iYXN0X3Npby5jIGIvZHJpdmVycy9zZXJpYWwvYmFzdF9zaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0OGZhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NlcmlhbC9iYXN0X3Npby5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogbGludXgvZHJpdmVycy9zZXJpYWwvYmFzdF9zaW8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKgkyMy1TZXAtMjAwNCAgQkpEICBBZGRlZCBjb3B5cmlnaHQgaGVhZGVyCi0gKgkyMy1TZXAtMjAwNCAgQkpEICBBZGRlZCBzZXJpYWwgcG9ydCByZW1vdmUgY29kZQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LW1hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtaXJxLmg+Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNlcmlhbF9iYXN0X3JlZ2lzdGVyKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJpYWxfcmVxOwotCi0Jc2VyaWFsX3JlcS5mbGFncyAgICAgID0gVVBGX0FVVE9QUk9CRSB8IFVQRl9TSEFSRV9JUlE7Ci0Jc2VyaWFsX3JlcS5iYXVkX2Jhc2UgID0gQkFTRV9CQVVEOwotCXNlcmlhbF9yZXEuaXJxICAgICAgICA9IGlycTsKLQlzZXJpYWxfcmVxLmlvX3R5cGUgICAgPSBVUElPX01FTTsKLQlzZXJpYWxfcmVxLmlvbWFwX2Jhc2UgPSBwb3J0OwotCXNlcmlhbF9yZXEuaW9tZW1fYmFzZSA9IGlvcmVtYXAocG9ydCwgMHgxMCk7Ci0Jc2VyaWFsX3JlcS5pb21lbV9yZWdfc2hpZnQgPSAwOwotCi0JcmV0dXJuIHJlZ2lzdGVyX3NlcmlhbCgmc2VyaWFsX3JlcSk7Ci19Ci0KLSNkZWZpbmUgU0VSSUFMX0JBU0UgKFMzQzI0MTBfQ1MyICsgQkFTVF9QQV9TVVBFUklPKQotCi1zdGF0aWMgaW50IHBvcnRbMl0gPSB7IC0xLCAtMSB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzZXJpYWxfYmFzdF9pbml0KHZvaWQpCi17Ci0JaWYgKG1hY2hpbmVfaXNfYmFzdCgpKSB7Ci0JCXBvcnRbMF0gPSBzZXJpYWxfYmFzdF9yZWdpc3RlcihTRVJJQUxfQkFTRSArIDB4MmY4LCBJUlFfUENTRVJJQUwxKTsKLQkJcG9ydFsxXSA9IHNlcmlhbF9iYXN0X3JlZ2lzdGVyKFNFUklBTF9CQVNFICsgMHgzZjgsIElSUV9QQ1NFUklBTDIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2VyaWFsX2Jhc3RfZXhpdCh2b2lkKQotewotCWlmIChwb3J0WzBdICE9IC0xKQotCQl1bnJlZ2lzdGVyX3NlcmlhbChwb3J0WzBdKTsKLQlpZiAocG9ydFsxXSAhPSAtMSkKLQkJdW5yZWdpc3Rlcl9zZXJpYWwocG9ydFsxXSk7Ci19Ci0KLQotbW9kdWxlX2luaXQoc2VyaWFsX2Jhc3RfaW5pdCk7Ci1tb2R1bGVfZXhpdChzZXJpYWxfYmFzdF9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCBiZW5Ac2ltdGVjLmNvLnVrIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJBU1QgT25ib2FyZCBTZXJpYWwgc2V0dXAiKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKaW5kZXggZGUyNmNmNy4uNzkxMTkxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYwpAQCAtOTQsMTIgKzk0LDQyIEBACiAJCSgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX2lvcG9ydC5pb3BfcGFvZHIgJj0gfmlvYml0czsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJLyogRW5hYmxlIFNNQzEgdHJhbnNjZWl2ZXJzICovCisJeworCQl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxID0gaW9yZW1hcChCQ1NSMSwgNCk7CisJCXVpbnQgdG1wOworCisJCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCQl0bXAgJj0gfkJDU1IxX1JTMjMyRU5fMTsKKwkJb3V0X2JlMzIoYmNzcjEsIHRtcCk7CisJCWlvdW5tYXAoYmNzcjEpOworCX0KKyNlbmRpZgorCiAJcGluZm8tPmJyZyA9IDE7CiB9CiAKIHZvaWQgc21jMl9saW5laWYoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKQogewotCS8qIFhYWCBTTUMyOiBpbnNlcnQgcG9ydCBjb25maWd1cmF0aW9uIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gY3BtcDsKKwl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxOworCXVpbnQgdG1wOworCisJY3AtPmNwX3BlcGFyIHw9IDB4MDAwMDBjMDA7CisJY3AtPmNwX3BlZGlyICY9IH4weDAwMDAwYzAwOworCWNwLT5jcF9wZXNvICY9IH4weDAwMDAwNDAwOworCWNwLT5jcF9wZXNvIHw9IDB4MDAwMDA4MDA7CisKKwkvKiBFbmFibGUgU01DMiB0cmFuc2NlaXZlcnMgKi8KKwliY3NyMSA9IGlvcmVtYXAoQkNTUjEsIDQpOworCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCXRtcCAmPSB+QkNTUjFfUlMyMzJFTl8yOworCW91dF9iZTMyKGJjc3IxLCB0bXApOworCWlvdW5tYXAoYmNzcjEpOworI2VuZGlmCisKIAlwaW5mby0+YnJnID0gMjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCmluZGV4IDNkYTU0OTQuLjIzYjg4NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKQEAgLTQyNiw4ICs0MjYsNiBAQAogc3RhdGljIGNoYXIgKnNlcmlhbF92ZXJzaW9uID0gIiRSZXZpc2lvbjogMS4yNSAkIjsKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2ljb20uYyBiL2RyaXZlcnMvc2VyaWFsL2ljb20uYwppbmRleCA1NDZhMGJjLi5jMTEyYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjZGVmaW5lIFNFUklBTF9ET19SRVNUQVJUCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCmluZGV4IDNlYTQ2YzAuLmVhNWJmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCkBAIC01MTgsMjcgKzUxOCwyOCBAQAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBpcDIyemlsb2dfcmVhZF9jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB6aWxvZ19jaGFubmVsICpjaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCiAJY2hhbm5lbCA9IFpJTE9HX0NIQU5ORUxfRlJPTV9QT1JUKHBvcnQpOwogCXN0YXR1cyA9IHJlYWRiKCZjaGFubmVsLT5jb250cm9sKTsKIAlaU0RFTEFZKCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXAyMnppbG9nX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCXN0YXR1cyA9IGlwMjJ6aWxvZ19yZWFkX2NoYW5uZWxfc3RhdHVzKHBvcnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCiAJaWYgKHN0YXR1cyAmIFR4X0JVRl9FTVApCiAJCXJldCA9IFRJT0NTRVJfVEVNVDsKIAllbHNlCkBAIC01NDcsNyArNTQ4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KKy8qIFRoZSBwb3J0IGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBpcDIyemlsb2dfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtLmggYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtLmgKaW5kZXggNzc3ODI5Zi4uNWJmM2M0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc20uaApAQCAtMjgsNyArMjgsNiBAQAogI2RlZmluZSBfX0pTTV9EUklWRVJfSAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIFRvIHBpY2sgdXAgdGhlIHZhcmlvbnMgTGludXggdHlwZXMgKi8KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBzYy5jIGIvZHJpdmVycy9zZXJpYWwvbXBzYy5jCmluZGV4IGEyYTY0MzMuLmU0MzI3NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21wc2MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcHNjLmMKQEAgLTEwNTgsMTIgKzEwNTgsOSBAQAogewogCXN0cnVjdCBtcHNjX3BvcnRfaW5mbyAqcGkgPSAoc3RydWN0IG1wc2NfcG9ydF9pbmZvICopcG9ydDsKIAl1MzIgbWZsYWdzLCBzdGF0dXM7Ci0JdWxvbmcgaWZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBpLT5wb3J0LmxvY2ssIGlmbGFncyk7CiAJc3RhdHVzID0gKHBpLT5taXJyb3JfcmVncykgPyBwaS0+TVBTQ19DSFJfMTBfbSA6CiAJCXJlYWRsKHBpLT5tcHNjX2Jhc2UgKyBNUFNDX0NIUl8xMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGktPnBvcnQubG9jaywgaWZsYWdzKTsKIAogCW1mbGFncyA9IDA7CiAJaWYgKHN0YXR1cyAmIDB4MSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwppbmRleCA4NWFiZDhhLi43ZGIyZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCkBAIC02MDQsNyArNjA0LDcgQEAKIC8qIAogICogR2V0IE1vZGVtIENvbnRyb2wgYml0cyAob25seSB0aGUgaW5wdXQgb25lcywgdGhlIGNvcmUgd2lsbAogICogb3IgdGhhdCB3aXRoIGEgY2FjaGVkIHZhbHVlIG9mIHRoZSBjb250cm9sIG9uZXMpCi0gKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLgorICogVGhlIHBvcnQgbG9jayBpcyBoZWxkIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBwbXpfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC02MTUsNyArNjE1LDcgQEAKIAlpZiAoWlNfSVNfQVNMRUVQKHVhcCkgfHwgdWFwLT5ub2RlID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0Jc3RhdHVzID0gcG16X3BlZWtfc3RhdHVzKHRvX3Bteihwb3J0KSk7CisJc3RhdHVzID0gcmVhZF96c3JlZyh1YXAsIFIwKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIERDRCkKQEAgLTE1NDUsNyArMTU0NSw3IEBACiAvKgogICogQ2FsbGVkIHVwb24gbWF0Y2ggd2l0aCBhbiBlc2NjIG5vZGUgaW4gdGhlIGRldml2ZS10cmVlLgogICovCi1zdGF0aWMgaW50IHBtel9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgcG16X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpbnQgaTsKIAkKQEAgLTE4NTAsMjAgKzE4NTAsMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggcG16X21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtel9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiY2gtYSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7CiAJLm5hbWUgCQk9ICJjaC1iIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKG9mLCBwbXpfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBwbXpfZHJpdmVyID0gCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9weGEuYyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCmluZGV4IDA4YjA4ZDYuLjQ2MWM4MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCkBAIC0yNzQsMTQgKzI3NCwxMSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWxfcHhhX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3B4YV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9weGFfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCiByZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX01TUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJcmV0ID0gMDsKIAlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCmluZGV4IDVjNDY3ODQuLjczNjVkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKQEAgLTUyMiwxNCArNTIyLDExIEBACiBzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKm91cnBvcnQgPSB0b19vdXJwb3J0KHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCWRiZygiczNjMjR4eF9zZXJpYWxfc3RhcnR1cDogcG9ydD0lcCAoJTA4bHgsJXApXG4iLAogCSAgICBwb3J0LT5tYXBiYXNlLCBwb3J0LT5tZW1iYXNlKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQogCXJ4X2VuYWJsZWQocG9ydCkgPSAxOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoUlhfSVJRKHBvcnQpLApAQCAtNTYzLDEyICs1NjAsMTAgQEAKIAkvKiB0aGUgcG9ydCByZXNldCBjb2RlIHNob3VsZCBoYXZlIGRvbmUgdGhlIGNvcnJlY3QKIAkgKiByZWdpc3RlciBzZXR1cCBmb3IgdGhlIHBvcnQgY29udHJvbHMgKi8KIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogCiAgZXJyOgogCXMzYzI0eHhfc2VyaWFsX3NodXRkb3duKHBvcnQpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCAzNmIxYWUwLi41NDY5OWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTE4Miw2ICsxODIsMTMgQEAKIAkJCQl1YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9SVFMgfCBUSU9DTV9EVFIpOwogCQl9CiAKKwkJaWYgKGluZm8tPmZsYWdzICYgVUlGX0NUU19GTE9XKSB7CisJCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJCWlmICghKHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpICYgVElPQ01fQ1RTKSkKKwkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJfQorCiAJCWluZm8tPmZsYWdzIHw9IFVJRl9JTklUSUFMSVpFRDsKIAogCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CkBAIC04MjgsNyArODM1LDEwIEBACiAJaWYgKCghZmlsZSB8fCAhdHR5X2h1bmdfdXBfcChmaWxlKSkgJiYKIAkgICAgISh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKIAkJcmVzdWx0ID0gcG9ydC0+bWN0cmw7CisKKwkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJCXJlc3VsdCB8PSBwb3J0LT5vcHMtPmdldF9tY3RybChwb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAl9CiAJdXAoJnN0YXRlLT5zZW0pOwogCkBAIC0xMTMxLDYgKzExNDEsMTYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKIAl9CiAKKwkvKiBIYW5kbGUgdHVybmluZyBvbiBDUlRTQ1RTICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAoY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCEoc3RhdGUtPnBvcnQtPm9wcy0+Z2V0X21jdHJsKHN0YXRlLT5wb3J0KSAmIFRJT0NNX0NUUykpIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQlzdGF0ZS0+cG9ydC0+b3BzLT5zdG9wX3R4KHN0YXRlLT5wb3J0LCAwKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOworCX0KKwogI2lmIDAKIAkvKgogCSAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CkBAIC0xMzY5LDYgKzEzODksNyBAQAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCB1YXJ0X2luZm8gKmluZm8gPSBzdGF0ZS0+aW5mbzsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7CisJdW5zaWduZWQgaW50IG1jdHJsOwogCiAJaW5mby0+YmxvY2tlZF9vcGVuKys7CiAJc3RhdGUtPmNvdW50LS07CkBAIC0xNDE2LDcgKzE0MzcsMTAgQEAKIAkJICogYW5kIHdhaXQgZm9yIHRoZSBjYXJyaWVyIHRvIGluZGljYXRlIHRoYXQgdGhlCiAJCSAqIG1vZGVtIGlzIHJlYWR5IGZvciB1cy4KIAkJICovCi0JCWlmIChwb3J0LT5vcHMtPmdldF9tY3RybChwb3J0KSAmIFRJT0NNX0NBUikKKwkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CisJCW1jdHJsID0gcG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CisJCWlmIChtY3RybCAmIFRJT0NNX0NBUikKIAkJCWJyZWFrOwogCiAJCXVwKCZzdGF0ZS0+c2VtKTsKQEAgLTE2MTgsNyArMTY0Miw5IEBACiAKIAlpZihjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCXsKKwkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJCXN0YXR1cyA9IHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpOworCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwogCiAJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIiB0eDolZCByeDolZCIsCiAJCQkJcG9ydC0+aWNvdW50LnR4LCBwb3J0LT5pY291bnQucngpOwpAQCAtMTc4Miw2ICsxODA4LDEyIEBACiAJc3RydWN0IHRlcm1pb3MgdGVybWlvczsKIAlpbnQgaTsKIAorCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHNlcmlhbCBjb25zb2xlIGxvY2sgaXMgaW5pdGlhbGlzZWQKKwkgKiBlYXJseS4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisKIAltZW1zZXQoJnRlcm1pb3MsIDAsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpOwogCiAJdGVybWlvcy5jX2NmbGFnID0gQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKQEAgLTIxNzAsMTAgKzIyMDIsMTYgQEAKIAogCXN0YXRlLT5wb3J0ID0gcG9ydDsKIAotCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKIAlwb3J0LT5jb25zID0gZHJ2LT5jb25zOwogCXBvcnQtPmluZm8gPSBzdGF0ZS0+aW5mbzsKIAorCS8qCisJICogSWYgdGhpcyBwb3J0IGlzIGEgY29uc29sZSwgdGhlbiB0aGUgc3BpbmxvY2sgaXMgYWxyZWFkeQorCSAqIGluaXRpYWxpc2VkLgorCSAqLworCWlmICghdWFydF9jb25zb2xlKHBvcnQpKQorCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisKIAl1YXJ0X2NvbmZpZ3VyZV9wb3J0KGRydiwgc3RhdGUsIHBvcnQpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKaW5kZXggMGQ3YjY1Zi4uZGUwMTM2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIzMiwxMSArMjMxLDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNlcmlhbF9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTc3MiwxMyArNzY2LDEyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgc2VyaWFsX2lkc1tdID0geworCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAwNTcsIDB4MDAyMSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDA4OSwgMHgxMTBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTA0LCAweDAwMGEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxMDUsIDB4ZWExNSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDEwOSwgMHgwNTAxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTM4LCAweDExMGEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNDAsIDB4MDAwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDE0MywgMHgzMzQxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTQzLCAweGMwYWIpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNmMsIDB4MDA4MSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDIxYiwgMHgwMTAxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwOGExLCAweGMwYWIpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxMDUsIDB4MGQwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDEwNSwgMHgwZTBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIzKDEsICJNRUdBSEVSVFoiLCAiQ0MvWEpFTTMyODgiLCAiREFUQS9GQVgvQ0VMTCBFVEhFUk5FVCBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4MDRjZDI5ODgsIDB4NDZhNTJkNjMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMjMoMSwgIk1FR0FIRVJUWiIsICJDQy9YSkVNMzMzNiIsICJEQVRBL0ZBWC9DRUxMIEVUSEVSTkVUIE1PREVNIiwgMHhmNTEwZGIwNCwgMHgwMTQzYjc3MywgMHg0NmE1MmQ2MyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygxLCAiTUVHQUhFUlRaIiwgIkVNMTE0NFQiLCAiUENNQ0lBIE1PREVNIiwgMHhmNTEwZGIwNCwgMHg4NTZkNjZjOCwgMHhiZDZjNDNlZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygxLCAiTUVHQUhFUlRaIiwgIlhKRU0xMTQ0L0NDRU0xMTQ0IiwgIlBDTUNJQSBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4NTJkMjFlMWUsIDB4YmQ2YzQzZWYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygxLCAiWGlyY29tIiwgIkNFTTI4IiwgMHgyZTNlZTg0NSwgMHgwZWE5NzhlYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDEsICJYaXJjb20iLCAiQ0VNMzMiLCAweDJlM2VlODQ1LCAweDgwNjA5MDIzKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMSwgIlhpcmNvbSIsICJDRU01NiIsIDB4MmUzZWU4NDUsIDB4YTY1MGMzMmEpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygxLCAiWGlyY29tIiwgIlJFTTEwIiwgMHgyZTNlZTg0NSwgMHg3NmRmMWQyOSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDEsICJYaXJjb20iLCAiWEVNNTYwMCIsIDB4MmUzZWU4NDUsIDB4ZjE0MDM3MTkpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiQW55Q29tIiwgIkZhc3QgRXRoZXJuZXQgIiwgMHg1NzhiYTZlNywgMHgwMmQ5MmQxZSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJELUxpbmsiLCAiRE1FMzM2VCIsIDB4MWE0MjRhMWMsIDB4YjIzODk3ZmYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiR2F0ZXdheSAyMDAwIiwgIlhKRU0zMzM2IiwgMHhkZDk5ODliZSwgMHg2NjJjMzk0YyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJHcmV5IENlbGwiLCAiR0NTMzAwMCIsIDB4MmExNTFmYWMsIDB4NDhiOTMyYWUpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiTGlua3N5cyIsICJFdGhlckZhc3QgMTAmMTAwICsgNTZLIFBDIENhcmQgKFBDTUxNNTYpIiwgMHgwNzMzY2M4MSwgMHhiMzc2NTAzMyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJMSU5LU1lTIiwgIlBDTUxNMzM2IiwgMHhmN2NiMGIwNywgMHg3YTgyMWI1OCksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJNRUdBSEVSVFoiLCAiWEpFTTExNDQvQ0NFTTExNDQiLCAweGY1MTBkYjA0LCAweDUyZDIxZTFlKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIk9zaXRlY2giLCAiVHJ1bXBjYXJkIiwgMHgwYzJmODBjZCwgMHgwNTczYzI5ZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJPc2l0ZWNoIiwgIlRydW1wY2FyZCIsIDB4MGMyZjgwY2QsIDB4MDU3M2MyOWYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiUENNQ0lBcyIsICJDb21ib0NhcmQiLCAweGRjZmUxMmQzLCAweGNkODkwNmNjKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlBDTUNJQXMiLCAiTGFuTW9kZW0iLCAweGRjZmUxMmQzLCAweGM2N2M2NDhmKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlRESyIsICJHbG9iYWxOZXR3b3JrZXIgMzQxMC8zNDEyIiwgMHgxZWFlOTQ3NSwgMHhkOWE5M2JlZCksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJYaXJjb20iLCAiQ3JlZGl0Q2FyZCBFdGhlcm5ldCIsIDB4MmUzZWU4NDUsIDB4YzBlNzc4YzIpLAorCVBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMDQsIDB4MDA3MCksCisJUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwNTYyKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTA0LCAweDAwNzApLAorCVBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNmMsIDB4MDAyMCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyMygxLCAiQVBFWCBEQVRBIiwgIk1VTFRJQ0FSRCIsICJFVEhFUk5FVC1NT0RFTSIsIDB4MTFjMmRhMDksIDB4NzI4OWRjNWQsIDB4YWFkOTVlMWYpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigxLCAiSUJNIiwgIkhvbWUgYW5kIEF3YXkgMjguOCBQQyBDYXJkICAgICAgICIsIDB4YjU2OWE2ZTUsIDB4NWJkNGZmMmMpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigxLCAiSUJNIiwgIkhvbWUgYW5kIEF3YXkgQ3JlZGl0IENhcmQgQWRhcHRlciIsIDB4YjU2OWE2ZTUsIDB4NGJkZjE1YzMpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigxLCAiSUJNIiwgInc5NSBIb21lIGFuZCBBd2F5IENyZWRpdCBDYXJkICIsIDB4YjU2OWE2ZTUsIDB4YWU5MTFjMTUpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxKDEsICJNb3Rvcm9sYSBNQVJRVUlTIiwgMHhmMDNlNGU3NyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDIoMSwgIkZBWC9Nb2RlbS9FdGhlcm5ldCBDb21ibyBDYXJkICIsIDB4MWVkNTkzMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA4OSwgMHgwMzAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDAzOSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA0LCAweDAwMDYpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwNSwgMHg0MTBhKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMGIsIDB4MGQ1MCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTBiLCAweDBkNTEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwYiwgMHgwZDUyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMGIsIDB4MGQ1MyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTBiLCAweGQxODApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDBlKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzcsIDB4MDAxYiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM3LCAweDAwMjUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDQ1KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzcsIDB4MDA1MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTM0KCJBRFYiLCAiVEVDSCIsICJDT01wYWQtMzIvODUiLCAweDY3NDU5OTM3LCAweDkxNmQwMmJhLCAweDhmYmU5MmFlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjQoIkdBVEVXQVkyMDAwIiwgIkNDMzE0NCIsICJQQ01DSUEgTU9ERU0iLCAweDUwNmJjY2FlLCAweGNiMzY4NWYxLCAweGJkNmM0M2VmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxNCgiTUVHQUhFUlRaIiwgIlBDTUNJQSBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4YmQ2YzQzZWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyNCgiVE9TSElCQSIsICJUMTQ0UEYiLCAiUENNQ0lBIE1PREVNIiwgMHhiNDU4NWExYSwgMHg3MjcxNDA5YywgMHhiZDZjNDNlZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJGVUpJVFNVIiwgIkZDMTRGICIsICJNQkgxMDIxMyIsIDB4NmVlNWEzZDgsIDB4MzBlYWQxMmIsIDB4YjAwZjA1YTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJNRUdBSEVSVFoiLCAiVi4zNCBQQ01DSUEgTU9ERU0iLCAweGY1MTBkYjA0LCAweGJiMmNjZTRhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQnJhaW4gQm94ZXMiLCAiQmx1ZXRvb3RoIFBDIENhcmQiLCAweGVlMTM4MzgyLCAweGQ0Y2U5YjAyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ0lSUlVTIExPR0lDIiwgIkZBWCBNT0RFTSIsIDB4ZTYyNWY0NTEsIDB4Y2VjZDZkZmEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDT01QQVEiLCAiUENNQ0lBIDI4ODAwIEZBWC9EQVRBIE1PREVNIiwgMHhhM2EzMDYyYywgMHg4Y2JkN2M3NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNPTVBBUSIsICJQQ01DSUEgMzM2MDAgRkFYL0RBVEEgTU9ERU0iLCAweGEzYTMwNjJjLCAweDVhMDBjZTk1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29tcHV0ZXJib2FyZHMsIEluYy4iLCAiUENNLUNPTTQyMiIsIDB4ZDBiNzhmNTEsIDB4N2UyZDQ5ZWQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEci4gTmV1aGF1cyIsICJGVVJZIENBUkQgMTRLNCIsIDB4NzY5NDI4MTMsIDB4OGI5NmNlNjUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJbnRlbGxpZ2VudCIsICJBTkdJQSBGQVgvTU9ERU0iLCAweGI0OTZlNjVlLCAweGYzMTYwMmE2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSW50ZWwiLCAiTU9ERU0gMjQwMCIsIDB4ODE2Y2M4MTUsIDB4MjM1MzliODApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJT1RlY2ggSW5jICIsICJQQ01DSUEgRHVhbCBSUy0yMzIgU2VyaWFsIFBvcnQgQ2FyZCIsIDB4M2JkMmQ4OTgsIDB4OTJhYmM5MmYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNQUNST05JWCIsICJGQVgvTU9ERU0iLCAweDY2ODM4OGIzLCAweDNmOWJkZjJmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTXVsdGktVGVjaCIsICJNVDE0MzJMVCIsIDB4NWY3M2JlNTEsIDB4MGIzZTIzODMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNdWx0aS1UZWNoIiwgIk1UMjgzNExUIiwgMHg1ZjczYmU1MSwgMHg0Y2Q3YzA5ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk9FTSAgICAgICIsICJDMjg4TVggICAgICIsIDB4YjU3MmQzNjAsIDB4ZDIzODViN2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEgICAiLCAiQzMzNk1YICAgICAiLCAweDk5YmNhZmU5LCAweGFhMjViY2FiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUXVhdGVjaCBJbmMiLCAiUENNQ0lBIER1YWwgUlMtMjMyIFNlcmlhbCBQb3J0IENhcmQiLCAweGM0NDIwYjM1LCAweDkyYWJjOTJmKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJQQ01DSUEiLCAiRU4yMjE4LUxBTi9NT0RFTSIsIDB4MjgxZjFjNWQsIDB4NTcwZjM0OGUsICJQQ01MTTI4LmNpcyIpLAorCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMSwgIlBDTUNJQSIsICJVRTIyMTgtTEFOL01PREVNIiwgMHgyODFmMWM1ZCwgMHg2ZmRjYWNlZSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIFYzNCBFdGhlcm5ldCIsIDB4ZjVmMDI1YzIsIDB4MzM4ZTgxNTUsICJQQ01MTTI4LmNpcyIpLAorCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMSwgIlBzaW9uIERhY29tIiwgIkdvbGQgQ2FyZCBWMzQgRXRoZXJuZXQgR1NNIiwgMHhmNWYwMjVjMiwgMHg0YWU4NWQzNSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiTElOS1NZUyIsICJQQ01MTTI4IiwgMHhmN2NiMGIwNywgMHg2Njg4MTg3NCwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiREFZTkEgQ09NTVVOSUNBVElPTlMiLCAiTEFOIEFORCBNT0RFTSBNVUxUSUZVTkNUSU9OIiwgMHg4ZmRmOGY4OSwgMHhkZDVlZDllOCwgIkRQODM5MDMuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQ0KDEsICJOU0MgTUYgTEFOL01vZGVtIiwgMHg1OGZjNjA1NiwgIkRQODM5MDMuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgxLCAweDAxMDEsIDB4MDU1NiwgIjNDQ0ZFTTU1Ni5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDE3NSwgMHgwMDAwLCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwMDM1LCAiM0NYRU01NTYuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgxLCAweDAxMDEsIDB4MDAzZCwgIjNDWEVNNTU2LmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiTXVsdGlUZWNoIiwgIlBDTUNJQSA1NksgRGF0YUZheCIsIDB4ODQyMDQ3ZWUsIDB4YzJlZmNmMDMsICJNVDU2MzRaTFguY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1Qi00IiwgMHg5NjkxM2E4NSwgMHhjZWM4ZjEwMiwgIkNPTXBhZDQuY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyMygiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NSIsICIxLjAiLCAweDk2OTEzYTg1LCAweDhmYmU5MmFlLCAweDA4NzdiNjI3LCAiQ09NcGFkMi5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMigiUlMtQ09NIDJQIiwgMHhhZDIwYjE1NiwgIlJTLUNPTS0yUC5jaXMiKSwKKwkvKiB0b28gZ2VuZXJpYyAqLworCS8qIFBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNjAsIDB4MDAwMiksICovCisJLyogUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDE2MCwgMHgwMDAyKSwgKi8KKwlQQ01DSUFfREVWSUNFX0ZVTkNfSUQoMiksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzZXJpYWxfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHNlcmlhbF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJzZXJpYWxfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBzZXJpYWxfYXR0YWNoLAorCS5ldmVudAkJPSBzZXJpYWxfZXZlbnQsCiAJLmRldGFjaAkJPSBzZXJpYWxfZGV0YWNoLAorCS5pZF90YWJsZQk9IHNlcmlhbF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NlcmlhbF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKaW5kZXggM2YxMDUxYS4uZDA4NTAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCkBAIC00NDIsMTMgKzQ0MiwxMCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWxfdHh4OV9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAlyZXQgPSAgKChzaW9faW4odXAsIFRYWDlfU0lGTENSKSAmIFRYWDlfU0lGTENSX1JUU1NDKSA/IDAgOiBUSU9DTV9SVFMpCiAJCXwgKChzaW9faW4odXAsIFRYWDlfU0lDSVNSKSAmIFRYWDlfU0lDSVNSX0NUU1MpID8gMCA6IFRJT0NNX0NUUyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggMTBlMjk5MC4uOGQxOTg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTQyNiwxOCArNDI2LDE1IEBACiAJCXN1bnNhYl90eF9pZGxlKHVwKTsKIH0KIAotLyogcG9ydC0+bG9jayBpcyBub3QgaGVsZC4gICovCisvKiBwb3J0LT5sb2NrIGlzIGhlbGQgYnkgY2FsbGVyIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHN1bnNhYl9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgdmFsOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKIAlyZXN1bHQgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQogCXZhbCA9IHJlYWRiKCZ1cC0+cmVncy0+ci5wdnIpOwogCXJlc3VsdCB8PSAodmFsICYgdXAtPnB2cl9kc3JfYml0KSA/IDAgOiBUSU9DTV9EU1I7CiAKQEAgLTQ0Nyw4ICs0NDQsNiBAQAogCXZhbCA9IHJlYWRiKCZ1cC0+cmVncy0+ci5zdGFyKTsKIAlyZXN1bHQgfD0gKHZhbCAmIFNBQjgyNTMyX1NUQVJfQ1RTKSA/IFRJT0NNX0NUUyA6IDA7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwppbmRleCBkZGM5N2M5Li5kNTdhMzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKQEAgLTU3MiwxMyArNTcyLDEwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHN1bnN1X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3N1bnN1X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3N1bnN1X3BvcnQgKikgcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCXN0YXR1cyA9IHNlcmlhbF9pbih1cCwgVUFSVF9NU1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IDhlNjUyMDYuLmJmZjQyYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtNjEwLDI3ICs2MTAsMjggQEAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgc3Vuemlsb2dfcmVhZF9jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB6aWxvZ19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KIAljaGFubmVsID0gWklMT0dfQ0hBTk5FTF9GUk9NX1BPUlQocG9ydCk7CiAJc3RhdHVzID0gc2J1c19yZWFkYigmY2hhbm5lbC0+Y29udHJvbCk7CiAJWlNERUxBWSgpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyogVGhlIHBvcnQgbG9jayBpcyBub3QgaGVsZC4gICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHN1bnppbG9nX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCXN0YXR1cyA9IHN1bnppbG9nX3JlYWRfY2hhbm5lbF9zdGF0dXMocG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKIAlpZiAoc3RhdHVzICYgVHhfQlVGX0VNUCkKIAkJcmV0ID0gVElPQ1NFUl9URU1UOwogCWVsc2UKQEAgLTYzOSw3ICs2NDAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFRoZSBwb3J0IGxvY2sgaXMgbm90IGhlbGQuICAqLworLyogVGhlIHBvcnQgbG9jayBpcyBoZWxkIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHN1bnppbG9nX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCmluZGV4IGUxZWYwZDcuLjU3YzBjNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYworKysgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZXJyb3IgY29kZXMgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTY5LDExICs2OCw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCSAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZpeGpfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0yOTUsMTMgKzI4OSwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgaXhqX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI1NywgMHgwNjAwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgaXhqX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBpeGpfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiaXhqX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gaXhqX2F0dGFjaCwKKwkuZXZlbnQJCT0gaXhqX2V2ZW50LAogCS5kZXRhY2gJCT0gaXhqX2RldGFjaCwKKwkuaWRfdGFibGUJPSBpeGpfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXhqX3BjbWNpYV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCmluZGV4IGE2MWQ0NDMuLmRmMDE0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX1VTQl9NT04pCQkrPSBtb24vCiAKIG9iai0kKENPTkZJR19VU0JfRUhDSV9IQ0QpCSs9IGhvc3QvCitvYmotJChDT05GSUdfVVNCX0lTUDExNlhfSENEKQkrPSBob3N0Lwogb2JqLSQoQ09ORklHX1VTQl9PSENJX0hDRCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IGhvc3QvCiBvYmotJChDT05GSUdfVVNCX1NMODExX0hDRCkJKz0gaG9zdC8KQEAgLTMxLDYgKzMyLDcgQEAKIG9iai0kKENPTkZJR19VU0JfTVRPVUNIKQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfUE9XRVJNQVRFKQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfV0FDT00pCQkrPSBpbnB1dC8KK29iai0kKENPTkZJR19VU0JfQUNFQ0FEKQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfWFBBRCkJCSs9IGlucHV0LwogCiBvYmotJChDT05GSUdfVVNCX0RBQlVTQikJKz0gbWVkaWEvCkBAIC02MywxMiArNjUsMTQgQEAKIG9iai0kKENPTkZJR19VU0JfRU1JNjIpCQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9JRE1PVVNFKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9MQ0QpCQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9MRCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xFRCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xFR09UT1dFUikJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfUklPNTAwKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IG1pc2MvCitvYmotJChDT05GSUdfVVNCX1NJU1VTQlZHQSkJKz0gbWlzYy8KIAogb2JqLSQoQ09ORklHX1VTQl9BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfVVNCX1NQRUVEVE9VQ0gpCSs9IGF0bS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9LY29uZmlnIGIvZHJpdmVycy91c2IvYXRtL0tjb25maWcKaW5kZXggMGQ5ZjUzNy4uZjQyOTg2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvYXRtL0tjb25maWcKQEAgLTEsMzAgKzEsNjAgQEAKICMKLSMgVVNCIEFUTSBkcml2ZXIgY29uZmlndXJhdGlvbgorIyBVU0IvQVRNIERTTCBjb25maWd1cmF0aW9uCiAjCi1jb21tZW50ICJVU0IgQVRNL0RTTCBkcml2ZXJzIgorCittZW51ICJVU0IgRFNMIG1vZGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IKIAogY29uZmlnIFVTQl9BVE0KLQl0cmlzdGF0ZSAiR2VuZXJpYyBVU0IgQVRNL0RTTCBjb3JlIEkvTyBzdXBwb3J0IgorCXRyaXN0YXRlICJVU0IgRFNMIG1vZGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IgJiYgQVRNCiAJc2VsZWN0IENSQzMyCiAJZGVmYXVsdCBuCiAJaGVscAotCSAgVGhpcyBwcm92aWRlcyBhIGxpYnJhcnkgd2hpY2ggaXMgdXNlZCBmb3IgcGFja2V0IEkvTyBieSBVU0IgRFNMCi0JICBtb2RlbXMsIHN1Y2ggYXMgdGhlIFNwZWVkVG91Y2ggZHJpdmVyIGJlbG93LiAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIFVTQiBEaWdpdGFsIFN1YnNjcmliZXIgTGluZSAoRFNMKQorCSAgbW9kZW0gdG8geW91ciBjb21wdXRlcidzIFVTQiBwb3J0LiAgWW91IHdpbGwgdGhlbiBuZWVkIHRvIGNob29zZSB5b3VyCisJICBtb2RlbSBmcm9tIHRoZSBsaXN0IGJlbG93LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JfYXRtLgorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVzYmF0bS4KIAogY29uZmlnIFVTQl9TUEVFRFRPVUNICi0JdHJpc3RhdGUgIkFsY2F0ZWwgU3BlZWR0b3VjaCBVU0Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBBVE0KLQlzZWxlY3QgVVNCX0FUTQorCXRyaXN0YXRlICJTcGVlZHRvdWNoIFVTQiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0FUTQorCXNlbGVjdCBGV19MT0FERVIKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFsY2F0ZWwgU3BlZWRUb3VjaCBVU0Igb3IgU3BlZWRUb3VjaCAzMzAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gU3BlZWRUb3VjaCBVU0Igb3IgU3BlZWRUb3VjaCAzMzAKIAkgIG1vZGVtLiAgSW4gb3JkZXIgdG8gdXNlIHlvdXIgbW9kZW0geW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZSAKIAkgIHR3byBwYXJ0cyBvZiB0aGUgZmlybXdhcmUsIGV4dHJhY3RlZCBieSB0aGUgdXNlciBzcGFjZSB0b29sczsgc2VlCiAJICA8aHR0cDovL3d3dy5saW51eC11c2Iub3JnL1NwZWVkVG91Y2gvPiBmb3IgZGV0YWlscy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3BlZWR0Y2guCisKK2NvbmZpZyBVU0JfQ1hBQ1JVCisJdHJpc3RhdGUgIkNvbmV4YW50IEFjY2Vzc1J1bm5lciBVU0Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9BVE0KKwlzZWxlY3QgRldfTE9BREVSCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBRFNMIFVTQiBtb2RlbSBiYXNlZCBvbiB0aGUgQ29uZXhhbnQKKwkgIEFjY2Vzc1J1bm5lciBjaGlwc2V0LiAgSW4gb3JkZXIgdG8gdXNlIHlvdXIgbW9kZW0geW91IHdpbGwgbmVlZCB0bworCSAgaW5zdGFsbCB0aGUgZmlybXdhcmUsIGV4dHJhY3RlZCBieSB0aGUgdXNlciBzcGFjZSB0b29sczsgc2VlCisJICA8aHR0cDovL2FjY2Vzc3J1bm5lci5zb3VyY2Vmb3JnZS5uZXQvPiBmb3IgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3hhY3J1LgorCitjb25maWcgVVNCX1hVU0JBVE0KKwl0cmlzdGF0ZSAiT3RoZXIgVVNCIERTTCBtb2RlbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0FUTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBEU0wgVVNCIG1vZGVtIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZCBieQorCSAgYW5vdGhlciBVU0IgRFNMIGRyaXZlcnMuICBJbiBvcmRlciB0byB1c2UgeW91ciBtb2RlbSB5b3Ugd2lsbCBuZWVkIHRvCisJICBwYXNzIHRoZSB2ZW5kb3IgSUQsIHByb2R1Y3QgSUQsIGFuZCBlbmRwb2ludCBudW1iZXJzIGZvciB0cmFuc21pc3Npb24KKwkgIGFuZCByZWNlcHRpb24gYXMgbW9kdWxlIHBhcmFtZXRlcnMuICBZb3UgbWF5IG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUKKwkgIHRoZSBtb2RlbSB1c2luZyBhIHVzZXIgc3BhY2UgdXRpbGl0eSAoYSBmaXJtd2FyZSBsb2FkZXIgZm9yIGV4YW1wbGUpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB4dXNiYXRtLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9hdG0vTWFrZWZpbGUKaW5kZXggOTIxM2I4YjkuLjc1MWYyOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9hdG0vTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiAjCi0jIE1ha2VmaWxlIGZvciB0aGUgcmVzdCBvZiB0aGUgVVNCIGRyaXZlcnMKLSMgKHRoZSBvbmVzIHRoYXQgZG9uJ3QgZml0IGludG8gYW55IG90aGVyIGNhdGVnb3JpZXMpCisjIE1ha2VmaWxlIGZvciBVU0IgQVRNL3hEU0wgZHJpdmVycwogIwogCi1vYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IHVzYl9hdG0ubworb2JqLSQoQ09ORklHX1VTQl9DWEFDUlUpCSs9IGN4YWNydS5vCiBvYmotJChDT05GSUdfVVNCX1NQRUVEVE9VQ0gpCSs9IHNwZWVkdGNoLm8KK29iai0kKENPTkZJR19VU0JfQVRNKQkJKz0gdXNiYXRtLm8KK29iai0kKENPTkZJR19VU0JfWFVTQkFUTSkJKz0geHVzYmF0bS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxODRlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwpAQCAtMCwwICsxLDg3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGN4YWNydS5jICAtICBkcml2ZXIgZm9yIFVTQiBBRFNMIG1vZGVtcyBiYXNlZCBvbgorICogICAgICAgICAgICAgICBDb25leGFudCBBY2Nlc3NSdW5uZXIgY2hpcHNldAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgV29vZGhvdXNlLCBEdW5jYW4gU2FuZHMsIFJvbWFuIEthZ2FuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IER1bmNhbiBTYW5kcywgUm9tYW4gS2FnYW4gKHJrYWdhbiAlIG1haWwgISBydSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgQ3JlZGl0IGlzIGR1ZSBmb3IgSm9zZXAgQ29tYXMsIHdobyBjcmVhdGVkIHRoZSBvcmlnaW5hbCBwYXRjaCB0byBzcGVlZHRjaC5jCisgKiAgdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW50IHBhZGRpbmcgdXNlZCBieSB0aGUgQWNjZXNzUnVubmVyIChub3cgZ2VuZXJhbGl6ZWQKKyAqICBpbnRvIHVzYmF0bSksIGFuZCB0aGUgdXNlcnNwYWNlIGZpcm13YXJlIGxvYWRpbmcgdXRpbGl0eS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JLyogRklYTUU6IGxpbnV4L2Zpcm13YXJlLmggc2hvdWxkIGluY2x1ZGUgaXQgaXRzZWxmICovCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgInVzYmF0bS5oIgorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIlJvbWFuIEthZ2FuLCBEYXZpZCBXb29kaG91c2UsIER1bmNhbiBTYW5kcyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIkNvbmV4YW50IEFjY2Vzc1J1bm5lciBBRFNMIFVTQiBtb2RlbSBkcml2ZXIiCisKK3N0YXRpYyBjb25zdCBjaGFyIGN4YWNydV9kcml2ZXJfbmFtZVtdID0gImN4YWNydSI7CisKKyNkZWZpbmUgQ1hBQ1JVX0VQX0NNRAkJMHgwMQkvKiBCdWxrL2ludGVycnVwdCBpbi9vdXQgKi8KKyNkZWZpbmUgQ1hBQ1JVX0VQX0RBVEEJCTB4MDIJLyogQnVsayBpbi9vdXQgKi8KKworI2RlZmluZSBDTURfUEFDS0VUX1NJWkUJCTY0CS8qIFNob3VsZCBiZSBtYXhwYWNrZXQoZXApPyAqLworCisvKiBBZGRyZXNzZXMgKi8KKyNkZWZpbmUgUExMRkNMS19BRERSCTB4MDAzNTAwNjgKKyNkZWZpbmUgUExMQkNMS19BRERSCTB4MDAzNTAwNmMKKyNkZWZpbmUgU0RSQU1FTl9BRERSCTB4MDAzNTAwMTAKKyNkZWZpbmUgRldfQUREUgkJMHgwMDgwMTAwMAorI2RlZmluZSBCUl9BRERSCQkweDAwMTgwNjAwCisjZGVmaW5lIFNJR19BRERSCTB4MDAxODA1MDAKKyNkZWZpbmUgQlJfU1RBQ0tfQUREUgkweDAwMTg3ZjEwCisKKy8qIFZhbHVlcyAqLworI2RlZmluZSBTRFJBTV9FTkEJMHgxCisKKyNkZWZpbmUgQ01EX1RJTUVPVVQJMjAwMAkvKiBtc2VjcyAqLworI2RlZmluZSBQT0xMX0lOVEVSVkFMCTUwMDAJLyogbXNlY3MgKi8KKworLyogY29tbWFuZHMgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlIG1vZGVtIHRocm91Z2ggdGhlIGNvbnRyb2wgY2hhbm5lbCBiZWZvcmUKKyAqIGZpcm13YXJlIGlzIGxvYWRlZCAgKi8KK2VudW0gY3hhY3J1X2Z3X3JlcXVlc3QgeworCUZXX0NNRF9FUlIsCisJRldfR0VUX1ZFUiwKKwlGV19SRUFEX01FTSwKKwlGV19XUklURV9NRU0sCisJRldfUk1XX01FTSwKKwlGV19DSEVDS1NVTV9NRU0sCisJRldfR09UT19NRU0sCit9OworCisvKiBjb21tYW5kcyBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgbW9kZW0gdGhyb3VnaCB0aGUgY29udHJvbCBjaGFubmVsIG9uY2UKKyAqIGZpcm13YXJlIGlzIGxvYWRlZCAgKi8KK2VudW0gY3hhY3J1X2NtX3JlcXVlc3QgeworCUNNX1JFUVVFU1RfVU5ERUZJTkVEID0gMHg4MCwKKwlDTV9SRVFVRVNUX1RFU1QsCisJQ01fUkVRVUVTVF9DSElQX0dFVF9NQUNfQUREUkVTUywKKwlDTV9SRVFVRVNUX0NISVBfR0VUX0RQX1ZFUlNJT05TLAorCUNNX1JFUVVFU1RfQ0hJUF9BRFNMX0xJTkVfU1RBUlQsCisJQ01fUkVRVUVTVF9DSElQX0FEU0xfTElORV9TVE9QLAorCUNNX1JFUVVFU1RfQ0hJUF9BRFNMX0xJTkVfR0VUX1NUQVRVUywKKwlDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX0dFVF9TUEVFRCwKKwlDTV9SRVFVRVNUX0NBUkRfSU5GT19HRVQsCisJQ01fUkVRVUVTVF9DQVJEX0RBVEFfR0VULAorCUNNX1JFUVVFU1RfQ0FSRF9EQVRBX1NFVCwKKwlDTV9SRVFVRVNUX0NPTU1BTkRfSFdfSU8sCisJQ01fUkVRVUVTVF9JTlRFUkZBQ0VfSFdfSU8sCisJQ01fUkVRVUVTVF9DQVJEX1NFUklBTF9EQVRBX1BBVEhfR0VULAorCUNNX1JFUVVFU1RfQ0FSRF9TRVJJQUxfREFUQV9QQVRIX1NFVCwKKwlDTV9SRVFVRVNUX0NBUkRfQ09OVFJPTExFUl9WRVJTSU9OX0dFVCwKKwlDTV9SRVFVRVNUX0NBUkRfR0VUX1NUQVRVUywKKwlDTV9SRVFVRVNUX0NBUkRfR0VUX01BQ19BRERSRVNTLAorCUNNX1JFUVVFU1RfQ0FSRF9HRVRfREFUQV9MSU5LX1NUQVRVUywKKwlDTV9SRVFVRVNUX01BWCwKK307CisKKy8qIHJlcGx5IGNvZGVzIHRvIHRoZSBjb21tYW5kcyBhYm92ZSAqLworZW51bSBjeGFjcnVfY21fc3RhdHVzIHsKKwlDTV9TVEFUVVNfVU5ERUZJTkVELAorCUNNX1NUQVRVU19TVUNDRVNTLAorCUNNX1NUQVRVU19FUlJPUiwKKwlDTV9TVEFUVVNfVU5TVVBQT1JURUQsCisJQ01fU1RBVFVTX1VOSU1QTEVNRU5URUQsCisJQ01fU1RBVFVTX1BBUkFNRVRFUl9FUlJPUiwKKwlDTV9TVEFUVVNfREJHX0xPT1BCQUNLLAorCUNNX1NUQVRVU19NQVgsCit9OworCisvKiBpbmRpY2VzIGludG8gQ0FSRF9JTkZPX0dFVCByZXR1cm4gYXJyYXkgKi8KK2VudW0gY3hhY3J1X2luZm9faWR4IHsKKwlDWElORl9ET1dOU1RSRUFNX1JBVEUsCisJQ1hJTkZfVVBTVFJFQU1fUkFURSwKKwlDWElORl9MSU5LX1NUQVRVUywKKwlDWElORl9MSU5FX1NUQVRVUywKKwlDWElORl9NQUNfQUREUkVTU19ISUdILAorCUNYSU5GX01BQ19BRERSRVNTX0xPVywKKwlDWElORl9VUFNUUkVBTV9TTlJfTUFSR0lOLAorCUNYSU5GX0RPV05TVFJFQU1fU05SX01BUkdJTiwKKwlDWElORl9VUFNUUkVBTV9BVFRFTlVBVElPTiwKKwlDWElORl9ET1dOU1RSRUFNX0FUVEVOVUFUSU9OLAorCUNYSU5GX1RSQU5TTUlUVEVSX1BPV0VSLAorCUNYSU5GX1VQU1RSRUFNX0JJVFNfUEVSX0ZSQU1FLAorCUNYSU5GX0RPV05TVFJFQU1fQklUU19QRVJfRlJBTUUsCisJQ1hJTkZfU1RBUlRVUF9BVFRFTVBUUywKKwlDWElORl9VUFNUUkVBTV9DUkNfRVJST1JTLAorCUNYSU5GX0RPV05TVFJFQU1fQ1JDX0VSUk9SUywKKwlDWElORl9VUFNUUkVBTV9GRUNfRVJST1JTLAorCUNYSU5GX0RPV05TVFJFQU1fRkVDX0VSUk9SUywKKwlDWElORl9VUFNUUkVBTV9IRUNfRVJST1JTLAorCUNYSU5GX0RPV05TVFJFQU1fSEVDX0VSUk9SUywKKwlDWElORl9MSU5FX1NUQVJUQUJMRSwKKwlDWElORl9NT0RVTEFUSU9OLAorCUNYSU5GX0FEU0xfSEVBREVORCwKKwlDWElORl9BRFNMX0hFQURFTkRfRU5WSVJPTk1FTlQsCisJQ1hJTkZfQ09OVFJPTExFUl9WRVJTSU9OLAorCS8qIGR1bm5vIHdoYXQgdGhlIG1pc3NpbmcgdHdvIG1lYW4gKi8KKwlDWElORl9NQVggPSAweDFjLAorfTsKKworc3RydWN0IGN4YWNydV9tb2RlbV90eXBlIHsKKwl1MzIgcGxsX2ZfY2xrOworCXUzMiBwbGxfYl9jbGs7CisJaW50IGJvb3Rfcm9tX3BhdGNoOworfTsKKworc3RydWN0IGN4YWNydV9kYXRhIHsKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bTsKKworCWNvbnN0IHN0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSAqbW9kZW1fdHlwZTsKKworCWludCBsaW5lX3N0YXR1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9sbF93b3JrOworCisJLyogY29udG9sIGhhbmRsZXMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGNtX3NlcmlhbGl6ZTsKKwl1OCAqcmN2X2J1ZjsKKwl1OCAqc25kX2J1ZjsKKwlzdHJ1Y3QgdXJiICpyY3ZfdXJiOworCXN0cnVjdCB1cmIgKnNuZF91cmI7CisJc3RydWN0IGNvbXBsZXRpb24gcmN2X2RvbmU7CisJc3RydWN0IGNvbXBsZXRpb24gc25kX2RvbmU7Cit9OworCisvKiB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgc3RvbGVuIGZyb20gZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgKi8KK3N0YXRpYyB2b2lkIGN4YWNydV9ibG9ja2luZ19jb21wbGV0aW9uKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopdXJiLT5jb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgY3hhY3J1X3RpbWVvdXRfa2lsbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdXNiX3VubGlua191cmIoKHN0cnVjdCB1cmIgKikgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X3N0YXJ0X3dhaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IGNvbXBsZXRpb24gKmRvbmUsCisJCQkJIGludCogYWN0dWFsX2xlbmd0aCkKK3sKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQgc3RhdHVzOworCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhDTURfVElNRU9VVCk7CisJdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB1cmI7CisJdGltZXIuZnVuY3Rpb24gPSBjeGFjcnVfdGltZW91dF9raWxsOworCWFkZF90aW1lcigmdGltZXIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oZG9uZSk7CisJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJaWYgKHN0YXR1cyA9PSAtRUNPTk5SRVNFVCkKKwkJc3RhdHVzID0gLUVUSU1FRE9VVDsKKwlkZWxfdGltZXJfc3luYygmdGltZXIpOworCisJaWYgKGFjdHVhbF9sZW5ndGgpCisJCSphY3R1YWxfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X2NtKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UsIGVudW0gY3hhY3J1X2NtX3JlcXVlc3QgY20sCisJCSAgICAgdTggKndkYXRhLCBpbnQgd3NpemUsIHU4ICpyZGF0YSwgaW50IHJzaXplKQoreworCWludCByZXQsIGFjdGxlbjsKKwlpbnQgb2ZmYiwgb2ZmZDsKKwljb25zdCBpbnQgc3RyaWRlID0gQ01EX1BBQ0tFVF9TSVpFIC0gNDsKKwl1OCAqd2J1ZiA9IGluc3RhbmNlLT5zbmRfYnVmOworCXU4ICpyYnVmID0gaW5zdGFuY2UtPnJjdl9idWY7CisJaW50IHdidWZsZW4gPSAoKHdzaXplIC0gMSkgLyBzdHJpZGUgKyAxKSAqIENNRF9QQUNLRVRfU0laRTsKKwlpbnQgcmJ1ZmxlbiA9ICgocnNpemUgLSAxKSAvIHN0cmlkZSArIDEpICogQ01EX1BBQ0tFVF9TSVpFOworCisJaWYgKHdidWZsZW4gPiBQQUdFX1NJWkUgfHwgcmJ1ZmxlbiA+IFBBR0VfU0laRSkgeworCQlkYmcoInRvbyBiaWcgdHJhbnNmZXIgcmVxdWVzdGVkIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkb3duKCZpbnN0YW5jZS0+Y21fc2VyaWFsaXplKTsKKworCS8qIHN1Ym1pdCByZWFkaW5nIHVyYiBiZWZvcmUgdGhlIHdyaXRpbmcgb25lICovCisJaW5pdF9jb21wbGV0aW9uKCZpbnN0YW5jZS0+cmN2X2RvbmUpOworCXJldCA9IHVzYl9zdWJtaXRfdXJiKGluc3RhbmNlLT5yY3ZfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkYmcoInN1Ym1pdHRpbmcgcmVhZCB1cmIgZm9yIGNtICUjeCBmYWlsZWQiLCBjbSk7CisJCXJldCA9IHJldDsKKwkJZ290byBmYWlsOworCX0KKworCW1lbXNldCh3YnVmLCAwLCB3YnVmbGVuKTsKKwkvKiBoYW5kbGUgd3NpemUgPT0gMCAqLworCXdidWZbMF0gPSBjbTsKKwlmb3IgKG9mZmIgPSBvZmZkID0gMDsgb2ZmZCA8IHdzaXplOyBvZmZkICs9IHN0cmlkZSwgb2ZmYiArPSBDTURfUEFDS0VUX1NJWkUpIHsKKwkJd2J1ZltvZmZiXSA9IGNtOworCQltZW1jcHkod2J1ZiArIG9mZmIgKyA0LCB3ZGF0YSArIG9mZmQsIG1pbl90KGludCwgc3RyaWRlLCB3c2l6ZSAtIG9mZmQpKTsKKwl9CisKKwlpbnN0YW5jZS0+c25kX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHdidWZsZW47CisJaW5pdF9jb21wbGV0aW9uKCZpbnN0YW5jZS0+c25kX2RvbmUpOworCXJldCA9IHVzYl9zdWJtaXRfdXJiKGluc3RhbmNlLT5zbmRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkYmcoInN1Ym1pdHRpbmcgd3JpdGUgdXJiIGZvciBjbSAlI3ggZmFpbGVkIiwgY20pOworCQlyZXQgPSByZXQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBjeGFjcnVfc3RhcnRfd2FpdF91cmIoaW5zdGFuY2UtPnNuZF91cmIsICZpbnN0YW5jZS0+c25kX2RvbmUsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWRiZygic2VuZGluZyBjbSAlI3ggZmFpbGVkIiwgY20pOworCQlyZXQgPSByZXQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBjeGFjcnVfc3RhcnRfd2FpdF91cmIoaW5zdGFuY2UtPnJjdl91cmIsICZpbnN0YW5jZS0+cmN2X2RvbmUsICZhY3RsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWRiZygicmVjZWl2aW5nIGNtICUjeCBmYWlsZWQiLCBjbSk7CisJCXJldCA9IHJldDsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoYWN0bGVuICUgQ01EX1BBQ0tFVF9TSVpFIHx8ICFhY3RsZW4pIHsKKwkJZGJnKCJyZXNwb25zZSBpcyBub3QgYSBwb3NpdGl2ZSBtdWx0aXBsZSBvZiAlZDogJSN4IiwKKwkJCQlDTURfUEFDS0VUX1NJWkUsIGFjdGxlbik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cyBhbmQgY29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgaWYgbmVlZGVkICovCisJZm9yIChvZmZiID0gb2ZmZCA9IDA7IG9mZmQgPCByc2l6ZSAmJiBvZmZiIDwgYWN0bGVuOyBvZmZiICs9IENNRF9QQUNLRVRfU0laRSkgeworCQlpZiAocmJ1ZltvZmZiXSAhPSBjbSkgeworCQkJZGJnKCJ3cm9uZyBjbSAlI3ggaW4gcmVzcG9uc2UiLCByYnVmW29mZmJdKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHJidWZbb2ZmYiArIDFdICE9IENNX1NUQVRVU19TVUNDRVNTKSB7CisJCQlkYmcoInJlc3BvbnNlIGZhaWxlZDogJSN4IiwgcmJ1ZltvZmZiICsgMV0pOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAob2ZmZCA+PSByc2l6ZSkKKwkJCWJyZWFrOworCQltZW1jcHkocmRhdGEgKyBvZmZkLCByYnVmICsgb2ZmYiArIDQsIG1pbl90KGludCwgc3RyaWRlLCByc2l6ZSAtIG9mZmQpKTsKKwkJb2ZmZCArPSBzdHJpZGU7CisJfQorCisJcmV0ID0gb2ZmZDsKKwlkYmcoImNtICUjeCIsIGNtKTsKK2ZhaWw6CisJdXAoJmluc3RhbmNlLT5jbV9zZXJpYWxpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X2NtX2dldF9hcnJheShzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlLCBlbnVtIGN4YWNydV9jbV9yZXF1ZXN0IGNtLAorCQkJICAgICAgIHUzMiAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHJldCwgbGVuOworCXUzMiAqYnVmOworCWludCBvZmZiLCBvZmZkOworCWNvbnN0IGludCBzdHJpZGUgPSBDTURfUEFDS0VUX1NJWkUgLyAoNCAqIDIpIC0gMTsKKwlpbnQgYnVmbGVuID0gICgoc2l6ZSAtIDEpIC8gc3RyaWRlICsgMSArIHNpemUgKiAyKSAqIDQ7CisKKwlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBjbSwgTlVMTCwgMCwgKHU4ICopIGJ1ZiwgYnVmbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwOworCisJLyogbGVuID4gMCAmJiBsZW4gJSA0ID09IDAgZ3VhcmFudGVlZCBieSBjeGFjcnVfY20oKSAqLworCWxlbiA9IHJldCAvIDQ7CisJZm9yIChvZmZiID0gMDsgb2ZmYiA8IGxlbjsgKSB7CisJCWludCBsID0gbGUzMl90b19jcHUoYnVmW29mZmIrK10pOworCQlpZiAobCA+IHN0cmlkZSB8fCBsID4gKGxlbiAtIG9mZmIpIC8gMikgeworCQkJZGJnKCJ3cm9uZyBkYXRhIGxlbmd0aCAlI3ggaW4gcmVzcG9uc2UiLCBsKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJd2hpbGUgKGwtLSkgeworCQkJb2ZmZCA9IGxlMzJfdG9fY3B1KGJ1ZltvZmZiKytdKTsKKwkJCWlmIChvZmZkID49IHNpemUpIHsKKwkJCQlkYmcoIndyb25nIGluZGV4ICUjeCBpbiByZXNwb25zZSIsIG9mZmQpOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJZGF0YVtvZmZkXSA9IGxlMzJfdG9fY3B1KGJ1ZltvZmZiKytdKTsKKwkJfQorCX0KKworCXJldCA9IDA7CisKK2NsZWFudXA6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4YWNydV9jYXJkX3N0YXR1cyhzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlKQoreworCWludCByZXQgPSBjeGFjcnVfY20oaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0FSRF9HRVRfU1RBVFVTLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgewkJLyogZmlybXdhcmUgbm90IGxvYWRlZCAqLworCQlkYmcoImN4YWNydV9hZHNsX3N0YXJ0OiBDQVJEX0dFVF9TVEFUVVMgcmV0dXJuZWQgJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3hhY3J1X3BvbGxfc3RhdHVzKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UpOworCitzdGF0aWMgaW50IGN4YWNydV9hdG1fc3RhcnQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2KQoreworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1c2JhdG1faW5zdGFuY2UtPnVzYl9pbnRmLT5kZXY7CisJLyoKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiA9IHVzYmF0bV9pbnN0YW5jZS0+YXRtX2RldjsKKwkqLworCWludCByZXQ7CisKKwlkYmcoImN4YWNydV9hdG1fc3RhcnQiKTsKKworCS8qIFJlYWQgTUFDIGFkZHJlc3MgKi8KKwlyZXQgPSBjeGFjcnVfY20oaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0FSRF9HRVRfTUFDX0FERFJFU1MsIE5VTEwsIDAsCisJCQlhdG1fZGV2LT5lc2ksIHNpemVvZihhdG1fZGV2LT5lc2kpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImN4YWNydV9hdG1fc3RhcnQ6IENBUkRfR0VUX01BQ19BRERSRVNTIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHN0YXJ0IEFEU0wgKi8KKwlyZXQgPSBjeGFjcnVfY20oaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0hJUF9BRFNMX0xJTkVfU1RBUlQsIE5VTEwsIDAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY3hhY3J1X2F0bV9zdGFydDogQ0hJUF9BRFNMX0xJTkVfU1RBUlQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU3RhcnQgc3RhdHVzIHBvbGxpbmcgKi8KKwljeGFjcnVfcG9sbF9zdGF0dXMoaW5zdGFuY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSkKK3sKKwl1MzIgYnVmW0NYSU5GX01BWF0gPSB7fTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW5zdGFuY2UtPnVzYmF0bS0+dXNiX2ludGYtPmRldjsKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiA9IGluc3RhbmNlLT51c2JhdG0tPmF0bV9kZXY7CisJaW50IHJldDsKKworCXJldCA9IGN4YWNydV9jbV9nZXRfYXJyYXkoaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0FSRF9JTkZPX0dFVCwgYnVmLCBDWElORl9NQVgpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl93YXJuKGRldiwgInBvbGwgc3RhdHVzOiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byByZXNjaGVkdWxlOworCX0KKworCWlmIChpbnN0YW5jZS0+bGluZV9zdGF0dXMgPT0gYnVmW0NYSU5GX0xJTkVfU1RBVFVTXSkKKwkJZ290byByZXNjaGVkdWxlOworCisJaW5zdGFuY2UtPmxpbmVfc3RhdHVzID0gYnVmW0NYSU5GX0xJTkVfU1RBVFVTXTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW5lX3N0YXR1cykgeworCWNhc2UgMDoKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiBkb3duXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWRldl9pbmZvKGRldiwgIkFEU0wgbGluZTogYXR0ZW10cGluZyB0byBhY3RpdmF0ZVxuIik7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IHRyYWluaW5nXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWRldl9pbmZvKGRldiwgIkFEU0wgbGluZTogY2hhbm5lbCBhbmFseXNpc1xuIik7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IGV4Y2hhbmdlXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDU6CisJCWF0bV9kZXYtPmxpbmtfcmF0ZSA9IGJ1ZltDWElORl9ET1dOU1RSRUFNX1JBVEVdICogMTAwMCAvIDQyNDsKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfRk9VTkQ7CisKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiB1cCAoJWQga2IvcyBkb3duIHwgJWQga2IvcyB1cClcbiIsCisJCSAgICAgYnVmW0NYSU5GX0RPV05TVFJFQU1fUkFURV0sIGJ1ZltDWElORl9VUFNUUkVBTV9SQVRFXSk7CisJCWJyZWFrOworCisJY2FzZSA2OgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IHdhaXRpbmdcbiIpOworCQlicmVhazsKKworCWNhc2UgNzoKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiBpbml0aWFsaXppbmdcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisJCWRldl9pbmZvKGRldiwgIlVua25vd24gbGluZSBzdGF0ZSAlMDJ4XG4iLCBpbnN0YW5jZS0+bGluZV9zdGF0dXMpOworCQlicmVhazsKKwl9CityZXNjaGVkdWxlOgorCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPnBvbGxfd29yaywgbXNlY3NfdG9famlmZmllcyhQT0xMX0lOVEVSVkFMKSk7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X2Z3KHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCBlbnVtIGN4YWNydV9md19yZXF1ZXN0IGZ3LAorCQkgICAgIHU4IGNvZGUxLCB1OCBjb2RlMiwgdTMyIGFkZHIsIHU4ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0OworCXU4ICpidWY7CisJaW50IG9mZmQsIG9mZmI7CisJY29uc3QgaW50IHN0cmlkZSA9IENNRF9QQUNLRVRfU0laRSAtIDg7CisKKwlidWYgPSAodTggKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9mZmIgPSBvZmZkID0gMDsKKwlkbyB7CisJCWludCBsID0gbWluX3QoaW50LCBzdHJpZGUsIHNpemUgLSBvZmZkKTsKKwkJYnVmW29mZmIrK10gPSBmdzsKKwkJYnVmW29mZmIrK10gPSBsOworCQlidWZbb2ZmYisrXSA9IGNvZGUxOworCQlidWZbb2ZmYisrXSA9IGNvZGUyOworCQkqKCh1MzIgKikgKGJ1ZiArIG9mZmIpKSA9IGNwdV90b19sZTMyKGFkZHIpOworCQlvZmZiICs9IDQ7CisJCWFkZHIgKz0gbDsKKwkJaWYobCkKKwkJCW1lbWNweShidWYgKyBvZmZiLCBkYXRhICsgb2ZmZCwgbCk7CisJCWlmIChsIDwgc3RyaWRlKQorCQkJbWVtc2V0KGJ1ZiArIG9mZmIgKyBsLCAwLCBzdHJpZGUgLSBsKTsKKwkJb2ZmYiArPSBzdHJpZGU7CisJCW9mZmQgKz0gc3RyaWRlOworCQlpZiAoKG9mZmIgPj0gUEFHRV9TSVpFKSB8fCAob2ZmZCA+PSBzaXplKSkgeworCQkJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfQ01EKSwKKwkJCQkJICAgYnVmLCBvZmZiLCBOVUxMLCBDTURfVElNRU9VVCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRiZygic2VuZGluZyBmdyAlI3ggZmFpbGVkIiwgZncpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCW9mZmIgPSAwOworCQl9CisJfSB3aGlsZShvZmZkIDwgc2l6ZSk7CisJZGJnKCJzZW50IGZ3ICUjeCIsIGZ3KTsKKworCXJldCA9IDA7CisKK2NsZWFudXA6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGN4YWNydV91cGxvYWRfZmlybXdhcmUoc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqYnAsCisJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpjZikKK3sKKwlpbnQgcmV0OworCWludCBvZmY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnN0YW5jZS0+dXNiYXRtLT51c2JfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnN0YW5jZS0+dXNiYXRtLT51c2JfaW50Zi0+ZGV2OworCXUxNiBzaWduYXR1cmVbXSA9IHsgdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciwgdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgfTsKKwl1MzIgdmFsOworCisJZGJnKCJjeGFjcnVfdXBsb2FkX2Zpcm13YXJlIik7CisKKwkvKiBGaXJtd2FyZVBsbEZDbGtWYWx1ZSAqLworCXZhbCA9IGNwdV90b19sZTMyKGluc3RhbmNlLT5tb2RlbV90eXBlLT5wbGxfZl9jbGspOworCXJldCA9IGN4YWNydV9mdyh1c2JfZGV2LCBGV19XUklURV9NRU0sIDB4MiwgMHgwLCBQTExGQ0xLX0FERFIsICh1OCAqKSAmdmFsLCA0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmlybXdhcmVQbGxGQ2xrVmFsdWUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZpcm13YXJlUGxsQkNsa1ZhbHVlICovCisJdmFsID0gY3B1X3RvX2xlMzIoaW5zdGFuY2UtPm1vZGVtX3R5cGUtPnBsbF9iX2Nsayk7CisJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX1dSSVRFX01FTSwgMHgyLCAweDAsIFBMTEJDTEtfQUREUiwgKHU4ICopICZ2YWwsIDQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGaXJtd2FyZVBsbEJDbGtWYWx1ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJLyogRW5hYmxlIFNEUkFNICovCisJdmFsID0gY3B1X3RvX2xlMzIoU0RSQU1fRU5BKTsKKwlyZXQgPSBjeGFjcnVfZncodXNiX2RldiwgRldfV1JJVEVfTUVNLCAweDIsIDB4MCwgU0RSQU1FTl9BRERSLCAodTggKikgJnZhbCwgNCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkVuYWJsZSBTRFJBTSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJLyogRmlybXdhcmUgKi8KKwlyZXQgPSBjeGFjcnVfZncodXNiX2RldiwgRldfV1JJVEVfTUVNLCAweDIsIDB4MCwgRldfQUREUiwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmlybXdhcmUgdXBsb2FkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBCb290IFJPTSBwYXRjaCAqLworCWlmIChpbnN0YW5jZS0+bW9kZW1fdHlwZS0+Ym9vdF9yb21fcGF0Y2gpIHsKKwkJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX1dSSVRFX01FTSwgMHgyLCAweDAsIEJSX0FERFIsIGJwLT5kYXRhLCBicC0+c2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiQm9vdCBST00gcGF0Y2hpbmcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIFNpZ25hdHVyZSAqLworCXJldCA9IGN4YWNydV9mdyh1c2JfZGV2LCBGV19XUklURV9NRU0sIDB4MiwgMHgwLCBTSUdfQUREUiwgKHU4ICopIHNpZ25hdHVyZSwgNCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIlNpZ25hdHVyZSBzdG9yaW5nIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPm1vZGVtX3R5cGUtPmJvb3Rfcm9tX3BhdGNoKSB7CisJCXZhbCA9IGNwdV90b19sZTMyKEJSX0FERFIpOworCQlyZXQgPSBjeGFjcnVfZncodXNiX2RldiwgRldfV1JJVEVfTUVNLCAweDIsIDB4MCwgQlJfU1RBQ0tfQUREUiwgKHU4ICopICZ2YWwsIDQpOworCX0KKwllbHNlIHsKKwkJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX0dPVE9fTUVNLCAweDAsIDB4MCwgRldfQUREUiwgTlVMTCwgMCk7CisJfQorCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJQYXNzaW5nIGNvbnRyb2wgdG8gZmlybXdhcmUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIERlbGF5IHRvIGFsbG93IGZpcm13YXJlIHRvIHN0YXJ0IHVwLiAqLworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOworCisJdXNiX2NsZWFyX2hhbHQodXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpKTsKKwl1c2JfY2xlYXJfaGFsdCh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0NNRCkpOworCXVzYl9jbGVhcl9oYWx0KHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfREFUQSkpOworCXVzYl9jbGVhcl9oYWx0KHVzYl9kZXYsIHVzYl9yY3ZidWxrcGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfREFUQSkpOworCisJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NBUkRfR0VUX1NUQVRVUywgTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJtb2RlbSBmYWlsZWQgdG8gaW5pdGlhbGl6ZTogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBMb2FkIGNvbmZpZyBkYXRhIChsZTMyKSwgZG9pbmcgb25lIHBhY2tldCBhdCBhIHRpbWUgKi8KKwlpZiAoY2YpCisJCWZvciAob2ZmID0gMDsgb2ZmIDwgY2YtPnNpemUgLyA0OyApIHsKKwkJCXUzMiBidWZbQ01EX1BBQ0tFVF9TSVpFIC8gNCAtIDFdOworCQkJaW50IGksIGxlbiA9IG1pbl90KGludCwgY2YtPnNpemUgLyA0IC0gb2ZmLCBDTURfUEFDS0VUX1NJWkUgLyA0IC8gMiAtIDEpOworCQkJYnVmWzBdID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgb2ZmKyspIHsKKwkJCQlidWZbaSAqIDIgKyAxXSA9IGNwdV90b19sZTMyKG9mZik7CisJCQkJbWVtY3B5KGJ1ZiArIGkgKiAyICsgMiwgY2YtPmRhdGEgKyBvZmYgKiA0LCA0KTsKKwkJCX0KKwkJCXJldCA9IGN4YWNydV9jbShpbnN0YW5jZSwgQ01fUkVRVUVTVF9DQVJEX0RBVEFfU0VULAorCQkJCQkodTggKikgYnVmLCBsZW4sIE5VTEwsIDApOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGRldiwgImxvYWQgY29uZmlnIGRhdGEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDQwMDApOworfQorCitzdGF0aWMgaW50IGN4YWNydV9maW5kX2Zpcm13YXJlKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UsCisJCQkJY2hhciogcGhhc2UsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3X3ApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmluc3RhbmNlLT51c2JhdG0tPnVzYl9pbnRmLT5kZXY7CisJY2hhciBidWZbMTZdOworCisJc3ByaW50ZihidWYsICJjeGFjcnUtJXMuYmluIiwgcGhhc2UpOworCWRiZygiY3hhY3J1X2ZpbmRfZmlybXdhcmU6IGxvb2tpbmcgZm9yICVzIiwgYnVmKTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgZGV2KSkgeworCQlkZXZfZGJnKGRldiwgIm5vIHN0YWdlICVzIGZpcm13YXJlIGZvdW5kXG4iLCBwaGFzZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWRldl9pbmZvKGRldiwgImZvdW5kIGZpcm13YXJlICVzXG4iLCBidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X2hlYXZ5X2luaXQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCQkgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaW50ZikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXNiYXRtX2luc3RhbmNlLT51c2JfaW50Zi0+ZGV2OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsICpicCwgKmNmOworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhOworCisJaW50IHJldCA9IGN4YWNydV9maW5kX2Zpcm13YXJlKGluc3RhbmNlLCAiZnciLCAmZncpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZmlybXdhcmUgKGN4YWNydS1mdy5iaW4pIHVuYXZhaWxhYmxlIChob3RwbHVnIG1pc2NvbmZpZ3VyYXRpb24/KVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGluc3RhbmNlLT5tb2RlbV90eXBlLT5ib290X3JvbV9wYXRjaCkgeworCQlyZXQgPSBjeGFjcnVfZmluZF9maXJtd2FyZShpbnN0YW5jZSwgImJwIiwgJmJwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oZGV2LCAiYm9vdCBST00gcGF0Y2ggKGN4YWNydS1icC5iaW4pIHVuYXZhaWxhYmxlIChob3RwbHVnIG1pc2NvbmZpZ3VyYXRpb24/KVxuIik7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoY3hhY3J1X2ZpbmRfZmlybXdhcmUoaW5zdGFuY2UsICJjZiIsICZjZikpCQkvKiBvcHRpb25hbCAqLworCQljZiA9IE5VTEw7CisKKwljeGFjcnVfdXBsb2FkX2Zpcm13YXJlKGluc3RhbmNlLCBmdywgYnAsIGNmKTsKKworCWlmIChjZikKKwkJcmVsZWFzZV9maXJtd2FyZShjZik7CisJaWYgKGluc3RhbmNlLT5tb2RlbV90eXBlLT5ib290X3JvbV9wYXRjaCkKKwkJcmVsZWFzZV9maXJtd2FyZShicCk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXQgPSBjeGFjcnVfY2FyZF9zdGF0dXMoaW5zdGFuY2UpOworCWlmIChyZXQpCisJCWRiZygibW9kZW0gaW5pdGlhbGlzYXRpb24gZmFpbGVkIik7CisJZWxzZQorCQlkYmcoImRvbmUgc2V0dGluZyB1cCB0aGUgbW9kZW0iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3hhY3J1X2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCSAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAorCQkgICAgICAgaW50ICpuZWVkX2hlYXZ5X2luaXQpCit7CisJc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IHJldDsKKworCS8qIGluc3RhbmNlIGluaXQgKi8KKwlpbnN0YW5jZSA9IGttYWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UpIHsKKwkJZGJnKCJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChpbnN0YW5jZSwgMCwgc2l6ZW9mKCppbnN0YW5jZSkpOworCisJaW5zdGFuY2UtPnVzYmF0bSA9IHVzYmF0bV9pbnN0YW5jZTsKKwlpbnN0YW5jZS0+bW9kZW1fdHlwZSA9IChzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgKikgaWQtPmRyaXZlcl9pbmZvOworCisJaW5zdGFuY2UtPnJjdl9idWYgPSAodTggKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UtPnJjdl9idWYpIHsKKwkJZGJnKCJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciByY3ZfYnVmIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaW5zdGFuY2UtPnNuZF9idWYgPSAodTggKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UtPnNuZF9idWYpIHsKKwkJZGJnKCJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciBzbmRfYnVmIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaW5zdGFuY2UtPnJjdl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UtPnJjdl91cmIpIHsKKwkJZGJnKCJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciByY3ZfdXJiIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaW5zdGFuY2UtPnNuZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UtPnNuZF91cmIpIHsKKwkJZGJnKCJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciBzbmRfdXJiIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwl1c2JfZmlsbF9pbnRfdXJiKGluc3RhbmNlLT5yY3ZfdXJiLAorCQkJdXNiX2RldiwgdXNiX3JjdmludHBpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0NNRCksCisJCQlpbnN0YW5jZS0+cmN2X2J1ZiwgUEFHRV9TSVpFLAorCQkJY3hhY3J1X2Jsb2NraW5nX2NvbXBsZXRpb24sICZpbnN0YW5jZS0+cmN2X2RvbmUsIDEpOworCWluc3RhbmNlLT5yY3ZfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOworCisJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+c25kX3VyYiwKKwkJCXVzYl9kZXYsIHVzYl9zbmRpbnRwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpLAorCQkJaW5zdGFuY2UtPnNuZF9idWYsIFBBR0VfU0laRSwKKwkJCWN4YWNydV9ibG9ja2luZ19jb21wbGV0aW9uLCAmaW5zdGFuY2UtPnNuZF9kb25lLCA0KTsKKwlpbnN0YW5jZS0+c25kX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKKworCWluaXRfTVVURVgoJmluc3RhbmNlLT5jbV9zZXJpYWxpemUpOworCisJSU5JVF9XT1JLKCZpbnN0YW5jZS0+cG9sbF93b3JrLCAodm9pZCAqKWN4YWNydV9wb2xsX3N0YXR1cywgaW5zdGFuY2UpOworCisJdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YSA9IGluc3RhbmNlOworCisJKm5lZWRfaGVhdnlfaW5pdCA9IGN4YWNydV9jYXJkX3N0YXR1cyhpbnN0YW5jZSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbnN0YW5jZS0+c25kX2J1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbnN0YW5jZS0+cmN2X2J1Zik7CisJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5zbmRfdXJiKTsKKwl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnJjdl91cmIpOworCWtmcmVlKGluc3RhbmNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGN4YWNydV91bmJpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhOworCisJZGJnKCJjeGFjcnVfdW5iaW5kIGVudGVyZWQiKTsKKworCWlmICghaW5zdGFuY2UpIHsKKwkJZGJnKCJjeGFjcnVfdW5iaW5kOiBOVUxMIGluc3RhbmNlISIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+cG9sbF93b3JrKSkKKwkgICAgICAgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCXVzYl9raWxsX3VyYihpbnN0YW5jZS0+c25kX3VyYik7CisJdXNiX2tpbGxfdXJiKGluc3RhbmNlLT5yY3ZfdXJiKTsKKwl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnNuZF91cmIpOworCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+cmN2X3VyYik7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluc3RhbmNlLT5zbmRfYnVmKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluc3RhbmNlLT5yY3ZfYnVmKTsKKwlrZnJlZShpbnN0YW5jZSk7CisKKwl1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhID0gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSBjeGFjcnVfY2FmZSA9IHsKKwkucGxsX2ZfY2xrID0gMHgwMmQ4NzRkZiwKKwkucGxsX2JfY2xrID0gMHgwMTk2YTUxYSwKKwkuYm9vdF9yb21fcGF0Y2ggPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSBjeGFjcnVfY2IwMCA9IHsKKwkucGxsX2ZfY2xrID0gMHg1LAorCS5wbGxfYl9jbGsgPSAweDMsCisJLmJvb3Rfcm9tX3BhdGNoID0gMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjeGFjcnVfdXNiX2lkc1tdID0geworCXsgLyogViA9IENvbmV4YW50CQkJUCA9IEFEU0wgbW9kZW0gKEV1cGhyYXRlcyBwcm9qZWN0KQkqLworCQlVU0JfREVWSUNFKDB4MDU3MiwgMHhjYWZlKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2FmZQorCX0sCisJeyAvKiBWID0gQ29uZXhhbnQJCQlQID0gQURTTCBtb2RlbSAoSGFzYmFuaSBwcm9qZWN0KQkqLworCQlVU0JfREVWSUNFKDB4MDU3MiwgMHhjYjAwKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gQ29uZXhhbnQJCQlQID0gQURTTCBtb2RlbQkJCQkqLworCQlVU0JfREVWSUNFKDB4MDU3MiwgMHhjYjAxKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gQ29uZXhhbnQJCQlQID0gQURTTCBtb2RlbQkJCQkqLworCQlVU0JfREVWSUNFKDB4MDU3MiwgMHhjYjA2KSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gT2xpdGVjCQkJCVAgPSBBRFNMIG1vZGVtIHZlcnNpb24gMgkJKi8KKwkJVVNCX0RFVklDRSgweDA4ZTMsIDB4MDEwMCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NhZmUKKwl9LAorCXsgLyogViA9IE9saXRlYwkJCQlQID0gQURTTCBtb2RlbSB2ZXJzaW9uIDMJCSovCisJCVVTQl9ERVZJQ0UoMHgwOGUzLCAweDAxMDIpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7IC8qIFYgPSBUcnVzdC9BbWlnbyBUZWNobm9sb2d5IENvLglQID0gQU1YLUNBODZVCQkJCSovCisJCVVTQl9ERVZJQ0UoMHgwZWIwLCAweDM0NTcpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYWZlCisJfSwKKwl7IC8qIFYgPSBab29tCQkJCVAgPSA1NTEwCQkJCSovCisJCVVTQl9ERVZJQ0UoMHgxODAzLCAweDU1MTApLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7IC8qIFYgPSBEcmF5dGVrCQkJUCA9IFZpZ29yIDMxOAkJCQkqLworCQlVU0JfREVWSUNFKDB4MDY3NSwgMHgwMjAwKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gWnl4ZWwJCQkJUCA9IDYzMC1DMSBha2EgT01OSSBBRFNMIFVTQiAoQW5uZXggQSkJKi8KKwkJVVNCX0RFVklDRSgweDA1ODYsIDB4MzMwYSksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IFp5eGVsCQkJCVAgPSA2MzAtQzMgYWthIE9NTkkgQURTTCBVU0IgKEFubmV4IEIpCSovCisJCVVTQl9ERVZJQ0UoMHgwNTg2LCAweDMzMGIpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7IC8qIFYgPSBBZXRocmEJCQkJUCA9IFN0YXJtb2RlbSBVTTEwMjAJCQkqLworCQlVU0JfREVWSUNFKDB4MDY1OSwgMHgwMDIwKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gQXp0ZWNoIFN5c3RlbXMJCQlQID0gPyBBS0EgUGlyZWxsaSBBVUEtMDEwCQkqLworCQlVU0JfREVWSUNFKDB4MDUwOSwgMHgwODEyKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gTmV0b3BpYQkJCVAgPSBDYXltYW4gMzM0MShBbm5leCBBKS8zMzUxKEFubmV4IEIpCSovCisJCVVTQl9ERVZJQ0UoMHgxMDBkLCAweGNiMDEpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7IC8qIFYgPSBOZXRvcGlhCQkJUCA9IENheW1hbiAzMzQyKEFubmV4IEEpLzMzNTIoQW5uZXggQikJKi8KKwkJVVNCX0RFVklDRSgweDEwMGQsIDB4MzM0MiksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgY3hhY3J1X3VzYl9pZHMpOworCitzdGF0aWMgc3RydWN0IHVzYmF0bV9kcml2ZXIgY3hhY3J1X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gY3hhY3J1X2RyaXZlcl9uYW1lLAorCS5iaW5kCQk9IGN4YWNydV9iaW5kLAorCS5oZWF2eV9pbml0CT0gY3hhY3J1X2hlYXZ5X2luaXQsCisJLnVuYmluZAkJPSBjeGFjcnVfdW5iaW5kLAorCS5hdG1fc3RhcnQJPSBjeGFjcnVfYXRtX3N0YXJ0LAorCS5pbgkJPSBDWEFDUlVfRVBfREFUQSwKKwkub3V0CQk9IENYQUNSVV9FUF9EQVRBLAorCS5yeF9wYWRkaW5nCT0gMywKKwkudHhfcGFkZGluZwk9IDExLAorfTsKKworc3RhdGljIGludCBjeGFjcnVfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHVzYmF0bV91c2JfcHJvYmUoaW50ZiwgaWQsICZjeGFjcnVfZHJpdmVyKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGN4YWNydV91c2JfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSBjeGFjcnVfZHJpdmVyX25hbWUsCisJLnByb2JlCQk9IGN4YWNydV91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gY3hhY3J1X3VzYl9pZHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGN4YWNydV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmY3hhY3J1X3VzYl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3hhY3J1X2NsZWFudXAodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmY3hhY3J1X3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjeGFjcnVfaW5pdCk7Cittb2R1bGVfZXhpdChjeGFjcnVfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwppbmRleCAyYTE2OTdiLi42YmQ1ODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYworKysgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwpAQCAtNSw2ICs1LDggQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIER1bmNhbiBTYW5kcwogICogIENvcHlyaWdodCAoQykgMjAwNCwgRGF2aWQgV29vZGhvdXNlCiAgKgorICogIEJhc2VkIG9uICJtb2RlbV9ydW4uYyIsIGNvcHlyaWdodCAoQykgMjAwMSwgQmVub2l0IFBhcGlsbGF1bHQKKyAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKQEAgLTIxLDQ2NyArMjMsMTkxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKLSNpbmNsdWRlICJ1c2JfYXRtLmgiCi0KLSNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCi0jCWRlZmluZSBVU0VfRldfTE9BREVSCi0jZW5kaWYKKyNpbmNsdWRlICJ1c2JhdG0uaCIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKb2hhbiBWZXJyZXB0LCBEdW5jYW4gU2FuZHMgPGR1bmNhbi5zYW5kc0BmcmVlLmZyPiIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEuOCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEuOSIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkFsY2F0ZWwgU3BlZWRUb3VjaCBVU0IgZHJpdmVyIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTgogCiBzdGF0aWMgY29uc3QgY2hhciBzcGVlZHRjaF9kcml2ZXJfbmFtZVtdID0gInNwZWVkdGNoIjsKIAotI2RlZmluZSBTUEVFRFRPVUNIX1ZFTkRPUklECQkweDA2YjkKLSNkZWZpbmUgU1BFRURUT1VDSF9QUk9EVUNUSUQJCTB4NDA2MQorI2RlZmluZSBDVFJMX1RJTUVPVVQgMjAwMAkvKiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgREFUQV9USU1FT1VUIDIwMDAJLyogbWlsbGlzZWNvbmRzICovCiAKLS8qIFRpbWVvdXQgaW4gamlmZmllcyAqLwotI2RlZmluZSBDVFJMX1RJTUVPVVQgMjAwMAotI2RlZmluZSBEQVRBX1RJTUVPVVQgMjAwMAorI2RlZmluZSBPRkZTRVRfNwkwCQkvKiBzaXplIDEgKi8KKyNkZWZpbmUgT0ZGU0VUX2IJMQkJLyogc2l6ZSA4ICovCisjZGVmaW5lIE9GRlNFVF9kCTkJCS8qIHNpemUgNCAqLworI2RlZmluZSBPRkZTRVRfZQkxMwkJLyogc2l6ZSAxICovCisjZGVmaW5lIE9GRlNFVF9mCTE0CQkvKiBzaXplIDEgKi8KKyNkZWZpbmUgVE9UQUwJCTE1CiAKLSNkZWZpbmUgT0ZGU0VUXzcgIDAJCS8qIHNpemUgMSAqLwotI2RlZmluZSBPRkZTRVRfYiAgMQkJLyogc2l6ZSA4ICovCi0jZGVmaW5lIE9GRlNFVF9kICA5CQkvKiBzaXplIDQgKi8KLSNkZWZpbmUgT0ZGU0VUX2UgMTMJCS8qIHNpemUgMSAqLwotI2RlZmluZSBPRkZTRVRfZiAxNAkJLyogc2l6ZSAxICovCi0jZGVmaW5lIFRPVEFMICAgIDE1CisjZGVmaW5lIFNJWkVfNwkJMQorI2RlZmluZSBTSVpFX2IJCTgKKyNkZWZpbmUgU0laRV9kCQk0CisjZGVmaW5lIFNJWkVfZQkJMQorI2RlZmluZSBTSVpFX2YJCTEKIAotI2RlZmluZSBTSVpFXzcgMQotI2RlZmluZSBTSVpFX2IgOAotI2RlZmluZSBTSVpFX2QgNAotI2RlZmluZSBTSVpFX2UgMQotI2RlZmluZSBTSVpFX2YgMQorI2RlZmluZSBNSU5fUE9MTF9ERUxBWQkJNTAwMAkvKiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgTUFYX1BPTExfREVMQVkJCTYwMDAwCS8qIG1pbGxpc2Vjb25kcyAqLwogCi1zdGF0aWMgaW50IGRsXzUxMl9maXJzdCA9IDA7Ci1zdGF0aWMgaW50IHN3X2J1ZmZlcmluZyA9IDA7CisjZGVmaW5lIFJFU1VCTUlUX0RFTEFZCQkxMDAwCS8qIG1pbGxpc2Vjb25kcyAqLwogCi1tb2R1bGVfcGFyYW0oZGxfNTEyX2ZpcnN0LCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGxfNTEyX2ZpcnN0LCAiUmVhZCA1MTIgYnl0ZXMgYmVmb3JlIHNlbmRpbmcgZmlybXdhcmUiKTsKKyNkZWZpbmUgREVGQVVMVF9BTFRTRVRUSU5HCTEKKyNkZWZpbmUgREVGQVVMVF9ETF81MTJfRklSU1QJMAorI2RlZmluZSBERUZBVUxUX1NXX0JVRkZFUklORwkwCiAKLW1vZHVsZV9wYXJhbShzd19idWZmZXJpbmcsIHVpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzd19idWZmZXJpbmcsICJFbmFibGUgc29mdHdhcmUgYnVmZmVyaW5nIik7CitzdGF0aWMgaW50IGFsdHNldHRpbmcgPSBERUZBVUxUX0FMVFNFVFRJTkc7CitzdGF0aWMgaW50IGRsXzUxMl9maXJzdCA9IERFRkFVTFRfRExfNTEyX0ZJUlNUOworc3RhdGljIGludCBzd19idWZmZXJpbmcgPSBERUZBVUxUX1NXX0JVRkZFUklORzsKIAotI2RlZmluZSBVRFNMX0lPQ1RMX0xJTkVfVVAJCTEKLSNkZWZpbmUgVURTTF9JT0NUTF9MSU5FX0RPV04JCTIKK21vZHVsZV9wYXJhbShhbHRzZXR0aW5nLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoYWx0c2V0dGluZywKKwkJICJBbHRlcm5hdGl2ZSBzZXR0aW5nIGZvciBkYXRhIGludGVyZmFjZSAoZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfQUxUU0VUVElORykgIikiKTsKIAotI2RlZmluZSBTUEVFRFRDSF9FTkRQT0lOVF9JTlQJCTB4ODEKLSNkZWZpbmUgU1BFRURUQ0hfRU5EUE9JTlRfREFUQQkJMHgwNwotI2RlZmluZSBTUEVFRFRDSF9FTkRQT0lOVF9GSVJNV0FSRQkweDA1Cittb2R1bGVfcGFyYW0oZGxfNTEyX2ZpcnN0LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRsXzUxMl9maXJzdCwKKwkJICJSZWFkIDUxMiBieXRlcyBiZWZvcmUgc2VuZGluZyBmaXJtd2FyZSAoZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfRExfNTEyX0ZJUlNUKSAiKSIpOworCittb2R1bGVfcGFyYW0oc3dfYnVmZmVyaW5nLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHN3X2J1ZmZlcmluZywKKwkJICJFbmFibGUgc29mdHdhcmUgYnVmZmVyaW5nIChkZWZhdWx0OiAiCisJCSBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9TV19CVUZGRVJJTkcpICIpIik7CisKKyNkZWZpbmUgRU5EUE9JTlRfSU5UCQkweDgxCisjZGVmaW5lIEVORFBPSU5UX0RBVEEJCTB4MDcKKyNkZWZpbmUgRU5EUE9JTlRfRklSTVdBUkUJMHgwNQogCiAjZGVmaW5lIGhleDJpbnQoYykgKCAoYyA+PSAnMCcpICYmIChjIDw9ICc5JykgPyAoYyAtICcwJykgOiAoKGMgJiAweGYpICsgOSkgKQogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc3BlZWR0Y2hfdXNiX2lkc1tdID0gewotCXtVU0JfREVWSUNFKFNQRUVEVE9VQ0hfVkVORE9SSUQsIFNQRUVEVE9VQ0hfUFJPRFVDVElEKX0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzcGVlZHRjaF91c2JfaWRzKTsKLQogc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgewotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgdTsKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bTsKIAotCS8qIFN0YXR1cyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGF0dXNfY2hlY2tlcjsKKworCXVuc2lnbmVkIGNoYXIgbGFzdF9zdGF0dXM7CisKKwlpbnQgcG9sbF9kZWxheTsgLyogbWlsbGlzZWNvbmRzICovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCByZXN1Ym1pdF90aW1lcjsKIAlzdHJ1Y3QgdXJiICppbnRfdXJiOwogCXVuc2lnbmVkIGNoYXIgaW50X2RhdGFbMTZdOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcms7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsKLX07Ci0vKiBVU0IgKi8KIAotc3RhdGljIGludCBzcGVlZHRjaF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwotc3RhdGljIHZvaWQgc3BlZWR0Y2hfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotc3RhdGljIGludCBzcGVlZHRjaF91c2JfaW9jdGwoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHVuc2lnbmVkIGludCBjb2RlLAotCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX2hhbmRsZV9pbnQoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZCBzcGVlZHRjaF9wb2xsX3N0YXR1cyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpOwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc3BlZWR0Y2hfdXNiX2RyaXZlciA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gc3BlZWR0Y2hfZHJpdmVyX25hbWUsCi0JLnByb2JlCQk9IHNwZWVkdGNoX3VzYl9wcm9iZSwKLQkuZGlzY29ubmVjdAk9IHNwZWVkdGNoX3VzYl9kaXNjb25uZWN0LAotCS5pb2N0bAkJPSBzcGVlZHRjaF91c2JfaW9jdGwsCi0JLmlkX3RhYmxlCT0gc3BlZWR0Y2hfdXNiX2lkcywKKwl1bnNpZ25lZCBjaGFyIHNjcmF0Y2hfYnVmZmVyW1RPVEFMXTsKIH07CiAKIC8qKioqKioqKioqKioqKioKICoqICBmaXJtd2FyZSAgKioKICoqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3BlZWR0Y2hfZ290X2Zpcm13YXJlKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCQkgIGludCBnb3RfaXQpCitzdGF0aWMgdm9pZCBzcGVlZHRjaF9zZXRfc3didWZmKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwgaW50IHN0YXRlKQogewotCWludCBlcnI7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7Ci0KLQlkb3duKCZpbnN0YW5jZS0+dS5zZXJpYWxpemUpOwkvKiB2cyBzZWxmLCBzcGVlZHRjaF9maXJtd2FyZV9zdGFydCAqLwotCWlmIChpbnN0YW5jZS0+dS5zdGF0dXMgPT0gVURTTF9MT0FERURfRklSTVdBUkUpCi0JCWdvdG8gb3V0OwotCWlmICghZ290X2l0KSB7Ci0JCWluc3RhbmNlLT51LnN0YXR1cyA9IFVEU0xfTk9fRklSTVdBUkU7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoKGVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGluc3RhbmNlLT51LnVzYl9kZXYsIDEsIDEpKSA8IDApIHsKLQkJZGJnKCJzcGVlZHRjaF9nb3RfZmlybXdhcmU6IHVzYl9zZXRfaW50ZXJmYWNlIHJldHVybmVkICVkISIsIGVycik7Ci0JCWluc3RhbmNlLT51LnN0YXR1cyA9IFVEU0xfTk9fRklSTVdBUkU7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFNldCB1cCBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KLQlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGluc3RhbmNlLT51LnVzYl9kZXYsIDApOwotCWlmIChpbnRmICYmICF1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmc3BlZWR0Y2hfdXNiX2RyaXZlciwgaW50ZiwgTlVMTCkpIHsKLQotCQlpbnN0YW5jZS0+aW50X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChpbnN0YW5jZS0+aW50X3VyYikgewotCi0JCQl1c2JfZmlsbF9pbnRfdXJiKGluc3RhbmNlLT5pbnRfdXJiLCBpbnN0YW5jZS0+dS51c2JfZGV2LAotCQkJCQkgdXNiX3JjdmludHBpcGUoaW5zdGFuY2UtPnUudXNiX2RldiwgU1BFRURUQ0hfRU5EUE9JTlRfSU5UKSwKLQkJCQkJIGluc3RhbmNlLT5pbnRfZGF0YSwKLQkJCQkJIHNpemVvZihpbnN0YW5jZS0+aW50X2RhdGEpLAotCQkJCQkgc3BlZWR0Y2hfaGFuZGxlX2ludCwgaW5zdGFuY2UsIDUwKTsKLQkJCWVyciA9IHVzYl9zdWJtaXRfdXJiKGluc3RhbmNlLT5pbnRfdXJiLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChlcnIpIHsKLQkJCQkvKiBEb2Vzbid0IG1hdHRlcjsgd2UnbGwgcG9sbCBhbnl3YXkgKi8KLQkJCQlkYmcoInNwZWVkdGNoX2dvdF9maXJtd2FyZTogU3VibWlzc2lvbiBvZiBpbnRlcnJ1cHQgVVJCIGZhaWxlZCAlZCIsIGVycik7Ci0JCQkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5pbnRfdXJiKTsKLQkJCQlpbnN0YW5jZS0+aW50X3VyYiA9IE5VTEw7Ci0JCQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmc3BlZWR0Y2hfdXNiX2RyaXZlciwgaW50Zik7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogU3RhcnQgc3RhdHVzIHBvbGxpbmcgKi8KLQltb2RfdGltZXIoJmluc3RhbmNlLT5wb2xsX3RpbWVyLCBqaWZmaWVzICsgKDEgKiBIWikpOwotCi0JaW5zdGFuY2UtPnUuc3RhdHVzID0gVURTTF9MT0FERURfRklSTVdBUkU7Ci0JdGFza2xldF9zY2hlZHVsZSgmaW5zdGFuY2UtPnUucmVjZWl2ZV90YXNrbGV0KTsKLSBvdXQ6Ci0JdXAoJmluc3RhbmNlLT51LnNlcmlhbGl6ZSk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+dS5maXJtd2FyZV93YWl0ZXJzKTsKLX0KLQotc3RhdGljIGludCBzcGVlZHRjaF9zZXRfc3didWZmKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCSAgICAgICBpbnQgc3RhdGUpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGluc3RhbmNlLT51LnVzYl9kZXY7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXNiYXRtLT51c2JfZGV2OwogCWludCByZXQ7CiAKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MzIsIDB4NDAsIHN0YXRlID8gMHgwMSA6IDB4MDAsCi0JCQkgICAgICAweDAwLCBOVUxMLCAwLCAxMDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiV2FybmluZzogJXNhYmxpbmcgU1cgYnVmZmVyaW5nOiB1c2JfY29udHJvbF9tc2cgcmV0dXJuZWQgJWRcbiIsCi0JCSAgICAgc3RhdGUgPyAiRW4iIDogIkRpcyIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGJnKCJzcGVlZHRjaF9zZXRfc3didWZmOiAlc2JsZWQgU1cgYnVmZmVyaW5nIiwgc3RhdGUgPyAiRW4iIDogIkRpcyIpOwotCXJldHVybiAwOworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDMyLCAweDQwLCBzdGF0ZSA/IDB4MDEgOiAweDAwLCAweDAwLCBOVUxMLCAwLCBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKQorCQl1c2Jfd2Fybih1c2JhdG0sCisJCQkgIiVzYWJsaW5nIFNXIGJ1ZmZlcmluZzogdXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVkXG4iLAorCQkJIHN0YXRlID8gIkVuIiA6ICJEaXMiLCByZXQpOworCWVsc2UKKwkJZGJnKCJzcGVlZHRjaF9zZXRfc3didWZmOiAlc2JsZWQgU1cgYnVmZmVyaW5nIiwgc3RhdGUgPyAiRW4iIDogIkRpcyIpOwogfQogCiBzdGF0aWMgdm9pZCBzcGVlZHRjaF90ZXN0X3NlcXVlbmNlKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW5zdGFuY2UtPnUudXNiX2RldjsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXNiYXRtLT51c2JfZGV2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGluc3RhbmNlLT5zY3JhdGNoX2J1ZmZlcjsKIAlpbnQgcmV0OwogCiAJLyogVVJCIDE0NyAqLwogCWJ1ZlswXSA9IDB4MWM7CiAJYnVmWzFdID0gMHg1MDsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MGIsIDB4MDAsIGJ1ZiwgMiwgMTAwKTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgwMSwgMHg0MCwgMHgwYiwgMHgwMCwgYnVmLCAyLCBDVFJMX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBmYWlsZWQgb24gVVJCMTQ3OiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXVzYl93YXJuKHVzYmF0bSwgIiVzIGZhaWxlZCBvbiBVUkIxNDc6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAogCS8qIFVSQiAxNDggKi8KIAlidWZbMF0gPSAweDMyOwogCWJ1ZlsxXSA9IDB4MDA7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDAxLCAweDQwLCAweDAyLCAweDAwLCBidWYsIDIsIDEwMCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MDIsIDB4MDAsIGJ1ZiwgMiwgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIG9uIFVSQjE0ODogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCMTQ4OiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKIAkvKiBVUkIgMTQ5ICovCiAJYnVmWzBdID0gMHgwMTsKIAlidWZbMV0gPSAweDAwOwogCWJ1ZlsyXSA9IDB4MDE7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDAxLCAweDQwLCAweDAzLCAweDAwLCBidWYsIDMsIDEwMCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MDMsIDB4MDAsIGJ1ZiwgMywgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIG9uIFVSQjE0OTogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCMTQ5OiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKIAkvKiBVUkIgMTUwICovCiAJYnVmWzBdID0gMHgwMTsKIAlidWZbMV0gPSAweDAwOwogCWJ1ZlsyXSA9IDB4MDE7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDAxLCAweDQwLCAweDA0LCAweDAwLCBidWYsIDMsIDEwMCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MDQsIDB4MDAsIGJ1ZiwgMywgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIG9uIFVSQjE1MDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCMTUwOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiB9CiAKLXN0YXRpYyBpbnQgc3BlZWR0Y2hfc3RhcnRfc3luY2hybyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGluc3RhbmNlLT51LnVzYl9kZXY7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwNCwgMHgwMCwKLQkJCSAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksIENUUkxfVElNRU9VVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3BlZWRUb3VjaDogRmFpbGVkIHRvIHN0YXJ0IEFEU0wgc3luY2hyb25pc2F0aW9uOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlkYmcoInNwZWVkdGNoX3N0YXJ0X3N5bmNocm86IG1vZGVtIHByb2RkZWQuICVkIEJ5dGVzIHJldHVybmVkOiAlMDJ4ICUwMngiLCByZXQsIGJ1ZlswXSwgYnVmWzFdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3BlZWR0Y2hfaGFuZGxlX2ludChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVyYi0+Y29udGV4dDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0JaW50IHJldDsKLQotCS8qIFRoZSBtYWdpYyBpbnRlcnJ1cHQgZm9yICJ1cCBzdGF0ZSIgKi8KLQljb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciB1cF9pbnRbNl0gICA9IHsgMHhhMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCS8qIFRoZSBtYWdpYyBpbnRlcnJ1cHQgZm9yICJkb3duIHN0YXRlIiAqLwotCWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRvd25faW50WzZdID0geyAweGExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZDsgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoY291bnQgPCA2KSB7Ci0JCWRiZygiJXMgLSBpbnQgcGFja2V0IHRvbyBzaG9ydCIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghbWVtY21wKHVwX2ludCwgaW5zdGFuY2UtPmludF9kYXRhLCA2KSkgewotCQlkZWxfdGltZXIoJmluc3RhbmNlLT5wb2xsX3RpbWVyKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJEU0wgbGluZSBnb2VzIHVwXG4iKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAoZG93bl9pbnQsIGluc3RhbmNlLT5pbnRfZGF0YSwgNikpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJEU0wgbGluZSBnb2VzIGRvd25cbiIpOwotCX0gZWxzZSB7Ci0JCWludCBpOwotCi0JCXByaW50ayhLRVJOX0RFQlVHICJVbmtub3duIGludGVycnVwdCBwYWNrZXQgb2YgJWQgYnl0ZXM6IiwgY291bnQpOwotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCXByaW50aygiICUwMngiLCBpbnN0YW5jZS0+aW50X2RhdGFbaV0pOwotCQlwcmludGsoIlxuIik7Ci0JfQotCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT5wb2xsX3dvcmspOwotCi0gZXhpdDoKLQlybWIoKTsKLQlpZiAoIWluc3RhbmNlLT5pbnRfdXJiKQotCQlyZXR1cm47Ci0KLQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpCi0JCWVycigiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKLX0KLQotc3RhdGljIGludCBzcGVlZHRjaF9nZXRfc3RhdHVzKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGluc3RhbmNlLT51LnVzYl9kZXY7Ci0JaW50IHJldDsKLQotCW1lbXNldChidWYsIDAsIFRPVEFMKTsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwNywgMHgwMCwgYnVmICsgT0ZGU0VUXzcsIFNJWkVfNywKLQkJCSAgICAgIENUUkxfVElNRU9VVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJNU0cgNyBmYWlsZWQiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MGIsIDB4MDAsIGJ1ZiArIE9GRlNFVF9iLCBTSVpFX2IsCi0JCQkgICAgICBDVFJMX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygiTVNHIEIgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDEyLCAweGMwLCAweDBkLCAweDAwLCBidWYgKyBPRkZTRVRfZCwgU0laRV9kLAotCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoIk1TRyBEIGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgwMSwgMHhjMCwgMHgwZSwgMHgwMCwgYnVmICsgT0ZGU0VUX2UsIFNJWkVfZSwKLQkJCSAgICAgIENUUkxfVElNRU9VVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJNU0cgRSBmYWlsZWQiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MDEsIDB4YzAsIDB4MGYsIDB4MDAsIGJ1ZiArIE9GRlNFVF9mLCBTSVpFX2YsCi0JCQkgICAgICBDVFJMX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygiTVNHIEYgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwZWVkdGNoX3BvbGxfc3RhdHVzKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltUT1RBTF07Ci0JaW50IHJldDsKLQotCXJldCA9IHNwZWVkdGNoX2dldF9zdGF0dXMoaW5zdGFuY2UsIGJ1Zik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiU3BlZWRUb3VjaDogRXJyb3IgJWQgZmV0Y2hpbmcgZGV2aWNlIHN0YXR1c1xuIiwgcmV0KTsKLQkJcmV0dXJuOwotCX0KLQotCWRiZygiTGluZSBzdGF0ZSAlMDJ4IiwgYnVmW09GRlNFVF83XSk7Ci0KLQlzd2l0Y2ggKGJ1ZltPRkZTRVRfN10pIHsKLQljYXNlIDA6Ci0JCWlmIChpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgIT0gQVRNX1BIWV9TSUdfTE9TVCkgewotCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiQURTTCBsaW5lIGlzIGRvd25cbiIpOwotCQkJLyogSXQnbGwgbmV2ZXIgcmVzeW5jIGFnYWluIHVubGVzcyB3ZSBhc2sgaXQgdG8uLi4gKi8KLQkJCXNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oaW5zdGFuY2UpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAweDA4OgotCQlpZiAoaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX1VOS05PV04pIHsKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFEU0wgbGluZSBpcyBibG9ja2VkP1xuIik7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDB4MTA6Ci0JCWlmIChpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgIT0gQVRNX1BIWV9TSUdfTE9TVCkgewotCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiQURTTCBsaW5lIGlzIHN5bmNocm9uaXNpbmdcbiIpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAweDIwOgotCQlpZiAoaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0ZPVU5EKSB7Ci0JCQlpbnQgZG93bl9zcGVlZCA9IGJ1ZltPRkZTRVRfYl0gfCAoYnVmW09GRlNFVF9iICsgMV0gPDwgOCkKLQkJCQl8IChidWZbT0ZGU0VUX2IgKyAyXSA8PCAxNikgfCAoYnVmW09GRlNFVF9iICsgM10gPDwgMjQpOwotCQkJaW50IHVwX3NwZWVkID0gYnVmW09GRlNFVF9iICsgNF0gfCAoYnVmW09GRlNFVF9iICsgNV0gPDwgOCkKLQkJCQl8IChidWZbT0ZGU0VUX2IgKyA2XSA8PCAxNikgfCAoYnVmW09GRlNFVF9iICsgN10gPDwgMjQpOwotCi0JCQlpZiAoIShkb3duX3NwZWVkICYgMHgwMDAwZmZmZikgJiYKLQkJCSAgICAhKHVwX3NwZWVkICYgMHgwMDAwZmZmZikpIHsKLQkJCQlkb3duX3NwZWVkID4+PSAxNjsKLQkJCQl1cF9zcGVlZCA+Pj0gMTY7Ci0JCQl9Ci0JCQlpbnN0YW5jZS0+dS5hdG1fZGV2LT5saW5rX3JhdGUgPSBkb3duX3NwZWVkICogMTAwMCAvIDQyNDsKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOwotCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCSAgICAgICAiQURTTCBsaW5lIGlzIHVwICglZCBLaWIvcyBkb3duIHwgJWQgS2liL3MgdXApXG4iLAotCQkJICAgICAgIGRvd25fc3BlZWQsIHVwX3NwZWVkKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWlmIChpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgIT0gQVRNX1BIWV9TSUdfVU5LTk9XTikgewotCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBsaW5lIHN0YXRlICUwMnhcbiIsIGJ1ZltPRkZTRVRfN10pOwotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3BlZWR0Y2hfdGltZXJfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gKHZvaWQgKilkYXRhOwotCi0Jc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPnBvbGxfd29yayk7Ci0JbW9kX3RpbWVyKCZpbnN0YW5jZS0+cG9sbF90aW1lciwgamlmZmllcyArICg1ICogSFopKTsKLX0KLQotI2lmZGVmIFVTRV9GV19MT0FERVIKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCitzdGF0aWMgaW50IHNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3MSwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncyKQogewogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGluc3RhbmNlLT51LnVzYl9kZXY7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwotCWludCBhY3R1YWxfbGVuZ3RoLCByZXQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1c2JhdG0tPnVzYl9kZXY7CisJaW50IGFjdHVhbF9sZW5ndGg7CisJaW50IHJldCA9IDA7CiAJaW50IG9mZnNldDsKIAotCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlIik7Ci0KLQlpZiAoIShpbnRmID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsIDIpKSkgewotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogaW50ZXJmYWNlIG5vdCBmb3VuZCEiKTsKLQkJZ290byBmYWlsOwotCX0KKwl1c2JfZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAogCWlmICghKGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkgewotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogbm8gbWVtb3J5IGZvciBidWZmZXIhIik7Ci0JCWdvdG8gZmFpbDsKKwkJcmV0ID0gLUVOT01FTTsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogbm8gbWVtb3J5IGZvciBidWZmZXIhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OwogCX0KIAotCS8qIEEgdXNlci1zcGFjZSBmaXJtd2FyZSBsb2FkZXIgbWF5IGFscmVhZHkgaGF2ZSBjbGFpbWVkIGludGVyZmFjZSAjMiAqLwotCWlmICgocmV0ID0KLQkgICAgIHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZzcGVlZHRjaF91c2JfZHJpdmVyLCBpbnRmLCBOVUxMKSkgPCAwKSB7Ci0JCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlOiBpbnRlcmZhY2UgaW4gdXNlICglZCkhIiwgcmV0KTsKLQkJZ290byBmYWlsX2ZyZWU7CisJaWYgKCEoaW50ZiA9IHVzYl9pZm51bV90b19pZih1c2JfZGV2LCAyKSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogaW50ZXJmYWNlIG5vdCBmb3VuZCFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAkvKiBVUkIgNyAqLwogCWlmIChkbF81MTJfZmlyc3QpIHsJLyogc29tZSBtb2RlbXMgbmVlZCBhIHJlYWQgYmVmb3JlIHdyaXRpbmcgdGhlIGZpcm13YXJlICovCi0JCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgU1BFRURUQ0hfRU5EUE9JTlRfRklSTVdBUkUpLAorCQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIEVORFBPSU5UX0ZJUk1XQVJFKSwKIAkJCQkgICBidWZmZXIsIDB4MjAwLCAmYWN0dWFsX2xlbmd0aCwgMjAwMCk7CiAKIAkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FVElNRURPVVQpCi0JCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogcmVhZCBCTE9DSzAgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSEiLCByZXQpOworCQkJdXNiX2RiZyh1c2JhdG0sICIlczogcmVhZCBCTE9DSzAgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOwogCQllbHNlCi0JCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogQkxPQ0swIGRvd25sb2FkZWQgKCVkIGJ5dGVzKSIsIHJldCk7CisJCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiBCTE9DSzAgZG93bmxvYWRlZCAoJWQgYnl0ZXMpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAl9CiAKIAkvKiBVUkIgOCA6IGJvdGggbGVkcyBhcmUgc3RhdGljIGdyZWVuICovCkBAIC00ODksNjAgKzIxNSw2MCBAQAogCQlpbnQgdGhpc2xlbiA9IG1pbl90KGludCwgUEFHRV9TSVpFLCBmdzEtPnNpemUgLSBvZmZzZXQpOwogCQltZW1jcHkoYnVmZmVyLCBmdzEtPmRhdGEgKyBvZmZzZXQsIHRoaXNsZW4pOwogCi0JCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgU1BFRURUQ0hfRU5EUE9JTlRfRklSTVdBUkUpLAorCQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIEVORFBPSU5UX0ZJUk1XQVJFKSwKIAkJCQkgICBidWZmZXIsIHRoaXNsZW4sICZhY3R1YWxfbGVuZ3RoLCBEQVRBX1RJTUVPVVQpOwogCiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogd3JpdGUgQkxPQ0sxIHRvIG1vZGVtIGZhaWxlZCAoJWQpISIsIHJldCk7Ci0JCQlnb3RvIGZhaWxfcmVsZWFzZTsKKwkJCXVzYl9kYmcodXNiYXRtLCAiJXM6IHdyaXRlIEJMT0NLMSB0byBtb2RlbSBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOworCQkJZ290byBvdXRfZnJlZTsKIAkJfQotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogQkxPQ0sxIHVwbG9hZGVkICglenUgYnl0ZXMpIiwgZncxLT5zaXplKTsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogQkxPQ0sxIHVwbG9hZGVkICglenUgYnl0ZXMpXG4iLCBfX2Z1bmNfXywgZncxLT5zaXplKTsKIAl9CiAKIAkvKiBVU0IgbGVkIGJsaW5raW5nIGdyZWVuLCBBRFNMIGxlZCBvZmYgKi8KIAogCS8qIFVSQiAxMSAqLwotCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgU1BFRURUQ0hfRU5EUE9JTlRfRklSTVdBUkUpLAorCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgRU5EUE9JTlRfRklSTVdBUkUpLAogCQkJICAgYnVmZmVyLCAweDIwMCwgJmFjdHVhbF9sZW5ndGgsIERBVEFfVElNRU9VVCk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogcmVhZCBCTE9DSzIgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSEiLCByZXQpOwotCQlnb3RvIGZhaWxfcmVsZWFzZTsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogcmVhZCBCTE9DSzIgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIG91dF9mcmVlOwogCX0KLQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogQkxPQ0syIGRvd25sb2FkZWQgKCVkIGJ5dGVzKSIsIGFjdHVhbF9sZW5ndGgpOworCXVzYl9kYmcodXNiYXRtLCAiJXM6IEJMT0NLMiBkb3dubG9hZGVkICglZCBieXRlcylcbiIsIF9fZnVuY19fLCBhY3R1YWxfbGVuZ3RoKTsKIAogCS8qIFVSQnMgMTIgdG8gMTM5IC0gVVNCIGxlZCBibGlua2luZyBncmVlbiwgQURTTCBsZWQgb2ZmICovCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBmdzItPnNpemU7IG9mZnNldCArPSBQQUdFX1NJWkUpIHsKIAkJaW50IHRoaXNsZW4gPSBtaW5fdChpbnQsIFBBR0VfU0laRSwgZncyLT5zaXplIC0gb2Zmc2V0KTsKIAkJbWVtY3B5KGJ1ZmZlciwgZncyLT5kYXRhICsgb2Zmc2V0LCB0aGlzbGVuKTsKIAotCQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIFNQRUVEVENIX0VORFBPSU5UX0ZJUk1XQVJFKSwKKwkJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9GSVJNV0FSRSksCiAJCQkJICAgYnVmZmVyLCB0aGlzbGVuLCAmYWN0dWFsX2xlbmd0aCwgREFUQV9USU1FT1VUKTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IHdyaXRlIEJMT0NLMyB0byBtb2RlbSBmYWlsZWQgKCVkKSEiLCByZXQpOwotCQkJZ290byBmYWlsX3JlbGVhc2U7CisJCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiB3cml0ZSBCTE9DSzMgdG8gbW9kZW0gZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAl9Ci0JZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IEJMT0NLMyB1cGxvYWRlZCAoJXp1IGJ5dGVzKSIsIGZ3Mi0+c2l6ZSk7CisJdXNiX2RiZyh1c2JhdG0sICIlczogQkxPQ0szIHVwbG9hZGVkICglenUgYnl0ZXMpXG4iLCBfX2Z1bmNfXywgZncyLT5zaXplKTsKIAogCS8qIFVTQiBsZWQgc3RhdGljIGdyZWVuLCBBRFNMIGxlZCBzdGF0aWMgcmVkICovCiAKIAkvKiBVUkIgMTQyICovCi0JcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9yY3ZidWxrcGlwZSh1c2JfZGV2LCBTUEVFRFRDSF9FTkRQT0lOVF9GSVJNV0FSRSksCisJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9yY3ZidWxrcGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9GSVJNV0FSRSksCiAJCQkgICBidWZmZXIsIDB4MjAwLCAmYWN0dWFsX2xlbmd0aCwgREFUQV9USU1FT1VUKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlOiByZWFkIEJMT0NLNCBmcm9tIG1vZGVtIGZhaWxlZCAoJWQpISIsIHJldCk7Ci0JCWdvdG8gZmFpbF9yZWxlYXNlOworCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiByZWFkIEJMT0NLNCBmcm9tIG1vZGVtIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJLyogc3VjY2VzcyAqLwotCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlOiBCTE9DSzQgZG93bmxvYWRlZCAoJWQgYnl0ZXMpIiwgYWN0dWFsX2xlbmd0aCk7CisJdXNiX2RiZyh1c2JhdG0sICIlczogQkxPQ0s0IGRvd25sb2FkZWQgKCVkIGJ5dGVzKVxuIiwgX19mdW5jX18sIGFjdHVhbF9sZW5ndGgpOwogCiAJLyogRGVsYXkgdG8gYWxsb3cgZmlybXdhcmUgdG8gc3RhcnQgdXAuIFdlIGNhbiBkbyB0aGlzIGhlcmUKIAkgICBiZWNhdXNlIHdlJ3JlIGluIG91ciBvd24ga2VybmVsIHRocmVhZCBhbnl3YXkuICovCi0JbXNsZWVwKDEwMDApOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCiAJLyogRW5hYmxlIHNvZnR3YXJlIGJ1ZmZlcmluZywgaWYgcmVxdWVzdGVkICovCiAJaWYgKHN3X2J1ZmZlcmluZykKQEAgLTU1MSwyOTEgKzI3Nyw1NDMgQEAKIAkvKiBNYWdpYyBzcGVsbDsgZG9uJ3QgYXNrIHVzIHdoYXQgdGhpcyBkb2VzICovCiAJc3BlZWR0Y2hfdGVzdF9zZXF1ZW5jZShpbnN0YW5jZSk7CiAKLQkvKiBTdGFydCBtb2RlbSBzeW5jaHJvbmlzYXRpb24gKi8KLQlpZiAoc3BlZWR0Y2hfc3RhcnRfc3luY2hybyhpbnN0YW5jZSkpCi0JCWRiZygic3BlZWR0Y2hfc3RhcnRfc3luY2hybzogZmFpbGVkIik7CisJcmV0ID0gMDsKIAotCXNwZWVkdGNoX2dvdF9maXJtd2FyZShpbnN0YW5jZSwgMSk7Ci0KK291dF9mcmVlOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXIpOwotCXJldHVybjsKLQotIGZhaWxfcmVsZWFzZToKLQkvKiBPbmx5IHJlbGVhc2UgaW50ZXJmYWNlICMyIGlmIHVwbG9hZGluZyBmYWlsZWQ7IHdlIGRvbid0IHJlbGVhc2UgaXQKLQkgICB3ZSBzdWNjZWVkZWQuICBUaGlzIHByZXZlbnRzIHRoZSB1c2Vyc3BhY2UgdG9vbHMgZnJvbSB0cnlpbmcgdG8gbG9hZAotCSAgIHRoZSBmaXJtd2FyZSB0aGVtc2VsdmVzICovCi0JdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmc3BlZWR0Y2hfdXNiX2RyaXZlciwgaW50Zik7Ci0gZmFpbF9mcmVlOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXIpOwotIGZhaWw6Ci0Jc3BlZWR0Y2hfZ290X2Zpcm13YXJlKGluc3RhbmNlLCAwKTsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNwZWVkdGNoX2ZpbmRfZmlybXdhcmUoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEKLQkJCQkgICppbnN0YW5jZSwgaW50IHBoYXNlLAorc3RhdGljIGludCBzcGVlZHRjaF9maW5kX2Zpcm13YXJlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBpbnQgcGhhc2UsCiAJCQkJICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmd19wKQogewotCWNoYXIgYnVmWzI0XTsKLQljb25zdCB1MTYgYmNkRGV2aWNlID0gbGUxNl90b19jcHUoaW5zdGFuY2UtPnUudXNiX2Rldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnRmLT5kZXY7CisJY29uc3QgdTE2IGJjZERldmljZSA9IGxlMTZfdG9fY3B1KGludGVyZmFjZV90b191c2JkZXYoaW50ZiktPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIAljb25zdCB1OCBtYWpvcl9yZXZpc2lvbiA9IGJjZERldmljZSA+PiA4OwogCWNvbnN0IHU4IG1pbm9yX3JldmlzaW9uID0gYmNkRGV2aWNlICYgMHhmZjsKKwljaGFyIGJ1ZlsyNF07CiAKIAlzcHJpbnRmKGJ1ZiwgInNwZWVkdGNoLSVkLmJpbi4leC4lMDJ4IiwgcGhhc2UsIG1ham9yX3JldmlzaW9uLCBtaW5vcl9yZXZpc2lvbik7Ci0JZGJnKCJzcGVlZHRjaF9maW5kX2Zpcm13YXJlOiBsb29raW5nIGZvciAlcyIsIGJ1Zik7CisJZGV2X2RiZyhkZXYsICIlczogbG9va2luZyBmb3IgJXNcbiIsIF9fZnVuY19fLCBidWYpOwogCi0JaWYgKHJlcXVlc3RfZmlybXdhcmUoZndfcCwgYnVmLCAmaW5zdGFuY2UtPnUudXNiX2Rldi0+ZGV2KSkgeworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgZGV2KSkgewogCQlzcHJpbnRmKGJ1ZiwgInNwZWVkdGNoLSVkLmJpbi4leCIsIHBoYXNlLCBtYWpvcl9yZXZpc2lvbik7Ci0JCWRiZygic3BlZWR0Y2hfZmluZF9maXJtd2FyZTogbG9va2luZyBmb3IgJXMiLCBidWYpOworCQlkZXZfZGJnKGRldiwgIiVzOiBsb29raW5nIGZvciAlc1xuIiwgX19mdW5jX18sIGJ1Zik7CiAKLQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoZndfcCwgYnVmLCAmaW5zdGFuY2UtPnUudXNiX2Rldi0+ZGV2KSkgeworCQlpZiAocmVxdWVzdF9maXJtd2FyZShmd19wLCBidWYsIGRldikpIHsKIAkJCXNwcmludGYoYnVmLCAic3BlZWR0Y2gtJWQuYmluIiwgcGhhc2UpOwotCQkJZGJnKCJzcGVlZHRjaF9maW5kX2Zpcm13YXJlOiBsb29raW5nIGZvciAlcyIsIGJ1Zik7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBsb29raW5nIGZvciAlc1xuIiwgX19mdW5jX18sIGJ1Zik7CiAKLQkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgJmluc3RhbmNlLT51LnVzYl9kZXYtPmRldikpIHsKLQkJCQlkZXZfd2FybigmaW5zdGFuY2UtPnUudXNiX2Rldi0+ZGV2LCAibm8gc3RhZ2UgJWQgZmlybXdhcmUgZm91bmQhIiwgcGhhc2UpOworCQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoZndfcCwgYnVmLCBkZXYpKSB7CisJCQkJZGV2X3dhcm4oZGV2LCAibm8gc3RhZ2UgJWQgZmlybXdhcmUgZm91bmQhXG4iLCBwaGFzZSk7CiAJCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCQl9CiAJCX0KIAl9CiAKLQlkZXZfaW5mbygmaW5zdGFuY2UtPnUudXNiX2Rldi0+ZGV2LCAiZm91bmQgc3RhZ2UgJWQgZmlybXdhcmUgJXNcbiIsIHBoYXNlLCBidWYpOworCWRldl9pbmZvKGRldiwgImZvdW5kIHN0YWdlICVkIGZpcm13YXJlICVzXG4iLCBwaGFzZSwgYnVmKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNwZWVkdGNoX2xvYWRfZmlybXdhcmUodm9pZCAqYXJnKQorc3RhdGljIGludCBzcGVlZHRjaF9oZWF2eV9pbml0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3MSwgKmZ3MjsKLQlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSBhcmc7CisJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gdXNiYXRtLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OwogCi0JQlVHX09OKCFpbnN0YW5jZSk7CisJaWYgKChyZXQgPSBzcGVlZHRjaF9maW5kX2Zpcm13YXJlKGludGYsIDEsICZmdzEpKSA8IDApCisJCQlyZXR1cm4gcmV0OwogCi0JZGFlbW9uaXplKCJmaXJtd2FyZS9zcGVlZHRjaCIpOwotCi0JaWYgKCFzcGVlZHRjaF9maW5kX2Zpcm13YXJlKGluc3RhbmNlLCAxLCAmZncxKSkgewotCQlpZiAoIXNwZWVkdGNoX2ZpbmRfZmlybXdhcmUoaW5zdGFuY2UsIDIsICZmdzIpKSB7Ci0JCQlzcGVlZHRjaF91cGxvYWRfZmlybXdhcmUoaW5zdGFuY2UsIGZ3MSwgZncyKTsKLQkJCXJlbGVhc2VfZmlybXdhcmUoZncyKTsKLQkJfQorCWlmICgocmV0ID0gc3BlZWR0Y2hfZmluZF9maXJtd2FyZShpbnRmLCAyLCAmZncyKSkgPCAwKSB7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncxKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBJbiBjYXNlIHdlIGZhaWxlZCwgc2V0IHN0YXRlIGJhY2sgdG8gTk9fRklSTVdBUkUgc28gdGhhdAotCSAgIGFub3RoZXIgbGF0ZXIgYXR0ZW1wdCBtYXkgd29yay4gT3RoZXJ3aXNlLCB3ZSBuZXZlciBhY3R1YWxseQotCSAgIG1hbmFnZSB0byByZWNvdmVyIGlmLCBmb3IgZXhhbXBsZSwgdGhlIGZpcm13YXJlIGlzIG9uIC91c3IgYW5kCi0JICAgd2UgbG9vayBmb3IgaXQgdG9vIGVhcmx5LiAqLwotCXNwZWVkdGNoX2dvdF9maXJtd2FyZShpbnN0YW5jZSwgMCk7CisJcmV0ID0gc3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlKGluc3RhbmNlLCBmdzEsIGZ3Mik7CiAKLQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQl1ZHNsX3B1dF9pbnN0YW5jZSgmaW5zdGFuY2UtPnUpOworCXJlbGVhc2VfZmlybXdhcmUoZncyKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3MSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqCisqKiAgQVRNICAqKgorKioqKioqKioqKi8KKworc3RhdGljIGludCBzcGVlZHRjaF9yZWFkX3N0YXR1cyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCit7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXNiYXRtLT51c2JfZGV2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGluc3RhbmNlLT5zY3JhdGNoX2J1ZmZlcjsKKwlpbnQgcmV0OworCisJbWVtc2V0KGJ1ZiwgMCwgVE9UQUwpOworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDcsIDB4MDAsIGJ1ZiArIE9GRlNFVF83LCBTSVpFXzcsCisJCQkgICAgICBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IE1TRyA3IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDEyLCAweGMwLCAweDBiLCAweDAwLCBidWYgKyBPRkZTRVRfYiwgU0laRV9iLAorCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBNU0cgQiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwZCwgMHgwMCwgYnVmICsgT0ZGU0VUX2QsIFNJWkVfZCwKKwkJCSAgICAgIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogTVNHIEQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4YzAsIDB4MGUsIDB4MDAsIGJ1ZiArIE9GRlNFVF9lLCBTSVpFX2UsCisJCQkgICAgICBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IE1TRyBFIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweGMwLCAweDBmLCAweDAwLCBidWYgKyBPRkZTRVRfZiwgU0laRV9mLAorCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBNU0cgRiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBVU0VfRldfTE9BREVSICovCiAKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX2Zpcm13YXJlX3N0YXJ0KHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfc3RhcnRfc3luY2hybyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCiB7Ci0jaWZkZWYgVVNFX0ZXX0xPQURFUgorCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVzYmF0bS0+dXNiX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBpbnN0YW5jZS0+c2NyYXRjaF9idWZmZXI7CiAJaW50IHJldDsKLSNlbmRpZgogCi0JZGJnKCJzcGVlZHRjaF9maXJtd2FyZV9zdGFydCIpOworCWF0bV9kYmcodXNiYXRtLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOwogCi0JZG93bigmaW5zdGFuY2UtPnUuc2VyaWFsaXplKTsJLyogdnMgc2VsZiwgc3BlZWR0Y2hfZ290X2Zpcm13YXJlICovCisJbWVtc2V0KGJ1ZiwgMCwgMik7CiAKLQlpZiAoaW5zdGFuY2UtPnUuc3RhdHVzID49IFVEU0xfTE9BRElOR19GSVJNV0FSRSkgewotCQl1cCgmaW5zdGFuY2UtPnUuc2VyaWFsaXplKTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwNCwgMHgwMCwKKwkJCSAgICAgIGJ1ZiwgMiwgQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXQgPCAwKQorCQlhdG1fd2Fybih1c2JhdG0sICJmYWlsZWQgdG8gc3RhcnQgQURTTCBzeW5jaHJvbmlzYXRpb246ICVkXG4iLCByZXQpOworCWVsc2UKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogbW9kZW0gcHJvZGRlZC4gJWQgYnl0ZXMgcmV0dXJuZWQ6ICUwMnggJTAyeFxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGJ1ZlswXSwgYnVmWzFdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkdGNoX2NoZWNrX3N0YXR1cyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCit7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOworCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2ID0gdXNiYXRtLT5hdG1fZGV2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGluc3RhbmNlLT5zY3JhdGNoX2J1ZmZlcjsKKwlpbnQgZG93bl9zcGVlZCwgdXBfc3BlZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCWF0bV9kYmcodXNiYXRtLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworCisJcmV0ID0gc3BlZWR0Y2hfcmVhZF9zdGF0dXMoaW5zdGFuY2UpOworCWlmIChyZXQgPCAwKSB7CisJCWF0bV93YXJuKHVzYmF0bSwgImVycm9yICVkIGZldGNoaW5nIGRldmljZSBzdGF0dXNcbiIsIHJldCk7CisJCWluc3RhbmNlLT5wb2xsX2RlbGF5ID0gbWluKDIgKiBpbnN0YW5jZS0+cG9sbF9kZWxheSwgTUFYX1BPTExfREVMQVkpOwogCQlyZXR1cm47CiAJfQogCi0JaW5zdGFuY2UtPnUuc3RhdHVzID0gVURTTF9MT0FESU5HX0ZJUk1XQVJFOwotCXVwKCZpbnN0YW5jZS0+dS5zZXJpYWxpemUpOworCWluc3RhbmNlLT5wb2xsX2RlbGF5ID0gbWF4KGluc3RhbmNlLT5wb2xsX2RlbGF5IC8gMiwgTUlOX1BPTExfREVMQVkpOwogCi0jaWZkZWYgVVNFX0ZXX0xPQURFUgotCXVkc2xfZ2V0X2luc3RhbmNlKCZpbnN0YW5jZS0+dSk7Ci0JdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXN0YXR1cyA9IGJ1ZltPRkZTRVRfN107CiAKLQlyZXQgPSBrZXJuZWxfdGhyZWFkKHNwZWVkdGNoX2xvYWRfZmlybXdhcmUsIGluc3RhbmNlLAotCQkJICAgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOworCWF0bV9kYmcodXNiYXRtLCAiJXM6IGxpbmUgc3RhdGUgJTAyeFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKLQlpZiAocmV0ID49IDApCi0JCXJldHVybjsJCS8qIE9LICovCisJaWYgKChzdGF0dXMgIT0gaW5zdGFuY2UtPmxhc3Rfc3RhdHVzKSB8fCAhc3RhdHVzKSB7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgMDoKKwkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCQlpZiAoaW5zdGFuY2UtPmxhc3Rfc3RhdHVzKQorCQkJCWF0bV9pbmZvKHVzYmF0bSwgIiVzXG4iLCAiQURTTCBsaW5lIGlzIGRvd24iKTsKKwkJCS8qIEl0IG1heSBuZXZlciByZXN5bmMgYWdhaW4gdW5sZXNzIHdlIGFzayBpdCB0by4uLiAqLworCQkJcmV0ID0gc3BlZWR0Y2hfc3RhcnRfc3luY2hybyhpbnN0YW5jZSk7CisJCQlicmVhazsKIAotCWRiZygic3BlZWR0Y2hfZmlybXdhcmVfc3RhcnQ6IGtlcm5lbF90aHJlYWQgZmFpbGVkICglZCkhIiwgcmV0KTsKKwkJY2FzZSAweDA4OgorCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKKwkJCWF0bV9pbmZvKHVzYmF0bSwgIiVzXG4iLCAiQURTTCBsaW5lIGlzIGJsb2NrZWQ/Iik7CisJCQlicmVhazsKIAotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCXVkc2xfcHV0X2luc3RhbmNlKCZpbnN0YW5jZS0+dSk7Ci0JLyogSnVzdCBwcmV0ZW5kIGl0IG5ldmVyIGhhcHBlbmVkLi4uIGhvcGUgbW9kZW1fcnVuIGhhcHBlbnMgKi8KLSNlbmRpZgkJCQkvKiBVU0VfRldfTE9BREVSICovCisJCWNhc2UgMHgxMDoKKwkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCQlhdG1faW5mbyh1c2JhdG0sICIlc1xuIiwgIkFEU0wgbGluZSBpcyBzeW5jaHJvbmlzaW5nIik7CisJCQlicmVhazsKIAotCXNwZWVkdGNoX2dvdF9maXJtd2FyZShpbnN0YW5jZSwgMCk7CisJCWNhc2UgMHgyMDoKKwkJCWRvd25fc3BlZWQgPSBidWZbT0ZGU0VUX2JdIHwgKGJ1ZltPRkZTRVRfYiArIDFdIDw8IDgpCisJCQkJfCAoYnVmW09GRlNFVF9iICsgMl0gPDwgMTYpIHwgKGJ1ZltPRkZTRVRfYiArIDNdIDw8IDI0KTsKKwkJCXVwX3NwZWVkID0gYnVmW09GRlNFVF9iICsgNF0gfCAoYnVmW09GRlNFVF9iICsgNV0gPDwgOCkKKwkJCQl8IChidWZbT0ZGU0VUX2IgKyA2XSA8PCAxNikgfCAoYnVmW09GRlNFVF9iICsgN10gPDwgMjQpOworCisJCQlpZiAoIShkb3duX3NwZWVkICYgMHgwMDAwZmZmZikgJiYgISh1cF9zcGVlZCAmIDB4MDAwMGZmZmYpKSB7CisJCQkJZG93bl9zcGVlZCA+Pj0gMTY7CisJCQkJdXBfc3BlZWQgPj49IDE2OworCQkJfQorCisJCQlhdG1fZGV2LT5saW5rX3JhdGUgPSBkb3duX3NwZWVkICogMTAwMCAvIDQyNDsKKwkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOworCisJCQlhdG1faW5mbyh1c2JhdG0sCisJCQkJICJBRFNMIGxpbmUgaXMgdXAgKCVkIGtiL3MgZG93biB8ICVkIGtiL3MgdXApXG4iLAorCQkJCSBkb3duX3NwZWVkLCB1cF9zcGVlZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKKwkJCWF0bV9pbmZvKHVzYmF0bSwgIlVua25vd24gbGluZSBzdGF0ZSAlMDJ4XG4iLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlpbnN0YW5jZS0+bGFzdF9zdGF0dXMgPSBzdGF0dXM7CisJfQogfQogCi1zdGF0aWMgaW50IHNwZWVkdGNoX2Zpcm13YXJlX3dhaXQoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCitzdGF0aWMgdm9pZCBzcGVlZHRjaF9zdGF0dXNfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3BlZWR0Y2hfZmlybXdhcmVfc3RhcnQoKHZvaWQgKilpbnN0YW5jZSk7CisJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gKHZvaWQgKilkYXRhOwogCi0JaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+ZmlybXdhcmVfd2FpdGVycywgaW5zdGFuY2UtPnN0YXR1cyAhPSBVRFNMX0xPQURJTkdfRklSTVdBUkUpIDwgMCkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIpOwogCi0JcmV0dXJuIChpbnN0YW5jZS0+c3RhdHVzID09IFVEU0xfTE9BREVEX0ZJUk1XQVJFKSA/IDAgOiAtRUFHQUlOOworCS8qIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgcmFjeSwgYnV0IHRoZSByYWNlIGlzIGhhcm1sZXNzICovCisJaWYgKGluc3RhbmNlLT5wb2xsX2RlbGF5IDwgTUFYX1BPTExfREVMQVkpCisJCW1vZF90aW1lcigmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpbnN0YW5jZS0+cG9sbF9kZWxheSkpOworCWVsc2UKKwkJYXRtX3dhcm4oaW5zdGFuY2UtPnVzYmF0bSwgIiVzXG4iLCAiVG9vIG1hbnkgZmFpbHVyZXMgLSBkaXNhYmxpbmcgbGluZSBzdGF0dXMgcG9sbGluZyIpOwogfQogCitzdGF0aWMgdm9pZCBzcGVlZHRjaF9yZXN1Ym1pdF9pbnQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgdXJiICppbnRfdXJiID0gaW5zdGFuY2UtPmludF91cmI7CisJaW50IHJldDsKKworCWF0bV9kYmcoaW5zdGFuY2UtPnVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCWlmIChpbnRfdXJiKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKGludF91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoIXJldCkKKwkJCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlcik7CisJCWVsc2UgeworCQkJYXRtX2RiZyhpbnN0YW5jZS0+dXNiYXRtLCAiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQltb2RfdGltZXIoJmluc3RhbmNlLT5yZXN1Ym1pdF90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVTVUJNSVRfREVMQVkpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3BlZWR0Y2hfaGFuZGxlX2ludChzdHJ1Y3QgdXJiICppbnRfdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSBpbnRfdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBpbnRfdXJiLT5hY3R1YWxfbGVuZ3RoOworCWludCByZXQgPSBpbnRfdXJiLT5zdGF0dXM7CisKKwkvKiBUaGUgbWFnaWMgaW50ZXJydXB0IGZvciAidXAgc3RhdGUiICovCisJY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgdXBfaW50WzZdICAgPSB7IDB4YTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkvKiBUaGUgbWFnaWMgaW50ZXJydXB0IGZvciAiZG93biBzdGF0ZSIgKi8KKwljb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciBkb3duX2ludFs2XSA9IHsgMHhhMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJYXRtX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBub256ZXJvIHVyYiBzdGF0dXMgJWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICgoY291bnQgPT0gNikgJiYgIW1lbWNtcCh1cF9pbnQsIGluc3RhbmNlLT5pbnRfZGF0YSwgNikpIHsKKwkJZGVsX3RpbWVyKCZpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIudGltZXIpOworCQlhdG1faW5mbyh1c2JhdG0sICIlc1xuIiwgIkRTTCBsaW5lIGdvZXMgdXAiKTsKKwl9IGVsc2UgaWYgKChjb3VudCA9PSA2KSAmJiAhbWVtY21wKGRvd25faW50LCBpbnN0YW5jZS0+aW50X2RhdGEsIDYpKSB7CisJCWF0bV9pbmZvKHVzYmF0bSwgIiVzXG4iLCAiRFNMIGxpbmUgZ29lcyBkb3duIik7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogdW5rbm93biBpbnRlcnJ1cHQgcGFja2V0IG9mIGxlbmd0aCAlZDoiLCBfX2Z1bmNfXywgY291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCXByaW50aygiICUwMngiLCBpbnN0YW5jZS0+aW50X2RhdGFbaV0pOworCQlwcmludGsoIlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoKGludF91cmIgPSBpbnN0YW5jZS0+aW50X3VyYikpIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaW50X3VyYiwgR0ZQX0FUT01JQyk7CisJCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcmV0dXJuOworCitmYWlsOgorCWlmICgoaW50X3VyYiA9IGluc3RhbmNlLT5pbnRfdXJiKSkKKwkJbW9kX3RpbWVyKCZpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFU1VCTUlUX0RFTEFZKSk7Cit9CisKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfYXRtX3N0YXJ0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtLCBzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVzYmF0bS0+dXNiX2RldjsKKwlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciBtYWNfc3RyWzEzXTsKKworCWF0bV9kYmcodXNiYXRtLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworCisJaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JfZGV2LCAxLCBhbHRzZXR0aW5nKSkgPCAwKSB7CisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IHVzYl9zZXRfaW50ZXJmYWNlIHJldHVybmVkICVkIVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0IE1BQyBhZGRyZXNzLCBpdCBpcyBzdG9yZWQgaW4gdGhlIHNlcmlhbCBudW1iZXIgKi8KKwltZW1zZXQoYXRtX2Rldi0+ZXNpLCAwLCBzaXplb2YoYXRtX2Rldi0+ZXNpKSk7CisJaWYgKHVzYl9zdHJpbmcodXNiX2RldiwgdXNiX2Rldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBtYWNfc3RyLCBzaXplb2YobWFjX3N0cikpID09IDEyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlhdG1fZGV2LT5lc2lbaV0gPSAoaGV4MmludChtYWNfc3RyW2kgKiAyXSkgKiAxNikgKyAoaGV4MmludChtYWNfc3RyW2kgKiAyICsgMV0pKTsKKwl9CisKKwkvKiBTdGFydCBtb2RlbSBzeW5jaHJvbmlzYXRpb24gKi8KKwlyZXQgPSBzcGVlZHRjaF9zdGFydF9zeW5jaHJvKGluc3RhbmNlKTsKKworCS8qIFNldCB1cCBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwlpZiAoaW5zdGFuY2UtPmludF91cmIpIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaW5zdGFuY2UtPmludF91cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmV0IDwgMCkgeworCQkJLyogRG9lc24ndCBtYXR0ZXI7IHdlJ2xsIHBvbGwgYW55d2F5ICovCisJCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBzdWJtaXNzaW9uIG9mIGludGVycnVwdCBVUkIgZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+aW50X3VyYik7CisJCQlpbnN0YW5jZS0+aW50X3VyYiA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBTdGFydCBzdGF0dXMgcG9sbGluZyAqLworCW1vZF90aW1lcigmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BlZWR0Y2hfYXRtX3N0b3Aoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sIHN0cnVjdCBhdG1fZGV2ICphdG1fZGV2KQoreworCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVzYmF0bS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVyYiAqaW50X3VyYiA9IGluc3RhbmNlLT5pbnRfdXJiOworCisJYXRtX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyKTsKKworCS8qCisJICogU2luY2UgcmVzdWJtaXRfdGltZXIgYW5kIGludF91cmIgY2FuIHNjaGVkdWxlIHRoZW1zZWx2ZXMgYW5kCisJICogZWFjaCBvdGhlciwgc2h1dHRpbmcgdGhlbSBkb3duIGNvcnJlY3RseSB0YWtlcyBzb21lIGNhcmUKKwkgKi8KKwlpbnN0YW5jZS0+aW50X3VyYiA9IE5VTEw7IC8qIHNpZ25hbCBzaHV0ZG93biAqLworCW1iKCk7CisJdXNiX2tpbGxfdXJiKGludF91cmIpOworCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIpOworCS8qCisJICogQXQgdGhpcyBwb2ludCwgc3BlZWR0Y2hfaGFuZGxlX2ludCBhbmQgc3BlZWR0Y2hfcmVzdWJtaXRfaW50CisJICogY2FuIHJ1biBvciBiZSBydW5uaW5nLCBidXQgaW5zdGFuY2UtPmludF91cmIgPT0gTlVMTCBtZWFucyB0aGF0CisJICogdGhleSB3aWxsIG5vdCByZXNjaGVkdWxlCisJICovCisJdXNiX2tpbGxfdXJiKGludF91cmIpOworCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIpOworCXVzYl9mcmVlX3VyYihpbnRfdXJiKTsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Cit9CisKKwogLyoqKioqKioqKioKICoqICBVU0IgICoqCiAqKioqKioqKioqLwogCi1zdGF0aWMgaW50IHNwZWVkdGNoX3VzYl9pb2N0bChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgaW50IGNvZGUsCi0JCQkgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0Jc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzcGVlZHRjaF91c2JfaWRzW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNmI5LCAweDQwNjEpfSwKKwl7fQorfTsKIAotCWRiZygic3BlZWR0Y2hfdXNiX2lvY3RsIGVudGVyZWQiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzcGVlZHRjaF91c2JfaWRzKTsKIAotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJzcGVlZHRjaF91c2JfaW9jdGw6IE5VTEwgaW5zdGFuY2UhIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KK3N0YXRpYyBpbnQgc3BlZWR0Y2hfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICopOwogCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBVRFNMX0lPQ1RMX0xJTkVfVVA6Ci0JCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOwotCQlzcGVlZHRjaF9nb3RfZmlybXdhcmUoaW5zdGFuY2UsIDEpOwotCQlyZXR1cm4gKGluc3RhbmNlLT51LnN0YXR1cyA9PSBVRFNMX0xPQURFRF9GSVJNV0FSRSkgPyAwIDogLUVJTzsKLQljYXNlIFVEU0xfSU9DVExfTElORV9ET1dOOgotCQlpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1RUWTsKLQl9CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc3BlZWR0Y2hfdXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gc3BlZWR0Y2hfZHJpdmVyX25hbWUsCisJLnByb2JlCQk9IHNwZWVkdGNoX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHVzYmF0bV91c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBzcGVlZHRjaF91c2JfaWRzCit9OworCitzdGF0aWMgdm9pZCBzcGVlZHRjaF9yZWxlYXNlX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIGludCBudW1faW50ZXJmYWNlcykgeworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpjdXJfaW50ZjsKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IG51bV9pbnRlcmZhY2VzOyBpKyspCisJCWlmICgoY3VyX2ludGYgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgaSkpKSB7CisJCQl1c2Jfc2V0X2ludGZkYXRhKGN1cl9pbnRmLCBOVUxMKTsKKwkJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJnNwZWVkdGNoX3VzYl9kcml2ZXIsIGN1cl9pbnRmKTsKKwkJfQogfQogCi1zdGF0aWMgaW50IHNwZWVkdGNoX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfYmluZChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSwKKwkJCSBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsCisJCQkgaW50ICpuZWVkX2hlYXZ5X2luaXQpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JaW50IGlmbnVtID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY3VyX2ludGY7CiAJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlOwotCXVuc2lnbmVkIGNoYXIgbWFjX3N0clsxM107Ci0JaW50IHJldCwgaTsKLQljaGFyIGJ1ZjdbU0laRV83XTsKKwlpbnQgaWZudW0gPSBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJaW50IG51bV9pbnRlcmZhY2VzID0gdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOworCWludCBpLCByZXQ7CiAKLQlkYmcoInNwZWVkdGNoX3VzYl9wcm9iZTogdHJ5aW5nIGRldmljZSB3aXRoIHZlbmRvcj0weCV4LCBwcm9kdWN0PTB4JXgsIGlmbnVtICVkIiwKLQkgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksIGlmbnVtKTsKKwl1c2JfZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAotCWlmICgoZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyAhPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMpIHx8IAotCSAgICAoaWZudW0gIT0gMSkpCisJaWYgKHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgeworCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiB3cm9uZyBkZXZpY2UgY2xhc3MgJWRcbiIsIF9fZnVuY19fLCB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAotCWRiZygic3BlZWR0Y2hfdXNiX3Byb2JlOiBkZXZpY2UgYWNjZXB0ZWQiKTsKKwkvKiBjbGFpbSBhbGwgaW50ZXJmYWNlcyAqLwogCi0JLyogaW5zdGFuY2UgaW5pdCAqLworCWZvciAoaT0wOyBpIDwgbnVtX2ludGVyZmFjZXM7IGkrKykgeworCQljdXJfaW50ZiA9IHVzYl9pZm51bV90b19pZih1c2JfZGV2LCBpKTsKKworCQlpZiAoKGkgIT0gaWZudW0pICYmIGN1cl9pbnRmKSB7CisJCQlyZXQgPSB1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmc3BlZWR0Y2hfdXNiX2RyaXZlciwgY3VyX2ludGYsIHVzYmF0bSk7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJdXNiX2RiZyh1c2JhdG0sICIlczogZmFpbGVkIHRvIGNsYWltIGludGVyZmFjZSAlZCAoJWQpXG4iLCBfX2Z1bmNfXywgaSwgcmV0KTsKKwkJCQlzcGVlZHRjaF9yZWxlYXNlX2ludGVyZmFjZXModXNiX2RldiwgaSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwogCWluc3RhbmNlID0ga21hbGxvYyhzaXplb2YoKmluc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CisKIAlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygic3BlZWR0Y2hfdXNiX3Byb2JlOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9yZWxlYXNlOwogCX0KIAogCW1lbXNldChpbnN0YW5jZSwgMCwgc2l6ZW9mKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhKSk7CiAKLQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgMCwgMCkpIDwgMCkKLQkJZ290byBmYWlsOworCWluc3RhbmNlLT51c2JhdG0gPSB1c2JhdG07CiAKLQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgMiwgMCkpIDwgMCkKLQkJZ290byBmYWlsOworCUlOSVRfV09SSygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLCAodm9pZCAqKXNwZWVkdGNoX2NoZWNrX3N0YXR1cywgaW5zdGFuY2UpOwogCi0JaW5zdGFuY2UtPnUuZGF0YV9lbmRwb2ludCA9IFNQRUVEVENIX0VORFBPSU5UX0RBVEE7Ci0JaW5zdGFuY2UtPnUuZmlybXdhcmVfd2FpdCA9IHNwZWVkdGNoX2Zpcm13YXJlX3dhaXQ7Ci0JaW5zdGFuY2UtPnUuZHJpdmVyX25hbWUgPSBzcGVlZHRjaF9kcml2ZXJfbmFtZTsKKwlpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIudGltZXIuZnVuY3Rpb24gPSBzcGVlZHRjaF9zdGF0dXNfcG9sbDsKKwlpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3RhbmNlOworCWluc3RhbmNlLT5sYXN0X3N0YXR1cyA9IDB4ZmY7CisJaW5zdGFuY2UtPnBvbGxfZGVsYXkgPSBNSU5fUE9MTF9ERUxBWTsKIAotCXJldCA9IHVkc2xfaW5zdGFuY2Vfc2V0dXAoZGV2LCAmaW5zdGFuY2UtPnUpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKKwlpbml0X3RpbWVyKCZpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIpOworCWluc3RhbmNlLT5yZXN1Ym1pdF90aW1lci5mdW5jdGlvbiA9IHNwZWVkdGNoX3Jlc3VibWl0X2ludDsKKwlpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3RhbmNlOwogCi0JaW5pdF90aW1lcigmaW5zdGFuY2UtPnBvbGxfdGltZXIpOwotCWluc3RhbmNlLT5wb2xsX3RpbWVyLmZ1bmN0aW9uID0gc3BlZWR0Y2hfdGltZXJfcG9sbDsKLQlpbnN0YW5jZS0+cG9sbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2U7CisJaW5zdGFuY2UtPmludF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCi0JSU5JVF9XT1JLKCZpbnN0YW5jZS0+cG9sbF93b3JrLCAodm9pZCAqKXNwZWVkdGNoX3BvbGxfc3RhdHVzLCBpbnN0YW5jZSk7CisJaWYgKGluc3RhbmNlLT5pbnRfdXJiKQorCQl1c2JfZmlsbF9pbnRfdXJiKGluc3RhbmNlLT5pbnRfdXJiLCB1c2JfZGV2LAorCQkJCSB1c2JfcmN2aW50cGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9JTlQpLAorCQkJCSBpbnN0YW5jZS0+aW50X2RhdGEsIHNpemVvZihpbnN0YW5jZS0+aW50X2RhdGEpLAorCQkJCSBzcGVlZHRjaF9oYW5kbGVfaW50LCBpbnN0YW5jZSwgNTApOworCWVsc2UKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogbm8gbWVtb3J5IGZvciBpbnRlcnJ1cHQgdXJiIVxuIiwgX19mdW5jX18pOwogCi0JLyogc2V0IE1BQyBhZGRyZXNzLCBpdCBpcyBzdG9yZWQgaW4gdGhlIHNlcmlhbCBudW1iZXIgKi8KLQltZW1zZXQoaW5zdGFuY2UtPnUuYXRtX2Rldi0+ZXNpLCAwLCBzaXplb2YoaW5zdGFuY2UtPnUuYXRtX2Rldi0+ZXNpKSk7Ci0JaWYgKHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgbWFjX3N0ciwgc2l6ZW9mKG1hY19zdHIpKSA9PSAxMikgewotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+ZXNpW2ldID0KLQkJCQkoaGV4MmludChtYWNfc3RyW2kgKiAyXSkgKiAxNikgKyAoaGV4MmludChtYWNfc3RyW2kgKiAyICsgMV0pKTsKLQl9CisJLyogY2hlY2sgd2hldGhlciB0aGUgbW9kZW0gYWxyZWFkeSBzZWVtcyB0byBiZSBhbGl2ZSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDEyLCAweGMwLCAweDA3LCAweDAwLAorCQkJICAgICAgaW5zdGFuY2UtPnNjcmF0Y2hfYnVmZmVyICsgT0ZGU0VUXzcsIFNJWkVfNywgNTAwKTsKIAotCS8qIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlIG1vZGVtIGFscmVhZHkgc2VlbXMgdG8gYmUgYWxpdmUgKi8KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDcsIDB4MDAsIGJ1ZjcsIFNJWkVfNywgNTAwKTsKKwkqbmVlZF9oZWF2eV9pbml0ID0gKHJldCAhPSBTSVpFXzcpOwogCi0JaWYgKHJldCA9PSBTSVpFXzcpIHsKLQkJZGJnKCJmaXJtd2FyZSBhcHBlYXJzIHRvIGJlIGFscmVhZHkgbG9hZGVkIik7Ci0JCXNwZWVkdGNoX2dvdF9maXJtd2FyZShpbnN0YW5jZSwgMSk7Ci0JCXNwZWVkdGNoX3BvbGxfc3RhdHVzKGluc3RhbmNlKTsKLQl9IGVsc2UgewotCQlzcGVlZHRjaF9maXJtd2FyZV9zdGFydChpbnN0YW5jZSk7Ci0JfQorCXVzYl9kYmcodXNiYXRtLCAiJXM6IGZpcm13YXJlICVzIGxvYWRlZFxuIiwgX19mdW5jX18sIG5lZWRfaGVhdnlfaW5pdCA/ICJub3QiIDogImFscmVhZHkiKTsKIAotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaW5zdGFuY2UpOworCWlmICgqbmVlZF9oZWF2eV9pbml0KQorCQlpZiAoKHJldCA9IHVzYl9yZXNldF9kZXZpY2UodXNiX2RldikpIDwgMCkKKwkJCWdvdG8gZmFpbF9mcmVlOworCisgICAgICAgIHVzYmF0bS0+ZHJpdmVyX2RhdGEgPSBpbnN0YW5jZTsKIAogCXJldHVybiAwOwogCi0gZmFpbDoKK2ZhaWxfZnJlZToKKwl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPmludF91cmIpOwogCWtmcmVlKGluc3RhbmNlKTsKLQotCXJldHVybiAtRU5PTUVNOworZmFpbF9yZWxlYXNlOgorCXNwZWVkdGNoX3JlbGVhc2VfaW50ZXJmYWNlcyh1c2JfZGV2LCBudW1faW50ZXJmYWNlcyk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgc3BlZWR0Y2hfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgdm9pZCBzcGVlZHRjaF91bmJpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVzYmF0bS0+ZHJpdmVyX2RhdGE7CiAKLQlkYmcoInNwZWVkdGNoX3VzYl9kaXNjb25uZWN0IGVudGVyZWQiKTsKKwl1c2JfZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJzcGVlZHRjaF91c2JfZGlzY29ubmVjdDogTlVMTCBpbnN0YW5jZSEiKTsKLQkJcmV0dXJuOwotCX0KLQotLypRUSBuZWVkIHRvIGhhbmRsZSBkaXNjb25uZWN0cyBvbiBpbnRlcmZhY2UgIzIgd2hpbGUgdXBsb2FkaW5nIGZpcm13YXJlICovCi0vKlFRIGFuZCB3aGF0IGFib3V0IGludGVyZmFjZSAjMT8gKi8KLQotCWlmIChpbnN0YW5jZS0+aW50X3VyYikgewotCQlzdHJ1Y3QgdXJiICppbnRfdXJiID0gaW5zdGFuY2UtPmludF91cmI7Ci0JCWluc3RhbmNlLT5pbnRfdXJiID0gTlVMTDsKLQkJd21iKCk7Ci0JCXVzYl91bmxpbmtfdXJiKGludF91cmIpOwotCQl1c2JfZnJlZV91cmIoaW50X3VyYik7Ci0JfQotCi0JaW5zdGFuY2UtPmludF9kYXRhWzBdID0gMTsKLQlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnBvbGxfdGltZXIpOwotCXdtYigpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KLQl1ZHNsX2luc3RhbmNlX2Rpc2Nvbm5lY3QoJmluc3RhbmNlLT51KTsKLQotCS8qIGNsZWFuIHVwICovCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQl1ZHNsX3B1dF9pbnN0YW5jZSgmaW5zdGFuY2UtPnUpOworCXNwZWVkdGNoX3JlbGVhc2VfaW50ZXJmYWNlcyh1c2JfZGV2LCB1c2JfZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXMpOworCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+aW50X3VyYik7CisJa2ZyZWUoaW5zdGFuY2UpOwogfQogCisKIC8qKioqKioqKioqKgogKiogIGluaXQgICoqCiAqKioqKioqKioqKi8KIAorc3RhdGljIHN0cnVjdCB1c2JhdG1fZHJpdmVyIHNwZWVkdGNoX3VzYmF0bV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9IHNwZWVkdGNoX2RyaXZlcl9uYW1lLAorCS5iaW5kCQk9IHNwZWVkdGNoX2JpbmQsCisJLmhlYXZ5X2luaXQJPSBzcGVlZHRjaF9oZWF2eV9pbml0LAorCS51bmJpbmQJCT0gc3BlZWR0Y2hfdW5iaW5kLAorCS5hdG1fc3RhcnQJPSBzcGVlZHRjaF9hdG1fc3RhcnQsCisJLmF0bV9zdG9wCT0gc3BlZWR0Y2hfYXRtX3N0b3AsCisJLmluCQk9IEVORFBPSU5UX0RBVEEsCisJLm91dAkJPSBFTkRQT0lOVF9EQVRBCit9OworCitzdGF0aWMgaW50IHNwZWVkdGNoX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiB1c2JhdG1fdXNiX3Byb2JlKGludGYsIGlkLCAmc3BlZWR0Y2hfdXNiYXRtX2RyaXZlcik7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNwZWVkdGNoX3VzYl9pbml0KHZvaWQpCiB7Ci0JZGJnKCJzcGVlZHRjaF91c2JfaW5pdDogZHJpdmVyIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTik7CisJZGJnKCIlczogZHJpdmVyIHZlcnNpb24gJXMiLCBfX2Z1bmNfXywgRFJJVkVSX1ZFUlNJT04pOwogCiAJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc3BlZWR0Y2hfdXNiX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzcGVlZHRjaF91c2JfY2xlYW51cCh2b2lkKQogewotCWRiZygic3BlZWR0Y2hfdXNiX2NsZWFudXAgZW50ZXJlZCIpOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAl1c2JfZGVyZWdpc3Rlcigmc3BlZWR0Y2hfdXNiX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiX2F0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VzYl9hdG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZDQ0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiX2F0bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgdXNiX2F0bS5jIC0gR2VuZXJpYyBVU0IgeERTTCBkcml2ZXIgY29yZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIEFsY2F0ZWwKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIER1bmNhbiBTYW5kcywgU29sTmVncm8sIEpvc2VwIENvbWFzCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LCBEYXZpZCBXb29kaG91c2UKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiAgV3JpdHRlbiBieSBKb2hhbiBWZXJyZXB0LCBtYWludGFpbmVkIGJ5IER1bmNhbiBTYW5kcyAoZHVuY2FuLnNhbmRzQGZyZWUuZnIpCi0gKgotICogIDEuNys6CS0gU2VlIHRoZSBjaGVjay1pbiBsb2dzCi0gKgotICogIDEuNjoJLSBObyBsb25nZXIgb3BlbnMgYSBjb25uZWN0aW9uIGlmIHRoZSBmaXJtd2FyZSBpcyBub3QgbG9hZGVkCi0gKiAgCQktIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBzcGVlZHRvdWNoIDMzMAotICogIAkJLSBSZW1vdmVkIHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGRldmljZXMKLSAqICAJCS0gTW9kdWxlIG5vdyBhdXRvbG9hZHMgb24gZGV2aWNlIHBsdWdpbgotICogIAkJLSBNZXJnZWQgcmVsZXZhbnQgcGFydHMgb2Ygc2FybGliCi0gKiAgCQktIFJlcGxhY2VkIHRoZSBrZXJuZWwgdGhyZWFkIHdpdGggYSB0YXNrbGV0Ci0gKiAgCQktIE5ldyBwYWNrZXQgdHJhbnNtaXNzaW9uIGNvZGUKLSAqICAJCS0gQ2hhbmdlZCBwcm9jIGZpbGUgY29udGVudHMKLSAqICAJCS0gRml4ZWQgYWxsIGtub3duIFNNUCByYWNlcwotICogIAkJLSBNYW55IGZpeGVzIGFuZCBjbGVhbnVwcwotICogIAkJLSBWYXJpb3VzIGZpeGVzIGJ5IE9saXZlciBOZXVrdW0gKG9saXZlckBuZXVrdW0ubmFtZSkKLSAqCi0gKiAgMS41QToJLSBWZXJzaW9uIGZvciBpbmNsdXNpb24gaW4gMi41IHNlcmllcyBrZXJuZWwKLSAqCQktIE1vZGlmaWNhdGlvbnMgYnkgUmljaGFyZCBQdXJkaWUgKHJwdXJkaWVAcnBzeXMubmV0KQotICoJCS0gbWFkZSBjb21wYXRpYmxlIHdpdGgga2VybmVsIDIuNS42IG9ud2FyZHMgYnkgY2hhbmdpbmcKLSAqCQl1ZHNsX3VzYl9zZW5kX2RhdGFfY29udGV4dC0+dXJiIHRvIGEgcG9pbnRlciBhbmQgYWRkaW5nIGNvZGUKLSAqCQl0byBhbGxvYyBhbmQgZnJlZSBpdAotICoJCS0gcmVtb3ZlX3dhaXRfcXVldWUoKSBhZGRlZCB0byB1ZHNsX2F0bV9wcm9jZXNzcXVldWVfdGhyZWFkKCkKLSAqCi0gKiAgMS41OgktIGZpeGVkIG1lbW9yeSBsZWFrIHdoZW4gYXRtc2FyX2RlY29kZV9hYWw1IHJldHVybmVkIE5VTEwuCi0gKgkJKHJlcG9ydGVkIGJ5IHN0ZXBoZW4ucm9iaW5zb25AemVuLmNvLnVrKQotICoKLSAqICAxLjQ6CS0gY2hhbmdlZCB0aGUgc3Bpbl9sb2NrKCkgdW5kZXIgaW50ZXJydXB0IHRvIHNwaW5fbG9ja19pcnFzYXZlKCkKLSAqCQktIHVubGluayBhbGwgYWN0aXZlIHNlbmQgdXJicyBvZiBhIHZjYyB0aGF0IGlzIGJlaW5nIGNsb3NlZC4KLSAqCi0gKiAgMS4zLjE6CS0gYWRkZWQgdGhlIHZlcnNpb24gbnVtYmVyCi0gKgotICogIDEuMzoJLSBBZGRlZCBtdWx0aXBsZSBzZW5kIHVyYiBzdXBwb3J0Ci0gKgkJLSBmaXhlZCBtZW1vcnkgbGVhayBhbmQgdmNjLT50eF9pbnVzZSBzdGFydmF0aW9uIGJ1ZwotICoJCSAgd2hlbiBub3QgZW5vdWdoIG1lbW9yeSBsZWZ0IGluIHZjYy4KLSAqCi0gKiAgMS4yOgktIEZpeGVkIHJhY2UgY29uZGl0aW9uIGluIHVkc2xfdXNiX3NlbmRfZGF0YSgpCi0gKiAgMS4xOgktIFR1cm5lZCBvZmYgcGFja2V0IGRlYnVnZ2luZwotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0KLSNpbmNsdWRlICJ1c2JfYXRtLmgiCi0KLSNpZmRlZiBWRVJCT1NFX0RFQlVHCi1zdGF0aWMgaW50IHVkc2xfcHJpbnRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwotI2RlZmluZSBQQUNLRVRERUJVRyhhcmcuLi4pCXVkc2xfcHJpbnRfcGFja2V0IChhcmcpCi0jZGVmaW5lIHZkYmcoYXJnLi4uKQkJZGJnIChhcmcpCi0jZWxzZQotI2RlZmluZSBQQUNLRVRERUJVRyhhcmcuLi4pCi0jZGVmaW5lIHZkYmcoYXJnLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiSm9oYW4gVmVycmVwdCwgRHVuY2FuIFNhbmRzIDxkdW5jYW4uc2FuZHNAZnJlZS5mcj4iCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjgiCi0jZGVmaW5lIERSSVZFUl9ERVNDCSJHZW5lcmljIFVTQiBBVE0vRFNMIEkvTywgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3Jjdl91cmJzID0gVURTTF9ERUZBVUxUX1JDVl9VUkJTOwotc3RhdGljIHVuc2lnbmVkIGludCBudW1fc25kX3VyYnMgPSBVRFNMX0RFRkFVTFRfU05EX1VSQlM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9yY3ZfYnVmcyA9IFVEU0xfREVGQVVMVF9SQ1ZfQlVGUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3NuZF9idWZzID0gVURTTF9ERUZBVUxUX1NORF9CVUZTOwotc3RhdGljIHVuc2lnbmVkIGludCByY3ZfYnVmX3NpemUgPSBVRFNMX0RFRkFVTFRfUkNWX0JVRl9TSVpFOwotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYnVmX3NpemUgPSBVRFNMX0RFRkFVTFRfU05EX0JVRl9TSVpFOwotCi1tb2R1bGVfcGFyYW0obnVtX3Jjdl91cmJzLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobnVtX3Jjdl91cmJzLAotCQkgIk51bWJlciBvZiB1cmJzIHVzZWQgZm9yIHJlY2VwdGlvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1JDVl9VUkJTKSAiLCBkZWZhdWx0OiAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1JDVl9VUkJTKSAiKSIpOwotCi1tb2R1bGVfcGFyYW0obnVtX3NuZF91cmJzLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobnVtX3NuZF91cmJzLAotCQkgIk51bWJlciBvZiB1cmJzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1NORF9VUkJTKSAiLCBkZWZhdWx0OiAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1NORF9VUkJTKSAiKSIpOwotCi1tb2R1bGVfcGFyYW0obnVtX3Jjdl9idWZzLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobnVtX3Jjdl9idWZzLAotCQkgIk51bWJlciBvZiBidWZmZXJzIHVzZWQgZm9yIHJlY2VwdGlvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1JDVl9CVUZTKSAiLCBkZWZhdWx0OiAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1JDVl9CVUZTKSAiKSIpOwotCi1tb2R1bGVfcGFyYW0obnVtX3NuZF9idWZzLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobnVtX3NuZF9idWZzLAotCQkgIk51bWJlciBvZiBidWZmZXJzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1NORF9CVUZTKSAiLCBkZWZhdWx0OiAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1NORF9CVUZTKSAiKSIpOwotCi1tb2R1bGVfcGFyYW0ocmN2X2J1Zl9zaXplLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmN2X2J1Zl9zaXplLAotCQkgIlNpemUgb2YgdGhlIGJ1ZmZlcnMgdXNlZCBmb3IgcmVjZXB0aW9uIChyYW5nZTogMC0iCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9NQVhfUkNWX0JVRl9TSVpFKSAiLCBkZWZhdWx0OiAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1JDVl9CVUZfU0laRSkgIikiKTsKLQotbW9kdWxlX3BhcmFtKHNuZF9idWZfc2l6ZSwgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHNuZF9idWZfc2l6ZSwKLQkJICJTaXplIG9mIHRoZSBidWZmZXJzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1NORF9CVUZfU0laRSkgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9TTkRfQlVGX1NJWkUpICIpIik7Ci0KLS8qIEFUTSAqLwotCi1zdGF0aWMgdm9pZCB1ZHNsX2F0bV9kZXZfY2xvc2Uoc3RydWN0IGF0bV9kZXYgKmRldik7Ci1zdGF0aWMgaW50IHVkc2xfYXRtX29wZW4oc3RydWN0IGF0bV92Y2MgKnZjYyk7Ci1zdGF0aWMgdm9pZCB1ZHNsX2F0bV9jbG9zZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsKLXN0YXRpYyBpbnQgdWRzbF9hdG1faW9jdGwoc3RydWN0IGF0bV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOwotc3RhdGljIGludCB1ZHNsX2F0bV9zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIGludCB1ZHNsX2F0bV9wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYsIGxvZmZfdCAqIHBvcywgY2hhciAqcGFnZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRtZGV2X29wcyB1ZHNsX2F0bV9kZXZvcHMgPSB7Ci0JLmRldl9jbG9zZQk9IHVkc2xfYXRtX2Rldl9jbG9zZSwKLQkub3BlbgkJPSB1ZHNsX2F0bV9vcGVuLAotCS5jbG9zZQkJPSB1ZHNsX2F0bV9jbG9zZSwKLQkuaW9jdGwJCT0gdWRzbF9hdG1faW9jdGwsCi0JLnNlbmQJCT0gdWRzbF9hdG1fc2VuZCwKLQkucHJvY19yZWFkCT0gdWRzbF9hdG1fcHJvY19yZWFkLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLS8qKioqKioqKioqKgotKiogIG1pc2MgICoqCi0qKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHVkc2xfcG9wKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHZjYy0+cG9wKQotCQl2Y2MtPnBvcCh2Y2MsIHNrYik7Ci0JZWxzZQotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci19Ci0KLS8qKioqKioqKioqKioqCi0qKiAgZGVjb2RlICAqKgotKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRzbF92Y2NfZGF0YSAqdWRzbF9maW5kX3ZjYyhzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCQkJCSAgc2hvcnQgdnBpLCBpbnQgdmNpKQotewotCXN0cnVjdCB1ZHNsX3ZjY19kYXRhICp2Y2M7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjYywgJmluc3RhbmNlLT52Y2NfbGlzdCwgbGlzdCkKLQkJaWYgKCh2Y2MtPnZjaSA9PSB2Y2kpICYmICh2Y2MtPnZwaSA9PSB2cGkpKQotCQkJcmV0dXJuIHZjYzsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgdWRzbF9leHRyYWN0X2NlbGxzKHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IGhvd21hbnkpCi17Ci0Jc3RydWN0IHVkc2xfdmNjX2RhdGEgKmNhY2hlZF92Y2MgPSBOVUxMOwotCXN0cnVjdCBhdG1fdmNjICp2Y2M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNhcmI7Ci0Jc3RydWN0IHVkc2xfdmNjX2RhdGEgKnZjY19kYXRhOwotCWludCBjYWNoZWRfdmNpID0gMDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgcHRpOwotCWludCB2Y2k7Ci0Jc2hvcnQgY2FjaGVkX3ZwaSA9IDA7Ci0Jc2hvcnQgdnBpOwotCi0JZm9yIChpID0gMDsgaSA8IGhvd21hbnk7Ci0JICAgICBpKyssIHNvdXJjZSArPSBBVE1fQ0VMTF9TSVpFICsgaW5zdGFuY2UtPnJjdl9wYWRkaW5nKSB7Ci0JCXZwaSA9ICgoc291cmNlWzBdICYgMHgwZikgPDwgNCkgfCAoc291cmNlWzFdID4+IDQpOwotCQl2Y2kgPSAoKHNvdXJjZVsxXSAmIDB4MGYpIDw8IDEyKSB8IChzb3VyY2VbMl0gPDwgNCkgfCAoc291cmNlWzNdID4+IDQpOwotCQlwdGkgPSAoc291cmNlWzNdICYgMHgyKSAhPSAwOwotCi0JCXZkYmcoInVkc2xfZXh0cmFjdF9jZWxsczogdnBpICVoZCwgdmNpICVkLCBwdGkgJWQiLCB2cGksIHZjaSwgcHRpKTsKLQotCQlpZiAoY2FjaGVkX3ZjYyAmJiAodmNpID09IGNhY2hlZF92Y2kpICYmICh2cGkgPT0gY2FjaGVkX3ZwaSkpCi0JCQl2Y2NfZGF0YSA9IGNhY2hlZF92Y2M7Ci0JCWVsc2UgaWYgKCh2Y2NfZGF0YSA9IHVkc2xfZmluZF92Y2MoaW5zdGFuY2UsIHZwaSwgdmNpKSkpIHsKLQkJCWNhY2hlZF92Y2MgPSB2Y2NfZGF0YTsKLQkJCWNhY2hlZF92cGkgPSB2cGk7Ci0JCQljYWNoZWRfdmNpID0gdmNpOwotCQl9IGVsc2UgewotCQkJZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IHVua25vd24gdnBpL3ZjaSAoJWhkLyVkKSEiLCB2cGksIHZjaSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXZjYyA9IHZjY19kYXRhLT52Y2M7Ci0JCXNhcmIgPSB2Y2NfZGF0YS0+c2FyYjsKLQotCQlpZiAoc2FyYi0+dGFpbCArIEFUTV9DRUxMX1BBWUxPQUQgPiBzYXJiLT5lbmQpIHsKLQkJCWRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBidWZmZXIgb3ZlcnJ1biAoc2FyYi0+bGVuICV1LCB2Y2M6IDB4JXApISIsIHNhcmItPmxlbiwgdmNjKTsKLQkJCS8qIGRpc2NhcmQgY2VsbHMgYWxyZWFkeSByZWNlaXZlZCAqLwotCQkJc2tiX3RyaW0oc2FyYiwgMCk7Ci0JCX0KLQotCQltZW1jcHkoc2FyYi0+dGFpbCwgc291cmNlICsgQVRNX0NFTExfSEVBREVSLCBBVE1fQ0VMTF9QQVlMT0FEKTsKLQkJX19za2JfcHV0KHNhcmIsIEFUTV9DRUxMX1BBWUxPQUQpOwotCi0JCWlmIChwdGkpIHsKLQkJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCQkJdW5zaWduZWQgaW50IHBkdV9sZW5ndGg7Ci0KLQkJCWxlbmd0aCA9IChzb3VyY2VbQVRNX0NFTExfU0laRSAtIDZdIDw8IDgpICsgc291cmNlW0FUTV9DRUxMX1NJWkUgLSA1XTsKLQotCQkJLyogZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdyAqLwotCQkJaWYgKGxlbmd0aCA+IEFUTV9NQVhfQUFMNV9QRFUpIHsKLQkJCQlkYmcoInVkc2xfZXh0cmFjdF9jZWxsczogYm9ndXMgbGVuZ3RoICV1ICh2Y2M6IDB4JXApISIsIGxlbmd0aCwgdmNjKTsKLQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlwZHVfbGVuZ3RoID0gVURTTF9OVU1fQ0VMTFMobGVuZ3RoKSAqIEFUTV9DRUxMX1BBWUxPQUQ7Ci0KLQkJCWlmIChzYXJiLT5sZW4gPCBwZHVfbGVuZ3RoKSB7Ci0JCQkJZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IGJvZ3VzIHBkdV9sZW5ndGggJXUgKHNhcmItPmxlbjogJXUsIHZjYzogMHglcCkhIiwgcGR1X2xlbmd0aCwgc2FyYi0+bGVuLCB2Y2MpOwotCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWlmIChjcmMzMl9iZSh+MCwgc2FyYi0+dGFpbCAtIHBkdV9sZW5ndGgsIHBkdV9sZW5ndGgpICE9IDB4YzcwNGRkN2IpIHsKLQkJCQlkYmcoInVkc2xfZXh0cmFjdF9jZWxsczogcGFja2V0IGZhaWxlZCBjcmMgY2hlY2sgKHZjYzogMHglcCkhIiwgdmNjKTsKLQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQl2ZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IGdvdCBwYWNrZXQgKGxlbmd0aDogJXUsIHBkdV9sZW5ndGg6ICV1LCB2Y2M6IDB4JXApIiwgbGVuZ3RoLCBwZHVfbGVuZ3RoLCB2Y2MpOwotCi0JCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCkpKSB7Ci0JCQkJZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IG5vIG1lbW9yeSBmb3Igc2tiIChsZW5ndGg6ICV1KSEiLCBsZW5ndGgpOwotCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQl2ZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IGFsbG9jYXRlZCBuZXcgc2tfYnVmZiAoc2tiOiAweCVwLCBza2ItPnRydWVzaXplOiAldSkiLCBza2IsIHNrYi0+dHJ1ZXNpemUpOwotCi0JCQlpZiAoIWF0bV9jaGFyZ2UodmNjLCBza2ItPnRydWVzaXplKSkgewotCQkJCWRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBmYWlsZWQgYXRtX2NoYXJnZSAoc2tiLT50cnVlc2l6ZTogJXUpISIsIHNrYi0+dHJ1ZXNpemUpOwotCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCQlnb3RvIG91dDsJLyogYXRtX2NoYXJnZSBpbmNyZW1lbnRzIHJ4X2Ryb3AgKi8KLQkJCX0KLQotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2FyYi0+dGFpbCAtIHBkdV9sZW5ndGgsIGxlbmd0aCk7Ci0JCQlfX3NrYl9wdXQoc2tiLCBsZW5ndGgpOwotCi0JCQl2ZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IHNlbmRpbmcgc2tiIDB4JXAsIHNrYi0+bGVuICV1LCBza2ItPnRydWVzaXplICV1Iiwgc2tiLCBza2ItPmxlbiwgc2tiLT50cnVlc2l6ZSk7Ci0KLQkJCVBBQ0tFVERFQlVHKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JCQl2Y2MtPnB1c2godmNjLCBza2IpOwotCi0JCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7Ci0JCW91dDoKLQkJCXNrYl90cmltKHNhcmIsIDApOwotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKgotKiogIGVuY29kZSAgKioKLSoqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1ZHNsX2ZpbGxfY2VsbF9oZWFkZXIodW5zaWduZWQgY2hhciAqdGFyZ2V0LCBzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQotewotCXRhcmdldFswXSA9IHZjYy0+dnBpID4+IDQ7Ci0JdGFyZ2V0WzFdID0gKHZjYy0+dnBpIDw8IDQpIHwgKHZjYy0+dmNpID4+IDEyKTsKLQl0YXJnZXRbMl0gPSB2Y2MtPnZjaSA+PiA0OwotCXRhcmdldFszXSA9IHZjYy0+dmNpIDw8IDQ7Ci0JdGFyZ2V0WzRdID0gMHhlYzsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgemVyb3NbQVRNX0NFTExfUEFZTE9BRF07Ci0KLXN0YXRpYyB2b2lkIHVkc2xfZ3Jvb21fc2tiKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHVkc2xfY29udHJvbCAqY3RybCA9IFVEU0xfU0tCKHNrYik7Ci0JdW5zaWduZWQgaW50IHplcm9fcGFkZGluZzsKLQl1MzIgY3JjOwotCi0JY3RybC0+YXRtX2RhdGEudmNjID0gdmNjOwotCi0JY3RybC0+bnVtX2NlbGxzID0gVURTTF9OVU1fQ0VMTFMoc2tiLT5sZW4pOwotCWN0cmwtPm51bV9lbnRpcmUgPSBza2ItPmxlbiAvIEFUTV9DRUxMX1BBWUxPQUQ7Ci0KLQl6ZXJvX3BhZGRpbmcgPSBjdHJsLT5udW1fY2VsbHMgKiBBVE1fQ0VMTF9QQVlMT0FEIC0gc2tiLT5sZW4gLSBBVE1fQUFMNV9UUkFJTEVSOwotCi0JaWYgKGN0cmwtPm51bV9lbnRpcmUgKyAxIDwgY3RybC0+bnVtX2NlbGxzKQotCQljdHJsLT5wZHVfcGFkZGluZyA9IHplcm9fcGFkZGluZyAtIChBVE1fQ0VMTF9QQVlMT0FEIC0gQVRNX0FBTDVfVFJBSUxFUik7Ci0JZWxzZQotCQljdHJsLT5wZHVfcGFkZGluZyA9IHplcm9fcGFkZGluZzsKLQotCWN0cmwtPmFhbDVfdHJhaWxlclswXSA9IDA7CS8qIFVVID0gMCAqLwotCWN0cmwtPmFhbDVfdHJhaWxlclsxXSA9IDA7CS8qIENQSSA9IDAgKi8KLQljdHJsLT5hYWw1X3RyYWlsZXJbMl0gPSBza2ItPmxlbiA+PiA4OwotCWN0cmwtPmFhbDVfdHJhaWxlclszXSA9IHNrYi0+bGVuOwotCi0JY3JjID0gY3JjMzJfYmUofjAsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCWNyYyA9IGNyYzMyX2JlKGNyYywgemVyb3MsIHplcm9fcGFkZGluZyk7Ci0JY3JjID0gY3JjMzJfYmUoY3JjLCBjdHJsLT5hYWw1X3RyYWlsZXIsIDQpOwotCWNyYyA9IH5jcmM7Ci0KLQljdHJsLT5hYWw1X3RyYWlsZXJbNF0gPSBjcmMgPj4gMjQ7Ci0JY3RybC0+YWFsNV90cmFpbGVyWzVdID0gY3JjID4+IDE2OwotCWN0cmwtPmFhbDVfdHJhaWxlcls2XSA9IGNyYyA+PiA4OwotCWN0cmwtPmFhbDVfdHJhaWxlcls3XSA9IGNyYzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB1ZHNsX3dyaXRlX2NlbGxzKHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlLAotCQkJCSAgICAgdW5zaWduZWQgaW50IGhvd21hbnksIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICB1bnNpZ25lZCBjaGFyICoqdGFyZ2V0X3ApCi17Ci0Jc3RydWN0IHVkc2xfY29udHJvbCAqY3RybCA9IFVEU0xfU0tCKHNrYik7Ci0JdW5zaWduZWQgY2hhciAqdGFyZ2V0ID0gKnRhcmdldF9wOwotCXVuc2lnbmVkIGludCBuYywgbmUsIGk7Ci0KLQl2ZGJnKCJ1ZHNsX3dyaXRlX2NlbGxzOiBob3dtYW55PSV1LCBza2ItPmxlbj0lZCwgbnVtX2NlbGxzPSV1LCBudW1fZW50aXJlPSV1LCBwZHVfcGFkZGluZz0ldSIsIGhvd21hbnksIHNrYi0+bGVuLCBjdHJsLT5udW1fY2VsbHMsIGN0cmwtPm51bV9lbnRpcmUsIGN0cmwtPnBkdV9wYWRkaW5nKTsKLQotCW5jID0gY3RybC0+bnVtX2NlbGxzOwotCW5lID0gbWluKGhvd21hbnksIGN0cmwtPm51bV9lbnRpcmUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5lOyBpKyspIHsKLQkJdWRzbF9maWxsX2NlbGxfaGVhZGVyKHRhcmdldCwgY3RybC0+YXRtX2RhdGEudmNjKTsKLQkJdGFyZ2V0ICs9IEFUTV9DRUxMX0hFQURFUjsKLQkJbWVtY3B5KHRhcmdldCwgc2tiLT5kYXRhLCBBVE1fQ0VMTF9QQVlMT0FEKTsKLQkJdGFyZ2V0ICs9IEFUTV9DRUxMX1BBWUxPQUQ7Ci0JCWlmIChpbnN0YW5jZS0+c25kX3BhZGRpbmcpIHsKLQkJCW1lbXNldCh0YXJnZXQsIDAsIGluc3RhbmNlLT5zbmRfcGFkZGluZyk7Ci0JCQl0YXJnZXQgKz0gaW5zdGFuY2UtPnNuZF9wYWRkaW5nOwotCQl9Ci0JCV9fc2tiX3B1bGwoc2tiLCBBVE1fQ0VMTF9QQVlMT0FEKTsKLQl9Ci0KLQljdHJsLT5udW1fZW50aXJlIC09IG5lOwotCi0JaWYgKCEoY3RybC0+bnVtX2NlbGxzIC09IG5lKSB8fCAhKGhvd21hbnkgLT0gbmUpKQotCQlnb3RvIG91dDsKLQotCXVkc2xfZmlsbF9jZWxsX2hlYWRlcih0YXJnZXQsIGN0cmwtPmF0bV9kYXRhLnZjYyk7Ci0JdGFyZ2V0ICs9IEFUTV9DRUxMX0hFQURFUjsKLQltZW1jcHkodGFyZ2V0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQl0YXJnZXQgKz0gc2tiLT5sZW47Ci0JX19za2JfcHVsbChza2IsIHNrYi0+bGVuKTsKLQltZW1zZXQodGFyZ2V0LCAwLCBjdHJsLT5wZHVfcGFkZGluZyk7Ci0JdGFyZ2V0ICs9IGN0cmwtPnBkdV9wYWRkaW5nOwotCi0JaWYgKC0tY3RybC0+bnVtX2NlbGxzKSB7Ci0JCWlmICghLS1ob3dtYW55KSB7Ci0JCQljdHJsLT5wZHVfcGFkZGluZyA9IEFUTV9DRUxMX1BBWUxPQUQgLSBBVE1fQUFMNV9UUkFJTEVSOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoaW5zdGFuY2UtPnNuZF9wYWRkaW5nKSB7Ci0JCQltZW1zZXQodGFyZ2V0LCAwLCBpbnN0YW5jZS0+c25kX3BhZGRpbmcpOwotCQkJdGFyZ2V0ICs9IGluc3RhbmNlLT5zbmRfcGFkZGluZzsKLQkJfQotCQl1ZHNsX2ZpbGxfY2VsbF9oZWFkZXIodGFyZ2V0LCBjdHJsLT5hdG1fZGF0YS52Y2MpOwotCQl0YXJnZXQgKz0gQVRNX0NFTExfSEVBREVSOwotCQltZW1zZXQodGFyZ2V0LCAwLCBBVE1fQ0VMTF9QQVlMT0FEIC0gQVRNX0FBTDVfVFJBSUxFUik7Ci0JCXRhcmdldCArPSBBVE1fQ0VMTF9QQVlMT0FEIC0gQVRNX0FBTDVfVFJBSUxFUjsKLQotCQktLWN0cmwtPm51bV9jZWxsczsKLQkJVURTTF9BU1NFUlQoIWN0cmwtPm51bV9jZWxscyk7Ci0JfQotCi0JbWVtY3B5KHRhcmdldCwgY3RybC0+YWFsNV90cmFpbGVyLCBBVE1fQUFMNV9UUkFJTEVSKTsKLQl0YXJnZXQgKz0gQVRNX0FBTDVfVFJBSUxFUjsKLQkvKiBzZXQgcHRpIGJpdCBpbiBsYXN0IGNlbGwgKi8KLQkqKHRhcmdldCArIDMgLSBBVE1fQ0VMTF9TSVpFKSB8PSAweDI7Ci0JaWYgKGluc3RhbmNlLT5zbmRfcGFkZGluZykgewotCQltZW1zZXQodGFyZ2V0LCAwLCBpbnN0YW5jZS0+c25kX3BhZGRpbmcpOwotCQl0YXJnZXQgKz0gaW5zdGFuY2UtPnNuZF9wYWRkaW5nOwotCX0KLSBvdXQ6Ci0JKnRhcmdldF9wID0gdGFyZ2V0OwotCXJldHVybiBuYyAtIGN0cmwtPm51bV9jZWxsczsKLX0KLQotLyoqKioqKioqKioqKioqCi0qKiAgcmVjZWl2ZSAgKioKLSoqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCB1ZHNsX2NvbXBsZXRlX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgdWRzbF9yZWNlaXZlX2J1ZmZlciAqYnVmOwotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlOwotCXN0cnVjdCB1ZHNsX3JlY2VpdmVyICpyY3Y7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghdXJiIHx8ICEocmN2ID0gdXJiLT5jb250ZXh0KSkgewotCQlkYmcoInVkc2xfY29tcGxldGVfcmVjZWl2ZTogYmFkIHVyYiEiKTsKLQkJcmV0dXJuOwotCX0KLQotCWluc3RhbmNlID0gcmN2LT5pbnN0YW5jZTsKLQlidWYgPSByY3YtPmJ1ZmZlcjsKLQotCWJ1Zi0+ZmlsbGVkX2NlbGxzID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC8gKEFUTV9DRUxMX1NJWkUgKyBpbnN0YW5jZS0+cmN2X3BhZGRpbmcpOwotCi0JdmRiZygidWRzbF9jb21wbGV0ZV9yZWNlaXZlOiB1cmIgMHglcCwgc3RhdHVzICVkLCBhY3R1YWxfbGVuZ3RoICVkLCBmaWxsZWRfY2VsbHMgJXUsIHJjdiAweCVwLCBidWYgMHglcCIsIHVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCwgYnVmLT5maWxsZWRfY2VsbHMsIHJjdiwgYnVmKTsKLQotCVVEU0xfQVNTRVJUKGJ1Zi0+ZmlsbGVkX2NlbGxzIDw9IHJjdl9idWZfc2l6ZSk7Ci0KLQkvKiBtYXkgbm90IGJlIGluX2ludGVycnVwdCgpICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmcmN2LT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVycyk7Ci0JbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPmZpbGxlZF9yZWNlaXZlX2J1ZmZlcnMpOwotCWlmIChsaWtlbHkoIXVyYi0+c3RhdHVzKSkKLQkJdGFza2xldF9zY2hlZHVsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB1ZHNsX3Byb2Nlc3NfcmVjZWl2ZSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IChzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICopZGF0YTsKLQlzdHJ1Y3QgdWRzbF9yZWNlaXZlciAqcmN2OwotCWludCBlcnI7Ci0KLSBtYWRlX3Byb2dyZXNzOgotCXdoaWxlICghbGlzdF9lbXB0eSgmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycykpIHsKLQkJc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jayk7Ci0JCWlmIChsaXN0X2VtcHR5KCZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZXJzKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjdiA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVycy5uZXh0LAotCQkJCSBzdHJ1Y3QgdWRzbF9yZWNlaXZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZyY3YtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCi0JCWJ1ZiA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycy5uZXh0LAotCQkJCSBzdHJ1Y3QgdWRzbF9yZWNlaXZlX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCi0JCXJjdi0+YnVmZmVyID0gYnVmOwotCi0JCXVzYl9maWxsX2J1bGtfdXJiKHJjdi0+dXJiLCBpbnN0YW5jZS0+dXNiX2RldiwKLQkJCQkgIHVzYl9yY3ZidWxrcGlwZShpbnN0YW5jZS0+dXNiX2RldiwgaW5zdGFuY2UtPmRhdGFfZW5kcG9pbnQpLAotCQkJCSAgYnVmLT5iYXNlLAotCQkJCSAgcmN2X2J1Zl9zaXplICogKEFUTV9DRUxMX1NJWkUgKyBpbnN0YW5jZS0+cmN2X3BhZGRpbmcpLAotCQkJCSAgdWRzbF9jb21wbGV0ZV9yZWNlaXZlLCByY3YpOwotCi0JCXZkYmcoInVkc2xfcHJvY2Vzc19yZWNlaXZlOiBzZW5kaW5nIHVyYiAweCVwLCByY3YgMHglcCwgYnVmIDB4JXAiLAotCQkgICAgIHJjdi0+dXJiLCByY3YsIGJ1Zik7Ci0KLQkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYihyY3YtPnVyYiwgR0ZQX0FUT01JQykpIDwgMCkgewotCQkJZGJnKCJ1ZHNsX3Byb2Nlc3NfcmVjZWl2ZTogdXJiIHN1Ym1pc3Npb24gZmFpbGVkICglZCkhIiwgZXJyKTsKLQkJCWxpc3RfYWRkKCZidWYtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZV9idWZmZXJzKTsKLQkJCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCQkJbGlzdF9hZGQoJnJjdi0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9yZWNlaXZlcnMpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJmluc3RhbmNlLT5maWxsZWRfcmVjZWl2ZV9idWZmZXJzKSkgewotCQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCQlyZXR1cm47CQkvKiBkb25lIC0gbm8gbW9yZSBidWZmZXJzICovCi0JfQotCWJ1ZiA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPmZpbGxlZF9yZWNlaXZlX2J1ZmZlcnMubmV4dCwKLQkJCSBzdHJ1Y3QgdWRzbF9yZWNlaXZlX2J1ZmZlciwgbGlzdCk7Ci0JbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQotCXZkYmcoInVkc2xfcHJvY2Vzc19yZWNlaXZlOiBwcm9jZXNzaW5nIGJ1ZiAweCVwIiwgYnVmKTsKLQl1ZHNsX2V4dHJhY3RfY2VsbHMoaW5zdGFuY2UsIGJ1Zi0+YmFzZSwgYnVmLT5maWxsZWRfY2VsbHMpOwotCWxpc3RfYWRkKCZidWYtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZV9idWZmZXJzKTsKLQlnb3RvIG1hZGVfcHJvZ3Jlc3M7Ci19Ci0KLS8qKioqKioqKioqKgotKiogIHNlbmQgICoqCi0qKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdWRzbF9jb21wbGV0ZV9zZW5kKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2U7Ci0Jc3RydWN0IHVkc2xfc2VuZGVyICpzbmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghdXJiIHx8ICEoc25kID0gdXJiLT5jb250ZXh0KSB8fCAhKGluc3RhbmNlID0gc25kLT5pbnN0YW5jZSkpIHsKLQkJZGJnKCJ1ZHNsX2NvbXBsZXRlX3NlbmQ6IGJhZCB1cmIhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZGJnKCJ1ZHNsX2NvbXBsZXRlX3NlbmQ6IHVyYiAweCVwLCBzdGF0dXMgJWQsIHNuZCAweCVwLCBidWYgMHglcCIsIHVyYiwKLQkgICAgIHVyYi0+c3RhdHVzLCBzbmQsIHNuZC0+YnVmZmVyKTsKLQotCS8qIG1heSBub3QgYmUgaW5faW50ZXJydXB0KCkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnNlbmRfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZzbmQtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfc2VuZGVycyk7Ci0JbGlzdF9hZGQoJnNuZC0+YnVmZmVyLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3NlbmRfYnVmZmVycyk7Ci0JdGFza2xldF9zY2hlZHVsZSgmaW5zdGFuY2UtPnNlbmRfdGFza2xldCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnNlbmRfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB1ZHNsX3Byb2Nlc3Nfc2VuZCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHVkc2xfc2VuZF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IChzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICopZGF0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCB1ZHNsX3NlbmRlciAqc25kOwotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IG51bV93cml0dGVuOwotCi0gbWFkZV9wcm9ncmVzczoKLQlzcGluX2xvY2tfaXJxKCZpbnN0YW5jZS0+c2VuZF9sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmluc3RhbmNlLT5zcGFyZV9zZW5kZXJzKSkgewotCQlpZiAoIWxpc3RfZW1wdHkoJmluc3RhbmNlLT5maWxsZWRfc2VuZF9idWZmZXJzKSkgewotCQkJYnVmID0gbGlzdF9lbnRyeShpbnN0YW5jZS0+ZmlsbGVkX3NlbmRfYnVmZmVycy5uZXh0LAotCQkJCQkgc3RydWN0IHVkc2xfc2VuZF9idWZmZXIsIGxpc3QpOwotCQkJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7Ci0JCX0gZWxzZSBpZiAoKGJ1ZiA9IGluc3RhbmNlLT5jdXJyZW50X2J1ZmZlcikpIHsKLQkJCWluc3RhbmNlLT5jdXJyZW50X2J1ZmZlciA9IE5VTEw7Ci0JCX0gZWxzZQkJLyogYWxsIGJ1ZmZlcnMgZW1wdHkgKi8KLQkJCWJyZWFrOwotCi0JCXNuZCA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPnNwYXJlX3NlbmRlcnMubmV4dCwKLQkJCQkgc3RydWN0IHVkc2xfc2VuZGVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnNuZC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0KLQkJc25kLT5idWZmZXIgPSBidWY7Ci0JCXVzYl9maWxsX2J1bGtfdXJiKHNuZC0+dXJiLCBpbnN0YW5jZS0+dXNiX2RldiwKLQkJCQkgIHVzYl9zbmRidWxrcGlwZShpbnN0YW5jZS0+dXNiX2RldiwgaW5zdGFuY2UtPmRhdGFfZW5kcG9pbnQpLAotCQkJCSAgYnVmLT5iYXNlLAotCQkJCSAgKHNuZF9idWZfc2l6ZSAtIGJ1Zi0+ZnJlZV9jZWxscykgKiAoQVRNX0NFTExfU0laRSArIGluc3RhbmNlLT5zbmRfcGFkZGluZyksCi0JCQkJICB1ZHNsX2NvbXBsZXRlX3NlbmQsIHNuZCk7Ci0KLQkJdmRiZygidWRzbF9wcm9jZXNzX3NlbmQ6IHN1Ym1pdHRpbmcgdXJiIDB4JXAgKCVkIGNlbGxzKSwgc25kIDB4JXAsIGJ1ZiAweCVwIiwKLQkJICAgICBzbmQtPnVyYiwgc25kX2J1Zl9zaXplIC0gYnVmLT5mcmVlX2NlbGxzLCBzbmQsIGJ1Zik7Ci0KLQkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYihzbmQtPnVyYiwgR0ZQX0FUT01JQykpIDwgMCkgewotCQkJZGJnKCJ1ZHNsX3Byb2Nlc3Nfc2VuZDogdXJiIHN1Ym1pc3Npb24gZmFpbGVkICglZCkhIiwgZXJyKTsKLQkJCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCQkJbGlzdF9hZGQoJnNuZC0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9zZW5kZXJzKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0JCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPmZpbGxlZF9zZW5kX2J1ZmZlcnMpOwotCQkJcmV0dXJuOwkvKiBiYWlsIG91dCAqLwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0JfQkJCS8qIHdoaWxlICovCi0Jc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+c2VuZF9sb2NrKTsKLQotCWlmICghaW5zdGFuY2UtPmN1cnJlbnRfc2tiKQotCQlpbnN0YW5jZS0+Y3VycmVudF9za2IgPSBza2JfZGVxdWV1ZSgmaW5zdGFuY2UtPnNuZHF1ZXVlKTsKLQlpZiAoIWluc3RhbmNlLT5jdXJyZW50X3NrYikKLQkJcmV0dXJuOwkJLyogZG9uZSAtIG5vIG1vcmUgc2ticyAqLwotCi0Jc2tiID0gaW5zdGFuY2UtPmN1cnJlbnRfc2tiOwotCi0JaWYgKCEoYnVmID0gaW5zdGFuY2UtPmN1cnJlbnRfYnVmZmVyKSkgewotCQlzcGluX2xvY2tfaXJxKCZpbnN0YW5jZS0+c2VuZF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmluc3RhbmNlLT5zcGFyZV9zZW5kX2J1ZmZlcnMpKSB7Ci0JCQlpbnN0YW5jZS0+Y3VycmVudF9idWZmZXIgPSBOVUxMOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+c2VuZF9sb2NrKTsKLQkJCXJldHVybjsJLyogZG9uZSAtIG5vIG1vcmUgYnVmZmVycyAqLwotCQl9Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPnNwYXJlX3NlbmRfYnVmZmVycy5uZXh0LAotCQkJICAgICAgIHN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0KLQkJYnVmLT5mcmVlX3N0YXJ0ID0gYnVmLT5iYXNlOwotCQlidWYtPmZyZWVfY2VsbHMgPSBzbmRfYnVmX3NpemU7Ci0KLQkJaW5zdGFuY2UtPmN1cnJlbnRfYnVmZmVyID0gYnVmOwotCX0KLQotCW51bV93cml0dGVuID0gdWRzbF93cml0ZV9jZWxscyhpbnN0YW5jZSwgYnVmLT5mcmVlX2NlbGxzLCBza2IsICZidWYtPmZyZWVfc3RhcnQpOwotCi0JdmRiZygidWRzbF9wcm9jZXNzX3NlbmQ6IHdyb3RlICV1IGNlbGxzIGZyb20gc2tiIDB4JXAgdG8gYnVmZmVyIDB4JXAiLAotCSAgICAgbnVtX3dyaXR0ZW4sIHNrYiwgYnVmKTsKLQotCWlmICghKGJ1Zi0+ZnJlZV9jZWxscyAtPSBudW1fd3JpdHRlbikpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPmZpbGxlZF9zZW5kX2J1ZmZlcnMpOwotCQlpbnN0YW5jZS0+Y3VycmVudF9idWZmZXIgPSBOVUxMOwotCX0KLQotCXZkYmcoInVkc2xfcHJvY2Vzc19zZW5kOiBidWZmZXIgY29udGFpbnMgJWQgY2VsbHMsICVkIGxlZnQiLAotCSAgICAgc25kX2J1Zl9zaXplIC0gYnVmLT5mcmVlX2NlbGxzLCBidWYtPmZyZWVfY2VsbHMpOwotCi0JaWYgKCFVRFNMX1NLQihza2IpLT5udW1fY2VsbHMpIHsKLQkJc3RydWN0IGF0bV92Y2MgKnZjYyA9IFVEU0xfU0tCKHNrYiktPmF0bV9kYXRhLnZjYzsKLQotCQl1ZHNsX3BvcCh2Y2MsIHNrYik7Ci0JCWluc3RhbmNlLT5jdXJyZW50X3NrYiA9IE5VTEw7Ci0KLQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+dHgpOwotCX0KLQotCWdvdG8gbWFkZV9wcm9ncmVzczsKLX0KLQotc3RhdGljIHZvaWQgdWRzbF9jYW5jZWxfc2VuZChzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCSAgICAgc3RydWN0IGF0bV92Y2MgKnZjYykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbjsKLQotCWRiZygidWRzbF9jYW5jZWxfc2VuZCBlbnRlcmVkIik7Ci0Jc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNuZHF1ZXVlLmxvY2spOwotCWZvciAoc2tiID0gaW5zdGFuY2UtPnNuZHF1ZXVlLm5leHQsIG4gPSBza2ItPm5leHQ7Ci0JICAgICBza2IgIT0gKHN0cnVjdCBza19idWZmICopJmluc3RhbmNlLT5zbmRxdWV1ZTsKLQkgICAgIHNrYiA9IG4sIG4gPSBza2ItPm5leHQpCi0JCWlmIChVRFNMX1NLQihza2IpLT5hdG1fZGF0YS52Y2MgPT0gdmNjKSB7Ci0JCQlkYmcoInVkc2xfY2FuY2VsX3NlbmQ6IHBvcHBpbmcgc2tiIDB4JXAiLCBza2IpOwotCQkJX19za2JfdW5saW5rKHNrYiwgJmluc3RhbmNlLT5zbmRxdWV1ZSk7Ci0JCQl1ZHNsX3BvcCh2Y2MsIHNrYik7Ci0JCX0KLQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zbmRxdWV1ZS5sb2NrKTsKLQotCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnNlbmRfdGFza2xldCk7Ci0JaWYgKChza2IgPSBpbnN0YW5jZS0+Y3VycmVudF9za2IpICYmIChVRFNMX1NLQihza2IpLT5hdG1fZGF0YS52Y2MgPT0gdmNjKSkgewotCQlkYmcoInVkc2xfY2FuY2VsX3NlbmQ6IHBvcHBpbmcgY3VycmVudCBza2IgKDB4JXApIiwgc2tiKTsKLQkJaW5zdGFuY2UtPmN1cnJlbnRfc2tiID0gTlVMTDsKLQkJdWRzbF9wb3AodmNjLCBza2IpOwotCX0KLQl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnNlbmRfdGFza2xldCk7Ci0JZGJnKCJ1ZHNsX2NhbmNlbF9zZW5kIGRvbmUiKTsKLX0KLQotc3RhdGljIGludCB1ZHNsX2F0bV9zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB2Y2MtPmRldi0+ZGV2X2RhdGE7Ci0JaW50IGVycjsKLQotCXZkYmcoInVkc2xfYXRtX3NlbmQgY2FsbGVkIChza2IgMHglcCwgbGVuICV1KSIsIHNrYiwgc2tiLT5sZW4pOwotCi0JaWYgKCFpbnN0YW5jZSkgewotCQlkYmcoInVkc2xfYXRtX3NlbmQ6IE5VTEwgZGF0YSEiKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmICh2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDUpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9zZW5kOiB1bnN1cHBvcnRlZCBBVE0gdHlwZSAlZCEiLCB2Y2MtPnFvcy5hYWwpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHNrYi0+bGVuID4gQVRNX01BWF9BQUw1X1BEVSkgewotCQlkYmcoInVkc2xfYXRtX3NlbmQ6IHBhY2tldCB0b28gbG9uZyAoJWQgdnMgJWQpISIsIHNrYi0+bGVuLAotCQkgICAgQVRNX01BWF9BQUw1X1BEVSk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlQQUNLRVRERUJVRyhza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQotCXVkc2xfZ3Jvb21fc2tiKHZjYywgc2tiKTsKLQlza2JfcXVldWVfdGFpbCgmaW5zdGFuY2UtPnNuZHF1ZXVlLCBza2IpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCi0JcmV0dXJuIDA7Ci0KLSBmYWlsOgotCXVkc2xfcG9wKHZjYywgc2tiKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSoqICBiZWFuIGNvdW50aW5nICAqKgotKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHVkc2xfZGVzdHJveV9pbnN0YW5jZShzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9Ci0JICAgIGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhLCByZWZjb3VudCk7Ci0KLQl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5yZWNlaXZlX3Rhc2tsZXQpOwotCXRhc2tsZXRfa2lsbCgmaW5zdGFuY2UtPnNlbmRfdGFza2xldCk7Ci0JdXNiX3B1dF9kZXYoaW5zdGFuY2UtPnVzYl9kZXYpOwotCWtmcmVlKGluc3RhbmNlKTsKLX0KLQotdm9pZCB1ZHNsX2dldF9pbnN0YW5jZShzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKLXsKLQlrcmVmX2dldCgmaW5zdGFuY2UtPnJlZmNvdW50KTsKLX0KLQotdm9pZCB1ZHNsX3B1dF9pbnN0YW5jZShzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKLXsKLQlrcmVmX3B1dCgmaW5zdGFuY2UtPnJlZmNvdW50LCB1ZHNsX2Rlc3Ryb3lfaW5zdGFuY2UpOwotfQotCi0vKioqKioqKioqKgotKiogIEFUTSAgKioKLSoqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHVkc2xfYXRtX2Rldl9jbG9zZShzdHJ1Y3QgYXRtX2RldiAqZGV2KQotewotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gZGV2LT5kZXZfZGF0YTsKLQotCWRldi0+ZGV2X2RhdGEgPSBOVUxMOwotCXVkc2xfcHV0X2luc3RhbmNlKGluc3RhbmNlKTsKLX0KLQotc3RhdGljIGludCB1ZHNsX2F0bV9wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYsIGxvZmZfdCAqIHBvcywgY2hhciAqcGFnZSkKLXsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IGF0bV9kZXYtPmRldl9kYXRhOwotCWludCBsZWZ0ID0gKnBvczsKLQotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9wcm9jX3JlYWQ6IE5VTEwgaW5zdGFuY2UhIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghbGVmdC0tKQotCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGluc3RhbmNlLT5kZXNjcmlwdGlvbik7Ci0KLQlpZiAoIWxlZnQtLSkKLQkJcmV0dXJuIHNwcmludGYocGFnZSwgIk1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkgICAgICAgYXRtX2Rldi0+ZXNpWzBdLCBhdG1fZGV2LT5lc2lbMV0sCi0JCQkgICAgICAgYXRtX2Rldi0+ZXNpWzJdLCBhdG1fZGV2LT5lc2lbM10sCi0JCQkgICAgICAgYXRtX2Rldi0+ZXNpWzRdLCBhdG1fZGV2LT5lc2lbNV0pOwotCi0JaWYgKCFsZWZ0LS0pCi0JCXJldHVybiBzcHJpbnRmKHBhZ2UsCi0JCQkgICAgICAgIkFBTDU6IHR4ICVkICggJWQgZXJyICksIHJ4ICVkICggJWQgZXJyLCAlZCBkcm9wIClcbiIsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmF0bV9kZXYtPnN0YXRzLmFhbDUudHgpLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnR4X2VyciksCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmF0bV9kZXYtPnN0YXRzLmFhbDUucngpLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnJ4X2VyciksCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmF0bV9kZXYtPnN0YXRzLmFhbDUucnhfZHJvcCkpOwotCi0JaWYgKCFsZWZ0LS0pIHsKLQkJc3dpdGNoIChhdG1fZGV2LT5zaWduYWwpIHsKLQkJY2FzZSBBVE1fUEhZX1NJR19GT1VORDoKLQkJCXNwcmludGYocGFnZSwgIkxpbmUgdXAiKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUTV9QSFlfU0lHX0xPU1Q6Ci0JCQlzcHJpbnRmKHBhZ2UsICJMaW5lIGRvd24iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwYWdlLCAiTGluZSBzdGF0ZSB1bmtub3duIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpbnN0YW5jZS0+dXNiX2Rldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQkJc3RyY2F0KHBhZ2UsICIsIGRpc2Nvbm5lY3RlZFxuIik7Ci0JCWVsc2UgewotCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gVURTTF9MT0FERURfRklSTVdBUkUpCi0JCQkJc3RyY2F0KHBhZ2UsICIsIGZpcm13YXJlIGxvYWRlZFxuIik7Ci0JCQllbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IFVEU0xfTE9BRElOR19GSVJNV0FSRSkKLQkJCQlzdHJjYXQocGFnZSwgIiwgZmlybXdhcmUgbG9hZGluZ1xuIik7Ci0JCQllbHNlCi0JCQkJc3RyY2F0KHBhZ2UsICIsIG5vIGZpcm13YXJlXG4iKTsKLQkJfQotCi0JCXJldHVybiBzdHJsZW4ocGFnZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdWRzbF9hdG1fb3BlbihzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQotewotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gdmNjLT5kZXYtPmRldl9kYXRhOwotCXN0cnVjdCB1ZHNsX3ZjY19kYXRhICpuZXc7Ci0JdW5zaWduZWQgaW50IG1heF9wZHU7Ci0JaW50IHZjaSA9IHZjYy0+dmNpOwotCXNob3J0IHZwaSA9IHZjYy0+dnBpOwotCWludCBlcnI7Ci0KLQlkYmcoInVkc2xfYXRtX29wZW46IHZwaSAlaGQsIHZjaSAlZCIsIHZwaSwgdmNpKTsKLQotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9vcGVuOiBOVUxMIGRhdGEhIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIG9ubHkgc3VwcG9ydCBBQUw1ICovCi0JaWYgKCh2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDUpIHx8ICh2Y2MtPnFvcy5yeHRwLm1heF9zZHUgPCAwKQotCSAgICB8fCAodmNjLT5xb3Mucnh0cC5tYXhfc2R1ID4gQVRNX01BWF9BQUw1X1BEVSkpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9vcGVuOiB1bnN1cHBvcnRlZCBBVE0gdHlwZSAlZCEiLCB2Y2MtPnFvcy5hYWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaW5zdGFuY2UtPmZpcm13YXJlX3dhaXQgJiYKLQkgICAgKGVyciA9IGluc3RhbmNlLT5maXJtd2FyZV93YWl0KGluc3RhbmNlKSkgPCAwKSB7Ci0JCWRiZygidWRzbF9hdG1fb3BlbjogZmlybXdhcmUgbm90IGxvYWRlZCAoJWQpISIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CS8qIHZzIHNlbGYsIHVkc2xfYXRtX2Nsb3NlICovCi0KLQlpZiAodWRzbF9maW5kX3ZjYyhpbnN0YW5jZSwgdnBpLCB2Y2kpKSB7Ci0JCWRiZygidWRzbF9hdG1fb3BlbjogJWhkLyVkIGFscmVhZHkgaW4gdXNlISIsIHZwaSwgdmNpKTsKLQkJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCQlyZXR1cm4gLUVBRERSSU5VU0U7Ci0JfQotCi0JaWYgKCEobmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVkc2xfdmNjX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9vcGVuOiBubyBtZW1vcnkgZm9yIHZjY19kYXRhISIpOwotCQl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgdWRzbF92Y2NfZGF0YSkpOwotCW5ldy0+dmNjID0gdmNjOwotCW5ldy0+dnBpID0gdnBpOwotCW5ldy0+dmNpID0gdmNpOwotCi0JLyogdWRzbF9leHRyYWN0X2NlbGxzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjZWxsICovCi0JbWF4X3BkdSA9IG1heCgxLCBVRFNMX05VTV9DRUxMUyh2Y2MtPnFvcy5yeHRwLm1heF9zZHUpKSAqIEFUTV9DRUxMX1BBWUxPQUQ7Ci0JaWYgKCEobmV3LT5zYXJiID0gYWxsb2Nfc2tiKG1heF9wZHUsIEdGUF9LRVJORUwpKSkgewotCQlkYmcoInVkc2xfYXRtX29wZW46IG5vIG1lbW9yeSBmb3IgU0FSIGJ1ZmZlciEiKTsKLQkJa2ZyZWUobmV3KTsKLQkJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2Y2MtPmRldl9kYXRhID0gbmV3OwotCi0JdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0KTsKLQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmaW5zdGFuY2UtPnZjY19saXN0KTsKLQl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0KLQlzZXRfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7Ci0Jc2V0X2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOwotCXNldF9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7Ci0KLQl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0KTsKLQotCWRiZygidWRzbF9hdG1fb3BlbjogYWxsb2NhdGVkIHZjYyBkYXRhIDB4JXAgKG1heF9wZHU6ICV1KSIsIG5ldywgbWF4X3BkdSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdWRzbF9hdG1fY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYykKLXsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHZjYy0+ZGV2LT5kZXZfZGF0YTsKLQlzdHJ1Y3QgdWRzbF92Y2NfZGF0YSAqdmNjX2RhdGEgPSB2Y2MtPmRldl9kYXRhOwotCi0JZGJnKCJ1ZHNsX2F0bV9jbG9zZSBjYWxsZWQiKTsKLQotCWlmICghaW5zdGFuY2UgfHwgIXZjY19kYXRhKSB7Ci0JCWRiZygidWRzbF9hdG1fY2xvc2U6IE5VTEwgZGF0YSEiKTsKLQkJcmV0dXJuOwotCX0KLQotCWRiZygidWRzbF9hdG1fY2xvc2U6IGRlYWxsb2NhdGluZyB2Y2MgMHglcCB3aXRoIHZwaSAlZCB2Y2kgJWQiLAotCSAgICB2Y2NfZGF0YSwgdmNjX2RhdGEtPnZwaSwgdmNjX2RhdGEtPnZjaSk7Ci0KLQl1ZHNsX2NhbmNlbF9zZW5kKGluc3RhbmNlLCB2Y2MpOwotCi0JZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CS8qIHZzIHNlbGYsIHVkc2xfYXRtX29wZW4gKi8KLQotCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0JbGlzdF9kZWwoJnZjY19kYXRhLT5saXN0KTsKLQl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0KLQlrZnJlZV9za2IodmNjX2RhdGEtPnNhcmIpOwotCXZjY19kYXRhLT5zYXJiID0gTlVMTDsKLQotCWtmcmVlKHZjY19kYXRhKTsKLQl2Y2MtPmRldl9kYXRhID0gTlVMTDsKLQotCXZjYy0+dnBpID0gQVRNX1ZQSV9VTlNQRUM7Ci0JdmNjLT52Y2kgPSBBVE1fVkNJX1VOU1BFQzsKLQljbGVhcl9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7Ci0JY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCAmdmNjLT5mbGFncyk7Ci0JY2xlYXJfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7Ci0KLQl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0KLQlkYmcoInVkc2xfYXRtX2Nsb3NlIHN1Y2Nlc3NmdWwiKTsKLX0KLQotc3RhdGljIGludCB1ZHNsX2F0bV9pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVRNX1FVRVJZTE9PUDoKLQkJcmV0dXJuIHB1dF91c2VyKEFUTV9MTV9OT05FLCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotLyoqKioqKioqKioKLSoqICBVU0IgICoqCi0qKioqKioqKioqLwotCi1pbnQgdWRzbF9pbnN0YW5jZV9zZXR1cChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCQkJc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0JY2hhciAqYnVmOwotCWludCBpLCBsZW5ndGg7Ci0KLQlrcmVmX2luaXQoJmluc3RhbmNlLT5yZWZjb3VudCk7CS8qIG9uZSBmb3IgVVNCICovCi0JdWRzbF9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOwkvKiBvbmUgZm9yIEFUTSAqLwotCi0JaW5pdF9NVVRFWCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0KLQlpbnN0YW5jZS0+dXNiX2RldiA9IGRldjsKLQotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+dmNjX2xpc3QpOwotCi0JaW5zdGFuY2UtPnN0YXR1cyA9IFVEU0xfTk9fRklSTVdBUkU7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmaW5zdGFuY2UtPmZpcm13YXJlX3dhaXRlcnMpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZXJzKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmZpbGxlZF9yZWNlaXZlX2J1ZmZlcnMpOwotCi0JdGFza2xldF9pbml0KCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0LCB1ZHNsX3Byb2Nlc3NfcmVjZWl2ZSwgKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOwotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZV9idWZmZXJzKTsKLQotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmluc3RhbmNlLT5zbmRxdWV1ZSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5zcGFyZV9zZW5kZXJzKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3NlbmRfYnVmZmVycyk7Ci0KLQl0YXNrbGV0X2luaXQoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQsIHVkc2xfcHJvY2Vzc19zZW5kLAotCQkgICAgICh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmZpbGxlZF9zZW5kX2J1ZmZlcnMpOwotCi0JLyogcmVjZWl2ZSBpbml0ICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9yY3ZfdXJiczsgaSsrKSB7Ci0JCXN0cnVjdCB1ZHNsX3JlY2VpdmVyICpyY3YgPSAmKGluc3RhbmNlLT5yZWNlaXZlcnNbaV0pOwotCi0JCWlmICghKHJjdi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpIHsKLQkJCWRiZygidWRzbF91c2JfcHJvYmU6IG5vIG1lbW9yeSBmb3IgcmVjZWl2ZSB1cmIgJWQhIiwgaSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlyY3YtPmluc3RhbmNlID0gaW5zdGFuY2U7Ci0KLQkJbGlzdF9hZGQoJnJjdi0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9yZWNlaXZlcnMpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X2J1ZnM7IGkrKykgewotCQlzdHJ1Y3QgdWRzbF9yZWNlaXZlX2J1ZmZlciAqYnVmID0KLQkJICAgICYoaW5zdGFuY2UtPnJlY2VpdmVfYnVmZmVyc1tpXSk7Ci0KLQkJYnVmLT5iYXNlID0ga21hbGxvYyhyY3ZfYnVmX3NpemUgKiAoQVRNX0NFTExfU0laRSArIGluc3RhbmNlLT5yY3ZfcGFkZGluZyksCi0JCQkJICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1Zi0+YmFzZSkgewotCQkJZGJnKCJ1ZHNsX3VzYl9wcm9iZTogbm8gbWVtb3J5IGZvciByZWNlaXZlIGJ1ZmZlciAlZCEiLCBpKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWxpc3RfYWRkKCZidWYtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZV9idWZmZXJzKTsKLQl9Ci0KLQkvKiBzZW5kIGluaXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NuZF91cmJzOyBpKyspIHsKLQkJc3RydWN0IHVkc2xfc2VuZGVyICpzbmQgPSAmKGluc3RhbmNlLT5zZW5kZXJzW2ldKTsKLQotCQlpZiAoIShzbmQtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKSB7Ci0JCQlkYmcoInVkc2xfdXNiX3Byb2JlOiBubyBtZW1vcnkgZm9yIHNlbmQgdXJiICVkISIsIGkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJc25kLT5pbnN0YW5jZSA9IGluc3RhbmNlOwotCi0JCWxpc3RfYWRkKCZzbmQtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfc2VuZGVycyk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfYnVmczsgaSsrKSB7Ci0JCXN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyICpidWYgPSAmKGluc3RhbmNlLT5zZW5kX2J1ZmZlcnNbaV0pOwotCi0JCWJ1Zi0+YmFzZSA9IGttYWxsb2Moc25kX2J1Zl9zaXplICogKEFUTV9DRUxMX1NJWkUgKyBpbnN0YW5jZS0+c25kX3BhZGRpbmcpLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYtPmJhc2UpIHsKLQkJCWRiZygidWRzbF91c2JfcHJvYmU6IG5vIG1lbW9yeSBmb3Igc2VuZCBidWZmZXIgJWQhIiwgaSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3NlbmRfYnVmZmVycyk7Ci0JfQotCi0JLyogQVRNIGluaXQgKi8KLQlpbnN0YW5jZS0+YXRtX2RldiA9IGF0bV9kZXZfcmVnaXN0ZXIoaW5zdGFuY2UtPmRyaXZlcl9uYW1lLAotCQkJCQkgICAgICZ1ZHNsX2F0bV9kZXZvcHMsIC0xLCBOVUxMKTsKLQlpZiAoIWluc3RhbmNlLT5hdG1fZGV2KSB7Ci0JCWRiZygidWRzbF91c2JfcHJvYmU6IGZhaWxlZCB0byByZWdpc3RlciBBVE0gZGV2aWNlISIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaW5zdGFuY2UtPmF0bV9kZXYtPmNpX3JhbmdlLnZwaV9iaXRzID0gQVRNX0NJX01BWDsKLQlpbnN0YW5jZS0+YXRtX2Rldi0+Y2lfcmFuZ2UudmNpX2JpdHMgPSBBVE1fQ0lfTUFYOwotCWluc3RhbmNlLT5hdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOwotCi0JLyogdGVtcCBpbml0IEFUTSBkZXZpY2UsIHNldCB0byAxMjhrYml0ICovCi0JaW5zdGFuY2UtPmF0bV9kZXYtPmxpbmtfcmF0ZSA9IDEyOCAqIDEwMDAgLyA0MjQ7Ci0KLQkvKiBkZXZpY2UgZGVzY3JpcHRpb24gKi8KLQlidWYgPSBpbnN0YW5jZS0+ZGVzY3JpcHRpb247Ci0JbGVuZ3RoID0gc2l6ZW9mKGluc3RhbmNlLT5kZXNjcmlwdGlvbik7Ci0KLQlpZiAoKGkgPSB1c2Jfc3RyaW5nKGRldiwgZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0LCBidWYsIGxlbmd0aCkpIDwgMCkKLQkJZ290byBmaW5pc2g7Ci0KLQlidWYgKz0gaTsKLQlsZW5ndGggLT0gaTsKLQotCWkgPSBzY25wcmludGYoYnVmLCBsZW5ndGgsICIgKCIpOwotCWJ1ZiArPSBpOwotCWxlbmd0aCAtPSBpOwotCi0JaWYgKGxlbmd0aCA8PSAwIHx8IChpID0gdXNiX21ha2VfcGF0aChkZXYsIGJ1ZiwgbGVuZ3RoKSkgPCAwKQotCQlnb3RvIGZpbmlzaDsKLQotCWJ1ZiArPSBpOwotCWxlbmd0aCAtPSBpOwotCi0Jc25wcmludGYoYnVmLCBsZW5ndGgsICIpIik7Ci0KLSBmaW5pc2g6Ci0JLyogcmVhZHkgZm9yIEFUTSBjYWxsYmFja3MgKi8KLQl3bWIoKTsKLQlpbnN0YW5jZS0+YXRtX2Rldi0+ZGV2X2RhdGEgPSBpbnN0YW5jZTsKLQotCXVzYl9nZXRfZGV2KGRldik7Ci0KLQlyZXR1cm4gMDsKLQotIGZhaWw6Ci0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfYnVmczsgaSsrKQotCQlrZnJlZShpbnN0YW5jZS0+c2VuZF9idWZmZXJzW2ldLmJhc2UpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfdXJiczsgaSsrKQotCQl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnNlbmRlcnNbaV0udXJiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X2J1ZnM7IGkrKykKLQkJa2ZyZWUoaW5zdGFuY2UtPnJlY2VpdmVfYnVmZmVyc1tpXS5iYXNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnM7IGkrKykKLQkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5yZWNlaXZlcnNbaV0udXJiKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIHVkc2xfaW5zdGFuY2VfZGlzY29ubmVjdChzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKLXsKLQlpbnQgaTsKLQotCWRiZygidWRzbF9pbnN0YW5jZV9kaXNjb25uZWN0IGVudGVyZWQiKTsKLQotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJ1ZHNsX2luc3RhbmNlX2Rpc2Nvbm5lY3Q6IE5VTEwgaW5zdGFuY2UhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiByZWNlaXZlIGZpbmFsaXplICovCi0JdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnM7IGkrKykKLQkJdXNiX2tpbGxfdXJiKGluc3RhbmNlLT5yZWNlaXZlcnNbaV0udXJiKTsKLQotCS8qIG5vIG5lZWQgdG8gdGFrZSB0aGUgc3BpbmxvY2sgKi8KLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmZpbGxlZF9yZWNlaXZlX2J1ZmZlcnMpOwotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZV9idWZmZXJzKTsKLQotCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnM7IGkrKykKLQkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5yZWNlaXZlcnNbaV0udXJiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X2J1ZnM7IGkrKykKLQkJa2ZyZWUoaW5zdGFuY2UtPnJlY2VpdmVfYnVmZmVyc1tpXS5iYXNlKTsKLQotCS8qIHNlbmQgZmluYWxpemUgKi8KLQl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfdXJiczsgaSsrKQotCQl1c2Jfa2lsbF91cmIoaW5zdGFuY2UtPnNlbmRlcnNbaV0udXJiKTsKLQotCS8qIG5vIG5lZWQgdG8gdGFrZSB0aGUgc3BpbmxvY2sgKi8KLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3NlbmRlcnMpOwotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+c3BhcmVfc2VuZF9idWZmZXJzKTsKLQlpbnN0YW5jZS0+Y3VycmVudF9idWZmZXIgPSBOVUxMOwotCi0JdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfdXJiczsgaSsrKQotCQl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnNlbmRlcnNbaV0udXJiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX2J1ZnM7IGkrKykKLQkJa2ZyZWUoaW5zdGFuY2UtPnNlbmRfYnVmZmVyc1tpXS5iYXNlKTsKLQotCS8qIEFUTSBmaW5hbGl6ZSAqLwotCXNodXRkb3duX2F0bV9kZXYoaW5zdGFuY2UtPmF0bV9kZXYpOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTCh1ZHNsX2dldF9pbnN0YW5jZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1ZHNsX3B1dF9pbnN0YW5jZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1ZHNsX2luc3RhbmNlX3NldHVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHVkc2xfaW5zdGFuY2VfZGlzY29ubmVjdCk7Ci0KLS8qKioqKioqKioqKgotKiogIGluaXQgICoqCi0qKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2luaXQgdWRzbF91c2JfaW5pdCh2b2lkKQotewotCWRiZygidWRzbF91c2JfaW5pdDogZHJpdmVyIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTik7Ci0KLQlpZiAoc2l6ZW9mKHN0cnVjdCB1ZHNsX2NvbnRyb2wpID4gc2l6ZW9mKCgoc3RydWN0IHNrX2J1ZmYgKikgMCktPmNiKSkgewotCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogdW51c2FibGUgd2l0aCB0aGlzIGtlcm5lbCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoKG51bV9yY3ZfdXJicyA+IFVEU0xfTUFYX1JDVl9VUkJTKQotCSAgICB8fCAobnVtX3NuZF91cmJzID4gVURTTF9NQVhfU05EX1VSQlMpCi0JICAgIHx8IChudW1fcmN2X2J1ZnMgPiBVRFNMX01BWF9SQ1ZfQlVGUykKLQkgICAgfHwgKG51bV9zbmRfYnVmcyA+IFVEU0xfTUFYX1NORF9CVUZTKQotCSAgICB8fCAocmN2X2J1Zl9zaXplID4gVURTTF9NQVhfUkNWX0JVRl9TSVpFKQotCSAgICB8fCAoc25kX2J1Zl9zaXplID4gVURTTF9NQVhfU05EX0JVRl9TSVpFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHVkc2xfdXNiX2V4aXQodm9pZCkKLXsKLX0KLQotbW9kdWxlX2luaXQodWRzbF91c2JfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1ZHNsX3VzYl9leGl0KTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7Ci0KLS8qKioqKioqKioqKioKLSoqICBkZWJ1ZyAgKioKLSoqKioqKioqKioqKi8KLQotI2lmZGVmIFZFUkJPU0VfREVCVUcKLXN0YXRpYyBpbnQgdWRzbF9wcmludF9wYWNrZXQoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNTZdOwotCWludCBpID0gMCwgaiA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOykgewotCQlidWZmZXJbMF0gPSAnXDAnOwotCQlzcHJpbnRmKGJ1ZmZlciwgIiUuM2QgOiIsIGkpOwotCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaSA8IGxlbik7IGorKywgaSsrKSB7Ci0JCQlzcHJpbnRmKGJ1ZmZlciwgIiVzICUyLjJ4IiwgYnVmZmVyLCBkYXRhW2ldKTsKLQkJfQotCQlkYmcoIiVzIiwgYnVmZmVyKTsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JfYXRtLmggYi9kcml2ZXJzL3VzYi9hdG0vdXNiX2F0bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhjNTMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2F0bS91c2JfYXRtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHVzYl9hdG0uaCAtIEdlbmVyaWMgVVNCIHhEU0wgZHJpdmVyIGNvcmUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLCBBbGNhdGVsCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLCBEdW5jYW4gU2FuZHMsIFNvbE5lZ3JvLCBKb3NlcCBDb21hcwotICogIENvcHlyaWdodCAoQykgMjAwNCwgRGF2aWQgV29vZGhvdXNlCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiAgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG0uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0KLS8qCi0jZGVmaW5lIERFQlVHCi0jZGVmaW5lIFZFUkJPU0VfREVCVUcKLSovCi0KLSNpZiAhZGVmaW5lZCAoREVCVUcpICYmIGRlZmluZWQgKENPTkZJR19VU0JfREVCVUcpCi0jCWRlZmluZSBERUJVRwotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIFVEU0xfQVNTRVJUKHgpCUJVR19PTighKHgpKQotI2Vsc2UKLSNkZWZpbmUgVURTTF9BU1NFUlQoeCkJZG8geyBpZiAoISh4KSkgd2FybigiZmFpbGVkIGFzc2VydGlvbiAnIiAjeCAiJyBhdCBsaW5lICVkIiwgX19MSU5FX18pOyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBVRFNMX01BWF9SQ1ZfVVJCUwkJNAotI2RlZmluZSBVRFNMX01BWF9TTkRfVVJCUwkJNAotI2RlZmluZSBVRFNMX01BWF9SQ1ZfQlVGUwkJOAotI2RlZmluZSBVRFNMX01BWF9TTkRfQlVGUwkJOAotI2RlZmluZSBVRFNMX01BWF9SQ1ZfQlVGX1NJWkUJCTEwMjQJLyogQVRNIGNlbGxzICovCi0jZGVmaW5lIFVEU0xfTUFYX1NORF9CVUZfU0laRQkJMTAyNAkvKiBBVE0gY2VsbHMgKi8KLSNkZWZpbmUgVURTTF9ERUZBVUxUX1JDVl9VUkJTCQkyCi0jZGVmaW5lIFVEU0xfREVGQVVMVF9TTkRfVVJCUwkJMgotI2RlZmluZSBVRFNMX0RFRkFVTFRfUkNWX0JVRlMJCTQKLSNkZWZpbmUgVURTTF9ERUZBVUxUX1NORF9CVUZTCQk0Ci0jZGVmaW5lIFVEU0xfREVGQVVMVF9SQ1ZfQlVGX1NJWkUJNjQJLyogQVRNIGNlbGxzICovCi0jZGVmaW5lIFVEU0xfREVGQVVMVF9TTkRfQlVGX1NJWkUJNjQJLyogQVRNIGNlbGxzICovCi0KLSNkZWZpbmUgQVRNX0NFTExfSEVBREVSCQkJKEFUTV9DRUxMX1NJWkUgLSBBVE1fQ0VMTF9QQVlMT0FEKQotI2RlZmluZSBVRFNMX05VTV9DRUxMUyh4KQkJKCgoeCkgKyBBVE1fQUFMNV9UUkFJTEVSICsgQVRNX0NFTExfUEFZTE9BRCAtIDEpIC8gQVRNX0NFTExfUEFZTE9BRCkKLQotLyogcmVjZWl2ZSAqLwotCi1zdHJ1Y3QgdWRzbF9yZWNlaXZlX2J1ZmZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVuc2lnbmVkIGNoYXIgKmJhc2U7Ci0JdW5zaWduZWQgaW50IGZpbGxlZF9jZWxsczsKLX07Ci0KLXN0cnVjdCB1ZHNsX3JlY2VpdmVyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2U7Ci19OwotCi1zdHJ1Y3QgdWRzbF92Y2NfZGF0YSB7Ci0JLyogdnBpL3ZjaSBsb29rdXAgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc2hvcnQgdnBpOwotCWludCB2Y2k7Ci0Jc3RydWN0IGF0bV92Y2MgKnZjYzsKLQotCS8qIHJhdyBjZWxsIHJlYXNzZW1ibHkgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2FyYjsKLX07Ci0KLS8qIHNlbmQgKi8KLQotc3RydWN0IHVkc2xfc2VuZF9idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1bnNpZ25lZCBjaGFyICpiYXNlOwotCXVuc2lnbmVkIGNoYXIgKmZyZWVfc3RhcnQ7Ci0JdW5zaWduZWQgaW50IGZyZWVfY2VsbHM7Ci19OwotCi1zdHJ1Y3QgdWRzbF9zZW5kZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdWRzbF9zZW5kX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCB1cmIgKnVyYjsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZTsKLX07Ci0KLXN0cnVjdCB1ZHNsX2NvbnRyb2wgewotCXN0cnVjdCBhdG1fc2tiX2RhdGEgYXRtX2RhdGE7Ci0JdW5zaWduZWQgaW50IG51bV9jZWxsczsKLQl1bnNpZ25lZCBpbnQgbnVtX2VudGlyZTsKLQl1bnNpZ25lZCBpbnQgcGR1X3BhZGRpbmc7Ci0JdW5zaWduZWQgY2hhciBhYWw1X3RyYWlsZXJbQVRNX0FBTDVfVFJBSUxFUl07Ci19OwotCi0jZGVmaW5lIFVEU0xfU0tCKHgpCQkoKHN0cnVjdCB1ZHNsX2NvbnRyb2wgKikoeCktPmNiKQotCi0vKiBtYWluIGRyaXZlciBkYXRhICovCi0KLWVudW0gdWRzbF9zdGF0dXMgewotCVVEU0xfTk9fRklSTVdBUkUsCi0JVURTTF9MT0FESU5HX0ZJUk1XQVJFLAotCVVEU0xfTE9BREVEX0ZJUk1XQVJFCi19OwotCi1zdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhIHsKLQlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlcmlhbGl6ZTsKLQotCS8qIFVTQiBkZXZpY2UgcGFydCAqLwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCWNoYXIgZGVzY3JpcHRpb25bNjRdOwotCWludCBkYXRhX2VuZHBvaW50OwotCWludCBzbmRfcGFkZGluZzsKLQlpbnQgcmN2X3BhZGRpbmc7Ci0JY29uc3QgY2hhciAqZHJpdmVyX25hbWU7Ci0KLQkvKiBBVE0gZGV2aWNlIHBhcnQgKi8KLQlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHZjY19saXN0OwotCi0JLyogZmlybXdhcmUgKi8KLQlpbnQgKCpmaXJtd2FyZV93YWl0KSAoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqKTsKLQllbnVtIHVkc2xfc3RhdHVzIHN0YXR1czsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBmaXJtd2FyZV93YWl0ZXJzOwotCi0JLyogcmVjZWl2ZSAqLwotCXN0cnVjdCB1ZHNsX3JlY2VpdmVyIHJlY2VpdmVyc1tVRFNMX01BWF9SQ1ZfVVJCU107Ci0Jc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgcmVjZWl2ZV9idWZmZXJzW1VEU0xfTUFYX1JDVl9CVUZTXTsKLQotCXNwaW5sb2NrX3QgcmVjZWl2ZV9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgc3BhcmVfcmVjZWl2ZXJzOwotCXN0cnVjdCBsaXN0X2hlYWQgZmlsbGVkX3JlY2VpdmVfYnVmZmVyczsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByZWNlaXZlX3Rhc2tsZXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzcGFyZV9yZWNlaXZlX2J1ZmZlcnM7Ci0KLQkvKiBzZW5kICovCi0Jc3RydWN0IHVkc2xfc2VuZGVyIHNlbmRlcnNbVURTTF9NQVhfU05EX1VSQlNdOwotCXN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyIHNlbmRfYnVmZmVyc1tVRFNMX01BWF9TTkRfQlVGU107Ci0KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNuZHF1ZXVlOwotCi0Jc3BpbmxvY2tfdCBzZW5kX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzcGFyZV9zZW5kZXJzOwotCXN0cnVjdCBsaXN0X2hlYWQgc3BhcmVfc2VuZF9idWZmZXJzOwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHNlbmRfdGFza2xldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqY3VycmVudF9za2I7CQkJLyogYmVpbmcgZW1wdGllZCAqLwotCXN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyICpjdXJyZW50X2J1ZmZlcjsJLyogYmVpbmcgZmlsbGVkICovCi0Jc3RydWN0IGxpc3RfaGVhZCBmaWxsZWRfc2VuZF9idWZmZXJzOwotfTsKLQotZXh0ZXJuIGludCB1ZHNsX2luc3RhbmNlX3NldHVwKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpOwotZXh0ZXJuIHZvaWQgdWRzbF9pbnN0YW5jZV9kaXNjb25uZWN0KHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKTsKLWV4dGVybiB2b2lkIHVkc2xfZ2V0X2luc3RhbmNlKHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKTsKLWV4dGVybiB2b2lkIHVkc2xfcHV0X2luc3RhbmNlKHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFkYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0wLDAgKzEsMTIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHVzYmF0bS5jIC0gR2VuZXJpYyBVU0IgeERTTCBkcml2ZXIgY29yZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIEFsY2F0ZWwKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIER1bmNhbiBTYW5kcywgU29sTmVncm8sIEpvc2VwIENvbWFzCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCBEYXZpZCBXb29kaG91c2UsIFJvbWFuIEthZ2FuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIFdyaXR0ZW4gYnkgSm9oYW4gVmVycmVwdCwgRHVuY2FuIFNhbmRzIChkdW5jYW4uc2FuZHNAZnJlZS5mcikgYW5kIERhdmlkIFdvb2Rob3VzZQorICoKKyAqICAxLjcrOgktIFNlZSB0aGUgY2hlY2staW4gbG9ncworICoKKyAqICAxLjY6CS0gTm8gbG9uZ2VyIG9wZW5zIGEgY29ubmVjdGlvbiBpZiB0aGUgZmlybXdhcmUgaXMgbm90IGxvYWRlZAorICogIAkJLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgc3BlZWR0b3VjaCAzMzAKKyAqICAJCS0gUmVtb3ZlZCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBkZXZpY2VzCisgKiAgCQktIE1vZHVsZSBub3cgYXV0b2xvYWRzIG9uIGRldmljZSBwbHVnaW4KKyAqICAJCS0gTWVyZ2VkIHJlbGV2YW50IHBhcnRzIG9mIHNhcmxpYgorICogIAkJLSBSZXBsYWNlZCB0aGUga2VybmVsIHRocmVhZCB3aXRoIGEgdGFza2xldAorICogIAkJLSBOZXcgcGFja2V0IHRyYW5zbWlzc2lvbiBjb2RlCisgKiAgCQktIENoYW5nZWQgcHJvYyBmaWxlIGNvbnRlbnRzCisgKiAgCQktIEZpeGVkIGFsbCBrbm93biBTTVAgcmFjZXMKKyAqICAJCS0gTWFueSBmaXhlcyBhbmQgY2xlYW51cHMKKyAqICAJCS0gVmFyaW91cyBmaXhlcyBieSBPbGl2ZXIgTmV1a3VtIChvbGl2ZXJAbmV1a3VtLm5hbWUpCisgKgorICogIDEuNUE6CS0gVmVyc2lvbiBmb3IgaW5jbHVzaW9uIGluIDIuNSBzZXJpZXMga2VybmVsCisgKgkJLSBNb2RpZmljYXRpb25zIGJ5IFJpY2hhcmQgUHVyZGllIChycHVyZGllQHJwc3lzLm5ldCkKKyAqCQktIG1hZGUgY29tcGF0aWJsZSB3aXRoIGtlcm5lbCAyLjUuNiBvbndhcmRzIGJ5IGNoYW5naW5nCisgKgkJdXNiYXRtX3VzYl9zZW5kX2RhdGFfY29udGV4dC0+dXJiIHRvIGEgcG9pbnRlciBhbmQgYWRkaW5nIGNvZGUKKyAqCQl0byBhbGxvYyBhbmQgZnJlZSBpdAorICoJCS0gcmVtb3ZlX3dhaXRfcXVldWUoKSBhZGRlZCB0byB1c2JhdG1fYXRtX3Byb2Nlc3NxdWV1ZV90aHJlYWQoKQorICoKKyAqICAxLjU6CS0gZml4ZWQgbWVtb3J5IGxlYWsgd2hlbiBhdG1zYXJfZGVjb2RlX2FhbDUgcmV0dXJuZWQgTlVMTC4KKyAqCQkocmVwb3J0ZWQgYnkgc3RlcGhlbi5yb2JpbnNvbkB6ZW4uY28udWspCisgKgorICogIDEuNDoJLSBjaGFuZ2VkIHRoZSBzcGluX2xvY2soKSB1bmRlciBpbnRlcnJ1cHQgdG8gc3Bpbl9sb2NrX2lycXNhdmUoKQorICoJCS0gdW5saW5rIGFsbCBhY3RpdmUgc2VuZCB1cmJzIG9mIGEgdmNjIHRoYXQgaXMgYmVpbmcgY2xvc2VkLgorICoKKyAqICAxLjMuMToJLSBhZGRlZCB0aGUgdmVyc2lvbiBudW1iZXIKKyAqCisgKiAgMS4zOgktIEFkZGVkIG11bHRpcGxlIHNlbmQgdXJiIHN1cHBvcnQKKyAqCQktIGZpeGVkIG1lbW9yeSBsZWFrIGFuZCB2Y2MtPnR4X2ludXNlIHN0YXJ2YXRpb24gYnVnCisgKgkJICB3aGVuIG5vdCBlbm91Z2ggbWVtb3J5IGxlZnQgaW4gdmNjLgorICoKKyAqICAxLjI6CS0gRml4ZWQgcmFjZSBjb25kaXRpb24gaW4gdXNiYXRtX3VzYl9zZW5kX2RhdGEoKQorICogIDEuMToJLSBUdXJuZWQgb2ZmIHBhY2tldCBkZWJ1Z2dpbmcKKyAqCisgKi8KKworI2luY2x1ZGUgInVzYmF0bS5oIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaWZkZWYgVkVSQk9TRV9ERUJVRworc3RhdGljIGludCB1c2JhdG1fcHJpbnRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOworI2RlZmluZSBQQUNLRVRERUJVRyhhcmcuLi4pCXVzYmF0bV9wcmludF9wYWNrZXQgKGFyZykKKyNkZWZpbmUgdmRiZyhhcmcuLi4pCQlkYmcgKGFyZykKKyNlbHNlCisjZGVmaW5lIFBBQ0tFVERFQlVHKGFyZy4uLikKKyNkZWZpbmUgdmRiZyhhcmcuLi4pCisjZW5kaWYKKworI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKb2hhbiBWZXJyZXB0LCBEdW5jYW4gU2FuZHMgPGR1bmNhbi5zYW5kc0BmcmVlLmZyPiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEuOSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIkdlbmVyaWMgVVNCIEFUTS9EU0wgSS9PLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04KKworc3RhdGljIGNvbnN0IGNoYXIgdXNiYXRtX2RyaXZlcl9uYW1lW10gPSAidXNiYXRtIjsKKworI2RlZmluZSBVRFNMX01BWF9SQ1ZfVVJCUwkJMTYKKyNkZWZpbmUgVURTTF9NQVhfU05EX1VSQlMJCTE2CisjZGVmaW5lIFVEU0xfTUFYX1JDVl9CVUZfU0laRQkJMTAyNAkvKiBBVE0gY2VsbHMgKi8KKyNkZWZpbmUgVURTTF9NQVhfU05EX0JVRl9TSVpFCQkxMDI0CS8qIEFUTSBjZWxscyAqLworI2RlZmluZSBVRFNMX0RFRkFVTFRfUkNWX1VSQlMJCTQKKyNkZWZpbmUgVURTTF9ERUZBVUxUX1NORF9VUkJTCQk0CisjZGVmaW5lIFVEU0xfREVGQVVMVF9SQ1ZfQlVGX1NJWkUJNjQJLyogQVRNIGNlbGxzICovCisjZGVmaW5lIFVEU0xfREVGQVVMVF9TTkRfQlVGX1NJWkUJNjQJLyogQVRNIGNlbGxzICovCisKKyNkZWZpbmUgQVRNX0NFTExfSEVBREVSCQkJKEFUTV9DRUxMX1NJWkUgLSBBVE1fQ0VMTF9QQVlMT0FEKQorCisjZGVmaW5lIFRIUk9UVExFX01TRUNTCQkJMTAwCS8qIGRlbGF5IHRvIHJlY292ZXIgcHJvY2Vzc2luZyBhZnRlciB1cmIgc3VibWlzc2lvbiBmYWlscyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG51bV9yY3ZfdXJicyA9IFVEU0xfREVGQVVMVF9SQ1ZfVVJCUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3NuZF91cmJzID0gVURTTF9ERUZBVUxUX1NORF9VUkJTOworc3RhdGljIHVuc2lnbmVkIGludCByY3ZfYnVmX3NpemUgPSBVRFNMX0RFRkFVTFRfUkNWX0JVRl9TSVpFOworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYnVmX3NpemUgPSBVRFNMX0RFRkFVTFRfU05EX0JVRl9TSVpFOworCittb2R1bGVfcGFyYW0obnVtX3Jjdl91cmJzLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3Jjdl91cmJzLAorCQkgIk51bWJlciBvZiB1cmJzIHVzZWQgZm9yIHJlY2VwdGlvbiAocmFuZ2U6IDAtIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1JDVl9VUkJTKSAiLCBkZWZhdWx0OiAiCisJCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1JDVl9VUkJTKSAiKSIpOworCittb2R1bGVfcGFyYW0obnVtX3NuZF91cmJzLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3NuZF91cmJzLAorCQkgIk51bWJlciBvZiB1cmJzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAocmFuZ2U6IDAtIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1NORF9VUkJTKSAiLCBkZWZhdWx0OiAiCisJCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1NORF9VUkJTKSAiKSIpOworCittb2R1bGVfcGFyYW0ocmN2X2J1Zl9zaXplLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocmN2X2J1Zl9zaXplLAorCQkgIlNpemUgb2YgdGhlIGJ1ZmZlcnMgdXNlZCBmb3IgcmVjZXB0aW9uIGluIEFUTSBjZWxscyAocmFuZ2U6IDEtIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1JDVl9CVUZfU0laRSkgIiwgZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9SQ1ZfQlVGX1NJWkUpICIpIik7CisKK21vZHVsZV9wYXJhbShzbmRfYnVmX3NpemUsIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzbmRfYnVmX3NpemUsCisJCSAiU2l6ZSBvZiB0aGUgYnVmZmVycyB1c2VkIGZvciB0cmFuc21pc3Npb24gaW4gQVRNIGNlbGxzIChyYW5nZTogMS0iCisJCSBfX01PRFVMRV9TVFJJTkcoVURTTF9NQVhfU05EX0JVRl9TSVpFKSAiLCBkZWZhdWx0OiAiCisJCSBfX01PRFVMRV9TVFJJTkcoVURTTF9ERUZBVUxUX1NORF9CVUZfU0laRSkgIikiKTsKKworCisvKiByZWNlaXZlICovCisKK3N0cnVjdCB1c2JhdG1fdmNjX2RhdGEgeworCS8qIHZwaS92Y2kgbG9va3VwICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNob3J0IHZwaTsKKwlpbnQgdmNpOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisKKwkvKiByYXcgY2VsbCByZWFzc2VtYmx5ICovCisJc3RydWN0IHNrX2J1ZmYgKnNhcmI7Cit9OworCisKKy8qIHNlbmQgKi8KKworc3RydWN0IHVzYmF0bV9jb250cm9sIHsKKwlzdHJ1Y3QgYXRtX3NrYl9kYXRhIGF0bTsKKwl1MzIgbGVuOworCXUzMiBjcmM7Cit9OworCisjZGVmaW5lIFVEU0xfU0tCKHgpCQkoKHN0cnVjdCB1c2JhdG1fY29udHJvbCAqKSh4KS0+Y2IpCisKKworLyogQVRNICovCisKK3N0YXRpYyB2b2lkIHVzYmF0bV9hdG1fZGV2X2Nsb3NlKHN0cnVjdCBhdG1fZGV2ICpkZXYpOworc3RhdGljIGludCB1c2JhdG1fYXRtX29wZW4oc3RydWN0IGF0bV92Y2MgKnZjYyk7CitzdGF0aWMgdm9pZCB1c2JhdG1fYXRtX2Nsb3NlKHN0cnVjdCBhdG1fdmNjICp2Y2MpOworc3RhdGljIGludCB1c2JhdG1fYXRtX2lvY3RsKHN0cnVjdCBhdG1fZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCB1c2JhdG1fYXRtX3Byb2NfcmVhZChzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiwgbG9mZl90ICogcG9zLCBjaGFyICpwYWdlKTsKKworc3RhdGljIHN0cnVjdCBhdG1kZXZfb3BzIHVzYmF0bV9hdG1fZGV2b3BzID0geworCS5kZXZfY2xvc2UJPSB1c2JhdG1fYXRtX2Rldl9jbG9zZSwKKwkub3BlbgkJPSB1c2JhdG1fYXRtX29wZW4sCisJLmNsb3NlCQk9IHVzYmF0bV9hdG1fY2xvc2UsCisJLmlvY3RsCQk9IHVzYmF0bV9hdG1faW9jdGwsCisJLnNlbmQJCT0gdXNiYXRtX2F0bV9zZW5kLAorCS5wcm9jX3JlYWQJPSB1c2JhdG1fYXRtX3Byb2NfcmVhZCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCisKKy8qKioqKioqKioqKgorKiogIG1pc2MgICoqCisqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdXNiYXRtX3BkdV9sZW5ndGgodW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlsZW5ndGggKz0gQVRNX0NFTExfUEFZTE9BRCAtIDEgKyBBVE1fQUFMNV9UUkFJTEVSOworCXJldHVybiBsZW5ndGggLSBsZW5ndGggJSBBVE1fQ0VMTF9QQVlMT0FEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiYXRtX3BvcChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh2Y2MtPnBvcCkKKwkJdmNjLT5wb3AodmNjLCBza2IpOworCWVsc2UKKwkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisKKy8qKioqKioqKioqKgorKiogIHVyYnMgICoqCisqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVyYiAqdXNiYXRtX3BvcF91cmIoc3RydWN0IHVzYmF0bV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKworCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmxvY2spOworCWlmIChsaXN0X2VtcHR5KCZjaGFubmVsLT5saXN0KSkgeworCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl1cmIgPSBsaXN0X2VudHJ5KGNoYW5uZWwtPmxpc3QubmV4dCwgc3RydWN0IHVyYiwgdXJiX2xpc3QpOworCWxpc3RfZGVsKCZ1cmItPnVyYl9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmxvY2spOworCisJcmV0dXJuIHVyYjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdXNiYXRtX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgcmV0OworCisJdmRiZygiJXM6IHN1Ym1pdHRpbmcgdXJiIDB4JXAsIHNpemUgJXUiLAorCSAgICAgX19mdW5jX18sIHVyYiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkgeworCQlhdG1fZGJnKGNoYW5uZWwtPnVzYmF0bSwgIiVzOiB1cmIgMHglcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIVxuIiwKKwkJCV9fZnVuY19fLCB1cmIsIHJldCk7CisKKwkJLyogY29uc2lkZXIgYWxsIGVycm9ycyB0cmFuc2llbnQgYW5kIHJldHVybiB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIHF1ZXVlICovCisJCXVyYi0+c3RhdHVzID0gLUVBR0FJTjsKKwkJc3Bpbl9sb2NrX2lycSgmY2hhbm5lbC0+bG9jayk7CisKKwkJLyogbXVzdCBhZGQgdG8gdGhlIGZyb250IHdoZW4gc2VuZGluZzsgZG9lc24ndCBtYXR0ZXIgd2hlbiByZWNlaXZpbmcgKi8KKwkJbGlzdF9hZGQoJnVyYi0+dXJiX2xpc3QsICZjaGFubmVsLT5saXN0KTsKKworCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmxvY2spOworCisJCS8qIG1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBkb2Vzbid0IHN0YWxsICovCisJCW1vZF90aW1lcigmY2hhbm5lbC0+ZGVsYXksIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRIUk9UVExFX01TRUNTKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdXNiYXRtX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYmF0bV9jaGFubmVsICpjaGFubmVsID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl2ZGJnKCIlczogdXJiIDB4JXAsIHN0YXR1cyAlZCwgYWN0dWFsX2xlbmd0aCAlZCIsCisJICAgICBfX2Z1bmNfXywgdXJiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCS8qIHVzdWFsbHkgaW5faW50ZXJydXB0KCksIGJ1dCBub3QgYWx3YXlzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIG11c3QgYWRkIHRvIHRoZSBiYWNrIHdoZW4gcmVjZWl2aW5nOyBkb2Vzbid0IG1hdHRlciB3aGVuIHNlbmRpbmcgKi8KKwlsaXN0X2FkZF90YWlsKCZ1cmItPnVyYl9saXN0LCAmY2hhbm5lbC0+bGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMpKQorCQkvKiB0aHJvdHRsZSBwcm9jZXNzaW5nIGluIGNhc2Ugb2YgYW4gZXJyb3IgKi8KKwkJbW9kX3RpbWVyKCZjaGFubmVsLT5kZWxheSwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVEhST1RUTEVfTVNFQ1MpKTsKKwllbHNlCisJCXRhc2tsZXRfc2NoZWR1bGUoJmNoYW5uZWwtPnRhc2tsZXQpOworfQorCisKKy8qKioqKioqKioqKioqCisqKiAgZGVjb2RlICAqKgorKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhICp1c2JhdG1fZmluZF92Y2Moc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSwKKwkJCQkJCSAgc2hvcnQgdnBpLCBpbnQgdmNpKQoreworCXN0cnVjdCB1c2JhdG1fdmNjX2RhdGEgKnZjYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmNjLCAmaW5zdGFuY2UtPnZjY19saXN0LCBsaXN0KQorCQlpZiAoKHZjYy0+dmNpID09IHZjaSkgJiYgKHZjYy0+dnBpID09IHZwaSkpCisJCQlyZXR1cm4gdmNjOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB1c2JhdG1fZXh0cmFjdF9jZWxscyhzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IGF2YWlsX2RhdGEpCit7CisJc3RydWN0IHVzYmF0bV92Y2NfZGF0YSAqY2FjaGVkX3ZjYyA9IE5VTEw7CisJc3RydWN0IGF0bV92Y2MgKnZjYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2FyYjsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlID0gaW5zdGFuY2UtPnJ4X2NoYW5uZWwuc3RyaWRlOworCWludCB2Y2ksIGNhY2hlZF92Y2kgPSAwOworCXNob3J0IHZwaSwgY2FjaGVkX3ZwaSA9IDA7CisJdTggcHRpOworCisJZm9yICg7IGF2YWlsX2RhdGEgPj0gc3RyaWRlOyBhdmFpbF9kYXRhIC09IHN0cmlkZSwgc291cmNlICs9IHN0cmlkZSkgeworCQl2cGkgPSAoKHNvdXJjZVswXSAmIDB4MGYpIDw8IDQpICB8IChzb3VyY2VbMV0gPj4gNCk7CisJCXZjaSA9ICgoc291cmNlWzFdICYgMHgwZikgPDwgMTIpIHwgKHNvdXJjZVsyXSA8PCA0KSB8IChzb3VyY2VbM10gPj4gNCk7CisJCXB0aSA9ICgoc291cmNlWzNdICYgMHhlKSA+PiAxKTsKKworCQl2ZGJnKCIlczogdnBpICVoZCwgdmNpICVkLCBwdGkgJWQiLCBfX2Z1bmNfXywgdnBpLCB2Y2ksIHB0aSk7CisKKwkJaWYgKCh2Y2kgIT0gY2FjaGVkX3ZjaSkgfHwgKHZwaSAhPSBjYWNoZWRfdnBpKSkgeworCQkJY2FjaGVkX3ZwaSA9IHZwaTsKKwkJCWNhY2hlZF92Y2kgPSB2Y2k7CisKKwkJCWNhY2hlZF92Y2MgPSB1c2JhdG1fZmluZF92Y2MoaW5zdGFuY2UsIHZwaSwgdmNpKTsKKworCQkJaWYgKCFjYWNoZWRfdmNjKQorCQkJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogdW5rbm93biB2cGkvdmNpICglaGQvJWQpIVxuIiwgX19mdW5jX18sIHZwaSwgdmNpKTsKKwkJfQorCisJCWlmICghY2FjaGVkX3ZjYykKKwkJCWNvbnRpbnVlOworCisJCXZjYyA9IGNhY2hlZF92Y2MtPnZjYzsKKworCQkvKiBPQU0gRjUgZW5kLXRvLWVuZCAqLworCQlpZiAocHRpID09IEFUTV9QVElfRTJFRjUpIHsKKwkJCWF0bV93YXJuKGluc3RhbmNlLCAiJXM6IE9BTSBub3Qgc3VwcG9ydGVkICh2cGkgJWQsIHZjaSAlZCkhXG4iLCBfX2Z1bmNfXywgdnBpLCB2Y2kpOworCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2FyYiA9IGNhY2hlZF92Y2MtPnNhcmI7CisKKwkJaWYgKHNhcmItPnRhaWwgKyBBVE1fQ0VMTF9QQVlMT0FEID4gc2FyYi0+ZW5kKSB7CisJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IGJ1ZmZlciBvdmVycnVuIChzYXJiLT5sZW4gJXUsIHZjYzogMHglcCkhXG4iLAorCQkJCQlfX2Z1bmNfXywgc2FyYi0+bGVuLCB2Y2MpOworCQkJLyogZGlzY2FyZCBjZWxscyBhbHJlYWR5IHJlY2VpdmVkICovCisJCQlza2JfdHJpbShzYXJiLCAwKTsKKwkJCVVEU0xfQVNTRVJUKHNhcmItPnRhaWwgKyBBVE1fQ0VMTF9QQVlMT0FEIDw9IHNhcmItPmVuZCk7CisJCX0KKworCQltZW1jcHkoc2FyYi0+dGFpbCwgc291cmNlICsgQVRNX0NFTExfSEVBREVSLCBBVE1fQ0VMTF9QQVlMT0FEKTsKKwkJX19za2JfcHV0KHNhcmIsIEFUTV9DRUxMX1BBWUxPQUQpOworCisJCWlmIChwdGkgJiAxKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKKwkJCXVuc2lnbmVkIGludCBwZHVfbGVuZ3RoOworCisJCQlsZW5ndGggPSAoc291cmNlW0FUTV9DRUxMX1NJWkUgLSA2XSA8PCA4KSArIHNvdXJjZVtBVE1fQ0VMTF9TSVpFIC0gNV07CisKKwkJCS8qIGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cgKi8KKwkJCWlmIChsZW5ndGggPiBBVE1fTUFYX0FBTDVfUERVKSB7CisJCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBib2d1cyBsZW5ndGggJXUgKHZjYzogMHglcCkhXG4iLAorCQkJCQkJX19mdW5jX18sIGxlbmd0aCwgdmNjKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwZHVfbGVuZ3RoID0gdXNiYXRtX3BkdV9sZW5ndGgobGVuZ3RoKTsKKworCQkJaWYgKHNhcmItPmxlbiA8IHBkdV9sZW5ndGgpIHsKKwkJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IGJvZ3VzIHBkdV9sZW5ndGggJXUgKHNhcmItPmxlbjogJXUsIHZjYzogMHglcCkhXG4iLAorCQkJCQkJX19mdW5jX18sIHBkdV9sZW5ndGgsIHNhcmItPmxlbiwgdmNjKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAoY3JjMzJfYmUofjAsIHNhcmItPnRhaWwgLSBwZHVfbGVuZ3RoLCBwZHVfbGVuZ3RoKSAhPSAweGM3MDRkZDdiKSB7CisJCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBwYWNrZXQgZmFpbGVkIGNyYyBjaGVjayAodmNjOiAweCVwKSFcbiIsCisJCQkJCQlfX2Z1bmNfXywgdmNjKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQl2ZGJnKCIlczogZ290IHBhY2tldCAobGVuZ3RoOiAldSwgcGR1X2xlbmd0aDogJXUsIHZjYzogMHglcCkiLCBfX2Z1bmNfXywgbGVuZ3RoLCBwZHVfbGVuZ3RoLCB2Y2MpOworCisJCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCkpKSB7CisJCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBubyBtZW1vcnkgZm9yIHNrYiAobGVuZ3RoOiAldSkhXG4iLCBfX2Z1bmNfXywgbGVuZ3RoKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJdmRiZygiJXM6IGFsbG9jYXRlZCBuZXcgc2tfYnVmZiAoc2tiOiAweCVwLCBza2ItPnRydWVzaXplOiAldSkiLCBfX2Z1bmNfXywgc2tiLCBza2ItPnRydWVzaXplKTsKKworCQkJaWYgKCFhdG1fY2hhcmdlKHZjYywgc2tiLT50cnVlc2l6ZSkpIHsKKwkJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IGZhaWxlZCBhdG1fY2hhcmdlIChza2ItPnRydWVzaXplOiAldSkhXG4iLCBfX2Z1bmNfXywgc2tiLT50cnVlc2l6ZSk7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCWdvdG8gb3V0OwkvKiBhdG1fY2hhcmdlIGluY3JlbWVudHMgcnhfZHJvcCAqLworCQkJfQorCisJCQltZW1jcHkoc2tiLT5kYXRhLCBzYXJiLT50YWlsIC0gcGR1X2xlbmd0aCwgbGVuZ3RoKTsKKwkJCV9fc2tiX3B1dChza2IsIGxlbmd0aCk7CisKKwkJCXZkYmcoIiVzOiBzZW5kaW5nIHNrYiAweCVwLCBza2ItPmxlbiAldSwgc2tiLT50cnVlc2l6ZSAldSIsCisJCQkgICAgIF9fZnVuY19fLCBza2IsIHNrYi0+bGVuLCBza2ItPnRydWVzaXplKTsKKworCQkJUEFDS0VUREVCVUcoc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkJCXZjYy0+cHVzaCh2Y2MsIHNrYik7CisKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4KTsKKwkJb3V0OgorCQkJc2tiX3RyaW0oc2FyYiwgMCk7CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioKKyoqICBlbmNvZGUgICoqCisqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHVzYmF0bV93cml0ZV9jZWxscyhzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICB1OCAqdGFyZ2V0LCB1bnNpZ25lZCBpbnQgYXZhaWxfc3BhY2UpCit7CisJc3RydWN0IHVzYmF0bV9jb250cm9sICpjdHJsID0gVURTTF9TS0Ioc2tiKTsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gY3RybC0+YXRtLnZjYzsKKwl1bnNpZ25lZCBpbnQgbnVtX3dyaXR0ZW47CisJdW5zaWduZWQgaW50IHN0cmlkZSA9IGluc3RhbmNlLT50eF9jaGFubmVsLnN0cmlkZTsKKworCXZkYmcoIiVzOiBza2ItPmxlbj0lZCwgYXZhaWxfc3BhY2U9JXUiLCBfX2Z1bmNfXywgc2tiLT5sZW4sIGF2YWlsX3NwYWNlKTsKKwlVRFNMX0FTU0VSVCghKGF2YWlsX3NwYWNlICUgc3RyaWRlKSk7CisKKwlmb3IgKG51bV93cml0dGVuID0gMDsgbnVtX3dyaXR0ZW4gPCBhdmFpbF9zcGFjZSAmJiBjdHJsLT5sZW47CisJICAgICBudW1fd3JpdHRlbiArPSBzdHJpZGUsIHRhcmdldCArPSBzdHJpZGUpIHsKKwkJdW5zaWduZWQgaW50IGRhdGFfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgQVRNX0NFTExfUEFZTE9BRCk7CisJCXVuc2lnbmVkIGludCBsZWZ0ID0gQVRNX0NFTExfUEFZTE9BRCAtIGRhdGFfbGVuOworCQl1OCAqcHRyID0gdGFyZ2V0OworCisJCXB0clswXSA9IHZjYy0+dnBpID4+IDQ7CisJCXB0clsxXSA9ICh2Y2MtPnZwaSA8PCA0KSB8ICh2Y2MtPnZjaSA+PiAxMik7CisJCXB0clsyXSA9IHZjYy0+dmNpID4+IDQ7CisJCXB0clszXSA9IHZjYy0+dmNpIDw8IDQ7CisJCXB0cls0XSA9IDB4ZWM7CisJCXB0ciArPSBBVE1fQ0VMTF9IRUFERVI7CisKKwkJbWVtY3B5KHB0ciwgc2tiLT5kYXRhLCBkYXRhX2xlbik7CisJCXB0ciArPSBkYXRhX2xlbjsKKwkJX19za2JfcHVsbChza2IsIGRhdGFfbGVuKTsKKworCQlpZighbGVmdCkKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldChwdHIsIDAsIGxlZnQpOworCisJCWlmIChsZWZ0ID49IEFUTV9BQUw1X1RSQUlMRVIpIHsJLyogdHJhaWxlciB3aWxsIGdvIGluIHRoaXMgY2VsbCAqLworCQkJdTggKnRyYWlsZXIgPSB0YXJnZXQgKyBBVE1fQ0VMTF9TSVpFIC0gQVRNX0FBTDVfVFJBSUxFUjsKKwkJCS8qIHRyYWlsZXJbMF0gPSAwOwkJVVUgPSAwICovCisJCQkvKiB0cmFpbGVyWzFdID0gMDsJCUNQSSA9IDAgKi8KKwkJCXRyYWlsZXJbMl0gPSBjdHJsLT5sZW4gPj4gODsKKwkJCXRyYWlsZXJbM10gPSBjdHJsLT5sZW47CisKKwkJCWN0cmwtPmNyYyA9IH4gY3JjMzJfYmUoY3RybC0+Y3JjLCBwdHIsIGxlZnQgLSA0KTsKKworCQkJdHJhaWxlcls0XSA9IGN0cmwtPmNyYyA+PiAyNDsKKwkJCXRyYWlsZXJbNV0gPSBjdHJsLT5jcmMgPj4gMTY7CisJCQl0cmFpbGVyWzZdID0gY3RybC0+Y3JjID4+IDg7CisJCQl0cmFpbGVyWzddID0gY3RybC0+Y3JjOworCisJCQl0YXJnZXRbM10gfD0gMHgyOwkvKiBhZGp1c3QgUFRJICovCisKKwkJCWN0cmwtPmxlbiA9IDA7CQkvKiB0YWcgdGhpcyBza2IgZmluaXNoZWQgKi8KKwkJfQorCQllbHNlCisJCQljdHJsLT5jcmMgPSBjcmMzMl9iZShjdHJsLT5jcmMsIHB0ciwgbGVmdCk7CisJfQorCisJcmV0dXJuIG51bV93cml0dGVuOworfQorCisKKy8qKioqKioqKioqKioqKgorKiogIHJlY2VpdmUgICoqCisqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdXNiYXRtX3J4X3Byb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSAoc3RydWN0IHVzYmF0bV9kYXRhICopZGF0YTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwl3aGlsZSAoKHVyYiA9IHVzYmF0bV9wb3BfdXJiKCZpbnN0YW5jZS0+cnhfY2hhbm5lbCkpKSB7CisJCXZkYmcoIiVzOiBwcm9jZXNzaW5nIHVyYiAweCVwIiwgX19mdW5jX18sIHVyYik7CisKKwkJaWYgKHVzYl9waXBlaXNvYyh1cmItPnBpcGUpKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspCisJCQkJaWYgKCF1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykKKwkJCQkJdXNiYXRtX2V4dHJhY3RfY2VsbHMoaW5zdGFuY2UsCisJCQkJCQkJICAgICAodTggKil1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0LAorCQkJCQkJCSAgICAgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoKTsKKwkJfQorCQllbHNlCisJCQlpZiAoIXVyYi0+c3RhdHVzKQorCQkJCXVzYmF0bV9leHRyYWN0X2NlbGxzKGluc3RhbmNlLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCQlpZiAodXNiYXRtX3N1Ym1pdF91cmIodXJiKSkKKwkJCXJldHVybjsKKwl9Cit9CisKKworLyoqKioqKioqKioqCisqKiAgc2VuZCAgKioKKyoqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB1c2JhdG1fdHhfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSA9IChzdHJ1Y3QgdXNiYXRtX2RhdGEgKilkYXRhOworCXN0cnVjdCBza19idWZmICpza2IgPSBpbnN0YW5jZS0+Y3VycmVudF9za2I7CisJc3RydWN0IHVyYiAqdXJiID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSBpbnN0YW5jZS0+dHhfY2hhbm5lbC5idWZfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbnVtX3dyaXR0ZW4gPSAwOworCXU4ICpidWZmZXIgPSBOVUxMOworCisJaWYgKCFza2IpCisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZpbnN0YW5jZS0+c25kcXVldWUpOworCisJd2hpbGUgKHNrYikgeworCQlpZiAoIXVyYikgeworCQkJdXJiID0gdXNiYXRtX3BvcF91cmIoJmluc3RhbmNlLT50eF9jaGFubmVsKTsKKwkJCWlmICghdXJiKQorCQkJCWJyZWFrOwkJLyogbm8gbW9yZSBzZW5kZXJzICovCisJCQlidWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJCW51bV93cml0dGVuID0gKHVyYi0+c3RhdHVzID09IC1FQUdBSU4pID8KKwkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggOiAwOworCQl9CisKKwkJbnVtX3dyaXR0ZW4gKz0gdXNiYXRtX3dyaXRlX2NlbGxzKGluc3RhbmNlLCBza2IsCisJCQkJCQkgIGJ1ZmZlciArIG51bV93cml0dGVuLAorCQkJCQkJICBidWZfc2l6ZSAtIG51bV93cml0dGVuKTsKKworCQl2ZGJnKCIlczogd3JvdGUgJXUgYnl0ZXMgZnJvbSBza2IgMHglcCB0byB1cmIgMHglcCIsCisJCSAgICAgX19mdW5jX18sIG51bV93cml0dGVuLCBza2IsIHVyYik7CisKKwkJaWYgKCFVRFNMX1NLQihza2IpLT5sZW4pIHsKKwkJCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBVRFNMX1NLQihza2IpLT5hdG0udmNjOworCisJCQl1c2JhdG1fcG9wKHZjYywgc2tiKTsKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4KTsKKworCQkJc2tiID0gc2tiX2RlcXVldWUoJmluc3RhbmNlLT5zbmRxdWV1ZSk7CisJCX0KKworCQlpZiAobnVtX3dyaXR0ZW4gPT0gYnVmX3NpemUgfHwgKCFza2IgJiYgbnVtX3dyaXR0ZW4pKSB7CisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBudW1fd3JpdHRlbjsKKworCQkJaWYgKHVzYmF0bV9zdWJtaXRfdXJiKHVyYikpCisJCQkJYnJlYWs7CisJCQl1cmIgPSBOVUxMOworCQl9CisJfQorCisJaW5zdGFuY2UtPmN1cnJlbnRfc2tiID0gc2tiOworfQorCitzdGF0aWMgdm9pZCB1c2JhdG1fY2FuY2VsX3NlbmQoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSwKKwkJCSAgICAgICBzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpuOworCisJYXRtX2RiZyhpbnN0YW5jZSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKwlzcGluX2xvY2tfaXJxKCZpbnN0YW5jZS0+c25kcXVldWUubG9jayk7CisJZm9yIChza2IgPSBpbnN0YW5jZS0+c25kcXVldWUubmV4dCwgbiA9IHNrYi0+bmV4dDsKKwkgICAgIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmaW5zdGFuY2UtPnNuZHF1ZXVlOworCSAgICAgc2tiID0gbiwgbiA9IHNrYi0+bmV4dCkKKwkJaWYgKFVEU0xfU0tCKHNrYiktPmF0bS52Y2MgPT0gdmNjKSB7CisJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHBvcHBpbmcgc2tiIDB4JXBcbiIsIF9fZnVuY19fLCBza2IpOworCQkJX19za2JfdW5saW5rKHNrYiwgJmluc3RhbmNlLT5zbmRxdWV1ZSk7CisJCQl1c2JhdG1fcG9wKHZjYywgc2tiKTsKKwkJfQorCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNuZHF1ZXVlLmxvY2spOworCisJdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0KTsKKwlpZiAoKHNrYiA9IGluc3RhbmNlLT5jdXJyZW50X3NrYikgJiYgKFVEU0xfU0tCKHNrYiktPmF0bS52Y2MgPT0gdmNjKSkgeworCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHBvcHBpbmcgY3VycmVudCBza2IgKDB4JXApXG4iLCBfX2Z1bmNfXywgc2tiKTsKKwkJaW5zdGFuY2UtPmN1cnJlbnRfc2tiID0gTlVMTDsKKwkJdXNiYXRtX3BvcCh2Y2MsIHNrYik7CisJfQorCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0KTsKKwlhdG1fZGJnKGluc3RhbmNlLCAiJXMgZG9uZVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IHVzYmF0bV9hdG1fc2VuZChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSB2Y2MtPmRldi0+ZGV2X2RhdGE7CisJc3RydWN0IHVzYmF0bV9jb250cm9sICpjdHJsID0gVURTTF9TS0Ioc2tiKTsKKwlpbnQgZXJyOworCisJdmRiZygiJXMgY2FsbGVkIChza2IgMHglcCwgbGVuICV1KSIsIF9fZnVuY19fLCBza2IsIHNrYi0+bGVuKTsKKworCWlmICghaW5zdGFuY2UpIHsKKwkJZGJnKCIlczogTlVMTCBkYXRhISIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDUpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiB1bnN1cHBvcnRlZCBBVE0gdHlwZSAlZCFcbiIsIF9fZnVuY19fLCB2Y2MtPnFvcy5hYWwpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHNrYi0+bGVuID4gQVRNX01BWF9BQUw1X1BEVSkgeworCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHBhY2tldCB0b28gbG9uZyAoJWQgdnMgJWQpIVxuIiwKKwkJCQlfX2Z1bmNfXywgc2tiLT5sZW4sIEFUTV9NQVhfQUFMNV9QRFUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJUEFDS0VUREVCVUcoc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBjb250cm9sIGJsb2NrICovCisJY3RybC0+YXRtLnZjYyA9IHZjYzsKKwljdHJsLT5sZW4gPSBza2ItPmxlbjsKKwljdHJsLT5jcmMgPSBjcmMzMl9iZSh+MCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlza2JfcXVldWVfdGFpbCgmaW5zdGFuY2UtPnNuZHF1ZXVlLCBza2IpOworCXRhc2tsZXRfc2NoZWR1bGUoJmluc3RhbmNlLT50eF9jaGFubmVsLnRhc2tsZXQpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCXVzYmF0bV9wb3AodmNjLCBza2IpOworCXJldHVybiBlcnI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqCisqKiAgYmVhbiBjb3VudGluZyAgKioKKyoqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB1c2JhdG1fZGVzdHJveV9pbnN0YW5jZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB1c2JhdG1fZGF0YSwgcmVmY291bnQpOworCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCXRhc2tsZXRfa2lsbCgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwudGFza2xldCk7CisJdGFza2xldF9raWxsKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0KTsKKwl1c2JfcHV0X2RldihpbnN0YW5jZS0+dXNiX2Rldik7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCit2b2lkIHVzYmF0bV9nZXRfaW5zdGFuY2Uoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSkKK3sKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCisJa3JlZl9nZXQoJmluc3RhbmNlLT5yZWZjb3VudCk7Cit9CisKK3ZvaWQgdXNiYXRtX3B1dF9pbnN0YW5jZShzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlKQoreworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisKKwlrcmVmX3B1dCgmaW5zdGFuY2UtPnJlZmNvdW50LCB1c2JhdG1fZGVzdHJveV9pbnN0YW5jZSk7Cit9CisKKworLyoqKioqKioqKioKKyoqICBBVE0gICoqCisqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB1c2JhdG1fYXRtX2Rldl9jbG9zZShzdHJ1Y3QgYXRtX2RldiAqZGV2KQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSBkZXYtPmRldl9kYXRhOworCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCWlmICghaW5zdGFuY2UpCisJCXJldHVybjsKKworCWRldi0+ZGV2X2RhdGEgPSBOVUxMOworCXVzYmF0bV9wdXRfaW5zdGFuY2UoaW5zdGFuY2UpOwkvKiB0YWtlbiBpbiB1c2JhdG1fYXRtX2luaXQgKi8KK30KKworc3RhdGljIGludCB1c2JhdG1fYXRtX3Byb2NfcmVhZChzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiwgbG9mZl90ICogcG9zLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSBhdG1fZGV2LT5kZXZfZGF0YTsKKwlpbnQgbGVmdCA9ICpwb3M7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRiZygiJXM6IE5VTEwgaW5zdGFuY2UhIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWxlZnQtLSkKKwkJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBpbnN0YW5jZS0+ZGVzY3JpcHRpb24pOworCisJaWYgKCFsZWZ0LS0pCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgIGF0bV9kZXYtPmVzaVswXSwgYXRtX2Rldi0+ZXNpWzFdLAorCQkJICAgICAgIGF0bV9kZXYtPmVzaVsyXSwgYXRtX2Rldi0+ZXNpWzNdLAorCQkJICAgICAgIGF0bV9kZXYtPmVzaVs0XSwgYXRtX2Rldi0+ZXNpWzVdKTsKKworCWlmICghbGVmdC0tKQorCQlyZXR1cm4gc3ByaW50ZihwYWdlLAorCQkJICAgICAgICJBQUw1OiB0eCAlZCAoICVkIGVyciApLCByeCAlZCAoICVkIGVyciwgJWQgZHJvcCApXG4iLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnR4KSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS50eF9lcnIpLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnJ4KSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS5yeF9lcnIpLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnJ4X2Ryb3ApKTsKKworCWlmICghbGVmdC0tKQorCQlzd2l0Y2ggKGF0bV9kZXYtPnNpZ25hbCkgeworCQljYXNlIEFUTV9QSFlfU0lHX0ZPVU5EOgorCQkJcmV0dXJuIHNwcmludGYocGFnZSwgIkxpbmUgdXBcbiIpOworCQljYXNlIEFUTV9QSFlfU0lHX0xPU1Q6CisJCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiTGluZSBkb3duXG4iKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJMaW5lIHN0YXRlIHVua25vd25cbiIpOworCQl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JhdG1fYXRtX29wZW4oc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gdmNjLT5kZXYtPmRldl9kYXRhOworCXN0cnVjdCB1c2JhdG1fdmNjX2RhdGEgKm5ldyA9IE5VTEw7CisJaW50IHJldDsKKwlpbnQgdmNpID0gdmNjLT52Y2k7CisJc2hvcnQgdnBpID0gdmNjLT52cGk7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRiZygiJXM6IE5VTEwgZGF0YSEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWF0bV9kYmcoaW5zdGFuY2UsICIlczogdnBpICVoZCwgdmNpICVkXG4iLCBfX2Z1bmNfXywgdnBpLCB2Y2kpOworCisJLyogb25seSBzdXBwb3J0IEFBTDUgKi8KKwlpZiAoKHZjYy0+cW9zLmFhbCAhPSBBVE1fQUFMNSkgfHwgKHZjYy0+cW9zLnJ4dHAubWF4X3NkdSA8IDApCisJICAgIHx8ICh2Y2MtPnFvcy5yeHRwLm1heF9zZHUgPiBBVE1fTUFYX0FBTDVfUERVKSkgeworCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHVuc3VwcG9ydGVkIEFUTSB0eXBlICVkIVxuIiwgX19mdW5jX18sIHZjYy0+cW9zLmFhbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvd24oJmluc3RhbmNlLT5zZXJpYWxpemUpOwkvKiB2cyBzZWxmLCB1c2JhdG1fYXRtX2Nsb3NlICovCisKKwlpZiAodXNiYXRtX2ZpbmRfdmNjKGluc3RhbmNlLCB2cGksIHZjaSkpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiAlaGQvJWQgYWxyZWFkeSBpbiB1c2UhXG4iLCBfX2Z1bmNfXywgdnBpLCB2Y2kpOworCQlyZXQgPSAtRUFERFJJTlVTRTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghKG5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JhdG1fdmNjX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBubyBtZW1vcnkgZm9yIHZjY19kYXRhIVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCB1c2JhdG1fdmNjX2RhdGEpKTsKKwluZXctPnZjYyA9IHZjYzsKKwluZXctPnZwaSA9IHZwaTsKKwluZXctPnZjaSA9IHZjaTsKKworCW5ldy0+c2FyYiA9IGFsbG9jX3NrYih1c2JhdG1fcGR1X2xlbmd0aCh2Y2MtPnFvcy5yeHRwLm1heF9zZHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ldy0+c2FyYikgeworCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IG5vIG1lbW9yeSBmb3IgU0FSIGJ1ZmZlciFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCXZjYy0+ZGV2X2RhdGEgPSBuZXc7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCWxpc3RfYWRkKCZuZXctPmxpc3QsICZpbnN0YW5jZS0+dmNjX2xpc3QpOworCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC50YXNrbGV0KTsKKworCXNldF9iaXQoQVRNX1ZGX0FERFIsICZ2Y2MtPmZsYWdzKTsKKwlzZXRfYml0KEFUTV9WRl9QQVJUSUFMLCAmdmNjLT5mbGFncyk7CisJc2V0X2JpdChBVE1fVkZfUkVBRFksICZ2Y2MtPmZsYWdzKTsKKworCXVwKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKworCWF0bV9kYmcoaW5zdGFuY2UsICIlczogYWxsb2NhdGVkIHZjYyBkYXRhIDB4JXBcbiIsIF9fZnVuY19fLCBuZXcpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUobmV3KTsKKwl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdXNiYXRtX2F0bV9jbG9zZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSB2Y2MtPmRldi0+ZGV2X2RhdGE7CisJc3RydWN0IHVzYmF0bV92Y2NfZGF0YSAqdmNjX2RhdGEgPSB2Y2MtPmRldl9kYXRhOworCisJaWYgKCFpbnN0YW5jZSB8fCAhdmNjX2RhdGEpIHsKKwkJZGJnKCIlczogTlVMTCBkYXRhISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWF0bV9kYmcoaW5zdGFuY2UsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IGRlYWxsb2NhdGluZyB2Y2MgMHglcCB3aXRoIHZwaSAlZCB2Y2kgJWRcbiIsCisJCV9fZnVuY19fLCB2Y2NfZGF0YSwgdmNjX2RhdGEtPnZwaSwgdmNjX2RhdGEtPnZjaSk7CisKKwl1c2JhdG1fY2FuY2VsX3NlbmQoaW5zdGFuY2UsIHZjYyk7CisKKwlkb3duKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsJLyogdnMgc2VsZiwgdXNiYXRtX2F0bV9vcGVuICovCisKKwl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCWxpc3RfZGVsKCZ2Y2NfZGF0YS0+bGlzdCk7CisJdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCisJa2ZyZWVfc2tiKHZjY19kYXRhLT5zYXJiKTsKKwl2Y2NfZGF0YS0+c2FyYiA9IE5VTEw7CisKKwlrZnJlZSh2Y2NfZGF0YSk7CisJdmNjLT5kZXZfZGF0YSA9IE5VTEw7CisKKwl2Y2MtPnZwaSA9IEFUTV9WUElfVU5TUEVDOworCXZjYy0+dmNpID0gQVRNX1ZDSV9VTlNQRUM7CisJY2xlYXJfYml0KEFUTV9WRl9SRUFEWSwgJnZjYy0+ZmxhZ3MpOworCWNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOworCWNsZWFyX2JpdChBVE1fVkZfQUREUiwgJnZjYy0+ZmxhZ3MpOworCisJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOworCisJYXRtX2RiZyhpbnN0YW5jZSwgIiVzIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCB1c2JhdG1fYXRtX2lvY3RsKHN0cnVjdCBhdG1fZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHZvaWQgX191c2VyICogYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVE1fUVVFUllMT09QOgorCQlyZXR1cm4gcHV0X3VzZXIoQVRNX0xNX05PTkUsIChpbnQgX191c2VyICopYXJnKSA/IC1FRkFVTFQgOiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IHVzYmF0bV9hdG1faW5pdChzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlKQoreworCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2OworCWludCByZXQsIGk7CisKKwkvKiBBVE0gaW5pdCAqLworCWF0bV9kZXYgPSBhdG1fZGV2X3JlZ2lzdGVyKGluc3RhbmNlLT5kcml2ZXJfbmFtZSwgJnVzYmF0bV9hdG1fZGV2b3BzLCAtMSwgTlVMTCk7CisJaWYgKCFhdG1fZGV2KSB7CisJCXVzYl9kYmcoaW5zdGFuY2UsICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIEFUTSBkZXZpY2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpbnN0YW5jZS0+YXRtX2RldiA9IGF0bV9kZXY7CisKKwlhdG1fZGV2LT5jaV9yYW5nZS52cGlfYml0cyA9IEFUTV9DSV9NQVg7CisJYXRtX2Rldi0+Y2lfcmFuZ2UudmNpX2JpdHMgPSBBVE1fQ0lfTUFYOworCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisKKwkvKiB0ZW1wIGluaXQgQVRNIGRldmljZSwgc2V0IHRvIDEyOGtiaXQgKi8KKwlhdG1fZGV2LT5saW5rX3JhdGUgPSAxMjggKiAxMDAwIC8gNDI0OworCisJaWYgKGluc3RhbmNlLT5kcml2ZXItPmF0bV9zdGFydCAmJiAoKHJldCA9IGluc3RhbmNlLT5kcml2ZXItPmF0bV9zdGFydChpbnN0YW5jZSwgYXRtX2RldikpIDwgMCkpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBhdG1fc3RhcnQgZmFpbGVkOiAlZCFcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogcmVhZHkgZm9yIEFUTSBjYWxsYmFja3MgKi8KKwl1c2JhdG1fZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsJLyogZHJvcHBlZCBpbiB1c2JhdG1fYXRtX2Rldl9jbG9zZSAqLworCW1iKCk7CisJYXRtX2Rldi0+ZGV2X2RhdGEgPSBpbnN0YW5jZTsKKworCS8qIHN1Ym1pdCBhbGwgcnggVVJCcyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnM7IGkrKykKKwkJdXNiYXRtX3N1Ym1pdF91cmIoaW5zdGFuY2UtPnVyYnNbaV0pOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWluc3RhbmNlLT5hdG1fZGV2ID0gTlVMTDsKKwlzaHV0ZG93bl9hdG1fZGV2KGF0bV9kZXYpOyAvKiB1c2JhdG1fYXRtX2Rldl9jbG9zZSB3aWxsIGV2ZW50dWFsbHkgYmUgY2FsbGVkICovCisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKgorKiogIFVTQiAgKioKKyoqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdXNiYXRtX2RvX2hlYXZ5X2luaXQodm9pZCAqYXJnKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSBhcmc7CisJaW50IHJldDsKKworCWRhZW1vbml6ZShpbnN0YW5jZS0+ZHJpdmVyLT5kcml2ZXJfbmFtZSk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJY29tcGxldGUoJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CisKKwlyZXQgPSBpbnN0YW5jZS0+ZHJpdmVyLT5oZWF2eV9pbml0KGluc3RhbmNlLCBpbnN0YW5jZS0+dXNiX2ludGYpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzYmF0bV9hdG1faW5pdChpbnN0YW5jZSk7CisKKwlkb3duKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKwlpbnN0YW5jZS0+dGhyZWFkX3BpZCA9IC0xOworCXVwKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKworCWNvbXBsZXRlX2FuZF9leGl0KCZpbnN0YW5jZS0+dGhyZWFkX2V4aXRlZCwgcmV0KTsKK30KKworc3RhdGljIGludCB1c2JhdG1faGVhdnlfaW5pdChzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlKQoreworCWludCByZXQgPSBrZXJuZWxfdGhyZWFkKHVzYmF0bV9kb19oZWF2eV9pbml0LCBpbnN0YW5jZSwgQ0xPTkVfS0VSTkVMKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXVzYl9kYmcoaW5zdGFuY2UsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWxfdGhyZWFkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkb3duKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKwlpbnN0YW5jZS0+dGhyZWFkX3BpZCA9IHJldDsKKwl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpbnN0YW5jZS0+dGhyZWFkX3N0YXJ0ZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmF0bV90YXNrbGV0X3NjaGVkdWxlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl0YXNrbGV0X3NjaGVkdWxlKChzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKikgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JhdG1faW5pdF9jaGFubmVsKHN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNoYW5uZWwtPmxpc3QpOworCWNoYW5uZWwtPmRlbGF5LmZ1bmN0aW9uID0gdXNiYXRtX3Rhc2tsZXRfc2NoZWR1bGU7CisJY2hhbm5lbC0+ZGVsYXkuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmY2hhbm5lbC0+dGFza2xldDsKKwlpbml0X3RpbWVyKCZjaGFubmVsLT5kZWxheSk7Cit9CisKK2ludCB1c2JhdG1fdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsCisJCSAgICAgc3RydWN0IHVzYmF0bV9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50Zi0+ZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlOworCWNoYXIgKmJ1ZjsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCWludCBpLCBsZW5ndGg7CisJaW50IG5lZWRfaGVhdnk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiB0cnlpbmcgZHJpdmVyICVzIHdpdGggdmVuZG9yPTB4JXgsIHByb2R1Y3Q9MHgleCwgaWZudW0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZHJpdmVyLT5kcml2ZXJfbmFtZSwKKwkJCWxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCS8qIGluc3RhbmNlIGluaXQgKi8KKwlpbnN0YW5jZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCppbnN0YW5jZSkgKyBzaXplb2Yoc3RydWN0IHVyYiAqKSAqIChudW1fcmN2X3VyYnMgKyBudW1fc25kX3VyYnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YSFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogcHVibGljIGZpZWxkcyAqLworCisJaW5zdGFuY2UtPmRyaXZlciA9IGRyaXZlcjsKKwlzbnByaW50ZihpbnN0YW5jZS0+ZHJpdmVyX25hbWUsIHNpemVvZihpbnN0YW5jZS0+ZHJpdmVyX25hbWUpLCBkcml2ZXItPmRyaXZlcl9uYW1lKTsKKworCWluc3RhbmNlLT51c2JfZGV2ID0gdXNiX2RldjsKKwlpbnN0YW5jZS0+dXNiX2ludGYgPSBpbnRmOworCisJYnVmID0gaW5zdGFuY2UtPmRlc2NyaXB0aW9uOworCWxlbmd0aCA9IHNpemVvZihpbnN0YW5jZS0+ZGVzY3JpcHRpb24pOworCisJaWYgKChpID0gdXNiX3N0cmluZyh1c2JfZGV2LCB1c2JfZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0LCBidWYsIGxlbmd0aCkpIDwgMCkKKwkJZ290byBiaW5kOworCisJYnVmICs9IGk7CisJbGVuZ3RoIC09IGk7CisKKwlpID0gc2NucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiICgiKTsKKwlidWYgKz0gaTsKKwlsZW5ndGggLT0gaTsKKworCWlmIChsZW5ndGggPD0gMCB8fCAoaSA9IHVzYl9tYWtlX3BhdGgodXNiX2RldiwgYnVmLCBsZW5ndGgpKSA8IDApCisJCWdvdG8gYmluZDsKKworCWJ1ZiArPSBpOworCWxlbmd0aCAtPSBpOworCisJc25wcmludGYoYnVmLCBsZW5ndGgsICIpIik7CisKKyBiaW5kOgorCW5lZWRfaGVhdnkgPSAxOworCWlmIChkcml2ZXItPmJpbmQgJiYgKGVycm9yID0gZHJpdmVyLT5iaW5kKGluc3RhbmNlLCBpbnRmLCBpZCwgJm5lZWRfaGVhdnkpKSA8IDApIHsKKwkJCWRldl9kYmcoZGV2LCAiJXM6IGJpbmQgZmFpbGVkOiAlZCFcbiIsIF9fZnVuY19fLCBlcnJvcik7CisJCQlnb3RvIGZhaWxfZnJlZTsKKwl9CisKKwkvKiBwcml2YXRlIGZpZWxkcyAqLworCisJa3JlZl9pbml0KCZpbnN0YW5jZS0+cmVmY291bnQpOwkJLyogZHJvcHBlZCBpbiB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3QgKi8KKwlpbml0X01VVEVYKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKworCWluc3RhbmNlLT50aHJlYWRfcGlkID0gLTE7CisJaW5pdF9jb21wbGV0aW9uKCZpbnN0YW5jZS0+dGhyZWFkX3N0YXJ0ZWQpOworCWluaXRfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQpOworCisJSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT52Y2NfbGlzdCk7CisKKwl1c2JhdG1faW5pdF9jaGFubmVsKCZpbnN0YW5jZS0+cnhfY2hhbm5lbCk7CisJdXNiYXRtX2luaXRfY2hhbm5lbCgmaW5zdGFuY2UtPnR4X2NoYW5uZWwpOworCXRhc2tsZXRfaW5pdCgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwudGFza2xldCwgdXNiYXRtX3J4X3Byb2Nlc3MsICh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKKwl0YXNrbGV0X2luaXQoJmluc3RhbmNlLT50eF9jaGFubmVsLnRhc2tsZXQsIHVzYmF0bV90eF9wcm9jZXNzLCAodW5zaWduZWQgbG9uZylpbnN0YW5jZSk7CisJaW5zdGFuY2UtPnJ4X2NoYW5uZWwuZW5kcG9pbnQgPSB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgZHJpdmVyLT5pbik7CisJaW5zdGFuY2UtPnR4X2NoYW5uZWwuZW5kcG9pbnQgPSB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgZHJpdmVyLT5vdXQpOworCWluc3RhbmNlLT5yeF9jaGFubmVsLnN0cmlkZSA9IEFUTV9DRUxMX1NJWkUgKyBkcml2ZXItPnJ4X3BhZGRpbmc7CisJaW5zdGFuY2UtPnR4X2NoYW5uZWwuc3RyaWRlID0gQVRNX0NFTExfU0laRSArIGRyaXZlci0+dHhfcGFkZGluZzsKKwlpbnN0YW5jZS0+cnhfY2hhbm5lbC5idWZfc2l6ZSA9IHJjdl9idWZfc2l6ZSAqIGluc3RhbmNlLT5yeF9jaGFubmVsLnN0cmlkZTsKKwlpbnN0YW5jZS0+dHhfY2hhbm5lbC5idWZfc2l6ZSA9IHNuZF9idWZfc2l6ZSAqIGluc3RhbmNlLT50eF9jaGFubmVsLnN0cmlkZTsKKwlpbnN0YW5jZS0+cnhfY2hhbm5lbC51c2JhdG0gPSBpbnN0YW5jZS0+dHhfY2hhbm5lbC51c2JhdG0gPSBpbnN0YW5jZTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmluc3RhbmNlLT5zbmRxdWV1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzOyBpKyspIHsKKwkJc3RydWN0IHVyYiAqdXJiOworCQl1OCAqYnVmZmVyOworCQl1bnNpZ25lZCBpbnQgaXNvX3BhY2tldHMgPSAwLCBpc29fc2l6ZSA9IDA7CisJCXN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCA9IGkgPCBudW1fcmN2X3VyYnMgPworCQkJJmluc3RhbmNlLT5yeF9jaGFubmVsIDogJmluc3RhbmNlLT50eF9jaGFubmVsOworCisJCWlmICh1c2JfcGlwZWlzb2MoY2hhbm5lbC0+ZW5kcG9pbnQpKSB7CisJCQkvKiBkb24ndCBleHBlY3QgaXNvIG91dCBlbmRwb2ludHMgKi8KKwkJCWlzb19zaXplID0gdXNiX21heHBhY2tldChpbnN0YW5jZS0+dXNiX2RldiwgY2hhbm5lbC0+ZW5kcG9pbnQsIDApOworCQkJaXNvX3NpemUgLT0gaXNvX3NpemUgJSBjaGFubmVsLT5zdHJpZGU7CS8qIGFsaWdubWVudCAqLworCQkJQlVHX09OKCFpc29fc2l6ZSk7CisJCQlpc29fcGFja2V0cyA9IChjaGFubmVsLT5idWZfc2l6ZSAtIDEpIC8gaXNvX3NpemUgKyAxOworCQl9CisKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihpc29fcGFja2V0cywgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIHVyYiAlZCFcbiIsIF9fZnVuY19fLCBpKTsKKwkJCWdvdG8gZmFpbF91bmJpbmQ7CisJCX0KKworCQlpbnN0YW5jZS0+dXJic1tpXSA9IHVyYjsKKworCQlidWZmZXIgPSBrbWFsbG9jKGNoYW5uZWwtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWZmZXIpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgYnVmZmVyICVkIVxuIiwgX19mdW5jX18sIGkpOworCQkJZ290byBmYWlsX3VuYmluZDsKKwkJfQorCQltZW1zZXQoYnVmZmVyLCAwLCBjaGFubmVsLT5idWZfc2l6ZSk7CisKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBpbnN0YW5jZS0+dXNiX2RldiwgY2hhbm5lbC0+ZW5kcG9pbnQsCisJCQkJICBidWZmZXIsIGNoYW5uZWwtPmJ1Zl9zaXplLCB1c2JhdG1fY29tcGxldGUsIGNoYW5uZWwpOworCQlpZiAoaXNvX3BhY2tldHMpIHsKKwkJCWludCBqOworCQkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IGlzb19wYWNrZXRzOworCQkJZm9yIChqID0gMDsgaiA8IGlzb19wYWNrZXRzOyBqKyspIHsKKwkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGlzb19zaXplICogajsKKwkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IG1pbl90KGludCwgaXNvX3NpemUsCisJCQkJCQkJCSAgICAgIGNoYW5uZWwtPmJ1Zl9zaXplIC0gdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQpOworCQkJfQorCQl9CisKKwkJLyogcHV0IGFsbCB0eCBVUkJzIG9uIHRoZSBsaXN0IG9mIHNwYXJlcyAqLworCQlpZiAoaSA+PSBudW1fcmN2X3VyYnMpCisJCQlsaXN0X2FkZF90YWlsKCZ1cmItPnVyYl9saXN0LCAmY2hhbm5lbC0+bGlzdCk7CisKKwkJdmRiZygiJXM6IGFsbG9jZWQgYnVmZmVyIDB4JXAgYnVmIHNpemUgJXUgdXJiIDB4JXAiLAorCQkgICAgIF9fZnVuY19fLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmIpOworCX0KKworCWlmIChuZWVkX2hlYXZ5ICYmIGRyaXZlci0+aGVhdnlfaW5pdCkgeworCQllcnJvciA9IHVzYmF0bV9oZWF2eV9pbml0KGluc3RhbmNlKTsKKwl9IGVsc2UgeworCQljb21wbGV0ZSgmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQpOwkvKiBwcmV0ZW5kIHRoYXQgaGVhdnlfaW5pdCB3YXMgcnVuICovCisJCWVycm9yID0gdXNiYXRtX2F0bV9pbml0KGluc3RhbmNlKTsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGZhaWxfdW5iaW5kOworCisJdXNiX2dldF9kZXYodXNiX2Rldik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBpbnN0YW5jZSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWxfdW5iaW5kOgorCWlmIChpbnN0YW5jZS0+ZHJpdmVyLT51bmJpbmQpCisJCWluc3RhbmNlLT5kcml2ZXItPnVuYmluZChpbnN0YW5jZSwgaW50Zik7CisgZmFpbF9mcmVlOgorCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnMgKyBudW1fc25kX3VyYnM7IGkrKykgeworCQlpZiAoaW5zdGFuY2UtPnVyYnNbaV0pCisJCQlrZnJlZShpbnN0YW5jZS0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT51cmJzW2ldKTsKKwl9CisKKwlrZnJlZSAoaW5zdGFuY2UpOworCisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiYXRtX3VzYl9wcm9iZSk7CisKK3ZvaWQgdXNiYXRtX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnRmLT5kZXY7CisJc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50IGk7CisKKwlkZXZfZGJnKGRldiwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCWlmICghaW5zdGFuY2UpIHsKKwkJZGV2X2RiZyhkZXYsICIlczogTlVMTCBpbnN0YW5jZSFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlkb3duKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKwlpZiAoaW5zdGFuY2UtPnRocmVhZF9waWQgPj0gMCkKKwkJa2lsbF9wcm9jKGluc3RhbmNlLT50aHJlYWRfcGlkLCBTSUdURVJNLCAxKTsKKwl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpbnN0YW5jZS0+dGhyZWFkX2V4aXRlZCk7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnR4X2NoYW5uZWwudGFza2xldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzOyBpKyspCisJCXVzYl9raWxsX3VyYihpbnN0YW5jZS0+dXJic1tpXSk7CisKKwlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnJ4X2NoYW5uZWwuZGVsYXkpOworCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC5kZWxheSk7CisKKwlpZiAoaW5zdGFuY2UtPmF0bV9kZXYgJiYgaW5zdGFuY2UtPmRyaXZlci0+YXRtX3N0b3ApCisJCWluc3RhbmNlLT5kcml2ZXItPmF0bV9zdG9wKGluc3RhbmNlLCBpbnN0YW5jZS0+YXRtX2Rldik7CisKKwlpZiAoaW5zdGFuY2UtPmRyaXZlci0+dW5iaW5kKQorCQlpbnN0YW5jZS0+ZHJpdmVyLT51bmJpbmQoaW5zdGFuY2UsIGludGYpOworCisJaW5zdGFuY2UtPmRyaXZlcl9kYXRhID0gTlVMTDsKKworCS8qIHR1cm4gdXNiYXRtX1tydF14X3Byb2Nlc3MgaW50byBub29wICovCisJLyogbm8gbmVlZCB0byB0YWtlIHRoZSBzcGlubG9jayAqLworCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnR4X2NoYW5uZWwubGlzdCk7CisKKwl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwudGFza2xldCk7CisJdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT50eF9jaGFubmVsLnRhc2tsZXQpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJiczsgaSsrKSB7CisJCWtmcmVlKGluc3RhbmNlLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnVyYnNbaV0pOworCX0KKworCS8qIEFUTSBmaW5hbGl6ZSAqLworCWlmIChpbnN0YW5jZS0+YXRtX2RldikKKwkJc2h1dGRvd25fYXRtX2RldihpbnN0YW5jZS0+YXRtX2Rldik7CisKKwl1c2JhdG1fcHV0X2luc3RhbmNlKGluc3RhbmNlKTsJLyogdGFrZW4gaW4gdXNiYXRtX3VzYl9wcm9iZSAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiYXRtX3VzYl9kaXNjb25uZWN0KTsKKworCisvKioqKioqKioqKioKKyoqICBpbml0ICAqKgorKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IHVzYmF0bV91c2JfaW5pdCh2b2lkKQoreworCWRiZygiJXM6IGRyaXZlciB2ZXJzaW9uICVzIiwgX19mdW5jX18sIERSSVZFUl9WRVJTSU9OKTsKKworCWlmIChzaXplb2Yoc3RydWN0IHVzYmF0bV9jb250cm9sKSA+IHNpemVvZigoKHN0cnVjdCBza19idWZmICopIDApLT5jYikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bnVzYWJsZSB3aXRoIHRoaXMga2VybmVsIVxuIiwgdXNiYXRtX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKChudW1fcmN2X3VyYnMgPiBVRFNMX01BWF9SQ1ZfVVJCUykKKwkgICAgfHwgKG51bV9zbmRfdXJicyA+IFVEU0xfTUFYX1NORF9VUkJTKQorCSAgICB8fCAocmN2X2J1Zl9zaXplIDwgMSkKKwkgICAgfHwgKHJjdl9idWZfc2l6ZSA+IFVEU0xfTUFYX1JDVl9CVUZfU0laRSkKKwkgICAgfHwgKHNuZF9idWZfc2l6ZSA8IDEpCisJICAgIHx8IChzbmRfYnVmX3NpemUgPiBVRFNMX01BWF9TTkRfQlVGX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQodXNiYXRtX3VzYl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHVzYmF0bV91c2JfZXhpdCh2b2lkKQoreworCWRiZygiJXMiLCBfX2Z1bmNfXyk7Cit9Cittb2R1bGVfZXhpdCh1c2JhdG1fdXNiX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKKworLyoqKioqKioqKioqKgorKiogIGRlYnVnICAqKgorKioqKioqKioqKioqLworCisjaWZkZWYgVkVSQk9TRV9ERUJVRworc3RhdGljIGludCB1c2JhdG1fcHJpbnRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKKwlpbnQgaSA9IDAsIGogPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjspIHsKKwkJYnVmZmVyWzBdID0gJ1wwJzsKKwkJc3ByaW50ZihidWZmZXIsICIlLjNkIDoiLCBpKTsKKwkJZm9yIChqID0gMDsgKGogPCAxNikgJiYgKGkgPCBsZW4pOyBqKyssIGkrKykgeworCQkJc3ByaW50ZihidWZmZXIsICIlcyAlMi4yeCIsIGJ1ZmZlciwgZGF0YVtpXSk7CisJCX0KKwkJZGJnKCIlcyIsIGJ1ZmZlcik7CisJfQorCXJldHVybiBpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmggYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uaApAQCAtMCwwICsxLDE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHVzYmF0bS5oIC0gR2VuZXJpYyBVU0IgeERTTCBkcml2ZXIgY29yZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIEFsY2F0ZWwKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIER1bmNhbiBTYW5kcywgU29sTmVncm8sIEpvc2VwIENvbWFzCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCBEYXZpZCBXb29kaG91c2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX1VTQkFUTV9IXworI2RlZmluZQlfVVNCQVRNX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyNkZWZpbmUgREVCVUcKKyNkZWZpbmUgVkVSQk9TRV9ERUJVRworKi8KKworI2lmICFkZWZpbmVkIChERUJVRykgJiYgZGVmaW5lZCAoQ09ORklHX1VTQl9ERUJVRykKKyMJZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFVEU0xfQVNTRVJUKHgpCUJVR19PTighKHgpKQorI2Vsc2UKKyNkZWZpbmUgVURTTF9BU1NFUlQoeCkJZG8geyBpZiAoISh4KSkgd2FybigiZmFpbGVkIGFzc2VydGlvbiAnJXMnIGF0IGxpbmUgJWQiLCBfX3N0cmluZ2lmeSh4KSwgX19MSU5FX18pOyB9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSB1c2JfZXJyKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWRldl9lcnIoJihpbnN0YW5jZSktPnVzYl9pbnRmLT5kZXYgLCBmb3JtYXQgLCAjIyBhcmcpCisjZGVmaW5lIHVzYl9pbmZvKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWRldl9pbmZvKCYoaW5zdGFuY2UpLT51c2JfaW50Zi0+ZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQorI2RlZmluZSB1c2Jfd2FybihpbnN0YW5jZSwgZm9ybWF0LCBhcmcuLi4pCVwKKwlkZXZfd2FybigmKGluc3RhbmNlKS0+dXNiX2ludGYtPmRldiAsIGZvcm1hdCAsICMjIGFyZykKKyNkZWZpbmUgdXNiX2RiZyhpbnN0YW5jZSwgZm9ybWF0LCBhcmcuLi4pCVwKKwlkZXZfZGJnKCYoaW5zdGFuY2UpLT51c2JfaW50Zi0+ZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQorCisvKiBGSVhNRTogbW92ZSB0byBkZXZfKiBvbmNlIEFUTSBpcyBkcml2ZXIgbW9kZWwgYXdhcmUgKi8KKyNkZWZpbmUgYXRtX3ByaW50ayhsZXZlbCwgaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJcHJpbnRrKGxldmVsICJBVE0gZGV2ICVkOiAiIGZvcm1hdCAsCQlcCisJKGluc3RhbmNlKS0+YXRtX2Rldi0+bnVtYmVyICwgIyMgYXJnKQorCisjZGVmaW5lIGF0bV9lcnIoaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJYXRtX3ByaW50ayhLRVJOX0VSUiwgaW5zdGFuY2UgLCBmb3JtYXQgLCAjIyBhcmcpCisjZGVmaW5lIGF0bV9pbmZvKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWF0bV9wcmludGsoS0VSTl9JTkZPLCBpbnN0YW5jZSAsIGZvcm1hdCAsICMjIGFyZykKKyNkZWZpbmUgYXRtX3dhcm4oaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJYXRtX3ByaW50ayhLRVJOX1dBUk5JTkcsIGluc3RhbmNlICwgZm9ybWF0ICwgIyMgYXJnKQorI2lmZGVmIERFQlVHCisjZGVmaW5lIGF0bV9kYmcoaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJYXRtX3ByaW50ayhLRVJOX0RFQlVHLCBpbnN0YW5jZSAsIGZvcm1hdCAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGF0bV9kYmcoaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBtaW5pIGRyaXZlciAqLworCitzdHJ1Y3QgdXNiYXRtX2RhdGE7CisKKy8qCisqICBBc3N1bWluZyBhbGwgbWV0aG9kcyBleGlzdCBhbmQgc3VjY2VlZCwgdGhleSBhcmUgY2FsbGVkIGluIHRoaXMgb3JkZXI6CisqCisqICAJYmluZCwgaGVhdnlfaW5pdCwgYXRtX3N0YXJ0LCAuLi4sIGF0bV9zdG9wLCB1bmJpbmQKKyovCisKK3N0cnVjdCB1c2JhdG1fZHJpdmVyIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOworCisJLyoKKwkqICBpbml0IGRldmljZSAuLi4gY2FuIHNsZWVwLCBvciBjYXVzZSBwcm9iZSgpIGZhaWx1cmUuICBEcml2ZXJzIHdpdGggYSBoZWF2eV9pbml0CisJKiAgbWV0aG9kIGNhbiBhdm9pZCBoYXZpbmcgaXQgY2FsbGVkIGJ5IHNldHRpbmcgbmVlZF9oZWF2eV9pbml0IHRvIHplcm8uCisJKi8KKyAgICAgICAgaW50ICgqYmluZCkgKHN0cnVjdCB1c2JhdG1fZGF0YSAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLAorCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwgaW50ICpuZWVkX2hlYXZ5X2luaXQpOworCisJLyogYWRkaXRpb25hbCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gdGhhdCBpcyB0b28gc2xvdyB0byBiZSBkb25lIGluIHByb2JlKCkgKi8KKyAgICAgICAgaW50ICgqaGVhdnlfaW5pdCkgKHN0cnVjdCB1c2JhdG1fZGF0YSAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCS8qIGNsZWFudXAgZGV2aWNlIC4uLiBjYW4gc2xlZXAsIGJ1dCBjYW4ndCBmYWlsICovCisgICAgICAgIHZvaWQgKCp1bmJpbmQpIChzdHJ1Y3QgdXNiYXRtX2RhdGEgKiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKwkvKiBpbml0IEFUTSBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgb3IgY2F1c2UgQVRNIGluaXRpYWxpemF0aW9uIGZhaWx1cmUgKi8KKwlpbnQgKCphdG1fc3RhcnQpIChzdHJ1Y3QgdXNiYXRtX2RhdGEgKiwgc3RydWN0IGF0bV9kZXYgKik7CisKKwkvKiBjbGVhbnVwIEFUTSBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgYnV0IGNhbid0IGZhaWwgKi8KKwl2b2lkICgqYXRtX3N0b3ApIChzdHJ1Y3QgdXNiYXRtX2RhdGEgKiwgc3RydWN0IGF0bV9kZXYgKik7CisKKyAgICAgICAgaW50IGluOwkJLyogcnggZW5kcG9pbnQgKi8KKyAgICAgICAgaW50IG91dDsJLyogdHggZW5kcG9pbnQgKi8KKworCXVuc2lnbmVkIHJ4X3BhZGRpbmc7CisJdW5zaWduZWQgdHhfcGFkZGluZzsKK307CisKK2V4dGVybiBpbnQgdXNiYXRtX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAorCQlzdHJ1Y3QgdXNiYXRtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiB2b2lkIHVzYmF0bV91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKKworc3RydWN0IHVzYmF0bV9jaGFubmVsIHsKKwlpbnQgZW5kcG9pbnQ7CQkJLyogdXNiIHBpcGUgKi8KKwl1bnNpZ25lZCBpbnQgc3RyaWRlOwkJLyogQVRNIGNlbGwgc2l6ZSArIHBhZGRpbmcgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CQkvKiB1cmIgYnVmZmVyIHNpemUgKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworCXN0cnVjdCB0aW1lcl9saXN0IGRlbGF5OworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtOworfTsKKworLyogbWFpbiBkcml2ZXIgZGF0YSAqLworCitzdHJ1Y3QgdXNiYXRtX2RhdGEgeworCS8qKioqKioqKioqKioqKioqKioKKwkqICBwdWJsaWMgZmllbGRzICAqCisgICAgICAgICoqKioqKioqKioqKioqKioqKi8KKworCS8qIG1pbmkgZHJpdmVyICovCisJc3RydWN0IHVzYmF0bV9kcml2ZXIgKmRyaXZlcjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKKwljaGFyIGRyaXZlcl9uYW1lWzE2XTsKKworCS8qIFVTQiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ludGY7CisJY2hhciBkZXNjcmlwdGlvbls2NF07CisKKwkvKiBBVE0gZGV2aWNlICovCisJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXY7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqICBwcml2YXRlIGZpZWxkcyAtIGRvIG5vdCB1c2UgICoKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlcmlhbGl6ZTsKKworCS8qIGhlYXZ5IGluaXQgKi8KKwlpbnQgdGhyZWFkX3BpZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfc3RhcnRlZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfZXhpdGVkOworCisJLyogQVRNIGRldmljZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgdmNjX2xpc3Q7CisKKwlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgcnhfY2hhbm5lbDsKKwlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgdHhfY2hhbm5lbDsKKworCXN0cnVjdCBza19idWZmX2hlYWQgc25kcXVldWU7CisJc3RydWN0IHNrX2J1ZmYgKmN1cnJlbnRfc2tiOwkJCS8qIGJlaW5nIGVtcHRpZWQgKi8KKworCXN0cnVjdCB1cmIgKnVyYnNbMF07Cit9OworCisjZW5kaWYJLyogX1VTQkFUTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3h1c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS94dXNiYXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlN2ZiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2F0bS94dXNiYXRtLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICB4dXNiYXRtLmMgLQlkdW1iIHVzYmF0bS1iYXNlZCBkcml2ZXIgZm9yIG1vZGVtcyBpbml0aWFsaXplZCBpbiB1c2Vyc3BhY2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IER1bmNhbiBTYW5kcywgUm9tYW4gS2FnYW4gKHJrYWdhbiAlIG1haWwgISBydSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4JCS8qIEZJWE1FOiByZXF1aXJlZCBieSBsaW51eC9ldGhlcmRldmljZS5oICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGZvciByYW5kb21fZXRoZXJfYWRkcigpICovCisKKyNpbmNsdWRlICJ1c2JhdG0uaCIKKworCisjZGVmaW5lIFhVU0JBVE1fRFJJVkVSU19NQVgJOAorCisjZGVmaW5lIFhVU0JBVE1fUEFSTShuYW1lLCB0eXBlLCBwYXJtdHlwZSwgZGVzYykgXAorCXN0YXRpYyB0eXBlIG5hbWVbWFVTQkFUTV9EUklWRVJTX01BWF07IFwKKwlzdGF0aWMgaW50IG51bV8jI25hbWU7IFwKKwltb2R1bGVfcGFyYW1fYXJyYXkobmFtZSwgcGFybXR5cGUsICZudW1fIyNuYW1lLCAwNDQ0KTsgXAorCU1PRFVMRV9QQVJNX0RFU0MobmFtZSwgZGVzYykKKworWFVTQkFUTV9QQVJNKHZlbmRvciwgdW5zaWduZWQgc2hvcnQsIHVzaG9ydCwgIlVTQiBkZXZpY2UgdmVuZG9yIik7CitYVVNCQVRNX1BBUk0ocHJvZHVjdCwgdW5zaWduZWQgc2hvcnQsIHVzaG9ydCwgIlVTQiBkZXZpY2UgcHJvZHVjdCIpOworCitYVVNCQVRNX1BBUk0ocnhfZW5kcG9pbnQsIHVuc2lnbmVkIGNoYXIsIGJ5dGUsICJyeCBlbmRwb2ludCBudW1iZXIiKTsKK1hVU0JBVE1fUEFSTSh0eF9lbmRwb2ludCwgdW5zaWduZWQgY2hhciwgYnl0ZSwgInR4IGVuZHBvaW50IG51bWJlciIpOworWFVTQkFUTV9QQVJNKHJ4X3BhZGRpbmcsIHVuc2lnbmVkIGNoYXIsIGJ5dGUsICJyeCBwYWRkaW5nIChkZWZhdWx0IDApIik7CitYVVNCQVRNX1BBUk0odHhfcGFkZGluZywgdW5zaWduZWQgY2hhciwgYnl0ZSwgInR4IHBhZGRpbmcgKGRlZmF1bHQgMCkiKTsKKworc3RhdGljIGNvbnN0IGNoYXIgeHVzYmF0bV9kcml2ZXJfbmFtZVtdID0gInh1c2JhdG0iOworCitzdGF0aWMgc3RydWN0IHVzYmF0bV9kcml2ZXIgeHVzYmF0bV9kcml2ZXJzW1hVU0JBVE1fRFJJVkVSU19NQVhdOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHh1c2JhdG1fdXNiX2lkc1tYVVNCQVRNX0RSSVZFUlNfTUFYICsgMV07CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgeHVzYmF0bV91c2JfZHJpdmVyOworCitzdGF0aWMgaW50IHVzYl9pbnRmX2hhc19lcChjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdTggZXApCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW50Zi0+bnVtX2FsdHNldHRpbmc7IGkrKykgeworCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBpbnRmLT5hbHRzZXR0aW5nOworCQlmb3IgKGogPSAwOyBqIDwgYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7IGorKykKKwkJCWlmICgoYWx0LT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spID09IGVwKQorCQkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4dXNiYXRtX2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAorCQkJaW50ICpuZWVkX2hlYXZ5X2luaXQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludCBkcnZfaXggPSBpZCAtIHh1c2JhdG1fdXNiX2lkczsKKwlpbnQgcnhfZXBfcHJlc2VudCA9IHVzYl9pbnRmX2hhc19lcChpbnRmLCByeF9lbmRwb2ludFtkcnZfaXhdKTsKKwlpbnQgdHhfZXBfcHJlc2VudCA9IHVzYl9pbnRmX2hhc19lcChpbnRmLCB0eF9lbmRwb2ludFtkcnZfaXhdKTsKKwl1OCBzZWFyY2hlZF9lcCA9IHJ4X2VwX3ByZXNlbnQgPyB0eF9lbmRwb2ludFtkcnZfaXhdIDogcnhfZW5kcG9pbnRbZHJ2X2l4XTsKKwlpbnQgaSwgcmV0OworCisJdXNiX2RiZyh1c2JhdG1faW5zdGFuY2UsICIlczogYmluZGluZyBkcml2ZXIgJWQ6IHZlbmRvciAlI3ggcHJvZHVjdCAlI3giCisJCSIgcng6IGVwICUjeCBwYWRkICVkIHR4OiBlcCAlI3ggcGFkZCAlZFxuIiwKKwkJX19mdW5jX18sIGRydl9peCwgdmVuZG9yW2Rydl9peF0sIHByb2R1Y3RbZHJ2X2l4XSwKKwkJcnhfZW5kcG9pbnRbZHJ2X2l4XSwgcnhfcGFkZGluZ1tkcnZfaXhdLAorCQl0eF9lbmRwb2ludFtkcnZfaXhdLCB0eF9wYWRkaW5nW2Rydl9peF0pOworCisJaWYgKCFyeF9lcF9wcmVzZW50ICYmICF0eF9lcF9wcmVzZW50KSB7CisJCXVzYl9kYmcodXNiYXRtX2luc3RhbmNlLCAiJXM6IGludGYgIyVkIGhhcyBuZWl0aGVyIHJ4ICglI3gpIG5vciB0eCAoJSN4KSBlbmRwb2ludFxuIiwKKwkJCV9fZnVuY19fLCBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQlyeF9lbmRwb2ludFtkcnZfaXhdLCB0eF9lbmRwb2ludFtkcnZfaXhdKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHJ4X2VwX3ByZXNlbnQgJiYgdHhfZXBfcHJlc2VudCkKKwkJcmV0dXJuIDA7CisKKwlmb3IoaSA9IDA7IGkgPCB1c2JfZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY3VyX2lmID0gdXNiX2Rldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CisKKwkJaWYgKGN1cl9pZiAhPSBpbnRmICYmIHVzYl9pbnRmX2hhc19lcChjdXJfaWYsIHNlYXJjaGVkX2VwKSkgeworCQkJcmV0ID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoJnh1c2JhdG1fdXNiX2RyaXZlciwKKwkJCQkJCQkgY3VyX2lmLCB1c2JhdG1faW5zdGFuY2UpOworCQkJaWYgKCFyZXQpCisJCQkJdXNiX2Vycih1c2JhdG1faW5zdGFuY2UsICIlczogZmFpbGVkIHRvIGNsYWltIGludGVyZmFjZSAjJWQgKCVkKVxuIiwKKwkJCQkJX19mdW5jX18sIGN1cl9pZi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXVzYl9lcnIodXNiYXRtX2luc3RhbmNlLCAiJXM6IG5vIGludGVyZmFjZSBoYXMgZW5kcG9pbnQgJSN4XG4iLAorCQlfX2Z1bmNfXywgc2VhcmNoZWRfZXApOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCB4dXNiYXRtX3VuYmluZChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bV9pbnN0YW5jZSwKKwkJCSAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgaTsKKwl1c2JfZGJnKHVzYmF0bV9pbnN0YW5jZSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCWZvcihpID0gMDsgaSA8IHVzYl9kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpjdXJfaWYgPSB1c2JfZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKKwkJdXNiX3NldF9pbnRmZGF0YShjdXJfaWYsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKCZ4dXNiYXRtX3VzYl9kcml2ZXIsIGN1cl9pZik7CisJfQorfQorCitzdGF0aWMgaW50IHh1c2JhdG1fYXRtX3N0YXJ0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQkJICAgICBzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKK3sKKwlhdG1fZGJnKHVzYmF0bV9pbnN0YW5jZSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCS8qIHVzZSByYW5kb20gTUFDIGFzIHdlJ3ZlIG5vIHdheSB0byBnZXQgaXQgZnJvbSB0aGUgZGV2aWNlICovCisJcmFuZG9tX2V0aGVyX2FkZHIoYXRtX2Rldi0+ZXNpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeHVzYmF0bV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gdXNiYXRtX3VzYl9wcm9iZShpbnRmLCBpZCwKKwkJCQl4dXNiYXRtX2RyaXZlcnMgKyAoaWQgLSB4dXNiYXRtX3VzYl9pZHMpKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHh1c2JhdG1fdXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0geHVzYmF0bV9kcml2ZXJfbmFtZSwKKwkucHJvYmUJCT0geHVzYmF0bV91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0geHVzYmF0bV91c2JfaWRzCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4dXNiYXRtX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWRiZygieHVzYmF0bV9pbml0Iik7CisKKwlpZiAoIW51bV92ZW5kb3IgfHwKKwkgICAgbnVtX3ZlbmRvciAhPSBudW1fcHJvZHVjdCB8fAorCSAgICBudW1fdmVuZG9yICE9IG51bV9yeF9lbmRwb2ludCB8fAorCSAgICBudW1fdmVuZG9yICE9IG51bV90eF9lbmRwb2ludCkgeworCQl3YXJuKCJtYWxmb3JtZWQgbW9kdWxlIHBhcmFtZXRlcnMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV92ZW5kb3I7IGkrKykgeworCQl4dXNiYXRtX3VzYl9pZHNbaV0ubWF0Y2hfZmxhZ3MJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKKwkJeHVzYmF0bV91c2JfaWRzW2ldLmlkVmVuZG9yCT0gdmVuZG9yW2ldOworCQl4dXNiYXRtX3VzYl9pZHNbaV0uaWRQcm9kdWN0CT0gcHJvZHVjdFtpXTsKKworCisJCXh1c2JhdG1fZHJpdmVyc1tpXS5vd25lcgk9IFRISVNfTU9EVUxFOworCQl4dXNiYXRtX2RyaXZlcnNbaV0uZHJpdmVyX25hbWUJPSB4dXNiYXRtX2RyaXZlcl9uYW1lOworCQl4dXNiYXRtX2RyaXZlcnNbaV0uYmluZAkJPSB4dXNiYXRtX2JpbmQ7CisJCXh1c2JhdG1fZHJpdmVyc1tpXS51bmJpbmQJPSB4dXNiYXRtX3VuYmluZDsKKwkJeHVzYmF0bV9kcml2ZXJzW2ldLmF0bV9zdGFydAk9IHh1c2JhdG1fYXRtX3N0YXJ0OworCQl4dXNiYXRtX2RyaXZlcnNbaV0uaW4JCT0gcnhfZW5kcG9pbnRbaV07CisJCXh1c2JhdG1fZHJpdmVyc1tpXS5vdXQJCT0gdHhfZW5kcG9pbnRbaV07CisJCXh1c2JhdG1fZHJpdmVyc1tpXS5yeF9wYWRkaW5nCT0gcnhfcGFkZGluZ1tpXTsKKwkJeHVzYmF0bV9kcml2ZXJzW2ldLnR4X3BhZGRpbmcJPSB0eF9wYWRkaW5nW2ldOworCX0KKworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnh1c2JhdG1fdXNiX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh4dXNiYXRtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgeHVzYmF0bV9leGl0KHZvaWQpCit7CisJZGJnKCJ4dXNiYXRtX2V4aXQgZW50ZXJlZCIpOworCisJdXNiX2RlcmVnaXN0ZXIoJnh1c2JhdG1fdXNiX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh4dXNiYXRtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSb21hbiBLYWdhbiwgRHVuY2FuIFNhbmRzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgVVNCIEFEU0wgbW9kZW1zIGluaXRpYWxpemVkIGluIHVzZXJzcGFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDZkMWY5YjYuLmFkZmY1YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTEwNiw2ICsxMDYsMTExIEBACiAJYWNtX2N0cmxfbXNnKGFjbSwgVVNCX0NEQ19SRVFfU0VORF9CUkVBSywgbXMsIE5VTEwsIDApCiAKIC8qCisgKiBXcml0ZSBidWZmZXIgbWFuYWdlbWVudC4KKyAqIEFsbCBvZiB0aGVzZSBhc3N1bWUgcHJvcGVyIGxvY2tzIHRha2VuIGJ5IHRoZSBjYWxsZXIuCisgKi8KKworc3RhdGljIGludCBhY21fd2JfYWxsb2Moc3RydWN0IGFjbSAqYWNtKQoreworCWludCBpLCB3Ym47CisJc3RydWN0IGFjbV93YiAqd2I7CisKKwl3Ym4gPSBhY20tPndyaXRlX2N1cnJlbnQ7CisJaSA9IDA7CisJZm9yICg7OykgeworCQl3YiA9ICZhY20tPndiW3dibl07CisJCWlmICghd2ItPnVzZSkgeworCQkJd2ItPnVzZSA9IDE7CisJCQlyZXR1cm4gd2JuOworCQl9CisJCXdibiA9ICh3Ym4gKyAxKSAlIEFDTV9OV0I7CisJCWlmICgrK2kgPj0gQUNNX05XQikKKwkJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjbV93Yl9mcmVlKHN0cnVjdCBhY20gKmFjbSwgaW50IHdibikKK3sKKwlhY20tPndiW3dibl0udXNlID0gMDsKK30KKworc3RhdGljIGludCBhY21fd2JfaXNfYXZhaWwoc3RydWN0IGFjbSAqYWNtKQoreworCWludCBpLCBuOworCisJbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFDTV9OV0I7IGkrKykgeworCQlpZiAoIWFjbS0+d2JbaV0udXNlKQorCQkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWNtX3diX2lzX3VzZWQoc3RydWN0IGFjbSAqYWNtLCBpbnQgd2JuKQoreworCXJldHVybiBhY20tPndiW3dibl0udXNlOworfQorCisvKgorICogRmluaXNoIHdyaXRlLgorICovCitzdGF0aWMgdm9pZCBhY21fd3JpdGVfZG9uZShzdHJ1Y3QgYWNtICphY20pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2JuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWFjbS0+d3JpdGVfcmVhZHkgPSAxOworCXdibiA9IGFjbS0+d3JpdGVfY3VycmVudDsKKwlhY21fd2JfZnJlZShhY20sIHdibik7CisJYWNtLT53cml0ZV9jdXJyZW50ID0gKHdibiArIDEpICUgQUNNX05XQjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBva2Ugd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgYWNtX3dyaXRlX3N0YXJ0KHN0cnVjdCBhY20gKmFjbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3Ym47CisJc3RydWN0IGFjbV93YiAqd2I7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWlmICghYWNtLT5kZXYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghYWNtLT53cml0ZV9yZWFkeSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CS8qIEEgd2hpdGUgbGllICovCisJfQorCisJd2JuID0gYWNtLT53cml0ZV9jdXJyZW50OworCWlmICghYWNtX3diX2lzX3VzZWQoYWNtLCB3Ym4pKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJd2IgPSAmYWNtLT53Ylt3Ym5dOworCisJYWNtLT53cml0ZV9yZWFkeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9idWZmZXIgPSB3Yi0+YnVmOworCWFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2RtYSA9IHdiLT5kbWFoOworCWFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB3Yi0+bGVuOworCWFjbS0+d3JpdGV1cmItPmRldiA9IGFjbS0+ZGV2OworCisJaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKGFjbS0+d3JpdGV1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKKwkJZGJnKCJ1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQ6ICVkIiwgcmMpOworCQlhY21fd3JpdGVfZG9uZShhY20pOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHZhcmlvdXMgQUNNIGRldmljZSByZXNwb25zZXMKICAqLwogCkBAIC0yMzcsMTcgKzM0MiwxMyBAQAogc3RhdGljIHZvaWQgYWNtX3dyaXRlX2J1bGsoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSAoc3RydWN0IGFjbSAqKXVyYi0+Y29udGV4dDsKKwogCWRiZygiRW50ZXJpbmcgYWNtX3dyaXRlX2J1bGsgd2l0aCBzdGF0dXMgJWRcbiIsIHVyYi0+c3RhdHVzKTsKIAotCWlmICghQUNNX1JFQURZKGFjbSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHVyYi0+c3RhdHVzKQotCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOwotCi0Jc2NoZWR1bGVfd29yaygmYWNtLT53b3JrKTsKLW91dDoKLQlhY20tPnJlYWR5X2Zvcl93cml0ZSA9IDE7CisJYWNtX3dyaXRlX2RvbmUoYWNtKTsKKwlhY21fd3JpdGVfc3RhcnQoYWNtKTsKKwlpZiAoQUNNX1JFQURZKGFjbSkpCisJCXNjaGVkdWxlX3dvcmsoJmFjbS0+d29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGFjbV9zb2Z0aW50KHZvaWQgKnByaXZhdGUpCkBAIC0zMjEsNiArNDIyLDE3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKK3N0YXRpYyB2b2lkIGFjbV90dHlfdW5yZWdpc3RlcihzdHJ1Y3QgYWNtICphY20pCit7CisJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBhY20tPm1pbm9yKTsKKwl1c2JfcHV0X2ludGYoYWNtLT5jb250cm9sKTsKKwlhY21fdGFibGVbYWNtLT5taW5vcl0gPSBOVUxMOworCXVzYl9mcmVlX3VyYihhY20tPmN0cmx1cmIpOworCXVzYl9mcmVlX3VyYihhY20tPnJlYWR1cmIpOworCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKKwlrZnJlZShhY20pOworfQorCiBzdGF0aWMgdm9pZCBhY21fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CkBAIC0zMzUsMTQgKzQ0Nyw4IEBACiAJCQl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKIAkJCXVzYl9raWxsX3VyYihhY20tPndyaXRldXJiKTsKIAkJCXVzYl9raWxsX3VyYihhY20tPnJlYWR1cmIpOwotCQl9IGVsc2UgewotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBhY20tPm1pbm9yKTsKLQkJCWFjbV90YWJsZVthY20tPm1pbm9yXSA9IE5VTEw7Ci0JCQl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKLQkJCXVzYl9mcmVlX3VyYihhY20tPnJlYWR1cmIpOwotCQkJdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOwotCQkJa2ZyZWUoYWNtKTsKLQkJfQorCQl9IGVsc2UKKwkJCWFjbV90dHlfdW5yZWdpc3RlcihhY20pOwogCX0KIAl1cCgmb3Blbl9zZW0pOwogfQpAQCAtMzUxLDMyICs0NTcsMzMgQEAKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCBzdGF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdibjsKKwlzdHJ1Y3QgYWNtX3diICp3YjsKKwogCWRiZygiRW50ZXJpbmcgYWNtX3R0eV93cml0ZSB0byB3cml0ZSAlZCBieXRlcyxcbiIsIGNvdW50KTsKIAogCWlmICghQUNNX1JFQURZKGFjbSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghYWNtLT5yZWFkeV9mb3Jfd3JpdGUpCi0JCXJldHVybiAwOwogCWlmICghY291bnQpCiAJCXJldHVybiAwOwogCi0JY291bnQgPSAoY291bnQgPiBhY20tPndyaXRlc2l6ZSkgPyBhY20tPndyaXRlc2l6ZSA6IGNvdW50OwotCi0JZGJnKCJHZXQgJWQgYnl0ZXMuLi4iLCBjb3VudCk7Ci0JbWVtY3B5KGFjbS0+d3JpdGVfYnVmZmVyLCBidWYsIGNvdW50KTsKLQlkYmcoIiAgU3VjY2Vzc2Z1bGx5IGNvcGllZC5cbiIpOwotCi0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGNvdW50OwotCWFjbS0+d3JpdGV1cmItPmRldiA9IGFjbS0+ZGV2OwotCi0JYWNtLT5yZWFkeV9mb3Jfd3JpdGUgPSAwOwotCXN0YXQgPSB1c2Jfc3VibWl0X3VyYihhY20tPndyaXRldXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAoc3RhdCA8IDApIHsKLQkJZGJnKCJ1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQiKTsKLQkJYWNtLT5yZWFkeV9mb3Jfd3JpdGUgPSAxOwotCQlyZXR1cm4gc3RhdDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CisJaWYgKCh3Ym4gPSBhY21fd2JfYWxsb2MoYWNtKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQlhY21fd3JpdGVfc3RhcnQoYWNtKTsKKwkJcmV0dXJuIDA7CiAJfQorCXdiID0gJmFjbS0+d2Jbd2JuXTsKIAorCWNvdW50ID0gKGNvdW50ID4gYWNtLT53cml0ZXNpemUpID8gYWNtLT53cml0ZXNpemUgOiBjb3VudDsKKwlkYmcoIkdldCAlZCBieXRlcy4uLiIsIGNvdW50KTsKKwltZW1jcHkod2ItPmJ1ZiwgYnVmLCBjb3VudCk7CisJd2ItPmxlbiA9IGNvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKChzdGF0ID0gYWNtX3dyaXRlX3N0YXJ0KGFjbSkpIDwgMCkKKwkJcmV0dXJuIHN0YXQ7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0zODUsNyArNDkyLDExIEBACiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAoIUFDTV9SRUFEWShhY20pKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gIWFjbS0+cmVhZHlfZm9yX3dyaXRlID8gMCA6IGFjbS0+d3JpdGVzaXplOworCS8qCisJICogRG8gbm90IGxldCB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGtub3cgdGhhdCB3ZSBoYXZlIGEgcmVzZXJ2ZSwKKwkgKiBvciBpdCBtaWdodCBnZXQgdG9vIGVudGh1c2lhc3RpYy4KKwkgKi8KKwlyZXR1cm4gKGFjbS0+d3JpdGVfcmVhZHkgJiYgYWNtX3diX2lzX2F2YWlsKGFjbSkpID8gYWNtLT53cml0ZXNpemUgOiAwOwogfQogCiBzdGF0aWMgaW50IGFjbV90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC0zOTMsNyArNTA0LDEwIEBACiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAoIUFDTV9SRUFEWShhY20pKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gIWFjbS0+cmVhZHlfZm9yX3dyaXRlID8gYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA6IDA7CisJLyoKKwkgKiBUaGlzIGlzIGluYWNjdXJhdGUgKG92ZXJjb3VudHMpLCBidXQgaXQgd29ya3MuCisJICovCisJcmV0dXJuIChBQ01fTldCIC0gYWNtX3diX2lzX2F2YWlsKGFjbSkpICogYWNtLT53cml0ZXNpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGFjbV90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTUyNiw2ICs2NDAsMzkgQEAKICAqIFVTQiBwcm9iZSBhbmQgZGlzY29ubmVjdCByb3V0aW5lcy4KICAqLwogCisvKiBMaXR0bGUgaGVscGVyOiB3cml0ZSBidWZmZXJzIGZyZWUgKi8KK3N0YXRpYyB2b2lkIGFjbV93cml0ZV9idWZmZXJzX2ZyZWUoc3RydWN0IGFjbSAqYWNtKQoreworCWludCBpOworCXN0cnVjdCBhY21fd2IgKndiOworCisJZm9yICh3YiA9ICZhY20tPndiWzBdLCBpID0gMDsgaSA8IEFDTV9OV0I7IGkrKywgd2IrKykgeworCQl1c2JfYnVmZmVyX2ZyZWUoYWNtLT5kZXYsIGFjbS0+d3JpdGVzaXplLCB3Yi0+YnVmLCB3Yi0+ZG1haCk7CisJfQorfQorCisvKiBMaXR0bGUgaGVscGVyOiB3cml0ZSBidWZmZXJzIGFsbG9jYXRlICovCitzdGF0aWMgaW50IGFjbV93cml0ZV9idWZmZXJzX2FsbG9jKHN0cnVjdCBhY20gKmFjbSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWNtX3diICp3YjsKKworCWZvciAod2IgPSAmYWNtLT53YlswXSwgaSA9IDA7IGkgPCBBQ01fTldCOyBpKyssIHdiKyspIHsKKwkJd2ItPmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoYWNtLT5kZXYsIGFjbS0+d3JpdGVzaXplLCBHRlBfS0VSTkVMLAorCQkgICAgJndiLT5kbWFoKTsKKwkJaWYgKCF3Yi0+YnVmKSB7CisJCQl3aGlsZSAoaSAhPSAwKSB7CisJCQkJLS1pOworCQkJCS0td2I7CisJCQkJdXNiX2J1ZmZlcl9mcmVlKGFjbS0+ZGV2LCBhY20tPndyaXRlc2l6ZSwKKwkJCQkgICAgd2ItPmJ1Ziwgd2ItPmRtYWgpOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYWNtX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtNzAwLDcgKzg0Nyw4IEBACiAJYWNtLT5iaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFjbTsKIAlJTklUX1dPUksoJmFjbS0+d29yaywgYWNtX3NvZnRpbnQsIGFjbSk7CiAJc3Bpbl9sb2NrX2luaXQoJmFjbS0+dGhyb3R0bGVfbG9jayk7Ci0JYWNtLT5yZWFkeV9mb3Jfd3JpdGUgPSAxOworCXNwaW5fbG9ja19pbml0KCZhY20tPndyaXRlX2xvY2spOworCWFjbS0+d3JpdGVfcmVhZHkgPSAxOwogCiAJYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1c2JfZGV2LCBjdHJsc2l6ZSwgR0ZQX0tFUk5FTCwgJmFjbS0+Y3RybF9kbWEpOwogCWlmICghYnVmKSB7CkBAIC03MTYsMTIgKzg2NCwxMCBAQAogCX0KIAlhY20tPnJlYWRfYnVmZmVyID0gYnVmOwogCi0JYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1c2JfZGV2LCBhY20tPndyaXRlc2l6ZSwgR0ZQX0tFUk5FTCwgJmFjbS0+d3JpdGVfZG1hKTsKLQlpZiAoIWJ1ZikgeworCWlmIChhY21fd3JpdGVfYnVmZmVyc19hbGxvYyhhY20pIDwgMCkgewogCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5ICh3cml0ZSBidWZmZXIgYWxsb2MpXG4iKTsKIAkJZ290byBhbGxvY19mYWlsNDsKIAl9Ci0JYWNtLT53cml0ZV9idWZmZXIgPSBidWY7CQogCiAJYWNtLT5jdHJsdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFjbS0+Y3RybHVyYikgewpAQCAtNzUwLDkgKzg5Niw5IEBACiAJYWNtLT5yZWFkdXJiLT50cmFuc2Zlcl9kbWEgPSBhY20tPnJlYWRfZG1hOwogCiAJdXNiX2ZpbGxfYnVsa191cmIoYWNtLT53cml0ZXVyYiwgdXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIGVwd3JpdGUtPmJFbmRwb2ludEFkZHJlc3MpLAotCQkJICBhY20tPndyaXRlX2J1ZmZlciwgYWNtLT53cml0ZXNpemUsIGFjbV93cml0ZV9idWxrLCBhY20pOworCQkJICBOVUxMLCBhY20tPndyaXRlc2l6ZSwgYWNtX3dyaXRlX2J1bGssIGFjbSk7CiAJYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX0ZTQlIgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9kbWEgPSBhY20tPndyaXRlX2RtYTsKKwkvKiBhY20tPndyaXRldXJiLT50cmFuc2Zlcl9kbWEgPSAwOyAqLwogCiAJZGV2X2luZm8oJmludGYtPmRldiwgInR0eUFDTSVkOiBVU0IgQUNNIGRldmljZVxuIiwgbWlub3IpOwogCkBAIC03NjQsNyArOTEwLDggQEAKIAogCXVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZhY21fZHJpdmVyLCBkYXRhX2ludGVyZmFjZSwgYWNtKTsKIAotCXR0eV9yZWdpc3Rlcl9kZXZpY2UoYWNtX3R0eV9kcml2ZXIsIG1pbm9yLCAmaW50Zi0+ZGV2KTsKKwl1c2JfZ2V0X2ludGYoY29udHJvbF9pbnRlcmZhY2UpOworCXR0eV9yZWdpc3Rlcl9kZXZpY2UoYWNtX3R0eV9kcml2ZXIsIG1pbm9yLCAmY29udHJvbF9pbnRlcmZhY2UtPmRldik7CiAKIAlhY21fdGFibGVbbWlub3JdID0gYWNtOwogCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIGFjbSk7CkBAIC03NzUsNyArOTIyLDcgQEAKIGFsbG9jX2ZhaWw2OgogCXVzYl9mcmVlX3VyYihhY20tPmN0cmx1cmIpOwogYWxsb2NfZmFpbDU6Ci0JdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+d3JpdGVzaXplLCBhY20tPndyaXRlX2J1ZmZlciwgYWNtLT53cml0ZV9kbWEpOworCWFjbV93cml0ZV9idWZmZXJzX2ZyZWUoYWNtKTsKIGFsbG9jX2ZhaWw0OgogCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCByZWFkc2l6ZSwgYWNtLT5yZWFkX2J1ZmZlciwgYWNtLT5yZWFkX2RtYSk7CiBhbGxvY19mYWlsMzoKQEAgLTgwNiwxOSArOTUzLDE0IEBACiAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOyAvKiB3YWl0IGZvciBhY21fc29mdGludCAqLwogCi0JdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+d3JpdGVzaXplLCBhY20tPndyaXRlX2J1ZmZlciwgYWNtLT53cml0ZV9kbWEpOworCWFjbV93cml0ZV9idWZmZXJzX2ZyZWUoYWNtKTsKIAl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgYWNtLT5yZWFkc2l6ZSwgYWNtLT5yZWFkX2J1ZmZlciwgYWNtLT5yZWFkX2RtYSk7CiAJdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+Y3RybHNpemUsIGFjbS0+Y3RybF9idWZmZXIsIGFjbS0+Y3RybF9kbWEpOwogCiAJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmYWNtX2RyaXZlciwgYWNtLT5kYXRhKTsKIAogCWlmICghYWNtLT51c2VkKSB7Ci0JCXR0eV91bnJlZ2lzdGVyX2RldmljZShhY21fdHR5X2RyaXZlciwgYWNtLT5taW5vcik7Ci0JCWFjbV90YWJsZVthY20tPm1pbm9yXSA9IE5VTEw7Ci0JCXVzYl9mcmVlX3VyYihhY20tPmN0cmx1cmIpOwotCQl1c2JfZnJlZV91cmIoYWNtLT5yZWFkdXJiKTsKLQkJdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOwotCQlrZnJlZShhY20pOworCQlhY21fdHR5X3VucmVnaXN0ZXIoYWNtKTsKIAkJdXAoJm9wZW5fc2VtKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaCBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAppbmRleCA5MDA5MTE0Li45NjNhNWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCkBAIC01MSwxNCArNTEsMzQgQEAKICAqIEludGVybmFsIGRyaXZlciBzdHJ1Y3R1cmVzLgogICovCiAKKy8qCisgKiBUaGUgb25seSByZWFzb24gdG8gaGF2ZSBzZXZlcmFsIGJ1ZmZlcnMgaXMgdG8gYWNjb21vZGF0ZSBhc3N1bXB0aW9ucworICogaW4gbGluZSBkaXNjaXBsaW5lcy4gVGhleSBhc2sgZm9yIGVtcHR5IHNwYWNlIGFtb3VudCwgcmVjZWl2ZSBvdXIgVVJCIHNpemUsCisgKiBhbmQgcHJvY2VlZCB0byBpc3N1ZSBzZXZlcmFsIDEtY2hhcmFjdGVyIHdyaXRlcywgYXNzdW1pbmcgdGhleSB3aWxsIGZpdC4KKyAqIFRoZSB2ZXJ5IGZpcnN0IHdyaXRlIHRha2VzIGEgY29tcGxldGUgVVJCLiBGb3J0dW5hdGVseSwgdGhpcyBvbmx5IGhhcHBlbnMKKyAqIHdoZW4gcHJvY2Vzc2luZyBvbmxjciwgc28gd2Ugb25seSBuZWVkIDIgYnVmZmVycy4KKyAqLworI2RlZmluZSBBQ01fTldCICAyCitzdHJ1Y3QgYWNtX3diIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJZG1hX2FkZHJfdCBkbWFoOworCWludCBsZW47CisJaW50IHVzZTsKK307CisKIHN0cnVjdCBhY20gewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CQkJCS8qIHRoZSBjb3JyZXNwb25kaW5nIHVzYiBkZXZpY2UgKi8KIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY29udHJvbDsJCQkvKiBjb250cm9sIGludGVyZmFjZSAqLwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpkYXRhOwkJCS8qIGRhdGEgaW50ZXJmYWNlICovCiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsJCQkJLyogdGhlIGNvcnJlc3BvbmRpbmcgdHR5ICovCiAJc3RydWN0IHVyYiAqY3RybHVyYiwgKnJlYWR1cmIsICp3cml0ZXVyYjsJLyogdXJicyAqLwotCXU4ICpjdHJsX2J1ZmZlciwgKnJlYWRfYnVmZmVyLCAqd3JpdGVfYnVmZmVyOwkvKiBidWZmZXJzIG9mIHVyYnMgKi8KLQlkbWFfYWRkcl90IGN0cmxfZG1hLCByZWFkX2RtYSwgd3JpdGVfZG1hOwkvKiBkbWEgaGFuZGxlcyBvZiBidWZmZXJzICovCisJdTggKmN0cmxfYnVmZmVyLCAqcmVhZF9idWZmZXI7CQkJLyogYnVmZmVycyBvZiB1cmJzICovCisJZG1hX2FkZHJfdCBjdHJsX2RtYSwgcmVhZF9kbWE7CQkJLyogZG1hIGhhbmRsZXMgb2YgYnVmZmVycyAqLworCXN0cnVjdCBhY21fd2Igd2JbQUNNX05XQl07CisJaW50IHdyaXRlX2N1cnJlbnQ7CQkJCS8qIGN1cnJlbnQgd3JpdGUgYnVmZmVyICovCisJaW50IHdyaXRlX3VzZWQ7CQkJCQkvKiBudW1iZXIgb2Ygbm9uLWVtcHR5IHdyaXRlIGJ1ZmZlcnMgKi8KKwlpbnQgd3JpdGVfcmVhZHk7CQkJCS8qIHdyaXRlIHVyYiBpcyBub3QgcnVubmluZyAqLworCXNwaW5sb2NrX3Qgd3JpdGVfbG9jazsKIAlzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyBsaW5lOwkJLyogYml0cywgc3RvcCwgcGFyaXR5ICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CQkJLyogd29yayBxdWV1ZSBlbnRyeSBmb3IgbGluZSBkaXNjaXBsaW5lIHdha2luZyB1cCAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBiaDsJCQkvKiByeCBwcm9jZXNzaW5nICovCkBAIC03MSw3ICs5MSw2IEBACiAJdW5zaWduZWQgaW50IG1pbm9yOwkJCQkvKiBhY20gbWlub3IgbnVtYmVyICovCiAJdW5zaWduZWQgY2hhciB0aHJvdHRsZTsJCQkJLyogdGhyb3R0bGVkIGJ5IHR0eSBsYXllciAqLwogCXVuc2lnbmVkIGNoYXIgY2xvY2FsOwkJCQkvKiB0ZXJtaW9zIENMT0NBTCAqLwotCXVuc2lnbmVkIGNoYXIgcmVhZHlfZm9yX3dyaXRlOwkJCS8qIHdyaXRlIHVyYiBjYW4gYmUgdXNlZCAqLwogCXVuc2lnbmVkIGNoYXIgcmVzdWJtaXRfdG9fdW50aHJvdHRsZTsJCS8qIHRocm90dGVsaW5nIGhhcyBkaXNhYmxlZCB0aGUgcmVhZCB1cmIgKi8KIAl1bnNpZ25lZCBpbnQgY3RybF9jYXBzOwkJCQkvKiBjb250cm9sIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBjbGFzcyBzcGVjaWZpYyBoZWFkZXIgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwppbmRleCBiYmEyMmU5Li43Y2U0M2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKQEAgLTM3OSw2ICszNzksOCBAQAogCXVzYmxwLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CiAJdXNibHAtPndjb21wbGV0ZSA9IDE7IC8qIHdlIGJlZ2luIHdyaXRlYWJsZSAqLwogCXVzYmxwLT5yY29tcGxldGUgPSAwOworCXVzYmxwLT53cml0ZXVyYi0+c3RhdHVzID0gMDsKKwl1c2JscC0+cmVhZHVyYi0+c3RhdHVzID0gMDsKIAogCWlmICh1c2JscC0+YmlkaXIpIHsKIAkJdXNibHAtPnJlYWRjb3VudCA9IDA7CkBAIC03NTEsNiArNzUzLDcgQEAKIAkJCQlzY2hlZHVsZSgpOwogCQkJfSBlbHNlIHsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCWRvd24oJnVzYmxwLT5zZW0pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJZG93biAoJnVzYmxwLT5zZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMKaW5kZXggYjc4MjdkZi4uZmMxNWI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIHZvaWQgKmhjZF9idWZmZXJfYWxsb2MgKAogCXN0cnVjdCB1c2JfYnVzIAkJKmJ1cywKIAlzaXplX3QJCQlzaXplLAotCWludAkJCW1lbV9mbGFncywKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzLAogCWRtYV9hZGRyX3QJCSpkbWEKICkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCA2YmZhYjRiLi43ODdjMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC03ODQsMTYgKzc4NCwxNiBAQAogIAkJZm9yIChpID0gMDsgaSA8IGFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgKytpKSB7CiAgCQkJaWYgKHVzYl9pbnRlcmZhY2VfY2xhaW1lZChhY3Rjb25maWctPmludGVyZmFjZVtpXSkpIHsKIAkJCQlkZXZfd2FybiAoJnBzLT5kZXYtPmRldiwKLQkJCQkJInVzYmZzOiBpbnRlcmZhY2UgJWQgY2xhaW1lZCAiCisJCQkJCSJ1c2JmczogaW50ZXJmYWNlICVkIGNsYWltZWQgYnkgJXMgIgogCQkJCQkid2hpbGUgJyVzJyBzZXRzIGNvbmZpZyAjJWRcbiIsCiAJCQkJCWFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldCiAJCQkJCQktPmN1cl9hbHRzZXR0aW5nCiAJCQkJCQktPmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJCQkJYWN0Y29uZmlnLT5pbnRlcmZhY2VbaV0KKwkJCQkJCS0+ZGV2LmRyaXZlci0+bmFtZSwKIAkJCQkJY3VycmVudC0+Y29tbSwgdSk7Ci0jaWYgMAkvKiBGSVhNRTogIGVuYWJsZSBpbiAyLjYuMTAgb3Igc28gKi8KICAJCQkJc3RhdHVzID0gLUVCVVNZOwogCQkJCWJyZWFrOwotI2VuZGlmCiAJCQl9CiAgCQl9CiAgCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKaW5kZXggNzFiNGE4ZC4uZmMwNTYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKQEAgLTM4MCw2ICszODAsNyBAQAogCQl1c2JfaGNfZGllZCAoaGNkKTsKIAl9CiAKKwlwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfaGNkX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggMGRhMjM3My4uODYxNjM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC01MTksMTE5ICs1MTksMTIwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgotICogUm9vdCBIdWIgaW50ZXJydXB0IHRyYW5zZmVycyBhcmUgc3ludGhlc2l6ZWQgd2l0aCBhIHRpbWVyLgotICogQ29tcGxldGlvbnMgYXJlIGNhbGxlZCBpbl9pbnRlcnJ1cHQoKSBidXQgbm90IGluX2lycSgpLgorICogUm9vdCBIdWIgaW50ZXJydXB0IHRyYW5zZmVycyBhcmUgcG9sbGVkIHVzaW5nIGEgdGltZXIgaWYgdGhlCisgKiBkcml2ZXIgcmVxdWVzdHMgaXQ7IG90aGVyd2lzZSB0aGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY2FsbGluZyB1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKCkgd2hlbiBhbiBldmVudCBvY2N1cnMuCiAgKgotICogTm90ZTogc29tZSByb290IGh1YnMgKGluY2x1ZGluZyBjb21tb24gVUhDSSBiYXNlZCBkZXNpZ25zKSBjYW4ndAotICogY29ycmVjdGx5IGlzc3VlIHBvcnQgY2hhbmdlIElSUXMuICBUaGV5J3JlIHRoZSBvbmVzIHRoYXQgX25lZWRfIGEKLSAqIHRpbWVyOyBtb3N0IG90aGVyIHJvb3QgaHVicyBkb24ndC4gIFNvbWUgc3lzdGVtcyBjb3VsZCBzYXZlIGEKLSAqIGxvdCBvZiBiYXR0ZXJ5IHBvd2VyIGJ5IGVsaW1pbmF0aW5nIHRoZXNlIHJvb3QgaHViIHRpbWVyIElSUXMuCisgKiBDb21wbGV0aW9ucyBhcmUgY2FsbGVkIGluX2ludGVycnVwdCgpLCBidXQgdGhleSBtYXkgb3IgbWF5IG5vdAorICogYmUgaW5faXJxKCkuCiAgKi8KLQotc3RhdGljIHZvaWQgcmhfcmVwb3J0X3N0YXR1cyAodW5zaWduZWQgbG9uZyBwdHIpOwotCi1zdGF0aWMgaW50IHJoX3N0YXR1c191cmIgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikgCi17Ci0JaW50CWxlbiA9IDEgKyAodXJiLT5kZXYtPm1heGNoaWxkIC8gOCk7Ci0KLQkvKiByaF90aW1lciBwcm90ZWN0ZWQgYnkgaGNkX2RhdGFfbG9jayAqLwotCWlmIChoY2QtPnJoX3RpbWVyLmRhdGEgfHwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIDwgbGVuKSB7Ci0JCWRldl9kYmcgKGhjZC0+c2VsZi5jb250cm9sbGVyLAotCQkJCSJub3QgcXVldWluZyByaCBzdGF0dXMgdXJiLCBzdGF0ICVkXG4iLAotCQkJCXVyYi0+c3RhdHVzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW5pdF90aW1lciAoJmhjZC0+cmhfdGltZXIpOwotCWhjZC0+cmhfdGltZXIuZnVuY3Rpb24gPSByaF9yZXBvcnRfc3RhdHVzOwotCWhjZC0+cmhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB1cmI7Ci0JLyogVVNCIDIuMCBzcGVjIHNheXMgMjU2bXNlYzsgdGhpcyBpcyBjbG9zZSBlbm91Z2ggKi8KLQloY2QtPnJoX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovNDsKLQlhZGRfdGltZXIgKCZoY2QtPnJoX3RpbWVyKTsKLQl1cmItPmhjcHJpdiA9IGhjZDsJLyogbm9uemVybyB0byBpbmRpY2F0ZSBpdCdzIHF1ZXVlZCAqLwotCXJldHVybiAwOwotfQotCi0vKiB0aW1lciBjYWxsYmFjayAqLwotCi1zdGF0aWMgdm9pZCByaF9yZXBvcnRfc3RhdHVzICh1bnNpZ25lZCBsb25nIHB0cikKK3ZvaWQgdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1cmIJKnVyYjsKLQlzdHJ1Y3QgdXNiX2hjZAkqaGNkOwotCWludAkJbGVuZ3RoID0gMDsKKwlpbnQJCWxlbmd0aDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOworCWNoYXIJCWJ1ZmZlcls0XTsJLyogQW55IHJvb3QgaHVicyB3aXRoID4gMzEgcG9ydHM/ICovCiAKLQl1cmIgPSAoc3RydWN0IHVyYiAqKSBwdHI7Ci0JbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKLQlzcGluX2xvY2sgKCZ1cmItPmxvY2spOwotCi0JLyogZG8gbm90aGluZyBpZiB0aGUgdXJiJ3MgYmVlbiB1bmxpbmtlZCAqLwotCWlmICghdXJiLT5kZXYKLQkJCXx8IHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUwotCQkJfHwgKGhjZCA9IHVyYi0+ZGV2LT5idXMtPmhjcHJpdikgPT0gTlVMTCkgewotCQlzcGluX3VubG9jayAoJnVyYi0+bG9jayk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlIChmbGFncyk7CisJaWYgKCFoY2QtPnVzZXNfbmV3X3BvbGxpbmcgJiYgIWhjZC0+c3RhdHVzX3VyYikKIAkJcmV0dXJuOwotCX0KIAotCS8qIGNvbXBsZXRlIHRoZSBzdGF0dXMgdXJiLCBvciByZXRyaWdnZXIgdGhlIHRpbWVyICovCi0Jc3Bpbl9sb2NrICgmaGNkX2RhdGFfbG9jayk7Ci0JaWYgKHVyYi0+ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkgewotCQlsZW5ndGggPSBoY2QtPmRyaXZlci0+aHViX3N0YXR1c19kYXRhICgKLQkJCQkJaGNkLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQloY2QtPnJoX3RpbWVyLmRhdGEgPSAwOwotCQkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuZ3RoOwotCQkJdXJiLT5zdGF0dXMgPSAwOwotCQkJdXJiLT5oY3ByaXYgPSBOVUxMOworCWxlbmd0aCA9IGhjZC0+ZHJpdmVyLT5odWJfc3RhdHVzX2RhdGEoaGNkLCBidWZmZXIpOworCWlmIChsZW5ndGggPiAwKSB7CisKKwkJLyogdHJ5IHRvIGNvbXBsZXRlIHRoZSBzdGF0dXMgdXJiICovCisJCWxvY2FsX2lycV9zYXZlIChmbGFncyk7CisJCXNwaW5fbG9jaygmaGNkX3Jvb3RfaHViX2xvY2spOworCQl1cmIgPSBoY2QtPnN0YXR1c191cmI7CisJCWlmICh1cmIpIHsKKwkJCXNwaW5fbG9jaygmdXJiLT5sb2NrKTsKKwkJCWlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCQloY2QtPnBvbGxfcGVuZGluZyA9IDA7CisJCQkJaGNkLT5zdGF0dXNfdXJiID0gTlVMTDsKKwkJCQl1cmItPnN0YXR1cyA9IDA7CisJCQkJdXJiLT5oY3ByaXYgPSBOVUxMOworCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IGxlbmd0aDsKKwkJCQltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKwkJCX0gZWxzZQkJLyogdXJiIGhhcyBiZWVuIHVubGlua2VkICovCisJCQkJbGVuZ3RoID0gMDsKKwkJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOwogCQl9IGVsc2UKLQkJCW1vZF90aW1lciAoJmhjZC0+cmhfdGltZXIsIGppZmZpZXMgKyBIWi80KTsKLQl9Ci0Jc3Bpbl91bmxvY2sgKCZoY2RfZGF0YV9sb2NrKTsKLQlzcGluX3VubG9jayAoJnVyYi0+bG9jayk7CisJCQlsZW5ndGggPSAwOworCQlzcGluX3VubG9jaygmaGNkX3Jvb3RfaHViX2xvY2spOwogCi0JLyogbG9jYWwgaXJxcyBhcmUgYWx3YXlzIGJsb2NrZWQgaW4gY29tcGxldGlvbnMgKi8KLQlpZiAobGVuZ3RoID4gMCkKLQkJdXNiX2hjZF9naXZlYmFja191cmIgKGhjZCwgdXJiLCBOVUxMKTsKLQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworCQkvKiBsb2NhbCBpcnFzIGFyZSBhbHdheXMgYmxvY2tlZCBpbiBjb21wbGV0aW9ucyAqLworCQlpZiAobGVuZ3RoID4gMCkKKwkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChoY2QsIHVyYiwgTlVMTCk7CisJCWVsc2UKKwkJCWhjZC0+cG9sbF9wZW5kaW5nID0gMTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUgKGZsYWdzKTsKKwl9CisKKwkvKiBUaGUgVVNCIDIuMCBzcGVjIHNheXMgMjU2IG1zLiAgVGhpcyBpcyBjbG9zZSBlbm91Z2ggYW5kIHdvbid0CisJICogZXhjZWVkIHRoYXQgbGltaXQgaWYgSFogaXMgMTAwLiAqLworCWlmIChoY2QtPnVzZXNfbmV3X3BvbGxpbmcgPyBoY2QtPnBvbGxfcmggOgorCQkJKGxlbmd0aCA9PSAwICYmIGhjZC0+c3RhdHVzX3VyYiAhPSBOVUxMKSkKKwkJbW9kX3RpbWVyICgmaGNkLT5yaF90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKTsKKworLyogdGltZXIgY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIHJoX3RpbWVyX2Z1bmMgKHVuc2lnbmVkIGxvbmcgX2hjZCkKK3sKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKChzdHJ1Y3QgdXNiX2hjZCAqKSBfaGNkKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIGludCByaF9xdWV1ZV9zdGF0dXMgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQJCXJldHZhbDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJbGVuID0gMSArICh1cmItPmRldi0+bWF4Y2hpbGQgLyA4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmaGNkX3Jvb3RfaHViX2xvY2ssIGZsYWdzKTsKKwlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQkvKiBhbHJlYWR5IHVubGlua2VkICovCisJCXJldHZhbCA9IHVyYi0+c3RhdHVzOworCWVsc2UgaWYgKGhjZC0+c3RhdHVzX3VyYiB8fCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPCBsZW4pIHsKKwkJZGV2X2RiZyAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJub3QgcXVldWluZyByaCBzdGF0dXMgdXJiXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQloY2QtPnN0YXR1c191cmIgPSB1cmI7CisJCXVyYi0+aGNwcml2ID0gaGNkOwkvKiBpbmRpY2F0ZSBpdCdzIHF1ZXVlZCAqLworCisJCWlmICghaGNkLT51c2VzX25ld19wb2xsaW5nKQorCQkJbW9kX3RpbWVyICgmaGNkLT5yaF90aW1lciwgamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CisKKwkJLyogSWYgYSBzdGF0dXMgY2hhbmdlIGhhcyBhbHJlYWR5IG9jY3VycmVkLCByZXBvcnQgaXQgQVNBUCAqLworCQllbHNlIGlmIChoY2QtPnBvbGxfcGVuZGluZykKKwkJCW1vZF90aW1lciAoJmhjZC0+cmhfdGltZXIsIGppZmZpZXMpOworCQlyZXR2YWwgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaGNkX3Jvb3RfaHViX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCiBzdGF0aWMgaW50IHJoX3VyYl9lbnF1ZXVlIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaWYgKHVzYl9waXBlaW50ICh1cmItPnBpcGUpKSB7Ci0JCWludAkJcmV0dmFsOwotCQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlICgmaGNkX2RhdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR2YWwgPSByaF9zdGF0dXNfdXJiIChoY2QsIHVyYik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZoY2RfZGF0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQorCWlmICh1c2JfcGlwZWludCAodXJiLT5waXBlKSkKKwkJcmV0dXJuIHJoX3F1ZXVlX3N0YXR1cyAoaGNkLCB1cmIpOwogCWlmICh1c2JfcGlwZWNvbnRyb2wgKHVyYi0+cGlwZSkpCiAJCXJldHVybiByaF9jYWxsX2NvbnRyb2wgKGhjZCwgdXJiKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKiBBc3luY2hyb25vdXMgdW5saW5rcyBvZiByb290LWh1YiBjb250cm9sIFVSQnMgYXJlIGxlZ2FsLCBidXQgdGhleQorICogZG9uJ3QgZG8gYW55dGhpbmcuICBTdGF0dXMgVVJCIHVubGlua3MgbXVzdCBiZSBtYWRlIGluIHByb2Nlc3MgY29udGV4dAorICogd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisgKi8KIHN0YXRpYyBpbnQgdXNiX3JoX3VyYl9kZXF1ZXVlIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpZiAodXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpID09IDApIHsJLyogQ29udHJvbCBVUkIgKi8KKwkJaWYgKGluX2ludGVycnVwdCgpKQorCQkJcmV0dXJuIDA7CQkvKiBub3RoaW5nIHRvIGRvICovCiAKLQkvKiBub3RlOiAgYWx3YXlzIGEgc3luY2hyb25vdXMgdW5saW5rICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKSB1cmIgPT0gaGNkLT5yaF90aW1lci5kYXRhKSB7Ci0JCWRlbF90aW1lcl9zeW5jICgmaGNkLT5yaF90aW1lcik7Ci0JCWhjZC0+cmhfdGltZXIuZGF0YSA9IDA7Ci0KLQkJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKLQkJdXJiLT5oY3ByaXYgPSBOVUxMOwotCQl1c2JfaGNkX2dpdmViYWNrX3VyYiAoaGNkLCB1cmIsIE5VTEwpOwotCQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOwotCi0JfSBlbHNlIGlmICh1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkgPT0gMCkgewogCQlzcGluX2xvY2tfaXJxKCZ1cmItPmxvY2spOwkvKiBmcm9tIHVzYl9raWxsX3VyYiAqLwogCQkrK3VyYi0+cmVqZWN0OwogCQlzcGluX3VubG9ja19pcnEoJnVyYi0+bG9jayk7CkBAIC02NDIsOCArNjQzLDIyIEBACiAJCXNwaW5fbG9ja19pcnEoJnVyYi0+bG9jayk7CiAJCS0tdXJiLT5yZWplY3Q7CiAJCXNwaW5fdW5sb2NrX2lycSgmdXJiLT5sb2NrKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9IGVsc2UgewkJCQkvKiBTdGF0dXMgVVJCICovCisJCWlmICghaGNkLT51c2VzX25ld19wb2xsaW5nKQorCQkJZGVsX3RpbWVyX3N5bmMgKCZoY2QtPnJoX3RpbWVyKTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUgKCk7CisJCXNwaW5fbG9jayAoJmhjZF9yb290X2h1Yl9sb2NrKTsKKwkJaWYgKHVyYiA9PSBoY2QtPnN0YXR1c191cmIpIHsKKwkJCWhjZC0+c3RhdHVzX3VyYiA9IE5VTEw7CisJCQl1cmItPmhjcHJpdiA9IE5VTEw7CisJCX0gZWxzZQorCQkJdXJiID0gTlVMTDsJCS8qIHdhc24ndCBmdWxseSBxdWV1ZWQgKi8KKwkJc3Bpbl91bmxvY2sgKCZoY2Rfcm9vdF9odWJfbG9jayk7CisJCWlmICh1cmIpCisJCQl1c2JfaGNkX2dpdmViYWNrX3VyYiAoaGNkLCB1cmIsIE5VTEwpOworCQlsb2NhbF9pcnFfZW5hYmxlICgpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtODE3LDMwICs4MzIsMjIgQEAKIH0KIAogLyoqCi0gKiB1c2JfaGNkX3JlZ2lzdGVyX3Jvb3RfaHViIC0gY2FsbGVkIGJ5IEhDRCB0byByZWdpc3RlciBpdHMgcm9vdCBodWIgCisgKiByZWdpc3Rlcl9yb290X2h1YiAtIGNhbGxlZCBieSB1c2JfYWRkX2hjZCgpIHRvIHJlZ2lzdGVyIGEgcm9vdCBodWIKICAqIEB1c2JfZGV2OiB0aGUgdXNiIHJvb3QgaHViIGRldmljZSB0byBiZSByZWdpc3RlcmVkLgogICogQGhjZDogaG9zdCBjb250cm9sbGVyIGZvciB0aGlzIHJvb3QgaHViCiAgKgotICogVGhlIFVTQiBob3N0IGNvbnRyb2xsZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciB0aGUgcm9vdCBodWIKLSAqIHByb3Blcmx5IHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0uICBJdCBzZXRzIHVwIHRoZSBkZXZpY2UgcHJvcGVybHkgaW4KLSAqIHRoZSBkZXZpY2UgdHJlZSBhbmQgc3RvcmVzIHRoZSByb290X2h1YiBwb2ludGVyIGluIHRoZSBidXMgc3RydWN0dXJlLAotICogdGhlbiBjYWxscyB1c2JfbmV3X2RldmljZSgpIHRvIHJlZ2lzdGVyIHRoZSB1c2IgZGV2aWNlLiAgSXQgYWxzbwotICogYXNzaWducyB0aGUgcm9vdCBodWIncyBVU0IgYWRkcmVzcyAoYWx3YXlzIDEpLgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJvb3QgaHViIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0uICBJdCBzZXRzIHVwCisgKiB0aGUgZGV2aWNlIHByb3Blcmx5IGluIHRoZSBkZXZpY2UgdHJlZSBhbmQgc3RvcmVzIHRoZSByb290X2h1YiBwb2ludGVyCisgKiBpbiB0aGUgYnVzIHN0cnVjdHVyZSwgdGhlbiBjYWxscyB1c2JfbmV3X2RldmljZSgpIHRvIHJlZ2lzdGVyIHRoZSB1c2IKKyAqIGRldmljZS4gIEl0IGFsc28gYXNzaWducyB0aGUgcm9vdCBodWIncyBVU0IgYWRkcmVzcyAoYWx3YXlzIDEpLgogICovCi1pbnQgdXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1YiAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgaW50IHJlZ2lzdGVyX3Jvb3RfaHViIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2ID0gaGNkLT5zZWxmLmNvbnRyb2xsZXI7CiAJY29uc3QgaW50IGRldm51bSA9IDE7CiAJaW50IHJldHZhbDsKIAotCS8qIGhjZC0+ZHJpdmVyLT5zdGFydCgpIHJlcG9ydGVkIGNhbl93YWtldXAsIHByb2JhYmx5IHdpdGgKLQkgKiBhc3Npc3RhbmNlIGZyb20gYm9hcmQncyBib290IGZpcm13YXJlLgotCSAqIE5PVEU6ICBub3JtYWwgZGV2aWNlcyB3b24ndCBlbmFibGUgd2FrZXVwIGJ5IGRlZmF1bHQuCi0JICovCi0JaWYgKGhjZC0+Y2FuX3dha2V1cCkKLQkJZGV2X2RiZyAocGFyZW50X2RldiwgInN1cHBvcnRzIFVTQiByZW1vdGUgd2FrZXVwXG4iKTsKLQloY2QtPnJlbW90ZV93YWtldXAgPSBoY2QtPmNhbl93YWtldXA7Ci0KIAl1c2JfZGV2LT5kZXZudW0gPSBkZXZudW07CiAJdXNiX2Rldi0+YnVzLT5kZXZudW1fbmV4dCA9IGRldm51bSArIDE7CiAJbWVtc2V0ICgmdXNiX2Rldi0+YnVzLT5kZXZtYXAuZGV2aWNlbWFwLCAwLApAQCAtODgzLDcgKzg5MCwxNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIpOworCit2b2lkIHVzYl9lbmFibGVfcm9vdF9odWJfaXJxIChzdHJ1Y3QgdXNiX2J1cyAqYnVzKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisKKwloY2QgPSBjb250YWluZXJfb2YgKGJ1cywgc3RydWN0IHVzYl9oY2QsIHNlbGYpOworCWlmIChoY2QtPmRyaXZlci0+aHViX2lycV9lbmFibGUgJiYgIWhjZC0+cG9sbF9yaCAmJgorCQkJaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUKQorCQloY2QtPmRyaXZlci0+aHViX2lycV9lbmFibGUgKGhjZCk7Cit9CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEwOTYsNyArMTExMiw3IEBACiAgKiBleHBlY3RzIHVzYl9zdWJtaXRfdXJiKCkgdG8gaGF2ZSBzYW5pdHkgY2hlY2tlZCBhbmQgY29uZGl0aW9uZWQgYWxsCiAgKiBpbnB1dHMgaW4gdGhlIHVyYgogICovCi1zdGF0aWMgaW50IGhjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzdGF0aWMgaW50IGhjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQJCQlzdGF0dXM7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7CkBAIC0xMzQ4LDcgKzEzNjQsOCBAQAogCiAJaGNkID0gdWRldi0+YnVzLT5oY3ByaXY7CiAKLQlXQVJOX09OICghSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkgJiYgaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUKTsKKwlXQVJOX09OICghSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkgJiYgaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUICYmCisJCQl1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUgKCk7CiAKQEAgLTE2MTIsNiArMTYyOSw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmhjZF9yb290X2h1Yl9sb2NrLCBmbGFncyk7CiAJaWYgKGhjZC0+cmhfcmVnaXN0ZXJlZCkgeworCQloY2QtPnBvbGxfcmggPSAwOworCQlkZWxfdGltZXIoJmhjZC0+cmhfdGltZXIpOwogCiAJCS8qIG1ha2Uga2h1YmQgY2xlYW4gdXAgb2xkIHVyYnMgYW5kIGRldmljZXMgKi8KIAkJdXNiX3NldF9kZXZpY2Vfc3RhdGUgKGhjZC0+c2VsZi5yb290X2h1YiwKQEAgLTE2NjUsNiArMTY4NCw4IEBACiAJaGNkLT5zZWxmLmJ1c19uYW1lID0gYnVzX25hbWU7CiAKIAlpbml0X3RpbWVyKCZoY2QtPnJoX3RpbWVyKTsKKwloY2QtPnJoX3RpbWVyLmZ1bmN0aW9uID0gcmhfdGltZXJfZnVuYzsKKwloY2QtPnJoX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaGNkOwogCiAJaGNkLT5kcml2ZXIgPSBkcml2ZXI7CiAJaGNkLT5wcm9kdWN0X2Rlc2MgPSAoZHJpdmVyLT5wcm9kdWN0X2Rlc2MpID8gZHJpdmVyLT5wcm9kdWN0X2Rlc2MgOgpAQCAtMTY5NCw3ICsxNzE1LDggQEAKIGludCB1c2JfYWRkX2hjZChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAogCQl1bnNpZ25lZCBpbnQgaXJxbnVtLCB1bnNpZ25lZCBsb25nIGlycWZsYWdzKQogewotCWludAlyZXR2YWw7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXY7CiAKIAlkZXZfaW5mbyhoY2QtPnNlbGYuY29udHJvbGxlciwgIiVzXG4iLCBoY2QtPnByb2R1Y3RfZGVzYyk7CiAKQEAgLTE3MTAsNyArMTczMiw3IEBACiAJfQogCiAJaWYgKChyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfYnVzKCZoY2QtPnNlbGYpKSA8IDApCi0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfcmVnaXN0ZXJfYnVzOwogCiAJaWYgKGhjZC0+ZHJpdmVyLT5pcnEpIHsKIAkJY2hhcglidWZbOF0sICpidWZwID0gYnVmOwpAQCAtMTcyNyw3ICsxNzQ5LDcgQEAKIAkJCQloY2QtPmlycV9kZXNjciwgaGNkKSkgIT0gMCkgewogCQkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwKIAkJCQkJInJlcXVlc3QgaW50ZXJydXB0ICVzIGZhaWxlZFxuIiwgYnVmcCk7Ci0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKIAkJfQogCQloY2QtPmlycSA9IGlycW51bTsKIAkJZGV2X2luZm8oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJpcnEgJXMsICVzIDB4JTA4bGx4XG4iLCBidWZwLApAQCAtMTc0MywxOSArMTc2NSw1NSBAQAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWhjZC0+cnNyY19zdGFydCk7CiAJfQogCisJLyogQWxsb2NhdGUgdGhlIHJvb3QgaHViIGJlZm9yZSBjYWxsaW5nIGhjZC0+ZHJpdmVyLT5zdGFydCgpLAorCSAqIGJ1dCBkb24ndCByZWdpc3RlciBpdCB1bnRpbCBhZnRlcndhcmQgc28gdGhhdCB0aGUgaGFyZHdhcmUKKwkgKiBpcyBydW5uaW5nLgorCSAqLworCWlmICgocmhkZXYgPSB1c2JfYWxsb2NfZGV2KE5VTEwsICZoY2QtPnNlbGYsIDApKSA9PSBOVUxMKSB7CisJCWRldl9lcnIoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJ1bmFibGUgdG8gYWxsb2NhdGUgcm9vdCBodWJcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY2F0ZV9yb290X2h1YjsKKwl9CisJcmhkZXYtPnNwZWVkID0gKGhjZC0+ZHJpdmVyLT5mbGFncyAmIEhDRF9VU0IyKSA/IFVTQl9TUEVFRF9ISUdIIDoKKwkJCVVTQl9TUEVFRF9GVUxMOworCisJLyogQWx0aG91Z2ggaW4gcHJpbmNpcGxlIGhjZC0+ZHJpdmVyLT5zdGFydCgpIG1pZ2h0IG5lZWQgdG8gdXNlIHJoZGV2LAorCSAqIG5vbmUgb2YgdGhlIGN1cnJlbnQgZHJpdmVycyBkby4KKwkgKi8KIAlpZiAoKHJldHZhbCA9IGhjZC0+ZHJpdmVyLT5zdGFydChoY2QpKSA8IDApIHsKIAkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwgInN0YXJ0dXAgZXJyb3IgJWRcbiIsIHJldHZhbCk7Ci0JCWdvdG8gZXJyMzsKKwkJZ290byBlcnJfaGNkX2RyaXZlcl9zdGFydDsKIAl9CiAKKwkvKiBoY2QtPmRyaXZlci0+c3RhcnQoKSByZXBvcnRlZCBjYW5fd2FrZXVwLCBwcm9iYWJseSB3aXRoCisJICogYXNzaXN0YW5jZSBmcm9tIGJvYXJkJ3MgYm9vdCBmaXJtd2FyZS4KKwkgKiBOT1RFOiAgbm9ybWFsIGRldmljZXMgd29uJ3QgZW5hYmxlIHdha2V1cCBieSBkZWZhdWx0LgorCSAqLworCWlmIChoY2QtPmNhbl93YWtldXApCisJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJzdXBwb3J0cyBVU0IgcmVtb3RlIHdha2V1cFxuIik7CisJaGNkLT5yZW1vdGVfd2FrZXVwID0gaGNkLT5jYW5fd2FrZXVwOworCisJaWYgKChyZXR2YWwgPSByZWdpc3Rlcl9yb290X2h1YihyaGRldiwgaGNkKSkgIT0gMCkKKwkJZ290byBlcnJfcmVnaXN0ZXJfcm9vdF9odWI7CisKKwlpZiAoaGNkLT51c2VzX25ld19wb2xsaW5nICYmIGhjZC0+cG9sbF9yaCkKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOwogCXJldHVybiByZXR2YWw7CiAKLSBlcnIzOgorIGVycl9yZWdpc3Rlcl9yb290X2h1YjoKKwloY2QtPmRyaXZlci0+c3RvcChoY2QpOworCisgZXJyX2hjZF9kcml2ZXJfc3RhcnQ6CisJdXNiX3B1dF9kZXYocmhkZXYpOworCisgZXJyX2FsbG9jYXRlX3Jvb3RfaHViOgogCWlmIChoY2QtPmlycSA+PSAwKQogCQlmcmVlX2lycShpcnFudW0sIGhjZCk7Ci0gZXJyMjoKKworIGVycl9yZXF1ZXN0X2lycToKIAl1c2JfZGVyZWdpc3Rlcl9idXMoJmhjZC0+c2VsZik7Ci0gZXJyMToKKworIGVycl9yZWdpc3Rlcl9idXM6CiAJaGNkX2J1ZmZlcl9kZXN0cm95KGhjZCk7CiAJcmV0dXJuIHJldHZhbDsKIH0gCkBAIC0xNzgyLDYgKzE4NDAsOSBAQAogCXNwaW5fdW5sb2NrX2lycSAoJmhjZF9yb290X2h1Yl9sb2NrKTsKIAl1c2JfZGlzY29ubmVjdCgmaGNkLT5zZWxmLnJvb3RfaHViKTsKIAorCWhjZC0+cG9sbF9yaCA9IDA7CisJZGVsX3RpbWVyX3N5bmMoJmhjZC0+cmhfdGltZXIpOworCiAJaGNkLT5kcml2ZXItPnN0b3AoaGNkKTsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggMzI1YTUxNi4uNjdkYjRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC02NSw3ICs2NSw4IEBACiAJY29uc3QgY2hhcgkJKnByb2R1Y3RfZGVzYzsJLyogcHJvZHVjdC92ZW5kb3Igc3RyaW5nICovCiAJY2hhcgkJCWlycV9kZXNjclsyNF07CS8qIGRyaXZlciArIGJ1cyAjICovCiAKLQlzdHJ1Y3QgdGltZXJfbGlzdAlyaF90aW1lcjsJLyogZHJpdmVzIHJvb3QgaHViICovCisJc3RydWN0IHRpbWVyX2xpc3QJcmhfdGltZXI7CS8qIGRyaXZlcyByb290LWh1YiBwb2xsaW5nICovCisJc3RydWN0IHVyYgkJKnN0YXR1c191cmI7CS8qIHRoZSBjdXJyZW50IHN0YXR1cyB1cmIgKi8KIAogCS8qCiAJICogaGFyZHdhcmUgaW5mby9zdGF0ZQpAQCAtNzYsMTAgKzc3LDE3IEBACiAJdW5zaWduZWQJCXJlbW90ZV93YWtldXA6MTsvKiBzdyBzaG91bGQgdXNlIHdha2V1cD8gKi8KIAl1bnNpZ25lZAkJcmhfcmVnaXN0ZXJlZDoxOy8qIGlzIHJvb3QgaHViIHJlZ2lzdGVyZWQ/ICovCiAKKwkvKiBUaGUgbmV4dCBmbGFnIGlzIGEgc3RvcGdhcCwgdG8gYmUgcmVtb3ZlZCB3aGVuIGFsbCB0aGUgSENEcworCSAqIHN1cHBvcnQgdGhlIG5ldyByb290LWh1YiBwb2xsaW5nIG1lY2hhbmlzbS4gKi8KKwl1bnNpZ25lZAkJdXNlc19uZXdfcG9sbGluZzoxOworCXVuc2lnbmVkCQlwb2xsX3JoOjE7CS8qIHBvbGwgZm9yIHJoIHN0YXR1cz8gKi8KKwl1bnNpZ25lZAkJcG9sbF9wZW5kaW5nOjE7CS8qIHN0YXR1cyBoYXMgY2hhbmdlZD8gKi8KKwogCWludAkJCWlycTsJCS8qIGlycSBhbGxvY2F0ZWQgKi8KIAl2b2lkIF9faW9tZW0JCSpyZWdzOwkJLyogZGV2aWNlIG1lbW9yeS9pbyAqLwogCXU2NAkJCXJzcmNfc3RhcnQ7CS8qIG1lbW9yeS9pbyByZXNvdXJjZSBzdGFydCAqLwogCXU2NAkJCXJzcmNfbGVuOwkvKiBtZW1vcnkvaW8gcmVzb3VyY2UgbGVuZ3RoICovCisJdW5zaWduZWQJCXBvd2VyX2J1ZGdldDsJLyogaW4gbUEsIDAgPSBubyBsaW1pdCAqLwogCiAjZGVmaW5lIEhDRF9CVUZGRVJfUE9PTFMJNAogCXN0cnVjdCBkbWFfcG9vbAkJKnBvb2wgW0hDRF9CVUZGRVJfUE9PTFNdOwpAQCAtMTM0LDEyICsxNDIsMTIgQEAKIAogc3RydWN0IHVzYl9vcGVyYXRpb25zIHsKIAlpbnQgKCpnZXRfZnJhbWVfbnVtYmVyKSAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpOwotCWludCAoKnN1Ym1pdF91cmIpIChzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpOworCWludCAoKnN1Ym1pdF91cmIpIChzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncyk7CiAJaW50ICgqdW5saW5rX3VyYikgKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cyk7CiAKIAkvKiBhbGxvY2F0ZSBkbWEtY29uc2lzdGVudCBidWZmZXIgZm9yIFVSQl9ETUFfTk9NQVBQSU5HICovCiAJdm9pZCAqKCpidWZmZXJfYWxsb2MpKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAotCQkJaW50IG1lbV9mbGFncywKKwkJCXVuc2lnbmVkIG1lbV9mbGFncywKIAkJCWRtYV9hZGRyX3QgKmRtYSk7CiAJdm9pZCAoKmJ1ZmZlcl9mcmVlKShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKIAkJCXZvaWQgKmFkZHIsIGRtYV9hZGRyX3QgZG1hKTsKQEAgLTE5Miw3ICsyMDAsNyBAQAogCWludAkoKnVyYl9lbnF1ZXVlKSAoc3RydWN0IHVzYl9oY2QgKmhjZCwKIAkJCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAkJCQkJc3RydWN0IHVyYiAqdXJiLAotCQkJCQlpbnQgbWVtX2ZsYWdzKTsKKwkJCQkJdW5zaWduZWQgbWVtX2ZsYWdzKTsKIAlpbnQJKCp1cmJfZGVxdWV1ZSkgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYik7CiAKIAkvKiBodyBzeW5jaCwgZnJlZWluZyBlbmRwb2ludCByZXNvdXJjZXMgdGhhdCB1cmJfZGVxdWV1ZSBjYW4ndCAqLwpAQCAtMjA3LDYgKzIxNSw4IEBACiAJaW50CQkoKmh1Yl9zdXNwZW5kKShzdHJ1Y3QgdXNiX2hjZCAqKTsKIAlpbnQJCSgqaHViX3Jlc3VtZSkoc3RydWN0IHVzYl9oY2QgKik7CiAJaW50CQkoKnN0YXJ0X3BvcnRfcmVzZXQpKHN0cnVjdCB1c2JfaGNkICosIHVuc2lnbmVkIHBvcnRfbnVtKTsKKwl2b2lkCQkoKmh1Yl9pcnFfZW5hYmxlKShzdHJ1Y3QgdXNiX2hjZCAqKTsKKwkJLyogTmVlZGVkIG9ubHkgaWYgcG9ydC1jaGFuZ2UgSVJRcyBhcmUgbGV2ZWwtdHJpZ2dlcmVkICovCiB9OwogCiBleHRlcm4gdm9pZCB1c2JfaGNkX2dpdmViYWNrX3VyYiAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC0yMzcsMTMgKzI0NywxNSBAQAogdm9pZCBoY2RfYnVmZmVyX2Rlc3Ryb3kgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiB2b2lkICpoY2RfYnVmZmVyX2FsbG9jIChzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKLQlpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOworCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKIHZvaWQgaGNkX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKIAl2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7CiAKIC8qIGdlbmVyaWMgYnVzIGdsdWUsIG5lZWRlZCBmb3IgaG9zdCBjb250cm9sbGVycyB0aGF0IGRvbid0IHVzZSBQQ0kgKi8KIGV4dGVybiBpcnFyZXR1cm5fdCB1c2JfaGNkX2lycSAoaW50IGlycSwgdm9pZCAqX19oY2QsIHN0cnVjdCBwdF9yZWdzICpyKTsKKwogZXh0ZXJuIHZvaWQgdXNiX2hjX2RpZWQgKHN0cnVjdCB1c2JfaGNkICpoY2QpOworZXh0ZXJuIHZvaWQgdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzQxLDkgKzM1Myw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgdXNiX2J1cyAqdXNiX2FsbG9jX2J1cyAoc3RydWN0IHVzYl9vcGVyYXRpb25zICopOwogCi1leHRlcm4gaW50IHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAotCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKLQogZXh0ZXJuIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiBleHRlcm4gdm9pZCB1c2Jfc2V0X2RldmljZV9zdGF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKQEAgLTM2MCw2ICszNjksOCBAQAogZXh0ZXJuIHN0cnVjdCB1c2JfYnVzICp1c2JfYnVzX2dldCAoc3RydWN0IHVzYl9idXMgKmJ1cyk7CiBleHRlcm4gdm9pZCB1c2JfYnVzX3B1dCAoc3RydWN0IHVzYl9idXMgKmJ1cyk7CiAKK2V4dGVybiB2b2lkIHVzYl9lbmFibGVfcm9vdF9odWJfaXJxIChzdHJ1Y3QgdXNiX2J1cyAqYnVzKTsKKwogZXh0ZXJuIGludCB1c2JfZmluZF9pbnRlcmZhY2VfZHJpdmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCBhOGQ4NzlhLi5jM2U0NmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYmRldmljZV9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDcsOCArNDgsNyBAQAogLyogV2FrZXMgdXAga2h1YmQgKi8KIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChraHViZF93YWl0KTsKIAotc3RhdGljIHBpZF90IGtodWJkX3BpZCA9IDA7CQkJLyogUElEIG9mIGtodWJkICovCi1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGtodWJkX2V4aXRlZCk7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpraHViZF90YXNrOwogCiAvKiBjeWNsZSBsZWRzIG9uIGh1YnMgdGhhdCBhcmVuJ3QgYmxpbmtpbmcgZm9yIGF0dGVudGlvbiAqLwogc3RhdGljIGludCBibGlua2VubGlnaHRzID0gMDsKQEAgLTY0MywxNSArNjQzLDIxIEBACiAJCW1lc3NhZ2UgPSAiY2FuJ3QgZ2V0IGh1YiBzdGF0dXMiOwogCQlnb3RvIGZhaWw7CiAJfQotCWNwdV90b19sZTE2cygmaHVic3RhdHVzKTsKLQlpZiAoKGh1YnN0YXR1cyAmICgxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKSkgPT0gMCkgeworCWxlMTZfdG9fY3B1cygmaHVic3RhdHVzKTsKKwlpZiAoaGRldiA9PSBoZGV2LT5idXMtPnJvb3RfaHViKSB7CisJCXN0cnVjdCB1c2JfaGNkICpoY2QgPQorCQkJCWNvbnRhaW5lcl9vZihoZGV2LT5idXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKKworCQlodWItPnBvd2VyX2J1ZGdldCA9IG1pbig1MDB1LCBoY2QtPnBvd2VyX2J1ZGdldCkgLyAyOworCX0gZWxzZSBpZiAoKGh1YnN0YXR1cyAmICgxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKSkgPT0gMCkgewogCQlkZXZfZGJnKGh1Yl9kZXYsICJodWIgY29udHJvbGxlciBjdXJyZW50IHJlcXVpcmVtZW50OiAlZG1BXG4iLAogCQkJaHViLT5kZXNjcmlwdG9yLT5iSHViQ29udHJDdXJyZW50KTsKIAkJaHViLT5wb3dlcl9idWRnZXQgPSAoNTAxIC0gaHViLT5kZXNjcmlwdG9yLT5iSHViQ29udHJDdXJyZW50KQogCQkJCQkvIDI7CisJfQorCWlmIChodWItPnBvd2VyX2J1ZGdldCkKIAkJZGV2X2RiZyhodWJfZGV2LCAiJWRtQSBidXMgcG93ZXIgYnVkZ2V0IGZvciBjaGlsZHJlblxuIiwKIAkJCWh1Yi0+cG93ZXJfYnVkZ2V0ICogMik7Ci0JfQogCiAKIAlyZXQgPSBodWJfaHViX3N0YXR1cyhodWIsICZodWJzdGF0dXMsICZodWJjaGFuZ2UpOwpAQCAtMTcyNyw3ICsxNzMzLDcgQEAKIAkJCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CiAKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPT0gUE1TR19TVVNQRU5EKQorCQkJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSBQTVNHX09OKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFpbnRmLT5kZXYuZHJpdmVyKSB7CiAJCQkJLyogRklYTUUgbWF5YmUgZm9yY2UgdG8gYWx0IDAgKi8KQEAgLTI3ODcsNiArMjc5MywxMSBAQAogCiAJCWh1Yi0+YWN0aXZhdGluZyA9IDA7CiAKKwkJLyogSWYgdGhpcyBpcyBhIHJvb3QgaHViLCB0ZWxsIHRoZSBIQ0QgaXQncyBva2F5IHRvCisJCSAqIHJlLWVuYWJsZSBwb3J0LWNoYW5nZSBpbnRlcnJ1cHRzIG5vdy4gKi8KKwkJaWYgKCFoZGV2LT5wYXJlbnQpCisJCQl1c2JfZW5hYmxlX3Jvb3RfaHViX2lycShoZGV2LT5idXMpOworCiBsb29wOgogCQl1c2JfdW5sb2NrX2RldmljZShoZGV2KTsKIAkJdXNiX3B1dF9pbnRmKGludGYpOwpAQCAtMjc5NiwyMyArMjgwNywxNiBAQAogCiBzdGF0aWMgaW50IGh1Yl90aHJlYWQodm9pZCAqX191bnVzZWQpCiB7Ci0JLyoKLQkgKiBUaGlzIHRocmVhZCBkb2Vzbid0IG5lZWQgYW55IHVzZXItbGV2ZWwgYWNjZXNzLAotCSAqIHNvIGdldCByaWQgb2YgYWxsIG91ciByZXNvdXJjZXMKLQkgKi8KLQotCWRhZW1vbml6ZSgia2h1YmQiKTsKLQlhbGxvd19zaWduYWwoU0lHS0lMTCk7Ci0KLQkvKiBTZW5kIG1lIGEgc2lnbmFsIHRvIGdldCBtZSBkaWUgKGZvciBkZWJ1Z2dpbmcpICovCiAJZG8gewogCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsgCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCSFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkgfHwKKwkJCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCQl0cnlfdG9fZnJlZXplKCk7Ci0JfSB3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8ICFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkpOwogCi0JcHJfZGVidWcgKCIlczoga2h1YmQgZXhpdGluZ1xuIiwgdXNiY29yZV9uYW1lKTsKLQljb21wbGV0ZV9hbmRfZXhpdCgma2h1YmRfZXhpdGVkLCAwKTsKKwlwcl9kZWJ1ZygiJXM6IGtodWJkIGV4aXRpbmdcbiIsIHVzYmNvcmVfbmFtZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBodWJfaWRfdGFibGUgW10gPSB7CkBAIC0yODM4LDIwICsyODQyLDE1IEBACiAKIGludCB1c2JfaHViX2luaXQodm9pZCkKIHsKLQlwaWRfdCBwaWQ7Ci0KIAlpZiAodXNiX3JlZ2lzdGVyKCZodWJfZHJpdmVyKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVnaXN0ZXIgaHViIGRyaXZlclxuIiwKIAkJCXVzYmNvcmVfbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwaWQgPSBrZXJuZWxfdGhyZWFkKGh1Yl90aHJlYWQsIE5VTEwsIENMT05FX0tFUk5FTCk7Ci0JaWYgKHBpZCA+PSAwKSB7Ci0JCWtodWJkX3BpZCA9IHBpZDsKLQorCWtodWJkX3Rhc2sgPSBrdGhyZWFkX3J1bihodWJfdGhyZWFkLCBOVUxMLCAia2h1YmQiKTsKKwlpZiAoIUlTX0VSUihraHViZF90YXNrKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogRmFsbCB0aHJvdWdoIGlmIGtlcm5lbF90aHJlYWQgZmFpbGVkICovCiAJdXNiX2RlcmVnaXN0ZXIoJmh1Yl9kcml2ZXIpOwpAQCAtMjg2MiwxMiArMjg2MSw3IEBACiAKIHZvaWQgdXNiX2h1Yl9jbGVhbnVwKHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCS8qIEtpbGwgdGhlIHRocmVhZCAqLwotCXJldCA9IGtpbGxfcHJvYyhraHViZF9waWQsIFNJR0tJTEwsIDEpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigma2h1YmRfZXhpdGVkKTsKKwlrdGhyZWFkX3N0b3Aoa2h1YmRfdGFzayk7CiAKIAkvKgogCSAqIEh1YiByZXNvdXJjZXMgYXJlIGZyZWVkIGZvciB1cyBieSB1c2JfZGVyZWdpc3Rlci4gSXQgY2FsbHMKQEAgLTI4NzksNyArMjg3Myw2IEBACiAJdXNiX2RlcmVnaXN0ZXIoJmh1Yl9kcml2ZXIpOwogfSAvKiB1c2JfaHViX2NsZWFudXAoKSAqLwogCi0KIHN0YXRpYyBpbnQgY29uZmlnX2Rlc2NyaXB0b3JzX2NoYW5nZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJdW5zaWduZWQJCQlpbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IGQxMTRiODQuLjUzYmY1NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtMjI0LDE1ICsyMjQsNCBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdAlsZWRzOwogfTsKIAotLyogdXNlIHRoaXMgZm9yIGxvdy1wb3dlcmVkIHJvb3QgaHVicyAqLwotc3RhdGljIGlubGluZSB2b2lkCi1odWJfc2V0X3Bvd2VyX2J1ZGdldCAoc3RydWN0IHVzYl9kZXZpY2UgKmh1YmRldiwgdW5zaWduZWQgbUEpCi17Ci0Jc3RydWN0IHVzYl9odWIJKmh1YjsKLQotCWh1YiA9IChzdHJ1Y3QgdXNiX2h1YiAqKQotCQl1c2JfZ2V0X2ludGZkYXRhIChodWJkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdKTsKLQlodWItPnBvd2VyX2J1ZGdldCA9IG1pbihtQSwodW5zaWduZWQpNTAwKS8yOwotfQotCiAjZW5kaWYgLyogX19MSU5VWF9IVUJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCBmNTBhYWYyLi5hNDI4ZWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZywKIAlpbnQJCQluZW50cywKIAlzaXplX3QJCQlsZW5ndGgsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKQogewogCWludAkJCWk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggNzQwY2I0Yy4uMDAyOTdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtMTk2LDYgKzE5Niw3IEBACiB1c2JfZGVzY3JpcHRvcl9hdHRyIChiRGV2aWNlU3ViQ2xhc3MsICIlMDJ4XG4iKQogdXNiX2Rlc2NyaXB0b3JfYXR0ciAoYkRldmljZVByb3RvY29sLCAiJTAyeFxuIikKIHVzYl9kZXNjcmlwdG9yX2F0dHIgKGJOdW1Db25maWd1cmF0aW9ucywgIiVkXG4iKQordXNiX2Rlc2NyaXB0b3JfYXR0ciAoYk1heFBhY2tldFNpemUwLCAiJWRcbiIpCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZXZfYXR0cnNbXSA9IHsKIAkvKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24ncyBhdHRyaWJ1dGVzICovCkBAIC0yMTEsNiArMjEyLDcgQEAKIAkmZGV2X2F0dHJfYkRldmljZVN1YkNsYXNzLmF0dHIsCiAJJmRldl9hdHRyX2JEZXZpY2VQcm90b2NvbC5hdHRyLAogCSZkZXZfYXR0cl9iTnVtQ29uZmlndXJhdGlvbnMuYXR0ciwKKwkmZGV2X2F0dHJfYk1heFBhY2tldFNpemUwLmF0dHIsCiAJJmRldl9hdHRyX3NwZWVkLmF0dHIsCiAJJmRldl9hdHRyX2Rldm51bS5hdHRyLAogCSZkZXZfYXR0cl92ZXJzaW9uLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCAwZmFmMThkLi5jMGZlZWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTYwLDcgKzYwLDcgQEAKICAqCiAgKiBUaGUgZHJpdmVyIG11c3QgY2FsbCB1c2JfZnJlZV91cmIoKSB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggdGhlIHVyYi4KICAqLwotc3RydWN0IHVyYiAqdXNiX2FsbG9jX3VyYihpbnQgaXNvX3BhY2tldHMsIGludCBtZW1fZmxhZ3MpCitzdHJ1Y3QgdXJiICp1c2JfYWxsb2NfdXJiKGludCBpc29fcGFja2V0cywgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCB1cmIgKnVyYjsKIApAQCAtMjI0LDcgKzIyNCw3IEBACiAgKiAgICAgIEdGUF9OT0lPLCB1bmxlc3MgYikgb3IgYykgYXBwbHkKICAqCiAgKi8KLWludCB1c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitpbnQgdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJaW50CQkJcGlwZSwgdGVtcCwgbWF4OwogCXN0cnVjdCB1c2JfZGV2aWNlCSpkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCBhM2M0MjIwLi45OWM4NWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTExMjksNyArMTEyOSw3IEBACiB2b2lkICp1c2JfYnVmZmVyX2FsbG9jICgKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCXNpemVfdCBzaXplLAotCWludCBtZW1fZmxhZ3MsCisJdW5zaWduZWQgbWVtX2ZsYWdzLAogCWRtYV9hZGRyX3QgKmRtYQogKQogewpAQCAtMTUzMiw2ICsxNTMyLDkgQEAKIEVYUE9SVF9TWU1CT0wodXNiX2RlcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTCh1c2JfZGlzYWJsZWQpOwogCitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZ2V0X2ludGYpOworRVhQT1JUX1NZTUJPTF9HUEwodXNiX3B1dF9pbnRmKTsKKwogRVhQT1JUX1NZTUJPTCh1c2JfYWxsb2NfZGV2KTsKIEVYUE9SVF9TWU1CT0wodXNiX3B1dF9kZXYpOwogRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IDNiMjRmOWYuLmZmMDc1YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC01Myw2ICs1Myw5IEBACiAJICAgZHJpdmVyIG9uIGEgbmV3IGJvYXJkLiAgIEVuYWJsZSB0aGVzZSBmaWxlcyBieSBjaG9vc2luZyAiWSIKIAkgICBoZXJlLiAgSWYgaW4gZG91YnQsIG9yIHRvIGNvbnNlcnZlIGtlcm5lbCBtZW1vcnksIHNheSAiTiIuCiAKK2NvbmZpZwlVU0JfR0FER0VUX1NFTEVDVEVECisJYm9vbGVhbgorCiAjCiAjIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIgU3VwcG9ydAogIwpAQCAtODUsNiArODgsNyBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUX05FVDIyODAKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiBjb25maWcgVVNCX0dBREdFVF9QWEEyWFgKIAlib29sZWFuICJQWEEgMjV4IG9yIElYUCA0eHgiCkBAIC0xMDUsNiArMTA5LDcgQEAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gVVNCX0dBREdFVF9QWEEyWFgKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiAjIGlmIHRoZXJlJ3Mgb25seSBvbmUgZ2FkZ2V0IGRyaXZlciwgdXNpbmcgb25seSB0d28gYnVsayBlbmRwb2ludHMsCiAjIGRvbid0IHdhc3RlIG1lbW9yeSBmb3IgdGhlIG90aGVyIGVuZHBvaW50cwpAQCAtMTM0LDYgKzEzOSw3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVRfR09LVQogCWRlZmF1bHQgVVNCX0dBREdFVAorCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAKIAogY29uZmlnIFVTQl9HQURHRVRfTEg3QTQwWApAQCAtMTQ2LDYgKzE1Miw3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVRfTEg3QTQwWAogCWRlZmF1bHQgVVNCX0dBREdFVAorCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAKIAogY29uZmlnIFVTQl9HQURHRVRfT01BUApAQCAtMTY3LDYgKzE3NCw3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVRfT01BUAogCWRlZmF1bHQgVVNCX0dBREdFVAorCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAKIGNvbmZpZyBVU0JfT1RHCiAJYm9vbGVhbiAiT1RHIFN1cHBvcnQiCkBAIC0yMDcsNiArMjE1LDcgQEAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gVVNCX0dBREdFVF9EVU1NWV9IQ0QKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiAjIE5PVEU6ICBQbGVhc2Uga2VlcCBkdW1teV9oY2QgTEFTVCBzbyB0aGF0ICJyZWFsIGhhcmR3YXJlIiBhcHBlYXJzCiAjIGZpcnN0IGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCkBAIC0yMjYsNyArMjM1LDcgQEAKICMKIGNob2ljZQogCXRyaXN0YXRlICJVU0IgR2FkZ2V0IERyaXZlcnMiCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUICYmIFVTQl9HQURHRVRfU0VMRUNURUQKIAlkZWZhdWx0IFVTQl9FVEgKIAloZWxwCiAJICBBIExpbnV4ICJHYWRnZXQgRHJpdmVyIiB0YWxrcyB0byB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCmluZGV4IGMwMzlkMmYuLjU4M2RiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAogCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJVU0IgSG9zdCtHYWRnZXQgRW11bGF0b3IiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxNyBEZWMgMjAwNCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAyIE1heSAyMDA1IgogCiBzdGF0aWMgY29uc3QgY2hhcglkcml2ZXJfbmFtZSBbXSA9ICJkdW1teV9oY2QiOwogc3RhdGljIGNvbnN0IGNoYXIJZHJpdmVyX2Rlc2MgW10gPSAiVVNCIEhvc3QrR2FkZ2V0IEVtdWxhdG9yIjsKQEAgLTE0MSw2ICsxNDEsOCBAQAogfTsKICNkZWZpbmUgRFVNTVlfRU5EUE9JTlRTCShzaXplb2YoZXBfbmFtZSkvc2l6ZW9mKGNoYXIgKikpCiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKICNkZWZpbmUgRklGT19TSVpFCQk2NAogCiBzdHJ1Y3QgdXJicCB7CkBAIC0xNDgsNiArMTUwLDEzIEBACiAJc3RydWN0IGxpc3RfaGVhZAl1cmJwX2xpc3Q7CiB9OwogCisKK2VudW0gZHVtbXlfcmhfc3RhdGUgeworCURVTU1ZX1JIX1JFU0VULAorCURVTU1ZX1JIX1NVU1BFTkRFRCwKKwlEVU1NWV9SSF9SVU5OSU5HCit9OworCiBzdHJ1Y3QgZHVtbXkgewogCXNwaW5sb2NrX3QJCQlsb2NrOwogCkBAIC0xNjEsMTIgKzE3MCwxOCBAQAogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CQlmaWZvX3JlcTsKIAl1OAkJCQlmaWZvX2J1ZiBbRklGT19TSVpFXTsKIAl1MTYJCQkJZGV2c3RhdHVzOworCXVuc2lnbmVkCQkJdWRjX3N1c3BlbmRlZDoxOworCXVuc2lnbmVkCQkJcHVsbHVwOjE7CisJdW5zaWduZWQJCQlhY3RpdmU6MTsKKwl1bnNpZ25lZAkJCW9sZF9hY3RpdmU6MTsKIAogCS8qCiAJICogTUFTVEVSL0hPU1Qgc2lkZSBzdXBwb3J0CiAJICovCisJZW51bSBkdW1teV9yaF9zdGF0ZQkJcmhfc3RhdGU7CiAJc3RydWN0IHRpbWVyX2xpc3QJCXRpbWVyOwogCXUzMgkJCQlwb3J0X3N0YXR1czsKKwl1MzIJCQkJb2xkX3N0YXR1czsKIAl1bnNpZ25lZAkJCXJlc3VtaW5nOjE7CiAJdW5zaWduZWQgbG9uZwkJCXJlX3RpbWVvdXQ7CiAKQEAgLTE4OSw2ICsyMDQsMTEgQEAKIAlyZXR1cm4gZHVtbXlfdG9faGNkKGR1bSktPnNlbGYuY29udHJvbGxlcjsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICp1ZGNfZGV2IChzdHJ1Y3QgZHVtbXkgKmR1bSkKK3sKKwlyZXR1cm4gZHVtLT5nYWRnZXQuZGV2LnBhcmVudDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHVtbXkgKmVwX3RvX2R1bW15IChzdHJ1Y3QgZHVtbXlfZXAgKmVwKQogewogCXJldHVybiBjb250YWluZXJfb2YgKGVwLT5nYWRnZXQsIHN0cnVjdCBkdW1teSwgZ2FkZ2V0KTsKQEAgLTIwOCwxNiArMjI4LDk4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qCi0gKiBUaGlzICJoYXJkd2FyZSIgbWF5IGxvb2sgYSBiaXQgb2RkIGluIGRpYWdub3N0aWNzIHNpbmNlIGl0J3MgZ290IGJvdGgKLSAqIGhvc3QgYW5kIGRldmljZSBzaWRlczsgYW5kIGl0IGJpbmRzIGRpZmZlcmVudCBkcml2ZXJzIHRvIGVhY2ggc2lkZS4KLSAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCXRoZV9wZGV2OworLyogU0xBVkUvR0FER0VUIFNJREUgVVRJTElUWSBST1VUSU5FUyAqLwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgZHVtbXlfZHJpdmVyID0gewotCS5uYW1lCQk9IChjaGFyICopIGRyaXZlcl9uYW1lLAotCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAotfTsKKy8qIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIG51a2UgKHN0cnVjdCBkdW1teSAqZHVtLCBzdHJ1Y3QgZHVtbXlfZXAgKmVwKQoreworCXdoaWxlICghbGlzdF9lbXB0eSAoJmVwLT5xdWV1ZSkpIHsKKwkJc3RydWN0IGR1bW15X3JlcXVlc3QJKnJlcTsKKworCQlyZXEgPSBsaXN0X2VudHJ5IChlcC0+cXVldWUubmV4dCwgc3RydWN0IGR1bW15X3JlcXVlc3QsIHF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCAoJnJlcS0+cXVldWUpOworCQlyZXEtPnJlcS5zdGF0dXMgPSAtRVNIVVRET1dOOworCisJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKKwkJcmVxLT5yZXEuY29tcGxldGUgKCZlcC0+ZXAsICZyZXEtPnJlcSk7CisJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CisJfQorfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIGxvY2sgKi8KK3N0YXRpYyB2b2lkCitzdG9wX2FjdGl2aXR5IChzdHJ1Y3QgZHVtbXkgKmR1bSkKK3sKKwlzdHJ1Y3QgZHVtbXlfZXAJKmVwOworCisJLyogcHJldmVudCBhbnkgbW9yZSByZXF1ZXN0cyAqLworCWR1bS0+YWRkcmVzcyA9IDA7CisKKwkvKiBUaGUgdGltZXIgaXMgbGVmdCBydW5uaW5nIHNvIHRoYXQgb3V0c3RhbmRpbmcgVVJCcyBjYW4gZmFpbCAqLworCisJLyogbnVrZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBmaXJzdCwgc28gZHJpdmVyIGkvbyBpcyBxdWllc2NlZCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKGVwLCAmZHVtLT5nYWRnZXQuZXBfbGlzdCwgZXAuZXBfbGlzdCkKKwkJbnVrZSAoZHVtLCBlcCk7CisKKwkvKiBkcml2ZXIgbm93IGRvZXMgYW55IG5vbi11c2IgcXVpZXNjaW5nIG5lY2Vzc2FyeSAqLworfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIGxvY2sgKi8KK3N0YXRpYyB2b2lkCitzZXRfbGlua19zdGF0ZSAoc3RydWN0IGR1bW15ICpkdW0pCit7CisJZHVtLT5hY3RpdmUgPSAwOworCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUE9XRVIpID09IDApCisJCWR1bS0+cG9ydF9zdGF0dXMgPSAwOworCisJLyogVURDIHN1c3BlbmQgbXVzdCBjYXVzZSBhIGRpc2Nvbm5lY3QgKi8KKwllbHNlIGlmICghZHVtLT5wdWxsdXAgfHwgZHVtLT51ZGNfc3VzcGVuZGVkKSB7CisJCWR1bS0+cG9ydF9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04gfAorCQkJCQlVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCVVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEIHwKKwkJCQkJVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEIHwKKwkJCQkJVVNCX1BPUlRfU1RBVF9TVVNQRU5EKTsKKwkJaWYgKChkdW0tPm9sZF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pICE9IDApCisJCQlkdW0tPnBvcnRfc3RhdHVzIHw9IChVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7CisJfSBlbHNlIHsKKwkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCWlmICgoZHVtLT5vbGRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwKQorCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gPDwgMTYpOworCQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkgPT0gMCkKKwkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfU1VTUEVORDsKKwkJZWxzZSBpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpID09IDAgJiYKKwkJCQlkdW0tPnJoX3N0YXRlICE9IERVTU1ZX1JIX1NVU1BFTkRFRCkKKwkJCWR1bS0+YWN0aXZlID0gMTsKKwl9CisKKwlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkgPT0gMCB8fCBkdW0tPmFjdGl2ZSkKKwkJZHVtLT5yZXN1bWluZyA9IDA7CisKKwlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pID09IDAgfHwKKwkJCShkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9SRVNFVCkgIT0gMCkgeworCQlpZiAoKGR1bS0+b2xkX3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgIT0gMCAmJgorCQkJCShkdW0tPm9sZF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1JFU0VUKSA9PSAwICYmCisJCQkJZHVtLT5kcml2ZXIpIHsKKwkJCXN0b3BfYWN0aXZpdHkgKGR1bSk7CisJCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7CisJCQlkdW0tPmRyaXZlci0+ZGlzY29ubmVjdCAoJmR1bS0+Z2FkZ2V0KTsKKwkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CisJCX0KKwl9IGVsc2UgaWYgKGR1bS0+YWN0aXZlICE9IGR1bS0+b2xkX2FjdGl2ZSkgeworCQlpZiAoZHVtLT5vbGRfYWN0aXZlICYmIGR1bS0+ZHJpdmVyLT5zdXNwZW5kKSB7CisJCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7CisJCQlkdW0tPmRyaXZlci0+c3VzcGVuZCAoJmR1bS0+Z2FkZ2V0KTsKKwkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CisJCX0gZWxzZSBpZiAoIWR1bS0+b2xkX2FjdGl2ZSAmJiBkdW0tPmRyaXZlci0+cmVzdW1lKSB7CisJCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7CisJCQlkdW0tPmRyaXZlci0+cmVzdW1lICgmZHVtLT5nYWRnZXQpOworCQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKKwkJfQorCX0KKworCWR1bS0+b2xkX3N0YXR1cyA9IGR1bS0+cG9ydF9zdGF0dXM7CisJZHVtLT5vbGRfYWN0aXZlID0gZHVtLT5hY3RpdmU7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMyNCw3ICs0MjYsNyBAQAogCV9lcC0+bWF4cGFja2V0ID0gbWF4OwogCWVwLT5kZXNjID0gZGVzYzsKIAotCWRldl9kYmcgKGR1bW15X2RldihkdW0pLCAiZW5hYmxlZCAlcyAoZXAlZCVzLSVzKSBtYXhwYWNrZXQgJWRcbiIsCisJZGV2X2RiZyAodWRjX2RldihkdW0pLCAiZW5hYmxlZCAlcyAoZXAlZCVzLSVzKSBtYXhwYWNrZXQgJWRcbiIsCiAJCV9lcC0+bmFtZSwKIAkJZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYsCiAJCShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCkBAIC0zNDUsMjIgKzQ0Nyw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyogY2FsbGVkIHdpdGggc3BpbmxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQgbnVrZSAoc3RydWN0IGR1bW15ICpkdW0sIHN0cnVjdCBkdW1teV9lcCAqZXApCi17Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5ICgmZXAtPnF1ZXVlKSkgewotCQlzdHJ1Y3QgZHVtbXlfcmVxdWVzdAkqcmVxOwotCi0JCXJlcSA9IGxpc3RfZW50cnkgKGVwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgZHVtbXlfcmVxdWVzdCwgcXVldWUpOwotCQlsaXN0X2RlbF9pbml0ICgmcmVxLT5xdWV1ZSk7Ci0JCXJlcS0+cmVxLnN0YXR1cyA9IC1FU0hVVERPV047Ci0KLQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOwotCQlyZXEtPnJlcS5jb21wbGV0ZSAoJmVwLT5lcCwgJnJlcS0+cmVxKTsKLQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfZGlzYWJsZSAoc3RydWN0IHVzYl9lcCAqX2VwKQogewogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwpAQCAtMzc5LDEyICs0NjUsMTIgQEAKIAludWtlIChkdW0sIGVwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CiAKLQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgImRpc2FibGVkICVzXG4iLCBfZXAtPm5hbWUpOworCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgImRpc2FibGVkICVzXG4iLCBfZXAtPm5hbWUpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotZHVtbXlfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCBpbnQgbWVtX2ZsYWdzKQorZHVtbXlfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJc3RydWN0IGR1bW15X2VwCQkqZXA7CiAJc3RydWN0IGR1bW15X3JlcXVlc3QJKnJlcTsKQEAgLTQyMSw3ICs1MDcsNyBAQAogCXN0cnVjdCB1c2JfZXAgKl9lcCwKIAl1bnNpZ25lZCBieXRlcywKIAlkbWFfYWRkcl90ICpkbWEsCi0JaW50IG1lbV9mbGFncworCXVuc2lnbmVkIG1lbV9mbGFncwogKSB7CiAJY2hhcgkJCSpyZXR2YWw7CiAJc3RydWN0IGR1bW15X2VwCQkqZXA7CkBAIC00NTQsNyArNTQwLDggQEAKIH0KIAogc3RhdGljIGludAotZHVtbXlfcXVldWUgKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgbWVtX2ZsYWdzKQorZHVtbXlfcXVldWUgKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLAorCQl1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJc3RydWN0IGR1bW15X2VwCQkqZXA7CiAJc3RydWN0IGR1bW15X3JlcXVlc3QJKnJlcTsKQEAgLTQ3NCw3ICs1NjEsNyBAQAogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAogI2lmIDAKLQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgImVwICVwIHF1ZXVlIHJlcSAlcCB0byAlcywgbGVuICVkIGJ1ZiAlcFxuIiwKKwlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJlcCAlcCBxdWV1ZSByZXEgJXAgdG8gJXMsIGxlbiAlZCBidWYgJXBcbiIsCiAJCQllcCwgX3JlcSwgX2VwLT5uYW1lLCBfcmVxLT5sZW5ndGgsIF9yZXEtPmJ1Zik7CiAjZW5kaWYKIApAQCAtNTM3LDcgKzYyNCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCWRldl9kYmcgKGR1bW15X2RldihkdW0pLAorCQlkZXZfZGJnICh1ZGNfZGV2KGR1bSksCiAJCQkJImRlcXVldWVkIHJlcSAlcCBmcm9tICVzLCBsZW4gJWQgYnVmICVwXG4iLAogCQkJCXJlcSwgX2VwLT5uYW1lLCBfcmVxLT5sZW5ndGgsIF9yZXEtPmJ1Zik7CiAJCV9yZXEtPmNvbXBsZXRlIChfZXAsIF9yZXEpOwpAQCAtNjAxLDEzICs2ODgsMjEgQEAKIAlzdHJ1Y3QgZHVtbXkJKmR1bTsKIAogCWR1bSA9IGdhZGdldF90b19kdW1teSAoX2dhZGdldCk7Ci0JaWYgKChkdW0tPmRldnN0YXR1cyAmICgxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkpID09IDAKLQkJCXx8ICEoZHVtLT5wb3J0X3N0YXR1cyAmICgxIDw8IFVTQl9QT1JUX0ZFQVRfU1VTUEVORCkpKQorCWlmICghKGR1bS0+ZGV2c3RhdHVzICYJKCAoMSA8PCBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRSkKKwkJCQl8ICgxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwKQorCQlyZXR1cm4gLUVOT0xJTks7CisJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSA9PSAwICYmCisJCQkgZHVtLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9TVVNQRU5ERUQpCisJCXJldHVybiAtRUlPOworCisJLyogRklYTUU6IFdoYXQgaWYgdGhlIHJvb3QgaHViIGlzIHN1c3BlbmRlZCBidXQgdGhlIHBvcnQgaXNuJ3Q/ICovCiAKIAkvKiBodWIgbm90aWNlcyBvdXIgcmVxdWVzdCwgaXNzdWVzIGRvd25zdHJlYW0gcmVzdW1lLCBldGMgKi8KIAlkdW0tPnJlc3VtaW5nID0gMTsKLQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EKTsKKwlkdW0tPnJlX3RpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisJbW9kX3RpbWVyICgmZHVtbXlfdG9faGNkIChkdW0pLT5yaF90aW1lciwgZHVtLT5yZV90aW1lb3V0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjIzLDEwICs3MTgsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkdW1teV9wdWxsdXAgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGR1bW15CSpkdW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWR1bSA9IGdhZGdldF90b19kdW1teSAoX2dhZGdldCk7CisJc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlkdW0tPnB1bGx1cCA9ICh2YWx1ZSAhPSAwKTsKKwlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CisKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChkdW1teV90b19oY2QgKGR1bSkpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIGR1bW15X29wcyA9IHsKIAkuZ2V0X2ZyYW1lCT0gZHVtbXlfZ19nZXRfZnJhbWUsCiAJLndha2V1cAkJPSBkdW1teV93YWtldXAsCiAJLnNldF9zZWxmcG93ZXJlZCA9IGR1bW15X3NldF9zZWxmcG93ZXJlZCwKKwkucHVsbHVwCQk9IGR1bW15X3B1bGx1cCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC02NDEsNyArNzUyLDcgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHNjbnByaW50ZiAoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZHVtLT5kcml2ZXItPmZ1bmN0aW9uKTsKIH0KLURFVklDRV9BVFRSIChmdW5jdGlvbiwgU19JUlVHTywgc2hvd19mdW5jdGlvbiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIgKGZ1bmN0aW9uLCBTX0lSVUdPLCBzaG93X2Z1bmN0aW9uLCBOVUxMKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNjU5LDM4ICs3NzAsNiBAQAogICogZm9yIGVhY2ggZHJpdmVyIHRoYXQgcmVnaXN0ZXJzOiAganVzdCBhZGQgdG8gYSBiaWcgcm9vdCBodWIuCiAgKi8KIAotc3RhdGljIHZvaWQKLWR1bW15X3VkY19yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wZGV2X3JlbGVhc2UgKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLX0KLQotc3RhdGljIGludAotZHVtbXlfcmVnaXN0ZXJfdWRjIChzdHJ1Y3QgZHVtbXkgKmR1bSkKLXsKLQlpbnQJCXJjOwotCi0Jc3RyY3B5IChkdW0tPmdhZGdldC5kZXYuYnVzX2lkLCAidWRjIik7Ci0JZHVtLT5nYWRnZXQuZGV2LnBhcmVudCA9IGR1bW15X2RldihkdW0pOwotCWR1bS0+Z2FkZ2V0LmRldi5yZWxlYXNlID0gZHVtbXlfdWRjX3JlbGVhc2U7Ci0KLQlyYyA9IGRldmljZV9yZWdpc3RlciAoJmR1bS0+Z2FkZ2V0LmRldik7Ci0JaWYgKHJjID09IDApCi0JCWRldmljZV9jcmVhdGVfZmlsZSAoJmR1bS0+Z2FkZ2V0LmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV91bnJlZ2lzdGVyX3VkYyAoc3RydWN0IGR1bW15ICpkdW0pCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlICgmZHVtLT5nYWRnZXQuZGV2LCAmZGV2X2F0dHJfZnVuY3Rpb24pOwotCWRldmljZV91bnJlZ2lzdGVyICgmZHVtLT5nYWRnZXQuZGV2KTsKLX0KLQogaW50CiB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CkBAIC03MDksMTIgKzc4OCw4IEBACiAJICogU0xBVkUgc2lkZSBpbml0IC4uLiB0aGUgbGF5ZXIgYWJvdmUgaGFyZHdhcmUsIHdoaWNoCiAJICogY2FuJ3QgZW51bWVyYXRlIHdpdGhvdXQgaGVscCBmcm9tIHRoZSBkcml2ZXIgd2UncmUgYmluZGluZy4KIAkgKi8KLQlkdW0tPmdhZGdldC5uYW1lID0gZ2FkZ2V0X25hbWU7Ci0JZHVtLT5nYWRnZXQub3BzID0gJmR1bW15X29wczsKLQlkdW0tPmdhZGdldC5pc19kdWFsc3BlZWQgPSAxOwogCiAJZHVtLT5kZXZzdGF0dXMgPSAwOwotCWR1bS0+cmVzdW1pbmcgPSAwOwogCiAJSU5JVF9MSVNUX0hFQUQgKCZkdW0tPmdhZGdldC5lcF9saXN0KTsKIAlmb3IgKGkgPSAwOyBpIDwgRFVNTVlfRU5EUE9JTlRTOyBpKyspIHsKQEAgLTc0MCw3ICs4MTUsNyBAQAogCiAJZHVtLT5kcml2ZXIgPSBkcml2ZXI7CiAJZHVtLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKLQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgImJpbmRpbmcgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAorCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgImJpbmRpbmcgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAogCQkJZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJaWYgKChyZXR2YWwgPSBkcml2ZXItPmJpbmQgKCZkdW0tPmdhZGdldCkpICE9IDApIHsKIAkJZHVtLT5kcml2ZXIgPSBOVUxMOwpAQCAtNzQ4LDQyICs4MjMsMjEgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQkvLyBGSVhNRTogQ2hlY2sgdGhlc2UgY2FsbHMgZm9yIGVycm9ycyBhbmQgcmUtb3JkZXIKIAlkcml2ZXItPmRyaXZlci5idXMgPSBkdW0tPmdhZGdldC5kZXYucGFyZW50LT5idXM7CiAJZHJpdmVyX3JlZ2lzdGVyICgmZHJpdmVyLT5kcml2ZXIpOwotCiAJZGV2aWNlX2JpbmRfZHJpdmVyICgmZHVtLT5nYWRnZXQuZGV2KTsKIAogCS8qIGtodWJkIHdpbGwgZW51bWVyYXRlIHRoaXMgaW4gYSB3aGlsZSAqLwotCWR1bS0+cG9ydF9zdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OCi0JCXwgKDEgPDwgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pOworCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOworCWR1bS0+cHVsbHVwID0gMTsKKwlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOworCisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKTsKIAotLyogY2FsbGVyIG11c3QgaG9sZCBsb2NrICovCi1zdGF0aWMgdm9pZAotc3RvcF9hY3Rpdml0eSAoc3RydWN0IGR1bW15ICpkdW0sIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQotewotCXN0cnVjdCBkdW1teV9lcAkqZXA7Ci0KLQkvKiBwcmV2ZW50IGFueSBtb3JlIHJlcXVlc3RzICovCi0JZHVtLT5hZGRyZXNzID0gMDsKLQotCS8qIFRoZSB0aW1lciBpcyBsZWZ0IHJ1bm5pbmcgc28gdGhhdCBvdXRzdGFuZGluZyBVUkJzIGNhbiBmYWlsICovCi0KLQkvKiBudWtlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGZpcnN0LCBzbyBkcml2ZXIgaS9vIGlzIHF1aWVzY2VkICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAoZXAsICZkdW0tPmdhZGdldC5lcF9saXN0LCBlcC5lcF9saXN0KQotCQludWtlIChkdW0sIGVwKTsKLQotCS8qIGRyaXZlciBub3cgZG9lcyBhbnkgbm9uLXVzYiBxdWllc2NpbmcgbmVjZXNzYXJ5ICovCi0JaWYgKGRyaXZlcikgewotCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7Ci0JCWRyaXZlci0+ZGlzY29ubmVjdCAoJmR1bS0+Z2FkZ2V0KTsKLQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKLQl9Ci19Ci0KIGludAogdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CkBAIC03OTUsMzUgKzg0OSwxMzggQEAKIAlpZiAoIWRyaXZlciB8fCBkcml2ZXIgIT0gZHVtLT5kcml2ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJ1bnJlZ2lzdGVyIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKKwlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJ1bnJlZ2lzdGVyIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKIAkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKLQlzdG9wX2FjdGl2aXR5IChkdW0sIGRyaXZlcik7Ci0JZHVtLT5wb3J0X3N0YXR1cyAmPSB+KFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiB8IFVTQl9QT1JUX1NUQVRfRU5BQkxFIHwKLQkJCVVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEIHwgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKTsKLQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKwlkdW0tPnB1bGx1cCA9IDA7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCiAJZHJpdmVyLT51bmJpbmQgKCZkdW0tPmdhZGdldCk7CiAJZHVtLT5kcml2ZXIgPSBOVUxMOwogCiAJZGV2aWNlX3JlbGVhc2VfZHJpdmVyICgmZHVtLT5nYWRnZXQuZGV2KTsKLQogCWRyaXZlcl91bnJlZ2lzdGVyICgmZHJpdmVyLT5kcml2ZXIpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlkdW0tPnB1bGx1cCA9IDA7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOworCisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAjdW5kZWYgaXNfZW5hYmxlZAogCisvKiBqdXN0IGRlY2xhcmUgdGhpcyBpbiBhbnkgZHJpdmVyIHRoYXQgcmVhbGx5IG5lZWQgaXQgKi8KK2V4dGVybiBpbnQgbmV0MjI4MF9zZXRfZmlmb19tb2RlIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgbW9kZSk7CisKIGludCBuZXQyMjgwX3NldF9maWZvX21vZGUgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBtb2RlKQogewogCXJldHVybiAtRU5PU1lTOwogfQogRVhQT1JUX1NZTUJPTCAobmV0MjI4MF9zZXRfZmlmb19tb2RlKTsKIAorCisvKiBUaGUgZ2FkZ2V0IHN0cnVjdHVyZSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBoY2Qgc3RydWN0dXJlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCBhbG9uZyB3aXRoIGl0LiAqLworc3RhdGljIHZvaWQKK2R1bW15X2dhZGdldF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisjaWYgMAkJLyogdXNiX2J1c19wdXQgaXNuJ3QgRVhQT1JUZWQhICovCisJc3RydWN0IGR1bW15CSpkdW0gPSBnYWRnZXRfZGV2X3RvX2R1bW15IChkZXYpOworCisJdXNiX2J1c19wdXQgKCZkdW1teV90b19oY2QgKGR1bSktPnNlbGYpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGR1bW15CSpkdW0gPSB0aGVfY29udHJvbGxlcjsKKwlpbnQJCXJjOworCisJZHVtLT5nYWRnZXQubmFtZSA9IGdhZGdldF9uYW1lOworCWR1bS0+Z2FkZ2V0Lm9wcyA9ICZkdW1teV9vcHM7CisJZHVtLT5nYWRnZXQuaXNfZHVhbHNwZWVkID0gMTsKKworCS8qIG1heWJlIGNsYWltIE9URyBzdXBwb3J0LCB0aG91Z2ggd2Ugd29uJ3QgY29tcGxldGUgSE5QICovCisJZHVtLT5nYWRnZXQuaXNfb3RnID0gKGR1bW15X3RvX2hjZChkdW0pLT5zZWxmLm90Z19wb3J0ICE9IDApOworCisJc3RyY3B5IChkdW0tPmdhZGdldC5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJZHVtLT5nYWRnZXQuZGV2LnBhcmVudCA9IGRldjsKKwlkdW0tPmdhZGdldC5kZXYucmVsZWFzZSA9IGR1bW15X2dhZGdldF9yZWxlYXNlOworCXJjID0gZGV2aWNlX3JlZ2lzdGVyICgmZHVtLT5nYWRnZXQuZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKyNpZiAwCQkvKiB1c2JfYnVzX2dldCBpc24ndCBFWFBPUlRlZCEgKi8KKwl1c2JfYnVzX2dldCAoJmR1bW15X3RvX2hjZCAoZHVtKS0+c2VsZik7CisjZW5kaWYKKworCWRldl9zZXRfZHJ2ZGF0YSAoZGV2LCBkdW0pOworCWRldmljZV9jcmVhdGVfZmlsZSAoJmR1bS0+Z2FkZ2V0LmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkdW1teQkqZHVtID0gZGV2X2dldF9kcnZkYXRhIChkZXYpOworCisJZGV2X3NldF9kcnZkYXRhIChkZXYsIE5VTEwpOworCWRldmljZV9yZW1vdmVfZmlsZSAoJmR1bS0+Z2FkZ2V0LmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKKwlkZXZpY2VfdW5yZWdpc3RlciAoJmR1bS0+Z2FkZ2V0LmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3N1c3BlbmQgKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLAorCQl1MzIgbGV2ZWwpCit7CisJc3RydWN0IGR1bW15CSpkdW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChsZXZlbCAhPSBTVVNQRU5EX0RJU0FCTEUpCisJCXJldHVybiAwOworCisJZGV2X2RiZyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CisJZHVtLT51ZGNfc3VzcGVuZGVkID0gMTsKKwlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOworCisJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3Jlc3VtZSAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGR1bW15CSpkdW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChsZXZlbCAhPSBSRVNVTUVfRU5BQkxFKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOworCWR1bS0+dWRjX3N1c3BlbmRlZCA9IDA7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKworCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkdW1teV91ZGNfZHJpdmVyID0geworCS5uYW1lCQk9IChjaGFyICopIGdhZGdldF9uYW1lLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBkdW1teV91ZGNfcHJvYmUsCisJLnJlbW92ZQkJPSBkdW1teV91ZGNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gZHVtbXlfdWRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBkdW1teV91ZGNfcmVzdW1lLAorfTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogTUFTVEVSL0hPU1QgU0lERSBEUklWRVIKQEAgLTg0Miw3ICs5OTksNyBAQAogCXN0cnVjdCB1c2JfaGNkCQkJKmhjZCwKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVwLAogCXN0cnVjdCB1cmIJCQkqdXJiLAotCWludAkJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJCW1lbV9mbGFncwogKSB7CiAJc3RydWN0IGR1bW15CSpkdW07CiAJc3RydWN0IHVyYnAJKnVyYnA7CkBAIC04ODAsNyArMTAzNywxNiBAQAogCiBzdGF0aWMgaW50IGR1bW15X3VyYl9kZXF1ZXVlIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JLyogZ2l2ZWJhY2sgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGluIHRpbWVyIGNhbGxiYWNrICovCisJc3RydWN0IGR1bW15CSpkdW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCS8qIGdpdmViYWNrIGhhcHBlbnMgYXV0b21hdGljYWxseSBpbiB0aW1lciBjYWxsYmFjaywKKwkgKiBzbyBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGhhcHBlbnMgKi8KKwlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlpZiAoZHVtLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9SVU5OSU5HICYmICFsaXN0X2VtcHR5KCZkdW0tPnVyYnBfbGlzdCkpCisJCW1vZF90aW1lciAoJmR1bS0+dGltZXIsIGppZmZpZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAyNSw3ICsxMTkxLDYgQEAKIAogCQkvKiBoaWdoIGJhbmR3aWR0aCBtb2RlICovCiAJCXRtcCA9IGxlMTZfdG9fY3B1KGVwLT5kZXNjLT53TWF4UGFja2V0U2l6ZSk7Ci0JCXRtcCA9IGxlMTZfdG9fY3B1ICh0bXApOwogCQl0bXAgPSAodG1wID4+IDExKSAmIDB4MDM7CiAJCXRtcCAqPSA4IC8qIGFwcGxpZXMgdG8gZW50aXJlIGZyYW1lICovOwogCQlsaW1pdCArPSBsaW1pdCAqIHRtcDsKQEAgLTExMjMsNyArMTI4OCw4IEBACiAJCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJCS8qIGxpa2VseSBpdCB3YXMganVzdCB1bmxpbmtlZCAqLwogCQkJZ290byByZXR1cm5fdXJiOwotCQl9CisJCX0gZWxzZSBpZiAoZHVtLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9SVU5OSU5HKQorCQkJY29udGludWU7CiAJCXR5cGUgPSB1c2JfcGlwZXR5cGUgKHVyYi0+cGlwZSk7CiAKIAkJLyogdXNlZCB1cCB0aGlzIGZyYW1lJ3Mgbm9uLXBlcmlvZGljIGJhbmR3aWR0aD8KQEAgLTExNjgsMTIgKzEzMzQsMTQgQEAKIAkJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJCXNldHVwOwogCQkJaW50CQkJCXZhbHVlID0gMTsKIAkJCXN0cnVjdCBkdW1teV9lcAkJCSplcDI7CisJCQl1bnNpZ25lZAkJCXdfaW5kZXg7CisJCQl1bnNpZ25lZAkJCXdfdmFsdWU7CiAKIAkJCXNldHVwID0gKihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KikgdXJiLT5zZXR1cF9wYWNrZXQ7Ci0JCQlsZTE2X3RvX2NwdXMgKCZzZXR1cC53SW5kZXgpOwotCQkJbGUxNl90b19jcHVzICgmc2V0dXAud1ZhbHVlKTsKLQkJCWxlMTZfdG9fY3B1cyAoJnNldHVwLndMZW5ndGgpOwotCQkJaWYgKHNldHVwLndMZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7CisJCQl3X2luZGV4ID0gbGUxNl90b19jcHUoc2V0dXAud0luZGV4KTsKKwkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShzZXR1cC53VmFsdWUpOworCQkJaWYgKGxlMTZfdG9fY3B1KHNldHVwLndMZW5ndGgpICE9CisJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkgewogCQkJCW1heWJlX3NldF9zdGF0dXMgKHVyYiwgLUVPVkVSRkxPVyk7CiAJCQkJZ290byByZXR1cm5fdXJiOwogCQkJfQpAQCAtMTE4Miw3ICsxMzUwLDcgQEAKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkgKHJlcSwgJmVwLT5xdWV1ZSwgcXVldWUpIHsKIAkJCQlsaXN0X2RlbF9pbml0ICgmcmVxLT5xdWV1ZSk7CiAJCQkJcmVxLT5yZXEuc3RhdHVzID0gLUVPVkVSRkxPVzsKLQkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgInN0YWxlIHJlcSA9ICVwXG4iLAorCQkJCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgInN0YWxlIHJlcSA9ICVwXG4iLAogCQkJCQkJcmVxKTsKIAogCQkJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKQEAgLTEyMDMsMzEgKzEzNzEsNDAgQEAKIAkJCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKIAkJCQlpZiAoc2V0dXAuYlJlcXVlc3RUeXBlICE9IERldl9SZXF1ZXN0KQogCQkJCQlicmVhazsKLQkJCQlkdW0tPmFkZHJlc3MgPSBzZXR1cC53VmFsdWU7CisJCQkJZHVtLT5hZGRyZXNzID0gd192YWx1ZTsKIAkJCQltYXliZV9zZXRfc3RhdHVzICh1cmIsIDApOwotCQkJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLCAic2V0X2FkZHJlc3MgPSAlZFxuIiwKLQkJCQkJCXNldHVwLndWYWx1ZSk7CisJCQkJZGV2X2RiZyAodWRjX2RldihkdW0pLCAic2V0X2FkZHJlc3MgPSAlZFxuIiwKKwkJCQkJCXdfdmFsdWUpOwogCQkJCXZhbHVlID0gMDsKIAkJCQlicmVhazsKIAkJCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKIAkJCQlpZiAoc2V0dXAuYlJlcXVlc3RUeXBlID09IERldl9SZXF1ZXN0KSB7CiAJCQkJCXZhbHVlID0gMDsKLQkJCQkJc3dpdGNoIChzZXR1cC53VmFsdWUpIHsKKwkJCQkJc3dpdGNoICh3X3ZhbHVlKSB7CiAJCQkJCWNhc2UgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOgogCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEU6CisJCQkJCQlkdW0tPmdhZGdldC5iX2hucF9lbmFibGUgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVVNCX0RFVklDRV9BX0hOUF9TVVBQT1JUOgorCQkJCQkJZHVtLT5nYWRnZXQuYV9obnBfc3VwcG9ydCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUOgorCQkJCQkJZHVtLT5nYWRnZXQuYV9hbHRfaG5wX3N1cHBvcnQKKwkJCQkJCQk9IDE7CisJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdDoKIAkJCQkJCXZhbHVlID0gLUVPUE5PVFNVUFA7CiAJCQkJCX0KIAkJCQkJaWYgKHZhbHVlID09IDApIHsKIAkJCQkJCWR1bS0+ZGV2c3RhdHVzIHw9Ci0JCQkJCQkJKDEgPDwgc2V0dXAud1ZhbHVlKTsKKwkJCQkJCQkoMSA8PCB3X3ZhbHVlKTsKIAkJCQkJCW1heWJlX3NldF9zdGF0dXMgKHVyYiwgMCk7CiAJCQkJCX0KIAogCQkJCX0gZWxzZSBpZiAoc2V0dXAuYlJlcXVlc3RUeXBlID09IEVwX1JlcXVlc3QpIHsKIAkJCQkJLy8gZW5kcG9pbnQgaGFsdAotCQkJCQllcDIgPSBmaW5kX2VuZHBvaW50IChkdW0sCi0JCQkJCQkJc2V0dXAud0luZGV4KTsKKwkJCQkJZXAyID0gZmluZF9lbmRwb2ludCAoZHVtLCB3X2luZGV4KTsKIAkJCQkJaWYgKCFlcDIpIHsKIAkJCQkJCXZhbHVlID0gLUVPUE5PVFNVUFA7CiAJCQkJCQlicmVhazsKQEAgLTEyMzksNyArMTQxNiw3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKIAkJCQlpZiAoc2V0dXAuYlJlcXVlc3RUeXBlID09IERldl9SZXF1ZXN0KSB7Ci0JCQkJCXN3aXRjaCAoc2V0dXAud1ZhbHVlKSB7CisJCQkJCXN3aXRjaCAod192YWx1ZSkgewogCQkJCQljYXNlIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKIAkJCQkJCWR1bS0+ZGV2c3RhdHVzICY9IH4oMSA8PAogCQkJCQkJCVVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCk7CkBAIC0xMjUyLDggKzE0MjksNyBAQAogCQkJCQl9CiAJCQkJfSBlbHNlIGlmIChzZXR1cC5iUmVxdWVzdFR5cGUgPT0gRXBfUmVxdWVzdCkgewogCQkJCQkvLyBlbmRwb2ludCBoYWx0Ci0JCQkJCWVwMiA9IGZpbmRfZW5kcG9pbnQgKGR1bSwKLQkJCQkJCQlzZXR1cC53SW5kZXgpOworCQkJCQllcDIgPSBmaW5kX2VuZHBvaW50IChkdW0sIHdfaW5kZXgpOwogCQkJCQlpZiAoIWVwMikgewogCQkJCQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKIAkJCQkJCWJyZWFrOwpAQCAtMTI3OSw3ICsxNDU1LDcgQEAKIAkJCQkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IDApIHsKIAkJCQkJCWlmIChzZXR1cC5iUmVxdWVzdFR5cGUgPT0KIAkJCQkJCQkJRXBfSW5SZXF1ZXN0KSB7Ci0JZXAyID0gZmluZF9lbmRwb2ludCAoZHVtLCBzZXR1cC53SW5kZXgpOworCWVwMiA9IGZpbmRfZW5kcG9pbnQgKGR1bSwgd19pbmRleCk7CiAJaWYgKCFlcDIpIHsKIAkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CkBAIC0xMzIxLDcgKzE0OTcsNyBAQAogCiAJCQlpZiAodmFsdWUgPCAwKSB7CiAJCQkJaWYgKHZhbHVlICE9IC1FT1BOT1RTVVBQKQotCQkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwKKwkJCQkJZGV2X2RiZyAodWRjX2RldihkdW0pLAogCQkJCQkJInNldHVwIC0tPiAlZFxuIiwKIAkJCQkJCXZhbHVlKTsKIAkJCQltYXliZV9zZXRfc3RhdHVzICh1cmIsIC1FUElQRSk7CkBAIC0xMzc3LDEyICsxNTUzLDEyIEBACiAJCWdvdG8gcmVzdGFydDsKIAl9CiAKLQkvKiB3YW50IGEgMSBtc2VjIGRlbGF5IGhlcmUgKi8KLQlpZiAoIWxpc3RfZW1wdHkgKCZkdW0tPnVyYnBfbGlzdCkpCi0JCW1vZF90aW1lciAoJmR1bS0+dGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQllbHNlIHsKKwlpZiAobGlzdF9lbXB0eSAoJmR1bS0+dXJicF9saXN0KSkgewogCQl1c2JfcHV0X2RldiAoZHVtLT51ZGV2KTsKIAkJZHVtLT51ZGV2ID0gTlVMTDsKKwl9IGVsc2UgaWYgKGR1bS0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfUlVOTklORykgeworCQkvKiB3YW50IGEgMSBtc2VjIGRlbGF5IGhlcmUgKi8KKwkJbW9kX3RpbWVyICgmZHVtLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKQEAgLTEzOTEsMjkgKzE1NjcsMzkgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNkZWZpbmUgUE9SVF9DX01BU0sgXAotCSAoKDEgPDwgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pIFwKLQl8ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEUpIFwKLQl8ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EKSBcCi0JfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UKSBcCi0JfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfUkVTRVQpKQorCSgoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gXAorCXwgVVNCX1BPUlRfU1RBVF9DX0VOQUJMRSBcCisJfCBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCBcCisJfCBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQgXAorCXwgVVNCX1BPUlRfU1RBVF9DX1JFU0VUKSA8PCAxNikKIAogc3RhdGljIGludCBkdW1teV9odWJfc3RhdHVzIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGR1bW15CQkqZHVtOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCXJldHZhbDsKKwlpbnQJCQlyZXR2YWwgPSAwOwogCiAJZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShkdW0tPnBvcnRfc3RhdHVzICYgUE9SVF9DX01BU0spKQotCQlyZXR2YWwgPSAwOwotCWVsc2UgeworCWlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX1JVTk5JTkcpCisJCWdvdG8gZG9uZTsKKworCWlmIChkdW0tPnJlc3VtaW5nICYmIHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsIGR1bS0+cmVfdGltZW91dCkpIHsKKwkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpOworCQlkdW0tPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CisJCXNldF9saW5rX3N0YXRlIChkdW0pOworCX0KKworCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFBPUlRfQ19NQVNLKSAhPSAwKSB7CiAJCSpidWYgPSAoMSA8PCAxKTsKIAkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJwb3J0IHN0YXR1cyAweCUwOHggaGFzIGNoYW5nZXNcbiIsCi0JCQlkdW0tPnBvcnRfc3RhdHVzKTsKKwkJCQlkdW0tPnBvcnRfc3RhdHVzKTsKIAkJcmV0dmFsID0gMTsKKwkJaWYgKGR1bS0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfU1VTUEVOREVEKQorCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKGhjZCk7CiAJfQorZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE0MjQsNyArMTYxMCw4IEBACiAJbWVtc2V0IChkZXNjLCAwLCBzaXplb2YgKmRlc2MpOwogCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CiAJZGVzYy0+YkRlc2NMZW5ndGggPSA5OwotCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAwMDEpOworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSAoX19mb3JjZSBfX3UxNikKKwkJCShfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAwMDEpKTsKIAlkZXNjLT5iTmJyUG9ydHMgPSAxOwogCWRlc2MtPmJpdG1hcCBbMF0gPSAweGZmOwogCWRlc2MtPmJpdG1hcCBbMV0gPSAweGZmOwpAQCAtMTQ0Miw2ICsxNjI5LDkgQEAKIAlpbnQJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAorCWlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybiAtRVRJTUVET1VUOworCiAJZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwogCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CiAJc3dpdGNoICh0eXBlUmVxKSB7CkBAIC0xNDUwLDI3ICsxNjQwLDI3IEBACiAJY2FzZSBDbGVhclBvcnRGZWF0dXJlOgogCQlzd2l0Y2ggKHdWYWx1ZSkgewogCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLQkJCWlmIChkdW0tPnBvcnRfc3RhdHVzICYgKDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EKSkgeworCQkJaWYgKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpIHsKIAkJCQkvKiAyMG1zZWMgcmVzdW1lIHNpZ25hbGluZyAqLwogCQkJCWR1bS0+cmVzdW1pbmcgPSAxOwogCQkJCWR1bS0+cmVfdGltZW91dCA9IGppZmZpZXMgKwotCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJCQkJbXNlY3NfdG9famlmZmllcygyMCk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgotCQkJZHVtLT5wb3J0X3N0YXR1cyA9IDA7Ci0JCQlkdW0tPnJlc3VtaW5nID0gMDsKLQkJCXN0b3BfYWN0aXZpdHkoZHVtLCBkdW0tPmRyaXZlcik7Ci0JCQlicmVhazsKKwkJCWlmIChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9QT1dFUikKKwkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgInBvd2VyLW9mZlxuIik7CisJCQkvKiBGQUxMUyBUSFJPVUdIICovCiAJCWRlZmF1bHQ6CiAJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oMSA8PCB3VmFsdWUpOworCQkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgogCQlodWJfZGVzY3JpcHRvciAoKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKikgYnVmKTsKIAkJYnJlYWs7CiAJY2FzZSBHZXRIdWJTdGF0dXM6Ci0JCSoodTMyICopIGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkqKF9fbGUzMiAqKSBidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJYnJlYWs7CiAJY2FzZSBHZXRQb3J0U3RhdHVzOgogCQlpZiAod0luZGV4ICE9IDEpCkBAIC0xNDc5LDIzICsxNjY5LDE2IEBACiAJCS8qIHdob2V2ZXIgcmVzZXRzIG9yIHJlc3VtZXMgbXVzdCBHZXRQb3J0U3RhdHVzIHRvCiAJCSAqIGNvbXBsZXRlIGl0ISEKIAkJICovCi0JCWlmIChkdW0tPnJlc3VtaW5nICYmIHRpbWVfYWZ0ZXIgKGppZmZpZXMsIGR1bS0+cmVfdGltZW91dCkpIHsKLQkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQpOwotCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EKTsKLQkJCWR1bS0+cmVzdW1pbmcgPSAwOwotCQkJZHVtLT5yZV90aW1lb3V0ID0gMDsKLQkJCWlmIChkdW0tPmRyaXZlciAmJiBkdW0tPmRyaXZlci0+cmVzdW1lKSB7Ci0JCQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOwotCQkJCWR1bS0+ZHJpdmVyLT5yZXN1bWUgKCZkdW0tPmdhZGdldCk7Ci0JCQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKLQkJCX0KKwkJaWYgKGR1bS0+cmVzdW1pbmcgJiYKKwkJCQl0aW1lX2FmdGVyX2VxIChqaWZmaWVzLCBkdW0tPnJlX3RpbWVvdXQpKSB7CisJCQlkdW0tPnBvcnRfc3RhdHVzIHw9IChVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCA8PCAxNik7CisJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CiAJCX0KLQkJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgKDEgPDwgVVNCX1BPUlRfRkVBVF9SRVNFVCkpICE9IDAKLQkJCQkmJiB0aW1lX2FmdGVyIChqaWZmaWVzLCBkdW0tPnJlX3RpbWVvdXQpKSB7Ci0JCQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19SRVNFVCk7Ci0JCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oMSA8PCBVU0JfUE9SVF9GRUFUX1JFU0VUKTsKLQkJCWR1bS0+cmVfdGltZW91dCA9IDA7Ci0JCQlpZiAoZHVtLT5kcml2ZXIpIHsKKwkJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9SRVNFVCkgIT0gMCAmJgorCQkJCXRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsIGR1bS0+cmVfdGltZW91dCkpIHsKKwkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gKFVTQl9QT1JUX1NUQVRfQ19SRVNFVCA8PCAxNik7CisJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1JFU0VUOworCQkJaWYgKGR1bS0+cHVsbHVwKSB7CiAJCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0VOQUJMRTsKIAkJCQkvKiBnaXZlIGl0IHRoZSBiZXN0IHNwZWVkIHdlIGFncmVlIG9uICovCiAJCQkJZHVtLT5nYWRnZXQuc3BlZWQgPSBkdW0tPmRyaXZlci0+c3BlZWQ7CkBAIC0xNTE2LDggKzE2OTksOSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQkoKHUxNiAqKSBidWYpWzBdID0gY3B1X3RvX2xlMTYgKGR1bS0+cG9ydF9zdGF0dXMpOwotCQkoKHUxNiAqKSBidWYpWzFdID0gY3B1X3RvX2xlMTYgKGR1bS0+cG9ydF9zdGF0dXMgPj4gMTYpOworCQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwkJKChfX2xlMTYgKikgYnVmKVswXSA9IGNwdV90b19sZTE2IChkdW0tPnBvcnRfc3RhdHVzKTsKKwkJKChfX2xlMTYgKikgYnVmKVsxXSA9IGNwdV90b19sZTE2IChkdW0tPnBvcnRfc3RhdHVzID4+IDE2KTsKIAkJYnJlYWs7CiAJY2FzZSBTZXRIdWJGZWF0dXJlOgogCQlyZXR2YWwgPSAtRVBJUEU7CkBAIC0xNTI1LDM2ICsxNzA5LDM3IEBACiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKIAkJc3dpdGNoICh3VmFsdWUpIHsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6Ci0JCQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiAoMSA8PCBVU0JfUE9SVF9GRUFUX1NVU1BFTkQpKQotCQkJCQk9PSAwKSB7Ci0JCQkJZHVtLT5wb3J0X3N0YXR1cyB8PQotCQkJCQkJKDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EKTsKLQkJCQlpZiAoZHVtLT5kcml2ZXIgJiYgZHVtLT5kcml2ZXItPnN1c3BlbmQpIHsKLQkJCQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOwotCQkJCQlkdW0tPmRyaXZlci0+c3VzcGVuZCAoJmR1bS0+Z2FkZ2V0KTsKLQkJCQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKLQkJCQl9CisJCQlpZiAoZHVtLT5hY3RpdmUpIHsKKwkJCQlkdW0tPnBvcnRfc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfU1VTUEVORDsKKworCQkJCS8qIEhOUCB3b3VsZCBoYXBwZW4gaGVyZTsgZm9yIG5vdyB3ZQorCQkJCSAqIGFzc3VtZSBiX2J1c19yZXEgaXMgYWx3YXlzIHRydWUuCisJCQkJICovCisJCQkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJCQkJaWYgKCgoMSA8PCBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRSkKKwkJCQkJCSYgZHVtLT5kZXZzdGF0dXMpICE9IDApCisJCQkJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLAorCQkJCQkJCSJubyBITlAgeWV0IVxuIik7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX1BPV0VSOworCQkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgotCQkJLyogaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIGRpc2Nvbm5lY3QgZmlyc3QgKi8KLQkJCWlmIChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpIHsKLQkJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9FTkFCTEUKLQkJCQkJCXwgVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQKLQkJCQkJCXwgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKTsKLQkJCQlpZiAoZHVtLT5kcml2ZXIpIHsKLQkJCQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksCi0JCQkJCQkJImRpc2Nvbm5lY3RcbiIpOwotCQkJCQlzdG9wX2FjdGl2aXR5IChkdW0sIGR1bS0+ZHJpdmVyKTsKLQkJCQl9Ci0KLQkJCQkvKiBGSVhNRSB0ZXN0IHRoYXQgY29kZSBwYXRoISAqLwotCQkJfQorCQkJLyogaWYgaXQncyBhbHJlYWR5IGVuYWJsZWQsIGRpc2FibGUgKi8KKwkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0VOQUJMRQorCQkJCQl8IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECisJCQkJCXwgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKTsKKwkJCWR1bS0+ZGV2c3RhdHVzID0gMDsKIAkJCS8qIDUwbXNlYyByZXNldCBzaWduYWxpbmcgKi8KIAkJCWR1bS0+cmVfdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKTsKLQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkvKiBGQUxMUyBUSFJPVUdIICovCiAJCWRlZmF1bHQ6Ci0JCQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IHdWYWx1ZSk7CisJCQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1BPV0VSKSAhPSAwKSB7CisJCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCB3VmFsdWUpOworCQkJCXNldF9saW5rX3N0YXRlIChkdW0pOworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC0xNTY3LDkgKzE3NTIsMzUgQEAKIAkJcmV0dmFsID0gLUVQSVBFOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBQT1JUX0NfTUFTSykgIT0gMCkKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoaGNkKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IGR1bW15X2h1Yl9zdXNwZW5kIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBkdW1teSAqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCisJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CisJZHVtLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1NVU1BFTkRFRDsKKwlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15X2h1Yl9yZXN1bWUgKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGR1bW15ICpkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CisKKwlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlkdW0tPnJoX3N0YXRlID0gRFVNTVlfUkhfUlVOTklORzsKKwlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmR1bS0+dXJicF9saXN0KSkKKwkJbW9kX3RpbWVyICgmZHVtLT50aW1lciwgamlmZmllcyk7CisJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTYyNSw4ICsxODM2LDYgQEAKIHN0YXRpYyBpbnQgZHVtbXlfc3RhcnQgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGR1bW15CQkqZHVtOwotCXN0cnVjdCB1c2JfZGV2aWNlCSpyb290OwotCWludAkJCXJldHZhbDsKIAogCWR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKIApAQCAtMTYzOSwzOCArMTg0OCwyMiBAQAogCWluaXRfdGltZXIgKCZkdW0tPnRpbWVyKTsKIAlkdW0tPnRpbWVyLmZ1bmN0aW9uID0gZHVtbXlfdGltZXI7CiAJZHVtLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGR1bTsKKwlkdW0tPnJoX3N0YXRlID0gRFVNTVlfUkhfUlVOTklORzsKIAogCUlOSVRfTElTVF9IRUFEICgmZHVtLT51cmJwX2xpc3QpOwogCi0Jcm9vdCA9IHVzYl9hbGxvY19kZXYgKE5VTEwsICZoY2QtPnNlbGYsIDApOwotCWlmICghcm9vdCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiByb290IGh1YiBlbnRlcnMgYWRkcmVzc2VkIHN0YXRlLi4uICovCi0JaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7Ci0Jcm9vdC0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKLQotCS8qIC4uLnRoZW4gY29uZmlndXJlZCwgc28ga2h1YmQgc2VlcyB1cy4gKi8KLQlpZiAoKHJldHZhbCA9IHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIgKHJvb3QsIGhjZCkpICE9IDApIHsKLQkJZ290byBlcnIxOwotCX0KLQogCS8qIG9ubHkgc2hvdyBhIGxvdy1wb3dlciBwb3J0OiBqdXN0IDhtQSAqLwotCWh1Yl9zZXRfcG93ZXJfYnVkZ2V0IChyb290LCA4KTsKKwloY2QtPnBvd2VyX2J1ZGdldCA9IDg7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKIAotCWlmICgocmV0dmFsID0gZHVtbXlfcmVnaXN0ZXJfdWRjIChkdW0pKSAhPSAwKQotCQlnb3RvIGVycjI7CisjaWZkZWYgQ09ORklHX1VTQl9PVEcKKwloY2QtPnNlbGYub3RnX3BvcnQgPSAxOworI2VuZGlmCiAKIAkvKiBGSVhNRSAndXJicycgc2hvdWxkIGJlIGEgcGVyLWRldmljZSB0aGluZywgbWF5YmUgaW4gdXNiY29yZSAqLwogCWRldmljZV9jcmVhdGVfZmlsZSAoZHVtbXlfZGV2KGR1bSksICZkZXZfYXR0cl91cmJzKTsKIAlyZXR1cm4gMDsKLQotIGVycjI6Ci0JdXNiX2Rpc2Nvbm5lY3QgKCZoY2QtPnNlbGYucm9vdF9odWIpOwotIGVycjE6Ci0JdXNiX3B1dF9kZXYgKHJvb3QpOwotCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9RVUlFU0NJTkc7Ci0JcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgZHVtbXlfc3RvcCAoc3RydWN0IHVzYl9oY2QgKmhjZCkKQEAgLTE2ODAsMTAgKzE4NzMsNyBAQAogCWR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKIAogCWRldmljZV9yZW1vdmVfZmlsZSAoZHVtbXlfZGV2KGR1bSksICZkZXZfYXR0cl91cmJzKTsKLQogCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIgKGR1bS0+ZHJpdmVyKTsKLQlkdW1teV91bnJlZ2lzdGVyX3VkYyAoZHVtKTsKLQogCWRldl9pbmZvIChkdW1teV9kZXYoZHVtKSwgInN0b3BwZWRcbiIpOwogfQogCkBAIC0xNzExLDkgKzE5MDEsMTEgQEAKIAogCS5odWJfc3RhdHVzX2RhdGEgPSAJZHVtbXlfaHViX3N0YXR1cywKIAkuaHViX2NvbnRyb2wgPSAJCWR1bW15X2h1Yl9jb250cm9sLAorCS5odWJfc3VzcGVuZCA9CQlkdW1teV9odWJfc3VzcGVuZCwKKwkuaHViX3Jlc3VtZSA9CQlkdW1teV9odWJfcmVzdW1lLAogfTsKIAotc3RhdGljIGludCBkdW1teV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBkdW1teV9oY2RfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKIAlpbnQJCQlyZXR2YWw7CkBAIC0xNzMzLDcgKzE5MjUsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBkdW1teV9oY2RfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CiAKQEAgLTE3NDEsMzUgKzE5MzMsODcgQEAKIAl1c2JfcmVtb3ZlX2hjZCAoaGNkKTsKIAl1c2JfcHV0X2hjZCAoaGNkKTsKIAl0aGVfY29udHJvbGxlciA9IE5VTEw7CisJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHVtbXlfaGNkX3N1c3BlbmQgKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLAorCQl1MzIgbGV2ZWwpCit7CisJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9ESVNBQkxFKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWhjZCA9IGRldl9nZXRfZHJ2ZGF0YSAoZGV2KTsKKworI2lmbmRlZiBDT05GSUdfVVNCX1NVU1BFTkQKKwkvKiBPdGhlcndpc2UgdGhpcyB3b3VsZCBuZXZlciBoYXBwZW4gKi8KKwl1c2JfbG9ja19kZXZpY2UgKGhjZC0+c2VsZi5yb290X2h1Yik7CisJZHVtbXlfaHViX3N1c3BlbmQgKGhjZCk7CisJdXNiX3VubG9ja19kZXZpY2UgKGhjZC0+c2VsZi5yb290X2h1Yik7CisjZW5kaWYKKworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfaGNkX3Jlc3VtZSAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisKKwlpZiAobGV2ZWwgIT0gUkVTVU1FX0VOQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwloY2QgPSBkZXZfZ2V0X2RydmRhdGEgKGRldik7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisKKyNpZm5kZWYgQ09ORklHX1VTQl9TVVNQRU5ECisJLyogT3RoZXJ3aXNlIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuICovCisJdXNiX2xvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpOworCWR1bW15X2h1Yl9yZXN1bWUgKGhjZCk7CisJdXNiX3VubG9ja19kZXZpY2UgKGhjZC0+c2VsZi5yb290X2h1Yik7CisjZW5kaWYKKworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGhjZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkdW1teV9oY2RfZHJpdmVyID0geworCS5uYW1lCQk9IChjaGFyICopIGRyaXZlcl9uYW1lLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBkdW1teV9oY2RfcHJvYmUsCisJLnJlbW92ZQkJPSBkdW1teV9oY2RfcmVtb3ZlLAorCS5zdXNwZW5kCT0gZHVtbXlfaGNkX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBkdW1teV9oY2RfcmVzdW1lLAorfTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBkdW1teV9wZGV2X2RldGVjdCAodm9pZCkKLXsKLQlpbnQJCQlyZXR2YWw7CisvKiBUaGVzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGJlY2F1c2UgdGhlIHBkZXYgc3RydWN0dXJlcyBhcmUKKyAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiAqLworc3RhdGljIHZvaWQKK2R1bW15X3VkY19yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CiAKLQlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIgKCZkdW1teV9kcml2ZXIpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOworc3RhdGljIHZvaWQKK2R1bW15X2hjZF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CiAKLQl0aGVfcGRldi5uYW1lID0gImhjIjsKLQl0aGVfcGRldi5kZXYuZHJpdmVyID0gJmR1bW15X2RyaXZlcjsKLQl0aGVfcGRldi5kZXYucmVsZWFzZSA9IGR1bW15X3BkZXZfcmVsZWFzZTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQl0aGVfdWRjX3BkZXYgPSB7CisJLm5hbWUJCT0gKGNoYXIgKikgZ2FkZ2V0X25hbWUsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucmVsZWFzZQk9IGR1bW15X3VkY19yZWxlYXNlLAorCX0sCit9OwogCi0JcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyICgmdGhlX3BkZXYpOwotCWlmIChyZXR2YWwgPCAwKQotCQlkcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X2RyaXZlcik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgZHVtbXlfcGRldl9yZW1vdmUgKHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKCZ0aGVfcGRldik7Ci0JZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV9kcml2ZXIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCXRoZV9oY2RfcGRldiA9IHsKKwkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5yZWxlYXNlCT0gZHVtbXlfaGNkX3JlbGVhc2UsCisJfSwKK307CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQgKHZvaWQpCiB7CkBAIC0xNzc3LDE3ICsyMDIxLDM5IEBACiAKIAlpZiAodXNiX2Rpc2FibGVkICgpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoKHJldHZhbCA9IGR1bW15X3BkZXZfZGV0ZWN0ICgpKSAhPSAwKQorCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyICgmZHVtbXlfaGNkX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7Ci0JaWYgKChyZXR2YWwgPSBkdW1teV9wcm9iZSAoJnRoZV9wZGV2LmRldikpICE9IDApCi0JCWR1bW15X3BkZXZfcmVtb3ZlICgpOworCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyICgmZHVtbXlfdWRjX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyX3JlZ2lzdGVyX3VkY19kcml2ZXI7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgKCZ0aGVfaGNkX3BkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl9oY2Q7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgKCZ0aGVfdWRjX3BkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl91ZGM7CisJcmV0dXJuIHJldHZhbDsKKworZXJyX3JlZ2lzdGVyX3VkYzoKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlciAoJnRoZV9oY2RfcGRldik7CitlcnJfcmVnaXN0ZXJfaGNkOgorCWRyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfdWRjX2RyaXZlcik7CitlcnJfcmVnaXN0ZXJfdWRjX2RyaXZlcjoKKwlkcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOwogCXJldHVybiByZXR2YWw7CiB9CiBtb2R1bGVfaW5pdCAoaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwICh2b2lkKQogewotCWR1bW15X3JlbW92ZSAoJnRoZV9wZGV2LmRldik7Ci0JZHVtbXlfcGRldl9yZW1vdmUgKCk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKCZ0aGVfdWRjX3BkZXYpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX2hjZF9wZGV2KTsKKwlkcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X3VkY19kcml2ZXIpOworCWRyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfaGNkX2RyaXZlcik7CiB9CiBtb2R1bGVfZXhpdCAoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDNmNzgzY2IuLjg1MDllOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC04NCwxOCArODQsMTkgQEAKICAqLwogCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiRXRoZXJuZXQgR2FkZ2V0IgotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIkVxdWlub3ggMjAwNCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJNYXkgRGF5IDIwMDUiCiAKIHN0YXRpYyBjb25zdCBjaGFyIHNob3J0bmFtZSBbXSA9ICJldGhlciI7CiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfZGVzYyBbXSA9IERSSVZFUl9ERVNDOwogCiAjZGVmaW5lIFJYX0VYVFJBCTIwCQkvKiBndWFyZCBhZ2FpbnN0IHJ4IG92ZXJmbG93cyAqLwogCi0jaWZkZWYJQ09ORklHX1VTQl9FVEhfUk5ESVMKICNpbmNsdWRlICJybmRpcy5oIgotI2Vsc2UKLSNkZWZpbmUgcm5kaXNfaW5pdCgpIDAKLSNkZWZpbmUgcm5kaXNfZXhpdCgpIGRve313aGlsZSgwKQorCisjaWZuZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCisjZGVmaW5lIHJuZGlzX3VuaW5pdCh4KQkJZG97fXdoaWxlKDApCisjZGVmaW5lIHJuZGlzX2RlcmVnaXN0ZXIoYykJZG97fXdoaWxlKDApCisjZGVmaW5lIHJuZGlzX2V4aXQoKQkJZG97fXdoaWxlKDApCiAjZW5kaWYKIAogLyogQ0RDIGFuZCBSTkRJUyBzdXBwb3J0IHRoZSBzYW1lIGhvc3QtY2hvc2VuIG91dGdvaW5nIHBhY2tldCBmaWx0ZXJzLiAqLwpAQCAtMTQwLDkgKzE0MSw2IEBACiAgKiBJdCBhbHNvIEFTU1VNRVMgYSBzZWxmLXBvd2VyZWQgZGV2aWNlLCB3aXRob3V0IHJlbW90ZSB3YWtldXAsCiAgKiBhbHRob3VnaCByZW1vdGUgd2FrZXVwIHN1cHBvcnQgd291bGQgbWFrZSBzZW5zZS4KICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKkVQX0lOX05BTUU7Ci1zdGF0aWMgY29uc3QgY2hhciAqRVBfT1VUX05BTUU7Ci1zdGF0aWMgY29uc3QgY2hhciAqRVBfU1RBVFVTX05BTUU7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMxMiw2ICszMTAsNyBAQAogI2RlZmluZQlGU19CUFMJCSgxOSAqICA2NCAqIDEgKiAxMDAwICogOCkKIAogI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRAorI2RlZmluZQlERVZTUEVFRAlVU0JfU1BFRURfSElHSAogCiBzdGF0aWMgdW5zaWduZWQgcW11bHQgPSA1OwogbW9kdWxlX3BhcmFtIChxbXVsdCwgdWludCwgU19JUlVHT3xTX0lXVVNSKTsKQEAgLTMzMCw2ICszMjksOCBAQAogfQogCiAjZWxzZQkvKiBmdWxsIHNwZWVkIChsb3cgc3BlZWQgZG9lc24ndCBkbyBidWxrKSAqLworI2RlZmluZQlERVZTUEVFRAlVU0JfU1BFRURfRlVMTAorCiAjZGVmaW5lIHFsZW4oZ2FkZ2V0KSBERUZBVUxUX1FMRU4KIAogc3RhdGljIGlubGluZSBpbnQgQklUUkFURShzdHJ1Y3QgdXNiX2dhZGdldCAqZykKQEAgLTM5NSw3ICszOTYsOCBAQAogI2RlZmluZSBTVFJJTkdfU1VCU0VUCQkJOAogI2RlZmluZSBTVFJJTkdfUk5ESVMJCQk5CiAKLSNkZWZpbmUgVVNCX0JVRlNJWgkyNTYJCS8qIGhvbGRzIG91ciBiaWdnZXN0IGRlc2NyaXB0b3IgKi8KKy8qIGhvbGRzIG91ciBiaWdnZXN0IGRlc2NyaXB0b3IgKG9yIFJORElTIHJlc3BvbnNlKSAqLworI2RlZmluZSBVU0JfQlVGU0laCTI1NgogCiAvKgogICogVGhpcyBkZXZpY2UgYWR2ZXJ0aXNlcyBvbmUgY29uZmlndXJhdGlvbiwgZXRoX2NvbmZpZywgdW5sZXNzIFJORElTCkBAIC01MzgsNyArNTQwLDcgQEAKIAkuYkRhdGFJbnRlcmZhY2UgPSAJMHgwMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciBhY21fZGVzY3JpcHRvciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciBhY21fZGVzY3JpcHRvciA9IHsKIAkuYkxlbmd0aCA9ICAJCXNpemVvZiBhY21fZGVzY3JpcHRvciwKIAkuYkRlc2NyaXB0b3JUeXBlID0gCVVTQl9EVF9DU19JTlRFUkZBQ0UsCiAJLmJEZXNjcmlwdG9yU3ViVHlwZSA9IAlVU0JfQ0RDX0FDTV9UWVBFLApAQCAtODQ2LDcgKzg0OCw3IEBACiAjZWxzZQogCiAvKiBpZiB0aGVyZSdzIG5vIGhpZ2ggc3BlZWQgc3VwcG9ydCwgbWF4cGFja2V0IGRvZXNuJ3QgY2hhbmdlLiAqLwotI2RlZmluZSBlcF9kZXNjKGcsaHMsZnMpIGZzCisjZGVmaW5lIGVwX2Rlc2MoZyxocyxmcykgKCgodm9pZCkoZykpLCAoZnMpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGhzX3N1YnNldF9kZXNjcmlwdG9ycyh2b2lkKQogewpAQCAtOTQzLDEzICs5NDUsMzYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBpbnQgZ2ZwX2ZsYWdzKTsKLXN0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdHMgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG4sIGludCBnZnBfZmxhZ3MpOworc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpOworc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKIAotI2lmZGVmCURFVl9DT05GSUdfQ0RDCi1zdGF0aWMgaW5saW5lIGludCBldGhlcl9hbHRfZXBfc2V0dXAgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHN0cnVjdCB1c2JfZXAgKmVwKQorc3RhdGljIGludAorc2V0X2V0aGVyX2NvbmZpZyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewotCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqZDsKKwlpbnQJCQkJCXJlc3VsdCA9IDA7CisJc3RydWN0IHVzYl9nYWRnZXQJCQkqZ2FkZ2V0ID0gZGV2LT5nYWRnZXQ7CisKKyNpZiBkZWZpbmVkKERFVl9DT05GSUdfQ0RDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQorCS8qIHN0YXR1cyBlbmRwb2ludCB1c2VkIGZvciBSTkRJUyBhbmQgKG9wdGlvbmFsbHkpIENEQyAqLworCWlmICghc3Vic2V0X2FjdGl2ZShkZXYpICYmIGRldi0+c3RhdHVzX2VwKSB7CisJCWRldi0+c3RhdHVzID0gZXBfZGVzYyAoZ2FkZ2V0LCAmaHNfc3RhdHVzX2Rlc2MsCisJCQkJCQkmZnNfc3RhdHVzX2Rlc2MpOworCQlkZXYtPnN0YXR1c19lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7CisKKwkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZGV2LT5zdGF0dXNfZXAsIGRldi0+c3RhdHVzKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlERUJVRyAoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgCisJCQkJZGV2LT5zdGF0dXNfZXAtPm5hbWUsIHJlc3VsdCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisjZW5kaWYKKworCWRldi0+aW4gPSBlcF9kZXNjIChkZXYtPmdhZGdldCwgJmhzX3NvdXJjZV9kZXNjLCAmZnNfc291cmNlX2Rlc2MpOworCWRldi0+aW5fZXAtPmRyaXZlcl9kYXRhID0gZGV2OworCisJZGV2LT5vdXQgPSBlcF9kZXNjIChkZXYtPmdhZGdldCwgJmhzX3NpbmtfZGVzYywgJmZzX3NpbmtfZGVzYyk7CisJZGV2LT5vdXRfZXAtPmRyaXZlcl9kYXRhID0gZGV2OwogCiAJLyogV2l0aCBDREMsICB0aGUgaG9zdCBpc24ndCBhbGxvd2VkIHRvIHVzZSB0aGVzZSB0d28gZGF0YQogCSAqIGVuZHBvaW50cyBpbiB0aGUgZGVmYXVsdCBhbHRzZXR0aW5nIGZvciB0aGUgaW50ZXJmYWNlLgpAQCAtOTU5LDEzNSArOTg0LDMzIEBACiAJICogYSBzaWRlIGVmZmVjdCBvZiBzZXR0aW5nIGEgcGFja2V0IGZpbHRlci4gIERlYWN0aXZhdGlvbiBpcwogCSAqIGZyb20gUkVNT1RFX05ESVNfSEFMVF9NU0csIHJlc2V0IGZyb20gUkVNT1RFX05ESVNfUkVTRVRfTVNHLgogCSAqLwotCi0JLyogb25lIGVuZHBvaW50IHdyaXRlcyBkYXRhIGJhY2sgSU4gdG8gdGhlIGhvc3QgKi8KLQlpZiAoc3RyY21wIChlcC0+bmFtZSwgRVBfSU5fTkFNRSkgPT0gMCkgewotCQlkID0gZXBfZGVzYyAoZGV2LT5nYWRnZXQsICZoc19zb3VyY2VfZGVzYywgJmZzX3NvdXJjZV9kZXNjKTsKLQkJZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCQlkZXYtPmluID0gZDsKLQotCS8qIG9uZSBlbmRwb2ludCBqdXN0IHJlYWRzIE9VVCBwYWNrZXRzICovCi0JfSBlbHNlIGlmIChzdHJjbXAgKGVwLT5uYW1lLCBFUF9PVVRfTkFNRSkgPT0gMCkgewotCQlkID0gZXBfZGVzYyAoZGV2LT5nYWRnZXQsICZoc19zaW5rX2Rlc2MsICZmc19zaW5rX2Rlc2MpOwotCQllcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JCWRldi0+b3V0ID0gZDsKLQotCS8qIG9wdGlvbmFsIHN0YXR1cy9ub3RpZmljYXRpb24gZW5kcG9pbnQgKi8KLQl9IGVsc2UgaWYgKEVQX1NUQVRVU19OQU1FICYmCi0JCQlzdHJjbXAgKGVwLT5uYW1lLCBFUF9TVEFUVVNfTkFNRSkgPT0gMCkgewotCQlpbnQJCQlyZXN1bHQ7Ci0KLQkJZCA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc3RhdHVzX2Rlc2MsICZmc19zdGF0dXNfZGVzYyk7Ci0JCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGVwLCBkKTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWVwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQkJZGV2LT5zdGF0dXMgPSBkOwotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0jaWYJZGVmaW5lZChERVZfQ09ORklHX1NVQlNFVCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKLXN0YXRpYyBpbmxpbmUgaW50IGV0aGVyX2VwX3NldHVwIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBzdHJ1Y3QgdXNiX2VwICplcCkKLXsKLQlpbnQJCQkJCXJlc3VsdDsKLQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmQ7Ci0KLQkvKiBDREMgc3Vic2V0IGlzIHNpbXBsZXI6ICBpZiB0aGUgZGV2aWNlIGlzIHRoZXJlLAotCSAqIGl0J3MgbGl2ZSB3aXRoIHJ4IGFuZCB0eCBlbmRwb2ludHMuCi0JICoKLQkgKiBEbyB0aGlzIGFzIGEgc2hvcnRjdXQgZm9yIFJORElTIHRvby4KLQkgKi8KLQotCS8qIG9uZSBlbmRwb2ludCB3cml0ZXMgZGF0YSBiYWNrIElOIHRvIHRoZSBob3N0ICovCi0JaWYgKHN0cmNtcCAoZXAtPm5hbWUsIEVQX0lOX05BTUUpID09IDApIHsKLQkJZCA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc291cmNlX2Rlc2MsICZmc19zb3VyY2VfZGVzYyk7Ci0JCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGVwLCBkKTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWVwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQkJZGV2LT5pbiA9IGQ7Ci0KLQkvKiBvbmUgZW5kcG9pbnQganVzdCByZWFkcyBPVVQgcGFja2V0cyAqLwotCX0gZWxzZSBpZiAoc3RyY21wIChlcC0+bmFtZSwgRVBfT1VUX05BTUUpID09IDApIHsKLQkJZCA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc2lua19kZXNjLCAmZnNfc2lua19kZXNjKTsKLQkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZXAsIGQpOwotCQlpZiAocmVzdWx0IDwgMCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCQlkZXYtPm91dCA9IGQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotc2V0X2V0aGVyX2NvbmZpZyAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGdmcF9mbGFncykKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCB1c2JfZXAJCSplcDsKLQlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0ID0gZGV2LT5nYWRnZXQ7Ci0KLQlnYWRnZXRfZm9yX2VhY2hfZXAgKGVwLCBnYWRnZXQpIHsKLSNpZmRlZglERVZfQ09ORklHX0NEQwotCQlpZiAoIWRldi0+cm5kaXMgJiYgZGV2LT5jZGMpIHsKLQkJCXJlc3VsdCA9IGV0aGVyX2FsdF9lcF9zZXR1cCAoZGV2LCBlcCk7Ci0JCQlpZiAocmVzdWx0ID09IDApCi0JCQkJY29udGludWU7Ci0JCX0KLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9FVEhfUk5ESVMKLQkJaWYgKGRldi0+cm5kaXMgJiYgc3RyY21wIChlcC0+bmFtZSwgRVBfU1RBVFVTX05BTUUpID09IDApIHsKLQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqZDsKLQkJCWQgPSBlcF9kZXNjIChnYWRnZXQsICZoc19zdGF0dXNfZGVzYywgJmZzX3N0YXR1c19kZXNjKTsKLQkJCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGVwLCBkKTsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCWVwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQkJCQlkZXYtPnN0YXR1cyA9IGQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gZWxzZQotI2VuZGlmCi0KLQkJewotI2lmCWRlZmluZWQoREVWX0NPTkZJR19TVUJTRVQpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCi0JCQlyZXN1bHQgPSBldGhlcl9lcF9zZXR1cCAoZGV2LCBlcCk7Ci0JCQlpZiAocmVzdWx0ID09IDApCi0JCQkJY29udGludWU7Ci0jZW5kaWYKKwlpZiAoIWNkY19hY3RpdmUoZGV2KSkgeworCQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlIChkZXYtPmluX2VwLCBkZXYtPmluKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlERUJVRyhkZXYsICJlbmFibGUgJXMgLS0+ICVkXG4iLCAKKwkJCQlkZXYtPmluX2VwLT5uYW1lLCByZXN1bHQpOworCQkJZ290byBkb25lOwogCQl9CiAKLQkJLyogc3RvcCBvbiBlcnJvciAqLwotCQlFUlJPUiAoZGV2LCAiY2FuJ3QgZW5hYmxlICVzLCByZXN1bHQgJWRcbiIsIGVwLT5uYW1lLCByZXN1bHQpOwotCQlicmVhazsKKwkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZGV2LT5vdXRfZXAsIGRldi0+b3V0KTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlERUJVRyAoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgCisJCQkJZGV2LT5pbl9lcC0+bmFtZSwgcmVzdWx0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQogCX0KLQlpZiAoIXJlc3VsdCAmJiAoIWRldi0+aW5fZXAgfHwgIWRldi0+b3V0X2VwKSkKLQkJcmVzdWx0ID0gLUVOT0RFVjsKIAorZG9uZToKIAlpZiAocmVzdWx0ID09IDApCiAJCXJlc3VsdCA9IGFsbG9jX3JlcXVlc3RzIChkZXYsIHFsZW4gKGdhZGdldCksIGdmcF9mbGFncyk7CiAKIAkvKiBvbiBlcnJvciwgZGlzYWJsZSBhbnkgZW5kcG9pbnRzICAqLwogCWlmIChyZXN1bHQgPCAwKSB7Ci0jaWYgZGVmaW5lZChERVZfQ09ORklHX0NEQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKLQkJaWYgKGRldi0+c3RhdHVzKQorCQlpZiAoIXN1YnNldF9hY3RpdmUoZGV2KSkKIAkJCSh2b2lkKSB1c2JfZXBfZGlzYWJsZSAoZGV2LT5zdGF0dXNfZXApOwotI2VuZGlmCiAJCWRldi0+c3RhdHVzID0gTlVMTDsKLSNpZiBkZWZpbmVkKERFVl9DT05GSUdfU1VCU0VUKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQotCQlpZiAoZGV2LT5ybmRpcyB8fCAhZGV2LT5jZGMpIHsKLQkJCWlmIChkZXYtPmluKQotCQkJCSh2b2lkKSB1c2JfZXBfZGlzYWJsZSAoZGV2LT5pbl9lcCk7Ci0JCQlpZiAoZGV2LT5vdXQpCi0JCQkJKHZvaWQpIHVzYl9lcF9kaXNhYmxlIChkZXYtPm91dF9lcCk7Ci0JCX0KLSNlbmRpZgorCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUgKGRldi0+aW5fZXApOworCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUgKGRldi0+b3V0X2VwKTsKIAkJZGV2LT5pbiA9IE5VTEw7CiAJCWRldi0+b3V0ID0gTlVMTDsKIAl9IGVsc2UKQEAgLTEwOTUsOCArMTAxOCw3IEBACiAJLyogYWN0aXZhdGUgbm9uLUNEQyBjb25maWdzIHJpZ2h0IGF3YXkKIAkgKiB0aGlzIGlzbid0IHN0cmljdGx5IGFjY29yZGluZyB0byB0aGUgUk5ESVMgc3BlYwogCSAqLwotI2lmIGRlZmluZWQoREVWX0NPTkZJR19TVUJTRVQpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCi0JaWYgKGRldi0+cm5kaXMgfHwgIWRldi0+Y2RjKSB7CisJaWYgKCFjZGNfYWN0aXZlIChkZXYpKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24gKGRldi0+bmV0KTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcgKGRldi0+bmV0KSkgewogCQkJc3Bpbl91bmxvY2sgKCZkZXYtPmxvY2spOwpAQCAtMTEwNCw3ICsxMDI2LDYgQEAKIAkJCXNwaW5fbG9jayAoJmRldi0+bG9jayk7CiAJCX0KIAl9Ci0jZW5kaWYKIAogCWlmIChyZXN1bHQgPT0gMCkKIAkJREVCVUcgKGRldiwgInFsZW4gJWRcbiIsIHFsZW4gKGdhZGdldCkpOwpAQCAtMTEyNCw2ICsxMDQ1LDcgQEAKIAogCW5ldGlmX3N0b3BfcXVldWUgKGRldi0+bmV0KTsKIAluZXRpZl9jYXJyaWVyX29mZiAoZGV2LT5uZXQpOworCXJuZGlzX3VuaW5pdChkZXYtPnJuZGlzX2NvbmZpZyk7CiAKIAkvKiBkaXNhYmxlIGVuZHBvaW50cywgZm9yY2luZyAoc3luY2hyb25vdXMpIGNvbXBsZXRpb24gb2YKIAkgKiBwZW5kaW5nIGkvby4gIHRoZW4gZnJlZSB0aGUgcmVxdWVzdHMuCkBAIC0xMTUwLDYgKzEwNzIsOCBAQAogCWlmIChkZXYtPnN0YXR1cykgewogCQl1c2JfZXBfZGlzYWJsZSAoZGV2LT5zdGF0dXNfZXApOwogCX0KKwlkZXYtPnJuZGlzID0gMDsKKwlkZXYtPmNkY19maWx0ZXIgPSAwOwogCWRldi0+Y29uZmlnID0gMDsKIH0KIApAQCAtMTE1NywxNCArMTA4MSwxMSBAQAogICogdGhhdCByZXR1cm5zIGNvbmZpZyBkZXNjcmlwdG9ycywgYW5kIGFsdHNldHRpbmcgY29kZS4KICAqLwogc3RhdGljIGludAotZXRoX3NldF9jb25maWcgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgaW50IGdmcF9mbGFncykKK2V0aF9zZXRfY29uZmlnIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBudW1iZXIsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQgPSBkZXYtPmdhZGdldDsKIAotCWlmIChudW1iZXIgPT0gZGV2LT5jb25maWcpCi0JCXJldHVybiAwOwotCiAJaWYgKGdhZGdldF9pc19zYTExMDAgKGdhZGdldCkKIAkJCSYmIGRldi0+Y29uZmlnCiAJCQkmJiBhdG9taWNfcmVhZCAoJmRldi0+dHhfcWxlbikgIT0gMCkgewpAQCAtMTE3NCwxMiArMTA5NSw4IEBACiAJfQogCWV0aF9yZXNldF9jb25maWcgKGRldik7CiAKLQkvKiBkZWZhdWx0OiAgcGFzcyBhbGwgcGFja2V0cywgbm8gbXVsdGljYXN0IGZpbHRlcmluZyAqLwotCWRldi0+Y2RjX2ZpbHRlciA9IERFRkFVTFRfRklMVEVSOwotCiAJc3dpdGNoIChudW1iZXIpIHsKIAljYXNlIERFVl9DT05GSUdfVkFMVUU6Ci0JCWRldi0+cm5kaXMgPSAwOwogCQlyZXN1bHQgPSBzZXRfZXRoZXJfY29uZmlnIChkZXYsIGdmcF9mbGFncyk7CiAJCWJyZWFrOwogI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCkBAIC0xMjE4LDkgKzExMzUsOSBAQAogCQlkZXYtPmNvbmZpZyA9IG51bWJlcjsKIAkJSU5GTyAoZGV2LCAiJXMgc3BlZWQgY29uZmlnICMlZDogJWQgbUEsICVzLCB1c2luZyAlc1xuIiwKIAkJCQlzcGVlZCwgbnVtYmVyLCBwb3dlciwgZHJpdmVyX2Rlc2MsCi0JCQkJZGV2LT5ybmRpcworCQkJCXJuZGlzX2FjdGl2ZShkZXYpCiAJCQkJCT8gIlJORElTIgotCQkJCQk6IChkZXYtPmNkYworCQkJCQk6IChjZGNfYWN0aXZlKGRldikKIAkJCQkJCT8gIkNEQyBFdGhlcm5ldCIKIAkJCQkJCTogIkNEQyBFdGhlcm5ldCBTdWJzZXQiKSk7CiAJfQpAQCAtMTIzMSw2ICsxMTQ4LDEzIEBACiAKICNpZmRlZglERVZfQ09ORklHX0NEQwogCisvKiBUaGUgaW50ZXJydXB0IGVuZHBvaW50IGlzIHVzZWQgaW4gQ0RDIG5ldHdvcmtpbmcgbW9kZWxzIChFdGhlcm5ldCwgQVRNKQorICogb25seSB0byBub3RpZnkgdGhlIGhvc3QgYWJvdXQgbGluayBzdGF0dXMgY2hhbmdlcyAod2hpY2ggd2Ugc3VwcG9ydCkgb3IKKyAqIHJlcG9ydCBjb21wbGV0aW9uIG9mIHNvbWUgZW5jYXBzdWxhdGVkIGNvbW1hbmQgKGFzIHVzZWQgaW4gUk5ESVMpLiAgU2luY2UKKyAqIHdlIHdhbnQgdGhpcyBDREMgRXRoZXJuZXQgY29kZSB0byBiZSB2ZW5kb3ItbmV1dHJhbCwgd2UgZG9uJ3QgdXNlIHRoYXQKKyAqIGNvbW1hbmQgbWVjaGFuaXNtOyBhbmQgb25seSBvbmUgc3RhdHVzIHJlcXVlc3QgaXMgZXZlciBxdWV1ZWQuCisgKi8KKwogc3RhdGljIHZvaWQgZXRoX3N0YXR1c19jb21wbGV0ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbgkqZXZlbnQgPSByZXEtPmJ1ZjsKQEAgLTEyNTksNyArMTE4Myw3IEBACiAJfSBlbHNlIGlmICh2YWx1ZSAhPSAtRUNPTk5SRVNFVCkKIAkJREVCVUcgKGRldiwgImV2ZW50ICUwMnggLS0+ICVkXG4iLAogCQkJZXZlbnQtPmJOb3RpZmljYXRpb25UeXBlLCB2YWx1ZSk7Ci0JZXZlbnQtPmJtUmVxdWVzdFR5cGUgPSAweGZmOworCXJlcS0+Y29udGV4dCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGlzc3VlX3N0YXJ0X3N0YXR1cyAoc3RydWN0IGV0aF9kZXYgKmRldikKQEAgLTEyNzYsNiArMTIwMCw4IEBACiAJICogYSAiY2FuY2VsIHRoZSB3aG9sZSBxdWV1ZSIgcHJpbWl0aXZlIHNpbmNlIGFueQogCSAqIHVubGluay1vbmUgcHJpbWl0aXZlIGhhcyB3YXkgdG9vIG1hbnkgZXJyb3IgbW9kZXMuCiAJICogaGVyZSwgd2UgImtub3ciIHRvZ2dsZSBpcyBhbHJlYWR5IGNsZWFyLi4uCisJICoKKwkgKiBGSVhNRSBpZmYgcmVxLT5jb250ZXh0ICE9IG51bGwganVzdCBkZXF1ZXVlIGl0CiAJICovCiAJdXNiX2VwX2Rpc2FibGUgKGRldi0+c3RhdHVzX2VwKTsKIAl1c2JfZXBfZW5hYmxlIChkZXYtPnN0YXR1c19lcCwgZGV2LT5zdGF0dXMpOwpAQCAtMTI5Miw2ICsxMjE4LDggQEAKIAogCXJlcS0+bGVuZ3RoID0gc2l6ZW9mICpldmVudDsKIAlyZXEtPmNvbXBsZXRlID0gZXRoX3N0YXR1c19jb21wbGV0ZTsKKwlyZXEtPmNvbnRleHQgPSBkZXY7CisKIAl2YWx1ZSA9IHVzYl9lcF9xdWV1ZSAoZGV2LT5zdGF0dXNfZXAsIHJlcSwgR0ZQX0FUT01JQyk7CiAJaWYgKHZhbHVlIDwgMCkKIAkJREVCVUcgKGRldiwgInN0YXR1cyBidWYgcXVldWUgLS0+ICVkXG4iLCB2YWx1ZSk7CkBAIC0xMzUxLDkgKzEyNzksOSBAQAogCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gZ2V0X2dhZGdldF9kYXRhIChnYWRnZXQpOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gZGV2LT5yZXE7CiAJaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQl3SW5kZXggPSAoX19mb3JjZSB1MTYpIGN0cmwtPndJbmRleDsKLQl1MTYJCQl3VmFsdWUgPSAoX19mb3JjZSB1MTYpIGN0cmwtPndWYWx1ZTsKLQl1MTYJCQl3TGVuZ3RoID0gKF9fZm9yY2UgdTE2KSBjdHJsLT53TGVuZ3RoOworCXUxNgkJCXdJbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd1ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKwl1MTYJCQl3TGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAkvKiBkZXNjcmlwdG9ycyBqdXN0IGdvIGludG8gdGhlIHByZS1hbGxvY2F0ZWQgZXAwIGJ1ZmZlciwKIAkgKiB3aGlsZSBjb25maWcgY2hhbmdlIGV2ZW50cyBtYXkgZW5hYmxlIG5ldHdvcmsgdHJhZmZpYy4KQEAgLTE0MjQsNyArMTM1Miw3IEBACiAJCQkJfHwgIWRldi0+Y29uZmlnCiAJCQkJfHwgd0luZGV4ID4gMSkKIAkJCWJyZWFrOwotCQlpZiAoIWRldi0+Y2RjICYmIHdJbmRleCAhPSAwKQorCQlpZiAoIWNkY19hY3RpdmUoZGV2KSAmJiB3SW5kZXggIT0gMCkKIAkJCWJyZWFrOwogCQlzcGluX2xvY2sgKCZkZXYtPmxvY2spOwogCkBAIC0xNDU2LDkgKzEzODQsMTEgQEAKIAogCQkJLyogQ0RDIHJlcXVpcmVzIHRoZSBkYXRhIHRyYW5zZmVycyBub3QgYmUgZG9uZSBmcm9tCiAJCQkgKiB0aGUgZGVmYXVsdCBpbnRlcmZhY2Ugc2V0dGluZyAuLi4gYWxzbywgc2V0dGluZwotCQkJICogdGhlIG5vbi1kZWZhdWx0IGludGVyZmFjZSBjbGVhcnMgZmlsdGVycyBldGMuCisJCQkgKiB0aGUgbm9uLWRlZmF1bHQgaW50ZXJmYWNlIHJlc2V0cyBmaWx0ZXJzIGV0Yy4KIAkJCSAqLwogCQkJaWYgKHdWYWx1ZSA9PSAxKSB7CisJCQkJaWYgKCFjZGNfYWN0aXZlIChkZXYpKQorCQkJCQlicmVhazsKIAkJCQl1c2JfZXBfZW5hYmxlIChkZXYtPmluX2VwLCBkZXYtPmluKTsKIAkJCQl1c2JfZXBfZW5hYmxlIChkZXYtPm91dF9lcCwgZGV2LT5vdXQpOwogCQkJCWRldi0+Y2RjX2ZpbHRlciA9IERFRkFVTFRfRklMVEVSOwpAQCAtMTQ5MiwxMSArMTQyMiwxMSBAQAogCQkJCXx8ICFkZXYtPmNvbmZpZwogCQkJCXx8IHdJbmRleCA+IDEpCiAJCQlicmVhazsKLQkJaWYgKCEoZGV2LT5jZGMgfHwgZGV2LT5ybmRpcykgJiYgd0luZGV4ICE9IDApCisJCWlmICghKGNkY19hY3RpdmUoZGV2KSB8fCBybmRpc19hY3RpdmUoZGV2KSkgJiYgd0luZGV4ICE9IDApCiAJCQlicmVhazsKIAogCQkvKiBmb3IgQ0RDLCBpZmYgY2FycmllciBpcyBvbiwgZGF0YSBpbnRlcmZhY2UgaXMgYWN0aXZlLiAqLwotCQlpZiAoZGV2LT5ybmRpcyB8fCB3SW5kZXggIT0gMSkKKwkJaWYgKHJuZGlzX2FjdGl2ZShkZXYpIHx8IHdJbmRleCAhPSAxKQogCQkJKih1OCAqKXJlcS0+YnVmID0gMDsKIAkJZWxzZQogCQkJKih1OCAqKXJlcS0+YnVmID0gbmV0aWZfY2Fycmllcl9vayAoZGV2LT5uZXQpID8gMSA6IDA7CkBAIC0xNTA5LDggKzE0MzksNyBAQAogCQkgKiB3VmFsdWUgPSBwYWNrZXQgZmlsdGVyIGJpdG1hcAogCQkgKi8KIAkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNCX1RZUEVfQ0xBU1N8VVNCX1JFQ0lQX0lOVEVSRkFDRSkKLQkJCQl8fCAhZGV2LT5jZGMKLQkJCQl8fCBkZXYtPnJuZGlzCisJCQkJfHwgIWNkY19hY3RpdmUoZGV2KQogCQkJCXx8IHdMZW5ndGggIT0gMAogCQkJCXx8IHdJbmRleCA+IDEpCiAJCQlicmVhazsKQEAgLTE1MzQsNyArMTQ2Myw3IEBACiAJICovCiAJY2FzZSBVU0JfQ0RDX1NFTkRfRU5DQVBTVUxBVEVEX0NPTU1BTkQ6CiAJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9UWVBFX0NMQVNTfFVTQl9SRUNJUF9JTlRFUkZBQ0UpCi0JCQkJfHwgIWRldi0+cm5kaXMKKwkJCQl8fCAhcm5kaXNfYWN0aXZlKGRldikKIAkJCQl8fCB3TGVuZ3RoID4gVVNCX0JVRlNJWgogCQkJCXx8IHdWYWx1ZQogCQkJCXx8IHJuZGlzX2NvbnRyb2xfaW50Zi5iSW50ZXJmYWNlTnVtYmVyCkBAIC0xNTQ5LDcgKzE0NzgsNyBAQAogCWNhc2UgVVNCX0NEQ19HRVRfRU5DQVBTVUxBVEVEX1JFU1BPTlNFOgogCQlpZiAoKFVTQl9ESVJfSU58VVNCX1RZUEVfQ0xBU1N8VVNCX1JFQ0lQX0lOVEVSRkFDRSkKIAkJCQkJPT0gY3RybC0+YlJlcXVlc3RUeXBlCi0JCQkJJiYgZGV2LT5ybmRpcworCQkJCSYmIHJuZGlzX2FjdGl2ZShkZXYpCiAJCQkJLy8gJiYgd0xlbmd0aCA+PSAweDA0MDAKIAkJCQkmJiAhd1ZhbHVlCiAJCQkJJiYgcm5kaXNfY29udHJvbF9pbnRmLmJJbnRlcmZhY2VOdW1iZXIKQEAgLTE2NjksNyArMTU5OCw3IEBACiBzdGF0aWMgdm9pZCByeF9jb21wbGV0ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAogc3RhdGljIGludAotcnhfc3VibWl0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgaW50IGdmcF9mbGFncykKK3J4X3N1Ym1pdCAoc3RydWN0IGV0aF9kZXYgKmRldiwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIAlpbnQJCQlyZXR2YWwgPSAtRU5PTUVNOwpAQCAtMTY4OCwxMCArMTYxNyw4IEBACiAJICovCiAJc2l6ZSA9IChzaXplb2YgKHN0cnVjdCBldGhoZHIpICsgZGV2LT5uZXQtPm10dSArIFJYX0VYVFJBKTsKIAlzaXplICs9IGRldi0+b3V0X2VwLT5tYXhwYWNrZXQgLSAxOwotI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCi0JaWYgKGRldi0+cm5kaXMpCisJaWYgKHJuZGlzX2FjdGl2ZShkZXYpKQogCQlzaXplICs9IHNpemVvZiAoc3RydWN0IHJuZGlzX3BhY2tldF9tc2dfdHlwZSk7Ci0jZW5kaWYJCiAJc2l6ZSAtPSBzaXplICUgZGV2LT5vdXRfZXAtPm1heHBhY2tldDsKIAogCWlmICgoc2tiID0gYWxsb2Nfc2tiIChzaXplICsgTkVUX0lQX0FMSUdOLCBnZnBfZmxhZ3MpKSA9PSAwKSB7CkBAIC0xNzM1LDExICsxNjYyLDkgQEAKIAkvKiBub3JtYWwgY29tcGxldGlvbiAqLwogCWNhc2UgMDoKIAkJc2tiX3B1dCAoc2tiLCByZXEtPmFjdHVhbCk7Ci0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKIAkJLyogd2Uga25vdyBNYXhQYWNrZXRzUGVyVHJhbnNmZXIgPT0gMSBoZXJlICovCi0JCWlmIChkZXYtPnJuZGlzKQorCQlpZiAocm5kaXNfYWN0aXZlKGRldikpCiAJCQlzdGF0dXMgPSBybmRpc19ybV9oZHIgKHNrYik7Ci0jZW5kaWYKIAkJaWYgKHN0YXR1cyA8IDAKIAkJCQl8fCBFVEhfSExFTiA+IHNrYi0+bGVuCiAJCQkJfHwgc2tiLT5sZW4gPiBFVEhfRlJBTUVfTEVOKSB7CkBAIC0xNzk5LDcgKzE3MjQsNyBAQAogfQogCiBzdGF0aWMgaW50IHByZWFsbG9jIChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgdXNiX2VwICplcCwKLQkJCXVuc2lnbmVkIG4sIGludCBnZnBfZmxhZ3MpCisJCQl1bnNpZ25lZCBuLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJdW5zaWduZWQJCWk7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CkBAIC0xODM4LDcgKzE3NjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFsbG9jX3JlcXVlc3RzIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBuLCBpbnQgZ2ZwX2ZsYWdzKQorc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWludCBzdGF0dXM7CiAKQEAgLTE4NTQsMTMgKzE3NzksMTEgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCByeF9maWxsIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBpbnQgZ2ZwX2ZsYWdzKQorc3RhdGljIHZvaWQgcnhfZmlsbCAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0JY2xlYXJfYml0IChXT1JLX1JYX01FTU9SWSwgJmRldi0+dG9kbyk7Ci0KIAkvKiBmaWxsIHVudXNlZCByeHEgc2xvdHMgd2l0aCBzb21lIHNrYiAqLwogCXNwaW5fbG9ja19pcnFzYXZlICgmZGV2LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5ICgmZGV2LT5yeF9yZXFzKSkgewpAQCAtMTg4MywxMSArMTgwNiw5IEBACiB7CiAJc3RydWN0IGV0aF9kZXYJCSpkZXYgPSBfZGV2OwogCi0JaWYgKHRlc3RfYml0IChXT1JLX1JYX01FTU9SWSwgJmRldi0+dG9kbykpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0IChXT1JLX1JYX01FTU9SWSwgJmRldi0+dG9kbykpIHsKIAkJaWYgKG5ldGlmX3J1bm5pbmcgKGRldi0+bmV0KSkKIAkJCXJ4X2ZpbGwgKGRldiwgR0ZQX0tFUk5FTCk7Ci0JCWVsc2UKLQkJCWNsZWFyX2JpdCAoV09SS19SWF9NRU1PUlksICZkZXYtPnRvZG8pOwogCX0KIAogCWlmIChkZXYtPnRvZG8pCkBAIC0xOTcxLDggKzE4OTIsNyBAQAogCSAqIG9yIHRoZSBoYXJkd2FyZSBjYW4ndCB1c2Ugc2tiIGJ1ZmZlcnMuCiAJICogb3IgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIGZvciBhbnkgUk5ESVMgaGVhZGVycyB3ZSBuZWVkCiAJICovCi0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKLQlpZiAoZGV2LT5ybmRpcykgeworCWlmIChybmRpc19hY3RpdmUoZGV2KSkgewogCQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiX3JuZGlzOwogCiAJCXNrYl9ybmRpcyA9IHNrYl9yZWFsbG9jX2hlYWRyb29tIChza2IsCkBAIC0xOTg1LDcgKzE5MDUsNiBAQAogCQlybmRpc19hZGRfaGRyIChza2IpOwogCQlsZW5ndGggPSBza2ItPmxlbjsKIAl9Ci0jZW5kaWYKIAlyZXEtPmJ1ZiA9IHNrYi0+ZGF0YTsKIAlyZXEtPmNvbnRleHQgPSBza2I7CiAJcmVxLT5jb21wbGV0ZSA9IHR4X2NvbXBsZXRlOwpAQCAtMjAxOCw5ICsxOTM3LDcgQEAKIAl9CiAKIAlpZiAocmV0dmFsKSB7Ci0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKIGRyb3A6Ci0jZW5kaWYKIAkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCWRldl9rZnJlZV9za2JfYW55IChza2IpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+bG9jaywgZmxhZ3MpOwpAQCAtMjAzNiwyNyArMTk1MywzMSBAQAogCiAjaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKIAotc3RhdGljIHZvaWQgcm5kaXNfc2VuZF9tZWRpYV9zdGF0ZSAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGNvbm5lY3QpCi17Ci0JaWYgKCFkZXYpCi0JCXJldHVybjsKLQkKLQlpZiAoY29ubmVjdCkgewotCQlpZiAocm5kaXNfc2lnbmFsX2Nvbm5lY3QgKGRldi0+cm5kaXNfY29uZmlnKSkKLQkJCXJldHVybjsKLQl9IGVsc2UgewotCQlpZiAocm5kaXNfc2lnbmFsX2Rpc2Nvbm5lY3QgKGRldi0+cm5kaXNfY29uZmlnKSkKLQkJCXJldHVybjsKLQl9Ci19CisvKiBUaGUgaW50ZXJydXB0IGVuZHBvaW50IGlzIHVzZWQgaW4gUk5ESVMgdG8gbm90aWZ5IHRoZSBob3N0IHdoZW4gbWVzc2FnZXMKKyAqIG90aGVyIHRoYW4gZGF0YSBwYWNrZXRzIGFyZSBhdmFpbGFibGUgLi4uIG5vdGFibHkgdGhlIFJFTU9URV9ORElTXypfQ01QTFQKKyAqIG1lc3NhZ2VzLCBidXQgYWxzbyBSRU1PVEVfTkRJU19JTkRJQ0FURV9TVEFUVVNfTVNHIGFuZCBwb3RlbnRpYWxseSBldmVuCisgKiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHLgorICoKKyAqIFRoZSBSTkRJUyBjb250cm9sIHF1ZXVlIGlzIHByb2Nlc3NlZCBieSBHRVRfRU5DQVBTVUxBVEVEX1JFU1BPTlNFLCBhbmQKKyAqIG5vcm1hbGx5IGp1c3Qgb25lIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHF1ZXVlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICpldGhfcmVxX2FsbG9jIChzdHJ1Y3QgdXNiX2VwICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CitzdGF0aWMgdm9pZCBldGhfcmVxX2ZyZWUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CiAKIHN0YXRpYyB2b2lkCiBybmRpc19jb250cm9sX2Fja19jb21wbGV0ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQogeworCXN0cnVjdCBldGhfZGV2ICAgICAgICAgICpkZXYgPSBlcC0+ZHJpdmVyX2RhdGE7CisKIAlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gcmVxLT5sZW5ndGgpCi0JCURFQlVHICgoc3RydWN0IGV0aF9kZXYgKikgZXAtPmRyaXZlcl9kYXRhLAorCQlERUJVRyAoZGV2LAogCQkJInJuZGlzIGNvbnRyb2wgYWNrIGNvbXBsZXRlIC0tPiAlZCwgJWQvJWRcbiIsCiAJCQlyZXEtPnN0YXR1cywgcmVxLT5hY3R1YWwsIHJlcS0+bGVuZ3RoKTsKKwlyZXEtPmNvbnRleHQgPSBOVUxMOworCisJaWYgKHJlcSAhPSBkZXYtPnN0YXRfcmVxKQorCQlldGhfcmVxX2ZyZWUoZXAsIHJlcSk7CiB9CiAKIHN0YXRpYyBpbnQgcm5kaXNfY29udHJvbF9hY2sgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCkBAIC0yMDcxLDExICsxOTkyLDE5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qIGluIGNhc2UgcXVldWUgbGVuZ3RoID4gMSAqLworCWlmIChyZXNwLT5jb250ZXh0KSB7CisJCXJlc3AgPSBldGhfcmVxX2FsbG9jIChkZXYtPnN0YXR1c19lcCwgOCwgR0ZQX0FUT01JQyk7CisJCWlmICghcmVzcCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwogCS8qIFNlbmQgUk5ESVMgUkVTUE9OU0VfQVZBSUxBQkxFIG5vdGlmaWNhdGlvbjsKIAkgKiBVU0JfQ0RDX05PVElGWV9SRVNQT05TRV9BVkFJTEFCTEUgc2hvdWxkIHdvcmsgdG9vCiAJICovCiAJcmVzcC0+bGVuZ3RoID0gODsKIAlyZXNwLT5jb21wbGV0ZSA9IHJuZGlzX2NvbnRyb2xfYWNrX2NvbXBsZXRlOworCXJlc3AtPmNvbnRleHQgPSBkZXY7CiAJCiAJKigoX19sZTMyICopIHJlc3AtPmJ1ZikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxKTsKIAkqKChfX2xlMzIgKikgcmVzcC0+YnVmICsgMSkgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKQEAgLTIwODksOSArMjAxOCwxMyBAQAogCXJldHVybiAwOwogfQogCisjZWxzZQorCisjZGVmaW5lCXJuZGlzX2NvbnRyb2xfYWNrCU5VTEwKKwogI2VuZGlmCS8qIFJORElTICovCiAKLXN0YXRpYyB2b2lkIGV0aF9zdGFydCAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3N0YXRpYyB2b2lkIGV0aF9zdGFydCAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCURFQlVHIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMjEwMSwxNCArMjAzNCwxMiBAQAogCS8qIGFuZCBvcGVuIHRoZSB0eCBmbG9vZGdhdGVzICovIAogCWF0b21pY19zZXQgKCZkZXYtPnR4X3FsZW4sIDApOwogCW5ldGlmX3dha2VfcXVldWUgKGRldi0+bmV0KTsKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUwotCWlmIChkZXYtPnJuZGlzKSB7CisJaWYgKHJuZGlzX2FjdGl2ZShkZXYpKSB7CiAJCXJuZGlzX3NldF9wYXJhbV9tZWRpdW0gKGRldi0+cm5kaXNfY29uZmlnLAogCQkJCQlORElTX01FRElVTV84MDJfMywKIAkJCQkJQklUUkFURShkZXYtPmdhZGdldCkvMTAwKTsKLQkJcm5kaXNfc2VuZF9tZWRpYV9zdGF0ZSAoZGV2LCAxKTsKKwkJKHZvaWQpIHJuZGlzX3NpZ25hbF9jb25uZWN0IChkZXYtPnJuZGlzX2NvbmZpZyk7CiAJfQotI2VuZGlmCQogfQogCiBzdGF0aWMgaW50IGV0aF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQpAQCAtMjE0OSwyOCArMjA4MCwyNyBAQAogCQl9CiAJfQogCQotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCi0JaWYgKGRldi0+cm5kaXMpIHsKKwlpZiAocm5kaXNfYWN0aXZlKGRldikpIHsKIAkJcm5kaXNfc2V0X3BhcmFtX21lZGl1bSAoZGV2LT5ybmRpc19jb25maWcsCiAJCQkJCU5ESVNfTUVESVVNXzgwMl8zLCAwKTsKLQkJcm5kaXNfc2VuZF9tZWRpYV9zdGF0ZSAoZGV2LCAwKTsKKwkJKHZvaWQpIHJuZGlzX3NpZ25hbF9kaXNjb25uZWN0IChkZXYtPnJuZGlzX2NvbmZpZyk7CiAJfQotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqZXRoX3JlcV9hbGxvYyAoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIHNpemUpCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKK2V0aF9yZXFfYWxsb2MgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAKLQlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCAoZXAsIEdGUF9LRVJORUwpOworCXJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0IChlcCwgZ2ZwX2ZsYWdzKTsKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXEtPmJ1ZiA9IGttYWxsb2MgKHNpemUsIEdGUF9LRVJORUwpOworCXJlcS0+YnVmID0ga21hbGxvYyAoc2l6ZSwgZ2ZwX2ZsYWdzKTsKIAlpZiAoIXJlcS0+YnVmKSB7CiAJCXVzYl9lcF9mcmVlX3JlcXVlc3QgKGVwLCByZXEpOwogCQlyZXEgPSBOVUxMOwpAQCAtMjE5MiwxMCArMjEyMiw4IEBACiAJc3RydWN0IGV0aF9kZXYJCSpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEgKGdhZGdldCk7CiAKIAlERUJVRyAoZGV2LCAidW5iaW5kXG4iKTsKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUwogCXJuZGlzX2RlcmVnaXN0ZXIgKGRldi0+cm5kaXNfY29uZmlnKTsKIAlybmRpc19leGl0ICgpOwotI2VuZGlmCiAKIAkvKiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZGlzY29ubmVjdGVkIC4uLiBubyBpL28gaXMgYWN0aXZlICovCiAJaWYgKGRldi0+cmVxKSB7CkBAIC0yMzY4LDEzICsyMjk2LDExIEBACiAJCQlnYWRnZXQtPm5hbWUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JRVBfSU5fTkFNRSA9IGluX2VwLT5uYW1lOwogCWluX2VwLT5kcml2ZXJfZGF0YSA9IGluX2VwOwkvKiBjbGFpbSAqLwogCQogCW91dF9lcCA9IHVzYl9lcF9hdXRvY29uZmlnIChnYWRnZXQsICZmc19zaW5rX2Rlc2MpOwogCWlmICghb3V0X2VwKQogCQlnb3RvIGF1dG9jb25mX2ZhaWw7Ci0JRVBfT1VUX05BTUUgPSBvdXRfZXAtPm5hbWU7CiAJb3V0X2VwLT5kcml2ZXJfZGF0YSA9IG91dF9lcDsJLyogY2xhaW0gKi8KIAogI2lmIGRlZmluZWQoREVWX0NPTkZJR19DREMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCkBAIC0yMzg0LDcgKzIzMTAsNiBAQAogCWlmIChjZGMgfHwgcm5kaXMpIHsKIAkJc3RhdHVzX2VwID0gdXNiX2VwX2F1dG9jb25maWcgKGdhZGdldCwgJmZzX3N0YXR1c19kZXNjKTsKIAkJaWYgKHN0YXR1c19lcCkgewotCQkJRVBfU1RBVFVTX05BTUUgPSBzdGF0dXNfZXAtPm5hbWU7CiAJCQlzdGF0dXNfZXAtPmRyaXZlcl9kYXRhID0gc3RhdHVzX2VwOwkvKiBjbGFpbSAqLwogCQl9IGVsc2UgaWYgKHJuZGlzKSB7CiAJCQlkZXZfZXJyICgmZ2FkZ2V0LT5kZXYsCkBAIC0yNDI2LDcgKzIzNTEsNyBAQAogCWhzX3NvdXJjZV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCWhzX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfc2lua19kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAjaWYgZGVmaW5lZChERVZfQ09ORklHX0NEQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKLQlpZiAoRVBfU1RBVFVTX05BTUUpCisJaWYgKHN0YXR1c19lcCkKIAkJaHNfc3RhdHVzX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CiAJCQkJZnNfc3RhdHVzX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKICNlbmRpZgpAQCAtMjQ5OSwyMCArMjQyNCwyMyBAQAogCVNFVF9FVEhUT09MX09QUyhuZXQsICZvcHMpOwogCiAJLyogcHJlYWxsb2NhdGUgY29udHJvbCBtZXNzYWdlIGRhdGEgYW5kIGJ1ZmZlciAqLwotCWRldi0+cmVxID0gZXRoX3JlcV9hbGxvYyAoZ2FkZ2V0LT5lcDAsIFVTQl9CVUZTSVopOworCWRldi0+cmVxID0gZXRoX3JlcV9hbGxvYyAoZ2FkZ2V0LT5lcDAsIFVTQl9CVUZTSVosIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5yZXEpCiAJCWdvdG8gZmFpbDsKIAlkZXYtPnJlcS0+Y29tcGxldGUgPSBldGhfc2V0dXBfY29tcGxldGU7CiAKIAkvKiAuLi4gYW5kIG1heWJlIGxpa2V3aXNlIGZvciBzdGF0dXMgdHJhbnNmZXIgKi8KKyNpZiBkZWZpbmVkKERFVl9DT05GSUdfQ0RDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQogCWlmIChkZXYtPnN0YXR1c19lcCkgewogCQlkZXYtPnN0YXRfcmVxID0gZXRoX3JlcV9hbGxvYyAoZGV2LT5zdGF0dXNfZXAsCi0JCQkJCVNUQVRVU19CWVRFQ09VTlQpOworCQkJCQlTVEFUVVNfQllURUNPVU5ULCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkZXYtPnN0YXRfcmVxKSB7CiAJCQlldGhfcmVxX2ZyZWUgKGdhZGdldC0+ZXAwLCBkZXYtPnJlcSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KKwkJZGV2LT5zdGF0X3JlcS0+Y29udGV4dCA9IE5VTEw7CiAJfQorI2VuZGlmCiAKIAkvKiBmaW5pc2ggaG9va3VwIHRvIGxvd2VyIGxheWVyIC4uLiAqLwogCWRldi0+Z2FkZ2V0ID0gZ2FkZ2V0OwpAQCAtMjUyNiwxNiArMjQ1NCwxNiBAQAogCW5ldGlmX3N0b3BfcXVldWUgKGRldi0+bmV0KTsKIAluZXRpZl9jYXJyaWVyX29mZiAoZGV2LT5uZXQpOwogCi0gCS8vIFNFVF9ORVRERVZfREVWIChkZXYtPm5ldCwgJmdhZGdldC0+ZGV2KTsKKyAJU0VUX05FVERFVl9ERVYgKGRldi0+bmV0LCAmZ2FkZ2V0LT5kZXYpOwogIAlzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYgKGRldi0+bmV0KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBmYWlsMTsKIAogCUlORk8gKGRldiwgIiVzLCB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIsIGRyaXZlcl9kZXNjKTsKIAlJTkZPIChkZXYsICJ1c2luZyAlcywgT1VUICVzIElOICVzJXMlc1xuIiwgZ2FkZ2V0LT5uYW1lLAotCQlFUF9PVVRfTkFNRSwgRVBfSU5fTkFNRSwKLQkJRVBfU1RBVFVTX05BTUUgPyAiIFNUQVRVUyAiIDogIiIsCi0JCUVQX1NUQVRVU19OQU1FID8gRVBfU1RBVFVTX05BTUUgOiAiIgorCQlvdXRfZXAtPm5hbWUsIGluX2VwLT5uYW1lLAorCQlzdGF0dXNfZXAgPyAiIFNUQVRVUyAiIDogIiIsCisJCXN0YXR1c19lcCA/IHN0YXR1c19lcC0+bmFtZSA6ICIiCiAJCSk7CiAJSU5GTyAoZGV2LCAiTUFDICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogCQluZXQtPmRldl9hZGRyIFswXSwgbmV0LT5kZXZfYWRkciBbMV0sCkBAIC0yNTQ4LDcgKzI0NzYsNiBAQAogCQkJZGV2LT5ob3N0X21hYyBbMl0sIGRldi0+aG9zdF9tYWMgWzNdLAogCQkJZGV2LT5ob3N0X21hYyBbNF0sIGRldi0+aG9zdF9tYWMgWzVdKTsKIAotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCiAJaWYgKHJuZGlzKSB7CiAJCXUzMgl2ZW5kb3JJRCA9IDA7CiAKQEAgLTI1NjUsNyArMjQ5Miw3IEBACiAJCS8qIHRoZXNlIHNldCB1cCBhIGxvdCBvZiB0aGUgT0lEcyB0aGF0IFJORElTIG5lZWRzICovCiAJCXJuZGlzX3NldF9ob3N0X21hYyAoZGV2LT5ybmRpc19jb25maWcsIGRldi0+aG9zdF9tYWMpOwogCQlpZiAocm5kaXNfc2V0X3BhcmFtX2RldiAoZGV2LT5ybmRpc19jb25maWcsIGRldi0+bmV0LAotCQkJCQkgJmRldi0+c3RhdHMpKQorCQkJCQkgJmRldi0+c3RhdHMsICZkZXYtPmNkY19maWx0ZXIpKQogCQkJZ290byBmYWlsMDsKIAkJaWYgKHJuZGlzX3NldF9wYXJhbV92ZW5kb3IgKGRldi0+cm5kaXNfY29uZmlnLCB2ZW5kb3JJRCwKIAkJCQkJICAgIG1hbnVmYWN0dXJlcikpCkBAIC0yNTc2LDcgKzI1MDMsNiBAQAogCQkJZ290byBmYWlsMDsKIAkJSU5GTyAoZGV2LCAiUk5ESVMgcmVhZHlcbiIpOwogCX0KLSNlbmRpZgkKIAogCXJldHVybiBzdGF0dXM7CiAKQEAgLTI2MTAsMTEgKzI1MzYsOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciBldGhfZHJpdmVyID0gewotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRAotCS5zcGVlZAkJPSBVU0JfU1BFRURfSElHSCwKLSNlbHNlCi0JLnNwZWVkCQk9IFVTQl9TUEVFRF9GVUxMLAotI2VuZGlmCisJLnNwZWVkCQk9IERFVlNQRUVELAorCiAJLmZ1bmN0aW9uCT0gKGNoYXIgKikgZHJpdmVyX2Rlc2MsCiAJLmJpbmQJCT0gZXRoX2JpbmQsCiAJLnVuYmluZAkJPSBldGhfdW5iaW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IGE5YmU4NTEuLjRmNTcwODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTgxLDYgKzgxLDEwIEBACiAgKglyZW1vdmFibGUJCURlZmF1bHQgZmFsc2UsIGJvb2xlYW4gZm9yIHJlbW92YWJsZSBtZWRpYQogICoJbHVucz1OCQkJRGVmYXVsdCBOID0gbnVtYmVyIG9mIGZpbGVuYW1lcywgbnVtYmVyIG9mCiAgKgkJCQkJTFVOcyB0byBzdXBwb3J0CisgKglzdGFsbAkJCURlZmF1bHQgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKKyAqCQkJCQlVU0IgZGV2aWNlIGNvbnRyb2xsZXIgKHVzdWFsbHkgdHJ1ZSksCisgKgkJCQkJYm9vbGVhbiB0byBwZXJtaXQgdGhlIGRyaXZlciB0byBoYWx0CisgKgkJCQkJYnVsayBlbmRwb2ludHMKICAqCXRyYW5zcG9ydD1YWFgJCURlZmF1bHQgQkJCLCB0cmFuc3BvcnQgbmFtZSAoQ0IsIENCSSwgb3IgQkJCKQogICoJcHJvdG9jb2w9WVlZCQlEZWZhdWx0IFNDU0ksIHByb3RvY29sIG5hbWUgKFJCQywgODAyMCBvcgogICoJCQkJCUFUQVBJLCBRSUMsIFVGSSwgODA3MCwgb3IgU0NTSTsKQEAgLTkxLDE0ICs5NSwxMCBAQAogICoJYnVmbGVuPU4JCURlZmF1bHQgTj0xNjM4NCwgYnVmZmVyIHNpemUgdXNlZCAod2lsbCBiZQogICoJCQkJCXJvdW5kZWQgZG93biB0byBhIG11bHRpcGxlIG9mCiAgKgkJCQkJUEFHRV9DQUNIRV9TSVpFKQotICoJc3RhbGwJCQlEZWZhdWx0IGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCi0gKgkJCQkJVVNCIGRldmljZSBjb250cm9sbGVyICh1c3VhbGx5IHRydWUpLAotICoJCQkJCWJvb2xlYW4gdG8gcGVybWl0IHRoZSBkcml2ZXIgdG8gaGFsdAotICoJCQkJCWJ1bGsgZW5kcG9pbnRzCiAgKgogICogSWYgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0LCBvbmx5IHRoZSAiZmlsZSIsICJybyIsCi0gKiAicmVtb3ZhYmxlIiwgYW5kICJsdW5zIiBvcHRpb25zIGFyZSBhdmFpbGFibGU7IGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkCi0gKiBmb3IgZXZlcnl0aGluZyBlbHNlLgorICogInJlbW92YWJsZSIsICJsdW5zIiwgYW5kICJzdGFsbCIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOyBkZWZhdWx0IHZhbHVlcworICogYXJlIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KICAqCiAgKiBUaGUgcGF0aG5hbWVzIG9mIHRoZSBiYWNraW5nIGZpbGVzIGFuZCB0aGUgcm8gc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSBpbgogICogdGhlIGF0dHJpYnV0ZSBmaWxlcyAiZmlsZSIgYW5kICJybyIgaW4gdGhlIGx1bjxuPiBzdWJkaXJlY3Rvcnkgb2YgdGhlCkBAIC0zNDIsMTQgKzM0MiwxNSBAQAogCWludAkJbnVtX3JvczsKIAl1bnNpZ25lZCBpbnQJbmx1bnM7CiAKKwlpbnQJCXJlbW92YWJsZTsKKwlpbnQJCWNhbl9zdGFsbDsKKwogCWNoYXIJCSp0cmFuc3BvcnRfcGFybTsKIAljaGFyCQkqcHJvdG9jb2xfcGFybTsKLQlpbnQJCXJlbW92YWJsZTsKIAl1bnNpZ25lZCBzaG9ydAl2ZW5kb3I7CiAJdW5zaWduZWQgc2hvcnQJcHJvZHVjdDsKIAl1bnNpZ25lZCBzaG9ydAlyZWxlYXNlOwogCXVuc2lnbmVkIGludAlidWZsZW47Ci0JaW50CQljYW5fc3RhbGw7CiAKIAlpbnQJCXRyYW5zcG9ydF90eXBlOwogCWNoYXIJCSp0cmFuc3BvcnRfbmFtZTsKQEAgLTM2MCwxMSArMzYxLDExIEBACiAJLnRyYW5zcG9ydF9wYXJtCQk9ICJCQkIiLAogCS5wcm90b2NvbF9wYXJtCQk9ICJTQ1NJIiwKIAkucmVtb3ZhYmxlCQk9IDAsCisJLmNhbl9zdGFsbAkJPSAxLAogCS52ZW5kb3IJCQk9IERSSVZFUl9WRU5ET1JfSUQsCiAJLnByb2R1Y3QJCT0gRFJJVkVSX1BST0RVQ1RfSUQsCiAJLnJlbGVhc2UJCT0gMHhmZmZmLAkvLyBVc2UgY29udHJvbGxlciBjaGlwIHR5cGUKIAkuYnVmbGVuCQkJPSAxNjM4NCwKLQkuY2FuX3N0YWxsCQk9IDEsCiAJfTsKIAogCkBAIC0zODAsNiArMzgxLDkgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChyZW1vdmFibGUsIG1vZF9kYXRhLnJlbW92YWJsZSwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlbW92YWJsZSwgInRydWUgdG8gc2ltdWxhdGUgcmVtb3ZhYmxlIG1lZGlhIik7CiAKK21vZHVsZV9wYXJhbV9uYW1lZChzdGFsbCwgbW9kX2RhdGEuY2FuX3N0YWxsLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhbGwsICJmYWxzZSB0byBwcmV2ZW50IGJ1bGsgc3RhbGxzIik7CisKIAogLyogSW4gdGhlIG5vbi1URVNUIHZlcnNpb24sIG9ubHkgdGhlIG1vZHVsZSBwYXJhbWV0ZXJzIGxpc3RlZCBhYm92ZQogICogYXJlIGF2YWlsYWJsZS4gKi8KQEAgLTQwNCw5ICs0MDgsNiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGJ1ZmxlbiwgbW9kX2RhdGEuYnVmbGVuLCB1aW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnVmbGVuLCAiSS9PIGJ1ZmZlciBzaXplIik7CiAKLW1vZHVsZV9wYXJhbV9uYW1lZChzdGFsbCwgbW9kX2RhdGEuY2FuX3N0YWxsLCBib29sLCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RhbGwsICJmYWxzZSB0byBwcmV2ZW50IGJ1bGsgc3RhbGxzIik7Ci0KICNlbmRpZiAvKiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUICovCiAKIApAQCAtODE4LDcgKzgxOSw3IEBACiAJYnVmWzBdID0gdmFsID4+IDI0OwogCWJ1ZlsxXSA9IHZhbCA+PiAxNjsKIAlidWZbMl0gPSB2YWwgPj4gODsKLQlidWZbM10gPSB2YWw7CisJYnVmWzNdID0gdmFsICYgMHhmZjsKIH0KIAogCkBAIC0xMjc2LDggKzEyNzcsOCBAQAogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gZnNnLT5lcDByZXE7CiAJaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQl3X2luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNgkJCXdfbGVuZ3RoID0gY3RybC0+d0xlbmd0aDsKKwl1MTYJCQl3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCiAJaWYgKCFmc2ctPmNvbmZpZykKIAkJcmV0dXJuIHZhbHVlOwpAQCAtMTMxMiw3ICsxMzEzLDcgQEAKIAkJCX0KIAkJCVZEQkcoZnNnLCAiZ2V0IG1heCBMVU5cbiIpOwogCQkJKih1OCAqKSByZXEtPmJ1ZiA9IGZzZy0+bmx1bnMgLSAxOwotCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIDEpOworCQkJdmFsdWUgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMzQ0LDcgKzEzNDUsNyBAQAogCQkJInVua25vd24gY2xhc3Mtc3BlY2lmaWMgY29udHJvbCByZXEgIgogCQkJIiUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJXVcbiIsCiAJCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAotCQkJY3RybC0+d1ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCk7CisJCQlsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpLCB3X2luZGV4LCB3X2xlbmd0aCk7CiAJcmV0dXJuIHZhbHVlOwogfQogCkBAIC0xMzU4LDkgKzEzNTksOCBAQAogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gZnNnLT5lcDByZXE7CiAJaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQl3X2luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNgkJCXdfdmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2CQkJd19sZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNgkJCXdfaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNgkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwogCiAJLyogVXN1YWxseSB0aGlzIGp1c3Qgc3RvcmVzIHJlcGx5IGRhdGEgaW4gdGhlIHByZS1hbGxvY2F0ZWQgZXAwIGJ1ZmZlciwKIAkgKiBidXQgY29uZmlnIGNoYW5nZSBldmVudHMgd2lsbCBhbHNvIHJlY29uZmlndXJlIGhhcmR3YXJlLiAqLwpAQCAtMTM3NCw3ICsxMzc0LDcgQEAKIAogCQljYXNlIFVTQl9EVF9ERVZJQ0U6CiAJCQlWREJHKGZzZywgImdldCBkZXZpY2UgZGVzY3JpcHRvclxuIik7Ci0JCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgc2l6ZW9mIGRldmljZV9kZXNjKTsKKwkJCXZhbHVlID0gc2l6ZW9mIGRldmljZV9kZXNjOwogCQkJbWVtY3B5KHJlcS0+YnVmLCAmZGV2aWNlX2Rlc2MsIHZhbHVlKTsKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRApAQCAtMTM4Miw3ICsxMzgyLDcgQEAKIAkJCVZEQkcoZnNnLCAiZ2V0IGRldmljZSBxdWFsaWZpZXJcbiIpOwogCQkJaWYgKCFmc2ctPmdhZGdldC0+aXNfZHVhbHNwZWVkKQogCQkJCWJyZWFrOwotCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHNpemVvZiBkZXZfcXVhbGlmaWVyKTsKKwkJCXZhbHVlID0gc2l6ZW9mIGRldl9xdWFsaWZpZXI7CiAJCQltZW1jcHkocmVxLT5idWYsICZkZXZfcXVhbGlmaWVyLCB2YWx1ZSk7CiAJCQlicmVhazsKIApAQCAtMTQwMSw4ICsxNDAxLDYgQEAKIAkJCQkJcmVxLT5idWYsCiAJCQkJCXdfdmFsdWUgPj4gOCwKIAkJCQkJd192YWx1ZSAmIDB4ZmYpOwotCQkJaWYgKHZhbHVlID49IDApCi0JCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHZhbHVlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVVNCX0RUX1NUUklORzoKQEAgLTE0MTEsOCArMTQwOSw2IEBACiAJCQkvKiB3SW5kZXggPT0gbGFuZ3VhZ2UgY29kZSAqLwogCQkJdmFsdWUgPSB1c2JfZ2FkZ2V0X2dldF9zdHJpbmcoJnN0cmluZ3RhYiwKIAkJCQkJd192YWx1ZSAmIDB4ZmYsIHJlcS0+YnVmKTsKLQkJCWlmICh2YWx1ZSA+PSAwKQotCQkJCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSB2YWx1ZSk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTE0MzgsNyArMTQzNCw3IEBACiAJCQlicmVhazsKIAkJVkRCRyhmc2csICJnZXQgY29uZmlndXJhdGlvblxuIik7CiAJCSoodTggKikgcmVxLT5idWYgPSBmc2ctPmNvbmZpZzsKLQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIDEpOworCQl2YWx1ZSA9IDE7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U6CkBAIC0xNDY2LDE0ICsxNDYyLDE0IEBACiAJCX0KIAkJVkRCRyhmc2csICJnZXQgaW50ZXJmYWNlXG4iKTsKIAkJKih1OCAqKSByZXEtPmJ1ZiA9IDA7Ci0JCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSAxKTsKKwkJdmFsdWUgPSAxOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCVZEQkcoZnNnLAogCQkJInVua25vd24gY29udHJvbCByZXEgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwldVxuIiwKIAkJCWN0cmwtPmJSZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsCi0JCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCk7CisJCQl3X3ZhbHVlLCB3X2luZGV4LCBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKSk7CiAJfQogCiAJcmV0dXJuIHZhbHVlOwpAQCAtMTQ4NSw2ICsxNDgxLDcgQEAKIHsKIAlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCWludAkJCXJjOworCWludAkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAkrK2ZzZy0+ZXAwX3JlcV90YWc7CQkvLyBSZWNvcmQgYXJyaXZhbCBvZiBhIG5ldyByZXF1ZXN0CiAJZnNnLT5lcDByZXEtPmNvbnRleHQgPSBOVUxMOwpAQCAtMTQ5OCw5ICsxNDk1LDkgQEAKIAogCS8qIFJlc3BvbmQgd2l0aCBkYXRhL3N0YXR1cyBvciBkZWZlciB1bnRpbCBsYXRlcj8gKi8KIAlpZiAocmMgPj0gMCAmJiByYyAhPSBERUxBWUVEX1NUQVRVUykgeworCQlyYyA9IG1pbihyYywgd19sZW5ndGgpOwogCQlmc2ctPmVwMHJlcS0+bGVuZ3RoID0gcmM7Ci0JCWZzZy0+ZXAwcmVxLT56ZXJvID0gKHJjIDwgY3RybC0+d0xlbmd0aCAmJgotCQkJCShyYyAlIGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQpID09IDApOworCQlmc2ctPmVwMHJlcS0+emVybyA9IHJjIDwgd19sZW5ndGg7CiAJCWZzZy0+ZXAwcmVxX25hbWUgPSAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTiA/CiAJCQkJImVwMC1pbiIgOiAiZXAwLW91dCIpOwogCQlyYyA9IGVwMF9xdWV1ZShmc2cpOwpAQCAtMjY2MCw3ICsyNjU3LDcgQEAKIAkJfQogCX0KIAotCS8qIENoZWNrIHRoYXQgdGhlIExVTiB2YWx1ZXMgYXJlIG9vbnNpc3RlbnQgKi8KKwkvKiBDaGVjayB0aGF0IHRoZSBMVU4gdmFsdWVzIGFyZSBjb25zaXN0ZW50ICovCiAJaWYgKHRyYW5zcG9ydF9pc19iYmIoKSkgewogCQlpZiAoZnNnLT5sdW4gIT0gbHVuKQogCQkJREJHKGZzZywgInVzaW5nIExVTiAlZCBmcm9tIENCVywgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwppbmRleCAwMDVkYjdjLi5lYWFiMjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwpAQCAtNzAsNyArNzAsNyBAQAogICogc2VlbSB0byBiZWhhdmUgcXVpdGUgYXMgZXhwZWN0ZWQuICBVc2VkIGJ5IGRlZmF1bHQuCiAgKgogICogT1VUIGRtYSBkb2N1bWVudHMgZGVzaWduIHByb2JsZW1zIGhhbmRsaW5nIHRoZSBjb21tb24gInNob3J0IHBhY2tldCIKLSAqIHRyYW5zZmVyIHRlcm1pbmF0aW9uIHBvbGljeTsgaXQgY291bGRuJ3QgZW5hYmxlZCBieSBkZWZhdWx0LCBldmVuCisgKiB0cmFuc2ZlciB0ZXJtaW5hdGlvbiBwb2xpY3k7IGl0IGNvdWxkbid0IGJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgZXZlbgogICogaWYgdGhlIE9VVC1kbWEgYWJvcnQgcHJvYmxlbXMgaGFkIGEgcmVzb2x1dGlvbi4KICAqLwogc3RhdGljIHVuc2lnbmVkIHVzZV9kbWEgPSAxOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLWdva3VfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICpfZXAsIGludCBnZnBfZmxhZ3MpCitnb2t1X2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGdva3VfcmVxdWVzdAkqcmVxOwogCkBAIC0zMTMsNyArMzEzLDcgQEAKICNpZglkZWZpbmVkKENPTkZJR19YODYpCiAjZGVmaW5lIFVTRV9LTUFMTE9DCiAKLSNlbGlmCWRlZmluZWQoQ09ORklHX01JUFMpICYmICFkZWZpbmVkKENPTkZJR19OT05DT0hFUkVOVF9JTykKKyNlbGlmCWRlZmluZWQoQ09ORklHX01JUFMpICYmICFkZWZpbmVkKENPTkZJR19ETUFfTk9OQ09IRVJFTlQpCiAjZGVmaW5lIFVTRV9LTUFMTE9DCiAKICNlbGlmCWRlZmluZWQoQ09ORklHX1BQQykgJiYgIWRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKQEAgLTMyNyw3ICszMjcsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqCiBnb2t1X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGJ5dGVzLAotCQkJZG1hX2FkZHJfdCAqZG1hLCBpbnQgIGdmcF9mbGFncykKKwkJCWRtYV9hZGRyX3QgKmRtYSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXZvaWQJCSpyZXR2YWw7CiAJc3RydWN0IGdva3VfZXAJKmVwOwpAQCAtNzg5LDcgKzc4OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50Ci1nb2t1X3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorZ29rdV9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBnb2t1X3JlcXVlc3QJKnJlcTsKIAlzdHJ1Y3QgZ29rdV9lcAkJKmVwOwpAQCAtMTUyNCw5ICsxNTI0LDEyIEBACiAJLyogcmVhZCBTRVRVUCBwYWNrZXQgYW5kIGVudGVyIERBVEEgc3RhZ2UgKi8KIAljdHJsLmJSZXF1ZXN0VHlwZSA9IHJlYWRsKCZyZWdzLT5iUmVxdWVzdFR5cGUpOwogCWN0cmwuYlJlcXVlc3QgPSByZWFkbCgmcmVncy0+YlJlcXVlc3QpOwotCWN0cmwud1ZhbHVlICA9IChyZWFkbCgmcmVncy0+d1ZhbHVlSCkgIDw8IDgpIHwgcmVhZGwoJnJlZ3MtPndWYWx1ZUwpOwotCWN0cmwud0luZGV4ICA9IChyZWFkbCgmcmVncy0+d0luZGV4SCkgIDw8IDgpIHwgcmVhZGwoJnJlZ3MtPndJbmRleEwpOwotCWN0cmwud0xlbmd0aCA9IChyZWFkbCgmcmVncy0+d0xlbmd0aEgpIDw8IDgpIHwgcmVhZGwoJnJlZ3MtPndMZW5ndGhMKTsKKwljdHJsLndWYWx1ZSAgPSBjcHVfdG9fbGUxNigocmVhZGwoJnJlZ3MtPndWYWx1ZUgpICA8PCA4KQorCQkJCQl8IHJlYWRsKCZyZWdzLT53VmFsdWVMKSk7CisJY3RybC53SW5kZXggID0gY3B1X3RvX2xlMTYoKHJlYWRsKCZyZWdzLT53SW5kZXhIKSAgPDwgOCkKKwkJCQkJfCByZWFkbCgmcmVncy0+d0luZGV4TCkpOworCWN0cmwud0xlbmd0aCA9IGNwdV90b19sZTE2KChyZWFkbCgmcmVncy0+d0xlbmd0aEgpIDw8IDgpCisJCQkJCXwgcmVhZGwoJnJlZ3MtPndMZW5ndGhMKSk7CiAJd3JpdGVsKDAsICZyZWdzLT5TZXR1cFJlY3YpOwogCiAJbnVrZSgmZGV2LT5lcFswXSwgMCk7CkBAIC0xNTQ4LDE4ICsxNTUxLDIwIEBACiAJCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgogCQkJc3dpdGNoIChjdHJsLmJSZXF1ZXN0VHlwZSkgewogCQkJY2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6Ci0JCQkJdG1wID0gY3RybC53SW5kZXggJiAweDBmOworCQkJCXRtcCA9IGxlMTZfdG9fY3B1KGN0cmwud0luZGV4KSAmIDB4MGY7CiAJCQkJLyogYWN0aXZlIGVuZHBvaW50ICovCiAJCQkJaWYgKHRtcCA+IDMgfHwgKCFkZXYtPmVwW3RtcF0uZGVzYyAmJiB0bXAgIT0gMCkpCiAJCQkJCWdvdG8gc3RhbGw7Ci0JCQkJaWYgKGN0cmwud0luZGV4ICYgVVNCX0RJUl9JTikgeworCQkJCWlmIChjdHJsLndJbmRleCAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoCisJCQkJCQlVU0JfRElSX0lOKSkgewogCQkJCQlpZiAoIWRldi0+ZXBbdG1wXS5pc19pbikKIAkJCQkJCWdvdG8gc3RhbGw7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKGRldi0+ZXBbdG1wXS5pc19pbikKIAkJCQkJCWdvdG8gc3RhbGw7CiAJCQkJfQotCQkJCWlmIChjdHJsLndWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJCQlpZiAoY3RybC53VmFsdWUgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigKKwkJCQkJCVVTQl9FTkRQT0lOVF9IQUxUKSkKIAkJCQkJZ290byBzdGFsbDsKIAkJCQlpZiAodG1wKQogCQkJCQlnb2t1X2NsZWFyX2hhbHQoJmRldi0+ZXBbdG1wXSk7CkBAIC0xNTcxLDcgKzE1NzYsNyBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgVVNCX1JFQ0lQX0RFVklDRToKIAkJCQkvKiBkZXZpY2UgcmVtb3RlIHdha2V1cDogYWx3YXlzIGNsZWFyICovCi0JCQkJaWYgKGN0cmwud1ZhbHVlICE9IDEpCisJCQkJaWYgKGN0cmwud1ZhbHVlICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSkpCiAJCQkJCWdvdG8gc3RhbGw7CiAJCQkJVkRCRyhkZXYsICJjbGVhciBkZXYgcmVtb3RlIHdha2V1cFxuIik7CiAJCQkJZ290byBzdWNjZWVkOwpAQCAtMTU4OSwxNCArMTU5NCwxNSBAQAogI2lmZGVmIFVTQl9UUkFDRQogCVZEQkcoZGV2LCAiU0VUVVAgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAogCQljdHJsLmJSZXF1ZXN0VHlwZSwgY3RybC5iUmVxdWVzdCwKLQkJY3RybC53VmFsdWUsIGN0cmwud0luZGV4LCBjdHJsLndMZW5ndGgpOworCQlsZTE2X3RvX2NwdShjdHJsLndWYWx1ZSksIGxlMTZfdG9fY3B1KGN0cmwud0luZGV4KSwKKwkJbGUxNl90b19jcHUoY3RybC53TGVuZ3RoKSk7CiAjZW5kaWYKIAogCS8qIGh3IHdhbnRzIHRvIGtub3cgd2hlbiB3ZSdyZSBjb25maWd1cmVkIChvciBub3QpICovCiAJZGV2LT5yZXFfY29uZmlnID0gKGN0cmwuYlJlcXVlc3QgPT0gVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTgogCQkJCSYmIGN0cmwuYlJlcXVlc3RUeXBlID09IFVTQl9SRUNJUF9ERVZJQ0UpOwogCWlmICh1bmxpa2VseShkZXYtPnJlcV9jb25maWcpKQotCQlkZXYtPmNvbmZpZ3VyZWQgPSAoY3RybC53VmFsdWUgIT0gMCk7CisJCWRldi0+Y29uZmlndXJlZCA9IChjdHJsLndWYWx1ZSAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApKTsKIAogCS8qIGRlbGVnYXRlIGV2ZXJ5dGhpbmcgdG8gdGhlIGdhZGdldCBkcml2ZXIuCiAJICogaXQgbWF5IHJlc3BvbmQgYWZ0ZXIgdGhpcyBpcnEgaGFuZGxlciByZXR1cm5zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCAxZTVlNmRkLi4wMjA4MTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtNDE3LDggKzQxNyw4IEBACiAJCWdvdG8gZnJlZTE7CiAKIAl2YWx1ZSA9IGVwX2lvIChkYXRhLCBrYnVmLCBsZW4pOwotCVZERUJVRyAoZGF0YS0+ZGV2LCAiJXMgcmVhZCAlZCBPVVQsIHN0YXR1cyAlZFxuIiwKLQkJZGF0YS0+bmFtZSwgbGVuLCB2YWx1ZSk7CisJVkRFQlVHIChkYXRhLT5kZXYsICIlcyByZWFkICV6dSBPVVQsIHN0YXR1cyAlZFxuIiwKKwkJZGF0YS0+bmFtZSwgbGVuLCAoaW50KSB2YWx1ZSk7CiAJaWYgKHZhbHVlID49IDAgJiYgY29weV90b191c2VyIChidWYsIGtidWYsIHZhbHVlKSkKIAkJdmFsdWUgPSAtRUZBVUxUOwogCkBAIC00NjUsOCArNDY1LDggQEAKIAl9CiAKIAl2YWx1ZSA9IGVwX2lvIChkYXRhLCBrYnVmLCBsZW4pOwotCVZERUJVRyAoZGF0YS0+ZGV2LCAiJXMgd3JpdGUgJWQgSU4sIHN0YXR1cyAlZFxuIiwKLQkJZGF0YS0+bmFtZSwgbGVuLCB2YWx1ZSk7CisJVkRFQlVHIChkYXRhLT5kZXYsICIlcyB3cml0ZSAlenUgSU4sIHN0YXR1cyAlZFxuIiwKKwkJZGF0YS0+bmFtZSwgbGVuLCAoaW50KSB2YWx1ZSk7CiBmcmVlMToKIAl1cCAoJmRhdGEtPmxvY2spOwogCWtmcmVlIChrYnVmKTsKQEAgLTEzMTgsOCArMTMxOCw4IEBACiAJc3RydWN0IHVzYl9yZXF1ZXN0CQkqcmVxID0gZGV2LT5yZXE7CiAJaW50CQkJCXZhbHVlID0gLUVPUE5PVFNVUFA7CiAJc3RydWN0IHVzYl9nYWRnZXRmc19ldmVudAkqZXZlbnQ7Ci0JdTE2CQkJCXdfdmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2CQkJCXdfbGVuZ3RoID0gY3RybC0+d0xlbmd0aDsKKwl1MTYJCQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2CQkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAlzcGluX2xvY2sgKCZkZXYtPmxvY2spOwogCWRldi0+c2V0dXBfYWJvcnQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYwppbmRleCBkZjc1YWI2Li40ODQyNTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYwpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqbGg3YTQweF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLAotCQkJCQkJIGludCBnZnBfZmxhZ3MpCisJCQkJCQkgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIApAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgKmxoN2E0MHhfYWxsb2NfYnVmZmVyKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBieXRlcywKLQkJCQkgIGRtYV9hZGRyX3QgKiBkbWEsIGludCBnZnBfZmxhZ3MpCisJCQkJICBkbWFfYWRkcl90ICogZG1hLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJY2hhciAqcmV0dmFsOwogCkBAIC0xMTU4LDcgKzExNTgsNyBAQAogICogIE5PVEU6IFNldHMgSU5ERVggcmVnaXN0ZXIKICAqLwogc3RhdGljIGludCBsaDdhNDB4X3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLAotCQkJIGludCBnZnBfZmxhZ3MpCisJCQkgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgbGg3YTQweF9lcCAqZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmRpcy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25kaXMuaAppbmRleCBjNTUzYmJmLi4wOWUzZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmRpcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZGlzLmgKQEAgLTQ3LDE3ICs0NywxNyBAQAogI2RlZmluZSBORElTX0RFVklDRV9XQUtFX09OX01BR0lDX1BBQ0tFVF9FTkFCTEUgICAweDAwMDAwMDA0CiAKIHN0cnVjdCBORElTX1BOUF9DQVBBQklMSVRJRVMgewotCXUzMgkJCQkJRmxhZ3M7CisJX19sZTMyCQkJCQlGbGFnczsKIAlzdHJ1Y3QgTkRJU19QTV9XQUtFX1VQX0NBUEFCSUxJVElFUwlXYWtlVXBDYXBhYmlsaXRpZXM7CiB9OwogCiBzdHJ1Y3QgTkRJU19QTV9QQUNLRVRfUEFUVEVSTiB7Ci0JdTMyCVByaW9yaXR5OwotCXUzMglSZXNlcnZlZDsKLQl1MzIJTWFza1NpemU7Ci0JdTMyCVBhdHRlcm5PZmZzZXQ7Ci0JdTMyCVBhdHRlcm5TaXplOwotCXUzMglQYXR0ZXJuRmxhZ3M7CisJX19sZTMyCVByaW9yaXR5OworCV9fbGUzMglSZXNlcnZlZDsKKwlfX2xlMzIJTWFza1NpemU7CisJX19sZTMyCVBhdHRlcm5PZmZzZXQ7CisJX19sZTMyCVBhdHRlcm5TaXplOworCV9fbGUzMglQYXR0ZXJuRmxhZ3M7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCmluZGV4IGU0N2UzOTguLjQ3N2ZhYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLW5ldDIyODBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCBpbnQgZ2ZwX2ZsYWdzKQorbmV0MjI4MF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgbmV0MjI4MF9lcAkqZXA7CiAJc3RydWN0IG5ldDIyODBfcmVxdWVzdAkqcmVxOwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAjZWxpZglkZWZpbmVkKENPTkZJR19QUEMpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAjZGVmaW5lIFVTRV9LTUFMTE9DCiAKLSNlbGlmCWRlZmluZWQoQ09ORklHX01JUFMpICYmICFkZWZpbmVkKENPTkZJR19OT05DT0hFUkVOVF9JTykKKyNlbGlmCWRlZmluZWQoQ09ORklHX01JUFMpICYmICFkZWZpbmVkKENPTkZJR19ETUFfTk9OQ09IRVJFTlQpCiAjZGVmaW5lIFVTRV9LTUFMTE9DCiAKIC8qIEZJWE1FIHRoZXJlIGFyZSBvdGhlciBjYXNlcywgaW5jbHVkaW5nIGFuIHg4Ni02NCBvbmUgLi4uICAqLwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJc3RydWN0IHVzYl9lcAkJKl9lcCwKIAl1bnNpZ25lZAkJYnl0ZXMsCiAJZG1hX2FkZHJfdAkJKmRtYSwKLQlpbnQJCQlnZnBfZmxhZ3MKKwl1bnNpZ25lZAkJZ2ZwX2ZsYWdzCiApCiB7CiAJdm9pZAkJCSpyZXR2YWw7CkBAIC04OTcsNyArODk3LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQKLW5ldDIyODBfcXVldWUgKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorbmV0MjI4MF9xdWV1ZSAoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0CSpyZXE7CiAJc3RydWN0IG5ldDIyODBfZXAJKmVwOwpAQCAtMTExMyw3ICsxMTEzLDcgQEAKIAkJaWYgKGVwLT5pbl9maWZvX3ZhbGlkYXRlKQogCQkJZG1hY3RsIHw9ICgxIDw8IERNQV9GSUZPX1ZBTElEQVRFKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSAoZW50cnksICZlcC0+cXVldWUsIHF1ZXVlKSB7Ci0JCQl1MzIJCWRtYWNvdW50OworCQkJX19sZTMyCQlkbWFjb3VudDsKIAogCQkJaWYgKGVudHJ5ID09IHJlcSkKIAkJCQljb250aW51ZTsKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAJCQkJJmVwLT5kbWEtPmRtYWRlc2MpOwogCQkJaWYgKHJlcS0+dGQtPmRtYWNvdW50ICYgZG1hX2RvbmVfaWUpCiAJCQkJd3JpdGVsIChyZWFkbCAoJmVwLT5kbWEtPmRtYWNvdW50KQotCQkJCQkJfCBkbWFfZG9uZV9pZSwKKwkJCQkJCXwgbGUzMl90b19jcHUoZG1hX2RvbmVfaWUpLAogCQkJCQkmZXAtPmRtYS0+ZG1hY291bnQpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IG5ldDIyODBfcmVxdWVzdAkqcHJldjsKQEAgLTE0OTAsNyArMTQ5MCw3IEBACiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJaTsKIAl1MzIJCQl0MSwgdDI7Ci0JY2hhcgkJCSpzOworCWNvbnN0IGNoYXIJCSpzOwogCiAJZGV2ID0gZGV2X2dldF9kcnZkYXRhIChfZGV2KTsKIAluZXh0ID0gYnVmOwpAQCAtMTc3OSw2ICsxNzc5LDkgQEAKIAlsaXN0X2FkZF90YWlsICgmZGV2LT5lcCBbNl0uZXAuZXBfbGlzdCwgJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOwogfQogCisvKiBqdXN0IGRlY2xhcmUgdGhpcyBpbiBhbnkgZHJpdmVyIHRoYXQgcmVhbGx5IG5lZWQgaXQgKi8KK2V4dGVybiBpbnQgbmV0MjI4MF9zZXRfZmlmb19tb2RlIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgbW9kZSk7CisKIC8qKgogICogbmV0MjI4MF9zZXRfZmlmb19tb2RlIC0gY2hhbmdlIGFsbG9jYXRpb24gb2YgZmlmbyBidWZmZXJzCiAgKiBAZ2FkZ2V0OiBhY2Nlc3MgdG8gdGhlIG5ldDIyODAgZGV2aWNlIHRoYXQgd2lsbCBiZSB1cGRhdGVkCkBAIC0yMzgyLDkgKzIzODUsOSBAQAogCQljcHVfdG9fbGUzMnMgKCZ1LnJhdyBbMF0pOwogCQljcHVfdG9fbGUzMnMgKCZ1LnJhdyBbMV0pOwogCi0JCWxlMTZfdG9fY3B1cyAoJnUuci53VmFsdWUpOwotCQlsZTE2X3RvX2NwdXMgKCZ1LnIud0luZGV4KTsKLQkJbGUxNl90b19jcHVzICgmdS5yLndMZW5ndGgpOworI2RlZmluZQl3X3ZhbHVlCQlsZTE2X3RvX2NwdXAgKCZ1LnIud1ZhbHVlKQorI2RlZmluZQl3X2luZGV4CQlsZTE2X3RvX2NwdXAgKCZ1LnIud0luZGV4KQorI2RlZmluZQl3X2xlbmd0aAlsZTE2X3RvX2NwdXAgKCZ1LnIud0xlbmd0aCkKIAogCQkvKiBhY2sgdGhlIGlycSAqLwogCQl3cml0ZWwgKDEgPDwgU0VUVVBfUEFDS0VUX0lOVEVSUlVQVCwgJmRldi0+cmVncy0+aXJxc3RhdDApOwpAQCAtMjQxMywyNSArMjQxNiwyNSBAQAogCQlzd2l0Y2ggKHUuci5iUmVxdWVzdCkgewogCQljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzogewogCQkJc3RydWN0IG5ldDIyODBfZXAJKmU7Ci0JCQl1MTYJCQlzdGF0dXM7CisJCQlfX2xlMzIJCQlzdGF0dXM7CiAKIAkJCS8qIGh3IGhhbmRsZXMgZGV2aWNlIGFuZCBpbnRlcmZhY2Ugc3RhdHVzICovCiAJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfRU5EUE9JTlQpKQogCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQlpZiAoKGUgPSBnZXRfZXBfYnlfYWRkciAoZGV2LCB1LnIud0luZGV4KSkgPT0gMAotCQkJCQl8fCB1LnIud0xlbmd0aCA+IDIpCisJCQlpZiAoKGUgPSBnZXRfZXBfYnlfYWRkciAoZGV2LCB3X2luZGV4KSkgPT0gMAorCQkJCQl8fCB3X2xlbmd0aCA+IDIpCiAJCQkJZ290byBkb19zdGFsbDsKIAogCQkJaWYgKHJlYWRsICgmZS0+cmVncy0+ZXBfcnNwKQogCQkJCQkmICgxIDw8IFNFVF9FTkRQT0lOVF9IQUxUKSkKLQkJCQlzdGF0dXMgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgxKTsKKwkJCQlzdGF0dXMgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxKTsKIAkJCWVsc2UKLQkJCQlzdGF0dXMgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgwKTsKKwkJCQlzdGF0dXMgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAogCQkJLyogZG9uJ3QgYm90aGVyIHdpdGggYSByZXF1ZXN0IG9iamVjdCEgKi8KIAkJCXdyaXRlbCAoMCwgJmRldi0+ZXByZWdzIFswXS5lcF9pcnFlbmIpOwotCQkJc2V0X2ZpZm9fYnl0ZWNvdW50IChlcCwgdS5yLndMZW5ndGgpOwotCQkJd3JpdGVsIChzdGF0dXMsICZkZXYtPmVwcmVncyBbMF0uZXBfZGF0YSk7CisJCQlzZXRfZmlmb19ieXRlY291bnQgKGVwLCB3X2xlbmd0aCk7CisJCQl3cml0ZWwgKChfX2ZvcmNlIHUzMilzdGF0dXMsICZkZXYtPmVwcmVncyBbMF0uZXBfZGF0YSk7CiAJCQlhbGxvd19zdGF0dXMgKGVwKTsKIAkJCVZERUJVRyAoZGV2LCAiJXMgc3RhdCAlMDJ4XG4iLCBlcC0+ZXAubmFtZSwgc3RhdHVzKTsKIAkJCWdvdG8gbmV4dF9lbmRwb2ludHM7CkBAIC0yNDQzLDEwICsyNDQ2LDEwIEBACiAJCQkvKiBodyBoYW5kbGVzIGRldmljZSBmZWF0dXJlcyAqLwogCQkJaWYgKHUuci5iUmVxdWVzdFR5cGUgIT0gVVNCX1JFQ0lQX0VORFBPSU5UKQogCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQlpZiAodS5yLndWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAotCQkJCQl8fCB1LnIud0xlbmd0aCAhPSAwKQorCQkJaWYgKHdfdmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQKKwkJCQkJfHwgd19sZW5ndGggIT0gMCkKIAkJCQlnb3RvIGRvX3N0YWxsOwotCQkJaWYgKChlID0gZ2V0X2VwX2J5X2FkZHIgKGRldiwgdS5yLndJbmRleCkpID09IDApCisJCQlpZiAoKGUgPSBnZXRfZXBfYnlfYWRkciAoZGV2LCB3X2luZGV4KSkgPT0gMCkKIAkJCQlnb3RvIGRvX3N0YWxsOwogCQkJY2xlYXJfaGFsdCAoZSk7CiAJCQlhbGxvd19zdGF0dXMgKGVwKTsKQEAgLTI0NjAsMTAgKzI0NjMsMTAgQEAKIAkJCS8qIGh3IGhhbmRsZXMgZGV2aWNlIGZlYXR1cmVzICovCiAJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICh1LnIud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCi0JCQkJCXx8IHUuci53TGVuZ3RoICE9IDApCisJCQlpZiAod192YWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAorCQkJCQl8fCB3X2xlbmd0aCAhPSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7Ci0JCQlpZiAoKGUgPSBnZXRfZXBfYnlfYWRkciAoZGV2LCB1LnIud0luZGV4KSkgPT0gMCkKKwkJCWlmICgoZSA9IGdldF9lcF9ieV9hZGRyIChkZXYsIHdfaW5kZXgpKSA9PSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7CiAJCQlzZXRfaGFsdCAoZSk7CiAJCQlhbGxvd19zdGF0dXMgKGVwKTsKQEAgLTI0NzMsMTAgKzI0NzYsMTAgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogZGVsZWdhdGU6Ci0JCQlWREVCVUcgKGRldiwgInNldHVwICUwMnguJTAyeCB2JTA0eCBpJTA0eCAiCisJCQlWREVCVUcgKGRldiwgInNldHVwICUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJTA0eCIKIAkJCQkiZXBfY2ZnICUwOHhcbiIsCiAJCQkJdS5yLmJSZXF1ZXN0VHlwZSwgdS5yLmJSZXF1ZXN0LAotCQkJCXUuci53VmFsdWUsIHUuci53SW5kZXgsCisJCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgsCiAJCQkJcmVhZGwgKCZlcC0+cmVncy0+ZXBfY2ZnKSk7CiAJCQlzcGluX3VubG9jayAoJmRldi0+bG9jayk7CiAJCQl0bXAgPSBkZXYtPmRyaXZlci0+c2V0dXAgKCZkZXYtPmdhZGdldCwgJnUucik7CkBAIC0yNDk3LDYgKzI1MDAsMTAgQEAKIAkJICovCiAJfQogCisjdW5kZWYJd192YWx1ZQorI3VuZGVmCXdfaW5kZXgKKyN1bmRlZgl3X2xlbmd0aAorCiBuZXh0X2VuZHBvaW50czoKIAkvKiBlbmRwb2ludCBkYXRhIGlycSA/ICovCiAJc2NyYXRjaCA9IHN0YXQgJiAweDdmOwpAQCAtMjY1Myw3ICsyNjYwLDcgQEAKIAkJCQlyZXN0YXJ0X2RtYSAoZXApOwogCQkJZWxzZSBpZiAoZXAtPmlzX2luICYmIHVzZV9kbWFfY2hhaW5pbmcpIHsKIAkJCQlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0CSpyZXE7Ci0JCQkJdTMyCQkJZG1hY291bnQ7CisJCQkJX19sZTMyCQkJZG1hY291bnQ7CiAKIAkJCQkvKiB0aGUgZGVzY3JpcHRvciBhdCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4KIAkJCQkgKiBtYXkgc3RpbGwgaGF2ZSBWQUxJRF9CSVQgY2xlYXI7IHRoYXQncwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwppbmRleCA5OGNiY2JjLi5mZjU1MzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwpAQCAtNTIsNyArNTIsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KIAogI2luY2x1ZGUgIm9tYXBfdWRjLmgiCkBAIC0xNjcsNyArMTY2LDcgQEAKIAltYXhwID0gbGUxNl90b19jcHUgKGRlc2MtPndNYXhQYWNrZXRTaXplKTsKIAlpZiAoKGRlc2MtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCiAJCQkJJiYgbWF4cCAhPSBlcC0+bWF4cGFja2V0KQotCQkJfHwgZGVzYy0+d01heFBhY2tldFNpemUgPiBlcC0+bWF4cGFja2V0CisJCQl8fCBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgPiBlcC0+bWF4cGFja2V0CiAJCQl8fCAhZGVzYy0+d01heFBhY2tldFNpemUpIHsKIAkJREJHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOwogCQlyZXR1cm4gLUVSQU5HRTsKQEAgLTIxNCw3ICsyMTMsNyBAQAogCWVwLT5oYXNfZG1hID0gMDsKIAllcC0+bGNoID0gLTE7CiAJdXNlX2VwKGVwLCBVRENfRVBfU0VMKTsKLQlVRENfQ1RSTF9SRUcgPSBVRENfUkVTRVRfRVA7CisJVURDX0NUUkxfUkVHID0gdWRjLT5jbHJfaGFsdDsKIAllcC0+YWNrd2FpdCA9IDA7CiAJZGVzZWxlY3RfZXAoKTsKIApAQCAtMjUzLDcgKzI1Miw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT51ZGMtPmxvY2ssIGZsYWdzKTsKLQllcC0+ZGVzYyA9IDA7CisJZXAtPmRlc2MgPSBOVUxMOwogCW51a2UgKGVwLCAtRVNIVVRET1dOKTsKIAllcC0+ZXAubWF4cGFja2V0ID0gZXAtPm1heHBhY2tldDsKIAllcC0+aGFzX2RtYSA9IDA7CkBAIC0yNzAsNyArMjY5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotb21hcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgZ2ZwX2ZsYWdzKQorb21hcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IG9tYXBfcmVxCSpyZXE7CiAKQEAgLTI5OSw3ICsyOTgsNyBAQAogCXN0cnVjdCB1c2JfZXAJKl9lcCwKIAl1bnNpZ25lZAlieXRlcywKIAlkbWFfYWRkcl90CSpkbWEsCi0JaW50CQlnZnBfZmxhZ3MKKwl1bnNpZ25lZAlnZnBfZmxhZ3MKICkKIHsKIAl2b2lkCQkqcmV0dmFsOwpAQCAtMzg4LDggKzM4Nyw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUJRklGT19GVUxMCShVRENfTk9OX0lTT19GSUZPX0ZVTEwgfCBVRENfSVNPX0ZJRk9fRlVMTCkKLSNkZWZpbmUJRklGT19VTldSSVRBQkxFCShVRENfRVBfSEFMVEVEIHwgRklGT19GVUxMKQorI2RlZmluZSBVRENfRklGT19GVUxMCQkoVURDX05PTl9JU09fRklGT19GVUxMIHwgVURDX0lTT19GSUZPX0ZVTEwpCisjZGVmaW5lIFVEQ19GSUZPX1VOV1JJVEFCTEUJKFVEQ19FUF9IQUxURUQgfCBVRENfRklGT19GVUxMKQogCiAjZGVmaW5lIEZJRk9fRU1QVFkJKFVEQ19OT05fSVNPX0ZJRk9fRU1QVFkgfCBVRENfSVNPX0ZJRk9fRU1QVFkpCiAjZGVmaW5lIEZJRk9fVU5SRUFEQUJMRSAoVURDX0VQX0hBTFRFRCB8IEZJRk9fRU1QVFkpCkBAIC00MzMsNyArNDMyLDcgQEAKIAogCS8qIFBJTy1JTiBpc24ndCBkb3VibGUgYnVmZmVyZWQgZXhjZXB0IGZvciBpc28gKi8KIAllcF9zdGF0ID0gVURDX1NUQVRfRkxHX1JFRzsKLQlpZiAoZXBfc3RhdCAmIEZJRk9fVU5XUklUQUJMRSkKKwlpZiAoZXBfc3RhdCAmIFVEQ19GSUZPX1VOV1JJVEFCTEUpCiAJCXJldHVybiAwOwogCiAJY291bnQgPSBlcC0+ZXAubWF4cGFja2V0OwpAQCAtNTA0LDcgKzUwMyw3IEBACiAJCWlmIChlcF9zdGF0ICYgVURDX0VQX0hBTFRFRCkKIAkJCWJyZWFrOwogCi0JCWlmIChlcF9zdGF0ICYgRklGT19GVUxMKQorCQlpZiAoZXBfc3RhdCAmIFVEQ19GSUZPX0ZVTEwpCiAJCQlhdmFpbCA9IGVwLT5lcC5tYXhwYWNrZXQ7CiAJCWVsc2UgIHsKIAkJCWF2YWlsID0gVURDX1JYRlNUQVRfUkVHOwpAQCAtNTM4LDYgKzUzNywzMiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX2NzYWModW5zaWduZWQgbGNoKQoreworCWRtYV9hZGRyX3QJY3NhYzsKKworCS8qIG9tYXAgMy4yLzMuMyBlcnJhdHVtOiBzb21ldGltZXMgMCBpcyByZXR1cm5lZCBpZiBDU0FDL0NEQUMgaXMKKwkgKiByZWFkIGJlZm9yZSB0aGUgRE1BIGNvbnRyb2xsZXIgZmluaXNoZWQgZGlzYWJsaW5nIHRoZSBjaGFubmVsLgorCSAqLworCWNzYWMgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTQUMobGNoKSk7CisJaWYgKGNzYWMgPT0gMCkKKwkJY3NhYyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NBQyhsY2gpKTsKKwlyZXR1cm4gY3NhYzsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9jZGFjKHVuc2lnbmVkIGxjaCkKK3sKKwlkbWFfYWRkcl90CWNkYWM7CisKKwkvKiBvbWFwIDMuMi8zLjMgZXJyYXR1bTogc29tZXRpbWVzIDAgaXMgcmV0dXJuZWQgaWYgQ1NBQy9DREFDIGlzCisJICogcmVhZCBiZWZvcmUgdGhlIERNQSBjb250cm9sbGVyIGZpbmlzaGVkIGRpc2FibGluZyB0aGUgY2hhbm5lbC4KKwkgKi8KKwljZGFjID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DREFDKGxjaCkpOworCWlmIChjZGFjID09IDApCisJCWNkYWMgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NEQUMobGNoKSk7CisJcmV0dXJuIGNkYWM7Cit9CisKIHN0YXRpYyB1MTYgZG1hX3NyY19sZW4oc3RydWN0IG9tYXBfZXAgKmVwLCBkbWFfYWRkcl90IHN0YXJ0KQogewogCWRtYV9hZGRyX3QJZW5kOwpAQCAtNTQ4LDcgKzU3Myw3IEBACiAJaWYgKGNwdV9pc19vbWFwMTV4eCgpKQogCQlyZXR1cm4gMDsKIAotCWVuZCA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NBQyhlcC0+bGNoKSk7CisJZW5kID0gZG1hX2NzYWMoZXAtPmxjaCk7CiAJaWYgKGVuZCA9PSBlcC0+ZG1hX2NvdW50ZXIpCiAJCXJldHVybiAwOwogCkBAIC01NTksMTQgKzU4NCwxNCBAQAogfQogCiAjZGVmaW5lIERNQV9ERVNUX0xBU1QoeCkgKGNwdV9pc19vbWFwMTV4eCgpIFwKLQkJPyBPTUFQX0RNQV9DU0FDKHgpIC8qIHJlYWxseTogQ1BDICovIFwKLQkJOiBPTUFQX0RNQV9DREFDKHgpKQorCQk/IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NBQyh4KSkgLyogcmVhbGx5OiBDUEMgKi8gXAorCQk6IGRtYV9jZGFjKHgpKQogCiBzdGF0aWMgdTE2IGRtYV9kZXN0X2xlbihzdHJ1Y3Qgb21hcF9lcCAqZXAsIGRtYV9hZGRyX3Qgc3RhcnQpCiB7CiAJZG1hX2FkZHJfdAllbmQ7CiAKLQllbmQgPSBvbWFwX3JlYWR3KERNQV9ERVNUX0xBU1QoZXAtPmxjaCkpOworCWVuZCA9IERNQV9ERVNUX0xBU1QoZXAtPmxjaCk7CiAJaWYgKGVuZCA9PSBlcC0+ZG1hX2NvdW50ZXIpCiAJCXJldHVybiAwOwogCkBAIC01OTMsNyArNjE4LDcgQEAKIAkJCQk6IE9NQVBfRE1BX1NZTkNfRUxFTUVOVDsKIAogCS8qIG1lYXN1cmUgbGVuZ3RoIGluIGVpdGhlciBieXRlcyBvciBwYWNrZXRzICovCi0JaWYgKChjcHVfaXNfb21hcDE2eHgoKSAmJiBsZW5ndGggPD0gKFVEQ19UWE5fVFNDICsgMSkpCisJaWYgKChjcHVfaXNfb21hcDE2eHgoKSAmJiBsZW5ndGggPD0gVURDX1RYTl9UU0MpCiAJCQl8fCAoY3B1X2lzX29tYXAxNXh4KCkgJiYgbGVuZ3RoIDwgZXAtPm1heHBhY2tldCkpIHsKIAkJdHhkbWFfY3RybCA9IFVEQ19UWE5fRU9UIHwgbGVuZ3RoOwogCQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKGVwLT5sY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TOCwKQEAgLTYwMiwxNSArNjI3LDE1IEBACiAJCWxlbmd0aCA9IG1pbihsZW5ndGggLyBlcC0+bWF4cGFja2V0LAogCQkJCSh1bnNpZ25lZCkgVURDX1RYTl9UU0MgKyAxKTsKICAJCXR4ZG1hX2N0cmwgPSBsZW5ndGg7Ci0JCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoZXAtPmxjaCwgT01BUF9ETUFfREFUQV9UWVBFX1M4LAotCQkJCWVwLT5lcC5tYXhwYWNrZXQsIGxlbmd0aCwgc3luY19tb2RlKTsKKwkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhlcC0+bGNoLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAorCQkJCWVwLT5lcC5tYXhwYWNrZXQgPj4gMSwgbGVuZ3RoLCBzeW5jX21vZGUpOwogCQlsZW5ndGggKj0gZXAtPm1heHBhY2tldDsKIAl9CiAJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMoZXAtPmxjaCwgT01BUF9ETUFfUE9SVF9FTUlGRiwKIAkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsIHJlcS0+cmVxLmRtYSArIHJlcS0+cmVxLmFjdHVhbCk7CiAKIAlvbWFwX3N0YXJ0X2RtYShlcC0+bGNoKTsKLQllcC0+ZG1hX2NvdW50ZXIgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTQUMoZXAtPmxjaCkpOworCWVwLT5kbWFfY291bnRlciA9IGRtYV9jc2FjKGVwLT5sY2gpOwogCVVEQ19ETUFfSVJRX0VOX1JFRyB8PSBVRENfVFhfRE9ORV9JRShlcC0+ZG1hX2NoYW5uZWwpOwogCVVEQ19UWERNQV9SRUcoZXAtPmRtYV9jaGFubmVsKSA9IFVEQ19UWE5fU1RBUlQgfCB0eGRtYV9jdHJsOwogCXJlcS0+ZG1hX2J5dGVzID0gbGVuZ3RoOwpAQCAtNjUwLDEyICs2NzUsMTIgQEAKIAlwYWNrZXRzID0gKHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCkgLyBlcC0+ZXAubWF4cGFja2V0OwogCXBhY2tldHMgPSBtaW4ocGFja2V0cywgKHVuc2lnbmVkKVVEQ19SWE5fVEMgKyAxKTsKIAlyZXEtPmRtYV9ieXRlcyA9IHBhY2tldHMgKiBlcC0+ZXAubWF4cGFja2V0OwotCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoZXAtPmxjaCwgT01BUF9ETUFfREFUQV9UWVBFX1M4LAotCQkJZXAtPmVwLm1heHBhY2tldCwgcGFja2V0cywKKwlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKGVwLT5sY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCQllcC0+ZXAubWF4cGFja2V0ID4+IDEsIHBhY2tldHMsCiAJCQlPTUFQX0RNQV9TWU5DX0VMRU1FTlQpOwogCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhlcC0+bGNoLCBPTUFQX0RNQV9QT1JUX0VNSUZGLAogCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywgcmVxLT5yZXEuZG1hICsgcmVxLT5yZXEuYWN0dWFsKTsKLQllcC0+ZG1hX2NvdW50ZXIgPSBvbWFwX3JlYWR3KERNQV9ERVNUX0xBU1QoZXAtPmxjaCkpOworCWVwLT5kbWFfY291bnRlciA9IERNQV9ERVNUX0xBU1QoZXAtPmxjaCk7CiAKIAlVRENfUlhETUFfUkVHKGVwLT5kbWFfY2hhbm5lbCkgPSBVRENfUlhOX1NUT1AgfCAocGFja2V0cyAtIDEpOwogCVVEQ19ETUFfSVJRX0VOX1JFRyB8PSBVRENfUlhfRU9UX0lFKGVwLT5kbWFfY2hhbm5lbCk7CkBAIC03NjMsNyArNzg4LDcgQEAKIAkJcmVnID0gVURDX1RYRE1BX0NGR19SRUc7CiAJZWxzZQogCQlyZWcgPSBVRENfUlhETUFfQ0ZHX1JFRzsKLQlyZWcgfD0gMSA8PCAxMjsJCS8qICJwdWxzZSIgYWN0aXZhdGVkICovCisJcmVnIHw9IFVEQ19ETUFfUkVROwkJLyogInB1bHNlIiBhY3RpdmF0ZWQgKi8KIAogCWVwLT5kbWFfY2hhbm5lbCA9IDA7CiAJZXAtPmxjaCA9IC0xOwpAQCAtNzg3LDYgKzgxMiwxMSBAQAogCQkJZXAtPmVwLm5hbWUsIGRtYV9lcnJvciwgZXAsICZlcC0+bGNoKTsKIAkJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCQlVRENfVFhETUFfQ0ZHX1JFRyA9IHJlZzsKKwkJCS8qIEVNSUZGICovCisJCQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoZXAtPmxjaCwKKwkJCQkJCU9NQVBfRE1BX0RBVEFfQlVSU1RfNCk7CisJCQlvbWFwX3NldF9kbWFfc3JjX2RhdGFfcGFjayhlcC0+bGNoLCAxKTsKKwkJCS8qIFRJUEIgKi8KIAkJCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhlcC0+bGNoLAogCQkJCU9NQVBfRE1BX1BPUlRfVElQQiwKIAkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKQEAgLTc5NywxMCArODI3LDE1IEBACiAJCQllcC0+ZXAubmFtZSwgZG1hX2Vycm9yLCBlcCwgJmVwLT5sY2gpOwogCQlpZiAoc3RhdHVzID09IDApIHsKIAkJCVVEQ19SWERNQV9DRkdfUkVHID0gcmVnOworCQkJLyogVElQQiAqLwogCQkJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMoZXAtPmxjaCwKIAkJCQlPTUFQX0RNQV9QT1JUX1RJUEIsCiAJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCiAJCQkJKHVuc2lnbmVkIGxvbmcpIGlvX3YycCgodTMyKSZVRENfREFUQV9ETUFfUkVHKSk7CisJCQkvKiBFTUlGRiAqLworCQkJb21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZShlcC0+bGNoLAorCQkJCQkJT01BUF9ETUFfREFUQV9CVVJTVF80KTsKKwkJCW9tYXBfc2V0X2RtYV9kZXN0X2RhdGFfcGFjayhlcC0+bGNoLCAxKTsKIAkJfQogCX0KIAlpZiAoc3RhdHVzKQpAQCAtODU2LDcgKzg5MSw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKQogCQlyZXEgPSBjb250YWluZXJfb2YoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBvbWFwX3JlcSwgcXVldWUpOwogCWVsc2UKLQkJcmVxID0gMDsKKwkJcmVxID0gTlVMTDsKIAogCWFjdGl2ZSA9ICgoMSA8PCA3KSAmIG9tYXBfcmVhZGwoT01BUF9ETUFfQ0NSKGVwLT5sY2gpKSkgIT0gMDsKIApAQCAtODY1LDkgKzkwMCwxMyBAQAogCQkJKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgPyAndCcgOiAncicsCiAJCQllcC0+ZG1hX2NoYW5uZWwgLSAxLCByZXEpOwogCisJLyogTk9URTogcmUtc2V0dGluZyBSWF9SRVEvVFhfUkVRIGJlY2F1c2Ugb2YgYSBjaGlwIGJ1ZyAoYmVmb3JlCisJICogT01BUCAxNzEwIEVTMi4wKSB3aGVyZSByZWFkaW5nIHRoZSBETUFfQ0ZHIGNhbiBjbGVhciB0aGVtLgorCSAqLworCiAJLyogd2FpdCB0aWxsIGN1cnJlbnQgcGFja2V0IERNQSBmaW5pc2hlcywgYW5kIGZpZm8gZW1wdGllcyAqLwogCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKLQkJVURDX1RYRE1BX0NGR19SRUcgJj0gfm1hc2s7CisJCVVEQ19UWERNQV9DRkdfUkVHID0gKFVEQ19UWERNQV9DRkdfUkVHICYgfm1hc2spIHwgVURDX0RNQV9SRVE7CiAKIAkJaWYgKHJlcSkgewogCQkJZmluaXNoX2luX2RtYShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CkBAIC04ODAsNyArOTE5LDcgQEAKIAkJd2hpbGUgKFVEQ19UWERNQV9DRkdfUkVHICYgbWFzaykKIAkJCXVkZWxheSgxMCk7CiAJfSBlbHNlIHsKLQkJVURDX1JYRE1BX0NGR19SRUcgJj0gfm1hc2s7CisJCVVEQ19SWERNQV9DRkdfUkVHID0gKFVEQ19SWERNQV9DRkdfUkVHICYgfm1hc2spIHwgVURDX0RNQV9SRVE7CiAKIAkJLyogZG1hIGVtcHRpZXMgdGhlIGZpZm8gKi8KIAkJd2hpbGUgKFVEQ19SWERNQV9DRkdfUkVHICYgbWFzaykKQEAgLTg5OCw3ICs5MzcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludAotb21hcF9lcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgaW50IGdmcF9mbGFncykKK29tYXBfZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3Qgb21hcF9lcAkqZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3Qgb21hcF9lcCwgZXApOwogCXN0cnVjdCBvbWFwX3JlcQkqcmVxID0gY29udGFpbmVyX29mKF9yZXEsIHN0cnVjdCBvbWFwX3JlcSwgcmVxKTsKQEAgLTk5NywxOCArMTAzNiwxOSBAQAogCQkJCQlVRENfSVJRX0VOX1JFRyA9IGlycV9lbjsKIAkJCQl9CiAKLQkJCQkvKiBTVEFUVVMgaXMgcmV2ZXJzZSBkaXJlY3Rpb24gKi8KLQkJCQlVRENfRVBfTlVNX1JFRyA9IGlzX2luCi0JCQkJCQk/IFVEQ19FUF9TRUwKLQkJCQkJCTogKFVEQ19FUF9TRUx8VURDX0VQX0RJUik7CisJCQkJLyogU1RBVFVTIGZvciB6ZXJvIGxlbmd0aCBEQVRBIHN0YWdlcyBpcworCQkJCSAqIGFsd2F5cyBhbiBJTiAuLi4gZXZlbiBmb3IgSU4gdHJhbnNmZXJzLAorCQkJCSAqIGEgd2llcmQgY2FzZSB3aGljaCBzZWVtIHRvIHN0YWxsIE9NQVAuCisJCQkJICovCisJCQkJVURDX0VQX05VTV9SRUcgPSAoVURDX0VQX1NFTHxVRENfRVBfRElSKTsKIAkJCQlVRENfQ1RSTF9SRUcgPSBVRENfQ0xSX0VQOwogCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKLQkJCQlVRENfRVBfTlVNX1JFRyA9IHVkYy0+ZXAwX2luID8gMCA6IFVEQ19FUF9ESVI7CisJCQkJVURDX0VQX05VTV9SRUcgPSBVRENfRVBfRElSOwogCiAJCQkJLyogY2xlYW51cCAqLwogCQkJCXVkYy0+ZXAwX3BlbmRpbmcgPSAwOwogCQkJCWRvbmUoZXAsIHJlcSwgMCk7Ci0JCQkJcmVxID0gMDsKKwkJCQlyZXEgPSBOVUxMOwogCiAJCQkvKiBub24tZW1wdHkgREFUQSBzdGFnZSAqLwogCQkJfSBlbHNlIGlmIChpc19pbikgewpAQCAtMTAyOSw3ICsxMDY5LDcgQEAKIAkJCShpc19pbiA/IG5leHRfaW5fZG1hIDogbmV4dF9vdXRfZG1hKShlcCwgcmVxKTsKIAkJZWxzZSBpZiAocmVxKSB7CiAJCQlpZiAoKGlzX2luID8gd3JpdGVfZmlmbyA6IHJlYWRfZmlmbykoZXAsIHJlcSkgPT0gMSkKLQkJCQlyZXEgPSAwOworCQkJCXJlcSA9IE5VTEw7CiAJCQlkZXNlbGVjdF9lcCgpOwogCQkJaWYgKCFpc19pbikgewogCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKQEAgLTEwNDEsNyArMTA4MSw3IEBACiAKIGlycV93YWl0OgogCS8qIGlycSBoYW5kbGVyIGFkdmFuY2VzIHRoZSBxdWV1ZSAqLwotCWlmIChyZXEgIT0gMCkKKwlpZiAocmVxICE9IE5VTEwpCiAJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUsICZlcC0+cXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMTQwLDcgKzExODAsNyBAQAogCQkJCWRtYV9jaGFubmVsX2NsYWltKGVwLCBjaGFubmVsKTsKIAkJfSBlbHNlIHsKIAkJCXVzZV9lcChlcCwgMCk7Ci0JCQlVRENfQ1RSTF9SRUcgPSBVRENfUkVTRVRfRVA7CisJCQlVRENfQ1RSTF9SRUcgPSBlcC0+dWRjLT5jbHJfaGFsdDsKIAkJCWVwLT5hY2t3YWl0ID0gMDsKIAkJCWlmICghKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikpIHsKIAkJCQlVRENfQ1RSTF9SRUcgPSBVRENfU0VUX0ZJRk9fRU47CkBAIC0xMjM4LDYgKzEyNzgsOCBAQAogCiBzdGF0aWMgdm9pZCBwdWxsdXBfZW5hYmxlKHN0cnVjdCBvbWFwX3VkYyAqdWRjKQogeworCXVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwl1ZGMtPmdhZGdldC5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCVVEQ19TWVNDT04xX1JFRyB8PSBVRENfUFVMTFVQX0VOOwogI2lmbmRlZiBDT05GSUdfVVNCX09URwogCWlmICghY3B1X2lzX29tYXAxNXh4KCkpCkBAIC0xMzgyLDcgKzE0MjQsNyBAQAogc3RhdGljIHZvaWQgZXAwX2lycShzdHJ1Y3Qgb21hcF91ZGMgKnVkYywgdTE2IGlycV9zcmMpCiB7CiAJc3RydWN0IG9tYXBfZXAJKmVwMCA9ICZ1ZGMtPmVwWzBdOwotCXN0cnVjdCBvbWFwX3JlcQkqcmVxID0gMDsKKwlzdHJ1Y3Qgb21hcF9yZXEJKnJlcSA9IE5VTEw7CiAKIAllcDAtPmlycXMrKzsKIApAQCAtMTQzOCw3ICsxNDgwLDcgQEAKIAkJCQlpZiAocmVxKQogCQkJCQlkb25lKGVwMCwgcmVxLCAwKTsKIAkJCX0KLQkJCXJlcSA9IDA7CisJCQlyZXEgPSBOVUxMOwogCQl9IGVsc2UgaWYgKHN0YXQgJiBVRENfU1RBTEwpIHsKIAkJCVVEQ19DVFJMX1JFRyA9IFVEQ19DTFJfSEFMVDsKIAkJCVVEQ19FUF9OVU1fUkVHID0gVURDX0VQX0RJUjsKQEAgLTE1MTEsOSArMTU1MywxMCBAQAogCQkJdS53b3JkWzNdID0gVURDX0RBVEFfUkVHOwogCQkJVURDX0VQX05VTV9SRUcgPSAwOwogCQl9IHdoaWxlIChVRENfSVJRX1NSQ19SRUcgJiBVRENfU0VUVVApOwotCQlsZTE2X3RvX2NwdXMgKCZ1LnIud1ZhbHVlKTsKLQkJbGUxNl90b19jcHVzICgmdS5yLndJbmRleCk7Ci0JCWxlMTZfdG9fY3B1cyAoJnUuci53TGVuZ3RoKTsKKworI2RlZmluZQl3X3ZhbHVlCQlsZTE2X3RvX2NwdXAgKCZ1LnIud1ZhbHVlKQorI2RlZmluZQl3X2luZGV4CQlsZTE2X3RvX2NwdXAgKCZ1LnIud0luZGV4KQorI2RlZmluZQl3X2xlbmd0aAlsZTE2X3RvX2NwdXAgKCZ1LnIud0xlbmd0aCkKIAogCQkvKiBEZWxlZ2F0ZSBhbG1vc3QgYWxsIGNvbnRyb2wgcmVxdWVzdHMgdG8gdGhlIGdhZGdldCBkcml2ZXIsCiAJCSAqIGV4Y2VwdCBmb3IgYSBoYW5kZnVsIG9mIGNoOSBzdGF0dXMvZmVhdHVyZSByZXF1ZXN0cyB0aGF0CkBAIC0xNTI5LDExICsxNTcyLDExIEBACiAJCQkvKiB1ZGMgbmVlZHMgdG8ga25vdyB3aGVuIGVwICE9IDAgaXMgdmFsaWQgKi8KIAkJCWlmICh1LnIuYlJlcXVlc3RUeXBlICE9IFVTQl9SRUNJUF9ERVZJQ0UpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICh1LnIud0xlbmd0aCAhPSAwKQorCQkJaWYgKHdfbGVuZ3RoICE9IDApCiAJCQkJZ290byBkb19zdGFsbDsKIAkJCXVkYy0+ZXAwX3NldF9jb25maWcgPSAxOwotCQkJdWRjLT5lcDBfcmVzZXRfY29uZmlnID0gKHUuci53VmFsdWUgPT0gMCk7Ci0JCQlWREJHKCJzZXQgY29uZmlnICVkXG4iLCB1LnIud1ZhbHVlKTsKKwkJCXVkYy0+ZXAwX3Jlc2V0X2NvbmZpZyA9ICh3X3ZhbHVlID09IDApOworCQkJVkRCRygic2V0IGNvbmZpZyAlZFxuIiwgd192YWx1ZSk7CiAKIAkJCS8qIHVwZGF0ZSB1ZGMgTk9XIHNpbmNlIGdhZGdldCBkcml2ZXIgbWF5IHN0YXJ0CiAJCQkgKiBxdWV1ZWluZyByZXF1ZXN0cyBpbW1lZGlhdGVseTsgY2xlYXIgY29uZmlnCkBAIC0xNTQ5LDIzICsxNTkyLDI4IEBACiAJCQkvKiBjbGVhciBlbmRwb2ludCBoYWx0ICovCiAJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICh1LnIud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCi0JCQkJCXx8IHUuci53TGVuZ3RoICE9IDApCisJCQlpZiAod192YWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAorCQkJCQl8fCB3X2xlbmd0aCAhPSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7Ci0JCQllcCA9ICZ1ZGMtPmVwW3Uuci53SW5kZXggJiAweGZdOworCQkJZXAgPSAmdWRjLT5lcFt3X2luZGV4ICYgMHhmXTsKIAkJCWlmIChlcCAhPSBlcDApIHsKLQkJCQlpZiAodS5yLndJbmRleCAmIFVTQl9ESVJfSU4pCisJCQkJaWYgKHdfaW5kZXggJiBVU0JfRElSX0lOKQogCQkJCQllcCArPSAxNjsKIAkJCQlpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DCiAJCQkJCQl8fCAhZXAtPmRlc2MpCiAJCQkJCWdvdG8gZG9fc3RhbGw7CiAJCQkJdXNlX2VwKGVwLCAwKTsKLQkJCQlVRENfQ1RSTF9SRUcgPSBVRENfUkVTRVRfRVA7CisJCQkJVURDX0NUUkxfUkVHID0gdWRjLT5jbHJfaGFsdDsKIAkJCQllcC0+YWNrd2FpdCA9IDA7CiAJCQkJaWYgKCEoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkgewogCQkJCQlVRENfQ1RSTF9SRUcgPSBVRENfU0VUX0ZJRk9fRU47CiAJCQkJCWVwLT5hY2t3YWl0ID0gMSArIGVwLT5kb3VibGVfYnVmOwogCQkJCX0KKwkJCQkvKiBOT1RFOiAgYXNzdW1lcyB0aGUgaG9zdCBiZWhhdmVzIHNhbmVseSwKKwkJCQkgKiBvbmx5IGNsZWFyaW5nIHJlYWwgaGFsdHMuICBFbHNlIHdlIG1heQorCQkJCSAqIG5lZWQgdG8ga2lsbCBwZW5kaW5nIHRyYW5zZmVycyBhbmQgdGhlbgorCQkJCSAqIHJlc3RhcnQgdGhlIHF1ZXVlLi4uIHZlcnkgbWVzc3kgZm9yIERNQSEKKwkJCQkgKi8KIAkJCX0KIAkJCVZEQkcoIiVzIGhhbHQgY2xlYXJlZCBieSBob3N0XG4iLCBlcC0+bmFtZSk7CiAJCQlnb3RvIGVwMG91dF9zdGF0dXNfc3RhZ2U7CkBAIC0xNTczLDExICsxNjIxLDExIEBACiAJCQkvKiBzZXQgZW5kcG9pbnQgaGFsdCAqLwogCQkJaWYgKHUuci5iUmVxdWVzdFR5cGUgIT0gVVNCX1JFQ0lQX0VORFBPSU5UKQogCQkJCWdvdG8gZGVsZWdhdGU7Ci0JCQlpZiAodS5yLndWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAotCQkJCQl8fCB1LnIud0xlbmd0aCAhPSAwKQorCQkJaWYgKHdfdmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQKKwkJCQkJfHwgd19sZW5ndGggIT0gMCkKIAkJCQlnb3RvIGRvX3N0YWxsOwotCQkJZXAgPSAmdWRjLT5lcFt1LnIud0luZGV4ICYgMHhmXTsKLQkJCWlmICh1LnIud0luZGV4ICYgVVNCX0RJUl9JTikKKwkJCWVwID0gJnVkYy0+ZXBbd19pbmRleCAmIDB4Zl07CisJCQlpZiAod19pbmRleCAmIFVTQl9ESVJfSU4pCiAJCQkJZXAgKz0gMTY7CiAJCQlpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DCiAJCQkJCXx8IGVwID09IGVwMCB8fCAhZXAtPmRlc2MpCkBAIC0xNjE1LDEzICsxNjYzLDEzIEBACiAJCQlVRENfQ1RSTF9SRUcgPSBVRENfU0VUX0ZJRk9fRU47CiAJCQlVRENfRVBfTlVNX1JFRyA9IFVEQ19FUF9ESVI7CiAJCQlzdGF0dXMgPSAwOwotCQkJVkRCRygiR0VUX1NUQVRVUywgaW50ZXJmYWNlICVkXG4iLCB1LnIud0luZGV4KTsKKwkJCVZEQkcoIkdFVF9TVEFUVVMsIGludGVyZmFjZSAlZFxuIiwgd19pbmRleCk7CiAJCQkvKiBuZXh0LCBzdGF0dXMgc3RhZ2UgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogZGVsZWdhdGU6CiAJCQkvKiBhY3RpdmF0ZSB0aGUgZXAwb3V0IGZpZm8gcmlnaHQgYXdheSAqLwotCQkJaWYgKCF1ZGMtPmVwMF9pbiAmJiB1LnIud0xlbmd0aCkgeworCQkJaWYgKCF1ZGMtPmVwMF9pbiAmJiB3X2xlbmd0aCkgewogCQkJCVVEQ19FUF9OVU1fUkVHID0gMDsKIAkJCQlVRENfQ1RSTF9SRUcgPSBVRENfU0VUX0ZJRk9fRU47CiAJCQl9CkBAIC0xNjMyLDcgKzE2ODAsMTEgQEAKIAkJCSAqLwogCQkJVkRCRygiU0VUVVAgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAogCQkJCXUuci5iUmVxdWVzdFR5cGUsIHUuci5iUmVxdWVzdCwKLQkJCQl1LnIud1ZhbHVlLCB1LnIud0luZGV4LCB1LnIud0xlbmd0aCk7CisJCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgpOworCisjdW5kZWYJd192YWx1ZQorI3VuZGVmCXdfaW5kZXgKKyN1bmRlZgl3X2xlbmd0aAogCiAJCQkvKiBUaGUgZ2FkZ2V0IGRyaXZlciBtYXkgcmV0dXJuIGFuIGVycm9yIGhlcmUsCiAJCQkgKiBjYXVzaW5nIGFuIGltbWVkaWF0ZSBwcm90b2NvbCBzdGFsbC4KQEAgLTIwMTMsNyArMjA2NSw3IEBACiAJdWRjLT5zb2Z0Y29ubmVjdCA9IDE7CiAKIAkvKiBob29rIHVwIHRoZSBkcml2ZXIgKi8KLQlkcml2ZXItPmRyaXZlci5idXMgPSAwOworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9IE5VTEw7CiAJdWRjLT5kcml2ZXIgPSBkcml2ZXI7CiAJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKQEAgLTIwMjEsOCArMjA3Myw4IEBACiAJc3RhdHVzID0gZHJpdmVyLT5iaW5kICgmdWRjLT5nYWRnZXQpOwogCWlmIChzdGF0dXMpIHsKIAkJREJHKCJiaW5kIHRvICVzIC0tPiAlZFxuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSwgc3RhdHVzKTsKLQkJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IDA7Ci0JCXVkYy0+ZHJpdmVyID0gMDsKKwkJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJCXVkYy0+ZHJpdmVyID0gTlVMTDsKIAkJZ290byBkb25lOwogCX0KIAlEQkcoImJvdW5kIHRvIGRyaXZlciAlc1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CkBAIC0yMDM1LDggKzIwODcsOCBAQAogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJRVJSKCJjYW4ndCBiaW5kIHRvIHRyYW5zY2VpdmVyXG4iKTsKIAkJCWRyaXZlci0+dW5iaW5kICgmdWRjLT5nYWRnZXQpOwotCQkJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IDA7Ci0JCQl1ZGMtPmRyaXZlciA9IDA7CisJCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwkJCXVkYy0+ZHJpdmVyID0gTlVMTDsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSB7CkBAIC0yMDcxLDcgKzIxMjMsNyBAQAogCQlvbWFwX3ZidXNfc2Vzc2lvbigmdWRjLT5nYWRnZXQsIDApOwogCiAJaWYgKHVkYy0+dHJhbnNjZWl2ZXIpCi0JCSh2b2lkKSBvdGdfc2V0X3BlcmlwaGVyYWwodWRjLT50cmFuc2NlaXZlciwgMCk7CisJCSh2b2lkKSBvdGdfc2V0X3BlcmlwaGVyYWwodWRjLT50cmFuc2NlaXZlciwgTlVMTCk7CiAJZWxzZQogCQlwdWxsdXBfZGlzYWJsZSh1ZGMpOwogCkBAIC0yMDgwLDkgKzIxMzIsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJZHJpdmVyLT51bmJpbmQoJnVkYy0+Z2FkZ2V0KTsKLQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gMDsKLQl1ZGMtPmRyaXZlciA9IDA7Ci0KKwl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwl1ZGMtPmRyaXZlciA9IE5VTEw7CiAKIAlEQkcoInVucmVnaXN0ZXJlZCBkcml2ZXIgJyVzJ1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTIxNzgsMTQgKzIyMjksMTQgQEAKIAogCXRtcCA9IE9UR19SRVZfUkVHOwogCXRyYW5zID0gVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHOwotCXNlcV9wcmludGYocywgIk9URyByZXYgJWQuJWQsIHRyYW5zY2VpdmVyX2N0cmwgJTAzeFxuIiwKKwlzZXFfcHJpbnRmKHMsICJcbk9URyByZXYgJWQuJWQsIHRyYW5zY2VpdmVyX2N0cmwgJTA1eFxuIiwKIAkJdG1wID4+IDQsIHRtcCAmIDB4ZiwgdHJhbnMpOwogCXRtcCA9IE9UR19TWVNDT05fMV9SRUc7CiAJc2VxX3ByaW50ZihzLCAib3RnX3N5c2NvbjEgJTA4eCB1c2IyICVzLCB1c2IxICVzLCB1c2IwICVzLCIKIAkJCUZPVVJCSVRTICJcbiIsIHRtcCwKIAkJdHJ4X21vZGUoVVNCMl9UUlhfTU9ERSh0bXApLCB0cmFucyAmIENPTkZfVVNCMl9VTklfUiksCiAJCXRyeF9tb2RlKFVTQjFfVFJYX01PREUodG1wKSwgdHJhbnMgJiBDT05GX1VTQjFfVU5JX1IpLAotCQkoVVNCMF9UUlhfTU9ERSh0bXApID09IDApCisJCShVU0IwX1RSWF9NT0RFKHRtcCkgPT0gMCAmJiAhY3B1X2lzX29tYXAxNzEwKCkpCiAJCQk/ICJpbnRlcm5hbCIKIAkJCTogdHJ4X21vZGUoVVNCMF9UUlhfTU9ERSh0bXApLCAxKSwKIAkJKHRtcCAmIE9UR19JRExFX0VOKSA/ICIgIW90ZyIgOiAiIiwKQEAgLTIyMzUsNiArMjI4Niw3IEBACiAJc2VxX3ByaW50ZihzLCAib3RnX291dGN0cmwgJTA0eCIgIlxuIiwgdG1wKTsKIAl0bXAgPSBPVEdfVEVTVF9SRUc7CiAJc2VxX3ByaW50ZihzLCAib3RnX3Rlc3QgICAgJTA0eCIgIlxuIiwgdG1wKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwcm9jX3VkY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqXykKQEAgLTIzNzgsNyArMjQzMCw3IEBACiAKIHN0YXRpYyBpbnQgcHJvY191ZGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY191ZGNfc2hvdywgMCk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdWRjX3Nob3csIE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29wcyA9IHsKQEAgLTIzOTksNyArMjQ1MSw3IEBACiAKIHN0YXRpYyB2b2lkIHJlbW92ZV9wcm9jX2ZpbGUodm9pZCkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2ZpbGVuYW1lLCAwKTsKKwlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2ZpbGVuYW1lLCBOVUxMKTsKIH0KIAogI2Vsc2UKQEAgLTI0MTQsNiArMjQ2NiwxMCBAQAogLyogQmVmb3JlIHRoaXMgY29udHJvbGxlciBjYW4gZW51bWVyYXRlLCB3ZSBuZWVkIHRvIHBpY2sgYW4gZW5kcG9pbnQKICAqIGNvbmZpZ3VyYXRpb24sIG9yICJmaWZvX21vZGUiICBUaGF0IGludm9sdmVzIGFsbG9jYXRpbmcgMktCIG9mIHBhY2tldAogICogYnVmZmVyIHNwYWNlIGFtb25nIHRoZSBlbmRwb2ludHMgd2UnbGwgYmUgb3BlcmF0aW5nLgorICoKKyAqIE5PVEU6IGFzIG9mIE9NQVAgMTcxMCBFUzIuMCwgd3JpdGluZyBhIG5ldyBlbmRwb2ludCBjb25maWcgd2hlbgorICogVURDX1NZU0NPTl8xX1JFRy5DRkdfTE9DSyBpcyBzZXQgY2FuIG5vdyB3b3JrLiAgV2Ugd29uJ3QgdXNlIHRoYXQKKyAqIGNhcGFiaWxpdHkgeWV0IHRob3VnaC4KICAqLwogc3RhdGljIHVuc2lnbmVkIF9faW5pdAogb21hcF9lcF9zZXR1cChjaGFyICpuYW1lLCB1OCBhZGRyLCB1OCB0eXBlLApAQCAtMjUwNSw3ICsyNTYxLDcgQEAKIHsKIAljb21wbGV0ZSh1ZGMtPmRvbmUpOwogCWtmcmVlICh1ZGMpOwotCXVkYyA9IDA7CisJdWRjID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBfX2luaXQKQEAgLTI1NzcsMjMgKzI2MzMsMzMgQEAKIAljYXNlIDE6CiAJCU9NQVBfQlVMS19FUCgiZXAxaW4iLCAgVVNCX0RJUl9JTiAgfCAxKTsKIAkJT01BUF9CVUxLX0VQKCJlcDJvdXQiLCBVU0JfRElSX09VVCB8IDIpOworCQlPTUFQX0lOVF9FUCgiZXA5aW4iLCAgIFVTQl9ESVJfSU4gIHwgOSwgMTYpOworCiAJCU9NQVBfQlVMS19FUCgiZXAzaW4iLCAgVVNCX0RJUl9JTiAgfCAzKTsKIAkJT01BUF9CVUxLX0VQKCJlcDRvdXQiLCBVU0JfRElSX09VVCB8IDQpOworCQlPTUFQX0lOVF9FUCgiZXAxMGluIiwgIFVTQl9ESVJfSU4gIHwgMTAsIDE2KTsKIAogCQlPTUFQX0JVTEtfRVAoImVwNWluIiwgIFVTQl9ESVJfSU4gIHwgNSk7CiAJCU9NQVBfQlVMS19FUCgiZXA1b3V0IiwgVVNCX0RJUl9PVVQgfCA1KTsKKwkJT01BUF9JTlRfRVAoImVwMTFpbiIsICBVU0JfRElSX0lOICB8IDExLCAxNik7CisKIAkJT01BUF9CVUxLX0VQKCJlcDZpbiIsICBVU0JfRElSX0lOICB8IDYpOwogCQlPTUFQX0JVTEtfRVAoImVwNm91dCIsIFVTQl9ESVJfT1VUIHwgNik7CisJCU9NQVBfSU5UX0VQKCJlcDEyaW4iLCAgVVNCX0RJUl9JTiAgfCAxMiwgMTYpOwogCiAJCU9NQVBfQlVMS19FUCgiZXA3aW4iLCAgVVNCX0RJUl9JTiAgfCA3KTsKIAkJT01BUF9CVUxLX0VQKCJlcDdvdXQiLCBVU0JfRElSX09VVCB8IDcpOworCQlPTUFQX0lOVF9FUCgiZXAxM2luIiwgIFVTQl9ESVJfSU4gIHwgMTMsIDE2KTsKKwkJT01BUF9JTlRfRVAoImVwMTNvdXQiLCBVU0JfRElSX09VVCB8IDEzLCAxNik7CisKIAkJT01BUF9CVUxLX0VQKCJlcDhpbiIsICBVU0JfRElSX0lOICB8IDgpOwogCQlPTUFQX0JVTEtfRVAoImVwOG91dCIsIFVTQl9ESVJfT1VUIHwgOCk7CisJCU9NQVBfSU5UX0VQKCJlcDE0aW4iLCAgVVNCX0RJUl9JTiAgfCAxNCwgMTYpOworCQlPTUFQX0lOVF9FUCgiZXAxNG91dCIsIFVTQl9ESVJfT1VUIHwgMTQsIDE2KTsKIAotCQlPTUFQX0lOVF9FUCgiZXA5aW4iLCAgIFVTQl9ESVJfSU4gIHwgOSwgMTYpOwotCQlPTUFQX0lOVF9FUCgiZXAxMG91dCIsIFVTQl9ESVJfSU4gIHwgMTAsIDE2KTsKLQkJT01BUF9JTlRfRVAoImVwMTFpbiIsICBVU0JfRElSX0lOICB8IDksIDE2KTsKLQkJT01BUF9JTlRfRVAoImVwMTJvdXQiLCBVU0JfRElSX0lOICB8IDEwLCAxNik7CisJCU9NQVBfQlVMS19FUCgiZXAxNWluIiwgIFVTQl9ESVJfSU4gIHwgMTUpOworCQlPTUFQX0JVTEtfRVAoImVwMTVvdXQiLCBVU0JfRElSX09VVCB8IDE1KTsKKwogCQlicmVhazsKIAogI2lmZGVmCVVTRV9JU08KQEAgLTI2NDAsOCArMjcwNiw4IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqb2RldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCWludAkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJaW50CQkJaG1jOwotCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIJKnhjZWl2ID0gMDsKLQljb25zdCBjaGFyCQkqdHlwZSA9IDA7CisJc3RydWN0IG90Z190cmFuc2NlaXZlcgkqeGNlaXYgPSBOVUxMOworCWNvbnN0IGNoYXIJCSp0eXBlID0gTlVMTDsKIAlzdHJ1Y3Qgb21hcF91c2JfY29uZmlnCSpjb25maWcgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAKIAkvKiBOT1RFOiAgImtub3dzIiB0aGUgb3JkZXIgb2YgdGhlIHJlc291cmNlcyEgKi8KQEAgLTI2NzYsNTQgKzI3NDIsNzggQEAKIAkJCUZVTkNfTVVYX0NUUkxfMF9SRUcgPSB0bXA7CiAJCX0KIAl9IGVsc2UgeworCQkvKiBUaGUgdHJhbnNjZWl2ZXIgbWF5IHBhY2thZ2Ugc29tZSBHUElPIGxvZ2ljIG9yIGhhbmRsZQorCQkgKiBsb29wYmFjayBhbmQvb3IgdHJhbnNjZWl2ZXJsZXNzIHNldHVwOyBpZiB3ZSBmaW5kIG9uZSwKKwkJICogdXNlIGl0LiAgRXhjZXB0IGZvciBPVEcsIHdlIGRvbid0IF9uZWVkXyB0byB0YWxrIHRvIG9uZTsKKwkJICogYnV0IG5vdCBoYXZpbmcgb25lIHByb2JhYmx5IG1lYW5zIG5vIFZCVVMgZGV0ZWN0aW9uLgorCQkgKi8KKwkJeGNlaXYgPSBvdGdfZ2V0X3RyYW5zY2VpdmVyKCk7CisJCWlmICh4Y2VpdikKKwkJCXR5cGUgPSB4Y2Vpdi0+bGFiZWw7CisJCWVsc2UgaWYgKGNvbmZpZy0+b3RnKSB7CisJCQlEQkcoIk9URyByZXF1aXJlcyBleHRlcm5hbCB0cmFuc2NlaXZlciFcbiIpOworCQkJZ290byBjbGVhbnVwMDsKKwkJfQorCiAJCWhtYyA9IEhNQ18xNjEwOwogCQlzd2l0Y2ggKGhtYykgeworCQljYXNlIDA6CQkJLyogUE9XRVJVUCBERUZBVUxUID09IDAgKi8KKwkJY2FzZSA0OgorCQljYXNlIDEyOgorCQljYXNlIDIwOgorCQkJaWYgKCFjcHVfaXNfb21hcDE3MTAoKSkgeworCQkJCXR5cGUgPSAiaW50ZWdyYXRlZCI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAkJY2FzZSAzOgogCQljYXNlIDExOgogCQljYXNlIDE2OgogCQljYXNlIDE5OgogCQljYXNlIDI1OgotCQkJeGNlaXYgPSBvdGdfZ2V0X3RyYW5zY2VpdmVyKCk7CiAJCQlpZiAoIXhjZWl2KSB7CiAJCQkJREJHKCJleHRlcm5hbCB0cmFuc2NlaXZlciBub3QgcmVnaXN0ZXJlZCFcbiIpOwotCQkJCWlmIChjb25maWctPm90ZykKLQkJCQkJZ290byBjbGVhbnVwMDsKLQkJCQl0eXBlID0gIih1bmtub3duIGV4dGVybmFsKSI7Ci0JCQl9IGVsc2UKLQkJCQl0eXBlID0geGNlaXYtPmxhYmVsOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoJCQkvKiBQT1dFUlVQIERFRkFVTFQgPT0gMCAqLwotCQljYXNlIDQ6Ci0JCWNhc2UgMTI6Ci0JCWNhc2UgMjA6Ci0JCQl0eXBlID0gIklOVEVHUkFURUQiOworCQkJCXR5cGUgPSAidW5rbm93biI7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAyMToJCQkvKiBpbnRlcm5hbCBsb29wYmFjayAqLwotCQkJdHlwZSA9ICIobG9vcGJhY2spIjsKKwkJCXR5cGUgPSAibG9vcGJhY2siOwogCQkJYnJlYWs7CiAJCWNhc2UgMTQ6CQkJLyogdHJhbnNjZWl2ZXJsZXNzICovCi0JCQl0eXBlID0gIihub25lKSI7CisJCQlpZiAoY3B1X2lzX29tYXAxNzEwKCkpCisJCQkJZ290byBiYWRfb25fMTcxMDsKKwkJCS8qIEZBTEwgVEhST1VHSCAqLworCQljYXNlIDEzOgorCQljYXNlIDE1OgorCQkJdHlwZSA9ICJubyI7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgorYmFkX29uXzE3MTA6CiAJCQlFUlIoInVucmVjb2duaXplZCBVREMgSE1DIG1vZGUgJWRcbiIsIGhtYyk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWdvdG8gY2xlYW51cDA7CiAJCX0KIAl9Ci0JSU5GTygiaG1jIG1vZGUgJWQsIHRyYW5zY2VpdmVyICVzXG4iLCBobWMsIHR5cGUpOworCUlORk8oImhtYyBtb2RlICVkLCAlcyB0cmFuc2NlaXZlclxuIiwgaG1jLCB0eXBlKTsKIAogCS8qIGEgImdhZGdldCIgYWJzdHJhY3RzL3ZpcnR1YWxpemVzIHRoZSBjb250cm9sbGVyICovCiAJc3RhdHVzID0gb21hcF91ZGNfc2V0dXAob2RldiwgeGNlaXYpOwogCWlmIChzdGF0dXMpIHsKIAkJZ290byBjbGVhbnVwMDsKIAl9Ci0JeGNlaXYgPSAwOworCXhjZWl2ID0gTlVMTDsKIAkvLyAidWRjIiBpcyBub3cgdmFsaWQKIAlwdWxsdXBfZGlzYWJsZSh1ZGMpOwogI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKIAl1ZGMtPmdhZGdldC5pc19vdGcgPSAoY29uZmlnLT5vdGcgIT0gMCk7CiAjZW5kaWYKIAorCS8qIHN0YXJ0aW5nIHdpdGggb21hcDE3MTAgZXMyLjAsIGNsZWFyIHRvZ2dsZSBpcyBhIHNlcGFyYXRlIGJpdCAqLworCWlmIChVRENfUkVWX1JFRyA+PSAweDYxKQorCQl1ZGMtPmNscl9oYWx0ID0gVURDX1JFU0VUX0VQIHwgVURDX0NMUkRBVEFfVE9HR0xFOworCWVsc2UKKwkJdWRjLT5jbHJfaGFsdCA9IFVEQ19SRVNFVF9FUDsKKwogCS8qIFVTQiBnZW5lcmFsIHB1cnBvc2UgSVJROiAgZXAwLCBzdGF0ZSBjaGFuZ2VzLCBkbWEsIGV0YyAqLwogCXN0YXR1cyA9IHJlcXVlc3RfaXJxKG9kZXYtPnJlc291cmNlWzFdLnN0YXJ0LCBvbWFwX3VkY19pcnEsCiAJCQlTQV9TQU1QTEVfUkFORE9NLCBkcml2ZXJfbmFtZSwgdWRjKTsKQEAgLTI3NjUsNyArMjg1NSw3IEBACiAKIGNsZWFudXAxOgogCWtmcmVlICh1ZGMpOwotCXVkYyA9IDA7CisJdWRjID0gTlVMTDsKIAogY2xlYW51cDA6CiAJaWYgKHhjZWl2KQpAQCAtMjc4OCw3ICsyODc4LDcgQEAKIAlwdWxsdXBfZGlzYWJsZSh1ZGMpOwogCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7CiAJCXB1dF9kZXZpY2UodWRjLT50cmFuc2NlaXZlci0+ZGV2KTsKLQkJdWRjLT50cmFuc2NlaXZlciA9IDA7CisJCXVkYy0+dHJhbnNjZWl2ZXIgPSBOVUxMOwogCX0KIAlVRENfU1lTQ09OMV9SRUcgPSAwOwogCkBAIC0yODA5LDEzICsyODk5LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF91ZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQotewotCWlmIChsZXZlbCAhPSAwKQotCQlyZXR1cm4gMDsKKy8qIHN1c3BlbmQvcmVzdW1lL3dha2V1cCBmcm9tIHN5c2ZzIChlY2hvID4gcG93ZXIvc3RhdGUpIG9yIHdoZW4gdGhlCisgKiBzeXN0ZW0gaXMgZm9yY2VkIGludG8gZGVlcCBzbGVlcAorICoKKyAqIFJFVklTSVQgd2Ugc2hvdWxkIHByb2JhYmx5IHJlamVjdCBzdXNwZW5kIHJlcXVlc3RzIHdoZW4gdGhlcmUncyBhIGhvc3QKKyAqIHNlc3Npb24gYWN0aXZlLCByYXRoZXIgdGhhbiBkaXNjb25uZWN0aW5nLCBhdCBsZWFzdCBvbiBib2FyZHMgdGhhdCBjYW4KKyAqIHJlcG9ydCBWQlVTIGlycXMgKFVEQ19ERVZTVEFUX1JFRy5VRENfQVRUKS4gIEFuZCBpbiBhbnkgY2FzZSwgd2UgbmVlZCB0bworICogbWFrZSBob3N0IHJlc3VtZXMgYW5kIFZCVVMgZGV0ZWN0aW9uIHRyaWdnZXIgT01BUCB3YWtldXAgZXZlbnRzOyB0aGF0CisgKiBtYXkgaW52b2x2ZSB0YWxraW5nIHRvIGFuIGV4dGVybmFsIHRyYW5zY2VpdmVyIChlLmcuIGlzcDEzMDEpLgorICovCiAKLQlEQkcoInN1c3BlbmQsIHN0YXRlICVkXG4iLCBzdGF0ZSk7Ci0Jb21hcF9wdWxsdXAoJnVkYy0+Z2FkZ2V0LCAwKTsKK3N0YXRpYyBpbnQgb21hcF91ZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlLCB1MzIgbGV2ZWwpCit7CisJdTMyCWRldnN0YXQ7CisKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9QT1dFUl9ET1dOKQorCQlyZXR1cm4gMDsKKwlkZXZzdGF0ID0gVURDX0RFVlNUQVRfUkVHOworCisJLyogd2UncmUgcmVxdWVzdGluZyA0OCBNSHogY2xvY2sgaWYgdGhlIHB1bGx1cCBpcyBlbmFibGVkCisJICogKD09IHdlJ3JlIGF0dGFjaGVkIHRvIHRoZSBob3N0KSBhbmQgd2UncmUgbm90IHN1c3BlbmRlZCwKKwkgKiB3aGljaCB3b3VsZCBwcmV2ZW50IGVudHJ5IHRvIGRlZXAgc2xlZXAuLi4KKwkgKi8KKwlpZiAoKGRldnN0YXQgJiBVRENfQVRUKSAhPSAwICYmIChkZXZzdGF0ICYgVURDX1NVUykgPT0gMCkgeworCQlXQVJOKCJzZXNzaW9uIGFjdGl2ZTsgc3VzcGVuZCByZXF1aXJlcyBkaXNjb25uZWN0XG4iKTsKKwkJb21hcF9wdWxsdXAoJnVkYy0+Z2FkZ2V0LCAwKTsKKwl9CisKIAl1ZGMtPmdhZGdldC5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAJdWRjLT5nYWRnZXQuZGV2LnBhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAJcmV0dXJuIDA7CkBAIC0yODIzLDEyICsyOTMzLDEwIEBACiAKIHN0YXRpYyBpbnQgb21hcF91ZGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQogewotCWlmIChsZXZlbCAhPSAwKQorCWlmIChsZXZlbCAhPSBSRVNVTUVfUE9XRVJfT04pCiAJCXJldHVybiAwOwogCiAJREJHKCJyZXN1bWUgKyB3YWtldXAvU1JQXG4iKTsKLQl1ZGMtPmdhZGdldC5kZXYucGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047Ci0JdWRjLT5nYWRnZXQuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAlvbWFwX3B1bGx1cCgmdWRjLT5nYWRnZXQsIDEpOwogCiAJLyogbWF5YmUgdGhlIGhvc3Qgd291bGQgZW51bWVyYXRlIHVzIGlmIHdlIG51ZGdlZCBpdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuaAppbmRleCBjOWU2ODU0Li42NTJlZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZQlVRENfQ1RSTF9SRUcJCQlVRENfUkVHKDB4MEMpCS8qIEVuZHBvaW50IGNvbnRyb2wgKi8KICMJZGVmaW5lCVVEQ19DTFJfSEFMVAkJKDEgPDwgNykKICMJZGVmaW5lCVVEQ19TRVRfSEFMVAkJKDEgPDwgNikKKyMJZGVmaW5lCVVEQ19DTFJEQVRBX1RPR0dMRQkoMSA8PCAzKQogIwlkZWZpbmUJVURDX1NFVF9GSUZPX0VOCQkoMSA8PCAyKQogIwlkZWZpbmUJVURDX0NMUl9FUAkJKDEgPDwgMSkKICMJZGVmaW5lCVVEQ19SRVNFVF9FUAkJKDEgPDwgMCkKQEAgLTk5LDYgKzEwMCw3IEBACiAKIC8qIERNQSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyczogIHVwIHRvIHRocmVlIGNoYW5uZWxzIGluIGVhY2ggZGlyZWN0aW9uLiAgKi8KICNkZWZpbmUJVURDX1JYRE1BX0NGR19SRUcJCVVEQ19SRUcoMHg0MCkJLyogMyBlcHMgZm9yIFJYIERNQSAqLworIwlkZWZpbmUJVURDX0RNQV9SRVEJCSgxIDw8IDEyKQogI2RlZmluZQlVRENfVFhETUFfQ0ZHX1JFRwkJVURDX1JFRygweDQ0KQkvKiAzIGVwcyBmb3IgVFggRE1BICovCiAjZGVmaW5lCVVEQ19EQVRBX0RNQV9SRUcJCVVEQ19SRUcoMHg0OCkJLyogcngvdHggZmlmbyBhZGRyICovCiAKQEAgLTE2Miw2ICsxNjQsNyBAQAogCXNwaW5sb2NrX3QJCQlsb2NrOwogCXN0cnVjdCBvbWFwX2VwCQkJZXBbMzJdOwogCXUxNgkJCQlkZXZzdGF0OworCXUxNgkJCQljbHJfaGFsdDsKIAlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCQkqdHJhbnNjZWl2ZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkJaXNvOwogCXVuc2lnbmVkCQkJc29mdGNvbm5lY3Q6MTsKQEAgLTE3MSw3ICsxNzQsNiBAQAogCXVuc2lnbmVkCQkJZXAwX3NldF9jb25maWc6MTsKIAl1bnNpZ25lZAkJCWVwMF9yZXNldF9jb25maWc6MTsKIAl1bnNpZ25lZAkJCWVwMF9zZXR1cDoxOwotCiAJc3RydWN0IGNvbXBsZXRpb24JCSpkb25lOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggYjhiNDUyNC4uMTUwNzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGxpbnV4L2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKLSAqIEludGVsIFBYQTJ4eCBhbmQgSVhQNHh4IG9uLWNoaXAgZnVsbCBzcGVlZCBVU0IgZGV2aWNlIGNvbnRyb2xsZXJzCisgKiBJbnRlbCBQWEEyNXggYW5kIElYUDR4eCBvbi1jaGlwIGZ1bGwgc3BlZWQgVVNCIGRldmljZSBjb250cm9sbGVycwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRyaW5zeWMsIEluYy4gKEZyYW5rIEJlY2tlcikKICAqIENvcHlyaWdodCAoQykgMjAwMyBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4CkBAIC02Myw3ICs2Myw3IEBACiAKIAogLyoKLSAqIFRoaXMgZHJpdmVyIGhhbmRsZXMgdGhlIFVTQiBEZXZpY2UgQ29udHJvbGxlciAoVURDKSBpbiBJbnRlbCdzIFBYQSAyeHgKKyAqIFRoaXMgZHJpdmVyIGhhbmRsZXMgdGhlIFVTQiBEZXZpY2UgQ29udHJvbGxlciAoVURDKSBpbiBJbnRlbCdzIFBYQSAyNXgKICAqIHNlcmllcyBwcm9jZXNzb3JzLiAgVGhlIFVEQyBmb3IgdGhlIElYUCA0eHggc2VyaWVzIGlzIHZlcnkgc2ltaWxhci4KICAqIFRoZXJlIGFyZSBmaWZ0ZWVuIGVuZHBvaW50cywgaW4gYWRkaXRpb24gdG8gZXAwLgogICoKQEAgLTc5LDggKzc5LDggQEAKICAqIHB4YTI1MCBhMC9hMSBiMC9iMS9iMiBzdXJlIGFjdCBsaWtlIHRoZXkncmUgc3RpbGwgdGhlcmUuCiAgKi8KIAotI2RlZmluZQlEUklWRVJfVkVSU0lPTgkiMTQtRGVjLTIwMDMiCi0jZGVmaW5lCURSSVZFUl9ERVNDCSJQWEEgMnh4IFVTQiBEZXZpY2UgQ29udHJvbGxlciBkcml2ZXIiCisjZGVmaW5lCURSSVZFUl9WRVJTSU9OCSI0LU1heS0yMDA1IgorI2RlZmluZQlEUklWRVJfREVTQwkiUFhBIDI1eCBVU0IgRGV2aWNlIENvbnRyb2xsZXIgZHJpdmVyIgogCiAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lIFtdID0gInB4YTJ4eF91ZGMiOwpAQCAtMjkwLDYgKzI5MCw3IEBACiBzdGF0aWMgaW50IHB4YTJ4eF9lcF9kaXNhYmxlIChzdHJ1Y3QgdXNiX2VwICpfZXApCiB7CiAJc3RydWN0IHB4YTJ4eF9lcAkqZXA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAllcCA9IGNvbnRhaW5lcl9vZiAoX2VwLCBzdHJ1Y3QgcHhhMnh4X2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIWVwLT5kZXNjKSB7CkBAIC0yOTcsNiArMjk4LDggQEAKIAkJCV9lcCA/IGVwLT5lcC5uYW1lIDogTlVMTCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAludWtlIChlcCwgLUVTSFVURE9XTik7CiAKICNpZmRlZglVU0VfRE1BCkBAIC0zMTMsNiArMzE2LDcgQEAKIAllcC0+ZGVzYyA9IE5VTEw7CiAJZXAtPnN0b3BwZWQgPSAxOwogCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCURCRyhEQkdfVkVSQk9TRSwgIiVzIGRpc2FibGVkXG4iLCBfZXAtPm5hbWUpOwogCXJldHVybiAwOwogfQpAQCAtMzI4LDcgKzMzMiw3IEBACiAgKiAJcHhhMnh4X2VwX2FsbG9jX3JlcXVlc3QgLSBhbGxvY2F0ZSBhIHJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUKICAqLwogc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCi1weGEyeHhfZXBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCBpbnQgZ2ZwX2ZsYWdzKQorcHhhMnh4X2VwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBweGEyeHhfcmVxdWVzdCAqcmVxOwogCkBAIC0zNjMsNyArMzY3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgKgogcHhhMnh4X2VwX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGJ5dGVzLAotCWRtYV9hZGRyX3QgKmRtYSwgaW50IGdmcF9mbGFncykKKwlkbWFfYWRkcl90ICpkbWEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAljaGFyCQkJKnJldHZhbDsKIApAQCAtODcwLDcgKzg3NCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50Ci1weGEyeHhfZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIGludCBnZnBfZmxhZ3MpCitweGEyeHhfZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgcHhhMnh4X3JlcXVlc3QJKnJlcTsKIAlzdHJ1Y3QgcHhhMnh4X2VwCSplcDsKQEAgLTk3MSwxMCArOTc1LDEwIEBACiAJCQlraWNrX2RtYShlcCwgcmVxKTsKICNlbmRpZgogCQkvKiBjYW4gdGhlIEZJRk8gY2FuIHNhdGlzZnkgdGhlIHJlcXVlc3QgaW1tZWRpYXRlbHk/ICovCi0JCX0gZWxzZSBpZiAoKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gMAotCQkJCSYmICgqZXAtPnJlZ191ZGNjcyAmIFVEQ0NTX0JJX1RGUykgIT0gMAotCQkJCSYmIHdyaXRlX2ZpZm8oZXAsIHJlcSkpIHsKLQkJCXJlcSA9IE5VTEw7CisJCX0gZWxzZSBpZiAoKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gMCkgeworCQkJaWYgKCgqZXAtPnJlZ191ZGNjcyAmIFVEQ0NTX0JJX1RGUykgIT0gMAorCQkJCQkmJiB3cml0ZV9maWZvKGVwLCByZXEpKQorCQkJCXJlcSA9IE5VTEw7CiAJCX0gZWxzZSBpZiAoKCplcC0+cmVnX3VkY2NzICYgVURDQ1NfQk9fUkZTKSAhPSAwCiAJCQkJJiYgcmVhZF9maWZvKGVwLCByZXEpKSB7CiAJCQlyZXEgPSBOVUxMOwpAQCAtMTI5MCw3ICsxMjk0LDcgQEAKIAkJIiVzIHZlcnNpb246ICVzXG5HYWRnZXQgZHJpdmVyOiAlc1xuSG9zdCAlc1xuXG4iLAogCQlkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04gU0laRV9TVFIgRE1BU1RSLAogCQlkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5kcml2ZXIubmFtZSA6ICIobm9uZSkiLAotCQlpc191c2JfY29ubmVjdGVkKCkgPyAiZnVsbCBzcGVlZCIgOiAiZGlzY29ubmVjdGVkIik7CisJCWlzX3ZidXNfcHJlc2VudCgpID8gImZ1bGwgc3BlZWQiIDogImRpc2Nvbm5lY3RlZCIpOwogCXNpemUgLT0gdDsKIAluZXh0ICs9IHQ7CiAKQEAgLTEzMzksNyArMTM0Myw3IEBACiAJCW5leHQgKz0gdDsKIAl9CiAKLQlpZiAoIWlzX3VzYl9jb25uZWN0ZWQoKSB8fCAhZGV2LT5kcml2ZXIpCisJaWYgKCFpc192YnVzX3ByZXNlbnQoKSB8fCAhZGV2LT5kcml2ZXIpCiAJCWdvdG8gZG9uZTsKIAogCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwgImVwMCBJTiAlbHUvJWx1LCBPVVQgJWx1LyVsdVxuaXJxcyAlbHVcblxuIiwKQEAgLTE0NTQsNyArMTQ1OCw3IEBACiAJVUZOUkggPSBVRk5SSF9TSU07CiAKIAkvKiBpZiBoYXJkd2FyZSBzdXBwb3J0cyBpdCwgZGlzY29ubmVjdCBmcm9tIHVzYiAqLwotCW1ha2VfdXNiX2Rpc2FwcGVhcigpOworCXB1bGx1cF9vZmYoKTsKIAogCXVkY19jbGVhcl9tYXNrX1VEQ0NSKFVEQ0NSX1VERSk7CiAKQEAgLTE1NjcsNyArMTU3MSw3IEBACiAJVUlDUjAgJj0gflVJQ1IwX0lNMDsKIAogCS8qIGlmIGhhcmR3YXJlIHN1cHBvcnRzIGl0LCBwdWxsdXAgRCsgYW5kIHdhaXQgZm9yIHJlc2V0ICovCi0JbGV0X3VzYl9hcHBlYXIoKTsKKwlwdWxsdXBfb24oKTsKIH0KIAogCkBAIC0yMDUyLDEwICsyMDU2LDEwIEBACiAJCWlmICh1bmxpa2VseSh1ZGNjciAmIFVEQ0NSX1NVU0lSKSkgewogCQkJdWRjX2Fja19pbnRfVURDQ1IoVURDQ1JfU1VTSVIpOwogCQkJaGFuZGxlZCA9IDE7Ci0JCQlEQkcoREJHX1ZFUkJPU0UsICJVU0Igc3VzcGVuZCVzXG4iLCBpc191c2JfY29ubmVjdGVkKCkKKwkJCURCRyhEQkdfVkVSQk9TRSwgIlVTQiBzdXNwZW5kJXNcbiIsIGlzX3ZidXNfcHJlc2VudCgpCiAJCQkJPyAiIiA6ICIrZGlzY29ubmVjdCIpOwogCi0JCQlpZiAoIWlzX3VzYl9jb25uZWN0ZWQoKSkKKwkJCWlmICghaXNfdmJ1c19wcmVzZW50KCkpCiAJCQkJc3RvcF9hY3Rpdml0eShkZXYsIGRldi0+ZHJpdmVyKTsKIAkJCWVsc2UgaWYgKGRldi0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOCiAJCQkJCSYmIGRldi0+ZHJpdmVyCkBAIC0yMDczLDcgKzIwNzcsNyBAQAogCQkJaWYgKGRldi0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOCiAJCQkJCSYmIGRldi0+ZHJpdmVyCiAJCQkJCSYmIGRldi0+ZHJpdmVyLT5yZXN1bWUKLQkJCQkJJiYgaXNfdXNiX2Nvbm5lY3RlZCgpKQorCQkJCQkmJiBpc192YnVzX3ByZXNlbnQoKSkKIAkJCQlkZXYtPmRyaXZlci0+cmVzdW1lKCZkZXYtPmdhZGdldCk7CiAJCX0KIApAQCAtMjUwOSw3ICsyNTEzLDcgQEAKIAl1ZGNfZGlzYWJsZShkZXYpOwogCXVkY19yZWluaXQoZGV2KTsKIAotCWRldi0+dmJ1cyA9IGlzX3VzYl9jb25uZWN0ZWQoKTsKKwlkZXYtPnZidXMgPSBpc192YnVzX3ByZXNlbnQoKTsKIAogCS8qIGlycSBzZXR1cCBhZnRlciBvbGQgaGFyZHdhcmUgc3RhdGUgaXMgY2xlYW5lZCB1cCAqLwogCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9VU0IsIHB4YTJ4eF91ZGNfaXJxLApAQCAtMjU1NSw2ICsyNTU5LDEyIEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIHZvaWQgcHhhMnh4X3VkY19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXB1bGx1cF9vZmYoKTsKK30KKwogc3RhdGljIGludCBfX2V4aXQgcHhhMnh4X3VkY19yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlzdHJ1Y3QgcHhhMnh4X3VkYyAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOwpAQCAtMjYyNCw2ICsyNjM0LDcgQEAKIAkubmFtZQkJPSAicHhhMnh4LXVkYyIsCiAJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCiAJLnByb2JlCQk9IHB4YTJ4eF91ZGNfcHJvYmUsCisJLnNodXRkb3duCT0gcHhhMnh4X3VkY19zaHV0ZG93biwKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKHB4YTJ4eF91ZGNfcmVtb3ZlKSwKIAkuc3VzcGVuZAk9IHB4YTJ4eF91ZGNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHB4YTJ4eF91ZGNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmgKaW5kZXggMWYzYTdkOS4uZDBiYzM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5oCkBAIC0xNzcsMjMgKzE3NywyMyBAQAogCiBzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGMgKnRoZV9jb250cm9sbGVyOwogCi0vKiBvbmUgR1BJTyBzaG91bGQgYmUgdXNlZCB0byBkZXRlY3QgaG9zdCBkaXNjb25uZWN0ICovCi1zdGF0aWMgaW5saW5lIGludCBpc191c2JfY29ubmVjdGVkKHZvaWQpCisvKiBvbmUgR1BJTyBzaG91bGQgYmUgdXNlZCB0byBkZXRlY3QgVkJVUyBmcm9tIHRoZSBob3N0ICovCitzdGF0aWMgaW5saW5lIGludCBpc192YnVzX3ByZXNlbnQodm9pZCkKIHsKIAlpZiAoIXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfaXNfY29ubmVjdGVkKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19pc19jb25uZWN0ZWQoKTsKIH0KIAotLyogb25lIEdQSU8gc2hvdWxkIGZvcmNlIHRoZSBob3N0IHRvIHNlZSB0aGlzIGRldmljZSAob3Igbm90KSAqLwotc3RhdGljIGlubGluZSB2b2lkIG1ha2VfdXNiX2Rpc2FwcGVhcih2b2lkKQorLyogb25lIEdQSU8gc2hvdWxkIGNvbnRyb2wgYSBEKyBwdWxsdXAsIHNvIGhvc3Qgc2VlcyB0aGlzIGRldmljZSAob3Igbm90KSAqLworc3RhdGljIGlubGluZSB2b2lkIHB1bGx1cF9vZmYodm9pZCkKIHsKIAlpZiAoIXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfY29tbWFuZCkKIAkJcmV0dXJuOwogCXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfY29tbWFuZChQWEEyWFhfVURDX0NNRF9ESVNDT05ORUNUKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGxldF91c2JfYXBwZWFyKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgcHVsbHVwX29uKHZvaWQpCiB7CiAJaWYgKCF0aGVfY29udHJvbGxlci0+bWFjaC0+dWRjX2NvbW1hbmQpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKaW5kZXggNzQ1NzI2OC4uMDZiNmViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogCiAjdW5kZWYJUk5ESVNfUE0KKyN1bmRlZglSTkRJU19XQUtFVVAKICN1bmRlZglWRVJCT1NFCiAKICNpbmNsdWRlICJybmRpcy5oIgpAQCAtNjAsNyArNjEsNyBAQAogCX0gd2hpbGUgKDApCiBzdGF0aWMgaW50IHJuZGlzX2RlYnVnID0gMDsKIAotbW9kdWxlX3BhcmFtIChybmRpc19kZWJ1ZywgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0gKHJuZGlzX2RlYnVnLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyAocm5kaXNfZGVidWcsICJlbmFibGUgZGVidWdnaW5nIik7CiAKICNlbHNlCkBAIC03OCwyMiArNzksMTAzIEBACiBzdGF0aWMgY29uc3QgX19sZTMyIHJuZGlzX2RyaXZlcl92ZXJzaW9uID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSk7CiAKIC8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgcm5kaXNfaW5pdF9yZXNwb25zZSAoaW50IGNvbmZpZ05yLCBybmRpc19pbml0X21zZ190eXBlICpidWYpOwotc3RhdGljIGludCBybmRpc19xdWVyeV9yZXNwb25zZSAoaW50IGNvbmZpZ05yLCBybmRpc19xdWVyeV9tc2dfdHlwZSAqYnVmKTsKLXN0YXRpYyBpbnQgcm5kaXNfc2V0X3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIHJuZGlzX3NldF9tc2dfdHlwZSAqYnVmKTsKLXN0YXRpYyBpbnQgcm5kaXNfcmVzZXRfcmVzcG9uc2UgKGludCBjb25maWdOciwgcm5kaXNfcmVzZXRfbXNnX3R5cGUgKmJ1Zik7Ci1zdGF0aWMgaW50IHJuZGlzX2tlZXBhbGl2ZV9yZXNwb25zZSAoaW50IGNvbmZpZ05yLCAKLQkJCQkgICAgIHJuZGlzX2tlZXBhbGl2ZV9tc2dfdHlwZSAqYnVmKTsKLQogc3RhdGljIHJuZGlzX3Jlc3BfdCAqcm5kaXNfYWRkX3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIHUzMiBsZW5ndGgpOwogCiAKKy8qIHN1cHBvcnRlZCBPSURzICovCitzdGF0aWMgY29uc3QgdTMyIG9pZF9zdXBwb3J0ZWRfbGlzdCBbXSA9IAoreworCS8qIHRoZSBnZW5lcmFsIHN0dWZmICovCisJT0lEX0dFTl9TVVBQT1JURURfTElTVCwKKwlPSURfR0VOX0hBUkRXQVJFX1NUQVRVUywKKwlPSURfR0VOX01FRElBX1NVUFBPUlRFRCwKKwlPSURfR0VOX01FRElBX0lOX1VTRSwKKwlPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRSwKKwlPSURfR0VOX0xJTktfU1BFRUQsCisJT0lEX0dFTl9UUkFOU01JVF9CTE9DS19TSVpFLAorCU9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFLAorCU9JRF9HRU5fVkVORE9SX0lELAorCU9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OLAorCU9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OLAorCU9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSLAorCU9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFLAorCU9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMsCisJT0lEX0dFTl9QSFlTSUNBTF9NRURJVU0sCisjaWYgMAorCU9JRF9HRU5fUk5ESVNfQ09ORklHX1BBUkFNRVRFUiwKKyNlbmRpZgorCQorCS8qIHRoZSBzdGF0aXN0aWNhbCBzdHVmZiAqLworCU9JRF9HRU5fWE1JVF9PSywKKwlPSURfR0VOX1JDVl9PSywKKwlPSURfR0VOX1hNSVRfRVJST1IsCisJT0lEX0dFTl9SQ1ZfRVJST1IsCisJT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSLAorI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCisJT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19YTUlULAorCU9JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVQsCisJT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfWE1JVCwKKwlPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVCwKKwlPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlULAorCU9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlULAorCU9JRF9HRU5fRElSRUNURURfQllURVNfUkNWLAorCU9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDViwKKwlPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1YsCisJT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1JDViwKKwlPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19SQ1YsCisJT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDViwKKwlPSURfR0VOX1JDVl9DUkNfRVJST1IsCisJT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgsCisjZW5kaWYJLyogUk5ESVNfT1BUSU9OQUxfU1RBVFMgKi8KKworICAgIAkvKiBtYW5kYXRvcnkgODAyLjMgKi8KKwkvKiB0aGUgZ2VuZXJhbCBzdHVmZiAqLworCU9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUywKKwlPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTLAorCU9JRF84MDJfM19NVUxUSUNBU1RfTElTVCwKKwlPSURfODAyXzNfTUFDX09QVElPTlMsCisJT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFLAorCQorCS8qIHRoZSBzdGF0aXN0aWNhbCBzdHVmZiAqLworCU9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5ULAorCU9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT04sCisJT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TLAorI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCisJT0lEXzgwMl8zX1hNSVRfREVGRVJSRUQsCisJT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlMsCisJT0lEXzgwMl8zX1JDVl9PVkVSUlVOLAorCU9JRF84MDJfM19YTUlUX1VOREVSUlVOLAorCU9JRF84MDJfM19YTUlUX0hFQVJUQkVBVF9GQUlMVVJFLAorCU9JRF84MDJfM19YTUlUX1RJTUVTX0NSU19MT1NULAorCU9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OUywKKyNlbmRpZgkvKiBSTkRJU19PUFRJT05BTF9TVEFUUyAqLworCisjaWZkZWYJUk5ESVNfUE0KKwkvKiBQTSBhbmQgd2FrZXVwIGFyZSBtYW5kYXRvcnkgZm9yIFVTQjogKi8KKworCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlPSURfUE5QX0NBUEFCSUxJVElFUywKKwlPSURfUE5QX1FVRVJZX1BPV0VSLAorCU9JRF9QTlBfU0VUX1BPV0VSLAorCisjaWZkZWYJUk5ESVNfV0FLRVVQCisJLyogd2FrZSB1cCBob3N0ICovCisJT0lEX1BOUF9FTkFCTEVfV0FLRV9VUCwKKwlPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk4sCisJT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOLAorI2VuZGlmCS8qIFJORElTX1dBS0VVUCAqLworI2VuZGlmCS8qIFJORElTX1BNICovCit9OworCisKIC8qIE5ESVMgRnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGdlbl9uZGlzX3F1ZXJ5X3Jlc3AgKGludCBjb25maWdOciwgdTMyIE9JRCwgcm5kaXNfcmVzcF90ICpyKQorc3RhdGljIGludAorZ2VuX25kaXNfcXVlcnlfcmVzcCAoaW50IGNvbmZpZ05yLCB1MzIgT0lELCB1OCAqYnVmLCB1bnNpZ25lZCBidWZfbGVuLAorCQlybmRpc19yZXNwX3QgKnIpCiB7CiAJaW50IAkJCXJldHZhbCA9IC1FTk9UU1VQUDsKLQl1MzIgCQkJbGVuZ3RoID0gMDsKLQlfX2xlMzIJCQkqdG1wOworCXUzMiAJCQlsZW5ndGggPSA0OwkvKiB1c3VhbGx5ICovCisJX19sZTMyCQkJKm91dGJ1ZjsKIAlpbnQJCQlpLCBjb3VudDsKIAlybmRpc19xdWVyeV9jbXBsdF90eXBlCSpyZXNwOwogCkBAIC0xMDEsNyArMTgzLDIyIEBACiAJcmVzcCA9IChybmRpc19xdWVyeV9jbXBsdF90eXBlICopIHItPmJ1ZjsKIAogCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07Ci0JCisKKwlpZiAoYnVmX2xlbiAmJiBybmRpc19kZWJ1ZyA+IDEpIHsKKwkJREVCVUcoInF1ZXJ5IE9JRCAlMDh4IHZhbHVlLCBsZW4gJWQ6XG4iLCBPSUQsIGJ1Zl9sZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmX2xlbjsgaSArPSAxNikgeworCQkJREVCVUcgKCIlMDNkOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBpLAorCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopJmJ1ZltpXSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyA0XSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyA4XSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyAxMl0pKTsKKwkJfQorCX0KKworCS8qIHJlc3BvbnNlIGdvZXMgaGVyZSwgcmlnaHQgYWZ0ZXIgdGhlIGhlYWRlciAqLworCW91dGJ1ZiA9IChfX2xlMzIgKikgJnJlc3BbMV07CisJcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxNik7CisKIAlzd2l0Y2ggKE9JRCkgewogCiAJLyogZ2VuZXJhbCBvaWRzICh0YWJsZSA0LTEpICovCkBAIC0xMTEsNDIgKzIwOCwzNiBAQAogCQlERUJVRyAoIiVzOiBPSURfR0VOX1NVUFBPUlRFRF9MSVNUXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlsZW5ndGggPSBzaXplb2YgKG9pZF9zdXBwb3J0ZWRfbGlzdCk7CiAJCWNvdW50ICA9IGxlbmd0aCAvIHNpemVvZiAodTMyKTsKLQkJdG1wID0gKF9fbGUzMiAqKSAoKHU4ICopcmVzcCArIDI0KTsKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQl0bXBbaV0gPSBjcHVfdG9fbGUzMiAob2lkX3N1cHBvcnRlZF9saXN0W2ldKTsKKwkJCW91dGJ1ZltpXSA9IGNwdV90b19sZTMyIChvaWRfc3VwcG9ydGVkX2xpc3RbaV0pOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX0hBUkRXQVJFX1NUQVRVUzoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0hBUkRXQVJFX1NUQVRVU1xuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKIAkJLyogQm9ndXMgcXVlc3Rpb24hIAogCQkgKiBIYXJkd2FyZSBtdXN0IGJlIHJlYWR5IHRvIHJlY2VpdmUgaGlnaCBsZXZlbCBwcm90b2NvbHMuCiAJCSAqIEJUVzogCiAJCSAqIHJlZGRpdGUgZXJnbyBxdWFlIHN1bnQgQ2Flc2FyaXMgQ2Flc2FyaQogCQkgKiBldCBxdWFlIHN1bnQgRGVpIERlbyEKIAkJICovCi0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX1NVUFBPUlRFRDoKIAkJREVCVUcoIiVzOiBPSURfR0VOX01FRElBX1NVUFBPUlRFRFxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0pOworCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJCQogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NRURJQV9JTl9VU0U6CiAJCURFQlVHKCIlczogT0lEX0dFTl9NRURJQV9JTl9VU0VcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7CiAJCS8qIG9uZSBtZWRpdW0sIG9uZSB0cmFuc3BvcnQuLi4gKG1heWJlIHlvdSBkbyBpdCBiZXR0ZXIpICovCi0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtKTsKKwkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKQEAgLTE1NCwyNSArMjQ1LDIxIEBACiAJY2FzZSBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRToKIAkJREVCVUcoIiVzOiBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX0xJTktfU1BFRUQ6Ci0vLwkJREVCVUcoIiVzOiBPSURfR0VOX0xJTktfU1BFRURcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7CisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IE9JRF9HRU5fTElOS19TUEVFRFxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaWFfc3RhdGUKLQkJCT09IE5ESVNfTUVESUFfU1RBVEVfRElTQ09OTkVDVEVEKQotCQkgICAgKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkJCT09IE5ESVNfTUVESUFfU1RBVEVfRElTQ09OTkVDVEVEKQorCQkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQllbHNlCi0JCSAgICAqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnNwZWVkKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC0xODEsOCArMjY4LDcgQEAKIAljYXNlIE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRToKIAkJREVCVUcoIiVzOiBPSURfR0VOX1RSQU5TTUlUX0JMT0NLX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgewotCQkJbGVuZ3RoID0gNDsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2LT5tdHUpOwogCQkJcmV0dmFsID0gMDsKIAkJfQpAQCAtMTkyLDggKzI3OCw3IEBACiAJY2FzZSBPSURfR0VOX1JFQ0VJVkVfQkxPQ0tfU0laRToKIAkJREVCVUcoIiVzOiBPSURfR0VOX1JFQ0VJVkVfQkxPQ0tfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CiAJCQlyZXR2YWwgPSAwOwogCQl9CkBAIC0yMDIsOCArMjg3LDcgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fVkVORE9SX0lEOgogCQlERUJVRygiJXM6IE9JRF9HRU5fVkVORE9SX0lEXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JJRCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwpAQCAtMjEyLDUxICsyOTYsNDQgQEAKIAljYXNlIE9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OOgogCQlERUJVRygiJXM6IE9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlsZW5ndGggPSBzdHJsZW4gKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IpOwotCQltZW1jcHkgKCh1OCAqKSByZXNwICsgMjQsIAorCQltZW1jcHkgKG91dGJ1ZiwKIAkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IsIGxlbmd0aCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTlxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKIAkJLyogQ3JlYXRlZCBhcyBMRSAqLwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gcm5kaXNfZHJpdmVyX3ZlcnNpb247CisJCSpvdXRidWYgPSBybmRpc19kcml2ZXJfdmVyc2lvbjsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOgogCQlERUJVRygiJXM6IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCQlybmRpc19wZXJfZGV2X3BhcmFtc1tjb25maWdOcl0uZmlsdGVyKTsKKwkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgqcm5kaXNfcGVyX2Rldl9wYXJhbXNbY29uZmlnTnJdLmZpbHRlcik7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRToKIAkJREVCVUcoIiVzOiBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoCi0JCQkJCVJORElTX01BWF9UT1RBTF9TSVpFKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUk5ESVNfTUFYX1RPVEFMX1NJWkUpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKLQkJREVCVUcoIiVzOiBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkJLm1lZGlhX3N0YXRlKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fUEhZU0lDQUxfTUVESVVNOgogCQlERUJVRygiJXM6IE9JRF9HRU5fUEhZU0lDQUxfTUVESVVNXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKQEAgLTI2Niw4ICszNDMsNyBAQAogCSAqLwogCWNhc2UgT0lEX0dFTl9NQUNfT1BUSU9OUzoJCS8qIGZyb20gV2luTUUgKi8KIAkJREVCVUcoIiVzOiBPSURfR0VOX01BQ19PUFRJT05TXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoCiAJCQkgIE5ESVNfTUFDX09QVElPTl9SRUNFSVZFX1NFUklBTElaRUQKIAkJCXwgTkRJU19NQUNfT1BUSU9OX0ZVTExfRFVQTEVYKTsKIAkJcmV0dmFsID0gMDsKQEAgLTI3Nyw2MiArMzUzLDQ5IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fWE1JVF9PSzoKLQkJREVCVUcoIiVzOiBPSURfR0VOX1hNSVRfT0tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IE9JRF9HRU5fWE1JVF9PS1xuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT50eF9wYWNrZXRzIC0gCiAJCQkgICAgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cy0+dHhfZXJyb3JzIC0KIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT50eF9kcm9wcGVkKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JDVl9PSzoKLQkJREVCVUcoIiVzOiBPSURfR0VOX1JDVl9PS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKHJuZGlzX2RlYnVnID4gMSkKKwkJCURFQlVHKCIlczogT0lEX0dFTl9SQ1ZfT0tcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkgICAgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cy0+cnhfcGFja2V0cyAtIAogCQkJICAgIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMtPnJ4X2Vycm9ycyAtCiAJCQkgICAgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cy0+cnhfZHJvcHBlZCk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6Ci0JCURFQlVHKCIlczogT0lEX0dFTl9YTUlUX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAocm5kaXNfZGVidWcgPiAxKQorCQkJREVCVUcoIiVzOiBPSURfR0VOX1hNSVRfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9lcnJvcnMpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SQ1ZfRVJST1I6Ci0JCURFQlVHKCIlczogT0lEX0dFTl9SQ1ZfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IE9JRF9HRU5fUkNWX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9lcnJvcnMpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQpAQCAtMzQwLDEzICs0MDMsOSBAQAogCWNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgogCQlERUJVRygiJXM6IE9JRF9HRU5fUkNWX05PX0JVRkZFUlxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfZHJvcHBlZCk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIApAQCAtMzU5LDggKzQxOCw3IEBACiAJCSAqIGRpdmlkZWQgYnkgd2VpZ2h0IG9mIEFscGhhIENlbnRhdXJpCiAJCSAqLwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJbGVuZ3RoID0gNDsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJCShybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+dHhfcGFja2V0cyAtIAogCQkJCSBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCkBAIC0zNjksOSArNDI3LDYgQEAKIAkJCQkJIC5zdGF0cy0+dHhfZHJvcHBlZCkKIAkJCQkqIDEyMyk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCkBAIC0zNzksOCArNDM0LDcgQEAKIAkJREVCVUcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkvKiBkaXRvICovCiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9wYWNrZXRzIC0gCiAJCQkJIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KQEAgLTM4OSwxNDQgKzQ0MywxMDUgQEAKIAkJCQkJIC5zdGF0cy0+dHhfZHJvcHBlZCkKIAkJCQkvIDEyMyk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUOgogCQlERUJVRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCoxMjM0KTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlUOgogCQlERUJVRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5tdWx0aWNhc3QpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVDoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9wYWNrZXRzLzQyKjI1NSk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVDoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+dHhfcGFja2V0cy80Mik7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1Y6CiAJCURFQlVHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5tdWx0aWNhc3QgKiAxMTExKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1Y6CiAJCURFQlVHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+bXVsdGljYXN0KTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X3BhY2tldHMvNDIqMjU1KTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1Y6CiAJCURFQlVHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfcGFja2V0cy80Mik7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX1JDVl9DUkNfRVJST1I6CiAJCURFQlVHKCIlczogT0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9jcmNfZXJyb3JzKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIOgogCQlERUJVRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAjZW5kaWYJLyogUk5ESVNfT1BUSU9OQUxfU1RBVFMgKi8KQEAgLTUzOCwxMyArNTUzLDEwIEBACiAJCURFQlVHKCIlczogT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCWxlbmd0aCA9IEVUSF9BTEVOOwotCQkJbWVtY3B5ICgodTggKikgcmVzcCArIDI0LAorCQkJbWVtY3B5IChvdXRidWYsCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5ob3N0X21hYywKIAkJCQlsZW5ndGgpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQpAQCAtNTUzLDcgKzU2NSw3IEBACiAJCURFQlVHKCIlczogT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTU1xuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQlsZW5ndGggPSBFVEhfQUxFTjsKLQkJCW1lbWNweSAoKHU4ICopIHJlc3AgKyAyNCwKKwkJCW1lbWNweSAob3V0YnVmLAogCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uaG9zdF9tYWMsCiAJCQkJbGVuZ3RoKTsKIAkJCXJldHZhbCA9IDA7CkBAIC01NjMsMTggKzU3NSwxNiBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUOgogCQlERUJVRygiJXM6IE9JRF84MDJfM19NVUxUSUNBU1RfTElTVFxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKIAkJLyogTXVsdGljYXN0IGJhc2UgYWRkcmVzcyBvbmx5ICovCi0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgweEUwMDAwMDAwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDB4RTAwMDAwMDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkU6CiAJCURFQlVHKCIlczogT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkgbGVuZ3RoID0gNDsKIAkJLyogTXVsdGljYXN0IGJhc2UgYWRkcmVzcyBvbmx5ICovCi0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDEpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCkBAIC01ODcsMTEgKzU5Nyw4IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVDoKIAkJREVCVUcoIiVzOiBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVFxuIiwgX19GVU5DVElPTl9fKTsKLQkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpCi0JCXsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyk7CiAJCQlyZXR2YWwgPSAwOwogCQl9CkBAIC02MDAsMTYgKzYwNywxNCBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX1hNSVRfT05FX0NPTExJU0lPTjoKIAkJREVCVUcoIiVzOiBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJCQogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TOgogCQlERUJVRygiJXM6IE9JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OU1xuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKQEAgLTY1NSwyNyArNjYwLDE4IEBACiAJY2FzZSBPSURfUE5QX0NBUEFCSUxJVElFUzoKIAkJREVCVUcoIiVzOiBPSURfUE5QX0NBUEFCSUxJVElFU1xuIiwgX19GVU5DVElPTl9fKTsKIAotCQkvKiBqdXN0IFBNLCBhbmQgcmVtb3RlIHdha2V1cCBvbiBsaW5rIHN0YXR1cyBjaGFuZ2UKLQkJICogKG5vdCBtYWdpYyBwYWNrZXQgb3IgcGF0dGVybiBtYXRjaCkKLQkJICovCisJCS8qIGZvciBub3csIG5vIHdha2V1cCBjYXBhYmlsaXRpZXMgKi8KIAkJbGVuZ3RoID0gc2l6ZW9mIChzdHJ1Y3QgTkRJU19QTlBfQ0FQQUJJTElUSUVTKTsKLQkJbWVtc2V0IChyZXNwLCAwLCBsZW5ndGgpOwotCQl7Ci0JCQlzdHJ1Y3QgTkRJU19QTlBfQ0FQQUJJTElUSUVTICpjYXBzID0gKHZvaWQgKikgcmVzcDsKLQotCQkJY2Fwcy0+RmxhZ3MgPSBORElTX0RFVklDRV9XQUtFX1VQX0VOQUJMRTsKLQkJCWNhcHMtPldha2VVcENhcGFiaWxpdGllcy5NaW5MaW5rQ2hhbmdlV2FrZVVwIAotCQkJCSA9IE5kaXNEZXZpY2VTdGF0ZUQzOwotCi0JCQkvKiBGSVhNRSB0aGVuIHVzZSB1c2JfZ2FkZ2V0X3dha2V1cCgpLCBhbmQKLQkJCSAqIHNldCBVU0JfQ09ORklHX0FUVF9XQUtFVVAgaW4gY29uZmlnIGRlc2MKLQkJCSAqLwotCQl9CisJCW1lbXNldChvdXRidWYsIDAsIGxlbmd0aCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgT0lEX1BOUF9RVUVSWV9QT1dFUjoKLQkJREVCVUcoIiVzOiBPSURfUE5QX1FVRVJZX1BPV0VSXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkvKiBzdXJlLCBoYW5kbGUgYW55IHBvd2VyIHN0YXRlIHRoYXQgbWFwcyB0byBVU0Igc3VzcGVuZCAqLworCQlERUJVRygiJXM6IE9JRF9QTlBfUVVFUllfUE9XRVIgRCVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikgYnVmKSAtIDEpOworCQkvKiBvbmx5IHN1c3BlbmQgaXMgYSByZWFsIHBvd2VyIHN0YXRlLCBhbmQKKwkJICogaXQgY2FuJ3QgYmUgZW50ZXJlZCBieSBPSURfUE5QX1NFVF9QT1dFUi4uLgorCQkgKi8KKwkJbGVuZ3RoID0gMDsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTY4NCwxMSArNjgwLDEyIEBACiAJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogcXVlcnkgdW5rbm93biBPSUQgMHglMDhYXG4iLCAKIAkJCSBfX0ZVTkNUSU9OX18sIE9JRCk7CiAJfQorCWlmIChyZXR2YWwgPCAwKQorCQlsZW5ndGggPSAwOwogCQotCXJlc3AtPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMTYpOwogCXJlc3AtPkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoID0gY3B1X3RvX2xlMzIgKGxlbmd0aCk7Ci0JcmVzcC0+TWVzc2FnZUxlbmd0aCA9IGNwdV90b19sZTMyICgyNCArIGxlbmd0aCk7Ci0Jci0+bGVuZ3RoID0gMjQgKyBsZW5ndGg7CisJci0+bGVuZ3RoID0gbGVuZ3RoICsgc2l6ZW9mICpyZXNwOworCXJlc3AtPk1lc3NhZ2VMZW5ndGggPSBjcHVfdG9fbGUzMiAoci0+bGVuZ3RoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC03MDUsNDUgKzcwMiw0MCBAQAogCWlmICghcmVzcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlERUJVRygic2V0IE9JRCAlMDh4IHZhbHVlLCBsZW4gJWQ6XG4iLCBPSUQsIGJ1Zl9sZW4pOwotCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpICs9IDE2KSB7Ci0JCURFQlVHICgiJTAzZDogIgotCQkJIiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgotCQkJIiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgotCQkJIiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgotCQkJIiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgotCQkJIlxuIiwKLQkJCWksCi0JCQlidWZbaV0sIGJ1ZiBbaSsxXSwKLQkJCQlidWZbaSsyXSwgYnVmW2krM10sCi0JCQlidWZbaSs0XSwgYnVmIFtpKzVdLAotCQkJCWJ1ZltpKzZdLCBidWZbaSs3XSwKLQkJCWJ1ZltpKzhdLCBidWYgW2krOV0sCi0JCQkJYnVmW2krMTBdLCBidWZbaSsxMV0sCi0JCQlidWZbaSsxMl0sIGJ1ZiBbaSsxM10sCi0JCQkJYnVmW2krMTRdLCBidWZbaSsxNV0pOworCWlmIChidWZfbGVuICYmIHJuZGlzX2RlYnVnID4gMSkgeworCQlERUJVRygic2V0IE9JRCAlMDh4IHZhbHVlLCBsZW4gJWQ6XG4iLCBPSUQsIGJ1Zl9sZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmX2xlbjsgaSArPSAxNikgeworCQkJREVCVUcgKCIlMDNkOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBpLAorCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopJmJ1ZltpXSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyA0XSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyA4XSksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2kgKyAxMl0pKTsKKwkJfQogCX0KIAorCXBhcmFtcyA9ICZybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdOwogCXN3aXRjaCAoT0lEKSB7CiAJY2FzZSBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUjoKLQkJcGFyYW1zID0gJnJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl07Ci0JCXJldHZhbCA9IDA7CiAKLQkJLyogRklYTUUgdXNlIHRoZXNlIE5ESVNfUEFDS0VUX1RZUEVfKiBiaXRmbGFncyB0bwotCQkgKiBzZXQgdGhlIGNkY19maWx0ZXI7IGl0J3Mgbm90IFJORElTLXNwZWNpZmljCisJCS8qIHRoZXNlIE5ESVNfUEFDS0VUX1RZUEVfKiBiaXRmbGFncyBhcmUgc2hhcmVkIHdpdGgKKwkJICogY2RjX2ZpbHRlcjsgaXQncyBub3QgUk5ESVMtc3BlY2lmaWMKIAkJICogTkRJU19QQUNLRVRfVFlQRV94ID09IFVTQl9DRENfUEFDS0VUX1RZUEVfeCBmb3IgeCBpbjoKIAkJICoJUFJPTUlTQ1VPVVMsIERJUkVDVEVELAogCQkgKglNVUxUSUNBU1QsIEFMTF9NVUxUSUNBU1QsIEJST0FEQ0FTVAogCQkgKi8KLQkJcGFyYW1zLT5maWx0ZXIgPSBsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKWJ1Zik7CisJCSpwYXJhbXMtPmZpbHRlciA9ICh1MTYpIGxlMzJfdG9fY3B1cCgoX19sZTMyICopYnVmKTsKIAkJREVCVUcoIiVzOiBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUiAlMDh4XG4iLAotCQkJX19GVU5DVElPTl9fLCBwYXJhbXMtPmZpbHRlcik7CisJCQlfX0ZVTkNUSU9OX18sICpwYXJhbXMtPmZpbHRlcik7CiAKIAkJLyogdGhpcyBjYWxsIGhhcyBhIHNpZ25pZmljYW50IHNpZGUgZWZmZWN0OiAgaXQncwogCQkgKiB3aGF0IG1ha2VzIHRoZSBwYWNrZXQgZmxvdyBzdGFydCBhbmQgc3RvcCwgbGlrZQogCQkgKiBhY3RpdmF0aW5nIHRoZSBDREMgRXRoZXJuZXQgYWx0c2V0dGluZy4KIAkJICovCi0JCWlmIChwYXJhbXMtPmZpbHRlcikgeworI2lmZGVmCVJORElTX1BNCit1cGRhdGVfbGlua3N0YXRlOgorI2VuZGlmCisJCXJldHZhbCA9IDA7CisJCWlmICgqcGFyYW1zLT5maWx0ZXIpIHsKIAkJCXBhcmFtcy0+c3RhdGUgPSBSTkRJU19EQVRBX0lOSVRJQUxJWkVEOwogCQkJbmV0aWZfY2Fycmllcl9vbihwYXJhbXMtPmRldik7CiAJCQlpZiAobmV0aWZfcnVubmluZyhwYXJhbXMtPmRldikpCkBAIC03NzYsMjEgKzc2OCwzNCBAQAogCiAjaWZkZWYJUk5ESVNfUE0KIAljYXNlIE9JRF9QTlBfU0VUX1BPV0VSOgotCQlERUJVRyAoIk9JRF9QTlBfU0VUX1BPV0VSXG4iKTsKLQkJLyogc3VyZSwgaGFuZGxlIGFueSBwb3dlciBzdGF0ZSB0aGF0IG1hcHMgdG8gVVNCIHN1c3BlbmQgKi8KLQkJcmV0dmFsID0gMDsKKwkJLyogVGhlIG9ubHkgcmVhbCBwb3dlciBzdGF0ZSBpcyBVU0Igc3VzcGVuZCwgYW5kIFJORElTIHJlcXVlc3RzCisJCSAqIGNhbid0IGVudGVyIGl0OyB0aGlzIG9uZSBpc24ndCByZWFsbHkgYWJvdXQgcG93ZXIuICBBZnRlcgorCQkgKiByZXN1bWluZywgV2luZG93cyBmb3JjZXMgYSByZXNldCwgYW5kIHRoZW4gU0VUX1BPV0VSIEQwLgorCQkgKiBGSVhNRSAuLi4gdGhlbiB0aGluZ3MgZ28gYmF0dHk7IFdpbmRvd3Mgd2VkZ2VzIGl0c2VsZi4KKwkJICovCisJCWkgPSBsZTMyX3RvX2NwdXAoKF9fZm9yY2UgX19sZTMyICopYnVmKTsKKwkJREVCVUcoIiVzOiBPSURfUE5QX1NFVF9QT1dFUiBEJWRcbiIsIF9fRlVOQ1RJT05fXywgaSAtIDEpOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBOZGlzRGV2aWNlU3RhdGVEMDoKKwkJCSpwYXJhbXMtPmZpbHRlciA9IHBhcmFtcy0+c2F2ZWRfZmlsdGVyOworCQkJZ290byB1cGRhdGVfbGlua3N0YXRlOworCQljYXNlIE5kaXNEZXZpY2VTdGF0ZUQzOgorCQljYXNlIE5kaXNEZXZpY2VTdGF0ZUQyOgorCQljYXNlIE5kaXNEZXZpY2VTdGF0ZUQxOgorCQkJcGFyYW1zLT5zYXZlZF9maWx0ZXIgPSAqcGFyYW1zLT5maWx0ZXI7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKLQljYXNlIE9JRF9QTlBfRU5BQkxFX1dBS0VfVVA6Ci0JCS8qIGFsd2F5cy1jb25uZWN0ZWQgLi4uICovCi0JCURFQlVHICgiT0lEX1BOUF9FTkFCTEVfV0FLRV9VUFxuIik7Ci0JCXJldHZhbCA9IDA7Ci0JCWJyZWFrOwotCi0JLy8gbm8gUE0gcmVzdW1lIHBhdHRlcm5zIHN1cHBvcnRlZCAoc3BlY2lmaWVkIHdoZXJlPykKLQkvLyBzbyBPSURfUE5QX3tBREQsUkVNT1ZFfV9XQUtFX1VQX1BBVFRFUk4gYWx3YXlzIGZhaWxzCisjaWZkZWYJUk5ESVNfV0FLRVVQCisJLy8gbm8gd2FrZXVwIHN1cHBvcnQgYWR2ZXJ0aXNlZCwgc28gd2FrZXVwIE9JRHMgYWx3YXlzIGZhaWw6CisJLy8gIC0gT0lEX1BOUF9FTkFCTEVfV0FLRV9VUAorCS8vICAtIE9JRF9QTlBfe0FERCxSRU1PVkV9X1dBS0VfVVBfUEFUVEVSTgogI2VuZGlmCiAKKyNlbmRpZgkvKiBSTkRJU19QTSAqLworCiAJZGVmYXVsdDoKIAkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBzZXQgdW5rbm93biBPSUQgMHglMDhYLCBzaXplICVkXG4iLCAKIAkJCSBfX0ZVTkNUSU9OX18sIE9JRCwgYnVmX2xlbik7CkBAIC04MTEsMTMgKzgxNiwxMCBAQAogCWlmICghcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHJldHVybiAtRU5PVFNVUFA7CiAJCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZSAoY29uZmlnTnIsIHNpemVvZiAocm5kaXNfaW5pdF9jbXBsdF90eXBlKSk7Ci0JCi0JaWYgKCFyKSByZXR1cm4gLUVOT01FTTsKLQkKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCXJlc3AgPSAocm5kaXNfaW5pdF9jbXBsdF90eXBlICopIHItPmJ1ZjsKIAkKLQlpZiAoIXJlc3ApIHJldHVybiAtRU5PTUVNOwotCQogCXJlc3AtPk1lc3NhZ2VUeXBlID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoCiAJCQlSRU1PVEVfTkRJU19JTklUSUFMSVpFX0NNUExUKTsKIAlyZXNwLT5NZXNzYWdlTGVuZ3RoID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoNTIpOwpAQCAtODU3LDIwICs4NTksMjIgQEAKIAkgKiBvaWRfc3VwcG9ydGVkX2xpc3QgaXMgdGhlIGxhcmdlc3QgYW5zd2VyIAogCSAqLwogCXIgPSBybmRpc19hZGRfcmVzcG9uc2UgKGNvbmZpZ05yLCBzaXplb2YgKG9pZF9zdXBwb3J0ZWRfbGlzdCkpOwotCQotCWlmICghcikgcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyZXNwID0gKHJuZGlzX3F1ZXJ5X2NtcGx0X3R5cGUgKikgci0+YnVmOwogCQotCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07Ci0JCiAJcmVzcC0+TWVzc2FnZVR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChSRU1PVEVfTkRJU19RVUVSWV9DTVBMVCk7Ci0JcmVzcC0+TWVzc2FnZUxlbmd0aCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDI0KTsKIAlyZXNwLT5SZXF1ZXN0SUQgPSBidWYtPlJlcXVlc3RJRDsgLyogU3RpbGwgTEUgaW4gbXNnIGJ1ZmZlciAqLwotCQotCWlmIChnZW5fbmRpc19xdWVyeV9yZXNwIChjb25maWdOciwgbGUzMl90b19jcHUgKGJ1Zi0+T0lEKSwgcikpIHsKKyAgCQorCWlmIChnZW5fbmRpc19xdWVyeV9yZXNwIChjb25maWdOciwgbGUzMl90b19jcHUgKGJ1Zi0+T0lEKSwKKwkJCWxlMzJfdG9fY3B1KGJ1Zi0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpCisJCQkJCSsgOCArICh1OCAqKSBidWYsCisJCQlsZTMyX3RvX2NwdShidWYtPkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKSwKKwkJCXIpKSB7CiAJCS8qIE9JRCBub3Qgc3VwcG9ydGVkICovCiAJCXJlc3AtPlN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKAogCQkJCVJORElTX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmVzcC0+TWVzc2FnZUxlbmd0aCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKHNpemVvZiAqcmVzcCk7CiAJCXJlc3AtPkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJlc3AtPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJfSBlbHNlCkBAIC04ODksMTAgKzg5Myw5IEBACiAJcm5kaXNfcmVzcF90CQkqcjsKIAkKIAlyID0gcm5kaXNfYWRkX3Jlc3BvbnNlIChjb25maWdOciwgc2l6ZW9mIChybmRpc19zZXRfY21wbHRfdHlwZSkpOwotCQotCWlmICghcikgcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyZXNwID0gKHJuZGlzX3NldF9jbXBsdF90eXBlICopIHItPmJ1ZjsKLQlpZiAoIXJlc3ApIHJldHVybiAtRU5PTUVNOwogCiAJQnVmTGVuZ3RoID0gbGUzMl90b19jcHUgKGJ1Zi0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwogCUJ1Zk9mZnNldCA9IGxlMzJfdG9fY3B1IChidWYtPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0KTsKQEAgLTkzMCwxMCArOTMzLDkgQEAKIAlybmRpc19yZXNwX3QJCSpyOwogCQogCXIgPSBybmRpc19hZGRfcmVzcG9uc2UgKGNvbmZpZ05yLCBzaXplb2YgKHJuZGlzX3Jlc2V0X2NtcGx0X3R5cGUpKTsKLQkKLQlpZiAoIXIpIHJldHVybiAtRU5PTUVNOworCWlmICghcikKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmVzcCA9IChybmRpc19yZXNldF9jbXBsdF90eXBlICopIHItPmJ1ZjsKLQlpZiAoIXJlc3ApIHJldHVybiAtRU5PTUVNOwogCQogCXJlc3AtPk1lc3NhZ2VUeXBlID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoUkVNT1RFX05ESVNfUkVTRVRfQ01QTFQpOwogCXJlc3AtPk1lc3NhZ2VMZW5ndGggPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxNik7CkBAIC05NTcsOCArOTU5LDkgQEAKIAkvKiBob3N0ICJzaG91bGQiIGNoZWNrIG9ubHkgaW4gUk5ESVNfREFUQV9JTklUSUFMSVpFRCBzdGF0ZSAqLwogCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZSAoY29uZmlnTnIsIHNpemVvZiAocm5kaXNfa2VlcGFsaXZlX2NtcGx0X3R5cGUpKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCXJlc3AgPSAocm5kaXNfa2VlcGFsaXZlX2NtcGx0X3R5cGUgKikgci0+YnVmOwotCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07CiAJCQogCXJlc3AtPk1lc3NhZ2VUeXBlID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoCiAJCQlSRU1PVEVfTkRJU19LRUVQQUxJVkVfQ01QTFQpOwpAQCAtOTg3LDEwICs5OTAsOSBAQAogCQogCXIgPSBybmRpc19hZGRfcmVzcG9uc2UgKGNvbmZpZ05yLCAKIAkJCQlzaXplb2YgKHJuZGlzX2luZGljYXRlX3N0YXR1c19tc2dfdHlwZSkpOwotCWlmICghcikgcmV0dXJuIC1FTk9NRU07Ci0JCisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyZXNwID0gKHJuZGlzX2luZGljYXRlX3N0YXR1c19tc2dfdHlwZSAqKSByLT5idWY7Ci0JaWYgKCFyZXNwKSByZXR1cm4gLUVOT01FTTsKIAkKIAlyZXNwLT5NZXNzYWdlVHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKAogCQkJUkVNT1RFX05ESVNfSU5ESUNBVEVfU1RBVFVTX01TRyk7CkBAIC0xMDIxLDYgKzEwMjMsMjEgQEAKIAkJCQkJICBSTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCk7CiB9CiAKK3ZvaWQgcm5kaXNfdW5pbml0IChpbnQgY29uZmlnTnIpCit7CisJdTggKmJ1ZjsKKwl1MzIgbGVuZ3RoOworCisJaWYgKGNvbmZpZ05yID49IFJORElTX01BWF9DT05GSUdTKQorCQlyZXR1cm47CisJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS51c2VkID0gMDsKKwlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRlID0gUk5ESVNfVU5JTklUSUFMSVpFRDsKKworCS8qIGRyYWluIHRoZSByZXNwb25zZSBxdWV1ZSAqLworCXdoaWxlICgoYnVmID0gcm5kaXNfZ2V0X25leHRfcmVzcG9uc2UoY29uZmlnTnIsICZsZW5ndGgpKSkKKwkJcm5kaXNfZnJlZV9yZXNwb25zZShjb25maWdOciwgYnVmKTsKK30KKwogdm9pZCBybmRpc19zZXRfaG9zdF9tYWMgKGludCBjb25maWdOciwgY29uc3QgdTggKmFkZHIpCiB7CiAJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5ob3N0X21hYyA9IGFkZHI7CkBAIC0xMDQ2LDkgKzEwNjMsMTMgQEAKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAlwYXJhbXMgPSAmcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXTsKIAkKKwkvKiBOT1RFOiBSTkRJUyBpcyAqRVhUUkVNRUxZKiBjaGF0dHkgLi4uIFdpbmRvd3MgY29uc3RhbnRseSBwb2xscyBmb3IKKwkgKiByeC90eCBzdGF0aXN0aWNzIGFuZCBsaW5rIHN0YXR1cywgaW4gYWRkaXRpb24gdG8gS0VFUEFMSVZFIHRyYWZmaWMKKwkgKiBhbmQgbm9ybWFsIEhDIGxldmVsIHBvbGxpbmcgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IElOIHRyYWZmaWMuCisJICovCisKIAkvKiBGb3IgVVNCOiByZXNwb25zZXMgbWF5IHRha2UgdXAgdG8gMTAgc2Vjb25kcyAqLwotCXN3aXRjaCAoTXNnVHlwZSkKLQl7CisJc3dpdGNoIChNc2dUeXBlKSB7CiAJY2FzZSBSRU1PVEVfTkRJU19JTklUSUFMSVpFX01TRzoKIAkJREVCVUcoIiVzOiBSRU1PVEVfTkRJU19JTklUSUFMSVpFX01TR1xuIiwgCiAJCQlfX0ZVTkNUSU9OX18gKTsKQEAgLTEwODIsMTAgKzExMDMsOSBAQAogCiAJY2FzZSBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHOgogCQkvKiBGb3IgVVNCOiBob3N0IGRvZXMgdGhpcyBldmVyeSA1IHNlY29uZHMgKi8KLSNpZmRlZglWRVJCT1NFCi0JCURFQlVHKCIlczogUkVNT1RFX05ESVNfS0VFUEFMSVZFX01TR1xuIiwgCi0JCQlfX0ZVTkNUSU9OX18gKTsKLSNlbmRpZgorCQlpZiAocm5kaXNfZGVidWcgPiAxKQorCQkJREVCVUcoIiVzOiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHXG4iLCAKKwkJCQlfX0ZVTkNUSU9OX18gKTsKIAkJcmV0dXJuIHJuZGlzX2tlZXBhbGl2ZV9yZXNwb25zZSAoY29uZmlnTnIsCiAJCQkJCQkgKHJuZGlzX2tlZXBhbGl2ZV9tc2dfdHlwZSAqKSAKIAkJCQkJCSBidWYpOwpAQCAtMTE1Miw3ICsxMTcyLDggQEAKIH0KIAogaW50IHJuZGlzX3NldF9wYXJhbV9kZXYgKHU4IGNvbmZpZ05yLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKLQkJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMpCisJCQkgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkJIHUxNiAqY2RjX2ZpbHRlcikKIHsKIAlERUJVRygiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsKIAlpZiAoIWRldiB8fCAhc3RhdHMpIHJldHVybiAtMTsKQEAgLTExNjAsNiArMTE4MSw3IEBACiAJCiAJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYgPSBkZXY7CiAJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cyA9IHN0YXRzOworCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZmlsdGVyID0gY2RjX2ZpbHRlcjsKIAkKIAlyZXR1cm4gMDsKIH0KQEAgLTExNzgsNyArMTIwMCw3IEBACiAKIGludCBybmRpc19zZXRfcGFyYW1fbWVkaXVtICh1OCBjb25maWdOciwgdTMyIG1lZGl1bSwgdTMyIHNwZWVkKQogewotCURFQlVHKCIlczpcbiIsIF9fRlVOQ1RJT05fXyApOworCURFQlVHKCIlczogJXUgJXVcbiIsIF9fRlVOQ1RJT05fXywgbWVkaXVtLCBzcGVlZCk7CiAJaWYgKGNvbmZpZ05yID49IFJORElTX01BWF9DT05GSUdTKSByZXR1cm4gLTE7CiAJCiAJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0gPSBtZWRpdW07CkBAIC0xMjQyLDYgKzEyNjQsNyBAQAogewogCXJuZGlzX3Jlc3BfdAkqcjsKIAkKKwkvKiBOT1RFOiAgdGhpcyBnZXRzIGNvcGllZCBpbnRvIGV0aGVyLmMgVVNCX0JVRlNJWiBieXRlcyAuLi4gKi8KIAlyID0ga21hbGxvYyAoc2l6ZW9mIChybmRpc19yZXNwX3QpICsgbGVuZ3RoLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXIpIHJldHVybiBOVUxMOwogCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuaAppbmRleCAyYjViNTVkLi45NWI0YzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuaApAQCAtNjksOTAgKzY5LDYgQEAKICNkZWZpbmUgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUAkJCTB4RkQwMTAxMDYKIAogCi0vKiBzdXBwb3J0ZWQgT0lEcyAqLwotc3RhdGljIGNvbnN0IHUzMiBvaWRfc3VwcG9ydGVkX2xpc3QgW10gPSAKLXsKLQkvKiB0aGUgZ2VuZXJhbCBzdHVmZiAqLwotCU9JRF9HRU5fU1VQUE9SVEVEX0xJU1QsCi0JT0lEX0dFTl9IQVJEV0FSRV9TVEFUVVMsCi0JT0lEX0dFTl9NRURJQV9TVVBQT1JURUQsCi0JT0lEX0dFTl9NRURJQV9JTl9VU0UsCi0JT0lEX0dFTl9NQVhJTVVNX0ZSQU1FX1NJWkUsCi0JT0lEX0dFTl9MSU5LX1NQRUVELAotCU9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRSwKLQlPSURfR0VOX1JFQ0VJVkVfQkxPQ0tfU0laRSwKLQlPSURfR0VOX1ZFTkRPUl9JRCwKLQlPSURfR0VOX1ZFTkRPUl9ERVNDUklQVElPTiwKLQlPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTiwKLQlPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUiwKLQlPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRSwKLQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTLAotCU9JRF9HRU5fUEhZU0lDQUxfTUVESVVNLAotI2lmIDAKLQlPSURfR0VOX1JORElTX0NPTkZJR19QQVJBTUVURVIsCi0jZW5kaWYKLQkKLQkvKiB0aGUgc3RhdGlzdGljYWwgc3R1ZmYgKi8KLQlPSURfR0VOX1hNSVRfT0ssCi0JT0lEX0dFTl9SQ1ZfT0ssCi0JT0lEX0dFTl9YTUlUX0VSUk9SLAotCU9JRF9HRU5fUkNWX0VSUk9SLAotCU9JRF9HRU5fUkNWX05PX0JVRkZFUiwKLSNpZmRlZglSTkRJU19PUFRJT05BTF9TVEFUUwotCU9JRF9HRU5fRElSRUNURURfQllURVNfWE1JVCwKLQlPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlULAotCU9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVQsCi0JT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQsCi0JT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVCwKLQlPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVCwKLQlPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDViwKLQlPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19SQ1YsCi0JT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfUkNWLAotCU9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1YsCi0JT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWLAotCU9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1YsCi0JT0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SLAotCU9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RILAotI2VuZGlmCS8qIFJORElTX09QVElPTkFMX1NUQVRTICovCi0KLSAgICAJLyogbWFuZGF0b3J5IDgwMi4zICovCi0JLyogdGhlIGdlbmVyYWwgc3R1ZmYgKi8KLQlPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1MsCi0JT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUywKLQlPSURfODAyXzNfTVVMVElDQVNUX0xJU1QsCi0JT0lEXzgwMl8zX01BQ19PUFRJT05TLAotCU9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRSwKLQkKLQkvKiB0aGUgc3RhdGlzdGljYWwgc3R1ZmYgKi8KLQlPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVCwKLQlPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OLAotCU9JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OUywKLSNpZmRlZglSTkRJU19PUFRJT05BTF9TVEFUUwotCU9JRF84MDJfM19YTUlUX0RFRkVSUkVELAotCU9JRF84MDJfM19YTUlUX01BWF9DT0xMSVNJT05TLAotCU9JRF84MDJfM19SQ1ZfT1ZFUlJVTiwKLQlPSURfODAyXzNfWE1JVF9VTkRFUlJVTiwKLQlPSURfODAyXzNfWE1JVF9IRUFSVEJFQVRfRkFJTFVSRSwKLQlPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVCwKLQlPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlMsCi0jZW5kaWYJLyogUk5ESVNfT1BUSU9OQUxfU1RBVFMgKi8KLQotI2lmZGVmCVJORElTX1BNCi0JLyogUE0gYW5kIHdha2V1cCBhcmUgbWFuZGF0b3J5IGZvciBVU0I6ICovCi0KLQkvKiBwb3dlciBtYW5hZ2VtZW50ICovCi0JT0lEX1BOUF9DQVBBQklMSVRJRVMsCi0JT0lEX1BOUF9RVUVSWV9QT1dFUiwKLQlPSURfUE5QX1NFVF9QT1dFUiwKLQotCS8qIHdha2UgdXAgaG9zdCAqLwotCU9JRF9QTlBfRU5BQkxFX1dBS0VfVVAsCi0JT0lEX1BOUF9BRERfV0FLRV9VUF9QQVRURVJOLAotCU9JRF9QTlBfUkVNT1ZFX1dBS0VfVVBfUEFUVEVSTiwKLSNlbmRpZgotfTsKLQotCiB0eXBlZGVmIHN0cnVjdCBybmRpc19pbml0X21zZ190eXBlIAogewogCV9fbGUzMglNZXNzYWdlVHlwZTsKQEAgLTMwOSwxNSArMjI1LDE4IEBACiB0eXBlZGVmIHN0cnVjdCBybmRpc19wYXJhbXMKIHsKIAl1OAkJCWNvbmZpZ25yOwotCWludAkJCXVzZWQ7CisJdTgJCQl1c2VkOworCXUxNgkJCXNhdmVkX2ZpbHRlcjsKIAllbnVtIHJuZGlzX3N0YXRlCXN0YXRlOwotCXUzMgkJCWZpbHRlcjsKIAl1MzIJCQltZWRpdW07CiAJdTMyCQkJc3BlZWQ7CiAJdTMyCQkJbWVkaWFfc3RhdGU7CisKIAljb25zdCB1OAkJKmhvc3RfbWFjOworCXUxNgkJCSpmaWx0ZXI7CiAJc3RydWN0IG5ldF9kZXZpY2UgCSpkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCiAJdTMyCQkJdmVuZG9ySUQ7CiAJY29uc3QgY2hhcgkJKnZlbmRvckRlc2NyOwogCWludCAJCQkoKmFjaykgKHN0cnVjdCBuZXRfZGV2aWNlICopOwpAQCAtMzI5LDcgKzI0OCw4IEBACiBpbnQgIHJuZGlzX3JlZ2lzdGVyIChpbnQgKCpybmRpc19jb250cm9sX2FjaykgKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKIHZvaWQgcm5kaXNfZGVyZWdpc3RlciAoaW50IGNvbmZpZ05yKTsKIGludCAgcm5kaXNfc2V0X3BhcmFtX2RldiAodTggY29uZmlnTnIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzKTsKKwkJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCQkgdTE2ICpjZGNfZmlsdGVyKTsKIGludCAgcm5kaXNfc2V0X3BhcmFtX3ZlbmRvciAodTggY29uZmlnTnIsIHUzMiB2ZW5kb3JJRCwgCiAJCQkgICAgY29uc3QgY2hhciAqdmVuZG9yRGVzY3IpOwogaW50ICBybmRpc19zZXRfcGFyYW1fbWVkaXVtICh1OCBjb25maWdOciwgdTMyIG1lZGl1bSwgdTMyIHNwZWVkKTsKQEAgLTMzOCw2ICsyNTgsNyBAQAogdTggICAqcm5kaXNfZ2V0X25leHRfcmVzcG9uc2UgKGludCBjb25maWdOciwgdTMyICpsZW5ndGgpOwogdm9pZCBybmRpc19mcmVlX3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIHU4ICpidWYpOwogCit2b2lkIHJuZGlzX3VuaW5pdCAoaW50IGNvbmZpZ05yKTsKIGludCAgcm5kaXNfc2lnbmFsX2Nvbm5lY3QgKGludCBjb25maWdOcik7CiBpbnQgIHJuZGlzX3NpZ25hbF9kaXNjb25uZWN0IChpbnQgY29uZmlnTnIpOwogaW50ICBybmRpc19zdGF0ZSAoaW50IGNvbmZpZ05yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwppbmRleCA0ZDU5MWM3Li45ZTRmMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCkBAIC0zMDAsMTggKzMwMCwxOCBAQAogCQl1OCB0eXBlLCB1bnNpZ25lZCBpbnQgaW5kZXgsIGludCBpc19vdGcpOwogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICpnc19hbGxvY19yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGludCBsZW4sCi0JaW50IGttYWxsb2NfZmxhZ3MpOworCXVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpOwogc3RhdGljIHZvaWQgZ3NfZnJlZV9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAogc3RhdGljIHN0cnVjdCBnc19yZXFfZW50cnkgKmdzX2FsbG9jX3JlcV9lbnRyeShzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgbGVuLAotCWludCBrbWFsbG9jX2ZsYWdzKTsKKwl1bnNpZ25lZCBrbWFsbG9jX2ZsYWdzKTsKIHN0YXRpYyB2b2lkIGdzX2ZyZWVfcmVxX2VudHJ5KHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgZ3NfcmVxX2VudHJ5ICpyZXEpOwogCi1zdGF0aWMgaW50IGdzX2FsbG9jX3BvcnRzKHN0cnVjdCBnc19kZXYgKmRldiwgaW50IGttYWxsb2NfZmxhZ3MpOworc3RhdGljIGludCBnc19hbGxvY19wb3J0cyhzdHJ1Y3QgZ3NfZGV2ICpkZXYsIHVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpOwogc3RhdGljIHZvaWQgZ3NfZnJlZV9wb3J0cyhzdHJ1Y3QgZ3NfZGV2ICpkZXYpOwogCiAvKiBjaXJjdWxhciBidWZmZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgZ3NfYnVmICpnc19idWZfYWxsb2ModW5zaWduZWQgaW50IHNpemUsIGludCBrbWFsbG9jX2ZsYWdzKTsKK3N0YXRpYyBzdHJ1Y3QgZ3NfYnVmICpnc19idWZfYWxsb2ModW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpOwogc3RhdGljIHZvaWQgZ3NfYnVmX2ZyZWUoc3RydWN0IGdzX2J1ZiAqZ2IpOwogc3RhdGljIHZvaWQgZ3NfYnVmX2NsZWFyKHN0cnVjdCBnc19idWYgKmdiKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ3NfYnVmX2RhdGFfYXZhaWwoc3RydWN0IGdzX2J1ZiAqZ2IpOwpAQCAtMTYwNyw5ICsxNjA3LDkgQEAKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAJc3RydWN0IGdzX2RldiAqZGV2ID0gZ2V0X2dhZGdldF9kYXRhKGdhZGdldCk7CiAJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSBkZXYtPmRldl9jdHJsX3JlcTsKLQl1MTYgd0luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNiB3VmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2IHdMZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNiB3SW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNiB3VmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCXUxNiB3TGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spIHsKIAljYXNlIFVTQl9UWVBFX1NUQU5EQVJEOgpAQCAtMTY1MSw5ICsxNjUxLDkgQEAKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAJc3RydWN0IGdzX2RldiAqZGV2ID0gZ2V0X2dhZGdldF9kYXRhKGdhZGdldCk7CiAJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSBkZXYtPmRldl9jdHJsX3JlcTsKLQl1MTYgd0luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNiB3VmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2IHdMZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNiB3SW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNiB3VmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCXUxNiB3TGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CiAJY2FzZSBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOgpAQCAtMTc4Miw5ICsxNzgyLDkgQEAKIAlzdHJ1Y3QgZ3NfZGV2ICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IGRldi0+ZGV2X3BvcnRbMF07CS8qIEFDTSBvbmx5IGhhcyBvbmUgcG9ydCAqLwogCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gZGV2LT5kZXZfY3RybF9yZXE7Ci0JdTE2IHdJbmRleCA9IGN0cmwtPndJbmRleDsKLQl1MTYgd1ZhbHVlID0gY3RybC0+d1ZhbHVlOwotCXUxNiB3TGVuZ3RoID0gY3RybC0+d0xlbmd0aDsKKwl1MTYgd0luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYgd1ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKwl1MTYgd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCiAJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgewogCWNhc2UgVVNCX0NEQ19SRVFfU0VUX0xJTkVfQ09ESU5HOgpAQCAtMjExOSw3ICsyMTE5LDggQEAKICAqIEFsbG9jYXRlIGEgdXNiX3JlcXVlc3QgYW5kIGl0cyBidWZmZXIuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKICAqIHVzYl9yZXF1ZXN0IG9yIE5VTEwgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmdzX2FsbG9jX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgaW50IGxlbiwgaW50IGttYWxsb2NfZmxhZ3MpCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKK2dzX2FsbG9jX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQga21hbGxvY19mbGFncykKIHsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcTsKIApAQCAtMjE1OSw3ICsyMTYwLDggQEAKICAqIEFsbG9jYXRlcyBhIHJlcXVlc3QgYW5kIGl0cyBidWZmZXIsIHVzaW5nIHRoZSBnaXZlbgogICogZW5kcG9pbnQsIGJ1ZmZlciBsZW4sIGFuZCBrbWFsbG9jIGZsYWdzLgogICovCi1zdGF0aWMgc3RydWN0IGdzX3JlcV9lbnRyeSAqZ3NfYWxsb2NfcmVxX2VudHJ5KHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBsZW4sIGludCBrbWFsbG9jX2ZsYWdzKQorc3RhdGljIHN0cnVjdCBnc19yZXFfZW50cnkgKgorZ3NfYWxsb2NfcmVxX2VudHJ5KHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpCiB7CiAJc3RydWN0IGdzX3JlcV9lbnRyeQkqcmVxOwogCkBAIC0yMjAwLDcgKzIyMDIsNyBAQAogICoKICAqIFRoZSBkZXZpY2UgbG9jayBpcyBub3JtYWxseSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGdzX2FsbG9jX3BvcnRzKHN0cnVjdCBnc19kZXYgKmRldiwgaW50IGttYWxsb2NfZmxhZ3MpCitzdGF0aWMgaW50IGdzX2FsbG9jX3BvcnRzKHN0cnVjdCBnc19kZXYgKmRldiwgdW5zaWduZWQga21hbGxvY19mbGFncykKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKQEAgLTIyODIsNyArMjI4NCw3IEBACiAgKgogICogQWxsb2NhdGUgYSBjaXJjdWxhciBidWZmZXIgYW5kIGFsbCBhc3NvY2lhdGVkIG1lbW9yeS4KICAqLwotc3RhdGljIHN0cnVjdCBnc19idWYgKmdzX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGttYWxsb2NfZmxhZ3MpCitzdGF0aWMgc3RydWN0IGdzX2J1ZiAqZ3NfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBrbWFsbG9jX2ZsYWdzKQogewogCXN0cnVjdCBnc19idWYgKmdiOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwppbmRleCA2ZTQ5NDMyLi5iYjliMmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLXNvdXJjZV9zaW5rX3N0YXJ0X2VwIChzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGdmcF9mbGFncykKK3NvdXJjZV9zaW5rX3N0YXJ0X2VwIChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCWludAkJCXN0YXR1czsKQEAgLTY0MCw3ICs2NDAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfc291cmNlX3NpbmtfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3NldF9zb3VyY2Vfc2lua19jb25maWcgKHN0cnVjdCB6ZXJvX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CkBAIC03NDQsNyArNzQ0LDcgQEAKIH0KIAogc3RhdGljIGludAotc2V0X2xvb3BiYWNrX2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIGludCBnZnBfZmxhZ3MpCitzZXRfbG9vcGJhY2tfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IHVzYl9lcAkJKmVwOwpAQCAtODQ1LDcgKzg0NSw3IEBACiAgKiBieSBsaW1pdGluZyBjb25maWd1cmF0aW9uIGNob2ljZXMgKGxpa2UgdGhlIHB4YTJ4eCkuCiAgKi8KIHN0YXRpYyBpbnQKLXplcm9fc2V0X2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgaW50IGdmcF9mbGFncykKK3plcm9fc2V0X2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IGRldi0+Z2FkZ2V0OwpAQCAtOTE5LDkgKzkxOSw5IEBACiAJc3RydWN0IHplcm9fZGV2CQkqZGV2ID0gZ2V0X2dhZGdldF9kYXRhIChnYWRnZXQpOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gZGV2LT5yZXE7CiAJaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQl3X2luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNgkJCXdfdmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2CQkJd19sZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNgkJCXdfaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNgkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCXUxNgkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAkvKiB1c3VhbGx5IHRoaXMgc3RvcmVzIHJlcGx5IGRhdGEgaW4gdGhlIHByZS1hbGxvY2F0ZWQgZXAwIGJ1ZmZlciwKIAkgKiBidXQgY29uZmlnIGNoYW5nZSBldmVudHMgd2lsbCByZWNvbmZpZ3VyZSBoYXJkd2FyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCAxOWU1OThjLi5lZDE4OTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC00OSw2ICs0OSwxOSBAQAogCiAJICBUaGlzIHN1cHBvcnRzIHRoZSBFSENJIGltcGxlbWVudGF0aW9uIGZyb20gVHJhbnNEaW1lbnNpb24gSW5jLgogCitjb25maWcgVVNCX0lTUDExNlhfSENECisJdHJpc3RhdGUgIklTUDExNlggSENEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBUaGUgSVNQMTE2MCBhbmQgSVNQMTE2MSBjaGlwcyBhcmUgVVNCIGhvc3QgY29udHJvbGxlcnMuIEVuYWJsZSB0aGlzCisJICBvcHRpb24gaWYgeW91ciBib2FyZCBoYXMgdGhpcyBjaGlwLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGlzb2Nocm9ub3VzIHRyYW5zZmVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXNwMTE2eC1oY2QuCisKIGNvbmZpZyBVU0JfT0hDSV9IQ0QKIAl0cmlzdGF0ZSAiT0hDSSBIQ0Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBVU0JfQVJDSF9IQVNfT0hDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKaW5kZXggNWRiZDNlNy4uMzUwZDE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogIwogCiBvYmotJChDT05GSUdfVVNCX0VIQ0lfSENEKQkrPSBlaGNpLWhjZC5vCitvYmotJChDT05GSUdfVVNCX0lTUDExNlhfSENEKQkrPSBpc3AxMTZ4LWhjZC5vCiBvYmotJChDT05GSUdfVVNCX09IQ0lfSENEKQkrPSBvaGNpLWhjZC5vCiBvYmotJChDT05GSUdfVVNCX1VIQ0lfSENEKQkrPSB1aGNpLWhjZC5vCiBvYmotJChDT05GSUdfVVNCX1NMODExX0hDRCkJKz0gc2w4MTEtaGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwppbmRleCAyZmYxMWQ1Li41MGNiMDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAl9CiAKIAlyZXR1cm4gc2NucHJpbnRmIChidWYsIGxlbiwKLQkJIiVzJXNwb3J0ICVkIHN0YXR1cyAlMDZ4JXMlcyBzaWc9JXMgJXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJIiVzJXNwb3J0ICVkIHN0YXR1cyAlMDZ4JXMlcyBzaWc9JXMlcyVzJXMlcyVzJXMlcyVzJXMiLAogCQlsYWJlbCwgbGFiZWwgWzBdID8gIiAiIDogIiIsIHBvcnQsIHN0YXR1cywKIAkJKHN0YXR1cyAmIFBPUlRfUE9XRVIpID8gIiBQT1dFUiIgOiAiIiwKIAkJKHN0YXR1cyAmIFBPUlRfT1dORVIpID8gIiBPV05FUiIgOiAiIiwKQEAgLTY0NCw5ICs2NDQsMTEgQEAKIAlpZiAoYnVzLT5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSkgewogCQlzaXplID0gc2NucHJpbnRmIChuZXh0LCBzaXplLAogCQkJImJ1cyAlcywgZGV2aWNlICVzIChkcml2ZXIgIiBEUklWRVJfVkVSU0lPTiAiKVxuIgorCQkJIiVzXG4iCiAJCQkiU1VTUEVOREVEIChubyByZWdpc3RlciBhY2Nlc3MpXG4iLAogCQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1cy0+bmFtZSwKLQkJCWhjZC0+c2VsZi5jb250cm9sbGVyLT5idXNfaWQpOworCQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1c19pZCwKKwkJCWhjZC0+cHJvZHVjdF9kZXNjKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtNjU0LDEzICs2NTYsNTMgQEAKIAlpID0gSENfVkVSU0lPTihyZWFkbCAoJmVoY2ktPmNhcHMtPmhjX2NhcGJhc2UpKTsKIAl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLAogCQkiYnVzICVzLCBkZXZpY2UgJXMgKGRyaXZlciAiIERSSVZFUl9WRVJTSU9OICIpXG4iCisJCSIlc1xuIgogCQkiRUhDSSAleC4lMDJ4LCBoY2Qgc3RhdGUgJWRcbiIsCiAJCWhjZC0+c2VsZi5jb250cm9sbGVyLT5idXMtPm5hbWUsCiAJCWhjZC0+c2VsZi5jb250cm9sbGVyLT5idXNfaWQsCisJCWhjZC0+cHJvZHVjdF9kZXNjLAogCQlpID4+IDgsIGkgJiAweDBmZiwgaGNkLT5zdGF0ZSk7CiAJc2l6ZSAtPSB0ZW1wOwogCW5leHQgKz0gdGVtcDsKIAorI2lmZGVmCUNPTkZJR19QQ0kKKwkvKiBFSENJIDAuOTYgYW5kIGxhdGVyIG1heSBoYXZlICJleHRlbmRlZCBjYXBhYmlsaXRpZXMiICovCisJaWYgKGhjZC0+c2VsZi5jb250cm9sbGVyLT5idXMgPT0gJnBjaV9idXNfdHlwZSkgeworCQlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwkJdTMyCQlvZmZzZXQsIGNhcCwgY2FwMjsKKwkJdW5zaWduZWQJY291bnQgPSAyNTYvNDsKKworCQlwZGV2ID0gdG9fcGNpX2RldihlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyKTsKKwkJb2Zmc2V0ID0gSENDX0VYVF9DQVBTIChyZWFkbCAoJmVoY2ktPmNhcHMtPmhjY19wYXJhbXMpKTsKKwkJd2hpbGUgKG9mZnNldCAmJiBjb3VudC0tKSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKHBkZXYsIG9mZnNldCwgJmNhcCk7CisJCQlzd2l0Y2ggKGNhcCAmIDB4ZmYpIHsKKwkJCWNhc2UgMToKKwkJCQl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLAorCQkJCQkib3duZXJzaGlwICUwOHglcyVzXG4iLCBjYXAsCisJCQkJCShjYXAgJiAoMSA8PCAyNCkpID8gIiBsaW51eCIgOiAiIiwKKwkJCQkJKGNhcCAmICgxIDw8IDE2KSkgPyAiIGZpcm13YXJlIiA6ICIiKTsKKwkJCQlzaXplIC09IHRlbXA7CisJCQkJbmV4dCArPSB0ZW1wOworCisJCQkJb2Zmc2V0ICs9IDQ7CisJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChwZGV2LCBvZmZzZXQsICZjYXAyKTsKKwkJCQl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLAorCQkJCQkiU01JIHN0cy9lbmFibGUgMHglMDh4XG4iLCBjYXAyKTsKKwkJCQlzaXplIC09IHRlbXA7CisJCQkJbmV4dCArPSB0ZW1wOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgkJLyogaWxsZWdhbCByZXNlcnZlZCBjYXBhYmlsaXR5ICovCisJCQkJY2FwID0gMDsKKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJZGVmYXVsdDoJCS8qIHVua25vd24gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCXRlbXAgPSAoY2FwID4+IDgpICYgMHhmZjsKKwkJfQorCX0KKyNlbmRpZgorCiAJLy8gRklYTUUgaW50ZXJwcmV0IGJvdGggdHlwZXMgb2YgcGFyYW1zCiAJaSA9IHJlYWRsICgmZWhjaS0+Y2Fwcy0+aGNzX3BhcmFtcyk7CiAJdGVtcCA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwgInN0cnVjdHVyYWwgcGFyYW1zIDB4JTA4eFxuIiwgaSk7CkBAIC02OTYsMTIgKzczOCwxOSBAQAogCXNpemUgLT0gdGVtcDsKIAluZXh0ICs9IHRlbXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOyBpKyspIHsKLQkJdGVtcCA9IGRiZ19wb3J0X2J1ZiAoc2NyYXRjaCwgc2l6ZW9mIHNjcmF0Y2gsIGxhYmVsLCBpICsgMSwKLQkJCQlyZWFkbCAoJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSkpOworCWZvciAoaSA9IDE7IGkgPD0gSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOyBpKyspIHsKKwkJdGVtcCA9IGRiZ19wb3J0X2J1ZiAoc2NyYXRjaCwgc2l6ZW9mIHNjcmF0Y2gsIGxhYmVsLCBpLAorCQkJCXJlYWRsICgmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2kgLSAxXSkpOwogCQl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLCBmbXQsIHRlbXAsIHNjcmF0Y2gpOwogCQlzaXplIC09IHRlbXA7CiAJCW5leHQgKz0gdGVtcDsKKwkJaWYgKGkgPT0gSENTX0RFQlVHX1BPUlQoZWhjaS0+aGNzX3BhcmFtcykgJiYgZWhjaS0+ZGVidWcpIHsKKwkJCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsCisJCQkJCSIgICAgZGVidWcgY29udHJvbCAlMDh4XG4iLAorCQkJCQlyZWFkbCAoJmVoY2ktPmRlYnVnLT5jb250cm9sKSk7CisJCQlzaXplIC09IHRlbXA7CisJCQluZXh0ICs9IHRlbXA7CisJCX0KIAl9CiAKIAlpZiAoZWhjaS0+cmVjbGFpbSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IGJjNjliZDcuLjE0OWIxM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTMwNCwzMCArMzA0LDMxIEBACiAgKi8KIHN0YXRpYyBpbnQgYmlvc19oYW5kb2ZmIChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIGludCB3aGVyZSwgdTMyIGNhcCkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZWhjaV90b19oY2QoZWhjaSktPnNlbGYuY29udHJvbGxlcik7CisKKwkvKiBhbHdheXMgc2F5IExpbnV4IHdpbGwgb3duIHRoZSBoYXJkd2FyZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCB3aGVyZSArIDMsIDEpOworCisJLyogbWF5YmUgd2FpdCBhIHdoaWxlIGZvciBCSU9TIHRvIHJlc3BvbmQgKi8KIAlpZiAoY2FwICYgKDEgPDwgMTYpKSB7CiAJCWludCBtc2VjID0gNTAwMDsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPQotCQkJCXRvX3BjaV9kZXYoZWhjaV90b19oY2QoZWhjaSktPnNlbGYuY29udHJvbGxlcik7CiAKLQkJLyogcmVxdWVzdCBoYW5kb2ZmIHRvIE9TICovCi0JCWNhcCB8PSAxIDw8IDI0OwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCBjYXApOwotCi0JCS8qIGFuZCB3YWl0IGEgd2hpbGUgZm9yIGl0IHRvIGhhcHBlbiAqLwogCQlkbyB7CiAJCQltc2xlZXAoMTApOwogCQkJbXNlYyAtPSAxMDsKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSwgJmNhcCk7CiAJCX0gd2hpbGUgKChjYXAgJiAoMSA8PCAxNikpICYmIG1zZWMpOwogCQlpZiAoY2FwICYgKDEgPDwgMTYpKSB7Ci0JCQllaGNpX2VyciAoZWhjaSwgIkJJT1MgaGFuZG9mZiBmYWlsZWQgKCVkLCAlMDR4KVxuIiwKKwkJCWVoY2lfZXJyKGVoY2ksICJCSU9TIGhhbmRvZmYgZmFpbGVkICglZCwgJTA4eClcbiIsCiAJCQkJd2hlcmUsIGNhcCk7CiAJCQkvLyBzb21lIEJJT1MgdmVyc2lvbnMgc2VlbSBidWdneS4uLgogCQkJLy8gcmV0dXJuIDE7CiAJCQllaGNpX3dhcm4gKGVoY2ksICJjb250aW51aW5nIGFmdGVyIEJJT1MgYnVnLi4uXG4iKTsKLQkJCXJldHVybiAwOwotCQl9IAotCQllaGNpX2RiZyAoZWhjaSwgIkJJT1MgaGFuZG9mZiBzdWNjZWVkZWRcbiIpOworCQkJLyogZGlzYWJsZSBhbGwgU01JcywgYW5kIGNsZWFyICJCSU9TIG93bnMiIGZsYWcgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUgKyA0LCAwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCB3aGVyZSArIDIsIDApOworCQl9IGVsc2UKKwkJCWVoY2lfZGJnKGVoY2ksICJCSU9TIGhhbmRvZmYgc3VjY2VlZGVkXG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00OTIsOCArNDkzLDYgQEAKIHsKIAlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpID0gaGNkX3RvX2VoY2kgKGhjZCk7CiAJdTMyCQkJdGVtcDsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKLQlzdHJ1Y3QgdXNiX2J1cwkJKmJ1czsKIAlpbnQJCQlyZXR2YWw7CiAJdTMyCQkJaGNjX3BhcmFtczsKIAl1OCAgICAgICAgICAgICAgICAgICAgICBzYnJuID0gMDsKQEAgLTU4OCw4ICs1ODcsOCBAQAogCQl3cml0ZWwgKDAsICZlaGNpLT5yZWdzLT5zZWdtZW50KTsKICNpZiAwCiAvLyB0aGlzIGlzIGRlZXBseSBicm9rZW4gb24gYWxtb3N0IGFsbCBhcmNoaXRlY3R1cmVzCi0JCWlmICghcGNpX3NldF9kbWFfbWFzayAodG9fcGNpX2RldihoY2QtPnNlbGYuY29udHJvbGxlciksIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpCi0JCQllaGNpX2luZm8gKGVoY2ksICJlbmFibGVkIDY0Yml0IFBDSSBETUFcbiIpOworCQlpZiAoIWRtYV9zZXRfbWFzayAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIERNQV82NEJJVF9NQVNLKSkKKwkJCWVoY2lfaW5mbyAoZWhjaSwgImVuYWJsZWQgNjRiaXQgRE1BXG4iKTsKICNlbmRpZgogCX0KIApAQCAtNjMxLDE3ICs2MzAsNiBAQAogCiAJLyogc2V0IGFzeW5jIHNsZWVwIHRpbWUgPSAxMCB1cyAuLi4gPyAqLwogCi0JLyogd2lyZSB1cCB0aGUgcm9vdCBodWIgKi8KLQlidXMgPSBoY2RfdG9fYnVzIChoY2QpOwotCXVkZXYgPSBmaXJzdCA/IHVzYl9hbGxvY19kZXYgKE5VTEwsIGJ1cywgMCkgOiBidXMtPnJvb3RfaHViOwotCWlmICghdWRldikgewotZG9uZTI6Ci0JCWVoY2lfbWVtX2NsZWFudXAgKGVoY2kpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JdWRldi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKLQl1ZGV2LT5zdGF0ZSA9IGZpcnN0ID8gVVNCX1NUQVRFX0FUVEFDSEVEIDogVVNCX1NUQVRFX0NPTkZJR1VSRUQ7Ci0KIAkvKgogCSAqIFN0YXJ0LCBlbmFibGluZyBmdWxsIFVTQiAyLjAgZnVuY3Rpb25hbGl0eSAuLi4gdXNiIDEuMSBkZXZpY2VzCiAJICogYXJlIGV4cGxpY2l0bHkgaGFuZGVkIHRvIGNvbXBhbmlvbiBjb250cm9sbGVyKHMpLCBzbyBubyBUVCBpcwpAQCAtNjY0LDI0ICs2NTIsNiBAQAogCQlmaXJzdCA/ICJpbml0aWFsaXplZCIgOiAicmVzdGFydGVkIiwKIAkJdGVtcCA+PiA4LCB0ZW1wICYgMHhmZiwgRFJJVkVSX1ZFUlNJT04pOwogCi0JLyoKLQkgKiBGcm9tIGhlcmUgb24sIGtodWJkIGNvbmN1cnJlbnRseSBhY2Nlc3NlcyB0aGUgcm9vdAotCSAqIGh1YjsgZHJpdmVycyB3aWxsIGJlIHRhbGtpbmcgdG8gZW51bWVyYXRlZCBkZXZpY2VzLgotCSAqIChPbiByZXN0YXJ0IHBhdGhzLCBraHViZCBhbHJlYWR5IGtub3dzIGFib3V0IHRoZSByb290Ci0JICogaHViIGFuZCBjb3VsZCBmaW5kIHdvcmsgYXMgc29vbiBhcyB3ZSB3cm90ZSBGTEFHX0NGLikKLQkgKgotCSAqIEJlZm9yZSB0aGlzIHBvaW50IHRoZSBIQyB3YXMgaWRsZS9yZWFkeS4gIEFmdGVyLCBraHViZAotCSAqIGFuZCBkZXZpY2UgZHJpdmVycyBtYXkgc3RhcnQgaXQgcnVubmluZy4KLQkgKi8KLQlpZiAoZmlyc3QgJiYgdXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1YiAodWRldiwgaGNkKSAhPSAwKSB7Ci0JCWlmIChoY2QtPnN0YXRlID09IEhDX1NUQVRFX1JVTk5JTkcpCi0JCQllaGNpX3F1aWVzY2UgKGVoY2kpOwotCQllaGNpX3Jlc2V0IChlaGNpKTsKLQkJdXNiX3B1dF9kZXYgKHVkZXYpOyAKLQkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBkb25lMjsKLQl9Ci0KIAl3cml0ZWwgKElOVFJfTUFTSywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsgLyogVHVybiBPbiBJbnRlcnJ1cHRzICovCiAKIAlpZiAoZmlyc3QpCkBAIC05OTAsNyArOTYwLDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkLAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJc3RydWN0IHVyYgkqdXJiLAotCWludAkJbWVtX2ZsYWdzCisJdW5zaWduZWQJbWVtX2ZsYWdzCiApIHsKIAlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpID0gaGNkX3RvX2VoY2kgKGhjZCk7CiAJc3RydWN0IGxpc3RfaGVhZAlxdGRfbGlzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCBkN2I0Zjc5Li4zNmNjMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIGJ5IERhdmlkIEJyb3duZWxsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBEYXZpZCBCcm93bmVsbAogICogCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCA3ZGY5YjlhLi5kNzRiMmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgYnkgRGF2aWQgQnJvd25lbGwKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IERhdmlkIEJyb3duZWxsCiAgKiAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTg5OCw3ICs4OTgsNyBAQAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJc3RydWN0IHVyYgkJKnVyYiwKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpxdGRfbGlzdCwKLQlpbnQJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzCiApIHsKIAlzdHJ1Y3QgZWhjaV9xdGQJCSpxdGQ7CiAJaW50CQkJZXBudW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IDJmYTFmZmUuLjlhZjRmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC01ODgsNyArNTg4LDcgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAogCXN0cnVjdCB1cmIJCSp1cmIsCiAJc3RydWN0IGxpc3RfaGVhZAkqcXRkX2xpc3QsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKSB7CiAJdW5zaWduZWQJCWVwbnVtOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtNjMzLDEzICs2MzMsMTIgQEAKIC8qIGVoY2lfaXNvX3N0cmVhbSBvcHMgd29yayB3aXRoIGJvdGggSVREIGFuZCBTSVREICovCiAKIHN0YXRpYyBzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtICoKLWlzb19zdHJlYW1fYWxsb2MgKGludCBtZW1fZmxhZ3MpCitpc29fc3RyZWFtX2FsbG9jICh1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbSAqc3RyZWFtOwogCi0Jc3RyZWFtID0ga21hbGxvYyhzaXplb2YgKnN0cmVhbSwgbWVtX2ZsYWdzKTsKKwlzdHJlYW0gPSBrY2FsbG9jKDEsIHNpemVvZiAqc3RyZWFtLCBtZW1fZmxhZ3MpOwogCWlmIChsaWtlbHkgKHN0cmVhbSAhPSBOVUxMKSkgewotCQltZW1zZXQgKHN0cmVhbSwgMCwgc2l6ZW9mKCpzdHJlYW0pKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnN0cmVhbS0+dGRfbGlzdCk7CiAJCUlOSVRfTElTVF9IRUFEKCZzdHJlYW0tPmZyZWVfbGlzdCk7CiAJCXN0cmVhbS0+bmV4dF91ZnJhbWUgPSAtMTsKQEAgLTg0Nyw3ICs4NDYsNyBAQAogLyogZWhjaV9pc29fc2NoZWQgb3BzIGNhbiBiZSBJVEQtb25seSBvciBTSVRELW9ubHkgKi8KIAogc3RhdGljIHN0cnVjdCBlaGNpX2lzb19zY2hlZCAqCi1pc29fc2NoZWRfYWxsb2MgKHVuc2lnbmVkIHBhY2tldHMsIGludCBtZW1fZmxhZ3MpCitpc29fc2NoZWRfYWxsb2MgKHVuc2lnbmVkIHBhY2tldHMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgZWhjaV9pc29fc2NoZWQJKmlzb19zY2hlZDsKIAlpbnQJCQlzaXplID0gc2l6ZW9mICppc29fc2NoZWQ7CkBAIC04OTQsNyArODkzLDcgQEAKIAkJdHJhbnMgfD0gbGVuZ3RoIDw8IDE2OwogCQl1ZnJhbWUtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMzIgKHRyYW5zKTsKIAotCQkvKiBtaWdodCBuZWVkIHRvIGNyb3NzIGEgYnVmZmVyIHBhZ2Ugd2l0aGluIGEgdGQgKi8KKwkJLyogbWlnaHQgbmVlZCB0byBjcm9zcyBhIGJ1ZmZlciBwYWdlIHdpdGhpbiBhIHVmcmFtZSAqLwogCQl1ZnJhbWUtPmJ1ZnAgPSAoYnVmICYgfih1NjQpMHgwZmZmKTsKIAkJYnVmICs9IGxlbmd0aDsKIAkJaWYgKHVubGlrZWx5ICgodWZyYW1lLT5idWZwICE9IChidWYgJiB+KHU2NCkweDBmZmYpKSkpCkBAIC05MjAsNyArOTE5LDcgQEAKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtCSpzdHJlYW0sCiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSwKIAlzdHJ1Y3QgdXJiCQkqdXJiLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkKIHsKIAlzdHJ1Y3QgZWhjaV9pdGQJCSppdGQ7CkBAIC0xMTk0LDYgKzExOTMsNyBAQAogewogCWludCBpOwogCisJLyogaXQncyBiZWVuIHJlY2VudGx5IHplcm9lZCAqLwogCWl0ZC0+aHdfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CiAJaXRkLT5od19idWZwIFswXSA9IHN0cmVhbS0+YnVmMDsKIAlpdGQtPmh3X2J1ZnAgWzFdID0gc3RyZWFtLT5idWYxOwpAQCAtMTIxMCw4ICsxMjEwLDcgQEAKIAlzdHJ1Y3QgZWhjaV9pdGQJCSppdGQsCiAJc3RydWN0IGVoY2lfaXNvX3NjaGVkCSppc29fc2NoZWQsCiAJdW5zaWduZWQJCWluZGV4LAotCXUxNgkJCXVmcmFtZSwKLQlpbnQJCQlmaXJzdAorCXUxNgkJCXVmcmFtZQogKQogewogCXN0cnVjdCBlaGNpX2lzb19wYWNrZXQJKnVmID0gJmlzb19zY2hlZC0+cGFja2V0IFtpbmRleF07CkBAIC0xMjI4LDcgKzEyMjcsNyBAQAogCWl0ZC0+aHdfYnVmcF9oaSBbcGddIHw9IGNwdV90b19sZTMyICgodTMyKSh1Zi0+YnVmcCA+PiAzMikpOwogCiAJLyogaXNvX2ZyYW1lX2Rlc2NbXS5vZmZzZXQgbXVzdCBiZSBzdHJpY3RseSBpbmNyZWFzaW5nICovCi0JaWYgKHVubGlrZWx5ICghZmlyc3QgJiYgdWYtPmNyb3NzKSkgeworCWlmICh1bmxpa2VseSAodWYtPmNyb3NzKSkgewogCQl1NjQJYnVmcCA9IHVmLT5idWZwICsgNDA5NjsKIAkJaXRkLT5wZyA9ICsrcGc7CiAJCWl0ZC0+aHdfYnVmcCBbcGddIHw9IGNwdV90b19sZTMyIChidWZwICYgfih1MzIpMCk7CkBAIC0xMjU3LDcgKzEyNTYsNyBAQAogCXN0cnVjdCBlaGNpX2lzb19zdHJlYW0JKnN0cmVhbQogKQogewotCWludAkJCXBhY2tldCwgZmlyc3QgPSAxOworCWludAkJCXBhY2tldDsKIAl1bnNpZ25lZAkJbmV4dF91ZnJhbWUsIHVmcmFtZSwgZnJhbWU7CiAJc3RydWN0IGVoY2lfaXNvX3NjaGVkCSppc29fc2NoZWQgPSB1cmItPmhjcHJpdjsKIAlzdHJ1Y3QgZWhjaV9pdGQJCSppdGQ7CkBAIC0xMjkwLDcgKzEyODksNiBAQAogCQkJbGlzdF9tb3ZlX3RhaWwgKCZpdGQtPml0ZF9saXN0LCAmc3RyZWFtLT50ZF9saXN0KTsKIAkJCWl0ZC0+c3RyZWFtID0gaXNvX3N0cmVhbV9nZXQgKHN0cmVhbSk7CiAJCQlpdGQtPnVyYiA9IHVzYl9nZXRfdXJiICh1cmIpOwotCQkJZmlyc3QgPSAxOwogCQkJaXRkX2luaXQgKHN0cmVhbSwgaXRkKTsKIAkJfQogCkBAIC0xMjk4LDggKzEyOTYsNyBAQAogCQlmcmFtZSA9IG5leHRfdWZyYW1lID4+IDM7CiAKIAkJaXRkLT51c2VjcyBbdWZyYW1lXSA9IHN0cmVhbS0+dXNlY3M7Ci0JCWl0ZF9wYXRjaCAoaXRkLCBpc29fc2NoZWQsIHBhY2tldCwgdWZyYW1lLCBmaXJzdCk7Ci0JCWZpcnN0ID0gMDsKKwkJaXRkX3BhdGNoIChpdGQsIGlzb19zY2hlZCwgcGFja2V0LCB1ZnJhbWUpOwogCiAJCW5leHRfdWZyYW1lICs9IHN0cmVhbS0+aW50ZXJ2YWw7CiAJCXN0cmVhbS0+ZGVwdGggKz0gc3RyZWFtLT5pbnRlcnZhbDsKQEAgLTE0MTUsNyArMTQxMiw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbnQgaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzdGF0aWMgaW50IGl0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLAorCXVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQJCQlzdGF0dXMgPSAtRUlOVkFMOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtMTUyNiw3ICsxNTI0LDcgQEAKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtCSpzdHJlYW0sCiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSwKIAlzdHJ1Y3QgdXJiCQkqdXJiLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkKIHsKIAlzdHJ1Y3QgZWhjaV9zaXRkCSpzaXRkOwpAQCAtMTc3NSw3ICsxNzczLDggQEAKIH0KIAogCi1zdGF0aWMgaW50IHNpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKK3N0YXRpYyBpbnQgc2l0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLAorCXVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQJCQlzdGF0dXMgPSAtRUlOVkFMOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtMTgyNSw3ICsxODI0LDggQEAKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1zaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsCisJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWVoY2lfZGJnIChlaGNpLCAic3BsaXQgaXNvIHN1cHBvcnQgaXMgZGlzYWJsZWRcbiIpOwogCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwppbmRleCBkOTg4M2Q3Li44MWY4ZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwpAQCAtNDYzLDcgKzQ2Myw4IEBACiAKIHN0YXRpYyBpbnQgZXRyYXhfcmVtb3ZlX2Zyb21fc2JfbGlzdChzdHJ1Y3QgdXJiICp1cmIpOwogCi1zdGF0aWMgdm9pZCogZXRyYXhfdXNiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgdXNiX2J1cyogYnVzLCBzaXplX3Qgc2l6ZSwgaW50IG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKK3N0YXRpYyB2b2lkKiBldHJheF91c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfYnVzKiBidXMsIHNpemVfdCBzaXplLAorCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKIHN0YXRpYyB2b2lkIGV0cmF4X3VzYl9idWZmZXJfZnJlZShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwgdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBkbWEpOwogCiBzdGF0aWMgdm9pZCBldHJheF91c2JfYWRkX3RvX2J1bGtfc2JfbGlzdChzdHJ1Y3QgdXJiICp1cmIsIGludCBlcGlkKTsKQEAgLTQ3Niw3ICs0NzcsNyBAQAogc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X2ludHJfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfaXNvY191cmIoc3RydWN0IHVyYiAqdXJiKTsKIAotc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpOworc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncyk7CiBzdGF0aWMgaW50IGV0cmF4X3VzYl91bmxpbmtfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cyk7CiBzdGF0aWMgaW50IGV0cmF4X3VzYl9nZXRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KTsKIApAQCAtMTI2Miw3ICsxMjYzLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlldHJheF9oY190ICpoYzsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKQEAgLTQyNzcsNyArNDI3OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkKgotZXRyYXhfdXNiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgdXNiX2J1cyogYnVzLCBzaXplX3Qgc2l6ZSwgaW50IG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKQorZXRyYXhfdXNiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgdXNiX2J1cyogYnVzLCBzaXplX3Qgc2l6ZSwKKwl1bnNpZ25lZCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSkKIHsKICAgcmV0dXJuIGttYWxsb2Moc2l6ZSwgbWVtX2ZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIxOTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCkBAIC0wLDAgKzEsMTg3MSBAQAorLyoKKyAqIElTUDExNnggSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgU0w4MTEgSENELCByZXdyaXR0ZW4gZm9yIElTUDExNnguCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgT2xhdiBLb25nYXMgPG9rQGFydGVjZGVzaWduLmVlPgorICoKKyAqIFBvcnRpb25zOgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBzaW9uIFRla2xvZ2l4IChmb3IgTmV0Qm9vayBQUk8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBQZXJpb2RpYyBzY2hlZHVsaW5nIGlzIGJhc2VkIG9uIFJvbWFuJ3MgT0hDSSBjb2RlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyCisgKgorICovCisKKy8qCisgKiBUaGUgZHJpdmVyIGJhc2ljYWxseSB3b3Jrcy4gQSBudW1iZXIgb2YgcGVvcGxlIGhhdmUgdXNlZCBpdCB3aXRoIGEgcmFuZ2UKKyAqIG9mIGRldmljZXMuCisgKgorICogVGhlIGRyaXZlciBwYXNzZXMgYWxsIHVzYnRlc3RzIDEtMTQuCisgKgorICogU3VzcGVuZGluZy9yZXN1bWluZyBvZiByb290IGh1YiB2aWEgc3lzZnMgd29ya3MuIFJlbW90ZSB3YWtldXAgd29ya3MgdG9vLgorICogQW5kIHN1c3BlbmRpbmcvcmVzdW1pbmcgb2YgcGxhdGZvcm0gZGV2aWNlIHdvcmtzIHRvby4gU3VzcGVuZC9yZXN1bWUKKyAqIHZpYSBIQ0Qgb3BlcmF0aW9ucyB2ZWN0b3IgaXMgbm90IGltcGxlbWVudGVkLgorICoKKyAqIElzbyB0cmFuc2ZlciBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZC4gQWRkaW5nIHRoaXMgd291bGQgaW5jbHVkZQorICogaW1wbGVtZW50aW5nIHJlY292ZXJ5IGZyb20gdGhlIGZhaWx1cmUgdG8gc2VydmljZSB0aGUgcHJvY2Vzc2VkIElUTAorICogZmlmbyByYW0gaW4gdGltZSwgd2hpY2ggd2lsbCBpbnZvbHZlIGNoaXAgcmVzZXQuCisgKgorICogVE9ETzoKKyArIE1vcmUgdGVzdGluZyBvZiBzdXNwZW5kL3Jlc3VtZS4KKyovCisKKy8qCisgIElTUDExNnggY2hpcHMgcmVxdWlyZSBjZXJ0YWluIGRlbGF5cyBiZXR3ZWVuIGFjY2Vzc2VzIHRvIGl0cworICByZWdpc3RlcnMuIFRoZSBmb2xsb3dpbmcgdGltaW5nIG9wdGlvbnMgZXhpc3QuCisKKyAgMS4gQ29uZmlndXJlIHlvdXIgbWVtb3J5IGNvbnRyb2xsZXIgKHRoZSBiZXN0KQorICAyLiBJbXBsZW1lbnQgcGxhdGZvcm0tc3BlY2lmaWMgZGVsYXkgZnVuY3Rpb24gcG9zc2libHkKKyAgY29tYmluZWQgd2l0aCBjb25maWd1cmluZyB0aGUgbWVtb3J5IGNvbnRyb2xsZXI7IHNlZQorICBpbmNsdWRlL2xpbnV4L3VzYi1pc3AxMTZ4LmggZm9yIG1vcmUgaW5mby4gU29tZSBicm9rZW4KKyAgbWVtb3J5IGNvbnRyb2xsZXJzIGxpbmUgTEg3QTQwMCBTTUMgbmVlZCB0aGlzLiBBbHNvLAorICB1bmNvbW1lbnQgZm9yIHRoYXQgdG8gd29yayB0aGUgZm9sbG93aW5nCisgIFVTRV9QTEFURk9STV9ERUxBWSBtYWNyby4KKyAgMy4gVXNlIG5kZWxheSAoZWFzaWVzdCwgcG9vcmVzdCkuIEZvciB0aGF0LCB1bmNvbW1lbnQKKyAgdGhlIGZvbGxvd2luZyBVU0VfTkRFTEFZIG1hY3JvLgorKi8KKyNkZWZpbmUgVVNFX1BMQVRGT1JNX0RFTEFZCisvLyNkZWZpbmUgVVNFX05ERUxBWQorCisvLyNkZWZpbmUgREVCVUcKKy8vI2RlZmluZSBWRVJCT1NFCisvKiBUcmFuc2ZlciBkZXNjcmlwdG9ycy4gU2VlIGR1bXBfcHRkKCkgZm9yIHByaW50b3V0IGZvcm1hdCAgKi8KKy8vI2RlZmluZSBQVERfVFJBQ0UKKy8qIGVucXVldWluZy9maW5pc2hpbmcgbG9nIG9mIHVyYnMgKi8KKy8vI2RlZmluZSBVUkJfVFJBQ0UKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfaXNwMTE2eC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZm5kZWYgREVCVUcKKyMJZGVmaW5lCVNUVUJfREVCVUdfRklMRQorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgorI2luY2x1ZGUgImlzcDExNnguaCIKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMDggQXByIDIwMDUiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJJU1AxMTZ4IFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVyIgorCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gImlzcDExNngtaGNkIjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgIFdyaXRlIGxlbiBieXRlcyB0byBmaWZvLCBwYWQgdGlsbCAzMi1iaXQgYm91bmRhcnkKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcHRkZGF0YV90b19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9ICpkcCsrOworCQkJdyB8PSAqZHArKyA8PCA4OworCQkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIHcpOworCQl9CisJCWlmIChsZW4pCisJCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAodTE2KSAqIGRwKTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCWlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAqZHAyKyspOworCQlpZiAobGVuKQorCQkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgMHhmZiAmICooKHU4ICopIGRwMikpOworCX0KKwlpZiAocXVvdCA9PSAxIHx8IHF1b3QgPT0gMikKKwkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIDApOworfQorCisvKgorICBSZWFkIGxlbiBieXRlcyBmcm9tIGZpZm8gYW5kIHRoZW4gcmVhZCB0aWxsIDMyLWJpdCBib3VuZGFyeS4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9wdGRkYXRhX2Zyb21fZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXU4ICpkcCA9ICh1OCAqKSBidWY7CisJdTE2ICpkcDIgPSAodTE2ICopIGJ1ZjsKKwl1MTYgdzsKKwlpbnQgcXVvdCA9IGxlbiAlIDQ7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpZHAyICYgMSkgeworCQkvKiBub3QgYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpIHsKKwkJCXcgPSBpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJCSpkcCsrID0gdyAmIDB4ZmY7CisJCQkqZHArKyA9ICh3ID4+IDgpICYgMHhmZjsKKwkJfQorCQlpZiAobGVuKQorCQkJKmRwID0gMHhmZiAmIGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJfSBlbHNlIHsKKwkJLyogYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpCisJCQkqZHAyKysgPSBpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJaWYgKGxlbikKKwkJCSoodTggKikgZHAyID0gMHhmZiAmIGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJfQorCWlmIChxdW90ID09IDEgfHwgcXVvdCA9PSAyKQorCQlpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKK30KKworLyoKKyAgV3JpdGUgcHRkJ3MgYW5kIGRhdGEgZm9yIHNjaGVkdWxlZCB0cmFuc2ZlcnMgaW50bworICB0aGUgZmlmbyByYW0uIEZpZm8gbXVzdCBiZSBlbXB0eSBhbmQgcmVhZHkuCisqLworc3RhdGljIHZvaWQgcGFja19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgcHRkICpwdGQ7CisJaW50IGJ1ZmxlbiA9IGlzcDExNngtPmF0bF9sYXN0X2RpciA9PSBQVERfRElSX0lOCisJICAgID8gaXNwMTE2eC0+YXRsX2J1ZnNocnQgOiBpc3AxMTZ4LT5hdGxfYnVmbGVuOworCWludCBwdGRfY291bnQgPSAwOworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCBIQ3VQSU5UX0FJSUVPVCk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ1hGRVJDVFIsIGJ1Zmxlbik7CisJaXNwMTE2eF93cml0ZV9hZGRyKGlzcDExNngsIEhDQVRMUE9SVCB8IElTUDExNnhfV1JJVEVfT0ZGU0VUKTsKKwlmb3IgKGVwID0gaXNwMTE2eC0+YXRsX2FjdGl2ZTsgZXA7IGVwID0gZXAtPmFjdGl2ZSkgeworCQkrK3B0ZF9jb3VudDsKKwkJcHRkID0gJmVwLT5wdGQ7CisJCWR1bXBfcHRkKHB0ZCk7CisJCWR1bXBfcHRkX291dF9kYXRhKHB0ZCwgZXAtPmRhdGEpOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGQtPmNvdW50KTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkLT5tcHMpOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGQtPmxlbik7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZC0+ZmFkZHIpOworCQlidWZsZW4gLT0gc2l6ZW9mKHN0cnVjdCBwdGQpOworCQkvKiBTa2lwIHdyaXRpbmcgZGF0YSBmb3IgbGFzdCBJTiBQVEQgKi8KKwkJaWYgKGVwLT5hY3RpdmUgfHwgKGlzcDExNngtPmF0bF9sYXN0X2RpciAhPSBQVERfRElSX0lOKSkgeworCQkJd3JpdGVfcHRkZGF0YV90b19maWZvKGlzcDExNngsIGVwLT5kYXRhLCBlcC0+bGVuZ3RoKTsKKwkJCWJ1ZmxlbiAtPSBBTElHTihlcC0+bGVuZ3RoLCA0KTsKKwkJfQorCX0KKwlCVUdfT04oYnVmbGVuKTsKK30KKworLyoKKyAgUmVhZCB0aGUgcHJvY2Vzc2VkIHB0ZCdzIGFuZCBkYXRhIGZyb20gZmlmbyByYW0gYmFjayB0bworICBVUkJzJyBidWZmZXJzLiBGaWZvIG11c3QgYmUgZnVsbCBhbmQgZG9uZQorKi8KK3N0YXRpYyB2b2lkIHVucGFja19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgcHRkICpwdGQ7CisJaW50IGJ1ZmxlbiA9IGlzcDExNngtPmF0bF9sYXN0X2RpciA9PSBQVERfRElSX0lOCisJICAgID8gaXNwMTE2eC0+YXRsX2J1ZmxlbiA6IGlzcDExNngtPmF0bF9idWZzaHJ0OworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCBIQ3VQSU5UX0FJSUVPVCk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ1hGRVJDVFIsIGJ1Zmxlbik7CisJaXNwMTE2eF93cml0ZV9hZGRyKGlzcDExNngsIEhDQVRMUE9SVCk7CisJZm9yIChlcCA9IGlzcDExNngtPmF0bF9hY3RpdmU7IGVwOyBlcCA9IGVwLT5hY3RpdmUpIHsKKwkJcHRkID0gJmVwLT5wdGQ7CisJCXB0ZC0+Y291bnQgPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlwdGQtPm1wcyA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCXB0ZC0+bGVuID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJcHRkLT5mYWRkciA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCWJ1ZmxlbiAtPSBzaXplb2Yoc3RydWN0IHB0ZCk7CisJCS8qIFNraXAgcmVhZGluZyBkYXRhIGZvciBsYXN0IFNldHVwIG9yIE91dCBQVEQgKi8KKwkJaWYgKGVwLT5hY3RpdmUgfHwgKGlzcDExNngtPmF0bF9sYXN0X2RpciA9PSBQVERfRElSX0lOKSkgeworCQkJcmVhZF9wdGRkYXRhX2Zyb21fZmlmbyhpc3AxMTZ4LCBlcC0+ZGF0YSwgZXAtPmxlbmd0aCk7CisJCQlidWZsZW4gLT0gQUxJR04oZXAtPmxlbmd0aCwgNCk7CisJCX0KKwkJZHVtcF9wdGQocHRkKTsKKwkJZHVtcF9wdGRfaW5fZGF0YShwdGQsIGVwLT5kYXRhKTsKKwl9CisJQlVHX09OKGJ1Zmxlbik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAgU2V0IHVwIFBURCdzLgorKi8KK3N0YXRpYyB2b2lkIHByZXByb2NfYXRsX3F1ZXVlKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IHB0ZCAqcHRkOworCXUxNiB0b2dnbGUgPSAwLCBkaXIgPSBQVERfRElSX1NFVFVQLCBsZW47CisKKwlmb3IgKGVwID0gaXNwMTE2eC0+YXRsX2FjdGl2ZTsgZXA7IGVwID0gZXAtPmFjdGl2ZSkgeworCQlCVUdfT04obGlzdF9lbXB0eSgmZXAtPmhlcC0+dXJiX2xpc3QpKTsKKwkJdXJiID0gY29udGFpbmVyX29mKGVwLT5oZXAtPnVyYl9saXN0Lm5leHQsCisJCQkJICAgc3RydWN0IHVyYiwgdXJiX2xpc3QpOworCQlwdGQgPSAmZXAtPnB0ZDsKKwkJbGVuID0gZXAtPmxlbmd0aDsKKwkJc3Bpbl9sb2NrKCZ1cmItPmxvY2spOworCQllcC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIKKwkJICAgICsgdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJCXN3aXRjaCAoZXAtPm5leHRwaWQpIHsKKwkJY2FzZSBVU0JfUElEX0lOOgorCQkJdG9nZ2xlID0gdXNiX2dldHRvZ2dsZSh1cmItPmRldiwgZXAtPmVwbnVtLCAwKTsKKwkJCWRpciA9IFBURF9ESVJfSU47CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUElEX09VVDoKKwkJCXRvZ2dsZSA9IHVzYl9nZXR0b2dnbGUodXJiLT5kZXYsIGVwLT5lcG51bSwgMSk7CisJCQlkaXIgPSBQVERfRElSX09VVDsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfU0VUVVA6CisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJCQllcC0+ZGF0YSA9IHVyYi0+c2V0dXBfcGFja2V0OworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9BQ0s6CisJCQl0b2dnbGUgPSAxOworCQkJbGVuID0gMDsKKwkJCWRpciA9ICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgKKwkJCSAgICAgICAmJiB1c2JfcGlwZWluKHVyYi0+cGlwZSkpCisJCQkgICAgPyBQVERfRElSX09VVCA6IFBURF9ESVJfSU47CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUVSUigiJXMgJWQ6IGVwLT5uZXh0cGlkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkgICAgZXAtPm5leHRwaWQpOworCQkJQlVHKCk7CisJCX0KKworCQlwdGQtPmNvdW50ID0gUFREX0NDX01TSyB8IFBURF9BQ1RJVkVfTVNLIHwgUFREX1RPR0dMRSh0b2dnbGUpOworCQlwdGQtPm1wcyA9IFBURF9NUFMoZXAtPm1heHBhY2tldCkKKwkJICAgIHwgUFREX1NQRCh1cmItPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0xPVykKKwkJICAgIHwgUFREX0VQKGVwLT5lcG51bSk7CisJCXB0ZC0+bGVuID0gUFREX0xFTihsZW4pIHwgUFREX0RJUihkaXIpOworCQlwdGQtPmZhZGRyID0gUFREX0ZBKHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSkpOworCQlzcGluX3VubG9jaygmdXJiLT5sb2NrKTsKKwkJaWYgKCFlcC0+YWN0aXZlKSB7CisJCQlwdGQtPm1wcyB8PSBQVERfTEFTVF9NU0s7CisJCQlpc3AxMTZ4LT5hdGxfbGFzdF9kaXIgPSBkaXI7CisJCX0KKwkJaXNwMTE2eC0+YXRsX2J1ZnNocnQgPSBzaXplb2Yoc3RydWN0IHB0ZCkgKyBpc3AxMTZ4LT5hdGxfYnVmbGVuOworCQlpc3AxMTZ4LT5hdGxfYnVmbGVuID0gaXNwMTE2eC0+YXRsX2J1ZnNocnQgKyBBTElHTihsZW4sIDQpOworCX0KK30KKworLyoKKyAgQW5hbHl6ZSB0cmFuc2ZlciByZXN1bHRzLCBoYW5kbGUgcGFydGlhbCB0cmFuc2ZlcnMgYW5kIGVycm9ycworKi8KK3N0YXRpYyB2b2lkIHBvc3Rwcm9jX2F0bF9xdWV1ZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqZXA7CisJc3RydWN0IHVyYiAqdXJiOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCBwdGQgKnB0ZDsKKwlpbnQgc2hvcnRfbm90X29rOworCXU4IGNjOworCisJZm9yIChlcCA9IGlzcDExNngtPmF0bF9hY3RpdmU7IGVwOyBlcCA9IGVwLT5hY3RpdmUpIHsKKwkJQlVHX09OKGxpc3RfZW1wdHkoJmVwLT5oZXAtPnVyYl9saXN0KSk7CisJCXVyYiA9CisJCSAgICBjb250YWluZXJfb2YoZXAtPmhlcC0+dXJiX2xpc3QubmV4dCwgc3RydWN0IHVyYiwgdXJiX2xpc3QpOworCQl1ZGV2ID0gdXJiLT5kZXY7CisJCXB0ZCA9ICZlcC0+cHRkOworCQljYyA9IFBURF9HRVRfQ0MocHRkKTsKKworCQlzcGluX2xvY2soJnVyYi0+bG9jayk7CisJCXNob3J0X25vdF9vayA9IDE7CisKKwkJLyogRGF0YSB1bmRlcnJ1biBpcyBzcGVjaWFsLiBGb3IgYWxsb3dlZCB1bmRlcnJ1bgorCQkgICB3ZSBjbGVhciB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlIGFzIG5vcm1hbC4gRm9yCisJCSAgIGZvcmJpZGRlbiB1bmRlcnJ1biB3ZSBmaW5pc2ggdGhlIERBVEEgc3RhZ2UKKwkJICAgaW1tZWRpYXRlbHkgd2hpbGUgZm9yIGNvbnRyb2wgdHJhbnNmZXIsCisJCSAgIHdlIGRvIGEgU1RBVFVTIHN0YWdlLiAqLworCQlpZiAoY2MgPT0gVERfREFUQVVOREVSUlVOKSB7CisJCQlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykpIHsKKwkJCQlEQkcoIkFsbG93ZWQgZGF0YSB1bmRlcnJ1blxuIik7CisJCQkJY2MgPSBURF9DQ19OT0VSUk9SOworCQkJCXNob3J0X25vdF9vayA9IDA7CisJCQl9IGVsc2UgeworCQkJCWVwLT5lcnJvcl9jb3VudCA9IDE7CisJCQkJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKQorCQkJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfQUNLOworCQkJCWVsc2UKKwkJCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LCBlcC0+ZXBudW0sCisJCQkJCQkgICAgICBlcC0+bmV4dHBpZCA9PQorCQkJCQkJICAgICAgVVNCX1BJRF9PVVQsCisJCQkJCQkgICAgICBQVERfR0VUX1RPR0dMRShwdGQpIF4gMSk7CisJCQkJdXJiLT5zdGF0dXMgPSBjY190b19lcnJvcltURF9EQVRBVU5ERVJSVU5dOworCQkJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCS8qIEtlZXAgdW5kZXJydW4gZXJyb3IgdGhyb3VnaCB0aGUgU1RBVFVTIHN0YWdlICovCisJCWlmICh1cmItPnN0YXR1cyA9PSBjY190b19lcnJvcltURF9EQVRBVU5ERVJSVU5dKQorCQkJY2MgPSBURF9EQVRBVU5ERVJSVU47CisKKwkJaWYgKGNjICE9IFREX0NDX05PRVJST1IgJiYgY2MgIT0gVERfTk9UQUNDRVNTRUQKKwkJICAgICYmICgrK2VwLT5lcnJvcl9jb3VudCA+PSAzIHx8IGNjID09IFREX0NDX1NUQUxMCisJCQl8fCBjYyA9PSBURF9EQVRBT1ZFUlJVTikpIHsKKwkJCWlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCQkJdXJiLT5zdGF0dXMgPSBjY190b19lcnJvcltjY107CisJCQlpZiAoZXAtPm5leHRwaWQgPT0gVVNCX1BJRF9BQ0spCisJCQkJZXAtPm5leHRwaWQgPSAwOworCQkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBBY2NvcmRpbmcgdG8gdXNiIHNwZWMsIHplcm8tbGVuZ3RoIEludCB0cmFuc2ZlciBzaWduYWxzCisJCSAgIGZpbmlzaGluZyBvZiB0aGUgdXJiLiBIZXksIGRvZXMgdGhpcyBhcHBseSBvbmx5CisJCSAgIGZvciBJTiBlbmRwb2ludHM/ICovCisJCWlmICh1c2JfcGlwZWludCh1cmItPnBpcGUpICYmICFQVERfR0VUX0xFTihwdGQpKSB7CisJCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSZWxheCBhZnRlciBwcmV2aW91c2x5IGZhaWxlZCwgYnV0IGxhdGVyIHN1Y2NlZWRlZAorCQkgICBvciBjb3JyZWN0bHkgTkFLJ2VkIHJldHJhbnNtaXNzaW9uIGF0dGVtcHQgKi8KKwkJaWYgKGVwLT5lcnJvcl9jb3VudAorCQkgICAgJiYgKGNjID09IFREX0NDX05PRVJST1IgfHwgY2MgPT0gVERfTk9UQUNDRVNTRUQpKQorCQkJZXAtPmVycm9yX2NvdW50ID0gMDsKKworCQkvKiBUYWtlIGludG8gYWNjb3VudCBpZGlvc3luY3JhY2llcyBvZiB0aGUgaXNwMTE2eCBjaGlwCisJCSAgIHJlZ2FyZGluZyB0b2dnbGUgYml0IGZvciBmYWlsZWQgdHJhbnNmZXJzICovCisJCWlmIChlcC0+bmV4dHBpZCA9PSBVU0JfUElEX09VVCkKKwkJCXVzYl9zZXR0b2dnbGUodWRldiwgZXAtPmVwbnVtLCAxLCBQVERfR0VUX1RPR0dMRShwdGQpCisJCQkJICAgICAgXiAoZXAtPmVycm9yX2NvdW50ID4gMCkpOworCQllbHNlIGlmIChlcC0+bmV4dHBpZCA9PSBVU0JfUElEX0lOKQorCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LCBlcC0+ZXBudW0sIDAsIFBURF9HRVRfVE9HR0xFKHB0ZCkKKwkJCQkgICAgICBeIChlcC0+ZXJyb3JfY291bnQgPiAwKSk7CisKKwkJc3dpdGNoIChlcC0+bmV4dHBpZCkgeworCQljYXNlIFVTQl9QSURfSU46CisJCWNhc2UgVVNCX1BJRF9PVVQ6CisJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gUFREX0dFVF9DT1VOVChwdGQpOworCQkJaWYgKFBURF9HRVRfQUNUSVZFKHB0ZCkKKwkJCSAgICB8fCAoY2MgIT0gVERfQ0NfTk9FUlJPUiAmJiBjYyA8IDB4MEUpKQorCQkJCWJyZWFrOworCQkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAhPSB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCQlpZiAoc2hvcnRfbm90X29rKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfWkVST19QQUNLRVQKKwkJCQkgICAgJiYgZXAtPm5leHRwaWQgPT0gVVNCX1BJRF9PVVQKKwkJCQkgICAgJiYgIShQVERfR0VUX0NPVU5UKHB0ZCkgJSBlcC0+bWF4cGFja2V0KSkgeworCQkJCQlEQkcoIlplcm8gcGFja2V0IHJlcXVlc3RlZFxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIEFsbCBkYXRhIGZvciB0aGlzIFVSQiBpcyB0cmFuc2ZlcnJlZCwgbGV0J3MgZmluaXNoICovCisJCQlpZiAodXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkpCisJCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX0FDSzsKKwkJCWVsc2UgaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJCQl1cmItPnN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUElEX1NFVFVQOgorCQkJaWYgKFBURF9HRVRfQUNUSVZFKHB0ZCkKKwkJCSAgICB8fCAoY2MgIT0gVERfQ0NfTk9FUlJPUiAmJiBjYyA8IDB4MEUpKQorCQkJCWJyZWFrOworCQkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9PSB1cmItPmFjdHVhbF9sZW5ndGgpCisJCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX0FDSzsKKwkJCWVsc2UgaWYgKHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpIHsKKwkJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYsIDAsIDEsIDEpOworCQkJCWVwLT5uZXh0cGlkID0gVVNCX1BJRF9PVVQ7CisJCQl9IGVsc2UgeworCQkJCXVzYl9zZXR0b2dnbGUodWRldiwgMCwgMCwgMSk7CisJCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX0lOOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9BQ0s6CisJCQlpZiAoUFREX0dFVF9BQ1RJVkUocHRkKQorCQkJICAgIHx8IChjYyAhPSBURF9DQ19OT0VSUk9SICYmIGNjIDwgMHgwRSkpCisJCQkJYnJlYWs7CisJCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCWVwLT5uZXh0cGlkID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHX09OKDEpOworCQl9CisJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCX0KK30KKworLyoKKyAgVGFrZSBkb25lIG9yIGZhaWxlZCByZXF1ZXN0cyBvdXQgb2Ygc2NoZWR1bGUuIEdpdmUgYmFjaworICBwcm9jZXNzZWQgdXJicy4KKyovCitzdGF0aWMgdm9pZCBmaW5pc2hfcmVxdWVzdChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgc3RydWN0IGlzcDExNnhfZXAgKmVwLAorCQkJICAgc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK19fcmVsZWFzZXMoaXNwMTE2eC0+bG9jaykgX19hY3F1aXJlcyhpc3AxMTZ4LT5sb2NrKQoreworCXVuc2lnbmVkIGk7CisKKwl1cmItPmhjcHJpdiA9IE5VTEw7CisJZXAtPmVycm9yX2NvdW50ID0gMDsKKworCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkKKwkJZXAtPm5leHRwaWQgPSBVU0JfUElEX1NFVFVQOworCisJdXJiX2RiZyh1cmIsICJGaW5pc2giKTsKKworCXNwaW5fdW5sb2NrKCZpc3AxMTZ4LT5sb2NrKTsKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihpc3AxMTZ4X3RvX2hjZChpc3AxMTZ4KSwgdXJiLCByZWdzKTsKKwlzcGluX2xvY2soJmlzcDExNngtPmxvY2spOworCisJLyogdGFrZSBpZGxlIGVuZHBvaW50cyBvdXQgb2YgdGhlIHNjaGVkdWxlICovCisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+aGVwLT51cmJfbGlzdCkpCisJCXJldHVybjsKKworCS8qIGFzeW5jIGRlc2NoZWR1bGUgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5zY2hlZHVsZSkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmZXAtPnNjaGVkdWxlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHBlcmlvZGljIGRlc2NoZWR1bGUgKi8KKwlEQkcoImRlc2NoZWR1bGUgcWglZC8lcCBicmFuY2ggJWRcbiIsIGVwLT5wZXJpb2QsIGVwLCBlcC0+YnJhbmNoKTsKKwlmb3IgKGkgPSBlcC0+YnJhbmNoOyBpIDwgUEVSSU9ESUNfU0laRTsgaSArPSBlcC0+cGVyaW9kKSB7CisJCXN0cnVjdCBpc3AxMTZ4X2VwICp0ZW1wOworCQlzdHJ1Y3QgaXNwMTE2eF9lcCAqKnByZXYgPSAmaXNwMTE2eC0+cGVyaW9kaWNbaV07CisKKwkJd2hpbGUgKCpwcmV2ICYmICgodGVtcCA9ICpwcmV2KSAhPSBlcCkpCisJCQlwcmV2ID0gJnRlbXAtPm5leHQ7CisJCWlmICgqcHJldikKKwkJCSpwcmV2ID0gZXAtPm5leHQ7CisJCWlzcDExNngtPmxvYWRbaV0gLT0gZXAtPmxvYWQ7CisJfQorCWVwLT5icmFuY2ggPSBQRVJJT0RJQ19TSVpFOworCWlzcDExNnhfdG9faGNkKGlzcDExNngpLT5zZWxmLmJhbmR3aWR0aF9hbGxvY2F0ZWQgLT0KKwkgICAgZXAtPmxvYWQgLyBlcC0+cGVyaW9kOworCisJLyogc3dpdGNoIGlycSB0eXBlPyAqLworCWlmICghLS1pc3AxMTZ4LT5wZXJpb2RpY19jb3VudCkgeworCQlpc3AxMTZ4LT5pcnFlbmIgJj0gfkhDdVBJTlRfU09GOworCQlpc3AxMTZ4LT5pcnFlbmIgfD0gSEN1UElOVF9BVEw7CisJfQorfQorCisvKgorICBTY2FuIHRyYW5zZmVyIGxpc3RzLCBzY2hlZHVsZSB0cmFuc2ZlcnMsIHNlbmQgZGF0YSBvZmYKKyAgdG8gY2hpcC4KKyAqLworc3RhdGljIHZvaWQgc3RhcnRfYXRsX3RyYW5zZmVycyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqbGFzdF9lcCA9IE5VTEwsICplcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdTE2IGxvYWQgPSAwOworCWludCBsZW4sIGluZGV4LCBzcGVlZCwgYnl0ZV90aW1lOworCisJaWYgKGF0b21pY19yZWFkKCZpc3AxMTZ4LT5hdGxfZmluaXNoaW5nKSkKKwkJcmV0dXJuOworCisJaWYgKCFIQ19JU19SVU5OSU5HKGlzcDExNnhfdG9faGNkKGlzcDExNngpLT5zdGF0ZSkpCisJCXJldHVybjsKKworCS8qIEZJRk8gbm90IGVtcHR5PyAqLworCWlmIChpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSENCVUZTVEFUKSAmIEhDQlVGU1RBVF9BVExfRlVMTCkKKwkJcmV0dXJuOworCisJaXNwMTE2eC0+YXRsX2FjdGl2ZSA9IE5VTEw7CisJaXNwMTE2eC0+YXRsX2J1ZmxlbiA9IGlzcDExNngtPmF0bF9idWZzaHJ0ID0gMDsKKworCS8qIFNjaGVkdWxlIGludCB0cmFuc2ZlcnMgKi8KKwlpZiAoaXNwMTE2eC0+cGVyaW9kaWNfY291bnQpIHsKKwkJaXNwMTE2eC0+Zm1pbmRleCA9IGluZGV4ID0KKwkJICAgIChpc3AxMTZ4LT5mbWluZGV4ICsgMSkgJiAoUEVSSU9ESUNfU0laRSAtIDEpOworCQlpZiAoKGxvYWQgPSBpc3AxMTZ4LT5sb2FkW2luZGV4XSkpIHsKKwkJCS8qIEJyaW5nIGFsbCBpbnQgdHJhbnNmZXJzIGZvciB0aGlzIGZyYW1lCisJCQkgICBpbnRvIHRoZSBhY3RpdmUgcXVldWUgKi8KKwkJCWlzcDExNngtPmF0bF9hY3RpdmUgPSBsYXN0X2VwID0KKwkJCSAgICBpc3AxMTZ4LT5wZXJpb2RpY1tpbmRleF07CisJCQl3aGlsZSAobGFzdF9lcC0+bmV4dCkKKwkJCQlsYXN0X2VwID0gKGxhc3RfZXAtPmFjdGl2ZSA9IGxhc3RfZXAtPm5leHQpOworCQkJbGFzdF9lcC0+YWN0aXZlID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFNjaGVkdWxlIGNvbnRyb2wvYnVsayB0cmFuc2ZlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVwLCAmaXNwMTE2eC0+YXN5bmMsIHNjaGVkdWxlKSB7CisJCXVyYiA9IGNvbnRhaW5lcl9vZihlcC0+aGVwLT51cmJfbGlzdC5uZXh0LAorCQkJCSAgIHN0cnVjdCB1cmIsIHVyYl9saXN0KTsKKwkJc3BlZWQgPSB1cmItPmRldi0+c3BlZWQ7CisJCWJ5dGVfdGltZSA9IHNwZWVkID09IFVTQl9TUEVFRF9MT1cKKwkJICAgID8gQllURV9USU1FX0xPV1NQRUVEIDogQllURV9USU1FX0ZVTExTUEVFRDsKKworCQlpZiAoZXAtPm5leHRwaWQgPT0gVVNCX1BJRF9TRVRVUCkgeworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOworCQl9IGVsc2UgaWYgKGVwLT5uZXh0cGlkID09IFVTQl9QSURfQUNLKSB7CisJCQlsZW4gPSAwOworCQl9IGVsc2UgeworCQkJLyogRmluZCBjdXJyZW50IGZyZWUgbGVuZ3RoIC4uLiAqLworCQkJbGVuID0gKE1BWF9MT0FEX0xJTUlUIC0gbG9hZCkgLyBieXRlX3RpbWU7CisKKwkJCS8qIC4uLiB0aGVuIGxpbWl0IGl0IHRvIGNvbmZpZ3VyZWQgbWF4IHNpemUgLi4uICovCisJCQlsZW4gPSBtaW4obGVuLCBzcGVlZCA9PSBVU0JfU1BFRURfTE9XID8KKwkJCQkgIE1BWF9UUkFOU0ZFUl9TSVpFX0xPV1NQRUVEIDoKKwkJCQkgIE1BWF9UUkFOU0ZFUl9TSVpFX0ZVTExTUEVFRCk7CisKKwkJCS8qIC4uLiBhbmQgZmluYWxseSBjdXQgdG8gdGhlIG11bHRpcGxlIG9mIE1heFBhY2tldFNpemUsCisJCQkgICBvciB0byB0aGUgcmVhbCBsZW5ndGggaWYgdGhlcmUncyBlbm91Z2ggcm9vbS4gKi8KKwkJCWlmIChsZW4gPAorCQkJICAgICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggLQorCQkJICAgICB1cmItPmFjdHVhbF9sZW5ndGgpKSB7CisJCQkJbGVuIC09IGxlbiAlIGVwLT5tYXhwYWNrZXQ7CisJCQkJaWYgKCFsZW4pCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJbGVuID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKwkJCQkgICAgdXJiLT5hY3R1YWxfbGVuZ3RoOworCQkJQlVHX09OKGxlbiA8IDApOworCQl9CisKKwkJbG9hZCArPSBsZW4gKiBieXRlX3RpbWU7CisJCWlmIChsb2FkID4gTUFYX0xPQURfTElNSVQpCisJCQlicmVhazsKKworCQllcC0+YWN0aXZlID0gTlVMTDsKKwkJZXAtPmxlbmd0aCA9IGxlbjsKKwkJaWYgKGxhc3RfZXApCisJCQlsYXN0X2VwLT5hY3RpdmUgPSBlcDsKKwkJZWxzZQorCQkJaXNwMTE2eC0+YXRsX2FjdGl2ZSA9IGVwOworCQlsYXN0X2VwID0gZXA7CisJfQorCisJLyogQXZvaWQgc3RhcnZpbmcgb2YgZW5kcG9pbnRzICovCisJaWYgKCgmaXNwMTE2eC0+YXN5bmMpLT5uZXh0ICE9ICgmaXNwMTE2eC0+YXN5bmMpLT5wcmV2KQorCQlsaXN0X21vdmUoJmlzcDExNngtPmFzeW5jLCAoJmlzcDExNngtPmFzeW5jKS0+bmV4dCk7CisKKwlpZiAoaXNwMTE2eC0+YXRsX2FjdGl2ZSkgeworCQlwcmVwcm9jX2F0bF9xdWV1ZShpc3AxMTZ4KTsKKwkJcGFja19maWZvKGlzcDExNngpOworCX0KK30KKworLyoKKyAgRmluaXNoIHRoZSBwcm9jZXNzZWQgdHJhbnNmZXJzCisqLworc3RhdGljIHZvaWQgZmluaXNoX2F0bF90cmFuc2ZlcnMoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwlpZiAoIWlzcDExNngtPmF0bF9hY3RpdmUpCisJCXJldHVybjsKKwkvKiBGaWZvIG5vdCByZWFkeT8gKi8KKwlpZiAoIShpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSENCVUZTVEFUKSAmIEhDQlVGU1RBVF9BVExfRE9ORSkpCisJCXJldHVybjsKKworCWF0b21pY19pbmMoJmlzcDExNngtPmF0bF9maW5pc2hpbmcpOworCXVucGFja19maWZvKGlzcDExNngpOworCXBvc3Rwcm9jX2F0bF9xdWV1ZShpc3AxMTZ4KTsKKwlmb3IgKGVwID0gaXNwMTE2eC0+YXRsX2FjdGl2ZTsgZXA7IGVwID0gZXAtPmFjdGl2ZSkgeworCQl1cmIgPQorCQkgICAgY29udGFpbmVyX29mKGVwLT5oZXAtPnVyYl9saXN0Lm5leHQsIHN0cnVjdCB1cmIsIHVyYl9saXN0KTsKKwkJLyogVVNCX1BJRF9BQ0sgY2hlY2sgaGVyZSBhdm9pZHMgZmluaXNoaW5nIG9mCisJCSAgIGNvbnRyb2wgdHJhbnNmZXJzLCBmb3Igd2hpY2ggVERfREFUQVVOREVSUlVOCisJCSAgIG9jY3VyZWQsIHdoaWxlIFVSQl9TSE9SVF9OT1RfT0sgd2FzIHNldCAqLworCQlpZiAodXJiICYmIHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUworCQkgICAgJiYgZXAtPm5leHRwaWQgIT0gVVNCX1BJRF9BQ0spCisJCQlmaW5pc2hfcmVxdWVzdChpc3AxMTZ4LCBlcCwgdXJiLCByZWdzKTsKKwl9CisJYXRvbWljX2RlYygmaXNwMTE2eC0+YXRsX2ZpbmlzaGluZyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpc3AxMTZ4X2lycShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdTE2IGlycXN0YXQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJmlzcDExNngtPmxvY2spOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisJaXJxc3RhdCA9IGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIGlycXN0YXQpOworCisJaWYgKGlycXN0YXQgJiAoSEN1UElOVF9BVEwgfCBIQ3VQSU5UX1NPRikpIHsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCWZpbmlzaF9hdGxfdHJhbnNmZXJzKGlzcDExNngsIHJlZ3MpOworCX0KKworCWlmIChpcnFzdGF0ICYgSEN1UElOVF9PUFIpIHsKKwkJdTMyIGludHN0YXQgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENJTlRTVEFUKTsKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0lOVFNUQVQsIGludHN0YXQpOworCQlpZiAoaW50c3RhdCAmIEhDSU5UX1VFKSB7CisJCQlFUlIoIlVucmVjb3ZlcmFibGUgZXJyb3JcbiIpOworCQkJLyogV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gUmVzZXQ/ICAqLworCQl9CisJCWlmIChpbnRzdGF0ICYgSENJTlRfUkhTQykgeworCQkJaXNwMTE2eC0+cmhzdGF0dXMgPQorCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKwkJCWlzcDExNngtPnJocG9ydFswXSA9CisJCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSk7CisJCQlpc3AxMTZ4LT5yaHBvcnRbMV0gPQorCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDIpOworCQl9CisJCWlmIChpbnRzdGF0ICYgSENJTlRfUkQpIHsKKwkJCURCRygiLS0tLSByZW1vdGUgd2FrZXVwXG4iKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmlzcDExNngtPnJoX3Jlc3VtZSk7CisJCQlyZXQgPSBJUlFfSEFORExFRDsKKwkJfQorCQlpcnFzdGF0ICY9IH5IQ3VQSU5UX09QUjsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGlycXN0YXQgJiAoSEN1UElOVF9BVEwgfCBIQ3VQSU5UX1NPRikpIHsKKwkJc3RhcnRfYXRsX3RyYW5zZmVycyhpc3AxMTZ4KTsKKwl9CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIGlzcDExNngtPmlycWVuYik7CisJc3Bpbl91bmxvY2soJmlzcDExNngtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB1c2IgMS4xIHNheXMgbWF4IDkwJSBvZiBhIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcGVyaW9kaWMgdHJhbnNmZXJzLgorICogdGhpcyBkcml2ZXIgZG9lc24ndCBwcm9taXNlIHRoYXQgbXVjaCBzaW5jZSBpdCdzIGdvdCB0byBoYW5kbGUgYW4KKyAqIElSUSBwZXIgcGFja2V0OyBpcnEgaGFuZGxpbmcgbGF0ZW5jaWVzIGFsc28gdXNlIHVwIHRoYXQgdGltZS4KKyAqLworCisvKiBvdXQgb2YgMTAwMCB1cyAqLworI2RlZmluZQlNQVhfUEVSSU9ESUNfTE9BRAk2MDAKK3N0YXRpYyBpbnQgYmFsYW5jZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHBlcmlvZCwgdTE2IGxvYWQpCit7CisJaW50IGksIGJyYW5jaCA9IC1FTk9TUEM7CisKKwkvKiBzZWFyY2ggZm9yIHRoZSBsZWFzdCBsb2FkZWQgc2NoZWR1bGUgYnJhbmNoIG9mIHRoYXQgcGVyaW9kCisJICAgd2hpY2ggaGFzIGVub3VnaCBiYW5kd2lkdGggbGVmdCB1bnJlc2VydmVkLiAqLworCWZvciAoaSA9IDA7IGkgPCBwZXJpb2Q7IGkrKykgeworCQlpZiAoYnJhbmNoIDwgMCB8fCBpc3AxMTZ4LT5sb2FkW2JyYW5jaF0gPiBpc3AxMTZ4LT5sb2FkW2ldKSB7CisJCQlpbnQgajsKKworCQkJZm9yIChqID0gaTsgaiA8IFBFUklPRElDX1NJWkU7IGogKz0gcGVyaW9kKSB7CisJCQkJaWYgKChpc3AxMTZ4LT5sb2FkW2pdICsgbG9hZCkKKwkJCQkgICAgPiBNQVhfUEVSSU9ESUNfTE9BRCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaiA8IFBFUklPRElDX1NJWkUpCisJCQkJY29udGludWU7CisJCQlicmFuY2ggPSBpOworCQl9CisJfQorCXJldHVybiBicmFuY2g7Cit9CisKKy8qIE5CISBBTEwgdGhlIGNvZGUgYWJvdmUgdGhpcyBwb2ludCBydW5zIHdpdGggaXNwMTE2eC0+bG9jaworICAgaGVsZCwgaXJxcyBvZmYKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGlzcDExNnhfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCSAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwgc3RydWN0IHVyYiAqdXJiLAorCQkJICAgICAgIHVuc2lnbmVkIG1lbV9mbGFncykKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB1cmItPmRldjsKKwl1bnNpZ25lZCBpbnQgcGlwZSA9IHVyYi0+cGlwZTsKKwlpbnQgaXNfb3V0ID0gIXVzYl9waXBlaW4ocGlwZSk7CisJaW50IHR5cGUgPSB1c2JfcGlwZXR5cGUocGlwZSk7CisJaW50IGVwbnVtID0gdXNiX3BpcGVlbmRwb2ludChwaXBlKTsKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqZXAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwl1cmJfZGJnKHVyYiwgIkVucXVldWUiKTsKKworCWlmICh0eXBlID09IFBJUEVfSVNPQ0hST05PVVMpIHsKKwkJRVJSKCJJc29jaHJvbm91cyB0cmFuc2ZlcnMgbm90IHN1cHBvcnRlZFxuIik7CisJCXVyYl9kYmcodXJiLCAiUmVmdXNlZCB0byBlbnF1ZXVlIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCS8qIGF2b2lkIGFsbCBhbGxvY2F0aW9ucyB3aXRoaW4gc3BpbmxvY2tzOiByZXF1ZXN0IG9yIGVuZHBvaW50ICovCisJaWYgKCFoZXAtPmhjcHJpdikgeworCQllcCA9IGtjYWxsb2MoMSwgc2l6ZW9mICplcCwgbWVtX2ZsYWdzKTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaGVwLT5oY3ByaXYpCisJCWVwID0gaGVwLT5oY3ByaXY7CisJZWxzZSB7CisJCUlOSVRfTElTVF9IRUFEKCZlcC0+c2NoZWR1bGUpOworCQllcC0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOworCQllcC0+ZXBudW0gPSBlcG51bTsKKwkJZXAtPm1heHBhY2tldCA9IHVzYl9tYXhwYWNrZXQodWRldiwgdXJiLT5waXBlLCBpc19vdXQpOworCQl1c2Jfc2V0dG9nZ2xlKHVkZXYsIGVwbnVtLCBpc19vdXQsIDApOworCisJCWlmICh0eXBlID09IFBJUEVfQ09OVFJPTCkgeworCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX1NFVFVQOworCQl9IGVsc2UgaWYgKGlzX291dCkgeworCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX09VVDsKKwkJfSBlbHNlIHsKKwkJCWVwLT5uZXh0cGlkID0gVVNCX1BJRF9JTjsKKwkJfQorCisJCWlmICh1cmItPmludGVydmFsKSB7CisJCQkvKgorCQkJICAgV2l0aCBJTlQgVVJCcyBzdWJtaXR0ZWQsIHRoZSBkcml2ZXIgd29ya3Mgd2l0aCBTT0YKKwkJCSAgIGludGVycnVwdCBlbmFibGVkIGFuZCBBVEwgaW50ZXJydXB0IGRpc2FibGVkLiBBZnRlcgorCQkJICAgdGhlIFBURHMgYXJlIHdyaXR0ZW4gdG8gZmlmbyByYW0sIHRoZSBjaGlwIHN0YXJ0cworCQkJICAgZmlmbyBwcm9jZXNzaW5nIGFuZCB1c2IgdHJhbnNmZXJzIGFmdGVyIHRoZSBuZXh0CisJCQkgICBTT0YgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUgdHJhbnNmZXJzIGFyZSBmaW5pc2hlZAorCQkJICAgKHN1Y2NlZWRlZCBvciBmYWlsZWQpIG9yIHRoZSBmcmFtZSBlbmRzLiBUaGVyZWZvcmUsCisJCQkgICB0aGUgdHJhbnNmZXJzIG9jY3VyIG9ubHkgaW4gZXZlcnkgc2Vjb25kIGZyYW1lLAorCQkJICAgd2hpbGUgZmlmbyByZWFkaW5nL3dyaXRpbmcgYW5kIGRhdGEgcHJvY2Vzc2luZworCQkJICAgb2NjdXIgaW4gZXZlcnkgb3RoZXIgc2Vjb25kIGZyYW1lLiAqLworCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPCAyKQorCQkJCXVyYi0+aW50ZXJ2YWwgPSAyOworCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPiAyICogUEVSSU9ESUNfU0laRSkKKwkJCQl1cmItPmludGVydmFsID0gMiAqIFBFUklPRElDX1NJWkU7CisJCQllcC0+cGVyaW9kID0gdXJiLT5pbnRlcnZhbCA+PiAxOworCQkJZXAtPmJyYW5jaCA9IFBFUklPRElDX1NJWkU7CisJCQllcC0+bG9hZCA9IHVzYl9jYWxjX2J1c190aW1lKHVkZXYtPnNwZWVkLAorCQkJCQkJICAgICAhaXNfb3V0LAorCQkJCQkJICAgICAodHlwZSA9PSBQSVBFX0lTT0NIUk9OT1VTKSwKKwkJCQkJCSAgICAgdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLAorCQkJCQkJCQkgICBpc19vdXQpKSAvCisJCQkgICAgMTAwMDsKKwkJfQorCQloZXAtPmhjcHJpdiA9IGVwOworCQllcC0+aGVwID0gaGVwOworCX0KKworCS8qIG1heWJlIHB1dCBlbmRwb2ludCBpbnRvIHNjaGVkdWxlICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJY2FzZSBQSVBFX0JVTEs6CisJCWlmIChsaXN0X2VtcHR5KCZlcC0+c2NoZWR1bGUpKQorCQkJbGlzdF9hZGRfdGFpbCgmZXAtPnNjaGVkdWxlLCAmaXNwMTE2eC0+YXN5bmMpOworCQlicmVhazsKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQl1cmItPmludGVydmFsID0gZXAtPnBlcmlvZDsKKwkJZXAtPmxlbmd0aCA9IG1pbigoaW50KWVwLT5tYXhwYWNrZXQsCisJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisKKwkJLyogdXJiIHN1Ym1pdHRlZCBmb3IgYWxyZWFkeSBleGlzdGluZyBlbmRwb2ludCAqLworCQlpZiAoZXAtPmJyYW5jaCA8IFBFUklPRElDX1NJWkUpCisJCQlicmVhazsKKworCQlyZXQgPSBlcC0+YnJhbmNoID0gYmFsYW5jZShpc3AxMTZ4LCBlcC0+cGVyaW9kLCBlcC0+bG9hZCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmYWlsOworCQlyZXQgPSAwOworCisJCXVyYi0+c3RhcnRfZnJhbWUgPSAoaXNwMTE2eC0+Zm1pbmRleCAmIChQRVJJT0RJQ19TSVpFIC0gMSkpCisJCSAgICArIGVwLT5icmFuY2g7CisKKwkJLyogc29ydCBlYWNoIHNjaGVkdWxlIGJyYW5jaCBieSBwZXJpb2QgKHNsb3cgYmVmb3JlIGZhc3QpCisJCSAgIHRvIHNoYXJlIHRoZSBmYXN0ZXIgcGFydHMgb2YgdGhlIHRyZWUgd2l0aG91dCBuZWVkaW5nCisJCSAgIGR1bW15L3BsYWNlaG9sZGVyIG5vZGVzICovCisJCURCRygic2NoZWR1bGUgcWglZC8lcCBicmFuY2ggJWRcbiIsIGVwLT5wZXJpb2QsIGVwLCBlcC0+YnJhbmNoKTsKKwkJZm9yIChpID0gZXAtPmJyYW5jaDsgaSA8IFBFUklPRElDX1NJWkU7IGkgKz0gZXAtPnBlcmlvZCkgeworCQkJc3RydWN0IGlzcDExNnhfZXAgKipwcmV2ID0gJmlzcDExNngtPnBlcmlvZGljW2ldOworCQkJc3RydWN0IGlzcDExNnhfZXAgKmhlcmUgPSAqcHJldjsKKworCQkJd2hpbGUgKGhlcmUgJiYgZXAgIT0gaGVyZSkgeworCQkJCWlmIChlcC0+cGVyaW9kID4gaGVyZS0+cGVyaW9kKQorCQkJCQlicmVhazsKKwkJCQlwcmV2ID0gJmhlcmUtPm5leHQ7CisJCQkJaGVyZSA9ICpwcmV2OworCQkJfQorCQkJaWYgKGVwICE9IGhlcmUpIHsKKwkJCQllcC0+bmV4dCA9IGhlcmU7CisJCQkJKnByZXYgPSBlcDsKKwkJCX0KKwkJCWlzcDExNngtPmxvYWRbaV0gKz0gZXAtPmxvYWQ7CisJCX0KKwkJaGNkLT5zZWxmLmJhbmR3aWR0aF9hbGxvY2F0ZWQgKz0gZXAtPmxvYWQgLyBlcC0+cGVyaW9kOworCisJCS8qIHN3aXRjaCBvdmVyIHRvIFNPRmludCAqLworCQlpZiAoIWlzcDExNngtPnBlcmlvZGljX2NvdW50KyspIHsKKwkJCWlzcDExNngtPmlycWVuYiAmPSB+SEN1UElOVF9BVEw7CisJCQlpc3AxMTZ4LT5pcnFlbmIgfD0gSEN1UElOVF9TT0Y7CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsCisJCQkJCSAgICBpc3AxMTZ4LT5pcnFlbmIpOworCQl9CisJfQorCisJLyogaW4gY2FzZSBvZiB1bmxpbmstZHVyaW5nLXN1Ym1pdCAqLworCXNwaW5fbG9jaygmdXJiLT5sb2NrKTsKKwlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCQlmaW5pc2hfcmVxdWVzdChpc3AxMTZ4LCBlcCwgdXJiLCBOVUxMKTsKKwkJcmV0ID0gMDsKKwkJZ290byBmYWlsOworCX0KKwl1cmItPmhjcHJpdiA9IGhlcDsKKwlzcGluX3VubG9jaygmdXJiLT5sb2NrKTsKKwlzdGFydF9hdGxfdHJhbnNmZXJzKGlzcDExNngpOworCisgICAgICBmYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICAgRGVxdWV1ZSBVUkJzLgorKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwOworCXN0cnVjdCBpc3AxMTZ4X2VwICplcCwgKmVwX2FjdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwloZXAgPSB1cmItPmhjcHJpdjsKKwkvKiBVUkIgYWxyZWFkeSB1bmxpbmtlZCAob3IgbmV2ZXIgbGlua2VkKT8gKi8KKwlpZiAoIWhlcCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwllcCA9IGhlcC0+aGNwcml2OworCVdBUk5fT04oaGVwICE9IGVwLT5oZXApOworCisJLyogSW4gZnJvbnQgb2YgcXVldWU/ICovCisJaWYgKGVwLT5oZXAtPnVyYl9saXN0Lm5leHQgPT0gJnVyYi0+dXJiX2xpc3QpCisJCS8qIGFjdGl2ZT8gKi8KKwkJZm9yIChlcF9hY3QgPSBpc3AxMTZ4LT5hdGxfYWN0aXZlOyBlcF9hY3Q7CisJCSAgICAgZXBfYWN0ID0gZXBfYWN0LT5hY3RpdmUpCisJCQlpZiAoZXBfYWN0ID09IGVwKSB7CisJCQkJVkRCRygiZGVxdWV1ZSwgdXJiICVwIGFjdGl2ZTsgd2FpdCBmb3IgaXJxXG4iLAorCQkJCSAgICAgdXJiKTsKKwkJCQl1cmIgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCisJaWYgKHVyYikKKwkJZmluaXNoX3JlcXVlc3QoaXNwMTE2eCwgZXAsIHVyYiwgTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlzcDExNnhfZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCSAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXApCit7CisJaW50IGk7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwID0gaGVwLT5oY3ByaXY7OworCisJaWYgKCFlcCkKKwkJcmV0dXJuOworCisJLyogYXNzdW1lIHdlJ2QganVzdCB3YWl0IGZvciB0aGUgaXJxICovCisJZm9yIChpID0gMDsgaSA8IDEwMCAmJiAhbGlzdF9lbXB0eSgmaGVwLT51cmJfbGlzdCk7IGkrKykKKwkJbXNsZWVwKDMpOworCWlmICghbGlzdF9lbXB0eSgmaGVwLT51cmJfbGlzdCkpCisJCVdBUk4oImVwICVwIG5vdCBlbXB0eT9cbiIsIGVwKTsKKworCXVzYl9wdXRfZGV2KGVwLT51ZGV2KTsKKwlrZnJlZShlcCk7CisJaGVwLT5oY3ByaXYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGlzcDExNnhfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCXUzMiBmbW51bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlmbW51bSA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0ZNTlVNKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIChpbnQpZm1udW07Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgIEFkYXB0ZWQgZnJvbSBvaGNpLWh1Yi5jLiBDdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBhdXRvc3VzcGVuZC4KKyovCitzdGF0aWMgaW50IGlzcDExNnhfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJaW50IHBvcnRzLCBpLCBjaGFuZ2VkID0gMDsKKworCWlmICghSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlwb3J0cyA9IGlzcDExNngtPnJoZGVzY2EgJiBSSF9BX05EUDsKKworCS8qIGluaXQgc3RhdHVzICovCisJaWYgKGlzcDExNngtPnJoc3RhdHVzICYgKFJIX0hTX0xQU0MgfCBSSF9IU19PQ0lDKSkKKwkJYnVmWzBdID0gY2hhbmdlZCA9IDE7CisJZWxzZQorCQlidWZbMF0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspIHsKKwkJdTMyIHN0YXR1cyA9IGlzcDExNngtPnJocG9ydFtpXTsKKworCQlpZiAoc3RhdHVzICYgKFJIX1BTX0NTQyB8IFJIX1BTX1BFU0MgfCBSSF9QU19QU1NDCisJCQkgICAgICB8IFJIX1BTX09DSUMgfCBSSF9QU19QUlNDKSkgeworCQkJY2hhbmdlZCA9IDE7CisJCQlidWZbMF0gfD0gMSA8PCAoaSArIDEpOworCQkJY29udGludWU7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzcDExNnhfaHViX2Rlc2NyaXB0b3Ioc3RydWN0IGlzcDExNnggKmlzcDExNngsCisJCQkJICAgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYykKK3sKKwl1MzIgcmVnID0gaXNwMTE2eC0+cmhkZXNjYTsKKworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NMZW5ndGggPSA5OworCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOworCWRlc2MtPmJOYnJQb3J0cyA9ICh1OCkgKHJlZyAmIDB4Myk7CisJLyogUG93ZXIgc3dpdGNoaW5nLCBkZXZpY2UgdHlwZSwgb3ZlcmN1cnJlbnQuICovCisJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9CisJICAgIChfX2ZvcmNlIF9fdTE2KSBjcHVfdG9fbGUxNigodTE2KSAoKHJlZyA+PiA4KSAmIDB4MWYpKTsKKwlkZXNjLT5iUHdyT24yUHdyR29vZCA9ICh1OCkgKChyZWcgPj4gMjQpICYgMHhmZik7CisJLyogdHdvIGJpdG1hcHM6ICBwb3J0cyByZW1vdmFibGUsIGFuZCBsZWdhY3kgUG9ydFB3ckN0cmxNYXNrICovCisJZGVzYy0+Yml0bWFwWzBdID0gZGVzYy0+Yk5iclBvcnRzID09IDEgPyAxIDw8IDEgOiAzIDw8IDE7CisJZGVzYy0+Yml0bWFwWzFdID0gfjA7Cit9CisKKy8qIFBlcmZvcm0gcmVzZXQgb2YgYSBnaXZlbiBwb3J0LgorICAgSXQgd291bGQgYmUgZ3JlYXQgdG8ganVzdCBzdGFydCB0aGUgcmVzZXQgYW5kIGxldCB0aGUKKyAgIFVTQiBjb3JlIHRvIGNsZWFyIHRoZSByZXNldCBpbiBkdWUgdGltZS4gSG93ZXZlciwKKyAgIHJvb3QgaHViIHBvcnRzIHNob3VsZCBiZSByZXNldCBmb3IgYXQgbGVhc3QgNTAgbXMsIHdoaWxlCisgICBvdXIgY2hpcCBzdGF5cyBpbiByZXNldCBmb3IgYWJvdXQgMTAgbXMuIEkuZS4sIHdlIG11c3QKKyAgIHJlcGVhdGVkbHkgcmVzZXQgaXQgb3Vyc2VsZiBoZXJlLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByb290X3BvcnRfcmVzZXQoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHBvcnQpCit7CisJdTMyIHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0OworCisJLyogUm9vdCBodWIgcmVzZXQgc2hvdWxkIGJlIDUwIG1zLCBidXQgc29tZSBkZXZpY2VzCisJICAgd2FudCBpdCBldmVuIGxvbmdlci4gKi8KKwl0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQkvKiBzcGluIHVudGlsIGFueSBjdXJyZW50IHJlc2V0IGZpbmlzaGVzICovCisJCWZvciAoOzspIHsKKwkJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBwb3J0ID8KKwkJCQkJCSBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOworCQkJaWYgKCEodG1wICYgUkhfUFNfUFJTKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSg1MDApOworCQl9CisJCS8qIERvbid0IHJlc2V0IGEgZGlzY29ubmVjdGVkIHBvcnQgKi8KKwkJaWYgKCEodG1wICYgUkhfUFNfQ0NTKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJLyogUmVzZXQgbGFzdHMgMTBtcyAoY2xhaW1zIGRhdGFzaGVldCkgKi8KKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBwb3J0ID8gSENSSFBPUlQyIDoKKwkJCQkgICAgSENSSFBPUlQxLCAoUkhfUFNfUFJTKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwl9Cit9CisKKy8qIEFkYXB0ZWQgZnJvbSBvaGNpLWh1Yi5jICovCitzdGF0aWMgaW50IGlzcDExNnhfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCSAgICAgICB1MTYgdHlwZVJlcSwKKwkJCSAgICAgICB1MTYgd1ZhbHVlLCB1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwb3J0cyA9IGlzcDExNngtPnJoZGVzY2EgJiBSSF9BX05EUDsKKwl1MzIgdG1wID0gMDsKKworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgQ2xlYXJIdWJGZWF0dXJlOgorCQlEQkcoIkNsZWFySHViRmVhdHVyZTogIik7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQkJREJHKCJDX0hVQl9PVkVSX0NVUlJFTlRcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfT0NJQyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCQlEQkcoIkNfSFVCX0xPQ0FMX1BPV0VSXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNldEh1YkZlYXR1cmU6CisJCURCRygiU2V0SHViRmVhdHVyZTogIik7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQljYXNlIENfSFVCX0xPQ0FMX1BPV0VSOgorCQkJREJHKCJDX0hVQl9PVkVSX0NVUlJFTlQgb3IgQ19IVUJfTE9DQUxfUE9XRVJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCWJyZWFrOworCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKKwkJREJHKCJHZXRIdWJEZXNjcmlwdG9yXG4iKTsKKwkJaXNwMTE2eF9odWJfZGVzY3JpcHRvcihpc3AxMTZ4LAorCQkJCSAgICAgICAoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgR2V0SHViU3RhdHVzOgorCQlEQkcoIkdldEh1YlN0YXR1c1xuIik7CisJCSooX19sZTMyICopIGJ1ZiA9IDA7CisJCWJyZWFrOworCWNhc2UgR2V0UG9ydFN0YXR1czoKKwkJREJHKCJHZXRQb3J0U3RhdHVzXG4iKTsKKwkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCisJCQlnb3RvIGVycm9yOworCQl0bXAgPSBpc3AxMTZ4LT5yaHBvcnRbLS13SW5kZXhdOworCQkqKF9fbGUzMiAqKSBidWYgPSBjcHVfdG9fbGUzMih0bXApOworCQlEQkcoIkdldFBvcnRTdGF0dXM6IHBvcnRbJWRdICAlMDh4XG4iLCB3SW5kZXggKyAxLCB0bXApOworCQlicmVhazsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCURCRygiQ2xlYXJQb3J0RmVhdHVyZTogIik7CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKwkJd0luZGV4LS07CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0VOQUJMRToKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9FTkFCTEVcbiIpOworCQkJdG1wID0gUkhfUFNfQ0NTOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRToKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9DX0VOQUJMRVxuIik7CisJCQl0bXAgPSBSSF9QU19QRVNDOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOworCQkJdG1wID0gUkhfUFNfUE9DSTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX0NfU1VTUEVORFxuIik7CisJCQl0bXAgPSBSSF9QU19QU1NDOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9QT1dFUlxuIik7CisJCQl0bXAgPSBSSF9QU19MU0RBOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT046CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OXG4iKTsKKwkJCXRtcCA9IFJIX1BTX0NTQzsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlRcbiIpOworCQkJdG1wID0gUkhfUFNfT0NJQzsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19SRVNFVDoKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9DX1JFU0VUXG4iKTsKKwkJCXRtcCA9IFJIX1BTX1BSU0M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCB3SW5kZXgKKwkJCQkgICAgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEsIHRtcCk7CisJCWlzcDExNngtPnJocG9ydFt3SW5kZXhdID0KKwkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCB3SW5kZXggPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU2V0UG9ydEZlYXR1cmU6CisJCURCRygiU2V0UG9ydEZlYXR1cmU6ICIpOworCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisJCXdJbmRleC0tOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9TVVNQRU5EXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIHdJbmRleAorCQkJCQkgICAgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEsIFJIX1BTX1BTUyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX1BPV0VSXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIHdJbmRleAorCQkJCQkgICAgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEsIFJIX1BTX1BQUyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX1JFU0VUXG4iKTsKKwkJCXJvb3RfcG9ydF9yZXNldChpc3AxMTZ4LCB3SW5kZXgpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlpc3AxMTZ4LT5yaHBvcnRbd0luZGV4XSA9CisJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgd0luZGV4ID8gSENSSFBPUlQyIDogSENSSFBPUlQxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJICAgICAgZXJyb3I6CisJCS8qICJwcm90b2NvbCBzdGFsbCIgb24gZXJyb3IgKi8KKwkJREJHKCJQUk9UT0NPTCBTVEFMTFxuIik7CisJCXJldCA9IC1FUElQRTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmCUNPTkZJR19QTQorCitzdGF0aWMgaW50IGlzcDExNnhfaHViX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wpOworCXN3aXRjaCAodmFsICYgSENDT05UUk9MX0hDRlMpIHsKKwljYXNlIEhDQ09OVFJPTF9VU0JfT1BFUjoKKwkJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1FVSUVTQ0lORzsKKwkJdmFsICY9ICh+SENDT05UUk9MX0hDRlMgJiB+SENDT05UUk9MX1JXRSk7CisJCXZhbCB8PSBIQ0NPTlRST0xfVVNCX1NVU1BFTkQ7CisJCWlmIChoY2QtPnJlbW90ZV93YWtldXApCisJCQl2YWwgfD0gSENDT05UUk9MX1JXRTsKKwkJLyogV2FpdCBmb3IgdXNiIHRyYW5zZmVycyB0byBmaW5pc2ggKi8KKwkJbWRlbGF5KDIpOworCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwgdmFsKTsKKwkJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKKwkJLyogV2FpdCBmb3IgZGV2aWNlcyB0byBzdXNwZW5kICovCisJCW1kZWxheSg1KTsKKwljYXNlIEhDQ09OVFJPTF9VU0JfU1VTUEVORDoKKwkJYnJlYWs7CisJY2FzZSBIQ0NPTlRST0xfVVNCX1JFU1VNRToKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wsCisJCQkJICAgICh2YWwgJiB+SENDT05UUk9MX0hDRlMpIHwKKwkJCQkgICAgSENDT05UUk9MX1VTQl9SRVNFVCk7CisJY2FzZSBIQ0NPTlRST0xfVVNCX1JFU0VUOgorCQlyZXQgPSAtRUJVU1k7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNwMTE2eF9odWJfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCXUzMiB2YWw7CisJaW50IHJldCA9IC1FSU5QUk9HUkVTUzsKKworCW1zbGVlcCg1KTsKKwlzcGluX2xvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wpOworCXN3aXRjaCAodmFsICYgSENDT05UUk9MX0hDRlMpIHsKKwljYXNlIEhDQ09OVFJPTF9VU0JfU1VTUEVORDoKKwkJdmFsICY9IH5IQ0NPTlRST0xfSENGUzsKKwkJdmFsIHw9IEhDQ09OVFJPTF9VU0JfUkVTVU1FOworCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwgdmFsKTsKKwljYXNlIEhDQ09OVFJPTF9VU0JfUkVTVU1FOgorCQlicmVhazsKKwljYXNlIEhDQ09OVFJPTF9VU0JfT1BFUjoKKwkJLyogV2l0aG91dCBzZXR0aW5nIHBvd2VyX3N0YXRlIGhlcmUgdGhlCisJCSAgIFNVU1BFTkRFRCBzdGF0ZSB3b24ndCBiZSByZW1vdmVkIGZyb20KKwkJICAgc3lzZnMvdXNiTi9wb3dlci5zdGF0ZSBhcyBhIHJlc3BvbnNlIHRvIHJlbW90ZQorCQkgICB3YWtldXAuIE1heWJlIGluIHRoZSBmdXR1cmUuICovCisJCWhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVCVVNZOworCX0KKworCWlmIChyZXQgIT0gLUVJTlBST0dSRVNTKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJdmFsID0gaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQOworCXdoaWxlICh2YWwtLSkgeworCQl1MzIgc3RhdCA9CisJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgdmFsID8gSENSSFBPUlQyIDogSENSSFBPUlQxKTsKKwkJLyogZm9yY2UgZ2xvYmFsLCBub3Qgc2VsZWN0aXZlLCByZXN1bWUgKi8KKwkJaWYgKCEoc3RhdCAmIFJIX1BTX1BTUykpCisJCQljb250aW51ZTsKKwkJREJHKCIlczogUmVzdW1pbmcgcG9ydCAlZFxuIiwgX19mdW5jX18sIHZhbCk7CisJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgUkhfUFNfUE9DSSwgdmFsCisJCQkJICAgID8gSENSSFBPUlQyIDogSENSSFBPUlQxKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SRVNVTUlORzsKKwltZGVsYXkoMjApOworCisJLyogR28gb3BlcmF0aW9uYWwgKi8KKwlzcGluX2xvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKwl2YWwgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwKKwkJCSAgICAodmFsICYgfkhDQ09OVFJPTF9IQ0ZTKSB8IEhDQ09OVFJPTF9VU0JfT1BFUik7CisJc3Bpbl91bmxvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKwkvKiBzZWUgYW5hbG9nb3VzIGNvbW1lbnQgYWJvdmUgKi8KKwloY2QtPnNlbGYucm9vdF9odWItPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF9yaF9yZXN1bWUodm9pZCAqX2hjZCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gX2hjZDsKKworCXVzYl9yZXN1bWVfZGV2aWNlKGhjZC0+c2VsZi5yb290X2h1Yik7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUJaXNwMTE2eF9odWJfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWlzcDExNnhfaHViX3Jlc3VtZQlOVUxMCisKK3N0YXRpYyB2b2lkIGlzcDExNnhfcmhfcmVzdW1lKHZvaWQgKl9oY2QpCit7Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIFNUVUJfREVCVUdfRklMRQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlX2RlYnVnX2ZpbGUoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZGVidWdfZmlsZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKK30KKworI2Vsc2UKKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCitzdGF0aWMgdm9pZCBkdW1wX2lycShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNoYXIgKmxhYmVsLCB1MTYgbWFzaykKK3sKKwlzZXFfcHJpbnRmKHMsICIlcyAlMDR4JXMlcyVzJXMlcyVzXG4iLCBsYWJlbCwgbWFzaywKKwkJICAgbWFzayAmIEhDdVBJTlRfQ0xLUkRZID8gIiBjbGtyZHkiIDogIiIsCisJCSAgIG1hc2sgJiBIQ3VQSU5UX1NVU1AgPyAiIHN1c3AiIDogIiIsCisJCSAgIG1hc2sgJiBIQ3VQSU5UX09QUiA/ICIgb3ByIiA6ICIiLAorCQkgICBtYXNrICYgSEN1UElOVF9BSUlFT1QgPyAiIGVvdCIgOiAiIiwKKwkJICAgbWFzayAmIEhDdVBJTlRfQVRMID8gIiBhdGwiIDogIiIsCisJCSAgIG1hc2sgJiBIQ3VQSU5UX1NPRiA/ICIgc29mIiA6ICIiKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9pbnQoc3RydWN0IHNlcV9maWxlICpzLCBjaGFyICpsYWJlbCwgdTMyIG1hc2spCit7CisJc2VxX3ByaW50ZihzLCAiJXMgJTA4eCVzJXMlcyVzJXMlcyVzXG4iLCBsYWJlbCwgbWFzaywKKwkJICAgbWFzayAmIEhDSU5UX01JRSA/ICIgTUlFIiA6ICIiLAorCQkgICBtYXNrICYgSENJTlRfUkhTQyA/ICIgcmhzYyIgOiAiIiwKKwkJICAgbWFzayAmIEhDSU5UX0ZOTyA/ICIgZm5vIiA6ICIiLAorCQkgICBtYXNrICYgSENJTlRfVUUgPyAiIHVlIiA6ICIiLAorCQkgICBtYXNrICYgSENJTlRfUkQgPyAiIHJkIiA6ICIiLAorCQkgICBtYXNrICYgSENJTlRfU0YgPyAiIHNvZiIgOiAiIiwgbWFzayAmIEhDSU5UX1NPID8gIiBzbyIgOiAiIik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pc3AxMTZ4X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBzLT5wcml2YXRlOworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgaTsKKwljaGFyICpzdHI7CisKKwlzZXFfcHJpbnRmKHMsICIlc1xuJXMgdmVyc2lvbiAlc1xuIiwKKwkJICAgaXNwMTE2eF90b19oY2QoaXNwMTE2eCktPnByb2R1Y3RfZGVzYywgaGNkX25hbWUsCisJCSAgIERSSVZFUl9WRVJTSU9OKTsKKworCWlmIChIQ19JU19TVVNQRU5ERUQoaXNwMTE2eF90b19oY2QoaXNwMTE2eCktPnN0YXRlKSkgeworCQlzZXFfcHJpbnRmKHMsICJIQ0QgaXMgc3VzcGVuZGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghSENfSVNfUlVOTklORyhpc3AxMTZ4X3RvX2hjZChpc3AxMTZ4KS0+c3RhdGUpKSB7CisJCXNlcV9wcmludGYocywgIkhDRCBub3QgcnVubmluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCisJZHVtcF9pcnEocywgImhjX2lycV9lbmFibGUiLCBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQikpOworCWR1bXBfaXJxKHMsICJoY19pcnFfc3RhdHVzIiwgaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDdVBJTlQpKTsKKwlkdW1wX2ludChzLCAiaGNfaW50X2VuYWJsZSIsIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0lOVEVOQikpOworCWR1bXBfaW50KHMsICJoY19pbnRfc3RhdHVzIiwgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDSU5UU1RBVCkpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlcCwgJmlzcDExNngtPmFzeW5jLCBzY2hlZHVsZSkgeworCisJCXN3aXRjaCAoZXAtPm5leHRwaWQpIHsKKwkJY2FzZSBVU0JfUElEX0lOOgorCQkJc3RyID0gImluIjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfT1VUOgorCQkJc3RyID0gIm91dCI7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUElEX1NFVFVQOgorCQkJc3RyID0gInNldHVwIjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfQUNLOgorCQkJc3RyID0gInN0YXR1cyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0ciA9ICI/IjsKKwkJCWJyZWFrOworCQl9OworCQlzZXFfcHJpbnRmKHMsICIlcCwgZXAlZCVzLCBtYXhwYWNrZXQgJWQ6XG4iLCBlcCwKKwkJCSAgIGVwLT5lcG51bSwgc3RyLCBlcC0+bWF4cGFja2V0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh1cmIsICZlcC0+aGVwLT51cmJfbGlzdCwgdXJiX2xpc3QpIHsKKwkJCXNlcV9wcmludGYocywgIiAgdXJiJXAsICVkLyVkXG4iLCB1cmIsCisJCQkJICAgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCSAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJCX0KKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZpc3AxMTZ4LT5hc3luYykpCisJCXNlcV9wcmludGYocywgIlxuIik7CisKKwlzZXFfcHJpbnRmKHMsICJwZXJpb2RpYyBzaXplPSAlZFxuIiwgUEVSSU9ESUNfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEVSSU9ESUNfU0laRTsgaSsrKSB7CisJCWVwID0gaXNwMTE2eC0+cGVyaW9kaWNbaV07CisJCWlmICghZXApCisJCQljb250aW51ZTsKKwkJc2VxX3ByaW50ZihzLCAiJTJkIFslM2RdOlxuIiwgaSwgaXNwMTE2eC0+bG9hZFtpXSk7CisKKwkJLyogRFVNQjogcHJpbnRzIHNoYXJlZCBlbnRyaWVzIG11bHRpcGxlIHRpbWVzICovCisJCWRvIHsKKwkJCXNlcV9wcmludGYocywgIiAgICVkLyVwICglc2RldiVkIGVwJWQlcyBtYXggJWQpXG4iLAorCQkJCSAgIGVwLT5wZXJpb2QsIGVwLAorCQkJCSAgIChlcC0+dWRldi0+c3BlZWQgPT0KKwkJCQkgICAgVVNCX1NQRUVEX0ZVTEwpID8gIiIgOiAibHMgIiwKKwkJCQkgICBlcC0+dWRldi0+ZGV2bnVtLCBlcC0+ZXBudW0sCisJCQkJICAgKGVwLT5lcG51bSA9PQorCQkJCSAgICAwKSA/ICIiIDogKChlcC0+bmV4dHBpZCA9PQorCQkJCQkJVVNCX1BJRF9JTikgPyAiaW4iIDogIm91dCIpLAorCQkJCSAgIGVwLT5tYXhwYWNrZXQpOworCQkJZXAgPSBlcC0+bmV4dDsKKwkJfSB3aGlsZSAoZXApOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCXNlcV9wcmludGYocywgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2lzcDExNnhfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19pc3AxMTZ4X3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29wcyA9IHsKKwkub3BlbiA9IHByb2NfaXNwMTE2eF9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogZXhwZWN0IGp1c3Qgb25lIGlzcDExNnggcGVyIHN5c3RlbSAqLworc3RhdGljIGNvbnN0IGNoYXIgcHJvY19maWxlbmFtZVtdID0gImRyaXZlci9pc3AxMTZ4IjsKKworc3RhdGljIHZvaWQgY3JlYXRlX2RlYnVnX2ZpbGUoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CisKKwlwZGUgPSBjcmVhdGVfcHJvY19lbnRyeShwcm9jX2ZpbGVuYW1lLCAwLCBOVUxMKTsKKwlpZiAocGRlID09IE5VTEwpCisJCXJldHVybjsKKworCXBkZS0+cHJvY19mb3BzID0gJnByb2Nfb3BzOworCXBkZS0+ZGF0YSA9IGlzcDExNng7CisJaXNwMTE2eC0+cGRlID0gcGRlOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZGVidWdfZmlsZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpZiAoaXNwMTE2eC0+cGRlKQorCQlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2ZpbGVuYW1lLCBOVUxMKTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICBTb2Z0d2FyZSByZXNldCAtIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGVjdC4KKyovCitzdGF0aWMgaW50IGlzcDExNnhfc3dfcmVzZXQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJaW50IHJldHJpZXMgPSAxNTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDU1dSRVMsIEhDU1dSRVNfTUFHSUMpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDTURTVEFULCBIQ0NNRFNUQVRfSENSKTsKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIEl0IHVzdWFsbHkgcmVzZXRzIHdpdGhpbiAxIG1zICovCisJCW1kZWxheSgxKTsKKwkJaWYgKCEoaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDQ01EU1RBVCkgJiBIQ0NNRFNUQVRfSENSKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJldHJpZXMpIHsKKwkJRVJSKCJTb2Z0d2FyZSByZXNldCB0aW1lb3V0XG4iKTsKKwkJcmV0ID0gLUVUSU1FOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgUmVzZXQuIFRyaWVzIHRvIHBlcmZvcm0gcGxhdGZvcm0tc3BlY2lmaWMgaGFyZHdhcmUKKyAgcmVzZXQgZmlyc3Q7IGZhbGxzIGJhY2sgdG8gc29mdHdhcmUgcmVzZXQuCisqLworc3RhdGljIGludCBpc3AxMTZ4X3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1MTYgY2xrcmR5ID0gMDsKKwlpbnQgcmV0ID0gMCwgdGltZW91dCA9IDE1IC8qIG1zICovIDsKKworCWlmIChpc3AxMTZ4LT5ib2FyZCAmJiBpc3AxMTZ4LT5ib2FyZC0+cmVzZXQpIHsKKwkJLyogSGFyZHdhcmUgcmVzZXQgKi8KKwkJaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KGhjZC0+c2VsZi5jb250cm9sbGVyLCAxKTsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKGlzcDExNngtPmJvYXJkLT5jbG9jaykKKwkJCWlzcDExNngtPmJvYXJkLT5jbG9jayhoY2QtPnNlbGYuY29udHJvbGxlciwgMSk7CisJCW1zbGVlcCgxKTsKKwkJaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KGhjZC0+c2VsZi5jb250cm9sbGVyLCAwKTsKKwl9IGVsc2UKKwkJcmV0ID0gaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHQpKSB7CisJCW1zbGVlcCg0KTsKKwkJc3Bpbl9sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7CisJCWNsa3JkeSA9IGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5UKSAmIEhDdVBJTlRfQ0xLUkRZOworCQlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCQlpZiAoY2xrcmR5KQorCQkJYnJlYWs7CisJfQorCWlmICghY2xrcmR5KSB7CisJCUVSUigiQ2xvY2sgbm90IHJlYWR5IGFmdGVyIDIwbXNcbiIpOworCQkvKiBBZnRlciBzd19yZXNldCB0aGUgY2xvY2sgd29uJ3QgcmVwb3J0IHRvIGJlIHJlYWR5LCBpZgorCQkgICBIX1dBS0VVUCBwaW4gaXMgaGlnaC4gKi8KKwkJaWYgKCFpc3AxMTZ4LT5ib2FyZCB8fCAhaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KQorCQkJRVJSKCJUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaGFyZHdhcmUgd2FrZXVwLlxuIik7CisJCQlFUlIoIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgSF9XQUtFVVAgcGluICIKKwkJCQkiaXMgcHVsbGVkIGxvdyFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3N0b3Aoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCisJLyogU3dpdGNoIG9mZiBwb3J0cycgcG93ZXIsIHNvbWUgZGV2aWNlcyBkb24ndCBjb21lIHVwCisJICAgYWZ0ZXIgbmV4dCAnaW5zbW9kJyB3aXRob3V0IHRoaXMgKi8KKwl2YWwgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBKTsKKwl2YWwgJj0gfihSSF9BX05QUyB8IFJIX0FfUFNNKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSwgdmFsKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIFJIX0hTX0xQUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCisJLyogUHV0IHRoZSBjaGlwIGludG8gcmVzZXQgc3RhdGUgKi8KKwlpZiAoaXNwMTE2eC0+Ym9hcmQgJiYgaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KQorCQlpc3AxMTZ4LT5ib2FyZC0+cmVzZXQoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDApOworCWVsc2UKKwkJaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKKworCS8qIFN0b3AgdGhlIGNsb2NrICovCisJaWYgKGlzcDExNngtPmJvYXJkICYmIGlzcDExNngtPmJvYXJkLT5jbG9jaykKKwkJaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKGhjZC0+c2VsZi5jb250cm9sbGVyLCAwKTsKK30KKworLyoKKyAgQ29uZmlndXJlIHRoZSBjaGlwLiBUaGUgY2hpcCBtdXN0IGJlIHN1Y2Nlc3NmdWxseSByZXNldCBieSBub3cuCisqLworc3RhdGljIGludCBpc3AxMTZ4X3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCXN0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgKmJvYXJkID0gaXNwMTE2eC0+Ym9hcmQ7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzICovCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCAweGZmKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCisJdmFsID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQ0hJUElEKTsKKwlpZiAoKHZhbCAmIEhDQ0hJUElEX01BU0spICE9IEhDQ0hJUElEX01BR0lDKSB7CisJCUVSUigiSW52YWxpZCBjaGlwIElEICUwNHhcbiIsIHZhbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0lUTEJVRkxFTiwgSVNQMTE2eF9JVExfQlVGU0laRSk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0FUTEJVRkxFTiwgSVNQMTE2eF9BVExfQlVGU0laRSk7CisKKwkvKiAtLS0tLSBIVyBjb25mICovCisJdmFsID0gSENIV0NGR19JTlRfRU5BQkxFIHwgSENIV0NGR19EQldJRFRIKDEpOworCWlmIChib2FyZC0+c2VsMTVLcmVzKQorCQl2YWwgfD0gSENIV0NGR18xNUtSU0VMOworCS8qIFJlbW90ZSB3YWtldXAgd29uJ3Qgd29yayB3aXRob3V0IHdvcmtpbmcgY2xvY2sgKi8KKwlpZiAoYm9hcmQtPmNsa25vdHN0b3AgfHwgYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQl2YWwgfD0gSENIV0NGR19DTEtOT1RTVE9QOworCWlmIChib2FyZC0+b2NfZW5hYmxlKQorCQl2YWwgfD0gSENIV0NGR19BTkFMT0dfT0M7CisJaWYgKGJvYXJkLT5pbnRfYWN0X2hpZ2gpCisJCXZhbCB8PSBIQ0hXQ0ZHX0lOVF9QT0w7CisJaWYgKGJvYXJkLT5pbnRfZWRnZV90cmlnZ2VyZWQpCisJCXZhbCB8PSBIQ0hXQ0ZHX0lOVF9UUklHR0VSOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENIV0NGRywgdmFsKTsKKworCS8qIC0tLS0tIFJvb3QgaHViIGNvbmYgKi8KKwl2YWwgPSAwOworCS8qIEFOMTAwMDNfMS5wZGYgcmVjb21tZW5kcyBOUFMgdG8gYmUgYWx3YXlzIDEgKi8KKwlpZiAoYm9hcmQtPm5vX3Bvd2VyX3N3aXRjaGluZykKKwkJdmFsIHw9IFJIX0FfTlBTOworCWlmIChib2FyZC0+cG93ZXJfc3dpdGNoaW5nX21vZGUpCisJCXZhbCB8PSBSSF9BX1BTTTsKKwlpZiAoYm9hcmQtPnBvdHBnKQorCQl2YWwgfD0gKGJvYXJkLT5wb3RwZyA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKKwllbHNlCisJCXZhbCB8PSAoMjUgPDwgMjQpICYgUkhfQV9QT1RQR1Q7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EsIHZhbCk7CisJaXNwMTE2eC0+cmhkZXNjYSA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCisJdmFsID0gUkhfQl9QUENNOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NCLCB2YWwpOworCWlzcDExNngtPnJoZGVzY2IgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NCKTsKKworCXZhbCA9IDA7CisJaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2VuYWJsZSkgeworCQloY2QtPmNhbl93YWtldXAgPSAxOworCQl2YWwgfD0gUkhfSFNfRFJXRTsKKwl9CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTLCB2YWwpOworCWlzcDExNngtPnJoc3RhdHVzID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMpOworCisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0ZNSU5UVkwsIDB4Mjc3ODJlZGYpOworCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisKKwkvKiBTZXQgdXAgaW50ZXJydXB0cyAqLworCWlzcDExNngtPmludGVuYiA9IEhDSU5UX01JRSB8IEhDSU5UX1JIU0MgfCBIQ0lOVF9VRTsKKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQlpc3AxMTZ4LT5pbnRlbmIgfD0gSENJTlRfUkQ7CisJaXNwMTE2eC0+aXJxZW5iID0gSEN1UElOVF9BVEwgfCBIQ3VQSU5UX09QUjsJLyogfCBIQ3VQSU5UX1NVU1A7ICovCisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0lOVEVOQiwgaXNwMTE2eC0+aW50ZW5iKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIGlzcDExNngtPmlycWVuYik7CisKKwkvKiBHbyBvcGVyYXRpb25hbCAqLworCXZhbCA9IEhDQ09OVFJPTF9VU0JfT1BFUjsKKwkvKiBSZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAtIE5PVCBTVVBQT1JURUQgKi8KKwkvKiAgaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2Nvbm5lY3RlZCkKKwkgICB2YWwgfD0gSENDT05UUk9MX1JXQzsgICovCisJaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2VuYWJsZSkKKwkJdmFsIHw9IEhDQ09OVFJPTF9SV0U7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wsIHZhbCk7CisKKwkvKiBEaXNhYmxlIHBvcnRzIHRvIGF2b2lkIHJhY2UgaW4gZGV2aWNlIGVudW1lcmF0aW9uICovCisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEsIFJIX1BTX0NDUyk7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDIsIFJIX1BTX0NDUyk7CisKKwlpc3AxMTZ4X3Nob3dfcmVncyhpc3AxMTZ4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGhjX2RyaXZlciBpc3AxMTZ4X2hjX2RyaXZlciA9IHsKKwkuZGVzY3JpcHRpb24gPSBoY2RfbmFtZSwKKwkucHJvZHVjdF9kZXNjID0gIklTUDExNnggSG9zdCBDb250cm9sbGVyIiwKKwkuaGNkX3ByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNwMTE2eCksCisKKwkuaXJxID0gaXNwMTE2eF9pcnEsCisJLmZsYWdzID0gSENEX1VTQjExLAorCisJLnJlc2V0ID0gaXNwMTE2eF9yZXNldCwKKwkuc3RhcnQgPSBpc3AxMTZ4X3N0YXJ0LAorCS5zdG9wID0gaXNwMTE2eF9zdG9wLAorCisJLnVyYl9lbnF1ZXVlID0gaXNwMTE2eF91cmJfZW5xdWV1ZSwKKwkudXJiX2RlcXVldWUgPSBpc3AxMTZ4X3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlID0gaXNwMTE2eF9lbmRwb2ludF9kaXNhYmxlLAorCisJLmdldF9mcmFtZV9udW1iZXIgPSBpc3AxMTZ4X2dldF9mcmFtZSwKKworCS5odWJfc3RhdHVzX2RhdGEgPSBpc3AxMTZ4X2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPSBpc3AxMTZ4X2h1Yl9jb250cm9sLAorCS5odWJfc3VzcGVuZCA9IGlzcDExNnhfaHViX3N1c3BlbmQsCisJLmh1Yl9yZXN1bWUgPSBpc3AxMTZ4X2h1Yl9yZXN1bWUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdF9vcl9tb2R1bGUgaXNwMTE2eF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYoIWhjZCkKKwkJcmV0dXJuIDA7CisJaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CisJcmVtb3ZlX2RlYnVnX2ZpbGUoaXNwMTE2eCk7CisJdXNiX3JlbW92ZV9oY2QoaGNkKTsKKworCWlvdW5tYXAoaXNwMTE2eC0+ZGF0YV9yZWcpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIDIpOworCWlvdW5tYXAoaXNwMTE2eC0+YWRkcl9yZWcpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIDIpOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSByZXNvdXJjZV9sZW4ocikgKCgociktPmVuZCAtIChyKS0+c3RhcnQpICsgMSkKKworc3RhdGljIGludCBfX2luaXQgaXNwMTE2eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCByZXNvdXJjZSAqYWRkciwgKmRhdGE7CisJdm9pZCBfX2lvbWVtICphZGRyX3JlZzsKKwl2b2lkIF9faW9tZW0gKmRhdGFfcmVnOworCWludCBpcnE7CisJaW50IHJldCA9IDA7CisKKwlwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyA8IDMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKworCWRhdGEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFkZHIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKCFhZGRyIHx8ICFkYXRhIHx8IGlycSA8IDApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKworCWlmIChkZXYtPmRtYV9tYXNrKSB7CisJCURCRygiRE1BIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjE7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYWRkci0+c3RhcnQsIDIsIGhjZF9uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyMTsKKwl9CisJYWRkcl9yZWcgPSBpb3JlbWFwKGFkZHItPnN0YXJ0LCByZXNvdXJjZV9sZW4oYWRkcikpOworCWlmIChhZGRyX3JlZyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGF0YS0+c3RhcnQsIDIsIGhjZF9uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyMzsKKwl9CisJZGF0YV9yZWcgPSBpb3JlbWFwKGRhdGEtPnN0YXJ0LCByZXNvdXJjZV9sZW4oZGF0YSkpOworCWlmIChkYXRhX3JlZyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyNDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBoY2QgKi8KKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmaXNwMTE2eF9oY19kcml2ZXIsIGRldiwgZGV2LT5idXNfaWQpOworCWlmICghaGNkKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyNTsKKwl9CisJLyogdGhpcyByc3JjX3N0YXJ0IGlzIGJvZ3VzICovCisJaGNkLT5yc3JjX3N0YXJ0ID0gYWRkci0+c3RhcnQ7CisJaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJaXNwMTE2eC0+ZGF0YV9yZWcgPSBkYXRhX3JlZzsKKwlpc3AxMTZ4LT5hZGRyX3JlZyA9IGFkZHJfcmVnOworCXNwaW5fbG9ja19pbml0KCZpc3AxMTZ4LT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaXNwMTE2eC0+YXN5bmMpOworCUlOSVRfV09SSygmaXNwMTE2eC0+cmhfcmVzdW1lLCBpc3AxMTZ4X3JoX3Jlc3VtZSwgaGNkKTsKKwlpc3AxMTZ4LT5ib2FyZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmICghaXNwMTE2eC0+Ym9hcmQpIHsKKwkJRVJSKCJQbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjY7CisJfQorCWlmIChpc3AxMTZ4X2NoZWNrX3BsYXRmb3JtX2RlbGF5KGlzcDExNngpKSB7CisJCUVSUigiVVNFX1BMQVRGT1JNX0RFTEFZIGRlZmluZWQsIGJ1dCBkZWxheSBmdW5jdGlvbiBub3QgIgorCQkgICAgImltcGxlbWVudGVkLlxuIik7CisJCUVSUigiU2VlIGNvbW1lbnRzIGluIGRyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuY1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNjsKKwl9CisKKwlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgU0FfSU5URVJSVVBUKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyNjsKKworCWNyZWF0ZV9kZWJ1Z19maWxlKGlzcDExNngpOworCXJldHVybiAwOworCisgICAgICBlcnI2OgorCXVzYl9wdXRfaGNkKGhjZCk7CisgICAgICBlcnI1OgorCWlvdW5tYXAoZGF0YV9yZWcpOworICAgICAgZXJyNDoKKwlyZWxlYXNlX21lbV9yZWdpb24oZGF0YS0+c3RhcnQsIDIpOworICAgICAgZXJyMzoKKwlpb3VubWFwKGFkZHJfcmVnKTsKKyAgICAgIGVycjI6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHItPnN0YXJ0LCAyKTsKKyAgICAgIGVycjE6CisJRVJSKCJpbml0IGVycm9yLCAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYJQ09ORklHX1BNCisvKgorICBTdXNwZW5kIG9mIHBsYXRmb3JtIGRldmljZQorKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgcGhhc2UpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJVkRCRygiJXM6IHN0YXRlICV4LCBwaGFzZSAleFxuIiwgX19mdW5jX18sIHN0YXRlLCBwaGFzZSk7CisKKwlpZiAocGhhc2UgIT0gU1VTUEVORF9ESVNBQkxFICYmIHBoYXNlICE9IFNVU1BFTkRfUE9XRVJfRE9XTikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB1c2Jfc3VzcGVuZF9kZXZpY2UoaGNkLT5zZWxmLnJvb3RfaHViLCBzdGF0ZSk7CisJaWYgKCFyZXQpIHsKKwkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQlJTkZPKCIlcyBzdXNwZW5kZWRcbiIsIGhjZF9uYW1lKTsKKwl9IGVsc2UKKwkJRVJSKCIlcyBzdXNwZW5kIGZhaWxlZFxuIiwgaGNkX25hbWUpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgUmVzdW1lIHBsYXRmb3JtIGRldmljZQorKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcGhhc2UpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJVkRCRygiJXM6ICBzdGF0ZSAleCwgcGhhc2UgJXhcbiIsIF9fZnVuY19fLCBkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLAorCSAgICAgcGhhc2UpOworCWlmIChwaGFzZSAhPSBSRVNVTUVfUE9XRVJfT04pCisJCXJldHVybiAwOworCisJcmV0ID0gdXNiX3Jlc3VtZV9kZXZpY2UoaGNkLT5zZWxmLnJvb3RfaHViKTsKKwlpZiAoIXJldCkgeworCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwkJVkRCRygiJXMgcmVzdW1lZFxuIiwgKGNoYXIgKiloY2RfbmFtZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUJaXNwMTE2eF9zdXNwZW5kICAgIE5VTEwKKyNkZWZpbmUJaXNwMTE2eF9yZXN1bWUgICAgIE5VTEwKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpc3AxMTZ4X2RyaXZlciA9IHsKKwkubmFtZSA9IChjaGFyICopaGNkX25hbWUsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBpc3AxMTZ4X3Byb2JlLAorCS5yZW1vdmUgPSBpc3AxMTZ4X3JlbW92ZSwKKwkuc3VzcGVuZCA9IGlzcDExNnhfc3VzcGVuZCwKKwkucmVzdW1lID0gaXNwMTE2eF9yZXN1bWUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2luaXQgaXNwMTE2eF9pbml0KHZvaWQpCit7CisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCUlORk8oImRyaXZlciAlcywgJXNcbiIsIGhjZF9uYW1lLCBEUklWRVJfVkVSU0lPTik7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaXNwMTE2eF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpc3AxMTZ4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNwMTE2eF9jbGVhbnVwKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmlzcDExNnhfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQoaXNwMTE2eF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC5oIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NzM0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC5oCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogSVNQMTE2eCByZWdpc3RlciBkZWNsYXJhdGlvbnMgYW5kIEhDRCBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgT2xhdiBLb25nYXMgPG9rQGFydGVjZGVzaWduLmVlPgorICogUG9ydGlvbnM6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTG90aGFyIFdhc3NtYW5uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUHNpb24gVGVrbG9naXgKKyAqIENvcHlyaWdodCAoQykgMjAwNCBEYXZpZCBCcm93bmVsbAorICovCisKKy8qIHVzIG9mIDFtcyBmcmFtZSAqLworI2RlZmluZSAgTUFYX0xPQURfTElNSVQJCTg1MAorCisvKiBGdWxsIHNwZWVkOiBtYXggIyBvZiBieXRlcyB0byB0cmFuc2ZlciBmb3IgYSBzaW5nbGUgdXJiCisgICBhdCBhIHRpbWUgbXVzdCBiZSA8IDEwMjQgJiYgbXVzdCBiZSBtdWx0aXBsZSBvZiA2NC4KKyAgIDgzMiBhbGxvd3MgdHJhbnNmZXJpbmcgNGtpQiB3aXRoaW4gNSBmcmFtZXMuICovCisjZGVmaW5lIE1BWF9UUkFOU0ZFUl9TSVpFX0ZVTExTUEVFRAk4MzIKKworLyogTG93IHNwZWVkOiB0aGVyZSBpcyBubyByZWFzb24gdG8gc2NoZWR1bGUgaW4gdmVyeSBiaWcKKyAgIGNodW5rczsgb2Z0ZW4gdGhlIHJlcXVlc3RlZCBsb25nIHRyYW5zZmVycyBhcmUgZm9yCisgICBzdHJpbmcgZGVzY3JpcHRvcnMgY29udGFpbmluZyBzaG9ydCBzdHJpbmdzLiAqLworI2RlZmluZSBNQVhfVFJBTlNGRVJfU0laRV9MT1dTUEVFRAk2NAorCisvKiBCeXRldGltZSAodXMpLCBhIHJvdWdoIGluZGljYXRpb24gb2YgaG93IG11Y2ggdGltZSBpdAorICAgd291bGQgdGFrZSB0byB0cmFuc2ZlciBhIGJ5dGUgb2YgdXNlZnVsIGRhdGEgb3ZlciBVU0IgKi8KKyNkZWZpbmUgQllURV9USU1FX0ZVTExTUEVFRAkxCisjZGVmaW5lIEJZVEVfVElNRV9MT1dTUEVFRAkyMAorCisvKiBCdWZmZXIgc2l6ZXMgKi8KKyNkZWZpbmUgSVNQMTE2eF9CVUZfU0laRQk0MDk2CisjZGVmaW5lIElTUDExNnhfSVRMX0JVRlNJWkUJMAorI2RlZmluZSBJU1AxMTZ4X0FUTF9CVUZTSVpFCSgoSVNQMTE2eF9CVUZfU0laRSkgLSAyKihJU1AxMTZ4X0lUTF9CVUZTSVpFKSkKKworI2RlZmluZSBJU1AxMTZ4X1dSSVRFX09GRlNFVAkweDgwCisKKy8qLS0tLS0tLS0tLS0tIElTUDExNnggcmVnaXN0ZXJzL2JpdHMgLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJSENSRVZJU0lPTgkweDAwCisjZGVmaW5lCUhDQ09OVFJPTAkweDAxCisjZGVmaW5lCQlIQ0NPTlRST0xfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIKKwkJCQkJCSAgIGZ1bmN0aW9uYWwgc3RhdGUgKi8KKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTRVQJKDAgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTVU1FCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX09QRVIJKDIgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfU1VTUEVORAkoMyA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZQkJSENDT05UUk9MX1JXRQkoMSA8PCAxMCkJLyogcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKyNkZWZpbmUJSENDTURTVEFUCTB4MDIKKyNkZWZpbmUJCUhDQ01EU1RBVF9IQ1IJKDEgPDwgMCkJLyogaG9zdCBjb250cm9sbGVyIHJlc2V0ICovCisjZGVmaW5lCQlIQ0NNRFNUQVRfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKyNkZWZpbmUJSENJTlRTVEFUCTB4MDMKKyNkZWZpbmUJCUhDSU5UX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZQkJSENJTlRfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUJCUhDSU5UX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lCQlIQ0lOVF9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lCQlIQ0lOVF9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lCQlIQ0lOVF9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lCQlIQ0lOVF9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDSU5UX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lCQlIQ0lOVF9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUhDSU5URU5CCTB4MDQKKyNkZWZpbmUJSENJTlRESVMJMHgwNQorI2RlZmluZQlIQ0ZNSU5UVkwJMHgwZAorI2RlZmluZQlIQ0ZNUkVNCQkweDBlCisjZGVmaW5lCUhDRk1OVU0JCTB4MGYKKyNkZWZpbmUJSENMU1RIUkVTSAkweDExCisjZGVmaW5lCUhDUkhERVNDQQkweDEyCisjZGVmaW5lCQlSSF9BX05EUAkoMHgzIDw8IDApCS8qICMgZG93bnN0cmVhbSBwb3J0cyAqLworI2RlZmluZQkJUkhfQV9QU00JKDEgPDwgOCkJLyogcG93ZXIgc3dpdGNoaW5nIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTlBTCSgxIDw8IDkpCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLworI2RlZmluZQkJUkhfQV9EVAkJKDEgPDwgMTApCS8qIGRldmljZSB0eXBlIChtYnopICovCisjZGVmaW5lCQlSSF9BX09DUE0JKDEgPDwgMTEpCS8qIG92ZXJjdXJyZW50IHByb3RlY3Rpb24KKwkJCQkJCSAgIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTk9DUAkoMSA8PCAxMikJLyogbm8gb3ZlcmN1cnJlbnQgcHJvdGVjdGlvbiAqLworI2RlZmluZQkJUkhfQV9QT1RQR1QJKDB4ZmYgPDwgMjQpCS8qIHBvd2VyIG9uIC0+IHBvd2VyIGdvb2QKKwkJCQkJCSAgIHRpbWUgKi8KKyNkZWZpbmUJSENSSERFU0NCCTB4MTMKKyNkZWZpbmUJCVJIX0JfRFIJCSgweGZmZmYgPDwgMCkJLyogZGV2aWNlIHJlbW92YWJsZSBmbGFncyAqLworI2RlZmluZQkJUkhfQl9QUENNCSgweGZmZmYgPDwgMTYpCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisjZGVmaW5lCUhDUkhTVEFUVVMJMHgxNAorI2RlZmluZQkJUkhfSFNfTFBTCSgxIDw8IDApCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyAqLworI2RlZmluZQkJUkhfSFNfT0NJCSgxIDw8IDEpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUJCVJIX0hTX0RSV0UJKDEgPDwgMTUpCS8qIGRldmljZSByZW1vdGUgd2FrZXVwCisJCQkJCQkgICBlbmFibGUgKi8KKyNkZWZpbmUJCVJIX0hTX0xQU0MJKDEgPDwgMTYpCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX0hTX09DSUMJKDEgPDwgMTcpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfSFNfQ1JXRQkoMSA8PCAzMSkJLyogY2xlYXIgcmVtb3RlIHdha2V1cAorCQkJCQkJICAgZW5hYmxlICovCisjZGVmaW5lCUhDUkhQT1JUMQkweDE1CisjZGVmaW5lCQlSSF9QU19DQ1MJKDEgPDwgMCkJLyogY3VycmVudCBjb25uZWN0IHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUEVTCSgxIDw8IDEpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUFNTCSgxIDw8IDIpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BPQ0kJKDEgPDwgMykJLyogcG9ydCBvdmVyIGN1cnJlbnQKKwkJCQkJCSAgIGluZGljYXRvciAqLworI2RlZmluZQkJUkhfUFNfUFJTCSgxIDw8IDQpCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QUFMJKDEgPDwgOCkJLyogcG9ydCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX0xTREEJKDEgPDwgOSkJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLworI2RlZmluZQkJUkhfUFNfQ1NDCSgxIDw8IDE2KQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BFU0MJKDEgPDwgMTcpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BTU0MJKDEgPDwgMTgpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfT0NJQwkoMSA8PCAxOSkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvcgorCQkJCQkJICAgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19QUlNDCSgxIDw8IDIwKQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDUkhQT1JUX0NMUk1BU0sJKDB4MWYgPDwgMTYpCisjZGVmaW5lCUhDUkhQT1JUMgkweDE2CisjZGVmaW5lCUhDSFdDRkcJCTB4MjAKKyNkZWZpbmUJCUhDSFdDRkdfMTVLUlNFTAkJKDEgPDwgMTIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0NMS05PVFNUT1AJKDEgPDwgMTEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0FOQUxPR19PQwkoMSA8PCAxMCkKKyNkZWZpbmUJCUhDSFdDRkdfREFDS19NT0RFCSgxIDw8IDgpCisjZGVmaW5lCQlIQ0hXQ0ZHX0VPVF9QT0wJCSgxIDw8IDcpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RBQ0tfUE9MCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RSRVFfUE9MCSgxIDw8IDUpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RCV0lEVEhfTUFTSwkoMHgwMyA8PCAzKQorI2RlZmluZQkJSENIV0NGR19EQldJRFRIKG4pCSgoKG4pIDw8IDMpICYgSENIV0NGR19EQldJRFRIX01BU0spCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9QT0wJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9UUklHR0VSCSgxIDw8IDEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9FTkFCTEUJKDEgPDwgMCkKKyNkZWZpbmUJSENETUFDRkcJMHgyMQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOX01BU0sJKDB4MDMgPDwgNSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTihuKQkoKChuKSA8PCA1KSAmIEhDRE1BQ0ZHX0JVUlNUX0xFTl9NQVNLKQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOXzEJSENETUFDRkdfQlVSU1RfTEVOKDApCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fNAlIQ0RNQUNGR19CVVJTVF9MRU4oMSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl84CUhDRE1BQ0ZHX0JVUlNUX0xFTigyKQorI2RlZmluZQkJSENETUFDRkdfRE1BX0VOQUJMRQkoMSA8PCA0KQorI2RlZmluZQkJSENETUFDRkdfQlVGX1RZUEVfTUFTSwkoMHgwNyA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfQ1RSX1NFTAkoMSA8PCAyKQorI2RlZmluZQkJSENETUFDRkdfSVRMQVRMX1NFTAkoMSA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfRE1BX1JXX1NFTEVDVAkoMSA8PCAwKQorI2RlZmluZQlIQ1hGRVJDVFIJMHgyMgorI2RlZmluZQlIQ3VQSU5UCQkweDI0CisjZGVmaW5lCQlIQ3VQSU5UX1NPRgkJKDEgPDwgMCkKKyNkZWZpbmUJCUhDdVBJTlRfQVRMCQkoMSA8PCAxKQorI2RlZmluZQkJSEN1UElOVF9BSUlFT1QJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ3VQSU5UX09QUgkJKDEgPDwgNCkKKyNkZWZpbmUJCUhDdVBJTlRfU1VTUAkJKDEgPDwgNSkKKyNkZWZpbmUJCUhDdVBJTlRfQ0xLUkRZCQkoMSA8PCA2KQorI2RlZmluZQlIQ3VQSU5URU5CCTB4MjUKKyNkZWZpbmUJSENDSElQSUQJMHgyNworI2RlZmluZQkJSENDSElQSURfTUFTSwkJMHhmZjAwCisjZGVmaW5lCQlIQ0NISVBJRF9NQUdJQwkJMHg2MTAwCisjZGVmaW5lCUhDU0NSQVRDSAkweDI4CisjZGVmaW5lCUhDU1dSRVMJCTB4MjkKKyNkZWZpbmUJCUhDU1dSRVNfTUFHSUMJCTB4MDBmNgorI2RlZmluZQlIQ0lUTEJVRkxFTgkweDJhCisjZGVmaW5lCUhDQVRMQlVGTEVOCTB4MmIKKyNkZWZpbmUJSENCVUZTVEFUCTB4MmMKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwwX0ZVTEwJKDEgPDwgMCkKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwxX0ZVTEwJKDEgPDwgMSkKKyNkZWZpbmUJCUhDQlVGU1RBVF9BVExfRlVMTAkoMSA8PCAyKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDBfRE9ORQkoMSA8PCAzKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDFfRE9ORQkoMSA8PCA0KQorI2RlZmluZQkJSENCVUZTVEFUX0FUTF9ET05FCSgxIDw8IDUpCisjZGVmaW5lCUhDUkRJVEwwTEVOCTB4MmQKKyNkZWZpbmUJSENSRElUTDFMRU4JMHgyZQorI2RlZmluZQlIQ0lUTFBPUlQJMHg0MAorI2RlZmluZQlIQ0FUTFBPUlQJMHg0MQorCisvKiBQaGlsaXBzIHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBwdGQgeworCXUxNiBjb3VudDsKKyNkZWZpbmUJUFREX0NPVU5UX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX1RPR0dMRV9NU0sJKDEgPDwgMTApCisjZGVmaW5lCVBURF9BQ1RJVkVfTVNLCSgxIDw8IDExKQorI2RlZmluZQlQVERfQ0NfTVNLCSgweGYgPDwgMTIpCisJdTE2IG1wczsKKyNkZWZpbmUJUFREX01QU19NU0sJKDB4M2ZmIDw8IDApCisjZGVmaW5lCVBURF9TUERfTVNLCSgxIDw8IDEwKQorI2RlZmluZQlQVERfTEFTVF9NU0sJKDEgPDwgMTEpCisjZGVmaW5lCVBURF9FUF9NU0sJKDB4ZiA8PCAxMikKKwl1MTYgbGVuOworI2RlZmluZQlQVERfTEVOX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX0RJUl9NU0sJKDMgPDwgMTApCisjZGVmaW5lCVBURF9ESVJfU0VUVVAJKDApCisjZGVmaW5lCVBURF9ESVJfT1VUCSgxKQorI2RlZmluZQlQVERfRElSX0lOCSgyKQorI2RlZmluZQlQVERfQjVfNV9NU0sJKDEgPDwgMTMpCisJdTE2IGZhZGRyOworI2RlZmluZQlQVERfRkFfTVNLCSgweDdmIDw8IDApCisjZGVmaW5lCVBURF9GTVRfTVNLCSgxIDw8IDcpCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoMikpKTsKKworLyogUFREIGFjY2Vzc29yIG1hY3Jvcy4gKi8KKyNkZWZpbmUgUFREX0dFVF9DT1VOVChwKQkoKChwKS0+Y291bnQgJiBQVERfQ09VTlRfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfQ09VTlQodikJCSgoKHYpIDw8IDApICYgUFREX0NPVU5UX01TSykKKyNkZWZpbmUgUFREX0dFVF9UT0dHTEUocCkJKCgocCktPmNvdW50ICYgUFREX1RPR0dMRV9NU0spID4+IDEwKQorI2RlZmluZSBQVERfVE9HR0xFKHYpCQkoKCh2KSA8PCAxMCkgJiBQVERfVE9HR0xFX01TSykKKyNkZWZpbmUgUFREX0dFVF9BQ1RJVkUocCkJKCgocCktPmNvdW50ICYgUFREX0FDVElWRV9NU0spID4+IDExKQorI2RlZmluZSBQVERfQUNUSVZFKHYpCQkoKCh2KSA8PCAxMSkgJiBQVERfQUNUSVZFX01TSykKKyNkZWZpbmUgUFREX0dFVF9DQyhwKQkJKCgocCktPmNvdW50ICYgUFREX0NDX01TSykgPj4gMTIpCisjZGVmaW5lIFBURF9DQyh2KQkJKCgodikgPDwgMTIpICYgUFREX0NDX01TSykKKyNkZWZpbmUgUFREX0dFVF9NUFMocCkJCSgoKHApLT5tcHMgJiBQVERfTVBTX01TSykgPj4gMCkKKyNkZWZpbmUgUFREX01QUyh2KQkJKCgodikgPDwgMCkgJiBQVERfTVBTX01TSykKKyNkZWZpbmUgUFREX0dFVF9TUEQocCkJCSgoKHApLT5tcHMgJiBQVERfU1BEX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9TUEQodikJCSgoKHYpIDw8IDEwKSAmIFBURF9TUERfTVNLKQorI2RlZmluZSBQVERfR0VUX0xBU1QocCkJCSgoKHApLT5tcHMgJiBQVERfTEFTVF9NU0spID4+IDExKQorI2RlZmluZSBQVERfTEFTVCh2KQkJKCgodikgPDwgMTEpICYgUFREX0xBU1RfTVNLKQorI2RlZmluZSBQVERfR0VUX0VQKHApCQkoKChwKS0+bXBzICYgUFREX0VQX01TSykgPj4gMTIpCisjZGVmaW5lIFBURF9FUCh2KQkJKCgodikgPDwgMTIpICYgUFREX0VQX01TSykKKyNkZWZpbmUgUFREX0dFVF9MRU4ocCkJCSgoKHApLT5sZW4gJiBQVERfTEVOX01TSykgPj4gMCkKKyNkZWZpbmUgUFREX0xFTih2KQkJKCgodikgPDwgMCkgJiBQVERfTEVOX01TSykKKyNkZWZpbmUgUFREX0dFVF9ESVIocCkJCSgoKHApLT5sZW4gJiBQVERfRElSX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9ESVIodikJCSgoKHYpIDw8IDEwKSAmIFBURF9ESVJfTVNLKQorI2RlZmluZSBQVERfR0VUX0I1XzUocCkJCSgoKHApLT5sZW4gJiBQVERfQjVfNV9NU0spID4+IDEzKQorI2RlZmluZSBQVERfQjVfNSh2KQkJKCgodikgPDwgMTMpICYgUFREX0I1XzVfTVNLKQorI2RlZmluZSBQVERfR0VUX0ZBKHApCQkoKChwKS0+ZmFkZHIgJiBQVERfRkFfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfRkEodikJCSgoKHYpIDw8IDApICYgUFREX0ZBX01TSykKKyNkZWZpbmUgUFREX0dFVF9GTVQocCkJCSgoKHApLT5mYWRkciAmIFBURF9GTVRfTVNLKSA+PiA3KQorI2RlZmluZSBQVERfRk1UKHYpCQkoKCh2KSA8PCA3KSAmIFBURF9GTVRfTVNLKQorCisvKiAgSGFyZHdhcmUgdHJhbnNmZXIgc3RhdHVzIGNvZGVzIC0tIENDIGZyb20gcHRkLT5jb3VudCAqLworI2RlZmluZSBURF9DQ19OT0VSUk9SICAgICAgMHgwMAorI2RlZmluZSBURF9DQ19DUkMgICAgICAgICAgMHgwMQorI2RlZmluZSBURF9DQ19CSVRTVFVGRklORyAgMHgwMgorI2RlZmluZSBURF9DQ19EQVRBVE9HR0xFTSAgMHgwMworI2RlZmluZSBURF9DQ19TVEFMTCAgICAgICAgMHgwNAorI2RlZmluZSBURF9ERVZOT1RSRVNQICAgICAgMHgwNQorI2RlZmluZSBURF9QSURDSEVDS0ZBSUwgICAgMHgwNgorI2RlZmluZSBURF9VTkVYUEVDVEVEUElEICAgMHgwNworI2RlZmluZSBURF9EQVRBT1ZFUlJVTiAgICAgMHgwOAorI2RlZmluZSBURF9EQVRBVU5ERVJSVU4gICAgMHgwOQorICAgIC8qIDB4MEEsIDB4MEIgcmVzZXJ2ZWQgZm9yIGhhcmR3YXJlICovCisjZGVmaW5lIFREX0JVRkZFUk9WRVJSVU4gICAweDBDCisjZGVmaW5lIFREX0JVRkZFUlVOREVSUlVOICAweDBECisgICAgLyogMHgwRSwgMHgwRiByZXNlcnZlZCBmb3IgSENEICovCisjZGVmaW5lIFREX05PVEFDQ0VTU0VEICAgICAweDBGCisKKy8qIG1hcCBQVEQgc3RhdHVzIGNvZGVzIChDQykgdG8gZXJybm8gdmFsdWVzICovCitzdGF0aWMgY29uc3QgaW50IGNjX3RvX2Vycm9yWzE2XSA9IHsKKwkvKiBObyAgRXJyb3IgICovIDAsCisJLyogQ1JDIEVycm9yICAqLyAtRUlMU0VRLAorCS8qIEJpdCBTdHVmZiAgKi8gLUVQUk9UTywKKwkvKiBEYXRhIFRvZ2cgICovIC1FSUxTRVEsCisJLyogU3RhbGwgICAgICAqLyAtRVBJUEUsCisJLyogRGV2Tm90UmVzcCAqLyAtRVRJTUVET1VULAorCS8qIFBJRENoZWNrICAgKi8gLUVQUk9UTywKKwkvKiBVbkV4cFBJRCAgICovIC1FUFJPVE8sCisJLyogRGF0YU92ZXIgICAqLyAtRU9WRVJGTE9XLAorCS8qIERhdGFVbmRlciAgKi8gLUVSRU1PVEVJTywKKwkvKiAoZm9yIGh3KSAgICovIC1FSU8sCisJLyogKGZvciBodykgICAqLyAtRUlPLAorCS8qIEJ1ZmZlck92ZXIgKi8gLUVDT01NLAorCS8qIEJ1ZmZVbmRlciAgKi8gLUVOT1NSLAorCS8qIChmb3IgSENEKSAgKi8gLUVBTFJFQURZLAorCS8qIChmb3IgSENEKSAgKi8gLUVBTFJFQURZCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZQlMT0cyX1BFUklPRElDX1NJWkUJNQkvKiBhcmJpdHJhcnk7IHRoaXMgbWF0Y2hlcyBPSENJICovCisjZGVmaW5lCVBFUklPRElDX1NJWkUJCSgxIDw8IExPRzJfUEVSSU9ESUNfU0laRSkKKworc3RydWN0IGlzcDExNnggeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmhfcmVzdW1lOworCisJdm9pZCBfX2lvbWVtICphZGRyX3JlZzsKKwl2b2lkIF9faW9tZW0gKmRhdGFfcmVnOworCisJc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSAqYm9hcmQ7CisKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKwl1bnNpZ25lZCBsb25nIHN0YXQxLCBzdGF0Miwgc3RhdDQsIHN0YXQ4LCBzdGF0MTY7CisKKwkvKiBIQyByZWdpc3RlcnMgKi8KKwl1MzIgaW50ZW5iOwkJLyogIk9IQ0kiIGludGVycnVwdHMgKi8KKwl1MTYgaXJxZW5iOwkJLyogdVAgaW50ZXJydXB0cyAqLworCisJLyogUm9vdCBodWIgcmVnaXN0ZXJzICovCisJdTMyIHJoZGVzY2E7CisJdTMyIHJoZGVzY2I7CisJdTMyIHJoc3RhdHVzOworCXUzMiByaHBvcnRbMl07CisKKwkvKiBhc3luYyBzY2hlZHVsZTogY29udHJvbCwgYnVsayAqLworCXN0cnVjdCBsaXN0X2hlYWQgYXN5bmM7CisKKwkvKiBwZXJpb2RpYyBzY2hlZHVsZTogaW50ICovCisJdTE2IGxvYWRbUEVSSU9ESUNfU0laRV07CisJc3RydWN0IGlzcDExNnhfZXAgKnBlcmlvZGljW1BFUklPRElDX1NJWkVdOworCXVuc2lnbmVkIHBlcmlvZGljX2NvdW50OworCXUxNiBmbWluZGV4OworCisJLyogU2NoZWR1bGUgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisJc3RydWN0IGlzcDExNnhfZXAgKmF0bF9hY3RpdmU7CisJaW50IGF0bF9idWZsZW47CisJaW50IGF0bF9idWZzaHJ0OworCWludCBhdGxfbGFzdF9kaXI7CisJYXRvbWljX3QgYXRsX2ZpbmlzaGluZzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzcDExNnggKmhjZF90b19pc3AxMTZ4KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIChzdHJ1Y3QgaXNwMTE2eCAqKShoY2QtPmhjZF9wcml2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2hjZCAqaXNwMTE2eF90b19oY2Qoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWlzcDExNngsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7Cit9CisKK3N0cnVjdCBpc3AxMTZ4X2VwIHsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgcHRkIHB0ZDsKKworCXU4IG1heHBhY2tldDsKKwl1OCBlcG51bTsKKwl1OCBuZXh0cGlkOworCXUxNiBlcnJvcl9jb3VudDsKKwl1MTYgbGVuZ3RoOwkJLyogb2YgY3VycmVudCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiB0byBkYXRhYnVmICovCisJLyogcXVldWUgb2YgYWN0aXZlIEVQJ3MgKHRoZSBvbmVzIHNjaGVkdWxlZCBmb3IgdGhlCisJICAgY3VycmVudCBmcmFtZSkgKi8KKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqYWN0aXZlOworCisJLyogcGVyaW9kaWMgc2NoZWR1bGUgKi8KKwl1MTYgcGVyaW9kOworCXUxNiBicmFuY2g7CisJdTE2IGxvYWQ7CisJc3RydWN0IGlzcDExNnhfZXAgKm5leHQ7CisKKwkvKiBhc3luYyBzY2hlZHVsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc2NoZWR1bGU7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHN0dWZmLi4uKQkJcHJpbnRrKEtFUk5fREVCVUcgIjExNng6ICIgc3R1ZmYpCisjZWxzZQorI2RlZmluZSBEQkcoc3R1ZmYuLi4pCQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgVkVSQk9TRQorIyAgICBkZWZpbmUgVkRCRwkJREJHCisjZWxzZQorIyAgICBkZWZpbmUgVkRCRyhzdHVmZi4uLikJZG97fXdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBFUlIoc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9FUlIgIjExNng6ICIgc3R1ZmYpCisjZGVmaW5lIFdBUk4oc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9XQVJOSU5HICIxMTZ4OiAiIHN0dWZmKQorI2RlZmluZSBJTkZPKHN0dWZmLi4uKQkJcHJpbnRrKEtFUk5fSU5GTyAiMTE2eDogIiBzdHVmZikKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChVU0VfUExBVEZPUk1fREVMQVkpCisjaWYgZGVmaW5lZChVU0VfTkRFTEFZKQorI2Vycm9yIFVTRV9QTEFURk9STV9ERUxBWSBhbmQgVVNFX05ERUxBWSBzaW11bHRhbmVvdXNseSBkZWZpbmVkLgorI2VuZGlmCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQkoaCktPmJvYXJkLT5kZWxheSgJXAorCQkJCWlzcDExNnhfdG9faGNkKGgpLT5zZWxmLmNvbnRyb2xsZXIsZCkKKyNkZWZpbmUgaXNwMTE2eF9jaGVja19wbGF0Zm9ybV9kZWxheShoKQkoKGgpLT5ib2FyZC0+ZGVsYXkgPT0gTlVMTCkKKyNlbGlmIGRlZmluZWQoVVNFX05ERUxBWSkKKyNkZWZpbmUJaXNwMTE2eF9kZWxheShoLGQpCW5kZWxheShkKQorI2RlZmluZSBpc3AxMTZ4X2NoZWNrX3BsYXRmb3JtX2RlbGF5KGgpCTAKKyNlbHNlCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgaXNwMTE2eF9jaGVja19wbGF0Zm9ybV9kZWxheShoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lCUlSUV9URVNUKCkJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpCisjZWxzZQorI2RlZmluZQlJUlFfVEVTVCgpCWRve313aGlsZSgwKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2FkZHIoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHJlZykKK3sKKwlJUlFfVEVTVCgpOworCXdyaXRldyhyZWcgJiAweGZmLCBpc3AxMTZ4LT5hZGRyX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAzMDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF93cml0ZV9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgMTUwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHZhbCkKK3sKKwlfX3Jhd193cml0ZXcodmFsLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBpc3AxMTZ4X3JlYWRfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSByZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2RhdGEzMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTMyIHZhbCkKK3sKKwl3cml0ZXcodmFsICYgMHhmZmZmLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworCXdyaXRldyh2YWwgPj4gMTYsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGlzcDExNnhfcmVhZF9kYXRhMzIoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHZhbDsKKworCXZhbCA9ICh1MzIpIHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7CisJdmFsIHw9ICgodTMyKSByZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZykpIDw8IDE2OworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgMTUwKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBMZXQncyBrZWVwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgb3V0IG9mIGxpbmUuIEhpbnQ6CisgICB3ZSB3YWl0IGF0IGxlYXN0IDE1MCBucyBhdCBldmVyeSBhY2Nlc3MuCisqLworc3RhdGljIHUxNiBpc3AxMTZ4X3JlYWRfcmVnMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHJlZykKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnKTsKKwlyZXR1cm4gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKK30KKworc3RhdGljIHUzMiBpc3AxMTZ4X3JlYWRfcmVnMzIoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHJlZykKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnKTsKKwlyZXR1cm4gaXNwMTE2eF9yZWFkX2RhdGEzMihpc3AxMTZ4KTsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF93cml0ZV9yZWcxNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnLAorCQkJCXVuc2lnbmVkIHZhbCkKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnIHwgSVNQMTE2eF9XUklURV9PRkZTRVQpOworCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsICh1MTYpICh2YWwgJiAweGZmZmYpKTsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF93cml0ZV9yZWczMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnLAorCQkJCXVuc2lnbmVkIHZhbCkKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnIHwgSVNQMTE2eF9XUklURV9PRkZTRVQpOworCWlzcDExNnhfd3JpdGVfZGF0YTMyKGlzcDExNngsICh1MzIpIHZhbCk7Cit9CisKKyNkZWZpbmUgaXNwMTE2eF9zaG93X3JlZyhkLHIpIHsJCQkJCVwKKwlpZiAoKHIpIDwgMHgyMCkgewkJCSAgICAgICAgICAgICAgICBcCisJCURCRygiJS0xMnNbJTAyeF06ICUwOHhcbiIsICNyLAkJCVwKKwkJCXIsIGlzcDExNnhfcmVhZF9yZWczMihkLCByKSk7CQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCURCRygiJS0xMnNbJTAyeF06ICAgICAlMDR4XG4iLCAjciwJCVwKKwkJCXIsIGlzcDExNnhfcmVhZF9yZWcxNihkLCByKSk7CSAgICAJXAorCX0JCQkJCQkJXAorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF9zaG93X3JlZ3Moc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JFVklTSU9OKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDQ09OVFJPTCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0NNRFNUQVQpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENJTlRTVEFUKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDSU5URU5CKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDRk1JTlRWTCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0ZNUkVNKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDRk1OVU0pOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENMU1RIUkVTSCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENSSERFU0NCKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkhTVEFUVVMpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENSSFBPUlQxKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkhQT1JUMik7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0hXQ0ZHKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDRE1BQ0ZHKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDWEZFUkNUUik7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ3VQSU5UKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDdVBJTlRFTkIpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENDSElQSUQpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENTQ1JBVENIKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDSVRMQlVGTEVOKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDQVRMQlVGTEVOKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDQlVGU1RBVCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JESVRMMExFTik7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JESVRMMUxFTik7Cit9CisKKyNpZiBkZWZpbmVkKFVSQl9UUkFDRSkKKworI2RlZmluZSBQSVBFVFlQRShwaXBlKSAgKHsgY2hhciAqX19zOwkJCVwKKwlpZiAodXNiX3BpcGVjb250cm9sKHBpcGUpKQlfX3MgPSAiY3RybCI7CVwKKwllbHNlIGlmICh1c2JfcGlwZWludChwaXBlKSkJX19zID0gImludCI7CVwKKwllbHNlIGlmICh1c2JfcGlwZWJ1bGsocGlwZSkpCV9fcyA9ICJidWxrIjsJXAorCWVsc2UJCQkJX19zID0gImlzbyI7CVwKKwlfX3M7fSkKKyNkZWZpbmUgUElQRURJUihwaXBlKSAgICh7IHVzYl9waXBlaW4ocGlwZSkgPyAiaW4iIDogIm91dCI7IH0pCisjZGVmaW5lIFVSQl9OT1RTSE9SVCh1cmIpICh7ICh1cmIpLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9TSE9SVF9OT1RfT0sgPyBcCisJInNob3J0X25vdF9vayIgOiAiIjsgfSkKKworLyogcHJpbnQgZGVidWcgaW5mbyBhYm91dCB0aGUgVVJCICovCitzdGF0aWMgdm9pZCB1cmJfZGJnKHN0cnVjdCB1cmIgKnVyYiwgY2hhciAqbXNnKQoreworCXVuc2lnbmVkIGludCBwaXBlOworCisJaWYgKCF1cmIpIHsKKwkJREJHKCIlczogemVybyB1cmJcbiIsIG1zZyk7CisJCXJldHVybjsKKwl9CisJcGlwZSA9IHVyYi0+cGlwZTsKKwlEQkcoIiVzOiBGQSAlZCBlcCVkJXMgJXM6IGxlbiAlZC8lZCAlc1xuIiwgbXNnLAorCSAgICB1c2JfcGlwZWRldmljZShwaXBlKSwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkgICAgUElQRURJUihwaXBlKSwgUElQRVRZUEUocGlwZSksCisJICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBVUkJfTk9UU0hPUlQodXJiKSk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgIHVyYl9kYmcodXJiLG1zZykgICBkb3t9d2hpbGUoMCkKKworI2VuZGlmCQkJCS8qICEgZGVmaW5lZChVUkJfVFJBQ0UpICovCisKKyNpZiBkZWZpbmVkKFBURF9UUkFDRSkKKworI2RlZmluZSBQVERfRElSX1NUUihwdGQpICAoe2NoYXIgX19jOwkJXAorCXN3aXRjaChQVERfR0VUX0RJUihwdGQpKXsJCVwKKwljYXNlIDA6ICBfX2MgPSAncyc7IGJyZWFrOwkJXAorCWNhc2UgMTogIF9fYyA9ICdvJzsgYnJlYWs7CQlcCisJZGVmYXVsdDogX19jID0gJ2knOyBicmVhazsJCVwKKwl9OyBfX2M7fSkKKworLyoKKyAgRHVtcCBQVEQgaW5mby4gVGhlIGNvZGUgZG9jdW1lbnRzIHRoZSBmb3JtYXQKKyAgcGVyZmVjdGx5LCByaWdodCA6KQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZChzdHJ1Y3QgcHRkICpwdGQpCit7CisJcHJpbnRrKCJ0ZDogJXggJWQlYyVkICVkLCVkLCVkICAleCAleCV4JXhcbiIsCisJICAgICAgIFBURF9HRVRfQ0MocHRkKSwgUFREX0dFVF9GQShwdGQpLAorCSAgICAgICBQVERfRElSX1NUUihwdGQpLCBQVERfR0VUX0VQKHB0ZCksCisJICAgICAgIFBURF9HRVRfQ09VTlQocHRkKSwgUFREX0dFVF9MRU4ocHRkKSwgUFREX0dFVF9NUFMocHRkKSwKKwkgICAgICAgUFREX0dFVF9UT0dHTEUocHRkKSwgUFREX0dFVF9BQ1RJVkUocHRkKSwKKwkgICAgICAgUFREX0dFVF9TUEQocHRkKSwgUFREX0dFVF9MQVNUKHB0ZCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9wdGRfb3V0X2RhdGEoc3RydWN0IHB0ZCAqcHRkLCB1OCAqIGJ1ZikKK3sKKwlpbnQgazsKKworCWlmIChQVERfR0VUX0RJUihwdGQpICE9IFBURF9ESVJfSU4gJiYgUFREX0dFVF9MRU4ocHRkKSkgeworCQlwcmludGsoIi0+ICIpOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9MRU4ocHRkKTsgKytrKQorCQkJcHJpbnRrKCIlMDJ4ICIsICgodTggKikgYnVmKVtrXSk7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZF9pbl9kYXRhKHN0cnVjdCBwdGQgKnB0ZCwgdTggKiBidWYpCit7CisJaW50IGs7CisKKwlpZiAoUFREX0dFVF9ESVIocHRkKSA9PSBQVERfRElSX0lOICYmIFBURF9HRVRfQ09VTlQocHRkKSkgeworCQlwcmludGsoIjwtICIpOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9DT1VOVChwdGQpOyArK2spCisJCQlwcmludGsoIiUwMnggIiwgKCh1OCAqKSBidWYpW2tdKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwlpZiAoUFREX0dFVF9MQVNUKHB0ZCkpCisJCXByaW50aygiLVxuIik7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgZHVtcF9wdGQocHRkKSAgICAgICAgICAgICAgIGRve313aGlsZSgwKQorI2RlZmluZSBkdW1wX3B0ZF9pbl9kYXRhKHB0ZCxidWYpICAgZG97fXdoaWxlKDApCisjZGVmaW5lIGR1bXBfcHRkX291dF9kYXRhKHB0ZCxidWYpICBkb3t9d2hpbGUoMCkKKworI2VuZGlmCQkJCS8qICEgZGVmaW5lZChQVERfVFJBQ0UpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKaW5kZXggMWUyN2YxMC4uNjhkZWNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwpAQCAtOTUsMTIgKzk1LDExIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAgLyogZm9yIGluX2ludGVycnVwdCAoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYl9vdGcuaD4KLSNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+IAotI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4gICAgLyogbmVlZGVkIGJ5IG9oY2ktbWVtLmMgd2hlbiBubyBQQ0kgKi8KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0xMDgsOCArMTA3LDkgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAiLi4vY29yZS9oY2QuaCIKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMjAwNCBOb3YgMDgiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIyMDA1IEFwcmlsIDIyIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJSb21hbiBXZWlzc2dhZXJiZXIsIERhdmlkIEJyb3duZWxsIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIDEuMSAnT3BlbicgSG9zdCBDb250cm9sbGVyIChPSENJKSBEcml2ZXIiCiAKQEAgLTE0MSw2ICsxNDEsNyBAQAogc3RhdGljIHZvaWQgb2hjaV9kdW1wIChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2ksIGludCB2ZXJib3NlKTsKIHN0YXRpYyBpbnQgb2hjaV9pbml0IChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kpOwogc3RhdGljIHZvaWQgb2hjaV9zdG9wIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKK3N0YXRpYyBpbnQgb2hjaV9yZWJvb3QgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nICwgdm9pZCAqKTsKIAogI2luY2x1ZGUgIm9oY2ktaHViLmMiCiAjaW5jbHVkZSAib2hjaS1kYmcuYyIKQEAgLTE3OSw3ICsxODAsNyBAQAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAlzdHJ1Y3QgdXJiCSp1cmIsCi0JaW50CQltZW1fZmxhZ3MKKwl1bnNpZ25lZAltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBvaGNpX2hjZAkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCXN0cnVjdCBlZAkqZWQ7CkBAIC00MjAsNiArNDIxLDIzIEBACiAJb2hjaV93cml0ZWwgKG9oY2ksIG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKIH0KIAorLyogcmVib290IG5vdGlmaWVyIGZvcmNpYmx5IGRpc2FibGVzIElSUXMgYW5kIERNQSwgaGVscGluZyBrZXhlYyBhbmQKKyAqIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBuZXh0IHNvZnR3YXJlIG1heSBleHBlY3QgY2xlYW4gc3RhdGUgZnJvbSB0aGUKKyAqICJmaXJtd2FyZSIuICB0aGlzIGlzIGJ1cy1uZXV0cmFsLCB1bmxpa2Ugc2h1dGRvd24oKSBtZXRob2RzLgorICovCitzdGF0aWMgaW50CitvaGNpX3JlYm9vdCAoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpibG9jaywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICpudWxsKQoreworCXN0cnVjdCBvaGNpX2hjZCAqb2hjaTsKKworCW9oY2kgPSBjb250YWluZXJfb2YgKGJsb2NrLCBzdHJ1Y3Qgb2hjaV9oY2QsIHJlYm9vdF9ub3RpZmllcik7CisJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisJb2hjaV91c2JfcmVzZXQgKG9oY2kpOworCS8qIGZsdXNoIHRoZSB3cml0ZXMgKi8KKwkodm9pZCkgb2hjaV9yZWFkbCAob2hjaSwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCXJldHVybiAwOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiAgKiBIQyBmdW5jdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00ODcsMTMgKzUwNSwxMCBAQAogLyogU3RhcnQgYW4gT0hDSSBjb250cm9sbGVyLCBzZXQgdGhlIEJVUyBvcGVyYXRpb25hbAogICogcmVzZXRzIFVTQiBhbmQgY29udHJvbGxlcgogICogZW5hYmxlIGludGVycnVwdHMgCi0gKiBjb25uZWN0IHRoZSB2aXJ0dWFsIHJvb3QgaHViCiAgKi8KIHN0YXRpYyBpbnQgb2hjaV9ydW4gKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSkKIHsKICAgCXUzMgkJCW1hc2ssIHRlbXA7Ci0gIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKLSAgCXN0cnVjdCB1c2JfYnVzCQkqYnVzOwogCWludAkJCWZpcnN0ID0gb2hjaS0+Zm1pbnRlcnZhbCA9PSAwOwogCiAJZGlzYWJsZSAob2hjaSk7CkBAIC02NTQsMzcgKzY2OSwxNSBAQAogCiAJLy8gUE9UUEdUIGRlbGF5IGlzIGJpdHMgMjQtMzEsIGluIDIgbXMgdW5pdHMuCiAJbWRlbGF5ICgodGVtcCA+PiAyMykgJiAweDFmZSk7Ci0JYnVzID0gJm9oY2lfdG9faGNkKG9oY2kpLT5zZWxmOwogCW9oY2lfdG9faGNkKG9oY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CiAKIAlvaGNpX2R1bXAgKG9oY2ksIDEpOwogCi0JdWRldiA9IGJ1cy0+cm9vdF9odWI7Ci0JaWYgKHVkZXYpIHsKLQkJcmV0dXJuIDA7Ci0JfQotIAotCS8qIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KLQl1ZGV2ID0gdXNiX2FsbG9jX2RldiAoTlVMTCwgYnVzLCAwKTsKLQlpZiAoIXVkZXYpIHsKLQkJZGlzYWJsZSAob2hjaSk7Ci0JCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9IQ0ZTOwotCQlvaGNpX3dyaXRlbCAob2hjaSwgb2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAob2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWIgPT0gTlVMTCkgeworCQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZvaGNpLT5yZWJvb3Rfbm90aWZpZXIpOworCQljcmVhdGVfZGVidWdfZmlsZXMgKG9oY2kpOwogCX0KIAotCXVkZXYtPnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7Ci0JaWYgKHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIgKHVkZXYsIG9oY2lfdG9faGNkKG9oY2kpKSAhPSAwKSB7Ci0JCXVzYl9wdXRfZGV2ICh1ZGV2KTsKLQkJZGlzYWJsZSAob2hjaSk7Ci0JCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9IQ0ZTOwotCQlvaGNpX3dyaXRlbCAob2hjaSwgb2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWYgKG9oY2ktPnBvd2VyX2J1ZGdldCkKLQkJaHViX3NldF9wb3dlcl9idWRnZXQodWRldiwgb2hjaS0+cG93ZXJfYnVkZ2V0KTsKLQotCWNyZWF0ZV9kZWJ1Z19maWxlcyAob2hjaSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4MSw2ICs3NzQsNyBAQAogCW9oY2lfd3JpdGVsIChvaGNpLCBPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOwogCQogCXJlbW92ZV9kZWJ1Z19maWxlcyAob2hjaSk7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZvaGNpLT5yZWJvb3Rfbm90aWZpZXIpOwogCW9oY2lfbWVtX2NsZWFudXAgKG9oY2kpOwogCWlmIChvaGNpLT5oY2NhKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50IChoY2QtPnNlbGYuY29udHJvbGxlciwgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKaW5kZXggZTJmYzQxMi4uODNjYTQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwpAQCAtNDE5LDEwICs0MTksMTEgQEAKIAogCS8qIHR3byBiaXRtYXBzOiAgcG9ydHMgcmVtb3ZhYmxlLCBhbmQgdXNiIDEuMCBsZWdhY3kgUG9ydFB3ckN0cmxNYXNrICovCiAJcmggPSByb290aHViX2IgKG9oY2kpOworCW1lbXNldChkZXNjLT5iaXRtYXAsIDB4ZmYsIHNpemVvZihkZXNjLT5iaXRtYXApKTsKIAlkZXNjLT5iaXRtYXAgWzBdID0gcmggJiBSSF9CX0RSOwogCWlmIChwb3J0cyA+IDcpIHsKIAkJZGVzYy0+Yml0bWFwIFsxXSA9IChyaCAmIFJIX0JfRFIpID4+IDg7Ci0JCWRlc2MtPmJpdG1hcCBbMl0gPSBkZXNjLT5iaXRtYXAgWzNdID0gMHhmZjsKKwkJZGVzYy0+Yml0bWFwIFsyXSA9IDB4ZmY7CiAJfSBlbHNlCiAJCWRlc2MtPmJpdG1hcCBbMV0gPSAweGZmOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jCmluZGV4IGU1NTY4MmIuLmZkM2M0ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1tZW0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlzcGluX2xvY2tfaW5pdCAoJm9oY2ktPmxvY2spOwogCUlOSVRfTElTVF9IRUFEICgmb2hjaS0+cGVuZGluZyk7CiAJSU5JVF9XT1JLICgmb2hjaS0+cmhfcmVzdW1lLCBvaGNpX3JoX3Jlc3VtZSwgb2hjaV90b19oY2Qob2hjaSkpOworCW9oY2ktPnJlYm9vdF9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gb2hjaV9yZWJvb3Q7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04Myw3ICs4NCw3IEBACiAKIC8qIFREcyAuLi4gKi8KIHN0YXRpYyBzdHJ1Y3QgdGQgKgotdGRfYWxsb2MgKHN0cnVjdCBvaGNpX2hjZCAqaGMsIGludCBtZW1fZmxhZ3MpCit0ZF9hbGxvYyAoc3RydWN0IG9oY2lfaGNkICpoYywgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWRtYV9hZGRyX3QJZG1hOwogCXN0cnVjdCB0ZAkqdGQ7CkBAIC0xMTcsNyArMTE4LDcgQEAKIAogLyogRURzIC4uLiAqLwogc3RhdGljIHN0cnVjdCBlZCAqCi1lZF9hbGxvYyAoc3RydWN0IG9oY2lfaGNkICpoYywgaW50IG1lbV9mbGFncykKK2VkX2FsbG9jIChzdHJ1Y3Qgb2hjaV9oY2QgKmhjLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJZG1hX2FkZHJfdAlkbWE7CiAJc3RydWN0IGVkCSplZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCmluZGV4IDhhYWI1OTAuLjVjZGU3NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJaWYgKGNvbmZpZy0+b3RnKSB7CiAJCW9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLm90Z19wb3J0ID0gY29uZmlnLT5vdGc7CiAJCS8qIGRlZmF1bHQvbWluaW11bSBPVEcgcG93ZXIgYnVkZ2V0OiAgOCBtQSAqLwotCQlvaGNpLT5wb3dlcl9idWRnZXQgPSA4OworCQlvaGNpX3RvX2hjZChvaGNpKS0+cG93ZXJfYnVkZ2V0ID0gODsKIAl9CiAKIAkvKiBib2FyZHMgY2FuIHVzZSBPVEcgdHJhbnNjZWl2ZXJzIGluIG5vbi1PVEcgbW9kZXMgKi8KQEAgLTIzMCw3ICsyMzAsNyBAQAogCiAJCS8qIFRQUzIwNDUgc3dpdGNoIGZvciBpbnRlcm5hbCB0cmFuc2NlaXZlciAocG9ydCAxKSAqLwogCQlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7Ci0JCQlvaGNpLT5wb3dlcl9idWRnZXQgPSAyNTA7CisJCQlvaGNpX3RvX2hjZChvaGNpKS0+cG93ZXJfYnVkZ2V0ID0gMjUwOwogCiAJCQlyaCAmPSB+UkhfQV9OT0NQOwogCkBAIC00NTYsMzQgKzQ1NiwyMiBAQAogCiAjaWZkZWYJQ09ORklHX1BNCiAKLS8qIHN0YXRlcyBtYXRjaCBQQ0kgdXNhZ2UsIGFsd2F5cyBzdXNwZW5kaW5nIHRoZSByb290IGh1YiBleGNlcHQgdGhhdAotICogNCB+PSBEM2NvbGQgKEFDUEkgRDMpIHdpdGggY2xvY2sgb2ZmIChyZXN1bWUgc2VlcyByZXNldCkuCi0gKgotICogRklYTUU6IGFib3ZlIGNvbW1lbnQgaXMgbm90IHJpZ2h0LCBhbmQgY29kZSBpcyB3cm9uZywgdG9vIDotKC4KLSAqLwotCi1zdGF0aWMgaW50IG9oY2lfb21hcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IG9oY2lfb21hcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UsIHUzMiBsZXZlbCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJaW50CQlzdGF0dXMgPSAtRUlOVkFMOwogCiAJaWYgKGxldmVsICE9IFNVU1BFTkRfUE9XRVJfRE9XTikKIAkJcmV0dXJuIDA7Ci0JaWYgKHN0YXRlIDw9IGRldi0+cG93ZXIucG93ZXJfc3RhdGUpCi0JCXJldHVybiAwOwogCi0JZGV2X2RiZyhkZXYsICJzdXNwZW5kIHRvICVkXG4iLCBzdGF0ZSk7CiAJZG93bigmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAJc3RhdHVzID0gb2hjaV9odWJfc3VzcGVuZChvaGNpX3RvX2hjZChvaGNpKSk7CiAJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChzdGF0ZSA+PSA0KSB7Ci0JCQlvbWFwX29oY2lfY2xvY2tfcG93ZXIoMCk7Ci0JCQlvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c3RhdGUgPQotCQkJCQlVU0JfU1RBVEVfU1VTUEVOREVEOwotCQkJc3RhdGUgPSA0OwotCQl9CisJCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKKwkJb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnN0YXRlID0KKwkJCVVTQl9TVEFURV9TVVNQRU5ERUQ7CiAJCW9oY2lfdG9faGNkKG9oY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKLQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCX0KIAl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTQ5NywyOSArNDg1LDIwIEBACiAJaWYgKGxldmVsICE9IFJFU1VNRV9QT1dFUl9PTikKIAkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKGRldi0+cG93ZXIucG93ZXJfc3RhdGUpIHsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQotCQkJbXNsZWVwKDUpOwotCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKLQkJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDEpOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoZGV2LCAicmVzdW1lIGZyb20gJWRcbiIsIGRldi0+cG93ZXIucG93ZXJfc3RhdGUpOworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKKwkJbXNsZWVwKDUpOworCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOworCW9tYXBfb2hjaV9jbG9ja19wb3dlcigxKTsKICNpZmRlZglDT05GSUdfVVNCX1NVU1BFTkQKLQkJLyogZ2V0IGV4dHJhIGNsZWFudXAgZXZlbiBpZiByZW1vdGUgd2FrZXVwIGlzbid0IGluIHVzZSAqLwotCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZShvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yik7CisJLyogZ2V0IGV4dHJhIGNsZWFudXAgZXZlbiBpZiByZW1vdGUgd2FrZXVwIGlzbid0IGluIHVzZSAqLworCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKG9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViKTsKICNlbHNlCi0JCWRvd24oJm9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT5zZXJpYWxpemUpOwotCQlzdGF0dXMgPSBvaGNpX2h1Yl9yZXN1bWUob2hjaV90b19oY2Qob2hjaSkpOwotCQl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CisJZG93bigmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CisJc3RhdHVzID0gb2hjaV9odWJfcmVzdW1lKG9oY2lfdG9faGNkKG9oY2kpKTsKKwl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAjZW5kaWYKLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7Ci0JCWJyZWFrOwotCX0KKwlpZiAoc3RhdHVzID09IDApCisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwppbmRleCA1N2ZkMDdkLi5lZWRlNmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCkBAIC0xNCwxNCArMTQsMTEgQEAKICAqIFRoaXMgZmlsZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR1BMLgogICovCiAgCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaWZuZGVmIENPTkZJR19QTQotIwlkZWZpbmUgQ09ORklHX1BNCi0jZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIENPTkZJR19QQ0kKQEAgLTEzMiw3ICsxMjksNyBAQAogCS8qIGxldCB0aGluZ3Mgc2V0dGxlIGRvd24gYSBiaXQgKi8KIAltc2xlZXAgKDEwMCk7CiAJCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewogCSAgIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKm9mX25vZGU7CiAgCkBAIC0xNDEsNyArMTM4LDcgQEAKIAkJaWYgKG9mX25vZGUpCiAJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9VU0JfRU5BQkxFLCBvZl9ub2RlLCAwLCAwKTsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUxLDcgKzE0OCw3IEBACiAJc3RydWN0IG9oY2lfaGNkCQkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCWludAkJCXJldHZhbCA9IDA7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QUENfUE1BQwogCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKIApAQCAtMTYwLDcgKzE1Nyw3IEBACiAJCWlmIChvZl9ub2RlKQogCQkJcG1hY19jYWxsX2ZlYXR1cmUgKFBNQUNfRlRSX1VTQl9FTkFCTEUsIG9mX25vZGUsIDAsIDEpOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAJLyogcmVzdW1lIHJvb3QgaHViICovCiAJaWYgKHRpbWVfYmVmb3JlIChqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLmgKaW5kZXggMjJlMWFjMS4uNzFjZGQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLmgKQEAgLTM3MSw3ICszNzEsNiBAQAogCSAqIG90aGVyIGV4dGVybmFsIHRyYW5zY2VpdmVycyBzaG91bGQgYmUgc29mdHdhcmUtdHJhbnNwYXJlbnQgCiAJICovCiAJc3RydWN0IG90Z190cmFuc2NlaXZlcgkqdHJhbnNjZWl2ZXI7Ci0JdW5zaWduZWQJCXBvd2VyX2J1ZGdldDsKIAogCS8qCiAJICogbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHF1ZXVlIGRhdGEgc3RydWN0dXJlcwpAQCAtMzkwLDYgKzM4OSw3IEBACiAJdTMyCQkJZm1pbnRlcnZhbDsJCS8qIHNhdmVkIHJlZ2lzdGVyICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmhfcmVzdW1lOworCXN0cnVjdCBub3RpZmllcl9ibG9jawlyZWJvb3Rfbm90aWZpZXI7CiAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGZvciBIQyBidWdzICovCiAjZGVmaW5lCU9IQ0lfUVVJUktfQU1ENzU2CTB4MDEJCQkvKiBlcnJhdHVtICM0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYwppbmRleCA5OWQ0M2Y3Li43YTg5MGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKQEAgLTgxNSw3ICs4MTUsNyBAQAogCXN0cnVjdCB1c2JfaGNkCQkqaGNkLAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwLAogCXN0cnVjdCB1cmIJCSp1cmIsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKSB7CiAJc3RydWN0IHNsODExCQkqc2w4MTEgPSBoY2RfdG9fc2w4MTEoaGNkKTsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IHVyYi0+ZGV2OwpAQCAtMTU2MywyOSArMTU2MywxNSBAQAogc2w4MTFoX3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHNsODExCQkqc2w4MTEgPSBoY2RfdG9fc2w4MTEoaGNkKTsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAogCS8qIGNoaXAgaGFzIGJlZW4gcmVzZXQsIFZCVVMgcG93ZXIgaXMgb2ZmICovCi0KLQl1ZGV2ID0gdXNiX2FsbG9jX2RldihOVUxMLCAmaGNkLT5zZWxmLCAwKTsKLQlpZiAoIXVkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdWRldi0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKIAotCWlmIChzbDgxMS0+Ym9hcmQpCisJaWYgKHNsODExLT5ib2FyZCkgewogCQloY2QtPmNhbl93YWtldXAgPSBzbDgxMS0+Ym9hcmQtPmNhbl93YWtldXA7Ci0KLQlpZiAodXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1Yih1ZGV2LCBoY2QpICE9IDApIHsKLQkJdXNiX3B1dF9kZXYodWRldik7Ci0JCXNsODExaF9zdG9wKGhjZCk7Ci0JCXJldHVybiAtRU5PREVWOworCQloY2QtPnBvd2VyX2J1ZGdldCA9IHNsODExLT5ib2FyZC0+cG93ZXIgKiAyOwogCX0KIAotCWlmIChzbDgxMS0+Ym9hcmQgJiYgc2w4MTEtPmJvYXJkLT5wb3dlcikKLQkJaHViX3NldF9wb3dlcl9idWRnZXQodWRldiwgc2w4MTEtPmJvYXJkLT5wb3dlciAqIDIpOwotCiAJLyogZW5hYmxlIHBvd2VyIGFuZCBpbnRlcnVwdHMgKi8KIAlwb3J0X3Bvd2VyKHNsODExLCAxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCmluZGV4IDZlMTczMjYuLjM4YWViZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02OCwxMyArNjcsNiBAQAogCiBzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOwogCi1zdGF0aWMgaW50IGlycV9saXN0WzRdID0geyAtMSB9Owotc3RhdGljIGludCBpcnFfbGlzdF9jb3VudDsKLQotbW9kdWxlX3BhcmFtX2FycmF5KGlycV9saXN0LCBpbnQsICZpcnFfbGlzdF9jb3VudCwgMDQ0NCk7Ci0KLUlOVF9NT0RVTEVfUEFSTShpcnFfbWFzaywgMHhkZWI4KTsKLQogdHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKIAlkZXZfbGlua190CQlsaW5rOwogCWRldl9ub2RlX3QJCW5vZGU7CkBAIC0zNzMsNyArMzY1LDcgQEAKIAlsb2NhbF9pbmZvX3QgKmxvY2FsOwogCWRldl9saW5rX3QgKmxpbms7CiAJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0OwogCiAJbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxvY2FsKQpAQCAtMzg1LDExICszNzcsNiBAQAogCS8qIEluaXRpYWxpemUgKi8KIAlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKIAlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfSU5GTzJfVkFMSUR8SVJRX0xFVkVMX0lEOwotCWlmIChpcnFfbGlzdFswXSA9PSAtMSkKLQkJbGluay0+aXJxLklSUUluZm8yID0gaXJxX21hc2s7Ci0JZWxzZQotCQlmb3IgKGkgPSAwOyBpIDwgaXJxX2xpc3RfY291bnQ7IGkrKykKLQkJCWxpbmstPmlycS5JUlFJbmZvMiB8PSAxIDw8IGlycV9saXN0W2ldOwogCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKIAogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CkBAIC00MDEsMTEgKzM4OCw2IEBACiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAoZGV2X2luZm9fdCAqKSAmZHJpdmVyX25hbWU7CiAJY2xpZW50X3JlZy5BdHRyaWJ1dGVzID0gSU5GT19JT19DTElFTlQgfCBJTkZPX0NBUkRfU0hBUkU7Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNsODExX2NzX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDE4LDEzICs0MDAsMjEgQEAKIAlyZXR1cm4gbGluazsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNsODExX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzAxNSwgMHgwMDAxKSwgLyogUkFUT0MgVVNCIEhPU1QgQ0YrIENhcmQgKi8KKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHNsODExX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBzbDgxMV9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9IChjaGFyICopZHJpdmVyX25hbWUsCiAJfSwKIAkuYXR0YWNoCQk9IHNsODExX2NzX2F0dGFjaCwKKwkuZXZlbnQJCT0gc2w4MTFfY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBzbDgxMV9jc19kZXRhY2gsCisJLmlkX3RhYmxlCT0gc2w4MTFfaWRzLAogfTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1kZWJ1Zy5jCmluZGV4IDI0YzczYzUuLjQ1MzhhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1kZWJ1Zy5jCkBAIC0yMzcsNiArMjM3LDM3IEBACiAJcmV0dXJuIG91dCAtIGJ1ZjsKIH0KIAorc3RhdGljIGludCB1aGNpX3Nob3dfcm9vdF9odWJfc3RhdGUoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJY2hhciAqb3V0ID0gYnVmOworCWNoYXIgKnJoX3N0YXRlOworCisJLyogVHJ5IHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBtZW1vcnkgKi8KKwlpZiAobGVuIDwgNjApCisJCXJldHVybiAwOworCisJc3dpdGNoICh1aGNpLT5yaF9zdGF0ZSkgeworCSAgICBjYXNlIFVIQ0lfUkhfUkVTRVQ6CisJCXJoX3N0YXRlID0gInJlc2V0IjsJCWJyZWFrOworCSAgICBjYXNlIFVIQ0lfUkhfU1VTUEVOREVEOgorCQlyaF9zdGF0ZSA9ICJzdXNwZW5kZWQiOwkJYnJlYWs7CisJICAgIGNhc2UgVUhDSV9SSF9BVVRPX1NUT1BQRUQ6CisJCXJoX3N0YXRlID0gImF1dG8tc3RvcHBlZCI7CWJyZWFrOworCSAgICBjYXNlIFVIQ0lfUkhfUkVTVU1JTkc6CisJCXJoX3N0YXRlID0gInJlc3VtaW5nIjsJCWJyZWFrOworCSAgICBjYXNlIFVIQ0lfUkhfU1VTUEVORElORzoKKwkJcmhfc3RhdGUgPSAic3VzcGVuZGluZyI7CWJyZWFrOworCSAgICBjYXNlIFVIQ0lfUkhfUlVOTklORzoKKwkJcmhfc3RhdGUgPSAicnVubmluZyI7CQlicmVhazsKKwkgICAgY2FzZSBVSENJX1JIX1JVTk5JTkdfTk9ERVZTOgorCQlyaF9zdGF0ZSA9ICJydW5uaW5nLCBubyBkZXZzIjsJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXJoX3N0YXRlID0gIj8iOwkJCWJyZWFrOworCX0KKwlvdXQgKz0gc3ByaW50ZihvdXQsICJSb290LWh1YiBzdGF0ZTogJXNcbiIsIHJoX3N0YXRlKTsKKwlyZXR1cm4gb3V0IC0gYnVmOworfQorCiBzdGF0aWMgaW50IHVoY2lfc2hvd19zdGF0dXMoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBjaGFyICpidWYsIGludCBsZW4pCiB7CiAJY2hhciAqb3V0ID0gYnVmOwpAQCAtNDA4LDYgKzQzOSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWhjaS0+bG9jaywgZmxhZ3MpOwogCisJb3V0ICs9IHVoY2lfc2hvd19yb290X2h1Yl9zdGF0ZSh1aGNpLCBvdXQsIGxlbiAtIChvdXQgLSBidWYpKTsKIAlvdXQgKz0gc3ByaW50ZihvdXQsICJIQyBzdGF0dXNcbiIpOwogCW91dCArPSB1aGNpX3Nob3dfc3RhdHVzKHVoY2ksIG91dCwgbGVuIC0gKG91dCAtIGJ1ZikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggNDliZDgzZS4uMGQ1ZDI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtMTMsMTggKzEzLDEzIEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDAgWWdnZHJhc2lsIENvbXB1dGluZywgSW5jLiAocG9ydCBvZiBuZXcgUENJIGludGVyZmFjZQogICogICAgICAgICAgICAgICBzdXBwb3J0IGZyb20gdXNiLW9oY2kuYyBieSBBZGFtIFJpY2h0ZXIsIGFkYW1AeWdnZHJhc2lsLmNvbSkuCiAgKiAoQykgQ29weXJpZ2h0IDE5OTkgR3JlZ29yeSBQLiBTbWl0aCAoZnJvbSB1c2Itb2hjaS5jKQotICogKEMpIENvcHlyaWdodCAyMDA0IEFsYW4gU3Rlcm4sIHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHUKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1IEFsYW4gU3Rlcm4sIHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHUKICAqCiAgKiBJbnRlbCBkb2N1bWVudHMgdGhpcyBmYWlybHkgd2VsbCwgYW5kIGFzIGZhciBhcyBJIGtub3cgdGhlcmUKICAqIGFyZSBubyByb3lhbHRpZXMgb3IgYW55dGhpbmcgbGlrZSB0aGF0LCBidXQgZXZlbiBzbyB0aGVyZSBhcmUKICAqIHBlb3BsZSB3aG8gZGVjaWRlZCB0aGF0IHRoZXkgd2FudCB0byBkbyB0aGUgc2FtZSB0aGluZyBpbiBhCiAgKiBjb21wbGV0ZWx5IGRpZmZlcmVudCB3YXkuCiAgKgotICogV0FSTklORyEgVGhlIFVTQiBkb2N1bWVudGF0aW9uIGlzIGRvd25yaWdodCBldmlsLiBNb3N0IG9mIGl0Ci0gKiBpcyBqdXN0IGNyYXAsIHdyaXR0ZW4gYnkgYSBjb21taXR0ZWUuIFlvdSdyZSBiZXR0ZXIgb2ZmIGlnbm9yaW5nCi0gKiBtb3N0IG9mIGl0LCB0aGUgaW1wb3J0YW50IHN0dWZmIGlzOgotICogIC0gdGhlIGxvdy1sZXZlbCBwcm90b2NvbCAoZmFpcmx5IHNpbXBsZSBidXQgbG90cyBvZiBzbWFsbCBkZXRhaWxzKQotICogIC0gd29ya2luZyBhcm91bmQgdGhlIGhvcnJpZG5lc3Mgb2YgdGhlIHJlc3QKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC02NCw3ICs1OSw3IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4yIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuMyIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiTGludXMgJ0Zyb2RvIFJhYmJpdCcgVG9ydmFsZHMsIEpvaGFubmVzIEVyZGZlbHQsIFwKIFJhbmR5IER1bmxhcCwgR2VvcmcgQWNoZXIsIERldGkgRmxpZWdsLCBUaG9tYXMgU2FpbGVyLCBSb21hbiBXZWlzc2dhZXJiZXIsIFwKIEFsYW4gU3Rlcm4iCkBAIC04OSw4ICs4NCw5IEBACiAKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKnVoY2lfdXBfY2FjaGVwOwkvKiB1cmJfcHJpdiAqLwogCitzdGF0aWMgdm9pZCBzdXNwZW5kX3JoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgZW51bSB1aGNpX3JoX3N0YXRlIG5ld19zdGF0ZSk7CitzdGF0aWMgdm9pZCB3YWtldXBfcmgoc3RydWN0IHVoY2lfaGNkICp1aGNpKTsKIHN0YXRpYyB2b2lkIHVoY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSk7Ci1zdGF0aWMgdm9pZCBoY19zdGF0ZV90cmFuc2l0aW9ucyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpOwogCiAvKiBJZiBhIHRyYW5zZmVyIGlzIHN0aWxsIGFjdGl2ZSBhZnRlciB0aGlzIG11Y2ggdGltZSwgdHVybiBvZmYgRlNCUiAqLwogI2RlZmluZSBJRExFX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcyg1MCkKQEAgLTEwMSw3NyArOTcsMzEyIEBACiAvKiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBob2cgYWxsIG9mIHRoZSBiYW5kd2lkdGggKi8KICNkZWZpbmUgREVQVEhfSU5URVJWQUwgNQogCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdGFydF90aW1lcihzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJbW9kX3RpbWVyKCZ1aGNpLT5zdGFsbF90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7Cit9CisKICNpbmNsdWRlICJ1aGNpLWh1Yi5jIgogI2luY2x1ZGUgInVoY2ktZGVidWcuYyIKICNpbmNsdWRlICJ1aGNpLXEuYyIKIAotc3RhdGljIGludCBpbml0X3N0YWxsX3RpbWVyKHN0cnVjdCB1c2JfaGNkICpoY2QpOwotCi1zdGF0aWMgdm9pZCBzdGFsbF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIHB0cikKKy8qCisgKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaXMgY29tcGxldGVseSBpbmFjdGl2ZSwgdW5hYmxlIHRvCisgKiBnZW5lcmF0ZSBpbnRlcnJ1cHRzIG9yIGRvIERNQS4KKyAqLworc3RhdGljIHZvaWQgcmVzZXRfaGMoc3RydWN0IHVoY2lfaGNkICp1aGNpKQogewotCXN0cnVjdCB1c2JfaGNkICpoY2QgPSAoc3RydWN0IHVzYl9oY2QgKilwdHI7Ci0Jc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKLQlzdHJ1Y3QgdXJiX3ByaXYgKnVwOworCWludCBwb3J0OworCisJLyogVHVybiBvZmYgUElSUSBlbmFibGUgYW5kIFNNSSBlbmFibGUuICAoVGhpcyBhbHNvIHR1cm5zIG9mZiB0aGUKKwkgKiBCSU9TJ3MgVVNCIExlZ2FjeSBTdXBwb3J0LikgIFR1cm4gb2ZmIGFsbCB0aGUgUi9XQyBiaXRzIHRvby4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSksIFVTQkxFR1NVUCwKKwkJCVVTQkxFR1NVUF9SV0MpOworCisJLyogUmVzZXQgdGhlIEhDIC0gdGhpcyB3aWxsIGZvcmNlIHVzIHRvIGdldCBhCisJICogbmV3IG5vdGlmaWNhdGlvbiBvZiBhbnkgYWxyZWFkeSBjb25uZWN0ZWQKKwkgKiBwb3J0cyBkdWUgdG8gdGhlIHZpcnR1YWwgZGlzY29ubmVjdCB0aGF0IGl0CisJICogaW1wbGllcy4KKwkgKi8KKwlvdXR3KFVTQkNNRF9IQ1JFU0VULCB1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwltYigpOworCXVkZWxheSg1KTsKKwlpZiAoaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpICYgVVNCQ01EX0hDUkVTRVQpCisJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAiSENSRVNFVCBub3QgY29tcGxldGVkIHlldCFcbiIpOworCisJLyogSnVzdCB0byBiZSBzYWZlLCBkaXNhYmxlIGludGVycnVwdCByZXF1ZXN0cyBhbmQKKwkgKiBtYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaXMgc3RvcHBlZC4KKwkgKi8KKwlvdXR3KDAsIHVoY2ktPmlvX2FkZHIgKyBVU0JJTlRSKTsKKwlvdXR3KDAsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCisJLyogSENSRVNFVCBkb2Vzbid0IGFmZmVjdCB0aGUgU3VzcGVuZCwgUmVzZXQsIGFuZCBSZXN1bWUgRGV0ZWN0CisJICogYml0cyBpbiB0aGUgcG9ydCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzLgorCSAqIFdlIGhhdmUgdG8gY2xlYXIgdGhlbSBieSBoYW5kLgorCSAqLworCWZvciAocG9ydCA9IDA7IHBvcnQgPCB1aGNpLT5yaF9udW1wb3J0czsgKytwb3J0KQorCQlvdXR3KDAsIHVoY2ktPmlvX2FkZHIgKyBVU0JQT1JUU0MxICsgKHBvcnQgKiAyKSk7CisKKwl1aGNpLT5wb3J0X2Nfc3VzcGVuZCA9IHVoY2ktPnN1c3BlbmRlZF9wb3J0cyA9CisJCQl1aGNpLT5yZXN1bWluZ19wb3J0cyA9IDA7CisJdWhjaS0+cmhfc3RhdGUgPSBVSENJX1JIX1JFU0VUOworCXVoY2ktPmlzX3N0b3BwZWQgPSBVSENJX0lTX1NUT1BQRUQ7CisJdWhjaV90b19oY2QodWhjaSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwl1aGNpX3RvX2hjZCh1aGNpKS0+cG9sbF9yaCA9IDA7Cit9CisKKy8qCisgKiBMYXN0IHJpdGVzIGZvciBhIGRlZnVuY3Qvbm9uZnVuY3Rpb25hbCBjb250cm9sbGVyCisgKiBvciBvbmUgd2UgZG9uJ3Qgd2FudCB0byB1c2UgYW55IG1vcmUuCisgKi8KK3N0YXRpYyB2b2lkIGhjX2RpZWQoc3RydWN0IHVoY2lfaGNkICp1aGNpKQoreworCXJlc2V0X2hjKHVoY2kpOworCXVoY2ktPmhjX2luYWNjZXNzaWJsZSA9IDE7CisJZGVsX3RpbWVyKCZ1aGNpLT5zdGFsbF90aW1lcik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgY29udHJvbGxlciB0aGF0IHdhcyBuZXdseSBkaXNjb3ZlcmVkIG9yIGhhcyBqdXN0IGJlZW4KKyAqIHJlc3VtZWQuICBJbiBlaXRoZXIgY2FzZSB3ZSBjYW4ndCBiZSBzdXJlIG9mIGl0cyBwcmV2aW91cyBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfYW5kX3Jlc2V0X2hjKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwl1MTYgbGVnc3VwOworCXVuc2lnbmVkIGludCBjbWQsIGludHI7CisKKwkvKgorCSAqIFdoZW4gcmVzdGFydGluZyBhIHN1c3BlbmRlZCBjb250cm9sbGVyLCB3ZSBleHBlY3QgYWxsIHRoZQorCSAqIHNldHRpbmdzIHRvIGJlIHRoZSBzYW1lIGFzIHdlIGxlZnQgdGhlbToKKwkgKgorCSAqCVBJUlEgYW5kIFNNSSBkaXNhYmxlZCwgbm8gUi9XIGJpdHMgc2V0IGluIFVTQkxFR1NVUDsKKwkgKglDb250cm9sbGVyIGlzIHN0b3BwZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aCBFR1NNIHNldDsKKwkgKglObyBpbnRlcnJ1cHRzIGVuYWJsZWQgZXhjZXB0IHBvc3NpYmx5IFJlc3VtZSBEZXRlY3QuCisJICoKKwkgKiBJZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgdmlvbGF0ZWQgd2UgZG8gYSBjb21wbGV0ZSByZXNldC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSwgVVNCTEVHU1VQLCAmbGVnc3VwKTsKKwlpZiAobGVnc3VwICYgfihVU0JMRUdTVVBfUk8gfCBVU0JMRUdTVVBfUldDKSkgeworCQlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXM6IGxlZ3N1cCA9IDB4JTA0eFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGxlZ3N1cCk7CisJCWdvdG8gcmVzZXRfbmVlZGVkOworCX0KKworCWNtZCA9IGludyh1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwlpZiAoKGNtZCAmIFVTQkNNRF9SUykgfHwgIShjbWQgJiBVU0JDTURfQ0YpIHx8ICEoY21kICYgVVNCQ01EX0VHU00pKSB7CisJCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlczogY21kID0gMHglMDR4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgY21kKTsKKwkJZ290byByZXNldF9uZWVkZWQ7CisJfQorCisJaW50ciA9IGludyh1aGNpLT5pb19hZGRyICsgVVNCSU5UUik7CisJaWYgKGludHIgJiAoflVTQklOVFJfUkVTVU1FKSkgeworCQlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXM6IGludHIgPSAweCUwNHhcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpbnRyKTsKKwkJZ290byByZXNldF9uZWVkZWQ7CisJfQorCXJldHVybjsKKworcmVzZXRfbmVlZGVkOgorCWRldl9kYmcodWhjaV9kZXYodWhjaSksICJQZXJmb3JtaW5nIGZ1bGwgcmVzZXRcbiIpOworCXJlc2V0X2hjKHVoY2kpOworfQorCisvKgorICogU3RvcmUgdGhlIGJhc2ljIHJlZ2lzdGVyIHNldHRpbmdzIG5lZWRlZCBieSB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgY29uZmlndXJlX2hjKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwkvKiBTZXQgdGhlIGZyYW1lIGxlbmd0aCB0byB0aGUgZGVmYXVsdDogMSBtcyBleGFjdGx5ICovCisJb3V0YihVU0JTT0ZfREVGQVVMVCwgdWhjaS0+aW9fYWRkciArIFVTQlNPRik7CisKKwkvKiBTdG9yZSB0aGUgZnJhbWUgbGlzdCBiYXNlIGFkZHJlc3MgKi8KKwlvdXRsKHVoY2ktPmZsLT5kbWFfaGFuZGxlLCB1aGNpLT5pb19hZGRyICsgVVNCRkxCQVNFQUREKTsKKworCS8qIFNldCB0aGUgY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKwlvdXR3KHVoY2ktPmZyYW1lX251bWJlciwgdWhjaS0+aW9fYWRkciArIFVTQkZSTlVNKTsKKworCS8qIE1hcmsgY29udHJvbGxlciBhcyBydW5uaW5nIGJlZm9yZSB3ZSBlbmFibGUgaW50ZXJydXB0cyAqLworCXVoY2lfdG9faGNkKHVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJbWIoKTsKKworCS8qIEVuYWJsZSBQSVJRICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsCisJCQlVU0JMRUdTVVBfREVGQVVMVCk7Cit9CisKKworc3RhdGljIGludCByZXN1bWVfZGV0ZWN0X2ludGVycnVwdHNfYXJlX2Jyb2tlbihzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJaW50IHBvcnQ7CisKKwlzd2l0Y2ggKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLT52ZW5kb3IpIHsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisKKwkgICAgY2FzZSBQQ0lfVkVORE9SX0lEX0dFTkVTWVM6CisJCS8qIEdlbmVzeXMgTG9naWMncyBHTDg4MFMgY29udHJvbGxlcnMgZG9uJ3QgZ2VuZXJhdGUKKwkJICogcmVzdW1lLWRldGVjdCBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJcmV0dXJuIDE7CisKKwkgICAgY2FzZSBQQ0lfVkVORE9SX0lEX0lOVEVMOgorCQkvKiBTb21lIG9mIEludGVsJ3MgVVNCIGNvbnRyb2xsZXJzIGhhdmUgYSBidWcgdGhhdCBjYXVzZXMKKwkJICogcmVzdW1lLWRldGVjdCBpbnRlcnJ1cHRzIGlmIGFueSBwb3J0IGhhcyBhbiBvdmVyLWN1cnJlbnQKKwkJICogY29uZGl0aW9uLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBzb21lIG1vdGhlcmJvYXJkcworCQkgKiBoYXJkd2lyZSB1bnVzZWQgVVNCIHBvcnRzJyBvdmVyLWN1cnJlbnQgaW5wdXRzIGFjdGl2ZSEKKwkJICogVG8gcHJldmVudCBwcm9ibGVtcywgd2Ugd2lsbCBub3QgZW5hYmxlIHJlc3VtZS1kZXRlY3QKKwkJICogaW50ZXJydXB0cyBpZiBhbnkgcG9ydHMgYXJlIE9DLgorCQkgKi8KKwkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHVoY2ktPnJoX251bXBvcnRzOyArK3BvcnQpIHsKKwkJCWlmIChpbncodWhjaS0+aW9fYWRkciArIFVTQlBPUlRTQzEgKyBwb3J0ICogMikgJgorCQkJCQlVU0JQT1JUU0NfT0MpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kX3JoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgZW51bSB1aGNpX3JoX3N0YXRlIG5ld19zdGF0ZSkKK19fcmVsZWFzZXModWhjaS0+bG9jaykKK19fYWNxdWlyZXModWhjaS0+bG9jaykKK3sKKwlpbnQgYXV0b19zdG9wOworCWludCBpbnRfZW5hYmxlOworCisJYXV0b19zdG9wID0gKG5ld19zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCk7CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCShhdXRvX3N0b3AgPyAiIChhdXRvLXN0b3ApIiA6ICIiKSk7CisKKwkvKiBJZiB3ZSBnZXQgYSBzdXNwZW5kIHJlcXVlc3Qgd2hlbiB3ZSdyZSBhbHJlYWR5IGF1dG8tc3RvcHBlZAorCSAqIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCkgeworCQl1aGNpLT5yaF9zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJcmV0dXJuOworCX0KKworCS8qIEVuYWJsZSByZXN1bWUtZGV0ZWN0IGludGVycnVwdHMgaWYgdGhleSB3b3JrLgorCSAqIFRoZW4gZW50ZXIgR2xvYmFsIFN1c3BlbmQgbW9kZSwgc3RpbGwgY29uZmlndXJlZC4KKwkgKi8KKwlpbnRfZW5hYmxlID0gKHJlc3VtZV9kZXRlY3RfaW50ZXJydXB0c19hcmVfYnJva2VuKHVoY2kpID8KKwkJCTAgOiBVU0JJTlRSX1JFU1VNRSk7CisJb3V0dyhpbnRfZW5hYmxlLCB1aGNpLT5pb19hZGRyICsgVVNCSU5UUik7CisJb3V0dyhVU0JDTURfRUdTTSB8IFVTQkNNRF9DRiwgdWhjaS0+aW9fYWRkciArIFVTQkNNRCk7CisJbWIoKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBJZiB3ZSdyZSBhdXRvLXN0b3BwaW5nIHRoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gYXR0YWNoZWQKKwkgKiBmb3IgYSB3aGlsZSwgc28gdGhlcmUgc2hvdWxkbid0IGJlIGFueSBhY3RpdmUgVVJCcyBhbmQgdGhlCisJICogY29udHJvbGxlciBzaG91bGQgc3RvcCBhZnRlciBhIGZldyBtaWNyb3NlY29uZHMuICBPdGhlcndpc2UKKwkgKiB3ZSB3aWxsIGdpdmUgdGhlIGNvbnRyb2xsZXIgb25lIGZyYW1lIHRvIHN0b3AuCisJICovCisJaWYgKCFhdXRvX3N0b3AgJiYgIShpbncodWhjaS0+aW9fYWRkciArIFVTQlNUUykgJiBVU0JTVFNfSENIKSkgeworCQl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfU1VTUEVORElORzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwkJbXNsZWVwKDEpOworCQlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwkJaWYgKHVoY2ktPmhjX2luYWNjZXNzaWJsZSkJLyogRGllZCAqLworCQkJcmV0dXJuOworCX0KKwlpZiAoIShpbncodWhjaS0+aW9fYWRkciArIFVTQlNUUykgJiBVU0JTVFNfSENIKSkKKwkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJDb250cm9sbGVyIG5vdCBzdG9wcGVkIHlldCFcbiIpOworCisJdWhjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIodWhjaSk7CisJc21wX3dtYigpOworCisJdWhjaS0+cmhfc3RhdGUgPSBuZXdfc3RhdGU7CisJdWhjaS0+aXNfc3RvcHBlZCA9IFVIQ0lfSVNfU1RPUFBFRDsKKwlkZWxfdGltZXIoJnVoY2ktPnN0YWxsX3RpbWVyKTsKKwl1aGNpX3RvX2hjZCh1aGNpKS0+cG9sbF9yaCA9ICFpbnRfZW5hYmxlOworCisJdWhjaV9zY2FuX3NjaGVkdWxlKHVoY2ksIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9yaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJdWhjaS0+aXNfc3RvcHBlZCA9IDA7CisJc21wX3dtYigpOworCisJLyogTWFyayBpdCBjb25maWd1cmVkIGFuZCBydW5uaW5nIHdpdGggYSA2NC1ieXRlIG1heCBwYWNrZXQuCisJICogQWxsIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIGV2ZW4gdGhvdWdoIFJFU1VNRSB3b24ndCBkbyBhbnl0aGluZy4KKwkgKi8KKwlvdXR3KFVTQkNNRF9SUyB8IFVTQkNNRF9DRiB8IFVTQkNNRF9NQVhQLCB1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwlvdXR3KFVTQklOVFJfVElNRU9VVCB8IFVTQklOVFJfUkVTVU1FIHwgVVNCSU5UUl9JT0MgfCBVU0JJTlRSX1NQLAorCQkJdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOworCW1iKCk7CisJdWhjaS0+cmhfc3RhdGUgPSBVSENJX1JIX1JVTk5JTkc7CisJdWhjaV90b19oY2QodWhjaSktPnBvbGxfcmggPSAxOworCXJlc3RhcnRfdGltZXIodWhjaSk7Cit9CisKK3N0YXRpYyB2b2lkIHdha2V1cF9yaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCitfX3JlbGVhc2VzKHVoY2ktPmxvY2spCitfX2FjcXVpcmVzKHVoY2ktPmxvY2spCit7CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXVoY2ktPnJoX3N0YXRlID09IFVIQ0lfUkhfQVVUT19TVE9QUEVEID8KKwkJCQkiIChhdXRvLXN0YXJ0KSIgOiAiIik7CisKKwkvKiBJZiB3ZSBhcmUgYXV0by1zdG9wcGVkIHRoZW4gbm8gZGV2aWNlcyBhcmUgYXR0YWNoZWQgc28gdGhlcmUncworCSAqIG5vIG5lZWQgZm9yIHdha2V1cCBzaWduYWxzLiAgT3RoZXJ3aXNlIHdlIHNlbmQgR2xvYmFsIFJlc3VtZQorCSAqIGZvciAyMCBtcy4KKwkgKi8KKwlpZiAodWhjaS0+cmhfc3RhdGUgPT0gVUhDSV9SSF9TVVNQRU5ERUQpIHsKKwkJdWhjaS0+cmhfc3RhdGUgPSBVSENJX1JIX1JFU1VNSU5HOworCQlvdXR3KFVTQkNNRF9GR1IgfCBVU0JDTURfRUdTTSB8IFVTQkNNRF9DRiwKKwkJCQl1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwkJbXNsZWVwKDIwKTsKKwkJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CisJCWlmICh1aGNpLT5oY19pbmFjY2Vzc2libGUpCS8qIERpZWQgKi8KKwkJCXJldHVybjsKKworCQkvKiBFbmQgR2xvYmFsIFJlc3VtZSBhbmQgd2FpdCBmb3IgRU9QIHRvIGJlIHNlbnQgKi8KKwkJb3V0dyhVU0JDTURfQ0YsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCQltYigpOworCQl1ZGVsYXkoNCk7CisJCWlmIChpbncodWhjaS0+aW9fYWRkciArIFVTQkNNRCkgJiBVU0JDTURfRkdSKQorCQkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJGR1Igbm90IHN0b3BwZWQgeWV0IVxuIik7CisJfQorCisJc3RhcnRfcmgodWhjaSk7CisKKwkvKiBSZXN0YXJ0IHJvb3QgaHViIHBvbGxpbmcgKi8KKwltb2RfdGltZXIoJnVoY2lfdG9faGNkKHVoY2kpLT5yaF90aW1lciwgamlmZmllcyk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YWxsX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgX3VoY2kpCit7CisJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gKHN0cnVjdCB1aGNpX2hjZCAqKSBfdWhjaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKIAl1aGNpX3NjYW5fc2NoZWR1bGUodWhjaSwgTlVMTCk7CisJY2hlY2tfZnNicih1aGNpKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodXAsICZ1aGNpLT51cmJfbGlzdCwgdXJiX2xpc3QpIHsKLQkJc3RydWN0IHVyYiAqdSA9IHVwLT51cmI7Ci0KLQkJc3Bpbl9sb2NrKCZ1LT5sb2NrKTsKLQotCQkvKiBDaGVjayBpZiB0aGUgRlNCUiB0aW1lZCBvdXQgKi8KLQkJaWYgKHVwLT5mc2JyICYmICF1cC0+ZnNicl90aW1lb3V0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdXAtPmZzYnJ0aW1lICsgSURMRV9USU1FT1VUKSkKLQkJCXVoY2lfZnNicl90aW1lb3V0KHVoY2ksIHUpOwotCi0JCXNwaW5fdW5sb2NrKCZ1LT5sb2NrKTsKLQl9Ci0KLQkvKiBSZWFsbHkgZGlzYWJsZSBGU0JSICovCi0JaWYgKCF1aGNpLT5mc2JyICYmIHVoY2ktPmZzYnJ0aW1lb3V0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdWhjaS0+ZnNicnRpbWVvdXQpKSB7Ci0JCXVoY2ktPmZzYnJ0aW1lb3V0ID0gMDsKLQkJdWhjaS0+c2tlbF90ZXJtX3FoLT5saW5rID0gVUhDSV9QVFJfVEVSTTsKLQl9Ci0KLQkvKiBQb2xsIGZvciBhbmQgcGVyZm9ybSBzdGF0ZSB0cmFuc2l0aW9ucyAqLwotCWhjX3N0YXRlX3RyYW5zaXRpb25zKHVoY2kpOwotCWlmICh1bmxpa2VseSh1aGNpLT5zdXNwZW5kZWRfcG9ydHMgJiYgdWhjaS0+c3RhdGUgIT0gVUhDSV9TVVNQRU5ERUQpKQotCQl1aGNpX2NoZWNrX3BvcnRzKHVoY2kpOwotCi0JaW5pdF9zdGFsbF90aW1lcihoY2QpOworCWlmICghdWhjaS0+aXNfc3RvcHBlZCkKKwkJcmVzdGFydF90aW1lcih1aGNpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9zdGFsbF90aW1lcihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQotewotCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7Ci0KLQlpbml0X3RpbWVyKCZ1aGNpLT5zdGFsbF90aW1lcik7Ci0JdWhjaS0+c3RhbGxfdGltZXIuZnVuY3Rpb24gPSBzdGFsbF9jYWxsYmFjazsKLQl1aGNpLT5zdGFsbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaGNkOwotCXVoY2ktPnN0YWxsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwotCWFkZF90aW1lcigmdWhjaS0+c3RhbGxfdGltZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCB1aGNpX2lycShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOwotCXVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IHVoY2ktPmlvX2FkZHI7CiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKgogCSAqIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMsIGFuZCB3cml0ZSBpdCBiYWNrIHRvIGNsZWFyIHRoZQogCSAqIGludGVycnVwdCBjYXVzZS4gIENvbnRyYXJ5IHRvIHRoZSBVSENJIHNwZWNpZmljYXRpb24sIHRoZQogCSAqICJIQyBIYWx0ZWQiIHN0YXR1cyBiaXQgaXMgcGVyc2lzdGVudDogaXQgaXMgUk8sIG5vdCBSL1dDLgogCSAqLwotCXN0YXR1cyA9IGludyhpb19hZGRyICsgVVNCU1RTKTsKKwlzdGF0dXMgPSBpbncodWhjaS0+aW9fYWRkciArIFVTQlNUUyk7CiAJaWYgKCEoc3RhdHVzICYgflVTQlNUU19IQ0gpKQkvKiBzaGFyZWQgaW50ZXJydXB0LCBub3QgbWluZSAqLwogCQlyZXR1cm4gSVJRX05PTkU7Ci0Jb3V0dyhzdGF0dXMsIGlvX2FkZHIgKyBVU0JTVFMpOwkJLyogQ2xlYXIgaXQgKi8KKwlvdXR3KHN0YXR1cywgdWhjaS0+aW9fYWRkciArIFVTQlNUUyk7CQkvKiBDbGVhciBpdCAqLwogCiAJaWYgKHN0YXR1cyAmIH4oVVNCU1RTX1VTQklOVCB8IFVTQlNUU19FUlJPUiB8IFVTQlNUU19SRCkpIHsKIAkJaWYgKHN0YXR1cyAmIFVTQlNUU19IU0UpCkBAIC0xODAsMTc5ICs0MTEsMzAgQEAKIAkJaWYgKHN0YXR1cyAmIFVTQlNUU19IQ1BFKQogCQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwgImhvc3QgY29udHJvbGxlciBwcm9jZXNzICIKIAkJCQkJImVycm9yLCBzb21ldGhpbmcgYmFkIGhhcHBlbmVkIVxuIik7Ci0JCWlmICgoc3RhdHVzICYgVVNCU1RTX0hDSCkgJiYgdWhjaS0+c3RhdGUgPiAwKSB7Ci0JCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAiaG9zdCBjb250cm9sbGVyIGhhbHRlZCwgIgorCQlpZiAoc3RhdHVzICYgVVNCU1RTX0hDSCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh1aGNpLT5yaF9zdGF0ZSA+PSBVSENJX1JIX1JVTk5JTkcpIHsKKwkJCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLAorCQkJCQkiaG9zdCBjb250cm9sbGVyIGhhbHRlZCwgIgogCQkJCQkidmVyeSBiYWQhXG4iKTsKLQkJCS8qIEZJWE1FOiBSZXNldCB0aGUgY29udHJvbGxlciwgZml4IHRoZSBvZmZlbmRpbmcgVEQgKi8KKwkJCQloY19kaWVkKHVoY2kpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CiAJCX0KIAl9CiAKIAlpZiAoc3RhdHVzICYgVVNCU1RTX1JEKQotCQl1aGNpLT5yZXN1bWVfZGV0ZWN0ID0gMTsKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOwogCi0Jc3Bpbl9sb2NrKCZ1aGNpLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWhjaS0+bG9jaywgZmxhZ3MpOwogCXVoY2lfc2Nhbl9zY2hlZHVsZSh1aGNpLCByZWdzKTsKLQlzcGluX3VubG9jaygmdWhjaS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWhjaS0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCByZXNldF9oYyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQotCS8qIFR1cm4gb2ZmIFBJUlEsIFNNSSwgYW5kIGFsbCBpbnRlcnJ1cHRzLiAgVGhpcyBhbHNvIHR1cm5zIG9mZgotCSAqIHRoZSBCSU9TJ3MgVVNCIExlZ2FjeSBTdXBwb3J0LgotCSAqLwotCXBjaV93cml0ZV9jb25maWdfd29yZCh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSwgVVNCTEVHU1VQLCAwKTsKLQlvdXR3KDAsIHVoY2ktPmlvX2FkZHIgKyBVU0JJTlRSKTsKLQotCS8qIEdsb2JhbCByZXNldCBmb3IgNTBtcyAqLwotCXVoY2ktPnN0YXRlID0gVUhDSV9SRVNFVDsKLQlvdXR3KFVTQkNNRF9HUkVTRVQsIGlvX2FkZHIgKyBVU0JDTUQpOwotCW1zbGVlcCg1MCk7Ci0Jb3V0dygwLCBpb19hZGRyICsgVVNCQ01EKTsKLQotCS8qIEFub3RoZXIgMTBtcyBkZWxheSAqLwotCW1zbGVlcCgxMCk7Ci0JdWhjaS0+cmVzdW1lX2RldGVjdCA9IDA7Ci0JdWhjaS0+aXNfc3RvcHBlZCA9IFVIQ0lfSVNfU1RPUFBFRDsKLX0KLQotc3RhdGljIHZvaWQgc3VzcGVuZF9oYyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQotCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQl1aGNpLT5zdGF0ZSA9IFVIQ0lfU1VTUEVOREVEOwotCXVoY2ktPnJlc3VtZV9kZXRlY3QgPSAwOwotCW91dHcoVVNCQ01EX0VHU00sIGlvX2FkZHIgKyBVU0JDTUQpOwotCi0JLyogRklYTUU6IFdhaXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGFjdHVhbGx5IHN0b3AgKi8KLQl1aGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcih1aGNpKTsKLQl1aGNpLT5pc19zdG9wcGVkID0gVUhDSV9JU19TVE9QUEVEOwotCi0JdWhjaV9zY2FuX3NjaGVkdWxlKHVoY2ksIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCB3YWtldXBfaGMoc3RydWN0IHVoY2lfaGNkICp1aGNpKQotewotCXVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IHVoY2ktPmlvX2FkZHI7Ci0KLQlzd2l0Y2ggKHVoY2ktPnN0YXRlKSB7Ci0JCWNhc2UgVUhDSV9TVVNQRU5ERUQ6CQkvKiBTdGFydCB0aGUgcmVzdW1lICovCi0JCQlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCS8qIEdsb2JhbCByZXN1bWUgZm9yID49IDIwbXMgKi8KLQkJCW91dHcoVVNCQ01EX0ZHUiB8IFVTQkNNRF9FR1NNLCBpb19hZGRyICsgVVNCQ01EKTsKLQkJCXVoY2ktPnN0YXRlID0gVUhDSV9SRVNVTUlOR18xOwotCQkJdWhjaS0+c3RhdGVfZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCQkJdWhjaS0+aXNfc3RvcHBlZCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFVIQ0lfUkVTVU1JTkdfMToJCS8qIEVuZCBnbG9iYWwgcmVzdW1lICovCi0JCQl1aGNpLT5zdGF0ZSA9IFVIQ0lfUkVTVU1JTkdfMjsKLQkJCW91dHcoMCwgaW9fYWRkciArIFVTQkNNRCk7Ci0JCQkvKiBGYWxscyB0aHJvdWdoICovCi0KLQkJY2FzZSBVSENJX1JFU1VNSU5HXzI6CQkvKiBXYWl0IGZvciBFT1AgdG8gYmUgc2VudCAqLwotCQkJaWYgKGludyhpb19hZGRyICsgVVNCQ01EKSAmIFVTQkNNRF9GR1IpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFJ1biBmb3IgYXQgbGVhc3QgMSBzZWNvbmQsIGFuZAotCQkJICogbWFyayBpdCBjb25maWd1cmVkIHdpdGggYSA2NC1ieXRlIG1heCBwYWNrZXQgKi8KLQkJCXVoY2ktPnN0YXRlID0gVUhDSV9SVU5OSU5HX0dSQUNFOwotCQkJdWhjaS0+c3RhdGVfZW5kID0gamlmZmllcyArIEhaOwotCQkJb3V0dyhVU0JDTURfUlMgfCBVU0JDTURfQ0YgfCBVU0JDTURfTUFYUCwKLQkJCQkJaW9fYWRkciArIFVTQkNNRCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVIQ0lfUlVOTklOR19HUkFDRToJLyogTm93IGFsbG93ZWQgdG8gc3VzcGVuZCAqLwotCQkJdWhjaS0+c3RhdGUgPSBVSENJX1JVTk5JTkc7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IHBvcnRzX2FjdGl2ZShzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQlpbnQgY29ubmVjdGlvbiA9IDA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdWhjaS0+cmhfbnVtcG9ydHM7IGkrKykKLQkJY29ubmVjdGlvbiB8PSAoaW53KGlvX2FkZHIgKyBVU0JQT1JUU0MxICsgaSAqIDIpICYgVVNCUE9SVFNDX0NDUyk7Ci0KLQlyZXR1cm4gY29ubmVjdGlvbjsKLX0KLQotc3RhdGljIGludCBzdXNwZW5kX2FsbG93ZWQoc3RydWN0IHVoY2lfaGNkICp1aGNpKQotewotCXVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IHVoY2ktPmlvX2FkZHI7Ci0JaW50IGk7Ci0KLQlpZiAodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSktPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0lOVEVMKQotCQlyZXR1cm4gMTsKLQotCS8qIFNvbWUgb2YgSW50ZWwncyBVU0IgY29udHJvbGxlcnMgaGF2ZSBhIGJ1ZyB0aGF0IGNhdXNlcyBmYWxzZQotCSAqIHJlc3VtZSBpbmRpY2F0aW9ucyBpZiBhbnkgcG9ydCBoYXMgYW4gb3ZlciBjdXJyZW50IGNvbmRpdGlvbi4KLQkgKiBUbyBwcmV2ZW50IHByb2JsZW1zLCB3ZSB3aWxsIG5vdCBhbGxvdyBhIGdsb2JhbCBzdXNwZW5kIGlmCi0JICogYW55IHBvcnRzIGFyZSBPQy4KLQkgKgotCSAqIFNvbWUgbW90aGVyYm9hcmRzIHVzaW5nIEludGVsJ3MgY2hpcHNldHMgKGJ1dCBub3QgdXNpbmcgYWxsCi0JICogdGhlIFVTQiBwb3J0cykgYXBwZWFyIHRvIGhhcmR3aXJlIHRoZSBvdmVyIGN1cnJlbnQgaW5wdXRzIGFjdGl2ZQotCSAqIHRvIGRpc2FibGUgdGhlIFVTQiBwb3J0cy4KLQkgKi8KLQotCS8qIGNoZWNrIGZvciBvdmVyIGN1cnJlbnQgY29uZGl0aW9uIG9uIGFueSBwb3J0ICovCi0JZm9yIChpID0gMDsgaSA8IHVoY2ktPnJoX251bXBvcnRzOyBpKyspIHsKLQkJaWYgKGludyhpb19hZGRyICsgVVNCUE9SVFNDMSArIGkgKiAyKSAmIFVTQlBPUlRTQ19PQykKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBoY19zdGF0ZV90cmFuc2l0aW9ucyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0Jc3dpdGNoICh1aGNpLT5zdGF0ZSkgewotCQljYXNlIFVIQ0lfUlVOTklORzoKLQotCQkJLyogZ2xvYmFsIHN1c3BlbmQgaWYgbm90aGluZyBjb25uZWN0ZWQgZm9yIDEgc2Vjb25kICovCi0JCQlpZiAoIXBvcnRzX2FjdGl2ZSh1aGNpKSAmJiBzdXNwZW5kX2FsbG93ZWQodWhjaSkpIHsKLQkJCQl1aGNpLT5zdGF0ZSA9IFVIQ0lfU1VTUEVORElOR19HUkFDRTsKLQkJCQl1aGNpLT5zdGF0ZV9lbmQgPSBqaWZmaWVzICsgSFo7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFVIQ0lfU1VTUEVORElOR19HUkFDRToKLQkJCWlmIChwb3J0c19hY3RpdmUodWhjaSkpCi0JCQkJdWhjaS0+c3RhdGUgPSBVSENJX1JVTk5JTkc7Ci0JCQllbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHVoY2ktPnN0YXRlX2VuZCkpCi0JCQkJc3VzcGVuZF9oYyh1aGNpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVUhDSV9TVVNQRU5ERUQ6Ci0KLQkJCS8qIHdha2V1cCBpZiByZXF1ZXN0ZWQgYnkgYSBkZXZpY2UgKi8KLQkJCWlmICh1aGNpLT5yZXN1bWVfZGV0ZWN0KQotCQkJCXdha2V1cF9oYyh1aGNpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVUhDSV9SRVNVTUlOR18xOgotCQljYXNlIFVIQ0lfUkVTVU1JTkdfMjoKLQkJY2FzZSBVSENJX1JVTk5JTkdfR1JBQ0U6Ci0JCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB1aGNpLT5zdGF0ZV9lbmQpKQotCQkJCXdha2V1cF9oYyh1aGNpKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KIC8qCiAgKiBTdG9yZSB0aGUgY3VycmVudCBmcmFtZSBudW1iZXIgaW4gdWhjaS0+ZnJhbWVfbnVtYmVyIGlmIHRoZSBjb250cm9sbGVyCiAgKiBpcyBydW5ubmluZwpAQCAtMzYzLDQ4ICs0NDUsNiBAQAogCQl1aGNpLT5mcmFtZV9udW1iZXIgPSBpbncodWhjaS0+aW9fYWRkciArIFVTQkZSTlVNKTsKIH0KIAotc3RhdGljIGludCBzdGFydF9oYyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQlpbnQgdGltZW91dCA9IDEwOwotCi0JLyoKLQkgKiBSZXNldCB0aGUgSEMgLSB0aGlzIHdpbGwgZm9yY2UgdXMgdG8gZ2V0IGEKLQkgKiBuZXcgbm90aWZpY2F0aW9uIG9mIGFueSBhbHJlYWR5IGNvbm5lY3RlZAotCSAqIHBvcnRzIGR1ZSB0byB0aGUgdmlydHVhbCBkaXNjb25uZWN0IHRoYXQgaXQKLQkgKiBpbXBsaWVzLgotCSAqLwotCW91dHcoVVNCQ01EX0hDUkVTRVQsIGlvX2FkZHIgKyBVU0JDTUQpOwotCXdoaWxlIChpbncoaW9fYWRkciArIFVTQkNNRCkgJiBVU0JDTURfSENSRVNFVCkgewotCQlpZiAoLS10aW1lb3V0IDwgMCkgewotCQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwgIlVTQkNNRF9IQ1JFU0VUIHRpbWVkIG91dCFcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJbXNsZWVwKDEpOwotCX0KLQotCS8qIE1hcmsgY29udHJvbGxlciBhcyBydW5uaW5nIGJlZm9yZSB3ZSBlbmFibGUgaW50ZXJydXB0cyAqLwotCXVoY2lfdG9faGNkKHVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7Ci0KLQkvKiBUdXJuIG9uIFBJUlEgYW5kIGFsbCBpbnRlcnJ1cHRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsCi0JCQlVU0JMRUdTVVBfREVGQVVMVCk7Ci0Jb3V0dyhVU0JJTlRSX1RJTUVPVVQgfCBVU0JJTlRSX1JFU1VNRSB8IFVTQklOVFJfSU9DIHwgVVNCSU5UUl9TUCwKLQkJaW9fYWRkciArIFVTQklOVFIpOwotCi0JLyogU3RhcnQgYXQgZnJhbWUgMCAqLwotCW91dHcoMCwgaW9fYWRkciArIFVTQkZSTlVNKTsKLQlvdXRsKHVoY2ktPmZsLT5kbWFfaGFuZGxlLCBpb19hZGRyICsgVVNCRkxCQVNFQUREKTsKLQotCS8qIFJ1biBhbmQgbWFyayBpdCBjb25maWd1cmVkIHdpdGggYSA2NC1ieXRlIG1heCBwYWNrZXQgKi8KLQl1aGNpLT5zdGF0ZSA9IFVIQ0lfUlVOTklOR19HUkFDRTsKLQl1aGNpLT5zdGF0ZV9lbmQgPSBqaWZmaWVzICsgSFo7Ci0Jb3V0dyhVU0JDTURfUlMgfCBVU0JDTURfQ0YgfCBVU0JDTURfTUFYUCwgaW9fYWRkciArIFVTQkNNRCk7Ci0JdWhjaS0+aXNfc3RvcHBlZCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMKICAqLwpAQCAtNDQ4LDE2ICs0ODgsNTggQEAKIHN0YXRpYyBpbnQgdWhjaV9yZXNldChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CisJdW5zaWduZWQgaW9fc2l6ZSA9ICh1bnNpZ25lZCkgaGNkLT5yc3JjX2xlbjsKKwlpbnQgcG9ydDsKIAogCXVoY2ktPmlvX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaGNkLT5yc3JjX3N0YXJ0OwogCi0JLyogS2ljayBCSU9TIG9mZiB0aGlzIGhhcmR3YXJlIGFuZCByZXNldCwgc28gd2Ugd29uJ3QgZ2V0Ci0JICogaW50ZXJydXB0cyBmcm9tIGFueSBwcmV2aW91cyBzZXR1cC4KKwkvKiBUaGUgVUhDSSBzcGVjIHNheXMgZGV2aWNlcyBtdXN0IGhhdmUgMiBwb3J0cywgYW5kIGdvZXMgb24gdG8gc2F5CisJICogdGhleSBtYXkgaGF2ZSBtb3JlIGJ1dCBnaXZlcyBubyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHRoZXJlCisJICogYXJlLiAgSG93ZXZlciBhY2NvcmRpbmcgdG8gdGhlIFVIQ0kgc3BlYywgQml0IDcgb2YgdGhlIHBvcnQKKwkgKiBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgaXMgYWx3YXlzIHNldCB0byAxLiAgU28gd2UgdHJ5IHRvCisJICogdXNlIHRoaXMgdG8gb3VyIGFkdmFudGFnZS4gIEFub3RoZXIgY29tbW9uIGZhaWx1cmUgbW9kZSB3aGVuCisJICogYSBub25leGlzdGVudCByZWdpc3RlciBpcyBhZGRyZXNzZWQgaXMgdG8gcmV0dXJuIGFsbCBvbmVzLCBzbworCSAqIHdlIHRlc3QgZm9yIHRoYXQgYWxzby4KIAkgKi8KLQlyZXNldF9oYyh1aGNpKTsKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgKGlvX3NpemUgLSBVU0JQT1JUU0MxKSAvIDI7IHBvcnQrKykgeworCQl1bnNpZ25lZCBpbnQgcG9ydHN0YXR1czsKKworCQlwb3J0c3RhdHVzID0gaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JQT1JUU0MxICsgKHBvcnQgKiAyKSk7CisJCWlmICghKHBvcnRzdGF0dXMgJiAweDAwODApIHx8IHBvcnRzdGF0dXMgPT0gMHhmZmZmKQorCQkJYnJlYWs7CisJfQorCWlmIChkZWJ1ZykKKwkJZGV2X2luZm8odWhjaV9kZXYodWhjaSksICJkZXRlY3RlZCAlZCBwb3J0c1xuIiwgcG9ydCk7CisKKwkvKiBBbnl0aGluZyBncmVhdGVyIHRoYW4gNyBpcyB3ZWlyZCBzbyB3ZSdsbCBpZ25vcmUgaXQuICovCisJaWYgKHBvcnQgPiBVSENJX1JIX01BWENISUxEKSB7CisJCWRldl9pbmZvKHVoY2lfZGV2KHVoY2kpLCAicG9ydCBjb3VudCBtaXNkZXRlY3RlZD8gIgorCQkJCSJmb3JjaW5nIHRvIDIgcG9ydHNcbiIpOworCQlwb3J0ID0gMjsKKwl9CisJdWhjaS0+cmhfbnVtcG9ydHMgPSBwb3J0OworCisJLyogS2ljayBCSU9TIG9mZiB0aGlzIGhhcmR3YXJlIGFuZCByZXNldCBpZiB0aGUgY29udHJvbGxlcgorCSAqIGlzbid0IGFscmVhZHkgc2FmZWx5IHF1aWVzY2VudC4KKwkgKi8KKwljaGVja19hbmRfcmVzZXRfaGModWhjaSk7CiAJcmV0dXJuIDA7CiB9CiAKKy8qIE1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBpcyBxdWllc2NlbnQgYW5kIHRoYXQgd2UncmUgbm90IHVzaW5nIGl0CisgKiBhbnkgbW9yZS4gIFRoaXMgaXMgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiBwcm9ncmFtcyB3aGljaCwgbGlrZSBrZXhlYywKKyAqIGV4cGVjdCB0aGUgaGFyZHdhcmUgdG8gYmUgaWRsZTogbm90IGRvaW5nIERNQSBvciBnZW5lcmF0aW5nIElSUXMuCisgKgorICogVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgaW4gYSBkYW1hZ2VkIG9yIGZhaWxpbmcga2VybmVsLiAgSGVuY2Ugd2UKKyAqIGRvIG5vdCBhY3F1aXJlIHRoZSBzcGlubG9jayBiZWZvcmUgc2h1dHRpbmcgZG93biB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgdWhjaV9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gKHN0cnVjdCB1c2JfaGNkICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWhjX2RpZWQoaGNkX3RvX3VoY2koaGNkKSk7Cit9CisKIC8qCiAgKiBBbGxvY2F0ZSBhIGZyYW1lIGxpc3QsIGFuZCB0aGVuIHNldHVwIHRoZSBza2VsZXRvbgogICoKQEAgLTQ3OCwxNyArNTYwLDIwIEBACiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKIAlpbnQgcmV0dmFsID0gLUVCVVNZOwotCWludCBpLCBwb3J0OwotCXVuc2lnbmVkIGlvX3NpemU7CisJaW50IGk7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAotCWlvX3NpemUgPSAodW5zaWduZWQpIGhjZC0+cnNyY19sZW47CisJaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eSh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSwgUENJX0NBUF9JRF9QTSkpCisJCWhjZC0+Y2FuX3dha2V1cCA9IDE7CQkvKiBBc3N1bWUgaXQgc3VwcG9ydHMgUE1FIyAqLwogCi0JZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShoY2QtPnNlbGYuYnVzX25hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCB1aGNpX2RlYnVnZnNfcm9vdCwgdWhjaSwgJnVoY2lfZGVidWdfb3BlcmF0aW9ucyk7CisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShoY2QtPnNlbGYuYnVzX25hbWUsCisJCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgdWhjaV9kZWJ1Z2ZzX3Jvb3QsIHVoY2ksCisJCQkmdWhjaV9kZWJ1Z19vcGVyYXRpb25zKTsKIAlpZiAoIWRlbnRyeSkgewotCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAiY291bGRuJ3QgY3JlYXRlIHVoY2kgZGVidWdmcyBlbnRyeVxuIik7CisJCWRldl9lcnIodWhjaV9kZXYodWhjaSksCisJCQkJImNvdWxkbid0IGNyZWF0ZSB1aGNpIGRlYnVnZnMgZW50cnlcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9jcmVhdGVfZGVidWdfZW50cnk7CiAJfQpAQCAtNTEwLDYgKzU5NSwxMCBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdWhjaS0+d2FpdHFoKTsKIAorCWluaXRfdGltZXIoJnVoY2ktPnN0YWxsX3RpbWVyKTsKKwl1aGNpLT5zdGFsbF90aW1lci5mdW5jdGlvbiA9IHN0YWxsX2NhbGxiYWNrOworCXVoY2ktPnN0YWxsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdWhjaTsKKwogCXVoY2ktPmZsID0gZG1hX2FsbG9jX2NvaGVyZW50KHVoY2lfZGV2KHVoY2kpLCBzaXplb2YoKnVoY2ktPmZsKSwKIAkJCSZkbWFfaGFuZGxlLCAwKTsKIAlpZiAoIXVoY2ktPmZsKSB7CkBAIC01MzYsNDYgKzYyNSwxNCBAQAogCQlnb3RvIGVycl9jcmVhdGVfcWhfcG9vbDsKIAl9CiAKLQkvKiBJbml0aWFsaXplIHRoZSByb290IGh1YiAqLwotCi0JLyogVUhDSSBzcGVjcyBzYXlzIGRldmljZXMgbXVzdCBoYXZlIDIgcG9ydHMsIGJ1dCBnb2VzIG9uIHRvIHNheSAqLwotCS8qICB0aGV5IG1heSBoYXZlIG1vcmUgYnV0IGdpdmUgbm8gd2F5IHRvIGRldGVybWluZSBob3cgbWFueSB0aGV5ICovCi0JLyogIGhhdmUuIEhvd2V2ZXIsIGFjY29yZGluZyB0byB0aGUgVUhDSSBzcGVjLCBCaXQgNyBpcyBhbHdheXMgc2V0ICovCi0JLyogIHRvIDEuIFNvIHdlIHRyeSB0byB1c2UgdGhpcyB0byBvdXIgYWR2YW50YWdlICovCi0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IChpb19zaXplIC0gMHgxMCkgLyAyOyBwb3J0KyspIHsKLQkJdW5zaWduZWQgaW50IHBvcnRzdGF0dXM7Ci0KLQkJcG9ydHN0YXR1cyA9IGludyh1aGNpLT5pb19hZGRyICsgMHgxMCArIChwb3J0ICogMikpOwotCQlpZiAoIShwb3J0c3RhdHVzICYgMHgwMDgwKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZGVidWcpCi0JCWRldl9pbmZvKHVoY2lfZGV2KHVoY2kpLCAiZGV0ZWN0ZWQgJWQgcG9ydHNcbiIsIHBvcnQpOwotCi0JLyogVGhpcyBpcyBleHBlcmltZW50YWwgc28gYW55dGhpbmcgbGVzcyB0aGFuIDIgb3IgZ3JlYXRlciB0aGFuIDggaXMgKi8KLQkvKiAgc29tZXRoaW5nIHdlaXJkIGFuZCB3ZSdsbCBpZ25vcmUgaXQgKi8KLQlpZiAocG9ydCA8IDIgfHwgcG9ydCA+IFVIQ0lfUkhfTUFYQ0hJTEQpIHsKLQkJZGV2X2luZm8odWhjaV9kZXYodWhjaSksICJwb3J0IGNvdW50IG1pc2RldGVjdGVkPyAiCi0JCQkJImZvcmNpbmcgdG8gMiBwb3J0c1xuIik7Ci0JCXBvcnQgPSAyOwotCX0KLQotCXVoY2ktPnJoX251bXBvcnRzID0gcG9ydDsKLQotCXVkZXYgPSB1c2JfYWxsb2NfZGV2KE5VTEwsICZoY2QtPnNlbGYsIDApOwotCWlmICghdWRldikgewotCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAidW5hYmxlIHRvIGFsbG9jYXRlIHJvb3QgaHViXG4iKTsKLQkJZ290byBlcnJfYWxsb2Nfcm9vdF9odWI7Ci0JfQotCi0JdWhjaS0+dGVybV90ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSwgdWRldik7CisJdWhjaS0+dGVybV90ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJaWYgKCF1aGNpLT50ZXJtX3RkKSB7CiAJCWRldl9lcnIodWhjaV9kZXYodWhjaSksICJ1bmFibGUgdG8gYWxsb2NhdGUgdGVybWluYXRpbmcgVERcbiIpOwogCQlnb3RvIGVycl9hbGxvY190ZXJtX3RkOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBVSENJX05VTV9TS0VMUUg7IGkrKykgewotCQl1aGNpLT5za2VscWhbaV0gPSB1aGNpX2FsbG9jX3FoKHVoY2ksIHVkZXYpOworCQl1aGNpLT5za2VscWhbaV0gPSB1aGNpX2FsbG9jX3FoKHVoY2kpOwogCQlpZiAoIXVoY2ktPnNrZWxxaFtpXSkgewogCQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwgInVuYWJsZSB0byBhbGxvY2F0ZSBRSFxuIik7CiAJCQlnb3RvIGVycl9hbGxvY19za2VscWg7CkBAIC02NDEsMzIgKzY5OCwxNyBAQAogCiAJLyoKIAkgKiBTb21lIGFyY2hpdGVjdHVyZXMgcmVxdWlyZSBhIGZ1bGwgbWIoKSB0byBlbmZvcmNlIGNvbXBsZXRpb24gb2YKLQkgKiB0aGUgbWVtb3J5IHdyaXRlcyBhYm92ZSBiZWZvcmUgdGhlIEkvTyB0cmFuc2ZlcnMgaW4gc3RhcnRfaGMoKS4KKwkgKiB0aGUgbWVtb3J5IHdyaXRlcyBhYm92ZSBiZWZvcmUgdGhlIEkvTyB0cmFuc2ZlcnMgaW4gY29uZmlndXJlX2hjKCkuCiAJICovCiAJbWIoKTsKLQlpZiAoKHJldHZhbCA9IHN0YXJ0X2hjKHVoY2kpKSAhPSAwKQotCQlnb3RvIGVycl9hbGxvY19za2VscWg7CiAKLQlpbml0X3N0YWxsX3RpbWVyKGhjZCk7Ci0KLQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOwotCi0JaWYgKHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIodWRldiwgaGNkKSAhPSAwKSB7Ci0JCWRldl9lcnIodWhjaV9kZXYodWhjaSksICJ1bmFibGUgdG8gc3RhcnQgcm9vdCBodWJcbiIpOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9zdGFydF9yb290X2h1YjsKLQl9Ci0KKwljb25maWd1cmVfaGModWhjaSk7CisJc3RhcnRfcmgodWhjaSk7CiAJcmV0dXJuIDA7CiAKIC8qCiAgKiBlcnJvciBleGl0czoKICAqLwotZXJyX3N0YXJ0X3Jvb3RfaHViOgotCXJlc2V0X2hjKHVoY2kpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnVoY2ktPnN0YWxsX3RpbWVyKTsKLQogZXJyX2FsbG9jX3NrZWxxaDoKIAlmb3IgKGkgPSAwOyBpIDwgVUhDSV9OVU1fU0tFTFFIOyBpKyspCiAJCWlmICh1aGNpLT5za2VscWhbaV0pIHsKQEAgLTY3OCw5ICs3MjAsNiBAQAogCXVoY2ktPnRlcm1fdGQgPSBOVUxMOwogCiBlcnJfYWxsb2NfdGVybV90ZDoKLQl1c2JfcHV0X2Rldih1ZGV2KTsKLQotZXJyX2FsbG9jX3Jvb3RfaHViOgogCWRtYV9wb29sX2Rlc3Ryb3kodWhjaS0+cWhfcG9vbCk7CiAJdWhjaS0+cWhfcG9vbCA9IE5VTEw7CiAKQEAgLTcwNSw3MyArNzQ0LDExNCBAQAogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CiAKLQlkZWxfdGltZXJfc3luYygmdWhjaS0+c3RhbGxfdGltZXIpOwotCXJlc2V0X2hjKHVoY2kpOwotCiAJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CisJcmVzZXRfaGModWhjaSk7CiAJdWhjaV9zY2FuX3NjaGVkdWxlKHVoY2ksIE5VTEwpOwogCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7Ci0JCisKKwlkZWxfdGltZXJfc3luYygmdWhjaS0+c3RhbGxfdGltZXIpOwogCXJlbGVhc2VfdWhjaSh1aGNpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB1aGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IHVoY2lfcmhfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CiAKIAlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKLQotCS8qIERvbid0IHRyeSB0byBzdXNwZW5kIGJyb2tlbiBtb3RoZXJib2FyZHMsIHJlc2V0IGluc3RlYWQgKi8KLQlpZiAoc3VzcGVuZF9hbGxvd2VkKHVoY2kpKQotCQlzdXNwZW5kX2hjKHVoY2kpOwotCWVsc2UgewotCQlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOwotCQlyZXNldF9oYyh1aGNpKTsKLQkJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7Ci0JCXVoY2lfc2Nhbl9zY2hlZHVsZSh1aGNpLCBOVUxMKTsKLQl9Ci0KKwlpZiAoIXVoY2ktPmhjX2luYWNjZXNzaWJsZSkJCS8qIE5vdCBkZWFkICovCisJCXN1c3BlbmRfcmgodWhjaSwgVUhDSV9SSF9TVVNQRU5ERUQpOwogCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdWhjaV9yaF9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwlpZiAodWhjaS0+aGNfaW5hY2Nlc3NpYmxlKSB7CisJCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX1NVU1BFTkRFRCkgeworCQkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJIQyBpc24ndCBydW5uaW5nIVxuIik7CisJCQlyYyA9IC1FTk9ERVY7CisJCX0KKwkJLyogT3RoZXJ3aXNlIHRoZSBIQyBpcyBkZWFkICovCisJfSBlbHNlCisJCXdha2V1cF9yaCh1aGNpKTsKKwlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB1aGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKKwlpbnQgcmMgPSAwOworCisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CisJaWYgKHVoY2ktPmhjX2luYWNjZXNzaWJsZSkJLyogRGVhZCBvciBhbHJlYWR5IHN1c3BlbmRlZCAqLworCQlnb3RvIGRvbmU7CisKKyNpZm5kZWYgQ09ORklHX1VTQl9TVVNQRU5ECisJLyogT3RoZXJ3aXNlIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuICovCisJc3VzcGVuZF9yaCh1aGNpLCBVSENJX1JIX1NVU1BFTkRFRCk7CisjZW5kaWYKKworCWlmICh1aGNpLT5yaF9zdGF0ZSA+IFVIQ0lfUkhfU1VTUEVOREVEKSB7CisJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAiUm9vdCBodWIgaXNuJ3Qgc3VzcGVuZGVkIVxuIik7CisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBkb25lOworCX07CisKKwkvKiBBbGwgUENJIGhvc3QgY29udHJvbGxlcnMgYXJlIHJlcXVpcmVkIHRvIGRpc2FibGUgSVJRIGdlbmVyYXRpb24KKwkgKiBhdCB0aGUgc291cmNlLCBzbyB3ZSBtdXN0IHR1cm4gb2ZmIFBJUlEuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsIDApOworCXVoY2ktPmhjX2luYWNjZXNzaWJsZSA9IDE7CisKKwkvKiBGSVhNRTogRW5hYmxlIG5vbi1QTUUjIHJlbW90ZSB3YWtldXA/ICovCisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwlpZiAocmMgPT0gMCkKKwkJZGVsX3RpbWVyX3N5bmMoJmhjZC0+cmhfdGltZXIpOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCB1aGNpX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7Ci0JaW50IHJjOwogCi0JcGNpX3NldF9tYXN0ZXIodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSkpOworCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAorCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX1JFU0VUKQkvKiBEZWFkICovCisJCXJldHVybiAwOwogCXNwaW5fbG9ja19pcnEoJnVoY2ktPmxvY2spOwogCi0JaWYgKHVoY2ktPnN0YXRlID09IFVIQ0lfU1VTUEVOREVEKSB7CisJLyogRklYTUU6IERpc2FibGUgbm9uLVBNRSMgcmVtb3RlIHdha2V1cD8gKi8KIAotCQkvKgotCQkgKiBTb21lIHN5c3RlbXMgZG9uJ3QgbWFpbnRhaW4gdGhlIFVIQ0kgcmVnaXN0ZXIgdmFsdWVzCi0JCSAqIGR1cmluZyBhIFBNIHN1c3BlbmQvcmVzdW1lIGN5Y2xlLCBzbyByZWluaXRpYWxpemUKLQkJICogdGhlIEZyYW1lIE51bWJlciwgRnJhbWVsaXN0IEJhc2UgQWRkcmVzcywgSW50ZXJydXB0Ci0JCSAqIEVuYWJsZSwgYW5kIExlZ2FjeSBTdXBwb3J0IHJlZ2lzdGVycy4KLQkJICovCi0JCXBjaV93cml0ZV9jb25maWdfd29yZCh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSwgVVNCTEVHU1VQLAotCQkJCTApOwotCQlvdXR3KHVoY2ktPmZyYW1lX251bWJlciwgdWhjaS0+aW9fYWRkciArIFVTQkZSTlVNKTsKLQkJb3V0bCh1aGNpLT5mbC0+ZG1hX2hhbmRsZSwgdWhjaS0+aW9fYWRkciArIFVTQkZMQkFTRUFERCk7Ci0JCW91dHcoVVNCSU5UUl9USU1FT1VUIHwgVVNCSU5UUl9SRVNVTUUgfCBVU0JJTlRSX0lPQyB8Ci0JCQkJVVNCSU5UUl9TUCwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOwotCQl1aGNpLT5yZXN1bWVfZGV0ZWN0ID0gMTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsCi0JCQkJVVNCTEVHU1VQX0RFRkFVTFQpOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7Ci0JCXJlc2V0X2hjKHVoY2kpOwotCQlpZiAoKHJjID0gc3RhcnRfaGModWhjaSkpICE9IDApCi0JCQlyZXR1cm4gcmM7Ci0JCXNwaW5fbG9ja19pcnEoJnVoY2ktPmxvY2spOwotCX0KLQloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwl1aGNpLT5oY19pbmFjY2Vzc2libGUgPSAwOworCisJLyogVGhlIEJJT1MgbWF5IGhhdmUgY2hhbmdlZCB0aGUgY29udHJvbGxlciBzZXR0aW5ncyBkdXJpbmcgYQorCSAqIHN5c3RlbSB3YWtldXAuICBDaGVjayBpdCBhbmQgcmVjb25maWd1cmUgdG8gYXZvaWQgcHJvYmxlbXMuCisJICovCisJY2hlY2tfYW5kX3Jlc2V0X2hjKHVoY2kpOworCWNvbmZpZ3VyZV9oYyh1aGNpKTsKKworI2lmbmRlZiBDT05GSUdfVVNCX1NVU1BFTkQKKwkvKiBPdGhlcndpc2UgdGhpcyB3b3VsZCBuZXZlciBoYXBwZW4gKi8KKwl3YWtldXBfcmgodWhjaSk7CisjZW5kaWYKKwlpZiAodWhjaS0+cmhfc3RhdGUgPT0gVUhDSV9SSF9SRVNFVCkKKwkJc3VzcGVuZF9yaCh1aGNpLCBVSENJX1JIX1NVU1BFTkRFRCk7CiAKIAlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOworCisJaWYgKGhjZC0+cG9sbF9yaCkKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC03ODgsMTMgKzg2OCwxNSBAQAogc3RhdGljIGludCB1aGNpX2hjZF9nZXRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKLQlpbnQgZnJhbWVfbnVtYmVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlzX3N0b3BwZWQ7CisJaW50IGZyYW1lX251bWJlcjsKIAogCS8qIE1pbmltaXplIGxhdGVuY3kgYnkgYXZvaWRpbmcgdGhlIHNwaW5sb2NrICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJtYigpOwotCWZyYW1lX251bWJlciA9ICh1aGNpLT5pc19zdG9wcGVkID8gdWhjaS0+ZnJhbWVfbnVtYmVyIDoKKwlpc19zdG9wcGVkID0gdWhjaS0+aXNfc3RvcHBlZDsKKwlzbXBfcm1iKCk7CisJZnJhbWVfbnVtYmVyID0gKGlzX3N0b3BwZWQgPyB1aGNpLT5mcmFtZV9udW1iZXIgOgogCQkJaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JGUk5VTSkpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gZnJhbWVfbnVtYmVyOwpAQCAtODE3LDYgKzg5OSw4IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQgPQkJdWhjaV9zdXNwZW5kLAogCS5yZXN1bWUgPQkJdWhjaV9yZXN1bWUsCisJLmh1Yl9zdXNwZW5kID0JCXVoY2lfcmhfc3VzcGVuZCwKKwkuaHViX3Jlc3VtZSA9CQl1aGNpX3JoX3Jlc3VtZSwKICNlbmRpZgogCS5zdG9wID0JCQl1aGNpX3N0b3AsCiAKQEAgLTg0NSw2ICs5MjksNyBAQAogCiAJLnByb2JlID0JdXNiX2hjZF9wY2lfcHJvYmUsCiAJLnJlbW92ZSA9CXVzYl9oY2RfcGNpX3JlbW92ZSwKKwkuc2h1dGRvd24gPQl1aGNpX3NodXRkb3duLAogCiAjaWZkZWYJQ09ORklHX1BNCiAJLnN1c3BlbmQgPQl1c2JfaGNkX3BjaV9zdXNwZW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5oIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5oCmluZGV4IDAyMjU1ZDYuLmJmOWM1ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmgKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgVVNCRlJOVU0JNgogI2RlZmluZSBVU0JGTEJBU0VBREQJOAogI2RlZmluZSBVU0JTT0YJCTEyCisjZGVmaW5lICAgVVNCU09GX0RFRkFVTFQJNjQJLyogRnJhbWUgbGVuZ3RoIGlzIGV4YWN0bHkgMSBtcyAqLwogCiAvKiBVU0IgcG9ydCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFVTQlBPUlRTQzEJMTYKQEAgLTY2LDYgKzY3LDggQEAKIC8qIExlZ2FjeSBzdXBwb3J0IHJlZ2lzdGVyICovCiAjZGVmaW5lIFVTQkxFR1NVUAkJMHhjMAogI2RlZmluZSAgIFVTQkxFR1NVUF9ERUZBVUxUCTB4MjAwMAkvKiBvbmx5IFBJUlEgZW5hYmxlIHNldCAqLworI2RlZmluZSAgIFVTQkxFR1NVUF9SV0MJCTB4OGYwMAkvKiB0aGUgUi9XQyBiaXRzICovCisjZGVmaW5lICAgVVNCTEVHU1VQX1JPCQkweDUwNDAJLyogUi9PIGFuZCByZXNlcnZlZCBiaXRzICovCiAKICNkZWZpbmUgVUhDSV9OVUxMX0RBVEFfU0laRQkweDdGRgkvKiBmb3IgVUhDSSBjb250cm9sbGVyIFREICovCiAKQEAgLTExMSw3ICsxMTQsNiBAQAogCS8qIFNvZnR3YXJlIGZpZWxkcyAqLwogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAJc3RydWN0IHVyYl9wcml2ICp1cmJwOwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogUDogdWhjaS0+ZnJhbWVfbGlzdF9sb2NrICovCkBAIC0yMDMsNyArMjA1LDYgQEAKIAkvKiBTb2Z0d2FyZSBmaWVsZHMgKi8KIAlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CiAKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCB1cmIgKnVyYjsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIFA6IHVyYi0+bG9jayAqLwpAQCAtMzE0LDI2ICszMTUsMzIgQEAKIH0KIAogLyoKLSAqIERldmljZSBzdGF0ZXMgZm9yIHRoZSBob3N0IGNvbnRyb2xsZXIuCisgKiBTdGF0ZXMgZm9yIHRoZSByb290IGh1Yi4KICAqCiAgKiBUbyBwcmV2ZW50ICJib3VuY2luZyIgaW4gdGhlIHByZXNlbmNlIG9mIGVsZWN0cmljYWwgbm9pc2UsCi0gKiB3ZSBpbnNpc3Qgb24gYSAxLXNlY29uZCAiZ3JhY2UiIHBlcmlvZCwgYmVmb3JlIHN3aXRjaGluZyB0bwotICogdGhlIFJVTk5JTkcgb3IgU1VTUEVOREVEIHN0YXRlcywgZHVyaW5nIHdoaWNoIHRoZSBzdGF0ZSBpcwotICogbm90IGFsbG93ZWQgdG8gY2hhbmdlLgotICoKLSAqIFRoZSByZXN1bWUgcHJvY2VzcyBpcyBkaXZpZGVkIGludG8gc3Vic3RhdGVzIGluIG9yZGVyIHRvIGF2b2lkCi0gKiBwb3RlbnRpYWxseSBsZW5ndGggZGVsYXlzIGR1cmluZyB0aGUgdGltZXIgaGFuZGxlci4KLSAqCi0gKiBTdGF0ZXMgaW4gd2hpY2ggdGhlIGhvc3QgY29udHJvbGxlciBpcyBoYWx0ZWQgbXVzdCBoYXZlIHZhbHVlcyA8PSAwLgorICogd2hlbiB0aGVyZSBhcmUgbm8gZGV2aWNlcyBhdHRhY2hlZCB3ZSBkZWxheSBmb3IgMSBzZWNvbmQgaW4gdGhlCisgKiBSVU5OSU5HX05PREVWUyBzdGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHRoZSBBVVRPX1NUT1BQRUQgc3RhdGUuCisgKiAKKyAqIChOb3RlIHRoYXQgdGhlIEFVVE9fU1RPUFBFRCBzdGF0ZSB3b24ndCBiZSBuZWNlc3Nhcnkgb25jZSB0aGUgaHViCisgKiBkcml2ZXIgbGVhcm5zIHRvIGF1dG9zdXNwZW5kLikKICAqLwotZW51bSB1aGNpX3N0YXRlIHsKLQlVSENJX1JFU0VULAotCVVIQ0lfUlVOTklOR19HUkFDRSwJCS8qIEJlZm9yZSBSVU5OSU5HICovCi0JVUhDSV9SVU5OSU5HLAkJCS8qIFRoZSBub3JtYWwgc3RhdGUgKi8KLQlVSENJX1NVU1BFTkRJTkdfR1JBQ0UsCQkvKiBCZWZvcmUgU1VTUEVOREVEICovCi0JVUhDSV9TVVNQRU5ERUQgPSAtMTAsCQkvKiBXaGVuIG5vIGRldmljZXMgYXJlIGF0dGFjaGVkICovCi0JVUhDSV9SRVNVTUlOR18xLAotCVVIQ0lfUkVTVU1JTkdfMgorZW51bSB1aGNpX3JoX3N0YXRlIHsKKwkvKiBJbiB0aGUgZm9sbG93aW5nIHN0YXRlcyB0aGUgSEMgbXVzdCBiZSBoYWx0ZWQuCisJICogVGhlc2UgdHdvIG11c3QgY29tZSBmaXJzdCAqLworCVVIQ0lfUkhfUkVTRVQsCisJVUhDSV9SSF9TVVNQRU5ERUQsCisKKwlVSENJX1JIX0FVVE9fU1RPUFBFRCwKKwlVSENJX1JIX1JFU1VNSU5HLAorCisJLyogSW4gdGhpcyBzdGF0ZSB0aGUgSEMgY2hhbmdlcyBmcm9tIHJ1bm5pbmcgdG8gaGFsdGVkLAorCSAqIHNvIGl0IGNhbiBsZWdhbGx5IGFwcGVhciBlaXRoZXIgd2F5LiAqLworCVVIQ0lfUkhfU1VTUEVORElORywKKworCS8qIEluIHRoZSBmb2xsb3dpbmcgc3RhdGVzIGl0J3MgYW4gZXJyb3IgaWYgdGhlIEhDIGlzIGhhbHRlZC4KKwkgKiBUaGVzZSB0d28gbXVzdCBjb21lIGxhc3QgKi8KKwlVSENJX1JIX1JVTk5JTkcsCQkvKiBUaGUgbm9ybWFsIHN0YXRlICovCisJVUhDSV9SSF9SVU5OSU5HX05PREVWUywJCS8qIFJ1bm5pbmcgd2l0aCBubyBkZXZpY2VzIGF0dGFjaGVkICovCiB9OwogCiAvKgpAQCAtMzYzLDE1ICszNzAsMTYgQEAKIAlpbnQgZnNicjsJCQkJLyogRnVsbC1zcGVlZCBiYW5kd2lkdGggcmVjbGFtYXRpb24gKi8KIAl1bnNpZ25lZCBsb25nIGZzYnJ0aW1lb3V0OwkJLyogRlNCUiBkZWxheSAqLwogCi0JZW51bSB1aGNpX3N0YXRlIHN0YXRlOwkJCS8qIEZJWE1FOiBuZWVkcyBhIHNwaW5sb2NrICovCi0JdW5zaWduZWQgbG9uZyBzdGF0ZV9lbmQ7CQkvKiBUaW1lIG9mIG5leHQgdHJhbnNpdGlvbiAqLworCWVudW0gdWhjaV9yaF9zdGF0ZSByaF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGF1dG9fc3RvcF90aW1lOwkJLyogV2hlbiB0byBBVVRPX1NUT1AgKi8KKwogCXVuc2lnbmVkIGludCBmcmFtZV9udW1iZXI7CQkvKiBBcyBvZiBsYXN0IGNoZWNrICovCiAJdW5zaWduZWQgaW50IGlzX3N0b3BwZWQ7CiAjZGVmaW5lIFVIQ0lfSVNfU1RPUFBFRAkJOTk5OQkJLyogTGFyZ2VyIHRoYW4gYSBmcmFtZSAjICovCiAKIAl1bnNpZ25lZCBpbnQgc2Nhbl9pbl9wcm9ncmVzczoxOwkvKiBTY2hlZHVsZSBzY2FuIGlzIHJ1bm5pbmcgKi8KIAl1bnNpZ25lZCBpbnQgbmVlZF9yZXNjYW46MTsJCS8qIFJlZG8gdGhlIHNjaGVkdWxlIHNjYW4gKi8KLQl1bnNpZ25lZCBpbnQgcmVzdW1lX2RldGVjdDoxOwkJLyogTmVlZCBhIEdsb2JhbCBSZXN1bWUgKi8KKwl1bnNpZ25lZCBpbnQgaGNfaW5hY2Nlc3NpYmxlOjE7CQkvKiBIQyBpcyBzdXNwZW5kZWQgb3IgZGVhZCAqLwogCiAJLyogU3VwcG9ydCBmb3IgcG9ydCBzdXNwZW5kL3Jlc3VtZS9yZXNldCAqLwogCXVuc2lnbmVkIGxvbmcgcG9ydF9jX3N1c3BlbmQ7CQkvKiBCaXQtYXJyYXlzIG9mIHBvcnRzICovCkBAIC00NTEsNCArNDU5LDExIEBACiAgKiAjMiB1cmItPmxvY2sKICAqLwogCisKKy8qIFNvbWUgc3BlY2lhbCBJRHMgKi8KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0dFTkVTWVMJCTB4MTdhMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dMODgwU19VSENJCTB4ODA4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dMODgwU19FSENJCTB4ODA4NAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYwppbmRleCA0YzQ1YmE4Li40ZWFjZTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jCkBAIC0zMyw5ICszMywyNCBAQAogLyogc3RhdHVzIGNoYW5nZSBiaXRzOiAgbm9uemVybyB3cml0ZXMgd2lsbCBjbGVhciAqLwogI2RlZmluZSBSV0NfQklUUwkoVVNCUE9SVFNDX09DQyB8IFVTQlBPUlRTQ19QRUMgfCBVU0JQT1JUU0NfQ1NDKQogCi1zdGF0aWMgaW50IHVoY2lfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKKy8qIEEgcG9ydCB0aGF0IGVpdGhlciBpcyBjb25uZWN0ZWQgb3IgaGFzIGEgY2hhbmdlZC1iaXQgc2V0IHdpbGwgcHJldmVudAorICogdXMgZnJvbSBBVVRPX1NUT1BQSU5HLgorICovCitzdGF0aWMgaW50IGFueV9wb3J0c19hY3RpdmUoc3RydWN0IHVoY2lfaGNkICp1aGNpKQogewotCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CisJaW50IHBvcnQ7CisKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgdWhjaS0+cmhfbnVtcG9ydHM7ICsrcG9ydCkgeworCQlpZiAoKGludyh1aGNpLT5pb19hZGRyICsgVVNCUE9SVFNDMSArIHBvcnQgKiAyKSAmCisJCQkJKFVTQlBPUlRTQ19DQ1MgfCBSV0NfQklUUykpIHx8CisJCQkJdGVzdF9iaXQocG9ydCwgJnVoY2ktPnBvcnRfY19zdXNwZW5kKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2h1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIGNoYXIgKmJ1ZikKK3sKIAlpbnQgcG9ydDsKIAogCSpidWYgPSAwOwpAQCAtNDQsOCArNTksNiBAQAogCQkJCXRlc3RfYml0KHBvcnQsICZ1aGNpLT5wb3J0X2Nfc3VzcGVuZCkpCiAJCQkqYnVmIHw9ICgxIDw8IChwb3J0ICsgMSkpOwogCX0KLQlpZiAoKmJ1ZiAmJiB1aGNpLT5zdGF0ZSA9PSBVSENJX1NVU1BFTkRFRCkKLQkJdWhjaS0+cmVzdW1lX2RldGVjdCA9IDE7CiAJcmV0dXJuICEhKmJ1ZjsKIH0KIApAQCAtMTE1LDYgKzEyOCwxMSBAQAogCQkJCXNldF9iaXQocG9ydCwgJnVoY2ktPnJlc3VtaW5nX3BvcnRzKTsKIAkJCQl1aGNpLT5wb3J0c190aW1lb3V0ID0gamlmZmllcyArCiAJCQkJCQltc2Vjc190b19qaWZmaWVzKDIwKTsKKworCQkJCS8qIE1ha2Ugc3VyZSB3ZSBzZWUgdGhlIHBvcnQgYWdhaW4KKwkJCQkgKiBhZnRlciB0aGUgcmVzdW1pbmcgcGVyaW9kIGlzIG92ZXIuICovCisJCQkJbW9kX3RpbWVyKCZ1aGNpX3RvX2hjZCh1aGNpKS0+cmhfdGltZXIsCisJCQkJCQl1aGNpLT5wb3J0c190aW1lb3V0KTsKIAkJCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLAogCQkJCQkJdWhjaS0+cG9ydHNfdGltZW91dCkpIHsKIAkJCQl1aGNpX2ZpbmlzaF9zdXNwZW5kKHVoY2ksIHBvcnQsIHBvcnRfYWRkcik7CkBAIC0xMjMsNiArMTQxLDYwIEBACiAJfQogfQogCitzdGF0aWMgaW50IHVoY2lfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CisJaWYgKHVoY2ktPmhjX2luYWNjZXNzaWJsZSkgeworCQlzdGF0dXMgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJdWhjaV9jaGVja19wb3J0cyh1aGNpKTsKKwlzdGF0dXMgPSBnZXRfaHViX3N0YXR1c19kYXRhKHVoY2ksIGJ1Zik7CisKKwlzd2l0Y2ggKHVoY2ktPnJoX3N0YXRlKSB7CisJICAgIGNhc2UgVUhDSV9SSF9TVVNQRU5ESU5HOgorCSAgICBjYXNlIFVIQ0lfUkhfU1VTUEVOREVEOgorCQkvKiBpZiBwb3J0IGNoYW5nZSwgYXNrIHRvIGJlIHJlc3VtZWQgKi8KKwkJaWYgKHN0YXR1cykKKwkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CisJCWJyZWFrOworCisJICAgIGNhc2UgVUhDSV9SSF9BVVRPX1NUT1BQRUQ6CisJCS8qIGlmIHBvcnQgY2hhbmdlLCBhdXRvIHN0YXJ0ICovCisJCWlmIChzdGF0dXMpCisJCQl3YWtldXBfcmgodWhjaSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgVUhDSV9SSF9SVU5OSU5HOgorCQkvKiBhcmUgYW55IGRldmljZXMgYXR0YWNoZWQ/ICovCisJCWlmICghYW55X3BvcnRzX2FjdGl2ZSh1aGNpKSkgeworCQkJdWhjaS0+cmhfc3RhdGUgPSBVSENJX1JIX1JVTk5JTkdfTk9ERVZTOworCQkJdWhjaS0+YXV0b19zdG9wX3RpbWUgPSBqaWZmaWVzICsgSFo7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgY2FzZSBVSENJX1JIX1JVTk5JTkdfTk9ERVZTOgorCQkvKiBhdXRvLXN0b3AgaWYgbm90aGluZyBjb25uZWN0ZWQgZm9yIDEgc2Vjb25kICovCisJCWlmIChhbnlfcG9ydHNfYWN0aXZlKHVoY2kpKQorCQkJdWhjaS0+cmhfc3RhdGUgPSBVSENJX1JIX1JVTk5JTkc7CisJCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdWhjaS0+YXV0b19zdG9wX3RpbWUpKQorCQkJc3VzcGVuZF9yaCh1aGNpLCBVSENJX1JIX0FVVE9fU1RPUFBFRCk7CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyogc2l6ZSBvZiByZXR1cm5lZCBidWZmZXIgaXMgcGFydCBvZiBVU0Igc3BlYyAqLwogc3RhdGljIGludCB1aGNpX2h1Yl9jb250cm9sKHN0cnVjdCB1c2JfaGNkICpoY2QsIHUxNiB0eXBlUmVxLCB1MTYgd1ZhbHVlLAogCQkJdTE2IHdJbmRleCwgY2hhciAqYnVmLCB1MTYgd0xlbmd0aCkKQEAgLTEzNCw2ICsyMDYsOSBAQAogCXUxNiB3UG9ydENoYW5nZSwgd1BvcnRTdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICh1aGNpLT5oY19pbmFjY2Vzc2libGUpCisJCXJldHVybiAtRVRJTUVET1VUOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKIAlzd2l0Y2ggKHR5cGVSZXEpIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKaW5kZXggMmE3YzE5NS4uYmJiMzZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCkBAIC0zMiw2ICszMiw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1aGNpX3NldF9uZXh0X2ludGVycnVwdChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCiB7CisJaWYgKHVoY2ktPmlzX3N0b3BwZWQpCisJCW1vZF90aW1lcigmdWhjaS0+c3RhbGxfdGltZXIsIGppZmZpZXMpOwogCXVoY2ktPnRlcm1fdGQtPnN0YXR1cyB8PSBjcHVfdG9fbGUzMihURF9DVFJMX0lPQyk7IAogfQogCkBAIC00Niw3ICs0OCw3IEBACiAJbGlzdF9tb3ZlX3RhaWwoJnVyYnAtPnVyYl9saXN0LCAmdWhjaS0+Y29tcGxldGVfbGlzdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWhjaV90ZCAqdWhjaV9hbGxvY190ZChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IHVoY2lfdGQgKnVoY2lfYWxsb2NfdGQoc3RydWN0IHVoY2lfaGNkICp1aGNpKQogewogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlzdHJ1Y3QgdWhjaV90ZCAqdGQ7CkBAIC02MSwxNCArNjMsMTEgQEAKIAl0ZC0+YnVmZmVyID0gMDsKIAogCXRkLT5mcmFtZSA9IC0xOwotCXRkLT5kZXYgPSBkZXY7CiAKIAlJTklUX0xJU1RfSEVBRCgmdGQtPmxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ0ZC0+cmVtb3ZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ0ZC0+ZmxfbGlzdCk7CiAKLQl1c2JfZ2V0X2RldihkZXYpOwotCiAJcmV0dXJuIHRkOwogfQogCkBAIC0xNjgsMTMgKzE2NywxMCBAQAogCWlmICghbGlzdF9lbXB0eSgmdGQtPmZsX2xpc3QpKQogCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgInRkICVwIHN0aWxsIGluIGZsX2xpc3QhXG4iLCB0ZCk7CiAKLQlpZiAodGQtPmRldikKLQkJdXNiX3B1dF9kZXYodGQtPmRldik7Ci0KIAlkbWFfcG9vbF9mcmVlKHVoY2ktPnRkX3Bvb2wsIHRkLCB0ZC0+ZG1hX2hhbmRsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWhjaV9xaCAqdWhjaV9hbGxvY19xaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IHVoY2lfcWggKnVoY2lfYWxsb2NfcWgoc3RydWN0IHVoY2lfaGNkICp1aGNpKQogewogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlzdHJ1Y3QgdWhjaV9xaCAqcWg7CkBAIC0xODgsMTQgKzE4NCwxMSBAQAogCXFoLT5lbGVtZW50ID0gVUhDSV9QVFJfVEVSTTsKIAlxaC0+bGluayA9IFVIQ0lfUFRSX1RFUk07CiAKLQlxaC0+ZGV2ID0gZGV2OwogCXFoLT51cmJwID0gTlVMTDsKIAogCUlOSVRfTElTVF9IRUFEKCZxaC0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnFoLT5yZW1vdmVfbGlzdCk7CiAKLQl1c2JfZ2V0X2RldihkZXYpOwotCiAJcmV0dXJuIHFoOwogfQogCkBAIC0yMDYsOSArMTk5LDYgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnFoLT5yZW1vdmVfbGlzdCkpCiAJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAicWggJXAgc3RpbGwgaW4gcmVtb3ZlX2xpc3QhXG4iLCBxaCk7CiAKLQlpZiAocWgtPmRldikKLQkJdXNiX3B1dF9kZXYocWgtPmRldik7Ci0KIAlkbWFfcG9vbF9mcmVlKHVoY2ktPnFoX3Bvb2wsIHFoLCBxaC0+ZG1hX2hhbmRsZSk7CiB9CiAKQEAgLTU5Nyw3ICs1ODcsNyBAQAogCS8qCiAJICogQnVpbGQgdGhlIFREIGZvciB0aGUgY29udHJvbCByZXF1ZXN0IHNldHVwIHBhY2tldAogCSAqLwotCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1cmItPmRldik7CisJdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2kpOwogCWlmICghdGQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02MjYsNyArNjE2LDcgQEAKIAkJaWYgKHBrdHN6ZSA+IG1heHN6ZSkKIAkJCXBrdHN6ZSA9IG1heHN6ZTsKIAotCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSwgdXJiLT5kZXYpOworCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJCWlmICghdGQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNjQ0LDcgKzYzNCw3IEBACiAJLyoKIAkgKiBCdWlsZCB0aGUgZmluYWwgVEQgZm9yIGNvbnRyb2wgc3RhdHVzIAogCSAqLwotCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1cmItPmRldik7CisJdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2kpOwogCWlmICghdGQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NjYsNyArNjU2LDcgQEAKIAl1aGNpX2ZpbGxfdGQodGQsIHN0YXR1cyB8IFREX0NUUkxfSU9DLAogCQlkZXN0aW5hdGlvbiB8IHVoY2lfZXhwbGVuKFVIQ0lfTlVMTF9EQVRBX1NJWkUpLCAwKTsKIAotCXFoID0gdWhjaV9hbGxvY19xaCh1aGNpLCB1cmItPmRldik7CisJcWggPSB1aGNpX2FsbG9jX3FoKHVoY2kpOwogCWlmICghcWgpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC04NjUsNyArODU1LDcgQEAKIAkJCQlzdGF0dXMgJj0gflREX0NUUkxfU1BEOwogCQl9CiAKLQkJdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2ksIHVyYi0+ZGV2KTsKKwkJdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2kpOwogCQlpZiAoIXRkKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTg5MSw3ICs4ODEsNyBAQAogCSAqLwogCWlmICh1c2JfcGlwZW91dCh1cmItPnBpcGUpICYmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1pFUk9fUEFDS0VUKSAmJgogCSAgICAhbGVuICYmIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkgewotCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSwgdXJiLT5kZXYpOworCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJCWlmICghdGQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtOTEzLDcgKzkwMyw3IEBACiAJICogZmxhZyBzZXR0aW5nLiAqLwogCXRkLT5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoVERfQ1RSTF9JT0MpOwogCi0JcWggPSB1aGNpX2FsbG9jX3FoKHVoY2ksIHVyYi0+ZGV2KTsKKwlxaCA9IHVoY2lfYWxsb2NfcWgodWhjaSk7CiAJaWYgKCFxaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEwOTYsNyArMTA4Niw3IEBACiAJCWlmICghdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgpCiAJCQljb250aW51ZTsKIAotCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSwgdXJiLT5kZXYpOworCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJCWlmICghdGQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTE3NCw3ICsxMTY0LDcgQEAKIAogc3RhdGljIGludCB1aGNpX3VyYl9lbnF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCi0JCXN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKKwkJc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOwpAQCAtMTQ5Nyw2ICsxNDg3LDcgQEAKICByZXNjYW46CiAJdWhjaS0+bmVlZF9yZXNjYW4gPSAwOwogCisJdWhjaV9jbGVhcl9uZXh0X2ludGVycnVwdCh1aGNpKTsKIAl1aGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcih1aGNpKTsKIAogCWlmICh1aGNpLT5mcmFtZV9udW1iZXIgKyB1aGNpLT5pc19zdG9wcGVkICE9IHVoY2ktPnFoX3JlbW92ZV9hZ2UpCkBAIC0xNTM3LDMgKzE1MjgsMjYgQEAKIAkvKiBXYWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciBhbiBVUkIgdG8gY29tcGxldGUgKi8KIAl3YWtlX3VwX2FsbCgmdWhjaS0+d2FpdHFoKTsKIH0KKworc3RhdGljIHZvaWQgY2hlY2tfZnNicihzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJc3RydWN0IHVyYl9wcml2ICp1cDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodXAsICZ1aGNpLT51cmJfbGlzdCwgdXJiX2xpc3QpIHsKKwkJc3RydWN0IHVyYiAqdSA9IHVwLT51cmI7CisKKwkJc3Bpbl9sb2NrKCZ1LT5sb2NrKTsKKworCQkvKiBDaGVjayBpZiB0aGUgRlNCUiB0aW1lZCBvdXQgKi8KKwkJaWYgKHVwLT5mc2JyICYmICF1cC0+ZnNicl90aW1lb3V0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdXAtPmZzYnJ0aW1lICsgSURMRV9USU1FT1VUKSkKKwkJCXVoY2lfZnNicl90aW1lb3V0KHVoY2ksIHUpOworCisJCXNwaW5fdW5sb2NrKCZ1LT5sb2NrKTsKKwl9CisKKwkvKiBSZWFsbHkgZGlzYWJsZSBGU0JSICovCisJaWYgKCF1aGNpLT5mc2JyICYmIHVoY2ktPmZzYnJ0aW1lb3V0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdWhjaS0+ZnNicnRpbWVvdXQpKSB7CisJCXVoY2ktPmZzYnJ0aW1lb3V0ID0gMDsKKwkJdWhjaS0+c2tlbF90ZXJtX3FoLT5saW5rID0gVUhDSV9QVFJfVEVSTTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwppbmRleCBkMjhlN2VhLi4yOThlNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKQEAgLTE1MSw2ICsxNTEsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhY29tLgogCitjb25maWcgVVNCX0FDRUNBRAorCXRyaXN0YXRlICJBY2VjYWQgRmxhaXIgdGFibGV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgVVNCIHZlcnNpb24gb2YgdGhlIEFjZWNhZCBGbGFpcgorCSAgdGFibGV0LiAgTWFrZSBzdXJlIHRvIHNheSBZIHRvICJNb3VzZSBzdXBwb3J0IgorCSAgKENPTkZJR19JTlBVVF9NT1VTRURFVikgYW5kL29yICJFdmVudCBpbnRlcmZhY2Ugc3VwcG9ydCIKKwkgIChDT05GSUdfSU5QVVRfRVZERVYpIGFzIHdlbGwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjZWNhZC4KKwogY29uZmlnIFVTQl9LQlRBQgogCXRyaXN0YXRlICJLQiBHZWFyIEphbVN0dWRpbyB0YWJsZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVApAQCAtMTkwLDYgKzIwMiwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbXRvdWNodXNiLgogCitjb25maWcgVVNCX0lUTVRPVUNICisJdHJpc3RhdGUgIklUTSBUb3VjaCBVU0IgVG91Y2hzY3JlZW4gRHJpdmVyIgorCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBJVE0gVG91Y2ggVVNCCisJICBUb3VjaHNjcmVlbiBjb250cm9sbGVyLgorCisJICBUaGlzIHRvdWNoc2NyZWVuIGlzIHVzZWQgaW4gTEcgMTUxMFNGIG1vbml0b3JzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpdG10b3VjaC4KKwogY29uZmlnIFVTQl9FR0FMQVgKIAl0cmlzdGF0ZSAiZUdhbGF4IFRvdWNoS2l0IFVTQiBUb3VjaHNjcmVlbiBEcml2ZXIiCiAJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQKQEAgLTIzNSwzICsyNTksMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIGF0aV9yZW1vdGUuCiAKK2NvbmZpZyBVU0JfS0VZU1BBTl9SRU1PVEUKKwl0cmlzdGF0ZSAiS2V5c3BhbiBETVIgVVNCIHJlbW90ZSBjb250cm9sIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVVNCICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgS2V5c3BhbiBETVIgVVNCIHJlbW90ZSBjb250cm9sLgorCSAgQ3VycmVudGx5IG9ubHkgdGhlIFVJQS0xMSB0eXBlIG9mIHJlY2VpdmVyIGhhcyBiZWVuIHRlc3RlZC4gIFRoZSB0YWcKKwkgIG9uIHRoZSByZWNlaXZlciB0aGF0IGNvbm5lY3RzIHRvIHRoZSBVU0IgcG9ydCBzaG91bGQgaGF2ZSBhIFAvTiB0aGF0CisJICB3aWxsIHRlbGwgeW91IHdoYXQgdHlwZSBvZiBETVIgeW91IGhhdmUuICBUaGUgVUlBLTEwIHR5cGUgaXMgbm90CisJICBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLiAgVGhpcyBkcml2ZXIgbWFwcyBhbGwgYnV0dG9ucyB0byBrZXlwcmVzcworCSAgZXZlbnRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBrZXlzcGFuX3JlbW90ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKaW5kZXggNmJjZWRkMS4uZjE1NDdiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKQEAgLTMxLDkgKzMxLDEyIEBACiBvYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC5vCiBvYmotJChDT05GSUdfVVNCX0tCRCkJCSs9IHVzYmtiZC5vCiBvYmotJChDT05GSUdfVVNCX0tCVEFCKQkJKz0ga2J0YWIubworb2JqLSQoQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSkJKz0ga2V5c3Bhbl9yZW1vdGUubwogb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IHVzYm1vdXNlLm8KIG9iai0kKENPTkZJR19VU0JfTVRPVUNIKQkrPSBtdG91Y2h1c2Iubworb2JqLSQoQ09ORklHX1VTQl9JVE1UT1VDSCkJKz0gaXRtdG91Y2gubwogb2JqLSQoQ09ORklHX1VTQl9FR0FMQVgpCSs9IHRvdWNoa2l0dXNiLm8KIG9iai0kKENPTkZJR19VU0JfUE9XRVJNQVRFKQkrPSBwb3dlcm1hdGUubwogb2JqLSQoQ09ORklHX1VTQl9XQUNPTSkJCSs9IHdhY29tLm8KK29iai0kKENPTkZJR19VU0JfQUNFQ0FEKQkrPSBhY2VjYWQubwogb2JqLSQoQ09ORklHX1VTQl9YUEFEKQkJKz0geHBhZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hY2VjYWQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2Y3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9hY2VjYWQuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBFZG91YXJkIFRJU1NFUkFOVCAgIDxlZG91YXJkLnRpc3NlcmFudEB3YW5hZG9vLmZyPgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFN0ZXBoYW5lIFZPTFRaICAgICAgPHN2b2x0ekBudW1lcmljYWJsZS5mcj4KKyAqCisgKiAgVVNCIEFjZWNhZCAiQWNlY2FkIEZsYWlyIiB0YWJsZXQgc3VwcG9ydAorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgICAgIHYzLjIgLSBBZGRlZCBzeXNmcyBzdXBwb3J0CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYzLjIiCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICJVU0IgQWNlY2FkIEZsYWlyIHRhYmxldCBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJFZG91YXJkIFRJU1NFUkFOVCA8ZWRvdWFyZC50aXNzZXJhbnRAd2FuYWRvby5mcj4iCisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoRFJJVkVSX0xJQ0VOU0UpOworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUNFQ0FECTB4MDQ2MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0ZMQUlSCTB4MDAwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzMwMgkweDAwMDgKKworc3RydWN0IHVzYl9hY2VjYWQgeworCWNoYXIgbmFtZVsxMjhdOworCWNoYXIgcGh5c1s2NF07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGRldjsKKwlzdHJ1Y3QgdXJiICppcnE7CisKKwlzaWduZWQgY2hhciAqZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOworfTsKKworc3RhdGljIHZvaWQgdXNiX2FjZWNhZF9pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX2FjZWNhZCAqYWNlY2FkID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBhY2VjYWQtPmRhdGE7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gJmFjZWNhZC0+ZGV2OworCWludCBwcm94LCBzdGF0dXM7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgMDoKKwkJCS8qIHN1Y2Nlc3MgKi8KKwkJCWJyZWFrOworCQljYXNlIC1FQ09OTlJFU0VUOgorCQljYXNlIC1FTk9FTlQ6CisJCWNhc2UgLUVTSFVURE9XTjoKKwkJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJZ290byByZXN1Ym1pdDsKKwl9CisKKwlwcm94ID0gKGRhdGFbMF0gJiAweDA0KSA+PiAyOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9QRU4sIHByb3gpOworCisJaWYgKHByb3gpIHsKKwkJaW50IHggPSBkYXRhWzFdIHwgKGRhdGFbMl0gPDwgOCk7CisJCWludCB5ID0gZGF0YVszXSB8IChkYXRhWzRdIDw8IDgpOworCQkvKlByZXNzdXJlIHNob3VsZCBjb21wdXRlIHRoZSBzYW1lIHdheSBmb3IgZmxhaXIgYW5kIDMwMiovCisJCWludCBwcmVzc3VyZSA9IGRhdGFbNV0gfCAoKGludClkYXRhWzZdIDw8IDgpOworCQlpbnQgdG91Y2ggPSBkYXRhWzBdICYgMHgwMTsKKwkJaW50IHN0eWx1cyA9IChkYXRhWzBdICYgMHgxMCkgPj4gNDsKKwkJaW50IHN0eWx1czIgPSAoZGF0YVswXSAmIDB4MjApID4+IDU7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgeSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIHByZXNzdXJlKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgdG91Y2gpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgc3R5bHVzKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMyLCBzdHlsdXMyKTsKKwl9CisKKwkvKiBldmVudCB0ZXJtaW5hdGlvbiAqLworCWlucHV0X3N5bmMoZGV2KTsKKworcmVzdWJtaXQ6CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykKKwkJZXJyICgiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQwLCBzdGF0dXMgJWQiLAorCQkJYWNlY2FkLT51c2JkZXYtPmJ1cy0+YnVzX25hbWUsIGFjZWNhZC0+dXNiZGV2LT5kZXZwYXRoLCBzdGF0dXMpOworfQorCitzdGF0aWMgaW50IHVzYl9hY2VjYWRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9hY2VjYWQgKmFjZWNhZCA9IGRldi0+cHJpdmF0ZTsKKworCWFjZWNhZC0+aXJxLT5kZXYgPSBhY2VjYWQtPnVzYmRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIoYWNlY2FkLT5pcnEsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JfYWNlY2FkX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2FjZWNhZCAqYWNlY2FkID0gZGV2LT5wcml2YXRlOworCisJdXNiX2tpbGxfdXJiKGFjZWNhZC0+aXJxKTsKK30KKworc3RhdGljIGludCB1c2JfYWNlY2FkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgdXNiX2FjZWNhZCAqYWNlY2FkOworCWludCBwaXBlLCBtYXhwOworCWNoYXIgcGF0aFs2NF07CisKKwlpZiAoaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisKKwlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpCisJCXJldHVybiAtRU5PREVWOworCisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCisJYWNlY2FkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzYl9hY2VjYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjZWNhZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhY2VjYWQtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgOCwgU0xBQl9LRVJORUwsICZhY2VjYWQtPmRhdGFfZG1hKTsKKwlpZiAoIWFjZWNhZC0+ZGF0YSkKKwkJZ290byBmYWlsMTsKKworCWFjZWNhZC0+aXJxID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjZWNhZC0+aXJxKQorCQlnb3RvIGZhaWwyOworCisJaWYgKGRldi0+bWFudWZhY3R1cmVyKQorCQlzdHJsY3B5KGFjZWNhZC0+bmFtZSwgZGV2LT5tYW51ZmFjdHVyZXIsIHNpemVvZihhY2VjYWQtPm5hbWUpKTsKKworCWlmIChkZXYtPnByb2R1Y3QpIHsKKwkJaWYgKGRldi0+bWFudWZhY3R1cmVyKQorCQkJc3RybGNhdChhY2VjYWQtPm5hbWUsICIgIiwgc2l6ZW9mKGFjZWNhZC0+bmFtZSkpOworCQlzdHJsY2F0KGFjZWNhZC0+bmFtZSwgZGV2LT5wcm9kdWN0LCBzaXplb2YoYWNlY2FkLT5uYW1lKSk7CisJfQorCisJdXNiX21ha2VfcGF0aChkZXYsIHBhdGgsIHNpemVvZihwYXRoKSk7CisJc25wcmludGYoYWNlY2FkLT5waHlzLCBzaXplb2YoYWNlY2FkLT5waHlzKSwgIiVzL2lucHV0MCIsIHBhdGgpOworCisJYWNlY2FkLT51c2JkZXYgPSBkZXY7CisKKwlhY2VjYWQtPmRldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJYWNlY2FkLT5kZXYuYWJzYml0WzBdID0gQklUKEFCU19YKSB8IEJJVChBQlNfWSkgfCBCSVQoQUJTX1BSRVNTVVJFKTsKKwlhY2VjYWQtPmRldi5rZXliaXRbTE9ORyhCVE5fTEVGVCldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOworCWFjZWNhZC0+ZGV2LmtleWJpdFtMT05HKEJUTl9ESUdJKV0gPSBCSVQoQlROX1RPT0xfUEVOKSB8QklUKEJUTl9UT1VDSCkgfCBCSVQoQlROX1NUWUxVUykgfCBCSVQoQlROX1NUWUxVUzIpOworCisJc3dpdGNoIChpZC0+ZHJpdmVyX2luZm8pIHsKKwkJY2FzZSAwOgorCQkJYWNlY2FkLT5kZXYuYWJzbWF4W0FCU19YXSA9IDUwMDA7CisJCQlhY2VjYWQtPmRldi5hYnNtYXhbQUJTX1ldID0gMzc1MDsKKwkJCWFjZWNhZC0+ZGV2LmFic21heFtBQlNfUFJFU1NVUkVdID0gNTEyOworCQkJaWYgKCFzdHJsZW4oYWNlY2FkLT5uYW1lKSkKKwkJCQlzbnByaW50ZihhY2VjYWQtPm5hbWUsIHNpemVvZihhY2VjYWQtPm5hbWUpLAorCQkJCQkiVVNCIEFjZWNhZCBGbGFpciBUYWJsZXQgJTA0eDolMDR4IiwKKwkJCQkJZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yLCBkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhY2VjYWQtPmRldi5hYnNtYXhbQUJTX1hdID0gMzAwMDsKKwkJCWFjZWNhZC0+ZGV2LmFic21heFtBQlNfWV0gPSAyMjUwOworCQkJYWNlY2FkLT5kZXYuYWJzbWF4W0FCU19QUkVTU1VSRV0gPSAxMDI0OworCQkJaWYgKCFzdHJsZW4oYWNlY2FkLT5uYW1lKSkKKwkJCQlzbnByaW50ZihhY2VjYWQtPm5hbWUsIHNpemVvZihhY2VjYWQtPm5hbWUpLAorCQkJCQkiVVNCIEFjZWNhZCAzMDIgVGFibGV0ICUwNHg6JTA0eCIsCisJCQkJCWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciwgZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJCQlicmVhazsKKwl9CisKKwlhY2VjYWQtPmRldi5hYnNmdXp6W0FCU19YXSA9IDQ7CisJYWNlY2FkLT5kZXYuYWJzZnV6eltBQlNfWV0gPSA0OworCisJYWNlY2FkLT5kZXYucHJpdmF0ZSA9IGFjZWNhZDsKKwlhY2VjYWQtPmRldi5vcGVuID0gdXNiX2FjZWNhZF9vcGVuOworCWFjZWNhZC0+ZGV2LmNsb3NlID0gdXNiX2FjZWNhZF9jbG9zZTsKKworCWFjZWNhZC0+ZGV2Lm5hbWUgPSBhY2VjYWQtPm5hbWU7CisJYWNlY2FkLT5kZXYucGh5cyA9IGFjZWNhZC0+cGh5czsKKwlhY2VjYWQtPmRldi5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlhY2VjYWQtPmRldi5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCWFjZWNhZC0+ZGV2LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlhY2VjYWQtPmRldi5pZC52ZXJzaW9uID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJYWNlY2FkLT5kZXYuZGV2ID0gJmludGYtPmRldjsKKworCXVzYl9maWxsX2ludF91cmIoYWNlY2FkLT5pcnEsIGRldiwgcGlwZSwKKwkJCWFjZWNhZC0+ZGF0YSwgbWF4cCA+IDggPyA4IDogbWF4cCwKKwkJCXVzYl9hY2VjYWRfaXJxLCBhY2VjYWQsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworCWFjZWNhZC0+aXJxLT50cmFuc2Zlcl9kbWEgPSBhY2VjYWQtPmRhdGFfZG1hOworCWFjZWNhZC0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmYWNlY2FkLT5kZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIHdpdGggcGFja2V0IHNpemUgJWQgb24gJXNcbiIsCisJCWFjZWNhZC0+bmFtZSwgbWF4cCwgcGF0aCk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGFjZWNhZCk7CisKKwlyZXR1cm4gMDsKKworIGZhaWwyOgl1c2JfYnVmZmVyX2ZyZWUoZGV2LCA4LCBhY2VjYWQtPmRhdGEsIGFjZWNhZC0+ZGF0YV9kbWEpOworIGZhaWwxOglrZnJlZShhY2VjYWQpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCB1c2JfYWNlY2FkX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9hY2VjYWQgKmFjZWNhZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCWlmIChhY2VjYWQpIHsKKwkJdXNiX2tpbGxfdXJiKGFjZWNhZC0+aXJxKTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmFjZWNhZC0+ZGV2KTsKKwkJdXNiX2ZyZWVfdXJiKGFjZWNhZC0+aXJxKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDEwLCBhY2VjYWQtPmRhdGEsIGFjZWNhZC0+ZGF0YV9kbWEpOworCQlrZnJlZShhY2VjYWQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9hY2VjYWRfaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0ZMQUlSKSwgLmRyaXZlcl9pbmZvID0gMCB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FDRUNBRCwgVVNCX0RFVklDRV9JRF8zMDIpLAkgLmRyaXZlcl9pbmZvID0gMSB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9hY2VjYWRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FjZWNhZF9kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInVzYl9hY2VjYWQiLAorCS5wcm9iZSA9CXVzYl9hY2VjYWRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JfYWNlY2FkX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX2FjZWNhZF9pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9hY2VjYWRfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnVzYl9hY2VjYWRfZHJpdmVyKTsKKwlpZiAocmVzdWx0ID09IDApCisJCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2FjZWNhZF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9hY2VjYWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2FjZWNhZF9pbml0KTsKK21vZHVsZV9leGl0KHVzYl9hY2VjYWRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9haXB0ZWsuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCmluZGV4IGU5OTFmN2UuLjZiYjBmMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBOYXRpdmUgc3VwcG9ydCBmb3IgdGhlIEFpcHRlayBIeXBlclBlbiBVU0IgVGFibGV0cwogICogICg0MDAwVS81MDAwVS82MDAwVS84MDAwVS8xMjAwMFUpCi0gKiAgCisgKgogICogIENvcHlyaWdodCAoYykgMjAwMSAgICAgIENocmlzIEF0ZW5hc2lvICAgPGNocmlzQGNydWQubmV0PgogICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEJyeWFuIFcuIEhlYWRsZXkgPGJ3aGVhZGxleUBlYXJ0aGxpbmsubmV0PgogICoKQEAgLTMxLDcgKzMxLDcgQEAKICAqICAgICAgICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBzeXNmcyBpbnRlcmZhY2UsIGRlcHJlY2F0aW5nIHRoZQogICogICAgICAgICAgICAgcHJvY2ZzIGludGVyZmFjZSBmb3IgMi41Lngga2VybmVsLiBBbHNvIGFkZGVkIHN1cHBvcnQgZm9yCiAgKiAgICAgICAgICAgICBXaGVlbCBjb21tYW5kLiBCcnlhbiBXLiBIZWFkbGV5IEp1bHktMTUtMjAwMy4KLSAqICAgICAgdjEuMiAtIFJld29ya2VkIGppdHRlciB0aW1lciBhcyBhIGtlcm5lbCB0aHJlYWQuIAorICogICAgICB2MS4yIC0gUmV3b3JrZWQgaml0dGVyIHRpbWVyIGFzIGEga2VybmVsIHRocmVhZC4KICAqICAgICAgICAgICAgIEJyeWFuIFcuIEhlYWRsZXkgTm92ZW1iZXItMjgtMjAwMy9KYW4tMTAtMjAwNC4KICAqICAgICAgdjEuMyAtIFJlcGFpcmVkIGlzc3VlIG9mIGtlcm5lbCB0aHJlYWQgZ29pbmcgbnV0cyBvbiBzaW5nbGUtcHJvY2Vzc29yCiAgKiAgICAgICAgICAgICBtYWNoaW5lcywgaW50cm9kdWNlZCBwcm9ncmFtbWFibGVEZWxheSBhcyBhIGNvbW1hbmQgbGluZQpAQCAtNDksMTAgKzQ5LDEwIEBACiAgKiBOT1RFOgogICogICAgICBUaGlzIGtlcm5lbCBkcml2ZXIgaXMgYXVnbWVudGVkIGJ5IHRoZSAiQWlwdGVrIiBYRnJlZTg2IGlucHV0CiAgKiAgICAgIGRyaXZlciBmb3IgeW91ciBYIHNlcnZlciwgYXMgd2VsbCBhcyB0aGUgR2FpcHRlayBHVUkgRnJvbnQtZW5kCi0gKiAgICAgICJUYWJsZXQgTWFuYWdlciIuIAotICogICAgICBUaGVzZSB0aHJlZSBwcm9kdWN0cyBhcmUgaGlnaGx5IGludGVyYWN0aXZlIHdpdGggb25lIGFub3RoZXIsIAorICogICAgICAiVGFibGV0IE1hbmFnZXIiLgorICogICAgICBUaGVzZSB0aHJlZSBwcm9kdWN0cyBhcmUgaGlnaGx5IGludGVyYWN0aXZlIHdpdGggb25lIGFub3RoZXIsCiAgKiAgICAgIHNvIHRoZXJlZm9yZSBpdCdzIGVhc2llciB0byBkb2N1bWVudCB0aGVtIGFsbCBhcyBvbmUgc3Vic3lzdGVtLgotICogICAgICBQbGVhc2UgdmlzaXQgdGhlIHByb2plY3QncyAiaG9tZSBwYWdlIiwgbG9jYXRlZCBhdCwgCisgKiAgICAgIFBsZWFzZSB2aXNpdCB0aGUgcHJvamVjdCdzICJob21lIHBhZ2UiLCBsb2NhdGVkIGF0LAogICogICAgICBodHRwOi8vYWlwdGVrdGFibGV0LnNvdXJjZWZvcmdlLm5ldC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTU2LDcgKzE1Niw3IEBACiAgKiBDb21tYW5kL0RhdGEgICAgRGVzY3JpcHRpb24gICAgIFJldHVybiBCeXRlcyAgICBSZXR1cm4gVmFsdWUKICAqIDB4MTAvMHgwMCAgICAgICBTd2l0Y2hUb01vdXNlICAgICAgIDAKICAqIDB4MTAvMHgwMSAgICAgICBTd2l0Y2hUb1RhYmxldCAgICAgIDAKLSAqIDB4MTgvMHgwNCAgICAgICBTZXRSZXNvbHV0aW9uICAgICAgIDAgCisgKiAweDE4LzB4MDQgICAgICAgU2V0UmVzb2x1dGlvbiAgICAgICAwCiAgKiAweDEyLzB4RkYgICAgICAgQXV0b0dhaW5PbiAgICAgICAgICAwCiAgKiAweDE3LzB4MDAgICAgICAgRmlsdGVyT24gICAgICAgICAgICAwCiAgKiAweDAxLzB4MDAgICAgICAgR2V0WEV4dGVuc2lvbiAgICAgICAyICAgICAgICAgICBNYXhYCkBAIC0yNDcsNyArMjQ3LDcgQEAKICNkZWZpbmUgQUlQVEVLX0RJQUdOT1NUSUNfU0VORElOR19BQlNPTFVURV9JTl9SRUxBVElWRQkyCiAjZGVmaW5lIEFJUFRFS19ESUFHTk9TVElDX1RPT0xfRElTQUxMT1dFRAkJMwogCi0JLyogVGltZSB0byB3YWl0IChpbiBtcykgdG8gaGVscCBtYXNrIGhhbmQgaml0dGVyaW5nIAorCS8qIFRpbWUgdG8gd2FpdCAoaW4gbXMpIHRvIGhlbHAgbWFzayBoYW5kIGppdHRlcmluZwogCSAqIHdoZW4gcHJlc3NpbmcgdGhlIHN0eWx1cyBidXR0b25zLgogCSAqLwogI2RlZmluZSBBSVBURUtfSklUVEVSX0RFTEFZX0RFRkFVTFQJCQk1MApAQCAtMzI0LDcgKzMyNCw2IEBACiAJc3RydWN0IGFpcHRla19zZXR0aW5ncyBjdXJTZXR0aW5nOwkvKiB0YWJsZXQncyBjdXJyZW50IHByb2dyYW1tYWJsZSAqLwogCXN0cnVjdCBhaXB0ZWtfc2V0dGluZ3MgbmV3U2V0dGluZzsJLyogLi4uIGFuZCBuZXcgcGFyYW0gc2V0dGluZ3MgICAgKi8KIAl1bnNpZ25lZCBpbnQgaWZudW07CQkJLyogaW50ZXJmYWNlIG51bWJlciBmb3IgSU8gICAgICAgKi8KLQlpbnQgb3BlbkNvdW50OwkJCQkvKiBtb2R1bGUgdXNlIGNvdW50ZXIgICAgICAgICAgICAqLwogCWludCBkaWFnbm9zdGljOwkJCQkvKiB0YWJsZXQgZGlhZ25vc3RpYyBjb2RlcyAgICAgICAqLwogCXVuc2lnbmVkIGxvbmcgZXZlbnRDb3VudDsJCS8qIGV2ZW50IGNvdW50ICAgICAgICAgICAgICAgICAgICovCiAJaW50IGluRGVsYXk7CQkJCS8qIGppdHRlcjogaW4gaml0dGVyIGRlbGF5PyAgICAgICovCkBAIC03OTEsNyArNzkwLDcgQEAKICAqIHNwZWNpZmljIEFpcHRlayBtb2RlbCBudW1iZXJzLCBiZWNhdXNlIHRoZXJlIGhhcyBiZWVuIG92ZXJsYXBzLAogICogdXNlLCBhbmQgcmV1c2Ugb2YgaWQncyBpbiBleGlzdGluZyBtb2RlbHMuIENlcnRhaW4gbW9kZWxzIGhhdmUKICAqIGJlZW4ga25vd24gdG8gdXNlIG1vcmUgdGhhbiBvbmUgSUQsIGluZGljYXRpdmUgcGVyaGFwcyBvZgotICogbWFudWZhY3R1cmluZyByZXZpc2lvbnMuIEluIGFueSBldmVudCwgd2UgY29uc2lkZXIgdGhlc2UgCisgKiBtYW51ZmFjdHVyaW5nIHJldmlzaW9ucy4gSW4gYW55IGV2ZW50LCB3ZSBjb25zaWRlciB0aGVzZQogICogSURzIHRvIG5vdCBiZSBtb2RlbC1zcGVjaWZpYyBub3IgdW5pcXVlLgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgYWlwdGVrX2lkc1tdID0gewpAQCAtODE0LDE1ICs4MTMsOSBAQAogewogCXN0cnVjdCBhaXB0ZWsgKmFpcHRlayA9IGlucHV0ZGV2LT5wcml2YXRlOwogCi0JaWYgKGFpcHRlay0+b3BlbkNvdW50KysgPiAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQogCWFpcHRlay0+dXJiLT5kZXYgPSBhaXB0ZWstPnVzYmRldjsKLQlpZiAodXNiX3N1Ym1pdF91cmIoYWlwdGVrLT51cmIsIEdGUF9LRVJORUwpICE9IDApIHsKLQkJYWlwdGVrLT5vcGVuQ291bnQtLTsKKwlpZiAodXNiX3N1Ym1pdF91cmIoYWlwdGVrLT51cmIsIEdGUF9LRVJORUwpICE9IDApCiAJCXJldHVybiAtRUlPOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtODM0LDEzICs4MjcsMTEgQEAKIHsKIAlzdHJ1Y3QgYWlwdGVrICphaXB0ZWsgPSBpbnB1dGRldi0+cHJpdmF0ZTsKIAotCWlmICgtLWFpcHRlay0+b3BlbkNvdW50ID09IDApIHsKLQkJdXNiX2tpbGxfdXJiKGFpcHRlay0+dXJiKTsKLQl9CisJdXNiX2tpbGxfdXJiKGFpcHRlay0+dXJiKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBhaXB0ZWtfc2V0X3JlcG9ydCBhbmQgYWlwdGVrX2dldF9yZXBvcnQoKSBhcmUgYm9ycm93ZWQgZnJvbSBMaW51eCAyLjQueCwgCisgKiBhaXB0ZWtfc2V0X3JlcG9ydCBhbmQgYWlwdGVrX2dldF9yZXBvcnQoKSBhcmUgYm9ycm93ZWQgZnJvbSBMaW51eCAyLjQueCwKICAqIHdoZXJlIHRoZXkgd2VyZSBrbm93biBhcyB1c2Jfc2V0X3JlcG9ydCBhbmQgdXNiX2dldF9yZXBvcnQuCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTIyNTIsNyArMjI0Myw2IEBACiAJCQkJQUlQVEVLX1BBQ0tFVF9MRU5HVEgsCiAJCQkJYWlwdGVrLT5kYXRhLCBhaXB0ZWstPmRhdGFfZG1hKTsKIAkJa2ZyZWUoYWlwdGVrKTsKLQkJYWlwdGVrID0gTlVMTDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYwppbmRleCA4NjBkZjI2Li42NTRhYzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jCkBAIC0xLDE1ICsxLDE1IEBACi0vKiAKKy8qCiAgKiAgVVNCIEFUSSBSZW1vdGUgc3VwcG9ydAogICoKICAqICBWZXJzaW9uIDIuMi4wIENvcHlyaWdodCAoYykgMjAwNCBUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PgogICogIFZlcnNpb24gMi4xLjEgQ29weXJpZ2h0IChjKSAyMDAyIFZsYWRpbWlyIERlcmdhY2hldgogICoKICAqICBUaGlzIDIuMi4wIHZlcnNpb24gaXMgYSByZXdyaXRlIC8gY2xlYW51cCBvZiB0aGUgMi4xLjEgZHJpdmVyLCBpbmNsdWRpbmcKLSAqICBwb3J0aW5nIHRvIHRoZSAyLjYga2VybmVsIGludGVyZmFjZXMsIGFsb25nIHdpdGggb3RoZXIgbW9kaWZpY2F0aW9uIAorICogIHBvcnRpbmcgdG8gdGhlIDIuNiBrZXJuZWwgaW50ZXJmYWNlcywgYWxvbmcgd2l0aCBvdGhlciBtb2RpZmljYXRpb24KICAqICB0byBiZXR0ZXIgbWF0Y2ggdGhlIHN0eWxlIG9mIHRoZSBleGlzdGluZyB1c2IvaW5wdXQgZHJpdmVycy4gIEhvd2V2ZXIsIHRoZQogICogIHByb3RvY29sIGFuZCBoYXJkd2FyZSBoYW5kbGluZyBpcyBlc3NlbnRpYWxseSB1bmNoYW5nZWQgZnJvbSAyLjEuMS4KLSAqICAKLSAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5IAorICoKKyAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5CiAgKiAgVm9qdGVjaCBQYXZsaWsuCiAgKgogICogIENoYW5nZXM6CkBAIC0yMyw2NCArMjMsNjQgQEAKICAqICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlICJMb2xhIiByZW1vdGUgY29udHJpYnV0ZWQgYnk6CiAgKiAgICAgICAgICAgICAgICBTZXRoIENvaG4gPHNldGhjb2huQHlhaG9vLmNvbT4KICAqCi0gKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqIAorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogCisgKgorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgogICoKICAqIEhhcmR3YXJlICYgc29mdHdhcmUgbm90ZXMKICAqCi0gKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyIAotICogIkFsbC1Jbi1Xb25kZXIiIHZpZGVvIGNhcmQgcGFja2FnZXMuICBUaGUgcmVjZWl2ZXIgc2VsZi1pZGVudGlmaWVzIGFzIGEgCisgKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyCisgKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYQogICogIlVTQiBSZWNlaXZlciIgd2l0aCBtYW51ZmFjdHVyZXIgIlgxMCBXaXJlbGVzcyBUZWNobm9sb2d5IEluYyIuCiAgKgotICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOiAKKyAqIFRoZSAiTG9sYSIgcmVtb3RlIGlzIGF2YWlsYWJsZSBmcm9tIFgxMC4gIFNlZToKICAqICAgIGh0dHA6Ly93d3cueDEwLmNvbS9wcm9kdWN0cy9sb2xhX3NnMS5odG0KICAqIFRoZSBMb2xhIGlzIHNpbWlsYXIgdG8gdGhlIEFUSSByZW1vdGUgYnV0IGhhcyBubyBtb3VzZSBzdXBwb3J0LCBhbmQgc2xpZ2h0bHkKICAqIGRpZmZlcmVudCBrZXlzLgogICoKLSAqIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZSByZWNlaXZlcnMgYW5kIHJlbW90ZXMgb24gbXVsdGlwbGUgY29tcHV0ZXJzIAorICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMKICAqIHNpbXVsdGFuZW91c2x5IGJ5IGNvbmZpZ3VyaW5nIHRoZW0gdG8gdXNlIHNwZWNpZmljIGNoYW5uZWxzLgotICogCi0gKiBUaGUgUkYgcHJvdG9jb2wgdXNlZCBieSB0aGUgcmVtb3RlIHN1cHBvcnRzIDE2IGRpc3RpbmN0IGNoYW5uZWxzLCAxIHRvIDE2LiAgCi0gKiBBY3R1YWxseSwgaXQgbWF5IGV2ZW4gc3VwcG9ydCBtb3JlLCBhdCBsZWFzdCBpbiBzb21lIHJldmlzaW9ucyBvZiB0aGUgCisgKgorICogVGhlIFJGIHByb3RvY29sIHVzZWQgYnkgdGhlIHJlbW90ZSBzdXBwb3J0cyAxNiBkaXN0aW5jdCBjaGFubmVscywgMSB0byAxNi4KKyAqIEFjdHVhbGx5LCBpdCBtYXkgZXZlbiBzdXBwb3J0IG1vcmUsIGF0IGxlYXN0IGluIHNvbWUgcmV2aXNpb25zIG9mIHRoZQogICogaGFyZHdhcmUuCiAgKgogICogRWFjaCByZW1vdGUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdHJhbnNtaXQgb24gb25lIGNoYW5uZWwgYXMgZm9sbG93czoKLSAqICAgLSBQcmVzcyBhbmQgaG9sZCB0aGUgImhhbmQgaWNvbiIgYnV0dG9uLiAgCi0gKiAgIC0gV2hlbiB0aGUgcmVkIExFRCBzdGFydHMgdG8gYmxpbmssIGxldCBnbyBvZiB0aGUgImhhbmQgaWNvbiIgYnV0dG9uLiAKLSAqICAgLSBXaGVuIGl0IHN0b3BzIGJsaW5raW5nLCBpbnB1dCB0aGUgY2hhbm5lbCBjb2RlIGFzIHR3byBkaWdpdHMsIGZyb20gMDEgCisgKiAgIC0gUHJlc3MgYW5kIGhvbGQgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KKyAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uCisgKiAgIC0gV2hlbiBpdCBzdG9wcyBibGlua2luZywgaW5wdXQgdGhlIGNoYW5uZWwgY29kZSBhcyB0d28gZGlnaXRzLCBmcm9tIDAxCiAgKiAgICAgdG8gMTYsIGFuZCBwcmVzcyB0aGUgaGFuZCBpY29uIGFnYWluLgotICogCisgKgogICogVGhlIHRpbWluZyBjYW4gYmUgYSBsaXR0bGUgdHJpY2t5LiAgVHJ5IGxvYWRpbmcgdGhlIG1vZHVsZSB3aXRoIGRlYnVnPTEKICAqIHRvIGhhdmUgdGhlIGtlcm5lbCBwcmludCBvdXQgbWVzc2FnZXMgYWJvdXQgdGhlIHJlbW90ZSBjb250cm9sIG51bWJlcgogICogYW5kIG1hc2suICBOb3RlOiBkZWJ1Z2dpbmcgcHJpbnRzIHJlbW90ZSBudW1iZXJzIGFzIHplcm8tYmFzZWQgaGV4YWRlY2ltYWwuCiAgKgogICogVGhlIGRyaXZlciBoYXMgYSAiY2hhbm5lbF9tYXNrIiBwYXJhbWV0ZXIuIFRoaXMgYml0bWFzayBzcGVjaWZpZXMgd2hpY2gKLSAqIGNoYW5uZWxzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbW9kdWxlLiAgVG8gbWFzayBvdXQgY2hhbm5lbHMsIGp1c3QgYWRkIAorICogY2hhbm5lbHMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtb2R1bGUuICBUbyBtYXNrIG91dCBjaGFubmVscywganVzdCBhZGQKICAqIGFsbCB0aGUgMl5jaGFubmVsX251bWJlciB2YWx1ZXMgdG9nZXRoZXIuCiAgKgogICogRm9yIGluc3RhbmNlLCBzZXQgY2hhbm5lbF9tYXNrID0gMl40ID0gMTYgKGJpbmFyeSAxMDAwMCkgdG8gbWFrZSBhdGlfcmVtb3RlCi0gKiBpZ25vcmUgc2lnbmFscyBjb21pbmcgZnJvbSByZW1vdGUgY29udHJvbHMgdHJhbnNtaXR0aW5nIG9uIGNoYW5uZWwgNCwgYnV0IAorICogaWdub3JlIHNpZ25hbHMgY29taW5nIGZyb20gcmVtb3RlIGNvbnRyb2xzIHRyYW5zbWl0dGluZyBvbiBjaGFubmVsIDQsIGJ1dAogICogYWNjZXB0IGFsbCBvdGhlciBjaGFubmVscy4KICAqCi0gKiBPciwgc2V0IGNoYW5uZWxfbWFzayA9IDY1NTMzLCAoMHhGRkZEKSwgYW5kIGFsbCBjaGFubmVscyBleGNlcHQgMSB3aWxsIGJlIAorICogT3IsIHNldCBjaGFubmVsX21hc2sgPSA2NTUzMywgKDB4RkZGRCksIGFuZCBhbGwgY2hhbm5lbHMgZXhjZXB0IDEgd2lsbCBiZQogICogaWdub3JlZC4KICAqCi0gKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMgCisgKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMKICAqIHBhcmFtZXRlciBhcmUgdW51c2VkLgogICoKICAqLwpAQCAtOTksMTMgKzk5LDEzIEBACiAvKgogICogTW9kdWxlIGFuZCBWZXJzaW9uIEluZm9ybWF0aW9uLCBNb2R1bGUgUGFyYW1ldGVycwogICovCi0gCi0jZGVmaW5lIEFUSV9SRU1PVEVfVkVORE9SX0lEIAkweDBiYzcKLSNkZWZpbmUgQVRJX1JFTU9URV9QUk9EVUNUX0lEIAkweDAwNAotI2RlZmluZSBMT0xBX1JFTU9URV9QUk9EVUNUX0lEIAkweDAwMgorCisjZGVmaW5lIEFUSV9SRU1PVEVfVkVORE9SX0lECTB4MGJjNworI2RlZmluZSBBVElfUkVNT1RFX1BST0RVQ1RfSUQJMHgwMDQKKyNkZWZpbmUgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwMgogI2RlZmluZSBNRURJT05fUkVNT1RFX1BST0RVQ1RfSUQgMHgwMDYKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAJICAgICAgICAiMi4yLjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSAgICAgICAgIjIuMi4xIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICAgICAgICAgICAiVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgICAgICJBVEkvWDEwIFJGIFVTQiBSZW1vdGUgQ29udHJvbCIKIApAQCAtMTEzLDE4ICsxMTMsMTggQEAKICNkZWZpbmUgREFUQV9CVUZTSVpFICAgICAgNjMgICAgLyogc2l6ZSBvZiBVUkIgZGF0YSBidWZmZXJzICovCiAjZGVmaW5lIEFUSV9JTlBVVE5VTSAgICAgIDEgICAgIC8qIFdoaWNoIGlucHV0IGRldmljZSB0byByZWdpc3RlciBhcyAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGFubmVsX21hc2sgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9tYXNrOwogbW9kdWxlX3BhcmFtKGNoYW5uZWxfbWFzaywgdWxvbmcsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjaGFubmVsX21hc2ssICJCaXRtYXNrIG9mIHJlbW90ZSBjb250cm9sIGNoYW5uZWxzIHRvIGlnbm9yZSIpOwogCi1zdGF0aWMgaW50IGRlYnVnID0gMDsKK3N0YXRpYyBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGV4dHJhIGRlYnVnIG1lc3NhZ2VzIGFuZCBpbmZvcm1hdGlvbiIpOwogCiAjZGVmaW5lIGRiZ2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCiAjdW5kZWYgZXJyCiAjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIGZvcm1hdCAsICMjIGFyZykKLSAKKwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGF0aV9yZW1vdGVfdGFibGVbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIEFUSV9SRU1PVEVfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQpIH0sCkBAIC0xNDgsNyArMTQ4LDcgQEAKIC8qIEFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgZGlyZWN0aW9uYWwgY29udHJvbCBwYWQgKi8KIHN0YXRpYyBjaGFyIGFjY2VsW10gPSB7IDEsIDIsIDQsIDYsIDksIDEzLCAyMCB9OwogCi0vKiBEdXBsaWNhdGUgZXZlbnQgZmlsdGVyaW5nIHRpbWUuIAorLyogRHVwbGljYXRlIGV2ZW50IGZpbHRlcmluZyB0aW1lLgogICogU2VxdWVudGlhbCwgaWRlbnRpY2FsIEtJTkRfRklMVEVSRUQgaW5wdXRzIHdpdGggbGVzcyB0aGFuCiAgKiBGSUxURVJfVElNRSBqaWZmaWVzIGJldHdlZW4gdGhlbSBhcmUgY29uc2lkZXJlZCBhcyByZXBlYXQKICAqIGV2ZW50cy4gVGhlIGhhcmR3YXJlIGdlbmVyYXRlcyA1IGV2ZW50cyBmb3IgdGhlIGZpcnN0IGtleXByZXNzCkBAIC0xNjEsMTAgKzE2MSwxMCBAQAogc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOwogCiBzdHJ1Y3QgYXRpX3JlbW90ZSB7Ci0Jc3RydWN0IGlucHV0X2RldiBpZGV2OwkJCisJc3RydWN0IGlucHV0X2RldiBpZGV2OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0JCQorCiAJc3RydWN0IHVyYiAqaXJxX3VyYjsKIAlzdHJ1Y3QgdXJiICpvdXRfdXJiOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfaW47CkBAIC0xNzQsMTMgKzE3NCwxMSBAQAogCWRtYV9hZGRyX3QgaW5idWZfZG1hOwogCWRtYV9hZGRyX3Qgb3V0YnVmX2RtYTsKIAotCWludCBvcGVuOyAgICAgICAgICAgICAgICAgICAvKiBvcGVuIGNvdW50ZXIgKi8KLQkKIAl1bnNpZ25lZCBjaGFyIG9sZF9kYXRhWzJdOyAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBldmVudHMgKi8KIAl1bnNpZ25lZCBsb25nIG9sZF9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgYWNjX2ppZmZpZXM7ICAvKiBoYW5kbGUgYWNjZWxlcmF0aW9uICovCiAJdW5zaWduZWQgaW50IHJlcGVhdF9jb3VudDsKLQkKKwogCWNoYXIgbmFtZVtOQU1FX0JVRlNJWkVdOwogCWNoYXIgcGh5c1tOQU1FX0JVRlNJWkVdOwogCkBAIC0yMDYsMTQgKzIwNCwxNCBAQAogCWludCB0eXBlOwogCXVuc2lnbmVkIGludCBjb2RlOwogCWludCB2YWx1ZTsKLX0gIGF0aV9yZW1vdGVfdGJsW10gPSAKK30gIGF0aV9yZW1vdGVfdGJsW10gPQogewogCS8qIERpcmVjdGlvbmFsIGNvbnRyb2wgcGFkIGF4ZXMgKi8KIAl7S0lORF9BQ0NFTCwgICAweDM1LCAweDcwLCBFVl9SRUwsIFJFTF9YLCAtMX0sCSAvKiBsZWZ0ICovCiAJe0tJTkRfQUNDRUwsICAgMHgzNiwgMHg3MSwgRVZfUkVMLCBSRUxfWCwgMX0sICAgIC8qIHJpZ2h0ICovCiAJe0tJTkRfQUNDRUwsICAgMHgzNywgMHg3MiwgRVZfUkVMLCBSRUxfWSwgLTF9LAkgLyogdXAgKi8KIAl7S0lORF9BQ0NFTCwgICAweDM4LCAweDczLCBFVl9SRUwsIFJFTF9ZLCAxfSwgICAgLyogZG93biAqLwotCS8qIERpcmVjdGlvbmFsIGNvbnRyb2wgcGFkIGRpYWdvbmFscyAqLwkKKwkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBkaWFnb25hbHMgKi8KIAl7S0lORF9MVSwgICAgICAweDM5LCAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLwogCXtLSU5EX1JVLCAgICAgIDB4M2EsIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLwogCXtLSU5EX0xELCAgICAgIDB4M2MsIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KQEAgLTIyNSw3ICsyMjMsNyBAQAogCXtLSU5EX0xJVEVSQUwsIDB4NDEsIDB4N2MsIEVWX0tFWSwgQlROX1JJR0hULCAxfSwvKiByaWdodCBidG4gZG93biAqLwogCXtLSU5EX0xJVEVSQUwsIDB4NDIsIDB4N2QsIEVWX0tFWSwgQlROX1JJR0hULCAwfSwvKiByaWdodCBidG4gdXAgKi8KIAotCS8qIEFydGlmaWNpYWwgImRvdWJsZWNsaWNrIiBldmVudHMgYXJlIGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUuIAorCS8qIEFydGlmaWNpYWwgImRvdWJsZWNsaWNrIiBldmVudHMgYXJlIGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUuCiAJICogVGhleSBhcmUgbWFwcGVkIHRvIHRoZSAic2lkZSIgYW5kICJleHRyYSIgbW91c2UgYnV0dG9ucyBoZXJlLiAqLwogCXtLSU5EX0ZJTFRFUkVELCAweDNmLCAweDdhLCBFVl9LRVksIEJUTl9TSURFLCAxfSwgLyogbGVmdCBkYmxjbGljayAqLwogCXtLSU5EX0ZJTFRFUkVELCAweDQzLCAweDdlLCBFVl9LRVksIEJUTl9FWFRSQSwgMX0sLyogcmlnaHQgZGJsY2xpY2sgKi8KQEAgLTI3MywxNSArMjcxLDE1IEBACiAJe0tJTkRfRklMVEVSRUQsIDB4ZWEsIDB4MjUsIEVWX0tFWSwgS0VZX1BMQVksIDF9LCAgICAgICAvKiAoID4pICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZTksIDB4MjQsIEVWX0tFWSwgS0VZX1JFV0lORCwgMX0sICAgICAvKiAoPDwpICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZWIsIDB4MjYsIEVWX0tFWSwgS0VZX0ZPUldBUkQsIDF9LCAgICAvKiAoPj4pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWQsIDB4MjgsIEVWX0tFWSwgS0VZX1NUT1AsIDF9LCAgICAgICAvKiAoW10pICovIAorCXtLSU5EX0ZJTFRFUkVELCAweGVkLCAweDI4LCBFVl9LRVksIEtFWV9TVE9QLCAxfSwgICAgICAgLyogKFtdKSAqLwogCXtLSU5EX0ZJTFRFUkVELCAweGVlLCAweDI5LCBFVl9LRVksIEtFWV9QQVVTRSwgMX0sICAgICAgLyogKCcnKSAqLwogCXtLSU5EX0ZJTFRFUkVELCAweGYwLCAweDJiLCBFVl9LRVksIEtFWV9QUkVWSU9VUywgMX0sICAgLyogKDwtKSAqLwogCXtLSU5EX0ZJTFRFUkVELCAweGVmLCAweDJhLCBFVl9LRVksIEtFWV9ORVhULCAxfSwgICAgICAgLyogKD4rKSAqLwogCXtLSU5EX0ZJTFRFUkVELCAweGYyLCAweDJELCBFVl9LRVksIEtFWV9JTkZPLCAxfSwgICAgICAgLyogUExBWUlORyAqLwogCXtLSU5EX0ZJTFRFUkVELCAweGYzLCAweDJFLCBFVl9LRVksIEtFWV9IT01FLCAxfSwgICAgICAgLyogVE9QICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZjQsIDB4MkYsIEVWX0tFWSwgS0VZX0VORCwgMX0sICAgICAgICAvKiBFTkQgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhmNSwgMHgzMCwgRVZfS0VZLCBLRVlfU0VMRUNULCAxfSwgICAgIC8qIFNFTEVDVCAqLwkKLQkKKwl7S0lORF9GSUxURVJFRCwgMHhmNSwgMHgzMCwgRVZfS0VZLCBLRVlfU0VMRUNULCAxfSwgICAgIC8qIFNFTEVDVCAqLworCiAJe0tJTkRfRU5ELCAweDAwLCAweDAwLCBFVl9NQVggKyAxLCAwLCAwfQogfTsKIApAQCAtMzE1LDcgKzMxMyw3IEBACiAJaWYgKChsZW4gPT0gMSkgJiYgKGRhdGFbMF0gIT0gKHVuc2lnbmVkIGNoYXIpMHhmZikgJiYgKGRhdGFbMF0gIT0gMHgwMCkpCiAJCXdhcm4oIldlaXJkIGJ5dGUgMHglMDJ4IiwgZGF0YVswXSk7CiAJZWxzZSBpZiAobGVuID09IDQpCi0JCXdhcm4oIldlaXJkIGtleSAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwgCisJCXdhcm4oIldlaXJkIGtleSAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKIAkJICAgICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKIAllbHNlCiAJCXdhcm4oIldlaXJkIGRhdGEsIGxlbj0lZCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLi4iLApAQCAtMzI4LDI1ICszMjYsMTYgQEAKIHN0YXRpYyBpbnQgYXRpX3JlbW90ZV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQogewogCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gaW5wdXRkZXYtPnByaXZhdGU7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlkb3duKCZkaXNjb25uZWN0X3NlbSk7Ci0KLQlpZiAoYXRpX3JlbW90ZS0+b3BlbisrKQotCQlnb3RvIGV4aXQ7CiAKIAkvKiBPbiBmaXJzdCBvcGVuLCBzdWJtaXQgdGhlIHJlYWQgdXJiIHdoaWNoIHdhcyBzZXQgdXAgcHJldmlvdXNseS4gKi8KIAlhdGlfcmVtb3RlLT5pcnFfdXJiLT5kZXYgPSBhdGlfcmVtb3RlLT51ZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiLCBHRlBfS0VSTkVMKSkgewotCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgCisJCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAogCQkJIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlhdGlfcmVtb3RlLT5vcGVuLS07Ci0JCXJldHZhbCA9IC1FSU87CisJCXJldHVybiAtRUlPOwogCX0KIAotZXhpdDoKLQl1cCgmZGlzY29ubmVjdF9zZW0pOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0zNTUsOSArMzQ0LDggQEAKIHN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXYpCiB7CiAJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSBpbnB1dGRldi0+cHJpdmF0ZTsKLQkKLQlpZiAoIS0tYXRpX3JlbW90ZS0+b3BlbikKLQkJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOworCisJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwogfQogCiAvKgpAQCAtMzY2LDEzICszNTQsMTMgQEAKIHN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaXJxX291dChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gdXJiLT5jb250ZXh0OwotCQorCiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwKIAkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQotCQorCiAJYXRpX3JlbW90ZS0+c2VuZF9mbGFncyB8PSBTRU5EX0ZMQUdfQ09NUExFVEU7CiAJd21iKCk7CiAJd2FrZV91cCgmYXRpX3JlbW90ZS0+d2FpdCk7CkBAIC0zODAsMTYgKzM2OCwxNiBAQAogCiAvKgogICoJYXRpX3JlbW90ZV9zZW5kcGFja2V0Ci0gKgkJCisgKgogICoJVXNlZCB0byBzZW5kIGRldmljZSBpbml0aWFsaXphdGlvbiBzdHJpbmdzCiAgKi8KIHN0YXRpYyBpbnQgYXRpX3JlbW90ZV9zZW5kcGFja2V0KHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlLCB1MTYgY21kLCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCWludCByZXR2YWwgPSAwOwotCQorCiAJLyogU2V0IHVwIG91dF91cmIgKi8KIAltZW1jcHkoYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyICsgMSwgZGF0YSwgTE8oY21kKSk7Ci0JKChjaGFyICopIGF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcilbMF0gPSBISShjbWQpOwkKKwkoKGNoYXIgKikgYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKVswXSA9IEhJKGNtZCk7CiAKIAlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gTE8oY21kKSArIDE7CiAJYXRpX3JlbW90ZS0+b3V0X3VyYi0+ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKQEAgLTM5NywxNyArMzg1LDE3IEBACiAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAKKwkJZGV2X2RiZygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCiAJCQkgInNlbmRwYWNrZXQ6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJd2FpdF9ldmVudF90aW1lb3V0KGF0aV9yZW1vdGUtPndhaXQsCiAJCSgoYXRpX3JlbW90ZS0+b3V0X3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgfHwKLQkJIAkoYXRpX3JlbW90ZS0+c2VuZF9mbGFncyAmIFNFTkRfRkxBR19DT01QTEVURSkpLAorCQkJKGF0aV9yZW1vdGUtPnNlbmRfZmxhZ3MgJiBTRU5EX0ZMQUdfQ09NUExFVEUpKSwKIAkJSFopOwogCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLQkKKwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQxOSwxNSArNDA3LDE1IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspIHsKLQkJLyogCi0JCSAqIERlY2lkZSBpZiB0aGUgdGFibGUgZW50cnkgbWF0Y2hlcyB0aGUgcmVtb3RlIGlucHV0LiAKKwkJLyoKKwkJICogRGVjaWRlIGlmIHRoZSB0YWJsZSBlbnRyeSBtYXRjaGVzIHRoZSByZW1vdGUgaW5wdXQuCiAJCSAqLwogCQlpZiAoKCgoYXRpX3JlbW90ZV90YmxbaV0uZGF0YTEgJiAweDBmKSA9PSAoZDEgJiAweDBmKSkpICYmCi0JCSAgICAoKCgoYXRpX3JlbW90ZV90YmxbaV0uZGF0YTEgPj4gNCkgLSAKLQkJICAgICAgIChkMSA+PiA0KSArIHJlbSkgJiAweDBmKSA9PSAweDBmKSAmJiAKKwkJICAgICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSA+PiA0KSAtCisJCSAgICAgICAoZDEgPj4gNCkgKyByZW0pICYgMHgwZikgPT0gMHgwZikgJiYKIAkJICAgIChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMiA9PSBkMikpCiAJCQlyZXR1cm4gaTsKLQkJCisKIAl9CiAJcmV0dXJuIC0xOwogfQpAQCAtNDM1LDE2ICs0MjMsMTYgQEAKIC8qCiAgKglhdGlfcmVtb3RlX3JlcG9ydF9pbnB1dAogICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X3JlcG9ydChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQkKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfcmVwb3J0KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YT0gYXRpX3JlbW90ZS0+aW5idWY7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gJmF0aV9yZW1vdGUtPmlkZXY7IAorCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZhdGlfcmVtb3RlLT5pZGV2OwogCWludCBpbmRleCwgYWNjOwogCWludCByZW1vdGVfbnVtOwotCQorCiAJLyogRGVhbCB3aXRoIHN0cmFuZ2UgbG9va2luZyBpbnB1dHMgKi8KLQlpZiAoICh1cmItPmFjdHVhbF9sZW5ndGggIT0gNCkgfHwgKGRhdGFbMF0gIT0gMHgxNCkgfHwgCisJaWYgKCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDQpIHx8IChkYXRhWzBdICE9IDB4MTQpIHx8CiAJCSgoZGF0YVszXSAmIDB4MGYpICE9IDB4MDApICkgewogCQlhdGlfcmVtb3RlX2R1bXAoZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJcmV0dXJuOwpAQCAtNDUzLDcgKzQ0MSw3IEBACiAJLyogTWFzayB1bndhbnRlZCByZW1vdGUgY2hhbm5lbHMuICAqLwogCS8qIG5vdGU6IHJlbW90ZV9udW0gaXMgMC1iYXNlZCwgY2hhbm5lbCAxIG9uIHJlbW90ZSA9PSAwIGhlcmUgKi8KIAlyZW1vdGVfbnVtID0gKGRhdGFbM10gPj4gNCkgJiAweDBmOwotICAgICAgICBpZiAoY2hhbm5lbF9tYXNrICYgKDEgPDwgKHJlbW90ZV9udW0gKyAxKSkpIHsgCisgICAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCAocmVtb3RlX251bSArIDEpKSkgewogCQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKIAkJCSJNYXNrZWQgaW5wdXQgZnJvbSBjaGFubmVsIDB4JTAyeDogZGF0YSAlMDJ4LCUwMngsIG1hc2s9IDB4JTAybHhcbiIsCiAJCQlyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdLCBjaGFubmVsX21hc2spOwpAQCAtNDYzLDM3ICs0NTEsMzYgQEAKIAkvKiBMb29rIHVwIGV2ZW50IGNvZGUgaW5kZXggaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KIAlpbmRleCA9IGF0aV9yZW1vdGVfZXZlbnRfbG9va3VwKHJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0pOwogCWlmIChpbmRleCA8IDApIHsKLQkJZGV2X3dhcm4oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAKLQkJCSAiVW5rbm93biBpbnB1dCBmcm9tIGNoYW5uZWwgMHglMDJ4OiBkYXRhICUwMngsJTAyeFxuIiwgCisJCWRldl93YXJuKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKKwkJCSAiVW5rbm93biBpbnB1dCBmcm9tIGNoYW5uZWwgMHglMDJ4OiBkYXRhICUwMngsJTAyeFxuIiwKIAkJCSByZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdKTsKIAkJcmV0dXJuOwotCX0gCi0JZGJnaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsIAorCX0KKwlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKIAkJImNoYW5uZWwgMHglMDJ4OyBkYXRhICUwMngsJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCiAJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIGluZGV4LCBhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSk7Ci0JCisKIAlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9MSVRFUkFMKSB7CiAJCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKIAkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKIAkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlLAogCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLnZhbHVlKTsKIAkJaW5wdXRfc3luYyhkZXYpOwotCQkKKwogCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IGppZmZpZXM7CiAJCXJldHVybjsKIAl9Ci0JCisKIAlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9GSUxURVJFRCkgewogCQkvKiBGaWx0ZXIgZHVwbGljYXRlIGV2ZW50cyB3aGljaCBoYXBwZW4gInRvbyBjbG9zZSIgdG9nZXRoZXIuICovCi0JCWlmICgoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPT0gZGF0YVsxXSkgJiYgCi0JIAkJKGF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID09IGRhdGFbMl0pICYmIAotCSAJCSgoYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgKyBGSUxURVJfVElNRSkgPiBqaWZmaWVzKSkgeworCQlpZiAoKGF0aV9yZW1vdGUtPm9sZF9kYXRhWzBdID09IGRhdGFbMV0pICYmCisJCQkoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPT0gZGF0YVsyXSkgJiYKKwkJCSgoYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgKyBGSUxURVJfVElNRSkgPiBqaWZmaWVzKSkgewogCQkJYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50Kys7Ci0JCX0gCi0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50ID0gMDsKIAkJfQotCQkKKwogCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07CiAJCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKIAkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOwpAQCAtNTAxLDcgKzQ4OCw3IEBACiAJCWlmICgoYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50ID4gMCkKIAkJICAgICYmIChhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPCA1KSkKIAkJCXJldHVybjsKLQkJCisKIAogCQlpbnB1dF9yZWdzKGRldiwgcmVncyk7CiAJCWlucHV0X2V2ZW50KGRldiwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLnR5cGUsCkBAIC01MTEsMTMgKzQ5OCwxMyBAQAogCQlpbnB1dF9zeW5jKGRldik7CiAKIAkJcmV0dXJuOwotCX0JCQkKLQkKLQkvKiAKKwl9CisKKwkvKgogCSAqIE90aGVyIGV2ZW50IGtpbmRzIGFyZSBmcm9tIHRoZSBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCwgYW5kIGhhdmUgYW4KIAkgKiBhY2NlbGVyYXRpb24gZmFjdG9yIGFwcGxpZWQgdG8gdGhlbS4gIFdpdGhvdXQgdGhpcyBhY2NlbGVyYXRpb24sIHRoZQogCSAqIGNvbnRyb2wgcGFkIGlzIG1vc3RseSB1bnVzYWJsZS4KLQkgKiAKKwkgKgogCSAqIElmIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IGV2ZW50IGlzID4gMS80IHNlY29uZCwgdXNlciAic3RvcHBlZCIsCiAJICogc28gcmVzZXQgYWNjZWxlcmF0aW9uLiBPdGhlcndpc2UsIHVzZXIgaXMgcHJvYmFibHkgaG9sZGluZyB0aGUgY29udHJvbAogCSAqIHBhZCBkb3duLCBzbyB3ZSBpbmNyZWFzZSBhY2NlbGVyYXRpb24sIHJhbXBpbmcgdXAgb3ZlciB0d28gc2Vjb25kcyB0bwpAQCAtNTU5LDcgKzU0Niw3IEBACiAJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgYWNjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICJhdGlfcmVtb3RlIGtpbmQ9JWRcbiIsIAorCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgImF0aV9yZW1vdGUga2luZD0lZFxuIiwKIAkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kKTsKIAl9CiAJaW5wdXRfc3luYyhkZXYpOwpAQCAtNTg2LDEyICs1NzMsMTIgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHVyYiBlcnJvciBzdGF0dXMsIHVubGluaz8gXG4iLAogCQkJX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwkKKwkJcmV0dXJuOwogCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsIAorCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKIAl9Ci0JCisKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1c2Jfc3VibWl0X3VyYigpPSVkXG4iLApAQCAtNjAzLDggKzU5MCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfZGVsZXRlKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQogewotCWlmICghYXRpX3JlbW90ZSkgcmV0dXJuOwotCiAJaWYgKGF0aV9yZW1vdGUtPmlycV91cmIpCiAJCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKIApAQCAtNjE0LDE2ICs1OTksMTYgQEAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmYXRpX3JlbW90ZS0+aWRldik7CiAKIAlpZiAoYXRpX3JlbW90ZS0+aW5idWYpCi0JCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsIAorCQl1c2JfYnVmZmVyX2ZyZWUoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAogCQkJCWF0aV9yZW1vdGUtPmluYnVmLCBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWEpOwotCQkKKwogCWlmIChhdGlfcmVtb3RlLT5vdXRidWYpCi0JCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsIAorCQl1c2JfYnVmZmVyX2ZyZWUoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAogCQkJCWF0aV9yZW1vdGUtPm91dGJ1ZiwgYXRpX3JlbW90ZS0+b3V0YnVmX2RtYSk7Ci0JCisKIAlpZiAoYXRpX3JlbW90ZS0+aXJxX3VyYikKIAkJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCQorCiAJaWYgKGF0aV9yZW1vdGUtPm91dF91cmIpCiAJCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKIApAQCAtNjM2LDUxICs2MjEsNTIgQEAKIAlpbnQgaTsKIAogCWlkZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKLQlpZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9ICggQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgCisJaWRldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSAoIEJJVChCVE5fTEVGVCkgfCBCSVQoQlROX1JJR0hUKSB8CiAJCQkJCSAgQklUKEJUTl9TSURFKSB8IEJJVChCVE5fRVhUUkEpICk7CiAJaWRldi0+cmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSk7CiAJZm9yIChpID0gMDsgYXRpX3JlbW90ZV90YmxbaV0ua2luZCAhPSBLSU5EX0VORDsgaSsrKQogCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0udHlwZSA9PSBFVl9LRVkpCiAJCQlzZXRfYml0KGF0aV9yZW1vdGVfdGJsW2ldLmNvZGUsIGlkZXYtPmtleWJpdCk7Ci0JCisKIAlpZGV2LT5wcml2YXRlID0gYXRpX3JlbW90ZTsKIAlpZGV2LT5vcGVuID0gYXRpX3JlbW90ZV9vcGVuOwogCWlkZXYtPmNsb3NlID0gYXRpX3JlbW90ZV9jbG9zZTsKLQkKKwogCWlkZXYtPm5hbWUgPSBhdGlfcmVtb3RlLT5uYW1lOwogCWlkZXYtPnBoeXMgPSBhdGlfcmVtb3RlLT5waHlzOwotCQotCWlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwkJCisKKwlpZGV2LT5pZC5idXN0eXBlID0gQlVTX1VTQjsKIAlpZGV2LT5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKIAlpZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCWlkZXYtPmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJaWRldi0+ZGV2ID0gJihhdGlfcmVtb3RlLT51ZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGF0aV9yZW1vdGVfaW5pdGlhbGl6ZShzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGF0aV9yZW1vdGUtPnVkZXY7CiAJaW50IHBpcGUsIG1heHA7Ci0JCQorCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYXRpX3JlbW90ZS0+d2FpdCk7CiAKIAkvKiBTZXQgdXAgaXJxX3VyYiAqLwogCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkVuZHBvaW50QWRkcmVzcyk7CiAJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOwogCW1heHAgPSAobWF4cCA+IERBVEFfQlVGU0laRSkgPyBEQVRBX0JVRlNJWkUgOiBtYXhwOwotCQotCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+aW5idWYsIAotCQkJIG1heHAsIGF0aV9yZW1vdGVfaXJxX2luLCBhdGlfcmVtb3RlLCAKKworCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+aW5idWYsCisJCQkgbWF4cCwgYXRpX3JlbW90ZV9pcnFfaW4sIGF0aV9yZW1vdGUsCiAJCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfaW4tPmJJbnRlcnZhbCk7CiAJYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+aW5idWZfZG1hOwogCWF0aV9yZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCQorCiAJLyogU2V0IHVwIG91dF91cmIgKi8KIAlwaXBlID0gdXNiX3NuZGludHBpcGUodWRldiwgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CiAJbWF4cCA9IChtYXhwID4gREFUQV9CVUZTSVpFKSA/IERBVEFfQlVGU0laRSA6IG1heHA7CiAKLQl1c2JfZmlsbF9pbnRfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIsIHVkZXYsIHBpcGUsIGF0aV9yZW1vdGUtPm91dGJ1ZiwgCi0JCQkgbWF4cCwgYXRpX3JlbW90ZV9pcnFfb3V0LCBhdGlfcmVtb3RlLCAKKwl1c2JfZmlsbF9pbnRfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIsIHVkZXYsIHBpcGUsIGF0aV9yZW1vdGUtPm91dGJ1ZiwKKwkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9vdXQsIGF0aV9yZW1vdGUsCiAJCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iSW50ZXJ2YWwpOwogCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2RtYSA9IGF0aV9yZW1vdGUtPm91dGJ1Zl9kbWE7CiAJYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CkBAIC02ODgsMTEgKzY3NCwxMSBAQAogCS8qIHNlbmQgaW5pdGlhbGl6YXRpb24gc3RyaW5ncyAqLwogCWlmICgoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNCwgaW5pdDEpKSB8fAogCSAgICAoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNywgaW5pdDIpKSkgewotCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgCisJCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAogCQkJICJJbml0aWFsaXppbmcgYXRpX3JlbW90ZSBoYXJkd2FyZSBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQotCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc2OSw3ICs3NTUsNyBAQAogCiAJaWYgKCFzdHJsZW4oYXRpX3JlbW90ZS0+bmFtZSkpCiAJCXNwcmludGYoYXRpX3JlbW90ZS0+bmFtZSwgRFJJVkVSX0RFU0MgIiglMDR4LCUwNHgpIiwKLQkJCWxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLCAKKwkJCWxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkJbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKIAogCS8qIERldmljZSBIYXJkd2FyZSBJbml0aWFsaXphdGlvbiAtIGZpbGxzIGluIGF0aV9yZW1vdGUtPmlkZXYgZnJvbSB1ZGV2LiAqLwpAQCAtNzgxLDExICs3NjcsMTEgQEAKIAlhdGlfcmVtb3RlX2lucHV0X2luaXQoYXRpX3JlbW90ZSk7CiAJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZhdGlfcmVtb3RlLT5pZGV2KTsKIAotCWRldl9pbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIklucHV0IHJlZ2lzdGVyZWQ6ICVzIG9uICVzXG4iLCAKKwlkZXZfaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICJJbnB1dCByZWdpc3RlcmVkOiAlcyBvbiAlc1xuIiwKIAkJIGF0aV9yZW1vdGUtPm5hbWUsIHBhdGgpOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGF0aV9yZW1vdGUpOwotCQorCiBlcnJvcjoKIAlpZiAocmV0dmFsKQogCQlhdGlfcmVtb3RlX2RlbGV0ZShhdGlfcmVtb3RlKTsKQEAgLTgwMCwxOCArNzg2LDE0IEBACiB7CiAJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGU7CiAKLQlkb3duKCZkaXNjb25uZWN0X3NlbSk7Ci0KIAlhdGlfcmVtb3RlID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAlpZiAoIWF0aV9yZW1vdGUpIHsKIAkJd2FybigiJXMgLSBudWxsIGRldmljZT9cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybjsKIAl9Ci0JCi0JYXRpX3JlbW90ZV9kZWxldGUoYXRpX3JlbW90ZSk7CiAKLQl1cCgmZGlzY29ubmVjdF9zZW0pOworCWF0aV9yZW1vdGVfZGVsZXRlKGF0aV9yZW1vdGUpOwogfQogCiAvKgpAQCAtODIwLDcgKzgwMiw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBhdGlfcmVtb3RlX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwotCQorCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZhdGlfcmVtb3RlX2RyaXZlcik7CiAJaWYgKHJlc3VsdCkKIAkJZXJyKCJ1c2JfcmVnaXN0ZXIgZXJyb3IgIyVkXG4iLCByZXN1bHQpOwpAQCAtODM4LDggKzgyMCw4IEBACiAJdXNiX2RlcmVnaXN0ZXIoJmF0aV9yZW1vdGVfZHJpdmVyKTsKIH0KIAotLyogCi0gKgltb2R1bGUgc3BlY2lmaWNhdGlvbiAKKy8qCisgKgltb2R1bGUgc3BlY2lmaWNhdGlvbgogICovCiAKIG1vZHVsZV9pbml0KGF0aV9yZW1vdGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCA3NDBkZWMxLi4yMzUwZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogCXJlcG9ydC0+c2l6ZSArPSBwYXJzZXItPmdsb2JhbC5yZXBvcnRfc2l6ZSAqIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudDsKIAogCWlmICghcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCkgLyogSWdub3JlIHBhZGRpbmcgZmllbGRzICovCi0JCXJldHVybiAwOyAKKwkJcmV0dXJuIDA7CiAKIAl1c2FnZXMgPSBtYXhfdChpbnQsIHBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7CiAKQEAgLTc2NSw3ICs3NjUsNyBAQAogc3RhdGljIF9faW5saW5lX18gX191MzIgZXh0cmFjdChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbikKIHsKIAlyZXBvcnQgKz0gKG9mZnNldCA+PiA1KSA8PCAyOyBvZmZzZXQgJj0gMzE7Ci0JcmV0dXJuIChsZTY0X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlNjQqKXJlcG9ydCkpID4+IG9mZnNldCkgJiAoKDEgPDwgbikgLSAxKTsKKwlyZXR1cm4gKGxlNjRfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGU2NCopcmVwb3J0KSkgPj4gb2Zmc2V0KSAmICgoMVVMTCA8PCBuKSAtIDEpOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGltcGxlbWVudChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbiwgX191MzIgdmFsdWUpCkBAIC0xMjMzLDYgKzEyMzMsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBoaWRfc2V0X2lkbGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtLCBpbnQgcmVwb3J0LCBpbnQgaWRsZSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCUhJRF9SRVFfU0VUX0lETEUsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgKGlkbGUgPDwgOCkgfCByZXBvcnQsCisJCWlmbnVtLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Cit9CisKIHN0YXRpYyBpbnQgaGlkX2dldF9jbGFzc19kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZm51bSwKIAkJdW5zaWduZWQgY2hhciB0eXBlLCB2b2lkICpidWYsIGludCBzaXplKQogewpAQCAtMTMwMSwxMCArMTMwOCw2IEBACiAKIAlpZiAoZXJyKQogCQl3YXJuKCJ0aW1lb3V0IGluaXRpYWxpemluZyByZXBvcnRzXG4iKTsKLQotCXVzYl9jb250cm9sX21zZyhoaWQtPmRldiwgdXNiX3NuZGN0cmxwaXBlKGhpZC0+ZGV2LCAwKSwKLQkJSElEX1JFUV9TRVRfSURMRSwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLCAwLAotCQloaWQtPmlmbnVtLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiB9CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkJMHgwNTZhCkBAIC0xMzE4LDYgKzEzMjEsMTAgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9XQUNPTV9JTlRVT1MzCTB4MDBCMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1dBQ09NX0NJTlRJUQkweDAwM0YKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0FDRUNBRAkJMHgwNDYwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUNFQ0FEX0ZMQUlSCTB4MDAwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF8zMDIJMHgwMDA4CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9LQkdFQVIJCTB4MDg0ZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0tCR0VBUl9KQU1TVFVESU8JMHgxMDAxCiAKQEAgLTE0MjEsNiArMTQyOCwxOSBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUAkweDAwMDMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMJMHgwMDA0CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MRAkJMHgwZjExCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FTU1kgICAgICAgIAkweDEwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QT0NLRVRDQVNTWQkweDEwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NT0JJTEVDQVNTWQkweDEwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9KV00JCTB4MTA4MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0RNTVAJCTB4MTA4MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VNSVAJCTB4MTA5MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZJREVPQ09NCQkweDEyMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DT00zTEFCCQkweDIwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9URUxFUE9SVAkJMHgyMDEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkVUV09SS0FOQUxZU0VSCTB4MjAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSQ09OVFJPTAkweDIwMzAKKwogCiAvKgogICogQWxwaGFiZXRpY2FsbHkgc29ydGVkIGJsYWNrbGlzdCBieSBxdWlyayB0eXBlLgpAQCAtMTQ1Niw2ICsxNDc2LDE3IEBACiAJeyBVU0JfVkVORE9SX0lEX0dSSUZGSU4sIFVTQl9ERVZJQ0VfSURfUE9XRVJNQVRFLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0dSSUZGSU4sIFVTQl9ERVZJQ0VfSURfU09VTkRLTk9CLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0tCR0VBUiwgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0NBU1NZLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0pXTSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ETU1QLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1VNSVAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVklERU9DT00sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfQ09NM0xBQiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9URUxFUE9SVCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX01DQywgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTAyNExTLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX01DQywgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTIwOExTLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX01HRSwgVVNCX0RFVklDRV9JRF9NR0VfVVBTLCBISURfUVVJUktfSUdOT1JFIH0sCkBAIC0xNTAyLDYgKzE1MzMsOSBAQAogCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCiAKKwl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX0NTMTI0VSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl8yUE9SVEtWTSwgSElEX1FVSVJLX05PR0VUIH0sCkBAIC0xNTkwLDYgKzE2MjQsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwloaWRfc2V0X2lkbGUoZGV2LCBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwgMCwgMCk7CisKIAlpZiAoKG4gPSBoaWRfZ2V0X2NsYXNzX2Rlc2NyaXB0b3IoZGV2LCBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwgSElEX0RUX1JFUE9SVCwgcmRlc2MsIHJzaXplKSkgPCAwKSB7CiAJCWRiZygicmVhZGluZyByZXBvcnQgZGVzY3JpcHRvciBmYWlsZWQiKTsKIAkJa2ZyZWUocmRlc2MpOwpAQCAtMTYzNSw3ICsxNjcxLDcgQEAKIAkJLyogQ2hhbmdlIHRoZSBwb2xsaW5nIGludGVydmFsIG9mIG1pY2UuICovCiAJCWlmIChoaWQtPmNvbGxlY3Rpb24tPnVzYWdlID09IEhJRF9HRF9NT1VTRSAmJiBoaWRfbW91c2Vwb2xsX2ludGVydmFsID4gMCkKIAkJCWludGVydmFsID0gaGlkX21vdXNlcG9sbF9pbnRlcnZhbDsKLQkJCisKIAkJaWYgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgewogCQkJaWYgKGhpZC0+dXJiaW4pCiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZGVidWcuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCmluZGV4IDJiOTE3MDUuLjUyNDM3ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICB7MCwgMHg0NCwgIlZicnkifSwKICAgICAgIHswLCAweDQ1LCAiVmJyeiJ9LAogICAgICAgezAsIDB4NDYsICJWbm8ifSwKLSAgICB7MCwgMHg4MCwgIlN5c3RlbUNvbnRyb2wifSwgCisgICAgezAsIDB4ODAsICJTeXN0ZW1Db250cm9sIn0sCiAgICAgICB7MCwgMHg4MSwgIlN5c3RlbVBvd2VyRG93biJ9LAogICAgICAgezAsIDB4ODIsICJTeXN0ZW1TbGVlcCJ9LAogICAgICAgezAsIDB4ODMsICJTeXN0ZW1XYWtlVXAifSwKQEAgLTM0Nyw3ICszNDcsNyBAQAogCiBzdGF0aWMgdm9pZCBoaWRfZHVtcF9maWVsZChzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgaW50IG4pIHsKIAlpbnQgajsKLQkKKwogCWlmIChmaWVsZC0+cGh5c2ljYWwpIHsKIAkJdGFiKG4pOwogCQlwcmludGsoIlBoeXNpY2FsKCIpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJCQkJCXByaW50aygiJXMiLCB1bml0c1tzeXNdW2ldKTsKIAkJCQkJaWYobmliYmxlICE9IDEpIHsKIAkJCQkJCS8qIFRoaXMgaXMgYSBfc2lnbmVkXyBuaWJibGUoISkgKi8KLQkKKwogCQkJCQkJaW50IHZhbCA9IG5pYmJsZSAmIDB4NzsKIAkJCQkJCWlmKG5pYmJsZSAmIDB4MDgpCiAJCQkJCQkJdmFsID0gLSgoMHg3ICYgfnZhbCkgKzEpOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAl1bnNpZ25lZCBpLGs7CiAJc3RhdGljIGNoYXIgKnRhYmxlW10gPSB7IklOUFVUIiwgIk9VVFBVVCIsICJGRUFUVVJFIn07Ci0JCisKIAlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKSB7CiAJCXJlcG9ydF9lbnVtID0gZGV2aWNlLT5yZXBvcnRfZW51bSArIGk7CiAJCWxpc3QgPSByZXBvcnRfZW51bS0+cmVwb3J0X2xpc3QubmV4dDsKQEAgLTY2NCw4ICs2NjQsOCBAQAogc3RhdGljIGNoYXIgKnJlbGF0aXZlc1tSRUxfTUFYICsgMV0gPSB7CiAJW1JFTF9YXSA9ICJYIiwJCQlbUkVMX1ldID0gIlkiLAogCVtSRUxfWl0gPSAiWiIsCQkJW1JFTF9IV0hFRUxdID0gIkhXaGVlbCIsCi0JW1JFTF9ESUFMXSA9ICJEaWFsIiwJCVtSRUxfV0hFRUxdID0gIldoZWVsIiwgCi0JW1JFTF9NSVNDXSA9ICJNaXNjIiwJCisJW1JFTF9ESUFMXSA9ICJEaWFsIiwJCVtSRUxfV0hFRUxdID0gIldoZWVsIiwKKwlbUkVMX01JU0NdID0gIk1pc2MiLAogfTsKIAogc3RhdGljIGNoYXIgKmFic29sdXRlc1tBQlNfTUFYICsgMV0gPSB7CkBAIC02OTAsOSArNjkwLDkgQEAKIH07CiAKIHN0YXRpYyBjaGFyICpsZWRzW0xFRF9NQVggKyAxXSA9IHsKLQlbTEVEX05VTUxdID0gIk51bUxvY2siLAkJW0xFRF9DQVBTTF0gPSAiQ2Fwc0xvY2siLCAKKwlbTEVEX05VTUxdID0gIk51bUxvY2siLAkJW0xFRF9DQVBTTF0gPSAiQ2Fwc0xvY2siLAogCVtMRURfU0NST0xMTF0gPSAiU2Nyb2xsTG9jayIsCVtMRURfQ09NUE9TRV0gPSAiQ29tcG9zZSIsCi0JW0xFRF9LQU5BXSA9ICJLYW5hIiwJCVtMRURfU0xFRVBdID0gIlNsZWVwIiwgCisJW0xFRF9LQU5BXSA9ICJLYW5hIiwJCVtMRURfU0xFRVBdID0gIlNsZWVwIiwKIAlbTEVEX1NVU1BFTkRdID0gIlN1c3BlbmQiLAlbTEVEX01VVEVdID0gIk11dGUiLAogCVtMRURfTUlTQ10gPSAiTWlzYyIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwppbmRleCA1NTUzYzM1Li45YWMxZTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCQkJY2FzZSBISURfR0RfWDogY2FzZSBISURfR0RfWTogY2FzZSBISURfR0RfWjoKIAkJCQljYXNlIEhJRF9HRF9SWDogY2FzZSBISURfR0RfUlk6IGNhc2UgSElEX0dEX1JaOgogCQkJCWNhc2UgSElEX0dEX1NMSURFUjogY2FzZSBISURfR0RfRElBTDogY2FzZSBISURfR0RfV0hFRUw6Ci0JCQkJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSAKKwkJCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpCiAJCQkJCQltYXBfcmVsKHVzYWdlLT5oaWQgJiAweGYpOwogCQkJCQllbHNlCiAJCQkJCQltYXBfYWJzKHVzYWdlLT5oaWQgJiAweGYpOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCWNhc2UgSElEX1VQX01TVkVORE9SOgogCiAJCQlnb3RvIGlnbm9yZTsKLQkJCQorCiAJCWNhc2UgSElEX1VQX1BJRDoKIAogCQkJc2V0X2JpdChFVl9GRiwgaW5wdXQtPmV2Yml0KTsKQEAgLTM0OSw3ICszNDksNyBAQAogCQlnb3RvIGlnbm9yZTsKIAogCWlmICgoZGV2aWNlLT5xdWlya3MgJiAoSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcgfCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSkpICYmCi0JCSAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMKSAmJiAodXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMKSkgCisJCSAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMKSAmJiAodXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMKSkKIAkJCXNldF9iaXQoUkVMX0hXSEVFTCwgYml0KTsKIAogCWlmICgoKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUpICYmICh1c2FnZS0+aGlkID09IDB4MDAwOTAwMDUpKQpAQCAtMzY1LDExICszNjUsMTEgQEAKIAkJCWEgPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtID0gMDsKIAkJCWIgPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtID0gMjU1OwogCQl9Ci0JCQorCiAJCWlmIChmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0dEX0dBTUVQQUQgfHwgZmllbGQtPmFwcGxpY2F0aW9uID09IEhJRF9HRF9KT1lTVElDSykKIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCB1c2FnZS0+Y29kZSwgYSwgYiwgKGIgLSBhKSA+PiA4LCAoYiAtIGEpID4+IDQpOwogCQllbHNlCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCB1c2FnZS0+Y29kZSwgYSwgYiwgMCwgMCk7Ci0JCQorCiAJfQogCiAJaWYgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpIHsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpIHsgCisJaWYgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpIHsKIAkJaW50IGhhdF9kaXIgPSB1c2FnZS0+aGF0X2RpcjsKIAkJaWYgKCFoYXRfZGlyKQogCQkJaGF0X2RpciA9ICh2YWx1ZSAtIHVzYWdlLT5oYXRfbWluKSAqIDggLyAodXNhZ2UtPmhhdF9tYXggLSB1c2FnZS0+aGF0X21pbiArIDEpICsgMTsKQEAgLTU1MSw3ICs1NTEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykKIAkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OIHx8CiAJCSAgICBoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSBISURfQ09MTEVDVElPTl9QSFlTSUNBTCkKLQkJICAgIAlpZiAoSVNfSU5QVVRfQVBQTElDQVRJT04oaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlKSkKKwkJCWlmIChJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQogCQkJCWJyZWFrOwogCiAJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uKQpAQCAtNTkyLDcgKzU5Miw3IEBACiAJCQkJZm9yIChqID0gMDsgaiA8IHJlcG9ydC0+ZmllbGRbaV0tPm1heHVzYWdlOyBqKyspCiAJCQkJCWhpZGlucHV0X2NvbmZpZ3VyZV91c2FnZShoaWRpbnB1dCwgcmVwb3J0LT5maWVsZFtpXSwKIAkJCQkJCQkJIHJlcG9ydC0+ZmllbGRbaV0tPnVzYWdlICsgaik7Ci0JCQkKKwogCQkJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX01VTFRJX0lOUFVUKSB7CiAJCQkJLyogVGhpcyB3aWxsIGxlYXZlIGhpZGlucHV0IE5VTEwsIHNvIHRoYXQgaXQKIAkJCQkgKiBhbGxvY2F0ZXMgYW5vdGhlciBvbmUgaWYgd2UgaGF2ZSBtb3JlIGlucHV0cyBvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1sZ2ZmLmMKaW5kZXggMGQ3NDA0Yi4uMGM0Yzc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jCkBAIC05NCw3ICs5NCw3IEBACiAJCQkJCWlzbid0IHJlYWxseSBuZWNlc3NhcnkgKi8KIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3NbMV07ICAgICAgLyogQ29udGFpbnMgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkJCQkgICAgICAgIHN0YXRlIG9mIHRoZSBkcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCQorCQkJCSAgICAgICAgc3RhdGUgb2YgdGhlIGRyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KIAogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogfTsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlrZnJlZShyZXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KHJldC0+ZmllbGRbMF0tPnZhbHVlLCAwLCBzaXplb2YoczMyWzhdKSk7CQorCW1lbXNldChyZXQtPmZpZWxkWzBdLT52YWx1ZSwgMCwgc2l6ZW9mKHMzMls4XSkpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5NSwxMSArMjk1LDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICh0eXBlICE9IEVWX0ZGKSAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgIAlpZiAoIUxHRkZfQ0hFQ0tfT1dORVJTSElQKGNvZGUsIGxnZmYpKSByZXR1cm4gLUVBQ0NFUzsKKwlpZiAoIUxHRkZfQ0hFQ0tfT1dORVJTSElQKGNvZGUsIGxnZmYpKSByZXR1cm4gLUVBQ0NFUzsKIAlpZiAodmFsdWUgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsZ2ZmLT5sb2NrLCBmbGFncyk7Ci0JCisKIAlpZiAodmFsdWUgPiAwKSB7CiAJCWlmICh0ZXN0X2JpdChFRkZFQ1RfU1RBUlRFRCwgZWZmZWN0LT5mbGFncykpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxnZmYtPmxvY2ssIGZsYWdzKTsKQEAgLTM0NSw3ICszNDUsNyBAQAogCQkgIGFuZCBwZXJmb3JtIGlvY3RscyBvbiB0aGUgc2FtZSBmZCBhbGwgYXQgdGhlIHNhbWUgdGltZSAqLwogCQlpZiAoIGN1cnJlbnQtPnBpZCA9PSBsZ2ZmLT5lZmZlY3RzW2ldLm93bmVyCiAJCSAgICAgJiYgdGVzdF9iaXQoRUZGRUNUX1VTRUQsIGxnZmYtPmVmZmVjdHNbaV0uZmxhZ3MpKSB7Ci0JCQkKKwogCQkJaWYgKGhpZF9sZ2ZmX2VyYXNlKGRldiwgaSkpCiAJCQkJd2FybigiZXJhc2UgZWZmZWN0ICVkIGZhaWxlZCIsIGkpOwogCQl9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAlzdHJ1Y3QgbGdmZl9lZmZlY3QgbmV3OwogCWludCBpZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJZGJnKCJpb2N0bCBydW1ibGUiKTsKIAogCWlmICghdGVzdF9iaXQoZWZmZWN0LT50eXBlLCBpbnB1dC0+ZmZiaXQpKSByZXR1cm4gLUVJTlZBTDsKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxnZmYtPmxvY2ssIGZsYWdzKTsKIAotIAlmb3IgKGk9MDsgaTxMR0ZGX0VGRkVDVFM7ICsraSkgeworCWZvciAoaT0wOyBpPExHRkZfRUZGRUNUUzsgKytpKSB7CiAJCXN0cnVjdCBsZ2ZmX2VmZmVjdCogZWZmZWN0ID0gbGdmZi0+ZWZmZWN0cyAraTsKIAogCQlpZiAodGVzdF9iaXQoRUZGRUNUX1BMQVlJTkcsIGVmZmVjdC0+ZmxhZ3MpKSB7CkBAIC00OTEsNyArNDkxLDcgQEAKIAkJCQlzZXRfYml0KEVGRkVDVF9QTEFZSU5HLCBsZ2ZmLT5lZmZlY3RzW2ldLmZsYWdzKTsKIAkJCX0KIAkJfQotIAl9CisJfQogCiAjZGVmaW5lIENMQU1QKHgpIGlmICh4IDwgMCkgeCA9IDA7IGlmICh4ID4gMHhmZikgeCA9IDB4ZmYKIApAQCAtNTI0LDUgKzUyNCw1IEBACiAJCWFkZF90aW1lcigmbGdmZi0+dGltZXIpOwogCX0KIAotIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsZ2ZmLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGdmZi0+bG9jaywgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmggYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaAppbmRleCA2ZDkzMjljLi5jMWI2YjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaApAQCAtMTE4LDcgKzExOCw3IEBACiAjZGVmaW5lIEhJRF9NQUlOX0lURU1fQ09OU1RBTlQJCTB4MDAxCiAjZGVmaW5lIEhJRF9NQUlOX0lURU1fVkFSSUFCTEUJCTB4MDAyCiAjZGVmaW5lIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUJCTB4MDA0Ci0jZGVmaW5lIEhJRF9NQUlOX0lURU1fV1JBUAkJMHgwMDgJCisjZGVmaW5lIEhJRF9NQUlOX0lURU1fV1JBUAkJMHgwMDgKICNkZWZpbmUgSElEX01BSU5fSVRFTV9OT05MSU5FQVIJCTB4MDEwCiAjZGVmaW5lIEhJRF9NQUlOX0lURU1fTk9fUFJFRkVSUkVECTB4MDIwCiAjZGVmaW5lIEhJRF9NQUlOX0lURU1fTlVMTF9TVEFURQkweDA0MApAQCAtMTcyLDE0ICsxNzIsMTQgQEAKICNkZWZpbmUgSElEX1VTQUdFX1BBR0UJCTB4ZmZmZjAwMDAKIAogI2RlZmluZSBISURfVVBfVU5ERUZJTkVECTB4MDAwMDAwMDAKLSNkZWZpbmUgSElEX1VQX0dFTkRFU0sgCQkweDAwMDEwMDAwCi0jZGVmaW5lIEhJRF9VUF9LRVlCT0FSRCAJMHgwMDA3MDAwMAotI2RlZmluZSBISURfVVBfTEVEIAkJMHgwMDA4MDAwMAotI2RlZmluZSBISURfVVBfQlVUVE9OIAkJMHgwMDA5MDAwMAotI2RlZmluZSBISURfVVBfT1JESU5BTCAJCTB4MDAwYTAwMDAKKyNkZWZpbmUgSElEX1VQX0dFTkRFU0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSElEX1VQX0tFWUJPQVJECQkweDAwMDcwMDAwCisjZGVmaW5lIEhJRF9VUF9MRUQJCTB4MDAwODAwMDAKKyNkZWZpbmUgSElEX1VQX0JVVFRPTgkJMHgwMDA5MDAwMAorI2RlZmluZSBISURfVVBfT1JESU5BTAkJMHgwMDBhMDAwMAogI2RlZmluZSBISURfVVBfQ09OU1VNRVIJCTB4MDAwYzAwMDAKLSNkZWZpbmUgSElEX1VQX0RJR0lUSVpFUiAJMHgwMDBkMDAwMAotI2RlZmluZSBISURfVVBfUElEIAkJMHgwMDBmMDAwMAorI2RlZmluZSBISURfVVBfRElHSVRJWkVSCTB4MDAwZDAwMDAKKyNkZWZpbmUgSElEX1VQX1BJRAkJMHgwMDBmMDAwMAogI2RlZmluZSBISURfVVBfSFBWRU5ET1IgICAgICAgICAweGZmN2YwMDAwCiAjZGVmaW5lIEhJRF9VUF9NU1ZFTkRPUgkJMHhmZjAwMDAwMAogCkBAIC00MDYsNyArNDA2LDcgQEAKIAlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7CQkJCQkJLyogT3V0cHV0IGJ1ZmZlciBkbWEgKi8KIAlzcGlubG9ja190IG91dGxvY2s7CQkJCQkJLyogT3V0cHV0IGZpZm8gc3BpbmxvY2sgKi8KIAotCXVuc2lnbmVkIGNsYWltZWQ7CQkJCQkJLyogQ2xhaW1lZCBieSBoaWRpbnB1dCwgaGlkZGV2PyAqLwkKKwl1bnNpZ25lZCBjbGFpbWVkOwkJCQkJCS8qIENsYWltZWQgYnkgaGlkaW5wdXQsIGhpZGRldj8gKi8KIAl1bnNpZ25lZCBxdWlya3M7CQkJCQkJLyogVmFyaW91cyBxdWlya3MgdGhlIGRldmljZSBjYW4gcHVsbCBvbiB1cyAqLwogCiAJc3RydWN0IGxpc3RfaGVhZCBpbnB1dHM7CQkJCQkvKiBUaGUgbGlzdCBvZiBpbnB1dHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKaW5kZXggOTZiN2M5MC4uNGMxMzMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCQlyaW5mby0+cmVwb3J0X2lkID0gKChzdHJ1Y3QgaGlkX3JlcG9ydCAqKSBsaXN0KS0+aWQ7CiAJCWJyZWFrOwotCQkKKwogCWNhc2UgSElEX1JFUE9SVF9JRF9ORVhUOgogCQlsaXN0ID0gKHN0cnVjdCBsaXN0X2hlYWQgKikKIAkJCXJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtyaW5mby0+cmVwb3J0X2lkICYgSElEX1JFUE9SVF9JRF9NQVNLXTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCXJpbmZvLT5yZXBvcnRfaWQgPSAoKHN0cnVjdCBoaWRfcmVwb3J0ICopIGxpc3QpLT5pZDsKIAkJYnJlYWs7Ci0JCQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCWlmICh1cmVmLT5maWVsZF9pbmRleCAhPSBISURfRklFTERfSU5ERVhfTk9ORSB8fAogCQkgICAgKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfUkVQT1JUKSAhPSAwKSB7CiAJCQlsaXN0LT5idWZmZXJbbGlzdC0+aGVhZF0gPSAqdXJlZjsKLQkJCWxpc3QtPmhlYWQgPSAobGlzdC0+aGVhZCArIDEpICYgCisJCQlsaXN0LT5oZWFkID0gKGxpc3QtPmhlYWQgKyAxKSAmCiAJCQkJKEhJRERFVl9CVUZGRVJfU0laRSAtIDEpOwogCQkJa2lsbF9mYXN5bmMoJmxpc3QtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogCQl9CkBAIC0xNzksOSArMTc5LDkgQEAKIAl1bnNpZ25lZCB0eXBlID0gZmllbGQtPnJlcG9ydF90eXBlOwogCXN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmIHVyZWY7CiAKLQl1cmVmLnJlcG9ydF90eXBlID0gCisJdXJlZi5yZXBvcnRfdHlwZSA9CiAJICAodHlwZSA9PSBISURfSU5QVVRfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9JTlBVVCA6Ci0JICAoKHR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX09VVFBVVCA6IAorCSAgKCh0eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9PVVRQVVQgOgogCSAgICgodHlwZSA9PSBISURfRkVBVFVSRV9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX0ZFQVRVUkU6MCkpOwogCXVyZWYucmVwb3J0X2lkID0gZmllbGQtPnJlcG9ydC0+aWQ7CiAJdXJlZi5maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKQEAgLTE5OSw5ICsxOTksOSBAQAogCXN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmIHVyZWY7CiAKIAltZW1zZXQoJnVyZWYsIDAsIHNpemVvZih1cmVmKSk7Ci0JdXJlZi5yZXBvcnRfdHlwZSA9IAorCXVyZWYucmVwb3J0X3R5cGUgPQogCSAgKHR5cGUgPT0gSElEX0lOUFVUX1JFUE9SVCkgPyBISURfUkVQT1JUX1RZUEVfSU5QVVQgOgotCSAgKCh0eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9PVVRQVVQgOiAKKwkgICgodHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgPyBISURfUkVQT1JUX1RZUEVfT1VUUFVUIDoKIAkgICAoKHR5cGUgPT0gSElEX0ZFQVRVUkVfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9GRUFUVVJFOjApKTsKIAl1cmVmLnJlcG9ydF9pZCA9IHJlcG9ydC0+aWQ7CiAJdXJlZi5maWVsZF9pbmRleCA9IEhJRF9GSUVMRF9JTkRFWF9OT05FOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJKmxpc3RwdHIgPSAoKmxpc3RwdHIpLT5uZXh0OwogCiAJaWYgKCEtLWxpc3QtPmhpZGRldi0+b3BlbikgewotCQlpZiAobGlzdC0+aGlkZGV2LT5leGlzdCkgCisJCWlmIChsaXN0LT5oaWRkZXYtPmV4aXN0KQogCQkJaGlkX2Nsb3NlKGxpc3QtPmhpZGRldi0+aGlkKTsKIAkJZWxzZQogCQkJa2ZyZWUobGlzdC0+aGlkZGV2KTsKQEAgLTMwMyw3ICszMDMsNyBAQAogCQlpZiAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSB7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmbGlzdC0+aGlkZGV2LT53YWl0LCAmd2FpdCk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCisKIAkJCXdoaWxlIChsaXN0LT5oZWFkID09IGxpc3QtPnRhaWwpIHsKIAkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKIAkJCQkJcmV0dmFsID0gLUVBR0FJTjsKQEAgLTMxNyw3ICszMTcsNyBAQAogCQkJCQlyZXR2YWwgPSAtRUlPOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJCisKIAkJCQlzY2hlZHVsZSgpOwogCQkJfQogCkBAIC0zMjksNyArMzI5LDcgQEAKIAkJCXJldHVybiByZXR2YWw7CiAKIAotCQl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmIAorCQl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmCiAJCSAgICAgICByZXR2YWwgKyBldmVudF9zaXplIDw9IGNvdW50KSB7CiAJCQlpZiAoKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgPT0gMCkgewogCQkJCWlmIChsaXN0LT5idWZmZXJbbGlzdC0+dGFpbF0uZmllbGRfaW5kZXggIT0KQEAgLTQwNSwxMCArNDA1LDEwIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCi0JCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gCisJCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0KIAkJCSAgICBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJiBhcmctLSA9PSAwKQogCQkJCWJyZWFrOwotCQkKKwogCQlpZiAoaSA9PSBoaWQtPm1heGNvbGxlY3Rpb24pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTYyLDcgKzU2Miw3IEBACiAJCWlmICghdXJlZl9tdWx0aSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQl1cmVmID0gJnVyZWZfbXVsdGktPnVyZWY7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcih1cmVmLCB1c2VyX2FyZywgc2l6ZW9mKCp1cmVmKSkpIAorCQlpZiAoY29weV9mcm9tX3VzZXIodXJlZiwgdXNlcl9hcmcsIHNpemVvZigqdXJlZikpKQogCQkJZ290byBmYXVsdDsKIAogCQlyaW5mby5yZXBvcnRfdHlwZSA9IHVyZWYtPnJlcG9ydF90eXBlOwpAQCAtNTk1LDcgKzU5NSw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJdXJlZiA9ICZ1cmVmX211bHRpLT51cmVmOwogCQlpZiAoY21kID09IEhJRElPQ0dVU0FHRVMgfHwgY21kID09IEhJRElPQ1NVU0FHRVMpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcih1cmVmX211bHRpLCB1c2VyX2FyZywgCisJCQlpZiAoY29weV9mcm9tX3VzZXIodXJlZl9tdWx0aSwgdXNlcl9hcmcsCiAJCQkJCSAgIHNpemVvZigqdXJlZl9tdWx0aSkpKQogCQkJCWdvdG8gZmF1bHQ7CiAJCX0gZWxzZSB7CkBAIC02MDMsNyArNjAzLDcgQEAKIAkJCQlnb3RvIGZhdWx0OwogCQl9CiAKLQkJaWYgKGNtZCAhPSBISURJT0NHVVNBR0UgJiYgCisJCWlmIChjbWQgIT0gSElESU9DR1VTQUdFICYmCiAJCSAgICBjbWQgIT0gSElESU9DR1VTQUdFUyAmJgogCQkgICAgdXJlZi0+cmVwb3J0X3R5cGUgPT0gSElEX1JFUE9SVF9UWVBFX0lOUFVUKQogCQkJZ290byBpbnZhbDsKQEAgLTY1MSwxNiArNjUxLDE2IEBACiAJCQkJcmV0dXJuIGZpZWxkLT51c2FnZVt1cmVmLT51c2FnZV9pbmRleF0uY29sbGVjdGlvbl9pbmRleDsKIAkJCWNhc2UgSElESU9DR1VTQUdFUzoKIAkJCQlmb3IgKGkgPSAwOyBpIDwgdXJlZl9tdWx0aS0+bnVtX3ZhbHVlczsgaSsrKQotCQkJCQl1cmVmX211bHRpLT52YWx1ZXNbaV0gPSAKKwkJCQkJdXJlZl9tdWx0aS0+dmFsdWVzW2ldID0KIAkJCQkJICAgIGZpZWxkLT52YWx1ZVt1cmVmLT51c2FnZV9pbmRleCArIGldOwotCQkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsIHVyZWZfbXVsdGksIAorCQkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsIHVyZWZfbXVsdGksCiAJCQkJCQkgc2l6ZW9mKCp1cmVmX211bHRpKSkpCiAJCQkJCWdvdG8gZmF1bHQ7CiAJCQkJZ290byBnb29kcmV0dXJuOwogCQkJY2FzZSBISURJT0NTVVNBR0VTOgogCQkJCWZvciAoaSA9IDA7IGkgPCB1cmVmX211bHRpLT5udW1fdmFsdWVzOyBpKyspCi0JCQkJCWZpZWxkLT52YWx1ZVt1cmVmLT51c2FnZV9pbmRleCArIGldID0gCi0JCQkJICAJICAgIHVyZWZfbXVsdGktPnZhbHVlc1tpXTsKKwkJCQkJZmllbGQtPnZhbHVlW3VyZWYtPnVzYWdlX2luZGV4ICsgaV0gPQorCQkJCQkgICAgdXJlZl9tdWx0aS0+dmFsdWVzW2ldOwogCQkJCWdvdG8gZ29vZHJldHVybjsKIAkJfQogCkBAIC02NzAsNyArNjcwLDcgQEAKIGZhdWx0OgogCQlrZnJlZSh1cmVmX211bHRpKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci1pbnZhbDoJCQoraW52YWw6CiAJCWtmcmVlKHVyZWZfbXVsdGkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJLm5hbWUgPQkJInVzYi9oaWQvaGlkZGV2JWQiLAogCS5mb3BzID0JCSZoaWRkZXZfZm9wcywKIAkubW9kZSA9CQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVU1IsCi0gICAgICAgCS5taW5vcl9iYXNlID0JSElEREVWX01JTk9SX0JBU0UsCisJLm1pbm9yX2Jhc2UgPQlISURERVZfTUlOT1JfQkFTRSwKIH07CiAKIC8qCkBAIC03NDcsNyArNzQ3LDcgQEAKIAlpbnQgcmV0dmFsOwogCiAJZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQotCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gCisJCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PQogCQkgICAgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gJiYKIAkJICAgICFJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQogCQkJYnJlYWs7CkBAIC03NTUsMTEgKzc1NSwxMSBAQAogCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbiAmJiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSElEREVWKSA9PSAwKQogCQlyZXR1cm4gLTE7CiAKLSAJaWYgKCEoaGlkZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhpZGRldiksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShoaWRkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkZGV2KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLTE7CiAJbWVtc2V0KGhpZGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBoaWRkZXYpKTsKIAotIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CiAJCWtmcmVlKGhpZGRldik7CkBAIC03NjgsMTIgKzc2OCwxMiBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaGlkZGV2LT53YWl0KTsKIAotIAloaWRkZXZfdGFibGVbaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKKwloaWRkZXZfdGFibGVbaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKIAogCWhpZGRldi0+aGlkID0gaGlkOwogCWhpZGRldi0+ZXhpc3QgPSAxOwogCi0gCWhpZC0+bWlub3IgPSBoaWQtPmludGYtPm1pbm9yOworCWhpZC0+bWlub3IgPSBoaWQtPmludGYtPm1pbm9yOwogCWhpZC0+aGlkZGV2ID0gaGlkZGV2OwogCiAJcmV0dXJuIDA7CkBAIC04MTgsNyArODE4LDcgQEAKIC8qIFdlIG5ldmVyIGF0dGFjaCBpbiB0aGlzIG1hbm5lciwgYW5kIHJlbHkgb24gSElEIHRvIGNvbm5lY3QgdXMuICBUaGlzCiAgKiBpcyB3aHkgdGhlcmUgaXMgbm8gZGlzY29ubmVjdCByb3V0aW5lIGRlZmluZWQgaW4gdGhlIHVzYl9kcml2ZXIgZWl0aGVyLgogICovCi1zdGF0aWMgaW50IGhpZGRldl91c2JkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCAKK3N0YXRpYyBpbnQgaGlkZGV2X3VzYmRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpoaWRkZXZfaW5mbykKIHsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGVjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdG10b3VjaC5jICAtLSAgRHJpdmVyIGZvciBJVE0gdG91Y2hzY3JlZW4gcGFuZWwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBCYXNlZCB1cG9uIG9yaWdpbmFsIHdvcmsgYnkgQ2hyaXMgQ29sbGlucyA8eGZpcmUtaXRtdG91Y2hAeHdhcmUuY3g+LgorICoKKyAqIEt1ZG9zIHRvIElUTSBmb3IgcHJvdmlkaW5nIG1lIHdpdGggdGhlIGRhdGFzaGVldCBmb3IgdGhlIHBhbmVsLAorICogZXZlbiB0aG91Z2ggaXQgd2FzIGEgZGF5IGxhdGVyIHRoYW4gSSBoYWQgZmluaXNoZWQgd3JpdGluZyB0aGlzCisgKiBkcml2ZXIuCisgKgorICogSXQgaGFzIG1lYW50IHRoYXQgSSd2ZSBiZWVuIGFibGUgdG8gY29ycmVjdCBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKyAqIHByb3RvY29sIHBhY2tldHMgaG93ZXZlci4KKyAqCisgKiBDQyAtLSAyMDAzLzkvMjkKKyAqCisgKiBIaXN0b3J5CisgKiAxLjAgJiAxLjEgIDIwMDMgKENDKSB2b2p0ZWNoQHN1c2UuY3oKKyAqICAgT3JpZ2luYWwgdmVyc2lvbiBmb3IgMi40Lngga2VybmVscworICoKKyAqIDEuMiAgMDIvMDMvMjAwNSAoSENFKSBoY0BtaXZ1Lm5vCisgKiAgIENvbXBsZXRlIHJld3JpdGUgdG8gc3VwcG9ydCBMaW51eCAyLjYuMTAsIHRoYW5rcyB0byBtdG91Y2h1c2IuYyBmb3IgaGludHMuCisgKiAgIFVuZm9ydHVuYXRlbHkgbm8gY2FsaWJyYXRpb24gc3VwcG9ydCBhdCB0aGlzIHRpbWUuCisgKgorICogMS4yLjEgIDA5LzAzLzIwMDUgKEhDRSkgaGNAbWl2dS5ubworICogICBDb2RlIGNsZWFudXAgYW5kIGFkanVzdGluZyBzeW50YXggdG8gc3RhcnQgbWF0Y2hpbmcga2VybmVsIHN0YW5kYXJkcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworCSNkZWZpbmUgREVCVUcKKyNlbHNlCisJI3VuZGVmIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworLyogb25seSBhbiA4IGJ5dGUgYnVmZmVyIG5lY2Vzc2FyeSBmb3IgYSBzaW5nbGUgcGFja2V0ICovCisjZGVmaW5lIElUTV9CVUZTSVpFCQkJOAorI2RlZmluZSBQQVRIX1NJWkUJCQk2NAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfSVRNSU5DCQkweDA0MDMKKyNkZWZpbmUgVVNCX1BST0RVQ1RfSURfVE9VQ0hQQU5FTAkweGY5ZTkKKworI2RlZmluZSBEUklWRVJfQVVUSE9SICJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoY0BtaXZ1Lm5vPiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjIuMSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBJVE0gSW5jIFRvdWNoIFBhbmVsIERyaXZlciIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIERSSVZFUl9MSUNFTlNFICk7CisKK3N0cnVjdCBpdG10b3VjaF9kZXYgeworCXN0cnVjdCB1c2JfZGV2aWNlCSp1c2JkZXY7IC8qIHVzYiBkZXZpY2UgKi8KKwlzdHJ1Y3QgaW5wdXRfZGV2CWlucHV0ZGV2OyAvKiBpbnB1dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXJiCQkqcmVhZHVyYjsgLyogdXJiICovCisJY2hhcgkJCXJidWZbSVRNX0JVRlNJWkVdOyAvKiBkYXRhICovCisJaW50CQkJdXNlcnM7CisJY2hhciBuYW1lWzEyOF07CisJY2hhciBwaHlzWzY0XTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpdG10b3VjaF9pZHMgW10gPSB7CisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSVRNSU5DLCBVU0JfUFJPRFVDVF9JRF9UT1VDSFBBTkVMKSB9LAorCXsgfQorfTsKKworc3RhdGljIHZvaWQgaXRtdG91Y2hfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGl0bXRvdWNoX2RldiAqIGl0bXRvdWNoID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmaXRtdG91Y2gtPmlucHV0ZGV2OworCWludCByZXR2YWw7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJLyogdGhpcyB1cmIgaXMgdGltaW5nIG91dCAqLworCQlkYmcoIiVzIC0gdXJiIHRpbWVkIG91dCAtIHdhcyB0aGUgZGV2aWNlIHVucGx1Z2dlZD8iLAorCQkgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOworCisJLyogaWYgcHJlc3N1cmUgaGFzIGJlZW4gcmVsZWFzZWQsIHRoZW4gZG9uJ3QgcmVwb3J0IFgvWSAqLworCWlmIChkYXRhWzddICYgMHgyMCkgeworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIChkYXRhWzBdICYgMHgxRikgPDwgNyB8IChkYXRhWzNdICYgMHg3RikpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIChkYXRhWzFdICYgMHgxRikgPDwgNyB8IChkYXRhWzRdICYgMHg3RikpOworCX0KKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIChkYXRhWzJdICYgMSkgPDwgNyB8IChkYXRhWzVdICYgMHg3RikpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIH5kYXRhWzddICYgMHgyMCk7CisJaW5wdXRfc3luYyhkZXYpOworCitleGl0OgorCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpCisJCXByaW50ayhLRVJOX0VSUiAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQ6ICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgaXRtdG91Y2hfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaXRtdG91Y2hfZGV2ICppdG10b3VjaCA9IGlucHV0LT5wcml2YXRlOworCisJaXRtdG91Y2gtPnJlYWR1cmItPmRldiA9IGl0bXRvdWNoLT51c2JkZXY7CisKKwlpZiAodXNiX3N1Ym1pdF91cmIoaXRtdG91Y2gtPnJlYWR1cmIsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpdG10b3VjaF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaXRtdG91Y2hfZGV2ICppdG10b3VjaCA9IGlucHV0LT5wcml2YXRlOworCisJdXNiX2tpbGxfdXJiKGl0bXRvdWNoLT5yZWFkdXJiKTsKK30KKworc3RhdGljIGludCBpdG10b3VjaF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpdG10b3VjaF9kZXYgKml0bXRvdWNoOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKwl1bnNpZ25lZCBpbnQgbWF4cDsKKwljaGFyIHBhdGhbUEFUSF9TSVpFXTsKKworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmICghKGl0bXRvdWNoID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGl0bXRvdWNoX2RldiksIEdGUF9LRVJORUwpKSkgeworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeS4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpdG10b3VjaC0+dXNiZGV2ID0gdWRldjsKKworCWl0bXRvdWNoLT5pbnB1dGRldi5wcml2YXRlID0gaXRtdG91Y2g7CisJaXRtdG91Y2gtPmlucHV0ZGV2Lm9wZW4gPSBpdG10b3VjaF9vcGVuOworCWl0bXRvdWNoLT5pbnB1dGRldi5jbG9zZSA9IGl0bXRvdWNoX2Nsb3NlOworCisJdXNiX21ha2VfcGF0aCh1ZGV2LCBwYXRoLCBQQVRIX1NJWkUpOworCisJaXRtdG91Y2gtPmlucHV0ZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKKwlpdG10b3VjaC0+aW5wdXRkZXYuYWJzYml0WzBdID0gQklUKEFCU19YKSB8IEJJVChBQlNfWSkgfCBCSVQoQUJTX1BSRVNTVVJFKTsKKwlpdG10b3VjaC0+aW5wdXRkZXYua2V5Yml0W0xPTkcoQlROX1RPVUNIKV0gPSBCSVQoQlROX1RPVUNIKTsKKworCWl0bXRvdWNoLT5pbnB1dGRldi5uYW1lID0gaXRtdG91Y2gtPm5hbWU7CisJaXRtdG91Y2gtPmlucHV0ZGV2LnBoeXMgPSBpdG10b3VjaC0+cGh5czsKKwlpdG10b3VjaC0+aW5wdXRkZXYuaWQuYnVzdHlwZSA9IEJVU19VU0I7CisJaXRtdG91Y2gtPmlucHV0ZGV2LmlkLnZlbmRvciA9IHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CisJaXRtdG91Y2gtPmlucHV0ZGV2LmlkLnByb2R1Y3QgPSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKwlpdG10b3VjaC0+aW5wdXRkZXYuaWQudmVyc2lvbiA9IHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlOworCWl0bXRvdWNoLT5pbnB1dGRldi5kZXYgPSAmaW50Zi0+ZGV2OworCisJaWYgKCFzdHJsZW4oaXRtdG91Y2gtPm5hbWUpKQorCQlzcHJpbnRmKGl0bXRvdWNoLT5uYW1lLCAiVVNCIElUTSB0b3VjaHNjcmVlbiIpOworCisJLyogZGV2aWNlIGxpbWl0cyAqLworCS8qIGFzIHNwZWNpZmllZCBieSB0aGUgSVRNIGRhdGFzaGVldCwgWCBhbmQgWSBhcmUgMTJiaXQsCisJICogWiAocHJlc3N1cmUpIGlzIDggYml0LiBIb3dldmVyLCB0aGUgZmllbGRzIGFyZSBkZWZpbmVkIHVwCisJICogdG8gMTQgYml0cyBmb3IgZnV0dXJlIHBvc3NpYmxlIGV4cGFuc2lvbi4KKwkgKi8KKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmaXRtdG91Y2gtPmlucHV0ZGV2LCBBQlNfWCwgMCwgMHgwRkZGLCAyLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmaXRtdG91Y2gtPmlucHV0ZGV2LCBBQlNfWSwgMCwgMHgwRkZGLCAyLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmaXRtdG91Y2gtPmlucHV0ZGV2LCBBQlNfUFJFU1NVUkUsIDAsIDB4RkYsIDIsIDApOworCisJLyogaW5pdGlhbGlzZSB0aGUgVVJCIHNvIHdlIGNhbiByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBzdHJlYW0gKi8KKwlwaXBlID0gdXNiX3JjdmludHBpcGUoaXRtdG91Y2gtPnVzYmRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCWlmIChtYXhwID4gSVRNX0JVRlNJWkUpCisJCW1heHAgPSBJVE1fQlVGU0laRTsKKworCWl0bXRvdWNoLT5yZWFkdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKworCWlmICghaXRtdG91Y2gtPnJlYWR1cmIpIHsKKwkJZGJnKCIlcyAtIHVzYl9hbGxvY191cmIgZmFpbGVkOiBpdG10b3VjaC0+cmVhZHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKGl0bXRvdWNoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdXNiX2ZpbGxfaW50X3VyYihpdG10b3VjaC0+cmVhZHVyYiwgaXRtdG91Y2gtPnVzYmRldiwgcGlwZSwgaXRtdG91Y2gtPnJidWYsCisJCQkgbWF4cCwgaXRtdG91Y2hfaXJxLCBpdG10b3VjaCwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJml0bXRvdWNoLT5pbnB1dGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJpdG10b3VjaDogJXMgcmVnaXN0ZXJlZCBvbiAlc1xuIiwgaXRtdG91Y2gtPm5hbWUsIHBhdGgpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaXRtdG91Y2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl0bXRvdWNoX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGl0bXRvdWNoX2RldiAqaXRtdG91Y2ggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCWlmIChpdG10b3VjaCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmaXRtdG91Y2gtPmlucHV0ZGV2KTsKKwkJdXNiX2tpbGxfdXJiKGl0bXRvdWNoLT5yZWFkdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKGl0bXRvdWNoLT5yZWFkdXJiKTsKKwkJa2ZyZWUoaXRtdG91Y2gpOworCX0KK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGl0bXRvdWNoX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBpdG10b3VjaF9kcml2ZXIgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5uYW1lID0gICAgICAgICAiaXRtdG91Y2giLAorCS5wcm9iZSA9ICAgICAgICBpdG10b3VjaF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9ICAgaXRtdG91Y2hfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSAgICAgaXRtdG91Y2hfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXRtdG91Y2hfaW5pdCh2b2lkKQoreworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwlpbmZvKERSSVZFUl9BVVRIT1IpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJml0bXRvdWNoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpdG10b3VjaF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJml0bXRvdWNoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGl0bXRvdWNoX2luaXQpOworbW9kdWxlX2V4aXQoaXRtdG91Y2hfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9rYnRhYi5jIGIvZHJpdmVycy91c2IvaW5wdXQva2J0YWIuYwppbmRleCBhNjhjNWI0Li5kMmYwZjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9rYnRhYi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2tidGFiLmMKQEAgLTM2LDcgKzM2LDYgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2IGRldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwogCXN0cnVjdCB1cmIgKmlycTsKLQlpbnQgb3BlbjsKIAlpbnQgeCwgeTsKIAlpbnQgYnV0dG9uOwogCWludCBwcmVzc3VyZTsKQEAgLTc5LDEyICs3OCwxMiBAQAogCS8qaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCAsIGRhdGFbMF0gJiAweDAxKTsqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMF0gJiAweDAyKTsKIAotCWlmKCAtMSA9PSBrYl9wcmVzc3VyZV9jbGljayl7IAorCWlmICgtMSA9PSBrYl9wcmVzc3VyZV9jbGljaykgewogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCBrYnRhYi0+cHJlc3N1cmUpOwogCX0gZWxzZSB7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgKGtidGFiLT5wcmVzc3VyZSA+IGtiX3ByZXNzdXJlX2NsaWNrKSA/IDEgOiAwKTsKIAl9OwotCQorCiAJaW5wdXRfc3luYyhkZXYpOwogCiAgZXhpdDoKQEAgLTEwNSwxNCArMTA0LDkgQEAKIHsKIAlzdHJ1Y3Qga2J0YWIgKmtidGFiID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKGtidGFiLT5vcGVuKyspCi0JCXJldHVybiAwOwotCiAJa2J0YWItPmlycS0+ZGV2ID0ga2J0YWItPnVzYmRldjsKLQlpZiAodXNiX3N1Ym1pdF91cmIoa2J0YWItPmlycSwgR0ZQX0tFUk5FTCkpIHsKLQkJa2J0YWItPm9wZW4tLTsKKwlpZiAodXNiX3N1Ym1pdF91cmIoa2J0YWItPmlycSwgR0ZQX0tFUk5FTCkpCiAJCXJldHVybiAtRUlPOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTIxLDggKzExNSw3IEBACiB7CiAJc3RydWN0IGtidGFiICprYnRhYiA9IGRldi0+cHJpdmF0ZTsKIAotCWlmICghLS1rYnRhYi0+b3BlbikKLQkJdXNiX2tpbGxfdXJiKGtidGFiLT5pcnEpOworCXVzYl9raWxsX3VyYihrYnRhYi0+aXJxKTsKIH0KIAogc3RhdGljIGludCBrYnRhYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQpAQCAtMTYxLDcgKzE1NCw3IEBACiAJa2J0YWItPmRldi5hYnNtYXhbQUJTX1hdID0gMHgyMDAwOwogCWtidGFiLT5kZXYuYWJzbWF4W0FCU19ZXSA9IDB4MTc1MDsKIAlrYnRhYi0+ZGV2LmFic21heFtBQlNfUFJFU1NVUkVdID0gMHhmZjsKLQkKKwogCWtidGFiLT5kZXYuYWJzZnV6eltBQlNfWF0gPSA0OwogCWtidGFiLT5kZXYuYWJzZnV6eltBQlNfWV0gPSA0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIGtleXNwYW5fcmVtb3RlOiBVU0IgZHJpdmVyIGZvciB0aGUgS2V5c3BhbiBETVIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgWnltZXRhIENvcnBvcmF0aW9uIC0gTWljaGFlbCBEb3duZXkgKGRvd25leUB6eW1ldGEuY29tKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHB1dCB0b2dldGhlciB3aXRoIHRoZSBzdXBwb3J0IG9mIElubm9zeXMsIEluYy4KKyAqIGFuZCBLZXlzcGFuLCBJbmMgdGhlIG1hbnVmYWN0dXJlcnMgb2YgdGhlIEtleXNwYW4gVVNCIERNUiBwcm9kdWN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSJ2MC4xIgorI2RlZmluZSBEUklWRVJfQVVUSE9SCSJNaWNoYWVsIERvd25leSA8ZG93bmV5QHp5bWV0YS5jb20+IgorI2RlZmluZSBEUklWRVJfREVTQwkiRHJpdmVyIGZvciB0aGUgVVNCIEtleXNwYW4gcmVtb3RlIGNvbnRyb2wuIgorI2RlZmluZSBEUklWRVJfTElDRU5TRQkiR1BMIgorCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgZHJpdmVyLiAqLworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZXh0cmEgZGVidWcgbWVzc2FnZXMgYW5kIGluZm9ybWF0aW9uIik7CisKKy8qIFZlbmRvciBhbmQgcHJvZHVjdCBpZHMgKi8KKyNkZWZpbmUgVVNCX0tFWVNQQU5fVkVORE9SX0lECQkweDA2Q0QKKyNkZWZpbmUgVVNCX0tFWVNQQU5fUFJPRFVDVF9VSUExMQkweDAyMDIKKworLyogRGVmaW5lcyBmb3IgY29udmVydGluZyB0aGUgZGF0YSBmcm9tIHRoZSByZW1vdGUuICovCisjZGVmaW5lIFpFUk8JCTB4MTgKKyNkZWZpbmUgWkVST19NQVNLCTB4MUYJLyogNSBiaXRzIGZvciBhIDAgKi8KKyNkZWZpbmUgT05FCQkweDNDCisjZGVmaW5lIE9ORV9NQVNLCTB4M0YJLyogNiBiaXRzIGZvciBhIDEgKi8KKyNkZWZpbmUgU1lOQwkJMHgzRjgwCisjZGVmaW5lIFNZTkNfTUFTSwkweDNGRkYJLyogMTQgYml0cyBmb3IgYSBTWU5DIHNlcXVlbmNlICovCisjZGVmaW5lIFNUT1AJCTB4MDAKKyNkZWZpbmUgU1RPUF9NQVNLCTB4MUYJLyogNSBiaXRzIGZvciB0aGUgU1RPUCBzZXF1ZW5jZSAqLworI2RlZmluZSBHQVAJCTB4RkYKKworI2RlZmluZSBSRUNWX1NJWkUJOAkvKiBUaGUgVUlBLTExIHR5cGUgaGF2ZSBhIDggYnl0ZSBsaW1pdC4gKi8KKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGtleXNwYW5fdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX0tFWVNQQU5fVkVORE9SX0lELCBVU0JfS0VZU1BBTl9QUk9EVUNUX1VJQTExKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIFN0cnVjdHVyZSB0byBzdG9yZSBhbGwgdGhlIHJlYWwgc3R1ZmYgdGhhdCBhIHJlbW90ZSBzZW5kcyB0byB1cy4gKi8KK3N0cnVjdCBrZXlzcGFuX21lc3NhZ2UgeworCXUxNglzeXN0ZW07CisJdTgJYnV0dG9uOworCXU4CXRvZ2dsZTsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBhbGwgdGhlIGJpdCB0ZXN0aW5nIG1hZ2ljIG5lZWRlZCB0byBiZSBkb25lLiAqLworc3RydWN0IGJpdF90ZXN0ZXIgeworCXUzMgl0ZXN0ZXI7CisJaW50CWxlbjsKKwlpbnQJcG9zOworCWludAliaXRzX2xlZnQ7CisJdTgJYnVmZmVyWzMyXTsKK307CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZHJpdmVyIHNwZWNpZmljIHN0dWZmICovCitzdHJ1Y3QgdXNiX2tleXNwYW4geworCWNoYXIJCQkJbmFtZVsxMjhdOworCWNoYXIJCQkJcGh5c1s2NF07CisJc3RydWN0IHVzYl9kZXZpY2UqCQl1ZGV2OworCXN0cnVjdCBpbnB1dF9kZXYJCWlucHV0OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlKgkJaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCQlpcnFfdXJiOworCWludAkJCQlvcGVuOworCWRtYV9hZGRyX3QJCQlpbl9kbWE7CisJdW5zaWduZWQgY2hhcioJCQlpbl9idWZmZXI7CisKKwkvKiB2YXJpYWJsZXMgdXNlZCB0byBwYXJzZSBtZXNzYWdlcyBmcm9tIHJlbW90ZS4gKi8KKwlzdHJ1Y3QgYml0X3Rlc3RlcgkJZGF0YTsKKwlpbnQJCQkJc3RhZ2U7CisJaW50CQkJCXRvZ2dsZTsKK307CisKKy8qCisgKiBUYWJsZSB0aGF0IG1hcHMgdGhlIDMxIHBvc3NpYmxlIGtleWNvZGVzIHRvIGlucHV0IGtleXMuCisgKiBDdXJyZW50bHkgdGhlcmUgYXJlIDE1IGFuZCAxNyBidXR0b24gbW9kZWxzIHNvIFJFU0VSVkVEIGNvZGVzCisgKiBhcmUgYmxhbmsgYXJlYXMgaW4gdGhlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQga2V5c3Bhbl9rZXlfdGFibGVbXSA9IHsKKwlLRVlfUkVTRVJWRUQsCQkvKiAwIGlzIGp1c3QgYSBwbGFjZSBob2xkZXIuICovCisJS0VZX1JFU0VSVkVELAorCUtFWV9TVE9QLAorCUtFWV9QTEFZQ0QsCisJS0VZX1JFU0VSVkVELAorCUtFWV9QUkVWSU9VU1NPTkcsCisJS0VZX1JFV0lORCwKKwlLRVlfRk9SV0FSRCwKKwlLRVlfTkVYVFNPTkcsCisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1BBVVNFLAorCUtFWV9WT0xVTUVVUCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfVk9MVU1FRE9XTiwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1VQLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfTVVURSwKKwlLRVlfTEVGVCwKKwlLRVlfRU5URVIsCisJS0VZX1JJR0hULAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX0RPV04sCisJS0VZX1JFU0VSVkVELAorCUtFWV9LUEFTVEVSSVNLLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfTUVOVQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGtleXNwYW5fZHJpdmVyOworCisvKgorICogRGVidWcgcm91dGluZSB0aGF0IHByaW50cyBvdXQgd2hhdCB3ZSd2ZSByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUuCisgKi8KK3N0YXRpYyB2b2lkIGtleXNwYW5fcHJpbnQoc3RydWN0IHVzYl9rZXlzcGFuKiBkZXYpIC8qdW5zaWduZWQgY2hhciogZGF0YSkqLworeworCWNoYXIgY29kZXNbNCpSRUNWX1NJWkVdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJFQ1ZfU0laRTsgaSsrKSB7CisJCXNucHJpbnRmKGNvZGVzK2kqMywgNCwgIiUwMnggIiwgZGV2LT5pbl9idWZmZXJbaV0pOworCX0KKworCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgIiVzXG4iLCBjb2Rlcyk7Cit9CisKKy8qCisgKiBSb3V0aW5lIHRoYXQgbWFuYWdlcyB0aGUgYml0X3Rlc3RlciBzdHJ1Y3R1cmUuICBJdCBtYWtlcyBzdXJlIHRoYXQgdGhlcmUgYXJlCisgKiBhdCBsZWFzdCBiaXRzX25lZWRlZCBiaXRzIGxvYWRlZCBpbnRvIHRoZSB0ZXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQga2V5c3Bhbl9sb2FkX3Rlc3RlcihzdHJ1Y3QgdXNiX2tleXNwYW4qIGRldiwgaW50IGJpdHNfbmVlZGVkKQoreworCWlmIChkZXYtPmRhdGEuYml0c19sZWZ0ID49IGJpdHNfbmVlZGVkKQorCQlyZXR1cm4oMCk7CisKKwkvKgorCSAqIFNvbWVob3cgd2UndmUgbWlzc2VkIHRoZSBsYXN0IG1lc3NhZ2UuIFRoZSBtZXNzYWdlIHdpbGwgYmUgcmVwZWF0ZWQKKwkgKiB0aG91Z2ggc28gaXQncyBub3QgdG9vIGJpZyBhIGRlYWwKKwkgKi8KKwlpZiAoZGV2LT5kYXRhLnBvcyA+PSBkZXYtPmRhdGEubGVuKSB7CisJCWRldl9kYmcoJmRldi0+dWRldiwgIiVzIC0gRXJyb3IgcmFuIG91dCBvZiBkYXRhLiBwb3M6ICVkLCBsZW46ICVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBkZXYtPmRhdGEucG9zLCBkZXYtPmRhdGEubGVuKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBMb2FkIGFzIG11Y2ggYXMgd2UgY2FuIGludG8gdGhlIHRlc3Rlci4gKi8KKwl3aGlsZSAoKGRldi0+ZGF0YS5iaXRzX2xlZnQgKyA3IDwgKHNpemVvZihkZXYtPmRhdGEudGVzdGVyKSAqIDgpKSAmJgorCSAgICAgICAoZGV2LT5kYXRhLnBvcyA8IGRldi0+ZGF0YS5sZW4pKSB7CisJCWRldi0+ZGF0YS50ZXN0ZXIgKz0gKGRldi0+ZGF0YS5idWZmZXJbZGV2LT5kYXRhLnBvcysrXSA8PCBkZXYtPmRhdGEuYml0c19sZWZ0KTsKKwkJZGV2LT5kYXRhLmJpdHNfbGVmdCArPSA4OworCX0KKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFJvdXRpbmUgdGhhdCBoYW5kbGVzIGFsbCB0aGUgbG9naWMgbmVlZGVkIHRvIHBhcnNlIG91dCB0aGUgbWVzc2FnZSBmcm9tIHRoZSByZW1vdGUuCisgKi8KK3N0YXRpYyB2b2lkIGtleXNwYW5fY2hlY2tfZGF0YShzdHJ1Y3QgdXNiX2tleXNwYW4gKnJlbW90ZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3Qga2V5c3Bhbl9tZXNzYWdlIG1lc3NhZ2U7CisKKwlzd2l0Y2gocmVtb3RlLT5zdGFnZSkgeworCWNhc2UgMDoKKwkJLyoKKwkJICogSW4gc3RhZ2UgMCB3ZSB3YW50IHRvIGZpbmQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZS4gIFRoZSByZW1vdGUgc2VuZHMgYSAweEZGIGFzIGZpbGxlci4KKwkJICogU28gdGhlIGZpcnN0IGJ5dGUgdGhhdCBpc24ndCBhIEZGIHNob3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgbWVzc2FnZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBSRUNWX1NJWkUgJiYgcmVtb3RlLT5pbl9idWZmZXJbaV0gPT0gR0FQOyArK2kpOworCisJCWlmIChpIDwgUkVDVl9TSVpFKSB7CisJCQltZW1jcHkocmVtb3RlLT5kYXRhLmJ1ZmZlciwgcmVtb3RlLT5pbl9idWZmZXIsIFJFQ1ZfU0laRSk7CisJCQlyZW1vdGUtPmRhdGEubGVuID0gUkVDVl9TSVpFOworCQkJcmVtb3RlLT5kYXRhLnBvcyA9IDA7CisJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gMDsKKwkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgPSAwOworCQkJcmVtb3RlLT5zdGFnZSA9IDE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCS8qCisJCSAqIFN0YWdlIDEgd2Ugc2hvdWxkIGhhdmUgMTYgYnl0ZXMgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCBhCisJCSAqIFNZTkMuICBUaGUgU1lOQyBpcyAxNCBiaXRzLCA3IDAncyBhbmQgdGhlbiA3IDEncy4KKwkJICovCisJCW1lbWNweShyZW1vdGUtPmRhdGEuYnVmZmVyICsgcmVtb3RlLT5kYXRhLmxlbiwgcmVtb3RlLT5pbl9idWZmZXIsIFJFQ1ZfU0laRSk7CisJCXJlbW90ZS0+ZGF0YS5sZW4gKz0gUkVDVl9TSVpFOworCisJCWZvdW5kID0gMDsKKwkJd2hpbGUgKChyZW1vdGUtPmRhdGEuYml0c19sZWZ0ID49IDE0IHx8IHJlbW90ZS0+ZGF0YS5wb3MgPCByZW1vdGUtPmRhdGEubGVuKSAmJiAhZm91bmQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJCQlpZiAoa2V5c3Bhbl9sb2FkX3Rlc3RlcihyZW1vdGUsIDE0KSAhPSAwKSB7CisJCQkJCXJlbW90ZS0+c3RhZ2UgPSAwOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgU1lOQ19NQVNLKSA9PSBTWU5DKSB7CisJCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDE0OworCQkJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDE0OworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDE7CisJCQkJCS0tcmVtb3RlLT5kYXRhLmJpdHNfbGVmdDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlyZW1vdGUtPnN0YWdlID0gMDsKKwkJCXJlbW90ZS0+ZGF0YS5sZW4gPSAwOworCQl9IGVsc2UgeworCQkJcmVtb3RlLT5zdGFnZSA9IDI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8qCisJCSAqIFN0YWdlIDIgd2Ugc2hvdWxkIGhhdmUgMjQgYnl0ZXMgd2hpY2ggd2lsbCBiZSBlbm91Z2ggZm9yIGEgZnVsbAorCQkgKiBtZXNzYWdlLiAgV2UgbmVlZCB0byBwYXJzZSBvdXQgdGhlIHN5c3RlbSBjb2RlLCBidXR0b24gY29kZSwKKwkJICogdG9nZ2xlIGNvZGUsIGFuZCBzdG9wLgorCQkgKi8KKwkJbWVtY3B5KHJlbW90ZS0+ZGF0YS5idWZmZXIgKyByZW1vdGUtPmRhdGEubGVuLCByZW1vdGUtPmluX2J1ZmZlciwgUkVDVl9TSVpFKTsKKwkJcmVtb3RlLT5kYXRhLmxlbiArPSBSRUNWX1NJWkU7CisKKwkJbWVzc2FnZS5zeXN0ZW0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCQlrZXlzcGFuX2xvYWRfdGVzdGVyKHJlbW90ZSwgNik7CisKKwkJCWlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIFpFUk9fTUFTSykgPT0gWkVSTykgeworCQkJCW1lc3NhZ2Uuc3lzdGVtID0gbWVzc2FnZS5zeXN0ZW0gPDwgMTsKKwkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA1OworCQkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNTsKKwkJCX0gZWxzZSBpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBPTkVfTUFTSykgPT0gT05FKSB7CisJCQkJbWVzc2FnZS5zeXN0ZW0gPSAobWVzc2FnZS5zeXN0ZW0gPDwgMSkgKyAxOworCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDY7CisJCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA2OworCQkJfSBlbHNlIHsKKwkJCQllcnIoIiVzIC0gVW5rbm93biBzZXF1ZW5jZSBmb3VuZCBpbiBzeXN0ZW0gZGF0YS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmVtb3RlLT5zdGFnZSA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJbWVzc2FnZS5idXR0b24gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQlrZXlzcGFuX2xvYWRfdGVzdGVyKHJlbW90ZSwgNik7CisKKwkJCWlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIFpFUk9fTUFTSykgPT0gWkVSTykgeworCQkJCW1lc3NhZ2UuYnV0dG9uID0gbWVzc2FnZS5idXR0b24gPDwgMTsKKwkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA1OworCQkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNTsKKwkJCX0gZWxzZSBpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBPTkVfTUFTSykgPT0gT05FKSB7CisJCQkJbWVzc2FnZS5idXR0b24gPSAobWVzc2FnZS5idXR0b24gPDwgMSkgKyAxOworCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDY7CisJCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA2OworCQkJfSBlbHNlIHsKKwkJCQllcnIoIiVzIC0gVW5rbm93biBzZXF1ZW5jZSBmb3VuZCBpbiBidXR0b24gZGF0YS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmVtb3RlLT5zdGFnZSA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJa2V5c3Bhbl9sb2FkX3Rlc3RlcihyZW1vdGUsIDYpOworCQlpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBaRVJPX01BU0spID09IFpFUk8pIHsKKwkJCW1lc3NhZ2UudG9nZ2xlID0gMDsKKwkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDU7CisJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDU7CisJCX0gZWxzZSBpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBPTkVfTUFTSykgPT0gT05FKSB7CisJCQltZXNzYWdlLnRvZ2dsZSA9IDE7CisJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA2OworCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA2OworCQl9IGVsc2UgeworCQkJZXJyKCIlcyAtIEVycm9yIGluIG1lc3NhZ2UsIGludmFsaWQgdG9nZ2xlLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCisJCWtleXNwYW5fbG9hZF90ZXN0ZXIocmVtb3RlLCA1KTsKKwkJaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgU1RPUF9NQVNLKSA9PSBTVE9QKSB7CisJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA1OworCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA1OworCQl9IGVsc2UgeworCQkJZXJyKCJCYWQgbWVzc2FnZSByZWNpZXZlZCwgbm8gc3RvcCBiaXQgZm91bmQuXG4iKTsKKwkJfQorCisJCWRldl9kYmcoJnJlbW90ZS0+dWRldiwKKwkJCSIlcyBmb3VuZCB2YWxpZCBtZXNzYWdlOiBzeXN0ZW06ICVkLCBidXR0b246ICVkLCB0b2dnbGU6ICVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBtZXNzYWdlLnN5c3RlbSwgbWVzc2FnZS5idXR0b24sIG1lc3NhZ2UudG9nZ2xlKTsKKworCQlpZiAobWVzc2FnZS50b2dnbGUgIT0gcmVtb3RlLT50b2dnbGUpIHsKKwkJCWlucHV0X3JlZ3MoJnJlbW90ZS0+aW5wdXQsIHJlZ3MpOworCQkJaW5wdXRfcmVwb3J0X2tleSgmcmVtb3RlLT5pbnB1dCwga2V5c3Bhbl9rZXlfdGFibGVbbWVzc2FnZS5idXR0b25dLCAxKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoJnJlbW90ZS0+aW5wdXQsIGtleXNwYW5fa2V5X3RhYmxlW21lc3NhZ2UuYnV0dG9uXSwgMCk7CisJCQlpbnB1dF9zeW5jKCZyZW1vdGUtPmlucHV0KTsKKwkJCXJlbW90ZS0+dG9nZ2xlID0gbWVzc2FnZS50b2dnbGU7CisJCX0KKworCQlyZW1vdGUtPnN0YWdlID0gMDsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogUm91dGluZSBmb3Igc2VuZGluZyBhbGwgdGhlIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VzIHRvIHRoZSByZW1vdGUuCisgKi8KK3N0YXRpYyBpbnQga2V5c3Bhbl9zZXR1cChzdHJ1Y3QgdXNiX2RldmljZSogZGV2KQoreworCWludCByZXR2YWwgPSAwOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkJIDB4MTEsIDB4NDAsIDB4NTYwMSwgMHgwLCBOVUxMLCAwLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gc2V0IGJpdCByYXRlIGR1ZSB0byBlcnJvcjogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCXJldHVybihyZXR2YWwpOworCX0KKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSAweDQ0LCAweDQwLCAweDAsIDB4MCwgTlVMTCwgMCwgMCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHNldCByZXN1bWUgc2Vuc2l0aXZpdHkgZHVlIHRvIGVycm9yOiAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkJIDB4MjIsIDB4NDAsIDB4MCwgMHgwLCBOVUxMLCAwLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gdHVybiByZWNlaXZlIG9uIGR1ZSB0byBlcnJvcjogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCXJldHVybihyZXR2YWwpOworCX0KKworCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgLSBTZXR1cCBjb21wbGV0ZS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBSb3V0aW5lIHVzZWQgdG8gaGFuZGxlIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgY29tZSBpbi4KKyAqLworc3RhdGljIHZvaWQga2V5c3Bhbl9pcnFfcmVjdihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2Jfa2V5c3BhbiAqZGV2ID0gdXJiLT5jb250ZXh0OworCWludCByZXR2YWw7CisKKwkvKiBDaGVjayBvdXIgc3RhdHVzIGluIGNhc2Ugd2UgbmVlZCB0byBiYWlsIG91dCBlYXJseS4gKi8KKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKworCS8qIERldmljZSB3ZW50IGF3YXkgc28gZG9uJ3Qga2VlcCB0cnlpbmcgdG8gcmVhZCBmcm9tIGl0LiAqLworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJZ290byByZXN1Ym1pdDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRlYnVnKQorCQlrZXlzcGFuX3ByaW50KGRldik7CisKKwlrZXlzcGFuX2NoZWNrX2RhdGEoZGV2LCByZWdzKTsKKworcmVzdWJtaXQ6CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdDogJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQga2V5c3Bhbl9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2tleXNwYW4gKnJlbW90ZSA9IGRldi0+cHJpdmF0ZTsKKworCWlmIChyZW1vdGUtPm9wZW4rKykKKwkJcmV0dXJuIDA7CisKKwlyZW1vdGUtPmlycV91cmItPmRldiA9IHJlbW90ZS0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIocmVtb3RlLT5pcnFfdXJiLCBHRlBfS0VSTkVMKSkgeworCQlyZW1vdGUtPm9wZW4tLTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtleXNwYW5fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfa2V5c3BhbiAqcmVtb3RlID0gZGV2LT5wcml2YXRlOworCisJaWYgKCEtLXJlbW90ZS0+b3BlbikKKwkJdXNiX2tpbGxfdXJiKHJlbW90ZS0+aXJxX3VyYik7Cit9CisKKy8qCisgKiBSb3V0aW5lIHRoYXQgc2V0cyB1cCB0aGUgZHJpdmVyIHRvIGhhbmRsZSBhIHNwZWNpZmljIFVTQiBkZXZpY2UgZGV0ZWN0ZWQgb24gdGhlIGJ1cy4KKyAqLworc3RhdGljIGludCBrZXlzcGFuX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwljaGFyIHBhdGhbNjRdOworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgdXNiX2tleXNwYW4gKnJlbW90ZSA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKworCS8qIFNlZSBpZiB0aGUgb2ZmZXJlZCBkZXZpY2UgbWF0Y2hlcyB3aGF0IHdlIGNhbiBhY2NlcHQgKi8KKwlpZiAoKHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgIT0gVVNCX0tFWVNQQU5fVkVORE9SX0lEKSB8fAorCSAgICAodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gVVNCX0tFWVNQQU5fUFJPRFVDVF9VSUExMSkgKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworCXJlbW90ZSA9IGttYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVtb3RlID09IE5VTEwpIHsKKwkJZXJyKCJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJbWVtc2V0KHJlbW90ZSwgMHgwMCwgc2l6ZW9mKCpyZW1vdGUpKTsKKworCXJlbW90ZS0+dWRldiA9IHVkZXY7CisJcmVtb3RlLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisJcmVtb3RlLT50b2dnbGUgPSAtMTsJLyogU2V0IHRvIC0xIHNvIHdlIHdpbGwgYWx3YXlzIG5vdCBtYXRjaCB0aGUgdG9nZ2xlIGZyb20gdGhlIGZpcnN0IHJlbW90ZSBtZXNzYWdlLiAqLworCisJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLworCS8qIHVzZSBvbmx5IHRoZSBmaXJzdCBpbiBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAoIXJlbW90ZS0+aW5fZW5kcG9pbnQgJiYKKwkJICAgIChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICYmCisJCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgeworCQkJLyogd2UgZm91bmQgb3VyIGludGVycnVwdCBpbiBlbmRwb2ludCAqLworCQkJcmVtb3RlLT5pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCisJCQlyZW1vdGUtPmluX2J1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2MocmVtb3RlLT51ZGV2LCBSRUNWX1NJWkUsIFNMQUJfQVRPTUlDLCAmcmVtb3RlLT5pbl9kbWEpOworCQkJaWYgKCFyZW1vdGUtPmluX2J1ZmZlcikgeworCQkJCXJldHZhbCA9IC1FTk9NRU07CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCX0KKworCWlmICghcmVtb3RlLT5pbl9lbmRwb2ludCkgeworCQllcnIoIkNvdWxkIG5vdCBmaW5kIGludGVycnVwdCBpbnB1dCBlbmRwb2ludC5cbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCXJlbW90ZS0+aXJxX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZW1vdGUtPmlycV91cmIpIHsKKwkJZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgdXJiLlxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dmFsID0ga2V5c3Bhbl9zZXR1cChyZW1vdGUtPnVkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZXJyKCJGYWlsZWQgdG8gc2V0dXAgZGV2aWNlLlxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyoKKwkgKiBTZXR1cCB0aGUgaW5wdXQgc3lzdGVtIHdpdGggdGhlIGJpdHMgd2UgYXJlIGdvaW5nIHRvIGJlIHJlcG9ydGluZworCSAqLworCXJlbW90ZS0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsJCS8qIFdlIHdpbGwgb25seSByZXBvcnQgS0VZIGV2ZW50cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgeworCQlpZiAoa2V5c3Bhbl9rZXlfdGFibGVbaV0gIT0gS0VZX1JFU0VSVkVEKSB7CisJCQlzZXRfYml0KGtleXNwYW5fa2V5X3RhYmxlW2ldLCByZW1vdGUtPmlucHV0LmtleWJpdCk7CisJCX0KKwl9CisKKwlyZW1vdGUtPmlucHV0LnByaXZhdGUgPSByZW1vdGU7CisJcmVtb3RlLT5pbnB1dC5vcGVuID0ga2V5c3Bhbl9vcGVuOworCXJlbW90ZS0+aW5wdXQuY2xvc2UgPSBrZXlzcGFuX2Nsb3NlOworCisJdXNiX21ha2VfcGF0aChyZW1vdGUtPnVkZXYsIHBhdGgsIDY0KTsKKwlzcHJpbnRmKHJlbW90ZS0+cGh5cywgIiVzL2lucHV0MCIsIHBhdGgpOworCisJcmVtb3RlLT5pbnB1dC5uYW1lID0gcmVtb3RlLT5uYW1lOworCXJlbW90ZS0+aW5wdXQucGh5cyA9IHJlbW90ZS0+cGh5czsKKwlyZW1vdGUtPmlucHV0LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOworCXJlbW90ZS0+aW5wdXQuaWQudmVuZG9yID0gbGUxNl90b19jcHUocmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwlyZW1vdGUtPmlucHV0LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShyZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlyZW1vdGUtPmlucHV0LmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdShyZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKworCWlmICghKGJ1ZiA9IGttYWxsb2MoNjMsIEdGUF9LRVJORUwpKSkgeworCQl1c2JfYnVmZmVyX2ZyZWUocmVtb3RlLT51ZGV2LCBSRUNWX1NJWkUsIHJlbW90ZS0+aW5fYnVmZmVyLCByZW1vdGUtPmluX2RtYSk7CisJCWtmcmVlKHJlbW90ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChyZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaU1hbnVmYWN0dXJlciAmJgorCSAgICB1c2Jfc3RyaW5nKHJlbW90ZS0+dWRldiwgcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIsIGJ1ZiwgNjMpID4gMCkKKwkJc3RyY2F0KHJlbW90ZS0+bmFtZSwgYnVmKTsKKworCWlmIChyZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QgJiYKKwkgICAgdXNiX3N0cmluZyhyZW1vdGUtPnVkZXYsIHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pUHJvZHVjdCwgYnVmLCA2MykgPiAwKQorCQlzcHJpbnRmKHJlbW90ZS0+bmFtZSwgIiVzICVzIiwgcmVtb3RlLT5uYW1lLCBidWYpOworCisJaWYgKCFzdHJsZW4ocmVtb3RlLT5uYW1lKSkKKwkJc3ByaW50ZihyZW1vdGUtPm5hbWUsICJVU0IgS2V5c3BhbiBSZW1vdGUgJTA0eDolMDR4IiwKKwkJCXJlbW90ZS0+aW5wdXQuaWQudmVuZG9yLCByZW1vdGUtPmlucHV0LmlkLnByb2R1Y3QpOworCisJa2ZyZWUoYnVmKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVVJCIHRvIGFjY2VzcyB0aGUgZGV2aWNlLiBUaGUgdXJiIGdldHMgc2VudCB0byB0aGUgZGV2aWNlIGluIGtleXNwYW5fb3BlbigpCisJICovCisJdXNiX2ZpbGxfaW50X3VyYihyZW1vdGUtPmlycV91cmIsCisJCQkgcmVtb3RlLT51ZGV2LCB1c2JfcmN2aW50cGlwZShyZW1vdGUtPnVkZXYsIHJlbW90ZS0+aW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIHJlbW90ZS0+aW5fYnVmZmVyLCBSRUNWX1NJWkUsIGtleXNwYW5faXJxX3JlY3YsIHJlbW90ZSwKKwkJCSByZW1vdGUtPmluX2VuZHBvaW50LT5iSW50ZXJ2YWwpOworCXJlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZG1hID0gcmVtb3RlLT5pbl9kbWE7CisJcmVtb3RlLT5pcnFfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnJlbW90ZS0+aW5wdXQpOworCisJLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCByZW1vdGUpOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWluZm8oImNvbm5lY3RlZDogJXMgb24gJXMiLCByZW1vdGUtPm5hbWUsIHBhdGgpOworCXJldHVybiAwOworCitlcnJvcjoKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3Igd2UgbmVlZCB0byBjbGVhbiB1cCBhbnkgYWxsb2NhdGVkIGJ1ZmZlcnMKKwkgKi8KKwlpZiAocmVtb3RlLT5pcnFfdXJiKQorCQl1c2JfZnJlZV91cmIocmVtb3RlLT5pcnFfdXJiKTsKKworCWlmIChyZW1vdGUtPmluX2J1ZmZlcikKKwkJdXNiX2J1ZmZlcl9mcmVlKHJlbW90ZS0+dWRldiwgUkVDVl9TSVpFLCByZW1vdGUtPmluX2J1ZmZlciwgcmVtb3RlLT5pbl9kbWEpOworCisJaWYgKHJlbW90ZSkKKwkJa2ZyZWUocmVtb3RlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSb3V0aW5lIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBVU0IuCisgKi8KK3N0YXRpYyB2b2lkIGtleXNwYW5fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2Jfa2V5c3BhbiAqcmVtb3RlOworCisJLyogcHJldmVudCBrZXlzcGFuX29wZW4oKSBmcm9tIHJhY2luZyBrZXlzcGFuX2Rpc2Nvbm5lY3QoKSAqLworCWxvY2tfa2VybmVsKCk7CisKKwlyZW1vdGUgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJaWYgKHJlbW90ZSkgewkvKiBXZSBoYXZlIGEgdmFsaWQgZHJpdmVyIHN0cnVjdHVyZSBzbyBjbGVhbiB1cCBldmVyeXRoaW5nIHdlIGFsbG9jYXRlZC4gKi8KKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnJlbW90ZS0+aW5wdXQpOworCQl1c2Jfa2lsbF91cmIocmVtb3RlLT5pcnFfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHJlbW90ZS0+aXJxX3VyYik7CisJCXVzYl9idWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksIFJFQ1ZfU0laRSwgcmVtb3RlLT5pbl9idWZmZXIsIHJlbW90ZS0+aW5fZG1hKTsKKwkJa2ZyZWUocmVtb3RlKTsKKwl9CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpbmZvKCJVU0IgS2V5c3BhbiBub3cgZGlzY29ubmVjdGVkIik7Cit9CisKKy8qCisgKiBTdGFuZGFyZCBkcml2ZXIgc2V0IHVwIHNlY3Rpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBrZXlzcGFuX2RyaXZlciA9Cit7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJImtleXNwYW5fcmVtb3RlIiwKKwkucHJvYmUgPQlrZXlzcGFuX3Byb2JlLAorCS5kaXNjb25uZWN0ID0Ja2V5c3Bhbl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWtleXNwYW5fdGFibGUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9rZXlzcGFuX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3Rlcigma2V5c3Bhbl9kcml2ZXIpOworCWlmIChyZXN1bHQpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYl9rZXlzcGFuX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3Rlcigma2V5c3Bhbl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1c2Jfa2V5c3Bhbl9pbml0KTsKK21vZHVsZV9leGl0KHVzYl9rZXlzcGFuX2V4aXQpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwga2V5c3Bhbl90YWJsZSk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L210b3VjaHVzYi5jIGIvZHJpdmVycy91c2IvaW5wdXQvbXRvdWNodXNiLmMKaW5kZXggYWIxYTJhMy4uMDliNWNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvbXRvdWNodXNiLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvbXRvdWNodXNiLmMKQEAgLTQyLDkgKzQyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogI2lmZGVmIENPTkZJR19VU0JfREVCVUcKLSAgICAgICAgI2RlZmluZSBERUJVRworCSNkZWZpbmUgREVCVUcKICNlbHNlCi0gICAgICAgICN1bmRlZiBERUJVRworCSN1bmRlZiBERUJVRwogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTkzLDI3NSArOTMsMjU1IEBACiBNT0RVTEVfUEFSTV9ERVNDKHJhd19jb29yZGluYXRlcywgInJlcG9ydCByYXcgY29vcmRpbmF0ZSB2YWx1ZXMgKHksIGRlZmF1bHQpIG9yIGhhcmR3YXJlLWNhbGlicmF0ZWQgY29vcmRpbmF0ZSB2YWx1ZXMgKG4pIik7CiAKIHN0cnVjdCBtdG91Y2hfdXNiIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgICAgZG1hX2FkZHJfdCBkYXRhX2RtYTsKLSAgICAgICAgc3RydWN0IHVyYiAqaXJxOwotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLSAgICAgICAgc3RydWN0IGlucHV0X2RldiBpbnB1dDsKLSAgICAgICAgaW50IG9wZW47Ci0gICAgICAgIGNoYXIgbmFtZVsxMjhdOwotICAgICAgICBjaGFyIHBoeXNbNjRdOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJZG1hX2FkZHJfdCBkYXRhX2RtYTsKKwlzdHJ1Y3QgdXJiICppcnE7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOwogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG10b3VjaHVzYl9kZXZpY2VzIFtdID0gewotICAgICAgICB7IFVTQl9ERVZJQ0UoMHgwNTk2LCAweDAwMDEpIH0sCi0gICAgICAgIHsgfQorc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG10b3VjaHVzYl9kZXZpY2VzW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDU5NiwgMHgwMDAxKSB9LAorCXsgfQogfTsKIAogc3RhdGljIHZvaWQgbXRvdWNodXNiX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotICAgICAgICBzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoID0gdXJiLT5jb250ZXh0OwotICAgICAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSB1cmItPmNvbnRleHQ7CisJaW50IHJldHZhbDsKIAotICAgICAgICBzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtRVRJTUVET1VUOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyB1cmIgaXMgdGltaW5nIG91dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZGJnKCIlcyAtIHVyYiB0aW1lZCBvdXQgLSB3YXMgdGhlIGRldmljZSB1bnBsdWdnZWQ/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgLUVDT05OUkVTRVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSAtRU5PRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgLUVTSFVURE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9CisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FVElNRURPVVQ6CisJCS8qIHRoaXMgdXJiIGlzIHRpbWluZyBvdXQgKi8KKwkJZGJnKCIlcyAtIHVyYiB0aW1lZCBvdXQgLSB3YXMgdGhlIGRldmljZSB1bnBsdWdnZWQ/IiwKKwkJICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAorCQkgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZ290byBleGl0OworCX0KIAotICAgICAgICBpbnB1dF9yZWdzKCZtdG91Y2gtPmlucHV0LCByZWdzKTsKLSAgICAgICAgaW5wdXRfcmVwb3J0X2tleSgmbXRvdWNoLT5pbnB1dCwgQlROX1RPVUNILAotICAgICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9HRVRfVE9VQ0hFRChtdG91Y2gtPmRhdGEpKTsKLSAgICAgICAgaW5wdXRfcmVwb3J0X2FicygmbXRvdWNoLT5pbnB1dCwgQUJTX1gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTVRPVUNIVVNCX0dFVF9YQyhtdG91Y2gtPmRhdGEpKTsKLSAgICAgICAgaW5wdXRfcmVwb3J0X2FicygmbXRvdWNoLT5pbnB1dCwgQUJTX1ksCisJaW5wdXRfcmVncygmbXRvdWNoLT5pbnB1dCwgcmVncyk7CisJaW5wdXRfcmVwb3J0X2tleSgmbXRvdWNoLT5pbnB1dCwgQlROX1RPVUNILAorCQkJIE1UT1VDSFVTQl9HRVRfVE9VQ0hFRChtdG91Y2gtPmRhdGEpKTsKKwlpbnB1dF9yZXBvcnRfYWJzKCZtdG91Y2gtPmlucHV0LCBBQlNfWCwgTVRPVUNIVVNCX0dFVF9YQyhtdG91Y2gtPmRhdGEpKTsKKwlpbnB1dF9yZXBvcnRfYWJzKCZtdG91Y2gtPmlucHV0LCBBQlNfWSwKIAkJCSAocmF3X2Nvb3JkaW5hdGVzID8gTVRPVUNIVVNCX01BWF9SQVdfWUMgOiBNVE9VQ0hVU0JfTUFYX0NBTElCX1lDKQotICAgICAgICAgICAgICAgICAgICAgICAgIC0gTVRPVUNIVVNCX0dFVF9ZQyhtdG91Y2gtPmRhdGEpKTsKLSAgICAgICAgaW5wdXRfc3luYygmbXRvdWNoLT5pbnB1dCk7CisJCQkgLSBNVE9VQ0hVU0JfR0VUX1lDKG10b3VjaC0+ZGF0YSkpOworCWlucHV0X3N5bmMoJm10b3VjaC0+aW5wdXQpOwogCiBleGl0OgotICAgICAgICByZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICBlcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdDogJWQiLAorCQkgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOwogfQogCi1zdGF0aWMgaW50IG10b3VjaHVzYl9vcGVuIChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3N0YXRpYyBpbnQgbXRvdWNodXNiX29wZW4oc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCiB7Ci0gICAgICAgIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSBpbnB1dC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoID0gaW5wdXQtPnByaXZhdGU7CiAKLSAgICAgICAgaWYgKG10b3VjaC0+b3BlbisrKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworCW10b3VjaC0+aXJxLT5kZXYgPSBtdG91Y2gtPnVkZXY7CiAKLSAgICAgICAgbXRvdWNoLT5pcnEtPmRldiA9IG10b3VjaC0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIobXRvdWNoLT5pcnEsIEdGUF9BVE9NSUMpKQorCQlyZXR1cm4gLUVJTzsKIAotICAgICAgICBpZiAodXNiX3N1Ym1pdF91cmIgKG10b3VjaC0+aXJxLCBHRlBfQVRPTUlDKSkgewotICAgICAgICAgICAgICAgIG10b3VjaC0+b3Blbi0tOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG10b3VjaHVzYl9jbG9zZSAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCitzdGF0aWMgdm9pZCBtdG91Y2h1c2JfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCiB7Ci0gICAgICAgIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSBpbnB1dC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoID0gaW5wdXQtPnByaXZhdGU7CiAKLSAgICAgICAgaWYgKCEtLW10b3VjaC0+b3BlbikKLSAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIgKG10b3VjaC0+aXJxKTsKKwl1c2Jfa2lsbF91cmIobXRvdWNoLT5pcnEpOwogfQogCiBzdGF0aWMgaW50IG10b3VjaHVzYl9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoKQogewotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBtdG91Y2gtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMQUJfQVRPTUlDLCAmbXRvdWNoLT5kYXRhX2RtYSk7CisJbXRvdWNoLT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBNVE9VQ0hVU0JfUkVQT1JUX0RBVEFfU0laRSwKKwkJCQkJU0xBQl9BVE9NSUMsICZtdG91Y2gtPmRhdGFfZG1hKTsKIAotICAgICAgICBpZiAoIW10b3VjaC0+ZGF0YSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFtdG91Y2gtPmRhdGEpCisJCXJldHVybiAtMTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbXRvdWNodXNiX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IG10b3VjaF91c2IgKm10b3VjaCkKIHsKLSAgICAgICAgZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgICAgICAgaWYgKG10b3VjaC0+ZGF0YSkKLSAgICAgICAgICAgICAgICB1c2JfYnVmZmVyX2ZyZWUodWRldiwgTVRPVUNIVVNCX1JFUE9SVF9EQVRBX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10b3VjaC0+ZGF0YSwgbXRvdWNoLT5kYXRhX2RtYSk7CisJaWYgKG10b3VjaC0+ZGF0YSkKKwkJdXNiX2J1ZmZlcl9mcmVlKHVkZXYsIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAorCQkJCW10b3VjaC0+ZGF0YSwgbXRvdWNoLT5kYXRhX2RtYSk7CiB9CiAKIHN0YXRpYyBpbnQgbXRvdWNodXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0gICAgICAgIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2g7Ci0gICAgICAgIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKLSAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKLSAgICAgICAgY2hhciBwYXRoWzY0XTsKLSAgICAgICAgaW50IG5SZXQ7CisJc3RydWN0IG10b3VjaF91c2IgKm10b3VjaDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJY2hhciBwYXRoWzY0XTsKKwlpbnQgblJldDsKIAotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBkYmcoIiVzIC0gc2V0dGluZyBpbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlkYmcoIiVzIC0gc2V0dGluZyBpbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCi0gICAgICAgIGRiZygiJXMgLSBzZXR0aW5nIGVuZHBvaW50IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOworCWRiZygiJXMgLSBzZXR0aW5nIGVuZHBvaW50IiwgX19GVU5DVElPTl9fKTsKKwllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CiAKLSAgICAgICAgaWYgKCEobXRvdWNoID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbXRvdWNoX3VzYiksIEdGUF9LRVJORUwpKSkgewotICAgICAgICAgICAgICAgIGVycigiJXMgLSBPdXQgb2YgbWVtb3J5LiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KKwlpZiAoIShtdG91Y2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRvdWNoX3VzYiksIEdGUF9LRVJORUwpKSkgeworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeS4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLSAgICAgICAgbWVtc2V0KG10b3VjaCwgMCwgc2l6ZW9mKHN0cnVjdCBtdG91Y2hfdXNiKSk7Ci0gICAgICAgIG10b3VjaC0+dWRldiA9IHVkZXY7CisJbWVtc2V0KG10b3VjaCwgMCwgc2l6ZW9mKHN0cnVjdCBtdG91Y2hfdXNiKSk7CisJbXRvdWNoLT51ZGV2ID0gdWRldjsKIAotICAgICAgICBkYmcoIiVzIC0gYWxsb2NhdGluZyBidWZmZXJzIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgaWYgKG10b3VjaHVzYl9hbGxvY19idWZmZXJzKHVkZXYsIG10b3VjaCkpIHsKLSAgICAgICAgICAgICAgICBtdG91Y2h1c2JfZnJlZV9idWZmZXJzKHVkZXYsIG10b3VjaCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUobXRvdWNoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQorCWRiZygiJXMgLSBhbGxvY2F0aW5nIGJ1ZmZlcnMiLCBfX0ZVTkNUSU9OX18pOworCWlmIChtdG91Y2h1c2JfYWxsb2NfYnVmZmVycyh1ZGV2LCBtdG91Y2gpKSB7CisJCW10b3VjaHVzYl9mcmVlX2J1ZmZlcnModWRldiwgbXRvdWNoKTsKKwkJa2ZyZWUobXRvdWNoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0gICAgICAgIG10b3VjaC0+aW5wdXQucHJpdmF0ZSA9IG10b3VjaDsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5vcGVuID0gbXRvdWNodXNiX29wZW47Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuY2xvc2UgPSBtdG91Y2h1c2JfY2xvc2U7CisJbXRvdWNoLT5pbnB1dC5wcml2YXRlID0gbXRvdWNoOworCW10b3VjaC0+aW5wdXQub3BlbiA9IG10b3VjaHVzYl9vcGVuOworCW10b3VjaC0+aW5wdXQuY2xvc2UgPSBtdG91Y2h1c2JfY2xvc2U7CiAKLSAgICAgICAgdXNiX21ha2VfcGF0aCh1ZGV2LCBwYXRoLCA2NCk7Ci0gICAgICAgIHNwcmludGYobXRvdWNoLT5waHlzLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisJdXNiX21ha2VfcGF0aCh1ZGV2LCBwYXRoLCA2NCk7CisJc3ByaW50ZihtdG91Y2gtPnBoeXMsICIlcy9pbnB1dDAiLCBwYXRoKTsKIAotICAgICAgICBtdG91Y2gtPmlucHV0Lm5hbWUgPSBtdG91Y2gtPm5hbWU7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQucGh5cyA9IG10b3VjaC0+cGh5czsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5pZC5idXN0eXBlID0gQlVTX1VTQjsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotICAgICAgICBtdG91Y2gtPmlucHV0LmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuZGV2ID0gJmludGYtPmRldjsKKwltdG91Y2gtPmlucHV0Lm5hbWUgPSBtdG91Y2gtPm5hbWU7CisJbXRvdWNoLT5pbnB1dC5waHlzID0gbXRvdWNoLT5waHlzOworCW10b3VjaC0+aW5wdXQuaWQuYnVzdHlwZSA9IEJVU19VU0I7CisJbXRvdWNoLT5pbnB1dC5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwltdG91Y2gtPmlucHV0LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJbXRvdWNoLT5pbnB1dC5pZC52ZXJzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCW10b3VjaC0+aW5wdXQuZGV2ID0gJmludGYtPmRldjsKIAotICAgICAgICBtdG91Y2gtPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNiaXRbMF0gPSBCSVQoQUJTX1gpIHwgQklUKEFCU19ZKTsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5rZXliaXRbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpOworCW10b3VjaC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCW10b3VjaC0+aW5wdXQuYWJzYml0WzBdID0gQklUKEFCU19YKSB8IEJJVChBQlNfWSk7CisJbXRvdWNoLT5pbnB1dC5rZXliaXRbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpOwogCi0gICAgICAgIC8qIFVzZWQgdG8gU2NhbGUgQ29tcGVuc2F0ZWQgRGF0YSBhbmQgRmxpcCBZICovCi0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzbWluW0FCU19YXSA9ICBNVE9VQ0hVU0JfTUlOX1hDOwotICAgICAgICBtdG91Y2gtPmlucHV0LmFic21heFtBQlNfWF0gPSAgcmF3X2Nvb3JkaW5hdGVzID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPVUNIVVNCX01BWF9SQVdfWEMgOiBNVE9VQ0hVU0JfTUFYX0NBTElCX1hDOwotICAgICAgICBtdG91Y2gtPmlucHV0LmFic2Z1enpbQUJTX1hdID0gTVRPVUNIVVNCX1hDX0ZVWlo7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzZmxhdFtBQlNfWF0gPSBNVE9VQ0hVU0JfWENfRkxBVDsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNtaW5bQUJTX1ldID0gIE1UT1VDSFVTQl9NSU5fWUM7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzbWF4W0FCU19ZXSA9ICByYXdfY29vcmRpbmF0ZXMgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9VQ0hVU0JfTUFYX1JBV19ZQyA6IE1UT1VDSFVTQl9NQVhfQ0FMSUJfWUM7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzZnV6eltBQlNfWV0gPSBNVE9VQ0hVU0JfWUNfRlVaWjsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNmbGF0W0FCU19ZXSA9IE1UT1VDSFVTQl9ZQ19GTEFUOworCS8qIFVzZWQgdG8gU2NhbGUgQ29tcGVuc2F0ZWQgRGF0YSBhbmQgRmxpcCBZICovCisJbXRvdWNoLT5pbnB1dC5hYnNtaW5bQUJTX1hdID0gTVRPVUNIVVNCX01JTl9YQzsKKwltdG91Y2gtPmlucHV0LmFic21heFtBQlNfWF0gPSByYXdfY29vcmRpbmF0ZXMgPworCQkJCQlNVE9VQ0hVU0JfTUFYX1JBV19YQyA6IE1UT1VDSFVTQl9NQVhfQ0FMSUJfWEM7CisJbXRvdWNoLT5pbnB1dC5hYnNmdXp6W0FCU19YXSA9IE1UT1VDSFVTQl9YQ19GVVpaOworCW10b3VjaC0+aW5wdXQuYWJzZmxhdFtBQlNfWF0gPSBNVE9VQ0hVU0JfWENfRkxBVDsKKwltdG91Y2gtPmlucHV0LmFic21pbltBQlNfWV0gPSBNVE9VQ0hVU0JfTUlOX1lDOworCW10b3VjaC0+aW5wdXQuYWJzbWF4W0FCU19ZXSA9IHJhd19jb29yZGluYXRlcyA/CisJCQkJCU1UT1VDSFVTQl9NQVhfUkFXX1lDIDogTVRPVUNIVVNCX01BWF9DQUxJQl9ZQzsKKwltdG91Y2gtPmlucHV0LmFic2Z1enpbQUJTX1ldID0gTVRPVUNIVVNCX1lDX0ZVWlo7CisJbXRvdWNoLT5pbnB1dC5hYnNmbGF0W0FCU19ZXSA9IE1UT1VDSFVTQl9ZQ19GTEFUOwogCiAJaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikKIAkJc3RyY2F0KG10b3VjaC0+bmFtZSwgdWRldi0+bWFudWZhY3R1cmVyKTsKIAlpZiAodWRldi0+cHJvZHVjdCkKIAkJc3ByaW50ZihtdG91Y2gtPm5hbWUsICIlcyAlcyIsIG10b3VjaC0+bmFtZSwgdWRldi0+cHJvZHVjdCk7CiAKLSAgICAgICAgaWYgKCFzdHJsZW4obXRvdWNoLT5uYW1lKSkKLSAgICAgICAgICAgICAgICBzcHJpbnRmKG10b3VjaC0+bmFtZSwgIlVTQiBUb3VjaHNjcmVlbiAlMDR4OiUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbXRvdWNoLT5pbnB1dC5pZC52ZW5kb3IsIG10b3VjaC0+aW5wdXQuaWQucHJvZHVjdCk7CisJaWYgKCFzdHJsZW4obXRvdWNoLT5uYW1lKSkKKwkJc3ByaW50ZihtdG91Y2gtPm5hbWUsICJVU0IgVG91Y2hzY3JlZW4gJTA0eDolMDR4IiwKKwkJCW10b3VjaC0+aW5wdXQuaWQudmVuZG9yLCBtdG91Y2gtPmlucHV0LmlkLnByb2R1Y3QpOwogCi0gICAgICAgIG5SZXQgPSB1c2JfY29udHJvbF9tc2cobXRvdWNoLT51ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9VQ0hVU0JfUkVTRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwotICAgICAgICBkYmcoIiVzIC0gdXNiX2NvbnRyb2xfbXNnIC0gTVRPVUNIVVNCX1JFU0VUIC0gYnl0ZXN8ZXJyOiAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5SZXQpOworCW5SZXQgPSB1c2JfY29udHJvbF9tc2cobXRvdWNoLT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgTVRPVUNIVVNCX1JFU0VULAorCQkJICAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgICAxLCAwLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJZGJnKCIlcyAtIHVzYl9jb250cm9sX21zZyAtIE1UT1VDSFVTQl9SRVNFVCAtIGJ5dGVzfGVycjogJWQiLAorCSAgICBfX0ZVTkNUSU9OX18sIG5SZXQpOwogCi0gICAgICAgIGRiZygiJXMgLSB1c2JfYWxsb2NfdXJiOiBtdG91Y2gtPmlycSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG10b3VjaC0+aXJxID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKCFtdG91Y2gtPmlycSkgewotICAgICAgICAgICAgICAgIGRiZygiJXMgLSB1c2JfYWxsb2NfdXJiIGZhaWxlZDogbXRvdWNoLT5pcnEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIG10b3VjaHVzYl9mcmVlX2J1ZmZlcnModWRldiwgbXRvdWNoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShtdG91Y2gpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9CisJZGJnKCIlcyAtIHVzYl9hbGxvY191cmI6IG10b3VjaC0+aXJxIiwgX19GVU5DVElPTl9fKTsKKwltdG91Y2gtPmlycSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdG91Y2gtPmlycSkgeworCQlkYmcoIiVzIC0gdXNiX2FsbG9jX3VyYiBmYWlsZWQ6IG10b3VjaC0+aXJxIiwgX19GVU5DVElPTl9fKTsKKwkJbXRvdWNodXNiX2ZyZWVfYnVmZmVycyh1ZGV2LCBtdG91Y2gpOworCQlrZnJlZShtdG91Y2gpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLSAgICAgICAgZGJnKCIlcyAtIHVzYl9maWxsX2ludF91cmIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICB1c2JfZmlsbF9pbnRfdXJiKG10b3VjaC0+aXJxLAotICAgICAgICAgICAgICAgICAgICAgICAgIG10b3VjaC0+dWRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcmN2aW50cGlwZShtdG91Y2gtPnVkZXYsIDB4ODEpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG10b3VjaC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNVE9VQ0hVU0JfUkVQT1JUX0RBVEFfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtdG91Y2h1c2JfaXJxLAotICAgICAgICAgICAgICAgICAgICAgICAgIG10b3VjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC0+YkludGVydmFsKTsKKwlkYmcoIiVzIC0gdXNiX2ZpbGxfaW50X3VyYiIsIF9fRlVOQ1RJT05fXyk7CisJdXNiX2ZpbGxfaW50X3VyYihtdG91Y2gtPmlycSwgbXRvdWNoLT51ZGV2LAorCQkJIHVzYl9yY3ZpbnRwaXBlKG10b3VjaC0+dWRldiwgMHg4MSksCisJCQkgbXRvdWNoLT5kYXRhLCBNVE9VQ0hVU0JfUkVQT1JUX0RBVEFfU0laRSwKKwkJCSBtdG91Y2h1c2JfaXJxLCBtdG91Y2gsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwogCi0gICAgICAgIGRiZygiJXMgLSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJm10b3VjaC0+aW5wdXQpOworCWRiZygiJXMgLSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmbXRvdWNoLT5pbnB1dCk7CiAKLSAgICAgICAgblJldCA9IHVzYl9jb250cm9sX21zZyhtdG91Y2gtPnVkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9BU1lOQ19SRVBPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwotICAgICAgICBkYmcoIiVzIC0gdXNiX2NvbnRyb2xfbXNnIC0gTVRPVUNIVVNCX0FTWU5DX1JFUE9SVCAtIGJ5dGVzfGVycjogJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuUmV0KTsKKwluUmV0ID0gdXNiX2NvbnRyb2xfbXNnKG10b3VjaC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIE1UT1VDSFVTQl9BU1lOQ19SRVBPUlQsCisJCQkgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgIDEsIDEsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlkYmcoIiVzIC0gdXNiX2NvbnRyb2xfbXNnIC0gTVRPVUNIVVNCX0FTWU5DX1JFUE9SVCAtIGJ5dGVzfGVycjogJWQiLAorCSAgICBfX0ZVTkNUSU9OX18sIG5SZXQpOwogCi0gICAgICAgIHByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBvbiAlc1xuIiwgbXRvdWNoLT5uYW1lLCBwYXRoKTsKLSAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRmLCBtdG91Y2gpOworCXByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBvbiAlc1xuIiwgbXRvdWNoLT5uYW1lLCBwYXRoKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIG10b3VjaCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG10b3VjaHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotICAgICAgICBzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IG10b3VjaF91c2IgKm10b3VjaCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLSAgICAgICAgZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0gICAgICAgIGlmIChtdG91Y2gpIHsKLSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gbXRvdWNoIGlzIGluaXRpYWxpemVkLCBjbGVhbmluZyB1cCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgdXNiX2tpbGxfdXJiKG10b3VjaC0+aXJxKTsKLSAgICAgICAgICAgICAgICBpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmbXRvdWNoLT5pbnB1dCk7Ci0gICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG10b3VjaC0+aXJxKTsKLSAgICAgICAgICAgICAgICBtdG91Y2h1c2JfZnJlZV9idWZmZXJzKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIG10b3VjaCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUobXRvdWNoKTsKLSAgICAgICAgfQorCWRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJaWYgKG10b3VjaCkgeworCQlkYmcoIiVzIC0gbXRvdWNoIGlzIGluaXRpYWxpemVkLCBjbGVhbmluZyB1cCIsIF9fRlVOQ1RJT05fXyk7CisJCXVzYl9raWxsX3VyYihtdG91Y2gtPmlycSk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZtdG91Y2gtPmlucHV0KTsKKwkJdXNiX2ZyZWVfdXJiKG10b3VjaC0+aXJxKTsKKwkJbXRvdWNodXNiX2ZyZWVfYnVmZmVycyhpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCBtdG91Y2gpOworCQlrZnJlZShtdG91Y2gpOworCX0KIH0KIAotTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBtdG91Y2h1c2JfZGV2aWNlcyk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgbXRvdWNodXNiX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbXRvdWNodXNiX2RyaXZlciA9IHsKLSAgICAgICAgLm93bmVyID0gICAgICBUSElTX01PRFVMRSwKLSAgICAgICAgLm5hbWUgPSAgICAgICAibXRvdWNodXNiIiwKLSAgICAgICAgLnByb2JlID0gICAgICBtdG91Y2h1c2JfcHJvYmUsCi0gICAgICAgIC5kaXNjb25uZWN0ID0gbXRvdWNodXNiX2Rpc2Nvbm5lY3QsCi0gICAgICAgIC5pZF90YWJsZSA9ICAgbXRvdWNodXNiX2RldmljZXMsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtdG91Y2h1c2IiLAorCS5wcm9iZQkJPSBtdG91Y2h1c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBtdG91Y2h1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBtdG91Y2h1c2JfZGV2aWNlcywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG10b3VjaHVzYl9pbml0KHZvaWQpIHsKLSAgICAgICAgZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiB1c2JfcmVnaXN0ZXIoJm10b3VjaHVzYl9kcml2ZXIpOworc3RhdGljIGludCBfX2luaXQgbXRvdWNodXNiX2luaXQodm9pZCkKK3sKKwlkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZtdG91Y2h1c2JfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG10b3VjaHVzYl9jbGVhbnVwKHZvaWQpIHsKLSAgICAgICAgZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHVzYl9kZXJlZ2lzdGVyKCZtdG91Y2h1c2JfZHJpdmVyKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdG91Y2h1c2JfY2xlYW51cCh2b2lkKQoreworCWRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworCXVzYl9kZXJlZ2lzdGVyKCZtdG91Y2h1c2JfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobXRvdWNodXNiX2luaXQpOwogbW9kdWxlX2V4aXQobXRvdWNodXNiX2NsZWFudXApOwogCi1NT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3Bvd2VybWF0ZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMKaW5kZXggN2ZhMmY5Yi4uMzk3NWIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIGJhY2sgdG8gdGhlIGhvc3Qgd2hlbiBwb2xsZWQgYnkgdGhlIFVTQiBjb250cm9sbGVyLgogICoKICAqIFRlc3Rpbmcgd2l0aCB0aGUga25vYiBJIGhhdmUgaGFzIHNob3duIHRoYXQgaXQgbWVhc3VyZXMgYXBwcm94aW1hdGVseSA5NCAiY2xpY2tzIgotICogZm9yIG9uZSBmdWxsIHJvdGF0aW9uLiBUZXN0aW5nIHdpdGggbXkgSGlnaCBTcGVlZCBSb3RhdGlvbiBBY3R1YXRvciAob2ssIGl0IHdhcyAKKyAqIGZvciBvbmUgZnVsbCByb3RhdGlvbi4gVGVzdGluZyB3aXRoIG15IEhpZ2ggU3BlZWQgUm90YXRpb24gQWN0dWF0b3IgKG9rLCBpdCB3YXMKICAqIGEgdmFyaWFibGUgc3BlZWQgY29yZGxlc3MgZWxlY3RyaWMgZHJpbGwpIGhhcyBzaG93biB0aGF0IHRoZSBkZXZpY2UgY2FuIG1lYXN1cmUKICAqIHNwZWVkcyBvZiB1cCB0byA3IGNsaWNrcyBlaXRoZXIgY2xvY2t3aXNlIG9yIGFudGljbG9ja3dpc2UgYmV0d2VlbiBwb2xsaW5ncyBmcm9tCiAgKiB0aGUgaG9zdC4gSWYgaXQgY291bnRzIG1vcmUgdGhhbiA3IGNsaWNrcyBiZWZvcmUgaXQgaXMgcG9sbGVkLCBpdCB3aWxsIHdyYXAgYmFjawpAQCAtMTIwLDkgKzEyMCw5IEBACiAvKiBEZWNpZGUgaWYgd2UgbmVlZCB0byBpc3N1ZSBhIGNvbnRyb2wgbWVzc2FnZSBhbmQgZG8gc28uIE11c3QgYmUgY2FsbGVkIHdpdGggcG0tPmxvY2sgdGFrZW4gKi8KIHN0YXRpYyB2b2lkIHBvd2VybWF0ZV9zeW5jX3N0YXRlKHN0cnVjdCBwb3dlcm1hdGVfZGV2aWNlICpwbSkKIHsKLQlpZiAocG0tPnJlcXVpcmVzX3VwZGF0ZSA9PSAwKSAKKwlpZiAocG0tPnJlcXVpcmVzX3VwZGF0ZSA9PSAwKQogCQlyZXR1cm47IC8qIG5vIHVwZGF0ZXMgYXJlIHJlcXVpcmVkICovCi0JaWYgKHBtLT5jb25maWctPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIAorCWlmIChwbS0+Y29uZmlnLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQogCQlyZXR1cm47IC8qIGFuIHVwZGF0ZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzOyBpdCdsbCBpc3N1ZSB0aGlzIHVwZGF0ZSB3aGVuIGl0IGNvbXBsZXRlcyAqLwogCiAJaWYgKHBtLT5yZXF1aXJlc191cGRhdGUgJiBVUERBVEVfUFVMU0VfQVNMRUVQKXsKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQkgICAyOiBtdWx0aXBseSB0aGUgc3BlZWQKIAkJICAgdGhlIGFyZ3VtZW50IG9ubHkgaGFzIGFuIGVmZmVjdCBmb3Igb3BlcmF0aW9ucyAwIGFuZCAyLCBhbmQgcmFuZ2VzIGJldHdlZW4KIAkJICAgMSAobGVhc3QgZWZmZWN0KSB0byAyNTUgKG1heGltdW0gZWZmZWN0KS4KLSAgICAgICAKKwogCQkgICB0aHVzLCBzZXZlcmFsIHN0YXRlcyBhcmUgZXF1aXZhbGVudCBhbmQgYXJlIGNvYWxlc2NlZCBpbnRvIG9uZSBzdGF0ZS4KIAogCQkgICB3ZSBtYXAgdGhpcyBvbnRvIGEgcmFuZ2UgZnJvbSAwIHRvIDUxMCwgd2l0aDoKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQkgICAyNTYgLS0gNTEwICAtLSB1c2UgbXVsdGlwbGUgKDUxMCA9IGZhc3Rlc3QpLgogCiAJCSAgIE9ubHkgdmFsdWVzIG9mICdhcmcnIHF1aXRlIGNsb3NlIHRvIDI1NSBhcmUgcGFydGljdWxhcmx5IHVzZWZ1bC9zcGVjdGFjdWxhci4KLQkJKi8gICAgCisJCSovCiAJCWlmIChwbS0+cHVsc2Vfc3BlZWQgPCAyNTUpewogCQkJb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBkaXZpZGUKIAkJCWFyZyA9IDI1NSAtIHBtLT5wdWxzZV9zcGVlZDsKQEAgLTE5OSwxNCArMTk5LDE0IEBACiAKIAlpZiAodXJiLT5zdGF0dXMpCiAJCXByaW50ayhLRVJOX0VSUiAicG93ZXJtYXRlOiBjb25maWcgdXJiIHJldHVybmVkICVkXG4iLCB1cmItPnN0YXR1cyk7Ci0JCisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG0tPmxvY2ssIGZsYWdzKTsKIAlwb3dlcm1hdGVfc3luY19zdGF0ZShwbSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG0tPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogU2V0IHRoZSBMRUQgdXAgYXMgZGVzY3JpYmVkIGFuZCBiZWdpbiB0aGUgc3luYyB3aXRoIHRoZSBoYXJkd2FyZSBpZiByZXF1aXJlZCAqLwotc3RhdGljIHZvaWQgcG93ZXJtYXRlX3B1bHNlX2xlZChzdHJ1Y3QgcG93ZXJtYXRlX2RldmljZSAqcG0sIGludCBzdGF0aWNfYnJpZ2h0bmVzcywgaW50IHB1bHNlX3NwZWVkLCAKK3N0YXRpYyB2b2lkIHBvd2VybWF0ZV9wdWxzZV9sZWQoc3RydWN0IHBvd2VybWF0ZV9kZXZpY2UgKnBtLCBpbnQgc3RhdGljX2JyaWdodG5lc3MsIGludCBwdWxzZV9zcGVlZCwKIAkJCQlpbnQgcHVsc2VfdGFibGUsIGludCBwdWxzZV9hc2xlZXAsIGludCBwdWxzZV9hd2FrZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJLyogbWFyayBzdGF0ZSB1cGRhdGVzIHdoaWNoIGFyZSByZXF1aXJlZCAqLwogCWlmIChzdGF0aWNfYnJpZ2h0bmVzcyAhPSBwbS0+c3RhdGljX2JyaWdodG5lc3MpewogCQlwbS0+c3RhdGljX2JyaWdodG5lc3MgPSBzdGF0aWNfYnJpZ2h0bmVzczsKLQkJcG0tPnJlcXVpcmVzX3VwZGF0ZSB8PSBVUERBVEVfU1RBVElDX0JSSUdIVE5FU1M7CQkKKwkJcG0tPnJlcXVpcmVzX3VwZGF0ZSB8PSBVUERBVEVfU1RBVElDX0JSSUdIVE5FU1M7CiAJfQogCWlmIChwdWxzZV9hc2xlZXAgIT0gcG0tPnB1bHNlX2FzbGVlcCl7CiAJCXBtLT5wdWxzZV9hc2xlZXAgPSBwdWxzZV9hc2xlZXA7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAl9CiAKIAlwb3dlcm1hdGVfc3luY19zdGF0ZShwbSk7Ci0gICAKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTI1NywxOSArMjU3LDE5IEBACiAJc3RydWN0IHBvd2VybWF0ZV9kZXZpY2UgKnBtID0gZGV2LT5wcml2YXRlOwogCiAJaWYgKHR5cGUgPT0gRVZfTVNDICYmIGNvZGUgPT0gTVNDX1BVTFNFTEVEKXsKLQkJLyogIAorCQkvKgogCQkgICAgYml0cyAgMC0gNzogOCBiaXRzOiBMRUQgYnJpZ2h0bmVzcwogCQkgICAgYml0cyAgOC0xNjogOSBiaXRzOiBwdWxzaW5nIHNwZWVkIG1vZGlmaWVyICgwIC4uLiA1MTApOyAwLTI1NCA9IHNsb3dlciwgMjU1ID0gc3RhbmRhcmQsIDI1Ni01MTAgPSBmYXN0ZXIuCiAJCSAgICBiaXRzIDE3LTE4OiAyIGJpdHM6IHB1bHNlIHRhYmxlICgwLCAxLCAyIHZhbGlkKQogCQkgICAgYml0ICAgICAxOTogMSBiaXQgOiBwdWxzZSB3aGlsc3QgYXNsZWVwPwogCQkgICAgYml0ICAgICAyMDogMSBiaXQgOiBwdWxzZSBjb25zdGFudGx5PwotCQkqLyAgCisJCSovCiAJCWludCBzdGF0aWNfYnJpZ2h0bmVzcyA9IGNvbW1hbmQgJiAweEZGOyAgIC8vIGJpdHMgMC03CiAJCWludCBwdWxzZV9zcGVlZCA9IChjb21tYW5kID4+IDgpICYgMHgxRkY7IC8vIGJpdHMgOC0xNgogCQlpbnQgcHVsc2VfdGFibGUgPSAoY29tbWFuZCA+PiAxNykgJiAweDM7ICAvLyBiaXRzIDE3LTE4CiAJCWludCBwdWxzZV9hc2xlZXAgPSAoY29tbWFuZCA+PiAxOSkgJiAweDE7IC8vIGJpdCAxOQogCQlpbnQgcHVsc2VfYXdha2UgID0gKGNvbW1hbmQgPj4gMjApICYgMHgxOyAvLyBiaXQgMjAKLSAgCisKIAkJcG93ZXJtYXRlX3B1bHNlX2xlZChwbSwgc3RhdGljX2JyaWdodG5lc3MsIHB1bHNlX3NwZWVkLCBwdWxzZV90YWJsZSwgcHVsc2VfYXNsZWVwLCBwdWxzZV9hd2FrZSk7CiAJfQogCkBAIC0zNzgsNyArMzc4LDcgQEAKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkgewogCWNhc2UgUE9XRVJNQVRFX1BST0RVQ1RfTkVXOiBwbS0+aW5wdXQubmFtZSA9IHBtX25hbWVfcG93ZXJtYXRlOyBicmVhazsKIAljYXNlIFBPV0VSTUFURV9QUk9EVUNUX09MRDogcG0tPmlucHV0Lm5hbWUgPSBwbV9uYW1lX3NvdW5ka25vYjsgYnJlYWs7Ci0JZGVmYXVsdDogCisJZGVmYXVsdDoKIAkJcG0tPmlucHV0Lm5hbWUgPSBwbV9uYW1lX3NvdW5ka25vYjsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicG93ZXJtYXRlOiB1bmtub3duIHByb2R1Y3QgaWQgJTA0eFxuIiwKIAkJICAgICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CkBAIC00MDIsMTEgKzQwMiwxMSBAQAogCXVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgNjQpOwogCXNucHJpbnRmKHBtLT5waHlzLCA2NCwgIiVzL2lucHV0MCIsIHBhdGgpOwogCXByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBvbiAlc1xuIiwgcG0tPmlucHV0Lm5hbWUsIHBtLT5pbnB1dC5waHlzKTsKLQkKKwogCS8qIGZvcmNlIGFuIHVwZGF0ZSBvZiBldmVyeXRoaW5nICovCiAJcG0tPnJlcXVpcmVzX3VwZGF0ZSA9IFVQREFURV9QVUxTRV9BU0xFRVAgfCBVUERBVEVfUFVMU0VfQVdBS0UgfCBVUERBVEVfUFVMU0VfTU9ERSB8IFVQREFURV9TVEFUSUNfQlJJR0hUTkVTUzsKIAlwb3dlcm1hdGVfcHVsc2VfbGVkKHBtLCAweDgwLCAyNTUsIDAsIDEsIDApOyAvLyBzZXQgZGVmYXVsdCBwdWxzZSBwYXJhbWV0ZXJzCi0gIAorCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwbSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jIGIvZHJpdmVycy91c2IvaW5wdXQvdG91Y2hraXR1c2IuYwppbmRleCBhNzFmMWJiLi4zODY1OTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMKQEAgLTY5LDcgKzY5LDYgQEAKIAlzdHJ1Y3QgdXJiICppcnE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKLQlpbnQgb3BlbjsKIAljaGFyIG5hbWVbMTI4XTsKIAljaGFyIHBoeXNbNjRdOwogfTsKQEAgLTEzNCwxNSArMTMzLDEwIEBACiB7CiAJc3RydWN0IHRvdWNoa2l0X3VzYiAqdG91Y2hraXQgPSBpbnB1dC0+cHJpdmF0ZTsKIAotCWlmICh0b3VjaGtpdC0+b3BlbisrKQotCQlyZXR1cm4gMDsKLQogCXRvdWNoa2l0LT5pcnEtPmRldiA9IHRvdWNoa2l0LT51ZGV2OwogCi0JaWYgKHVzYl9zdWJtaXRfdXJiKHRvdWNoa2l0LT5pcnEsIEdGUF9BVE9NSUMpKSB7Ci0JCXRvdWNoa2l0LT5vcGVuLS07CisJaWYgKHVzYl9zdWJtaXRfdXJiKHRvdWNoa2l0LT5pcnEsIEdGUF9BVE9NSUMpKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MSw4ICsxNDUsNyBAQAogewogCXN0cnVjdCB0b3VjaGtpdF91c2IgKnRvdWNoa2l0ID0gaW5wdXQtPnByaXZhdGU7CiAKLQlpZiAoIS0tdG91Y2hraXQtPm9wZW4pCi0JCXVzYl9raWxsX3VyYih0b3VjaGtpdC0+aXJxKTsKKwl1c2Jfa2lsbF91cmIodG91Y2hraXQtPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgdG91Y2hraXRfYWxsb2NfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYmtiZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMKaW5kZXggNzAzOGZiOS4uZjM1ZGIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMKQEAgLTksMTggKzksMTggQEAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCisgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCisgKgogICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5CiAgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEB1Y3cuY3o+LCBvciBieSBwYXBlciBtYWlsOgogICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCkBAIC03Miw3ICs3Miw2IEBACiAJdW5zaWduZWQgY2hhciBuZXdsZWRzOwogCWNoYXIgbmFtZVsxMjhdOwogCWNoYXIgcGh5c1s2NF07Ci0JaW50IG9wZW47CiAKIAl1bnNpZ25lZCBjaGFyICpuZXc7CiAJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3I7CkBAIC0xNjYsNyArMTY1LDcgQEAKIAogCWlmICh1cmItPnN0YXR1cykKIAkJd2FybigibGVkIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7Ci0JCisKIAlpZiAoKihrYmQtPmxlZHMpID09IGtiZC0+bmV3bGVkcykKIAkJcmV0dXJuOwogCkBAIC0xODAsMTQgKzE3OSw5IEBACiB7CiAJc3RydWN0IHVzYl9rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKIAotCWlmIChrYmQtPm9wZW4rKykKLQkJcmV0dXJuIDA7Ci0KIAlrYmQtPmlycS0+ZGV2ID0ga2JkLT51c2JkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKGtiZC0+aXJxLCBHRlBfS0VSTkVMKSkgewotCQlrYmQtPm9wZW4tLTsKKwlpZiAodXNiX3N1Ym1pdF91cmIoa2JkLT5pcnEsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Niw4ICsxOTAsNyBAQAogewogCXN0cnVjdCB1c2Jfa2JkICprYmQgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoIS0ta2JkLT5vcGVuKQotCQl1c2Jfa2lsbF91cmIoa2JkLT5pcnEpOworCXVzYl9raWxsX3VyYihrYmQtPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2tiZF9hbGxvY19tZW0oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHVzYl9rYmQgKmtiZCkKQEAgLTIzMCw3ICsyMjMsNyBAQAogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCAxLCBrYmQtPmxlZHMsIGtiZC0+bGVkc19kbWEpOwogfQogCi1zdGF0aWMgaW50IHVzYl9rYmRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCAKK3N0YXRpYyBpbnQgdXNiX2tiZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICogZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpZmFjZSk7CkBAIC0yNzIsNyArMjY1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCiAJCXNldF9iaXQodXNiX2tiZF9rZXljb2RlW2ldLCBrYmQtPmRldi5rZXliaXQpOwogCWNsZWFyX2JpdCgwLCBrYmQtPmRldi5rZXliaXQpOwotCQorCiAJa2JkLT5kZXYucHJpdmF0ZSA9IGtiZDsKIAlrYmQtPmRldi5ldmVudCA9IHVzYl9rYmRfZXZlbnQ7CiAJa2JkLT5kZXYub3BlbiA9IHVzYl9rYmRfb3BlbjsKQEAgLTI5NCw3ICsyODcsNyBAQAogCXNwcmludGYoa2JkLT5waHlzLCAiJXMvaW5wdXQwIiwgcGF0aCk7CiAKIAlrYmQtPmRldi5uYW1lID0ga2JkLT5uYW1lOwotCWtiZC0+ZGV2LnBoeXMgPSBrYmQtPnBoeXM7CQorCWtiZC0+ZGV2LnBoeXMgPSBrYmQtPnBoeXM7CiAJa2JkLT5kZXYuaWQuYnVzdHlwZSA9IEJVU19VU0I7CiAJa2JkLT5kZXYuaWQudmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKIAlrYmQtPmRldi5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CkBAIC0zMjksNyArMzIyLDcgQEAKIHN0YXRpYyB2b2lkIHVzYl9rYmRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0JCisKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCWlmIChrYmQpIHsKIAkJdXNiX2tpbGxfdXJiKGtiZC0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCmluZGV4IDAxMTU1YmIuLjFlYzQxYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYwpAQCAtOSwxOCArOSwxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTUxLDcgKzUxLDYgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgZGV2OwogCXN0cnVjdCB1cmIgKmlycTsKLQlpbnQgb3BlbjsKIAogCXNpZ25lZCBjaGFyICpkYXRhOwogCWRtYV9hZGRyX3QgZGF0YV9kbWE7CkBAIC0xMDEsMTQgKzEwMCw5IEBACiB7CiAJc3RydWN0IHVzYl9tb3VzZSAqbW91c2UgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAobW91c2UtPm9wZW4rKykKLQkJcmV0dXJuIDA7Ci0KIAltb3VzZS0+aXJxLT5kZXYgPSBtb3VzZS0+dXNiZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYihtb3VzZS0+aXJxLCBHRlBfS0VSTkVMKSkgewotCQltb3VzZS0+b3Blbi0tOworCWlmICh1c2Jfc3VibWl0X3VyYihtb3VzZS0+aXJxLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTcsOCArMTExLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX21vdXNlICptb3VzZSA9IGRldi0+cHJpdmF0ZTsKIAotCWlmICghLS1tb3VzZS0+b3BlbikKLQkJdXNiX2tpbGxfdXJiKG1vdXNlLT5pcnEpOworCXVzYl9raWxsX3VyYihtb3VzZS0+aXJxKTsKIH0KIAogc3RhdGljIGludCB1c2JfbW91c2VfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiBpbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqIGlkKQpAQCAtMTMyLDE5ICsxMjUsMTkgQEAKIAogCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCi0JaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDEpIAorCWlmIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKSAKKwlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSAhPSAzKSAKKwlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSAhPSAzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKIAotCWlmICghKG1vdXNlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9tb3VzZSksIEdGUF9LRVJORUwpKSkgCisJaWYgKCEobW91c2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX21vdXNlKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQobW91c2UsIDAsIHNpemVvZihzdHJ1Y3QgdXNiX21vdXNlKSk7CiAKQEAgLTIwOSw3ICsyMDIsNyBAQAogc3RhdGljIHZvaWQgdXNiX21vdXNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9tb3VzZSAqbW91c2UgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQkKKwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJaWYgKG1vdXNlKSB7CiAJCXVzYl9raWxsX3VyYihtb3VzZS0+aXJxKTsKQEAgLTIzOCw3ICsyMzEsNyBAQAogc3RhdGljIGludCBfX2luaXQgdXNiX21vdXNlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfbW91c2VfZHJpdmVyKTsKLQlpZiAocmV0dmFsID09IDApIAorCWlmIChyZXR2YWwgPT0gMCkKIAkJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYwppbmRleCBmZWMwNGRkLi5mNmIzNGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKQEAgLTksNyArOSw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDAwIERhbmllbCBFZ2dlcgkJPGVnZ2VyQHN1c2UuZGU+CiAgKiAgQ29weXJpZ2h0IChjKSAyMDAxIEZyZWRlcmljIExlcGllZAkJPGZsZXBpZWRAbWFuZHJha2Vzb2Z0LmNvbT4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDQgUGFuYWdpb3RpcyBJc3NhcmlzCTxwYW5hZ2lvdGlzLmlzc2FyaXNAbWVjaC5rdWxldXZlbi5hYy5iZT4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBQaW5nIENoZW5nCQk8cGluZ2NAd2Fjb20uY29tPgorICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IFBpbmcgQ2hlbmcJCTxwaW5nY0B3YWNvbS5jb20+CiAgKgogICogIENoYW5nZUxvZzoKICAqICAgICAgdjAuMSAodnApICAtIEluaXRpYWwgcmVsZWFzZQpAQCAtMTgsNyArMTgsNyBAQAogICoJdjAuNCAoc20pICAtIFN1cHBvcnQgZm9yIG1vcmUgSW50dW9zIG1vZGVscywgbWVudXN0cmlwCiAgKgkJCXJlbGF0aXZlIG1vZGUsIHByb3hpbWl0eS4KICAqCXYwLjUgKHZwKSAgLSBCaWcgY2xlYW51cCwgbmlmdHkgZmVhdHVyZXMgcmVtb3ZlZCwKLSAqIAkJCXRoZXkgYmVsb25nIGluIHVzZXJzcGFjZQorICoJCQl0aGV5IGJlbG9uZyBpbiB1c2Vyc3BhY2UKICAqCXYxLjggKHZwKSAgLSBTdWJtaXQgVVJCIG9ubHkgd2hlbiBvcGVyYXRpbmcsIG1vdmVkIHRvIENWUywKICAqCQkJdXNlIGlucHV0X3JlcG9ydF9rZXkgaW5zdGVhZCBvZiByZXBvcnRfYnRuIGFuZAogICoJCQlvdGhlciBjbGVhbnVwcwpAQCAtNTEsNiArNTEsOSBAQAogICoJCSAgIC0gQ2xlYW51cHMgaGVyZSBhbmQgdGhlcmUKICAqICAgIHYxLjMwLjEgKHBpKSAtIEFkZGVkIEdyYXBoaXJlMyBzdXBwb3J0CiAgKgl2MS40MCAocGMpIC0gQWRkIHN1cHBvcnQgZm9yIHNldmVyYWwgbmV3IGRldmljZXMsIGZpeCBlcmFzZXIgcmVwb3J0aW5nLCAuLi4KKyAqCXYxLjQzIChwYykgLSBBZGRlZCBzdXBwb3J0IGZvciBDaW50aXEgMjFVWAorCQkgICAtIEZpeGVkIGEgR3JhcGhpcmUgYnVnCisJCSAgIC0gTWVyZ2VkIHdhY29tX2ludHVvczNfaXJxIGludG8gd2Fjb21faW50dW9zX2lycQogICovCiAKIC8qCkBAIC03Miw3ICs3NSw3IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40MCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjQzIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIFdhY29tIEdyYXBoaXJlIGFuZCBXYWNvbSBJbnR1b3MgdGFibGV0IGRyaXZlciIKICNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKQEAgLTgzLDYgKzg2LDE2IEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkweDA1NmEKIAorZW51bSB7CisJUEVOUEFSVE5FUiA9IDAsCisJR1JBUEhJUkUsCisJUEwsCisJSU5UVU9TLAorCUlOVFVPUzMsCisJQ0lOVElRLAorCU1BWF9UWVBFCit9OworCiBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgewogCWNoYXIgKm5hbWU7CiAJaW50IHBrdGxlbjsKQEAgLTEwMiw3ICsxMTUsNiBAQAogCXN0cnVjdCB1cmIgKmlycTsKIAlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKmZlYXR1cmVzOwogCWludCB0b29sWzJdOwotCWludCBvcGVuOwogCV9fdTMyIHNlcmlhbFsyXTsKIAljaGFyIHBoeXNbMzJdOwogfTsKQEAgLTE0OSw3ICsxNjEsNyBAQAogCXByb3ggPSBkYXRhWzFdICYgMHg0MDsKIAogCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKLQkKKwogCWlmIChwcm94KSB7CiAKIAkJcHJlc3N1cmUgPSAoc2lnbmVkIGNoYXIpKChkYXRhWzddIDw8IDEpIHwgKChkYXRhWzRdID4+IDIpICYgMSkpOwpAQCAtMTY2LDggKzE3OCw3IEBACiAJCWlmICghd2Fjb20tPnRvb2xbMF0pIHsKIAkJCS8qIEdvaW5nIGludG8gcHJveGltaXR5IHNlbGVjdCB0b29sICovCiAJCQl3YWNvbS0+dG9vbFsxXSA9IChkYXRhWzRdICYgMHgyMCk/IEJUTl9UT09MX1JVQkJFUiA6IEJUTl9UT09MX1BFTjsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIHdhcyBlbnRlcmVkIHdpdGggc3R5bHVzMiBwcmVzc2VkICovCiAJCQlpZiAod2Fjb20tPnRvb2xbMV0gPT0gQlROX1RPT0xfUlVCQkVSICYmICEoZGF0YVs0XSAmIDB4MjApICkgewogCQkJCS8qIHJlcG9ydCBvdXQgcHJveGltaXR5IGZvciBwcmV2aW91cyB0b29sICovCkBAIC0xODIsMTYgKzE5MywxNSBAQAogCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9QRU47CiAJCX0KIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCBwcm94KTsgLyogcmVwb3J0IGluIHByb3hpbWl0eSBmb3IgdG9vbCAqLwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIGRhdGFbM10gfCAoKF9fdTMyKWRhdGFbMl0gPDwgNykgfCAoKF9fdTMyKShkYXRhWzFdICYgMHgwMykgPDwgMTQpKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBkYXRhWzZdIHwgKChfX3UzMilkYXRhWzVdIDw8IDcpIHwgKChfX3UzMikoZGF0YVs0XSAmIDB4MDMpIDw8IDE0KSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgZGF0YVszXSB8IChkYXRhWzJdIDw8IDcpIHwgKChkYXRhWzFdICYgMHgwMykgPDwgMTQpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBkYXRhWzZdIHwgKGRhdGFbNV0gPDwgNykgfCAoKGRhdGFbNF0gJiAweDAzKSA8PCAxNCkpOwogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCBwcmVzc3VyZSk7CiAKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZGF0YVs0XSAmIDB4MDgpOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgZGF0YVs0XSAmIDB4MTApOwogCQkvKiBPbmx5IGFsbG93IHRoZSBzdHlsdXMyIGJ1dHRvbiB0byBiZSByZXBvcnRlZCBmb3IgdGhlIHBlbiB0b29sLiAqLwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsICh3YWNvbS0+dG9vbFsxXSA9PSBCVE5fVE9PTF9QRU4pICYmIChkYXRhWzRdICYgMHgyMCkpOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiByZXBvcnQgcHJveGltaXR5LW91dCBvZiBhICh2YWxpZCkgdG9vbCAqLwogCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfUlVCQkVSKSB7CiAJCQkvKiBVbmtub3duIHRvb2wgc2VsZWN0ZWQgZGVmYXVsdCB0byBwZW4gdG9vbCAqLwpAQCAtMjAzLDcgKzIxMyw3IEBACiAJd2Fjb20tPnRvb2xbMF0gPSBwcm94OyAvKiBTYXZlIHByb3hpbWl0eSBzdGF0ZSAqLwogCWlucHV0X3N5bmMoZGV2KTsKIAotZXhpdDoKKyBleGl0OgogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKQEAgLTIzMiwyMCArMjQyLDE2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlpZiAoZGF0YVswXSAhPSAyKQotCXsKKwlpZiAoZGF0YVswXSAhPSAyKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIndhY29tX3B0dV9pcnE6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZFxuIiwgZGF0YVswXSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpbnB1dF9yZWdzKGRldiwgcmVncyk7Ci0JaWYgKGRhdGFbMV0gJiAweDA0KQotCXsKKwlpZiAoZGF0YVsxXSAmIDB4MDQpIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1JVQkJFUiwgZGF0YVsxXSAmIDB4MjApOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBkYXRhWzFdICYgMHgwOCk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1BFTiwgZGF0YVsxXSAmIDB4MjApOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBkYXRhWzFdICYgMHgwMSk7CiAJfQpAQCAtMjU3LDcgKzI2Myw3IEBACiAKIAlpbnB1dF9zeW5jKGRldik7CiAKLWV4aXQ6CisgZXhpdDoKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCkBAIC0zMDAsNyArMzA2LDcgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgKGRhdGFbNV0gJiAweDQwKSk7CiAJaW5wdXRfc3luYyhkZXYpOwogCi1leGl0OgorIGV4aXQ6CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLApAQCAtMzQwLDQ3ICszNDYsNDcgQEAKIAogCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKIAotCXN3aXRjaCAoKGRhdGFbMV0gPj4gNSkgJiAzKSB7CisJaWYgKGRhdGFbMV0gJiAweDEwKSB7IC8qIGluIHByb3ggKi8KIAotCQljYXNlIDA6CS8qIFBlbiAqLwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1BFTiwgZGF0YVsxXSAmIDB4ODApOwotCQkJYnJlYWs7CisJCXN3aXRjaCAoKGRhdGFbMV0gPj4gNSkgJiAzKSB7CiAKLQkJY2FzZSAxOiAvKiBSdWJiZXIgKi8KLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9SVUJCRVIsIGRhdGFbMV0gJiAweDgwKTsKLQkJCWJyZWFrOworCQkJY2FzZSAwOgkvKiBQZW4gKi8KKwkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX1BFTjsKKwkJCQlicmVhazsKIAotCQljYXNlIDI6IC8qIE1vdXNlIHdpdGggd2hlZWwgKi8KLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzFdICYgMHgwNCk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoc2lnbmVkIGNoYXIpIGRhdGFbNl0pOwotCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlIDE6IC8qIFJ1YmJlciAqLworCQkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfUlVCQkVSOworCQkJCWJyZWFrOwogCi0gICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBNb3VzZSB3aXRob3V0IHdoZWVsICovCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfTU9VU0UsIGRhdGFbN10gPiAyNCk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGRhdGFbMV0gJiAweDAxKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMV0gJiAweDAyKTsKLQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsIGRhdGFbN10pOworCQkJY2FzZSAyOiAvKiBNb3VzZSB3aXRoIHdoZWVsICovCisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbMV0gJiAweDA0KTsKKwkJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoc2lnbmVkIGNoYXIpIGRhdGFbNl0pOworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCi0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIHgpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKLQotCQkJaW5wdXRfc3luYyhkZXYpOwotCQkJZ290byBleGl0OworCQkJY2FzZSAzOiAvKiBNb3VzZSB3aXRob3V0IHdoZWVsICovCisJCQkJd2Fjb20tPnRvb2xbMF0gPSBCVE5fVE9PTF9NT1VTRTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGRhdGFbMV0gJiAweDAxKTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBkYXRhWzFdICYgMHgwMik7CisJCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgZGF0YVs3XSk7CisJCQkJYnJlYWs7CisJCX0KIAl9CiAKIAlpZiAoZGF0YVsxXSAmIDB4ODApIHsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4KTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKIAl9CisJaWYgKHdhY29tLT50b29sWzBdICE9IEJUTl9UT09MX01PVVNFKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIGxlMTZfdG9fY3B1KCooX19sZTE2ICopICZkYXRhWzZdKSk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDAxKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMsIGRhdGFbMV0gJiAweDAyKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMyLCBkYXRhWzFdICYgMHgwNCk7CisJfQogCi0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmRhdGFbNl0pKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBkYXRhWzFdICYgMHgwMSk7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMsIGRhdGFbMV0gJiAweDAyKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiAweDA0KTsKLQorCWlucHV0X3JlcG9ydF9rZXkoZGV2LCB3YWNvbS0+dG9vbFswXSwgZGF0YVsxXSAmIDB4MTApOwogCWlucHV0X3N5bmMoZGV2KTsKIAotZXhpdDoKKyBleGl0OgogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKQEAgLTM5OCwxNCArNDA0LDEzIEBACiAJaWR4ID0gZGF0YVsxXSAmIDB4MDE7CiAKIAkvKiBFbnRlciByZXBvcnQgKi8KLQlpZiAoKGRhdGFbMV0gJiAweGZjKSA9PSAweGMwKQotCXsKKwlpZiAoKGRhdGFbMV0gJiAweGZjKSA9PSAweGMwKSB7CiAJCS8qIHNlcmlhbCBudW1iZXIgb2YgdGhlIHRvb2wgKi8KLQkJd2Fjb20tPnNlcmlhbFtpZHhdID0gKChfX3UzMikoZGF0YVszXSAmIDB4MGYpIDw8IDI4KSArCi0JCQkoKF9fdTMyKWRhdGFbNF0gPDwgMjApICsgKChfX3UzMilkYXRhWzVdIDw8IDEyKSArCi0JCQkoKF9fdTMyKWRhdGFbNl0gPDwgNCkgKyAoZGF0YVs3XSA+PiA0KTsKKwkJd2Fjb20tPnNlcmlhbFtpZHhdID0gKChkYXRhWzNdICYgMHgwZikgPDwgMjgpICsKKwkJCShkYXRhWzRdIDw8IDIwKSArIChkYXRhWzVdIDw8IDEyKSArCisJCQkoZGF0YVs2XSA8PCA0KSArIChkYXRhWzddID4+IDQpOwogCi0JCXN3aXRjaCAoKChfX3UzMilkYXRhWzJdIDw8IDQpIHwgKGRhdGFbM10gPj4gNCkpIHsKKwkJc3dpdGNoICgoZGF0YVsyXSA8PCA0KSB8IChkYXRhWzNdID4+IDQpKSB7CiAJCQljYXNlIDB4ODEyOiAvKiBJbmtpbmcgcGVuICovCiAJCQljYXNlIDB4ODAxOiAvKiBJbnR1b3MzIElua2luZyBwZW4gKi8KIAkJCWNhc2UgMHgwMTI6CkBAIC00NDksNyArNDU0LDcgQEAKIAkJCWNhc2UgMHgxMTI6CiAJCQljYXNlIDB4OTEzOiAvKiBJbnR1b3MzIEFpcmJydXNoICovCiAJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX0FJUkJSVVNIOwotCQkJCWJyZWFrOwkvKiBBaXJicnVzaCAqLworCQkJCWJyZWFrOwogCQkJZGVmYXVsdDogLyogVW5rbm93biB0b29sICovCiAJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1BFTjsKIAkJfQpAQCAtNDc4LDkgKzQ4Myw4IEBACiAJdW5zaWduZWQgaW50IHQ7CiAKIAkvKiBnZW5lcmFsIHBlbiBwYWNrZXQgKi8KLQlpZiAoKGRhdGFbMV0gJiAweGI4KSA9PSAweGEwKQotCXsKLQkJdCA9ICgoX191MzIpZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpOworCWlmICgoZGF0YVsxXSAmIDB4YjgpID09IDB4YTApIHsKKwkJdCA9IChkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMyk7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIHQpOwogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RJTFRfWCwKIAkJCQkoKGRhdGFbN10gPDwgMSkgJiAweDdlKSB8IChkYXRhWzhdID4+IDcpKTsKQEAgLTQ5MSwxMCArNDk1LDkgQEAKIAl9CiAKIAkvKiBhaXJicnVzaCBzZWNvbmQgcGFja2V0ICovCi0JaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhiNCkKLQl7CisJaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhiNCkgewogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1dIRUVMLAotCQkJCSgoX191MzIpZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpKTsKKwkJCQkoZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpKTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19USUxUX1gsCiAJCQkJKChkYXRhWzddIDw8IDEpICYgMHg3ZSkgfCAoZGF0YVs4XSA+PiA3KSk7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVElMVF9ZLCBkYXRhWzhdICYgMHg3Zik7CkBAIC01MjYsNyArNTI5LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWlmIChkYXRhWzBdICE9IDIgJiYgZGF0YVswXSAhPSA1ICYmIGRhdGFbMF0gIT0gNikgeworCWlmIChkYXRhWzBdICE9IDIgJiYgZGF0YVswXSAhPSA1ICYmIGRhdGFbMF0gIT0gNiAmJiBkYXRhWzBdICE9IDEyKSB7CiAJCWRiZygid2Fjb21faW50dW9zX2lycTogcmVjZWl2ZWQgdW5rbm93biByZXBvcnQgIyVkIiwgZGF0YVswXSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC01MzYsMTA3ICs1MzksMTAgQEAKIAkvKiB0b29sIG51bWJlciAqLwogCWlkeCA9IGRhdGFbMV0gJiAweDAxOwogCi0JLyogcHJvY2VzcyBpbi9vdXQgcHJveCBldmVudHMgKi8KLQlpZiAod2Fjb21faW50dW9zX2lub3V0KHVyYikpIGdvdG8gZXhpdDsKLQotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgYmUxNl90b19jcHUoKihfX2JlMTYgKikgJmRhdGFbMl0pKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGJlMTZfdG9fY3B1KCooX19iZTE2ICopICZkYXRhWzRdKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgZGF0YVs5XSk7Ci0KLQkvKiBwcm9jZXNzIGdlbmVyYWwgcGFja2V0cyAqLwotCXdhY29tX2ludHVvc19nZW5lcmFsKHVyYik7Ci0JCi0JaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhhOCB8fCAoZGF0YVsxXSAmIDB4YmUpID09IDB4YjApIHsJCS8qIDREIG1vdXNlIG9yIExlbnMgY3Vyc29yIHBhY2tldHMgKi8KLQotCQlpZiAoZGF0YVsxXSAmIDB4MDIpIHsJCQkJCQkvKiBSb3RhdGlvbiBwYWNrZXQgKi8KLQotCQkJdCA9ICgoX191MzIpZGF0YVs2XSA8PCAzKSB8ICgoZGF0YVs3XSA+PiA1KSAmIDcpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWiwgKGRhdGFbN10gJiAweDIwKSA/ICgodCAtIDEpIC8gMikgOiAtdCAvIDIpOwotCi0JCX0gZWxzZSB7Ci0KLQkgCQlpZiAoKGRhdGFbMV0gJiAweDEwKSA9PSAwKSB7CQkJCS8qIDREIG1vdXNlIHBhY2tldHMgKi8KLQotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwMSk7Ci0JCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgZGF0YVs4XSAmIDB4MDQpOwotCi0JCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TSURFLCAgIGRhdGFbOF0gJiAweDIwKTsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0VYVFJBLCAgZGF0YVs4XSAmIDB4MTApOwotCQkJCXQgPSAoKF9fdTMyKWRhdGFbNl0gPDwgMikgfCAoKGRhdGFbN10gPj4gNikgJiAzKTsKLQkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RIUk9UVExFLCAoZGF0YVs4XSAmIDB4MDgpID8gLXQgOiB0KTsKLQotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9NT1VTRSkgewkvKiAyRCBtb3VzZSBwYWNrZXRzICovCQotCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDQpOwotCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDgpOwotCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgZGF0YVs4XSAmIDB4MTApOwotCQkJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAKLQkJCQkJICAgICgtKF9fdTMyKShkYXRhWzhdICYgMHgwMSkgKyAoX191MzIpKChkYXRhWzhdICYgMHgwMikgPj4gMSkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7ICAgICAvKiBMZW5zIGN1cnNvciBwYWNrZXRzICovCi0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwMSk7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgwNCk7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBkYXRhWzhdICYgMHgxMCk7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgwOCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCB3YWNvbS0+dG9vbFtpZHhdLCAxKTsKLQlpbnB1dF9ldmVudChkZXYsIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKLQlpbnB1dF9zeW5jKGRldik7Ci0KLWV4aXQ6Ci0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKLQkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKLX0KLQotc3RhdGljIHZvaWQgd2Fjb21faW50dW9zM19pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gdXJiLT5jb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmd2Fjb20tPmRldjsKLQl1bnNpZ25lZCBpbnQgdDsKLQlpbnQgaWR4LCByZXR2YWw7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGNoZWNrIGZvciB2YWxpZCByZXBvcnQgKi8KLQlpZiAoZGF0YVswXSAhPSAyICYmIGRhdGFbMF0gIT0gNSAmJiBkYXRhWzBdICE9IDEyKQotCXsKLQkJcHJpbnRrKEtFUk5fSU5GTyAid2Fjb21faW50dW9zM19pcnE6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZFxuIiwgZGF0YVswXSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpbnB1dF9yZWdzKGRldiwgcmVncyk7Ci0KLQkvKiB0b29sIGluZGV4IGlzIGFsd2F5cyAwIGhlcmUgc2luY2UgdGhlcmUgaXMgbm8gZHVhbCBpbnB1dCB0b29sICovCi0JaWR4ID0gZGF0YVsxXSAmIDB4MDE7Ci0KIAkvKiBwYWQgcGFja2V0cy4gV29ya3MgYXMgYSBzZWNvbmQgdG9vbCBhbmQgaXMgYWx3YXlzIGluIHByb3ggKi8KLQlpZiAoZGF0YVswXSA9PSAxMikKLQl7CisJaWYgKGRhdGFbMF0gPT0gMTIpIHsKIAkJLyogaW5pdGlhdGUgdGhlIHBhZCBhcyBhIGRldmljZSAqLwotCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfRklOR0VSKQotCQl7CisJCWlmICh3YWNvbS0+dG9vbFsxXSAhPSBCVE5fVE9PTF9GSU5HRVIpIHsKIAkJCXdhY29tLT50b29sWzFdID0gQlROX1RPT0xfRklOR0VSOwogCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCAxKTsKIAkJfQpAQCAtNjU2LDM3ICs1NjIsNzggQEAKIAl9CiAKIAkvKiBwcm9jZXNzIGluL291dCBwcm94IGV2ZW50cyAqLwotCWlmICh3YWNvbV9pbnR1b3NfaW5vdXQodXJiKSkgZ290byBleGl0OworCWlmICh3YWNvbV9pbnR1b3NfaW5vdXQodXJiKSkKKwkJZ290byBleGl0OwogCi0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAoKF9fdTMyKWRhdGFbMl0gPDwgOSkgfCAoKF9fdTMyKWRhdGFbM10gPDwgMSkgfCAoKGRhdGFbOV0gPj4gMSkgJiAxKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCAoKF9fdTMyKWRhdGFbNF0gPDwgOSkgfCAoKF9fdTMyKWRhdGFbNV0gPDwgMSkgfCAoZGF0YVs5XSAmIDEpKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCAoKGRhdGFbOV0gPj4gMikgJiAweDNmKSk7CisJLyogQ2ludGlxIGRvZXNuJ3Qgc2VuZCBkYXRhIHdoZW4gUkRZIGJpdCBpc24ndCBzZXQgKi8KKwlpZiAoKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBDSU5USVEpICYmICEoZGF0YVsxXSAmIDB4NDApKQorCQlyZXR1cm47CisKKwlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID49IElOVFVPUzMpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAoZGF0YVsyXSA8PCA5KSB8IChkYXRhWzNdIDw8IDEpIHwgKChkYXRhWzldID4+IDEpICYgMSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIChkYXRhWzRdIDw8IDkpIHwgKGRhdGFbNV0gPDwgMSkgfCAoZGF0YVs5XSAmIDEpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgKChkYXRhWzldID4+IDIpICYgMHgzZikpOworCX0gZWxzZSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgYmUxNl90b19jcHUoKihfX2JlMTYgKikgJmRhdGFbMl0pKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSAmZGF0YVs0XSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCAoKGRhdGFbOV0gPj4gMykgJiAweDFmKSk7CisJfQogCiAJLyogcHJvY2VzcyBnZW5lcmFsIHBhY2tldHMgKi8KIAl3YWNvbV9pbnR1b3NfZ2VuZXJhbCh1cmIpOwogCi0JaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhhOCB8fCAoZGF0YVsxXSAmIDB4YmUpID09IDB4YjApCi0JewotCQkvKiBNYXJrZXIgcGVuIHJvdGF0aW9uIHBhY2tldC4gUmVwb3J0ZWQgYXMgd2hlZWwgZHVlIHRvIHZhbHVhdG9yIGxpbWl0YXRpb24gKi8KLQkJaWYgKGRhdGFbMV0gJiAweDAyKQotCQl7Ci0JCQl0ID0gKChfX3UzMilkYXRhWzZdIDw8IDMpIHwgKChkYXRhWzddID4+IDUpICYgNyk7Ci0JCQl0ID0gKGRhdGFbN10gJiAweDIwKSA/ICgodCA+IDkwMCkgPyAoKHQtMSkgLyAyIC0gMTM1MCkgOgotCQkJCSgodC0xKSAvIDIgKyA0NTApKSA6ICg0NTAgLSB0IC8gMikgOwotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19XSEVFTCwgdCk7Ci0JCX0KKwkvKiA0RCBtb3VzZSwgMkQgbW91c2UsIG1hcmtlciBwZW4gcm90YXRpb24sIG9yIExlbnMgY3Vyc29yIHBhY2tldHMgKi8KKwlpZiAoKGRhdGFbMV0gJiAweGJjKSA9PSAweGE4IHx8IChkYXRhWzFdICYgMHhiZSkgPT0gMHhiMCkgewogCi0JCS8qIDJEIG1vdXNlIHBhY2tldHMgKi8KLQkJaWYgKHdhY29tLT50b29sW2lkeF0gPT0gQlROX1RPT0xfTU9VU0UpCi0JCXsKKwkJaWYgKGRhdGFbMV0gJiAweDAyKSB7CisJCQkvKiBSb3RhdGlvbiBwYWNrZXQgKi8KKwkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPj0gSU5UVU9TMykgeworCQkJCS8qIEkzIG1hcmtlciBwZW4gcm90YXRpb24gcmVwb3J0ZWQgYXMgd2hlZWwKKwkJCQkgKiBkdWUgdG8gdmFsdWF0b3IgbGltaXRhdGlvbgorCQkJCSAqLworCQkJCXQgPSAoZGF0YVs2XSA8PCAzKSB8ICgoZGF0YVs3XSA+PiA1KSAmIDcpOworCQkJCXQgPSAoZGF0YVs3XSAmIDB4MjApID8gKCh0ID4gOTAwKSA/ICgodC0xKSAvIDIgLSAxMzUwKSA6CisJCQkJCSgodC0xKSAvIDIgKyA0NTApKSA6ICg0NTAgLSB0IC8gMikgOworCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfV0hFRUwsIHQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiA0RCBtb3VzZSByb3RhdGlvbiBwYWNrZXQgKi8KKwkJCQl0ID0gKGRhdGFbNl0gPDwgMykgfCAoKGRhdGFbN10gPj4gNSkgJiA3KTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JaLCAoZGF0YVs3XSAmIDB4MjApID8KKwkJCQkJKCh0IC0gMSkgLyAyKSA6IC10IC8gMik7CisJCQl9CisKKwkJfSBlbHNlIGlmICghKGRhdGFbMV0gJiAweDEwKSAmJiB3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7CisJCQkvKiA0RCBtb3VzZSBwYWNrZXQgKi8KKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwMSk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDIpOworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDA0KTsKKworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TSURFLCAgIGRhdGFbOF0gJiAweDIwKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgxMCk7CisJCQl0ID0gKGRhdGFbNl0gPDwgMikgfCAoKGRhdGFbN10gPj4gNikgJiAzKTsKKwkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVEhST1RUTEUsIChkYXRhWzhdICYgMHgwOCkgPyAtdCA6IHQpOworCisJCX0gZWxzZSBpZiAod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9NT1VTRSkgeworCQkJLyogMkQgbW91c2UgcGFja2V0ICovCiAJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDQpOwogCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDA4KTsKIAkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgxMCk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4NDApOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDIwKTsKLQkJCS8qIG1vdXNlIHdoZWVsIGlzIHBvc2l0aXZlIHdoZW4gcm9sbGVkIGJhY2t3YXJkcyAqLwotCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgICgoX191MzIpKChkYXRhWzhdICYgMHgwMikgPj4gMSkKLQkJCQkJIC0gKF9fdTMyKShkYXRhWzhdICYgMHgwMSkpKTsKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICgoZGF0YVs4XSAmIDB4MDIpID4+IDEpCisJCQkJCQkgLSAoZGF0YVs4XSAmIDB4MDEpKTsKKworCQkJLyogSTMgMkQgbW91c2Ugc2lkZSBidXR0b25zICovCisJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMpIHsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4NDApOworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgyMCk7CisJCQl9CisKKwkJfSBlbHNlIGlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7CisJCQkvKiBMZW5zIGN1cnNvciBwYWNrZXRzICovCisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDEpOworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgwNCk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MTApOworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDA4KTsKIAkJfQogCX0KIApAQCAtNzAyLDM1ICs2NDksMzYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc1tdID0gewotCXsgIldhY29tIFBlbnBhcnRuZXIiLCAgICA3LCAgIDUwNDAsICAzNzgwLCAgMjU1LCAzMiwgMCwgd2Fjb21fcGVucGFydG5lcl9pcnEgfSwKLSAgICAgICAgeyAiV2Fjb20gR3JhcGhpcmUiLCAgICAgIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDMyLCAxLCB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTIgNHg1IiwgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgMzIsIDEsIHdhY29tX2dyYXBoaXJlX2lycSB9LAotIAl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgMzIsIDEsIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMyIsICAgICA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgMSwgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmUzIDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCAxLCB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLSAgCXsgIldhY29tIEludHVvcyA0eDUiLCAgIDEwLCAgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotIAl7ICJXYWNvbSBJbnR1b3MgNng4IiwgICAxMCwgIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLSAJeyAiV2Fjb20gSW50dW9zIDl4MTIiLCAgMTAsICAzMDQ4MCwgMjQwNjAsIDEwMjMsIDE1LCAyLCB3YWNvbV9pbnR1b3NfaXJxIH0sCi0gCXsgIldhY29tIEludHVvcyAxMngxMiIsIDEwLCAgMzA0ODAsIDMxNjgwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotIAl7ICJXYWNvbSBJbnR1b3MgMTJ4MTgiLCAxMCwgIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLSAJeyAiV2Fjb20gUEw0MDAiLCAgICAgICAgIDgsICAgNTQwOCwgIDQwNTYsICAyNTUsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLSAJeyAiV2Fjb20gUEw1MDAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICAyNTUsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLSAJeyAiV2Fjb20gUEw2MDAiLCAgICAgICAgIDgsICAgNjEyNiwgIDQ2MDQsICAyNTUsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLSAJeyAiV2Fjb20gUEw2MDBTWCIsICAgICAgIDgsICAgNjI2MCwgIDUwMTYsICAyNTUsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLSAJeyAiV2Fjb20gUEw1NTAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICA1MTEsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLSAJeyAiV2Fjb20gUEw4MDAiLCAgICAgICAgIDgsICAgNzIyMCwgIDU3ODAsICA1MTEsIDMyLCAzLCB3YWNvbV9wbF9pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDR4NSIsICAgMTAsIDEyNzAwLCAxMDYwMCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDl4MTIiLCAgMTAsIDMwNDgwLCAyNDA2MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDEyeDEyIiwgMTAsIDMwNDgwLCAzMTY4MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDEyeDE4IiwgMTAsIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLQl7ICJXYWNvbSBWb2xpdG8iLCAgICAgICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIDEsIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIENpbnRpcSBQYXJ0bmVyIiw4LCAgMjA0ODAsIDE1MzYwLCAgNTExLCAzMiwgMywgd2Fjb21fcHR1X2lycSB9LAotCXsgIldhY29tIEludHVvczMgNHg1IiwgICAxMCwgMjU0MDAsIDIwMzIwLCAxMDIzLCAxNSwgNCwgd2Fjb21faW50dW9zM19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDZ4OCIsICAgMTAsIDQwNjQwLCAzMDQ4MCwgMTAyMywgMTUsIDQsIHdhY29tX2ludHVvczNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA5eDEyIiwgIDEwLCA2MDk2MCwgNDU3MjAsIDEwMjMsIDE1LCA0LCB3YWNvbV9pbnR1b3MzX2lycSB9LAotCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotIAl7IH0KKwl7ICJXYWNvbSBQZW5wYXJ0bmVyIiwgICAgNywgICA1MDQwLCAgMzc4MCwgIDI1NSwgMzIsIFBFTlBBUlRORVIsIHdhY29tX3BlbnBhcnRuZXJfaXJxIH0sCisgICAgICAgIHsgIldhY29tIEdyYXBoaXJlIiwgICAgICA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUyIDR4NSIsIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlMyIsICAgICA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUzIDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgNHg1IiwgICAxMCwgIDEyNzAwLCAxMDYwMCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgNng4IiwgICAxMCwgIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgOXgxMiIsICAxMCwgIDMwNDgwLCAyNDA2MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgMTJ4MTIiLCAxMCwgIDMwNDgwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgMTJ4MTgiLCAxMCwgIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBQTDQwMCIsICAgICAgICAgOCwgICA1NDA4LCAgNDA1NiwgIDI1NSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAorCXsgIldhY29tIFBMNTAwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgMjU1LCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCisJeyAiV2Fjb20gUEw2MDAiLCAgICAgICAgIDgsICAgNjEyNiwgIDQ2MDQsICAyNTUsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKKwl7ICJXYWNvbSBQTDYwMFNYIiwgICAgICAgOCwgICA2MjYwLCAgNTAxNiwgIDI1NSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAorCXsgIldhY29tIFBMNTUwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgNTExLCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCisJeyAiV2Fjb20gUEw4MDAiLCAgICAgICAgIDgsICAgNzIyMCwgIDU3ODAsICA1MTEsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDR4NSIsICAgMTAsIDEyNzAwLCAxMDYwMCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDl4MTIiLCAgMTAsIDMwNDgwLCAyNDA2MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDEyeDEyIiwgMTAsIDMwNDgwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDEyeDE4IiwgMTAsIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywgICAgIHdhY29tX2ludHVvc19pcnEgfSwKKwl7ICJXYWNvbSBWb2xpdG8iLCAgICAgICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIENpbnRpcSBQYXJ0bmVyIiw4LCAgMjA0ODAsIDE1MzYwLCAgNTExLCAzMiwgUEwsICAgICAgICAgd2Fjb21fcHR1X2lycSB9LAorCXsgIldhY29tIEludHVvczMgNHg1IiwgICAxMCwgMjU0MDAsIDIwMzIwLCAxMDIzLCAxNSwgSU5UVU9TMywgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczMgNng4IiwgICAxMCwgNDA2NDAsIDMwNDgwLCAxMDIzLCAxNSwgSU5UVU9TMywgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczMgOXgxMiIsICAxMCwgNjA5NjAsIDQ1NzIwLCAxMDIzLCAxNSwgSU5UVU9TMywgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIENpbnRpcSAyMVVYIiwgICAxMCwgODcyMDAsIDY1NjAwLCAxMDIzLCAxNSwgQ0lOVElRLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdhY29tX2lkc1tdID0gewpAQCAtNzYxLDYgKzcwOSw3IEBACiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjApIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjEpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4M0YpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDcpIH0sCiAJeyB9CiB9OwpAQCAtNzcxLDE0ICs3MjAsOSBAQAogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAod2Fjb20tPm9wZW4rKykKLQkJcmV0dXJuIDA7Ci0KIAl3YWNvbS0+aXJxLT5kZXYgPSB3YWNvbS0+dXNiZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYih3YWNvbS0+aXJxLCBHRlBfS0VSTkVMKSkgewotCQl3YWNvbS0+b3Blbi0tOworCWlmICh1c2Jfc3VibWl0X3VyYih3YWNvbS0+aXJxLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC03ODcsOCArNzMxLDcgQEAKIHsKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKCEtLXdhY29tLT5vcGVuKQotCQl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7CisJdXNiX2tpbGxfdXJiKHdhY29tLT5pcnEpOwogfQogCiBzdGF0aWMgaW50IHdhY29tX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC04MjMsMzIgKzc2NiwzMyBAQAogCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUEVOKSB8IEJJVChCVE5fVE9VQ0gpIHwgQklUKEJUTl9TVFlMVVMpOwogCiAJc3dpdGNoICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUpIHsKLQkJY2FzZSAxOgorCQljYXNlIEdSQVBISVJFOgogCQkJd2Fjb20tPmRldi5ldmJpdFswXSB8PSBCSVQoRVZfUkVMKTsKIAkJCXdhY29tLT5kZXYucmVsYml0WzBdIHw9IEJJVChSRUxfV0hFRUwpOwogCQkJd2Fjb20tPmRldi5hYnNiaXRbMF0gfD0gQklUKEFCU19ESVNUQU5DRSk7CiAJCQl3YWNvbS0+ZGV2LmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOwotIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUlVCQkVSKSB8IEJJVChCVE5fVE9PTF9NT1VTRSkgfCBCSVQoQlROX1NUWUxVUzIpOworCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9SVUJCRVIpIHwgQklUKEJUTl9UT09MX01PVVNFKSB8IEJJVChCVE5fU1RZTFVTMik7CiAJCQlicmVhazsKIAotCQljYXNlIDQ6IC8qIG5ldyBmdW5jdGlvbnMgZm9yIEludHVvczMgKi8KKwkJY2FzZSBJTlRVT1MzOgorCQljYXNlIENJTlRJUToKIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfRklOR0VSKTsKIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzApIHwgQklUKEJUTl8xKSB8IEJJVChCVE5fMikgfCBCSVQoQlROXzMpIHwgQklUKEJUTl80KSB8IEJJVChCVE5fNSkgfCBCSVQoQlROXzYpIHwgQklUKEJUTl83KTsKIAkJCXdhY29tLT5kZXYuYWJzYml0WzBdIHw9IEJJVChBQlNfUlgpIHwgQklUKEFCU19SWSk7CiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAotCQljYXNlIDI6CisJCWNhc2UgSU5UVU9TOgogCQkJd2Fjb20tPmRldi5ldmJpdFswXSB8PSBCSVQoRVZfTVNDKSB8IEJJVChFVl9SRUwpOwogCQkJd2Fjb20tPmRldi5tc2NiaXRbMF0gfD0gQklUKE1TQ19TRVJJQUwpOwogCQkJd2Fjb20tPmRldi5yZWxiaXRbMF0gfD0gQklUKFJFTF9XSEVFTCk7CiAJCQl3YWNvbS0+ZGV2LmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9TSURFKSB8IEJJVChCVE5fRVhUUkEpOwotIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUlVCQkVSKSB8IEJJVChCVE5fVE9PTF9NT1VTRSkJfCBCSVQoQlROX1RPT0xfQlJVU0gpCisJCQl3YWNvbS0+ZGV2LmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX1JVQkJFUikgfCBCSVQoQlROX1RPT0xfTU9VU0UpCXwgQklUKEJUTl9UT09MX0JSVVNIKQogCQkJCQkJCSAgfCBCSVQoQlROX1RPT0xfUEVOQ0lMKSB8IEJJVChCVE5fVE9PTF9BSVJCUlVTSCkgfCBCSVQoQlROX1RPT0xfTEVOUykgfCBCSVQoQlROX1NUWUxVUzIpOwogCQkJd2Fjb20tPmRldi5hYnNiaXRbMF0gfD0gQklUKEFCU19ESVNUQU5DRSkgfCBCSVQoQUJTX1dIRUVMKSB8IEJJVChBQlNfVElMVF9YKSB8IEJJVChBQlNfVElMVF9ZKSB8IEJJVChBQlNfUlopIHwgQklUKEFCU19USFJPVFRMRSk7CiAJCQlicmVhazsKIAotCQljYXNlIDM6Ci0gCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fU1RZTFVTMikgfCBCSVQoQlROX1RPT0xfUlVCQkVSKTsKKwkJY2FzZSBQTDoKKwkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1NUWUxVUzIpIHwgQklUKEJUTl9UT09MX1JVQkJFUik7CiAJCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3hwYWQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3hwYWQuYwppbmRleCBkNjVlZGIyLi5hN2ZhMWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC94cGFkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jCkBAIC0xMDQsMTMgKzEwNCwxMiBAQAogc3RydWN0IHVzYl94cGFkIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2IGRldjsJCQkvKiBpbnB1dCBkZXZpY2UgaW50ZXJmYWNlICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CQkvKiB1c2IgZGV2aWNlICovCi0JCisKIAlzdHJ1Y3QgdXJiICppcnFfaW47CQkJLyogdXJiIGZvciBpbnRlcnJ1cHQgaW4gcmVwb3J0ICovCiAJdW5zaWduZWQgY2hhciAqaWRhdGE7CQkJLyogaW5wdXQgZGF0YSAqLwogCWRtYV9hZGRyX3QgaWRhdGFfZG1hOwotCQorCiAJY2hhciBwaHlzWzY1XTsJCQkJLyogcGh5c2ljYWwgZGV2aWNlIHBhdGggKi8KLQlpbnQgb3Blbl9jb3VudDsJCQkJLyogcmVmZXJlbmNlIGNvdW50ICovCiB9OwogCiAvKgpAQCAtMTI4LDM1ICsxMjcsMzUgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmeHBhZC0+ZGV2OwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCQorCiAJLyogbGVmdCBzdGljayAqLwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgKF9fczE2KSAoKChfX3MxNilkYXRhWzEzXSA8PCA4KSB8IGRhdGFbMTJdKSk7CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCAoX19zMTYpICgoKF9fczE2KWRhdGFbMTVdIDw8IDgpIHwgZGF0YVsxNF0pKTsKLQkKKwogCS8qIHJpZ2h0IHN0aWNrICovCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWCwgKF9fczE2KSAoKChfX3MxNilkYXRhWzE3XSA8PCA4KSB8IGRhdGFbMTZdKSk7CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwgKF9fczE2KSAoKChfX3MxNilkYXRhWzE5XSA8PCA4KSB8IGRhdGFbMThdKSk7Ci0JCisKIAkvKiB0cmlnZ2VycyBsZWZ0L3JpZ2h0ICovCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19aLCBkYXRhWzEwXSk7CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWiwgZGF0YVsxMV0pOwotCQorCiAJLyogZGlnaXRhbCBwYWQgKi8KIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDBYLCAhIShkYXRhWzJdICYgMHgwOCkgLSAhIShkYXRhWzJdICYgMHgwNCkpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFksICEhKGRhdGFbMl0gJiAweDAyKSAtICEhKGRhdGFbMl0gJiAweDAxKSk7Ci0JCisKIAkvKiBzdGFydC9iYWNrIGJ1dHRvbnMgYW5kIHN0aWNrIHByZXNzIGxlZnQvcmlnaHQgKi8KIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUQVJULCAoZGF0YVsyXSAmIDB4MTApID4+IDQpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQkFDSywgKGRhdGFbMl0gJiAweDIwKSA+PiA1KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CTCwgKGRhdGFbMl0gJiAweDQwKSA+PiA2KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CUiwgZGF0YVsyXSA+PiA3KTsKLQkKKwogCS8qICJhbmFsb2ciIGJ1dHRvbnMgQSwgQiwgWCwgWSAqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQSwgZGF0YVs0XSk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CLCBkYXRhWzVdKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1gsIGRhdGFbNl0pOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fWSwgZGF0YVs3XSk7Ci0JCisKIAkvKiAiYW5hbG9nIiBidXR0b25zIGJsYWNrLCB3aGl0ZSAqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQywgZGF0YVs4XSk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9aLCBkYXRhWzldKTsKQEAgLTE2OCw3ICsxNjcsNyBAQAogewogCXN0cnVjdCB1c2JfeHBhZCAqeHBhZCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmV0dmFsOwotCQorCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwpAQCAtMTgzLDcgKzE4Miw3IEBACiAJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JCisKIAl4cGFkX3Byb2Nlc3NfcGFja2V0KHhwYWQsIDAsIHhwYWQtPmlkYXRhLCByZWdzKTsKIAogZXhpdDoKQEAgLTE5NiwyNSArMTk1LDE5IEBACiBzdGF0aWMgaW50IHhwYWRfb3BlbiAoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCXN0cnVjdCB1c2JfeHBhZCAqeHBhZCA9IGRldi0+cHJpdmF0ZTsKLQkKLQlpZiAoeHBhZC0+b3Blbl9jb3VudCsrKQotCQlyZXR1cm4gMDsKLQkKKwogCXhwYWQtPmlycV9pbi0+ZGV2ID0geHBhZC0+dWRldjsKLQlpZiAodXNiX3N1Ym1pdF91cmIoeHBhZC0+aXJxX2luLCBHRlBfS0VSTkVMKSkgewotCQl4cGFkLT5vcGVuX2NvdW50LS07CisJaWYgKHVzYl9zdWJtaXRfdXJiKHhwYWQtPmlycV9pbiwgR0ZQX0tFUk5FTCkpCiAJCXJldHVybiAtRUlPOwotCX0KLQkKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB4cGFkX2Nsb3NlIChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHVzYl94cGFkICp4cGFkID0gZGV2LT5wcml2YXRlOwotCQotCWlmICghLS14cGFkLT5vcGVuX2NvdW50KQotCQl1c2Jfa2lsbF91cmIoeHBhZC0+aXJxX2luKTsKKworCXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOwogfQogCiBzdGF0aWMgaW50IHhwYWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTIyNCwxOSArMjE3LDE5IEBACiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pcnFfaW47CiAJY2hhciBwYXRoWzY0XTsKIAlpbnQgaTsKLQkKKwogCWZvciAoaSA9IDA7IHhwYWRfZGV2aWNlW2ldLmlkVmVuZG9yOyBpKyspIHsKIAkJaWYgKChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSB4cGFkX2RldmljZVtpXS5pZFZlbmRvcikgJiYKIAkJICAgIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0geHBhZF9kZXZpY2VbaV0uaWRQcm9kdWN0KSkKIAkJCWJyZWFrOwogCX0KLQkKKwogCWlmICgoeHBhZCA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgdXNiX3hwYWQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQllcnIoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBwYWQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbXNldCh4cGFkLCAwLCBzaXplb2Yoc3RydWN0IHVzYl94cGFkKSk7Ci0JCisKIAl4cGFkLT5pZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgWFBBRF9QS1RfTEVOLAogCQkJCSAgICAgICBTTEFCX0FUT01JQywgJnhwYWQtPmlkYXRhX2RtYSk7CiAJaWYgKCF4cGFkLT5pZGF0YSkgewpAQCAtMjUxLDE4ICsyNDQsMTggQEAKICAgICAgICAgICAgICAgICBrZnJlZSh4cGFkKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAgICAgICAgIH0KLQkKKwogCWVwX2lycV9pbiA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMF0uZGVzYzsKLQkKKwogCXVzYl9maWxsX2ludF91cmIoeHBhZC0+aXJxX2luLCB1ZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGVwX2lycV9pbi0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgeHBhZC0+aWRhdGEsIFhQQURfUEtUX0xFTiwgeHBhZF9pcnFfaW4sCiAJCQkgeHBhZCwgZXBfaXJxX2luLT5iSW50ZXJ2YWwpOwogCXhwYWQtPmlycV9pbi0+dHJhbnNmZXJfZG1hID0geHBhZC0+aWRhdGFfZG1hOwogCXhwYWQtPmlycV9pbi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCisKIAl4cGFkLT51ZGV2ID0gdWRldjsKLQkKKwogCXhwYWQtPmRldi5pZC5idXN0eXBlID0gQlVTX1VTQjsKIAl4cGFkLT5kZXYuaWQudmVuZG9yID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CiAJeHBhZC0+ZGV2LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CkBAIC0yNzMsMjEgKzI2NiwyMSBAQAogCXhwYWQtPmRldi5waHlzID0geHBhZC0+cGh5czsKIAl4cGFkLT5kZXYub3BlbiA9IHhwYWRfb3BlbjsKIAl4cGFkLT5kZXYuY2xvc2UgPSB4cGFkX2Nsb3NlOwotCQorCiAJdXNiX21ha2VfcGF0aCh1ZGV2LCBwYXRoLCA2NCk7CiAJc25wcmludGYoeHBhZC0+cGh5cywgNjQsICAiJXMvaW5wdXQwIiwgcGF0aCk7Ci0JCisKIAl4cGFkLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOwotCQorCiAJZm9yIChpID0gMDsgeHBhZF9idG5baV0gPj0gMDsgaSsrKQogCQlzZXRfYml0KHhwYWRfYnRuW2ldLCB4cGFkLT5kZXYua2V5Yml0KTsKLQkKKwogCWZvciAoaSA9IDA7IHhwYWRfYWJzW2ldID49IDA7IGkrKykgewotCQkKKwogCQlzaWduZWQgc2hvcnQgdCA9IHhwYWRfYWJzW2ldOwotCQkKKwogCQlzZXRfYml0KHQsIHhwYWQtPmRldi5hYnNiaXQpOwotCQkKKwogCQlzd2l0Y2ggKHQpIHsKIAkJCWNhc2UgQUJTX1g6CiAJCQljYXNlIEFCU19ZOgpAQCAtMzEwLDExICszMDMsMTEgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQkKKwogCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmeHBhZC0+ZGV2KTsKLQkKKwogCXByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBvbiAlcyIsIHhwYWQtPmRldi5uYW1lLCBwYXRoKTsKLQkKKwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgeHBhZCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjIsNyArMzE1LDcgQEAKIHN0YXRpYyB2b2lkIHhwYWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX3hwYWQgKnhwYWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQkKKwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJaWYgKHhwYWQpIHsKIAkJdXNiX2tpbGxfdXJiKHhwYWQtPmlycV9pbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCmluZGV4IDJiNzZkZjcuLmQ4M2FkZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgVVNCIE1lZGlhIGRyaXZlcnMKICMKIAotc245YzEwMi1vYmpzCTo9IHNuOWMxMDJfY29yZS5vIHNuOWMxMDJfaHY3MTMxZC5vIHNuOWMxMDJfbWkwMzQzLm8gc245YzEwMl9wYXMxMDZiLm8gc245YzEwMl9wYXMyMDJiY2IubyBzbjljMTAyX3RhczUxMTBjMWIubyBzbjljMTAyX3RhczUxMzBkMWIubworc245YzEwMi1vYmpzCTo9IHNuOWMxMDJfY29yZS5vIHNuOWMxMDJfaHY3MTMxZC5vIHNuOWMxMDJfbWkwMzQzLm8gc245YzEwMl9vdjc2MzAubyBzbjljMTAyX3BhczEwNmIubyBzbjljMTAyX3BhczIwMmJjYi5vIHNuOWMxMDJfdGFzNTExMGMxYi5vIHNuOWMxMDJfdGFzNTEzMGQxYi5vCiAKIG9iai0kKENPTkZJR19VU0JfREFCVVNCKQkrPSBkYWJ1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9EU0JSKQkJKz0gZHNicjEwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmgKaW5kZXggOGI4YTRjOC4uZTVjZWEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaApAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNSBMdWNhIFJpc29saWEiCiAjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMjQiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMjRhIgogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDAsIDI0KQogCiBlbnVtIHNuOWMxMDJfYnJpZGdlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKaW5kZXggMzFkNTc0MC4uY2Y4Y2ZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKQEAgLTQyOSw3ICs0MjksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgCitpbnQKIHNuOWMxMDJfaTJjX3RyeV93cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggYWRkcmVzcywgdTggdmFsdWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX292NzYzMC5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9vdjc2MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdjNWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9vdjc2MzAuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgT1Y3NjMwIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgICAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBvdjc2MzA7CisKKworc3RhdGljIGludCBvdjc2MzBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4MTgpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4MTkpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHg4ZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNSwgMHgzNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNiwgMHgwMyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNywgMHgxYyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxOCwgMHhiZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxOSwgMHgwNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxYSwgMHhmNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxYiwgMHgwNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHg0NCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMywgMHhlZSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNiwgMHhhMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNywgMHg5YSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyOCwgMHgyMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyOSwgMHgzMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyZiwgMHgzZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMCwgMHgyNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMiwgMHg4Nik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2MCwgMHhhOSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2MSwgMHg0Mik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2NSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2OSwgMHgzOCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2ZiwgMHg4OCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MCwgMHgwYik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3NCwgMHgyMSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3ZCwgMHhmNyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjMwX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEwLCBjdHJsLT52YWx1ZSA+PiAyKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3NiwgY3RybC0+dmFsdWUgJiAweDAzKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMywgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDAsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJZXJyICs9IGN0cmwtPnZhbHVlID8gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA1LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3RybC0+dmFsdWUtMSkgfCAweDIwKQorCQkgICAgICAgICAgICAgICAgICAgOiBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDUsIDB4MDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDYsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAzLCBjdHJsLT52YWx1ZSA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWVyciArPSBjdHJsLT52YWx1ZSA/IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0cmwtPnZhbHVlLTEpIHwgMHgyMCkKKwkJICAgICAgICAgICAgICAgICAgIDogc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA0LCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBjLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfV0hJVEVORVNTOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBkLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAoY3RybC0+dmFsdWUgPDwgMikgfCAweDA5KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMywgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDc1LCAweDBlIHwgKGN0cmwtPnZhbHVlIDw8IDcpKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTDoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNSwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfQlJJR0hUX0xFVkVMOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI0LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HQU1NQToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNCwgKGN0cmwtPnZhbHVlIDw8IDIpIHwgMHg4MCk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyZCwgY3RybC0+dmFsdWUgPDwgMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IG92NzYzMF9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJm92NzYzMDsKKwlpbnQgZXJyID0gMDsKKwl1OCB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMTsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG92NzYzMF9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE5KTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG92NzYzMCA9IHsKKwkubmFtZSA9ICJPVjc2MzAiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4MjEsCisJLmluaXQgPSAmb3Y3NjMwX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDE0LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfSFVFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiaHVlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgxZisxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInNhdHVyYXRpb24iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDBmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA4LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJjb250cmFzdCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYrMSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDAwMCwKKwkJCS5tYXhpbXVtID0gMHgzZmYsCisJCQkuc3RlcCA9IDB4MDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDgzPDwyLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4ZmYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4M2EsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibHVlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDc3LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJyaWdodG5lc3MiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweGEwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIndoaXRlIGJhbGFuY2UgYmFja2dyb3VuZDogYmx1ZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MjAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9XSElURU5FU1MsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJ3aGl0ZSBiYWxhbmNlIGJhY2tncm91bmQ6IHJlZCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MjAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJhdXRvIHdoaXRlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQVVUT0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnYWluICYgZXhwb3N1cmUgbW9kZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDMsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9WRkxJUCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gInZlcnRpY2FsIGZsaXAiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxBQ0tfTEVWRUwsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibGFjayBwaXhlbCByYXRpbyIsCisJCQkubWluaW11bSA9IDB4MDEsCisJCQkubWF4aW11bSA9IDB4OWEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4OGEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0JSSUdIVF9MRVZFTCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJyaWdodCBwaXhlbCByYXRpbyIsCisJCQkubWluaW11bSA9IDB4MDEsCisJCQkubWF4aW11bSA9IDB4OWEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAiYmFuZCBmaWx0ZXIiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9HQU1NQSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gInJnYiBnYW1tYSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLnNldF9jdHJsID0gJm92NzYzMF9zZXRfY3RybCwKKwkuY3JvcGNhcCA9IHsKKwkJLmJvdW5kcyA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwkJLmRlZnJlY3QgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJfSwKKwkuc2V0X2Nyb3AgPSAmb3Y3NjMwX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZvdjc2MzBfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfb3Y3NjMwKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJm92NzYzMCk7CisKKwlpZiAobGUxNl90b19jcHUob3Y3NjMwLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjA4ZiAmJgorCSAgICBsZTE2X3RvX2NwdShvdjc2MzAudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDJjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBiLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfc2Vuc29yLmgKaW5kZXggNmE3YWRlYi4uYTQ1MTY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3NlbnNvci5oCkBAIC02NCw2ICs2NCw3IEBACiAqLwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX2h2NzEzMWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX21pMDM0MyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfb3Y3NjMwKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMxMDZiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMyMDJiY2Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3RhczUxMTBjMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwpAQCAtODAsNiArODEsNyBAQAogCSZzbjljMTAyX3Byb2JlX3BhczEwNmIsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgICBcCiAJJnNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gIFwKIAkmc245YzEwMl9wcm9iZV9odjcxMzFkLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gICAgXAorCSZzbjljMTAyX3Byb2JlX292NzYzMCwgLyogZGV0ZWN0aW9uIG1vc3RseSBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLyAgICBcCiAJJnNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovICAgICAgIFwKIAkmc245YzEwMl9wcm9iZV90YXM1MTMwZDFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8gICAgICAgXAogCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDMsNyArMTA1LDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMjkpLCB9LCAvKiBQQVMxMDZCICovICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYSksIH0sIC8qIEhWNzEzMUQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJiKSwgfSwgLyogTUktMDM0MyAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmMpLCB9LCAvKiBPVjc2MjAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYyksIH0sIC8qIE9WNzYzMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJkKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMzApLCB9LCAvKiBNSTAzeCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4MCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDgyKSwgfSwgLyogTUkwMzQzIGFuZCBNSTAzNjAgKi8gICAgICAgICAgICAgIFwKQEAgLTE0NSw2ICsxNDgsOCBAQAogKi8KIAogLyogVGhlICJ0cnkiIEkyQyBJL08gdmVyc2lvbnMgYXJlIHVzZWQgd2hlbiBwcm9iaW5nIHRoZSBzZW5zb3IgKi8KK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSosc3RydWN0IHNuOWMxMDJfc2Vuc29yKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKIGV4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKixzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzKTsKIApAQCAtMjAxLDYgKzIwNiw4IEBACiAJU045QzEwMl9JMkNfM1dJUkVTLAogfTsKIAorI2RlZmluZSBTTjlDMTAyX01BWF9DVFJMUyBWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRSsxMAorCiBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgewogCWNoYXIgbmFtZVszMl0sIC8qIHNlbnNvciBuYW1lICovCiAJICAgICBtYWludGFpbmVyWzY0XTsgLyogbmFtZSBvZiB0aGUgbWFudGFpbmVyIDxlbWFpbD4gKi8KQEAgLTI0Myw3ICsyNTAsNyBAQAogCSAgIHNlbnNvciBhY2NvcmRpbmcgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIGJlbG93LgogCSovCiAKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWN0cmxbVjRMMl9DSURfTEFTVFAxLVY0TDJfQ0lEX0JBU0VdOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybFtTTjlDMTAyX01BWF9DVFJMU107CiAJLyoKIAkgICBPcHRpb25hbCBsaXN0IG9mIGRlZmF1bHQgY29udHJvbHMsIGRlZmluZWQgYXMgaW5kaWNhdGVkIGluIHRoZSAKIAkgICBWNEwyIEFQSS4gTWVudSB0eXBlIGNvbnRyb2xzIGFyZSBub3QgaGFuZGxlZCBieSB0aGlzIGludGVyZmFjZS4KQEAgLTM1Niw3ICszNjMsNyBAQAogCSAgIGNvcmUgbW9kdWxlIHRvIHN0b3JlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHZhbHVlcyBvZiB0aGUgYWJvdmUKIAkgICBzZXR0aW5ncywgZm9yIHJvbGxiYWNrcy4uZXRjLi5pbiBjYXNlIG9mIGVycm9ycyBkdXJpbmcgYXRvbWljIEkvTwogCSovCi0Jc3RydWN0IHY0bDJfcXVlcnljdHJsIF9xY3RybFtWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRV07CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIF9xY3RybFtTTjlDMTAyX01BWF9DVFJMU107CiAJc3RydWN0IHY0bDJfcmVjdCBfcmVjdDsKIH07CiAKQEAgLTM2Nyw1ICszNzQsOCBAQAogI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMQogI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIKICNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMworI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0dBTU1BIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUiBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1CisjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfQlJJR0hUX0xFVkVMIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYKIAogI2VuZGlmIC8qIF9TTjlDMTAyX1NFTlNPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTEwYzFiLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwppbmRleCA2OTBkNjIxLi44Nzc1OTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwpAQCAtMjQsOCArMjQsNiBAQAogCiBzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWI7CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHRhczUxMTBjMWJfZ2FpbjsKLQogCiBzdGF0aWMgaW50IHRhczUxMTBjMWJfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKQEAgLTQ2LDIxICs0NCw2IEBACiB9CiAKIAotc3RhdGljIGludCB0YXM1MTEwYzFiX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQotewotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWN0cmwtPnZhbHVlID0gdGFzNTExMGMxYl9nYWluLnZhbHVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgaW50IHRhczUxMTBjMWJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCiB7CkBAIC02OCw4ICs1MSw3IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMTBjMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0Nyw3ICsxMjksNiBAQAogCQkJLmhlaWdodCA9IDI4OCwKIAkJfSwKIAl9LAotCS5nZXRfY3RybCA9ICZ0YXM1MTEwYzFiX2dldF9jdHJsLAogCS5zZXRfY3JvcCA9ICZ0YXM1MTEwYzFiX3NldF9jcm9wLAogCS5waXhfZm9ybWF0ID0gewogCQkud2lkdGggPSAzNTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMzBkMWIuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCmluZGV4IGIzNzhlOTQuLjkyN2VhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCkBAIC0yNCw4ICsyNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTEzMGQxYjsKIAotc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdGFzNTEzMGQxYl9nYWluLCB0YXM1MTMwZDFiX2V4cG9zdXJlOwotCiAKIHN0YXRpYyBpbnQgdGFzNTEzMGQxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewpAQCAtNDQsMjQgKzQyLDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHRhczUxMzBkMWJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCi17Ci0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJY3RybC0+dmFsdWUgPSB0YXM1MTMwZDFiX2dhaW4udmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWN0cmwtPnZhbHVlID0gdGFzNTEzMGQxYl9leHBvc3VyZS52YWx1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIGludCB0YXM1MTMwZDFiX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQogewpAQCAtNjksMTIgKzQ5LDEwIEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMzBkMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDQwLCAweDQ3IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMzBkMWJfZXhwb3N1cmUudmFsdWUgPSBjdHJsLT52YWx1ZTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg0MCwgMHg0NyAtIGN0cmwtPnZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDcsNyArMTI1LDYgQEAKIAkJCS5mbGFncyA9IDAsCiAJCX0sCiAJfSwKLQkuZ2V0X2N0cmwgPSAmdGFzNTEzMGQxYl9nZXRfY3RybCwKIAkuc2V0X2N0cmwgPSAmdGFzNTEzMGQxYl9zZXRfY3RybCwKIAkuY3JvcGNhcCA9IHsKIAkJLmJvdW5kcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMKaW5kZXggYWU0NTVjOC4uNzM5OGE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMKQEAgLTEzNzUsOSArMTM3NSwxMyBAQAogCSAgICAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX1BFTkNBTV9QUk9EVUNUX0lEKSkgewogCQljYW1lcmFfbmFtZSA9ICJTVFYwNjgwIjsKIAkJUERFQlVHICgwLCAiU1RWKGkpOiBTVFYwNjgwIGNhbWVyYSBmb3VuZC4iKTsKKwl9IGVsc2UgaWYgKChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IFVTQl9DUkVBVElWRUdPTUlOSV9WRU5ET1JfSUQpICYmCisJCSAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfQ1JFQVRJVkVHT01JTklfUFJPRFVDVF9JRCkpIHsKKwkJY2FtZXJhX25hbWUgPSAiQ3JlYXRpdmUgV2ViQ2FtIEdvIE1pbmkiOworCQlQREVCVUcgKDAsICJTVFYoaSk6IENyZWF0aXZlIFdlYkNhbSBHbyBNaW5pIGZvdW5kLiIpOwogCX0gZWxzZSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogVmVuZG9yL1Byb2R1Y3QgSUQgZG8gbm90IG1hdGNoIFNUVjA2ODAgdmFsdWVzLiIpOwotCQlQREVCVUcgKDAsICJTVFYoZSk6IENoZWNrIHRoYXQgdGhlIFNUVjA2ODAgY2FtZXJhIGlzIGNvbm5lY3RlZCB0byB0aGUgY29tcHV0ZXIuIik7CisJCVBERUJVRyAoMCwgIlNUVihlKTogVmVuZG9yL1Byb2R1Y3QgSUQgZG8gbm90IG1hdGNoIFNUVjA2ODAgb3IgQ3JlYXRpdmUgV2ViQ2FtIEdvIE1pbmkgdmFsdWVzLiIpOworCQlQREVCVUcgKDAsICJTVFYoZSk6IENoZWNrIHRoYXQgdGhlIFNUVjA2ODAgb3IgQ3JlYXRpdmUgV2ViQ2FtIEdvIE1pbmkgY2FtZXJhIGlzIGNvbm5lY3RlZCB0byB0aGUgY29tcHV0ZXIuIik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaAppbmRleCA3ZTBlMzE0ZC4uNDQ1OTQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmgKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmgKQEAgLTQxLDEyICs0MSwxNyBAQAogCiAjZGVmaW5lIFVTQl9QRU5DQU1fVkVORE9SX0lECTB4MDU1MwogI2RlZmluZSBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQJMHgwMjAyCisKKyNkZWZpbmUgVVNCX0NSRUFUSVZFR09NSU5JX1ZFTkRPUl9JRAkweDA0MWUKKyNkZWZpbmUgVVNCX0NSRUFUSVZFR09NSU5JX1BST0RVQ1RfSUQJMHg0MDA3CisKICNkZWZpbmUgUEVOQ0FNX1RJTUVPVVQgICAgICAgICAgMTAwMAogLyogZm10IDQgKi8KICNkZWZpbmUgU1RWX1ZJREVPX1BBTEVUVEUgICAgICAgVklERU9fUEFMRVRURV9SR0IyNAogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UgKFVTQl9QRU5DQU1fVkVORE9SX0lELCBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQpfSwKKwl7VVNCX0RFVklDRSAoVVNCX0NSRUFUSVZFR09NSU5JX1ZFTkRPUl9JRCwgVVNCX0NSRUFUSVZFR09NSU5JX1BST0RVQ1RfSUQpfSwKIAl7fQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZGV2aWNlX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCAzYTg5Njk1Li42NjQ5NTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0xMzksNiArMTM5LDE2IEBACiAKIHNvdXJjZSAiZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2EvS2NvbmZpZyIKIAorY29uZmlnIFVTQl9MRAorCXRyaXN0YXRlICJVU0IgTEQgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciBnZW5lcmljIFVTQiBkZXZpY2VzIHRoYXQgdXNlIGludGVycnVwdCB0cmFuc2ZlcnMsCisJICBsaWtlIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxkdXNiLgorCiBjb25maWcgVVNCX1RFU1QKIAl0cmlzdGF0ZSAiVVNCIHRlc3RpbmcgZHJpdmVyIChERVZFTE9QTUVOVCkiCiAJZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKaW5kZXggNGEzODE0Yy4uODYyZTQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX1VTQl9FTUk2MikJCSs9IGVtaTYyLm8KIG9iai0kKENPTkZJR19VU0JfSURNT1VTRSkJKz0gaWRtb3VzZS5vCiBvYmotJChDT05GSUdfVVNCX0xDRCkJCSs9IHVzYmxjZC5vCitvYmotJChDT05GSUdfVVNCX0xEKQkJKz0gbGR1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9MRUQpCQkrPSB1c2JsZWQubwogb2JqLSQoQ09ORklHX1VTQl9MRUdPVE9XRVIpCSs9IGxlZ291c2J0b3dlci5vCiBvYmotJChDT05GSUdfVVNCX1BISURHRVRLSVQpCSs9IHBoaWRnZXRraXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwppbmRleCBjZTAzMGQxLi43MzNhY2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIFNpZW1lbnMgSUQgTW91c2UgZHJpdmVyIHYwLjUKKy8qIFNpZW1lbnMgSUQgTW91c2UgZHJpdmVyIHYwLjYKIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xMSw2ICsxMSw5IEBACiAgIERlcml2ZWQgZnJvbSB0aGUgVVNCIFNrZWxldG9uIGRyaXZlciAxLjEsCiAgIENvcHlyaWdodCAoQykgMjAwMyBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogCisgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgTWFydGluIFJlaXNpbmcKKyAgPE1hcnRpbi5SZWlzaW5nQG5hdHVyYWwtY29tcHV0aW5nLmRlPgorCiAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0yNSwyOSArMjgsNDQgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCisvKiBpbWFnZSBjb25zdGFudHMgKi8KICNkZWZpbmUgV0lEVEggMjI1Ci0jZGVmaW5lIEhFSUdIVCAyODgKLSNkZWZpbmUgSEVBREVSICJQNSAyMjUgMjg4IDI1NSAiCisjZGVmaW5lIEhFSUdIVCAyODkKKyNkZWZpbmUgSEVBREVSICJQNSAyMjUgMjg5IDI1NSAiCiAjZGVmaW5lIElNR1NJWkUgKChXSURUSCAqIEhFSUdIVCkgKyBzaXplb2YoSEVBREVSKS0xKQogCi0vKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjUiCisvKiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjYiCiAjZGVmaW5lIERSSVZFUl9TSE9SVCAgICJpZG1vdXNlIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICAiRmxvcmlhbiAnRmxvZScgRWNodGxlciA8ZWNodGxlckBmcy50dW0uZGU+IgogI2RlZmluZSBEUklWRVJfREVTQyAgICAiU2llbWVucyBJRCBNb3VzZSBGaW5nZXJUSVAgU2Vuc29yIERyaXZlciIKIAotLyogU2llbWVucyBJRCBNb3VzZSAqLwotI2RlZmluZSBVU0JfSURNT1VTRV9WRU5ET1JfSUQgIDB4MDY4MQotI2RlZmluZSBVU0JfSURNT1VTRV9QUk9EVUNUX0lEIDB4MDAwNQotCi0vKiB3ZSBzdGlsbCBuZWVkIGEgbWlub3IgbnVtYmVyICovCisvKiBtaW5vciBudW1iZXIgZm9yIG1pc2MgVVNCIGRldmljZXMgKi8KICNkZWZpbmUgVVNCX0lETU9VU0VfTUlOT1JfQkFTRSAxMzIKIAorLyogdmVuZG9yIGFuZCBkZXZpY2UgSURzICovCisjZGVmaW5lIElEX1NJRU1FTlMgMHgwNjgxCisjZGVmaW5lIElEX0lETU9VU0UgMHgwMDA1CisjZGVmaW5lIElEX0NIRVJSWSAgMHgwMDEwCisKKy8qIGRldmljZSBJRCB0YWJsZSAqLwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkbW91c2VfdGFibGVbXSA9IHsKLQl7VVNCX0RFVklDRShVU0JfSURNT1VTRV9WRU5ET1JfSUQsIFVTQl9JRE1PVVNFX1BST0RVQ1RfSUQpfSwKLQl7fSAvKiBudWxsIGVudHJ5IGF0IHRoZSBlbmQgKi8KKwl7VVNCX0RFVklDRShJRF9TSUVNRU5TLCBJRF9JRE1PVVNFKX0sIC8qIFNpZW1lbnMgSUQgTW91c2UgKFByb2Zlc3Npb25hbCkgKi8KKwl7VVNCX0RFVklDRShJRF9TSUVNRU5TLCBJRF9DSEVSUlkgKX0sIC8qIENoZXJyeSBGaW5nZXJUSVAgSUQgQm9hcmQgICAgICAgKi8KKwl7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0aW5nIG51bGwgZW50cnkgICAgICAgICAgKi8KIH07CiAKKy8qIHNlbnNvciBjb21tYW5kcyAqLworI2RlZmluZSBGVElQX1JFU0VUICAgMHgyMAorI2RlZmluZSBGVElQX0FDUVVJUkUgMHgyMQorI2RlZmluZSBGVElQX1JFTEVBU0UgMHgyMgorI2RlZmluZSBGVElQX0JMSU5LICAgMHgyMyAgLyogTFNCIG9mIHZhbHVlID0gYmxpbmsgcHVsc2Ugd2lkdGggKi8KKyNkZWZpbmUgRlRJUF9TQ1JPTEwgIDB4MjQKKworI2RlZmluZSBmdGlwX2NvbW1hbmQoZGV2LCBjb21tYW5kLCB2YWx1ZSwgaW5kZXgpIFwKKwl1c2JfY29udHJvbF9tc2cgKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLCBjb21tYW5kLCBcCisJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9PVVQsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCkKKwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkbW91c2VfdGFibGUpOwogCiAvKiBzdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLwpAQCAtNTcsNyArNzUsOCBAQAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7IC8qIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgZGV2aWNlICovCiAKIAl1bnNpZ25lZCBjaGFyICpidWxrX2luX2J1ZmZlcjsgLyogdGhlIGJ1ZmZlciB0byByZWNlaXZlIGRhdGEgKi8KLQlzaXplX3QgYnVsa19pbl9zaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIgKi8KKwlzaXplX3QgYnVsa19pbl9zaXplOyAvKiB0aGUgbWF4aW11bSBidWxrIHBhY2tldCBzaXplICovCisJc2l6ZV90IG9yaWdfYmlfc2l6ZTsgLyogc2FtZSBhcyBhYm92ZSwgYnV0IHJlcG9ydGVkIGJ5IHRoZSBkZXZpY2UgKi8KIAlfX3U4IGJ1bGtfaW5fZW5kcG9pbnRBZGRyOyAvKiB0aGUgYWRkcmVzcyBvZiB0aGUgYnVsayBpbiBlbmRwb2ludCAqLwogCiAJaW50IG9wZW47IC8qIGlmIHRoZSBwb3J0IGlzIG9wZW4gb3Igbm90ICovCkBAIC0xMDMsNyArMTIyLDcgQEAKIAkuaWRfdGFibGUgPSBpZG1vdXNlX3RhYmxlLAogfTsKIAotLy8gcHJldmVudCByYWNlcyBiZXR3ZWVuIG9wZW4oKSBhbmQgZGlzY29ubmVjdCgpCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KIHN0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKIAogc3RhdGljIGludCBpZG1vdXNlX2NyZWF0ZV9pbWFnZShzdHJ1Y3QgdXNiX2lkbW91c2UgKmRldikKQEAgLTExMiw0MiArMTMxLDM0IEBACiAJaW50IGJ1bGtfcmVhZCA9IDA7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoZGV2LT5idWxrX2luX3NpemUgPCBzaXplb2YoSEVBREVSKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1jcHkoZGV2LT5idWxrX2luX2J1ZmZlcixIRUFERVIsc2l6ZW9mKEhFQURFUiktMSk7CisJbWVtY3B5KGRldi0+YnVsa19pbl9idWZmZXIsIEhFQURFUiwgc2l6ZW9mKEhFQURFUiktMSk7CiAJYnl0ZXNfcmVhZCArPSBzaXplb2YoSEVBREVSKS0xOwogCi0JLyogRHVtcCB0aGUgc2V0dXAgcGFja2V0cy4gWWVzLCB0aGV5IGFyZSB1bmNvbW1lbnRlZCwgc2ltcGx5IAotCSAgIGJlY2F1c2UgdGhleSB3ZXJlIHNuaWZmZWQgdW5kZXIgV2luZG93cyB1c2luZyBTbm9vcHlQcm8uCi0JICAgSSBfZ3Vlc3NfIHRoYXQgMHgyMiBpcyBhIGtpbmQgb2YgcmVzZXQgY29tbWFuZCBhbmQgMHgyMSAKLQkgICBtZWFucyBpbml0Li4KLQkqLwotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCQkJMHgyMSwgMHg0MiwgMHgwMDAxLCAweDAwMDIsIE5VTEwsIDAsIDEwMDApOworCS8qIHJlc2V0IHRoZSBkZXZpY2UgYW5kIHNldCBhIGZhc3QgYmxpbmsgcmF0ZSAqLworCXJlc3VsdCA9IGZ0aXBfY29tbWFuZChkZXYsIEZUSVBfUkVMRUFTRSwgMCwgMCk7CiAJaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIwLCAweDQyLCAweDAwMDEsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7CisJCWdvdG8gcmVzZXQ7CisJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9CTElOSywgICAxLCAwKTsKIAlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLAotCQkJCTB4MjIsIDB4NDIsIDB4MDAwMCwgMHgwMDAyLCBOVUxMLCAwLCAxMDAwKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKKwkJZ290byByZXNldDsKIAotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCQkJMHgyMSwgMHg0MiwgMHgwMDAxLCAweDAwMDIsIE5VTEwsIDAsIDEwMDApOworCS8qIGluaXRpYWxpemUgdGhlIHNlbnNvciAtIHNlbmRpbmcgdGhpcyBjb21tYW5kIHR3aWNlICovCisJLyogc2lnbmlmaWNhbnRseSByZWR1Y2VzIHRoZSByYXRlIG9mIGZhaWxlZCByZWFkcyAgICAgKi8KKwlyZXN1bHQgPSBmdGlwX2NvbW1hbmQoZGV2LCBGVElQX0FDUVVJUkUsIDAsIDApOwogCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OwotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCQkJMHgyMCwgMHg0MiwgMHgwMDAxLCAweDAwMDIsIE5VTEwsIDAsIDEwMDApOworCQlnb3RvIHJlc2V0OworCXJlc3VsdCA9IGZ0aXBfY29tbWFuZChkZXYsIEZUSVBfQUNRVUlSRSwgMCwgMCk7CiAJaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIwLCAweDQyLCAweDAwMDAsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7CisJCWdvdG8gcmVzZXQ7CisKKwkvKiBzdGFydCB0aGUgcmVhZG91dCAtIHNlbmRpbmcgdGhpcyBjb21tYW5kIHR3aWNlICovCisJLyogcHJlc3VtYWJseSBlbmFibGVzIHRoZSBoaWdoIGR5bmFtaWMgcmFuZ2UgbW9kZSAqLworCXJlc3VsdCA9IGZ0aXBfY29tbWFuZChkZXYsIEZUSVBfUkVTRVQsICAgMCwgMCk7CiAJaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7CisJCWdvdG8gcmVzZXQ7CisJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9SRVNFVCwgICAwLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byByZXNldDsKIAogCS8qIGxvb3Agb3ZlciBhIGJsb2NraW5nIGJ1bGsgcmVhZCB0byBnZXQgZGF0YSBmcm9tIHRoZSBkZXZpY2UgKi8KIAl3aGlsZSAoYnl0ZXNfcmVhZCA8IElNR1NJWkUpIHsKQEAgLTE1NSwyMiArMTY2LDQwIEBACiAJCQkJdXNiX3JjdmJ1bGtwaXBlIChkZXYtPnVkZXYsIGRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIpLAogCQkJCWRldi0+YnVsa19pbl9idWZmZXIgKyBieXRlc19yZWFkLAogCQkJCWRldi0+YnVsa19pbl9zaXplLCAmYnVsa19yZWFkLCA1MDAwKTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVJTlRSOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLyogTWF5YmUgdGhpcyBlcnJvciB3YXMgY2F1c2VkIGJ5IHRoZSBpbmNyZWFzZWQgcGFja2V0IHNpemU/ICovCisJCQkvKiBSZXNldCB0byB0aGUgb3JpZ2luYWwgdmFsdWUgYW5kIHRlbGwgdXNlcnNwYWNlIHRvIHJldHJ5LiAgKi8KKwkJCWlmIChkZXYtPmJ1bGtfaW5fc2l6ZSAhPSBkZXYtPm9yaWdfYmlfc2l6ZSkgeworCQkJCWRldi0+YnVsa19pbl9zaXplID0gZGV2LT5vcmlnX2JpX3NpemU7CisJCQkJcmVzdWx0ID0gLUVBR0FJTjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmVzdWx0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KIAkJYnl0ZXNfcmVhZCArPSBidWxrX3JlYWQ7CiAJfQogCiAJLyogcmVzZXQgdGhlIGRldmljZSAqLwotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCQkJMHgyMiwgMHg0MiwgMHgwMDAwLCAweDAwMDIsIE5VTEwsIDAsIDEwMDApOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OworcmVzZXQ6CisJZnRpcF9jb21tYW5kKGRldiwgRlRJUF9SRUxFQVNFLCAwLCAwKTsKIAotCS8qIHNob3VsZCBiZSBJTUdTSVpFID09IDY0ODE1ICovCisJLyogY2hlY2sgZm9yIHZhbGlkIGltYWdlICovCisJLyogcmlnaHQgYm9yZGVyIHNob3VsZCBiZSBibGFjayAoMHgwMCkgKi8KKwlmb3IgKGJ5dGVzX3JlYWQgPSBzaXplb2YoSEVBREVSKS0xICsgV0lEVEgtMTsgYnl0ZXNfcmVhZCA8IElNR1NJWkU7IGJ5dGVzX3JlYWQgKz0gV0lEVEgpCisJCWlmIChkZXYtPmJ1bGtfaW5fYnVmZmVyW2J5dGVzX3JlYWRdICE9IDB4MDApCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIGxvd2VyIGJvcmRlciBzaG91bGQgYmUgd2hpdGUgKDB4RkYpICovCisJZm9yIChieXRlc19yZWFkID0gSU1HU0laRS1XSURUSDsgYnl0ZXNfcmVhZCA8IElNR1NJWkUtMTsgYnl0ZXNfcmVhZCsrKQorCQlpZiAoZGV2LT5idWxrX2luX2J1ZmZlcltieXRlc19yZWFkXSAhPSAweEZGKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzaG91bGQgYmUgSU1HU0laRSA9PSA2NTA0MCAqLwogCWRiZygicmVhZCAlZCBieXRlcyBmaW5nZXJwcmludCBkYXRhIiwgYnl0ZXNfcmVhZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGlkbW91c2VfZGVsZXRlKHN0cnVjdCB1c2JfaWRtb3VzZSAqZGV2KQpAQCAtMjgyLDEwICszMTEsMTAgQEAKIAogCWRldiA9IChzdHJ1Y3QgdXNiX2lkbW91c2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0JLy8gbG9jayB0aGlzIG9iamVjdAorCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KIAlkb3duICgmZGV2LT5zZW0pOwogCi0JLy8gdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCiAJaWYgKCFkZXYtPnByZXNlbnQpIHsKIAkJdXAgKCZkZXYtPnNlbSk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjk2LDggKzMyNSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChjb3VudCA+IElNR1NJWkUgLSAqcHBvcykKLQkJY291bnQgPSBJTUdTSVpFIC0gKnBwb3M7CisJY291bnQgPSBtaW4gKChsb2ZmX3QpY291bnQsIElNR1NJWkUgLSAoKnBwb3MpKTsKIAogCWlmIChjb3B5X3RvX3VzZXIgKGJ1ZmZlciwgZGV2LT5idWxrX2luX2J1ZmZlciArICpwcG9zLCBjb3VudCkpIHsKIAkJcmVzdWx0ID0gLUVGQVVMVDsKQEAgLTMwNiw3ICszMzQsNyBAQAogCQkqcHBvcyArPSBjb3VudDsKIAl9CiAKLQkvLyB1bmxvY2sgdGhlIGRldmljZSAKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLwogCXVwKCZkZXYtPnNlbSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTMxOCw3ICszNDYsNiBAQAogCXN0cnVjdCB1c2JfaWRtb3VzZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7Ci0Jc2l6ZV90IGJ1ZmZlcl9zaXplOwogCWludCByZXN1bHQ7CiAKIAkvKiBjaGVjayBpZiB3ZSBoYXZlIGdvdHRlbiB0aGUgZGF0YSBvciB0aGUgaGlkIGludGVyZmFjZSAqLwpAQCAtMzQ0LDExICszNzEsMTEgQEAKIAkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKIAogCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KLQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCQlkZXYtPmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQlkZXYtPm9yaWdfYmlfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCWRldi0+YnVsa19pbl9zaXplID0gMHgyMDA7IC8qIHdvcmtzIF9tdWNoXyBmYXN0ZXIgKi8KIAkJZGV2LT5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQlkZXYtPmJ1bGtfaW5fYnVmZmVyID0KLQkJCWttYWxsb2MoSU1HU0laRSArIGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWttYWxsb2MoSU1HU0laRSArIGRldi0+YnVsa19pbl9zaXplLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpIHsKIAkJCWVycigiVW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGJ1ZmZlci4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmVjODgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCkBAIC0wLDAgKzEsNzk0IEBACisvKioKKyAqIEdlbmVyaWMgVVNCIGRyaXZlciBmb3IgcmVwb3J0IGJhc2VkIGludGVycnVwdCBpbi9vdXQgZGV2aWNlcworICogbGlrZSBMRCBEaWRhY3RpYydzIFVTQiBkZXZpY2VzLiBMRCBEaWRhY3RpYydzIFVTQiBkZXZpY2VzIGFyZQorICogSElEIGRldmljZXMgd2hpY2ggZG8gbm90IHVzZSBISUQgcmVwb3J0IGRlZmluaXRvbnMgKHRoZXkgdXNlCisgKiByYXcgaW50ZXJydXB0IGluIGFuZCBvdXIgcmVwb3J0cyBvbmx5IGZvciBjb21tdW5pY2F0aW9uKS4KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIGEgcmluZyBidWZmZXIgZm9yIHRpbWUgY3JpdGljYWwgcmVhZGluZyBvZgorICogaW50ZXJydXB0IGluIHJlcG9ydHMgYW5kIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMgZm9yCisgKiByYXcgaW50ZXJydXB0IHJlcG9ydHMgKHNpbWlsYXIgdG8gdGhlIFdpbmRvd3MgSElEIGRyaXZlcikuCisgKiBEZXZpY2VzIGJhc2VkIG9uIHRoZSBib29rIFVTQiBDT01QTEVURSBieSBKYW4gQXhlbHNvbiBtYXkgbmVlZAorICogc3VjaCBhIGNvbXBhdGliaWxpdHkgdG8gdGhlIFdpbmRvd3MgSElEIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBIdW5kIDxtaHVuZEBsZC1kaWRhY3RpYy5kZT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIERlcml2ZWQgZnJvbSBMZWdvIFVTQiBUb3dlciBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBHbGFuY2UgPGFkdmlkZ3NmQHNvdXJjZWZvcmdlLm5ldD4KKyAqCQkgMjAwMS0yMDA0IEp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogVjAuMSAgKG1oKSBJbml0aWFsIHZlcnNpb24KKyAqIFYwLjExIChtaCkgQWRkZWQgcmF3IHN1cHBvcnQgZm9yIEhJRCAxLjAgZGV2aWNlcyAobm8gaW50ZXJydXB0IG91dCBlbmRwb2ludCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMgKi8KKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MRAkJMHgwZjExCS8qIFVTQiBWZW5kb3IgSUQgb2YgTEQgRGlkYWN0aWMgR21iSCAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NBU1NZCQkweDEwMDAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIGFsbCBDQVNTWS1TIG1vZHVsZXMgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QT0NLRVRDQVNTWQkweDEwMTAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIFBvY2tldC1DQVNTWSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZCTB4MTAyMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgTW9iaWxlLUNBU1NZICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfSldNCQkweDEwODAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIEpvdWxlIGFuZCBXYXR0bWV0ZXIgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ETU1QCQkweDEwODEJLyogVVNCIFByb2R1Y3QgSUQgZm9yIERpZ2l0YWwgTXVsdGltZXRlciBQIChyZXNlcnZlZCkgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VTUlQCQkweDEwOTAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIFVNSSBQICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVklERU9DT00JCTB4MTIwMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgVmlkZW9Db20gKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DT00zTEFCCQkweDIwMDAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIENPTTNMQUIgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9URUxFUE9SVAkJMHgyMDEwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBUZXJtaW5hbCBBZGFwdGVyICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkVUV09SS0FOQUxZU0VSCTB4MjAyMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgTmV0d29yayBBbmFseXNlciAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSQ09OVFJPTAkweDIwMzAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIENvbnRyb2xsaW5nIGRldmljZSBmb3IgUG93ZXIgRWxlY3Ryb25pY3MgKi8KKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1ZFUk5JRVIJCTB4MDhmNworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPCTB4MDAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfR09URU1QCTB4MDAwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUAkweDAwMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMJMHgwMDA0CisKKworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgVVNCX0xEX01JTk9SX0JBU0UJMAorI2Vsc2UKKyNkZWZpbmUgVVNCX0xEX01JTk9SX0JBU0UJMTc2CisjZW5kaWYKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGxkX3VzYl90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9DQVNTWSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9QT0NLRVRDQVNTWSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9NT0JJTEVDQVNTWSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9KV00pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfRE1NUCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9VTUlQKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1ZJREVPQ09NKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0NPTTNMQUIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVEVMRVBPUlQpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTkVUV09SS0FOQUxZU0VSKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1BPV0VSQ09OVFJPTCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVApIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVApIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBsZF91c2JfdGFibGUpOworTU9EVUxFX1ZFUlNJT04oIlYwLjExIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bmQgPG1odW5kQGxkLWRpZGFjdGljLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMRCBVU0IgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTEQgVVNCIERldmljZXMiKTsKKworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKKwlzdGF0aWMgaW50IGRlYnVnID0gMTsKKyNlbHNlCisJc3RhdGljIGludCBkZWJ1ZyA9IDA7CisjZW5kaWYKKworLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjZGVmaW5lIGRiZ19pbmZvKGRldiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCisvKiBBbGwgaW50ZXJydXB0IGluIHRyYW5zZmVycyBhcmUgY29sbGVjdGVkIGluIGEgcmluZyBidWZmZXIgdG8KKyAqIGF2b2lkIHJhY2luZyBjb25kaXRpb25zIGFuZCBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIG9mIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgcmluZ19idWZmZXJfc2l6ZSA9IDEyODsKK21vZHVsZV9wYXJhbShyaW5nX2J1ZmZlcl9zaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyaW5nX2J1ZmZlcl9zaXplLCAiUmVhZCByaW5nIGJ1ZmZlciBzaXplIGluIHJlcG9ydHMiKTsKKworLyogVGhlIHdyaXRlX2J1ZmZlciBjYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIGludGVycnVwdCBvdXQgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyX3NpemUgPSAxMDsKK21vZHVsZV9wYXJhbSh3cml0ZV9idWZmZXJfc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfYnVmZmVyX3NpemUsICJXcml0ZSBidWZmZXIgc2l6ZSBpbiByZXBvcnRzIik7CisKKy8qIEFzIG9mIGtlcm5lbCB2ZXJzaW9uIDIuNi40IGVoY2ktaGNkIHVzZXMgYW4KKyAqICJvbmx5IG9uZSBpbnRlcnJ1cHQgdHJhbnNmZXIgcGVyIGZyYW1lIiBzaG9ydGN1dAorICogdG8gc2ltcGxpZnkgdGhlIHNjaGVkdWxpbmcgb2YgcGVyaW9kaWMgdHJhbnNmZXJzLgorICogVGhpcyBjb25mbGljdHMgd2l0aCBvdXIgc3RhbmRhcmQgMW1zIGludGVydmFscyBmb3IgaW4gYW5kIG91dCBVUkJzLgorICogV2UgdXNlIGRlZmF1bHQgaW50ZXJ2YWxzIG9mIDJtcyBmb3IgaW4gYW5kIDJtcyBmb3Igb3V0IHRyYW5zZmVycywKKyAqIHdoaWNoIHNob3VsZCBiZSBmYXN0IGVub3VnaC4KKyAqIEluY3JlYXNlIHRoZSBpbnRlcnZhbCB0byBhbGxvdyBtb3JlIGRldmljZXMgdGhhdCBkbyBpbnRlcnJ1cHQgdHJhbnNmZXJzLAorICogb3Igc2V0IHRvIDEgdG8gdXNlIHRoZSBzdGFuZGFyZCBpbnRlcnZhbCBmcm9tIHRoZSBlbmRwb2ludCBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIGludCBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID0gMjsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgaW4gaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA9IDI7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgb3V0IGludGVydmFsIGluIG1zIik7CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCitzdHJ1Y3QgbGRfdXNiIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJCS8qIGxvY2tzIHRoaXMgc3RydWN0dXJlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UqCWludGY7CQkvKiBzYXZlIG9mZiB0aGUgdXNiIGludGVyZmFjZSBwb2ludGVyICovCisKKwlpbnQJCQlvcGVuX2NvdW50OwkvKiBudW1iZXIgb2YgdGltZXMgdGhpcyBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLworCisJY2hhcioJCQlyaW5nX2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQJCXJpbmdfaGVhZDsKKwl1bnNpZ25lZCBpbnQJCXJpbmdfdGFpbDsKKworCXdhaXRfcXVldWVfaGVhZF90CXJlYWRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0OworCisJY2hhcioJCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X2luX2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfaW5fdXJiOworCWludAkJCWludGVycnVwdF9pbl9pbnRlcnZhbDsKKwlzaXplX3QJCQlpbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fcnVubmluZzsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fZG9uZTsKKworCWNoYXIqCQkJaW50ZXJydXB0X291dF9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfb3V0X2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfb3V0X3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2ludGVydmFsOworCXNpemVfdAkJCWludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2J1c3k7Cit9OworCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGxkX3VzYl9kcml2ZXI7CisKKy8qKgorICoJbGRfdXNiX2Fib3J0X3RyYW5zZmVycworICogICAgICBhYm9ydHMgdHJhbnNmZXJzIGFuZCBmcmVlcyBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcworICovCitzdGF0aWMgdm9pZCBsZF91c2JfYWJvcnRfdHJhbnNmZXJzKHN0cnVjdCBsZF91c2IgKmRldikKK3sKKwkvKiBzaHV0ZG93biB0cmFuc2ZlciAqLworCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nKSB7CisJCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAwOworCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKK30KKworLyoqCisgKglsZF91c2JfZGVsZXRlCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9kZWxldGUoc3RydWN0IGxkX3VzYiAqZGV2KQoreworCWxkX3VzYl9hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKworCS8qIGZyZWUgZGF0YSBzdHJ1Y3R1cmVzICovCisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworCWtmcmVlKGRldi0+cmluZ19idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CisJa2ZyZWUoZGV2KTsKK30KKworLyoqCisgKglsZF91c2JfaW50ZXJydXB0X2luX2NhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9pbnRlcnJ1cHRfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXYgPSB1cmItPmNvbnRleHQ7CisJc2l6ZV90ICphY3R1YWxfYnVmZmVyOworCXVuc2lnbmVkIGludCBuZXh0X3JpbmdfaGVhZDsKKwlpbnQgcmV0dmFsOworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikgeworCQkJZ290byBleGl0OworCQl9IGVsc2UgeworCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLworCQl9CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJbmV4dF9yaW5nX2hlYWQgPSAoZGV2LT5yaW5nX2hlYWQrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCQlpZiAobmV4dF9yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJCWFjdHVhbF9idWZmZXIgPSAoc2l6ZV90KikoZGV2LT5yaW5nX2J1ZmZlciArIGRldi0+cmluZ19oZWFkKihzaXplb2Yoc2l6ZV90KStkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplKSk7CisJCQkvKiBhY3R1YWxfYnVmZmVyIGdldHMgdXJiLT5hY3R1YWxfbGVuZ3RoICsgaW50ZXJydXB0X2luX2J1ZmZlciAqLworCQkJKmFjdHVhbF9idWZmZXIgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCQltZW1jcHkoYWN0dWFsX2J1ZmZlcisxLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOworCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHJlY2VpdmVkICVkIGJ5dGVzXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZQorCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfQorCityZXN1Ym1pdDoKKwkvKiByZXN1Ym1pdCBpZiB3ZSdyZSBzdGlsbCBydW5uaW5nICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgJiYgZGV2LT5pbnRmKSB7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXR2YWwpCisJCQlkZXZfZXJyKCZkZXYtPmludGYtPmRldiwKKwkJCQkidXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJfQorCitleGl0OgorCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqCWxkX3VzYl9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2ID0gdXJiLT5jb250ZXh0OworCisJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KKwlpZiAodXJiLT5zdGF0dXMgJiYgISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCQkgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCQkgICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKQorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsCisJCQkgIiVzIC0gbm9uemVybyB3cml0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7Cit9CisKKy8qKgorICoJbGRfdXNiX29wZW4KKyAqLworc3RhdGljIGludCBsZF91c2Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXY7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisKKwlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJmxkX3VzYl9kcml2ZXIsIHN1Ym1pbm9yKTsKKworCWlmICghaW50ZXJmYWNlKSB7CisJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkXG4iLAorCQkgICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisJaWYgKCFkZXYpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGxvY2sgdGhpcyBkZXZpY2UgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogYWxsb3cgb3BlbmluZyBvbmx5IG9uY2UgKi8KKwlpZiAoZGV2LT5vcGVuX2NvdW50KSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJZGV2LT5vcGVuX2NvdW50ID0gMTsKKworCS8qIGluaXRpYWxpemUgaW4gZGlyZWN0aW9uICovCisJZGV2LT5yaW5nX2hlYWQgPSAwOworCWRldi0+cmluZ190YWlsID0gMDsKKwl1c2JfZmlsbF9pbnRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkgdXNiX3JjdmludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsCisJCQkgbGRfdXNiX2ludGVycnVwdF9pbl9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDE7CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDA7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X2luX3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWRldi0+b3Blbl9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2F2ZSBkZXZpY2UgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKwordW5sb2NrX2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKwordW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDoKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2JfcmVsZWFzZQorICovCitzdGF0aWMgaW50IGxkX3VzYl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkZXYtPm9wZW5fY291bnQgIT0gMSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJLyogdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIGJlZm9yZSB0aGUgZmlsZSB3YXMgcmVsZWFzZWQgKi8KKwkJdXAoJmRldi0+c2VtKTsKKwkJLyogdW5sb2NrIGhlcmUgYXMgbGRfdXNiX2RlbGV0ZSBmcmVlcyBkZXYgKi8KKwkJbGRfdXNiX2RlbGV0ZShkZXYpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogd2FpdCB1bnRpbCB3cml0ZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCAqLworCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3ksIDIgKiBIWik7CisJbGRfdXNiX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCWRldi0+b3Blbl9jb3VudCA9IDA7CisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2JfcG9sbAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxkX3VzYl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+d3JpdGVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGV2LT5yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJbGRfdXNiX3JlYWQKKyAqLworc3RhdGljIHNzaXplX3QgbGRfdXNiX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXY7CisJc2l6ZV90ICphY3R1YWxfYnVmZmVyOworCXNpemVfdCBieXRlc190b19yZWFkOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgZm9yIGRhdGEgKi8KKwlpZiAoZGV2LT5yaW5nX2hlYWQgPT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT5yZWFkX3dhaXQsIGRldi0+aW50ZXJydXB0X2luX2RvbmUpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogYWN0dWFsX2J1ZmZlciBjb250YWlucyBhY3R1YWxfbGVuZ3RoICsgaW50ZXJydXB0X2luX2J1ZmZlciAqLworCWFjdHVhbF9idWZmZXIgPSAoc2l6ZV90KikoZGV2LT5yaW5nX2J1ZmZlciArIGRldi0+cmluZ190YWlsKihzaXplb2Yoc2l6ZV90KStkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplKSk7CisJYnl0ZXNfdG9fcmVhZCA9IG1pbihjb3VudCwgKmFjdHVhbF9idWZmZXIpOworCWlmIChieXRlc190b19yZWFkIDwgKmFjdHVhbF9idWZmZXIpCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIlJlYWQgYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkXG4iLAorCQkJICphY3R1YWxfYnVmZmVyLWJ5dGVzX3RvX3JlYWQpOworCisJLyogY29weSBvbmUgaW50ZXJydXB0X2luX2J1ZmZlciBmcm9tIHJpbmdfYnVmZmVyIGludG8gdXNlcnNwYWNlICovCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGFjdHVhbF9idWZmZXIrMSwgYnl0ZXNfdG9fcmVhZCkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJZGV2LT5yaW5nX3RhaWwgPSAoZGV2LT5yaW5nX3RhaWwrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCisJcmV0dmFsID0gYnl0ZXNfdG9fcmVhZDsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJbGRfdXNiX3dyaXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IGxkX3VzYl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXY7CisJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHByZXZpb3VzIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIGludGVycnVwdF9vdXRfYnVmZmVyIGZyb20gdXNlcnNwYWNlICovCisJYnl0ZXNfdG9fd3JpdGUgPSBtaW4oY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplKTsKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkXG4iLGNvdW50LWJ5dGVzX3RvX3dyaXRlKTsKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlZCwgYnl0ZXNfdG9fd3JpdGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgYnl0ZXNfdG9fd3JpdGUpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKSB7CisJCS8qIHRyeSBISURfUkVRX1NFVF9SRVBPUlQ9OSBvbiBjb250cm9sX2VuZHBvaW50IGluc3RlYWQgb2YgaW50ZXJydXB0X291dF9lbmRwb2ludCAqLworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQkgdXNiX3NuZGN0cmxwaXBlKGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwgMCksCisJCQkJCSA5LAorCQkJCQkgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCisJCQkJCSAxIDw8IDgsIDAsCisJCQkJCSBkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLAorCQkJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkJCSBVU0JfQ1RSTF9TRVRfVElNRU9VVCAqIEhaKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQllcnIoIkNvdWxkbid0IHN1Ym1pdCBISURfUkVRX1NFVF9SRVBPUlQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkgdXNiX3NuZGludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkgbGRfdXNiX2ludGVycnVwdF9vdXRfY2FsbGJhY2ssCisJCQkgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDE7CisJd21iKCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCXJldHZhbCA9IGJ5dGVzX3RvX3dyaXRlOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsZF91c2JfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCAgPQlsZF91c2JfcmVhZCwKKwkud3JpdGUgPQlsZF91c2Jfd3JpdGUsCisJLm9wZW4gPQkJbGRfdXNiX29wZW4sCisJLnJlbGVhc2UgPQlsZF91c2JfcmVsZWFzZSwKKwkucG9sbCA9CQlsZF91c2JfcG9sbCwKK307CisKKy8qCisgKiB1c2IgY2xhc3MgZHJpdmVyIGluZm8gaW4gb3JkZXIgdG8gZ2V0IGEgbWlub3IgbnVtYmVyIGZyb20gdGhlIHVzYiBjb3JlLAorICogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggZGV2ZnMgYW5kIHRoZSBkcml2ZXIgY29yZQorICovCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgbGRfdXNiX2NsYXNzID0geworCS5uYW1lID0JCSJsZHVzYiVkIiwKKwkuZm9wcyA9CQkmbGRfdXNiX2ZvcHMsCisJLm1pbm9yX2Jhc2UgPQlVU0JfTERfTUlOT1JfQkFTRSwKK307CisKKy8qKgorICoJbGRfdXNiX3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgbGRfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBsZF91c2IgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkZXYsIDB4MDAsIHNpemVvZigqZGV2KSk7CisJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOworCWRldi0+aW50ZiA9IGludGY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5yZWFkX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d3JpdGVfd2FpdCk7CisKKwkvKiB3b3JrYXJvdW5kIGZvciBlYXJseSBmaXJtd2FyZSB2ZXJzaW9ucyBvbiBmYXN0IGNvbXB1dGVycyAqLworCWlmICgobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gVVNCX1ZFTkRPUl9JRF9MRCkgJiYKKwkgICAgKChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVklDRV9JRF9DQVNTWSkgfHwKKwkgICAgIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVklDRV9JRF9DT00zTEFCKSkgJiYKKwkgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA8PSAweDEwMykpIHsKKwkJYnVmZmVyID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOworCQkvKiB1c2Jfc3RyaW5nIG1ha2VzIFNFVFVQK1NUQUxMIHRvIGxlYXZlIGFsd2F5cyBDb250cm9sUmVhZExvb3AgKi8KKwkJdXNiX3N0cmluZyh1ZGV2LCAyNTUsIGJ1ZmZlciwgMjU2KTsKKwkJa2ZyZWUoYnVmZmVyKTsKKwl9CisKKwlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pICYmCisJCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgeworCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKKwkJfQorCisJCWlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgJiYKKwkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwkJfQorCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKQorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MocmluZ19idWZmZXJfc2l6ZSooc2l6ZW9mKHNpemVfdCkrZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSksIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByaW5nX2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplID0gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID8gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgOgorCQkJCQkJCQkJIHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOworCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmbGRfdXNiX2NsYXNzKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGV2X2luZm8oJmludGYtPmRldiwgIkxEIFVTQiBEZXZpY2UgIyVkIG5vdyBhdHRhY2hlZCB0byBtYWpvciAlZCBtaW5vciAlZFxuIiwKKwkJKGludGYtPm1pbm9yIC0gVVNCX0xEX01JTk9SX0JBU0UpLCBVU0JfTUFKT1IsIGludGYtPm1pbm9yKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKwlsZF91c2JfZGVsZXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCWxkX3VzYl9kaXNjb25uZWN0CisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlpbnQgbWlub3I7CisKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlkb3duKCZkZXYtPnNlbSk7CisKKwltaW5vciA9IGludGYtPm1pbm9yOworCisJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmbGRfdXNiX2NsYXNzKTsKKworCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW5lZCwgdGhlbiB3ZSBjbGVhbiB1cCByaWdodCBub3cgKi8KKwlpZiAoIWRldi0+b3Blbl9jb3VudCkgeworCQl1cCgmZGV2LT5zZW0pOworCQlsZF91c2JfZGVsZXRlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5pbnRmID0gTlVMTDsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworCisJZGV2X2luZm8oJmludGYtPmRldiwgIkxEIFVTQiBEZXZpY2UgIyVkIG5vdyBkaXNjb25uZWN0ZWRcbiIsCisJCSAobWlub3IgLSBVU0JfTERfTUlOT1JfQkFTRSkpOworfQorCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbGRfdXNiX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkibGR1c2IiLAorCS5wcm9iZSA9CWxkX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWxkX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWxkX3VzYl90YWJsZSwKK307CisKKy8qKgorICoJbGRfdXNiX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgbGRfdXNiX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmbGRfdXNiX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkIGZvciB0aGUgIl9fRklMRV9fIiBkcml2ZXIuIEVycm9yIG51bWJlciAlZFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJbGRfdXNiX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGxkX3VzYl9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmxkX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChsZF91c2JfaW5pdCk7Cittb2R1bGVfZXhpdChsZF91c2JfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKaW5kZXggMzEwNGYyOC4uY2RhNzI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgcmVhbHdvcmxkID0gMTsKIG1vZHVsZV9wYXJhbSAocmVhbHdvcmxkLCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKHJlYWx3b3JsZCwgImNsZWFyIHRvIGRlbWFuZCBzdHJpY3RlciBjaDkgY29tcGxpYW5jZSIpOworTU9EVUxFX1BBUk1fREVTQyAocmVhbHdvcmxkLCAiY2xlYXIgdG8gZGVtYW5kIHN0cmljdGVyIHNwZWMgY29tcGxpYW5jZSIpOwogCiBzdGF0aWMgaW50IGdldF9hbHRzZXR0aW5nIChzdHJ1Y3QgdXNidGVzdF9kZXYgKmRldikKIHsKQEAgLTYwNCw5ICs2MDQsOCBAQAogCQkJCVVTQl9ESVJfSU4gfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJCTAsIDAsIGRldi0+YnVmLCAxLCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CiAJCWlmIChyZXR2YWwgIT0gMSB8fCBkZXYtPmJ1ZiBbMF0gIT0gZXhwZWN0ZWQpIHsKLQkJCWRldl9kYmcgKCZpZmFjZS0+ZGV2LAotCQkJCSJnZXQgY29uZmlnIC0tPiAlZCAoJWQpXG4iLCByZXR2YWwsCi0JCQkJZXhwZWN0ZWQpOworCQkJZGV2X2RiZyAoJmlmYWNlLT5kZXYsICJnZXQgY29uZmlnIC0tPiAlZCAlZCAoMSAlZClcbiIsCisJCQkJcmV0dmFsLCBkZXYtPmJ1ZlswXSwgZXhwZWN0ZWQpOwogCQkJcmV0dXJuIChyZXR2YWwgPCAwKSA/IHJldHZhbCA6IC1FRE9NOwogCQl9CiAJfQpAQCAtMTI0Myw3ICsxMjQyLDcgQEAKIAljaGFyCQkJKndoYXQgPSAiPyI7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAJCi0JaWYgKGxlbmd0aCA+IDB4ZmZmZiB8fCB2YXJ5ID49IGxlbmd0aCkKKwlpZiAobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiAweGZmZmYgfHwgdmFyeSA+PSBsZW5ndGgpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmID0ga21hbGxvYyhsZW5ndGgsIFNMQUJfS0VSTkVMKTsKQEAgLTEyNjYsNiArMTI2NSwxMSBAQAogCQkJCTAsIDAsIGJ1ZiwgbGVuLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJCWlmIChyZXR2YWwgIT0gbGVuKSB7CiAJCQl3aGF0ID0gIndyaXRlIjsKKwkJCWlmIChyZXR2YWwgPj0gMCkgeworCQkJCUlORk8oZGV2LCAiY3RybF9vdXQsIHdsZW4gJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJCQkJCXJldHZhbCwgbGVuKTsKKwkJCQlyZXR2YWwgPSAtRUJBRE1TRzsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEyNzUsNiArMTI3OSwxMSBAQAogCQkJCTAsIDAsIGJ1ZiwgbGVuLCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CiAJCWlmIChyZXR2YWwgIT0gbGVuKSB7CiAJCQl3aGF0ID0gInJlYWQiOworCQkJaWYgKHJldHZhbCA+PSAwKSB7CisJCQkJSU5GTyhkZXYsICJjdHJsX291dCwgcmxlbiAlZCAoZXhwZWN0ZWQgJWQpXG4iLAorCQkJCQkJcmV0dmFsLCBsZW4pOworCQkJCXJldHZhbCA9IC1FQkFETVNHOworCQkJfQogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTI5Myw4ICsxMzAyLDEzIEBACiAJCX0KIAogCQlsZW4gKz0gdmFyeTsKKworCQkvKiBbcmVhbCB3b3JsZF0gdGhlICJ6ZXJvIGJ5dGVzIElOIiBjYXNlIGlzbid0IHJlYWxseSB1c2VkLgorCQkgKiBoYXJkd2FyZSBjYW4gZWFzaWx5IHRyaXAgdXAgaW4gdGhpcyB3aWVyZCBjYXNlLCBzaW5jZSBpdHMKKwkJICogc3RhdHVzIHN0YWdlIGlzIElOLCBub3QgT1VUIGxpa2Ugb3RoZXIgZXAwaW4gdHJhbnNmZXJzLgorCQkgKi8KIAkJaWYgKGxlbiA+IGxlbmd0aCkKLQkJCWxlbiA9IDA7CisJCQlsZW4gPSByZWFsd29ybGQgPyAxIDogMDsKIAl9CiAKIAlpZiAocmV0dmFsIDwgMCkKQEAgLTE1MTksNiArMTUzMywxMSBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkZXYtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKKwlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlICE9IFBNU0dfT04pIHsKKwkJdXAgKCZkZXYtPnNlbSk7CisJCXJldHVybiAtRUhPU1RVTlJFQUNIOworCX0KKwogCS8qIHNvbWUgZGV2aWNlcywgbGlrZSBlei11c2IgZGVmYXVsdCBkZXZpY2VzLCBuZWVkIGEgbm9uLWRlZmF1bHQKIAkgKiBhbHRzZXR0aW5nIHRvIGhhdmUgYW55IGFjdGl2ZSBlbmRwb2ludHMuICBzb21lIHRlc3RzIGNoYW5nZQogCSAqIGFsdHNldHRpbmdzOyBmb3JjZSBhIGRlZmF1bHQgc28gbW9zdCB0ZXN0cyBkb24ndCBuZWVkIHRvIGNoZWNrLgpAQCAtMTc2Miw4ICsxNzgxLDEwIEBACiAJY2FzZSAxNDoKIAkJaWYgKCFkZXYtPmluZm8tPmN0cmxfb3V0KQogCQkJYnJlYWs7Ci0JCWRldl9kYmcgKCZpbnRmLT5kZXYsICJURVNUIDE0OiAgJWQgZXAwb3V0LCAwLi4lZCB2YXJ5ICVkXG4iLAotCQkJCXBhcmFtLT5pdGVyYXRpb25zLCBwYXJhbS0+bGVuZ3RoLCBwYXJhbS0+dmFyeSk7CisJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJURVNUIDE0OiAgJWQgZXAwb3V0LCAlZC4uJWQgdmFyeSAlZFxuIiwKKwkJCQlwYXJhbS0+aXRlcmF0aW9ucywKKwkJCQlyZWFsd29ybGQgPyAxIDogMCwgcGFyYW0tPmxlbmd0aCwKKwkJCQlwYXJhbS0+dmFyeSk7CiAJCXJldHZhbCA9IGN0cmxfb3V0IChkZXYsIHBhcmFtLT5pdGVyYXRpb25zLCAKIAkJCQlwYXJhbS0+bGVuZ3RoLCBwYXJhbS0+dmFyeSk7CiAJCWJyZWFrOwpAQCAtMTkyNyw2ICsxOTQ4LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdXNidGVzdF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYnRlc3RfZGV2CSpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKworCWRvd24gKCZkZXYtPnNlbSk7CisJaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOworCXVwICgmZGV2LT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYnRlc3RfcmVzdW1lIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNidGVzdF9kZXYJKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCisJZG93biAoJmRldi0+c2VtKTsKKwlpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXVwICgmZGV2LT5zZW0pOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyB2b2lkIHVzYnRlc3RfZGlzY29ubmVjdCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYnRlc3RfZGV2CSpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKQEAgLTIxMTUsNiArMjE1Nyw4IEBACiAJLnByb2JlID0JdXNidGVzdF9wcm9iZSwKIAkuaW9jdGwgPQl1c2J0ZXN0X2lvY3RsLAogCS5kaXNjb25uZWN0ID0JdXNidGVzdF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNidGVzdF9zdXNwZW5kLAorCS5yZXN1bWUgPQl1c2J0ZXN0X3Jlc3VtZSwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jCmluZGV4IDc1NWE0NTcuLjI2MjY2YjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwpAQCAtMTksMTEgKzE5LDE2IEBACiAjZGVmaW5lIERBVEFfTUFYICAzMgogCiAvKgorICogRGVmaW5lZCBieSBVU0IgMi4wIGNsYXVzZSA5LjMsIHRhYmxlIDkuMi4KKyAqLworI2RlZmluZSBTRVRVUF9NQVggIDgKKworLyoKICAqIFRoaXMgbGltaXQgZXhpc3RzIHRvIHByZXZlbnQgT09NcyB3aGVuIHRoZSB1c2VyIHByb2Nlc3Mgc3RvcHMgcmVhZGluZy4KICAqLwogI2RlZmluZSBFVkVOVF9NQVggIDI1CiAKLSNkZWZpbmUgUFJJTlRGX0RGTCAgMTIwCisjZGVmaW5lIFBSSU5URl9ERkwgIDEzMAogCiBzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgewogCXN0cnVjdCBsaXN0X2hlYWQgZV9saW5rOwpAQCAtMzMsNyArMzgsOSBAQAogCXVuc2lnbmVkIGludCB0c3RhbXA7CiAJaW50IGxlbmd0aDsJCS8qIERlcGVuZHMgb24gdHlwZTogeGZlciBsZW5ndGggb3IgYWN0IGxlbmd0aCAqLwogCWludCBzdGF0dXM7CisJY2hhciBzZXR1cF9mbGFnOwogCWNoYXIgZGF0YV9mbGFnOworCXVuc2lnbmVkIGNoYXIgc2V0dXBbU0VUVVBfTUFYXTsKIAl1bnNpZ25lZCBjaGFyIGRhdGFbREFUQV9NQVhdOwogfTsKIApAQCAtNjQsNiArNzEsMjIgQEAKICAqIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIHdob2xlIG1vbl9idXMgbG9ja2VkLCBzbyBubyBhZGRpdGlvbmFsIGxvY2suCiAgKi8KIAorc3RhdGljIGlubGluZSBjaGFyIG1vbl90ZXh0X2dldF9zZXR1cChzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwLAorICAgIHN0cnVjdCB1cmIgKnVyYiwgY2hhciBldl90eXBlKQoreworCisJaWYgKCF1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSB8fCBldl90eXBlICE9ICdTJykKKwkJcmV0dXJuICctJzsKKworCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1NFVFVQX0RNQV9NQVApCisJCXJldHVybiAnRCc7CisJaWYgKHVyYi0+c2V0dXBfcGFja2V0ID09IE5VTEwpCisJCXJldHVybiAnWic7CS8qICcwJyB3b3VsZCBiZSBub3QgYXMgcHJldHR5LiAqLworCisJbWVtY3B5KGVwLT5zZXR1cCwgdXJiLT5zZXR1cF9wYWNrZXQsIFNFVFVQX01BWCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgY2hhciBtb25fdGV4dF9nZXRfZGF0YShzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwLCBzdHJ1Y3QgdXJiICp1cmIsCiAgICAgaW50IGxlbiwgY2hhciBldl90eXBlKQogewpAQCAtOTAsNyArMTEzLDYgQEAKIAogCS8qCiAJICogQnVsayBpcyBlYXN5IHRvIHNob3J0Y3V0IHJlbGlhYmx5LiAKLQkgKiBYWFggQ29udHJvbCBuZWVkcyBzZXR1cCBwYWNrZXQgdGFrZW4uCiAJICogWFhYIE90aGVyIHBpcGUgdHlwZXMgbmVlZCBjb25zaWRlcmF0aW9uLiBDdXJyZW50bHksIHdlIG92ZXJkbyBpdAogCSAqIGFuZCBjb2xsZWN0IGdhcmJhZ2UgZm9yIHRoZW06IGJldHRlciBtb3JlIHRoYW4gbGVzcy4KIAkgKi8KQEAgLTE0NCw2ICsxNjYsNyBAQAogCS8qIENvbGxlY3Rpbmcgc3RhdHVzIG1ha2VzIGRlYnVnZ2luZyBzZW5zZSBmb3Igc3VibWl0cywgdG9vICovCiAJZXAtPnN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCisJZXAtPnNldHVwX2ZsYWcgPSBtb25fdGV4dF9nZXRfc2V0dXAoZXAsIHVyYiwgZXZfdHlwZSk7CiAJZXAtPmRhdGFfZmxhZyA9IG1vbl90ZXh0X2dldF9kYXRhKGVwLCB1cmIsIGVwLT5sZW5ndGgsIGV2X3R5cGUpOwogCiAJcnAtPm5ldmVudHMrKzsKQEAgLTI5OSwxMCArMzIyLDI1IEBACiAJZGVmYXVsdDogLyogUElQRV9CVUxLICovICB1dHlwZSA9ICdCJzsKIAl9CiAJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAotCSAgICAiJWx4ICV1ICVjICVjJWM6JTAzdTolMDJ1ICVkICVkIiwKKwkgICAgIiVseCAldSAlYyAlYyVjOiUwM3U6JTAydSIsCiAJICAgIGVwLT5pZCwgZXAtPnRzdGFtcCwgZXAtPnR5cGUsCi0JICAgIHV0eXBlLCB1ZGlyLCB1c2JfcGlwZWRldmljZShlcC0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQoZXAtPnBpcGUpLAotCSAgICBlcC0+c3RhdHVzLCBlcC0+bGVuZ3RoKTsKKwkgICAgdXR5cGUsIHVkaXIsIHVzYl9waXBlZGV2aWNlKGVwLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludChlcC0+cGlwZSkpOworCisJaWYgKGVwLT5zZXR1cF9mbGFnID09IDApIHsgICAvKiBTZXR1cCBwYWNrZXQgaXMgcHJlc2VudCBhbmQgY2FwdHVyZWQgKi8KKwkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAorCQkgICAgIiBzICUwMnggJTAyeCAlMDR4ICUwNHggJTA0eCIsCisJCSAgICBlcC0+c2V0dXBbMF0sCisJCSAgICBlcC0+c2V0dXBbMV0sCisJCSAgICAoZXAtPnNldHVwWzNdIDw8IDgpIHwgZXAtPnNldHVwWzJdLAorCQkgICAgKGVwLT5zZXR1cFs1XSA8PCA4KSB8IGVwLT5zZXR1cFs0XSwKKwkJICAgIChlcC0+c2V0dXBbN10gPDwgOCkgfCBlcC0+c2V0dXBbNl0pOworCX0gZWxzZSBpZiAoZXAtPnNldHVwX2ZsYWcgIT0gJy0nKSB7IC8qIFVuYWJsZSB0byBjYXB0dXJlIHNldHVwIHBhY2tldCAqLworCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsCisJCSAgICAiICVjIF9fIF9fIF9fX18gX19fXyBfX19fIiwgZXAtPnNldHVwX2ZsYWcpOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2V0dXAgZm9yIHRoaXMga2luZCBvZiBVUkIgKi8KKwkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LCAiICVkIiwgZXAtPnN0YXR1cyk7CisJfQorCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwgIiAlZCIsIGVwLT5sZW5ndGgpOwogCiAJaWYgKChkYXRhX2xlbiA9IGVwLT5sZW5ndGgpID4gMCkgewogCQlpZiAoZXAtPmRhdGFfZmxhZyA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKaW5kZXggZmQ2ZmY0Yy4uN2ZmYTk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwpAQCAtNDc3LDcgKzQ3Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGthd2V0aF91c2JfcmVjZWl2ZShzdHJ1Y3QgdXJiICosIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyBpbnQga2F3ZXRoX3Jlc3VibWl0X3J4X3VyYihzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqLCBpbnQpOworc3RhdGljIGludCBrYXdldGhfcmVzdWJtaXRfcnhfdXJiKHN0cnVjdCBrYXdldGhfZGV2aWNlICosIHVuc2lnbmVkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlpbnRfY2FsbGJhY2sKQEAgLTU1MCw3ICs1NTAsNyBAQAogICogICAgIGthd2V0aF9yZXN1Ym1pdF9yeF91cmIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBrYXdldGhfcmVzdWJtaXRfcnhfdXJiKHN0cnVjdCBrYXdldGhfZGV2aWNlICprYXdldGgsCi0JCQkJCQlpbnQgbWVtX2ZsYWdzKQorCQkJCQkJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludCByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCmluZGV4IGQ5NzY3OTAuLjVmNDQ5NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYwpAQCAtMTE2Niw3ICsxMTY2LDcgQEAKIAkJcGVnYXN1cy0+ZXRoX3JlZ3NbRXRoQ3RybDJdIHw9IFJYX1BST01JU0NVT1VTOwogCQlpZiAobmV0aWZfbXNnX2xpbmsocGVnYXN1cykpCiAJCQlwcl9pbmZvKCIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgbmV0LT5uYW1lKTsKLQl9IGVsc2UgaWYgKChuZXQtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkgfHwKKwl9IGVsc2UgaWYgKG5ldC0+bWNfY291bnQgfHwKIAkJICAgKG5ldC0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CiAJCXBlZ2FzdXMtPmV0aF9yZWdzW0V0aEN0cmwwXSB8PSBSWF9NVUxUSUNBU1Q7CiAJCXBlZ2FzdXMtPmV0aF9yZWdzW0V0aEN0cmwyXSAmPSB+UlhfUFJPTUlTQ1VPVVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaAppbmRleCAxM2NjZWRlLi5iOThmMmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oCisrKyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmgKQEAgLTI0OSw2ICsyNDksOCBAQAogCQlERUZBVUxUX0dQSU9fUkVTRVQpCiBQRUdBU1VTX0RFViggIkxBTkVFRCBVU0IgRXRoZXJuZXQgTEQtVVNCL1RYIiwgVkVORE9SX0xBTkVFRCwgMHg0MDAyLAogCQlERUZBVUxUX0dQSU9fUkVTRVQgKQorUEVHQVNVU19ERVYoICJMQU5FRUQgVVNCIEV0aGVybmV0IExELVVTQkwvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMDUsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCiBQRUdBU1VTX0RFViggIkxBTkVFRCBVU0IgRXRoZXJuZXQgTEQtVVNCL1RYIiwgVkVORE9SX0xBTkVFRCwgMHg0MDBiLAogCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKIFBFR0FTVVNfREVWKCAiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVCIsIFZFTkRPUl9MQU5FRUQsIDB4YWJjMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCmluZGV4IDhmYjIyMzMuLjYyNmIwMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYwpAQCAtNjY3LDcgKzY2Nyw3IEBACiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewogCQlkZXYtPnJ4X2NyZWcgfD0gY3B1X3RvX2xlMTYoMHgwMDAxKTsKIAkJaW5mbygiJXM6IHByb21pc2N1b3VzIG1vZGUiLCBuZXRkZXYtPm5hbWUpOwotCX0gZWxzZSBpZiAoKG5ldGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KSB8fAorCX0gZWxzZSBpZiAobmV0ZGV2LT5tY19jb3VudCB8fAogCQkgICAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKIAkJZGV2LT5yeF9jcmVnICY9IGNwdV90b19sZTE2KDB4ZmZmZSk7CiAJCWRldi0+cnhfY3JlZyB8PSBjcHVfdG9fbGUxNigweDAwMDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCmluZGV4IDRjYmI0MDguLjU3NmYzYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKQEAgLTE0MjksNyArMTQyOSw3IEBACiAJCQlpbmZvLT5ldGhlciA9ICh2b2lkICopIGJ1ZjsKIAkJCWlmIChpbmZvLT5ldGhlci0+Ykxlbmd0aCAhPSBzaXplb2YgKmluZm8tPmV0aGVyKSB7CiAJCQkJZGV2X2RiZyAoJmludGYtPmRldiwgIkNEQyBldGhlciBsZW4gJXVcbiIsCi0JCQkJCWluZm8tPnUtPmJMZW5ndGgpOworCQkJCQlpbmZvLT5ldGhlci0+Ykxlbmd0aCk7CiAJCQkJZ290byBiYWRfZGVzYzsKIAkJCX0KIAkJCWRldi0+bmV0LT5tdHUgPSBsZTE2X3RvX2NwdXAgKApAQCAtMzIyNyw5ICszMjI3LDkgQEAKIAl0ZW1wID0gdW5saW5rX3VyYnMgKGRldiwgJmRldi0+dHhxKSArIHVubGlua191cmJzIChkZXYsICZkZXYtPnJ4cSk7CiAKIAkvLyBtYXliZSB3YWl0IGZvciBkZWxldGlvbnMgdG8gZmluaXNoLgotCXdoaWxlIChza2JfcXVldWVfbGVuICgmZGV2LT5yeHEpCi0JCQkmJiBza2JfcXVldWVfbGVuICgmZGV2LT50eHEpCi0JCQkmJiBza2JfcXVldWVfbGVuICgmZGV2LT5kb25lKSkgeworCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZkZXYtPnJ4cSkgJiYKKwkgICAgICAgIXNrYl9xdWV1ZV9lbXB0eSgmZGV2LT50eHEpICYmCisJICAgICAgICFza2JfcXVldWVfZW1wdHkoJmRldi0+ZG9uZSkpIHsKIAkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsKIAkJaWYgKG5ldGlmX21zZ19pZmRvd24gKGRldikpCiAJCQlkZXZkYmcgKGRldiwgIndhaXRlZCBmb3IgJWQgdXJiIGNvbXBsZXRpb25zIiwgdGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmMgYi9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmMKaW5kZXggMzQxYWU1Zi4uM2IzODdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuYwpAQCAtMTg4NCwxMiArMTg4NCw1MyBAQAogCWtmcmVlKHpkKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHpkMTIwMV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgICBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgemQxMjAxICp6ZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goemQtPmRldik7CisKKwl6ZC0+d2FzX2VuYWJsZWQgPSB6ZC0+bWFjX2VuYWJsZWQ7CisKKwlpZiAoemQtPndhc19lbmFibGVkKQorCQlyZXR1cm4gemQxMjAxX2Rpc2FibGUoemQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgemQxMjAxX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB6ZDEyMDEgKnpkID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisJaWYgKCF6ZCB8fCAhemQtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKHpkLT5kZXYpOworCisJaWYgKHpkLT53YXNfZW5hYmxlZCkKKwkJcmV0dXJuIHpkMTIwMV9lbmFibGUoemQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgemQxMjAxX3N1c3BlbmQgTlVMTAorI2RlZmluZSB6ZDEyMDFfcmVzdW1lICBOVUxMCisKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgemQxMjAxX3VzYiA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkubmFtZSA9ICJ6ZDEyMDEiLAogCS5wcm9iZSA9IHpkMTIwMV9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IHpkMTIwMV9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9IHpkMTIwMV90YWJsZSwKKwkuc3VzcGVuZCA9IHpkMTIwMV9zdXNwZW5kLAorCS5yZXN1bWUgPSB6ZDEyMDFfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgemQxMjAxX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuaCBiL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuaAppbmRleCAxNjI3YzcxLi4yMzVmMGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmgKKysrIGIvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5oCkBAIC00Niw2ICs0Niw3IEBACiAJY2hhcgkJCWVzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOwogCWludAkJCWVzc2lkbGVuOwogCWludAkJCW1hY19lbmFibGVkOworCWludAkJCXdhc19lbmFibGVkOwogCWludAkJCW1vbml0b3I7CiAJaW50CQkJZW5jb2RlX2VuYWJsZWQ7CiAJaW50CQkJZW5jb2RlX3Jlc3RyaWN0ZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKaW5kZXggNDZhMjA0Yy4uYjViNDMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYwpAQCAtMjEzLDEwICsyMTMsMTQgQEAKIAkJcmV0dXJuICgwKTsKIAl9CiAKLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC0yMjQsNiArMjI4LDcgQEAKIAkJLyogVG8gbXVjaCBkYXRhIGZvciBidWZmZXIuIFJlc2V0IGJ1ZmZlci4gKi8KIAkJcHJpdi0+d3JmaWxsZWQ9MDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCXJldHVybiAoMCk7CiAJfQogCkBAIC0yNjgsNiArMjczLDcgQEAKIAkJCXByaXYtPndyZmlsbGVkPTA7CiAJCQlwcml2LT53cnNlbnQ9MDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTQxMiw3ICs0MTgsOCBAQAogCXN0cnVjdCBjeWJlcmphY2tfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwotCQorCisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCWlmICh1cmItPnN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwpAQCAtNDI0LDEyICs0MzEsNiBAQAogCWlmKCBwcml2LT53cmZpbGxlZCApIHsKIAkJaW50IGxlbmd0aCwgYmxrc2l6ZSwgcmVzdWx0OwogCi0JCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCQkJcmV0dXJuOwotCQl9Ci0KIAkJZGJnKCIlcyAtIHRyYW5zbWl0dGluZyBkYXRhIChmcmFtZSBuKSIsIF9fRlVOQ1RJT05fXyk7CiAKIAkJbGVuZ3RoID0gKChwcml2LT53cmZpbGxlZCAtIHByaXYtPndyc2VudCkgPiBwb3J0LT5idWxrX291dF9zaXplKSA/CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGQ4ODJmYTMuLjBiMDNkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0yNjQsMTYgKzI2NCwyNiBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNC4yIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNC4zIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiwgQmlsbCBSeWRlciA8YnJ5ZGVyQHNnaS5jb20+LCBLdWJhIE9iZXIgPGt1YmFAbWFyZWltYnJpdW0ub3JnPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBGVERJIFNlcmlhbCBDb252ZXJ0ZXJzIERyaXZlciIKIAogc3RhdGljIGludCBkZWJ1ZzsKIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX3NpbyBbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfU0lPX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworLyogc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGlzIHVzZWQgYnkgZGV2aWNlcyByZXF1aXJpbmcgc3BlY2lhbCBhdHRlbnRpb24uICovCitzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgeworCXZvaWQgKCpzZXR1cCkoc3RydWN0IHVzYl9zZXJpYWwgKik7IC8qIFNwZWNpYWwgc2V0dGluZ3MgZHVyaW5nIHN0YXJ0dXAuICovCit9OworCitzdGF0aWMgdm9pZCAgZnRkaV9VU0JfVUlSVF9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CitzdGF0aWMgdm9pZCAgZnRkaV9IRV9USVJBMV9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgZnRkaV9VU0JfVUlSVF9xdWlyayA9IHsKKwkuc2V0dXAgPSBmdGRpX1VTQl9VSVJUX3NldHVwLAorfTsKKworc3RhdGljIHN0cnVjdCBmdGRpX3Npb19xdWlyayBmdGRpX0hFX1RJUkExX3F1aXJrID0geworCS5zZXR1cCA9IGZ0ZGlfSEVfVElSQTFfc2V0dXAsCiB9OwogCiAvKgpAQCAtMjg4LDIzNyArMjk4LDExIEBACiAgKiB0aGUgYmNkRGV2aWNlIHZhbHVlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBGVDIzMkJNIGFuZCBGVDI0NUJNIGZyb20KICAqIHRoZSBlYXJsaWVyIEZUOFUyMzJBTSBhbmQgRlQ4VTIzMkJNLiAgRm9yIG5vdywgaW5jbHVkZSBhbGwga25vd24gVklEL1BJRAogICogY29tYmluYXRpb25zIGluIGJvdGggdGFibGVzLgotICogRklYTUU6IHBlcmhhcHMgYmNkRGV2aWNlIGNhbiBhbHNvIGlkZW50aWZ5IDEyTUh6IGRldmljZXMsIGJ1dCBJIGRvbid0IGtub3cKLSAqIGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCisgKiBGSVhNRTogcGVyaGFwcyBiY2REZXZpY2UgY2FuIGFsc28gaWRlbnRpZnkgMTJNSHogRlQ4VTIzMkFNIGRldmljZXMsCisgKiBidXQgSSBkb24ndCBrbm93IGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCiAgKi8KIAogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfOFUyMzJBTSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0lSVFJBTlNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fQUxUX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX0lPQk9BUkRfUElEKSB9LAotCXsgVVNCX0RFVklDRShJTlRFUkJJT01FVFJJQ1NfVklELCBJTlRFUkJJT01FVFJJQ1NfTUlOSV9JT0JPQVJEX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfTkZfUklDX1ZJRCwgRlRESV9ORl9SSUNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl81NDdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9WTkhDUENVU0JfRF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRFNTMjBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl80X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV81X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV84X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl82X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfN19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM180X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM183X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihPQ1RfVklELCBPQ1RfVVMxMDFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMSwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19SMlgwLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMywgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBJTlNJREVfQUNDRVNTTywgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGQUxDT01fVklELCBGQUxDT01fVFdJU1RfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1JNX0NBTlZJRVdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPVEw0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBFVkVSX0VDT19QUk9fQ0RTLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8wX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElELCAwLCAweDNmZikgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfRlQyMzJCTSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0lSVFJBTlNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV84VTIzMkFNX0FMVF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzU0N19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82NDBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1ZOSENQQ1VTQl9EX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0RTUzIwX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8zX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl80X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl81X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl82X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9QSUVHUk9VUF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19SMlgwLCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8zLCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80LCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4QV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0VMVl9VTzEwMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08sIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRkFMQ09NX1ZJRCwgRkFMQ09NX1RXSVNUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUywgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0FDVElWRV9ST0JPVFNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9VU0JfVUlSVCBbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCX1VJUlRfUElEKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9IRV9USVJBMSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0hFX1RJUkExX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfRlQyMjMyQ1tdID0gewotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIyMzJDX1BJRCkgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfY29tYmluZWQgW10gPSB7CiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LApAQCAtNTQwLDE0ICszMjQsMTQgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRFNTMjBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX05GX1JJQ19WSUQsIEZURElfTkZfUklDX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElEKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUEVSTEVfVUxUUkFQT1JUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8yX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl81X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QSUVHUk9VUF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQpIH0sCkBAIC01OTcsMzUgKzM4MSwzNyBAQAogCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKElEVEVDSF9WSUQsIElEVEVDSF9JRFQxMjIxVV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9IRV9USVJBMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSEVfVElSQTFfUElEKSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX0hFX1RJUkExX3F1aXJrIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCksCisJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZnRkaV9VU0JfVUlSVF9xdWlyayB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1IyWDApIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMykgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80KSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4QV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBBX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBEX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg4X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhFX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VNMTAwX1BJRCkgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCisgCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElEKSB9LAorIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCkgfSwKICAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFUyMF8wX1BJRCkgfSwKICAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFU0MF8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIElOU0lERV9BQ0NFU1NPKSB9LApAQCAtNjQyLDcgKzQyOCw3IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LAogCXsgVVNCX0RFVklDRShNT0JJTElUWV9WSUQsIE1PQklMSVRZX1VTQl9TRVJJQUxfUElEKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FDVElWRV9ST0JPVFNfUElEKSB9LAogCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCkBAIC03MDUsMTIgKzQ5MSw4IEBACiAgQVNZTkNfU1BEX0NVU1QgfCBBU1lOQ19TUERfU0hJIHwgQVNZTkNfU1BEX1dBUlAgKQogCiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBhIEZUREkgc2VyaWFsIGNvbnZlcnRlciAqLwotc3RhdGljIGludCAgZnRkaV9TSU9fc3RhcnR1cAkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV84VTIzMkFNX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9GVDIzMkJNX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9GVDIyMzJDX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9VU0JfVUlSVF9zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKLXN0YXRpYyBpbnQgIGZ0ZGlfSEVfVElSQTFfc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CitzdGF0aWMgaW50ICBmdGRpX3Npb19wcm9iZQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyBpbnQgIGZ0ZGlfc2lvX2F0dGFjaAkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIHZvaWQgZnRkaV9zaHV0ZG93bgkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAgZnRkaV9vcGVuCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKIHN0YXRpYyB2b2lkIGZ0ZGlfY2xvc2UJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwpAQCAtNzMzLDE0ICs1MTUsMTYgQEAKIHN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfYmFzZV90b19kaXZpc29yIChpbnQgYmF1ZCwgaW50IGJhc2UpOwogc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yIChpbnQgYmF1ZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX1NJT19kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9zaW9fZGV2aWNlID0gewogCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIkZUREkgU0lPIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfc2lvLAorCS5uYW1lID0JCQkiRlRESSBVU0IgU2VyaWFsIERldmljZSIsCisJLnNob3J0X25hbWUgPQkJImZ0ZGlfc2lvIiwKKwkuaWRfdGFibGUgPQkJaWRfdGFibGVfY29tYmluZWQsCiAJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAogCS5udW1fYnVsa19pbiA9CQkxLAogCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCisJLnByb2JlID0JCWZ0ZGlfc2lvX3Byb2JlLAogCS5vcGVuID0JCQlmdGRpX29wZW4sCiAJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCiAJLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCkBAIC03NTUsMTQzICs1MzksMTAgQEAKIAkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKIAkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKIAkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV9TSU9fc3RhcnR1cCwKKwkuYXR0YWNoID0JCWZ0ZGlfc2lvX2F0dGFjaCwKIAkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpXzhVMjMyQU1fZGV2aWNlID0gewotCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIkZUREkgOFUyMzJBTSBDb21wYXRpYmxlIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfOFUyMzJBTSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfOFUyMzJBTV9zdGFydHVwLAotCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfRlQyMzJCTV9kZXZpY2UgPSB7Ci0JLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiRlRESSBGVDIzMkJNIENvbXBhdGlibGUiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9GVDIzMkJNLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCi0JLm51bV9wb3J0cyA9CQkxLAotCS5vcGVuID0JCQlmdGRpX29wZW4sCi0JLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCi0JLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPQkJZnRkaV91bnRocm90dGxlLAotCS53cml0ZSA9CQlmdGRpX3dyaXRlLAotCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0JZnRkaV9jaGFyc19pbl9idWZmZXIsCi0JLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAotCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAotCS50aW9jbWdldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21nZXQsCi0JLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKLQkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKLQkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV9GVDIzMkJNX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9GVDIyMzJDX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJGVERJIEZUMjIzMkMgQ29tcGF0aWJsZSIsCi0JLmlkX3RhYmxlID0JCWlkX3RhYmxlX0ZUMjIzMkMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCi0JLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKLQkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKLQkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCi0JLndyaXRlID0JCWZ0ZGlfd3JpdGUsCi0JLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCi0JLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCi0JLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKLQkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAotCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAotCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX0ZUMjIzMkNfc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX1VTQl9VSVJUX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJVU0ItVUlSVCBJbmZyYXJlZCBUcmFuY2VpdmVyIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfVVNCX1VJUlQsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCi0JLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKLQkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKLQkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCi0JLndyaXRlID0JCWZ0ZGlfd3JpdGUsCi0JLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCi0JLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCi0JLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKLQkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAotCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAotCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX1VTQl9VSVJUX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCi19OwotCi0vKiBUaGUgVElSQTEgaXMgYmFzZWQgb24gYSAgRlQyMzJCTSB3aGljaCByZXF1aXJlcyBhIGZpeGVkIGJhdWQgcmF0ZSBvZiAxMDAwMDAKLSAqIGFuZCB3aGljaCByZXF1aXJlcyBSVFMtQ1RTIHRvIGJlIGVuYWJsZWQuICovCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9IRV9USVJBMV9kZXZpY2UgPSB7Ci0JLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiSG9tZS1FbGVjdHJvbmljcyBUSVJBLTEgSVIgVHJhbnNjZWl2ZXIiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9IRV9USVJBMSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfSEVfVElSQTFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLQogCiAjZGVmaW5lIFdEUl9USU1FT1VUIDUwMDAgLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLwogCkBAIC0xMjEyLDYgKzg2Myw1OSBAQAogfSAvKiBzZXRfc2VyaWFsX2luZm8gKi8KIAogCisvKiBEZXRlcm1pbmUgdHlwZSBvZiBGVERJIGNoaXAgYmFzZWQgb24gVVNCIGNvbmZpZyBhbmQgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyB2b2lkIGZ0ZGlfZGV0ZXJtaW5lX3R5cGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZXJpYWwtPmRldjsKKwl1bnNpZ25lZCB2ZXJzaW9uOworCXVuc2lnbmVkIGludGVyZmFjZXM7CisKKwkvKiBBc3N1bWUgaXQgaXMgbm90IHRoZSBvcmlnaW5hbCBTSU8gZGV2aWNlIGZvciBub3cuICovCisJcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAxNjsKKwlwcml2LT53cml0ZV9vZmZzZXQgPSAwOworCisJdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlpbnRlcmZhY2VzID0gdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOworCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCisJCQl2ZXJzaW9uLCBpbnRlcmZhY2VzKTsKKwlpZiAoaW50ZXJmYWNlcyA+IDEpIHsKKwkJaW50IGludGVyOworCisJCS8qIE11bHRpcGxlIGludGVyZmFjZXMuICBBc3N1bWUgRlQyMjMyQy4gKi8KKwkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMjMyQzsKKwkJLyogRGV0ZXJtaW5lIGludGVyZmFjZSBjb2RlLiAqLworCQlpbnRlciA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJCWlmIChpbnRlciA9PSAwKSB7CisJCQlwcml2LT5pbnRlcmZhY2UgPSBQSVRfU0lPQTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COworCQl9CisJCS8qIEJNLXR5cGUgZGV2aWNlcyBoYXZlIGEgYnVnIHdoZXJlIGJjZERldmljZSBnZXRzIHNldAorCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCisJCWlmICh2ZXJzaW9uIDwgMHg1MDApIHsKKwkJCWRiZygiJXM6IHNvbWV0aGluZyBmaXNoeSAtIGJjZERldmljZSB0b28gbG93IGZvciBtdWx0aS1pbnRlcmZhY2UgZGV2aWNlIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKKwkJfQorCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4MjAwKSB7CisJCS8qIE9sZCBkZXZpY2UuICBBc3N1bWUgaXRzIHRoZSBvcmlnaW5hbCBTSU8uICovCisJCXByaXYtPmNoaXBfdHlwZSA9IFNJTzsKKwkJcHJpdi0+YmF1ZF9iYXNlID0gMTIwMDAwMDAgLyAxNjsKKwkJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMTsKKwl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDQwMCkgeworCQkvKiBBc3N1bWUgaXRzIGFuIEZUOFUyMzJBTSAob3IgRlQ4VTI0NUFNKSAqLworCQkvKiAoSXQgbWlnaHQgYmUgYSBCTSBiZWNhdXNlIG9mIHRoZSBpU2VyaWFsTnVtYmVyIGJ1ZywKKwkJICogYnV0IGl0IHdpbGwgc3RpbGwgd29yayBhcyBhbiBBTSBkZXZpY2UuKSAqLworCQlwcml2LT5jaGlwX3R5cGUgPSBGVDhVMjMyQU07CisJfSBlbHNlIHsKKwkJLyogQXNzdW1lIGl0cyBhbiBGVDIzMkJNIChvciBGVDI0NUJNKSAqLworCQlwcml2LT5jaGlwX3R5cGUgPSBGVDIzMkJNOworCX0KKwlpbmZvKCJEZXRlY3RlZCAlcyIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOworfQorCisKIC8qCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFN5c2ZzIEF0dHJpYnV0ZQpAQCAtMTM1NSwxMiArMTA1OSwyMCBAQAogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAotLyogQ29tbW9uIHN0YXJ0dXAgc3Vicm91dGluZSAqLwotLyogQ2FsbGVkIGZyb20gZnRkaV9TSU9fc3RhcnR1cCwgZXRjLiAqLwotc3RhdGljIGludCBmdGRpX2NvbW1vbl9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorLyogUHJvYmUgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHNwZWNpYWwgZGV2aWNlcyAqLworc3RhdGljIGludCBmdGRpX3Npb19wcm9iZSAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCAodm9pZCAqKWlkLT5kcml2ZXJfaW5mbyk7CisKKwlyZXR1cm4gKDApOworfQorCisvKiBhdHRhY2ggc3Vicm91dGluZSAqLworc3RhdGljIGludCBmdGRpX3Npb19hdHRhY2ggKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OworCXN0cnVjdCBmdGRpX3Npb19xdWlyayAqcXVpcms7CiAJCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKIApAQCAtMTQwMCwxNTAgKzExMTIsNDkgQEAKIAlwb3J0LT5idWxrX291dF9idWZmZXIgPSBOVUxMOwogCiAJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSwgcHJpdik7CisKKwlmdGRpX2RldGVybWluZV90eXBlIChzZXJpYWwtPnBvcnRbMF0pOworCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOworCisJLyogQ2hlY2sgZm9yIGRldmljZSByZXF1aXJpbmcgc3BlY2lhbCBzZXQgdXAuICovCisJcXVpcmsgPSAoc3RydWN0IGZ0ZGlfc2lvX3F1aXJrICopdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOworCWlmIChxdWlyayAmJiBxdWlyay0+c2V0dXApIHsKKwkJcXVpcmstPnNldHVwKHNlcmlhbCk7CisJfQogCQogCXJldHVybiAoMCk7Ci19Cit9IC8qIGZ0ZGlfc2lvX2F0dGFjaCAqLwogCiAKLS8qIFN0YXJ0dXAgZm9yIHRoZSBTSU8gY2hpcCAqLworLyogU2V0dXAgZm9yIHRoZSBVU0ItVUlSVCBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAorICogYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDMxMjUwMCkgKi8KIC8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9TSU9fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3N0YXRpYyB2b2lkIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwogCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKIAotCWVyciA9IGZ0ZGlfY29tbW9uX3N0YXJ0dXAoc2VyaWFsKTsKLQlpZiAoZXJyKXsKLQkJcmV0dXJuIChlcnIpOwotCX0KLQotCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKLQlwcml2LT5jaGlwX3R5cGUgPSBTSU87Ci0JcHJpdi0+YmF1ZF9iYXNlID0gMTIwMDAwMDAgLyAxNjsKLQlwcml2LT53cml0ZV9vZmZzZXQgPSAxOwotCQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFN0YXJ0dXAgZm9yIHRoZSA4VTIzMkFNIGNoaXAgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV84VTIzMkFNX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCi17IC8qIGZ0ZGlfOFUyMzJBTV9zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9Ci0KLQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Ci0JcHJpdi0+Y2hpcF90eXBlID0gRlQ4VTIzMkFNOwotCXByaXYtPmJhdWRfYmFzZSA9IDQ4MDAwMDAwIC8gMjsgLyogV291bGQgYmUgLyAxNiwgYnV0IEZUREkgc3VwcG9ydHMgMC4xMjUsIDAuMjUgYW5kIDAuNSBkaXZpc29yIGZyYWN0aW9ucyEgKi8KLQkKLQljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpXzhVMjMyQU1fc3RhcnR1cCAqLwotCi0vKiBTdGFydHVwIGZvciB0aGUgRlQyMzJCTSBjaGlwICovCi0vKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCi1zdGF0aWMgaW50IGZ0ZGlfRlQyMzJCTV9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoteyAvKiBmdGRpX0ZUMjMyQk1fc3RhcnR1cCAqLwotCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7Ci0JaW50IGVycjsKLQotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7Ci0JZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwotCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyQk07Ci0JcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOyAvKiBXb3VsZCBiZSAvIDE2LCBidXQgRlQyMzJCTSBzdXBwb3J0cyBtdWx0aXBsZSBvZiAwLjEyNSBkaXZpc29yIGZyYWN0aW9ucyEgKi8KLQkKLQljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKLQotCXJldHVybiAoMCk7Ci19IC8qIGZ0ZGlfRlQyMzJCTV9zdGFydHVwICovCi0KLS8qIFN0YXJ0dXAgZm9yIHRoZSBGVDIyMzJDIGNoaXAgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9GVDIyMzJDX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCi17IC8qIGZ0ZGlfRlQyMjMyQ19zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCWludCBpbnRlcjsKLQotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7Ci0JZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwotCXByaXYtPmNoaXBfdHlwZSA9IEZUMjIzMkM7Ci0JaW50ZXIgPSBzZXJpYWwtPmludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwotCi0JaWYgKGludGVyKSB7Ci0JCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COwotCX0KLQllbHNlICB7Ci0JCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9BOwotCX0KLQlwcml2LT5iYXVkX2Jhc2UgPSA0ODAwMDAwMCAvIDI7IC8qIFdvdWxkIGJlIC8gMTYsIGJ1dCBGVDIyMzJDIHN1cHBvcnRzIG11bHRpcGxlIG9mIDAuMTI1IGRpdmlzb3IgZnJhY3Rpb25zISAqLwotCQotCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOwotCi0JcmV0dXJuICgwKTsKLX0gLyogZnRkaV9GVDIyMzJDX3N0YXJ0dXAgKi8KLQotLyogU3RhcnR1cCBmb3IgdGhlIFVTQi1VSVJUIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAzMTI1MDApICovCi0vKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCi1zdGF0aWMgaW50IGZ0ZGlfVVNCX1VJUlRfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV9VU0JfVUlSVF9zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpXzhVMjMyQU1fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gNzc7CiAJcHJpdi0+Zm9yY2VfYmF1ZCA9IEIzODQwMDsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpX1VTQl9VSVJUX3N0YXJ0dXAgKi8KK30gLyogZnRkaV9VU0JfVUlSVF9zZXR1cCAqLwogCi0vKiBTdGFydHVwIGZvciB0aGUgSEUtVElSQTEgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQKLSAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAxMDAwMDApICovCi1zdGF0aWMgaW50IGZ0ZGlfSEVfVElSQTFfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV9IRV9USVJBMV9zdGFydHVwICovCisvKiBTZXR1cCBmb3IgdGhlIEhFLVRJUkExIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkCisgKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMTAwMDAwKSBhbmQgUlRTLUNUUyBlbmFibGVkLiAgKi8KK3N0YXRpYyB2b2lkIGZ0ZGlfSEVfVElSQTFfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwogCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX0ZUMjMyQk1fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQogCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwogCXByaXYtPmZvcmNlX2JhdWQgPSBCMzg0MDA7CiAJcHJpdi0+Zm9yY2VfcnRzY3RzID0gMTsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpX0hFX1RJUkExX3N0YXJ0dXAgKi8KK30gLyogZnRkaV9IRV9USVJBMV9zZXR1cCAqLwogCiAKIC8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdCAKQEAgLTIzNjcsNjAgKzE5NzgsMTEgQEAKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JaW50ICByZXQsIG1hc2s7Ci0JCiAJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19GVU5DVElPTl9fLCBjbWQpOwogCiAJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KIAlzd2l0Y2ggKGNtZCkgewogCi0JY2FzZSBUSU9DTUJJUzogLyogdHVybnMgb24gKFNldHMpIHRoZSBsaW5lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1hc2sgKi8KLQkJZGJnKCIlcyBUSU9DTUJJUyIsIF9fRlVOQ1RJT05fXyk7Ci0gCSAgICAgICAgaWYgKGdldF91c2VyKG1hc2ssICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0gIAkgICAgICAgIGlmIChtYXNrICYgVElPQ01fRFRSKXsKLQkJCWlmICgocmV0ID0gc2V0X2R0cihwb3J0LCBISUdIKSkgPCAwKSB7Ci0JCQkJZXJyKCJVcmIgdG8gc2V0IERUUiBmYWlsZWQiKTsKLQkJCQlyZXR1cm4ocmV0KTsKLQkJCX0KLQkJfQotCQlpZiAobWFzayAmIFRJT0NNX1JUUykgewotCQkJaWYgKChyZXQgPSBzZXRfcnRzKHBvcnQsIEhJR0gpKSA8IDApewotCQkJCWVycigiVXJiIHRvIHNldCBSVFMgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCQlicmVhazsKLQotCWNhc2UgVElPQ01CSUM6IC8qIHR1cm5zIG9mZiAoQ2xlYXJzKSB0aGUgbGluZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXNrICovCi0JCWRiZygiJXMgVElPQ01CSUMiLCBfX0ZVTkNUSU9OX18pOwotIAkgICAgICAgIGlmIChnZXRfdXNlcihtYXNrLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotICAJICAgICAgICBpZiAobWFzayAmIFRJT0NNX0RUUil7Ci0JCQlpZiAoKHJldCA9IHNldF9kdHIocG9ydCwgTE9XKSkgPCAwKXsKLQkJCQllcnIoIlVyYiB0byB1bnNldCBEVFIgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0JCi0JCWlmIChtYXNrICYgVElPQ01fUlRTKSB7Ci0JCQlpZiAoKHJldCA9IHNldF9ydHMocG9ydCwgTE9XKSkgPCAwKXsKLQkJCQllcnIoIlVyYiB0byB1bnNldCBSVFMgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCQlicmVhazsKLQotCQkvKgotCQkgKiBJIGhhZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIFRDU0VUe0EsU317LEYsV30gYW5kCi0JCSAqIFRDR0VUe0EsU30gaGVyZSBzZXBhcmF0ZWx5LCBob3dldmVyIHdoZW4gdGVzdGluZyBJCi0JCSAqIGZvdW5kIHRoYXQgdGhlIGhpZ2hlciBsYXllcnMgYWN0dWFsbHkgZG8gdGhlIHRlcm1pb3MKLQkJICogY29udmVyc2lvbnMgdGhlbXNlbHZlcyBhbmQgcGFzcyB0aGUgY2FsbCBvbnRvCi0JCSAqIGZ0ZGlfc2lvX3NldF90ZXJtaW9zLiAKLQkJICoKLQkJICovCi0KIAljYXNlIFRJT0NHU0VSSUFMOiAvKiBnZXRzIHNlcmlhbCBwb3J0IGRhdGEgKi8KIAkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CiAKQEAgLTI1MTYsMjQgKzIwNzgsOSBAQAogCWludCByZXR2YWw7CiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX1NJT19kZXZpY2UpOworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfU0lPX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfOFUyMzJBTV9kZXZpY2UpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZmFpbGVkXzhVMjMyQU1fcmVnaXN0ZXI7Ci0JcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9GVDIzMkJNX2RldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfRlQyMzJCTV9yZWdpc3RlcjsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0ZUMjIzMkNfZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9GVDIyMzJDX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9VU0JfVUlSVF9yZWdpc3RlcjsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0hFX1RJUkExX2RldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfSEVfVElSQTFfcmVnaXN0ZXI7CisJCWdvdG8gZmFpbGVkX3Npb19yZWdpc3RlcjsKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmZ0ZGlfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSAKIAkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOwpAQCAtMjU0MSwxOCArMjA4OCw4IEBACiAJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwogCXJldHVybiAwOwogZmFpbGVkX3VzYl9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKLWZhaWxlZF9IRV9USVJBMV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKLWZhaWxlZF9VU0JfVUlSVF9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwotZmFpbGVkX0ZUMjIzMkNfcmVnaXN0ZXI6Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpX0ZUMjMyQk1fZGV2aWNlKTsKLWZhaWxlZF9GVDIzMkJNX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV84VTIzMkFNX2RldmljZSk7Ci1mYWlsZWRfOFUyMzJBTV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfU0lPX2RldmljZSk7Ci1mYWlsZWRfU0lPX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKK2ZhaWxlZF9zaW9fcmVnaXN0ZXI6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjU2MywxMiArMjEwMCw3IEBACiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAl1c2JfZGVyZWdpc3RlciAoJmZ0ZGlfZHJpdmVyKTsKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpX0hFX1RJUkExX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9VU0JfVUlSVF9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfRlQyMzJCTV9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfOFUyMzJBTV9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfU0lPX2RldmljZSk7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9zaW9fZGV2aWNlKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwppbmRleCA5OTIxNGFhLi5kZGRlNWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKQEAgLTE3NCwxMCArMTc0LDE0IEBACiAKIAkvKiBvbmx5IGRvIHNvbWV0aGluZyBpZiB3ZSBoYXZlIGEgYnVsayBvdXQgZW5kcG9pbnQgKi8KIAlpZiAoc2VyaWFsLT5udW1fYnVsa19vdXQpIHsKLQkJaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCQlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAkJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuICgwKTsKKwkJCXJldHVybiAwOwogCQl9CisJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCiAJCWNvdW50ID0gKGNvdW50ID4gcG9ydC0+YnVsa19vdXRfc2l6ZSkgPyBwb3J0LT5idWxrX291dF9zaXplIDogY291bnQ7CiAKQEAgLTE5NSwxNyArMTk5LDIwIEBACiAJCQkJICAgICB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGVfYnVsa19jYWxsYmFjayksIHBvcnQpOwogCiAJCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KKwkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwotCQlpZiAocmVzdWx0KQorCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJZWxzZQorCQkJLyogZG9uJ3QgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUsIGFzIHdlIHdpbGwgcmV0cnkgaWYgIT0gMCAqLworCQkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOworCQl9IGVsc2UKIAkJCXJlc3VsdCA9IGNvdW50OwogCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyogbm8gYnVsayBvdXQsIHNvIHJldHVybiAwIGJ5dGVzIHdyaXR0ZW4gKi8KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBpbnQgdXNiX3NlcmlhbF9nZW5lcmljX3dyaXRlX3Jvb20gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCkBAIC0yMTQsOSArMjIxLDkgQEAKIAlpbnQgcm9vbSA9IDA7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQkKKwogCWlmIChzZXJpYWwtPm51bV9idWxrX291dCkgewotCQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCQlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpCiAJCQlyb29tID0gcG9ydC0+YnVsa19vdXRfc2l6ZTsKIAl9CiAKQEAgLTIzMiw3ICsyMzksNyBAQAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7Ci0JCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJCWNoYXJzID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCX0KIApAQCAtMjkxLDYgKzI5OCw3IEBACiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlpZiAodXJiLT5zdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCmluZGV4IDNiZDY5YzQuLmMwNWMyYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwpAQCAtODE4LDExICs4MTgsNiBAQAogCXN0cnVjdCBpcGFxX3BhY2tldAkqcGt0LCAqdG1wOwogCXN0cnVjdCB1cmIJCSp1cmIgPSBwb3J0LT53cml0ZV91cmI7CiAKLQlpZiAodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KLQkJZXJyKCIlcyAtIGZsdXNoaW5nIHdoaWxlIHVyYiBpcyBhY3RpdmUgISIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9CiAJcm9vbSA9IFVSQkRBVEFfU0laRTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGt0LCB0bXAsICZwcml2LT5xdWV1ZSwgbGlzdCkgewogCQljb3VudCA9IG1pbihyb29tLCAoaW50KShwa3QtPmxlbiAtIHBrdC0+d3JpdHRlbikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCmluZGV4IDExMTA1ZDcuLjg1ZTI0MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKQEAgLTM5OSwxNiArMzk5LDIxIEBACiAJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gMDsKIAl9Ci0JCi0JLyogUmFjeSBhbmQgYnJva2VuLCBGSVhNRSBwcm9wZXJseSEgKi8KLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CisJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAljb3VudCA9IG1pbihjb3VudCwgcG9ydC0+YnVsa19vdXRfc2l6ZSk7CiAJbWVtY3B5KHBvcnQtPmJ1bGtfb3V0X2J1ZmZlciwgYnVmLCBjb3VudCk7CiAKIAlkYmcoIiVzIGNvdW50IG5vdzolZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOwotCQorCiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBkZXYsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCiAJCQkgIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLApAQCAtNDE4LDYgKzQyMyw3IEBACiAKIAlyZXQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXQgIT0gMCkgeworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwppbmRleCA1OWYyMzRkLi45MzdiMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCkBAIC0zNDEsMTAgKzM0MSwxNCBAQAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJZGJnICgiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KSB7CisJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAwOwogCX0KKwlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCiAJdHJhbnNmZXJfYnVmZmVyID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJdHJhbnNmZXJfc2l6ZSA9IG1pbihjb3VudCwgcG9ydC0+YnVsa19vdXRfc2l6ZSAtIDEpOwpAQCAtMzc0LDkgKzM3OCwxMCBAQAogCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfWkVST19QQUNLRVQ7CiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQllbHNlCisJfSBlbHNlCiAJCXJlc3VsdCA9IHRyYW5zZmVyX3NpemU7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMzg3LDcgKzM5Miw4IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7Ci0JCisKKwlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCmluZGV4IDdmZDBhYTkuLjYzNWMzODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCkBAIC01MjAsOSArNTIwLDEzIEBACiAJICAgdGhlIFRYIHVyYiBpcyBpbi1mbGlnaHQgKHdhaXQgdW50aWwgaXQgY29tcGxldGVzKQogCSAgIHRoZSBkZXZpY2UgaXMgZnVsbCAod2FpdCB1bnRpbCBpdCBzYXlzIHRoZXJlIGlzIHJvb20pCiAJKi8KLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IHByaXYtPnR4X3Rocm90dGxlZCApIHsKLQkJcmV0dXJuKCAwICk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kgfHwgcHJpdi0+dHhfdGhyb3R0bGVkKSB7CisJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAkvKiBBdCB0aGlzIHBvaW50IHRoZSBVUkIgaXMgaW4gb3VyIGNvbnRyb2wsIG5vYm9keSBlbHNlIGNhbiBzdWJtaXQgaXQKIAkgICBhZ2FpbiAodGhlIG9ubHkgc3VkZGVuIHRyYW5zaXRpb24gd2FzIHRoZSBvbmUgZnJvbSBFSU5QUk9HUkVTUyB0bwpAQCAtNTcwLDcgKzU3NCw3IEBACiAJCW1lbWNweSAocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgY291bnQpOwogCQkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGNvdW50OwotCQkKKwogCQlwcml2LT50eF9yb29tIC09IGNvdW50OwogCiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CkBAIC01OTMsNiArNTk3LDggQEAKIAogCXJjID0gY291bnQ7CiBleGl0OgorCWlmIChyYyA8IDApCisJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYwMiw2ICs2MDgsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wZGFfcHJpdmF0ZSAqcHJpdjsKIAorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJLyogcXVldWUgdXAgYSB3YWtldXAgYXQgc2NoZWR1bGVyIHRpbWUgKi8KQEAgLTYyNiwxMiArNjMzLDEyIEBACiBzdGF0aWMgaW50IGtleXNwYW5fcGRhX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qga2V5c3Bhbl9wZGFfcHJpdmF0ZSAqcHJpdjsKLQkKKwogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JCisKIAkvKiB3aGVuIHRocm90dGxlZCwgcmV0dXJuIGF0IGxlYXN0IFdBS0VVUF9DSEFSUyB0byB0ZWxsIHNlbGVjdCgpICh2aWEKIAkgICBuX3R0eS5jOm5vcm1hbF9wb2xsKCkgKSB0aGF0IHdlJ3JlIG5vdCB3cml0ZWFibGUuICovCi0JaWYoIHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyB8fCBwcml2LT50eF90aHJvdHRsZWQgKQorCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSB8fCBwcml2LT50eF90aHJvdHRsZWQpCiAJCXJldHVybiAyNTY7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYwppbmRleCBiNWYyYzA2Li42YTk5YWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKQEAgLTI1NCwxMCArMjU0LDE1IEBACiAJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gKDApOwogCX0KLQlpZiAod3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworCisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAljb3VudCA9IChjb3VudCA+IE9NTklORVRfQlVMS09VVFNJWkUpID8gT01OSU5FVF9CVUxLT1VUU0laRSA6IGNvdW50OwogCkBAIC0yNzUsOSArMjgwLDEwIEBACiAKIAl3cG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3cG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQllbHNlCisJfSBlbHNlCiAJCXJlc3VsdCA9IGNvdW50OwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI5MSw3ICsyOTcsNyBAQAogCiAJaW50IHJvb20gPSAwOyAvLyBEZWZhdWx0OiBubyByb29tCiAKLQlpZiAod3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykKKwlpZiAod3BvcnQtPndyaXRlX3VyYl9idXN5KQogCQlyb29tID0gd3BvcnQtPmJ1bGtfb3V0X3NpemUgLSBPTU5JTkVUX0hFQURFUkxFTjsKIAogLy8JZGJnKCJvbW5pbmV0X3dyaXRlX3Jvb20gcmV0dXJucyAlZCIsIHJvb20pOwpAQCAtMzA2LDYgKzMxMiw3IEBACiAKIC8vCWRiZygib21uaW5ldF93cml0ZV9idWxrX2NhbGxiYWNrLCBwb3J0ICUweFxuIiwgcG9ydCk7CiAKKwlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggYjcyMjE3NS4uZTkyNTY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtMTIsMTQgKzEyLDI1IEBACiAgIEhpc3Rvcnk6CiAKICAgMjAwNS0wNS0xOSAgdjAuMSAgIEluaXRpYWwgdmVyc2lvbiwgYmFzZWQgb24gaW5jb21wbGV0ZSBkb2NzCi0gICAgICAgICAgICAgICAgICAgICBhbmQgYW5hbHlzaXMgb2YgbWlzYmVoYXZpb3Igb2YgdGhlIHN0YW5kYXJkIGRyaXZlcgorICAgICAgICAgICAgICAgICAgICAgYW5kIGFuYWx5c2lzIG9mIG1pc2JlaGF2aW9yIHdpdGggdGhlIHN0YW5kYXJkIGRyaXZlcgogICAyMDA1LTA1LTIwICB2MC4yICAgRXh0ZW5kZWQgdGhlIGlucHV0IGJ1ZmZlciB0byBhdm9pZCBsb3NpbmcKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA2NC1ieXRlIGNodW5rcyBvZiBkYXRhCiAgIDIwMDUtMDUtMjEgIHYwLjMgICBpbXBsZW1lbnRlZCBjaGFyc19pbl9idWZmZXIoKQogICAgICAgICAgICAgICAgICAgICAgdHVybmVkIG9uIGxvd19sYXRlbmN5CiAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkIHRoZSBjb2RlIHNvbWV3aGF0CisgIDIwMDUtMDUtMjQgIHYwLjQgICBvcHRpb25fd3JpdGUoKSBzb21ldGltZXMgZGVhZGxvY2tlZCB1bmRlciBoZWF2eSBsb2FkCisgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIHNvbWUgZGVhZCBjb2RlCisgICAgICAgICAgICAgICAgICAgICBhZGRlZCBzcG9uc29yIG5vdGljZQorICAgICAgICAgICAgICAgICAgICAgY29kaW5nIHN0eWxlIGNsZWFuLXVwCisgIDIwMDUtMDYtMjAgIHYwLjQuMSBhZGQgbWlzc2luZyBicmFjZXMgOi0vCisgICAgICAgICAgICAgICAgICAgICBraWxsZWQgZW5kLW9mLWxpbmUgd2hpdGVzcGFjZQorICAyMDA1LTA3LTE1ICB2MC40LjIgcmVuYW1lIFdMQU4gcHJvZHVjdCB0byBGVVNJT04sIGFkZCBGVVNJT04yCisKKyAgV29yayBzcG9uc29yZWQgYnk6IFNpZ29zIEdtYkgsIEdlcm1hbnkgPGluZm9Ac2lnb3MuZGU+CisKICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4zIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC40IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJPcHRpb24gQ2FyZCAoUEMtQ2FyZCB0bykgVVNCIHRvIFNlcmlhbCBEcml2ZXIiCiAKQEAgLTQ0LDcgKzU1LDYgQEAKIAogc3RhdGljIHZvaWQgb3B0aW9uX2luc3RhdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAotCiBzdGF0aWMgaW50ICBvcHRpb25fd3JpdGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIApAQCAtNjAsMTQgKzcwLDE3IEBACiBzdGF0aWMgaW50ICBvcHRpb25fc2VuZF9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiAKIC8qIFZlbmRvciBhbmQgcHJvZHVjdCBJRHMgKi8KLSNkZWZpbmUgT1BUSU9OX1ZFTkRPUl9JRAkJMHgwQUYwCisjZGVmaW5lIE9QVElPTl9WRU5ET1JfSUQJCQkweDBBRjAKIAotI2RlZmluZQlPUFRJT05fUFJPRFVDVF9PTEQJCTB4NTAwMAotI2RlZmluZQlPUFRJT05fUFJPRFVDVF9XTEFOCQkweDYwMDAKKyNkZWZpbmUgT1BUSU9OX1BST0RVQ1RfT0xECQkweDUwMDAKKyNkZWZpbmUgT1BUSU9OX1BST0RVQ1RfRlVTSU9OCTB4NjAwMAorI2RlZmluZSBPUFRJT05fUFJPRFVDVF9GVVNJT04yCTB4NjMwMAorCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX09MRCkgfSwKLQl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfV0xBTikgfSwKKwl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfRlVTSU9OKSB9LAorCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9GVVNJT04yKSB9LAogCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtODUsNTggKzk4LDYyIEBACiAgKiByZWNvZ25pemVzIHNlcGFyYXRlbHksIHRodXMgbnVtX3BvcnQ9MS4KICAqLwogc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIG9wdGlvbl8zcG9ydF9kZXZpY2UgPSB7Ci0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJCT0gIk9wdGlvbiAzLXBvcnQgY2FyZCIsCi0JLnNob3J0X25hbWUJCT0gIm9wdGlvbiIsCi0JLmlkX3RhYmxlCQk9IG9wdGlvbl9pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbgkJPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQJCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX3BvcnRzCQk9IDEsIC8qIDMgKi8KLQkub3BlbgkJCT0gb3B0aW9uX29wZW4sCi0JLmNsb3NlCQkJPSBvcHRpb25fY2xvc2UsCi0JLndyaXRlCQkJPSBvcHRpb25fd3JpdGUsCi0JLndyaXRlX3Jvb20JCT0gb3B0aW9uX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlcgk9IG9wdGlvbl9jaGFyc19pbl9idWZmZXIsCi0JLnRocm90dGxlCQk9IG9wdGlvbl9yeF90aHJvdHRsZSwKLQkudW50aHJvdHRsZQkJPSBvcHRpb25fcnhfdW50aHJvdHRsZSwKLQkuaW9jdGwJCQk9IG9wdGlvbl9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MJCT0gb3B0aW9uX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwJCT0gb3B0aW9uX2JyZWFrX2N0bCwKLQkudGlvY21nZXQJCT0gb3B0aW9uX3Rpb2NtZ2V0LAotCS50aW9jbXNldAkJPSBvcHRpb25fdGlvY21zZXQsCi0JLmF0dGFjaAkJCT0gb3B0aW9uX3N0YXJ0dXAsCi0JLnNodXRkb3duCQk9IG9wdGlvbl9zaHV0ZG93biwKLQkucmVhZF9pbnRfY2FsbGJhY2sJPSBvcHRpb25faW5zdGF0X2NhbGxiYWNrLAorCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5uYW1lICAgICAgICAgICAgICA9ICJPcHRpb24gM0cgZGF0YSBjYXJkIiwKKwkuc2hvcnRfbmFtZSAgICAgICAgPSAib3B0aW9uIiwKKwkuaWRfdGFibGUgICAgICAgICAgPSBvcHRpb25faWRzLAorCS5udW1faW50ZXJydXB0X2luICA9IE5VTV9ET05UX0NBUkUsCisJLm51bV9idWxrX2luICAgICAgID0gTlVNX0RPTlRfQ0FSRSwKKwkubnVtX2J1bGtfb3V0ICAgICAgPSBOVU1fRE9OVF9DQVJFLAorCS5udW1fcG9ydHMgICAgICAgICA9IDEsIC8qIDMsIGJ1dCB0aGUgY2FyZCByZXBvcnRzIGl0cyBwb3J0cyBzZXBhcmF0ZWx5ICovCisJLm9wZW4gICAgICAgICAgICAgID0gb3B0aW9uX29wZW4sCisJLmNsb3NlICAgICAgICAgICAgID0gb3B0aW9uX2Nsb3NlLAorCS53cml0ZSAgICAgICAgICAgICA9IG9wdGlvbl93cml0ZSwKKwkud3JpdGVfcm9vbSAgICAgICAgPSBvcHRpb25fd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyICAgPSBvcHRpb25fY2hhcnNfaW5fYnVmZmVyLAorCS50aHJvdHRsZSAgICAgICAgICA9IG9wdGlvbl9yeF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSAgICAgICAgPSBvcHRpb25fcnhfdW50aHJvdHRsZSwKKwkuaW9jdGwgICAgICAgICAgICAgPSBvcHRpb25faW9jdGwsCisJLnNldF90ZXJtaW9zICAgICAgID0gb3B0aW9uX3NldF90ZXJtaW9zLAorCS5icmVha19jdGwgICAgICAgICA9IG9wdGlvbl9icmVha19jdGwsCisJLnRpb2NtZ2V0ICAgICAgICAgID0gb3B0aW9uX3Rpb2NtZ2V0LAorCS50aW9jbXNldCAgICAgICAgICA9IG9wdGlvbl90aW9jbXNldCwKKwkuYXR0YWNoICAgICAgICAgICAgPSBvcHRpb25fc3RhcnR1cCwKKwkuc2h1dGRvd24gICAgICAgICAgPSBvcHRpb25fc2h1dGRvd24sCisJLnJlYWRfaW50X2NhbGxiYWNrID0gb3B0aW9uX2luc3RhdF9jYWxsYmFjaywKIH07CiAKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCiBzdGF0aWMgaW50IGRlYnVnOworI2Vsc2UKKyNkZWZpbmUgZGVidWcgMAorI2VuZGlmCisKIAogLyogcGVyIHBvcnQgcHJpdmF0ZSBkYXRhICovCiAKLSNkZWZpbmUgTl9JTl9VUkIJNAotI2RlZmluZSBOX09VVF9VUkIJMQotI2RlZmluZSBJTl9CVUZMRU4JMTAyNAotI2RlZmluZSBPVVRfQlVGTEVOCTEwMjQKKyNkZWZpbmUgTl9JTl9VUkIgNAorI2RlZmluZSBOX09VVF9VUkIgMQorI2RlZmluZSBJTl9CVUZMRU4gMTAyNAorI2RlZmluZSBPVVRfQlVGTEVOIDEyOAogCiBzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSB7CiAJLyogSW5wdXQgZW5kcG9pbnRzIGFuZCBidWZmZXIgZm9yIHRoaXMgcG9ydCAqLwotCXN0cnVjdCB1cmIJKmluX3VyYnNbTl9JTl9VUkJdOwotCWNoYXIJCWluX2J1ZmZlcltOX0lOX1VSQl1bSU5fQlVGTEVOXTsKKwlzdHJ1Y3QgdXJiICppbl91cmJzW05fSU5fVVJCXTsKKwljaGFyIGluX2J1ZmZlcltOX0lOX1VSQl1bSU5fQlVGTEVOXTsKIAkvKiBPdXRwdXQgZW5kcG9pbnRzIGFuZCBidWZmZXIgZm9yIHRoaXMgcG9ydCAqLwotCXN0cnVjdCB1cmIJKm91dF91cmJzW05fT1VUX1VSQl07Ci0JY2hhcgkJb3V0X2J1ZmZlcltOX09VVF9VUkJdW09VVF9CVUZMRU5dOworCXN0cnVjdCB1cmIgKm91dF91cmJzW05fT1VUX1VSQl07CisJY2hhciBvdXRfYnVmZmVyW05fT1VUX1VSQl1bT1VUX0JVRkxFTl07CiAKIAkvKiBTZXR0aW5ncyBmb3IgdGhlIHBvcnQgKi8KLQlpbnQJCXJ0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAob3V0cHV0cykgKi8KLQlpbnQJCWR0cl9zdGF0ZTsKLQlpbnQJCWN0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAoaW5wdXRzKSAqLwotCWludAkJZHNyX3N0YXRlOwotCWludAkJZGNkX3N0YXRlOwotCWludAkJcmlfc3RhdGU7Ci0JLy8gaW50CQlicmVha19vbjsKKwlpbnQgcnRzX3N0YXRlOwkvKiBIYW5kc2hha2luZyBwaW5zIChvdXRwdXRzKSAqLworCWludCBkdHJfc3RhdGU7CisJaW50IGN0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAoaW5wdXRzKSAqLworCWludCBkc3Jfc3RhdGU7CisJaW50IGRjZF9zdGF0ZTsKKwlpbnQgcmlfc3RhdGU7CiAKLQl1bnNpZ25lZCBsb25nCXR4X3N0YXJ0X3RpbWVbTl9PVVRfVVJCXTsKKwl1bnNpZ25lZCBsb25nIHR4X3N0YXJ0X3RpbWVbTl9PVVRfVVJCXTsKIH07CiAKIApAQCAtMTkwLDEzICsyMDcsMTMgQEAKIG9wdGlvbl9icmVha19jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKIHsKIAkvKiBVbmZvcnR1bmF0ZWx5LCBJIGRvbid0IGtub3cgaG93IHRvIHNlbmQgYSBicmVhayAqLwotIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIAogCiBzdGF0aWMgdm9pZAogb3B0aW9uX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCSAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTIwNCwxMCArMjIxLDEwIEBACiB9CiAKIHN0YXRpYyBpbnQKLW9wdGlvbl90aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK29wdGlvbl90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JdW5zaWduZWQgaW50CQkJdmFsdWU7Ci0Jc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgCSpwb3J0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKQEAgLTIyNSw3ICsyNDIsNyBAQAogb3B0aW9uX3Rpb2Ntc2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewotCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlIAkqcG9ydGRhdGE7CisJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKQEAgLTI1MCw3MSArMjY3LDUwIEBACiAKIC8qIFdyaXRlICovCiBzdGF0aWMgaW50Ci1vcHRpb25fd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK29wdGlvbl93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgCSpwb3J0ZGF0YTsKLQlpbnQJCQkJaTsKLQlpbnQgCQkJCWxlZnQsIHRvZG87Ci0Jc3RydWN0IHVyYgkJCSp0aGlzX3VyYiA9IE5VTEw7IC8qIHNwdXJpb3VzICovCi0gCWludCAJCQkJZXJyOworCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKwlpbnQgaTsKKwlpbnQgbGVmdCwgdG9kbzsKKwlzdHJ1Y3QgdXJiICp0aGlzX3VyYiA9IE5VTEw7IC8qIHNwdXJpb3VzICovCisJaW50IGVycjsKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fRlVOQ1RJT05fXywgY291bnQpOwogCi0jaWYgMAotCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7Ci0JaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KSB7Ci0JCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJZGJnKCIlczogYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKLQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Ci0jZW5kaWYKLQogCWkgPSAwOwogCWxlZnQgPSBjb3VudDsKLQl3aGlsZSAobGVmdD4wKSB7CisJZm9yIChpPTA7IGxlZnQgPiAwICYmIGkgPCBOX09VVF9VUkI7IGkrKykgewogCQl0b2RvID0gbGVmdDsKIAkJaWYgKHRvZG8gPiBPVVRfQlVGTEVOKQogCQkJdG9kbyA9IE9VVF9CVUZMRU47CiAKLQkJZm9yICg7aSA8IE5fT1VUX1VSQjsgaSsrKSB7Ci0JCQkvKiBDaGVjayB3ZSBoYXZlIGEgdmFsaWQgdXJiL2VuZHBvaW50IGJlZm9yZSB3ZSB1c2UgaXQuLi4gKi8KLQkJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOwotCQkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQotCQkJCWJyZWFrOworCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CiAJCQlpZiAodGhpc191cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX0FTWU5DX1VOTElOSykKIAkJCQljb250aW51ZTsKIAkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBwb3J0ZGF0YS0+dHhfc3RhcnRfdGltZVtpXSArIDEwICogSFopKQogCQkJCWNvbnRpbnVlOwogCQkJdGhpc191cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJCQl1c2JfdW5saW5rX3VyYih0aGlzX3VyYik7CisJCQljb250aW51ZTsKIAkJfQotCi0JCWlmIChpID09IE5fT1VUX1VSQikgewotCQkJLyogbm8gYnVsayBvdXQgZnJlZSEgKi8KLQkJCWRiZygiJXM6IG5vIG91dHB1dCB1cmIgLS0gbGVmdCAlZCIsIF9fRlVOQ1RJT05fXyxjb3VudC1sZWZ0KTsKLSNpZiAwCi0JCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7Ci0jZW5kaWYKLQkJCXJldHVybiBjb3VudC1sZWZ0OwotCQl9CisJCWlmICh0aGlzX3VyYi0+c3RhdHVzICE9IDApCisJCQlkYmcoInVzYl93cml0ZSAlcCBmYWlsZWQgKGVycj0lZCkiLCB0aGlzX3VyYiwgdGhpc191cmItPnN0YXR1cyk7CiAKIAkJZGJnKCIlczogZW5kcG9pbnQgJWQgYnVmICVkIiwgX19GVU5DVElPTl9fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgaSk7CiAKKwkJLyogc2VuZCB0aGUgZGF0YSAqLwogCQltZW1jcHkgKHRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgdG9kbyk7Ci0KLQkJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCQl0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHRvZG87CiAKIAkJdGhpc191cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOwogCQl0aGlzX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVycikgewotCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYiAlcCAod3JpdGUgYnVsaykgZmFpbGVkICglZCwsIGhhcyAlZCkiLCB0aGlzX3VyYiwgZXJyLCB0aGlzX3VyYi0+c3RhdHVzKTsKKwkJCWRiZygidXNiX3N1Ym1pdF91cmIgJXAgKHdyaXRlIGJ1bGspIGZhaWxlZCAoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwgZXJyLCB0aGlzX3VyYi0+c3RhdHVzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBvcnRkYXRhLT50eF9zdGFydF90aW1lW2ldID0gamlmZmllczsKQEAgLTMyMyw5ICszMTksNiBAQAogCX0KIAogCWNvdW50IC09IGxlZnQ7Ci0jaWYgMAotCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLSNlbmRpZgogCWRiZygiJXM6IHdyb3RlIChkaWQgJWQpIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMzMzLDcgKzMyNiw3IEBACiBzdGF0aWMgdm9pZAogb3B0aW9uX2luZGF0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludAlpLCBlcnI7CisJaW50IGksIGVycjsKIAlpbnQgZW5kcG9pbnQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtNDQ0LDEwICs0MzcsMTEgQEAKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykKKwlmb3IgKGk9MDsgaSA8IE5fT1VUX1VSQjsgaSsrKSB7CiAJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOwogCQlpZiAodGhpc191cmIgJiYgdGhpc191cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCiAJCQlkYXRhX2xlbiArPSBPVVRfQlVGTEVOOworCX0KIAogCWRiZygiJXM6ICVkIiwgX19GVU5DVElPTl9fLCBkYXRhX2xlbik7CiAJcmV0dXJuIGRhdGFfbGVuOwpAQCAtNDY0LDExICs0NTgsMTEgQEAKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykKKwlmb3IgKGk9MDsgaSA8IE5fT1VUX1VSQjsgaSsrKSB7CiAJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOwogCQlpZiAodGhpc191cmIgJiYgdGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCQlkYXRhX2xlbiArPSB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKLQorCX0KIAlkYmcoIiVzOiAlZCIsIF9fRlVOQ1RJT05fXywgZGF0YV9sZW4pOwogCXJldHVybiBkYXRhX2xlbjsKIH0KQEAgLTQ3NywxMCArNDcxLDEwIEBACiBzdGF0aWMgaW50CiBvcHRpb25fb3BlbiAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgCSpwb3J0ZGF0YTsKLQlzdHJ1Y3QgdXNiX3NlcmlhbCAJCSpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Ci0JaW50CQkJCWksIGVycjsKLQlzdHJ1Y3QgdXJiCQkJKnVyYjsKKwlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlpbnQgaSwgZXJyOworCXN0cnVjdCB1cmIgKnVyYjsKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC01MjgsNyArNTIyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1zdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCitzdG9wX3VyYiAoc3RydWN0IHVyYiAqdXJiKQogewogCWlmICh1cmIgJiYgdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CkBAIC01MzcsMTEgKzUzMSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotb3B0aW9uX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorb3B0aW9uX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQJCQlpOwotCXN0cnVjdCB1c2Jfc2VyaWFsCSpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Ci0Jc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgCSpwb3J0ZGF0YTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtNTg5LDExICs1ODMsMTEgQEAKIAogLyogU2V0dXAgdXJicyAqLwogc3RhdGljIHZvaWQKLW9wdGlvbl9zZXR1cF91cmJzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitvcHRpb25fc2V0dXBfdXJicyAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlpbnQJCQkJajsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CQkqcG9ydDsKLQlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZQkqcG9ydGRhdGE7CisJaW50IGo7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNjE3LDcgKzYxMSw3IEBACiAKIAogc3RhdGljIGludAotb3B0aW9uX3NlbmRfc2V0dXAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK29wdGlvbl9zZW5kX3NldHVwIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwpAQCAtNjQ0LDkgKzYzOCw5IEBACiBzdGF0aWMgaW50CiBvcHRpb25fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlpbnQJCQkJaSwgZXJyOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJCSpwb3J0OwotCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlCSpwb3J0ZGF0YTsKKwlpbnQgaSwgZXJyOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTY3Nyw5ICs2NzEsOSBAQAogc3RhdGljIHZvaWQKIG9wdGlvbl9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlpbnQJCQkJaSwgajsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CQkqcG9ydDsKLQlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZQkqcG9ydGRhdGE7CisJaW50IGksIGo7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNzI0LDYgKzcxOCw4IEBACiBNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCiBtb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBtZXNzYWdlcyIpOworI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zYWZlX3NlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKaW5kZXggMGU4NWVkNi4uOTZhMTc1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKQEAgLTI5OSwxMCArMjk5LDE0IEBACiAJCWRiZyAoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuICgwKTsKIAl9Ci0JaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAoMCk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAlwYWNrZXRfbGVuZ3RoID0gcG9ydC0+YnVsa19vdXRfc2l6ZTsJLy8gZ2V0IG1heCBwYWNrZXRzaXplCiAKQEAgLTM1NCw2ICszNTgsNyBAQAogI2VuZGlmCiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT53cml0ZV91cmIsIEdGUF9LRVJORUwpKSkgeworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCWVyciAoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzY4LDcgKzM3Myw3IEBACiAKIAlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcm9vbSA9IHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAoc2FmZSA/IDIgOiAwKTsKIAogCWlmIChyb29tKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCA1ZGE3NmRkLi4wMjY3YjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTEwNDcsNiArMTA0Nyw3IEBACiAJCW1lbXNldChwb3J0LCAweDAwLCBzaXplb2Yoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCkpOwogCQlwb3J0LT5udW1iZXIgPSBpICsgc2VyaWFsLT5taW5vcjsKIAkJcG9ydC0+c2VyaWFsID0gc2VyaWFsOworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJCUlOSVRfV09SSygmcG9ydC0+d29yaywgdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQsIHBvcnQpOwogCQlzZXJpYWwtPnBvcnRbaV0gPSBwb3J0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5oCmluZGV4IGQxZjBjNDAuLjU3ZjkyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuaApAQCAtNjksNiArNjksNyBAQAogICogdXNiX3NlcmlhbF9wb3J0OiBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpYyBwb3J0cyBvZiBhIGRldmljZS4KICAqIEBzZXJpYWw6IHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IHVzYl9zZXJpYWwgb3duZXIgb2YgdGhpcyBwb3J0LgogICogQHR0eTogcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyB0dHkgZm9yIHRoaXMgcG9ydC4KKyAqIEBsb2NrOiBzcGlubG9jayB0byBncmFiIHdoZW4gdXBkYXRpbmcgcG9ydGlvbnMgb2YgdGhpcyBzdHJ1Y3R1cmUuCiAgKiBAbnVtYmVyOiB0aGUgbnVtYmVyIG9mIHRoZSBwb3J0ICh0aGUgbWlub3IgbnVtYmVyKS4KICAqIEBpbnRlcnJ1cHRfaW5fYnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnRlcnJ1cHQgaW4gYnVmZmVyIGZvciB0aGlzIHBvcnQuCiAgKiBAaW50ZXJydXB0X2luX3VyYjogcG9pbnRlciB0byB0aGUgaW50ZXJydXB0IGluIHN0cnVjdCB1cmIgZm9yIHRoaXMgcG9ydC4KQEAgLTk4LDYgKzk5LDcgQEAKIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgewogCXN0cnVjdCB1c2Jfc2VyaWFsICoJc2VyaWFsOwogCXN0cnVjdCB0dHlfc3RydWN0ICoJdHR5OworCXNwaW5sb2NrX3QJCWxvY2s7CiAJdW5zaWduZWQgY2hhcgkJbnVtYmVyOwogCiAJdW5zaWduZWQgY2hhciAqCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOwpAQCAtMTE3LDYgKzExOSw3IEBACiAJdW5zaWduZWQgY2hhciAqCQlidWxrX291dF9idWZmZXI7CiAJaW50CQkJYnVsa19vdXRfc2l6ZTsKIAlzdHJ1Y3QgdXJiICoJCXdyaXRlX3VyYjsKKwlpbnQJCQl3cml0ZV91cmJfYnVzeTsKIAlfX3U4CQkJYnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd3JpdGVfd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwppbmRleCBlNDNlZGRjLi5hZjI5NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCkBAIC0xNTUsNiArMTU1LDE1IEBACiAJCSAqIElmIHRoaXMgZGV2aWNlIG1ha2VzIHRoYXQgbWlzdGFrZSwgdGVsbCB0aGUgc2QgZHJpdmVyLiAqLwogCQlpZiAodXMtPmZsYWdzICYgVVNfRkxfRklYX0NBUEFDSVRZKQogCQkJc2Rldi0+Zml4X2NhcGFjaXR5ID0gMTsKKworCQkvKiBVU0ItSURFIGJyaWRnZXMgdGVuZCB0byByZXBvcnQgU0sgPSAweDA0IChOb24tcmVjb3ZlcmFibGUKKwkJICogSGFyZHdhcmUgRXJyb3IpIHdoZW4gYW55IGxvdy1sZXZlbCBlcnJvciBvY2N1cnMsCisJCSAqIHJlY292ZXJhYmxlIG9yIG5vdC4gIFNldHRpbmcgdGhpcyBmbGFnIHRlbGxzIHRoZSBTQ1NJCisJCSAqIG1pZGxheWVyIHRvIHJldHJ5IHN1Y2ggY29tbWFuZHMsIHdoaWNoIGZyZXF1ZW50bHkgd2lsbAorCQkgKiBzdWNjZWVkIGFuZCBmaXggdGhlIGVycm9yLiAgVGhlIHdvcnN0IHRoaXMgY2FuIGxlYWQgdG8KKwkJICogaXMgYW4gb2NjYXNpb25hbCBzZXJpZXMgb2YgcmV0cmllcyB0aGF0IHdpbGwgYWxsIGZhaWwuICovCisJCXNkZXYtPnJldHJ5X2h3ZXJyb3IgPSAxOworCiAJfSBlbHNlIHsKIAogCQkvKiBOb24tZGlzay10eXBlIGRldmljZXMgZG9uJ3QgbmVlZCB0byBibGFja2xpc3QgYW55IHBhZ2VzCkBAIC0yNTUsNTAgKzI2NCwyMyBAQAogCiAJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzIGFuZCBkbyB0aGUgcmVzZXQgKi8KIAlkb3duKCYodXMtPmRldl9zZW1hcGhvcmUpKTsKLQlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKLQkJcmVzdWx0ID0gRkFJTEVEOwotCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKLQl9IGVsc2UKLQkJcmVzdWx0ID0gdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CisJcmVzdWx0ID0gdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CiAJdXAoJih1cy0+ZGV2X3NlbWFwaG9yZSkpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcmVzdWx0IDwgMCA/IEZBSUxFRCA6IFNVQ0NFU1M7CiB9CiAKLS8qIFRoaXMgcmVzZXRzIHRoZSBkZXZpY2UncyBVU0IgcG9ydC4gKi8KLS8qIEl0IHJlZnVzZXMgdG8gd29yayBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGluCi0gKiB0aGUgZGV2aWNlLCBzbyB0aGF0IG90aGVyIHVzZXJzIGFyZSBub3QgYWZmZWN0ZWQuICovCisvKiBTaW11bGF0ZSBhIFNDU0kgYnVzIHJlc2V0IGJ5IHJlc2V0dGluZyB0aGUgZGV2aWNlJ3MgVVNCIHBvcnQuICovCiAvKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBzY3NpX2xvY2soaG9zdCkgaGVsZCAqLwogc3RhdGljIGludCBidXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc3JiLT5kZXZpY2UtPmhvc3QpOwotCWludCByZXN1bHQsIHJjOworCWludCByZXN1bHQ7CiAKIAlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAotCS8qIFRoZSBVU0Igc3Vic3lzdGVtIGRvZXNuJ3QgaGFuZGxlIHN5bmNocm9uaXNhdGlvbiBiZXR3ZWVuCi0JICogYSBkZXZpY2UncyBzZXZlcmFsIGRyaXZlcnMuIFRoZXJlZm9yZSB3ZSByZXNldCBvbmx5IGRldmljZXMKLQkgKiB3aXRoIGp1c3Qgb25lIGludGVyZmFjZSwgd2hpY2ggd2Ugb2YgY291cnNlIG93bi4gKi8KLQogCWRvd24oJih1cy0+ZGV2X3NlbWFwaG9yZSkpOwotCWlmICh0ZXN0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKSkgewotCQlyZXN1bHQgPSAtRUlPOwotCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKLQl9IGVsc2UgaWYgKHVzLT5wdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKLQkJcmVzdWx0ID0gLUVCVVNZOwotCQlVU19ERUJVR1AoIlJlZnVzaW5nIHRvIHJlc2V0IGEgbXVsdGktaW50ZXJmYWNlIGRldmljZVxuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVzLT5wdXNiX2RldiwgdXMtPnB1c2JfaW50Zik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCVVTX0RFQlVHUCgidW5hYmxlIHRvIGxvY2sgZGV2aWNlIGZvciByZXNldDogJWRcbiIsIHJjKTsKLQkJCXJlc3VsdCA9IHJjOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gdXNiX3Jlc2V0X2RldmljZSh1cy0+cHVzYl9kZXYpOwotCQkJaWYgKHJjKQotCQkJCXVzYl91bmxvY2tfZGV2aWNlKHVzLT5wdXNiX2Rldik7Ci0JCQlVU19ERUJVR1AoInVzYl9yZXNldF9kZXZpY2UgcmV0dXJucyAlZFxuIiwgcmVzdWx0KTsKLQkJfQotCX0KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHVzKTsKIAl1cCgmKHVzLT5kZXZfc2VtYXBob3JlKSk7CiAKIAkvKiBsb2NrIHRoZSBob3N0IGZvciB0aGUgcmV0dXJuICovCkBAIC0zMjAsNiArMzAyLDE0IEBACiAJfQogfQogCisvKiBSZXBvcnQgYSBkcml2ZXItaW5pdGlhdGVkIGJ1cyByZXNldCB0byB0aGUgU0NTSSBsYXllci4KKyAqIENhbGxpbmcgdGhpcyBmb3IgYSBTQ1NJLWluaXRpYXRlZCByZXNldCBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MuCisgKiBUaGUgY2FsbGVyIG11c3Qgb3duIHRoZSBTQ1NJIGhvc3QgbG9jay4gKi8KK3ZvaWQgdXNiX3N0b3JfcmVwb3J0X2J1c19yZXNldChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHVzX3RvX2hvc3QodXMpLCAwKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAvcHJvYy9zY3NpLyBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuaAppbmRleCBkMGE0OWFmLi43MzdlNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIF9TQ1NJR0xVRV9IXwogCiBleHRlcm4gdm9pZCB1c2Jfc3Rvcl9yZXBvcnRfZGV2aWNlX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CitleHRlcm4gdm9pZCB1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREJbMThdOwogZXh0ZXJuIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgdXNiX3N0b3JfaG9zdF90ZW1wbGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IDk3NDNlMjguLmU2YjFjNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtMjY2LDggKzI2Niw5IEBACiAJCU5VTEwsIDAsIDMqSFopOwogCiAJLyogcmVzZXQgdGhlIGVuZHBvaW50IHRvZ2dsZSAqLwotCXVzYl9zZXR0b2dnbGUodXMtPnB1c2JfZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLAotCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CisJaWYgKHJlc3VsdCA+PSAwKQorCQl1c2Jfc2V0dG9nZ2xlKHVzLT5wdXNiX2RldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkJCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CiAKIAlVU19ERUJVR1AoIiVzOiByZXN1bHQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CkBAIC01NDAsMTUgKzU0MSwxNSBAQAogCSAqLwogCWlmICh0ZXN0X2JpdChVU19GTElEWF9USU1FRF9PVVQsICZ1cy0+ZmxhZ3MpKSB7CiAJCVVTX0RFQlVHUCgiLS0gY29tbWFuZCB3YXMgYWJvcnRlZFxuIik7Ci0JCWdvdG8gSGFuZGxlX0Fib3J0OworCQlzcmItPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJZ290byBIYW5kbGVfRXJyb3JzOwogCX0KIAogCS8qIGlmIHRoZXJlIGlzIGEgdHJhbnNwb3J0IGVycm9yLCByZXNldCBhbmQgZG9uJ3QgYXV0by1zZW5zZSAqLwogCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SKSB7CiAJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyBlcnJvciwgcmVzZXR0aW5nXG4iKTsKLQkJdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CiAJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwotCQlyZXR1cm47CisJCWdvdG8gSGFuZGxlX0Vycm9yczsKIAl9CiAKIAkvKiBpZiB0aGUgdHJhbnNwb3J0IHByb3ZpZGVkIGl0cyBvd24gc2Vuc2UgZGF0YSwgZG9uJ3QgYXV0by1zZW5zZSAqLwpAQCAtNjY4LDcgKzY2OSw4IEBACiAKIAkJaWYgKHRlc3RfYml0KFVTX0ZMSURYX1RJTUVEX09VVCwgJnVzLT5mbGFncykpIHsKIAkJCVVTX0RFQlVHUCgiLS0gYXV0by1zZW5zZSBhYm9ydGVkXG4iKTsKLQkJCWdvdG8gSGFuZGxlX0Fib3J0OworCQkJc3JiLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCX0KIAkJaWYgKHRlbXBfcmVzdWx0ICE9IFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EKSB7CiAJCQlVU19ERUJVR1AoIi0tIGF1dG8tc2Vuc2UgZmFpbHVyZVxuIik7CkBAIC02NzcsOSArNjc5LDkgQEAKIAkJCSAqIG11bHRpLXRhcmdldCBkZXZpY2UsIHNpbmNlIGZhaWx1cmUgb2YgYW4KIAkJCSAqIGF1dG8tc2Vuc2UgaXMgcGVyZmVjdGx5IHZhbGlkCiAJCQkgKi8KLQkJCWlmICghKHVzLT5mbGFncyAmIFVTX0ZMX1NDTV9NVUxUX1RBUkcpKQotCQkJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOwogCQkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQlpZiAoISh1cy0+ZmxhZ3MgJiBVU19GTF9TQ01fTVVMVF9UQVJHKSkKKwkJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzIwLDEyICs3MjIsMjggQEAKIAogCXJldHVybjsKIAotCS8qIGFib3J0IHByb2Nlc3Npbmc6IHRoZSBidWxrLW9ubHkgdHJhbnNwb3J0IHJlcXVpcmVzIGEgcmVzZXQKLQkgKiBmb2xsb3dpbmcgYW4gYWJvcnQgKi8KLSAgSGFuZGxlX0Fib3J0OgotCXNyYi0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwotCWlmICh1cy0+cHJvdG9jb2wgPT0gVVNfUFJfQlVMSykKKwkvKiBFcnJvciBhbmQgYWJvcnQgcHJvY2Vzc2luZzogdHJ5IHRvIHJlc3luY2hyb25pemUgd2l0aCB0aGUgZGV2aWNlCisJICogYnkgaXNzdWluZyBhIHBvcnQgcmVzZXQuICBJZiB0aGF0IGZhaWxzLCB0cnkgYSBjbGFzcy1zcGVjaWZpYworCSAqIGRldmljZSByZXNldC4gKi8KKyAgSGFuZGxlX0Vycm9yczoKKworCS8qIExldCB0aGUgU0NTSSBsYXllciBrbm93IHdlIGFyZSBkb2luZyBhIHJlc2V0LCBzZXQgdGhlCisJICogUkVTRVRUSU5HIGJpdCwgYW5kIGNsZWFyIHRoZSBBQk9SVElORyBiaXQgc28gdGhhdCB0aGUgcmVzZXQKKwkgKiBtYXkgcHJvY2VlZC4gKi8KKwlzY3NpX2xvY2sodXNfdG9faG9zdCh1cykpOworCXVzYl9zdG9yX3JlcG9ydF9idXNfcmVzZXQodXMpOworCXNldF9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKKwljbGVhcl9iaXQoVVNfRkxJRFhfQUJPUlRJTkcsICZ1cy0+ZmxhZ3MpOworCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKworCXJlc3VsdCA9IHVzYl9zdG9yX3BvcnRfcmVzZXQodXMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXNjc2lfbG9jayh1c190b19ob3N0KHVzKSk7CisJCXVzYl9zdG9yX3JlcG9ydF9kZXZpY2VfcmVzZXQodXMpOworCQlzY3NpX3VubG9jayh1c190b19ob3N0KHVzKSk7CiAJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOworCX0KKwljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKIH0KIAogLyogU3RvcCB0aGUgY3VycmVudCBVUkIgdHJhbnNmZXIgKi8KQEAgLTExMjQsNyArMTE0Miw3IEBACiAgKiBJdCdzIGhhbmR5IHRoYXQgZXZlcnkgdHJhbnNwb3J0IG1lY2hhbmlzbSB1c2VzIHRoZSBjb250cm9sIGVuZHBvaW50IGZvcgogICogcmVzZXRzLgogICoKLSAqIEJhc2ljYWxseSwgd2Ugc2VuZCBhIHJlc2V0IHdpdGggYSAyMC1zZWNvbmQgdGltZW91dCwgc28gd2UgZG9uJ3QgZ2V0CisgKiBCYXNpY2FsbHksIHdlIHNlbmQgYSByZXNldCB3aXRoIGEgNS1zZWNvbmQgdGltZW91dCwgc28gd2UgZG9uJ3QgZ2V0CiAgKiBqYW1tZWQgYXR0ZW1wdGluZyB0byBkbyB0aGUgcmVzZXQuCiAgKi8KIHN0YXRpYyBpbnQgdXNiX3N0b3JfcmVzZXRfY29tbW9uKHN0cnVjdCB1c19kYXRhICp1cywKQEAgLTExMzMsMjggKzExNTEsMTggQEAKIHsKIAlpbnQgcmVzdWx0OwogCWludCByZXN1bHQyOwotCWludCByYyA9IEZBSUxFRDsKIAotCS8qIExldCB0aGUgU0NTSSBsYXllciBrbm93IHdlIGFyZSBkb2luZyBhIHJlc2V0LCBzZXQgdGhlCi0JICogUkVTRVRUSU5HIGJpdCwgYW5kIGNsZWFyIHRoZSBBQk9SVElORyBiaXQgc28gdGhhdCB0aGUgcmVzZXQKLQkgKiBtYXkgcHJvY2VlZC4KLQkgKi8KLQlzY3NpX2xvY2sodXNfdG9faG9zdCh1cykpOwotCXVzYl9zdG9yX3JlcG9ydF9kZXZpY2VfcmVzZXQodXMpOwotCXNldF9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKLQljbGVhcl9iaXQoVVNfRkxJRFhfQUJPUlRJTkcsICZ1cy0+ZmxhZ3MpOwotCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKwlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKKwkJVVNfREVCVUdQKCJObyByZXNldCBkdXJpbmcgZGlzY29ubmVjdFxuIik7CisJCXJldHVybiAtRUlPOworCX0KIAotCS8qIEEgMjAtc2Vjb25kIHRpbWVvdXQgbWF5IHNlZW0gcmF0aGVyIGxvbmcsIGJ1dCBhIExhQ2llCi0JICogU3R1ZGlvRHJpdmUgVVNCMiBkZXZpY2UgdGFrZXMgMTYrIHNlY29uZHMgdG8gZ2V0IGdvaW5nCi0JICogZm9sbG93aW5nIGEgcG93ZXJ1cCBvciBVU0IgYXR0YWNoIGV2ZW50LgotCSAqLwogCXJlc3VsdCA9IHVzYl9zdG9yX2NvbnRyb2xfbXNnKHVzLCB1cy0+c2VuZF9jdHJsX3BpcGUsCiAJCQlyZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplLAotCQkJMjAqSFopOworCQkJNSpIWik7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJVVNfREVCVUdQKCJTb2Z0IHJlc2V0IGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gRG9uZTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKICAJLyogR2l2ZSB0aGUgZGV2aWNlIHNvbWUgdGltZSB0byByZWNvdmVyIGZyb20gdGhlIHJlc2V0LApAQCAtMTE2NCw3ICsxMTcyLDcgQEAKICAJCQlIWio2KTsKIAlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKIAkJVVNfREVCVUdQKCJSZXNldCBpbnRlcnJ1cHRlZCBieSBkaXNjb25uZWN0XG4iKTsKLQkJZ290byBEb25lOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlVU19ERUJVR1AoIlNvZnQgcmVzZXQ6IGNsZWFyaW5nIGJ1bGstaW4gZW5kcG9pbnQgaGFsdFxuIik7CkBAIC0xMTczLDE3ICsxMTgxLDE0IEBACiAJVVNfREVCVUdQKCJTb2Z0IHJlc2V0OiBjbGVhcmluZyBidWxrLW91dCBlbmRwb2ludCBoYWx0XG4iKTsKIAlyZXN1bHQyID0gdXNiX3N0b3JfY2xlYXJfaGFsdCh1cywgdXMtPnNlbmRfYnVsa19waXBlKTsKIAotCS8qIHJldHVybiBhIHJlc3VsdCBjb2RlIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNvbnRyb2wgbWVzc2FnZSAqLwotCWlmIChyZXN1bHQgPCAwIHx8IHJlc3VsdDIgPCAwKSB7CisJLyogcmV0dXJuIGEgcmVzdWx0IGNvZGUgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgY2xlYXItaGFsdHMgKi8KKwlpZiAocmVzdWx0ID49IDApCisJCXJlc3VsdCA9IHJlc3VsdDI7CisJaWYgKHJlc3VsdCA8IDApCiAJCVVTX0RFQlVHUCgiU29mdCByZXNldCBmYWlsZWRcbiIpOwotCQlnb3RvIERvbmU7Ci0JfQotCVVTX0RFQlVHUCgiU29mdCByZXNldCBkb25lXG4iKTsKLQlyYyA9IFNVQ0NFU1M7Ci0KLSAgRG9uZToKLQljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKLQlyZXR1cm4gcmM7CisJZWxzZQorCQlVU19ERUJVR1AoIlNvZnQgcmVzZXQgZG9uZVxuIik7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpc3N1ZXMgYSBDQltJXSBSZXNldCB0byB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uCkBAIC0xMjEzLDMgKzEyMTgsMzIgQEAKIAkJCQkgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJCSAwLCB1cy0+aWZudW0sIE5VTEwsIDApOwogfQorCisvKiBJc3N1ZSBhIFVTQiBwb3J0IHJlc2V0IHRvIHRoZSBkZXZpY2UuICBCdXQgZG9uJ3QgZG8gYW55dGhpbmcgaWYKKyAqIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaW4gdGhlIGRldmljZSwgc28gdGhhdCBvdGhlciB1c2VycworICogYXJlIG5vdCBhZmZlY3RlZC4gKi8KK2ludCB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlpbnQgcmVzdWx0LCByYzsKKworCWlmICh0ZXN0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKSkgeworCQlyZXN1bHQgPSAtRUlPOworCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKKwl9IGVsc2UgaWYgKHVzLT5wdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKKwkJcmVzdWx0ID0gLUVCVVNZOworCQlVU19ERUJVR1AoIlJlZnVzaW5nIHRvIHJlc2V0IGEgbXVsdGktaW50ZXJmYWNlIGRldmljZVxuIik7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gcmMgPQorCQkJdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cy0+cHVzYl9kZXYsIHVzLT5wdXNiX2ludGYpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVVNfREVCVUdQKCJ1bmFibGUgdG8gbG9jayBkZXZpY2UgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IHVzYl9yZXNldF9kZXZpY2UodXMtPnB1c2JfZGV2KTsKKwkJCWlmIChyYykKKwkJCQl1c2JfdW5sb2NrX2RldmljZSh1cy0+cHVzYl9kZXYpOworCQkJVVNfREVCVUdQKCJ1c2JfcmVzZXRfZGV2aWNlIHJldHVybnMgJWRcbiIsIHJlc3VsdCk7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5oCmluZGV4IGUyNWY4ZDguLjhkOWUwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaApAQCAtMTcxLDQgKzE3MSw1IEBACiBleHRlcm4gaW50IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfc2coc3RydWN0IHVzX2RhdGEgKnVzLCB1bnNpZ25lZCBpbnQgcGlwZSwKIAkJdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgdXNlX3NnLCBpbnQgKnJlc2lkdWFsKTsKIAorZXh0ZXJuIGludCB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IDlmY2M3YmQuLmJkMGFiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtNjk3LDcgKzY5Nyw3IEBACiBVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwgCiAJCSJNaWNyb3RlY2giLAogCQkiVVNCLVNDU0ktSEQ1MCIsCi0JCVVTX1NDX1NDU0ksIFVTX1BSX0JVTEssIHVzYl9zdG9yX2V1c2NzaV9pbml0LAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgdXNiX3N0b3JfZXVzY3NpX2luaXQsCiAJCVVTX0ZMX1NDTV9NVUxUX1RBUkcgKSwgCiAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKaW5kZXggOTc4OTExNS4uN2JjMWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCkBAIC0zNTAsMTAgKzM1MCw4IEBACiBzdGF0aWMgaW50IGRlZmF1bHRfY21vZGUgX19pbml0ZGF0YSA9IENNT0RFXzg7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiBzdGF0aWMgaW50IGRlZmF1bHRfY3J0X29uIF9faW5pdGRhdGEgPSAwOwogc3RhdGljIGludCBkZWZhdWx0X2xjZF9vbiBfX2luaXRkYXRhID0gMTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01UUlIKIHN0YXRpYyBpbnQgbXRyciA9IDE7CkBAIC0xMjQ5LDcgKzEyNDcsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIHN0YXRpYyB2b2lkIGF0eTEyOF9zZXRfY3J0X2VuYWJsZShzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsIGludCBvbikKIHsKIAlpZiAob24pIHsKQEAgLTEyODQsNyArMTI4MSw2IEBACiAJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7CiAJfQogfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCiAKIHN0YXRpYyB2b2lkIGF0eTEyOF9zZXRfcGxsKHN0cnVjdCBhdHkxMjhfcGxsICpwbGwsIGNvbnN0IHN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhcikKIHsKQEAgLTE0OTEsMTIgKzE0ODcsMTAgQEAKIAlpbmZvLT5maXgudmlzdWFsID0gcGFyLT5jcnRjLmJwcCA9PSA4ID8gRkJfVklTVUFMX1BTRVVET0NPTE9SCiAJCTogRkJfVklTVUFMX0RJUkVDVENPTE9SOwogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIAlpZiAocGFyLT5jaGlwX2dlbiA9PSByYWdlX00zKSB7CiAJCWF0eTEyOF9zZXRfY3J0X2VuYWJsZShwYXIsIHBhci0+Y3J0X29uKTsKIAkJYXR5MTI4X3NldF9sY2RfZW5hYmxlKHBhciwgcGFyLT5sY2Rfb24pOwogCX0KLSNlbmRpZgogCWlmIChwYXItPmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpCiAJCWF0eTEyOF9pbml0X2VuZ2luZShwYXIpOwogCkBAIC0xNjUyLDcgKzE2NDYsNiBAQAogCQlyZXR1cm4gMDsKIAogCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJsY2Q6IiwgNCkpIHsKIAkJCWRlZmF1bHRfbGNkX29uID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNCwgTlVMTCwgMCk7CiAJCQljb250aW51ZTsKQEAgLTE2NjAsNyArMTY1Myw2IEBACiAJCQlkZWZhdWx0X2NydF9vbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzQsIE5VTEwsIDApOwogCQkJY29udGludWU7CiAJCX0KLSNlbmRpZgogI2lmZGVmIENPTkZJR19NVFJSCiAJCWlmKCFzdHJuY21wKHRoaXNfb3B0LCAibm9tdHJyIiwgNikpIHsKIAkJCW10cnIgPSAwOwpAQCAtMTc1MiwxMCArMTc0NCw4IEBACiAJaW5mby0+ZmJvcHMgPSAmYXR5MTI4ZmJfb3BzOwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJcGFyLT5sY2Rfb24gPSBkZWZhdWx0X2xjZF9vbjsKIAlwYXItPmNydF9vbiA9IGRlZmF1bHRfY3J0X29uOwotI2VuZGlmCiAKIAl2YXIgPSBkZWZhdWx0X3ZhcjsKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKQEAgLTIwMzUsMTIgKzIwMjUsMTAgQEAKIAogCWF0eV9zdF84KENSVENfRVhUX0NOVEwrMSwgc3RhdGUpOwogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIAlpZiAocGFyLT5jaGlwX2dlbiA9PSByYWdlX00zKSB7CiAJCWF0eTEyOF9zZXRfY3J0X2VuYWJsZShwYXIsIHBhci0+Y3J0X29uICYmICFibGFuayk7CiAJCWF0eTEyOF9zZXRfbGNkX2VuYWJsZShwYXIsIHBhci0+bGNkX29uICYmICFibGFuayk7CiAJfQotI2VuZGlmCQogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAogCWlmICgoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgJiYgIWJsYW5rKQogCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSgxKTsKQEAgLTIxMjQsNyArMjExMiw2IEBACiBzdGF0aWMgaW50IGF0eTEyOGZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCiAJCQkgIHVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiB2YWx1ZTsKIAlpbnQgcmM7CkBAIC0yMTQ5LDcgKzIxMzYsNiBAQAogCQl2YWx1ZSA9IChwYXItPmNydF9vbiA8PCAxKSB8IHBhci0+bGNkX29uOwogCQlyZXR1cm4gcHV0X3VzZXIodmFsdWUsIChfX3UzMiBfX3VzZXIgKilhcmcpOwogCX0KLSNlbmRpZgogCXJldHVybiAtRUlOVkFMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCmluZGV4IDk1ZTcyNTUuLmU3NWE5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCkBAIC0yOCwyMiArMjgsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKICNpbmNsdWRlIDxhc20vYmFja2xpZ2h0Lmg+CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgotI2VuZGlmCiAKIC8qCiAgKiBTaW5jZSB3ZSBhY2Nlc3MgdGhlIGRpc3BsYXkgd2l0aCBpbmIvb3V0YiB0byBmaXhlZCBwb3J0IG51bWJlcnMsCiAgKiB3ZSBjYW4gb25seSBoYW5kbGUgb25lIDY1NTV4IGNoaXAuICAtLSBwYXVsdXMKICAqLwotc3RhdGljIHN0cnVjdCBmYl9pbmZvIGNoaXBzZmJfaW5mbzsKLQogI2RlZmluZSB3cml0ZV9pbmQobnVtLCB2YWwsIGFwLCBkcCkJZG8geyBcCiAJb3V0YigobnVtKSwgKGFwKSk7IG91dGIoKHZhbCksIChkcCkpOyBcCiB9IHdoaWxlICgwKQpAQCAtNzQsMTQgKzY5LDYgQEAKIAlpbmIoMHgzZGEpOyByZWFkX2luZChudW0sIHZhciwgMHgzYzAsIDB4M2MxKTsgXAogfSB3aGlsZSAoMCkKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqc2F2ZV9mcmFtZWJ1ZmZlcjsKLWludCBjaGlwc19zbGVlcF9ub3RpZnkoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwotc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgY2hpcHNfc2xlZXBfbm90aWZpZXIgPSB7Ci0JY2hpcHNfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9WSURFTywKLX07Ci0jZW5kaWYKLQogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9ucwogICovCkBAIC0zNTYsNiArMzQzLDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfY2hpcHMoc3RydWN0IGZiX2luZm8gKnAsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKKwltZW1zZXQocC0+c2NyZWVuX2Jhc2UsIDAsIDB4MTAwMDAwKTsKKwogCXAtPmZpeCA9IGNoaXBzZmJfZml4OwogCXAtPmZpeC5zbWVtX3N0YXJ0ID0gYWRkcjsKIApAQCAtMzY2LDM0ICszNTUsNDEgQEAKIAogCWZiX2FsbG9jX2NtYXAoJnAtPmNtYXAsIDI1NiwgMCk7CiAKLQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIocCkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQyZUIDY1NTUwIGZyYW1lYnVmZmVyIGZhaWxlZCB0byByZWdpc3RlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiBDaGlwcyA2NTU1MCBmcmFtZSBidWZmZXIgKCVkSyBSQU0gZGV0ZWN0ZWQpXG4iLAotCQlwLT5ub2RlLCBwLT5maXguc21lbV9sZW4gLyAxMDI0KTsKLQogCWNoaXBzX2h3X2luaXQoKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQKIGNoaXBzZmJfcGNpX2luaXQoc3RydWN0IHBjaV9kZXYgKmRwLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0cnVjdCBmYl9pbmZvICpwID0gJmNoaXBzZmJfaW5mbzsKKwlzdHJ1Y3QgZmJfaW5mbyAqcDsKIAl1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7CiAJdW5zaWduZWQgc2hvcnQgY21kOworCWludCByYyA9IC1FTk9ERVY7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZHApIDwgMCkgeworCQlkZXZfZXJyKCZkcC0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KIAogCWlmICgoZHAtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCi0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9kaXNhYmxlOwogCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZHAsIDApOwogCXNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRwLCAwKTsKIAlpZiAoYWRkciA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAocC0+c2NyZWVuX2Jhc2UgIT0gMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLCBzaXplLCAiY2hpcHNmYiIpKQotCQlyZXR1cm4gLUVCVVNZOworCQlnb3RvIGVycl9kaXNhYmxlOworCisJcCA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZkcC0+ZGV2KTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRwLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgZnJhbWVidWZmZXIgc3RydWN0dXJlXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24oZHAsIDAsICJjaGlwc2ZiIikgIT0gMCkgeworCQlkZXZfZXJyKCZkcC0+ZGV2LCAiQ2Fubm90IHJlcXVlc3QgZnJhbWVidWZmZXJcbiIpOworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVsZWFzZV9mYjsKKwl9CiAKICNpZmRlZiBfX0JJR19FTkRJQU4KIAlhZGRyICs9IDB4ODAwMDAwOwkvLyBVc2UgYmlnLWVuZGlhbiBhcGVydHVyZQpAQCAtNDExLDM4ICs0MDcsOTAgQEAKIAlzZXRfYmFja2xpZ2h0X2VuYWJsZSgxKTsKICNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KIAorI2lmZGVmIENPTkZJR19QUEMKIAlwLT5zY3JlZW5fYmFzZSA9IF9faW9yZW1hcChhZGRyLCAweDIwMDAwMCwgX1BBR0VfTk9fQ0FDSEUpOworI2Vsc2UKKwlwLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoYWRkciwgMHgyMDAwMDApOworI2VuZGlmCiAJaWYgKHAtPnNjcmVlbl9iYXNlID09IE5VTEwpIHsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHIsIHNpemUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZGV2X2VycigmZHAtPmRldiwgIkNhbm5vdCBtYXAgZnJhbWVidWZmZXJcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcGNpOwogCX0KLQlwLT5kZXZpY2UgPSAmZHAtPmRldjsKLQlpbml0X2NoaXBzKHAsIGFkZHIpOwotCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLQlwbXVfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJmNoaXBzX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAJcGNpX3NldF9kcnZkYXRhKGRwLCBwKTsKKwlwLT5kZXZpY2UgPSAmZHAtPmRldjsKKworCWluaXRfY2hpcHMocCwgYWRkcik7CisKKwlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIocCkgPCAwKSB7CisJCWRldl9lcnIoJmRwLT5kZXYsIkMmVCA2NTU1MCBmcmFtZWJ1ZmZlciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwlkZXZfaW5mbygmZHAtPmRldiwiZmIlZDogQ2hpcHMgNjU1NTAgZnJhbWUgYnVmZmVyIgorCQkgIiAoJWRLIFJBTSBkZXRlY3RlZClcbiIsCisJCSBwLT5ub2RlLCBwLT5maXguc21lbV9sZW4gLyAxMDI0KTsKKwogCXJldHVybiAwOworCisgZXJyX3VubWFwOgorCWlvdW5tYXAocC0+c2NyZWVuX2Jhc2UpOworIGVycl9yZWxlYXNlX3BjaToKKwlwY2lfcmVsZWFzZV9yZWdpb24oZHAsIDApOworIGVycl9yZWxlYXNlX2ZiOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UocCk7CisgZXJyX2Rpc2FibGU6CisgZXJyX291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaGlwc2ZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZHApCiB7CiAJc3RydWN0IGZiX2luZm8gKnAgPSBwY2lfZ2V0X2RydmRhdGEoZHApOwogCi0JaWYgKHAgIT0gJmNoaXBzZmJfaW5mbyB8fCBwLT5zY3JlZW5fYmFzZSA9PSBOVUxMKQorCWlmIChwLT5zY3JlZW5fYmFzZSA9PSBOVUxMKQogCQlyZXR1cm47CiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihwKTsKIAlpb3VubWFwKHAtPnNjcmVlbl9iYXNlKTsKIAlwLT5zY3JlZW5fYmFzZSA9IE5VTEw7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkcCwgMCksIHBjaV9yZXNvdXJjZV9sZW4oZHAsIDApKTsKLQotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JcG11X3VucmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJmNoaXBzX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworCXBjaV9yZWxlYXNlX3JlZ2lvbihkcCwgMCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgY2hpcHNmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChzdGF0ZSA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUpCisJCXJldHVybiAwOworCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX01FTSkKKwkJZ290byBkb25lOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWNoaXBzZmJfYmxhbmsoMSwgcCk7CisJZmJfc2V0X3N1c3BlbmQocCwgMSk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworIGRvbmU6CisJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hpcHNmYl9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlmYl9zZXRfc3VzcGVuZChwLCAwKTsKKwljaGlwc2ZiX2JsYW5rKDAsIHApOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNoaXBzZmJfcGNpX3RibFtdID0gewogCXsgUENJX1ZFTkRPUl9JRF9DVCwgUENJX0RFVklDRV9JRF9DVF82NTU1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAogCXsgMCB9CkBAIC00NTUsNiArNTAzLDEwIEBACiAJLmlkX3RhYmxlID0JY2hpcHNmYl9wY2lfdGJsLAogCS5wcm9iZSA9CWNoaXBzZmJfcGNpX2luaXQsCiAJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKGNoaXBzZmJfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9CWNoaXBzZmJfcGNpX3N1c3BlbmQsCisJLnJlc3VtZSA9CWNoaXBzZmJfcGNpX3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogaW50IF9faW5pdCBjaGlwc19pbml0KHZvaWQpCkBAIC00NzIsNDggKzUyNCw0IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjaGlwc2ZiX2RyaXZlcik7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotLyoKLSAqIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZSBidWZmZXIgd2hlbiB3ZSBnbyB0byBzbGVlcCwKLSAqIGFuZCByZXN0b3JlIGl0IHdoZW4gd2Ugd2FrZSB1cCBhZ2Fpbi4KLSAqLwotaW50Ci1jaGlwc19zbGVlcF9ub3RpZnkoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pCi17Ci0Jc3RydWN0IGZiX2luZm8gKnAgPSAmY2hpcHNmYl9pbmZvOwotCWludCBuYiA9IHAtPnZhci55cmVzICogcC0+Zml4LmxpbmVfbGVuZ3RoOwotCi0JaWYgKHAtPnNjcmVlbl9iYXNlID09IE5VTEwpCi0JCXJldHVybiBQQk9PS19TTEVFUF9PSzsKLQotCXN3aXRjaCAod2hlbikgewotCWNhc2UgUEJPT0tfU0xFRVBfUkVRVUVTVDoKLQkJc2F2ZV9mcmFtZWJ1ZmZlciA9IHZtYWxsb2MobmIpOwotCQlpZiAoc2F2ZV9mcmFtZWJ1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIFBCT09LX1NMRUVQX1JFRlVTRTsKLQkJYnJlYWs7Ci0JY2FzZSBQQk9PS19TTEVFUF9SRUpFQ1Q6Ci0JCWlmIChzYXZlX2ZyYW1lYnVmZmVyKSB7Ci0JCQl2ZnJlZShzYXZlX2ZyYW1lYnVmZmVyKTsKLQkJCXNhdmVfZnJhbWVidWZmZXIgPSBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUEJPT0tfU0xFRVBfTk9XOgotCQljaGlwc2ZiX2JsYW5rKDEsIHApOwotCQlpZiAoc2F2ZV9mcmFtZWJ1ZmZlcikKLQkJCW1lbWNweShzYXZlX2ZyYW1lYnVmZmVyLCBwLT5zY3JlZW5fYmFzZSwgbmIpOwotCQlicmVhazsKLQljYXNlIFBCT09LX1dBS0U6Ci0JCWlmIChzYXZlX2ZyYW1lYnVmZmVyKSB7Ci0JCQltZW1jcHkocC0+c2NyZWVuX2Jhc2UsIHNhdmVfZnJhbWVidWZmZXIsIG5iKTsKLQkJCXZmcmVlKHNhdmVfZnJhbWVidWZmZXIpOwotCQkJc2F2ZV9mcmFtZWJ1ZmZlciA9IE5VTEw7Ci0JCX0KLQkJY2hpcHNmYl9ibGFuaygwLCBwKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBQQk9PS19TTEVFUF9PSzsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IGIyMDlhZGIuLjlkZDBmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC0xNDIsNyArMTQyLDYgQEAKICNkZWZpbmUgQ1VSU09SX0RSQVdfREVMQVkJCSgxKQogCiAvKiAjIFZCTCBpbnRzIGJldHdlZW4gY3Vyc29yIHN0YXRlIGNoYW5nZXMgKi8KLSNkZWZpbmUgQVJNX0NVUlNPUl9CTElOS19SQVRFCQkoMTApCiAjZGVmaW5lIEFUQVJJX0NVUlNPUl9CTElOS19SQVRFCQkoNDIpCiAjZGVmaW5lIE1BQ19DVVJTT1JfQkxJTktfUkFURQkJKDMyKQogI2RlZmluZSBERUZBVUxUX0NVUlNPUl9CTElOS19SQVRFCSgyMCkKQEAgLTI4OCw3ICsyODcsNyBAQAogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIH0KIAotI2lmIChkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoSVJRX1ZTWU5DUFVMU0UpKSB8fCBkZWZpbmVkKENPTkZJR19BVEFSSSkgfHwgZGVmaW5lZChDT05GSUdfTUFDKQorI2lmIGRlZmluZWQoQ09ORklHX0FUQVJJKSB8fCBkZWZpbmVkKENPTkZJR19NQUMpCiBzdGF0aWMgaW50IGN1cnNvcl9ibGlua19yYXRlOwogc3RhdGljIGlycXJldHVybl90IGZiX3ZibF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewpAQCAtODc4LDExICs4NzcsNiBAQAogCX0KICNlbmRpZgkJCQkvKiBDT05GSUdfTUFDICovCiAKLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoSVJRX1ZTWU5DUFVMU0UpCi0JY3Vyc29yX2JsaW5rX3JhdGUgPSBBUk1fQ1VSU09SX0JMSU5LX1JBVEU7Ci0JaXJxcmVzID0gcmVxdWVzdF9pcnEoSVJRX1ZTWU5DUFVMU0UsIGZiX3ZibF9oYW5kbGVyLCBTQV9TSElSUSwKLQkJCSAgICAgImZyYW1lYnVmZmVyIHZibCIsIGluZm8pOwotI2VuZGlmCiAJLyogSW5pdGlhbGl6ZSB0aGUgd29yayBxdWV1ZS4gSWYgdGhlIGRyaXZlciBwcm92aWRlcyBpdHMKIAkgKiBvd24gd29yayBxdWV1ZSB0aGlzIG1lYW5zIGl0IHdpbGwgdXNlIHNvbWV0aGluZyBiZXNpZGVzIAogCSAqIGRlZmF1bHQgdGltZXIgdG8gZmxhc2ggdGhlIGN1cnNvci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggN2RmYmYzOS4uZGRjOTQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBpOwogCiAJaWYgKCFmYl9pbmZvLT5jbWFwLnJlZCB8fCAhZmJfaW5mby0+Y21hcC5ibHVlIHx8Ci0JICAgIGZiX2luZm8tPmNtYXAuZ3JlZW4gfHwgZmJfaW5mby0+Y21hcC50cmFuc3ApCisJICAgICFmYl9pbmZvLT5jbWFwLmdyZWVuIHx8ICFmYl9pbmZvLT5jbWFwLnRyYW5zcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmJfaW5mby0+Y21hcC5sZW47IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbXhmYi5jIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCmluZGV4IDhmZTFjMTIuLmNhYmQ1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW14ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKQEAgLTI0OSw5ICsyNDksNiBAQAogCS8qIGRpc2FibGUgaGFyZHdhcmUgY3Vyc29yICovCiAJTENEQ19DUE9TCSY9IH4oQ1BPU19DQzAgfCBDUE9TX0NDMSk7CiAKLQkvKiBmaXhlZCBidXJzdCBsZW5ndGggKHNlZSBlcnJhdHVtIDExKSAqLwotCUxDRENfRE1BQ1IgPSBETUFDUl9CVVJTVCB8IERNQUNSX0hNKDgpIHwgRE1BQ1JfVE0oMik7Ci0KIAlMQ0RDX1JNQ1IgPSBSTUNSX0xDRENfRU47CiAKIAlpZihmYmktPmJhY2tsaWdodF9wb3dlcikKQEAgLTM1OSw2ICszNTYsNyBAQAogCUxDRENfUENSCT0gZmJpLT5wY3I7CiAJTENEQ19QV01SCT0gZmJpLT5wd21yOwogCUxDRENfTFNDUjEJPSBmYmktPmxzY3IxOworCUxDRENfRE1BQ1IJPSBmYmktPmRtYWNyOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDksNiArNTA3LDcgQEAKIAlmYmktPmNtYXBfaW52ZXJzZQkJPSBpbmYtPmNtYXBfaW52ZXJzZTsKIAlmYmktPnBjcgkJCT0gaW5mLT5wY3I7CiAJZmJpLT5sc2NyMQkJCT0gaW5mLT5sc2NyMTsKKwlmYmktPmRtYWNyCQkJPSBpbmYtPmRtYWNyOwogCWZiaS0+cHdtcgkJCT0gaW5mLT5wd21yOwogCWZiaS0+bGNkX3Bvd2VyCQkJPSBpbmYtPmxjZF9wb3dlcjsKIAlmYmktPmJhY2tsaWdodF9wb3dlcgkJPSBpbmYtPmJhY2tsaWdodF9wb3dlcjsKQEAgLTY0MiwxMiArNjQxLDEyIEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlteGZiX2luZm8gKmZiaSA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAKLQkvKiBkaXNhYmxlIExDRCBjb250cm9sbGVyICovCi0JTENEQ19STUNSICY9IH5STUNSX0xDRENfRU47CisJaW14ZmJfZGlzYWJsZV9jb250cm9sbGVyKGZiaSk7CiAKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCkBAIC02NjMsOCArNjYyLDkgQEAKIAogdm9pZCAgaW14ZmJfc2h1dGRvd24oc3RydWN0IGRldmljZSAqIGRldikKIHsKLQkvKiBkaXNhYmxlIExDRCBDb250cm9sbGVyICovCi0JTENEQ19STUNSICY9IH5STUNSX0xDRENfRU47CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpID0gaW5mby0+cGFyOworCWlteGZiX2Rpc2FibGVfY29udHJvbGxlcihmYmkpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgaW14ZmJfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbXhmYi5oIGIvZHJpdmVycy92aWRlby9pbXhmYi5oCmluZGV4IDEyOGMzZWUuLmU4MzdhOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW14ZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmgKQEAgLTU0LDYgKzU0LDcgQEAKIAl1X2ludAkJCXBjcjsKIAl1X2ludAkJCXB3bXI7CiAJdV9pbnQJCQlsc2NyMTsKKwl1X2ludAkJCWRtYWNyOwogCXVfaW50CQkJY21hcF9pbnZlcnNlOjEsCiAJCQkJY21hcF9zdGF0aWM6MSwKIAkJCQl1bnVzZWQ6MzA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCmluZGV4IDZiYTEwZTMuLjNlOWNjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCkBAIC02Myw1ICs2MywxMCBAQAogCWRlcGVuZHMgb24gTE9HTyAmJiBTVVBFUkgKIAlkZWZhdWx0IHkKIAorY29uZmlnIExPR09fTTMyUl9DTFVUMjI0CisJYm9vbCAiMjI0LWNvbG9yIE0zMlIgTGludXggbG9nbyIKKwlkZXBlbmRzIG9uIExPR08gJiYgTTMyUgorCWRlZmF1bHQgeQorCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQppbmRleCBiMGQ5OTUwLi5kMDI0NGMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2JqLSQoQ09ORklHX0xPR09fU1VQRVJIX01PTk8pCQkrPSBsb2dvX3N1cGVyaF9tb25vLm8KIG9iai0kKENPTkZJR19MT0dPX1NVUEVSSF9WR0ExNikJCSs9IGxvZ29fc3VwZXJoX3ZnYTE2Lm8KIG9iai0kKENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0KQkrPSBsb2dvX3N1cGVyaF9jbHV0MjI0Lm8KK29iai0kKENPTkZJR19MT0dPX00zMlJfQ0xVVDIyNCkJCSs9IGxvZ29fbTMycl9jbHV0MjI0Lm8KIAogIyBIb3cgdG8gZ2VuZXJhdGUgbG9nbydzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCmluZGV4IDc3YjYyMjAuLjc4OGZhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwpAQCAtMzMsNiArMzMsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3VwZXJoX21vbm87CiBleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gbG9nb19zdXBlcmhfdmdhMTY7CiBleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gbG9nb19zdXBlcmhfY2x1dDIyNDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyBsb2dvX20zMnJfY2x1dDIyNDsKIAogCiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqZmJfZmluZF9sb2dvKGludCBkZXB0aCkKQEAgLTk3LDYgKzk4LDEwIEBACiAJCS8qIFN1cGVySCBMaW51eCBsb2dvICovCiAJCWxvZ28gPSAmbG9nb19zdXBlcmhfY2x1dDIyNDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19MT0dPX00zMlJfQ0xVVDIyNAorCQkvKiBNMzJSIExpbnV4IGxvZ28gKi8KKwkJbG9nbyA9ICZsb2dvX20zMnJfY2x1dDIyNDsKKyNlbmRpZgogCX0KIAlyZXR1cm4gbG9nbzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvX20zMnJfY2x1dDIyNC5wcG0gYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19tMzJyX2NsdXQyMjQucHBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjk4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19tMzJyX2NsdXQyMjQucHBtCkBAIC0wLDAgKzEsMTI5MiBAQAorUDMKKyMgQ1JFQVRPUjogVGhlIEdJTVAncyBQTk0gRmlsdGVyIFZlcnNpb24gMS4wCisjCisjIE5vdGU6IGhvdyB0byBjb252ZXJ0IHBwbSB0byBwbm0oYXNjaWkpLgorIyAgICQgY29udmVydCAtcG9zdGVyaXplIDIyNCBtMzJyLnBwbSAtIHwgcG5tMmFzYyAtZjUgPmxvZ29fbTMycl9jbHV0MjI0LnBwbQorIworIyBjb252ZXJ0IC0gaW1hZ2VtYWdpY2s6IC91c3IvYmluL2NvbnZlcnQKKyMgcG5tMmFzYyAtIHBubSB0byBhc2NpaS1wbm0gZm9ybWF0IGNvbnZlcnRlcgorIyAgIGh0dHA6Ly93d3cuaXMuYWlzdC5nby5qcC9ldGxjZGIvdXRpbC9wMmEuaHRtI0VuZ2xpc2gKKworODAgODAKKzI1NQorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICA0MyA0MyA0MyAgNzUgNzUgNzUgIDI3IDI3IDI3ICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICA1OSA1OSA1OSAgMTIzIDEyMyAxMjMgIDY3IDY3IDY3ICAyNyAyNyAyNworICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMCA2IDMgIDU5IDU5IDU5ICA4MCA4MCA4MCAgNDMgNDMgNDMgIDI3IDI3IDI3CisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMTkgMTkgMTkgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMCA2IDMgIDEwIDYgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDEwIDYgMyAgMTEgMTEgMTEgIDExIDExIDExICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDI3IDI3IDI3ICAxMCA2IDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMgIDUxIDUxIDUxICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDEyMyAxMjMgMTIzICAxOTYgMTk2IDE5NiAgMTE1IDExNSAxMTUgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDc1IDc1IDc1ICAxNDEgMTQxIDE0MAorICAxNzIgMTcyIDE3MiAgMTk2IDE5NiAxOTYgIDE5MCAxODkgMTg4ICAyIDIgMyAgMTEgMTEgMTEKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDI3IDI3IDI3ICAxNjQgMTY0IDE2NCAgMjI4IDIyOCAyMjggIDIyMSAyMjEgMjIwICAxMCA2IDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTcyIDE3MiAxNzIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjIxIDIyMSAyMjAgIDM1IDM1IDM1ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTY0IDE2NCAxNjQgIDIyOCAyMjggMjI4ICAzNSAzNSAzNSAgMjM2IDIzNiAyMzYgIDIzNiAyMzYgMjM2CisgIDIgMiAzICAxMSAxMSAxMSAgMiAyIDMgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyIDIgMyAgNzUgNzUgNzUgIDI0NSAyNDUgMjQ1ICAyNDUgMjQ1IDI0NSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIxMiAyMTIgMjEyICAyIDIgMyAgNTEgNTEgNTEgIDExIDExIDExICAyNDUgMjQ1IDI0NQorICAyNyAyNyAyNyAgODAgODAgODAgIDEwIDYgMyAgMjU0IDI1NCAyNTIgIDIgMiAzCisgIDIgMiAzICA5MSA5MSA5MSAgMTkgMTkgMTkgIDI1NCAyNTQgMjUyICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTk2IDE5NiAxOTYgIDEwIDYgMyAgMiAyIDMgIDExIDExIDExICAxMDcgMTA3IDEwNworICA0OSAzNSA1ICA1NyA0MiAxMSAgMzEgMjIgMyAgMjM2IDIzNiAyMzYgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTA3IDEwNyAxMDcgIDIyMSAyMjEgMjIwICAyIDIgMyAgNjQgNDMgNyAgMTk0IDE0OCAxMAorICAyMzYgMTg4IDEwICAyMjUgMTgwIDEwICAxNzAgMTI2IDEwICAyMzYgMTg4IDEwICA5NCA4NiA2NworICAyIDIgMyAgMiAyIDMgIDIwNCAyMDQgMjA0ICAyMzYgMjM2IDIzNiAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyMjggMjI4IDIyOCAgMTgyIDEyNiAxMCAgMjE4IDE2NCA5ICAyMzYgMTg4IDEwCisgIDIzNiAxODggMTAgIDIzNyAyMDQgMTQgIDIzNiAyMDUgNDAgIDI0NiAyMTQgNDggIDI0NiAyMTQgNDgKKyAgMjQ1IDE4OSAxMSAgMjA5IDE1NiA5ICAxOTYgMTk2IDE5NiAgMTEgMTEgMTEgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTY1IDExNCAxMCAgMjA3IDE0OCA3ICAyMjkgMTcyIDkgIDIzNiAxODAgMTAKKyAgMjM2IDE5NiAxMSAgMjM3IDIwNCAxNCAgMjQyIDIxOCA0MyAgMjQ2IDIxOCA3NSAgMjQ2IDIxOCAxOQorICAyNDYgMjEzIDEzICAyNDYgMjE4IDE5ICAyNDQgMjA1IDExICAyMTggMTY0IDkgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAxNjQgMTA5IDUgIDE5MiAxMzMgNyAgMjI0IDE2NSA5ICAyMzYgMTgwIDEwICAyMzYgMTg4IDEwCisgIDIzNiAxOTYgMTEgIDI0MSAyMTIgNDIgIDI0NiAyMTggNzUgIDI0NiAyMTggMTkgIDI0NiAyMTggMTkKKyAgMjQ2IDIxOCAxOSAgMjM2IDE5NiAxMSAgMTUwIDExNCAxMCAgMjI5IDE3MiA5ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTY1IDExNCAxMCAgMjAxIDE0MiA3ICAyMjkgMTcyIDkgIDI0MiAxODIgMTEgIDIzNiAxODggMTAKKyAgMjM3IDIwNCAxNCAgMjQ1IDIxMyA2NyAgMjQ2IDIxOCAxOSAgMjQ2IDIxMyAxMyAgMjQ2IDIxMyAxMworICAxNTQgMTE5IDEwICAyMDcgMTQ4IDcgIDIxOCAxNjQgOSAgMjE2IDE1NiA4ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxMjAgNzggMyAgMjI1IDE4MCAxMCAgMjQ1IDE4OSAxMSAgMjM2IDIwNSA0MAorICAyNDEgMjEyIDQyICAyNDEgMjEyIDE3ICAyMzcgMjA0IDE0ICAxNDggMTA3IDkgIDE4MiAxMjYgMTAKKyAgMjE2IDE1NiA4ICAyMTggMTY0IDkgIDIwNyAxNDggNyAgODIgNzAgNDMgIDIgMiAzCisgIDIgMiAzICAxMjMgMTIzIDEyMyAgMzUgMzUgMzUgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTAgNiAzICAxODAgMTgwIDE4MCAgMTU2IDEwMiA1ICAxMzUgODggNSAgMTQyIDEwNiA3CisgIDEyNiA5OCAxMSAgMTY1IDExNCAxMCAgMTg1IDEzMiA5ICAyMDcgMTQ4IDcgIDIxNSAxNTAgMTMKKyAgMTk5IDE0MCA4ICAxODggMTQ4IDcxICAxOTYgMTk2IDE5NiAgMTkwIDE4OSAxODggIDIgMiAzCisgIDIgMiAzICAxMSAxMSAxMSAgMTMyIDEzMiAxMzIgIDc1IDc1IDc1ICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDEwIDYgMyAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAxNTEgOTcgNSAgMTkyIDEzMyA3CisgIDIwNyAxNDggNyAgMjA2IDE0MiA4ICAxOTkgMTQwIDggIDE4MCAxMjEgNyAgMTgwIDEzMiAzMQorICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDIxMiAyMTIgMjEyICAyMTIgMjEyIDIxMiAgMTA3IDEwNyAxMDcKKyAgMiAyIDMgIDIgMiAzICA5OSA5OSA5OSAgNTEgNTEgNTEgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDEzNiA5NSA3CisgIDE1MSA5NyA1ICAxNTEgOTcgNSAgMTUxIDk3IDUgIDE4MyAxNTYgOTEgIDE5MCAxODkgMTg4CisgIDE5MCAxODkgMTg4ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjEgMjIxIDIyMAorICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDEwIDYgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMworICA3NSA3NSA3NSAgMjQ1IDI0NSAyNDUgIDE5NiAxOTYgMTk2ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODgKKyAgMTkwIDE4OSAxODggIDE5NiAxOTYgMTk2ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDIwNCAyMDQgMjA0CisgIDIzNiAyMzYgMjM2ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAzNSAzNSAzNSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDI3IDI3IDI3ICAyIDIgMworICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODgKKyAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMjEyIDIxMiAyMTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMTAgNiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDEzMiAxMzIgMTMyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAxOTYgMTk2IDE5NgorICAxOTAgMTg5IDE4OCAgMjA0IDIwNCAyMDQgIDI0NSAyNDUgMjQ1ICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICA4MCA4MCA4MCAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxMiAyMTIgMjEyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIwNCAyMDQgMjA0ICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjM2IDIzNiAyMzYgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMTY0IDE2NCAxNjQgIDIxMiAyMTIgMjEyCisgIDIzNiAyMzYgMjM2ICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAyMjEgMjIxIDIyMAorICAyMjEgMjIxIDIyMCAgMjI4IDIyOCAyMjggIDI0NSAyNDUgMjQ1ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUKKyAgMjM2IDIzNiAyMzYgIDIyMSAyMjEgMjIwICAyMTIgMjEyIDIxMiAgMjA0IDIwNCAyMDQgIDIwNCAyMDQgMjA0CisgIDE5NiAxOTYgMTk2ICAyMDQgMjA0IDIwNCAgNTkgNTkgNTkgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyNyAyNyAyNyAgMTcyIDE3MiAxNzIgIDIxMiAyMTIgMjEyCisgIDIzNiAyMzYgMjM2ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjggMjI4IDIyOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjEgMjIxIDIyMCAgMjA0IDIwNCAyMDQgIDE5NiAxOTYgMTk2CisgIDE5NiAxOTYgMTk2ICAxOTYgMTk2IDE5NiAgMjI4IDIyOCAyMjggIDE5IDE5IDE5ICAyIDIgMworICA4MCA4MCA4MCAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDExIDExIDExICAyIDIgMyAgMTY0IDE2NCAxNjQgIDIzNiAyMzYgMjM2ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyMzYgMjM2IDIzNiAgMjEyIDIxMiAyMTIgIDE5NiAxOTYgMTk2ICAyNDUgMjQ1IDI0NSAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICA1MSA1MSA1MSAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgODYgODYgODMKKyAgMiAyIDMgIDI3IDI3IDI3ICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjEyIDIxMiAyMTIgIDE5NiAxOTYgMTk2ICA5MSA5MSA5MQorICAyIDIgMyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjIxIDIyMSAyMjAgIDI0NSAyNDUgMjQ1CisgIDIgMiAzICAxMSAxMSAxMSAgNDMgNDMgNDMgIDE5IDE5IDE5ICAxMCA2IDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICA4MCA4MCA4MCAgMiAyIDMKKyAgMiAyIDMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICA0MyA0MyA0MyAgMjcgMjcgMjcgIDgwIDgwIDgwICAxOSAxOSAxOSAgODAgODAgODAKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjM2IDIzNiAyMzYgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDExIDExIDExICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgNjcgNjcgNjcgIDIgMiAzICAxOSAxOSAxOQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAxNyAxMSAyMzMgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyMjggMjI4IDIyOCAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDExIDExIDExICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDEwIDYgMyAgMTEgMTEgMTEgIDIgMiAzICAyMjggMjI4IDIyOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjcgMjcgMjcgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MgorICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTkgMTkgMTkgIDIgMiAzICAyIDIgMyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI0NSAyNDUgMjQ1ICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxOSAxOSAxOSAgMiAyIDMgIDE5IDE5IDE5ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MgorICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNDMgNDMgNDMgIDIgMiAzICA0MyA0MyA0MyAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyIDIgMyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMQorICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICA3NSA3NSA3NSAgMiAyIDMgIDk5IDk5IDk5ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIyOCAyMjggMjI4ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMyAgNzUgNzUgNzUKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDExIDExIDExICAxMDcgMTA3IDEwNyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIzNiAyMzYgMjM2ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMTkgMTkgMTkKKyAgMTEgMTEgMTEgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAxMSAxMSAxMQorICAxNDAgMTAyIDMgIDExIDExIDExICAxMCA2IDMgIDY3IDY3IDY3ICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjI4IDIyOCAyMjggIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgNDMgNDMgNDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMTEgMTEgMTEgIDY3IDY3IDY3ICAxMSAxMSAxMSAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAxODUgMTMyIDkgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgNDkgMzUgNSAgMiAyIDMgIDIyOCAyMjggMjI4CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjggMjI4IDIyOCAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjM4IDIyMiAgMjMyIDE4OSA5NAorICAyMjYgMTg2IDk5ICA0MyA0MyA0MyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICA1OSA1OSA1OSAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTYgMTU2IDggIDIzNiAxODAgMjIKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgNDkgMzUgNSAgMTEgMTEgMTEKKyAgMjEyIDIxMiAyMTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIyOCAyMjggMjI4ICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyOSAxNzIgOSAgMjQ2IDIxOCAxOQorICAyNDYgMjE4IDE5ICA0MSAyNyAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTkgMTkgMTkgIDI3IDI3IDI3ICAxOTYgMTU0IDE0CisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTk5IDE0MCA4ICAyMjkgMTcyIDkgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ0IDE5NiAxMCAgMiAyIDMKKyAgMiAyIDMgIDExNSAxMTUgMTE1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIyOCAyMjggMjI4ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyNCAxNjUgOSAgMjQ1IDE4OSAxMQorICAyMzYgMTk2IDExICAxOSAxOSAxOSAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMjM2IDE5NiAxMQorICAyNDQgMjA1IDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAxODIgMTI2IDEwICAyMDkgMTU2IDkgIDIxNSAxNTAgMTMKKyAgMTkzIDE0MCAxMCAgMjA3IDE0OCAyNCAgMjE2IDE1NiA4ICAyNDIgMTgyIDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIwOSAxNTYgOQorICAyIDIgMyAgMiAyIDMgIDQzIDQzIDQzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMzYgMjM2IDIzNiAgMjE2IDE1NiA4ICAyNDUgMTg5IDExCisgIDIyOSAxNzIgOSAgNjQgNDMgNyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMDcgMTQ4IDcgIDIzNiAxODggMTAKKyAgMjQ1IDE4OSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTgwIDEyMSA3ICAyMTYgMTU2IDggIDI0MiAxODIgMTEgIDIzNiAxODAgMTAKKyAgMjI5IDE3MiA5ICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIzNyAyMDQgMTQKKyAgMTcwIDEyNiAxMCAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMjM2IDIzNiAyMzYKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIwNCAyMDQgMjA0ICAxOTYgMTk2IDE5NiAgMjE2IDE1NiA4ICAyMzYgMTgwIDEwCisgIDIyNCAxNjUgOSAgMTgyIDEyNiAxMCAgNzMgNDggNiAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICA0MSAyNyAzICAxOTkgMTQwIDggIDIyOSAxNzIgOSAgMjM2IDE4MCAxMAorICAyNDUgMTg5IDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAxODUgMTMyIDkgIDIyOSAxNzIgOSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjI2IDE4OCAxMSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDE5NiAxOTYgMTk2ICAxOTYgMTk2IDE5NiAgMjE1IDE1MCAxMyAgMjM2IDE4MCAxMAorICAyMjkgMTcyIDkgIDIwMSAxNDIgNyAgMTg1IDEzMiA5ICAxODAgMTIxIDcgIDE3MyAxMjAgMTAKKyAgMTgwIDEyMSA3ICAxOTIgMTMzIDcgIDIyOSAxNzIgOSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAxODAgMTI2IDQ3ICAyMjQgMTY1IDkgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDIzNiAxODggMTAgIDE5MyAxNDAgMTAgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIxMiAyMTIgMjEyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIwNCAyMDQgMjA0ICAxOTYgMTk2IDE5NiAgMTk5IDE0MCA4ICAyMjkgMTcyIDkKKyAgMjM2IDE4MCAxMCAgMjE4IDE2NCA5ICAyMTUgMTUwIDEzICAyMDcgMTQ4IDcgIDIwNyAxNDggNworICAyMTYgMTU2IDggIDIyOSAxNzIgOSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAxODUgMTMyIDkgIDIxNiAxNTYgOCAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjM2IDE5NiAxMSAgMTkgMTkgMTkgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMTEgMTEgMTEgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjIxIDIyMSAyMjAgIDE5NiAxOTYgMTk2ICAxODUgMTMyIDkgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyMjkgMTcyIDkgIDIyNCAxNjUgOSAgMjE4IDE2NCA5ICAyMjQgMTY1IDkKKyAgMjI5IDE3MiA5ICAyMzYgMTgwIDEwICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDIzNiAxODAgMjIgIDI0MiAxODIgMTEgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIzNiAxODAgMjIgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDIzNiAxODggMTAgIDIyNSAxODAgMTAgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMTEgMTEgMTEgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjIxIDIyMSAyMjAgIDE5IDE5IDE5ICAxODUgMTMyIDkgIDIyNCAxNjUgOQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMzYgMTgwIDEwICAyMzYgMTgwIDEwCisgIDI0MiAxODIgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMTk2IDE1NCAxNAorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjA3IDE0OCA3ICAyMzYgMTgwIDIyICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMzcgMjA0IDE0ICAxMzUgODggNSAgMiAyIDMKKyAgMjcgMjcgMjcgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDY3IDY3IDY3ICAxOSAxMyAzICAxODUgMTMyIDkgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyMzYgMTgwIDIyICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjM2IDE4OCAxMCAgMjI2IDE4OCAxMSAgMTA0IDgzIDQ4CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDIgMiAzICAyIDIgMyAgNTYgMzggNSAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjI5IDE3MiA5ICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTgyIDEyNiAxMCAgMjE1IDE1MCAxMyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjM2IDE5NiAxMSAgMjE2IDE1NiA4CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgNzUgNTQgMyAgMTgyIDEyNiAxMCAgMjI5IDE3MiA5CisgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMjkgMTcyIDkKKyAgMjA3IDE0OCAyNCAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE5MiAxMzMgNyAgMjI5IDE3MiA5ICAyNDIgMTgyIDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMjUgMTgwIDEwICAyMjQgMTY1IDkKKyAgMTA3IDY5IDUgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjM2IDIzNiAyMzYgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICA5MSA2NyA5ICAxODIgMTI2IDEwICAyMjkgMTcyIDkKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0MiAxODIgMTEgIDIxNiAxNTYgOCAgMTgwIDEyNiA0NworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjA2IDE0MiA4ICAyMjQgMTY1IDkgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0MiAxODIgMTEgIDIxNiAxNTYgOAorICAxNTYgMTAyIDUgIDE5IDEzIDMgIDQzIDQzIDQzICAxOTYgMTk2IDE5NiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjA0IDIwNCAyMDQgIDUxIDUxIDUxCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDk1IDYyIDUgIDE4NSAxMzIgOSAgMjI5IDE3MiA5CisgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyMzYgMTgwIDIyICAyMTYgMTU2IDggIDIwNiAxNDIgOCAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTkyIDEzMyA3ICAyMTUgMTUwIDEzICAyMjkgMTcyIDkgIDIyOSAxNzIgOQorICAyMzYgMTgwIDEwICAyMzYgMTgwIDIyICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjI5IDE3MiA5ICAyMTYgMTU2IDgKKyAgMTU2IDEwMiA1ICA4MyA1NCA2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMTUgNzMgMyAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMjkgMTcyIDkgIDIyOSAxNzIgOSAgMjE2IDE1NiA4CisgIDE4MCAxMjEgNyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTgwIDEyMSA3ICAxODIgMTI2IDEwICAxOTIgMTMzIDcgIDE5OSAxNDAgOAorICAyMDcgMTQ4IDcgIDIxNSAxNTAgMTMgIDIxNiAxNTYgOCAgMjI0IDE2NSA5ICAyMjkgMTcyIDkKKyAgMjM2IDE4MCAyMiAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMjkgMTcyIDkgIDE5OSAxNDAgOAorICAxNTEgOTcgNSAgMTAxIDY3IDcgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDExNSA3MyAzICAxODAgMTIxIDcgIDIxNiAxNTYgOAorICAyMzYgMTgwIDIyICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDIzNiAxODAgMTAgIDIyNCAxNjUgOSAgMjE1IDE1MCAxMyAgMjA2IDE0MiA4ICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMTU2IDEwMiA1ICAxNjQgMTA5IDUgIDE3MiAxMTQgNSAgMTgwIDEyMSA3ICAxODAgMTIxIDcKKyAgMTkyIDEzMyA3ICAyMDEgMTQyIDcgIDIxNiAxNTYgOCAgMjI0IDE2NSA5ICAyMzYgMTgwIDIyCisgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDIyOSAxNzIgOSAgMjAxIDE0MiA3ICAxNzIgMTE0IDUKKyAgMTI1IDgzIDUgIDgzIDU0IDYgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDkxIDU4IDUgIDE1NiAxMDIgNSAgMTkyIDEzMyA3CisgIDIxNiAxNTYgOCAgMjI5IDE3MiA5ICAyMzYgMTgwIDEwICAyMzYgMTgwIDEwICAyMjkgMTcyIDkKKyAgMjE1IDE1MCAxMyAgMTk5IDE0MCA4ICAxNjQgMTA5IDUgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAxMjAgNzggMyAgMTMyIDgyIDMKKyAgMTUxIDk3IDUgIDE1NyAxMDYgNyAgMTgwIDEyMSA3ICAxODUgMTMyIDkgIDE5MyAxNDAgMTAKKyAgMjA3IDE0OCA3ICAyMDcgMTQ4IDcgIDE5MiAxMzMgNyAgMTcyIDExNCA1ICAxMzIgODIgMworICAxMDEgNjcgNyAgNDEgMjcgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgNzMgNDggNiAgMTQzIDkwIDMgIDE4MCAxMjEgNworICAxOTIgMTMzIDcgIDIwNyAxNDggNyAgMjA3IDE0OCA3ICAyMDEgMTQyIDcgIDE4NSAxMzIgOQorICAxNzMgMTIwIDEwICAxMzYgOTUgNyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgOTEgNTggNSAgMTI1IDgzIDUgIDEzNSA4OCA1CisgIDE0NCA5NSA3ICAxNTEgOTcgNSAgMTMyIDgyIDMgIDExNSA3MyAzICA5NSA2MiA1CisgIDY0IDQzIDcgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDY0IDQzIDcgIDkxIDU4IDUgIDE1MSA5NyA1CisgIDE1NyAxMDYgNyAgMTcyIDExNCA1ICAxNzIgMTE0IDUgIDE2NCAxMDkgNSAgMTUxIDk3IDUKKyAgODUgNTkgNiAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgNzMgNDggNgorICA5MSA1OCA1ICA5NSA2MiA1ICA5NSA2MiA1ICA5MSA1OCA1ICA1NiAzOCA1CisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDgzIDU0IDYKKyAgMTA3IDY5IDUgIDEzMiA4MiAzICAxMjUgODMgNSAgMTAxIDY3IDcgIDcxIDQ3IDMxCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCAzZGQxZGUxLi5iMDA4ODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNTIzLDcgKzUyMyw3IEBACiAjZGVmaW5lIGludmFsaWRhdGVfY2FjaGUoYWRkcikKICNlbmRpZgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwbGF0aW51bWZiX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIG9kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbGF0aW51bWZiX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIG9kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqZHAgPSBvZGV2LT5ub2RlOwogCXN0cnVjdCBmYl9pbmZvCQkqaW5mbzsKQEAgLTY0NywxMiArNjQ3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggcGxhdGludW1mYl9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwbGF0aW51bWZiX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJwbGF0aW51bSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENILAogCX0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwppbmRleCA3ODlkZTEzLi4zODQ4YmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwpAQCAtNjcsMTIgKzY3LDE4IEBACiBzdGF0aWMgaW5saW5lIHU4CiBzMWQxM3h4eGZiX3JlYWRyZWcoc3RydWN0IHMxZDEzeHh4ZmJfcGFyICpwYXIsIHUxNiByZWdubykKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisJcmVnbm89KChyZWdubyAmIDEpID8gKHJlZ25vICYgfjFMKSA6IChyZWdubyArIDEpKTsKKyNlbmRpZgogCXJldHVybiByZWFkYihwYXItPnJlZ3MgKyByZWdubyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogczFkMTN4eHhmYl93cml0ZXJlZyhzdHJ1Y3QgczFkMTN4eHhmYl9wYXIgKnBhciwgdTE2IHJlZ25vLCB1OCB2YWx1ZSkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisJcmVnbm89KChyZWdubyAmIDEpID8gKHJlZ25vICYgfjFMKSA6IChyZWdubyArIDEpKTsKKyNlbmRpZgogCXdyaXRlYih2YWx1ZSwgcGFyLT5yZWdzICsgcmVnbm8pOwogfQogCkBAIC0yNTksNyArMjY1LDExIEBACiAJCQlkYmcoInMxZDEzeHh4ZmJfc2V0Y29scmVnOiBwc2V1ZG8gJWQsIHZhbCAlMDh4XG4iLAogCQkJCSAgICByZWdubywgcHNldWRvX3ZhbCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJKQorCQkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gY3B1X3RvX2xlMTYocHNldWRvX3ZhbCk7CisjZWxzZQogCQkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gcHNldWRvX3ZhbDsKKyNlbmRpZgogCiAJCQlicmVhazsKIAkJY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDhmYWRjZGEuLmY0NjMzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0yMTEzLDcgKzIxMTMsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICJzdGF0ZTogJXVcbiIsIHN0YXRlKTsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlmYl9zZXRfc3VzcGVuZChpbmZvLCBzdGF0ZSk7CisJZmJfc2V0X3N1c3BlbmQoaW5mbywgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7CiAJc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDMxMmNmMzIuLjhhOWM0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTUxNiw2ICs1MTYsNyBAQAogCXN0cnVjdCB3MV9yZWdfbnVtICp0bXA7CiAJaW50IGZhbWlseV9mb3VuZCA9IDA7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2OworCXU2NCBybl9sZSA9IGNwdV90b19sZTY0KHJuKTsKIAogCWRldiA9IHcxX3NlYXJjaF9tYXN0ZXIoZGF0YSk7CiAJaWYgKCFkZXYpIHsKQEAgLTU0NCwxMCArNTQ1LDggQEAKIAkJc2xhdmVfY291bnQrKzsKIAl9CiAKLQlybiA9IGNwdV90b19sZTY0KHJuKTsKLQogCWlmIChzbGF2ZV9jb3VudCA9PSBkZXYtPnNsYXZlX2NvdW50ICYmCi0JCXJuICYmICgobGU2NF90b19jcHUocm4pID4+IDU2KSAmIDB4ZmYpID09IHcxX2NhbGNfY3JjOCgodTggKikmcm4sIDcpKSB7CisJCXJuICYmICgocm4gPj4gNTYpICYgMHhmZikgPT0gdzFfY2FsY19jcmM4KCh1OCAqKSZybl9sZSwgNykpIHsKIAkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsIHRtcCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCAzNWU4NWQ5Li5iNWE1ZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTg4LDcgKzg4LDcgQEAKIAogCWRldi0+Z3JvdXBzID0gMjM7CiAJZGV2LT5zZXEgPSAxOwotCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfTkZMT0csIE5VTEwpOworCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVzEsIE5VTEwpOwogCWlmICghZGV2LT5ubHMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBuZXRsaW5rIHNvY2tldCgldSkgZm9yIHcxIG1hc3RlciAlcy5cbiIsCiAJCQlORVRMSU5LX05GTE9HLCBkZXYtPmRldi5idXNfaWQpOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMDYyMTc3OS4uNWQwYzRiZSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0yOSw2ICsyOSw3IEBACiBjb25maWcgRVhUMl9GU19QT1NJWF9BQ0wKIAlib29sICJFeHQyIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gRVhUMl9GU19YQVRUUgorCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCiAJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCkBAIC0xMTQsNiArMTE1LDcgQEAKIGNvbmZpZyBFWFQzX0ZTX1BPU0lYX0FDTAogCWJvb2wgIkV4dDMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCiAJZGVwZW5kcyBvbiBFWFQzX0ZTX1hBVFRSCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKIAkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KQEAgLTI0MSw2ICsyNDMsNyBAQAogY29uZmlnIFJFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCWJvb2wgIlJlaXNlckZTIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgUG9zaXggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAogCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgpAQCAtMjc0LDYgKzI3Nyw3IEBACiBjb25maWcgSkZTX1BPU0lYX0FDTAogCWJvb2wgIkpGUyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKIAlkZXBlbmRzIG9uIEpGU19GUworCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCiAJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCkBAIC0zMTgsOCArMzIyLDcgQEAKICMgCU5ldmVyIHVzZSB0aGlzIHN5bWJvbCBmb3IgaWZkZWZzLgogIwogCWJvb2wKLQlkZXBlbmRzIG9uIEVYVDJfRlNfUE9TSVhfQUNMIHx8IEVYVDNfRlNfUE9TSVhfQUNMIHx8IEpGU19QT1NJWF9BQ0wgfHwgUkVJU0VSRlNfRlNfUE9TSVhfQUNMIHx8IE5GU0RfVjQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAogc291cmNlICJmcy94ZnMvS2NvbmZpZyIKIApAQCAtMzU2LDYgKzM1OSwxOSBAQAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKIAkgIGFuc3dlciBOLgogCitjb25maWcgSU5PVElGWQorCWJvb2wgIklub3RpZnkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgaW5vdGlmeSBzdXBwb3J0IGFuZCB0aGUgL2Rldi9pbm90aWZ5IGNoYXJhY3RlcgorCSAgZGV2aWNlLiAgSW5vdGlmeSBpcyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gYW5kIGEKKwkgIHJlcGxhY2VtZW50IGZvciBkbm90aWZ5LiAgSW5vdGlmeSBmaXhlcyBudW1lcm91cyBzaG9ydGNvbWluZ3MgaW4KKwkgIGRub3RpZnkgYW5kIGludHJvZHVjZXMgc2V2ZXJhbCBuZXcgZmVhdHVyZXMuICBJdCBhbGxvd3MgbW9uaXRvcmluZworCSAgb2YgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlhIGEgc2luZ2xlIG9wZW4gZmQuICBNdWx0aXBsZSBmaWxlCisJICBldmVudHMgYXJlIHN1cHBvcnRlZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIFFVT1RBCiAJYm9vbCAiUXVvdGEgc3VwcG9ydCIKIAloZWxwCkBAIC0xMDM2LDI2ICsxMDUyLDE4IEBACiAJICBJZiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZiB0aGUKIAkgIG1lc3NhZ2VzIGF0IGRlYnVnIGxldmVsIDEgd2hpbGUgdGhlIG1pc2JlaGF2aW91ciB3YXMgb2NjdXJyaW5nLgogCi1jb25maWcgSkZGUzJfRlNfTkFORAotCWJvb2wgIkpGRlMyIHN1cHBvcnQgZm9yIE5BTkQgZmxhc2giCitjb25maWcgSkZGUzJfRlNfV1JJVEVCVUZGRVIKKwlib29sICJKRkZTMiB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEpGRlMyX0ZTCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOQU5EIGZsYXNoIGluIEpGRlMyLiBOQU5EIGlzIGEgbmV3ZXIKLQkgIHR5cGUgb2YgZmxhc2ggY2hpcCBkZXNpZ24gdGhhbiB0aGUgdHJhZGl0aW9uYWwgTk9SIGZsYXNoLCB3aXRoCi0JICBoaWdoZXIgZGVuc2l0eSBidXQgYSBoYW5kZnVsIG9mIGNoYXJhY3RlcmlzdGljcyB3aGljaCBtYWtlIGl0IG1vcmUKLQkgIGludGVyZXN0aW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0gdG8gdXNlLgorCSAgVGhpcyBlbmFibGVzIHRoZSB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCBpbiBKRkZTMi4KIAotCSAgU2F5ICdOJyB1bmxlc3MgeW91IGhhdmUgTkFORCBmbGFzaC4KLQotY29uZmlnIEpGRlMyX0ZTX05PUl9FQ0MKLSAgICAgICAgYm9vbCAiSkZGUzIgc3VwcG9ydCBmb3IgRUNDJ2QgTk9SIGZsYXNoIChFWFBFUklNRU5UQUwpIgotICAgICAgICBkZXBlbmRzIG9uIEpGRlMyX0ZTICYmIEVYUEVSSU1FTlRBTAotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5PUiBmbGFzaCB3aXRoIHRyYW5zcGFyZW50Ci0gICAgICAgICAgRUNDIGZvciBKRkZTMi4gVGhpcyB0eXBlIG9mIGZsYXNoIGNoaXAgaXMgbm90IGNvbW1vbiwgaG93ZXZlciBpdCBpcwotICAgICAgICAgIGF2YWlsYWJsZSBmcm9tIFNUIE1pY3JvZWxlY3Ryb25pY3MuCisJICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBKRkZTMiBvbiB0aGUgZm9sbG93aW5nCisJICB0eXBlcyBvZiBmbGFzaCBkZXZpY2VzOgorCSAgICAtIE5BTkQgZmxhc2gKKwkgICAgLSBOT1IgZmxhc2ggd2l0aCB0cmFuc3BhcmVudCBFQ0MKKwkgICAgLSBEYXRhRmxhc2gKIAogY29uZmlnIEpGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMKIAlib29sICJBZHZhbmNlZCBjb21wcmVzc2lvbiBvcHRpb25zIGZvciBKRkZTMiIKQEAgLTE0MzgsNiArMTQ0Niw3IEBACiAJc2VsZWN0IE5GU0RfVENQCiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3Y0IHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgogCSAgYW5kIE5GU3YzIHNlcnZlcnMsIHNheSBZIGhlcmUuICBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggZmM5MmU1OS4uY2Y5NWViOCAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDkgQEAKIAkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCiAJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAorCQlpb3ByaW8ubwogCitvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnkubwogb2JqLSQoQ09ORklHX0VQT0xMKQkJKz0gZXZlbnRwb2xsLm8KIG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubwogCmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IDdhZmEyMjIuLjA2ZDdkNDMgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC01OCw2ICs1OCw3IEBACiBzdGF0aWMgTElTVF9IRUFEKGZwdXRfaGVhZCk7CiAKIHN0YXRpYyB2b2lkIGFpb19raWNrX2hhbmRsZXIodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGFpb19xdWV1ZV93b3JrKHN0cnVjdCBraW9jdHggKik7CiAKIC8qIGFpb19zZXR1cAogICoJQ3JlYXRlcyB0aGUgc2xhYiBjYWNoZXMgdXNlZCBieSB0aGUgYWlvIHJvdXRpbmVzLCBwYW5pYyBvbgpAQCAtNzQ3LDYgKzc0OCwxNCBAQAogCQkgKiBoYXMgYWxyZWFkeSBiZWVuIGtpY2tlZCAqLwogCQlpZiAoa2lvY2JJc0tpY2tlZChpb2NiKSkgewogCQkJX19xdWV1ZV9raWNrZWRfaW9jYihpb2NiKTsKKworCQkJLyoKKwkJCSAqIF9fcXVldWVfa2lja2VkX2lvY2Igd2lsbCBhbHdheXMgcmV0dXJuIDEgaGVyZSwgYmVjYXVzZQorCQkJICogaW9jYi0+a2lfcnVuX2xpc3QgaXMgZW1wdHkgYXQgdGhpcyBwb2ludCBzbyBpdCBzaG91bGQKKwkJCSAqIGJlIHNhZmUgdG8gdW5jb25kaXRpb25hbGx5IHF1ZXVlIHRoZSBjb250ZXh0IGludG8gdGhlCisJCQkgKiB3b3JrIHF1ZXVlLgorCQkJICovCisJCQlhaW9fcXVldWVfd29yayhjdHgpOwogCQl9CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9hdHRyLmMgYi9mcy9hdHRyLmMKaW5kZXggYzNjNzZmZS4uYjE3OTZmYiAxMDA2NDQKLS0tIGEvZnMvYXR0ci5jCisrKyBiL2ZzL2F0dHIuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KQEAgLTEwNywzMSArMTA3LDggQEAKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5vZGVfc2V0YXR0cik7CiAKLWludCBzZXRhdHRyX21hc2sodW5zaWduZWQgaW50IGlhX3ZhbGlkKQotewotCXVuc2lnbmVkIGxvbmcgZG5fbWFzayA9IDA7Ci0KLQlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkKLQkJZG5fbWFzayB8PSBETl9BVFRSSUI7Ci0JaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7Ci0JLyogYm90aCB0aW1lcyBpbXBsaWVzIGEgdXRpbWUocykgY2FsbCAqLwotCWlmICgoaWFfdmFsaWQgJiAoQVRUUl9BVElNRXxBVFRSX01USU1FKSkgPT0gKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKLQkJZG5fbWFzayB8PSBETl9BQ0NFU1M7Ci0JZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKQotCQlkbl9tYXNrIHw9IEROX01PRElGWTsKLQlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCXJldHVybiBkbl9tYXNrOwotfQotCiBpbnQgbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC0xOTcsMTEgKzE3NCw5IEBACiAJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKQogCQl1cF93cml0ZSgmZGVudHJ5LT5kX2lub2RlLT5pX2FsbG9jX3NlbSk7CiAKLQlpZiAoIWVycm9yKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZG5fbWFzayA9IHNldGF0dHJfbWFzayhpYV92YWxpZCk7Ci0JCWlmIChkbl9tYXNrKQotCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNrKTsKLQl9CisJaWYgKCFlcnJvcikKKwkJZnNub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFfdmFsaWQpOworCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggZmEyMzQ4ZC4uM2RmODYyOCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtMjMxLDggKzIzMSw4IEBACiAJCWludCB0eXBlID0gKG5vdGlmeSA9PSBORllfTU9VTlQgPwogCQkJYXV0b2ZzX3B0eXBlX21pc3NpbmcgOiBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpKTsKIAotCQlEUFJJTlRLKCgibmV3IHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gJS4qcywgbmZ5PSVkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIHdxLT53YWl0X3F1ZXVlX3Rva2VuLCB3cS0+bGVuLCB3cS0+bmFtZSwgbm90aWZ5KSk7CisJCURQUklOVEsoIm5ldyB3YWl0IGlkID0gMHglMDhseCwgbmFtZSA9ICUuKnMsIG5meT0lZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSB3cS0+d2FpdF9xdWV1ZV90b2tlbiwgd3EtPmxlbiwgd3EtPm5hbWUsIG5vdGlmeSk7CiAKIAkJLyogYXV0b2ZzNF9ub3RpZnlfZGFlbW9uKCkgbWF5IGJsb2NrICovCiAJCWF1dG9mczRfbm90aWZ5X2RhZW1vbihzYmksIHdxLCB0eXBlKTsKZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggM2ExNDcyYS4uY2E4ZjdhOCAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqLwogCiAjZGVmaW5lIEJWKHgpIHsgLm5yX3ZlY3MgPSB4LCAubmFtZSA9ICJiaW92ZWMtIl9fc3RyaW5naWZ5KHgpIH0KLXN0YXRpYyBzdHJ1Y3QgYmlvdmVjX3NsYWIgYnZlY19zbGFic1tCSU9WRUNfTlJfUE9PTFNdID0geworc3RhdGljIHN0cnVjdCBiaW92ZWNfc2xhYiBidmVjX3NsYWJzW0JJT1ZFQ19OUl9QT09MU10gX19yZWFkX21vc3RseSA9IHsKIAlCVigxKSwgQlYoNCksIEJWKDE2KSwgQlYoNjQpLCBCVigxMjgpLCBCVihCSU9fTUFYX1BBR0VTKSwKIH07CiAjdW5kZWYgQlYKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggMTNlNTkzOC4uNmEyNWQ3ZCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBkb19zeW5jKHVuc2lnbmVkIGxvbmcgd2FpdCkKIHsKLQl3YWtldXBfYmRmbHVzaCgwKTsKKwl3YWtldXBfcGRmbHVzaCgwKTsKIAlzeW5jX2lub2RlcygwKTsJCS8qIEFsbCBtYXBwaW5ncywgaW5vZGVzIGFuZCB0aGVpciBibG9ja2RldnMgKi8KIAlEUVVPVF9TWU5DKE5VTEwpOwogCXN5bmNfc3VwZXJzKCk7CQkvKiBXcml0ZSB0aGUgc3VwZXJibG9ja3MgKi8KQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCXN0cnVjdCB6b25lICoqem9uZXM7CiAJcGdfZGF0YV90ICpwZ2RhdDsKIAotCXdha2V1cF9iZGZsdXNoKDEwMjQpOworCXdha2V1cF9wZGZsdXNoKDEwMjQpOwogCXlpZWxkKCk7CiAKIAlmb3JfZWFjaF9wZ2RhdChwZ2RhdCkgewpAQCAtNTEzLDggKzUxMyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9idWZmZXJfYXN5bmNfcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCiB7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhwYWdlX3VwdG9kYXRlX2xvY2spOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CkBAIC01MzYsNyArNTM2LDkgQEAKIAkgKiB0d28gYnVmZmVyIGhlYWRzIGVuZCBJTyBhdCBhbG1vc3QgdGhlIHNhbWUgdGltZSBhbmQgYm90aAogCSAqIGRlY2lkZSB0aGF0IHRoZSBwYWdlIGlzIG5vdyBjb21wbGV0ZWx5IGRvbmUuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWZpcnN0ID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwliaXRfc3Bpbl9sb2NrKEJIX1VwdG9kYXRlX0xvY2ssICZmaXJzdC0+Yl9zdGF0ZSk7CiAJY2xlYXJfYnVmZmVyX2FzeW5jX3JlYWQoYmgpOwogCXVubG9ja19idWZmZXIoYmgpOwogCXRtcCA9IGJoOwpAQCAtNTQ5LDcgKzU1MSw4IEBACiAJCX0KIAkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKIAl9IHdoaWxlICh0bXAgIT0gYmgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCS8qCiAJICogSWYgbm9uZSBvZiB0aGUgYnVmZmVycyBoYWQgZXJyb3JzIGFuZCB0aGV5IGFyZSBhbGwKQEAgLTU2MSw3ICs1NjQsOCBAQAogCXJldHVybjsKIAogc3RpbGxfYnVzeToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuOwogfQogCkBAIC01NzIsOCArNTc2LDggQEAKIHZvaWQgZW5kX2J1ZmZlcl9hc3luY193cml0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCiB7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGFnZV91cHRvZGF0ZV9sb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3Q7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKQEAgLTU5NCw3ICs1OTgsMTAgQEAKIAkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwlmaXJzdCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYml0X3NwaW5fbG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCiAJY2xlYXJfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAl0bXAgPSBiaC0+Yl90aGlzX3BhZ2U7CkBAIC02MDUsMTIgKzYxMiwxNCBAQAogCQl9CiAJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CiAJcmV0dXJuOwogCiBzdGlsbF9idXN5OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCmluZGV4IGU4MmFhYzkuLjNiMWIxZWUgMTAwNjQ0Ci0tLSBhL2ZzL2NoYXJfZGV2LmMKKysrIGIvZnMvY2hhcl9kZXYuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2QgPSBOVUxMLCAqKmNwOwogCWludCBpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOwogCi0JdXAoJmNocmRldnNfbG9jayk7CisJZG93bigmY2hyZGV2c19sb2NrKTsKIAlmb3IgKGNwID0gJmNocmRldnNbaV07ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCiAJCWlmICgoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYKIAkJICAgICgqY3ApLT5iYXNlbWlub3IgPT0gYmFzZW1pbm9yICYmCkBAIC0yNzcsOCArMjc3LDkgQEAKIHZvaWQgY2Rldl9wdXQoc3RydWN0IGNkZXYgKnApCiB7CiAJaWYgKHApIHsKKwkJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBwLT5vd25lcjsKIAkJa29iamVjdF9wdXQoJnAtPmtvYmopOwotCQltb2R1bGVfcHV0KHAtPm93bmVyKTsKKwkJbW9kdWxlX3B1dChvd25lcik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDcyOGNkODMuLjZiMDZiNmIgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgpAQCAtMTMwNyw5ICsxMzA3LDEzIEBACiBvdXQ6CiAJaWYgKGlvdiAhPSBpb3ZzdGFjaykKIAkJa2ZyZWUoaW92KTsKLQlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApCi0JCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LAotCQkJCSh0eXBlID09IFJFQUQpID8gRE5fQUNDRVNTIDogRE5fTU9ESUZZKTsKKwlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJCWlmICh0eXBlID09IFJFQUQpCisJCQlmc25vdGlmeV9hY2Nlc3MoZGVudHJ5KTsKKwkJZWxzZQorCQkJZnNub3RpZnlfbW9kaWZ5KGRlbnRyeSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2Rjb29raWVzLmMgYi9mcy9kY29va2llcy5jCmluZGV4IDU4MWFhYzkuLjAyYWEwZGQgMTAwNjQ0Ci0tLSBhL2ZzL2Rjb29raWVzLmMKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtOTQsMTIgKzk0LDEwIEBACiAJaWYgKCFkY3MpCiAJCXJldHVybiBOVUxMOwogCi0JYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKLQlhdG9taWNfaW5jKCZ2ZnNtbnQtPm1udF9jb3VudCk7CiAJZGVudHJ5LT5kX2Nvb2tpZSA9IGRjczsKIAotCWRjcy0+ZGVudHJ5ID0gZGVudHJ5OwotCWRjcy0+dmZzbW50ID0gdmZzbW50OworCWRjcy0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWRjcy0+dmZzbW50ID0gbW50Z2V0KHZmc21udCk7CiAJaGFzaF9kY29va2llKGRjcyk7CiAKIAlyZXR1cm4gZGNzOwpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDQ4ODcxOTEuLjIyMmFiMWMgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTY0Miw2ICs2NDIsMTggQEAKIAljb3VudCA9IDI7CiAJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpCiAJCWNvdW50ID0gMTsKKwllbHNlIHsKKwkJLyoKKwkJICogVGhlIFNJR0FMUk0gdGltZXIgc3Vydml2ZXMgdGhlIGV4ZWMsIGJ1dCBuZWVkcyB0byBwb2ludAorCQkgKiBhdCB1cyBhcyB0aGUgbmV3IGdyb3VwIGxlYWRlciBub3cuICBXZSBoYXZlIGEgcmFjZSB3aXRoCisJCSAqIGEgdGltZXIgZmlyaW5nIG5vdyBnZXR0aW5nIHRoZSBvbGQgbGVhZGVyLCBzbyB3ZSBuZWVkIHRvCisJCSAqIHN5bmNocm9uaXplIHdpdGggYW55IGZpcmluZyAoYnkgY2FsbGluZyBkZWxfdGltZXJfc3luYykKKwkJICogYmVmb3JlIHdlIGNhbiBzYWZlbHkgbGV0IHRoZSBvbGQgZ3JvdXAgbGVhZGVyIGRpZS4KKwkJICovCisJCXNpZy0+cmVhbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudDsKKwkJaWYgKGRlbF90aW1lcl9zeW5jKCZzaWctPnJlYWxfdGltZXIpKQorCQkJYWRkX3RpbWVyKCZzaWctPnJlYWxfdGltZXIpOworCX0KIAl3aGlsZSAoYXRvbWljX3JlYWQoJnNpZy0+Y291bnQpID4gY291bnQpIHsKIAkJc2lnLT5ncm91cF9leGl0X3Rhc2sgPSBjdXJyZW50OwogCQlzaWctPm5vdGlmeV9jb3VudCA9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCBlZWQ1MjFkLi5lOTc3Zjg1IDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDIuaAorKysgYi9mcy9leHQyL2V4dDIuaApAQCAtMiw2ICsyLDE1IEBACiAjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgogCiAvKgorICogZXh0MiBtb3VudCBvcHRpb25zCisgKi8KK3N0cnVjdCBleHQyX21vdW50X29wdGlvbnMgeworCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQ7CisJdWlkX3Qgc19yZXN1aWQ7CisJZ2lkX3Qgc19yZXNnaWQ7Cit9OworCisvKgogICogc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIGlub2RlIGRhdGEgaW4gbWVtb3J5CiAgKi8KIHN0cnVjdCBleHQyX2lub2RlX2luZm8gewpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDg3NmUzOTEuLmRjZmUzMzEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTkzNiwxMiArOTM2LDIzIEBACiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqIHNiaSA9IEVYVDJfU0Ioc2IpOwogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogZXM7CiAJdW5zaWduZWQgbG9uZyBvbGRfbW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKKwlzdHJ1Y3QgZXh0Ml9tb3VudF9vcHRpb25zIG9sZF9vcHRzOworCXVuc2lnbmVkIGxvbmcgb2xkX3NiX2ZsYWdzOworCWludCBlcnI7CisKKwkvKiBTdG9yZSB0aGUgb2xkIG9wdGlvbnMgKi8KKwlvbGRfc2JfZmxhZ3MgPSBzYi0+c19mbGFnczsKKwlvbGRfb3B0cy5zX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJb2xkX29wdHMuc19yZXN1aWQgPSBzYmktPnNfcmVzdWlkOworCW9sZF9vcHRzLnNfcmVzZ2lkID0gc2JpLT5zX3Jlc2dpZDsKIAogCS8qCiAJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgogCSAqLwotCWlmICghcGFyc2Vfb3B0aW9ucyAoZGF0YSwgc2JpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwYXJzZV9vcHRpb25zIChkYXRhLCBzYmkpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmVzdG9yZV9vcHRzOworCX0KIAogCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CiAJCSgoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CkBAIC05NzEsNyArOTgyLDggQEAKIAkJCXByaW50aygiRVhUMi1mczogJXM6IGNvdWxkbid0IHJlbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKIAkJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCiAJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOwotCQkJcmV0dXJuIC1FUk9GUzsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQl9CiAJCS8qCiAJCSAqIE1vdW50aW5nIGEgUkRPTkxZIHBhcnRpdGlvbiByZWFkLXdyaXRlLCBzbyByZXJlYWQgYW5kCkBAIC05ODQsNiArOTk2LDEyIEBACiAJfQogCWV4dDJfc3luY19zdXBlcihzYiwgZXMpOwogCXJldHVybiAwOworcmVzdG9yZV9vcHRzOgorCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5zX21vdW50X29wdDsKKwlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CisJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOworCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZXh0Ml9zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1ZikKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGlwLmMgYi9mcy9leHQyL3hpcC5jCmluZGV4IGQ0NDQzMWQuLjBhYTVhYzE1OSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi94aXAuYworKysgYi9mcy9leHQyL3hpcC5jCkBAIC0xNSw2NiArMTUsNzkgQEAKICNpbmNsdWRlICJ4aXAuaCIKIAogc3RhdGljIGlubGluZSBpbnQKLV9faW5vZGVfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBzZWN0b3IsIHVuc2lnbmVkIGxvbmcgKmRhdGEpIHsKK19faW5vZGVfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBzZWN0b3IsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmRhdGEpCit7CiAJQlVHX09OKCFpbm9kZS0+aV9zYi0+c19iZGV2LT5iZF9kaXNrLT5mb3BzLT5kaXJlY3RfYWNjZXNzKTsKIAlyZXR1cm4gaW5vZGUtPmlfc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcwogCQktPmRpcmVjdF9hY2Nlc3MoaW5vZGUtPmlfc2ItPnNfYmRldixzZWN0b3IsZGF0YSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitfX2V4dDJfZ2V0X3NlY3RvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBvZmZzZXQsIGludCBjcmVhdGUsCisJCSAgIHNlY3Rvcl90ICpyZXN1bHQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcDsKKwlpbnQgcmM7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCkpOworCXJjID0gZXh0Ml9nZXRfYmxvY2soaW5vZGUsIG9mZnNldC8gKFBBR0VfU0laRS81MTIpLCAmdG1wLAorCQkJICAgIGNyZWF0ZSk7CisJKnJlc3VsdCA9IHRtcC5iX2Jsb2NrbnI7CisKKwkvKiBkaWQgd2UgZ2V0IGEgc3BhcnNlIGJsb2NrIChob2xlIGluIHRoZSBmaWxlKT8gKi8KKwlpZiAoISgqcmVzdWx0KSkgeworCQlCVUdfT04oY3JlYXRlKTsKKwkJcmMgPSAtRU5PREFUQTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIGludAotZXh0Ml9jbGVhcl94aXBfdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaykgewotCXNlY3Rvcl90IHNlY3RvciA9IGJsb2NrKihQQUdFX1NJWkUvNTEyKTsKK2V4dDJfY2xlYXJfeGlwX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYmxvY2spCit7CisJc2VjdG9yX3Qgc2VjdG9yID0gYmxvY2sgKiAoUEFHRV9TSVpFLzUxMik7CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCWludCByYzsKIAogCXJjID0gX19pbm9kZV9kaXJlY3RfYWNjZXNzKGlub2RlLCBzZWN0b3IsICZkYXRhKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQljbGVhcl9wYWdlKCh2b2lkKilkYXRhKTsKLQlyZXR1cm4gMDsKKwlpZiAoIXJjKQorCQljbGVhcl9wYWdlKCh2b2lkKilkYXRhKTsKKwlyZXR1cm4gcmM7CiB9CiAKIHZvaWQgZXh0Ml94aXBfdmVyaWZ5X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAKLQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1hJUCkpIHsKLQkJaWYgKChzYi0+c19iZGV2ID09IE5VTEwpIHx8Ci0JCQlzYi0+c19iZGV2LT5iZF9kaXNrID09IE5VTEwgfHwKLQkJCXNiLT5zX2JkZXYtPmJkX2Rpc2stPmZvcHMgPT0gTlVMTCB8fAotCQkJc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcy0+ZGlyZWN0X2FjY2VzcyA9PSBOVUxMKSB7Ci0JCQlzYmktPnNfbW91bnRfb3B0ICY9ICh+RVhUMl9NT1VOVF9YSVApOwotCQkJZXh0Ml93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkJImlnbm9yaW5nIHhpcCBvcHRpb24gLSBub3Qgc3VwcG9ydGVkIGJ5IGJkZXYiKTsKLQkJfQorCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfWElQKSAmJgorCSAgICAhc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcy0+ZGlyZWN0X2FjY2VzcykgeworCQlzYmktPnNfbW91bnRfb3B0ICY9ICh+RVhUMl9NT1VOVF9YSVApOworCQlleHQyX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImlnbm9yaW5nIHhpcCBvcHRpb24gLSBub3Qgc3VwcG9ydGVkIGJ5IGJkZXYiKTsKIAl9CiB9CiAKLXN0cnVjdCBwYWdlKgotZXh0Ml9nZXRfeGlwX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2Nrbm8sCitzdHJ1Y3QgcGFnZSAqCitleHQyX2dldF94aXBfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3Qgb2Zmc2V0LAogCQkgICBpbnQgY3JlYXRlKQogewogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGRhdGE7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcDsKKwlzZWN0b3JfdCBzZWN0b3I7CiAKLQl0bXAuYl9zdGF0ZSA9IDA7Ci0JdG1wLmJfYmxvY2tuciA9IDA7Ci0JcmMgPSBleHQyX2dldF9ibG9jayhtYXBwaW5nLT5ob3N0LCBibG9ja25vLyhQQUdFX1NJWkUvNTEyKSAsICZ0bXAsCi0JCQkJY3JlYXRlKTsKKwkvKiBmaXJzdCwgcmV0cmlldmUgdGhlIHNlY3RvciBudW1iZXIgKi8KKwlyYyA9IF9fZXh0Ml9nZXRfc2VjdG9yKG1hcHBpbmctPmhvc3QsIG9mZnNldCwgY3JlYXRlLCAmc2VjdG9yKTsKIAlpZiAocmMpCi0JCXJldHVybiBFUlJfUFRSKHJjKTsKLQlpZiAodG1wLmJfYmxvY2tuciA9PSAwKSB7Ci0JCS8qIFNQQVJTRSBibG9jayAqLwotCQlCVUdfT04oY3JlYXRlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOwotCX0KKwkJZ290byBlcnJvcjsKIAorCS8qIHJldHJpZXZlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBkYXRhICovCiAJcmMgPSBfX2lub2RlX2RpcmVjdF9hY2Nlc3MKLQkJKG1hcHBpbmctPmhvc3QsdG1wLmJfYmxvY2tuciooUEFHRV9TSVpFLzUxMikgLCZkYXRhKTsKLQlpZiAocmMpCi0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJKG1hcHBpbmctPmhvc3QsIHNlY3RvciAqIChQQUdFX1NJWkUvNTEyKSwgJmRhdGEpOworCWlmICghcmMpCisJCXJldHVybiB2aXJ0X3RvX3BhZ2UoZGF0YSk7CiAKLQlTZXRQYWdlVXB0b2RhdGUodmlydF90b19wYWdlKGRhdGEpKTsKLQlyZXR1cm4gdmlydF90b19wYWdlKGRhdGEpOworIGVycm9yOgorCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYmFsbG9jLmMgYi9mcy9leHQzL2JhbGxvYy5jCmluZGV4IGNjZDYzMmYuLmU0NjNkY2EgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYmFsbG9jLmMKKysrIGIvZnMvZXh0My9iYWxsb2MuYwpAQCAtNzQ5LDI0ICs3NDksMjQgQEAKICAqIAl0byBmaW5kIGEgZnJlZSByZWdpb24gdGhhdCBpcyBvZiBteSBzaXplIGFuZCBoYXMgbm90CiAgKiAJYmVlbiByZXNlcnZlZC4KICAqCi0gKglvbiBzdWNjZWVkLCBpdCByZXR1cm5zIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgdG8gYmUgYXBwZW5kZWQgdG8uCi0gKglmYWlsZWQsIHJldHVybiBOVUxMLgogICovCi1zdGF0aWMgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KAorc3RhdGljIGludCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coCiAJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQsCi0JCQkJdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgKnN0YXJ0X2Jsb2NrLAorCQkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKKwkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50IHN0YXJ0X2Jsb2NrLAogCQkJCWludCBsYXN0X2Jsb2NrKQogewogCXN0cnVjdCByYl9ub2RlICpuZXh0OwogCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7CiAJaW50IGN1cjsKKwlpbnQgc2l6ZSA9IG15X3Jzdi0+cnN2X2dvYWxfc2l6ZTsKIAogCS8qIFRPRE86IG1ha2UgdGhlIHN0YXJ0IG9mIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgYnl0ZS1hbGlnbmVkICovCiAJLyogY3VyID0gKnN0YXJ0X2Jsb2NrICYgfjc7Ki8KLQljdXIgPSAqc3RhcnRfYmxvY2s7CisJY3VyID0gc3RhcnRfYmxvY2s7CiAJcnN2ID0gc2VhcmNoX2hlYWQ7CiAJaWYgKCFyc3YpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLTE7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAoY3VyIDw9IHJzdi0+cnN2X2VuZCkKQEAgLTc4MiwxMSArNzgyLDExIEBACiAJCSAqIHNwYWNlIHdpdGggZXhwZWN0ZWQtc2l6ZSAob3IgbW9yZSkuLi4KIAkJICovCiAJCWlmIChjdXIgPiBsYXN0X2Jsb2NrKQotCQkJcmV0dXJuIE5VTEw7CQkvKiBmYWlsICovCisJCQlyZXR1cm4gLTE7CQkvKiBmYWlsICovCiAKIAkJcHJldiA9IHJzdjsKIAkJbmV4dCA9IHJiX25leHQoJnJzdi0+cnN2X25vZGUpOwotCQlyc3YgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOwogCiAJCS8qCiAJCSAqIFJlYWNoZWQgdGhlIGxhc3QgcmVzZXJ2YXRpb24sIHdlIGNhbiBqdXN0IGFwcGVuZCB0byB0aGUKQEAgLTgxMyw4ICs4MTMsMjUgQEAKIAkgKiByZXR1cm4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGF0IHdlIGNvdWxkIGFwcGVuZCB0by4KIAkgKiBzdWNjZWVkLgogCSAqLwotCSpzdGFydF9ibG9jayA9IGN1cjsKLQlyZXR1cm4gcHJldjsKKworCWlmICgocHJldiAhPSBteV9yc3YpICYmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKSkKKwkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisKKwkvKgorCSAqIExldCdzIGJvb2sgdGhlIHdob2xlIGF2YWxpYWJsZSB3aW5kb3cgZm9yIG5vdy4gIFdlIHdpbGwgY2hlY2sgdGhlCisJICogZGlzayBiaXRtYXAgbGF0ZXIgYW5kIHRoZW4sIGlmIHRoZXJlIGFyZSBmcmVlIGJsb2NrcyB0aGVuIHdlIGFkanVzdAorCSAqIHRoZSB3aW5kb3cgc2l6ZSBpZiBpdCdzIGxhcmdlciB0aGFuIHJlcXVlc3RlZC4KKwkgKiBPdGhlcndpc2UsIHdlIHdpbGwgcmVtb3ZlIHRoaXMgbm9kZSBmcm9tIHRoZSB0cmVlIG5leHQgdGltZQorCSAqIGNhbGwgZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93LgorCSAqLworCW15X3Jzdi0+cnN2X3N0YXJ0ID0gY3VyOworCW15X3Jzdi0+cnN2X2VuZCA9IGN1ciArIHNpemUgLSAxOworCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisKKwlpZiAocHJldiAhPSBteV9yc3YpCisJCWV4dDNfcnN2X3dpbmRvd19hZGQoc2IsIG15X3Jzdik7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC04NTIsNiArODY5LDcgQEAKICAqCUBzYjogdGhlIHN1cGVyIGJsb2NrCiAgKglAZ3JvdXA6IHRoZSBncm91cCB3ZSBhcmUgdHJ5aW5nIHRvIGFsbG9jYXRlIGluCiAgKglAYml0bWFwX2JoOiB0aGUgYmxvY2sgZ3JvdXAgYmxvY2sgYml0bWFwCisgKgogICovCiBzdGF0aWMgaW50IGFsbG9jX25ld19yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpteV9yc3YsCiAJCWludCBnb2FsLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtODYwLDEwICs4NzgsMTAgQEAKIAlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZDsKIAlpbnQgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2VuZF9ibG9jaywgc3RhcnRfYmxvY2s7CiAJaW50IGZpcnN0X2ZyZWVfYmxvY2s7Ci0JaW50IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQ7Ci0Jc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcHJldl9yc3Y7CiAJc3RydWN0IHJiX3Jvb3QgKmZzX3Jzdl9yb290ID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKwlzcGlubG9ja190ICpyc3ZfbG9jayA9ICZFWFQzX1NCKHNiKS0+c19yc3Zfd2luZG93X2xvY2s7CiAKIAlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKIAkJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CkBAIC04NzUsNiArODkzLDcgQEAKIAkJc3RhcnRfYmxvY2sgPSBnb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2s7CiAKIAlzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOworCiAJaWYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpIHsKIAkJLyoKIAkJICogaWYgdGhlIG9sZCByZXNlcnZhdGlvbiBpcyBjcm9zcyBncm91cCBib3VuZGFyeQpAQCAtOTA4LDYgKzkyNyw4IEBACiAJCQlteV9yc3YtPnJzdl9nb2FsX3NpemU9IHNpemU7CiAJCX0KIAl9CisKKwlzcGluX2xvY2socnN2X2xvY2spOwogCS8qCiAJICogc2hpZnQgdGhlIHNlYXJjaCBzdGFydCB0byB0aGUgd2luZG93IG5lYXIgdGhlIGdvYWwgYmxvY2sKIAkgKi8KQEAgLTkyMSwxMSArOTQyLDE2IEBACiAJICogbmVlZCB0byBjaGVjayB0aGUgYml0bWFwIGFmdGVyIHdlIGZvdW5kIGEgcmVzZXJ2YWJsZSB3aW5kb3cuCiAJICovCiByZXRyeToKLQlwcmV2X3JzdiA9IGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdyhzZWFyY2hfaGVhZCwgc2l6ZSwKLQkJCQkJCSZzdGFydF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrKTsKLQlpZiAocHJldl9yc3YgPT0gTlVMTCkKLQkJZ290byBmYWlsZWQ7Ci0JcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCA9IHN0YXJ0X2Jsb2NrOworCXJldCA9IGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdyhzZWFyY2hfaGVhZCwgbXlfcnN2LCBzYiwKKwkJCQkJCXN0YXJ0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2spOworCisJaWYgKHJldCA9PSAtMSkgeworCQlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkKKwkJCXJzdl93aW5kb3dfcmVtb3ZlKHNiLCBteV9yc3YpOworCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisKIAkvKgogCSAqIE9uIHN1Y2Nlc3MsIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpIHJldHVybnMgdGhlCiAJICogcmVzZXJ2YXRpb24gd2luZG93IHdoZXJlIHRoZXJlIGlzIGEgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciBpdC4KQEAgLTkzNyw4ICs5NjMsOSBAQAogCSAqIGJsb2NrLiBTZWFyY2ggc3RhcnQgZnJvbSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKIAkgKiB3ZSBqdXN0IGZvdW5kLgogCSAqLworCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKIAlmaXJzdF9mcmVlX2Jsb2NrID0gYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jaygKLQkJCXJlc2VydmFibGVfc3BhY2Vfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jaywKKwkJCW15X3Jzdi0+cnN2X3N0YXJ0IC0gZ3JvdXBfZmlyc3RfYmxvY2ssCiAJCQliaXRtYXBfYmgsIGdyb3VwX2VuZF9ibG9jayAtIGdyb3VwX2ZpcnN0X2Jsb2NrICsgMSk7CiAKIAlpZiAoZmlyc3RfZnJlZV9ibG9jayA8IDApIHsKQEAgLTk0Niw1NCArOTczLDI5IEBACiAJCSAqIG5vIGZyZWUgYmxvY2sgbGVmdCBvbiB0aGUgYml0bWFwLCBubyBwb2ludAogCQkgKiB0byByZXNlcnZlIHRoZSBzcGFjZS4gcmV0dXJuIGZhaWxlZC4KIAkJICovCi0JCWdvdG8gZmFpbGVkOworCQlzcGluX2xvY2socnN2X2xvY2spOworCQlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkKKwkJCXJzdl93aW5kb3dfcmVtb3ZlKHNiLCBteV9yc3YpOworCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJCXJldHVybiAtMTsJCS8qIGZhaWxlZCAqLwogCX0KKwogCXN0YXJ0X2Jsb2NrID0gZmlyc3RfZnJlZV9ibG9jayArIGdyb3VwX2ZpcnN0X2Jsb2NrOwogCS8qCiAJICogY2hlY2sgaWYgdGhlIGZpcnN0IGZyZWUgYmxvY2sgaXMgd2l0aGluIHRoZQotCSAqIGZyZWUgc3BhY2Ugd2UganVzdCBmb3VuZAorCSAqIGZyZWUgc3BhY2Ugd2UganVzdCByZXNlcnZlZAogCSAqLwotCWlmICgoc3RhcnRfYmxvY2sgPj0gcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCkgJiYKLQkgIChzdGFydF9ibG9jayA8IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQgKyBzaXplKSkKLQkJZ290byBmb3VuZF9yc3Zfd2luZG93OworCWlmIChzdGFydF9ibG9jayA+PSBteV9yc3YtPnJzdl9zdGFydCAmJiBzdGFydF9ibG9jayA8IG15X3Jzdi0+cnN2X2VuZCkKKwkJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCiAJLyoKIAkgKiBpZiB0aGUgZmlyc3QgZnJlZSBiaXQgd2UgZm91bmQgaXMgb3V0IG9mIHRoZSByZXNlcnZhYmxlIHNwYWNlCi0JICogdGhpcyBtZWFucyB0aGVyZSBpcyBubyBmcmVlIGJsb2NrIG9uIHRoZSByZXNlcnZhYmxlIHNwYWNlCi0JICogd2Ugc2hvdWxkIGNvbnRpbnVlIHNlYXJjaCBmb3IgbmV4dCByZXNlcnZhYmxlIHNwYWNlLAorCSAqIGNvbnRpbnVlIHNlYXJjaCBmb3IgbmV4dCByZXNlcnZhYmxlIHNwYWNlLAogCSAqIHN0YXJ0IGZyb20gd2hlcmUgdGhlIGZyZWUgYmxvY2sgaXMsCiAJICogd2UgYWxzbyBzaGlmdCB0aGUgbGlzdCBoZWFkIHRvIHdoZXJlIHdlIHN0b3BwZWQgbGFzdCB0aW1lCiAJICovCi0Jc2VhcmNoX2hlYWQgPSBwcmV2X3JzdjsKKwlzZWFyY2hfaGVhZCA9IG15X3JzdjsKKwlzcGluX2xvY2socnN2X2xvY2spOwogCWdvdG8gcmV0cnk7Ci0KLWZvdW5kX3Jzdl93aW5kb3c6Ci0JLyoKLQkgKiBncmVhdCEgdGhlIHJlc2VydmFibGUgc3BhY2UgY29udGFpbnMgc29tZSBmcmVlIGJsb2Nrcy4KLQkgKiBpZiB0aGUgc2VhcmNoIHJldHVybnMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBuZXcKLQkgKiB3aW5kb3cganVzdCBuZXh0IHRvIHdoZXJlIHRoZSBvbGQgd2luZG93LCB3ZSBkb24ndAotIAkgKiBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHdpbmRvdyBmaXJzdCB0aGVuIGFkZCBpdCB0byB0aGUKLQkgKiBzYW1lIHBsYWNlLCBqdXN0IHVwZGF0ZSB0aGUgbmV3IHN0YXJ0IGFuZCBuZXcgZW5kLgotCSAqLwotCWlmIChteV9yc3YgIT0gcHJldl9yc3YpICB7Ci0JCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQotCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7Ci0JfQotCW15X3Jzdi0+cnN2X3N0YXJ0ID0gcmVzZXJ2YWJsZV9zcGFjZV9zdGFydDsKLQlteV9yc3YtPnJzdl9lbmQgPSBteV9yc3YtPnJzdl9zdGFydCArIHNpemUgLSAxOwotCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCA9IDA7Ci0JaWYgKG15X3JzdiAhPSBwcmV2X3JzdikgIHsKLQkJZXh0M19yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKLQl9Ci0JcmV0dXJuIDA7CQkvKiBzdWNjZWVkICovCi1mYWlsZWQ6Ci0JLyoKLQkgKiBmYWlsZWQgdG8gZmluZCBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgaW4gdGhlIGN1cnJlbnQKLQkgKiBncm91cCwgcmVtb3ZlIHRoZSBjdXJyZW50KHN0YWxlKSByZXNlcnZhdGlvbiB3aW5kb3cKLQkgKiBpZiB0aGVyZSBpcyBhbnkKLQkgKi8KLQlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkKLQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7Ci0JcmV0dXJuIC0xOwkJLyogZmFpbGVkICovCiB9CiAKIC8qCkBAIC0xMDIzLDcgKzEwMjUsNiBAQAogCQkJaW50IGdvYWwsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCiAJCQlpbnQgKmVycnApCiB7Ci0Jc3BpbmxvY2tfdCAqcnN2X2xvY2s7CiAJdW5zaWduZWQgbG9uZyBncm91cF9maXJzdF9ibG9jazsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgZmF0YWw7CkBAIC0xMDUyLDcgKzEwNTMsNiBAQAogCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLCBOVUxMKTsKIAkJZ290byBvdXQ7CiAJfQotCXJzdl9sb2NrID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKIAkvKgogCSAqIGdvYWwgaXMgYSBncm91cCByZWxhdGl2ZSBibG9jayBudW1iZXIgKGlmIHRoZXJlIGlzIGEgZ29hbCkKIAkgKiAwIDwgZ29hbCA8IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikKQEAgLTEwNzgsMzAgKzEwNzgsMjEgQEAKIAkgKiB0aGVuIHdlIGNvdWxkIGdvIHRvIGFsbG9jYXRlIGZyb20gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBkaXJlY3RseS4KIAkgKi8KIAl3aGlsZSAoMSkgewotCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyByc3ZfY29weTsKLQotCQlyc3ZfY29weS5fcnN2X3N0YXJ0ID0gbXlfcnN2LT5yc3Zfc3RhcnQ7Ci0JCXJzdl9jb3B5Ll9yc3ZfZW5kID0gbXlfcnN2LT5yc3ZfZW5kOwotCi0JCWlmIChyc3ZfaXNfZW1wdHkoJnJzdl9jb3B5KSB8fCAocmV0IDwgMCkgfHwKLQkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkgewotCQkJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKKwkJaWYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSB8fCAocmV0IDwgMCkgfHwKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdvYWwsIGdyb3VwLCBzYikpIHsKIAkJCXJldCA9IGFsbG9jX25ld19yZXNlcnZhdGlvbihteV9yc3YsIGdvYWwsIHNiLAogCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOwotCQkJcnN2X2NvcHkuX3Jzdl9zdGFydCA9IG15X3Jzdi0+cnN2X3N0YXJ0OwotCQkJcnN2X2NvcHkuX3Jzdl9lbmQgPSBteV9yc3YtPnJzdl9lbmQ7Ci0JCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsJCQkvKiBmYWlsZWQgKi8KIAotCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkKKwkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LCBnb2FsLCBncm91cCwgc2IpKQogCQkJCWdvYWwgPSAtMTsKIAkJfQotCQlpZiAoKHJzdl9jb3B5Ll9yc3Zfc3RhcnQgPj0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQotCQkgICAgfHwgKHJzdl9jb3B5Ll9yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKQorCQlpZiAoKG15X3Jzdi0+cnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrICsgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJICAgIHx8IChteV9yc3YtPnJzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCiAJCQlCVUcoKTsKIAkJcmV0ID0gZXh0M190cnlfdG9fYWxsb2NhdGUoc2IsIGhhbmRsZSwgZ3JvdXAsIGJpdG1hcF9iaCwgZ29hbCwKLQkJCQkJICAgJnJzdl9jb3B5KTsKKwkJCQkJICAgJm15X3Jzdi0+cnN2X3dpbmRvdyk7CiAJCWlmIChyZXQgPj0gMCkgewogCQkJbXlfcnN2LT5yc3ZfYWxsb2NfaGl0Kys7CiAJCQlicmVhazsJCQkJLyogc3VjY2VlZCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9maWxlLmMgYi9mcy9leHQzL2ZpbGUuYwppbmRleCA1YWQ4Y2YwMi4uOThlNzgzNCAxMDA2NDQKLS0tIGEvZnMvZXh0My9maWxlLmMKKysrIGIvZnMvZXh0My9maWxlLmMKQEAgLTM2LDcgKzM2LDExIEBACiAJLyogaWYgd2UgYXJlIHRoZSBsYXN0IHdyaXRlciBvbiB0aGUgaW5vZGUsIGRyb3AgdGhlIGJsb2NrIHJlc2VydmF0aW9uICovCiAJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKIAkJCShhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPT0gMSkpCisJeworCQlkb3duKCZFWFQzX0koaW5vZGUpLT50cnVuY2F0ZV9zZW0pOwogCQlleHQzX2Rpc2NhcmRfcmVzZXJ2YXRpb24oaW5vZGUpOworCQl1cCgmRVhUM19JKGlub2RlKS0+dHJ1bmNhdGVfc2VtKTsKKwl9CiAJaWYgKGlzX2R4KGlub2RlKSAmJiBmaWxwLT5wcml2YXRlX2RhdGEpCiAJCWV4dDNfaHRyZWVfZnJlZV9kaXJfaW5mbyhmaWxwLT5wcml2YXRlX2RhdGEpOwogCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMGIyZGI0Zi4uOTk4OWZkYyAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjY2Myw3ICsyNjYzLDcgQEAKIAl9IGVsc2UgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgRVhUM19OX0JMT0NLUzsgYmxvY2srKykKIAkJcmF3X2lub2RlLT5pX2Jsb2NrW2Jsb2NrXSA9IGVpLT5pX2RhdGFbYmxvY2tdOwogCi0JaWYgKEVYVDNfSU5PREVfU0laRShpbm9kZS0+aV9zYikgPiBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpCisJaWYgKGVpLT5pX2V4dHJhX2lzaXplKQogCQlyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihlaS0+aV9leHRyYV9pc2l6ZSk7CiAKIAlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGI0YjNlOGEuLjNjM2M2ZTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTg5MCw3ICs4OTAsMTAgQEAKIAkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQkvKgorCQkJICogVGhlIHNwYWNlIHdpbGwgYmUgcmVsZWFzZWQgbGF0ZXIgd2hlbiBhbGwgb3B0aW9ucworCQkJICogYXJlIGNvbmZpcm1lZCB0byBiZSBjb3JyZWN0CisJCQkgKi8KIAkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBOVUxMOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKQEAgLTkzOSwxMiArOTQyLDEzIEBACiAJCWNhc2UgT3B0X2lnbm9yZToKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9yZXNpemU6Ci0JCQlpZiAoIW5fYmxvY2tzX2NvdW50KSB7CisJCQlpZiAoIWlzX3JlbW91bnQpIHsKIAkJCQlwcmludGsoIkVYVDMtZnM6IHJlc2l6ZSBvcHRpb24gb25seSBhdmFpbGFibGUgIgogCQkJCQkiZm9yIHJlbW91bnRcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJbWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKTsKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pICE9IDApCisJCQkJcmV0dXJuIDA7CiAJCQkqbl9ibG9ja3NfY291bnQgPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9iaDoKQEAgLTIxMDgsMTQgKzIxMTIsMzMgQEAKIHsKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgdG1wOwogCXVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgb2xkX3NiX2ZsYWdzOworCXN0cnVjdCBleHQzX21vdW50X29wdGlvbnMgb2xkX29wdHM7CisJaW50IGVycjsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgaTsKKyNlbmRpZgorCisJLyogU3RvcmUgdGhlIG9yaWdpbmFsIG9wdGlvbnMgKi8KKwlvbGRfc2JfZmxhZ3MgPSBzYi0+c19mbGFnczsKKwlvbGRfb3B0cy5zX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJb2xkX29wdHMuc19yZXN1aWQgPSBzYmktPnNfcmVzdWlkOworCW9sZF9vcHRzLnNfcmVzZ2lkID0gc2JpLT5zX3Jlc2dpZDsKKwlvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbCA9IHNiaS0+c19jb21taXRfaW50ZXJ2YWw7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJb2xkX29wdHMuc19qcXVvdGFfZm10ID0gc2JpLT5zX2pxdW90YV9mbXQ7CisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCQlvbGRfb3B0cy5zX3FmX25hbWVzW2ldID0gc2JpLT5zX3FmX25hbWVzW2ldOworI2VuZGlmCiAKIAkvKgogCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KIAkgKi8KLQlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IsICZ0bXAsICZuX2Jsb2Nrc19jb3VudCwgMSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgTlVMTCwgJm5fYmxvY2tzX2NvdW50LCAxKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJlc3RvcmVfb3B0czsKKwl9CiAKIAlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfQUJPUlQpCiAJCWV4dDNfYWJvcnQoc2IsIF9fRlVOQ1RJT05fXywgIkFib3J0IGZvcmNlZCBieSB1c2VyIik7CkBAIC0yMTI5LDggKzIxNTIsMTAgQEAKIAogCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSAhPSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHx8CiAJCW5fYmxvY2tzX2NvdW50ID4gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgewotCQlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfQUJPUlQpCi0JCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfQUJPUlQpIHsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWdvdG8gcmVzdG9yZV9vcHRzOworCQl9CiAKIAkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgewogCQkJLyoKQEAgLTIxNTcsNyArMjE4Miw4IEBACiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCiAJCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKIAkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOwotCQkJCXJldHVybiAtRVJPRlM7CisJCQkJZXJyID0gLUVST0ZTOworCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQogCQkJLyoKIAkJCSAqIE1vdW50aW5nIGEgUkRPTkxZIHBhcnRpdGlvbiByZWFkLXdyaXRlLCBzbyByZXJlYWQKQEAgLTIxNjcsMTMgKzIxOTMsMzggQEAKIAkJCSAqLwogCQkJZXh0M19jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOwogCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOwotCQkJaWYgKChyZXQgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpCi0JCQkJcmV0dXJuIHJldDsKKwkJCWlmICgocmV0ID0gZXh0M19ncm91cF9leHRlbmQoc2IsIGVzLCBuX2Jsb2Nrc19jb3VudCkpKSB7CisJCQkJZXJyID0gcmV0OworCQkJCWdvdG8gcmVzdG9yZV9vcHRzOworCQkJfQogCQkJaWYgKCFleHQzX3NldHVwX3N1cGVyIChzYiwgZXMsIDApKQogCQkJCXNiLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CiAJCX0KIAl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJLyogUmVsZWFzZSBvbGQgcXVvdGEgZmlsZSBuYW1lcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJaWYgKG9sZF9vcHRzLnNfcWZfbmFtZXNbaV0gJiYKKwkJICAgIG9sZF9vcHRzLnNfcWZfbmFtZXNbaV0gIT0gc2JpLT5zX3FmX25hbWVzW2ldKQorCQkJa2ZyZWUob2xkX29wdHMuc19xZl9uYW1lc1tpXSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKK3Jlc3RvcmVfb3B0czoKKwlzYi0+c19mbGFncyA9IG9sZF9zYl9mbGFnczsKKwlzYmktPnNfbW91bnRfb3B0ID0gb2xkX29wdHMuc19tb3VudF9vcHQ7CisJc2JpLT5zX3Jlc3VpZCA9IG9sZF9vcHRzLnNfcmVzdWlkOworCXNiaS0+c19yZXNnaWQgPSBvbGRfb3B0cy5zX3Jlc2dpZDsKKwlzYmktPnNfY29tbWl0X2ludGVydmFsID0gb2xkX29wdHMuc19jb21taXRfaW50ZXJ2YWw7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJc2JpLT5zX2pxdW90YV9mbXQgPSBvbGRfb3B0cy5zX2pxdW90YV9mbXQ7CisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CisJCWlmIChzYmktPnNfcWZfbmFtZXNbaV0gJiYKKwkJICAgIG9sZF9vcHRzLnNfcWZfbmFtZXNbaV0gIT0gc2JpLT5zX3FmX25hbWVzW2ldKQorCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW2ldKTsKKwkJc2JpLT5zX3FmX25hbWVzW2ldID0gb2xkX29wdHMuc19xZl9uYW1lc1tpXTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGV4dDNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGtzdGF0ZnMgKiBidWYpCmRpZmYgLS1naXQgYS9mcy9mYXQvY2FjaGUuYyBiL2ZzL2ZhdC9jYWNoZS5jCmluZGV4IDdjNTJlNDYuLjc3YzI0ZmMgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9jYWNoZS5jCisrKyBiL2ZzL2ZhdC9jYWNoZS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpCit2b2lkIGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpCiB7CiAJaWYgKGttZW1fY2FjaGVfZGVzdHJveShmYXRfY2FjaGVfY2FjaGVwKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZmF0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDhjY2VlODQuLjk2YWU4NWIgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC0xMzI3LDE2ICsxMzI3LDI1IEBACiBFWFBPUlRfU1lNQk9MKGZhdF9maWxsX3N1cGVyKTsKIAogaW50IF9faW5pdCBmYXRfY2FjaGVfaW5pdCh2b2lkKTsKLXZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpOwordm9pZCBmYXRfY2FjaGVfZGVzdHJveSh2b2lkKTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9mYXRfZnModm9pZCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlyZXQgPSBmYXRfY2FjaGVfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBmYXRfaW5pdF9pbm9kZWNhY2hlKCk7CisJZXJyID0gZmF0X2NhY2hlX2luaXQoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZmF0X2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbGVkOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlmYXRfY2FjaGVfZGVzdHJveSgpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZhdF9mcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCmluZGV4IGZhNzg0OWYuLjFkM2RlNzggMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGVfdGFibGUuYworKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogCiAvKiBzeXNjdGwgdHVuYWJsZXMuLi4gKi8KIHN0cnVjdCBmaWxlc19zdGF0X3N0cnVjdCBmaWxlc19zdGF0ID0gewpAQCAtMTI2LDYgKzEyNyw4IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCW1pZ2h0X3NsZWVwKCk7CisKKwlmc25vdGlmeV9jbG9zZShmaWxlKTsKIAkvKgogCSAqIFRoZSBmdW5jdGlvbiBldmVudHBvbGxfcmVsZWFzZSgpIHNob3VsZCBiZSB0aGUgZmlyc3QgY2FsbGVkCiAJICogaW4gdGhlIGZpbGUgY2xlYW51cCBjaGFpbi4KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAppbmRleCA4ZGEwMjUyLi41ODNiZDc4IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzLmgKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCkBAIC0zNyw3ICszNyw2IEBACiAgKiBzdXBlcmJsb2NrcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLgogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlICJ2eGZzX2tjb21wYXQuaCIKIAogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMgYi9mcy9mcmVldnhmcy92eGZzX2JtYXAuYwppbmRleCBiYzRiNTdkLi5kM2Y2YjI4IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2JtYXAuYworKysgYi9mcy9mcmVldnhmcy92eGZzX2JtYXAuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWxfc2l6ZToKLQlwcmludGsoInZ4ZnM6IGluZGlyZWN0IGV4dGVudCB0byBiaWchXG4iKTsKKwlwcmludGsoInZ4ZnM6IGluZGlyZWN0IGV4dGVudCB0b28gYmlnIVxuIik7CiBmYWlsX2J1ZjoKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCmluZGV4IDA1YjE5ZjcuLjZkZWUxMDkgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwpAQCAtNzgsMTcgKzc4LDE4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkCQkqYnA7CiAKIAlicCA9IHZ4ZnNfYnJlYWQoaXAsIHdoaWNoKTsKLQlpZiAoYnVmZmVyX21hcHBlZChicCkpIHsKKwlpZiAoYnApIHsKIAkJc3RydWN0IHZ4ZnNfZnNoCQkqZmhwOwogCi0JCWlmICghKGZocCA9IGttYWxsb2Moc2l6ZW9mKCpmaHApLCBTTEFCX0tFUk5FTCkpKQotCQkJcmV0dXJuIE5VTEw7CisJCWlmICghKGZocCA9IGttYWxsb2Moc2l6ZW9mKCpmaHApLCBHRlBfS0VSTkVMKSkpCisJCQlnb3RvIG91dDsKIAkJbWVtY3B5KGZocCwgYnAtPmJfZGF0YSwgc2l6ZW9mKCpmaHApKTsKIAotCQlicmVsc2UoYnApOworCQlwdXRfYmgoYnApOwogCQlyZXR1cm4gKGZocCk7CiAJfQotCitvdXQ6CisJYnJlbHNlKGJwKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19rY29tcGF0LmggYi9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyYTRjYy4uMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSNpZm5kZWYgX1ZYRlNfS0NPTVBBVF9ICi0jZGVmaW5lIF9WWEZTX0tDT01QQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotCi10eXBlZGVmIGxvbmcgc2VjdG9yX3Q7Ci0KLS8qIEZyb20gaW5jbHVkZS9saW51eC9mcy5oIChMaW51eCAyLjUuMi1wcmUzKSAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICogc2JfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQotewotCXJldHVybiBicmVhZChzYi0+c19kZXYsIGJsb2NrLCBzYi0+c19ibG9ja3NpemUpOwotfQotCi0vKiBEaXRvLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXBfYmgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQotewotCWJoLT5iX3N0YXRlIHw9IDEgPDwgQkhfTWFwcGVkOwotCWJoLT5iX2RldiA9IHNiLT5zX2RldjsKLQliaC0+Yl9ibG9ja25yID0gYmxvY2s7Ci19Ci0KLS8qIEZyb20gZnMvYmxvY2tfZGV2LmMgKExpbnV4IDIuNS4yLXByZTIpICAqLwotc3RhdGljIGlubGluZSBpbnQgc2Jfc2V0X2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKLXsKLQlpbnQgYml0czsKLQlpZiAoc2V0X2Jsb2Nrc2l6ZShzYi0+c19kZXYsIHNpemUpIDwgMCkKLQkJcmV0dXJuIDA7Ci0Jc2ItPnNfYmxvY2tzaXplID0gc2l6ZTsKLQlmb3IgKGJpdHMgPSA5LCBzaXplID4+PSA5OyBzaXplID4+PSAxOyBiaXRzKyspCi0JCTsKLQlzYi0+c19ibG9ja3NpemVfYml0cyA9IGJpdHM7Ci0JcmV0dXJuIHNiLT5zX2Jsb2Nrc2l6ZTsKLX0KLQotLyogRGl0by4gICovCi1zdGF0aWMgaW5saW5lIGludCBzYl9taW5fYmxvY2tzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQotewotCWludCBtaW5zaXplID0gZ2V0X2hhcmRzZWN0X3NpemUoc2ItPnNfZGV2KTsKLQlpZiAoc2l6ZSA8IG1pbnNpemUpCi0JCXNpemUgPSBtaW5zaXplOwotCXJldHVybiBzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKTsKLX0KLQotI2VuZGlmIC8qIEtlcm5lbCAyLjQgKi8KLSNlbmRpZiAvKiBfVlhGU19LQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMgYi9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jCmluZGV4IDUwNmFlMjUuLjU1NGViNDUgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwpAQCAtNjEsMTMgKzYxLDEzIEBACiB9OwogCiAgCi1zdGF0aWMgX19pbmxpbmVfXyB1X2xvbmcKK3N0YXRpYyBpbmxpbmUgdV9sb25nCiBkaXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogfQogIAotc3RhdGljIF9faW5saW5lX18gdV9sb25nCitzdGF0aWMgaW5saW5lIHVfbG9uZwogZGlyX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlwKQogewogCXVfbG9uZwkJCWJzaXplID0gaXAtPmlfc2ItPnNfYmxvY2tzaXplOwpAQCAtNzksNyArNzksNyBAQAogICoKICAqIGxlbiA8PSBWWEZTX05BTUVMRU4gYW5kIGRlICE9IE5VTEwgYXJlIGd1YXJhbnRlZWQgYnkgY2FsbGVyLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiB2eGZzX21hdGNoKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLCBzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlKQogewogCWlmIChsZW4gIT0gZGUtPmRfbmFtZWxlbikKQEAgLTg5LDcgKzg5LDcgQEAKIAlyZXR1cm4gIW1lbWNtcChuYW1lLCBkZS0+ZF9uYW1lLCBsZW4pOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgdnhmc19kaXJlY3QgKgorc3RhdGljIGlubGluZSBzdHJ1Y3Qgdnhmc19kaXJlY3QgKgogdnhmc19uZXh0X2VudHJ5KHN0cnVjdCB2eGZzX2RpcmVjdCAqZGUpCiB7CiAJcmV0dXJuICgoc3RydWN0IHZ4ZnNfZGlyZWN0ICopKChjaGFyKilkZSArIGRlLT5kX3JlY2xlbikpOwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMKaW5kZXggN2EyMDRlMy4uMTMzNDc2MiAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYworKysgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAidnhmc19vbHQuaCIKIAogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHZ4ZnNfZ2V0X2ZzaGVhZChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKmZzaHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApCiB7CiAJaWYgKGluZnAtPnZzaV9mc2hpbm8pCkBAIC00Niw3ICs0Niw3IEBACiAJaW5mcC0+dnNpX2ZzaGlubyA9IGZzaHAtPm9sdF9mc2lub1swXTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiB2eGZzX2dldF9pbGlzdChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKQogewogCWlmIChpbmZwLT52c2lfaWV4dCkKQEAgLTU0LDcgKzU0LDcgQEAKIAlpbmZwLT52c2lfaWV4dCA9IGlsaXN0cC0+b2x0X2lleHRbMF07IAogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1X2xvbmcKK3N0YXRpYyBpbmxpbmUgdV9sb25nCiB2eGZzX29ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgZGFkZHJfdCBibG9jaywgdV9sb25nIGJzaXplKQogewogCWlmIChzYnAtPnNfYmxvY2tzaXplICUgYnNpemUpCkBAIC0xMDQsOCArMTA0LDggQEAKIAkJZ290byBmYWlsOwogCX0KIAotCW9hZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgb3AtPm9sdF9zaXplOwotCWVhZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgKGluZnAtPnZzaV9vbHRzaXplICogc2JwLT5zX2Jsb2Nrc2l6ZSk7CisJb2FkZHIgPSBicC0+Yl9kYXRhICsgb3AtPm9sdF9zaXplOworCWVhZGRyID0gYnAtPmJfZGF0YSArIChpbmZwLT52c2lfb2x0c2l6ZSAqIHNicC0+c19ibG9ja3NpemUpOwogCiAJd2hpbGUgKG9hZGRyIDwgZWFkZHIpIHsKIAkJc3RydWN0IHZ4ZnNfb2x0Y29tbW9uCSpvY3AgPQpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuYwppbmRleCA1ZTMwNTYxLi41MGFhZTc3IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYworKysgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAKLSNpbmNsdWRlICJ2eGZzX2tjb21wYXQuaCIKICNpbmNsdWRlICJ2eGZzX2V4dGVybi5oIgogCiAKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwppbmRleCAwYWUyYzdiLi4yN2Y2NmQzIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC0xNTUsMTIgKzE1NSwxMSBAQAogCiAJc2JwLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAotCWluZnAgPSBrbWFsbG9jKHNpemVvZigqaW5mcCksIEdGUF9LRVJORUwpOworCWluZnAgPSBrY2FsbG9jKDEsIHNpemVvZigqaW5mcCksIEdGUF9LRVJORUwpOwogCWlmICghaW5mcCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KGluZnAsIDAsIHNpemVvZigqaW5mcCkpOwogCiAJYnNpemUgPSBzYl9taW5fYmxvY2tzaXplKHNicCwgQkxPQ0tfU0laRSk7CiAJaWYgKCFic2l6ZSkgewpAQCAtMTk2LDcgKzE5NSw3IEBACiAjZW5kaWYKIAogCXNicC0+c19tYWdpYyA9IHJzYnAtPnZzX21hZ2ljOwotCXNicC0+c19mc19pbmZvID0gKHZvaWQgKilpbmZwOworCXNicC0+c19mc19pbmZvID0gaW5mcDsKIAogCWluZnAtPnZzaV9yYXcgPSByc2JwOwogCWluZnAtPnZzaV9icCA9IGJwOwpAQCAtMjYzLDcgKzI2Miw3IEBACiAJCQlzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsIAogCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwsIE5VTEwpOwogCWlmICh2eGZzX2lub2RlX2NhY2hlcCkKLQkJcmV0dXJuIChyZWdpc3Rlcl9maWxlc3lzdGVtKCZ2eGZzX2ZzX3R5cGUpKTsKKwkJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnZ4ZnNfZnNfdHlwZSk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggNGJmNDNlYS4uODhlNjhjYSAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTE2MCw4ICsxNTksNiBAQAogCWluby0+aV9zaXplID0gaV9zaXplOwogCWluby0+aV9ibGtzaXplID0gaV9ibGtzaXplOwogCWluby0+aV9ibG9ja3MgPSBpX2Jsb2NrczsKLQlpZigoaW5vLT5pX3NiLT5zX2RldiA9PSBST09UX0RFVikgJiYgKGluby0+aV91aWQgPT0gZ2V0dWlkKCkpKQotCQlpbm8tPmlfdWlkID0gMDsKIAlyZXR1cm4oMCk7CiB9CiAKQEAgLTg0MSwxNiArODM4LDEwIEBACiAJCWF0dHJzLmlhX21vZGUgPSBhdHRyLT5pYV9tb2RlOwogCX0KIAlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKXsKLQkJaWYoKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19kZXYgPT0gUk9PVF9ERVYpICYmCi0JCSAgIChhdHRyLT5pYV91aWQgPT0gMCkpCi0JCQlhdHRyLT5pYV91aWQgPSBnZXR1aWQoKTsKIAkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfVUlEOwogCQlhdHRycy5pYV91aWQgPSBhdHRyLT5pYV91aWQ7CiAJfQogCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpewotCQlpZigoZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldiA9PSBST09UX0RFVikgJiYKLQkJICAgKGF0dHItPmlhX2dpZCA9PSAwKSkKLQkJCWF0dHItPmlhX2dpZCA9IGdldGdpZCgpOwogCQlhdHRycy5pYV92YWxpZCB8PSBIT1NURlNfQVRUUl9HSUQ7CiAJCWF0dHJzLmlhX2dpZCA9IGF0dHItPmlhX2dpZDsKIAl9CmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKaW5kZXggZjhlMGNiZC4uZmYxNTBmZSAxMDA2NDQKLS0tIGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwpAQCAtNCw2ICs0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTIzMiw3ICsyMzMsNyBAQAogCQlzZXRfZnMoVVNFUl9EUyk7CiAKIAlpZihwcG9zKSAqcHBvcyA9IGZpbGUtPmZfcG9zOwotCXJldHVybihuKTsKKwlyZXR1cm4gbjsKIH0KIAogc3RhdGljIHNzaXplX3QgaHBwZnNfcmVhZF9maWxlKGludCBmZCwgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQpAQCAtMjUzLDcgKzI1NCw3IEBACiAJCWVyciA9IG9zX3JlYWRfZmlsZShmZCwgbmV3X2J1ZiwgY3VyKTsKIAkJaWYoZXJyIDwgMCl7CiAJCQlwcmludGsoImhwcGZzX3JlYWQgOiByZWFkIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCSAgICAgICBjb3VudCk7CisJCQkgICAgICAgZXJyKTsKIAkJCW4gPSBlcnI7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC0yNzAsNyArMjcxLDcgQEAKICBvdXRfZnJlZToKIAlrZnJlZShuZXdfYnVmKTsKICBvdXQ6Ci0JcmV0dXJuKG4pOworCXJldHVybiBuOwogfQogCiBzdGF0aWMgc3NpemVfdCBocHBmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKQEAgLTQ5MSw3ICs0OTIsNyBAQAogCQlmZCA9IG9wZW5faG9zdF9zb2NrKGhvc3RfZmlsZSwgJmZpbHRlcik7CiAJCWlmKGZkID4gMCl7CiAJCQlkYXRhLT5jb250ZW50cyA9IGhwcGZzX2dldF9kYXRhKGZkLCBmaWx0ZXIsCi0JCQkJCQkJJmRhdGEtPnByb2NfZmlsZSwKKwkJCQkJCQlkYXRhLT5wcm9jX2ZpbGUsCiAJCQkJCQkJZmlsZSwgJmRhdGEtPmxlbik7CiAJCQlpZighSVNfRVJSKGRhdGEtPmNvbnRlbnRzKSkKIAkJCQlkYXRhLT5ob3N0X2ZkID0gZmQ7CkBAIC01NDMsNyArNTQ0LDcgQEAKIHN0YXRpYyBsb2ZmX3QgaHBwZnNfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlcmUpCiB7CiAJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9ICZkYXRhLT5wcm9jX2ZpbGU7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9IGRhdGEtPnByb2NfZmlsZTsKIAlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIAlsb2ZmX3QgcmV0OwogCkBAIC01ODYsNyArNTg3LDcgQEAKIHN0YXRpYyBpbnQgaHBwZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gJmRhdGEtPnByb2NfZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gZGF0YS0+cHJvY19maWxlOwogCWludCAoKnJlYWRkaXIpKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKIAlzdHJ1Y3QgaHBwZnNfZGlyZW50IGRpcmVudCA9ICgoc3RydWN0IGhwcGZzX2RpcmVudCkKIAkJICAgICAgICAgICAgICAgICAgICAgIHsgLnZmc19kaXJlbnQgIAk9IGVudCwKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDFmOWEzYTIuLmU1N2YxNzIgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KIAogLyoKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKQEAgLTIwMiw2ICsyMDMsMTAgQEAKIAlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5pX21tYXBfbm9ubGluZWFyKTsKIAlzcGluX2xvY2tfaW5pdCgmaW5vZGUtPmlfbG9jayk7CiAJaV9zaXplX29yZGVyZWRfaW5pdChpbm9kZSk7CisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyk7CisJc2VtYV9pbml0KCZpbm9kZS0+aW5vdGlmeV9zZW0sIDEpOworI2VuZGlmCiB9CiAKIEVYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9vbmNlKTsKQEAgLTI4Miw2ICsyODcsMTMgQEAKIAkJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAkJY2xlYXJfaW5vZGUoaW5vZGUpOworCisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQl3YWtlX3VwX2lub2RlKGlub2RlKTsKIAkJZGVzdHJveV9pbm9kZShpbm9kZSk7CiAJCW5yX2Rpc3Bvc2VkKys7CiAJfQpAQCAtMzE3LDggKzMyOSw2IEBACiAJCWlub2RlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTsKIAkJaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKGlub2RlKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7Ci0JCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7Ci0JCQlsaXN0X2RlbCgmaW5vZGUtPmlfc2JfbGlzdCk7CiAJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsIGRpc3Bvc2UpOwogCQkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOwogCQkJY291bnQrKzsKQEAgLTM0Niw2ICszNTYsNyBAQAogCiAJZG93bigmaXBydW5lX3NlbSk7CiAJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpbm90aWZ5X3VubW91bnRfaW5vZGVzKCZzYi0+c19pbm9kZXMpOwogCWJ1c3kgPSBpbnZhbGlkYXRlX2xpc3QoJnNiLT5zX2lub2RlcywgJnRocm93X2F3YXkpOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKIApAQCAtNDM5LDggKzQ1MCw2IEBACiAJCQlpZiAoIWNhbl91bnVzZShpbm9kZSkpCiAJCQkJY29udGludWU7CiAJCX0KLQkJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOwotCQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9zYl9saXN0KTsKIAkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmZnJlZWFibGUpOwogCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0ZSRUVJTkc7CiAJCW5yX3BydW5lZCsrOwpAQCAtNzQ4LDYgKzc1Nyw3IEBACiAgKiBAaGVhZDogICAgICAgdGhlIGhlYWQgb2YgdGhlIGxpc3QgdG8gc2VhcmNoCiAgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKICAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QKKyAqIEB3YWl0OglpZiB0cnVlIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBiZSB1bmxvY2tlZCwgaWYgZmFsc2UgZG8gbm90CiAgKgogICogaWZpbmQoKSBzZWFyY2hlcyBmb3IgdGhlIGlub2RlIHNwZWNpZmllZCBieSBAZGF0YSBpbiB0aGUgaW5vZGUKICAqIGNhY2hlLiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiBpZmluZF9mYXN0KCkgZm9yIGZpbGUgc3lzdGVtcyB3aGVyZQpAQCAtNzYyLDcgKzc3Miw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICppZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksCi0JCXZvaWQgKmRhdGEpCisJCXZvaWQgKmRhdGEsIGNvbnN0IGludCB3YWl0KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKQEAgLTc3MSw3ICs3ODEsOCBAQAogCWlmIChpbm9kZSkgewogCQlfX2lnZXQoaW5vZGUpOwogCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Ci0JCXdhaXRfb25faW5vZGUoaW5vZGUpOworCQlpZiAobGlrZWx5KHdhaXQpKQorCQkJd2FpdF9vbl9pbm9kZShpbm9kZSk7CiAJCXJldHVybiBpbm9kZTsKIAl9CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwpAQCAtODExLDcgKzgyMiw3IEBACiB9CiAKIC8qKgotICogaWxvb2t1cDUgLSBzZWFyY2ggZm9yIGFuIGlub2RlIGluIHRoZSBpbm9kZSBjYWNoZQorICogaWxvb2t1cDVfbm93YWl0IC0gc2VhcmNoIGZvciBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgY2FjaGUKICAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIGZpbGUgc3lzdGVtIHRvIHNlYXJjaAogICogQGhhc2h2YWw6CWhhc2ggdmFsdWUgKHVzdWFsbHkgaW5vZGUgbnVtYmVyKSB0byBzZWFyY2ggZm9yCiAgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKQEAgLTgyMyw3ICs4MzQsMzggQEAKICAqIGlkZW50aWZpY2F0aW9uIG9mIGFuIGlub2RlLgogICoKICAqIElmIHRoZSBpbm9kZSBpcyBpbiB0aGUgY2FjaGUsIHRoZSBpbm9kZSBpcyByZXR1cm5lZCB3aXRoIGFuIGluY3JlbWVudGVkCi0gKiByZWZlcmVuY2UgY291bnQuCisgKiByZWZlcmVuY2UgY291bnQuICBOb3RlLCB0aGUgaW5vZGUgbG9jayBpcyBub3Qgd2FpdGVkIHVwb24gc28geW91IGhhdmUgdG8gYmUKKyAqIHZlcnkgY2FyZWZ1bCB3aGF0IHlvdSBkbyB3aXRoIHRoZSByZXR1cm5lZCBpbm9kZS4gIFlvdSBwcm9iYWJseSBzaG91bGQgYmUKKyAqIHVzaW5nIGlsb29rdXA1KCkgaW5zdGVhZC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBOb3RlLCBAdGVzdCBpcyBjYWxsZWQgd2l0aCB0aGUgaW5vZGVfbG9jayBoZWxkLCBzbyBjYW4ndCBzbGVlcC4KKyAqLworc3RydWN0IGlub2RlICppbG9va3VwNV9ub3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBoYXNodmFsLAorCQlpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9IGlub2RlX2hhc2h0YWJsZSArIGhhc2goc2IsIGhhc2h2YWwpOworCisJcmV0dXJuIGlmaW5kKHNiLCBoZWFkLCB0ZXN0LCBkYXRhLCAwKTsKK30KKworRVhQT1JUX1NZTUJPTChpbG9va3VwNV9ub3dhaXQpOworCisvKioKKyAqIGlsb29rdXA1IC0gc2VhcmNoIGZvciBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgY2FjaGUKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIGZpbGUgc3lzdGVtIHRvIHNlYXJjaAorICogQGhhc2h2YWw6CWhhc2ggdmFsdWUgKHVzdWFsbHkgaW5vZGUgbnVtYmVyKSB0byBzZWFyY2ggZm9yCisgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKKyAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QKKyAqCisgKiBpbG9va3VwNSgpIHVzZXMgaWZpbmQoKSB0byBzZWFyY2ggZm9yIHRoZSBpbm9kZSBzcGVjaWZpZWQgYnkgQGhhc2h2YWwgYW5kCisgKiBAZGF0YSBpbiB0aGUgaW5vZGUgY2FjaGUuIFRoaXMgaXMgYSBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mIGlsb29rdXAoKSBmb3IKKyAqIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIG5vdCBzdWZmaWNpZW50IGZvciB1bmlxdWUKKyAqIGlkZW50aWZpY2F0aW9uIG9mIGFuIGlub2RlLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBpbiB0aGUgY2FjaGUsIHRoZSBpbm9kZSBsb2NrIGlzIHdhaXRlZCB1cG9uIGFuZCB0aGUgaW5vZGUgaXMKKyAqIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQgcmVmZXJlbmNlIGNvdW50LgogICoKICAqIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgogICoKQEAgLTgzNCw3ICs4NzYsNyBAQAogewogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaGFzaHZhbCk7CiAKLQlyZXR1cm4gaWZpbmQoc2IsIGhlYWQsIHRlc3QsIGRhdGEpOworCXJldHVybiBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSwgMSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaWxvb2t1cDUpOwpAQCAtODkxLDcgKzkzMyw3IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JaW5vZGUgPSBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7CisJaW5vZGUgPSBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSwgMSk7CiAJaWYgKGlub2RlKQogCQlyZXR1cm4gaW5vZGU7CiAJLyoKQEAgLTEwNTIsNyArMTA5NCw3IEBACiAgKiBpbm9kZSB3aGVuIHRoZSB1c2FnZSBjb3VudCBkcm9wcyB0byB6ZXJvLCBhbmQKICAqIGlfbmxpbmsgaXMgemVyby4KICAqLwotc3RhdGljIHZvaWQgZ2VuZXJpY19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIGdlbmVyaWNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmICghaW5vZGUtPmlfbmxpbmspCiAJCWdlbmVyaWNfZGVsZXRlX2lub2RlKGlub2RlKTsKQEAgLTEwNjAsNiArMTEwMiw4IEBACiAJCWdlbmVyaWNfZm9yZ2V0X2lub2RlKGlub2RlKTsKIH0KIAorRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19kcm9wX2lub2RlKTsKKwogLyoKICAqIENhbGxlZCB3aGVuIHdlJ3JlIGRyb3BwaW5nIHRoZSBsYXN0IHJlZmVyZW5jZQogICogdG8gYW4gaW5vZGUuIApAQCAtMTI0MiwyOSArMTI4NiwyMSBAQAogfQogCiAvKgotICogSWYgd2UgdHJ5IHRvIGZpbmQgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGhhc2ggd2hpbGUgaXQgaXMgYmVpbmcgZGVsZXRlZCwgd2UKLSAqIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgZmlsZXN5c3RlbSBjb21wbGV0ZXMgaXRzIGRlbGV0aW9uIGJlZm9yZSByZXBvcnRpbmcKLSAqIHRoYXQgaXQgaXNuJ3QgZm91bmQuICBUaGlzIGlzIGJlY2F1c2UgaWdldCB3aWxsIGltbWVkaWF0ZWx5IGNhbGwKLSAqIC0+cmVhZF9pbm9kZSwgYW5kIHdlIHdhbnQgdG8gYmUgc3VyZSB0aGF0IGV2aWRlbmNlIG9mIHRoZSBkZWxldGlvbiBpcyBmb3VuZAotICogYnkgLT5yZWFkX2lub2RlLgorICogSWYgd2UgdHJ5IHRvIGZpbmQgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGhhc2ggd2hpbGUgaXQgaXMgYmVpbmcKKyAqIGRlbGV0ZWQsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgZmlsZXN5c3RlbSBjb21wbGV0ZXMgaXRzCisgKiBkZWxldGlvbiBiZWZvcmUgcmVwb3J0aW5nIHRoYXQgaXQgaXNuJ3QgZm91bmQuICBUaGlzIGZ1bmN0aW9uIHdhaXRzCisgKiB1bnRpbCB0aGUgZGVsZXRpb24gX21pZ2h0XyBoYXZlIGNvbXBsZXRlZC4gIENhbGxlcnMgYXJlIHJlc3BvbnNpYmxlCisgKiB0byByZWNoZWNrIGlub2RlIHN0YXRlLgorICoKKyAqIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIElfTE9DSyBpcyBub3Qgc2V0IGluaXRpYWxseSwgYSBjYWxsIHRvCisgKiB3YWtlX3VwX2lub2RlKCkgYWZ0ZXIgcmVtb3ZpbmcgZnJvbSB0aGUgaGFzaCBsaXN0IHdpbGwgRFRSVC4KKyAqCiAgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGlub2RlX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgX193YWl0X29uX2ZyZWVpbmdfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CiAJREVGSU5FX1dBSVRfQklUKHdhaXQsICZpbm9kZS0+aV9zdGF0ZSwgX19JX0xPQ0spOwotCi0JLyoKLQkgKiBJX0ZSRUVJTkcgYW5kIElfQ0xFQVIgYXJlIGNsZWFyZWQgaW4gcHJvY2VzcyBjb250ZXh0IHVuZGVyCi0JICogaW5vZGVfbG9jaywgc28gd2UgaGF2ZSB0byBnaXZlIHRoZSB0YXNrcyB3aG8gd291bGQgY2xlYXIgdGhlbQotCSAqIGEgY2hhbmNlIHRvIHJ1biBhbmQgYWNxdWlyZSBpbm9kZV9sb2NrLgotCSAqLwotCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKSkgewotCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Ci0JCXlpZWxkKCk7Ci0JCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7Ci0JCXJldHVybjsKLQl9CiAJd3EgPSBiaXRfd2FpdHF1ZXVlKCZpbm9kZS0+aV9zdGF0ZSwgX19JX0xPQ0spOwogCXByZXBhcmVfdG9fd2FpdCh3cSwgJndhaXQud2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2lub3RpZnkuYyBiL2ZzL2lub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc1N2JlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaW5vdGlmeS5jCkBAIC0wLDAgKzEsMTAzNyBAQAorLyoKKyAqIGZzL2lub3RpZnkuYyAtIGlub2RlLWJhc2VkIGZpbGUgZXZlbnQgbm90aWZpY2F0aW9ucworICoKKyAqIEF1dGhvcnM6CisgKglKb2huIE1jQ3V0Y2hhbgk8dHRiQHRlbnRhY2xlLmRocy5vcmc+CisgKglSb2JlcnQgTG92ZQk8cm1sQG5vdmVsbC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEpvaG4gTWNDdXRjaGFuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKK3N0YXRpYyBhdG9taWNfdCBpbm90aWZ5X2Nvb2tpZTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqd2F0Y2hfY2FjaGVwOworc3RhdGljIGttZW1fY2FjaGVfdCAqZXZlbnRfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICppbm90aWZ5X21udDsKKworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYWJsZSB2aWEgL3Byb2Mvc3lzL2ZzL2lub3RpZnkvICovCitpbnQgaW5vdGlmeV9tYXhfdXNlcl9pbnN0YW5jZXM7CitpbnQgaW5vdGlmeV9tYXhfdXNlcl93YXRjaGVzOworaW50IGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHM7CisKKy8qCisgKiBMb2NrIG9yZGVyaW5nOgorICoKKyAqIGRlbnRyeS0+ZF9sb2NrICh1c2VkIHRvIGtlZXAgZF9tb3ZlKCkgYXdheSBmcm9tIGRlbnRyeS0+ZF9wYXJlbnQpCisgKiBpcHJ1bmVfc2VtIChzeW5jaHJvbml6ZSBzaHJpbmtfaWNhY2hlX21lbW9yeSgpKQorICogCWlub2RlX2xvY2sgKHByb3RlY3RzIHRoZSBzdXBlcl9ibG9jay0+c19pbm9kZXMgbGlzdCkKKyAqIAlpbm9kZS0+aW5vdGlmeV9zZW0gKHByb3RlY3RzIGlub2RlLT5pbm90aWZ5X3dhdGNoZXMgYW5kIHdhdGNoZXMtPmlfbGlzdCkKKyAqIAkJaW5vdGlmeV9kZXYtPnNlbSAocHJvdGVjdHMgaW5vdGlmeV9kZXZpY2UgYW5kIHdhdGNoZXMtPmRfbGlzdCkKKyAqLworCisvKgorICogTGlmZXRpbWVzIG9mIHRoZSB0aHJlZSBtYWluIGRhdGEgc3RydWN0dXJlcy0taW5vdGlmeV9kZXZpY2UsIGlub2RlLCBhbmQKKyAqIGlub3RpZnlfd2F0Y2gtLWFyZSBtYW5hZ2VkIGJ5IHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBpbm90aWZ5X2RldmljZTogTGlmZXRpbWUgaXMgZnJvbSBvcGVuIHVudGlsIHJlbGVhc2UuICBBZGRpdGlvbmFsIHJlZmVyZW5jZXMKKyAqIGNhbiBidW1wIHRoZSBjb3VudCB2aWEgZ2V0X2lub3RpZnlfZGV2KCkgYW5kIGRyb3AgdGhlIGNvdW50IHZpYQorICogcHV0X2lub3RpZnlfZGV2KCkuCisgKgorICogaW5vdGlmeV93YXRjaDogTGlmZXRpbWUgaXMgZnJvbSBjcmVhdGVfd2F0Y2goKSB0byBkZXN0b3J5X3dhdGNoKCkuCisgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY2FuIGJ1bXAgdGhlIGNvdW50IHZpYSBnZXRfaW5vdGlmeV93YXRjaCgpIGFuZCBkcm9wCisgKiB0aGUgY291bnQgdmlhIHB1dF9pbm90aWZ5X3dhdGNoKCkuCisgKgorICogaW5vZGU6IFBpbm5lZCBzbyBsb25nIGFzIHRoZSBpbm9kZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB3YXRjaCwgZnJvbQorICogY3JlYXRlX3dhdGNoKCkgdG8gcHV0X2lub3RpZnlfd2F0Y2goKS4KKyAqLworCisvKgorICogc3RydWN0IGlub3RpZnlfZGV2aWNlIC0gcmVwcmVzZW50cyBhbiBvcGVuIGluc3RhbmNlIG9mIGFuIGlub3RpZnkgZGV2aWNlCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5IHRoZSBzZW1hcGhvcmUgJ3NlbScuCisgKi8KK3N0cnVjdCBpbm90aWZ5X2RldmljZSB7CisJd2FpdF9xdWV1ZV9oZWFkX3QgCXdxOwkJLyogd2FpdCBxdWV1ZSBmb3IgaS9vICovCisJc3RydWN0IGlkcgkJaWRyOwkJLyogaWRyIG1hcHBpbmcgd2QgLT4gd2F0Y2ggKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJCS8qIHByb3RlY3RzIHRoaXMgYmFkIGJveSAqLworCXN0cnVjdCBsaXN0X2hlYWQgCWV2ZW50czsJCS8qIGxpc3Qgb2YgcXVldWVkIGV2ZW50cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJd2F0Y2hlczsJLyogbGlzdCBvZiB3YXRjaGVzICovCisJYXRvbWljX3QJCWNvdW50OwkJLyogcmVmZXJlbmNlIGNvdW50ICovCisJc3RydWN0IHVzZXJfc3RydWN0CSp1c2VyOwkJLyogdXNlciB3aG8gb3BlbmVkIHRoaXMgZGV2ICovCisJdW5zaWduZWQgaW50CQlxdWV1ZV9zaXplOwkvKiBzaXplIG9mIHRoZSBxdWV1ZSAoYnl0ZXMpICovCisJdW5zaWduZWQgaW50CQlldmVudF9jb3VudDsJLyogbnVtYmVyIG9mIHBlbmRpbmcgZXZlbnRzICovCisJdW5zaWduZWQgaW50CQltYXhfZXZlbnRzOwkvKiBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgKi8KK307CisKKy8qCisgKiBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgLSBBbiBpbm90aWZ5IGV2ZW50LCBvcmlnaW5hdGluZyBmcm9tIGEgd2F0Y2ggYW5kCisgKiBxdWV1ZWQgZm9yIHVzZXItc3BhY2UuICBBIGxpc3Qgb2YgdGhlc2UgaXMgYXR0YWNoZWQgdG8gZWFjaCBpbnN0YW5jZSBvZiB0aGUKKyAqIGRldmljZS4gIEluIHJlYWQoKSwgdGhpcyBsaXN0IGlzIHdhbGtlZCBhbmQgYWxsIGV2ZW50cyB0aGF0IGNhbiBmaXQgaW4gdGhlCisgKiBidWZmZXIgYXJlIHJldHVybmVkLgorICoKKyAqIFByb3RlY3RlZCBieSBkZXYtPnNlbSBvZiB0aGUgZGV2aWNlIGluIHdoaWNoIHdlIGFyZSBxdWV1ZWQuCisgKi8KK3N0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCB7CisJc3RydWN0IGlub3RpZnlfZXZlbnQJZXZlbnQ7CS8qIHRoZSB1c2VyLXNwYWNlIGV2ZW50ICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsJLyogZW50cnkgaW4gaW5vdGlmeV9kZXZpY2UncyBsaXN0ICovCisJY2hhcgkJCSpuYW1lOwkvKiBmaWxlbmFtZSwgaWYgYW55ICovCit9OworCisvKgorICogc3RydWN0IGlub3RpZnlfd2F0Y2ggLSByZXByZXNlbnRzIGEgd2F0Y2ggcmVxdWVzdCBvbiBhIHNwZWNpZmljIGlub2RlCisgKgorICogZF9saXN0IGlzIHByb3RlY3RlZCBieSBkZXYtPnNlbSBvZiB0aGUgYXNzb2NpYXRlZCB3YXRjaC0+ZGV2LgorICogaV9saXN0IGFuZCBtYXNrIGFyZSBwcm90ZWN0ZWQgYnkgaW5vZGUtPmlub3RpZnlfc2VtIG9mIHRoZSBhc3NvY2lhdGVkIGlub2RlLgorICogZGV2LCBpbm9kZSwgYW5kIHdkIGFyZSBuZXZlciB3cml0dGVuIHRvIG9uY2UgdGhlIHdhdGNoIGlzIGNyZWF0ZWQuCisgKi8KK3N0cnVjdCBpbm90aWZ5X3dhdGNoIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRfbGlzdDsJLyogZW50cnkgaW4gaW5vdGlmeV9kZXZpY2UncyBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlpX2xpc3Q7CS8qIGVudHJ5IGluIGlub2RlJ3MgbGlzdCAqLworCWF0b21pY190CQljb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJc3RydWN0IGlub3RpZnlfZGV2aWNlCSpkZXY7CS8qIGFzc29jaWF0ZWQgZGV2aWNlICovCisJc3RydWN0IGlub2RlCQkqaW5vZGU7CS8qIGFzc29jaWF0ZWQgaW5vZGUgKi8KKwlzMzIgCQkJd2Q7CS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwl1MzIJCQltYXNrOwkvKiBldmVudCBtYXNrIGZvciB0aGlzIHdhdGNoICovCit9OworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKK3N0YXRpYyBpbnQgemVybzsKKworY3RsX3RhYmxlIGlub3RpZnlfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IElOT1RJRllfTUFYX1VTRVJfSU5TVEFOQ0VTLAorCQkucHJvY25hbWUJPSAibWF4X3VzZXJfaW5zdGFuY2VzIiwKKwkJLmRhdGEJCT0gJmlub3RpZnlfbWF4X3VzZXJfaW5zdGFuY2VzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmemVybywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gSU5PVElGWV9NQVhfVVNFUl9XQVRDSEVTLAorCQkucHJvY25hbWUJPSAibWF4X3VzZXJfd2F0Y2hlcyIsCisJCS5kYXRhCQk9ICZpbm90aWZ5X21heF91c2VyX3dhdGNoZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZ6ZXJvLCAKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gSU5PVElGWV9NQVhfUVVFVUVEX0VWRU5UUywKKwkJLnByb2NuYW1lCT0gIm1heF9xdWV1ZWRfZXZlbnRzIiwKKwkJLmRhdGEJCT0gJmlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsIAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywgCisJCS5leHRyYTEJCT0gJnplcm8KKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9pbm90aWZ5X2RldihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pbm90aWZ5X2RldihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2LT5jb3VudCkpIHsKKwkJYXRvbWljX2RlYygmZGV2LT51c2VyLT5pbm90aWZ5X2RldnMpOworCQlmcmVlX3VpZChkZXYtPnVzZXIpOworCQlrZnJlZShkZXYpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9pbm90aWZ5X3dhdGNoKHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCkKK3sKKwlhdG9taWNfaW5jKCZ3YXRjaC0+Y291bnQpOworfQorCisvKgorICogcHV0X2lub3RpZnlfd2F0Y2ggLSBkZWNyZW1lbnRzIHRoZSByZWYgY291bnQgb24gYSBnaXZlbiB3YXRjaC4gIGNsZWFucyB1cAorICogdGhlIHdhdGNoIGFuZCBpdHMgcmVmZXJlbmNlcyBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2lub3RpZnlfd2F0Y2goc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ3YXRjaC0+Y291bnQpKSB7CisJCXB1dF9pbm90aWZ5X2Rldih3YXRjaC0+ZGV2KTsKKwkJaXB1dCh3YXRjaC0+aW5vZGUpOworCQlrbWVtX2NhY2hlX2ZyZWUod2F0Y2hfY2FjaGVwLCB3YXRjaCk7CisJfQorfQorCisvKgorICoga2VybmVsX2V2ZW50IC0gY3JlYXRlIGEgbmV3IGtlcm5lbCBldmVudCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKiBrZXJuZWxfZXZlbnQoczMyIHdkLCB1MzIgbWFzaywgdTMyIGNvb2tpZSwKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudDsKKworCWtldmVudCA9IGttZW1fY2FjaGVfYWxsb2MoZXZlbnRfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWtldmVudCkpCisJCXJldHVybiBOVUxMOworCisJLyogd2UgaGFuZCB0aGlzIG91dCB0byB1c2VyLXNwYWNlLCBzbyB6ZXJvIGl0IGp1c3QgaW4gY2FzZSAqLworCW1lbXNldCgma2V2ZW50LT5ldmVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSk7CisKKwlrZXZlbnQtPmV2ZW50LndkID0gd2Q7CisJa2V2ZW50LT5ldmVudC5tYXNrID0gbWFzazsKKwlrZXZlbnQtPmV2ZW50LmNvb2tpZSA9IGNvb2tpZTsKKworCUlOSVRfTElTVF9IRUFEKCZrZXZlbnQtPmxpc3QpOworCisJaWYgKG5hbWUpIHsKKwkJc2l6ZV90IGxlbiwgcmVtLCBldmVudF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KTsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHBhZCB0aGUgZmlsZW5hbWUgc28gYXMgdG8gcHJvcGVybHkgYWxpZ24gYW4KKwkJICogYXJyYXkgb2YgaW5vdGlmeV9ldmVudCBzdHJ1Y3R1cmVzLiAgQmVjYXVzZSB0aGUgc3RydWN0dXJlIGlzCisJCSAqIHNtYWxsIGFuZCB0aGUgY29tbW9uIGNhc2UgaXMgYSBzbWFsbCBmaWxlbmFtZSwgd2UganVzdCByb3VuZAorCQkgKiB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgc3RydWN0dXJlJ3Mgc2l6ZW9mLiAgVGhpcyBpcworCQkgKiBzaW1wbGUgYW5kIHNhZmUgZm9yIGFsbCBhcmNoaXRlY3R1cmVzLgorCQkgKi8KKwkJbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwkJcmVtID0gZXZlbnRfc2l6ZSAtIGxlbjsKKwkJaWYgKGxlbiA+IGV2ZW50X3NpemUpIHsKKwkJCXJlbSA9IGV2ZW50X3NpemUgLSAobGVuICUgZXZlbnRfc2l6ZSk7CisJCQlpZiAobGVuICUgZXZlbnRfc2l6ZSA9PSAwKQorCQkJCXJlbSA9IDA7CisJCX0KKworCQlrZXZlbnQtPm5hbWUgPSBrbWFsbG9jKGxlbiArIHJlbSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSgha2V2ZW50LT5uYW1lKSkgeworCQkJa21lbV9jYWNoZV9mcmVlKGV2ZW50X2NhY2hlcCwga2V2ZW50KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW1lbWNweShrZXZlbnQtPm5hbWUsIG5hbWUsIGxlbik7CisJCWlmIChyZW0pCisJCQltZW1zZXQoa2V2ZW50LT5uYW1lICsgbGVuLCAwLCByZW0pOwkJCisJCWtldmVudC0+ZXZlbnQubGVuID0gbGVuICsgcmVtOworCX0gZWxzZSB7CisJCWtldmVudC0+ZXZlbnQubGVuID0gMDsKKwkJa2V2ZW50LT5uYW1lID0gTlVMTDsKKwl9CisKKwlyZXR1cm4ga2V2ZW50OworfQorCisvKgorICogaW5vdGlmeV9kZXZfZ2V0X2V2ZW50IC0gcmV0dXJuIHRoZSBuZXh0IGV2ZW50IGluIHRoZSBnaXZlbiBkZXYncyBxdWV1ZQorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5zZW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICoKK2lub3RpZnlfZGV2X2dldF9ldmVudChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShkZXYtPmV2ZW50cy5uZXh0LCBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQsIGxpc3QpOworfQorCisvKgorICogaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQgLSBhZGQgYSBuZXcgZXZlbnQgdG8gdGhlIGdpdmVuIGRldmljZQorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5zZW0uICBDYW4gc2xlZXAgKGNhbGxzIGtlcm5lbF9ldmVudCgpKS4KKyAqLworc3RhdGljIHZvaWQgaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgdTMyIG1hc2ssCisJCQkJICAgIHUzMiBjb29raWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQsICpsYXN0OworCisJLyogY29hbGVzY2luZzogZHJvcCB0aGlzIGV2ZW50IGlmIGl0IGlzIGEgZHVwZSBvZiB0aGUgcHJldmlvdXMgKi8KKwlsYXN0ID0gaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KGRldik7CisJaWYgKGxhc3QgJiYgbGFzdC0+ZXZlbnQubWFzayA9PSBtYXNrICYmIGxhc3QtPmV2ZW50LndkID09IHdhdGNoLT53ZCAmJgorCQkJbGFzdC0+ZXZlbnQuY29va2llID09IGNvb2tpZSkgeworCQljb25zdCBjaGFyICpsYXN0bmFtZSA9IGxhc3QtPm5hbWU7CisKKwkJaWYgKCFuYW1lICYmICFsYXN0bmFtZSkKKwkJCXJldHVybjsKKwkJaWYgKG5hbWUgJiYgbGFzdG5hbWUgJiYgIXN0cmNtcChsYXN0bmFtZSwgbmFtZSkpCisJCQlyZXR1cm47CisJfQorCisJLyogdGhlIHF1ZXVlIG92ZXJmbG93ZWQgYW5kIHdlIGFscmVhZHkgc2VudCB0aGUgUV9PVkVSRkxPVyBldmVudCAqLworCWlmICh1bmxpa2VseShkZXYtPmV2ZW50X2NvdW50ID4gZGV2LT5tYXhfZXZlbnRzKSkKKwkJcmV0dXJuOworCisJLyogaWYgdGhlIHF1ZXVlIG92ZXJmbG93cywgd2UgbmVlZCB0byBub3RpZnkgdXNlciBzcGFjZSAqLworCWlmICh1bmxpa2VseShkZXYtPmV2ZW50X2NvdW50ID09IGRldi0+bWF4X2V2ZW50cykpCisJCWtldmVudCA9IGtlcm5lbF9ldmVudCgtMSwgSU5fUV9PVkVSRkxPVywgY29va2llLCBOVUxMKTsKKwllbHNlCisJCWtldmVudCA9IGtlcm5lbF9ldmVudCh3YXRjaC0+d2QsIG1hc2ssIGNvb2tpZSwgbmFtZSk7CisKKwlpZiAodW5saWtlbHkoIWtldmVudCkpCisJCXJldHVybjsKKworCS8qIHF1ZXVlIHRoZSBldmVudCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyAqLworCWRldi0+ZXZlbnRfY291bnQrKzsKKwlkZXYtPnF1ZXVlX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSArIGtldmVudC0+ZXZlbnQubGVuOworCWxpc3RfYWRkX3RhaWwoJmtldmVudC0+bGlzdCwgJmRldi0+ZXZlbnRzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3EpOworfQorCisvKgorICogcmVtb3ZlX2tldmVudCAtIGNsZWFucyB1cCBhbmQgdWx0aW1hdGVseSBmcmVlcyB0aGUgZ2l2ZW4ga2V2ZW50CisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPnNlbS4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2tldmVudChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQpCit7CisJbGlzdF9kZWwoJmtldmVudC0+bGlzdCk7CisKKwlkZXYtPmV2ZW50X2NvdW50LS07CisJZGV2LT5xdWV1ZV9zaXplIC09IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBrZXZlbnQtPmV2ZW50LmxlbjsKKworCWtmcmVlKGtldmVudC0+bmFtZSk7CisJa21lbV9jYWNoZV9mcmVlKGV2ZW50X2NhY2hlcCwga2V2ZW50KTsKK30KKworLyoKKyAqIGlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUgLSBkZXN0cm95IGFuIGV2ZW50IG9uIHRoZSBnaXZlbiBkZXZpY2UKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+c2VtLgorICovCitzdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpKSB7CisJCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OworCQlrZXZlbnQgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsKKwkJcmVtb3ZlX2tldmVudChkZXYsIGtldmVudCk7CisJfQorfQorCisvKgorICogaW5vdGlmeV9kZXZfZ2V0X3dkIC0gcmV0dXJucyB0aGUgbmV4dCBXRCBmb3IgdXNlIGJ5IHRoZSBnaXZlbiBkZXYKKyAqCisgKiBDYWxsZXJzIG11c3QgaG9sZCBkZXYtPnNlbS4gIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IGlub3RpZnlfZGV2X2dldF93ZChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCkKK3sKKwlpbnQgcmV0OworCisJZG8geworCQlpZiAodW5saWtlbHkoIWlkcl9wcmVfZ2V0KCZkZXYtPmlkciwgR0ZQX0tFUk5FTCkpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldCA9IGlkcl9nZXRfbmV3KCZkZXYtPmlkciwgd2F0Y2gsICZ3YXRjaC0+d2QpOworCX0gd2hpbGUgKHJldCA9PSAtRUFHQUlOKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBmaW5kX2lub2RlIC0gcmVzb2x2ZSBhIHVzZXItZ2l2ZW4gcGF0aCB0byBhIHNwZWNpZmljIGlub2RlIGFuZCByZXR1cm4gYSBuZAorICovCitzdGF0aWMgaW50IGZpbmRfaW5vZGUoY29uc3QgY2hhciBfX3VzZXIgKmRpcm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gX191c2VyX3dhbGsoZGlybmFtZSwgTE9PS1VQX0ZPTExPVywgbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCS8qIHlvdSBjYW4gb25seSB3YXRjaCBhbiBpbm9kZSBpZiB5b3UgaGF2ZSByZWFkIHBlcm1pc3Npb25zIG9uIGl0ICovCisJZXJyb3IgPSBwZXJtaXNzaW9uKG5kLT5kZW50cnktPmRfaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKKwlpZiAoZXJyb3IpIAorCQlwYXRoX3JlbGVhc2UgKG5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBjcmVhdGVfd2F0Y2ggLSBjcmVhdGVzIGEgd2F0Y2ggb24gdGhlIGdpdmVuIGRldmljZS4KKyAqCisgKiBDYWxsZXJzIG11c3QgaG9sZCBkZXYtPnNlbS4gIENhbGxzIGlub3RpZnlfZGV2X2dldF93ZCgpIHNvIG1heSBzbGVlcC4KKyAqIEJvdGggJ2RldicgYW5kICdpbm9kZScgKGJ5IHdheSBvZiBuYW1laWRhdGEpIG5lZWQgdG8gYmUgcGlubmVkLgorICovCitzdGF0aWMgc3RydWN0IGlub3RpZnlfd2F0Y2ggKmNyZWF0ZV93YXRjaChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwKKwkJCQkJICB1MzIgbWFzaywgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7CisJaW50IHJldDsKKworCWlmIChhdG9taWNfcmVhZCgmZGV2LT51c2VyLT5pbm90aWZ5X3dhdGNoZXMpID49IGlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKKwl3YXRjaCA9IGttZW1fY2FjaGVfYWxsb2Mod2F0Y2hfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXdhdGNoKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXQgPSBpbm90aWZ5X2Rldl9nZXRfd2QoZGV2LCB3YXRjaCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJa21lbV9jYWNoZV9mcmVlKHdhdGNoX2NhY2hlcCwgd2F0Y2gpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXdhdGNoLT5tYXNrID0gbWFzazsKKwlhdG9taWNfc2V0KCZ3YXRjaC0+Y291bnQsIDApOworCUlOSVRfTElTVF9IRUFEKCZ3YXRjaC0+ZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmd2F0Y2gtPmlfbGlzdCk7CisKKwkvKiBzYXZlIGEgcmVmZXJlbmNlIHRvIGRldmljZSBhbmQgYnVtcCB0aGUgY291bnQgdG8gbWFrZSBpdCBvZmZpY2lhbCAqLworCWdldF9pbm90aWZ5X2RldihkZXYpOworCXdhdGNoLT5kZXYgPSBkZXY7CisKKwkvKgorCSAqIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIGFuZCBidW1wIHRoZSByZWYgY291bnQgdG8gbWFrZSBpdAorCSAqIG9mZmljaWFsLiAgV2UgaG9sZCBhIHJlZmVyZW5jZSB0byBuYW1laWRhdGEsIHdoaWNoIG1ha2VzIHRoaXMgc2FmZS4KKwkgKi8KKwl3YXRjaC0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CisKKwkvKiBidW1wIG91ciBvd24gY291bnQsIGNvcnJlc3BvbmRpbmcgdG8gb3VyIGVudHJ5IGluIGRldi0+d2F0Y2hlcyAqLworCWdldF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKworCWF0b21pY19pbmMoJmRldi0+dXNlci0+aW5vdGlmeV93YXRjaGVzKTsKKworCXJldHVybiB3YXRjaDsKK30KKworLyoKKyAqIGlub3RpZnlfZmluZF9kZXYgLSBmaW5kIHRoZSB3YXRjaCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGlub2RlIGFuZCBkZXYKKyAqCisgKiBDYWxsZXJzIG11c3QgaG9sZCBpbm9kZS0+aW5vdGlmeV9zZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqaW5vZGVfZmluZF9kZXYoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzLCBpX2xpc3QpIHsKKwkJaWYgKHdhdGNoLT5kZXYgPT0gZGV2KQorCQkJcmV0dXJuIHdhdGNoOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogcmVtb3ZlX3dhdGNoX25vX2V2ZW50IC0gcmVtb3ZlX3dhdGNoKCkgd2l0aG91dCB0aGUgSU5fSUdOT1JFRCBldmVudC4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX3dhdGNoX25vX2V2ZW50KHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwKKwkJCQkgIHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCWxpc3RfZGVsKCZ3YXRjaC0+aV9saXN0KTsKKwlsaXN0X2RlbCgmd2F0Y2gtPmRfbGlzdCk7CisKKwlhdG9taWNfZGVjKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7CisJaWRyX3JlbW92ZSgmZGV2LT5pZHIsIHdhdGNoLT53ZCk7CisJcHV0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworfQorCisvKgorICogcmVtb3ZlX3dhdGNoIC0gUmVtb3ZlIGEgd2F0Y2ggZnJvbSBib3RoIHRoZSBkZXZpY2UgYW5kIHRoZSBpbm9kZS4gIFNlbmRzCisgKiB0aGUgSU5fSUdOT1JFRCBldmVudCB0byB0aGUgZ2l2ZW4gZGV2aWNlIHNpZ25pZnlpbmcgdGhhdCB0aGUgaW5vZGUgaXMgbm8KKyAqIGxvbmdlciB3YXRjaGVkLgorICoKKyAqIENhbGxlcnMgbXVzdCBob2xkIGJvdGggaW5vZGUtPmlub3RpZnlfc2VtIGFuZCBkZXYtPnNlbS4gIFdlIGRyb3AgYQorICogcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIFRoZSBpbm9kZSBpcyBub3QgaXB1dCgpIHNvIGFzIHRvIHJlbWFpbiBhdG9taWMuICBJZiB0aGUgaW5vZGUgbmVlZHMgdG8gYmUKKyAqIGlwdXQoKSwgdGhlIGNhbGwgcmV0dXJucyBvbmUuICBPdGhlcndpc2UsIGl0IHJldHVybnMgemVyby4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX3dhdGNoKHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCxzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChkZXYsIHdhdGNoLCBJTl9JR05PUkVELCAwLCBOVUxMKTsKKwlyZW1vdmVfd2F0Y2hfbm9fZXZlbnQod2F0Y2gsIGRldik7Cit9CisKKy8qCisgKiBpbm90aWZ5X2lub2RlX3dhdGNoZWQgLSByZXR1cm5zIG5vbnplcm8gaWYgdGhlcmUgYXJlIHdhdGNoZXMgb24gdGhpcyBpbm9kZQorICogYW5kIHplcm8gb3RoZXJ3aXNlLiAgV2UgY2FsbCB0aGlzIGxvY2tsZXNzLCB3ZSBkbyBub3QgY2FyZSBpZiB3ZSByYWNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpbm90aWZ5X2lub2RlX3dhdGNoZWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmlub2RlLT5pbm90aWZ5X3dhdGNoZXMpOworfQorCisvKiBLZXJuZWwgQVBJICovCisKKy8qKgorICogaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudCAtIHF1ZXVlIGFuIGV2ZW50IHRvIGFsbCB3YXRjaGVzIG9uIHRoaXMgaW5vZGUKKyAqIEBpbm9kZTogaW5vZGUgZXZlbnQgaXMgb3JpZ2luYXRpbmcgZnJvbQorICogQG1hc2s6IGV2ZW50IG1hc2sgZGVzY3JpYmluZyB0aGlzIGV2ZW50CisgKiBAY29va2llOiBjb29raWUgZm9yIHN5bmNocm9uaXphdGlvbiwgb3IgemVybworICogQG5hbWU6IGZpbGVuYW1lLCBpZiBhbnkKKyAqLwordm9pZCBpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBtYXNrLCB1MzIgY29va2llLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCAqbmV4dDsKKworCWlmICghaW5vdGlmeV9pbm9kZV93YXRjaGVkKGlub2RlKSkKKwkJcmV0dXJuOworCisJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG5leHQsICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzLCBpX2xpc3QpIHsKKwkJdTMyIHdhdGNoX21hc2sgPSB3YXRjaC0+bWFzazsKKwkJaWYgKHdhdGNoX21hc2sgJiBtYXNrKSB7CisJCQlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IHdhdGNoLT5kZXY7CisJCQlnZXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisJCQlkb3duKCZkZXYtPnNlbSk7CisJCQlpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChkZXYsIHdhdGNoLCBtYXNrLCBjb29raWUsIG5hbWUpOworCQkJaWYgKHdhdGNoX21hc2sgJiBJTl9PTkVTSE9UKQorCQkJCXJlbW92ZV93YXRjaF9ub19ldmVudCh3YXRjaCwgZGV2KTsKKwkJCXVwKCZkZXYtPnNlbSk7CisJCQlwdXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisJCX0KKwl9CisJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KTsKKworLyoqCisgKiBpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQgLSBxdWV1ZSBhbiBldmVudCB0byBhIGRlbnRyeSdzIHBhcmVudAorICogQGRlbnRyeTogdGhlIGRlbnRyeSBpbiBxdWVzdGlvbiwgd2UgcXVldWUgYWdhaW5zdCB0aGlzIGRlbnRyeSdzIHBhcmVudAorICogQG1hc2s6IGV2ZW50IG1hc2sgZGVzY3JpYmluZyB0aGlzIGV2ZW50CisgKiBAY29va2llOiBjb29raWUgZm9yIHN5bmNocm9uaXphdGlvbiwgb3IgemVybworICogQG5hbWU6IGZpbGVuYW1lLCBpZiBhbnkKKyAqLwordm9pZCBpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgbWFzaywKKwkJCQkgICAgICAgdTMyIGNvb2tpZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaW5vZGUgPSBwYXJlbnQtPmRfaW5vZGU7CisKKwlpZiAoaW5vdGlmeV9pbm9kZV93YXRjaGVkKGlub2RlKSkgeworCQlkZ2V0KHBhcmVudCk7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIGNvb2tpZSwgbmFtZSk7CisJCWRwdXQocGFyZW50KTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudCk7CisKKy8qKgorICogaW5vdGlmeV9nZXRfY29va2llIC0gcmV0dXJuIGEgdW5pcXVlIGNvb2tpZSBmb3IgdXNlIGluIHN5bmNocm9uaXppbmcgZXZlbnRzLgorICovCit1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpbm90aWZ5X2Nvb2tpZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2dldF9jb29raWUpOworCisvKioKKyAqIGlub3RpZnlfdW5tb3VudF9pbm9kZXMgLSBhbiBzYiBpcyB1bm1vdW50aW5nLiAgaGFuZGxlIGFueSB3YXRjaGVkIGlub2Rlcy4KKyAqIEBsaXN0OiBsaXN0IG9mIGlub2RlcyBiZWluZyB1bm1vdW50ZWQgKHNiLT5zX2lub2RlcykKKyAqCisgKiBDYWxsZWQgd2l0aCBpbm9kZV9sb2NrIGhlbGQsIHByb3RlY3RpbmcgdGhlIHVubW91bnRpbmcgc3VwZXIgYmxvY2sncyBsaXN0CisgKiBvZiBpbm9kZXMsIGFuZCB3aXRoIGlwcnVuZV9zZW0gaGVsZCwga2VlcGluZyBzaHJpbmtfaWNhY2hlX21lbW9yeSgpIGF0IGJheS4KKyAqIFdlIHRlbXBvcmFyaWx5IGRyb3AgaW5vZGVfbG9jaywgaG93ZXZlciwgYW5kIENBTiBibG9jay4KKyAqLwordm9pZCBpbm90aWZ5X3VubW91bnRfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IGlub2RlICppbm9kZSwgKm5leHRfaSwgKm5lZWRfaXB1dCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5vZGUsIG5leHRfaSwgbGlzdCwgaV9zYl9saXN0KSB7CisJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgKm5leHRfdzsKKwkJc3RydWN0IGlub2RlICpuZWVkX2lwdXRfdG1wOworCQlzdHJ1Y3QgbGlzdF9oZWFkICp3YXRjaGVzOworCisJCS8qCisJCSAqIElmIGlfY291bnQgaXMgemVybywgdGhlIGlub2RlIGNhbm5vdCBoYXZlIGFueSB3YXRjaGVzIGFuZAorCQkgKiBkb2luZyBhbiBfX2lnZXQvaXB1dCB3aXRoIE1TX0FDVElWRSBjbGVhciB3b3VsZCBhY3R1YWxseQorCQkgKiBldmljdCBhbGwgaW5vZGVzIHdpdGggemVybyBpX2NvdW50IGZyb20gaWNhY2hlIHdoaWNoIGlzCisJCSAqIHVubmVjZXNzYXJpbHkgdmlvbGVudCBhbmQgbWF5IGluIGZhY3QgYmUgaWxsZWdhbCB0byBkby4KKwkJICovCisJCWlmICghYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlIGNhbm5vdCBfX2lnZXQoKSBhbiBpbm9kZSBpbiBzdGF0ZSBJX0NMRUFSLCBJX0ZSRUVJTkcsIG9yCisJCSAqIElfV0lMTF9GUkVFIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSBieSB0aGF0IHBvaW50IHRoZSBpbm9kZQorCQkgKiBjYW5ub3QgaGF2ZSBhbnkgYXNzb2NpYXRlZCB3YXRjaGVzLgorCQkgKi8KKwkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfQ0xFQVIgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpCisJCQljb250aW51ZTsKKworCQluZWVkX2lwdXRfdG1wID0gbmVlZF9pcHV0OworCQluZWVkX2lwdXQgPSBOVUxMOworCQkvKiBJbiBjYXNlIHRoZSByZW1vdmVfd2F0Y2goKSBkcm9wcyBhIHJlZmVyZW5jZS4gKi8KKwkJaWYgKGlub2RlICE9IG5lZWRfaXB1dF90bXApCisJCQlfX2lnZXQoaW5vZGUpOworCQllbHNlCisJCQluZWVkX2lwdXRfdG1wID0gTlVMTDsKKwkJLyogSW4gY2FzZSB0aGUgZHJvcHBpbmcgb2YgYSByZWZlcmVuY2Ugd291bGQgbnVrZSBuZXh0X2kuICovCisJCWlmICgoJm5leHRfaS0+aV9zYl9saXN0ICE9IGxpc3QpICYmCisJCQkJYXRvbWljX3JlYWQoJm5leHRfaS0+aV9jb3VudCkgJiYKKwkJCQkhKG5leHRfaS0+aV9zdGF0ZSAmIChJX0NMRUFSIHwgSV9GUkVFSU5HIHwKKwkJCQkJSV9XSUxMX0ZSRUUpKSkgeworCQkJX19pZ2V0KG5leHRfaSk7CisJCQluZWVkX2lwdXQgPSBuZXh0X2k7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4gc2FmZWx5IGRyb3AgaW5vZGVfbG9jayBoZXJlIGJlY2F1c2Ugd2UgaG9sZAorCQkgKiByZWZlcmVuY2VzIG9uIGJvdGggaW5vZGUgYW5kIG5leHRfaS4gIEFsc28gbm8gbmV3IGlub2RlcworCQkgKiB3aWxsIGJlIGFkZGVkIHNpbmNlIHRoZSB1bW91bnQgaGFzIGJlZ3VuLiAgRmluYWxseSwKKwkJICogaXBydW5lX3NlbSBrZWVwcyBzaHJpbmtfaWNhY2hlX21lbW9yeSgpIGF3YXkuCisJCSAqLworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwkJaWYgKG5lZWRfaXB1dF90bXApCisJCQlpcHV0KG5lZWRfaXB1dF90bXApOworCisJCS8qIGZvciBlYWNoIHdhdGNoLCBzZW5kIElOX1VOTU9VTlQgYW5kIHRoZW4gcmVtb3ZlIGl0ICovCisJCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJCXdhdGNoZXMgPSAmaW5vZGUtPmlub3RpZnlfd2F0Y2hlczsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCBuZXh0X3csIHdhdGNoZXMsIGlfbGlzdCkgeworCQkJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSB3YXRjaC0+ZGV2OworCQkJZG93bigmZGV2LT5zZW0pOworCQkJaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQoZGV2LCB3YXRjaCwgSU5fVU5NT1VOVCwwLE5VTEwpOworCQkJcmVtb3ZlX3dhdGNoKHdhdGNoLCBkZXYpOworCQkJdXAoJmRldi0+c2VtKTsKKwkJfQorCQl1cCgmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwkJaXB1dChpbm9kZSk7CQkKKworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfdW5tb3VudF9pbm9kZXMpOworCisvKioKKyAqIGlub3RpZnlfaW5vZGVfaXNfZGVhZCAtIGFuIGlub2RlIGhhcyBiZWVuIGRlbGV0ZWQsIGNsZWFudXAgYW55IHdhdGNoZXMKKyAqIEBpbm9kZTogaW5vZGUgdGhhdCBpcyBhYm91dCB0byBiZSByZW1vdmVkCisgKi8KK3ZvaWQgaW5vdGlmeV9pbm9kZV9pc19kZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCAqbmV4dDsKKworCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCBuZXh0LCAmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcywgaV9saXN0KSB7CisJCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2ID0gd2F0Y2gtPmRldjsKKwkJZG93bigmZGV2LT5zZW0pOworCQlyZW1vdmVfd2F0Y2god2F0Y2gsIGRldik7CisJCXVwKCZkZXYtPnNlbSk7CisJfQorCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9pbm9kZV9pc19kZWFkKTsKKworLyogRGV2aWNlIEludGVyZmFjZSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGlub3RpZnlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT53cSwgd2FpdCk7CisJZG93bigmZGV2LT5zZW0pOworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpKQorCQlyZXQgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXVwKCZkZXYtPnNlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBpbm90aWZ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzaXplX3QgZXZlbnRfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGlub3RpZnlfZXZlbnQpOworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OworCWNoYXIgX191c2VyICpzdGFydDsKKwlpbnQgcmV0OworCURFRklORV9XQUlUKHdhaXQpOworCisJc3RhcnQgPSBidWY7CisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGV2ZW50czsKKworCQlwcmVwYXJlX3RvX3dhaXQoJmRldi0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWRvd24oJmRldi0+c2VtKTsKKwkJZXZlbnRzID0gIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKTsKKwkJdXAoJmRldi0+c2VtKTsKKwkJaWYgKGV2ZW50cykgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlmaW5pc2hfd2FpdCgmZGV2LT53cSwgJndhaXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkb3duKCZkZXYtPnNlbSk7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQ7CisKKwkJcmV0ID0gYnVmIC0gc3RhcnQ7CisJCWlmIChsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCisJCQlicmVhazsKKworCQlrZXZlbnQgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsKKwkJaWYgKGV2ZW50X3NpemUgKyBrZXZlbnQtPmV2ZW50LmxlbiA+IGNvdW50KQorCQkJYnJlYWs7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZrZXZlbnQtPmV2ZW50LCBldmVudF9zaXplKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZiArPSBldmVudF9zaXplOworCQljb3VudCAtPSBldmVudF9zaXplOworCisJCWlmIChrZXZlbnQtPm5hbWUpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrZXZlbnQtPm5hbWUsIGtldmVudC0+ZXZlbnQubGVuKSl7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ1ZiArPSBrZXZlbnQtPmV2ZW50LmxlbjsKKwkJCWNvdW50IC09IGtldmVudC0+ZXZlbnQubGVuOworCQl9CisKKwkJcmVtb3ZlX2tldmVudChkZXYsIGtldmVudCk7CisJfQorCXVwKCZkZXYtPnNlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlub3RpZnlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlnbm9yZWQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyoKKwkgKiBEZXN0cm95IGFsbCBvZiB0aGUgd2F0Y2hlcyBvbiB0aGlzIGRldmljZS4gIFVuZm9ydHVuYXRlbHksIG5vdCB2ZXJ5CisJICogcHJldHR5LiAgV2UgY2Fubm90IGRvIGEgc2ltcGxlIGl0ZXJhdGlvbiBvdmVyIHRoZSBsaXN0LCBiZWNhdXNlIHdlCisJICogZG8gbm90IGtub3cgdGhlIGlub2RlIHVudGlsIHdlIGl0ZXJhdGUgdG8gdGhlIHdhdGNoLiAgQnV0IHdlIG5lZWQgdG8KKwkgKiBob2xkIGlub2RlLT5pbm90aWZ5X3NlbSBiZWZvcmUgZGV2LT5zZW0uICBUaGUgZm9sbG93aW5nIHdvcmtzLgorCSAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqd2F0Y2hlczsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlkb3duKCZkZXYtPnNlbSk7CisJCXdhdGNoZXMgPSAmZGV2LT53YXRjaGVzOworCQlpZiAobGlzdF9lbXB0eSh3YXRjaGVzKSkgeworCQkJdXAoJmRldi0+c2VtKTsKKwkJCWJyZWFrOworCQl9CisJCXdhdGNoID0gbGlzdF9lbnRyeSh3YXRjaGVzLT5uZXh0LCBzdHJ1Y3QgaW5vdGlmeV93YXRjaCwgZF9saXN0KTsKKwkJZ2V0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCQl1cCgmZGV2LT5zZW0pOworCisJCWlub2RlID0gd2F0Y2gtPmlub2RlOworCQlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCQlkb3duKCZkZXYtPnNlbSk7CisJCXJlbW92ZV93YXRjaF9ub19ldmVudCh3YXRjaCwgZGV2KTsKKwkJdXAoJmRldi0+c2VtKTsKKwkJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJCXB1dF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwl9CisKKwkvKiBkZXN0cm95IGFsbCBvZiB0aGUgZXZlbnRzIG9uIHRoaXMgZGV2aWNlICovCisJZG93bigmZGV2LT5zZW0pOworCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpKQorCQlpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlKGRldik7CisJdXAoJmRldi0+c2VtKTsKKworCS8qIGZyZWUgdGhpcyBkZXZpY2U6IHRoZSBwdXQgbWF0Y2hpbmcgdGhlIGdldCBpbiBpbm90aWZ5X29wZW4oKSAqLworCXB1dF9pbm90aWZ5X2RldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbm90aWZ5X2lnbm9yZSAtIGhhbmRsZSB0aGUgSU5PVElGWV9JR05PUkUgaW9jdGwsIGFza2luZyB0aGF0IGEgZ2l2ZW4gd2QgYmUKKyAqIHJlbW92ZWQgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIENhbiBzbGVlcC4KKyAqLworc3RhdGljIGludCBpbm90aWZ5X2lnbm9yZShzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwgczMyIHdkKQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJZG93bigmZGV2LT5zZW0pOworCXdhdGNoID0gaWRyX2ZpbmQoJmRldi0+aWRyLCB3ZCk7CisJaWYgKHVubGlrZWx5KCF3YXRjaCkpIHsKKwkJdXAoJmRldi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWdldF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwlpbm9kZSA9IHdhdGNoLT5pbm9kZTsKKwl1cCgmZGV2LT5zZW0pOworCisJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwlkb3duKCZkZXYtPnNlbSk7CisKKwkvKiBtYWtlIHN1cmUgdGhhdCB3ZSBkaWQgbm90IHJhY2UgKi8KKwl3YXRjaCA9IGlkcl9maW5kKCZkZXYtPmlkciwgd2QpOworCWlmIChsaWtlbHkod2F0Y2gpKQorCQlyZW1vdmVfd2F0Y2god2F0Y2gsIGRldik7CisKKwl1cCgmZGV2LT5zZW0pOworCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCXB1dF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBpbm90aWZ5X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsKKwl2b2lkIF9fdXNlciAqcDsKKwlpbnQgcmV0ID0gLUVOT1RUWTsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlwID0gKHZvaWQgX191c2VyICopIGFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGSU9OUkVBRDoKKwkJcmV0ID0gcHV0X3VzZXIoZGV2LT5xdWV1ZV9zaXplLCAoaW50IF9fdXNlciAqKSBwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW5vdGlmeV9mb3BzID0geworCS5wb2xsICAgICAgICAgICA9IGlub3RpZnlfcG9sbCwKKwkucmVhZCAgICAgICAgICAgPSBpbm90aWZ5X3JlYWQsCisJLnJlbGVhc2UgICAgICAgID0gaW5vdGlmeV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGlub3RpZnlfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IGlub3RpZnlfaW9jdGwsCit9OworCithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OworCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKKwlpbnQgcmV0ID0gLUVOT1RUWTsKKwlpbnQgZmQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisKKwlmZCA9IGdldF91bnVzZWRfZmQoKTsKKwlpZiAoZmQgPCAwKSB7CisJCXJldCA9IGZkOworCQlnb3RvIG91dDsKKwl9CisKKwlmaWxwID0gZ2V0X2VtcHR5X2ZpbHAoKTsKKwlpZiAoIWZpbHApIHsKKwkJcHV0X3VudXNlZF9mZChmZCk7CisJCXJldCA9IC1FTkZJTEU7CisJCWdvdG8gb3V0OworCX0KKwlmaWxwLT5mX29wID0gJmlub3RpZnlfZm9wczsKKwlmaWxwLT5mX3Zmc21udCA9IG1udGdldChpbm90aWZ5X21udCk7CisJZmlscC0+Zl9kZW50cnkgPSBkZ2V0KGlub3RpZnlfbW50LT5tbnRfcm9vdCk7CisJZmlscC0+Zl9tYXBwaW5nID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxwLT5mX21vZGUgPSBGTU9ERV9SRUFEOworCWZpbHAtPmZfZmxhZ3MgPSBPX1JET05MWTsKKworCXVzZXIgPSBnZXRfdWlkKGN1cnJlbnQtPnVzZXIpOworCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZ1c2VyLT5pbm90aWZ5X2RldnMpID49IGlub3RpZnlfbWF4X3VzZXJfaW5zdGFuY2VzKSkgeworCQlyZXQgPSAtRU1GSUxFOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlub3RpZnlfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFkZXYpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZHJfaW5pdCgmZGV2LT5pZHIpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmV2ZW50cyk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+d2F0Y2hlcyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cSk7CisJc2VtYV9pbml0KCZkZXYtPnNlbSwgMSk7CisJZGV2LT5ldmVudF9jb3VudCA9IDA7CisJZGV2LT5xdWV1ZV9zaXplID0gMDsKKwlkZXYtPm1heF9ldmVudHMgPSBpbm90aWZ5X21heF9xdWV1ZWRfZXZlbnRzOworCWRldi0+dXNlciA9IHVzZXI7CisJYXRvbWljX3NldCgmZGV2LT5jb3VudCwgMCk7CisKKwlnZXRfaW5vdGlmeV9kZXYoZGV2KTsKKwlhdG9taWNfaW5jKCZ1c2VyLT5pbm90aWZ5X2RldnMpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZGV2OworCWZkX2luc3RhbGwgKGZkLCBmaWxwKTsKKwlyZXR1cm4gZmQ7CitvdXRfZXJyOgorCXB1dF91bnVzZWRfZmQgKGZkKTsKKwlwdXRfZmlscCAoZmlscCk7CisJZnJlZV91aWQodXNlcik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgsIHUzMiBtYXNrKQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgKm9sZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJaW50IHJldDsKKworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCXJldHVybiAtRUJBREY7CisKKwlkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlyZXQgPSBmaW5kX2lub2RlKChjb25zdCBjaGFyIF9fdXNlciopIHBhdGgsICZuZCk7CisJaWYgKHJldCkKKwkJZ290byBmcHV0X2FuZF9vdXQ7CisKKwkvKiBIZWxkIGluIHBsYWNlIGJ5IHJlZmVyZW5jZSBpbiBuZCAqLworCWlub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCisJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwlkb3duKCZkZXYtPnNlbSk7CisKKwkvKiBkb24ndCBsZXQgdXNlci1zcGFjZSBzZXQgaW52YWxpZCBiaXRzOiB3ZSBkb24ndCB3YW50IGZsYWdzIHNldCAqLworCW1hc2sgJj0gSU5fQUxMX0VWRU5UUzsKKwlpZiAoIW1hc2spIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBIYW5kbGUgdGhlIGNhc2Ugb2YgcmUtYWRkaW5nIGEgd2F0Y2ggb24gYW4gKGlub2RlLGRldikgcGFpciB0aGF0IHdlCisJICogYXJlIGFscmVhZHkgd2F0Y2hpbmcuICBXZSBqdXN0IHVwZGF0ZSB0aGUgbWFzayBhbmQgcmV0dXJuIGl0cyB3ZC4KKwkgKi8KKwlvbGQgPSBpbm9kZV9maW5kX2Rldihpbm9kZSwgZGV2KTsKKwlpZiAodW5saWtlbHkob2xkKSkgeworCQlvbGQtPm1hc2sgPSBtYXNrOworCQlyZXQgPSBvbGQtPndkOworCQlnb3RvIG91dDsKKwl9CisKKwl3YXRjaCA9IGNyZWF0ZV93YXRjaChkZXYsIG1hc2ssIGlub2RlKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHdhdGNoKSkpIHsKKwkJcmV0ID0gUFRSX0VSUih3YXRjaCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFkZCB0aGUgd2F0Y2ggdG8gdGhlIGRldmljZSdzIGFuZCB0aGUgaW5vZGUncyBsaXN0ICovCisJbGlzdF9hZGQoJndhdGNoLT5kX2xpc3QsICZkZXYtPndhdGNoZXMpOworCWxpc3RfYWRkKCZ3YXRjaC0+aV9saXN0LCAmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyk7CisJcmV0ID0gd2F0Y2gtPndkOworb3V0OgorCXBhdGhfcmVsZWFzZSAoJm5kKTsKKwl1cCgmZGV2LT5zZW0pOworCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworZnB1dF9hbmRfb3V0OgorCWZwdXQoZmlscCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgdTMyIHdkKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OworCWludCByZXQ7CisKKwlmaWxwID0gZmdldChmZCk7CisJaWYgKCFmaWxwKQorCQlyZXR1cm4gLUVCQURGOworCWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlyZXQgPSBpbm90aWZ5X2lnbm9yZShkZXYsIHdkKTsKKwlmcHV0KGZpbHApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitpbm90aWZ5X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCSAgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKyAgICByZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiaW5vdGlmeSIsIE5VTEwsIDB4QkFEMURFQSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpbm90aWZ5X2ZzX3R5cGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImlub3RpZnlmcyIsCisgICAgLmdldF9zYiAgICAgICAgID0gaW5vdGlmeV9nZXRfc2IsCisgICAgLmtpbGxfc2IgICAgICAgID0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworLyoKKyAqIGlub3RpZnlfaW5pdCAtIE91ciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gIE5vdGUgdGhhdCB3ZSBjYW5ubm90IHJldHVybgorICogZXJyb3IgYmVjYXVzZSB3ZSBoYXZlIGNvbXBpbGVkLWluIFZGUyBob29rcy4gIFNvIGFuICh1bmxpa2VseSkgZmFpbHVyZSBoZXJlCisgKiBtdXN0IHJlc3VsdCBpbiBwYW5pYygpLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpbm90aWZ5X2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9maWxlc3lzdGVtKCZpbm90aWZ5X2ZzX3R5cGUpOworCWlub3RpZnlfbW50ID0ga2Vybl9tb3VudCgmaW5vdGlmeV9mc190eXBlKTsKKworCWlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMgPSA4MTkyOworCWlub3RpZnlfbWF4X3VzZXJfaW5zdGFuY2VzID0gODsKKwlpbm90aWZ5X21heF91c2VyX3dhdGNoZXMgPSA4MTkyOworCisJYXRvbWljX3NldCgmaW5vdGlmeV9jb29raWUsIDApOworCisJd2F0Y2hfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfd2F0Y2hfY2FjaGUiLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X3dhdGNoKSwKKwkJCQkJIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCWV2ZW50X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm90aWZ5X2V2ZW50X2NhY2hlIiwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQpLAorCQkJCQkgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoaW5vdGlmeV9pbml0KTsKZGlmZiAtLWdpdCBhL2ZzL2lvcHJpby5jIGIvZnMvaW9wcmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlMWYwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lvcHJpby5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogZnMvaW9wcmlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KKyAqCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aW5nL3F1ZXJ5aW5nIGlvIHByaW9yaXRpZXMgb2YgcHJvY2Vzc2VzLiBUaGUKKyAqIHN5c3RlbSBjYWxscyBjbG9zZWx5IG1pbW1pY2sgZ2V0cHJpb3JpdHkvc2V0cHJpb3JpdHksIHNlZSB0aGUgbWFuIHBhZ2UgZm9yCisgKiB0aG9zZS4gVGhlIHByaW8gYXJndW1lbnQgaXMgYSBjb21wb3NpdGUgb2YgcHJpbyBjbGFzcyBhbmQgcHJpbyBkYXRhLCB3aGVyZQorICogdGhlIGRhdGEgYXJndW1lbnQgaGFzIG1lYW5pbmcgd2l0aGluIHRoYXQgY2xhc3MuIFRoZSBzdGFuZGFyZCBzY2hlZHVsaW5nCisgKiBjbGFzc2VzIGhhdmUgOCBkaXN0aW5jdCBwcmlvIGxldmVscywgd2l0aCAwIGJlaW5nIHRoZSBoaWdoZXN0IHByaW8gYW5kIDcKKyAqIGJlaW5nIHRoZSBsb3dlc3QuCisgKgorICogSU9XLCBzZXR0aW5nIEJFIHNjaGVkdWxpbmcgY2xhc3Mgd2l0aCBwcmlvIDIgaXMgZG9uZSBhbGE6CisgKgorICogdW5zaWduZWQgaW50IHByaW8gPSAoSU9QUklPX0NMQVNTX0JFIDw8IElPUFJJT19DTEFTU19TSElGVCkgfCAyOworICoKKyAqIGlvcHJpb19zZXQoUFJJT19QUk9DRVNTLCBwaWQsIHByaW8pOworICoKKyAqIFNlZSBhbHNvIERvY3VtZW50YXRpb24vYmxvY2svaW9wcmlvLnR4dAorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcHJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCitzdGF0aWMgaW50IHNldF90YXNrX2lvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpb3ByaW8pCit7CisJc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKKworCWlmICh0YXNrLT51aWQgIT0gY3VycmVudC0+ZXVpZCAmJgorCSAgICB0YXNrLT51aWQgIT0gY3VycmVudC0+dWlkICYmICFjYXBhYmxlKENBUF9TWVNfTklDRSkpCisJCXJldHVybiAtRVBFUk07CisKKwl0YXNrX2xvY2sodGFzayk7CisKKwl0YXNrLT5pb3ByaW8gPSBpb3ByaW87CisKKwlpb2MgPSB0YXNrLT5pb19jb250ZXh0OworCWlmIChpb2MgJiYgaW9jLT5zZXRfaW9wcmlvKQorCQlpb2MtPnNldF9pb3ByaW8oaW9jLCBpb3ByaW8pOworCisJdGFza191bmxvY2sodGFzayk7CisJcmV0dXJuIDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wcmlvX3NldChpbnQgd2hpY2gsIGludCB3aG8sIGludCBpb3ByaW8pCit7CisJaW50IGNsYXNzID0gSU9QUklPX1BSSU9fQ0xBU1MoaW9wcmlvKTsKKwlpbnQgZGF0YSA9IElPUFJJT19QUklPX0RBVEEoaW9wcmlvKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsICpnOworCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbGFzcykgeworCQljYXNlIElPUFJJT19DTEFTU19SVDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJLyogZmFsbCB0aHJvdWdoLCBydCBoYXMgcHJpbyBmaWVsZCB0b28gKi8KKwkJY2FzZSBJT1BSSU9fQ0xBU1NfQkU6CisJCQlpZiAoZGF0YSA+PSBJT1BSSU9fQkVfTlIgfHwgZGF0YSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19DTEFTU19JRExFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSAtRVNSQ0g7CisJcmVhZF9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJc3dpdGNoICh3aGljaCkgeworCQljYXNlIElPUFJJT19XSE9fUFJPQ0VTUzoKKwkJCWlmICghd2hvKQorCQkJCXAgPSBjdXJyZW50OworCQkJZWxzZQorCQkJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHdobyk7CisJCQlpZiAocCkKKwkJCQlyZXQgPSBzZXRfdGFza19pb3ByaW8ocCwgaW9wcmlvKTsKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19XSE9fUEdSUDoKKwkJCWlmICghd2hvKQorCQkJCXdobyA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisJCQlkb19lYWNoX3Rhc2tfcGlkKHdobywgUElEVFlQRV9QR0lELCBwKSB7CisJCQkJcmV0ID0gc2V0X3Rhc2tfaW9wcmlvKHAsIGlvcHJpbyk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlX2VhY2hfdGFza19waWQod2hvLCBQSURUWVBFX1BHSUQsIHApOworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX1dIT19VU0VSOgorCQkJaWYgKCF3aG8pCisJCQkJdXNlciA9IGN1cnJlbnQtPnVzZXI7CisJCQllbHNlCisJCQkJdXNlciA9IGZpbmRfdXNlcih3aG8pOworCisJCQlpZiAoIXVzZXIpCisJCQkJYnJlYWs7CisKKwkJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKKwkJCQlpZiAocC0+dWlkICE9IHdobykKKwkJCQkJY29udGludWU7CisJCQkJcmV0ID0gc2V0X3Rhc2tfaW9wcmlvKHAsIGlvcHJpbyk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCisJCQlpZiAod2hvKQorCQkJCWZyZWVfdWlkKHVzZXIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJlYWRfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19pb3ByaW9fZ2V0KGludCB3aGljaCwgaW50IHdobykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKKwlpbnQgcmV0ID0gLUVTUkNIOworCisJcmVhZF9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJc3dpdGNoICh3aGljaCkgeworCQljYXNlIElPUFJJT19XSE9fUFJPQ0VTUzoKKwkJCWlmICghd2hvKQorCQkJCXAgPSBjdXJyZW50OworCQkJZWxzZQorCQkJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHdobyk7CisJCQlpZiAocCkKKwkJCQlyZXQgPSBwLT5pb3ByaW87CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fV0hPX1BHUlA6CisJCQlpZiAoIXdobykKKwkJCQl3aG8gPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCQkJZG9fZWFjaF90YXNrX3BpZCh3aG8sIFBJRFRZUEVfUEdJRCwgcCkgeworCQkJCWlmIChyZXQgPT0gLUVTUkNIKQorCQkJCQlyZXQgPSBwLT5pb3ByaW87CisJCQkJZWxzZQorCQkJCQlyZXQgPSBpb3ByaW9fYmVzdChyZXQsIHAtPmlvcHJpbyk7CisJCQl9IHdoaWxlX2VhY2hfdGFza19waWQod2hvLCBQSURUWVBFX1BHSUQsIHApOworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX1dIT19VU0VSOgorCQkJaWYgKCF3aG8pCisJCQkJdXNlciA9IGN1cnJlbnQtPnVzZXI7CisJCQllbHNlCisJCQkJdXNlciA9IGZpbmRfdXNlcih3aG8pOworCisJCQlpZiAoIXVzZXIpCisJCQkJYnJlYWs7CisKKwkJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKKwkJCQlpZiAocC0+dWlkICE9IHVzZXItPnVpZCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHJldCA9PSAtRVNSQ0gpCisJCQkJCXJldCA9IHAtPmlvcHJpbzsKKwkJCQllbHNlCisJCQkJCXJldCA9IGlvcHJpb19iZXN0KHJldCwgcC0+aW9wcmlvKTsKKwkJCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CisKKwkJCWlmICh3aG8pCisJCQkJZnJlZV91aWQodXNlcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmVhZF91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9NYWtlZmlsZSBiL2ZzL2pmZnMyL01ha2VmaWxlCmluZGV4IGUzYzM4Y2MuLmYxYWZlNjggMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL01ha2VmaWxlCisrKyBiL2ZzL2pmZnMyL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtIHYyIChKRkZTMikKICMKLSMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjcgMjAwNC8xMS8wMyAxMjo1NzozOCBqd2JveWVyIEV4cCAkCisjICRJZDogTWFrZWZpbGUuY29tbW9uLHYgMS45IDIwMDUvMDIvMDkgMDk6MjM6NTMgcGF2bG92IEV4cCAkCiAjCiAKIG9iai0kKENPTkZJR19KRkZTMl9GUykgKz0gamZmczIubwpAQCAtMTEsOCArMTEsNyBAQAogamZmczIteQkrPSBzeW1saW5rLm8gYnVpbGQubyBlcmFzZS5vIGJhY2tncm91bmQubyBmcy5vIHdyaXRldi5vCiBqZmZzMi15CSs9IHN1cGVyLm8KIAotamZmczItJChDT05GSUdfSkZGUzJfRlNfTkFORCkJKz0gd2J1Zi5vCi1qZmZzMi0kKENPTkZJR19KRkZTMl9GU19OT1JfRUNDKSArPSB3YnVmLm8KK2pmZnMyLSQoQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSKQkrPSB3YnVmLm8KIGpmZnMyLSQoQ09ORklHX0pGRlMyX1JVQklOKQkrPSBjb21wcl9ydWJpbi5vCiBqZmZzMi0kKENPTkZJR19KRkZTMl9SVElNRSkJKz0gY29tcHJfcnRpbWUubwogamZmczItJChDT05GSUdfSkZGUzJfWkxJQikJKz0gY29tcHJfemxpYi5vCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9SRUFETUUuTG9ja2luZyBiL2ZzL2pmZnMyL1JFQURNRS5Mb2NraW5nCmluZGV4IDQ5NzcxY2YuLmI3OTQzNDMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL1JFQURNRS5Mb2NraW5nCisrKyBiL2ZzL2pmZnMyL1JFQURNRS5Mb2NraW5nCkBAIC0xLDQgKzEsNCBAQAotCSRJZDogUkVBRE1FLkxvY2tpbmcsdiAxLjkgMjAwNC8xMS8yMCAxMDozNTo0MCBkd213MiBFeHAgJAorCSRJZDogUkVBRE1FLkxvY2tpbmcsdiAxLjEyIDIwMDUvMDQvMTMgMTM6MjI6MzUgZHdtdzIgRXhwICQKIAogCUpGRlMyIExPQ0tJTkcgRE9DVU1FTlRBVElPTgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA4LDYgKzEwOCwxMCBAQAogY29ycmVzcG9uZGVudCBqZmZzMl9pbm9kZV9jYWNoZSBvYmplY3QpLiBTbywgdGhlIGlub2NhY2hlX2xvY2sKIGhhcyB0byBiZSBsb2NrZWQgd2hpbGUgd2Fsa2luZyB0aGUgYy0+aW5vY2FjaGVfbGlzdCBoYXNoIGJ1Y2tldHMuCiAKK1RoaXMgc3BpbmxvY2sgYWxzbyBjb3ZlcnMgYWxsb2NhdGlvbiBvZiBuZXcgaW5vZGUgbnVtYmVycywgd2hpY2ggaXMKK2N1cnJlbnRseSBqdXN0ICcrKy0+aGlnaGVzdF9pbm8rKycsIGJ1dCBtaWdodCBvbmUgZGF5IGdldCBtb3JlIGNvbXBsaWNhdGVkCitpZiB3ZSBuZWVkIHRvIGRlYWwgd2l0aCB3cmFwcGluZyBhZnRlciA0IG1pbGxpYXJkIGlub2RlIG51bWJlcnMgYXJlIHVzZWQuCisKIE5vdGUsIHRoZSBmLT5zZW0gZ3VhcmFudGVlcyB0aGF0IHRoZSBjb3JyZXNwb25kZW50IGpmZnMyX2lub2RlX2NhY2hlCiB3aWxsIG5vdCBiZSByZW1vdmVkLiBTbywgaXQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgaXQgd2l0aG91dCBsb2NraW5nCiB0aGUgaW5vY2FjaGVfbG9jayBzcGlubG9jay4gCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKaW5kZXggMWJlNmRlMi4uMGYyMjQzOCAxMDA2NDQKLS0tIGEvZnMvamZmczIvYmFja2dyb3VuZC5jCisrKyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogYmFja2dyb3VuZC5jLHYgMS41MCAyMDA0LzExLzE2IDIwOjM2OjEwIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGJhY2tncm91bmQuYyx2IDEuNTQgMjAwNS8wNS8yMCAyMTozNzoxMiBnbGVpeG5lciBFeHAgJAogICoKICAqLwogCkBAIC0zNyw3ICszNyw3IEBACiAJaWYgKGMtPmdjX3Rhc2spCiAJCUJVRygpOwogCi0JaW5pdF9NVVRFWF9MT0NLRUQoJmMtPmdjX3RocmVhZF9zdGFydCk7CisJaW5pdF9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfc3RhcnQpOwogCWluaXRfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX2V4aXQpOwogCiAJcGlkID0ga2VybmVsX3RocmVhZChqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkLCBjLCBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CkBAIC00OCw3ICs0OCw3IEBACiAJfSBlbHNlIHsKIAkJLyogV2FpdCBmb3IgaXQuLi4gKi8KIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkpGRlMyOiBHYXJiYWdlIGNvbGxlY3QgdGhyZWFkIGlzIHBpZCAlZFxuIiwgcGlkKSk7Ci0JCWRvd24oJmMtPmdjX3RocmVhZF9zdGFydCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9zdGFydCk7CiAJfQogIAogCXJldHVybiByZXQ7CkBAIC01NiwxMyArNTYsMTYgQEAKIAogdm9pZCBqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCiB7CisJaW50IHdhaXQgPSAwOwogCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAlpZiAoYy0+Z2NfdGFzaykgewogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczI6IEtpbGxpbmcgR0MgdGFzayAlZFxuIiwgYy0+Z2NfdGFzay0+cGlkKSk7CiAJCXNlbmRfc2lnKFNJR0tJTEwsIGMtPmdjX3Rhc2ssIDEpOworCQl3YWl0ID0gMTsKIAl9CiAJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX2V4aXQpOworCWlmICh3YWl0KQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfZXhpdCk7CiB9CiAKIHN0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCh2b2lkICpfYykKQEAgLTc1LDcgKzc4LDcgQEAKIAlhbGxvd19zaWduYWwoU0lHQ09OVCk7CiAKIAljLT5nY190YXNrID0gY3VycmVudDsKLQl1cCgmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwljb21wbGV0ZSgmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTApOwogCkBAIC05Miw3ICs5NSw3IEBACiAJCQlzY2hlZHVsZSgpOwogCQl9CiAKLQkJaWYgKHRyeV90b19mcmVlemUoMCkpCisJCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCQljb250aW51ZTsKIAogCQljb25kX3Jlc2NoZWQoKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2J1aWxkLmMgYi9mcy9qZmZzMi9idWlsZC5jCmluZGV4IGEwMWRkNWYuLjk3ZGMzOTcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2J1aWxkLmMKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogYnVpbGQuYyx2IDEuNjkgMjAwNC8xMi8xNiAyMDoyMjoxOCBkbWFybGluIEV4cCAkCisgKiAkSWQ6IGJ1aWxkLmMsdiAxLjcxIDIwMDUvMDcvMTIgMTY6Mzc6MDggZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtOTcsMTQgKzk3LDE2IEBACiAJLyogRmlyc3QsIHNjYW4gdGhlIG1lZGl1bSBhbmQgYnVpbGQgYWxsIHRoZSBpbm9kZSBjYWNoZXMgd2l0aAogCSAgIGxpc3RzIG9mIHBoeXNpY2FsIG5vZGVzICovCiAKLQljLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX01PVU5USU5HOworCWMtPmZsYWdzIHw9IEpGRlMyX1NCX0ZMQUdfU0NBTk5JTkc7CiAJcmV0ID0gamZmczJfc2Nhbl9tZWRpdW0oYyk7CisJYy0+ZmxhZ3MgJj0gfkpGRlMyX1NCX0ZMQUdfU0NBTk5JTkc7CiAJaWYgKHJldCkKIAkJZ290byBleGl0OwogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgIlNjYW5uZWQgZmxhc2ggY29tcGxldGVseVxuIikpOwogCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOwogCisJYy0+ZmxhZ3MgfD0gSkZGUzJfU0JfRkxBR19CVUlMRElORzsKIAkvKiBOb3cgc2NhbiB0aGUgZGlyZWN0b3J5IHRyZWUsIGluY3JlYXNpbmcgbmxpbmsgYWNjb3JkaW5nIHRvIGV2ZXJ5IGRpcmVudCBmb3VuZC4gKi8KIAlmb3JfZWFjaF9pbm9kZShpLCBjLCBpYykgewogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAxOiBpbm8gIyV1XG4iLCBpYy0+aW5vKSk7CkBAIC0xMTYsNyArMTE4LDYgQEAKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQl9CiAJfQotCWMtPmZsYWdzICY9IH5KRkZTMl9TQl9GTEFHX01PVU5USU5HOwogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMSBjb21wbGV0ZVxuIikpOwogCkBAIC0xNjQsNiArMTY1LDggQEAKIAkJaWMtPnNjYW5fZGVudHMgPSBOVUxMOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9CisJYy0+ZmxhZ3MgJj0gfkpGRlMyX1NCX0ZMQUdfQlVJTERJTkc7CisJCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMyBjb21wbGV0ZVxuIikpOwogCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOwogCkBAIC0zMzMsMTMgKzMzNiw2IEBACiAJCWMtPmJsb2Nrc1tpXS5iYWRfY291bnQgPSAwOwogCX0KIAotCWluaXRfTVVURVgoJmMtPmFsbG9jX3NlbSk7Ci0JaW5pdF9NVVRFWCgmYy0+ZXJhc2VfZnJlZV9zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmVyYXNlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmlub2NhY2hlX3dxKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+aW5vY2FjaGVfbG9jayk7Ci0KIAlJTklUX0xJU1RfSEVBRCgmYy0+Y2xlYW5fbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmMtPnZlcnlfZGlydHlfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmMtPmRpcnR5X2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfemxpYi5jIGIvZnMvamZmczIvY29tcHJfemxpYi5jCmluZGV4IDA3OGEzMGUuLjgzZjdlMDcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYworKysgYi9mcy9qZmZzMi9jb21wcl96bGliLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGNvbXByX3psaWIuYyx2IDEuMjkgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICogJElkOiBjb21wcl96bGliLmMsdiAxLjMxIDIwMDUvMDUvMjAgMTk6MzA6MDYgZ2xlaXhuZXIgRXhwICQKICAqCiAgKi8KIApAQCAtMTcsMTAgKzE3LDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC96bGliLmg+CiAjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKICNpbmNsdWRlICJjb21wci5oIgogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9kaXIuYyBiL2ZzL2pmZnMyL2Rpci5jCmluZGV4IDc1NzMwNmYuLjNjYTBkMjUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2Rpci5jCisrKyBiL2ZzL2pmZnMyL2Rpci5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBkaXIuYyx2IDEuODQgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICogJElkOiBkaXIuYyx2IDEuODYgMjAwNS8wNy8wNiAxMjoxMzowOSBkd213MiBFeHAgJAogICoKICAqLwogCkBAIC0yMiwxNiArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlICJub2RlbGlzdC5oIgogCi0vKiBVcmdoLiBQbGVhc2UgdGVsbCBtZSB0aGVyZSdzIGEgbmljZXIgd2F5IG9mIGRvaW5nIHRoZXNlLiAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNDgpCi10eXBlZGVmIGludCBta25vZF9hcmdfdDsKLSNkZWZpbmUgTkFNRUlfQ09NUEFUKHgpICgodm9pZCAqKXgpCi0jZWxzZQotdHlwZWRlZiBkZXZfdCBta25vZF9hcmdfdDsKLSNkZWZpbmUgTkFNRUlfQ09NUEFUKHgpICh4KQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgamZmczJfcmVhZGRpciAoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwogCiBzdGF0aWMgaW50IGpmZnMyX2NyZWF0ZSAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCwKQEAgLTQzLDcgKzMzLDcgQEAKIHN0YXRpYyBpbnQgamZmczJfc3ltbGluayAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGpmZnMyX21rZGlyIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKIHN0YXRpYyBpbnQgamZmczJfcm1kaXIgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKik7Ci1zdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LG1rbm9kX2FyZ190KTsKK3N0YXRpYyBpbnQgamZmczJfbWtub2QgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsZGV2X3QpOwogc3RhdGljIGludCBqZmZzMl9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIApAQCAtNTgsOCArNDgsOCBAQAogCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzMl9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9CiB7Ci0JLmNyZWF0ZSA9CU5BTUVJX0NPTVBBVChqZmZzMl9jcmVhdGUpLAotCS5sb29rdXAgPQlOQU1FSV9DT01QQVQoamZmczJfbG9va3VwKSwKKwkuY3JlYXRlID0JamZmczJfY3JlYXRlLAorCS5sb29rdXAgPQlqZmZzMl9sb29rdXAsCiAJLmxpbmsgPQkJamZmczJfbGluaywKIAkudW5saW5rID0JamZmczJfdW5saW5rLAogCS5zeW1saW5rID0JamZmczJfc3ltbGluaywKQEAgLTI5NiwxMSArMjg2LDExIEBACiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKIAlpbnQgbmFtZWxlbjsKIAl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCB0YXJnZXRsZW4gPSBzdHJsZW4odGFyZ2V0KTsKIAogCS8qIEZJWE1FOiBJZiB5b3UgY2FyZS4gV2UnZCBuZWVkIHRvIHVzZSBmcmFncyBmb3IgdGhlIHRhcmdldAogCSAgIGlmIGl0IGdyb3dzIG11Y2ggbW9yZSB0aGFuIHRoaXMgKi8KLQlpZiAoc3RybGVuKHRhcmdldCkgPiAyNTQpCisJaWYgKHRhcmdldGxlbiA+IDI1NCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyaSA9IGpmZnMyX2FsbG9jX3Jhd19pbm9kZSgpOwpAQCAtMzE0LDcgKzMwNCw3IEBACiAJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKIAkgKi8KIAluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBzdHJsZW4odGFyZ2V0KSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJpKSArIHRhcmdldGxlbiwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CiAKIAlpZiAocmV0KSB7CiAJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKQEAgLTMzMywxNiArMzIzLDE2IEBACiAKIAlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CiAKLQlpbm9kZS0+aV9zaXplID0gc3RybGVuKHRhcmdldCk7CisJaW5vZGUtPmlfc2l6ZSA9IHRhcmdldGxlbjsKIAlyaS0+aXNpemUgPSByaS0+ZHNpemUgPSByaS0+Y3NpemUgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKIAlyaS0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyaSkgKyBpbm9kZS0+aV9zaXplKTsKIAlyaS0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOwogCiAJcmktPmNvbXByID0gSkZGUzJfQ09NUFJfTk9ORTsKLQlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpKSk7CisJcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgdGFyZ2V0LCB0YXJnZXRsZW4pKTsKIAlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOwogCQotCWZuID0gamZmczJfd3JpdGVfZG5vZGUoYywgZiwgcmksIHRhcmdldCwgc3RybGVuKHRhcmdldCksIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOworCWZuID0gamZmczJfd3JpdGVfZG5vZGUoYywgZiwgcmksIHRhcmdldCwgdGFyZ2V0bGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKIAogCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKIApAQCAtMzUzLDYgKzM0MywyMCBAQAogCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CiAJCXJldHVybiBQVFJfRVJSKGZuKTsKIAl9CisKKwkvKiBXZSB1c2UgZi0+ZGVudHMgZmllbGQgdG8gc3RvcmUgdGhlIHRhcmdldCBwYXRoLiAqLworCWYtPmRlbnRzID0ga21hbGxvYyh0YXJnZXRsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWYtPmRlbnRzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGFsbG9jYXRlICVkIGJ5dGVzIG9mIG1lbW9yeVxuIiwgdGFyZ2V0bGVuICsgMSk7CisJCXVwKCZmLT5zZW0pOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfY2xlYXJfaW5vZGUoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoZi0+ZGVudHMsIHRhcmdldCwgdGFyZ2V0bGVuICsgMSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3N5bWxpbms6IHN5bWxpbmsncyB0YXJnZXQgJyVzJyBjYWNoZWRcbiIsIChjaGFyICopZi0+ZGVudHMpKTsKKwogCS8qIE5vIGRhdGEgaGVyZS4gT25seSBhIG1ldGFkYXRhIG5vZGUsIHdoaWNoIHdpbGwgYmUgCiAJICAgb2Jzb2xldGVkIGJ5IHRoZSBmaXJzdCBkYXRhIHdyaXRlCiAJKi8KQEAgLTU2NCw3ICs1NjgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgamZmczJfbWtub2QgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIG1rbm9kX2FyZ190IHJkZXYpCitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQogewogCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAqZGlyX2Y7CiAJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9lcmFzZS5jIGIvZnMvamZmczIvZXJhc2UuYwppbmRleCA0MTQ1MWU4Li43ODdkODRhIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9lcmFzZS5jCisrKyBiL2ZzL2pmZnMyL2VyYXNlLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGVyYXNlLmMsdiAxLjY2IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqICRJZDogZXJhc2UuYyx2IDEuODAgMjAwNS8wNy8xNCAxOTo0NjoyNCBqb2VybiBFeHAgJAogICoKICAqLwogCkBAIC00OCw2ICs0OCw3IEBACiAjZWxzZSAvKiBMaW51eCAqLwogCXN0cnVjdCBlcmFzZV9pbmZvICppbnN0cjsKIAorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9lcmFzZV9ibG9jaygpOiBlcmFzZSBibG9jayAlI3ggKHJhbmdlICUjeC0lI3gpXG4iLCBqZWItPm9mZnNldCwgamViLT5vZmZzZXQsIGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUpKTsKIAlpbnN0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlcmFzZV9pbmZvKSArIHNpemVvZihzdHJ1Y3QgZXJhc2VfcHJpdl9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluc3RyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImttYWxsb2MgZm9yIHN0cnVjdCBlcmFzZV9pbmZvIGluIGpmZnMyX2VyYXNlX2Jsb2NrIGZhaWxlZC4gUmVmaWxpbmcgYmxvY2sgZm9yIGxhdGVyXG4iKTsKQEAgLTIzMyw3ICsyMzQsNyBAQAogCQkJY29udGludWU7CiAJCX0gCiAKLQkJaWYgKCgoKnByZXYpLT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplIC0xKSkgPT0gamViLT5vZmZzZXQpIHsKKwkJaWYgKFNFQ1RPUl9BRERSKCgqcHJldiktPmZsYXNoX29mZnNldCkgPT0gamViLT5vZmZzZXQpIHsKIAkJCS8qIEl0J3MgaW4gdGhlIGJsb2NrIHdlJ3JlIGVyYXNpbmcgKi8KIAkJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnRoaXM7CiAKQEAgLTI3NywxMSArMjc4LDggQEAKIAkJcHJpbnRrKCJcbiIpOwogCX0pOwogCi0JaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljKSB7Ci0JCUQxKHByaW50ayhLRVJOX0RFQlVHICJpbm9jYWNoZSBmb3IgaW5vICMldSBpcyBhbGwgZ29uZSBub3cuIEZyZWVpbmdcbiIsIGljLT5pbm8pKTsKKwlpZiAoaWMtPm5vZGVzID09ICh2b2lkICopaWMgJiYgaWMtPm5saW5rID09IDApCiAJCWpmZnMyX2RlbF9pbm9fY2FjaGUoYywgaWMpOwotCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKGljKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKQEAgLTMwMiw5MiArMzAwLDg2IEBACiAJamViLT5sYXN0X25vZGUgPSBOVUxMOwogfQogCitzdGF0aWMgaW50IGpmZnMyX2Jsb2NrX2NoZWNrX2VyYXNlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCB1aW50MzJfdCAqYmFkX29mZnNldCkKK3sKKwl2b2lkICplYnVmOworCXVpbnQzMl90IG9mczsKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQgPSAtRUlPOworCQorCWVidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlYnVmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlIGJ1ZmZlciBmb3IgdmVyaWZ5aW5nIGVyYXNlIGF0IDB4JTA4eC4gUmVmaWxpbmdcbiIsIGplYi0+b2Zmc2V0KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlZlcmlmeWluZyBlcmFzZSBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisKKwlmb3IgKG9mcyA9IGplYi0+b2Zmc2V0OyBvZnMgPCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplOyApIHsKKwkJdWludDMyX3QgcmVhZGxlbiA9IG1pbigodWludDMyX3QpUEFHRV9TSVpFLCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplIC0gb2ZzKTsKKwkJaW50IGk7CisKKwkJKmJhZF9vZmZzZXQgPSBvZnM7CisKKwkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIG9mIG5ld2x5LWVyYXNlZCBibG9jayBhdCAweCUwOHggZmFpbGVkOiAlZC4gUHV0dGluZyBvbiBiYWRfbGlzdFxuIiwgb2ZzLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CisJCWlmIChyZXRsZW4gIT0gcmVhZGxlbikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2hvcnQgcmVhZCBmcm9tIG5ld2x5LWVyYXNlZCBibG9jayBhdCAweCUwOHguIFdhbnRlZCAlZCwgZ290ICV6ZFxuIiwgb2ZzLCByZWFkbGVuLCByZXRsZW4pOworCQkJZ290byBmYWlsOworCQl9CisJCWZvciAoaT0wOyBpPHJlYWRsZW47IGkgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisJCQkvKiBJdCdzIE9LLiBXZSBrbm93IGl0J3MgcHJvcGVybHkgYWxpZ25lZCAqLworCQkJdW5zaWduZWQgbG9uZyAqZGF0dW0gPSBlYnVmICsgaTsKKwkJCWlmICgqZGF0dW0gKyAxKSB7CisJCQkJKmJhZF9vZmZzZXQgKz0gaTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOZXdseS1lcmFzZWQgYmxvY2sgY29udGFpbmVkIHdvcmQgMHglbHggYXQgb2Zmc2V0IDB4JTA4eFxuIiwgKmRhdHVtLCAqYmFkX29mZnNldCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisJCW9mcyArPSByZWFkbGVuOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0ID0gMDsKK2ZhaWw6CisJa2ZyZWUoZWJ1Zik7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgamZmczJfbWFya19lcmFzZWRfYmxvY2soc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCiB7CiAJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbWFya2VyX3JlZiA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciAqZWJ1ZjsKIAlzaXplX3QgcmV0bGVuOwogCWludCByZXQ7CiAJdWludDMyX3QgYmFkX29mZnNldDsKIAotCWlmICghamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7Ci0JCW1hcmtlcl9yZWYgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKLQkJaWYgKCFtYXJrZXJfcmVmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gYWxsb2NhdGUgcmF3IG5vZGUgcmVmIGZvciBjbGVhbiBtYXJrZXJcbiIpOwotCQkJLyogU3RpY2sgaXQgYmFjayBvbiB0aGUgbGlzdCBmcm9tIHdoZW5jZSBpdCBjYW1lIGFuZCBjb21lIGJhY2sgbGF0ZXIgKi8KLQkJCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKLQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9jb21wbGV0ZV9saXN0KTsKLQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQkJcmV0dXJuOwotCQl9CisJc3dpdGNoIChqZmZzMl9ibG9ja19jaGVja19lcmFzZShjLCBqZWIsICZiYWRfb2Zmc2V0KSkgeworCWNhc2UgLUVBR0FJTjoJZ290byByZWZpbGU7CisJY2FzZSAtRUlPOglnb3RvIGZpbGViYWQ7CiAJfQotCWVidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlYnVmKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlIGJ1ZmZlciBmb3IgdmVyaWZ5aW5nIGVyYXNlIGF0IDB4JTA4eC4gQXNzdW1pbmcgaXQgd29ya2VkXG4iLCBqZWItPm9mZnNldCk7Ci0JfSBlbHNlIHsKLQkJdWludDMyX3Qgb2ZzID0gamViLT5vZmZzZXQ7Ci0KLQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlZlcmlmeWluZyBlcmFzZSBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7Ci0JCXdoaWxlKG9mcyA8IGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUpIHsKLQkJCXVpbnQzMl90IHJlYWRsZW4gPSBtaW4oKHVpbnQzMl90KVBBR0VfU0laRSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7Ci0JCQlpbnQgaTsKLQotCQkJYmFkX29mZnNldCA9IG9mczsKLQotCQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlYWQgb2YgbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eCBmYWlsZWQ6ICVkLiBQdXR0aW5nIG9uIGJhZF9saXN0XG4iLCBvZnMsIHJldCk7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlpZiAocmV0bGVuICE9IHJlYWRsZW4pIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTaG9ydCByZWFkIGZyb20gbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eC4gV2FudGVkICVkLCBnb3QgJXpkXG4iLCBvZnMsIHJlYWRsZW4sIHJldGxlbik7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlmb3IgKGk9MDsgaTxyZWFkbGVuOyBpICs9IHNpemVvZih1bnNpZ25lZCBsb25nKSkgewotCQkJCS8qIEl0J3MgT0suIFdlIGtub3cgaXQncyBwcm9wZXJseSBhbGlnbmVkICovCi0JCQkJdW5zaWduZWQgbG9uZyBkYXR1bSA9ICoodW5zaWduZWQgbG9uZyAqKSgmZWJ1ZltpXSk7Ci0JCQkJaWYgKGRhdHVtICsgMSkgewotCQkJCQliYWRfb2Zmc2V0ICs9IGk7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5ld2x5LWVyYXNlZCBibG9jayBjb250YWluZWQgd29yZCAweCVseCBhdCBvZmZzZXQgMHglMDh4XG4iLCBkYXR1bSwgYmFkX29mZnNldCk7Ci0JCQkJYmFkOiAKLQkJCQkJaWYgKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCi0JCQkJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihtYXJrZXJfcmVmKTsKLQkJCQkJa2ZyZWUoZWJ1Zik7Ci0JCQkJYmFkMjoKLQkJCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQkJCQkvKiBTdGljayBpdCBvbiBhIGxpc3QgKGFueSBsaXN0KSBzbwotCQkJCQkgICBlcmFzZV9mYWlsZWQgY2FuIHRha2UgaXQgcmlnaHQgb2ZmCi0JCQkJCSAgIGFnYWluLiAgU2lsbHksIGJ1dCBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJCSAgIG9mdGVuLiAqLwotCQkJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2luZ19saXN0KTsKLQkJCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQkJCWpmZnMyX2VyYXNlX2ZhaWxlZChjLCBqZWIsIGJhZF9vZmZzZXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJb2ZzICs9IHJlYWRsZW47Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJfQotCQlrZnJlZShlYnVmKTsKLQl9Ci0KLQliYWRfb2Zmc2V0ID0gamViLT5vZmZzZXQ7CiAKIAkvKiBXcml0ZSB0aGUgZXJhc2UgY29tcGxldGUgbWFya2VyICovCQogCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIGVyYXNlZCBtYXJrZXIgdG8gYmxvY2sgYXQgMHglMDh4XG4iLCBqZWItPm9mZnNldCkpOwotCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwliYWRfb2Zmc2V0ID0gamViLT5vZmZzZXQ7CiAKLQkJaWYgKGpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoYywgamViKSkKLQkJCWdvdG8gYmFkMjsKLQkJCQorCS8qIENsZWFubWFya2VyIGluIG9vYiBhcmVhIG9yIG5vIGNsZWFubWFya2VyIGF0IGFsbCA/ICovCisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSB8fCBjLT5jbGVhbm1hcmtlcl9zaXplID09IDApIHsKKworCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CisJCQlpZiAoamZmczJfd3JpdGVfbmFuZF9jbGVhbm1hcmtlcihjLCBqZWIpKQorCQkJCWdvdG8gZmlsZWJhZDsKKwkJfQorCiAJCWplYi0+Zmlyc3Rfbm9kZSA9IGplYi0+bGFzdF9ub2RlID0gTlVMTDsKLQogCQlqZWItPmZyZWVfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOwogCQlqZWItPnVzZWRfc2l6ZSA9IDA7CiAJCWplYi0+ZGlydHlfc2l6ZSA9IDA7CiAJCWplYi0+d2FzdGVkX3NpemUgPSAwOworCiAJfSBlbHNlIHsKKwogCQlzdHJ1Y3Qga3ZlYyB2ZWNzWzFdOwogCQlzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlIG1hcmtlciA9IHsKIAkJCS5tYWdpYyA9CWNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spLApAQCAtMzk1LDIxICszODcsMjggQEAKIAkJCS50b3RsZW4gPQljcHVfdG9famUzMihjLT5jbGVhbm1hcmtlcl9zaXplKQogCQl9OwogCisJCW1hcmtlcl9yZWYgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwkJaWYgKCFtYXJrZXJfcmVmKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gYWxsb2NhdGUgcmF3IG5vZGUgcmVmIGZvciBjbGVhbiBtYXJrZXIuIFJlZmlsaW5nXG4iKTsKKwkJCWdvdG8gcmVmaWxlOworCQl9CisKIAkJbWFya2VyLmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmbWFya2VyLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOwogCiAJCXZlY3NbMF0uaW92X2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSAmbWFya2VyOwogCQl2ZWNzWzBdLmlvdl9sZW4gPSBzaXplb2YobWFya2VyKTsKIAkJcmV0ID0gamZmczJfZmxhc2hfZGlyZWN0X3dyaXRldihjLCB2ZWNzLCAxLCBqZWItPm9mZnNldCwgJnJldGxlbik7CiAJCQotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJXcml0ZSBjbGVhbiBtYXJrZXIgdG8gYmxvY2sgYXQgMHglMDh4IGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgamViLT5vZmZzZXQsIHJldCk7Ci0JCQlnb3RvIGJhZDI7Ci0JCX0KLQkJaWYgKHJldGxlbiAhPSBzaXplb2YobWFya2VyKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2hvcnQgd3JpdGUgdG8gbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eDogV2FudGVkICV6ZCwgZ290ICV6ZFxuIiwKLQkJCSAgICAgICBqZWItPm9mZnNldCwgc2l6ZW9mKG1hcmtlciksIHJldGxlbik7Ci0JCQlnb3RvIGJhZDI7CisJCWlmIChyZXQgfHwgcmV0bGVuICE9IHNpemVvZihtYXJrZXIpKSB7CisJCQlpZiAocmV0KQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIldyaXRlIGNsZWFuIG1hcmtlciB0byBibG9jayBhdCAweCUwOHggZmFpbGVkOiAlZFxuIiwKKwkJCQkgICAgICAgamViLT5vZmZzZXQsIHJldCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2hvcnQgd3JpdGUgdG8gbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eDogV2FudGVkICV6ZCwgZ290ICV6ZFxuIiwKKwkJCQkgICAgICAgamViLT5vZmZzZXQsIHNpemVvZihtYXJrZXIpLCByZXRsZW4pOworCisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihtYXJrZXJfcmVmKTsKKwkJCWdvdG8gZmlsZWJhZDsKIAkJfQogCiAJCW1hcmtlcl9yZWYtPm5leHRfaW5faW5vID0gTlVMTDsKQEAgLTQzOCw1ICs0MzcsMjIgQEAKIAljLT5ucl9mcmVlX2Jsb2NrcysrOwogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCXdha2VfdXAoJmMtPmVyYXNlX3dhaXQpOwotfQorCXJldHVybjsKIAorZmlsZWJhZDoKKwlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJLyogU3RpY2sgaXQgb24gYSBsaXN0IChhbnkgbGlzdCkgc28gZXJhc2VfZmFpbGVkIGNhbiB0YWtlIGl0CisJICAgcmlnaHQgb2ZmIGFnYWluLiAgU2lsbHksIGJ1dCBzaG91bGRuJ3QgaGFwcGVuIG9mdGVuLiAqLworCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzaW5nX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWpmZnMyX2VyYXNlX2ZhaWxlZChjLCBqZWIsIGJhZF9vZmZzZXQpOworCXJldHVybjsKKworcmVmaWxlOgorCS8qIFN0aWNrIGl0IGJhY2sgb24gdGhlIGxpc3QgZnJvbSB3aGVuY2UgaXQgY2FtZSBhbmQgY29tZSBiYWNrIGxhdGVyICovCisJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCk7CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCmluZGV4IDc3MWE1NTQuLmJkOWVkOWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZpbGUuYworKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTcsMTEgKzcsMTAgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZmlsZS5jLHYgMS45OSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGZpbGUuYyx2IDEuMTAyIDIwMDUvMDcvMDYgMTI6MTM6MDkgZHdtdzIgRXhwICQKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTUxLDkgKzUwLDcgQEAKIAkuaW9jdGwgPQlqZmZzMl9pb2N0bCwKIAkubW1hcCA9CQlnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuZnN5bmMgPQlqZmZzMl9mc3luYywKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDI5KQogCS5zZW5kZmlsZSA9CWdlbmVyaWNfZmlsZV9zZW5kZmlsZQotI2VuZGlmCiB9OwogCiAvKiBqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IDMwYWIyMzMuLjU2ODdjM2YgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtNywxMSArNywxMCBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBmcy5jLHYgMS41MSAyMDA0LzExLzI4IDEyOjE5OjM3IGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IGZzLmMsdiAxLjU2IDIwMDUvMDcvMDYgMTI6MTM6MDkgZHdtdzIgRXhwICQKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDUwLDExICs0NDksMTUgQEAKIAogCWMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKIAotI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpZiAoYy0+bXRkLT50eXBlID09IE1URF9OQU5ERkxBU0gpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJqZmZzMjogQ2Fubm90IG9wZXJhdGUgb24gTkFORCBmbGFzaCB1bmxlc3MgamZmczIgTkFORCBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlpZiAoYy0+bXRkLT50eXBlID09IE1URF9EQVRBRkxBU0gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzMjogQ2Fubm90IG9wZXJhdGUgb24gRGF0YUZsYXNoIHVubGVzcyBqZmZzMiBEYXRhRmxhc2ggc3VwcG9ydCBpcyBjb21waWxlZCBpbi5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAjZW5kaWYKIAogCWMtPmZsYXNoX3NpemUgPSBjLT5tdGQtPnNpemU7CkBAIC01MjIsOSArNTI1LDcgQEAKIAlpZiAoIXNiLT5zX3Jvb3QpCiAJCWdvdG8gb3V0X3Jvb3RfaTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDIwNDAzCiAJc2ItPnNfbWF4Ynl0ZXMgPSAweEZGRkZGRkZGOwotI2VuZGlmCiAJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKIAlzYi0+c19tYWdpYyA9IEpGRlMyX1NVUEVSX01BR0lDOwpAQCAtNjYxLDYgKzY2MiwxNCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CisJCisJLyogYW5kIERhdGFmbGFzaCAqLworCWlmIChqZmZzMl9kYXRhZmxhc2goYykpIHsKKwkJcmV0ID0gamZmczJfZGF0YWZsYXNoX3NldHVwKGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjc0LDQgKzY4Myw5IEBACiAJaWYgKGpmZnMyX25vcl9lY2MoYykpIHsKIAkJamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpOwogCX0KKwkKKwkvKiBhbmQgRGF0YUZsYXNoICovCisJaWYgKGpmZnMyX2RhdGFmbGFzaChjKSkgeworCQlqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChjKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9nYy5jIGIvZnMvamZmczIvZ2MuYwppbmRleCA4N2VjNzRmLi43MDg2Y2Q2IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9nYy5jCisrKyBiL2ZzL2pmZnMyL2djLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGdjLmMsdiAxLjE0NCAyMDA0LzEyLzIxIDExOjE4OjUwIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGdjLmMsdiAxLjE0OCAyMDA1LzA0LzA5IDEwOjQ3OjAwIGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTUwLDYgKzUwLDcgQEAKIAkgICBwdXQgdGhlIGNsZXZlciB3ZWFyLWxldmVsbGluZyBhbGdvcml0aG1zLiBFdmVudHVhbGx5LiAgKi8KIAkvKiBXZSBwb3NzaWJseSB3YW50IHRvIGZhdm91ciB0aGUgZGlydGllciBibG9ja3MgbW9yZSB3aGVuIHRoZQogCSAgIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpcyBsb3cuICovCithZ2FpbjoKIAlpZiAoIWxpc3RfZW1wdHkoJmMtPmJhZF91c2VkX2xpc3QpICYmIGMtPm5yX2ZyZWVfYmxvY2tzID4gYy0+cmVzdl9ibG9ja3NfZ2NiYWQpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBpY2tpbmcgYmxvY2sgZnJvbSBiYWRfdXNlZF9saXN0IHRvIEdDIG5leHRcbiIpKTsKIAkJbmV4dGxpc3QgPSAmYy0+YmFkX3VzZWRfbGlzdDsKQEAgLTc5LDYgKzgwLDEzIEBACiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZXJhc2FibGVfbGlzdCB0byBHQyBuZXh0IChjbGVhbl9saXN0IGFuZCB7dmVyeV8sfWRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKIAogCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0KSkgeworCQkvKiBUaGVyZSBhcmUgYmxvY2tzIGFyZSB3YXRpbmcgZm9yIHRoZSB3YnVmIHN5bmMgKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlN5bmNoaW5nIHdidWYgaW4gb3JkZXIgdG8gcmV1c2UgZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QgYmxvY2tzXG4iKSk7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9mbHVzaF93YnVmX3BhZChjKTsKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlnb3RvIGFnYWluOwogCX0gZWxzZSB7CiAJCS8qIEVlcC4gQWxsIHdlcmUgZW1wdHkgKi8KIAkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMjogTm8gY2xlYW4sIGRpcnR5IF9vcl8gZXJhc2FibGUgYmxvY2tzIHRvIEdDIGZyb20hIFdoZXJlIGFyZSB0aGV5IGFsbD9cbiIpKTsKQEAgLTY2MSw5ICs2NjksMTAgQEAKIHsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOwogCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CisJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqbGFzdF9mcmFnOwogCWppbnQxNl90IGRldjsKIAljaGFyICptZGF0YSA9IE5VTEwsIG1kYXRhbGVuID0gMDsKLQl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzLCBpbGVuOwogCWludCByZXQ7CiAKIAlpZiAoU19JU0JMSyhKRkZTMl9GX0lfTU9ERShmKSkgfHwKQEAgLTY5OSw2ICs3MDgsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCQorCWxhc3RfZnJhZyA9IGZyYWdfbGFzdCgmZi0+ZnJhZ3RyZWUpOworCWlmIChsYXN0X2ZyYWcpCisJCS8qIEZldGNoIHRoZSBpbm9kZSBsZW5ndGggZnJvbSB0aGUgZnJhZ3RyZWUgcmF0aGVyIHRoZW4KKwkJICogZnJvbSBpX3NpemUgc2luY2UgaV9zaXplIG1heSBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgeWV0ICovCisJCWlsZW4gPSBsYXN0X2ZyYWctPm9mcyArIGxhc3RfZnJhZy0+c2l6ZTsKKwllbHNlCisJCWlsZW4gPSBKRkZTMl9GX0lfU0laRShmKTsKKwkKIAltZW1zZXQoJnJpLCAwLCBzaXplb2YocmkpKTsKIAlyaS5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwogCXJpLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfSU5PREUpOwpAQCAtNzEwLDcgKzcyNyw3IEBACiAJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoSkZGUzJfRl9JX01PREUoZikpOwogCXJpLnVpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9VSUQoZikpOwogCXJpLmdpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9HSUQoZikpOwotCXJpLmlzaXplID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX1NJWkUoZikpOworCXJpLmlzaXplID0gY3B1X3RvX2plMzIoaWxlbik7CiAJcmkuYXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQVRJTUUoZikpOwogCXJpLmN0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0NUSU1FKGYpKTsKIAlyaS5tdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9NVElNRShmKSk7CkBAIC04MTYsOCArODMzLDcgQEAKIAogCQkJLyogRG9lc24ndCBtYXR0ZXIgaWYgdGhlcmUncyBvbmUgaW4gdGhlIHNhbWUgZXJhc2UgYmxvY2suIFdlJ3JlIGdvaW5nIHRvIAogCQkJICAgZGVsZXRlIGl0IHRvbyBhdCB0aGUgc2FtZSB0aW1lLiAqLwotCQkJaWYgKChyYXctPmZsYXNoX29mZnNldCAmIH4oYy0+c2VjdG9yX3NpemUtMSkpID09Ci0JCQkgICAgKGZkLT5yYXctPmZsYXNoX29mZnNldCAmIH4oYy0+c2VjdG9yX3NpemUtMSkpKQorCQkJaWYgKFNFQ1RPUl9BRERSKHJhdy0+Zmxhc2hfb2Zmc2V0KSA9PSBTRUNUT1JfQUREUihmZC0+cmF3LT5mbGFzaF9vZmZzZXQpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2sgcG90ZW50aWFsIGRlbGV0aW9uIGRpcmVudCBhdCAlMDh4XG4iLCByZWZfb2Zmc2V0KHJhdykpKTsKQEAgLTg5MSw3ICs5MDcsNyBAQAogCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CiAJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZzsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOwotCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnMsIGlsZW47CiAJaW50IHJldDsKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGhvbGUgbm9kZSBmb3IgaW5vICMldSBmcm9tIG9mZnNldCAweCV4IHRvIDB4JXhcbiIsCkBAIC05NTEsMTAgKzk2NywxOSBAQAogCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKDApOwogCQlyaS5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CiAJfQorCQorCWZyYWcgPSBmcmFnX2xhc3QoJmYtPmZyYWd0cmVlKTsKKwlpZiAoZnJhZykKKwkJLyogRmV0Y2ggdGhlIGlub2RlIGxlbmd0aCBmcm9tIHRoZSBmcmFndHJlZSByYXRoZXIgdGhlbgorCQkgKiBmcm9tIGlfc2l6ZSBzaW5jZSBpX3NpemUgbWF5IGhhdmUgbm90IGJlZW4gdXBkYXRlZCB5ZXQgKi8KKwkJaWxlbiA9IGZyYWctPm9mcyArIGZyYWctPnNpemU7CisJZWxzZQorCQlpbGVuID0gSkZGUzJfRl9JX1NJWkUoZik7CisKIAlyaS5tb2RlID0gY3B1X3RvX2plbW9kZShKRkZTMl9GX0lfTU9ERShmKSk7CiAJcmkudWlkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX1VJRChmKSk7CiAJcmkuZ2lkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX0dJRChmKSk7Ci0JcmkuaXNpemUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfU0laRShmKSk7CisJcmkuaXNpemUgPSBjcHVfdG9famUzMihpbGVuKTsKIAlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CiAJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOwogCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKQEAgLTExNjEsNyArMTE4Niw3IEBACiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRlZCBkbm9kZSB0byB3cml0ZSBmcm9tICgweCV4LTB4JXgpIHRvICgweCV4LTB4JXgpXG4iLCAKIAkJCSAgb3JpZ19zdGFydCwgb3JpZ19lbmQsIHN0YXJ0LCBlbmQpKTsKIAotCQlCVUdfT04oZW5kID4gSkZGUzJfRl9JX1NJWkUoZikpOworCQlEMShCVUdfT04oZW5kID4gZnJhZ19sYXN0KCZmLT5mcmFndHJlZSktPm9mcyArIGZyYWdfbGFzdCgmZi0+ZnJhZ3RyZWUpLT5zaXplKSk7CiAJCUJVR19PTihlbmQgPCBvcmlnX2VuZCk7CiAJCUJVR19PTihzdGFydCA+IG9yaWdfc3RhcnQpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmMgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCmluZGV4IGNkNmE4YmQuLjQ5OTFjMzQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVsaXN0LmMKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbm9kZWxpc3QuYyx2IDEuOTAgMjAwNC8xMi8wOCAxNzo1OToyMCBkd213MiBFeHAgJAorICogJElkOiBub2RlbGlzdC5jLHYgMS45OCAyMDA1LzA3LzEwIDE1OjE1OjMyIGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTU1LDMwICs1NSw2MyBAQAogCX0pOwogfQogCi0vKiBQdXQgYSBuZXcgdG1wX2Rub2RlX2luZm8gaW50byB0aGUgbGlzdCwga2VlcGluZyB0aGUgbGlzdCBpbiAKLSAgIG9yZGVyIG9mIGluY3JlYXNpbmcgdmVyc2lvbgotKi8KLXN0YXRpYyB2b2lkIGpmZnMyX2FkZF90bl90b19saXN0KHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4sIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKmxpc3QpCisvKiAKKyAqIFB1dCBhIG5ldyB0bXBfZG5vZGVfaW5mbyBpbnRvIHRoZSB0ZW1wb3JhdHkgUkItdHJlZSwga2VlcGluZyB0aGUgbGlzdCBpbiAKKyAqIG9yZGVyIG9mIGluY3JlYXNpbmcgdmVyc2lvbi4KKyAqLworc3RhdGljIHZvaWQgamZmczJfYWRkX3RuX3RvX3RyZWUoc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0biwgc3RydWN0IHJiX3Jvb3QgKmxpc3QpCiB7Ci0Jc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqcHJldiA9IGxpc3Q7Ci0JCi0Jd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+dmVyc2lvbiA8IHRuLT52ZXJzaW9uKSB7Ci0JCXByZXYgPSAmKCgqcHJldiktPm5leHQpOwotCX0KLQl0bi0+bmV4dCA9ICgqcHJldik7Ci0gICAgICAgICpwcmV2ID0gdG47CisJc3RydWN0IHJiX25vZGUgKipwID0gJmxpc3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdGhpczsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJdGhpcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CisKKwkJLyogVGhlcmUgbWF5IGFjdHVhbGx5IGJlIGEgY29sbGlzaW9uIGhlcmUsIGJ1dCBpdCBkb2Vzbid0CisJCSAgIGFjdHVhbGx5IG1hdHRlci4gQXMgbG9uZyBhcyB0aGUgdHdvIG5vZGVzIHdpdGggdGhlIHNhbWUKKwkJICAgdmVyc2lvbiBhcmUgdG9nZXRoZXIsIGl0J3MgYWxsIGZpbmUuICovCisJCWlmICh0bi0+dmVyc2lvbiA8IHRoaXMtPnZlcnNpb24pCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisgICAgICAgIH0KKworCXJiX2xpbmtfbm9kZSgmdG4tPnJiLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmdG4tPnJiLCBsaXN0KTsKIH0KIAotc3RhdGljIHZvaWQgamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4pCitzdGF0aWMgdm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3Qoc3RydWN0IHJiX3Jvb3QgKmxpc3QpCiB7Ci0Jc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICpuZXh0OworCXN0cnVjdCByYl9ub2RlICp0aGlzOworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG47CiAKLQl3aGlsZSAodG4pIHsKLQkJbmV4dCA9IHRuOwotCQl0biA9IHRuLT5uZXh0OwotCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUobmV4dC0+Zm4pOwotCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKG5leHQpOworCXRoaXMgPSBsaXN0LT5yYl9ub2RlOworCisJLyogTm93IGF0IGJvdHRvbSBvZiB0cmVlICovCisJd2hpbGUgKHRoaXMpIHsKKwkJaWYgKHRoaXMtPnJiX2xlZnQpCisJCQl0aGlzID0gdGhpcy0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodGhpcy0+cmJfcmlnaHQpCisJCQl0aGlzID0gdGhpcy0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJdG4gPSByYl9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKTsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZSh0bi0+Zm4pOworCQkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0bik7CisKKwkJCXRoaXMgPSB0aGlzLT5yYl9wYXJlbnQ7CisJCQlpZiAoIXRoaXMpCisJCQkJYnJlYWs7CisKKwkJCWlmICh0aGlzLT5yYl9sZWZ0ID09ICZ0bi0+cmIpCisJCQkJdGhpcy0+cmJfbGVmdCA9IE5VTEw7CisJCQllbHNlIGlmICh0aGlzLT5yYl9yaWdodCA9PSAmdG4tPnJiKQorCQkJCXRoaXMtPnJiX3JpZ2h0ID0gTlVMTDsKKwkJCWVsc2UgQlVHKCk7CisJCX0KIAl9CisJbGlzdC0+cmJfbm9kZSA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfZnVsbF9kaXJlbnRfbGlzdChzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkKQpAQCAtMTA4LDEyICsxNDEsMTMgQEAKICAgIHdpdGggdGhpcyBpbm8sIHJldHVybmluZyB0aGUgZm9ybWVyIGluIG9yZGVyIG9mIHZlcnNpb24gKi8KIAogaW50IGpmZnMyX2dldF9pbm9kZV9ub2RlcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCi0JCQkgIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKnRucCwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqZmRwLAorCQkJICBzdHJ1Y3QgcmJfcm9vdCAqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCiAJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAogCQkJICB1aW50MzJfdCAqbWN0aW1lX3ZlcikKIHsKIAlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWYsICp2YWxpZF9yZWY7Ci0Jc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0biwgKnJldF90biA9IE5VTEw7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bjsKKwlzdHJ1Y3QgcmJfcm9vdCByZXRfdG4gPSBSQl9ST09UOwogCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQsICpyZXRfZmQgPSBOVUxMOwogCXVuaW9uIGpmZnMyX25vZGVfdW5pb24gbm9kZTsKIAlzaXplX3QgcmV0bGVuOwpAQCAtMTI3LDcgKzE2MSw3IEBACiAKIAl2YWxpZF9yZWYgPSBqZmZzMl9maXJzdF92YWxpZF9ub2RlKGYtPmlub2NhY2hlLT5ub2Rlcyk7CiAKLQlpZiAoIXZhbGlkX3JlZikKKwlpZiAoIXZhbGlkX3JlZiAmJiAoZi0+aW5vY2FjaGUtPmlubyAhPSAxKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRWVwLiBObyB2YWxpZCBub2RlcyBmb3IgaW5vICMldVxuIiwgZi0+aW5vY2FjaGUtPmlubyk7CiAKIAl3aGlsZSAodmFsaWRfcmVmKSB7CkBAIC0zODYsNyArNDIwLDcgQEAKIAkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkbm9kZSBAJTA4eDogdmVyICV1LCBvZmZzZXQgJTA0eCwgZHNpemUgJTA0eFxuIiwKIAkJCQkgIHJlZl9vZmZzZXQocmVmKSwgamUzMl90b19jcHUobm9kZS5pLnZlcnNpb24pLAogCQkJCSAgamUzMl90b19jcHUobm9kZS5pLm9mZnNldCksIGplMzJfdG9fY3B1KG5vZGUuaS5kc2l6ZSkpKTsKLQkJCWpmZnMyX2FkZF90bl90b19saXN0KHRuLCAmcmV0X3RuKTsKKwkJCWpmZnMyX2FkZF90bl90b190cmVlKHRuLCAmcmV0X3RuKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC00NTAsNyArNDg0LDcgQEAKIAlyZXR1cm4gMDsKIAogIGZyZWVfb3V0OgotCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdChyZXRfdG4pOworCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdCgmcmV0X3RuKTsKIAlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50X2xpc3QocmV0X2ZkKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDg5LDkgKzUyMywxMyBAQAogdm9pZCBqZmZzMl9hZGRfaW5vX2NhY2hlIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpuZXcpCiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICoqcHJldjsKLQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX2lub19jYWNoZTogQWRkICVwIChpbm8gIyV1KVxuIiwgbmV3LCBuZXctPmlubykpOworCiAJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKLQkKKwlpZiAoIW5ldy0+aW5vKQorCQluZXctPmlubyA9ICsrYy0+aGlnaGVzdF9pbm87CisKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX2lub19jYWNoZTogQWRkICVwIChpbm8gIyV1KVxuIiwgbmV3LCBuZXctPmlubykpOworCiAJcHJldiA9ICZjLT5pbm9jYWNoZV9saXN0W25ldy0+aW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOwogCiAJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+aW5vIDwgbmV3LT5pbm8pIHsKQEAgLTUwNiw3ICs1NDQsNyBAQAogdm9pZCBqZmZzMl9kZWxfaW5vX2NhY2hlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm9sZCkKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKipwcmV2OwotCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kZWxfaW5vX2NhY2hlOiBEZWwgJXAgKGlubyAjJXUpXG4iLCBvbGQsIG9sZC0+aW5vKSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RlbF9pbm9fY2FjaGU6IERlbCAlcCAoaW5vICMldSlcbiIsIG9sZCwgb2xkLT5pbm8pKTsKIAlzcGluX2xvY2soJmMtPmlub2NhY2hlX2xvY2spOwogCQogCXByZXYgPSAmYy0+aW5vY2FjaGVfbGlzdFtvbGQtPmlubyAlIElOT0NBQ0hFX0hBU0hTSVpFXTsKQEAgLTUxOCw2ICs1NTYsMTQgQEAKIAkJKnByZXYgPSBvbGQtPm5leHQ7CiAJfQogCisJLyogRnJlZSBpdCBub3cgdW5sZXNzIGl0J3MgaW4gUkVBRElORyBvciBDTEVBUklORyBzdGF0ZSwgd2hpY2gKKwkgICBhcmUgdGhlIHRyYW5zaXRpb25zIHVwb24gcmVhZF9pbm9kZSgpIGFuZCBjbGVhcl9pbm9kZSgpLiBUaGUKKwkgICByZXN0IG9mIHRoZSB0aW1lIHdlIGtub3cgbm9ib2R5IGVsc2UgaXMgbG9va2luZyBhdCBpdCwgYW5kIAorCSAgIGlmIGl0J3MgaGVsZCBieSByZWFkX2lub2RlKCkgb3IgY2xlYXJfaW5vZGUoKSB0aGV5J2xsIGZyZWUgaXQKKwkgICBmb3IgdGhlbXNlbHZlcy4gKi8KKwlpZiAob2xkLT5zdGF0ZSAhPSBJTk9fU1RBVEVfUkVBRElORyAmJiBvbGQtPnN0YXRlICE9IElOT19TVEFURV9DTEVBUklORykKKwkJamZmczJfZnJlZV9pbm9kZV9jYWNoZShvbGQpOworCiAJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOwogfQogCkBAIC01MzAsNyArNTc2LDYgQEAKIAkJdGhpcyA9IGMtPmlub2NhY2hlX2xpc3RbaV07CiAJCXdoaWxlICh0aGlzKSB7CiAJCQluZXh0ID0gdGhpcy0+bmV4dDsKLQkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mcmVlX2lub19jYWNoZXM6IEZyZWVpbmcgaW5vICMldSBhdCAlcFxuIiwgdGhpcy0+aW5vLCB0aGlzKSk7CiAJCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKHRoaXMpOwogCQkJdGhpcyA9IG5leHQ7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmggYi9mcy9qZmZzMi9ub2RlbGlzdC5oCmluZGV4IGE0ODY0ZDAuLmIzNGMzOTcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVsaXN0LmgKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuaApAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbm9kZWxpc3QuaCx2IDEuMTI2IDIwMDQvMTEvMTkgMTU6MDY6MjkgZGVkZWtpbmQgRXhwICQKKyAqICRJZDogbm9kZWxpc3QuaCx2IDEuMTMxIDIwMDUvMDcvMDUgMjE6MDM6MDcgZHdtdzIgRXhwICQKICAqCiAgKi8KIApAQCAtMTM1LDYgKzEzNSw3IEBACiAjZGVmaW5lIElOT19TVEFURV9DSEVDS0VEQUJTRU5UCTMJLyogQ2hlY2tlZCwgY2xlYXJlZCBhZ2FpbiAqLwogI2RlZmluZSBJTk9fU1RBVEVfR0MJCTQJLyogR0NpbmcgYSAncHJpc3RpbmUnIG5vZGUgKi8KICNkZWZpbmUgSU5PX1NUQVRFX1JFQURJTkcJNQkvKiBJbiByZWFkX2lub2RlKCkgKi8KKyNkZWZpbmUgSU5PX1NUQVRFX0NMRUFSSU5HCTYJLyogSW4gY2xlYXJfaW5vZGUoKSAqLwogCiAjZGVmaW5lIElOT0NBQ0hFX0hBU0hTSVpFIDEyOAogCkBAIC0xNjAsNyArMTYxLDcgQEAKICovCiBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8KIHsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisJc3RydWN0IHJiX25vZGUgcmI7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOwogCXVpbnQzMl90IHZlcnNpb247CiB9OyAgICAgICAKQEAgLTM2Miw2ICszNjMsMTggQEAKIAkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7CiAJcmV0dXJuIHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKTsKIH0KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnX2xhc3Qoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZShub2RlLT5yYl9yaWdodCkKKwkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCXJldHVybiByYl9lbnRyeShub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7Cit9CisKICNkZWZpbmUgcmJfcGFyZW50KHJiKSAoKHJiKS0+cmJfcGFyZW50KQogI2RlZmluZSBmcmFnX25leHQoZnJhZykgcmJfZW50cnkocmJfbmV4dCgmKGZyYWcpLT5yYiksIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQogI2RlZmluZSBmcmFnX3ByZXYoZnJhZykgcmJfZW50cnkocmJfcHJldigmKGZyYWcpLT5yYiksIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQpAQCAtMzc0LDcgKzM4Nyw3IEBACiBEMih2b2lkIGpmZnMyX3ByaW50X2ZyYWdfbGlzdChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikpOwogdm9pZCBqZmZzMl9hZGRfZmRfdG9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXcsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmxpc3QpOwogaW50IGpmZnMyX2dldF9pbm9kZV9ub2RlcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCi0JCQkgIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKnRucCwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqZmRwLAorCQkJICBzdHJ1Y3QgcmJfcm9vdCAqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCiAJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAogCQkJICB1aW50MzJfdCAqbWN0aW1lX3Zlcik7CiB2b2lkIGpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYywgaW50IHN0YXRlKTsKQEAgLTQ2Miw3ICs0NzUsNyBAQAogLyogZXJhc2UuYyAqLwogdm9pZCBqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgaW50IGNvdW50KTsKIAotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAvKiB3YnVmLmMgKi8KIGludCBqZmZzMl9mbHVzaF93YnVmX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pOwogaW50IGpmZnMyX2ZsdXNoX3didWZfcGFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVtZ210LmMgYi9mcy9qZmZzMi9ub2RlbWdtdC5jCmluZGV4IDI2NTExMzUuLmMxZDhiNWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVtZ210LmMKKysrIGIvZnMvamZmczIvbm9kZW1nbXQuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbm9kZW1nbXQuYyx2IDEuMTE1IDIwMDQvMTEvMjIgMTE6MDc6MjEgZHdtdzIgRXhwICQKKyAqICRJZDogbm9kZW1nbXQuYyx2IDEuMTIyIDIwMDUvMDUvMDYgMDk6MzA6MjcgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtNzUsNyArNzUsNyBAQAogCQkJZGlydHkgPSBjLT5kaXJ0eV9zaXplICsgYy0+ZXJhc2luZ19zaXplIC0gYy0+bnJfZXJhc2luZ19ibG9ja3MgKiBjLT5zZWN0b3Jfc2l6ZSArIGMtPnVuY2hlY2tlZF9zaXplOwogCQkJaWYgKGRpcnR5IDwgYy0+bm9zcGNfZGlydHlfc2l6ZSkgewogCQkJCWlmIChwcmlvID09IEFMTE9DX0RFTEVUSU9OICYmIGMtPm5yX2ZyZWVfYmxvY2tzICsgYy0+bnJfZXJhc2luZ19ibG9ja3MgPj0gYy0+cmVzdl9ibG9ja3NfZGVsZXRpb24pIHsKLQkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IExvdyBvbiBkaXJ0eSBzcGFjZSB0byBHQywgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpOworCQkJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIGRpcnR5IHNwYWNlIHRvIEdDLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIikpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImRpcnR5IHNpemUgMHglMDh4ICsgdW5jaGVja2VkX3NpemUgMHglMDh4IDwgbm9zcGNfZGlydHlfc2l6ZSAweCUwOHgsIHJldHVybmluZyAtRU5PU1BDXG4iLApAQCAtOTgsNyArOTgsNyBAQAogCQkJYXZhaWwgPSBjLT5mcmVlX3NpemUgKyBjLT5kaXJ0eV9zaXplICsgYy0+ZXJhc2luZ19zaXplICsgYy0+dW5jaGVja2VkX3NpemU7CiAJCQlpZiAoIChhdmFpbCAvIGMtPnNlY3Rvcl9zaXplKSA8PSBibG9ja3NuZWVkZWQpIHsKIAkJCQlpZiAocHJpbyA9PSBBTExPQ19ERUxFVElPTiAmJiBjLT5ucl9mcmVlX2Jsb2NrcyArIGMtPm5yX2VyYXNpbmdfYmxvY2tzID49IGMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uKSB7Ci0JCQkJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfcmVzZXJ2ZV9zcGFjZSgpOiBMb3cgb24gcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIik7CisJCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiamZmczJfcmVzZXJ2ZV9zcGFjZSgpOiBMb3cgb24gcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIikpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTMwOCw3ICszMDgsMTAgQEAKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoKTogTm9kZSBhdCAweCV4KCVkKSwgc2l6ZSAweCV4XG4iLCByZWZfb2Zmc2V0KG5ldyksIHJlZl9mbGFncyhuZXcpLCBsZW4pKTsKICNpZiAxCi0JaWYgKGplYiAhPSBjLT5uZXh0YmxvY2sgfHwgKHJlZl9vZmZzZXQobmV3KSkgIT0gamViLT5vZmZzZXQgKyAoYy0+c2VjdG9yX3NpemUgLSBqZWItPmZyZWVfc2l6ZSkpIHsKKwkvKiB3ZSBjb3VsZCBnZXQgc29tZSBvYnNvbGV0ZSBub2RlcyBhZnRlciBuZXh0YmxvY2sgd2FzIHJlZmlsZWQKKwkgICBpbiB3YnVmLmMgKi8KKwlpZiAoKGMtPm5leHRibG9jayB8fCAhcmVmX29ic29sZXRlKG5ldykpCisJICAgICYmKGplYiAhPSBjLT5uZXh0YmxvY2sgfHwgcmVmX29mZnNldChuZXcpICE9IGplYi0+b2Zmc2V0ICsgKGMtPnNlY3Rvcl9zaXplIC0gamViLT5mcmVlX3NpemUpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmdoLiBub2RlIGFkZGVkIGluIHdyb25nIHBsYWNlXG4iKTsKIAkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobmV3KTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMzIsNyArMzM1LDcgQEAKIAkJYy0+dXNlZF9zaXplICs9IGxlbjsKIAl9CiAKLQlpZiAoIWplYi0+ZnJlZV9zaXplICYmICFqZWItPmRpcnR5X3NpemUpIHsKKwlpZiAoIWplYi0+ZnJlZV9zaXplICYmICFqZWItPmRpcnR5X3NpemUgJiYgIUlTRElSVFkoamViLT53YXN0ZWRfc2l6ZSkpIHsKIAkJLyogSWYgaXQgbGl2ZXMgb24gdGhlIGRpcnR5X2xpc3QsIGpmZnMyX3Jlc2VydmVfc3BhY2Ugd2lsbCBwdXQgaXQgdGhlcmUgKi8KIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBmdWxsIGVyYXNlIGJsb2NrIGF0IDB4JTA4eCB0byBjbGVhbl9saXN0IChmcmVlIDB4JTA4eCwgZGlydHkgMHglMDh4LCB1c2VkIDB4JTA4eFxuIiwKIAkJCSAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+dXNlZF9zaXplKSk7CkBAIC00MDAsNyArNDAzLDcgQEAKIAlqZWIgPSAmYy0+YmxvY2tzW2Jsb2NrbnJdOwogCiAJaWYgKGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmICFqZmZzMl9pc19yZWFkb25seShjKSAmJgotCSAgICAhKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19NT1VOVElORykpIHsKKwkgICAgIShjLT5mbGFncyAmIChKRkZTMl9TQl9GTEFHX1NDQU5OSU5HIHwgSkZGUzJfU0JfRkxBR19CVUlMRElORykpKSB7CiAJCS8qIEhtLiBUaGlzIG1heSBjb25mdXNlIHN0YXRpYyBsb2NrIGFuYWx5c2lzLiBJZiBhbnkgb2YgdGhlIGFib3ZlIAogCQkgICB0aHJlZSBjb25kaXRpb25zIGlzIGZhbHNlLCB3ZSdyZSBnb2luZyB0byByZXR1cm4gZnJvbSB0aGlzIAogCQkgICBmdW5jdGlvbiB3aXRob3V0IGFjdHVhbGx5IG9ibGl0ZXJhdGluZyBhbnkgbm9kZXMgb3IgZnJlZWluZwpAQCAtNDM0LDcgKzQzNyw3IEBACiAKIAkvLyBUYWtlIGNhcmUsIHRoYXQgd2FzdGVkIHNpemUgaXMgdGFrZW4gaW50byBjb25jZXJuCiAJaWYgKChqZWItPmRpcnR5X3NpemUgfHwgSVNESVJUWShqZWItPndhc3RlZF9zaXplICsgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSAmJiBqZWIgIT0gYy0+bmV4dGJsb2NrKSB7Ci0JCUQxKHByaW50aygiRGlydHlpbmdcbiIpKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkRpcnR5aW5nXG4iKSk7CiAJCWFkZGVkc2l6ZSA9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwogCQlqZWItPmRpcnR5X3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CiAJCWMtPmRpcnR5X3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CkBAIC00NTYsNyArNDU5LDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCUQxKHByaW50aygiV2FzdGluZ1xuIikpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV2FzdGluZ1xuIikpOwogCQlhZGRlZHNpemUgPSAwOwogCQlqZWItPndhc3RlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwogCQljLT53YXN0ZWRfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsJCkBAIC00NjcsOCArNDcwLDggQEAKIAogCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CiAKLQlpZiAoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX01PVU5USU5HKSB7Ci0JCS8qIE1vdW50IGluIHByb2dyZXNzLiBEb24ndCBtdWNrIGFib3V0IHdpdGggdGhlIGJsb2NrCisJaWYgKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19TQ0FOTklORykgeworCQkvKiBGbGFzaCBzY2FubmluZyBpcyBpbiBwcm9ncmVzcy4gRG9uJ3QgbXVjayBhYm91dCB3aXRoIHRoZSBibG9jawogCQkgICBsaXN0cyBiZWNhdXNlIHRoZXkncmUgbm90IHJlYWR5IHlldCwgYW5kIGRvbid0IGFjdHVhbGx5CiAJCSAgIG9ibGl0ZXJhdGUgbm9kZXMgdGhhdCBsb29rIG9ic29sZXRlLiBJZiB0aGV5IHdlcmVuJ3QgCiAJCSAgIG1hcmtlZCBvYnNvbGV0ZSBvbiB0aGUgZmxhc2ggYXQgdGhlIHRpbWUgdGhleSBfYmVjYW1lXwpAQCAtNTI3LDcgKzUzMCw4IEBACiAKIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAotCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgfHwgamZmczJfaXNfcmVhZG9ubHkoYykpIHsKKwlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpIHx8IGpmZnMyX2lzX3JlYWRvbmx5KGMpIHx8CisJCShjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfQlVJTERJTkcpKSB7CiAJCS8qIFdlIGRpZG4ndCBsb2NrIHRoZSBlcmFzZV9mcmVlX3NlbSAqLwogCQlyZXR1cm47CiAJfQpAQCAtNTkwLDExICs1OTQsOCBAQAogCQkqcCA9IHJlZi0+bmV4dF9pbl9pbm87CiAJCXJlZi0+bmV4dF9pbl9pbm8gPSBOVUxMOwogCi0JCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYykgewotCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImlub2NhY2hlIGZvciBpbm8gIyV1IGlzIGFsbCBnb25lIG5vdy4gRnJlZWluZ1xuIiwgaWMtPmlubykpOworCQlpZiAoaWMtPm5vZGVzID09ICh2b2lkICopaWMgJiYgaWMtPm5saW5rID09IDApCiAJCQlqZmZzMl9kZWxfaW5vX2NhY2hlKGMsIGljKTsKLQkJCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoaWMpOwotCQl9CiAKIAkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggMDNiMGFjYy4uZDkwMGM4OSAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC03LDQxICs3LDI0IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG9zLWxpbnV4LmgsdiAxLjUxIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqICRJZDogb3MtbGludXguaCx2IDEuNTggMjAwNS8wNy8xMiAwMjozNDozNSB0cG95bm9yIEV4cCAkCiAgKgogICovCiAKICNpZm5kZWYgX19KRkZTMl9PU19MSU5VWF9IX18KICNkZWZpbmUgX19KRkZTMl9PU19MSU5VWF9IX18KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKIC8qIEpGRlMyIHVzZXMgTGludXggbW9kZSBiaXRzIG5hdGl2ZWx5IC0tIG5vIG5lZWQgZm9yIGNvbnZlcnNpb24gKi8KICNkZWZpbmUgb3NfdG9famZmczJfbW9kZSh4KSAoeCkKICNkZWZpbmUgamZmczJfdG9fb3NfbW9kZSh4KSAoeCkKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykKLSNkZWZpbmUga3N0YXRmcyBzdGF0ZnMKLSNlbmRpZgotCiBzdHJ1Y3Qga3N0YXRmczsKIHN0cnVjdCBrdmVjOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDIpCiAjZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKGxpc3RfZW50cnkoaSwgc3RydWN0IGpmZnMyX2lub2RlX2luZm8sIHZmc19pbm9kZSkpCiAjZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgmKGYpLT52ZnNfaW5vZGUpCiAjZGVmaW5lIEpGRlMyX1NCX0lORk8oc2IpIChzYi0+c19mc19pbmZvKQogI2RlZmluZSBPRk5JX0JTXzJTRkZKKGMpICAoKHN0cnVjdCBzdXBlcl9ibG9jayAqKWMtPm9zX3ByaXYpCi0jZWxpZiBkZWZpbmVkKEpGRlMyX09VVF9PRl9LRVJORUwpCi0jZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqKSAmKGkpLT51KQotI2RlZmluZSBPRk5JX0VET05JXzJTRkZKKGYpICAoKHN0cnVjdCBpbm9kZSAqKSAoICgoY2hhciAqKWYpIC0gKChjaGFyICopKCYoKHN0cnVjdCBpbm9kZSAqKU5VTEwpLT51KSkgKSApCi0jZGVmaW5lIEpGRlMyX1NCX0lORk8oc2IpICgoc3RydWN0IGpmZnMyX3NiX2luZm8gKikgJihzYiktPnUpCi0jZGVmaW5lIE9GTklfQlNfMlNGRkooYykgICgoc3RydWN0IHN1cGVyX2Jsb2NrICopICggKChjaGFyICopYykgLSAoKGNoYXIgKikoJigoc3RydWN0IHN1cGVyX2Jsb2NrICopTlVMTCktPnUpKSApICkKLSNlbHNlCi0jZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKCZpLT51LmpmZnMyX2kpCi0jZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgoc3RydWN0IGlub2RlICopICggKChjaGFyICopZikgLSAoKGNoYXIgKikoJigoc3RydWN0IGlub2RlICopTlVMTCktPnUpKSApICkKLSNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKCZzYi0+dS5qZmZzMl9zYikKLSNkZWZpbmUgT0ZOSV9CU18yU0ZGSihjKSAgKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgKCAoKGNoYXIgKiljKSAtICgoY2hhciAqKSgmKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKilOVUxMKS0+dSkpICkgKQotI2VuZGlmCiAKIAogI2RlZmluZSBKRkZTMl9GX0lfU0laRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9zaXplKQpAQCAtNDksMjggKzMyLDE0IEBACiAjZGVmaW5lIEpGRlMyX0ZfSV9VSUQoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfdWlkKQogI2RlZmluZSBKRkZTMl9GX0lfR0lEKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2dpZCkKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwxKQogI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKGltaW5vcihPRk5JX0VET05JXzJTRkZKKGYpKSkKICNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChpbWFqb3IoT0ZOSV9FRE9OSV8yU0ZGSihmKSkpCi0jZWxzZQotI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKE1JTk9SKHRvX2tkZXZfdChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3JkZXYpKSkKLSNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChNQUpPUih0b19rZGV2X3QoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9yZGV2KSkpCi0jZW5kaWYKIAotLyogVXJnaC4gVGhlIHRoaW5ncyB3ZSBkbyB0byBrZWVwIHRoZSAyLjQgYnVpbGQgd29ya2luZyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0NykKICNkZWZpbmUgSVRJTUUoc2VjKSAoKHN0cnVjdCB0aW1lc3BlYyl7c2VjLCAwfSkKICNkZWZpbmUgSV9TRUModHYpICgodHYpLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX01USU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX210aW1lLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX0FUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2F0aW1lLnR2X3NlYykKLSNlbHNlCi0jZGVmaW5lIElUSU1FKHgpICh4KQotI2RlZmluZSBJX1NFQyh4KSAoeCkKLSNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lKQotI2RlZmluZSBKRkZTMl9GX0lfTVRJTUUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfbXRpbWUpCi0jZGVmaW5lIEpGRlMyX0ZfSV9BVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9hdGltZSkKLSNlbmRpZgogCiAjZGVmaW5lIHNsZWVwX29uX3NwaW51bmxvY2sod3EsIHMpCQkJCVwKIAlkbyB7CQkJCQkJCVwKQEAgLTg0LDIzICs1MywyMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgamZmczJfaW5pdF9pbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQogewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwyKQogCWYtPmhpZ2hlc3RfdmVyc2lvbiA9IDA7CiAJZi0+ZnJhZ3RyZWUgPSBSQl9ST09UOwogCWYtPm1ldGFkYXRhID0gTlVMTDsKIAlmLT5kZW50cyA9IE5VTEw7CiAJZi0+ZmxhZ3MgPSAwOwogCWYtPnVzZXJjb21wciA9IDA7Ci0jZWxzZQotCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKLQlpbml0X01VVEVYX0xPQ0tFRCgmZi0+c2VtKTsKLSNlbmRpZgogfQogCisKICNkZWZpbmUgamZmczJfaXNfcmVhZG9ubHkoYykgKE9GTklfQlNfMlNGRkooYyktPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAKLSNpZiAoIWRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgJiYgIWRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MpCisjaWZuZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgorI2RlZmluZSBTRUNUT1JfQUREUih4KSAoICgodW5zaWduZWQgbG9uZykoeCkgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApCiAjZGVmaW5lIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICgxKQorI2RlZmluZSBqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpICgwKQogI2RlZmluZSBqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykgKDApCiAjZGVmaW5lIGpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoYyxqZWIpICgtRUlPKQogCkBAIC0xMTYsMTEgKzgzLDE2IEBACiAjZGVmaW5lIGpmZnMyX3didWZfdGltZW91dCBOVUxMCiAjZGVmaW5lIGpmZnMyX3didWZfcHJvY2VzcyBOVUxMCiAjZGVmaW5lIGpmZnMyX25vcl9lY2MoYykgKDApCisjZGVmaW5lIGpmZnMyX2RhdGFmbGFzaChjKSAoMCkKICNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChjKSAoMCkKICNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBqZmZzMl9kYXRhZmxhc2hfc2V0dXAoYykgKDApCisjZGVmaW5lIGpmZnMyX2RhdGFmbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlICgwKQogCiAjZWxzZSAvKiBOQU5EIGFuZC9vciBFQ0MnZCBOT1Igc3VwcG9ydCBwcmVzZW50ICovCiAKKyNkZWZpbmUgamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSAoYy0+d2J1ZiAhPSBOVUxMKQorI2RlZmluZSBTRUNUT1JfQUREUih4KSAoICgodW5zaWduZWQgbG9uZykoeCkgLyAodW5zaWduZWQgbG9uZykoYy0+c2VjdG9yX3NpemUpKSAqIGMtPnNlY3Rvcl9zaXplICkKICNkZWZpbmUgamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgKChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmICEoYy0+bXRkLT5mbGFncyAmIE1URF9FQ0MpKSB8fCBjLT5tdGQtPnR5cGUgPT0gTVREX1JBTSkKICNkZWZpbmUgamZmczJfY2xlYW5tYXJrZXJfb29iKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05BTkRGTEFTSCkKIApAQCAtMTQyLDE2ICsxMTQsMTYgQEAKIGludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiBpbnQgamZmczJfbmFuZF9mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiB2b2lkIGpmZnMyX25hbmRfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Ci0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKwogI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmIChjLT5tdGQtPmZsYWdzICYgTVREX0VDQykpCiBpbnQgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiB2b2lkIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Ci0jZWxzZQotI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpICgwKQotI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpICgwKQotI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoYykgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYgLyogTk9SIEVDQyAqLwotI2VuZGlmIC8qIE5BTkQgKi8KKworI2RlZmluZSBqZmZzMl9kYXRhZmxhc2goYykgKGMtPm10ZC0+dHlwZSA9PSBNVERfREFUQUZMQVNIKQoraW50IGpmZnMyX2RhdGFmbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX2RhdGFmbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKworI2VuZGlmIC8qIFdSSVRFQlVGRkVSICovCiAKIC8qIGVyYXNlLmMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9yZWFkLmMgYi9mcy9qZmZzMi9yZWFkLmMKaW5kZXggZWI0OTNkYy4uYzdmOTA2OCAxMDA2NDQKLS0tIGEvZnMvamZmczIvcmVhZC5jCisrKyBiL2ZzL2pmZnMyL3JlYWQuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogcmVhZC5jLHYgMS4zOCAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHJlYWQuYyx2IDEuMzkgMjAwNS8wMy8wMSAxMDozNDowMyBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC0yMTQsMzMgKzIxNCwzIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIENvcmUgZnVuY3Rpb24gdG8gcmVhZCBzeW1saW5rIHRhcmdldC4gKi8KLWNoYXIgKmpmZnMyX2dldGxpbmsoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQotewotCWNoYXIgKmJ1ZjsKLQlpbnQgcmV0OwotCi0JZG93bigmZi0+c2VtKTsKLQotCWlmICghZi0+bWV0YWRhdGEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBtZXRhZGF0YSBmb3Igc3ltbGluayBpbm9kZSAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOwotCQl1cCgmZi0+c2VtKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCWJ1ZiA9IGttYWxsb2MoZi0+bWV0YWRhdGEtPnNpemUrMSwgR0ZQX1VTRVIpOwotCWlmICghYnVmKSB7Ci0JCXVwKCZmLT5zZW0pOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0JYnVmW2YtPm1ldGFkYXRhLT5zaXplXT0wOwotCi0JcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgYnVmLCAwLCBmLT5tZXRhZGF0YS0+c2l6ZSk7Ci0KLQl1cCgmZi0+c2VtKTsKLQotCWlmIChyZXQpIHsKLQkJa2ZyZWUoYnVmKTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jIGIvZnMvamZmczIvcmVhZGlub2RlLmMKaW5kZXggYWNhNGEwYi4uNWIyYTgzNSAxMDA2NDQKLS0tIGEvZnMvamZmczIvcmVhZGlub2RlLmMKKysrIGIvZnMvamZmczIvcmVhZGlub2RlLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHJlYWRpbm9kZS5jLHYgMS4xMTcgMjAwNC8xMS8yMCAxODowNjo1NCBkd213MiBFeHAgJAorICogJElkOiByZWFkaW5vZGUuYyx2IDEuMTI1IDIwMDUvMDcvMTAgMTM6MTM6NTUgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtMTUxLDYgKzE1MSw5IEBACiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoaW5vICMldSwgZiAlcCwgZm4gJXApXG4iLCBmLT5pbm9jYWNoZS0+aW5vLCBmLCBmbikpOwogCisJaWYgKHVubGlrZWx5KCFmbi0+c2l6ZSkpCisJCXJldHVybiAwOworCiAJbmV3ZnJhZyA9IGpmZnMyX2FsbG9jX25vZGVfZnJhZygpOwogCWlmICh1bmxpa2VseSghbmV3ZnJhZykpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTU4LDExICsxNjEsNiBAQAogCUQyKHByaW50ayhLRVJOX0RFQlVHICJhZGRpbmcgbm9kZSAlMDR4LSUwNHggQDB4JTA4eCBvbiBmbGFzaCwgbmV3ZnJhZyAqJXBcbiIsCiAJCSAgZm4tPm9mcywgZm4tPm9mcytmbi0+c2l6ZSwgcmVmX29mZnNldChmbi0+cmF3KSwgbmV3ZnJhZykpOwogCQotCWlmICh1bmxpa2VseSghZm4tPnNpemUpKSB7Ci0JCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAluZXdmcmFnLT5vZnMgPSBmbi0+b2ZzOwogCW5ld2ZyYWctPnNpemUgPSBmbi0+c2l6ZTsKIAluZXdmcmFnLT5ub2RlID0gZm47CkBAIC01MDAsNyArNDk4LDkgQEAKIAkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCiAJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKQogewotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG5fbGlzdCwgKnRuOworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4gPSBOVUxMOworCXN0cnVjdCByYl9yb290IHRuX2xpc3Q7CisJc3RydWN0IHJiX25vZGUgKnJiLCAqcmVwbF9yYjsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkX2xpc3Q7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuID0gTlVMTDsKIAl1aW50MzJfdCBjcmM7CkBAIC01MjIsOSArNTIyLDEwIEBACiAJfQogCWYtPmRlbnRzID0gZmRfbGlzdDsKIAotCXdoaWxlICh0bl9saXN0KSB7Ci0JCXRuID0gdG5fbGlzdDsKKwlyYiA9IHJiX2ZpcnN0KCZ0bl9saXN0KTsKIAorCXdoaWxlIChyYikgeworCQl0biA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKTsKIAkJZm4gPSB0bi0+Zm47CiAKIAkJaWYgKGYtPm1ldGFkYXRhKSB7CkBAIC01NTYsNyArNTU3LDI5IEBACiAJCQltZGF0YV92ZXIgPSB0bi0+dmVyc2lvbjsKIAkJfQogCW5leHRfdG46Ci0JCXRuX2xpc3QgPSB0bi0+bmV4dDsKKwkJQlVHX09OKHJiLT5yYl9sZWZ0KTsKKwkJaWYgKHJiLT5yYl9wYXJlbnQgJiYgcmItPnJiX3BhcmVudC0+cmJfbGVmdCA9PSByYikgeworCQkJLyogV2Ugd2VyZSB0aGVuIGxlZnQtaGFuZCBjaGlsZCBvZiBvdXIgcGFyZW50LiBXZSBuZWVkCisJCQkgICB0byBtb3ZlIG91ciBvd24gcmlnaHQtaGFuZCBjaGlsZCBpbnRvIG91ciBwbGFjZS4gKi8KKwkJCXJlcGxfcmIgPSByYi0+cmJfcmlnaHQ7CisJCQlpZiAocmVwbF9yYikKKwkJCQlyZXBsX3JiLT5yYl9wYXJlbnQgPSByYi0+cmJfcGFyZW50OworCQl9IGVsc2UKKwkJCXJlcGxfcmIgPSBOVUxMOworCisJCXJiID0gcmJfbmV4dChyYik7CisKKwkJLyogUmVtb3ZlIHRoZSBzcGVudCB0biBmcm9tIHRoZSB0cmVlOyBkb24ndCBib3RoZXIgcmViYWxhbmNpbmcKKwkJICAgYnV0IHB1dCBvdXIgcmlnaHQtaGFuZCBjaGlsZCBpbiBvdXIgb3duIHBsYWNlLiAqLworCQlpZiAodG4tPnJiLnJiX3BhcmVudCkgeworCQkJaWYgKHRuLT5yYi5yYl9wYXJlbnQtPnJiX2xlZnQgPT0gJnRuLT5yYikKKwkJCQl0bi0+cmIucmJfcGFyZW50LT5yYl9sZWZ0ID0gcmVwbF9yYjsKKwkJCWVsc2UgaWYgKHRuLT5yYi5yYl9wYXJlbnQtPnJiX3JpZ2h0ID09ICZ0bi0+cmIpCisJCQkJdG4tPnJiLnJiX3BhcmVudC0+cmJfcmlnaHQgPSByZXBsX3JiOworCQkJZWxzZSBCVUcoKTsKKwkJfSBlbHNlIGlmICh0bi0+cmIucmJfcmlnaHQpCisJCQl0bi0+cmIucmJfcmlnaHQtPnJiX3BhcmVudCA9IE5VTEw7CisKIAkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0bik7CiAJfQogCUQxKGpmZnMyX3Nhbml0eWNoZWNrX2ZyYWd0cmVlKGYpKTsKQEAgLTYyMyw2ICs2NDYsNDAgQEAKIAkJICAgY2FzZS4gKi8KIAkJaWYgKCFqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+aXNpemUpKQogCQkJbGF0ZXN0X25vZGUtPmlzaXplID0gbGF0ZXN0X25vZGUtPmRzaXplOworCisJCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKSB7CisJCQkvKiBTeW1saW5rJ3MgaW5vZGUgZGF0YSBpcyB0aGUgdGFyZ2V0IHBhdGguIFJlYWQgaXQgYW5kCisJCQkgKiBrZWVwIGluIFJBTSB0byBmYWNpbGl0YXRlIHF1aWNrIGZvbGxvdyBzeW1saW5rIG9wZXJhdGlvbi4KKwkJCSAqIFdlIHVzZSBmLT5kZW50cyBmaWVsZCB0byBzdG9yZSB0aGUgdGFyZ2V0IHBhdGgsIHdoaWNoCisJCQkgKiBpcyBzb21ld2hhdCB1Z2x5LiAqLworCQkJZi0+ZGVudHMgPSBrbWFsbG9jKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghZi0+ZGVudHMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBvZiBtZW1vcnkgIgorCQkJCQkJImZvciB0aGUgc3ltbGluayB0YXJnZXQgcGF0aCBjYWNoZVxuIiwKKwkJCQkJCWplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkpOworCQkJCXVwKCZmLT5zZW0pOworCQkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJCisJCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdykgKyBzaXplb2YoKmxhdGVzdF9ub2RlKSwKKwkJCQkJCWplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSksICZyZXRsZW4sIChjaGFyICopZi0+ZGVudHMpOworCQkJCisJCQlpZiAocmV0ICB8fCByZXRsZW4gIT0gamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKSkgeworCQkJCWlmIChyZXRsZW4gIT0gamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKSkKKwkJCQkJcmV0ID0gLUVJTzsKKwkJCQlrZnJlZShmLT5kZW50cyk7CisJCQkJZi0+ZGVudHMgPSBOVUxMOworCQkJCXVwKCZmLT5zZW0pOworCQkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQkJCXJldHVybiAtcmV0OworCQkJfQorCisJCQkoKGNoYXIgKilmLT5kZW50cylbamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKV0gPSAnXDAnOworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGUoKTogc3ltbGluaydzIHRhcmdldCAnJXMnIGNhY2hlZFxuIiwKKwkJCQkJCShjaGFyICopZi0+ZGVudHMpKTsKKwkJfQorCQkKIAkJLyogZmFsbCB0aHJvdWdoLi4uICovCiAKIAljYXNlIFNfSUZCTEs6CkBAIC02NzIsNiArNzI5LDkgQEAKIAlkb3duKCZmLT5zZW0pOwogCWRlbGV0ZWQgPSBmLT5pbm9jYWNoZSAmJiAhZi0+aW5vY2FjaGUtPm5saW5rOwogCisJaWYgKGYtPmlub2NhY2hlICYmIGYtPmlub2NhY2hlLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tJTkcpCisJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX0NMRUFSSU5HKTsKKwogCWlmIChmLT5tZXRhZGF0YSkgewogCQlpZiAoZGVsZXRlZCkKIAkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmLT5tZXRhZGF0YS0+cmF3KTsKQEAgLTY4MCwxNiArNzQwLDI3IEBACiAKIAlqZmZzMl9raWxsX2ZyYWd0cmVlKCZmLT5mcmFndHJlZSwgZGVsZXRlZD9jOk5VTEwpOwogCi0JZmRzID0gZi0+ZGVudHM7CisJLyogRm9yIHN5bWxpbmsgaW5vZGVzIHdlIHVzIGYtPmRlbnRzIHRvIHN0b3JlIHRoZSB0YXJnZXQgcGF0aCBuYW1lICovCisJaWYgKFNfSVNMTksoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9tb2RlKSkgeworCQlpZiAoZi0+ZGVudHMpIHsKKwkJCWtmcmVlKGYtPmRlbnRzKTsKKwkJCWYtPmRlbnRzID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWZkcyA9IGYtPmRlbnRzOwogCi0Jd2hpbGUoZmRzKSB7Ci0JCWZkID0gZmRzOwotCQlmZHMgPSBmZC0+bmV4dDsKLQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCXdoaWxlKGZkcykgeworCQkJZmQgPSBmZHM7CisJCQlmZHMgPSBmZC0+bmV4dDsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQl9CiAJfQogCi0JaWYgKGYtPmlub2NhY2hlICYmIGYtPmlub2NhY2hlLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tJTkcpCisJaWYgKGYtPmlub2NhY2hlICYmIGYtPmlub2NhY2hlLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tJTkcpIHsKIAkJamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKGMsIGYtPmlub2NhY2hlLCBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCk7CisJCWlmIChmLT5pbm9jYWNoZS0+bm9kZXMgPT0gKHZvaWQgKilmLT5pbm9jYWNoZSkKKwkJCWpmZnMyX2RlbF9pbm9fY2FjaGUoYywgZi0+aW5vY2FjaGUpOworCX0KIAogCXVwKCZmLT5zZW0pOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc2Nhbi5jIGIvZnMvamZmczIvc2Nhbi5jCmluZGV4IGRlZDUzNTguLmI2MzE2MGYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3NjYW4uYworKysgYi9mcy9qZmZzMi9zY2FuLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHNjYW4uYyx2IDEuMTE1IDIwMDQvMTEvMTcgMTI6NTk6MDggZGVkZWtpbmQgRXhwICQKKyAqICRJZDogc2Nhbi5jLHYgMS4xMTkgMjAwNS8wMi8xNyAxNzo1MToxMyBkZWRla2luZCBFeHAgJAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIAotI2RlZmluZSBFTVBUWV9TQ0FOX1NJWkUgMTAyNAorI2RlZmluZSBERUZBVUxUX0VNUFRZX1NDQU5fU0laRSAxMDI0CiAKICNkZWZpbmUgRElSVFlfU1BBQ0UoeCkgZG8geyB0eXBlb2YoeCkgX3ggPSAoeCk7IFwKIAkJYy0+ZnJlZV9zaXplIC09IF94OyBjLT5kaXJ0eV9zaXplICs9IF94OyBcCkBAIC02OCwxMyArNjgsMjEgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG1pbl9mcmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQogewogCXVpbnQzMl90IG1pbiA9IDIgKiBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSk7Ci0jaWYgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTkFORCB8fCBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OT1JfRUNDCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSAmJiBtaW4gPCBjLT53YnVmX3BhZ2VzaXplKQogCQlyZXR1cm4gYy0+d2J1Zl9wYWdlc2l6ZTsKICNlbmRpZgogCXJldHVybiBtaW47CiAKIH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBFTVBUWV9TQ0FOX1NJWkUodWludDMyX3Qgc2VjdG9yX3NpemUpIHsKKwlpZiAoc2VjdG9yX3NpemUgPCBERUZBVUxUX0VNUFRZX1NDQU5fU0laRSkKKwkJcmV0dXJuIHNlY3Rvcl9zaXplOworCWVsc2UKKwkJcmV0dXJuIERFRkFVTFRfRU1QVFlfU0NBTl9TSVpFOworfQorCiBpbnQgamZmczJfc2Nhbl9tZWRpdW0oc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCiB7CiAJaW50IGksIHJldDsKQEAgLTIyMCw3ICsyMjgsNyBAQAogCQljLT5kaXJ0eV9zaXplIC09IGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZTsKIAkJYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplID0gMDsKIAl9Ci0jaWYgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTkFORCB8fCBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OT1JfRUNDCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSAmJiBjLT5uZXh0YmxvY2sgJiYgKGMtPm5leHRibG9jay0+ZnJlZV9zaXplICYgKGMtPndidWZfcGFnZXNpemUtMSkpKSB7CiAJCS8qIElmIHdlJ3JlIGdvaW5nIHRvIHN0YXJ0IHdyaXRpbmcgaW50byBhIGJsb2NrIHdoaWNoIGFscmVhZHkgCiAJCSAgIGNvbnRhaW5zIGRhdGEsIGFuZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGlzbid0IHBhZ2UtYWxpZ25lZCwKQEAgLTI4Niw3ICsyOTQsNyBAQAogCXVpbnQzMl90IGhkcl9jcmMsIGJ1Zl9vZnMsIGJ1Zl9sZW47CiAJaW50IGVycjsKIAlpbnQgbm9pc2UgPSAwOwotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJaW50IGNsZWFubWFya2VyZm91bmQgPSAwOwogI2VuZGlmCiAKQEAgLTI5NSw3ICszMDMsNyBAQAogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3NjYW5fZXJhc2VibG9jaygpOiBTY2FubmluZyBibG9jayBhdCAweCV4XG4iLCBvZnMpKTsKIAotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgewogCQlpbnQgcmV0ID0gamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcihjLCBqZWIpOwogCQlEMihwcmludGsoS0VSTl9OT1RJQ0UgImpmZnNfY2hlY2tfbmFuZF9jbGVhbm1hcmtlciByZXR1cm5lZCAlZFxuIixyZXQpKTsKQEAgLTMxNiw3ICszMjQsNyBAQAogCWlmICghYnVmX3NpemUpIHsKIAkJYnVmX2xlbiA9IGMtPnNlY3Rvcl9zaXplOwogCX0gZWxzZSB7Ci0JCWJ1Zl9sZW4gPSBFTVBUWV9TQ0FOX1NJWkU7CisJCWJ1Zl9sZW4gPSBFTVBUWV9TQ0FOX1NJWkUoYy0+c2VjdG9yX3NpemUpOwogCQllcnIgPSBqZmZzMl9maWxsX3NjYW5fYnVmKGMsIGJ1ZiwgYnVmX29mcywgYnVmX2xlbik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMzI2LDExICszMzQsMTEgQEAKIAlvZnMgPSAwOwogCiAJLyogU2NhbiBvbmx5IDRLaUIgb2YgMHhGRiBiZWZvcmUgZGVjbGFyaW5nIGl0J3MgZW1wdHkgKi8KLQl3aGlsZShvZnMgPCBFTVBUWV9TQ0FOX1NJWkUgJiYgKih1aW50MzJfdCAqKSgmYnVmW29mc10pID09IDB4RkZGRkZGRkYpCisJd2hpbGUob2ZzIDwgRU1QVFlfU0NBTl9TSVpFKGMtPnNlY3Rvcl9zaXplKSAmJiAqKHVpbnQzMl90ICopKCZidWZbb2ZzXSkgPT0gMHhGRkZGRkZGRikKIAkJb2ZzICs9IDQ7CiAKLQlpZiAob2ZzID09IEVNUFRZX1NDQU5fU0laRSkgewotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisJaWYgKG9mcyA9PSBFTVBUWV9TQ0FOX1NJWkUoYy0+c2VjdG9yX3NpemUpKSB7CisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKIAkJCS8qIHNjYW4gb29iLCB0YWtlIGNhcmUgb2YgY2xlYW5tYXJrZXIgKi8KIAkJCWludCByZXQgPSBqZmZzMl9jaGVja19vb2JfZW1wdHkoYywgamViLCBjbGVhbm1hcmtlcmZvdW5kKTsKQEAgLTM0Myw3ICszNTEsMTAgQEAKIAkJfQogI2VuZGlmCiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJCbG9jayBhdCAweCUwOHggaXMgZW1wdHkgKGVyYXNlZClcbiIsIGplYi0+b2Zmc2V0KSk7Ci0JCXJldHVybiBCTEtfU1RBVEVfQUxMRkY7CS8qIE9LIHRvIGVyYXNlIGlmIGFsbCBibG9ja3MgYXJlIGxpa2UgdGhpcyAqLworCQlpZiAoYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9PSAwKQorCQkJcmV0dXJuIEJMS19TVEFURV9DTEVBTk1BUktFUjsJLyogZG9uJ3QgYm90aGVyIHdpdGggcmUtZXJhc2UgKi8KKwkJZWxzZQorCQkJcmV0dXJuIEJMS19TVEFURV9BTExGRjsJLyogT0sgdG8gZXJhc2UgaWYgYWxsIGJsb2NrcyBhcmUgbGlrZSB0aGlzICovCiAJfQogCWlmIChvZnMpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWUgc3BhY2UgYXQgJTA4eCBlbmRzIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0LApAQCAtNDIyLDggKzQzMyw4IEBACiAJCQkvKiBJZiB3ZSdyZSBvbmx5IGNoZWNraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayB3aXRoIGEgY2xlYW5tYXJrZXIsCiAJCQkgICBiYWlsIG5vdyAqLwogCQkJaWYgKGJ1Zl9vZnMgPT0gamViLT5vZmZzZXQgJiYgamViLT51c2VkX3NpemUgPT0gUEFEKGMtPmNsZWFubWFya2VyX3NpemUpICYmIAotCQkJICAgIGMtPmNsZWFubWFya2VyX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSAmJiAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgewotCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIlZCBieXRlcyBhdCBzdGFydCBvZiBibG9jayBzZWVtcyBjbGVhbi4uLiBhc3N1bWluZyBhbGwgY2xlYW5cbiIsIEVNUFRZX1NDQU5fU0laRSkpOworCQkJICAgIGMtPmNsZWFubWFya2VyX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSAmJiAhamViLT5maXJzdF9ub2RlLT5uZXh0X3BoeXMpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiJWQgYnl0ZXMgYXQgc3RhcnQgb2YgYmxvY2sgc2VlbXMgY2xlYW4uLi4gYXNzdW1pbmcgYWxsIGNsZWFuXG4iLCBFTVBUWV9TQ0FOX1NJWkUoYy0+c2VjdG9yX3NpemUpKSk7CiAJCQkJcmV0dXJuIEJMS19TVEFURV9DTEVBTk1BUktFUjsKIAkJCX0KIApAQCAtNjE4LDcgKzYyOSw3IEBACiAJfQogCiAJaWYgKChqZWItPnVzZWRfc2l6ZSArIGplYi0+dW5jaGVja2VkX3NpemUpID09IFBBRChjLT5jbGVhbm1hcmtlcl9zaXplKSAmJiAhamViLT5kaXJ0eV9zaXplIAotCQkmJiAoIWplYi0+Zmlyc3Rfbm9kZSB8fCAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgKQorCQkmJiAoIWplYi0+Zmlyc3Rfbm9kZSB8fCAhamViLT5maXJzdF9ub2RlLT5uZXh0X3BoeXMpICkKIAkJcmV0dXJuIEJMS19TVEFURV9DTEVBTk1BUktFUjsKIAkJCiAJLyogbW92ZSBibG9ja3Mgd2l0aCBtYXggNCBieXRlIGRpcnR5IHNwYWNlIHRvIGNsZWFubGlzdCAqLwkKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N1cGVyLmMgYi9mcy9qZmZzMi9zdXBlci5jCmluZGV4IDZiMmE0NDEuLmFhZjk0NzUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3N1cGVyLmMKKysrIGIvZnMvamZmczIvc3VwZXIuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogc3VwZXIuYyx2IDEuMTA0IDIwMDQvMTEvMjMgMTU6Mzc6MzEgZ2xlaXhuZXIgRXhwICQKKyAqICRJZDogc3VwZXIuYyx2IDEuMTA3IDIwMDUvMDcvMTIgMTY6Mzc6MDggZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtMTQwLDYgKzE0MCwxNSBAQAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2JfbXRkKCk6IE5ldyBzdXBlcmJsb2NrIGZvciBkZXZpY2UgJWQgKFwiJXNcIilcbiIsCiAJCSAgbXRkLT5pbmRleCwgbXRkLT5uYW1lKSk7CiAKKwkvKiBJbml0aWFsaXplIEpGRlMyIHN1cGVyYmxvY2sgbG9ja3MsIHRoZSBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIHdpbGwgYmUKKwkgKiBkb25lIGxhdGVyICovCisJaW5pdF9NVVRFWCgmYy0+YWxsb2Nfc2VtKTsKKwlpbml0X01VVEVYKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+ZXJhc2Vfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+aW5vY2FjaGVfd3EpOworCXNwaW5fbG9ja19pbml0KCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjLT5pbm9jYWNoZV9sb2NrKTsKKwogCXNiLT5zX29wID0gJmpmZnMyX3N1cGVyX29wZXJhdGlvbnM7CiAJc2ItPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PQVRJTUU7CiAKQEAgLTI3MCw4ICsyNzksNiBAQAogCiAJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBqZmZzMl9wdXRfc3VwZXIoKVxuIikpOwogCi0JaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQotCQlqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoYyk7CiAJZG93bigmYy0+YWxsb2Nfc2VtKTsKIAlqZmZzMl9mbHVzaF93YnVmX3BhZChjKTsKIAl1cCgmYy0+YWxsb2Nfc2VtKTsKQEAgLTI5Miw2ICsyOTksOCBAQAogc3RhdGljIHZvaWQgamZmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoYyk7CiAJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzYik7CiAJcHV0X210ZF9kZXZpY2UoYy0+bXRkKTsKIAlrZnJlZShjKTsKQEAgLTMwOSw3ICszMTgsNyBAQAogCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJKRkZTMiB2ZXJzaW9uIDIuMi4iCi0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAkgICAgICAgIiAoTkFORCkiCiAjZW5kaWYKIAkgICAgICAgIiAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy5cbiIpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3ltbGluay5jIGIvZnMvamZmczIvc3ltbGluay5jCmluZGV4IDdiMTgyMGQuLjY1YWI2YjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3N5bWxpbmsuYworKysgYi9mcy9qZmZzMi9zeW1saW5rLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHN5bWxpbmsuYyx2IDEuMTQgMjAwNC8xMS8xNiAyMDozNjoxMiBkd213MiBFeHAgJAorICogJElkOiBzeW1saW5rLmMsdiAxLjE2IDIwMDUvMDMvMDEgMTA6NTA6NDggZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtMTksMjcgKzE5LDQ1IEBACiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIAogc3RhdGljIGludCBqZmZzMl9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKLXN0YXRpYyB2b2lkIGpmZnMyX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPQogewkKIAkucmVhZGxpbmsgPQlnZW5lcmljX3JlYWRsaW5rLAogCS5mb2xsb3dfbGluayA9CWpmZnMyX2ZvbGxvd19saW5rLAotCS5wdXRfbGluayA9CWpmZnMyX3B1dF9saW5rLAogCS5zZXRhdHRyID0JamZmczJfc2V0YXR0cgogfTsKIAogc3RhdGljIGludCBqZmZzMl9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQlidWYgPSBqZmZzMl9nZXRsaW5rKEpGRlMyX1NCX0lORk8oZGVudHJ5LT5kX2lub2RlLT5pX3NiKSwgSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpKTsKLQluZF9zZXRfbGluayhuZCwgYnVmKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oZGVudHJ5LT5kX2lub2RlKTsKKwkKKwkvKgorCSAqIFdlIGRvbid0IGFjcXVpcmUgdGhlIGYtPnNlbSBtdXRleCBoZXJlIHNpbmNlIHRoZSBvbmx5IGRhdGEgd2UKKwkgKiB1c2UgaXMgZi0+ZGVudHMgd2hpY2ggaW4gY2FzZSBvZiB0aGUgc3ltbGluayBpbm9kZSBwb2ludHMgdG8gdGhlCisJICogc3ltbGluaydzIHRhcmdldCBwYXRoLgorCSAqCisJICogMS4gSWYgd2UgYXJlIGhlcmUgdGhlIGlub2RlIGhhcyBhbHJlYWR5IGJ1aWx0IGFuZCBmLT5kZW50cyBoYXMKKwkgKiB0byBwb2ludCB0byB0aGUgdGFyZ2V0IHBhdGguCisJICogMi4gTm9ib2R5IHVzZXMgZi0+ZGVudHMgKGlmIHRoZSBpbm9kZSBpcyBzeW1saW5rJ3MgaW5vZGUpLiBUaGUKKwkgKiBleGNlcHRpb24gaXMgaW5vZGUgZnJlZWluZyBmdW5jdGlvbiB3aGljaCBmcmVlcyBmLT5kZW50cy4gQnV0CisJICogaXQgY2FuJ3QgYmUgY2FsbGVkIHdoaWxlIHdlIGFyZSBoZXJlIGFuZCBiZWZvcmUgVkZTIGhhcworCSAqIHN0b3BwZWQgdXNpbmcgb3VyIGYtPmRlbnRzIHN0cmluZyB3aGljaCB3ZSBwcm92aWRlIGJ5IG1lYW5zIG9mCisJICogbmRfc2V0X2xpbmsoKSBjYWxsLgorCSAqLworCQorCWlmICghZi0+ZGVudHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzMl9mb2xsb3dfbGluaygpOiBjYW4ndCBmaW5kIHN5bWxpbmsgdGFlcmdldFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZm9sbG93X2xpbmsoKTogdGFyZ2V0IHBhdGggaXMgJyVzJ1xuIiwgKGNoYXIgKikgZi0+ZGVudHMpKTsKKworCW5kX3NldF9saW5rKG5kLCAoY2hhciAqKWYtPmRlbnRzKTsKKwkKKwkvKgorCSAqIFdlIHVubG9jayB0aGUgZi0+c2VtIG11dGV4IGJ1dCBWRlMgd2lsbCB1c2UgdGhlIGYtPmRlbnRzIHN0cmluZy4gVGhpcyBpcyBzYWZlCisJICogc2luY2UgdGhlIG9ubHkgd2F5IHRoYXQgbWF5IGNhdXNlIGYtPmRlbnRzIHRvIGJlIGNoYW5nZWQgaXMgaXB1dCgpIG9wZXJhdGlvbi4KKwkgKiBCdXQgVkZTIHdpbGwgbm90IHVzZSBmLT5kZW50cyBhZnRlciBpcHV0KCkgaGFzIGJlZW4gY2FsbGVkLgorCSAqLwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBqZmZzMl9wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7Ci0JaWYgKCFJU19FUlIocykpCi0JCWtmcmVlKHMpOwotfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvd2J1Zi5jIGIvZnMvamZmczIvd2J1Zi5jCmluZGV4IGM4MTI4MDYuLjk5NmQ5MjIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3didWYuYworKysgYi9mcy9qZmZzMi93YnVmLmMKQEAgLTksNyArOSw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHdidWYuYyx2IDEuODIgMjAwNC8xMS8yMCAyMjowODozMSBkd213MiBFeHAgJAorICogJElkOiB3YnVmLmMsdiAxLjkyIDIwMDUvMDQvMDUgMTI6NTE6NTQgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtODMsNyArODMsNyBAQAogCXN0cnVjdCBqZmZzMl9pbm9kaXJ0eSAqbmV3OwogCiAJLyogTWFyayB0aGUgc3VwZXJibG9jayBkaXJ0eSBzbyB0aGF0IGt1cGRhdGVkIHdpbGwgZmx1c2guLi4gKi8KLQlPRk5JX0JTXzJTRkZKKGMpLT5zX2RpcnQgPSAxOworCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKIAogCWlmIChqZmZzMl93YnVmX3BlbmRpbmdfZm9yX2lubyhjLCBpbm8pKQogCQlyZXR1cm47CkBAIC0xMzAsNyArMTMwLDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBqZmZzMl9ibG9ja19yZWZpbGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCisjZGVmaW5lIFJFRklMRV9OT1RFTVBUWSAwCisjZGVmaW5lIFJFRklMRV9BTllXQVkgICAxCisKK3N0YXRpYyB2b2lkIGpmZnMyX2Jsb2NrX3JlZmlsZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgaW50IGFsbG93X2VtcHR5KQogewogCUQxKHByaW50aygiQWJvdXQgdG8gcmVmaWxlIGJhZCBibG9jayBhdCAlMDh4XG4iLCBqZWItPm9mZnNldCkpOwogCkBAIC0xNDQsNyArMTQ3LDcgQEAKIAkJRDEocHJpbnRrKCJSZWZpbGluZyBibG9jayBhdCAlMDh4IHRvIGJhZF91c2VkX2xpc3RcbiIsIGplYi0+b2Zmc2V0KSk7CiAJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5iYWRfdXNlZF9saXN0KTsKIAl9IGVsc2UgewotCQlCVUcoKTsKKwkJQlVHX09OKGFsbG93X2VtcHR5ID09IFJFRklMRV9OT1RFTVBUWSk7CiAJCS8qIEl0IGhhcyB0byBoYXZlIGhhZCBzb21lIG5vZGVzIG9yIHdlIGNvdWxkbid0IGJlIGhlcmUgKi8KIAkJRDEocHJpbnRrKCJSZWZpbGluZyBibG9jayBhdCAlMDh4IHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKIAkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CkBAIC0xNzksNyArMTgyLDcgQEAKIAogCWplYiA9ICZjLT5ibG9ja3NbYy0+d2J1Zl9vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CiAKLQlqZmZzMl9ibG9ja19yZWZpbGUoYywgamViKTsKKwlqZmZzMl9ibG9ja19yZWZpbGUoYywgamViLCBSRUZJTEVfTk9URU1QVFkpOwogCiAJLyogRmluZCB0aGUgZmlyc3Qgbm9kZSB0byBiZSByZWNvdmVyZWQsIGJ5IHNraXBwaW5nIG92ZXIgZXZlcnkKIAkgICBub2RlIHdoaWNoIGVuZHMgYmVmb3JlIHRoZSB3YnVmIHN0YXJ0cywgb3Igd2hpY2ggaXMgb2Jzb2xldGUuICovCkBAIC0yNjQsMTcgKzI2NywxNiBAQAogCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgZW5kLXN0YXJ0LCAmb2ZzLCAmbGVuKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3Igd2J1ZiByZWNvdmVyeS4gRGF0YSBsb3NzIGVuc3Vlcy5cbiIpOwotCQlpZiAoYnVmKQotCQkJa2ZyZWUoYnVmKTsKKwkJa2ZyZWUoYnVmKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoZW5kLXN0YXJ0ID49IGMtPndidWZfcGFnZXNpemUpIHsKLQkJLyogTmVlZCB0byBkbyBhbm90aGVyIHdyaXRlIGltbWVkaWF0ZWx5LiBUaGlzLCBidHcsCi0JCSBtZWFucyB0aGF0IHdlJ2xsIGJlIHdyaXRpbmcgZnJvbSAnYnVmJyBhbmQgbm90IGZyb20KLQkJIHRoZSB3YnVmLiBTaW5jZSBpZiB3ZSdyZSB3cml0aW5nIGZyb20gdGhlIHdidWYgdGhlcmUKLQkJIHdvbid0IGJlIG1vcmUgdGhhbiBhIHdidWYgZnVsbCBvZiBkYXRhLCBub3cgd2lsbAotCQkgdGhlcmU/IDopICovCi0KKwkJLyogTmVlZCB0byBkbyBhbm90aGVyIHdyaXRlIGltbWVkaWF0ZWx5LCBidXQgaXQncyBwb3NzaWJsZQorCQkgICB0aGF0IHRoaXMgaXMganVzdCBiZWNhdXNlIHRoZSB3YnVmIGl0c2VsZiBpcyBjb21wbGV0ZWx5CisJCSAgIGZ1bGwsIGFuZCB0aGVyZSdzIG5vdGhpbmcgZWFybGllciByZWFkIGJhY2sgZnJvbSB0aGUgCisJCSAgIGZsYXNoLiBIZW5jZSAnYnVmJyBpc24ndCBuZWNlc3NhcmlseSB3aGF0IHdlJ3JlIHdyaXRpbmcgCisJCSAgIGZyb20uICovCisJCXVuc2lnbmVkIGNoYXIgKnJld3JpdGVfYnVmID0gYnVmPzpjLT53YnVmOwogCQl1aW50MzJfdCB0b3dyaXRlID0gKGVuZC1zdGFydCkgLSAoKGVuZC1zdGFydCklYy0+d2J1Zl9wYWdlc2l6ZSk7CiAKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIldyaXRlIDB4JXggYnl0ZXMgYXQgMHglMDh4IGluIHdidWYgcmVjb3ZlclxuIiwKQEAgLTI5Miw5ICsyOTQsOSBAQAogI2VuZGlmCiAJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCiAJCQlyZXQgPSBjLT5tdGQtPndyaXRlX2VjYyhjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwKLQkJCQkJCWJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCQkJCQlyZXdyaXRlX2J1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CiAJCWVsc2UKLQkJCXJldCA9IGMtPm10ZC0+d3JpdGUoYy0+bXRkLCBvZnMsIHRvd3JpdGUsICZyZXRsZW4sIGJ1Zik7CisJCQlyZXQgPSBjLT5tdGQtPndyaXRlKGMtPm10ZCwgb2ZzLCB0b3dyaXRlLCAmcmV0bGVuLCByZXdyaXRlX2J1Zik7CiAKIAkJaWYgKHJldCB8fCByZXRsZW4gIT0gdG93cml0ZSkgewogCQkJLyogQXJnaC4gV2UgdHJpZWQuIFJlYWxseSB3ZSBkaWQuICovCkBAIC0zMjEsMTAgKzMyMywxMCBAQAogCiAJCWMtPndidWZfbGVuID0gKGVuZCAtIHN0YXJ0KSAtIHRvd3JpdGU7CiAJCWMtPndidWZfb2ZzID0gb2ZzICsgdG93cml0ZTsKLQkJbWVtY3B5KGMtPndidWYsIGJ1ZiArIHRvd3JpdGUsIGMtPndidWZfbGVuKTsKKwkJbWVtbW92ZShjLT53YnVmLCByZXdyaXRlX2J1ZiArIHRvd3JpdGUsIGMtPndidWZfbGVuKTsKIAkJLyogRG9uJ3QgbXVjayBhYm91dCB3aXRoIGMtPndidWZfaW5vZGVzLiBGYWxzZSBwb3NpdGl2ZXMgYXJlIGhhcm1sZXNzLiAqLwotCi0JCWtmcmVlKGJ1Zik7CisJCWlmIChidWYpCisJCQlrZnJlZShidWYpOwogCX0gZWxzZSB7CiAJCS8qIE9LLCBub3cgd2UncmUgbGVmdCB3aXRoIHRoZSBkcmVncyBpbiB3aGljaGV2ZXIgYnVmZmVyIHdlJ3JlIHVzaW5nICovCiAJCWlmIChidWYpIHsKQEAgLTQxMyw5ICs0MTUsOSBAQAogCWludCByZXQ7CiAJc2l6ZV90IHJldGxlbjsKIAotCS8qIE5vdGhpbmcgdG8gZG8gaWYgbm90IE5BTkQgZmxhc2guIEluIHBhcnRpY3VsYXIsIHdlIHNob3VsZG4ndAorCS8qIE5vdGhpbmcgdG8gZG8gaWYgbm90IHdyaXRlLWJ1ZmZlcmluZyB0aGUgZmxhc2guIEluIHBhcnRpY3VsYXIsIHdlIHNob3VsZG4ndAogCSAgIGRlbF90aW1lcigpIHRoZSB0aW1lciB3ZSBuZXZlciBpbml0aWFsaXNlZC4gKi8KLQlpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpCisJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gMDsKIAogCWlmICghZG93bl90cnlsb2NrKCZjLT5hbGxvY19zZW0pKSB7CkBAIC00MjQsNyArNDI2LDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYoIWMtPndidWYgfHwgIWMtPndidWZfbGVuKQorCWlmICghYy0+d2J1Zl9sZW4pCS8qIGFscmVhZHkgY2hlY2tlZCBjLT53YnVmIGFib3ZlICovCiAJCXJldHVybiAwOwogCiAJLyogY2xhaW0gcmVtYWluaW5nIHNwYWNlIG9uIHRoZSBwYWdlCkBAIC00MzMsNyArNDM1LDcgQEAKIAkgICBpZiB3ZSBoYXZlIGEgc3dpdGNoIHRvIG5leHQgcGFnZSwgd2Ugd2lsbCBub3QgaGF2ZQogCSAgIGVub3VnaCByZW1haW5pbmcgc3BhY2UgZm9yIHRoaXMuIAogCSovCi0JaWYgKHBhZCkgeworCWlmIChwYWQgJiYgIWpmZnMyX2RhdGFmbGFzaChjKSkgewogCQljLT53YnVmX2xlbiA9IFBBRChjLT53YnVmX2xlbik7CiAKIAkJLyogUGFkIHdpdGggSkZGUzJfRElSVFlfQklUTUFTSyBpbml0aWFsbHkuICB0aGlzIGhlbHBzIG91dCBFQ0MnZCBOT1IKQEAgLTQ4NCw3ICs0ODYsNyBAQAogCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAogCS8qIEFkanVzdCBmcmVlIHNpemUgb2YgdGhlIGJsb2NrIGlmIHdlIHBhZGRlZC4gKi8KLQlpZiAocGFkKSB7CisJaWYgKHBhZCAmJiAhamZmczJfZGF0YWZsYXNoKGMpKSB7CiAJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CiAKIAkJamViID0gJmMtPmJsb2Nrc1tjLT53YnVmX29mcyAvIGMtPnNlY3Rvcl9zaXplXTsKQEAgLTUzMiw2ICs1MzQsOSBAQAogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsdXNoX3didWZfZ2MoKSBjYWxsZWQgZm9yIGlubyAjJXUuLi5cbiIsIGlubykpOwogCisJaWYgKCFjLT53YnVmKQorCQlyZXR1cm4gMDsKKwogCWRvd24oJmMtPmFsbG9jX3NlbSk7CiAJaWYgKCFqZmZzMl93YnVmX3BlbmRpbmdfZm9yX2lubyhjLCBpbm8pKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm8gIyVkIG5vdCBwZW5kaW5nIGluIHdidWYuIFJldHVybmluZ1xuIiwgaW5vKSk7CkBAIC01NDcsNiArNTUyLDEwIEBACiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mbHVzaF93YnVmX2djKCkgcGFkZGluZy4gTm90IGZpbmlzaGVkIGNoZWNraW5nXG4iKSk7CiAJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKIAkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKKwkJLyogcmV0cnkgZmx1c2hpbmcgd2J1ZiBpbiBjYXNlIGpmZnMyX3didWZfcmVjb3ZlcgorCQkgICBsZWZ0IHNvbWUgZGF0YSBpbiB0aGUgd2J1ZiAqLworCQlpZiAocmV0KQorCQkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKIAkJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKIAl9IGVsc2Ugd2hpbGUgKG9sZF93YnVmX2xlbiAmJgogCQkgICAgICBvbGRfd2J1Zl9vZnMgPT0gYy0+d2J1Zl9vZnMpIHsKQEAgLTU2MSw2ICs1NzAsMTAgQEAKIAkJCWRvd24oJmMtPmFsbG9jX3NlbSk7CiAJCQlkb3duX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAJCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX0FDQ09VTlRJTkcpOworCQkJLyogcmV0cnkgZmx1c2hpbmcgd2J1ZiBpbiBjYXNlIGpmZnMyX3didWZfcmVjb3ZlcgorCQkJICAgbGVmdCBzb21lIGRhdGEgaW4gdGhlIHdidWYgKi8KKwkJCWlmIChyZXQpCisJCQkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKIAkJCXVwX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAJCQlicmVhazsKIAkJfQpAQCAtNTc4LDE1ICs1OTEsMjcgQEAKIHsKIAlpbnQgcmV0OwogCisJaWYgKCFjLT53YnVmKQorCQlyZXR1cm4gMDsKKwogCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKIAlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX05PQUNDT1VOVCk7CisJLyogcmV0cnkgLSBtYXliZSB3YnVmIHJlY292ZXIgbGVmdCBzb21lIGRhdGEgaW4gd2J1Zi4gKi8KKwlpZiAocmV0KQorCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX05PQUNDT1VOVCk7CiAJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKIAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKKyNkZWZpbmUgUEFHRV9ESVYoeCkgKCAoKHVuc2lnbmVkIGxvbmcpKHgpIC8gKHVuc2lnbmVkIGxvbmcpKGMtPndidWZfcGFnZXNpemUpKSAqICh1bnNpZ25lZCBsb25nKShjLT53YnVmX3BhZ2VzaXplKSApCisjZGVmaW5lIFBBR0VfTU9EKHgpICggKHVuc2lnbmVkIGxvbmcpKHgpICUgKHVuc2lnbmVkIGxvbmcpKGMtPndidWZfcGFnZXNpemUpICkKKyNlbHNlCiAjZGVmaW5lIFBBR0VfRElWKHgpICggKHgpICYgKH4oYy0+d2J1Zl9wYWdlc2l6ZSAtIDEpKSApCiAjZGVmaW5lIFBBR0VfTU9EKHgpICggKHgpICYgKGMtPndidWZfcGFnZXNpemUgLSAxKSApCisjZW5kaWYKKwogaW50IGpmZnMyX2ZsYXNoX3dyaXRldihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgY29uc3Qgc3RydWN0IGt2ZWMgKmludmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbiwgdWludDMyX3QgaW5vKQogewogCXN0cnVjdCBrdmVjIG91dHZlY3NbM107CkBAIC02MDEsNyArNjI2LDcgQEAKIAl1aW50MzJfdCBvdXR2ZWNfdG8gPSB0bzsKIAogCS8qIElmIG5vdCBOQU5EIGZsYXNoLCBkb24ndCBib3RoZXIgKi8KLQlpZiAoIWMtPndidWYpCisJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gamZmczJfZmxhc2hfZGlyZWN0X3dyaXRldihjLCBpbnZlY3MsIGNvdW50LCB0bywgcmV0bGVuKTsKIAkKIAlkb3duX3dyaXRlKCZjLT53YnVmX3NlbSk7CkBAIC02MzAsNyArNjU1LDcgQEAKIAkgICBlcmFzZSBibG9jay4gQW55dGhpbmcgZWxzZSwgYW5kIHlvdSBkaWUuCiAJICAgTmV3IGJsb2NrIHN0YXJ0cyBhdCB4eHgwMDBjICgwLWIgPSBibG9jayBoZWFkZXIpCiAJKi8KLQlpZiAoICh0byAmIH4oYy0+c2VjdG9yX3NpemUtMSkpICE9IChjLT53YnVmX29mcyAmIH4oYy0+c2VjdG9yX3NpemUtMSkpICkgeworCWlmIChTRUNUT1JfQUREUih0bykgIT0gU0VDVE9SX0FERFIoYy0+d2J1Zl9vZnMpKSB7CiAJCS8qIEl0J3MgYSB3cml0ZSB0byBhIG5ldyBibG9jayAqLwogCQlpZiAoYy0+d2J1Zl9sZW4pIHsKIAkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mbGFzaF93cml0ZXYoKSB0byAweCVseCBjYXVzZXMgZmx1c2ggb2Ygd2J1ZiBhdCAweCUwOHhcbiIsICh1bnNpZ25lZCBsb25nKXRvLCBjLT53YnVmX29mcykpOwpAQCAtNzYyLDkgKzc4NywxOCBAQAogCQkKIAkJaWYgKHJldCA8IDAgfHwgd2J1Zl9yZXRsZW4gIT0gUEFHRV9ESVYodG90bGVuKSkgewogCQkJLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHByb2JsZW0sCi0JCQkgICBjLT53YnVmIGlzIGVtcHR5LiAKKwkJCSAgIGMtPndidWYgaXMgZW1wdHkuIEhvd2V2ZXIgcmVmaWxlIG5leHRibG9jayB0byBhdm9pZAorCQkJICAgd3JpdGluZyBhZ2FpbiB0byBzYW1lIGFkZHJlc3MuCiAJCQkqLwotCQkJKnJldGxlbiA9IGRvbmVsZW47CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwkJCWplYiA9ICZjLT5ibG9ja3Nbb3V0dmVjX3RvIC8gYy0+c2VjdG9yX3NpemVdOworCQkJamZmczJfYmxvY2tfcmVmaWxlKGMsIGplYiwgUkVGSUxFX0FOWVdBWSk7CisKKwkJCSpyZXRsZW4gPSAwOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJCkBAIC04MTksNyArODUzLDcgQEAKIHsKIAlzdHJ1Y3Qga3ZlYyB2ZWNzWzFdOwogCi0JaWYgKGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpKQorCWlmICghamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkKIAkJcmV0dXJuIGMtPm10ZC0+d3JpdGUoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOwogCiAJdmVjc1swXS5pb3ZfYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKQEAgLTgzNSwzOSArODY5LDM4IEBACiAJbG9mZl90CW9yYmYgPSAwLCBvd2JmID0gMCwgbHdiZiA9IDA7CiAJaW50CXJldDsKIAotCS8qIFJlYWQgZmxhc2ggKi8KLQlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpKSB7Ci0JCWRvd25fcmVhZCgmYy0+d2J1Zl9zZW0pOwotCi0JCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCi0JCQlyZXQgPSBjLT5tdGQtPnJlYWRfZWNjKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKLQkJZWxzZQotCQkJcmV0ID0gYy0+bXRkLT5yZWFkKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKLQotCQlpZiAoIChyZXQgPT0gLUVCQURNU0cpICYmICgqcmV0bGVuID09IGxlbikgKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdGQtPnJlYWQoMHglenggYnl0ZXMgZnJvbSAweCVsbHgpIHJldHVybmVkIEVDQyBlcnJvclxuIiwKLQkJCSAgICAgICBsZW4sIG9mcyk7Ci0JCQkvKiAKLQkJCSAqIFdlIGhhdmUgdGhlIHJhdyBkYXRhIHdpdGhvdXQgRUNDIGNvcnJlY3Rpb24gaW4gdGhlIGJ1ZmZlciwgbWF5YmUgCi0JCQkgKiB3ZSBhcmUgbHVja3kgYW5kIGFsbCBkYXRhIG9yIHBhcnRzIGFyZSBjb3JyZWN0LiBXZSBjaGVjayB0aGUgbm9kZS4KLQkJCSAqIElmIGRhdGEgYXJlIGNvcnJ1cHRlZCBub2RlIGNoZWNrIHdpbGwgc29ydCBpdCBvdXQuCi0JCQkgKiBXZSBrZWVwIHRoaXMgYmxvY2ssIGl0IHdpbGwgZmFpbCBvbiB3cml0ZSBvciBlcmFzZSBhbmQgdGhlIHdlCi0JCQkgKiBtYXJrIGl0IGJhZC4gT3Igc2hvdWxkIHdlIGRvIHRoYXQgbm93PyBCdXQgd2Ugc2hvdWxkIGdpdmUgaGltIGEgY2hhbmNlLgotCQkJICogTWF5YmUgd2UgaGFkIGEgc3lzdGVtIGNyYXNoIG9yIHBvd2VyIGxvc3MgYmVmb3JlIHRoZSBlY2Mgd3JpdGUgb3IgIAotCQkJICogYSBlcmFzZSB3YXMgY29tcGxldGVkLgotCQkJICogU28gd2UgcmV0dXJuIHN1Y2Nlc3MuIDopCi0JCQkgKi8KLQkJIAlyZXQgPSAwOwotCQkgfQkKLQl9IGVsc2UKKwlpZiAoIWpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpCiAJCXJldHVybiBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOwogCisJLyogUmVhZCBmbGFzaCAqLworCWRvd25fcmVhZCgmYy0+d2J1Zl9zZW0pOworCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCXJldCA9IGMtPm10ZC0+cmVhZF9lY2MoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYsIE5VTEwsIGMtPm9vYmluZm8pOworCWVsc2UKKwkJcmV0ID0gYy0+bXRkLT5yZWFkKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKKworCWlmICggKHJldCA9PSAtRUJBRE1TRykgJiYgKCpyZXRsZW4gPT0gbGVuKSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRkLT5yZWFkKDB4JXp4IGJ5dGVzIGZyb20gMHglbGx4KSByZXR1cm5lZCBFQ0MgZXJyb3JcbiIsCisJCSAgICAgICBsZW4sIG9mcyk7CisJCS8qIAorCQkgKiBXZSBoYXZlIHRoZSByYXcgZGF0YSB3aXRob3V0IEVDQyBjb3JyZWN0aW9uIGluIHRoZSBidWZmZXIsIG1heWJlIAorCQkgKiB3ZSBhcmUgbHVja3kgYW5kIGFsbCBkYXRhIG9yIHBhcnRzIGFyZSBjb3JyZWN0LiBXZSBjaGVjayB0aGUgbm9kZS4KKwkJICogSWYgZGF0YSBhcmUgY29ycnVwdGVkIG5vZGUgY2hlY2sgd2lsbCBzb3J0IGl0IG91dC4KKwkJICogV2Uga2VlcCB0aGlzIGJsb2NrLCBpdCB3aWxsIGZhaWwgb24gd3JpdGUgb3IgZXJhc2UgYW5kIHRoZSB3ZQorCQkgKiBtYXJrIGl0IGJhZC4gT3Igc2hvdWxkIHdlIGRvIHRoYXQgbm93PyBCdXQgd2Ugc2hvdWxkIGdpdmUgaGltIGEgY2hhbmNlLgorCQkgKiBNYXliZSB3ZSBoYWQgYSBzeXN0ZW0gY3Jhc2ggb3IgcG93ZXIgbG9zcyBiZWZvcmUgdGhlIGVjYyB3cml0ZSBvciAgCisJCSAqIGEgZXJhc2Ugd2FzIGNvbXBsZXRlZC4KKwkJICogU28gd2UgcmV0dXJuIHN1Y2Nlc3MuIDopCisJCSAqLworCSAJcmV0ID0gMDsKKwl9CQorCiAJLyogaWYgbm8gd3JpdGVidWZmZXIgYXZhaWxhYmxlIG9yIHdyaXRlIGJ1ZmZlciBlbXB0eSwgcmV0dXJuICovCiAJaWYgKCFjLT53YnVmX3BhZ2VzaXplIHx8ICFjLT53YnVmX2xlbikKIAkJZ290byBleGl0OwogCiAJLyogaWYgd2UgcmVhZCBpbiBhIGRpZmZlcmVudCBibG9jaywgcmV0dXJuICovCi0JaWYgKCAob2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgIT0gKGMtPndidWZfb2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgKSAKKwlpZiAoU0VDVE9SX0FERFIob2ZzKSAhPSBTRUNUT1JfQUREUihjLT53YnVmX29mcykpCiAJCWdvdG8gZXhpdDsKIAogCWlmIChvZnMgPj0gYy0+d2J1Zl9vZnMpIHsKQEAgLTExNjEsNyArMTE5NCwyNyBAQAogCWtmcmVlKGMtPndidWYpOwogfQogCi0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKK2ludCBqZmZzMl9kYXRhZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKKwljLT5jbGVhbm1hcmtlcl9zaXplID0gMDsJCS8qIE5vIGNsZWFubWFya2VycyBuZWVkZWQgKi8KKwkKKwkvKiBJbml0aWFsaXplIHdyaXRlIGJ1ZmZlciAqLworCWluaXRfcndzZW0oJmMtPndidWZfc2VtKTsKKwljLT53YnVmX3BhZ2VzaXplID0gYy0+c2VjdG9yX3NpemU7CisJYy0+d2J1Zl9vZnMgPSAweEZGRkZGRkZGOworCisJYy0+d2J1ZiA9IGttYWxsb2MoYy0+d2J1Zl9wYWdlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT53YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50ayhLRVJOX0lORk8gIkpGRlMyIHdyaXRlLWJ1ZmZlcmluZyBlbmFibGVkICglaSlcbiIsIGMtPndidWZfcGFnZXNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfZGF0YWZsYXNoX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKKwlrZnJlZShjLT53YnVmKTsKK30KKwogaW50IGpmZnMyX25vcl9lY2NfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKIAkvKiBDbGVhbm1hcmtlciBpcyBhY3R1YWxseSBsYXJnZXIgb24gdGhlIGZsYXNoZXMgKi8KIAljLT5jbGVhbm1hcmtlcl9zaXplID0gMTY7CkBAIC0xMTgxLDQgKzEyMzQsMyBAQAogdm9pZCBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKIAlrZnJlZShjLT53YnVmKTsKIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvd3JpdGUuYyBiL2ZzL2pmZnMyL3dyaXRlLmMKaW5kZXggODBhNWRiNS4uNjkxMDA2MSAxMDA2NDQKLS0tIGEvZnMvamZmczIvd3JpdGUuYworKysgYi9mcy9qZmZzMi93cml0ZS5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiB3cml0ZS5jLHYgMS44NyAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHdyaXRlLmMsdiAxLjkyIDIwMDUvMDQvMTMgMTM6MjI6MzUgZHdtdzIgRXhwICQKICAqCiAgKi8KIApAQCAtMzUsMTMgKzM1LDEyIEBACiAJZi0+aW5vY2FjaGUgPSBpYzsKIAlmLT5pbm9jYWNoZS0+bmxpbmsgPSAxOwogCWYtPmlub2NhY2hlLT5ub2RlcyA9IChzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICopZi0+aW5vY2FjaGU7Ci0JZi0+aW5vY2FjaGUtPmlubyA9ICsrYy0+aGlnaGVzdF9pbm87CiAJZi0+aW5vY2FjaGUtPnN0YXRlID0gSU5PX1NUQVRFX1BSRVNFTlQ7CiAKLQlyaS0+aW5vID0gY3B1X3RvX2plMzIoZi0+aW5vY2FjaGUtPmlubyk7CiAKLQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fbmV3X2lub2RlKCk6IEFzc2lnbmVkIGlubyMgJWRcbiIsIGYtPmlub2NhY2hlLT5pbm8pKTsKIAlqZmZzMl9hZGRfaW5vX2NhY2hlKGMsIGYtPmlub2NhY2hlKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fbmV3X2lub2RlKCk6IEFzc2lnbmVkIGlubyMgJWRcbiIsIGYtPmlub2NhY2hlLT5pbm8pKTsKKwlyaS0+aW5vID0gY3B1X3RvX2plMzIoZi0+aW5vY2FjaGUtPmlubyk7CiAKIAlyaS0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKIAlyaS0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CkBAIC0xMzYsNiArMTM1LDE1IEBACiAJcmF3LT5fX3RvdGxlbiA9IFBBRChzaXplb2YoKnJpKStkYXRhbGVuKTsKIAlyYXctPm5leHRfcGh5cyA9IE5VTEw7CiAKKwlpZiAoKGFsbG9jX21vZGUhPUFMTE9DX0dDKSAmJiAoamUzMl90b19jcHUocmktPnZlcnNpb24pIDwgZi0+aGlnaGVzdF92ZXJzaW9uKSkgeworCQlCVUdfT04oIXJldHJpZWQpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfd3JpdGVfZG5vZGUgOiBkbm9kZV92ZXJzaW9uICVkLCAiCisJCQkJImhpZ2hlc3QgdmVyc2lvbiAlZCAtPiB1cGRhdGluZyBkbm9kZVxuIiwgCisJCQkJamUzMl90b19jcHUocmktPnZlcnNpb24pLCBmLT5oaWdoZXN0X3ZlcnNpb24pKTsKKwkJcmktPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJCXJpLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KSk7CisJfQorCiAJcmV0ID0gamZmczJfZmxhc2hfd3JpdGV2KGMsIHZlY3MsIGNudCwgZmxhc2hfb2ZzLCAmcmV0bGVuLAogCQkJCSAoYWxsb2NfbW9kZT09QUxMT0NfR0MpPzA6Zi0+aW5vY2FjaGUtPmlubyk7CiAKQEAgLTI4MCw2ICsyODgsMTYgQEAKIAlyYXctPl9fdG90bGVuID0gUEFEKHNpemVvZigqcmQpK25hbWVsZW4pOwogCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKIAorCWlmICgoYWxsb2NfbW9kZSE9QUxMT0NfR0MpICYmIChqZTMyX3RvX2NwdShyZC0+dmVyc2lvbikgPCBmLT5oaWdoZXN0X3ZlcnNpb24pKSB7CisJCUJVR19PTighcmV0cmllZCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl93cml0ZV9kaXJlbnQgOiBkaXJlbnRfdmVyc2lvbiAlZCwgIgorCQkJCSAgICAgImhpZ2hlc3QgdmVyc2lvbiAlZCAtPiB1cGRhdGluZyBkaXJlbnRcbiIsCisJCQkJICAgICBqZTMyX3RvX2NwdShyZC0+dmVyc2lvbiksIGYtPmhpZ2hlc3RfdmVyc2lvbikpOworCQlyZC0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJZmQtPnZlcnNpb24gPSBqZTMyX3RvX2NwdShyZC0+dmVyc2lvbik7CisJCXJkLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2YoKnJkKS04KSk7CisJfQorCiAJcmV0ID0gamZmczJfZmxhc2hfd3JpdGV2KGMsIHZlY3MsIDIsIGZsYXNoX29mcywgJnJldGxlbiwKIAkJCQkgKGFsbG9jX21vZGU9PUFMTE9DX0dDKT8wOmplMzJfdG9fY3B1KHJkLT5waW5vKSk7CiAJaWYgKHJldCB8fCAocmV0bGVuICE9IHNpemVvZigqcmQpICsgbmFtZWxlbikpIHsKQEAgLTYyNSwyMCArNjQzLDIzIEBACiAKIAkJZG93bigmZGVhZF9mLT5zZW0pOwogCi0JCXdoaWxlIChkZWFkX2YtPmRlbnRzKSB7Ci0JCQkvKiBUaGVyZSBjYW4gYmUgb25seSBkZWxldGVkIG9uZXMgKi8KLQkJCWZkID0gZGVhZF9mLT5kZW50czsKLQkJCQotCQkJZGVhZF9mLT5kZW50cyA9IGZkLT5uZXh0OwotCQkJCi0JCQlpZiAoZmQtPmlubykgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlbGV0aW5nIGlub2RlICMldSB3aXRoIGFjdGl2ZSBkZW50cnkgXCIlc1wiLT5pbm8gIyV1XG4iLAotCQkJCSAgICAgICBkZWFkX2YtPmlub2NhY2hlLT5pbm8sIGZkLT5uYW1lLCBmZC0+aW5vKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlbW92aW5nIGRlbGV0aW9uIGRpcmVudCBmb3IgXCIlc1wiIGZyb20gZGlyIGlubyAjJXVcbiIsIGZkLT5uYW1lLCBkZWFkX2YtPmlub2NhY2hlLT5pbm8pKTsKKwkJaWYgKFNfSVNESVIoT0ZOSV9FRE9OSV8yU0ZGSihkZWFkX2YpLT5pX21vZGUpKSB7CisJCQl3aGlsZSAoZGVhZF9mLT5kZW50cykgeworCQkJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IGRlbGV0ZWQgb25lcyAqLworCQkJCWZkID0gZGVhZF9mLT5kZW50czsKKwkJCQkKKwkJCQlkZWFkX2YtPmRlbnRzID0gZmQtPm5leHQ7CisJCQkJCisJCQkJaWYgKGZkLT5pbm8pIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVsZXRpbmcgaW5vZGUgIyV1IHdpdGggYWN0aXZlIGRlbnRyeSBcIiVzXCItPmlubyAjJXVcbiIsCisJCQkJCSAgICAgICBkZWFkX2YtPmlub2NhY2hlLT5pbm8sIGZkLT5uYW1lLCBmZC0+aW5vKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVsZXRpb24gZGlyZW50IGZvciBcIiVzXCIgZnJvbSBkaXIgaW5vICMldVxuIiwKKwkJCQkJCWZkLT5uYW1lLCBkZWFkX2YtPmlub2NhY2hlLT5pbm8pKTsKKwkJCQl9CisJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOwogCQkJfQotCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOwotCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CiAJCX0KIAogCQlkZWFkX2YtPmlub2NhY2hlLT5ubGluay0tOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kbWFwLmMgYi9mcy9qZnMvamZzX2RtYXAuYwppbmRleCBjY2VkMmZlLi4wNzMyZjIwIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2RtYXAuYworKysgYi9mcy9qZnMvamZzX2RtYXAuYwpAQCAtMjYsMzYgKzI2LDYgQEAKICNpbmNsdWRlICJqZnNfZGVidWcuaCIKIAogLyoKLSAqCURlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBibG9jayBtYXAKLSAqLwotLyogI2RlZmluZQlfSkZTX0RFQlVHX0RNQVAJMSAqLwotCi0jaWZkZWYJX0pGU19ERUJVR19ETUFQCi0jZGVmaW5lIERCSU5JVE1BUChzaXplLGlwYm1hcCxyZXN1bHRzKSBcCi0JREJpbml0bWFwKHNpemUsaXBibWFwLHJlc3VsdHMpCi0jZGVmaW5lIERCQUxMT0MoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCi0JREJBbGxvYyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpCi0jZGVmaW5lIERCRlJFRShkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKLQlEQkZyZWUoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQotI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCi0JREJBbGxvY0NLKGRibWFwLG1hcHNpemUsYmxrbm8sbmJsb2NrcykKLSNkZWZpbmUgREJGUkVFQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCi0JREJGcmVlQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQotCi1zdGF0aWMgdm9pZCBEQmluaXRtYXAoczY0LCBzdHJ1Y3QgaW5vZGUgKiwgdTMyICoqKTsKLXN0YXRpYyB2b2lkIERCQWxsb2ModWludCAqLCBzNjQsIHM2NCwgczY0KTsKLXN0YXRpYyB2b2lkIERCRnJlZSh1aW50ICosIHM2NCwgczY0LCBzNjQpOwotc3RhdGljIHZvaWQgREJBbGxvY0NLKHVpbnQgKiwgczY0LCBzNjQsIHM2NCk7Ci1zdGF0aWMgdm9pZCBEQkZyZWVDSyh1aW50ICosIHM2NCwgczY0LCBzNjQpOwotI2Vsc2UKLSNkZWZpbmUgREJJTklUTUFQKHNpemUsaXBibWFwLHJlc3VsdHMpCi0jZGVmaW5lIERCQUxMT0MoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQotI2RlZmluZSBEQkZSRUUoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQotI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQotI2RlZmluZSBEQkZSRUVDSyhkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCi0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCi0KLS8qCiAgKglTRVJJQUxJWkFUSU9OIG9mIHRoZSBCbG9jayBBbGxvY2F0aW9uIE1hcC4KICAqCiAgKgl0aGUgd29ya2luZyBzdGF0ZSBvZiB0aGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgaXMgYWNjZXNzZWQgaW4KQEAgLTI0Miw3ICsyMTIsNiBAQAogCUpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcCA9IGJtcDsKIAogCW1lbXNldChibXAtPmRiX2FjdGl2ZSwgMCwgc2l6ZW9mKGJtcC0+ZGJfYWN0aXZlKSk7Ci0JREJJTklUTUFQKGJtcC0+ZGJfbWFwc2l6ZSwgaXBibWFwLCAmYm1wLT5kYl9EQm1hcCk7CiAKIAkvKgogCSAqIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGJtYXAgbG9jawpAQCAtNDA3LDE2ICszNzYsMTIgQEAKIAkJICovCiAJCW5iID0gbWluKHJlbSwgQlBFUkRNQVAgLSAoYmxrbm8gJiAoQlBFUkRNQVAgLSAxKSkpOwogCi0JCURCQUxMT0NDSyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYik7Ci0KIAkJLyogZnJlZSB0aGUgYmxvY2tzLiAqLwogCQlpZiAoKHJjID0gZGJGcmVlRG1hcChibXAsIGRwLCBibGtubywgbmIpKSkgewogCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAJCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKIAkJCXJldHVybiAocmMpOwogCQl9Ci0KLQkJREJGUkVFKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5iKTsKIAl9CiAKIAkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCkBAIC03NzUsMTAgKzc0MCw2IEBACiAJCUlXUklURV9MT0NLKGlwYm1hcCk7CiAKIAkJcmMgPSBkYkFsbG9jQW55KGJtcCwgbmJsb2NrcywgbDJuYiwgcmVzdWx0cyk7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgKnJlc3VsdHMsCi0JCQkJbmJsb2Nrcyk7Ci0JCX0KIAogCQlnb3RvIHdyaXRlX3VubG9jazsKIAl9CkBAIC04MzYsOCArNzk3LDYgQEAKIAkJICAgICE9IC1FTk9TUEMpIHsKIAkJCWlmIChyYyA9PSAwKSB7CiAJCQkJKnJlc3VsdHMgPSBibGtubzsKLQkJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwKLQkJCQkJKnJlc3VsdHMsIG5ibG9ja3MpOwogCQkJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOwogCQkJfQogCkBAIC04NjMsMTEgKzgyMiw4IEBACiAJCWlmICgocmMgPQogCQkgICAgIGRiQWxsb2NOZWFyKGJtcCwgZHAsIGJsa25vLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKIAkJICAgICE9IC1FTk9TUEMpIHsKLQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCi0JCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCWlmIChyYyA9PSAwKQogCQkJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOwotCQkJfQogCiAJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAkJCWdvdG8gcmVhZF91bmxvY2s7CkBAIC04NzgsMTEgKzgzNCw4IEBACiAJCSAqLwogCQlpZiAoKHJjID0gZGJBbGxvY0RtYXBMZXYoYm1wLCBkcCwgKGludCkgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpCiAJCSAgICAhPSAtRU5PU1BDKSB7Ci0JCQlpZiAocmMgPT0gMCkgewotCQkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLAotCQkJCQkqcmVzdWx0cywgbmJsb2Nrcyk7CisJCQlpZiAocmMgPT0gMCkKIAkJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKLQkJCX0KIAogCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAJCQlnb3RvIHJlYWRfdW5sb2NrOwpAQCAtODk2LDEzICs4NDksOSBAQAogCSAqIHRoZSBzYW1lIGFsbG9jYXRpb24gZ3JvdXAgYXMgdGhlIGhpbnQuCiAJICovCiAJSVdSSVRFX0xPQ0soaXBibWFwKTsKLQlpZiAoKHJjID0gZGJBbGxvY0FHKGJtcCwgYWdubywgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpCi0JICAgICE9IC1FTk9TUEMpIHsKLQkJaWYgKHJjID09IDApCi0JCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwKLQkJCQkqcmVzdWx0cywgbmJsb2Nrcyk7CisJaWYgKChyYyA9IGRiQWxsb2NBRyhibXAsIGFnbm8sIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpKSAhPSAtRU5PU1BDKQogCQlnb3RvIHdyaXRlX3VubG9jazsKLQl9CisKIAlJV1JJVEVfVU5MT0NLKGlwYm1hcCk7CiAKIApAQCAtOTE4LDkgKzg2Nyw2IEBACiAJICovCiAJaWYgKChyYyA9IGRiQWxsb2NBRyhibXAsIGFnbm8sIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpKSA9PSAtRU5PU1BDKQogCQlyYyA9IGRiQWxsb2NBbnkoYm1wLCBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKTsKLQlpZiAocmMgPT0gMCkgewotCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgKnJlc3VsdHMsIG5ibG9ja3MpOwotCX0KIAogICAgICAgd3JpdGVfdW5sb2NrOgogCUlXUklURV9VTkxPQ0soaXBibWFwKTsKQEAgLTk5MiwxMCArOTM4LDkgQEAKIAogCUlSRUFEX1VOTE9DSyhpcGJtYXApOwogCi0JaWYgKHJjID09IDApIHsKLQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYmxvY2tzKTsKKwlpZiAocmMgPT0gMCkKIAkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7Ci0JfQorCiAJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAKIAlyZXR1cm4gKHJjKTsKQEAgLTExNDQsNyArMTA4OSw2IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCURCQUxMT0NDSyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYmxvY2tzKTsKIAlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKIAogCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUKQEAgLTExNTUsMTEgKzEwOTksOSBAQAogCUlSRUFEX1VOTE9DSyhpcGJtYXApOwogCiAJLyogd2VyZSB3ZSBzdWNjZXNzZnVsID8gKi8KLQlpZiAocmMgPT0gMCkgewotCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgZXh0Ymxrbm8sCi0JCQlhZGRuYmxvY2tzKTsKKwlpZiAocmMgPT0gMCkKIAkJd3JpdGVfbWV0YXBhZ2UobXApOwotCX0gZWxzZQorCWVsc2UKIAkJLyogd2Ugd2VyZSBub3Qgc3VjY2Vzc2Z1bCAqLwogCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIApAQCAtMzE4NSwxNiArMzEyNywxMiBAQAogCQkgKi8KIAkJbmIgPSBtaW4ocmVtLCBCUEVSRE1BUCAtIChibGtubyAmIChCUEVSRE1BUCAtIDEpKSk7CiAKLQkJREJGUkVFQ0soYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOwotCiAJCS8qIGFsbG9jYXRlIHRoZSBibG9ja3MuICovCiAJCWlmICgocmMgPSBkYkFsbG9jRG1hcEJVKGJtcCwgZHAsIGJsa25vLCBuYikpKSB7CiAJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAkJCUlSRUFEX1VOTE9DSyhpcGJtYXApOwogCQkJcmV0dXJuIChyYyk7CiAJCX0KLQotCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5iKTsKIAl9CiAKIAkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCkBAIC00MDQxLDIyMyArMzk3OSwzIEBACiAKIAlyZXR1cm4gKG5ibG9ja3MpOwogfQotCi0KLSNpZmRlZglfSkZTX0RFQlVHX0RNQVAKLS8qCi0gKglEQmluaXRtYXAoKQotICovCi1zdGF0aWMgdm9pZCBEQmluaXRtYXAoczY0IHNpemUsIHN0cnVjdCBpbm9kZSAqaXBibWFwLCB1MzIgKiogcmVzdWx0cykKLXsKLQlpbnQgbnBhZ2VzOwotCXUzMiAqZGJtYXAsICpkOwotCWludCBuOwotCXM2NCBsYmxrbm8sIGN1cl9ibG9jazsKLQlzdHJ1Y3QgZG1hcCAqZHA7Ci0Jc3RydWN0IG1ldGFwYWdlICptcDsKLQotCW5wYWdlcyA9IHNpemUgLyAzMjc2ODsKLQlucGFnZXMgKz0gKHNpemUgJSAzMjc2OCkgPyAxIDogMDsKLQotCWRibWFwID0gKHUzMiAqKSB4bWFsbG9jKG5wYWdlcyAqIDQwOTYsIEwyUFNJWkUsIGtlcm5lbF9oZWFwKTsKLQlpZiAoZGJtYXAgPT0gTlVMTCkKLQkJQlVHKCk7CS8qIE5vdCByb2J1c3Qgc2luY2UgdGhpcyBpcyBvbmx5IHVudXNlZCBkZWJ1ZyBjb2RlICovCi0KLQlmb3IgKG4gPSAwLCBkID0gZGJtYXA7IG4gPCBucGFnZXM7IG4rKywgZCArPSAxMDI0KQotCQliemVybyhkLCA0MDk2KTsKLQotCS8qIE5lZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGRpc2sgbWFwIHBhZ2VzCi0JICovCi0JZm9yIChkID0gZGJtYXAsIGN1cl9ibG9jayA9IDA7IGN1cl9ibG9jayA8IHNpemU7Ci0JICAgICBjdXJfYmxvY2sgKz0gQlBFUkRNQVAsIGQgKz0gTFBFUkRNQVApIHsKLQkJbGJsa25vID0gQkxLVE9ETUFQKGN1cl9ibG9jaywKLQkJCQkgICBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXAtPgotCQkJCSAgIGRiX2wybmJwZXJwYWdlKTsKLQkJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7Ci0JCWlmIChtcCA9PSBOVUxMKSB7Ci0JCQlqZnNfZXJyb3IoaXBibWFwLT5pX3NiLAotCQkJCSAgIkRCaW5pdG1hcDogY291bGQgbm90IHJlYWQgZGlzayBtYXAgcGFnZSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZHAgPSAoc3RydWN0IGRtYXAgKikgbXAtPmRhdGE7Ci0KLQkJZm9yIChuID0gMDsgbiA8IExQRVJETUFQOyBuKyspCi0JCQlkW25dID0gbGUzMl90b19jcHUoZHAtPndtYXBbbl0pOwotCi0JCXJlbGVhc2VfbWV0YXBhZ2UobXApOwotCX0KLQotCSpyZXN1bHRzID0gZGJtYXA7Ci19Ci0KLQotLyoKLSAqCURCQWxsb2MoKQotICovCi12b2lkIERCQWxsb2ModWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKLXsKLQlpbnQgd29yZCwgbmIsIGJpdG5vOwotCXUzMiBtYXNrOwotCi0JYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOwotCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWRibWFwICs9IChibGtubyAvIDMyKTsKLQl3aGlsZSAobmJsb2NrcyA+IDApIHsKLQkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOwotCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKLQotCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKLQkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSAwKTsKLQkJKmRibWFwIHw9IG1hc2s7Ci0KLQkJZGJtYXArKzsKLQkJYmxrbm8gKz0gbmI7Ci0JCW5ibG9ja3MgLT0gbmI7Ci0JfQotfQotCi0KLS8qCi0gKglEQkZyZWUoKQotICovCi1zdGF0aWMgdm9pZCBEQkZyZWUodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKLXsKLQlpbnQgd29yZCwgbmIsIGJpdG5vOwotCXUzMiBtYXNrOwotCi0JYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOwotCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWRibWFwICs9IChibGtubyAvIDMyKTsKLQl3aGlsZSAobmJsb2NrcyA+IDApIHsKLQkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOwotCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKLQotCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKLQkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSBtYXNrKTsKLQkJKmRibWFwICY9IH5tYXNrOwotCi0JCWRibWFwKys7Ci0JCWJsa25vICs9IG5iOwotCQluYmxvY2tzIC09IG5iOwotCX0KLX0KLQotCi0vKgotICoJREJBbGxvY0NLKCkKLSAqLwotc3RhdGljIHZvaWQgREJBbGxvY0NLKHVpbnQgKiBkYm1hcCwgczY0IG1hcHNpemUsIHM2NCBibGtubywgczY0IG5ibG9ja3MpCi17Ci0JaW50IHdvcmQsIG5iLCBiaXRubzsKLQl1MzIgbWFzazsKLQotCWFzc2VydChibGtubyA+IDAgJiYgYmxrbm8gPCBtYXBzaXplKTsKLQlhc3NlcnQobmJsb2NrcyA+IDAgJiYgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWFzc2VydChibGtubyArIG5ibG9ja3MgPD0gbWFwc2l6ZSk7Ci0KLQlkYm1hcCArPSAoYmxrbm8gLyAzMik7Ci0Jd2hpbGUgKG5ibG9ja3MgPiAwKSB7Ci0JCWJpdG5vID0gYmxrbm8gJiAoMzIgLSAxKTsKLQkJbmIgPSBtaW4obmJsb2NrcywgMzIgLSBiaXRubyk7Ci0KLQkJbWFzayA9ICgweGZmZmZmZmZmIDw8ICgzMiAtIG5iKSA+PiBiaXRubyk7Ci0JCWFzc2VydCgobWFzayAmICpkYm1hcCkgPT0gbWFzayk7Ci0KLQkJZGJtYXArKzsKLQkJYmxrbm8gKz0gbmI7Ci0JCW5ibG9ja3MgLT0gbmI7Ci0JfQotfQotCi0KLS8qCi0gKglEQkZyZWVDSygpCi0gKi8KLXN0YXRpYyB2b2lkIERCRnJlZUNLKHVpbnQgKiBkYm1hcCwgczY0IG1hcHNpemUsIHM2NCBibGtubywgczY0IG5ibG9ja3MpCi17Ci0JaW50IHdvcmQsIG5iLCBiaXRubzsKLQl1MzIgbWFzazsKLQotCWFzc2VydChibGtubyA+IDAgJiYgYmxrbm8gPCBtYXBzaXplKTsKLQlhc3NlcnQobmJsb2NrcyA+IDAgJiYgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWFzc2VydChibGtubyArIG5ibG9ja3MgPD0gbWFwc2l6ZSk7Ci0KLQlkYm1hcCArPSAoYmxrbm8gLyAzMik7Ci0Jd2hpbGUgKG5ibG9ja3MgPiAwKSB7Ci0JCWJpdG5vID0gYmxrbm8gJiAoMzIgLSAxKTsKLQkJbmIgPSBtaW4obmJsb2NrcywgMzIgLSBiaXRubyk7Ci0KLQkJbWFzayA9ICgweGZmZmZmZmZmIDw8ICgzMiAtIG5iKSA+PiBiaXRubyk7Ci0JCWFzc2VydCgobWFzayAmICpkYm1hcCkgPT0gMCk7Ci0KLQkJZGJtYXArKzsKLQkJYmxrbm8gKz0gbmI7Ci0JCW5ibG9ja3MgLT0gbmI7Ci0JfQotfQotCi0KLS8qCi0gKglkYlBydE1hcCgpCi0gKi8KLXN0YXRpYyB2b2lkIGRiUHJ0TWFwKHN0cnVjdCBibWFwICogYm1wKQotewotCXByaW50aygiICAgbWFwc2l6ZTogICAlZCVkXG4iLCBibXAtPmRiX21hcHNpemUpOwotCXByaW50aygiICAgbmZyZWU6ICAgICAlZCVkXG4iLCBibXAtPmRiX25mcmVlKTsKLQlwcmludGsoIiAgIG51bWFnOiAgICAgJWRcbiIsIGJtcC0+ZGJfbnVtYWcpOwotCXByaW50aygiICAgYWdzaXplOiAgICAlZCVkXG4iLCBibXAtPmRiX2Fnc2l6ZSk7Ci0JcHJpbnRrKCIgICBhZ2wyc2l6ZTogICVkXG4iLCBibXAtPmRiX2FnbDJzaXplKTsKLQlwcmludGsoIiAgIGFnd2lkdGg6ICAgJWRcbiIsIGJtcC0+ZGJfYWd3aWR0aCk7Ci0JcHJpbnRrKCIgICBhZ3N0YXJ0OiAgICVkXG4iLCBibXAtPmRiX2Fnc3RhcnQpOwotCXByaW50aygiICAgYWdoZWlndGg6ICAlZFxuIiwgYm1wLT5kYl9hZ2hlaWd0aCk7Ci0JcHJpbnRrKCIgICBhZ2xldmVsOiAgICVkXG4iLCBibXAtPmRiX2FnbGV2ZWwpOwotCXByaW50aygiICAgbWF4bGV2ZWw6ICAlZFxuIiwgYm1wLT5kYl9tYXhsZXZlbCk7Ci0JcHJpbnRrKCIgICBtYXhhZzogICAgICVkXG4iLCBibXAtPmRiX21heGFnKTsKLQlwcmludGsoIiAgIGFncHJlZjogICAgJWRcbiIsIGJtcC0+ZGJfYWdwcmVmKTsKLQlwcmludGsoIiAgIGwybmJwcGc6ICAgJWRcbiIsIGJtcC0+ZGJfbDJuYnBlcnBhZ2UpOwotfQotCi0KLS8qCi0gKglkYlBydEN0bCgpCi0gKi8KLXN0YXRpYyB2b2lkIGRiUHJ0Q3RsKHN0cnVjdCBkbWFwY3RsICogZGNwKQotewotCWludCBpLCBqLCBuOwotCi0JcHJpbnRrKCIgICBoZWlnaHQ6ICAgICUwOHhcbiIsIGxlMzJfdG9fY3B1KGRjcC0+aGVpZ2h0KSk7Ci0JcHJpbnRrKCIgICBsZWFmaWR4OiAgICUwOHhcbiIsIGxlMzJfdG9fY3B1KGRjcC0+bGVhZmlkeCkpOwotCXByaW50aygiICAgYnVkbWluOiAgICAlMDh4XG4iLCBkY3AtPmJ1ZG1pbik7Ci0JcHJpbnRrKCIgICBubGVhZnM6ICAgICUwOHhcbiIsIGxlMzJfdG9fY3B1KGRjcC0+bmxlYWZzKSk7Ci0JcHJpbnRrKCIgICBsMm5sZWFmczogICUwOHhcbiIsIGxlMzJfdG9fY3B1KGRjcC0+bDJubGVhZnMpKTsKLQotCXByaW50aygiXG4gVHJlZTpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBDVExMRUFGSU5EOyBpICs9IDgpIHsKLQkJbiA9IG1pbig4LCBDVExMRUFGSU5EIC0gaSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IG47IGorKykKLQkJCXByaW50ZigiICBbJTAzeF06ICUwMngiLCBpICsgaiwKLQkJCSAgICAgICAoY2hhcikgZGNwLT5zdHJlZVtpICsgal0pOwotCQlwcmludGYoIlxuIik7Ci0JfQotCi0JcHJpbnRrKCJcbiBUcmVlIExlYXZlczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBMUEVSQ1RMOyBpICs9IDgpIHsKLQkJbiA9IG1pbig4LCBMUEVSQ1RMIC0gaSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IG47IGorKykKLQkJCXByaW50ZigiICBbJTAzeF06ICUwMngiLAotCQkJICAgICAgIGkgKyBqLAotCQkJICAgICAgIChjaGFyKSBkY3AtPnN0cmVlW2kgKyBqICsgQ1RMTEVBRklORF0pOwotCQlwcmludGYoIlxuIik7Ci0JfQotfQotI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfRE1BUCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kdHJlZS5jIGIvZnMvamZzL2pmc19kdHJlZS5jCmluZGV4IDg2NzZhZWUuLjczYjVmYzcgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZHRyZWUuYworKysgYi9mcy9qZnMvamZzX2R0cmVlLmMKQEAgLTQ1NTQsMjAyICs0NTU0LDMgQEAKIAogCXJldHVybiAwOwogfQotCi0jaWZkZWYgX0pGU19ERUJVR19EVFJFRQotLyoKLSAqCWR0RGlzcGxheVRyZWUoKQotICoKLSAqIGZ1bmN0aW9uOiB0cmF2ZXJzZSBmb3J3YXJkCi0gKi8KLWludCBkdERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtZXRhcGFnZSAqbXA7Ci0JZHRwYWdlX3QgKnA7Ci0JczY0IGJuLCBwYm47Ci0JaW50IGluZGV4LCBsYXN0aW5kZXgsIHYsIGg7Ci0JcHhkX3QgKnhkOwotCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7Ci0Jc3RydWN0IGJ0ZnJhbWUgKmJ0c3A7Ci0Jc3RydWN0IGJ0ZnJhbWUgKnBhcmVudDsKLQl1OCAqc3RibDsKLQlpbnQgcHNpemUgPSAyNTY7Ci0KLQlwcmludGsoImRpc3BsYXkgQistdHJlZS5cbiIpOwotCi0JLyogY2xlYXIgc3RhY2sgKi8KLQlidHNwID0gYnRzdGFjay5zdGFjazsKLQotCS8qCi0JICogc3RhcnQgd2l0aCByb290Ci0JICoKLQkgKiByb290IHJlc2lkZXMgaW4gdGhlIGlub2RlCi0JICovCi0JYm4gPSAwOwotCXYgPSBoID0gMDsKLQotCS8qCi0JICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggcGFnZToKLQkgKi8KLSAgICAgIG5ld1BhZ2U6Ci0JRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBwc2l6ZSwgcCwgcmMpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogcHJvY2VzcyBlbnRyaWVzIGZvcndhcmQgZnJvbSBmaXJzdCBpbmRleCAqLwotCWluZGV4ID0gMDsKLQlsYXN0aW5kZXggPSBwLT5oZWFkZXIubmV4dGluZGV4IC0gMTsKLQotCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0lOVEVSTkFMKSB7Ci0JCS8qCi0JCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGludGVybmFsIHBhZ2UKLQkJICovCi0JCXByaW50ZigiaW50ZXJuYWwgcGFnZSAiKTsKLQkJZHREaXNwbGF5UGFnZShpcCwgYm4sIHApOwotCi0JCWdvdG8gZ2V0Q2hpbGQ7Ci0JfSBlbHNlIHsJCS8qIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpICovCi0KLQkJLyoKLQkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggbGVhZiBwYWdlCi0JCSAqLwotCQlwcmludGYoImxlYWYgcGFnZSAiKTsKLQkJZHREaXNwbGF5UGFnZShpcCwgYm4sIHApOwotCi0JCS8qCi0JCSAqIHByb2Nlc3MgbGVhZiBwYWdlIGVudHJpZXMKLQkJICoKLQkJIGZvciAoIDsgaW5kZXggPD0gbGFzdGluZGV4OyBpbmRleCsrKQotCQkgewotCQkgfQotCQkgKi8KLQotCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCi0JCURUX1BVVFBBR0UobXApOwotCX0KLQotCS8qCi0JICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKLQkgKi8KLSAgICAgIGdldFBhcmVudDoKLQkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KLQlpZiAoKHBhcmVudCA9IChidHNwID09IGJ0c3RhY2suc3RhY2sgPyBOVUxMIDogLS1idHNwKSkgPT0gTlVMTCkKLQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAotCSAqLwotCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSAobGFzdGluZGV4ID0gcGFyZW50LT5sYXN0aW5kZXgpKSB7Ci0JCS8qIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlICovCi0JCWdvdG8gZ2V0UGFyZW50OwotCX0KLQotCS8qCi0JICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCi0JICovCi0JLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCi0JYm4gPSBwYXJlbnQtPmJuOwotCS8qIHYgPSBwYXJlbnQtPmxldmVsOyAqLwotCURUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGdldCBuZXh0IHBhcmVudCBlbnRyeSAqLwotCWluZGV4Kys7Ci0KLQkvKgotCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5Ci0JICovCi0gICAgICBnZXRDaGlsZDoKLQkvKiBwdXNoL3NhdmUgY3VycmVudCBwYXJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCi0JYnRzcC0+Ym4gPSBwYm4gPSBibjsKLQlidHNwLT5pbmRleCA9IGluZGV4OwotCWJ0c3AtPmxhc3RpbmRleCA9IGxhc3RpbmRleDsKLQkvKiBidHNwLT5sZXZlbCA9IHY7ICovCi0JLyogYnRzcC0+bm9kZSA9IGg7ICovCi0JKytidHNwOwotCi0JLyogZ2V0IGN1cnJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCi0Jc3RibCA9IERUX0dFVFNUQkwocCk7Ci0JeGQgPSAocHhkX3QgKikgJiBwLT5zbG90W3N0YmxbaW5kZXhdXTsKLQotCS8qCi0JICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6Ci0JICovCi0KLQkvKiBnZXQgY2hpbGQgcGFnZSAqLwotCWJuID0gYWRkcmVzc1BYRCh4ZCk7Ci0JcHNpemUgPSBsZW5ndGhQWEQoeGQpIDw8IGlwLT5pX2lwbW50LT5pX2wyYnNpemU7Ci0KLQlwcmludGsoInRyYXZlcnNlIGRvd24gMHglTHhbJWRdLT4weCVMeFxuIiwgcGJuLCBpbmRleCwgYm4pOwotCXYrKzsKLQloID0gaW5kZXg7Ci0KLQkvKiByZWxlYXNlIHBhcmVudCBwYWdlICovCi0JRFRfUFVUUEFHRShtcCk7Ci0KLQkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCi0JZ290byBuZXdQYWdlOwotfQotCi0KLS8qCi0gKglkdERpc3BsYXlQYWdlKCkKLSAqCi0gKiBmdW5jdGlvbjogZGlzcGxheSBwYWdlCi0gKi8KLWludCBkdERpc3BsYXlQYWdlKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibiwgZHRwYWdlX3QgKiBwKQotewotCWludCByYzsKLQlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwotCXN0cnVjdCBsZHRlbnRyeSAqbGg7Ci0Jc3RydWN0IGlkdGVudHJ5ICppaDsKLQlweGRfdCAqeGQ7Ci0JaW50IGksIGo7Ci0JdTggKnN0Ymw7Ci0Jd2NoYXJfdCBuYW1lW0pGU19OQU1FX01BWCArIDFdOwotCXN0cnVjdCBjb21wb25lbnRfbmFtZSBrZXkgPSB7IDAsIG5hbWUgfTsKLQlpbnQgZnJlZXBhZ2UgPSAwOwotCi0JaWYgKHAgPT0gTlVMTCkgewotCQlmcmVlcGFnZSA9IDE7Ci0JCURUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIGRpc3BsYXkgcGFnZSBjb250cm9sICovCi0JcHJpbnRrKCJibjoweCVMeCBmbGFnOjB4JTA4eCBuZXh0aW5kZXg6JWRcbiIsCi0JICAgICAgIGJuLCBwLT5oZWFkZXIuZmxhZywgcC0+aGVhZGVyLm5leHRpbmRleCk7Ci0KLQkvKiBkaXNwbGF5IGVudHJpZXMgKi8KLQlzdGJsID0gRFRfR0VUU1RCTChwKTsKLQlmb3IgKGkgPSAwLCBqID0gMTsgaSA8IHAtPmhlYWRlci5uZXh0aW5kZXg7IGkrKywgaisrKSB7Ci0JCWR0R2V0S2V5KHAsIGksICZrZXksIEpGU19TQkkoaXAtPmlfc2IpLT5tbnRmbGFnKTsKLQkJa2V5Lm5hbWVba2V5Lm5hbWxlbl0gPSAnXDAnOwotCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7Ci0JCQlsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOwotCQkJcHJpbnRmKCJcdFslZF0gJXM6JWQiLCBpLCBrZXkubmFtZSwKLQkJCSAgICAgICBsZTMyX3RvX2NwdShsaC0+aW51bWJlcikpOwotCQl9IGVsc2UgewotCQkJaWggPSAoc3RydWN0IGlkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2ldXTsKLQkJCXhkID0gKHB4ZF90ICopIGloOwotCQkJYm4gPSBhZGRyZXNzUFhEKHhkKTsKLQkJCXByaW50ZigiXHRbJWRdICVzOjB4JUx4IiwgaSwga2V5Lm5hbWUsIGJuKTsKLQkJfQotCi0JCWlmIChqID09IDQpIHsKLQkJCXByaW50ZigiXG4iKTsKLQkJCWogPSAwOwotCQl9Ci0JfQotCi0JcHJpbnRmKCJcbiIpOwotCi0JaWYgKGZyZWVwYWdlKQotCQlEVF9QVVRQQUdFKG1wKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfRFRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZHRyZWUuaCBiL2ZzL2pmcy9qZnNfZHRyZWUuaAppbmRleCAyNzNhODAxLi4xM2U0ZmRmIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2R0cmVlLmgKKysrIGIvZnMvamZzL2pmc19kdHJlZS5oCkBAIC0yNjksMTEgKzI2OSw0IEBACiAJCSAgICBpbm9fdCAqIG9yaWdfaW5vLCBpbm9fdCBuZXdfaW5vLCBpbnQgZmxhZyk7CiAKIGV4dGVybiBpbnQgamZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOwotCi0jaWZkZWYgIF9KRlNfREVCVUdfRFRSRUUKLWV4dGVybiBpbnQgZHREaXNwbGF5VHJlZShzdHJ1Y3QgaW5vZGUgKmlwKTsKLQotZXh0ZXJuIGludCBkdERpc3BsYXlQYWdlKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibiwgZHRwYWdlX3QgKiBwKTsKLSNlbmRpZgkJCQkvKiBfSkZTX0RFQlVHX0RUUkVFICovCi0KICNlbmRpZgkJCQkvKiAhX0hfSkZTX0RUUkVFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ltYXAuYyBiL2ZzL2pmcy9qZnNfaW1hcC5jCmluZGV4IDk3MWFmMjkuLjQwMjFkNDYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfaW1hcC5jCkBAIC04NywyNSArODcsNiBAQAogc3RhdGljIHZvaWQgY29weV90b19kaW5vZGUoc3RydWN0IGRpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qCi0gKglkZWJ1ZyBjb2RlIGZvciBkb3VibGUtY2hlY2tpbmcgaW5vZGUgbWFwCi0gKi8KLS8qICNkZWZpbmUJX0pGU19ERUJVR19JTUFQCTEgKi8KLQotI2lmZGVmCV9KRlNfREVCVUdfSU1BUAotI2RlZmluZSBEQkdfRElJTklUKGltYXApCURCR2RpSW5pdChpbWFwKQotI2RlZmluZSBEQkdfRElBTExPQyhpbWFwLCBpbm8pCURCR2RpQWxsb2MoaW1hcCwgaW5vKQotI2RlZmluZSBEQkdfRElGUkVFKGltYXAsIGlubykJREJHZGlGcmVlKGltYXAsIGlubykKLQotc3RhdGljIHZvaWQgKkRCR2RpSW5pdChzdHJ1Y3QgaW5vbWFwICogaW1hcCk7Ci1zdGF0aWMgdm9pZCBEQkdkaUFsbG9jKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbm9fdCBpbm8pOwotc3RhdGljIHZvaWQgREJHZGlGcmVlKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbm9fdCBpbm8pOwotI2Vsc2UKLSNkZWZpbmUgREJHX0RJSU5JVChpbWFwKQotI2RlZmluZSBEQkdfRElBTExPQyhpbWFwLCBpbm8pCi0jZGVmaW5lIERCR19ESUZSRUUoaW1hcCwgaW5vKQotI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfSU1BUCAqLwotCi0vKgogICogTkFNRTogICAgICAgIGRpTW91bnQoKQogICoKICAqIEZVTkNUSU9OOiAgICBpbml0aWFsaXplIHRoZSBpbmNvcmUgaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlcyBmb3IKQEAgLTE4OCw4ICsxNjksNiBAQAogCWltYXAtPmltX2lwaW1hcCA9IGlwaW1hcDsKIAlKRlNfSVAoaXBpbWFwKS0+aV9pbWFwID0gaW1hcDsKIAotLy8gICAgICBEQkdfRElJTklUKGltYXApOwotCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMTA0Myw3ICsxMDIyLDYgQEAKIAkJLyogdXBkYXRlIHRoZSBiaXRtYXAuCiAJCSAqLwogCQlpYWdwLT53bWFwW2V4dG5vXSA9IGNwdV90b19sZTMyKGJpdG1hcCk7Ci0JCURCR19ESUZSRUUoaW1hcCwgaW51bSk7CiAKIAkJLyogdXBkYXRlIHRoZSBmcmVlIGlub2RlIGNvdW50cyBhdCB0aGUgaWFnLCBhZyBhbmQKIAkJICogbWFwIGxldmVsLgpAQCAtMTIzMSw3ICsxMjA5LDYgQEAKIAkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlGcmVlOiB0aGUgcG1hcCBkb2VzIG5vdCBzaG93IGlub2RlIGZyZWUiKTsKIAl9CiAJaWFncC0+d21hcFtleHRub10gPSAwOwotCURCR19ESUZSRUUoaW1hcCwgaW51bSk7CiAJUFhEbGVuZ3RoKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKIAlQWERhZGRyZXNzKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKIApAQCAtMTM1MCw3ICsxMzI3LDYgQEAKIAlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IEpGU19JUChpcCk7CiAKIAlpcC0+aV9pbm8gPSAoaWFnbm8gPDwgTDJJTk9TUEVSSUFHKSArIGlubzsKLQlEQkdfRElBTExPQyhKRlNfSVAoaXBpbWFwKS0+aV9pbWFwLCBpcC0+aV9pbm8pOwogCWpmc19pcC0+aXhweGQgPSBpYWdwLT5pbm9leHRbZXh0bm9dOwogCWpmc19pcC0+YWdubyA9IEJMS1RPQUcobGU2NF90b19jcHUoaWFncC0+YWdzdGFydCksIHNiaSk7CiAJamZzX2lwLT5hY3RpdmVfYWcgPSAtMTsKQEAgLTMxODUsODQgKzMxNjEsMyBAQAogCWlmIChTX0lTQ0hSKGlwLT5pX21vZGUpIHx8IFNfSVNCTEsoaXAtPmlfbW9kZSkpCiAJCWRpcC0+ZGlfcmRldiA9IGNwdV90b19sZTMyKGpmc19pcC0+ZGV2KTsKIH0KLQotI2lmZGVmCV9KRlNfREVCVUdfSU1BUAotLyoKLSAqCURCR2RpSW5pdCgpCi0gKi8KLXN0YXRpYyB2b2lkICpEQkdkaUluaXQoc3RydWN0IGlub21hcCAqIGltYXApCi17Ci0JdTMyICpkaW1hcDsKLQlpbnQgc2l6ZTsKLQlzaXplID0gNjQgKiAxMDI0OwotCWlmICgoZGltYXAgPSAodTMyICopIHhtYWxsb2Moc2l6ZSwgTDJQU0laRSwga2VybmVsX2hlYXApKSA9PSBOVUxMKQotCQlhc3NlcnQoMCk7Ci0JYnplcm8oKHZvaWQgKikgZGltYXAsIHNpemUpOwotCWltYXAtPmltX0RCR2RpbWFwID0gZGltYXA7Ci19Ci0KLS8qCi0gKglEQkdkaUFsbG9jKCkKLSAqLwotc3RhdGljIHZvaWQgREJHZGlBbGxvYyhzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW5vX3QgaW5vKQotewotCXUzMiAqZGltYXAgPSBpbWFwLT5pbV9EQkdkaW1hcDsKLQlpbnQgdywgYjsKLQl1MzIgbTsKLQl3ID0gaW5vID4+IDU7Ci0JYiA9IGlubyAmIDMxOwotCW0gPSAweDgwMDAwMDAwID4+IGI7Ci0JYXNzZXJ0KHcgPCA2NCAqIDI1Nik7Ci0JaWYgKGRpbWFwW3ddICYgbSkgewotCQlwcmludGsoIkRFQlVHIGRpQWxsb2M6IGR1cGxpY2F0ZSBhbGxvYyBpbm86MHgleFxuIiwgaW5vKTsKLQl9Ci0JZGltYXBbd10gfD0gbTsKLX0KLQotLyoKLSAqCURCR2RpRnJlZSgpCi0gKi8KLXN0YXRpYyB2b2lkIERCR2RpRnJlZShzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW5vX3QgaW5vKQotewotCXUzMiAqZGltYXAgPSBpbWFwLT5pbV9EQkdkaW1hcDsKLQlpbnQgdywgYjsKLQl1MzIgbTsKLQl3ID0gaW5vID4+IDU7Ci0JYiA9IGlubyAmIDMxOwotCW0gPSAweDgwMDAwMDAwID4+IGI7Ci0JYXNzZXJ0KHcgPCA2NCAqIDI1Nik7Ci0JaWYgKChkaW1hcFt3XSAmIG0pID09IDApIHsKLQkJcHJpbnRrKCJERUJVRyBkaUZyZWU6IGR1cGxpY2F0ZSBmcmVlIGlubzoweCV4XG4iLCBpbm8pOwotCX0KLQlkaW1hcFt3XSAmPSB+bTsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9jcChzdHJ1Y3QgaW5vbWFwICogaXBpbWFwLCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpCi17Ci0JcHJpbnRrKCJcbiogKioqKioqKioqICpcbkNvbnRyb2wgUGFnZSAlcyAlZFxuIiwgZnVuY3Rpb24sIGxpbmUpOwotCXByaW50aygiRnJlZUlBRyAlZFx0TmV4dElBRyAlZFxuIiwgaXBpbWFwLT5pbV9mcmVlaWFnLAotCSAgICAgICBpcGltYXAtPmltX25leHRpYWcpOwotCXByaW50aygiTnVtSW5vcyAlZFx0TnVtRnJlZSAlZFxuIiwKLQkgICAgICAgYXRvbWljX3JlYWQoJmlwaW1hcC0+aW1fbnVtaW5vcyksCi0JICAgICAgIGF0b21pY19yZWFkKCZpcGltYXAtPmltX251bWZyZWUpKTsKLQlwcmludGsoIkFHIElub0ZyZWUgJWRcdEFHIEV4dEZyZWUgJWRcbiIsCi0JICAgICAgIGlwaW1hcC0+aW1fYWdjdGxbMF0uaW5vZnJlZSwgaXBpbWFwLT5pbV9hZ2N0bFswXS5leHRmcmVlKTsKLQlwcmludGsoIkFHIE51bUlub3MgJWRcdEFHIE51bUZyZWUgJWRcbiIsCi0JICAgICAgIGlwaW1hcC0+aW1fYWdjdGxbMF0ubnVtaW5vcywgaXBpbWFwLT5pbV9hZ2N0bFswXS5udW1mcmVlKTsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9pYWcoc3RydWN0IGlhZyAqIGlhZywgY2hhciAqZnVuY3Rpb24sIGludCBsaW5lKQotewotCXByaW50aygiXG4qICoqKioqKioqKiAqXG5JQUcgJXMgJWRcbiIsIGZ1bmN0aW9uLCBsaW5lKTsKLQlwcmludGsoIklhZ051bSAlZFx0SUFHIEZyZWUgJWRcbiIsIGxlMzJfdG9fY3B1KGlhZy0+aWFnbnVtKSwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5pYWdmcmVlKSk7Ci0JcHJpbnRrKCJJbm9GcmVlRndkICVkXHRJbm9GcmVlQmFjayAlZFxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5pbm9mcmVlZndkKSwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5pbm9mcmVlYmFjaykpOwotCXByaW50aygiRXh0RnJlZUZ3ZCAlZFx0RXh0RnJlZUJhY2sgJWRcbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+ZXh0ZnJlZWZ3ZCksCi0JICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+ZXh0ZnJlZWJhY2spKTsKLQlwcmludGsoIk5GcmVlSW5vcyAlZFx0TkZyZWVFeHRzICVkXG4iLCBsZTMyX3RvX2NwdShpYWctPm5mcmVlaW5vcyksCi0JICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+bmZyZWVleHRzKSk7Ci19Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19JTUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3VuaWNvZGUuYyBiL2ZzL2pmcy9qZnNfdW5pY29kZS5jCmluZGV4IGIzMjIwOGEuLmYzMjdkZWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfdW5pY29kZS5jCisrKyBiL2ZzL2pmcy9qZnNfdW5pY29kZS5jCkBAIC01MSw4ICs1MSw5IEBACiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyAoaSA8IGxlbikgJiYgZnJvbVtpXTsgaSsrKSB7Ci0JCQlpZiAobGUxNl90b19jcHUoZnJvbVtpXSkgJiAweGZmMDApIHsKLQkJCQlpZiAod2FybikgeworCQkJaWYgKHVubGlrZWx5KGxlMTZfdG9fY3B1KGZyb21baV0pICYgMHhmZjAwKSkgeworCQkJCXRvW2ldID0gJz8nOworCQkJCWlmICh1bmxpa2VseSh3YXJuKSkgewogCQkJCQl3YXJuLS07CiAJCQkJCXdhcm5fYWdhaW4tLTsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC02MSw3ICs2Miw3IEBACiAJCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJtb3VudCB3aXRoIGlvY2hhcnNldD11dGY4IHRvIGFjY2Vzc1xuIik7CiAJCQkJfQotCQkJCXRvW2ldID0gJz8nOworCiAJCQl9CiAJCQllbHNlCiAJCQkJdG9baV0gPSAoY2hhcikgKGxlMTZfdG9fY3B1KGZyb21baV0pKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfeHRyZWUuYyBiL2ZzL2pmcy9qZnNfeHRyZWUuYwppbmRleCAzMWIzNGRiLi5hN2ZlMmYyIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3h0cmVlLmMKKysrIGIvZnMvamZzL2pmc194dHJlZS5jCkBAIC0xMzUsMTQgKzEzNSw2IEBACiBzdGF0aWMgaW50IHh0UmVsaW5rKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeHRwYWdlX3QgKiBmcCk7CiAjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCiAKLS8qIEV4dGVybmFsIHJlZmVyZW5jZXMgKi8KLQotLyoKLSAqICAgICAgZGVidWcgY29udHJvbAotICovCi0vKiAgICAgICNkZWZpbmUgX0pGU19ERUJVR19YVFJFRSAgICAgICAgMSAqLwotCi0KIC8qCiAgKiAgICAgIHh0TG9va3VwKCkKICAqCkBAIC00MTQwLDMzOCArNDEzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotI2lmZGVmIF9KRlNfREVCVUdfWFRSRUUKLS8qCi0gKiAgICAgIHh0RGlzcGxheVRyZWUoKQotICoKLSAqIGZ1bmN0aW9uOiB0cmF2ZXJzZSBmb3J3YXJkCi0gKi8KLWludCB4dERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwotCXh0cGFnZV90ICpwOwotCXM2NCBibiwgcGJuOwotCWludCBpbmRleCwgbGFzdGluZGV4LCB2LCBoOwotCXhhZF90ICp4YWQ7Ci0Jc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKLQlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKLQlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OwotCi0JcHJpbnRrKCJkaXNwbGF5IEIrLXRyZWUuXG4iKTsKLQotCS8qIGNsZWFyIHN0YWNrICovCi0JYnRzcCA9IGJ0c3RhY2suc3RhY2s7Ci0KLQkvKgotCSAqIHN0YXJ0IHdpdGggcm9vdAotCSAqCi0JICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQotCSAqLwotCWJuID0gMDsKLQl2ID0gaCA9IDA7Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6Ci0JICovCi0gICAgICBnZXRQYWdlOgotCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIHByb2Nlc3MgZW50cmllcyBmb3J3YXJkIGZyb20gZmlyc3QgaW5kZXggKi8KLQlpbmRleCA9IFhURU5UUllTVEFSVDsKLQlsYXN0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7Ci0KLQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgewotCQkvKgotCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBwYWdlCi0JCSAqLwotCQlnb3RvIGdldENoaWxkOwotCX0gZWxzZSB7CQkvKiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAqLwotCi0JCS8qCi0JCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGxlYWYgcGFnZQotCQkgKi8KLQkJcHJpbnRmKCJsZWFmIHBhZ2UgIik7Ci0JCXh0RGlzcGxheVBhZ2UoaXAsIGJuLCBwKTsKLQotCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCi0JCVhUX1BVVFBBR0UobXApOwotCX0KLQotCS8qCi0JICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKLQkgKi8KLSAgICAgIGdldFBhcmVudDoKLQkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KLQlpZiAoKHBhcmVudCA9IChidHNwID09IGJ0c3RhY2suc3RhY2sgPyBOVUxMIDogLS1idHNwKSkgPT0gTlVMTCkKLQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAotCSAqLwotCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSAobGFzdGluZGV4ID0gcGFyZW50LT5sYXN0aW5kZXgpKSB7Ci0JCS8qIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlICovCi0JCWdvdG8gZ2V0UGFyZW50OwotCX0KLQotCS8qCi0JICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCi0JICovCi0JLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCi0JYm4gPSBwYXJlbnQtPmJuOwotCS8qIHYgPSBwYXJlbnQtPmxldmVsOyAqLwotCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGdldCBuZXh0IHBhcmVudCBlbnRyeSAqLwotCWluZGV4Kys7Ci0KLQkvKgotCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5Ci0JICovCi0gICAgICBnZXRDaGlsZDoKLQkvKiBwdXNoL3NhdmUgY3VycmVudCBwYXJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCi0JYnRzcC0+Ym4gPSBwYm4gPSBibjsKLQlidHNwLT5pbmRleCA9IGluZGV4OwotCWJ0c3AtPmxhc3RpbmRleCA9IGxhc3RpbmRleDsKLQkvKiBidHNwLT5sZXZlbCA9IHY7ICovCi0JLyogYnRzcC0+bm9kZSA9IGg7ICovCi0JKytidHNwOwotCi0JLyogZ2V0IGNoaWxkIHBhZ2UgKi8KLQl4YWQgPSAmcC0+eGFkW2luZGV4XTsKLQlibiA9IGFkZHJlc3NYQUQoeGFkKTsKLQotCS8qCi0JICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6Ci0JICovCi0JLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLwotCVhUX1BVVFBBR0UobXApOwotCi0JcHJpbnRrKCJ0cmF2ZXJzZSBkb3duIDB4JWx4WyVkXS0+MHglbHhcbiIsICh1bG9uZykgcGJuLCBpbmRleCwKLQkgICAgICAgKHVsb25nKSBibik7Ci0JdisrOwotCWggPSBpbmRleDsKLQotCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KLQlnb3RvIGdldFBhZ2U7Ci19Ci0KLQotLyoKLSAqICAgICAgeHREaXNwbGF5UGFnZSgpCi0gKgotICogZnVuY3Rpb246IGRpc3BsYXkgcGFnZQotICovCi1pbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCkKLXsKLQlpbnQgcmMgPSAwOwotCXhhZF90ICp4YWQ7Ci0JczY0IHhhZGRyLCB4b2ZmOwotCWludCB4bGVuLCBpLCBqOwotCi0JLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KLQlwcmludGYoImJuOjB4JWx4IGZsYWc6MHgleCBuZXh0aW5kZXg6JWRcbiIsCi0JICAgICAgICh1bG9uZykgYm4sIHAtPmhlYWRlci5mbGFnLAotCSAgICAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSk7Ci0KLQkvKiBkaXNwbGF5IGVudHJpZXMgKi8KLQl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07Ci0JCWZvciAoaSA9IFhURU5UUllTVEFSVCwgaiA9IDE7IGkgPCBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKLQkJICAgICBpKyssIHhhZCsrLCBqKyspIHsKLQkJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKLQkJCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOwotCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOwotCQkJcHJpbnRmKCJcdFslZF0gMHglbHg6MHglbHgoMHgleCkiLCBpLCAodWxvbmcpIHhvZmYsCi0JCQkgICAgICAgKHVsb25nKSB4YWRkciwgeGxlbik7Ci0KLQkJCWlmIChqID09IDQpIHsKLQkJCQlwcmludGYoIlxuIik7Ci0JCQkJaiA9IDA7Ci0JCX0KLQl9Ci0KLQlwcmludGYoIlxuIik7Ci19Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLwotCi0KLSNpZmRlZiBfSkZTX1dJUAotLyoKLSAqICAgICAgeHRHYXRoZXIoKQotICoKLSAqIGZ1bmN0aW9uOgotICogICAgICB0cmF2ZXJzZSBmb3IgYWxsb2NhdGlvbiBhY3F1aXJpbmcgdGxvY2sgYXQgY29tbWl0IHRpbWUKLSAqICAgICAgKHZzIGF0IHRoZSB0aW1lIG9mIHVwZGF0ZSkgbG9nZ2luZyBiYWNrd2FyZCB0b3AgZG93bgotICoKLSAqIG5vdGU6Ci0gKiAgICAgIHByb2JsZW0gLSBlc3RhYmxpc2hpbmcgdGhhdCBhbGwgbmV3IGFsbG9jYXRpb24gaGF2ZSBiZWVuCi0gKiAgICAgIHByb2Nlc3NlZCBib3RoIGZvciBhcHBlbmQgYW5kIHJhbmRvbSB3cml0ZSBpbiBzcGFyc2UgZmlsZQotICogICAgICBhdCB0aGUgY3VycmVudCBlbnRyeSBhdCB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3QgcGFnZQotICoKLSAqLwotaW50IHh0R2F0aGVyKGJ0cmVlX3QgKnQpCi17Ci0JaW50IHJjID0gMDsKLQl4dHBhZ2VfdCAqcDsKLQl1NjQgYm47Ci0JaW50IGluZGV4OwotCWJ0ZW50cnlfdCAqZTsKLQlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOwotCXN0cnVjdCBidHNmICpwYXJlbnQ7Ci0KLQkvKiBjbGVhciBzdGFjayAqLwotCUJUX0NMUigmYnRzdGFjayk7Ci0KLQkvKgotCSAqIHN0YXJ0IHdpdGggcm9vdAotCSAqCi0JICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQotCSAqLwotCWJuID0gMDsKLQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBuZXcgcm9vdCBpcyBOT1QgcG9pbnRlZCBieSBhIG5ldyBlbnRyeQotCSAgIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKLQkgICBhbGxvY2F0ZSBuZXcgcGFnZSBsb2NrOwotCSAgIHdyaXRlIGEgTkVXUEFHRSBsb2c7Ci0JICovCi0KLSAgICAgIGRvcGFnZToKLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6Ci0JICovCi0JLyogcHJvY2VzcyBlbnRyaWVzIGJhY2t3YXJkIGZyb20gbGFzdCBpbmRleCAqLwotCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOwotCi0JaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgewotCQkvKgotCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKLQkJICovCi0JCS8qIHByb2Nlc3MgbGVhZiBwYWdlIGVudHJpZXMgYmFja3dhcmQgKi8KLQkJZm9yICg7IGluZGV4ID49IFhURU5UUllTVEFSVDsgaW5kZXgtLSkgewotCQkJZSA9ICZwLT54YWRbaW5kZXhdOwotCQkJLyoKLQkJCSAqIGlmIG5ld3BhZ2UsIGxvZyBORVdQQUdFLgotCQkJICoKLQkJCSBpZiAoZS0+ZmxhZyAmIFhBRF9ORVcpIHsKLQkJCSBuZm91bmQgPSsgZW50cnktPmxlbmd0aDsKLQkJCSB1cGRhdGUgY3VycmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKLQkJCSBuZXdwYWdlKGVudHJ5KTsKLQkJCSAqCi0JCQkgKiBpZiBtb3ZlZCwgbG9nIG1vdmUuCi0JCQkgKgotCQkJIH0gZWxzZSBpZiAoZS0+ZmxhZyAmIFhBRF9NT1ZFRCkgewotCQkJIHJlc2V0IGZsYWc7Ci0JCQkgdXBkYXRlIGN1cnJlbnQgcGFnZSBsb2NrIGZvciB0aGUgZW50cnk7Ci0JCQkgfQotCQkJICovCi0JCX0KLQotCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCi0JCVhUX1BVVFBBR0UobXApOwotCi0JCS8qCi0JCSAqIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlCi0JCSAqLwotCSAgICAgIGdldFBhcmVudDoKLQkJLyogcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KLQkJaWYgKChwYXJlbnQgPSBCVF9QT1AoJmJ0c3RhY2spKSA9PSBOVUxMKQotCQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KLQkJCXJldHVybiAwOwotCi0JCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSBYVEVOVFJZU1RBUlQpIHsKLQkJCS8qCi0JCQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAotCQkJICovCi0JCQkvKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZSAqLwotCQkJZ290byBnZXRQYXJlbnQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCi0JCQkgKi8KLQkJCS8qIGdldCBiYWNrIHRoZSBwYXJlbnQgcGFnZSAqLwotCQkJYm4gPSBwYXJlbnQtPmJuOwotCQkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOwotCQkJaWYgKHJjKQotCQkJCXJldHVybiAtRUlPOwotCi0JCQkvKiBmaXJzdCBzdWJyb290IHBhZ2Ugd2hpY2gKLQkJCSAqIGNvdmVycyBhbGwgbmV3IGFsbG9jYXRlZCBibG9ja3MKLQkJCSAqIGl0c2VsZiBub3QgbmV3L21vZGlmaWVkLgotCQkJICogKGlmIG1vZGlmaWVkIGZyb20gc3BsaXQgb2YgZGVzY2VuZGVudCwKLQkJCSAqIGdvIGRvd24gcGF0aCBvZiBzcGxpdCBwYWdlKQotCi0JCQkgaWYgKG5mb3VuZCA9PSBubmV3ICYmCi0JCQkgIShwLT5oZWFkZXIuZmxhZyAmIChORVcgfCBNT0QpKSkKLQkJCSBleGl0IHNjYW47Ci0JCQkgKi8KLQotCQkJLyogcHJvY2VzcyBwYXJlbnQgcGFnZSBlbnRyaWVzIGJhY2t3YXJkICovCi0JCQlpbmRleC0tOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQotCQkgKi8KLQl9Ci0KLQkvKgotCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5Ci0JICovCi0KLQkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLwotCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7Ci0KLQkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KLQllID0gJnAtPnhhZFtpbmRleF07Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGludGVybmFsIGVudHJ5OgotCSAqLwotCS8qCi0JICogaWYgbmV3IGVudHJ5LCBsb2cgYnRyZWVfdG5ld2VudHJ5LgotCSAqCi0JIGlmIChlLT5mbGFnICYgWEFEX05FVykKLQkgdXBkYXRlIHBhcmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKLQkgKi8KLQotCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KLQlYVF9QVVRQQUdFKG1wKTsKLQotCS8qIGdldCBjaGlsZCBwYWdlICovCi0JYm4gPSBlLT5ibjsKLQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIG5vbi1yb290IHBhZ2U6Ci0JICovCi0JLyoKLQkgKiBpZiBuZXcsIGxvZyBidHJlZV9uZXdwYWdlLgotCSAqCi0JIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKLQkgYWxsb2NhdGUgbmV3IHBhZ2UgbG9jazsKLQkgd3JpdGUgYSBORVdQQUdFIGxvZyAobmV4dCwgcHJldik7Ci0JICovCi0KLQkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCi0JZ290byBkb3BhZ2U7Ci0KLSAgICAgIG91dDoKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLwotCi0KICNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKIGludCBqZnNfeHRzdGF0X3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKIAkJICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc194dHJlZS5oIGIvZnMvamZzL2pmc194dHJlZS5oCmluZGV4IGE2OTc4NDIuLmFmNjY4YTggMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfeHRyZWUuaAorKysgYi9mcy9qZnMvamZzX3h0cmVlLmgKQEAgLTEzMSwxMCArMTMxLDQgQEAKIGV4dGVybiBpbnQgeHRBcHBlbmQodGlkX3QgdGlkLAogCQkgICAgc3RydWN0IGlub2RlICppcCwgaW50IHhmbGFnLCBzNjQgeG9mZiwgaW50IG1heGJsb2NrcywKIAkJICAgIGludCAqeGxlbnAsIHM2NCAqIHhhZGRycCwgaW50IGZsYWcpOwotCi0jaWZkZWYgIF9KRlNfREVCVUdfWFRSRUUKLWV4dGVybiBpbnQgeHREaXNwbGF5VHJlZShzdHJ1Y3QgaW5vZGUgKmlwKTsKLWV4dGVybiBpbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCk7Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLwotCiAjZW5kaWYJCQkJLyogIV9IX0pGU19YVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL3hhdHRyLmMgYi9mcy9qZnMveGF0dHIuYwppbmRleCBlZTQzOGQ0Li41NTRlYzczIDEwMDY0NAotLS0gYS9mcy9qZnMveGF0dHIuYworKysgYi9mcy9qZnMveGF0dHIuYwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJaWYgKElTX1JET05MWShpbm9kZSkpCiAJCXJldHVybiAtRVJPRlM7CiAKLQlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pID09IDApCkBAIC03OTAsMTIgKzc5MCwxMiBAQAogCQkgKi8KIAkJcmV0dXJuIGNhbl9zZXRfc3lzdGVtX3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKIAotCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikgIT0gMCkKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1RSVVNURURfUFJFRklYLCBYQVRUUl9UUlVTVEVEX1BSRUZJWF9MRU4pID09IDApCiAJCXJldHVybiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSA/IDAgOiAtRVBFUk0pOwogCiAjaWZkZWYgQ09ORklHX0pGU19TRUNVUklUWQogCWlmIChzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikKLQkgICAgIT0gMCkKKwkgICAgPT0gMCkKIAkJcmV0dXJuIDA7CS8qIExlYXZlIGl0IHRvIHRoZSBzZWN1cml0eSBtb2R1bGUgKi8KICNlbmRpZgogCQkKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggNmUyNDI1NS4uMTJhODU3YyAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKIAkJLnByb2NuYW1lCT0gIm5sbV9ncmFjZV9wZXJpb2QiLAogCQkuZGF0YQkJPSAmbmxtX2dyYWNlX3BlcmlvZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX2dyYWNlX3BlcmlvZF9taW4sCkBAIC0zNDEsNyArMzQxLDcgQEAKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCiAJCS5wcm9jbmFtZQk9ICJubG1fdGltZW91dCIsCiAJCS5kYXRhCQk9ICZubG1fdGltZW91dCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX3RpbWVvdXRfbWluLApkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggYTBiYzAzNC4uMjlmYTVkYSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xMjc2LDcgKzEyNzYsNyBAQAogICovCiBzdGF0aWMgaW50IF9fc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQogewotCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2UgPSAqZmxwOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2U7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3IsIHJkbGVhc2VfY291bnQgPSAwLCB3cmxlYXNlX2NvdW50ID0gMDsKQEAgLTEyODcsNiArMTI4Nyw4IEBACiAJaWYgKCFmbHAgfHwgISgqZmxwKSB8fCAhKCpmbHApLT5mbF9sbW9wcyB8fCAhKCpmbHApLT5mbF9sbW9wcy0+ZmxfYnJlYWspCiAJCWdvdG8gb3V0OwogCisJbGVhc2UgPSAqZmxwOworCiAJZXJyb3IgPSAtRUFHQUlOOwogCWlmICgoYXJnID09IEZfUkRMQ0spICYmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPiAwKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBmYThkZjgxLi4wMmE4MjRjIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMzE0LDcgKzMxNCw3IEBACiB2b2lkIHBhdGhfcmVsZWFzZV9vbl91bW91bnQoc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJZHB1dChuZC0+ZGVudHJ5KTsKLQlfbW50cHV0KG5kLT5tbnQpOworCW1udHB1dF9ub19leHBpcmUobmQtPm1udCk7CiB9CiAKIC8qCkBAIC0xMzEyLDcgKzEzMTIsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+Y3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCBuZCk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCX0KIAlyZXR1cm4gZXJyb3I7CkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X21rZGlyKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7CiAJfQogCXJldHVybiBlcnJvcjsKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJfQogCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCQlmc25vdGlmeV9ybWRpcihkZW50cnksIGRlbnRyeS0+ZF9pbm9kZSwgZGlyKTsKIAkJZF9kZWxldGUoZGVudHJ5KTsKIAl9CiAJZHB1dChkZW50cnkpOwpAQCAtMTg3NCw5ICsxODc0LDEwIEBACiAKIAkvKiBXZSBkb24ndCBkX2RlbGV0ZSgpIE5GUyBzaWxseXJlbmFtZWQgZmlsZXMtLXRoZXkgc3RpbGwgZXhpc3QuICovCiAJaWYgKCFlcnJvciAmJiAhKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSkgeworCQlmc25vdGlmeV91bmxpbmsoZGVudHJ5LCBkaXIpOwogCQlkX2RlbGV0ZShkZW50cnkpOwotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsKIAl9CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE5NTAsNyArMTk1MSw3IEBACiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjAyMyw3ICsyMDI0LDcgQEAKIAllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOwogCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjE4Nyw2ICsyMTg4LDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAJaW50IGlzX2RpciA9IFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKTsKKwljb25zdCBjaGFyICpvbGRfbmFtZTsKIAogCWlmIChvbGRfZGVudHJ5LT5kX2lub2RlID09IG5ld19kZW50cnktPmRfaW5vZGUpCiAgCQlyZXR1cm4gMDsKQEAgLTIyMDgsMTggKzIyMTAsMTggQEAKIAlEUVVPVF9JTklUKG9sZF9kaXIpOwogCURRVU9UX0lOSVQobmV3X2Rpcik7CiAKKwlvbGRfbmFtZSA9IGZzbm90aWZ5X29sZG5hbWVfaW5pdChvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKIAlpZiAoaXNfZGlyKQogCQllcnJvciA9IHZmc19yZW5hbWVfZGlyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWVsc2UKIAkJZXJyb3IgPSB2ZnNfcmVuYW1lX290aGVyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWlmICghZXJyb3IpIHsKLQkJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKLQkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKLQkJZWxzZSB7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7Ci0JCX0KKwkJY29uc3QgY2hhciAqbmV3X25hbWUgPSBvbGRfZGVudHJ5LT5kX25hbWUubmFtZTsKKwkJZnNub3RpZnlfbW92ZShvbGRfZGlyLCBuZXdfZGlyLCBvbGRfbmFtZSwgbmV3X25hbWUsIGlzX2Rpcik7CiAJfQorCWZzbm90aWZ5X29sZG5hbWVfZnJlZShvbGRfbmFtZSk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggMjA4YzA3OS4uNTg3ZWIwZCAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X21vdW50cyk7CiAJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2ZzbGluayk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobmFtZSkgewogCQkJaW50IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKIAkJCWNoYXIgKm5ld25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwpAQCAtMTY1LDggKzE2NSw4IEBACiAJCS8qIHN0aWNrIHRoZSBkdXBsaWNhdGUgbW91bnQgb24gdGhlIHNhbWUgZXhwaXJ5IGxpc3QKIAkJICogYXMgdGhlIG9yaWdpbmFsIGlmIHRoYXQgd2FzIG9uIG9uZSAqLwogCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJm9sZC0+bW50X2ZzbGluaykpCi0JCQlsaXN0X2FkZCgmbW50LT5tbnRfZnNsaW5rLCAmb2xkLT5tbnRfZnNsaW5rKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZvbGQtPm1udF9leHBpcmUpKQorCQkJbGlzdF9hZGQoJm1udC0+bW50X2V4cGlyZSwgJm9sZC0+bW50X2V4cGlyZSk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAJcmV0dXJuIG1udDsKQEAgLTM0NSwxMiArMzQ1LDEzIEBACiAJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgewogCQlsaXN0X2RlbCgmcC0+bW50X2xpc3QpOwogCQlsaXN0X2FkZCgmcC0+bW50X2xpc3QsICZraWxsKTsKKwkJcC0+bW50X25hbWVzcGFjZSA9IE5VTEw7CiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZraWxsKSkgewogCQltbnQgPSBsaXN0X2VudHJ5KGtpbGwubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobW50LT5tbnRfcGFyZW50ID09IG1udCkgewogCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCQl9IGVsc2UgewpAQCAtNjQ0LDcgKzY0NSw3IEBACiAJaWYgKG1udCkgewogCQkvKiBzdG9wIGJpbmQgbW91bnRzIGZyb20gZXhwaXJpbmcgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZnNsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZXhwaXJlKTsKIAkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCiAJCWVyciA9IGdyYWZ0X3RyZWUobW50LCBuZCk7CkBAIC03NDMsNyArNzQ0LDcgQEAKIAogCS8qIGlmIHRoZSBtb3VudCBpcyBtb3ZlZCwgaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBleHBpcmUKIAkgKiBhdXRvbWF0aWNhbGx5ICovCi0JbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2ZzbGluayk7CisJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2V4cGlyZSk7CiBvdXQyOgogCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIG91dDE6CkBAIC04MDcsMTIgKzgwOCwxMyBAQAogCQlnb3RvIHVubG9jazsKIAogCW5ld21udC0+bW50X2ZsYWdzID0gbW50X2ZsYWdzOworCW5ld21udC0+bW50X25hbWVzcGFjZSA9IGN1cnJlbnQtPm5hbWVzcGFjZTsKIAllcnIgPSBncmFmdF90cmVlKG5ld21udCwgbmQpOwogCiAJaWYgKGVyciA9PSAwICYmIGZzbGlzdCkgewogCQkvKiBhZGQgdG8gdGhlIHNwZWNpZmllZCBleHBpcmF0aW9uIGxpc3QgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmbmV3bW50LT5tbnRfZnNsaW5rLCBmc2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZuZXdtbnQtPm1udF9leHBpcmUsIGZzbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAKQEAgLTgyNCw2ICs4MjYsNTQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZG9fYWRkX21vdW50KTsKIAorc3RhdGljIHZvaWQgZXhwaXJlX21vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpCit7CisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCS8qCisJICogQ2hlY2sgaWYgbW91bnQgaXMgc3RpbGwgYXR0YWNoZWQsIGlmIG5vdCwgbGV0IHdob2V2ZXIgaG9sZHMgaXQgZGVhbAorCSAqIHdpdGggdGhlIHN1Y2tlcgorCSAqLworCWlmIChtbnQtPm1udF9wYXJlbnQgPT0gbW50KSB7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCBpdCBpcyBzdGlsbCBkZWFkOiB0aGUgY291bnQgc2hvdWxkIG5vdyBiZSAyIC0gYXMKKwkgKiBjb250cmlidXRlZCBieSB0aGUgdmZzbW91bnQgcGFyZW50IGFuZCB0aGUgbW50Z2V0IGFib3ZlCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgeworCQlzdHJ1Y3QgbmFtZWlkYXRhIG9sZF9uZDsKKworCQkvKiBkZWxldGUgZnJvbSB0aGUgbmFtZXNwYWNlICovCisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOworCQlkZXRhY2hfbW50KG1udCwgJm9sZF9uZCk7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCisJCS8qCisJCSAqIE5vdyBsYXkgaXQgdG8gcmVzdCBpZiB0aGlzIHdhcyB0aGUgbGFzdCByZWYgb24gdGhlIHN1cGVyYmxvY2sKKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmbW50LT5tbnRfc2ItPnNfYWN0aXZlKSA9PSAxKSB7CisJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCQlsb2NrX2tlcm5lbCgpOworCQkJRFFVT1RfT0ZGKG1udC0+bW50X3NiKTsKKwkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0KKwkJbW50cHV0KG1udCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU29tZW9uZSBicm91Z2h0IGl0IGJhY2sgdG8gbGlmZSB3aGlsc3Qgd2UgZGlkbid0IGhhdmUgYW55CisJCSAqIGxvY2tzIGhlbGQgc28gcmV0dXJuIGl0IHRvIHRoZSBleHBpcmF0aW9uIGxpc3QKKwkJICovCisJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2V4cGlyZSwgbW91bnRzKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KK30KKwogLyoKICAqIHByb2Nlc3MgYSBsaXN0IG9mIGV4cGlyYWJsZSBtb3VudHBvaW50cyB3aXRoIHRoZSBpbnRlbnQgb2YgZGlzY2FyZGluZyBhbnkKICAqIG1vdW50cG9pbnRzIHRoYXQgYXJlbid0IGluIHVzZSBhbmQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgc2luY2UgbGFzdCB3ZSBjYW1lCkBAIC04NDYsMTMgKzg5NiwxMyBAQAogCSAqIC0gc3RpbGwgbWFya2VkIGZvciBleHBpcnkgKG1hcmtlZCBvbiB0aGUgbGFzdCBjYWxsIGhlcmU7IG1hcmtzIGFyZQogCSAqICAgY2xlYXJlZCBieSBtbnRwdXQoKSkKIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9mc2xpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9leHBpcmUpIHsKIAkJaWYgKCF4Y2hnKCZtbnQtPm1udF9leHBpcnlfbWFyaywgMSkgfHwKIAkJICAgIGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgIT0gMSkKIAkJCWNvbnRpbnVlOwogCiAJCW1udGdldChtbnQpOwotCQlsaXN0X21vdmUoJm1udC0+bW50X2ZzbGluaywgJmdyYXZleWFyZCk7CisJCWxpc3RfbW92ZSgmbW50LT5tbnRfZXhwaXJlLCAmZ3JhdmV5YXJkKTsKIAl9CiAKIAkvKgpAQCAtODYyLDYxICs5MTIsMTkgQEAKIAkgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgewotCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9mc2xpbmspOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9leHBpcmUpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCiAJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKIAkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCiAJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKLQkJaWYgKCFuYW1lc3BhY2UgfHwgYXRvbWljX3JlYWQoJm5hbWVzcGFjZS0+Y291bnQpIDw9IDApCisJCWlmICghbmFtZXNwYWNlIHx8ICFuYW1lc3BhY2UtPnJvb3QpCiAJCQljb250aW51ZTsKIAkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOwogCiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAkJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOwotCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCi0JCS8qIGNoZWNrIHRoYXQgaXQgaXMgc3RpbGwgZGVhZDogdGhlIGNvdW50IHNob3VsZCBub3cgYmUgMiAtIGFzCi0JCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSB2ZnNtb3VudCBwYXJlbnQgYW5kIHRoZSBtbnRnZXQgYWJvdmUgKi8KLQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgewotCQkJc3RydWN0IHZmc21vdW50ICp4ZG1udDsKLQkJCXN0cnVjdCBkZW50cnkgKnhkZW50cnk7Ci0KLQkJCS8qIGRlbGV0ZSBmcm9tIHRoZSBuYW1lc3BhY2UgKi8KLQkJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfY2hpbGQpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50LT5kX21vdW50ZWQtLTsKLQotCQkJeGRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKLQkJCXhkbW50ID0gbW50LT5tbnRfcGFyZW50OwotCQkJbW50LT5tbnRfcGFyZW50ID0gbW50OwotCi0JCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7Ci0KLQkJCW1udHB1dCh4ZG1udCk7Ci0JCQlkcHV0KHhkZW50cnkpOwotCi0JCQkvKiBub3cgbGF5IGl0IHRvIHJlc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmIG9uIHRoZQotCQkJICogc3VwZXJibG9jayAqLwotCQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9zYi0+c19hY3RpdmUpID09IDEpIHsKLQkJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCi0JCQkJbG9ja19rZXJuZWwoKTsKLQkJCQlEUVVPVF9PRkYobW50LT5tbnRfc2IpOwotCQkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJfQotCi0JCQltbnRwdXQobW50KTsKLQkJfSBlbHNlIHsKLQkJCS8qIHNvbWVvbmUgYnJvdWdodCBpdCBiYWNrIHRvIGxpZmUgd2hpbHN0IHdlIGRpZG4ndAotCQkJICogaGF2ZSBhbnkgbG9ja3MgaGVsZCBzbyByZXR1cm4gaXQgdG8gdGhlIGV4cGlyYXRpb24KLQkJCSAqIGxpc3QgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2ZzbGluaywgbW91bnRzKTsKLQkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJfQotCisJCWV4cGlyZV9tb3VudChtbnQsIG1vdW50cyk7CiAJCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAKIAkJbW50cHV0KG1udCk7CkBAIC0xNDQ5LDE2ICsxNDU3LDEyIEBACiAKIHZvaWQgX19wdXRfbmFtZXNwYWNlKHN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSkKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKLQorCXN0cnVjdCB2ZnNtb3VudCAqcm9vdCA9IG5hbWVzcGFjZS0+cm9vdDsKKwluYW1lc3BhY2UtPnJvb3QgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlkb3duX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobW50LCAmbmFtZXNwYWNlLT5saXN0LCBtbnRfbGlzdCkgewotCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOwotCX0KLQotCXVtb3VudF90cmVlKG5hbWVzcGFjZS0+cm9vdCk7CisJdW1vdW50X3RyZWUocm9vdCk7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJa2ZyZWUobmFtZXNwYWNlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzYWNsLmMgYi9mcy9uZnMvbmZzM2FjbC5jCmluZGV4IGVlMzUzNmYuLjFiN2EzZWYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzYWNsLmMKKysrIGIvZnMvbmZzL25mczNhY2wuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzYWNsLmg+CiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCU5GU0RCR19QUk9DCkBAIC01Myw5ICs1Myw5IEBACiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCB0eXBlLCBlcnJvciA9IDA7CiAKLQlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUykgPT0gMCkKKwlpZiAoc3RyY21wKG5hbWUsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpID09IDApCiAJCXR5cGUgPSBBQ0xfVFlQRV9BQ0NFU1M7Ci0JZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpID09IDApCisJZWxzZSBpZiAoc3RyY21wKG5hbWUsIFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfREVGQVVMVDsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTgyLDkgKzgyLDkgQEAKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHR5cGUsIGVycm9yOwogCi0JaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApCisJaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfQUNDRVNTOwotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKQorCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgPT0gMCkKIAkJdHlwZSA9IEFDTF9UWVBFX0RFRkFVTFQ7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0xMDMsOSArMTAzLDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCWludCB0eXBlOwogCi0JaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApCisJaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfQUNDRVNTOwotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKQorCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgPT0gMCkKIAkJdHlwZSA9IEFDTF9UWVBFX0RFRkFVTFQ7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggZDcxZjE0NS4uZTA4ZWRjMSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtMTY5LDEyICsxNjksNiBAQAogCQkoaW50KW9wZW4tPm9wX2ZuYW1lLmxlbiwgb3Blbi0+b3BfZm5hbWUuZGF0YSwKIAkJb3Blbi0+b3Bfc3RhdGVvd25lcik7CiAKLQlpZiAobmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQotCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwotCi0JaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXJldHVybiBuZnNlcnJfbm9fZ3JhY2U7Ci0KIAkvKiBUaGlzIGNoZWNrIHJlcXVpcmVkIGJ5IHNwZWMuICovCiAJaWYgKG9wZW4tPm9wX2NyZWF0ZSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9OVUxMKQogCQlyZXR1cm4gbmZzZXJyX2ludmFsOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCmluZGV4IDA5NWYxNzQuLjU3ZWQ1MGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYworKysgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKQEAgLTExOSwyNSArMTE5LDEyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAotbmZzZDRfcmVjX2ZzeW5jKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyB2b2lkCituZnNkNF9zeW5jX3JlY19kaXIodm9pZCkKIHsKLQlzdHJ1Y3QgZmlsZSAqZmlscDsKLQlpbnQgc3RhdHVzID0gbmZzX29rOwotCi0JZHByaW50aygiTkZTRDogbmZzNF9mc3luY19yZWNfZGlyXG4iKTsKLQlmaWxwID0gZGVudHJ5X29wZW4oZGdldChkZW50cnkpLCBtbnRnZXQocmVjX2Rpci5tbnQpLCBPX1JEV1IpOwotCWlmIChJU19FUlIoZmlscCkpIHsKLQkJc3RhdHVzID0gUFRSX0VSUihmaWxwKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmZzeW5jKQotCQlzdGF0dXMgPSBmaWxwLT5mX29wLT5mc3luYyhmaWxwLCBmaWxwLT5mX2RlbnRyeSwgMCk7Ci0JZnB1dChmaWxwKTsKLW91dDoKLQlpZiAoc3RhdHVzKQotCQlwcmludGsoIm5mc2Q0OiB1bmFibGUgdG8gc3luYyByZWNvdmVyeSBkaXJlY3RvcnlcbiIpOwotCXJldHVybiBzdGF0dXM7CisJZG93bigmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwluZnNkX3N5bmNfZGlyKHJlY19kaXIuZGVudHJ5KTsKKwl1cCgmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIH0KIAogaW50CkBAIC0xNzYsNyArMTYzLDcgQEAKIAl1cCgmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJY2xwLT5jbF9maXJzdHN0YXRlID0gMTsKLQkJc3RhdHVzID0gbmZzZDRfcmVjX2ZzeW5jKHJlY19kaXIuZGVudHJ5KTsKKwkJbmZzZDRfc3luY19yZWNfZGlyKCk7CiAJfQogCW5mczRfcmVzZXRfdXNlcih1aWQsIGdpZCk7CiAJZHByaW50aygiTkZTRDogbmZzZDRfY3JlYXRlX2NsaWRfZGlyIHJldHVybnMgJWRcbiIsIHN0YXR1cyk7CkBAIC0zMDIsNyArMjg5LDkgQEAKIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X3VubGlua19jbGlkX2Rpci4gbmFtZSAlLipzXG4iLCBuYW1sZW4sIG5hbWUpOwogCisJZG93bigmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCByZWNfZGlyLmRlbnRyeSwgbmFtbGVuKTsKKwl1cCgmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihkZW50cnkpOwogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMzI3LDExICszMTYsMTIgQEAKIAlpZiAoIXJlY19kaXJfaW5pdCB8fCAhY2xwLT5jbF9maXJzdHN0YXRlKQogCQlyZXR1cm47CiAKKwljbHAtPmNsX2ZpcnN0c3RhdGUgPSAwOwogCW5mczRfc2F2ZV91c2VyKCZ1aWQsICZnaWQpOwogCXN0YXR1cyA9IG5mc2Q0X3VubGlua19jbGlkX2RpcihjbHAtPmNsX3JlY2RpciwgSEVYRElSX0xFTi0xKTsKIAluZnM0X3Jlc2V0X3VzZXIodWlkLCBnaWQpOwogCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbmZzZDRfcmVjX2ZzeW5jKHJlY19kaXIuZGVudHJ5KTsKKwkJbmZzZDRfc3luY19yZWNfZGlyKCk7CiAJaWYgKHN0YXR1cykKIAkJcHJpbnRrKCJORlNEOiBGYWlsZWQgdG8gcmVtb3ZlIGV4cGlyZWQgY2xpZW50IHN0YXRlIGRpcmVjdG9yeSIKIAkJCQkiICUuKnNcbiIsIEhFWERJUl9MRU4sIGNscC0+Y2xfcmVjZGlyKTsKQEAgLTM2Miw3ICszNTIsNyBAQAogCQlyZXR1cm47CiAJc3RhdHVzID0gbmZzZDRfbGlzdF9yZWNfZGlyKHJlY19kaXIuZGVudHJ5LCBwdXJnZV9vbGQpOwogCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbmZzZDRfcmVjX2ZzeW5jKHJlY19kaXIuZGVudHJ5KTsKKwkJbmZzZDRfc3luY19yZWNfZGlyKCk7CiAJaWYgKHN0YXR1cykKIAkJcHJpbnRrKCJuZnNkNDogZmFpbGVkIHRvIHB1cmdlIG9sZCBjbGllbnRzIGZyb20gcmVjb3ZlcnkiCiAJCQkiIGRpcmVjdG9yeSAlc1xuIiwgcmVjX2Rpci5kZW50cnktPmRfbmFtZS5uYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDg5ZTM2NTIuLmI4M2Y4ZmIgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtODc0LDYgKzg3NCw3IEBACiAJCQkgICogY2hhbmdlIHJlcXVlc3QgY29ycmVjdGx5LiAqLwogCQkJYXRvbWljX3NldCgmY29uZi0+Y2xfY2FsbGJhY2suY2Jfc2V0LCAwKTsKIAkJCWdlbl9jb25maXJtKGNvbmYpOworCQkJbmZzZDRfcmVtb3ZlX2NsaWRfZGlyKHVuY29uZik7CiAJCQlleHBpcmVfY2xpZW50KHVuY29uZik7CiAJCQlzdGF0dXMgPSBuZnNfb2s7CiAKQEAgLTExNTksNiArMTE2MCw3IEBACiAJc3RwLT5zdF9kZW55X2JtYXAgPSAwOwogCV9fc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MsICZzdHAtPnN0X2FjY2Vzc19ibWFwKTsKIAlfX3NldF9iaXQob3Blbi0+b3Bfc2hhcmVfZGVueSwgJnN0cC0+c3RfZGVueV9ibWFwKTsKKwlzdHAtPnN0X29wZW5zdHAgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTI5NCw3ICsxMjk2LDcgQEAKIAlmcCA9IGZpbmRfZmlsZShpbm8pOwogCWlmICghZnApCiAJCXJldHVybiBuZnNfb2s7Ci0JcmV0ID0gbmZzZXJyX3NoYXJlX2RlbmllZDsKKwlyZXQgPSBuZnNlcnJfbG9ja2VkOwogCS8qIFNlYXJjaCBmb3IgY29uZmxpY3Rpbmcgc2hhcmUgcmVzZXJ2YXRpb25zICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHAsICZmcC0+Zmlfc3RhdGVpZHMsIHN0X3BlcmZpbGUpIHsKIAkJaWYgKHRlc3RfYml0KGRlbnlfdHlwZSwgJnN0cC0+c3RfZGVueV9ibWFwKSB8fApAQCAtMTQ4Miw3ICsxNDg0LDcgQEAKIAlpZiAoc29wKSB7CiAJCW9wZW4tPm9wX3N0YXRlb3duZXIgPSBzb3A7CiAJCS8qIGNoZWNrIGZvciByZXBsYXkgKi8KLQkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQpeworCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCAtIDEpewogCQkJaWYgKHNvcC0+c29fcmVwbGF5LnJwX2J1ZmxlbikKIAkJCQlyZXR1cm4gTkZTRVJSX1JFUExBWV9NRTsKIAkJCWVsc2UgewpAQCAtMTQ5Nyw3ICsxNDk5LDcgQEAKIAkJCQlnb3RvIHJlbmV3OwogCQkJfQogCQl9IGVsc2UgaWYgKHNvcC0+c29fY29uZmlybWVkKSB7Ci0JCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCArIDEpCisJCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCkKIAkJCQlnb3RvIHJlbmV3OwogCQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKIAkJCWdvdG8gb3V0OwpAQCAtMTUzMCw4ICsxNTMyLDYgQEAKIAlzdGF0dXMgPSBuZnNfb2s7CiAJcmVuZXdfY2xpZW50KHNvcC0+c29fY2xpZW50KTsKIG91dDoKLQlpZiAoc3RhdHVzICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQotCQlzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTY4NSwxOSArMTY4NSwxMSBAQAogfQogCiAKLS8qIGRlY3JlbWVudCBzZXFpZCBvbiBzdWNjZXNzZnVsIHJlY2xhaW0sIGl0IHdpbGwgYmUgYnVtcGVkIGluIGVuY29kZV9vcGVuICovCiBzdGF0aWMgdm9pZAotbmZzNF9zZXRfY2xhaW1fcHJldihzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwgaW50ICpzdGF0dXMpCituZnM0X3NldF9jbGFpbV9wcmV2KHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewotCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykgewotCQlpZiAoKnN0YXR1cykKLQkJCSpzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7Ci0JCWVsc2UgewotCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKLQkJCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX2NsaWVudC0+Y2xfZmlyc3RzdGF0ZSA9IDE7Ci0JCQlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19zZXFpZC0tOwotCQl9Ci0JfQorCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX2NvbmZpcm1lZCA9IDE7CisJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbF9maXJzdHN0YXRlID0gMTsKIH0KIAogLyoKQEAgLTE3ODksNiArMTc4MSwxMiBAQAogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gTlVMTDsKIAlpbnQgc3RhdHVzOwogCisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKworCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQorCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOworCiAJc3RhdHVzID0gbmZzZXJyX2ludmFsOwogCWlmICghVEVTVF9BQ0NFU1Mob3Blbi0+b3Bfc2hhcmVfYWNjZXNzKSB8fCAhVEVTVF9ERU5ZKG9wZW4tPm9wX3NoYXJlX2RlbnkpKQogCQlnb3RvIG91dDsKQEAgLTE4MjMsNiArMTgyMSw3IEBACiAJCXN0YXR1cyA9IG5mczRfdXBncmFkZV9vcGVuKHJxc3RwLCBjdXJyZW50X2ZoLCBzdHAsIG9wZW4pOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CisJCXVwZGF0ZV9zdGF0ZWlkKCZzdHAtPnN0X3N0YXRlaWQpOwogCX0gZWxzZSB7CiAJCS8qIFN0YXRlaWQgd2FzIG5vdCBmb3VuZCwgdGhpcyBpcyBhIG5ldyBPUEVOICovCiAJCWludCBmbGFncyA9IDA7CkBAIC0xODU2LDggKzE4NTUsOCBAQAogb3V0OgogCWlmIChmcCkKIAkJcHV0X25mczRfZmlsZShmcCk7Ci0JLyogQ0xBSU1fUFJFVklPVVMgaGFzIGRpZmZlcmVudCBlcnJvciByZXR1cm5zICovCi0JbmZzNF9zZXRfY2xhaW1fcHJldihvcGVuLCAmc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDAgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCW5mczRfc2V0X2NsYWltX3ByZXYob3Blbik7CiAJLyoKIAkqIFRvIGZpbmlzaCB0aGUgb3BlbiByZXNwb25zZSwgd2UganVzdCBuZWVkIHRvIHNldCB0aGUgcmZsYWdzLgogCSovCkBAIC0xOTkwLDE0ICsxOTg5LDExIEBACiAJcXVldWVfZGVsYXllZF93b3JrKGxhdW5kcnlfd3EsICZsYXVuZHJvbWF0X3dvcmssIHQqSFopOwogfQogCi0vKiBzZWFyY2ggb3duZXJpZF9oYXNodGJsW10gYW5kIGNsb3NlX2xydSBmb3Igc3RhdGVpZCBvd25lcgotICogKHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCkKLSAqLwogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgotZmluZF9vcGVuc3RhdGVvd25lcl9pZCh1MzIgc3RfaWQsIGludCBmbGFncykgeworc2VhcmNoX2Nsb3NlX2xydSh1MzIgc3RfaWQsIGludCBmbGFncykKK3sKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NhbCA9IE5VTEw7CiAKLQlkcHJpbnRrKCJORlNEOiBmaW5kX29wZW5zdGF0ZW93bmVyX2lkICVkXG4iLCBzdF9pZCk7CiAJaWYgKGZsYWdzICYgQ0xPU0VfU1RBVEUpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmNsb3NlX2xydSwgc29fY2xvc2VfbHJ1KSB7CiAJCQlpZiAobG9jYWwtPnNvX2lkID09IHN0X2lkKQpAQCAtMjE2MywxNCArMjE1OSwxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitzZXRsa2ZsZyAoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IE5GUzRfUkVBRFdfTFQgfHwgdHlwZSA9PSBORlM0X1JFQURfTFQpID8KKwkJUkRfU1RBVEUgOiBXUl9TVEFURTsKK30KIAogLyogCiAgKiBDaGVja3MgZm9yIHNlcXVlbmNlIGlkIG11dGF0aW5nIG9wZXJhdGlvbnMuIAogICovCiBzdGF0aWMgaW50Ci1uZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3Aoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgdTMyIHNlcWlkLCBzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncywgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnNvcHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwLCBjbGllbnRpZF90ICpsb2NrY2xpZCkKK25mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgc2VxaWQsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqc29wcCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQogewotCWludCBzdGF0dXM7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKIApAQCAtMjE3OCw1MyArMjE3OSw2NSBAQAogCQkJInN0YXRlaWQgPSAoJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsIHNlcWlkLAogCQlzdGF0ZWlkLT5zaV9ib290LCBzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIHN0YXRlaWQtPnNpX2ZpbGVpZCwKIAkJc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbik7Ci0JCQkgICAgICAgIAorCiAJKnN0cHAgPSBOVUxMOwogCSpzb3BwID0gTlVMTDsKIAotCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKIAlpZiAoWkVST19TVEFURUlEKHN0YXRlaWQpIHx8IE9ORV9TVEFURUlEKHN0YXRlaWQpKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogbWFnaWMgc3RhdGVpZCFcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKIAl9CiAKLQlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfc3RhdGVpZDsKIAlpZiAoU1RBTEVfU1RBVEVJRChzdGF0ZWlkKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfc3RhbGVfc3RhdGVpZDsKIAkvKgogCSogV2UgcmV0dXJuIEJBRF9TVEFURUlEIGlmIGZpbGVoYW5kbGUgZG9lc24ndCBtYXRjaCBzdGF0ZWlkLCAKIAkqIHRoZSBjb25maXJtZWQgZmxhZyBpcyBpbmNvcnJlY2x5IHNldCwgb3IgdGhlIGdlbmVyYXRpb24gCiAJKiBudW1iZXIgaXMgaW5jb3JyZWN0LiAgCi0JKiBJZiB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgb3BlbmZpbGUgdGFibGUgZm9yIHRoaXMgaWQsIAotCSogd2UgY2FuJ3QgYWx3YXlzIHJldHVybiBCQURfU1RBVEVJRDsKLQkqIHRoaXMgbWlnaHQgYmUgYSByZXRyYW5zbWl0dGVkIENMT1NFIHdoaWNoIGhhcyBhcnJpdmVkIGFmdGVyIAotCSogdGhlIG9wZW5maWxlIGhhcyBiZWVuIHJlbGVhc2VkLgogCSovCi0JaWYgKCEoc3RwID0gZmluZF9zdGF0ZWlkKHN0YXRlaWQsIGZsYWdzKSkpCi0JCWdvdG8gbm9fbmZzNF9zdGF0ZWlkOworCXN0cCA9IGZpbmRfc3RhdGVpZChzdGF0ZWlkLCBmbGFncyk7CisJaWYgKHN0cCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEFsc28sIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBpc24ndCBqdXN0IHRoZSByZXN1bHQgb2YKKwkJICogYSByZXBsYXllZCBjbG9zZToKKwkJICovCisJCXNvcCA9IHNlYXJjaF9jbG9zZV9scnUoc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkLCBmbGFncyk7CisJCWlmIChzb3AgPT0gTlVMTCkKKwkJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJCSpzb3BwID0gc29wOworCQlnb3RvIGNoZWNrX3JlcGxheTsKKwl9CiAKLQlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7Ci0KLQkvKiBmb3IgbmV3IGxvY2sgc3RhdGVvd25lcnM6Ci0JICogY2hlY2sgdGhhdCB0aGUgbG9jay0+di5uZXcub3Blbl9zdGF0ZWlkCi0JICogcmVmZXJzIHRvIGFuIG9wZW4gc3RhdGVvd25lcgotCSAqCi0JICogY2hlY2sgdGhhdCB0aGUgbG9ja2NsaWQgKG5mczRfbG9jay0+di5uZXcuY2xpZW50aWQpIGlzIHRoZSBzYW1lCi0JICogYXMgdGhlIG9wZW5fc3RhdGVpZC0+c3Rfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbGllbnRpZAotCSAqLwotCWlmIChsb2NrY2xpZCkgeworCWlmIChsb2NrKSB7CiAJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKKwkJY2xpZW50aWRfdCAqbG9ja2NsaWQgPSAmbG9jay0+di5uZXcuY2xpZW50aWQ7CiAJCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc29wLT5zb19jbGllbnQ7CisJCWludCBsa2ZsZyA9IDA7CisJCWludCBzdGF0dXM7CiAKLQkJaWYgKCFzb3AtPnNvX2lzX29wZW5fb3duZXIpCi0JCQlnb3RvIG91dDsKLQkJaWYgKCFjbXBfY2xpZCgmY2xwLT5jbF9jbGllbnRpZCwgbG9ja2NsaWQpKQotCQkJZ290byBvdXQ7CisJCWxrZmxnID0gc2V0bGtmbGcobG9jay0+bGtfdHlwZSk7CisKKwkJaWYgKGxvY2stPmxrX2lzX25ldykgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvcC0+c29faXNfb3Blbl9vd25lcikKKwkJCSAgICAgICByZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBsb2NrY2xpZCkpCisJCQkgICAgICAgcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogc3RwIGlzIHRoZSBvcGVuIHN0YXRlaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmZzNF9jaGVja19vcGVubW9kZShzdHAsIGxrZmxnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cykKKwkJCSAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogc3RwIGlzIHRoZSBsb2NrIHN0YXRlaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmZzNF9jaGVja19vcGVubW9kZShzdHAtPnN0X29wZW5zdHAsIGxrZmxnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cykKKwkJCSAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgfQorCiAJfQogCiAJaWYgKChmbGFncyAmIENIRUNLX0ZIKSAmJiBuZnM0X2NoZWNrX2ZoKGN1cnJlbnRfZmgsIHN0cCkpIHsKIAkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBmaC1zdGF0ZWlkIG1pc21hdGNoIVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAogCSpzdHBwID0gc3RwOwpAQCAtMjIzNSw2MyArMjI0OCw0MSBAQAogCSogIEZvciB0aGUgbW9tZW50LCB3ZSBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IG9mIAogCSogIGdlbmVyYXRpb24gbnVtYmVyIHdyYXBhcm91bmQuCiAJKi8KLQlpZiAoc2VxaWQgIT0gc29wLT5zb19zZXFpZCArIDEpCisJaWYgKHNlcWlkICE9IHNvcC0+c29fc2VxaWQpCiAJCWdvdG8gY2hlY2tfcmVwbGF5OwogCi0JaWYgKHNvcC0+c29fY29uZmlybWVkKSB7Ci0JCWlmIChmbGFncyAmIENPTkZJUk0pIHsKLQkJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogZXhwZWN0ZWQgdW5jb25maXJtZWQgc3RhdGVvd25lciFcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoc29wLT5zb19jb25maXJtZWQgJiYgZmxhZ3MgJiBDT05GSVJNKSB7CisJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogZXhwZWN0ZWQiCisJCQkJIiB1bmNvbmZpcm1lZCBzdGF0ZW93bmVyIVxuIik7CisJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CiAJfQotCWVsc2UgewotCQlpZiAoIShmbGFncyAmIENPTkZJUk0pKSB7Ci0JCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHN0YXRlb3duZXIgbm90IGNvbmZpcm1lZCB5ZXQhXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9CisJaWYgKCFzb3AtPnNvX2NvbmZpcm1lZCAmJiAhKGZsYWdzICYgQ09ORklSTSkpIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBzdGF0ZW93bmVyIG5vdCIKKwkJCQkiIGNvbmZpcm1lZCB5ZXQhXG4iKTsKKwkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKIAl9CiAJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gPiBzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbikgewogCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGZ1dHVyZSBzdGF0ZWlkPyFcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKIAl9CiAKLQlzdGF0dXMgPSBuZnNlcnJfb2xkX3N0YXRlaWQ7CiAJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gPCBzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbikgewogCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IG9sZCBzdGF0ZWlkIVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX29sZF9zdGF0ZWlkOwogCX0KLQkvKiBYWFggcmVuZXcgdGhlIGNsaWVudCBsZWFzZSBoZXJlICovCi0Jc3RhdHVzID0gbmZzX29rOwotCi1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKLQotbm9fbmZzNF9zdGF0ZWlkOgotCi0JLyoKLQkqIFdlIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBiYWQgc3RhdGVpZCBvciBhIHJlcGxheSwgCi0JKiBzdGFydGluZyBieSB0cnlpbmcgdG8gbG9vayB1cCB0aGUgc3RhdGVvd25lci4KLQkqIElmIHN0YXRlb3duZXIgaXMgbm90IGZvdW5kIC0gc3RhdGVpZCBpcyBiYWQuCi0JKi8KLQlpZiAoIShzb3AgPSBmaW5kX29wZW5zdGF0ZW93bmVyX2lkKHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgZmxhZ3MpKSkgewotCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IG5vIHN0YXRlb3duZXIgb3IgbmZzNF9zdGF0ZWlkIVxuIik7Ci0JCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKLQkJZ290byBvdXQ7Ci0JfQotCSpzb3BwID0gc29wOworCXJlbmV3X2NsaWVudChzb3AtPnNvX2NsaWVudCk7CisJcmV0dXJuIG5mc19vazsKIAogY2hlY2tfcmVwbGF5OgotCWlmIChzZXFpZCA9PSBzb3AtPnNvX3NlcWlkKSB7CisJaWYgKHNlcWlkID09IHNvcC0+c29fc2VxaWQgLSAxKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogcmV0cmFuc21pc3Npb24/XG4iKTsKIAkJLyogaW5kaWNhdGUgcmVwbGF5IHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KLQkJc3RhdHVzID0gTkZTRVJSX1JFUExBWV9NRTsKLQl9IGVsc2UgIHsKLQkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBiYWQgc2VxaWQgKGV4cGVjdGVkICVkLCBnb3QgJWRcbiIsIHNvcC0+c29fc2VxaWQgKzEsIHNlcWlkKTsKLQotCQkqc29wcCA9IE5VTEw7Ci0JCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7CisJCXJldHVybiBORlNFUlJfUkVQTEFZX01FOwogCX0KLQlnb3RvIG91dDsKKwlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGJhZCBzZXFpZCAoZXhwZWN0ZWQgJWQsIGdvdCAlZClcbiIsCisJCQlzb3AtPnNvX3NlcWlkLCBzZXFpZCk7CisJKnNvcHAgPSBOVUxMOworCXJldHVybiBuZnNlcnJfYmFkX3NlcWlkOwogfQogCiBpbnQKQEAgLTI2MDksNyArMjYwMCw2IEBACiAgKiBvY2N1cmVkLiAKICAqCiAgKiBzdHJoYXNodmFsID0gbG9ja19vd25lcnN0cl9oYXNodmFsIAotICogc29fc2VxaWQgPSBsb2NrLT5sa19uZXdfbG9ja19zZXFpZCAtIDE6IGl0IGdldHMgYnVtcGVkIGluIGVuY29kZSAKICAqLwogCiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCkBAIC0yNjM0LDcgKzI2MjQsNyBAQAogCXNvcC0+c29faXNfb3Blbl9vd25lciA9IDA7CiAJc29wLT5zb19pZCA9IGN1cnJlbnRfb3duZXJpZCsrOwogCXNvcC0+c29fY2xpZW50ID0gY2xwOwotCXNvcC0+c29fc2VxaWQgPSBsb2NrLT5sa19uZXdfbG9ja19zZXFpZCAtIDE7CisJc29wLT5zb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkOwogCXNvcC0+c29fY29uZmlybWVkID0gMTsKIAlycCA9ICZzb3AtPnNvX3JlcGxheTsKIAlycC0+cnBfc3RhdHVzID0gTkZTRVJSX1NFUlZFUkZBVUxUOwpAQCAtMjY2OSw2ICsyNjU5LDcgQEAKIAlzdHAtPnN0X3Zmc19maWxlID0gb3Blbl9zdHAtPnN0X3Zmc19maWxlOyAvKiBGSVhNRSByZWZjb3VudD8/ICovCiAJc3RwLT5zdF9hY2Nlc3NfYm1hcCA9IG9wZW5fc3RwLT5zdF9hY2Nlc3NfYm1hcDsKIAlzdHAtPnN0X2RlbnlfYm1hcCA9IG9wZW5fc3RwLT5zdF9kZW55X2JtYXA7CisJc3RwLT5zdF9vcGVuc3RwID0gb3Blbl9zdHA7CiAKIG91dDoKIAlyZXR1cm4gc3RwOwpAQCAtMjY5OSwyMiArMjY5MCwxNyBAQAogCQkobG9uZyBsb25nKSBsb2NrLT5sa19vZmZzZXQsCiAJCShsb25nIGxvbmcpIGxvY2stPmxrX2xlbmd0aCk7CiAKLQlpZiAobmZzNF9pbl9ncmFjZSgpICYmICFsb2NrLT5sa19yZWNsYWltKQotCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwotCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIGxvY2stPmxrX3JlY2xhaW0pCi0JCXJldHVybiBuZnNlcnJfbm9fZ3JhY2U7Ci0KIAlpZiAoY2hlY2tfbG9ja19sZW5ndGgobG9jay0+bGtfb2Zmc2V0LCBsb2NrLT5sa19sZW5ndGgpKQogCQkgcmV0dXJuIG5mc2Vycl9pbnZhbDsKIAogCW5mczRfbG9ja19zdGF0ZSgpOwogCiAJaWYgKGxvY2stPmxrX2lzX25ldykgewotCS8qCi0JICogQ2xpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBuZXcgbG9ja293bmVyLgotCSAqIFVzZSBvcGVuIG93bmVyIGFuZCBvcGVuIHN0YXRlaWQgdG8gY3JlYXRlIGxvY2sgb3duZXIgYW5kIGxvY2sgCi0JICogc3RhdGVpZC4KLQkgKi8KKwkJLyoKKwkJICogQ2xpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBuZXcgbG9ja293bmVyLgorCQkgKiBVc2Ugb3BlbiBvd25lciBhbmQgb3BlbiBzdGF0ZWlkIHRvIGNyZWF0ZSBsb2NrIG93bmVyIGFuZAorCQkgKiBsb2NrIHN0YXRlaWQuCisJCSAqLwogCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCA9IE5VTEw7CiAJCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOwogCQkKQEAgLTI3MjQsMjMgKzI3MTAsMTQgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJLyogaXMgdGhlIG5ldyBsb2NrIHNlcWlkIHByZXNlbnRlZCBieSB0aGUgY2xpZW50IHplcm8/ICovCi0JCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7Ci0JCWlmIChsb2NrLT52Lm5ldy5sb2NrX3NlcWlkICE9IDApCi0JCQlnb3RvIG91dDsKLQogCQkvKiB2YWxpZGF0ZSBhbmQgdXBkYXRlIG9wZW4gc3RhdGVpZCBhbmQgb3BlbiBzZXFpZCAqLwogCQlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwgCiAJCQkJICAgICAgICBsb2NrLT5sa19uZXdfb3Blbl9zZXFpZCwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZIIHwgT1BFTl9TVEFURSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5fc29wLCAmb3Blbl9zdHAsCi0JCQkJCSZsb2NrLT52Lm5ldy5jbGllbnRpZCk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCWlmIChsb2NrLT5sa19yZWNsYWltKQotCQkJCXN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5fc29wLCAmb3Blbl9zdHAsIGxvY2spOworCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7Ci0JCX0KIAkJLyogY3JlYXRlIGxvY2tvd25lciBhbmQgbG9jayBzdGF0ZWlkICovCiAJCWZwID0gb3Blbl9zdHAtPnN0X2ZpbGU7CiAJCXN0cmhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwoZnAtPmZpX2lub2RlLCAKQEAgLTI3NjYsNyArMjc0Myw3IEBACiAJCQkJICAgICAgIGxvY2stPmxrX29sZF9sb2NrX3NlcWlkLCAKIAkJCQkgICAgICAgJmxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQsIAogCQkJCSAgICAgICBDSEVDS19GSCB8IExPQ0tfU1RBVEUsIAotCQkJCSAgICAgICAmbG9jay0+bGtfc3RhdGVvd25lciwgJmxvY2tfc3RwLCBOVUxMKTsKKwkJCQkgICAgICAgJmxvY2stPmxrX3N0YXRlb3duZXIsICZsb2NrX3N0cCwgbG9jayk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0yNzc4LDYgKzI3NTUsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJc3RhdHVzID0gbmZzZXJyX2dyYWNlOworCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIWxvY2stPmxrX3JlY2xhaW0pCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IG5mc2Vycl9ub19ncmFjZTsKKwlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBsb2NrLT5sa19yZWNsYWltKQorCQlnb3RvIG91dDsKKwogCWxvY2tzX2luaXRfbG9jaygmZmlsZV9sb2NrKTsKIAlzd2l0Y2ggKGxvY2stPmxrX3R5cGUpIHsKIAkJY2FzZSBORlM0X1JFQURfTFQ6CkBAIC0yODQ0LDEwICsyODI4LDEwIEBACiBvdXRfZGVzdHJveV9uZXdfc3RhdGVpZDoKIAlpZiAobG9jay0+bGtfaXNfbmV3KSB7CiAJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IGRlc3Ryb3kgbmV3IHN0YXRlaWQhXG4iKTsKLQkvKgotCSogQW4gZXJyb3IgZW5jb3VudGVyZWQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgbmV3Ci0JKiBzdGF0ZWlkIGhhcyBmb3JjZWQgdXMgdG8gZGVzdHJveSBpdC4KLQkqLworCQkvKgorCQkgKiBBbiBlcnJvciBlbmNvdW50ZXJlZCBhZnRlciBpbnN0YW50aWF0aW9uIG9mIHRoZSBuZXcKKwkJICogc3RhdGVpZCBoYXMgZm9yY2VkIHVzIHRvIGRlc3Ryb3kgaXQuCisJCSAqLwogCQlpZiAoIXNlcWlkX211dGF0aW5nX2VycihzdGF0dXMpKQogCQkJb3Blbl9zb3AtPnNvX3NlcWlkLS07CiAKQEAgLTMwODMsNyArMzA2NywxMiBAQAogCSAqIG9mIHRoZSBsb2Nrb3duZXIgc3RhdGUgcmVsZWFzZWQ7IHNvIGRvbid0IHJlbGVhc2UgYW55IHVudGlsIGFsbAogCSAqIGhhdmUgYmVlbiBjaGVja2VkLiAqLwogCXN0YXR1cyA9IG5mc19vazsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNvcCwgJm1hdGNoZXMsIHNvX3BlcmNsaWVudCkgeworCXdoaWxlICghbGlzdF9lbXB0eSgmbWF0Y2hlcykpIHsKKwkJc29wID0gbGlzdF9lbnRyeShtYXRjaGVzLm5leHQsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIsCisJCQkJCQkJCXNvX3BlcmNsaWVudCk7CisJCS8qIHVuaGFzaF9zdGF0ZW93bmVyIGRlbGV0ZXMgc29fcGVyY2xpZW50IG9ubHkKKwkJICogZm9yIG9wZW5vd25lcnMuICovCisJCWxpc3RfZGVsKCZzb3AtPnNvX3BlcmNsaWVudCk7CiAJCXJlbGVhc2Vfc3RhdGVvd25lcihzb3ApOwogCX0KIG91dDoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggOTFmYjE3MS4uNGM0MTQ2MyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTEyMTAsMTYgKzEyMTAsMTUgQEAKIAlzYXZlID0gcmVzcC0+cDsKIAogLyoKLSAqIFJvdXRpbmUgZm9yIGVuY29kaW5nIHRoZSByZXN1bHQgb2YgYQotICogInNlcWlkLW11dGF0aW5nIiBORlN2NCBvcGVyYXRpb24uICBUaGlzIGlzCi0gKiB3aGVyZSBzZXFpZHMgYXJlIGluY3JlbWVudGVkLCBhbmQgdGhlCi0gKiByZXBsYXkgY2FjaGUgaXMgZmlsbGVkLgorICogUm91dGluZSBmb3IgZW5jb2RpbmcgdGhlIHJlc3VsdCBvZiBhICJzZXFpZC1tdXRhdGluZyIgTkZTdjQgb3BlcmF0aW9uLiAgVGhpcworICogaXMgd2hlcmUgc2VxdWVuY2UgaWQncyBhcmUgaW5jcmVtZW50ZWQsIGFuZCB0aGUgcmVwbGF5IGNhY2hlIGlzIGZpbGxlZC4KKyAqIE5vdGUgdGhhdCB3ZSBpbmNyZW1lbnQgc2VxdWVuY2UgaWQncyBoZXJlLCBhdCB0aGUgbGFzdCBtb21lbnQsIHNvIHdlJ3JlIHN1cmUKKyAqIHdlIGtub3cgd2hldGhlciB0aGUgZXJyb3IgdG8gYmUgcmV0dXJuZWQgaXMgYSBzZXF1ZW5jZSBpZCBtdXRhdGluZyBlcnJvci4KICAqLwogCiAjZGVmaW5lIEVOQ09ERV9TRVFJRF9PUF9UQUlMKHN0YXRlb3duZXIpIGRvIHsJCQlcCiAJaWYgKHNlcWlkX211dGF0aW5nX2VycihuZnNlcnIpICYmIHN0YXRlb3duZXIpIHsgCVwKLQkJaWYgKHN0YXRlb3duZXItPnNvX2NvbmZpcm1lZCkJCQlcCi0JCQlzdGF0ZW93bmVyLT5zb19zZXFpZCsrOwkJCVwKKwkJc3RhdGVvd25lci0+c29fc2VxaWQrKzsJCQkJXAogCQlzdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfc3RhdHVzID0gbmZzZXJyOyAgIAlcCiAJCXN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9idWZsZW4gPSAJCVwKIAkJCSAgKCgoY2hhciAqKShyZXNwKS0+cCAtIChjaGFyICopc2F2ZSkpOyBcCkBAIC0xMzY3LDkgKzEzNjYsOSBAQAogCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCiAJCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spCi0JCQlXUklURTMyKE5GUzRfRkhfVk9MQVRJTEVfQU5ZKTsKKwkJCVdSSVRFMzIoTkZTNF9GSF9QRVJTSVNURU5UKTsKIAkJZWxzZQotCQkJV1JJVEUzMihORlM0X0ZIX1ZPTEFUSUxFX0FOWXxORlM0X0ZIX1ZPTF9SRU5BTUUpOworCQkJV1JJVEUzMihORlM0X0ZIX1BFUlNJU1RFTlR8TkZTNF9GSF9WT0xfUkVOQU1FKTsKIAl9CiAJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9DSEFOR0UpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IGRlMzQwZmYuLjRmMmNkM2QgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNDUsMTEgKzQ1LDEwIEBACiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2ZoLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+Ci0jaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KLSNpZmRlZiBDT05GSUdfTkZTRF9WNAogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgorI2lmZGVmIENPTkZJR19ORlNEX1Y0CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KQEAgLTczNCw3ICs3MzMsNyBAQAogCXVwKCZpbm9kZS0+aV9zZW0pOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogbmZzZF9zeW5jX2RpcihzdHJ1Y3QgZGVudHJ5ICpkcCkKIHsKIAluZnNkX2Rvc3luYyhOVUxMLCBkcCwgZHAtPmRfaW5vZGUtPmlfZm9wKTsKQEAgLTg2MSw3ICs4NjAsNyBAQAogCQluZnNkc3RhdHMuaW9fcmVhZCArPSBlcnI7CiAJCSpjb3VudCA9IGVycjsKIAkJZXJyID0gMDsKLQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksIEROX0FDQ0VTUyk7CisJCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX2RlbnRyeSk7CiAJfSBlbHNlIAogCQllcnIgPSBuZnNlcnJubyhlcnIpOwogb3V0OgpAQCAtOTE3LDcgKzkxNiw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAlpZiAoZXJyID49IDApIHsKIAkJbmZzZHN0YXRzLmlvX3dyaXRlICs9IGNudDsKLQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksIEROX01PRElGWSk7CisJCWZzbm90aWZ5X21vZGlmeShmaWxlLT5mX2RlbnRyeSk7CiAJfQogCiAJLyogY2xlYXIgc2V0dWlkL3NldGdpZCBmbGFnIGFmdGVyIHdyaXRlICovCkBAIC0xODcyLDEwICsxODcxLDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIAlzd2l0Y2godHlwZSkgewogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJCW5hbWUgPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1M7CisJCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUzsKIAkJCWJyZWFrOwogCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6Ci0JCQluYW1lID0gWEFUVFJfTkFNRV9BQ0xfREVGQVVMVDsKKwkJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwpAQCAtMTkxOSwxNyArMTkxOCwxNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJc3dpdGNoKHR5cGUpIHsKIAkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCQluYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworCQkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CiAJCQlicmVhazsKIAkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQkJbmFtZSA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQ7CisJCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlpZiAoYWNsICYmIGFjbC0+YV9jb3VudCkgewotCQlzaXplID0geGF0dHJfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKKwkJc2l6ZSA9IHBvc2l4X2FjbF94YXR0cl9zaXplKGFjbC0+YV9jb3VudCk7CiAJCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF2YWx1ZSkKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9DaGFuZ2VMb2cgYi9mcy9udGZzL0NoYW5nZUxvZwppbmRleCAxZDJhZDE1Li45NzA5ZmFjIDEwMDY0NAotLS0gYS9mcy9udGZzL0NoYW5nZUxvZworKysgYi9mcy9udGZzL0NoYW5nZUxvZwpAQCAtMSwyMSArMSwxOCBAQAogVG9Eby9Ob3RlczoKIAktIEZpbmQgYW5kIGZpeCBidWdzLgotCS0gQ2hlY2twb2ludCBvciBkaXNhYmxlIHRoZSB1c2VyIHNwYWNlIGpvdXJuYWwgKCRVc25Kcm5sKS4KIAktIEluIGJldHdlZW4gbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSwgbmVlZCBleGNsdXNpb24gYmV0d2VlbgotCSAgc2ltdWx0YW5lb3VzIGZpbGUgZXh0ZW5zaW9ucy4gTmVlZCBwZXJoYXBzIGFuIE5Jbm9SZXNpemVVbmRlcndheSgpCi0JICBmbGFnIHdoaWNoIHdlIGNhbiBzZXQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCkgYW5kIGNsZWFyIGFnYWluIGluCi0JICBudGZzX2NvbW1pdF93cml0ZSgpLiBKdXN0IGhhdmUgdG8gYmUgY2FyZWZ1bCBpbiByZWFkcGFnZS93cml0ZXBhZ2UsCi0JICBhcyB3ZWxsIGFzIGluIHRydW5jYXRlLCB0aGF0IHdlIHBsYXkgbmljZS4uLiBXZSBtaWdodCBuZWVkIHRvIGhhdmUKLQkgIGEgZGF0YV9zaXplIGZpZWxkIGluIHRoZSBudGZzX2lub2RlIHRvIHN0b3JlIHRoZSByZWFsIGF0dHJpYnV0ZQotCSAgbGVuZ3RoLiBBbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGluaXRpYWxpemVkX3NpemUgZXh0ZW50aW9uIGluCisJICBzaW11bHRhbmVvdXMgZmlsZSBleHRlbnNpb25zLiAgVGhpcyBpcyBnaXZlbiB0byB1cyBieSBob2xkaW5nIGlfc2VtCisJICBvbiB0aGUgaW5vZGUuICBUaGUgb25seSBwbGFjZXMgaW4gdGhlIGtlcm5lbCB3aGVuIGEgZmlsZSBpcyByZXNpemVkCisJICBhcmUgcHJlcGFyZS9jb21taXQgd3JpdGUgYW5kIHRydW5jYXRlIGZvciBib3RoIG9mIHdoaWNoIGlfc2VtIGlzCisJICBoZWxkLiAgSnVzdCBoYXZlIHRvIGJlIGNhcmVmdWwgaW4gcmVhZHBhZ2Uvd3JpdGVwYWdlIGFuZCBhbGwgb3RoZXIKKwkgIGhlbHBlcnMgbm90IHJ1bm5pbmcgdW5kZXIgaV9zZW0gdGhhdCB3ZSBwbGF5IG5pY2UuLi4KKwkgIEFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggaW5pdGlhbGl6ZWRfc2l6ZSBleHRlbnRpb24gaW4KIAkgIG50ZnNfcHJlcGFyZV93cml0ZS4gQmFzaWNhbGx5LCBqdXN0IGJlIF92ZXJ5XyBjYXJlZnVsIGluIHRoaXMgY29kZS4uLgotCSAgT1RPSCwgcGVyaGFwcyBpX3NlbSwgd2hpY2ggaXMgaGVsZCBhY2Nyb3NzIGdlbmVyaWNfZmlsZV93cml0ZSBpcwotCSAgc3VmZmljaWVudCBmb3Igc3luY2hyb25pc2F0aW9uIGhlcmUuIFdlIHRoZW4ganVzdCBuZWVkIHRvIG1ha2Ugc3VyZQotCSAgbnRmc19yZWFkcGFnZS93cml0ZXBhZ2UvdHJ1bmNhdGUgaW50ZXJvcGVyYXRlIHByb3Blcmx5IHdpdGggdXMuCi0JICBVUERBVEU6IFRoZSBhYm92ZSBpcyBhbGwgb2sgYXMgaXQgaXMgZHVlIHRvIGlfc2VtIGhlbGQuICBUaGUgb25seQotCSAgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjaGVja2VkIGlzIG50ZnNfd3JpdGVwYWdlKCkgd2hpY2ggZG9lcyBub3QKLQkgIGhvbGQgaV9zZW0uICBJdCBjYW5ub3QgY2hhbmdlIGlfc2l6ZSBidXQgaXQgbmVlZHMgdG8gY29wZSB3aXRoIGEKLQkgIGNvbmN1cnJlbnQgaV9zaXplIGNoYW5nZS4KKwkgIFVQREFURTogVGhlIG9ubHkgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjaGVja2VkIGFyZSByZWFkL3dyaXRlcGFnZQorCSAgd2hpY2ggZG8gbm90IGhvbGQgaV9zZW0uICBOb3RlIHdyaXRlcGFnZSBjYW5ub3QgY2hhbmdlIGlfc2l6ZSBidXQgaXQKKwkgIG5lZWRzIHRvIGNvcGUgd2l0aCBhIGNvbmN1cnJlbnQgaV9zaXplIGNoYW5nZSwganVzdCBsaWtlIHJlYWRwYWdlLgorCSAgQWxzbyBib3RoIG5lZWQgdG8gY29wZSB3aXRoIGNvbmN1cnJlbnQgY2hhbmdlcyB0byB0aGUgb3RoZXIgc2l6ZXMsCisJICBpLmUuIGluaXRpYWxpemVkL2FsbG9jYXRlZC9jb21wcmVzc2VkIHNpemUsIGFzIHdlbGwuCiAJLSBJbXBsZW1lbnQgbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcl91bW91bnQoKS4gIFdlIGN1cnJlbnRseSB3aWxsIGp1c3QKIAkgIGxlYXZlIHRoZSB2b2x1bWUgZGlydHkgb24gdW1vdW50IGlmIHRoZSBmaW5hbCBpcHV0KHZvbC0+bWZ0X2lubykKIAkgIGNhdXNlcyBhIHdyaXRlIG9mIGFueSBtaXJyb3JlZCBtZnQgcmVjb3JkcyBkdWUgdG8gdGhlIG1mdCBtaXJyb3IKQEAgLTI1LDEyICsyMiwxNTggQEAKIAktIEVuYWJsZSB0aGUgY29kZSBmb3Igc2V0dGluZyB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyB3aGVuIHdlIHN0YXJ0CiAJICBtYWtpbmcgTlRGUyAxLjIgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KIAotMi4xLjIzLVdJUAorMi4xLjIzIC0gSW1wbGVtZW50IGV4dGVuc2lvbiBvZiByZXNpZGVudCBmaWxlcyBhbmQgbWFrZSB3cml0aW5nIHNhZmUgYXMgd2VsbCBhcworCSBtYW55IGJ1ZyBmaXhlcywgY2xlYW51cHMsIGFuZCBlbmhhbmNlbWVudHMuLi4KIAogCS0gQWRkIHByaW50ayByYXRlIGxpbWl0aW5nIGZvciBudGZzX3dhcm5pbmcoKSBhbmQgbnRmc19lcnJvcigpIHdoZW4KIAkgIGNvbXBpbGVkIHdpdGhvdXQgZGVidWcuICBUaGlzIGF2b2lkcyBhIHBvc3NpYmxlIGRlbmlhbCBvZiBzZXJ2aWNlCiAJICBhdHRhY2suICBUaGFua3MgdG8gQ2FybC1EYW5pZWwgSGFpbGZpbmdlciBmcm9tIFN1U0UgZm9yIHBvaW50aW5nIHRoaXMKIAkgIG91dC4KKwktIEZpeCBjb21waWxhdGlvbiB3YXJuaW5ncyBvbiBpYTY0LiAgKFJhbmR5IER1bmxhcCkKKwktIFVzZSBpX3NpemVfe3JlYWQsd3JpdGV9KCkgaW5zdGVhZCBvZiByZWFkaW5nIGlfc2l6ZSBieSBoYW5kIGFuZCBjYWNoZQorCSAgdGhlIHZhbHVlIHdoZXJlIGFwcm9wcmlhdGUuCisJLSBBZGQgc2l6ZV9sb2NrIHRvIHRoZSBudGZzX2lub2RlIHN0cnVjdHVyZS4gIFRoaXMgaXMgYW4gcncgc3BpbmxvY2sKKwkgIGFuZCBpdCBsb2NrcyBhZ2FpbnN0IGFjY2VzcyB0byB0aGUgaW5vZGUgc2l6ZXMuICBOb3RlLCAtPnNpemVfbG9jaworCSAgaXMgYWxzbyBhY2Nlc3NlZCBmcm9tIGlycSBjb250ZXh0IHNvIHlvdSBtdXN0IHVzZSB0aGUgX2lycXNhdmUgYW5kCisJICBfaXJxcmVzdG9yZSBsb2NrIGFuZCB1bmxvY2sgZnVuY3Rpb25zLCByZXNwZWN0aXZlbHkuICBQcm90ZWN0IGFsbAorCSAgYWNjZXNzZXMgdG8gYWxsb2NhdGVkX3NpemUsIGluaXRpYWxpemVkX3NpemUsIGFuZCBjb21wcmVzc2VkX3NpemUuCisJLSBNaW5vciBvcHRpbWl6YXRpb24gdG8gZnMvbnRmcy9zdXBlci5jOjpudGZzX3N0YXRmcygpIGFuZCBpdHMgaGVscGVycy4KKwktIEltcGxlbWVudCBleHRlbnNpb24gb2YgcmVzaWRlbnQgZmlsZXMgaW4gdGhlIHJlZ3VsYXIgZmlsZSB3cml0ZSBjb2RlCisJICBwYXRocyAoZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3ByZXBhcmUsY29tbWl0fV93cml0ZSgpKS4gIEF0IHByZXNlbnQKKwkgIHRoaXMgb25seSB3b3JrcyB1bnRpbCB0aGUgZGF0YSBhdHRyaWJ1dGUgYmVjb21lcyB0b28gYmlnIGZvciB0aGUgbWZ0CisJICByZWNvcmQgYWZ0ZXIgd2hpY2ggd2UgYWJvcnQgdGhlIHdyaXRlIHJldHVybmluZyAtRU9QTk9UU1VQUCBmcm9tCisJICBudGZzX3ByZXBhcmVfd3JpdGUoKS4KKwktIEFkZCBkaXNhYmxlX3NwYXJzZSBtb3VudCBvcHRpb24gdG9nZXRoZXIgd2l0aCBhIHBlciB2b2x1bWUgc3BhcnNlCisJICBlbmFibGUgYml0IHdoaWNoIGlzIHNldCBhcHByb3ByaWF0ZWx5IGFuZCBhIHBlciBpbm9kZSBzcGFyc2UgZGlzYWJsZQorCSAgYml0IHdoaWNoIGlzIHByZXNldCBvbiBzb21lIHN5c3RlbSBmaWxlIGlub2RlcyBhcyBhcHByb3ByaWF0ZS4KKwktIEVuZm9yY2UgdGhhdCBzcGFyc2Ugc3VwcG9ydCBpcyBkaXNhYmxlZCBvbiBOVEZTIHZvbHVtZXMgcHJlIDMuMC4KKwktIEZpeCBhIGJ1ZyBpbiBmcy9udGZzL3J1bmxpc3QuYzo6bnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBpbgorCSAgdGhlIGNyZWF0aW9uIG9mIHRoZSB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQgZm9yIHRoZSBiYXNlIGF0dHJpYnV0ZQorCSAgZXh0ZW50LgorCS0gU3BsaXQgbnRmc19tYXBfcnVubGlzdCgpIGludG8gbnRmc19tYXBfcnVubGlzdCgpIGFuZCBhIG5vbi1sb2NraW5nCisJICBoZWxwZXIgbnRmc19tYXBfcnVubGlzdF9ub2xvY2soKSB3aGljaCBpcyB1c2VkIGJ5IG50ZnNfbWFwX3J1bmxpc3QoKS4KKwkgIFRoaXMgYWxsb3dzIHVzIHRvIG1hcCBydW5saXN0IGZyYWdtZW50cyB3aXRoIHRoZSBydW5saXN0IGxvY2sgYWxyZWFkeQorCSAgaGVsZCB3aXRob3V0IGhhdmluZyB0byBkcm9wIGFuZCByZWFjcXVpcmUgaXQgYXJvdW5kIHRoZSBjYWxsLiAgQWRhcHQKKwkgIGFsbCBjYWxsZXJzLgorCS0gQ2hhbmdlIG50ZnNfZmluZF92Y24oKSB0byBudGZzX2ZpbmRfdmNuX25vbG9jaygpIHdoaWNoIHRha2VzIGEgbG9ja2VkCisJICBydW5saXN0LiAgVGhpcyBhbGxvd3MgdXMgdG8gZmluZCBydW5saXN0IGVsZW1lbnRzIHdpdGggdGhlIHJ1bmxpc3QKKwkgIGxvY2sgYWxyZWFkeSBoZWxkIHdpdGhvdXQgaGF2aW5nIHRvIGRyb3AgYW5kIHJlYWNxdWlyZSBpdCBhcm91bmQgdGhlCisJICBjYWxsLiAgQWRhcHQgYWxsIGNhbGxlcnMuCisJLSBDaGFuZ2UgdGltZSB0byB1NjQgaW4gdGltZS5oOjpudGZzMnV0YygpIGFzIGl0IG90aGVyd2lzZSBnZW5lcmF0ZXMgYQorCSAgd2FybmluZyBpbiB0aGUgZG9fZGl2KCkgY2FsbCBvbiBzcGFyYzMyLiAgVGhhbmtzIHRvIE1lZWxpcyBSb29zIGZvcgorCSAgdGhlIHJlcG9ydCBhbmQgYW5hbHlzaXMgb2YgdGhlIHdhcm5pbmcuCisJLSBGaXggYSBuYXN0eSBydW5saXN0IG1lcmdlIGJ1ZyB3aGVuIG1lcmdpbmcgdHdvIGhvbGVzLgorCS0gU2V0IHRoZSBudGZzX2lub2RlLT5hbGxvY2F0ZWRfc2l6ZSB0byB0aGUgcmVhbCBhbGxvY2F0ZWQgc2l6ZSBpbiB0aGUKKwkgIG1mdCByZWNvcmQgZm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMgKGZzL250ZnMvaW5vZGUuYykuCisJLSBTbWFsbCByZWFkYWJpbGl0eSBjbGVhbnVwIHRvIHVzZSAiYSIgaW5zdGVhZCBvZiAiY3R4LT5hdHRyIgorCSAgZXZlcnl3aGVyZSAoZnMvbnRmcy9pbm9kZS5jKS4KKwktIE1ha2UgZnMvbnRmcy9uYW1laS5jOjpudGZzX2dldF97cGFyZW50LGRlbnRyeX0gc3RhdGljIGFuZCBtb3ZlIHRoZQorCSAgZGVmaW5pdGlvbiBvZiBudGZzX2V4cG9ydF9vcHMgZnJvbSBmcy9udGZzL3N1cGVyLmMgdG8gbmFtZWkuYy4gIEFsc28sCisJICBkZWNsYXJlIG50ZnNfZXhwb3J0X29wcyBpbiBmcy9udGZzL250ZnMuaC4KKwktIENvcnJlY3Qgc3BhcnNlIGZpbGUgaGFuZGxpbmcuICBUaGUgY29tcHJlc3NlZCB2YWx1ZXMgbmVlZCB0byBiZQorCSAgY2hlY2tlZCBhbmQgc2V0IGluIHRoZSBudGZzIGlub2RlIGFzIGRvbmUgZm9yIGNvbXByZXNzZWQgZmlsZXMgYW5kCisJICB0aGUgY29tcHJlc3NlZCBzaXplIG5lZWRzIHRvIGJlIHVzZWQgZm9yIHZmcyBpbm9kZS0+aV9ibG9ja3MgaW5zdGVhZAorCSAgb2YgdGhlIGFsbG9jYXRlZCBzaXplLCBhZ2FpbiwgYXMgZG9uZSBmb3IgY29tcHJlc3NlZCBmaWxlcy4KKwktIEFkZCBBVF9FQSBpbiBhZGRpdGlvbiB0byBBVF9EQVRBIHRvIHdoaXRlbGlzdCBmb3IgYmVpbmcgYWxsb3dlZCB0byBiZQorCSAgbm9uLXJlc2lkZW50IGluIGZzL250ZnMvYXR0cmliLmM6Om50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50KCkuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19hdHRyX3Zjbl90b19sY25fbm9sb2NrKCkgdXNlZCBieSB0aGUgbmV3CisJICB3cml0ZSBjb2RlLgorCS0gRml4IGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2ZpbmRfdmNuX25vbG9jaygpIHdoZXJlIGFmdGVyCisJICBkcm9wcGluZyB0aGUgcmVhZCBsb2NrIGFuZCB0YWtpbmcgdGhlIHdyaXRlIGxvY2sgd2Ugd2VyZSBub3QgY2hlY2tpbmcKKwkgIHdoZXRoZXIgc29tZW9uZSBlbHNlIGRpZCBub3QgYWxyZWFkeSBkbyB0aGUgd29yayB3ZSB3YW50ZWQgdG8gZG8uCisJLSBSZW5hbWUgZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19maW5kX3Zjbl9ub2xvY2soKSB0bworCSAgbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jaygpIGFuZCB1cGRhdGUgYWxsIGNhbGxlcnMuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KCkuCisJLSBGaXggc2lnbiBvZiB2YXJpb3VzIGVycm9yIHJldHVybiB2YWx1ZXMgdG8gYmUgbmVnYXRpdmUgaW4KKwkgIGZzL250ZnMvbGNuYWxsb2MuYy4KKwktIE1vZGlmeSAtPnJlYWRwYWdlIGFuZCAtPndyaXRlcGFnZSAoZnMvbnRmcy9hb3BzLmMpIHNvIHRoZXkgZGV0ZWN0IGFuZAorCSAgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGF0dHJpYnV0ZSBpcyBjb252ZXJ0ZWQgZnJvbSByZXNpZGVudCB0bworCSAgbm9uLXJlc2lkZW50IGJ5IGEgY29uY3VycmVudCBmaWxlIHdyaXRlLgorCS0gUmVtb3ZlIGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBrZnJlZSgpIHNpbmNlIGtmcmVlKCkgZG9lcyB0aGUKKwkgIGNoZWNraW5nIGl0c2VsZi4gIChKZXNwZXIgSnVobCkKKwktIFNvbWUgdXRpbGl0aWVzIG1vZGlmeSB0aGUgYm9vdCBzZWN0b3IgYnV0IGRvIG5vdCB1cGRhdGUgdGhlIGNoZWNrc3VtLgorCSAgVGh1cywgcmVsYXggdGhlIGNoZWNraW5nIGluIGZzL250ZnMvc3VwZXIuYzo6aXNfYm9vdF9zZWN0b3JfbnRmcygpIHRvCisJICBvbmx5IGVtaXQgYSB3YXJuaW5nIHdoZW4gdGhlIGNoZWNrc3VtIGlzIGluY29ycmVjdCByYXRoZXIgdGhhbgorCSAgcmVmdXNpbmcgdGhlIG1vdW50LiAgVGhhbmtzIHRvIEJlcm5kIENhc2ltaXIgZm9yIHBvaW50aW5nIHRoaXMKKwkgIHByb2JsZW0gb3V0LgorCS0gVXBkYXRlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGhhbmRsaW5nLgorCS0gQWRkIE5URlNfTUFYX0NMVVNURVJfU0laRSBhbmQgTlRGU19NQVhfUEFHRVNfUEVSX0NMVVNURVIgY29uc3RhbnRzLgorCS0gVXNlIE5URlNfTUFYX0NMVVNURVJfU0laRSBpbiBzdXBlci5jIGluc3RlYWQgb2YgaGFyZCBjb2RpbmcgMHgxMDAwMC4KKwktIFVzZSBNQVhfQlVGX1BFUl9QQUdFIGluc3RlYWQgb2YgdmFyaWFibGUgc2l6ZWQgYXJyYXkgYWxsb2NhdGlvbiBmb3IKKwkgIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYW5kIG9uZSBsZXNzIHNwYXJzZSB3YXJuaW5nIGluIGZzL250ZnMvYW9wcy5jLgorCS0gUmVtb3ZlIHNwdXJpb3VzIHZvaWQgcG9pbnRlciBjYXN0cyBmcm9tIGZzL250ZnMvLiAgKFBla2thIEVuYmVyZykKKwktIFVzZSBDOTkgc3R5bGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIGFmdGVyIG1lbW9yeSBhbGxvY2F0aW9uIHdoZXJlCisJICBwb3NzaWJsZSAoZnMvbnRmcy97YXR0cmliLmMsaW5kZXguYyxzdXBlci5jfSkuICBUaGFua3MgdG8gQWwgVmlybyBhbmQKKwkgIFBla2thIEVuYmVyZy4KKwktIFN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSwgYWthIHVzZXIgc3BhY2Ugam91cm5hbCwgaWYgaXQKKwkgIGlzIGFjdGl2ZSBvbiB0aGUgdm9sdW1lIGFuZCB3ZSBhcmUgbW91bnRpbmcgcmVhZC13cml0ZSBvciByZW1vdW50aW5nCisJICBmcm9tIHJlYWQtb25seSB0byByZWFkLXdyaXRlLgorCS0gRml4IGEgYnVnIGluIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBlcnJvciByZWNvdmVyeSBjb2RlIHBhdGhzIHdoZXJlCisJICBpZiB0aGUgcnVubGlzdCB3YXMgbm90IG1hcHBlZCBhdCBhbGwgYW5kIGEgbWFwcGluZyBlcnJvciBvY2N1cmVkIHdlCisJICB3b3VsZCBsZWF2ZSB0aGUgcnVubGlzdCBsb2NrZWQgb24gZXhpdCB0byB0aGUgZnVuY3Rpb24gc28gdGhhdCB0aGUKKwkgIG5leHQgYWNjZXNzIHRvIHRoZSBzYW1lIGZpbGUgd291bGQgdHJ5IHRvIHRha2UgdGhlIGxvY2sgYW5kIGRlYWRsb2NrLgorCS0gRGV0ZWN0IHRoZSBjYXNlIHdoZW4gV2luZG93cyBoYXMgYmVlbiBzdXNwZW5kZWQgdG8gZGlzayBvbiB0aGUgdm9sdW1lCisJICB0byBiZSBtb3VudGVkIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIGRvIG5vdCBhbGxvdyAocmUpbW91bnRpbmcKKwkgIHJlYWQtd3JpdGUuICBUaGlzIGlzIGRvbmUgYnkgcGFyc2luZyBoaWJlcmZpbC5zeXMgaWYgcHJlc2VudC4KKwktIEZpeCBzZXZlcmFsIG9jY3VyZW5jZXMgb2YgYSBidWcgd2hlcmUgd2Ugd291bGQgcGVyZm9ybSAndmFyICYgfmNvbnN0JworCSAgd2l0aCBhIDY0LWJpdCB2YXJpYWJsZSBhbmQgYSBpbnQsIGkuZS4gMzItYml0LCBjb25zdGFudC4gIFRoaXMgY2F1c2VzCisJICB0aGUgaGlnaGVyIG9yZGVyIDMyLWJpdHMgb2YgdGhlIDY0LWJpdCB2YXJpYWJsZSB0byBiZSB6ZXJvZWQuICBUbyBmaXgKKwkgIHRoaXMgY2FzdCB0aGUgJ2NvbnN0JyB0byB0aGUgc2FtZSA2NC1iaXQgdHlwZSBhcyAndmFyJy4KKwktIENoYW5nZSB0aGUgcnVubGlzdCB0ZXJtaW5hdG9yIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgY2x1c3RlcihzKSB0bworCSAgTENOX0VOT0VOVCBpbiBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQoKS4gIE90aGVyd2lzZSB0aGUgcnVubGlzdAorCSAgY29kZSBnZXRzIGNvbmZ1c2VkLgorCS0gQWRkIGFuIGV4dHJhIHBhcmFtZXRlciBAbGFzdF92Y24gdG8gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpCisJICBhbmQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKCkgdG8gYWxsb3cgdGhlIHJ1bmxpc3QgZW5jb2RpbmcgdG8gYmUKKwkgIHBhcnRpYWwgd2hpY2ggaXMgZGVzaXJhYmxlIHdoZW4gZmlsbGluZyBob2xlcyBpbiBzcGFyc2UgYXR0cmlidXRlcy4KKwkgIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENoYW5nZSBudGZzX21hcF9ydW5saXN0X25vbG9jaygpIHRvIG9ubHkgZGVjb21wcmVzcyB0aGUgbWFwcGluZyBwYWlycworCSAgaWYgdGhlIHJlcXVlc3RlZCB2Y24gaXMgaW5zaWRlIGl0LiAgT3RoZXJ3aXNlIHdlIGdldCBpbnRvIHByb2JsZW1zCisJICB3aGVuIHdlIHRyeSB0byBtYXAgYW4gb3V0IG9mIGJvdW5kcyB2Y24gYmVjYXVzZSB3ZSB0aGVuIHRyeSB0byBtYXAKKwkgIHRoZSBhbHJlYWR5IG1hcHBlZCBydW5saXN0IGZyYWdtZW50IHdoaWNoIGNhdXNlcworCSAgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSB0byBmYWlsIGFuZCByZXR1cm4gZXJyb3IuICBVcGRhdGUKKwkgIG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2soKSBhY2NvcmRpbmdseS4KKwktIEZpeCBhIG5hc3R5IGRlYWRsb2NrIHRoYXQgYXBwZWFyZWQgaW4gcmVjZW50IGtlcm5lbHMuCisJICBUaGUgc2l0dWF0aW9uOiBWRlMgaW5vZGUgWCBvbiBhIG1vdW50ZWQgbnRmcyB2b2x1bWUgaXMgZGlydHkuICBGb3IKKwkgIHNhbWUgaW5vZGUgWCwgdGhlIG50ZnNfaW5vZGUgaXMgZGlydHkgYW5kIHRodXMgY29ycmVzcG9uZGluZyBvbi1kaXNrCisJICBpbm9kZSwgaS5lLiBtZnQgcmVjb3JkLCB3aGljaCBpcyBpbiBhIGRpcnR5IFBBR0VfQ0FDSEVfUEFHRSBiZWxvbmdpbmcKKwkgIHRvIHRoZSB0YWJsZSBvZiBpbm9kZXMsIGkuZS4gJE1GVCwgaW5vZGUgMC4KKwkgIFdoYXQgaGFwcGVuczoKKwkgIFByb2Nlc3MgMTogc3lzX3N5bmMoKS91bW91bnQoKS93aGF0ZXZlci4uLiAgY2FsbHMKKwkgIF9fc3luY19zaW5nbGVfaW5vZGUoKSBmb3IgJE1GVCAtPiBkb193cml0ZXBhZ2VzKCkgLT4gd3JpdGVfcGFnZSBmb3IKKwkgIHRoZSBkaXJ0eSBwYWdlIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgaW5vZGUgWCwgdGhlIHBhZ2UgaXMgbm93IGxvY2tlZAorCSAgLT4gbnRmc193cml0ZV9tc3RfYmxvY2soKSB3aGljaCBjbGVhcnMgUGFnZVVwdG9kYXRlKCkgb24gdGhlIHBhZ2UgdG8KKwkgIHByZXZlbnQgYW55b25lIGVsc2UgZ2V0dGluZyBob2xkIG9mIGl0IHdoaWxzdCBpdCBkb2VzIHRoZSB3cml0ZSBvdXQuCisJICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgb24tZGlzayBpbm9kZSBuZWVkcyAiZml4dXBzIiBhcHBsaWVkIGJlZm9yZQorCSAgdGhlIHdyaXRlIHRvIGRpc2sgd2hpY2ggYXJlIHJlbW92ZWQgYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGFuZAorCSAgUGFnZVVwdG9kYXRlIGlzIHRoZW4gc2V0IGFnYWluLiAgSXQgdGhlbiBhbmFseXNlcyB0aGUgcGFnZSBsb29raW5nCisJICBmb3IgZGlydHkgb24tZGlzayBpbm9kZXMgYW5kIHdoZW4gaXQgZmluZHMgb25lIGl0IGNhbGxzCisJICBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKCkgdG8gc2VlIGlmIGl0IGlzIHNhZmUgdG8gd3JpdGUgdGhpcworCSAgb24tZGlzayBpbm9kZS4gIFRoaXMgdGhlbiBjYWxscyBpbG9va3VwNSgpIHRvIGNoZWNrIGlmIHRoZQorCSAgY29ycmVzcG9uZGluZyBWRlMgaW5vZGUgaXMgaW4gaWNhY2hlKCkuICBUaGlzIGluIHR1cm4gY2FsbHMgaWZpbmQoKQorCSAgd2hpY2ggd2FpdHMgb24gdGhlIGlub2RlIGxvY2sgdmlhIHdhaXRfb25faW5vZGUgd2hpbHN0IGhvbGRpbmcgdGhlCisJICBnbG9iYWwgaW5vZGVfbG9jay4KKwkgIFByb2Nlc3MgMjogcGRmbHVzaCByZXN1bHRzIGluIGEgY2FsbCB0byBfX3N5bmNfc2luZ2xlX2lub2RlIGZvciB0aGUKKwkgIHNhbWUgVkZTIGlub2RlIFggb24gdGhlIG50ZnMgdm9sdW1lLiAgVGhpcyBsb2NrcyB0aGUgaW5vZGUgKElfTE9DSykKKwkgIHRoZW4gY2FsbHMgd3JpdGUtaW5vZGUgLT4gbnRmc193cml0ZV9pbm9kZSAtPiBtYXBfbWZ0X3JlY29yZCgpIC0+CisJICByZWFkX2NhY2hlX3BhZ2UoKSBmb3IgdGhlIHBhZ2UgKGluIHBhZ2UgY2FjaGUgb2YgdGFibGUgb2YgaW5vZGVzCisJICAkTUZULCBpbm9kZSAwKSBjb250YWluaW5nIHRoZSBvbi1kaXNrIGlub2RlLiAgVGhpcyBwYWdlIGhhcworCSAgUGFnZVVwdG9kYXRlKCkgY2xlYXIgYmVjYXVzZSBvZiBQcm9jZXNzIDEgKHNlZSBhYm92ZSkgc28KKwkgIHJlYWRfY2FjaGVfcGFnZSgpIGJsb2NrcyB3aGVuIGl0IHRyaWVzIHRvIHRha2UgdGhlIHBhZ2UgbG9jayBmb3IgdGhlCisJICBwYWdlIHNvIGl0IGNhbiBjYWxsIG50ZnNfcmVhZF9wYWdlKCkuCisJICBUaHVzIFByb2Nlc3MgMSBpcyBob2xkaW5nIHRoZSBwYWdlIGxvY2sgb24gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUKKwkgIG9uLWRpc2sgaW5vZGUgWCBhbmQgaXQgaXMgd2FpdGluZyBvbiB0aGUgaW5vZGUgWCB0byBiZSB1bmxvY2tlZCBpbgorCSAgaWZpbmQoKSBzbyBpdCBjYW4gd3JpdGUgdGhlIHBhZ2Ugb3V0IGFuZCB0aGVuIHVubG9jayB0aGUgcGFnZS4KKwkgIEFuZCBQcm9jZXNzIDIgaXMgaG9sZGluZyB0aGUgaW5vZGUgbG9jayBvbiBpbm9kZSBYIGFuZCBpcyB3YWl0aW5nIGZvcgorCSAgdGhlIHBhZ2UgdG8gYmUgdW5sb2NrZWQgc28gaXQgY2FuIGNhbGwgbnRmc19yZWFkcGFnZSgpIG9yIGRpc2NvdmVyCisJICB0aGF0IFByb2Nlc3MgMSBzZXQgUGFnZVVwdG9kYXRlKCkgYWdhaW4gYW5kIHVzZSB0aGUgcGFnZS4KKwkgIFRodXMgd2UgaGF2ZSBhIGRlYWRsb2NrIGR1ZSB0byBpZmluZCgpIHdhaXRpbmcgb24gdGhlIGlub2RlIGxvY2suCisJICBUaGUgc29sdXRpb246IFRoZSBmaXggaXMgdG8gdXNlIHRoZSBuZXdseSBpbnRyb2R1Y2VkCisJICBpbG9va3VwNV9ub3dhaXQoKSB3aGljaCBkb2VzIG5vdCB3YWl0IG9uIHRoZSBpbm9kZSdzIGxvY2sgYW5kIGhlbmNlCisJICBhdm9pZHMgdGhlIGRlYWRsb2NrLiAgVGhpcyBpcyBzYWZlIGFzIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBWRlMKKwkgIGlub2RlIGFuZCBvbmx5IHVzZSB0aGUgZmFjdCB0aGF0IGl0IGlzIGluIHRoZSBWRlMgaW5vZGUgY2FjaGUgYW5kIHRoZQorCSAgZmFjdCB0aGF0IHRoZSB2ZnMgYW5kIG50ZnMgaW5vZGVzIGFyZSBvbmUgc3RydWN0IGluIG1lbW9yeSB0byBmaW5kCisJICB0aGUgbnRmcyBpbm9kZSBpbiBtZW1vcnkgaWYgcHJlc2VudC4gIEFsc28sIHRoZSBudGZzIGlub2RlIGhhcyBpdHMKKwkgIG93biBsb2NraW5nIHNvIGl0IGRvZXMgbm90IG1hdHRlciBpZiB0aGUgdmZzIGlub2RlIGlzIGxvY2tlZC4KIAogMi4xLjIyIC0gTWFueSBidWcgYW5kIHJhY2UgZml4ZXMgYW5kIGVycm9yIGhhbmRsaW5nIGltcHJvdmVtZW50cy4KIApAQCAtMTAzNyw3ICsxMTgwLDcgQEAKIAktIEZ1cnRoZXIgcnVubGlzdCBtZXJnaW5nIHdvcmsuIChSaWNoYXJkIFJ1c3NvbikKIAktIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBnY2MtMi45NS4gKFJpY2hhcmQgUnVzc29uKQogCS0gVXBkYXRlIHRvIGtlcm5lbCAyLjUuNS1wcmUxIGFuZCByZWRpZmYgdGhlIG5vdyB0aW55IHBhdGNoLgotCS0gQ29udmVydCB0byBuZXcgZmlsZSBzeXN0ZW0gZGVjbGFyYXRpb24gdXNpbmcgLT5udGZzX2dldF9zYigpIGFuZAorCS0gQ29udmVydCB0byBuZXcgZmlsZXN5c3RlbSBkZWNsYXJhdGlvbiB1c2luZyAtPm50ZnNfZ2V0X3NiKCkgYW5kCiAJICByZXBsYWNpbmcgbnRmc19yZWFkX3N1cGVyKCkgd2l0aCBudGZzX2ZpbGxfc3VwZXIoKS4KIAktIFNldCBzX21heGJ5dGVzIHRvIE1BWF9MRlNfRklMRVNJWkUgdG8gYXZvaWQgcGFnZSBjYWNoZSBwYWdlIGluZGV4CiAJICBvdmVyZmxvdyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KQEAgLTEzMzMsNyArMTQ3Niw3IEBACiAJVGhlIGRyaXZlciBpcyBub3cgYWN0dWFsbHkgdXNlZnVsISBZZXkuICgtOiBJdCB1bmRvdWJ0ZWRseSBoYXMgZ290IGJ1Z3MKIAl0aG91Z2ggYW5kIGl0IGRvZXNuJ3QgaW1wbGVtZW50IGFjY2Vzc3NpbmcgY29tcHJlc3NlZCBmaWxlcyB5ZXQuIEFsc28sCiAJYWNjZXNzaW5nIGZpbGVzIHdpdGggYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JZWl0aGVyLiBCdXQgZm9yIHNtYWxsIG9yIHNpbXBsZSBmaWxlIHN5c3RlbXMgaXQgc2hvdWxkIHdvcmsgYW5kIGFsbG93CisJZWl0aGVyLiBCdXQgZm9yIHNtYWxsIG9yIHNpbXBsZSBmaWxlc3lzdGVtcyBpdCBzaG91bGQgd29yayBhbmQgYWxsb3cKIAl5b3UgdG8gbGlzdCBkaXJlY3RvcmllcywgdXNlIHN0YXQgb24gZGlyZWN0b3J5IGVudHJpZXMgYW5kIHRoZSBmaWxlCiAJc3lzdGVtLCBvcGVuLCByZWFkLCBtbWFwIGFuZCBsbHNlZWsgYXJvdW5kIGluIGZpbGVzLiBBIGJpZyBtaWxlIHN0b25lCiAJaGFzIGJlZW4gcmVhY2hlZCEKQEAgLTEzNDEsNyArMTQ4NCw3IEBACiB0bmctMC4wLjAgLSBJbml0aWFsIHZlcnNpb24gdGFnLgogCiAJSW5pdGlhbCBkcml2ZXIgaW1wbGVtZW50YXRpb24uIFRoZSBkcml2ZXIgY2FuIG1vdW50IGFuZCB1bW91bnQgc2ltcGxlCi0JTlRGUyBmaWxlIHN5c3RlbXMgKGkuZS4gb25lcyB3aXRob3V0IGF0dHJpYnV0ZSBsaXN0cyBpbiB0aGUgc3lzdGVtCisJTlRGUyBmaWxlc3lzdGVtcyAoaS5lLiBvbmVzIHdpdGhvdXQgYXR0cmlidXRlIGxpc3RzIGluIHRoZSBzeXN0ZW0KIAlmaWxlcykuIElmIHRoZSBtb3VudCBmYWlscyB0aGVyZSBtaWdodCBiZSBwcm9ibGVtcyBpbiB0aGUgZXJyb3IgaGFuZGxpbmcKIAljb2RlIHBhdGhzLCBzbyBiZSB3YXJuZWQuIE90aGVyd2lzZSBpdCBzZWVtcyB0byBiZSBsb2FkaW5nIHRoZSBzeXN0ZW0KIAlmaWxlcyBuaWNlbHkgYW5kIHRoZSBtZnQgcmVjb3JkIHJlYWQgbWFwcGluZy91bm1hcHBpbmcgc2VlbXMgdG8gYmUKZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCmluZGV4IDdiNjYzODEuLmYwODNmMjcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvTWFrZWZpbGUKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAkgICAgIGluZGV4Lm8gaW5vZGUubyBtZnQubyBtc3QubyBuYW1laS5vIHJ1bmxpc3QubyBzdXBlci5vIHN5c2N0bC5vIFwKIAkgICAgIHVuaXN0ci5vIHVwY2FzZS5vCiAKLUVYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjIyXCIKK0VYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjIzXCIKIAogaWZlcSAoJChDT05GSUdfTlRGU19ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCkBAIC0xNSw1ICsxNSw1IEBACiBpZmVxICgkKENPTkZJR19OVEZTX1JXKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1ETlRGU19SVwogCi1udGZzLW9ianMgKz0gYml0bWFwLm8gbGNuYWxsb2MubyBsb2dmaWxlLm8gcXVvdGEubworbnRmcy1vYmpzICs9IGJpdG1hcC5vIGxjbmFsbG9jLm8gbG9nZmlsZS5vIHF1b3RhLm8gdXNuanJubC5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmMgYi9mcy9udGZzL2FvcHMuYwppbmRleCA0NWQ1NmU0Li4zZjQzYmZlIDEwMDY0NAotLS0gYS9mcy9udGZzL2FvcHMuYworKysgYi9mcy9udGZzL2FvcHMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGFvcHMuYyAtIE5URlMga2VybmVsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBhbmQgcGFnZSBjYWNoZSBoYW5kbGluZy4KICAqCSAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC02NiwxOSArNjYsMjIgQEAKIAluaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKIAogCWlmIChsaWtlbHkodXB0b2RhdGUpKSB7Ci0JCXM2NCBmaWxlX29mczsKKwkJczY0IGZpbGVfb2ZzLCBpbml0aWFsaXplZF9zaXplOwogCiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCiAJCWZpbGVfb2ZzID0gKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKwogCQkJCWJoX29mZnNldChiaCk7CisJCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCWluaXRpYWxpemVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQkvKiBDaGVjayBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIGhlYWQgb3ZlcmZsb3dpbmcuICovCi0JCWlmIChmaWxlX29mcyArIGJoLT5iX3NpemUgPiBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQlpZiAoZmlsZV9vZnMgKyBiaC0+Yl9zaXplID4gaW5pdGlhbGl6ZWRfc2l6ZSkgewogCQkJY2hhciAqYWRkcjsKIAkJCWludCBvZnMgPSAwOwogCi0JCQlpZiAoZmlsZV9vZnMgPCBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkKLQkJCQlvZnMgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSAtIGZpbGVfb2ZzOworCQkJaWYgKGZpbGVfb2ZzIDwgaW5pdGlhbGl6ZWRfc2l6ZSkKKwkJCQlvZnMgPSBpbml0aWFsaXplZF9zaXplIC0gZmlsZV9vZnM7CiAJCQlhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fQklPX1NSQ19JUlEpOwogCQkJbWVtc2V0KGFkZHIgKyBiaF9vZmZzZXQoYmgpICsgb2ZzLCAwLCBiaC0+Yl9zaXplIC0gb2ZzKTsKIAkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwpAQCAtMTMyLDcgKzEzNSw3IEBACiAJCQkJCWkgKiByZWNfc2l6ZSksIHJlY19zaXplKTsKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fQklPX1NSQ19JUlEpOwotCQlpZiAobGlrZWx5KCFQYWdlRXJyb3IocGFnZSkgJiYgcGFnZV91cHRvZGF0ZSkpCisJCWlmIChsaWtlbHkocGFnZV91cHRvZGF0ZSAmJiAhUGFnZUVycm9yKHBhZ2UpKSkKIAkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl9CiAJdW5sb2NrX3BhZ2UocGFnZSk7CkBAIC0xNjgsNiArMTcxLDcgQEAKIAlydW5saXN0X2VsZW1lbnQgKnJsOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqYXJyW01BWF9CVUZfUEVSX1BBR0VdOwogCXNlY3Rvcl90IGlibG9jaywgbGJsb2NrLCB6YmxvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplLCB2Y25fb2ZzOwogCWludCBpLCBucjsKIAl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzOwpAQCAtMTkwLDggKzE5NCwxMCBAQAogCX0KIAogCWlibG9jayA9IChzNjQpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NpemVfYml0cyk7CisJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlsYmxvY2sgPSAobmktPmFsbG9jYXRlZF9zaXplICsgYmxvY2tzaXplIC0gMSkgPj4gYmxvY2tzaXplX2JpdHM7CiAJemJsb2NrID0gKG5pLT5pbml0aWFsaXplZF9zaXplICsgYmxvY2tzaXplIC0gMSkgPj4gYmxvY2tzaXplX2JpdHM7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCiAJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KIAlybCA9IE5VTEw7CkBAIC0yNTgsNyArMjY0LDggQEAKIAkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOwogCQkJCXJsID0gTlVMTDsKIAkJCQlsY24gPSBlcnI7Ci0JCQl9CisJCQl9IGVsc2UgaWYgKCFybCkKKwkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAkJCS8qIEhhcmQgZXJyb3IsIHplcm8gb3V0IHJlZ2lvbi4gKi8KIAkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKQEAgLTM0MSwxNCArMzQ4LDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgbnRmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JbG9mZl90IGlfc2l6ZTsKIAludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CiAJdTggKmthZGRyOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAJTUZUX1JFQ09SRCAqbXJlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBhdHRyX2xlbjsKIAlpbnQgZXJyID0gMDsKIAorcmV0cnlfcmVhZHBhZ2U6CiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAkvKgogCSAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhcHBlbiBiZWNhdXNlIHdlIGNsZWFyIFBhZ2VVcHRvZGF0ZSgpIGR1cmluZwpAQCAtMzgzLDkgKzM5MSw5IEBACiAJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCBvciBlbmNyeXB0ZWQuCiAJICogVGhpcyBhbHNvIG1lYW5zIHRoZSBhdHRyaWJ1dGUgaXMgc21hbGxlciB0aGFuIGFuIG1mdCByZWNvcmQgYW5kCiAJICogaGVuY2Ugc21hbGxlciB0aGFuIGEgcGFnZSwgc28gY2FuIHNpbXBseSB6ZXJvIG91dCBhbnkgcGFnZXMgd2l0aAotCSAqIGluZGV4IGFib3ZlIDAuICBXZSBjYW4gYWxzbyBkbyB0aGlzIGlmIHRoZSBmaWxlIHNpemUgaXMgMC4KKwkgKiBpbmRleCBhYm92ZSAwLgogCSAqLwotCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+IDAgfHwgIWlfc2l6ZV9yZWFkKFZGU19JKG5pKSkpKSB7CisJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID4gMCkpIHsKIAkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJCW1lbXNldChrYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CkBAIC00MDIsNiArNDEwLDE0IEBACiAJCWVyciA9IFBUUl9FUlIobXJlYyk7CiAJCWdvdG8gZXJyX291dDsKIAl9CisJLyoKKwkgKiBJZiBhIHBhcmFsbGVsIHdyaXRlIG1hZGUgdGhlIGF0dHJpYnV0ZSBub24tcmVzaWRlbnQsIGRyb3AgdGhlIG1mdAorCSAqIHJlY29yZCBhbmQgcmV0cnkgdGhlIHJlYWRwYWdlLgorCSAqLworCWlmICh1bmxpa2VseShOSW5vTm9uUmVzaWRlbnQobmkpKSkgeworCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCQlnb3RvIHJldHJ5X3JlYWRwYWdlOworCX0KIAljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbXJlYyk7CiAJaWYgKHVubGlrZWx5KCFjdHgpKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC00MTIsOSArNDI4LDEwIEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gcHV0X3VubV9lcnJfb3V0OwogCWF0dHJfbGVuID0gbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7Ci0JaV9zaXplID0gaV9zaXplX3JlYWQoVkZTX0kobmkpKTsKLQlpZiAodW5saWtlbHkoYXR0cl9sZW4gPiBpX3NpemUpKQotCQlhdHRyX2xlbiA9IGlfc2l6ZTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IG5pLT5pbml0aWFsaXplZF9zaXplKSkKKwkJYXR0cl9sZW4gPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJLyogQ29weSB0aGUgZGF0YSB0byB0aGUgcGFnZS4gKi8KIAltZW1jcHkoa2FkZHIsICh1OCopY3R4LT5hdHRyICsKQEAgLTQ2MywxMiArNDgwLDE1IEBACiB7CiAJVkNOIHZjbjsKIAlMQ04gbGNuOworCXM2NCBpbml0aWFsaXplZF9zaXplOworCWxvZmZfdCBpX3NpemU7CiAJc2VjdG9yX3QgYmxvY2ssIGRibG9jaywgaWJsb2NrOwogCXN0cnVjdCBpbm9kZSAqdmk7CiAJbnRmc19pbm9kZSAqbmk7CiAJbnRmc192b2x1bWUgKnZvbDsKIAlydW5saXN0X2VsZW1lbnQgKnJsOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwgdmNuX29mczsKIAlpbnQgZXJyOwogCUJPT0wgbmVlZF9lbmRfd3JpdGViYWNrOwpAQCAtNTEwLDExICs1MzAsMTYgQEAKIAkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCiAJYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOwogCisJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7CisJaW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwogCS8qIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgZGF0YSBzaXplLiAqLwotCWRibG9jayA9ICh2aS0+aV9zaXplICsgYmxvY2tzaXplIC0gMSkgPj4gYmxvY2tzaXplX2JpdHM7CisJZGJsb2NrID0gKGlfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOwogCiAJLyogVGhlIGxhc3QgKGZ1bGx5IG9yIHBhcnRpYWxseSkgaW5pdGlhbGl6ZWQgYmxvY2suICovCi0JaWJsb2NrID0gbmktPmluaXRpYWxpemVkX3NpemUgPj4gYmxvY2tzaXplX2JpdHM7CisJaWJsb2NrID0gaW5pdGlhbGl6ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKIAogCS8qCiAJICogQmUgdmVyeSBjYXJlZnVsLiAgV2UgaGF2ZSBubyBleGNsdXNpb24gZnJvbSBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMKQEAgLTU1OSw3ICs1ODQsNyBAQAogCiAJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBpbml0aWFsaXplZCBzaXplLiAqLwogCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKLQkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCQkoaW5pdGlhbGl6ZWRfc2l6ZSA8IGlfc2l6ZSkpKSB7CiAJCQkvKgogCQkJICogSWYgdGhpcyBwYWdlIGlzIGZ1bGx5IG91dHNpZGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybwogCQkJICogb3V0IGFsbCBwYWdlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGluaXRpYWxpemVkIHNpemUKQEAgLTY2Niw3ICs2OTEsOCBAQAogCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKIAkJCXJsID0gTlVMTDsKIAkJCWxjbiA9IGVycjsKLQkJfQorCQl9IGVsc2UgaWYgKCFybCkKKwkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCQkvKiBGYWlsZWQgdG8gbWFwIHRoZSBidWZmZXIsIGV2ZW4gYWZ0ZXIgcmV0cnlpbmcuICovCiAJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIHRvIGlub2RlIDB4JWx4LCAiCkBAIC04MDEsMTcgKzgyNywxNSBAQAogCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKIAludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKIAl1OCAqa2FkZHI7Ci0JdW5zaWduZWQgY2hhciBiaF9zaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOwotCXVuc2lnbmVkIGludCBiaF9zaXplID0gMSA8PCBiaF9zaXplX2JpdHM7CiAJdW5zaWduZWQgaW50IHJlY19zaXplID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CiAJbnRmc19pbm9kZSAqbG9ja2VkX25pc1tQQUdFX0NBQ0hFX1NJWkUgLyByZWNfc2l6ZV07CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp0YmgsICpyZWNfc3RhcnRfYmg7Ci0JaW50IG1heF9iaHMgPSBQQUdFX0NBQ0hFX1NJWkUgLyBiaF9zaXplOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW01BWF9CVUZfUEVSX1BBR0VdOwogCXJ1bmxpc3RfZWxlbWVudCAqcmw7Ci0JaW50IGksIG5yX2xvY2tlZF9uaXMsIG5yX3JlY3MsIG5yX2JocywgYmhzX3Blcl9yZWMsIGVyciwgZXJyMjsKLQl1bnNpZ25lZCByZWNfc2l6ZV9iaXRzOworCWludCBpLCBucl9sb2NrZWRfbmlzLCBucl9yZWNzLCBucl9iaHMsIG1heF9iaHMsIGJoc19wZXJfcmVjLCBlcnIsIGVycjI7CisJdW5zaWduZWQgYmhfc2l6ZSwgcmVjX3NpemVfYml0czsKIAlCT09MIHN5bmMsIGlzX21mdCwgcGFnZV9pc19kaXJ0eSwgcmVjX2lzX2RpcnR5OworCXVuc2lnbmVkIGNoYXIgYmhfc2l6ZV9iaXRzOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKIAkJCSIweCVseC4iLCB2aS0+aV9pbm8sIG5pLT50eXBlLCBwYWdlLT5pbmRleCk7CkBAIC04MjYsNyArODUwLDExIEBACiAJICovCiAJQlVHX09OKCEoaXNfbWZ0IHx8IFNfSVNESVIodmktPmlfbW9kZSkgfHwKIAkJCShOSW5vQXR0cihuaSkgJiYgbmktPnR5cGUgPT0gQVRfSU5ERVhfQUxMT0NBVElPTikpKTsKKwliaF9zaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCWJoX3NpemUgPSAxIDw8IGJoX3NpemVfYml0czsKKwltYXhfYmhzID0gUEFHRV9DQUNIRV9TSVpFIC8gYmhfc2l6ZTsKIAlCVUdfT04oIW1heF9iaHMpOworCUJVR19PTihtYXhfYmhzID4gTUFYX0JVRl9QRVJfUEFHRSk7CiAKIAkvKiBXZXJlIHdlIGNhbGxlZCBmb3Igc3luYyBwdXJwb3Nlcz8gKi8KIAlzeW5jID0gKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKTsKQEAgLTg0Niw3ICs4NzQsNyBAQAogCQkJKFBBR0VfQ0FDSEVfU0hJRlQgLSBiaF9zaXplX2JpdHMpOwogCiAJLyogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBkYXRhIHNpemUuICovCi0JZGJsb2NrID0gKHZpLT5pX3NpemUgKyBiaF9zaXplIC0gMSkgPj4gYmhfc2l6ZV9iaXRzOworCWRibG9jayA9IChpX3NpemVfcmVhZCh2aSkgKyBiaF9zaXplIC0gMSkgPj4gYmhfc2l6ZV9iaXRzOwogCiAJcmwgPSBOVUxMOwogCWVyciA9IGVycjIgPSBucl9iaHMgPSBucl9yZWNzID0gbnJfbG9ja2VkX25pcyA9IDA7CkBAIC04NTgsNiArODg2LDcgQEAKIAkJaWYgKGxpa2VseShibG9jayA8IHJlY19ibG9jaykpIHsKIAkJCWlmICh1bmxpa2VseShibG9jayA+PSBkYmxvY2spKSB7CiAJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCS8qCkBAIC05MzgsOCArOTY3LDExIEBACiAJCQkJCWlmIChlcnIyID09IC1FTk9NRU0pCiAJCQkJCQlwYWdlX2lzX2RpcnR5ID0gVFJVRTsKIAkJCQkJbGNuID0gZXJyMjsKLQkJCQl9IGVsc2UKKwkJCQl9IGVsc2UgewogCQkJCQllcnIyID0gLUVJTzsKKwkJCQkJaWYgKCFybCkKKwkJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCX0KIAkJCQkvKiBIYXJkIGVycm9yLiAgQWJvcnQgd3JpdGluZyB0aGlzIHJlY29yZC4gKi8KIAkJCQlpZiAoIWVyciB8fCBlcnIgPT0gLUVOT01FTSkKIAkJCQkJZXJyID0gZXJyMjsKQEAgLTk0OSw3ICs5ODEsOCBAQAogCQkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgpIGJlY2F1c2UgIgogCQkJCQkJIml0cyBsb2NhdGlvbiBvbiBkaXNrIGNvdWxkICIKIAkJCQkJCSJub3QgYmUgZGV0ZXJtaW5lZCAoZXJyb3IgIgotCQkJCQkJImNvZGUgJWxsaSkuIiwgKHM2NClibG9jayA8PAorCQkJCQkJImNvZGUgJWxsaSkuIiwKKwkJCQkJCShsb25nIGxvbmcpYmxvY2sgPDwKIAkJCQkJCWJoX3NpemVfYml0cyA+PgogCQkJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cywKIAkJCQkJCW5pLT5tZnRfbm8sIG5pLT50eXBlLApAQCAtMTIyMywxOSArMTI1NiwxNyBAQAogc3RhdGljIGludCBudGZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJbG9mZl90IGlfc2l6ZTsKLQlzdHJ1Y3QgaW5vZGUgKnZpOwotCW50ZnNfaW5vZGUgKm5pLCAqYmFzZV9uaTsKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwludGZzX2lub2RlICpiYXNlX25pID0gTlVMTCwgKm5pID0gTlRGU19JKHZpKTsKIAljaGFyICprYWRkcjsKLQludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwotCU1GVF9SRUNPUkQgKm07CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCA9IE5VTEw7CisJTUZUX1JFQ09SRCAqbSA9IE5VTEw7CiAJdTMyIGF0dHJfbGVuOwogCWludCBlcnI7CiAKK3JldHJ5X3dyaXRlcGFnZToKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwotCi0JdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKHZpKTsKLQogCS8qIElzIHRoZSBwYWdlIGZ1bGx5IG91dHNpZGUgaV9zaXplPyAodHJ1bmNhdGUgaW4gcHJvZ3Jlc3MpICovCiAJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID49IChpX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgogCQkJUEFHRV9DQUNIRV9TSElGVCkpIHsKQEAgLTEyNDgsOCArMTI3OSw2IEBACiAJCW50ZnNfZGVidWcoIldyaXRlIG91dHNpZGUgaV9zaXplIC0gdHJ1bmNhdGVkPyIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JbmkgPSBOVEZTX0kodmkpOwotCiAJLyogTklub05vblJlc2lkZW50KCkgPT0gTklub0luZGV4QWxsb2NQcmVzZW50KCkgKi8KIAlpZiAoTklub05vblJlc2lkZW50KG5pKSkgewogCQkvKgpAQCAtMTMyNiw2ICsxMzU1LDE0IEBACiAJCWN0eCA9IE5VTEw7CiAJCWdvdG8gZXJyX291dDsKIAl9CisJLyoKKwkgKiBJZiBhIHBhcmFsbGVsIHdyaXRlIG1hZGUgdGhlIGF0dHJpYnV0ZSBub24tcmVzaWRlbnQsIGRyb3AgdGhlIG1mdAorCSAqIHJlY29yZCBhbmQgcmV0cnkgdGhlIHdyaXRlcGFnZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoTklub05vblJlc2lkZW50KG5pKSkpIHsKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwkJZ290byByZXRyeV93cml0ZXBhZ2U7CisJfQogCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKIAlpZiAodW5saWtlbHkoIWN0eCkpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTEzNjcsMTUgKzE0MDQsMTIgQEAKIAkgKi8KIAogCWF0dHJfbGVuID0gbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7Ci0JaV9zaXplID0gaV9zaXplX3JlYWQoVkZTX0kobmkpKTsKLQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7CiAJaWYgKHVubGlrZWx5KGF0dHJfbGVuID4gaV9zaXplKSkgewotCQkvKiBaZXJvIG91dCBvZiBib3VuZHMgYXJlYSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KLQkJbWVtc2V0KCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKwotCQkJCWlfc2l6ZSwgMCwgYXR0cl9sZW4gLSBpX3NpemUpOwogCQlhdHRyX2xlbiA9IGlfc2l6ZTsKKwkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGF0dHJfbGVuKTsKIAl9CisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBwYWdlIHRvIHRoZSBtZnQgcmVjb3JkLiAqLwogCW1lbWNweSgodTgqKWN0eC0+YXR0ciArCiAJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKQEAgLTE0MDUsOCArMTQzOSwxMCBAQAogCQllcnIgPSAwOwogCX0gZWxzZSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICJSZXNpZGVudCBhdHRyaWJ1dGUgd3JpdGUgZmFpbGVkIHdpdGggIgotCQkJCSJlcnJvciAlaS4gIFNldHRpbmcgcGFnZSBlcnJvciBmbGFnLiIsIGVycik7CisJCQkJImVycm9yICVpLiIsIGVycik7CiAJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJTlZvbFNldEVycm9ycyhuaS0+dm9sKTsKKwkJbWFrZV9iYWRfaW5vZGUodmkpOwogCX0KIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlpZiAoY3R4KQpAQCAtMTQyNSwxMiArMTQ2MSwxNSBAQAogewogCVZDTiB2Y247CiAJTENOIGxjbjsKKwlzNjQgaW5pdGlhbGl6ZWRfc2l6ZTsKKwlsb2ZmX3QgaV9zaXplOwogCXNlY3Rvcl90IGJsb2NrLCBhYmxvY2ssIGlibG9jazsKIAlzdHJ1Y3QgaW5vZGUgKnZpOwogCW50ZnNfaW5vZGUgKm5pOwogCW50ZnNfdm9sdW1lICp2b2w7CiAJcnVubGlzdF9lbGVtZW50ICpybDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKndhaXRbMl0sICoqd2FpdF9iaCA9IHdhaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgdmNuX29mcywgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCwgYmxvY2tzaXplOwogCWludCBlcnI7CiAJQk9PTCBpc19yZXRyeTsKQEAgLTE0NjIsMTYgKzE1MDEsMjAgQEAKIAkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCiAJYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOwogCisJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKgotCSAqIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgYWxsb2NhdGVkIHNpemUuIE5vIG5lZWQgdG8KKwkgKiBUaGUgZmlyc3Qgb3V0IG9mIGJvdW5kcyBibG9jayBmb3IgdGhlIGFsbG9jYXRlZCBzaXplLiAgTm8gbmVlZCB0bwogCSAqIHJvdW5kIHVwIGFzIGFsbG9jYXRlZF9zaXplIGlzIGluIG11bHRpcGxlcyBvZiBjbHVzdGVyIHNpemUgYW5kIHRoZQogCSAqIG1pbmltdW0gY2x1c3RlciBzaXplIGlzIDUxMiBieXRlcywgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNtYWxsZXN0CiAJICogYmxvY2tzaXplLgogCSAqLwogCWFibG9jayA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7CisJaW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAogCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLwotCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCWlibG9jayA9IGluaXRpYWxpemVkX3NpemUgPj4gYmxvY2tzaXplX2JpdHM7CiAKIAkvKiBMb29wIHRocm91Z2ggYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwYWdlLiAqLwogCWJsb2NrX3N0YXJ0ID0gMDsKQEAgLTE1MTgsNyArMTU2MSw3IEBACiAJCSAqIHJlcXVlc3QsIGkuZS4gYmxvY2sgPCBhYmxvY2sgaXMgdHJ1ZS4KIAkJICovCiAJCWlmICh1bmxpa2VseSgoYmxvY2sgPj0gaWJsb2NrKSAmJgotCQkJCShuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8IHZpLT5pX3NpemUpKSkgeworCQkJCShpbml0aWFsaXplZF9zaXplIDwgaV9zaXplKSkpIHsKIAkJCS8qCiAJCQkgKiBJZiB0aGlzIHBhZ2UgaXMgZnVsbHkgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCiAJCQkgKiBvdXQgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgaW5pdGlhbGl6ZWQgc2l6ZQpAQCAtMTYyMiw2ICsxNjY1LDggQEAKIAkJCQkJCQkibm90IHN1cHBvcnRlZCB5ZXQuICIKIAkJCQkJCQkiU29ycnkuIik7CiAJCQkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJCQlpZiAoIXJsKQorCQkJCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiAJCQkJCWdvdG8gZXJyX291dDsKIAkJCQl9IGVsc2UgaWYgKCFpc19yZXRyeSAmJgogCQkJCQkJbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CkBAIC0xNjM2LDcgKzE2ODEsOCBAQAogCQkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOwogCQkJCQlybCA9IE5VTEw7CiAJCQkJCWxjbiA9IGVycjsKLQkJCQl9CisJCQkJfSBlbHNlIGlmICghcmwpCisJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCQkJCS8qCiAJCQkJICogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyCiAJCQkJICogcmV0cnlpbmcuCkBAIC0xNzk3LDYgKzE4NDMsNyBAQAogCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKIAlzNjQgbmV3X3NpemU7CisJbG9mZl90IGlfc2l6ZTsKIAlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAludGZzX2lub2RlICpiYXNlX25pID0gTlVMTCwgKm5pID0gTlRGU19JKHZpKTsKIAludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKQEAgLTE4NjgsMTQgKzE5MTUsOCBAQAogCUJVR19PTihwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKIAluZXdfc2l6ZSA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CiAJLyogSWYgd2UgZG8gbm90IG5lZWQgdG8gcmVzaXplIHRoZSBhdHRyaWJ1dGUgYWxsb2NhdGlvbiB3ZSBhcmUgZG9uZS4gKi8KLQlpZiAobmV3X3NpemUgPD0gdmktPmlfc2l6ZSkKKwlpZiAobmV3X3NpemUgPD0gaV9zaXplX3JlYWQodmkpKQogCQlnb3RvIGRvbmU7Ci0KLQkvLyBGSVhNRTogV2UgYWJvcnQgZm9yIG5vdyBhcyB0aGlzIGNvZGUgaXMgbm90IHNhZmUuCi0JbnRmc19lcnJvcih2aS0+aV9zYiwgIkNoYW5naW5nIHRoZSBmaWxlIHNpemUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAiCi0JCQkiU29ycnkuIik7Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSAoYmFzZSkgbWZ0IHJlY29yZC4gKi8KIAlpZiAoIU5Jbm9BdHRyKG5pKSkKIAkJYmFzZV9uaSA9IG5pOwpAQCAtMTkwNCw3ICsxOTQ1LDE1IEBACiAJYSA9IGN0eC0+YXR0cjsKIAkvKiBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuICovCiAJYXR0cl9sZW4gPSBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7Ci0JQlVHX09OKHZpLT5pX3NpemUgIT0gYXR0cl9sZW4pOworCS8qIEZpeCBhbiBldmVudHVhbCBwcmV2aW91cyBmYWlsdXJlIG9mIG50ZnNfY29tbWl0X3dyaXRlKCkuICovCisJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOworCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpIHsKKwkJYXR0cl9sZW4gPSBpX3NpemU7CisJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoID0gY3B1X3RvX2xlMzIoYXR0cl9sZW4pOworCX0KKwkvKiBJZiB3ZSBkbyBub3QgbmVlZCB0byByZXNpemUgdGhlIGF0dHJpYnV0ZSBhbGxvY2F0aW9uIHdlIGFyZSBkb25lLiAqLworCWlmIChuZXdfc2l6ZSA8PSBhdHRyX2xlbikKKwkJZ290byBkb25lX3VubTsKIAkvKiBDaGVjayBpZiBuZXcgc2l6ZSBpcyBhbGxvd2VkIGluICRBdHRyRGVmLiAqLwogCWVyciA9IG50ZnNfYXR0cl9zaXplX2JvdW5kc19jaGVjayh2b2wsIG5pLT50eXBlLCBuZXdfc2l6ZSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKQEAgLTE5NjIsNiArMjAxMSw3IEBACiAJfQogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CiAJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworZG9uZV91bm06CiAJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CiAJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKIAkvKgpAQCAtMjA0Nyw3ICsyMDk3LDcgQEAKIAkgKiBub3cgd2Uga25vdyBudGZzX3ByZXBhcmVfd3JpdGUoKSB3b3VsZCBoYXZlIGZhaWxlZCBpbiB0aGUgd3JpdGUKIAkgKiBleGNlZWRzIGlfc2l6ZSBjYXNlLCBzbyB0aGlzIHdpbGwgbmV2ZXIgdHJpZ2dlciB3aGljaCBpcyBmaW5lLgogCSAqLwotCWlmIChwb3MgPiB2aS0+aV9zaXplKSB7CisJaWYgKHBvcyA+IGlfc2l6ZV9yZWFkKHZpKSkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyBiZXlvbmQgdGhlIGV4aXN0aW5nIGZpbGUgc2l6ZSBpcyAiCiAJCQkJIm5vdCBzdXBwb3J0ZWQgeWV0LiAgU29ycnkuIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTIxODMsOSArMjIzMywxMyBAQAogCX0KIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJLyogVXBkYXRlIGlfc2l6ZSBpZiBuZWNlc3NhcnkuICovCi0JaWYgKHZpLT5pX3NpemUgPCBhdHRyX2xlbikgeworCWlmIChpX3NpemVfcmVhZCh2aSkgPCBhdHRyX2xlbikgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQluaS0+YWxsb2NhdGVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IGF0dHJfbGVuOwogCQlpX3NpemVfd3JpdGUodmksIGF0dHJfbGVuKTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAl9CiAJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCiAJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmMgYi9mcy9udGZzL2F0dHJpYi5jCmluZGV4IDFmZjdmOTAuLmNkMGY5ZTcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvYXR0cmliLmMKKysrIGIvZnMvbnRmcy9hdHRyaWIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKgogICogYXR0cmliLmMgLSBOVEZTIGF0dHJpYnV0ZSBvcGVyYXRpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjEsODggKzIxLDIxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIAogI2luY2x1ZGUgImF0dHJpYi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAibGNuYWxsb2MuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKICNpbmNsdWRlICJtZnQuaCIKICNpbmNsdWRlICJudGZzLmgiCiAjaW5jbHVkZSAidHlwZXMuaCIKIAogLyoqCisgKiBudGZzX21hcF9ydW5saXN0X25vbG9jayAtIG1hcCAoYSBwYXJ0IG9mKSBhIHJ1bmxpc3Qgb2YgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJbnRmcyBpbm9kZSBmb3Igd2hpY2ggdG8gbWFwIChwYXJ0IG9mKSBhIHJ1bmxpc3QKKyAqIEB2Y246CW1hcCBydW5saXN0IHBhcnQgY29udGFpbmluZyB0aGlzIHZjbgorICoKKyAqIE1hcCB0aGUgcGFydCBvZiBhIHJ1bmxpc3QgY29udGFpbmluZyB0aGUgQHZjbiBvZiB0aGUgbnRmcyBpbm9kZSBAbmkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlcmUgaXMgb25lIHNwZWNpYWwgZXJyb3IgY29kZQorICogd2hpY2ggaXMgbm90IGFuIGVycm9yIGFzIHN1Y2guICBUaGlzIGlzIC1FTk9FTlQuICBJdCBtZWFucyB0aGF0IEB2Y24gaXMgb3V0CisgKiBvZiBib3VuZHMgb2YgdGhlIHJ1bmxpc3QuCisgKgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIGxvY2tlZCBmb3Igd3JpdGluZy4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKi8KK2ludCBudGZzX21hcF9ydW5saXN0X25vbG9jayhudGZzX2lub2RlICpuaSwgVkNOIHZjbikKK3sKKwlWQ04gZW5kX3ZjbjsKKwludGZzX2lub2RlICpiYXNlX25pOworCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCWludCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiTWFwcGluZyBydW5saXN0IHBhcnQgY29udGFpbmluZyB2Y24gMHglbGx4LiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbik7CisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpCisJCXJldHVybiBQVFJfRVJSKG0pOworCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIHZjbiwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJLyoKKwkgKiBPbmx5IGRlY29tcHJlc3MgdGhlIG1hcHBpbmcgcGFpcnMgaWYgQHZjbiBpcyBpbnNpZGUgaXQuICBPdGhlcndpc2UKKwkgKiB3ZSBnZXQgaW50byBwcm9ibGVtcyB3aGVuIHdlIHRyeSB0byBtYXAgYW4gb3V0IG9mIGJvdW5kcyB2Y24gYmVjYXVzZQorCSAqIHdlIHRoZW4gdHJ5IHRvIG1hcCB0aGUgYWxyZWFkeSBtYXBwZWQgcnVubGlzdCBmcmFnbWVudCBhbmQKKwkgKiBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcygpIGZhaWxzLgorCSAqLworCWVuZF92Y24gPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24pICsgMTsKKwlpZiAodW5saWtlbHkoIWEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24gJiYgZW5kX3ZjbiA8PSAxKSkKKwkJZW5kX3ZjbiA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiBuaS0+dm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlpZiAodW5saWtlbHkodmNuID49IGVuZF92Y24pKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyhuaS0+dm9sLCBhLCBuaS0+cnVubGlzdC5ybCk7CisJaWYgKElTX0VSUihybCkpCisJCWVyciA9IFBUUl9FUlIocmwpOworCWVsc2UKKwkJbmktPnJ1bmxpc3QucmwgPSBybDsKK2Vycl9vdXQ6CisJaWYgKGxpa2VseShjdHgpKQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgogICogbnRmc19tYXBfcnVubGlzdCAtIG1hcCAoYSBwYXJ0IG9mKSBhIHJ1bmxpc3Qgb2YgYW4gbnRmcyBpbm9kZQogICogQG5pOgkJbnRmcyBpbm9kZSBmb3Igd2hpY2ggdG8gbWFwIChwYXJ0IG9mKSBhIHJ1bmxpc3QKICAqIEB2Y246CW1hcCBydW5saXN0IHBhcnQgY29udGFpbmluZyB0aGlzIHZjbgogICoKICAqIE1hcCB0aGUgcGFydCBvZiBhIHJ1bmxpc3QgY29udGFpbmluZyB0aGUgQHZjbiBvZiB0aGUgbnRmcyBpbm9kZSBAbmkuCiAgKgotICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlcmUgaXMgb25lIHNwZWNpYWwgZXJyb3IgY29kZQorICogd2hpY2ggaXMgbm90IGFuIGVycm9yIGFzIHN1Y2guICBUaGlzIGlzIC1FTk9FTlQuICBJdCBtZWFucyB0aGF0IEB2Y24gaXMgb3V0CisgKiBvZiBib3VuZHMgb2YgdGhlIHJ1bmxpc3QuCiAgKgogICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZCBvbiByZXR1cm4uCi0gKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBsb2NrIGZvciB3cml0aW5nIGFuZCBtb2RpZmllcyB0aGUgcnVubGlzdC4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJ1bmxpc3QgbG9jayBmb3Igd3JpdGluZyBhbmQgbW9kaWZpZXMgdGhlCisgKgkgICAgICBydW5saXN0LgogICovCiBpbnQgbnRmc19tYXBfcnVubGlzdChudGZzX2lub2RlICpuaSwgVkNOIHZjbikKIHsKLQludGZzX2lub2RlICpiYXNlX25pOwotCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7Ci0JTUZUX1JFQ09SRCAqbXJlYzsKIAlpbnQgZXJyID0gMDsKIAotCW50ZnNfZGVidWcoIk1hcHBpbmcgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdmNuIDB4JWxseC4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24pOwotCi0JaWYgKCFOSW5vQXR0cihuaSkpCi0JCWJhc2VfbmkgPSBuaTsKLQllbHNlCi0JCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87Ci0KLQltcmVjID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7Ci0JaWYgKElTX0VSUihtcmVjKSkKLQkJcmV0dXJuIFBUUl9FUlIobXJlYyk7Ci0JY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG1yZWMpOwotCWlmICh1bmxpa2VseSghY3R4KSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCi0JCQlDQVNFX1NFTlNJVElWRSwgdmNuLCBOVUxMLCAwLCBjdHgpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIHB1dF9lcnJfb3V0OwotCiAJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CiAJLyogTWFrZSBzdXJlIHNvbWVvbmUgZWxzZSBkaWRuJ3QgZG8gdGhlIHdvcmsgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZy4gKi8KIAlpZiAobGlrZWx5KG50ZnNfcmxfdmNuX3RvX2xjbihuaS0+cnVubGlzdC5ybCwgdmNuKSA8PQotCQkJTENOX1JMX05PVF9NQVBQRUQpKSB7Ci0JCXJ1bmxpc3RfZWxlbWVudCAqcmw7Ci0KLQkJcmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyhuaS0+dm9sLCBjdHgtPmF0dHIsCi0JCQkJbmktPnJ1bmxpc3QucmwpOwotCQlpZiAoSVNfRVJSKHJsKSkKLQkJCWVyciA9IFBUUl9FUlIocmwpOwotCQllbHNlCi0JCQluaS0+cnVubGlzdC5ybCA9IHJsOwotCX0KKwkJCUxDTl9STF9OT1RfTUFQUEVEKSkKKwkJZXJyID0gbnRmc19tYXBfcnVubGlzdF9ub2xvY2sobmksIHZjbik7CiAJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOwotCi1wdXRfZXJyX291dDoKLQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKLWVycl9vdXQ6Ci0JdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKIAlyZXR1cm4gZXJyOwogfQogCiAvKioKLSAqIG50ZnNfZmluZF92Y24gLSBmaW5kIGEgdmNuIGluIHRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBhbiBudGZzIGlub2RlCi0gKiBAbmk6CQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIHJ1bmxpc3QgdG8gc2VhcmNoCi0gKiBAdmNuOgl2Y24gdG8gZmluZAotICogQG5lZWRfd3JpdGU6CWlmIGZhbHNlLCBsb2NrIGZvciByZWFkaW5nIGFuZCBpZiB0cnVlLCBsb2NrIGZvciB3cml0aW5nCisgKiBudGZzX2F0dHJfdmNuX3RvX2xjbl9ub2xvY2sgLSBjb252ZXJ0IGEgdmNuIGludG8gYSBsY24gZ2l2ZW4gYW4gbnRmcyBpbm9kZQorICogQG5pOgkJCW50ZnMgaW5vZGUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSBydW5saXN0IHRvIHNlYXJjaAorICogQHZjbjoJCXZjbiB0byBjb252ZXJ0CisgKiBAd3JpdGVfbG9ja2VkOgl0cnVlIGlmIHRoZSBydW5saXN0IGlzIGxvY2tlZCBmb3Igd3JpdGluZworICoKKyAqIEZpbmQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBpbiB0aGUgcnVubGlzdCBvZiB0aGUgbnRmcyBhdHRyaWJ1dGUKKyAqIGRlc2NyaWJlZCBieSB0aGUgbnRmcyBpbm9kZSBAbmkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBsb2dpY2FsIGNsdXN0ZXIKKyAqIG51bWJlciAobGNuKS4KKyAqCisgKiBJZiB0aGUgQHZjbiBpcyBub3QgbWFwcGVkIHlldCwgdGhlIGF0dGVtcHQgaXMgbWFkZSB0byBtYXAgdGhlIGF0dHJpYnV0ZQorICogZXh0ZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24gYW5kIHRoZSB2Y24gdG8gbGNuIGNvbnZlcnNpb24gaXMgcmV0cmllZC4KKyAqCisgKiBJZiBAd3JpdGVfbG9ja2VkIGlzIHRydWUgdGhlIGNhbGxlciBoYXMgbG9ja2VkIHRoZSBydW5saXN0IGZvciB3cml0aW5nIGFuZAorICogaWYgZmFsc2UgZm9yIHJlYWRpbmcuCisgKgorICogU2luY2UgbGNucyBtdXN0IGJlID49IDAsIHdlIHVzZSBuZWdhdGl2ZSByZXR1cm4gY29kZXMgd2l0aCBzcGVjaWFsIG1lYW5pbmc6CisgKgorICogUmV0dXJuIGNvZGUJTWVhbmluZyAvIERlc2NyaXB0aW9uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBMQ05fSE9MRQlIb2xlIC8gbm90IGFsbG9jYXRlZCBvbiBkaXNrLgorICogIExDTl9FTk9FTlQJVGhlcmUgaXMgbm8gc3VjaCB2Y24gaW4gdGhlIHJ1bmxpc3QsIGkuZS4gQHZjbiBpcyBvdXQgb2YgYm91bmRzLgorICogIExDTl9FTk9NRU0JTm90IGVub3VnaCBtZW1vcnkgdG8gbWFwIHJ1bmxpc3QuCisgKiAgTENOX0VJTwlDcml0aWNhbCBlcnJvciAocnVubGlzdC9maWxlIGlzIGNvcnJ1cHQsIGkvbyBlcnJvciwgZXRjKS4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IGFuZCBpcyBsZWZ0IGxvY2tlZCBvbiByZXR1cm4uCisgKgkgICAgLSBJZiBAd3JpdGVfbG9ja2VkIGlzIEZBTFNFLCBpLmUuIHRoZSBydW5saXN0IGlzIGxvY2tlZCBmb3IgcmVhZGluZywKKyAqCSAgICAgIHRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGluc2lkZSB0aGUgZnVuY3Rpb24gc28geW91IGNhbm5vdCByZWx5IG9uCisgKgkgICAgICB0aGUgcnVubGlzdCBzdGlsbCBiZWluZyB0aGUgc2FtZSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqLworTENOIG50ZnNfYXR0cl92Y25fdG9fbGNuX25vbG9jayhudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKKwkJY29uc3QgQk9PTCB3cml0ZV9sb2NrZWQpCit7CisJTENOIGxjbjsKKwlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHZjbiAweCVsbHgsICVzX2xvY2tlZC4iLAorCQkJbmktPm1mdF9ubywgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCisJCQl3cml0ZV9sb2NrZWQgPyAid3JpdGUiIDogInJlYWQiKTsKKwlCVUdfT04oIW5pKTsKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTih2Y24gPCAwKTsKK3JldHJ5X3JlbWFwOgorCS8qIENvbnZlcnQgdmNuIHRvIGxjbi4gIElmIHRoYXQgZmFpbHMgbWFwIHRoZSBydW5saXN0IGFuZCByZXRyeSBvbmNlLiAqLworCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihuaS0+cnVubGlzdC5ybCwgdmNuKTsKKwlpZiAobGlrZWx5KGxjbiA+PSBMQ05fSE9MRSkpIHsKKwkJbnRmc19kZWJ1ZygiRG9uZSwgbGNuIDB4JWxseC4iLCAobG9uZyBsb25nKWxjbik7CisJCXJldHVybiBsY247CisJfQorCWlmIChsY24gIT0gTENOX1JMX05PVF9NQVBQRUQpIHsKKwkJaWYgKGxjbiAhPSBMQ05fRU5PRU5UKQorCQkJbGNuID0gTENOX0VJTzsKKwl9IGVsc2UgaWYgKCFpc19yZXRyeSkgeworCQlpbnQgZXJyOworCisJCWlmICghd3JpdGVfbG9ja2VkKSB7CisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCQkJaWYgKHVubGlrZWx5KG50ZnNfcmxfdmNuX3RvX2xjbihuaS0+cnVubGlzdC5ybCwgdmNuKSAhPQorCQkJCQlMQ05fUkxfTk9UX01BUFBFRCkpIHsKKwkJCQl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3JlbWFwOworCQkJfQorCQl9CisJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3Rfbm9sb2NrKG5pLCB2Y24pOworCQlpZiAoIXdyaXRlX2xvY2tlZCkgeworCQkJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJfQorCQlpZiAobGlrZWx5KCFlcnIpKSB7CisJCQlpc19yZXRyeSA9IFRSVUU7CisJCQlnb3RvIHJldHJ5X3JlbWFwOworCQl9CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCWxjbiA9IExDTl9FTk9FTlQ7CisJCWVsc2UgaWYgKGVyciA9PSAtRU5PTUVNKQorCQkJbGNuID0gTENOX0VOT01FTTsKKwkJZWxzZQorCQkJbGNuID0gTENOX0VJTzsKKwl9CisJaWYgKGxjbiAhPSBMQ05fRU5PRU5UKQorCQludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbGxpLiIsCisJCQkJKGxvbmcgbG9uZylsY24pOworCXJldHVybiBsY247Cit9CisKKy8qKgorICogbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jayAtIGZpbmQgYSB2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgcnVubGlzdCB0byBzZWFyY2gKKyAqIEB2Y246CQl2Y24gdG8gZmluZAorICogQHdyaXRlX2xvY2tlZDoJdHJ1ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcKICAqCiAgKiBGaW5kIHRoZSB2aXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIEB2Y24gaW4gdGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IHRoZSBudGZzCiAgKiBpbm9kZSBAbmkgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24uCi0gKiBUaGUgcnVubGlzdCBpcyBsZWZ0IGxvY2tlZCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gdW5sb2NrIGl0LiAgSWYgQG5lZWRfd3JpdGUKLSAqIGlzIHRydWUsIHRoZSBydW5saXN0IGlzIGxvY2tlZCBmb3Igd3JpdGluZyBhbmQgaWYgQG5lZWRfd3JpdGUgaXMgZmFsc2UsIHRoZQotICogcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIHJ1bmxpc3QgaXMgbm90IGxlZnQKLSAqIGxvY2tlZC4KKyAqCisgKiBJZiB0aGUgQHZjbiBpcyBub3QgbWFwcGVkIHlldCwgdGhlIGF0dGVtcHQgaXMgbWFkZSB0byBtYXAgdGhlIGF0dHJpYnV0ZQorICogZXh0ZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24gYW5kIHRoZSB2Y24gdG8gbGNuIGNvbnZlcnNpb24gaXMgcmV0cmllZC4KKyAqCisgKiBJZiBAd3JpdGVfbG9ja2VkIGlzIHRydWUgdGhlIGNhbGxlciBoYXMgbG9ja2VkIHRoZSBydW5saXN0IGZvciB3cml0aW5nIGFuZAorICogaWYgZmFsc2UgZm9yIHJlYWRpbmcuCiAgKgogICogTm90ZSB5b3UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBsY24gb2YgdGhlIHJldHVybmVkIHJ1bmxpc3QgZWxlbWVudAogICogYmVpbmcgPj0gMCBhbmQgTENOX0hPTEUuICBJbiB0aGUgbGF0ZXIgY2FzZSB5b3UgaGF2ZSB0byByZXR1cm4gemVyb2VzIG9uCkBAIC0xMTgsMzQgKzI0NywyOSBAQAogICoJLUVOT01FTSAtIE5vdCBlbm91Z2ggbWVtb3J5IHRvIG1hcCBydW5saXN0LgogICoJLUVJTwktIENyaXRpY2FsIGVycm9yIChydW5saXN0L2ZpbGUgaXMgY29ycnVwdCwgaS9vIGVycm9yLCBldGMpLgogICoKLSAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeS4KLSAqCSAgICAtIE9uIGZhaWxpbmcgcmV0dXJuLCB0aGUgcnVubGlzdCBpcyB1bmxvY2tlZC4KLSAqCSAgICAtIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgcnVubGlzdCBpcyBsb2NrZWQuICBJZiBAbmVlZF93cml0ZSB1cwotICoJICAgICAgdHJ1ZSwgaXQgaXMgbG9ja2VkIGZvciB3cml0aW5nLiAgT3RoZXJ3aXNlIGlzIGlzIGxvY2tlZCBmb3IKLSAqCSAgICAgIHJlYWRpbmcuCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IGFuZCBpcyBsZWZ0IGxvY2tlZCBvbiByZXR1cm4uCisgKgkgICAgLSBJZiBAd3JpdGVfbG9ja2VkIGlzIEZBTFNFLCBpLmUuIHRoZSBydW5saXN0IGlzIGxvY2tlZCBmb3IgcmVhZGluZywKKyAqCSAgICAgIHRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGluc2lkZSB0aGUgZnVuY3Rpb24gc28geW91IGNhbm5vdCByZWx5IG9uCisgKgkgICAgICB0aGUgcnVubGlzdCBzdGlsbCBiZWluZyB0aGUgc2FtZSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotcnVubGlzdF9lbGVtZW50ICpudGZzX2ZpbmRfdmNuKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBWQ04gdmNuLAotCQljb25zdCBCT09MIG5lZWRfd3JpdGUpCitydW5saXN0X2VsZW1lbnQgKm50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobnRmc19pbm9kZSAqbmksIGNvbnN0IFZDTiB2Y24sCisJCWNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKQogewogCXJ1bmxpc3RfZWxlbWVudCAqcmw7CiAJaW50IGVyciA9IDA7CiAJQk9PTCBpc19yZXRyeSA9IEZBTFNFOwogCi0JbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCB2Y24gMHglbGx4LCBsb2NrIGZvciAlc2luZy4iLAorCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseCwgdmNuIDB4JWxseCwgJXNfbG9ja2VkLiIsCiAJCQluaS0+bWZ0X25vLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKLQkJCSFuZWVkX3dyaXRlID8gInJlYWQiIDogIndyaXQiKTsKKwkJCXdyaXRlX2xvY2tlZCA/ICJ3cml0ZSIgOiAicmVhZCIpOwogCUJVR19PTighbmkpOwogCUJVR19PTighTklub05vblJlc2lkZW50KG5pKSk7CiAJQlVHX09OKHZjbiA8IDApOwotbG9ja19yZXRyeV9yZW1hcDoKLQlpZiAoIW5lZWRfd3JpdGUpCi0JCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7Ci0JZWxzZQotCQlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKK3JldHJ5X3JlbWFwOgogCXJsID0gbmktPnJ1bmxpc3Qucmw7CiAJaWYgKGxpa2VseShybCAmJiB2Y24gPj0gcmxbMF0udmNuKSkgewogCQl3aGlsZSAobGlrZWx5KHJsLT5sZW5ndGgpKSB7Ci0JCQlpZiAobGlrZWx5KHZjbiA8IHJsWzFdLnZjbikpIHsKKwkJCWlmICh1bmxpa2VseSh2Y24gPCBybFsxXS52Y24pKSB7CiAJCQkJaWYgKGxpa2VseShybC0+bGNuID49IExDTl9IT0xFKSkgewogCQkJCQludGZzX2RlYnVnKCJEb25lLiIpOwogCQkJCQlyZXR1cm4gcmw7CkBAIC0xNjEsMzAgKzI4NSw0MSBAQAogCQkJCWVyciA9IC1FSU87CiAJCX0KIAl9Ci0JaWYgKCFuZWVkX3dyaXRlKQotCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKLQllbHNlCi0JCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKIAlpZiAoIWVyciAmJiAhaXNfcmV0cnkpIHsKIAkJLyoKIAkJICogVGhlIEB2Y24gaXMgaW4gYW4gdW5tYXBwZWQgcmVnaW9uLCBtYXAgdGhlIHJ1bmxpc3QgYW5kCiAJCSAqIHJldHJ5LgogCQkgKi8KLQkJZXJyID0gbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKTsKKwkJaWYgKCF3cml0ZV9sb2NrZWQpIHsKKwkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJCQlpZiAodW5saWtlbHkobnRmc19ybF92Y25fdG9fbGNuKG5pLT5ydW5saXN0LnJsLCB2Y24pICE9CisJCQkJCUxDTl9STF9OT1RfTUFQUEVEKSkgeworCQkJCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCWdvdG8gcmV0cnlfcmVtYXA7CisJCQl9CisJCX0KKwkJZXJyID0gbnRmc19tYXBfcnVubGlzdF9ub2xvY2sobmksIHZjbik7CisJCWlmICghd3JpdGVfbG9ja2VkKSB7CisJCQl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQl9CiAJCWlmIChsaWtlbHkoIWVycikpIHsKIAkJCWlzX3JldHJ5ID0gVFJVRTsKLQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKKwkJCWdvdG8gcmV0cnlfcmVtYXA7CiAJCX0KIAkJLyoKLQkJICogLUVJTlZBTCBhbmQgLUVOT0VOVCBjb21pbmcgZnJvbSBhIGZhaWxlZCBtYXBwaW5nIGF0dGVtcHQgYXJlCi0JCSAqIGVxdWl2YWxlbnQgdG8gaS9vIGVycm9ycyBmb3IgdXMgYXMgdGhleSBzaG91bGQgbm90IGhhcHBlbiBpbgotCQkgKiBvdXIgY29kZSBwYXRocy4KKwkJICogLUVJTlZBTCBjb21pbmcgZnJvbSBhIGZhaWxlZCBtYXBwaW5nIGF0dGVtcHQgaXMgZXF1aXZhbGVudAorCQkgKiB0byBpL28gZXJyb3IgZm9yIHVzIGFzIGl0IHNob3VsZCBub3QgaGFwcGVuIGluIG91ciBjb2RlCisJCSAqIHBhdGhzLgogCQkgKi8KLQkJaWYgKGVyciA9PSAtRUlOVkFMIHx8IGVyciA9PSAtRU5PRU5UKQorCQlpZiAoZXJyID09IC1FSU5WQUwpCiAJCQllcnIgPSAtRUlPOwogCX0gZWxzZSBpZiAoIWVycikKIAkJZXJyID0gLUVJTzsKLQludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlaS4iLCBlcnIpOworCWlmIChlcnIgIT0gLUVOT0VOVCkKKwkJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwgZXJyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCkBAIC04NzAsMTUgKzEwMDUsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2F0dHJfaW5pdF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgsCiAJCW50ZnNfaW5vZGUgKm5pLCBNRlRfUkVDT1JEICptcmVjKQogewotCWN0eC0+bXJlYyA9IG1yZWM7Ci0JLyogU2FuaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGVsc2V3aGVyZS4gKi8KLQljdHgtPmF0dHIgPSAoQVRUUl9SRUNPUkQqKSgodTgqKW1yZWMgKyBsZTE2X3RvX2NwdShtcmVjLT5hdHRyc19vZmZzZXQpKTsKLQljdHgtPmlzX2ZpcnN0ID0gVFJVRTsKLQljdHgtPm50ZnNfaW5vID0gbmk7Ci0JY3R4LT5hbF9lbnRyeSA9IE5VTEw7Ci0JY3R4LT5iYXNlX250ZnNfaW5vID0gTlVMTDsKLQljdHgtPmJhc2VfbXJlYyA9IE5VTEw7Ci0JY3R4LT5iYXNlX2F0dHIgPSBOVUxMOworCSpjdHggPSAobnRmc19hdHRyX3NlYXJjaF9jdHgpIHsKKwkJLm1yZWMgPSBtcmVjLAorCQkvKiBTYW5pdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgZWxzZXdoZXJlLiAqLworCQkuYXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopbXJlYyArCisJCQkJbGUxNl90b19jcHUobXJlYy0+YXR0cnNfb2Zmc2V0KSksCisJCS5pc19maXJzdCA9IFRSVUUsCisJCS5udGZzX2lubyA9IG5pLAorCX07CiB9CiAKIC8qKgpAQCAtOTQ1LDYgKzEwNzksOCBAQAogCXJldHVybjsKIH0KIAorI2lmZGVmIE5URlNfUlcKKwogLyoqCiAgKiBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmIC0gZmluZCBhbiBhdHRyaWJ1dGUgaW4gdGhlICRBdHRyRGVmIHN5c3RlbSBmaWxlCiAgKiBAdm9sOgludGZzIHZvbHVtZSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGJlbG9uZ3MKQEAgLTEwMjQsMjcgKzExNjAsMjEgQEAKICAqIENoZWNrIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBvZiBAdHlwZSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBpcyBhbGxvd2VkIHRvCiAgKiBiZSBub24tcmVzaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gJEF0dHJEZWYgc3lzdGVtIGZpbGUuCiAgKgotICogUmV0dXJuIDAgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCwgLUVQRVJNIGlmIG5vdCwgb3IKKyAqIFJldHVybiAwIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQsIC1FUEVSTSBpZiBub3QsIGFuZAogICogLUVOT0VOVCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBsaXN0ZWQgaW4gJEF0dHJEZWYuCiAgKi8KIGludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBBVFRSX1RZUEUgdHlwZSkKIHsKIAlBVFRSX0RFRiAqYWQ7CiAKLQkvKgotCSAqICREQVRBIGlzIGFsd2F5cyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCBldmVuIGlmICRBdHRyRGVmIGRvZXMgbm90Ci0JICogc3BlY2lmeSB0aGlzIGluIHRoZSBmbGFncyBvZiB0aGUgJERBVEEgYXR0cmlidXRlIGRlZmluaXRpb24gcmVjb3JkLgotCSAqLwotCWlmICh0eXBlID09IEFUX0RBVEEpCi0JCXJldHVybiAwOwogCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlY29yZCBpbiAkQXR0ckRlZi4gKi8KIAlhZCA9IG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYodm9sLCB0eXBlKTsKIAlpZiAodW5saWtlbHkoIWFkKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJLyogQ2hlY2sgdGhlIGZsYWdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KLQlpZiAoYWQtPmZsYWdzICYgQ0FOX0JFX05PTl9SRVNJREVOVCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FUEVSTTsKKwlpZiAoYWQtPmZsYWdzICYgQVRUUl9ERUZfUkVTSURFTlQpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTA2Nyw5ICsxMTk3LDkgQEAKICAqLwogaW50IG50ZnNfYXR0cl9jYW5fYmVfcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUpCiB7Ci0JaWYgKHR5cGUgIT0gQVRfSU5ERVhfQUxMT0NBVElPTiAmJiB0eXBlICE9IEFUX0VBKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVQRVJNOworCWlmICh0eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04gfHwgdHlwZSA9PSBBVF9FQSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMTE3LDYgKzEyNDcsMzI4IEBACiB9CiAKIC8qKgorICogbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50IC0gY29udmVydCBhIHJlc2lkZW50IHRvIGEgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydAorICoKKyAqIENvbnZlcnQgdGhlIHJlc2lkZW50IG50ZnMgYXR0cmlidXRlIGRlc2NyaWJlZCBieSB0aGUgbnRmcyBpbm9kZSBAbmkgdG8gYQorICogbm9uLXJlc2lkZW50IG9uZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBUaGUgZm9sbG93aW5nIGVycm9yIHJldHVybiBjb2RlcworICogYXJlIGRlZmluZWQ6CisgKgktRVBFUk0JLSBUaGUgYXR0cmlidXRlIGlzIG5vdCBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudC4KKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeS4KKyAqCS1FTk9TUEMJLSBOb3QgZW5vdWdoIGRpc2sgc3BhY2UuCisgKgktRUlOVkFMCS0gQXR0cmlidXRlIG5vdCBkZWZpbmVkIG9uIHRoZSB2b2x1bWUuCisgKgktRUlPCS0gSS9vIGVycm9yIG9yIG90aGVyIGVycm9yLgorICogTm90ZSB0aGF0IC1FTk9TUEMgaXMgYWxzbyByZXR1cm5lZCBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2gKKyAqIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIHRvIGRvIHRoZSBjb252ZXJzaW9uLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIG1mdAorICogcmVjb3JkIGlzIGFscmVhZHkgdmVyeSBmdWxsLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdHJ5aW5nIHRvIG1ha2UKKyAqIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIGFuZCB0cnlpbmcgYWdhaW4uICBGSVhNRTogRG8gd2UgbmVlZCBhIHNlcGFyYXRlCisgKiBlcnJvciByZXR1cm4gY29kZSBmb3IgdGhpcyBraW5kIG9mIC1FTk9TUEMgb3IgaXMgaXQgYWx3YXlzIHdvcnRoIHRyeWluZworICogYWdhaW4gaW4gY2FzZSB0aGUgYXR0cmlidXRlIG1heSB0aGVuIGZpdCBpbiBhIHJlc2lkZW50IHN0YXRlIHNvIG5vIG5lZWQgdG8KKyAqIG1ha2UgaXQgbm9uLXJlc2lkZW50IGF0IGFsbD8gIEhvLWh1bS4uLiAgKEFJQSkKKyAqCisgKiBOT1RFIHRvIHNlbGY6IE5vIGNoYW5nZXMgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0IGFyZSByZXF1aXJlZCB0byBtb3ZlIGZyb20KKyAqCQkgYSByZXNpZGVudCB0byBhIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUuCisgKgorICogTG9ja2luZzogLSBUaGUgY2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5vZGUuCisgKi8KK2ludCBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQobnRmc19pbm9kZSAqbmkpCit7CisJczY0IG5ld19zaXplOworCXN0cnVjdCBpbm9kZSAqdmkgPSBWRlNfSShuaSk7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKwlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwl1OCAqa2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXBfc2l6ZSwgbXBfb2ZzLCBuYW1lX29mcywgYXJlY19zaXplLCBlcnIsIGVycjI7CisJdTMyIGF0dHJfc2l6ZTsKKwl1OCBvbGRfcmVzX2F0dHJfZmxhZ3M7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQuICovCisJZXJyID0gbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQodm9sLCBuaS0+dHlwZSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRVBFUk0pCisJCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgaXMgbm90IGFsbG93ZWQgdG8gYmUgIgorCQkJCQkibm9uLXJlc2lkZW50LiIpOworCQllbHNlCisJCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgbm90IGRlZmluZWQgb24gdGhlIE5URlMgIgorCQkJCQkidm9sdW1lISIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvKgorCSAqIFRoZSBzaXplIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSBjbHVzdGVyIGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCisJICogcHVycG9zZXMuCisJICovCisJbmV3X3NpemUgPSAoaV9zaXplX3JlYWQodmkpICsgdm9sLT5jbHVzdGVyX3NpemUgLSAxKSAmCisJCQl+KHZvbC0+Y2x1c3Rlcl9zaXplIC0gMSk7CisJaWYgKG5ld19zaXplID4gMCkgeworCQlydW5saXN0X2VsZW1lbnQgKnJsMjsKKworCQkvKgorCQkgKiBXaWxsIG5lZWQgdGhlIHBhZ2UgbGF0ZXIgYW5kIHNpbmNlIHRoZSBwYWdlIGxvY2sgbmVzdHMKKwkJICogb3V0c2lkZSBhbGwgbnRmcyBsb2Nrcywgd2UgbmVlZCB0byBnZXQgdGhlIHBhZ2Ugbm93LgorCQkgKi8KKwkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UodmktPmlfbWFwcGluZywgMCwKKwkJCQltYXBwaW5nX2dmcF9tYXNrKHZpLT5pX21hcHBpbmcpKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkvKiBTdGFydCBieSBhbGxvY2F0aW5nIGNsdXN0ZXJzIHRvIGhvbGQgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwkJcmwgPSBudGZzX2NsdXN0ZXJfYWxsb2Modm9sLCAwLCBuZXdfc2l6ZSA+PgorCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIC0xLCBEQVRBX1pPTkUpOworCQlpZiAoSVNfRVJSKHJsKSkgeworCQkJZXJyID0gUFRSX0VSUihybCk7CisJCQludGZzX2RlYnVnKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2x1c3RlciVzLCBlcnJvciBjb2RlICIKKwkJCQkJIiVpLiIsIChuZXdfc2l6ZSA+PgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSA+IDEgPyAicyIgOiAiIiwKKwkJCQkJZXJyKTsKKwkJCWdvdG8gcGFnZV9lcnJfb3V0OworCQl9CisJCS8qIENoYW5nZSB0aGUgcnVubGlzdCB0ZXJtaW5hdG9yIHRvIExDTl9FTk9FTlQuICovCisJCXJsMiA9IHJsOworCQl3aGlsZSAocmwyLT5sZW5ndGgpCisJCQlybDIrKzsKKwkJQlVHX09OKHJsMi0+bGNuICE9IExDTl9STF9OT1RfTUFQUEVEKTsKKwkJcmwyLT5sY24gPSBMQ05fRU5PRU5UOworCX0gZWxzZSB7CisJCXJsID0gTlVMTDsKKwkJcGFnZSA9IE5VTEw7CisJfQorCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4gKi8KKwltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsLCAwLCAtMSk7CisJaWYgKHVubGlrZWx5KG1wX3NpemUgPCAwKSkgeworCQllcnIgPSBtcF9zaXplOworCQludGZzX2RlYnVnKCJGYWlsZWQgdG8gZ2V0IHNpemUgZm9yIG1hcHBpbmcgcGFpcnMgYXJyYXksIGVycm9yICIKKwkJCQkiY29kZSAlaS4iLCBlcnIpOworCQlnb3RvIHJsX2Vycl9vdXQ7CisJfQorCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCWlmICghTklub0F0dHIobmkpKQorCQliYXNlX25pID0gbmk7CisJZWxzZQorCQliYXNlX25pID0gbmktPmV4dC5iYXNlX250ZnNfaW5vOworCW0gPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKwltID0gY3R4LT5tcmVjOworCWEgPSBjdHgtPmF0dHI7CisJQlVHX09OKE5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTihhLT5ub25fcmVzaWRlbnQpOworCS8qCisJICogQ2FsY3VsYXRlIG5ldyBvZmZzZXRzIGZvciB0aGUgbmFtZSBhbmQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuCisJICogV2UgYXNzdW1lIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGNvbXByZXNzZWQgb3Igc3BhcnNlLgorCSAqLworCW5hbWVfb2ZzID0gKG9mZnNldG9mKEFUVFJfUkVDLAorCQkJZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplKSArIDcpICYgfjc7CisJbXBfb2ZzID0gKG5hbWVfb2ZzICsgYS0+bmFtZV9sZW5ndGggKiBzaXplb2YobnRmc2NoYXIpICsgNykgJiB+NzsKKwkvKgorCSAqIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgcmVzaWRlbnQgcGFydCBvZiB0aGUgbm93IG5vbi1yZXNpZGVudAorCSAqIGF0dHJpYnV0ZSByZWNvcmQuCisJICovCisJYXJlY19zaXplID0gKG1wX29mcyArIG1wX3NpemUgKyA3KSAmIH43OworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlIGJyaW5nIGl0IHVwdG9kYXRlIGJ5IGNvcHlpbmcgZnJvbSB0aGUKKwkgKiBhdHRyaWJ1dGUgdmFsdWUuCisJICovCisJYXR0cl9zaXplID0gbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCUJVR19PTihhdHRyX3NpemUgIT0gaV9zaXplX3JlYWQodmkpKTsKKwlpZiAocGFnZSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1jcHkoa2FkZHIsICh1OCopYSArCisJCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCWF0dHJfc2l6ZSk7CisJCW1lbXNldChrYWRkciArIGF0dHJfc2l6ZSwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gYXR0cl9zaXplKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwkvKiBCYWNrdXAgdGhlIGF0dHJpYnV0ZSBmbGFnLiAqLworCW9sZF9yZXNfYXR0cl9mbGFncyA9IGEtPmRhdGEucmVzaWRlbnQuZmxhZ3M7CisJLyogUmVzaXplIHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCWVyciA9IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKG0sIGEsIGFyZWNfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gZXJyX291dDsKKwkvKgorCSAqIENvbnZlcnQgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSByZWNvcmQgdG8gZGVzY3JpYmUgYQorCSAqIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUuCisJICovCisJYS0+bm9uX3Jlc2lkZW50ID0gMTsKKwkvKiBNb3ZlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiBpdCBleGlzdHMgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0LiAqLworCWlmIChhLT5uYW1lX2xlbmd0aCkKKwkJbWVtbW92ZSgodTgqKWEgKyBuYW1lX29mcywgKHU4KilhICsgbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpLAorCQkJCWEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSk7CisJYS0+bmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihuYW1lX29mcyk7CisJLyoKKwkgKiBGSVhNRTogRm9yIG5vdyBqdXN0IGNsZWFyIGFsbCBvZiB0aGVzZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCB0aGVtCisJICogd2hlbiB3cml0aW5nLgorCSAqLworCWEtPmZsYWdzICY9IGNwdV90b19sZTE2KDB4ZmZmZiAmIH5sZTE2X3RvX2NwdShBVFRSX0lTX1NQQVJTRSB8CisJCQlBVFRSX0lTX0VOQ1JZUFRFRCB8IEFUVFJfQ09NUFJFU1NJT05fTUFTSykpOworCS8qIFNldHVwIHRoZSBmaWVsZHMgc3BlY2lmaWMgdG8gbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMuICovCisJYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbiA9IDA7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24gPSBjcHVfdG9fc2xlNjQoKG5ld19zaXplIC0gMSkgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOworCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0ID0gY3B1X3RvX2xlMTYobXBfb2ZzKTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ID0gMDsKKwltZW1zZXQoJmEtPmRhdGEubm9uX3Jlc2lkZW50LnJlc2VydmVkLCAwLAorCQkJc2l6ZW9mKGEtPmRhdGEubm9uX3Jlc2lkZW50LnJlc2VydmVkKSk7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPSBjcHVfdG9fc2xlNjQobmV3X3NpemUpOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9CisJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KKwkJCWNwdV90b19zbGU2NChhdHRyX3NpemUpOworCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGludG8gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJZXJyID0gbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKHZvbCwgKHU4KilhICsgbXBfb2ZzLAorCQkJYXJlY19zaXplIC0gbXBfb2ZzLCBybCwgMCwgLTEsIE5VTEwpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZGVidWcoIkZhaWxlZCB0byBidWlsZCBtYXBwaW5nIHBhaXJzLCBlcnJvciBjb2RlICVpLiIsCisJCQkJZXJyKTsKKwkJZ290byB1bmRvX2Vycl9vdXQ7CisJfQorCS8qIFNldHVwIHRoZSBpbi1tZW1vcnkgYXR0cmlidXRlIHN0cnVjdHVyZSB0byBiZSBub24tcmVzaWRlbnQuICovCisJLyoKKwkgKiBGSVhNRTogRm9yIG5vdyBqdXN0IGNsZWFyIGFsbCBvZiB0aGVzZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCB0aGVtCisJICogd2hlbiB3cml0aW5nLgorCSAqLworCU5Jbm9DbGVhclNwYXJzZShuaSk7CisJTklub0NsZWFyRW5jcnlwdGVkKG5pKTsKKwlOSW5vQ2xlYXJDb21wcmVzc2VkKG5pKTsKKwluaS0+cnVubGlzdC5ybCA9IHJsOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IG5ld19zaXplOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGxhc3Qgc2luY2UgdGhlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyAtPnJlYWRwYWdlCisJICogYW5kIC0+d3JpdGVwYWdlIGNhbiBydW4gY29uY3VycmVudGx5IHdpdGggdXMgYXMgdGhleSBhcmUgbm90CisJICogc2VyaWFsaXplZCBvbiBpX3NlbS4gIE5vdGUsIHdlIGFyZSBub3QgYWxsb3dlZCB0byBmYWlsIG9uY2Ugd2UgZmxpcAorCSAqIHRoaXMgc3dpdGNoLCB3aGljaCBpcyBhbm90aGVyIHJlYXNvbiB0byBkbyB0aGlzIGxhc3QuCisJICovCisJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwkvKiBNYXJrIHRoZSBtZnQgcmVjb3JkIGRpcnR5LCBzbyBpdCBnZXRzIHdyaXR0ZW4gYmFjay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlpZiAocGFnZSkgeworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOwordW5kb19lcnJfb3V0OgorCS8qIENvbnZlcnQgdGhlIGF0dHJpYnV0ZSBiYWNrIGludG8gYSByZXNpZGVudCBhdHRyaWJ1dGUuICovCisJYS0+bm9uX3Jlc2lkZW50ID0gMDsKKwkvKiBNb3ZlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiBpdCBleGlzdHMgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0LiAqLworCW5hbWVfb2ZzID0gKG9mZnNldG9mKEFUVFJfUkVDT1JELCBkYXRhLnJlc2lkZW50LnJlc2VydmVkKSArCisJCQlzaXplb2YoYS0+ZGF0YS5yZXNpZGVudC5yZXNlcnZlZCkgKyA3KSAmIH43OworCWlmIChhLT5uYW1lX2xlbmd0aCkKKwkJbWVtbW92ZSgodTgqKWEgKyBuYW1lX29mcywgKHU4KilhICsgbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpLAorCQkJCWEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSk7CisJbXBfb2ZzID0gKG5hbWVfb2ZzICsgYS0+bmFtZV9sZW5ndGggKiBzaXplb2YobnRmc2NoYXIpICsgNykgJiB+NzsKKwlhLT5uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG5hbWVfb2ZzKTsKKwlhcmVjX3NpemUgPSAobXBfb2ZzICsgYXR0cl9zaXplICsgNykgJiB+NzsKKwkvKiBSZXNpemUgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJZXJyMiA9IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKG0sIGEsIGFyZWNfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGVycjIpKSB7CisJCS8qCisJCSAqIFRoaXMgY2Fubm90IGhhcHBlbiAod2VsbCBpZiBtZW1vcnkgY29ycnVwdGlvbiBpcyBhdCB3b3JrIGl0CisJCSAqIGNvdWxkIGhhcHBlbiBpbiB0aGVvcnkpLCBidXQgZGVhbCB3aXRoIGl0IGFzIHdlbGwgYXMgd2UgY2FuLgorCQkgKiBJZiB0aGUgb2xkIHNpemUgaXMgdG9vIHNtYWxsLCB0cnVuY2F0ZSB0aGUgYXR0cmlidXRlLAorCQkgKiBvdGhlcndpc2Ugc2ltcGx5IGdpdmUgaXQgYSBsYXJnZXIgYWxsb2NhdGVkIHNpemUuCisJCSAqIEZJWE1FOiBTaG91bGQgY2hlY2sgd2hldGhlciBjaGtkc2sgY29tcGxhaW5zIHdoZW4gdGhlCisJCSAqIGFsbG9jYXRlZCBzaXplIGlzIG11Y2ggYmlnZ2VyIHRoYW4gdGhlIHJlc2lkZW50IHZhbHVlIHNpemUuCisJCSAqLworCQlhcmVjX3NpemUgPSBsZTMyX3RvX2NwdShhLT5sZW5ndGgpOworCQlpZiAoKG1wX29mcyArIGF0dHJfc2l6ZSkgPiBhcmVjX3NpemUpIHsKKwkJCWVycjIgPSBhdHRyX3NpemU7CisJCQlhdHRyX3NpemUgPSBhcmVjX3NpemUgLSBtcF9vZnM7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gdW5kbyBwYXJ0aWFsIHJlc2lkZW50ICIKKwkJCQkJInRvIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgIgorCQkJCQkiY29udmVyc2lvbi4gIFRydW5jYXRpbmcgaW5vZGUgMHglbHgsICIKKwkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXggZnJvbSAlaSBieXRlcyB0byAiCisJCQkJCSIlaSBieXRlcyB0byBtYWludGFpbiBtZXRhZGF0YSAiCisJCQkJCSJjb25zaXN0ZW5jeS4gIFRISVMgTUVBTlMgWU9VIEFSRSAiCisJCQkJCSJMT1NJTkcgJWkgQllURVMgREFUQSBGUk9NIFRISVMgJXMuIiwKKwkJCQkJdmktPmlfaW5vLAorCQkJCQkodW5zaWduZWQpbGUzMl90b19jcHUobmktPnR5cGUpLAorCQkJCQllcnIyLCBhdHRyX3NpemUsIGVycjIgLSBhdHRyX3NpemUsCisJCQkJCSgobmktPnR5cGUgPT0gQVRfREFUQSkgJiYKKwkJCQkJIW5pLT5uYW1lX2xlbikgPyAiRklMRSI6ICJBVFRSSUJVVEUiKTsKKwkJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBhdHRyX3NpemU7CisJCQlpX3NpemVfd3JpdGUodmksIGF0dHJfc2l6ZSk7CisJCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCS8qIFNldHVwIHRoZSBmaWVsZHMgc3BlY2lmaWMgdG8gcmVzaWRlbnQgYXR0cmlidXRlcy4gKi8KKwlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGF0dHJfc2l6ZSk7CisJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihtcF9vZnMpOworCWEtPmRhdGEucmVzaWRlbnQuZmxhZ3MgPSBvbGRfcmVzX2F0dHJfZmxhZ3M7CisJbWVtc2V0KCZhLT5kYXRhLnJlc2lkZW50LnJlc2VydmVkLCAwLAorCQkJc2l6ZW9mKGEtPmRhdGEucmVzaWRlbnQucmVzZXJ2ZWQpKTsKKwkvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHBhZ2UgYmFjayB0byB0aGUgYXR0cmlidXRlIHZhbHVlLiAqLworCWlmIChwYWdlKSB7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1jcHkoKHU4KilhICsgbXBfb2ZzLCBrYWRkciwgYXR0cl9zaXplKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKwkvKiBTZXR1cCB0aGUgYWxsb2NhdGVkIHNpemUgaW4gdGhlIG50ZnMgaW5vZGUgaW4gY2FzZSBpdCBjaGFuZ2VkLiAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IGFyZWNfc2l6ZSAtIG1wX29mczsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCS8qIE1hcmsgdGhlIG1mdCByZWNvcmQgZGlydHksIHNvIGl0IGdldHMgd3JpdHRlbiBiYWNrLiAqLworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworZXJyX291dDoKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwluaS0+cnVubGlzdC5ybCA9IE5VTEw7CisJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworcmxfZXJyX291dDoKKwlpZiAocmwpIHsKKwkJaWYgKG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmwodm9sLCBybCkgPCAwKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVsZWFzZSBhbGxvY2F0ZWQgIgorCQkJCQkiY2x1c3RlcihzKSBpbiBlcnJvciBjb2RlIHBhdGguICBSdW4gIgorCQkJCQkiY2hrZHNrIHRvIHJlY292ZXIgdGhlIGxvc3QgIgorCQkJCQkiY2x1c3RlcihzKS4iKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJfQorCQludGZzX2ZyZWUocmwpOworcGFnZV9lcnJfb3V0OgorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlpZiAoZXJyID09IC1FSU5WQUwpCisJCWVyciA9IC1FSU87CisJcmV0dXJuIGVycjsKK30KKworLyoqCiAgKiBudGZzX2F0dHJfc2V0IC0gZmlsbCAoYSBwYXJ0IG9mKSBhbiBhdHRyaWJ1dGUgd2l0aCBhIGJ5dGUKICAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlIHRvIGZpbGwKICAqIEBvZnM6CW9mZnNldCBpbnNpZGUgdGhlIGF0dHJpYnV0ZSBhdCB3aGljaCB0byBzdGFydCB0byBmaWxsCkBAIC0xMTI3LDYgKzE1NzksMTAgQEAKICAqIGJ5dGUgb2Zmc2V0IEBvZnMgaW5zaWRlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgY29uc3RhbnQgYnl0ZSBAdmFsLgogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgZWZmZWN0aXZlbHkgbGlrZSBtZW1zZXQoKSBhcHBsaWVkIHRvIGFuIG50ZnMgYXR0cmlidXRlLgorICogTm90ZSB0aGllIGZ1bmN0aW9uIGFjdHVhbGx5IG9ubHkgb3BlcmF0ZXMgb24gdGhlIHBhZ2UgY2FjaGUgcGFnZXMgYmVsb25naW5nCisgKiB0byB0aGUgbnRmcyBhdHRyaWJ1dGUgYW5kIGl0IG1hcmtzIHRoZW0gZGlydHkgYWZ0ZXIgZG9pbmcgdGhlIG1lbXNldCgpLgorICogVGh1cyBpdCByZWxpZXMgb24gdGhlIHZtIGRpcnR5IHBhZ2Ugd3JpdGUgY29kZSBwYXRocyB0byBjYXVzZSB0aGUgbW9kaWZpZWQKKyAqIHBhZ2VzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1mdCByZWNvcmQvZGlzay4KICAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBBbiBlcnJvciBjb2RlIG9mIC1FU1BJUEUgbWVhbnMKICAqIHRoYXQgQG9mcyArIEBjbnQgd2VyZSBvdXRzaWRlIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgbm8gd3JpdGUgd2FzCkBAIC0xMTU1LDcgKzE2MTEsNyBAQAogCWVuZCA9IG9mcyArIGNudDsKIAllbmRfb2ZzID0gZW5kICYgflBBR0VfQ0FDSEVfTUFTSzsKIAkvKiBJZiB0aGUgZW5kIGlzIG91dHNpZGUgdGhlIGlub2RlIHNpemUgcmV0dXJuIC1FU1BJUEUuICovCi0JaWYgKHVubGlrZWx5KGVuZCA+IFZGU19JKG5pKS0+aV9zaXplKSkgeworCWlmICh1bmxpa2VseShlbmQgPiBpX3NpemVfcmVhZChWRlNfSShuaSkpKSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJSZXF1ZXN0IGV4Y2VlZHMgZW5kIG9mIGF0dHJpYnV0ZS4iKTsKIAkJcmV0dXJuIC1FU1BJUEU7CiAJfQpAQCAtMTI1NiwzICsxNzEyLDUgQEAKIAludGZzX2RlYnVnKCJEb25lLiIpOwogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hdHRyaWIuaCBiL2ZzL250ZnMvYXR0cmliLmgKaW5kZXggZTBjMmM2Yy4uMGU0YWM2ZCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hdHRyaWIuaAorKysgYi9mcy9udGZzL2F0dHJpYi5oCkBAIC0yLDcgKzIsNyBAQAogICogYXR0cmliLmggLSBEZWZpbmVzIGZvciBhdHRyaWJ1dGUgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgogICoJICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjAsMTAgKzYwLDE0IEBACiAJQVRUUl9SRUNPUkQgKmJhc2VfYXR0cjsKIH0gbnRmc19hdHRyX3NlYXJjaF9jdHg7CiAKK2V4dGVybiBpbnQgbnRmc19tYXBfcnVubGlzdF9ub2xvY2sobnRmc19pbm9kZSAqbmksIFZDTiB2Y24pOwogZXh0ZXJuIGludCBudGZzX21hcF9ydW5saXN0KG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKTsKIAotZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19maW5kX3ZjbihudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKLQkJY29uc3QgQk9PTCBuZWVkX3dyaXRlKTsKK2V4dGVybiBMQ04gbnRmc19hdHRyX3Zjbl90b19sY25fbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBWQ04gdmNuLAorCQljb25zdCBCT09MIHdyaXRlX2xvY2tlZCk7CisKK2V4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobnRmc19pbm9kZSAqbmksCisJCWNvbnN0IFZDTiB2Y24sIGNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKTsKIAogaW50IG50ZnNfYXR0cl9sb29rdXAoY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IG50ZnNjaGFyICpuYW1lLAogCQljb25zdCB1MzIgbmFtZV9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCkBAIC04NSw2ICs4OSw4IEBACiAJCU1GVF9SRUNPUkQgKm1yZWMpOwogZXh0ZXJuIHZvaWQgbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOwogCisjaWZkZWYgTlRGU19SVworCiBleHRlcm4gaW50IG50ZnNfYXR0cl9zaXplX2JvdW5kc19jaGVjayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAogCQljb25zdCBBVFRSX1RZUEUgdHlwZSwgY29uc3QgczY0IHNpemUpOwogZXh0ZXJuIGludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLApAQCAtOTQsNyArMTAwLDExIEBACiAKIGV4dGVybiBpbnQgbnRmc19hdHRyX3JlY29yZF9yZXNpemUoTUZUX1JFQ09SRCAqbSwgQVRUUl9SRUNPUkQgKmEsIHUzMiBuZXdfc2l6ZSk7CiAKK2V4dGVybiBpbnQgbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KG50ZnNfaW5vZGUgKm5pKTsKKwogZXh0ZXJuIGludCBudGZzX2F0dHJfc2V0KG50ZnNfaW5vZGUgKm5pLCBjb25zdCBzNjQgb2ZzLCBjb25zdCBzNjQgY250LAogCQljb25zdCB1OCB2YWwpOwogCisjZW5kaWYgLyogTlRGU19SVyAqLworCiAjZW5kaWYgLyogX0xJTlVYX05URlNfQVRUUklCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29tcHJlc3MuYyBiL2ZzL250ZnMvY29tcHJlc3MuYwppbmRleCBlZTVhZTcwLi42ZDI2NWNmIDEwMDY0NAotLS0gYS9mcy9udGZzL2NvbXByZXNzLmMKKysrIGIvZnMvbnRmcy9jb21wcmVzcy5jCkBAIC05NiwxMyArOTYsMTQgQEAKIC8qKgogICogemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZSAtIHplcm8gb3V0IG9mIGJvdW5kcyBjb21wcmVzc2VkIHBhZ2UgcmVnaW9uCiAgKi8KLXN0YXRpYyB2b2lkIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UobnRmc19pbm9kZSAqbmksIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJY29uc3QgczY0IGluaXRpYWxpemVkX3NpemUpCiB7CiAJdTggKmtwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCXVuc2lnbmVkIGludCBrcF9vZnM7CiAKIAludGZzX2RlYnVnKCJaZXJvaW5nIHBhZ2UgcmVnaW9uIG91dHNpZGUgaW5pdGlhbGl6ZWQgc2l6ZS4iKTsKLQlpZiAoKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gbmktPmluaXRpYWxpemVkX3NpemUpIHsKKwlpZiAoKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaW5pdGlhbGl6ZWRfc2l6ZSkgewogCQkvKgogCQkgKiBGSVhNRTogVXNpbmcgY2xlYXJfcGFnZSgpIHdpbGwgYmVjb21lIHdyb25nIHdoZW4gd2UgZ2V0CiAJCSAqIFBBR0VfQ0FDSEVfU0laRSAhPSBQQUdFX1NJWkUgYnV0IGZvciBub3cgdGhlcmUgaXMgbm8gcHJvYmxlbS4KQEAgLTExMCw3ICsxMTEsNyBAQAogCQljbGVhcl9wYWdlKGtwKTsKIAkJcmV0dXJuOwogCX0KLQlrcF9vZnMgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJa3Bfb2ZzID0gaW5pdGlhbGl6ZWRfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJbWVtc2V0KGtwICsga3Bfb2ZzLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBrcF9vZnMpOwogCXJldHVybjsKIH0KQEAgLTExOCwxMiArMTE5LDEyIEBACiAvKioKICAqIGhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlIC0gdGVzdCBmb3ImaGFuZGxlIG91dCBvZiBib3VuZHMgY29tcHJlc3NlZCBwYWdlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZShudGZzX2lub2RlICpuaSwKLQkJc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCWNvbnN0IGxvZmZfdCBpX3NpemUsIGNvbnN0IHM2NCBpbml0aWFsaXplZF9zaXplKQogewotCWlmICgocGFnZS0+aW5kZXggPj0gKG5pLT5pbml0aWFsaXplZF9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSAmJgotCQkJKG5pLT5pbml0aWFsaXplZF9zaXplIDwgVkZTX0kobmkpLT5pX3NpemUpKQotCQl6ZXJvX3BhcnRpYWxfY29tcHJlc3NlZF9wYWdlKG5pLCBwYWdlKTsKKwlpZiAoKHBhZ2UtPmluZGV4ID49IChpbml0aWFsaXplZF9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSAmJgorCQkJKGluaXRpYWxpemVkX3NpemUgPCBpX3NpemUpKQorCQl6ZXJvX3BhcnRpYWxfY29tcHJlc3NlZF9wYWdlKHBhZ2UsIGluaXRpYWxpemVkX3NpemUpOwogCXJldHVybjsKIH0KIApAQCAtMTM4LDYgKzEzOSw4IEBACiAgKiBAeHBhZ2VfZG9uZToJCXNldCB0byAxIGlmIHhwYWdlIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IChJTi9PVVQpCiAgKiBAY2Jfc3RhcnQ6CQljb21wcmVzc2lvbiBibG9jayB0byBkZWNvbXByZXNzIChJTikKICAqIEBjYl9zaXplOgkJc2l6ZSBvZiBjb21wcmVzc2lvbiBibG9jayBAY2Jfc3RhcnQgaW4gYnl0ZXMgKElOKQorICogQGlfc2l6ZToJCWZpbGUgc2l6ZSB3aGVuIHdlIHN0YXJ0ZWQgdGhlIHJlYWQgKElOKQorICogQGluaXRpYWxpemVkX3NpemU6CWluaXRpYWxpemVkIGZpbGUgc2l6ZSB3aGVuIHdlIHN0YXJ0ZWQgdGhlIHJlYWQgKElOKQogICoKICAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIHByZWVtcHRpb24uIG50ZnNfZGVjb21wcmVzcygpIHJlZW5hYmxlcyBpdCB3aGVuCiAgKiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyBmaW5pc2hlZC4KQEAgLTE2NSw3ICsxNjgsOCBAQAogc3RhdGljIGludCBudGZzX2RlY29tcHJlc3Moc3RydWN0IHBhZ2UgKmRlc3RfcGFnZXNbXSwgaW50ICpkZXN0X2luZGV4LAogCQlpbnQgKmRlc3Rfb2ZzLCBjb25zdCBpbnQgZGVzdF9tYXhfaW5kZXgsIGNvbnN0IGludCBkZXN0X21heF9vZnMsCiAJCWNvbnN0IGludCB4cGFnZSwgY2hhciAqeHBhZ2VfZG9uZSwgdTggKmNvbnN0IGNiX3N0YXJ0LAotCQljb25zdCB1MzIgY2Jfc2l6ZSkKKwkJY29uc3QgdTMyIGNiX3NpemUsIGNvbnN0IGxvZmZfdCBpX3NpemUsCisJCWNvbnN0IHM2NCBpbml0aWFsaXplZF9zaXplKQogewogCS8qCiAJICogUG9pbnRlcnMgaW50byB0aGUgY29tcHJlc3NlZCBkYXRhLCBpLmUuIHRoZSBjb21wcmVzc2lvbiBibG9jayAoY2IpLApAQCAtMjE5LDkgKzIyMyw2IEBACiAJCXNwaW5fdW5sb2NrKCZudGZzX2NiX2xvY2spOwogCQkvKiBTZWNvbmQgc3RhZ2U6IGZpbmFsaXplIGNvbXBsZXRlZCBwYWdlcy4gKi8KIAkJaWYgKG5yX2NvbXBsZXRlZF9wYWdlcyA+IDApIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gZGVzdF9wYWdlc1tjb21wbGV0ZWRfcGFnZXNbMF1dOwotCQkJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7Ci0KIAkJCWZvciAoaSA9IDA7IGkgPCBucl9jb21wbGV0ZWRfcGFnZXM7IGkrKykgewogCQkJCWludCBkaSA9IGNvbXBsZXRlZF9wYWdlc1tpXTsKIApAQCAtMjMwLDcgKzIzMSw4IEBACiAJCQkJICogSWYgd2UgYXJlIG91dHNpZGUgdGhlIGluaXRpYWxpemVkIHNpemUsIHplcm8KIAkJCQkgKiB0aGUgb3V0IG9mIGJvdW5kcyBwYWdlIHJhbmdlLgogCQkJCSAqLwotCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG5pLCBkcCk7CisJCQkJaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UoZHAsIGlfc2l6ZSwKKwkJCQkJCWluaXRpYWxpemVkX3NpemUpOwogCQkJCWZsdXNoX2RjYWNoZV9wYWdlKGRwKTsKIAkJCQlrdW5tYXAoZHApOwogCQkJCVNldFBhZ2VVcHRvZGF0ZShkcCk7CkBAIC00NzgsMTIgKzQ4MCwxNCBAQAogICovCiBpbnQgbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CisJbG9mZl90IGlfc2l6ZTsKKwlzNjQgaW5pdGlhbGl6ZWRfc2l6ZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kobWFwcGluZy0+aG9zdCk7CiAJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CiAJcnVubGlzdF9lbGVtZW50ICpybDsKLQl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFncywgYmxvY2tfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAl1bnNpZ25lZCBjaGFyIGJsb2NrX3NpemVfYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXU4ICpjYiwgKmNiX3BvcywgKmNiX2VuZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHM7CkBAIC01NTIsOCArNTU2LDEyIEBACiAJICogVGhlIHJlbWFpbmluZyBwYWdlcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgcGFnZQogCSAqIGNhY2hlLCBhbGlnbm1lbnQgZ3VhcmFudGVlcyBrZWVwIGFsbCB0aGUgYmVsb3cgbXVjaCBzaW1wbGVyLiAoLTgKIAkgKi8KLQltYXhfcGFnZSA9ICgoVkZTX0kobmkpLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgotCQkJUEFHRV9DQUNIRV9TSElGVCkgLSBvZmZzZXQ7CisJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChWRlNfSShuaSkpOworCWluaXRpYWxpemVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbWF4X3BhZ2UgPSAoKGlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpIC0KKwkJCW9mZnNldDsKIAlpZiAobnJfcGFnZXMgPCBtYXhfcGFnZSkKIAkJbWF4X3BhZ2UgPSBucl9wYWdlczsKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X3BhZ2U7IGkrKywgb2Zmc2V0KyspIHsKQEAgLTgyNCw3ICs4MzIsOCBAQAogCQkJCSAqIElmIHdlIGFyZSBvdXRzaWRlIHRoZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCiAJCQkJICogdGhlIG91dCBvZiBib3VuZHMgcGFnZSByYW5nZS4KIAkJCQkgKi8KLQkJCQloYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZShuaSwgcGFnZSk7CisJCQkJaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UocGFnZSwgaV9zaXplLAorCQkJCQkJaW5pdGlhbGl6ZWRfc2l6ZSk7CiAJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCQkJa3VubWFwKHBhZ2UpOwogCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKQEAgLTg0Nyw3ICs4NTYsOCBAQAogCQludGZzX2RlYnVnKCJGb3VuZCBjb21wcmVzc2VkIGNvbXByZXNzaW9uIGJsb2NrLiIpOwogCQllcnIgPSBudGZzX2RlY29tcHJlc3MocGFnZXMsICZjdXJfcGFnZSwgJmN1cl9vZnMsCiAJCQkJY2JfbWF4X3BhZ2UsIGNiX21heF9vZnMsIHhwYWdlLCAmeHBhZ2VfZG9uZSwKLQkJCQljYl9wb3MsCWNiX3NpemUgLSAoY2JfcG9zIC0gY2IpKTsKKwkJCQljYl9wb3MsCWNiX3NpemUgLSAoY2JfcG9zIC0gY2IpLCBpX3NpemUsCisJCQkJaW5pdGlhbGl6ZWRfc2l6ZSk7CiAJCS8qCiAJCSAqIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgbG9jayBhbHJlYWR5IGRyb3BwZWQgYnkKIAkJICogbnRmc19kZWNvbXByZXNzKCkuCmRpZmYgLS1naXQgYS9mcy9udGZzL2RlYnVnLmMgYi9mcy9udGZzL2RlYnVnLmMKaW5kZXggNmZiNmJiNS4uODA3MTUwZSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9kZWJ1Zy5jCisrKyBiL2ZzL250ZnMvZGVidWcuYwpAQCAtMTY0LDE0ICsxNjQsMTcgQEAKIAkJCWlmIChpbmRleCA+IC1MQ05fRU5PRU5UIC0gMSkKIAkJCQlpbmRleCA9IDM7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJS0xNkx4ICVzICUtMTZMeCVzXG4iLAotCQkJCQkocmwgKyBpKS0+dmNuLCBsY25fc3RyW2luZGV4XSwKLQkJCQkJKHJsICsgaSktPmxlbmd0aCwgKHJsICsgaSktPmxlbmd0aCA/Ci0JCQkJCSIiIDogIiAocnVubGlzdCBlbmQpIik7CisJCQkJCShsb25nIGxvbmcpKHJsICsgaSktPnZjbiwgbGNuX3N0cltpbmRleF0sCisJCQkJCShsb25nIGxvbmcpKHJsICsgaSktPmxlbmd0aCwKKwkJCQkJKHJsICsgaSktPmxlbmd0aCA/ICIiIDoKKwkJCQkJCSIgKHJ1bmxpc3QgZW5kKSIpOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlLTE2THggJS0xNkx4ICAlLTE2THglc1xuIiwKLQkJCQkJKHJsICsgaSktPnZjbiwgKHJsICsgaSktPmxjbiwKLQkJCQkJKHJsICsgaSktPmxlbmd0aCwgKHJsICsgaSktPmxlbmd0aCA/Ci0JCQkJCSIiIDogIiAocnVubGlzdCBlbmQpIik7CisJCQkJCShsb25nIGxvbmcpKHJsICsgaSktPnZjbiwKKwkJCQkJKGxvbmcgbG9uZykocmwgKyBpKS0+bGNuLAorCQkJCQkobG9uZyBsb25nKShybCArIGkpLT5sZW5ndGgsCisJCQkJCShybCArIGkpLT5sZW5ndGggPyAiIiA6CisJCQkJCQkiIChydW5saXN0IGVuZCkiKTsKIAkJaWYgKCEocmwgKyBpKS0+bGVuZ3RoKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kaXIuYyBiL2ZzL250ZnMvZGlyLmMKaW5kZXggOTM1Nzc1Ni4uNDY3Nzk0NyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9kaXIuYworKysgYi9mcy9udGZzL2Rpci5jCkBAIC0xLDcgKzEsNyBAQAogLyoqCiAgKiBkaXIuYyAtIE5URlMga2VybmVsIGRpcmVjdG9yeSBvcGVyYXRpb25zLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xODMsOCArMTgzLDcgQEAKIAkJCQluYW1lLT5sZW4gPSAwOwogCQkJCSpyZXMgPSBuYW1lOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobmFtZSkKLQkJCQkJa2ZyZWUobmFtZSk7CisJCQkJa2ZyZWUobmFtZSk7CiAJCQkJKnJlcyA9IE5VTEw7CiAJCQl9CiAJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CkBAIC00NDQsOCArNDQzLDcgQEAKIAkJCQluYW1lLT5sZW4gPSAwOwogCQkJCSpyZXMgPSBuYW1lOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobmFtZSkKLQkJCQkJa2ZyZWUobmFtZSk7CisJCQkJa2ZyZWUobmFtZSk7CiAJCQkJKnJlcyA9IE5VTEw7CiAJCQl9CiAJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CkBAIC02MTAsNyArNjA4LDcgQEAKIC8vIFRPRE86IChBSUEpCiAvLyBUaGUgYWxnb3JpdGhtIGVtYmVkZGVkIGluIHRoaXMgY29kZSB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGUgdGltZSB3aGVuIHdlCiAvLyB3YW50IHRvIHN1cHBvcnQgYWRkaW5nIG9mIGVudHJpZXMgdG8gZGlyZWN0b3JpZXMsIHdoZXJlIHdlIHJlcXVpcmUgY29ycmVjdAotLy8gY29sbGF0aW9uIG9mIGZpbGUgbmFtZXMgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGNvcnJ1cHRpb24gb2YgdGhlIGZpbGUgc3lzdGVtLgorLy8gY29sbGF0aW9uIG9mIGZpbGUgbmFtZXMgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGNvcnJ1cHRpb24gb2YgdGhlIGZpbGVzeXN0ZW0uCiAKIC8qKgogICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSAtIGZpbmQgYW4gaW5vZGUgaW4gYSBkaXJlY3RvcnkgZ2l2ZW4gaXRzIG5hbWUKQEAgLTExMDEsNyArMTA5OSw3IEBACiBzdGF0aWMgaW50IG50ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzNjQgaWFfcG9zLCBpYV9zdGFydCwgcHJldl9pYV9wb3MsIGJtcF9wb3M7Ci0JbG9mZl90IGZwb3M7CisJbG9mZl90IGZwb3MsIGlfc2l6ZTsKIAlzdHJ1Y3QgaW5vZGUgKmJtcF92aSwgKnZkaXIgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdmRpci0+aV9zYjsKIAludGZzX2lub2RlICpuZGlyID0gTlRGU19JKHZkaXIpOwpAQCAtMTEyMiw3ICsxMTIwLDggQEAKIAkJCXZkaXItPmlfaW5vLCBmcG9zKTsKIAlyYyA9IGVyciA9IDA7CiAJLyogQXJlIHdlIGF0IGVuZCBvZiBkaXIgeWV0PyAqLwotCWlmIChmcG9zID49IHZkaXItPmlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplKQorCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKHZkaXIpOworCWlmIChmcG9zID49IGlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplKQogCQlnb3RvIGRvbmU7CiAJLyogRW11bGF0ZSAuIGFuZCAuLiBmb3IgYWxsIGRpcmVjdG9yaWVzLiAqLwogCWlmICghZnBvcykgewpAQCAtMTI2NCw3ICsxMjYzLDcgQEAKIAlibXBfbWFwcGluZyA9IGJtcF92aS0+aV9tYXBwaW5nOwogCS8qIEdldCB0aGUgc3RhcnRpbmcgYml0bWFwIGJpdCBwb3NpdGlvbiBhbmQgc2FuaXR5IGNoZWNrIGl0LiAqLwogCWJtcF9wb3MgPSBpYV9wb3MgPj4gbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzOwotCWlmICh1bmxpa2VseShibXBfcG9zID4+IDMgPj0gYm1wX3ZpLT5pX3NpemUpKSB7CisJaWYgKHVubGlrZWx5KGJtcF9wb3MgPj4gMyA+PSBpX3NpemVfcmVhZChibXBfdmkpKSkgewogCQludGZzX2Vycm9yKHNiLCAiQ3VycmVudCBpbmRleCBhbGxvY2F0aW9uIHBvc2l0aW9uIGV4Y2VlZHMgIgogCQkJCSJpbmRleCBiaXRtYXAgc2l6ZS4iKTsKIAkJZ290byBlcnJfb3V0OwpAQCAtMTMwMSw3ICsxMzAwLDcgQEAKIAkJCWdvdG8gZ2V0X25leHRfYm1wX3BhZ2U7CiAJCX0KIAkJLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJpdG1hcCwgd2UgYXJlIGRvbmUuICovCi0JCWlmICh1bmxpa2VseSgoKGJtcF9wb3MgKyBjdXJfYm1wX3BvcykgPj4gMykgPj0gdmRpci0+aV9zaXplKSkKKwkJaWYgKHVubGlrZWx5KCgoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA+PiAzKSA+PSBpX3NpemUpKQogCQkJZ290byB1bm1fRU9EOwogCQlpYV9wb3MgPSAoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA8PAogCQkJCW5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKQEAgLTEzMDksNyArMTMwOCw4IEBACiAJbnRmc19kZWJ1ZygiSGFuZGxpbmcgaW5kZXggYnVmZmVyIDB4JWxseC4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zICsgY3VyX2JtcF9wb3MpOwogCS8qIElmIHRoZSBjdXJyZW50IGluZGV4IGJ1ZmZlciBpcyBpbiB0aGUgc2FtZSBwYWdlIHdlIHJldXNlIHRoZSBwYWdlLiAqLwotCWlmICgocHJldl9pYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spICE9IChpYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spKSB7CisJaWYgKChwcmV2X2lhX3BvcyAmIChzNjQpUEFHRV9DQUNIRV9NQVNLKSAhPQorCQkJKGlhX3BvcyAmIChzNjQpUEFHRV9DQUNIRV9NQVNLKSkgewogCQlwcmV2X2lhX3BvcyA9IGlhX3BvczsKIAkJaWYgKGxpa2VseShpYV9wYWdlICE9IE5VTEwpKSB7CiAJCQl1bmxvY2tfcGFnZShpYV9wYWdlKTsKQEAgLTE0NDEsNyArMTQ0MSw3IEBACiAJbnRmc191bm1hcF9wYWdlKGJtcF9wYWdlKTsKIEVPRDoKIAkvKiBXZSBhcmUgZmluaXNoZWQsIHNldCBmcG9zIHRvIEVPRC4gKi8KLQlmcG9zID0gdmRpci0+aV9zaXplICsgdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJZnBvcyA9IGlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplOwogYWJvcnQ6CiAJa2ZyZWUobmFtZSk7CiBkb25lOgpAQCAtMTQ2MSwxMCArMTQ2MSw4IEBACiAJCXVubG9ja19wYWdlKGlhX3BhZ2UpOwogCQludGZzX3VubWFwX3BhZ2UoaWFfcGFnZSk7CiAJfQotCWlmIChpcikKLQkJa2ZyZWUoaXIpOwotCWlmIChuYW1lKQotCQlrZnJlZShuYW1lKTsKKwlrZnJlZShpcik7CisJa2ZyZWUobmFtZSk7CiAJaWYgKGN0eCkKIAkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CiAJaWYgKG0pCkBAIC0xNDk1LDcgKzE0OTMsNyBAQAogc3RhdGljIGludCBudGZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7Ci0JCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJaWYgKGlfc2l6ZV9yZWFkKHZpKSA+IE1BWF9MRlNfRklMRVNJWkUpCiAJCQlyZXR1cm4gLUVGQklHOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKaW5kZXggZGI4NzEzZS4uZTBmNTMwYyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9maWxlLmMKKysrIGIvZnMvbnRmcy9maWxlLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHN0YXRpYyBpbnQgbnRmc19maWxlX29wZW4oc3RydWN0IGlub2RlICp2aSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA8IDgpIHsKLQkJaWYgKHZpLT5pX3NpemUgPiBNQVhfTEZTX0ZJTEVTSVpFKQorCQlpZiAoaV9zaXplX3JlYWQodmkpID4gTUFYX0xGU19GSUxFU0laRSkKIAkJCXJldHVybiAtRUZCSUc7CiAJfQogCXJldHVybiBnZW5lcmljX2ZpbGVfb3Blbih2aSwgZmlscCk7CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmMgYi9mcy9udGZzL2luZGV4LmMKaW5kZXggNzFiZDJjZC4uMTFmZDUzMCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbmRleC5jCisrKyBiL2ZzL250ZnMvaW5kZXguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBpbmRleC5jIC0gTlRGUyBrZXJuZWwgaW5kZXggaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtMzksMTggKzM5LDggQEAKIAludGZzX2luZGV4X2NvbnRleHQgKmljdHg7CiAKIAlpY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2luZGV4X2N0eF9jYWNoZSwgU0xBQl9OT0ZTKTsKLQlpZiAoaWN0eCkgewotCQlpY3R4LT5pZHhfbmkgPSBpZHhfbmk7Ci0JCWljdHgtPmVudHJ5ID0gTlVMTDsKLQkJaWN0eC0+ZGF0YSA9IE5VTEw7Ci0JCWljdHgtPmRhdGFfbGVuID0gMDsKLQkJaWN0eC0+aXNfaW5fcm9vdCA9IDA7Ci0JCWljdHgtPmlyID0gTlVMTDsKLQkJaWN0eC0+YWN0eCA9IE5VTEw7Ci0JCWljdHgtPmJhc2VfbmkgPSBOVUxMOwotCQlpY3R4LT5pYSA9IE5VTEw7Ci0JCWljdHgtPnBhZ2UgPSBOVUxMOwotCX0KKwlpZiAoaWN0eCkKKwkJKmljdHggPSAobnRmc19pbmRleF9jb250ZXh0KXsgLmlkeF9uaSA9IGlkeF9uaSB9OwogCXJldHVybiBpY3R4OwogfQogCmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKaW5kZXggMzE4NDBiYS4uODg2MjE0YSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5jCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKgogICogaW5vZGUuYyAtIE5URlMga2VybmVsIGlub2RlIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCkBAIC0xNzQsNyArMTc0LDcgQEAKIAogCXZpID0gaWdldDVfbG9ja2VkKHNiLCBtZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLAogCQkJKHNldF90KW50ZnNfaW5pdF9sb2NrZWRfaW5vZGUsICZuYSk7Ci0JaWYgKCF2aSkKKwlpZiAodW5saWtlbHkoIXZpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAllcnIgPSAwOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4ga2VlcGluZyBiYWQgaW5vZGVzIGFyb3VuZCBpZiB0aGUgZmFpbHVyZSB3YXMKIAkgKiBkdWUgdG8gRU5PTUVNLiBXZSB3YW50IHRvIGJlIGFibGUgdG8gcmV0cnkgYWdhaW4gbGF0ZXIuCiAJICovCi0JaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJaWYgKHVubGlrZWx5KGVyciA9PSAtRU5PTUVNKSkgewogCQlpcHV0KHZpKTsKIAkJdmkgPSBFUlJfUFRSKGVycik7CiAJfQpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIAl2aSA9IGlnZXQ1X2xvY2tlZChiYXNlX3ZpLT5pX3NiLCBuYS5tZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLAogCQkJKHNldF90KW50ZnNfaW5pdF9sb2NrZWRfaW5vZGUsICZuYSk7Ci0JaWYgKCF2aSkKKwlpZiAodW5saWtlbHkoIXZpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAllcnIgPSAwOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJICogc2ltcGxpZmllcyB0aGluZ3MgaW4gdGhhdCB3ZSBuZXZlciBuZWVkIHRvIGNoZWNrIGZvciBiYWQgYXR0cmlidXRlCiAJICogaW5vZGVzIGVsc2V3aGVyZS4KIAkgKi8KLQlpZiAoZXJyKSB7CisJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaXB1dCh2aSk7CiAJCXZpID0gRVJSX1BUUihlcnIpOwogCX0KQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKIAkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOwotCWlmICghdmkpCisJaWYgKHVubGlrZWx5KCF2aSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZXJyID0gMDsKQEAgLTMwNSw3ICszMDUsNyBAQAogCSAqIHNpbXBsaWZpZXMgdGhpbmdzIGluIHRoYXQgd2UgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgYmFkIGluZGV4CiAJICogaW5vZGVzIGVsc2V3aGVyZS4KIAkgKi8KLQlpZiAoZXJyKSB7CisJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaXB1dCh2aSk7CiAJCXZpID0gRVJSX1BUUihlcnIpOwogCX0KQEAgLTMxNyw4ICszMTcsNyBAQAogCW50ZnNfaW5vZGUgKm5pOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7Ci0JbmkgPSAobnRmc19pbm9kZSAqKWttZW1fY2FjaGVfYWxsb2MobnRmc19iaWdfaW5vZGVfY2FjaGUsCi0JCQlTTEFCX05PRlMpOworCW5pID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2JpZ19pbm9kZV9jYWNoZSwgU0xBQl9OT0ZTKTsKIAlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CiAJCW5pLT5zdGF0ZSA9IDA7CiAJCXJldHVybiBWRlNfSShuaSk7CkBAIC0zNDMsNyArMzQyLDcgQEAKIAludGZzX2lub2RlICpuaTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwotCW5pID0gKG50ZnNfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKG50ZnNfaW5vZGVfY2FjaGUsIFNMQUJfTk9GUyk7CisJbmkgPSBrbWVtX2NhY2hlX2FsbG9jKG50ZnNfaW5vZGVfY2FjaGUsIFNMQUJfTk9GUyk7CiAJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgewogCQluaS0+c3RhdGUgPSAwOwogCQlyZXR1cm4gbmk7CkBAIC0zNzYsNiArMzc1LDcgQEAKIHZvaWQgX19udGZzX2luaXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbnRmc19pbm9kZSAqbmkpCiB7CiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJcndsb2NrX2luaXQoJm5pLT5zaXplX2xvY2spOwogCW5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0gMDsKIAluaS0+c2VxX25vID0gMDsKIAlhdG9taWNfc2V0KCZuaS0+Y291bnQsIDEpOwpAQCAtNTI0LDYgKzUyNCw3IEBACiAJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOwogCW50ZnNfaW5vZGUgKm5pOwogCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CiAJU1RBTkRBUkRfSU5GT1JNQVRJT04gKnNpOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAJaW50IGVyciA9IDA7CkBAIC02MzIsOSArNjMzLDEwIEBACiAJCX0KIAkJZ290byB1bm1fZXJyX291dDsKIAl9CisJYSA9IGN0eC0+YXR0cjsKIAkvKiBHZXQgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KLQlzaSA9IChTVEFOREFSRF9JTkZPUk1BVElPTiopKChjaGFyKiljdHgtPmF0dHIgKwotCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCXNpID0gKFNUQU5EQVJEX0lORk9STUFUSU9OKikoKHU4KilhICsKKwkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CiAKIAkvKiBUcmFuc2ZlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHZpLiAqLwogCS8qCkBAIC02NzMsMTUgKzY3NSwxNiBAQAogCQkJZ290byBza2lwX2F0dHJfbGlzdF9sb2FkOwogCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgbGlzdCBmb3VuZCBpbiBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOwogCQlOSW5vU2V0QXR0ckxpc3QobmkpOwotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEIHx8Ci0JCQkJY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAotCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgeworCQlhID0gY3R4LT5hdHRyOworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBpcyAiCiAJCQkJCSJjb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9CiAJCS8qIE5vdyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KLQkJbmktPmF0dHJfbGlzdF9zaXplID0gKHUzMiludGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpOworCQluaS0+YXR0cl9saXN0X3NpemUgPSAodTMyKW50ZnNfYXR0cl9zaXplKGEpOwogCQluaS0+YXR0cl9saXN0ID0gbnRmc19tYWxsb2Nfbm9mcyhuaS0+YXR0cl9saXN0X3NpemUpOwogCQlpZiAoIW5pLT5hdHRyX2xpc3QpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCkBAIC02ODksOSArNjkyLDkgQEAKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQlpZiAoYS0+bm9uX3Jlc2lkZW50KSB7CiAJCQlOSW5vU2V0QXR0ckxpc3ROb25SZXNpZGVudChuaSk7Ci0JCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBoYXMgbm9uICIKIAkJCQkJCSJ6ZXJvIGxvd2VzdF92Y24uIik7CiAJCQkJZ290byB1bm1fZXJyX291dDsKQEAgLTcwMSw3ICs3MDQsNyBAQAogCQkJICogZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgaW5vZGUgYXQgdGhpcyB0aW1lLgogCQkJICovCiAJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3Modm9sLAotCQkJCQljdHgtPmF0dHIsIE5VTEwpOworCQkJCQlhLCBOVUxMKTsKIAkJCWlmIChJU19FUlIobmktPmF0dHJfbGlzdF9ybC5ybCkpIHsKIAkJCQllcnIgPSBQVFJfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpOwogCQkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBOVUxMOwpAQCAtNzEyLDI3ICs3MTUsMjYgQEAKIAkJCS8qIE5vdyBsb2FkIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KIAkJCWlmICgoZXJyID0gbG9hZF9hdHRyaWJ1dGVfbGlzdCh2b2wsICZuaS0+YXR0cl9saXN0X3JsLAogCQkJCQluaS0+YXR0cl9saXN0LCBuaS0+YXR0cl9saXN0X3NpemUsCi0JCQkJCXNsZTY0X3RvX2NwdShjdHgtPmF0dHItPmRhdGEuCi0JCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKSkpKSB7CisJCQkJCXNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJaW5pdGlhbGl6ZWRfc2l6ZSkpKSkgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9hZCAiCiAJCQkJCQkiYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9Ci0JCX0gZWxzZSAvKiBpZiAoIWN0eC5hdHRyLT5ub25fcmVzaWRlbnQpICovIHsKLQkJCWlmICgodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArCi0JCQkJCWxlMzJfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCX0gZWxzZSAvKiBpZiAoIWEtPm5vbl9yZXNpZGVudCkgKi8geworCQkJaWYgKCh1OCopYSArIGxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KQorCQkJCQkrIGxlMzJfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPgogCQkJCQkodTgqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CiAJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkNvcnJ1cHQgYXR0cmlidXRlIGxpc3QgIgogCQkJCQkJImluIGlub2RlLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9CiAJCQkvKiBOb3cgY29weSB0aGUgYXR0cmlidXRlIGxpc3QuICovCi0JCQltZW1jcHkobmktPmF0dHJfbGlzdCwgKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQltZW1jcHkobmktPmF0dHJfbGlzdCwgKHU4KilhICsgbGUxNl90b19jcHUoCisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKIAkJCQkJbGUzMl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKTsKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKTsKIAkJfQogCX0KIHNraXBfYXR0cl9saXN0X2xvYWQ6CkBAIC03NDEsMTAgKzc0MywxMSBAQAogCSAqIGluIG50ZnNfaW5vLT5hdHRyX2xpc3QgYW5kIGl0IGlzIG50ZnNfaW5vLT5hdHRyX2xpc3Rfc2l6ZSBieXRlcy4KIAkgKi8KIAlpZiAoU19JU0RJUih2aS0+aV9tb2RlKSkgeworCQlsb2ZmX3QgYnZpX3NpemU7CiAJCXN0cnVjdCBpbm9kZSAqYnZpOwogCQludGZzX2lub2RlICpibmk7CiAJCUlOREVYX1JPT1QgKmlyOwotCQljaGFyICppcl9lbmQsICppbmRleF9lbmQ7CisJCXU4ICppcl9lbmQsICppbmRleF9lbmQ7CiAKIAkJLyogSXQgaXMgYSBkaXJlY3RvcnksIGZpbmQgaW5kZXggcm9vdCBhdHRyaWJ1dGUuICovCiAJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOwpAQCAtNzYwLDE3ICs3NjMsMTYgQEAKIAkJCX0KIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KKwkJYSA9IGN0eC0+YXR0cjsKIAkJLyogU2V0IHVwIHRoZSBzdGF0ZS4gKi8KLQkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSkgeworCQlpZiAodW5saWtlbHkoYS0+bm9uX3Jlc2lkZW50KSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzIG5vdCAiCiAJCQkJCSJyZXNpZGVudC4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KIAkJLyogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSB2YWx1ZS4gKi8KLQkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKLQkJCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KLQkJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQuCi0JCQkJdmFsdWVfb2Zmc2V0KSkpKSB7CisJCWlmICh1bmxpa2VseShhLT5uYW1lX2xlbmd0aCAmJiAobGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpID49CisJCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKSkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBuYW1lIGlzICIKIAkJCQkJInBsYWNlZCBhZnRlciB0aGUgYXR0cmlidXRlIHZhbHVlLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKQEAgLTc4MSwyOCArNzgzLDI3IEBACiAJCSAqIGVuY3J5cHRlZC4gSG93ZXZlciBpbmRleCByb290IGNhbm5vdCBiZSBib3RoIGNvbXByZXNzZWQgYW5kCiAJCSAqIGVuY3J5cHRlZC4KIAkJICovCi0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKQorCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCiAJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKLQkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIGFuZCAiCiAJCQkJCQkiY29tcHJlc3NlZCBhdHRyaWJ1dGUuIik7CiAJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCX0KIAkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQogCQkJTklub1NldFNwYXJzZShuaSk7Ci0JCWlyID0gKElOREVYX1JPT1QqKSgoY2hhciopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOwotCQlpcl9lbmQgPSAoY2hhciopaXIgKyBsZTMyX3RvX2NwdSgKLQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKLQkJaWYgKGlyX2VuZCA+IChjaGFyKiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQlpciA9IChJTkRFWF9ST09UKikoKHU4KilhICsKKwkJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCQlpcl9lbmQgPSAodTgqKWlyICsgbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQlpZiAoaXJfZW5kID4gKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyAiCiAJCQkJCSJjb3JydXB0LiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpbmRleF9lbmQgPSAoY2hhciopJmlyLT5pbmRleCArCisJCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArCiAJCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmluZGV4X2xlbmd0aCk7CiAJCWlmIChpbmRleF9lbmQgPiBpcl9lbmQpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJEaXJlY3RvcnkgaW5kZXggaXMgY29ycnVwdC4iKTsKQEAgLTg4OSw3ICs4OTAsOCBAQAogCQkJCQkJImF0dHJpYnV0ZS4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKCFjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQlhID0gY3R4LT5hdHRyOworCQlpZiAoIWEtPm5vbl9yZXNpZGVudCkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCiAJCQkJCSJpcyByZXNpZGVudC4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CkBAIC04OTgsNDIgKzkwMCw0MCBAQAogCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKIAkJICogYXJyYXkuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgotCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQotCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJaWYgKHVubGlrZWx5KGEtPm5hbWVfbGVuZ3RoICYmIChsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIG5hbWUgIgogCQkJCQkiaXMgcGxhY2VkIGFmdGVyIHRoZSBtYXBwaW5nIHBhaXJzICIKIAkJCQkJImFycmF5LiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlICIKIAkJCQkJImlzIGVuY3J5cHRlZC4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgeworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCiAJCQkJCSJpcyBzcGFyc2UuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCiAJCQkJCSJpcyBjb21wcmVzc2VkLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICIKIAkJCQkJIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBoYXMgbm9uICIKIAkJCQkJInplcm8gbG93ZXN0X3Zjbi4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKIAkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKIAkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKIAkJLyoKIAkJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gT3RoZXJ3aXNlCiAJCSAqIHdlIHdvdWxkIGRlYWRsb2NrIGluIG50ZnNfYXR0cl9pZ2V0KCkuCkBAIC05NTgsMTEgKzk1OCwxMiBAQAogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQogCQkvKiBDb25zaXN0ZW5jeSBjaGVjayBiaXRtYXAgc2l6ZSB2cy4gaW5kZXggYWxsb2NhdGlvbiBzaXplLiAqLwotCQlpZiAoKGJ2aS0+aV9zaXplIDw8IDMpIDwgKHZpLT5pX3NpemUgPj4KKwkJYnZpX3NpemUgPSBpX3NpemVfcmVhZChidmkpOworCQlpZiAoKGJ2aV9zaXplIDw8IDMpIDwgKHZpLT5pX3NpemUgPj4KIAkJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzKSkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJpdG1hcCB0b28gc21hbGwgKDB4JWxseCkgIgogCQkJCQkiZm9yIGluZGV4IGFsbG9jYXRpb24gKDB4JWxseCkuIiwKLQkJCQkJYnZpLT5pX3NpemUgPDwgMywgdmktPmlfc2l6ZSk7CisJCQkJCWJ2aV9zaXplIDw8IDMsIHZpLT5pX3NpemUpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQogc2tpcF9sYXJnZV9kaXJfc3R1ZmY6CkBAIC0xMDEwLDg3ICsxMDExLDkyIEBACiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJERBVEEgYXR0cmlidXRlIGlzIG1pc3NpbmcuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9CisJCWEgPSBjdHgtPmF0dHI7CiAJCS8qIFNldHVwIHRoZSBzdGF0ZS4gKi8KLQkJaWYgKGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCWlmIChhLT5ub25fcmVzaWRlbnQpIHsKIAkJCU5Jbm9TZXROb25SZXNpZGVudChuaSk7Ci0JCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewotCQkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKLQkJCQlpZiAodm9sLT5jbHVzdGVyX3NpemUgPiA0MDk2KSB7Ci0JCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCi0JCQkJCQkiY29tcHJlc3NlZCBkYXRhIGJ1dCAiCi0JCQkJCQkiY29tcHJlc3Npb24gaXMgZGlzYWJsZWQgZHVlICIKLQkJCQkJCSJ0byBjbHVzdGVyIHNpemUgKCVpKSA+IDRraUIuIiwKLQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKLQkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfAorCQkJCQlBVFRSX0lTX1NQQVJTRSkpIHsKKwkJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQkJTklub1NldENvbXByZXNzZWQobmkpOworCQkJCQlpZiAodm9sLT5jbHVzdGVyX3NpemUgPiA0MDk2KSB7CisJCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJCSJjb21wcmVzc2VkIGRhdGEgYnV0ICIKKwkJCQkJCQkiY29tcHJlc3Npb24gaXMgIgorCQkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gIgorCQkJCQkJCSJjbHVzdGVyIHNpemUgKCVpKSA+ICIKKwkJCQkJCQkiNGtpQi4iLAorCQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKKwkJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJCX0KKwkJCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKKwkJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCisJCQkJCQkJInVua25vd24gY29tcHJlc3Npb24gIgorCQkJCQkJCSJtZXRob2Qgb3IgY29ycnVwdCAiCisJCQkJCQkJImZpbGUuIik7CisJCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCQl9CiAJCQkJfQotCQkJCWlmICgoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKLQkJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgotCQkJCQkJInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIG9yICIKLQkJCQkJCSJjb3JydXB0IGZpbGUuIik7Ci0JCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQkJfQotCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKLQkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCQljb21wcmVzc2lvbl91bml0OwotCQkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQkJY29tcHJlc3Npb25fdW5pdCAhPSA0KSB7CisJCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQkJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICE9CisJCQkJCQk0KSB7CiAJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCiAJCQkJCQkibm9uc3RhbmRhcmQgY29tcHJlc3Npb24gdW5pdCAiCiAJCQkJCQkiKCV1IGluc3RlYWQgb2YgNCkuICBDYW5ub3QgIgogCQkJCQkJImhhbmRsZSB0aGlzLiIsCi0JCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuCiAJCQkJCQljb21wcmVzc2lvbl91bml0KTsKIAkJCQkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQkJfQorCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdDsKIAkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplID0gMVUgPDwgKAotCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgogCQkJCQkJY29tcHJlc3Npb25fdW5pdCArCiAJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKIAkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplX2JpdHMgPSBmZnMoCi0JCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUpIC0gMTsKKwkJCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLgorCQkJCQkJYmxvY2tfc2l6ZSkgLSAxOworCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPSBzbGU2NF90b19jcHUoCisJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzZWRfc2l6ZSk7CiAJCQl9Ci0JCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7Ci0JCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CiAJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgogCQkJCQkJCSJhbmQgY29tcHJlc3NlZCBkYXRhLiIpOwogCQkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJCX0KIAkJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKIAkJCX0KLQkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCi0JCQkJTklub1NldFNwYXJzZShuaSk7Ci0JCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgJERBVEEgIgogCQkJCQkJImF0dHJpYnV0ZSBoYXMgbm9uIHplcm8gIgogCQkJCQkJImxvd2VzdF92Y24uIik7CiAJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCX0KLQkJCS8qIFNldHVwIGFsbCB0aGUgc2l6ZXMuICovCiAJCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CiAJCQluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQkJaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOwogCQkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQlhbGxvY2F0ZWRfc2l6ZSk7Ci0JCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7Ci0JCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCQljb21wcmVzc2VkX3NpemUpOwotCQkJfQorCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJCX0gZWxzZSB7IC8qIFJlc2lkZW50IGF0dHJpYnV0ZS4gKi8KLQkJCS8qCi0JCQkgKiBNYWtlIGFsbCBzaXplcyBlcXVhbCBmb3Igc2ltcGxpY2l0eSBpbiByZWFkIGNvZGUKLQkJCSAqIHBhdGhzLiBGSVhNRTogTmVlZCB0byBrZWVwIHRoaXMgaW4gbWluZCB3aGVuCi0JCQkgKiBjb252ZXJ0aW5nIHRvIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgaW4gd3JpdGUgY29kZQotCQkJICogcGF0aC4gKFByb2JhYmx5IG9ubHkgYWZmZWN0cyB0cnVuY2F0ZSgpLikKLQkJCSAqLwotCQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0KLQkJCQkJbGUzMl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0gbGUzMl90b19jcHUoCisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkgLQorCQkJCQlsZTE2X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworCQkJaWYgKHZpLT5pX3NpemUgPiBuaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgZGF0YSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIGNvcnJ1cHQgKHNpemUgZXhjZWVkcyAiCisJCQkJCQkiYWxsb2NhdGlvbikuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KIAkJfQogbm9fZGF0YV9hdHRyX3NwZWNpYWxfY2FzZToKIAkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gKi8KQEAgLTExMTcsMTEgKzExMjMsMTAgQEAKIAkgKiBzaXplcyBvZiBhbGwgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMgcHJlc2VudCB0byBnaXZlIHVzIHRoZSBMaW51eAogCSAqIGNvcnJlY3Qgc2l6ZSB0aGF0IHNob3VsZCBnbyBpbnRvIGlfYmxvY2tzIChhZnRlciBkaXZpc2lvbiBieSA1MTIpLgogCSAqLwotCWlmIChTX0lTRElSKHZpLT5pX21vZGUpIHx8ICFOSW5vQ29tcHJlc3NlZChuaSkpCi0JCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OwotCWVsc2UKKwlpZiAoU19JU1JFRyh2aS0+aV9tb2RlKSAmJiAoTklub0NvbXByZXNzZWQobmkpIHx8IE5Jbm9TcGFyc2UobmkpKSkKIAkJdmktPmlfYmxvY2tzID0gbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA+PiA5OwotCisJZWxzZQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKIAludGZzX2RlYnVnKCJEb25lLiIpOwogCXJldHVybiAwOwogCkBAIC0xMTY2LDYgKzExNzEsNyBAQAogCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHZpLT5pX3NiKTsKIAludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CiAJTUZUX1JFQ09SRCAqbTsKKwlBVFRSX1JFQ09SRCAqYTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogCWludCBlcnIgPSAwOwogCkBAIC0xMjAwLDI0ICsxMjA2LDIxIEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCiAJLyogRmluZCB0aGUgYXR0cmlidXRlLiAqLwogCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCiAJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byB1bm1fZXJyX291dDsKLQotCWlmICghY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwlhID0gY3R4LT5hdHRyOworCWlmICghYS0+bm9uX3Jlc2lkZW50KSB7CiAJCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCi0JCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCi0JCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49Ci0JCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LgotCQkJCXZhbHVlX29mZnNldCkpKSkgeworCQlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSkpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJBdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYWZ0ZXIgIgogCQkJCQkidGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpIHx8IGN0eC0+YXR0ci0+ZmxhZ3MpIHsKKwkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpIHx8IGEtPmZsYWdzKSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgIgogCQkJCQkib3IgYXR0cmlidXRlIHdpdGggbm9uLXplcm8gZmxhZ3MgYnV0ICIKIAkJCQkJInRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQuICBQbGVhc2UgIgpAQCAtMTIyNSw4NSArMTIyOCw5NSBAQAogCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0Iik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCS8qCi0JCSAqIFJlc2lkZW50IGF0dHJpYnV0ZS4gTWFrZSBhbGwgc2l6ZXMgZXF1YWwgZm9yIHNpbXBsaWNpdHkgaW4KLQkJICogcmVhZCBjb2RlIHBhdGhzLgotCQkgKi8KLQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0KLQkJCWxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBsZTMyX3RvX2NwdSgKKwkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkgLQorCQkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KTsKKwkJaWYgKHZpLT5pX3NpemUgPiBuaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJSZXNpZGVudCBhdHRyaWJ1dGUgaXMgY29ycnVwdCAiCisJCQkJCSIoc2l6ZSBleGNlZWRzIGFsbG9jYXRpb24pLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQogCX0gZWxzZSB7CiAJCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CiAJCS8qCiAJCSAqIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgbWFwcGluZyBwYWlycwogCQkgKiBhcnJheS4KIAkJICovCi0JCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCi0JCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49Ci0JCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQltYXBwaW5nX3BhaXJzX29mZnNldCkpKSkgeworCQlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJBdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYWZ0ZXIgIgogCQkJCQkidGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX1NQQVJTRSkpIHsKKwkJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKKwkJCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PQorCQkJCQkJQVRfREFUQSAmJiBuaS0+bmFtZV9sZW4pKSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKKwkJCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgIgorCQkJCQkJCSJkYXRhIGF0dHJpYnV0ZS4gICIKKwkJCQkJCQkiUGxlYXNlIHJlcG9ydCB5b3UgIgorCQkJCQkJCSJzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQl9CisJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkJImF0dHJpYnV0ZSBidXQgIgorCQkJCQkJCSJjb21wcmVzc2lvbiBpcyAiCisJCQkJCQkJImRpc2FibGVkIGR1ZSB0byAiCisJCQkJCQkJImNsdXN0ZXIgc2l6ZSAoJWkpID4gIgorCQkJCQkJCSI0a2lCLiIsCisJCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQlpZiAoKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSAhPQorCQkJCQkJQVRUUl9JU19DT01QUkVTU0VEKSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKKwkJCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kLiIpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCX0KIAkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKIAkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgotCQkJCQkJImlzIGNvbXByZXNzZWQuICBQbGVhc2UgcmVwb3J0ICIKLQkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkiaXMgJXMuICBQbGVhc2UgcmVwb3J0IHlvdSAiCisJCQkJCQkic2F3IHRoaXMgbWVzc2FnZSB0byAiCiAJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgotCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIsCisJCQkJCQlOSW5vQ29tcHJlc3NlZChuaSkgPworCQkJCQkJImNvbXByZXNzZWQiIDogInNwYXJzZSIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9Ci0JCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7Ci0JCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PSBBVF9EQVRBICYmCi0JCQkJCW5pLT5uYW1lX2xlbikpIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCi0JCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgZGF0YSAiCi0JCQkJCQkiYXR0cmlidXRlLiAgUGxlYXNlIHJlcG9ydCAiCi0JCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgotCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgewotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKLQkJCQkJCSJhdHRyaWJ1dGUgYnV0IGNvbXByZXNzaW9uIGlzICIKLQkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gY2x1c3RlciBzaXplICIKLQkJCQkJCSIoJWkpID4gNGtpQi4iLAotCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOwotCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQl9Ci0JCQlpZiAoKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCi0JCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgewotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKLQkJCQkJCSJjb21wcmVzc2lvbiBtZXRob2QuIik7Ci0JCQkJZ290byB1bm1fZXJyX291dDsKLQkJCX0KLQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQkJY29tcHJlc3Npb25fdW5pdDsKLQkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgIT0KLQkJCQkJNCkgeworCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQkJTklub1NldFNwYXJzZShuaSk7CisJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCAhPSA0KSB7CiAJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG5vbnN0YW5kYXJkICIKIAkJCQkJCSJjb21wcmVzc2lvbiB1bml0ICgldSBpbnN0ZWFkICIKIAkJCQkJCSJvZiA0KS4gIENhbm5vdCBoYW5kbGUgdGhpcy4iLAotCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgogCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CiAJCQkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCX0KKwkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdDsKIAkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUgPSAxVSA8PCAoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCWNvbXByZXNzaW9uX3VuaXQgKworCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICsKIAkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CiAJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplX2JpdHMgPSBmZnMoCi0JCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSkgLSAxOworCQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplKSAtIDE7CisJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2VkX3NpemUpOwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKLQkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCAiCi0JCQkJCQkiYW5kIGNvbXByZXNzZWQgZGF0YS4iKTsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKKwkJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgYW5kICIKKwkJCQkJCSJjb21wcmVzc2VkIGRhdGEuIik7CiAJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCX0KIAkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgewpAQCAtMTMxNywzNyArMTMzMCwxNyBAQAogCQkJfQogCQkJTklub1NldEVuY3J5cHRlZChuaSk7CiAJCX0KLQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgewotCQkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKSB7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgIgotCQkJCQkJImF0dHJpYnV0ZSBidXQgdGhlIGF0dHJpYnV0ZSAiCi0JCQkJCQkiaXMgc3BhcnNlLiAgUGxlYXNlIHJlcG9ydCAiCi0JCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgotCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJTklub1NldFNwYXJzZShuaSk7Ci0JCX0KLQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiBhdHRyaWJ1dGUgaGFzICIKIAkJCQkJIm5vbi16ZXJvIGxvd2VzdF92Y24uIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCS8qIFNldHVwIGFsbCB0aGUgc2l6ZXMuICovCi0JCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CiAJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CiAJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKLQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgewotCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQkJY29tcHJlc3NlZF9zaXplKTsKLQkJfQorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKIAl9Ci0KIAkvKiBTZXR1cCB0aGUgb3BlcmF0aW9ucyBmb3IgdGhpcyBhdHRyaWJ1dGUgaW5vZGUuICovCiAJdmktPmlfb3AgPSBOVUxMOwogCXZpLT5pX2ZvcCA9IE5VTEw7CkBAIC0xMzU1LDEyICsxMzQ4LDEwIEBACiAJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CiAJZWxzZQogCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX2FvcHM7Ci0KLQlpZiAoIU5Jbm9Db21wcmVzc2VkKG5pKSkKLQkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7Ci0JZWxzZQorCWlmIChOSW5vQ29tcHJlc3NlZChuaSkgfHwgTklub1NwYXJzZShuaSkpCiAJCXZpLT5pX2Jsb2NrcyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPj4gOTsKLQorCWVsc2UKKwkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhlIGJhc2UgaW5vZGUgZG9lc24ndCBnbyBhd2F5IGFuZCBhdHRhY2ggaXQgdG8gdGhlCiAJICogYXR0cmlidXRlIGlub2RlLgpAQCAtMTQyOSwxMCArMTQyMCwxMiBAQAogICovCiBzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBzdHJ1Y3QgaW5vZGUgKnZpKQogeworCWxvZmZfdCBidmlfc2l6ZTsKIAludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CiAJbnRmc19pbm9kZSAqbmksICpiYXNlX25pLCAqYm5pOwogCXN0cnVjdCBpbm9kZSAqYnZpOwogCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKIAlJTkRFWF9ST09UICppcjsKIAl1OCAqaXJfZW5kLCAqaW5kZXhfZW5kOwpAQCAtMTQ3NCwzMCArMTQ2NywyOCBAQAogCQkJCQkibWlzc2luZy4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9CisJYSA9IGN0eC0+YXR0cjsKIAkvKiBTZXQgdXAgdGhlIHN0YXRlLiAqLwotCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkpIHsKKwlpZiAodW5saWtlbHkoYS0+bm9uX3Jlc2lkZW50KSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgbm90IHJlc2lkZW50LiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KIAkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLwotCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCi0JCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KLQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC4KLQkJCXZhbHVlX29mZnNldCkpKSkgeworCWlmICh1bmxpa2VseShhLT5uYW1lX2xlbmd0aCAmJiAobGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpID49CisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpKSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgIgogCQkJCSJhZnRlciB0aGUgYXR0cmlidXRlIHZhbHVlLiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KIAkvKiBDb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UgaW5kZXggcm9vdCBpcyBub3QgYWxsb3dlZC4gKi8KLQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX0VOQ1JZUFRFRCB8CisJaWYgKGEtPmZsYWdzICYgKEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8IEFUVFJfSVNfRU5DUllQVEVEIHwKIAkJCUFUVFJfSVNfU1BBUlNFKSkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4ICIKIAkJCQkicm9vdCBhdHRyaWJ1dGUuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlyID0gKElOREVYX1JPT1QqKSgodTgqKWN0eC0+YXR0ciArCi0JCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7Ci0JaXJfZW5kID0gKHU4KilpciArIGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCWlyID0gKElOREVYX1JPT1QqKSgodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWlyX2VuZCA9ICh1OCopaXIgKyBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CiAJaWYgKGlyX2VuZCA+ICh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyBjb3JydXB0LiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwpAQCAtMTU3MCw3ICsxNTYxLDcgQEAKIAkJCQkJIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZS4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9Ci0JaWYgKCFjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCWlmICghYS0+bm9uX3Jlc2lkZW50KSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgogCQkJCSJyZXNpZGVudC4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKQEAgLTE1NzgsMzcgKzE1NjksMzYgQEAKIAkvKgogCSAqIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4KIAkgKi8KLQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJiAobGUxNl90b19jcHUoCi0JCQljdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PSBsZTE2X3RvX2NwdSgKLQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQorCQkJbGUxNl90b19jcHUoCisJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpKSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgbmFtZSBpcyAiCiAJCQkJInBsYWNlZCBhZnRlciB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9Ci0JaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgogCQkJCSJlbmNyeXB0ZWQuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzIHNwYXJzZS4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9Ci0JaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBpcyAiCiAJCQkJImNvbXByZXNzZWQuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICRJTkRFWF9BTExPQ0FUSU9OICIKIAkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyBsb3dlc3RfdmNuLiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KLQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CiAJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOwotCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKIAkvKgogCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICBPdGhlcndpc2UKIAkgKiB3ZSB3b3VsZCBkZWFkbG9jayBpbiBudGZzX2F0dHJfaWdldCgpLgpAQCAtMTYzMiwxMCArMTYyMiwxMCBAQAogCQlnb3RvIGlwdXRfdW5tX2Vycl9vdXQ7CiAJfQogCS8qIENvbnNpc3RlbmN5IGNoZWNrIGJpdG1hcCBzaXplIHZzLiBpbmRleCBhbGxvY2F0aW9uIHNpemUuICovCi0JaWYgKChidmktPmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+Ci0JCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzKSkgeworCWJ2aV9zaXplID0gaV9zaXplX3JlYWQoYnZpKTsKKwlpZiAoKGJ2aV9zaXplIDw8IDMpIDwgKHZpLT5pX3NpemUgPj4gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJpdG1hcCB0b28gc21hbGwgKDB4JWxseCkgZm9yICIKLQkJCQkiaW5kZXggYWxsb2NhdGlvbiAoMHglbGx4KS4iLCBidmktPmlfc2l6ZSA8PCAzLAorCQkJCSJpbmRleCBhbGxvY2F0aW9uICgweCVsbHgpLiIsIGJ2aV9zaXplIDw8IDMsCiAJCQkJdmktPmlfc2l6ZSk7CiAJCWdvdG8gaXB1dF91bm1fZXJyX291dDsKIAl9CkBAIC0xNjQ2LDcgKzE2MzYsNiBAQAogCXZpLT5pX2ZvcCA9IE5VTEw7CiAJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKIAl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKLQogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQogCSAqIGluZGV4IGlub2RlLgpAQCAtMTcxMiw3ICsxNzAxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCW50ZnNfaW5vZGUgKm5pOwogCU1GVF9SRUNPUkQgKm0gPSBOVUxMOwotCUFUVFJfUkVDT1JEICphdHRyOworCUFUVFJfUkVDT1JEICphOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAJdW5zaWduZWQgaW50IGksIG5yX2Jsb2NrczsKIAlpbnQgZXJyOwpAQCAtMTcyNywxMCArMTcxNiwxMCBAQAogCS8qIFNldHVwIHRoZSBkYXRhIGF0dHJpYnV0ZS4gSXQgaXMgc3BlY2lhbCBhcyBpdCBpcyBtc3QgcHJvdGVjdGVkLiAqLwogCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CiAJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJTklub1NldFNwYXJzZURpc2FibGVkKG5pKTsKIAluaS0+dHlwZSA9IEFUX0RBVEE7CiAJbmktPm5hbWUgPSBOVUxMOwogCW5pLT5uYW1lX2xlbiA9IDA7Ci0KIAkvKgogCSAqIFRoaXMgc2V0cyB1cCBvdXIgbGl0dGxlIGNoZWF0IGFsbG93aW5nIHVzIHRvIHJldXNlIHRoZSBhc3luYyByZWFkIGlvCiAJICogY29tcGxldGlvbiBoYW5kbGVyIGZvciBkaXJlY3Rvcmllcy4KQEAgLTE4MDgsOSArMTc5NywxMCBAQAogCiAJCW50ZnNfZGVidWcoIkF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBmb3VuZCBpbiAkTUZULiIpOwogCQlOSW5vU2V0QXR0ckxpc3QobmkpOwotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEIHx8Ci0JCQkJY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAotCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgeworCQlhID0gY3R4LT5hdHRyOworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkgewogCQkJbnRmc19lcnJvcihzYiwgIkF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBpcyAiCiAJCQkJCSJjb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UuIE5vdCAiCiAJCQkJCSJhbGxvd2VkLiAkTUZUIGlzIGNvcnJ1cHQuIFlvdSBzaG91bGQgIgpAQCAtMTgxOCwxNiArMTgwOCwxNiBAQAogCQkJZ290byBwdXRfZXJyX291dDsKIAkJfQogCQkvKiBOb3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIGxpc3QuICovCi0JCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKTsKKwkJbmktPmF0dHJfbGlzdF9zaXplID0gKHUzMiludGZzX2F0dHJfc2l6ZShhKTsKIAkJbmktPmF0dHJfbGlzdCA9IG50ZnNfbWFsbG9jX25vZnMobmktPmF0dHJfbGlzdF9zaXplKTsKIAkJaWYgKCFuaS0+YXR0cl9saXN0KSB7CiAJCQludGZzX2Vycm9yKHNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYnVmZmVyICIKIAkJCQkJImZvciBhdHRyaWJ1dGUgbGlzdC4iKTsKIAkJCWdvdG8gcHV0X2Vycl9vdXQ7CiAJCX0KLQkJaWYgKGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCWlmIChhLT5ub25fcmVzaWRlbnQpIHsKIAkJCU5Jbm9TZXRBdHRyTGlzdE5vblJlc2lkZW50KG5pKTsKLQkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CiAJCQkJbnRmc19lcnJvcihzYiwgIkF0dHJpYnV0ZSBsaXN0IGhhcyBub24gemVybyAiCiAJCQkJCQkibG93ZXN0X3Zjbi4gJE1GVCBpcyBjb3JydXB0LiAiCiAJCQkJCQkiWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOwpAQCAtMTgzNSw3ICsxODI1LDcgQEAKIAkJCX0KIAkJCS8qIFNldHVwIHRoZSBydW5saXN0LiAqLwogCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwKLQkJCQkJY3R4LT5hdHRyLCBOVUxMKTsKKwkJCQkJYSwgTlVMTCk7CiAJCQlpZiAoSVNfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKTsKIAkJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKQEAgLTE4NDcsNyArMTgzNyw3IEBACiAJCQkvKiBOb3cgbG9hZCB0aGUgYXR0cmlidXRlIGxpc3QuICovCiAJCQlpZiAoKGVyciA9IGxvYWRfYXR0cmlidXRlX2xpc3Qodm9sLCAmbmktPmF0dHJfbGlzdF9ybCwKIAkJCQkJbmktPmF0dHJfbGlzdCwgbmktPmF0dHJfbGlzdF9zaXplLAotCQkJCQlzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLgorCQkJCQlzbGU2NF90b19jcHUoYS0+ZGF0YS4KIAkJCQkJbm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpKSkpIHsKIAkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgYXR0cmlidXRlIGxpc3QgIgogCQkJCQkJImF0dHJpYnV0ZSB3aXRoIGVycm9yIGNvZGUgJWkuIiwKQEAgLTE4NTUsMjAgKzE4NDUsMjAgQEAKIAkJCQlnb3RvIHB1dF9lcnJfb3V0OwogCQkJfQogCQl9IGVsc2UgLyogaWYgKCFjdHguYXR0ci0+bm9uX3Jlc2lkZW50KSAqLyB7Ci0JCQlpZiAoKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJaWYgKCh1OCopYSArIGxlMTZfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKwogCQkJCQlsZTMyX3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPgorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPgogCQkJCQkodTgqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CiAJCQkJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgYXR0cmlidXRlIGxpc3QgIgogCQkJCQkJImF0dHJpYnV0ZS4iKTsKIAkJCQlnb3RvIHB1dF9lcnJfb3V0OwogCQkJfQogCQkJLyogTm93IGNvcHkgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLwotCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopYSArIGxlMTZfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCiAJCQkJCWxlMzJfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSk7CisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSk7CiAJCX0KIAkJLyogVGhlIGF0dHJpYnV0ZSBsaXN0IGlzIG5vdyBzZXR1cCBpbiBtZW1vcnkuICovCiAJCS8qCkBAIC0xOTM0LDI1ICsxOTI0LDI1IEBACiAJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CiAKIAkvKiBOb3cgbG9hZCBhbGwgYXR0cmlidXRlIGV4dGVudHMuICovCi0JYXR0ciA9IE5VTEw7CisJYSA9IE5VTEw7CiAJbmV4dF92Y24gPSBsYXN0X3ZjbiA9IGhpZ2hlc3RfdmNuID0gMDsKIAl3aGlsZSAoIShlcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0RBVEEsIE5VTEwsIDAsIDAsIG5leHRfdmNuLCBOVUxMLCAwLAogCQkJY3R4KSkpIHsKIAkJcnVubGlzdF9lbGVtZW50ICpucmw7CiAKIAkJLyogQ2FjaGUgdGhlIGN1cnJlbnQgYXR0cmlidXRlLiAqLwotCQlhdHRyID0gY3R4LT5hdHRyOworCQlhID0gY3R4LT5hdHRyOwogCQkvKiAkTUZUIG11c3QgYmUgbm9uLXJlc2lkZW50LiAqLwotCQlpZiAoIWF0dHItPm5vbl9yZXNpZGVudCkgeworCQlpZiAoIWEtPm5vbl9yZXNpZGVudCkgewogCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgbXVzdCBiZSBub24tcmVzaWRlbnQgYnV0IGEgIgogCQkJCQkicmVzaWRlbnQgZXh0ZW50IHdhcyBmb3VuZC4gJE1GVCBpcyAiCiAJCQkJCSJjb3JydXB0LiBSdW4gY2hrZHNrLiIpOwogCQkJZ290byBwdXRfZXJyX291dDsKIAkJfQogCQkvKiAkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkIGFuZCB1bmVuY3J5cHRlZC4gKi8KLQkJaWYgKGF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8Ci0JCQkJYXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAotCQkJCWF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKIAkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkLCAiCiAJCQkJCSJub24tc3BhcnNlLCBhbmQgdW5lbmNyeXB0ZWQgYnV0IGEgIgogCQkJCQkiY29tcHJlc3NlZC9zcGFyc2UvZW5jcnlwdGVkIGV4dGVudCAiCkBAIC0xOTY2LDcgKzE5NTYsNyBAQAogCQkgKiBhcyB3ZSBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGlub2RlIGF0IHRoaXMgdGltZSBhbmQgd2UKIAkJICogYXJlIGEgbW91bnQgaW4gcHJvZ3Jlc3MgdGFzaywgdG9vLgogCQkgKi8KLQkJbnJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3Modm9sLCBhdHRyLCBuaS0+cnVubGlzdC5ybCk7CisJCW5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwgYSwgbmktPnJ1bmxpc3QucmwpOwogCQlpZiAoSVNfRVJSKG5ybCkpIHsKIAkJCW50ZnNfZXJyb3Ioc2IsICJudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcygpICIKIAkJCQkJImZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWxkLiAgJE1GVCBpcyAiCkBAIC0xOTc3LDcgKzE5NjcsNyBAQAogCiAJCS8qIEFyZSB3ZSBpbiB0aGUgZmlyc3QgZXh0ZW50PyAqLwogCQlpZiAoIW5leHRfdmNuKSB7Ci0JCQlpZiAoYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJCQludGZzX2Vycm9yKHNiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKIAkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKIAkJCQkJCSJsb3dlc3RfdmNuLiAkTUZUIGlzIGNvcnJ1cHQuICIKQEAgLTE5ODYsMTUgKzE5NzYsMTUgQEAKIAkJCX0KIAkJCS8qIEdldCB0aGUgbGFzdCB2Y24gaW4gdGhlICREQVRBIGF0dHJpYnV0ZS4gKi8KIAkJCWxhc3RfdmNuID0gc2xlNjRfdG9fY3B1KAotCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSkKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpCiAJCQkJCT4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CiAJCQkvKiBGaWxsIGluIHRoZSBpbm9kZSBzaXplLiAqLwogCQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKLQkJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEuCi0JCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKIAkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJCQkvKgogCQkJICogVmVyaWZ5IHRoZSBudW1iZXIgb2YgbWZ0IHJlY29yZHMgZG9lcyBub3QgZXhjZWVkCiAJCQkgKiAyXjMyIC0gMS4KQEAgLTIwNTEsNyArMjA0MSw3IEBACiAJCX0KIAogCQkvKiBHZXQgdGhlIGxvd2VzdCB2Y24gZm9yIHRoZSBuZXh0IGV4dGVudC4gKi8KLQkJaGlnaGVzdF92Y24gPSBzbGU2NF90b19jcHUoYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24pOworCQloaWdoZXN0X3ZjbiA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3Zjbik7CiAJCW5leHRfdmNuID0gaGlnaGVzdF92Y24gKyAxOwogCiAJCS8qIE9ubHkgb25lIGV4dGVudCBvciBlcnJvciwgd2hpY2ggd2UgY2F0Y2ggYmVsb3cuICovCkBAIC0yMDYwLDcgKzIwNTAsNyBAQAogCiAJCS8qIEF2b2lkIGVuZGxlc3MgbG9vcHMgZHVlIHRvIGNvcnJ1cHRpb24uICovCiAJCWlmIChuZXh0X3ZjbiA8IHNsZTY0X3RvX2NwdSgKLQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSkgeworCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pKSB7CiAJCQludGZzX2Vycm9yKHNiLCAiJE1GVCBoYXMgY29ycnVwdCBhdHRyaWJ1dGUgbGlzdCAiCiAJCQkJCSJhdHRyaWJ1dGUuIFJ1biBjaGtkc2suIik7CiAJCQlnb3RvIHB1dF9lcnJfb3V0OwpAQCAtMjA3MSw3ICsyMDYxLDcgQEAKIAkJCQkiJE1GVCBpcyBjb3JydXB0LiBSdW4gY2hrZHNrLiIpOwogCQlnb3RvIHB1dF9lcnJfb3V0OwogCX0KLQlpZiAoIWF0dHIpIHsKKwlpZiAoIWEpIHsKIAkJbnRmc19lcnJvcihzYiwgIiRNRlQvJERBVEEgYXR0cmlidXRlIG5vdCBmb3VuZC4gJE1GVCBpcyAiCiAJCQkJImNvcnJ1cHQuIFJ1biBjaGtkc2suIik7CiAJCWdvdG8gcHV0X2Vycl9vdXQ7CkBAIC0yMjc1LDYgKzIyNjUsOCBAQAogCQlzZXFfcHJpbnRmKHNmLCAiLGNhc2Vfc2Vuc2l0aXZlIik7CiAJaWYgKE5Wb2xTaG93U3lzdGVtRmlsZXModm9sKSkKIAkJc2VxX3ByaW50ZihzZiwgIixzaG93X3N5c19maWxlcyIpOworCWlmICghTlZvbFNwYXJzZUVuYWJsZWQodm9sKSkKKwkJc2VxX3ByaW50ZihzZiwgIixkaXNhYmxlX3NwYXJzZSIpOwogCWZvciAoaSA9IDA7IG9uX2Vycm9yc19hcnJbaV0udmFsOyBpKyspIHsKIAkJaWYgKG9uX2Vycm9yc19hcnJbaV0udmFsICYgdm9sLT5vbl9lcnJvcnMpCiAJCQlzZXFfcHJpbnRmKHNmLCAiLGVycm9ycz0lcyIsIG9uX2Vycm9yc19hcnJbaV0uc3RyKTsKQEAgLTIzMTEsNiArMjMwMyw3IEBACiAJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKIAlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOwogCWNvbnN0IGNoYXIgKnRlID0gIiAgTGVhdmluZyBmaWxlIGxlbmd0aCBvdXQgb2Ygc3luYyB3aXRoIGlfc2l6ZS4iOwogCWludCBlcnI7CiAKQEAgLTIzNDcsMTQgKzIzNDAsMTUgQEAKIAkJCQkJdmktPmlfaW5vLCBlcnIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQorCWEgPSBjdHgtPmF0dHI7CiAJLyogSWYgdGhlIHNpemUgaGFzIG5vdCBjaGFuZ2VkIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCi0JaWYgKG50ZnNfYXR0cl9zaXplKGN0eC0+YXR0cikgPT0gaV9zaXplX3JlYWQodmkpKQorCWlmIChudGZzX2F0dHJfc2l6ZShhKSA9PSBpX3NpemVfcmVhZCh2aSkpCiAJCWdvdG8gZG9uZTsKIAkvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIHRydW5jYXRlLi4uCiAJbnRmc19lcnJvcih2aS0+aV9zYiwgIklub2RlIHNpemUgaGFzIGNoYW5nZWQgYnV0IHRoaXMgaXMgbm90ICIKIAkJCSJpbXBsZW1lbnRlZCB5ZXQuICBSZXNldHRpbmcgaW5vZGUgc2l6ZSB0byBvbGQgdmFsdWUuICIKIAkJCSIgVGhpcyBpcyBtb3N0IGxpa2VseSBhIGJ1ZyBpbiB0aGUgbnRmcyBkcml2ZXIhIik7Ci0JaV9zaXplX3dyaXRlKHZpLCBudGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpKTsgCisJaV9zaXplX3dyaXRlKHZpLCBudGZzX2F0dHJfc2l6ZShhKSk7IAogZG9uZToKIAludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKIAl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKQEAgLTI1MTUsMTggKzI1MDksMTggQEAKIAludCA9IHV0YzJudGZzKHZpLT5pX210aW1lKTsKIAlpZiAoc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSAhPSBudCkgewogCQludGZzX2RlYnVnKCJVcGRhdGluZyBtdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgotCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJIm5ldyA9IDB4JWxseCIsIHZpLT5pX2lubywgKGxvbmcgbG9uZykKIAkJCQlzbGU2NF90b19jcHUoc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSksCi0JCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUobnQpKTsKIAkJc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSA9IG50OwogCQltb2RpZmllZCA9IFRSVUU7CiAJfQogCW50ID0gdXRjMm50ZnModmktPmlfY3RpbWUpOwogCWlmIChzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUgIT0gbnQpIHsKIAkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgY3RpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKLQkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sIChsb25nIGxvbmcpCiAJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSksCi0JCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUobnQpKTsKIAkJc2ktPmxhc3RfbWZ0X2NoYW5nZV90aW1lID0gbnQ7CiAJCW1vZGlmaWVkID0gVFJVRTsKIAl9CkBAIC0yNTM0LDggKzI1MjgsOCBAQAogCWlmIChzaS0+bGFzdF9hY2Nlc3NfdGltZSAhPSBudCkgewogCQludGZzX2RlYnVnKCJVcGRhdGluZyBhdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgogCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCi0JCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2FjY2Vzc190aW1lKSwKLQkJCQlzbGU2NF90b19jcHUobnQpKTsKKwkJCQkobG9uZyBsb25nKXNsZTY0X3RvX2NwdShzaS0+bGFzdF9hY2Nlc3NfdGltZSksCisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUobnQpKTsKIAkJc2ktPmxhc3RfYWNjZXNzX3RpbWUgPSBudDsKIAkJbW9kaWZpZWQgPSBUUlVFOwogCX0KZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5vZGUuaCBiL2ZzL250ZnMvaW5vZGUuaAppbmRleCA5OTU4MDQ1Li4zZGU1YzAyIDEwMDY0NAotLS0gYS9mcy9udGZzL2lub2RlLmgKKysrIGIvZnMvbnRmcy9pbm9kZS5oCkBAIC0yLDcgKzIsNyBAQAogICogaW5vZGUuaCAtIERlZmluZXMgZm9yIGlub2RlIHN0cnVjdHVyZXMgTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCiAgKgkgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00NCw2ICs0NCw3IEBACiAgKiBmaWVsZHMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgVkZTIGlub2RlLgogICovCiBzdHJ1Y3QgX250ZnNfaW5vZGUgeworCXJ3bG9ja190IHNpemVfbG9jazsJLyogTG9jayBzZXJpYWxpemluZyBhY2Nlc3MgdG8gaW5vZGUgc2l6ZXMuICovCiAJczY0IGluaXRpYWxpemVkX3NpemU7CS8qIENvcHkgZnJvbSB0aGUgYXR0cmlidXRlIHJlY29yZC4gKi8KIAlzNjQgYWxsb2NhdGVkX3NpemU7CS8qIENvcHkgZnJvbSB0aGUgYXR0cmlidXRlIHJlY29yZC4gKi8KIAl1bnNpZ25lZCBsb25nIHN0YXRlOwkvKiBOVEZTIHNwZWNpZmljIGZsYWdzIGRlc2NyaWJpbmcgdGhpcyBpbm9kZS4KQEAgLTEwOSw3ICsxMTAsNyBAQAogCQkJdTggYmxvY2tfc2l6ZV9iaXRzOyAJLyogTG9nMiBvZiB0aGUgYWJvdmUuICovCiAJCQl1OCB2Y25fc2l6ZV9iaXRzOwkvKiBMb2cyIG9mIHRoZSBhYm92ZS4gKi8KIAkJfSBpbmRleDsKLQkJc3RydWN0IHsgLyogSXQgaXMgYSBjb21wcmVzc2VkIGZpbGUgb3IgYW4gYXR0cmlidXRlIGlub2RlLiAqLworCQlzdHJ1Y3QgeyAvKiBJdCBpcyBhIGNvbXByZXNzZWQvc3BhcnNlIGZpbGUvYXR0cmlidXRlIGlub2RlLiAqLwogCQkJczY0IHNpemU7CQkvKiBDb3B5IG9mIGNvbXByZXNzZWRfc2l6ZSBmcm9tCiAJCQkJCQkgICAkREFUQS4gKi8KIAkJCXUzMiBibG9ja19zaXplOwkJLyogU2l6ZSBvZiBhIGNvbXByZXNzaW9uIGJsb2NrCkBAIC0xNjUsNiArMTY2LDcgQEAKIAlOSV9TcGFyc2UsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBzcGFyc2UgKGYpLgogCQkJCSAgIDE6IENyZWF0ZSBzcGFyc2UgZmlsZXMgYnkgZGVmYXVsdCAoZCkuCiAJCQkJICAgMTogQXR0cmlidXRlIGlzIHNwYXJzZSAoYSkuICovCisJTklfU3BhcnNlRGlzYWJsZWQsCS8qIDE6IE1heSBub3QgY3JlYXRlIHNwYXJzZSByZWdpb25zLiAqLwogCU5JX1RydW5jYXRlRmFpbGVkLAkvKiAxOiBMYXN0IG50ZnNfdHJ1bmNhdGUoKSBjYWxsIGZhaWxlZC4gKi8KIH0gbnRmc19pbm9kZV9zdGF0ZV9iaXRzOwogCkBAIC0yMTcsNiArMjE5LDcgQEAKIE5JTk9fRk5TKENvbXByZXNzZWQpCiBOSU5PX0ZOUyhFbmNyeXB0ZWQpCiBOSU5PX0ZOUyhTcGFyc2UpCitOSU5PX0ZOUyhTcGFyc2VEaXNhYmxlZCkKIE5JTk9fRk5TKFRydW5jYXRlRmFpbGVkKQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sYXlvdXQuaCBiL2ZzL250ZnMvbGF5b3V0LmgKaW5kZXggNDdiMzM4OS4uNjA5YWQxNyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9sYXlvdXQuaAorKysgYi9mcy9udGZzL2xheW91dC5oCkBAIC0yLDcgKzIsNyBAQAogICogbGF5b3V0LmggLSBBbGwgTlRGUyBhc3NvY2lhdGVkIG9uLWRpc2sgc3RydWN0dXJlcy4gUGFydCBvZiB0aGUgTGludXgtTlRGUwogICoJICAgICAgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTU0NywyNiArNTQ3LDQ0IEBACiAJQ09MTEFUSU9OX05UT0ZTX1VMT05HCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTApLAogCUNPTExBVElPTl9OVE9GU19TSUQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMSksCiAJQ09MTEFUSU9OX05UT0ZTX1NFQ1VSSVRZX0hBU0gJPSBjb25zdF9jcHVfdG9fbGUzMigweDEyKSwKLQlDT0xMQVRJT05fTlRPRlNfVUxPTkdTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTMpCisJQ09MTEFUSU9OX05UT0ZTX1VMT05HUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDEzKSwKIH07CiAKIHR5cGVkZWYgbGUzMiBDT0xMQVRJT05fUlVMRTsKIAogLyoKICAqIFRoZSBmbGFncyAoMzItYml0KSBkZXNjcmliaW5nIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIGluIHRoZSBhdHRyaWJ1dGUKLSAqIGRlZmluaXRpb24gc3RydWN0dXJlLiAgRklYTUU6IFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSBSZWdpcydzIGluZm9ybWF0aW9uCi0gKiBhbmQsIGFjY29yZGluZyB0byBoaW0sIGl0IGlzIG5vdCBjZXJ0YWluIGFuZCBwcm9iYWJseSBpbmNvbXBsZXRlLgotICogVGhlIElOREVYQUJMRSBmbGFnIGlzIGZhaXJseSBjZXJ0YWlubHkgY29ycmVjdCBhcyBvbmx5IHRoZSBmaWxlIG5hbWUKLSAqIGF0dHJpYnV0ZSBoYXMgdGhpcyBmbGFnIHNldCBhbmQgdGhpcyBpcyB0aGUgb25seSBhdHRyaWJ1dGUgaW5kZXhlZCBpbiBOVDQuCisgKiBkZWZpbml0aW9uIHN0cnVjdHVyZS4gIEZJWE1FOiBUaGlzIGluZm9ybWF0aW9uIGlzIGJhc2VkIG9uIFJlZ2lzJ3MKKyAqIGluZm9ybWF0aW9uIGFuZCwgYWNjb3JkaW5nIHRvIGhpbSwgaXQgaXMgbm90IGNlcnRhaW4gYW5kIHByb2JhYmx5CisgKiBpbmNvbXBsZXRlLiAgVGhlIElOREVYQUJMRSBmbGFnIGlzIGZhaXJseSBjZXJ0YWlubHkgY29ycmVjdCBhcyBvbmx5IHRoZSBmaWxlCisgKiBuYW1lIGF0dHJpYnV0ZSBoYXMgdGhpcyBmbGFnIHNldCBhbmQgdGhpcyBpcyB0aGUgb25seSBhdHRyaWJ1dGUgaW5kZXhlZCBpbgorICogTlQ0LgogICovCiBlbnVtIHsKLQlJTkRFWEFCTEUJICAgID0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMiksIC8qIEF0dHJpYnV0ZSBjYW4gYmUKLQkJCQkJCQkgIGluZGV4ZWQuICovCi0JTkVFRF9UT19SRUdFTkVSQVRFICA9IGNvbnN0X2NwdV90b19sZTMyKDB4NDApLCAvKiBOZWVkIHRvIHJlZ2VuZXJhdGUKLQkJCQkJCQkgIGR1cmluZyByZWdlbmVyYXRpb24KLQkJCQkJCQkgIHBoYXNlLiAqLwotCUNBTl9CRV9OT05fUkVTSURFTlQgPSBjb25zdF9jcHVfdG9fbGUzMigweDgwKSwgLyogQXR0cmlidXRlIGNhbiBiZQotCQkJCQkJCSAgbm9uLXJlc2lkZW50LiAqLworCUFUVFJfREVGX0lOREVYQUJMRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDIpLCAvKiBBdHRyaWJ1dGUgY2FuIGJlCisJCQkJCWluZGV4ZWQuICovCisJQVRUUl9ERUZfTVVMVElQTEUJPSBjb25zdF9jcHVfdG9fbGUzMigweDA0KSwgLyogQXR0cmlidXRlIHR5cGUKKwkJCQkJY2FuIGJlIHByZXNlbnQgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisJCQkJCW1mdCByZWNvcmRzIG9mIGFuIGlub2RlLiAqLworCUFUVFJfREVGX05PVF9aRVJPCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwOCksIC8qIEF0dHJpYnV0ZSB2YWx1ZQorCQkJCQltdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi16ZXJvCisJCQkJCWJ5dGUuICovCisJQVRUUl9ERUZfSU5ERVhFRF9VTklRVUUJPSBjb25zdF9jcHVfdG9fbGUzMigweDEwKSwgLyogQXR0cmlidXRlIG11c3QgYmUKKwkJCQkJaW5kZXhlZCBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlCisJCQkJCXVuaXF1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlIGluIGFsbCBvZgorCQkJCQl0aGUgbWZ0IHJlY29yZHMgb2YgYW4gaW5vZGUuICovCisJQVRUUl9ERUZfTkFNRURfVU5JUVVFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgyMCksIC8qIEF0dHJpYnV0ZSBtdXN0IGJlCisJCQkJCW5hbWVkIGFuZCB0aGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBmb3IKKwkJCQkJdGhlIGF0dHJpYnV0ZSB0eXBlIGluIGFsbCBvZiB0aGUgbWZ0CisJCQkJCXJlY29yZHMgb2YgYW4gaW5vZGUuICovCisJQVRUUl9ERUZfUkVTSURFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDQwKSwgLyogQXR0cmlidXRlIG11c3QgYmUKKwkJCQkJcmVzaWRlbnQuICovCisJQVRUUl9ERUZfQUxXQVlTX0xPRwk9IGNvbnN0X2NwdV90b19sZTMyKDB4ODApLCAvKiBBbHdheXMgbG9nCisJCQkJCW1vZGlmaWNhdGlvbnMgdG8gdGhpcyBhdHRyaWJ1dGUsCisJCQkJCXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyByZXNpZGVudCBvcgorCQkJCQlub24tcmVzaWRlbnQuICBXaXRob3V0IHRoaXMsIG9ubHkgbG9nCisJCQkJCW1vZGlmaWNhdGlvbnMgaWYgdGhlIGF0dHJpYnV0ZSBpcworCQkJCQlyZXNpZGVudC4gKi8KIH07CiAKIHR5cGVkZWYgbGUzMiBBVFRSX0RFRl9GTEFHUzsKQEAgLTc0OSwxMCArNzY3LDExIEBACiAJCQkJcmVjb3JkIGhlYWRlciBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KIC8qIDM0Ki8JCQl1OCBjb21wcmVzc2lvbl91bml0OyAvKiBUaGUgY29tcHJlc3Npb24gdW5pdCBleHByZXNzZWQKIAkJCQlhcyB0aGUgbG9nIHRvIHRoZSBiYXNlIDIgb2YgdGhlIG51bWJlciBvZgotCQkJCWNsdXN0ZXJzIGluIGEgY29tcHJlc3Npb24gdW5pdC4gMCBtZWFucyBub3QKLQkJCQljb21wcmVzc2VkLiAoVGhpcyBlZmZlY3RpdmVseSBsaW1pdHMgdGhlCisJCQkJY2x1c3RlcnMgaW4gYSBjb21wcmVzc2lvbiB1bml0LiAgMCBtZWFucyBub3QKKwkJCQljb21wcmVzc2VkLiAgKFRoaXMgZWZmZWN0aXZlbHkgbGltaXRzIHRoZQogCQkJCWNvbXByZXNzaW9uIHVuaXQgc2l6ZSB0byBiZSBhIHBvd2VyIG9mIHR3bwotCQkJCWNsdXN0ZXJzLikgV2luTlQ0IG9ubHkgdXNlcyBhIHZhbHVlIG9mIDQuICovCisJCQkJY2x1c3RlcnMuKSAgV2luTlQ0IG9ubHkgdXNlcyBhIHZhbHVlIG9mIDQuCisJCQkJU3BhcnNlIGZpbGVzIGFsc28gaGF2ZSB0aGlzIHNldCB0byA0LiAqLwogLyogMzUqLwkJCXU4IHJlc2VydmVkWzVdOwkJLyogQWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLwogLyogVGhlIHNpemVzIGJlbG93IGFyZSBvbmx5IHVzZWQgd2hlbiBsb3dlc3RfdmNuIGlzIHplcm8sIGFzIG90aGVyd2lzZSBpdCB3b3VsZAogICAgYmUgZGlmZmljdWx0IHRvIGtlZXAgdGhlbSB1cC10by1kYXRlLiovCkBAIC03NzIsMTAgKzc5MSwxMCBAQAogCQkJCWRhdGFfc2l6ZS4gKi8KIC8qIHNpemVvZih1bmNvbXByZXNzZWQgYXR0cikgPSA2NCovCiAvKiA2NCovCQkJc2xlNjQgY29tcHJlc3NlZF9zaXplOwkvKiBCeXRlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZQotCQkJCXZhbHVlIGFmdGVyIGNvbXByZXNzaW9uLiBPbmx5IHByZXNlbnQgd2hlbgotCQkJCWNvbXByZXNzZWQuIEFsd2F5cyBpcyBhIG11bHRpcGxlIG9mIHRoZQotCQkJCWNsdXN0ZXIgc2l6ZS4gUmVwcmVzZW50cyB0aGUgYWN0dWFsIGFtb3VudCBvZgotCQkJCWRpc2sgc3BhY2UgYmVpbmcgdXNlZCBvbiB0aGUgZGlzay4gKi8KKwkJCQl2YWx1ZSBhZnRlciBjb21wcmVzc2lvbi4gIE9ubHkgcHJlc2VudCB3aGVuCisJCQkJY29tcHJlc3NlZCBvciBzcGFyc2UuICBBbHdheXMgaXMgYSBtdWx0aXBsZSBvZgorCQkJCXRoZSBjbHVzdGVyIHNpemUuICBSZXByZXNlbnRzIHRoZSBhY3R1YWwgYW1vdW50CisJCQkJb2YgZGlzayBzcGFjZSBiZWluZyB1c2VkIG9uIHRoZSBkaXNrLiAqLwogLyogc2l6ZW9mKGNvbXByZXNzZWQgYXR0cikgPSA3MiovCiAJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBub25fcmVzaWRlbnQ7CiAJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7CkBAIC04MzQsNyArODUzLDcgQEAKIAkvKiBOb3RlLCB0aGlzIGlzIGEgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgZnJvbSB0aGUgbWZ0IHJlY29yZCwKIAkgICB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBhIHZpZXcgaW5kZXggcHJlc2VudCAoZWcuIG9iamVjdCBpZAogCSAgIGluZGV4LCBxdW90YSBpbmRleCwgb25lIG9mIHRoZSBzZWN1cml0eSBpbmRleGVzIG9yIHRoZSBlbmNyeXB0aW5nCi0JICAgZmlsZSBzeXN0ZW0gcmVsYXRlZCBpbmRleGVzKS4gKi8KKwkgICBmaWxlc3lzdGVtIHJlbGF0ZWQgaW5kZXhlcykuICovCiB9OwogCiB0eXBlZGVmIGxlMzIgRklMRV9BVFRSX0ZMQUdTOwpAQCAtOTE3LDIwICs5MzYsMTIgQEAKIAkJLyogNTYqLwlsZTY0IHF1b3RhX2NoYXJnZWQ7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgY2hhcmdlIHRvCiAJCQkJdGhlIHF1b3RhIGZvciBhbGwgc3RyZWFtcyBvZiB0aGUgZmlsZS4gTm90ZTogSXMKIAkJCQl6ZXJvIGlmIHF1b3RhcyBhcmUgZGlzYWJsZWQuICovCi0JCS8qIDY0Ki8JbGU2NCB1c247CQkvKiBMYXN0IHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIKLQkJCQlvZiB0aGUgZmlsZS4gVGhpcyBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIHRoZQotCQkJCWNoYW5nZSAoYWthIHVzbikgam91cm5hbCBmaWxlLiBJdCBpcyB6ZXJvIGlmCi0JCQkJdGhlIHVzbiBqb3VybmFsIGlzIGRpc2FibGVkLgotCQkJCU5PVEU6IFRvIGRpc2FibGUgdGhlIGpvdXJuYWwgbmVlZCB0byBkZWxldGUKLQkJCQl0aGUgam91cm5hbCBmaWxlIGl0c2VsZiBhbmQgdG8gdGhlbiB3YWxrIHRoZQotCQkJCXdob2xlIG1mdCBhbmQgc2V0IGFsbCBVc24gZW50cmllcyBpbiBhbGwgbWZ0Ci0JCQkJcmVjb3JkcyB0byB6ZXJvISAoVGhpcyBjYW4gdGFrZSBhIHdoaWxlISkKLQkJCQlUaGUgam91cm5hbCBpcyBGSUxFX0V4dGVuZC8kVXNuSnJubC4gV2luMmsKLQkJCQl3aWxsIHJlY3JlYXRlIHRoZSBqb3VybmFsIGFuZCBpbml0aWF0ZQotCQkJCWxvZ2dpbmcgaWYgbmVjZXNzYXJ5IHdoZW4gbW91bnRpbmcgdGhlCi0JCQkJcGFydGl0aW9uLiBUaGlzLCBpbiBjb250cmFzdCB0byBkaXNhYmxpbmcgdGhlCi0JCQkJam91cm5hbCBpcyBhIHZlcnkgZmFzdCBwcm9jZXNzLCBzbyB0aGUgdXNlcgotCQkJCXdvbid0IGV2ZW4gbm90aWNlIGl0LiAqLworCQkvKiA2NCovCWxlVVNOIHVzbjsJCS8qIExhc3QgdXBkYXRlIHNlcXVlbmNlIG51bWJlcgorCQkJCW9mIHRoZSBmaWxlLiAgVGhpcyBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIHRoZQorCQkJCXRyYW5zYWN0aW9uIGxvZyBmaWxlICgkVXNuSnJubCkuICBJdCBpcyB6ZXJvIGlmCisJCQkJdGhlIHVzbiBqb3VybmFsIGlzIGRpc2FibGVkIG9yIHRoaXMgZmlsZSBoYXMKKwkJCQlub3QgYmVlbiBzdWJqZWN0IHRvIGxvZ2dpbmcgeWV0LiAgU2VlIHVzbmpybmwuaAorCQkJCWZvciBkZXRhaWxzLiAqLwogCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdjM7CiAJLyogc2l6ZW9mKCkgPSA3MiBieXRlcyAoTlRGUyAzLngpICovCiAJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZlcjsKQEAgLTE4OTMsNyArMTkwNCw3IEBACiAJVk9MVU1FX0ZMQUdTX01BU0sJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDNmKSwKIAogCS8qIFRvIG1ha2Ugb3VyIGxpZmUgZWFzaWVyIHdoZW4gY2hlY2tpbmcgaWYgd2UgbXVzdCBtb3VudCByZWFkLW9ubHkuICovCi0JVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSwk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAzNyksCisJVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSwk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAyNyksCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHR5cGVkZWYgbGUxNiBWT0xVTUVfRkxBR1M7CmRpZmYgLS1naXQgYS9mcy9udGZzL2xjbmFsbG9jLmMgYi9mcy9udGZzL2xjbmFsbG9jLmMKaW5kZXggMjNmZDkxMS4uYTRiYzA3NiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9sY25hbGxvYy5jCisrKyBiL2ZzL250ZnMvbGNuYWxsb2MuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsY25hbGxvYy5jIC0gQ2x1c3RlciAoZGUpYWxsb2NhdGlvbiBjb2RlLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTYwLDcgKzYwLDcgQEAKIAkJaWYgKHJsLT5sY24gPCAwKQogCQkJY29udGludWU7CiAJCWVyciA9IG50ZnNfYml0bWFwX2NsZWFyX3J1bihsY25ibXBfdmksIHJsLT5sY24sIHJsLT5sZW5ndGgpOwotCQlpZiAodW5saWtlbHkoZXJyICYmICghcmV0IHx8IHJldCA9PSBFTk9NRU0pICYmIHJldCAhPSBlcnIpKQorCQlpZiAodW5saWtlbHkoZXJyICYmICghcmV0IHx8IHJldCA9PSAtRU5PTUVNKSAmJiByZXQgIT0gZXJyKSkKIAkJCXJldCA9IGVycjsKIAl9CiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKQEAgLTE0MCw2ICsxNDAsNyBAQAogCUxDTiB6b25lX3N0YXJ0LCB6b25lX2VuZCwgYm1wX3BvcywgYm1wX2luaXRpYWxfcG9zLCBsYXN0X3JlYWRfcG9zLCBsY247CiAJTENOIHByZXZfbGNuID0gMCwgcHJldl9ydW5fbGVuID0gMCwgbWZ0X3pvbmVfc2l6ZTsKIAlzNjQgY2x1c3RlcnM7CisJbG9mZl90IGlfc2l6ZTsKIAlzdHJ1Y3QgaW5vZGUgKmxjbmJtcF92aTsKIAlydW5saXN0X2VsZW1lbnQgKnJsID0gTlVMTDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKQEAgLTI0OSw2ICsyNTAsNyBAQAogCWNsdXN0ZXJzID0gY291bnQ7CiAJcmxwb3MgPSBybHNpemUgPSAwOwogCW1hcHBpbmcgPSBsY25ibXBfdmktPmlfbWFwcGluZzsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChsY25ibXBfdmkpOwogCXdoaWxlICgxKSB7CiAJCW50ZnNfZGVidWcoIlN0YXJ0IG9mIG91dGVyIHdoaWxlIGxvb3A6IGRvbmVfem9uZXMgMHgleCwgIgogCQkJCSJzZWFyY2hfem9uZSAlaSwgcGFzcyAlaSwgem9uZV9zdGFydCAweCVsbHgsICIKQEAgLTI2Myw3ICsyNjUsNyBAQAogCQlsYXN0X3JlYWRfcG9zID0gYm1wX3BvcyA+PiAzOwogCQludGZzX2RlYnVnKCJsYXN0X3JlYWRfcG9zIDB4JWxseC4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9yZWFkX3Bvcyk7Ci0JCWlmIChsYXN0X3JlYWRfcG9zID4gbGNuYm1wX3ZpLT5pX3NpemUpIHsKKwkJaWYgKGxhc3RfcmVhZF9wb3MgPiBpX3NpemUpIHsKIAkJCW50ZnNfZGVidWcoIkVuZCBvZiBhdHRyaWJ1dGUgcmVhY2hlZC4gICIKIAkJCQkJIlNraXBwaW5nIHRvIHpvbmVfcGFzc19kb25lLiIpOwogCQkJZ290byB6b25lX3Bhc3NfZG9uZTsKQEAgLTI4NywxMSArMjg5LDExIEBACiAJCWJ1Zl9zaXplID0gbGFzdF9yZWFkX3BvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIGJ1Zl9zaXplOwogCQlidWZfc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIGJ1Zl9zaXplOwotCQlpZiAodW5saWtlbHkobGFzdF9yZWFkX3BvcyArIGJ1Zl9zaXplID4gbGNuYm1wX3ZpLT5pX3NpemUpKQotCQkJYnVmX3NpemUgPSBsY25ibXBfdmktPmlfc2l6ZSAtIGxhc3RfcmVhZF9wb3M7CisJCWlmICh1bmxpa2VseShsYXN0X3JlYWRfcG9zICsgYnVmX3NpemUgPiBpX3NpemUpKQorCQkJYnVmX3NpemUgPSBpX3NpemUgLSBsYXN0X3JlYWRfcG9zOwogCQlidWZfc2l6ZSA8PD0gMzsKIAkJbGNuID0gYm1wX3BvcyAmIDc7Ci0JCWJtcF9wb3MgJj0gfjc7CisJCWJtcF9wb3MgJj0gfihMQ04pNzsKIAkJbnRmc19kZWJ1ZygiQmVmb3JlIGlubmVyIHdoaWxlIGxvb3A6IGJ1Zl9zaXplICVpLCBsY24gMHglbGx4LCAiCiAJCQkJImJtcF9wb3MgMHglbGx4LCBuZWVkX3dyaXRlYmFjayAlaS4iLCBidWZfc2l6ZSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKQEAgLTMwOSw3ICszMTEsNyBAQAogCQkJCQkodW5zaWduZWQgaW50KSpieXRlKTsKIAkJCS8qIFNraXAgZnVsbCBieXRlcy4gKi8KIAkJCWlmICgqYnl0ZSA9PSAweGZmKSB7Ci0JCQkJbGNuID0gKGxjbiArIDgpICYgfjc7CisJCQkJbGNuID0gKGxjbiArIDgpICYgfihMQ04pNzsKIAkJCQludGZzX2RlYnVnKCJDb250aW51aW5nIHdoaWxlIGxvb3AgMS4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTY5MSw3ICs2OTMsNyBAQAogCQlpZiAoem9uZSA9PSBNRlRfWk9ORSB8fCBtZnRfem9uZV9zaXplIDw9IDApIHsKIAkJCW50ZnNfZGVidWcoIk5vIGZyZWUgY2x1c3RlcnMgbGVmdCwgZ29pbmcgdG8gb3V0LiIpOwogCQkJLyogUmVhbGx5IG5vIG1vcmUgc3BhY2UgbGVmdCBvbiBkZXZpY2UuICovCi0JCQllcnIgPSBFTk9TUEM7CisJCQllcnIgPSAtRU5PU1BDOwogCQkJZ290byBvdXQ7CiAJCX0gLyogem9uZSA9PSBEQVRBX1pPTkUgJiYgbWZ0X3pvbmVfc2l6ZSA+IDAgKi8KIAkJbnRmc19kZWJ1ZygiU2hyaW5raW5nIG1mdCB6b25lLiIpOwpAQCAtNzU1LDEzICs3NTcsMTMgQEAKIAlpZiAocmwpIHsKIAkJaW50IGVycjI7CiAKLQkJaWYgKGVyciA9PSBFTk9TUEMpCisJCWlmIChlcnIgPT0gLUVOT1NQQykKIAkJCW50ZnNfZGVidWcoIk5vdCBlbm91Z2ggc3BhY2UgdG8gY29tcGxldGUgYWxsb2NhdGlvbiwgIgotCQkJCQkiZXJyIEVOT1NQQywgZmlyc3QgZnJlZSBsY24gMHglbGx4LCAiCisJCQkJCSJlcnIgLUVOT1NQQywgZmlyc3QgZnJlZSBsY24gMHglbGx4LCAiCiAJCQkJCSJjb3VsZCBhbGxvY2F0ZSB1cCB0byAweCVsbHggIgogCQkJCQkiY2x1c3RlcnMuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylybFswXS5sY24sCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY291bnQgLSBjbHVzdGVycyk7CisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKGNvdW50IC0gY2x1c3RlcnMpKTsKIAkJLyogRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIGNsdXN0ZXJzLiAqLwogCQludGZzX2RlYnVnKCJBdHRlbXB0aW5nIHJvbGxiYWNrLi4uIik7CiAJCWVycjIgPSBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayh2b2wsIHJsKTsKQEAgLTc3MywxMCArNzc1LDEwIEBACiAJCX0KIAkJLyogRnJlZSB0aGUgcnVubGlzdC4gKi8KIAkJbnRmc19mcmVlKHJsKTsKLQl9IGVsc2UgaWYgKGVyciA9PSBFTk9TUEMpCi0JCW50ZnNfZGVidWcoIk5vIHNwYWNlIGxlZnQgYXQgYWxsLCBlcnIgPSBFTk9TUEMsICIKLQkJCQkiZmlyc3QgZnJlZSBsY24gPSAweCVsbHguIiwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCX0gZWxzZSBpZiAoZXJyID09IC1FTk9TUEMpCisJCW50ZnNfZGVidWcoIk5vIHNwYWNlIGxlZnQgYXQgYWxsLCBlcnIgPSAtRU5PU1BDLCBmaXJzdCBmcmVlICIKKwkJCQkibGNuID0gMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyl2b2wtPmRhdGExX3pvbmVfcG9zKTsKIAl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KQEAgLTg0Niw4ICs4NDgsOCBAQAogCiAJdG90YWxfZnJlZWQgPSByZWFsX2ZyZWVkID0gMDsKIAotCS8qIFRoaXMgcmV0dXJucyB3aXRoIG5pLT5ydW5saXN0IGxvY2tlZCBmb3IgcmVhZGluZyBvbiBzdWNjZXNzLiAqLwotCXJsID0gbnRmc19maW5kX3ZjbihuaSwgc3RhcnRfdmNuLCBGQUxTRSk7CisJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHN0YXJ0X3ZjbiwgRkFMU0UpOwogCWlmIChJU19FUlIocmwpKSB7CiAJCWlmICghaXNfcm9sbGJhY2spCiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBydW5saXN0ICIKQEAgLTg2MSw3ICs4NjMsNyBAQAogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmlyc3QgcnVubGlzdCBlbGVtZW50IGhhcyAiCiAJCQkJCSJpbnZhbGlkIGxjbiwgYWJvcnRpbmcuIik7CiAJCWVyciA9IC1FSU87Ci0JCWdvdG8gdW5sX2Vycl9vdXQ7CisJCWdvdG8gZXJyX291dDsKIAl9CiAJLyogRmluZCB0aGUgc3RhcnRpbmcgY2x1c3RlciBpbnNpZGUgdGhlIHJ1biB0aGF0IG5lZWRzIGZyZWVpbmcuICovCiAJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOwpAQCAtODc5LDcgKzg4MSw3IEBACiAJCQlpZiAoIWlzX3JvbGxiYWNrKQogCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBjbGVhciBmaXJzdCBydW4gIgogCQkJCQkJIihlcnJvciAlaSksIGFib3J0aW5nLiIsIGVycik7Ci0JCQlnb3RvIHVubF9lcnJfb3V0OworCQkJZ290byBlcnJfb3V0OwogCQl9CiAJCS8qIFdlIGhhdmUgZnJlZWQgQHRvX2ZyZWUgcmVhbCBjbHVzdGVycy4gKi8KIAkJcmVhbF9mcmVlZCA9IHRvX2ZyZWU7CkBAIC04OTksMzAgKzkwMSwxNSBAQAogCQlpZiAodW5saWtlbHkocmwtPmxjbiA8IExDTl9IT0xFKSkgewogCQkJVkNOIHZjbjsKIAotCQkJLyoKLQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIHJ1bmxpc3QgbG9jayBmb3IKLQkJCSAqIHRoZSBkdXJhdGlvbi4KLQkJCSAqLworCQkJLyogQXR0ZW1wdCB0byBtYXAgcnVubGlzdC4gKi8KIAkJCXZjbiA9IHJsLT52Y247Ci0JCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKLQkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJaWYgKCFpc19yb2xsYmFjaykKLQkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCAiCi0JCQkJCQkJInJ1bmxpc3QgZnJhZ21lbnQuIik7Ci0JCQkJaWYgKGVyciA9PSAtRUlOVkFMIHx8IGVyciA9PSAtRU5PRU5UKQotCQkJCQllcnIgPSAtRUlPOwotCQkJCWdvdG8gZXJyX291dDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUaGlzIHJldHVybnMgd2l0aCBuaS0+cnVubGlzdCBsb2NrZWQgZm9yIHJlYWRpbmcgb24KLQkJCSAqIHN1Y2Nlc3MuCi0JCQkgKi8KLQkJCXJsID0gbnRmc19maW5kX3ZjbihuaSwgdmNuLCBGQUxTRSk7CisJCQlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHZjbiwgRkFMU0UpOwogCQkJaWYgKElTX0VSUihybCkpIHsKIAkJCQllcnIgPSBQVFJfRVJSKHJsKTsKIAkJCQlpZiAoIWlzX3JvbGxiYWNrKQotCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCAiCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgIgorCQkJCQkJCSJydW5saXN0IGZyYWdtZW50IG9yICIKKwkJCQkJCQkiZmFpbGVkIHRvIGZpbmQgIgogCQkJCQkJCSJzdWJzZXF1ZW50IHJ1bmxpc3QgIgogCQkJCQkJCSJlbGVtZW50LiIpOwogCQkJCWdvdG8gZXJyX291dDsKQEAgLTkzNSw3ICs5MjIsNyBAQAogCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJCQkJcmwtPmxjbik7CiAJCQkJZXJyID0gLUVJTzsKLQkJCQlnb3RvIHVubF9lcnJfb3V0OworCQkJCWdvdG8gZXJyX291dDsKIAkJCX0KIAkJfQogCQkvKiBUaGUgbnVtYmVyIG9mIGNsdXN0ZXJzIGluIHRoaXMgcnVuIHRoYXQgbmVlZCBmcmVlaW5nLiAqLwpAQCAtOTUxLDcgKzkzOCw3IEBACiAJCQkJaWYgKCFpc19yb2xsYmFjaykKIAkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyICIKIAkJCQkJCQkic3Vic2VxdWVudCBydW4uIik7Ci0JCQkJZ290byB1bmxfZXJyX291dDsKKwkJCQlnb3RvIGVycl9vdXQ7CiAJCQl9CiAJCQkvKiBXZSBoYXZlIGZyZWVkIEB0b19mcmVlIHJlYWwgY2x1c3RlcnMuICovCiAJCQlyZWFsX2ZyZWVkICs9IHRvX2ZyZWU7CkBAIC05NzIsOSArOTU5LDggQEAKIAkvKiBXZSBhcmUgZG9uZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdHVhbGx5IGZyZWVkIGNsdXN0ZXJzLiAqLwogCW50ZnNfZGVidWcoIkRvbmUuIik7CiAJcmV0dXJuIHJlYWxfZnJlZWQ7Ci11bmxfZXJyX291dDoKLQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIGVycl9vdXQ6CisJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiAJaWYgKGlzX3JvbGxiYWNrKQogCQlyZXR1cm4gZXJyOwogCS8qIElmIG5vIHJlYWwgY2x1c3RlcnMgd2VyZSBmcmVlZCwgbm8gbmVlZCB0byByb2xsYmFjay4gKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbG9nZmlsZS5jIGIvZnMvbnRmcy9sb2dmaWxlLmMKaW5kZXggNWUyODBhYi4uOGVkYjhlMiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9sb2dmaWxlLmMKKysrIGIvZnMvbnRmcy9sb2dmaWxlLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbG9nZmlsZS5jIC0gTlRGUyBrZXJuZWwgam91cm5hbCBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtNDEwLDcgKzQxMCw3IEBACiB9CiAKIC8qKgotICogbnRmc19ja2Vja19sb2dmaWxlIC0gY2hlY2sgaW4gdGhlIGpvdXJuYWwgaWYgdGhlIHZvbHVtZSBpcyBjb25zaXN0ZW50CisgKiBudGZzX2NoZWNrX2xvZ2ZpbGUgLSBjaGVjayB0aGUgam91cm5hbCBmb3IgY29uc2lzdGVuY3kKICAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjawogICoKICAqIENoZWNrIHRoZSAkTG9nRmlsZSBqb3VybmFsIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCS8qIEFuIGVtcHR5ICRMb2dGaWxlIG11c3QgaGF2ZSBiZWVuIGNsZWFuIGJlZm9yZSBpdCBnb3QgZW1wdGllZC4gKi8KIAlpZiAoTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKQogCQlnb3RvIGlzX2VtcHR5OwotCXNpemUgPSBsb2dfdmktPmlfc2l6ZTsKKwlzaXplID0gaV9zaXplX3JlYWQobG9nX3ZpKTsKIAkvKiBNYWtlIHN1cmUgdGhlIGZpbGUgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBzaXplLiAqLwogCWlmIChzaXplID4gTWF4TG9nRmlsZVNpemUpCiAJCXNpemUgPSBNYXhMb2dGaWxlU2l6ZTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCSAqIG9wdGltaXplIGxvZ19wYWdlX3NpemUgYW5kIGxvZ19wYWdlX2JpdHMgaW50byBjb25zdGFudHMuCiAJICovCiAJbG9nX3BhZ2VfYml0cyA9IGdlbmVyaWNfZmZzKGxvZ19wYWdlX3NpemUpIC0gMTsKLQlzaXplICY9IH4obG9nX3BhZ2Vfc2l6ZSAtIDEpOworCXNpemUgJj0gfihzNjQpKGxvZ19wYWdlX3NpemUgLSAxKTsKIAkvKgogCSAqIEVuc3VyZSB0aGUgbG9nIGZpbGUgaXMgYmlnIGVub3VnaCB0byBzdG9yZSBhdCBsZWFzdCB0aGUgdHdvIHJlc3RhcnQKIAkgKiBwYWdlcyBhbmQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvZyByZWNvcmQgcGFnZXMuCkBAIC02ODksNyArNjg5LDggQEAKIAlpZiAoIU5Wb2xMb2dGaWxlRW1wdHkodm9sKSkgewogCQlpbnQgZXJyOwogCQkKLQkJZXJyID0gbnRmc19hdHRyX3NldChOVEZTX0kobG9nX3ZpKSwgMCwgbG9nX3ZpLT5pX3NpemUsIDB4ZmYpOworCQllcnIgPSBudGZzX2F0dHJfc2V0KE5URlNfSShsb2dfdmkpLCAwLCBpX3NpemVfcmVhZChsb2dfdmkpLAorCQkJCTB4ZmYpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbGwgJExvZ0ZpbGUgd2l0aCAiCiAJCQkJCSIweGZmIGJ5dGVzIChlcnJvciBjb2RlICVpKS4iLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tZnQuYyBiL2ZzL250ZnMvbWZ0LmMKaW5kZXggZGZhODVhYy4uYWM5ZmYzOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9tZnQuYworKysgYi9mcy9udGZzL21mdC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqCiAgKiBtZnQuYyAtIE5URlMga2VybmVsIG1mdCByZWNvcmQgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDUsNiArNDUsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIE1GVF9SRUNPUkQgKm1hcF9tZnRfcmVjb3JkX3BhZ2UobnRmc19pbm9kZSAqbmkpCiB7CisJbG9mZl90IGlfc2l6ZTsKIAludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKIAlzdHJ1Y3QgaW5vZGUgKm1mdF92aSA9IHZvbC0+bWZ0X2lubzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTYwLDEzICs2MSwxNCBAQAogCWluZGV4ID0gbmktPm1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJb2ZzID0gKG5pLT5tZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOwogCisJaV9zaXplID0gaV9zaXplX3JlYWQobWZ0X3ZpKTsKIAkvKiBUaGUgbWF4aW11bSB2YWxpZCBpbmRleCBpbnRvIHRoZSBwYWdlIGNhY2hlIGZvciAkTUZUJ3MgZGF0YS4gKi8KLQllbmRfaW5kZXggPSBtZnRfdmktPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCiAJLyogSWYgdGhlIHdhbnRlZCBpbmRleCBpcyBvdXQgb2YgYm91bmRzIHRoZSBtZnQgcmVjb3JkIGRvZXNuJ3QgZXhpc3QuICovCiAJaWYgKHVubGlrZWx5KGluZGV4ID49IGVuZF9pbmRleCkpIHsKLQkJaWYgKGluZGV4ID4gZW5kX2luZGV4IHx8IChtZnRfdmktPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0spIDwKLQkJCQlvZnMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQlpZiAoaW5kZXggPiBlbmRfaW5kZXggfHwgKGlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0spIDwgb2ZzICsKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgewogCQkJcGFnZSA9IEVSUl9QVFIoLUVOT0VOVCk7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJBdHRlbXQgdG8gcmVhZCBtZnQgcmVjb3JkIDB4JWx4LCAiCiAJCQkJCSJ3aGljaCBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbWZ0LiAgIgpAQCAtMjg1LDcgKzI4Nyw3IEBACiAJCQl9CiAJCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKIAkJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZvdW5kIHN0YWxlIGV4dGVudCBtZnQgIgotCQkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGUgc3lzdGVtLiAiCisJCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZXN5c3RlbS4gIgogCQkJCQkiUnVuIGNoa2Rzay4iKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CkBAIC0zMTYsNyArMzE4LDcgQEAKIAkvKiBWZXJpZnkgdGhlIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBwcmVzZW50LiAqLwogCWlmIChzZXFfbm8gJiYgKGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcikgIT0gc2VxX25vKSkgewogCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGb3VuZCBzdGFsZSBleHRlbnQgbWZ0ICIKLQkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGUgc3lzdGVtLiBSdW4gY2hrZHNrLiIpOworCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZXN5c3RlbS4gUnVuIGNoa2Rzay4iKTsKIAkJZGVzdHJveV9uaSA9IFRSVUU7CiAJCW0gPSBFUlJfUFRSKC1FSU8pOwogCQlnb3RvIHVubV9lcnJfb3V0OwpAQCAtOTQ2LDIwICs5NDgsMjMgQEAKIAluYS5uYW1lX2xlbiA9IDA7CiAJbmEudHlwZSA9IEFUX1VOVVNFRDsKIAkvKgotCSAqIEZvciBpbm9kZSAwLCBpLmUuICRNRlQgaXRzZWxmLCB3ZSBjYW5ub3QgdXNlIGlsb29rdXA1KCkgZnJvbSBoZXJlIG9yCi0JICogd2UgZGVhZGxvY2sgYmVjYXVzZSB0aGUgaW5vZGUgaXMgYWxyZWFkeSBsb2NrZWQgYnkgdGhlIGtlcm5lbAotCSAqIChmcy9mcy13cml0ZWJhY2suYzo6X19zeW5jX3NpbmdsZV9pbm9kZSgpKSBhbmQgaWxvb2t1cDUoKSB3YWl0cwotCSAqIHVudGlsIHRoZSBpbm9kZSBpcyB1bmxvY2tlZCBiZWZvcmUgcmV0dXJuaW5nIGl0IGFuZCBpdCBuZXZlciBnZXRzCi0JICogdW5sb2NrZWQgYmVjYXVzZSBudGZzX3Nob3VsZF93cml0ZV9tZnRfcmVjb3JkKCkgbmV2ZXIgcmV0dXJucy4gICktOgotCSAqIEZvcnR1bmF0ZWx5LCB3ZSBoYXZlIGlub2RlIDAgcGlubmVkIGluIGljYWNoZSBmb3IgdGhlIGR1cmF0aW9uIG9mCi0JICogdGhlIG1vdW50IHNvIHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkuCisJICogT3B0aW1pemUgaW5vZGUgMCwgaS5lLiAkTUZUIGl0c2VsZiwgc2luY2Ugd2UgaGF2ZSBpdCBpbiBtZW1vcnkgYW5kCisJICogd2UgZ2V0IGhlcmUgZm9yIGl0IHJhdGhlciBvZnRlbi4KIAkgKi8KIAlpZiAoIW1mdF9ubykgewogCQkvKiBCYWxhbmNlIHRoZSBiZWxvdyBpcHV0KCkuICovCiAJCXZpID0gaWdyYWIobWZ0X3ZpKTsKIAkJQlVHX09OKHZpICE9IG1mdF92aSk7Ci0JfSBlbHNlCi0JCXZpID0gaWxvb2t1cDUoc2IsIG1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsICZuYSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGF2ZSB0byB1c2UgaWxvb2t1cDVfbm93YWl0KCkgc2luY2UgaWxvb2t1cDUoKSB3YWl0cyBmb3IgdGhlCisJCSAqIGlub2RlIGxvY2sgd2hpY2ggY2F1c2VzIG50ZnMgdG8gZGVhZGxvY2sgd2hlbiBhIGNvbmN1cnJlbnQKKwkJICogaW5vZGUgd3JpdGUgdmlhIHRoZSBpbm9kZSBkaXJ0eSBjb2RlIHBhdGhzIGFuZCB0aGUgcGFnZQorCQkgKiBkaXJ0eSBjb2RlIHBhdGggb2YgdGhlIGlub2RlIGRpcnR5IGNvZGUgcGF0aCB3aGVuIHdyaXRpbmcKKwkJICogJE1GVCBvY2N1cnMuCisJCSAqLworCQl2aSA9IGlsb29rdXA1X25vd2FpdChzYiwgbWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwgJm5hKTsKKwl9CiAJaWYgKHZpKSB7CiAJCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaXMgaW4gaWNhY2hlLiIsIG1mdF9ubyk7CiAJCS8qIFRoZSBpbm9kZSBpcyBpbiBpY2FjaGUuICovCkBAIC0xMDE0LDcgKzEwMTksMTMgQEAKIAluYS5tZnRfbm8gPSBNUkVGX0xFKG0tPmJhc2VfbWZ0X3JlY29yZCk7CiAJbnRmc19kZWJ1ZygiTWZ0IHJlY29yZCAweCVseCBpcyBhbiBleHRlbnQgcmVjb3JkLiAgTG9va2luZyBmb3IgYmFzZSAiCiAJCQkiaW5vZGUgMHglbHggaW4gaWNhY2hlLiIsIG1mdF9ubywgbmEubWZ0X25vKTsKLQl2aSA9IGlsb29rdXA1KHNiLCBuYS5tZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLCAmbmEpOworCWlmICghbmEubWZ0X25vKSB7CisJCS8qIEJhbGFuY2UgdGhlIGJlbG93IGlwdXQoKS4gKi8KKwkJdmkgPSBpZ3JhYihtZnRfdmkpOworCQlCVUdfT04odmkgIT0gbWZ0X3ZpKTsKKwl9IGVsc2UKKwkJdmkgPSBpbG9va3VwNV9ub3dhaXQoc2IsIG5hLm1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsCisJCQkJJm5hKTsKIAlpZiAoIXZpKSB7CiAJCS8qCiAJCSAqIFRoZSBiYXNlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUsIHdyaXRlIHRoaXMgZXh0ZW50IG1mdApAQCAtMTEyMSw2ICsxMTMyLDcgQEAKIAkJbnRmc19pbm9kZSAqYmFzZV9uaSkKIHsKIAlzNjQgcGFzc19lbmQsIGxsLCBkYXRhX3BvcywgcGFzc19zdGFydCwgb2ZzLCBiaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWZ0Ym1wX21hcHBpbmc7CiAJdTggKmJ1ZiwgKmJ5dGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMTM0LDkgKzExNDYsMTMgQEAKIAkgKiBTZXQgdGhlIGVuZCBvZiB0aGUgcGFzcyBtYWtpbmcgc3VyZSB3ZSBkbyBub3Qgb3ZlcmZsb3cgdGhlIG1mdAogCSAqIGJpdG1hcC4KIAkgKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmTlRGU19JKHZvbC0+bWZ0X2lubyktPnNpemVfbG9jaywgZmxhZ3MpOwogCXBhc3NfZW5kID0gTlRGU19JKHZvbC0+bWZ0X2lubyktPmFsbG9jYXRlZF9zaXplID4+CiAJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJk5URlNfSSh2b2wtPm1mdF9pbm8pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyktPnNpemVfbG9jaywgZmxhZ3MpOwogCWxsID0gTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZOVEZTX0kodm9sLT5tZnRibXBfaW5vKS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJaWYgKHBhc3NfZW5kID4gbGwpCiAJCXBhc3NfZW5kID0gbGw7CiAJcGFzcyA9IDE7CkBAIC0xMjYzLDYgKzEyNzksNyBAQAogewogCUxDTiBsY247CiAJczY0IGxsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pOwogCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDIgPSBOVUxMOwpAQCAtMTI4NCwxNyArMTMwMSwyMCBAQAogCS8qCiAJICogRGV0ZXJtaW5lIHRoZSBsYXN0IGxjbiBvZiB0aGUgbWZ0IGJpdG1hcC4gIFRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUKIAkgKiBtZnQgYml0bWFwIGNhbm5vdCBiZSB6ZXJvIHNvIHdlIGFyZSBvayB0byBkbyB0aGlzLgotCSAqIG50ZnNfZmluZF92Y24oKSByZXR1cm5zIHRoZSBydW5saXN0IGxvY2tlZCBvbiBzdWNjZXNzLgogCSAqLwotCXJsID0gbnRmc19maW5kX3ZjbihtZnRibXBfbmksIChtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplIC0gMSkgPj4KLQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOworCWRvd25fd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlsbCA9IG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobWZ0Ym1wX25pLAorCQkJKGxsIC0gMSkgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0cywgVFJVRSk7CiAJaWYgKHVubGlrZWx5KElTX0VSUihybCkgfHwgIXJsLT5sZW5ndGggfHwgcmwtPmxjbiA8IDApKSB7CisJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBkZXRlcm1pbmUgbGFzdCBhbGxvY2F0ZWQgIgogCQkJCSJjbHVzdGVyIG9mIG1mdCBiaXRtYXAgYXR0cmlidXRlLiIpOwotCQlpZiAoIUlTX0VSUihybCkpIHsKLQkJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJCWlmICghSVNfRVJSKHJsKSkKIAkJCXJldCA9IC1FSU87Ci0JCX0gZWxzZQorCQllbHNlCiAJCQlyZXQgPSBQVFJfRVJSKHJsKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMzk2LDcgKzE0MTYsNyBAQAogCUJVR19PTihsbCA8IHJsMi0+dmNuKTsKIAlCVUdfT04obGwgPj0gcmwyLT52Y24gKyBybDItPmxlbmd0aCk7CiAJLyogR2V0IHRoZSBzaXplIGZvciB0aGUgbmV3IG1hcHBpbmcgcGFpcnMgYXJyYXkgZm9yIHRoaXMgZXh0ZW50LiAqLwotCW1wX3NpemUgPSBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKHZvbCwgcmwyLCBsbCk7CisJbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybDIsIGxsLCAtMSk7CiAJaWYgKHVubGlrZWx5KG1wX3NpemUgPD0gMCkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiR2V0IHNpemUgZm9yIG1hcHBpbmcgcGFpcnMgZmFpbGVkIGZvciAiCiAJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlIGV4dGVudC4iKTsKQEAgLTE0MTgsNiArMTQzOCw4IEBACiAJCS8vIFRPRE86IERlYWwgd2l0aCB0aGlzIGJ5IG1vdmluZyB0aGlzIGV4dGVudCB0byBhIG5ldyBtZnQKIAkJLy8gcmVjb3JkIG9yIGJ5IHN0YXJ0aW5nIGEgbmV3IGV4dGVudCBpbiBhIG5ldyBtZnQgcmVjb3JkIG9yIGJ5CiAJCS8vIG1vdmluZyBvdGhlciBhdHRyaWJ1dGVzIG91dCBvZiB0aGlzIG1mdCByZWNvcmQuCisJCS8vIE5vdGU6IEl0IHdpbGwgbmVlZCB0byBiZSBhIHNwZWNpYWwgbWZ0IHJlY29yZCBhbmQgaWYgbm9uZSBvZgorCQkvLyB0aG9zZSBhcmUgYXZhaWxhYmxlIGl0IGdldHMgcmF0aGVyIGNvbXBsaWNhdGVkLi4uCiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhpcyBtZnQgcmVjb3JkIHRvICIKIAkJCQkiYWNjb21vZGF0ZSBleHRlbmRlZCBtZnQgYml0bWFwIGF0dHJpYnV0ZSAiCiAJCQkJImV4dGVudC4gIENhbm5vdCBoYW5kbGUgdGhpcyB5ZXQuIik7CkBAIC0xNDI4LDcgKzE0NTAsNyBAQAogCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLwogCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCiAJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCi0JCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwkJCW1wX3NpemUsIHJsMiwgbGwsIC0xLCBOVUxMKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgIgogCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKQEAgLTE0NTgsOSArMTQ4MCwxMSBAQAogCQl9CiAJCWEgPSBjdHgtPmF0dHI7CiAJfQorCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplICs9IHZvbC0+Y2x1c3Rlcl9zaXplOwogCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplID0KIAkJCWNwdV90b19zbGU2NChtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKiBFbnN1cmUgdGhlIGNoYW5nZXMgbWFrZSBpdCB0byBkaXNrLiAqLwogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CiAJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOwpAQCAtMTQ3Niw3ICsxNTAwLDkgQEAKIAkJCTAsIGN0eCkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKIAkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSArPSB2b2wtPmNsdXN0ZXJfc2l6ZTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwogCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CiAJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CkBAIC0xNTEyLDcgKzE1MzgsNyBAQAogCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKIAkJCQlvbGRfYWxlbiAtIGxlMTZfdG9fY3B1KAogCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKLQkJCQlybDIsIGxsLCBOVUxMKSkgeworCQkJCXJsMiwgbGwsIC0xLCBOVUxMKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc3RvcmUgbWFwcGluZyBwYWlycyAiCiAJCQkJCSJhcnJheS4lcyIsIGVzKTsKIAkJCU5Wb2xTZXRFcnJvcnModm9sKTsKQEAgLTE1NTAsNiArMTU3Niw3IEBACiBzdGF0aWMgaW50IG50ZnNfbWZ0X2JpdG1hcF9leHRlbmRfaW5pdGlhbGl6ZWRfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wpCiB7CiAJczY0IG9sZF9kYXRhX3NpemUsIG9sZF9pbml0aWFsaXplZF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGlub2RlICptZnRibXBfdmk7CiAJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CkBAIC0xNTgzLDcgKzE2MTAsOCBAQAogCQlnb3RvIHB1dF9lcnJfb3V0OwogCX0KIAlhID0gY3R4LT5hdHRyOwotCW9sZF9kYXRhX3NpemUgPSBtZnRibXBfdmktPmlfc2l6ZTsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJb2xkX2RhdGFfc2l6ZSA9IGlfc2l6ZV9yZWFkKG1mdGJtcF92aSk7CiAJb2xkX2luaXRpYWxpemVkX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CiAJLyoKIAkgKiBXZSBjYW4gc2ltcGx5IHVwZGF0ZSB0aGUgaW5pdGlhbGl6ZWRfc2l6ZSBiZWZvcmUgZmlsbGluZyB0aGUgc3BhY2UKQEAgLTE1OTMsMTEgKzE2MjEsMTIgQEAKIAltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgKz0gODsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KIAkJCWNwdV90b19zbGU2NChtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOwotCWlmIChtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPiBtZnRibXBfdmktPmlfc2l6ZSkgewotCQltZnRibXBfdmktPmlfc2l6ZSA9IG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gb2xkX2RhdGFfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUobWZ0Ym1wX3ZpLCBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOwogCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPQotCQkJCWNwdV90b19zbGU2NChtZnRibXBfdmktPmlfc2l6ZSk7CisJCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CiAJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCiAJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKIAltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CkBAIC0xNjM2LDIyICsxNjY1LDI4IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAJYSA9IGN0eC0+YXR0cjsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID0gb2xkX2luaXRpYWxpemVkX3NpemU7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CiAJCQljcHVfdG9fc2xlNjQob2xkX2luaXRpYWxpemVkX3NpemUpOwotCWlmIChtZnRibXBfdmktPmlfc2l6ZSAhPSBvbGRfZGF0YV9zaXplKSB7Ci0JCW1mdGJtcF92aS0+aV9zaXplID0gb2xkX2RhdGFfc2l6ZTsKKwlpZiAoaV9zaXplX3JlYWQobWZ0Ym1wX3ZpKSAhPSBvbGRfZGF0YV9zaXplKSB7CisJCWlfc2l6ZV93cml0ZShtZnRibXBfdmksIG9sZF9kYXRhX3NpemUpOwogCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQob2xkX2RhdGFfc2l6ZSk7CiAJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CiAJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOwogCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwogCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKyNpZmRlZiBERUJVRworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW50ZnNfZGVidWcoIlJlc3RvcmVkIHN0YXR1cyBvZiBtZnRibXA6IGFsbG9jYXRlZF9zaXplIDB4JWxseCwgIgogCQkJImRhdGFfc2l6ZSAweCVsbHgsIGluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCiAJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCi0JCQkobG9uZyBsb25nKW1mdGJtcF92aS0+aV9zaXplLAorCQkJKGxvbmcgbG9uZylpX3NpemVfcmVhZChtZnRibXBfdmkpLAogCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisjZW5kaWYgLyogREVCVUcgKi8KIGVycl9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2NzksNyArMTcxNCw4IEBACiB7CiAJTENOIGxjbjsKIAlWQ04gb2xkX2xhc3RfdmNuOwotCXM2NCBtaW5fbnIsIG5yLCBsbCA9IDA7CisJczY0IG1pbl9uciwgbnIsIGxsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbnRmc19pbm9kZSAqbWZ0X25pOwogCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDI7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCA9IE5VTEw7CkBAIC0xNjk1LDIzICsxNzMxLDI1IEBACiAJICogRGV0ZXJtaW5lIHRoZSBwcmVmZXJyZWQgYWxsb2NhdGlvbiBsb2NhdGlvbiwgaS5lLiB0aGUgbGFzdCBsY24gb2YKIAkgKiB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlLiAgVGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSBtZnQgZGF0YQogCSAqIGF0dHJpYnV0ZSBjYW5ub3QgYmUgemVybyBzbyB3ZSBhcmUgb2sgdG8gZG8gdGhpcy4KLQkgKiBudGZzX2ZpbmRfdmNuKCkgcmV0dXJucyB0aGUgcnVubGlzdCBsb2NrZWQgb24gc3VjY2Vzcy4KIAkgKi8KLQlybCA9IG50ZnNfZmluZF92Y24obWZ0X25pLCAobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSAtIDEpID4+Ci0JCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBUUlVFKTsKKwlkb3duX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbGwgPSBtZnRfbmktPmFsbG9jYXRlZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG1mdF9uaSwKKwkJCShsbCAtIDEpID4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOwogCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOwogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKIAkJCQkiY2x1c3RlciBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7Ci0JCWlmICghSVNfRVJSKHJsKSkgewotCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJaWYgKCFJU19FUlIocmwpKQogCQkJcmV0ID0gLUVJTzsKLQkJfSBlbHNlCisJCWVsc2UKIAkJCXJldCA9IFBUUl9FUlIocmwpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlsY24gPSBybC0+bGNuICsgcmwtPmxlbmd0aDsKLQludGZzX2RlYnVnKCJMYXN0IGxjbiBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUgaXMgMHglbGx4LiIsCi0JCQkobG9uZyBsb25nKWxjbik7CisJbnRmc19kZWJ1ZygiTGFzdCBsY24gb2YgbWZ0IGRhdGEgYXR0cmlidXRlIGlzIDB4JWxseC4iLCAobG9uZyBsb25nKWxjbik7CiAJLyogTWluaW11bSBhbGxvY2F0aW9uIGlzIG9uZSBtZnQgcmVjb3JkIHdvcnRoIG9mIGNsdXN0ZXJzLiAqLwogCW1pbl9uciA9IHZvbC0+bWZ0X3JlY29yZF9zaXplID4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CiAJaWYgKCFtaW5fbnIpCkBAIC0xNzIxLDEyICsxNzU5LDEzIEBACiAJaWYgKCFucikKIAkJbnIgPSBtaW5fbnI7CiAJLyogRW5zdXJlIHdlIGRvIG5vdCBnbyBhYm92ZSAyXjMyLTEgbWZ0IHJlY29yZHMuICovCi0JaWYgKHVubGlrZWx5KChtZnRfbmktPmFsbG9jYXRlZF9zaXplICsKLQkJCShuciA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSkgPj4KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlsbCA9IG1mdF9uaS0+YWxsb2NhdGVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoKGxsICsgKG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpKSA+PgogCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PSAoMWxsIDw8IDMyKSkpIHsKIAkJbnIgPSBtaW5fbnI7Ci0JCWlmICh1bmxpa2VseSgobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArCi0JCQkJKG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpKSA+PgorCQlpZiAodW5saWtlbHkoKGxsICsgKG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpKSA+PgogCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMgPj0gKDFsbCA8PCAzMikpKSB7CiAJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkNhbm5vdCBhbGxvY2F0ZSBtZnQgcmVjb3JkICIKIAkJCQkJImJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGlub2RlcyAiCkBAIC0xNzcyLDcgKzE4MTEsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihybCk7CiAJfQogCW1mdF9uaS0+cnVubGlzdC5ybCA9IHJsOwotCW50ZnNfZGVidWcoIkFsbG9jYXRlZCAlbGxpIGNsdXN0ZXJzLiIsIG5yKTsKKwludGZzX2RlYnVnKCJBbGxvY2F0ZWQgJWxsaSBjbHVzdGVycy4iLCAobG9uZyBsb25nKW5yKTsKIAkvKiBGaW5kIHRoZSBsYXN0IHJ1biBpbiB0aGUgbmV3IHJ1bmxpc3QuICovCiAJZm9yICg7IHJsWzFdLmxlbmd0aDsgcmwrKykKIAkJOwpAQCAtMTgwOCw3ICsxODQ3LDcgQEAKIAlCVUdfT04obGwgPCBybDItPnZjbik7CiAJQlVHX09OKGxsID49IHJsMi0+dmNuICsgcmwyLT5sZW5ndGgpOwogCS8qIEdldCB0aGUgc2l6ZSBmb3IgdGhlIG5ldyBtYXBwaW5nIHBhaXJzIGFycmF5IGZvciB0aGlzIGV4dGVudC4gKi8KLQltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsMiwgbGwpOworCW1wX3NpemUgPSBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKHZvbCwgcmwyLCBsbCwgLTEpOwogCWlmICh1bmxpa2VseShtcF9zaXplIDw9IDApKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkdldCBzaXplIGZvciBtYXBwaW5nIHBhaXJzIGZhaWxlZCBmb3IgIgogCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUgZXh0ZW50LiIpOwpAQCAtMTgzMiw3ICsxODcxLDExIEBACiAJCS8vIG1vdmluZyBvdGhlciBhdHRyaWJ1dGVzIG91dCBvZiB0aGlzIG1mdCByZWNvcmQuCiAJCS8vIE5vdGU6IFVzZSB0aGUgc3BlY2lhbCByZXNlcnZlZCBtZnQgcmVjb3JkcyBhbmQgZW5zdXJlIHRoYXQKIAkJLy8gdGhpcyBleHRlbnQgaXMgbm90IHJlcXVpcmVkIHRvIGZpbmQgdGhlIG1mdCByZWNvcmQgaW4KLQkJLy8gcXVlc3Rpb24uCisJCS8vIHF1ZXN0aW9uLiAgSWYgbm8gZnJlZSBzcGVjaWFsIHJlY29yZHMgbGVmdCB3ZSB3b3VsZCBuZWVkIHRvCisJCS8vIG1vdmUgYW4gZXhpc3RpbmcgcmVjb3JkIGF3YXksIGluc2VydCBvdXJzIGluIGl0cyBwbGFjZSwgYW5kCisJCS8vIHRoZW4gcGxhY2UgdGhlIG1vdmVkIHJlY29yZCBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2UKKwkJLy8gYW5kIHdlIHdvdWxkIHRoZW4gbmVlZCB0byB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBtZnQKKwkJLy8gcmVjb3JkIGFwcHJvcHJpYXRlbHkuICBUaGlzIGlzIHJhdGhlciBjb21wbGljYXRlZC4uLgogCQludGZzX2Vycm9yKHZvbC0+c2IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHRoaXMgbWZ0IHJlY29yZCB0byAiCiAJCQkJImFjY29tb2RhdGUgZXh0ZW5kZWQgbWZ0IGRhdGEgYXR0cmlidXRlICIKIAkJCQkiZXh0ZW50LiAgQ2Fubm90IGhhbmRsZSB0aGlzIHlldC4iKTsKQEAgLTE4NDMsNyArMTg4Niw3IEBACiAJLyogR2VuZXJhdGUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgZGlyZWN0bHkgaW50byB0aGUgYXR0ciByZWNvcmQuICovCiAJcmV0ID0gbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKHZvbCwgKHU4KilhICsKIAkJCWxlMTZfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKLQkJCW1wX3NpemUsIHJsMiwgbGwsIE5VTEwpOworCQkJbXBfc2l6ZSwgcmwyLCBsbCwgLTEsIE5VTEwpOwogCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBidWlsZCBtYXBwaW5nIHBhaXJzIGFycmF5IG9mICIKIAkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIpOwpAQCAtMTg3NSw5ICsxOTE4LDExIEBACiAJCX0KIAkJYSA9IGN0eC0+YXR0cjsKIAl9CisJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gbnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0czsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSA9CiAJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KIAlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOwogCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKQEAgLTE4OTIsNyArMTkzNyw5IEBACiAJCQlDQVNFX1NFTlNJVElWRSwgcmxbMV0udmNuLCBOVUxMLCAwLCBjdHgpKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCiAJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4lcyIsIGVzKTsKKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQltZnRfbmktPmFsbG9jYXRlZF9zaXplICs9IG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKIAkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOwogCQl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOwpAQCAtMTkyMSw3ICsxOTY4LDcgQEAKIAkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCiAJCQkJb2xkX2FsZW4gLSBsZTE2X3RvX2NwdSgKIAkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCi0JCQkJcmwyLCBsbCwgTlVMTCkpIHsKKwkJCQlybDIsIGxsLCAtMSwgTlVMTCkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIG1hcHBpbmcgcGFpcnMgIgogCQkJCQkiYXJyYXkuJXMiLCBlcyk7CiAJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CkBAIC0xOTkxLDcgKzIwMzgsNyBAQAogCQkJCSJyZXBvcnRzIHRoaXMgYXMgY29ycnVwdGlvbiwgcGxlYXNlIGVtYWlsICIKIAkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IHN0YXRpbmcgIgogCQkJCSJ0aGF0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIGFuZCB0aGF0IHRoZSAiCi0JCQkJIm1vZGlmaWVkIGZpbGUgc3lzdGVtIGNyZWF0ZWQgd2FzIGNvcnJ1cHQuICAiCisJCQkJIm1vZGlmaWVkIGZpbGVzeXN0ZW0gY3JlYXRlZCB3YXMgY29ycnVwdC4gICIKIAkJCQkiVGhhbmsgeW91LiIpOwogCX0KIAkvKiBTZXQgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgdG8gMS4gKi8KQEAgLTIwMzYsNiArMjA4Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBzNjQgbWZ0X25vKQogeworCWxvZmZfdCBpX3NpemU7CiAJc3RydWN0IGlub2RlICptZnRfdmkgPSB2b2wtPm1mdF9pbm87CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJTUZUX1JFQ09SRCAqbTsKQEAgLTIwNTEsMTAgKzIwOTksMTEgQEAKIAlpbmRleCA9IG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJb2ZzID0gKG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCi0JZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChtZnRfdmkpOworCWVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWlmICh1bmxpa2VseShpbmRleCA+PSBlbmRfaW5kZXgpKSB7CiAJCWlmICh1bmxpa2VseShpbmRleCA+IGVuZF9pbmRleCB8fCBvZnMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+PQotCQkJCShtZnRfdmktPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0spKSkgeworCQkJCShpX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRyaWVkIHRvIGZvcm1hdCBub24tZXhpc3RpbmcgbWZ0ICIKIAkJCQkJInJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOwogCQkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0yMTg4LDYgKzIyMzcsNyBAQAogCQludGZzX2lub2RlICpiYXNlX25pLCBNRlRfUkVDT1JEICoqbXJlYykKIHsKIAlzNjQgbGwsIGJpdCwgb2xkX2RhdGFfaW5pdGlhbGl6ZWQsIG9sZF9kYXRhX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaW5vZGUgKnZpOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCW50ZnNfaW5vZGUgKm1mdF9uaSwgKm1mdGJtcF9uaSwgKm5pOwpAQCAtMjIzNyw5ICsyMjg3LDEzIEBACiAJICogdGhlIGZpcnN0IDI0IG1mdCByZWNvcmRzIGFzIHRoZXkgYXJlIHNwZWNpYWwgYW5kIHdoaWxzdCB0aGV5IG1heSBub3QKIAkgKiBiZSBpbiB1c2UsIHdlIGRvIG5vdCBhbGxvY2F0ZSBmcm9tIHRoZW0uCiAJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbGwgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKLQlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplIDw8IDMgPiBsbCAmJgotCQkJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gMykgeworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJb2xkX2RhdGFfaW5pdGlhbGl6ZWQgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlpZiAob2xkX2RhdGFfaW5pdGlhbGl6ZWQgPDwgMyA+IGxsICYmIG9sZF9kYXRhX2luaXRpYWxpemVkID4gMykgewogCQliaXQgPSBsbDsKIAkJaWYgKGJpdCA8IDI0KQogCQkJYml0ID0gMjQ7CkBAIC0yMjU0LDE1ICsyMzA4LDE4IEBACiAJICogbWZ0IHJlY29yZCB0aGF0IHdlIGNhbiBhbGxvY2F0ZS4KIAkgKiBOb3RlOiBUaGUgc21hbGxlc3QgbWZ0IHJlY29yZCB3ZSBhbGxvY2F0ZSBpcyBtZnQgcmVjb3JkIDI0LgogCSAqLwotCWJpdCA9IG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8PCAzOworCWJpdCA9IG9sZF9kYXRhX2luaXRpYWxpemVkIDw8IDM7CiAJaWYgKHVubGlrZWx5KGJpdCA+PSAoMWxsIDw8IDMyKSkpCiAJCWdvdG8gbWF4X2Vycl9vdXQ7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJb2xkX2RhdGFfc2l6ZSA9IG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemU7CiAJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdGJtcCBiZWZvcmUgZXh0ZW5zaW9uOiBhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsICIKIAkJCSJkYXRhX3NpemUgMHglbGx4LCBpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAotCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJKGxvbmcgbG9uZyl2b2wtPm1mdGJtcF9pbm8tPmlfc2l6ZSwKLQkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKLQlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplICsgOCA+IG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJCShsb25nIGxvbmcpb2xkX2RhdGFfc2l6ZSwKKwkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQodm9sLT5tZnRibXBfaW5vKSwKKwkJCShsb25nIGxvbmcpb2xkX2RhdGFfaW5pdGlhbGl6ZWQpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaWYgKG9sZF9kYXRhX2luaXRpYWxpemVkICsgOCA+IG9sZF9kYXRhX3NpemUpIHsKIAkJLyogTmVlZCB0byBleHRlbmQgYml0bWFwIGJ5IG9uZSBtb3JlIGNsdXN0ZXIuICovCiAJCW50ZnNfZGVidWcoIm1mdGJtcDogaW5pdGlhbGl6ZWRfc2l6ZSArIDggPiBhbGxvY2F0ZWRfc2l6ZS4iKTsKIAkJZXJyID0gbnRmc19tZnRfYml0bWFwX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayh2b2wpOwpAQCAtMjI3MCwxMiArMjMyNywxNiBAQAogCQkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOwogCQkJZ290byBlcnJfb3V0OwogCQl9CisjaWZkZWYgREVCVUcKKwkJcmVhZF9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYWZ0ZXIgYWxsb2NhdGlvbiBleHRlbnNpb246ICIKIAkJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCiAJCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCiAJCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCisJCQkJKGxvbmcgbG9uZylpX3NpemVfcmVhZCh2b2wtPm1mdGJtcF9pbm8pLAogCQkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKyNlbmRpZiAvKiBERUJVRyAqLwogCX0KIAkvKgogCSAqIFdlIG5vdyBoYXZlIHN1ZmZpY2llbnQgYWxsb2NhdGVkIHNwYWNlLCBleHRlbmQgdGhlIGluaXRpYWxpemVkX3NpemUKQEAgLTIyODcsMTIgKzIzNDgsMTYgQEAKIAkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOwogCQlnb3RvIGVycl9vdXQ7CiAJfQorI2lmZGVmIERFQlVHCisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdGJtcCBhZnRlciBpbml0aWFsaXplZCBleHRlbnRpb246ICIKIAkJCSJhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsIGRhdGFfc2l6ZSAweCVsbHgsICIKIAkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAogCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJKGxvbmcgbG9uZyl2b2wtPm1mdGJtcF9pbm8tPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQodm9sLT5tZnRibXBfaW5vKSwKIAkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworI2VuZGlmIC8qIERFQlVHICovCiAJbnRmc19kZWJ1ZygiRm91bmQgZnJlZSByZWNvcmQgKCMzKSwgYml0IDB4JWxseC4iLCAobG9uZyBsb25nKWJpdCk7CiBmb3VuZF9mcmVlX3JlYzoKIAkvKiBAYml0IGlzIHRoZSBmb3VuZCBmcmVlIG1mdCByZWNvcmQsIGFsbG9jYXRlIGl0IGluIHRoZSBtZnQgYml0bWFwLiAqLwpAQCAtMjMxNCw3ICsyMzc5LDEwIEBACiAJICogcGFyYWxsZWwgYWxsb2NhdGlvbiBjb3VsZCBhbGxvY2F0ZSB0aGUgc2FtZSBtZnQgcmVjb3JkIGFzIHRoaXMgb25lLgogCSAqLwogCWxsID0gKGJpdCArIDEpIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7Ci0JaWYgKGxsIDw9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW9sZF9kYXRhX2luaXRpYWxpemVkID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaWYgKGxsIDw9IG9sZF9kYXRhX2luaXRpYWxpemVkKSB7CiAJCW50ZnNfZGVidWcoIkFsbG9jYXRlZCBtZnQgcmVjb3JkIGFscmVhZHkgaW5pdGlhbGl6ZWQuIik7CiAJCWdvdG8gbWZ0X3JlY19hbHJlYWR5X2luaXRpYWxpemVkOwogCX0KQEAgLTIzMjUsMjYgKzIzOTMsMzAgQEAKIAkgKiBhY3R1YWxseSB0cmF2ZXJzZWQgbW9yZSB0aGFuIG9uY2Ugd2hlbiBhIGZyZXNobHkgZm9ybWF0dGVkIHZvbHVtZSBpcwogCSAqIGZpcnN0IHdyaXR0ZW4gdG8gc28gaXQgb3B0aW1pemVzIGF3YXkgbmljZWx5IGluIHRoZSBjb21tb24gY2FzZS4KIAkgKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0IGRhdGEgYmVmb3JlIGV4dGVuc2lvbjogIgogCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgogCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCiAJCQkobG9uZyBsb25nKW1mdF9uaS0+YWxsb2NhdGVkX3NpemUsCi0JCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZylpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pLAogCQkJKGxvbmcgbG9uZyltZnRfbmktPmluaXRpYWxpemVkX3NpemUpOwogCXdoaWxlIChsbCA+IG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJZXJyID0gbnRmc19tZnRfZGF0YV9leHRlbmRfYWxsb2NhdGlvbl9ub2xvY2sodm9sKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBleHRlbmQgbWZ0IGRhdGEgIgogCQkJCQkiYWxsb2NhdGlvbi4iKTsKIAkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOwogCQl9CisJCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0IGRhdGEgYWZ0ZXIgYWxsb2NhdGlvbiBleHRlbnNpb246ICIKIAkJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCiAJCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCiAJCQkJKGxvbmcgbG9uZyltZnRfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkJKGxvbmcgbG9uZylpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pLAogCQkJCShsb25nIGxvbmcpbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKIAl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKgogCSAqIEV4dGVuZCBtZnQgZGF0YSBpbml0aWFsaXplZCBzaXplIChhbmQgZGF0YSBzaXplIG9mIGNvdXJzZSkgdG8gcmVhY2gKIAkgKiB0aGUgYWxsb2NhdGVkIG1mdCByZWNvcmQsIGZvcm1hdHRpbmcgdGhlIG1mdCByZWNvcmRzIGFsbG9uZyB0aGUgd2F5LgpAQCAtMjM1Miw2ICsyNDI0LDcgQEAKIAkgKiBuZWVkZWQgYnkgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdCgpLiAgV2Ugd2lsbCB1cGRhdGUgdGhlIGF0dHJpYnV0ZQogCSAqIHJlY29yZCBpdHNlbGYgaW4gb25lIGZlbGwgc3dvb3AgbGF0ZXIgb24uCiAJICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW9sZF9kYXRhX2luaXRpYWxpemVkID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplOwogCW9sZF9kYXRhX3NpemUgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZTsKIAl3aGlsZSAobGwgPiBtZnRfbmktPmluaXRpYWxpemVkX3NpemUpIHsKQEAgLTIzNjAsOCArMjQzMyw5IEBACiAJCW5ld19pbml0aWFsaXplZF9zaXplID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplICsKIAkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKIAkJbWZ0X25vID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7Ci0JCWlmIChuZXdfaW5pdGlhbGl6ZWRfc2l6ZSA+IHZvbC0+bWZ0X2luby0+aV9zaXplKQotCQkJdm9sLT5tZnRfaW5vLT5pX3NpemUgPSBuZXdfaW5pdGlhbGl6ZWRfc2l6ZTsKKwkJaWYgKG5ld19pbml0aWFsaXplZF9zaXplID4gaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSkKKwkJCWlfc2l6ZV93cml0ZSh2b2wtPm1mdF9pbm8sIG5ld19pbml0aWFsaXplZF9zaXplKTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJCW50ZnNfZGVidWcoIkluaXRpYWxpemluZyBtZnQgcmVjb3JkIDB4JWxseC4iLAogCQkJCShsb25nIGxvbmcpbWZ0X25vKTsKIAkJZXJyID0gbnRmc19tZnRfcmVjb3JkX2Zvcm1hdCh2b2wsIG1mdF9ubyk7CkBAIC0yMzY5LDggKzI0NDMsMTAgQEAKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmb3JtYXQgbWZ0IHJlY29yZC4iKTsKIAkJCWdvdG8gdW5kb19kYXRhX2luaXQ7CiAJCX0KKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQltZnRfbmktPmluaXRpYWxpemVkX3NpemUgPSBuZXdfaW5pdGlhbGl6ZWRfc2l6ZTsKIAl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJcmVjb3JkX2Zvcm1hdHRlZCA9IFRSVUU7CiAJLyogVXBkYXRlIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUgcmVjb3JkIHRvIHJlZmxlY3QgdGhlIG5ldyBzaXplcy4gKi8KIAltID0gbWFwX21mdF9yZWNvcmQobWZ0X25pKTsKQEAgLTIzOTYsMjIgKzI0NzIsMjcgQEAKIAkJZ290byB1bmRvX2RhdGFfaW5pdDsKIAl9CiAJYSA9IGN0eC0+YXR0cjsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KIAkJCWNwdV90b19zbGU2NChtZnRfbmktPmluaXRpYWxpemVkX3NpemUpOwotCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9IGNwdV90b19zbGU2NCh2b2wtPm1mdF9pbm8tPmlfc2l6ZSk7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0KKwkJCWNwdV90b19zbGU2NChpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pKTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCiAJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKIAltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CiAJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CiAJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBhZnRlciBtZnQgcmVjb3JkIGluaXRpYWxpemF0aW9uOiAiCiAJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCiAJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKIAkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKLQkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKWlfc2l6ZV9yZWFkKHZvbC0+bWZ0X2lubyksCiAJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7Ci0JQlVHX09OKHZvbC0+bWZ0X2luby0+aV9zaXplID4gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7Ci0JQlVHX09OKG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IHZvbC0+bWZ0X2luby0+aV9zaXplKTsKKwlCVUdfT04oaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSA+IG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpOworCUJVR19PTihtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPiBpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pKTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogbWZ0X3JlY19hbHJlYWR5X2luaXRpYWxpemVkOgogCS8qCiAJICogV2UgY2FuIGZpbmFsbHkgZHJvcCB0aGUgbWZ0IGJpdG1hcCBsb2NrIGFzIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUKQEAgLTI2NTIsOCArMjczMywxMCBAQAogCSptcmVjID0gbTsKIAlyZXR1cm4gbmk7CiB1bmRvX2RhdGFfaW5pdDoKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID0gb2xkX2RhdGFfaW5pdGlhbGl6ZWQ7Ci0Jdm9sLT5tZnRfaW5vLT5pX3NpemUgPSBvbGRfZGF0YV9zaXplOworCWlfc2l6ZV93cml0ZSh2b2wtPm1mdF9pbm8sIG9sZF9kYXRhX3NpemUpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCWdvdG8gdW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOwogdW5kb19tZnRibXBfYWxsb2M6CiAJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKaW5kZXggN2M3ZTEzYi4uMzUxZGJjMyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9uYW1laS5jCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtMTUzLDggKzE1Myw3IEBACiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJudGZzX2lnZXQoMHglbHgpIGZhaWxlZCB3aXRoICIKIAkJCQkJImVycm9yIGNvZGUgJWxpLiIsIGRlbnRfaW5vLAogCQkJCQlQVFJfRVJSKGRlbnRfaW5vZGUpKTsKLQkJaWYgKG5hbWUpCi0JCQlrZnJlZShuYW1lKTsKKwkJa2ZyZWUobmFtZSk7CiAJCS8qIFJldHVybiB0aGUgZXJyb3IgY29kZS4gKi8KIAkJcmV0dXJuIChzdHJ1Y3QgZGVudHJ5ICopZGVudF9pbm9kZTsKIAl9CkBAIC0zODAsNyArMzc5LDcgQEAKICAqIFJldHVybiB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yIGNvZGUgb24KICAqIGVycm9yIChJU19FUlIoKSBpcyB0cnVlKS4KICAqLwotc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkX2RlbnQpCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkX2RlbnQpCiB7CiAJc3RydWN0IGlub2RlICp2aSA9IGNoaWxkX2RlbnQtPmRfaW5vZGU7CiAJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOwpAQCAtNDY1LDcgKzQ2NCw3IEBACiAgKgogICogUmV0dXJuIHRoZSBkZW50cnkgb24gc3VjY2VzcyBvciB0aGUgZXJyb3IgY29kZSBvbiBlcnJvciAoSVNfRVJSKCkgaXMgdHJ1ZSkuCiAgKi8KLXN0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpmaCkKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZmgpCiB7CiAJc3RydWN0IGlub2RlICp2aTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50OwpAQCAtNDk2LDMgKzQ5NSwzMCBAQAogCW50ZnNfZGVidWcoIkRvbmUgZm9yIGlub2RlIDB4JWx4LCBnZW5lcmF0aW9uIDB4JXguIiwgaW5vLCBnZW4pOwogCXJldHVybiBkZW50OwogfQorCisvKioKKyAqIEV4cG9ydCBvcGVyYXRpb25zIGFsbG93aW5nIE5GUyBleHBvcnRpbmcgb2YgbW91bnRlZCBOVEZTIHBhcnRpdGlvbnMuCisgKgorICogV2UgdXNlIHRoZSBkZWZhdWx0IC0+ZGVjb2RlX2ZoKCkgYW5kIC0+ZW5jb2RlX2ZoKCkgZm9yIG5vdy4gIE5vdGUgdGhhdCB0aGV5CisgKiB1c2UgMzIgYml0cyB0byBzdG9yZSB0aGUgaW5vZGUgbnVtYmVyIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGxvbmcgc28gb24gNjQtYml0CisgKiBhcmNoaXRlY3R1cmVzIGlzIHVzdWFsbHkgNjQgYml0cyBzbyBpdCB3b3VsZCBhbGwgZmFpbCBob3JyaWJseSBvbiBodWdlCisgKiB2b2x1bWVzLiAgSSBndWVzcyB3ZSBuZWVkIHRvIGRlZmluZSBvdXIgb3duIGVuY29kZSBhbmQgZGVjb2RlIGZoIGZ1bmN0aW9ucworICogdGhhdCBzdG9yZSA2NC1iaXQgaW5vZGUgbnVtYmVycyBhdCBzb21lIHBvaW50IGJ1dCBmb3Igbm93IHdlIHdpbGwgaWdub3JlIHRoZQorICogcHJvYmxlbS4uLgorICoKKyAqIFdlIGFsc28gdXNlIHRoZSBkZWZhdWx0IC0+Z2V0X25hbWUoKSBoZWxwZXIgKHVzZWQgYnkgLT5kZWNvZGVfZmgoKSB2aWEKKyAqIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkpIGFzIHRoYXQgaXMgY29tcGxldGVseSBmcworICogaW5kZXBlbmRlbnQuCisgKgorICogVGhlIGRlZmF1bHQgLT5nZXRfcGFyZW50KCkganVzdCByZXR1cm5zIC1FQUNDRVMgc28gd2UgaGF2ZSB0byBwcm92aWRlIG91cgorICogb3duIGFuZCB0aGUgZGVmYXVsdCAtPmdldF9kZW50cnkoKSBpcyBpbmNvbXBhdGlibGUgd2l0aCBOVEZTIGR1ZSB0byBub3QKKyAqIGFsbG93aW5nIHRoZSBpbm9kZSBudW1iZXIgMCB3aGljaCBpcyB1c2VkIGluIE5URlMgZm9yIHRoZSBzeXN0ZW0gZmlsZSAkTUZUCisgKiBhbmQgZHVlIHRvIHVzaW5nIGlnZXQoKSB3aGVyZWFzIE5URlMgbmVlZHMgbnRmc19pZ2V0KCkuCisgKi8KK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBudGZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQJPSBudGZzX2dldF9wYXJlbnQsCS8qIEZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuCisJCQkJCQkgICBkaXJlY3RvcnkuICovCisJLmdldF9kZW50cnkJPSBudGZzX2dldF9kZW50cnksCS8qIEZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZQorCQkJCQkJICAgZ2l2ZW4gYSBmaWxlIGhhbmRsZQorCQkJCQkJICAgc3ViLWZyYWdtZW50LiAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbnRmcy5oIGIvZnMvbnRmcy9udGZzLmgKaW5kZXggNzIwZmZiNy4uNDQ2YjUwMSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9udGZzLmgKKysrIGIvZnMvbnRmcy9udGZzLmgKQEAgLTIsNyArMiw3IEBACiAgKiBudGZzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKICAqCSAgICBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmxzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCiAjaW5jbHVkZSAidHlwZXMuaCIKICNpbmNsdWRlICJ2b2x1bWUuaCIKQEAgLTQxLDYgKzQyLDkgQEAKIAlOVEZTX0JMT0NLX1NJWkVfQklUUwk9IDksCiAJTlRGU19TQl9NQUdJQwkJPSAweDUzNDY1NDRlLAkvKiAnTlRGUycgKi8KIAlOVEZTX01BWF9OQU1FX0xFTgk9IDI1NSwKKwlOVEZTX01BWF9BVFRSX05BTUVfTEVOCT0gMjU1LAorCU5URlNfTUFYX0NMVVNURVJfU0laRQk9IDY0ICogMTAyNCwJLyogNjRraUIgKi8KKwlOVEZTX01BWF9QQUdFU19QRVJfQ0xVU1RFUiA9IE5URlNfTUFYX0NMVVNURVJfU0laRSAvIFBBR0VfQ0FDSEVfU0laRSwKIH0gTlRGU19DT05TVEFOVFM7CiAKIC8qIEdsb2JhbCB2YXJpYWJsZXMuICovCkBAIC02NSw2ICs2OSw4IEBACiBleHRlcm4gc3RydWN0ICBmaWxlX29wZXJhdGlvbnMgbnRmc19lbXB0eV9maWxlX29wczsKIGV4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBudGZzX2VtcHR5X2lub2RlX29wczsKIAorZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBudGZzX2V4cG9ydF9vcHM7CisKIC8qKgogICogTlRGU19TQiAtIHJldHVybiB0aGUgbnRmcyB2b2x1bWUgZ2l2ZW4gYSB2ZnMgc3VwZXIgYmxvY2sKICAqIEBzYjoJCVZGUyBzdXBlciBibG9jawpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9ydW5saXN0LmMgYi9mcy9udGZzL3J1bmxpc3QuYwppbmRleCA4NDM4ZmIxLi43NTg4NTViIDEwMDY0NAotLS0gYS9mcy9udGZzL3J1bmxpc3QuYworKysgYi9mcy9udGZzL3J1bmxpc3QuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKgogICogcnVubGlzdC5jIC0gTlRGUyBydW5saXN0IGhhbmRsaW5nIGNvZGUuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC01OSw3ICs1OSw3IEBACiAgKgogICogQXMgdGhlIHJ1bmxpc3RzIGdyb3csIG1vcmUgbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuICBUbyBwcmV2ZW50IHRoZQogICoga2VybmVsIGhhdmluZyB0byBhbGxvY2F0ZSBhbmQgcmVhbGxvY2F0ZSBsYXJnZSBudW1iZXJzIG9mIHNtYWxsIGJpdHMgb2YKLSAqIG1lbW9yeSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuZCBlbnRpcmUgcGFnZSBvZiBtZW1vcnkuCisgKiBtZW1vcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlbnRpcmUgcGFnZSBvZiBtZW1vcnkuCiAgKgogICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0IEBybC4KICAqCkBAIC0xMTMsOCArMTEzLDExIEBACiAJQlVHX09OKCFkc3QpOwogCUJVR19PTighc3JjKTsKIAotCWlmICgoZHN0LT5sY24gPCAwKSB8fCAoc3JjLT5sY24gPCAwKSkgICAgIC8qIEFyZSB3ZSBtZXJnaW5nIGhvbGVzPyAqLworCWlmICgoZHN0LT5sY24gPCAwKSB8fCAoc3JjLT5sY24gPCAwKSkgeyAgIC8qIEFyZSB3ZSBtZXJnaW5nIGhvbGVzPyAqLworCQlpZiAoZHN0LT5sY24gPT0gTENOX0hPTEUgJiYgc3JjLT5sY24gPT0gTENOX0hPTEUpCisJCQlyZXR1cm4gVFJVRTsKIAkJcmV0dXJuIEZBTFNFOworCX0KIAlpZiAoKGRzdC0+bGNuICsgZHN0LT5sZW5ndGgpICE9IHNyYy0+bGNuKSAvKiBBcmUgdGhlIHJ1bnMgY29udGlndW91cz8gKi8KIAkJcmV0dXJuIEZBTFNFOwogCWlmICgoZHN0LT52Y24gKyBkc3QtPmxlbmd0aCkgIT0gc3JjLT52Y24pIC8qIEFyZSB0aGUgcnVucyBtaXNhbGlnbmVkPyAqLwpAQCAtODU1LDMwICs4NTgsNDIgQEAKIAlpZiAoIWF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJVkNOIG1heF9jbHVzdGVyOwogCi0JCW1heF9jbHVzdGVyID0gKHNsZTY0X3RvX2NwdSgKKwkJbWF4X2NsdXN0ZXIgPSAoKHNsZTY0X3RvX2NwdSgKIAkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSkgKwogCQkJCXZvbC0+Y2x1c3Rlcl9zaXplIC0gMSkgPj4KLQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpIC0gMTsKIAkJLyoKLQkJICogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hlc3RfdmNuIGFuZCB0aGUKLQkJICogaGlnaGVzdCBjbHVzdGVyLCB0aGUgcnVubGlzdCBpcyBlaXRoZXIgY29ycnVwdCBvciwgbW9yZQotCQkgKiBsaWtlbHksIHRoZXJlIGFyZSBtb3JlIGV4dGVudHMgZm9sbG93aW5nIHRoaXMgb25lLgorCQkgKiBBIGhpZ2hlc3RfdmNuIG9mIHplcm8gbWVhbnMgdGhpcyBpcyBhIHNpbmdsZSBleHRlbnQKKwkJICogYXR0cmlidXRlIHNvIHNpbXBseSB0ZXJtaW5hdGUgdGhlIHJ1bmxpc3Qgd2l0aCBMQ05fRU5PRU5UKS4KIAkJICovCi0JCWlmIChkZWx0YXhjbiA8IC0tbWF4X2NsdXN0ZXIpIHsKLQkJCW50ZnNfZGVidWcoIk1vcmUgZXh0ZW50cyB0byBmb2xsb3c7IGRlbHRheGNuID0gMHglbGx4LCAiCi0JCQkJCSJtYXhfY2x1c3RlciA9IDB4JWxseCIsCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2NsdXN0ZXIpOwotCQkJcmxbcmxwb3NdLnZjbiA9IHZjbjsKLQkJCXZjbiArPSBybFtybHBvc10ubGVuZ3RoID0gbWF4X2NsdXN0ZXIgLSBkZWx0YXhjbjsKLQkJCXJsW3JscG9zXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKLQkJCXJscG9zKys7Ci0JCX0gZWxzZSBpZiAodW5saWtlbHkoZGVsdGF4Y24gPiBtYXhfY2x1c3RlcikpIHsKLQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiBkZWx0YXhjbiA9ICIKLQkJCQkJIjB4JWxseCwgbWF4X2NsdXN0ZXIgPSAweCVsbHgiLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbHRheGNuLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1heF9jbHVzdGVyKTsKLQkJCWdvdG8gbXBhX2VycjsKKwkJaWYgKGRlbHRheGNuKSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hlc3RfdmNuIGFuZAorCQkJICogdGhlIGhpZ2hlc3QgY2x1c3RlciwgdGhlIHJ1bmxpc3QgaXMgZWl0aGVyIGNvcnJ1cHQKKwkJCSAqIG9yLCBtb3JlIGxpa2VseSwgdGhlcmUgYXJlIG1vcmUgZXh0ZW50cyBmb2xsb3dpbmcKKwkJCSAqIHRoaXMgb25lLgorCQkJICovCisJCQlpZiAoZGVsdGF4Y24gPCBtYXhfY2x1c3RlcikgeworCQkJCW50ZnNfZGVidWcoIk1vcmUgZXh0ZW50cyB0byBmb2xsb3c7IGRlbHRheGNuICIKKwkJCQkJCSI9IDB4JWxseCwgbWF4X2NsdXN0ZXIgPSAiCisJCQkJCQkiMHglbGx4IiwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJbWF4X2NsdXN0ZXIpOworCQkJCXJsW3JscG9zXS52Y24gPSB2Y247CisJCQkJdmNuICs9IHJsW3JscG9zXS5sZW5ndGggPSBtYXhfY2x1c3RlciAtCisJCQkJCQlkZWx0YXhjbjsKKwkJCQlybFtybHBvc10ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCQkJcmxwb3MrKzsKKwkJCX0gZWxzZSBpZiAodW5saWtlbHkoZGVsdGF4Y24gPiBtYXhfY2x1c3RlcikpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDb3JydXB0IGF0dHJpYnV0ZS4gICIKKwkJCQkJCSJkZWx0YXhjbiA9IDB4JWxseCwgIgorCQkJCQkJIm1heF9jbHVzdGVyID0gMHglbGx4IiwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJbWF4X2NsdXN0ZXIpOworCQkJCWdvdG8gbXBhX2VycjsKKwkJCX0KIAkJfQogCQlybFtybHBvc10ubGNuID0gTENOX0VOT0VOVDsKIAl9IGVsc2UgLyogTm90IHRoZSBiYXNlIGV4dGVudC4gVGhlcmUgbWF5IGJlIG1vcmUgZXh0ZW50cyB0byBmb2xsb3cuICovCkBAIC05MTgsMTcgKzkzMywxOCBAQAogICoKICAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCiAgKgotICogU2luY2UgbGNucyBtdXN0IGJlID49IDAsIHdlIHVzZSBuZWdhdGl2ZSByZXR1cm4gdmFsdWVzIHdpdGggc3BlY2lhbCBtZWFuaW5nOgorICogU2luY2UgbGNucyBtdXN0IGJlID49IDAsIHdlIHVzZSBuZWdhdGl2ZSByZXR1cm4gY29kZXMgd2l0aCBzcGVjaWFsIG1lYW5pbmc6CiAgKgotICogUmV0dXJuIHZhbHVlCQkJTWVhbmluZyAvIERlc2NyaXB0aW9uCisgKiBSZXR1cm4gY29kZQkJTWVhbmluZyAvIERlc2NyaXB0aW9uCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogIC0xID0gTENOX0hPTEUJCUhvbGUgLyBub3QgYWxsb2NhdGVkIG9uIGRpc2suCi0gKiAgLTIgPSBMQ05fUkxfTk9UX01BUFBFRAlUaGlzIGlzIHBhcnQgb2YgdGhlIHJ1bmxpc3Qgd2hpY2ggaGFzIG5vdCBiZWVuCi0gKgkJCQlpbnNlcnRlZCBpbnRvIHRoZSBydW5saXN0IHlldC4KLSAqICAtMyA9IExDTl9FTk9FTlQJCVRoZXJlIGlzIG5vIHN1Y2ggdmNuIGluIHRoZSBhdHRyaWJ1dGUuCisgKiAgTENOX0hPTEUJCUhvbGUgLyBub3QgYWxsb2NhdGVkIG9uIGRpc2suCisgKiAgTENOX1JMX05PVF9NQVBQRUQJVGhpcyBpcyBwYXJ0IG9mIHRoZSBydW5saXN0IHdoaWNoIGhhcyBub3QgYmVlbgorICoJCQlpbnNlcnRlZCBpbnRvIHRoZSBydW5saXN0IHlldC4KKyAqICBMQ05fRU5PRU5UCQlUaGVyZSBpcyBubyBzdWNoIHZjbiBpbiB0aGUgYXR0cmlidXRlLgogICoKICAqIExvY2tpbmc6IC0gVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIHRoZSBydW5saXN0IChmb3IgcmVhZGluZyBvciB3cml0aW5nKS4KLSAqCSAgICAtIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdG91Y2ggdGhlIGxvY2suCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRvdWNoIHRoZSBsb2NrLCBub3IgZG9lcyBpdCBtb2RpZnkgdGhlCisgKgkgICAgICBydW5saXN0LgogICovCiBMQ04gbnRmc19ybF92Y25fdG9fbGNuKGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pCiB7CkBAIC05NjQsNiArOTgwLDM5IEBACiAJcmV0dXJuIExDTl9FTk9FTlQ7CiB9CiAKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc19ybF9maW5kX3Zjbl9ub2xvY2sgLSBmaW5kIGEgdmNuIGluIGEgcnVubGlzdAorICogQHJsOgkJcnVubGlzdCB0byBzZWFyY2gKKyAqIEB2Y246CXZjbiB0byBmaW5kCisgKgorICogRmluZCB0aGUgdmlydHVhbCBjbHVzdGVyIG51bWJlciBAdmNuIGluIHRoZSBydW5saXN0IEBybCBhbmQgcmV0dXJuIHRoZQorICogYWRkcmVzcyBvZiB0aGUgcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24gb24gc3VjY2Vzcy4KKyAqCisgKiBSZXR1cm4gTlVMTCBpZiBAcmwgaXMgTlVMTCBvciBAdmNuIGlzIGluIGFuIHVubWFwcGVkIHBhcnQvb3V0IG9mIGJvdW5kcyBvZgorICogdGhlIHJ1bmxpc3QuCisgKgorICogTG9ja2luZzogVGhlIHJ1bmxpc3QgbXVzdCBiZSBsb2NrZWQgb24gZW50cnkuCisgKi8KK3J1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9maW5kX3Zjbl9ub2xvY2socnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHZjbikKK3sKKwlCVUdfT04odmNuIDwgMCk7CisJaWYgKHVubGlrZWx5KCFybCB8fCB2Y24gPCBybFswXS52Y24pKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobGlrZWx5KHJsLT5sZW5ndGgpKSB7CisJCWlmICh1bmxpa2VseSh2Y24gPCBybFsxXS52Y24pKSB7CisJCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gTENOX0hPTEUpKQorCQkJCXJldHVybiBybDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJsKys7CisJfQorCWlmIChsaWtlbHkocmwtPmxjbiA9PSBMQ05fRU5PRU5UKSkKKwkJcmV0dXJuIHJsOworCXJldHVybiBOVUxMOworfQorCiAvKioKICAqIG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzIC0gZ2V0IG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgYSBudW1iZXIKICAqIEBuOgkJbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBmb3IKQEAgLTk5OSwxMCArMTA0OCwxNyBAQAogICogbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyAtIGdldCBieXRlcyBuZWVkZWQgZm9yIG1hcHBpbmcgcGFpcnMgYXJyYXkKICAqIEB2b2w6CW50ZnMgdm9sdW1lIChuZWVkZWQgZm9yIHRoZSBudGZzIHZlcnNpb24pCiAgKiBAcmw6CQlsb2NrZWQgcnVubGlzdCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIG1hcHBpbmcgcGFpcnMgb2YKLSAqIEBzdGFydF92Y246CXZjbiBhdCB3aGljaCB0byBzdGFydCB0aGUgbWFwcGluZyBwYWlycyBhcnJheQorICogQGZpcnN0X3ZjbjoJZmlyc3QgdmNuIHdoaWNoIHRvIGluY2x1ZGUgaW4gdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBsYXN0X3ZjbjoJbGFzdCB2Y24gd2hpY2ggdG8gaW5jbHVkZSBpbiB0aGUgbWFwcGluZyBwYWlycyBhcnJheQogICoKICAqIFdhbGsgdGhlIGxvY2tlZCBydW5saXN0IEBybCBhbmQgY2FsY3VsYXRlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtYXBwaW5nCi0gKiBwYWlycyBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuIEBzdGFydF92Y24uCisgKiBwYWlycyBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuIEBmaXJzdF92Y24gYW5kCisgKiBmaW5pc2hpbmcgd2l0aCB2Y24gQGxhc3RfdmNuLgorICoKKyAqIEEgQGxhc3RfdmNuIG9mIC0xIG1lYW5zIGVuZCBvZiBydW5saXN0IGFuZCBpbiB0aGF0IGNhc2UgdGhlIHNpemUgb2YgdGhlCisgKiBtYXBwaW5nIHBhaXJzIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bmxpc3Qgc3RhcnRpbmcgYXQgdmNuIEBmaXJzdF92Y24KKyAqIGFuZCBmaW5pc2hpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBpcyBkZXRlcm1pbmVkLgorICoKICAqIFRoaXMgZm9yIGV4YW1wbGUgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplIHdoZW4KICAqIGJ1aWxkaW5nIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgogICoKQEAgLTEwMTgsMzQgKzEwNzQsNTAgQEAKICAqCSAgICByZW1haW5zIGxvY2tlZCB0aHJvdWdob3V0LCBhbmQgaXMgbGVmdCBsb2NrZWQgdXBvbiByZXR1cm4uCiAgKi8KIGludCBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCi0JCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiBzdGFydF92Y24pCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiBmaXJzdF92Y24sCisJCWNvbnN0IFZDTiBsYXN0X3ZjbikKIHsKIAlMQ04gcHJldl9sY247CiAJaW50IHJsczsKKwlCT09MIHRoZV9lbmQgPSBGQUxTRTsKIAotCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlCVUdfT04oZmlyc3RfdmNuIDwgMCk7CisJQlVHX09OKGxhc3RfdmNuIDwgLTEpOworCUJVR19PTihsYXN0X3ZjbiA+PSAwICYmIGZpcnN0X3ZjbiA+IGxhc3RfdmNuKTsKIAlpZiAoIXJsKSB7Ci0JCUJVR19PTihzdGFydF92Y24pOworCQlCVUdfT04oZmlyc3RfdmNuKTsKKwkJQlVHX09OKGxhc3RfdmNuID4gMCk7CiAJCXJldHVybiAxOwogCX0KLQkvKiBTa2lwIHRvIHJ1bmxpc3QgZWxlbWVudCBjb250YWluaW5nIEBzdGFydF92Y24uICovCi0Jd2hpbGUgKHJsLT5sZW5ndGggJiYgc3RhcnRfdmNuID49IHJsWzFdLnZjbikKKwkvKiBTa2lwIHRvIHJ1bmxpc3QgZWxlbWVudCBjb250YWluaW5nIEBmaXJzdF92Y24uICovCisJd2hpbGUgKHJsLT5sZW5ndGggJiYgZmlyc3RfdmNuID49IHJsWzFdLnZjbikKIAkJcmwrKzsKLQlpZiAoKCFybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+IHJsLT52Y24pIHx8IHN0YXJ0X3ZjbiA8IHJsLT52Y24pCisJaWYgKHVubGlrZWx5KCghcmwtPmxlbmd0aCAmJiBmaXJzdF92Y24gPiBybC0+dmNuKSB8fAorCQkJZmlyc3RfdmNuIDwgcmwtPnZjbikpCiAJCXJldHVybiAtRUlOVkFMOwogCXByZXZfbGNuID0gMDsKIAkvKiBBbHdheXMgbmVlZCB0aGUgdGVybWluaW5nIHplcm8gYnl0ZS4gKi8KIAlybHMgPSAxOwogCS8qIERvIHRoZSBmaXJzdCBwYXJ0aWFsIHJ1biBpZiBwcmVzZW50LiAqLwotCWlmIChzdGFydF92Y24gPiBybC0+dmNuKSB7Ci0JCXM2NCBkZWx0YTsKKwlpZiAoZmlyc3RfdmNuID4gcmwtPnZjbikgeworCQlzNjQgZGVsdGEsIGxlbmd0aCA9IHJsLT5sZW5ndGg7CiAKIAkJLyogV2Uga25vdyBybC0+bGVuZ3RoICE9IDAgYWxyZWFkeS4gKi8KLQkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJaWYgKHVubGlrZWx5KGxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKSkKIAkJCWdvdG8gZXJyX291dDsKLQkJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCQkvKgorCQkgKiBJZiBAc3RvcF92Y24gaXMgZ2l2ZW4gYW5kIGZpbmlzaGVzIGluc2lkZSB0aGlzIHJ1biwgY2FwIHRoZQorCQkgKiBydW4gbGVuZ3RoLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGxhc3RfdmNuID49IDAgJiYgcmxbMV0udmNuID4gbGFzdF92Y24pKSB7CisJCQlzNjQgczEgPSBsYXN0X3ZjbiArIDE7CisJCQlpZiAodW5saWtlbHkocmxbMV0udmNuID4gczEpKQorCQkJCWxlbmd0aCA9IHMxIC0gcmwtPnZjbjsKKwkJCXRoZV9lbmQgPSBUUlVFOworCQl9CisJCWRlbHRhID0gZmlyc3RfdmNuIC0gcmwtPnZjbjsKIAkJLyogSGVhZGVyIGJ5dGUgKyBsZW5ndGguICovCi0JCXJscyArPSAxICsgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMocmwtPmxlbmd0aCAtIGRlbHRhKTsKKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhsZW5ndGggLSBkZWx0YSk7CiAJCS8qCiAJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQogCQkgKiBhcmUgb24gTlRGUyAzLjArLCB3ZSBkb24ndCBzdG9yZSBpdCBhdCBhbGwsIGkuZS4gd2UgbmVlZApAQCAtMTA1Myw5ICsxMTI1LDkgQEAKIAkJICogTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgb24gTlRGUyAxLjItLCBob2xlcyBhcmUgc3RvcmVkIHdpdGgKIAkJICogYW4gbGNuIG9mIC0xIGFuZCBub3QgYSBkZWx0YV9sY24gb2YgLTEgKHVubGVzcyBib3RoIGFyZSAtMSkuCiAJCSAqLwotCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpKSB7CiAJCQlwcmV2X2xjbiA9IHJsLT5sY247Ci0JCQlpZiAocmwtPmxjbiA+PSAwKQorCQkJaWYgKGxpa2VseShybC0+bGNuID49IDApKQogCQkJCXByZXZfbGNuICs9IGRlbHRhOwogCQkJLyogQ2hhbmdlIGluIGxjbi4gKi8KIAkJCXJscyArPSBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhwcmV2X2xjbik7CkBAIC0xMDY0LDExICsxMTM2LDIzIEBACiAJCXJsKys7CiAJfQogCS8qIERvIHRoZSBmdWxsIHJ1bnMuICovCi0JZm9yICg7IHJsLT5sZW5ndGg7IHJsKyspIHsKLQkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwlmb3IgKDsgcmwtPmxlbmd0aCAmJiAhdGhlX2VuZDsgcmwrKykgeworCQlzNjQgbGVuZ3RoID0gcmwtPmxlbmd0aDsKKworCQlpZiAodW5saWtlbHkobGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpKQogCQkJZ290byBlcnJfb3V0OworCQkvKgorCQkgKiBJZiBAc3RvcF92Y24gaXMgZ2l2ZW4gYW5kIGZpbmlzaGVzIGluc2lkZSB0aGlzIHJ1biwgY2FwIHRoZQorCQkgKiBydW4gbGVuZ3RoLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGxhc3RfdmNuID49IDAgJiYgcmxbMV0udmNuID4gbGFzdF92Y24pKSB7CisJCQlzNjQgczEgPSBsYXN0X3ZjbiArIDE7CisJCQlpZiAodW5saWtlbHkocmxbMV0udmNuID4gczEpKQorCQkJCWxlbmd0aCA9IHMxIC0gcmwtPnZjbjsKKwkJCXRoZV9lbmQgPSBUUlVFOworCQl9CiAJCS8qIEhlYWRlciBieXRlICsgbGVuZ3RoLiAqLwotCQlybHMgKz0gMSArIG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHJsLT5sZW5ndGgpOworCQlybHMgKz0gMSArIG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKGxlbmd0aCk7CiAJCS8qCiAJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQogCQkgKiBhcmUgb24gTlRGUyAzLjArLCB3ZSBkb24ndCBzdG9yZSBpdCBhdCBhbGwsIGkuZS4gd2UgbmVlZApAQCAtMTA3Niw3ICsxMTYwLDcgQEAKIAkJICogTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgb24gTlRGUyAxLjItLCBob2xlcyBhcmUgc3RvcmVkIHdpdGgKIAkJICogYW4gbGNuIG9mIC0xIGFuZCBub3QgYSBkZWx0YV9sY24gb2YgLTEgKHVubGVzcyBib3RoIGFyZSAtMSkuCiAJCSAqLwotCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpKSB7CiAJCQkvKiBDaGFuZ2UgaW4gbGNuLiAqLwogCQkJcmxzICs9IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHJsLT5sY24gLQogCQkJCQlwcmV2X2xjbik7CkBAIC0xMTE5LDcgKzEyMDMsNyBAQAogCiAJaSA9IDA7CiAJZG8gewotCQlpZiAoZHN0ID4gZHN0X21heCkKKwkJaWYgKHVubGlrZWx5KGRzdCA+IGRzdF9tYXgpKQogCQkJZ290byBlcnJfb3V0OwogCQkqZHN0KysgPSBsICYgMHhmZmxsOwogCQlsID4+PSA4OwpAQCAtMTEyOCwxMiArMTIxMiwxMiBAQAogCWogPSAobiA+PiA4ICogKGkgLSAxKSkgJiAweGZmOwogCS8qIElmIHRoZSBzaWduIGJpdCBpcyB3cm9uZywgd2UgbmVlZCBhbiBleHRyYSBieXRlLiAqLwogCWlmIChuIDwgMCAmJiBqID49IDApIHsKLQkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCWlmICh1bmxpa2VseShkc3QgPiBkc3RfbWF4KSkKIAkJCWdvdG8gZXJyX291dDsKIAkJaSsrOwogCQkqZHN0ID0gKHM4KS0xOwogCX0gZWxzZSBpZiAobiA+IDAgJiYgaiA8IDApIHsKLQkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCWlmICh1bmxpa2VseShkc3QgPiBkc3RfbWF4KSkKIAkJCWdvdG8gZXJyX291dDsKIAkJaSsrOwogCQkqZHN0ID0gKHM4KTA7CkBAIC0xMTQ5LDEzICsxMjMzLDE4IEBACiAgKiBAZHN0OglkZXN0aW5hdGlvbiBidWZmZXIgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKICAqIEBkc3RfbGVuOglzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciBAZHN0IGluIGJ5dGVzCiAgKiBAcmw6CQlsb2NrZWQgcnVubGlzdCBmb3Igd2hpY2ggdG8gYnVpbGQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKLSAqIEBzdGFydF92Y246CXZjbiBhdCB3aGljaCB0byBzdGFydCB0aGUgbWFwcGluZyBwYWlycyBhcnJheQorICogQGZpcnN0X3ZjbjoJZmlyc3QgdmNuIHdoaWNoIHRvIGluY2x1ZGUgaW4gdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBsYXN0X3ZjbjoJbGFzdCB2Y24gd2hpY2ggdG8gaW5jbHVkZSBpbiB0aGUgbWFwcGluZyBwYWlycyBhcnJheQogICogQHN0b3BfdmNuOglmaXJzdCB2Y24gb3V0c2lkZSBkZXN0aW5hdGlvbiBidWZmZXIgb24gc3VjY2VzcyBvciAtRU5PU1BDCiAgKgogICogQ3JlYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGZyb20gdGhlIGxvY2tlZCBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuCi0gKiBAc3RhcnRfdmNuIGFuZCBzYXZlIHRoZSBhcnJheSBpbiBAZHN0LiAgQGRzdF9sZW4gaXMgdGhlIHNpemUgb2YgQGRzdCBpbgotICogYnl0ZXMgYW5kIGl0IHNob3VsZCBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUgdmFsdWUgb2J0YWluZWQgYnkgY2FsbGluZwotICogbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLgorICogQGZpcnN0X3ZjbiBhbmQgZmluaXNoaW5nIHdpdGggdmNuIEBsYXN0X3ZjbiBhbmQgc2F2ZSB0aGUgYXJyYXkgaW4gQGRzdC4KKyAqIEBkc3RfbGVuIGlzIHRoZSBzaXplIG9mIEBkc3QgaW4gYnl0ZXMgYW5kIGl0IHNob3VsZCBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUKKyAqIHZhbHVlIG9idGFpbmVkIGJ5IGNhbGxpbmcgbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLgorICoKKyAqIEEgQGxhc3RfdmNuIG9mIC0xIG1lYW5zIGVuZCBvZiBydW5saXN0IGFuZCBpbiB0aGF0IGNhc2UgdGhlIG1hcHBpbmcgcGFpcnMKKyAqIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bmxpc3Qgc3RhcnRpbmcgYXQgdmNuIEBmaXJzdF92Y24gYW5kIGZpbmlzaGluZworICogYXQgdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBpcyBjcmVhdGVkLgogICoKICAqIElmIEBybCBpcyBOVUxMLCBqdXN0IHdyaXRlIGEgc2luZ2xlIHRlcm1pbmF0b3IgYnl0ZSB0byBAZHN0LgogICoKQEAgLTExNjQsNyArMTI1Myw3IEBACiAgKiBiZWVuIGZpbGxlZCB3aXRoIGFsbCB0aGUgbWFwcGluZyBwYWlycyB0aGF0IHdpbGwgZml0LCB0aHVzIGl0IGNhbiBiZSB0cmVhdGVkCiAgKiBhcyBwYXJ0aWFsIHN1Y2Nlc3MsIGluIHRoYXQgYSBuZXcgYXR0cmlidXRlIGV4dGVudCBuZWVkcyB0byBiZSBjcmVhdGVkIG9yCiAgKiB0aGUgbmV4dCBleHRlbnQgaGFzIHRvIGJlIHVzZWQgYW5kIHRoZSBtYXBwaW5nIHBhaXJzIGJ1aWxkIGhhcyB0byBiZQotICogY29udGludWVkIHdpdGggQHN0YXJ0X3ZjbiBzZXQgdG8gKkBzdG9wX3Zjbi4KKyAqIGNvbnRpbnVlZCB3aXRoIEBmaXJzdF92Y24gc2V0IHRvICpAc3RvcF92Y24uCiAgKgogICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUKICAqIGRlZmluZWQ6CkBAIC0xMTc4LDI3ICsxMjY3LDMyIEBACiAgKi8KIGludCBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgczggKmRzdCwKIAkJY29uc3QgaW50IGRzdF9sZW4sIGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsCi0JCWNvbnN0IFZDTiBzdGFydF92Y24sIFZDTiAqY29uc3Qgc3RvcF92Y24pCisJCWNvbnN0IFZDTiBmaXJzdF92Y24sIGNvbnN0IFZDTiBsYXN0X3ZjbiwgVkNOICpjb25zdCBzdG9wX3ZjbikKIHsKIAlMQ04gcHJldl9sY247CiAJczggKmRzdF9tYXgsICpkc3RfbmV4dDsKIAlpbnQgZXJyID0gLUVOT1NQQzsKKwlCT09MIHRoZV9lbmQgPSBGQUxTRTsKIAlzOCBsZW5fbGVuLCBsY25fbGVuOwogCi0JQlVHX09OKHN0YXJ0X3ZjbiA8IDApOworCUJVR19PTihmaXJzdF92Y24gPCAwKTsKKwlCVUdfT04obGFzdF92Y24gPCAtMSk7CisJQlVHX09OKGxhc3RfdmNuID49IDAgJiYgZmlyc3RfdmNuID4gbGFzdF92Y24pOwogCUJVR19PTihkc3RfbGVuIDwgMSk7CiAJaWYgKCFybCkgewotCQlCVUdfT04oc3RhcnRfdmNuKTsKKwkJQlVHX09OKGZpcnN0X3Zjbik7CisJCUJVR19PTihsYXN0X3ZjbiA+IDApOwogCQlpZiAoc3RvcF92Y24pCiAJCQkqc3RvcF92Y24gPSAwOwogCQkvKiBUZXJtaW5hdG9yIGJ5dGUuICovCiAJCSpkc3QgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLwotCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAZmlyc3RfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIGZpcnN0X3ZjbiA+PSBybFsxXS52Y24pCiAJCXJsKys7Ci0JaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCWlmICh1bmxpa2VseSgoIXJsLT5sZW5ndGggJiYgZmlyc3RfdmNuID4gcmwtPnZjbikgfHwKKwkJCWZpcnN0X3ZjbiA8IHJsLT52Y24pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKgogCSAqIEBkc3RfbWF4IGlzIHVzZWQgZm9yIGJvdW5kcyBjaGVja2luZyBpbgpAQCAtMTIwNywxNyArMTMwMSwyNyBAQAogCWRzdF9tYXggPSBkc3QgKyBkc3RfbGVuIC0gMTsKIAlwcmV2X2xjbiA9IDA7CiAJLyogRG8gdGhlIGZpcnN0IHBhcnRpYWwgcnVuIGlmIHByZXNlbnQuICovCi0JaWYgKHN0YXJ0X3ZjbiA+IHJsLT52Y24pIHsKLQkJczY0IGRlbHRhOworCWlmIChmaXJzdF92Y24gPiBybC0+dmNuKSB7CisJCXM2NCBkZWx0YSwgbGVuZ3RoID0gcmwtPmxlbmd0aDsKIAogCQkvKiBXZSBrbm93IHJsLT5sZW5ndGggIT0gMCBhbHJlYWR5LiAqLwotCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQlpZiAodW5saWtlbHkobGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpKQogCQkJZ290byBlcnJfb3V0OwotCQlkZWx0YSA9IHN0YXJ0X3ZjbiAtIHJsLT52Y247CisJCS8qCisJCSAqIElmIEBzdG9wX3ZjbiBpcyBnaXZlbiBhbmQgZmluaXNoZXMgaW5zaWRlIHRoaXMgcnVuLCBjYXAgdGhlCisJCSAqIHJ1biBsZW5ndGguCisJCSAqLworCQlpZiAodW5saWtlbHkobGFzdF92Y24gPj0gMCAmJiBybFsxXS52Y24gPiBsYXN0X3ZjbikpIHsKKwkJCXM2NCBzMSA9IGxhc3RfdmNuICsgMTsKKwkJCWlmICh1bmxpa2VseShybFsxXS52Y24gPiBzMSkpCisJCQkJbGVuZ3RoID0gczEgLSBybC0+dmNuOworCQkJdGhlX2VuZCA9IFRSVUU7CisJCX0KKwkJZGVsdGEgPSBmaXJzdF92Y24gLSBybC0+dmNuOwogCQkvKiBXcml0ZSBsZW5ndGguICovCiAJCWxlbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEsIGRzdF9tYXgsCi0JCQkJcmwtPmxlbmd0aCAtIGRlbHRhKTsKLQkJaWYgKGxlbl9sZW4gPCAwKQorCQkJCWxlbmd0aCAtIGRlbHRhKTsKKwkJaWYgKHVubGlrZWx5KGxlbl9sZW4gPCAwKSkKIAkJCWdvdG8gc2l6ZV9lcnI7CiAJCS8qCiAJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQpAQCAtMTIyOCwxOSArMTMzMiwxOSBAQAogCQkgKiBjYXNlIG9uIE5UNC4gLSBXZSBhc3N1bWUgdGhhdCB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGxjbgogCQkgKiBjaGFuZ2UgdW50aWwgc29tZW9uZSB0ZWxscyB1cyBvdGhlcndpc2UuLi4gKEFJQSkKIAkJICovCi0JCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCWlmIChsaWtlbHkocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykpIHsKIAkJCXByZXZfbGNuID0gcmwtPmxjbjsKLQkJCWlmIChybC0+bGNuID49IDApCisJCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCkpCiAJCQkJcHJldl9sY24gKz0gZGVsdGE7CiAJCQkvKiBXcml0ZSBjaGFuZ2UgaW4gbGNuLiAqLwogCQkJbGNuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSArCiAJCQkJCWxlbl9sZW4sIGRzdF9tYXgsIHByZXZfbGNuKTsKLQkJCWlmIChsY25fbGVuIDwgMCkKKwkJCWlmICh1bmxpa2VseShsY25fbGVuIDwgMCkpCiAJCQkJZ290byBzaXplX2VycjsKIAkJfSBlbHNlCiAJCQlsY25fbGVuID0gMDsKIAkJZHN0X25leHQgPSBkc3QgKyBsZW5fbGVuICsgbGNuX2xlbiArIDE7Ci0JCWlmIChkc3RfbmV4dCA+IGRzdF9tYXgpCisJCWlmICh1bmxpa2VseShkc3RfbmV4dCA+IGRzdF9tYXgpKQogCQkJZ290byBzaXplX2VycjsKIAkJLyogVXBkYXRlIGhlYWRlciBieXRlLiAqLwogCQkqZHN0ID0gbGNuX2xlbiA8PCA0IHwgbGVuX2xlbjsKQEAgLTEyNTAsMTMgKzEzNTQsMjUgQEAKIAkJcmwrKzsKIAl9CiAJLyogRG8gdGhlIGZ1bGwgcnVucy4gKi8KLQlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgewotCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCWZvciAoOyBybC0+bGVuZ3RoICYmICF0aGVfZW5kOyBybCsrKSB7CisJCXM2NCBsZW5ndGggPSBybC0+bGVuZ3RoOworCisJCWlmICh1bmxpa2VseShsZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkpCiAJCQlnb3RvIGVycl9vdXQ7CisJCS8qCisJCSAqIElmIEBzdG9wX3ZjbiBpcyBnaXZlbiBhbmQgZmluaXNoZXMgaW5zaWRlIHRoaXMgcnVuLCBjYXAgdGhlCisJCSAqIHJ1biBsZW5ndGguCisJCSAqLworCQlpZiAodW5saWtlbHkobGFzdF92Y24gPj0gMCAmJiBybFsxXS52Y24gPiBsYXN0X3ZjbikpIHsKKwkJCXM2NCBzMSA9IGxhc3RfdmNuICsgMTsKKwkJCWlmICh1bmxpa2VseShybFsxXS52Y24gPiBzMSkpCisJCQkJbGVuZ3RoID0gczEgLSBybC0+dmNuOworCQkJdGhlX2VuZCA9IFRSVUU7CisJCX0KIAkJLyogV3JpdGUgbGVuZ3RoLiAqLwogCQlsZW5fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxLCBkc3RfbWF4LAotCQkJCXJsLT5sZW5ndGgpOwotCQlpZiAobGVuX2xlbiA8IDApCisJCQkJbGVuZ3RoKTsKKwkJaWYgKHVubGlrZWx5KGxlbl9sZW4gPCAwKSkKIAkJCWdvdG8gc2l6ZV9lcnI7CiAJCS8qCiAJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQpAQCAtMTI2NywxNyArMTM4MywxNyBAQAogCQkgKiBjYXNlIG9uIE5UNC4gLSBXZSBhc3N1bWUgdGhhdCB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGxjbgogCQkgKiBjaGFuZ2UgdW50aWwgc29tZW9uZSB0ZWxscyB1cyBvdGhlcndpc2UuLi4gKEFJQSkKIAkJICovCi0JCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCWlmIChsaWtlbHkocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykpIHsKIAkJCS8qIFdyaXRlIGNoYW5nZSBpbiBsY24uICovCiAJCQlsY25fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxICsKIAkJCQkJbGVuX2xlbiwgZHN0X21heCwgcmwtPmxjbiAtIHByZXZfbGNuKTsKLQkJCWlmIChsY25fbGVuIDwgMCkKKwkJCWlmICh1bmxpa2VseShsY25fbGVuIDwgMCkpCiAJCQkJZ290byBzaXplX2VycjsKIAkJCXByZXZfbGNuID0gcmwtPmxjbjsKIAkJfSBlbHNlCiAJCQlsY25fbGVuID0gMDsKIAkJZHN0X25leHQgPSBkc3QgKyBsZW5fbGVuICsgbGNuX2xlbiArIDE7Ci0JCWlmIChkc3RfbmV4dCA+IGRzdF9tYXgpCisJCWlmICh1bmxpa2VseShkc3RfbmV4dCA+IGRzdF9tYXgpKQogCQkJZ290byBzaXplX2VycjsKIAkJLyogVXBkYXRlIGhlYWRlciBieXRlLiAqLwogCQkqZHN0ID0gbGNuX2xlbiA8PCA0IHwgbGVuX2xlbjsKQEAgLTE0MzYsMyArMTU1Miw1IEBACiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcnVubGlzdC5oIGIvZnMvbnRmcy9ydW5saXN0LmgKaW5kZXggNzEwN2ZkZS4uYWEwZWU2NSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9ydW5saXN0LmgKKysrIGIvZnMvbnRmcy9ydW5saXN0LmgKQEAgLTIsNyArMiw3IEBACiAgKiBydW5saXN0LmggLSBEZWZpbmVzIGZvciBydW5saXN0IGhhbmRsaW5nIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4KICAqCSAgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC02Niw2ICs2Niw4IEBACiAJTENOX0hPTEUJCT0gLTEsCS8qIEtlZXAgdGhpcyBhcyBoaWdoZXN0IHZhbHVlIG9yIGRpZSEgKi8KIAlMQ05fUkxfTk9UX01BUFBFRAk9IC0yLAogCUxDTl9FTk9FTlQJCT0gLTMsCisJTENOX0VOT01FTQkJPSAtNCwKKwlMQ05fRUlPCQkJPSAtNSwKIH0gTENOX1NQRUNJQUxfVkFMVUVTOwogCiBleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX3J1bmxpc3RzX21lcmdlKHJ1bmxpc3RfZWxlbWVudCAqZHJsLApAQCAtNzYsMTQgKzc4LDIyIEBACiAKIGV4dGVybiBMQ04gbnRmc19ybF92Y25fdG9fbGNuKGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pOwogCisjaWZkZWYgTlRGU19SVworCitleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX2ZpbmRfdmNuX25vbG9jayhydW5saXN0X2VsZW1lbnQgKnJsLAorCQljb25zdCBWQ04gdmNuKTsKKwogZXh0ZXJuIGludCBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCi0JCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiBzdGFydF92Y24pOworCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gZmlyc3RfdmNuLAorCQljb25zdCBWQ04gbGFzdF92Y24pOwogCiBleHRlcm4gaW50IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBzOCAqZHN0LAogCQljb25zdCBpbnQgZHN0X2xlbiwgY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwKLQkJY29uc3QgVkNOIHN0YXJ0X3ZjbiwgVkNOICpjb25zdCBzdG9wX3Zjbik7CisJCWNvbnN0IFZDTiBmaXJzdF92Y24sIGNvbnN0IFZDTiBsYXN0X3ZjbiwgVkNOICpjb25zdCBzdG9wX3Zjbik7CiAKIGV4dGVybiBpbnQgbnRmc19ybF90cnVuY2F0ZV9ub2xvY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwKIAkJcnVubGlzdCAqY29uc3QgcnVubGlzdCwgY29uc3QgczY0IG5ld19sZW5ndGgpOwogCisjZW5kaWYgLyogTlRGU19SVyAqLworCiAjZW5kaWYgLyogX0xJTlVYX05URlNfUlVOTElTVF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3N1cGVyLmMgYi9mcy9udGZzL3N1cGVyLmMKaW5kZXggMjEyYTNkMC4uNDFhYThlYiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9zdXBlci5jCisrKyBiL2ZzL250ZnMvc3VwZXIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBzdXBlci5jIC0gTlRGUyBrZXJuZWwgc3VwZXIgYmxvY2sgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMzQsMTQgKzM0LDE2IEBACiAjaW5jbHVkZSAic3lzY3RsLmgiCiAjaW5jbHVkZSAibG9nZmlsZS5oIgogI2luY2x1ZGUgInF1b3RhLmgiCisjaW5jbHVkZSAidXNuanJubC5oIgogI2luY2x1ZGUgImRpci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaW5kZXguaCIKICNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCiAjaW5jbHVkZSAibWFsbG9jLmgiCiAjaW5jbHVkZSAibnRmcy5oIgogCi0vKiBOdW1iZXIgb2YgbW91bnRlZCBmaWxlIHN5c3RlbXMgd2hpY2ggaGF2ZSBjb21wcmVzc2lvbiBlbmFibGVkLiAqLworLyogTnVtYmVyIG9mIG1vdW50ZWQgZmlsZXN5c3RlbXMgd2hpY2ggaGF2ZSBjb21wcmVzc2lvbiBlbmFibGVkLiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbnRmc19ucl9jb21wcmVzc2lvbl91c2VyczsKIAogLyogQSBnbG9iYWwgZGVmYXVsdCB1cGNhc2UgdGFibGUgYW5kIGEgY29ycmVzcG9uZGluZyByZWZlcmVuY2UgY291bnQuICovCkBAIC0xMDIsNyArMTA0LDcgQEAKIAlnaWRfdCBnaWQgPSAoZ2lkX3QpLTE7CiAJbW9kZV90IGZtYXNrID0gKG1vZGVfdCktMSwgZG1hc2sgPSAobW9kZV90KS0xOwogCWludCBtZnRfem9uZV9tdWx0aXBsaWVyID0gLTEsIG9uX2Vycm9ycyA9IC0xOwotCWludCBzaG93X3N5c19maWxlcyA9IC0xLCBjYXNlX3NlbnNpdGl2ZSA9IC0xOworCWludCBzaG93X3N5c19maWxlcyA9IC0xLCBjYXNlX3NlbnNpdGl2ZSA9IC0xLCBkaXNhYmxlX3NwYXJzZSA9IC0xOwogCXN0cnVjdCBubHNfdGFibGUgKm5sc19tYXAgPSBOVUxMLCAqb2xkX25sczsKIAogCS8qIEkgYW0gbGF6eS4uLiAoLTggKi8KQEAgLTE2Miw2ICsxNjQsNyBAQAogCQllbHNlIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVCgic2xvcHB5Iiwgc2xvcHB5LCBUUlVFKQogCQllbHNlIE5URlNfR0VUT1BUX0JPT0woInNob3dfc3lzX2ZpbGVzIiwgc2hvd19zeXNfZmlsZXMpCiAJCWVsc2UgTlRGU19HRVRPUFRfQk9PTCgiY2FzZV9zZW5zaXRpdmUiLCBjYXNlX3NlbnNpdGl2ZSkKKwkJZWxzZSBOVEZTX0dFVE9QVF9CT09MKCJkaXNhYmxlX3NwYXJzZSIsIGRpc2FibGVfc3BhcnNlKQogCQllbHNlIE5URlNfR0VUT1BUX09QVElPTlNfQVJSQVkoImVycm9ycyIsIG9uX2Vycm9ycywKIAkJCQlvbl9lcnJvcnNfYXJyKQogCQllbHNlIGlmICghc3RyY21wKHAsICJwb3NpeCIpIHx8ICFzdHJjbXAocCwgInNob3dfaW5vZGVzIikpCkBAIC0yOTEsNiArMjk0LDIxIEBACiAJCWVsc2UKIAkJCU5Wb2xDbGVhckNhc2VTZW5zaXRpdmUodm9sKTsKIAl9CisJaWYgKGRpc2FibGVfc3BhcnNlICE9IC0xKSB7CisJCWlmIChkaXNhYmxlX3NwYXJzZSkKKwkJCU5Wb2xDbGVhclNwYXJzZUVuYWJsZWQodm9sKTsKKwkJZWxzZSB7CisJCQlpZiAoIU5Wb2xTcGFyc2VFbmFibGVkKHZvbCkgJiYKKwkJCQkJdm9sLT5tYWpvcl92ZXIgJiYgdm9sLT5tYWpvcl92ZXIgPCAzKQorCQkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiTm90IGVuYWJsaW5nIHNwYXJzZSAiCisJCQkJCQkic3VwcG9ydCBkdWUgdG8gTlRGUyB2b2x1bWUgIgorCQkJCQkJInZlcnNpb24gJWkuJWkgKG5lZWQgYXQgbGVhc3QgIgorCQkJCQkJInZlcnNpb24gMy4wKS4iLCB2b2wtPm1ham9yX3ZlciwKKwkJCQkJCXZvbC0+bWlub3JfdmVyKTsKKwkJCWVsc2UKKwkJCQlOVm9sU2V0U3BhcnNlRW5hYmxlZCh2b2wpOworCQl9CisJfQogCXJldHVybiBUUlVFOwogbmVlZHNfYXJnOgogCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRoZSAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuIiwgcCk7CkBAIC00ODAsNiArNDk4LDEyIEBACiAJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CiAJCQlyZXR1cm4gLUVST0ZTOwogCQl9CisJCWlmICghbnRmc19zdGFtcF91c25qcm5sKHZvbCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gc3RhbXAgdHJhbnNhdGlvbiBsb2cgIgorCQkJCQkiKCRVc25Kcm5sKSVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJcmV0dXJuIC1FUk9GUzsKKwkJfQogCX0gZWxzZSBpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgKCpmbGFncyAmIE1TX1JET05MWSkpIHsKIAkJLyogUmVtb3VudGluZyByZWFkLW9ubHkuICovCiAJCWlmICghTlZvbEVycm9ycyh2b2wpKSB7CkBAIC01MTYsMTYgKzU0MCwxOSBAQAogewogCS8qCiAJICogQ2hlY2sgdGhhdCBjaGVja3N1bSA9PSBzdW0gb2YgdTMyIHZhbHVlcyBmcm9tIGIgdG8gdGhlIGNoZWNrc3VtCi0JICogZmllbGQuIElmIGNoZWNrc3VtIGlzIHplcm8sIG5vIGNoZWNraW5nIGlzIGRvbmUuCisJICogZmllbGQuICBJZiBjaGVja3N1bSBpcyB6ZXJvLCBubyBjaGVja2luZyBpcyBkb25lLiAgV2Ugd2lsbCB3b3JrIHdoZW4KKwkgKiB0aGUgY2hlY2tzdW0gdGVzdCBmYWlscywgc2luY2Ugc29tZSB1dGlsaXRpZXMgdXBkYXRlIHRoZSBib290IHNlY3RvcgorCSAqIGlnbm9yaW5nIHRoZSBjaGVja3N1bSB3aGljaCBsZWF2ZXMgdGhlIGNoZWNrc3VtIG91dC1vZi1kYXRlLiAgV2UKKwkgKiByZXBvcnQgYSB3YXJuaW5nIGlmIHRoaXMgaXMgdGhlIGNhc2UuCiAJICovCi0JaWYgKCh2b2lkKiliIDwgKHZvaWQqKSZiLT5jaGVja3N1bSAmJiBiLT5jaGVja3N1bSkgeworCWlmICgodm9pZCopYiA8ICh2b2lkKikmYi0+Y2hlY2tzdW0gJiYgYi0+Y2hlY2tzdW0gJiYgIXNpbGVudCkgewogCQlsZTMyICp1OwogCQl1MzIgaTsKIAogCQlmb3IgKGkgPSAwLCB1ID0gKGxlMzIqKWI7IHUgPCAobGUzMiopKCZiLT5jaGVja3N1bSk7ICsrdSkKIAkJCWkgKz0gbGUzMl90b19jcHVwKHUpOwogCQlpZiAobGUzMl90b19jcHUoYi0+Y2hlY2tzdW0pICE9IGkpCi0JCQlnb3RvIG5vdF9udGZzOworCQkJbnRmc193YXJuaW5nKHNiLCAiSW52YWxpZCBib290IHNlY3RvciBjaGVja3N1bS4iKTsKIAl9CiAJLyogQ2hlY2sgT0VNaWRlbnRpZmllciBpcyAiTlRGUyAgICAiICovCiAJaWYgKGItPm9lbV9pZCAhPSBtYWdpY05URlMpCkBAIC01NDEsOSArNTY4LDkgQEAKIAlkZWZhdWx0OgogCQlnb3RvIG5vdF9udGZzOwogCX0KLQkvKiBDaGVjayB0aGUgY2x1c3RlciBzaXplIGlzIG5vdCBhYm92ZSA2NTUzNiBieXRlcy4gKi8KKwkvKiBDaGVjayB0aGUgY2x1c3RlciBzaXplIGlzIG5vdCBhYm92ZSB0aGUgbWF4aW11bSAoNjRraUIpLiAqLwogCWlmICgodTMyKWxlMTZfdG9fY3B1KGItPmJwYi5ieXRlc19wZXJfc2VjdG9yKSAqCi0JCQliLT5icGIuc2VjdG9yc19wZXJfY2x1c3RlciA+IDB4MTAwMDApCisJCQliLT5icGIuc2VjdG9yc19wZXJfY2x1c3RlciA+IE5URlNfTUFYX0NMVVNURVJfU0laRSkKIAkJZ290byBub3RfbnRmczsKIAkvKiBDaGVjayByZXNlcnZlZC91bnVzZWQgZmllbGRzIGFyZSByZWFsbHkgemVyby4gKi8KIAlpZiAobGUxNl90b19jcHUoYi0+YnBiLnJlc2VydmVkX3NlY3RvcnMpIHx8CkBAIC01NzUsNyArNjAyLDcgQEAKIAkgKiBtYW55IEJJT1NlcyB3aWxsIHJlZnVzZSB0byBib290IGZyb20gYSBib290c2VjdG9yIGlmIHRoZSBtYWdpYyBpcwogCSAqIGluY29ycmVjdCwgc28gd2UgZW1pdCBhIHdhcm5pbmcuCiAJICovCi0JaWYgKCFzaWxlbnQgJiYgYi0+ZW5kX29mX3NlY3Rvcl9tYXJrZXIgIT0gY3B1X3RvX2xlMTYoMHhhYTU1KSkKKwlpZiAoIXNpbGVudCAmJiBiLT5lbmRfb2Zfc2VjdG9yX21hcmtlciAhPSBjb25zdF9jcHVfdG9fbGUxNigweGFhNTUpKQogCQludGZzX3dhcm5pbmcoc2IsICJJbnZhbGlkIGVuZCBvZiBzZWN0b3IgbWFya2VyLiIpOwogCXJldHVybiBUUlVFOwogbm90X250ZnM6CkBAIC05NjcsNiArOTk0LDcgQEAKIAl0bXBfbmkgPSBOVEZTX0kodG1wX2lubyk7CiAJLyogVGhlICRNRlRNaXJyLCBsaWtlIHRoZSAkTUZUIGlzIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0ZWQuICovCiAJTklub1NldE1zdFByb3RlY3RlZCh0bXBfbmkpOworCU5Jbm9TZXRTcGFyc2VEaXNhYmxlZCh0bXBfbmkpOwogCS8qCiAJICogU2V0IHVwIG91ciBsaXR0bGUgY2hlYXQgYWxsb3dpbmcgdXMgdG8gcmV1c2UgdGhlIGFzeW5jIHJlYWQgaW8KIAkgKiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGRpcmVjdG9yaWVzLgpAQCAtOTkwLDEyICsxMDE4LDEyIEBACiAgKi8KIHN0YXRpYyBCT09MIGNoZWNrX21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCkKIHsKLQl1bnNpZ25lZCBsb25nIGluZGV4OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOwogCW50ZnNfaW5vZGUgKm1pcnJfbmk7CiAJc3RydWN0IHBhZ2UgKm1mdF9wYWdlLCAqbWlycl9wYWdlOwogCXU4ICprbWZ0LCAqa21pcnI7CiAJcnVubGlzdF9lbGVtZW50ICpybCwgcmwyWzJdOworCXBnb2ZmX3QgaW5kZXg7CiAJaW50IG1yZWNzX3Blcl9wYWdlLCBpOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CkBAIC0xMTIyLDExICsxMTUwLDEzMCBAQAogCQkvKiBudGZzX2NoZWNrX2xvZ2ZpbGUoKSB3aWxsIGhhdmUgZGlzcGxheWVkIGVycm9yIG91dHB1dC4gKi8KIAkJcmV0dXJuIEZBTFNFOwogCX0KKwlOSW5vU2V0U3BhcnNlRGlzYWJsZWQoTlRGU19JKHRtcF9pbm8pKTsKIAl2b2wtPmxvZ2ZpbGVfaW5vID0gdG1wX2lubzsKIAludGZzX2RlYnVnKCJEb25lLiIpOwogCXJldHVybiBUUlVFOwogfQogCisjZGVmaW5lIE5URlNfSElCRVJGSUxfSEVBREVSX1NJWkUJNDA5NgorCisvKioKKyAqIGNoZWNrX3dpbmRvd3NfaGliZXJuYXRpb25fc3RhdHVzIC0gY2hlY2sgaWYgV2luZG93cyBpcyBzdXNwZW5kZWQgb24gYSB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgc3VwZXIgYmxvY2sgb2YgZGV2aWNlIHRvIGNoZWNrCisgKgorICogQ2hlY2sgaWYgV2luZG93cyBpcyBoaWJlcm5hdGVkIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sLiAgVGhpcyBpcyBkb25lIGJ5CisgKiBsb29raW5nIGZvciB0aGUgZmlsZSBoaWJlcmZpbC5zeXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSB2b2x1bWUuICBJZgorICogdGhlIGZpbGUgaXMgbm90IHByZXNlbnQgV2luZG93cyBpcyBkZWZpbml0ZWx5IG5vdCBzdXNwZW5kZWQuCisgKgorICogSWYgaGliZXJmaWwuc3lzIGV4aXN0cyBhbmQgaXMgbGVzcyB0aGFuIDRraUIgaW4gc2l6ZSBpdCBtZWFucyBXaW5kb3dzIGlzCisgKiBkZWZpbml0ZWx5IHN1c3BlbmRlZCAodGhpcyB2b2x1bWUgaXMgbm90IHRoZSBzeXN0ZW0gdm9sdW1lKS4gIENhdmVhdDogIG9uIGEKKyAqIHN5c3RlbSB3aXRoIG1hbnkgdm9sdW1lcyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSA8IDRraUIgY2hlY2sgaXMgYm9ndXMgYnV0CisgKiBmb3Igbm93IHRoaXMgc2hvdWxkIGRvIGZpbmUuCisgKgorICogSWYgaGliZXJmaWwuc3lzIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gNGtpQiBpbiBzaXplLCB3ZSBuZWVkIHRvIHJlYWQgdGhlCisgKiBoaWJlcmZpbCBoZWFkZXIgKHdoaWNoIGlzIHRoZSBmaXJzdCA0a2lCKS4gIElmIHRoaXMgYmVnaW5zIHdpdGggImhpYnIiLAorICogV2luZG93cyBpcyBkZWZpbml0ZWx5IHN1c3BlbmRlZC4gIElmIGl0IGlzIGNvbXBsZXRlbHkgZnVsbCBvZiB6ZXJvZXMsCisgKiBXaW5kb3dzIGlzIGRlZmluaXRlbHkgbm90IGhpYmVybmF0ZWQuICBBbnkgb3RoZXIgY2FzZSBpcyB0cmVhdGVkIGFzIGlmCisgKiBXaW5kb3dzIGlzIHN1c3BlbmRlZC4gIFRoaXMgY2F0ZXJzIGZvciB0aGUgYWJvdmUgbWVudGlvbmVkIGNhdmVhdCBvZiBhCisgKiBzeXN0ZW0gd2l0aCBtYW55IHZvbHVtZXMgd2hlcmUgbm8gImhpYnIiIG1hZ2ljIHdvdWxkIGJlIHByZXNlbnQgYW5kIHRoZXJlIGlzCisgKiBubyB6ZXJvIGhlYWRlci4KKyAqCisgKiBSZXR1cm4gMCBpZiBXaW5kb3dzIGlzIG5vdCBoaWJlcm5hdGVkIG9uIHRoZSB2b2x1bWUsID4wIGlmIFdpbmRvd3MgaXMKKyAqIGhpYmVybmF0ZWQgb24gdGhlIHZvbHVtZSwgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBjaGVja193aW5kb3dzX2hpYmVybmF0aW9uX3N0YXR1cyhudGZzX3ZvbHVtZSAqdm9sKQoreworCU1GVF9SRUYgbXJlZjsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfaW5vZGUgKm5pOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUzMiAqa2FkZHIsICprZW5kOworCW50ZnNfbmFtZSAqbmFtZSA9IE5VTEw7CisJaW50IHJldCA9IDE7CisJc3RhdGljIGNvbnN0IG50ZnNjaGFyIGhpYmVyZmlsWzEzXSA9IHsgY29uc3RfY3B1X3RvX2xlMTYoJ2gnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdpJyksIGNvbnN0X2NwdV90b19sZTE2KCdiJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignZScpLCBjb25zdF9jcHVfdG9fbGUxNigncicpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ2YnKSwgY29uc3RfY3B1X3RvX2xlMTYoJ2knKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdsJyksIGNvbnN0X2NwdV90b19sZTE2KCcuJyksCisJCQljb25zdF9jcHVfdG9fbGUxNigncycpLCBjb25zdF9jcHVfdG9fbGUxNigneScpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ3MnKSwgMCB9OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyoKKwkgKiBGaW5kIHRoZSBpbm9kZSBudW1iZXIgZm9yIHRoZSBoaWJlcm5hdGlvbiBmaWxlIGJ5IGxvb2tpbmcgdXAgdGhlCisJICogZmlsZW5hbWUgaGliZXJmaWwuc3lzIGluIHRoZSByb290IGRpcmVjdG9yeS4KKwkgKi8KKwlkb3duKCZ2b2wtPnJvb3RfaW5vLT5pX3NlbSk7CisJbXJlZiA9IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoTlRGU19JKHZvbC0+cm9vdF9pbm8pLCBoaWJlcmZpbCwgMTIsCisJCQkmbmFtZSk7CisJdXAoJnZvbC0+cm9vdF9pbm8tPmlfc2VtKTsKKwlpZiAoSVNfRVJSX01SRUYobXJlZikpIHsKKwkJcmV0ID0gTVJFRl9FUlIobXJlZik7CisJCS8qIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBXaW5kb3dzIGlzIG5vdCBoaWJlcm5hdGVkLiAqLworCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZGVidWcoImhpYmVyZmlsLnN5cyBub3QgcHJlc2VudC4gIFdpbmRvd3MgaXMgbm90ICIKKwkJCQkJImhpYmVybmF0ZWQgb24gdGhlIHZvbHVtZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEEgcmVhbCBlcnJvciBvY2N1cmVkLiAqLworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBpbm9kZSBudW1iZXIgZm9yICIKKwkJCQkiaGliZXJmaWwuc3lzLiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBXZSBkbyBub3QgY2FyZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB3YXMgZm91bmQuICovCisJa2ZyZWUobmFtZSk7CisJLyogR2V0IHRoZSBpbm9kZS4gKi8KKwl2aSA9IG50ZnNfaWdldCh2b2wtPnNiLCBNUkVGKG1yZWYpKTsKKwlpZiAoSVNfRVJSKHZpKSB8fCBpc19iYWRfaW5vZGUodmkpKSB7CisJCWlmICghSVNfRVJSKHZpKSkKKwkJCWlwdXQodmkpOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCBoaWJlcmZpbC5zeXMuIik7CisJCXJldHVybiBJU19FUlIodmkpID8gUFRSX0VSUih2aSkgOiAtRUlPOworCX0KKwlpZiAodW5saWtlbHkoaV9zaXplX3JlYWQodmkpIDwgTlRGU19ISUJFUkZJTF9IRUFERVJfU0laRSkpIHsKKwkJbnRmc19kZWJ1ZygiaGliZXJmaWwuc3lzIGlzIHNtYWxsZXIgdGhhbiA0a2lCICgweCVsbHgpLiAgIgorCQkJCSJXaW5kb3dzIGlzIGhpYmVybmF0ZWQgb24gdGhlIHZvbHVtZS4gIFRoaXMgIgorCQkJCSJpcyBub3QgdGhlIHN5c3RlbSB2b2x1bWUuIiwgaV9zaXplX3JlYWQodmkpKTsKKwkJZ290byBpcHV0X291dDsKKwl9CisJbmkgPSBOVEZTX0kodmkpOworCXBhZ2UgPSBudGZzX21hcF9wYWdlKHZpLT5pX21hcHBpbmcsIDApOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBoaWJlcmZpbC5zeXMuIik7CisJCXJldCA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gaXB1dF9vdXQ7CisJfQorCWthZGRyID0gKHUzMiopcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmICgqKGxlMzIqKWthZGRyID09IGNvbnN0X2NwdV90b19sZTMyKDB4NzI2MjY5NjgpLyonaGlicicqLykgeworCQludGZzX2RlYnVnKCJNYWdpYyBcImhpYnJcIiBmb3VuZCBpbiBoaWJlcmZpbC5zeXMuICBXaW5kb3dzIGlzICIKKwkJCQkiaGliZXJuYXRlZCBvbiB0aGUgdm9sdW1lLiAgVGhpcyBpcyB0aGUgIgorCQkJCSJzeXN0ZW0gdm9sdW1lLiIpOworCQlnb3RvIHVubV9pcHV0X291dDsKKwl9CisJa2VuZCA9IGthZGRyICsgTlRGU19ISUJFUkZJTF9IRUFERVJfU0laRS9zaXplb2YoKmthZGRyKTsKKwlkbyB7CisJCWlmICh1bmxpa2VseSgqa2FkZHIpKSB7CisJCQludGZzX2RlYnVnKCJoaWJlcmZpbC5zeXMgaXMgbGFyZ2VyIHRoYW4gNGtpQiAiCisJCQkJCSIoMHglbGx4KSwgZG9lcyBub3QgY29udGFpbiB0aGUgIgorCQkJCQkiXCJoaWJyXCIgbWFnaWMsIGFuZCBkb2VzIG5vdCBoYXZlIGEgIgorCQkJCQkiemVybyBoZWFkZXIuICBXaW5kb3dzIGlzIGhpYmVybmF0ZWQgIgorCQkJCQkib24gdGhlIHZvbHVtZS4gIFRoaXMgaXMgbm90IHRoZSAiCisJCQkJCSJzeXN0ZW0gdm9sdW1lLiIsIGlfc2l6ZV9yZWFkKHZpKSk7CisJCQlnb3RvIHVubV9pcHV0X291dDsKKwkJfQorCX0gd2hpbGUgKCsra2FkZHIgPCBrZW5kKTsKKwludGZzX2RlYnVnKCJoaWJlcmZpbC5zeXMgY29udGFpbnMgYSB6ZXJvIGhlYWRlci4gIFdpbmRvd3MgaXMgbm90ICIKKwkJCSJoaWJlcm5hdGVkIG9uIHRoZSB2b2x1bWUuICBUaGlzIGlzIHRoZSBzeXN0ZW0gIgorCQkJInZvbHVtZS4iKTsKKwlyZXQgPSAwOwordW5tX2lwdXRfb3V0OgorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKK2lwdXRfb3V0OgorCWlwdXQodmkpOworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogbG9hZF9hbmRfaW5pdF9xdW90YSAtIGxvYWQgYW5kIHNldHVwIHRoZSBxdW90YSBmaWxlIGZvciBhIHZvbHVtZSBpZiBwcmVzZW50CiAgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIHF1b3RhIGZpbGUgdG8gbG9hZApAQCAtMTE3NSw4ICsxMzIyLDcgQEAKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAkvKiBXZSBkbyBub3QgY2FyZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB3YXMgZm91bmQuICovCi0JaWYgKG5hbWUpCi0JCWtmcmVlKG5hbWUpOworCWtmcmVlKG5hbWUpOwogCS8qIEdldCB0aGUgaW5vZGUuICovCiAJdG1wX2lubyA9IG50ZnNfaWdldCh2b2wtPnNiLCBNUkVGKG1yZWYpKTsKIAlpZiAoSVNfRVJSKHRtcF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh0bXBfaW5vKSkgewpAQCAtMTE5OCw2ICsxMzQ0LDE2NyBAQAogfQogCiAvKioKKyAqIGxvYWRfYW5kX2luaXRfdXNuanJubCAtIGxvYWQgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbiBsb2cgaWYgcHJlc2VudAorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSB1c25qcm5sIGZpbGUgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKgorICogSWYgJFVzbkpybmwgaXMgbm90IHByZXNlbnQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzYWJsZWQsIHdlIHNldAorICogTlZvbFVzbkpybmxTdGFtcGVkKCkgYW5kIHJldHVybiBzdWNjZXNzLgorICoKKyAqIElmIHRoZSAkVXNuSnJubCAkREFUQS8kSiBhdHRyaWJ1dGUgaGFzIGEgc2l6ZSBlcXVhbCB0byB0aGUgbG93ZXN0IHZhbGlkIHVzbiwKKyAqIGkuZS4gdHJhbnNhY3Rpb24gbG9nZ2luZyBoYXMgb25seSBqdXN0IGJlZW4gZW5hYmxlZCBvciB0aGUgam91cm5hbCBoYXMgYmVlbgorICogc3RhbXBlZCBhbmQgbm90aGluZyBoYXMgYmVlbiBsb2dnZWQgc2luY2UsIHdlIGFsc28gc2V0IE5Wb2xVc25Kcm5sU3RhbXBlZCgpCisgKiBhbmQgcmV0dXJuIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfdXNuanJubChudGZzX3ZvbHVtZSAqdm9sKQoreworCU1GVF9SRUYgbXJlZjsKKwlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CisJbnRmc19pbm9kZSAqdG1wX25pOworCXN0cnVjdCBwYWdlICpwYWdlOworCW50ZnNfbmFtZSAqbmFtZSA9IE5VTEw7CisJVVNOX0hFQURFUiAqdWg7CisJc3RhdGljIGNvbnN0IG50ZnNjaGFyIFVzbkpybmxbOV0gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignVScpLCBjb25zdF9jcHVfdG9fbGUxNigncycpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ24nKSwgY29uc3RfY3B1X3RvX2xlMTYoJ0onKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdyJyksIGNvbnN0X2NwdV90b19sZTE2KCduJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignbCcpLCAwIH07CisJc3RhdGljIG50ZnNjaGFyIE1heFs1XSA9IHsgY29uc3RfY3B1X3RvX2xlMTYoJyQnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdNJyksIGNvbnN0X2NwdV90b19sZTE2KCdhJyksCisJCQljb25zdF9jcHVfdG9fbGUxNigneCcpLCAwIH07CisJc3RhdGljIG50ZnNjaGFyIEpbM10gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignSicpLCAwIH07CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKgorCSAqIEZpbmQgdGhlIGlub2RlIG51bWJlciBmb3IgdGhlIHRyYW5zYWN0aW9uIGxvZyBmaWxlIGJ5IGxvb2tpbmcgdXAgdGhlCisJICogZmlsZW5hbWUgJFVzbkpybmwgaW4gdGhlIGV4dGVuZGVkIHN5c3RlbSBmaWxlcyBkaXJlY3RvcnkgJEV4dGVuZC4KKwkgKi8KKwlkb3duKCZ2b2wtPmV4dGVuZF9pbm8tPmlfc2VtKTsKKwltcmVmID0gbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShOVEZTX0kodm9sLT5leHRlbmRfaW5vKSwgVXNuSnJubCwgOCwKKwkJCSZuYW1lKTsKKwl1cCgmdm9sLT5leHRlbmRfaW5vLT5pX3NlbSk7CisJaWYgKElTX0VSUl9NUkVGKG1yZWYpKSB7CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0cmFuc2FjdGlvbiBsb2dnaW5nIGlzIGRpc2FibGVkLAorCQkgKiBqdXN0IHJldHVybiBzdWNjZXNzLgorCQkgKi8KKwkJaWYgKE1SRUZfRVJSKG1yZWYpID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZGVidWcoIiRVc25Kcm5sIG5vdCBwcmVzZW50LiAgVm9sdW1lIGRvZXMgbm90ICIKKwkJCQkJImhhdmUgdHJhbnNhY3Rpb24gbG9nZ2luZyBlbmFibGVkLiIpOworbm90X2VuYWJsZWQ6CisJCQkvKgorCQkJICogTm8gbmVlZCB0byB0cnkgdG8gc3RhbXAgdGhlIHRyYW5zYWN0aW9uIGxvZyBpZgorCQkJICogdHJhbnNhY3Rpb24gbG9nZ2luZyBpcyBub3QgZW5hYmxlZC4KKwkJCSAqLworCQkJTlZvbFNldFVzbkpybmxTdGFtcGVkKHZvbCk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQkvKiBBIHJlYWwgZXJyb3Igb2NjdXJlZC4gKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgaW5vZGUgbnVtYmVyIGZvciAiCisJCQkJIiRVc25Kcm5sLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFdlIGRvIG5vdCBjYXJlIGZvciB0aGUgdHlwZSBvZiBtYXRjaCB0aGF0IHdhcyBmb3VuZC4gKi8KKwlrZnJlZShuYW1lKTsKKwkvKiBHZXQgdGhlIGlub2RlLiAqLworCXRtcF9pbm8gPSBudGZzX2lnZXQodm9sLT5zYiwgTVJFRihtcmVmKSk7CisJaWYgKHVubGlrZWx5KElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpKSB7CisJCWlmICghSVNfRVJSKHRtcF9pbm8pKQorCQkJaXB1dCh0bXBfaW5vKTsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgJFVzbkpybmwuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT51c25qcm5sX2lubyA9IHRtcF9pbm87CisJLyoKKwkgKiBJZiB0aGUgdHJhbnNhY3Rpb24gbG9nIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlbGV0ZWQsIHdlIGNhbgorCSAqIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAodW5saWtlbHkodm9sLT52b2xfZmxhZ3MgJiBWT0xVTUVfREVMRVRFX1VTTl9VTkRFUldBWSkpIHsKKwkJbnRmc19kZWJ1ZygiJFVzbkpybmwgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzYWJsZWQuICAiCisJCQkJIlZvbHVtZSBkb2VzIG5vdCBoYXZlIHRyYW5zYWN0aW9uIGxvZ2dpbmcgIgorCQkJCSJlbmFibGVkLiIpOworCQlnb3RvIG5vdF9lbmFibGVkOworCX0KKwkvKiBHZXQgdGhlICREQVRBLyRNYXggYXR0cmlidXRlLiAqLworCXRtcF9pbm8gPSBudGZzX2F0dHJfaWdldCh2b2wtPnVzbmpybmxfaW5vLCBBVF9EQVRBLCBNYXgsIDQpOworCWlmIChJU19FUlIodG1wX2lubykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgJFVzbkpybmwvJERBVEEvJE1heCAiCisJCQkJImF0dHJpYnV0ZS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPnVzbmpybmxfbWF4X2lubyA9IHRtcF9pbm87CisJaWYgKHVubGlrZWx5KGlfc2l6ZV9yZWFkKHRtcF9pbm8pIDwgc2l6ZW9mKFVTTl9IRUFERVIpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGb3VuZCBjb3JydXB0ICRVc25Kcm5sLyREQVRBLyRNYXggIgorCQkJCSJhdHRyaWJ1dGUgKHNpemUgaXMgMHglbGx4IGJ1dCBzaG91bGQgYmUgYXQgIgorCQkJCSJsZWFzdCAweCV4IGJ5dGVzKS4iLCBpX3NpemVfcmVhZCh0bXBfaW5vKSwKKwkJCQlzaXplb2YoVVNOX0hFQURFUikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIEdldCB0aGUgJERBVEEvJEogYXR0cmlidXRlLiAqLworCXRtcF9pbm8gPSBudGZzX2F0dHJfaWdldCh2b2wtPnVzbmpybmxfaW5vLCBBVF9EQVRBLCBKLCAyKTsKKwlpZiAoSVNfRVJSKHRtcF9pbm8pKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBsb2FkICRVc25Kcm5sLyREQVRBLyRKICIKKwkJCQkiYXR0cmlidXRlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+dXNuanJubF9qX2lubyA9IHRtcF9pbm87CisJLyogVmVyaWZ5ICRKIGlzIG5vbi1yZXNpZGVudCBhbmQgc3BhcnNlLiAqLworCXRtcF9uaSA9IE5URlNfSSh2b2wtPnVzbmpybmxfal9pbm8pOworCWlmICh1bmxpa2VseSghTklub05vblJlc2lkZW50KHRtcF9uaSkgfHwgIU5Jbm9TcGFyc2UodG1wX25pKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJFVzbkpybmwvJERBVEEvJEogYXR0cmlidXRlIGlzIHJlc2lkZW50ICIKKwkJCQkiYW5kL29yIG5vdCBzcGFyc2UuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogUmVhZCB0aGUgVVNOX0hFQURFUiBmcm9tICREQVRBLyRNYXguICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT51c25qcm5sX21heF9pbm8tPmlfbWFwcGluZywgMCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tICRVc25Kcm5sLyREQVRBLyRNYXggIgorCQkJCSJhdHRyaWJ1dGUuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdWggPSAoVVNOX0hFQURFUiopcGFnZV9hZGRyZXNzKHBhZ2UpOworCS8qIFNhbml0eSBjaGVjayB0aGUgJE1heC4gKi8KKwlpZiAodW5saWtlbHkoc2xlNjRfdG9fY3B1KHVoLT5hbGxvY2F0aW9uX2RlbHRhKSA+CisJCQlzbGU2NF90b19jcHUodWgtPm1heGltdW1fc2l6ZSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkFsbG9jYXRpb24gZGVsdGEgKDB4JWxseCkgZXhjZWVkcyAiCisJCQkJIm1heGltdW0gc2l6ZSAoMHglbGx4KS4gICRVc25Kcm5sIGlzIGNvcnJ1cHQuIiwKKwkJCQkobG9uZyBsb25nKXNsZTY0X3RvX2NwdSh1aC0+YWxsb2NhdGlvbl9kZWx0YSksCisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUodWgtPm1heGltdW1fc2l6ZSkpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBJZiB0aGUgdHJhbnNhY3Rpb24gbG9nIGhhcyBiZWVuIHN0YW1wZWQgYW5kIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbgorCSAqIHRvIGl0IHNpbmNlLCB3ZSBkbyBub3QgbmVlZCB0byBzdGFtcCBpdC4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2xlNjRfdG9fY3B1KHVoLT5sb3dlc3RfdmFsaWRfdXNuKSA+PQorCQkJaV9zaXplX3JlYWQodm9sLT51c25qcm5sX2pfaW5vKSkpIHsKKwkJaWYgKGxpa2VseShzbGU2NF90b19jcHUodWgtPmxvd2VzdF92YWxpZF91c24pID09CisJCQkJaV9zaXplX3JlYWQodm9sLT51c25qcm5sX2pfaW5vKSkpIHsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCW50ZnNfZGVidWcoIiRVc25Kcm5sIGlzIGVuYWJsZWQgYnV0IG5vdGhpbmcgaGFzIGJlZW4gIgorCQkJCQkibG9nZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IHN0YW1wZWQuICAiCisJCQkJCSJUcmVhdGluZyB0aGlzIGFzIGlmIHRoZSB2b2x1bWUgZG9lcyAiCisJCQkJCSJub3QgaGF2ZSB0cmFuc2FjdGlvbiBsb2dnaW5nICIKKwkJCQkJImVuYWJsZWQuIik7CisJCQlnb3RvIG5vdF9lbmFibGVkOworCQl9CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRVc25Kcm5sIGhhcyBsb3dlc3QgdmFsaWQgdXNuICgweCVsbHgpICIKKwkJCQkid2hpY2ggaXMgb3V0IG9mIGJvdW5kcyAoMHglbGx4KS4gICRVc25Kcm5sICIKKwkJCQkiaXMgY29ycnVwdC4iLAorCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KHVoLT5sb3dlc3RfdmFsaWRfdXNuKSwKKwkJCQlpX3NpemVfcmVhZCh2b2wtPnVzbmpybmxfal9pbm8pKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKICAqIGxvYWRfYW5kX2luaXRfYXR0cmRlZiAtIGxvYWQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyB0YWJsZSBmb3IgYSB2b2x1bWUKICAqIEB2b2w6CW50ZnMgc3VwZXIgYmxvY2sgZGVzY3JpYmluZyBkZXZpY2Ugd2hvc2UgYXR0cmRlZiB0byBsb2FkCiAgKgpAQCAtMTIwNSwxMCArMTUxMiwxMSBAQAogICovCiBzdGF0aWMgQk9PTCBsb2FkX2FuZF9pbml0X2F0dHJkZWYobnRmc192b2x1bWUgKnZvbCkKIHsKKwlsb2ZmX3QgaV9zaXplOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOwogCXN0cnVjdCBpbm9kZSAqaW5vOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwlwZ29mZl90IGluZGV4LCBtYXhfaW5kZXg7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKQEAgLTEyMTksMTQgKzE1MjcsMTYgQEAKIAkJCWlwdXQoaW5vKTsKIAkJZ290byBmYWlsZWQ7CiAJfQorCU5Jbm9TZXRTcGFyc2VEaXNhYmxlZChOVEZTX0koaW5vKSk7CiAJLyogVGhlIHNpemUgb2YgRklMRV9BdHRyRGVmIG11c3QgYmUgYWJvdmUgMCBhbmQgZml0IGluc2lkZSAzMSBiaXRzLiAqLwotCWlmICghaW5vLT5pX3NpemUgfHwgaW5vLT5pX3NpemUgPiAweDdmZmZmZmZmKQorCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlubyk7CisJaWYgKGlfc2l6ZSA8PSAwIHx8IGlfc2l6ZSA+IDB4N2ZmZmZmZmYpCiAJCWdvdG8gaXB1dF9mYWlsZWQ7Ci0Jdm9sLT5hdHRyZGVmID0gKEFUVFJfREVGKiludGZzX21hbGxvY19ub2ZzKGluby0+aV9zaXplKTsKKwl2b2wtPmF0dHJkZWYgPSAoQVRUUl9ERUYqKW50ZnNfbWFsbG9jX25vZnMoaV9zaXplKTsKIAlpZiAoIXZvbC0+YXR0cmRlZikKIAkJZ290byBpcHV0X2ZhaWxlZDsKIAlpbmRleCA9IDA7Ci0JbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwltYXhfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgewogCQkvKiBSZWFkIHRoZSBhdHRyZGVmIHRhYmxlIGFuZCBjb3B5IGl0IGludG8gdGhlIGxpbmVhciBidWZmZXIuICovCkBAIC0xMjM5LDEyICsxNTQ5LDEyIEBACiAJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKIAl9OwogCWlmIChzaXplID09IFBBR0VfQ0FDSEVfU0laRSkgewotCQlzaXplID0gaW5vLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzaXplID0gaV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKIAkJaWYgKHNpemUpCiAJCQlnb3RvIHJlYWRfcGFydGlhbF9hdHRyZGVmX3BhZ2U7CiAJfQotCXZvbC0+YXR0cmRlZl9zaXplID0gaW5vLT5pX3NpemU7Ci0JbnRmc19kZWJ1ZygiUmVhZCAlbGx1IGJ5dGVzIGZyb20gJEF0dHJEZWYuIiwgaW5vLT5pX3NpemUpOworCXZvbC0+YXR0cmRlZl9zaXplID0gaV9zaXplOworCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRBdHRyRGVmLiIsIGlfc2l6ZSk7CiAJaXB1dChpbm8pOwogCXJldHVybiBUUlVFOwogZnJlZV9pcHV0X2ZhaWxlZDoKQEAgLTEyNjcsMTAgKzE1NzcsMTEgQEAKICAqLwogc3RhdGljIEJPT0wgbG9hZF9hbmRfaW5pdF91cGNhc2UobnRmc192b2x1bWUgKnZvbCkKIHsKKwlsb2ZmX3QgaV9zaXplOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOwogCXN0cnVjdCBpbm9kZSAqaW5vOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwlwZ29mZl90IGluZGV4LCBtYXhfaW5kZXg7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJaW50IGksIG1heDsKIApAQCAtMTI4NiwxNCArMTU5NywxNSBAQAogCSAqIFRoZSB1cGNhc2Ugc2l6ZSBtdXN0IG5vdCBiZSBhYm92ZSA2NGsgVW5pY29kZSBjaGFyYWN0ZXJzLCBtdXN0IG5vdAogCSAqIGJlIHplcm8gYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YobnRmc2NoYXIpLgogCSAqLwotCWlmICghaW5vLT5pX3NpemUgfHwgaW5vLT5pX3NpemUgJiAoc2l6ZW9mKG50ZnNjaGFyKSAtIDEpIHx8Ci0JCQlpbm8tPmlfc2l6ZSA+IDY0VUxMICogMTAyNCAqIHNpemVvZihudGZzY2hhcikpCisJaV9zaXplID0gaV9zaXplX3JlYWQoaW5vKTsKKwlpZiAoIWlfc2l6ZSB8fCBpX3NpemUgJiAoc2l6ZW9mKG50ZnNjaGFyKSAtIDEpIHx8CisJCQlpX3NpemUgPiA2NFVMTCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKQogCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKLQl2b2wtPnVwY2FzZSA9IChudGZzY2hhciopbnRmc19tYWxsb2Nfbm9mcyhpbm8tPmlfc2l6ZSk7CisJdm9sLT51cGNhc2UgPSAobnRmc2NoYXIqKW50ZnNfbWFsbG9jX25vZnMoaV9zaXplKTsKIAlpZiAoIXZvbC0+dXBjYXNlKQogCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKIAlpbmRleCA9IDA7Ci0JbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwltYXhfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgewogCQkvKiBSZWFkIHRoZSB1cGNhc2UgdGFibGUgYW5kIGNvcHkgaXQgaW50byB0aGUgbGluZWFyIGJ1ZmZlci4gKi8KQEAgLTEzMDYsMTMgKzE2MTgsMTMgQEAKIAkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOwogCX07CiAJaWYgKHNpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCXNpemUgPSBpbm8tPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCXNpemUgPSBpX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwogCQlpZiAoc2l6ZSkKIAkJCWdvdG8gcmVhZF9wYXJ0aWFsX3VwY2FzZV9wYWdlOwogCX0KLQl2b2wtPnVwY2FzZV9sZW4gPSBpbm8tPmlfc2l6ZSA+PiBVQ0hBUl9UX1NJWkVfQklUUzsKKwl2b2wtPnVwY2FzZV9sZW4gPSBpX3NpemUgPj4gVUNIQVJfVF9TSVpFX0JJVFM7CiAJbnRmc19kZWJ1ZygiUmVhZCAlbGx1IGJ5dGVzIGZyb20gJFVwQ2FzZSAoZXhwZWN0ZWQgJXp1IGJ5dGVzKS4iLAotCQkJaW5vLT5pX3NpemUsIDY0ICogMTAyNCAqIHNpemVvZihudGZzY2hhcikpOworCQkJaV9zaXplLCA2NCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKTsKIAlpcHV0KGlubyk7CiAJZG93bigmbnRmc19sb2NrKTsKIAlpZiAoIWRlZmF1bHRfdXBjYXNlKSB7CkBAIC0xMzc2LDYgKzE2ODgsOSBAQAogCU1GVF9SRUNPUkQgKm07CiAJVk9MVU1FX0lORk9STUFUSU9OICp2aTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworI2lmZGVmIE5URlNfUlcKKwlpbnQgZXJyOworI2VuZGlmIC8qIE5URlNfUlcgKi8KIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwogI2lmZGVmIE5URlNfUlcKQEAgLTE0MzUsNyArMTc1MCw4IEBACiAJCQlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CiAJCWdvdG8gYml0bWFwX2ZhaWxlZDsKIAl9Ci0JaWYgKCh2b2wtPm5yX2NsdXN0ZXJzICsgNykgPj4gMyA+IHZvbC0+bGNuYm1wX2luby0+aV9zaXplKSB7CisJTklub1NldFNwYXJzZURpc2FibGVkKE5URlNfSSh2b2wtPmxjbmJtcF9pbm8pKTsKKwlpZiAoKHZvbC0+bnJfY2x1c3RlcnMgKyA3KSA+PiAzID4gaV9zaXplX3JlYWQodm9sLT5sY25ibXBfaW5vKSkgewogCQlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CiBiaXRtYXBfZmFpbGVkOgogCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJEJpdG1hcC4iKTsKQEAgLTE0ODYsNiArMTgwMiwxMiBAQAogCXVubWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOwogCXByaW50ayhLRVJOX0lORk8gIk5URlMgdm9sdW1lIHZlcnNpb24gJWkuJWkuXG4iLCB2b2wtPm1ham9yX3ZlciwKIAkJCXZvbC0+bWlub3JfdmVyKTsKKwlpZiAodm9sLT5tYWpvcl92ZXIgPCAzICYmIE5Wb2xTcGFyc2VFbmFibGVkKHZvbCkpIHsKKwkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJEaXNhYmxpbmcgc3BhcnNlIHN1cHBvcnQgZHVlIHRvIE5URlMgIgorCQkJCSJ2b2x1bWUgdmVyc2lvbiAlaS4laSAobmVlZCBhdCBsZWFzdCB2ZXJzaW9uICIKKwkJCQkiMy4wKS4iLCB2b2wtPm1ham9yX3Zlciwgdm9sLT5taW5vcl92ZXIpOworCQlOVm9sQ2xlYXJTcGFyc2VFbmFibGVkKHZvbCk7CisJfQogI2lmZGVmIE5URlNfUlcKIAkvKiBNYWtlIHN1cmUgdGhhdCBubyB1bnN1cHBvcnRlZCB2b2x1bWUgZmxhZ3MgYXJlIHNldC4gKi8KIAlpZiAodm9sLT52b2xfZmxhZ3MgJiBWT0xVTUVfTVVTVF9NT1VOVF9ST19NQVNLKSB7CkBAIC0xNTQ1LDYgKzE4NjcsNTAgQEAKIAkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCS8qIEdldCB0aGUgcm9vdCBkaXJlY3RvcnkgaW5vZGUgc28gd2UgY2FuIGRvIHBhdGggbG9va3Vwcy4gKi8KKwl2b2wtPnJvb3RfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX3Jvb3QpOworCWlmIChJU19FUlIodm9sLT5yb290X2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+cm9vdF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHZvbC0+cm9vdF9pbm8pKQorCQkJaXB1dCh2b2wtPnJvb3RfaW5vKTsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHJvb3QgZGlyZWN0b3J5LiIpOworCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCX0KKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBDaGVjayBpZiBXaW5kb3dzIGlzIHN1c3BlbmRlZCB0byBkaXNrIG9uIHRoZSB0YXJnZXQgdm9sdW1lLiAgSWYgaXQKKwkgKiBpcyBoaWJlcm5hdGVkLCB3ZSBtdXN0IG5vdCB3cml0ZSAqYW55dGhpbmcqIHRvIHRoZSBkaXNrIHNvIHNldAorCSAqIE5Wb2xFcnJvcnMoKSB3aXRob3V0IHNldHRpbmcgdGhlIGRpcnR5IHZvbHVtZSBmbGFnIGFuZCBtb3VudAorCSAqIHJlYWQtb25seS4gIFRoaXMgd2lsbCBwcmV2ZW50IHJlYWQtd3JpdGUgcmVtb3VudGluZyBhbmQgaXQgd2lsbCBhbHNvCisJICogcHJldmVudCBhbGwgd3JpdGVzLgorCSAqLworCWVyciA9IGNoZWNrX3dpbmRvd3NfaGliZXJuYXRpb25fc3RhdHVzKHZvbCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWEgPSAiRmFpbGVkIHRvIGRldGVybWluZSBpZiBXaW5kb3dzIGlzICIKKwkJCQkiaGliZXJuYXRlZCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczFiID0gIldpbmRvd3MgaXMgaGliZXJuYXRlZCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCQljb25zdCBjaGFyICplczE7CisKKwkJZXMxID0gZXJyIDwgMCA/IGVzMWEgOiBlczFiOworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCWVzMSwgZXMyKTsKKwkJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJfSBlbHNlCisJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCisJCQkJCSJyZWFkLXdyaXRlJXMiLCBlczEsIGVzMik7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQogCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBtYXJrIHRoZSB2b2x1bWUgZGlydHkuICovCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCiAJCQludGZzX3NldF92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfSVNfRElSVFkpKSB7CkBAIC0xNTU4LDcgKzE5MjQsNyBAQAogCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz1jb250aW51ZSBub3IgIgogCQkJCQkib25fZXJyb3JzPXJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKIAkJCQkJZXMxLCBlczIpOwotCQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKKwkJCWdvdG8gaXB1dF9yb290X2Vycl9vdXQ7CiAJCX0KIAkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOwpAQCAtMTU4NSw3ICsxOTUxLDcgQEAKIAkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKIAkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCiAJCQkJCWVzMSwgZXMyKTsKLQkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCQl9CiAJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKQEAgLTE2MDQsMjMgKzE5NzAsMTUgQEAKIAkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKIAkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCiAJCQkJCWVzMSwgZXMyKTsKLQkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCQl9CiAJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKIAkJTlZvbFNldEVycm9ycyh2b2wpOwogCX0KICNlbmRpZiAvKiBOVEZTX1JXICovCi0JLyogR2V0IHRoZSByb290IGRpcmVjdG9yeSBpbm9kZS4gKi8KLQl2b2wtPnJvb3RfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX3Jvb3QpOwotCWlmIChJU19FUlIodm9sLT5yb290X2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+cm9vdF9pbm8pKSB7Ci0JCWlmICghSVNfRVJSKHZvbC0+cm9vdF9pbm8pKQotCQkJaXB1dCh2b2wtPnJvb3RfaW5vKTsKLQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHJvb3QgZGlyZWN0b3J5LiIpOwotCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OwotCX0KIAkvKiBJZiBvbiBOVEZTIHZlcnNpb25zIGJlZm9yZSAzLjAsIHdlIGFyZSBkb25lLiAqLwotCWlmICh2b2wtPm1ham9yX3ZlciA8IDMpCisJaWYgKHVubGlrZWx5KHZvbC0+bWFqb3JfdmVyIDwgMykpCiAJCXJldHVybiBUUlVFOwogCS8qIE5URlMgMy4wKyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4gKi8KIAkvKiBHZXQgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGlub2RlLiAqLwpAQCAtMTYzMSw3ICsxOTg5LDcgQEAKIAkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRTZWN1cmUuIik7CiAJCWdvdG8gaXB1dF9yb290X2Vycl9vdXQ7CiAJfQotCS8vIEZJWE1FOiBJbml0aWFsaXplIHNlY3VyaXR5LgorCS8vIFRPRE86IEluaXRpYWxpemUgc2VjdXJpdHkuCiAJLyogR2V0IHRoZSBleHRlbmRlZCBzeXN0ZW0gZmlsZXMnIGRpcmVjdG9yeSBpbm9kZS4gKi8KIAl2b2wtPmV4dGVuZF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfRXh0ZW5kKTsKIAlpZiAoSVNfRVJSKHZvbC0+ZXh0ZW5kX2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+ZXh0ZW5kX2lubykpIHsKQEAgLTE2ODIsMTAgKzIwNDAsNjAgQEAKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9Ci0JLy8gVE9ETzogRGVsZXRlIG9yIGNoZWNrcG9pbnQgdGhlICRVc25Kcm5sIGlmIGl0IGV4aXN0cy4KKwkvKgorCSAqIEZpbmQgdGhlIHRyYW5zYWN0aW9uIGxvZyBmaWxlICgkVXNuSnJubCksIGxvYWQgaXQgaWYgcHJlc2VudCwgY2hlY2sKKwkgKiBpdCwgYW5kIHNldCBpdCB1cC4KKwkgKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfdXNuanJubCh2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIGxvYWQgJFVzbkpybmwiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCWVzMSwgZXMyKTsKKwkJCQlnb3RvIGlwdXRfdXNuanJubF9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJfSBlbHNlCisJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCisJCQkJCSJyZWFkLXdyaXRlJXMiLCBlczEsIGVzMik7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBzdGFtcCB0aGUgdHJhbnNhY3Rpb24gbG9nLiAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhbnRmc19zdGFtcF91c25qcm5sKHZvbCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gc3RhbXAgdHJhbnNhY3Rpb24gbG9nICIKKwkJCQkiKCRVc25Kcm5sKSI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCisJCS8qIENvbnZlcnQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz1jb250aW51ZSBub3IgIgorCQkJCQkib25fZXJyb3JzPXJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJZXMxLCBlczIpOworCQkJZ290byBpcHV0X3VzbmpybmxfZXJyX291dDsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CiAjZW5kaWYgLyogTlRGU19SVyAqLwogCXJldHVybiBUUlVFOwogI2lmZGVmIE5URlNfUlcKK2lwdXRfdXNuanJubF9lcnJfb3V0OgorCWlmICh2b2wtPnVzbmpybmxfal9pbm8pCisJCWlwdXQodm9sLT51c25qcm5sX2pfaW5vKTsKKwlpZiAodm9sLT51c25qcm5sX21heF9pbm8pCisJCWlwdXQodm9sLT51c25qcm5sX21heF9pbm8pOworCWlmICh2b2wtPnVzbmpybmxfaW5vKQorCQlpcHV0KHZvbC0+dXNuanJubF9pbm8pOwogaXB1dF9xdW90YV9lcnJfb3V0OgogCWlmICh2b2wtPnF1b3RhX3FfaW5vKQogCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOwpAQCAtMTc1OSw2ICsyMTY3LDEyIEBACiAKIAkvKiBOVEZTIDMuMCsgc3BlY2lmaWMuICovCiAJaWYgKHZvbC0+bWFqb3JfdmVyID49IDMpIHsKKwkJaWYgKHZvbC0+dXNuanJubF9qX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+dXNuanJubF9qX2lubyk7CisJCWlmICh2b2wtPnVzbmpybmxfbWF4X2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+dXNuanJubF9tYXhfaW5vKTsKKwkJaWYgKHZvbC0+dXNuanJubF9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnVzbmpybmxfaW5vKTsKIAkJaWYgKHZvbC0+cXVvdGFfcV9pbm8pCiAJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnF1b3RhX3FfaW5vKTsKIAkJaWYgKHZvbC0+cXVvdGFfaW5vKQpAQCAtMTgxNCw2ICsyMjI4LDE4IEBACiAJLyogTlRGUyAzLjArIHNwZWNpZmljIGNsZWFuIHVwLiAqLwogCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CiAjaWZkZWYgTlRGU19SVworCQlpZiAodm9sLT51c25qcm5sX2pfaW5vKSB7CisJCQlpcHV0KHZvbC0+dXNuanJubF9qX2lubyk7CisJCQl2b2wtPnVzbmpybmxfal9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnVzbmpybmxfbWF4X2lubykgeworCQkJaXB1dCh2b2wtPnVzbmpybmxfbWF4X2lubyk7CisJCQl2b2wtPnVzbmpybmxfbWF4X2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+dXNuanJubF9pbm8pIHsKKwkJCWlwdXQodm9sLT51c25qcm5sX2lubyk7CisJCQl2b2wtPnVzbmpybmxfaW5vID0gTlVMTDsKKwkJfQogCQlpZiAodm9sLT5xdW90YV9xX2lubykgewogCQkJaXB1dCh2b2wtPnF1b3RhX3FfaW5vKTsKIAkJCXZvbC0+cXVvdGFfcV9pbm8gPSBOVUxMOwpAQCAtMTk1OSw4ICsyMzg1LDcgQEAKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bGNuYm1wX2luby0+aV9tYXBwaW5nOwogCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKLQl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisJcGdvZmZfdCBpbmRleCwgbWF4X2luZGV4OwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CiAJLyogU2VyaWFsaXplIGFjY2Vzc2VzIHRvIHRoZSBjbHVzdGVyIGJpdG1hcC4gKi8KQEAgLTE5NzIsMTEgKzIzOTcsMTAgQEAKIAkgKi8KIAltYXhfaW5kZXggPSAoKCh2b2wtPm5yX2NsdXN0ZXJzICsgNykgPj4gMykgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgogCQkJUEFHRV9DQUNIRV9TSElGVDsKLQkvKiBVc2UgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCi0JbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gMjsKLQludGZzX2RlYnVnKCJSZWFkaW5nICRCaXRtYXAsIG1heF9pbmRleCA9IDB4JWx4LCBtYXhfc2l6ZSA9IDB4JXguIiwKLQkJCW1heF9pbmRleCwgbWF4X3NpemUpOwotCWZvciAoaW5kZXggPSAwVUw7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CisJLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLCB0aHVzIG1heF9zaXplIGlzIFBBR0VfQ0FDSEVfU0laRSAvIDQuICovCisJbnRmc19kZWJ1ZygiUmVhZGluZyAkQml0bWFwLCBtYXhfaW5kZXggPSAweCVseCwgbWF4X3NpemUgPSAweCVseC4iLAorCQkJbWF4X2luZGV4LCBQQUdFX0NBQ0hFX1NJWkUgLyA0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtYXhfaW5kZXg7IGluZGV4KyspIHsKIAkJdW5zaWduZWQgaW50IGk7CiAJCS8qCiAJCSAqIFJlYWQgdGhlIHBhZ2UgZnJvbSBwYWdlIGNhY2hlLCBnZXR0aW5nIGl0IGZyb20gYmFja2luZyBzdG9yZQpAQCAtMjAwOCw3ICsyNDMyLDcgQEAKIAkJICogdGhlIHJlc3VsdCBhcyBhbGwgb3V0IG9mIHJhbmdlIGJ5dGVzIGFyZSBzZXQgdG8gemVybyBieQogCQkgKiBudGZzX3JlYWRwYWdlKCkuCiAJCSAqLwotCSAgCWZvciAoaSA9IDA7IGkgPCBtYXhfc2l6ZTsgaSsrKQorCSAgCWZvciAoaSA9IDA7IGkgPCBQQUdFX0NBQ0hFX1NJWkUgLyA0OyBpKyspCiAJCQlucl9mcmVlIC09IChzNjQpaHdlaWdodDMyKGthZGRyW2ldKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0yMDMxLDYgKzI0NTUsOCBAQAogLyoqCiAgKiBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgZnJlZSBpbm9kZXMgb24gYSB2b2x1bWUKICAqIEB2b2w6CW50ZnMgdm9sdW1lIGZvciB3aGljaCB0byBvYnRhaW4gZnJlZSBpbm9kZSBjb3VudAorICogQG5yX2ZyZWU6CW51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiBmaWxlc3lzdGVtCisgKiBAbWF4X2luZGV4OgltYXhpbXVtIG51bWJlciBvZiBwYWdlcyBjb250YWluaW5nIHNldCBiaXRzCiAgKgogICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBtZnQgcmVjb3JkcyAoaW5vZGVzKSBvbiB0aGUgbW91bnRlZCBOVEZTCiAgKiB2b2x1bWUgQHZvbC4gV2UgYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gdXNlIGluc3RlYWQKQEAgLTIwNDMsMzIgKzI0NjksMjAgQEAKICAqCiAgKiBOT1RFOiBDYWxsZXIgbXVzdCBob2xkIG1mdGJtcF9sb2NrIHJ3X3NlbWFwaG9yZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKG50ZnNfdm9sdW1lICp2b2wpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKG50ZnNfdm9sdW1lICp2b2wsCisJCXM2NCBucl9mcmVlLCBjb25zdCBwZ29mZl90IG1heF9pbmRleCkKIHsKLQlzNjQgbnJfZnJlZTsKIAl1MzIgKmthZGRyOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gdm9sLT5tZnRibXBfaW5vLT5pX21hcHBpbmc7CiAJZmlsbGVyX3QgKnJlYWRwYWdlID0gKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCwgbWF4X2luZGV4OwotCXVuc2lnbmVkIGludCBtYXhfc2l6ZTsKKwlwZ29mZl90IGluZGV4OwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7Ci0JLyogTnVtYmVyIG9mIG1mdCByZWNvcmRzIGluIGZpbGUgc3lzdGVtIChhdCB0aGlzIHBvaW50IGluIHRpbWUpLiAqLwotCW5yX2ZyZWUgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOwotCS8qCi0JICogQ29udmVydCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2V0IGJpdHMgaW50byBieXRlcyByb3VuZGVkIHVwLCB0aGVuCi0JICogY29udmVydCBpbnRvIG11bHRpcGxlcyBvZiBQQUdFX0NBQ0hFX1NJWkUsIHJvdW5kaW5nIHVwIHNvIHRoYXQgaWYgd2UKLQkgKiBoYXZlIG9uZSBmdWxsIGFuZCBvbmUgcGFydGlhbCBwYWdlIG1heF9pbmRleCA9IDIuCi0JICovCi0JbWF4X2luZGV4ID0gKCgoKE5URlNfSSh2b2wtPm1mdF9pbm8pLT5pbml0aWFsaXplZF9zaXplID4+Ci0JCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSArIDcpID4+IDMpICsKLQkJCVBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAqLwotCW1heF9zaXplID0gUEFHRV9DQUNIRV9TSVpFID4+IDI7CisJLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLCB0aHVzIG1heF9zaXplIGlzIFBBR0VfQ0FDSEVfU0laRSAvIDQuICovCiAJbnRmc19kZWJ1ZygiUmVhZGluZyAkTUZULyRCSVRNQVAsIG1heF9pbmRleCA9IDB4JWx4LCBtYXhfc2l6ZSA9ICIKLQkJCSIweCV4LiIsIG1heF9pbmRleCwgbWF4X3NpemUpOwotCWZvciAoaW5kZXggPSAwVUw7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CisJCQkiMHglbHguIiwgbWF4X2luZGV4LCBQQUdFX0NBQ0hFX1NJWkUgLyA0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtYXhfaW5kZXg7IGluZGV4KyspIHsKIAkJdW5zaWduZWQgaW50IGk7CiAJCS8qCiAJCSAqIFJlYWQgdGhlIHBhZ2UgZnJvbSBwYWdlIGNhY2hlLCBnZXR0aW5nIGl0IGZyb20gYmFja2luZyBzdG9yZQpAQCAtMjEwMCw3ICsyNTE0LDcgQEAKIAkJICogdGhlIHJlc3VsdCBhcyBhbGwgb3V0IG9mIHJhbmdlIGJ5dGVzIGFyZSBzZXQgdG8gemVybyBieQogCQkgKiBudGZzX3JlYWRwYWdlKCkuCiAJCSAqLwotCSAgCWZvciAoaSA9IDA7IGkgPCBtYXhfc2l6ZTsgaSsrKQorCSAgCWZvciAoaSA9IDA7IGkgPCBQQUdFX0NBQ0hFX1NJWkUgLyA0OyBpKyspCiAJCQlucl9mcmVlIC09IChzNjQpaHdlaWdodDMyKGthZGRyW2ldKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0yMTM0LDggKzI1NDgsMTEgQEAKICAqLwogc3RhdGljIGludCBudGZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqc2ZzKQogewotCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKIAlzNjQgc2l6ZTsKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisJbnRmc19pbm9kZSAqbWZ0X25pID0gTlRGU19JKHZvbC0+bWZ0X2lubyk7CisJcGdvZmZfdCBtYXhfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwogCS8qIFR5cGUgb2YgZmlsZXN5c3RlbS4gKi8KQEAgLTIxNDMsMTMgKzI1NjAsMTMgQEAKIAkvKiBPcHRpbWFsIHRyYW5zZmVyIGJsb2NrIHNpemUuICovCiAJc2ZzLT5mX2JzaXplICA9IFBBR0VfQ0FDSEVfU0laRTsKIAkvKgotCSAqIFRvdGFsIGRhdGEgYmxvY2tzIGluIGZpbGUgc3lzdGVtIGluIHVuaXRzIG9mIGZfYnNpemUgYW5kIHNpbmNlCisJICogVG90YWwgZGF0YSBibG9ja3MgaW4gZmlsZXN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplIGFuZCBzaW5jZQogCSAqIGlub2RlcyBhcmUgYWxzbyBzdG9yZWQgaW4gZGF0YSBibG9jcyAoJE1GVCBpcyBhIGZpbGUpIHRoaXMgaXMganVzdAogCSAqIHRoZSB0b3RhbCBjbHVzdGVycy4KIAkgKi8KIAlzZnMtPmZfYmxvY2tzID0gdm9sLT5ucl9jbHVzdGVycyA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CiAJCQkJUEFHRV9DQUNIRV9TSElGVDsKLQkvKiBGcmVlIGRhdGEgYmxvY2tzIGluIGZpbGUgc3lzdGVtIGluIHVuaXRzIG9mIGZfYnNpemUuICovCisJLyogRnJlZSBkYXRhIGJsb2NrcyBpbiBmaWxlc3lzdGVtIGluIHVuaXRzIG9mIGZfYnNpemUuICovCiAJc2l6ZQkgICAgICA9IGdldF9ucl9mcmVlX2NsdXN0ZXJzKHZvbCkgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgogCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CiAJaWYgKHNpemUgPCAwTEwpCkBAIC0yMTU4LDE3ICsyNTc1LDI3IEBACiAJc2ZzLT5mX2JhdmFpbCA9IHNmcy0+Zl9iZnJlZSA9IHNpemU7CiAJLyogU2VyaWFsaXplIGFjY2Vzc2VzIHRvIHRoZSBpbm9kZSBiaXRtYXAuICovCiAJZG93bl9yZWFkKCZ2b2wtPm1mdGJtcF9sb2NrKTsKLQkvKiBOdW1iZXIgb2YgaW5vZGVzIGluIGZpbGUgc3lzdGVtIChhdCB0aGlzIHBvaW50IGluIHRpbWUpLiAqLwotCXNmcy0+Zl9maWxlcyA9IHZvbC0+bWZ0X2luby0+aV9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJc2l6ZSA9IGlfc2l6ZV9yZWFkKHZvbC0+bWZ0X2lubykgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwkvKgorCSAqIENvbnZlcnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNldCBiaXRzIGludG8gYnl0ZXMgcm91bmRlZCB1cCwgdGhlbgorCSAqIGNvbnZlcnQgaW50byBtdWx0aXBsZXMgb2YgUEFHRV9DQUNIRV9TSVpFLCByb3VuZGluZyB1cCBzbyB0aGF0IGlmIHdlCisJICogaGF2ZSBvbmUgZnVsbCBhbmQgb25lIHBhcnRpYWwgcGFnZSBtYXhfaW5kZXggPSAyLgorCSAqLworCW1heF9pbmRleCA9ICgoKChtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykKKwkJCSsgNykgPj4gMykgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJLyogTnVtYmVyIG9mIGlub2RlcyBpbiBmaWxlc3lzdGVtIChhdCB0aGlzIHBvaW50IGluIHRpbWUpLiAqLworCXNmcy0+Zl9maWxlcyA9IHNpemU7CiAJLyogRnJlZSBpbm9kZXMgaW4gZnMgKGJhc2VkIG9uIGN1cnJlbnQgdG90YWwgY291bnQpLiAqLwotCXNmcy0+Zl9mZnJlZSA9IF9fZ2V0X25yX2ZyZWVfbWZ0X3JlY29yZHModm9sKTsKKwlzZnMtPmZfZmZyZWUgPSBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKHZvbCwgc2l6ZSwgbWF4X2luZGV4KTsKIAl1cF9yZWFkKCZ2b2wtPm1mdGJtcF9sb2NrKTsKIAkvKgogCSAqIEZpbGUgc3lzdGVtIGlkLiBUaGlzIGlzIGV4dHJlbWVseSAqbml4IGZsYXZvdXIgZGVwZW5kZW50IGFuZCBldmVuCiAJICogd2l0aGluIExpbnV4IGl0c2VsZiBhbGwgZnMgZG8gdGhlaXIgb3duIHRoaW5nLiBJIGludGVycHJldCB0aGlzIHRvCiAJICogbWVhbiBhIHVuaXF1ZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vdW50ZWQgZnMgYW5kIG5vdCB0aGUgaWQKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgc3lzdGVtIGRyaXZlciwgdGhlIGxhdHRlciBpcyBhbHJlYWR5IGdpdmVuCi0JICogYnkgdGhlIGZpbGUgc3lzdGVtIHR5cGUgaW4gc2ZzLT5mX3R5cGUuIFRodXMgd2UgdXNlIHRoZSA2NC1iaXQKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gZHJpdmVyLCB0aGUgbGF0dGVyIGlzIGFscmVhZHkgZ2l2ZW4KKwkgKiBieSB0aGUgZmlsZXN5c3RlbSB0eXBlIGluIHNmcy0+Zl90eXBlLiBUaHVzIHdlIHVzZSB0aGUgNjQtYml0CiAJICogdm9sdW1lIHNlcmlhbCBudW1iZXIgc3BsaXR0aW5nIGl0IGludG8gdHdvIDMyLWJpdCBwYXJ0cy4gV2UgZW50ZXIKIAkgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzItYml0cyBpbiBmX2ZzaWRbMF0gYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50CiAJICogMzItYml0cyBpbiBmX2ZzaWRbMV0uCkBAIC0yMjE5LDUzICsyNjQ2LDE5IEBACiAJCQkJCQkgICBwcm9jLiAqLwogfTsKIAotCiAvKioKLSAqIERlY2xhcmF0aW9ucyBmb3IgTlRGUyBzcGVjaWZpYyBleHBvcnQgb3BlcmF0aW9ucyAoZnMvbnRmcy9uYW1laS5jKS4KLSAqLwotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZF9kZW50KTsKLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZmgpOwotCi0vKioKLSAqIEV4cG9ydCBvcGVyYXRpb25zIGFsbG93aW5nIE5GUyBleHBvcnRpbmcgb2YgbW91bnRlZCBOVEZTIHBhcnRpdGlvbnMuCi0gKgotICogV2UgdXNlIHRoZSBkZWZhdWx0IC0+ZGVjb2RlX2ZoKCkgYW5kIC0+ZW5jb2RlX2ZoKCkgZm9yIG5vdy4gIE5vdGUgdGhhdCB0aGV5Ci0gKiB1c2UgMzIgYml0cyB0byBzdG9yZSB0aGUgaW5vZGUgbnVtYmVyIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGxvbmcgc28gb24gNjQtYml0Ci0gKiBhcmNoaXRlY3R1cmVzIGlzIHVzdWFsbHkgNjQgYml0cyBzbyBpdCB3b3VsZCBhbGwgZmFpbCBob3JyaWJseSBvbiBodWdlCi0gKiB2b2x1bWVzLiAgSSBndWVzcyB3ZSBuZWVkIHRvIGRlZmluZSBvdXIgb3duIGVuY29kZSBhbmQgZGVjb2RlIGZoIGZ1bmN0aW9ucwotICogdGhhdCBzdG9yZSA2NC1iaXQgaW5vZGUgbnVtYmVycyBhdCBzb21lIHBvaW50IGJ1dCBmb3Igbm93IHdlIHdpbGwgaWdub3JlIHRoZQotICogcHJvYmxlbS4uLgotICoKLSAqIFdlIGFsc28gdXNlIHRoZSBkZWZhdWx0IC0+Z2V0X25hbWUoKSBoZWxwZXIgKHVzZWQgYnkgLT5kZWNvZGVfZmgoKSB2aWEKLSAqIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkpIGFzIHRoYXQgaXMgY29tcGxldGVseSBmcwotICogaW5kZXBlbmRlbnQuCi0gKgotICogVGhlIGRlZmF1bHQgLT5nZXRfcGFyZW50KCkganVzdCByZXR1cm5zIC1FQUNDRVMgc28gd2UgaGF2ZSB0byBwcm92aWRlIG91cgotICogb3duIGFuZCB0aGUgZGVmYXVsdCAtPmdldF9kZW50cnkoKSBpcyBpbmNvbXBhdGlibGUgd2l0aCBOVEZTIGR1ZSB0byBub3QKLSAqIGFsbG93aW5nIHRoZSBpbm9kZSBudW1iZXIgMCB3aGljaCBpcyB1c2VkIGluIE5URlMgZm9yIHRoZSBzeXN0ZW0gZmlsZSAkTUZUCi0gKiBhbmQgZHVlIHRvIHVzaW5nIGlnZXQoKSB3aGVyZWFzIE5URlMgbmVlZHMgbnRmc19pZ2V0KCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbnRmc19leHBvcnRfb3BzID0gewotCS5nZXRfcGFyZW50CT0gbnRmc19nZXRfcGFyZW50LAkvKiBGaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZlbgotCQkJCQkJICAgZGlyZWN0b3J5LiAqLwotCS5nZXRfZGVudHJ5CT0gbnRmc19nZXRfZGVudHJ5LAkvKiBGaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUKLQkJCQkJCSAgIGdpdmVuIGEgZmlsZSBoYW5kbGUKLQkJCQkJCSAgIHN1Yi1mcmFnbWVudC4gKi8KLX07Ci0KLS8qKgotICogbnRmc19maWxsX3N1cGVyIC0gbW91bnQgYW4gbnRmcyBmaWxlcyBzeXN0ZW0KLSAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG50ZnMgZmlsZSBzeXN0ZW0gdG8gbW91bnQKKyAqIG50ZnNfZmlsbF9zdXBlciAtIG1vdW50IGFuIG50ZnMgZmlsZXN5c3RlbQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbnRmcyBmaWxlc3lzdGVtIHRvIG1vdW50CiAgKiBAb3B0OglzdHJpbmcgY29udGFpbmluZyB0aGUgbW91bnQgb3B0aW9ucwogICogQHNpbGVudDoJc2lsZW5jZSBlcnJvciBvdXRwdXQKICAqCiAgKiBudGZzX2ZpbGxfc3VwZXIoKSBpcyBjYWxsZWQgYnkgdGhlIFZGUyB0byBtb3VudCB0aGUgZGV2aWNlIGRlc2NyaWJlZCBieSBAc2IKLSAqIHdpdGggdGhlIG1vdW50IG90aW9ucyBpbiBAZGF0YSB3aXRoIHRoZSBOVEZTIGZpbGUgc3lzdGVtLgorICogd2l0aCB0aGUgbW91bnQgb3Rpb25zIGluIEBkYXRhIHdpdGggdGhlIE5URlMgZmlsZXN5c3RlbS4KICAqCiAgKiBJZiBAc2lsZW50IGlzIHRydWUsIHJlbWFpbiBzaWxlbnQgZXZlbiBpZiBlcnJvcnMgYXJlIGRldGVjdGVkLiBUaGlzIGlzIHVzZWQKLSAqIGR1cmluZyBib290dXAsIHdoZW4gdGhlIGtlcm5lbCB0cmllcyB0byBtb3VudCB0aGUgcm9vdCBmaWxlIHN5c3RlbSB3aXRoIGFsbAotICogcmVnaXN0ZXJlZCBmaWxlIHN5c3RlbXMgb25lIGFmdGVyIHRoZSBvdGhlciB1bnRpbCBvbmUgc3VjY2VlZHMuIFRoaXMgaW1wbGllcwotICogdGhhdCBhbGwgZmlsZSBzeXN0ZW1zIGV4Y2VwdCB0aGUgY29ycmVjdCBvbmUgd2lsbCBxdWl0ZSBjb3JyZWN0bHkgYW5kCisgKiBkdXJpbmcgYm9vdHVwLCB3aGVuIHRoZSBrZXJuZWwgdHJpZXMgdG8gbW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbSB3aXRoIGFsbAorICogcmVnaXN0ZXJlZCBmaWxlc3lzdGVtcyBvbmUgYWZ0ZXIgdGhlIG90aGVyIHVudGlsIG9uZSBzdWNjZWVkcy4gVGhpcyBpbXBsaWVzCisgKiB0aGF0IGFsbCBmaWxlc3lzdGVtcyBleGNlcHQgdGhlIGNvcnJlY3Qgb25lIHdpbGwgcXVpdGUgY29ycmVjdGx5IGFuZAogICogZXhwZWN0ZWRseSByZXR1cm4gYW4gZXJyb3IsIGJ1dCBub2JvZHkgd2FudHMgdG8gc2VlIGVycm9yIG1lc3NhZ2VzIHdoZW4gaW4KICAqIGZhY3QgdGhpcyBpcyB3aGF0IGlzIHN1cHBvc2VkIHRvIGhhcHBlbi4KICAqCkBAIC0yMjkyLDM5ICsyNjg1LDI1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKiBJbml0aWFsaXplIG50ZnNfdm9sdW1lIHN0cnVjdHVyZS4gKi8KLQltZW1zZXQodm9sLCAwLCBzaXplb2YobnRmc192b2x1bWUpKTsKLQl2b2wtPnNiID0gc2I7Ci0Jdm9sLT51cGNhc2UgPSBOVUxMOwotCXZvbC0+YXR0cmRlZiA9IE5VTEw7Ci0Jdm9sLT5tZnRfaW5vID0gTlVMTDsKLQl2b2wtPm1mdGJtcF9pbm8gPSBOVUxMOworCSp2b2wgPSAobnRmc192b2x1bWUpIHsKKwkJLnNiID0gc2IsCisJCS8qCisJCSAqIERlZmF1bHQgaXMgZ3JvdXAgYW5kIG90aGVyIGRvbid0IGhhdmUgYW55IGFjY2VzcyB0byBmaWxlcyBvcgorCQkgKiBkaXJlY3RvcmllcyB3aGlsZSBvd25lciBoYXMgZnVsbCBhY2Nlc3MuIEZ1cnRoZXIsIGZpbGVzIGJ5CisJCSAqIGRlZmF1bHQgYXJlIG5vdCBleGVjdXRhYmxlIGJ1dCBkaXJlY3RvcmllcyBhcmUgb2YgY291cnNlCisJCSAqIGJyb3dzZWFibGUuCisJCSAqLworCQkuZm1hc2sgPSAwMTc3LAorCQkuZG1hc2sgPSAwMDc3LAorCX07CiAJaW5pdF9yd3NlbSgmdm9sLT5tZnRibXBfbG9jayk7Ci0jaWZkZWYgTlRGU19SVwotCXZvbC0+bWZ0bWlycl9pbm8gPSBOVUxMOwotCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOwotI2VuZGlmIC8qIE5URlNfUlcgKi8KLQl2b2wtPmxjbmJtcF9pbm8gPSBOVUxMOwogCWluaXRfcndzZW0oJnZvbC0+bGNuYm1wX2xvY2spOwotCXZvbC0+dm9sX2lubyA9IE5VTEw7Ci0Jdm9sLT5yb290X2lubyA9IE5VTEw7Ci0Jdm9sLT5zZWN1cmVfaW5vID0gTlVMTDsKLQl2b2wtPmV4dGVuZF9pbm8gPSBOVUxMOwotI2lmZGVmIE5URlNfUlcKLQl2b2wtPnF1b3RhX2lubyA9IE5VTEw7Ci0Jdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7Ci0jZW5kaWYgLyogTlRGU19SVyAqLwotCXZvbC0+bmxzX21hcCA9IE5VTEw7Ci0KLQkvKgotCSAqIERlZmF1bHQgaXMgZ3JvdXAgYW5kIG90aGVyIGRvbid0IGhhdmUgYW55IGFjY2VzcyB0byBmaWxlcyBvcgotCSAqIGRpcmVjdG9yaWVzIHdoaWxlIG93bmVyIGhhcyBmdWxsIGFjY2Vzcy4gRnVydGhlciwgZmlsZXMgYnkgZGVmYXVsdAotCSAqIGFyZSBub3QgZXhlY3V0YWJsZSBidXQgZGlyZWN0b3JpZXMgYXJlIG9mIGNvdXJzZSBicm93c2VhYmxlLgotCSAqLwotCXZvbC0+Zm1hc2sgPSAwMTc3OwotCXZvbC0+ZG1hc2sgPSAwMDc3OwogCiAJdW5sb2NrX2tlcm5lbCgpOwogCisJLyogQnkgZGVmYXVsdCwgZW5hYmxlIHNwYXJzZSBzdXBwb3J0LiAqLworCU5Wb2xTZXRTcGFyc2VFbmFibGVkKHZvbCk7CisKIAkvKiBJbXBvcnRhbnQgdG8gZ2V0IHRoZSBtb3VudCBvcHRpb25zIGRlYWx0IHdpdGggbm93LiAqLwogCWlmICghcGFyc2Vfb3B0aW9ucyh2b2wsIChjaGFyKilvcHQpKQogCQlnb3RvIGVycl9vdXRfbm93OwpAQCAtMjM0Nyw3ICsyNzI2LDggQEAKIAl9CiAKIAkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGRldmljZSBpbiB1bml0cyBvZiBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMuICovCi0Jdm9sLT5ucl9ibG9ja3MgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTOworCXZvbC0+bnJfYmxvY2tzID0gaV9zaXplX3JlYWQoc2ItPnNfYmRldi0+YmRfaW5vZGUpID4+CisJCQlOVEZTX0JMT0NLX1NJWkVfQklUUzsKIAogCS8qIFJlYWQgdGhlIGJvb3Qgc2VjdG9yIGFuZCByZXR1cm4gdW5sb2NrZWQgYnVmZmVyIGhlYWQgdG8gaXQuICovCiAJaWYgKCEoYmggPSByZWFkX250ZnNfYm9vdF9zZWN0b3Ioc2IsIHNpbGVudCkpKSB7CkBAIC0yNDc2LDYgKzI4NTYsMTggQEAKIAkvKiBOVEZTIDMuMCsgc3BlY2lmaWMgY2xlYW4gdXAuICovCiAJaWYgKHZvbC0+bWFqb3JfdmVyID49IDMpIHsKICNpZmRlZiBOVEZTX1JXCisJCWlmICh2b2wtPnVzbmpybmxfal9pbm8pIHsKKwkJCWlwdXQodm9sLT51c25qcm5sX2pfaW5vKTsKKwkJCXZvbC0+dXNuanJubF9qX2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+dXNuanJubF9tYXhfaW5vKSB7CisJCQlpcHV0KHZvbC0+dXNuanJubF9tYXhfaW5vKTsKKwkJCXZvbC0+dXNuanJubF9tYXhfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT51c25qcm5sX2lubykgeworCQkJaXB1dCh2b2wtPnVzbmpybmxfaW5vKTsKKwkJCXZvbC0+dXNuanJubF9pbm8gPSBOVUxMOworCQl9CiAJCWlmICh2b2wtPnF1b3RhX3FfaW5vKSB7CiAJCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOwogCQkJdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7CkBAIC0yNTgxLDcgKzI5NzMsNyBAQAogICovCiBrbWVtX2NhY2hlX3QgKm50ZnNfbmFtZV9jYWNoZTsKIAotLyogU2xhYiBjYWNoZXMgZm9yIGVmZmljaWVudCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBvZiBvZiBpbm9kZXMuICovCisvKiBTbGFiIGNhY2hlcyBmb3IgZWZmaWNpZW50IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIG9mIGlub2Rlcy4gKi8KIGttZW1fY2FjaGVfdCAqbnRmc19pbm9kZV9jYWNoZTsKIGttZW1fY2FjaGVfdCAqbnRmc19iaWdfaW5vZGVfY2FjaGU7CiAKQEAgLTI3MDUsNyArMzA5Nyw3IEBACiAJCW50ZnNfZGVidWcoIk5URlMgZHJpdmVyIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LiIpOwogCQlyZXR1cm4gMDsgLyogU3VjY2VzcyEgKi8KIAl9Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIHJlZ2lzdGVyIE5URlMgZmlsZSBzeXN0ZW0gZHJpdmVyIVxuIik7CisJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIHJlZ2lzdGVyIE5URlMgZmlsZXN5c3RlbSBkcml2ZXIhXG4iKTsKIAogc3lzY3RsX2Vycl9vdXQ6CiAJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYmlnX2lub2RlX2NhY2hlKTsKQEAgLTI3MTksNyArMzExMSw3IEBACiAJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfaW5kZXhfY3R4X2NhY2hlKTsKIGljdHhfZXJyX291dDoKIAlpZiAoIWVycikgewotCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBBYm9ydGluZyBOVEZTIGZpbGUgc3lzdGVtIGRyaXZlciAiCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEFib3J0aW5nIE5URlMgZmlsZXN5c3RlbSBkcml2ZXIgIgogCQkJCSJyZWdpc3RyYXRpb24uLi5cbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCX0KQEAgLTI3NTksNyArMzE1MSw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIkFudG9uIEFsdGFwYXJtYWtvdiA8YWlhMjFAY2FudGFiLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTlRGUyAxLjIvMy54IGRyaXZlciAtIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOVEZTIDEuMi8zLnggZHJpdmVyIC0gQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292Iik7CiBNT0RVTEVfVkVSU0lPTihOVEZTX1ZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9mcy9udGZzL3N5c2N0bC5jIGIvZnMvbnRmcy9zeXNjdGwuYwppbmRleCA3NTA2N2U0Li4xYzIzMTM4IDEwMDY0NAotLS0gYS9mcy9udGZzL3N5c2N0bC5jCisrKyBiL2ZzL250ZnMvc3lzY3RsLmMKQEAgLTMsNyArMyw3IEBACiAgKgkgICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LiBBZGFwdGVkIGZyb20gdGhlIG9sZCBOVEZTIGRyaXZlciwKICAqCSAgICAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzLCBS6WdpcyBEdWNoZXNuZQogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtNjcsNyArNjcsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkJLyoKLQkJICogSWYgdGhlIHByb2MgZmlsZSBzeXN0ZW0gaXMgaW4gdXNlIGFuZCB3ZSBhcmUgYSBtb2R1bGUsIG5lZWQKKwkJICogSWYgdGhlIHByb2MgZmlsZXN5c3RlbSBpcyBpbiB1c2UgYW5kIHdlIGFyZSBhIG1vZHVsZSwgbmVlZAogCQkgKiB0byBzZXQgdGhlIG93bmVyIG9mIG91ciBwcm9jIGVudHJ5IHRvIG91ciBtb2R1bGUuIEluIHRoZQogCQkgKiBub24tbW9kdWxhciBjYXNlLCBUSElTX01PRFVMRSBpcyBOVUxMLCBzbyB0aGlzIGlzIG9rLgogCQkgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdGltZS5oIGIvZnMvbnRmcy90aW1lLmgKaW5kZXggYTA5YTUxZC4uMDEyMzM5OCAxMDA2NDQKLS0tIGEvZnMvbnRmcy90aW1lLmgKKysrIGIvZnMvbnRmcy90aW1lLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogdGltZS5oIC0gTlRGUyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtODcsNyArODcsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAogCS8qIFN1YnRyYWN0IHRoZSBOVEZTIHRpbWUgb2Zmc2V0LiAqLwotCXM2NCB0ID0gc2xlNjRfdG9fY3B1KHRpbWUpIC0gTlRGU19USU1FX09GRlNFVDsKKwl1NjQgdCA9ICh1NjQpKHNsZTY0X3RvX2NwdSh0aW1lKSAtIE5URlNfVElNRV9PRkZTRVQpOwogCS8qCiAJICogQ29udmVydCB0aGUgdGltZSB0byAxLXNlY29uZCBpbnRlcnZhbHMgYW5kIHRoZSByZW1haW5kZXIgdG8KIAkgKiAxLW5hbm8tc2Vjb25kIGludGVydmFscy4KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdHlwZXMuaCBiL2ZzL250ZnMvdHlwZXMuaAppbmRleCAwOGE1NWFhLi42ZTRhN2UzIDEwMDY0NAotLS0gYS9mcy9udGZzL3R5cGVzLmgKKysrIGIvZnMvbnRmcy90eXBlcy5oCkBAIC0yLDcgKzIsNyBAQAogICogdHlwZXMuaCAtIERlZmluZXMgZm9yIE5URlMgTGludXgga2VybmVsIGRyaXZlciBzcGVjaWZpYyB0eXBlcy4KICAqCSAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtNTMsNiArNTMsMTQgQEAKIHR5cGVkZWYgczY0IExTTjsKIHR5cGVkZWYgc2xlNjQgbGVMU047CiAKKy8qCisgKiBUaGUgTlRGUyB0cmFuc2FjdGlvbiBsb2cgJFVzbkpybmwgdXNlcyB1c24gd2hpY2ggYXJlIHNpZ25lZCA2NC1iaXQgdmFsdWVzLgorICogV2UgZGVmaW5lIG91ciBvd24gdHlwZSBVU04sIHRvIGFsbG93IGZvciB0eXBlIGNoZWNraW5nIGFuZCBiZXR0ZXIgY29kZQorICogcmVhZGFiaWxpdHkuCisgKi8KK3R5cGVkZWYgczY0IFVTTjsKK3R5cGVkZWYgc2xlNjQgbGVVU047CisKIHR5cGVkZWYgZW51bSB7CiAJRkFMU0UgPSAwLAogCVRSVUUgPSAxCmRpZmYgLS1naXQgYS9mcy9udGZzL3VuaXN0ci5jIGIvZnMvbnRmcy91bmlzdHIuYwppbmRleCA1NjBiMGVhLi4xOWM0MmUyIDEwMDY0NAotLS0gYS9mcy9udGZzL3VuaXN0ci5jCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAJLyogV2UgZG9uJ3QgdHJ1c3Qgb3V0c2lkZSBzb3VyY2VzLiAqLwogCWlmIChpbnMpIHsKLQkJdWNzID0gKG50ZnNjaGFyKilrbWVtX2NhY2hlX2FsbG9jKG50ZnNfbmFtZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwkJdWNzID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX25hbWVfY2FjaGUsIFNMQUJfTk9GUyk7CiAJCWlmICh1Y3MpIHsKIAkJCWZvciAoaSA9IG8gPSAwOyBpIDwgaW5zX2xlbjsgaSArPSB3Y19sZW4pIHsKIAkJCQl3Y19sZW4gPSBubHMtPmNoYXIydW5pKGlucyArIGksIGluc19sZW4gLSBpLApkaWZmIC0tZ2l0IGEvZnMvbnRmcy91c25qcm5sLmMgYi9mcy9udGZzL3VzbmpybmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc3MzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy91c25qcm5sLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIHVzbmpybmwuaCAtIE5URlMga2VybmVsIHRyYW5zYWN0aW9uIGxvZyAoJFVzbkpybmwpIGhhbmRsaW5nLiAgUGFydCBvZiB0aGUKKyAqCSAgICAgICBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAidGltZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidXNuanJubC5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCisvKioKKyAqIG50ZnNfc3RhbXBfdXNuanJubCAtIHN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSBvbiBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdG8gc3RhbXAgdGhlIHRyYW5zYWN0aW9uIGxvZworICoKKyAqIFN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBhbmQgcmV0dXJuCisgKiBUUlVFIG9uIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBsb2cgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgYW5kCisgKiBjb25zaXN0ZW5jeSBjaGVja2VkIGJ5IGEgY2FsbCB0byBmcy9udGZzL3N1cGVyLmM6OmxvYWRfYW5kX2luaXRfdXNuanJubCgpLgorICovCitCT09MIG50ZnNfc3RhbXBfdXNuanJubChudGZzX3ZvbHVtZSAqdm9sKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChsaWtlbHkoIU5Wb2xVc25Kcm5sU3RhbXBlZCh2b2wpKSkgeworCQlzbGU2NCBzdGFtcDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCVVTTl9IRUFERVIgKnVoOworCisJCXBhZ2UgPSBudGZzX21hcF9wYWdlKHZvbC0+dXNuanJubF9tYXhfaW5vLT5pX21hcHBpbmcsIDApOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tICIKKwkJCQkJIiRVc25Kcm5sLyREQVRBLyRNYXggYXR0cmlidXRlLiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCXVoID0gKFVTTl9IRUFERVIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJc3RhbXAgPSBnZXRfY3VycmVudF9udGZzX3RpbWUoKTsKKwkJbnRmc19kZWJ1ZygiU3RhbXBpbmcgdHJhbnNhY3Rpb24gbG9nICgkVXNuSnJubCk6IG9sZCAiCisJCQkJImpvdXJuYWxfaWQgMHglbGx4LCBvbGQgbG93ZXN0X3ZhbGlkX3VzbiAiCisJCQkJIjB4JWxseCwgbmV3IGpvdXJuYWxfaWQgMHglbGx4LCBuZXcgIgorCQkJCSJsb3dlc3RfdmFsaWRfdXNuIDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KHVoLT5qb3VybmFsX2lkKSwKKwkJCQkobG9uZyBsb25nKXNsZTY0X3RvX2NwdSh1aC0+bG93ZXN0X3ZhbGlkX3VzbiksCisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUoc3RhbXApLAorCQkJCWlfc2l6ZV9yZWFkKHZvbC0+dXNuanJubF9qX2lubykpOworCQl1aC0+bG93ZXN0X3ZhbGlkX3VzbiA9CisJCQkJY3B1X3RvX3NsZTY0KGlfc2l6ZV9yZWFkKHZvbC0+dXNuanJubF9qX2lubykpOworCQl1aC0+am91cm5hbF9pZCA9IHN0YW1wOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJLyogU2V0IHRoZSBmbGFnIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGl0IGFnYWluIG9uIHJlbW91bnQuICovCisJCU5Wb2xTZXRVc25Kcm5sU3RhbXBlZCh2b2wpOworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy91c25qcm5sLmggYi9mcy9udGZzL3VzbmpybmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk4OGIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy91c25qcm5sLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiB1c25qcm5sLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSBoYW5kbGluZy4KKyAqCSAgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfVVNOSlJOTF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1VTTkpSTkxfSAorCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworLyoKKyAqIFRyYW5zYWN0aW9uIGxvZyAoJFVzbkpybmwpIG9yZ2FuaXphdGlvbjoKKyAqCisgKiBUaGUgdHJhbnNhY3Rpb24gbG9nIHJlY29yZHMgd2hlbmV2ZXIgYSBmaWxlIGlzIG1vZGlmaWVkIGluIGFueSB3YXkuICBTbyBmb3IKKyAqIGV4YW1wbGUgaXQgd2lsbCByZWNvcmQgdGhhdCBmaWxlICJibGFoIiB3YXMgd3JpdHRlbiB0byBhdCBhIHBhcnRpY3VsYXIgdGltZQorICogYnV0IG5vdCB3aGF0IHdhcyB3cml0dGVuLiAgSWYgd2lsbCByZWNvcmQgdGhhdCBhIGZpbGUgd2FzIGRlbGV0ZWQgb3IKKyAqIGNyZWF0ZWQsIHRoYXQgYSBmaWxlIHdhcyB0cnVuY2F0ZWQsIGV0Yy4gIFNlZSBiZWxvdyBmb3IgYWxsIHRoZSByZWFzb24KKyAqIGNvZGVzIHVzZWQuCisgKgorICogVGhlIHRyYW5zYWN0aW9uIGxvZyBpcyBpbiB0aGUgJEV4dGVuZCBkaXJlY3Rvcnkgd2hpY2ggaXMgaW4gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSBvZiBlYWNoIHZvbHVtZS4gIElmIGl0IGlzIG5vdCBwcmVzZW50IGl0IG1lYW5zIHRyYW5zYWN0aW9uCisgKiBsb2dnaW5nIGlzIGRpc2FibGVkLiAgSWYgaXQgaXMgcHJlc2VudCBpdCBtZWFucyB0cmFuc2FjdGlvbiBsb2dnaW5nIGlzCisgKiBlaXRoZXIgZW5hYmxlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNhYmxlZCBpbiB3aGljaCBjYXNlIHdlIGNhbgorICogaWdub3JlIGl0IGFzIGl0IHdpbGwgZ28gYXdheSBhcyBzb29uIGFzIFdpbmRvd3MgZ2V0cyBpdHMgaGFuZHMgb24gaXQuCisgKgorICogVG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGxvZ2dpbmcgaXMgZW5hYmxlZCBvciBpbiB0aGUgcHJvY2VzcworICogb2YgYmVpbmcgZGlzYWJsZWQsIG5lZWQgdG8gY2hlY2sgdGhlIHZvbHVtZSBmbGFncyBpbiB0aGUKKyAqICRWT0xVTUVfSU5GT1JNQVRJT04gYXR0cmlidXRlIGluIHRoZSAkVm9sdW1lIHN5c3RlbSBmaWxlICh3aGljaCBpcyBwcmVzZW50CisgKiBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYW5kIGhhcyBhIGZpeGVkIG1mdCByZWNvcmQgbnVtYmVyLCBzZWUgbGF5b3V0LmgpLgorICogSWYgdGhlIGZsYWcgVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVkgaXMgc2V0IGl0IG1lYW5zIHRoZSB0cmFuc2FjdGlvbiBsb2cKKyAqIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc2FibGVkIGFuZCBpZiB0aGlzIGZsYWcgaXMgY2xlYXIgaXQgbWVhbnMgdGhlCisgKiB0cmFuc2FjdGlvbiBsb2cgaXMgZW5hYmxlZC4KKyAqCisgKiBUaGUgdHJhbnNhY3Rpb24gbG9nIGNvbnNpc3RzIG9mIHR3byBwYXJ0czsgdGhlICREQVRBLyRNYXggYXR0cmlidXRlIGFzIHdlbGwKKyAqIGFzIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUuICAkTWF4IGlzIGEgaGVhZGVyIGRlc2NyaWJpbmcgdGhlIHRyYW5zYWN0aW9uCisgKiBsb2cgd2hpbHN0ICRKIGlzIHRoZSB0cmFuc2FjdGlvbiBsb2cgZGF0YSBpdHNlbGYgYXMgYSBzZXF1ZW5jZSBvZiB2YXJpYWJsZQorICogc2l6ZWQgVVNOX1JFQ09SRHMgKHNlZSBiZWxvdyBmb3IgYWxsIHRoZSBzdHJ1Y3R1cmVzKS4KKyAqCisgKiBXZSBkbyBub3QgY2FyZSBhYm91dCB0cmFuc2FjdGlvbiBsb2dnaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBidXQgd2Ugc3RpbGwKKyAqIG5lZWQgdG8gbGV0IHdpbmRvd3Mga25vdyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBsb2cgaXMgb3V0IG9mIGRhdGUuICBUbyBkbworICogdGhpcyB3ZSBuZWVkIHRvIHN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cuICBUaGlzIGludm9sdmVzIHNldHRpbmcgdGhlCisgKiBsb3dlc3RfdmFsaWRfdXNuIGZpZWxkIGluIHRoZSAkREFUQS8kTWF4IGF0dHJpYnV0ZSB0byB0aGUgdXNuIHRvIGJlIHVzZWQKKyAqIGZvciB0aGUgbmV4dCBhZGRlZCBVU05fUkVDT1JEIHRvIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUgYXMgd2VsbCBhcworICogZ2VuZXJhdGluZyBhIG5ldyBqb3VybmFsX2lkIGluICREQVRBLyRNYXguCisgKgorICogVGhlIGpvdXJuYWxfaWQgaXMgYXMgb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiAoMi4wKSBvZiB0aGUgdHJhbnNhY3Rpb24gbG9nCisgKiBzaW1wbHkgdGhlIDY0LWJpdCB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgam91cm5hbCB3YXMgZWl0aGVyIGNyZWF0ZWQgb3IgbGFzdAorICogc3RhbXBlZC4KKyAqCisgKiBUbyBkZXRlcm1pbmUgdGhlIG5leHQgdXNuIHRoZXJlIGFyZSB0d28gd2F5cy4gIFRoZSBmaXJzdCBpcyB0byBwYXJzZQorICogJERBVEEvJEogYW5kIHRvIGZpbmQgdGhlIGxhc3QgVVNOX1JFQ09SRCBpbiBpdCBhbmQgdG8gYWRkIGl0cyByZWNvcmRfbGVuZ3RoCisgKiB0byBpdHMgdXNuICh3aGljaCBpcyB0aGUgYnl0ZSBvZmZzZXQgaW4gdGhlICREQVRBLyRKIGF0dHJpYnV0ZSkuICBUaGUKKyAqIHNlY29uZCBpcyBzaW1wbHkgdG8gdGFrZSB0aGUgZGF0YSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUuICBTaW5jZSB0aGUgdXNucworICogYXJlIHNpbXBseSBieXRlIG9mZnNldHMgaW50byAkREFUQS8kSiwgdGhpcyBpcyBleGFjdGx5IHRoZSBuZXh0IHVzbi4gIEZvcgorICogb2J2aW91cyByZWFzb25zIHdlIHVzZSB0aGUgc2Vjb25kIG1ldGhvZCBhcyBpdCBpcyBtdWNoIHNpbXBsZXIgYW5kIGZhc3Rlci4KKyAqCisgKiBBcyBhbiBhc2lkZSwgbm90ZSB0aGF0IHRvIGFjdHVhbGx5IGRpc2FibGUgdGhlIHRyYW5zYWN0aW9uIGxvZywgb25lIHdvdWxkCisgKiBuZWVkIHRvIHNldCB0aGUgVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVkgZmxhZyAoc2VlIGFib3ZlKSwgdGhlbiBnbworICogdGhyb3VnaCBhbGwgdGhlIG1mdCByZWNvcmRzIG9uIHRoZSB2b2x1bWUgYW5kIHNldCB0aGUgdXNuIGZpZWxkIGluIHRoZWlyCisgKiAkU1RBTkRBUkRfSU5GT1JNQVRJT04gYXR0cmlidXRlIHRvIHplcm8uICBPbmNlIHRoYXQgaXMgZG9uZSwgb25lIHdvdWxkIG5lZWQKKyAqIHRvIGRlbGV0ZSB0aGUgdHJhbnNhY3Rpb24gbG9nIGZpbGUsIGkuZS4gXCRFeHRlbnRcJFVzbkpybmwsIGFuZCBmaW5hbGx5LAorICogb25lIHdvdWxkIG5lZWQgdG8gY2xlYXIgdGhlIFZPTFVNRV9ERUxFVEVfVVNOX1VOREVSV0FZIGZsYWcuCisgKgorICogTm90ZSB0aGF0IGlmIGEgdm9sdW1lIGlzIHVubW91bnRlZCB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGxvZyBpcyBiZWluZworICogZGlzYWJsZWQsIHRoZSBwcm9jZXNzIHdpbGwgY29udGludWUgdGhlIG5leHQgdGltZSB0aGUgdm9sdW1lIGlzIG1vdW50ZWQuCisgKiBUaGlzIGlzIHdoeSB3ZSBjYW4gc2FmZWx5IG1vdW50IHJlYWQtd3JpdGUgd2hlbiB3ZSBzZWUgYSB0cmFuc2FjdGlvbiBsb2cKKyAqIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlbGV0ZWQuCisgKi8KKworLyogU29tZSAkVXNuSnJubCByZWxhdGVkIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgVXNuSnJubE1ham9yVmVyCQkyCisjZGVmaW5lIFVzbkpybmxNaW5vclZlcgkJMAorCisvKgorICogJERBVEEvJE1heCBhdHRyaWJ1dGUuICBUaGlzIGlzIChhbHdheXM/KSByZXNpZGVudCBhbmQgaGFzIGEgZml4ZWQgc2l6ZSBvZgorICogMzIgYnl0ZXMuICBJdCBjb250YWlucyB0aGUgaGVhZGVyIGRlc2NyaWJpbmcgdGhlIHRyYW5zYWN0aW9uIGxvZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogICAwKi9zbGU2NCBtYXhpbXVtX3NpemU7CS8qIFRoZSBtYXhpbXVtIG9uLWRpc2sgc2l6ZSBvZiB0aGUgJERBVEEvJEoKKwkJCQkgICBhdHRyaWJ1dGUuICovCisvKiAgIDgqL3NsZTY0IGFsbG9jYXRpb25fZGVsdGE7CS8qIE51bWJlciBvZiBieXRlcyBieSB3aGljaCB0byBpbmNyZWFzZSB0aGUKKwkJCQkgICBzaXplIG9mIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUuICovCisvKjB4MTAqL3NsZTY0IGpvdXJuYWxfaWQ7CS8qIEN1cnJlbnQgaWQgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZy4gKi8KKy8qMHgxOCovbGVVU04gbG93ZXN0X3ZhbGlkX3VzbjsJLyogTG93ZXN0IHZhbGlkIHVzbiBpbiAkREFUQS8kSiBmb3IgdGhlCisJCQkJICAgY3VycmVudCBqb3VybmFsX2lkLiAqLworLyogc2l6ZW9mKCkgPSAzMiAoMHgyMCkgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBVU05fSEVBREVSOworCisvKgorICogUmVhc29uIGZsYWdzICgzMi1iaXQpLiAgQ3VtdWxhdGl2ZSBmbGFncyBkZXNjcmliaW5nIHRoZSBjaGFuZ2UocykgdG8gdGhlCisgKiBmaWxlIHNpbmNlIGl0IHdhcyBsYXN0IG9wZW5lZC4gIEkgdGhpbmsgdGhlIG5hbWVzIHNwZWFrIGZvciB0aGVtc2VsdmVzIGJ1dAorICogaWYgeW91IGRpc2FncmVlIGNoZWNrIG91dCB0aGUgZGVzY3JpcHRpb25zIGluIHRoZSBMaW51eCBOVEZTIHByb2plY3QgTlRGUworICogZG9jdW1lbnRhdGlvbjogaHR0cDovL2xpbnV4LW50ZnMuc291cmNlZm9yZ2UubmV0L250ZnMvZmlsZXMvdXNuanJubC5odG1sCisgKi8KK2VudW0geworCVVTTl9SRUFTT05fREFUQV9PVkVSV1JJVEUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlVU05fUkVBU09OX0RBVEFfRVhURU5ECQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCVVTTl9SRUFTT05fREFUQV9UUlVOQ0FUSU9OCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisJVVNOX1JFQVNPTl9OQU1FRF9EQVRBX09WRVJXUklURQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMTApLAorCVVTTl9SRUFTT05fTkFNRURfREFUQV9FWFRFTkQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKwlVU05fUkVBU09OX05BTUVEX0RBVEFfVFJVTkNBVElPTj0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCksCisJVVNOX1JFQVNPTl9GSUxFX0NSRUFURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKKwlVU05fUkVBU09OX0ZJTEVfREVMRVRFCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAyMDApLAorCVVTTl9SRUFTT05fRUFfQ0hBTkdFCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDA0MDApLAorCVVTTl9SRUFTT05fU0VDVVJJVFlfQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDgwMCksCisJVVNOX1JFQVNPTl9SRU5BTUVfT0xEX05BTUUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAxMDAwKSwKKwlVU05fUkVBU09OX1JFTkFNRV9ORVdfTkFNRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDIwMDApLAorCVVTTl9SRUFTT05fSU5ERVhBQkxFX0NIQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDQwMDApLAorCVVTTl9SRUFTT05fQkFTSUNfSU5GT19DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA4MDAwKSwKKwlVU05fUkVBU09OX0hBUkRfTElOS19DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDEwMDAwKSwKKwlVU05fUkVBU09OX0NPTVBSRVNTSU9OX0NIQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMjAwMDApLAorCVVTTl9SRUFTT05fRU5DUllQVElPTl9DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDQwMDAwKSwKKwlVU05fUkVBU09OX09CSkVDVF9JRF9DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDgwMDAwKSwKKwlVU05fUkVBU09OX1JFUEFSU0VfUE9JTlRfQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDEwMDAwMCksCisJVVNOX1JFQVNPTl9TVFJFQU1fQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDIwMDAwMCksCisJVVNOX1JFQVNPTl9DTE9TRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDgwMDAwMDAwKSwKK307CisKK3R5cGVkZWYgbGUzMiBVU05fUkVBU09OX0ZMQUdTOworCisvKgorICogU291cmNlIGluZm8gZmxhZ3MgKDMyLWJpdCkuICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIHRoZSBjaGFuZ2UocykKKyAqIHRvIHRoZSBmaWxlLiAgRm9yIGRldGFpbGVkIGRlc2NyaXB0aW9ucyBvZiB3aGF0IHRoZXNlIG1lYW4sIHNlZSB0aGUgTGludXgKKyAqIE5URlMgcHJvamVjdCBOVEZTIGRvY3VtZW50YXRpb246CisgKglodHRwOi8vbGludXgtbnRmcy5zb3VyY2Vmb3JnZS5uZXQvbnRmcy9maWxlcy91c25qcm5sLmh0bWwKKyAqLworZW51bSB7CisJVVNOX1NPVVJDRV9EQVRBX01BTkFHRU1FTlQJICA9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCVVTTl9TT1VSQ0VfQVVYSUxJQVJZX0RBVEEJICA9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCVVTTl9TT1VSQ0VfUkVQTElDQVRJT05fTUFOQUdFTUVOVCA9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpLAorfTsKKwordHlwZWRlZiBsZTMyIFVTTl9TT1VSQ0VfSU5GT19GTEFHUzsKKworLyoKKyAqICREQVRBLyRKIGF0dHJpYnV0ZS4gIFRoaXMgaXMgYWx3YXlzIG5vbi1yZXNpZGVudCwgaXMgbWFya2VkIGFzIHNwYXJzZSwgYW5kCisgKiBpcyBvZiB2YXJpYWJsZWQgc2l6ZS4gIEl0IGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgc2l6ZQorICogVVNOX1JFQ09SRFMuICBUaGUgbWluaW11bSBhbGxvY2F0ZWRfc2l6ZSBpcyBhbGxvY2F0aW9uX2RlbHRhIGFzCisgKiBzcGVjaWZpZWQgaW4gJERBVEEvJE1heC4gIFdoZW4gdGhlIG1heGltdW1fc2l6ZSBzcGVjaWZpZWQgaW4gJERBVEEvJE1heCBpcworICogZXhjZWVkZWQgYnkgbW9yZSB0aGFuIGFsbG9jYXRpb25fZGVsdGEgYnl0ZXMsIGFsbG9jYXRpb25fZGVsdGEgYnl0ZXMgYXJlCisgKiBhbGxvY2F0ZWQgYW5kIGFwcGVuZGVkIHRvIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUgYW5kIGFuIGVxdWFsIG51bWJlciBvZgorICogYnl0ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXR0cmlidXRlIGFyZSBmcmVlZCBhbmQgbWFkZSBzcGFyc2UuICBOb3RlIHRoZQorICogbWFraW5nIHNwYXJzZSBvbmx5IGhhcHBlbnMgYXQgdm9sdW1lIGNoZWNrcG9pbnRzIGFuZCBoZW5jZSB0aGUgYWN0dWFsCisgKiAkREFUQS8kSiBzaXplIGNhbiBleGNlZWQgbWF4aW11bV9zaXplICsgYWxsb2NhdGlvbl9kZWx0YSB0ZW1wb3JhcmlseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogICAwKi9sZTMyIGxlbmd0aDsJCS8qIEJ5dGUgc2l6ZSBvZiB0aGlzIHJlY29yZCAoOC1ieXRlCisJCQkJICAgYWxpZ25lZCkuICovCisvKiAgIDQqL2xlMTYgbWFqb3JfdmVyOwkJLyogTWFqb3IgdmVyc2lvbiBvZiB0aGUgdHJhbnNhY3Rpb24gbG9nIHVzZWQKKwkJCQkgICBmb3IgdGhpcyByZWNvcmQuICovCisvKiAgIDYqL2xlMTYgbWlub3JfdmVyOwkJLyogTWlub3IgdmVyc2lvbiBvZiB0aGUgdHJhbnNhY3Rpb24gbG9nIHVzZWQKKwkJCQkgICBmb3IgdGhpcyByZWNvcmQuICovCisvKiAgIDgqL2xlTUZUX1JFRiBtZnRfcmVmZXJlbmNlOy8qIFRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBmaWxlIChvcgorCQkJCSAgIGRpcmVjdG9yeSkgZGVzY3JpYmVkIGJ5IHRoaXMgcmVjb3JkLiAqLworLyoweDEwKi9sZU1GVF9SRUYgcGFyZW50X2RpcmVjdG9yeTsvKiBUaGUgbWZ0IHJlZmVyZW5jZSBvZiB0aGUgcGFyZW50CisJCQkJICAgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGRlc2NyaWJlZCBieSB0aGlzCisJCQkJICAgcmVjb3JkLiAqLworLyoweDE4Ki9sZVVTTiB1c247CQkvKiBUaGUgdXNuIG9mIHRoaXMgcmVjb3JkLiAgRXF1YWxzIHRoZSBvZmZzZXQKKwkJCQkgICB3aXRoaW4gdGhlICREQVRBLyRKIGF0dHJpYnV0ZS4gKi8KKy8qMHgyMCovc2xlNjQgdGltZTsJCS8qIFRpbWUgd2hlbiB0aGlzIHJlY29yZCB3YXMgY3JlYXRlZC4gKi8KKy8qMHgyOCovVVNOX1JFQVNPTl9GTEFHUyByZWFzb247LyogUmVhc29uIGZsYWdzIChzZWUgYWJvdmUpLiAqLworLyoweDJjKi9VU05fU09VUkNFX0lORk9fRkxBR1Mgc291cmNlX2luZm87LyogU291cmNlIGluZm8gZmxhZ3MgKHNlZSBhYm92ZSkuICovCisvKjB4MzAqL2xlMzIgc2VjdXJpdHlfaWQ7CS8qIEZpbGUgc2VjdXJpdHlfaWQgY29waWVkIGZyb20KKwkJCQkgICAkU1RBTkRBUkRfSU5GT1JNQVRJT04uICovCisvKjB4MzQqL0ZJTEVfQVRUUl9GTEFHUyBmaWxlX2F0dHJpYnV0ZXM7CS8qIEZpbGUgYXR0cmlidXRlcyBjb3BpZWQgZnJvbQorCQkJCSAgICRTVEFOREFSRF9JTkZPUk1BVElPTiBvciAkRklMRV9OQU1FIChub3QKKwkJCQkgICBzdXJlIHdoaWNoKS4gKi8KKy8qMHgzOCovbGUxNiBmaWxlX25hbWVfc2l6ZTsJLyogU2l6ZSBvZiB0aGUgZmlsZSBuYW1lIGluIGJ5dGVzLiAqLworLyoweDNhKi9sZTE2IGZpbGVfbmFtZV9vZmZzZXQ7CS8qIE9mZnNldCB0byB0aGUgZmlsZSBuYW1lIGluIGJ5dGVzIGZyb20gdGhlCisJCQkJICAgc3RhcnQgb2YgdGhpcyByZWNvcmQuICovCisvKjB4M2MqL250ZnNjaGFyIGZpbGVfbmFtZVswXTsJLyogVXNlIHdoZW4gY3JlYXRpbmcgb25seS4gIFdoZW4gcmVhZGluZyB1c2UKKwkJCQkgICBmaWxlX25hbWVfb2Zmc2V0IHRvIGRldGVybWluZSB0aGUgbG9jYXRpb24KKwkJCQkgICBvZiB0aGUgbmFtZS4gKi8KKy8qIHNpemVvZigpID0gNjAgKDB4M2MpIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVVNOX1JFQ09SRDsKKworZXh0ZXJuIEJPT0wgbnRmc19zdGFtcF91c25qcm5sKG50ZnNfdm9sdW1lICp2b2wpOworCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogX0xJTlVYX05URlNfVVNOSlJOTF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3ZvbHVtZS5oIGIvZnMvbnRmcy92b2x1bWUuaAppbmRleCA0Yjk3ZmE4Li4zNzVjZDIwIDEwMDY0NAotLS0gYS9mcy9udGZzL3ZvbHVtZS5oCisrKyBiL2ZzL250ZnMvdm9sdW1lLmgKQEAgLTIsNyArMiw3IEBACiAgKiB2b2x1bWUuaCAtIERlZmluZXMgZm9yIHZvbHVtZSBzdHJ1Y3R1cmVzIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4gUGFydAogICoJICAgICAgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTU0LDcgKzU0LDcgQEAKIAltb2RlX3QgZG1hc2s7CQkJLyogVGhlIG1hc2sgZm9yIGRpcmVjdG9yeQogCQkJCQkgICBwZXJtaXNzaW9ucy4gKi8KIAl1OCBtZnRfem9uZV9tdWx0aXBsaWVyOwkJLyogSW5pdGlhbCBtZnQgem9uZSBtdWx0aXBsaWVyLiAqLwotCXU4IG9uX2Vycm9yczsJCQkvKiBXaGF0IHRvIGRvIG9uIGZpbGUgc3lzdGVtIGVycm9ycy4gKi8KKwl1OCBvbl9lcnJvcnM7CQkJLyogV2hhdCB0byBkbyBvbiBmaWxlc3lzdGVtIGVycm9ycy4gKi8KIAkvKiBOVEZTIGJvb3RzZWN0b3IgcHJvdmlkZWQgaW5mb3JtYXRpb24uICovCiAJdTE2IHNlY3Rvcl9zaXplOwkJLyogaW4gYnl0ZXMgKi8KIAl1OCBzZWN0b3Jfc2l6ZV9iaXRzOwkJLyogbG9nMihzZWN0b3Jfc2l6ZSkgKi8KQEAgLTEyNSw2ICsxMjUsMTAgQEAKIAkvKiAkUXVvdGEgc3R1ZmYgaXMgTlRGUzMuMCsgc3BlY2lmaWMuICBVbnVzZWQvTlVMTCBvdGhlcndpc2UuICovCiAJc3RydWN0IGlub2RlICpxdW90YV9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJFF1b3RhLiAqLwogCXN0cnVjdCBpbm9kZSAqcXVvdGFfcV9pbm87CS8qIEF0dHJpYnV0ZSBpbm9kZSBmb3IgJFF1b3RhLyRRLiAqLworCS8qICRVc25Kcm5sIHN0dWZmIGlzIE5URlMzLjArIHNwZWNpZmljLiAgVW51c2VkL05VTEwgb3RoZXJ3aXNlLiAqLworCXN0cnVjdCBpbm9kZSAqdXNuanJubF9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJFVzbkpybmwuICovCisJc3RydWN0IGlub2RlICp1c25qcm5sX21heF9pbm87CS8qIEF0dHJpYnV0ZSBpbm9kZSBmb3IgJFVzbkpybmwvJE1heC4gKi8KKwlzdHJ1Y3QgaW5vZGUgKnVzbmpybmxfal9pbm87CS8qIEF0dHJpYnV0ZSBpbm9kZSBmb3IgJFVzbkpybmwvJEouICovCiAjZW5kaWYgLyogTlRGU19SVyAqLwogCXN0cnVjdCBubHNfdGFibGUgKm5sc19tYXA7CiB9IG50ZnNfdm9sdW1lOwpAQCAtMTQxLDYgKzE0NSw4IEBACiAJCQkJICAgICAgZmlsZSBuYW1lcyBpbiBXSU4zMiBuYW1lc3BhY2UuICovCiAJTlZfTG9nRmlsZUVtcHR5LAkvKiAxOiAkTG9nRmlsZSBqb3VybmFsIGlzIGVtcHR5LiAqLwogCU5WX1F1b3RhT3V0T2ZEYXRlLAkvKiAxOiAkUXVvdGEgaXMgb3V0IG9mIGRhdGUuICovCisJTlZfVXNuSnJubFN0YW1wZWQsCS8qIDE6ICRVc25Kcm5sIGhhcyBiZWVuIHN0YW1wZWQuICovCisJTlZfU3BhcnNlRW5hYmxlZCwJLyogMTogTWF5IGNyZWF0ZSBzcGFyc2UgZmlsZXMuICovCiB9IG50ZnNfdm9sdW1lX2ZsYWdzOwogCiAvKgpAQCAtMTY3LDUgKzE3Myw3IEBACiBOVk9MX0ZOUyhDYXNlU2Vuc2l0aXZlKQogTlZPTF9GTlMoTG9nRmlsZUVtcHR5KQogTlZPTF9GTlMoUXVvdGFPdXRPZkRhdGUpCitOVk9MX0ZOUyhVc25Kcm5sU3RhbXBlZCkKK05WT0xfRk5TKFNwYXJzZUVuYWJsZWQpCiAKICNlbmRpZiAvKiBfTElOVVhfTlRGU19WT0xVTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDNmNGE0MjguLjMyYmYwNWUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KQEAgLTk1MSw2ICs5NTEsNyBAQAogCQkJCXB1dF91bnVzZWRfZmQoZmQpOwogCQkJCWZkID0gUFRSX0VSUihmKTsKIAkJCX0gZWxzZSB7CisJCQkJZnNub3RpZnlfb3BlbihmLT5mX2RlbnRyeSk7CiAJCQkJZmRfaW5zdGFsbChmZCwgZik7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA5MjkyZjVmLi41NjNhYmQwIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpAQCAtMjUyLDcgKzI1Miw3IEBACiAJCQllbHNlCiAJCQkJcmV0ID0gZG9fc3luY19yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CiAJCQlpZiAocmV0ID4gMCkgewotCQkJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9BQ0NFU1MpOworCQkJCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX2RlbnRyeSk7CiAJCQkJY3VycmVudC0+cmNoYXIgKz0gcmV0OwogCQkJfQogCQkJY3VycmVudC0+c3lzY3IrKzsKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkJZWxzZQogCQkJCXJldCA9IGRvX3N5bmNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKIAkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksIEROX01PRElGWSk7CisJCQkJZnNub3RpZnlfbW9kaWZ5KGZpbGUtPmZfZGVudHJ5KTsKIAkJCQljdXJyZW50LT53Y2hhciArPSByZXQ7CiAJCQl9CiAJCQljdXJyZW50LT5zeXNjdysrOwpAQCAtNTM5LDkgKzUzOSwxMiBAQAogb3V0OgogCWlmIChpb3YgIT0gaW92c3RhY2spCiAJCWtmcmVlKGlvdik7Ci0JaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKQotCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwKLQkJCQkodHlwZSA9PSBSRUFEKSA/IEROX0FDQ0VTUyA6IEROX01PRElGWSk7CisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKSB7CisJCWlmICh0eXBlID09IFJFQUQpCisJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9kZW50cnkpOworCQllbHNlCisJCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9kZW50cnkpOworCX0KIAlyZXR1cm4gcmV0OwogRWZhdWx0OgogCXJldCA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9iaXRtYXAuYyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCmluZGV4IDQ5YzQ3OWMuLjkwOWY3MWUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCisrKyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCkBAIC00NiwxMTI1ICs0NiwxMjIxIEBACiAjZGVmaW5lIFRFU1RfT1BUSU9OKG9wdG5hbWUsIHMpIFwKICAgICB0ZXN0X2JpdChfQUxMT0NfICMjIG9wdG5hbWUgLCAmU0JfQUxMT0NfT1BUUyhzKSkKIAotc3RhdGljIGlubGluZSB2b2lkIGdldF9iaXRfYWRkcmVzcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywKLQkJCQkgICAgYl9ibG9ja25yX3QgYmxvY2ssIGludCAqIGJtYXBfbnIsIGludCAqIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYml0X2FkZHJlc3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCSAgIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgKmJtYXBfbnIsIGludCAqb2Zmc2V0KQogewotICAgIC8qIEl0IGlzIGluIHRoZSBiaXRtYXAgYmxvY2sgbnVtYmVyIGVxdWFsIHRvIHRoZSBibG9jawotICAgICAqIG51bWJlciBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGJsb2NrLiAqLwotICAgICpibWFwX25yID0gYmxvY2sgLyAocy0+c19ibG9ja3NpemUgPDwgMyk7Ci0gICAgLyogV2l0aGluIHRoYXQgYml0bWFwIGJsb2NrIGl0IGlzIGxvY2F0ZWQgYXQgYml0IG9mZnNldCAqb2Zmc2V0LiAqLwotICAgICpvZmZzZXQgPSBibG9jayAmICgocy0+c19ibG9ja3NpemUgPDwgMykgLSAxICk7Ci0gICAgcmV0dXJuOworCS8qIEl0IGlzIGluIHRoZSBiaXRtYXAgYmxvY2sgbnVtYmVyIGVxdWFsIHRvIHRoZSBibG9jaworCSAqIG51bWJlciBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGJsb2NrLiAqLworCSpibWFwX25yID0gYmxvY2sgLyAocy0+c19ibG9ja3NpemUgPDwgMyk7CisJLyogV2l0aGluIHRoYXQgYml0bWFwIGJsb2NrIGl0IGlzIGxvY2F0ZWQgYXQgYml0IG9mZnNldCAqb2Zmc2V0LiAqLworCSpvZmZzZXQgPSBibG9jayAmICgocy0+c19ibG9ja3NpemUgPDwgMykgLSAxKTsKKwlyZXR1cm47CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpCitpbnQgaXNfcmV1c2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSkKIHsKLSAgICBpbnQgaSwgajsKKwlpbnQgaSwgajsKIAotICAgIGlmIChibG9jayA9PSAwIHx8IGJsb2NrID49IFNCX0JMT0NLX0NPVU5UIChzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDEwOiBpc19yZXVzYWJsZTogYmxvY2sgbnVtYmVyIGlzIG91dCBvZiByYW5nZSAlbHUgKCV1KSIsCi0JCQkgIGJsb2NrLCBTQl9CTE9DS19DT1VOVCAocykpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGl0IGNhbid0IGJlIG9uZSBvZiB0aGUgYml0bWFwIGJsb2NrcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SIChzKTsgaSArKykKLQlpZiAoYmxvY2sgPT0gU0JfQVBfQklUTUFQIChzKVtpXS5iaC0+Yl9ibG9ja25yKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2czogNDAyMDogaXNfcmV1c2FibGU6ICIKLQkJCSAgICAgICJiaXRtYXAgYmxvY2sgJWx1KCV1KSBjYW4ndCBiZSBmcmVlZCBvciByZXVzZWQiLAotCQkJICAgICAgYmxvY2ssIFNCX0JNQVBfTlIgKHMpKTsKLQkgICAgcmV0dXJuIDA7CisJaWYgKGJsb2NrID09IDAgfHwgYmxvY2sgPj0gU0JfQkxPQ0tfQ09VTlQocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtNDAxMDogaXNfcmV1c2FibGU6IGJsb2NrIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgJWx1ICgldSkiLAorCQkJCSBibG9jaywgU0JfQkxPQ0tfQ09VTlQocykpOworCQlyZXR1cm4gMDsKIAl9Ci0gIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgYmxvY2ssICZpLCAmaik7CiAKLSAgICBpZiAoaSA+PSBTQl9CTUFQX05SIChzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDMwOiBpc19yZXVzYWJsZTogdGhlcmUgaXMgbm8gc28gbWFueSBiaXRtYXAgYmxvY2tzOiAiCi0JCQkgICJibG9jaz0lbHUsIGJpdG1hcF9ucj0lZCIsIGJsb2NrLCBpKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJLyogaXQgY2FuJ3QgYmUgb25lIG9mIHRoZSBiaXRtYXAgYmxvY2tzICovCisJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJaWYgKGJsb2NrID09IFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJ2czogNDAyMDogaXNfcmV1c2FibGU6ICIKKwkJCQkJICJiaXRtYXAgYmxvY2sgJWx1KCV1KSBjYW4ndCBiZSBmcmVlZCBvciByZXVzZWQiLAorCQkJCQkgYmxvY2ssIFNCX0JNQVBfTlIocykpOworCQkJcmV0dXJuIDA7CisJCX0KIAotICAgIGlmICgoYml0X3ZhbHVlID09IDAgJiYgCi0gICAgICAgICByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfZGF0YSkpIHx8Ci0JKGJpdF92YWx1ZSA9PSAxICYmIAotCSByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpID09IDApKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNDA6IGlzX3JldXNhYmxlOiBjb3JyZXNwb25kaW5nIGJpdCBvZiBibG9jayAlbHUgZG9lcyBub3QgIgotCQkJICAibWF0Y2ggcmVxdWlyZWQgdmFsdWUgKGk9PSVkLCBqPT0lZCkgdGVzdF9iaXQ9PSVkIiwKLQkJYmxvY2ssIGksIGosIHJlaXNlcmZzX3Rlc3RfbGVfYml0IChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpKTsKKwlnZXRfYml0X2FkZHJlc3MocywgYmxvY2ssICZpLCAmaik7CiAKLQlyZXR1cm4gMDsKLSAgICB9CisJaWYgKGkgPj0gU0JfQk1BUF9OUihzKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy00MDMwOiBpc19yZXVzYWJsZTogdGhlcmUgaXMgbm8gc28gbWFueSBiaXRtYXAgYmxvY2tzOiAiCisJCQkJICJibG9jaz0lbHUsIGJpdG1hcF9ucj0lZCIsIGJsb2NrLCBpKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgaWYgKGJpdF92YWx1ZSA9PSAwICYmIGJsb2NrID09IFNCX1JPT1RfQkxPQ0sgKHMpKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNTA6IGlzX3JldXNhYmxlOiB0aGlzIGlzIHJvb3QgYmxvY2sgKCV1KSwgIgotCQkJICAiaXQgbXVzdCBiZSBidXN5IiwgU0JfUk9PVF9CTE9DSyAocykpOwotCXJldHVybiAwOwotICAgIH0KKwlpZiAoKGJpdF92YWx1ZSA9PSAwICYmCisJICAgICByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfZGF0YSkpIHx8CisJICAgIChiaXRfdmFsdWUgPT0gMSAmJgorCSAgICAgcmVpc2VyZnNfdGVzdF9sZV9iaXQoaiwgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2RhdGEpID09IDApKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInZzLTQwNDA6IGlzX3JldXNhYmxlOiBjb3JyZXNwb25kaW5nIGJpdCBvZiBibG9jayAlbHUgZG9lcyBub3QgIgorCQkJCSAibWF0Y2ggcmVxdWlyZWQgdmFsdWUgKGk9PSVkLCBqPT0lZCkgdGVzdF9iaXQ9PSVkIiwKKwkJCQkgYmxvY2ssIGksIGosIHJlaXNlcmZzX3Rlc3RfbGVfYml0KGosCisJCQkJCQkJCSAgIFNCX0FQX0JJVE1BUAorCQkJCQkJCQkgICAocylbaV0uYmgtPgorCQkJCQkJCQkgICBiX2RhdGEpKTsKIAotICAgIHJldHVybiAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYml0X3ZhbHVlID09IDAgJiYgYmxvY2sgPT0gU0JfUk9PVF9CTE9DSyhzKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy00MDUwOiBpc19yZXVzYWJsZTogdGhpcyBpcyByb290IGJsb2NrICgldSksICIKKwkJCQkgIml0IG11c3QgYmUgYnVzeSIsIFNCX1JPT1RfQkxPQ0socykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAogLyogc2VhcmNoZXMgaW4gam91cm5hbCBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIGJsb2NrIG51bWJlciAoYm1hcCwgb2ZmKS4gSWYgYmxvY2sKICAgIGlzIGZvdW5kIGluIHJlaXNlcmZzIGpvdXJuYWwgaXQgc3VnZ2VzdHMgbmV4dCBmcmVlIGJsb2NrIGNhbmRpZGF0ZSB0byB0ZXN0LiAqLwotc3RhdGljIGlubGluZSAgaW50IGlzX2Jsb2NrX2luX2pvdXJuYWwgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCBibWFwLCBpbnQKLW9mZiwgaW50ICpuZXh0KQorc3RhdGljIGlubGluZSBpbnQgaXNfYmxvY2tfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBibWFwLCBpbnQKKwkJCQkgICAgICBvZmYsIGludCAqbmV4dCkKIHsKLSAgICBiX2Jsb2NrbnJfdCB0bXA7CisJYl9ibG9ja25yX3QgdG1wOwogCi0gICAgaWYgKHJlaXNlcmZzX2luX2pvdXJuYWwgKHMsIGJtYXAsIG9mZiwgMSwgJnRtcCkpIHsKLQlpZiAodG1wKSB7ICAgICAgICAgICAgICAvKiBoaW50IHN1cHBsaWVkICovCi0JICAgICpuZXh0ID0gdG1wOwotCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX2hpbnQgKTsKLQl9IGVsc2UgewotCSAgICAoKm5leHQpID0gb2ZmICsgMTsgICAgICAgICAgLyogaW5jIG9mZnNldCB0byBhdm9pZCBsb29waW5nLiAqLwotCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX25vaGludCApOworCWlmIChyZWlzZXJmc19pbl9qb3VybmFsKHMsIGJtYXAsIG9mZiwgMSwgJnRtcCkpIHsKKwkJaWYgKHRtcCkgewkvKiBoaW50IHN1cHBsaWVkICovCisJCQkqbmV4dCA9IHRtcDsKKwkJCVBST0NfSU5GT19JTkMocywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9oaW50KTsKKwkJfSBlbHNlIHsKKwkJCSgqbmV4dCkgPSBvZmYgKyAxOwkvKiBpbmMgb2Zmc2V0IHRvIGF2b2lkIGxvb3BpbmcuICovCisJCQlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLmluX2pvdXJuYWxfbm9oaW50KTsKKwkJfQorCQlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLnJldHJ5KTsKKwkJcmV0dXJuIDE7CiAJfQotCVBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLnJldHJ5ICk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKiBpdCBzZWFyY2hlcyBmb3IgYSB3aW5kb3cgb2YgemVybyBiaXRzIHdpdGggZ2l2ZW4gbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGhzIGluIG9uZSBiaXRtYXAKICAqIGJsb2NrOyAqLwotc3RhdGljIGludCBzY2FuX2JpdG1hcF9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICAgICBpbnQgYm1hcF9uLCBpbnQgKmJlZywgaW50IGJvdW5kYXJ5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSkKK3N0YXRpYyBpbnQgc2Nhbl9iaXRtYXBfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIGludCBibWFwX24sIGludCAqYmVnLCBpbnQgYm91bmRhcnksIGludCBtaW4sCisJCQkgICAgIGludCBtYXgsIGludCB1bmZtKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOwotICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYmk9JlNCX0FQX0JJVE1BUChzKVtibWFwX25dOwotICAgIGludCBlbmQsIG5leHQ7Ci0gICAgaW50IG9yZyA9ICpiZWc7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSA9ICZTQl9BUF9CSVRNQVAocylbYm1hcF9uXTsKKwlpbnQgZW5kLCBuZXh0OworCWludCBvcmcgPSAqYmVnOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgUkZBTFNFKGJtYXBfbiA+PSBTQl9CTUFQX05SIChzKSwgIkJpdG1hcCAlZCBpcyBvdXQgb2YgcmFuZ2UgKDAuLiVkKSIsYm1hcF9uLCBTQl9CTUFQX05SIChzKSAtIDEpOwotICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLmJtYXAgKTsKKwlSRkFMU0UoYm1hcF9uID49IFNCX0JNQVBfTlIocyksICJCaXRtYXAgJWQgaXMgb3V0IG9mIHJhbmdlICgwLi4lZCkiLAorCSAgICAgICBibWFwX24sIFNCX0JNQVBfTlIocykgLSAxKTsKKwlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLmJtYXApOwogLyogdGhpcyBpcyB1bmNsZWFyIGFuZCBsYWNrcyBjb21tZW50cywgZXhwbGFpbiBob3cgam91cm5hbCBiaXRtYXBzCiAgICB3b3JrIGhlcmUgZm9yIHRoZSByZWFkZXIuICBDb252ZXkgYSBzZW5zZSBvZiB0aGUgZGVzaWduIGhlcmUuIFdoYXQKICAgIGlzIGEgd2luZG93PyAqLwogLyogLSBJIG1lYW4gYGEgd2luZG93IG9mIHplcm8gYml0cycgYXMgaW4gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbiAtIFphbS4gKi8KLSAgCi0gICAgaWYgKCAhYmkgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgIk5VTEwgYml0bWFwIGluZm8gcG9pbnRlciBmb3IgYml0bWFwICVkIiwgYm1hcF9uKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKGJpLT5iaCkpIHsKLSAgICAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC53YWl0ICk7Ci0gICAgICAgX193YWl0X29uX2J1ZmZlciAoYmktPmJoKTsKLSAgICB9CiAKLSAgICB3aGlsZSAoMSkgewotCWNvbnQ6Ci0JaWYgKGJpLT5mcmVlX2NvdW50IDwgbWluKQotCQlyZXR1cm4gMDsgLy8gTm8gZnJlZSBibG9ja3MgaW4gdGhpcyBiaXRtYXAKLQotCS8qIHNlYXJjaCBmb3IgYSBmaXJzdCB6ZXJvIGJpdCAtLSBiZWdnaW5pbmcgb2YgYSB3aW5kb3cgKi8KLQkqYmVnID0gcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0Ci0JICAgICAgICAoKHVuc2lnbmVkIGxvbmcqKShiaS0+YmgtPmJfZGF0YSksIGJvdW5kYXJ5LCAqYmVnKTsKLSAgCi0JaWYgKCpiZWcgKyBtaW4gPiBib3VuZGFyeSkgeyAvKiBzZWFyY2ggZm9yIGEgemVybyBiaXQgZmFpbHMgb3IgdGhlIHJlc3Qgb2YgYml0bWFwIGJsb2NrCi0JCQkJICAgICAgKiBjYW5ub3QgY29udGFpbiBhIHplcm8gd2luZG93IG9mIG1pbmltdW0gc2l6ZSAqLwotCSAgICByZXR1cm4gMDsKKwlpZiAoIWJpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgIk5VTEwgYml0bWFwIGluZm8gcG9pbnRlciBmb3IgYml0bWFwICVkIiwKKwkJCQkgYm1hcF9uKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChidWZmZXJfbG9ja2VkKGJpLT5iaCkpIHsKKwkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC53YWl0KTsKKwkJX193YWl0X29uX2J1ZmZlcihiaS0+YmgpOwogCX0KIAotCWlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocyxibWFwX24sICpiZWcsIGJlZykpCi0JICAgIGNvbnRpbnVlOwotCS8qIGZpcnN0IHplcm8gYml0IGZvdW5kOyB3ZSBjaGVjayBuZXh0IGJpdHMgKi8KLQlmb3IgKGVuZCA9ICpiZWcgKyAxOzsgZW5kICsrKSB7Ci0JICAgIGlmIChlbmQgPj0gKmJlZyArIG1heCB8fCBlbmQgPj0gYm91bmRhcnkgfHwgcmVpc2VyZnNfdGVzdF9sZV9iaXQgKGVuZCwgYmktPmJoLT5iX2RhdGEpKSB7Ci0JCW5leHQgPSBlbmQ7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIC8qIGZpbmRpbmcgdGhlIG90aGVyIGVuZCBvZiB6ZXJvIGJpdCB3aW5kb3cgcmVxdWlyZXMgbG9va2luZyBpbnRvIGpvdXJuYWwgc3RydWN0dXJlcyAoaW4KLQkgICAgICogY2FzZSBvZiBzZWFyY2hpbmcgZm9yIGZyZWUgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlcykgKi8KLQkgICAgaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sIGVuZCwgJm5leHQpKQotCQlicmVhazsKLQl9CisJd2hpbGUgKDEpIHsKKwkgICAgICBjb250OgorCQlpZiAoYmktPmZyZWVfY291bnQgPCBtaW4pCisJCQlyZXR1cm4gMDsJLy8gTm8gZnJlZSBibG9ja3MgaW4gdGhpcyBiaXRtYXAKIAotCS8qIG5vdyAoKmJlZykgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB6ZXJvIGJpdHMgd2luZG93LAotCSAqIChlbmQpIHBvaW50cyB0byBvbmUgYml0IGFmdGVyIHRoZSB3aW5kb3cgZW5kICovCi0JaWYgKGVuZCAtICpiZWcgPj0gbWluKSB7IC8qIGl0IHNlZW1zIHdlIGhhdmUgZm91bmQgd2luZG93IG9mIHByb3BlciBzaXplICovCi0JICAgIGludCBpOwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIChzLCBiaS0+YmgsIDEpOwotCSAgICAvKiB0cnkgdG8gc2V0IGFsbCBibG9ja3MgdXNlZCBjaGVja2luZyBhcmUgdGhleSBzdGlsbCBmcmVlICovCi0JICAgIGZvciAoaSA9ICpiZWc7IGkgPCBlbmQ7IGkrKykgewotCQkvKiBJdCBzZWVtcyB0aGF0IHdlIHNob3VsZCBub3QgY2hlY2sgaW4gam91cm5hbCBhZ2Fpbi4gKi8KLQkJaWYgKHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQgKGksIGJpLT5iaC0+Yl9kYXRhKSkgewotCQkgICAgLyogYml0IHdhcyBzZXQgYnkgYW5vdGhlciBwcm9jZXNzCi0JCSAgICAgKiB3aGlsZSB3ZSBzbGVwdCBpbiBwcmVwYXJlX2Zvcl9qb3VybmFsKCkgKi8KLQkJICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLnN0b2xlbiApOwotCQkgICAgaWYgKGkgPj0gKmJlZyArIG1pbikJeyAvKiB3ZSBjYW4gY29udGludWUgd2l0aCBzbWFsbGVyIHNldCBvZiBhbGxvY2F0ZWQgYmxvY2tzLAotCQkJCQkgICAqIGlmIGxlbmd0aCBvZiB0aGlzIHNldCBpcyBtb3JlIG9yIGVxdWFsIHRvIGBtaW4nICovCi0JCQllbmQgPSBpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAvKiBvdGhlcndpc2Ugd2UgY2xlYXIgYWxsIGJpdCB3ZXJlIHNldCAuLi4gKi8KLQkJICAgIHdoaWxlICgtLWkgPj0gKmJlZykKLQkJCXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdCAoaSwgYmktPmJoLT5iX2RhdGEpOwotCQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHMsIGJpLT5iaCk7Ci0JCSAgICAqYmVnID0gb3JnOwotCQkgICAgLyogLi4uIGFuZCBzZWFyY2ggYWdhaW4gaW4gY3VycmVudCBibG9jayBmcm9tIGJlZ2lubmluZyAqLwotCQkgICAgZ290byBjb250OwkKKwkJLyogc2VhcmNoIGZvciBhIGZpcnN0IHplcm8gYml0IC0tIGJlZ2dpbmluZyBvZiBhIHdpbmRvdyAqLworCQkqYmVnID0gcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0CisJCSAgICAoKHVuc2lnbmVkIGxvbmcgKikoYmktPmJoLT5iX2RhdGEpLCBib3VuZGFyeSwgKmJlZyk7CisKKwkJaWYgKCpiZWcgKyBtaW4gPiBib3VuZGFyeSkgewkvKiBzZWFyY2ggZm9yIGEgemVybyBiaXQgZmFpbHMgb3IgdGhlIHJlc3Qgb2YgYml0bWFwIGJsb2NrCisJCQkJCQkgKiBjYW5ub3QgY29udGFpbiBhIHplcm8gd2luZG93IG9mIG1pbmltdW0gc2l6ZSAqLworCQkJcmV0dXJuIDA7CiAJCX0KLQkgICAgfQotCSAgICBiaS0+ZnJlZV9jb3VudCAtPSAoZW5kIC0gKmJlZyk7Ci0JICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIGJpLT5iaCk7CiAKLQkgICAgLyogZnJlZSBibG9jayBjb3VudCBjYWxjdWxhdGlvbiAqLwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7Ci0JICAgIFBVVF9TQl9GUkVFX0JMT0NLUyhzLCBTQl9GUkVFX0JMT0NLUyhzKSAtIChlbmQgLSAqYmVnKSk7Ci0JICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkJaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sICpiZWcsIGJlZykpCisJCQljb250aW51ZTsKKwkJLyogZmlyc3QgemVybyBiaXQgZm91bmQ7IHdlIGNoZWNrIG5leHQgYml0cyAqLworCQlmb3IgKGVuZCA9ICpiZWcgKyAxOzsgZW5kKyspIHsKKwkJCWlmIChlbmQgPj0gKmJlZyArIG1heCB8fCBlbmQgPj0gYm91bmRhcnkKKwkJCSAgICB8fCByZWlzZXJmc190ZXN0X2xlX2JpdChlbmQsIGJpLT5iaC0+Yl9kYXRhKSkgeworCQkJCW5leHQgPSBlbmQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmaW5kaW5nIHRoZSBvdGhlciBlbmQgb2YgemVybyBiaXQgd2luZG93IHJlcXVpcmVzIGxvb2tpbmcgaW50byBqb3VybmFsIHN0cnVjdHVyZXMgKGluCisJCQkgKiBjYXNlIG9mIHNlYXJjaGluZyBmb3IgZnJlZSBibG9ja3MgZm9yIHVuZm9ybWF0dGVkIG5vZGVzKSAqLworCQkJaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sIGVuZCwgJm5leHQpKQorCQkJCWJyZWFrOworCQl9CiAKLQkgICAgcmV0dXJuIGVuZCAtICgqYmVnKTsKLQl9IGVsc2UgewotCSAgICAqYmVnID0gbmV4dDsKKwkJLyogbm93ICgqYmVnKSBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHplcm8gYml0cyB3aW5kb3csCisJCSAqIChlbmQpIHBvaW50cyB0byBvbmUgYml0IGFmdGVyIHRoZSB3aW5kb3cgZW5kICovCisJCWlmIChlbmQgLSAqYmVnID49IG1pbikgewkvKiBpdCBzZWVtcyB3ZSBoYXZlIGZvdW5kIHdpbmRvdyBvZiBwcm9wZXIgc2l6ZSAqLworCQkJaW50IGk7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJpLT5iaCwgMSk7CisJCQkvKiB0cnkgdG8gc2V0IGFsbCBibG9ja3MgdXNlZCBjaGVja2luZyBhcmUgdGhleSBzdGlsbCBmcmVlICovCisJCQlmb3IgKGkgPSAqYmVnOyBpIDwgZW5kOyBpKyspIHsKKwkJCQkvKiBJdCBzZWVtcyB0aGF0IHdlIHNob3VsZCBub3QgY2hlY2sgaW4gam91cm5hbCBhZ2Fpbi4gKi8KKwkJCQlpZiAocmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdAorCQkJCSAgICAoaSwgYmktPmJoLT5iX2RhdGEpKSB7CisJCQkJCS8qIGJpdCB3YXMgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcworCQkJCQkgKiB3aGlsZSB3ZSBzbGVwdCBpbiBwcmVwYXJlX2Zvcl9qb3VybmFsKCkgKi8KKwkJCQkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5zdG9sZW4pOworCQkJCQlpZiAoaSA+PSAqYmVnICsgbWluKSB7CS8qIHdlIGNhbiBjb250aW51ZSB3aXRoIHNtYWxsZXIgc2V0IG9mIGFsbG9jYXRlZCBibG9ja3MsCisJCQkJCQkJCSAqIGlmIGxlbmd0aCBvZiB0aGlzIHNldCBpcyBtb3JlIG9yIGVxdWFsIHRvIGBtaW4nICovCisJCQkJCQllbmQgPSBpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogb3RoZXJ3aXNlIHdlIGNsZWFyIGFsbCBiaXQgd2VyZSBzZXQgLi4uICovCisJCQkJCXdoaWxlICgtLWkgPj0gKmJlZykKKwkJCQkJCXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdAorCQkJCQkJICAgIChpLCBiaS0+YmgtPmJfZGF0YSk7CisJCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsCisJCQkJCQkJCQkgYmktPgorCQkJCQkJCQkJIGJoKTsKKwkJCQkJKmJlZyA9IG9yZzsKKwkJCQkJLyogLi4uIGFuZCBzZWFyY2ggYWdhaW4gaW4gY3VycmVudCBibG9jayBmcm9tIGJlZ2lubmluZyAqLworCQkJCQlnb3RvIGNvbnQ7CisJCQkJfQorCQkJfQorCQkJYmktPmZyZWVfY291bnQgLT0gKGVuZCAtICpiZWcpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBiaS0+YmgpOworCisJCQkvKiBmcmVlIGJsb2NrIGNvdW50IGNhbGN1bGF0aW9uICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLAorCQkJCQkJICAgICAxKTsKKwkJCVBVVF9TQl9GUkVFX0JMT0NLUyhzLCBTQl9GUkVFX0JMT0NLUyhzKSAtIChlbmQgLSAqYmVnKSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKworCQkJcmV0dXJuIGVuZCAtICgqYmVnKTsKKwkJfSBlbHNlIHsKKwkJCSpiZWcgPSBuZXh0OworCQl9CiAJfQotICAgIH0KIH0KIAotc3RhdGljIGludCBibWFwX2hhc2hfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpIHsKLSAgICBjaGFyICogaGFzaF9pbiA9IE5VTEw7Ci0gICAgdW5zaWduZWQgbG9uZyBoYXNoOwotICAgIHVuc2lnbmVkIGJtOworc3RhdGljIGludCBibWFwX2hhc2hfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpCit7CisJY2hhciAqaGFzaF9pbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXVuc2lnbmVkIGJtOwogCi0gICAgaWYgKGlkIDw9IDIpIHsKLQlibSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFzaF9pbiA9IChjaGFyICopKCZpZCk7Ci0gICAgICAgIGhhc2ggPSBrZXllZF9oYXNoKGhhc2hfaW4sIDQpOwotCWJtID0gaGFzaCAlIFNCX0JNQVBfTlIocyk7Ci0JaWYgKCFibSkKLQkgICAgYm0gPSAxOwotICAgIH0KLSAgICAvKiB0aGlzIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBTQl9CTUFQX05SID0gMSAqLwotICAgIGlmIChibSA+PSBTQl9CTUFQX05SKHMpKQotICAgIAlibSA9IDA7Ci0gICAgcmV0dXJuIGJtOworCWlmIChpZCA8PSAyKSB7CisJCWJtID0gMTsKKwl9IGVsc2UgeworCQloYXNoX2luID0gKGNoYXIgKikoJmlkKTsKKwkJaGFzaCA9IGtleWVkX2hhc2goaGFzaF9pbiwgNCk7CisJCWJtID0gaGFzaCAlIFNCX0JNQVBfTlIocyk7CisJCWlmICghYm0pCisJCQlibSA9IDE7CisJfQorCS8qIHRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSB3aGVuIFNCX0JNQVBfTlIgPSAxICovCisJaWYgKGJtID49IFNCX0JNQVBfTlIocykpCisJCWJtID0gMDsKKwlyZXR1cm4gYm07CiB9CiAKIC8qCiAgKiBoYXNoZXMgdGhlIGlkIGFuZCB0aGVuIHJldHVybnMgPiAwIGlmIHRoZSBibG9jayBncm91cCBmb3IgdGhlCiAgKiBjb3JyZXNwb25kaW5nIGhhc2ggaXMgZnVsbAogICovCi1zdGF0aWMgaW5saW5lIGludCBibG9ja19ncm91cF91c2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKSB7Ci0gICAgaW50IGJtOwotICAgIGJtID0gYm1hcF9oYXNoX2lkKHMsIGlkKTsKLSAgICBpZiAoU0JfQVBfQklUTUFQKHMpW2JtXS5mcmVlX2NvdW50ID4gKChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAqIDYwIC8gMTAwKSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOworc3RhdGljIGlubGluZSBpbnQgYmxvY2tfZ3JvdXBfdXNlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHUzMiBpZCkKK3sKKwlpbnQgYm07CisJYm0gPSBibWFwX2hhc2hfaWQocywgaWQpOworCWlmIChTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpICogNjAgLyAxMDApKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoKICAqIHRoZSBwYWNraW5nIGlzIHJldHVybmVkIGluIGRpc2sgYnl0ZSBvcmRlcgogICovCi1fX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICpkaXIpCitfX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICogZGlyKQogewotICAgIF9fbGUzMiBwYWNraW5nOwotICAgIGlmIChURVNUX09QVElPTihwYWNraW5nX2dyb3VwcywgZGlyLT5pX3NiKSkgewotCXUzMiBwYXJlbnRfZGlyID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCk7Ci0JLyoKLQkgKiBzb21lIHZlcnNpb25zIG9mIHJlaXNlcmZzY2sgZXhwZWN0IHBhY2tpbmcgbG9jYWxpdHkgMSB0byBiZQotCSAqIHNwZWNpYWwKLQkgKi8KLQlpZiAocGFyZW50X2RpciA9PSAxIHx8IGJsb2NrX2dyb3VwX3VzZWQoZGlyLT5pX3NiLHBhcmVudF9kaXIpKQotICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQ7Ci0gICAgfSBlbHNlCi0gICAgICAgIHBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7Ci0gICAgcmV0dXJuIHBhY2tpbmc7CisJX19sZTMyIHBhY2tpbmc7CisJaWYgKFRFU1RfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzLCBkaXItPmlfc2IpKSB7CisJCXUzMiBwYXJlbnRfZGlyID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCk7CisJCS8qCisJCSAqIHNvbWUgdmVyc2lvbnMgb2YgcmVpc2VyZnNjayBleHBlY3QgcGFja2luZyBsb2NhbGl0eSAxIHRvIGJlCisJCSAqIHNwZWNpYWwKKwkJICovCisJCWlmIChwYXJlbnRfZGlyID09IDEgfHwgYmxvY2tfZ3JvdXBfdXNlZChkaXItPmlfc2IsIHBhcmVudF9kaXIpKQorCQkJcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKKwkJZWxzZQorCQkJcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQ7CisJfSBlbHNlCisJCXBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7CisJcmV0dXJuIHBhY2tpbmc7CiB9Ci0gIAorCiAvKiBUcmllcyB0byBmaW5kIGNvbnRpZ3VvdXMgemVybyBiaXQgd2luZG93IChnaXZlbiBzaXplKSBpbiBnaXZlbiByZWdpb24gb2YKICAqIGJpdG1hcCBhbmQgcGxhY2UgbmV3IGJsb2NrcyB0aGVyZS4gUmV0dXJucyBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2Nrcy4gKi8KLXN0YXRpYyBpbnQgc2Nhbl9iaXRtYXAgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJYl9ibG9ja25yX3QgKnN0YXJ0LCBiX2Jsb2NrbnJfdCBmaW5pc2gsCi0JCQlpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSwgdW5zaWduZWQgbG9uZyBmaWxlX2Jsb2NrKQorc3RhdGljIGludCBzY2FuX2JpdG1hcChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIGJfYmxvY2tucl90ICogc3RhcnQsIGJfYmxvY2tucl90IGZpbmlzaCwKKwkJICAgICAgIGludCBtaW4sIGludCBtYXgsIGludCB1bmZtLCB1bnNpZ25lZCBsb25nIGZpbGVfYmxvY2spCiB7Ci0gICAgaW50IG5yX2FsbG9jYXRlZD0wOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICAvKiBmaW5kIGV2ZXJ5IGJtIGFuZCBibWFwIGFuZCBibWFwX25yIGluIHRoaXMgZmlsZSwgYW5kIGNoYW5nZSB0aGVtIGFsbCB0byBiaXRtYXBfYmxvY2tucgotICAgICAqIC0gSGFucywgaXQgaXMgbm90IGEgYmxvY2sgbnVtYmVyIC0gWmFtLiAqLworCWludCBucl9hbGxvY2F0ZWQgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworCS8qIGZpbmQgZXZlcnkgYm0gYW5kIGJtYXAgYW5kIGJtYXBfbnIgaW4gdGhpcyBmaWxlLCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIGJpdG1hcF9ibG9ja25yCisJICogLSBIYW5zLCBpdCBpcyBub3QgYSBibG9jayBudW1iZXIgLSBaYW0uICovCiAKLSAgICBpbnQgYm0sIG9mZjsKLSAgICBpbnQgZW5kX2JtLCBlbmRfb2ZmOwotICAgIGludCBvZmZfbWF4ID0gcy0+c19ibG9ja3NpemUgPDwgMzsKKwlpbnQgYm0sIG9mZjsKKwlpbnQgZW5kX2JtLCBlbmRfb2ZmOworCWludCBvZmZfbWF4ID0gcy0+c19ibG9ja3NpemUgPDwgMzsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLmNhbGwgKTsgCi0gICAgaWYgKCBTQl9GUkVFX0JMT0NLUyhzKSA8PSAwKQotCXJldHVybiAwOyAvLyBObyBwb2ludCBpbiBsb29raW5nIGZvciBtb3JlIGZyZWUgYmxvY2tzCisJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5jYWxsKTsKKwlpZiAoU0JfRlJFRV9CTE9DS1MocykgPD0gMCkKKwkJcmV0dXJuIDA7CS8vIE5vIHBvaW50IGluIGxvb2tpbmcgZm9yIG1vcmUgZnJlZSBibG9ja3MKIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOwotICAgIGdldF9iaXRfYWRkcmVzcyAocywgZmluaXNoLCAmZW5kX2JtLCAmZW5kX29mZik7Ci0gICAgaWYgKGJtID4gU0JfQk1BUF9OUihzKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGVuZF9ibSA+IFNCX0JNQVBfTlIocykpCi0gICAgICAgIGVuZF9ibSA9IFNCX0JNQVBfTlIocyk7CisJZ2V0X2JpdF9hZGRyZXNzKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKKwlnZXRfYml0X2FkZHJlc3MocywgZmluaXNoLCAmZW5kX2JtLCAmZW5kX29mZik7CisJaWYgKGJtID4gU0JfQk1BUF9OUihzKSkKKwkJcmV0dXJuIDA7CisJaWYgKGVuZF9ibSA+IFNCX0JNQVBfTlIocykpCisJCWVuZF9ibSA9IFNCX0JNQVBfTlIocyk7CiAKLSAgICAvKiBXaGVuIHRoZSBiaXRtYXAgaXMgbW9yZSB0aGFuIDEwJSBmcmVlLCBhbnlvbmUgY2FuIGFsbG9jYXRlLgotICAgICAqIFdoZW4gaXQncyBsZXNzIHRoYW4gMTAlIGZyZWUsIG9ubHkgZmlsZXMgdGhhdCBhbHJlYWR5IHVzZSB0aGUKLSAgICAgKiBiaXRtYXAgYXJlIGFsbG93ZWQuIE9uY2Ugd2UgcGFzcyA4MCUgZnVsbCwgdGhpcyByZXN0cmljdGlvbgotICAgICAqIGlzIGxpZnRlZC4KLSAgICAgKgotICAgICAqIFdlIGRvIHRoaXMgc28gdGhhdCBmaWxlcyB0aGF0IGdyb3cgbGF0ZXIgc3RpbGwgaGF2ZSBzcGFjZSBjbG9zZSB0bwotICAgICAqIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uIFRoaXMgaW1wcm92ZXMgbG9jYWxpdHksIGFuZCBwcmVzdW1hYmx5Ci0gICAgICogcGVyZm9ybWFuY2UgYXMgYSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG9ubHkgYW4gYWxsb2NhdGlvbiBwb2xpY3kgYW5kIGRvZXMgbm90IG1ha2UgdXAgZm9yIGdldHRpbmcgYQotICAgICAqIGJhZCBoaW50LiBEZWNlbnQgaGludGluZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciB0aGlzIHRvIHdvcmsgd2VsbC4KLSAgICAgKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKHNraXBfYnVzeSwgcykgJiYgU0JfRlJFRV9CTE9DS1MocykgPiBTQl9CTE9DS19DT1VOVChzKS8yMCApIHsKLQlmb3IgKDtibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgewotCSAgICBpZiAoICggb2ZmICYmICghdW5mbSB8fCAoZmlsZV9ibG9jayAhPSAwKSkpIHx8IFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+IChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAvIDEwICkKLQkJbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7Ci0JICAgIGlmIChucl9hbGxvY2F0ZWQpCi0JCWdvdG8gcmV0OwotICAgICAgICB9Ci0JLyogd2Uga25vdyBmcm9tIGFib3ZlIHRoYXQgc3RhcnQgaXMgYSByZWFzb25hYmxlIG51bWJlciAqLwotCWdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOwotICAgIH0KKwkvKiBXaGVuIHRoZSBiaXRtYXAgaXMgbW9yZSB0aGFuIDEwJSBmcmVlLCBhbnlvbmUgY2FuIGFsbG9jYXRlLgorCSAqIFdoZW4gaXQncyBsZXNzIHRoYW4gMTAlIGZyZWUsIG9ubHkgZmlsZXMgdGhhdCBhbHJlYWR5IHVzZSB0aGUKKwkgKiBiaXRtYXAgYXJlIGFsbG93ZWQuIE9uY2Ugd2UgcGFzcyA4MCUgZnVsbCwgdGhpcyByZXN0cmljdGlvbgorCSAqIGlzIGxpZnRlZC4KKwkgKgorCSAqIFdlIGRvIHRoaXMgc28gdGhhdCBmaWxlcyB0aGF0IGdyb3cgbGF0ZXIgc3RpbGwgaGF2ZSBzcGFjZSBjbG9zZSB0bworCSAqIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uIFRoaXMgaW1wcm92ZXMgbG9jYWxpdHksIGFuZCBwcmVzdW1hYmx5CisJICogcGVyZm9ybWFuY2UgYXMgYSByZXN1bHQuCisJICoKKwkgKiBUaGlzIGlzIG9ubHkgYW4gYWxsb2NhdGlvbiBwb2xpY3kgYW5kIGRvZXMgbm90IG1ha2UgdXAgZm9yIGdldHRpbmcgYQorCSAqIGJhZCBoaW50LiBEZWNlbnQgaGludGluZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciB0aGlzIHRvIHdvcmsgd2VsbC4KKwkgKi8KKwlpZiAoVEVTVF9PUFRJT04oc2tpcF9idXN5LCBzKQorCSAgICAmJiBTQl9GUkVFX0JMT0NLUyhzKSA+IFNCX0JMT0NLX0NPVU5UKHMpIC8gMjApIHsKKwkJZm9yICg7IGJtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7CisJCQlpZiAoKG9mZiAmJiAoIXVuZm0gfHwgKGZpbGVfYmxvY2sgIT0gMCkpKQorCQkJICAgIHx8IFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+CisJCQkgICAgKHMtPnNfYmxvY2tzaXplIDw8IDMpIC8gMTApCisJCQkJbnJfYWxsb2NhdGVkID0KKwkJCQkgICAgc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LAorCQkJCQkJICAgICAgbWluLCBtYXgsIHVuZm0pOworCQkJaWYgKG5yX2FsbG9jYXRlZCkKKwkJCQlnb3RvIHJldDsKKwkJfQorCQkvKiB3ZSBrbm93IGZyb20gYWJvdmUgdGhhdCBzdGFydCBpcyBhIHJlYXNvbmFibGUgbnVtYmVyICovCisJCWdldF9iaXRfYWRkcmVzcyhzLCAqc3RhcnQsICZibSwgJm9mZik7CisJfQogCi0gICAgZm9yICg7Ym0gPCBlbmRfYm07IGJtKyssIG9mZiA9IDApIHsKLQlucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIG9mZl9tYXgsIG1pbiwgbWF4LCB1bmZtKTsKLQlpZiAobnJfYWxsb2NhdGVkKQotCSAgICBnb3RvIHJldDsKLSAgICB9CisJZm9yICg7IGJtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7CisJCW5yX2FsbG9jYXRlZCA9CisJCSAgICBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIG9mZl9tYXgsIG1pbiwgbWF4LCB1bmZtKTsKKwkJaWYgKG5yX2FsbG9jYXRlZCkKKwkJCWdvdG8gcmV0OworCX0KIAotICAgIG5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgZW5kX29mZiArIDEsIG1pbiwgbWF4LCB1bmZtKTsKLSAgCi0gcmV0OgotICAgICpzdGFydCA9IGJtICogb2ZmX21heCArIG9mZjsKLSAgICByZXR1cm4gbnJfYWxsb2NhdGVkOworCW5yX2FsbG9jYXRlZCA9CisJICAgIHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgZW5kX29mZiArIDEsIG1pbiwgbWF4LCB1bmZtKTsKKworICAgICAgcmV0OgorCSpzdGFydCA9IGJtICogb2ZmX21heCArIG9mZjsKKwlyZXR1cm4gbnJfYWxsb2NhdGVkOwogCiB9CiAKLXN0YXRpYyB2b2lkIF9yZWlzZXJmc19mcmVlX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrLAotCQkJCSAgaW50IGZvcl91bmZvcm1hdHRlZCkKK3N0YXRpYyB2b2lkIF9yZWlzZXJmc19mcmVlX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKKwkJCQkgaW50IGZvcl91bmZvcm1hdHRlZCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc2JoOwotICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYXBiaTsKLSAgICBpbnQgbnIsIG9mZnNldDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYXBiaTsKKwlpbnQgbnIsIG9mZnNldDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHMsIGZyZWVfYmxvY2sgKTsKKwlQUk9DX0lORk9fSU5DKHMsIGZyZWVfYmxvY2spOwogCi0gICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICBzYmggPSBTQl9CVUZGRVJfV0lUSF9TQiAocyk7Ci0gICAgYXBiaSA9IFNCX0FQX0JJVE1BUChzKTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJc2JoID0gU0JfQlVGRkVSX1dJVEhfU0Iocyk7CisJYXBiaSA9IFNCX0FQX0JJVE1BUChzKTsKIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgYmxvY2ssICZuciwgJm9mZnNldCk7CisJZ2V0X2JpdF9hZGRyZXNzKHMsIGJsb2NrLCAmbnIsICZvZmZzZXQpOwogCi0gICAgaWYgKG5yID49IHNiX2JtYXBfbnIgKHJzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDc1OiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCi0JCQkgICJibG9jayAlbHUgaXMgb3V0IG9mIHJhbmdlIG9uICVzIiwKLQkJCSAgYmxvY2ssIHJlaXNlcmZzX2JkZXZuYW1lIChzKSk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAobnIgPj0gc2JfYm1hcF9ucihycykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAidnMtNDA3NTogcmVpc2VyZnNfZnJlZV9ibG9jazogIgorCQkJCSAiYmxvY2sgJWx1IGlzIG91dCBvZiByYW5nZSBvbiAlcyIsCisJCQkJIGJsb2NrLCByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCXJldHVybjsKKwl9CiAKLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGFwYmlbbnJdLmJoLCAxICkgOworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYXBiaVtucl0uYmgsIDEpOwogCi0gICAgLyogY2xlYXIgYml0IGZvciB0aGUgZ2l2ZW4gYmxvY2sgaW4gYml0IG1hcCAqLwotICAgIGlmICghcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0IChvZmZzZXQsIGFwYmlbbnJdLmJoLT5iX2RhdGEpKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwODA6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKLQkJCSAgImZyZWVfYmxvY2sgKCVzOiVsdSlbZGV2OmJsb2NrbnJdOiBiaXQgYWxyZWFkeSBjbGVhcmVkIiwKLQkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBibG9jayk7Ci0gICAgfQotICAgIGFwYmlbbnJdLmZyZWVfY291bnQgKys7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcywgYXBiaVtucl0uYmgpOworCS8qIGNsZWFyIGJpdCBmb3IgdGhlIGdpdmVuIGJsb2NrIGluIGJpdCBtYXAgKi8KKwlpZiAoIXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdChvZmZzZXQsIGFwYmlbbnJdLmJoLT5iX2RhdGEpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInZzLTQwODA6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKKwkJCQkgImZyZWVfYmxvY2sgKCVzOiVsdSlbZGV2OmJsb2NrbnJdOiBiaXQgYWxyZWFkeSBjbGVhcmVkIiwKKwkJCQkgcmVpc2VyZnNfYmRldm5hbWUocyksIGJsb2NrKTsKKwl9CisJYXBiaVtucl0uZnJlZV9jb3VudCsrOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgYXBiaVtucl0uYmgpOwogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBzYmgsIDEpIDsKLSAgICAvKiB1cGRhdGUgc3VwZXIgYmxvY2sgKi8KLSAgICBzZXRfc2JfZnJlZV9ibG9ja3MoIHJzLCBzYl9mcmVlX2Jsb2NrcyhycykgKyAxICk7CisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBzYmgsIDEpOworCS8qIHVwZGF0ZSBzdXBlciBibG9jayAqLworCXNldF9zYl9mcmVlX2Jsb2Nrcyhycywgc2JfZnJlZV9ibG9ja3MocnMpICsgMSk7CiAKLSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBzYmgpOwotICAgIGlmIChmb3JfdW5mb3JtYXR0ZWQpCi0gICAgICAgIERRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShpbm9kZSwgMSk7CisJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBzYmgpOworCWlmIChmb3JfdW5mb3JtYXR0ZWQpCisJCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShpbm9kZSwgMSk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKLQkJCSAgaW50IGZvcl91bmZvcm1hdHRlZCkKK3ZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKKwkJCSBpbnQgZm9yX3VuZm9ybWF0dGVkKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFJGQUxTRSghcywgInZzLTQwNjE6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOwotICAgIFJGQUxTRShpc19yZXVzYWJsZSAocywgYmxvY2ssIDEpID09IDAsICJ2cy00MDcxOiBjYW4gbm90IGZyZWUgc3VjaCBibG9jayIpOwotICAgIC8qIG1hcmsgaXQgYmVmb3JlIHdlIGNsZWFyIGl0LCBqdXN0IGluIGNhc2UgKi8KLSAgICBqb3VybmFsX21hcmtfZnJlZWQodGgsIHMsIGJsb2NrKSA7Ci0gICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgZm9yX3VuZm9ybWF0dGVkKSA7CisJUkZBTFNFKCFzLCAidnMtNDA2MTogdHJ5aW5nIHRvIGZyZWUgYmxvY2sgb24gbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJUkZBTFNFKGlzX3JldXNhYmxlKHMsIGJsb2NrLCAxKSA9PSAwLAorCSAgICAgICAidnMtNDA3MTogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKKwkvKiBtYXJrIGl0IGJlZm9yZSB3ZSBjbGVhciBpdCwganVzdCBpbiBjYXNlICovCisJam91cm5hbF9tYXJrX2ZyZWVkKHRoLCBzLCBibG9jayk7CisJX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgZm9yX3VuZm9ybWF0dGVkKTsKIH0KIAogLyogcHJlYWxsb2NhdGVkIGJsb2NrcyBkb24ndCBuZWVkIHRvIGJlIHJ1biB0aHJvdWdoIGpvdXJuYWxfbWFya19mcmVlZCAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrKSB7Ci0gICAgUkZBTFNFKCF0aC0+dF9zdXBlciwgInZzLTQwNjA6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOwotICAgIFJGQUxTRShpc19yZXVzYWJsZSAodGgtPnRfc3VwZXIsIGJsb2NrLCAxKSA9PSAwLCAidnMtNDA3MDogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgMSkgOworc3RhdGljIHZvaWQgcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrKQoreworCVJGQUxTRSghdGgtPnRfc3VwZXIsCisJICAgICAgICJ2cy00MDYwOiB0cnlpbmcgdG8gZnJlZSBibG9jayBvbiBub25leGlzdGVudCBkZXZpY2UiKTsKKwlSRkFMU0UoaXNfcmV1c2FibGUodGgtPnRfc3VwZXIsIGJsb2NrLCAxKSA9PSAwLAorCSAgICAgICAidnMtNDA3MDogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlfcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGJsb2NrLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgX19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGgsCi0JCQkJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpKQorc3RhdGljIHZvaWQgX19kaXNjYXJkX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSkKIHsKLSAgICB1bnNpZ25lZCBsb25nIHNhdmUgPSBlaS0+aV9wcmVhbGxvY19ibG9jayA7Ci0gICAgaW50IGRpcnR5ID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmVpLT52ZnNfaW5vZGU7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCXVuc2lnbmVkIGxvbmcgc2F2ZSA9IGVpLT5pX3ByZWFsbG9jX2Jsb2NrOworCWludCBkaXJ0eSA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICZlaS0+dmZzX2lub2RlOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmIChlaS0+aV9wcmVhbGxvY19jb3VudCA8IDApCi0JcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ6YW0tNDAwMTolczogaW5vZGUgaGFzIG5lZ2F0aXZlIHByZWFsbG9jIGJsb2NrcyBjb3VudC4iLCBfX0ZVTkNUSU9OX18gKTsKKwlpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgPCAwKQorCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCSAiemFtLTQwMDE6JXM6IGlub2RlIGhhcyBuZWdhdGl2ZSBwcmVhbGxvYyBibG9ja3MgY291bnQuIiwKKwkJCQkgX19GVU5DVElPTl9fKTsKICNlbmRpZgotICAgIHdoaWxlIChlaS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKLQlyZWlzZXJmc19mcmVlX3ByZWFsbG9jX2Jsb2NrKHRoLCBpbm9kZSwgZWktPmlfcHJlYWxsb2NfYmxvY2spOwotCWVpLT5pX3ByZWFsbG9jX2Jsb2NrKys7Ci0JZWktPmlfcHJlYWxsb2NfY291bnQgLS07Ci0JZGlydHkgPSAxOwotICAgIH0KLSAgICBpZiAoZGlydHkpCi0gICAgCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgIGVpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc2F2ZTsKLSAgICBsaXN0X2RlbF9pbml0KCYoZWktPmlfcHJlYWxsb2NfbGlzdCkpOworCXdoaWxlIChlaS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKKwkJcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayh0aCwgaW5vZGUsIGVpLT5pX3ByZWFsbG9jX2Jsb2NrKTsKKwkJZWktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwkJZWktPmlfcHJlYWxsb2NfY291bnQtLTsKKwkJZGlydHkgPSAxOworCX0KKwlpZiAoZGlydHkpCisJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCWVpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc2F2ZTsKKwlsaXN0X2RlbF9pbml0KCYoZWktPmlfcHJlYWxsb2NfbGlzdCkpOwogfQogCiAvKiBGSVhNRTogSXQgc2hvdWxkIGJlIGlubGluZSBmdW5jdGlvbiAqLwotdm9pZCByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IFJFSVNFUkZTX0koaW5vZGUpOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICBpZiAoZWktPmlfcHJlYWxsb2NfY291bnQpCi0JX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpID0gUkVJU0VSRlNfSShpbm9kZSk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJaWYgKGVpLT5pX3ByZWFsbG9jX2NvdW50KQorCQlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKIH0KIAotdm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQogewotICAgIHN0cnVjdCBsaXN0X2hlYWQgKiBwbGlzdCA9ICZTQl9KT1VSTkFMKHRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0ID0gJlNCX0pPVVJOQUwodGgtPnRfc3VwZXIpLT5qX3ByZWFsbG9jX2xpc3Q7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICB3aGlsZSAoIWxpc3RfZW1wdHkocGxpc3QpKSB7Ci0Jc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpOwotCWVpID0gbGlzdF9lbnRyeShwbGlzdC0+bmV4dCwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sIGlfcHJlYWxsb2NfbGlzdCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KHBsaXN0KSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWk7CisJCWVpID0gbGlzdF9lbnRyeShwbGlzdC0+bmV4dCwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sCisJCQkJaV9wcmVhbGxvY19saXN0KTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlpZiAoIWVpLT5pX3ByZWFsbG9jX2NvdW50KSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiemFtLTQwMDE6JXM6IGlub2RlIGlzIGluIHByZWFsbG9jIGxpc3QgYnV0IGhhcyBubyBwcmVhbGxvY2F0ZWQgYmxvY2tzLiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQorCQlpZiAoIWVpLT5pX3ByZWFsbG9jX2NvdW50KSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCQkgInphbS00MDAxOiVzOiBpbm9kZSBpcyBpbiBwcmVhbGxvYyBsaXN0IGJ1dCBoYXMgbm8gcHJlYWxsb2NhdGVkIGJsb2Nrcy4iLAorCQkJCQkgX19GVU5DVElPTl9fKTsKKwkJfQogI2VuZGlmCi0JX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7Ci0gICAgfQorCQlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKKwl9CiB9CiAKLXZvaWQgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit2b2lkIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc2V0X2JpdCAoX0FMTE9DX3NraXBfYnVzeSwgJlNCX0FMTE9DX09QVFMocykpOwotICAgIHNldF9iaXQgKF9BTExPQ19kaXJpZF9ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKLSAgICBzZXRfYml0IChfQUxMT0NfcGFja2luZ19ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19za2lwX2J1c3ksICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19kaXJpZF9ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19wYWNraW5nX2dyb3VwcywgJlNCX0FMTE9DX09QVFMocykpOwogfQogCiAvKiBibG9jayBhbGxvY2F0b3IgcmVsYXRlZCBvcHRpb25zIGFyZSBwYXJzZWQgaGVyZSAqLwotaW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMpCitpbnQgcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKm9wdGlvbnMpCiB7Ci0gICAgY2hhciAqIHRoaXNfY2hhciwgKiB2YWx1ZTsKKwljaGFyICp0aGlzX2NoYXIsICp2YWx1ZTsKIAotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYml0cyA9IDA7IC8qIGNsZWFyIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJpdHMgPSAwOwkvKiBjbGVhciBkZWZhdWx0IHNldHRpbmdzICovCiAKLSAgICB3aGlsZSAoICh0aGlzX2NoYXIgPSBzdHJzZXAgKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMICkgewotCWlmICgodmFsdWUgPSBzdHJjaHIgKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKLQkgICAgKnZhbHVlKysgPSAwOworCXdoaWxlICgodGhpc19jaGFyID0gc3Ryc2VwKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMKSB7CisJCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOwogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMiKSkgewotCSAgICBpbnQgdGVtcDsKLQkgICAgU0VUX09QVElPTihjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2Rlcyk7Ci0JICAgIHRlbXAgPSAodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDEwOwotCSAgICBpZiAodGVtcCA8PSAwIHx8IHRlbXAgPiAxMDApIHsKLQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDsKLQkgICAgfSBlbHNlIHsKLQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDAgLyB0ZW1wOwotCSAgIH0KLQkgICAgY29udGludWU7Ci0JfQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMiKSkgewotCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMpOwotCSAgICBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZSA9Ci0JCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogMTY7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMiKSkgewotCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyk7Ci0JICAgIGNvbnRpbnVlOwotCX07CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzIikpIHsKKwkJCWludCB0ZW1wOworCQkJU0VUX09QVElPTihjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2Rlcyk7CisJCQl0ZW1wID0gKHZhbHVlCisJCQkJJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsCisJCQkJCQkJICAgIDApIDogMTA7CisJCQlpZiAodGVtcCA8PSAwIHx8IHRlbXAgPiAxMDApIHsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9IDEwOworCQkJfSBlbHNlIHsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9CisJCQkJICAgIDEwMCAvIHRlbXA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlzcGxhY2luZ19sYXJnZV9maWxlcyk7CisJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZSA9CisJCQkgICAgKHZhbHVlCisJCQkgICAgICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKSA6IDE2OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKTsKKwkJCWNvbnRpbnVlOworCQl9OwogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKLQkgICAgU0VUX09QVElPTihvbGRfaGFzaGVkX3JlbG9jYXRpb24pOwotCSAgICBjb250aW51ZTsKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKKwkJCVNFVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAibmV3X2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKKwkJCVNFVF9PUFRJT04obmV3X2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlyaWRfZ3JvdXBzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlyaWRfZ3JvdXBzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9pZF9ncm91cHMiKSkgeworCQkJU0VUX09QVElPTihvaWRfZ3JvdXBzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgInBhY2tpbmdfZ3JvdXBzIikpIHsKKwkJCVNFVF9PUFRJT04ocGFja2luZ19ncm91cHMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyIpKSB7CisJCQlTRVRfT1BUSU9OKGhhc2hlZF9mb3JtYXR0ZWRfbm9kZXMpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJza2lwX2J1c3kiKSkgeworCQkJU0VUX09QVElPTihza2lwX2J1c3kpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJodW5kcmVkdGhfc2xpY2VzIikpIHsKKwkJCVNFVF9PUFRJT04oaHVuZHJlZHRoX3NsaWNlcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF93YXkiKSkgeworCQkJU0VUX09QVElPTihvbGRfd2F5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQiKSkgeworCQkJU0VUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jbWluIikpIHsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPQorCQkJICAgICh2YWx1ZQorCQkJICAgICAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCkgOiA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwcmVhbGxvY3NpemUiKSkgeworCQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPQorCQkJICAgICh2YWx1ZQorCQkJICAgICAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwKKwkJCQkJCQkgMCkgOgorCQkJICAgIFBSRUFMTE9DQVRJT05fU0laRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiemFtLTQwMDE6ICVzIDogdW5rbm93biBvcHRpb24gLSAlcyIsCisJCQkJIF9fRlVOQ1RJT05fXywgdGhpc19jaGFyKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAibmV3X2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKLQkgICAgU0VUX09QVElPTihuZXdfaGFzaGVkX3JlbG9jYXRpb24pOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlyaWRfZ3JvdXBzIikpIHsKLQkgICAgU0VUX09QVElPTihkaXJpZF9ncm91cHMpOwotCSAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvaWRfZ3JvdXBzIikpIHsKLQkgICAgU0VUX09QVElPTihvaWRfZ3JvdXBzKTsKLQkgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicGFja2luZ19ncm91cHMiKSkgewotCSAgICBTRVRfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzKTsKLQkgICAgY29udGludWU7Ci0gICAgICAgIH0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJoYXNoZWRfZm9ybWF0dGVkX25vZGVzIikpIHsKLQkgICAgU0VUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAic2tpcF9idXN5IikpIHsKLQkgICAgU0VUX09QVElPTihza2lwX2J1c3kpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJodW5kcmVkdGhfc2xpY2VzIikpIHsKLQkgICAgU0VUX09QVElPTihodW5kcmVkdGhfc2xpY2VzKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX3dheSIpKSB7Ci0JICAgIFNFVF9PUFRJT04ob2xkX3dheSk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkIikpIHsKLQkgICAgU0VUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jbWluIikpIHsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiA9Ci0JCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogNDsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicHJlYWxsb2NzaXplIikpIHsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPQotCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IFBSRUFMTE9DQVRJT05fU0laRTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JcmVpc2VyZnNfd2FybmluZyAocywgInphbS00MDAxOiAlcyA6IHVua25vd24gb3B0aW9uIC0gJXMiLAotCQkJICBfX0ZVTkNUSU9OX18gLCB0aGlzX2NoYXIpOwotCXJldHVybiAxOwotICAgICAgfQotICAKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiYWxsb2NhdG9yIG9wdGlvbnMgPSBbJTA4eF1cbiIsIFNCX0FMTE9DX09QVFMocykpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcocywgImFsbG9jYXRvciBvcHRpb25zID0gWyUwOHhdXG4iLCBTQl9BTExPQ19PUFRTKHMpKTsKKwlyZXR1cm4gMDsKIH0KLSAgCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV3X2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgY2hhciAqIGhhc2hfaW47Ci0gICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7Ci0JICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKLSAgICB9IGVsc2UgewotCWlmICghaGludC0+aW5vZGUpIHsKLQkgICAgLy9oaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWc7Ci0JICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKLQl9IGVsc2UgCi0JICAgIGlmICggVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKLQkJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOwotCSAgICBlbHNlCi0JCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOwotICAgICAgfQogCi0gICAgaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworc3RhdGljIGlubGluZSB2b2lkIG5ld19oYXNoZWRfcmVsb2NhdGlvbihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJY2hhciAqaGFzaF9pbjsKKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkJaGFzaF9pbiA9IChjaGFyICopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKwl9IGVsc2UgeworCQlpZiAoIWhpbnQtPmlub2RlKSB7CisJCQkvL2hpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZzsKKwkJCWhhc2hfaW4gPSAoY2hhciAqKSZoaW50LT5rZXkua19kaXJfaWQ7CisJCX0gZWxzZQorCQkgICAgaWYgKFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCisJCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJCWVsc2UKKwkJCWhhc2hfaW4gPQorCQkJICAgIChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisJfQorCisJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkgICAgaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOwogfQogCiAvKgogICogUmVsb2NhdGlvbiBiYXNlZCBvbiBkaXJpZCwgaGFzaGluZyB0aGVtIGludG8gYSBnaXZlbiBiaXRtYXAgYmxvY2sKICAqIGZpbGVzLiBGb3JtYXR0ZWQgbm9kZXMgYXJlIHVuYWZmZWN0ZWQsIGEgc2VwZXJhdGUgcG9saWN5IGNvdmVycyB0aGVtCiAgKi8KLXN0YXRpYyB2b2lkCi1kaXJpZF9ncm91cHMgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIHZvaWQgZGlyaWRfZ3JvdXBzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gICAgX191MzIgZGlyaWQgPSAwOwotICAgIGludCBibSA9IDA7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGhpbnQtPnRoLT50X3N1cGVyOwotICAgIGlmIChoaW50LT5pbm9kZSkKLQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7Ci0gICAgZWxzZSBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCi0gICAgICAgIGRpcmlkID0gaGludC0+a2V5LmtfZGlyX2lkOwotCi0gICAgaWYgKGRpcmlkKSB7Ci0JYm0gPSBibWFwX2hhc2hfaWQoc2IsIGRpcmlkKTsKLQloYXNoID0gYm0gKiAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOwotCS8qIGdpdmUgYSBwb3J0aW9uIG9mIHRoZSBibG9jayBncm91cCB0byBtZXRhZGF0YSAqLworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlfX3UzMiBkaXJpZCA9IDA7CisJaW50IGJtID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaGludC0+dGgtPnRfc3VwZXI7CiAJaWYgKGhpbnQtPmlub2RlKQotCSAgICBoYXNoICs9IHNiLT5zX2Jsb2Nrc2l6ZS8yOwotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7Ci0gICAgfQorCQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJZWxzZSBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCisJCWRpcmlkID0gaGludC0+a2V5LmtfZGlyX2lkOworCisJaWYgKGRpcmlkKSB7CisJCWJtID0gYm1hcF9oYXNoX2lkKHNiLCBkaXJpZCk7CisJCWhhc2ggPSBibSAqIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCS8qIGdpdmUgYSBwb3J0aW9uIG9mIHRoZSBibG9jayBncm91cCB0byBtZXRhZGF0YSAqLworCQlpZiAoaGludC0+aW5vZGUpCisJCQloYXNoICs9IHNiLT5zX2Jsb2Nrc2l6ZSAvIDI7CisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7CisJfQogfQogCiAvKgogICogUmVsb2NhdGlvbiBiYXNlZCBvbiBvaWQsIGhhc2hpbmcgdGhlbSBpbnRvIGEgZ2l2ZW4gYml0bWFwIGJsb2NrCiAgKiBmaWxlcy4gRm9ybWF0dGVkIG5vZGVzIGFyZSB1bmFmZmVjdGVkLCBhIHNlcGVyYXRlIHBvbGljeSBjb3ZlcnMgdGhlbQogICovCi1zdGF0aWMgdm9pZAotb2lkX2dyb3VwcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgdm9pZCBvaWRfZ3JvdXBzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBpZiAoaGludC0+aW5vZGUpIHsKLQl1bnNpZ25lZCBsb25nIGhhc2g7Ci0JX191MzIgb2lkOwotCV9fdTMyIGRpcmlkOwotCWludCBibTsKKwlpZiAoaGludC0+aW5vZGUpIHsKKwkJdW5zaWduZWQgbG9uZyBoYXNoOworCQlfX3UzMiBvaWQ7CisJCV9fdTMyIGRpcmlkOworCQlpbnQgYm07CiAKLQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJCWRpcmlkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKIAotCS8qIGtlZXAgdGhlIHJvb3QgZGlyIGFuZCBpdCdzIGZpcnN0IHNldCBvZiBzdWJkaXJzIGNsb3NlIHRvCi0JICogdGhlIHN0YXJ0IG9mIHRoZSBkaXNrCi0JICovCi0JaWYgKGRpcmlkIDw9IDIpCi0JICAgIGhhc2ggPSAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOwotCWVsc2UgewotCSAgICBvaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7Ci0JICAgIGJtID0gYm1hcF9oYXNoX2lkKGhpbnQtPmlub2RlLT5pX3NiLCBvaWQpOwotCSAgICBoYXNoID0gYm0gKiAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQkvKiBrZWVwIHRoZSByb290IGRpciBhbmQgaXQncyBmaXJzdCBzZXQgb2Ygc3ViZGlycyBjbG9zZSB0bworCQkgKiB0aGUgc3RhcnQgb2YgdGhlIGRpc2sKKwkJICovCisJCWlmIChkaXJpZCA8PSAyKQorCQkJaGFzaCA9IChoaW50LT5pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCWVsc2UgeworCQkJb2lkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworCQkJYm0gPSBibWFwX2hhc2hfaWQoaGludC0+aW5vZGUtPmlfc2IsIG9pZCk7CisJCQloYXNoID0gYm0gKiAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQl9CisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7CiAJfQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7Ci0gICAgfQogfQogCiAvKiByZXR1cm5zIDEgaWYgaXQgZmluZHMgYW4gaW5kaXJlY3QgaXRlbSBhbmQgZ2V0cyB2YWxpZCBoaW50IGluZm8KICAqIGZyb20gaXQsIG90aGVyd2lzZSAwCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2xlZnRfbmVpZ2hib3IocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgaW50IGdldF9sZWZ0X25laWdoYm9yKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBzdHJ1Y3QgcGF0aCAqIHBhdGg7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBwb3NfaW5faXRlbTsKLSAgICBfX2xlMzIgKiBpdGVtOwotICAgIGludCByZXQgPSAwOworCXN0cnVjdCBwYXRoICpwYXRoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IHBvc19pbl9pdGVtOworCV9fbGUzMiAqaXRlbTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIGlmICghaGludC0+cGF0aCkJCS8qIHJlaXNlcmZzIGNvZGUgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB3L28gcG9pbnRlciB0byBwYXRoCisJaWYgKCFoaW50LT5wYXRoKQkvKiByZWlzZXJmcyBjb2RlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdy9vIHBvaW50ZXIgdG8gcGF0aAogCQkJCSAqIHN0cnVjdHVyZSBzdXBwbGllZDsgdGhlbiB3ZSByZWx5IG9uIHN1cHBsaWVkIHNlYXJjaF9zdGFydCAqLwotCXJldHVybiAwOworCQlyZXR1cm4gMDsKIAotICAgIHBhdGggPSBoaW50LT5wYXRoOwotICAgIGJoID0gZ2V0X2xhc3RfYmgocGF0aCk7Ci0gICAgUkZBTFNFKCAhYmgsICJncmVlbi00MDAyOiBJbGxlZ2FsIHBhdGggc3BlY2lmaWVkIHRvIGdldF9sZWZ0X25laWdoYm9yIik7Ci0gICAgaWggPSBnZXRfaWgocGF0aCk7Ci0gICAgcG9zX2luX2l0ZW0gPSBwYXRoLT5wb3NfaW5faXRlbTsKLSAgICBpdGVtID0gZ2V0X2l0ZW0gKHBhdGgpOworCXBhdGggPSBoaW50LT5wYXRoOworCWJoID0gZ2V0X2xhc3RfYmgocGF0aCk7CisJUkZBTFNFKCFiaCwgImdyZWVuLTQwMDI6IElsbGVnYWwgcGF0aCBzcGVjaWZpZWQgdG8gZ2V0X2xlZnRfbmVpZ2hib3IiKTsKKwlpaCA9IGdldF9paChwYXRoKTsKKwlwb3NfaW5faXRlbSA9IHBhdGgtPnBvc19pbl9pdGVtOworCWl0ZW0gPSBnZXRfaXRlbShwYXRoKTsKIAotICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IGJoLT5iX2Jsb2NrbnI7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0gYmgtPmJfYmxvY2tucjsKIAotICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCS8qIGZvciBpbmRpcmVjdCBpdGVtOiBnbyB0byBsZWZ0IGFuZCBsb29rIGZvciB0aGUgZmlyc3Qgbm9uLWhvbGUgZW50cnkKLQkgICBpbiB0aGUgaW5kaXJlY3QgaXRlbSAqLwotCWlmIChwb3NfaW5faXRlbSA9PSBJX1VORk1fTlVNIChpaCkpCi0JICAgIHBvc19pbl9pdGVtLS07Ci0vLwkgICAgcG9zX2luX2l0ZW0gPSBJX1VORk1fTlVNIChpaCkgLSAxOwotCXdoaWxlIChwb3NfaW5faXRlbSA+PSAwKSB7Ci0JICAgIGludCB0PWdldF9ibG9ja19udW0oaXRlbSxwb3NfaW5faXRlbSk7Ci0JICAgIGlmICh0KSB7Ci0JCWhpbnQtPnNlYXJjaF9zdGFydCA9IHQ7Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHBvc19pbl9pdGVtIC0tOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCS8qIGZvciBpbmRpcmVjdCBpdGVtOiBnbyB0byBsZWZ0IGFuZCBsb29rIGZvciB0aGUgZmlyc3Qgbm9uLWhvbGUgZW50cnkKKwkJICAgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KKwkJaWYgKHBvc19pbl9pdGVtID09IElfVU5GTV9OVU0oaWgpKQorCQkJcG9zX2luX2l0ZW0tLTsKKy8vICAgICAgICAgIHBvc19pbl9pdGVtID0gSV9VTkZNX05VTSAoaWgpIC0gMTsKKwkJd2hpbGUgKHBvc19pbl9pdGVtID49IDApIHsKKwkJCWludCB0ID0gZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSk7CisJCQlpZiAodCkgeworCQkJCWhpbnQtPnNlYXJjaF9zdGFydCA9IHQ7CisJCQkJcmV0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBvc19pbl9pdGVtLS07CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogZG9lcyByZXN1bHQgdmFsdWUgZml0IGludG8gc3BlY2lmaWVkIHJlZ2lvbj8gKi8KLSAgICByZXR1cm4gcmV0OworCS8qIGRvZXMgcmVzdWx0IHZhbHVlIGZpdCBpbnRvIHNwZWNpZmllZCByZWdpb24/ICovCisJcmV0dXJuIHJldDsKIH0KIAogLyogc2hvdWxkIGJlLCBpZiBmb3JtYXR0ZWQgbm9kZSwgdGhlbiB0cnkgdG8gcHV0IG9uIGZpcnN0IHBhcnQgb2YgdGhlIGRldmljZQogICAgc3BlY2lmaWVkIGFzIG51bWJlciBvZiBwZXJjZW50IHdpdGggbW91bnQgb3B0aW9uIGRldmljZSwgZWxzZSB0cnkgdG8gcHV0CiAgICBvbiBsYXN0IG9mIGRldmljZS4gIFRoaXMgaXMgbm90IHRvIHNheSBpdCBpcyBnb29kIGNvZGUgdG8gZG8gc28sCiAgICBidXQgdGhlIGVmZmVjdCBzaG91bGQgYmUgbWVhc3VyZWQuICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldF9ib3JkZXJfaW5faGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9ib3JkZXJfaW5faGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJICAgICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQogewotICAgIGJfYmxvY2tucl90IGJvcmRlciA9IFNCX0JMT0NLX0NPVU5UKHMpIC8gUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXI7CisJYl9ibG9ja25yX3QgYm9yZGVyID0KKwkgICAgU0JfQkxPQ0tfQ09VTlQocykgLyBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlcjsKIAotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkKLQloaW50LT5lbmQgPSBib3JkZXIgLSAxOwotICAgIGVsc2UKLQloaW50LT5iZWcgPSBib3JkZXI7CisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKQorCQloaW50LT5lbmQgPSBib3JkZXIgLSAxOworCWVsc2UKKwkJaGludC0+YmVnID0gYm9yZGVyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbGFyZ2VfZmlsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNwbGFjZV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKLSAgICBlbHNlCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworCWlmIChURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCQloaW50LT5zZWFyY2hfc3RhcnQgPQorCQkgICAgaGludC0+YmVnICsKKwkJICAgIGtleWVkX2hhc2goKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCksCisJCQkgICAgICAgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwllbHNlCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJCSAgICBoaW50LT5iZWcgKworCQkgICAga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpLAorCQkJICAgICAgIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2Zvcm1hdHRlZF9ub2RlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIGhhc2hfZm9ybWF0dGVkX25vZGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQogewotICAgY2hhciAqIGhhc2hfaW47CisJY2hhciAqaGFzaF9pbjsKIAotICAgaWYgKCFoaW50LT5pbm9kZSkKLQloYXNoX2luID0gKGNoYXIqKSZoaW50LT5rZXkua19kaXJfaWQ7Ci0gICAgZWxzZSBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCi0JaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOwotICAgIGVsc2UKLQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKTsKKwlpZiAoIWhpbnQtPmlub2RlKQorCQloYXNoX2luID0gKGNoYXIgKikmaGludC0+a2V5LmtfZGlyX2lkOworCWVsc2UgaWYgKFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCisJCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKKwllbHNlCisJCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOwogCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJICAgIGhpbnQtPmJlZyArIGtleWVkX2hhc2goaGFzaF9pbiwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgaW5saW5lIGludAordGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKgorCQkJCQkJICAgaGludCkKIHsKLSAgICByZXR1cm4gaGludC0+YmxvY2sgPT0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMubGFyZ2VfZmlsZV9zaXplOworCXJldHVybiBoaW50LT5ibG9jayA9PQorCSAgICBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5sYXJnZV9maWxlX3NpemU7CiB9CiAKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbmV3X3BhY2tpbmdfbG9jYWxpdHkgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBzdHJ1Y3QgaW5fY29yZV9rZXkgKiBrZXkgPSAmaGludC0+a2V5OworCXN0cnVjdCBpbl9jb3JlX2tleSAqa2V5ID0gJmhpbnQtPmtleTsKIAotICAgIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMDsKLSAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKChjaGFyKikoJmtleS0+a19vYmplY3RpZCksNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwloaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDA7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkgICAgaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgma2V5LT5rX29iamVjdGlkKSwKKwkJCQkgICA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOwogfQotICAjZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQgb2xkX2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgYl9ibG9ja25yX3QgYm9yZGVyOwotICAgIHUzMiBoYXNoX2luOwotICAgIAotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSB8fCBoaW50LT5pbm9kZSA9PSBOVUxMKSB7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICBoYXNoX2luID0gbGUzMl90b19jcHUoKElOT0RFX1BLRVkoaGludC0+aW5vZGUpKS0+a19kaXJfaWQpOwotICAgIGJvcmRlciA9IGhpbnQtPmJlZyArICh1MzIpIGtleWVkX2hhc2goKChjaGFyICopICgmaGFzaF9pbikpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcgLSAxKTsKLSAgICBpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKLQotICAgIHJldHVybiAxOwotICB9Ci0gIAotc3RhdGljIGlubGluZSBpbnQgb2xkX3dheSAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQotewotICAgIGJfYmxvY2tucl90IGJvcmRlcjsKLSAgICAKLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgewotCXJldHVybiAwOwotICAgIH0KLSAgCi0gICAgICBib3JkZXIgPSBoaW50LT5iZWcgKyBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpICUgKGhpbnQtPmVuZCAgLSBoaW50LT5iZWcpOwotICAgIGlmIChib3JkZXIgPiBoaW50LT5zZWFyY2hfc3RhcnQpCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gYm9yZGVyOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBodW5kcmVkdGhfc2xpY2VzIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgc3RydWN0IGluX2NvcmVfa2V5ICoga2V5ID0gJmhpbnQtPmtleTsKLSAgICBiX2Jsb2NrbnJfdCBzbGljZV9zdGFydDsKLQotICAgIHNsaWNlX3N0YXJ0ID0gKGtleWVkX2hhc2goKGNoYXIqKSgma2V5LT5rX2Rpcl9pZCksNCkgJSAxMDApICogKGhpbnQtPmVuZCAvIDEwMCk7Ci0gICAgaWYgKCBzbGljZV9zdGFydCA+IGhpbnQtPnNlYXJjaF9zdGFydCB8fCBzbGljZV9zdGFydCArIChoaW50LT5lbmQgLyAxMDApIDw9IGhpbnQtPnNlYXJjaF9zdGFydCkgewotCWhpbnQtPnNlYXJjaF9zdGFydCA9IHNsaWNlX3N0YXJ0OwotICAgIH0KLX0KLSAgCi1zdGF0aWMgdm9pZCBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LAotCQkJCQkgIGludCBhbW91bnRfbmVlZGVkKQotewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOwotICAgIGludCB1bmZtX2hpbnQ7Ci0KLSAgICBoaW50LT5iZWcgPSAwOwotICAgIGhpbnQtPmVuZCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLQotICAgIC8qIFRoaXMgaXMgZm9ybWVyIGJvcmRlciBhbGdvcml0aG0uIE5vdyB3aXRoIHR1bmFibGUgYm9yZGVyIG9mZnNldCAqLwotICAgIGlmIChjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyhzKSkKLQlzZXRfYm9yZGVyX2luX2hpbnQocywgaGludCk7Ci0KLSNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgLyogd2hlbmV2ZXIgd2UgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSwgd2UgZGlzcGxhY2UgaXQuICBBdCBmaXJzdCB3ZSB3aWxsCi0gICAgICAgaGFzaCBmb3IgbG9jYXRpb24sIGxhdGVyIHdlIG1pZ2h0IGxvb2sgZm9yIGEgbW9kZXJhdGVseSBlbXB0eSBwbGFjZSBmb3IKLSAgICAgICBpdCAqLwotICAgIGlmIChkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMocykKLQkmJiBoaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcykgewotCWRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KGhpbnQpOwotCi0JLyogd2UgZG8gbm90IGNvbnRpbnVlIGRldGVybWluZV9zZWFyY2hfc3RhcnQsCi0JICogaWYgbmV3IHBhY2tpbmcgbG9jYWxpdHkgaXMgYmVpbmcgZGlzcGxhY2VkICovCi0JcmV0dXJuOwotICAgIH0JCQkJICAgICAgCiAjZW5kaWYKLSAgCi0gICAgLyogYWxsIHBlcnNvbnMgc2hvdWxkIGZlZWwgZW5jb3VyYWdlZCB0byBhZGQgbW9yZSBzcGVjaWFsIGNhc2VzIGhlcmUgYW5kCi0gICAgICogdGVzdCB0aGVtICovCiAKLSAgICBpZiAoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUKLQkmJiB0aGlzX2Jsb2NrbnJfYWxsb2NhdGlvbl93b3VsZF9tYWtlX2l0X2FfbGFyZ2VfZmlsZShoaW50KSkgewotCWRpc3BsYWNlX2xhcmdlX2ZpbGUoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9oYXNoZWRfcmVsb2NhdGlvbihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJYl9ibG9ja25yX3QgYm9yZGVyOworCXUzMiBoYXNoX2luOwogCi0gICAgLyogaWYgbm9uZSBvZiBvdXIgc3BlY2lhbCBjYXNlcyBpcyByZWxldmFudCwgdXNlIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZQotICAgICAgIHRyZWUgb3JkZXIgb2YgdGhlIG5ldyBub2RlIHdlIGFyZSBhbGxvY2F0aW5nIGZvciAqLwotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzLHMpKSB7Ci0gICAgICAgIGhhc2hfZm9ybWF0dGVkX25vZGUoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICB1bmZtX2hpbnQgPSBnZXRfbGVmdF9uZWlnaGJvcihoaW50KTsKKwloYXNoX2luID0gbGUzMl90b19jcHUoKElOT0RFX1BLRVkoaGludC0+aW5vZGUpKS0+a19kaXJfaWQpOworCWJvcmRlciA9CisJICAgIGhpbnQtPmJlZyArICh1MzIpIGtleWVkX2hhc2goKChjaGFyICopKCZoYXNoX2luKSksCisJCQkJCSA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcgLSAxKTsKKwlpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBib3JkZXI7CiAKLSAgICAvKiBNaW1pYyBvbGQgYmxvY2sgYWxsb2NhdG9yIGJlaGF2aW91ciwgdGhhdCBpcyBpZiBWRlMgYWxsb3dlZCBmb3IgcHJlYWxsb2NhdGlvbiwKLSAgICAgICBuZXcgYmxvY2tzIGFyZSBkaXNwbGFjZWQgYmFzZWQgb24gZGlyZWN0b3J5IElELiBBbHNvLCBpZiBzdWdnZXN0ZWQgc2VhcmNoX3N0YXJ0Ci0gICAgICAgaXMgbGVzcyB0aGFuIGxhc3QgcHJlYWxsb2NhdGVkIGJsb2NrLCB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSBpdCwgYXNzdW1pbmcgdGhhdAotICAgICAgIEhERCBkYXRhZmxvdyBpcyBmYXN0ZXIgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKG9sZF93YXksIHMpKSB7Ci0JaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgewotCSAgICBpZiAoICFyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbihzKSkKLQkJb2xkX3dheShoaW50KTsKLQkgICAgZWxzZSBpZiAoIXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24ocykpCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF93YXkocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworCWJfYmxvY2tucl90IGJvcmRlcjsKKworCWlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSB8fCBoaW50LT5pbm9kZSA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCWJvcmRlciA9CisJICAgIGhpbnQtPmJlZyArCisJICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCkgJSAoaGludC0+ZW5kIC0KKwkJCQkJCQkgICAgICBoaW50LT5iZWcpOworCWlmIChib3JkZXIgPiBoaW50LT5zZWFyY2hfc3RhcnQpCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHVuZHJlZHRoX3NsaWNlcyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJc3RydWN0IGluX2NvcmVfa2V5ICprZXkgPSAmaGludC0+a2V5OworCWJfYmxvY2tucl90IHNsaWNlX3N0YXJ0OworCisJc2xpY2Vfc3RhcnQgPQorCSAgICAoa2V5ZWRfaGFzaCgoY2hhciAqKSgma2V5LT5rX2Rpcl9pZCksIDQpICUgMTAwKSAqIChoaW50LT5lbmQgLyAxMDApOworCWlmIChzbGljZV9zdGFydCA+IGhpbnQtPnNlYXJjaF9zdGFydAorCSAgICB8fCBzbGljZV9zdGFydCArIChoaW50LT5lbmQgLyAxMDApIDw9IGhpbnQtPnNlYXJjaF9zdGFydCkgeworCQloaW50LT5zZWFyY2hfc3RhcnQgPSBzbGljZV9zdGFydDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRldGVybWluZV9zZWFyY2hfc3RhcnQocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50LAorCQkJCSAgIGludCBhbW91bnRfbmVlZGVkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworCWludCB1bmZtX2hpbnQ7CisKKwloaW50LT5iZWcgPSAwOworCWhpbnQtPmVuZCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKworCS8qIFRoaXMgaXMgZm9ybWVyIGJvcmRlciBhbGdvcml0aG0uIE5vdyB3aXRoIHR1bmFibGUgYm9yZGVyIG9mZnNldCAqLworCWlmIChjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyhzKSkKKwkJc2V0X2JvcmRlcl9pbl9oaW50KHMsIGhpbnQpOworCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworCS8qIHdoZW5ldmVyIHdlIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnksIHdlIGRpc3BsYWNlIGl0LiAgQXQgZmlyc3Qgd2Ugd2lsbAorCSAgIGhhc2ggZm9yIGxvY2F0aW9uLCBsYXRlciB3ZSBtaWdodCBsb29rIGZvciBhIG1vZGVyYXRlbHkgZW1wdHkgcGxhY2UgZm9yCisJICAgaXQgKi8KKwlpZiAoZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKHMpCisJICAgICYmIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKSB7CisJCWRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KGhpbnQpOworCisJCS8qIHdlIGRvIG5vdCBjb250aW51ZSBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0LAorCQkgKiBpZiBuZXcgcGFja2luZyBsb2NhbGl0eSBpcyBiZWluZyBkaXNwbGFjZWQgKi8KKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogYWxsIHBlcnNvbnMgc2hvdWxkIGZlZWwgZW5jb3VyYWdlZCB0byBhZGQgbW9yZSBzcGVjaWFsIGNhc2VzIGhlcmUgYW5kCisJICogdGVzdCB0aGVtICovCisKKwlpZiAoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUKKwkgICAgJiYgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUoaGludCkpIHsKKwkJZGlzcGxhY2VfbGFyZ2VfZmlsZShoaW50KTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIG5vbmUgb2Ygb3VyIHNwZWNpYWwgY2FzZXMgaXMgcmVsZXZhbnQsIHVzZSB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUKKwkgICB0cmVlIG9yZGVyIG9mIHRoZSBuZXcgbm9kZSB3ZSBhcmUgYWxsb2NhdGluZyBmb3IgKi8KKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04oaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcywgcykpIHsKKwkJaGFzaF9mb3JtYXR0ZWRfbm9kZShoaW50KTsKKwkJcmV0dXJuOworCX0KKworCXVuZm1faGludCA9IGdldF9sZWZ0X25laWdoYm9yKGhpbnQpOworCisJLyogTWltaWMgb2xkIGJsb2NrIGFsbG9jYXRvciBiZWhhdmlvdXIsIHRoYXQgaXMgaWYgVkZTIGFsbG93ZWQgZm9yIHByZWFsbG9jYXRpb24sCisJICAgbmV3IGJsb2NrcyBhcmUgZGlzcGxhY2VkIGJhc2VkIG9uIGRpcmVjdG9yeSBJRC4gQWxzbywgaWYgc3VnZ2VzdGVkIHNlYXJjaF9zdGFydAorCSAgIGlzIGxlc3MgdGhhbiBsYXN0IHByZWFsbG9jYXRlZCBibG9jaywgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gaXQsIGFzc3VtaW5nIHRoYXQKKwkgICBIREQgZGF0YWZsb3cgaXMgZmFzdGVyIGluIGZvcndhcmQgZGlyZWN0aW9uICovCisJaWYgKFRFU1RfT1BUSU9OKG9sZF93YXksIHMpKSB7CisJCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkJCWlmICghcmVpc2VyZnNfaGFzaGVkX3JlbG9jYXRpb24ocykpCisJCQkJb2xkX3dheShoaW50KTsKKwkJCWVsc2UgaWYgKCFyZWlzZXJmc19ub191bmhhc2hlZF9yZWxvY2F0aW9uKHMpKQorCQkJCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKworCQkJaWYgKGhpbnQtPmlub2RlCisJCQkgICAgJiYgaGludC0+c2VhcmNoX3N0YXJ0IDwKKwkJCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jaykKKwkJCQloaW50LT5zZWFyY2hfc3RhcnQgPQorCQkJCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jazsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBpcyBhbiBhcHByb2FjaCBwcm9wb3NlZCBieSBIYW5zICovCisJaWYgKFRFU1RfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMsIHMpCisJICAgICYmICEoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUpKSB7CisJCWh1bmRyZWR0aF9zbGljZXMoaGludCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBvbGRfaGFzaGVkX3JlbG9jYXRpb24gb25seSB3b3JrcyBvbiB1bmZvcm1hdHRlZCAqLworCWlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJgorCSAgICBURVNUX09QVElPTihvbGRfaGFzaGVkX3JlbG9jYXRpb24sIHMpKSB7CiAJCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKwl9CisJLyogbmV3X2hhc2hlZF9yZWxvY2F0aW9uIHdvcmtzIHdpdGggYm90aCBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgbm9kZXMgKi8KKwlpZiAoKCF1bmZtX2hpbnQgfHwgaGludC0+Zm9ybWF0dGVkX25vZGUpICYmCisJICAgIFRFU1RfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbiwgcykpIHsKKwkJbmV3X2hhc2hlZF9yZWxvY2F0aW9uKGhpbnQpOworCX0KKwkvKiBkaXJpZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcywgcykpIHsKKwkJZGlyaWRfZ3JvdXBzKGhpbnQpOworCX0KKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcywgcykpIHsKKwkJZGlyaWRfZ3JvdXBzKGhpbnQpOworCX0KKyNlbmRpZgogCi0JICAgIGlmICggaGludC0+aW5vZGUgJiYgaGludC0+c2VhcmNoX3N0YXJ0IDwgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2spCi0JCWhpbnQtPnNlYXJjaF9zdGFydCA9IFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrOworCS8qIG9pZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKG9pZF9ncm91cHMsIHMpKSB7CisJCW9pZF9ncm91cHMoaGludCk7CiAJfQogCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGFuIGFwcHJvYWNoIHByb3Bvc2VkIGJ5IEhhbnMgKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMsIHMpICYmICEgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSkgewotCWh1bmRyZWR0aF9zbGljZXMoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG9sZF9oYXNoZWRfcmVsb2NhdGlvbiBvbmx5IHdvcmtzIG9uIHVuZm9ybWF0dGVkICovCi0gICAgaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmCi0gICAgICAgIFRFU1RfT1BUSU9OKG9sZF9oYXNoZWRfcmVsb2NhdGlvbiwgcykpCi0gICAgewotCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKLSAgICB9Ci0gICAgLyogbmV3X2hhc2hlZF9yZWxvY2F0aW9uIHdvcmtzIHdpdGggYm90aCBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgbm9kZXMgKi8KLSAgICBpZiAoKCF1bmZtX2hpbnQgfHwgaGludC0+Zm9ybWF0dGVkX25vZGUpICYmCi0gICAgICAgIFRFU1RfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbiwgcykpCi0gICAgewotCW5ld19oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKLSAgICB9Ci0gICAgLyogZGlyaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLwotICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCi0gICAgewotICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7Ci0gICAgfQotCi0jaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCi0gICAgewotICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBvaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLwotICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihvaWRfZ3JvdXBzLHMpKQotICAgIHsKLSAgICAgICAgb2lkX2dyb3VwcyhoaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IGRldGVybWluZV9wcmVhbGxvY19zaXplKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICAvKiBtYWtlIG1pbmltdW0gc2l6ZSBhIG1vdW50IG9wdGlvbiBhbmQgYmVuY2htYXJrIGJvdGggd2F5cyAqLwotICAgIC8qIHdlIHByZWFsbG9jYXRlIGJsb2NrcyBvbmx5IGZvciByZWd1bGFyIGZpbGVzLCBzcGVjaWZpYyBzaXplICovCi0gICAgLyogYmVuY2htYXJrIHByZWFsbG9jYXRpbmcgYWx3YXlzIGFuZCBzZWUgd2hhdCBoYXBwZW5zICovCisJLyogbWFrZSBtaW5pbXVtIHNpemUgYSBtb3VudCBvcHRpb24gYW5kIGJlbmNobWFyayBib3RoIHdheXMgKi8KKwkvKiB3ZSBwcmVhbGxvY2F0ZSBibG9ja3Mgb25seSBmb3IgcmVndWxhciBmaWxlcywgc3BlY2lmaWMgc2l6ZSAqLworCS8qIGJlbmNobWFyayBwcmVhbGxvY2F0aW5nIGFsd2F5cyBhbmQgc2VlIHdoYXQgaGFwcGVucyAqLwogCi0gICAgaGludC0+cHJlYWxsb2Nfc2l6ZSA9IDA7CisJaGludC0+cHJlYWxsb2Nfc2l6ZSA9IDA7CiAKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7Ci0JaWYgKFNfSVNSRUcoaGludC0+aW5vZGUtPmlfbW9kZSkKLQkgICAgJiYgaGludC0+aW5vZGUtPmlfc2l6ZSA+PSBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiAqIGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKLQkgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSA9IFJFSVNFUkZTX1NCKGhpbnQtPnRoLT50X3N1cGVyKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSAtIDE7Ci0gICAgfQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7CisJCWlmIChTX0lTUkVHKGhpbnQtPmlub2RlLT5pX21vZGUpCisJCSAgICAmJiBoaW50LT5pbm9kZS0+aV9zaXplID49CisJCSAgICBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy4KKwkJICAgIHByZWFsbG9jbWluICogaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQkJaGludC0+cHJlYWxsb2Nfc2l6ZSA9CisJCQkgICAgUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMuCisJCQkgICAgcHJlYWxsb2NzaXplIC0gMTsKKwl9CisJcmV0dXJuIENBUlJZX09OOwogfQogCiAvKiBYWFggSSBrbm93IGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHVwcGVyLWxldmVsIGZ1bmN0aW9uOwogICAgYnV0IG1heSBiZSByZXN1bHQgZnVuY3Rpb24gd291bGQgYmUgdG9vIGNvbXBsZXguICovCi1zdGF0aWMgaW5saW5lIGludCBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2sgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKLQkJCQkJIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAotCQkJCQkgYl9ibG9ja25yX3Qgc3RhcnQsIGJfYmxvY2tucl90IGZpbmlzaCwKLQkJCQkJIGludCBtaW4sCi0JCQkJCSBpbnQgYW1vdW50X25lZWRlZCwgaW50IHByZWFsbG9jX3NpemUpCitzdGF0aWMgaW5saW5lIGludCBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2socmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50LAorCQkJCQkJIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkJIGJfYmxvY2tucl90IHN0YXJ0LAorCQkJCQkJIGJfYmxvY2tucl90IGZpbmlzaCwgaW50IG1pbiwKKwkJCQkJCSBpbnQgYW1vdW50X25lZWRlZCwKKwkJCQkJCSBpbnQgcHJlYWxsb2Nfc2l6ZSkKIHsKLSAgICBpbnQgcmVzdCA9IGFtb3VudF9uZWVkZWQ7Ci0gICAgaW50IG5yX2FsbG9jYXRlZDsKLSAgCi0gICAgd2hpbGUgKHJlc3QgPiAwICYmIHN0YXJ0IDw9IGZpbmlzaCkgewotCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwIChoaW50LT50aCwgJnN0YXJ0LCBmaW5pc2gsIG1pbiwKLQkJCQkgICAgcmVzdCArIHByZWFsbG9jX3NpemUsICFoaW50LT5mb3JtYXR0ZWRfbm9kZSwKLQkJCQkgICAgaGludC0+YmxvY2spOworCWludCByZXN0ID0gYW1vdW50X25lZWRlZDsKKwlpbnQgbnJfYWxsb2NhdGVkOwogCi0JaWYgKG5yX2FsbG9jYXRlZCA9PSAwKQkvKiBubyBuZXcgYmxvY2tzIGFsbG9jYXRlZCwgcmV0dXJuICovCi0JICAgIGJyZWFrOwotCQotCS8qIGZpbGwgZnJlZV9ibG9ja25ycyBhcnJheSBmaXJzdCAqLwotCXdoaWxlIChyZXN0ID4gMCAmJiBucl9hbGxvY2F0ZWQgPiAwKSB7Ci0JICAgICogbmV3X2Jsb2NrbnJzICsrID0gc3RhcnQgKys7Ci0JICAgIHJlc3QgLS07IG5yX2FsbG9jYXRlZCAtLTsKKwl3aGlsZSAocmVzdCA+IDAgJiYgc3RhcnQgPD0gZmluaXNoKSB7CisJCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwKGhpbnQtPnRoLCAmc3RhcnQsIGZpbmlzaCwgbWluLAorCQkJCQkgICByZXN0ICsgcHJlYWxsb2Nfc2l6ZSwKKwkJCQkJICAgIWhpbnQtPmZvcm1hdHRlZF9ub2RlLCBoaW50LT5ibG9jayk7CisKKwkJaWYgKG5yX2FsbG9jYXRlZCA9PSAwKQkvKiBubyBuZXcgYmxvY2tzIGFsbG9jYXRlZCwgcmV0dXJuICovCisJCQlicmVhazsKKworCQkvKiBmaWxsIGZyZWVfYmxvY2tucnMgYXJyYXkgZmlyc3QgKi8KKwkJd2hpbGUgKHJlc3QgPiAwICYmIG5yX2FsbG9jYXRlZCA+IDApIHsKKwkJCSpuZXdfYmxvY2tucnMrKyA9IHN0YXJ0Kys7CisJCQlyZXN0LS07CisJCQlucl9hbGxvY2F0ZWQtLTsKKwkJfQorCisJCS8qIGRvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGZpbGwgcHJlYWxsb2MuIGFycmF5IGFsc28gPyAqLworCQlpZiAobnJfYWxsb2NhdGVkID4gMCkgeworCQkJLyogaXQgbWVhbnMgcHJlYWxsb2Nfc2l6ZSB3YXMgZ3JlYXRlciB0aGF0IDAgYW5kIHdlIGRvIHByZWFsbG9jYXRpb24gKi8KKwkJCWxpc3RfYWRkKCZSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19saXN0LAorCQkJCSAmU0JfSk9VUk5BTChoaW50LT50aC0+dF9zdXBlciktPgorCQkJCSBqX3ByZWFsbG9jX2xpc3QpOworCQkJUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSBzdGFydDsKKwkJCVJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0KKwkJCSAgICBucl9hbGxvY2F0ZWQ7CisJCQlicmVhazsKKwkJfQogCX0KIAotCS8qIGRvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGZpbGwgcHJlYWxsb2MuIGFycmF5IGFsc28gPyAqLwotCWlmIChucl9hbGxvY2F0ZWQgPiAwKSB7Ci0JICAgIC8qIGl0IG1lYW5zIHByZWFsbG9jX3NpemUgd2FzIGdyZWF0ZXIgdGhhdCAwIGFuZCB3ZSBkbyBwcmVhbGxvY2F0aW9uICovCi0JICAgIGxpc3RfYWRkKCZSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19saXN0LAotCQkgICAgICZTQl9KT1VSTkFMKGhpbnQtPnRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0KTsKLQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSBzdGFydDsKLQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSBucl9hbGxvY2F0ZWQ7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gKGFtb3VudF9uZWVkZWQgLSByZXN0KTsKKwlyZXR1cm4gKGFtb3VudF9uZWVkZWQgLSByZXN0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYmxvY2tucnNfYW5kX3ByZWFsbG9jX2FycmF5c19mcm9tX3NlYXJjaF9zdGFydAotICAgIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwgYl9ibG9ja25yX3QgKm5ld19ibG9ja25ycywgaW50IGFtb3VudF9uZWVkZWQpCi17Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7Ci0gICAgYl9ibG9ja25yX3Qgc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7Ci0gICAgYl9ibG9ja25yX3QgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOwotICAgIGludCBwYXNzbm8gPSAwOwotICAgIGludCBucl9hbGxvY2F0ZWQgPSAwOwotICAgIGludCBiaWdhbGxvYyA9IDA7CisgICAgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisgICAgIGludCBhbW91bnRfbmVlZGVkKSB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisJYl9ibG9ja25yX3Qgc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJYl9ibG9ja25yX3QgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCWludCBwYXNzbm8gPSAwOworCWludCBucl9hbGxvY2F0ZWQgPSAwOworCWludCBiaWdhbGxvYyA9IDA7CiAKLSAgICBkZXRlcm1pbmVfcHJlYWxsb2Nfc2l6ZShoaW50KTsKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7Ci0gICAgICAgIGludCBxdW90YV9yZXQ7CisJZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoaGludCk7CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworCQlpbnQgcXVvdGFfcmV0OwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkLCBoaW50LT5pbm9kZS0+aV91aWQpOworCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAlZCBibG9ja3MgaWQ9JXUiLAorCQkJICAgICAgIGFtb3VudF9uZWVkZWQsIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQlxdW90YV9yZXQgPSBEUVVPVF9BTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkKTsKLQlpZiAocXVvdGFfcmV0KSAgICAvKiBRdW90YSBleGNlZWRlZD8gKi8KLQkgICAgcmV0dXJuIFFVT1RBX0VYQ0VFREVEOwotCWlmIChoaW50LT5wcmVhbGxvY2F0ZSAmJiBoaW50LT5wcmVhbGxvY19zaXplICkgeworCQlxdW90YV9yZXQgPQorCQkgICAgRFFVT1RfQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCk7CisJCWlmIChxdW90YV9yZXQpCS8qIFF1b3RhIGV4Y2VlZGVkPyAqLworCQkJcmV0dXJuIFFVT1RBX0VYQ0VFREVEOworCQlpZiAoaGludC0+cHJlYWxsb2NhdGUgJiYgaGludC0+cHJlYWxsb2Nfc2l6ZSkgewogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JICAgIHJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGFsbG9jYXRpbmcgKHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLCBoaW50LT5wcmVhbGxvY19zaXplLCBoaW50LT5pbm9kZS0+aV91aWQpOworCQkJcmVpc2VyZnNfZGVidWcocywgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCQkgICAgICAgInJlaXNlcnF1b3RhOiBhbGxvY2F0aW5nIChwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwKKwkJCQkgICAgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSwgaGludC0+aW5vZGUtPmlfdWlkKTsKICNlbmRpZgotCSAgICBxdW90YV9yZXQgPSBEUVVPVF9QUkVBTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBoaW50LT5wcmVhbGxvY19zaXplKTsKLQkgICAgaWYgKHF1b3RhX3JldCkKLQkJaGludC0+cHJlYWxsb2NhdGU9aGludC0+cHJlYWxsb2Nfc2l6ZT0wOworCQkJcXVvdGFfcmV0ID0KKwkJCSAgICBEUVVPVF9QUkVBTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLAorCQkJCQkJCSBoaW50LT5wcmVhbGxvY19zaXplKTsKKwkJCWlmIChxdW90YV9yZXQpCisJCQkJaGludC0+cHJlYWxsb2NhdGUgPSBoaW50LT5wcmVhbGxvY19zaXplID0gMDsKKwkJfQorCQkvKiBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMsIGZvcmNlIGxhcmdlIGFsbG9jYXRpb25zICovCisJCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZDsKIAl9Ci0JLyogZm9yIHVuZm9ybWF0dGVkIG5vZGVzLCBmb3JjZSBsYXJnZSBhbGxvY2F0aW9ucyAqLwotCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZDsKLSAgICB9CiAKLSAgICBkbyB7Ci0JLyogaW4gYmlnYWxsb2MgbW9kZSwgbnJfYWxsb2NhdGVkIHNob3VsZCBzdGF5IHplcm8gdW50aWwKLQkgKiB0aGUgZW50aXJlIGFsbG9jYXRpb24gaXMgZmlsbGVkCi0JICovCi0JaWYgKHVubGlrZWx5KGJpZ2FsbG9jICYmIG5yX2FsbG9jYXRlZCkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiYmlnYWxsb2MgaXMgJWQsIG5yX2FsbG9jYXRlZCAlZFxuIiwKLQkgICAgYmlnYWxsb2MsIG5yX2FsbG9jYXRlZCk7Ci0JICAgIC8qIHJlc2V0IHRoaW5ncyB0byBhIHNhbmUgdmFsdWUgKi8KLQkgICAgYmlnYWxsb2MgPSBhbW91bnRfbmVlZGVkIC0gbnJfYWxsb2NhdGVkOwotCX0KLQkvKgotCSAqIHRyeSBwYXNzIDAgYW5kIHBhc3MgMSBsb29raW5nIGZvciBhIG5pY2UgYmlnCi0JICogY29udGlndW91cyBhbGxvY2F0aW9uLiAgVGhlbiByZXNldCBhbmQgbG9vawotCSAqIGZvciBhbnl0aGluZyB5b3UgY2FuIGZpbmQuCi0JICovCi0JaWYgKHBhc3NubyA9PSAyICYmIGJpZ2FsbG9jKSB7Ci0JICAgIHBhc3NubyA9IDA7Ci0JICAgIGJpZ2FsbG9jID0gMDsKLQl9Ci0Jc3dpdGNoIChwYXNzbm8rKykgewotICAgICAgICBjYXNlIDA6IC8qIFNlYXJjaCBmcm9tIGhpbnQtPnNlYXJjaF9zdGFydCB0byBlbmQgb2YgZGlzayAqLwotCSAgICBzdGFydCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKLQkgICAgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOwotCSAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAvKiBTZWFyY2ggZnJvbSBoaW50LT5iZWcgdG8gaGludC0+c2VhcmNoX3N0YXJ0ICovCi0JICAgIHN0YXJ0ID0gaGludC0+YmVnOwotCSAgICBmaW5pc2ggPSBoaW50LT5zZWFyY2hfc3RhcnQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogLyogTGFzdCBjaGFuY2U6IFNlYXJjaCBmcm9tIDAgdG8gaGludC0+YmVnICovCi0JICAgIHN0YXJ0ID0gMDsKLQkgICAgZmluaXNoID0gaGludC0+YmVnOwotCSAgICBicmVhazsKLQlkZWZhdWx0OiAvKiBXZSd2ZSB0cmllZCBzZWFyY2hpbmcgZXZlcnl3aGVyZSwgbm90IGVub3VnaCBzcGFjZSAqLwotCSAgICAvKiBGcmVlIHRoZSBibG9ja3MgKi8KLQkgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworCWRvIHsKKwkJLyogaW4gYmlnYWxsb2MgbW9kZSwgbnJfYWxsb2NhdGVkIHNob3VsZCBzdGF5IHplcm8gdW50aWwKKwkJICogdGhlIGVudGlyZSBhbGxvY2F0aW9uIGlzIGZpbGxlZAorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGJpZ2FsbG9jICYmIG5yX2FsbG9jYXRlZCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgImJpZ2FsbG9jIGlzICVkLCBucl9hbGxvY2F0ZWQgJWRcbiIsCisJCQkJCSBiaWdhbGxvYywgbnJfYWxsb2NhdGVkKTsKKwkJCS8qIHJlc2V0IHRoaW5ncyB0byBhIHNhbmUgdmFsdWUgKi8KKwkJCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZDsKKwkJfQorCQkvKgorCQkgKiB0cnkgcGFzcyAwIGFuZCBwYXNzIDEgbG9va2luZyBmb3IgYSBuaWNlIGJpZworCQkgKiBjb250aWd1b3VzIGFsbG9jYXRpb24uICBUaGVuIHJlc2V0IGFuZCBsb29rCisJCSAqIGZvciBhbnl0aGluZyB5b3UgY2FuIGZpbmQuCisJCSAqLworCQlpZiAocGFzc25vID09IDIgJiYgYmlnYWxsb2MpIHsKKwkJCXBhc3NubyA9IDA7CisJCQliaWdhbGxvYyA9IDA7CisJCX0KKwkJc3dpdGNoIChwYXNzbm8rKykgeworCQljYXNlIDA6CS8qIFNlYXJjaCBmcm9tIGhpbnQtPnNlYXJjaF9zdGFydCB0byBlbmQgb2YgZGlzayAqLworCQkJc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJCQlmaW5pc2ggPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBTZWFyY2ggZnJvbSBoaW50LT5iZWcgdG8gaGludC0+c2VhcmNoX3N0YXJ0ICovCisJCQlzdGFydCA9IGhpbnQtPmJlZzsKKwkJCWZpbmlzaCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIExhc3QgY2hhbmNlOiBTZWFyY2ggZnJvbSAwIHRvIGhpbnQtPmJlZyAqLworCQkJc3RhcnQgPSAwOworCQkJZmluaXNoID0gaGludC0+YmVnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIFdlJ3ZlIHRyaWVkIHNlYXJjaGluZyBldmVyeXdoZXJlLCBub3QgZW5vdWdoIHNwYWNlICovCisJCQkvKiBGcmVlIHRoZSBibG9ja3MgKi8KKwkJCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCQlyZWlzZXJmc19kZWJ1ZyAocywgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhOiBmcmVlaW5nIChub3NwYWNlKSAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCwgaGludC0+aW5vZGUtPmlfdWlkKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgInJlaXNlcnF1b3RhOiBmcmVlaW5nIChub3NwYWNlKSAlZCBibG9ja3MgaWQ9JXUiLAorCQkJCQkgICAgICAgYW1vdW50X25lZWRlZCArCisJCQkJCSAgICAgICBoaW50LT5wcmVhbGxvY19zaXplIC0KKwkJCQkJICAgICAgIG5yX2FsbG9jYXRlZCwKKwkJCQkJICAgICAgIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCk7ICAgICAvKiBGcmVlIG5vdCBhbGxvY2F0ZWQgYmxvY2tzICovCi0JICAgIH0KLSAgCSAgICB3aGlsZSAobnJfYWxsb2NhdGVkIC0tKQotCQlyZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwgbmV3X2Jsb2NrbnJzW25yX2FsbG9jYXRlZF0sICFoaW50LT5mb3JtYXR0ZWRfbm9kZSk7CisJCQkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCk7CS8qIEZyZWUgbm90IGFsbG9jYXRlZCBibG9ja3MgKi8KKwkJCX0KKwkJCXdoaWxlIChucl9hbGxvY2F0ZWQtLSkKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwKKwkJCQkJCSAgICBuZXdfYmxvY2tucnNbbnJfYWxsb2NhdGVkXSwKKwkJCQkJCSAgICAhaGludC0+Zm9ybWF0dGVkX25vZGUpOwogCi0JICAgIHJldHVybiBOT19ESVNLX1NQQUNFOwotCX0KLSAgICB9IHdoaWxlICgobnJfYWxsb2NhdGVkICs9IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayAoaGludCwKLQkJCSAgICBuZXdfYmxvY2tucnMgKyBucl9hbGxvY2F0ZWQsIHN0YXJ0LCBmaW5pc2gsCi0JCQkgICAgYmlnYWxsb2MgPyBiaWdhbGxvYyA6IDEsCi0JCQkgICAgYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZCwKLQkJCSAgICBoaW50LT5wcmVhbGxvY19zaXplKSkKLQkJCTwgYW1vdW50X25lZWRlZCk7Ci0gICAgaWYgKCAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKLSAgICAgICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplID4KLQkgbnJfYWxsb2NhdGVkICsgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpIHsKLSAgICAvKiBTb21lIG9mIHByZWFsbG9jYXRpb24gYmxvY2tzIHdlcmUgbm90IGFsbG9jYXRlZCAqLworCQkJcmV0dXJuIE5PX0RJU0tfU1BBQ0U7CisJCX0KKwl9IHdoaWxlICgobnJfYWxsb2NhdGVkICs9IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayhoaW50LAorCQkJCQkJCQkgbmV3X2Jsb2NrbnJzICsKKwkJCQkJCQkJIG5yX2FsbG9jYXRlZCwKKwkJCQkJCQkJIHN0YXJ0LCBmaW5pc2gsCisJCQkJCQkJCSBiaWdhbGxvYyA/CisJCQkJCQkJCSBiaWdhbGxvYyA6IDEsCisJCQkJCQkJCSBhbW91bnRfbmVlZGVkIC0KKwkJCQkJCQkJIG5yX2FsbG9jYXRlZCwKKwkJCQkJCQkJIGhpbnQtPgorCQkJCQkJCQkgcHJlYWxsb2Nfc2l6ZSkpCisJCSA8IGFtb3VudF9uZWVkZWQpOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKKwkgICAgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgPgorCSAgICBucl9hbGxvY2F0ZWQgKyBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCkgeworCQkvKiBTb21lIG9mIHByZWFsbG9jYXRpb24gYmxvY2tzIHdlcmUgbm90IGFsbG9jYXRlZCAqLwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogZnJlZWluZyAoZmFpbGVkIHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCAtIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LCBoaW50LT5pbm9kZS0+aV91aWQpOworCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YTogZnJlZWluZyAoZmFpbGVkIHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLAorCQkJICAgICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplIC0KKwkJCSAgICAgICBucl9hbGxvY2F0ZWQgLQorCQkJICAgICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LAorCQkJICAgICAgIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQlEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaGludC0+aW5vZGUsIGFtb3VudF9uZWVkZWQgKwotCSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkIC0KLQkJCQkgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpOwotICAgIH0KKwkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsKKwkJCQkJIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQgLQorCQkJCQkgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPgorCQkJCQkgaV9wcmVhbGxvY19jb3VudCk7CisJfQogCi0gICAgcmV0dXJuIENBUlJZX09OOworCXJldHVybiBDQVJSWV9PTjsKIH0KIAogLyogZ3JhYiBuZXcgYmxvY2tucnMgZnJvbSBwcmVhbGxvY2F0ZWQgbGlzdCAqLwogLyogcmV0dXJuIGFtb3VudCBzdGlsbCBuZWVkZWQgYWZ0ZXIgdXNpbmcgdGhlbSAqLwotc3RhdGljIGludCB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKLQkJCQkJICAgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQorc3RhdGljIGludCB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKKwkJCQkJICAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICAgIGludCBhbW91bnRfbmVlZGVkKQogewotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gaGludC0+aW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGhpbnQtPmlub2RlOwogCi0gICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgewotCXdoaWxlIChhbW91bnRfbmVlZGVkKSB7CisJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgeworCQl3aGlsZSAoYW1vdW50X25lZWRlZCkgewogCi0JICAgICpuZXdfYmxvY2tucnMgKysgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayArKzsKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgLS07CisJCQkqbmV3X2Jsb2NrbnJzKysgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jaysrOworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQtLTsKIAotCSAgICBhbW91bnRfbmVlZGVkIC0tOworCQkJYW1vdW50X25lZWRlZC0tOwogCi0JICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7Ci0JCWxpc3RfZGVsKCZSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KTsgIAotCQlicmVhazsKLQkgICAgfQorCQkJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKKwkJCQlsaXN0X2RlbCgmUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9Ci0gICAgICB9Ci0gICAgLyogcmV0dXJuIGFtb3VudCBzdGlsbCBuZWVkZWQgYWZ0ZXIgdXNpbmcgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLwotICAgIHJldHVybiBhbW91bnRfbmVlZGVkOworCS8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KKwlyZXR1cm4gYW1vdW50X25lZWRlZDsKIH0KIAotaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LAotCQkJICAgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCwKLQkJCSAgICAgICBpbnQgcmVzZXJ2ZWRfYnlfdXMgLyogQW1vdW50IG9mIGJsb2NrcyB3ZSBoYXZlCi0JCQkJCQkgICAgICBhbHJlYWR5IHJlc2VydmVkICovKQoraW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkLCBpbnQgcmVzZXJ2ZWRfYnlfdXMJLyogQW1vdW50IG9mIGJsb2NrcyB3ZSBoYXZlCisJCQkJCQkJCQkJCQkJCQkJCSAgIGFscmVhZHkgcmVzZXJ2ZWQgKi8gKQogewotICAgIGludCBpbml0aWFsX2Ftb3VudF9uZWVkZWQgPSBhbW91bnRfbmVlZGVkOwotICAgIGludCByZXQ7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisJaW50IGluaXRpYWxfYW1vdW50X25lZWRlZCA9IGFtb3VudF9uZWVkZWQ7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKIAotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSwgdGFraW5nIGludG8gYWNjb3VudCByZXNlcnZlZCBzcGFjZSAqLwotICAgIGlmICggU0JfRlJFRV9CTE9DS1MocykgLSBSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzIDwKLQkgYW1vdW50X25lZWRlZCAtIHJlc2VydmVkX2J5X3VzKQotICAgICAgICByZXR1cm4gTk9fRElTS19TUEFDRTsKLSAgICAvKiBzaG91bGQgdGhpcyBiZSBpZiAhaGludC0+aW5vZGUgJiYgIGhpbnQtPnByZWFsbG9jYXRlPyAqLwotICAgIC8qIGRvIHlvdSBtZWFuIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbiBiZSByZW1vdmVkID8gLSBaYW0gKi8KLSAgICAvKiBoaW50LT5mb3JtYXR0ZWRfbm9kZSBjYW5ub3QgYmUgcmVtb3ZlZCBiZWNhdXNlIHdlIHRyeSB0byBhY2Nlc3MKLSAgICAgICBpbm9kZSBpbmZvcm1hdGlvbiBoZXJlLCBhbmQgdGhlcmUgaXMgb2Z0ZW4gbm8gaW5vZGUgYXNzb3RpYXRlZCB3aXRoCi0gICAgICAgbWV0YWRhdGEgYWxsb2NhdGlvbnMgLSBncmVlbiAqLworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSwgdGFraW5nIGludG8gYWNjb3VudCByZXNlcnZlZCBzcGFjZSAqLworCWlmIChTQl9GUkVFX0JMT0NLUyhzKSAtIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgPAorCSAgICBhbW91bnRfbmVlZGVkIC0gcmVzZXJ2ZWRfYnlfdXMpCisJCXJldHVybiBOT19ESVNLX1NQQUNFOworCS8qIHNob3VsZCB0aGlzIGJlIGlmICFoaW50LT5pbm9kZSAmJiAgaGludC0+cHJlYWxsb2NhdGU/ICovCisJLyogZG8geW91IG1lYW4gaGludC0+Zm9ybWF0dGVkX25vZGUgY2FuIGJlIHJlbW92ZWQgPyAtIFphbSAqLworCS8qIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2Ugd2UgdHJ5IHRvIGFjY2VzcworCSAgIGlub2RlIGluZm9ybWF0aW9uIGhlcmUsIGFuZCB0aGVyZSBpcyBvZnRlbiBubyBpbm9kZSBhc3NvdGlhdGVkIHdpdGgKKwkgICBtZXRhZGF0YSBhbGxvY2F0aW9ucyAtIGdyZWVuICovCiAKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7Ci0JYW1vdW50X25lZWRlZCA9IHVzZV9wcmVhbGxvY2F0ZWRfbGlzdF9pZl9hdmFpbGFibGUKLQkgICAgKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7Ci0JaWYgKGFtb3VudF9uZWVkZWQgPT0gMCkJLyogYWxsIGJsb2NrbnJzIHdlIG5lZWQgd2UgZ290IGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2MuIGxpc3QgKi8KLQkgICAgcmV0dXJuIENBUlJZX09OOwotCW5ld19ibG9ja25ycyArPSAoaW5pdGlhbF9hbW91bnRfbmVlZGVkIC0gYW1vdW50X25lZWRlZCk7Ci0gICAgfQotCi0gICAgLyogZmluZCBzZWFyY2ggc3RhcnQgYW5kIHNhdmUgaXQgaW4gaGludCBzdHJ1Y3R1cmUgKi8KLSAgICBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KGhpbnQsIGFtb3VudF9uZWVkZWQpOwotICAgIGlmIChoaW50LT5zZWFyY2hfc3RhcnQgPj0gU0JfQkxPQ0tfQ09VTlQocykpCi0gICAgICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLQotICAgIC8qIGFsbG9jYXRpb24gaXRzZWxmOyBmaWxsIG5ld19ibG9ja25ycyBhbmQgcHJlYWxsb2NhdGlvbiBhcnJheXMgKi8KLSAgICByZXQgPSBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0Ci0JKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7Ci0KLSAgICAvKiB3ZSB1c2VkIHByZWFsbG9jLiBsaXN0IHRvIGZpbGwgKHBhcnRpYWxseSkgbmV3X2Jsb2NrbnJzIGFycmF5LiBJZiBmaW5hbCBhbGxvY2F0aW9uIGZhaWxzIHdlCi0gICAgICogbmVlZCB0byByZXR1cm4gYmxvY2tzIGJhY2sgdG8gcHJlYWxsb2MuIGxpc3Qgb3IganVzdCBmcmVlIHRoZW0uIC0tIFphbSAoSSBjaG9zZSBzZWNvbmQKLSAgICAgKiB2YXJpYW50KSAqLwotCi0gICAgaWYgKHJldCAhPSBDQVJSWV9PTikgewotCXdoaWxlIChhbW91bnRfbmVlZGVkICsrIDwgaW5pdGlhbF9hbW91bnRfbmVlZGVkKSB7Ci0JICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2soaGludC0+dGgsIGhpbnQtPmlub2RlLCAqKC0tbmV3X2Jsb2NrbnJzKSwgMSk7CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgeworCQlhbW91bnRfbmVlZGVkID0gdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZQorCQkgICAgKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7CisJCWlmIChhbW91bnRfbmVlZGVkID09IDApCS8qIGFsbCBibG9ja25ycyB3ZSBuZWVkIHdlIGdvdCBmcm9tCisJCQkJCSAgIHByZWFsbG9jLiBsaXN0ICovCisJCQlyZXR1cm4gQ0FSUllfT047CisJCW5ld19ibG9ja25ycyArPSAoaW5pdGlhbF9hbW91bnRfbmVlZGVkIC0gYW1vdW50X25lZWRlZCk7CiAJfQotICAgIH0KLSAgICByZXR1cm4gcmV0OworCisJLyogZmluZCBzZWFyY2ggc3RhcnQgYW5kIHNhdmUgaXQgaW4gaGludCBzdHJ1Y3R1cmUgKi8KKwlkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KGhpbnQsIGFtb3VudF9uZWVkZWQpOworCWlmIChoaW50LT5zZWFyY2hfc3RhcnQgPj0gU0JfQkxPQ0tfQ09VTlQocykpCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKworCS8qIGFsbG9jYXRpb24gaXRzZWxmOyBmaWxsIG5ld19ibG9ja25ycyBhbmQgcHJlYWxsb2NhdGlvbiBhcnJheXMgKi8KKwlyZXQgPSBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0CisJICAgIChoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQpOworCisJLyogd2UgdXNlZCBwcmVhbGxvYy4gbGlzdCB0byBmaWxsIChwYXJ0aWFsbHkpIG5ld19ibG9ja25ycyBhcnJheS4gSWYgZmluYWwgYWxsb2NhdGlvbiBmYWlscyB3ZQorCSAqIG5lZWQgdG8gcmV0dXJuIGJsb2NrcyBiYWNrIHRvIHByZWFsbG9jLiBsaXN0IG9yIGp1c3QgZnJlZSB0aGVtLiAtLSBaYW0gKEkgY2hvc2Ugc2Vjb25kCisJICogdmFyaWFudCkgKi8KKworCWlmIChyZXQgIT0gQ0FSUllfT04pIHsKKwkJd2hpbGUgKGFtb3VudF9uZWVkZWQrKyA8IGluaXRpYWxfYW1vdW50X25lZWRlZCkgeworCQkJcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsCisJCQkJCSAgICAqKC0tbmV3X2Jsb2NrbnJzKSwgMSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyogVGhlc2UgMiBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gcHJvdmlkZSBibG9ja3MgcmVzZXJ2YXRpb24gdG8gdGhlIHJlc3Qgb2Yga2VybmVsICovCiAvKiBSZXNlcnZlIEBibG9ja3MgYW1vdW50IG9mIGJsb2NrcyBpbiBmcyBwb2ludGVkIGJ5IEBzYi4gQ2FsbGVyIG11c3QgbWFrZSBzdXJlCiAgICB0aGVyZSBhcmUgYWN0dWFsbHkgdGhpcyBtdWNoIGJsb2NrcyBvbiB0aGUgRlMgYXZhaWxhYmxlICovCi12b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoIAotCQkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIC8qIHN1cGVyIGJsb2NrIG9mCi0JCQkJCQkJICAgICAgICBmaWxlc3lzdGVtIHdoZXJlCi0JCQkJCQkJCWJsb2NrcyBzaG91bGQgYmUKLQkJCQkJCQkJcmVzZXJ2ZWQgKi8KLQkJCQkgICAgICBpbnQgYmxvY2tzIC8qIEhvdyBtdWNoIHRvIHJlc2VydmUgKi8KLQkJCQkJICApCit2b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwJLyogc3VwZXIgYmxvY2sgb2YKKwkJCQkJCQkJCSAgIGZpbGVzeXN0ZW0gd2hlcmUKKwkJCQkJCQkJCSAgIGJsb2NrcyBzaG91bGQgYmUKKwkJCQkJCQkJCSAgIHJlc2VydmVkICovCisJCQkJCSAgIGludCBibG9ja3MJLyogSG93IG11Y2ggdG8gcmVzZXJ2ZSAqLworICAgICkKIHsKIAotICAgIC8qIEZhc3QgY2FzZSwgaWYgcmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCi0gICAgaWYgKCAhYmxvY2tzICkKLQlyZXR1cm47CisJLyogRmFzdCBjYXNlLCBpZiByZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKwlpZiAoIWJsb2NrcykKKwkJcmV0dXJuOwogCi0gICAgc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLSAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyArPSBibG9ja3M7Ci0gICAgc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCXNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisJUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgKz0gYmxvY2tzOworCXNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKIH0KIAogLyogVW5yZXNlcnZlIEBibG9ja3MgYW1vdW50IG9mIGJsb2NrcyBpbiBmcyBwb2ludGVkIGJ5IEBzYiAqLwotdm9pZCByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKCAKLQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAvKiBzdXBlciBibG9jayBvZgotCQkJCQkJCSAgZmlsZXN5c3RlbSB3aGVyZQotCQkJCQkJCSAgYmxvY2tzIHNob3VsZCBiZQotCQkJCQkJCSAgcmVzZXJ2ZWQgKi8KLQkJCQlpbnQgYmxvY2tzIC8qIEhvdyBtdWNoIHRvIHVucmVzZXJ2ZSAqLwotCQkJCQkgICkKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAkvKiBzdXBlciBibG9jayBvZgorCQkJCQkJCQkgICBmaWxlc3lzdGVtIHdoZXJlCisJCQkJCQkJCSAgIGJsb2NrcyBzaG91bGQgYmUKKwkJCQkJCQkJICAgcmVzZXJ2ZWQgKi8KKwkJCQkgICAgIGludCBibG9ja3MJLyogSG93IG11Y2ggdG8gdW5yZXNlcnZlICovCisgICAgKQogewogCi0gICAgLyogRmFzdCBjYXNlLCBpZiB1bnJlc2VydmF0aW9uIGlzIHplcm8gLSBleGl0IGltbWVkaWF0ZWx5LiAqLwotICAgIGlmICggIWJsb2NrcyApCi0JcmV0dXJuOworCS8qIEZhc3QgY2FzZSwgaWYgdW5yZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKwlpZiAoIWJsb2NrcykKKwkJcmV0dXJuOwogCi0gICAgc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLSAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyAtPSBibG9ja3M7Ci0gICAgc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOwotICAgIFJGQUxTRSggUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgPCAwLCAiYW1vdW50IG9mIGJsb2NrcyByZXNlcnZlZCBiZWNhbWUgemVybz8iKTsKKwlzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCVJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIC09IGJsb2NrczsKKwlzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisJUkZBTFNFKFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIDwgMCwKKwkgICAgICAgImFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgYmVjYW1lIHplcm8/Iik7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIGhvdyBtdWNoIHBhZ2VzIHdlIHdpbGwgYmUgYWJsZSB0byB3cml0ZSB0byBGUwogICAgdXNlZCBmb3IgcmVpc2VyZnNfZmlsZV93cml0ZSgpIHB1cnBvc2VzIGZvciBub3cuICovCi1pbnQgcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyAoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgLyogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCi0JCQkJCQkgICAgICAgdG8gZXN0aW1hdGUgc3BhY2UgKi8gKQoraW50IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYgkvKiBzdXBlcmJsb2NrIG9mIGZpbGVzeXN0ZW0KKwkJCQkJCQkgICB0byBlc3RpbWF0ZSBzcGFjZSAqLyApCiB7CiAJaW50IHNwYWNlOwogCiAJc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLQlzcGFjZSA9IChTQl9GUkVFX0JMT0NLUyhzYikgLSBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcykgPj4gKCBQQUdFX0NBQ0hFX1NISUZUIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCXNwYWNlID0KKwkgICAgKFNCX0ZSRUVfQkxPQ0tTKHNiKSAtCisJICAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcykgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJICAgc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCXNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKIAotCXJldHVybiBzcGFjZT4wP3NwYWNlOjA7CisJcmV0dXJuIHNwYWNlID4gMCA/IHNwYWNlIDogMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2Rpci5jIGIvZnMvcmVpc2VyZnMvZGlyLmMKaW5kZXggZmJkZTRiMC4uOWRkNzFlOCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZGlyLmMKKysrIGIvZnMvcmVpc2VyZnMvZGlyLmMKQEAgLTEyLDI2NCArMTIsMjg2IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1leHRlcm4gc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWTsKK2V4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfa2V5IE1JTl9LRVk7CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpciAoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwotc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKSA7CitzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgIGludCBkYXRhc3luYyk7CiAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWQJPSBnZW5lcmljX3JlYWRfZGlyLAotICAgIC5yZWFkZGlyCT0gcmVpc2VyZnNfcmVhZGRpciwKLSAgICAuZnN5bmMJPSByZWlzZXJmc19kaXJfZnN5bmMsCi0gICAgLmlvY3RsCT0gcmVpc2VyZnNfaW9jdGwsCisJLnJlYWQgPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyID0gcmVpc2VyZnNfcmVhZGRpciwKKwkuZnN5bmMgPSByZWlzZXJmc19kaXJfZnN5bmMsCisJLmlvY3RsID0gcmVpc2VyZnNfaW9jdGwsCiB9OwogCi1zdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpIHsKLSAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLSAgaW50IGVycjsKLSAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gIGVyciA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpIDsKLSAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKSA7Ci0gIGlmIChlcnIgPCAwKQotICAgICAgcmV0dXJuIGVycjsKLSAgcmV0dXJuIDA7CitzdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICAgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwllcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCi0KICNkZWZpbmUgc3RvcmVfaWgod2hlcmUsd2hhdCkgY29weV9pdGVtX2hlYWQgKHdoZXJlLCB3aGF0KQogCiAvLwotc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQorc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBwb3Nfa2V5OwkvKiBrZXkgb2YgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGlyZWN0b3J5IChrZXkgb2YgZGlyZWN0b3J5IGVudHJ5KSAqLwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgaW50IGl0ZW1fbnVtLCBlbnRyeV9udW07Ci0gICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIHJrZXk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgaW50IHNlYXJjaF9yZXM7Ci0gICAgY2hhciAqIGxvY2FsX2J1ZjsKLSAgICBsb2ZmX3QgbmV4dF9wb3M7Ci0gICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIGludCByZXQgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY3B1X2tleSBwb3Nfa2V5OwkvKiBrZXkgb2YgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGlyZWN0b3J5IChrZXkgb2YgZGlyZWN0b3J5IGVudHJ5KSAqLworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2VudHJ5KTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX251bSwgZW50cnlfbnVtOworCWNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKnJrZXk7CisJc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paDsKKwlpbnQgc2VhcmNoX3JlczsKKwljaGFyICpsb2NhbF9idWY7CisJbG9mZl90IG5leHRfcG9zOworCWNoYXIgc21hbGxfYnVmWzMyXTsJLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCWludCByZXQgPSAwOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CiAKLSAgICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKGlub2RlLT5pX3NiLCAicmVhZGRpciIpIDsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKGlub2RlLT5pX3NiLCAicmVhZGRpciIpOwogCi0gICAgLyogZm9ybSBrZXkgZm9yIHNlYXJjaCB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgdXNpbmcgZl9wb3MgZmllbGQgb2YKLSAgICAgICBmaWxlIHN0cnVjdHVyZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJnBvc19rZXksIGlub2RlLCAoZmlscC0+Zl9wb3MpID8gKGZpbHAtPmZfcG9zKSA6IERPVF9PRkZTRVQsCi0JCSAgVFlQRV9ESVJFTlRSWSwgMyk7Ci0gICAgbmV4dF9wb3MgPSBjcHVfa2V5X2tfb2Zmc2V0ICgmcG9zX2tleSk7CisJLyogZm9ybSBrZXkgZm9yIHNlYXJjaCB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgdXNpbmcgZl9wb3MgZmllbGQgb2YKKwkgICBmaWxlIHN0cnVjdHVyZSAqLworCW1ha2VfY3B1X2tleSgmcG9zX2tleSwgaW5vZGUsCisJCSAgICAgKGZpbHAtPmZfcG9zKSA/IChmaWxwLT5mX3BvcykgOiBET1RfT0ZGU0VULCBUWVBFX0RJUkVOVFJZLAorCQkgICAgIDMpOworCW5leHRfcG9zID0gY3B1X2tleV9rX29mZnNldCgmcG9zX2tleSk7CiAKLSAgICAvKiAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJyZWlzZXJmc19yZWFkZGlyIDE6IGZfcG9zID0gJUxkIiwgZmlscC0+Zl9wb3MpOyovCisJLyogIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAicmVpc2VyZnNfcmVhZGRpciAxOiBmX3BvcyA9ICVMZCIsIGZpbHAtPmZfcG9zKTsgKi8KIAotICAgIHBhdGhfdG9fZW50cnkucmVhZGEgPSBQQVRIX1JFQURBOwotICAgIHdoaWxlICgxKSB7Ci0gICAgcmVzZWFyY2g6Ci0JLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgaXRlbSwgY29udGFpbmluZyBlbnRyeSB3aXRoIHNwZWNpZmllZCBrZXkgKi8KLQlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleSAoaW5vZGUtPmlfc2IsICZwb3Nfa2V5LCAmcGF0aF90b19lbnRyeSwgJmRlKTsKLQlpZiAoc2VhcmNoX3JlcyA9PSBJT19FUlJPUikgewotCSAgICAvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCi0JICAgIC8vIG5vdCBiZSByZWFkCi0JICAgIHJldCA9IC1FSU87Ci0JICAgIGdvdG8gb3V0OwotCX0KLQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07Ci0JYmggPSBkZS5kZV9iaDsKLQlpdGVtX251bSA9IGRlLmRlX2l0ZW1fbnVtOwotCWloID0gZGUuZGVfaWg7Ci0Jc3RvcmVfaWggKCZ0bXBfaWgsIGloKTsKLQkJCi0JLyogd2UgbXVzdCBoYXZlIGZvdW5kIGl0ZW0sIHRoYXQgaXMgaXRlbSBvZiB0aGlzIGRpcmVjdG9yeSwgKi8KLQlSRkFMU0UoIENPTVBfU0hPUlRfS0VZUyAoJihpaC0+aWhfa2V5KSwgJnBvc19rZXkpLAotCQkidnMtOTAwMDogZm91bmQgaXRlbSAlaCBkb2VzIG5vdCBtYXRjaCB0byBkaXIgd2UgcmVhZGRpciAlSyIsCi0JCWloLCAmcG9zX2tleSk7Ci0JUkZBTFNFKCBpdGVtX251bSA+IEJfTlJfSVRFTVMgKGJoKSAtIDEsCi0JCSJ2cy05MDA1IGl0ZW1fbnVtID09ICVkLCBpdGVtIGFtb3VudCA9PSAlZCIsIAotCQlpdGVtX251bSwgQl9OUl9JVEVNUyAoYmgpKTsKLSAgICAgIAotCS8qIGFuZCBlbnRyeSBtdXN0IGJlIG5vdCBtb3JlIHRoYW4gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGl0ZW0gKi8KLQlSRkFMU0UoIElfRU5UUllfQ09VTlQgKGloKSA8IGVudHJ5X251bSwKLQkJInZzLTkwMTA6IGVudHJ5IG51bWJlciBpcyB0b28gYmlnICVkICglZCkiLCAKLQkJZW50cnlfbnVtLCBJX0VOVFJZX0NPVU5UIChpaCkpOwotCi0JaWYgKHNlYXJjaF9yZXMgPT0gUE9TSVRJT05fRk9VTkQgfHwgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVCAoaWgpKSB7Ci0JICAgIC8qIGdvIHRocm91Z2ggYWxsIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBlbnRyeSwgdGhhdCBoYXMgYmVlbiBmb3VuZCAqLwotCSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IEJfSV9ERUggKGJoLCBpaCkgKyBlbnRyeV9udW07Ci0KLQkgICAgZm9yICg7IGVudHJ5X251bSA8IElfRU5UUllfQ09VTlQgKGloKTsgZW50cnlfbnVtICsrLCBkZWggKyspIHsKLQkJaW50IGRfcmVjbGVuOwotCQljaGFyICogZF9uYW1lOwotCQlvZmZfdCBkX29mZjsKLQkJaW5vX3QgZF9pbm87Ci0KLQkJaWYgKCFkZV92aXNpYmxlIChkZWgpKQotCQkgICAgLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCi0JCSAgICBjb250aW51ZTsKLQkJZF9yZWNsZW4gPSBlbnRyeV9sZW5ndGggKGJoLCBpaCwgZW50cnlfbnVtKTsKLQkJZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKLQkJaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKLQkJICAgIGRfcmVjbGVuID0gc3RybGVuIChkX25hbWUpOwotCQotCQlpZiAoZF9yZWNsZW4gPiBSRUlTRVJGU19NQVhfTkFNRShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKXsKLQkJICAgIC8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLwotCQkgICAgY29udGludWUgOwotCQl9Ci0KLSAgICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCi0gICAgICAgICAgICAgICAgaWYgKHJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpICYmCi0gICAgICAgICAgICAgICAgICAgICFvbGRfZm9ybWF0X29ubHkoaW5vZGUtPmlfc2IpICYmCi0gICAgICAgICAgICAgICAgICAgIGZpbHAtPmZfZGVudHJ5ID09IGlub2RlLT5pX3NiLT5zX3Jvb3QgJiYKLSAgICAgICAgICAgICAgICAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QgJiYKLSAgICAgICAgICAgICAgICAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCkgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUpLT5rX29iamVjdGlkKSkgewotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0JCWRfb2ZmID0gZGVoX29mZnNldCAoZGVoKTsKLQkJZmlscC0+Zl9wb3MgPSBkX29mZiA7Ci0JCWRfaW5vID0gZGVoX29iamVjdGlkIChkZWgpOwotCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKLQkJICBsb2NhbF9idWYgPSBzbWFsbF9idWYgOwotCQl9IGVsc2UgewotCQkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7Ci0JCSAgICBpZiAoIWxvY2FsX2J1ZikgewotCQkJcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7Ci0JCQlyZXQgPSAtRU5PTUVNIDsKKwlwYXRoX3RvX2VudHJ5LnJlYWRhID0gUEFUSF9SRUFEQTsKKwl3aGlsZSAoMSkgeworCSAgICAgIHJlc2VhcmNoOgorCQkvKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBpdGVtLCBjb250YWluaW5nIGVudHJ5IHdpdGggc3BlY2lmaWVkIGtleSAqLworCQlzZWFyY2hfcmVzID0KKwkJICAgIHNlYXJjaF9ieV9lbnRyeV9rZXkoaW5vZGUtPmlfc2IsICZwb3Nfa2V5LCAmcGF0aF90b19lbnRyeSwKKwkJCQkJJmRlKTsKKwkJaWYgKHNlYXJjaF9yZXMgPT0gSU9fRVJST1IpIHsKKwkJCS8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKKwkJCS8vIG5vdCBiZSByZWFkCisJCQlyZXQgPSAtRUlPOwogCQkJZ290byBvdXQ7Ci0JCSAgICB9Ci0JCSAgICBpZiAoaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGhfdG9fZW50cnkpKSB7Ci0JCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOwotCQkJZ290byByZXNlYXJjaDsKLQkJICAgIH0KIAkJfQotCQkvLyBOb3RlLCB0aGF0IHdlIGNvcHkgbmFtZSB0byB1c2VyIHNwYWNlIHZpYSB0ZW1wb3JhcnkKLQkJLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCi0JCS8vIHVzZXIgc3BhY2UgYnVmZmVyIGlzIHN3YXBwZWQgb3V0LiBBdCB0aGF0IHRpbWUKLQkJLy8gZW50cnkgY2FuIG1vdmUgdG8gc29tZXdoZXJlIGVsc2UKLQkJbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOwotCQlpZiAoZmlsbGRpciAoZGlyZW50LCBsb2NhbF9idWYsIGRfcmVjbGVuLCBkX29mZiwgZF9pbm8sIAotCQkgICAgICAgICAgICAgRFRfVU5LTk9XTikgPCAwKSB7Ci0JCSAgICBpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgewotCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQkJICAgIH0KLQkJICAgIGdvdG8gZW5kOwotCQl9Ci0JCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7Ci0JCSAgICByZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJCWJoID0gZGUuZGVfYmg7CisJCWl0ZW1fbnVtID0gZGUuZGVfaXRlbV9udW07CisJCWloID0gZGUuZGVfaWg7CisJCXN0b3JlX2loKCZ0bXBfaWgsIGloKTsKKworCQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCQlSRkFMU0UoQ09NUF9TSE9SVF9LRVlTKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKKwkJICAgICAgICJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJICAgICAgIGloLCAmcG9zX2tleSk7CisJCVJGQUxTRShpdGVtX251bSA+IEJfTlJfSVRFTVMoYmgpIC0gMSwKKwkJICAgICAgICJ2cy05MDA1IGl0ZW1fbnVtID09ICVkLCBpdGVtIGFtb3VudCA9PSAlZCIsCisJCSAgICAgICBpdGVtX251bSwgQl9OUl9JVEVNUyhiaCkpOworCisJCS8qIGFuZCBlbnRyeSBtdXN0IGJlIG5vdCBtb3JlIHRoYW4gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGl0ZW0gKi8KKwkJUkZBTFNFKElfRU5UUllfQ09VTlQoaWgpIDwgZW50cnlfbnVtLAorCQkgICAgICAgInZzLTkwMTA6IGVudHJ5IG51bWJlciBpcyB0b28gYmlnICVkICglZCkiLAorCQkgICAgICAgZW50cnlfbnVtLCBJX0VOVFJZX0NPVU5UKGloKSk7CisKKwkJaWYgKHNlYXJjaF9yZXMgPT0gUE9TSVRJT05fRk9VTkQKKwkJICAgIHx8IGVudHJ5X251bSA8IElfRU5UUllfQ09VTlQoaWgpKSB7CisJCQkvKiBnbyB0aHJvdWdoIGFsbCBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgaXRlbSBiZWdpbm5pbmcgZnJvbSB0aGUgZW50cnksIHRoYXQgaGFzIGJlZW4gZm91bmQgKi8KKwkJCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPQorCQkJICAgIEJfSV9ERUgoYmgsIGloKSArIGVudHJ5X251bTsKKworCQkJZm9yICg7IGVudHJ5X251bSA8IElfRU5UUllfQ09VTlQoaWgpOworCQkJICAgICBlbnRyeV9udW0rKywgZGVoKyspIHsKKwkJCQlpbnQgZF9yZWNsZW47CisJCQkJY2hhciAqZF9uYW1lOworCQkJCW9mZl90IGRfb2ZmOworCQkJCWlub190IGRfaW5vOworCisJCQkJaWYgKCFkZV92aXNpYmxlKGRlaCkpCisJCQkJCS8qIGl0IGlzIGhpZGRlbiBlbnRyeSAqLworCQkJCQljb250aW51ZTsKKwkJCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7CisJCQkJZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUoYmgsIGloLCBkZWgpOworCQkJCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCisJCQkJCWRfcmVjbGVuID0gc3RybGVuKGRfbmFtZSk7CisKKwkJCQlpZiAoZF9yZWNsZW4gPgorCQkJCSAgICBSRUlTRVJGU19NQVhfTkFNRShpbm9kZS0+aV9zYi0+CisJCQkJCQkgICAgICBzX2Jsb2Nrc2l6ZSkpIHsKKwkJCQkJLyogdG9vIGJpZyB0byBzZW5kIGJhY2sgdG8gVkZTICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8qIElnbm9yZSB0aGUgLnJlaXNlcmZzX3ByaXYgZW50cnkgKi8KKwkJCQlpZiAocmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSAmJgorCQkJCSAgICAhb2xkX2Zvcm1hdF9vbmx5KGlub2RlLT5pX3NiKSAmJgorCQkJCSAgICBmaWxwLT5mX2RlbnRyeSA9PSBpbm9kZS0+aV9zYi0+c19yb290ICYmCisJCQkJICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290ICYmCisJCQkJICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlCisJCQkJICAgICYmIGRlaF9vYmplY3RpZChkZWgpID09CisJCQkJICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkKKwkJCQkJCShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPgorCQkJCQkJIHByaXZfcm9vdC0+ZF9pbm9kZSktPgorCQkJCQkJa19vYmplY3RpZCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJZF9vZmYgPSBkZWhfb2Zmc2V0KGRlaCk7CisJCQkJZmlscC0+Zl9wb3MgPSBkX29mZjsKKwkJCQlkX2lubyA9IGRlaF9vYmplY3RpZChkZWgpOworCQkJCWlmIChkX3JlY2xlbiA8PSAzMikgeworCQkJCQlsb2NhbF9idWYgPSBzbWFsbF9idWY7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9jYWxfYnVmID0KKwkJCQkJICAgIHJlaXNlcmZzX2ttYWxsb2MoZF9yZWNsZW4sIEdGUF9OT0ZTLAorCQkJCQkJCSAgICAgaW5vZGUtPmlfc2IpOworCQkJCQlpZiAoIWxvY2FsX2J1ZikgeworCQkJCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQlpZiAoaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKKwkJCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwKKwkJCQkJCQkgICAgICAgZF9yZWNsZW4sCisJCQkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCQkJCWdvdG8gcmVzZWFyY2g7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJCQkJLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCisJCQkJLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQorCQkJCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJCQkJbWVtY3B5KGxvY2FsX2J1ZiwgZF9uYW1lLCBkX3JlY2xlbik7CisJCQkJaWYgKGZpbGxkaXIKKwkJCQkgICAgKGRpcmVudCwgbG9jYWxfYnVmLCBkX3JlY2xlbiwgZF9vZmYsIGRfaW5vLAorCQkJCSAgICAgRFRfVU5LTk9XTikgPCAwKSB7CisJCQkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQkJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsCisJCQkJCQkJICAgICAgIGRfcmVjbGVuLAorCQkJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CisJCQkJCX0KKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sCisJCQkJCQkgICAgICAgaW5vZGUtPmlfc2IpOworCQkJCX0KKwkJCQkvLyBuZXh0IGVudHJ5IHNob3VsZCBiZSBsb29rZWQgZm9yIHdpdGggc3VjaCBvZmZzZXQKKwkJCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQoZGVoKSArIDE7CisKKwkJCQlpZiAoaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKKwkJCQkJZ290byByZXNlYXJjaDsKKwkJCQl9CisJCQl9CS8qIGZvciAqLwogCQl9CiAKLQkJLy8gbmV4dCBlbnRyeSBzaG91bGQgYmUgbG9va2VkIGZvciB3aXRoIHN1Y2ggb2Zmc2V0Ci0JCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSArIDE7CisJCWlmIChpdGVtX251bSAhPSBCX05SX0lURU1TKGJoKSAtIDEpCisJCQkvLyBlbmQgb2YgZGlyZWN0b3J5IGhhcyBiZWVuIHJlYWNoZWQKKwkJCWdvdG8gZW5kOwogCi0JCWlmIChpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKLQkJICAgIGdvdG8gcmVzZWFyY2g7CisJCS8qIGl0ZW0gd2Ugd2VudCB0aHJvdWdoIGlzIGxhc3QgaXRlbSBvZiBub2RlLiBVc2luZyByaWdodAorCQkgICBkZWxpbWl0aW5nIGtleSBjaGVjayBpcyBpdCBkaXJlY3RvcnkgZW5kICovCisJCXJrZXkgPSBnZXRfcmtleSgmcGF0aF90b19lbnRyeSwgaW5vZGUtPmlfc2IpOworCQlpZiAoIWNvbXBfbGVfa2V5cyhya2V5LCAmTUlOX0tFWSkpIHsKKwkJCS8qIHNldCBwb3Nfa2V5IHRvIGtleSwgdGhhdCBpcyB0aGUgc21hbGxlc3QgYW5kIGdyZWF0ZXIKKwkJCSAgIHRoYXQga2V5IG9mIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBpdGVtICovCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgmcG9zX2tleSwgbmV4dF9wb3MpOworCQkJY29udGludWU7CiAJCX0KLQkgICAgfSAvKiBmb3IgKi8KLQl9CiAKLQlpZiAoaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoYmgpIC0gMSkKLQkgICAgLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCi0JICAgIGdvdG8gZW5kOworCQlpZiAoQ09NUF9TSE9SVF9LRVlTKHJrZXksICZwb3Nfa2V5KSkgeworCQkJLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCisJCQlnb3RvIGVuZDsKKwkJfQogCi0JLyogaXRlbSB3ZSB3ZW50IHRocm91Z2ggaXMgbGFzdCBpdGVtIG9mIG5vZGUuIFVzaW5nIHJpZ2h0Ci0JICAgZGVsaW1pdGluZyBrZXkgY2hlY2sgaXMgaXQgZGlyZWN0b3J5IGVuZCAqLwotCXJrZXkgPSBnZXRfcmtleSAoJnBhdGhfdG9fZW50cnksIGlub2RlLT5pX3NiKTsKLQlpZiAoISBjb21wX2xlX2tleXMgKHJrZXksICZNSU5fS0VZKSkgewotCSAgICAvKiBzZXQgcG9zX2tleSB0byBrZXksIHRoYXQgaXMgdGhlIHNtYWxsZXN0IGFuZCBncmVhdGVyCi0JICAgICAgIHRoYXQga2V5IG9mIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBpdGVtICovCi0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmcG9zX2tleSwgbmV4dF9wb3MpOwotCSAgICBjb250aW51ZTsKLQl9CisJCS8qIGRpcmVjdG9yeSBjb250aW51ZXMgaW4gdGhlIHJpZ2h0IG5laWdoYm9yaW5nIGJsb2NrICovCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZwb3Nfa2V5LAorCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0KEtFWV9GT1JNQVRfM181LCBya2V5KSk7CiAKLQlpZiAoIENPTVBfU0hPUlRfS0VZUyAocmtleSwgJnBvc19rZXkpKSB7Ci0JICAgIC8vIGVuZCBvZiBkaXJlY3RvcnkgaGFzIGJlZW4gcmVhY2hlZAotCSAgICBnb3RvIGVuZDsKLQl9Ci0JCi0JLyogZGlyZWN0b3J5IGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQgbmVpZ2hib3JpbmcgYmxvY2sgKi8KLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJnBvc19rZXksIGxlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIHJrZXkpKTsKKwl9CQkJLyogd2hpbGUgKi8KIAotICAgIH0gLyogd2hpbGUgKi8KLQotCi0gZW5kOgotICAgIGZpbHAtPmZfcG9zID0gbmV4dF9wb3M7Ci0gICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19lbnRyeSkgOwotIG91dDoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiByZXQ7CisgICAgICBlbmQ6CisJZmlscC0+Zl9wb3MgPSBuZXh0X3BvczsKKwlwYXRocmVsc2UoJnBhdGhfdG9fZW50cnkpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fZW50cnkpOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIHJldDsKIH0KIAogLyogY29tcG9zZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzIChlbnRyaWVzIGFyZQogICAgbm90IGFsaWduZWQgdG8gNCBieXRlIGJvdW5kYXJ5KSAqLwogLyogdGhlIGxhc3QgZm91ciBwYXJhbXMgYXJlIExFICovCi12b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEgKGNoYXIgKiBib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKLQkJCSAgICAgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCkKK3ZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbV92MShjaGFyICpib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKKwkJCSAgICBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CiAKLSAgICBtZW1zZXQgKGJvZHksIDAsIEVNUFRZX0RJUl9TSVpFX1YxKTsKLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5OwotICAgIAotICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLiIgKi8KLSAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMF0pLCBET1RfT0ZGU0VUICk7Ci0gICAgLyogdGhlc2UgdHdvIGFyZSBmcm9tIG1ha2VfbGVfaXRlbV9oZWFkLCBhbmQgYXJlIGFyZSBMRSAqLwotICAgIGRlaFswXS5kZWhfZGlyX2lkID0gZGlyaWQ7Ci0gICAgZGVoWzBdLmRlaF9vYmplY3RpZCA9IG9iamlkOwotICAgIGRlaFswXS5kZWhfc3RhdGUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbMF0pLCBFTVBUWV9ESVJfU0laRV9WMSAtIHN0cmxlbiggIi4iICkpOwotICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFswXSkpOwotICAKLSAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4uIiAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFsxXSksIERPVF9ET1RfT0ZGU0VUKTsKLSAgICAvKiBrZXkgb2YgIi4uIiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5ICovCi0gICAgLyogdGhlc2UgdHdvIGFyZSBmcm9tIHRoZSBpbm9kZSwgYW5kIGFyZSBhcmUgTEUgKi8KLSAgICBkZWhbMV0uZGVoX2Rpcl9pZCA9IHBhcl9kaXJpZDsKLSAgICBkZWhbMV0uZGVoX29iamVjdGlkID0gcGFyX29iamlkOwotICAgIGRlaFsxXS5kZWhfc3RhdGUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbMV0pLCBkZWhfbG9jYXRpb24oICYoZGVoWzBdKSApIC0gc3RybGVuKCAiLi4iICkgKTsKLSAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMV0pKTsKKwltZW1zZXQoYm9keSwgMCwgRU1QVFlfRElSX1NJWkVfVjEpOworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7CiAKLSAgICAvKiBjb3B5ICIuLiIgYW5kICIuIiAqLwotICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICksICIuIiwgMSk7Ci0gICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSkgKSwgIi4uIiwgMik7CisJLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLworCXB1dF9kZWhfb2Zmc2V0KCYoZGVoWzBdKSwgRE9UX09GRlNFVCk7CisJLyogdGhlc2UgdHdvIGFyZSBmcm9tIG1ha2VfbGVfaXRlbV9oZWFkLCBhbmQgYXJlIGFyZSBMRSAqLworCWRlaFswXS5kZWhfZGlyX2lkID0gZGlyaWQ7CisJZGVoWzBdLmRlaF9vYmplY3RpZCA9IG9iamlkOworCWRlaFswXS5kZWhfc3RhdGUgPSAwOwkvKiBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9sb2NhdGlvbigmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFX1YxIC0gc3RybGVuKCIuIikpOworCW1hcmtfZGVfdmlzaWJsZSgmKGRlaFswXSkpOworCisJLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KKwlwdXRfZGVoX29mZnNldCgmKGRlaFsxXSksIERPVF9ET1RfT0ZGU0VUKTsKKwkvKiBrZXkgb2YgIi4uIiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJLyogdGhlc2UgdHdvIGFyZSBmcm9tIHRoZSBpbm9kZSwgYW5kIGFyZSBhcmUgTEUgKi8KKwlkZWhbMV0uZGVoX2Rpcl9pZCA9IHBhcl9kaXJpZDsKKwlkZWhbMV0uZGVoX29iamVjdGlkID0gcGFyX29iamlkOworCWRlaFsxXS5kZWhfc3RhdGUgPSAwOwkvKiBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9sb2NhdGlvbigmKGRlaFsxXSksIGRlaF9sb2NhdGlvbigmKGRlaFswXSkpIC0gc3RybGVuKCIuLiIpKTsKKwltYXJrX2RlX3Zpc2libGUoJihkZWhbMV0pKTsKKworCS8qIGNvcHkgIi4uIiBhbmQgIi4iICovCisJbWVtY3B5KGJvZHkgKyBkZWhfbG9jYXRpb24oJihkZWhbMF0pKSwgIi4iLCAxKTsKKwltZW1jcHkoYm9keSArIGRlaF9sb2NhdGlvbigmKGRlaFsxXSkpLCAiLi4iLCAyKTsKIH0KIAogLyogY29tcG9zZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzICovCi12b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW0gKGNoYXIgKiBib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKLQkJCSAgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCkKK3ZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbShjaGFyICpib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKKwkJCSBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CiAKLSAgICBtZW1zZXQgKGJvZHksIDAsIEVNUFRZX0RJUl9TSVpFKTsKLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5OwotICAgIAotICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLiIgKi8KLSAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMF0pLCBET1RfT0ZGU0VUICk7Ci0gICAgLyogdGhlc2UgdHdvIGFyZSBmcm9tIG1ha2VfbGVfaXRlbV9oZWFkLCBhbmQgYXJlIGFyZSBMRSAqLwotICAgIGRlaFswXS5kZWhfZGlyX2lkID0gZGlyaWQ7Ci0gICAgZGVoWzBdLmRlaF9vYmplY3RpZCA9IG9iamlkOwotICAgIGRlaFswXS5kZWhfc3RhdGUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbMF0pLCBFTVBUWV9ESVJfU0laRSAtIFJPVU5EX1VQKCBzdHJsZW4oICIuIiApICkgKTsKLSAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKLSAgCi0gICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KLSAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCApOwotICAgIC8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KLSAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLwotICAgIGRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOwotICAgIGRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7Ci0gICAgZGVoWzFdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSksIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pKSAtIFJPVU5EX1VQKCBzdHJsZW4oICIuLiIgKSApICk7Ci0gICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisJbWVtc2V0KGJvZHksIDAsIEVNUFRZX0RJUl9TSVpFKTsKKwlkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5OwogCi0gICAgLyogY29weSAiLi4iIGFuZCAiLiIgKi8KLSAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzBdKSApLCAiLiIsIDEpOwotICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMV0pICksICIuLiIsIDIpOworCS8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLiIgKi8KKwlwdXRfZGVoX29mZnNldCgmKGRlaFswXSksIERPVF9PRkZTRVQpOworCS8qIHRoZXNlIHR3byBhcmUgZnJvbSBtYWtlX2xlX2l0ZW1faGVhZCwgYW5kIGFyZSBhcmUgTEUgKi8KKwlkZWhbMF0uZGVoX2Rpcl9pZCA9IGRpcmlkOworCWRlaFswXS5kZWhfb2JqZWN0aWQgPSBvYmppZDsKKwlkZWhbMF0uZGVoX3N0YXRlID0gMDsJLyogRW5kaWFuIHNhZmUgaWYgMCAqLworCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbMF0pLCBFTVBUWV9ESVJfU0laRSAtIFJPVU5EX1VQKHN0cmxlbigiLiIpKSk7CisJbWFya19kZV92aXNpYmxlKCYoZGVoWzBdKSk7CisKKwkvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4uIiAqLworCXB1dF9kZWhfb2Zmc2V0KCYoZGVoWzFdKSwgRE9UX0RPVF9PRkZTRVQpOworCS8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwkvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLworCWRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOworCWRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7CisJZGVoWzFdLmRlaF9zdGF0ZSA9IDA7CS8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKwlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoWzFdKSwKKwkJCSBkZWhfbG9jYXRpb24oJihkZWhbMF0pKSAtIFJPVU5EX1VQKHN0cmxlbigiLi4iKSkpOworCW1hcmtfZGVfdmlzaWJsZSgmKGRlaFsxXSkpOworCisJLyogY29weSAiLi4iIGFuZCAiLiIgKi8KKwltZW1jcHkoYm9keSArIGRlaF9sb2NhdGlvbigmKGRlaFswXSkpLCAiLiIsIDEpOworCW1lbWNweShib2R5ICsgZGVoX2xvY2F0aW9uKCYoZGVoWzFdKSksICIuLiIsIDIpOwogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYyBiL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMKaW5kZXggMjExOGRiMi4uYjIyNjRiYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYworKysgYi9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCkBAIC04LDcgKzgsNiBAQAogLyogYmFsYW5jZSB0aGUgdHJlZSBhY2NvcmRpbmcgdG8gdGhlIGFuYWx5c2lzIG1hZGUgYmVmb3JlLAkJKi8KIC8qIGFuZCB1c2luZyBidWZmZXJzIG9idGFpbmVkIGFmdGVyIGFsbCBhYm92ZS4JCQkJKi8KIAotCiAvKioKICAqKiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUKICAqKiBiYWxhbmNlX2xlYWYKQEAgLTI0LDIzICsyMywyMiBAQAogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAKLXN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGIgPSBOVUxMOyAvKiBkZXRlY3RzIHdoZXRoZXIgbW9yZSB0aGFuIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgb2YgdGIgZXhpc3RzIGFzIGEgbWVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjaGVja2luZyB3aGV0aGVyIHNjaGVkdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJydXB0aW5nIGRvX2JhbGFuY2UgKi8KK3N0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YiA9IE5VTEw7CS8qIGRldGVjdHMgd2hldGhlciBtb3JlIHRoYW4gb25lCisJCQkJCSAgIGNvcHkgb2YgdGIgZXhpc3RzIGFzIGEgbWVhbnMKKwkJCQkJICAgb2YgY2hlY2tpbmcgd2hldGhlciBzY2hlZHVsZQorCQkJCQkgICBpcyBpbnRlcnJ1cHRpbmcgZG9fYmFsYW5jZSAqLwogI2VuZGlmCiAKLWlubGluZSB2b2lkIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZsYWcpCitpbmxpbmUgdm9pZCBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZsYWcpCiB7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRiLT50cmFuc2FjdGlvbl9oYW5kbGUtPnRfc3VwZXIsIGJoKSA7CisJam91cm5hbF9tYXJrX2RpcnR5KHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsCisJCQkgICB0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLT50X3N1cGVyLCBiaCk7CiB9CiAKICNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CiAjZGVmaW5lIGRvX2JhbGFuY2VfbWFya19zYl9kaXJ0eSBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eQogCi0KIC8qIHN1bW1hcnk6IAogIGlmIGRlbGV0aW5nIHNvbWV0aGluZyAoIHRiLT5pbnNlcnRfc2l6ZVswXSA8IDAgKQogICAgcmV0dXJuKGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSgpKTsgKGZsYWcgZCBoYW5kbGVkIGhlcmUpCkBAIC02NCw4ICs2Miw2IEBACiAKIC1IYW5zICovCiAKLQotCiAvKiBCYWxhbmNlIGxlYWYgbm9kZSBpbiBjYXNlIG9mIGRlbGV0ZSBvciBjdXQ6IGluc2VydF9zaXplWzBdIDwgMAogICoKICAqIGxudW0sIHJudW0gY2FuIGhhdmUgdmFsdWVzID49IC0xCkBAIC03MywxMzg0ICs2OSwxOTMzIEBACiAgKgkgMCBtZWFucyB0aGF0IG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgbmVpZ2hib3IKICAqCT4wIG1lYW5zIHRvIHNoaWZ0IGVudGlyZWx5IG9yIHBhcnRseSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcyB0byB0aGUgbmVpZ2hib3IKICAqLwotc3RhdGljIGludCBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGZsYWcpCitzdGF0aWMgaW50IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGZsYWcpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0gICAgaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCk7Ci0gICAgaW50IHBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKLSAgICBpbnQgbjsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCWludCBpdGVtX3BvcyA9IFBBVEhfTEFTVF9QT1NJVElPTih0Yi0+dGJfcGF0aCk7CisJaW50IHBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworCXN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKwlpbnQgbjsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKIAotICAgIFJGQUxTRSggdGItPkZSWzBdICYmIEJfTEVWRUwgKHRiLT5GUlswXSkgIT0gRElTS19MRUFGX05PREVfTEVWRUwgKyAxLAotCSAgICAidnMtIDEyMDAwOiBsZXZlbDogd3JvbmcgRlIgJXoiLCB0Yi0+RlJbMF0pOwotICAgIFJGQUxTRSggdGItPmJsa251bVswXSA+IDEsCi0JICAgICJQQVAtMTIwMDU6IHRiLT5ibGtudW0gPT0gJWQsIGNhbiBub3QgYmUgPiAxIiwgdGItPmJsa251bVswXSk7Ci0gICAgUkZBTFNFKCAhIHRiLT5ibGtudW1bMF0gJiYgISBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksCi0JICAgICJQQVAtMTIwMTA6IHRyZWUgY2FuIG5vdCBiZSBlbXB0eSIpOworCVJGQUxTRSh0Yi0+RlJbMF0gJiYgQl9MRVZFTCh0Yi0+RlJbMF0pICE9IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSwKKwkgICAgICAgInZzLSAxMjAwMDogbGV2ZWw6IHdyb25nIEZSICV6IiwgdGItPkZSWzBdKTsKKwlSRkFMU0UodGItPmJsa251bVswXSA+IDEsCisJICAgICAgICJQQVAtMTIwMDU6IHRiLT5ibGtudW0gPT0gJWQsIGNhbiBub3QgYmUgPiAxIiwgdGItPmJsa251bVswXSk7CisJUkZBTFNFKCF0Yi0+YmxrbnVtWzBdICYmICFQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksCisJICAgICAgICJQQVAtMTIwMTA6IHRyZWUgY2FuIG5vdCBiZSBlbXB0eSIpOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpOworCWloID0gQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpOwogCi0gICAgLyogRGVsZXRlIG9yIHRydW5jYXRlIHRoZSBpdGVtICovCisJLyogRGVsZXRlIG9yIHRydW5jYXRlIHRoZSBpdGVtICovCiAKLSAgICBzd2l0Y2ggKGZsYWcpIHsKLSAgICBjYXNlIE1fREVMRVRFOiAgIC8qIGRlbGV0ZSBpdGVtIGluIFNbMF0gKi8KKwlzd2l0Y2ggKGZsYWcpIHsKKwljYXNlIE1fREVMRVRFOgkJLyogZGVsZXRlIGl0ZW0gaW4gU1swXSAqLwogCi0JUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgKyBJSF9TSVpFICE9IC10Yi0+aW5zZXJ0X3NpemVbMF0sCi0JICAgICAgICAidnMtMTIwMTM6IG1vZGUgRGVsZXRlLCBpbnNlcnQgc2l6ZSAlZCwgaWggdG8gYmUgZGVsZXRlZCAlaCIsCi0gCQkgLXRiLT5pbnNlcnRfc2l6ZSBbMF0sIGloKTsKKwkJUkZBTFNFKGloX2l0ZW1fbGVuKGloKSArIElIX1NJWkUgIT0gLXRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJICAgICAgICJ2cy0xMjAxMzogbW9kZSBEZWxldGUsIGluc2VydCBzaXplICVkLCBpaCB0byBiZSBkZWxldGVkICVoIiwKKwkJICAgICAgIC10Yi0+aW5zZXJ0X3NpemVbMF0sIGloKTsKIAotCWJpLnRiID0gdGI7Ci0JYmkuYmlfYmggPSB0YlMwOwotCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7Ci0JYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKLQlsZWFmX2RlbGV0ZV9pdGVtcyAoJmJpLCAwLCBpdGVtX3BvcywgMSwgLTEpOworCQliaS50YiA9IHRiOworCQliaS5iaV9iaCA9IHRiUzA7CisJCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpOworCQlsZWFmX2RlbGV0ZV9pdGVtcygmYmksIDAsIGl0ZW1fcG9zLCAxLCAtMSk7CiAKLQlpZiAoICEgaXRlbV9wb3MgJiYgdGItPkNGTFswXSApIHsKLQkgICAgaWYgKCBCX05SX0lURU1TKHRiUzApICkgewotCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSx0YlMwLDApOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlpZiAoICEgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkgKQotCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLDApOwotCSAgICB9Ci0JfSAKLQotCVJGQUxTRSggISBpdGVtX3BvcyAmJiAhdGItPkNGTFswXSwKLQkJIlBBUC0xMjAyMDogdGItPkNGTFswXT09JXAsIHRiLT5MWzBdPT0lcCIsIHRiLT5DRkxbMF0sIHRiLT5MWzBdKTsKLSAgICAKLQlicmVhazsKLQotICAgIGNhc2UgTV9DVVQ6IHsgIC8qIGN1dCBpdGVtIGluIFNbMF0gKi8KLQliaS50YiA9IHRiOwotCWJpLmJpX2JoID0gdGJTMDsKLQliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7Ci0JaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKLQotCSAgICAvKiBVRlMgdW5saW5rIHNlbWFudGljcyBhcmUgc3VjaCB0aGF0IHlvdSBjYW4gb25seSBkZWxldGUgb25lIGRpcmVjdG9yeSBlbnRyeSBhdCBhIHRpbWUuICovCi0JICAgIC8qIHdoZW4gd2UgY3V0IGEgZGlyZWN0b3J5IHRiLT5pbnNlcnRfc2l6ZVswXSBtZWFucyBudW1iZXIgb2YgZW50cmllcyB0byBiZSBjdXQgKGFsd2F5cyAxKSAqLwotCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAtMTsKLQkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCAtdGItPmluc2VydF9zaXplWzBdKTsKLQotCSAgICBSRkFMU0UoICEgaXRlbV9wb3MgJiYgISBwb3NfaW5faXRlbSAmJiAhIHRiLT5DRkxbMF0sCi0JCSAgICAiUEFQLTEyMDMwOiBjYW4gbm90IGNoYW5nZSBkZWxpbWl0aW5nIGtleS4gQ0ZMWzBdPSVwIiwgCi0JCSAgICB0Yi0+Q0ZMWzBdKTsKLQotCSAgICBpZiAoICEgaXRlbV9wb3MgJiYgISBwb3NfaW5faXRlbSAmJiB0Yi0+Q0ZMWzBdICkgewotCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSx0YlMwLDApOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCAtdGItPmluc2VydF9zaXplWzBdKTsKLQotCSAgICBSRkFMU0UoICEgaWhfaXRlbV9sZW4oaWgpLAotCQkiUEFQLTEyMDM1OiBjdXQgbXVzdCBsZWF2ZSBub24temVybyBkeW5hbWljIGxlbmd0aCBvZiBpdGVtIik7Ci0JfQotCWJyZWFrOwotICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0JcHJpbnRfY3VyX3RiICgiMTIwNDAiKTsKLQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMDQwOiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGU6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAotCQkJKGZsYWcgPT0gTV9QQVNURSkgPyAiUEFTVEUiIDogKChmbGFnID09IE1fSU5TRVJUKSA/ICJJTlNFUlQiIDogIlVOS05PV04iKSwgZmxhZyk7Ci0gICAgfQotCi0gICAgLyogdGhlIHJ1bGUgaXMgdGhhdCBubyBzaGlmdGluZyBvY2N1cnMgdW5sZXNzIGJ5IHNoaWZ0aW5nIGEgbm9kZSBjYW4gYmUgZnJlZWQgKi8KLSAgICBuID0gQl9OUl9JVEVNUyh0YlMwKTsKLSAgICBpZiAoIHRiLT5sbnVtWzBdICkgICAgIC8qIExbMF0gdGFrZXMgcGFydCBpbiBiYWxhbmNpbmcgKi8KLSAgICB7Ci0JaWYgKCB0Yi0+bG51bVswXSA9PSAtMSApICAgIC8qIExbMF0gbXVzdCBiZSBqb2luZWQgd2l0aCBTWzBdICovCi0JewotCSAgICBpZiAoIHRiLT5ybnVtWzBdID09IC0xICkgICAgLyogUlswXSBtdXN0IGJlIGFsc28gam9pbmVkIHdpdGggU1swXSAqLwotCSAgICB7CQkJCi0JCWlmICggdGItPkZSWzBdID09IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSApCi0JCXsKLQkJICAgIC8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIExbMF0gKi8KLQkJICAgIGlmICggUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkgPT0gMCAmJiAxIDwgQl9OUl9JVEVNUyh0Yi0+RlJbMF0pICkKLQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiLT5GUlswXSwxKTsKLQotCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0YiwgbiwgLTEsIE5VTEwpOwotCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fUl9UT19MLCB0YiwgQl9OUl9JVEVNUyh0Yi0+UlswXSksIC0xLCBOVUxMKTsKLQotCQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKLQkJICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGItPlJbMF0pOwotCi0JCSAgICByZXR1cm4gMDsKKwkJaWYgKCFpdGVtX3BvcyAmJiB0Yi0+Q0ZMWzBdKSB7CisJCQlpZiAoQl9OUl9JVEVNUyh0YlMwKSkgeworCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwgdGJTMCwKKwkJCQkJICAgIDApOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIVBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSkpCisJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJCSAgICBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwKKwkJCQkJCQkJICAgMCksIDApOworCQkJfQogCQl9Ci0JCS8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIFJbMF0gKi8KLQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19SLCB0YiwgbiwgLTEsIE5VTEwpOwotCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9MX1RPX1IsIHRiLCBCX05SX0lURU1TKHRiLT5MWzBdKSwgLTEsIE5VTEwpOwogCi0JCS8qIHJpZ2h0X2RlbGltaXRpbmdfa2V5IGlzIGNvcnJlY3QgaW4gUlswXSAqLwotCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKwkJUkZBTFNFKCFpdGVtX3BvcyAmJiAhdGItPkNGTFswXSwKKwkJICAgICAgICJQQVAtMTIwMjA6IHRiLT5DRkxbMF09PSVwLCB0Yi0+TFswXT09JXAiLCB0Yi0+Q0ZMWzBdLAorCQkgICAgICAgdGItPkxbMF0pOwogCi0JCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7Ci0JCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGItPkxbMF0pOworCQlicmVhazsKIAotCQlyZXR1cm4gLTE7Ci0JICAgIH0KKwljYXNlIE1fQ1VUOnsJCS8qIGN1dCBpdGVtIGluIFNbMF0gKi8KKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiUzA7CisJCQliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCk7CisJCQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSk7CisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CiAKLQkgICAgUkZBTFNFKCB0Yi0+cm51bVswXSAhPSAwLCAKLQkJICAgICJQQVAtMTIwNDU6IHJudW0gbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7Ci0JICAgIC8qIGFsbCBjb250ZW50cyBvZiBMWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gTFswXSAqLwotCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsIG4sIC0xKTsKKwkJCQkvKiBVRlMgdW5saW5rIHNlbWFudGljcyBhcmUgc3VjaCB0aGF0IHlvdSBjYW4gb25seSBkZWxldGUgb25lIGRpcmVjdG9yeSBlbnRyeSBhdCBhIHRpbWUuICovCisJCQkJLyogd2hlbiB3ZSBjdXQgYSBkaXJlY3RvcnkgdGItPmluc2VydF9zaXplWzBdIG1lYW5zIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIGN1dCAoYWx3YXlzIDEpICovCisJCQkJdGItPmluc2VydF9zaXplWzBdID0gLTE7CisJCQkJbGVhZl9jdXRfZnJvbV9idWZmZXIoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sCisJCQkJCQkgICAgIC10Yi0+aW5zZXJ0X3NpemVbMF0pOwogCi0JICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7CisJCQkJUkZBTFNFKCFpdGVtX3BvcyAmJiAhcG9zX2luX2l0ZW0gJiYgIXRiLT5DRkxbMF0sCisJCQkJICAgICAgICJQQVAtMTIwMzA6IGNhbiBub3QgY2hhbmdlIGRlbGltaXRpbmcga2V5LiBDRkxbMF09JXAiLAorCQkJCSAgICAgICB0Yi0+Q0ZMWzBdKTsKIAotCSAgICByZXR1cm4gMDsKKwkJCQlpZiAoIWl0ZW1fcG9zICYmICFwb3NfaW5faXRlbSAmJiB0Yi0+Q0ZMWzBdKSB7CisJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJCSAgICB0YlMwLCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxlYWZfY3V0X2Zyb21fYnVmZmVyKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLAorCQkJCQkJICAgICAtdGItPmluc2VydF9zaXplWzBdKTsKKworCQkJCVJGQUxTRSghaWhfaXRlbV9sZW4oaWgpLAorCQkJCSAgICAgICAiUEFQLTEyMDM1OiBjdXQgbXVzdCBsZWF2ZSBub24temVybyBkeW5hbWljIGxlbmd0aCBvZiBpdGVtIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRfY3VyX3RiKCIxMjA0MCIpOworCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC0xMjA0MDogYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCSAgICAgICAoZmxhZyA9PQorCQkJCU1fUEFTVEUpID8gIlBBU1RFIiA6ICgoZmxhZyA9PQorCQkJCQkJICAgICAgIE1fSU5TRVJUKSA/ICJJTlNFUlQiIDoKKwkJCQkJCSAgICAgICJVTktOT1dOIiksIGZsYWcpOwogCX0KLQkvKiBhIHBhcnQgb2YgY29udGVudHMgb2YgU1swXSB3aWxsIGJlIGluIExbMF0gYW5kIHRoZSByZXN0IHBhcnQgb2YgU1swXSB3aWxsIGJlIGluIFJbMF0gKi8KIAotCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdIDwgbiApIHx8IAotCQkoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPiBuKzEgKSwKLQkJIlBBUC0xMjA1MDogcm51bSglZCkgYW5kIGxudW0oJWQpIGFuZCBpdGVtIG51bWJlciglZCkgaW4gU1swXSBhcmUgbm90IGNvbnNpc3RlbnQiLAotCQl0Yi0+cm51bVswXSwgdGItPmxudW1bMF0sIG4pOwotCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4gKSAmJiAKLQkJKHRiLT5sYnl0ZXMgIT0gLTEgfHwgdGItPnJieXRlcyAhPSAtMSksCi0JCSJQQVAtMTIwNTU6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIG5vdCBzcGxpdCIsIAotCQl0Yi0+cmJ5dGVzLCB0Yi0+bGJ5dGVzKTsKLQlSRkFMU0UoICggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA9PSBuICsgMSApICYmIAotCQkodGItPmxieXRlcyA8IDEgfHwgdGItPnJieXRlcyAhPSAtMSksCi0JCSJQQVAtMTIwNjA6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIHNwbGl0IiwgCi0JCXRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOworCS8qIHRoZSBydWxlIGlzIHRoYXQgbm8gc2hpZnRpbmcgb2NjdXJzIHVubGVzcyBieSBzaGlmdGluZyBhIG5vZGUgY2FuIGJlIGZyZWVkICovCisJbiA9IEJfTlJfSVRFTVModGJTMCk7CisJaWYgKHRiLT5sbnVtWzBdKSB7CS8qIExbMF0gdGFrZXMgcGFydCBpbiBiYWxhbmNpbmcgKi8KKwkJaWYgKHRiLT5sbnVtWzBdID09IC0xKSB7CS8qIExbMF0gbXVzdCBiZSBqb2luZWQgd2l0aCBTWzBdICovCisJCQlpZiAodGItPnJudW1bMF0gPT0gLTEpIHsJLyogUlswXSBtdXN0IGJlIGFsc28gam9pbmVkIHdpdGggU1swXSAqLworCQkJCWlmICh0Yi0+RlJbMF0gPT0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApKSB7CisJCQkJCS8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIExbMF0gKi8KKwkJCQkJaWYgKFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSkgPT0gMAorCQkJCQkgICAgJiYgMSA8IEJfTlJfSVRFTVModGItPkZSWzBdKSkKKwkJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLAorCQkJCQkJCSAgICB0Yi0+bGtleVswXSwKKwkJCQkJCQkgICAgdGItPkZSWzBdLCAxKTsKIAotCWxlYWZfc2hpZnRfbGVmdCAodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzKTsKLQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSwgdGItPnJieXRlcyk7CisJCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19MLCB0YiwgbiwKKwkJCQkJCQktMSwgTlVMTCk7CisJCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fUl9UT19MLCB0YiwKKwkJCQkJCQlCX05SX0lURU1TKHRiLT5SWzBdKSwKKwkJCQkJCQktMSwgTlVMTCk7CiAKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCQkJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisJCQkJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLAorCQkJCQkJCQkgICB0Yi0+UlswXSk7CiAKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCS8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIFJbMF0gKi8KKwkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fUiwgdGIsIG4sIC0xLAorCQkJCQkJTlVMTCk7CisJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9MX1RPX1IsIHRiLAorCQkJCQkJQl9OUl9JVEVNUyh0Yi0+TFswXSksIC0xLCBOVUxMKTsKKworCQkJCS8qIHJpZ2h0X2RlbGltaXRpbmdfa2V5IGlzIGNvcnJlY3QgaW4gUlswXSAqLworCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSwKKwkJCQkJICAgIHRiLT5SWzBdLCAwKTsKKworCQkJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKwkJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGItPkxbMF0pOworCisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlSRkFMU0UodGItPnJudW1bMF0gIT0gMCwKKwkJCSAgICAgICAiUEFQLTEyMDQ1OiBybnVtIG11c3QgYmUgMCAoJWQpIiwgdGItPnJudW1bMF0pOworCQkJLyogYWxsIGNvbnRlbnRzIG9mIExbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBMWzBdICovCisJCQlsZWFmX3NoaWZ0X2xlZnQodGIsIG4sIC0xKTsKKworCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBhIHBhcnQgb2YgY29udGVudHMgb2YgU1swXSB3aWxsIGJlIGluIExbMF0gYW5kIHRoZSByZXN0IHBhcnQgb2YgU1swXSB3aWxsIGJlIGluIFJbMF0gKi8KKworCQlSRkFMU0UoKHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPCBuKSB8fAorCQkgICAgICAgKHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPiBuICsgMSksCisJCSAgICAgICAiUEFQLTEyMDUwOiBybnVtKCVkKSBhbmQgbG51bSglZCkgYW5kIGl0ZW0gbnVtYmVyKCVkKSBpbiBTWzBdIGFyZSBub3QgY29uc2lzdGVudCIsCisJCSAgICAgICB0Yi0+cm51bVswXSwgdGItPmxudW1bMF0sIG4pOworCQlSRkFMU0UoKHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPT0gbikgJiYKKwkJICAgICAgICh0Yi0+bGJ5dGVzICE9IC0xIHx8IHRiLT5yYnl0ZXMgIT0gLTEpLAorCQkgICAgICAgIlBBUC0xMjA1NTogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgbm90IHNwbGl0IiwKKwkJICAgICAgIHRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOworCQlSRkFMU0UoKHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPT0gbiArIDEpICYmCisJCSAgICAgICAodGItPmxieXRlcyA8IDEgfHwgdGItPnJieXRlcyAhPSAtMSksCisJCSAgICAgICAiUEFQLTEyMDYwOiBiYWQgcmJ5dGVzICglZCkvbGJ5dGVzICglZCkgcGFyYW1ldGVycyB3aGVuIGl0ZW1zIGFyZSBzcGxpdCIsCisJCSAgICAgICB0Yi0+cmJ5dGVzLCB0Yi0+bGJ5dGVzKTsKKworCQlsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzKTsKKwkJbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sIHRiLT5yYnl0ZXMpOworCisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGItPnJudW1bMF0gPT0gLTEpIHsKKwkJLyogYWxsIGNvbnRlbnRzIG9mIFJbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBSWzBdICovCisJCWxlYWZfc2hpZnRfcmlnaHQodGIsIG4sIC0xKTsKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCQlyZXR1cm4gMDsKKwl9CisKKwlSRkFMU0UodGItPnJudW1bMF0sCisJICAgICAgICJQQVAtMTIwNjU6IGJhZCBybnVtIHBhcmFtZXRlciBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKIAlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIHRiLT5ybnVtWzBdID09IC0xICkgewotCS8qIGFsbCBjb250ZW50cyBvZiBSWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLwotCWxlYWZfc2hpZnRfcmlnaHQodGIsIG4sIC0xKTsKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIFJGQUxTRSggdGItPnJudW1bMF0sIAotCSAgICAiUEFQLTEyMDY1OiBiYWQgcm51bSBwYXJhbWV0ZXIgbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7Ci0gICAgcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBiYWxhbmNlX2xlYWYgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCSBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCQkvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICh0aGlzIGlzIG9uIGxpdHRsZSBlbmRpYW4pICovCi0JCQkgY29uc3QgY2hhciAqIGJvZHksCQkvKiBib2R5ICBvZiBpbnNlcnRlZCBpdGVtIG9yIGJ5dGVzIHRvIHBhc3RlICovCi0JCQkgaW50IGZsYWcsCQkJLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZSwgYyAtIGN1dCwgcCAtIHBhc3RlCi0JCQkJCQkJICAgKHNlZSBjb21tZW50IHRvIGRvX2JhbGFuY2UpICovCi0JCQkgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydF9rZXksICAvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0Ci0JCQkJCQkJICAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgotCQkJCQkJCSAgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZwotCQkJCQkJCSAgICBwb2ludGVycyAqLwotCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBpbnNlcnRfcHRyIC8qIGluc2VydGVkIG5vZGUtcHRycyBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KK3N0YXRpYyBpbnQgYmFsYW5jZV9sZWFmKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgaXRlbV9oZWFkICppaCwJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSAodGhpcyBpcyBvbiBsaXR0bGUgZW5kaWFuKSAqLworCQkJY29uc3QgY2hhciAqYm9keSwJLyogYm9keSAgb2YgaW5zZXJ0ZWQgaXRlbSBvciBieXRlcyB0byBwYXN0ZSAqLworCQkJaW50IGZsYWcsCS8qIGkgLSBpbnNlcnQsIGQgLSBkZWxldGUsIGMgLSBjdXQsIHAgLSBwYXN0ZQorCQkJCQkgICAoc2VlIGNvbW1lbnQgdG8gZG9fYmFsYW5jZSkgKi8KKwkJCXN0cnVjdCBpdGVtX2hlYWQgKmluc2VydF9rZXksCS8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbCB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKKwkJCQkJCQkgICBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIG5leHQgaGlnaGVyIGxldmVsLiAgVGhpcyBpbnNlcnRpb24KKwkJCQkJCQkgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZworCQkJCQkJCSAgIHBvaW50ZXJzICovCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKippbnNlcnRfcHRyCS8qIGluc2VydGVkIG5vZGUtcHRycyBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KICAgICApCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0gICAgaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCk7CS8qICBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiBpdGVtIGhlYWRlcnMgaW4gU1swXSAKLQkJCQkJCQkgICAgb2YgdGhlIGFmZmVjdGVkIGl0ZW0gKi8KLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpTX25ld1syXTsgIC8qIG5ldyBub2RlcyBhbGxvY2F0ZWQgdG8gaG9sZCB3aGF0IGNvdWxkIG5vdCBmaXQgaW50byBTICovCi0gICAgaW50IHNudW1bMl07CSAgICAvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHBsYWNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gU19uZXcgKGluY2x1ZGVzIHBhcnRpYWxseSBzaGlmdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMpICovCi0gICAgaW50IHNieXRlc1syXTsgICAgICAgICAgLyogaWYgYW4gaXRlbSBpcyBwYXJ0aWFsbHkgc2hpZnRlZCBpbnRvIFNfbmV3IHRoZW4gCi0JCQkgICAgICAgaWYgaXQgaXMgYSBkaXJlY3RvcnkgaXRlbSAKLQkJCSAgICAgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSB0aGUgaXRlbSB0aGF0IGFyZSBzaGlmdGVkIGludG8gU19uZXcKLQkJCSAgICAgICBlbHNlCi0JCQkgICAgICAgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldwotCQkJICAgICovCi0gICAgaW50IG4sIGk7Ci0gICAgaW50IHJldF92YWw7Ci0gICAgaW50IHBvc19pbl9pdGVtOwotICAgIGludCB6ZXJvc19udW07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCWludCBpdGVtX3BvcyA9IFBBVEhfTEFTVF9QT1NJVElPTih0Yi0+dGJfcGF0aCk7CS8qICBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiBpdGVtIGhlYWRlcnMgaW4gU1swXSAKKwkJCQkJCQkgICBvZiB0aGUgYWZmZWN0ZWQgaXRlbSAqLworCXN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNfbmV3WzJdOwkvKiBuZXcgbm9kZXMgYWxsb2NhdGVkIHRvIGhvbGQgd2hhdCBjb3VsZCBub3QgZml0IGludG8gUyAqLworCWludCBzbnVtWzJdOwkJLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBwbGFjZWQKKwkJCQkgICBpbnRvIFNfbmV3IChpbmNsdWRlcyBwYXJ0aWFsbHkgc2hpZnRlZAorCQkJCSAgIGl0ZW1zKSAqLworCWludCBzYnl0ZXNbMl07CQkvKiBpZiBhbiBpdGVtIGlzIHBhcnRpYWxseSBzaGlmdGVkIGludG8gU19uZXcgdGhlbiAKKwkJCQkgICBpZiBpdCBpcyBhIGRpcmVjdG9yeSBpdGVtIAorCQkJCSAgIGl0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldworCQkJCSAgIGVsc2UKKwkJCQkgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGl0ZW0gdGhhdCBhcmUgc2hpZnRlZCBpbnRvIFNfbmV3CisJCQkJICovCisJaW50IG4sIGk7CisJaW50IHJldF92YWw7CisJaW50IHBvc19pbl9pdGVtOworCWludCB6ZXJvc19udW07CiAKLSAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgYmFsYW5jZV9hdFsgMCBdICk7CisJUFJPQ19JTkZPX0lOQyh0Yi0+dGJfc2IsIGJhbGFuY2VfYXRbMF0pOwogCi0gICAgLyogTWFrZSBiYWxhbmNlIGluIGNhc2UgaW5zZXJ0X3NpemVbMF0gPCAwICovCi0gICAgaWYgKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPCAwICkKLQlyZXR1cm4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICh0YiwgZmxhZyk7Ci0gIAotICAgIHplcm9zX251bSA9IDA7Ci0gICAgaWYgKGZsYWcgPT0gTV9JTlNFUlQgJiYgYm9keSA9PSAwKQotCXplcm9zX251bSA9IGloX2l0ZW1fbGVuKCBpaCApOworCS8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9zaXplWzBdIDwgMCAqLworCWlmICh0Yi0+aW5zZXJ0X3NpemVbMF0gPCAwKQorCQlyZXR1cm4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlKHRiLCBmbGFnKTsKIAotICAgIHBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOwotICAgIC8qIGZvciBpbmRpcmVjdCBpdGVtIHBvc19pbl9pdGVtIGlzIG1lYXN1cmVkIGluIHVuZm9ybWF0dGVkIG5vZGUKLSAgICAgICBwb2ludGVycy4gUmVjYWxjdWxhdGUgdG8gYnl0ZXMgKi8KLSAgICBpZiAoZmxhZyAhPSBNX0lOU0VSVCAmJiBpc19pbmRpcmVjdF9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKSkpCi0JcG9zX2luX2l0ZW0gKj0gVU5GTV9QX1NJWkU7CisJemVyb3NfbnVtID0gMDsKKwlpZiAoZmxhZyA9PSBNX0lOU0VSVCAmJiBib2R5ID09IDApCisJCXplcm9zX251bSA9IGloX2l0ZW1fbGVuKGloKTsKIAotICAgIGlmICggdGItPmxudW1bMF0gPiAwICkgewotCS8qIFNoaWZ0IGxudW1bMF0gaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbMF0gKi8KLQlpZiAoIGl0ZW1fcG9zIDwgdGItPmxudW1bMF0gKSB7Ci0JICAgIC8qIG5ldyBpdGVtIG9yIGl0IHBhcnQgZmFsbHMgdG8gTFswXSwgc2hpZnQgaXQgdG9vICovCi0JICAgIG4gPSBCX05SX0lURU1TKHRiLT5MWzBdKTsKKwlwb3NfaW5faXRlbSA9IHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKKwkvKiBmb3IgaW5kaXJlY3QgaXRlbSBwb3NfaW5faXRlbSBpcyBtZWFzdXJlZCBpbiB1bmZvcm1hdHRlZCBub2RlCisJICAgcG9pbnRlcnMuIFJlY2FsY3VsYXRlIHRvIGJ5dGVzICovCisJaWYgKGZsYWcgIT0gTV9JTlNFUlQKKwkgICAgJiYgaXNfaW5kaXJlY3RfbGVfaWgoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSkKKwkJcG9zX2luX2l0ZW0gKj0gVU5GTV9QX1NJWkU7CiAKLQkgICAgc3dpdGNoIChmbGFnKSB7Ci0JICAgIGNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gaW50byBMWzBdICovCisJaWYgKHRiLT5sbnVtWzBdID4gMCkgeworCQkvKiBTaGlmdCBsbnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMWzBdICovCisJCWlmIChpdGVtX3BvcyA8IHRiLT5sbnVtWzBdKSB7CisJCQkvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGZhbGxzIHRvIExbMF0sIHNoaWZ0IGl0IHRvbyAqLworCQkJbiA9IEJfTlJfSVRFTVModGItPkxbMF0pOwogCi0JCWlmICggaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxICYmIHRiLT5sYnl0ZXMgIT0gLTEgKSB7Ci0JCSAgICAvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gTFswXSAqLwotCQkgICAgaW50IG5ld19pdGVtX2xlbjsKLQkJICAgIGludCB2ZXJzaW9uOworCQkJc3dpdGNoIChmbGFnKSB7CisJCQljYXNlIE1fSU5TRVJUOgkvKiBpbnNlcnQgaXRlbSBpbnRvIExbMF0gKi8KIAotCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfbGVmdCAodGIsIHRiLT5sbnVtWzBdLTEsIC0xKTsKKwkJCQlpZiAoaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxCisJCQkJICAgICYmIHRiLT5sYnl0ZXMgIT0gLTEpIHsKKwkJCQkJLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIExbMF0gKi8KKwkJCQkJaW50IG5ld19pdGVtX2xlbjsKKwkJCQkJaW50IHZlcnNpb247CiAKLQkJICAgIC8qIENhbGN1bGF0ZSBpdGVtIGxlbmd0aCB0byBpbnNlcnQgdG8gU1swXSAqLwotCQkgICAgbmV3X2l0ZW1fbGVuID0gaWhfaXRlbV9sZW4oaWgpIC0gdGItPmxieXRlczsKLQkJICAgIC8qIENhbGN1bGF0ZSBhbmQgY2hlY2sgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIExbMF0gKi8KLQkJICAgIHB1dF9paF9pdGVtX2xlbihpaCwgaWhfaXRlbV9sZW4oaWgpIC0gbmV3X2l0ZW1fbGVuICk7CisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSAtIDEsCisJCQkJCQkJICAgIC0xKTsKIAotCQkgICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gMCwKLQkJCSAgICAiUEFQLTEyMDgwOiB0aGVyZSBpcyBub3RoaW5nIHRvIGluc2VydCBpbnRvIExbMF06IGloX2l0ZW1fbGVuPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaF9pdGVtX2xlbihpaCkpOworCQkJCQkvKiBDYWxjdWxhdGUgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIFNbMF0gKi8KKwkJCQkJbmV3X2l0ZW1fbGVuID0KKwkJCQkJICAgIGloX2l0ZW1fbGVuKGloKSAtIHRiLT5sYnl0ZXM7CisJCQkJCS8qIENhbGN1bGF0ZSBhbmQgY2hlY2sgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIExbMF0gKi8KKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLAorCQkJCQkJCWloX2l0ZW1fbGVuKGloKSAtCisJCQkJCQkJbmV3X2l0ZW1fbGVuKTsKIAotCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBpaCwgYm9keSwKLQkJCQkJICB6ZXJvc19udW0gPiBpaF9pdGVtX2xlbihpaCkgPyBpaF9pdGVtX2xlbihpaCkgOiB6ZXJvc19udW0pOworCQkJCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpIDw9IDAsCisJCQkJCSAgICAgICAiUEFQLTEyMDgwOiB0aGVyZSBpcyBub3RoaW5nIHRvIGluc2VydCBpbnRvIExbMF06IGloX2l0ZW1fbGVuPSVkIiwKKwkJCQkJICAgICAgIGloX2l0ZW1fbGVuKGloKSk7CiAKLQkJICAgIHZlcnNpb24gPSBpaF92ZXJzaW9uIChpaCk7CisJCQkJCS8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCSAgICBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwKKwkJCQkJCQkgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICByZXRfdmFsLCBpaCwgYm9keSwKKwkJCQkJCQkgICAgIHplcm9zX251bSA+CisJCQkJCQkJICAgICBpaF9pdGVtX2xlbihpaCkgPworCQkJCQkJCSAgICAgaWhfaXRlbV9sZW4oaWgpIDoKKwkJCQkJCQkgICAgIHplcm9zX251bSk7CiAKLQkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50LCBpdGVtIGxlbmd0aCBhbmQgYm9keSB0byBpbnNlcnQgaW50byBTWzBdICovCi0gICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIGxlX2loX2tfb2Zmc2V0KCBpaCApICsgKHRiLT5sYnl0ZXMgPDwgKGlzX2luZGlyZWN0X2xlX2loKGloKT90Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQ6MCkpICk7CisJCQkJCXZlcnNpb24gPSBpaF92ZXJzaW9uKGloKTsKIAotCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgbmV3X2l0ZW1fbGVuICk7Ci0JCSAgICBpZiAoIHRiLT5sYnl0ZXMgPiAgemVyb3NfbnVtICkgewotCQkJYm9keSArPSAodGItPmxieXRlcyAtIHplcm9zX251bSk7Ci0JCQl6ZXJvc19udW0gPSAwOwotCQkgICAgfQotCQkgICAgZWxzZQotCQkJemVyb3NfbnVtIC09IHRiLT5sYnl0ZXM7CisJCQkJCS8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50LCBpdGVtIGxlbmd0aCBhbmQgYm9keSB0byBpbnNlcnQgaW50byBTWzBdICovCisJCQkJCXNldF9sZV9paF9rX29mZnNldChpaCwKKwkJCQkJCQkgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkJCSAgICh0Yi0+CisJCQkJCQkJICAgIGxieXRlcyA8PAorCQkJCQkJCSAgICAoaXNfaW5kaXJlY3RfbGVfaWgKKwkJCQkJCQkgICAgIChpaCkgPyB0Yi0+dGJfc2ItPgorCQkJCQkJCSAgICAgc19ibG9ja3NpemVfYml0cyAtCisJCQkJCQkJICAgICBVTkZNX1BfU0hJRlQgOgorCQkJCQkJCSAgICAgMCkpKTsKIAotCQkgICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gMCwKLQkJCSJQQVAtMTIwODU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gU1swXTogaWhfaXRlbV9sZW49JWQiLAotCQkJaWhfaXRlbV9sZW4oaWgpKTsKLQkJfSBlbHNlIHsKLQkJICAgIC8qIG5ldyBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gTFswXSAqLwotCQkgICAgLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIHRvIExbMF0gKi8KLQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLTEsIHRiLT5sYnl0ZXMpOwotCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCSAgICB6ZXJvc19udW0gPSAwOwotCQl9Ci0JCWJyZWFrOworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsIG5ld19pdGVtX2xlbik7CisJCQkJCWlmICh0Yi0+bGJ5dGVzID4gemVyb3NfbnVtKSB7CisJCQkJCQlib2R5ICs9CisJCQkJCQkgICAgKHRiLT5sYnl0ZXMgLSB6ZXJvc19udW0pOworCQkJCQkJemVyb3NfbnVtID0gMDsKKwkJCQkJfSBlbHNlCisJCQkJCQl6ZXJvc19udW0gLT0gdGItPmxieXRlczsKIAotCSAgICBjYXNlIE1fUEFTVEU6ICAgLyogYXBwZW5kIGl0ZW0gaW4gTFswXSAqLwotCi0JCWlmICggaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxICYmIHRiLT5sYnl0ZXMgIT0gLTEgKSB7Ci0JCSAgICAvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCi0JCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpKSkgewotCi0JCQlSRkFMU0UoIHplcm9zX251bSwKLQkJCQkiUEFQLTEyMDkwOiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7Ci0JCQkvKiBkaXJlY3RvcnkgaXRlbSAqLwotCQkJaWYgKCB0Yi0+bGJ5dGVzID4gcG9zX2luX2l0ZW0gKSB7Ci0JCQkgICAgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIExbMF0gKi8KLQkJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOwotCQkJICAgIGludCBsX3Bvc19pbl9pdGVtID0gcG9zX2luX2l0ZW07Ci0JCQkJCQkJICAKLQkJCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBlbnRyaWVzIGZyb20gZ2l2ZW4gZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyAtIDEpOwotCQkJICAgIGlmICggcmV0X3ZhbCAmJiAhIGl0ZW1fcG9zICkgewotCQkJCXBhc3RlZCA9ICBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxCX05SX0lURU1TKHRiLT5MWzBdKS0xKTsKLQkJCQlsX3Bvc19pbl9pdGVtICs9IElfRU5UUllfQ09VTlQocGFzdGVkKSAtICh0Yi0+bGJ5dGVzLTEpOwotCQkJICAgIH0KLQotCQkJICAgIC8qIEFwcGVuZCBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCSAgICBiaS50YiA9IHRiOwotCQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07Ci0JCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOwotCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBsX3Bvc19pbl9pdGVtLAotCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7Ci0KLQkJCSAgICAvKiBwcmV2aW91cyBzdHJpbmcgcHJlcGFyZWQgc3BhY2UgZm9yIHBhc3RpbmcgbmV3IGVudHJ5LCBmb2xsb3dpbmcgc3RyaW5nIHBhc3RlcyB0aGlzIGVudHJ5ICovCi0KLQkJCSAgICAvKiB3aGVuIHdlIGhhdmUgbWVyZ2UgZGlyZWN0b3J5IGl0ZW0sIHBvc19pbl9pdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG9vICovCi0KLQkJCSAgICAvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5LiAxIGlzIGVudHJ5IG51bWJlciAqLwotCQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoYmkuYmlfYmgsIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGxfcG9zX2luX2l0ZW0sIDEsCi0JCQkJCQkoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCAKLQkJCQkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkJKTsKLQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLwotCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KLQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7Ci0JCQl9Ci0JCQkvKiBDYWxjdWxhdGUgbmV3IHBvc2l0aW9uIHRvIGFwcGVuZCBpbiBpdGVtIGJvZHkgKi8KLQkJCXBvc19pbl9pdGVtIC09IHRiLT5sYnl0ZXM7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCS8qIHJlZ3VsYXIgb2JqZWN0ICovCi0JCQlSRkFMU0UoIHRiLT5sYnl0ZXMgPD0gMCwKLQkJCSAgICAgICAgIlBBUC0xMjA5NTogdGhlcmUgaXMgbm90aGluZyB0byBzaGlmdCB0byBMWzBdLiBsYnl0ZXM9JWQiLAotCQkJCXRiLT5sYnl0ZXMpOwotCQkJUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFQLTEyMTAwOiBpbmNvcnJlY3QgcG9zaXRpb24gdG8gcGFzdGU6IGl0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCi0JCQkJaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpLCBwb3NfaW5faXRlbSk7Ci0KLQkJCWlmICggdGItPmxieXRlcyA+PSBwb3NfaW5faXRlbSApIHsKLQkJCSAgICAvKiBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSBpbiB3aG9sZSAqLwotCQkJICAgIGludCBsX247Ci0KLQkJCSAgICAvKiB0aGlzIGJ5dGVzIG51bWJlciBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IGl0ZW0gb2YgTFtoXSAqLwotCQkJICAgIGxfbiA9IHRiLT5sYnl0ZXMgLSBwb3NfaW5faXRlbTsKLQotCQkJICAgIC8qIENhbGN1bGF0ZSBuZXcgaW5zZXJ0X3NpemVbMF0gKi8KLQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gbF9uOwotCi0JCQkgICAgUkZBTFNFKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKLQkJCQkgICAgIlBBUC0xMjEwNTogdGhlcmUgaXMgbm90aGluZyB0byBwYXN0ZSBpbnRvIExbMF0uIGluc2VydF9zaXplPSVkIiwKLQkJCQkgICAgdGItPmluc2VydF9zaXplWzBdKTsKLQkJCSAgICByZXRfdmFsID0gIGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSwgCi0JCQkJCQkgICAgICAgaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpKTsKLQkJCSAgICAvKiBBcHBlbmQgdG8gYm9keSBvZiBpdGVtIGluIExbMF0gKi8KLQkJCSAgICBiaS50YiA9IHRiOwotCQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07Ci0JCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOwotCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlcigKLQkJCQkmYmksbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwKLQkJCQlpaF9pdGVtX2xlbiggQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sbitpdGVtX3Bvcy1yZXRfdmFsKSksCi0JCQkJbF9uLGJvZHksIHplcm9zX251bSA+IGxfbiA/IGxfbiA6IHplcm9zX251bQotCQkJCSk7Ci0JCQkgICAgLyogMC10aCBpdGVtIGluIFMwIGNhbiBiZSBvbmx5IG9mIERJUkVDVCB0eXBlIHdoZW4gbF9uICE9IDAqLwotCQkJICAgIHsKLQkJCQlpbnQgdmVyc2lvbjsKLQkJCQlpbnQgdGVtcF9sID0gbF9uOwotCQkJCQotCQkJCVJGQUxTRSAoaWhfaXRlbV9sZW4gKEJfTl9QSVRFTV9IRUFEICh0YlMwLCAwKSksCi0JCQkJCSJQQVAtMTIxMDY6IGl0ZW0gbGVuZ3RoIG11c3QgYmUgMCIpOwotCQkJCVJGQUxTRSAoY29tcF9zaG9ydF9sZV9rZXlzIChCX05fUEtFWSAodGJTMCwgMCksCi0JCQkJCQkJICAgIEJfTl9QS0VZICh0Yi0+TFswXSwKLQkJCQkJCQkJCSAgICBuICsgaXRlbV9wb3MgLSByZXRfdmFsKSksCi0JCQkJCSJQQVAtMTIxMDc6IGl0ZW1zIG11c3QgYmUgb2YgdGhlIHNhbWUgZmlsZSIpOwotCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChCX05fUElURU1fSEVBRCAodGItPkxbMF0sCi0JCQkJCQkJCSAgICAgIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpKSkJewotCQkJCSAgICB0ZW1wX2wgPSBsX24gPDwgKHRiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVCk7CisJCQkJCVJGQUxTRShpaF9pdGVtX2xlbihpaCkgPD0gMCwKKwkJCQkJICAgICAgICJQQVAtMTIwODU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gU1swXTogaWhfaXRlbV9sZW49JWQiLAorCQkJCQkgICAgICAgaWhfaXRlbV9sZW4oaWgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBuZXcgaXRlbSBpbiB3aG9sZSBmYWxscyBpbnRvIExbMF0gKi8KKwkJCQkJLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIHRvIExbMF0gKi8KKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdIC0gMSwKKwkJCQkJCQkgICAgdGItPmxieXRlcyk7CisJCQkJCS8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCSAgICBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwKKwkJCQkJCQkgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICByZXRfdmFsLCBpaCwgYm9keSwKKwkJCQkJCQkgICAgIHplcm9zX251bSk7CisJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCXplcm9zX251bSA9IDA7CiAJCQkJfQotCQkJCS8qIHVwZGF0ZSBrZXkgb2YgZmlyc3QgaXRlbSBpbiBTMCAqLwotCQkJCXZlcnNpb24gPSBpaF92ZXJzaW9uIChCX05fUElURU1fSEVBRCAodGJTMCwgMCkpOwotCQkJCXNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZICh0YlMwLCAwKSwgCi0JCQkJCQkgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkgKHRiUzAsIDApKSArIHRlbXBfbCk7Ci0JCQkJLyogdXBkYXRlIGxlZnQgZGVsaW1pdGluZyBrZXkgKi8KLQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSwKLQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSkgKyB0ZW1wX2wpOwotCQkJICAgIH0KKwkJCQlicmVhazsKIAotCQkJICAgIC8qIENhbGN1bGF0ZSBuZXcgYm9keSwgcG9zaXRpb24gaW4gaXRlbSBhbmQgaW5zZXJ0X3NpemVbMF0gKi8KLQkJCSAgICBpZiAoIGxfbiA+IHplcm9zX251bSApIHsKLQkJCQlib2R5ICs9IChsX24gLSB6ZXJvc19udW0pOwotCQkJCXplcm9zX251bSA9IDA7Ci0JCQkgICAgfQotCQkJICAgIGVsc2UKLQkJCQl6ZXJvc19udW0gLT0gbF9uOwotCQkJICAgIHBvc19pbl9pdGVtID0gMDsJCisJCQljYXNlIE1fUEFTVEU6CS8qIGFwcGVuZCBpdGVtIGluIExbMF0gKi8KIAotCQkJICAgIFJGQUxTRSggY29tcF9zaG9ydF9sZV9rZXlzIAotCQkJCSAgICAoQl9OX1BLRVkodGJTMCwwKSwKLQkJCQkgICAgIEJfTl9QS0VZKHRiLT5MWzBdLEJfTlJfSVRFTVModGItPkxbMF0pLTEpKSB8fAotCQkJCQotCQkJCSAgICAhb3BfaXNfbGVmdF9tZXJnZWFibGUgCi0JCQkJICAgIChCX05fUEtFWSAodGJTMCwgMCksIHRiUzAtPmJfc2l6ZSkgfHwKLQkJCQkgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlCi0JCQkJICAgIChCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSwgCi0JCQkJICAgICB0YlMwLT5iX3NpemUpLAotCQkJCSAgICAiUEFQLTEyMTIwOiBpdGVtIG11c3QgYmUgbWVyZ2UtYWJsZSB3aXRoIGxlZnQgbmVpZ2hib3JpbmcgaXRlbSIpOworCQkJCWlmIChpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEKKwkJCQkgICAgJiYgdGItPmxieXRlcyAhPSAtMSkgeworCQkJCQkvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paAorCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpIHsKKworCQkJCQkJUkZBTFNFKHplcm9zX251bSwKKwkJCQkJCSAgICAgICAiUEFQLTEyMDkwOiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7CisJCQkJCQkvKiBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJaWYgKHRiLT5sYnl0ZXMgPiBwb3NfaW5faXRlbSkgeworCQkJCQkJCS8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBMWzBdICovCisJCQkJCQkJc3RydWN0IGl0ZW1faGVhZAorCQkJCQkJCSAgICAqcGFzdGVkOworCQkJCQkJCWludCBsX3Bvc19pbl9pdGVtID0KKwkJCQkJCQkgICAgcG9zX2luX2l0ZW07CisKKwkJCQkJCQkvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBlbnRyaWVzIGZyb20gZ2l2ZW4gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCQlyZXRfdmFsID0KKwkJCQkJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBsbnVtCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBsYnl0ZXMKKwkJCQkJCQkJCSAgICAtCisJCQkJCQkJCQkgICAgMSk7CisJCQkJCQkJaWYgKHJldF92YWwKKwkJCQkJCQkgICAgJiYgIWl0ZW1fcG9zKSB7CisJCQkJCQkJCXBhc3RlZCA9CisJCQkJCQkJCSAgICBCX05fUElURU1fSEVBRAorCQkJCQkJCQkgICAgKHRiLT5MWzBdLAorCQkJCQkJCQkgICAgIEJfTlJfSVRFTVMKKwkJCQkJCQkJICAgICAodGItPgorCQkJCQkJCQkgICAgICBMWzBdKSAtCisJCQkJCQkJCSAgICAgMSk7CisJCQkJCQkJCWxfcG9zX2luX2l0ZW0gKz0KKwkJCQkJCQkJICAgIElfRU5UUllfQ09VTlQKKwkJCQkJCQkJICAgIChwYXN0ZWQpIC0KKwkJCQkJCQkJICAgICh0Yi0+CisJCQkJCQkJCSAgICAgbGJ5dGVzIC0KKwkJCQkJCQkJICAgICAxKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvKiBBcHBlbmQgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCQliaS5iaV9iaCA9IHRiLT5MWzBdOworCQkJCQkJCWJpLmJpX3BhcmVudCA9CisJCQkJCQkJICAgIHRiLT5GTFswXTsKKwkJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkJICAgIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uCisJCQkJCQkJICAgICh0YiwgMCk7CisJCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIKKwkJCQkJCQkgICAgKCZiaSwKKwkJCQkJCQkgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICByZXRfdmFsLAorCQkJCQkJCSAgICAgbF9wb3NfaW5faXRlbSwKKwkJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisKKwkJCQkJCQkvKiBwcmV2aW91cyBzdHJpbmcgcHJlcGFyZWQgc3BhY2UgZm9yIHBhc3RpbmcgbmV3IGVudHJ5LCBmb2xsb3dpbmcgc3RyaW5nIHBhc3RlcyB0aGlzIGVudHJ5ICovCisKKwkJCQkJCQkvKiB3aGVuIHdlIGhhdmUgbWVyZ2UgZGlyZWN0b3J5IGl0ZW0sIHBvc19pbl9pdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG9vICovCisKKwkJCQkJCQkvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5LiAxIGlzIGVudHJ5IG51bWJlciAqLworCQkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS4KKwkJCQkJCQkJCSAgIGJpX2JoLAorCQkJCQkJCQkJICAgbiArCisJCQkJCQkJCQkgICBpdGVtX3BvcworCQkJCQkJCQkJICAgLQorCQkJCQkJCQkJICAgcmV0X3ZhbCwKKwkJCQkJCQkJCSAgIGxfcG9zX2luX2l0ZW0sCisJCQkJCQkJCQkgICAxLAorCQkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJCSAgICAqKQorCQkJCQkJCQkJICAgYm9keSwKKwkJCQkJCQkJCSAgIGJvZHkKKwkJCQkJCQkJCSAgICsKKwkJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJCSAgIFswXQorCQkJCQkJCSAgICApOworCQkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qIG5ldyBkaXJlY3RvcnkgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBMWzBdICovCisJCQkJCQkJLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkJCQkJCWxlYWZfc2hpZnRfbGVmdCh0YiwKKwkJCQkJCQkJCXRiLT4KKwkJCQkJCQkJCWxudW1bMF0sCisJCQkJCQkJCQl0Yi0+CisJCQkJCQkJCQlsYnl0ZXMpOworCQkJCQkJfQorCQkJCQkJLyogQ2FsY3VsYXRlIG5ldyBwb3NpdGlvbiB0byBhcHBlbmQgaW4gaXRlbSBib2R5ICovCisJCQkJCQlwb3NfaW5faXRlbSAtPSB0Yi0+bGJ5dGVzOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogcmVndWxhciBvYmplY3QgKi8KKwkJCQkJCVJGQUxTRSh0Yi0+bGJ5dGVzIDw9IDAsCisJCQkJCQkgICAgICAgIlBBUC0xMjA5NTogdGhlcmUgaXMgbm90aGluZyB0byBzaGlmdCB0byBMWzBdLiBsYnl0ZXM9JWQiLAorCQkJCQkJICAgICAgIHRiLT5sYnl0ZXMpOworCQkJCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9CisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCSAgICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkodGJTMCwgaXRlbV9wb3MpKSwKKwkJCQkJCSAgICAgICAiUEFQLTEyMTAwOiBpbmNvcnJlY3QgcG9zaXRpb24gdG8gcGFzdGU6IGl0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCSAgICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkodGJTMCwgaXRlbV9wb3MpKSwKKwkJCQkJCSAgICAgICBwb3NfaW5faXRlbSk7CisKKwkJCQkJCWlmICh0Yi0+bGJ5dGVzID49IHBvc19pbl9pdGVtKSB7CisJCQkJCQkJLyogYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gaW4gd2hvbGUgKi8KKwkJCQkJCQlpbnQgbF9uOworCisJCQkJCQkJLyogdGhpcyBieXRlcyBudW1iZXIgbXVzdCBiZSBhcHBlbmRlZCB0byB0aGUgbGFzdCBpdGVtIG9mIExbaF0gKi8KKwkJCQkJCQlsX24gPQorCQkJCQkJCSAgICB0Yi0+bGJ5dGVzIC0KKwkJCQkJCQkgICAgcG9zX2luX2l0ZW07CisKKwkJCQkJCQkvKiBDYWxjdWxhdGUgbmV3IGluc2VydF9zaXplWzBdICovCisJCQkJCQkJdGItPmluc2VydF9zaXplWzBdIC09CisJCQkJCQkJICAgIGxfbjsKKworCQkJCQkJCVJGQUxTRSh0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdIDw9CisJCQkJCQkJICAgICAgIDAsCisJCQkJCQkJICAgICAgICJQQVAtMTIxMDU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gcGFzdGUgaW50byBMWzBdLiBpbnNlcnRfc2l6ZT0lZCIsCisJCQkJCQkJICAgICAgIHRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0pOworCQkJCQkJCXJldF92YWwgPQorCQkJCQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIGxudW0KKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgaWhfaXRlbV9sZW4KKwkJCQkJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkJCSAgICAgKHRiUzAsCisJCQkJCQkJCQkgICAgICBpdGVtX3BvcykpKTsKKwkJCQkJCQkvKiBBcHBlbmQgdG8gYm9keSBvZiBpdGVtIGluIExbMF0gKi8KKwkJCQkJCQliaS50YiA9IHRiOworCQkJCQkJCWJpLmJpX2JoID0gdGItPkxbMF07CisJCQkJCQkJYmkuYmlfcGFyZW50ID0KKwkJCQkJCQkgICAgdGItPkZMWzBdOworCQkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCQkgICAgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24KKwkJCQkJCQkgICAgKHRiLCAwKTsKKwkJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcgorCQkJCQkJCSAgICAoJmJpLAorCQkJCQkJCSAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgIHJldF92YWwsCisJCQkJCQkJICAgICBpaF9pdGVtX2xlbgorCQkJCQkJCSAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJICAgICAgKHRiLT5MWzBdLAorCQkJCQkJCSAgICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgICByZXRfdmFsKSksIGxfbiwKKwkJCQkJCQkgICAgIGJvZHksCisJCQkJCQkJICAgICB6ZXJvc19udW0gPgorCQkJCQkJCSAgICAgbF9uID8gbF9uIDoKKwkJCQkJCQkgICAgIHplcm9zX251bSk7CisJCQkJCQkJLyogMC10aCBpdGVtIGluIFMwIGNhbiBiZSBvbmx5IG9mIERJUkVDVCB0eXBlIHdoZW4gbF9uICE9IDAgKi8KKwkJCQkJCQl7CisJCQkJCQkJCWludCB2ZXJzaW9uOworCQkJCQkJCQlpbnQgdGVtcF9sID0KKwkJCQkJCQkJICAgIGxfbjsKKworCQkJCQkJCQlSRkFMU0UKKwkJCQkJCQkJICAgIChpaF9pdGVtX2xlbgorCQkJCQkJCQkgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCQkgICAgICAodGJTMCwKKwkJCQkJCQkJICAgICAgIDApKSwKKwkJCQkJCQkJICAgICAiUEFQLTEyMTA2OiBpdGVtIGxlbmd0aCBtdXN0IGJlIDAiKTsKKwkJCQkJCQkJUkZBTFNFCisJCQkJCQkJCSAgICAoY29tcF9zaG9ydF9sZV9rZXlzCisJCQkJCQkJCSAgICAgKEJfTl9QS0VZCisJCQkJCQkJCSAgICAgICh0YlMwLCAwKSwKKwkJCQkJCQkJICAgICAgQl9OX1BLRVkKKwkJCQkJCQkJICAgICAgKHRiLT5MWzBdLAorCQkJCQkJCQkgICAgICAgbiArCisJCQkJCQkJCSAgICAgICBpdGVtX3BvcworCQkJCQkJCQkgICAgICAgLQorCQkJCQkJCQkgICAgICAgcmV0X3ZhbCkpLAorCQkJCQkJCQkgICAgICJQQVAtMTIxMDc6IGl0ZW1zIG11c3QgYmUgb2YgdGhlIHNhbWUgZmlsZSIpOworCQkJCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpKSkgeworCQkJCQkJCQkJdGVtcF9sID0KKwkJCQkJCQkJCSAgICBsX24KKwkJCQkJCQkJCSAgICA8PAorCQkJCQkJCQkJICAgICh0Yi0+CisJCQkJCQkJCQkgICAgIHRiX3NiLT4KKwkJCQkJCQkJCSAgICAgc19ibG9ja3NpemVfYml0cworCQkJCQkJCQkJICAgICAtCisJCQkJCQkJCQkgICAgIFVORk1fUF9TSElGVCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJLyogdXBkYXRlIGtleSBvZiBmaXJzdCBpdGVtIGluIFMwICovCisJCQkJCQkJCXZlcnNpb24gPQorCQkJCQkJCQkgICAgaWhfdmVyc2lvbgorCQkJCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJCSAgICAgKHRiUzAsIDApKTsKKwkJCQkJCQkJc2V0X2xlX2tleV9rX29mZnNldAorCQkJCQkJCQkgICAgKHZlcnNpb24sCisJCQkJCQkJCSAgICAgQl9OX1BLRVkKKwkJCQkJCQkJICAgICAodGJTMCwgMCksCisJCQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJCSAgICAgKHZlcnNpb24sCisJCQkJCQkJCSAgICAgIEJfTl9QS0VZCisJCQkJCQkJCSAgICAgICh0YlMwLAorCQkJCQkJCQkgICAgICAgMCkpICsKKwkJCQkJCQkJICAgICB0ZW1wX2wpOworCQkJCQkJCQkvKiB1cGRhdGUgbGVmdCBkZWxpbWl0aW5nIGtleSAqLworCQkJCQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJCSAgICAodmVyc2lvbiwKKwkJCQkJCQkJICAgICBCX05fUERFTElNX0tFWQorCQkJCQkJCQkgICAgICh0Yi0+CisJCQkJCQkJCSAgICAgIENGTFswXSwKKwkJCQkJCQkJICAgICAgdGItPgorCQkJCQkJCQkgICAgICBsa2V5WzBdKSwKKwkJCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkJICAgICAodmVyc2lvbiwKKwkJCQkJCQkJICAgICAgQl9OX1BERUxJTV9LRVkKKwkJCQkJCQkJICAgICAgKHRiLT4KKwkJCQkJCQkJICAgICAgIENGTFswXSwKKwkJCQkJCQkJICAgICAgIHRiLT4KKwkJCQkJCQkJICAgICAgIGxrZXlbMF0pKQorCQkJCQkJCQkgICAgICsgdGVtcF9sKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvKiBDYWxjdWxhdGUgbmV3IGJvZHksIHBvc2l0aW9uIGluIGl0ZW0gYW5kIGluc2VydF9zaXplWzBdICovCisJCQkJCQkJaWYgKGxfbiA+IHplcm9zX251bSkgeworCQkJCQkJCQlib2R5ICs9CisJCQkJCQkJCSAgICAobF9uIC0KKwkJCQkJCQkJICAgICB6ZXJvc19udW0pOworCQkJCQkJCQl6ZXJvc19udW0gPSAwOworCQkJCQkJCX0gZWxzZQorCQkJCQkJCQl6ZXJvc19udW0gLT0KKwkJCQkJCQkJICAgIGxfbjsKKwkJCQkJCQlwb3NfaW5faXRlbSA9IDA7CisKKwkJCQkJCQlSRkFMU0UKKwkJCQkJCQkgICAgKGNvbXBfc2hvcnRfbGVfa2V5cworCQkJCQkJCSAgICAgKEJfTl9QS0VZKHRiUzAsIDApLAorCQkJCQkJCSAgICAgIEJfTl9QS0VZKHRiLT5MWzBdLAorCQkJCQkJCQkgICAgICAgQl9OUl9JVEVNUworCQkJCQkJCQkgICAgICAgKHRiLT4KKwkJCQkJCQkJCUxbMF0pIC0KKwkJCQkJCQkJICAgICAgIDEpKQorCQkJCQkJCSAgICAgfHwKKwkJCQkJCQkgICAgICFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCQkJCSAgICAgKEJfTl9QS0VZKHRiUzAsIDApLAorCQkJCQkJCSAgICAgIHRiUzAtPmJfc2l6ZSkKKwkJCQkJCQkgICAgIHx8CisJCQkJCQkJICAgICAhb3BfaXNfbGVmdF9tZXJnZWFibGUKKwkJCQkJCQkgICAgIChCX05fUERFTElNX0tFWQorCQkJCQkJCSAgICAgICh0Yi0+Q0ZMWzBdLAorCQkJCQkJCSAgICAgICB0Yi0+bGtleVswXSksCisJCQkJCQkJICAgICAgdGJTMC0+Yl9zaXplKSwKKwkJCQkJCQkgICAgICJQQVAtMTIxMjA6IGl0ZW0gbXVzdCBiZSBtZXJnZS1hYmxlIHdpdGggbGVmdCBuZWlnaGJvcmluZyBpdGVtIik7CisJCQkJCQl9IGVsc2UgewkvKiBvbmx5IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdICovCisKKwkJCQkJCQkvKiBDYWxjdWxhdGUgcG9zaXRpb24gaW4gaXRlbSBmb3IgYXBwZW5kIGluIFNbMF0gKi8KKwkJCQkJCQlwb3NfaW5faXRlbSAtPQorCQkJCQkJCSAgICB0Yi0+bGJ5dGVzOworCisJCQkJCQkJUkZBTFNFKHBvc19pbl9pdGVtIDw9IDAsCisJCQkJCQkJICAgICAgICJQQVAtMTIxMjU6IG5vIHBsYWNlIGZvciBwYXN0ZS4gcG9zX2luX2l0ZW09JWQiLAorCQkJCQkJCSAgICAgICBwb3NfaW5faXRlbSk7CisKKwkJCQkJCQkvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkJCQkJCWxlYWZfc2hpZnRfbGVmdCh0YiwKKwkJCQkJCQkJCXRiLT4KKwkJCQkJCQkJCWxudW1bMF0sCisJCQkJCQkJCQl0Yi0+CisJCQkJCQkJCQlsYnl0ZXMpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gaW4gd2hvbGUgKi8KKworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICpwYXN0ZWQ7CisKKwkJCQkJaWYgKCFpdGVtX3BvcyAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZShCX05fUEtFWSh0YlMwLCAwKSwgdGJTMC0+Yl9zaXplKSkgewkvKiBpZiB3ZSBwYXN0ZSBpbnRvIGZpcnN0IGl0ZW0gb2YgU1swXSBhbmQgaXQgaXMgbGVmdCBtZXJnYWJsZSAqLworCQkJCQkJLyogdGhlbiBpbmNyZW1lbnQgcG9zX2luX2l0ZW0gYnkgdGhlIHNpemUgb2YgdGhlIGxhc3QgaXRlbSBpbiBMWzBdICovCisJCQkJCQlwYXN0ZWQgPQorCQkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLAorCQkJCQkJCQkgICBuIC0gMSk7CisJCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgocGFzdGVkKSkKKwkJCQkJCQlwb3NfaW5faXRlbSArPQorCQkJCQkJCSAgICBpaF9lbnRyeV9jb3VudAorCQkJCQkJCSAgICAocGFzdGVkKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwb3NfaW5faXRlbSArPQorCQkJCQkJCSAgICBpaF9pdGVtX2xlbihwYXN0ZWQpOworCQkJCQl9CisKKwkJCQkJLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgYnl0ZSBmcm9tIGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLAorCQkJCQkJCSAgICB0Yi0+bGJ5dGVzKTsKKwkJCQkJLyogQXBwZW5kIHRvIGJvZHkgb2YgaXRlbSBpbiBMWzBdICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gdGItPkxbMF07CisJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkgICAgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksCisJCQkJCQkJICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgcmV0X3ZhbCwKKwkJCQkJCQkgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKworCQkJCQkvKiBpZiBhcHBlbmRlZCBpdGVtIGlzIGRpcmVjdG9yeSwgcGFzdGUgZW50cnkgKi8KKwkJCQkJcGFzdGVkID0KKwkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLAorCQkJCQkJCSAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgcmV0X3ZhbCk7CisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChwYXN0ZWQpKQorCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLmJpX2JoLAorCQkJCQkJCQkgICBuICsKKwkJCQkJCQkJICAgaXRlbV9wb3MgLQorCQkJCQkJCQkgICByZXRfdmFsLAorCQkJCQkJCQkgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgMSwKKwkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkgICAgKilib2R5LAorCQkJCQkJCQkgICBib2R5ICsKKwkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgWzBdCisJCQkJCQkgICAgKTsKKwkJCQkJLyogaWYgYXBwZW5kZWQgaXRlbSBpcyBpbmRpcmVjdCBpdGVtLCBwdXQgdW5mb3JtYXR0ZWQgbm9kZSBpbnRvIHVuIGxpc3QgKi8KKwkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBhc3RlZCkpCisJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZShwYXN0ZWQsIDApOworCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQl6ZXJvc19udW0gPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8qIGNhc2VzIGQgYW5kIHQgKi8KKwkJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJCSAgICAgICAiUEFQLTEyMTMwOiBiYWxhbmNlX2xlYWY6IGxudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCQkJICAgICAgIChmbGFnID09CisJCQkJCQlNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PQorCQkJCQkJCQkJIE1fQ1VUKQorCQkJCQkJCQkJPyAiQ1VUIgorCQkJCQkJCQkJOgorCQkJCQkJCQkJIlVOS05PV04iKSwKKwkJCQkJICAgICAgIGZsYWcpOwogCQkJfQotCQkJZWxzZSAvKiBvbmx5IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdICovCi0JCQl7Ci0JCQkgICAgLyogQ2FsY3VsYXRlIHBvc2l0aW9uIGluIGl0ZW0gZm9yIGFwcGVuZCBpbiBTWzBdICovCi0JCQkgICAgcG9zX2luX2l0ZW0gLT0gdGItPmxieXRlczsKLQotCQkJICAgIFJGQUxTRSggcG9zX2luX2l0ZW0gPD0gMCwKLQkJCQkgICAgIlBBUC0xMjEyNTogbm8gcGxhY2UgZm9yIHBhc3RlLiBwb3NfaW5faXRlbT0lZCIsIHBvc19pbl9pdGVtKTsKLQotCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCi0JCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOwotCQkJfQotCQkgICAgfQorCQl9IGVsc2UgeworCQkJLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLworCQkJbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7CiAJCX0KLQkJZWxzZSAvKiBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSBpbiB3aG9sZSAqLwotCQl7Ci0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOwotCi0JCQlpZiAoICEgaXRlbV9wb3MgICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChCX05fUEtFWSAodGJTMCwgMCksIHRiUzAtPmJfc2l6ZSkgKQotCQkJeyAvKiBpZiB3ZSBwYXN0ZSBpbnRvIGZpcnN0IGl0ZW0gb2YgU1swXSBhbmQgaXQgaXMgbGVmdCBtZXJnYWJsZSAqLwotCQkJICAgIC8qIHRoZW4gaW5jcmVtZW50IHBvc19pbl9pdGVtIGJ5IHRoZSBzaXplIG9mIHRoZSBsYXN0IGl0ZW0gaW4gTFswXSAqLwotCQkJICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLG4tMSk7Ci0JCQkgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSApCi0JCQkJcG9zX2luX2l0ZW0gKz0gaWhfZW50cnlfY291bnQocGFzdGVkKTsKLQkJCSAgICBlbHNlCi0JCQkJcG9zX2luX2l0ZW0gKz0gaWhfaXRlbV9sZW4ocGFzdGVkKTsKLQkJCX0KLQotCQkgICAgLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgYnl0ZSBmcm9tIGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KLQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQodGIsdGItPmxudW1bMF0sdGItPmxieXRlcyk7Ci0JCSAgICAvKiBBcHBlbmQgdG8gYm9keSBvZiBpdGVtIGluIExbMF0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOwotCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgcG9zX2luX2l0ZW0sIHRiLT5pbnNlcnRfc2l6ZVswXSwKLQkJCQkJICBib2R5LCB6ZXJvc19udW0pOwotCi0JCSAgICAvKiBpZiBhcHBlbmRlZCBpdGVtIGlzIGRpcmVjdG9yeSwgcGFzdGUgZW50cnkgKi8KLQkJICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEICh0Yi0+TFswXSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCk7Ci0JCSAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkpCi0JCQlsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJICAgIGJpLmJpX2JoLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBwb3NfaW5faXRlbSwgMSwgCi0JCQkgICAgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCSAgICApOwotCQkgICAgLyogaWYgYXBwZW5kZWQgaXRlbSBpcyBpbmRpcmVjdCBpdGVtLCBwdXQgdW5mb3JtYXR0ZWQgbm9kZSBpbnRvIHVuIGxpc3QgKi8KLQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkKLQkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOwotCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJICAgIHplcm9zX251bSA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6ICAgIC8qIGNhc2VzIGQgYW5kIHQgKi8KLQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjEzMDogYmFsYW5jZV9sZWFmOiBsbnVtID4gMDogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCi0JCQkJKGZsYWcgPT0gTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0gTV9DVVQpID8gIkNVVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKLQkgICAgfQotCX0gZWxzZSB7IAotCSAgICAvKiBuZXcgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBMWzBdICovCi0JICAgIGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSx0Yi0+bGJ5dGVzKTsKIAl9Ci0gICAgfQkvKiB0Yi0+bG51bVswXSA+IDAgKi8KIAotICAgIC8qIENhbGN1bGF0ZSBuZXcgaXRlbSBwb3NpdGlvbiAqLwotICAgIGl0ZW1fcG9zIC09ICggdGItPmxudW1bMF0gLSAoKCB0Yi0+bGJ5dGVzICE9IC0xICkgPyAxIDogMCkpOworCS8qIHRiLT5sbnVtWzBdID4gMCAqLworCS8qIENhbGN1bGF0ZSBuZXcgaXRlbSBwb3NpdGlvbiAqLworCWl0ZW1fcG9zIC09ICh0Yi0+bG51bVswXSAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCkpOwogCi0gICAgaWYgKCB0Yi0+cm51bVswXSA+IDAgKSB7Ci0JLyogc2hpZnQgcm51bVswXSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yIFJbMF0gKi8KLQluID0gQl9OUl9JVEVNUyh0YlMwKTsKLQlzd2l0Y2ggKCBmbGFnICkgeworCWlmICh0Yi0+cm51bVswXSA+IDApIHsKKwkJLyogc2hpZnQgcm51bVswXSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yIFJbMF0gKi8KKwkJbiA9IEJfTlJfSVRFTVModGJTMCk7CisJCXN3aXRjaCAoZmxhZykgewogCi0JY2FzZSBNX0lOU0VSVDogICAvKiBpbnNlcnQgaXRlbSAqLwotCSAgICBpZiAoIG4gLSB0Yi0+cm51bVswXSA8IGl0ZW1fcG9zICkKLQkgICAgeyAvKiBuZXcgaXRlbSBvciBpdHMgcGFydCBmYWxscyB0byBSWzBdICovCi0JCWlmICggaXRlbV9wb3MgPT0gbiAtIHRiLT5ybnVtWzBdICsgMSAmJiB0Yi0+cmJ5dGVzICE9IC0xICkKLQkJeyAvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gUlswXSAqLwotCQkgICAgbG9mZl90IG9sZF9rZXlfY29tcCwgb2xkX2xlbiwgcl96ZXJvc19udW1iZXI7Ci0JCSAgICBjb25zdCBjaGFyICogcl9ib2R5OwotCQkgICAgaW50IHZlcnNpb247Ci0JCSAgICBsb2ZmX3Qgb2Zmc2V0OworCQljYXNlIE1fSU5TRVJUOgkvKiBpbnNlcnQgaXRlbSAqLworCQkJaWYgKG4gLSB0Yi0+cm51bVswXSA8IGl0ZW1fcG9zKSB7CS8qIG5ldyBpdGVtIG9yIGl0cyBwYXJ0IGZhbGxzIHRvIFJbMF0gKi8KKwkJCQlpZiAoaXRlbV9wb3MgPT0gbiAtIHRiLT5ybnVtWzBdICsgMSAmJiB0Yi0+cmJ5dGVzICE9IC0xKSB7CS8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCisJCQkJCWxvZmZfdCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sCisJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJY29uc3QgY2hhciAqcl9ib2R5OworCQkJCQlpbnQgdmVyc2lvbjsKKwkJCQkJbG9mZl90IG9mZnNldDsKIAotCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXS0xLC0xKTsKKwkJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0gLSAxLAorCQkJCQkJCSAtMSk7CiAKLQkJICAgIHZlcnNpb24gPSBpaF92ZXJzaW9uKGloKTsKLQkJICAgIC8qIFJlbWVtYmVyIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgIG9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KCBpaCApOwotCQkgICAgb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKKwkJCQkJdmVyc2lvbiA9IGloX3ZlcnNpb24oaWgpOworCQkJCQkvKiBSZW1lbWJlciBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCAqLworCQkJCQlvbGRfa2V5X2NvbXAgPSBsZV9paF9rX29mZnNldChpaCk7CisJCQkJCW9sZF9sZW4gPSBpaF9pdGVtX2xlbihpaCk7CiAKLQkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBSWzBdICovCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlX2loX2tfb2Zmc2V0KCBpaCApICsgKChvbGRfbGVuIC0gdGItPnJieXRlcyApPDwoaXNfaW5kaXJlY3RfbGVfaWgoaWgpP3RiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVDowKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIG9mZnNldCApOwotCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgdGItPnJieXRlcyk7Ci0JCSAgICAvKiBJbnNlcnQgcGFydCBvZiB0aGUgaXRlbSBpbnRvIFJbMF0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiLT5SWzBdOwotCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJICAgIGlmICggKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKSA+IHplcm9zX251bSApIHsKLQkJCXJfemVyb3NfbnVtYmVyID0gMDsKLQkJCXJfYm9keSA9IGJvZHkgKyAob2xkX2xlbiAtIHRiLT5yYnl0ZXMpIC0gemVyb3NfbnVtOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlyX2JvZHkgPSBib2R5OwotCQkJcl96ZXJvc19udW1iZXIgPSB6ZXJvc19udW0gLSAob2xkX2xlbiAtIHRiLT5yYnl0ZXMpOwotCQkJemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOwotCQkgICAgfQorCQkJCQkvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gUlswXSAqLworCQkJCQlvZmZzZXQgPQorCQkJCQkgICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJICAgICgob2xkX2xlbiAtCisJCQkJCSAgICAgIHRiLT4KKwkJCQkJICAgICAgcmJ5dGVzKSA8PCAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpCisJCQkJCQkJICA/IHRiLT50Yl9zYi0+CisJCQkJCQkJICBzX2Jsb2Nrc2l6ZV9iaXRzIC0KKwkJCQkJCQkgIFVORk1fUF9TSElGVCA6IDApKTsKKwkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLCBvZmZzZXQpOworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsIHRiLT5yYnl0ZXMpOworCQkJCQkvKiBJbnNlcnQgcGFydCBvZiB0aGUgaXRlbSBpbnRvIFJbMF0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCSAgICBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkJCQlpZiAoKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKSA+IHplcm9zX251bSkgeworCQkJCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJCQkJcl9ib2R5ID0KKwkJCQkJCSAgICBib2R5ICsgKG9sZF9sZW4gLQorCQkJCQkJCSAgICB0Yi0+cmJ5dGVzKSAtCisJCQkJCQkgICAgemVyb3NfbnVtOworCQkJCQl9IGVsc2UgeworCQkJCQkJcl9ib2R5ID0gYm9keTsKKwkJCQkJCXJfemVyb3NfbnVtYmVyID0KKwkJCQkJCSAgICB6ZXJvc19udW0gLSAob2xkX2xlbiAtCisJCQkJCQkJCSB0Yi0+cmJ5dGVzKTsKKwkJCQkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJCQkJfQogCi0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCAwLCBpaCwgcl9ib2R5LCByX3plcm9zX251bWJlcik7CisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwgMCwgaWgsIHJfYm9keSwKKwkJCQkJCQkgICAgIHJfemVyb3NfbnVtYmVyKTsKIAotCQkgICAgLyogUmVwbGFjZSByaWdodCBkZWxpbWl0aW5nIGtleSBieSBmaXJzdCBrZXkgaW4gUlswXSAqLwotCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisJCQkJCS8qIFJlcGxhY2UgcmlnaHQgZGVsaW1pdGluZyBrZXkgYnkgZmlyc3Qga2V5IGluIFJbMF0gKi8KKwkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLAorCQkJCQkJICAgIHRiLT5SWzBdLCAwKTsKIAotCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNbMF0gKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgb2xkX2tleV9jb21wICk7Ci0JCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBvbGRfbGVuIC0gdGItPnJieXRlcyApOworCQkJCQkvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU1swXSAqLworCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsIG9sZF9rZXlfY29tcCk7CisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwKKwkJCQkJCQlvbGRfbGVuIC0gdGItPnJieXRlcyk7CiAKLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtPSB0Yi0+cmJ5dGVzOworCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gdGItPnJieXRlczsKIAotCQl9Ci0JCWVsc2UgLyogd2hvbGUgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCi0JCXsJCQkJCSAgCi0JCSAgICAvKiBTaGlmdCBybnVtWzBdLTEgaXRlbXMgdG8gUlswXSAqLwotCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0tMSx0Yi0+cmJ5dGVzKTsKLQkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIFJbMF0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiLT5SWzBdOwotCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdIC0gMSwgaWgsIGJvZHksIHplcm9zX251bSk7CisJCQkJfSBlbHNlIHsJLyogd2hvbGUgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCiAKLQkJICAgIGlmICggaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0gLSAxID09IDAgKSB7Ci0JCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKwkJCQkJLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIHRvIFJbMF0gKi8KKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLAorCQkJCQkJCSAgICAgdGItPnJudW1bMF0gLSAxLAorCQkJCQkJCSAgICAgdGItPnJieXRlcyk7CisJCQkJCS8qIEluc2VydCBuZXcgaXRlbSBpbnRvIFJbMF0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCSAgICBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksCisJCQkJCQkJICAgICBpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgICAgdGItPnJudW1bMF0gLSAxLAorCQkJCQkJCSAgICAgaWgsIGJvZHksCisJCQkJCQkJICAgICB6ZXJvc19udW0pOwogCi0JCSAgICB9Ci0JCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSAvKiBuZXcgaXRlbSBvciBwYXJ0IG9mIGl0IGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KLQkgICAgewotCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOwotCSAgICB9Ci0JICAgIGJyZWFrOworCQkJCQlpZiAoaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0gLSAxID09IDApIHsKKwkJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLAorCQkJCQkJCSAgICB0Yi0+cmtleVswXSwKKwkJCQkJCQkgICAgdGItPlJbMF0sIDApOwogCi0JY2FzZSBNX1BBU1RFOiAgIC8qIGFwcGVuZCBpdGVtICovCisJCQkJCX0KKwkJCQkJemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgewkvKiBuZXcgaXRlbSBvciBwYXJ0IG9mIGl0IGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KIAotCSAgICBpZiAoIG4gLSB0Yi0+cm51bVswXSA8PSBpdGVtX3BvcyApICAvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IG9mIGl0IGZhbGxzIHRvIFJbMF0gKi8KLQkgICAgewotCQlpZiAoIGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSAmJiB0Yi0+cmJ5dGVzICE9IC0xICkKLQkJeyAvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCi0JCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKQotCQkgICAgeyAvKiB3ZSBhcHBlbmQgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCWludCBlbnRyeV9jb3VudDsKLQotCQkJUkZBTFNFKCB6ZXJvc19udW0sCi0JCQkJIlBBUC0xMjE0NTogaW52YWxpZCBwYXJhbWV0ZXIgaW4gY2FzZSBvZiBhIGRpcmVjdG9yeSIpOwotCQkJZW50cnlfY291bnQgPSBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSk7Ci0JCQlpZiAoIGVudHJ5X2NvdW50IC0gdGItPnJieXRlcyA8IHBvc19pbl9pdGVtICkKLQkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gUlswXSAqLwotCQkJewotCQkJICAgIGludCBwYXN0ZV9lbnRyeV9wb3NpdGlvbjsKLQotCQkJICAgIFJGQUxTRSggdGItPnJieXRlcyAtIDEgPj0gZW50cnlfY291bnQgfHwgCi0JCQkJICAgICEgdGItPmluc2VydF9zaXplWzBdLAotCQkJCSAgICAiUEFQLTEyMTUwOiBubyBlbm91Z2ggb2YgZW50cmllcyB0byBzaGlmdCB0byBSWzBdOiByYnl0ZXM9JWQsIGVudHJ5X2NvdW50PSVkIiwKLQkJCQkgICAgdGItPnJieXRlcywgZW50cnlfY291bnQpOwotCQkJICAgIC8qIFNoaWZ0IHJudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgcmJ5dGVzLTEgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgcm51bVswXSAqLwotCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyAtIDEpOwotCQkJICAgIC8qIFBhc3RlIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLwotCQkJICAgIHBhc3RlX2VudHJ5X3Bvc2l0aW9uID0gcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHRiLT5yYnl0ZXMgLSAxOwotCQkJICAgIGJpLnRiID0gdGI7Ci0JCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKLQkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCAwLCBwYXN0ZV9lbnRyeV9wb3NpdGlvbiwKLQkJCQkJCSAgdGItPmluc2VydF9zaXplWzBdLGJvZHksemVyb3NfbnVtKTsKLQkJCSAgICAvKiBwYXN0ZSBlbnRyeSAqLwotCQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQkJYmkuYmlfYmgsIDAsIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLCAxLCAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCAKLQkJCQlib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJCSk7CQkJCQkJCQkKLQkJCQkJCQotCQkJICAgIGlmICggcGFzdGVfZW50cnlfcG9zaXRpb24gPT0gMCApIHsKLQkJCQkvKiBjaGFuZ2UgZGVsaW1pdGluZyBrZXlzICovCi0JCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7Ci0JCQkgICAgfQotCi0JCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJCSAgICBwb3NfaW5faXRlbSsrOworCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLCB0Yi0+cmJ5dGVzKTsKIAkJCX0KLQkJCWVsc2UgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCi0JCQl7Ci0JCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGVsc2UgLyogcmVndWxhciBvYmplY3QgKi8KLQkJICAgIHsKLQkJCWludCBuX3NoaWZ0LCBuX3JlbSwgcl96ZXJvc19udW1iZXI7Ci0JCQljb25zdCBjaGFyICogcl9ib2R5OworCQkJYnJlYWs7CiAKLQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLwotCQkJaWYgKCAobl9zaGlmdCA9IHRiLT5yYnl0ZXMgLSB0Yi0+aW5zZXJ0X3NpemVbMF0pIDwgMCApCi0JCQkgICAgbl9zaGlmdCA9IDA7CisJCWNhc2UgTV9QQVNURToJLyogYXBwZW5kIGl0ZW0gKi8KIAotCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpLAotCQkJICAgICAgICJQQVAtMTIxNTU6IGludmFsaWQgcG9zaXRpb24gdG8gcGFzdGUuIGloX2l0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zX2luX2l0ZW0sIGloX2l0ZW1fbGVuKCBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpOworCQkJaWYgKG4gLSB0Yi0+cm51bVswXSA8PSBpdGVtX3BvcykgewkvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IG9mIGl0IGZhbGxzIHRvIFJbMF0gKi8KKwkJCQlpZiAoaXRlbV9wb3MgPT0gbiAtIHRiLT5ybnVtWzBdICYmIHRiLT5yYnl0ZXMgIT0gLTEpIHsJLyogd2UgbXVzdCBzaGlmdCB0aGUgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSkgewkvKiB3ZSBhcHBlbmQgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCWludCBlbnRyeV9jb3VudDsKIAotCQkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSxuX3NoaWZ0KTsKLQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmRpbmcgdG8gUlswXSAqLwotCQkJaWYgKCAobl9yZW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gLSB0Yi0+cmJ5dGVzKSA8IDAgKQotCQkJICAgIG5fcmVtID0gMDsKLQkJCQotCQkJewotCQkJICBpbnQgdmVyc2lvbjsKLQkJCSAgdW5zaWduZWQgbG9uZyB0ZW1wX3JlbSA9IG5fcmVtOwotCQkJICAKLQkJCSAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKEJfTl9QSVRFTV9IRUFEICh0Yi0+UlswXSwwKSk7Ci0JCQkgIGlmIChpc19pbmRpcmVjdF9sZV9rZXkodmVyc2lvbixCX05fUEtFWSh0Yi0+UlswXSwwKSkpewotCQkJICAgICAgdGVtcF9yZW0gPSBuX3JlbSA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0KLQkJCQkJIFVORk1fUF9TSElGVCk7Ci0JCQkgIH0KLQkJCSAgc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkodGItPlJbMF0sMCksIAotCQkJCQkgICAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSh0Yi0+UlswXSwwKSkgKyB0ZW1wX3JlbSk7Ci0JCQkgIHNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sdGItPnJrZXlbMF0pLCAKLQkJCQkJICAgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSkpICsgdGVtcF9yZW0pOwotCQkJfQorCQkJCQkJUkZBTFNFKHplcm9zX251bSwKKwkJCQkJCSAgICAgICAiUEFQLTEyMTQ1OiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7CisJCQkJCQllbnRyeV9jb3VudCA9CisJCQkJCQkgICAgSV9FTlRSWV9DT1VOVChCX05fUElURU1fSEVBRAorCQkJCQkJCQkgICh0YlMwLAorCQkJCQkJCQkgICBpdGVtX3BvcykpOworCQkJCQkJaWYgKGVudHJ5X2NvdW50IC0gdGItPnJieXRlcyA8CisJCQkJCQkgICAgcG9zX2luX2l0ZW0pCisJCQkJCQkJLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIFJbMF0gKi8KKwkJCQkJCXsKKwkJCQkJCQlpbnQgcGFzdGVfZW50cnlfcG9zaXRpb247CisKKwkJCQkJCQlSRkFMU0UodGItPnJieXRlcyAtIDEgPj0KKwkJCQkJCQkgICAgICAgZW50cnlfY291bnQKKwkJCQkJCQkgICAgICAgfHwgIXRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICAgICJQQVAtMTIxNTA6IG5vIGVub3VnaCBvZiBlbnRyaWVzIHRvIHNoaWZ0IHRvIFJbMF06IHJieXRlcz0lZCwgZW50cnlfY291bnQ9JWQiLAorCQkJCQkJCSAgICAgICB0Yi0+cmJ5dGVzLAorCQkJCQkJCSAgICAgICBlbnRyeV9jb3VudCk7CisJCQkJCQkJLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCByYnl0ZXMtMSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBybnVtWzBdICovCisJCQkJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwKKwkJCQkJCQkJCSB0Yi0+CisJCQkJCQkJCQkgcm51bQorCQkJCQkJCQkJIFswXSwKKwkJCQkJCQkJCSB0Yi0+CisJCQkJCQkJCQkgcmJ5dGVzCisJCQkJCQkJCQkgLSAxKTsKKwkJCQkJCQkvKiBQYXN0ZSBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCQlwYXN0ZV9lbnRyeV9wb3NpdGlvbiA9CisJCQkJCQkJICAgIHBvc19pbl9pdGVtIC0KKwkJCQkJCQkgICAgZW50cnlfY291bnQgKworCQkJCQkJCSAgICB0Yi0+cmJ5dGVzIC0gMTsKKwkJCQkJCQliaS50YiA9IHRiOworCQkJCQkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQkJCQkJYmkuYmlfcGFyZW50ID0KKwkJCQkJCQkgICAgdGItPkZSWzBdOworCQkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCQkgICAgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uCisJCQkJCQkJICAgICh0YiwgMCk7CisJCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIKKwkJCQkJCQkgICAgKCZiaSwgMCwKKwkJCQkJCQkgICAgIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLAorCQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKwkJCQkJCQkvKiBwYXN0ZSBlbnRyeSAqLworCQkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS4KKwkJCQkJCQkJCSAgIGJpX2JoLAorCQkJCQkJCQkJICAgMCwKKwkJCQkJCQkJCSAgIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLAorCQkJCQkJCQkJICAgMSwKKwkJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCQkgICAgKikKKwkJCQkJCQkJCSAgIGJvZHksCisJCQkJCQkJCQkgICBib2R5CisJCQkJCQkJCQkgICArCisJCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCQkgICBbMF0KKwkJCQkJCQkgICAgKTsKKworCQkJCQkJCWlmIChwYXN0ZV9lbnRyeV9wb3NpdGlvbgorCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCS8qIGNoYW5nZSBkZWxpbWl0aW5nIGtleXMgKi8KKwkJCQkJCQkJcmVwbGFjZV9rZXkodGIsCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIENGUgorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgcmtleQorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgUgorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICAwKTsKKwkJCQkJCQl9CisKKwkJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQkJCXBvc19pbl9pdGVtKys7CisJCQkJCQl9IGVsc2UgewkvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KKworCQkJCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsCisJCQkJCQkJCQkgdGItPgorCQkJCQkJCQkJIHJudW0KKwkJCQkJCQkJCSBbMF0sCisJCQkJCQkJCQkgdGItPgorCQkJCQkJCQkJIHJieXRlcyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8qIHJlZ3VsYXIgb2JqZWN0ICovCisKKwkJCQkJCWludCBuX3NoaWZ0LCBuX3JlbSwKKwkJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJCWNvbnN0IGNoYXIgKnJfYm9keTsKKworCQkJCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCisJCQkJCQlpZiAoKG5fc2hpZnQgPQorCQkJCQkJICAgICB0Yi0+cmJ5dGVzIC0KKwkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdKSA8IDApCisJCQkJCQkJbl9zaGlmdCA9IDA7CisKKwkJCQkJCVJGQUxTRShwb3NfaW5faXRlbSAhPQorCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJKHRiUzAsIGl0ZW1fcG9zKSksCisJCQkJCQkgICAgICAgIlBBUC0xMjE1NTogaW52YWxpZCBwb3NpdGlvbiB0byBwYXN0ZS4gaWhfaXRlbV9sZW49JWQsIHBvc19pbl9pdGVtPSVkIiwKKwkJCQkJCSAgICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbgorCQkJCQkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSh0YlMwLCBpdGVtX3BvcykpKTsKKworCQkJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwKKwkJCQkJCQkJIHRiLT5ybnVtWzBdLAorCQkJCQkJCQkgbl9zaGlmdCk7CisJCQkJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgcmVtYWluIGluIGJvZHkgYWZ0ZXIgYXBwZW5kaW5nIHRvIFJbMF0gKi8KKwkJCQkJCWlmICgobl9yZW0gPQorCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLQorCQkJCQkJICAgICB0Yi0+cmJ5dGVzKSA8IDApCisJCQkJCQkJbl9yZW0gPSAwOworCisJCQkJCQl7CisJCQkJCQkJaW50IHZlcnNpb247CisJCQkJCQkJdW5zaWduZWQgbG9uZyB0ZW1wX3JlbSA9CisJCQkJCQkJICAgIG5fcmVtOworCisJCQkJCQkJdmVyc2lvbiA9CisJCQkJCQkJICAgIGloX3ZlcnNpb24KKwkJCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJICAgICAodGItPlJbMF0sIDApKTsKKwkJCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfa2V5CisJCQkJCQkJICAgICh2ZXJzaW9uLAorCQkJCQkJCSAgICAgQl9OX1BLRVkodGItPlJbMF0sCisJCQkJCQkJCSAgICAgIDApKSkgeworCQkJCQkJCQl0ZW1wX3JlbSA9CisJCQkJCQkJCSAgICBuX3JlbSA8PAorCQkJCQkJCQkgICAgKHRiLT50Yl9zYi0+CisJCQkJCQkJCSAgICAgc19ibG9ja3NpemVfYml0cworCQkJCQkJCQkgICAgIC0KKwkJCQkJCQkJICAgICBVTkZNX1BfU0hJRlQpOworCQkJCQkJCX0KKwkJCQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJICAgICh2ZXJzaW9uLAorCQkJCQkJCSAgICAgQl9OX1BLRVkodGItPlJbMF0sCisJCQkJCQkJCSAgICAgIDApLAorCQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJICAgICAodmVyc2lvbiwKKwkJCQkJCQkgICAgICBCX05fUEtFWSh0Yi0+UlswXSwKKwkJCQkJCQkJICAgICAgIDApKSArCisJCQkJCQkJICAgICB0ZW1wX3JlbSk7CisJCQkJCQkJc2V0X2xlX2tleV9rX29mZnNldAorCQkJCQkJCSAgICAodmVyc2lvbiwKKwkJCQkJCQkgICAgIEJfTl9QREVMSU1fS0VZKHRiLT4KKwkJCQkJCQkJCSAgICBDRlIKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIHJrZXkKKwkJCQkJCQkJCSAgICBbMF0pLAorCQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJICAgICAodmVyc2lvbiwKKwkJCQkJCQkgICAgICBCX05fUERFTElNX0tFWQorCQkJCQkJCSAgICAgICh0Yi0+Q0ZSWzBdLAorCQkJCQkJCSAgICAgICB0Yi0+cmtleVswXSkpICsKKwkJCQkJCQkgICAgIHRlbXBfcmVtKTsKKwkJCQkJCX0KIC8qCQkgIGtfb2Zmc2V0IChCX05fUEtFWSh0Yi0+UlswXSwwKSkgKz0gbl9yZW07CiAJCSAga19vZmZzZXQgKEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sdGItPnJrZXlbMF0pKSArPSBuX3JlbTsqLwotCQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGUlswXSwgMCk7CisJCQkJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkKKwkJCQkJCSAgICAodGIsIHRiLT5DRlJbMF0sIDApOwogCi0JCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gUlswXSAqLwotCQkJYmkudGIgPSB0YjsKLQkJCWJpLmJpX2JoID0gdGItPlJbMF07Ci0JCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkJaWYgKCBuX3JlbSA+IHplcm9zX251bSApIHsKLQkJCSAgICByX3plcm9zX251bWJlciA9IDA7Ci0JCQkgICAgcl9ib2R5ID0gYm9keSArIG5fcmVtIC0gemVyb3NfbnVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgICAgcl9ib2R5ID0gYm9keTsKLQkJCSAgICByX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIG5fcmVtOwotCQkJICAgIHplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKLQkJCX0KKwkJCQkJCS8qIEFwcGVuZCBwYXJ0IG9mIGJvZHkgaW50byBSWzBdICovCisJCQkJCQliaS50YiA9IHRiOworCQkJCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCSAgICBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24KKwkJCQkJCSAgICAodGIsIDApOworCQkJCQkJaWYgKG5fcmVtID4gemVyb3NfbnVtKSB7CisJCQkJCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJCQkJCXJfYm9keSA9CisJCQkJCQkJICAgIGJvZHkgKyBuX3JlbSAtCisJCQkJCQkJICAgIHplcm9zX251bTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcl9ib2R5ID0gYm9keTsKKwkJCQkJCQlyX3plcm9zX251bWJlciA9CisJCQkJCQkJICAgIHplcm9zX251bSAtIG5fcmVtOworCQkJCQkJCXplcm9zX251bSAtPQorCQkJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJCX0KIAotCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLCBuX3NoaWZ0LCB0Yi0+aW5zZXJ0X3NpemVbMF0gLSBuX3JlbSwgcl9ib2R5LCByX3plcm9zX251bWJlcik7CisJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIDAsCisJCQkJCQkJCSAgICAgbl9zaGlmdCwKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICBbMF0gLQorCQkJCQkJCQkgICAgIG5fcmVtLAorCQkJCQkJCQkgICAgIHJfYm9keSwKKwkJCQkJCQkJICAgICByX3plcm9zX251bWJlcik7CiAKLQkJCWlmIChpc19pbmRpcmVjdF9sZV9paCAoQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sMCkpKSB7CisJCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgKKwkJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCSAgICAgKHRiLT5SWzBdLCAwKSkpIHsKICNpZiAwCi0JCQkgICAgUkZBTFNFKCBuX3JlbSwKLQkJCQkgICAgIlBBUC0xMjE2MDogcGFzdGUgbW9yZSB0aGFuIG9uZSB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIiKTsKKwkJCQkJCQlSRkFMU0Uobl9yZW0sCisJCQkJCQkJICAgICAgICJQQVAtMTIxNjA6IHBhc3RlIG1vcmUgdGhhbiBvbmUgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIik7CiAjZW5kaWYKLQkJCSAgICBzZXRfaWhfZnJlZV9zcGFjZSAoQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sMCksIDApOwotCQkJfQotCQkJdGItPmluc2VydF9zaXplWzBdID0gbl9yZW07Ci0JCQlpZiAoICEgbl9yZW0gKQotCQkJICAgIHBvc19pbl9pdGVtICsrOwotCQkgICAgfQotCQl9Ci0JCWVsc2UgLyogcGFzdGVkIGl0ZW0gaW4gd2hvbGUgZmFsbHMgaW50byBSWzBdICovCi0JCXsKLQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7CisJCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UKKwkJCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJICAgICAodGItPlJbMF0sIDApLCAwKTsKKwkJCQkJCX0KKwkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOworCQkJCQkJaWYgKCFuX3JlbSkKKwkJCQkJCQlwb3NfaW5faXRlbSsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogcGFzdGVkIGl0ZW0gaW4gd2hvbGUgZmFsbHMgaW50byBSWzBdICovCiAKLQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOwotCQkgICAgLyogYXBwZW5kIGl0ZW0gaW4gUlswXSAqLwotCQkgICAgaWYgKCBwb3NfaW5faXRlbSA+PSAwICkgeworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICpwYXN0ZWQ7CisKKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSwKKwkJCQkJCQkgICAgIHRiLT5yYnl0ZXMpOworCQkJCQkvKiBhcHBlbmQgaXRlbSBpbiBSWzBdICovCisJCQkJCWlmIChwb3NfaW5faXRlbSA+PSAwKSB7CisJCQkJCQliaS50YiA9IHRiOworCQkJCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCSAgICBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24KKwkJCQkJCSAgICAodGIsIDApOworCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLAorCQkJCQkJCQkgICAgIGl0ZW1fcG9zIC0KKwkJCQkJCQkJICAgICBuICsKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgcm51bVswXSwKKwkJCQkJCQkJICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICBbMF0sIGJvZHksCisJCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKwkJCQkJfQorCisJCQkJCS8qIHBhc3RlIG5ldyBlbnRyeSwgaWYgaXRlbSBpcyBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQlwYXN0ZWQgPQorCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sCisJCQkJCQkJICAgaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICB0Yi0+cm51bVswXSk7CisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChwYXN0ZWQpCisJCQkJCSAgICAmJiBwb3NfaW5faXRlbSA+PSAwKSB7CisJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuYmlfYmgsCisJCQkJCQkJCSAgIGl0ZW1fcG9zIC0KKwkJCQkJCQkJICAgbiArCisJCQkJCQkJCSAgIHRiLT5ybnVtWzBdLAorCQkJCQkJCQkgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgMSwKKwkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkgICAgKilib2R5LAorCQkJCQkJCQkgICBib2R5ICsKKwkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgWzBdCisJCQkJCQkgICAgKTsKKwkJCQkJCWlmICghcG9zX2luX2l0ZW0pIHsKKworCQkJCQkJCVJGQUxTRShpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgICAgICB0Yi0+cm51bVswXSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjE2NTogZGlyZWN0b3J5IGl0ZW0gbXVzdCBiZSBmaXJzdCBpdGVtIG9mIG5vZGUgd2hlbiBwYXN0aW5nIGlzIGluIDB0aCBwb3NpdGlvbiIpOworCisJCQkJCQkJLyogdXBkYXRlIGRlbGltaXRpbmcga2V5cyAqLworCQkJCQkJCXJlcGxhY2Vfa2V5KHRiLAorCQkJCQkJCQkgICAgdGItPkNGUlswXSwKKwkJCQkJCQkJICAgIHRiLT5ya2V5WzBdLAorCQkJCQkJCQkgICAgdGItPlJbMF0sCisJCQkJCQkJCSAgICAwKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChwYXN0ZWQpKQorCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UocGFzdGVkLCAwKTsKKwkJCQkJemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgewkvKiBuZXcgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCisKKwkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSwgdGItPnJieXRlcyk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogY2FzZXMgZCBhbmQgdCAqLworCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTEyMTc1OiBiYWxhbmNlX2xlYWY6IHJudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCQkgICAgICAgKGZsYWcgPT0KKwkJCQkJTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0KKwkJCQkJCQkJIE1fQ1VUKSA/ICJDVVQiCisJCQkJCQkJCTogIlVOS05PV04iKSwKKwkJCQkgICAgICAgZmxhZyk7CisJCX0KKworCX0KKworCS8qIHRiLT5ybnVtWzBdID4gMCAqLworCVJGQUxTRSh0Yi0+YmxrbnVtWzBdID4gMywKKwkgICAgICAgIlBBUC0xMjE4MDogYmxrbnVtIGNhbiBub3QgYmUgJWQuIEl0IG11c3QgYmUgPD0gMyIsCisJICAgICAgIHRiLT5ibGtudW1bMF0pOworCVJGQUxTRSh0Yi0+YmxrbnVtWzBdIDwgMCwKKwkgICAgICAgIlBBUC0xMjE4NTogYmxrbnVtIGNhbiBub3QgYmUgJWQuIEl0IG11c3QgYmUgPj0gMCIsCisJICAgICAgIHRiLT5ibGtudW1bMF0pOworCisJLyogaWYgd2hpbGUgYWRkaW5nIHRvIGEgbm9kZSB3ZSBkaXNjb3ZlciB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHNwbGl0CisJICAgaXQgaW4gdHdvLCBhbmQgbWVyZ2UgdGhlIGxlZnQgcGFydCBpbnRvIHRoZSBsZWZ0IG5laWdoYm9yIGFuZCB0aGUKKwkgICByaWdodCBwYXJ0IGludG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBlbGltaW5hdGluZyB0aGUgbm9kZSAqLworCWlmICh0Yi0+YmxrbnVtWzBdID09IDApIHsJLyogbm9kZSBTWzBdIGlzIGVtcHR5IG5vdyAqLworCisJCVJGQUxTRSghdGItPmxudW1bMF0gfHwgIXRiLT5ybnVtWzBdLAorCQkgICAgICAgIlBBUC0xMjE5MDogbG51bSBhbmQgcm51bSBtdXN0IG5vdCBiZSB6ZXJvIik7CisJCS8qIGlmIGluc2VydGlvbiB3YXMgZG9uZSBiZWZvcmUgMC10aCBwb3NpdGlvbiBpbiBSWzBdLCByaWdodAorCQkgICBkZWxpbWl0aW5nIGtleSBvZiB0aGUgdGItPkxbMF0ncyBhbmQgbGVmdCBkZWxpbWl0aW5nIGtleSBhcmUKKwkJICAgbm90IHNldCBjb3JyZWN0bHkgKi8KKwkJaWYgKHRiLT5DRkxbMF0pIHsKKwkJCWlmICghdGItPkNGUlswXSkKKwkJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJCSAgICAgICAidnMtMTIxOTU6IGJhbGFuY2VfbGVhZjogQ0ZSIG5vdCBpbml0aWFsaXplZCIpOworCQkJY29weV9rZXkoQl9OX1BERUxJTV9LRVkodGItPkNGTFswXSwgdGItPmxrZXlbMF0pLAorCQkJCSBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpOworCQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCB0Yi0+Q0ZMWzBdLCAwKTsKKwkJfQorCisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmlsbCBuZXcgbm9kZXMgdGhhdCBhcHBlYXIgaW4gcGxhY2Ugb2YgU1swXSAqLworCisJLyogSSBhbSB0b2xkIHRoYXQgdGhpcyBjb3B5aW5nIGlzIGJlY2F1c2Ugd2UgbmVlZCBhbiBhcnJheSB0byBlbmFibGUKKwkgICB0aGUgbG9vcGluZyBjb2RlLiAtSGFucyAqLworCXNudW1bMF0gPSB0Yi0+czFudW0sIHNudW1bMV0gPSB0Yi0+czJudW07CisJc2J5dGVzWzBdID0gdGItPnMxYnl0ZXM7CisJc2J5dGVzWzFdID0gdGItPnMyYnl0ZXM7CisJZm9yIChpID0gdGItPmJsa251bVswXSAtIDI7IGkgPj0gMDsgaS0tKSB7CisKKwkJUkZBTFNFKCFzbnVtW2ldLCAiUEFQLTEyMjAwOiBzbnVtWyVkXSA9PSAlZC4gTXVzdCBiZSA+IDAiLCBpLAorCQkgICAgICAgc251bVtpXSk7CisKKwkJLyogaGVyZSB3ZSBzaGlmdCBmcm9tIFMgdG8gU19uZXcgbm9kZXMgKi8KKworCQlTX25ld1tpXSA9IGdldF9GRUIodGIpOworCisJCS8qIGluaXRpYWxpemVkIGJsb2NrIHR5cGUgYW5kIHRyZWUgbGV2ZWwgKi8KKwkJc2V0X2Jsa2hfbGV2ZWwoQl9CTEtfSEVBRChTX25ld1tpXSksIERJU0tfTEVBRl9OT0RFX0xFVkVMKTsKKworCQluID0gQl9OUl9JVEVNUyh0YlMwKTsKKworCQlzd2l0Y2ggKGZsYWcpIHsKKwkJY2FzZSBNX0lOU0VSVDoJLyogaW5zZXJ0IGl0ZW0gKi8KKworCQkJaWYgKG4gLSBzbnVtW2ldIDwgaXRlbV9wb3MpIHsJLyogbmV3IGl0ZW0gb3IgaXQncyBwYXJ0IGZhbGxzIHRvIGZpcnN0IG5ldyBub2RlIFNfbmV3W2ldICovCisJCQkJaWYgKGl0ZW1fcG9zID09IG4gLSBzbnVtW2ldICsgMSAmJiBzYnl0ZXNbaV0gIT0gLTEpIHsJLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIFNfbmV3W2ldICovCisJCQkJCWludCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sCisJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJY29uc3QgY2hhciAqcl9ib2R5OworCQkJCQlpbnQgdmVyc2lvbjsKKworCQkJCQkvKiBNb3ZlIHNudW1baV0tMSBpdGVtcyBmcm9tIFNbMF0gdG8gU19uZXdbaV0gKi8KKwkJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLAorCQkJCQkJCXNudW1baV0gLSAxLCAtMSwKKwkJCQkJCQlTX25ld1tpXSk7CisJCQkJCS8qIFJlbWVtYmVyIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoICovCisJCQkJCXZlcnNpb24gPSBpaF92ZXJzaW9uKGloKTsKKwkJCQkJb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoaWgpOworCQkJCQlvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOworCisJCQkJCS8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTX25ld1tpXSAqLworCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsCisJCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCQkgICAoKG9sZF9sZW4gLQorCQkJCQkJCSAgICAgc2J5dGVzW2ldKSA8PAorCQkJCQkJCSAgICAoaXNfaW5kaXJlY3RfbGVfaWgKKwkJCQkJCQkgICAgIChpaCkgPyB0Yi0+dGJfc2ItPgorCQkJCQkJCSAgICAgc19ibG9ja3NpemVfYml0cyAtCisJCQkJCQkJICAgICBVTkZNX1BfU0hJRlQgOgorCQkJCQkJCSAgICAgMCkpKTsKKworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsIHNieXRlc1tpXSk7CisKKwkJCQkJLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBTX25ld1tpXSBiZWZvcmUgMC10aCBpdGVtICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKworCQkJCQlpZiAoKG9sZF9sZW4gLSBzYnl0ZXNbaV0pID4gemVyb3NfbnVtKSB7CisJCQkJCQlyX3plcm9zX251bWJlciA9IDA7CisJCQkJCQlyX2JvZHkgPQorCQkJCQkJICAgIGJvZHkgKyAob2xkX2xlbiAtCisJCQkJCQkJICAgIHNieXRlc1tpXSkgLQorCQkJCQkJICAgIHplcm9zX251bTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJfYm9keSA9IGJvZHk7CisJCQkJCQlyX3plcm9zX251bWJlciA9CisJCQkJCQkgICAgemVyb3NfbnVtIC0gKG9sZF9sZW4gLQorCQkJCQkJCQkgc2J5dGVzW2ldKTsKKwkJCQkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJCQkJfQorCisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwgMCwgaWgsIHJfYm9keSwKKwkJCQkJCQkgICAgIHJfemVyb3NfbnVtYmVyKTsKKworCQkJCQkvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU1tpXSAqLworCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsIG9sZF9rZXlfY29tcCk7CisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwKKwkJCQkJCQlvbGRfbGVuIC0gc2J5dGVzW2ldKTsKKwkJCQkJdGItPmluc2VydF9zaXplWzBdIC09IHNieXRlc1tpXTsKKwkJCQl9IGVsc2UgewkvKiB3aG9sZSBuZXcgaXRlbSBmYWxscyBpbnRvIFNfbmV3W2ldICovCisKKwkJCQkJLyogU2hpZnQgc251bVswXSAtIDEgaXRlbXMgdG8gU19uZXdbaV0gKHNieXRlc1tpXSBvZiBzcGxpdCBpdGVtKSAqLworCQkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsCisJCQkJCQkJc251bVtpXSAtIDEsIHNieXRlc1tpXSwKKwkJCQkJCQlTX25ld1tpXSk7CisKKwkJCQkJLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gU19uZXdbaV0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksCisJCQkJCQkJICAgICBpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgICAgc251bVtpXSAtIDEsIGloLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKworCQkJCQl6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJZWxzZSB7CS8qIG5ldyBpdGVtIG9yIGl0IHBhcnQgZG9uJ3QgZmFsbHMgaW50byBTX25ld1tpXSAqLworCisJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLAorCQkJCQkJc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1fUEFTVEU6CS8qIGFwcGVuZCBpdGVtICovCisKKwkJCWlmIChuIC0gc251bVtpXSA8PSBpdGVtX3BvcykgewkvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IGlmIGl0IGZhbGxzIHRvIFNfbmV3W2ldICovCisJCQkJaWYgKGl0ZW1fcG9zID09IG4gLSBzbnVtW2ldICYmIHNieXRlc1tpXSAhPSAtMSkgewkvKiB3ZSBtdXN0IHNoaWZ0IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJCQkJc3RydWN0IGl0ZW1faGVhZCAqYXV4X2loOworCisJCQkJCVJGQUxTRShpaCwgIlBBUC0xMjIxMDogaWggbXVzdCBiZSAwIik7CisKKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loCisJCQkJCSAgICAoYXV4X2loID0KKwkJCQkJICAgICBCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKSB7CisJCQkJCQkvKiB3ZSBhcHBlbmQgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKworCQkJCQkJaW50IGVudHJ5X2NvdW50OworCisJCQkJCQllbnRyeV9jb3VudCA9CisJCQkJCQkgICAgaWhfZW50cnlfY291bnQoYXV4X2loKTsKKworCQkJCQkJaWYgKGVudHJ5X2NvdW50IC0gc2J5dGVzW2ldIDwKKwkJCQkJCSAgICBwb3NfaW5faXRlbQorCQkJCQkJICAgICYmIHBvc19pbl9pdGVtIDw9CisJCQkJCQkgICAgZW50cnlfY291bnQpIHsKKwkJCQkJCQkvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gU19uZXdbaV0gKi8KKworCQkJCQkJCVJGQUxTRSghdGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjIxNTogaW5zZXJ0X3NpemUgaXMgYWxyZWFkeSAwIik7CisJCQkJCQkJUkZBTFNFKHNieXRlc1tpXSAtIDEgPj0KKwkJCQkJCQkgICAgICAgZW50cnlfY291bnQsCisJCQkJCQkJICAgICAgICJQQVAtMTIyMjA6IHRoZXJlIGFyZSBubyBzbyBtdWNoIGVudHJpZXMgKCVkKSwgb25seSAlZCIsCisJCQkJCQkJICAgICAgIHNieXRlc1tpXSAtIDEsCisJCQkJCQkJICAgICAgIGVudHJ5X2NvdW50KTsKKworCQkJCQkJCS8qIFNoaWZ0IHNudW1baV0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgc2J5dGVzW2ldIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIHNudW1baV0gKi8KKwkJCQkJCQlsZWFmX21vdmVfaXRlbXMKKwkJCQkJCQkgICAgKExFQUZfRlJPTV9TX1RPX1NORVcsCisJCQkJCQkJICAgICB0Yiwgc251bVtpXSwKKwkJCQkJCQkgICAgIHNieXRlc1tpXSAtIDEsCisJCQkJCQkJICAgICBTX25ld1tpXSk7CisJCQkJCQkJLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJCQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkJCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCQkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyCisJCQkJCQkJICAgICgmYmksIDAsCisJCQkJCQkJICAgICBwb3NfaW5faXRlbSAtCisJCQkJCQkJICAgICBlbnRyeV9jb3VudCArCisJCQkJCQkJICAgICBzYnl0ZXNbaV0gLSAxLAorCQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKwkJCQkJCQkvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5ICovCisJCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLgorCQkJCQkJCQkJICAgYmlfYmgsCisJCQkJCQkJCQkgICAwLAorCQkJCQkJCQkJICAgcG9zX2luX2l0ZW0KKwkJCQkJCQkJCSAgIC0KKwkJCQkJCQkJCSAgIGVudHJ5X2NvdW50CisJCQkJCQkJCQkgICArCisJCQkJCQkJCQkgICBzYnl0ZXMKKwkJCQkJCQkJCSAgIFtpXSAtCisJCQkJCQkJCQkgICAxLCAxLAorCQkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJCSAgICAqKQorCQkJCQkJCQkJICAgYm9keSwKKwkJCQkJCQkJCSAgIGJvZHkKKwkJCQkJCQkJCSAgICsKKwkJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJCSAgIFswXQorCQkJCQkJCSAgICApOworCQkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCQkJcG9zX2luX2l0ZW0rKzsKKwkJCQkJCX0gZWxzZSB7CS8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZG9lc24ndCBmYWxsIGludG8gU19uZXdbaV0gKi8KKwkJCQkJCQlsZWFmX21vdmVfaXRlbXMKKwkJCQkJCQkgICAgKExFQUZfRlJPTV9TX1RPX1NORVcsCisJCQkJCQkJICAgICB0Yiwgc251bVtpXSwKKwkJCQkJCQkgICAgIHNieXRlc1tpXSwKKwkJCQkJCQkgICAgIFNfbmV3W2ldKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLyogcmVndWxhciBvYmplY3QgKi8KKworCQkJCQkJaW50IG5fc2hpZnQsIG5fcmVtLAorCQkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQkJY29uc3QgY2hhciAqcl9ib2R5OworCisJCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0gIT0KKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbgorCQkJCQkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSh0YlMwLCBpdGVtX3BvcykpCisJCQkJCQkgICAgICAgfHwgdGItPmluc2VydF9zaXplWzBdIDw9CisJCQkJCQkgICAgICAgMCwKKwkJCQkJCSAgICAgICAiUEFQLTEyMjI1OiBpdGVtIHRvbyBzaG9ydCBvciBpbnNlcnRfc2l6ZSA8PSAwIik7CisKKwkJCQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLworCQkJCQkJbl9zaGlmdCA9CisJCQkJCQkgICAgc2J5dGVzW2ldIC0KKwkJCQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF07CisJCQkJCQlpZiAobl9zaGlmdCA8IDApCisJCQkJCQkJbl9zaGlmdCA9IDA7CisJCQkJCQlsZWFmX21vdmVfaXRlbXMKKwkJCQkJCSAgICAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsCisJCQkJCQkgICAgIHNudW1baV0sIG5fc2hpZnQsCisJCQkJCQkgICAgIFNfbmV3W2ldKTsKKworCQkJCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IHJlbWFpbiBpbiBib2R5IGFmdGVyIGFwcGVuZCB0byBTX25ld1tpXSAqLworCQkJCQkJbl9yZW0gPQorCQkJCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtCisJCQkJCQkgICAgc2J5dGVzW2ldOworCQkJCQkJaWYgKG5fcmVtIDwgMCkKKwkJCQkJCQluX3JlbSA9IDA7CisJCQkJCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gU19uZXdbMF0gKi8KKwkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKworCQkJCQkJaWYgKG5fcmVtID4gemVyb3NfbnVtKSB7CisJCQkJCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJCQkJCXJfYm9keSA9CisJCQkJCQkJICAgIGJvZHkgKyBuX3JlbSAtCisJCQkJCQkJICAgIHplcm9zX251bTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcl9ib2R5ID0gYm9keTsKKwkJCQkJCQlyX3plcm9zX251bWJlciA9CisJCQkJCQkJICAgIHplcm9zX251bSAtIG5fcmVtOworCQkJCQkJCXplcm9zX251bSAtPQorCQkJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJCX0KKworCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLAorCQkJCQkJCQkgICAgIG5fc2hpZnQsCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgWzBdIC0KKwkJCQkJCQkJICAgICBuX3JlbSwKKwkJCQkJCQkJICAgICByX2JvZHksCisJCQkJCQkJCSAgICAgcl96ZXJvc19udW1iZXIpOworCQkJCQkJeworCQkJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKnRtcDsKKworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKFNfbmV3CisJCQkJCQkJCQkgICBbaV0sCisJCQkJCQkJCQkgICAwKTsKKwkJCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgKKwkJCQkJCQkgICAgKHRtcCkpIHsKKwkJCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UKKwkJCQkJCQkJICAgICh0bXAsIDApOworCQkJCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQKKwkJCQkJCQkJICAgICh0bXAsCisJCQkJCQkJCSAgICAgbGVfaWhfa19vZmZzZXQKKwkJCQkJCQkJICAgICAodG1wKSArCisJCQkJCQkJCSAgICAgKG5fcmVtIDw8CisJCQkJCQkJCSAgICAgICh0Yi0+CisJCQkJCQkJCSAgICAgICB0Yl9zYi0+CisJCQkJCQkJCSAgICAgICBzX2Jsb2Nrc2l6ZV9iaXRzCisJCQkJCQkJCSAgICAgICAtCisJCQkJCQkJCSAgICAgICBVTkZNX1BfU0hJRlQpKSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0CisJCQkJCQkJCSAgICAodG1wLAorCQkJCQkJCQkgICAgIGxlX2loX2tfb2Zmc2V0CisJCQkJCQkJCSAgICAgKHRtcCkgKworCQkJCQkJCQkgICAgIG5fcmVtKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOworCQkJCQkJaWYgKCFuX3JlbSkKKwkJCQkJCQlwb3NfaW5faXRlbSsrOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCS8qIGl0ZW0gZmFsbHMgd2hvbGx5IGludG8gU19uZXdbaV0gKi8KKwkJCQl7CisJCQkJCWludCByZXRfdmFsOworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICpwYXN0ZWQ7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJCQkJc3RydWN0IGl0ZW1faGVhZCAqaWggPQorCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpOworCisJCQkJCWlmICghaXNfZGlyZW50cnlfbGVfaWgoaWgpCisJCQkJCSAgICAmJiAocG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oaWgpCisJCQkJCQl8fCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCkpCisJCQkJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJCQkJICAgICAgICJQQVAtMTIyMzU6IGJhbGFuY2VfbGVhZjogcG9zX2luX2l0ZW0gbXVzdCBiZSBlcXVhbCB0byBpaF9pdGVtX2xlbiIpOworI2VuZGlmCQkJCS8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1NORVcsCisJCQkJCQkJICAgIHRiLCBzbnVtW2ldLAorCQkJCQkJCSAgICBzYnl0ZXNbaV0sCisJCQkJCQkJICAgIFNfbmV3W2ldKTsKKworCQkJCQlSRkFMU0UocmV0X3ZhbCwKKwkJCQkJICAgICAgICJQQVAtMTIyNDA6IHVuZXhwZWN0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgbGVhZl9tb3ZlX2l0ZW1zICglZCkiLAorCQkJCQkgICAgICAgcmV0X3ZhbCk7CisKKwkJCQkJLyogcGFzdGUgaW50byBpdGVtICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKwkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLAorCQkJCQkJCSAgICAgaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICAgIHNudW1baV0sCisJCQkJCQkJICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisKKwkJCQkJcGFzdGVkID0KKwkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKFNfbmV3W2ldLAorCQkJCQkJCSAgIGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgc251bVtpXSk7CisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChwYXN0ZWQpKSB7CisJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuYmlfYmgsCisJCQkJCQkJCSAgIGl0ZW1fcG9zIC0KKwkJCQkJCQkJICAgbiArIHNudW1baV0sCisJCQkJCQkJCSAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAxLAorCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCSAgICAqKWJvZHksCisJCQkJCQkJCSAgIGJvZHkgKworCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICBbMF0KKwkJCQkJCSAgICApOworCQkJCQl9CisKKwkJCQkJLyogaWYgd2UgcGFzdGUgdG8gaW5kaXJlY3QgaXRlbSB1cGRhdGUgaWhfZnJlZV9zcGFjZSAqLworCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocGFzdGVkKSkKKwkJCQkJCXNldF9paF9mcmVlX3NwYWNlKHBhc3RlZCwgMCk7CisJCQkJCXplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJfQorCQkJfQorCisJCQllbHNlIHsJLyogcGFzdGVkIGl0ZW0gZG9lc24ndCBmYWxsIGludG8gU19uZXdbaV0gKi8KKworCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19TTkVXLCB0YiwKKwkJCQkJCXNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIGNhc2VzIGQgYW5kIHQgKi8KKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC0xMjI0NTogYmFsYW5jZV9sZWFmOiBibGtudW0gPiAyOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCQkgICAgICAgKGZsYWcgPT0KKwkJCQkJTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0KKwkJCQkJCQkJIE1fQ1VUKSA/ICJDVVQiCisJCQkJCQkJCTogIlVOS05PV04iKSwKKwkJCQkgICAgICAgZmxhZyk7CisJCX0KKworCQltZW1jcHkoaW5zZXJ0X2tleSArIGksIEJfTl9QS0VZKFNfbmV3W2ldLCAwKSwgS0VZX1NJWkUpOworCQlpbnNlcnRfcHRyW2ldID0gU19uZXdbaV07CisKKwkJUkZBTFNFKCFidWZmZXJfam91cm5hbGVkKFNfbmV3W2ldKQorCQkgICAgICAgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoU19uZXdbaV0pCisJCSAgICAgICB8fCBidWZmZXJfZGlydHkoU19uZXdbaV0pLCAiUEFQLTEyMjQ3OiBTX25ld1slZF0gOiAoJWIpIiwKKwkJICAgICAgIGksIFNfbmV3W2ldKTsKKwl9CisKKwkvKiBpZiB0aGUgYWZmZWN0ZWQgaXRlbSB3YXMgbm90IHdob2xseSBzaGlmdGVkIHRoZW4gd2UgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgb24gdGhhdCBwYXJ0IG9yIHdob2xlIG9mIHRoZQorCSAgIGFmZmVjdGVkIGl0ZW0gd2hpY2ggcmVtYWlucyBpbiBTICovCisJaWYgKDAgPD0gaXRlbV9wb3MgJiYgaXRlbV9wb3MgPCB0Yi0+czBudW0pIHsJLyogaWYgd2UgbXVzdCBpbnNlcnQgb3IgYXBwZW5kIGludG8gYnVmZmVyIFNbMF0gKi8KKworCQlzd2l0Y2ggKGZsYWcpIHsKKwkJY2FzZSBNX0lOU0VSVDoJLyogaW5zZXJ0IGl0ZW0gaW50byBTWzBdICovCiAJCQliaS50YiA9IHRiOwotCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKLQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0sIHBvc19pbl9pdGVtLAotCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSxib2R5LCB6ZXJvc19udW0pOwotCQkgICAgfQorCQkJYmkuYmlfYmggPSB0YlMwOworCQkJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQkJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpOworCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLCBpdGVtX3BvcywgaWgsIGJvZHksCisJCQkJCSAgICAgemVyb3NfbnVtKTsKIAotCQkgICAgLyogcGFzdGUgbmV3IGVudHJ5LCBpZiBpdGVtIGlzIGRpcmVjdG9yeSBpdGVtICovCi0JCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCh0Yi0+UlswXSwgaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0pOwotCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpICYmIHBvc19pbl9pdGVtID49IDAgKSB7Ci0JCQlsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJICAgIGJpLmJpX2JoLCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSwgcG9zX2luX2l0ZW0sIDEsIAotCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkgICAgKTsKLQkJCWlmICggISBwb3NfaW5faXRlbSApIHsKKwkJCS8qIElmIHdlIGluc2VydCB0aGUgZmlyc3Qga2V5IGNoYW5nZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KKwkJCWlmIChpdGVtX3BvcyA9PSAwKSB7CisJCQkJaWYgKHRiLT5DRkxbMF0pCS8qIGNhbiBiZSAwIGluIHJlaXNlcmZzY2sgKi8KKwkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLAorCQkJCQkJICAgIHRiUzAsIDApOwogCi0JCQkgICAgUkZBTFNFKCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSwKLQkJCQkgICAgIlBBUC0xMjE2NTogZGlyZWN0b3J5IGl0ZW0gbXVzdCBiZSBmaXJzdCBpdGVtIG9mIG5vZGUgd2hlbiBwYXN0aW5nIGlzIGluIDB0aCBwb3NpdGlvbiIpOwotCi0JCQkgICAgLyogdXBkYXRlIGRlbGltaXRpbmcga2V5cyAqLwotCQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdLHRiLT5SWzBdLDApOwogCQkJfQotCQkgICAgfQorCQkJYnJlYWs7CiAKLQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkKLQkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOwotCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJY2FzZSBNX1BBU1RFOnsJLyogYXBwZW5kIGl0ZW0gaW4gU1swXSAqLworCQkJCXN0cnVjdCBpdGVtX2hlYWQgKnBhc3RlZDsKKworCQkJCXBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKTsKKwkJCQkvKiB3aGVuIGRpcmVjdG9yeSwgbWF5IGJlIG5ldyBlbnRyeSBhbHJlYWR5IHBhc3RlZCAqLworCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChwYXN0ZWQpKSB7CisJCQkJCWlmIChwb3NfaW5faXRlbSA+PSAwICYmCisJCQkJCSAgICBwb3NfaW5faXRlbSA8PQorCQkJCQkgICAgaWhfZW50cnlfY291bnQocGFzdGVkKSkgeworCisJCQkJCQlSRkFMU0UoIXRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCSAgICAgICAiUEFQLTEyMjYwOiBpbnNlcnRfc2l6ZSBpcyAwIGFscmVhZHkiKTsKKworCQkJCQkJLyogcHJlcGFyZSBzcGFjZSAqLworCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCWJpLmJpX2JoID0gdGJTMDsKKwkJCQkJCWJpLmJpX3BhcmVudCA9CisJCQkJCQkgICAgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsCisJCQkJCQkJCSAgIDApOworCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJICAgIFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwKKwkJCQkJCQkJICAgIDEpOworCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLAorCQkJCQkJCQkgICAgIGl0ZW1fcG9zLAorCQkJCQkJCQkgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgIFswXSwgYm9keSwKKwkJCQkJCQkJICAgICB6ZXJvc19udW0pOworCisJCQkJCQkvKiBwYXN0ZSBlbnRyeSAqLworCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLmJpX2JoLAorCQkJCQkJCQkgICBpdGVtX3BvcywKKwkJCQkJCQkJICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgIDEsCisJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJICAgICopYm9keSwKKwkJCQkJCQkJICAgYm9keSArCisJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgIFswXQorCQkJCQkJICAgICk7CisJCQkJCQlpZiAoIWl0ZW1fcG9zICYmICFwb3NfaW5faXRlbSkgeworCQkJCQkJCVJGQUxTRSghdGItPkNGTFswXQorCQkJCQkJCSAgICAgICB8fCAhdGItPkxbMF0sCisJCQkJCQkJICAgICAgICJQQVAtMTIyNzA6IENGTFswXS9MWzBdIG11c3QgYmUgc3BlY2lmaWVkIik7CisJCQkJCQkJaWYgKHRiLT5DRkxbMF0pIHsKKwkJCQkJCQkJcmVwbGFjZV9rZXkodGIsCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIENGTAorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgbGtleQorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0YlMwLAorCQkJCQkJCQkJICAgIDApOworCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCQkJCWlmIChwb3NfaW5faXRlbSA9PSBpaF9pdGVtX2xlbihwYXN0ZWQpKSB7CisKKwkJCQkJCVJGQUxTRSh0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKKwkJCQkJCSAgICAgICAiUEFQLTEyMjc1OiBpbnNlcnQgc2l6ZSBtdXN0IG5vdCBiZSAlZCIsCisJCQkJCQkgICAgICAgdGItPmluc2VydF9zaXplWzBdKTsKKwkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQliaS5iaV9iaCA9IHRiUzA7CisJCQkJCQliaS5iaV9wYXJlbnQgPQorCQkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLAorCQkJCQkJCQkgICAwKTsKKwkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCSAgICBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsCisJCQkJCQkJCSAgICAxKTsKKwkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwKKwkJCQkJCQkJICAgICBpdGVtX3BvcywKKwkJCQkJCQkJICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICBbMF0sIGJvZHksCisJCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKworCQkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBhc3RlZCkpIHsKKyNpZiAwCisJCQkJCQkJUkZBTFNFKHRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0gIT0KKwkJCQkJCQkgICAgICAgVU5GTV9QX1NJWkUsCisJCQkJCQkJICAgICAgICJQQVAtMTIyODA6IGluc2VydF9zaXplIGZvciBpbmRpcmVjdCBpdGVtIG11c3QgYmUgJWQsIG5vdCAlZCIsCisJCQkJCQkJICAgICAgIFVORk1fUF9TSVpFLAorCQkJCQkJCSAgICAgICB0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdKTsKKyNlbmRpZgorCQkJCQkJCXNldF9paF9mcmVlX3NwYWNlCisJCQkJCQkJICAgIChwYXN0ZWQsIDApOworCQkJCQkJfQorCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJfQorI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQkJCQllbHNlIHsKKwkJCQkJCWlmICh0Yi0+aW5zZXJ0X3NpemVbMF0pIHsKKwkJCQkJCQlwcmludF9jdXJfdGIoIjEyMjg1Iik7CisJCQkJCQkJcmVpc2VyZnNfcGFuaWModGItPgorCQkJCQkJCQkgICAgICAgdGJfc2IsCisJCQkJCQkJCSAgICAgICAiUEFQLTEyMjg1OiBiYWxhbmNlX2xlYWY6IGluc2VydF9zaXplIG11c3QgYmUgMCAoJWQpIiwKKwkJCQkJCQkJICAgICAgIHRiLT4KKwkJCQkJCQkJICAgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgICBbMF0pOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYJCQkJLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKwkJCQl9CisJCQl9CS8qIGNhc2UgTV9QQVNURTogKi8KIAkJfQotCSAgICB9Ci0JICAgIGVsc2UgLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gUlswXSAqLwotCSAgICB7Ci0JCWxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLwotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMTc1OiBiYWxhbmNlX2xlYWY6IHJudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKLQkJCSAgICAoZmxhZyA9PSBNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PSBNX0NVVCkgPyAiQ1VUIiA6ICJVTktOT1dOIiksIGZsYWcpOwogCX0KLSAgICAKLSAgICB9CS8qIHRiLT5ybnVtWzBdID4gMCAqLwotCi0KLSAgICBSRkFMU0UoIHRiLT5ibGtudW1bMF0gPiAzLAotCSAgICAiUEFQLTEyMTgwOiBibGtudW0gY2FuIG5vdCBiZSAlZC4gSXQgbXVzdCBiZSA8PSAzIiwgIHRiLT5ibGtudW1bMF0pOwotICAgIFJGQUxTRSggdGItPmJsa251bVswXSA8IDAsCi0JICAgICJQQVAtMTIxODU6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlID49IDAiLCAgdGItPmJsa251bVswXSk7Ci0KLSAgICAvKiBpZiB3aGlsZSBhZGRpbmcgdG8gYSBub2RlIHdlIGRpc2NvdmVyIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc3BsaXQKLSAgICAgICBpdCBpbiB0d28sIGFuZCBtZXJnZSB0aGUgbGVmdCBwYXJ0IGludG8gdGhlIGxlZnQgbmVpZ2hib3IgYW5kIHRoZQotICAgICAgIHJpZ2h0IHBhcnQgaW50byB0aGUgcmlnaHQgbmVpZ2hib3IsIGVsaW1pbmF0aW5nIHRoZSBub2RlICovCi0gICAgaWYgKCB0Yi0+YmxrbnVtWzBdID09IDAgKSB7IC8qIG5vZGUgU1swXSBpcyBlbXB0eSBub3cgKi8KLQotCVJGQUxTRSggISB0Yi0+bG51bVswXSB8fCAhIHRiLT5ybnVtWzBdLAotCSAgICAgICAgIlBBUC0xMjE5MDogbG51bSBhbmQgcm51bSBtdXN0IG5vdCBiZSB6ZXJvIik7Ci0JLyogaWYgaW5zZXJ0aW9uIHdhcyBkb25lIGJlZm9yZSAwLXRoIHBvc2l0aW9uIGluIFJbMF0sIHJpZ2h0Ci0JICAgZGVsaW1pdGluZyBrZXkgb2YgdGhlIHRiLT5MWzBdJ3MgYW5kIGxlZnQgZGVsaW1pdGluZyBrZXkgYXJlCi0JICAgbm90IHNldCBjb3JyZWN0bHkgKi8KLQlpZiAodGItPkNGTFswXSkgewotCSAgICBpZiAoIXRiLT5DRlJbMF0pCi0JCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMjE5NTogYmFsYW5jZV9sZWFmOiBDRlIgbm90IGluaXRpYWxpemVkIik7Ci0JICAgIGNvcHlfa2V5IChCX05fUERFTElNX0tFWSAodGItPkNGTFswXSwgdGItPmxrZXlbMF0pLCBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pKTsKLQkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGTFswXSwgMCk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKGZsYWcgPT0gTV9QQVNURSAmJiB0Yi0+aW5zZXJ0X3NpemVbMF0pIHsKKwkJcHJpbnRfY3VyX3RiKCIxMjI5MCIpOworCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC0xMjI5MDogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBpcyBzdGlsbCBub3QgMCAoJWQpIiwKKwkJCSAgICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOwogCX0KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiUzApOwkJCQkJCQkJCQogCXJldHVybiAwOwotICAgIH0KLQotCi0gICAgLyogRmlsbCBuZXcgbm9kZXMgdGhhdCBhcHBlYXIgaW4gcGxhY2Ugb2YgU1swXSAqLwotCi0gICAgLyogSSBhbSB0b2xkIHRoYXQgdGhpcyBjb3B5aW5nIGlzIGJlY2F1c2Ugd2UgbmVlZCBhbiBhcnJheSB0byBlbmFibGUKLSAgICAgICB0aGUgbG9vcGluZyBjb2RlLiAtSGFucyAqLwotICAgIHNudW1bMF0gPSB0Yi0+czFudW0sCi0Jc251bVsxXSA9IHRiLT5zMm51bTsKLSAgICBzYnl0ZXNbMF0gPSB0Yi0+czFieXRlczsKLSAgICBzYnl0ZXNbMV0gPSB0Yi0+czJieXRlczsKLSAgICBmb3IoIGkgPSB0Yi0+YmxrbnVtWzBdIC0gMjsgaSA+PSAwOyBpLS0gKSB7Ci0KLQlSRkFMU0UoICFzbnVtW2ldLCAiUEFQLTEyMjAwOiBzbnVtWyVkXSA9PSAlZC4gTXVzdCBiZSA+IDAiLCBpLCBzbnVtW2ldKTsKLQotCS8qIGhlcmUgd2Ugc2hpZnQgZnJvbSBTIHRvIFNfbmV3IG5vZGVzICovCi0KLQlTX25ld1tpXSA9IGdldF9GRUIodGIpOwotCi0JLyogaW5pdGlhbGl6ZWQgYmxvY2sgdHlwZSBhbmQgdHJlZSBsZXZlbCAqLwotICAgICAgICBzZXRfYmxraF9sZXZlbCggQl9CTEtfSEVBRChTX25ld1tpXSksIERJU0tfTEVBRl9OT0RFX0xFVkVMICk7Ci0KLQotCW4gPSBCX05SX0lURU1TKHRiUzApOwotCQotCXN3aXRjaCAoZmxhZykgewotCWNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gKi8KLQotCSAgICBpZiAoIG4gLSBzbnVtW2ldIDwgaXRlbV9wb3MgKQotCSAgICB7IC8qIG5ldyBpdGVtIG9yIGl0J3MgcGFydCBmYWxscyB0byBmaXJzdCBuZXcgbm9kZSBTX25ld1tpXSovCi0JCWlmICggaXRlbV9wb3MgPT0gbiAtIHNudW1baV0gKyAxICYmIHNieXRlc1tpXSAhPSAtMSApCi0JCXsgLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIFNfbmV3W2ldICovCi0JCSAgICBpbnQgb2xkX2tleV9jb21wLCBvbGRfbGVuLCByX3plcm9zX251bWJlcjsKLQkJICAgIGNvbnN0IGNoYXIgKiByX2JvZHk7Ci0JCSAgICBpbnQgdmVyc2lvbjsKLQotCQkgICAgLyogTW92ZSBzbnVtW2ldLTEgaXRlbXMgZnJvbSBTWzBdIHRvIFNfbmV3W2ldICovCi0JCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldIC0gMSwgLTEsIFNfbmV3W2ldKTsKLQkJICAgIC8qIFJlbWVtYmVyIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoICovCi0JCSAgICB2ZXJzaW9uID0gaWhfdmVyc2lvbiAoaWgpOwotICAgICAgICAgICAgICAgICAgICBvbGRfa2V5X2NvbXAgPSBsZV9paF9rX29mZnNldCggaWggKTsKLQkJICAgIG9sZF9sZW4gPSBpaF9pdGVtX2xlbihpaCk7Ci0KLQkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTX25ld1tpXSAqLwotICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZV9paF9rX29mZnNldChpaCkgKyAoKG9sZF9sZW4gLSBzYnl0ZXNbaV0gKTw8KGlzX2luZGlyZWN0X2xlX2loKGloKT90Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQ6MCkpICk7Ci0KLQkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIHNieXRlc1tpXSApOwotCi0JCSAgICAvKiBJbnNlcnQgcGFydCBvZiB0aGUgaXRlbSBpbnRvIFNfbmV3W2ldIGJlZm9yZSAwLXRoIGl0ZW0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOwotCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKLQotCQkgICAgaWYgKCAob2xkX2xlbiAtIHNieXRlc1tpXSkgPiB6ZXJvc19udW0gKSB7Ci0JCQlyX3plcm9zX251bWJlciA9IDA7Ci0JCQlyX2JvZHkgPSBib2R5ICsgKG9sZF9sZW4gLSBzYnl0ZXNbaV0pIC0gemVyb3NfbnVtOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlyX2JvZHkgPSBib2R5OwotCQkJcl96ZXJvc19udW1iZXIgPSB6ZXJvc19udW0gLSAob2xkX2xlbiAtIHNieXRlc1tpXSk7Ci0JCQl6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7Ci0JCSAgICB9Ci0KLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIDAsIGloLCByX2JvZHksIHJfemVyb3NfbnVtYmVyKTsKLQotCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNbaV0gKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgb2xkX2tleV9jb21wICk7Ci0JCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBvbGRfbGVuIC0gc2J5dGVzW2ldICk7Ci0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gc2J5dGVzW2ldOwotCQl9Ci0JCWVsc2UgLyogd2hvbGUgbmV3IGl0ZW0gZmFsbHMgaW50byBTX25ld1tpXSAqLwotCQl7Ci0JCSAgICAvKiBTaGlmdCBzbnVtWzBdIC0gMSBpdGVtcyB0byBTX25ld1tpXSAoc2J5dGVzW2ldIG9mIHNwbGl0IGl0ZW0pICovCi0JCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldIC0gMSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7Ci0KLQkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIFNfbmV3W2ldICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSBTX25ld1tpXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7Ci0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldIC0gMSwgaWgsIGJvZHksIHplcm9zX251bSk7Ci0KLQkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCX0KLQkgICAgfQotCi0JICAgIGVsc2UgLyogbmV3IGl0ZW0gb3IgaXQgcGFydCBkb24ndCBmYWxscyBpbnRvIFNfbmV3W2ldICovCi0JICAgIHsKLQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIE1fUEFTVEU6ICAgLyogYXBwZW5kIGl0ZW0gKi8KLQotCSAgICBpZiAoIG4gLSBzbnVtW2ldIDw9IGl0ZW1fcG9zICkgIC8qIHBhc3RlZCBpdGVtIG9yIHBhcnQgaWYgaXQgZmFsbHMgdG8gU19uZXdbaV0gKi8KLQkgICAgewotCQlpZiAoIGl0ZW1fcG9zID09IG4gLSBzbnVtW2ldICYmIHNieXRlc1tpXSAhPSAtMSApCi0JCXsgLyogd2UgbXVzdCBzaGlmdCBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCi0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogYXV4X2loOwotCi0JCSAgICBSRkFMU0UoIGloLCAiUEFQLTEyMjEwOiBpaCBtdXN0IGJlIDAiKTsKLQotCQkgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoYXV4X2loID0gQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpKSB7Ci0JCQkvKiB3ZSBhcHBlbmQgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KLQotCQkJaW50IGVudHJ5X2NvdW50OwotCQkKLQkJCWVudHJ5X2NvdW50ID0gaWhfZW50cnlfY291bnQoYXV4X2loKTsKLQotCQkJaWYgKCBlbnRyeV9jb3VudCAtIHNieXRlc1tpXSA8IHBvc19pbl9pdGVtICAmJiBwb3NfaW5faXRlbSA8PSBlbnRyeV9jb3VudCApIHsKLQkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gU19uZXdbaV0gKi8KLQkJICAKLQkJCSAgICBSRkFMU0UoICEgdGItPmluc2VydF9zaXplWzBdLAotCQkJCSAgICAiUEFQLTEyMjE1OiBpbnNlcnRfc2l6ZSBpcyBhbHJlYWR5IDAiKTsKLQkJCSAgICBSRkFMU0UoIHNieXRlc1tpXSAtIDEgPj0gZW50cnlfY291bnQsCi0JCQkJICAgICJQQVAtMTIyMjA6IHRoZXJlIGFyZSBubyBzbyBtdWNoIGVudHJpZXMgKCVkKSwgb25seSAlZCIsCi0JCQkJICAgIHNieXRlc1tpXSAtIDEsIGVudHJ5X2NvdW50KTsKLQotCQkJICAgIC8qIFNoaWZ0IHNudW1baV0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgc2J5dGVzW2ldIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIHNudW1baV0gKi8KLQkJCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0tMSwgU19uZXdbaV0pOwotCQkJICAgIC8qIFBhc3RlIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLwotCQkJICAgIGJpLnRiID0gdGI7Ci0JCQkgICAgYmkuYmlfYmggPSBTX25ld1tpXTsKLQkJCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOwotCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKLQkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCAwLCBwb3NfaW5faXRlbSAtIGVudHJ5X2NvdW50ICsgc2J5dGVzW2ldIC0gMSwKLQkJCQkJCSAgdGItPmluc2VydF9zaXplWzBdLCBib2R5LHplcm9zX251bSk7Ci0JCQkgICAgLyogcGFzdGUgbmV3IGRpcmVjdG9yeSBlbnRyeSAqLwotCQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQkJYmkuYmlfYmgsIDAsIHBvc19pbl9pdGVtIC0gZW50cnlfY291bnQgKyBzYnl0ZXNbaV0gLSAxLAotCQkJCTEsIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwKLQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCQkpOwotCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCQkgICAgcG9zX2luX2l0ZW0rKzsKLQkJCX0gZWxzZSB7IC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZG9lc24ndCBmYWxsIGludG8gU19uZXdbaV0gKi8KLQkJCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGVsc2UgLyogcmVndWxhciBvYmplY3QgKi8KLQkJICAgIHsKLQkJCWludCBuX3NoaWZ0LCBuX3JlbSwgcl96ZXJvc19udW1iZXI7Ci0JCQljb25zdCBjaGFyICogcl9ib2R5OwotCi0JCQlSRkFMU0UoIHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSB8fAotCQkJICAgICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKLQkJCSAgICAgICAgIlBBUC0xMjIyNTogaXRlbSB0b28gc2hvcnQgb3IgaW5zZXJ0X3NpemUgPD0gMCIpOwotCi0JCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZCBmcm9tIGFwcGVuZGVkIGl0ZW0gKi8KLQkJCW5fc2hpZnQgPSBzYnl0ZXNbaV0gLSB0Yi0+aW5zZXJ0X3NpemVbMF07Ci0JCQlpZiAoIG5fc2hpZnQgPCAwICkKLQkJCSAgICBuX3NoaWZ0ID0gMDsKLQkJCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIG5fc2hpZnQsIFNfbmV3W2ldKTsKLQotCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IHJlbWFpbiBpbiBib2R5IGFmdGVyIGFwcGVuZCB0byBTX25ld1tpXSAqLwotCQkJbl9yZW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gLSBzYnl0ZXNbaV07Ci0JCQlpZiAoIG5fcmVtIDwgMCApCi0JCQkgICAgbl9yZW0gPSAwOwotCQkJLyogQXBwZW5kIHBhcnQgb2YgYm9keSBpbnRvIFNfbmV3WzBdICovCi0JCQliaS50YiA9IHRiOwotCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKLQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7Ci0JCQliaS5iaV9wb3NpdGlvbiA9IDA7Ci0KLQkJCWlmICggbl9yZW0gPiB6ZXJvc19udW0gKSB7Ci0JCQkgICAgcl96ZXJvc19udW1iZXIgPSAwOwotCQkJICAgIHJfYm9keSA9IGJvZHkgKyBuX3JlbSAtIHplcm9zX251bTsKLQkJCX0KLQkJCWVsc2UgewotCQkJICAgIHJfYm9keSA9IGJvZHk7Ci0JCQkgICAgcl96ZXJvc19udW1iZXIgPSB6ZXJvc19udW0gLSBuX3JlbTsKLQkJCSAgICB6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7Ci0JCQl9Ci0KLQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgMCwgbl9zaGlmdCwgdGItPmluc2VydF9zaXplWzBdLW5fcmVtLCByX2JvZHkscl96ZXJvc19udW1iZXIpOwotCQkJewotCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiB0bXA7Ci0KLQkJCSAgICB0bXAgPSBCX05fUElURU1fSEVBRChTX25ld1tpXSwwKTsKLQkJCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHRtcCkpIHsKLQkJCQlzZXRfaWhfZnJlZV9zcGFjZSAodG1wLCAwKTsKLQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoIHRtcCwgbGVfaWhfa19vZmZzZXQodG1wKSArIAotCQkJCQkgICAgICAgICAgICAobl9yZW0gPDwgKHRiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVCkpKTsKLQkJCSAgICB9IGVsc2UgewotCQkJCXNldF9sZV9paF9rX29mZnNldCggdG1wLCBsZV9paF9rX29mZnNldCh0bXApICsgCi0JCQkJICAgICAgICAgICAgICAgICAgICBuX3JlbSApOwotCQkJICAgIH0KLQkJCX0KLQotCQkJdGItPmluc2VydF9zaXplWzBdID0gbl9yZW07Ci0JCQlpZiAoICEgbl9yZW0gKQotCQkJICAgIHBvc19pbl9pdGVtKys7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgLyogaXRlbSBmYWxscyB3aG9sbHkgaW50byBTX25ld1tpXSAqLwotCQl7Ci0JCSAgICBpbnQgcmV0X3ZhbDsKLQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7Ci0KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCA9IEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpOwotCi0JCSAgICBpZiAoICEgaXNfZGlyZW50cnlfbGVfaWgoaWgpICYmIChwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgfHwKLQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdIDw9IDApICkKLQkJCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyMzU6IGJhbGFuY2VfbGVhZjogcG9zX2luX2l0ZW0gbXVzdCBiZSBlcXVhbCB0byBpaF9pdGVtX2xlbiIpOwotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCi0JCSAgICByZXRfdmFsID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7Ci0KLQkJICAgIFJGQUxTRSggcmV0X3ZhbCwKLQkJCSAgICAiUEFQLTEyMjQwOiB1bmV4cGVjdGVkIHZhbHVlIHJldHVybmVkIGJ5IGxlYWZfbW92ZV9pdGVtcyAoJWQpIiwKLQkJCSAgICByZXRfdmFsKTsKLQotCQkgICAgLyogcGFzdGUgaW50byBpdGVtICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSBTX25ld1tpXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7Ci0JCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIGl0ZW1fcG9zIC0gbiArIHNudW1baV0sIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7Ci0KLQkJICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEKFNfbmV3W2ldLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldKTsKLQkJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSkKLQkJICAgIHsKLQkJCWxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQkgICAgYmkuYmlfYmgsIGl0ZW1fcG9zIC0gbiArIHNudW1baV0sIHBvc19pbl9pdGVtLCAxLCAKLQkJCSAgICAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJICAgICk7Ci0JCSAgICB9Ci0KLQkJICAgIC8qIGlmIHdlIHBhc3RlIHRvIGluZGlyZWN0IGl0ZW0gdXBkYXRlIGloX2ZyZWVfc3BhY2UgKi8KLQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkKLQkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOwotCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgICAgZWxzZSAvKiBwYXN0ZWQgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBTX25ld1tpXSAqLwotCSAgICB7Ci0JCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6ICAgIC8qIGNhc2VzIGQgYW5kIHQgKi8KLQkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjI0NTogYmFsYW5jZV9sZWFmOiBibGtudW0gPiAyOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKLQkJCSAgICAoZmxhZyA9PSBNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PSBNX0NVVCkgPyAiQ1VUIiA6ICJVTktOT1dOIiksIGZsYWcpOwotCX0KLQotCW1lbWNweSAoaW5zZXJ0X2tleSArIGksQl9OX1BLRVkoU19uZXdbaV0sMCksS0VZX1NJWkUpOwotCWluc2VydF9wdHJbaV0gPSBTX25ld1tpXTsKLQotCVJGQUxTRSAoIWJ1ZmZlcl9qb3VybmFsZWQgKFNfbmV3IFtpXSkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkgKFNfbmV3IFtpXSkgfHwKLQkJYnVmZmVyX2RpcnR5IChTX25ldyBbaV0pLAotCQkiUEFQLTEyMjQ3OiBTX25ld1slZF0gOiAoJWIpIiwgaSwgU19uZXdbaV0pOwotICAgIH0KLQotICAgIC8qIGlmIHRoZSBhZmZlY3RlZCBpdGVtIHdhcyBub3Qgd2hvbGx5IHNoaWZ0ZWQgdGhlbiB3ZSBwZXJmb3JtIGFsbCBuZWNlc3Nhcnkgb3BlcmF0aW9ucyBvbiB0aGF0IHBhcnQgb3Igd2hvbGUgb2YgdGhlCi0gICAgICAgYWZmZWN0ZWQgaXRlbSB3aGljaCByZW1haW5zIGluIFMgKi8KLSAgICBpZiAoIDAgPD0gaXRlbV9wb3MgJiYgaXRlbV9wb3MgPCB0Yi0+czBudW0gKQotICAgIHsgLyogaWYgd2UgbXVzdCBpbnNlcnQgb3IgYXBwZW5kIGludG8gYnVmZmVyIFNbMF0gKi8KLQotCXN3aXRjaCAoZmxhZykKLQl7Ci0JY2FzZSBNX0lOU0VSVDogICAvKiBpbnNlcnQgaXRlbSBpbnRvIFNbMF0gKi8KLQkgICAgYmkudGIgPSB0YjsKLQkgICAgYmkuYmlfYmggPSB0YlMwOwotCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOwotCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBpdGVtX3BvcywgaWgsIGJvZHksIHplcm9zX251bSk7Ci0KLQkgICAgLyogSWYgd2UgaW5zZXJ0IHRoZSBmaXJzdCBrZXkgY2hhbmdlIHRoZSBkZWxpbWl0aW5nIGtleSAqLwotCSAgICBpZiggaXRlbV9wb3MgPT0gMCApIHsKLQkJaWYgKHRiLT5DRkxbMF0pIC8qIGNhbiBiZSAwIGluIHJlaXNlcmZzY2sgKi8KLQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSx0YlMwLDApOwotCi0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIE1fUEFTVEU6IHsgIC8qIGFwcGVuZCBpdGVtIGluIFNbMF0gKi8KLQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKLQotCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpOwotCSAgICAvKiB3aGVuIGRpcmVjdG9yeSwgbWF5IGJlIG5ldyBlbnRyeSBhbHJlYWR5IHBhc3RlZCAqLwotCSAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkpIHsKLQkJaWYgKCBwb3NfaW5faXRlbSA+PSAwICYmCi0JCSAgICBwb3NfaW5faXRlbSA8PSBpaF9lbnRyeV9jb3VudChwYXN0ZWQpICkgewotCi0JCSAgICBSRkFMU0UoICEgdGItPmluc2VydF9zaXplWzBdLCAKLQkJCSAgICAiUEFQLTEyMjYwOiBpbnNlcnRfc2l6ZSBpcyAwIGFscmVhZHkiKTsKLQotCQkgICAgLyogcHJlcGFyZSBzcGFjZSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGJTMDsKLQkJICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOwotCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKLQotCQkgICAgLyogcGFzdGUgZW50cnkgKi8KLQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQliaS5iaV9iaCwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCAxLCAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LAotCQkJYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCSk7Ci0JCSAgICBpZiAoICEgaXRlbV9wb3MgJiYgISBwb3NfaW5faXRlbSApIHsKLQkJCVJGQUxTRSggIXRiLT5DRkxbMF0gfHwgIXRiLT5MWzBdLCAKLQkJCQkiUEFQLTEyMjcwOiBDRkxbMF0vTFswXSBtdXN0IGJlIHNwZWNpZmllZCIpOwotCQkJaWYgKHRiLT5DRkxbMF0pIHsKLQkJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sdGJTMCwwKTsKLQotCQkJfQotCQkgICAgfQotCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJfQotCSAgICB9IGVsc2UgeyAvKiByZWd1bGFyIG9iamVjdCAqLwotCQlpZiAoIHBvc19pbl9pdGVtID09IGloX2l0ZW1fbGVuKHBhc3RlZCkgKSB7Ci0KLQkJICAgIFJGQUxTRSggdGItPmluc2VydF9zaXplWzBdIDw9IDAsCi0JCQkgICAgIlBBUC0xMjI3NTogaW5zZXJ0IHNpemUgbXVzdCBub3QgYmUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0YlMwOwotCQkgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7Ci0JCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKLQotCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKSB7Ci0jaWYgMAotCQkJUkZBTFNFKCB0Yi0+aW5zZXJ0X3NpemVbMF0gIT0gVU5GTV9QX1NJWkUsCi0JCQkJIlBBUC0xMjI4MDogaW5zZXJ0X3NpemUgZm9yIGluZGlyZWN0IGl0ZW0gbXVzdCBiZSAlZCwgbm90ICVkIiwKLQkJCQlVTkZNX1BfU0laRSwgdGItPmluc2VydF9zaXplWzBdKTsKLSNlbmRpZgotCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7Ci0JCSAgICB9Ci0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkJZWxzZSB7Ci0JCSAgICBpZiAoIHRiLT5pbnNlcnRfc2l6ZVswXSApIHsKLQkJCXByaW50X2N1cl90YiAoIjEyMjg1Iik7Ci0JCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjg1OiBiYWxhbmNlX2xlYWY6IGluc2VydF9zaXplIG11c3QgYmUgMCAoJWQpIiwgdGItPmluc2VydF9zaXplWzBdKTsKLQkJICAgIH0KLQkJfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCSAgICAKLQkgICAgfQotCX0gLyogY2FzZSBNX1BBU1RFOiAqLwotCX0KLSAgICB9Ci0KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpZiAoIGZsYWcgPT0gTV9QQVNURSAmJiB0Yi0+aW5zZXJ0X3NpemVbMF0gKSB7Ci0JcHJpbnRfY3VyX3RiICgiMTIyOTAiKTsKLQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjkwOiBiYWxhbmNlX2xlYWY6IGluc2VydF9zaXplIGlzIHN0aWxsIG5vdCAwICglZCkiLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOwotICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KLQotICAgIHJldHVybiAwOwotfSAvKiBMZWFmIGxldmVsIG9mIHRoZSB0cmVlIGlzIGJhbGFuY2VkIChlbmQgb2YgYmFsYW5jZV9sZWFmKSAqLwotCi0KK30JCQkJLyogTGVhZiBsZXZlbCBvZiB0aGUgdHJlZSBpcyBiYWxhbmNlZCAoZW5kIG9mIGJhbGFuY2VfbGVhZikgKi8KIAogLyogTWFrZSBlbXB0eSBub2RlICovCi12b2lkIG1ha2VfZW1wdHlfbm9kZSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmkpCit2b2lkIG1ha2VfZW1wdHlfbm9kZShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpKQogewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKIAotICAgIFJGQUxTRSggYmktPmJpX2JoID09IE5VTEwsICJQQVAtMTIyOTU6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpcyBOVUxMIik7CisJUkZBTFNFKGJpLT5iaV9iaCA9PSBOVUxMLCAiUEFQLTEyMjk1OiBwb2ludGVyIHRvIHRoZSBidWZmZXIgaXMgTlVMTCIpOwogCi0gICAgYmxraCA9IEJfQkxLX0hFQUQoYmktPmJpX2JoKTsKLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCAwICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgTUFYX0NISUxEX1NJWkUoYmktPmJpX2JoKSApOworCWJsa2ggPSBCX0JMS19IRUFEKGJpLT5iaV9iaCk7CisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCAwKTsKKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsIE1BWF9DSElMRF9TSVpFKGJpLT5iaV9iaCkpOwogCi0gICAgaWYgKGJpLT5iaV9wYXJlbnQpCi0JQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pLT5kY19zaXplID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLworCWlmIChiaS0+YmlfcGFyZW50KQorCQlCX05fQ0hJTEQoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKS0+ZGNfc2l6ZSA9IDA7CS8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KIH0KIAotCiAvKiBHZXQgZmlyc3QgZW1wdHkgYnVmZmVyICovCi1zdHJ1Y3QgYnVmZmVyX2hlYWQgKiBnZXRfRkVCIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdldF9GRUIoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZmlyc3RfYjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iOworCXN0cnVjdCBidWZmZXJfaW5mbyBiaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkgKyspCi0JaWYgKHRiLT5GRUJbaV0gIT0gMCkKLQkgICAgYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrKQorCQlpZiAodGItPkZFQltpXSAhPSAwKQorCQkJYnJlYWs7CiAKLSAgICBpZiAoaSA9PSBNQVhfRkVCX1NJWkUpCi0JcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtMTIzMDA6IGdldF9GRUI6IEZFQiBsaXN0IGlzIGVtcHR5Iik7CisJaWYgKGkgPT0gTUFYX0ZFQl9TSVpFKQorCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkgICAgICAgInZzLTEyMzAwOiBnZXRfRkVCOiBGRUIgbGlzdCBpcyBlbXB0eSIpOwogCi0gICAgYmkudGIgPSB0YjsKLSAgICBiaS5iaV9iaCA9IGZpcnN0X2IgPSB0Yi0+RkVCW2ldOwotICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7Ci0gICAgYmkuYmlfcG9zaXRpb24gPSAwOwotICAgIG1ha2VfZW1wdHlfbm9kZSAoJmJpKTsKLSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGZpcnN0X2IpOwotICAgIHRiLT5GRUJbaV0gPSBOVUxMOwotICAgIHRiLT51c2VkW2ldID0gZmlyc3RfYjsKKwliaS50YiA9IHRiOworCWJpLmJpX2JoID0gZmlyc3RfYiA9IHRiLT5GRUJbaV07CisJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwliaS5iaV9wb3NpdGlvbiA9IDA7CisJbWFrZV9lbXB0eV9ub2RlKCZiaSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShmaXJzdF9iKTsKKwl0Yi0+RkVCW2ldID0gTlVMTDsKKwl0Yi0+dXNlZFtpXSA9IGZpcnN0X2I7CiAKLSAgICByZXR1cm4oZmlyc3RfYik7CisJcmV0dXJuIChmaXJzdF9iKTsKIH0KIAotCiAvKiBUaGlzIGlzIG5vdyB1c2VkIGJlY2F1c2UgcmVpc2VyZnNfZnJlZV9ibG9jayBoYXMgdG8gYmUgYWJsZSB0bwogKiogc2NoZWR1bGUuCiAqLwotc3RhdGljIHZvaWQgc3RvcmVfdGhyb3duIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIHZvaWQgc3RvcmVfdGhyb3duKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIGludCBpOworCWludCBpOwogCi0gICAgaWYgKGJ1ZmZlcl9kaXJ0eSAoYmgpKQotICAgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAic3RvcmVfdGhyb3duIGRlYWxzIHdpdGggZGlydHkgYnVmZmVyIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPnRocm93bikvc2l6ZW9mICh0Yi0+dGhyb3duWzBdKTsgaSArKykKLQlpZiAoIXRiLT50aHJvd25baV0pIHsKLQkgICAgdGItPnRocm93bltpXSA9IGJoOwotCSAgICBnZXRfYmgoYmgpIDsgLyogZnJlZV90aHJvd24gcHV0cyB0aGlzICovCi0JICAgIHJldHVybjsKLQl9Ci0gICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAic3RvcmVfdGhyb3duOiB0b28gbWFueSB0aHJvd24gYnVmZmVycyIpOworCWlmIChidWZmZXJfZGlydHkoYmgpKQorCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkgInN0b3JlX3Rocm93biBkZWFscyB3aXRoIGRpcnR5IGJ1ZmZlciIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGItPnRocm93bikgLyBzaXplb2YodGItPnRocm93blswXSk7IGkrKykKKwkJaWYgKCF0Yi0+dGhyb3duW2ldKSB7CisJCQl0Yi0+dGhyb3duW2ldID0gYmg7CisJCQlnZXRfYmgoYmgpOwkvKiBmcmVlX3Rocm93biBwdXRzIHRoaXMgKi8KKwkJCXJldHVybjsKKwkJfQorCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLCAic3RvcmVfdGhyb3duOiB0b28gbWFueSB0aHJvd24gYnVmZmVycyIpOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3Rocm93bihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikgewotICAgIGludCBpIDsKLSAgICBiX2Jsb2NrbnJfdCBibG9ja25yIDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0Yi0+dGhyb3duKS9zaXplb2YgKHRiLT50aHJvd25bMF0pOyBpKyspIHsKLQlpZiAodGItPnRocm93bltpXSkgewotCSAgICBibG9ja25yID0gdGItPnRocm93bltpXS0+Yl9ibG9ja25yIDsKLQkgICAgaWYgKGJ1ZmZlcl9kaXJ0eSAodGItPnRocm93bltpXSkpCi0JICAgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAotCQkJCSJmcmVlX3Rocm93biBkZWFscyB3aXRoIGRpcnR5IGJ1ZmZlciAlZCIsCi0JCQkJYmxvY2tucik7Ci0JICAgIGJyZWxzZSh0Yi0+dGhyb3duW2ldKSA7IC8qIGluY3JlbWVudGVkIGluIHN0b3JlX3Rocm93biAqLwotCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLCBibG9ja25yLCAwKTsKK3N0YXRpYyB2b2lkIGZyZWVfdGhyb3duKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQoreworCWludCBpOworCWJfYmxvY2tucl90IGJsb2NrbnI7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0Yi0+dGhyb3duKSAvIHNpemVvZih0Yi0+dGhyb3duWzBdKTsgaSsrKSB7CisJCWlmICh0Yi0+dGhyb3duW2ldKSB7CisJCQlibG9ja25yID0gdGItPnRocm93bltpXS0+Yl9ibG9ja25yOworCQkJaWYgKGJ1ZmZlcl9kaXJ0eSh0Yi0+dGhyb3duW2ldKSkKKwkJCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkJCSAiZnJlZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIgJWQiLAorCQkJCQkJIGJsb2NrbnIpOworCQkJYnJlbHNlKHRiLT50aHJvd25baV0pOwkvKiBpbmNyZW1lbnRlZCBpbiBzdG9yZV90aHJvd24gKi8KKwkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwgTlVMTCwKKwkJCQkJICAgIGJsb2NrbnIsIDApOworCQl9CiAJfQotICAgIH0KIH0KIAotdm9pZCByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3ZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7Ci0gICAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOwotICAgIHNldF9ibGtoX2xldmVsKCBibGtoLCBGUkVFX0xFVkVMICk7Ci0gICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgMCApOwotICAgIAotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0gICAgc3RvcmVfdGhyb3duICh0YiwgYmgpOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwlzZXRfYmxraF9sZXZlbChibGtoLCBGUkVFX0xFVkVMKTsKKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIDApOworCisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwlzdG9yZV90aHJvd24odGIsIGJoKTsKIH0KIAogLyogUmVwbGFjZSBuX2Rlc3QndGgga2V5IGluIGJ1ZmZlciBkZXN0IGJ5IG5fc3JjJ3RoIGtleSBvZiBidWZmZXIgc3JjLiovCi12b2lkIHJlcGxhY2Vfa2V5IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QsIGludCBuX2Rlc3QsCi0JCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLCBpbnQgbl9zcmMpCit2b2lkIHJlcGxhY2Vfa2V5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QsIGludCBuX2Rlc3QsCisJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywgaW50IG5fc3JjKQogewogCi0gICAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCi0JICAgICJ2cy0xMjMwNTogc291cmNlIG9yIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyAwIChzcmM9JXAsIGRlc3Q9JXApIiwKLQkgICAgc3JjLCBkZXN0KTsKLSAgICBSRkFMU0UoICEgQl9JU19LRVlTX0xFVkVMIChkZXN0KSwKLQkgICAgInZzLTEyMzEwOiBpbnZhbGlkIGxldmVsICgleikgZm9yIGRlc3RpbmF0aW9uIGJ1ZmZlci4gZGVzdCBtdXN0IGJlIGxlYWYiLAotCSAgICBkZXN0KTsKLSAgICBSRkFMU0UoIG5fZGVzdCA8IDAgfHwgbl9zcmMgPCAwLAotCSAgICAidnMtMTIzMTU6IHNyYyglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciA8IDAiLCBuX3NyYywgbl9kZXN0KTsKLSAgICBSRkFMU0UoIG5fZGVzdCA+PSBCX05SX0lURU1TKGRlc3QpIHx8IG5fc3JjID49IEJfTlJfSVRFTVMoc3JjKSwKLQkgICAgInZzLTEyMzIwOiBzcmMoJWQoJWQpKSBvciBkZXN0KCVkKCVkKSkga2V5IG51bWJlciBpcyB0b28gYmlnIiwKLQkgICAgbl9zcmMsIEJfTlJfSVRFTVMoc3JjKSwgbl9kZXN0LCBCX05SX0lURU1TKGRlc3QpKTsKLSAgIAotICAgIGlmIChCX0lTX0lURU1TX0xFVkVMIChzcmMpKQotCS8qIHNvdXJjZSBidWZmZXIgY29udGFpbnMgbGVhZiBub2RlICovCi0JbWVtY3B5IChCX05fUERFTElNX0tFWShkZXN0LG5fZGVzdCksIEJfTl9QSVRFTV9IRUFEKHNyYyxuX3NyYyksIEtFWV9TSVpFKTsKLSAgICBlbHNlCi0JbWVtY3B5IChCX05fUERFTElNX0tFWShkZXN0LG5fZGVzdCksIEJfTl9QREVMSU1fS0VZKHNyYyxuX3NyYyksIEtFWV9TSVpFKTsKKwlSRkFMU0UoZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLAorCSAgICAgICAidnMtMTIzMDU6IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBidWZmZXIgaXMgMCAoc3JjPSVwLCBkZXN0PSVwKSIsCisJICAgICAgIHNyYywgZGVzdCk7CisJUkZBTFNFKCFCX0lTX0tFWVNfTEVWRUwoZGVzdCksCisJICAgICAgICJ2cy0xMjMxMDogaW52YWxpZCBsZXZlbCAoJXopIGZvciBkZXN0aW5hdGlvbiBidWZmZXIuIGRlc3QgbXVzdCBiZSBsZWFmIiwKKwkgICAgICAgZGVzdCk7CisJUkZBTFNFKG5fZGVzdCA8IDAgfHwgbl9zcmMgPCAwLAorCSAgICAgICAidnMtMTIzMTU6IHNyYyglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciA8IDAiLCBuX3NyYywgbl9kZXN0KTsKKwlSRkFMU0Uobl9kZXN0ID49IEJfTlJfSVRFTVMoZGVzdCkgfHwgbl9zcmMgPj0gQl9OUl9JVEVNUyhzcmMpLAorCSAgICAgICAidnMtMTIzMjA6IHNyYyglZCglZCkpIG9yIGRlc3QoJWQoJWQpKSBrZXkgbnVtYmVyIGlzIHRvbyBiaWciLAorCSAgICAgICBuX3NyYywgQl9OUl9JVEVNUyhzcmMpLCBuX2Rlc3QsIEJfTlJfSVRFTVMoZGVzdCkpOwogCi0gICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgZGVzdCwgMCk7CisJaWYgKEJfSVNfSVRFTVNfTEVWRUwoc3JjKSkKKwkJLyogc291cmNlIGJ1ZmZlciBjb250YWlucyBsZWFmIG5vZGUgKi8KKwkJbWVtY3B5KEJfTl9QREVMSU1fS0VZKGRlc3QsIG5fZGVzdCksIEJfTl9QSVRFTV9IRUFEKHNyYywgbl9zcmMpLAorCQkgICAgICAgS0VZX1NJWkUpOworCWVsc2UKKwkJbWVtY3B5KEJfTl9QREVMSU1fS0VZKGRlc3QsIG5fZGVzdCksIEJfTl9QREVMSU1fS0VZKHNyYywgbl9zcmMpLAorCQkgICAgICAgS0VZX1NJWkUpOworCisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCBkZXN0LCAwKTsKIH0KIAotCi1pbnQgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKAotCQkJCXN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJaW50IGgKLQkJCQkpCitpbnQgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICBpbnQgU2hfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CiAKLSAgUkZBTFNFKCBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpID09IDAgfHwgdGItPkZMW2hdID09IDAsCi0JICAidnMtMTIzMjU6IEZMWyVkXSglcCkgb3IgRlslZF0oJXApIGRvZXMgbm90IGV4aXN0IiwgCi0JICBoLCB0Yi0+RkxbaF0sIGgsIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpOworCVJGQUxTRShQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RkxbaF0gPT0gMCwKKwkgICAgICAgInZzLTEyMzI1OiBGTFslZF0oJXApIG9yIEZbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsCisJICAgICAgIGgsIHRiLT5GTFtoXSwgaCwgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKTsKIAotICBpZiAoU2hfcG9zaXRpb24gPT0gMCkKLSAgICByZXR1cm4gQl9OUl9JVEVNUyAodGItPkZMW2hdKTsKLSAgZWxzZQotICAgIHJldHVybiBTaF9wb3NpdGlvbiAtIDE7CisJaWYgKFNoX3Bvc2l0aW9uID09IDApCisJCXJldHVybiBCX05SX0lURU1TKHRiLT5GTFtoXSk7CisJZWxzZQorCQlyZXR1cm4gU2hfcG9zaXRpb24gLSAxOwogfQogCi0KLWludCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitpbnQgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOwogCi0gIFJGQUxTRSggUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GUltoXSA9PSAwLAotCSAgInZzLTEyMzMwOiBGWyVkXSglcCkgb3IgRlJbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsIAotCSAgaCwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSwgaCwgdGItPkZSW2hdKTsKKwlSRkFMU0UoUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpID09IDAgfHwgdGItPkZSW2hdID09IDAsCisJICAgICAgICJ2cy0xMjMzMDogRlslZF0oJXApIG9yIEZSWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLAorCSAgICAgICBoLCBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCksIGgsIHRiLT5GUltoXSk7CiAKLSAgaWYgKFNoX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMgKFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIFNoX3Bvc2l0aW9uICsgMTsKKwlpZiAoU2hfcG9zaXRpb24gPT0gQl9OUl9JVEVNUyhQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCkpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBTaF9wb3NpdGlvbiArIDE7CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogCi1pbnQgaXNfcmV1c2FibGUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgYml0X3ZhbHVlKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX25vZGUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBjaGFyICogbWVzKQoraW50IGlzX3JldXNhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpOworc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJY2hhciAqbWVzKQogewotICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOwotICBpbnQgaTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisJaW50IGk7CiAKLSAgUkZBTFNFKCAhYmgsICJQQVAtMTIzMzY6IGJoID09IDAiKTsKKwlSRkFMU0UoIWJoLCAiUEFQLTEyMzM2OiBiaCA9PSAwIik7CiAKLSAgaWYgKCFiaCB8fCAhQl9JU19JTl9UUkVFIChiaCkpCi0gICAgcmV0dXJuOwotIAotICBSRkFMU0UoICFidWZmZXJfZGlydHkgKGJoKSAmJiAKLQkgICEoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSwKLQkgICJQQVAtMTIzMzc6IGJ1ZmZlciAoJWIpIG11c3QgYmUgZGlydHkiLCBiaCk7Ci0gIGRjID0gQl9OX0NISUxEIChiaCwgMCk7CisJaWYgKCFiaCB8fCAhQl9JU19JTl9UUkVFKGJoKSkKKwkJcmV0dXJuOwogCi0gIGZvciAoaSA9IDA7IGkgPD0gQl9OUl9JVEVNUyAoYmgpOyBpICsrLCBkYyArKykgewotICAgIGlmICghaXNfcmV1c2FibGUgKHMsIGRjX2Jsb2NrX251bWJlcihkYyksIDEpICkgewotICAgICAgcHJpbnRfY3VyX3RiIChtZXMpOwotICAgICAgcmVpc2VyZnNfcGFuaWMgKHMsICJQQVAtMTIzMzg6IGNoZWNrX2ludGVybmFsX25vZGU6IGludmFsaWQgY2hpbGQgcG9pbnRlciAleSBpbiAlYiIsIGRjLCBiaCk7Ci0gICAgfQotICB9Ci19CisJUkZBTFNFKCFidWZmZXJfZGlydHkoYmgpICYmCisJICAgICAgICEoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSwKKwkgICAgICAgIlBBUC0xMjMzNzogYnVmZmVyICglYikgbXVzdCBiZSBkaXJ0eSIsIGJoKTsKKwlkYyA9IEJfTl9DSElMRChiaCwgMCk7CiAKLQotc3RhdGljIGludCBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBjaGFyICogd2hpY2gpCi17Ci0gIGlmICggKCFidWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpICYmIGJ1ZmZlcl9sb2NrZWQgKGJoKSkgfHwKLSAgICAgICAgIUJfSVNfSU5fVFJFRSAoYmgpICkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMjMzOTogbG9ja2VkX29yX25vdF9pbl90cmVlOiAlcyAoJWIpIiwKLSAgICAgICAgICAgICAgICAgICAgICB3aGljaCwgYmgpOwotICAgIHJldHVybiAxOwotICB9IAotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNoZWNrX2JlZm9yZV9iYWxhbmNpbmcgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKLXsKLSAgaW50IHJldHZhbCA9IDA7CQotCi0gIGlmICggY3VyX3RiICkgewotICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMjMzNTogY2hlY2tfYmVmb3JlX2JhbGFuY2luZzogIgotCQkgICAgInN1c3BlY3QgdGhhdCBzY2hlZHVsZSBvY2N1cnJlZCBiYXNlZCBvbiBjdXJfdGIgbm90IGJlaW5nIG51bGwgYXQgdGhpcyBwb2ludCBpbiBjb2RlLiAiCi0JCSAgICAiZG9fYmFsYW5jZSBjYW5ub3QgcHJvcGVybHkgaGFuZGxlIHNjaGVkdWxlIG9jY3VycmluZyB3aGlsZSBpdCBydW5zLiIpOwotICB9Ci0gIAotICAvKiBkb3VibGUgY2hlY2sgdGhhdCBidWZmZXJzIHRoYXQgd2Ugd2lsbCBtb2RpZnkgYXJlIHVubG9ja2VkLiAoZml4X25vZGVzIHNob3VsZCBhbHJlYWR5IGhhdmUKLSAgICAgcHJlcHBlZCBhbGwgb2YgdGhlc2UgZm9yIHVzKS4gKi8KLSAgaWYgKCB0Yi0+bG51bVswXSApIHsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+TFswXSwgIkxbMF0iKTsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+RkxbMF0sICJGTFswXSIpOwotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5DRkxbMF0sICJDRkxbMF0iKTsKLSAgICBjaGVja19sZWFmICh0Yi0+TFswXSk7Ci0gIH0KLSAgaWYgKCB0Yi0+cm51bVswXSApIHsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+UlswXSwgIlJbMF0iKTsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+RlJbMF0sICJGUlswXSIpOwotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5DRlJbMF0sICJDRlJbMF0iKTsKLSAgICBjaGVja19sZWFmICh0Yi0+UlswXSk7Ci0gIH0KLSAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAoUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKSwgIlNbMF0iKTsKLSAgY2hlY2tfbGVhZiAoUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKSk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgdm9pZCBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWYgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKLXsKLSAgICBpZiAodGItPmxudW1bMF0pIHsKLQlpZiAoQl9GUkVFX1NQQUNFICh0Yi0+TFswXSkgIT0gCi0JICAgIE1BWF9DSElMRF9TSVpFICh0Yi0+TFswXSkgLSBkY19zaXplKEJfTl9DSElMRCAodGItPkZMWzBdLCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApKSkpIHsKLQkgICAgcHJpbnRfY3VyX3RiICgiMTIyMjEiKTsKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjM1NTogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBzaGlmdCB0byBsZWZ0IHdhcyBpbmNvcnJlY3QiKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEJfTlJfSVRFTVMoYmgpOyBpKyssIGRjKyspIHsKKwkJaWYgKCFpc19yZXVzYWJsZShzLCBkY19ibG9ja19udW1iZXIoZGMpLCAxKSkgeworCQkJcHJpbnRfY3VyX3RiKG1lcyk7CisJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCSAgICAgICAiUEFQLTEyMzM4OiBjaGVja19pbnRlcm5hbF9ub2RlOiBpbnZhbGlkIGNoaWxkIHBvaW50ZXIgJXkgaW4gJWIiLAorCQkJCSAgICAgICBkYywgYmgpOworCQl9CiAJfQotICAgIH0KLSAgICBpZiAodGItPnJudW1bMF0pIHsKLQlpZiAoQl9GUkVFX1NQQUNFICh0Yi0+UlswXSkgIT0gCi0JICAgIE1BWF9DSElMRF9TSVpFICh0Yi0+UlswXSkgLSBkY19zaXplKEJfTl9DSElMRCAodGItPkZSWzBdLCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKSkpKSB7Ci0JICAgIHByaW50X2N1cl90YiAoIjEyMjIyIik7Ci0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNjA6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gcmlnaHQgd2FzIGluY29ycmVjdCIpOworfQorCitzdGF0aWMgaW50IGxvY2tlZF9vcl9ub3RfaW5fdHJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBjaGFyICp3aGljaCkKK3sKKwlpZiAoKCFidWZmZXJfam91cm5hbF9wcmVwYXJlZChiaCkgJiYgYnVmZmVyX2xvY2tlZChiaCkpIHx8CisJICAgICFCX0lTX0lOX1RSRUUoYmgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgInZzLTEyMzM5OiBsb2NrZWRfb3Jfbm90X2luX3RyZWU6ICVzICglYikiLAorCQkJCSB3aGljaCwgYmgpOworCQlyZXR1cm4gMTsKIAl9Ci0gICAgfQotICAgIGlmIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSAmJgotCShCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSAhPSAKLQkJICAgIChNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpIC0KLQkJICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKLQkJICAgIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpKSkpICkpIHsKLQlpbnQgbGVmdCA9IEJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpOwotCWludCByaWdodCA9IChNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpIC0KLQkJICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKLQkJCVBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpKSkpOwotCXByaW50X2N1cl90YiAoIjEyMjIzIik7Ci0JcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAotCSAgICAiQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgPSAlZDsgIgotICAgIAkgICAgIk1BWF9DSElMRF9TSVpFICglZCkgLSBkY19zaXplKCAleSwgJWQgKSBbJWRdID0gJWQiLAotCSAgICBsZWZ0LAotCSAgICBNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpLAotCSAgICBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKLQkgICAgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSksCi0JICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSApKSApLAotCSAgICByaWdodCApOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNjU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogUyBpcyBpbmNvcnJlY3QiKTsKLSAgICB9CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9sZXZlbCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQorc3RhdGljIGludCBjaGVja19iZWZvcmVfYmFsYW5jaW5nKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICBjaGVja19sZWFmICh0Yi0+TFswXSk7Ci0gIGNoZWNrX2xlYWYgKHRiLT5SWzBdKTsKLSAgY2hlY2tfbGVhZiAoUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKSk7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY3VyX3RiKSB7CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgInZzLTEyMzM1OiBjaGVja19iZWZvcmVfYmFsYW5jaW5nOiAiCisJCQkgICAgICAgInN1c3BlY3QgdGhhdCBzY2hlZHVsZSBvY2N1cnJlZCBiYXNlZCBvbiBjdXJfdGIgbm90IGJlaW5nIG51bGwgYXQgdGhpcyBwb2ludCBpbiBjb2RlLiAiCisJCQkgICAgICAgImRvX2JhbGFuY2UgY2Fubm90IHByb3Blcmx5IGhhbmRsZSBzY2hlZHVsZSBvY2N1cnJpbmcgd2hpbGUgaXQgcnVucy4iKTsKKwl9CisKKwkvKiBkb3VibGUgY2hlY2sgdGhhdCBidWZmZXJzIHRoYXQgd2Ugd2lsbCBtb2RpZnkgYXJlIHVubG9ja2VkLiAoZml4X25vZGVzIHNob3VsZCBhbHJlYWR5IGhhdmUKKwkgICBwcmVwcGVkIGFsbCBvZiB0aGVzZSBmb3IgdXMpLiAqLworCWlmICh0Yi0+bG51bVswXSkgeworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5MWzBdLCAiTFswXSIpOworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5GTFswXSwgIkZMWzBdIik7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPkNGTFswXSwgIkNGTFswXSIpOworCQljaGVja19sZWFmKHRiLT5MWzBdKTsKKwl9CisJaWYgKHRiLT5ybnVtWzBdKSB7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPlJbMF0sICJSWzBdIik7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPkZSWzBdLCAiRlJbMF0iKTsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+Q0ZSWzBdLCAiQ0ZSWzBdIik7CisJCWNoZWNrX2xlYWYodGItPlJbMF0pOworCX0KKwlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKFBBVEhfUExBU1RfQlVGRkVSKHRiLT50Yl9wYXRoKSwgIlNbMF0iKTsKKwljaGVja19sZWFmKFBBVEhfUExBU1RfQlVGRkVSKHRiLT50Yl9wYXRoKSk7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9sZXZlbHMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0YXRpYyB2b2lkIGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgaW50IGg7CisJaWYgKHRiLT5sbnVtWzBdKSB7CisJCWlmIChCX0ZSRUVfU1BBQ0UodGItPkxbMF0pICE9CisJCSAgICBNQVhfQ0hJTERfU0laRSh0Yi0+TFswXSkgLQorCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQKKwkJCSAgICAodGItPkZMWzBdLCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCkpKSkgeworCQkJcHJpbnRfY3VyX3RiKCIxMjIyMSIpOworCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTEyMzU1OiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIGxlZnQgd2FzIGluY29ycmVjdCIpOworCQl9CisJfQorCWlmICh0Yi0+cm51bVswXSkgeworCQlpZiAoQl9GUkVFX1NQQUNFKHRiLT5SWzBdKSAhPQorCQkgICAgTUFYX0NISUxEX1NJWkUodGItPlJbMF0pIC0KKwkJICAgIGRjX3NpemUoQl9OX0NISUxECisJCQkgICAgKHRiLT5GUlswXSwgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKSkpKSB7CisJCQlwcmludF9jdXJfdGIoIjEyMjIyIik7CisJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJICAgICAgICJQQVAtMTIzNjA6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gcmlnaHQgd2FzIGluY29ycmVjdCIpOworCQl9CisJfQorCWlmIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMSkgJiYKKwkgICAgKEJfRlJFRV9TUEFDRShQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMCkpICE9CisJICAgICAoTUFYX0NISUxEX1NJWkUoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApKSAtCisJICAgICAgZGNfc2l6ZShCX05fQ0hJTEQoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDEpLAorCQkJCVBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSkpKSkpKSB7CisJCWludCBsZWZ0ID0gQl9GUkVFX1NQQUNFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKSk7CisJCWludCByaWdodCA9IChNQVhfQ0hJTERfU0laRShQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMCkpIC0KKwkJCSAgICAgZGNfc2l6ZShCX05fQ0hJTEQoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDEpLAorCQkJCQkgICAgICAgUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLAorCQkJCQkJCSAgICAgICAxKSkpKTsKKwkJcHJpbnRfY3VyX3RiKCIxMjIyMyIpOworCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkgIkJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpID0gJWQ7ICIKKwkJCQkgIk1BWF9DSElMRF9TSVpFICglZCkgLSBkY19zaXplKCAleSwgJWQgKSBbJWRdID0gJWQiLAorCQkJCSBsZWZ0LAorCQkJCSBNQVhfQ0hJTERfU0laRShQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMCkpLAorCQkJCSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMSksCisJCQkJIFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSksCisJCQkJIGRjX3NpemUoQl9OX0NISUxECisJCQkJCSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDEpLAorCQkJCQkgIFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSkpKSwKKwkJCQkgcmlnaHQpOworCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC0xMjM2NTogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBTIGlzIGluY29ycmVjdCIpOworCX0KK30KIAotICAvKiBjaGVjayBhbGwgaW50ZXJuYWwgbm9kZXMgKi8KLSAgZm9yIChoID0gMTsgdGItPmluc2VydF9zaXplW2hdOyBoICsrKSB7Ci0gICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpLCAiQkFEIEJVRkZFUiBPTiBQQVRIIik7Ci0gICAgaWYgKHRiLT5sbnVtW2hdKQotICAgICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCB0Yi0+TFtoXSwgIkJBRCBMIik7Ci0gICAgaWYgKHRiLT5ybnVtW2hdKQotICAgICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCB0Yi0+UltoXSwgIkJBRCBSIik7Ci0gIH0KK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWZfbGV2ZWwoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCit7CisJY2hlY2tfbGVhZih0Yi0+TFswXSk7CisJY2hlY2tfbGVhZih0Yi0+UlswXSk7CisJY2hlY2tfbGVhZihQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCkpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9sZXZlbHMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCit7CisJaW50IGg7CisKKwkvKiBjaGVjayBhbGwgaW50ZXJuYWwgbm9kZXMgKi8KKwlmb3IgKGggPSAxOyB0Yi0+aW5zZXJ0X3NpemVbaF07IGgrKykgeworCQljaGVja19pbnRlcm5hbF9ub2RlKHRiLT50Yl9zYiwgUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpLAorCQkJCSAgICAiQkFEIEJVRkZFUiBPTiBQQVRIIik7CisJCWlmICh0Yi0+bG51bVtoXSkKKwkJCWNoZWNrX2ludGVybmFsX25vZGUodGItPnRiX3NiLCB0Yi0+TFtoXSwgIkJBRCBMIik7CisJCWlmICh0Yi0+cm51bVtoXSkKKwkJCWNoZWNrX2ludGVybmFsX25vZGUodGItPnRiX3NiLCB0Yi0+UltoXSwgIkJBRCBSIik7CisJfQogCiB9CiAKICNlbmRpZgogCi0KLQotCi0KLQogLyogTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBidWZmZXJzIHRoYXQgbXVzdCBiZSB1c2VkIGluIGJhbGFuY2luZyBvZgogICAgdGhlIHRyZWUuICBXZSByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc2NoZWR1bGUoKSB3aWxsIG5vdCBvY2N1cgogICAgd2hpbGUgZG9fYmFsYW5jZSB3b3Jrcy4gKCBPbmx5IGludGVycnVwdCBoYW5kbGVycyBhcmUgYWNjZXB0YWJsZS4pCkBAIC0xNDg0LDExNCArMjAyOSwxMDkgQEAKIAogKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2Vfc3RhcnRzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX3N0YXJ0cyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgICAvKiB1c2UgcHJpbnRfY3VyX3RiKCkgdG8gc2VlIGluaXRpYWwgc3RhdGUgb2Ygc3RydWN0Ci0gICAgICAgdHJlZV9iYWxhbmNlICovCisJLyogdXNlIHByaW50X2N1cl90YigpIHRvIHNlZSBpbml0aWFsIHN0YXRlIG9mIHN0cnVjdAorCSAgIHRyZWVfYmFsYW5jZSAqLwogCi0gICAgLyogc3RvcmVfcHJpbnRfdGIgKHRiKTsgKi8KKwkvKiBzdG9yZV9wcmludF90YiAodGIpOyAqLwogCi0gICAgLyogZG8gbm90IGRlbGV0ZSwganVzdCBjb21tZW50IGl0IG91dCAqLworCS8qIGRvIG5vdCBkZWxldGUsIGp1c3QgY29tbWVudCBpdCBvdXQgKi8KIC8qICAgIHByaW50X3RiKGZsYWcsIFBBVEhfTEFTVF9QT1NJVElPTih0Yi0+dGJfcGF0aCksIHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbSwgdGIsIAogCSAgICAgImNoZWNrIik7Ki8KLSAgICBSRkFMU0UoIGNoZWNrX2JlZm9yZV9iYWxhbmNpbmcgKHRiKSwgIlBBUC0xMjM0MDogbG9ja2VkIGJ1ZmZlcnMgaW4gVEIiKTsKKwlSRkFMU0UoY2hlY2tfYmVmb3JlX2JhbGFuY2luZyh0YiksICJQQVAtMTIzNDA6IGxvY2tlZCBidWZmZXJzIGluIFRCIik7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgY3VyX3RiID0gdGI7CisJY3VyX3RiID0gdGI7CiAjZW5kaWYKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9jb21wbGV0ZWQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX2NvbXBsZXRlZChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgICAKKwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGNoZWNrX2xlYWZfbGV2ZWwgKHRiKTsKLSAgICBjaGVja19pbnRlcm5hbF9sZXZlbHMgKHRiKTsKLSAgICBjdXJfdGIgPSBOVUxMOworCWNoZWNrX2xlYWZfbGV2ZWwodGIpOworCWNoZWNrX2ludGVybmFsX2xldmVscyh0Yik7CisJY3VyX3RiID0gTlVMTDsKICNlbmRpZgogCi0gICAgLyogcmVpc2VyZnNfZnJlZV9ibG9jayBpcyBubyBsb25nZXIgc2NoZWR1bGUgc2FmZS4gIFNvLCB3ZSBuZWVkIHRvCi0gICAgKiogcHV0IHRoZSBidWZmZXJzIHdlIHdhbnQgZnJlZWQgb24gdGhlIHRocm93biBsaXN0IGR1cmluZyBkb19iYWxhbmNlLAotICAgICoqIGFuZCB0aGVuIGZyZWUgdGhlbSBub3cKLSAgICAqLworCS8qIHJlaXNlcmZzX2ZyZWVfYmxvY2sgaXMgbm8gbG9uZ2VyIHNjaGVkdWxlIHNhZmUuICBTbywgd2UgbmVlZCB0bworCSAqKiBwdXQgdGhlIGJ1ZmZlcnMgd2Ugd2FudCBmcmVlZCBvbiB0aGUgdGhyb3duIGxpc3QgZHVyaW5nIGRvX2JhbGFuY2UsCisJICoqIGFuZCB0aGVuIGZyZWUgdGhlbSBub3cKKwkgKi8KIAotICAgIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfZG9fYmFsYW5jZSArKzsKKwlSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UrKzsKIAotCi0gICAgLyogcmVsZWFzZSBhbGwgbm9kZXMgaG9sZCB0byBwZXJmb3JtIHRoZSBiYWxhbmNpbmcgKi8KLSAgICB1bmZpeF9ub2Rlcyh0Yik7Ci0KLSAgICBmcmVlX3Rocm93bih0YikgOwotfQotCi0KLQotCi0KLXZvaWQgZG9fYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAvKiB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlICovCi0JCSBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCSAgIC8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKi8KLQkJIGNvbnN0IGNoYXIgKiBib2R5LCAgLyogYm9keSAgb2YgaW5zZXJ0ZWQgaXRlbSBvciBieXRlcyB0byBwYXN0ZSAqLwotCQkgaW50IGZsYWcpICAvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlCi0JCQkgICAgICAgYyAtIGN1dCwgcCAtIHBhc3RlCi0JCQkJCQkgICAgICAKLQkJCSAgICAgICBDdXQgbWVhbnMgZGVsZXRlIHBhcnQgb2YgYW4gaXRlbQotCQkJICAgICAgIChpbmNsdWRlcyByZW1vdmluZyBhbiBlbnRyeSBmcm9tIGEKLQkJCSAgICAgICBkaXJlY3RvcnkpLgotCQkJCQkJICAgICAgCi0JCQkgICAgICAgRGVsZXRlIG1lYW5zIGRlbGV0ZSB3aG9sZSBpdGVtLgotCQkJCQkJICAgICAgCi0JCQkgICAgICAgSW5zZXJ0IG1lYW5zIGFkZCBhIG5ldyBpdGVtIGludG8gdGhlCi0JCQkgICAgICAgdHJlZS4KLQkJCQkJCSAgICAgIAkJCQkJCSAgICAgIAotCQkJICAgICAgIFBhc3RlIG1lYW5zIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mIGFuCi0JCQkgICAgICAgZXhpc3RpbmcgZmlsZSBvciB0byBpbnNlcnQgYSBkaXJlY3RvcnkKLQkJCSAgICAgICBlbnRyeS4gICovCi17Ci0gICAgaW50IGNoaWxkX3BvcywgLyogcG9zaXRpb24gb2YgYSBjaGlsZCBub2RlIGluIGl0cyBwYXJlbnQgKi8KLQloOwkgICAvKiBsZXZlbCBvZiB0aGUgdHJlZSBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluc2VydF9rZXlbMl07IC8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbAotCQkJCSAgICAgICB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKLQkJCQkgICAgICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0Ci0JCQkJICAgICAgIGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCi0JCQkJICAgICAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzCi0JCQkJICAgICAgIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCi0JCQkJICAgICAgIHBvaW50ZXJzICovCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbnNlcnRfcHRyWzJdOyAvKiBpbnNlcnRlZCBub2RlLXB0cnMgZm9yIHRoZSBuZXh0Ci0JCQkJCSAgbGV2ZWwgKi8KLQotICAgIHRiLT50Yl9tb2RlID0gZmxhZzsKLSAgICB0Yi0+bmVlZF9iYWxhbmNlX2RpcnR5ID0gMDsKLQotICAgIGlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIodGIpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgImNsbS02MDAwOiBkb19iYWxhbmNlLCBmcyBnZW5lcmF0aW9uIGhhcyBjaGFuZ2VkXG4iKSA7Ci0gICAgfQotICAgIC8qIGlmIHdlIGhhdmUgbm8gcmVhbCB3b3JrIHRvIGRvICAqLwotICAgIGlmICggISB0Yi0+aW5zZXJ0X3NpemVbMF0gKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAotCQkJICAiUEFQLTEyMzUwOiBkb19iYWxhbmNlOiBpbnNlcnRfc2l6ZSA9PSAwLCBtb2RlID09ICVjIiwKLQkJCSAgZmxhZyk7CisJLyogcmVsZWFzZSBhbGwgbm9kZXMgaG9sZCB0byBwZXJmb3JtIHRoZSBiYWxhbmNpbmcgKi8KIAl1bmZpeF9ub2Rlcyh0Yik7Ci0JcmV0dXJuOwotICAgIH0KIAotICAgIGF0b21pY19pbmMgKCYoZnNfZ2VuZXJhdGlvbiAodGItPnRiX3NiKSkpOwotICAgIGRvX2JhbGFuY2Vfc3RhcnRzICh0Yik7Ci0gICAgCisJZnJlZV90aHJvd24odGIpOworfQorCit2b2lkIGRvX2JhbGFuY2Uoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCS8qIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCAqaWgsCS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKi8KKwkJY29uc3QgY2hhciAqYm9keSwJLyogYm9keSAgb2YgaW5zZXJ0ZWQgaXRlbSBvciBieXRlcyB0byBwYXN0ZSAqLworCQlpbnQgZmxhZykKK3sJCQkJLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZQorCQkJCSAgIGMgLSBjdXQsIHAgLSBwYXN0ZQorCisJCQkJICAgQ3V0IG1lYW5zIGRlbGV0ZSBwYXJ0IG9mIGFuIGl0ZW0KKwkJCQkgICAoaW5jbHVkZXMgcmVtb3ZpbmcgYW4gZW50cnkgZnJvbSBhCisJCQkJICAgZGlyZWN0b3J5KS4KKworCQkJCSAgIERlbGV0ZSBtZWFucyBkZWxldGUgd2hvbGUgaXRlbS4KKworCQkJCSAgIEluc2VydCBtZWFucyBhZGQgYSBuZXcgaXRlbSBpbnRvIHRoZQorCQkJCSAgIHRyZWUuCisKKwkJCQkgICBQYXN0ZSBtZWFucyB0byBhcHBlbmQgdG8gdGhlIGVuZCBvZiBhbgorCQkJCSAgIGV4aXN0aW5nIGZpbGUgb3IgdG8gaW5zZXJ0IGEgZGlyZWN0b3J5CisJCQkJICAgZW50cnkuICAqLworCWludCBjaGlsZF9wb3MsCQkvKiBwb3NpdGlvbiBvZiBhIGNoaWxkIG5vZGUgaW4gaXRzIHBhcmVudCAqLworCSBoOwkJCS8qIGxldmVsIG9mIHRoZSB0cmVlIGJlaW5nIHByb2Nlc3NlZCAqLworCXN0cnVjdCBpdGVtX2hlYWQgaW5zZXJ0X2tleVsyXTsJLyogaW4gb3VyIHByb2Nlc3Npbmcgb2Ygb25lIGxldmVsCisJCQkJCSAgIHdlIHNvbWV0aW1lcyBkZXRlcm1pbmUgd2hhdAorCQkJCQkgICBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIG5leHQKKwkJCQkJICAgaGlnaGVyIGxldmVsLiAgVGhpcyBpbnNlcnRpb24KKwkJCQkJICAgY29uc2lzdHMgb2YgYSBrZXkgb3IgdHdvIGtleXMKKwkJCQkJICAgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKKwkJCQkJICAgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmluc2VydF9wdHJbMl07CS8qIGluc2VydGVkIG5vZGUtcHRycyBmb3IgdGhlIG5leHQKKwkJCQkJCSAgIGxldmVsICovCisKKwl0Yi0+dGJfbW9kZSA9IGZsYWc7CisJdGItPm5lZWRfYmFsYW5jZV9kaXJ0eSA9IDA7CisKKwlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkgeworCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkgICAgICAgImNsbS02MDAwOiBkb19iYWxhbmNlLCBmcyBnZW5lcmF0aW9uIGhhcyBjaGFuZ2VkXG4iKTsKKwl9CisJLyogaWYgd2UgaGF2ZSBubyByZWFsIHdvcmsgdG8gZG8gICovCisJaWYgKCF0Yi0+aW5zZXJ0X3NpemVbMF0pIHsKKwkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsCisJCQkJICJQQVAtMTIzNTA6IGRvX2JhbGFuY2U6IGluc2VydF9zaXplID09IDAsIG1vZGUgPT0gJWMiLAorCQkJCSBmbGFnKTsKKwkJdW5maXhfbm9kZXModGIpOworCQlyZXR1cm47CisJfQorCisJYXRvbWljX2luYygmKGZzX2dlbmVyYXRpb24odGItPnRiX3NiKSkpOworCWRvX2JhbGFuY2Vfc3RhcnRzKHRiKTsKKwogCS8qIGJhbGFuY2UgbGVhZiByZXR1cm5zIDAgZXhjZXB0IGlmIGNvbWJpbmluZyBMIFIgYW5kIFMgaW50bwogCSAgIG9uZSBub2RlLiAgc2VlIGJhbGFuY2VfaW50ZXJuYWwoKSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcwotCSAgIGxpbmUgb2YgY29kZS4qLwotCWNoaWxkX3BvcyA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCAwKSArCi0JICBiYWxhbmNlX2xlYWYgKHRiLCBpaCwgYm9keSwgZmxhZywgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CisJICAgbGluZSBvZiBjb2RlLiAqLworCWNoaWxkX3BvcyA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApICsKKwkgICAgYmFsYW5jZV9sZWFmKHRiLCBpaCwgYm9keSwgZmxhZywgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWYgKHRiKTsKKwljaGVja19hZnRlcl9iYWxhbmNlX2xlYWYodGIpOwogI2VuZGlmCiAKLSAgICAvKiBCYWxhbmNlIGludGVybmFsIGxldmVsIG9mIHRoZSB0cmVlLiAqLwotICAgIGZvciAoIGggPSAxOyBoIDwgTUFYX0hFSUdIVCAmJiB0Yi0+aW5zZXJ0X3NpemVbaF07IGgrKyApCi0JY2hpbGRfcG9zID0gYmFsYW5jZV9pbnRlcm5hbCAodGIsIGgsIGNoaWxkX3BvcywgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CisJLyogQmFsYW5jZSBpbnRlcm5hbCBsZXZlbCBvZiB0aGUgdHJlZS4gKi8KKwlmb3IgKGggPSAxOyBoIDwgTUFYX0hFSUdIVCAmJiB0Yi0+aW5zZXJ0X3NpemVbaF07IGgrKykKKwkJY2hpbGRfcG9zID0KKwkJICAgIGJhbGFuY2VfaW50ZXJuYWwodGIsIGgsIGNoaWxkX3BvcywgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CiAKLQotICAgIGRvX2JhbGFuY2VfY29tcGxldGVkICh0Yik7CisJZG9fYmFsYW5jZV9jb21wbGV0ZWQodGIpOwogCiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKaW5kZXggMTJlOTEyMC4uYzlmMTc4ZiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZmlsZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwpAQCAtMiw3ICsyLDYgQEAKICAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCiAgKi8KIAotCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CkBAIC0zMSw4MiArMzAsODQgQEAKICoqIFdlIHVzZSByZWlzZXJmc190cnVuY2F0ZV9maWxlIHRvIHBhY2sgdGhlIHRhaWwsIHNpbmNlIGl0IGFscmVhZHkgaGFzCiAqKiBhbGwgdGhlIGNvbmRpdGlvbnMgY29kZWQuICAKICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2ZpbGVfcmVsZWFzZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCi0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGVycjsKLSAgICBpbnQgamJlZ2luX2ZhaWx1cmUgPSAwOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IGVycjsKKwlpbnQgamJlZ2luX2ZhaWx1cmUgPSAwOwogCi0gICAgaWYgKCFTX0lTUkVHIChpbm9kZS0+aV9tb2RlKSkKLQlCVUcgKCk7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlCVUcoKTsKIAotICAgIC8qIGZhc3Qgb3V0IGZvciB3aGVuIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSAqLwotICAgIGlmICgoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEgfHwKLQkhKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHx8IAotICAgICAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZChpbm9kZSkpICAgICAgICYmIAotCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKLQlyZXR1cm4gMDsKLSAgICB9ICAgIAotICAgIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIGRvd24gKCZpbm9kZS0+aV9zZW0pOyAKLSAgICAvKiBmcmVlaW5nIHByZWFsbG9jYXRpb24gb25seSBpbnZvbHZlcyByZWxvZ2dpbmcgYmxvY2tzIHRoYXQKLSAgICAgKiBhcmUgYWxyZWFkeSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIHByZWFsbG9jYXRpb24gZ2V0cwotICAgICAqIGZyZWVkIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFuc2FjdGlvbiwgc28gaXQgaXMgaW1wb3NzaWJsZSBmb3IKLSAgICAgKiB1cyB0byBsb2cgYW55IGFkZGl0aW9uYWwgYmxvY2tzIChpbmNsdWRpbmcgcXVvdGEgYmxvY2tzKQotICAgICAqLwotICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0gICAgaWYgKGVycikgewotCS8qIHVoIG9oLCB3ZSBjYW4ndCBhbGxvdyB0aGUgaW5vZGUgdG8gZ28gYXdheSB3aGlsZSB0aGVyZQotCSAqIGlzIHN0aWxsIHByZWFsbG9jYXRpb24gYmxvY2tzIHBlbmRpbmcuICBUcnkgdG8gam9pbiB0aGUKLQkgKiBhYm9ydGVkIHRyYW5zYWN0aW9uCi0JICovCi0JamJlZ2luX2ZhaWx1cmUgPSBlcnI7Ci0JZXJyID0gam91cm5hbF9qb2luX2Fib3J0KCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwotCi0JaWYgKGVycikgewotCSAgICAvKiBobXBmLCBvdXIgY2hvaWNlcyBoZXJlIGFyZW4ndCBnb29kLiAgV2UgY2FuIHBpbiB0aGUgaW5vZGUKLQkgICAgICogd2hpY2ggd2lsbCBkaXNhbGxvdyB1bm1vdW50IGZyb20gZXZlcnkgaGFwcGVuaW5nLCB3ZSBjYW4KLQkgICAgICogZG8gbm90aGluZywgd2hpY2ggd2lsbCBjb3JydXB0IHJhbmRvbSBtZW1vcnkgb24gdW5tb3VudCwKLQkgICAgICogb3Igd2UgY2FuIGZvcmNpYmx5IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBwcmVhbGxvY2F0aW9uCi0JICAgICAqIGxpc3QsIHdoaWNoIHdpbGwgbGVhayBibG9ja3Mgb24gZGlzay4gIExldHMgcGluIHRoZSBpbm9kZQotCSAgICAgKiBhbmQgbGV0IHRoZSBhZG1pbiBrbm93IHdoYXQgaXMgZ29pbmcgb24uCi0JICAgICAqLwotCSAgICBpZ3JhYihpbm9kZSk7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJwaW5uaW5nIGlub2RlICVsdSBiZWNhdXNlIHRoZSAiCi0JICAgICAgICAgICAgICAgICAgICAgInByZWFsbG9jYXRpb24gY2FuJ3QgYmUgZnJlZWQiKTsKLQkgICAgZ290byBvdXQ7CisJLyogZmFzdCBvdXQgZm9yIHdoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lICovCisJaWYgKChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpID4gMSB8fAorCSAgICAgIShSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB8fAorCSAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZChpbm9kZSkpICYmCisJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKKwkJcmV0dXJuIDA7CiAJfQotICAgIH0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJLyogZnJlZWluZyBwcmVhbGxvY2F0aW9uIG9ubHkgaW52b2x2ZXMgcmVsb2dnaW5nIGJsb2NrcyB0aGF0CisJICogYXJlIGFscmVhZHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBwcmVhbGxvY2F0aW9uIGdldHMKKwkgKiBmcmVlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdHJhbnNhY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgZm9yCisJICogdXMgdG8gbG9nIGFueSBhZGRpdGlvbmFsIGJsb2NrcyAoaW5jbHVkaW5nIHF1b3RhIGJsb2NrcykKKwkgKi8KKwllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCWlmIChlcnIpIHsKKwkJLyogdWggb2gsIHdlIGNhbid0IGFsbG93IHRoZSBpbm9kZSB0byBnbyBhd2F5IHdoaWxlIHRoZXJlCisJCSAqIGlzIHN0aWxsIHByZWFsbG9jYXRpb24gYmxvY2tzIHBlbmRpbmcuICBUcnkgdG8gam9pbiB0aGUKKwkJICogYWJvcnRlZCB0cmFuc2FjdGlvbgorCQkgKi8KKwkJamJlZ2luX2ZhaWx1cmUgPSBlcnI7CisJCWVyciA9IGpvdXJuYWxfam9pbl9hYm9ydCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKworCQlpZiAoZXJyKSB7CisJCQkvKiBobXBmLCBvdXIgY2hvaWNlcyBoZXJlIGFyZW4ndCBnb29kLiAgV2UgY2FuIHBpbiB0aGUgaW5vZGUKKwkJCSAqIHdoaWNoIHdpbGwgZGlzYWxsb3cgdW5tb3VudCBmcm9tIGV2ZXJ5IGhhcHBlbmluZywgd2UgY2FuCisJCQkgKiBkbyBub3RoaW5nLCB3aGljaCB3aWxsIGNvcnJ1cHQgcmFuZG9tIG1lbW9yeSBvbiB1bm1vdW50LAorCQkJICogb3Igd2UgY2FuIGZvcmNpYmx5IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBwcmVhbGxvY2F0aW9uCisJCQkgKiBsaXN0LCB3aGljaCB3aWxsIGxlYWsgYmxvY2tzIG9uIGRpc2suICBMZXRzIHBpbiB0aGUgaW5vZGUKKwkJCSAqIGFuZCBsZXQgdGhlIGFkbWluIGtub3cgd2hhdCBpcyBnb2luZyBvbi4KKwkJCSAqLworCQkJaWdyYWIoaW5vZGUpOworCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJwaW5uaW5nIGlub2RlICVsdSBiZWNhdXNlIHRoZSAiCisJCQkJCSAicHJlYWxsb2NhdGlvbiBjYW4ndCBiZSBmcmVlZCIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi0gICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoJnRoLCBpbm9kZSk7CisJcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYygmdGgsIGlub2RlKTsKICNlbmRpZgotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwogCi0gICAgLyogY29weSBiYWNrIHRoZSBlcnJvciBjb2RlIGZyb20gam91cm5hbF9iZWdpbiAqLwotICAgIGlmICghZXJyKQotICAgICAgICBlcnIgPSBqYmVnaW5fZmFpbHVyZTsKKwkvKiBjb3B5IGJhY2sgdGhlIGVycm9yIGNvZGUgZnJvbSBqb3VybmFsX2JlZ2luICovCisJaWYgKCFlcnIpCisJCWVyciA9IGpiZWdpbl9mYWlsdXJlOwogCi0gICAgaWYgKCFlcnIgJiYgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA8PSAxICYmCi0JKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spICYmCi0gICAgICAgIHRhaWxfaGFzX3RvX2JlX3BhY2tlZCAoaW5vZGUpKSB7Ci0JLyogaWYgcmVndWxhciBmaWxlIGlzIHJlbGVhc2VkIGJ5IGxhc3QgaG9sZGVyIGFuZCBpdCBoYXMgYmVlbgotCSAgIGFwcGVuZGVkICh3ZSBhcHBlbmQgYnkgdW5mb3JtYXR0ZWQgbm9kZSBvbmx5KSBvciBpdHMgZGlyZWN0Ci0JICAgaXRlbShzKSBoYWQgdG8gYmUgY29udmVydGVkLCB0aGVuIGl0IG1heSBoYXZlIHRvIGJlCi0JICAgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnRlZCAqLwotCWVyciA9IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDApIDsKLSAgICB9Ci1vdXQ6Ci0gICAgdXAgKCZpbm9kZS0+aV9zZW0pOyAKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiBlcnI7CisJaWYgKCFlcnIgJiYgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA8PSAxICYmCisJICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSAmJgorCSAgICB0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpKSB7CisJCS8qIGlmIHJlZ3VsYXIgZmlsZSBpcyByZWxlYXNlZCBieSBsYXN0IGhvbGRlciBhbmQgaXQgaGFzIGJlZW4KKwkJICAgYXBwZW5kZWQgKHdlIGFwcGVuZCBieSB1bmZvcm1hdHRlZCBub2RlIG9ubHkpIG9yIGl0cyBkaXJlY3QKKwkJICAgaXRlbShzKSBoYWQgdG8gYmUgY29udmVydGVkLCB0aGVuIGl0IG1heSBoYXZlIHRvIGJlCisJCSAgIGluZGlyZWN0MmRpcmVjdCBjb252ZXJ0ZWQgKi8KKwkJZXJyID0gcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMCk7CisJfQorICAgICAgb3V0OgorCXVwKCZpbm9kZS0+aV9zZW0pOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcmVpc2VyZnNfdmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSkgewotICAgIHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDEpIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMSk7CiB9CiAKIC8qIFN5bmMgYSByZWlzZXJmcyBmaWxlLiAqLwpAQCAtMTE2LDI2ICsxMTcsMjQgQEAKICAqIGJlIHJlbW92ZWQuLi4KICAqLwogCi1zdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZmlsZSgKLQkJCSAgICAgIHN0cnVjdCBmaWxlICAgKiBwX3NfZmlscCwKLQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKiBwX3NfZGVudHJ5LAotCQkJICAgICAgaW50IGRhdGFzeW5jCi0JCQkgICAgICApIHsKLSAgc3RydWN0IGlub2RlICogcF9zX2lub2RlID0gcF9zX2RlbnRyeS0+ZF9pbm9kZTsKLSAgaW50IG5fZXJyOwotICBpbnQgYmFycmllcl9kb25lOworc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKnBfc19maWxwLAorCQkJICAgICAgc3RydWN0IGRlbnRyeSAqcF9zX2RlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqcF9zX2lub2RlID0gcF9zX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgbl9lcnI7CisJaW50IGJhcnJpZXJfZG9uZTsKIAotICBpZiAoIVNfSVNSRUcocF9zX2lub2RlLT5pX21vZGUpKQotICAgICAgQlVHICgpOwotICBuX2VyciA9IHN5bmNfbWFwcGluZ19idWZmZXJzKHBfc19pbm9kZS0+aV9tYXBwaW5nKSA7Ci0gIHJlaXNlcmZzX3dyaXRlX2xvY2socF9zX2lub2RlLT5pX3NiKTsKLSAgYmFycmllcl9kb25lID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShwX3NfaW5vZGUpOwotICByZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKLSAgaWYgKGJhcnJpZXJfZG9uZSAhPSAxKQotICAgICAgYmxrZGV2X2lzc3VlX2ZsdXNoKHBfc19pbm9kZS0+aV9zYi0+c19iZGV2LCBOVUxMKTsKLSAgaWYgKGJhcnJpZXJfZG9uZSA8IDApCi0gICAgcmV0dXJuIGJhcnJpZXJfZG9uZTsKLSAgcmV0dXJuICggbl9lcnIgPCAwICkgPyAtRUlPIDogMDsKKwlpZiAoIVNfSVNSRUcocF9zX2lub2RlLT5pX21vZGUpKQorCQlCVUcoKTsKKwluX2VyciA9IHN5bmNfbWFwcGluZ19idWZmZXJzKHBfc19pbm9kZS0+aV9tYXBwaW5nKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJYmFycmllcl9kb25lID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShwX3NfaW5vZGUpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhwX3NfaW5vZGUtPmlfc2IpOworCWlmIChiYXJyaWVyX2RvbmUgIT0gMSkKKwkJYmxrZGV2X2lzc3VlX2ZsdXNoKHBfc19pbm9kZS0+aV9zYi0+c19iZGV2LCBOVUxMKTsKKwlpZiAoYmFycmllcl9kb25lIDwgMCkKKwkJcmV0dXJuIGJhcnJpZXJfZG9uZTsKKwlyZXR1cm4gKG5fZXJyIDwgMCkgPyAtRUlPIDogMDsKIH0KIAogLyogSSByZWFsbHkgZG8gbm90IHdhbnQgdG8gcGxheSB3aXRoIG1lbW9yeSBzaG9ydGFnZSByaWdodCBub3csIHNvCkBAIC0xNDcsNzAwICsxNDYsNzk3IEBACiAvKiBBbGxvY2F0ZXMgYmxvY2tzIGZvciBhIGZpbGUgdG8gZnVsZmlsIHdyaXRlIHJlcXVlc3QuCiAgICBNYXBzIGFsbCB1bm1hcHBlZCBidXQgcHJlcGFyZWQgcGFnZXMgZnJvbSB0aGUgbGlzdC4KICAgIFVwZGF0ZXMgbWV0YWRhdGEgd2l0aCBuZXdseSBhbGxvY2F0ZWQgYmxvY2tudW1iZXJzIGFzIG5lZWRlZCAqLwotc3RhdGljIGludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAvKiBJbm9kZSB3ZSB3b3JrIHdpdGggKi8KLQkJCQlsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uICovCi0JCQkJaW50IG51bV9wYWdlcywgLyogbnVtYmVyIG9mIHBhZ2VzIHdyaXRlIGdvaW5nCi0JCQkJCQkgIHRvIHRvdWNoICovCi0JCQkJaW50IHdyaXRlX2J5dGVzLCAvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KLQkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBhcnJheSBvZgotCQkJCQkJCSAgICAgICAgIHByZXBhcmVkIHBhZ2VzCi0JCQkJCQkJICAgICAgICovCi0JCQkJaW50IGJsb2Nrc190b19hbGxvY2F0ZSAvKiBBbW91bnQgb2YgYmxvY2tzIHdlCi0JCQkJCQkJICBuZWVkIHRvIGFsbG9jYXRlIHRvCi0JCQkJCQkJICBmaXQgdGhlIGRhdGEgaW50byBmaWxlCi0JCQkJCQkJICovCi0JCQkJKQorc3RhdGljIGludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgd2Ugd29yayB3aXRoICovCisJCQkJCSAgICAgICBsb2ZmX3QgcG9zLAkvKiBXcml0aW5nIHBvc2l0aW9uICovCisJCQkJCSAgICAgICBpbnQgbnVtX3BhZ2VzLAkvKiBudW1iZXIgb2YgcGFnZXMgd3JpdGUgZ29pbmcKKwkJCQkJCQkJICAgdG8gdG91Y2ggKi8KKwkJCQkJICAgICAgIGludCB3cml0ZV9ieXRlcywJLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLAkvKiBhcnJheSBvZgorCQkJCQkJCQkJCSAgIHByZXBhcmVkIHBhZ2VzCisJCQkJCQkJCQkJICovCisJCQkJCSAgICAgICBpbnQgYmxvY2tzX3RvX2FsbG9jYXRlCS8qIEFtb3VudCBvZiBibG9ja3Mgd2UKKwkJCQkJCQkJCSAgIG5lZWQgdG8gYWxsb2NhdGUgdG8KKwkJCQkJCQkJCSAgIGZpdCB0aGUgZGF0YSBpbnRvIGZpbGUKKwkJCQkJCQkJCSAqLworICAgICkKIHsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIGNwdSBrZXkgb2YgaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaDsgLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsgLy8gQnVmZmVyIGhlYWQgdGhhdCBjb250YWlucyBpdGVtcyB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKLSAgICBfX2xlMzIgKiBpdGVtOyAvLyBwb2ludGVyIHRvIGl0ZW0gd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsgLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCi0gICAgYl9ibG9ja25yX3QgKmFsbG9jYXRlZF9ibG9ja3M7IC8vIFBvaW50ZXIgdG8gYSBwbGFjZSB3aGVyZSBhbGxvY2F0ZWQgYmxvY2tudW1iZXJzIHdvdWxkIGJlIHN0b3JlZC4KLSAgICByZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50OyAvLyBoaW50IHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yLgotICAgIHNpemVfdCByZXM7IC8vIHJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IHdlIGNhbGwuCi0gICAgaW50IGN1cnJfYmxvY2s7IC8vIGN1cnJlbnQgYmxvY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHVubWFwcGVkIGJsb2Nrcy4KLSAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyCi0gICAgaW50IGl0ZW1wb3M7IC8vIHBvc2l0aW9uIGluIGl0ZW0KLSAgICB1bnNpZ25lZCBpbnQgZnJvbSA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOyAvLyB3cml0aW5nIHBvc2l0aW9uIGluCi0JCQkJCQkgICAgICAgLy8gZmlyc3QgcGFnZQotICAgIHVuc2lnbmVkIGludCB0byA9ICgocG9zICsgd3JpdGVfYnl0ZXMgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOyAvKiBsYXN0IG1vZGlmaWVkIGJ5dGUgb2Zmc2V0IGluIGxhc3QgcGFnZSAqLwotICAgIF9fdTY0IGhvbGVfc2l6ZSA7IC8vIGFtb3VudCBvZiBibG9ja3MgZm9yIGEgZmlsZSBob2xlLCBpZiBpdCBuZWVkZWQgdG8gYmUgY3JlYXRlZC4KLSAgICBpbnQgbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7IC8vIEZsYWcgZm9yIGl0ZW1zIHRyYXZlcnNhbCBjb2RlIHRvIGtlZXAgdHJhY2sKLQkJCQkgLy8gb2YgdGhlIGZhY3QgdGhhdCB3ZSBhbHJlYWR5IHByZXBhcmVkCi0JCQkJIC8vIGN1cnJlbnQgYmxvY2sgZm9yIGpvdXJuYWwKLSAgICBpbnQgd2lsbF9wcmVhbGxvYyA9IDA7Ci0gICAgUkZBTFNFKCFibG9ja3NfdG9fYWxsb2NhdGUsICJncmVlbi05MDA0OiB0cmllZCB0byBhbGxvY2F0ZSB6ZXJvIGJsb2Nrcz8iKTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CS8vIGNwdSBrZXkgb2YgaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsJLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsJLy8gQnVmZmVyIGhlYWQgdGhhdCBjb250YWlucyBpdGVtcyB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlfX2xlMzIgKml0ZW07CQkvLyBwb2ludGVyIHRvIGl0ZW0gd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsJLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCisJYl9ibG9ja25yX3QgKmFsbG9jYXRlZF9ibG9ja3M7CS8vIFBvaW50ZXIgdG8gYSBwbGFjZSB3aGVyZSBhbGxvY2F0ZWQgYmxvY2tudW1iZXJzIHdvdWxkIGJlIHN0b3JlZC4KKwlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50OwkvLyBoaW50IHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yLgorCXNpemVfdCByZXM7CQkvLyByZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCB3ZSBjYWxsLgorCWludCBjdXJyX2Jsb2NrOwkJLy8gY3VycmVudCBibG9jayB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5tYXBwZWQgYmxvY2tzLgorCWludCBpOwkJCS8vIGxvb3AgY291bnRlcgorCWludCBpdGVtcG9zOwkJLy8gcG9zaXRpb24gaW4gaXRlbQorCXVuc2lnbmVkIGludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CS8vIHdyaXRpbmcgcG9zaXRpb24gaW4KKwkvLyBmaXJzdCBwYWdlCisJdW5zaWduZWQgaW50IHRvID0gKChwb3MgKyB3cml0ZV9ieXRlcyAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDE7CS8qIGxhc3QgbW9kaWZpZWQgYnl0ZSBvZmZzZXQgaW4gbGFzdCBwYWdlICovCisJX191NjQgaG9sZV9zaXplOwkvLyBhbW91bnQgb2YgYmxvY2tzIGZvciBhIGZpbGUgaG9sZSwgaWYgaXQgbmVlZGVkIHRvIGJlIGNyZWF0ZWQuCisJaW50IG1vZGlmeWluZ190aGlzX2l0ZW0gPSAwOwkvLyBGbGFnIGZvciBpdGVtcyB0cmF2ZXJzYWwgY29kZSB0byBrZWVwIHRyYWNrCisJLy8gb2YgdGhlIGZhY3QgdGhhdCB3ZSBhbHJlYWR5IHByZXBhcmVkCisJLy8gY3VycmVudCBibG9jayBmb3Igam91cm5hbAorCWludCB3aWxsX3ByZWFsbG9jID0gMDsKKwlSRkFMU0UoIWJsb2Nrc190b19hbGxvY2F0ZSwKKwkgICAgICAgImdyZWVuLTkwMDQ6IHRyaWVkIHRvIGFsbG9jYXRlIHplcm8gYmxvY2tzPyIpOwogCi0gICAgLyogb25seSBwcmVhbGxvY2F0ZSBpZiB0aGlzIGlzIGEgc21hbGwgd3JpdGUgKi8KLSAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgfHwKLSAgICAgICAoISh3cml0ZV9ieXRlcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLTEpKSAmJgotICAgICAgICBibG9ja3NfdG9fYWxsb2NhdGUgPAotICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUpKQotICAgICAgICB3aWxsX3ByZWFsbG9jID0gUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplOworCS8qIG9ubHkgcHJlYWxsb2NhdGUgaWYgdGhpcyBpcyBhIHNtYWxsIHdyaXRlICovCisJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IHx8CisJICAgICghKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSAmJgorCSAgICAgYmxvY2tzX3RvX2FsbG9jYXRlIDwKKwkgICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSkpCisJCXdpbGxfcHJlYWxsb2MgPQorCQkgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplOwogCi0gICAgYWxsb2NhdGVkX2Jsb2NrcyA9IGttYWxsb2MoKGJsb2Nrc190b19hbGxvY2F0ZSArIHdpbGxfcHJlYWxsb2MpICoKLSAgICAJCQkJCXNpemVvZihiX2Jsb2NrbnJfdCksIEdGUF9OT0ZTKTsKKwlhbGxvY2F0ZWRfYmxvY2tzID0ga21hbGxvYygoYmxvY2tzX3RvX2FsbG9jYXRlICsgd2lsbF9wcmVhbGxvYykgKgorCQkJCSAgIHNpemVvZihiX2Jsb2NrbnJfdCksIEdGUF9OT0ZTKTsKIAotICAgIC8qIEZpcnN0IHdlIGNvbXBvc2UgYSBrZXkgdG8gcG9pbnQgYXQgdGhlIHdyaXRpbmcgcG9zaXRpb24sIHdlIHdhbnQgdG8gZG8KLSAgICAgICB0aGF0IG91dHNpZGUgb2YgYW55IGxvY2tpbmcgcmVnaW9uLiAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIHBvcysxLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKKwkvKiBGaXJzdCB3ZSBjb21wb3NlIGEga2V5IHRvIHBvaW50IGF0IHRoZSB3cml0aW5nIHBvc2l0aW9uLCB3ZSB3YW50IHRvIGRvCisJICAgdGhhdCBvdXRzaWRlIG9mIGFueSBsb2NraW5nIHJlZ2lvbi4gKi8KKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIHBvcyArIDEsIFRZUEVfQU5ZLCAzIC8qa2V5IGxlbmd0aCAqLyApOwogCi0gICAgLyogSWYgd2UgY2FtZSBoZXJlLCBpdCBtZWFucyB3ZSBhYnNvbHV0ZWx5IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uLAotICAgICAgIHNpbmNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc29tZSBibG9ja3MgKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsgLy8gSm91cm5hbGluZyBzdHVmZiBhbmQgd2UgbmVlZCB0aGF0LgotICAgIHJlcyA9IGpvdXJuYWxfYmVnaW4odGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOyAvLyBXaXNoIEkga25vdyBpZiB0aGlzIG51bWJlciBlbm91Z2gKLSAgICBpZiAocmVzKQotICAgICAgICBnb3RvIGVycm9yX2V4aXQ7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisJLyogSWYgd2UgY2FtZSBoZXJlLCBpdCBtZWFucyB3ZSBhYnNvbHV0ZWx5IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uLAorCSAgIHNpbmNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc29tZSBibG9ja3MgKi8KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsJLy8gSm91cm5hbGluZyBzdHVmZiBhbmQgd2UgbmVlZCB0aGF0LgorCXJlcyA9IGpvdXJuYWxfYmVnaW4odGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwkvLyBXaXNoIEkga25vdyBpZiB0aGlzIG51bWJlciBlbm91Z2gKKwlpZiAocmVzKQorCQlnb3RvIGVycm9yX2V4aXQ7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAotICAgIC8qIExvb2sgZm9yIHRoZSBpbi10cmVlIHBvc2l0aW9uIG9mIG91ciB3cml0ZSwgbmVlZCBwYXRoIGZvciBibG9jayBhbGxvY2F0b3IgKi8KLSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotICAgIGlmICggcmVzID09IElPX0VSUk9SICkgewotCXJlcyA9IC1FSU87Ci0JZ290byBlcnJvcl9leGl0OwotICAgIH0KLSAgIAotICAgIC8qIEFsbG9jYXRlIGJsb2NrcyAqLwotICAgIC8qIEZpcnN0IGZpbGwgaW4gImhpbnQiIHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yICovCi0gICAgaGludC50aCA9IHRoOyAvLyB0cmFuc2FjdGlvbiBoYW5kbGUuCi0gICAgaGludC5wYXRoID0gJnBhdGg7IC8vIFBhdGgsIHNvIHRoYXQgYmxvY2sgYWxsb2NhdG9yIGNhbiBkZXRlcm1pbmUgcGFja2luZyBsb2NhbGl0eSBvciB3aGF0ZXZlciBpdCBuZWVkcyB0byBkZXRlcm1pbmUuCi0gICAgaGludC5pbm9kZSA9IGlub2RlOyAvLyBJbm9kZSBpcyBuZWVkZWQgYnkgYmxvY2sgYWxsb2NhdG9yIHRvby4KLSAgICBoaW50LnNlYXJjaF9zdGFydCA9IDA7IC8vIFdlIGhhdmUgbm8gaGludCBvbiB3aGVyZSB0byBzZWFyY2ggZnJlZSBibG9ja3MgZm9yIGJsb2NrIGFsbG9jYXRvci4KLSAgICBoaW50LmtleSA9IGtleS5vbl9kaXNrX2tleTsgLy8gb24gZGlzayBrZXkgb2YgZmlsZS4KLSAgICBoaW50LmJsb2NrID0gaW5vZGUtPmlfYmxvY2tzPj4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMtOSk7IC8vIE51bWJlciBvZiBkaXNrIGJsb2NrcyB0aGlzIGZpbGUgb2NjdXBpZXMgYWxyZWFkeS4KLSAgICBoaW50LmZvcm1hdHRlZF9ub2RlID0gMDsgLy8gV2UgYXJlIGFsbG9jYXRpbmcgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlLgotICAgIGhpbnQucHJlYWxsb2NhdGUgPSB3aWxsX3ByZWFsbG9jOwotCi0gICAgLyogQ2FsbCBibG9jayBhbGxvY2F0b3IgdG8gYWxsb2NhdGUgYmxvY2tzICovCi0gICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKLSAgICBpZiAoIHJlcyAhPSBDQVJSWV9PTiApIHsKLQlpZiAoIHJlcyA9PSBOT19ESVNLX1NQQUNFICkgewotCSAgICAvKiBXZSBmbHVzaCB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBubyBzcGFjZS4gVGhpcyB3YXkgc29tZQotCSAgICAgICBibG9ja3MgbWlnaHQgYmVjb21lIGZyZWUgKi8KLQkgICAgU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfbXVzdF93YWl0ID0gMTsKLQkgICAgcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwotCi0JICAgIC8qIFdlIG1pZ2h0IGhhdmUgc2NoZWR1bGVkLCBzbyBzZWFyY2ggYWdhaW4gKi8KLQkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkgICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisJLyogTG9vayBmb3IgdGhlIGluLXRyZWUgcG9zaXRpb24gb2Ygb3VyIHdyaXRlLCBuZWVkIHBhdGggZm9yIGJsb2NrIGFsbG9jYXRvciAqLworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgewogCQlyZXMgPSAtRUlPOwogCQlnb3RvIGVycm9yX2V4aXQ7Ci0JICAgIH0KLQotCSAgICAvKiB1cGRhdGUgY2hhbmdlZCBpbmZvIGZvciBoaW50IHN0cnVjdHVyZS4gKi8KLQkgICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKLQkgICAgaWYgKCByZXMgIT0gQ0FSUllfT04gKSB7Ci0JCXJlcyA9IC1FTk9TUEM7IAotCQlwYXRocmVsc2UoJnBhdGgpOwotCQlnb3RvIGVycm9yX2V4aXQ7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICByZXMgPSAtRU5PU1BDOwotCSAgICBwYXRocmVsc2UoJnBhdGgpOwotCSAgICBnb3RvIGVycm9yX2V4aXQ7CiAJfQotICAgIH0KIAorCS8qIEFsbG9jYXRlIGJsb2NrcyAqLworCS8qIEZpcnN0IGZpbGwgaW4gImhpbnQiIHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yICovCisJaGludC50aCA9IHRoOwkJLy8gdHJhbnNhY3Rpb24gaGFuZGxlLgorCWhpbnQucGF0aCA9ICZwYXRoOwkvLyBQYXRoLCBzbyB0aGF0IGJsb2NrIGFsbG9jYXRvciBjYW4gZGV0ZXJtaW5lIHBhY2tpbmcgbG9jYWxpdHkgb3Igd2hhdGV2ZXIgaXQgbmVlZHMgdG8gZGV0ZXJtaW5lLgorCWhpbnQuaW5vZGUgPSBpbm9kZTsJLy8gSW5vZGUgaXMgbmVlZGVkIGJ5IGJsb2NrIGFsbG9jYXRvciB0b28uCisJaGludC5zZWFyY2hfc3RhcnQgPSAwOwkvLyBXZSBoYXZlIG5vIGhpbnQgb24gd2hlcmUgdG8gc2VhcmNoIGZyZWUgYmxvY2tzIGZvciBibG9jayBhbGxvY2F0b3IuCisJaGludC5rZXkgPSBrZXkub25fZGlza19rZXk7CS8vIG9uIGRpc2sga2V5IG9mIGZpbGUuCisJaGludC5ibG9jayA9IGlub2RlLT5pX2Jsb2NrcyA+PiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsJLy8gTnVtYmVyIG9mIGRpc2sgYmxvY2tzIHRoaXMgZmlsZSBvY2N1cGllcyBhbHJlYWR5LgorCWhpbnQuZm9ybWF0dGVkX25vZGUgPSAwOwkvLyBXZSBhcmUgYWxsb2NhdGluZyBibG9ja3MgZm9yIHVuZm9ybWF0dGVkIG5vZGUuCisJaGludC5wcmVhbGxvY2F0ZSA9IHdpbGxfcHJlYWxsb2M7CisKKwkvKiBDYWxsIGJsb2NrIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBibG9ja3MgKi8KKwlyZXMgPQorCSAgICByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgYWxsb2NhdGVkX2Jsb2NrcywKKwkJCQkgICAgICAgYmxvY2tzX3RvX2FsbG9jYXRlLCBibG9ja3NfdG9fYWxsb2NhdGUpOworCWlmIChyZXMgIT0gQ0FSUllfT04pIHsKKwkJaWYgKHJlcyA9PSBOT19ESVNLX1NQQUNFKSB7CisJCQkvKiBXZSBmbHVzaCB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBubyBzcGFjZS4gVGhpcyB3YXkgc29tZQorCQkJICAgYmxvY2tzIG1pZ2h0IGJlY29tZSBmcmVlICovCisJCQlTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9tdXN0X3dhaXQgPSAxOworCQkJcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBlcnJvcl9leGl0OworCisJCQkvKiBXZSBtaWdodCBoYXZlIHNjaGVkdWxlZCwgc28gc2VhcmNoIGFnYWluICovCisJCQlyZXMgPQorCQkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LAorCQkJCQkJICAgICAgICZwYXRoKTsKKwkJCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJCQlyZXMgPSAtRUlPOworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKworCQkJLyogdXBkYXRlIGNoYW5nZWQgaW5mbyBmb3IgaGludCBzdHJ1Y3R1cmUuICovCisJCQlyZXMgPQorCQkJICAgIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBhbGxvY2F0ZWRfYmxvY2tzLAorCQkJCQkJICAgICAgIGJsb2Nrc190b19hbGxvY2F0ZSwKKwkJCQkJCSAgICAgICBibG9ja3NfdG9fYWxsb2NhdGUpOworCQkJaWYgKHJlcyAhPSBDQVJSWV9PTikgeworCQkJCXJlcyA9IC1FTk9TUEM7CisJCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAtRU5PU1BDOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfQorCX0KICNpZmRlZiBfX0JJR19FTkRJQU4KLSAgICAgICAgLy8gVG9vIGJhZCwgSSBoYXZlIG5vdCBmb3VuZCBhbnkgd2F5IHRvIGNvbnZlcnQgYSBnaXZlbiByZWdpb24gZnJvbQotICAgICAgICAvLyBjcHUgZm9ybWF0IHRvIGxpdHRsZSBlbmRpYW4gZm9ybWF0Ci0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGUgOyBpKyspCi0gICAgICAgICAgICBhbGxvY2F0ZWRfYmxvY2tzW2ldPWNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja3NbaV0pOwotICAgIH0KKwkvLyBUb28gYmFkLCBJIGhhdmUgbm90IGZvdW5kIGFueSB3YXkgdG8gY29udmVydCBhIGdpdmVuIHJlZ2lvbiBmcm9tCisJLy8gY3B1IGZvcm1hdCB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdAorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKykKKwkJCWFsbG9jYXRlZF9ibG9ja3NbaV0gPSBjcHVfdG9fbGUzMihhbGxvY2F0ZWRfYmxvY2tzW2ldKTsKKwl9CiAjZW5kaWYKIAotICAgIC8qIEJsb2NrcyBhbGxvY2F0aW5nIHdlbGwgbWlnaHQgaGF2ZSBzY2hlZHVsZWQgYW5kIHRyZWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLAotICAgICAgIGxldCdzIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiAqLwotICAgIC8qIGZpbmQgd2hlcmUgaW4gdGhlIHRyZWUgb3VyIHdyaXRlIHNob3VsZCBnbyAqLwotICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0JcmVzID0gLUVJTzsKLQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0gICAgfQotCi0gICAgYmggPSBnZXRfbGFzdF9iaCggJnBhdGggKTsgLy8gR2V0IGEgYnVmZmVyaGVhZCBmb3IgbGFzdCBlbGVtZW50IGluIHBhdGguCi0gICAgaWggPSBnZXRfaWgoICZwYXRoICk7ICAgICAgLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaGVhZCBpbiBwYXRoLgotICAgIGl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsgIC8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGluIHBhdGgKLQotICAgIC8qIExldCdzIHNlZSB3aGF0IHdlIGhhdmUgZm91bmQgKi8KLSAgICBpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsgLyogcG9zaXRpb24gbm90IGZvdW5kLCB0aGlzIG1lYW5zIHRoYXQgd2UKLQkJCQkgICAgICBtaWdodCBuZWVkIHRvIGFwcGVuZCBmaWxlIHdpdGggaG9sZXMKLQkJCQkgICAgICBmaXJzdCAqLwotCS8vIFNpbmNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGZpbGUncyBlbmQsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYKLQkvLyB0aGVyZSBpcyBhIGhvbGUgdGhhdCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgb3VyIHdyaXRpbmcKLQkvLyBwb3NpdGlvbiwgYW5kIGhvdyBtYW55IGJsb2NrcyBpdCBpcyBnb2luZyB0byBjb3ZlciAod2UgbmVlZCB0bwotCS8vICBwb3B1bGF0ZSBwb2ludGVycyB0byBmaWxlIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGhvbGUgd2l0aCB6ZXJvcykKLQotCXsKLQkgICAgaW50IGl0ZW1fb2Zmc2V0ID0gMTsKLQkgICAgLyoKLQkgICAgICogaWYgaWggaXMgc3RhdCBkYXRhLCBpdHMgb2Zmc2V0IGlzIDAgYW5kIHdlIGRvbid0IHdhbnQgdG8KLQkgICAgICogYWRkIDEgdG8gcG9zIGluIHRoZSBob2xlX3NpemUgY2FsY3VsYXRpb24KLQkgICAgICovCi0JICAgIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCi0JICAgICAgICBpdGVtX29mZnNldCA9IDA7Ci0JICAgIGhvbGVfc2l6ZSA9IChwb3MgKyBpdGVtX29mZnNldCAtCi0JICAgICAgICAgICAgKGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAotCQkgICAgJihpaC0+aWhfa2V5KSkgKwotCQkgICAgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKSkgPj4KLQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCS8qIEJsb2NrcyBhbGxvY2F0aW5nIHdlbGwgbWlnaHQgaGF2ZSBzY2hlZHVsZWQgYW5kIHRyZWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLAorCSAgIGxldCdzIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiAqLworCS8qIGZpbmQgd2hlcmUgaW4gdGhlIHRyZWUgb3VyIHdyaXRlIHNob3VsZCBnbyAqLworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQlyZXMgPSAtRUlPOworCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CiAJfQogCi0JaWYgKCBob2xlX3NpemUgPiAwICkgewotCSAgICBpbnQgdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRSApOyAvLyBIb3cgbXVjaCBkYXRhIHRvIGluc2VydCBmaXJzdCB0aW1lLgotCSAgICAvKiBhcmVhIGZpbGxlZCB3aXRoIHplcm9lcywgdG8gc3VwcGx5IGFzIGxpc3Qgb2YgemVybyBibG9ja251bWJlcnMKLQkgICAgICAgV2UgYWxsb2NhdGUgaXQgb3V0c2lkZSBvZiBsb29wIGp1c3QgaW4gY2FzZSBsb29wIHdvdWxkIHNwaW4gZm9yCi0JICAgICAgIHNldmVyYWwgaXRlcmF0aW9ucy4gKi8KLQkgICAgY2hhciAqemVyb3MgPSBrbWFsbG9jKHRvX3Bhc3RlKlVORk1fUF9TSVpFLCBHRlBfQVRPTUlDKTsgLy8gV2UgY2Fubm90IGluc2VydCBtb3JlIHRoYW4gTUFYX0lURU1fTEVOIGJ5dGVzIGFueXdheS4KLQkgICAgaWYgKCAhemVyb3MgKSB7Ci0JCXJlcyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCSAgICBtZW1zZXQgKCB6ZXJvcywgMCwgdG9fcGFzdGUqVU5GTV9QX1NJWkUpOwotCSAgICBkbyB7Ci0JCXRvX3Bhc3RlID0gbWluX3QoX191NjQsIGhvbGVfc2l6ZSwgTUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkUgKTsKLQkJaWYgKCBpc19pbmRpcmVjdF9sZV9paChpaCkgKSB7Ci0JCSAgICAvKiBPaywgdGhlcmUgaXMgZXhpc3RpbmcgaW5kaXJlY3QgaXRlbSBhbHJlYWR5LiBOZWVkIHRvIGFwcGVuZCBpdCAqLwotCQkgICAgLyogQ2FsY3VsYXRlIHBvc2l0aW9uIHBhc3QgaW5zZXJ0ZWQgaXRlbSAqLwotCQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgbGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLCBUWVBFX0lORElSRUNULCAzKTsKLQkJICAgIHJlcyA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSggdGgsICZwYXRoLCAma2V5LCBpbm9kZSwgKGNoYXIgKil6ZXJvcywgVU5GTV9QX1NJWkUqdG9fcGFzdGUpOwotCQkgICAgaWYgKCByZXMgKSB7Ci0JCQlrZnJlZSh6ZXJvcyk7Ci0JCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0JCSAgICB9Ci0JCX0gZWxzZSBpZiAoIGlzX3N0YXRkYXRhX2xlX2loKGloKSApIHsKLQkJICAgIC8qIE5vIGV4aXN0aW5nIGl0ZW0sIGNyZWF0ZSBpdCAqLwotCQkgICAgLyogaXRlbSBoZWFkIGZvciBuZXcgaXRlbSAqLwotCQkgICAgc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7CisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CS8vIEdldCBhIGJ1ZmZlcmhlYWQgZm9yIGxhc3QgZWxlbWVudCBpbiBwYXRoLgorCWloID0gZ2V0X2loKCZwYXRoKTsJLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaGVhZCBpbiBwYXRoLgorCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CS8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGluIHBhdGgKIAotCQkgICAgLyogY3JlYXRlIGEga2V5IGZvciBvdXIgbmV3IGl0ZW0gKi8KLQkJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOworCS8qIExldCdzIHNlZSB3aGF0IHdlIGhhdmUgZm91bmQgKi8KKwlpZiAocmVzICE9IFBPU0lUSU9OX0ZPVU5EKSB7CS8qIHBvc2l0aW9uIG5vdCBmb3VuZCwgdGhpcyBtZWFucyB0aGF0IHdlCisJCQkJCSAgIG1pZ2h0IG5lZWQgdG8gYXBwZW5kIGZpbGUgd2l0aCBob2xlcworCQkJCQkgICBmaXJzdCAqLworCQkvLyBTaW5jZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBmaWxlJ3MgZW5kLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmCisJCS8vIHRoZXJlIGlzIGEgaG9sZSB0aGF0IG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSBvdXIgd3JpdGluZworCQkvLyBwb3NpdGlvbiwgYW5kIGhvdyBtYW55IGJsb2NrcyBpdCBpcyBnb2luZyB0byBjb3ZlciAod2UgbmVlZCB0bworCQkvLyAgcG9wdWxhdGUgcG9pbnRlcnMgdG8gZmlsZSBibG9ja3MgcmVwcmVzZW50aW5nIHRoZSBob2xlIHdpdGggemVyb3MpCiAKLQkJICAgIC8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KLQkJICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmaW5zX2loLCAma2V5LCBrZXkudmVyc2lvbiwgMSwKLQkJCQkgICAgICAgVFlQRV9JTkRJUkVDVCwgdG9fcGFzdGUqVU5GTV9QX1NJWkUsCi0JCQkJICAgICAgIDAgLyogZnJlZSBzcGFjZSAqLyk7CisJCXsKKwkJCWludCBpdGVtX29mZnNldCA9IDE7CisJCQkvKgorCQkJICogaWYgaWggaXMgc3RhdCBkYXRhLCBpdHMgb2Zmc2V0IGlzIDAgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkJCSAqIGFkZCAxIHRvIHBvcyBpbiB0aGUgaG9sZV9zaXplIGNhbGN1bGF0aW9uCisJCQkgKi8KKwkJCWlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCQkJaXRlbV9vZmZzZXQgPSAwOworCQkJaG9sZV9zaXplID0gKHBvcyArIGl0ZW1fb2Zmc2V0IC0KKwkJCQkgICAgIChsZV9rZXlfa19vZmZzZXQKKwkJCQkgICAgICAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkJCSAgICAgICAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwKKwkJCQkJCQkJCWlub2RlLT4KKwkJCQkJCQkJCWlfc2ItPgorCQkJCQkJCQkJc19ibG9ja3NpemUpKSkKKwkJCSAgICA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJfQogCi0JCSAgICAvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLwotCQkgICAgcmVzID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCSAgICBpZiAoIHJlcyAhPSBJVEVNX05PVF9GT1VORCApIHsKLQkJCS8qIGl0ZW0gc2hvdWxkIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHdlIGhhdmUgZXJyb3IgKi8KLQkJCWlmICggcmVzICE9IC1FTk9TUEMgKSB7Ci0JCQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkJImdyZWVuLTkwMDg6IHNlYXJjaF9ieV9rZXkgKCVLKSByZXR1cm5lZCAlZCIsCi0JCQkJCSAgICAgICZrZXksIHJlcyk7CisJCWlmIChob2xlX3NpemUgPiAwKSB7CisJCQlpbnQgdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSAvIFVORk1fUF9TSVpFKTsJLy8gSG93IG11Y2ggZGF0YSB0byBpbnNlcnQgZmlyc3QgdGltZS4KKwkJCS8qIGFyZWEgZmlsbGVkIHdpdGggemVyb2VzLCB0byBzdXBwbHkgYXMgbGlzdCBvZiB6ZXJvIGJsb2NrbnVtYmVycworCQkJICAgV2UgYWxsb2NhdGUgaXQgb3V0c2lkZSBvZiBsb29wIGp1c3QgaW4gY2FzZSBsb29wIHdvdWxkIHNwaW4gZm9yCisJCQkgICBzZXZlcmFsIGl0ZXJhdGlvbnMuICovCisJCQljaGFyICp6ZXJvcyA9IGttYWxsb2ModG9fcGFzdGUgKiBVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7CS8vIFdlIGNhbm5vdCBpbnNlcnQgbW9yZSB0aGFuIE1BWF9JVEVNX0xFTiBieXRlcyBhbnl3YXkuCisJCQlpZiAoIXplcm9zKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CiAJCQl9Ci0JCQlyZXMgPSAtRUlPOwotCQkgICAgICAgIGtmcmVlKHplcm9zKTsKLQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkJICAgIH0KLQkJICAgIHJlcyA9IHJlaXNlcmZzX2luc2VydF9pdGVtKCB0aCwgJnBhdGgsICZrZXksICZpbnNfaWgsIGlub2RlLCAoY2hhciAqKXplcm9zKTsKKwkJCW1lbXNldCh6ZXJvcywgMCwgdG9fcGFzdGUgKiBVTkZNX1BfU0laRSk7CisJCQlkbyB7CisJCQkJdG9fcGFzdGUgPQorCQkJCSAgICBtaW5fdChfX3U2NCwgaG9sZV9zaXplLAorCQkJCQkgIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+CisJCQkJCQkgICAgICAgc19ibG9ja3NpemUpIC8KKwkJCQkJICBVTkZNX1BfU0laRSk7CisJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQkJCQkvKiBPaywgdGhlcmUgaXMgZXhpc3RpbmcgaW5kaXJlY3QgaXRlbSBhbHJlYWR5LiBOZWVkIHRvIGFwcGVuZCBpdCAqLworCQkJCQkvKiBDYWxjdWxhdGUgcG9zaXRpb24gcGFzdCBpbnNlcnRlZCBpdGVtICovCisJCQkJCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwKKwkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkgICAgIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbgorCQkJCQkJICAgICAgKGlub2RlKSwKKwkJCQkJCSAgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkJCSAgICAgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJCQkgICAgIGlub2RlLT4KKwkJCQkJCQkJICAgICBpX3NiLT4KKwkJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZSksCisJCQkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCQkJCQlyZXMgPQorCQkJCQkgICAgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCAmcGF0aCwKKwkJCQkJCQkJICAgICAma2V5LAorCQkJCQkJCQkgICAgIGlub2RlLAorCQkJCQkJCQkgICAgIChjaGFyICopCisJCQkJCQkJCSAgICAgemVyb3MsCisJCQkJCQkJCSAgICAgVU5GTV9QX1NJWkUKKwkJCQkJCQkJICAgICAqCisJCQkJCQkJCSAgICAgdG9fcGFzdGUpOworCQkJCQlpZiAocmVzKSB7CisJCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkgeworCQkJCQkvKiBObyBleGlzdGluZyBpdGVtLCBjcmVhdGUgaXQgKi8KKwkJCQkJLyogaXRlbSBoZWFkIGZvciBuZXcgaXRlbSAqLworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsKKworCQkJCQkvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIDEsCisJCQkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCisJCQkJCS8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJCQkJbWFrZV9sZV9pdGVtX2hlYWQoJmluc19paCwgJmtleSwKKwkJCQkJCQkgIGtleS52ZXJzaW9uLCAxLAorCQkJCQkJCSAgVFlQRV9JTkRJUkVDVCwKKwkJCQkJCQkgIHRvX3Bhc3RlICoKKwkJCQkJCQkgIFVORk1fUF9TSVpFLAorCQkJCQkJCSAgMCAvKiBmcmVlIHNwYWNlICovICk7CisKKwkJCQkJLyogRmluZCB3aGVyZSBzdWNoIGl0ZW0gc2hvdWxkIGxpdmUgaW4gdGhlIHRyZWUgKi8KKwkJCQkJcmVzID0KKwkJCQkJICAgIHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LAorCQkJCQkJCSZwYXRoKTsKKwkJCQkJaWYgKHJlcyAhPSBJVEVNX05PVF9GT1VORCkgeworCQkJCQkJLyogaXRlbSBzaG91bGQgbm90IGV4aXN0LCBvdGhlcndpc2Ugd2UgaGF2ZSBlcnJvciAqLworCQkJCQkJaWYgKHJlcyAhPSAtRU5PU1BDKSB7CisJCQkJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+CisJCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJCSAiZ3JlZW4tOTAwODogc2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwKKwkJCQkJCQkJCSAma2V5LAorCQkJCQkJCQkJIHJlcyk7CisJCQkJCQl9CisJCQkJCQlyZXMgPSAtRUlPOworCQkJCQkJa2ZyZWUoemVyb3MpOworCQkJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJCQl9CisJCQkJCXJlcyA9CisJCQkJCSAgICByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgJnBhdGgsCisJCQkJCQkJCSAma2V5LCAmaW5zX2loLAorCQkJCQkJCQkgaW5vZGUsCisJCQkJCQkJCSAoY2hhciAqKXplcm9zKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICAgICAiZ3JlZW4tOTAxMTogVW5leHBlY3RlZCBrZXkgdHlwZSAlS1xuIiwKKwkJCQkJCSAgICAgICAma2V5KTsKKwkJCQl9CisJCQkJaWYgKHJlcykgeworCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJCQl9CisJCQkJLyogTm93IHdlIHdhbnQgdG8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgdG9vIGZ1bGwsIGFuZCBpZiBpdCBpcworCQkJCSAgIHdlIHJlc3RhcnQgaXQuIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIHBhdGguICovCisJCQkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZAorCQkJCSAgICAodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7CisJCQkJCXJlcyA9CisJCQkJCSAgICByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwKKwkJCQkJCQkJJnBhdGgpOworCQkJCQlpZiAocmVzKSB7CisJCQkJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJCQkJa2ZyZWUoemVyb3MpOworCQkJCQkJZ290byBlcnJvcl9leGl0OworCQkJCQl9CisJCQkJfQorCisJCQkJLyogV2VsbCwgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFuZCBzdHVmZiAqLworCQkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksCisJCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkJICAgICAodG9fcGFzdGUgPDwgaW5vZGUtPgorCQkJCQkJICAgICAgaV9ibGtiaXRzKSk7CisJCQkJcmVzID0KKwkJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsCisJCQkJCQkJICAgICAgICZrZXksICZwYXRoKTsKKwkJCQlpZiAocmVzID09IElPX0VSUk9SKSB7CisJCQkJCXJlcyA9IC1FSU87CisJCQkJCWtmcmVlKHplcm9zKTsKKwkJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJCX0KKwkJCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQlob2xlX3NpemUgLT0gdG9fcGFzdGU7CisJCQl9IHdoaWxlIChob2xlX3NpemUpOworCQkJa2ZyZWUoemVyb3MpOworCQl9CisJfQorCS8vIEdvIHRocm91Z2ggZXhpc3RpbmcgaW5kaXJlY3QgaXRlbXMgZmlyc3QKKwkvLyByZXBsYWNlIGFsbCB6ZXJvZXMgd2l0aCBibG9ja251bWJlcnMgZnJvbSBsaXN0CisJLy8gTm90ZSB0aGF0IGlmIG5vIGNvcnJlc3BvbmRpbmcgaXRlbSB3YXMgZm91bmQsIGJ5IHByZXZpb3VzIHNlYXJjaCwKKwkvLyBpdCBtZWFucyB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgaW4tdHJlZSByZXByZXNlbnRhdGlvbiBmb3IgZmlsZSBhcmVhCisJLy8gd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBzY2FuIHRocm91Z2ggZm9yIGhvbGVzLgorCWZvciAoY3Vycl9ibG9jayA9IDAsIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtOworCSAgICAgY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSAmJiByZXMgPT0gUE9TSVRJT05fRk9VTkQ7KSB7CisJICAgICAgcmV0cnk6CisKKwkJaWYgKGl0ZW1wb3MgPj0gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIHsKKwkJCS8qIFdlIHJ1biBvdXQgb2YgZGF0YSBpbiB0aGlzIGluZGlyZWN0IGl0ZW0sIGxldCdzIGxvb2sgZm9yIGFub3RoZXIKKwkJCSAgIG9uZS4gKi8KKwkJCS8qIEZpcnN0IGlmIHdlIGFyZSBhbHJlYWR5IG1vZGlmeWluZyBjdXJyZW50IGl0ZW0sIGxvZyBpdCAqLworCQkJaWYgKG1vZGlmeWluZ190aGlzX2l0ZW0pIHsKKwkJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7CisJCQl9CisJCQkvKiBUaGVuIHNldCB0aGUga2V5IHRvIGxvb2sgZm9yIGEgbmV3IGluZGlyZWN0IGl0ZW0gKG9mZnNldCBvZiBvbGQKKwkJCSAgIGl0ZW0gaXMgYWRkZWQgdG8gb2xkIGl0ZW0gbGVuZ3RoICovCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkgICAgIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksCisJCQkJCSAgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkJICAgICBvcF9ieXRlc19udW1iZXIoaWgsCisJCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+CisJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZSkpOworCQkJLyogU2VhcmNoIG9mb3IgcG9zaXRpb24gb2YgbmV3IGtleSBpbiB0aGUgdHJlZS4gKi8KKwkJCXJlcyA9CisJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksCisJCQkJCQkgICAgICAgJnBhdGgpOworCQkJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQkJCXJlcyA9IC1FSU87CisJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJfQorCQkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQkJaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJCQljb250aW51ZTsJLy8gbG9vcCB0byBjaGVjayBhbGwga2luZHMgb2YgY29uZGl0aW9ucyBhbmQgc28gb24uCisJCX0KKwkJLyogT2ssIHdlIGhhdmUgY29ycmVjdCBwb3NpdGlvbiBpbiBpdGVtIG5vdywgc28gbGV0J3Mgc2VlIGlmIGl0IGlzCisJCSAgIHJlcHJlc2VudGluZyBmaWxlIGhvbGUgKGJsb2NrbnVtYmVyIGlzIHplcm8pIGFuZCBmaWxsIGl0IGlmIG5lZWRlZCAqLworCQlpZiAoIWl0ZW1baXRlbXBvc10pIHsKKwkJCS8qIE9rLCBhIGhvbGUuIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkgcHJlcGFyZWQgdGhpcworCQkJICAgYmxvY2sgdG8gYmUgam91cm5hbGVkICovCisJCQl3aGlsZSAoIW1vZGlmeWluZ190aGlzX2l0ZW0pIHsJLy8gbG9vcCB1bnRpbCBzdWNjZWVkCisJCQkJLyogV2VsbCwgdGhpcyBpdGVtIGlzIG5vdCBqb3VybmFsZWQgeWV0LCBzbyB3ZSBtdXN0IHByZXBhcmUKKwkJCQkgICBpdCBmb3Igam91cm5hbCBmaXJzdCwgYmVmb3JlIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKwkJCQlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsJLy8gV2UgY29weSBpdGVtIGhlYWQgb2YgZm91bmQgaXRlbSwKKwkJCQkvLyBoZXJlIHRvIGRldGVjdCBpZiBmcyBjaGFuZ2VkIHVuZGVyCisJCQkJLy8gdXMgd2hpbGUgd2Ugd2VyZSBwcmVwYXJpbmcgZm9yCisJCQkJLy8gam91cm5hbC4KKwkJCQlpbnQgZnNfZ2VuOwkvLyBXZSBzdG9yZSBmcyBnZW5lcmF0aW9uIGhlcmUgdG8gZmluZCBpZiBzb21lb25lCisJCQkJLy8gY2hhbmdlcyBmcyB1bmRlciBvdXIgZmVldAorCisJCQkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwkvLyBSZW1lbWJlciBpdGVtaGVhZAorCQkJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsJLy8gcmVtZW1iZXIgZnMgZ2VuZXJhdGlvbgorCQkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsJLy8gUHJlcGFyZSBhIGJ1ZmZlciB3aXRoaW4gd2hpY2ggaW5kaXJlY3QgaXRlbSBpcyBzdG9yZWQgZm9yIGNoYW5naW5nLgorCQkJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJCS8vIFNpZ2gsIGZzIHdhcyBjaGFuZ2VkIHVuZGVyIHVzLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIG5ldworCQkJCQkvLyBsb2NhdGlvbiBvZiBpdGVtIHdlIGFyZSB3b3JraW5nIHdpdGgKKworCQkJCQkvKiB1bm1hcmsgcHJlcGFlcmQgYXJlYSBhcyBqb3VybmFsZWQgYW5kIHNlYXJjaCBmb3IgaXQncworCQkJCQkgICBuZXcgcG9zaXRpb24gKi8KKwkJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPgorCQkJCQkJCQkJIGlfc2IsCisJCQkJCQkJCQkgYmgpOworCQkJCQlyZXMgPQorCQkJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPgorCQkJCQkJCQkgICAgICAgaV9zYiwKKwkJCQkJCQkJICAgICAgICZrZXksCisJCQkJCQkJCSAgICAgICAmcGF0aCk7CisJCQkJCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJCQkJCXJlcyA9IC1FSU87CisJCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJCX0KKwkJCQkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCQkJCWloID0gZ2V0X2loKCZwYXRoKTsKKwkJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQkJaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfQorCQkJCW1vZGlmeWluZ190aGlzX2l0ZW0gPSAxOworCQkJfQorCQkJaXRlbVtpdGVtcG9zXSA9IGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja107CS8vIEFzc2lnbiBuZXcgYmxvY2sKKwkJCWN1cnJfYmxvY2srKzsKKwkJfQorCQlpdGVtcG9zKys7CisJfQorCisJaWYgKG1vZGlmeWluZ190aGlzX2l0ZW0pIHsJLy8gV2UgbmVlZCB0byBsb2cgbGFzdC1hY2Nlc3NlZCBibG9jaywgaWYgaXQKKwkJLy8gd2FzIG1vZGlmaWVkLCBidXQgbm90IGxvZ2dlZCB5ZXQuCisJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwl9CisKKwlpZiAoY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSkgeworCQkvLyBPaCwgd2VsbCBuZWVkIHRvIGFwcGVuZCB0byBpbmRpcmVjdCBpdGVtLCBvciB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbQorCQkvLyBpZiB0aGVyZSB3ZXJlbid0IGFueQorCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCQkvLyBFeGlzdGluZyBpbmRpcmVjdCBpdGVtIC0gYXBwZW5kLiBGaXJzdCBjYWxjdWxhdGUga2V5IGZvciBhcHBlbmQKKwkJCS8vIHBvc2l0aW9uLiBXZSBkbyBub3QgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFzIGl0IHNob3VsZAorCQkJLy8gYWxyZWFkeSBwb2ludCB0byBjb3JyZWN0IHBsYWNlLgorCQkJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLAorCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0KGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uCisJCQkJCQkgICAgIChpbm9kZSksCisJCQkJCQkgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkgICAgIG9wX2J5dGVzX251bWJlcihpaCwKKwkJCQkJCSAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwKKwkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCQkJcmVzID0KKwkJCSAgICByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0odGgsICZwYXRoLCAma2V5LCBpbm9kZSwKKwkJCQkJCSAgICAgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcyArCisJCQkJCQkJICAgICAgY3Vycl9ibG9jayksCisJCQkJCQkgICAgIFVORk1fUF9TSVpFICoKKwkJCQkJCSAgICAgKGJsb2Nrc190b19hbGxvY2F0ZSAtCisJCQkJCQkgICAgICBjdXJyX2Jsb2NrKSk7CisJCQlpZiAocmVzKSB7CisJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJfQorCQl9IGVsc2UgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkgeworCQkJLy8gTGFzdCBmb3VuZCBpdGVtIHdhcyBzdGF0ZGF0YS4gVGhhdCBtZWFucyB3ZSBuZWVkIHRvIGNyZWF0ZSBpbmRpcmVjdCBpdGVtLgorCQkJc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7CS8qIGl0ZW1oZWFkIGZvciBuZXcgaXRlbSAqLworCisJCQkvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCAxLCBUWVBFX0lORElSRUNULCAzKTsJLy8gUG9zaXRpb24gb25lLAorCQkJLy8gYmVjYXVzZSB0aGF0J3MKKwkJCS8vIHdoZXJlIGZpcnN0CisJCQkvLyBpbmRpcmVjdCBpdGVtCisJCQkvLyBiZWdpbnMKKwkJCS8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJCW1ha2VfbGVfaXRlbV9oZWFkKCZpbnNfaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLAorCQkJCQkgIFRZUEVfSU5ESVJFQ1QsCisJCQkJCSAgKGJsb2Nrc190b19hbGxvY2F0ZSAtCisJCQkJCSAgIGN1cnJfYmxvY2spICogVU5GTV9QX1NJWkUsCisJCQkJCSAgMCAvKiBmcmVlIHNwYWNlICovICk7CisJCQkvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLworCQkJcmVzID0gc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJCWlmIChyZXMgIT0gSVRFTV9OT1RfRk9VTkQpIHsKKwkJCQkvKiBXZWxsLCBpZiB3ZSBoYXZlIGZvdW5kIHN1Y2ggaXRlbSBhbHJlYWR5LCBvciBzb21lIGVycm9yCisJCQkJICAgb2NjdXJlZCwgd2UgbmVlZCB0byB3YXJuIHVzZXIgYW5kIHJldHVybiBlcnJvciAqLworCQkJCWlmIChyZXMgIT0gLUVOT1NQQykgeworCQkJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkJCSAiZ3JlZW4tOTAwOTogc2VhcmNoX2J5X2tleSAoJUspICIKKwkJCQkJCQkgInJldHVybmVkICVkIiwgJmtleSwKKwkJCQkJCQkgcmVzKTsKKwkJCQl9CisJCQkJcmVzID0gLUVJTzsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQl9CisJCQkvKiBJbnNlcnQgaXRlbSBpbnRvIHRoZSB0cmVlIHdpdGggdGhlIGRhdGEgYXMgaXRzIGJvZHkgKi8KKwkJCXJlcyA9CisJCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoLCAma2V5LCAmaW5zX2loLAorCQkJCQkJIGlub2RlLAorCQkJCQkJIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MgKworCQkJCQkJCSAgY3Vycl9ibG9jaykpOwogCQl9IGVsc2UgewotCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDExOiBVbmV4cGVjdGVkIGtleSB0eXBlICVLXG4iLCAma2V5KTsKKwkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCSAgICAgICAiZ3JlZW4tOTAxMDogdW5leHBlY3RlZCBpdGVtIHR5cGUgZm9yIGtleSAlS1xuIiwKKwkJCQkgICAgICAgJmtleSk7CiAJCX0KLQkJaWYgKCByZXMgKSB7Ci0JCSAgICBrZnJlZSh6ZXJvcyk7Ci0JCSAgICBnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJfQorCS8vIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHRyYW5zYWN0aW9uCisJLy8gdW5sZXNzIHdlIHJldHVybiBhbiBlcnJvciwgdGhleSBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3IgbG9nZ2luZworCS8vIHRoZSBpbm9kZS4KKwkvLworCXBhdGhyZWxzZSgmcGF0aCk7CisJLyoKKwkgKiBjbGVhbnVwIHByZWxsb2NhdGlvbiBmcm9tIHByZXZpb3VzIHdyaXRlcworCSAqIGlmIHRoaXMgaXMgYSBwYXJ0aWFsIGJsb2NrIHdyaXRlCisJICovCisJaWYgKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQlyZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKHRoLCBpbm9kZSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwYWdlcy9idWZmZXJzIGFuZCBtYXAgdGhlIGJ1ZmZlcnMgdG8gbmV3bHkgYWxsb2NhdGVkCisJLy8gYmxvY2tzIChzbyB0aGF0IHN5c3RlbSBrbm93cyB3aGVyZSB0byB3cml0ZSB0aGVzZSBwYWdlcyBsYXRlcikuCisJY3Vycl9ibG9jayA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CS8vY3VycmVudCBwYWdlCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsJLy8gZmlyc3QgYnVmZmVyIGZvciBhIHBhZ2UKKwkJaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CS8vIGluLXBhZ2Ugb2Zmc2V0cyBmb3IgYnVmZmVycy4KKworCQlpZiAoIXBhZ2VfYnVmZmVycyhwYWdlKSkKKwkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCSAgICAgICAiZ3JlZW4tOTAwNTogTm8gYnVmZmVycyBmb3IgcHJlcGFyZWQgcGFnZT8/PyIpOworCisJCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDA2OiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSkKKwkJCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCisJCQkJY29udGludWU7CisJCQlpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKQorCQkJCS8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLworCQkJCWJyZWFrOworCisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CS8vIE9rLCB1bm1hcHBlZCBidWZmZXIsIG5lZWQgdG8gbWFwIGl0CisJCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwKKwkJCQkgICAgICAgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2NrcworCQkJCQkJICAgW2N1cnJfYmxvY2tdKSk7CisJCQkJY3Vycl9ibG9jaysrOworCQkJCXNldF9idWZmZXJfbmV3KGJoKTsKKwkJCX0KIAkJfQotCQkvKiBOb3cgd2Ugd2FudCB0byBjaGVjayBpZiB0cmFuc2FjdGlvbiBpcyB0b28gZnVsbCwgYW5kIGlmIGl0IGlzCi0JCSAgIHdlIHJlc3RhcnQgaXQuIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIHBhdGguICovCi0JCWlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7Ci0JCSAgICByZXMgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHplcm9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCQkvKiBXZWxsLCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYW5kIHN0dWZmICovCi0JCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgKHRvX3Bhc3RlIDw8IGlub2RlLT5pX2Jsa2JpdHMpKTsKLQkJcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkJaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0JCSAgICByZXMgPSAtRUlPOwotCQkgICAga2ZyZWUoemVyb3MpOwotCQkgICAgZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCQl9Ci0JCWJoPWdldF9sYXN0X2JoKCZwYXRoKTsKLQkJaWg9Z2V0X2loKCZwYXRoKTsKLQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKLQkJaG9sZV9zaXplIC09IHRvX3Bhc3RlOwotCSAgICB9IHdoaWxlICggaG9sZV9zaXplICk7Ci0JICAgIGtmcmVlKHplcm9zKTsKIAl9Ci0gICAgfQogCi0gICAgLy8gR28gdGhyb3VnaCBleGlzdGluZyBpbmRpcmVjdCBpdGVtcyBmaXJzdAotICAgIC8vIHJlcGxhY2UgYWxsIHplcm9lcyB3aXRoIGJsb2NrbnVtYmVycyBmcm9tIGxpc3QKLSAgICAvLyBOb3RlIHRoYXQgaWYgbm8gY29ycmVzcG9uZGluZyBpdGVtIHdhcyBmb3VuZCwgYnkgcHJldmlvdXMgc2VhcmNoLAotICAgIC8vIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBleGlzdGluZyBpbi10cmVlIHJlcHJlc2VudGF0aW9uIGZvciBmaWxlIGFyZWEKLSAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNjYW4gdGhyb3VnaCBmb3IgaG9sZXMuCi0gICAgZm9yICggY3Vycl9ibG9jayA9IDAsIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtIDsgY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSAmJiByZXMgPT0gUE9TSVRJT05fRk9VTkQgOyApIHsKLXJldHJ5OgorCVJGQUxTRShjdXJyX2Jsb2NrID4gYmxvY2tzX3RvX2FsbG9jYXRlLAorCSAgICAgICAiZ3JlZW4tOTAwNzogVXNlZCB0b28gbWFueSBibG9ja3M/IHdlaXJkIik7CiAKLQlpZiAoIGl0ZW1wb3MgPj0gaWhfaXRlbV9sZW4oaWgpL1VORk1fUF9TSVpFICkgewotCSAgICAvKiBXZSBydW4gb3V0IG9mIGRhdGEgaW4gdGhpcyBpbmRpcmVjdCBpdGVtLCBsZXQncyBsb29rIGZvciBhbm90aGVyCi0JICAgICAgIG9uZS4gKi8KLQkgICAgLyogRmlyc3QgaWYgd2UgYXJlIGFscmVhZHkgbW9kaWZ5aW5nIGN1cnJlbnQgaXRlbSwgbG9nIGl0ICovCi0JICAgIGlmICggbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsKLQkJam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7Ci0JICAgIH0KLQkgICAgLyogVGhlbiBzZXQgdGhlIGtleSB0byBsb29rIGZvciBhIG5ldyBpbmRpcmVjdCBpdGVtIChvZmZzZXQgb2Ygb2xkCi0JICAgICAgIGl0ZW0gaXMgYWRkZWQgdG8gb2xkIGl0ZW0gbGVuZ3RoICovCi0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpOwotCSAgICAvKiBTZWFyY2ggb2ZvciBwb3NpdGlvbiBvZiBuZXcga2V5IGluIHRoZSB0cmVlLiAqLwotCSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUikgewotCQlyZXMgPSAtRUlPOwotCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0JICAgIH0KLQkgICAgYmg9Z2V0X2xhc3RfYmgoJnBhdGgpOwotCSAgICBpaD1nZXRfaWgoJnBhdGgpOwotCSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOwotCSAgICBpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKLQkgICAgY29udGludWU7IC8vIGxvb3AgdG8gY2hlY2sgYWxsIGtpbmRzIG9mIGNvbmRpdGlvbnMgYW5kIHNvIG9uLgotCX0KLQkvKiBPaywgd2UgaGF2ZSBjb3JyZWN0IHBvc2l0aW9uIGluIGl0ZW0gbm93LCBzbyBsZXQncyBzZWUgaWYgaXQgaXMKLQkgICByZXByZXNlbnRpbmcgZmlsZSBob2xlIChibG9ja251bWJlciBpcyB6ZXJvKSBhbmQgZmlsbCBpdCBpZiBuZWVkZWQgKi8KLQlpZiAoICFpdGVtW2l0ZW1wb3NdICkgewotCSAgICAvKiBPaywgYSBob2xlLiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhbHJlYWR5IHByZXBhcmVkIHRoaXMKLQkgICAgICAgYmxvY2sgdG8gYmUgam91cm5hbGVkICovCi0JICAgIHdoaWxlICggIW1vZGlmeWluZ190aGlzX2l0ZW0gKSB7IC8vIGxvb3AgdW50aWwgc3VjY2VlZAotCQkvKiBXZWxsLCB0aGlzIGl0ZW0gaXMgbm90IGpvdXJuYWxlZCB5ZXQsIHNvIHdlIG11c3QgcHJlcGFyZQotCQkgICBpdCBmb3Igam91cm5hbCBmaXJzdCwgYmVmb3JlIHdlIGNhbiBjaGFuZ2UgaXQgKi8KLQkJc3RydWN0IGl0ZW1faGVhZCB0bXBfaWg7IC8vIFdlIGNvcHkgaXRlbSBoZWFkIG9mIGZvdW5kIGl0ZW0sCi0JCQkJCSAvLyBoZXJlIHRvIGRldGVjdCBpZiBmcyBjaGFuZ2VkIHVuZGVyCi0JCQkJCSAvLyB1cyB3aGlsZSB3ZSB3ZXJlIHByZXBhcmluZyBmb3IKLQkJCQkJIC8vIGpvdXJuYWwuCi0JCWludCBmc19nZW47IC8vIFdlIHN0b3JlIGZzIGdlbmVyYXRpb24gaGVyZSB0byBmaW5kIGlmIHNvbWVvbmUKLQkJCSAgICAvLyBjaGFuZ2VzIGZzIHVuZGVyIG91ciBmZWV0Ci0KLQkJY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsgLy8gUmVtZW1iZXIgaXRlbWhlYWQKLQkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsgLy8gcmVtZW1iZXIgZnMgZ2VuZXJhdGlvbgotCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7IC8vIFByZXBhcmUgYSBidWZmZXIgd2l0aGluIHdoaWNoIGluZGlyZWN0IGl0ZW0gaXMgc3RvcmVkIGZvciBjaGFuZ2luZy4KLQkJaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoKSkgewotCQkgICAgLy8gU2lnaCwgZnMgd2FzIGNoYW5nZWQgdW5kZXIgdXMsIHdlIG5lZWQgdG8gbG9vayBmb3IgbmV3Ci0JCSAgICAvLyBsb2NhdGlvbiBvZiBpdGVtIHdlIGFyZSB3b3JraW5nIHdpdGgKLQotCQkgICAgLyogdW5tYXJrIHByZXBhZXJkIGFyZWEgYXMgam91cm5hbGVkIGFuZCBzZWFyY2ggZm9yIGl0J3MKLQkJICAgICAgIG5ldyBwb3NpdGlvbiAqLwotCQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKTsKLQkJICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUikgewotCQkJcmVzID0gLUVJTzsKLQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkJICAgIH0KLQkJICAgIGJoPWdldF9sYXN0X2JoKCZwYXRoKTsKLQkJICAgIGloPWdldF9paCgmcGF0aCk7Ci0JCSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOwotCQkgICAgaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07Ci0JCSAgICBnb3RvIHJldHJ5OwotCQl9Ci0JCW1vZGlmeWluZ190aGlzX2l0ZW0gPSAxOwotCSAgICB9Ci0JICAgIGl0ZW1baXRlbXBvc10gPSBhbGxvY2F0ZWRfYmxvY2tzW2N1cnJfYmxvY2tdOyAvLyBBc3NpZ24gbmV3IGJsb2NrCi0JICAgIGN1cnJfYmxvY2srKzsKLQl9Ci0JaXRlbXBvcysrOwotICAgIH0KLQotICAgIGlmICggbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsgLy8gV2UgbmVlZCB0byBsb2cgbGFzdC1hY2Nlc3NlZCBibG9jaywgaWYgaXQKLQkJCQkgLy8gd2FzIG1vZGlmaWVkLCBidXQgbm90IGxvZ2dlZCB5ZXQuCi0Jam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLSAgICB9Ci0KLSAgICBpZiAoIGN1cnJfYmxvY2sgPCBibG9ja3NfdG9fYWxsb2NhdGUgKSB7Ci0JLy8gT2gsIHdlbGwgbmVlZCB0byBhcHBlbmQgdG8gaW5kaXJlY3QgaXRlbSwgb3IgdG8gY3JlYXRlIGluZGlyZWN0IGl0ZW0KLQkvLyBpZiB0aGVyZSB3ZXJlbid0IGFueQotCWlmICggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICkgewotCSAgICAvLyBFeGlzdGluZyBpbmRpcmVjdCBpdGVtIC0gYXBwZW5kLiBGaXJzdCBjYWxjdWxhdGUga2V5IGZvciBhcHBlbmQKLQkgICAgLy8gcG9zaXRpb24uIFdlIGRvIG5vdCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYXMgaXQgc2hvdWxkCi0JICAgIC8vIGFscmVhZHkgcG9pbnQgdG8gY29ycmVjdCBwbGFjZS4KLQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgbGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLCBUWVBFX0lORElSRUNULCAzKTsKLQkgICAgcmVzID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKCB0aCwgJnBhdGgsICZrZXksIGlub2RlLCAoY2hhciAqKShhbGxvY2F0ZWRfYmxvY2tzK2N1cnJfYmxvY2spLCBVTkZNX1BfU0laRSooYmxvY2tzX3RvX2FsbG9jYXRlLWN1cnJfYmxvY2spKTsKLQkgICAgaWYgKCByZXMgKSB7Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCX0gZWxzZSBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpICkgewotCSAgICAvLyBMYXN0IGZvdW5kIGl0ZW0gd2FzIHN0YXRkYXRhLiBUaGF0IG1lYW5zIHdlIG5lZWQgdG8gY3JlYXRlIGluZGlyZWN0IGl0ZW0uCi0JICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5zX2loOyAvKiBpdGVtaGVhZCBmb3IgbmV3IGl0ZW0gKi8KLQotCSAgICAvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLwotCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCAxLCBUWVBFX0lORElSRUNULCAzKTsgLy8gUG9zaXRpb24gb25lLAotCQkJCQkJCSAgICAvLyBiZWNhdXNlIHRoYXQncwotCQkJCQkJCSAgICAvLyB3aGVyZSBmaXJzdAotCQkJCQkJCSAgICAvLyBpbmRpcmVjdCBpdGVtCi0JCQkJCQkJICAgIC8vIGJlZ2lucwotCSAgICAvKiBDcmVhdGUgbmV3IGl0ZW0gaGVhZCBmb3Igb3VyIG5ldyBpdGVtICovCi0JICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmaW5zX2loLCAma2V5LCBrZXkudmVyc2lvbiwgMSwgVFlQRV9JTkRJUkVDVCwKLQkJCSAgICAgICAoYmxvY2tzX3RvX2FsbG9jYXRlLWN1cnJfYmxvY2spKlVORk1fUF9TSVpFLAotCQkJICAgICAgIDAgLyogZnJlZSBzcGFjZSAqLyk7Ci0JICAgIC8qIEZpbmQgd2hlcmUgc3VjaCBpdGVtIHNob3VsZCBsaXZlIGluIHRoZSB0cmVlICovCi0JICAgIHJlcyA9IHNlYXJjaF9pdGVtIChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCSAgICBpZiAoIHJlcyAhPSBJVEVNX05PVF9GT1VORCApIHsKLQkJLyogV2VsbCwgaWYgd2UgaGF2ZSBmb3VuZCBzdWNoIGl0ZW0gYWxyZWFkeSwgb3Igc29tZSBlcnJvcgotCQkgICBvY2N1cmVkLCB3ZSBuZWVkIHRvIHdhcm4gdXNlciBhbmQgcmV0dXJuIGVycm9yICovCi0JCWlmICggcmVzICE9IC1FTk9TUEMgKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKLQkJCQkgICAgICAiZ3JlZW4tOTAwOTogc2VhcmNoX2J5X2tleSAoJUspICIKLQkJCQkgICAgICAicmV0dXJuZWQgJWQiLCAma2V5LCByZXMpOwotCQl9Ci0JCXJlcyA9IC1FSU87Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCSAgICAvKiBJbnNlcnQgaXRlbSBpbnRvIHRoZSB0cmVlIHdpdGggdGhlIGRhdGEgYXMgaXRzIGJvZHkgKi8KLQkgICAgcmVzID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgJmluc19paCwgaW5vZGUsIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MrY3Vycl9ibG9jaykpOwotCX0gZWxzZSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAxMDogdW5leHBlY3RlZCBpdGVtIHR5cGUgZm9yIGtleSAlS1xuIiwma2V5KTsKLQl9Ci0gICAgfQotCi0gICAgLy8gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgdHJhbnNhY3Rpb24KLSAgICAvLyB1bmxlc3Mgd2UgcmV0dXJuIGFuIGVycm9yLCB0aGV5IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBsb2dnaW5nCi0gICAgLy8gdGhlIGlub2RlLgotICAgIC8vCi0gICAgcGF0aHJlbHNlKCZwYXRoKTsKLSAgICAvKgotICAgICAqIGNsZWFudXAgcHJlbGxvY2F0aW9uIGZyb20gcHJldmlvdXMgd3JpdGVzCi0gICAgICogaWYgdGhpcyBpcyBhIHBhcnRpYWwgYmxvY2sgd3JpdGUKLSAgICAgKi8KLSAgICBpZiAod3JpdGVfYnl0ZXMgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0xKSkKLSAgICAgICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyh0aCwgaW5vZGUpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0KLSAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGFnZXMvYnVmZmVycyBhbmQgbWFwIHRoZSBidWZmZXJzIHRvIG5ld2x5IGFsbG9jYXRlZAotICAgIC8vIGJsb2NrcyAoc28gdGhhdCBzeXN0ZW0ga25vd3Mgd2hlcmUgdG8gd3JpdGUgdGhlc2UgcGFnZXMgbGF0ZXIpLgotICAgIGN1cnJfYmxvY2sgPSAwOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhZ2VzIDsgaSsrICkgewotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvL2N1cnJlbnQgcGFnZQotCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsvLyBmaXJzdCBidWZmZXIgZm9yIGEgcGFnZQotCWludCBibG9ja19zdGFydCwgYmxvY2tfZW5kOyAvLyBpbi1wYWdlIG9mZnNldHMgZm9yIGJ1ZmZlcnMuCi0KLQlpZiAoIXBhZ2VfYnVmZmVycyhwYWdlKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDA1OiBObyBidWZmZXJzIGZvciBwcmVwYXJlZCBwYWdlPz8/Iik7Ci0KLQkvKiBGb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLwotCWZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKLQkgICAgaWYgKCFiaCkKLQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDA2OiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKLQkgICAgYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCSAgICBpZiAoaSA9PSAwICYmIGJsb2NrX2VuZCA8PSBmcm9tICkKLQkJLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCAqLwotCQljb250aW51ZTsKLQkgICAgaWYgKGkgPT0gbnVtX3BhZ2VzIC0gMSAmJiBibG9ja19zdGFydCA+PSB0bykKLQkJLyogSWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBhYm9ydAotCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLwotCQlicmVhazsKLQotCSAgICBpZiAoICFidWZmZXJfbWFwcGVkKGJoKSApIHsgLy8gT2ssIHVubWFwcGVkIGJ1ZmZlciwgbmVlZCB0byBtYXAgaXQKLQkJbWFwX2JoKCBiaCwgaW5vZGUtPmlfc2IsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja10pKTsKLQkJY3Vycl9ibG9jaysrOwotCQlzZXRfYnVmZmVyX25ldyhiaCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgUkZBTFNFKCBjdXJyX2Jsb2NrID4gYmxvY2tzX3RvX2FsbG9jYXRlLCAiZ3JlZW4tOTAwNzogVXNlZCB0b28gbWFueSBibG9ja3M/IHdlaXJkIik7Ci0KLSAgICBrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKLSAgICByZXR1cm4gMDsKKwlrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKKwlyZXR1cm4gMDsKIAogLy8gTmVlZCB0byBkZWFsIHdpdGggdHJhbnNhY3Rpb24gaGVyZS4KLWVycm9yX2V4aXRfZnJlZV9ibG9ja3M6Ci0gICAgcGF0aHJlbHNlKCZwYXRoKTsKLSAgICAvLyBmcmVlIGJsb2NrcwotICAgIGZvciggaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKyApCi0JcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbaV0pLCAxKTsKKyAgICAgIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwkvLyBmcmVlIGJsb2NrcworCWZvciAoaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKykKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbaV0pLAorCQkJCSAgICAxKTsKIAotZXJyb3JfZXhpdDoKLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgLy8gdXBkYXRlIGFueSBjaGFuZ2VzIHdlIG1hZGUgdG8gYmxrIGNvdW50Ci0gICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgICAgICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICByZXMgPSBlcnI7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAga2ZyZWUoYWxsb2NhdGVkX2Jsb2Nrcyk7CisgICAgICBlcnJvcl9leGl0OgorCWlmICh0aC0+dF90cmFuc19pZCkgeworCQlpbnQgZXJyOworCQkvLyB1cGRhdGUgYW55IGNoYW5nZXMgd2UgbWFkZSB0byBibGsgY291bnQKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCWVyciA9CisJCSAgICBqb3VybmFsX2VuZCh0aCwgaW5vZGUtPmlfc2IsCisJCQkJSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArCisJCQkJMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOworCQlpZiAoZXJyKQorCQkJcmVzID0gZXJyOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCWtmcmVlKGFsbG9jYXRlZF9ibG9ja3MpOwogCi0gICAgcmV0dXJuIHJlczsKKwlyZXR1cm4gcmVzOwogfQogCiAvKiBVbmxvY2sgcGFnZXMgcHJlcGFyZWQgYnkgcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUgKi8KLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBsaXN0IG9mIGxvY2tlZCBwYWdlcyAqLwotCQkJICAgICAgc2l6ZV90IG51bV9wYWdlcyAvKiBhbW91bnQgb2YgcGFnZXMgKi8pIHsKLSAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyCitzdGF0aWMgdm9pZCByZWlzZXJmc191bnByZXBhcmVfcGFnZXMoc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywJLyogbGlzdCBvZiBsb2NrZWQgcGFnZXMgKi8KKwkJCQkgICAgIHNpemVfdCBudW1fcGFnZXMgLyogYW1vdW50IG9mIHBhZ2VzICovICkKK3sKKwlpbnQgaTsJCQkvLyBsb29wIGNvdW50ZXIKIAotICAgIGZvciAoaT0wOyBpIDwgbnVtX3BhZ2VzIDsgaSsrKSB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsKIAotCXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotICAgIH0KKwkJdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gc3BlY2lmaWVkIHBhZ2VzIHdpdGhpbgogICAgc3VwcGxpZWQgYnl0ZSByYW5nZSAqLwotc3RhdGljIGludCByZWlzZXJmc19jb3B5X2Zyb21fdXNlcl90b19maWxlX3JlZ2lvbigKLQkJCQlsb2ZmX3QgcG9zLCAvKiBJbi1maWxlIHBvc2l0aW9uICovCi0JCQkJaW50IG51bV9wYWdlcywgLyogTnVtYmVyIG9mIHBhZ2VzIGFmZmVjdGVkICovCi0JCQkJaW50IHdyaXRlX2J5dGVzLCAvKiBBbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KLQkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBwb2ludGVyIHRvIAotCQkJCQkJCQkgYXJyYXkgdG8KLQkJCQkJCQkJIHByZXBhcmVkIHBhZ2VzCi0JCQkJCQkJCSovCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiAvKiBQb2ludGVyIHRvIHVzZXItc3VwcGxpZWQKLQkJCQkJCSAgIGRhdGEqLwotCQkJCSkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29weV9mcm9tX3VzZXJfdG9fZmlsZV9yZWdpb24obG9mZl90IHBvcywJLyogSW4tZmlsZSBwb3NpdGlvbiAqLworCQkJCQkJICBpbnQgbnVtX3BhZ2VzLAkvKiBOdW1iZXIgb2YgcGFnZXMgYWZmZWN0ZWQgKi8KKwkJCQkJCSAgaW50IHdyaXRlX2J5dGVzLAkvKiBBbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkJCSAgc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywJLyogcG9pbnRlciB0byAKKwkJCQkJCQkJCQkgICBhcnJheSB0bworCQkJCQkJCQkJCSAgIHByZXBhcmVkIHBhZ2VzCisJCQkJCQkJCQkJICovCisJCQkJCQkgIGNvbnN0IGNoYXIgX191c2VyICogYnVmCS8qIFBvaW50ZXIgdG8gdXNlci1zdXBwbGllZAorCQkJCQkJCQkJCSAgIGRhdGEgKi8KKyAgICApCiB7Ci0gICAgbG9uZyBwYWdlX2ZhdWx0PTA7IC8vIHN0YXR1cyBvZiBjb3B5X2Zyb21fdXNlci4KLSAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyLgotICAgIGludCBvZmZzZXQ7IC8vIG9mZnNldCBpbiBwYWdlCisJbG9uZyBwYWdlX2ZhdWx0ID0gMDsJLy8gc3RhdHVzIG9mIGNvcHlfZnJvbV91c2VyLgorCWludCBpOwkJCS8vIGxvb3AgY291bnRlci4KKwlpbnQgb2Zmc2V0OwkJLy8gb2Zmc2V0IGluIHBhZ2UKIAotICAgIGZvciAoIGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IGkgPCBudW1fcGFnZXMgOyBpKyssb2Zmc2V0PTApIHsKLQlzaXplX3QgY291bnQgPSBtaW5fdChzaXplX3QsUEFHRV9DQUNIRV9TSVpFLW9mZnNldCx3cml0ZV9ieXRlcyk7IC8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KKwlmb3IgKGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgaSA8IG51bV9wYWdlczsKKwkgICAgIGkrKywgb2Zmc2V0ID0gMCkgeworCQlzaXplX3QgY291bnQgPSBtaW5fdChzaXplX3QsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCwgd3JpdGVfYnl0ZXMpOwkvLyBIb3cgbXVjaCBvZiBieXRlcyB0byB3cml0ZSB0byB0aGlzIHBhZ2UKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsJLy8gQ3VycmVudCBwYWdlIHdlIHByb2Nlc3MuCiAKLQlmYXVsdF9pbl9wYWdlc19yZWFkYWJsZSggYnVmLCBjb3VudCk7CisJCWZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKGJ1ZiwgY291bnQpOwogCi0JLyogQ29weSBkYXRhIGZyb20gdXNlcnNwYWNlIHRvIHRoZSBjdXJyZW50IHBhZ2UgKi8KLQlrbWFwKHBhZ2UpOwotCXBhZ2VfZmF1bHQgPSBfX2NvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKStvZmZzZXQsIGJ1ZiwgY291bnQpOyAvLyBDb3B5IHRoZSBkYXRhLgotCS8qIEZsdXNoIHByb2Nlc3NvcidzIGRjYWNoZSBmb3IgdGhpcyBwYWdlICovCi0JZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Ci0Ja3VubWFwKHBhZ2UpOwotCWJ1Zis9Y291bnQ7Ci0Jd3JpdGVfYnl0ZXMtPWNvdW50OworCQkvKiBDb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gdGhlIGN1cnJlbnQgcGFnZSAqLworCQlrbWFwKHBhZ2UpOworCQlwYWdlX2ZhdWx0ID0gX19jb3B5X2Zyb21fdXNlcihwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIGJ1ZiwgY291bnQpOwkvLyBDb3B5IHRoZSBkYXRhLgorCQkvKiBGbHVzaCBwcm9jZXNzb3IncyBkY2FjaGUgZm9yIHRoaXMgcGFnZSAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwKHBhZ2UpOworCQlidWYgKz0gY291bnQ7CisJCXdyaXRlX2J5dGVzIC09IGNvdW50OwogCi0JaWYgKHBhZ2VfZmF1bHQpCi0JICAgIGJyZWFrOyAvLyBXYXMgdGhlcmUgYSBmYXVsdD8gYWJvcnQuCi0gICAgfQorCQlpZiAocGFnZV9mYXVsdCkKKwkJCWJyZWFrOwkvLyBXYXMgdGhlcmUgYSBmYXVsdD8gYWJvcnQuCisJfQogCi0gICAgcmV0dXJuIHBhZ2VfZmF1bHQ/LUVGQVVMVDowOworCXJldHVybiBwYWdlX2ZhdWx0ID8gLUVGQVVMVCA6IDA7CiB9CiAKIC8qIHRha2VuIGZzL2J1ZmZlci5jOl9fYmxvY2tfY29tbWl0X3dyaXRlICovCiBpbnQgcmVpc2VyZnNfY29tbWl0X3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQorCQkJIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQogewotICAgIHVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7Ci0gICAgaW50IHBhcnRpYWwgPSAwOwotICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKLSAgICB1bnNpZ25lZCBsb25nIGlfc2l6ZV9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKLSAgICBpbnQgbmV3OwotICAgIGludCBsb2dpdCA9IHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGlub2RlLT5pX3NiOwotICAgIGludCBiaF9wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHMtPnNfYmxvY2tzaXplOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IHJldCA9IDA7CisJdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKKwlpbnQgcGFydGlhbCA9IDA7CisJdW5zaWduZWQgYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXVuc2lnbmVkIGxvbmcgaV9zaXplX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBuZXc7CisJaW50IGxvZ2l0ID0gcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7CisJaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0ID0gMDsKIAotICAgIHRoLnRfdHJhbnNfaWQgPSAwOwotICAgIGJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwl0aC50X3RyYW5zX2lkID0gMDsKKwlibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CiAKLSAgICBpZiAobG9naXQpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwotCXJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotCWlmIChyZXQpCi0JICAgIGdvdG8gZHJvcF93cml0ZV9sb2NrOwotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7Ci0gICAgfQotICAgIGZvcihiaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSksIGJsb2NrX3N0YXJ0ID0gMDsKLSAgICAgICAgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkKLSAgICB7Ci0KLQluZXcgPSBidWZmZXJfbmV3KGJoKTsKLQljbGVhcl9idWZmZXJfbmV3KGJoKTsKLQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKLQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKLQkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotCQkgICAgcGFydGlhbCA9IDE7Ci0JfSBlbHNlIHsKLQkgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JICAgIGlmIChsb2dpdCkgewotCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKLQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOwotCSAgICB9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJLyogZG8gZGF0YT1vcmRlcmVkIG9uIGFueSBwYWdlIHBhc3QgdGhlIGVuZAotCQkgKiBvZiBmaWxlIGFuZCBhbnkgYnVmZmVyIG1hcmtlZCBCSF9OZXcuCi0JCSAqLwotCQlpZiAocmVpc2VyZnNfZGF0YV9vcmRlcmVkKGlub2RlLT5pX3NiKSAmJgotCQkgICAgKG5ldyB8fCBwYWdlLT5pbmRleCA+PSBpX3NpemVfaW5kZXgpKSB7Ci0JCSAgICByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaCk7Ci0JICAgICAgICB9Ci0JICAgIH0KKwlpZiAobG9naXQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGRyb3Bfd3JpdGVfbG9jazsKKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAl9Ci0gICAgfQotICAgIGlmIChsb2dpdCkgewotCXJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKLWRyb3Bfd3JpdGVfbG9jazoKLQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgdGhpcyBpcyBhIHBhcnRpYWwgd3JpdGUgd2hpY2ggaGFwcGVuZWQgdG8gbWFrZSBhbGwgYnVmZmVycwotICAgICAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIG9wdGltaXplIGF3YXkgYSBib2d1cyByZWFkcGFnZSgpIGZvcgotICAgICAqIHRoZSBuZXh0IHJlYWQoKS4gSGVyZSB3ZSAnZGlzY292ZXInIHdoZXRoZXIgdGhlIHBhZ2Ugd2VudAotICAgICAqIHVwdG9kYXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgKHBvdGVudGlhbGx5IHBhcnRpYWwpIHdyaXRlLgotICAgICAqLwotICAgIGlmICghcGFydGlhbCkKLQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KKwlmb3IgKGJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSwgYmxvY2tfc3RhcnQgPSAwOworCSAgICAgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJICAgICBibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKIAorCQluZXcgPSBidWZmZXJfbmV3KGJoKTsKKwkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQlwYXJ0aWFsID0gMTsKKwkJfSBlbHNlIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJaWYgKGxvZ2l0KSB7CisJCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMSk7CisJCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOworCQkJfSBlbHNlIGlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQkvKiBkbyBkYXRhPW9yZGVyZWQgb24gYW55IHBhZ2UgcGFzdCB0aGUgZW5kCisJCQkJICogb2YgZmlsZSBhbmQgYW55IGJ1ZmZlciBtYXJrZWQgQkhfTmV3LgorCQkJCSAqLworCQkJCWlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpICYmCisJCQkJICAgIChuZXcgfHwgcGFnZS0+aW5kZXggPj0gaV9zaXplX2luZGV4KSkgeworCQkJCQlyZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChsb2dpdCkgeworCQlyZXQgPSBqb3VybmFsX2VuZCgmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7CisJICAgICAgZHJvcF93cml0ZV9sb2NrOgorCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJfQorCS8qCisJICogSWYgdGhpcyBpcyBhIHBhcnRpYWwgd3JpdGUgd2hpY2ggaGFwcGVuZWQgdG8gbWFrZSBhbGwgYnVmZmVycworCSAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIG9wdGltaXplIGF3YXkgYSBib2d1cyByZWFkcGFnZSgpIGZvcgorCSAqIHRoZSBuZXh0IHJlYWQoKS4gSGVyZSB3ZSAnZGlzY292ZXInIHdoZXRoZXIgdGhlIHBhZ2Ugd2VudAorCSAqIHVwdG9kYXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgKHBvdGVudGlhbGx5IHBhcnRpYWwpIHdyaXRlLgorCSAqLworCWlmICghcGFydGlhbCkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CiAKIC8qIFN1Ym1pdCBwYWdlcyBmb3Igd3JpdGUuIFRoaXMgd2FzIHNlcGFyYXRlZCBmcm9tIGFjdHVhbCBmaWxlIGNvcHlpbmcKICAgIGJlY2F1c2Ugd2UgbWlnaHQgd2FudCB0byBhbGxvY2F0ZSBibG9jayBudW1iZXJzIGluLWJldHdlZW4uCiAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBjYWxsZXIgd2lsbCBhZGp1c3QgZmlsZSBzaXplIHRvIGNvcnJlY3QgdmFsdWUuICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3N1Ym1pdF9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoCi0JCQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uIG9mZnNldCAqLwotCQkJCXNpemVfdCBudW1fcGFnZXMsIC8qIE51bWJlciBvZiBwYWdlcyB0byB3cml0ZSAqLwotCQkJCXNpemVfdCB3cml0ZV9ieXRlcywgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCi0JCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcyAvKiBsaXN0IG9mIHBhZ2VzICovCi0JCQkJKQorc3RhdGljIGludCByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLAkvKiBXcml0aW5nIHBvc2l0aW9uIG9mZnNldCAqLworCQkJCQkJIHNpemVfdCBudW1fcGFnZXMsCS8qIE51bWJlciBvZiBwYWdlcyB0byB3cml0ZSAqLworCQkJCQkJIHNpemVfdCB3cml0ZV9ieXRlcywJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJCQkgc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcwkvKiBsaXN0IG9mIHBhZ2VzICovCisgICAgKQogewotICAgIGludCBzdGF0dXM7IC8vIHJldHVybiBzdGF0dXMgb2YgYmxvY2tfY29tbWl0X3dyaXRlLgotICAgIGludCByZXR2YWwgPSAwOyAvLyBSZXR1cm4gdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJldHVybi4KLSAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyCi0gICAgaW50IG9mZnNldDsgLy8gV3JpdGluZyBvZmZzZXQgaW4gcGFnZS4KLSAgICBpbnQgb3JpZ193cml0ZV9ieXRlcyA9IHdyaXRlX2J5dGVzOwotICAgIGludCBzZF91cGRhdGUgPSAwOworCWludCBzdGF0dXM7CQkvLyByZXR1cm4gc3RhdHVzIG9mIGJsb2NrX2NvbW1pdF93cml0ZS4KKwlpbnQgcmV0dmFsID0gMDsJCS8vIFJldHVybiB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuLgorCWludCBpOwkJCS8vIGxvb3AgY291bnRlcgorCWludCBvZmZzZXQ7CQkvLyBXcml0aW5nIG9mZnNldCBpbiBwYWdlLgorCWludCBvcmlnX3dyaXRlX2J5dGVzID0gd3JpdGVfYnl0ZXM7CisJaW50IHNkX3VwZGF0ZSA9IDA7CiAKLSAgICBmb3IgKCBpID0gMCwgb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOyBpIDwgbnVtX3BhZ2VzIDsgaSsrLG9mZnNldD0wKSB7Ci0JaW50IGNvdW50ID0gbWluX3QoaW50LFBBR0VfQ0FDSEVfU0laRS1vZmZzZXQsd3JpdGVfYnl0ZXMpOyAvLyBIb3cgbXVjaCBvZiBieXRlcyB0byB3cml0ZSB0byB0aGlzIHBhZ2UKLQlzdHJ1Y3QgcGFnZSAqcGFnZT1wcmVwYXJlZF9wYWdlc1tpXTsgLy8gQ3VycmVudCBwYWdlIHdlIHByb2Nlc3MuCisJZm9yIChpID0gMCwgb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IGkgPCBudW1fcGFnZXM7CisJICAgICBpKyssIG9mZnNldCA9IDApIHsKKwkJaW50IGNvdW50ID0gbWluX3QoaW50LCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQsIHdyaXRlX2J5dGVzKTsJLy8gSG93IG11Y2ggb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhpcyBwYWdlCisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CS8vIEN1cnJlbnQgcGFnZSB3ZSBwcm9jZXNzLgogCi0Jc3RhdHVzID0gcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0K2NvdW50KTsKLQlpZiAoIHN0YXR1cyApCi0JICAgIHJldHZhbCA9IHN0YXR1czsgLy8gVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMgV2UgYXJlIGdvaW5nIHRvCi0JCQkgICAgIC8vIHN1Ym1pdCBhbGwgdGhlIHBhZ2VzIGV2ZW4gaWYgdGhlcmUgd2FzIGVycm9yLgotCQkJICAgICAvLyB3ZSBvbmx5IHJlbWVtYmVyIGVycm9yIHN0YXR1cyB0byByZXBvcnQgaXQgb24KLQkJCSAgICAgLy8gZXhpdC4KLQl3cml0ZV9ieXRlcy09Y291bnQ7Ci0gICAgfQotICAgIC8qIG5vdyB0aGF0IHdlJ3ZlIGdvdHRlbiBhbGwgdGhlIG9yZGVyZWQgYnVmZmVycyBtYXJrZWQgZGlydHksCi0gICAgICogd2UgY2FuIHNhZmVseSB1cGRhdGUgaV9zaXplIGFuZCBjbG9zZSBhbnkgcnVubmluZyB0cmFuc2FjdGlvbgotICAgICAqLwotICAgIGlmICggcG9zICsgb3JpZ193cml0ZV9ieXRlcyA+IGlub2RlLT5pX3NpemUpIHsKLQlpbm9kZS0+aV9zaXplID0gcG9zICsgb3JpZ193cml0ZV9ieXRlczsgLy8gU2V0IG5ldyBzaXplCi0JLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBzbyBtdWNoIHRoYXQgdGFpbCBwYWNraW5nIGlzIG5vCi0JICogbG9uZ2VyIHBvc3NpYmxlLCByZXNldCAibmVlZCB0byBwYWNrIiBmbGFnICovCi0JaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JICAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZSAoaW5vZGUpKjQpIHx8Ci0JICAgICAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JICAgICBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSkgKQotCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2sgOwotICAgICAgICBlbHNlIGlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgotCSAgICAgICAgICBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKLQkgICAgICAgICAgKGhhdmVfc21hbGxfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgotCQkgIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfcGFja19vbl9jbG9zZV9tYXNrIDsKKwkJc3RhdHVzID0KKwkJICAgIHJlaXNlcmZzX2NvbW1pdF9wYWdlKGlub2RlLCBwYWdlLCBvZmZzZXQsIG9mZnNldCArIGNvdW50KTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHZhbCA9IHN0YXR1czsJLy8gVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMgV2UgYXJlIGdvaW5nIHRvCisJCS8vIHN1Ym1pdCBhbGwgdGhlIHBhZ2VzIGV2ZW4gaWYgdGhlcmUgd2FzIGVycm9yLgorCQkvLyB3ZSBvbmx5IHJlbWVtYmVyIGVycm9yIHN0YXR1cyB0byByZXBvcnQgaXQgb24KKwkJLy8gZXhpdC4KKwkJd3JpdGVfYnl0ZXMgLT0gY291bnQ7CisJfQorCS8qIG5vdyB0aGF0IHdlJ3ZlIGdvdHRlbiBhbGwgdGhlIG9yZGVyZWQgYnVmZmVycyBtYXJrZWQgZGlydHksCisJICogd2UgY2FuIHNhZmVseSB1cGRhdGUgaV9zaXplIGFuZCBjbG9zZSBhbnkgcnVubmluZyB0cmFuc2FjdGlvbgorCSAqLworCWlmIChwb3MgKyBvcmlnX3dyaXRlX2J5dGVzID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpbm9kZS0+aV9zaXplID0gcG9zICsgb3JpZ193cml0ZV9ieXRlczsJLy8gU2V0IG5ldyBzaXplCisJCS8qIElmIHRoZSBmaWxlIGhhdmUgZ3Jvd24gc28gbXVjaCB0aGF0IHRhaWwgcGFja2luZyBpcyBubworCQkgKiBsb25nZXIgcG9zc2libGUsIHJlc2V0ICJuZWVkIHRvIHBhY2siIGZsYWcgKi8KKwkJaWYgKChoYXZlX2xhcmdlX3RhaWxzKGlub2RlLT5pX3NiKSAmJgorCQkgICAgIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpICogNCkgfHwKKwkJICAgIChoYXZlX3NtYWxsX3RhaWxzKGlub2RlLT5pX3NiKSAmJgorCQkgICAgIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpKSkKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKKwkJZWxzZSBpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpICYmCisJCQkgIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpICogNCkgfHwKKwkJCSAoaGF2ZV9zbWFsbF90YWlscyhpbm9kZS0+aV9zYikgJiYKKwkJCSAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpKQorCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2s7CiAKKwkJaWYgKHRoLT50X3RyYW5zX2lkKSB7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwkvLyBBbmQgdXBkYXRlIG9uLWRpc2sgbWV0YWRhdGEKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCX0gZWxzZQorCQkJaW5vZGUtPmlfc2ItPnNfb3AtPmRpcnR5X2lub2RlKGlub2RlKTsKKworCQlzZF91cGRhdGUgPSAxOworCX0KIAlpZiAodGgtPnRfdHJhbnNfaWQpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOyAvLyBBbmQgdXBkYXRlIG9uLWRpc2sgbWV0YWRhdGEKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQl9IGVsc2UKLQkgICAgaW5vZGUtPmlfc2ItPnNfb3AtPmRpcnR5X2lub2RlKGlub2RlKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghc2RfdXBkYXRlKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCXN0YXR1cyA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR2YWwgPSBzdGF0dXM7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJfQorCXRoLT50X3RyYW5zX2lkID0gMDsKIAotICAgICAgICBzZF91cGRhdGUgPSAxOwotICAgIH0KLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQlpZiAoIXNkX3VwZGF0ZSkKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7Ci0Jc3RhdHVzID0gam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKLSAgICAgICAgaWYgKHN0YXR1cykKLSAgICAgICAgICAgIHJldHZhbCA9IHN0YXR1czsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIH0KLSAgICB0aC0+dF90cmFuc19pZCA9IDA7Ci0KLSAgICAvKiAKLSAgICAgKiB3ZSBoYXZlIHRvIHVubG9jayB0aGUgcGFnZXMgYWZ0ZXIgdXBkYXRpbmcgaV9zaXplLCBvdGhlcndpc2UKLSAgICAgKiB3ZSByYWNlIHdpdGggd3JpdGVwYWdlCi0gICAgICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKyspIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZT1wcmVwYXJlZF9wYWdlc1tpXTsKLQl1bmxvY2tfcGFnZShwYWdlKTsgCi0JbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOwotCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKKwkvKiAKKwkgKiB3ZSBoYXZlIHRvIHVubG9jayB0aGUgcGFnZXMgYWZ0ZXIgdXBkYXRpbmcgaV9zaXplLCBvdGhlcndpc2UKKwkgKiB3ZSByYWNlIHdpdGggd3JpdGVwYWdlCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogTG9vayBpZiBwYXNzZWQgd3JpdGluZyByZWdpb24gaXMgZ29pbmcgdG8gdG91Y2ggZmlsZSdzIHRhaWwKICAgIChpZiBpdCBpcyBwcmVzZW50KS4gQW5kIGlmIGl0IGlzLCBjb252ZXJ0IHRoZSB0YWlsIHRvIHVuZm9ybWF0dGVkIG5vZGUgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIC8qIGlub2RlIHRvIGRlYWwgd2l0aCAqLwotCQkJCQkgbG9mZl90IHBvcywgLyogV3JpdGluZyBwb3NpdGlvbiAqLwotCQkJCQkgaW50IHdyaXRlX2J5dGVzIC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLwotCQkJCSAgICAgICAgKQorc3RhdGljIGludCByZWlzZXJmc19jaGVja19mb3JfdGFpbF9hbmRfY29udmVydChzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBpbm9kZSB0byBkZWFsIHdpdGggKi8KKwkJCQkJICAgICAgIGxvZmZfdCBwb3MsCS8qIFdyaXRpbmcgcG9zaXRpb24gKi8KKwkJCQkJICAgICAgIGludCB3cml0ZV9ieXRlcwkvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKyAgICApCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBuZWVkZWQgZm9yIHNlYXJjaF9mb3JfcG9zaXRpb24KLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIEtleSB0aGF0IHdvdWxkIHJlcHJlc2VudCBsYXN0IHRvdWNoZWQgd3JpdGluZyBieXRlLgotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloOyAvLyBpdGVtIGhlYWRlciBvZiBmb3VuZCBibG9jazsKLSAgICBpbnQgcmVzOyAvLyBSZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgd2UgY2FsbC4KLSAgICBpbnQgY29udF9leHBhbmRfb2Zmc2V0OyAvLyBXZSB3aWxsIHB1dCBvZmZzZXQgZm9yIGdlbmVyaWNfY29udF9leHBhbmQgaGVyZQotCQkJICAgIC8vIFRoaXMgY2FuIGJlIGludCBqdXN0IGJlY2F1c2UgdGFpbHMgYXJlIGNyZWF0ZWQKLQkJCSAgICAvLyBvbmx5IGZvciBzbWFsbCBmaWxlcy4KLSAKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CS8vIG5lZWRlZCBmb3Igc2VhcmNoX2Zvcl9wb3NpdGlvbgorCXN0cnVjdCBjcHVfa2V5IGtleTsJLy8gS2V5IHRoYXQgd291bGQgcmVwcmVzZW50IGxhc3QgdG91Y2hlZCB3cml0aW5nIGJ5dGUuCisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CS8vIGl0ZW0gaGVhZGVyIG9mIGZvdW5kIGJsb2NrOworCWludCByZXM7CQkvLyBSZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgd2UgY2FsbC4KKwlpbnQgY29udF9leHBhbmRfb2Zmc2V0OwkvLyBXZSB3aWxsIHB1dCBvZmZzZXQgZm9yIGdlbmVyaWNfY29udF9leHBhbmQgaGVyZQorCS8vIFRoaXMgY2FuIGJlIGludCBqdXN0IGJlY2F1c2UgdGFpbHMgYXJlIGNyZWF0ZWQKKwkvLyBvbmx5IGZvciBzbWFsbCBmaWxlcy4KKwogLyogdGhpcyBlbWJvZGllcyBhIGRlcGVuZGVuY3kgb24gYSBwYXJ0aWN1bGFyIHRhaWwgcG9saWN5ICovCi0gICAgaWYgKCBpbm9kZS0+aV9zaXplID49IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSo0ICkgewotCS8qIHN1Y2ggYSBiaWcgZmlsZXMgZG8gbm90IGhhdmUgdGFpbHMsIHNvIHdlIHdvbid0IGJvdGhlciBvdXJzZWx2ZXMKLQkgICB0byBsb29rIGZvciB0YWlscywgc2ltcGx5IHJldHVybiAqLwotCXJldHVybiAwOwotICAgIH0KKwlpZiAoaW5vZGUtPmlfc2l6ZSA+PSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKiA0KSB7CisJCS8qIHN1Y2ggYSBiaWcgZmlsZXMgZG8gbm90IGhhdmUgdGFpbHMsIHNvIHdlIHdvbid0IGJvdGhlciBvdXJzZWx2ZXMKKwkJICAgdG8gbG9vayBmb3IgdGFpbHMsIHNpbXBseSByZXR1cm4gKi8KKwkJcmV0dXJuIDA7CisJfQogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgLyogZmluZCB0aGUgaXRlbSBjb250YWluaW5nIHRoZSBsYXN0IGJ5dGUgdG8gYmUgd3JpdHRlbiwgb3IgaWYKLSAgICAgKiB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBsYXN0IGl0ZW0gb2YgdGhlCi0gICAgICogZmlsZSAoYW5kIHRoZW4gd2UgY2hlY2sgaXRzIHR5cGUpLiAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIHBvcyt3cml0ZV9ieXRlcysxLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKLSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotICAgIGlmICggcmVzID09IElPX0VSUk9SICkgewotICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCXJldHVybiAtRUlPOwotICAgIH0KLSAgICBpaCA9IGdldF9paCgmcGF0aCk7Ci0gICAgcmVzID0gMDsKLSAgICBpZiAoIGlzX2RpcmVjdF9sZV9paChpaCkgKSB7Ci0JLyogT2ssIGNsb3Nlc3QgaXRlbSBpcyBmaWxlIHRhaWwgKHRhaWxzIGFyZSBzdG9yZWQgaW4gImRpcmVjdCIKLQkgKiBpdGVtcyksIHNvIHdlIG5lZWQgdG8gdW5wYWNrIGl0LiAqLwotCS8qIFRvIG5vdCBvdmVyY29tcGxpY2F0ZSBtYXR0ZXJzLCB3ZSBqdXN0IGNhbGwgZ2VuZXJpY19jb250X2V4cGFuZAotCSAgIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIG90aGVyIHN0dWZmIGFuZCBmaW5hbGx5IHdpbGwgYm9pbCBkb3duIHRvCi0JICAgIHJlaXNlcmZzX2dldF9ibG9jaygpIHRoYXQgd291bGQgZG8gbmVjZXNzYXJ5IGNvbnZlcnNpb24uICovCi0JY29udF9leHBhbmRfb2Zmc2V0ID0gbGVfa2V5X2tfb2Zmc2V0KGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7Ci0JcGF0aHJlbHNlKCZwYXRoKTsKLQlyZXMgPSBnZW5lcmljX2NvbnRfZXhwYW5kKCBpbm9kZSwgY29udF9leHBhbmRfb2Zmc2V0KTsKLSAgICB9IGVsc2UKLQlwYXRocmVsc2UoJnBhdGgpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCS8qIGZpbmQgdGhlIGl0ZW0gY29udGFpbmluZyB0aGUgbGFzdCBieXRlIHRvIGJlIHdyaXR0ZW4sIG9yIGlmCisJICogd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdGhlbiB0aGUgbGFzdCBpdGVtIG9mIHRoZQorCSAqIGZpbGUgKGFuZCB0aGVuIHdlIGNoZWNrIGl0cyB0eXBlKS4gKi8KKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIHBvcyArIHdyaXRlX2J5dGVzICsgMSwgVFlQRV9BTlksCisJCSAgICAgMyAvKmtleSBsZW5ndGggKi8gKTsKKwlyZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWloID0gZ2V0X2loKCZwYXRoKTsKKwlyZXMgPSAwOworCWlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisJCS8qIE9rLCBjbG9zZXN0IGl0ZW0gaXMgZmlsZSB0YWlsICh0YWlscyBhcmUgc3RvcmVkIGluICJkaXJlY3QiCisJCSAqIGl0ZW1zKSwgc28gd2UgbmVlZCB0byB1bnBhY2sgaXQuICovCisJCS8qIFRvIG5vdCBvdmVyY29tcGxpY2F0ZSBtYXR0ZXJzLCB3ZSBqdXN0IGNhbGwgZ2VuZXJpY19jb250X2V4cGFuZAorCQkgICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBvdGhlciBzdHVmZiBhbmQgZmluYWxseSB3aWxsIGJvaWwgZG93biB0bworCQkgICByZWlzZXJmc19nZXRfYmxvY2soKSB0aGF0IHdvdWxkIGRvIG5lY2Vzc2FyeSBjb252ZXJzaW9uLiAqLworCQljb250X2V4cGFuZF9vZmZzZXQgPQorCQkgICAgbGVfa2V5X2tfb2Zmc2V0KGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwKKwkJCQkgICAgJihpaC0+aWhfa2V5KSk7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCXJlcyA9IGdlbmVyaWNfY29udF9leHBhbmQoaW5vZGUsIGNvbnRfZXhwYW5kX29mZnNldCk7CisJfSBlbHNlCisJCXBhdGhyZWxzZSgmcGF0aCk7CiAKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiByZXM7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmVzOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGxvY2tzIHBhZ2VzIHN0YXJ0aW5nIGZyb20gQHBvcyBmb3IgQGlub2RlLgpAQCAtODUxLDI3NSArOTQ3LDI5NiBAQAogICAgYXBwZW5kKSwgaXQgaXMgemVyb2VkLCB0aGVuLiAKICAgIFJldHVybnMgbnVtYmVyIG9mIHVuYWxsb2NhdGVkIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQgdG8gY292ZXIKICAgIG5ldyBmaWxlIGRhdGEuKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSAvKiBJbm9kZSBvZiB0aGUgZmlsZSAqLywKLQkJCQlsb2ZmX3QgcG9zLCAvKiBwb3NpdGlvbiBpbiB0aGUgZmlsZSAqLwotCQkJCXNpemVfdCBudW1fcGFnZXMsIC8qIG51bWJlciBvZiBwYWdlcyB0bwotCQkJCQkgICAgICAgICAgcHJlcGFyZSAqLwotCQkJCXNpemVfdCB3cml0ZV9ieXRlcywgLyogQW1vdW50IG9mIGJ5dGVzIHRvIGJlCi0JCQkJCQkgICAgb3ZlcndyaXR0ZW4gZnJvbQotCQkJCQkJICAgIEBwb3MgKi8KLQkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzIC8qIHBvaW50ZXIgdG8gYXJyYXkKLQkJCQkJCQkgICAgICAgd2hlcmUgdG8gc3RvcmUKLQkJCQkJCQkgICAgICAgcHJlcGFyZWQgcGFnZXMgKi8KLQkJCQkJICAgKQorc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlCisJCQkJCQkgIC8qIElub2RlIG9mIHRoZSBmaWxlICovICwKKwkJCQkJCSAgbG9mZl90IHBvcywJLyogcG9zaXRpb24gaW4gdGhlIGZpbGUgKi8KKwkJCQkJCSAgc2l6ZV90IG51bV9wYWdlcywJLyogbnVtYmVyIG9mIHBhZ2VzIHRvCisJCQkJCQkJCQkgICBwcmVwYXJlICovCisJCQkJCQkgIHNpemVfdCB3cml0ZV9ieXRlcywJLyogQW1vdW50IG9mIGJ5dGVzIHRvIGJlCisJCQkJCQkJCQkgICBvdmVyd3JpdHRlbiBmcm9tCisJCQkJCQkJCQkgICBAcG9zICovCisJCQkJCQkgIHN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMJLyogcG9pbnRlciB0byBhcnJheQorCQkJCQkJCQkJCSAgIHdoZXJlIHRvIHN0b3JlCisJCQkJCQkJCQkJICAgcHJlcGFyZWQgcGFnZXMgKi8KKyAgICApCiB7Ci0gICAgaW50IHJlcz0wOyAvLyBSZXR1cm4gdmFsdWVzIG9mIGRpZmZlcmVudCBmdW5jdGlvbnMgd2UgY2FsbC4KLSAgICB1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7IC8vIE9mZnNldCBpbiBmaWxlIGluIHBhZ2VzLgotICAgIGludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IC8vIFdyaXRpbmcgb2Zmc2V0IGluIGZpcnN0IHBhZ2UKLSAgICBpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsKLQkJCQkJIC8qIG9mZnNldCBvZiBsYXN0IG1vZGlmaWVkIGJ5dGUgaW4gbGFzdAotCQkJCSAgICAgICAgICAgIHBhZ2UgKi8KLSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7IC8vIFBhZ2VzIGFyZSBtYXBwZWQgaGVyZS4KLSAgICBpbnQgaTsgLy8gU2ltcGxlIGNvdW50ZXIKLSAgICBpbnQgYmxvY2tzID0gMDsgLyogUmV0dXJuIHZhbHVlIChibG9ja3MgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkKSAqLwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOyAvLyBDdXJyZW50IGJ1ZmZlcmhlYWQgYW5kIGZpcnN0IGJ1ZmZlcmhlYWQKLQkJCQkgICAvLyBvZiBhIHBhZ2UuCi0gICAgdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsgLy8gU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIGN1cnJlbnQKLQkJCQkgICAgIC8vIGJ1ZmZlciBpbiB0aGUgcGFnZS4KLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKndhaXRbMl0sICoqd2FpdF9iaD13YWl0OyAvLyBCdWZmZXJzIGZvciBwYWdlLCBpZgotCQkJCQkJIC8vIFBhZ2UgYXBwZWFyZWQgdG8gYmUgbm90IHVwCi0JCQkJCQkgLy8gdG8gZGF0ZS4gTm90ZSBob3cgd2UgaGF2ZQotCQkJCQkJIC8vIGF0IG1vc3QgMiBidWZmZXJzLCB0aGlzIGlzCi0JCQkJCQkgLy8gYmVjYXVzZSB3ZSBhdCBtb3N0IG1heQotCQkJCQkJIC8vIHBhcnRpYWxseSBvdmVyd3JpdGUgdHdvCi0JCQkJCQkgLy8gYnVmZmVycyBmb3Igb25lIHBhZ2UuIE9uZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHdyaXRlIGFyZWEKLQkJCQkJCSAvLyBhbmQgb25lIGF0IHRoZSBlbmQuCi0JCQkJCQkgLy8gRXZlcnl0aGluZyBpbnRoZSBtaWRkbGUgZ2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdHRlbiB0b3RhbGx5LgorCWludCByZXMgPSAwOwkJLy8gUmV0dXJuIHZhbHVlcyBvZiBkaWZmZXJlbnQgZnVuY3Rpb25zIHdlIGNhbGwuCisJdW5zaWduZWQgbG9uZyBpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwkvLyBPZmZzZXQgaW4gZmlsZSBpbiBwYWdlcy4KKwlpbnQgZnJvbSA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwkvLyBXcml0aW5nIG9mZnNldCBpbiBmaXJzdCBwYWdlCisJaW50IHRvID0gKChwb3MgKyB3cml0ZV9ieXRlcyAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDE7CisJLyogb2Zmc2V0IG9mIGxhc3QgbW9kaWZpZWQgYnl0ZSBpbiBsYXN0CisJICAgcGFnZSAqLworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsJLy8gUGFnZXMgYXJlIG1hcHBlZCBoZXJlLgorCWludCBpOwkJCS8vIFNpbXBsZSBjb3VudGVyCisJaW50IGJsb2NrcyA9IDA7CQkvKiBSZXR1cm4gdmFsdWUgKGJsb2NrcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQpICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CS8vIEN1cnJlbnQgYnVmZmVyaGVhZCBhbmQgZmlyc3QgYnVmZmVyaGVhZAorCS8vIG9mIGEgcGFnZS4KKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOwkvLyBTdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgb2YgY3VycmVudAorCS8vIGJ1ZmZlciBpbiB0aGUgcGFnZS4KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKndhaXRbMl0sICoqd2FpdF9iaCA9IHdhaXQ7CS8vIEJ1ZmZlcnMgZm9yIHBhZ2UsIGlmCisJLy8gUGFnZSBhcHBlYXJlZCB0byBiZSBub3QgdXAKKwkvLyB0byBkYXRlLiBOb3RlIGhvdyB3ZSBoYXZlCisJLy8gYXQgbW9zdCAyIGJ1ZmZlcnMsIHRoaXMgaXMKKwkvLyBiZWNhdXNlIHdlIGF0IG1vc3QgbWF5CisJLy8gcGFydGlhbGx5IG92ZXJ3cml0ZSB0d28KKwkvLyBidWZmZXJzIGZvciBvbmUgcGFnZS4gT25lIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZWdpbm5pbmcgb2Ygd3JpdGUgYXJlYQorCS8vIGFuZCBvbmUgYXQgdGhlIGVuZC4KKwkvLyBFdmVyeXRoaW5nIGludGhlIG1pZGRsZSBnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIHRvdGFsbHkuCiAKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIGNwdSBrZXkgb2YgaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCA9IE5VTEw7IC8vIHBvaW50ZXIgdG8gaXRlbSBoZWFkIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaXRlbWJ1Zj1OVUxMOyAvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsgLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCi0gICAgX19sZTMyICogaXRlbT1OVUxMOyAvLyBwb2ludGVyIHRvIGl0ZW0gd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIGludCBpdGVtX3Bvcz0tMTsgLyogUG9zaXRpb24gaW4gaW5kaXJlY3QgaXRlbSAqLworCXN0cnVjdCBjcHVfa2V5IGtleTsJLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCXN0cnVjdCBpdGVtX2hlYWQgKmloID0gTlVMTDsJLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJc3RydWN0IGJ1ZmZlcl9oZWFkICppdGVtYnVmID0gTlVMTDsJLy8gQnVmZmVyIGhlYWQgdGhhdCBjb250YWlucyBpdGVtcyB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CS8vIHBhdGggdG8gaXRlbSwgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoLgorCV9fbGUzMiAqaXRlbSA9IE5VTEw7CS8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJaW50IGl0ZW1fcG9zID0gLTE7CS8qIFBvc2l0aW9uIGluIGluZGlyZWN0IGl0ZW0gKi8KIAotCi0gICAgaWYgKCBudW1fcGFnZXMgPCAxICkgewotCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAiZ3JlZW4tOTAwMTogcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUgIgotCQkJICAiY2FsbGVkIHdpdGggemVybyBudW1iZXIgb2YgcGFnZXMgdG8gcHJvY2VzcyIpOwotCXJldHVybiAtRUZBVUxUOwotICAgIH0KLQotICAgIC8qIFdlIGhhdmUgMiBsb29wcyBmb3IgcGFnZXMuIEluIGZpcnN0IGxvb3Agd2UgZ3JhYiBhbmQgbG9jayB0aGUgcGFnZXMsIHNvCi0gICAgICAgdGhhdCBub2JvZHkgd291bGQgdG91Y2ggdGhlc2UgdW50aWwgd2UgcmVsZWFzZSB0aGUgcGFnZXMuIFRoZW4KLSAgICAgICB3ZSdkIHN0YXJ0IHRvIGRlYWwgd2l0aCBtYXBwaW5nIGJ1ZmZlcnMgdG8gYmxvY2tzLiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKLQlwcmVwYXJlZF9wYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCArIGkpOyAvLyBsb2NrcyB0aGUgcGFnZQotCWlmICggIXByZXBhcmVkX3BhZ2VzW2ldKSB7Ci0JICAgIHJlcyA9IC1FTk9NRU07Ci0JICAgIGdvdG8gZmFpbGVkX3BhZ2VfZ3JhYmJpbmc7Ci0JfQotCWlmICghcGFnZV9oYXNfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSkpCi0JICAgIGNyZWF0ZV9lbXB0eV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIDApOwotICAgIH0KLQotICAgIC8qIExldCdzIGNvdW50IGFtb3VudCBvZiBibG9ja3MgZm9yIGEgY2FzZSB3aGVyZSBhbGwgdGhlIGJsb2NrcwotICAgICAgIG92ZXJ3cml0dGVuIGFyZSBuZXcgKHdlIHdpbGwgc3Vic3RyYWN0IGFscmVhZHkgYWxsb2NhdGVkIGJsb2NrcyBsYXRlcikqLwotICAgIGlmICggbnVtX3BhZ2VzID4gMiApCi0JLyogVGhlc2UgYXJlIGZ1bGwtb3ZlcndyaXR0ZW4gcGFnZXMgc28gd2UgY291bnQgYWxsIHRoZSBibG9ja3MgaW4KLQkgICB0aGVzZSBwYWdlcyBhcmUgY291bnRlZCBhcyBuZWVkZWQgdG8gYmUgYWxsb2NhdGVkICovCi0JYmxvY2tzID0gKG51bV9wYWdlcyAtIDIpIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7Ci0KLSAgICAvKiBjb3VudCBibG9ja3MgbmVlZGVkIGZvciBmaXJzdCBwYWdlIChwb3NzaWJseSBwYXJ0aWFsbHkgd3JpdHRlbikgKi8KLSAgICBibG9ja3MgKz0gKChQQUdFX0NBQ0hFX1NJWkUgLSBmcm9tKSA+PiBpbm9kZS0+aV9ibGtiaXRzKSArCi0JICAgISEoZnJvbSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSkpOyAvKiByb3VuZHVwICovCi0KLSAgICAvKiBOb3cgd2UgYWNjb3VudCBmb3IgbGFzdCBwYWdlLiBJZiBsYXN0IHBhZ2UgPT0gZmlyc3QgcGFnZSAod2UKLSAgICAgICBvdmVyd3JpdGUgb25seSBvbmUgcGFnZSksIHdlIHN1YnN0cmFjdCBhbGwgdGhlIGJsb2NrcyBwYXN0IHRoZQotICAgICAgIGxhc3Qgd3JpdGluZyBwb3NpdGlvbiBpbiBhIHBhZ2Ugb3V0IG9mIGFscmVhZHkgY2FsY3VsYXRlZCBudW1iZXIKLSAgICAgICBvZiBibG9ja3MgKi8KLSAgICBibG9ja3MgKz0gKChudW1fcGFnZXMgPiAxKSA8PCAoUEFHRV9DQUNIRV9TSElGVC1pbm9kZS0+aV9ibGtiaXRzKSkgLQotCSAgICgoUEFHRV9DQUNIRV9TSVpFIC0gdG8pID4+IGlub2RlLT5pX2Jsa2JpdHMpOwotCSAgIC8qIE5vdGUgaG93IHdlIGRvIG5vdCByb3VuZHVwIGhlcmUgc2luY2UgcGFydGlhbCBibG9ja3Mgc3RpbGwKLQkJICAgc2hvdWxkIGJlIGFsbG9jYXRlZCAqLwotCi0gICAgLyogTm93IGlmIGFsbCB0aGUgd3JpdGUgYXJlYSBsaWVzIHBhc3QgdGhlIGZpbGUgZW5kLCBubyBwb2ludCBpbgotICAgICAgIG1hcGluZyBibG9ja3MsIHNpbmNlIHRoZXJlIGlzIG5vbmUsIHNvIHdlIGp1c3QgemVybyBvdXQgcmVtYWluaW5nCi0gICAgICAgcGFydHMgb2YgZmlyc3QgYW5kIGxhc3QgcGFnZXMgaW4gd3JpdGUgYXJlYSAoaWYgbmVlZGVkKSAqLwotICAgIGlmICggKHBvcyAmIH4oKGxvZmZfdClQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgPiBpbm9kZS0+aV9zaXplICkgewotCWlmICggZnJvbSAhPSAwICkgey8qIEZpcnN0IHBhZ2UgbmVlZHMgdG8gYmUgcGFydGlhbGx5IHplcm9lZCAqLwotCSAgICBjaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7Ci0JICAgIG1lbXNldChrYWRkciwgMCwgZnJvbSk7Ci0JICAgIGt1bm1hcF9hdG9taWMoIGthZGRyLCBLTV9VU0VSMCk7Ci0JfQotCWlmICggdG8gIT0gUEFHRV9DQUNIRV9TSVpFICkgeyAvKiBMYXN0IHBhZ2UgbmVlZHMgdG8gYmUgcGFydGlhbGx5IHplcm9lZCAqLwotCSAgICBjaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSwgS01fVVNFUjApOwotCSAgICBtZW1zZXQoa2FkZHIrdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKLQkgICAga3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKKwlpZiAobnVtX3BhZ2VzIDwgMSkgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiZ3JlZW4tOTAwMTogcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUgIgorCQkJCSAiY2FsbGVkIHdpdGggemVybyBudW1iZXIgb2YgcGFnZXMgdG8gcHJvY2VzcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQkvKiBTaW5jZSBhbGwgYmxvY2tzIGFyZSBuZXcgLSB1c2UgYWxyZWFkeSBjYWxjdWxhdGVkIHZhbHVlICovCi0JcmV0dXJuIGJsb2NrczsKLSAgICB9CisJLyogV2UgaGF2ZSAyIGxvb3BzIGZvciBwYWdlcy4gSW4gZmlyc3QgbG9vcCB3ZSBncmFiIGFuZCBsb2NrIHRoZSBwYWdlcywgc28KKwkgICB0aGF0IG5vYm9keSB3b3VsZCB0b3VjaCB0aGVzZSB1bnRpbCB3ZSByZWxlYXNlIHRoZSBwYWdlcy4gVGhlbgorCSAgIHdlJ2Qgc3RhcnQgdG8gZGVhbCB3aXRoIG1hcHBpbmcgYnVmZmVycyB0byBibG9ja3MuICovCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXByZXBhcmVkX3BhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4ICsgaSk7CS8vIGxvY2tzIHRoZSBwYWdlCisJCWlmICghcHJlcGFyZWRfcGFnZXNbaV0pIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWxlZF9wYWdlX2dyYWJiaW5nOworCQl9CisJCWlmICghcGFnZV9oYXNfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSkpCisJCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSwKKwkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIDApOworCX0KIAotICAgIC8qIFdlbGwsIHNpbmNlIHdlIHdyaXRlIHNvbWV3aGVyZSBpbnRvIHRoZSBtaWRkbGUgb2YgYSBmaWxlLCB0aGVyZSBpcwotICAgICAgIHBvc3NpYmlsaXR5IHdlIGFyZSB3cml0aW5nIG92ZXIgc29tZSBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MsIHNvCi0gICAgICAgbGV0J3MgbWFwIHRoZXNlIGJsb2NrcyBhbmQgc3Vic3RyYWN0IG51bWJlciBvZiBzdWNoIGJsb2NrcyBvdXQgb2YgYmxvY2tzCi0gICAgICAgd2UgbmVlZCB0byBhbGxvY2F0ZSAoY2FsY3VsYXRlZCBhYm92ZSkgKi8KLSAgICAvKiBNYXNrIHdyaXRlIHBvc2l0aW9uIHRvIHN0YXJ0IG9uIGJsb2Nrc2l6ZSwgd2UgZG8gaXQgb3V0IG9mIHRoZQotICAgICAgIGxvb3AgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKi8KLSAgICBwb3MgJj0gfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKLSAgICAvKiBTZXQgY3B1IGtleSB0byB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gYSBmaWxlIChvbiBsZWZ0IGJsb2NrIGJvdW5kYXJ5KSovCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgMSArICgocG9zKSAmIH4oKGxvZmZfdCkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKKwkvKiBMZXQncyBjb3VudCBhbW91bnQgb2YgYmxvY2tzIGZvciBhIGNhc2Ugd2hlcmUgYWxsIHRoZSBibG9ja3MKKwkgICBvdmVyd3JpdHRlbiBhcmUgbmV3ICh3ZSB3aWxsIHN1YnN0cmFjdCBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MgbGF0ZXIpICovCisJaWYgKG51bV9wYWdlcyA+IDIpCisJCS8qIFRoZXNlIGFyZSBmdWxsLW92ZXJ3cml0dGVuIHBhZ2VzIHNvIHdlIGNvdW50IGFsbCB0aGUgYmxvY2tzIGluCisJCSAgIHRoZXNlIHBhZ2VzIGFyZSBjb3VudGVkIGFzIG5lZWRlZCB0byBiZSBhbGxvY2F0ZWQgKi8KKwkJYmxvY2tzID0KKwkJICAgIChudW1fcGFnZXMgLSAyKSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7IC8vIFdlIG5lZWQgdGhhdCBmb3IgYXQgbGVhc3Qgc2VhcmNoX2J5X2tleSgpCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKysgKSB7IAorCS8qIGNvdW50IGJsb2NrcyBuZWVkZWQgZm9yIGZpcnN0IHBhZ2UgKHBvc3NpYmx5IHBhcnRpYWxseSB3cml0dGVuKSAqLworCWJsb2NrcyArPSAoKFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pID4+IGlub2RlLT5pX2Jsa2JpdHMpICsgISEoZnJvbSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSk7CS8qIHJvdW5kdXAgKi8KIAotCWhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0pOwotCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiB0aGUgcGFnZSAqLwotCWZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKLQkJaWYgKCFiaCkKLQkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7Ci0JCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLwotCQlibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JCWlmIChpID09IDAgJiYgYmxvY2tfZW5kIDw9IGZyb20gKQotCQkgICAgLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCi0JCSAgICBjb250aW51ZTsKKwkvKiBOb3cgd2UgYWNjb3VudCBmb3IgbGFzdCBwYWdlLiBJZiBsYXN0IHBhZ2UgPT0gZmlyc3QgcGFnZSAod2UKKwkgICBvdmVyd3JpdGUgb25seSBvbmUgcGFnZSksIHdlIHN1YnN0cmFjdCBhbGwgdGhlIGJsb2NrcyBwYXN0IHRoZQorCSAgIGxhc3Qgd3JpdGluZyBwb3NpdGlvbiBpbiBhIHBhZ2Ugb3V0IG9mIGFscmVhZHkgY2FsY3VsYXRlZCBudW1iZXIKKwkgICBvZiBibG9ja3MgKi8KKwlibG9ja3MgKz0gKChudW1fcGFnZXMgPiAxKSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpKSAtCisJICAgICgoUEFHRV9DQUNIRV9TSVpFIC0gdG8pID4+IGlub2RlLT5pX2Jsa2JpdHMpOworCS8qIE5vdGUgaG93IHdlIGRvIG5vdCByb3VuZHVwIGhlcmUgc2luY2UgcGFydGlhbCBibG9ja3Mgc3RpbGwKKwkgICBzaG91bGQgYmUgYWxsb2NhdGVkICovCiAKLQkJaWYgKGkgPT0gbnVtX3BhZ2VzIC0gMSAmJiBibG9ja19zdGFydCA+PSB0bykgewotCQkgICAgLyogSWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBhYm9ydAotCQkgICAgICAgcHJvY2Vzc2luZyBvZiBjdXJyZW50IHBhZ2UgKi8KLQkJICAgIGJyZWFrOworCS8qIE5vdyBpZiBhbGwgdGhlIHdyaXRlIGFyZWEgbGllcyBwYXN0IHRoZSBmaWxlIGVuZCwgbm8gcG9pbnQgaW4KKwkgICBtYXBpbmcgYmxvY2tzLCBzaW5jZSB0aGVyZSBpcyBub25lLCBzbyB3ZSBqdXN0IHplcm8gb3V0IHJlbWFpbmluZworCSAgIHBhcnRzIG9mIGZpcnN0IGFuZCBsYXN0IHBhZ2VzIGluIHdyaXRlIGFyZWEgKGlmIG5lZWRlZCkgKi8KKwlpZiAoKHBvcyAmIH4oKGxvZmZfdCkgUEFHRV9DQUNIRV9TSVpFIC0gMSkpID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpZiAoZnJvbSAhPSAwKSB7CS8qIEZpcnN0IHBhZ2UgbmVlZHMgdG8gYmUgcGFydGlhbGx5IHplcm9lZCAqLworCQkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyLCAwLCBmcm9tKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJfQorCQlpZiAodG8gIT0gUEFHRV9DQUNIRV9TSVpFKSB7CS8qIExhc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCisJCQljaGFyICprYWRkciA9CisJCQkgICAga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzIC0gMV0sCisJCQkJCUtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIHRvLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSB0byk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJCX0KIAotCQlpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgIT0wICkgewotCQkgICAgLyogVGhpcyBpcyBvcHRpbWlzYXRpb24gZm9yIGEgY2FzZSB3aGVyZSBidWZmZXIgaXMgbWFwcGVkCi0JCSAgICAgICBhbmQgaGF2ZSBibG9ja251bWJlciBhc3NpZ25lZC4gSW4gY2FzZSBzaWduaWZpY2FudCBhbW91bnQKLQkJICAgICAgIG9mIHN1Y2ggYnVmZmVycyBhcmUgcHJlc2VudCwgd2UgbWF5IGF2b2lkIHNvbWUgYW1vdW50Ci0JCSAgICAgICBvZiBzZWFyY2hfYnlfa2V5IGNhbGxzLgotCQkgICAgICAgUHJvYmFibHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gbW92ZSBwYXJ0cyBvZiB0aGlzIGNvZGUKLQkJICAgICAgIG91dCBvZiBCS0wsIGJ1dCBJIGFmcmFpZCB0aGF0IHdvdWxkIG92ZXJjb21wbGljYXRlIGNvZGUKLQkJICAgICAgIHdpdGhvdXQgYW55IG5vdGljZWFibGUgYmVuZWZpdC4KLQkJICAgICovCi0JCSAgICBpdGVtX3BvcysrOwotCQkgICAgLyogVXBkYXRlIHRoZSBrZXkgKi8KLQkJICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQkJICAgIGJsb2Nrcy0tOyAvLyBEZWNyZWFzZSB0aGUgYW1vdW50IG9mIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUKLQkJCSAgICAgIC8vIGFsbG9jYXRlZAotCQkgICAgY29udGludWU7IC8vIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlcgotCQl9CisJCS8qIFNpbmNlIGFsbCBibG9ja3MgYXJlIG5ldyAtIHVzZSBhbHJlYWR5IGNhbGN1bGF0ZWQgdmFsdWUgKi8KKwkJcmV0dXJuIGJsb2NrczsKKwl9CiAKLQkJaWYgKCAhaXRlbWJ1ZiB8fCAvKiBpZiBmaXJzdCBpdGVyYXRpb24gKi8KLQkJICAgICBpdGVtX3BvcyA+PSBpaF9pdGVtX2xlbihpaCkvVU5GTV9QX1NJWkUpCi0JCQkJCSAgICAgeyAvKiBvciBpZiB3ZSBwcm9ncmVzc2VkIHBhc3QgdGhlCi0JCQkJCQkgIGN1cnJlbnQgdW5mb3JtYXR0ZWRfaXRlbSAqLwotCQkJLyogVHJ5IHRvIGZpbmQgbmV4dCBpdGVtICovCi0JCQlyZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCQkJLyogQWJvcnQgaWYgbm8gbW9yZSBpdGVtcyAqLwotCQkJaWYgKCByZXMgIT0gUE9TSVRJT05fRk9VTkQgKSB7Ci0JCQkgICAgLyogbWFrZSBzdXJlIGxhdGVyIGxvb3BzIGRvbid0IHVzZSB0aGlzIGl0ZW0gKi8KLQkJCSAgICBpdGVtYnVmID0gTlVMTDsKLQkJCSAgICBpdGVtID0gTlVMTDsKLQkJCSAgICBicmVhazsKKwkvKiBXZWxsLCBzaW5jZSB3ZSB3cml0ZSBzb21ld2hlcmUgaW50byB0aGUgbWlkZGxlIG9mIGEgZmlsZSwgdGhlcmUgaXMKKwkgICBwb3NzaWJpbGl0eSB3ZSBhcmUgd3JpdGluZyBvdmVyIHNvbWUgYWxyZWFkeSBhbGxvY2F0ZWQgYmxvY2tzLCBzbworCSAgIGxldCdzIG1hcCB0aGVzZSBibG9ja3MgYW5kIHN1YnN0cmFjdCBudW1iZXIgb2Ygc3VjaCBibG9ja3Mgb3V0IG9mIGJsb2NrcworCSAgIHdlIG5lZWQgdG8gYWxsb2NhdGUgKGNhbGN1bGF0ZWQgYWJvdmUpICovCisJLyogTWFzayB3cml0ZSBwb3NpdGlvbiB0byBzdGFydCBvbiBibG9ja3NpemUsIHdlIGRvIGl0IG91dCBvZiB0aGUKKwkgICBsb29wIGZvciBwZXJmb3JtYW5jZSByZWFzb25zICovCisJcG9zICY9IH4oKGxvZmZfdCkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJLyogU2V0IGNwdSBrZXkgdG8gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIGEgZmlsZSAob24gbGVmdCBibG9jayBib3VuZGFyeSkgKi8KKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsCisJCSAgICAgMSArICgocG9zKSAmIH4oKGxvZmZfdCkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpLAorCQkgICAgIFRZUEVfQU5ZLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CS8vIFdlIG5lZWQgdGhhdCBmb3IgYXQgbGVhc3Qgc2VhcmNoX2J5X2tleSgpCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisKKwkJaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSk7CisJCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiB0aGUgcGFnZSAqLworCQlmb3IgKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkJICAgICBibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJCWlmICghYmgpCisJCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgICAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7CisJCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KKwkJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSkKKwkJCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCisJCQkJY29udGludWU7CisKKwkJCWlmIChpID09IG51bV9wYWdlcyAtIDEgJiYgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0CisJCQkJICAgcHJvY2Vzc2luZyBvZiBjdXJyZW50IHBhZ2UgKi8KKwkJCQlicmVhazsKIAkJCX0KIAotCQkJLyogVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgaW5kaXJlY3QgaXRlbSAqLwotCQkJaXRlbWJ1ZiA9IGdldF9sYXN0X2JoKCAmcGF0aCApOwotCQkJaWggPSBnZXRfaWgoICZwYXRoICk7Ci0JCQlpdGVtID0gZ2V0X2l0ZW0oICZwYXRoICk7Ci0JCQlpdGVtX3BvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPSAwKSB7CisJCQkJLyogVGhpcyBpcyBvcHRpbWlzYXRpb24gZm9yIGEgY2FzZSB3aGVyZSBidWZmZXIgaXMgbWFwcGVkCisJCQkJICAgYW5kIGhhdmUgYmxvY2tudW1iZXIgYXNzaWduZWQuIEluIGNhc2Ugc2lnbmlmaWNhbnQgYW1vdW50CisJCQkJICAgb2Ygc3VjaCBidWZmZXJzIGFyZSBwcmVzZW50LCB3ZSBtYXkgYXZvaWQgc29tZSBhbW91bnQKKwkJCQkgICBvZiBzZWFyY2hfYnlfa2V5IGNhbGxzLgorCQkJCSAgIFByb2JhYmx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1vdmUgcGFydHMgb2YgdGhpcyBjb2RlCisJCQkJICAgb3V0IG9mIEJLTCwgYnV0IEkgYWZyYWlkIHRoYXQgd291bGQgb3ZlcmNvbXBsaWNhdGUgY29kZQorCQkJCSAgIHdpdGhvdXQgYW55IG5vdGljZWFibGUgYmVuZWZpdC4KKwkJCQkgKi8KKwkJCQlpdGVtX3BvcysrOworCQkJCS8qIFVwZGF0ZSB0aGUga2V5ICovCisJCQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwKKwkJCQkJCSAgICAgY3B1X2tleV9rX29mZnNldCgma2V5KSArCisJCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCQkJYmxvY2tzLS07CS8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQorCQkJCS8vIGFsbG9jYXRlZAorCQkJCWNvbnRpbnVlOwkvLyBHbyB0byB0aGUgbmV4dCBidWZmZXIKKwkJCX0KIAotCQkJUkZBTFNFKCAhaXNfaW5kaXJlY3RfbGVfaWggKGloKSwgImdyZWVuLTkwMDM6IGluZGlyZWN0IGl0ZW0gZXhwZWN0ZWQiKTsKLQkJfQorCQkJaWYgKCFpdGVtYnVmIHx8CS8qIGlmIGZpcnN0IGl0ZXJhdGlvbiAqLworCQkJICAgIGl0ZW1fcG9zID49IGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFKSB7CS8qIG9yIGlmIHdlIHByb2dyZXNzZWQgcGFzdCB0aGUKKwkJCQkJCQkJCQkgICBjdXJyZW50IHVuZm9ybWF0dGVkX2l0ZW0gKi8KKwkJCQkvKiBUcnkgdG8gZmluZCBuZXh0IGl0ZW0gKi8KKwkJCQlyZXMgPQorCQkJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwKKwkJCQkJCQkgICAgICAgJmtleSwgJnBhdGgpOworCQkJCS8qIEFib3J0IGlmIG5vIG1vcmUgaXRlbXMgKi8KKwkJCQlpZiAocmVzICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisJCQkJCS8qIG1ha2Ugc3VyZSBsYXRlciBsb29wcyBkb24ndCB1c2UgdGhpcyBpdGVtICovCisJCQkJCWl0ZW1idWYgPSBOVUxMOworCQkJCQlpdGVtID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQogCi0JCS8qIFNlZSBpZiB0aGVyZSBpcyBzb21lIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQotCQkgICBhdCB0aGF0IHBvc2l0aW9uLCBtYXAgdGhlIGJ1ZmZlciB0byB0aGlzIGJsb2NrICovCi0JCWlmICggZ2V0X2Jsb2NrX251bShpdGVtLGl0ZW1fcG9zKSApIHsKLQkJICAgIG1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGdldF9ibG9ja19udW0oaXRlbSxpdGVtX3BvcykpOwotCQkgICAgYmxvY2tzLS07IC8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQotCQkJICAgICAgLy8gYWxsb2NhdGVkCisJCQkJLyogVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgaW5kaXJlY3QgaXRlbSAqLworCQkJCWl0ZW1idWYgPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCQkJaWggPSBnZXRfaWgoJnBhdGgpOworCQkJCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJCQkJaXRlbV9wb3MgPSBwYXRoLnBvc19pbl9pdGVtOworCisJCQkJUkZBTFNFKCFpc19pbmRpcmVjdF9sZV9paChpaCksCisJCQkJICAgICAgICJncmVlbi05MDAzOiBpbmRpcmVjdCBpdGVtIGV4cGVjdGVkIik7CisJCQl9CisKKwkJCS8qIFNlZSBpZiB0aGVyZSBpcyBzb21lIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorCQkJICAgYXQgdGhhdCBwb3NpdGlvbiwgbWFwIHRoZSBidWZmZXIgdG8gdGhpcyBibG9jayAqLworCQkJaWYgKGdldF9ibG9ja19udW0oaXRlbSwgaXRlbV9wb3MpKSB7CisJCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwKKwkJCQkgICAgICAgZ2V0X2Jsb2NrX251bShpdGVtLCBpdGVtX3BvcykpOworCQkJCWJsb2Nrcy0tOwkvLyBEZWNyZWFzZSB0aGUgYW1vdW50IG9mIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUKKwkJCQkvLyBhbGxvY2F0ZWQKKwkJCX0KKwkJCWl0ZW1fcG9zKys7CisJCQkvKiBVcGRhdGUgdGhlIGtleSAqLworCQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwKKwkJCQkJICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsKKwkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCQl9Ci0JCWl0ZW1fcG9zKys7Ci0JCS8qIFVwZGF0ZSB0aGUga2V5ICovCi0JCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKIAl9Ci0gICAgfQotICAgIHBhdGhyZWxzZSgmcGF0aCk7IC8vIEZyZWUgdGhlIHBhdGgKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXBhdGhyZWxzZSgmcGF0aCk7CS8vIEZyZWUgdGhlIHBhdGgKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCiAJLyogTm93IHplcm8gb3V0IHVubWFwcGVuZCBidWZmZXJzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgcGFnZXMgb2YKIAkgICB3cml0ZSBhcmVhIG9yIGlzc3VlIHJlYWQgcmVxdWVzdHMgaWYgcGFnZSBpcyBtYXBwZWQuICovCiAJLyogRmlyc3QgcGFnZSwgc2VlIGlmIGl0IGlzIG5vdCB1cHRvZGF0ZSAqLwotCWlmICggIVBhZ2VVcHRvZGF0ZShwcmVwYXJlZF9wYWdlc1swXSkgKSB7Ci0JICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbMF0pOworCWlmICghUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzWzBdKSkgeworCQloZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzWzBdKTsKIAotCSAgICAvKiBGb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLwotCSAgICBmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OwotCQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewogCi0JCWlmICghYmgpCi0JCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOwotCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KLQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCQlpZiAoIGJsb2NrX2VuZCA8PSBmcm9tICkKLQkJICAgIC8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQqLwotCQkgICAgY29udGludWU7Ci0JCWlmICggYmxvY2tfc3RhcnQgPCBmcm9tICkgeyAvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLwotCQkgICAgaWYgKCBidWZmZXJfbWFwcGVkKGJoKSApIHsgLyogSWYgaXQgaXMgbWFwcGVkLCB3ZSBuZWVkIHRvCi0JCQkJCQkgIGlzc3VlIFJFQUQgcmVxdWVzdCBmb3IgaXQgdG8KLQkJCQkJCSAgbm90IGxvb3NlIGRhdGEgKi8KLQkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7Ci0JCQkqd2FpdF9iaCsrPWJoOwotCQkgICAgfSBlbHNlIHsgLyogTm90IG1hcHBlZCwgemVybyBpdCAqLwotCQkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwgS01fVVNFUjApOwotCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LCAwLCBmcm9tLWJsb2NrX3N0YXJ0KTsKLQkJCWt1bm1hcF9hdG9taWMoIGthZGRyLCBLTV9VU0VSMCk7Ci0JCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJICAgIH0KKwkJCWlmICghYmgpCisJCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgICAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7CisJCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KKwkJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQkJaWYgKGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJCS8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKwkJCWlmIChibG9ja19zdGFydCA8IGZyb20pIHsJLyogQWhhLCBvdXIgcGFydGlhbCBidWZmZXIgKi8KKwkJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkpIHsJLyogSWYgaXQgaXMgbWFwcGVkLCB3ZSBuZWVkIHRvCisJCQkJCQkJCSAgIGlzc3VlIFJFQUQgcmVxdWVzdCBmb3IgaXQgdG8KKwkJCQkJCQkJICAgbm90IGxvb3NlIGRhdGEgKi8KKwkJCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJCQkJKndhaXRfYmgrKyA9IGJoOworCQkJCX0gZWxzZSB7CS8qIE5vdCBtYXBwZWQsIHplcm8gaXQgKi8KKwkJCQkJY2hhciAqa2FkZHIgPQorCQkJCQkgICAga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbMF0sCisJCQkJCQkJS01fVVNFUjApOworCQkJCQltZW1zZXQoa2FkZHIgKyBibG9ja19zdGFydCwgMCwKKwkJCQkJICAgICAgIGZyb20gLSBibG9ja19zdGFydCk7CisJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KIAl9CiAKIAkvKiBMYXN0IHBhZ2UsIHNlZSBpZiBpdCBpcyBub3QgdXB0b2RhdGUsIG9yIGlmIHRoZSBsYXN0IHBhZ2UgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAqLwotCWlmICggIVBhZ2VVcHRvZGF0ZShwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMtMV0pIHx8IAotCSAgICAoKHBvcyt3cml0ZV9ieXRlcyk+PlBBR0VfQ0FDSEVfU0hJRlQpID4gKGlub2RlLT5pX3NpemU+PlBBR0VfQ0FDSEVfU0hJRlQpICkgewotCSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzIC0gMV0pIHx8CisJICAgICgocG9zICsgd3JpdGVfYnl0ZXMpID4+IFBBR0VfQ0FDSEVfU0hJRlQpID4KKwkgICAgKGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkpIHsKKwkJaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSk7CiAKLQkgICAgLyogZm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KLQkgICAgZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQkJYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQkvKiBmb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLworCQlmb3IgKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkJICAgICBibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKIAotCQlpZiAoIWJoKQotCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKLQkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCi0JCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQkJaWYgKCBibG9ja19zdGFydCA+PSB0byApCi0JCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQqLwotCQkgICAgYnJlYWs7Ci0JCWlmICggYmxvY2tfZW5kID4gdG8gKSB7IC8qIEFoYSwgb3VyIHBhcnRpYWwgYnVmZmVyICovCi0JCSAgICBpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KLQkJCQkJCSAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bwotCQkJCQkJICBub3QgbG9vc2UgZGF0YSAqLwotCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKLQkJCSp3YWl0X2JoKys9Ymg7Ci0JCSAgICB9IGVsc2UgeyAvKiBOb3QgbWFwcGVkLCB6ZXJvIGl0ICovCi0JCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSwgS01fVVNFUjApOwotCQkJbWVtc2V0KGthZGRyK3RvLCAwLCBibG9ja19lbmQtdG8pOwotCQkJa3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKLQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQkgICAgfQorCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCisJCQkJLyogaWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCisJCQkJYnJlYWs7CisJCQlpZiAoYmxvY2tfZW5kID4gdG8pIHsJLyogQWhhLCBvdXIgcGFydGlhbCBidWZmZXIgKi8KKwkJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkpIHsJLyogSWYgaXQgaXMgbWFwcGVkLCB3ZSBuZWVkIHRvCisJCQkJCQkJCSAgIGlzc3VlIFJFQUQgcmVxdWVzdCBmb3IgaXQgdG8KKwkJCQkJCQkJICAgbm90IGxvb3NlIGRhdGEgKi8KKwkJCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJCQkJKndhaXRfYmgrKyA9IGJoOworCQkJCX0gZWxzZSB7CS8qIE5vdCBtYXBwZWQsIHplcm8gaXQgKi8KKwkJCQkJY2hhciAqa2FkZHIgPQorCQkJCQkgICAga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXMKKwkJCQkJCQlbbnVtX3BhZ2VzIC0gMV0sCisJCQkJCQkJS01fVVNFUjApOworCQkJCQltZW1zZXQoa2FkZHIgKyB0bywgMCwgYmxvY2tfZW5kIC0gdG8pOworCQkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJCX0KKwkJCX0KIAkJfQotCSAgICB9CiAJfQogCi0gICAgLyogV2FpdCBmb3IgcmVhZCByZXF1ZXN0cyB3ZSBtYWRlIHRvIGhhcHBlbiwgaWYgbmVjZXNzYXJ5ICovCi0gICAgd2hpbGUod2FpdF9iaCA+IHdhaXQpIHsKLQl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSgqd2FpdF9iaCkpIHsKLQkgICAgcmVzID0gLUVJTzsKLQkgICAgZ290byBmYWlsZWRfcmVhZDsKKwkvKiBXYWl0IGZvciByZWFkIHJlcXVlc3RzIHdlIG1hZGUgdG8gaGFwcGVuLCBpZiBuZWNlc3NhcnkgKi8KKwl3aGlsZSAod2FpdF9iaCA+IHdhaXQpIHsKKwkJd2FpdF9vbl9idWZmZXIoKi0td2FpdF9iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkgeworCQkJcmVzID0gLUVJTzsKKwkJCWdvdG8gZmFpbGVkX3JlYWQ7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgcmV0dXJuIGJsb2NrczsKLWZhaWxlZF9wYWdlX2dyYWJiaW5nOgotICAgIG51bV9wYWdlcyA9IGk7Ci1mYWlsZWRfcmVhZDoKLSAgICByZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7Ci0gICAgcmV0dXJuIHJlczsKKwlyZXR1cm4gYmxvY2tzOworICAgICAgZmFpbGVkX3BhZ2VfZ3JhYmJpbmc6CisJbnVtX3BhZ2VzID0gaTsKKyAgICAgIGZhaWxlZF9yZWFkOgorCXJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwlyZXR1cm4gcmVzOwogfQogCiAvKiBXcml0ZSBAY291bnQgYnl0ZXMgYXQgcG9zaXRpb24gQHBwb3MgaW4gYSBmaWxlIGluZGljYXRlZCBieSBAZmlsZQpAQCAtMTE0OCwyNjIgKzEyNjUsMzA1IEBACiAgICBGdXR1cmUgRmVhdHVyZXM6IHByb3ZpZGluZyBzZWFyY2hfYnlfa2V5IHdpdGggaGludHMuCiAKICovCi1zdGF0aWMgc3NpemVfdCByZWlzZXJmc19maWxlX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgLyogdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgLyogIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBkYXRhCi0oaW4gdXNlcnNwYWNlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MgLyogcG9pbnRlciB0byBwb3NpdGlvbiBpbiBmaWxlIHRoYXQgd2Ugc3RhcnQgd3JpdGluZyBhdC4gU2hvdWxkIGJlIHVwZGF0ZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5ldyBjdXJyZW50IHBvc2l0aW9uIGJlZm9yZSByZXR1cm5pbmcuICovICkKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCS8qIHRoZSBmaWxlIHdlIGFyZSBnb2luZyB0byB3cml0ZSBpbnRvICovCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCS8qICBwb2ludGVyIHRvIHVzZXIgc3VwcGxpZWQgZGF0YQorCQkJCQkJCQkgICAoaW4gdXNlcnNwYWNlKSAqLworCQkJCSAgIHNpemVfdCBjb3VudCwJLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJICAgbG9mZl90ICogcHBvcwkvKiBwb2ludGVyIHRvIHBvc2l0aW9uIGluIGZpbGUgdGhhdCB3ZSBzdGFydCB3cml0aW5nIGF0LiBTaG91bGQgYmUgdXBkYXRlZCB0bworCQkJCQkJCSAqIG5ldyBjdXJyZW50IHBvc2l0aW9uIGJlZm9yZSByZXR1cm5pbmcuICovCisJCQkJICAgKQogewotICAgIHNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOyAvLyBOdW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBmaWxlLgotICAgIGxvZmZfdCBwb3M7IC8vIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuCi0gICAgc3NpemVfdCByZXM7IC8vIHJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IHdlIGNhbGwuCi0gICAgaW50IGVyciA9IDA7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOyAvLyBJbm9kZSBvZiB0aGUgZmlsZSB0aGF0IHdlIGFyZSB3cml0aW5nIHRvLgotCQkJCS8qIFRvIHNpbXBsaWZ5IGNvZGluZyBhdCB0aGlzIHRpbWUsIHdlIHN0b3JlCi0JCQkJICAgbG9ja2VkIHBhZ2VzIGluIGFycmF5IGZvciBub3cgKi8KLSAgICBzdHJ1Y3QgcGFnZSAqIHByZXBhcmVkX3BhZ2VzW1JFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRV07Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICB0aC50X3RyYW5zX2lkID0gMDsKKwlzaXplX3QgYWxyZWFkeV93cml0dGVuID0gMDsJLy8gTnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgd3JpdHRlbiB0byB0aGUgZmlsZS4KKwlsb2ZmX3QgcG9zOwkJLy8gQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KKwlzc2l6ZV90IHJlczsJCS8vIHJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IHdlIGNhbGwuCisJaW50IGVyciA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwkvLyBJbm9kZSBvZiB0aGUgZmlsZSB0aGF0IHdlIGFyZSB3cml0aW5nIHRvLgorCS8qIFRvIHNpbXBsaWZ5IGNvZGluZyBhdCB0aGlzIHRpbWUsIHdlIHN0b3JlCisJICAgbG9ja2VkIHBhZ2VzIGluIGFycmF5IGZvciBub3cgKi8KKwlzdHJ1Y3QgcGFnZSAqcHJlcGFyZWRfcGFnZXNbUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FXTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXRoLnRfdHJhbnNfaWQgPSAwOwogCi0gICAgaWYgKCBmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsgLy8gRGlyZWN0IElPIG5lZWRzIHRyZWF0bWVudAotCXNzaXplX3QgcmVzdWx0LCBhZnRlcl9maWxlX2VuZCA9IDA7Ci0JaWYgKCAoKnBwb3MgKyBjb3VudCA+PSBpbm9kZS0+aV9zaXplKSB8fCAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSApIHsKLQkgICAgLyogSWYgd2UgYXJlIGFwcGVuZGluZyBhIGZpbGUsIHdlIG5lZWQgdG8gcHV0IHRoaXMgc2F2ZWxpbmsgaW4gaGVyZS4KLQkgICAgICAgSWYgd2Ugd2lsbCBjcmFzaCB3aGlsZSBkb2luZyBkaXJlY3QgaW8sIGZpbmlzaF91bmZpbmlzaGVkIHdpbGwKLQkgICAgICAgY3V0IHRoZSBnYXJiYWdlIGZyb20gdGhlIGZpbGUgZW5kLiAqLwotCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKTsKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChpbm9kZS0+aV9zYik7Ci0JCXJldHVybiBlcnI7Ci0JICAgIH0KLQkgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLQkgICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMSAvKiBUcnVuY2F0ZSAqLyk7Ci0JICAgIGFmdGVyX2ZpbGVfZW5kID0gMTsKLQkgICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKTsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JICAgIGlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JfQotCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV93cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7CS8vIERpcmVjdCBJTyBuZWVkcyB0cmVhdG1lbnQKKwkJc3NpemVfdCByZXN1bHQsIGFmdGVyX2ZpbGVfZW5kID0gMDsKKwkJaWYgKCgqcHBvcyArIGNvdW50ID49IGlub2RlLT5pX3NpemUpCisJCSAgICB8fCAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSkgeworCQkJLyogSWYgd2UgYXJlIGFwcGVuZGluZyBhIGZpbGUsIHdlIG5lZWQgdG8gcHV0IHRoaXMgc2F2ZWxpbmsgaW4gaGVyZS4KKwkJCSAgIElmIHdlIHdpbGwgY3Jhc2ggd2hpbGUgZG9pbmcgZGlyZWN0IGlvLCBmaW5pc2hfdW5maW5pc2hlZCB3aWxsCisJCQkgICBjdXQgdGhlIGdhcmJhZ2UgZnJvbSB0aGUgZmlsZSBlbmQuICovCisJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCWVyciA9CisJCQkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLAorCQkJCQkgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQkJYWRkX3NhdmVfbGluaygmdGgsIGlub2RlLCAxIC8qIFRydW5jYXRlICovICk7CisJCQlhZnRlcl9maWxlX2VuZCA9IDE7CisJCQllcnIgPQorCQkJICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsCisJCQkJCUpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwogCi0JaWYgKCBhZnRlcl9maWxlX2VuZCApIHsgLyogTm93IHVwZGF0ZSBpX3NpemUgYW5kIHJlbW92ZSB0aGUgc2F2ZWxpbmsgKi8KLQkgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLQkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQkgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwotCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCSAgICBlcnIgPSByZW1vdmVfc2F2ZV9saW5rIChpbm9kZSwgMS8qIHRydW5jYXRlICovKTsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkJaWYgKGFmdGVyX2ZpbGVfZW5kKSB7CS8qIE5vdyB1cGRhdGUgaV9zaXplIGFuZCByZW1vdmUgdGhlIHNhdmVsaW5rICovCisJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCQkJaWYgKGVycikgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQllcnIgPSByZW1vdmVfc2F2ZV9saW5rKGlub2RlLCAxIC8qIHRydW5jYXRlICovICk7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KKwlpZiAodW5saWtlbHkoKHNzaXplX3QpIGNvdW50IDwgMCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCB1bmxpa2VseSgoc3NpemVfdCkgY291bnQgPCAwICkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkpCisJCXJldHVybiAtRUZBVUxUOwogCi0gICAgaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJZG93bigmaW5vZGUtPmlfc2VtKTsJLy8gbG9ja3MgdGhlIGVudGlyZSBmaWxlIGZvciBqdXN0IHVzCiAKLSAgICBkb3duKCZpbm9kZS0+aV9zZW0pOyAvLyBsb2NrcyB0aGUgZW50aXJlIGZpbGUgZm9yIGp1c3QgdXMKKwlwb3MgPSAqcHBvczsKIAotICAgIHBvcyA9ICpwcG9zOworCS8qIENoZWNrIGlmIHdlIGNhbiB3cml0ZSB0byBzcGVjaWZpZWQgcmVnaW9uIG9mIGZpbGUsIGZpbGUKKwkgICBpcyBub3Qgb3Zlcmx5IGJpZyBhbmQgdGhpcyBraW5kIG9mIHN0dWZmLiBBZGp1c3QgcG9zIGFuZAorCSAgIGNvdW50LCBpZiBuZWVkZWQgKi8KKwlyZXMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIDApOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCi0gICAgLyogQ2hlY2sgaWYgd2UgY2FuIHdyaXRlIHRvIHNwZWNpZmllZCByZWdpb24gb2YgZmlsZSwgZmlsZQotICAgICAgIGlzIG5vdCBvdmVybHkgYmlnIGFuZCB0aGlzIGtpbmQgb2Ygc3R1ZmYuIEFkanVzdCBwb3MgYW5kCi0gICAgICAgY291bnQsIGlmIG5lZWRlZCAqLwotICAgIHJlcyA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgMCk7Ci0gICAgaWYgKHJlcykKLQlnb3RvIG91dDsKKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CiAKLSAgICBpZiAoIGNvdW50ID09IDAgKQotCWdvdG8gb3V0OworCXJlcyA9IHJlbW92ZV9zdWlkKGZpbGUtPmZfZGVudHJ5KTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKIAotICAgIHJlcyA9IHJlbW92ZV9zdWlkKGZpbGUtPmZfZGVudHJ5KTsKLSAgICBpZiAocmVzKQotCWdvdG8gb3V0OworCWlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsJLyogQm90aCBtdGltZSBhbmQgY3RpbWUgKi8KIAotICAgIGlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsgLyogQm90aCBtdGltZSBhbmQgY3RpbWUgKi8KKwkvLyBPaywgd2UgYXJlIGRvbmUgd2l0aCBhbGwgdGhlIGNoZWNrcy4KIAotICAgIC8vIE9rLCB3ZSBhcmUgZG9uZSB3aXRoIGFsbCB0aGUgY2hlY2tzLgorCS8vIE5vdyB3ZSBzaG91bGQgc3RhcnQgcmVhbCB3b3JrCiAKLSAgICAvLyBOb3cgd2Ugc2hvdWxkIHN0YXJ0IHJlYWwgd29yaworCS8qIElmIHdlIGFyZSBnb2luZyB0byB3cml0ZSBwYXN0IHRoZSBmaWxlJ3MgcGFja2VkIHRhaWwgb3IgaWYgd2UgYXJlIGdvaW5nCisJICAgdG8gb3ZlcndyaXRlIHBhcnQgb2YgdGhlIHRhaWwsIHdlIG5lZWQgdGhhdCB0YWlsIHRvIGJlIGNvbnZlcnRlZCBpbnRvCisJICAgdW5mb3JtYXR0ZWQgbm9kZSAqLworCXJlcyA9IHJlaXNlcmZzX2NoZWNrX2Zvcl90YWlsX2FuZF9jb252ZXJ0KGlub2RlLCBwb3MsIGNvdW50KTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKIAotICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byB3cml0ZSBwYXN0IHRoZSBmaWxlJ3MgcGFja2VkIHRhaWwgb3IgaWYgd2UgYXJlIGdvaW5nCi0gICAgICAgdG8gb3ZlcndyaXRlIHBhcnQgb2YgdGhlIHRhaWwsIHdlIG5lZWQgdGhhdCB0YWlsIHRvIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICAgdW5mb3JtYXR0ZWQgbm9kZSAqLwotICAgIHJlcyA9IHJlaXNlcmZzX2NoZWNrX2Zvcl90YWlsX2FuZF9jb252ZXJ0KCBpbm9kZSwgcG9zLCBjb3VudCk7Ci0gICAgaWYgKHJlcykKLQlnb3RvIG91dDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qIFRoaXMgaXMgdGhlIG1haW4gbG9vcCBpbiB3aGljaCB3ZSBydW5uaW5nIHVudGlsIHNvbWUgZXJyb3Igb2NjdXJlcworCQkgICBvciB1bnRpbCB3ZSB3cml0ZSBhbGwgb2YgdGhlIGRhdGEuICovCisJCXNpemVfdCBudW1fcGFnZXM7CS8qIGFtb3VudCBvZiBwYWdlcyB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhpcyBpdGVyYXRpb24gKi8KKwkJc2l6ZV90IHdyaXRlX2J5dGVzOwkvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgZHVyaW5nIHRoaXMgaXRlcmF0aW9uICovCisJCXNpemVfdCBibG9ja3NfdG9fYWxsb2NhdGU7CS8qIGhvdyBtdWNoIGJsb2NrcyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciB0aGlzIGl0ZXJhdGlvbiAqLwogCi0gICAgd2hpbGUgKCBjb3VudCA+IDApIHsKLQkvKiBUaGlzIGlzIHRoZSBtYWluIGxvb3AgaW4gd2hpY2ggd2UgcnVubmluZyB1bnRpbCBzb21lIGVycm9yIG9jY3VyZXMKLQkgICBvciB1bnRpbCB3ZSB3cml0ZSBhbGwgb2YgdGhlIGRhdGEuICovCi0Jc2l6ZV90IG51bV9wYWdlczsvKiBhbW91bnQgb2YgcGFnZXMgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHRoaXMgaXRlcmF0aW9uICovCi0Jc2l6ZV90IHdyaXRlX2J5dGVzOyAvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgZHVyaW5nIHRoaXMgaXRlcmF0aW9uICovCi0Jc2l6ZV90IGJsb2Nrc190b19hbGxvY2F0ZTsgLyogaG93IG11Y2ggYmxvY2tzIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHRoaXMgaXRlcmF0aW9uICovCi0gICAgICAgIAotICAgICAgICAvKiAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIGlzIGFuIGlkaW9tIGZvciBvZmZzZXQgaW50byBhIHBhZ2Ugb2YgcG9zKi8KLQludW1fcGFnZXMgPSAhISgocG9zK2NvdW50KSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAvKiByb3VuZCB1cCBwYXJ0aWFsCi0JCQkJCQkJICBwYWdlcyAqLwotCQkgICAgKChjb3VudCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSkgPj4gUEFHRV9DQUNIRV9TSElGVCk7IAotCQkJCQkJLyogY29udmVydCBzaXplIHRvIGFtb3VudCBvZgotCQkJCQkJICAgcGFnZXMgKi8KLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQlpZiAoIG51bV9wYWdlcyA+IFJFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRSAKLQkJfHwgbnVtX3BhZ2VzID4gcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyhpbm9kZS0+aV9zYikgKSB7Ci0JICAgIC8qIElmIHdlIHdlcmUgYXNrZWQgdG8gd3JpdGUgbW9yZSBkYXRhIHRoYW4gd2Ugd2FudCB0byBvciBpZiB0aGVyZQotCSAgICAgICBpcyBub3QgdGhhdCBtdWNoIHNwYWNlLCB0aGVuIHdlIHNob3J0ZW4gYW1vdW50IG9mIGRhdGEgdG8gd3JpdGUKLQkgICAgICAgZm9yIHRoaXMgaXRlcmF0aW9uLiAqLwotCSAgICBudW1fcGFnZXMgPSBtaW5fdChzaXplX3QsIFJFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRSwgcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyhpbm9kZS0+aV9zYikpOwotCSAgICAvKiBBbHNvIHdlIHNob3VsZCBub3QgZm9yZ2V0IHRvIHNldCBzaXplIGluIGJ5dGVzIGFjY29yZGluZ2x5ICovCi0JICAgIHdyaXRlX2J5dGVzID0gKG51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKSAtIAotCQkJICAgIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKTsKLQkJCQkJIC8qIElmIHBvc2l0aW9uIGlzIG5vdCBvbiB0aGUKLQkJCQkJICAgIHN0YXJ0IG9mIHRoZSBwYWdlLCB3ZSBuZWVkCi0JCQkJCSAgICB0byBzdWJzdHJhY3QgdGhlIG9mZnNldAotCQkJCQkgICAgd2l0aGluIHBhZ2UgKi8KLQl9IGVsc2UKLQkgICAgd3JpdGVfYnl0ZXMgPSBjb3VudDsKKwkJLyogIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSBpcyBhbiBpZGlvbSBmb3Igb2Zmc2V0IGludG8gYSBwYWdlIG9mIHBvcyAqLworCQludW1fcGFnZXMgPSAhISgocG9zICsgY291bnQpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArCS8qIHJvdW5kIHVwIHBhcnRpYWwKKwkJCQkJCQkJCSAgIHBhZ2VzICovCisJCSAgICAoKGNvdW50ICsKKwkJICAgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQkvKiBjb252ZXJ0IHNpemUgdG8gYW1vdW50IG9mCisJCSAgIHBhZ2VzICovCisJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQlpZiAobnVtX3BhZ2VzID4gUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FCisJCSAgICB8fCBudW1fcGFnZXMgPiByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSkgeworCQkJLyogSWYgd2Ugd2VyZSBhc2tlZCB0byB3cml0ZSBtb3JlIGRhdGEgdGhhbiB3ZSB3YW50IHRvIG9yIGlmIHRoZXJlCisJCQkgICBpcyBub3QgdGhhdCBtdWNoIHNwYWNlLCB0aGVuIHdlIHNob3J0ZW4gYW1vdW50IG9mIGRhdGEgdG8gd3JpdGUKKwkJCSAgIGZvciB0aGlzIGl0ZXJhdGlvbi4gKi8KKwkJCW51bV9wYWdlcyA9CisJCQkgICAgbWluX3Qoc2l6ZV90LCBSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUUsCisJCQkJICByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSk7CisJCQkvKiBBbHNvIHdlIHNob3VsZCBub3QgZm9yZ2V0IHRvIHNldCBzaXplIGluIGJ5dGVzIGFjY29yZGluZ2x5ICovCisJCQl3cml0ZV9ieXRlcyA9IChudW1fcGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVCkgLQorCQkJICAgIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCQkJLyogSWYgcG9zaXRpb24gaXMgbm90IG9uIHRoZQorCQkJICAgc3RhcnQgb2YgdGhlIHBhZ2UsIHdlIG5lZWQKKwkJCSAgIHRvIHN1YnN0cmFjdCB0aGUgb2Zmc2V0CisJCQkgICB3aXRoaW4gcGFnZSAqLworCQl9IGVsc2UKKwkJCXdyaXRlX2J5dGVzID0gY291bnQ7CiAKLQkvKiByZXNlcnZlIHRoZSBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGxhdGVyLCBzbyB0aGF0IGxhdGVyIG9uCi0JICAgd2Ugc3RpbGwgaGF2ZSB0aGUgc3BhY2UgdG8gd3JpdGUgdGhlIGJsb2NrcyB0byAqLwotCXJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsIG51bV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkvKiByZXNlcnZlIHRoZSBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGxhdGVyLCBzbyB0aGF0IGxhdGVyIG9uCisJCSAgIHdlIHN0aWxsIGhhdmUgdGhlIHNwYWNlIHRvIHdyaXRlIHRoZSBibG9ja3MgdG8gKi8KKwkJcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICAgIG51bV9wYWdlcyA8PAorCQkJCQkJICAgICAgKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJICAgICAgIGlub2RlLT5pX2Jsa2JpdHMpKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIAotCWlmICggIW51bV9wYWdlcyApIHsgLyogSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIHNwYWNlIGV2ZW4gZm9yIGEgc2luZ2xlIHBhZ2UuLi4gKi8KLQkgICAgaWYgKCBwb3MgPiBpbm9kZS0+aV9zaXplK2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0ocG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSkpIHsKLQkJcmVzID0gLUVOT1NQQzsKLQkJYnJlYWs7IC8vIEluIGNhc2Ugd2UgYXJlIHdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGZpbGUgYmxvY2ssIGJyZWFrLgotCSAgICB9Ci0JICAgIC8vIE90aGVyd2lzZSB3ZSBhcmUgcG9zc2libHkgb3ZlcndyaXRpbmcgdGhlIGZpbGUsIHNvCi0JICAgIC8vIGxldCdzIHNldCB3cml0ZSBzaXplIHRvIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBibG9ja3NpemUuCi0JICAgIC8vIFRoaXMgd2F5IHdlIGdldCBpdCBjb3JyZWN0bHkgZm9yIGZpbGUgaG9sZXMuCi0JICAgIC8vIEJ1dCBvdmVyd3JpdGluZyBmaWxlcyBvbiBhYnNvbHV0ZWxseSBmdWxsIHZvbHVtZXMgd291bGQgbm90Ci0JICAgIC8vIGJlIHZlcnkgZWZmaWNpZW50LiBXZWxsLCBwZW9wbGUgYXJlIG5vdCBzdXBwb3NlZCB0byBmaWxsCi0JICAgIC8vIDEwMCUgb2YgZGlzayBzcGFjZSBhbnl3YXkuCi0JICAgIHdyaXRlX2J5dGVzID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gKHBvcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkpOwotCSAgICBudW1fcGFnZXMgPSAxOwotCSAgICAvLyBObyBibG9ja3Mgd2VyZSBjbGFpbWVkIGJlZm9yZSwgc28gZG8gaXQgbm93LgotCSAgICByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKGlub2RlLT5pX3NiLCAxIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOwotCX0KKwkJaWYgKCFudW1fcGFnZXMpIHsJLyogSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIHNwYWNlIGV2ZW4gZm9yIGEgc2luZ2xlIHBhZ2UuLi4gKi8KKwkJCWlmIChwb3MgPgorCQkJICAgIGlub2RlLT5pX3NpemUgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJICAgIChwb3MgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpKSB7CisJCQkJcmVzID0gLUVOT1NQQzsKKwkJCQlicmVhazsJLy8gSW4gY2FzZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxhc3QgZmlsZSBibG9jaywgYnJlYWsuCisJCQl9CisJCQkvLyBPdGhlcndpc2Ugd2UgYXJlIHBvc3NpYmx5IG92ZXJ3cml0aW5nIHRoZSBmaWxlLCBzbworCQkJLy8gbGV0J3Mgc2V0IHdyaXRlIHNpemUgdG8gYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGJsb2Nrc2l6ZS4KKwkJCS8vIFRoaXMgd2F5IHdlIGdldCBpdCBjb3JyZWN0bHkgZm9yIGZpbGUgaG9sZXMuCisJCQkvLyBCdXQgb3ZlcndyaXRpbmcgZmlsZXMgb24gYWJzb2x1dGVsbHkgZnVsbCB2b2x1bWVzIHdvdWxkIG5vdAorCQkJLy8gYmUgdmVyeSBlZmZpY2llbnQuIFdlbGwsIHBlb3BsZSBhcmUgbm90IHN1cHBvc2VkIHRvIGZpbGwKKwkJCS8vIDEwMCUgb2YgZGlzayBzcGFjZSBhbnl3YXkuCisJCQl3cml0ZV9ieXRlcyA9CisJCQkgICAgbWluX3Qoc2l6ZV90LCBjb3VudCwKKwkJCQkgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJICAocG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSk7CisJCQludW1fcGFnZXMgPSAxOworCQkJLy8gTm8gYmxvY2tzIHdlcmUgY2xhaW1lZCBiZWZvcmUsIHNvIGRvIGl0IG5vdy4KKwkJCXJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsCisJCQkJCQkJICAgICAgMSA8PAorCQkJCQkJCSAgICAgIChQQUdFX0NBQ0hFX1NISUZUCisJCQkJCQkJICAgICAgIC0KKwkJCQkJCQkgICAgICAgaW5vZGUtPgorCQkJCQkJCSAgICAgICBpX2Jsa2JpdHMpKTsKKwkJfQogCi0JLyogUHJlcGFyZSBmb3Igd3JpdGluZyBpbnRvIHRoZSByZWdpb24sIHJlYWQgaW4gYWxsIHRoZQotCSAgIHBhcnRpYWxseSBvdmVyd3JpdHRlbiBwYWdlcywgaWYgbmVlZGVkLiBBbmQgbG9jayB0aGUgcGFnZXMsCi0JICAgc28gdGhhdCBub2JvZHkgZWxzZSBjYW4gYWNjZXNzIHRoZXNlIHVudGlsIHdlIGFyZSBkb25lLgotCSAgIFdlIGdldCBudW1iZXIgb2YgYWN0dWFsIGJsb2NrcyBuZWVkZWQgYXMgYSByZXN1bHQuKi8KLQlibG9ja3NfdG9fYWxsb2NhdGUgPSByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZShpbm9kZSwgcG9zLCBudW1fcGFnZXMsIHdyaXRlX2J5dGVzLCBwcmVwYXJlZF9wYWdlcyk7Ci0JaWYgKCBibG9ja3NfdG9fYWxsb2NhdGUgPCAwICkgewotCSAgICByZXMgPSBibG9ja3NfdG9fYWxsb2NhdGU7Ci0JICAgIHJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIG51bV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpKTsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiBQcmVwYXJlIGZvciB3cml0aW5nIGludG8gdGhlIHJlZ2lvbiwgcmVhZCBpbiBhbGwgdGhlCisJCSAgIHBhcnRpYWxseSBvdmVyd3JpdHRlbiBwYWdlcywgaWYgbmVlZGVkLiBBbmQgbG9jayB0aGUgcGFnZXMsCisJCSAgIHNvIHRoYXQgbm9ib2R5IGVsc2UgY2FuIGFjY2VzcyB0aGVzZSB1bnRpbCB3ZSBhcmUgZG9uZS4KKwkJICAgV2UgZ2V0IG51bWJlciBvZiBhY3R1YWwgYmxvY2tzIG5lZWRlZCBhcyBhIHJlc3VsdC4gKi8KKwkJYmxvY2tzX3RvX2FsbG9jYXRlID0KKwkJICAgIHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKGlub2RlLCBwb3MsCisJCQkJCQkJICAgbnVtX3BhZ2VzLAorCQkJCQkJCSAgIHdyaXRlX2J5dGVzLAorCQkJCQkJCSAgIHByZXBhcmVkX3BhZ2VzKTsKKwkJaWYgKGJsb2Nrc190b19hbGxvY2F0ZSA8IDApIHsKKwkJCXJlcyA9IGJsb2Nrc190b19hbGxvY2F0ZTsKKwkJCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCQkJbnVtX3BhZ2VzIDw8CisJCQkJCQkJKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJCSBpbm9kZS0+aV9ibGtiaXRzKSk7CisJCQlicmVhazsKKwkJfQogCi0JLyogRmlyc3Qgd2UgY29ycmVjdCBvdXIgZXN0aW1hdGUgb2YgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgKi8KLQlyZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLCAobnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKSAtIGJsb2Nrc190b19hbGxvY2F0ZSApOworCQkvKiBGaXJzdCB3ZSBjb3JyZWN0IG91ciBlc3RpbWF0ZSBvZiBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCAqLworCQlyZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLAorCQkJCQkJKG51bV9wYWdlcyA8PAorCQkJCQkJIChQQUdFX0NBQ0hFX1NISUZUIC0KKwkJCQkJCSAgaW5vZGUtPmlfc2ItPgorCQkJCQkJICBzX2Jsb2Nrc2l6ZV9iaXRzKSkgLQorCQkJCQkJYmxvY2tzX3RvX2FsbG9jYXRlKTsKIAotCWlmICggYmxvY2tzX3RvX2FsbG9jYXRlID4gMCkgey8qV2Ugb25seSBhbGxvY2F0ZSBibG9ja3MgaWYgd2UgbmVlZCB0byovCi0JICAgIC8qIEZpbGwgaW4gYWxsIHRoZSBwb3NzaWJsZSBob2xlcyBhbmQgYXBwZW5kIHRoZSBmaWxlIGlmIG5lZWRlZCAqLwotCSAgICByZXMgPSByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigmdGgsIGlub2RlLCBwb3MsIG51bV9wYWdlcywgd3JpdGVfYnl0ZXMsIHByZXBhcmVkX3BhZ2VzLCBibG9ja3NfdG9fYWxsb2NhdGUpOwotCX0KKwkJaWYgKGJsb2Nrc190b19hbGxvY2F0ZSA+IDApIHsJLypXZSBvbmx5IGFsbG9jYXRlIGJsb2NrcyBpZiB3ZSBuZWVkIHRvICovCisJCQkvKiBGaWxsIGluIGFsbCB0aGUgcG9zc2libGUgaG9sZXMgYW5kIGFwcGVuZCB0aGUgZmlsZSBpZiBuZWVkZWQgKi8KKwkJCXJlcyA9CisJCQkgICAgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tzX2Zvcl9yZWdpb24oJnRoLCBpbm9kZSwgcG9zLAorCQkJCQkJCQludW1fcGFnZXMsCisJCQkJCQkJCXdyaXRlX2J5dGVzLAorCQkJCQkJCQlwcmVwYXJlZF9wYWdlcywKKwkJCQkJCQkJYmxvY2tzX3RvX2FsbG9jYXRlKTsKKwkJfQogCi0JLyogd2VsbCwgd2UgaGF2ZSBhbGxvY2F0ZWQgdGhlIGJsb2Nrcywgc28gaXQgaXMgdGltZSB0byBmcmVlCi0JICAgdGhlIHJlc2VydmF0aW9uIHdlIG1hZGUgZWFybGllci4gKi8KLQlyZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLCBibG9ja3NfdG9fYWxsb2NhdGUpOwotCWlmICggcmVzICkgewotCSAgICByZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7Ci0JICAgIGJyZWFrOwotCX0KKwkJLyogd2VsbCwgd2UgaGF2ZSBhbGxvY2F0ZWQgdGhlIGJsb2Nrcywgc28gaXQgaXMgdGltZSB0byBmcmVlCisJCSAgIHRoZSByZXNlcnZhdGlvbiB3ZSBtYWRlIGVhcmxpZXIuICovCisJCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCQlibG9ja3NfdG9fYWxsb2NhdGUpOworCQlpZiAocmVzKSB7CisJCQlyZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7CisJCQlicmVhazsKKwkJfQogCiAvKiBOT1RFIHRoYXQgYWxsb2NhdGluZyBibG9ja3MgYW5kIGZpbGxpbmcgYmxvY2tzIGNhbiBiZSBkb25lIGluIHJldmVyc2Ugb3JkZXIKICAgIGFuZCBwcm9iYWJseSB3ZSB3b3VsZCBkbyB0aGF0IGp1c3QgdG8gZ2V0IHJpZCBvZiBnYXJiYWdlIGluIGZpbGVzIGFmdGVyIGEKICAgIGNyYXNoICovCiAKLQkvKiBDb3B5IGRhdGEgZnJvbSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciB0byBmaWxlJ3MgcGFnZXMgKi8KLQlyZXMgPSByZWlzZXJmc19jb3B5X2Zyb21fdXNlcl90b19maWxlX3JlZ2lvbihwb3MsIG51bV9wYWdlcywgd3JpdGVfYnl0ZXMsIHByZXBhcmVkX3BhZ2VzLCBidWYpOwotCWlmICggcmVzICkgewotCSAgICByZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7Ci0JICAgIGJyZWFrOworCQkvKiBDb3B5IGRhdGEgZnJvbSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciB0byBmaWxlJ3MgcGFnZXMgKi8KKwkJcmVzID0KKwkJICAgIHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKHBvcywgbnVtX3BhZ2VzLAorCQkJCQkJCSAgIHdyaXRlX2J5dGVzLAorCQkJCQkJCSAgIHByZXBhcmVkX3BhZ2VzLCBidWYpOworCQlpZiAocmVzKSB7CisJCQlyZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNlbmQgdGhlIHBhZ2VzIHRvIGRpc2sgYW5kIHVubG9jayB0aGVtLiAqLworCQlyZXMgPQorCQkgICAgcmVpc2VyZnNfc3VibWl0X2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgmdGgsIGlub2RlLCBwb3MsCisJCQkJCQkJICBudW1fcGFnZXMsCisJCQkJCQkJICB3cml0ZV9ieXRlcywKKwkJCQkJCQkgIHByZXBhcmVkX3BhZ2VzKTsKKwkJaWYgKHJlcykKKwkJCWJyZWFrOworCisJCWFscmVhZHlfd3JpdHRlbiArPSB3cml0ZV9ieXRlczsKKwkJYnVmICs9IHdyaXRlX2J5dGVzOworCQkqcHBvcyA9IHBvcyArPSB3cml0ZV9ieXRlczsKKwkJY291bnQgLT0gd3JpdGVfYnl0ZXM7CisJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQoaW5vZGUtPmlfbWFwcGluZyk7CiAJfQogCi0JLyogU2VuZCB0aGUgcGFnZXMgdG8gZGlzayBhbmQgdW5sb2NrIHRoZW0uICovCi0JcmVzID0gcmVpc2VyZnNfc3VibWl0X2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgmdGgsIGlub2RlLCBwb3MsIG51bV9wYWdlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J5dGVzLHByZXBhcmVkX3BhZ2VzKTsKLQlpZiAoIHJlcyApCi0JICAgIGJyZWFrOworCS8qIHRoaXMgaXMgb25seSB0cnVlIG9uIGVycm9yICovCisJaWYgKHRoLnRfdHJhbnNfaWQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgdGgudF9zdXBlciwgdGgudF9ibG9ja3NfYWxsb2NhdGVkKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKGVycikgeworCQkJcmVzID0gZXJyOworCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKLQlhbHJlYWR5X3dyaXR0ZW4gKz0gd3JpdGVfYnl0ZXM7Ci0JYnVmICs9IHdyaXRlX2J5dGVzOwotCSpwcG9zID0gcG9zICs9IHdyaXRlX2J5dGVzOwotCWNvdW50IC09IHdyaXRlX2J5dGVzOwotCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQoaW5vZGUtPmlfbWFwcGluZyk7Ci0gICAgfQorCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpCisJCXJlcyA9CisJCSAgICBnZW5lcmljX29zeW5jX2lub2RlKGlub2RlLCBmaWxlLT5mX21hcHBpbmcsCisJCQkJCU9TWU5DX01FVEFEQVRBIHwgT1NZTkNfREFUQSk7CiAKLSAgICAvKiB0aGlzIGlzIG9ubHkgdHJ1ZSBvbiBlcnJvciAqLwotICAgIGlmICh0aC50X3RyYW5zX2lkKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgICAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIHRoLnRfc3VwZXIsIHRoLnRfYmxvY2tzX2FsbG9jYXRlZCk7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgIHJlcyA9IGVycjsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0gICAgfQorCXVwKCZpbm9kZS0+aV9zZW0pOworCXJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoaW5vZGUtPmlfc2IpOworCXJldHVybiAoYWxyZWFkeV93cml0dGVuICE9IDApID8gYWxyZWFkeV93cml0dGVuIDogcmVzOwogCi0gICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkKLQlyZXMgPSBnZW5lcmljX29zeW5jX2lub2RlKGlub2RlLCBmaWxlLT5mX21hcHBpbmcsIE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpOwotCi0gICAgdXAoJmlub2RlLT5pX3NlbSk7Ci0gICAgcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIChhbHJlYWR5X3dyaXR0ZW4gIT0gMCk/YWxyZWFkeV93cml0dGVuOnJlczsKLQotb3V0OgotICAgIHVwKCZpbm9kZS0+aV9zZW0pOyAvLyB1bmxvY2sgdGhlIGZpbGUgb24gZXhpdC4KLSAgICByZXR1cm4gcmVzOworICAgICAgb3V0OgorCXVwKCZpbm9kZS0+aV9zZW0pOwkvLyB1bmxvY2sgdGhlIGZpbGUgb24gZXhpdC4KKwlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWlzZXJmc19haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQogewotICAgIHJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGJ1ZiwgY291bnQsIHBvcyk7CisJcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKIH0KIAotCi0KIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zID0gewotICAgIC5yZWFkCT0gZ2VuZXJpY19maWxlX3JlYWQsCi0gICAgLndyaXRlCT0gcmVpc2VyZnNfZmlsZV93cml0ZSwKLSAgICAuaW9jdGwJPSByZWlzZXJmc19pb2N0bCwKLSAgICAubW1hcAk9IGdlbmVyaWNfZmlsZV9tbWFwLAotICAgIC5yZWxlYXNlCT0gcmVpc2VyZnNfZmlsZV9yZWxlYXNlLAotICAgIC5mc3luYwk9IHJlaXNlcmZzX3N5bmNfZmlsZSwKLSAgICAuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCi0gICAgLmFpb19yZWFkICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0gICAgLmFpb193cml0ZSAgPSByZWlzZXJmc19haW9fd3JpdGUsCisJLnJlYWQgPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkud3JpdGUgPSByZWlzZXJmc19maWxlX3dyaXRlLAorCS5pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAorCS5tbWFwID0gZ2VuZXJpY19maWxlX21tYXAsCisJLnJlbGVhc2UgPSByZWlzZXJmc19maWxlX3JlbGVhc2UsCisJLmZzeW5jID0gcmVpc2VyZnNfc3luY19maWxlLAorCS5zZW5kZmlsZSA9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKKwkuYWlvX3JlYWQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZSA9IHJlaXNlcmZzX2Fpb193cml0ZSwKIH07CiAKLQotc3RydWN0ICBpbm9kZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKLSAgICAudHJ1bmNhdGUJPSByZWlzZXJmc192ZnNfdHJ1bmNhdGVfZmlsZSwKLSAgICAuc2V0YXR0ciAgICA9IHJlaXNlcmZzX3NldGF0dHIsCi0gICAgLnNldHhhdHRyICAgPSByZWlzZXJmc19zZXR4YXR0ciwKLSAgICAuZ2V0eGF0dHIgICA9IHJlaXNlcmZzX2dldHhhdHRyLAotICAgIC5saXN0eGF0dHIgID0gcmVpc2VyZnNfbGlzdHhhdHRyLAotICAgIC5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAotICAgIC5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUgPSByZWlzZXJmc192ZnNfdHJ1bmNhdGVfZmlsZSwKKwkuc2V0YXR0ciA9IHJlaXNlcmZzX3NldGF0dHIsCisJLnNldHhhdHRyID0gcmVpc2VyZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKwkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCiB9OwotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMgYi9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCmluZGV4IGU0ZjY0YmUuLjI3MDZlMmEgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvZml4X25vZGUuYwpAQCAtMzQsMTQgKzM0LDEyIEBACiAgKiogCiAgKiovCiAKLQogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKLQogLyogVG8gbWFrZSBhbnkgY2hhbmdlcyBpbiB0aGUgdHJlZSB3ZSBmaW5kIGEgbm9kZSwgdGhhdCBjb250YWlucyBpdGVtCiAgICB0byBiZSBjaGFuZ2VkL2RlbGV0ZWQgb3IgcG9zaXRpb24gaW4gdGhlIG5vZGUgd2UgaW5zZXJ0IGEgbmV3IGl0ZW0KICAgIHRvLiBXZSBjYWxsIHRoaXMgbm9kZSBTLiBUbyBkbyBiYWxhbmNpbmcgd2UgbmVlZCB0byBkZWNpZGUgd2hhdCB3ZQpAQCAtNTYsNDkwICs1NCw1MjIgQEAKICAgIGhhdmUgdG8gaGF2ZSBpZiB3ZSBkbyBub3QgYW55IHNoaWZ0aW5ncywgaWYgd2Ugc2hpZnQgdG8gbGVmdC9yaWdodAogICAgbmVpZ2hib3Igb3IgdG8gYm90aC4gKi8KIAotCiAvKiB0YWtpbmcgaXRlbSBudW1iZXIgaW4gdmlydHVhbCBub2RlLCByZXR1cm5zIG51bWJlciBvZiBpdGVtLCB0aGF0IGl0IGhhcyBpbiBzb3VyY2UgYnVmZmVyICovCi1zdGF0aWMgaW5saW5lIGludCBvbGRfaXRlbV9udW0gKGludCBuZXdfbnVtLCBpbnQgYWZmZWN0ZWRfaXRlbV9udW0sIGludCBtb2RlKQorc3RhdGljIGlubGluZSBpbnQgb2xkX2l0ZW1fbnVtKGludCBuZXdfbnVtLCBpbnQgYWZmZWN0ZWRfaXRlbV9udW0sIGludCBtb2RlKQogewotICBpZiAobW9kZSA9PSBNX1BBU1RFIHx8IG1vZGUgPT0gTV9DVVQgfHwgbmV3X251bSA8IGFmZmVjdGVkX2l0ZW1fbnVtKQotICAgIHJldHVybiBuZXdfbnVtOworCWlmIChtb2RlID09IE1fUEFTVEUgfHwgbW9kZSA9PSBNX0NVVCB8fCBuZXdfbnVtIDwgYWZmZWN0ZWRfaXRlbV9udW0pCisJCXJldHVybiBuZXdfbnVtOwogCi0gIGlmIChtb2RlID09IE1fSU5TRVJUKSB7CisJaWYgKG1vZGUgPT0gTV9JTlNFUlQpIHsKIAotICAgIFJGQUxTRSggbmV3X251bSA9PSAwLCAKLQkgICAgInZzLTgwMDU6IGZvciBJTlNFUlQgbW9kZSBhbmQgaXRlbSBudW1iZXIgb2YgaW5zZXJ0ZWQgaXRlbSIpOworCQlSRkFMU0UobmV3X251bSA9PSAwLAorCQkgICAgICAgInZzLTgwMDU6IGZvciBJTlNFUlQgbW9kZSBhbmQgaXRlbSBudW1iZXIgb2YgaW5zZXJ0ZWQgaXRlbSIpOwogCi0gICAgcmV0dXJuIG5ld19udW0gLSAxOwotICB9CisJCXJldHVybiBuZXdfbnVtIC0gMTsKKwl9CiAKLSAgUkZBTFNFKCBtb2RlICE9IE1fREVMRVRFLAotCSAgInZzLTgwMTA6IG9sZF9pdGVtX251bTogbW9kZSBtdXN0IGJlIE1fREVMRVRFIChtb2RlID0gXCclY1wnIiwgbW9kZSk7Ci0gIC8qIGRlbGV0ZSBtb2RlICovCi0gIHJldHVybiBuZXdfbnVtICsgMTsKKwlSRkFMU0UobW9kZSAhPSBNX0RFTEVURSwKKwkgICAgICAgInZzLTgwMTA6IG9sZF9pdGVtX251bTogbW9kZSBtdXN0IGJlIE1fREVMRVRFIChtb2RlID0gXCclY1wnIiwKKwkgICAgICAgbW9kZSk7CisJLyogZGVsZXRlIG1vZGUgKi8KKwlyZXR1cm4gbmV3X251bSArIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgdm9pZCBjcmVhdGVfdmlydHVhbF9ub2RlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOwotICAgIGludCBuZXdfbnVtOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoOwkvKiB0aGlzIGNvbWVzIGZyb20gdGItPlNbaF0gKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlpbnQgbmV3X251bTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNoOwkvKiB0aGlzIGNvbWVzIGZyb20gdGItPlNbaF0gKi8KIAotICAgIFNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKwlTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKIAotICAgIC8qIHNpemUgb2YgY2hhbmdlZCBub2RlICovCi0gICAgdm4tPnZuX3NpemUgPSBNQVhfQ0hJTERfU0laRSAoU2gpIC0gQl9GUkVFX1NQQUNFIChTaCkgKyB0Yi0+aW5zZXJ0X3NpemVbaF07CisJLyogc2l6ZSBvZiBjaGFuZ2VkIG5vZGUgKi8KKwl2bi0+dm5fc2l6ZSA9CisJICAgIE1BWF9DSElMRF9TSVpFKFNoKSAtIEJfRlJFRV9TUEFDRShTaCkgKyB0Yi0+aW5zZXJ0X3NpemVbaF07CiAKLSAgICAvKiBmb3IgaW50ZXJuYWwgbm9kZXMgYXJyYXkgaWYgdmlydHVhbCBpdGVtcyBpcyBub3QgY3JlYXRlZCAqLwotICAgIGlmIChoKSB7Ci0Jdm4tPnZuX25yX2l0ZW0gPSAodm4tPnZuX3NpemUgLSBEQ19TSVpFKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlydHVhbCBub2RlICAqLwotICAgIHZuLT52bl9ucl9pdGVtID0gQl9OUl9JVEVNUyAoU2gpICsgKCh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCk/IDEgOiAwKSAtICgodm4tPnZuX21vZGUgPT0gTV9ERUxFVEUpPyAxIDogMCk7Ci0KLSAgICAvKiBmaXJzdCB2aXJ0dWFsIGl0ZW0gKi8KLSAgICB2bi0+dm5fdmkgPSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqKSh0Yi0+dGJfdm4gKyAxKTsKLSAgICBtZW1zZXQgKHZuLT52bl92aSwgMCwgdm4tPnZuX25yX2l0ZW0gKiBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pKTsKLSAgICB2bi0+dm5fZnJlZV9wdHIgKz0gdm4tPnZuX25yX2l0ZW0gKiBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pOwotCi0KLSAgICAvKiBmaXJzdCBpdGVtIGluIHRoZSBub2RlICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoU2gsIDApOwotCi0gICAgLyogZGVmaW5lIHRoZSBtZXJnZWFiaWxpdHkgZm9yIDAtdGggaXRlbSAoaWYgaXQgaXMgbm90IGJlaW5nIGRlbGV0ZWQpICovCi0gICAgaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBTaC0+Yl9zaXplKSAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSkKLQkgICAgdm4tPnZuX3ZpWzBdLnZpX3R5cGUgfD0gVklfVFlQRV9MRUZUX01FUkdFQUJMRTsKLQotICAgIC8qIGdvIHRocm91Z2ggYWxsIGl0ZW1zIHRob3NlIHJlbWFpbiBpbiB0aGUgdmlydHVhbCBub2RlIChleGNlcHQgZm9yIHRoZSBuZXcgKGluc2VydGVkKSBvbmUpICovCi0gICAgZm9yIChuZXdfbnVtID0gMDsgbmV3X251bSA8IHZuLT52bl9ucl9pdGVtOyBuZXdfbnVtICsrKSB7Ci0JaW50IGo7Ci0Jc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgbmV3X251bTsKLQlpbnQgaXNfYWZmZWN0ZWQgPSAoKG5ld19udW0gIT0gdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSA/IDAgOiAxKTsKLSAgICAKLQotCWlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkKLQkgICAgY29udGludWU7Ci0gICAgCi0JLyogZ2V0IGl0ZW0gbnVtYmVyIGluIHNvdXJjZSBub2RlICovCi0JaiA9IG9sZF9pdGVtX251bSAobmV3X251bSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLCB2bi0+dm5fbW9kZSk7Ci0gICAgCi0JdmktPnZpX2l0ZW1fbGVuICs9IGloX2l0ZW1fbGVuKGloICsgaikgKyBJSF9TSVpFOwotCXZpLT52aV9paCA9IGloICsgajsKLQl2aS0+dmlfaXRlbSA9IEJfSV9QSVRFTSAoU2gsIGloICsgaik7Ci0JdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOwotCi0JLy8gRklYTUU6IHRoZXJlIGlzIG5vIGNoZWNrLCB0aGF0IGl0ZW0gb3BlcmF0aW9uIGRpZCBub3QKLQkvLyBjb25zdW1lIHRvbyBtdWNoIG1lbW9yeQotCXZuLT52bl9mcmVlX3B0ciArPSBvcF9jcmVhdGVfdmkgKHZuLCB2aSwgaXNfYWZmZWN0ZWQsIHRiLT5pbnNlcnRfc2l6ZSBbMF0pOwotCWlmICh0Yi0+dm5fYnVmICsgdGItPnZuX2J1Zl9zaXplIDwgdm4tPnZuX2ZyZWVfcHRyKQotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODAzMDogY3JlYXRlX3ZpcnR1YWxfbm9kZTogIgotCQkJICAgICJ2aXJ0dWFsIG5vZGUgc3BhY2UgY29uc3VtZWQiKTsKLQotCWlmICghaXNfYWZmZWN0ZWQpCi0JICAgIC8qIHRoaXMgaXMgbm90IGJlaW5nIGNoYW5nZWQgKi8KLQkgICAgY29udGludWU7Ci0gICAgCi0JaWYgKHZuLT52bl9tb2RlID09IE1fUEFTVEUgfHwgdm4tPnZuX21vZGUgPT0gTV9DVVQpIHsKLQkgICAgdm4tPnZuX3ZpW25ld19udW1dLnZpX2l0ZW1fbGVuICs9IHRiLT5pbnNlcnRfc2l6ZVswXTsKLQkgICAgdmktPnZpX25ld19kYXRhID0gdm4tPnZuX2RhdGE7IC8vIHBvaW50ZXIgdG8gZGF0YSB3aGljaCBpcyBnb2luZyB0byBiZSBwYXN0ZWQKKwkvKiBmb3IgaW50ZXJuYWwgbm9kZXMgYXJyYXkgaWYgdmlydHVhbCBpdGVtcyBpcyBub3QgY3JlYXRlZCAqLworCWlmIChoKSB7CisJCXZuLT52bl9ucl9pdGVtID0gKHZuLT52bl9zaXplIC0gRENfU0laRSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwkJcmV0dXJuOwogCX0KLSAgICB9CiAKLSAgCi0gICAgLyogdmlydHVhbCBpbnNlcnRlZCBpdGVtIGlzIG5vdCBkZWZpbmVkIHlldCAqLwotICAgIGlmICh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkgewotCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSA9IHZuLT52bl92aSArIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bTsKLSAgICAgIAotCVJGQUxTRSggdm4tPnZuX2luc19paCA9PSAwLAotCQkidnMtODA0MDogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSBpcyBub3Qgc3BlY2lmaWVkIik7Ci0JdmktPnZpX2l0ZW1fbGVuID0gdGItPmluc2VydF9zaXplWzBdOwotCXZpLT52aV9paCA9IHZuLT52bl9pbnNfaWg7Ci0JdmktPnZpX2l0ZW0gPSB2bi0+dm5fZGF0YTsKLQl2aS0+dmlfdWFyZWEgPSB2bi0+dm5fZnJlZV9wdHI7Ci0JCi0Jb3BfY3JlYXRlX3ZpICh2biwgdmksIDAvKm5vdCBwYXN0ZWQgb3IgY3V0Ki8sIHRiLT5pbnNlcnRfc2l6ZSBbMF0pOwotICAgIH0KLSAgCi0gICAgLyogc2V0IHJpZ2h0IG1lcmdlIGZsYWcgd2UgdGFrZSByaWdodCBkZWxpbWl0aW5nIGtleSBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyBhIG1lcmdlYWJsZSBpdGVtICovCi0gICAgaWYgKHRiLT5DRlJbMF0pIHsKLQlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OworCS8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgICovCisJdm4tPnZuX25yX2l0ZW0gPQorCSAgICBCX05SX0lURU1TKFNoKSArICgodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpID8gMSA6IDApIC0KKwkgICAgKCh2bi0+dm5fbW9kZSA9PSBNX0RFTEVURSkgPyAxIDogMCk7CiAKLQlrZXkgPSBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pOwotCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSAoa2V5LCBTaC0+Yl9zaXplKSAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwKLQkJCQkJCSAgICAgICB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoU2gpIC0gMSkpCi0JCXZuLT52bl92aVt2bi0+dm5fbnJfaXRlbS0xXS52aV90eXBlIHw9IFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFOworCS8qIGZpcnN0IHZpcnR1YWwgaXRlbSAqLworCXZuLT52bl92aSA9IChzdHJ1Y3QgdmlydHVhbF9pdGVtICopKHRiLT50Yl92biArIDEpOworCW1lbXNldCh2bi0+dm5fdmksIDAsIHZuLT52bl9ucl9pdGVtICogc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pKTsKKwl2bi0+dm5fZnJlZV9wdHIgKz0gdm4tPnZuX25yX2l0ZW0gKiBzaXplb2Yoc3RydWN0IHZpcnR1YWxfaXRlbSk7CisKKwkvKiBmaXJzdCBpdGVtIGluIHRoZSBub2RlICovCisJaWggPSBCX05fUElURU1fSEVBRChTaCwgMCk7CisKKwkvKiBkZWZpbmUgdGhlIG1lcmdlYWJpbGl0eSBmb3IgMC10aCBpdGVtIChpZiBpdCBpcyBub3QgYmVpbmcgZGVsZXRlZCkgKi8KKwlpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUoJihpaC0+aWhfa2V5KSwgU2gtPmJfc2l6ZSkKKwkgICAgJiYgKHZuLT52bl9tb2RlICE9IE1fREVMRVRFIHx8IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSkpCisJCXZuLT52bl92aVswXS52aV90eXBlIHw9IFZJX1RZUEVfTEVGVF9NRVJHRUFCTEU7CisKKwkvKiBnbyB0aHJvdWdoIGFsbCBpdGVtcyB0aG9zZSByZW1haW4gaW4gdGhlIHZpcnR1YWwgbm9kZSAoZXhjZXB0IGZvciB0aGUgbmV3IChpbnNlcnRlZCkgb25lKSAqLworCWZvciAobmV3X251bSA9IDA7IG5ld19udW0gPCB2bi0+dm5fbnJfaXRlbTsgbmV3X251bSsrKSB7CisJCWludCBqOworCQlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSA9IHZuLT52bl92aSArIG5ld19udW07CisJCWludCBpc19hZmZlY3RlZCA9CisJCSAgICAoKG5ld19udW0gIT0gdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSA/IDAgOiAxKTsKKworCQlpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpCisJCQljb250aW51ZTsKKworCQkvKiBnZXQgaXRlbSBudW1iZXIgaW4gc291cmNlIG5vZGUgKi8KKwkJaiA9IG9sZF9pdGVtX251bShuZXdfbnVtLCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0sCisJCQkJIHZuLT52bl9tb2RlKTsKKworCQl2aS0+dmlfaXRlbV9sZW4gKz0gaWhfaXRlbV9sZW4oaWggKyBqKSArIElIX1NJWkU7CisJCXZpLT52aV9paCA9IGloICsgajsKKwkJdmktPnZpX2l0ZW0gPSBCX0lfUElURU0oU2gsIGloICsgaik7CisJCXZpLT52aV91YXJlYSA9IHZuLT52bl9mcmVlX3B0cjsKKworCQkvLyBGSVhNRTogdGhlcmUgaXMgbm8gY2hlY2ssIHRoYXQgaXRlbSBvcGVyYXRpb24gZGlkIG5vdAorCQkvLyBjb25zdW1lIHRvbyBtdWNoIG1lbW9yeQorCQl2bi0+dm5fZnJlZV9wdHIgKz0KKwkJICAgIG9wX2NyZWF0ZV92aSh2biwgdmksIGlzX2FmZmVjdGVkLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOworCQlpZiAodGItPnZuX2J1ZiArIHRiLT52bl9idWZfc2l6ZSA8IHZuLT52bl9mcmVlX3B0cikKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgInZzLTgwMzA6IGNyZWF0ZV92aXJ0dWFsX25vZGU6ICIKKwkJCQkgICAgICAgInZpcnR1YWwgbm9kZSBzcGFjZSBjb25zdW1lZCIpOworCisJCWlmICghaXNfYWZmZWN0ZWQpCisJCQkvKiB0aGlzIGlzIG5vdCBiZWluZyBjaGFuZ2VkICovCisJCQljb250aW51ZTsKKworCQlpZiAodm4tPnZuX21vZGUgPT0gTV9QQVNURSB8fCB2bi0+dm5fbW9kZSA9PSBNX0NVVCkgeworCQkJdm4tPnZuX3ZpW25ld19udW1dLnZpX2l0ZW1fbGVuICs9IHRiLT5pbnNlcnRfc2l6ZVswXTsKKwkJCXZpLT52aV9uZXdfZGF0YSA9IHZuLT52bl9kYXRhOwkvLyBwb2ludGVyIHRvIGRhdGEgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcGFzdGVkCisJCX0KKwl9CisKKwkvKiB2aXJ0dWFsIGluc2VydGVkIGl0ZW0gaXMgbm90IGRlZmluZWQgeWV0ICovCisJaWYgKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKSB7CisJCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtOworCisJCVJGQUxTRSh2bi0+dm5faW5zX2loID09IDAsCisJCSAgICAgICAidnMtODA0MDogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSBpcyBub3Qgc3BlY2lmaWVkIik7CisJCXZpLT52aV9pdGVtX2xlbiA9IHRiLT5pbnNlcnRfc2l6ZVswXTsKKwkJdmktPnZpX2loID0gdm4tPnZuX2luc19paDsKKwkJdmktPnZpX2l0ZW0gPSB2bi0+dm5fZGF0YTsKKwkJdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOworCisJCW9wX2NyZWF0ZV92aSh2biwgdmksIDAgLypub3QgcGFzdGVkIG9yIGN1dCAqLyAsCisJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJfQorCisJLyogc2V0IHJpZ2h0IG1lcmdlIGZsYWcgd2UgdGFrZSByaWdodCBkZWxpbWl0aW5nIGtleSBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyBhIG1lcmdlYWJsZSBpdGVtICovCisJaWYgKHRiLT5DRlJbMF0pIHsKKwkJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCisJCWtleSA9IEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdKTsKKwkJaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKGtleSwgU2gtPmJfc2l6ZSkKKwkJICAgICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURQorCQkJfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtICE9IEJfTlJfSVRFTVMoU2gpIC0gMSkpCisJCQl2bi0+dm5fdmlbdm4tPnZuX25yX2l0ZW0gLSAxXS52aV90eXBlIHw9CisJCQkgICAgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEU7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUgKGtleSwgU2gtPmJfc2l6ZSkgJiYKLQkgICAgISh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoU2gpIC0gMSkgKSB7Ci0JICAgIC8qIHdlIGRlbGV0ZSBsYXN0IGl0ZW0gYW5kIGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHJpZ2h0IG5laWdoYm9yJ3MgZmlyc3QgaXRlbSAqLwotCSAgICBpZiAoIShCX05SX0lURU1TIChTaCkgPT0gMSAmJiBpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFNoLCAwKSkgJiYKLQkJICBJX0VOVFJZX0NPVU5UIChCX05fUElURU1fSEVBRCAoU2gsIDApKSA9PSAxKSkgewotCQkvKiBub2RlIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGl0ZW0sIG9yIGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtLCBvciB0aGlzIGl0ZW0gY29udGFpbnMgbW9yZSB0aGFuIDEgZW50cnkgKi8KLQkJcHJpbnRfYmxvY2sgKFNoLCAwLCAtMSwgLTEpOwotCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODA0NTogY3JlYXRlX3ZpcnR1YWxfbm9kZTogcmRrZXkgJWssIGFmZmVjdGVkIGl0ZW09PSVkIChtb2RlPT0lYykgTXVzdCBiZSAlYyIsIAotCQkJCWtleSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLCB2bi0+dm5fbW9kZSwgTV9ERUxFVEUpOwotCSAgICB9IGVsc2UKLQkJLyogd2UgY2FuIGRlbGV0ZSBkaXJlY3RvcnkgaXRlbSwgdGhhdCBoYXMgb25seSBvbmUgZGlyZWN0b3J5IGVudHJ5IGluIGl0ICovCi0JCTsKLQl9CisJCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZShrZXksIFNoLT5iX3NpemUpICYmCisJCSAgICAhKHZuLT52bl9tb2RlICE9IE1fREVMRVRFCisJCSAgICAgIHx8IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TKFNoKSAtIDEpKSB7CisJCQkvKiB3ZSBkZWxldGUgbGFzdCBpdGVtIGFuZCBpdCBjb3VsZCBiZSBtZXJnZWQgd2l0aCByaWdodCBuZWlnaGJvcidzIGZpcnN0IGl0ZW0gKi8KKwkJCWlmICghCisJCQkgICAgKEJfTlJfSVRFTVMoU2gpID09IDEKKwkJCSAgICAgJiYgaXNfZGlyZW50cnlfbGVfaWgoQl9OX1BJVEVNX0hFQUQoU2gsIDApKQorCQkJICAgICAmJiBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEKFNoLCAwKSkgPT0gMSkpIHsKKwkJCQkvKiBub2RlIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGl0ZW0sIG9yIGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtLCBvciB0aGlzIGl0ZW0gY29udGFpbnMgbW9yZSB0aGFuIDEgZW50cnkgKi8KKwkJCQlwcmludF9ibG9jayhTaCwgMCwgLTEsIC0xKTsKKwkJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJCSAgICAgICAidnMtODA0NTogY3JlYXRlX3ZpcnR1YWxfbm9kZTogcmRrZXkgJWssIGFmZmVjdGVkIGl0ZW09PSVkIChtb2RlPT0lYykgTXVzdCBiZSAlYyIsCisJCQkJCSAgICAgICBrZXksIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSwKKwkJCQkJICAgICAgIHZuLT52bl9tb2RlLCBNX0RFTEVURSk7CisJCQl9IGVsc2UKKwkJCQkvKiB3ZSBjYW4gZGVsZXRlIGRpcmVjdG9yeSBpdGVtLCB0aGF0IGhhcyBvbmx5IG9uZSBkaXJlY3RvcnkgZW50cnkgaW4gaXQgKi8KKwkJCQk7CisJCX0KICNlbmRpZgotICAgIAotICAgIH0KLX0KIAorCX0KK30KIAogLyogdXNpbmcgdmlydHVhbCBub2RlIGNoZWNrLCBob3cgbWFueSBpdGVtcyBjYW4gYmUgc2hpZnRlZCB0byBsZWZ0CiAgICBuZWlnaGJvciAqLwotc3RhdGljIHZvaWQgY2hlY2tfbGVmdCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQorc3RhdGljIHZvaWQgY2hlY2tfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOwotICAgIGludCBkX3NpemUsIGloX3NpemU7CisJaW50IGk7CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4gPSB0Yi0+dGJfdm47CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmk7CisJaW50IGRfc2l6ZSwgaWhfc2l6ZTsKIAotICAgIFJGQUxTRSggY3VyX2ZyZWUgPCAwLCAidnMtODA1MDogY3VyX2ZyZWUgKCVkKSA8IDAiLCBjdXJfZnJlZSk7CisJUkZBTFNFKGN1cl9mcmVlIDwgMCwgInZzLTgwNTA6IGN1cl9mcmVlICglZCkgPCAwIiwgY3VyX2ZyZWUpOwogCi0gICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KLSAgICBpZiAoaCA+IDApIHsJCi0JdGItPmxudW1baF0gPSBjdXJfZnJlZSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBsZWFmIGxldmVsICovCi0KLSAgICBpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgewotCS8qIG5vIGZyZWUgc3BhY2Ugb3Igbm90aGluZyB0byBtb3ZlICovCi0JdGItPmxudW1baF0gPSAwOwotCXRiLT5sYnl0ZXMgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgUkZBTFNFKCAhUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwKLQkgICAgInZzLTgwNTU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7Ci0KLSAgICB2aSA9IHZuLT52bl92aTsKLSAgICBpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PSAodm4tPnZuX3NpemUgLSAoKHZpLT52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkgPyBJSF9TSVpFIDogMCkpKSB7Ci0JLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gZml0cyBpbnRvIExbMF0gKi8KLQotCVJGQUxTRSggdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKLQkJInZzLTgwNTU6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKLQotCXRiLT5sbnVtWzBdID0gdm4tPnZuX25yX2l0ZW07Ci0JdGItPmxieXRlcyA9IC0xOwotCXJldHVybjsKLSAgICB9Ci0gIAotCi0gICAgZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkU7Ci0KLSAgICAvKiBmaXJzdCBpdGVtIG1heSBiZSBtZXJnZSB3aXRoIGxhc3QgaXRlbSBpbiBsZWZ0IG5laWdoYm9yICovCi0gICAgaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKLQlkX3NpemUgPSAtKChpbnQpSUhfU0laRSksIGloX3NpemUgPSAwOwotCi0gICAgdGItPmxudW1bMF0gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCB2bi0+dm5fbnJfaXRlbTsgaSArKywgaWhfc2l6ZSA9IElIX1NJWkUsIGRfc2l6ZSA9IDAsIHZpICsrKSB7Ci0JZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKLQlpZiAoY3VyX2ZyZWUgPj0gZF9zaXplKSB7CQotCSAgICAvKiB0aGUgaXRlbSBjYW4gYmUgc2hpZnRlZCBlbnRpcmVseSAqLwotCSAgICBjdXJfZnJlZSAtPSBkX3NpemU7Ci0JICAgIHRiLT5sbnVtWzBdICsrOwotCSAgICBjb250aW51ZTsKKwkvKiBpbnRlcm5hbCBsZXZlbCAqLworCWlmIChoID4gMCkgeworCQl0Yi0+bG51bVtoXSA9IGN1cl9mcmVlIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7CisJCXJldHVybjsKIAl9Ci0gICAgICAKLQkvKiB0aGUgaXRlbSBjYW5ub3QgYmUgc2hpZnRlZCBlbnRpcmVseSwgdHJ5IHRvIHNwbGl0IGl0ICovCi0JLyogY2hlY2sgd2hldGhlciBMWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCi0JaWYgKGN1cl9mcmVlIDw9IGloX3NpemUpIHsKLQkgICAgLyogY2Fubm90IHNoaWZ0IGV2ZW4gYSBwYXJ0IG9mIHRoZSBjdXJyZW50IGl0ZW0gKi8KLQkgICAgdGItPmxieXRlcyA9IC0xOwotCSAgICByZXR1cm47CisKKwkvKiBsZWFmIGxldmVsICovCisKKwlpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgeworCQkvKiBubyBmcmVlIHNwYWNlIG9yIG5vdGhpbmcgdG8gbW92ZSAqLworCQl0Yi0+bG51bVtoXSA9IDA7CisJCXRiLT5sYnl0ZXMgPSAtMTsKKwkJcmV0dXJuOwogCX0KLQljdXJfZnJlZSAtPSBpaF9zaXplOwotICAgIAotCXRiLT5sYnl0ZXMgPSBvcF9jaGVja19sZWZ0ICh2aSwgY3VyX2ZyZWUsIDAsIDApOwotCWlmICh0Yi0+bGJ5dGVzICE9IC0xKQotCSAgICAvKiBjb3VudCBwYXJ0aWFsbHkgc2hpZnRlZCBpdGVtICovCi0JICAgIHRiLT5sbnVtWzBdICsrOwotICAgIAotCWJyZWFrOwotICAgIH0KLSAgCi0gICAgcmV0dXJuOworCisJUkZBTFNFKCFQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksCisJICAgICAgICJ2cy04MDU1OiBwYXJlbnQgZG9lcyBub3QgZXhpc3Qgb3IgaW52YWxpZCIpOworCisJdmkgPSB2bi0+dm5fdmk7CisJaWYgKCh1bnNpZ25lZCBpbnQpY3VyX2ZyZWUgPj0KKwkgICAgKHZuLT52bl9zaXplIC0KKwkgICAgICgodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKKwkJLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gZml0cyBpbnRvIExbMF0gKi8KKworCQlSRkFMU0Uodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKKwkJICAgICAgICJ2cy04MDU1OiBpbnZhbGlkIG1vZGUgb3IgYmFsYW5jZSBjb25kaXRpb24gZmFpbGVkIik7CisKKwkJdGItPmxudW1bMF0gPSB2bi0+dm5fbnJfaXRlbTsKKwkJdGItPmxieXRlcyA9IC0xOworCQlyZXR1cm47CisJfQorCisJZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkU7CisKKwkvKiBmaXJzdCBpdGVtIG1heSBiZSBtZXJnZSB3aXRoIGxhc3QgaXRlbSBpbiBsZWZ0IG5laWdoYm9yICovCisJaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKKwkJZF9zaXplID0gLSgoaW50KUlIX1NJWkUpLCBpaF9zaXplID0gMDsKKworCXRiLT5sbnVtWzBdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdm4tPnZuX25yX2l0ZW07CisJICAgICBpKyssIGloX3NpemUgPSBJSF9TSVpFLCBkX3NpemUgPSAwLCB2aSsrKSB7CisJCWRfc2l6ZSArPSB2aS0+dmlfaXRlbV9sZW47CisJCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsKKwkJCS8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCisJCQljdXJfZnJlZSAtPSBkX3NpemU7CisJCQl0Yi0+bG51bVswXSsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB0aGUgaXRlbSBjYW5ub3QgYmUgc2hpZnRlZCBlbnRpcmVseSwgdHJ5IHRvIHNwbGl0IGl0ICovCisJCS8qIGNoZWNrIHdoZXRoZXIgTFswXSBjYW4gaG9sZCBpaCBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgdGhlIGl0ZW0gYm9keSAqLworCQlpZiAoY3VyX2ZyZWUgPD0gaWhfc2l6ZSkgeworCQkJLyogY2Fubm90IHNoaWZ0IGV2ZW4gYSBwYXJ0IG9mIHRoZSBjdXJyZW50IGl0ZW0gKi8KKwkJCXRiLT5sYnl0ZXMgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCQljdXJfZnJlZSAtPSBpaF9zaXplOworCisJCXRiLT5sYnl0ZXMgPSBvcF9jaGVja19sZWZ0KHZpLCBjdXJfZnJlZSwgMCwgMCk7CisJCWlmICh0Yi0+bGJ5dGVzICE9IC0xKQorCQkJLyogY291bnQgcGFydGlhbGx5IHNoaWZ0ZWQgaXRlbSAqLworCQkJdGItPmxudW1bMF0rKzsKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm47CiB9CiAKLQogLyogdXNpbmcgdmlydHVhbCBub2RlIGNoZWNrLCBob3cgbWFueSBpdGVtcyBjYW4gYmUgc2hpZnRlZCB0byByaWdodAogICAgbmVpZ2hib3IgKi8KLXN0YXRpYyB2b2lkIGNoZWNrX3JpZ2h0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLCBpbnQgY3VyX2ZyZWUpCitzdGF0aWMgdm9pZCBjaGVja19yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOwotICAgIGludCBkX3NpemUsIGloX3NpemU7CisJaW50IGk7CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4gPSB0Yi0+dGJfdm47CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmk7CisJaW50IGRfc2l6ZSwgaWhfc2l6ZTsKIAotICAgIFJGQUxTRSggY3VyX2ZyZWUgPCAwLCAidnMtODA3MDogY3VyX2ZyZWUgPCAwIik7Ci0gICAgCi0gICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KLSAgICBpZiAoaCA+IDApIHsKLQl0Yi0+cm51bVtoXSA9IGN1cl9mcmVlIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvKiBsZWFmIGxldmVsICovCi0gICAgCi0gICAgaWYgKCFjdXJfZnJlZSB8fCAhdm4tPnZuX25yX2l0ZW0pIHsKLQkvKiBubyBmcmVlIHNwYWNlICAqLwotCXRiLT5ybnVtW2hdID0gMDsKLQl0Yi0+cmJ5dGVzID0gLTE7Ci0JcmV0dXJuOwotICAgIH0KLSAgCi0gICAgUkZBTFNFKCAhUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwKLQkgICAgInZzLTgwNzU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7Ci0gIAotICAgIHZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX25yX2l0ZW0gLSAxOwotICAgIGlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49ICh2bi0+dm5fc2l6ZSAtICgodmktPnZpX3R5cGUgJiBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRSkgPyBJSF9TSVpFIDogMCkpKSB7Ci0JLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gZml0cyBpbnRvIFJbMF0gKi8KLQkKLQlSRkFMU0UoIHZuLT52bl9tb2RlID09IE1fSU5TRVJUIHx8IHZuLT52bl9tb2RlID09IE1fUEFTVEUsCi0JCSJ2cy04MDgwOiBpbnZhbGlkIG1vZGUgb3IgYmFsYW5jZSBjb25kaXRpb24gZmFpbGVkIik7CisJUkZBTFNFKGN1cl9mcmVlIDwgMCwgInZzLTgwNzA6IGN1cl9mcmVlIDwgMCIpOwogCi0JdGItPnJudW1baF0gPSB2bi0+dm5fbnJfaXRlbTsKLQl0Yi0+cmJ5dGVzID0gLTE7Ci0JcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKLSAgICAKLSAgICAvKiBsYXN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggZmlyc3QgaXRlbSBpbiByaWdodCBuZWlnaGJvciAqLwotICAgIGlmICh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQotCWRfc2l6ZSA9IC0oaW50KUlIX1NJWkUsIGloX3NpemUgPSAwOwotCi0gICAgdGItPnJudW1bMF0gPSAwOwotICAgIGZvciAoaSA9IHZuLT52bl9ucl9pdGVtIC0gMTsgaSA+PSAwOyBpIC0tLCBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRSwgdmkgLS0pIHsKLQlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOwotCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsJCi0JICAgIC8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCi0JICAgIGN1cl9mcmVlIC09IGRfc2l6ZTsKLQkgICAgdGItPnJudW1bMF0gKys7Ci0JICAgIGNvbnRpbnVlOworCS8qIGludGVybmFsIGxldmVsICovCisJaWYgKGggPiAwKSB7CisJCXRiLT5ybnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwkJcmV0dXJuOwogCX0KLQkKLQkvKiBjaGVjayB3aGV0aGVyIFJbMF0gY2FuIGhvbGQgaWggYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRoZSBpdGVtIGJvZHkgKi8KLQlpZiAoIGN1cl9mcmVlIDw9IGloX3NpemUgKSB7ICAgIC8qIGNhbm5vdCBzaGlmdCBldmVuIGEgcGFydCBvZiB0aGUgY3VycmVudCBpdGVtICovCi0JICAgIHRiLT5yYnl0ZXMgPSAtMTsKLQkgICAgcmV0dXJuOwotCX0KLQkKLQkvKiBSWzBdIGNhbiBob2xkIHRoZSBoZWFkZXIgb2YgdGhlIGl0ZW0gYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIGl0cyBib2R5ICovCi0JY3VyX2ZyZWUgLT0gaWhfc2l6ZTsJLyogY3VyX2ZyZWUgaXMgc3RpbGwgPiAwICovCiAKLQl0Yi0+cmJ5dGVzID0gb3BfY2hlY2tfcmlnaHQgKHZpLCBjdXJfZnJlZSk7Ci0JaWYgKHRiLT5yYnl0ZXMgIT0gLTEpCi0JICAgIC8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KLQkgICAgdGItPnJudW1bMF0gKys7Ci0gICAgCi0JYnJlYWs7Ci0gICAgfQotCQotICByZXR1cm47CisJLyogbGVhZiBsZXZlbCAqLworCisJaWYgKCFjdXJfZnJlZSB8fCAhdm4tPnZuX25yX2l0ZW0pIHsKKwkJLyogbm8gZnJlZSBzcGFjZSAgKi8KKwkJdGItPnJudW1baF0gPSAwOworCQl0Yi0+cmJ5dGVzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlSRkFMU0UoIVBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwKKwkgICAgICAgInZzLTgwNzU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7CisKKwl2aSA9IHZuLT52bl92aSArIHZuLT52bl9ucl9pdGVtIC0gMTsKKwlpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PQorCSAgICAodm4tPnZuX3NpemUgLQorCSAgICAgKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKKwkJLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gZml0cyBpbnRvIFJbMF0gKi8KKworCQlSRkFMU0Uodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKKwkJICAgICAgICJ2cy04MDgwOiBpbnZhbGlkIG1vZGUgb3IgYmFsYW5jZSBjb25kaXRpb24gZmFpbGVkIik7CisKKwkJdGItPnJudW1baF0gPSB2bi0+dm5fbnJfaXRlbTsKKwkJdGItPnJieXRlcyA9IC0xOworCQlyZXR1cm47CisJfQorCisJZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkU7CisKKwkvKiBsYXN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggZmlyc3QgaXRlbSBpbiByaWdodCBuZWlnaGJvciAqLworCWlmICh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQorCQlkX3NpemUgPSAtKGludClJSF9TSVpFLCBpaF9zaXplID0gMDsKKworCXRiLT5ybnVtWzBdID0gMDsKKwlmb3IgKGkgPSB2bi0+dm5fbnJfaXRlbSAtIDE7IGkgPj0gMDsKKwkgICAgIGktLSwgZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkUsIHZpLS0pIHsKKwkJZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKKwkJaWYgKGN1cl9mcmVlID49IGRfc2l6ZSkgeworCQkJLyogdGhlIGl0ZW0gY2FuIGJlIHNoaWZ0ZWQgZW50aXJlbHkgKi8KKwkJCWN1cl9mcmVlIC09IGRfc2l6ZTsKKwkJCXRiLT5ybnVtWzBdKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGNoZWNrIHdoZXRoZXIgUlswXSBjYW4gaG9sZCBpaCBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgdGhlIGl0ZW0gYm9keSAqLworCQlpZiAoY3VyX2ZyZWUgPD0gaWhfc2l6ZSkgewkvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLworCQkJdGItPnJieXRlcyA9IC0xOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogUlswXSBjYW4gaG9sZCB0aGUgaGVhZGVyIG9mIHRoZSBpdGVtIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiBpdHMgYm9keSAqLworCQljdXJfZnJlZSAtPSBpaF9zaXplOwkvKiBjdXJfZnJlZSBpcyBzdGlsbCA+IDAgKi8KKworCQl0Yi0+cmJ5dGVzID0gb3BfY2hlY2tfcmlnaHQodmksIGN1cl9mcmVlKTsKKwkJaWYgKHRiLT5yYnl0ZXMgIT0gLTEpCisJCQkvKiBjb3VudCBwYXJ0aWFsbHkgc2hpZnRlZCBpdGVtICovCisJCQl0Yi0+cm51bVswXSsrOworCisJCWJyZWFrOworCX0KKworCXJldHVybjsKIH0KIAotCiAvKgogICogZnJvbSAtIG51bWJlciBvZiBpdGVtcywgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gbGVmdCBuZWlnaGJvciBlbnRpcmVseQogICogdG8gLSBudW1iZXIgb2YgaXRlbSwgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gcmlnaHQgbmVpZ2hib3IgZW50aXJlbHkKICAqIGZyb21fYnl0ZXMgLSBudW1iZXIgb2YgYnl0ZXMgb2YgYm91bmRhcnkgaXRlbSAob3IgZGlyZWN0b3J5IGVudHJpZXMpIHdoaWNoIGFyZSBzaGlmdGVkIHRvIGxlZnQgbmVpZ2hib3IKICAqIHRvX2J5dGVzIC0gbnVtYmVyIG9mIGJ5dGVzIG9mIGJvdW5kYXJ5IGl0ZW0gKG9yIGRpcmVjdG9yeSBlbnRyaWVzKSB3aGljaCBhcmUgc2hpZnRlZCB0byByaWdodCBuZWlnaGJvciAqLwotc3RhdGljIGludCBnZXRfbnVtX3ZlciAoaW50IG1vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsCi0JCQlpbnQgZnJvbSwgaW50IGZyb21fYnl0ZXMsCi0JCQlpbnQgdG8sICAgaW50IHRvX2J5dGVzLAotCQkJc2hvcnQgKiBzbnVtMDEyLCBpbnQgZmxvdwotICAgICkKK3N0YXRpYyBpbnQgZ2V0X251bV92ZXIoaW50IG1vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwKKwkJICAgICAgIGludCBmcm9tLCBpbnQgZnJvbV9ieXRlcywKKwkJICAgICAgIGludCB0bywgaW50IHRvX2J5dGVzLCBzaG9ydCAqc251bTAxMiwgaW50IGZsb3cpCiB7Ci0gICAgaW50IGk7Ci0gICAgaW50IGN1cl9mcmVlOwotICAgIC8vICAgIGludCBieXRlczsKLSAgICBpbnQgdW5pdHM7Ci0gICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOwotICAgIC8vICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aTsKKwlpbnQgaTsKKwlpbnQgY3VyX2ZyZWU7CisJLy8gICAgaW50IGJ5dGVzOworCWludCB1bml0czsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwkvLyAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7CiAKLSAgICBpbnQgdG90YWxfbm9kZV9zaXplLCBtYXhfbm9kZV9zaXplLCBjdXJyZW50X2l0ZW1fc2l6ZTsKLSAgICBpbnQgbmVlZGVkX25vZGVzOwotICAgIGludCBzdGFydF9pdGVtLCAJLyogcG9zaXRpb24gb2YgaXRlbSB3ZSBzdGFydCBmaWxsaW5nIG5vZGUgZnJvbSAqLwotCWVuZF9pdGVtLAkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIGZpbmlzaCBmaWxsaW5nIG5vZGUgYnkgKi8KLQlzdGFydF9ieXRlcywvKiBudW1iZXIgb2YgZmlyc3QgYnl0ZXMgKGVudHJpZXMgZm9yIGRpcmVjdG9yeSkgb2Ygc3RhcnRfaXRlbS10aCBpdGVtIAotCQkgICAgICAgd2UgZG8gbm90IGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCi0JZW5kX2J5dGVzOwkvKiBudW1iZXIgb2YgbGFzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBlbmRfaXRlbS10aCBpdGVtIAotCQkJICAgd2UgZG8gbm9kZSBpbmNsdWRlIGludG8gbm9kZSB0aGF0IGlzIGJlaW5nIGZpbGxlZCAqLwotICAgIGludCBzcGxpdF9pdGVtX3Bvc2l0aW9uc1syXTsgLyogdGhlc2UgYXJlIHBvc2l0aW9ucyBpbiB2aXJ0dWFsIGl0ZW0gb2YKLQkJCQkgICAgaXRlbXMsIHRoYXQgYXJlIHNwbGl0IGJldHdlZW4gU1swXSBhbmQKLQkJCQkgICAgUzFuZXcgYW5kIFMxbmV3IGFuZCBTMm5ldyAqLworCWludCB0b3RhbF9ub2RlX3NpemUsIG1heF9ub2RlX3NpemUsIGN1cnJlbnRfaXRlbV9zaXplOworCWludCBuZWVkZWRfbm9kZXM7CisJaW50IHN0YXJ0X2l0ZW0sCQkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIHN0YXJ0IGZpbGxpbmcgbm9kZSBmcm9tICovCisJIGVuZF9pdGVtLAkJLyogcG9zaXRpb24gb2YgaXRlbSB3ZSBmaW5pc2ggZmlsbGluZyBub2RlIGJ5ICovCisJIHN0YXJ0X2J5dGVzLAkJLyogbnVtYmVyIG9mIGZpcnN0IGJ5dGVzIChlbnRyaWVzIGZvciBkaXJlY3RvcnkpIG9mIHN0YXJ0X2l0ZW0tdGggaXRlbSAKKwkJCQkgICB3ZSBkbyBub3QgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KKwkgZW5kX2J5dGVzOwkJLyogbnVtYmVyIG9mIGxhc3QgYnl0ZXMgKGVudHJpZXMgZm9yIGRpcmVjdG9yeSkgb2YgZW5kX2l0ZW0tdGggaXRlbSAKKwkJCQkgICB3ZSBkbyBub2RlIGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCisJaW50IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzJdOwkvKiB0aGVzZSBhcmUgcG9zaXRpb25zIGluIHZpcnR1YWwgaXRlbSBvZgorCQkJCQkgICBpdGVtcywgdGhhdCBhcmUgc3BsaXQgYmV0d2VlbiBTWzBdIGFuZAorCQkJCQkgICBTMW5ldyBhbmQgUzFuZXcgYW5kIFMybmV3ICovCiAKLSAgICBzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9IC0xOwotICAgIHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdID0gLTE7CisJc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPSAtMTsKKwlzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXSA9IC0xOwogCi0gICAgLyogV2Ugb25seSBjcmVhdGUgYWRkaXRpb25hbCBub2RlcyBpZiB3ZSBhcmUgaW4gaW5zZXJ0IG9yIHBhc3RlIG1vZGUKLSAgICAgICBvciB3ZSBhcmUgaW4gcmVwbGFjZSBtb2RlIGF0IHRoZSBpbnRlcm5hbCBsZXZlbC4gSWYgaCBpcyAwIGFuZAotICAgICAgIHRoZSBtb2RlIGlzIE1fUkVQTEFDRSB0aGVuIGluIGZpeF9ub2RlcyB3ZSBjaGFuZ2UgdGhlIG1vZGUgdG8KLSAgICAgICBwYXN0ZSBvciBpbnNlcnQgYmVmb3JlIHdlIGdldCBoZXJlIGluIHRoZSBjb2RlLiAgKi8KLSAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVtoXSA8IDAgIHx8IChtb2RlICE9IE1fSU5TRVJUICYmIG1vZGUgIT0gTV9QQVNURSksCi0JICAgICJ2cy04MTAwOiBpbnNlcnRfc2l6ZSA8IDAgaW4gb3ZlcmZsb3ciKTsKKwkvKiBXZSBvbmx5IGNyZWF0ZSBhZGRpdGlvbmFsIG5vZGVzIGlmIHdlIGFyZSBpbiBpbnNlcnQgb3IgcGFzdGUgbW9kZQorCSAgIG9yIHdlIGFyZSBpbiByZXBsYWNlIG1vZGUgYXQgdGhlIGludGVybmFsIGxldmVsLiBJZiBoIGlzIDAgYW5kCisJICAgdGhlIG1vZGUgaXMgTV9SRVBMQUNFIHRoZW4gaW4gZml4X25vZGVzIHdlIGNoYW5nZSB0aGUgbW9kZSB0bworCSAgIHBhc3RlIG9yIGluc2VydCBiZWZvcmUgd2UgZ2V0IGhlcmUgaW4gdGhlIGNvZGUuICAqLworCVJGQUxTRSh0Yi0+aW5zZXJ0X3NpemVbaF0gPCAwIHx8IChtb2RlICE9IE1fSU5TRVJUICYmIG1vZGUgIT0gTV9QQVNURSksCisJICAgICAgICJ2cy04MTAwOiBpbnNlcnRfc2l6ZSA8IDAgaW4gb3ZlcmZsb3ciKTsKIAotICAgIG1heF9ub2RlX3NpemUgPSBNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSk7CisJbWF4X25vZGVfc2l6ZSA9IE1BWF9DSElMRF9TSVpFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSk7CiAKLSAgICAvKiBzbnVtMDEyIFswLTJdIC0gbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IGxheQotICAgICAgIHRvIFNbMF0sIGZpcnN0IG5ldyBub2RlIGFuZCBzZWNvbmQgbmV3IG5vZGUgKi8KLSAgICBzbnVtMDEyWzNdID0gLTE7CS8qIHMxYnl0ZXMgKi8KLSAgICBzbnVtMDEyWzRdID0gLTE7CS8qIHMyYnl0ZXMgKi8KKwkvKiBzbnVtMDEyIFswLTJdIC0gbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IGxheQorCSAgIHRvIFNbMF0sIGZpcnN0IG5ldyBub2RlIGFuZCBzZWNvbmQgbmV3IG5vZGUgKi8KKwlzbnVtMDEyWzNdID0gLTE7CS8qIHMxYnl0ZXMgKi8KKwlzbnVtMDEyWzRdID0gLTE7CS8qIHMyYnl0ZXMgKi8KIAotICAgIC8qIGludGVybmFsIGxldmVsICovCi0gICAgaWYgKGggPiAwKSB7Ci0JaSA9ICgodG8gLSBmcm9tKSAqIChLRVlfU0laRSArIERDX1NJWkUpICsgRENfU0laRSk7Ci0JaWYgKGkgPT0gbWF4X25vZGVfc2l6ZSkKLQkgICAgcmV0dXJuIDE7Ci0JcmV0dXJuIChpIC8gbWF4X25vZGVfc2l6ZSArIDEpOwotICAgIH0KLQotICAgIC8qIGxlYWYgbGV2ZWwgKi8KLSAgICBuZWVkZWRfbm9kZXMgPSAxOwotICAgIHRvdGFsX25vZGVfc2l6ZSA9IDA7Ci0gICAgY3VyX2ZyZWUgPSBtYXhfbm9kZV9zaXplOwotCi0gICAgLy8gc3RhcnQgZnJvbSAnZnJvbSctdGggaXRlbQotICAgIHN0YXJ0X2l0ZW0gPSBmcm9tOwotICAgIC8vIHNraXAgaXRzIGZpcnN0ICdzdGFydF9ieXRlcycgdW5pdHMKLSAgICBzdGFydF9ieXRlcyA9ICgoZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7Ci0KLSAgICAvLyBsYXN0IGluY2x1ZGVkIGl0ZW0gaXMgdGhlICdlbmRfaXRlbSctdGggb25lCi0gICAgZW5kX2l0ZW0gPSB2bi0+dm5fbnJfaXRlbSAtIHRvIC0gMTsKLSAgICAvLyBkbyBub3QgY291bnQgbGFzdCAnZW5kX2J5dGVzJyB1bml0cyBvZiAnZW5kX2l0ZW0nLXRoIGl0ZW0KLSAgICBlbmRfYnl0ZXMgPSAodG9fYnl0ZXMgIT0gLTEpID8gdG9fYnl0ZXMgOiAwOwotCi0gICAgLyogZ28gdGhyb3VnaCBhbGwgaXRlbSBiZWdpbm5pbmcgZnJvbSB0aGUgc3RhcnRfaXRlbS10aCBpdGVtIGFuZCBlbmRpbmcgYnkKLSAgICAgICB0aGUgZW5kX2l0ZW0tdGggaXRlbS4gRG8gbm90IGNvdW50IGZpcnN0ICdzdGFydF9ieXRlcycgdW5pdHMgb2YKLSAgICAgICAnc3RhcnRfaXRlbSctdGggaXRlbSBhbmQgbGFzdCAnZW5kX2J5dGVzJyBvZiAnZW5kX2l0ZW0nLXRoIGl0ZW0gKi8KLSAgICAKLSAgICBmb3IgKGkgPSBzdGFydF9pdGVtOyBpIDw9IGVuZF9pdGVtOyBpICsrKSB7Ci0Jc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgaTsKLQlpbnQgc2tpcF9mcm9tX2VuZCA9ICgoaSA9PSBlbmRfaXRlbSkgPyBlbmRfYnl0ZXMgOiAwKTsKLQotCVJGQUxTRSggbmVlZGVkX25vZGVzID4gMywgInZzLTgxMDU6IHRvbyBtYW55IG5vZGVzIGFyZSBuZWVkZWQiKTsKLQotCS8qIGdldCBzaXplIG9mIGN1cnJlbnQgaXRlbSAqLwotCWN1cnJlbnRfaXRlbV9zaXplID0gdmktPnZpX2l0ZW1fbGVuOwotCi0JLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gaGVhZCBwYXJ0IChmcm9tX2J5dGVzKSBvZiBmcm9tLXRoIGl0ZW0gKi8KLQljdXJyZW50X2l0ZW1fc2l6ZSAtPSBvcF9wYXJ0X3NpemUgKHZpLCAwLypmcm9tIHN0YXJ0Ki8sIHN0YXJ0X2J5dGVzKTsKLQotCS8qIGRvIG5vdCB0YWtlIGluIGNhbGN1bGF0aW9uIHRhaWwgcGFydCBvZiBsYXN0IGl0ZW0gKi8KLQljdXJyZW50X2l0ZW1fc2l6ZSAtPSBvcF9wYXJ0X3NpemUgKHZpLCAxLypmcm9tIGVuZCovLCBza2lwX2Zyb21fZW5kKTsKLQotCS8qIGlmIGl0ZW0gZml0cyBpbnRvIGN1cnJlbnQgbm9kZSBlbnRpZXJseSAqLwotCWlmICh0b3RhbF9ub2RlX3NpemUgKyBjdXJyZW50X2l0ZW1fc2l6ZSA8PSBtYXhfbm9kZV9zaXplKSB7Ci0JICAgIHNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0gKys7Ci0JICAgIHRvdGFsX25vZGVfc2l6ZSArPSBjdXJyZW50X2l0ZW1fc2l6ZTsKLQkgICAgc3RhcnRfYnl0ZXMgPSAwOwotCSAgICBjb250aW51ZTsKKwkvKiBpbnRlcm5hbCBsZXZlbCAqLworCWlmIChoID4gMCkgeworCQlpID0gKCh0byAtIGZyb20pICogKEtFWV9TSVpFICsgRENfU0laRSkgKyBEQ19TSVpFKTsKKwkJaWYgKGkgPT0gbWF4X25vZGVfc2l6ZSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gKGkgLyBtYXhfbm9kZV9zaXplICsgMSk7CiAJfQogCi0JaWYgKGN1cnJlbnRfaXRlbV9zaXplID4gbWF4X25vZGVfc2l6ZSkgewotCSAgICAvKiB2aXJ0dWFsIGl0ZW0gbGVuZ3RoIGlzIGxvbmdlciwgdGhhbiBtYXggc2l6ZSBvZiBpdGVtIGluCi0gICAgICAgICAgICAgICBhIG5vZGUuIEl0IGlzIGltcG9zc2libGUgZm9yIGRpcmVjdCBpdGVtICovCi0JICAgIFJGQUxTRSggaXNfZGlyZWN0X2xlX2loICh2aS0+dmlfaWgpLAotCQkgICAgInZzLTgxMTA6ICIKLQkJICAgICJkaXJlY3QgaXRlbSBsZW5ndGggaXMgJWQuIEl0IGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gJWQiLAotCQkgICAgY3VycmVudF9pdGVtX3NpemUsIG1heF9ub2RlX3NpemUpOwotCSAgICAvKiB3ZSB3aWxsIHRyeSB0byBzcGxpdCBpdCAqLwotCSAgICBmbG93ID0gMTsKLQl9Ci0KLQlpZiAoIWZsb3cpIHsKLQkgICAgLyogYXMgd2UgZG8gbm90IHNwbGl0IGl0ZW1zLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLwotCSAgICBuZWVkZWRfbm9kZXMgKys7IGkgLS07IHRvdGFsX25vZGVfc2l6ZSA9IDA7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgaXRlbSB1bml0cyB3aGljaCBmaXQgaW50byBub2RlIGJlaW5nCi0JLy8gZmlsbGVkCi0JewotCSAgICBpbnQgZnJlZV9zcGFjZTsKLQotCSAgICBmcmVlX3NwYWNlID0gbWF4X25vZGVfc2l6ZSAtIHRvdGFsX25vZGVfc2l6ZSAtIElIX1NJWkU7Ci0JICAgIHVuaXRzID0gb3BfY2hlY2tfbGVmdCAodmksIGZyZWVfc3BhY2UsIHN0YXJ0X2J5dGVzLCBza2lwX2Zyb21fZW5kKTsKLQkgICAgaWYgKHVuaXRzID09IC0xKSB7Ci0JCS8qIG5vdGhpbmcgZml0cyBpbnRvIGN1cnJlbnQgbm9kZSwgdGFrZSBuZXcgbm9kZSBhbmQgY29udGludWUgKi8KLQkJbmVlZGVkX25vZGVzICsrLCBpLS0sIHRvdGFsX25vZGVfc2l6ZSA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0JLyogc29tZXRoaW5nIGZpdHMgaW50byB0aGUgY3VycmVudCBub2RlICovCi0JLy9pZiAoc251bTAxMlszXSAhPSAtMSB8fCBuZWVkZWRfbm9kZXMgIT0gMSkKLQkvLyAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTgxMTU6IGdldF9udW1fdmVyOiB0b28gbWFueSBub2RlcyByZXF1aXJlZCIpOwotCS8vc251bTAxMltuZWVkZWRfbm9kZXMgLSAxICsgM10gPSBvcF91bml0X251bSAodmkpIC0gc3RhcnRfYnl0ZXMgLSB1bml0czsKLQlzdGFydF9ieXRlcyArPSB1bml0czsKLQlzbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IHVuaXRzOwotCi0JaWYgKG5lZWRlZF9ub2RlcyA+IDIpCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInZzLTgxMTE6IGdldF9udW1fdmVyOiAiCi0JCQkgICAgICAic3BsaXRfaXRlbV9wb3NpdGlvbiBpcyBvdXQgb2YgYm91bmRhcnkiKTsKLQlzbnVtMDEyW25lZWRlZF9ub2RlcyAtIDFdICsrOwotCXNwbGl0X2l0ZW1fcG9zaXRpb25zW25lZWRlZF9ub2RlcyAtIDFdID0gaTsKLQluZWVkZWRfbm9kZXMgKys7Ci0JLyogY29udGludWUgZnJvbSB0aGUgc2FtZSBpdGVtIHdpdGggc3RhcnRfYnl0ZXMgIT0gLTEgKi8KLQlzdGFydF9pdGVtID0gaTsKLQlpIC0tOworCS8qIGxlYWYgbGV2ZWwgKi8KKwluZWVkZWRfbm9kZXMgPSAxOwogCXRvdGFsX25vZGVfc2l6ZSA9IDA7Ci0gICAgfQorCWN1cl9mcmVlID0gbWF4X25vZGVfc2l6ZTsKIAotICAgIC8vIHN1bTAxMls0XSAoaWYgaXQgaXMgbm90IC0xKSBjb250YWlucyBudW1iZXIgb2YgdW5pdHMgb2Ygd2hpY2gKLSAgICAvLyBhcmUgdG8gYmUgaW4gUzFuZXcsIHNudW0wMTJbM10gLSB0byBiZSBpbiBTMC4gVGhleSBhcmUgc3VwcG9zZWQKLSAgICAvLyB0byBiZSBTMWJ5dGVzIGFuZCBTMmJ5dGVzIGNvcnJlc3BvbmRpbmdseSwgc28gcmVjYWxjdWxhdGUKLSAgICBpZiAoc251bTAxMls0XSA+IDApIHsKLQlpbnQgc3BsaXRfaXRlbV9udW07Ci0JaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7Ci0JaW50IGJ5dGVzX3RvX1MxbmV3OwotICAgIAotCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV07Ci0JYnl0ZXNfdG9fbCA9ICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bSAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKLQlieXRlc190b19yID0gKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bSAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7Ci0JYnl0ZXNfdG9fUzFuZXcgPSAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdKSA/IHNudW0wMTJbM10gOiAwKTsKKwkvLyBzdGFydCBmcm9tICdmcm9tJy10aCBpdGVtCisJc3RhcnRfaXRlbSA9IGZyb207CisJLy8gc2tpcCBpdHMgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cworCXN0YXJ0X2J5dGVzID0gKChmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKIAotCS8vIHMyYnl0ZXMKLQlzbnVtMDEyWzRdID0gb3BfdW5pdF9udW0gKCZ2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dKSAtIHNudW0wMTJbNF0gLSBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MxbmV3OworCS8vIGxhc3QgaW5jbHVkZWQgaXRlbSBpcyB0aGUgJ2VuZF9pdGVtJy10aCBvbmUKKwllbmRfaXRlbSA9IHZuLT52bl9ucl9pdGVtIC0gdG8gLSAxOworCS8vIGRvIG5vdCBjb3VudCBsYXN0ICdlbmRfYnl0ZXMnIHVuaXRzIG9mICdlbmRfaXRlbSctdGggaXRlbQorCWVuZF9ieXRlcyA9ICh0b19ieXRlcyAhPSAtMSkgPyB0b19ieXRlcyA6IDA7CiAKLQlpZiAodm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0RJUkVOVFJZICYmCi0JICAgIHZuLT52bl92aVtzcGxpdF9pdGVtX251bV0udmlfaW5kZXggIT0gVFlQRV9JTkRJUkVDVCkKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IG5vdCAiCi0JCQkgICAgICAiZGlyZWN0b3J5IG9yIGluZGlyZWN0IGl0ZW0iKTsKLSAgICB9CisJLyogZ28gdGhyb3VnaCBhbGwgaXRlbSBiZWdpbm5pbmcgZnJvbSB0aGUgc3RhcnRfaXRlbS10aCBpdGVtIGFuZCBlbmRpbmcgYnkKKwkgICB0aGUgZW5kX2l0ZW0tdGggaXRlbS4gRG8gbm90IGNvdW50IGZpcnN0ICdzdGFydF9ieXRlcycgdW5pdHMgb2YKKwkgICAnc3RhcnRfaXRlbSctdGggaXRlbSBhbmQgbGFzdCAnZW5kX2J5dGVzJyBvZiAnZW5kX2l0ZW0nLXRoIGl0ZW0gKi8KIAotICAgIC8qIG5vdyB3ZSBrbm93IFMyYnl0ZXMsIGNhbGN1bGF0ZSBTMWJ5dGVzICovCi0gICAgaWYgKHNudW0wMTJbM10gPiAwKSB7Ci0JaW50IHNwbGl0X2l0ZW1fbnVtOwotCWludCBieXRlc190b19yLCBieXRlc190b19sOwotCWludCBieXRlc190b19TMm5ldzsKLSAgICAKLQlzcGxpdF9pdGVtX251bSA9IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdOwotCWJ5dGVzX3RvX2wgPSAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0gJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7Ci0JYnl0ZXNfdG9fciA9ICgoZW5kX2l0ZW0gPT0gc3BsaXRfaXRlbV9udW0gJiYgZW5kX2J5dGVzICE9IC0xKSA/IGVuZF9ieXRlcyA6IDApOwotCWJ5dGVzX3RvX1MybmV3ID0gKChzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9PSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXSAmJiBzbnVtMDEyWzRdICE9IC0xKSA/IHNudW0wMTJbNF0gOiAwKTsKKwlmb3IgKGkgPSBzdGFydF9pdGVtOyBpIDw9IGVuZF9pdGVtOyBpKyspIHsKKwkJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkgPSB2bi0+dm5fdmkgKyBpOworCQlpbnQgc2tpcF9mcm9tX2VuZCA9ICgoaSA9PSBlbmRfaXRlbSkgPyBlbmRfYnl0ZXMgOiAwKTsKIAotCS8vIHMxYnl0ZXMKLQlzbnVtMDEyWzNdID0gb3BfdW5pdF9udW0gKCZ2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dKSAtIHNudW0wMTJbM10gLSBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MybmV3OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmVlZGVkX25vZGVzOworCQlSRkFMU0UobmVlZGVkX25vZGVzID4gMywgInZzLTgxMDU6IHRvbyBtYW55IG5vZGVzIGFyZSBuZWVkZWQiKTsKKworCQkvKiBnZXQgc2l6ZSBvZiBjdXJyZW50IGl0ZW0gKi8KKwkJY3VycmVudF9pdGVtX3NpemUgPSB2aS0+dmlfaXRlbV9sZW47CisKKwkJLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gaGVhZCBwYXJ0IChmcm9tX2J5dGVzKSBvZiBmcm9tLXRoIGl0ZW0gKi8KKwkJY3VycmVudF9pdGVtX3NpemUgLT0KKwkJICAgIG9wX3BhcnRfc2l6ZSh2aSwgMCAvKmZyb20gc3RhcnQgKi8gLCBzdGFydF9ieXRlcyk7CisKKwkJLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gdGFpbCBwYXJ0IG9mIGxhc3QgaXRlbSAqLworCQljdXJyZW50X2l0ZW1fc2l6ZSAtPQorCQkgICAgb3BfcGFydF9zaXplKHZpLCAxIC8qZnJvbSBlbmQgKi8gLCBza2lwX2Zyb21fZW5kKTsKKworCQkvKiBpZiBpdGVtIGZpdHMgaW50byBjdXJyZW50IG5vZGUgZW50aWVybHkgKi8KKwkJaWYgKHRvdGFsX25vZGVfc2l6ZSArIGN1cnJlbnRfaXRlbV9zaXplIDw9IG1heF9ub2RlX3NpemUpIHsKKwkJCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0rKzsKKwkJCXRvdGFsX25vZGVfc2l6ZSArPSBjdXJyZW50X2l0ZW1fc2l6ZTsKKwkJCXN0YXJ0X2J5dGVzID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGN1cnJlbnRfaXRlbV9zaXplID4gbWF4X25vZGVfc2l6ZSkgeworCQkJLyogdmlydHVhbCBpdGVtIGxlbmd0aCBpcyBsb25nZXIsIHRoYW4gbWF4IHNpemUgb2YgaXRlbSBpbgorCQkJICAgYSBub2RlLiBJdCBpcyBpbXBvc3NpYmxlIGZvciBkaXJlY3QgaXRlbSAqLworCQkJUkZBTFNFKGlzX2RpcmVjdF9sZV9paCh2aS0+dmlfaWgpLAorCQkJICAgICAgICJ2cy04MTEwOiAiCisJCQkgICAgICAgImRpcmVjdCBpdGVtIGxlbmd0aCBpcyAlZC4gSXQgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAlZCIsCisJCQkgICAgICAgY3VycmVudF9pdGVtX3NpemUsIG1heF9ub2RlX3NpemUpOworCQkJLyogd2Ugd2lsbCB0cnkgdG8gc3BsaXQgaXQgKi8KKwkJCWZsb3cgPSAxOworCQl9CisKKwkJaWYgKCFmbG93KSB7CisJCQkvKiBhcyB3ZSBkbyBub3Qgc3BsaXQgaXRlbXMsIHRha2UgbmV3IG5vZGUgYW5kIGNvbnRpbnVlICovCisJCQluZWVkZWRfbm9kZXMrKzsKKwkJCWktLTsKKwkJCXRvdGFsX25vZGVfc2l6ZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGl0ZW0gdW5pdHMgd2hpY2ggZml0IGludG8gbm9kZSBiZWluZworCQkvLyBmaWxsZWQKKwkJeworCQkJaW50IGZyZWVfc3BhY2U7CisKKwkJCWZyZWVfc3BhY2UgPSBtYXhfbm9kZV9zaXplIC0gdG90YWxfbm9kZV9zaXplIC0gSUhfU0laRTsKKwkJCXVuaXRzID0KKwkJCSAgICBvcF9jaGVja19sZWZ0KHZpLCBmcmVlX3NwYWNlLCBzdGFydF9ieXRlcywKKwkJCQkJICBza2lwX2Zyb21fZW5kKTsKKwkJCWlmICh1bml0cyA9PSAtMSkgeworCQkJCS8qIG5vdGhpbmcgZml0cyBpbnRvIGN1cnJlbnQgbm9kZSwgdGFrZSBuZXcgbm9kZSBhbmQgY29udGludWUgKi8KKwkJCQluZWVkZWRfbm9kZXMrKywgaS0tLCB0b3RhbF9ub2RlX3NpemUgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogc29tZXRoaW5nIGZpdHMgaW50byB0aGUgY3VycmVudCBub2RlICovCisJCS8vaWYgKHNudW0wMTJbM10gIT0gLTEgfHwgbmVlZGVkX25vZGVzICE9IDEpCisJCS8vICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IHRvbyBtYW55IG5vZGVzIHJlcXVpcmVkIik7CisJCS8vc251bTAxMltuZWVkZWRfbm9kZXMgLSAxICsgM10gPSBvcF91bml0X251bSAodmkpIC0gc3RhcnRfYnl0ZXMgLSB1bml0czsKKwkJc3RhcnRfYnl0ZXMgKz0gdW5pdHM7CisJCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMSArIDNdID0gdW5pdHM7CisKKwkJaWYgKG5lZWRlZF9ub2RlcyA+IDIpCisJCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwgInZzLTgxMTE6IGdldF9udW1fdmVyOiAiCisJCQkJCSAic3BsaXRfaXRlbV9wb3NpdGlvbiBpcyBvdXQgb2YgYm91bmRhcnkiKTsKKwkJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSsrOworCQlzcGxpdF9pdGVtX3Bvc2l0aW9uc1tuZWVkZWRfbm9kZXMgLSAxXSA9IGk7CisJCW5lZWRlZF9ub2RlcysrOworCQkvKiBjb250aW51ZSBmcm9tIHRoZSBzYW1lIGl0ZW0gd2l0aCBzdGFydF9ieXRlcyAhPSAtMSAqLworCQlzdGFydF9pdGVtID0gaTsKKwkJaS0tOworCQl0b3RhbF9ub2RlX3NpemUgPSAwOworCX0KKworCS8vIHN1bTAxMls0XSAoaWYgaXQgaXMgbm90IC0xKSBjb250YWlucyBudW1iZXIgb2YgdW5pdHMgb2Ygd2hpY2gKKwkvLyBhcmUgdG8gYmUgaW4gUzFuZXcsIHNudW0wMTJbM10gLSB0byBiZSBpbiBTMC4gVGhleSBhcmUgc3VwcG9zZWQKKwkvLyB0byBiZSBTMWJ5dGVzIGFuZCBTMmJ5dGVzIGNvcnJlc3BvbmRpbmdseSwgc28gcmVjYWxjdWxhdGUKKwlpZiAoc251bTAxMls0XSA+IDApIHsKKwkJaW50IHNwbGl0X2l0ZW1fbnVtOworCQlpbnQgYnl0ZXNfdG9fciwgYnl0ZXNfdG9fbDsKKwkJaW50IGJ5dGVzX3RvX1MxbmV3OworCisJCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV07CisJCWJ5dGVzX3RvX2wgPQorCQkgICAgKChmcm9tID09IHNwbGl0X2l0ZW1fbnVtCisJCSAgICAgICYmIGZyb21fYnl0ZXMgIT0gLTEpID8gZnJvbV9ieXRlcyA6IDApOworCQlieXRlc190b19yID0KKwkJICAgICgoZW5kX2l0ZW0gPT0gc3BsaXRfaXRlbV9udW0KKwkJICAgICAgJiYgZW5kX2J5dGVzICE9IC0xKSA/IGVuZF9ieXRlcyA6IDApOworCQlieXRlc190b19TMW5ldyA9CisJCSAgICAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09CisJCSAgICAgIHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdKSA/IHNudW0wMTJbM10gOiAwKTsKKworCQkvLyBzMmJ5dGVzCisJCXNudW0wMTJbNF0gPQorCQkgICAgb3BfdW5pdF9udW0oJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMls0XSAtCisJCSAgICBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MxbmV3OworCisJCWlmICh2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dLnZpX2luZGV4ICE9IFRZUEVfRElSRU5UUlkgJiYKKwkJICAgIHZuLT52bl92aVtzcGxpdF9pdGVtX251bV0udmlfaW5kZXggIT0gVFlQRV9JTkRJUkVDVCkKKwkJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IG5vdCAiCisJCQkJCSAiZGlyZWN0b3J5IG9yIGluZGlyZWN0IGl0ZW0iKTsKKwl9CisKKwkvKiBub3cgd2Uga25vdyBTMmJ5dGVzLCBjYWxjdWxhdGUgUzFieXRlcyAqLworCWlmIChzbnVtMDEyWzNdID4gMCkgeworCQlpbnQgc3BsaXRfaXRlbV9udW07CisJCWludCBieXRlc190b19yLCBieXRlc190b19sOworCQlpbnQgYnl0ZXNfdG9fUzJuZXc7CisKKwkJc3BsaXRfaXRlbV9udW0gPSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXTsKKwkJYnl0ZXNfdG9fbCA9CisJCSAgICAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0KKwkJICAgICAgJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX3IgPQorCQkgICAgKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bQorCQkgICAgICAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX1MybmV3ID0KKwkJICAgICgoc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPT0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0KKwkJICAgICAgJiYgc251bTAxMls0XSAhPSAtMSkgPyBzbnVtMDEyWzRdIDogMCk7CisKKwkJLy8gczFieXRlcworCQlzbnVtMDEyWzNdID0KKwkJICAgIG9wX3VuaXRfbnVtKCZ2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dKSAtIHNudW0wMTJbM10gLQorCQkgICAgYnl0ZXNfdG9fciAtIGJ5dGVzX3RvX2wgLSBieXRlc190b19TMm5ldzsKKwl9CisKKwlyZXR1cm4gbmVlZGVkX25vZGVzOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiOworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsKICNlbmRpZgogCi0KIC8qIFNldCBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcuCiAgKiBQZXJmb3JtcyB3cml0ZSBvZiByZXN1bHRzIG9mIGFuYWx5c2lzIG9mIGJhbGFuY2luZyBpbnRvIHN0cnVjdHVyZSB0YiwKICAqIHdoZXJlIGl0IHdpbGwgbGF0ZXIgYmUgdXNlZCBieSB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gdGhlIGJhbGFuY2luZy4gCkBAIC01NTcsMTMyICs1ODcsMTMxIEBACiAgKglzMWJ5dGVzCW51bWJlciBvZiBieXRlcyB3aGljaCBmbG93IHRvIHRoZSBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAodGhpcyBudW1iZXIgaXMgY29udGFpbmVkIGluIHMwMTIgYXJyYXkpCiAgKi8KIAotc3RhdGljIHZvaWQgc2V0X3BhcmFtZXRlcnMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBsbnVtLAotCQkJICAgIGludCBybnVtLCBpbnQgYmxrX251bSwgc2hvcnQgKiBzMDEyLCBpbnQgbGIsIGludCByYikKK3N0YXRpYyB2b2lkIHNldF9wYXJhbWV0ZXJzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgaW50IGxudW0sCisJCQkgICBpbnQgcm51bSwgaW50IGJsa19udW0sIHNob3J0ICpzMDEyLCBpbnQgbGIsIGludCByYikKIHsKIAotICB0Yi0+bG51bVtoXSA9IGxudW07Ci0gIHRiLT5ybnVtW2hdID0gcm51bTsKLSAgdGItPmJsa251bVtoXSA9IGJsa19udW07CisJdGItPmxudW1baF0gPSBsbnVtOworCXRiLT5ybnVtW2hdID0gcm51bTsKKwl0Yi0+YmxrbnVtW2hdID0gYmxrX251bTsKIAotICBpZiAoaCA9PSAwKQotICAgIHsgIC8qIG9ubHkgZm9yIGxlYWYgbGV2ZWwgKi8KLSAgICAgIGlmIChzMDEyICE9IE5VTEwpCi0JewotCSAgdGItPnMwbnVtID0gKiBzMDEyICsrLAotCSAgdGItPnMxbnVtID0gKiBzMDEyICsrLAotCSAgdGItPnMybnVtID0gKiBzMDEyICsrOwotCSAgdGItPnMxYnl0ZXMgPSAqIHMwMTIgKys7Ci0JICB0Yi0+czJieXRlcyA9ICogczAxMjsKKwlpZiAoaCA9PSAwKSB7CQkvKiBvbmx5IGZvciBsZWFmIGxldmVsICovCisJCWlmIChzMDEyICE9IE5VTEwpIHsKKwkJCXRiLT5zMG51bSA9ICpzMDEyKyssCisJCQkgICAgdGItPnMxbnVtID0gKnMwMTIrKywgdGItPnMybnVtID0gKnMwMTIrKzsKKwkJCXRiLT5zMWJ5dGVzID0gKnMwMTIrKzsKKwkJCXRiLT5zMmJ5dGVzID0gKnMwMTI7CisJCX0KKwkJdGItPmxieXRlcyA9IGxiOworCQl0Yi0+cmJ5dGVzID0gcmI7CiAJfQotICAgICAgdGItPmxieXRlcyA9IGxiOwotICAgICAgdGItPnJieXRlcyA9IHJiOwotICAgIH0KLSAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIGxudW1bIGggXSwgbG51bSApOwotICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgcm51bVsgaCBdLCBybnVtICk7CisJUFJPQ19JTkZPX0FERCh0Yi0+dGJfc2IsIGxudW1baF0sIGxudW0pOworCVBST0NfSU5GT19BREQodGItPnRiX3NiLCBybnVtW2hdLCBybnVtKTsKIAotICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgbGJ5dGVzWyBoIF0sIGxiICk7Ci0gIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCByYnl0ZXNbIGggXSwgcmIgKTsKKwlQUk9DX0lORk9fQUREKHRiLT50Yl9zYiwgbGJ5dGVzW2hdLCBsYik7CisJUFJPQ19JTkZPX0FERCh0Yi0+dGJfc2IsIHJieXRlc1toXSwgcmIpOwogfQogCi0KLQogLyogY2hlY2ssIGRvZXMgbm9kZSBkaXNhcHBlYXIgaWYgd2Ugc2hpZnQgdGItPmxudW1bMF0gaXRlbXMgdG8gbGVmdAogICAgbmVpZ2hib3IgYW5kIHRiLT5ybnVtWzBdIHRvIHRoZSByaWdodCBvbmUuICovCi1zdGF0aWMgaW50IGlzX2xlYWZfcmVtb3ZhYmxlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgaW50IGlzX2xlYWZfcmVtb3ZhYmxlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gIGludCB0b19sZWZ0LCB0b19yaWdodDsKLSAgaW50IHNpemU7Ci0gIGludCByZW1haW5faXRlbXM7CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4gPSB0Yi0+dGJfdm47CisJaW50IHRvX2xlZnQsIHRvX3JpZ2h0OworCWludCBzaXplOworCWludCByZW1haW5faXRlbXM7CiAKLSAgLyogbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IHdpbGwgYmUgc2hpZnRlZCB0byBsZWZ0IChyaWdodCkgbmVpZ2hib3IKLSAgICAgZW50aXJlbHkgKi8KLSAgdG9fbGVmdCA9IHRiLT5sbnVtWzBdIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKTsKLSAgdG9fcmlnaHQgPSB0Yi0+cm51bVswXSAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCk7Ci0gIHJlbWFpbl9pdGVtcyA9IHZuLT52bl9ucl9pdGVtOworCS8qIG51bWJlciBvZiBpdGVtcywgdGhhdCB3aWxsIGJlIHNoaWZ0ZWQgdG8gbGVmdCAocmlnaHQpIG5laWdoYm9yCisJICAgZW50aXJlbHkgKi8KKwl0b19sZWZ0ID0gdGItPmxudW1bMF0gLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApOworCXRvX3JpZ2h0ID0gdGItPnJudW1bMF0gLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApOworCXJlbWFpbl9pdGVtcyA9IHZuLT52bl9ucl9pdGVtOwogCi0gIC8qIGhvdyBtYW55IGl0ZW1zIHJlbWFpbiBpbiBTWzBdIGFmdGVyIHNoaWZ0aW5ncyB0byBuZWlnaGJvcnMgKi8KLSAgcmVtYWluX2l0ZW1zIC09ICh0b19sZWZ0ICsgdG9fcmlnaHQpOworCS8qIGhvdyBtYW55IGl0ZW1zIHJlbWFpbiBpbiBTWzBdIGFmdGVyIHNoaWZ0aW5ncyB0byBuZWlnaGJvcnMgKi8KKwlyZW1haW5faXRlbXMgLT0gKHRvX2xlZnQgKyB0b19yaWdodCk7CiAKLSAgaWYgKHJlbWFpbl9pdGVtcyA8IDEpIHsKLSAgICAvKiBhbGwgY29udGVudCBvZiBub2RlIGNhbiBiZSBzaGlmdGVkIHRvIG5laWdoYm9ycyAqLwotICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgdG9fbGVmdCwgdm4tPnZuX25yX2l0ZW0gLSB0b19sZWZ0LCAwLCBOVUxMLCAtMSwgLTEpOyAgICAKLSAgICByZXR1cm4gMTsKLSAgfQotICAKLSAgaWYgKHJlbWFpbl9pdGVtcyA+IDEgfHwgdGItPmxieXRlcyA9PSAtMSB8fCB0Yi0+cmJ5dGVzID09IC0xKQotICAgIC8qIFNbMF0gaXMgbm90IHJlbW92YWJsZSAqLwotICAgIHJldHVybiAwOworCWlmIChyZW1haW5faXRlbXMgPCAxKSB7CisJCS8qIGFsbCBjb250ZW50IG9mIG5vZGUgY2FuIGJlIHNoaWZ0ZWQgdG8gbmVpZ2hib3JzICovCisJCXNldF9wYXJhbWV0ZXJzKHRiLCAwLCB0b19sZWZ0LCB2bi0+dm5fbnJfaXRlbSAtIHRvX2xlZnQsIDAsCisJCQkgICAgICAgTlVMTCwgLTEsIC0xKTsKKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGNoZWNrLCB3aGV0aGVyIHdlIGNhbiBkaXZpZGUgMSByZW1haW5pbmcgaXRlbSBiZXR3ZWVuIG5laWdoYm9ycyAqLworCWlmIChyZW1haW5faXRlbXMgPiAxIHx8IHRiLT5sYnl0ZXMgPT0gLTEgfHwgdGItPnJieXRlcyA9PSAtMSkKKwkJLyogU1swXSBpcyBub3QgcmVtb3ZhYmxlICovCisJCXJldHVybiAwOwogCi0gIC8qIGdldCBzaXplIG9mIHJlbWFpbmluZyBpdGVtIChpbiBpdGVtIHVuaXRzKSAqLwotICBzaXplID0gb3BfdW5pdF9udW0gKCYodm4tPnZuX3ZpW3RvX2xlZnRdKSk7CisJLyogY2hlY2ssIHdoZXRoZXIgd2UgY2FuIGRpdmlkZSAxIHJlbWFpbmluZyBpdGVtIGJldHdlZW4gbmVpZ2hib3JzICovCiAKLSAgaWYgKHRiLT5sYnl0ZXMgKyB0Yi0+cmJ5dGVzID49IHNpemUpIHsKLSAgICBzZXRfcGFyYW1ldGVycyAodGIsIDAsIHRvX2xlZnQgKyAxLCB0b19yaWdodCArIDEsIDAsIE5VTEwsIHRiLT5sYnl0ZXMsIC0xKTsKLSAgICByZXR1cm4gMTsKLSAgfQorCS8qIGdldCBzaXplIG9mIHJlbWFpbmluZyBpdGVtIChpbiBpdGVtIHVuaXRzKSAqLworCXNpemUgPSBvcF91bml0X251bSgmKHZuLT52bl92aVt0b19sZWZ0XSkpOwogCi0gIHJldHVybiAwOworCWlmICh0Yi0+bGJ5dGVzICsgdGItPnJieXRlcyA+PSBzaXplKSB7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCAwLCB0b19sZWZ0ICsgMSwgdG9fcmlnaHQgKyAxLCAwLCBOVUxMLAorCQkJICAgICAgIHRiLT5sYnl0ZXMsIC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKLQogLyogY2hlY2sgd2hldGhlciBMLCBTLCBSIGNhbiBiZSBqb2luZWQgaW4gb25lIG5vZGUgKi8KLXN0YXRpYyBpbnQgYXJlX2xlYXZlc19yZW1vdmFibGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGxmcmVlLCBpbnQgcmZyZWUpCitzdGF0aWMgaW50IGFyZV9sZWF2ZXNfcmVtb3ZhYmxlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgbGZyZWUsIGludCByZnJlZSkKIHsKLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOwotICBpbnQgaWhfc2l6ZTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpTMDsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlpbnQgaWhfc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwOwogCi0gIFMwID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCAwKTsKKwlTMCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKTsKIAotICBpaF9zaXplID0gMDsKLSAgaWYgKHZuLT52bl9ucl9pdGVtKSB7Ci0gICAgaWYgKHZuLT52bl92aVswXS52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKLSAgICAgIGloX3NpemUgKz0gSUhfU0laRTsKLSAgICAKLQlpZiAodm4tPnZuX3ZpW3ZuLT52bl9ucl9pdGVtLTFdLnZpX3R5cGUgJiBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRSkKLQkgICAgaWhfc2l6ZSArPSBJSF9TSVpFOwotICAgIH0gZWxzZSB7Ci0JLyogdGhlcmUgd2FzIG9ubHkgb25lIGl0ZW0gYW5kIGl0IHdpbGwgYmUgZGVsZXRlZCAqLwotCXN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICAKLSAgICBSRkFMU0UoIEJfTlJfSVRFTVMgKFMwKSAhPSAxLAotCSAgICAidnMtODEyNTogaXRlbSBudW1iZXIgbXVzdCBiZSAxOiBpdCBpcyAlZCIsIEJfTlJfSVRFTVMoUzApKTsKKwlpaF9zaXplID0gMDsKKwlpZiAodm4tPnZuX25yX2l0ZW0pIHsKKwkJaWYgKHZuLT52bl92aVswXS52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKKwkJCWloX3NpemUgKz0gSUhfU0laRTsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFMwLCAwKTsKLSAgICBpZiAodGItPkNGUlswXSAmJiAhY29tcF9zaG9ydF9sZV9rZXlzICgmKGloLT5paF9rZXkpLCBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pKSkKLQlpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloKSkgewotCSAgICAvKiBEaXJlY3RvcnkgbXVzdCBiZSBpbiBjb3JyZWN0IHN0YXRlIGhlcmU6IHRoYXQgaXMKLQkgICAgICAgc29tZXdoZXJlIGF0IHRoZSBsZWZ0IHNpZGUgc2hvdWxkIGV4aXN0IGZpcnN0IGRpcmVjdG9yeQotCSAgICAgICBpdGVtLiBCdXQgdGhlIGl0ZW0gYmVpbmcgZGVsZXRlZCBjYW4gbm90IGJlIHRoYXQgZmlyc3QKLQkgICAgICAgb25lIGJlY2F1c2UgaXRzIHJpZ2h0IG5laWdoYm9yIGlzIGl0ZW0gb2YgdGhlIHNhbWUKLQkgICAgICAgZGlyZWN0b3J5LiAoQnV0IGZpcnN0IGl0ZW0gYWx3YXlzIGdldHMgZGVsZXRlZCBpbiBsYXN0Ci0JICAgICAgIHR1cm4pLiBTbywgbmVpZ2hib3JzIG9mIGRlbGV0ZWQgaXRlbSBjYW4gYmUgbWVyZ2VkLCBzbwotCSAgICAgICB3ZSBjYW4gc2F2ZSBpaF9zaXplICovCi0JICAgIGloX3NpemUgPSBJSF9TSVpFOwotCSAgICAKLQkgICAgLyogd2UgbWlnaHQgY2hlY2sgdGhhdCBsZWZ0IG5laWdoYm9yIGV4aXN0cyBhbmQgaXMgb2YgdGhlCi0JICAgICAgIHNhbWUgZGlyZWN0b3J5ICovCi0JICAgIFJGQUxTRShsZV9paF9rX29mZnNldCAoaWgpID09IERPVF9PRkZTRVQsCi0JCSJ2cy04MTMwOiBmaXJzdCBkaXJlY3RvcnkgaXRlbSBjYW4gbm90IGJlIHJlbW92ZWQgdW50aWwgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eSIpOwotICAgICAgfQotICAgIAotICB9CisJCWlmICh2bi0+dm5fdmlbdm4tPnZuX25yX2l0ZW0gLSAxXS4KKwkJICAgIHZpX3R5cGUgJiBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRSkKKwkJCWloX3NpemUgKz0gSUhfU0laRTsKKwl9IGVsc2UgeworCQkvKiB0aGVyZSB3YXMgb25seSBvbmUgaXRlbSBhbmQgaXQgd2lsbCBiZSBkZWxldGVkICovCisJCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gIGlmIChNQVhfQ0hJTERfU0laRSAoUzApICsgdm4tPnZuX3NpemUgPD0gcmZyZWUgKyBsZnJlZSArIGloX3NpemUpIHsKLSAgICBzZXRfcGFyYW1ldGVycyAodGIsIDAsIC0xLCAtMSwgLTEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgUFJPQ19JTkZPX0lOQyggdGIgLT4gdGJfc2IsIGxlYXZlc19yZW1vdmFibGUgKTsKLSAgICByZXR1cm4gMTsgIAotICB9Ci0gIHJldHVybiAwOwotICAKKwkJUkZBTFNFKEJfTlJfSVRFTVMoUzApICE9IDEsCisJCSAgICAgICAidnMtODEyNTogaXRlbSBudW1iZXIgbXVzdCBiZSAxOiBpdCBpcyAlZCIsCisJCSAgICAgICBCX05SX0lURU1TKFMwKSk7CisKKwkJaWggPSBCX05fUElURU1fSEVBRChTMCwgMCk7CisJCWlmICh0Yi0+Q0ZSWzBdCisJCSAgICAmJiAhY29tcF9zaG9ydF9sZV9rZXlzKCYoaWgtPmloX2tleSksCisJCQkJCSAgIEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sCisJCQkJCQkJICB0Yi0+cmtleVswXSkpKQorCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkgeworCQkJCS8qIERpcmVjdG9yeSBtdXN0IGJlIGluIGNvcnJlY3Qgc3RhdGUgaGVyZTogdGhhdCBpcworCQkJCSAgIHNvbWV3aGVyZSBhdCB0aGUgbGVmdCBzaWRlIHNob3VsZCBleGlzdCBmaXJzdCBkaXJlY3RvcnkKKwkJCQkgICBpdGVtLiBCdXQgdGhlIGl0ZW0gYmVpbmcgZGVsZXRlZCBjYW4gbm90IGJlIHRoYXQgZmlyc3QKKwkJCQkgICBvbmUgYmVjYXVzZSBpdHMgcmlnaHQgbmVpZ2hib3IgaXMgaXRlbSBvZiB0aGUgc2FtZQorCQkJCSAgIGRpcmVjdG9yeS4gKEJ1dCBmaXJzdCBpdGVtIGFsd2F5cyBnZXRzIGRlbGV0ZWQgaW4gbGFzdAorCQkJCSAgIHR1cm4pLiBTbywgbmVpZ2hib3JzIG9mIGRlbGV0ZWQgaXRlbSBjYW4gYmUgbWVyZ2VkLCBzbworCQkJCSAgIHdlIGNhbiBzYXZlIGloX3NpemUgKi8KKwkJCQlpaF9zaXplID0gSUhfU0laRTsKKworCQkJCS8qIHdlIG1pZ2h0IGNoZWNrIHRoYXQgbGVmdCBuZWlnaGJvciBleGlzdHMgYW5kIGlzIG9mIHRoZQorCQkJCSAgIHNhbWUgZGlyZWN0b3J5ICovCisJCQkJUkZBTFNFKGxlX2loX2tfb2Zmc2V0KGloKSA9PSBET1RfT0ZGU0VULAorCQkJCSAgICAgICAidnMtODEzMDogZmlyc3QgZGlyZWN0b3J5IGl0ZW0gY2FuIG5vdCBiZSByZW1vdmVkIHVudGlsIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkiKTsKKwkJCX0KKworCX0KKworCWlmIChNQVhfQ0hJTERfU0laRShTMCkgKyB2bi0+dm5fc2l6ZSA8PSByZnJlZSArIGxmcmVlICsgaWhfc2l6ZSkgeworCQlzZXRfcGFyYW1ldGVycyh0YiwgMCwgLTEsIC0xLCAtMSwgTlVMTCwgLTEsIC0xKTsKKwkJUFJPQ19JTkZPX0lOQyh0Yi0+dGJfc2IsIGxlYXZlc19yZW1vdmFibGUpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisKIH0KIAotCi0KIC8qIHdoZW4gd2UgZG8gbm90IHNwbGl0IGl0ZW0sIGxudW0gYW5kIHJudW0gYXJlIG51bWJlcnMgb2YgZW50aXJlIGl0ZW1zICovCiAjZGVmaW5lIFNFVF9QQVJfU0hJRlRfTEVGVCBcCiBpZiAoaClcCkBAIC03MDQsNyArNzMzLDYgQEAKIAkJICAgICAtMSwgLTEpO1wKIH0KIAotCiAjZGVmaW5lIFNFVF9QQVJfU0hJRlRfUklHSFQgXAogaWYgKGgpXAoge1wKQEAgLTcyNCwyMTQgKzc1MiwxOTkgQEAKIAkJICAtMSwgLTEpO1wKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9idWZmZXJzX2luX3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YikKK3sKKwlpbnQgbl9jb3VudGVyOwogCi1zdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnNfaW5fdGIgKAotCQkgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YgotCQkgICAgICAgKSB7Ci0gIGludCBuX2NvdW50ZXI7CisJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3RiLT50Yl9wYXRoKTsKIAotICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3NfdGItPnRiX3BhdGgpOwotICAKLSAgZm9yICggbl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgTUFYX0hFSUdIVDsgbl9jb3VudGVyKysgKSB7Ci0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5MW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25fY291bnRlcl0pOwotICAgIHBfc190Yi0+UltuX2NvdW50ZXJdID0gTlVMTDsKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5GTFtuX2NvdW50ZXJdID0gTlVMTDsKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5GUltuX2NvdW50ZXJdID0gTlVMTDsKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25fY291bnRlcl0pOwotICAgIHBfc190Yi0+Q0ZMW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5DRlJbbl9jb3VudGVyXSA9IE5VTEw7Ci0gIH0KKwlmb3IgKG5fY291bnRlciA9IDA7IG5fY291bnRlciA8IE1BWF9IRUlHSFQ7IG5fY291bnRlcisrKSB7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5MW25fY291bnRlcl0pOworCQlwX3NfdGItPkxbbl9jb3VudGVyXSA9IE5VTEw7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25fY291bnRlcl0pOworCQlwX3NfdGItPlJbbl9jb3VudGVyXSA9IE5VTEw7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2NvdW50ZXJdKTsKKwkJcF9zX3RiLT5GTFtuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25fY291bnRlcl0pOworCQlwX3NfdGItPkZSW25fY291bnRlcl0gPSBOVUxMOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25fY291bnRlcl0pOworCQlwX3NfdGItPkNGTFtuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2NvdW50ZXJdKTsKKwkJcF9zX3RiLT5DRlJbbl9jb3VudGVyXSA9IE5VTEw7CisJfQogfQogCi0KIC8qIEdldCBuZXcgYnVmZmVycyBmb3Igc3RvcmluZyBuZXcgbm9kZXMgdGhhdCBhcmUgY3JlYXRlZCB3aGlsZSBiYWxhbmNpbmcuCiAgKiBSZXR1cm5zOglTQ0hFRFVMRV9PQ0NVUlJFRCAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CiAgKgkgICAgICAgIENBUlJZX09OIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CiAgKgkgICAgICAgIE5PX0RJU0tfU1BBQ0UgLSBubyBkaXNrIHNwYWNlLgogICovCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1zdGF0aWMgaW50ICBnZXRfZW1wdHlfbm9kZXMoCi0gICAgICAgICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0gICAgICAgICAgICAgIGludCBuX2gKLSAgICAgICAgICAgICkgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX25ld19iaCwKLSAgICAJCSAgICAgICoJcF9zX1NoID0gUEFUSF9IX1BCVUZGRVIgKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKLSAgYl9ibG9ja25yX3QJICAgICAgKglwX25fYmxvY2tuciwKLSAgICAJCQlhX25fYmxvY2tucnNbTUFYX0FNT1VOVF9ORUVERURdID0gezAsIH07Ci0gIGludCAgICAgICAJCW5fY291bnRlciwKLSAgIAkJCW5fbnVtYmVyX29mX2ZyZWVibGssCi0gICAgICAgICAgICAgICAgCW5fYW1vdW50X25lZWRlZCwvKiBudW1iZXIgb2YgbmVlZGVkIGVtcHR5IGJsb2NrcyAqLwotCQkJbl9yZXR2YWwgPSBDQVJSWV9PTjsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICoJcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKK3N0YXRpYyBpbnQgZ2V0X2VtcHR5X25vZGVzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19uZXdfYmgsCisJICAgICpwX3NfU2ggPSBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCk7CisJYl9ibG9ja25yX3QgKnBfbl9ibG9ja25yLCBhX25fYmxvY2tucnNbTUFYX0FNT1VOVF9ORUVERURdID0geyAwLCB9OworCWludCBuX2NvdW50ZXIsIG5fbnVtYmVyX29mX2ZyZWVibGssIG5fYW1vdW50X25lZWRlZCwJLyogbnVtYmVyIG9mIG5lZWRlZCBlbXB0eSBibG9ja3MgKi8KKwkgbl9yZXR2YWwgPSBDQVJSWV9PTjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc190Yi0+dGJfc2I7CiAKKwkvKiBudW1iZXJfb2ZfZnJlZWJsayBpcyB0aGUgbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyB3aGljaCBoYXZlIGJlZW4KKwkgICBhY3F1aXJlZCBmb3IgdXNlIGJ5IHRoZSBiYWxhbmNpbmcgYWxnb3JpdGhtIG1pbnVzIHRoZSBudW1iZXIgb2YKKwkgICBlbXB0eSBibG9ja3MgdXNlZCBpbiB0aGUgcHJldmlvdXMgbGV2ZWxzIG9mIHRoZSBhbmFseXNpcywKKwkgICBudW1iZXJfb2ZfZnJlZWJsayA9IHRiLT5jdXJfYmxrbnVtIGNhbiBiZSBub24temVybyBpZiBhIHNjaGVkdWxlIG9jY3VycworCSAgIGFmdGVyIGVtcHR5IGJsb2NrcyBhcmUgYWNxdWlyZWQsIGFuZCB0aGUgYmFsYW5jaW5nIGFuYWx5c2lzIGlzCisJICAgdGhlbiByZXN0YXJ0ZWQsIGFtb3VudF9uZWVkZWQgaXMgdGhlIG51bWJlciBuZWVkZWQgYnkgdGhpcyBsZXZlbAorCSAgIChuX2gpIG9mIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMuCiAKLSAgLyogbnVtYmVyX29mX2ZyZWVibGsgaXMgdGhlIG51bWJlciBvZiBlbXB0eSBibG9ja3Mgd2hpY2ggaGF2ZSBiZWVuCi0gICAgIGFjcXVpcmVkIGZvciB1c2UgYnkgdGhlIGJhbGFuY2luZyBhbGdvcml0aG0gbWludXMgdGhlIG51bWJlciBvZgotICAgICBlbXB0eSBibG9ja3MgdXNlZCBpbiB0aGUgcHJldmlvdXMgbGV2ZWxzIG9mIHRoZSBhbmFseXNpcywKLSAgICAgbnVtYmVyX29mX2ZyZWVibGsgPSB0Yi0+Y3VyX2Jsa251bSBjYW4gYmUgbm9uLXplcm8gaWYgYSBzY2hlZHVsZSBvY2N1cnMKLSAgICAgYWZ0ZXIgZW1wdHkgYmxvY2tzIGFyZSBhY3F1aXJlZCwgYW5kIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMgaXMKLSAgICAgdGhlbiByZXN0YXJ0ZWQsIGFtb3VudF9uZWVkZWQgaXMgdGhlIG51bWJlciBuZWVkZWQgYnkgdGhpcyBsZXZlbAotICAgICAobl9oKSBvZiB0aGUgYmFsYW5jaW5nIGFuYWx5c2lzLgotCQkJICAgIAotICAgICBOb3RlIHRoYXQgZm9yIHN5c3RlbXMgd2l0aCBtYW55IHByb2Nlc3NlcyB3cml0aW5nLCBpdCB3b3VsZCBiZQotICAgICBtb3JlIGxheW91dCBvcHRpbWFsIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG5lZWRlZCBieSBhbGwKLSAgICAgbGV2ZWxzIGFuZCB0aGVuIHRvIHJ1biByZWlzZXJmc19uZXdfYmxvY2tzIHRvIGdldCBhbGwgb2YgdGhlbSBhdCBvbmNlLiAgKi8KKwkgICBOb3RlIHRoYXQgZm9yIHN5c3RlbXMgd2l0aCBtYW55IHByb2Nlc3NlcyB3cml0aW5nLCBpdCB3b3VsZCBiZQorCSAgIG1vcmUgbGF5b3V0IG9wdGltYWwgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgbmVlZGVkIGJ5IGFsbAorCSAgIGxldmVscyBhbmQgdGhlbiB0byBydW4gcmVpc2VyZnNfbmV3X2Jsb2NrcyB0byBnZXQgYWxsIG9mIHRoZW0gYXQgb25jZS4gICovCiAKLSAgLyogSW5pdGlhdGUgbnVtYmVyX29mX2ZyZWVibGsgdG8gdGhlIGFtb3VudCBhY3F1aXJlZCBwcmlvciB0byB0aGUgcmVzdGFydCBvZgotICAgICB0aGUgYW5hbHlzaXMgb3IgMCBpZiBub3QgcmVzdGFydGVkLCB0aGVuIHN1YnRyYWN0IHRoZSBhbW91bnQgbmVlZGVkCi0gICAgIGJ5IGFsbCBvZiB0aGUgbGV2ZWxzIG9mIHRoZSB0cmVlIGJlbG93IG5faC4gKi8KLSAgLyogYmxrbnVtIGluY2x1ZGVzIFNbbl9oXSwgc28gd2Ugc3VidHJhY3QgMSBpbiB0aGlzIGNhbGN1bGF0aW9uICovCi0gIGZvciAoIG5fY291bnRlciA9IDAsIG5fbnVtYmVyX29mX2ZyZWVibGsgPSBwX3NfdGItPmN1cl9ibGtudW07IG5fY291bnRlciA8IG5faDsgbl9jb3VudGVyKysgKQotICAgIG5fbnVtYmVyX29mX2ZyZWVibGsgLT0gKCBwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdICkgPyAocF9zX3RiLT5ibGtudW1bbl9jb3VudGVyXSAtIDEpIDogMDsKKwkvKiBJbml0aWF0ZSBudW1iZXJfb2ZfZnJlZWJsayB0byB0aGUgYW1vdW50IGFjcXVpcmVkIHByaW9yIHRvIHRoZSByZXN0YXJ0IG9mCisJICAgdGhlIGFuYWx5c2lzIG9yIDAgaWYgbm90IHJlc3RhcnRlZCwgdGhlbiBzdWJ0cmFjdCB0aGUgYW1vdW50IG5lZWRlZAorCSAgIGJ5IGFsbCBvZiB0aGUgbGV2ZWxzIG9mIHRoZSB0cmVlIGJlbG93IG5faC4gKi8KKwkvKiBibGtudW0gaW5jbHVkZXMgU1tuX2hdLCBzbyB3ZSBzdWJ0cmFjdCAxIGluIHRoaXMgY2FsY3VsYXRpb24gKi8KKwlmb3IgKG5fY291bnRlciA9IDAsIG5fbnVtYmVyX29mX2ZyZWVibGsgPSBwX3NfdGItPmN1cl9ibGtudW07CisJICAgICBuX2NvdW50ZXIgPCBuX2g7IG5fY291bnRlcisrKQorCQluX251bWJlcl9vZl9mcmVlYmxrIC09CisJCSAgICAocF9zX3RiLT5ibGtudW1bbl9jb3VudGVyXSkgPyAocF9zX3RiLT5ibGtudW1bbl9jb3VudGVyXSAtCisJCQkJCQkgICAxKSA6IDA7CiAKLSAgLyogQWxsb2NhdGUgbWlzc2luZyBlbXB0eSBibG9ja3MuICovCi0gIC8qIGlmIHBfc19TaCA9PSAwICB0aGVuIHdlIGFyZSBnZXR0aW5nIGEgbmV3IHJvb3QgKi8KLSAgbl9hbW91bnRfbmVlZGVkID0gKCBwX3NfU2ggKSA/IChwX3NfdGItPmJsa251bVtuX2hdIC0gMSkgOiAxOwotICAvKiAgQW1vdW50X25lZWRlZCA9IHRoZSBhbW91bnQgdGhhdCB3ZSBuZWVkIG1vcmUgdGhhbiB0aGUgYW1vdW50IHRoYXQgd2UgaGF2ZS4gKi8KLSAgaWYgKCBuX2Ftb3VudF9uZWVkZWQgPiBuX251bWJlcl9vZl9mcmVlYmxrICkKLSAgICBuX2Ftb3VudF9uZWVkZWQgLT0gbl9udW1iZXJfb2ZfZnJlZWJsazsKLSAgZWxzZSAvKiBJZiB3ZSBoYXZlIGVub3VnaCBhbHJlYWR5IHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KLSAgICByZXR1cm4gQ0FSUllfT047CisJLyogQWxsb2NhdGUgbWlzc2luZyBlbXB0eSBibG9ja3MuICovCisJLyogaWYgcF9zX1NoID09IDAgIHRoZW4gd2UgYXJlIGdldHRpbmcgYSBuZXcgcm9vdCAqLworCW5fYW1vdW50X25lZWRlZCA9IChwX3NfU2gpID8gKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSA6IDE7CisJLyogIEFtb3VudF9uZWVkZWQgPSB0aGUgYW1vdW50IHRoYXQgd2UgbmVlZCBtb3JlIHRoYW4gdGhlIGFtb3VudCB0aGF0IHdlIGhhdmUuICovCisJaWYgKG5fYW1vdW50X25lZWRlZCA+IG5fbnVtYmVyX29mX2ZyZWVibGspCisJCW5fYW1vdW50X25lZWRlZCAtPSBuX251bWJlcl9vZl9mcmVlYmxrOworCWVsc2UJCQkvKiBJZiB3ZSBoYXZlIGVub3VnaCBhbHJlYWR5IHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KKwkJcmV0dXJuIENBUlJZX09OOwogCi0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgcXVvdGEgLSBpcyBub3QgYWxsb2NhdGVkIGZvciBibG9ja3MgdXNlZCBmb3IgZm9ybWF0dGVkIG5vZGVzICovCi0gIGlmIChyZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyAocF9zX3RiLCBhX25fYmxvY2tucnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYW1vdW50X25lZWRlZCkgPT0gTk9fRElTS19TUEFDRSkKLSAgICByZXR1cm4gTk9fRElTS19TUEFDRTsKKwkvKiBObyBuZWVkIHRvIGNoZWNrIHF1b3RhIC0gaXMgbm90IGFsbG9jYXRlZCBmb3IgYmxvY2tzIHVzZWQgZm9yIGZvcm1hdHRlZCBub2RlcyAqLworCWlmIChyZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyhwX3NfdGIsIGFfbl9ibG9ja25ycywKKwkJCQkgICAgICAgbl9hbW91bnRfbmVlZGVkKSA9PSBOT19ESVNLX1NQQUNFKQorCQlyZXR1cm4gTk9fRElTS19TUEFDRTsKIAotICAvKiBmb3IgZWFjaCBibG9ja251bWJlciB3ZSBqdXN0IGdvdCwgZ2V0IGEgYnVmZmVyIGFuZCBzdGljayBpdCBvbiBGRUIgKi8KLSAgZm9yICggcF9uX2Jsb2NrbnIgPSBhX25fYmxvY2tucnMsIG5fY291bnRlciA9IDA7IG5fY291bnRlciA8IG5fYW1vdW50X25lZWRlZDsKLQlwX25fYmxvY2tucisrLCBuX2NvdW50ZXIrKyApIHsgCisJLyogZm9yIGVhY2ggYmxvY2tudW1iZXIgd2UganVzdCBnb3QsIGdldCBhIGJ1ZmZlciBhbmQgc3RpY2sgaXQgb24gRkVCICovCisJZm9yIChwX25fYmxvY2tuciA9IGFfbl9ibG9ja25ycywgbl9jb3VudGVyID0gMDsKKwkgICAgIG5fY291bnRlciA8IG5fYW1vdW50X25lZWRlZDsgcF9uX2Jsb2NrbnIrKywgbl9jb3VudGVyKyspIHsKIAotICAgIFJGQUxTRSggISAqcF9uX2Jsb2NrbnIsCi0JICAgICJQQVAtODEzNTogcmVpc2VyZnNfbmV3X2Jsb2NrbnJzIGZhaWxlZCB3aGVuIGdvdCBuZXcgYmxvY2tzIik7CisJCVJGQUxTRSghKnBfbl9ibG9ja25yLAorCQkgICAgICAgIlBBUC04MTM1OiByZWlzZXJmc19uZXdfYmxvY2tucnMgZmFpbGVkIHdoZW4gZ290IG5ldyBibG9ja3MiKTsKIAotICAgIHBfc19uZXdfYmggPSBzYl9nZXRibGsocF9zX3NiLCAqcF9uX2Jsb2NrbnIpOwotICAgIFJGQUxTRSAoYnVmZmVyX2RpcnR5IChwX3NfbmV3X2JoKSB8fAotCSAgICBidWZmZXJfam91cm5hbGVkIChwX3NfbmV3X2JoKSB8fAotCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eSAocF9zX25ld19iaCksCi0JICAgICJQQVAtODE0MDogam91cm5sYWxlZCBvciBkaXJ0eSBidWZmZXIgJWIgZm9yIHRoZSBuZXcgYmxvY2siLCAKLQkgICAgcF9zX25ld19iaCk7Ci0gICAgCi0gICAgLyogUHV0IGVtcHR5IGJ1ZmZlcnMgaW50byB0aGUgYXJyYXkuICovCi0gICAgUkZBTFNFIChwX3NfdGItPkZFQltwX3NfdGItPmN1cl9ibGtudW1dLAotCSAgICAiUEFQLTgxNDE6IGJ1c3kgc2xvdCBmb3IgbmV3IGJ1ZmZlciIpOworCQlwX3NfbmV3X2JoID0gc2JfZ2V0YmxrKHBfc19zYiwgKnBfbl9ibG9ja25yKTsKKwkJUkZBTFNFKGJ1ZmZlcl9kaXJ0eShwX3NfbmV3X2JoKSB8fAorCQkgICAgICAgYnVmZmVyX2pvdXJuYWxlZChwX3NfbmV3X2JoKSB8fAorCQkgICAgICAgYnVmZmVyX2pvdXJuYWxfZGlydHkocF9zX25ld19iaCksCisJCSAgICAgICAiUEFQLTgxNDA6IGpvdXJubGFsZWQgb3IgZGlydHkgYnVmZmVyICViIGZvciB0aGUgbmV3IGJsb2NrIiwKKwkJICAgICAgIHBfc19uZXdfYmgpOwogCi0gICAgc2V0X2J1ZmZlcl9qb3VybmFsX25ldyAocF9zX25ld19iaCk7Ci0gICAgcF9zX3RiLT5GRUJbcF9zX3RiLT5jdXJfYmxrbnVtKytdID0gcF9zX25ld19iaDsKLSAgfQorCQkvKiBQdXQgZW1wdHkgYnVmZmVycyBpbnRvIHRoZSBhcnJheS4gKi8KKwkJUkZBTFNFKHBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bV0sCisJCSAgICAgICAiUEFQLTgxNDE6IGJ1c3kgc2xvdCBmb3IgbmV3IGJ1ZmZlciIpOwogCi0gIGlmICggbl9yZXR2YWwgPT0gQ0FSUllfT04gJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLSAgICBuX3JldHZhbCA9IFJFUEVBVF9TRUFSQ0ggOworCQlzZXRfYnVmZmVyX2pvdXJuYWxfbmV3KHBfc19uZXdfYmgpOworCQlwX3NfdGItPkZFQltwX3NfdGItPmN1cl9ibGtudW0rK10gPSBwX3NfbmV3X2JoOworCX0KIAotICByZXR1cm4gbl9yZXR2YWw7CisJaWYgKG5fcmV0dmFsID09IENBUlJZX09OICYmIEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQluX3JldHZhbCA9IFJFUEVBVF9TRUFSQ0g7CisKKwlyZXR1cm4gbl9yZXR2YWw7CiB9CiAKLQogLyogR2V0IGZyZWUgc3BhY2Ugb2YgdGhlIGxlZnQgbmVpZ2hib3IsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgcGFyZW50CiAgKiBub2RlIG9mIHRoZSBsZWZ0IG5laWdoYm9yLiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2xmcmVlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQorc3RhdGljIGludCBnZXRfbGZyZWUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGwsICogZjsKLSAgICBpbnQgb3JkZXI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsLCAqZjsKKwlpbnQgb3JkZXI7CiAKLSAgICBpZiAoKGYgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChsID0gdGItPkZMW2hdKSA9PSAwKQotCXJldHVybiAwOworCWlmICgoZiA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCB8fCAobCA9IHRiLT5GTFtoXSkgPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoZiA9PSBsKQotCW9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIGgpIC0gMTsKLSAgICBlbHNlIHsKLQlvcmRlciA9IEJfTlJfSVRFTVMgKGwpOwotCWYgPSBsOwotICAgIH0KKwlpZiAoZiA9PSBsKQorCQlvcmRlciA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpIC0gMTsKKwllbHNlIHsKKwkJb3JkZXIgPSBCX05SX0lURU1TKGwpOworCQlmID0gbDsKKwl9CiAKLSAgICByZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZShCX05fQ0hJTEQoZixvcmRlcikpKTsKKwlyZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZShCX05fQ0hJTEQoZiwgb3JkZXIpKSk7CiB9CiAKLQogLyogR2V0IGZyZWUgc3BhY2Ugb2YgdGhlIHJpZ2h0IG5laWdoYm9yLAogICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgcmlnaHQgbmVpZ2hib3IuCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X3JmcmVlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQorc3RhdGljIGludCBnZXRfcmZyZWUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiByLCAqIGY7Ci0gIGludCBvcmRlcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnIsICpmOworCWludCBvcmRlcjsKIAotICBpZiAoKGYgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChyID0gdGItPkZSW2hdKSA9PSAwKQotICAgIHJldHVybiAwOworCWlmICgoZiA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCB8fCAociA9IHRiLT5GUltoXSkgPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgaWYgKGYgPT0gcikKLSAgICAgIG9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIGgpICsgMTsKLSAgZWxzZSB7Ci0gICAgICBvcmRlciA9IDA7Ci0gICAgICBmID0gcjsKLSAgfQorCWlmIChmID09IHIpCisJCW9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkgKyAxOworCWVsc2UgeworCQlvcmRlciA9IDA7CisJCWYgPSByOworCX0KIAotICByZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZSggQl9OX0NISUxEKGYsb3JkZXIpKSk7CisJcmV0dXJuIChNQVhfQ0hJTERfU0laRShmKSAtIGRjX3NpemUoQl9OX0NISUxEKGYsIG9yZGVyKSkpOwogCiB9CiAKLQogLyogQ2hlY2sgd2hldGhlciBsZWZ0IG5laWdoYm9yIGlzIGluIG1lbW9yeS4gKi8KLXN0YXRpYyBpbnQgIGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUoCi0gICAgICAgICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2gKLSAgICAgICAgICAgICkgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2ZhdGhlciwgKiBsZWZ0OwotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKLSAgYl9ibG9ja25yX3QJCW5fbGVmdF9uZWlnaGJvcl9ibG9ja25yOwotICBpbnQgICAgICAgICAgICAgICAgICAgbl9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uOworc3RhdGljIGludCBpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19mYXRoZXIsICpsZWZ0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKKwliX2Jsb2NrbnJfdCBuX2xlZnRfbmVpZ2hib3JfYmxvY2tucjsKKwlpbnQgbl9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uOwogCi0gIGlmICggISBwX3NfdGItPkZMW25faF0gKSAvKiBGYXRoZXIgb2YgdGhlIGxlZnQgbmVpZ2hib3IgZG9lcyBub3QgZXhpc3QuICovCi0gICAgcmV0dXJuIDA7CisJaWYgKCFwX3NfdGItPkZMW25faF0pCS8qIEZhdGhlciBvZiB0aGUgbGVmdCBuZWlnaGJvciBkb2VzIG5vdCBleGlzdC4gKi8KKwkJcmV0dXJuIDA7CiAKLSAgLyogQ2FsY3VsYXRlIGZhdGhlciBvZiB0aGUgbm9kZSB0byBiZSBiYWxhbmNlZC4gKi8KLSAgcF9zX2ZhdGhlciA9IFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oICsgMSk7CisJLyogQ2FsY3VsYXRlIGZhdGhlciBvZiB0aGUgbm9kZSB0byBiZSBiYWxhbmNlZC4gKi8KKwlwX3NfZmF0aGVyID0gUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKIAotICBSRkFMU0UoICEgcF9zX2ZhdGhlciB8fCAKLQkgICEgQl9JU19JTl9UUkVFIChwX3NfZmF0aGVyKSB8fCAKLQkgICEgQl9JU19JTl9UUkVFIChwX3NfdGItPkZMW25faF0pIHx8Ci0JICAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX2ZhdGhlcikgfHwgCi0JICAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX3RiLT5GTFtuX2hdKSwKLQkgICJ2cy04MTY1OiBGW2hdICglYikgb3IgRkxbaF0gKCViKSBpcyBpbnZhbGlkIiwgCi0JICBwX3NfZmF0aGVyLCBwX3NfdGItPkZMW25faF0pOworCVJGQUxTRSghcF9zX2ZhdGhlciB8fAorCSAgICAgICAhQl9JU19JTl9UUkVFKHBfc19mYXRoZXIpIHx8CisJICAgICAgICFCX0lTX0lOX1RSRUUocF9zX3RiLT5GTFtuX2hdKSB8fAorCSAgICAgICAhYnVmZmVyX3VwdG9kYXRlKHBfc19mYXRoZXIpIHx8CisJICAgICAgICFidWZmZXJfdXB0b2RhdGUocF9zX3RiLT5GTFtuX2hdKSwKKwkgICAgICAgInZzLTgxNjU6IEZbaF0gKCViKSBvciBGTFtoXSAoJWIpIGlzIGludmFsaWQiLAorCSAgICAgICBwX3NfZmF0aGVyLCBwX3NfdGItPkZMW25faF0pOwogCisJLyogR2V0IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBsZWZ0IG5laWdoYm9yIGludG8gdGhlIGxlZnQgZmF0aGVyLiAqLworCW5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiA9IChwX3NfZmF0aGVyID09IHBfc190Yi0+Rkxbbl9oXSkgPworCSAgICBwX3NfdGItPmxrZXlbbl9oXSA6IEJfTlJfSVRFTVMocF9zX3RiLT5GTFtuX2hdKTsKKwkvKiBHZXQgbGVmdCBuZWlnaGJvciBibG9jayBudW1iZXIuICovCisJbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnIgPQorCSAgICBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKTsKKwkvKiBMb29rIGZvciB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUgY2FjaGUuICovCisJaWYgKChsZWZ0ID0gc2JfZmluZF9nZXRfYmxvY2socF9zX3NiLCBuX2xlZnRfbmVpZ2hib3JfYmxvY2tucikpKSB7CiAKLSAgLyogR2V0IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBsZWZ0IG5laWdoYm9yIGludG8gdGhlIGxlZnQgZmF0aGVyLiAqLwotICBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gPSAoIHBfc19mYXRoZXIgPT0gcF9zX3RiLT5GTFtuX2hdICkgPwotICAgICAgICAgICAgICAgICAgICAgIHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyAocF9zX3RiLT5GTFtuX2hdKTsKLSAgLyogR2V0IGxlZnQgbmVpZ2hib3IgYmxvY2sgbnVtYmVyLiAqLwotICBuX2xlZnRfbmVpZ2hib3JfYmxvY2tuciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24pOwotICAvKiBMb29rIGZvciB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUgY2FjaGUuICovCi0gIGlmICggKGxlZnQgPSBzYl9maW5kX2dldF9ibG9jayhwX3Nfc2IsIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yKSkgKSB7CisJCVJGQUxTRShidWZmZXJfdXB0b2RhdGUobGVmdCkgJiYgIUJfSVNfSU5fVFJFRShsZWZ0KSwKKwkJICAgICAgICJ2cy04MTcwOiBsZWZ0IG5laWdoYm9yICglYiAleikgaXMgbm90IGluIHRoZSB0cmVlIiwKKwkJICAgICAgIGxlZnQsIGxlZnQpOworCQlwdXRfYmgobGVmdCk7CisJCXJldHVybiAxOworCX0KIAotICAgIFJGQUxTRSggYnVmZmVyX3VwdG9kYXRlIChsZWZ0KSAmJiAhIEJfSVNfSU5fVFJFRShsZWZ0KSwKLQkgICAgInZzLTgxNzA6IGxlZnQgbmVpZ2hib3IgKCViICV6KSBpcyBub3QgaW4gdGhlIHRyZWUiLCBsZWZ0LCBsZWZ0KTsKLSAgICBwdXRfYmgobGVmdCkgOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQogI2RlZmluZSBMRUZUX1BBUkVOVFMgICdsJwogI2RlZmluZSBSSUdIVF9QQVJFTlRTICdyJwogCi0KLXN0YXRpYyB2b2lkIGRlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSkKK3N0YXRpYyB2b2lkIGRlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKnBfc19rZXkpCiB7Ci0gICAgLy8gY2FsbCBpdGVtIHNwZWNpZmljIGZ1bmN0aW9uIGZvciB0aGlzIGtleQotICAgIGl0ZW1fb3BzW2NwdV9rZXlfa190eXBlIChwX3Nfa2V5KV0tPmRlY3JlbWVudF9rZXkgKHBfc19rZXkpOworCS8vIGNhbGwgaXRlbSBzcGVjaWZpYyBmdW5jdGlvbiBmb3IgdGhpcyBrZXkKKwlpdGVtX29wc1tjcHVfa2V5X2tfdHlwZShwX3Nfa2V5KV0tPmRlY3JlbWVudF9rZXkocF9zX2tleSk7CiB9CiAKLQotCi0KIC8qIENhbGN1bGF0ZSBmYXIgbGVmdC9yaWdodCBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3Igb2YgdGhlIGN1cnJlbnQgbm9kZSwgdGhhdAogICogaXMgY2FsY3VsYXRlIHRoZSBsZWZ0L3JpZ2h0IChGTFtoXS9GUltoXSkgbmVpZ2hib3Igb2YgdGhlIHBhcmVudCBGW2hdLgogICogQ2FsY3VsYXRlIGxlZnQvcmlnaHQgY29tbW9uIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBMW2hdL1JbaF0uCkBAIC05NDAsMTExICs5NTMsMTIxIEBACiAgCQlTQ0hFRFVMRV9PQ0NVUlJFRCAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CiAgKgkgICAgICAgIENBUlJZX09OICAgICAgICAgLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqLwotc3RhdGljIGludCAgZ2V0X2Zhcl9wYXJlbnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiAgIHBfc190YiwKLQkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBuX2gsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqKiAgcHBfc19mYXRoZXIsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqKiAgcHBfc19jb21fZmF0aGVyLAotCQkJICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGNfbHJfcGFyKSAKK3N0YXRpYyBpbnQgZ2V0X2Zhcl9wYXJlbnQoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLAorCQkJICBpbnQgbl9oLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcF9zX2ZhdGhlciwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcHBfc19jb21fZmF0aGVyLCBjaGFyIGNfbHJfcGFyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OwotICAgIElOSVRJQUxJWkVfUEFUSCAoc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7Ci0gICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKLSAgICBzdHJ1Y3QgY3B1X2tleQlzX2xyX2ZhdGhlcl9rZXk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fY291bnRlciwKLQluX3Bvc2l0aW9uID0gSU5UX01BWCwKLQluX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSAwLAotCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfcGFyZW50OworCUlOSVRJQUxJWkVfUEFUSChzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKwlzdHJ1Y3QgcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisJc3RydWN0IGNwdV9rZXkgc19scl9mYXRoZXJfa2V5OworCWludCBuX2NvdW50ZXIsCisJICAgIG5fcG9zaXRpb24gPSBJTlRfTUFYLAorCSAgICBuX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSAwLAorCSAgICBuX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc19wYXRoLCBuX2gpOwogCi0gICAgLyogU3RhcnRpbmcgZnJvbSBGW25faF0gZ28gdXB3YXJkcyBpbiB0aGUgdHJlZSwgYW5kIGxvb2sgZm9yIHRoZSBjb21tb24KLSAgICAgIGFuY2VzdG9yIG9mIEZbbl9oXSwgYW5kIGl0cyBuZWlnaGJvciBsL3IsIHRoYXQgc2hvdWxkIGJlIG9idGFpbmVkLiAqLworCS8qIFN0YXJ0aW5nIGZyb20gRltuX2hdIGdvIHVwd2FyZHMgaW4gdGhlIHRyZWUsIGFuZCBsb29rIGZvciB0aGUgY29tbW9uCisJICAgYW5jZXN0b3Igb2YgRltuX2hdLCBhbmQgaXRzIG5laWdoYm9yIGwvciwgdGhhdCBzaG91bGQgYmUgb2J0YWluZWQuICovCiAKLSAgICBuX2NvdW50ZXIgPSBuX3BhdGhfb2Zmc2V0OworCW5fY291bnRlciA9IG5fcGF0aF9vZmZzZXQ7CiAKLSAgICBSRkFMU0UoIG5fY291bnRlciA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCi0JICAgICJQQVAtODE4MDogaW52YWxpZCBwYXRoIGxlbmd0aCIpOworCVJGQUxTRShuX2NvdW50ZXIgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAgICAiUEFQLTgxODA6IGludmFsaWQgcGF0aCBsZW5ndGgiKTsKIAotICAKLSAgICBmb3IgKCA7IG5fY291bnRlciA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IG5fY291bnRlci0tICApICB7Ci0JLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZSBwYXRoIGlzIHJlYWxseSBwYXJlbnQgaW4gdGhlIHRyZWUuICovCi0JaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9jb3VudGVyIC0gMSkpICkKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0JLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCi0JaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0JLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCi0JaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9Ci0JICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIpLT5iX2Jsb2NrbnIgKQotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgZXF1YWwgdG8gZmlyc3QvbGFzdCBvbmUuICovCi0JaWYgKCBjX2xyX3BhciA9PSBSSUdIVF9QQVJFTlRTICkKLQkgICAgbl9maXJzdF9sYXN0X3Bvc2l0aW9uID0gQl9OUl9JVEVNUyAocF9zX3BhcmVudCk7Ci0JaWYgKCBuX3Bvc2l0aW9uICE9IG5fZmlyc3RfbGFzdF9wb3NpdGlvbiApIHsKLQkgICAgKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQ7Ci0JICAgIGdldF9iaCgqcHBfc19jb21fZmF0aGVyKSA7Ci0JICAgIC8qKCpwcF9zX2NvbV9mYXRoZXIgPSBwX3NfcGFyZW50KS0+Yl9jb3VudCsrOyovCi0JICAgIGJyZWFrOworCWZvciAoOyBuX2NvdW50ZXIgPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUOyBuX2NvdW50ZXItLSkgeworCQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBvZiB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlIHBhdGggaXMgcmVhbGx5IHBhcmVudCBpbiB0aGUgdHJlZS4gKi8KKwkJaWYgKCFCX0lTX0lOX1RSRUUKKwkJICAgIChwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9jb3VudGVyIC0gMSkpKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCS8qIENoZWNrIHdoZXRoZXIgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBjb3JyZWN0LiAqLworCQlpZiAoKG5fcG9zaXRpb24gPQorCQkgICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLAorCQkJCQkgIG5fY291bnRlciAtIDEpKSA+CisJCSAgICBCX05SX0lURU1TKHBfc19wYXJlbnQpKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworCQlpZiAoQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9jb3VudGVyKS0+Yl9ibG9ja25yKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCS8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCBlcXVhbCB0byBmaXJzdC9sYXN0IG9uZS4gKi8KKwkJaWYgKGNfbHJfcGFyID09IFJJR0hUX1BBUkVOVFMpCisJCQluX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSBCX05SX0lURU1TKHBfc19wYXJlbnQpOworCQlpZiAobl9wb3NpdGlvbiAhPSBuX2ZpcnN0X2xhc3RfcG9zaXRpb24pIHsKKwkJCSpwcF9zX2NvbV9mYXRoZXIgPSBwX3NfcGFyZW50OworCQkJZ2V0X2JoKCpwcF9zX2NvbV9mYXRoZXIpOworCQkJLyooKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQpLT5iX2NvdW50Kys7ICovCisJCQlicmVhazsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHRoZW4gdGhlcmUgaXMgbm8gY29tbW9uIGZhdGhlciAqLwotICAgIGlmICggbl9jb3VudGVyID09IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7Ci0JLyogQ2hlY2sgd2hldGhlciBmaXJzdCBidWZmZXIgaW4gdGhlIHBhdGggaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuICovCi0JaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQotCSAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3RiLT50Yl9zYikgKSB7Ci0JICAgICpwcF9zX2ZhdGhlciA9ICpwcF9zX2NvbV9mYXRoZXIgPSBOVUxMOwotCSAgICByZXR1cm4gQ0FSUllfT047CisJLyogaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSB0cmVlLCB0aGVuIHRoZXJlIGlzIG5vIGNvbW1vbiBmYXRoZXIgKi8KKwlpZiAobl9jb3VudGVyID09IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKwkJLyogQ2hlY2sgd2hldGhlciBmaXJzdCBidWZmZXIgaW4gdGhlIHBhdGggaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuICovCisJCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSCisJCSAgICAocF9zX3RiLT50Yl9wYXRoLAorCQkgICAgIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT5iX2Jsb2NrbnIgPT0KKwkJICAgIFNCX1JPT1RfQkxPQ0socF9zX3RiLT50Yl9zYikpIHsKKwkJCSpwcF9zX2ZhdGhlciA9ICpwcF9zX2NvbV9mYXRoZXIgPSBOVUxMOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCX0KLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLSAgICB9CiAKLSAgICBSRkFMU0UoIEJfTEVWRUwgKCpwcF9zX2NvbV9mYXRoZXIpIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMLAotCSAgICAiUEFQLTgxODU6ICglYiAleikgbGV2ZWwgdG9vIHNtYWxsIiwgCi0JICAgICpwcF9zX2NvbV9mYXRoZXIsICpwcF9zX2NvbV9mYXRoZXIpOworCVJGQUxTRShCX0xFVkVMKCpwcF9zX2NvbV9mYXRoZXIpIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMLAorCSAgICAgICAiUEFQLTgxODU6ICglYiAleikgbGV2ZWwgdG9vIHNtYWxsIiwKKwkgICAgICAgKnBwX3NfY29tX2ZhdGhlciwgKnBwX3NfY29tX2ZhdGhlcik7CiAKLSAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBjb21tb24gcGFyZW50IGlzIGxvY2tlZC4gKi8KKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBjb21tb24gcGFyZW50IGlzIGxvY2tlZC4gKi8KIAotICAgIGlmICggYnVmZmVyX2xvY2tlZCAoKnBwX3NfY29tX2ZhdGhlcikgKSB7Ci0JX193YWl0X29uX2J1ZmZlcigqcHBfc19jb21fZmF0aGVyKTsKLQlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKLQkgICAgZGVjcmVtZW50X2Jjb3VudCgqcHBfc19jb21fZmF0aGVyKTsKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJaWYgKGJ1ZmZlcl9sb2NrZWQoKnBwX3NfY29tX2ZhdGhlcikpIHsKKwkJX193YWl0X29uX2J1ZmZlcigqcHBfc19jb21fZmF0aGVyKTsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQlkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOworCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogU28sIHdlIGdvdCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGl0cyBsZWZ0L3JpZ2h0IG5laWdoYm9yLgotICAgICBOb3cgd2UgYXJlIGdldGluZyB0aGUgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLworCS8qIFNvLCB3ZSBnb3QgY29tbW9uIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBpdHMgbGVmdC9yaWdodCBuZWlnaGJvci4KKwkgICBOb3cgd2UgYXJlIGdldGluZyB0aGUgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLwogCi0gICAgLyogRm9ybSBrZXkgdG8gZ2V0IHBhcmVudCBvZiB0aGUgbGVmdC9yaWdodCBuZWlnaGJvci4gKi8KLSAgICBsZV9rZXkyY3B1X2tleSAoJnNfbHJfZmF0aGVyX2tleSwgQl9OX1BERUxJTV9LRVkoKnBwX3NfY29tX2ZhdGhlciwgKCBjX2xyX3BhciA9PSBMRUZUX1BBUkVOVFMgKSA/Ci0JCQkJCQkgICAgIChwX3NfdGItPmxrZXlbbl9oIC0gMV0gPSBuX3Bvc2l0aW9uIC0gMSkgOiAocF9zX3RiLT5ya2V5W25faCAtIDFdID0gbl9wb3NpdGlvbikpKTsKKwkvKiBGb3JtIGtleSB0byBnZXQgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLworCWxlX2tleTJjcHVfa2V5KCZzX2xyX2ZhdGhlcl9rZXksCisJCSAgICAgICBCX05fUERFTElNX0tFWSgqcHBfc19jb21fZmF0aGVyLAorCQkJCSAgICAgIChjX2xyX3BhciA9PQorCQkJCSAgICAgICBMRUZUX1BBUkVOVFMpID8gKHBfc190Yi0+bGtleVtuX2ggLSAxXSA9CisJCQkJCQkJbl9wb3NpdGlvbiAtCisJCQkJCQkJMSkgOiAocF9zX3RiLT5ya2V5W25faCAtCisJCQkJCQkJCQkgICAxXSA9CisJCQkJCQkJICAgICAgbl9wb3NpdGlvbikpKTsKIAorCWlmIChjX2xyX3BhciA9PSBMRUZUX1BBUkVOVFMpCisJCWRlY3JlbWVudF9rZXkoJnNfbHJfZmF0aGVyX2tleSk7CiAKLSAgICBpZiAoIGNfbHJfcGFyID09IExFRlRfUEFSRU5UUyApCi0JZGVjcmVtZW50X2tleSgmc19scl9mYXRoZXJfa2V5KTsKKwlpZiAoc2VhcmNoX2J5X2tleQorCSAgICAocF9zX3RiLT50Yl9zYiwgJnNfbHJfZmF0aGVyX2tleSwgJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIsCisJICAgICBuX2ggKyAxKSA9PSBJT19FUlJPUikKKwkJLy8gcGF0aCBpcyByZWxlYXNlZAorCQlyZXR1cm4gSU9fRVJST1I7CiAKLSAgICBpZiAoc2VhcmNoX2J5X2tleShwX3NfdGItPnRiX3NiLCAmc19scl9mYXRoZXJfa2V5LCAmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlciwgbl9oICsgMSkgPT0gSU9fRVJST1IpCi0JLy8gcGF0aCBpcyByZWxlYXNlZAotCXJldHVybiBJT19FUlJPUjsKKwlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOworCQlkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOworCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwl9CiAKLSAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwkqcHBfc19mYXRoZXIgPSBQQVRIX1BMQVNUX0JVRkZFUigmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisKKwlSRkFMU0UoQl9MRVZFTCgqcHBfc19mYXRoZXIpICE9IG5faCArIDEsCisJICAgICAgICJQQVAtODE5MDogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAqcHBfc19mYXRoZXIsICpwcF9zX2ZhdGhlcik7CisJUkZBTFNFKHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIucGF0aF9sZW5ndGggPAorCSAgICAgICBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAiUEFQLTgxOTI6IHBhdGggbGVuZ3RoIGlzIHRvbyBzbWFsbCIpOworCisJc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aC0tOwogCWRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKLQlkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOwotCXJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KLQotICAgICpwcF9zX2ZhdGhlciA9IFBBVEhfUExBU1RfQlVGRkVSKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKLQotICAgIFJGQUxTRSggQl9MRVZFTCAoKnBwX3NfZmF0aGVyKSAhPSBuX2ggKyAxLAotCSAgICAiUEFQLTgxOTA6ICglYiAleikgbGV2ZWwgdG9vIHNtYWxsIiwgKnBwX3NfZmF0aGVyLCAqcHBfc19mYXRoZXIpOwotICAgIFJGQUxTRSggc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCi0JICAgICJQQVAtODE5MjogcGF0aCBsZW5ndGggaXMgdG9vIHNtYWxsIik7Ci0KLSAgICBzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoLS07Ci0gICAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOwotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gQ0FSUllfT047CiB9CiAKLQogLyogR2V0IHBhcmVudHMgb2YgbmVpZ2hib3JzIG9mIG5vZGUgaW4gdGhlIHBhdGgoU1tuX3BhdGhfb2Zmc2V0XSkgYW5kIGNvbW1vbiBwYXJlbnRzIG9mCiAgKiBTW25fcGF0aF9vZmZzZXRdIGFuZCBMW25fcGF0aF9vZmZzZXRdL1Jbbl9wYXRoX29mZnNldF06IEZbbl9wYXRoX29mZnNldF0sIEZMW25fcGF0aF9vZmZzZXRdLAogICogRlJbbl9wYXRoX29mZnNldF0sIENGTFtuX3BhdGhfb2Zmc2V0XSwgQ0ZSW25fcGF0aF9vZmZzZXRdLgpAQCAtMTA1MiwxMjIgKzEwNzUsMTI3IEBACiAgKiBSZXR1cm5zOglTQ0hFRFVMRV9PQ0NVUlJFRCAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CiAgKgkgICAgICAgIENBUlJZX09OIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CiAgKi8KLXN0YXRpYyBpbnQgIGdldF9wYXJlbnRzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLCBpbnQgbl9oKQorc3RhdGljIGludCBnZXRfcGFyZW50cyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsIGludCBuX2gpCiB7Ci0gICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOwotICAgIGludCAgICAgICAgICAgICAgICAgICBuX3Bvc2l0aW9uLAotCW5fcmV0X3ZhbHVlLAotCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfY3VyZiwKLQkqIHBfc19jdXJjZjsKKwlzdHJ1Y3QgcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisJaW50IG5fcG9zaXRpb24sCisJICAgIG5fcmV0X3ZhbHVlLAorCSAgICBuX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19jdXJmLCAqcF9zX2N1cmNmOwogCi0gICAgLyogQ3VycmVudCBub2RlIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIG9yIHdpbGwgYmUgcm9vdCBvZiB0aGUgdHJlZSAqLwotICAgIGlmICggbl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgewotCS8qIFRoZSByb290IGNhbiBub3QgaGF2ZSBwYXJlbnRzLgotCSAgIFJlbGVhc2Ugbm9kZXMgd2hpY2ggcHJldmlvdXNseSB3ZXJlIG9idGFpbmVkIGFzIHBhcmVudHMgb2YgdGhlIGN1cnJlbnQgbm9kZSBuZWlnaGJvcnMuICovCisJLyogQ3VycmVudCBub2RlIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIG9yIHdpbGwgYmUgcm9vdCBvZiB0aGUgdHJlZSAqLworCWlmIChuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKwkJLyogVGhlIHJvb3QgY2FuIG5vdCBoYXZlIHBhcmVudHMuCisJCSAgIFJlbGVhc2Ugbm9kZXMgd2hpY2ggcHJldmlvdXNseSB3ZXJlIG9idGFpbmVkIGFzIHBhcmVudHMgb2YgdGhlIGN1cnJlbnQgbm9kZSBuZWlnaGJvcnMuICovCisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2hdKTsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGTFtuX2hdKTsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25faF0pOworCQlwX3NfdGItPkZMW25faF0gPSBwX3NfdGItPkNGTFtuX2hdID0gcF9zX3RiLT5GUltuX2hdID0KKwkJICAgIHBfc190Yi0+Q0ZSW25faF0gPSBOVUxMOworCQlyZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogR2V0IHBhcmVudCBGTFtuX3BhdGhfb2Zmc2V0XSBvZiBMW25fcGF0aF9vZmZzZXRdLiAqLworCWlmICgobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpKSB7CisJCS8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQuICovCisJCS8qKHBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKS0+Yl9jb3VudCArPSAyOyAqLworCQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9CisJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSk7CisJCWdldF9iaChwX3NfY3VyZik7CisJCWdldF9iaChwX3NfY3VyZik7CisJCXBfc190Yi0+bGtleVtuX2hdID0gbl9wb3NpdGlvbiAtIDE7CisJfSBlbHNlIHsKKwkJLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIExbbl9wYXRoX29mZnNldF0sIHdoaWNoIGlzIHRoZSBsZWZ0IG5laWdoYm9yIG9mIHRoZSBjdXJyZW50IG5vZGUuCisJCSAgIENhbGN1bGF0ZSBjdXJyZW50IGNvbW1vbiBwYXJlbnQgb2YgTFtuX3BhdGhfb2Zmc2V0XSBhbmQgdGhlIGN1cnJlbnQgbm9kZS4gTm90ZSB0aGF0CisJCSAgIENGTFtuX3BhdGhfb2Zmc2V0XSBub3QgZXF1YWwgRkxbbl9wYXRoX29mZnNldF0gYW5kIENGTFtuX3BhdGhfb2Zmc2V0XSBub3QgZXF1YWwgRltuX3BhdGhfb2Zmc2V0XS4KKwkJICAgQ2FsY3VsYXRlIGxrZXlbbl9wYXRoX29mZnNldF0uICovCisJCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwKKwkJCQkJCSAgJnBfc19jdXJjZiwKKwkJCQkJCSAgTEVGVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04pCisJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJfQorCiAJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25faF0pOworCXBfc190Yi0+Rkxbbl9oXSA9IHBfc19jdXJmOwkvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgRkxbbl9oXS4gKi8KIAlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25faF0pOwotCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GUltuX2hdKTsKLQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25faF0pOwotCXBfc190Yi0+Rkxbbl9oXSA9IHBfc190Yi0+Q0ZMW25faF0gPSBwX3NfdGItPkZSW25faF0gPSBwX3NfdGItPkNGUltuX2hdID0gTlVMTDsKLQlyZXR1cm4gQ0FSUllfT047Ci0gICAgfQotICAKLSAgICAvKiBHZXQgcGFyZW50IEZMW25fcGF0aF9vZmZzZXRdIG9mIExbbl9wYXRoX29mZnNldF0uICovCi0gICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpICkgIHsKLQkvKiBDdXJyZW50IG5vZGUgaXMgbm90IHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50LiAqLwotCS8qKHBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKS0+Yl9jb3VudCArPSAyOyovCi0JcF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSk7Ci0JZ2V0X2JoKHBfc19jdXJmKSA7Ci0JZ2V0X2JoKHBfc19jdXJmKSA7Ci0JcF9zX3RiLT5sa2V5W25faF0gPSBuX3Bvc2l0aW9uIC0gMTsKLSAgICB9Ci0gICAgZWxzZSAgewotCS8qIENhbGN1bGF0ZSBjdXJyZW50IHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdLCB3aGljaCBpcyB0aGUgbGVmdCBuZWlnaGJvciBvZiB0aGUgY3VycmVudCBub2RlLgotCSAgIENhbGN1bGF0ZSBjdXJyZW50IGNvbW1vbiBwYXJlbnQgb2YgTFtuX3BhdGhfb2Zmc2V0XSBhbmQgdGhlIGN1cnJlbnQgbm9kZS4gTm90ZSB0aGF0Ci0JICAgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGTFtuX3BhdGhfb2Zmc2V0XSBhbmQgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGW25fcGF0aF9vZmZzZXRdLgotCSAgIENhbGN1bGF0ZSBsa2V5W25fcGF0aF9vZmZzZXRdLiAqLwotCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2Zhcl9wYXJlbnQocF9zX3RiLCBuX2ggKyAxLCAmcF9zX2N1cmYsCi0JCQkJCSAgICZwX3NfY3VyY2YsIExFRlRfUEFSRU5UUykpICE9IENBUlJZX09OICkKLQkgICAgcmV0dXJuIG5fcmV0X3ZhbHVlOwotICAgIH0KKwlwX3NfdGItPkNGTFtuX2hdID0gcF9zX2N1cmNmOwkvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZMW25faF0uICovCiAKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9oXSk7Ci0gICAgcF9zX3RiLT5GTFtuX2hdID0gcF9zX2N1cmY7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGTFtuX2hdLiAqLwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9oXSk7Ci0gICAgcF9zX3RiLT5DRkxbbl9oXSA9IHBfc19jdXJjZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIENGTFtuX2hdLiAqLwotCi0gICAgUkZBTFNFKCAocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmYpKSB8fCAKLQkgICAgKHBfc19jdXJjZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyY2YpKSwKLQkgICAgIlBBUC04MTk1OiBGTCAoJWIpIG9yIENGTCAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKKwlSRkFMU0UoKHBfc19jdXJmICYmICFCX0lTX0lOX1RSRUUocF9zX2N1cmYpKSB8fAorCSAgICAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUocF9zX2N1cmNmKSksCisJICAgICAgICJQQVAtODE5NTogRkwgKCViKSBvciBDRkwgKCViKSBpcyBpbnZhbGlkIiwgcF9zX2N1cmYsIHBfc19jdXJjZik7CiAKIC8qIEdldCBwYXJlbnQgRlJbbl9oXSBvZiBSW25faF0uICovCiAKIC8qIEN1cnJlbnQgbm9kZSBpcyB0aGUgbGFzdCBjaGlsZCBvZiBGW25faF0uIEZSW25faF0gIT0gRltuX2hdLiAqLwotICAgIGlmICggbl9wb3NpdGlvbiA9PSBCX05SX0lURU1TIChQQVRIX0hfUEJVRkZFUihwX3NfcGF0aCwgbl9oICsgMSkpICkgeworCWlmIChuX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMoUEFUSF9IX1BCVUZGRVIocF9zX3BhdGgsIG5faCArIDEpKSkgewogLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIFJbbl9oXSwgd2hpY2ggaXMgdGhlIHJpZ2h0IG5laWdoYm9yIG9mIEZbbl9oXS4KICAgIENhbGN1bGF0ZSBjdXJyZW50IGNvbW1vbiBwYXJlbnQgb2YgUltuX2hdIGFuZCBjdXJyZW50IG5vZGUuIE5vdGUgdGhhdCBDRlJbbl9oXQogICAgbm90IGVxdWFsIEZSW25fcGF0aF9vZmZzZXRdIGFuZCBDRlJbbl9oXSBub3QgZXF1YWwgRltuX2hdLiAqLwotCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2Zhcl9wYXJlbnQocF9zX3RiLCBuX2ggKyAxLCAmcF9zX2N1cmYsICAmcF9zX2N1cmNmLCBSSUdIVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04gKQotCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgeworCQlpZiAoKG5fcmV0X3ZhbHVlID0KKwkJICAgICBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwgJnBfc19jdXJjZiwKKwkJCQkgICAgUklHSFRfUEFSRU5UUykpICE9IENBUlJZX09OKQorCQkJcmV0dXJuIG5fcmV0X3ZhbHVlOworCX0gZWxzZSB7CiAvKiBDdXJyZW50IG5vZGUgaXMgbm90IHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgRltuX2hdLiAqLwotCS8qKHBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKS0+Yl9jb3VudCArPSAyOyovCi0JcF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSk7Ci0JZ2V0X2JoKHBfc19jdXJmKSA7Ci0JZ2V0X2JoKHBfc19jdXJmKSA7Ci0JcF9zX3RiLT5ya2V5W25faF0gPSBuX3Bvc2l0aW9uOwotICAgIH0JCisJCS8qKHBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKS0+Yl9jb3VudCArPSAyOyAqLworCQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9CisJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSk7CisJCWdldF9iaChwX3NfY3VyZik7CisJCWdldF9iaChwX3NfY3VyZik7CisJCXBfc190Yi0+cmtleVtuX2hdID0gbl9wb3NpdGlvbjsKKwl9CiAKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7Ci0gICAgcF9zX3RiLT5GUltuX2hdID0gcF9zX2N1cmY7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGUltuX3BhdGhfb2Zmc2V0XS4gKi8KLSAgICAKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25faF0pOwotICAgIHBfc190Yi0+Q0ZSW25faF0gPSBwX3NfY3VyY2Y7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBDRlJbbl9wYXRoX29mZnNldF0uICovCisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOworCXBfc190Yi0+RlJbbl9oXSA9IHBfc19jdXJmOwkvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgRlJbbl9wYXRoX29mZnNldF0uICovCiAKLSAgICBSRkFMU0UoIChwX3NfY3VyZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyZikpIHx8Ci0gICAgICAgICAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJjZikpLAotCSAgICAiUEFQLTgyMDU6IEZSICglYikgb3IgQ0ZSICglYikgaXMgaW52YWxpZCIsIHBfc19jdXJmLCBwX3NfY3VyY2YpOworCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7CisJcF9zX3RiLT5DRlJbbl9oXSA9IHBfc19jdXJjZjsJLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIENGUltuX3BhdGhfb2Zmc2V0XS4gKi8KIAotICAgIHJldHVybiBDQVJSWV9PTjsKKwlSRkFMU0UoKHBfc19jdXJmICYmICFCX0lTX0lOX1RSRUUocF9zX2N1cmYpKSB8fAorCSAgICAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUocF9zX2N1cmNmKSksCisJICAgICAgICJQQVAtODIwNTogRlIgKCViKSBvciBDRlIgKCViKSBpcyBpbnZhbGlkIiwgcF9zX2N1cmYsIHBfc19jdXJjZik7CisKKwlyZXR1cm4gQ0FSUllfT047CiB9CiAKLQogLyogaXQgaXMgcG9zc2libGUgdG8gcmVtb3ZlIG5vZGUgYXMgcmVzdWx0IG9mIHNoaWZ0aW5ncyB0bwogICAgbmVpZ2hib3JzIGV2ZW4gd2hlbiB3ZSBpbnNlcnQgb3IgcGFzdGUgaXRlbS4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNhbl9ub2RlX2JlX3JlbW92ZWQgKGludCBtb2RlLCBpbnQgbGZyZWUsIGludCBzZnJlZSwgaW50IHJmcmVlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQorc3RhdGljIGlubGluZSBpbnQgY2FuX25vZGVfYmVfcmVtb3ZlZChpbnQgbW9kZSwgaW50IGxmcmVlLCBpbnQgc2ZyZWUsIGludCByZnJlZSwKKwkJCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotICAgIGludCBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2tleSAqIHJfa2V5ID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCWludCBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpyX2tleSA9IE5VTEw7CiAKLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChTaCwgMCk7Ci0gICAgaWYgKCB0Yi0+Q0ZSW2hdICkKLQlyX2tleSA9IEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbaF0sdGItPnJrZXlbaF0pOwotICAKLSAgICBpZiAoCi0JbGZyZWUgKyByZnJlZSArIHNmcmVlIDwgTUFYX0NISUxEX1NJWkUoU2gpICsgbGV2Ynl0ZXMKLQkvKiBzaGlmdGluZyBtYXkgbWVyZ2UgaXRlbXMgd2hpY2ggbWlnaHQgc2F2ZSBzcGFjZSAqLwotCS0gKCggISBoICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBTaC0+Yl9zaXplKSApID8gSUhfU0laRSA6IDApCi0JLSAoKCAhIGggJiYgcl9rZXkgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKHJfa2V5LCBTaC0+Yl9zaXplKSApID8gSUhfU0laRSA6IDApCi0JKyAoKCBoICkgPyBLRVlfU0laRSA6IDApKQotICAgIHsKLQkvKiBub2RlIGNhbiBub3QgYmUgcmVtb3ZlZCAqLwotCWlmIChzZnJlZSA+PSBsZXZieXRlcyApIHsgLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLwotCSAgICBpZiAoICEgaCApCi0JCXRiLT5zMG51bSA9IEJfTlJfSVRFTVMoU2gpICsgKChtb2RlID09IE1fSU5TRVJUICkgPyAxIDogMCk7Ci0JICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLQkgICAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisJaWggPSBCX05fUElURU1fSEVBRChTaCwgMCk7CisJaWYgKHRiLT5DRlJbaF0pCisJCXJfa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSwgdGItPnJrZXlbaF0pOworCisJaWYgKGxmcmVlICsgcmZyZWUgKyBzZnJlZSA8IE1BWF9DSElMRF9TSVpFKFNoKSArIGxldmJ5dGVzCisJICAgIC8qIHNoaWZ0aW5nIG1heSBtZXJnZSBpdGVtcyB3aGljaCBtaWdodCBzYXZlIHNwYWNlICovCisJICAgIC0KKwkgICAgKCghaAorCSAgICAgICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpKSA/IElIX1NJWkUgOiAwKQorCSAgICAtCisJICAgICgoIWggJiYgcl9rZXkKKwkgICAgICAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZShyX2tleSwgU2gtPmJfc2l6ZSkpID8gSUhfU0laRSA6IDApCisJICAgICsgKChoKSA/IEtFWV9TSVpFIDogMCkpIHsKKwkJLyogbm9kZSBjYW4gbm90IGJlIHJlbW92ZWQgKi8KKwkJaWYgKHNmcmVlID49IGxldmJ5dGVzKSB7CS8qIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KKwkJCWlmICghaCkKKwkJCQl0Yi0+czBudW0gPQorCQkJCSAgICBCX05SX0lURU1TKFNoKSArCisJCQkJICAgICgobW9kZSA9PSBNX0lOU0VSVCkgPyAxIDogMCk7CisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCQl9CiAJfQotICAgIH0KLSAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgY2FuX25vZGVfYmVfcmVtb3ZlZFsgaCBdICk7Ci0gICAgcmV0dXJuICFOT19CQUxBTkNJTkdfTkVFREVEOworCVBST0NfSU5GT19JTkModGItPnRiX3NiLCBjYW5fbm9kZV9iZV9yZW1vdmVkW2hdKTsKKwlyZXR1cm4gIU5PX0JBTEFOQ0lOR19ORUVERUQ7CiB9CiAKLQotCiAvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gaW5jcmVhc2luZyBpdHMgc2l6ZSBieQogICogSW5zZXJ0aW5nIG9yIFBhc3RpbmcuCiAgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCkBAIC0xMTgyLDE1NCArMTIxMCwxNTcgQEAKICAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCiAgKi8KIC8qIGlwIG1lYW5zIEluc2VydGluZyBvciBQYXN0aW5nICovCi1zdGF0aWMgaW50IGlwX2NoZWNrX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGlwX2NoZWNrX2JhbGFuY2Uoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgICBpbnQgbGV2Ynl0ZXMsICAvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGluc2VydGVkIGludG8gKHZhbHVlCi0JCSAgICAgIGlzIG5lZ2F0aXZlIGlmIGJ5dGVzIGFyZSBkZWxldGVkKSBidWZmZXIgd2hpY2gKLQkJICAgICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcwotCQkgICAgICB0aGF0IHRoZSBhdHRlbXB0ZWQgY2hhbmdlIGluIG5vZGUgc3BhY2UgdXNlZCBsZXZlbAotCQkgICAgICBpcyBsZXZieXRlcyBieXRlcy4gKi8KLQluX3JldF92YWx1ZTsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlpbnQgbGV2Ynl0ZXMsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGluc2VydGVkIGludG8gKHZhbHVlCisJCQkJICAgaXMgbmVnYXRpdmUgaWYgYnl0ZXMgYXJlIGRlbGV0ZWQpIGJ1ZmZlciB3aGljaAorCQkJCSAgIGNvbnRhaW5zIG5vZGUgYmVpbmcgYmFsYW5jZWQuICBUaGUgbW5lbW9uaWMgaXMKKwkJCQkgICB0aGF0IHRoZSBhdHRlbXB0ZWQgY2hhbmdlIGluIG5vZGUgc3BhY2UgdXNlZCBsZXZlbAorCQkJCSAgIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLworCSBuX3JldF92YWx1ZTsKIAotICAgIGludCBsZnJlZSwgc2ZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCwgUyBhbmQgUiAqLzsKKwlpbnQgbGZyZWUsIHNmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwsIFMgYW5kIFIgKi8gOwogCi0gICAgLyogbnZlciBpcyBzaG9ydCBmb3IgbnVtYmVyIG9mIHZlcnRpeGVzLCBhbmQgbG52ZXIgaXMgdGhlIG51bWJlciBpZgotICAgICAgIHdlIHNoaWZ0IHRvIHRoZSBsZWZ0LCBybnZlciBpcyB0aGUgbnVtYmVyIGlmIHdlIHNoaWZ0IHRvIHRoZQotICAgICAgIHJpZ2h0LCBhbmQgbHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgaW4gYm90aCBkaXJlY3Rpb25zLgotICAgICAgIFRoZSBnb2FsIGlzIHRvIG1pbmltaXplIGZpcnN0IHRoZSBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBzZWNvbmQsCi0gICAgICAgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcyB3aG9zZSBjb250ZW50cyBhcmUgY2hhbmdlZCBieSBzaGlmdGluZywKLSAgICAgICBhbmQgdGhpcmQgdGhlIG51bWJlciBvZiB1bmNhY2hlZCB2ZXJ0aXhlcyB3aG9zZSBjb250ZW50cyBhcmUKLSAgICAgICBjaGFuZ2VkIGJ5IHNoaWZ0aW5nIGFuZCBtdXN0IGJlIHJlYWQgZnJvbSBkaXNrLiAgKi8KLSAgICBpbnQgbnZlciwgbG52ZXIsIHJudmVyLCBscm52ZXI7CisJLyogbnZlciBpcyBzaG9ydCBmb3IgbnVtYmVyIG9mIHZlcnRpeGVzLCBhbmQgbG52ZXIgaXMgdGhlIG51bWJlciBpZgorCSAgIHdlIHNoaWZ0IHRvIHRoZSBsZWZ0LCBybnZlciBpcyB0aGUgbnVtYmVyIGlmIHdlIHNoaWZ0IHRvIHRoZQorCSAgIHJpZ2h0LCBhbmQgbHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgaW4gYm90aCBkaXJlY3Rpb25zLgorCSAgIFRoZSBnb2FsIGlzIHRvIG1pbmltaXplIGZpcnN0IHRoZSBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBzZWNvbmQsCisJICAgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcyB3aG9zZSBjb250ZW50cyBhcmUgY2hhbmdlZCBieSBzaGlmdGluZywKKwkgICBhbmQgdGhpcmQgdGhlIG51bWJlciBvZiB1bmNhY2hlZCB2ZXJ0aXhlcyB3aG9zZSBjb250ZW50cyBhcmUKKwkgICBjaGFuZ2VkIGJ5IHNoaWZ0aW5nIGFuZCBtdXN0IGJlIHJlYWQgZnJvbSBkaXNrLiAgKi8KKwlpbnQgbnZlciwgbG52ZXIsIHJudmVyLCBscm52ZXI7CiAKLSAgICAvKiB1c2VkIGF0IGxlYWYgbGV2ZWwgb25seSwgUzAgPSBTWzBdIGlzIHRoZSBub2RlIGJlaW5nIGJhbGFuY2VkLAotICAgICAgIHNJbnVtIFsgSSA9IDAsMSwyIF0gaXMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwKLSAgICAgICByZW1haW4gaW4gbm9kZSBTSSBhZnRlciBiYWxhbmNpbmcuICBTMSBhbmQgUzIgYXJlIG5ldwotICAgICAgIG5vZGVzIHRoYXQgbWlnaHQgYmUgY3JlYXRlZC4gKi8KLSAgCi0gICAgLyogd2UgcGVyZm9ybSA4IGNhbGxzIHRvIGdldF9udW1fdmVyKCkuICBGb3IgZWFjaCBjYWxsIHdlIGNhbGN1bGF0ZSBmaXZlIHBhcmFtZXRlcnMuCi0gICAgICAgd2hlcmUgNHRoIHBhcmFtZXRlciBpcyBzMWJ5dGVzIGFuZCA1dGggLSBzMmJ5dGVzCi0gICAgKi8KLSAgICBzaG9ydCBzbnVtMDEyWzQwXSA9IHswLH07CS8qIHMwbnVtLCBzMW51bSwgczJudW0gZm9yIDggY2FzZXMgCi0JCQkJICAgMCwxIC0gZG8gbm90IHNoaWZ0IGFuZCBkbyBub3Qgc2hpZnQgYnV0IGJvdHRsZQotCQkJCSAgIDIgLSBzaGlmdCBvbmx5IHdob2xlIGl0ZW0gdG8gbGVmdAotCQkJCSAgIDMgLSBzaGlmdCB0byBsZWZ0IGFuZCBib3R0bGUgYXMgbXVjaCBhcyBwb3NzaWJsZQotCQkJCSAgIDQsNSAtIHNoaWZ0IHRvIHJpZ2h0CSh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZQotCQkJCSAgIDYsNyAtIHNoaWZ0IHRvIGJvdGggZGlyZWN0aW9ucyAod2hvbGUgaXRlbXMgYW5kIGFzIG11Y2ggYXMgcG9zc2libGUpCi0JCQkJKi8KKwkvKiB1c2VkIGF0IGxlYWYgbGV2ZWwgb25seSwgUzAgPSBTWzBdIGlzIHRoZSBub2RlIGJlaW5nIGJhbGFuY2VkLAorCSAgIHNJbnVtIFsgSSA9IDAsMSwyIF0gaXMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwKKwkgICByZW1haW4gaW4gbm9kZSBTSSBhZnRlciBiYWxhbmNpbmcuICBTMSBhbmQgUzIgYXJlIG5ldworCSAgIG5vZGVzIHRoYXQgbWlnaHQgYmUgY3JlYXRlZC4gKi8KIAotICAgIC8qIFNoIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQgKi8KLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaDsKLSAgCi0gICAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotICAgIGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOwotICAKLSAgICAvKiBDYWxjdWxhdGUgYmFsYW5jZSBwYXJhbWV0ZXJzIGZvciBjcmVhdGluZyBuZXcgcm9vdC4gKi8KLSAgICBpZiAoICEgU2ggKSAgewotCWlmICggISBoICkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTgyMTA6IGlwX2NoZWNrX2JhbGFuY2U6IFNbMF0gY2FuIG5vdCBiZSAwIik7Ci0Jc3dpdGNoICggbl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXMgKHRiLCBoKSApICB7Ci0JY2FzZSBDQVJSWV9PTjoKLQkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCSAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsgLyogbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZCAqLwotCi0JY2FzZSBOT19ESVNLX1NQQUNFOgotCWNhc2UgUkVQRUFUX1NFQVJDSDoKLQkgICAgcmV0dXJuIG5fcmV0X3ZhbHVlOwotCWRlZmF1bHQ6ICAgCi0JICAgIHJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgInZzLTgyMTU6IGlwX2NoZWNrX2JhbGFuY2U6IGluY29ycmVjdCByZXR1cm4gdmFsdWUgb2YgZ2V0X2VtcHR5X25vZGVzIik7Ci0JfQotICAgIH0KLSAgCi0gICAgaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyAodGIsIGgpKSAhPSBDQVJSWV9PTiApIC8qIGdldCBwYXJlbnRzIG9mIFNbaF0gbmVpZ2hib3JzLiAqLwotCXJldHVybiBuX3JldF92YWx1ZTsKLSAgCi0gICAgc2ZyZWUgPSBCX0ZSRUVfU1BBQ0UgKFNoKTsKLQotICAgIC8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLwotICAgIHJmcmVlID0gZ2V0X3JmcmVlICh0YiwgaCk7Ci0gICAgbGZyZWUgPSBnZXRfbGZyZWUgKHRiLCBoKTsKLQotICAgIGlmIChjYW5fbm9kZV9iZV9yZW1vdmVkICh2bi0+dm5fbW9kZSwgbGZyZWUsIHNmcmVlLCByZnJlZSwgdGIsIGgpID09IE5PX0JBTEFOQ0lOR19ORUVERUQpCi0JLyogYW5kIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KLQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKLSAgICAgCi0gICAgY3JlYXRlX3ZpcnR1YWxfbm9kZSAodGIsIGgpOwotCi0gICAgLyoJCi0JZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgbGVmdCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQotCWFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvcgotCWZyb20gdGhlIGxlZnQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAocmV0dXJuZWQgdmFsdWUpCi0gICAgKi8KLSAgICBjaGVja19sZWZ0ICh0YiwgaCwgbGZyZWUpOwotCi0gICAgLyoKLSAgICAgIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIHJpZ2h0IG5laWdoYm9yIChpbiB0YiBzdHJ1Y3R1cmUpCi0gICAgICBhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIHJpZ2h0IG5laWdoYm9yCi0gICAgICBmcm9tIHRoZSByaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKLSAgICAqLwotICAgIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOwotCi0KLSAgICAvKiBhbGwgY29udGVudHMgb2YgaW50ZXJuYWwgbm9kZSBTW2hdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cwotICAgICAgIG5laWdoYm9ycywgU1toXSB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgYmFsYW5jaW5nICovCi0gICAgaWYgKGggJiYgKHRiLT5ybnVtW2hdICsgdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSkgewotCWludCB0b19yOyAKLSAgICAgICAKLQkvKiBTaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBpbnRlcm5hbCBub2RlcywgYW5kIG91ciBpbnRlcm5hbAotCSAgIG5vZGVzIGhhdmUgZml4ZWQgc2l6ZSBlbnRyaWVzLCB0aGVuIHdlIGNhbiBiYWxhbmNlIGJ5IHRoZQotCSAgIG51bWJlciBvZiBpdGVtcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGhleSBjb25zdW1lLiAgSW4gdGhpcwotCSAgIHJvdXRpbmUgd2Ugc2V0IHRoZSBsZWZ0IG5vZGUgZXF1YWwgdG8gdGhlIHJpZ2h0IG5vZGUsCi0JICAgYWxsb3dpbmcgYSBkaWZmZXJlbmNlIG9mIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxIGNoaWxkCi0JICAgcG9pbnRlci4gKi8KLQl0b19yID0gKChNQVhfTlJfS0VZKFNoKTw8MSkrMi10Yi0+bG51bVtoXS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yIC0gCi0JICAgIChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+cm51bVtoXSk7Ci0Jc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLCAtMSwgLTEpOwotCXJldHVybiBDQVJSWV9PTjsKLSAgICB9Ci0KLSAgICAvKiB0aGlzIGNoZWNrcyBiYWxhbmNlIGNvbmRpdGlvbiwgdGhhdCBhbnkgdHdvIG5laWdoYm9yaW5nIG5vZGVzIGNhbiBub3QgZml0IGluIG9uZSBub2RlICovCi0gICAgUkZBTFNFKCBoICYmIAotCSAgICAoIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSB8fCAKLQkgICAgICB0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpLAotCSAgICAidnMtODIyMDogdHJlZSBpcyBub3QgYmFsYW5jZWQgb24gaW50ZXJuYWwgbGV2ZWwiKTsKLSAgICBSRkFMU0UoICEgaCAmJiAoKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICYmICh0Yi0+bGJ5dGVzID09IC0xKSkgfHwKLQkJICAgICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPnJieXRlcyA9PSAtMSkpICksCi0JICAgICJ2cy04MjI1OiB0cmVlIGlzIG5vdCBiYWxhbmNlZCBvbiBsZWFmIGxldmVsIik7Ci0KLSAgICAvKiBhbGwgY29udGVudHMgb2YgU1swXSBjYW4gYmUgbW92ZWQgaW50byBpdHMgbmVpZ2hib3JzCi0gICAgICAgU1swXSB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgYmFsYW5jaW5nLiAqLwotICAgIGlmICghaCAmJiBpc19sZWFmX3JlbW92YWJsZSAodGIpKQotCXJldHVybiBDQVJSWV9PTjsKLQotCi0gICAgLyogd2h5IGRvIHdlIHBlcmZvcm0gdGhpcyBjaGVjayBoZXJlIHJhdGhlciB0aGFuIGVhcmxpZXI/PwotICAgICAgIEFuc3dlcjogd2UgY2FuIHdpbiAxIG5vZGUgaW4gc29tZSBjYXNlcyBhYm92ZS4gTW9yZW92ZXIgd2UKLSAgICAgICBjaGVja2VkIGl0IGFib3ZlLCB3aGVuIHdlIGNoZWNrZWQsIHRoYXQgU1swXSBpcyBub3QgcmVtb3ZhYmxlCi0gICAgICAgaW4gcHJpbmNpcGxlICovCi0gICAgaWYgKHNmcmVlID49IGxldmJ5dGVzKSB7IC8qIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KLQlpZiAoICEgaCApCi0JICAgIHRiLT5zMG51bSA9IHZuLT52bl9ucl9pdGVtOwotCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKLSAgICB9Ci0KLQotICAgIHsKLQlpbnQgbHBhciwgcnBhciwgbnNldCwgbHNldCwgcnNldCwgbHJzZXQ7Ci0JLyogCi0JICogcmVndWxhciBvdmVyZmxvd2luZyBvZiB0aGUgbm9kZQorCS8qIHdlIHBlcmZvcm0gOCBjYWxscyB0byBnZXRfbnVtX3ZlcigpLiAgRm9yIGVhY2ggY2FsbCB3ZSBjYWxjdWxhdGUgZml2ZSBwYXJhbWV0ZXJzLgorCSAgIHdoZXJlIDR0aCBwYXJhbWV0ZXIgaXMgczFieXRlcyBhbmQgNXRoIC0gczJieXRlcwogCSAqLworCXNob3J0IHNudW0wMTJbNDBdID0geyAwLCB9OwkvKiBzMG51bSwgczFudW0sIHMybnVtIGZvciA4IGNhc2VzIAorCQkJCQkgICAwLDEgLSBkbyBub3Qgc2hpZnQgYW5kIGRvIG5vdCBzaGlmdCBidXQgYm90dGxlCisJCQkJCSAgIDIgLSBzaGlmdCBvbmx5IHdob2xlIGl0ZW0gdG8gbGVmdAorCQkJCQkgICAzIC0gc2hpZnQgdG8gbGVmdCBhbmQgYm90dGxlIGFzIG11Y2ggYXMgcG9zc2libGUKKwkJCQkJICAgNCw1IC0gc2hpZnQgdG8gcmlnaHQgKHdob2xlIGl0ZW1zIGFuZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisJCQkJCSAgIDYsNyAtIHNoaWZ0IHRvIGJvdGggZGlyZWN0aW9ucyAod2hvbGUgaXRlbXMgYW5kIGFzIG11Y2ggYXMgcG9zc2libGUpCisJCQkJCSAqLwogCi0JLyogZ2V0X251bV92ZXIgd29ya3MgaW4gMiBtb2RlcyAoRkxPVyAmIE5PX0ZMT1cpIAotCSAgIGxwYXIsIHJwYXIgLSBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIGxlZnQvcmlnaHQgbmVpZ2hib3IgKGluY2x1ZGluZyBzcGxpdHRpbmcgaXRlbSkKLQkgICBuc2V0LCBsc2V0LCByc2V0LCBscnNldCAtIHNob3dzLCB3aGV0aGVyIGZsb3dpbmcgaXRlbXMgZ2l2ZSBiZXR0ZXIgcGFja2luZyAKLQkqLworCS8qIFNoIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNoOworCisJU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJbGV2Ynl0ZXMgPSB0Yi0+aW5zZXJ0X3NpemVbaF07CisKKwkvKiBDYWxjdWxhdGUgYmFsYW5jZSBwYXJhbWV0ZXJzIGZvciBjcmVhdGluZyBuZXcgcm9vdC4gKi8KKwlpZiAoIVNoKSB7CisJCWlmICghaCkKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgInZzLTgyMTA6IGlwX2NoZWNrX2JhbGFuY2U6IFNbMF0gY2FuIG5vdCBiZSAwIik7CisJCXN3aXRjaCAobl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXModGIsIGgpKSB7CisJCWNhc2UgQ0FSUllfT046CisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwkvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCisKKwkJY2FzZSBOT19ESVNLX1NQQUNFOgorCQljYXNlIFJFUEVBVF9TRUFSQ0g6CisJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJCWRlZmF1bHQ6CisJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJICAgICAgICJ2cy04MjE1OiBpcF9jaGVja19iYWxhbmNlOiBpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIG9mIGdldF9lbXB0eV9ub2RlcyIpOworCQl9CisJfQorCisJaWYgKChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLCBoKSkgIT0gQ0FSUllfT04pCS8qIGdldCBwYXJlbnRzIG9mIFNbaF0gbmVpZ2hib3JzLiAqLworCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisKKwlzZnJlZSA9IEJfRlJFRV9TUEFDRShTaCk7CisKKwkvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKwlyZnJlZSA9IGdldF9yZnJlZSh0YiwgaCk7CisJbGZyZWUgPSBnZXRfbGZyZWUodGIsIGgpOworCisJaWYgKGNhbl9ub2RlX2JlX3JlbW92ZWQodm4tPnZuX21vZGUsIGxmcmVlLCBzZnJlZSwgcmZyZWUsIHRiLCBoKSA9PQorCSAgICBOT19CQUxBTkNJTkdfTkVFREVEKQorCQkvKiBhbmQgbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLworCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKworCWNyZWF0ZV92aXJ0dWFsX25vZGUodGIsIGgpOworCisJLyogIAorCSAgIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIGxlZnQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKKwkgICBhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIGxlZnQgbmVpZ2hib3IKKwkgICBmcm9tIHRoZSBsZWZ0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgKHJldHVybmVkIHZhbHVlKQorCSAqLworCWNoZWNrX2xlZnQodGIsIGgsIGxmcmVlKTsKKworCS8qCisJICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgcmlnaHQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKKwkgICBhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIHJpZ2h0IG5laWdoYm9yCisJICAgZnJvbSB0aGUgcmlnaHQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAocmV0dXJuZWQgdmFsdWUpCisJICovCisJY2hlY2tfcmlnaHQodGIsIGgsIHJmcmVlKTsKKworCS8qIGFsbCBjb250ZW50cyBvZiBpbnRlcm5hbCBub2RlIFNbaF0gY2FuIGJlIG1vdmVkIGludG8gaXRzCisJICAgbmVpZ2hib3JzLCBTW2hdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcgKi8KKwlpZiAoaCAmJiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpKSB7CisJCWludCB0b19yOworCisJCS8qIFNpbmNlIHdlIGFyZSB3b3JraW5nIG9uIGludGVybmFsIG5vZGVzLCBhbmQgb3VyIGludGVybmFsCisJCSAgIG5vZGVzIGhhdmUgZml4ZWQgc2l6ZSBlbnRyaWVzLCB0aGVuIHdlIGNhbiBiYWxhbmNlIGJ5IHRoZQorCQkgICBudW1iZXIgb2YgaXRlbXMgcmF0aGVyIHRoYW4gdGhlIHNwYWNlIHRoZXkgY29uc3VtZS4gIEluIHRoaXMKKwkJICAgcm91dGluZSB3ZSBzZXQgdGhlIGxlZnQgbm9kZSBlcXVhbCB0byB0aGUgcmlnaHQgbm9kZSwKKwkJICAgYWxsb3dpbmcgYSBkaWZmZXJlbmNlIG9mIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxIGNoaWxkCisJCSAgIHBvaW50ZXIuICovCisJCXRvX3IgPQorCQkgICAgKChNQVhfTlJfS0VZKFNoKSA8PCAxKSArIDIgLSB0Yi0+bG51bVtoXSAtIHRiLT5ybnVtW2hdICsKKwkJICAgICB2bi0+dm5fbnJfaXRlbSArIDEpIC8gMiAtIChNQVhfTlJfS0VZKFNoKSArIDEgLQorCQkJCQkJdGItPnJudW1baF0pOworCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwKKwkJCSAgICAgICAtMSwgLTEpOworCQlyZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogdGhpcyBjaGVja3MgYmFsYW5jZSBjb25kaXRpb24sIHRoYXQgYW55IHR3byBuZWlnaGJvcmluZyBub2RlcyBjYW4gbm90IGZpdCBpbiBvbmUgbm9kZSAqLworCVJGQUxTRShoICYmCisJICAgICAgICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEgfHwKKwkJdGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSwKKwkgICAgICAgInZzLTgyMjA6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGludGVybmFsIGxldmVsIik7CisJUkZBTFNFKCFoICYmICgodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5sYnl0ZXMgPT0gLTEpKSB8fAorCQkgICAgICAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5yYnl0ZXMgPT0gLTEpKSksCisJICAgICAgICJ2cy04MjI1OiB0cmVlIGlzIG5vdCBiYWxhbmNlZCBvbiBsZWFmIGxldmVsIik7CisKKwkvKiBhbGwgY29udGVudHMgb2YgU1swXSBjYW4gYmUgbW92ZWQgaW50byBpdHMgbmVpZ2hib3JzCisJICAgU1swXSB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgYmFsYW5jaW5nLiAqLworCWlmICghaCAmJiBpc19sZWFmX3JlbW92YWJsZSh0YikpCisJCXJldHVybiBDQVJSWV9PTjsKKworCS8qIHdoeSBkbyB3ZSBwZXJmb3JtIHRoaXMgY2hlY2sgaGVyZSByYXRoZXIgdGhhbiBlYXJsaWVyPz8KKwkgICBBbnN3ZXI6IHdlIGNhbiB3aW4gMSBub2RlIGluIHNvbWUgY2FzZXMgYWJvdmUuIE1vcmVvdmVyIHdlCisJICAgY2hlY2tlZCBpdCBhYm92ZSwgd2hlbiB3ZSBjaGVja2VkLCB0aGF0IFNbMF0gaXMgbm90IHJlbW92YWJsZQorCSAgIGluIHByaW5jaXBsZSAqLworCWlmIChzZnJlZSA+PSBsZXZieXRlcykgewkvKiBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJCWlmICghaCkKKwkJCXRiLT5zMG51bSA9IHZuLT52bl9ucl9pdGVtOworCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisJfQorCisJeworCQlpbnQgbHBhciwgcnBhciwgbnNldCwgbHNldCwgcnNldCwgbHJzZXQ7CisJCS8qIAorCQkgKiByZWd1bGFyIG92ZXJmbG93aW5nIG9mIHRoZSBub2RlCisJCSAqLworCisJCS8qIGdldF9udW1fdmVyIHdvcmtzIGluIDIgbW9kZXMgKEZMT1cgJiBOT19GTE9XKSAKKwkJICAgbHBhciwgcnBhciAtIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gbGVmdC9yaWdodCBuZWlnaGJvciAoaW5jbHVkaW5nIHNwbGl0dGluZyBpdGVtKQorCQkgICBuc2V0LCBsc2V0LCByc2V0LCBscnNldCAtIHNob3dzLCB3aGV0aGVyIGZsb3dpbmcgaXRlbXMgZ2l2ZSBiZXR0ZXIgcGFja2luZyAKKwkJICovCiAjZGVmaW5lIEZMT1cgMQotI2RlZmluZSBOT19GTE9XIDAJLyogZG8gbm90IGFueSBzcGxpdHRpbmcgKi8KKyNkZWZpbmUgTk9fRkxPVyAwCQkvKiBkbyBub3QgYW55IHNwbGl0dGluZyAqLwogCi0JLyogd2UgY2hvb3NlIG9uZSB0aGUgZm9sbG93aW5nICovCisJCS8qIHdlIGNob29zZSBvbmUgdGhlIGZvbGxvd2luZyAqLwogI2RlZmluZSBOT1RISU5HX1NISUZUX05PX0ZMT1cJMAogI2RlZmluZSBOT1RISU5HX1NISUZUX0ZMT1cJNQogI2RlZmluZSBMRUZUX1NISUZUX05PX0ZMT1cJMTAKQEAgLTEzMzksMTY0ICsxMzcwLDE3MyBAQAogI2RlZmluZSBMUl9TSElGVF9OT19GTE9XCTMwCiAjZGVmaW5lIExSX1NISUZUX0ZMT1cJCTM1CiAKKwkJbHBhciA9IHRiLT5sbnVtW2hdOworCQlycGFyID0gdGItPnJudW1baF07CiAKLQlscGFyID0gdGItPmxudW1baF07Ci0JcnBhciA9IHRiLT5ybnVtW2hdOworCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCisJCSAgIG5vdGhpbmcgaXMgc2hpZnRlZCB0byB0aGUgbmVpZ2hib3JzLAorCQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0IG5vZGUgKHMwMTIgbnVtYmVycyksCisJCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueSAqLworCQluc2V0ID0gTk9USElOR19TSElGVF9OT19GTE9XOworCQludmVyID0gZ2V0X251bV92ZXIodm4tPnZuX21vZGUsIHRiLCBoLAorCQkJCSAgIDAsIC0xLCBoID8gdm4tPnZuX25yX2l0ZW0gOiAwLCAtMSwKKwkJCQkgICBzbnVtMDEyLCBOT19GTE9XKTsKIAorCQlpZiAoIWgpIHsKKwkJCWludCBudmVyMTsKIAotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KLQkgICBub3RoaW5nIGlzIHNoaWZ0ZWQgdG8gdGhlIG5laWdoYm9ycywKLQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0IG5vZGUgKHMwMTIgbnVtYmVycyksCi0JICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55ICovCi0JbnNldCA9IE5PVEhJTkdfU0hJRlRfTk9fRkxPVzsKLQludmVyID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwKLQkJCSAgICAwLCAtMSwgaD92bi0+dm5fbnJfaXRlbTowLCAtMSwgCi0JCQkgICAgc251bTAxMiwgTk9fRkxPVyk7CisJCQkvKiBub3RlLCB0aGF0IGluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gYm90dGxlIGJldHdlZW4gU1swXSBhbmQgUzEgKFMxIC0gdGhlIGZpcnN0IG5ldyBub2RlKSAqLworCQkJbnZlcjEgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJCSAgICAwLCAtMSwgMCwgLTEsCisJCQkJCSAgICBzbnVtMDEyICsgTk9USElOR19TSElGVF9GTE9XLCBGTE9XKTsKKwkJCWlmIChudmVyID4gbnZlcjEpCisJCQkJbnNldCA9IE5PVEhJTkdfU0hJRlRfRkxPVywgbnZlciA9IG52ZXIxOworCQl9CiAKLQlpZiAoIWgpCi0JewotCSAgICBpbnQgbnZlcjE7CisJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkJICAgbF9zaGlmdF9udW0gZmlyc3QgaXRlbXMgYW5kIGxfc2hpZnRfYnl0ZXMgb2YgdGhlIHJpZ2h0IG1vc3QKKwkJICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgbGVmdCBuZWlnaGJvciwKKwkJICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAorCQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKKwkJICovCisJCWxzZXQgPSBMRUZUX1NISUZUX05PX0ZMT1c7CisJCWxudmVyID0gZ2V0X251bV92ZXIodm4tPnZuX21vZGUsIHRiLCBoLAorCQkJCSAgICBscGFyIC0gKChoIHx8IHRiLT5sYnl0ZXMgPT0gLTEpID8gMCA6IDEpLAorCQkJCSAgICAtMSwgaCA/IHZuLT52bl9ucl9pdGVtIDogMCwgLTEsCisJCQkJICAgIHNudW0wMTIgKyBMRUZUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCQlpZiAoIWgpIHsKKwkJCWludCBsbnZlcjE7CiAKLQkgICAgLyogbm90ZSwgdGhhdCBpbiB0aGlzIGNhc2Ugd2UgdHJ5IHRvIGJvdHRsZSBiZXR3ZWVuIFNbMF0gYW5kIFMxIChTMSAtIHRoZSBmaXJzdCBuZXcgbm9kZSkgKi8KLQkgICAgbnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCQkgMCwgLTEsIDAsIC0xLCAKLQkJCQkgc251bTAxMiArIE5PVEhJTkdfU0hJRlRfRkxPVywgRkxPVyk7Ci0JICAgIGlmIChudmVyID4gbnZlcjEpCi0JCW5zZXQgPSBOT1RISU5HX1NISUZUX0ZMT1csIG52ZXIgPSBudmVyMTsKKwkJCWxudmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgICBscGFyIC0KKwkJCQkJICAgICAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApLAorCQkJCQkgICAgIHRiLT5sYnl0ZXMsIDAsIC0xLAorCQkJCQkgICAgIHNudW0wMTIgKyBMRUZUX1NISUZUX0ZMT1csIEZMT1cpOworCQkJaWYgKGxudmVyID4gbG52ZXIxKQorCQkJCWxzZXQgPSBMRUZUX1NISUZUX0ZMT1csIGxudmVyID0gbG52ZXIxOworCQl9CisKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCQkgICByX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgcl9zaGlmdF9ieXRlcyBvZiB0aGUgbGVmdCBtb3N0CisJCSAgIGxpcXVpZCBpdGVtIHRvIGJlIHNoaWZ0ZWQgYXJlIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLAorCQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCQkgKi8KKwkJcnNldCA9IFJJR0hUX1NISUZUX05PX0ZMT1c7CisJCXJudmVyID0gZ2V0X251bV92ZXIodm4tPnZuX21vZGUsIHRiLCBoLAorCQkJCSAgICAwLCAtMSwKKwkJCQkgICAgaCA/ICh2bi0+dm5fbnJfaXRlbSAtIHJwYXIpIDogKHJwYXIgLQorCQkJCQkJCQkgICAoKHRiLT4KKwkJCQkJCQkJICAgICByYnl0ZXMgIT0KKwkJCQkJCQkJICAgICAtMSkgPyAxIDoKKwkJCQkJCQkJICAgIDApKSwgLTEsCisJCQkJICAgIHNudW0wMTIgKyBSSUdIVF9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKKwkJaWYgKCFoKSB7CisJCQlpbnQgcm52ZXIxOworCisJCQlybnZlcjEgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJCSAgICAgMCwgLTEsCisJCQkJCSAgICAgKHJwYXIgLQorCQkJCQkgICAgICAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwKKwkJCQkJICAgICB0Yi0+cmJ5dGVzLAorCQkJCQkgICAgIHNudW0wMTIgKyBSSUdIVF9TSElGVF9GTE9XLCBGTE9XKTsKKworCQkJaWYgKHJudmVyID4gcm52ZXIxKQorCQkJCXJzZXQgPSBSSUdIVF9TSElGVF9GTE9XLCBybnZlciA9IHJudmVyMTsKKwkJfQorCisJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkJICAgaXRlbXMgYXJlIHNoaWZ0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLAorCQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCQkgKi8KKwkJbHJzZXQgPSBMUl9TSElGVF9OT19GTE9XOworCQlscm52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgICBscGFyIC0gKChoIHx8IHRiLT5sYnl0ZXMgPT0gLTEpID8gMCA6IDEpLAorCQkJCSAgICAgLTEsCisJCQkJICAgICBoID8gKHZuLT52bl9ucl9pdGVtIC0gcnBhcikgOiAocnBhciAtCisJCQkJCQkJCSAgICAoKHRiLT4KKwkJCQkJCQkJICAgICAgcmJ5dGVzICE9CisJCQkJCQkJCSAgICAgIC0xKSA/IDEgOgorCQkJCQkJCQkgICAgIDApKSwgLTEsCisJCQkJICAgICBzbnVtMDEyICsgTFJfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJCWlmICghaCkgeworCQkJaW50IGxybnZlcjE7CisKKwkJCWxybnZlcjEgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJCSAgICAgIGxwYXIgLQorCQkJCQkgICAgICAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApLAorCQkJCQkgICAgICB0Yi0+bGJ5dGVzLAorCQkJCQkgICAgICAocnBhciAtCisJCQkJCSAgICAgICAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwKKwkJCQkJICAgICAgdGItPnJieXRlcywKKwkJCQkJICAgICAgc251bTAxMiArIExSX1NISUZUX0ZMT1csIEZMT1cpOworCQkJaWYgKGxybnZlciA+IGxybnZlcjEpCisJCQkJbHJzZXQgPSBMUl9TSElGVF9GTE9XLCBscm52ZXIgPSBscm52ZXIxOworCQl9CisKKwkJLyogT3VyIGdlbmVyYWwgc2hpZnRpbmcgc3RyYXRlZ3kgaXM6CisJCSAgIDEpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmV3IG5vZGVzOworCQkgICAyKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIG5laWdoYm9ycyBpbnZvbHZlZCBpbiBzaGlmdGluZzsKKwkJICAgMykgdG8gbWluaW1pemVkIG51bWJlciBvZiBkaXNrIHJlYWRzOyAqLworCisJCS8qIHdlIGNhbiB3aW4gVFdPIG9yIE9ORSBub2RlcyBieSBzaGlmdGluZyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KKwkJaWYgKGxybnZlciA8IGxudmVyICYmIGxybnZlciA8IHJudmVyKSB7CisJCQlSRkFMU0UoaCAmJgorCQkJICAgICAgICh0Yi0+bG51bVtoXSAhPSAxIHx8CisJCQkJdGItPnJudW1baF0gIT0gMSB8fAorCQkJCWxybnZlciAhPSAxIHx8IHJudmVyICE9IDIgfHwgbG52ZXIgIT0gMgorCQkJCXx8IGggIT0gMSksICJ2cy04MjMwOiBiYWQgaCIpOworCQkJaWYgKGxyc2V0ID09IExSX1NISUZUX0ZMT1cpCisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIHRiLT5sbnVtW2hdLCB0Yi0+cm51bVtoXSwKKwkJCQkJICAgICAgIGxybnZlciwgc251bTAxMiArIGxyc2V0LAorCQkJCQkgICAgICAgdGItPmxieXRlcywgdGItPnJieXRlcyk7CisJCQllbHNlCisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsCisJCQkJCSAgICAgICB0Yi0+bG51bVtoXSAtCisJCQkJCSAgICAgICAoKHRiLT5sYnl0ZXMgPT0gLTEpID8gMCA6IDEpLAorCQkJCQkgICAgICAgdGItPnJudW1baF0gLQorCQkJCQkgICAgICAgKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSwKKwkJCQkJICAgICAgIGxybnZlciwgc251bTAxMiArIGxyc2V0LCAtMSwgLTEpOworCisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBpZiBzaGlmdGluZyBkb2Vzbid0IGxlYWQgdG8gYmV0dGVyIHBhY2tpbmcgdGhlbiBkb24ndCBzaGlmdCAqLworCQlpZiAobnZlciA9PSBscm52ZXIpIHsKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCBudmVyLCBzbnVtMDEyICsgbnNldCwgLTEsCisJCQkJICAgICAgIC0xKTsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJCS8qIG5vdyB3ZSBrbm93IHRoYXQgZm9yIGJldHRlciBwYWNraW5nIHNoaWZ0aW5nIGluIG9ubHkgb25lCisJCSAgIGRpcmVjdGlvbiBlaXRoZXIgdG8gdGhlIGxlZnQgb3IgdG8gdGhlIHJpZ2h0IGlzIHJlcXVpcmVkICovCisKKwkJLyogIGlmIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSByaWdodCAqLworCQlpZiAobG52ZXIgPCBybnZlcikgeworCQkJU0VUX1BBUl9TSElGVF9MRUZUOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkJLyogaWYgc2hpZnRpbmcgdG8gdGhlIHJpZ2h0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0ICovCisJCWlmIChsbnZlciA+IHJudmVyKSB7CisJCQlTRVRfUEFSX1NISUZUX1JJR0hUOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkJLyogbm93IHNoaWZ0aW5nIGluIGVpdGhlciBkaXJlY3Rpb24gZ2l2ZXMgdGhlIHNhbWUgbnVtYmVyCisJCSAgIG9mIG5vZGVzIGFuZCB3ZSBjYW4gbWFrZSB1c2Ugb2YgdGhlIGNhY2hlZCBuZWlnaGJvcnMgKi8KKwkJaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUodGIsIGgpKSB7CisJCQlTRVRfUEFSX1NISUZUX0xFRlQ7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBzaGlmdCB0byB0aGUgcmlnaHQgaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIHRoZSByaWdodCBuZWlnaGJvciBpbiBjYWNoZSBvciBub3QgKi8KKwkJU0VUX1BBUl9TSElGVF9SSUdIVDsKKwkJcmV0dXJuIENBUlJZX09OOwogCX0KLSAgICAgICAKLSAKLQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCi0JICAgbF9zaGlmdF9udW0gZmlyc3QgaXRlbXMgYW5kIGxfc2hpZnRfYnl0ZXMgb2YgdGhlIHJpZ2h0IG1vc3QKLQkgICBsaXF1aWQgaXRlbSB0byBiZSBzaGlmdGVkIGFyZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IG5laWdoYm9yLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKLQkqLwotCWxzZXQgPSBMRUZUX1NISUZUX05PX0ZMT1c7Ci0JbG52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCSAgICAgbHBhciAtICgoIGggfHwgdGItPmxieXRlcyA9PSAtMSApID8gMCA6IDEpLCAtMSwgaCA/IHZuLT52bl9ucl9pdGVtOjAsIC0xLAotCQkJICAgICBzbnVtMDEyICsgTEVGVF9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKLQlpZiAoIWgpCi0JewotCSAgICBpbnQgbG52ZXIxOwotCi0JICAgIGxudmVyMSA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJCSAgbHBhciAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksIHRiLT5sYnl0ZXMsIDAsIC0xLAotCQkJCSAgc251bTAxMiArIExFRlRfU0hJRlRfRkxPVywgRkxPVyk7Ci0JICAgIGlmIChsbnZlciA+IGxudmVyMSkKLQkJbHNldCA9IExFRlRfU0hJRlRfRkxPVywgbG52ZXIgPSBsbnZlcjE7Ci0JfQotCi0KLQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCi0JICAgcl9zaGlmdF9udW0gZmlyc3QgaXRlbXMgYW5kIHJfc2hpZnRfYnl0ZXMgb2YgdGhlIGxlZnQgbW9zdAotCSAgIGxpcXVpZCBpdGVtIHRvIGJlIHNoaWZ0ZWQgYXJlIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKLQkqLwotCXJzZXQgPSBSSUdIVF9TSElGVF9OT19GTE9XOwotCXJudmVyID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkgICAgIDAsIC0xLCBoID8gKHZuLT52bl9ucl9pdGVtLXJwYXIpIDogKHJwYXIgLSAoKCB0Yi0+cmJ5dGVzICE9IC0xICkgPyAxIDogMCkpLCAtMSwgCi0JCQkgICAgIHNudW0wMTIgKyBSSUdIVF9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKLQlpZiAoIWgpCi0JewotCSAgICBpbnQgcm52ZXIxOwotCi0JICAgIHJudmVyMSA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJCSAgMCwgLTEsIChycGFyIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKSksIHRiLT5yYnl0ZXMsIAotCQkJCSAgc251bTAxMiArIFJJR0hUX1NISUZUX0ZMT1csIEZMT1cpOwotCi0JICAgIGlmIChybnZlciA+IHJudmVyMSkKLQkJcnNldCA9IFJJR0hUX1NISUZUX0ZMT1csIHJudmVyID0gcm52ZXIxOwotCX0KLQotCi0JLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgotCSAgIGl0ZW1zIGFyZSBzaGlmdGVkIGluIGJvdGggZGlyZWN0aW9ucywKLQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCi0JICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55Ci0JKi8KLQlscnNldCA9IExSX1NISUZUX05PX0ZMT1c7Ci0JbHJudmVyID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkgICAgICBscGFyIC0gKChoIHx8IHRiLT5sYnl0ZXMgPT0gLTEpID8gMCA6IDEpLCAtMSwgaCA/ICh2bi0+dm5fbnJfaXRlbS1ycGFyKToocnBhciAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLCAtMSwKLQkJCSAgICAgIHNudW0wMTIgKyBMUl9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKLQlpZiAoIWgpCi0JewotCSAgICBpbnQgbHJudmVyMTsKLQotCSAgICBscm52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkJICAgbHBhciAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksIHRiLT5sYnl0ZXMsIChycGFyIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKSksIHRiLT5yYnl0ZXMsCi0JCQkJICAgc251bTAxMiArIExSX1NISUZUX0ZMT1csIEZMT1cpOwotCSAgICBpZiAobHJudmVyID4gbHJudmVyMSkKLQkJbHJzZXQgPSBMUl9TSElGVF9GTE9XLCBscm52ZXIgPSBscm52ZXIxOwotCX0KLQotCi0KLQkvKiBPdXIgZ2VuZXJhbCBzaGlmdGluZyBzdHJhdGVneSBpczoKLQkgICAxKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIG5ldyBub2RlczsKLQkgICAyKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIG5laWdoYm9ycyBpbnZvbHZlZCBpbiBzaGlmdGluZzsKLQkgICAzKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIGRpc2sgcmVhZHM7ICovCi0KLQkvKiB3ZSBjYW4gd2luIFRXTyBvciBPTkUgbm9kZXMgYnkgc2hpZnRpbmcgaW4gYm90aCBkaXJlY3Rpb25zICovCi0JaWYgKGxybnZlciA8IGxudmVyICYmIGxybnZlciA8IHJudmVyKQotCXsKLQkgICAgUkZBTFNFKCBoICYmIAotCQkgICAgKHRiLT5sbnVtW2hdICE9IDEgfHwgCi0JCSAgICAgdGItPnJudW1baF0gIT0gMSB8fCAKLQkJICAgICBscm52ZXIgIT0gMSB8fCBybnZlciAhPSAyIHx8IGxudmVyICE9IDIgfHwgaCAhPSAxKSwKLQkJICAgICJ2cy04MjMwOiBiYWQgaCIpOwotCSAgICBpZiAobHJzZXQgPT0gTFJfU0hJRlRfRkxPVykKLQkJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB0Yi0+bG51bVtoXSwgdGItPnJudW1baF0sIGxybnZlciwgc251bTAxMiArIGxyc2V0LAotCQkJCXRiLT5sYnl0ZXMsIHRiLT5yYnl0ZXMpOwotCSAgICBlbHNlCi0JCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdGItPmxudW1baF0gLSAoKHRiLT5sYnl0ZXMgPT0gLTEpID8gMCA6IDEpLCAKLQkJCQl0Yi0+cm51bVtoXSAtICgodGItPnJieXRlcyA9PSAtMSkgPyAwIDogMSksIGxybnZlciwgc251bTAxMiArIGxyc2V0LCAtMSwgLTEpOwotCi0JICAgIHJldHVybiBDQVJSWV9PTjsKLQl9Ci0KLQkvKiBpZiBzaGlmdGluZyBkb2Vzbid0IGxlYWQgdG8gYmV0dGVyIHBhY2tpbmcgdGhlbiBkb24ndCBzaGlmdCAqLwotCWlmIChudmVyID09IGxybnZlcikKLQl7Ci0JICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgbnZlciwgc251bTAxMiArIG5zZXQsIC0xLCAtMSk7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKLQl9Ci0KLQotCS8qIG5vdyB3ZSBrbm93IHRoYXQgZm9yIGJldHRlciBwYWNraW5nIHNoaWZ0aW5nIGluIG9ubHkgb25lCi0JICAgZGlyZWN0aW9uIGVpdGhlciB0byB0aGUgbGVmdCBvciB0byB0aGUgcmlnaHQgaXMgcmVxdWlyZWQgKi8KLQotCS8qICBpZiBzaGlmdGluZyB0byB0aGUgbGVmdCBpcyBiZXR0ZXIgdGhhbiBzaGlmdGluZyB0byB0aGUgcmlnaHQgKi8KLQlpZiAobG52ZXIgPCBybnZlcikKLQl7Ci0JICAgIFNFVF9QQVJfU0hJRlRfTEVGVDsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCS8qIGlmIHNoaWZ0aW5nIHRvIHRoZSByaWdodCBpcyBiZXR0ZXIgdGhhbiBzaGlmdGluZyB0byB0aGUgbGVmdCAqLwotCWlmIChsbnZlciA+IHJudmVyKQotCXsKLQkgICAgU0VUX1BBUl9TSElGVF9SSUdIVDsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCi0JLyogbm93IHNoaWZ0aW5nIGluIGVpdGhlciBkaXJlY3Rpb24gZ2l2ZXMgdGhlIHNhbWUgbnVtYmVyCi0JICAgb2Ygbm9kZXMgYW5kIHdlIGNhbiBtYWtlIHVzZSBvZiB0aGUgY2FjaGVkIG5laWdoYm9ycyAqLwotCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSkKLQl7Ci0JICAgIFNFVF9QQVJfU0hJRlRfTEVGVDsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCS8qIHNoaWZ0IHRvIHRoZSByaWdodCBpbmRlcGVuZGVudGx5IG9uIHdoZXRoZXIgdGhlIHJpZ2h0IG5laWdoYm9yIGluIGNhY2hlIG9yIG5vdCAqLwotCVNFVF9QQVJfU0hJRlRfUklHSFQ7Ci0JcmV0dXJuIENBUlJZX09OOwotICAgIH0KIH0KIAotCiAvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gRGVjcmVhc2luZyBpdHMgc2l6ZSBieQogICogRGVsZXRpbmcgb3IgQ3V0dGluZyBmb3IgSU5URVJOQUwgbm9kZSBvZiBTK3RyZWUuCiAgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCkBAIC0xNTEzLDE1NyArMTU1MywxNzMgQEAKICAqIE5vdGU6IEl0ZW1zIG9mIGludGVybmFsIG5vZGVzIGhhdmUgZml4ZWQgc2l6ZSwgc28gdGhlIGJhbGFuY2UgY29uZGl0aW9uIGZvcgogICogdGhlIGludGVybmFsIHBhcnQgb2YgUyt0cmVlIGlzIGFzIGZvciB0aGUgQi10cmVlcy4KICAqLwotc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlX2ludGVybmFsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQorc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlX2ludGVybmFsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOwogCi0gIC8qIFNoIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQsCi0gICAgIGFuZCBGaCBpcyBpdHMgZmF0aGVyLiAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2gsICogRmg7Ci0gIGludCBtYXhzaXplLAotICAgICAgbl9yZXRfdmFsdWU7Ci0gIGludCBsZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMIGFuZCBSICovOworCS8qIFNoIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQsCisJICAgYW5kIEZoIGlzIGl0cyBmYXRoZXIuICAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2gsICpGaDsKKwlpbnQgbWF4c2l6ZSwgbl9yZXRfdmFsdWU7CisJaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi8gOwogCi0gIFNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsgCi0gIEZoID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsgCisJU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJRmggPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CiAKLSAgbWF4c2l6ZSA9IE1BWF9DSElMRF9TSVpFKFNoKTsgCisJbWF4c2l6ZSA9IE1BWF9DSElMRF9TSVpFKFNoKTsKIAogLyogICB1c2luZyB0Yi0+aW5zZXJ0X3NpemVbaF0sIHdoaWNoIGlzIG5lZ2F0aXZlIGluIHRoaXMgY2FzZSwgY3JlYXRlX3ZpcnR1YWxfbm9kZSBjYWxjdWxhdGVzOiAqLwogLyogICBuZXdfbnJfaXRlbSA9IG51bWJlciBvZiBpdGVtcyBub2RlIHdvdWxkIGhhdmUgaWYgb3BlcmF0aW9uIGlzICovCiAvKiAJcGVyZm9ybWVkIHdpdGhvdXQgYmFsYW5jaW5nIChuZXdfbnJfaXRlbSk7ICovCi0gIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKwljcmVhdGVfdmlydHVhbF9ub2RlKHRiLCBoKTsKIAotICBpZiAoICEgRmggKQotICAgIHsgICAvKiBTW2hdIGlzIHRoZSByb290LiAqLwotICAgICAgaWYgKCB2bi0+dm5fbnJfaXRlbSA+IDAgKQotCXsKLQkgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLQkgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOyAvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCi0JfQotICAgICAgLyogbmV3X25yX2l0ZW0gPT0gMC4KLSAgICAgICAqIEN1cnJlbnQgcm9vdCB3aWxsIGJlIGRlbGV0ZWQgcmVzdWx0aW5nIGluCi0gICAgICAgKiBkZWNyZW1lbnRpbmcgdGhlIHRyZWUgaGVpZ2h0LiAqLwotICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAwLCBOVUxMLCAtMSwgLTEpOwotICAgICAgcmV0dXJuIENBUlJZX09OOwotICAgIH0KLQotICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLGgpKSAhPSBDQVJSWV9PTiApCi0gICAgcmV0dXJuIG5fcmV0X3ZhbHVlOwotCi0KLSAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCi0gIHJmcmVlID0gZ2V0X3JmcmVlICh0YiwgaCk7Ci0gIGxmcmVlID0gZ2V0X2xmcmVlICh0YiwgaCk7Ci0JCQotICAvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIGZpdCBpbnRvIG5laWdoYm9ycyAqLwotICBjaGVja19sZWZ0ICh0YiwgaCwgbGZyZWUpOwotICBjaGVja19yaWdodCAodGIsIGgsIHJmcmVlKTsKLQotCi0gIGlmICggdm4tPnZuX25yX2l0ZW0gPj0gTUlOX05SX0tFWShTaCkgKQotICAgIHsgLyogQmFsYW5jZSBjb25kaXRpb24gZm9yIHRoZSBpbnRlcm5hbCBub2RlIGlzIHZhbGlkLgotICAgICAgICogSW4gdGhpcyBjYXNlIHdlIGJhbGFuY2Ugb25seSBpZiBpdCBsZWFkcyB0byBiZXR0ZXIgcGFja2luZy4gKi8gCi0gICAgICBpZiAoIHZuLT52bl9ucl9pdGVtID09IE1JTl9OUl9LRVkoU2gpICkKLQl7IC8qIEhlcmUgd2Ugam9pbiBTW2hdIHdpdGggb25lIG9mIGl0cyBuZWlnaGJvcnMsCi0JICAgKiB3aGljaCBpcyBpbXBvc3NpYmxlIHdpdGggZ3JlYXRlciB2YWx1ZXMgb2YgbmV3X25yX2l0ZW0uICovCi0JICBpZiAoIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSApCi0JICAgIHsKLQkgICAgICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gTFtoXS4gKi8KLQkgICAgICBpbnQgbjsKLQkgICAgICBpbnQgb3JkZXJfTDsKLQkgICAgICAKLQkgICAgICBvcmRlcl9MID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09MCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKLQkgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLG9yZGVyX0wpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLW4tMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKLQkgICAgICByZXR1cm4gQ0FSUllfT047Ci0JICAgIH0KLQotCSAgaWYgKCB0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEgKQotCSAgICB7Ci0JICAgICAgLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIFJbaF0uICovCi0JICAgICAgaW50IG47Ci0JICAgICAgaW50IG9yZGVyX1I7Ci0JICAgIAotCSAgICAgIG9yZGVyX1IgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT1CX05SX0lURU1TKEZoKSkgPyAwIDogbiArIDE7Ci0JICAgICAgbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GUltoXSxvcmRlcl9SKSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKLQkgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC1uLTEsIDAsIE5VTEwsIC0xLCAtMSk7Ci0JICAgICAgcmV0dXJuIENBUlJZX09OOyAgIAotCSAgICB9CisJaWYgKCFGaCkgewkJLyogU1toXSBpcyB0aGUgcm9vdC4gKi8KKwkJaWYgKHZuLT52bl9ucl9pdGVtID4gMCkgeworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsJLyogbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZCAqLworCQl9CisJCS8qIG5ld19ucl9pdGVtID09IDAuCisJCSAqIEN1cnJlbnQgcm9vdCB3aWxsIGJlIGRlbGV0ZWQgcmVzdWx0aW5nIGluCisJCSAqIGRlY3JlbWVudGluZyB0aGUgdHJlZSBoZWlnaHQuICovCisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gQ0FSUllfT047CiAJfQogCi0gICAgICBpZiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCi0JewotCSAgLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbaF0gJiBSW2hdKS4gKi8KLQkgIGludCB0b19yOworCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyh0YiwgaCkpICE9IENBUlJZX09OKQorCQlyZXR1cm4gbl9yZXRfdmFsdWU7CiAKLQkgIHRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKLQkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKLQkgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwgLTEsIC0xKTsKLQkgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKwlyZnJlZSA9IGdldF9yZnJlZSh0YiwgaCk7CisJbGZyZWUgPSBnZXRfbGZyZWUodGIsIGgpOworCisJLyogZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBmaXQgaW50byBuZWlnaGJvcnMgKi8KKwljaGVja19sZWZ0KHRiLCBoLCBsZnJlZSk7CisJY2hlY2tfcmlnaHQodGIsIGgsIHJmcmVlKTsKKworCWlmICh2bi0+dm5fbnJfaXRlbSA+PSBNSU5fTlJfS0VZKFNoKSkgewkvKiBCYWxhbmNlIGNvbmRpdGlvbiBmb3IgdGhlIGludGVybmFsIG5vZGUgaXMgdmFsaWQuCisJCQkJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgYmFsYW5jZSBvbmx5IGlmIGl0IGxlYWRzIHRvIGJldHRlciBwYWNraW5nLiAqLworCQlpZiAodm4tPnZuX25yX2l0ZW0gPT0gTUlOX05SX0tFWShTaCkpIHsJLyogSGVyZSB3ZSBqb2luIFNbaF0gd2l0aCBvbmUgb2YgaXRzIG5laWdoYm9ycywKKwkJCQkJCQkgKiB3aGljaCBpcyBpbXBvc3NpYmxlIHdpdGggZ3JlYXRlciB2YWx1ZXMgb2YgbmV3X25yX2l0ZW0uICovCisJCQlpZiAodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCQkJLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIExbaF0uICovCisJCQkJaW50IG47CisJCQkJaW50IG9yZGVyX0w7CisKKwkJCQlvcmRlcl9MID0KKwkJCQkgICAgKChuID0KKwkJCQkgICAgICBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLAorCQkJCQkJCSAgaCkpID09CisJCQkJICAgICAwKSA/IEJfTlJfSVRFTVModGItPkZMW2hdKSA6IG4gLSAxOworCQkJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sIG9yZGVyX0wpKSAvCisJCQkJICAgIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAtbiAtIDEsIDAsIDAsIE5VTEwsIC0xLAorCQkJCQkgICAgICAgLTEpOworCQkJCXJldHVybiBDQVJSWV9PTjsKKwkJCX0KKworCQkJaWYgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkgeworCQkJCS8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byBSW2hdLiAqLworCQkJCWludCBuOworCQkJCWludCBvcmRlcl9SOworCisJCQkJb3JkZXJfUiA9CisJCQkJICAgICgobiA9CisJCQkJICAgICAgUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwKKwkJCQkJCQkgIGgpKSA9PQorCQkJCSAgICAgQl9OUl9JVEVNUyhGaCkpID8gMCA6IG4gKyAxOworCQkJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RlJbaF0sIG9yZGVyX1IpKSAvCisJCQkJICAgIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAtbiAtIDEsIDAsIE5VTEwsIC0xLAorCQkJCQkgICAgICAgLTEpOworCQkJCXJldHVybiBDQVJSWV9PTjsKKwkJCX0KKwkJfQorCisJCWlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkgeworCQkJLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbaF0gJiBSW2hdKS4gKi8KKwkJCWludCB0b19yOworCisJCQl0b19yID0KKwkJCSAgICAoKE1BWF9OUl9LRVkoU2gpIDw8IDEpICsgMiAtIHRiLT5sbnVtW2hdIC0KKwkJCSAgICAgdGItPnJudW1baF0gKyB2bi0+dm5fbnJfaXRlbSArIDEpIC8gMiAtCisJCQkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLAorCQkJCSAgICAgICAwLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkJLyogQmFsYW5jaW5nIGRvZXMgbm90IGxlYWQgdG8gYmV0dGVyIHBhY2tpbmcuICovCisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKIAl9CiAKLSAgICAgIC8qIEJhbGFuY2luZyBkb2VzIG5vdCBsZWFkIHRvIGJldHRlciBwYWNraW5nLiAqLwotICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotICAgICAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7Ci0gICAgfQorCS8qIEN1cnJlbnQgbm9kZSBjb250YWluIGluc3VmZmljaWVudCBudW1iZXIgb2YgaXRlbXMuIEJhbGFuY2luZyBpcyByZXF1aXJlZC4gKi8KKwkvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggbGVmdCBuZWlnaGJvci4gKi8KKwlpZiAodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKQorCQlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSh0YiwgaCkKKwkJICAgIHx8IHRiLT5ybnVtW2hdIDwgdm4tPnZuX25yX2l0ZW0gKyAxIHx8ICF0Yi0+RlJbaF0pIHsKKwkJCWludCBuOworCQkJaW50IG9yZGVyX0w7CiAKLSAgLyogQ3VycmVudCBub2RlIGNvbnRhaW4gaW5zdWZmaWNpZW50IG51bWJlciBvZiBpdGVtcy4gQmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqLwkKLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgU1toXSB3aXRoIGxlZnQgbmVpZ2hib3IuICovCi0gIGlmICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCi0gICAgaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpIHx8IHRiLT5ybnVtW2hdIDwgdm4tPnZuX25yX2l0ZW0gKyAxIHx8ICF0Yi0+RlJbaF0pCi0gICAgICB7Ci0JaW50IG47Ci0JaW50IG9yZGVyX0w7Ci0JICAgICAgCi0Jb3JkZXJfTCA9ICgobj1QQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSk9PTApID8gQl9OUl9JVEVNUyh0Yi0+RkxbaF0pIDogbiAtIDE7Ci0JbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GTFtoXSxvcmRlcl9MKSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKLQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIC1uLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlvcmRlcl9MID0KKwkJCSAgICAoKG4gPQorCQkJICAgICAgUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwKKwkJCQkJCSAgaCkpID09CisJCQkgICAgIDApID8gQl9OUl9JVEVNUyh0Yi0+RkxbaF0pIDogbiAtIDE7CisJCQluID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLCBvcmRlcl9MKSkgLyAoRENfU0laRSArCisJCQkJCQkJCSAgICAgIEtFWV9TSVpFKTsKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAtbiAtIDEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCS8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KKwlpZiAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCWludCBuOworCQlpbnQgb3JkZXJfUjsKKworCQlvcmRlcl9SID0KKwkJICAgICgobiA9CisJCSAgICAgIFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsCisJCQkJCSAgaCkpID09IEJfTlJfSVRFTVMoRmgpKSA/IDAgOiAobiArIDEpOworCQluID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLCBvcmRlcl9SKSkgLyAoRENfU0laRSArCisJCQkJCQkJICAgICAgS0VZX1NJWkUpOworCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgLW4gLSAxLCAwLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbaF0gJiBSW2hdKS4gKi8KKwlpZiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpIHsKKwkJaW50IHRvX3I7CisKKwkJdG9fciA9CisJCSAgICAoKE1BWF9OUl9LRVkoU2gpIDw8IDEpICsgMiAtIHRiLT5sbnVtW2hdIC0gdGItPnJudW1baF0gKworCQkgICAgIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0gKE1BWF9OUl9LRVkoU2gpICsgMSAtCisJCQkJCQl0Yi0+cm51bVtoXSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLAorCQkJICAgICAgIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBGb3IgaW50ZXJuYWwgbm9kZXMgdHJ5IHRvIGJvcnJvdyBpdGVtIGZyb20gYSBuZWlnaGJvciAqLworCVJGQUxTRSghdGItPkZMW2hdICYmICF0Yi0+RlJbaF0sICJ2cy04MjM1OiB0cnlpbmcgdG8gYm9ycm93IGZvciByb290Iik7CisKKwkvKiBCb3Jyb3cgb25lIG9yIHR3byBpdGVtcyBmcm9tIGNhY2hpbmcgbmVpZ2hib3IgKi8KKwlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSh0YiwgaCkgfHwgIXRiLT5GUltoXSkgeworCQlpbnQgZnJvbV9sOworCisJCWZyb21fbCA9CisJCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPmxudW1baF0gKyB2bi0+dm5fbnJfaXRlbSArCisJCSAgICAgMSkgLyAyIC0gKHZuLT52bl9ucl9pdGVtICsgMSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAtZnJvbV9sLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gQ0FSUllfT047CisJfQorCisJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsCisJCSAgICAgICAtKChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+cm51bVtoXSArIHZuLT52bl9ucl9pdGVtICsKKwkJCSAgMSkgLyAyIC0gKHZuLT52bl9ucl9pdGVtICsgMSkpLCAxLCBOVUxMLCAtMSwgLTEpOwogCXJldHVybiBDQVJSWV9PTjsKLSAgICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggcmlnaHQgbmVpZ2hib3IuICovCi0gIGlmICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCi0gICAgewotICAgICAgaW50IG47Ci0gICAgICBpbnQgb3JkZXJfUjsKLQkgICAgCi0gICAgICBvcmRlcl9SID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09Ql9OUl9JVEVNUyhGaCkpID8gMCA6IChuICsgMSk7Ci0gICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLG9yZGVyX1IpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAtbi0xLCAwLCBOVUxMLCAtMSwgLTEpOwotICAgICAgcmV0dXJuIENBUlJZX09OOyAgIAotICAgIH0KLQotICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLwotICBpZiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCi0gICAgewotICAgICAgaW50IHRvX3I7Ci0JICAgIAotICAgICAgdG9fciA9ICgoTUFYX05SX0tFWShTaCk8PDEpKzItdGItPmxudW1baF0tdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMiAtIAotCShNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+cm51bVtoXSk7Ci0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQotCi0gIC8qIEZvciBpbnRlcm5hbCBub2RlcyB0cnkgdG8gYm9ycm93IGl0ZW0gZnJvbSBhIG5laWdoYm9yICovCi0gIFJGQUxTRSggIXRiLT5GTFtoXSAmJiAhdGItPkZSW2hdLCAidnMtODIzNTogdHJ5aW5nIHRvIGJvcnJvdyBmb3Igcm9vdCIpOwotCi0gIC8qIEJvcnJvdyBvbmUgb3IgdHdvIGl0ZW1zIGZyb20gY2FjaGluZyBuZWlnaGJvciAqLwotICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwgIXRiLT5GUltoXSkKLSAgICB7Ci0gICAgICBpbnQgZnJvbV9sOwotCQkKLSAgICAgIGZyb21fbCA9IChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+bG51bVtoXSArIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0gICh2bi0+dm5fbnJfaXRlbSArIDEpOwotICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtZnJvbV9sLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotICAgICAgcmV0dXJuIENBUlJZX09OOwotICAgIH0KLQotICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC0oKE1BWF9OUl9LRVkoU2gpKzEtdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMi0odm4tPnZuX25yX2l0ZW0rMSkpLCAxLCAKLQkJICBOVUxMLCAtMSwgLTEpOwotICByZXR1cm4gQ0FSUllfT047CiB9CiAKLQogLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZCB3aGVuIERlY3JlYXNpbmcgaXRzIHNpemUgYnkKICAqIERlbGV0aW5nIG9yIFRydW5jYXRpbmcgZm9yIExFQUYgbm9kZSBvZiBTK3RyZWUuCiAgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCkBAIC0xNjc3LDkxICsxNzMzLDg3IEBACiAgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOwogICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KICAqLwotc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlX2xlYWYgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfbGVhZihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKIAotICAvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgZnJvbQotICAgICAodmFsdWUgaXMgbmVnYXRpdmUgaWYgYnl0ZXMgYXJlIGRlbGV0ZWQpIGJ1ZmZlciB3aGljaAotICAgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzIHRoYXQgdGhlCi0gICAgIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLwotICBpbnQgbGV2Ynl0ZXM7Ci0gIC8qIHRoZSBtYXhpbWFsIGl0ZW0gc2l6ZSAqLwotICBpbnQgbWF4c2l6ZSwKLSAgICAgIG5fcmV0X3ZhbHVlOwotICAvKiBTMCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkLAotICAgICBhbmQgRjAgaXMgaXRzIGZhdGhlci4gICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIFMwLCAqIEYwOwotICBpbnQgbGZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCBhbmQgUiAqLzsKKwkvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgZnJvbQorCSAgICh2YWx1ZSBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCisJICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcyB0aGF0IHRoZQorCSAgIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLworCWludCBsZXZieXRlczsKKwkvKiB0aGUgbWF4aW1hbCBpdGVtIHNpemUgKi8KKwlpbnQgbWF4c2l6ZSwgbl9yZXRfdmFsdWU7CisJLyogUzAgaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKKwkgICBhbmQgRjAgaXMgaXRzIGZhdGhlci4gICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTMCwgKkYwOworCWludCBsZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMIGFuZCBSICovIDsKIAotICBTMCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgMCk7Ci0gIEYwID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKwlTMCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKTsKKwlGMCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKIAotICBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKwlsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKIAotICBtYXhzaXplID0gTUFYX0NISUxEX1NJWkUoUzApOyAJLyogbWF4aW1hbCBwb3NzaWJsZSBzaXplIG9mIGFuIGl0ZW0gKi8KKwltYXhzaXplID0gTUFYX0NISUxEX1NJWkUoUzApOwkvKiBtYXhpbWFsIHBvc3NpYmxlIHNpemUgb2YgYW4gaXRlbSAqLwogCi0gIGlmICggISBGMCApCi0gICAgeyAgLyogU1swXSBpcyB0aGUgcm9vdCBub3cuICovCisJaWYgKCFGMCkgewkJLyogU1swXSBpcyB0aGUgcm9vdCBub3cuICovCiAKLSAgICAgIFJGQUxTRSggLWxldmJ5dGVzID49IG1heHNpemUgLSBCX0ZSRUVfU1BBQ0UgKFMwKSwKLQkgICAgICAidnMtODI0MDogYXR0ZW1wdCB0byBjcmVhdGUgZW1wdHkgYnVmZmVyIHRyZWUiKTsKKwkJUkZBTFNFKC1sZXZieXRlcyA+PSBtYXhzaXplIC0gQl9GUkVFX1NQQUNFKFMwKSwKKwkJICAgICAgICJ2cy04MjQwOiBhdHRlbXB0IHRvIGNyZWF0ZSBlbXB0eSBidWZmZXIgdHJlZSIpOwogCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKLSAgICB9CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwl9CiAKLSAgaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyh0YixoKSkgIT0gQ0FSUllfT04gKQotICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsIGgpKSAhPSBDQVJSWV9PTikKKwkJcmV0dXJuIG5fcmV0X3ZhbHVlOwogCi0gIC8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLwotICByZnJlZSA9IGdldF9yZnJlZSAodGIsIGgpOwotICBsZnJlZSA9IGdldF9sZnJlZSAodGIsIGgpOwkJCisJLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCisJcmZyZWUgPSBnZXRfcmZyZWUodGIsIGgpOworCWxmcmVlID0gZ2V0X2xmcmVlKHRiLCBoKTsKIAotICBjcmVhdGVfdmlydHVhbF9ub2RlICh0YiwgaCk7CisJY3JlYXRlX3ZpcnR1YWxfbm9kZSh0YiwgaCk7CiAKLSAgLyogaWYgMyBsZWF2ZXMgY2FuIGJlIG1lcmdlIHRvIG9uZSwgc2V0IHBhcmFtZXRlcnMgYW5kIHJldHVybiAqLwotICBpZiAoYXJlX2xlYXZlc19yZW1vdmFibGUgKHRiLCBsZnJlZSwgcmZyZWUpKQotICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBpZiAzIGxlYXZlcyBjYW4gYmUgbWVyZ2UgdG8gb25lLCBzZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCisJaWYgKGFyZV9sZWF2ZXNfcmVtb3ZhYmxlKHRiLCBsZnJlZSwgcmZyZWUpKQorCQlyZXR1cm4gQ0FSUllfT047CiAKLSAgLyogZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgbGVmdC9yaWdodCAgbmVpZ2hib3IKLSAgICAgYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yCi0gICAgIGZyb20gdGhlIGxlZnQvcmlnaHQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQotICAgICAqLwotICBjaGVja19sZWZ0ICh0YiwgaCwgbGZyZWUpOwotICBjaGVja19yaWdodCAodGIsIGgsIHJmcmVlKTsgICAKKwkvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0L3JpZ2h0ICBuZWlnaGJvcgorCSAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgbGVmdC9yaWdodCBuZWlnaGJvcgorCSAgIGZyb20gdGhlIGxlZnQvcmlnaHQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQorCSAqLworCWNoZWNrX2xlZnQodGIsIGgsIGxmcmVlKTsKKwljaGVja19yaWdodCh0YiwgaCwgcmZyZWUpOwogCi0gIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFMgd2l0aCBsZWZ0IG5laWdoYm9yLiAqLwotICBpZiAodGItPmxudW1bMF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgdGItPmxieXRlcyA9PSAtMSkKLSAgICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwKLQkoKHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSkgPCB2bi0+dm5fbnJfaXRlbSkgfHwgLyogUyBjYW4gbm90IGJlIG1lcmdlZCB3aXRoIFIgKi8KLQkhdGItPkZSW2hdKSB7Ci0gICAgICAKLSAgICAgIFJGQUxTRSggIXRiLT5GTFtoXSwgInZzLTgyNDU6IGRjX2NoZWNrX2JhbGFuY2VfbGVhZjogRkxbaF0gbXVzdCBleGlzdCIpOworCS8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFMgd2l0aCBsZWZ0IG5laWdoYm9yLiAqLworCWlmICh0Yi0+bG51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+bGJ5dGVzID09IC0xKQorCQlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSh0YiwgaCkgfHwgKCh0Yi0+cm51bVswXSAtICgodGItPnJieXRlcyA9PSAtMSkgPyAwIDogMSkpIDwgdm4tPnZuX25yX2l0ZW0pIHx8CS8qIFMgY2FuIG5vdCBiZSBtZXJnZWQgd2l0aCBSICovCisJCSAgICAhdGItPkZSW2hdKSB7CiAKLSAgICAgIC8qIHNldCBwYXJhbWV0ZXIgdG8gbWVyZ2UgU1swXSB3aXRoIGl0cyBsZWZ0IG5laWdoYm9yICovCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIC0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOwotICAgICAgcmV0dXJuIENBUlJZX09OOwotICAgIH0KKwkJCVJGQUxTRSghdGItPkZMW2hdLAorCQkJICAgICAgICJ2cy04MjQ1OiBkY19jaGVja19iYWxhbmNlX2xlYWY6IEZMW2hdIG11c3QgZXhpc3QiKTsKIAotICAvKiBjaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTWzBdIHdpdGggcmlnaHQgbmVpZ2hib3IuICovCi0gIGlmICh0Yi0+cm51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+cmJ5dGVzID09IC0xKSB7Ci0gICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAtMSwgMCwgTlVMTCwgLTEsIC0xKTsKLSAgICByZXR1cm4gQ0FSUllfT047Ci0gIH0KLSAgCi0gIC8qIEFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCB0byB0aGUgbmVpZ2hib3JzIChMWzBdICYgUlswXSkuIFNldCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gKi8KLSAgaWYgKGlzX2xlYWZfcmVtb3ZhYmxlICh0YikpCi0gICAgcmV0dXJuIENBUlJZX09OOwotICAKLSAgLyogQmFsYW5jaW5nIGlzIG5vdCByZXF1aXJlZC4gKi8KLSAgdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07Ci0gIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLSAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisJCQkvKiBzZXQgcGFyYW1ldGVyIHRvIG1lcmdlIFNbMF0gd2l0aCBpdHMgbGVmdCBuZWlnaGJvciAqLworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkvKiBjaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTWzBdIHdpdGggcmlnaHQgbmVpZ2hib3IuICovCisJaWYgKHRiLT5ybnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5yYnl0ZXMgPT0gLTEpIHsKKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIC0xLCAwLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogQWxsIGNvbnRlbnRzIG9mIFNbMF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbMF0gJiBSWzBdKS4gU2V0IHBhcmFtZXRlcnMgYW5kIHJldHVybiAqLworCWlmIChpc19sZWFmX3JlbW92YWJsZSh0YikpCisJCXJldHVybiBDQVJSWV9PTjsKKworCS8qIEJhbGFuY2luZyBpcyBub3QgcmVxdWlyZWQuICovCisJdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07CisJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CiB9CiAKLQotCiAvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gRGVjcmVhc2luZyBpdHMgc2l6ZSBieQogICogRGVsZXRpbmcgb3IgQ3V0dGluZy4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTE3NzUsMTggKzE4MjcsMTcgQEAKICAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CiAgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgogICovCi1zdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2Uoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotIFJGQUxTRSggISAoUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSksICJ2cy04MjUwOiBTIGlzIG5vdCBpbml0aWFsaXplZCIpOworCVJGQUxTRSghKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSksCisJICAgICAgICJ2cy04MjUwOiBTIGlzIG5vdCBpbml0aWFsaXplZCIpOwogCi0gaWYgKCBoICkKLSAgIHJldHVybiBkY19jaGVja19iYWxhbmNlX2ludGVybmFsICh0YiwgaCk7Ci0gZWxzZQotICAgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2VfbGVhZiAodGIsIGgpOworCWlmIChoKQorCQlyZXR1cm4gZGNfY2hlY2tfYmFsYW5jZV9pbnRlcm5hbCh0YiwgaCk7CisJZWxzZQorCQlyZXR1cm4gZGNfY2hlY2tfYmFsYW5jZV9sZWFmKHRiLCBoKTsKIH0KIAotCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQuCiAgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCiAgKiBQYXJhbWV0ZXJzOgpAQCAtMTgwNSw0MzkgKzE4NTYsNDgxIEBACiAgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOwogICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KICAqLwotc3RhdGljIGludCBjaGVja19iYWxhbmNlIChpbnQgbW9kZSwgCi0JCQkgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCSAgaW50IGgsIAotCQkJICBpbnQgaW51bSwKLQkJCSAgaW50IHBvc19pbl9pdGVtLAotCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zX2loLAotCQkJICBjb25zdCB2b2lkICogZGF0YQotCQkJICApCitzdGF0aWMgaW50IGNoZWNrX2JhbGFuY2UoaW50IG1vZGUsCisJCQkgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkgaW50IGgsCisJCQkgaW50IGludW0sCisJCQkgaW50IHBvc19pbl9pdGVtLAorCQkJIHN0cnVjdCBpdGVtX2hlYWQgKmluc19paCwgY29uc3Qgdm9pZCAqZGF0YSkKIHsKLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuOwogCi0gIHZuID0gdGItPnRiX3ZuID0gKHN0cnVjdCB2aXJ0dWFsX25vZGUgKikodGItPnZuX2J1Zik7Ci0gIHZuLT52bl9mcmVlX3B0ciA9IChjaGFyICopKHRiLT50Yl92biArIDEpOwotICB2bi0+dm5fbW9kZSA9IG1vZGU7Ci0gIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSA9IGludW07Ci0gIHZuLT52bl9wb3NfaW5faXRlbSA9IHBvc19pbl9pdGVtOwotICB2bi0+dm5faW5zX2loID0gaW5zX2loOwotICB2bi0+dm5fZGF0YSA9IGRhdGE7CisJdm4gPSB0Yi0+dGJfdm4gPSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqKSh0Yi0+dm5fYnVmKTsKKwl2bi0+dm5fZnJlZV9wdHIgPSAoY2hhciAqKSh0Yi0+dGJfdm4gKyAxKTsKKwl2bi0+dm5fbW9kZSA9IG1vZGU7CisJdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtID0gaW51bTsKKwl2bi0+dm5fcG9zX2luX2l0ZW0gPSBwb3NfaW5faXRlbTsKKwl2bi0+dm5faW5zX2loID0gaW5zX2loOworCXZuLT52bl9kYXRhID0gZGF0YTsKIAotICBSRkFMU0UoIG1vZGUgPT0gTV9JTlNFUlQgJiYgIXZuLT52bl9pbnNfaWgsCi0JICAidnMtODI1NTogaW5zX2loIGNhbiBub3QgYmUgMCBpbiBpbnNlcnQgbW9kZSIpOworCVJGQUxTRShtb2RlID09IE1fSU5TRVJUICYmICF2bi0+dm5faW5zX2loLAorCSAgICAgICAidnMtODI1NTogaW5zX2loIGNhbiBub3QgYmUgMCBpbiBpbnNlcnQgbW9kZSIpOwogCi0gaWYgKCB0Yi0+aW5zZXJ0X3NpemVbaF0gPiAwICkKLSAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgd2hlbiBzaXplIG9mIG5vZGUgaXMgaW5jcmVhc2luZy4gKi8KLSAgIHJldHVybiBpcF9jaGVja19iYWxhbmNlICh0YiwgaCk7CisJaWYgKHRiLT5pbnNlcnRfc2l6ZVtoXSA+IDApCisJCS8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgd2hlbiBzaXplIG9mIG5vZGUgaXMgaW5jcmVhc2luZy4gKi8KKwkJcmV0dXJuIGlwX2NoZWNrX2JhbGFuY2UodGIsIGgpOwogCi0gLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuICBzaXplIG9mIG5vZGUgaXMgZGVjcmVhc2luZy4gKi8KLSByZXR1cm4gZGNfY2hlY2tfYmFsYW5jZSAodGIsIGgpOworCS8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgd2hlbiAgc2l6ZSBvZiBub2RlIGlzIGRlY3JlYXNpbmcuICovCisJcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2UodGIsIGgpOwogfQogCi0KLQogLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggaXMgdGhlIHJlYWxseSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS4qLwotc3RhdGljIGludCAgZ2V0X2RpcmVjdF9wYXJlbnQoCi0gICAgICAgICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2gKLSAgICAgICAgICAgICkgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmg7Ci0gICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoICAgICAgPSBwX3NfdGItPnRiX3BhdGg7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCk7Ci0gICAgCi0gICAgLyogV2UgYXJlIGluIHRoZSByb290IG9yIGluIHRoZSBuZXcgcm9vdC4gKi8KLSAgICBpZiAoIG5fcGF0aF9vZmZzZXQgPD0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKLQkKLQlSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUIC0gMSwKLQkJIlBBUC04MjYwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworc3RhdGljIGludCBnZXRfZGlyZWN0X3BhcmVudChzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsIGludCBuX2gpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CisJc3RydWN0IHBhdGggKnBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOworCWludCBuX3Bvc2l0aW9uLAorCSAgICBuX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKIAotCWlmICggUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQotCSAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3RiLT50Yl9zYikgKSB7Ci0JICAgIC8qIFJvb3QgaXMgbm90IGNoYW5nZWQuICovCi0JICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IE5VTEw7Ci0JICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkgPSAwOwotCSAgICByZXR1cm4gQ0FSUllfT047CisJLyogV2UgYXJlIGluIHRoZSByb290IG9yIGluIHRoZSBuZXcgcm9vdC4gKi8KKwlpZiAobl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisKKwkJUkZBTFNFKG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUIC0gMSwKKwkJICAgICAgICJQQVAtODI2MDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKKworCQlpZiAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPgorCQkgICAgYl9ibG9ja25yID09IFNCX1JPT1RfQkxPQ0socF9zX3RiLT50Yl9zYikpIHsKKwkJCS8qIFJvb3QgaXMgbm90IGNoYW5nZWQuICovCisJCQlQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkgPSBOVUxMOworCQkJUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IDA7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CS8qIFJvb3QgaXMgY2hhbmdlZCBhbmQgd2UgbXVzdCByZWNhbGN1bGF0ZSB0aGUgcGF0aC4gKi8KIAl9Ci0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7IC8qIFJvb3QgaXMgY2hhbmdlZCBhbmQgd2UgbXVzdCByZWNhbGN1bGF0ZSB0aGUgcGF0aC4gKi8KLSAgICB9CiAKLSAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkgKQotCXJldHVybiBSRVBFQVRfU0VBUkNIOyAvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlLiAqLworCWlmICghQl9JU19JTl9UUkVFCisJICAgIChwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpKQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsJLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZS4gKi8KIAotICAgIGlmICggKG5fcG9zaXRpb24gPSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSA+IEJfTlJfSVRFTVMocF9zX2JoKSApCi0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0gICAgCi0gICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19iaCwgbl9wb3NpdGlvbikgIT0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCktPmJfYmxvY2tuciApCi0JLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZS4gKi8KLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwlpZiAoKG5fcG9zaXRpb24gPQorCSAgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsCisJCQkJICBuX3BhdGhfb2Zmc2V0IC0gMSkpID4gQl9OUl9JVEVNUyhwX3NfYmgpKQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAotICAgIGlmICggYnVmZmVyX2xvY2tlZChwX3NfYmgpICkgewotCV9fd2FpdF9vbl9idWZmZXIocF9zX2JoKTsKLQlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCi0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KKwlpZiAoQl9OX0NISUxEX05VTShwX3NfYmgsIG5fcG9zaXRpb24pICE9CisJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQpLT5iX2Jsb2NrbnIpCisJCS8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyBub3QgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyZWUuICovCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCi0gICAgcmV0dXJuIENBUlJZX09OOyAvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgdW5sb2NrZWQgYW5kIHJlYWxseSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS4gICovCisJaWYgKGJ1ZmZlcl9sb2NrZWQocF9zX2JoKSkgeworCQlfX3dhaXRfb25fYnVmZmVyKHBfc19iaCk7CisJCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkKKwkJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KKworCXJldHVybiBDQVJSWV9PTjsJLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIHVubG9ja2VkIGFuZCByZWFsbHkgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuICAqLwogfQogCi0KIC8qIFVzaW5nIGxudW1bbl9oXSBhbmQgcm51bVtuX2hdIHdlIHNob3VsZCBkZXRlcm1pbmUgd2hhdCBuZWlnaGJvcnMKICAqIG9mIFNbbl9oXSB3ZQogICogbmVlZCBpbiBvcmRlciB0byBiYWxhbmNlIFNbbl9oXSwgYW5kIGdldCB0aGVtIGlmIG5lY2Vzc2FyeS4KICAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqLwotc3RhdGljIGludCAgZ2V0X25laWdoYm9ycygKLQkgICAgICAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAotCSAgICAgICAgICAgIGludCAJCSAgbl9oCi0JICAgICAgICAgICkgewotICAgIGludAkJIAluX2NoaWxkX3Bvc2l0aW9uLAotCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKLSAgICB1bnNpZ25lZCBsb25nCQluX3Nvbl9udW1iZXI7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICAqCXBfc19zYiA9IHBfc190Yi0+dGJfc2I7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKK3N0YXRpYyBpbnQgZ2V0X25laWdoYm9ycyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsIGludCBuX2gpCit7CisJaW50IG5fY2hpbGRfcG9zaXRpb24sCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKKwl1bnNpZ25lZCBsb25nIG5fc29uX251bWJlcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc190Yi0+dGJfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CiAKKwlQUk9DX0lORk9fSU5DKHBfc19zYiwgZ2V0X25laWdoYm9yc1tuX2hdKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgZ2V0X25laWdoYm9yc1sgbl9oIF0gKTsKKwlpZiAocF9zX3RiLT5sbnVtW25faF0pIHsKKwkJLyogV2UgbmVlZCBsZWZ0IG5laWdoYm9yIHRvIGJhbGFuY2UgU1tuX2hdLiAqLworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgbmVlZF9sX25laWdoYm9yW25faF0pOworCQlwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCk7CiAKLSAgICBpZiAoIHBfc190Yi0+bG51bVtuX2hdICkgewotCS8qIFdlIG5lZWQgbGVmdCBuZWlnaGJvciB0byBiYWxhbmNlIFNbbl9oXS4gKi8KLQlQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIG5lZWRfbF9uZWlnaGJvclsgbl9oIF0gKTsKLQlwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCk7Ci0JCi0JUkZBTFNFKCBwX3NfYmggPT0gcF9zX3RiLT5GTFtuX2hdICYmIAotCQkhIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCksCi0JCSJQQVAtODI3MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgcGFyZW50Iik7CisJCVJGQUxTRShwX3NfYmggPT0gcF9zX3RiLT5GTFtuX2hdICYmCisJCSAgICAgICAhUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSwKKwkJICAgICAgICJQQVAtODI3MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgcGFyZW50Iik7CiAKLQluX2NoaWxkX3Bvc2l0aW9uID0gKCBwX3NfYmggPT0gcF9zX3RiLT5GTFtuX2hdICkgPyBwX3NfdGItPmxrZXlbbl9oXSA6IEJfTlJfSVRFTVMgKHBfc190Yi0+Rkxbbl9oXSk7Ci0Jbl9zb25fbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fY2hpbGRfcG9zaXRpb24pOwotCXBfc19iaCA9IHNiX2JyZWFkKHBfc19zYiwgbl9zb25fbnVtYmVyKTsKLQlpZiAoIXBfc19iaCkKLQkgICAgcmV0dXJuIElPX0VSUk9SOwotCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgewotCSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc19iaCk7Ci0JICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgZ2V0X25laWdoYm9yc19yZXN0YXJ0WyBuX2ggXSApOwotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJbl9jaGlsZF9wb3NpdGlvbiA9CisJCSAgICAocF9zX2JoID09CisJCSAgICAgcF9zX3RiLT5GTFtuX2hdKSA/IHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyhwX3NfdGItPgorCQkJCQkJCQkgICAgICAgRkxbbl9oXSk7CisJCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKKwkJcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOworCQlpZiAoIXBfc19iaCkKKwkJCXJldHVybiBJT19FUlJPUjsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQlkZWNyZW1lbnRfYmNvdW50KHBfc19iaCk7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgZ2V0X25laWdoYm9yc19yZXN0YXJ0W25faF0pOworCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCX0KKworCQlSRkFMU0UoIUJfSVNfSU5fVFJFRShwX3NfdGItPkZMW25faF0pIHx8CisJCSAgICAgICBuX2NoaWxkX3Bvc2l0aW9uID4gQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pIHx8CisJCSAgICAgICBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbikgIT0KKwkJICAgICAgIHBfc19iaC0+Yl9ibG9ja25yLCAiUEFQLTgyNzU6IGludmFsaWQgcGFyZW50Iik7CisJCVJGQUxTRSghQl9JU19JTl9UUkVFKHBfc19iaCksICJQQVAtODI4MDogaW52YWxpZCBjaGlsZCIpOworCQlSRkFMU0UoIW5faCAmJgorCQkgICAgICAgQl9GUkVFX1NQQUNFKHBfc19iaCkgIT0KKwkJICAgICAgIE1BWF9DSElMRF9TSVpFKHBfc19iaCkgLQorCQkgICAgICAgZGNfc2l6ZShCX05fQ0hJTEQocF9zX3RiLT5GTFswXSwgbl9jaGlsZF9wb3NpdGlvbikpLAorCQkgICAgICAgIlBBUC04MjkwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgbGVmdCBuZWlnaGJvciIpOworCisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5MW25faF0pOworCQlwX3NfdGItPkxbbl9oXSA9IHBfc19iaDsKIAl9Ci0JCi0JUkZBTFNFKCAhIEJfSVNfSU5fVFJFRShwX3NfdGItPkZMW25faF0pIHx8Ci0gICAgICAgICAgICAgICAgbl9jaGlsZF9wb3NpdGlvbiA+IEJfTlJfSVRFTVMocF9zX3RiLT5GTFtuX2hdKSB8fAotCSAgICAgICAgQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fY2hpbGRfcG9zaXRpb24pICE9Ci0gICAgICAgICAgICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIsICJQQVAtODI3NTogaW52YWxpZCBwYXJlbnQiKTsKLQlSRkFMU0UoICEgQl9JU19JTl9UUkVFKHBfc19iaCksICJQQVAtODI4MDogaW52YWxpZCBjaGlsZCIpOwotCVJGQUxTRSggISBuX2ggJiYKLSAgICAgICAgICAgICAgICBCX0ZSRUVfU1BBQ0UgKHBfc19iaCkgIT0gTUFYX0NISUxEX1NJWkUgKHBfc19iaCkgLSBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GTFswXSxuX2NoaWxkX3Bvc2l0aW9uKSksCi0gICAgICAgICAgICAgICAgIlBBUC04MjkwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgbGVmdCBuZWlnaGJvciIpOwogCi0JZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9oXSk7Ci0JcF9zX3RiLT5MW25faF0gPSBwX3NfYmg7Ci0gICAgfQorCWlmIChwX3NfdGItPnJudW1bbl9oXSkgewkvKiBXZSBuZWVkIHJpZ2h0IG5laWdoYm9yIHRvIGJhbGFuY2UgU1tuX3BhdGhfb2Zmc2V0XS4gKi8KKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIG5lZWRfcl9uZWlnaGJvcltuX2hdKTsKKwkJcF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpOwogCisJCVJGQUxTRShwX3NfYmggPT0gcF9zX3RiLT5GUltuX2hdICYmCisJCSAgICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgsCisJCQkJCSAgICBuX3BhdGhfb2Zmc2V0KSA+PQorCQkgICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAorCQkgICAgICAgIlBBUC04Mjk1OiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKIAotICAgIGlmICggcF9zX3RiLT5ybnVtW25faF0gKSB7IC8qIFdlIG5lZWQgcmlnaHQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25fcGF0aF9vZmZzZXRdLiAqLwotCVBST0NfSU5GT19JTkMoIHBfc19zYiwgbmVlZF9yX25laWdoYm9yWyBuX2ggXSApOwotCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKLQkKLQlSRkFMU0UoIHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0gJiYgCi0JCVBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCkgPj0gQl9OUl9JVEVNUyhwX3NfYmgpLAotCQkiUEFQLTgyOTU6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHBhcmVudCIpOworCQluX2NoaWxkX3Bvc2l0aW9uID0KKwkJICAgIChwX3NfYmggPT0gcF9zX3RiLT5GUltuX2hdKSA/IHBfc190Yi0+cmtleVtuX2hdICsgMSA6IDA7CisJCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GUltuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKKwkJcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOworCQlpZiAoIXBfc19iaCkKKwkJCXJldHVybiBJT19FUlJPUjsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQlkZWNyZW1lbnRfYmNvdW50KHBfc19iaCk7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgZ2V0X25laWdoYm9yc19yZXN0YXJ0W25faF0pOworCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCX0KKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPlJbbl9oXSk7CisJCXBfc190Yi0+UltuX2hdID0gcF9zX2JoOwogCi0Jbl9jaGlsZF9wb3NpdGlvbiA9ICggcF9zX2JoID09IHBfc190Yi0+RlJbbl9oXSApID8gcF9zX3RiLT5ya2V5W25faF0gKyAxIDogMDsKLQluX3Nvbl9udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc190Yi0+RlJbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbik7Ci0JcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOwotCWlmICghcF9zX2JoKQotCSAgICByZXR1cm4gSU9fRVJST1I7Ci0JaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7Ci0JICAgIGRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIG5faCBdICk7Ci0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCQlSRkFMU0UoIW5faAorCQkgICAgICAgJiYgQl9GUkVFX1NQQUNFKHBfc19iaCkgIT0KKwkJICAgICAgIE1BWF9DSElMRF9TSVpFKHBfc19iaCkgLQorCQkgICAgICAgZGNfc2l6ZShCX05fQ0hJTEQocF9zX3RiLT5GUlswXSwgbl9jaGlsZF9wb3NpdGlvbikpLAorCQkgICAgICAgIlBBUC04MzAwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgcmlnaHQgbmVpZ2hib3IgKCVkICE9ICVkIC0gJWQpIiwKKwkJICAgICAgIEJfRlJFRV9TUEFDRShwX3NfYmgpLCBNQVhfQ0hJTERfU0laRShwX3NfYmgpLAorCQkgICAgICAgZGNfc2l6ZShCX05fQ0hJTEQocF9zX3RiLT5GUlswXSwgbl9jaGlsZF9wb3NpdGlvbikpKTsKKwogCX0KLQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+UltuX2hdKTsKLQlwX3NfdGItPlJbbl9oXSA9IHBfc19iaDsKLQotCVJGQUxTRSggISBuX2ggJiYgQl9GUkVFX1NQQUNFIChwX3NfYmgpICE9IE1BWF9DSElMRF9TSVpFIChwX3NfYmgpIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHBfc190Yi0+RlJbMF0sbl9jaGlsZF9wb3NpdGlvbikpLAotICAgICAgICAgICAgICAgICJQQVAtODMwMDogaW52YWxpZCBjaGlsZCBzaXplIG9mIHJpZ2h0IG5laWdoYm9yICglZCAhPSAlZCAtICVkKSIsCi0gICAgICAgICAgICAgICAgQl9GUkVFX1NQQUNFIChwX3NfYmgpLCBNQVhfQ0hJTERfU0laRSAocF9zX2JoKSwKLSAgICAgICAgICAgICAgICBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GUlswXSxuX2NoaWxkX3Bvc2l0aW9uKSkpOwotCQotICAgIH0KLSAgICByZXR1cm4gQ0FSUllfT047CisJcmV0dXJuIENBUlJZX09OOwogfQogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi12b2lkICogcmVpc2VyZnNfa21hbGxvYyAoc2l6ZV90IHNpemUsIGludCBmbGFncywgc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3ZvaWQgKnJlaXNlcmZzX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncywgc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIHZvaWQgKiB2cDsKLSAgICBzdGF0aWMgc2l6ZV90IG1hbGxvY2VkOworCXZvaWQgKnZwOworCXN0YXRpYyBzaXplX3QgbWFsbG9jZWQ7CiAKLQotICAgIHZwID0ga21hbGxvYyAoc2l6ZSwgZmxhZ3MpOwotICAgIGlmICh2cCkgewotCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICs9IHNpemU7Ci0JaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzID4gbWFsbG9jZWQgKyAyMDAwMDApIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywKLQkJCSAgICAgICJ2cy04MzAxOiByZWlzZXJmc19rbWFsbG9jOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKLQkJCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKLQkgICAgbWFsbG9jZWQgPSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jczsKKwl2cCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmICh2cCkgeworCQlSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyArPSBzaXplOworCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgPiBtYWxsb2NlZCArIDIwMDAwMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInZzLTgzMDE6IHJlaXNlcmZzX2ttYWxsb2M6IGFsbG9jYXRlZCBtZW1vcnkgJWQiLAorCQkJCQkgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOworCQkJbWFsbG9jZWQgPSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jczsKKwkJfQogCX0KLSAgICB9Ci0gICAgcmV0dXJuIHZwOworCXJldHVybiB2cDsKIH0KIAotdm9pZCByZWlzZXJmc19rZnJlZSAoY29uc3Qgdm9pZCAqIHZwLCBzaXplX3Qgc2l6ZSwgc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3ZvaWQgcmVpc2VyZnNfa2ZyZWUoY29uc3Qgdm9pZCAqdnAsIHNpemVfdCBzaXplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAga2ZyZWUgKHZwKTsKLSAgCi0gICAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgLT0gc2l6ZTsKLSAgICBpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgPCAwKQotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy04MzAyOiByZWlzZXJmc19rZnJlZTogYWxsb2NhdGVkIG1lbW9yeSAlZCIsCi0JCQkgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKKwlrZnJlZSh2cCk7CisKKwlSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyAtPSBzaXplOworCWlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA8IDApCisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInZzLTgzMDI6IHJlaXNlcmZzX2tmcmVlOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKKwkJCQkgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOwogCiB9CiAjZW5kaWYKIAotCi1zdGF0aWMgaW50IGdldF92aXJ0dWFsX25vZGVfc2l6ZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIGludCBnZXRfdmlydHVhbF9ub2RlX3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBpbnQgbWF4X251bV9vZl9pdGVtczsKLSAgICBpbnQgbWF4X251bV9vZl9lbnRyaWVzOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWludCBtYXhfbnVtX29mX2l0ZW1zOworCWludCBtYXhfbnVtX29mX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CiAKICNkZWZpbmUgTUlOX05BTUVfTEVOIDEKIAotICAgIG1heF9udW1fb2ZfaXRlbXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFKSAvIChJSF9TSVpFICsgTUlOX0lURU1fTEVOKTsKLSAgICBtYXhfbnVtX29mX2VudHJpZXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFIC0gSUhfU0laRSkgLyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAoREVIX1NJWkUgKyBNSU5fTkFNRV9MRU4pOworCW1heF9udW1fb2ZfaXRlbXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFKSAvIChJSF9TSVpFICsgTUlOX0lURU1fTEVOKTsKKwltYXhfbnVtX29mX2VudHJpZXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFIC0gSUhfU0laRSkgLworCSAgICAoREVIX1NJWkUgKyBNSU5fTkFNRV9MRU4pOwogCi0gICAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9ub2RlKSArIAotICAgICAgICAgICBtYXgobWF4X251bV9vZl9pdGVtcyAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSksCi0JICAgICAgIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSkgKyBzaXplb2Yoc3RydWN0IGRpcmVudHJ5X3VhcmVhKSArIAotICAgICAgICAgICAgICAgKG1heF9udW1fb2ZfZW50cmllcyAtIDEpICogc2l6ZW9mIChfX3UxNikpOworCXJldHVybiBzaXplb2Yoc3RydWN0IHZpcnR1YWxfbm9kZSkgKworCSAgICBtYXgobWF4X251bV9vZl9pdGVtcyAqIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9pdGVtKSwKKwkJc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pICsgc2l6ZW9mKHN0cnVjdCBkaXJlbnRyeV91YXJlYSkgKworCQkobWF4X251bV9vZl9lbnRyaWVzIC0gMSkgKiBzaXplb2YoX191MTYpKTsKIH0KIAotCi0KIC8qIG1heWJlIHdlIHNob3VsZCBmYWlsIGJhbGFuY2luZyB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSB3aGVuIGttYWxsb2MKICAgIGZhaWxzIHNldmVyYWwgdGltZXMuIEJ1dCBub3cgaXQgd2lsbCBsb29wIHVudGlsIGttYWxsb2MgZ2V0cwogICAgcmVxdWlyZWQgbWVtb3J5ICovCi1zdGF0aWMgaW50IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQorc3RhdGljIGludCBnZXRfbWVtX2Zvcl92aXJ0dWFsX25vZGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgaW50IGNoZWNrX2ZzID0gMDsKLSAgICBpbnQgc2l6ZTsKLSAgICBjaGFyICogYnVmOworCWludCBjaGVja19mcyA9IDA7CisJaW50IHNpemU7CisJY2hhciAqYnVmOwogCi0gICAgc2l6ZSA9IGdldF92aXJ0dWFsX25vZGVfc2l6ZSAodGItPnRiX3NiLCBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKKwlzaXplID0gZ2V0X3ZpcnR1YWxfbm9kZV9zaXplKHRiLT50Yl9zYiwgUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpKTsKIAotICAgIGlmIChzaXplID4gdGItPnZuX2J1Zl9zaXplKSB7Ci0JLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBmb3IgdmlydHVhbCBub2RlICovCi0JaWYgKHRiLT52bl9idWYpIHsKLQkgICAgLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJlZm9yZSAqLwotCSAgICByZWlzZXJmc19rZnJlZSAodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOwotCSAgICAvKiB0aGlzIGlzIG5vdCBuZWVkZWQgaWYga2ZyZWUgaXMgYXRvbWljICovCi0gICAgICAgICAgICBjaGVja19mcyA9IDE7Ci0JfQorCWlmIChzaXplID4gdGItPnZuX2J1Zl9zaXplKSB7CisJCS8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkgZm9yIHZpcnR1YWwgbm9kZSAqLworCQlpZiAodGItPnZuX2J1ZikgeworCQkJLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJlZm9yZSAqLworCQkJcmVpc2VyZnNfa2ZyZWUodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOworCQkJLyogdGhpcyBpcyBub3QgbmVlZGVkIGlmIGtmcmVlIGlzIGF0b21pYyAqLworCQkJY2hlY2tfZnMgPSAxOworCQl9CiAKLQkvKiB2aXJ0dWFsIG5vZGUgcmVxdWlyZXMgbm93IG1vcmUgbWVtb3J5ICovCi0JdGItPnZuX2J1Zl9zaXplID0gc2l6ZTsKKwkJLyogdmlydHVhbCBub2RlIHJlcXVpcmVzIG5vdyBtb3JlIG1lbW9yeSAqLworCQl0Yi0+dm5fYnVmX3NpemUgPSBzaXplOwogCi0JLyogZ2V0IG1lbW9yeSBmb3IgdmlydHVhbCBpdGVtICovCi0JYnVmID0gcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOLCB0Yi0+dGJfc2IpOwotCWlmICggISBidWYgKSB7Ci0JICAgIC8qIGdldHRpbmcgbWVtb3J5IHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSBtYXkgaW52b2x2ZQotICAgICAgICAgICAgICAgYmFsYW5jaW5nIG5vdyAoZHVlIHRvIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uIG9uCi0gICAgICAgICAgICAgICBkY2FjaGUgc2hyaW5raW5nKS4gU28sIHJlbGVhc2UgcGF0aCBhbmQgY29sbGVjdGVkCi0gICAgICAgICAgICAgICByZXNvdXJjZXMgaGVyZSAqLwotCSAgICBmcmVlX2J1ZmZlcnNfaW5fdGIgKHRiKTsKLQkgICAgYnVmID0gcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfTk9GUywgdGItPnRiX3NiKTsKLQkgICAgaWYgKCAhYnVmICkgeworCQkvKiBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIGl0ZW0gKi8KKwkJYnVmID0KKwkJICAgIHJlaXNlcmZzX2ttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTiwKKwkJCQkgICAgIHRiLT50Yl9zYik7CisJCWlmICghYnVmKSB7CisJCQkvKiBnZXR0aW5nIG1lbW9yeSB3aXRoIEdGUF9LRVJORUwgcHJpb3JpdHkgbWF5IGludm9sdmUKKwkJCSAgIGJhbGFuY2luZyBub3cgKGR1ZSB0byBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiBvbgorCQkJICAgZGNhY2hlIHNocmlua2luZykuIFNvLCByZWxlYXNlIHBhdGggYW5kIGNvbGxlY3RlZAorCQkJICAgcmVzb3VyY2VzIGhlcmUgKi8KKwkJCWZyZWVfYnVmZmVyc19pbl90Yih0Yik7CisJCQlidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9OT0ZTLCB0Yi0+dGJfc2IpOworCQkJaWYgKCFidWYpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkJcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAotCQkJCSAgInZzLTgzNDU6IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZTogIgotCQkJCSAgImttYWxsb2MgZmFpbGVkLiByZWlzZXJmcyBrbWFsbG9jZWQgJWQgYnl0ZXMiLAotCQkJCSAgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19rbWFsbG9jcyk7CisJCQkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsCisJCQkJCQkgInZzLTgzNDU6IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZTogIgorCQkJCQkJICJrbWFsbG9jIGZhaWxlZC4gcmVpc2VyZnMga21hbGxvY2VkICVkIGJ5dGVzIiwKKwkJCQkJCSBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT4KKwkJCQkJCSBzX2ttYWxsb2NzKTsKICNlbmRpZgotCQl0Yi0+dm5fYnVmX3NpemUgPSAwOwotCSAgICB9Ci0JICAgIHRiLT52bl9idWYgPSBidWY7Ci0JICAgIHNjaGVkdWxlKCkgOwotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJCQl0Yi0+dm5fYnVmX3NpemUgPSAwOworCQkJfQorCQkJdGItPnZuX2J1ZiA9IGJ1ZjsKKwkJCXNjaGVkdWxlKCk7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQorCisJCXRiLT52bl9idWYgPSBidWY7CiAJfQogCi0JdGItPnZuX2J1ZiA9IGJ1ZjsKLSAgICB9CisJaWYgKGNoZWNrX2ZzICYmIEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikpCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCi0gICAgaWYgKCBjaGVja19mcyAmJiBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHRiKSApCi0gICAgICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotCi0gICAgcmV0dXJuIENBUlJZX09OOworCXJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi1zdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCwgCi0JCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpIHsKLSAgaWYgKHBfc19iaCkgewotICAgIGlmIChhdG9taWNfcmVhZCAoJihwX3NfYmgtPmJfY291bnQpKSA8PSAwKSB7CitzdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoLAorCQkJCSAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpCit7CisJaWYgKHBfc19iaCkgeworCQlpZiAoYXRvbWljX3JlYWQoJihwX3NfYmgtPmJfY291bnQpKSA8PSAwKSB7CiAKLSAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0xOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IG5lZ2F0aXZlIG9yIHplcm8gcmVmZXJlbmNlIGNvdW50ZXIgZm9yIGJ1ZmZlciAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgImptYWNkLTE6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogbmVnYXRpdmUgb3IgemVybyByZWZlcmVuY2UgY291bnRlciBmb3IgYnVmZmVyICVzWyVkXSAoJWIpXG4iLAorCQkJCSAgICAgICBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisJCX0KIAotICAgIGlmICggISBidWZmZXJfdXB0b2RhdGUgKHBfc19iaCkgKSB7Ci0gICAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtMjogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IHVwIHRvIGRhdGUgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKLSAgICB9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkpIHsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgImptYWNkLTI6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGlzIG5vdCB1cCB0byBkYXRlICVzWyVkXSAoJWIpXG4iLAorCQkJCSAgICAgICBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisJCX0KIAotICAgIGlmICggISBCX0lTX0lOX1RSRUUgKHBfc19iaCkgKSB7Ci0gICAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtMzogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IGluIHRyZWUgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKLSAgICB9CisJCWlmICghQl9JU19JTl9UUkVFKHBfc19iaCkpIHsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgImptYWNkLTM6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGlzIG5vdCBpbiB0cmVlICVzWyVkXSAoJWIpXG4iLAorCQkJCSAgICAgICBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisJCX0KIAotICAgIGlmIChwX3NfYmgtPmJfYmRldiAhPSBwX3Nfc2ItPnNfYmRldikgewotCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC00OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBoYXMgd3JvbmcgZGV2aWNlICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7Ci0gICAgfQorCQlpZiAocF9zX2JoLT5iX2JkZXYgIT0gcF9zX3NiLT5zX2JkZXYpIHsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgImptYWNkLTQ6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBkZXZpY2UgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKHBfc19iaC0+Yl9zaXplICE9IHBfc19zYi0+c19ibG9ja3NpemUpIHsKLQlyZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtNTogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGJsb2Nrc2l6ZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJaWYgKHBfc19iaC0+Yl9zaXplICE9IHBfc19zYi0+c19ibG9ja3NpemUpIHsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgImptYWNkLTU6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBibG9ja3NpemUgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKHBfc19iaC0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSkgewotCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC02OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBibG9jayBudW1iZXIgdG9vIGhpZ2ggJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKLSAgICB9Ci0gIH0KKwkJaWYgKHBfc19iaC0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtNjogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgYmxvY2sgbnVtYmVyIHRvbyBoaWdoICVzWyVkXSAoJWIpXG4iLAorCQkJCSAgICAgICBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisJCX0KKwl9CiB9CiAjZWxzZQotc3RhdGljIHZvaWQgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAoc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBwX3NfYmgsIAotCQkJCSAgICBjb25zdCBjaGFyICpkZXNjciwgaW50IGxldmVsKQotezt9CitzdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoLAorCQkJCSAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpCit7OworfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgY2xlYXJfYWxsX2RpcnR5X2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICByZXR1cm4gcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMCkgOwotfQotCi1zdGF0aWMgaW50IHdhaXRfdGJfYnVmZmVyc191bnRpbF91bmxvY2tlZCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YikKK3N0YXRpYyBpbnQgY2xlYXJfYWxsX2RpcnR5X2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGxvY2tlZDsKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpbnQgcmVwZWF0X2NvdW50ZXIgPSAwOwotI2VuZGlmCi0gICAgaW50IGk7Ci0KLSAgICBkbyB7Ci0KLQlsb2NrZWQgPSBOVUxMOwotCi0JZm9yICggaSA9IHBfc190Yi0+dGJfcGF0aC0+cGF0aF9sZW5ndGg7ICFsb2NrZWQgJiYgaSA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsgaS0tICkgewotCSAgICBpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc190Yi0+dGJfcGF0aCwgaSkgKSB7Ci0JCS8qIGlmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHksIHdlIGNhbiBvbmx5IGJlIHN1cmUgdGhlIGxhc3QgYnVmZmVyCi0JCSoqIGluIHRoZSBwYXRoIGlzIGluIHRoZSB0cmVlIC0tY2xtCi0JCSovCi0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JCWlmIChQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpID09Ci0JCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgaSkpIHsKLQkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIAotCQkJCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKSwgCi0JCQkJCSAgICAiUyIsIAotCQkJCQkgICAgcF9zX3RiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aCAtIGkpOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLAotCQkJCSAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKSkpCi0JCXsKLQkJICAgIGxvY2tlZCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc190Yi0+dGJfcGF0aCwgaSk7Ci0JCX0KLQkgICAgfQotCX0KLQotCWZvciAoIGkgPSAwOyAhbG9ja2VkICYmIGkgPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbaV07IGkrKyApIHsgCi0KLQkgICAgaWYgKHBfc190Yi0+bG51bVtpXSApIHsKLQotCQlpZiAoIHBfc190Yi0+TFtpXSApIHsKLQkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+TFtpXSwgIkwiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldKSkKLQkJCWxvY2tlZCA9IHBfc190Yi0+TFtpXTsKLQkJfQotCi0JCWlmICggIWxvY2tlZCAmJiBwX3NfdGItPkZMW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GTFtpXSwgIkZMIiwgaSk7Ci0JCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5GTFtpXTsKLQkJfQotCi0JCWlmICggIWxvY2tlZCAmJiBwX3NfdGItPkNGTFtpXSApIHsKLQkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZMW2ldLCAiQ0ZMIiwgaSk7Ci0JCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZMW2ldKSkKLQkJCWxvY2tlZCA9IHBfc190Yi0+Q0ZMW2ldOwotCQl9Ci0KLQkgICAgfQotCi0JICAgIGlmICggIWxvY2tlZCAmJiAocF9zX3RiLT5ybnVtW2ldKSApIHsKLQotCQlpZiAoIHBfc190Yi0+UltpXSApIHsKLQkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+UltpXSwgIlIiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldKSkKLQkJCWxvY2tlZCA9IHBfc190Yi0+UltpXTsKLQkJfQotCi0gICAgICAgCi0JCWlmICggIWxvY2tlZCAmJiBwX3NfdGItPkZSW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSwgIkZSIiwgaSk7Ci0JCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RlJbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5GUltpXTsKLQkJfQotCi0JCWlmICggIWxvY2tlZCAmJiBwX3NfdGItPkNGUltpXSApIHsKLQkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZSW2ldLCAiQ0ZSIiwgaSk7Ci0JCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZSW2ldKSkKLQkJCWxvY2tlZCA9IHBfc190Yi0+Q0ZSW2ldOwotCQl9Ci0JICAgIH0KLQl9Ci0JLyogYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoaXMgaXMgbm90IHJlcXVpcmVkLiAgVGhlIEZFQiBsaXN0IHNlZW1zCi0JKiogdG8gYmUgZnVsbCBvZiBuZXdseSBhbGxvY2F0ZWQgbm9kZXMsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgbG9ja2VkLAotCSoqIGRpcnR5LCBvciBhbnl0aGluZyBlbHNlLgotCSoqIFRvIGJlIHNhZmUsIEknbSBwdXR0aW5nIGluIHRoZSBjaGVja3MgYW5kIHdhaXRzIGluLiAgRm9yIHRoZSBtb21lbnQsCi0JKiogdGhleSBhcmUgbmVlZGVkIHRvIGtlZXAgdGhlIGNvZGUgaW4gam91cm5hbC5jIGZyb20gY29tcGxhaW5pbmcKLQkqKiBhYm91dCB0aGUgYnVmZmVyLiAgVGhhdCBjb2RlIGlzIGluc2lkZSBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgYXMgd2VsbC4KLQkqKiAtLWNsbQotCSovCi0JZm9yICggaSA9IDA7ICFsb2NrZWQgJiYgaSA8IE1BWF9GRUJfU0laRTsgaSsrICkgeyAKLQkgICAgaWYgKCBwX3NfdGItPkZFQltpXSApIHsKLQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZFQltpXSkpCi0JCSAgICBsb2NrZWQgPSBwX3NfdGItPkZFQltpXSA7Ci0JICAgIH0KLQl9Ci0KLQlpZiAobG9ja2VkKSB7Ci0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JICAgIHJlcGVhdF9jb3VudGVyKys7Ci0JICAgIGlmICggKHJlcGVhdF9jb3VudGVyICUgMTAwMDApID09IDApIHsKLQkJcmVpc2VyZnNfd2FybmluZyAocF9zX3RiLT50Yl9zYiwKLQkJCQkgICJ3YWl0X3RiX2J1ZmZlcnNfdW50aWxfcmVsZWFzZWQoKTogdG9vIG1hbnkgIgotCQkJCSAgIml0ZXJhdGlvbnMgd2FpdGluZyBmb3IgYnVmZmVyIHRvIHVubG9jayAiCi0JCQkJICAiKCViKSIsIGxvY2tlZCk7Ci0KLQkJLyogRG9uJ3QgbG9vcCBmb3JldmVyLiAgVHJ5IHRvIHJlY292ZXIgZnJvbSBwb3NzaWJsZSBlcnJvci4gKi8KLQotCQlyZXR1cm4gKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSA/IFJFUEVBVF9TRUFSQ0ggOiBDQVJSWV9PTjsKLQkgICAgfQotI2VuZGlmCi0JICAgIF9fd2FpdF9vbl9idWZmZXIgKGxvY2tlZCk7Ci0JICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgewotCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkgICAgfQotCX0KLQotICAgIH0gd2hpbGUgKGxvY2tlZCk7Ci0KLSAgICByZXR1cm4gQ0FSUllfT047CisJcmV0dXJuIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDApOwogfQogCitzdGF0aWMgaW50IHdhaXRfdGJfYnVmZmVyc191bnRpbF91bmxvY2tlZChzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsb2NrZWQ7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaW50IHJlcGVhdF9jb3VudGVyID0gMDsKKyNlbmRpZgorCWludCBpOworCisJZG8geworCisJCWxvY2tlZCA9IE5VTEw7CisKKwkJZm9yIChpID0gcF9zX3RiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aDsKKwkJICAgICAhbG9ja2VkICYmIGkgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IGktLSkgeworCQkJaWYgKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBpKSkgeworCQkJCS8qIGlmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHksIHdlIGNhbiBvbmx5IGJlIHN1cmUgdGhlIGxhc3QgYnVmZmVyCisJCQkJICoqIGluIHRoZSBwYXRoIGlzIGluIHRoZSB0cmVlIC0tY2xtCisJCQkJICovCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCQkJaWYgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCkgPT0KKwkJCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIGkpKSB7CisJCQkJCXRiX2J1ZmZlcl9zYW5pdHlfY2hlY2socF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUgorCQkJCQkJCSAgICAgICAocF9zX3RiLT50Yl9wYXRoLAorCQkJCQkJCQlpKSwgIlMiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPnRiX3BhdGgtPgorCQkJCQkJCSAgICAgICBwYXRoX2xlbmd0aCAtIGkpOworCQkJCX0KKyNlbmRpZgorCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgIFBBVEhfT0ZGU0VUX1BCVUZGRVIKKwkJCQkJCQkgIChwX3NfdGItPnRiX3BhdGgsCisJCQkJCQkJICAgaSkpKSB7CisJCQkJCWxvY2tlZCA9CisJCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwKKwkJCQkJCQkJaSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0hFSUdIVCAmJiBwX3NfdGItPmluc2VydF9zaXplW2ldOworCQkgICAgIGkrKykgeworCisJCQlpZiAocF9zX3RiLT5sbnVtW2ldKSB7CisKKwkJCQlpZiAocF9zX3RiLT5MW2ldKSB7CisJCQkJCXRiX2J1ZmZlcl9zYW5pdHlfY2hlY2socF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgcF9zX3RiLT5MW2ldLAorCQkJCQkJCSAgICAgICAiTCIsIGkpOworCQkJCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzCisJCQkJCSAgICAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldKSkKKwkJCQkJCWxvY2tlZCA9IHBfc190Yi0+TFtpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkZMW2ldKSB7CisJCQkJCXRiX2J1ZmZlcl9zYW5pdHlfY2hlY2socF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgcF9zX3RiLT5GTFtpXSwKKwkJCQkJCQkgICAgICAgIkZMIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldKSkKKwkJCQkJCWxvY2tlZCA9IHBfc190Yi0+RkxbaV07CisJCQkJfQorCisJCQkJaWYgKCFsb2NrZWQgJiYgcF9zX3RiLT5DRkxbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkNGTFtpXSwKKwkJCQkJCQkgICAgICAgIkNGTCIsIGkpOworCQkJCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzCisJCQkJCSAgICAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5DRkxbaV07CisJCQkJfQorCisJCQl9CisKKwkJCWlmICghbG9ja2VkICYmIChwX3NfdGItPnJudW1baV0pKSB7CisKKwkJCQlpZiAocF9zX3RiLT5SW2ldKSB7CisJCQkJCXRiX2J1ZmZlcl9zYW5pdHlfY2hlY2socF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgcF9zX3RiLT5SW2ldLAorCQkJCQkJCSAgICAgICAiUiIsIGkpOworCQkJCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzCisJCQkJCSAgICAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldKSkKKwkJCQkJCWxvY2tlZCA9IHBfc190Yi0+UltpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkZSW2ldKSB7CisJCQkJCXRiX2J1ZmZlcl9zYW5pdHlfY2hlY2socF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgcF9zX3RiLT5GUltpXSwKKwkJCQkJCQkgICAgICAgIkZSIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldKSkKKwkJCQkJCWxvY2tlZCA9IHBfc190Yi0+RlJbaV07CisJCQkJfQorCisJCQkJaWYgKCFsb2NrZWQgJiYgcF9zX3RiLT5DRlJbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkNGUltpXSwKKwkJCQkJCQkgICAgICAgIkNGUiIsIGkpOworCQkJCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzCisJCQkJCSAgICAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5DRlJbaV07CisJCQkJfQorCQkJfQorCQl9CisJCS8qIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIGlzIG5vdCByZXF1aXJlZC4gIFRoZSBGRUIgbGlzdCBzZWVtcworCQkgKiogdG8gYmUgZnVsbCBvZiBuZXdseSBhbGxvY2F0ZWQgbm9kZXMsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgbG9ja2VkLAorCQkgKiogZGlydHksIG9yIGFueXRoaW5nIGVsc2UuCisJCSAqKiBUbyBiZSBzYWZlLCBJJ20gcHV0dGluZyBpbiB0aGUgY2hlY2tzIGFuZCB3YWl0cyBpbi4gIEZvciB0aGUgbW9tZW50LAorCQkgKiogdGhleSBhcmUgbmVlZGVkIHRvIGtlZXAgdGhlIGNvZGUgaW4gam91cm5hbC5jIGZyb20gY29tcGxhaW5pbmcKKwkJICoqIGFib3V0IHRoZSBidWZmZXIuICBUaGF0IGNvZGUgaXMgaW5zaWRlIENPTkZJR19SRUlTRVJGU19DSEVDSyBhcyB3ZWxsLgorCQkgKiogLS1jbG0KKwkJICovCisJCWZvciAoaSA9IDA7ICFsb2NrZWQgJiYgaSA8IE1BWF9GRUJfU0laRTsgaSsrKSB7CisJCQlpZiAocF9zX3RiLT5GRUJbaV0pIHsKKwkJCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzCisJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZFQltpXSkpCisJCQkJCWxvY2tlZCA9IHBfc190Yi0+RkVCW2ldOworCQkJfQorCQl9CisKKwkJaWYgKGxvY2tlZCkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQkJcmVwZWF0X2NvdW50ZXIrKzsKKwkJCWlmICgocmVwZWF0X2NvdW50ZXIgJSAxMDAwMCkgPT0gMCkgeworCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3RiLT50Yl9zYiwKKwkJCQkJCSAid2FpdF90Yl9idWZmZXJzX3VudGlsX3JlbGVhc2VkKCk6IHRvbyBtYW55ICIKKwkJCQkJCSAiaXRlcmF0aW9ucyB3YWl0aW5nIGZvciBidWZmZXIgdG8gdW5sb2NrICIKKwkJCQkJCSAiKCViKSIsIGxvY2tlZCk7CisKKwkJCQkvKiBEb24ndCBsb29wIGZvcmV2ZXIuICBUcnkgdG8gcmVjb3ZlciBmcm9tIHBvc3NpYmxlIGVycm9yLiAqLworCisJCQkJcmV0dXJuIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgPworCQkJCSAgICBSRVBFQVRfU0VBUkNIIDogQ0FSUllfT047CisJCQl9CisjZW5kaWYKKwkJCV9fd2FpdF9vbl9idWZmZXIobG9ja2VkKTsKKwkJCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgeworCQkJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCQkJfQorCQl9CisKKwl9IHdoaWxlIChsb2NrZWQpOworCisJcmV0dXJuIENBUlJZX09OOworfQogCiAvKiBQcmVwYXJlIGZvciBiYWxhbmNpbmcsIHRoYXQgaXMKICAqCWdldCBhbGwgbmVjZXNzYXJ5IHBhcmVudHMsIGFuZCBuZWlnaGJvcnM7CkBAIC0yMjY3LDI1MiArMjM2MCwyNjYgQEAKICAqICAgICAgICAgICAgIC0xIC0gaWYgbm9fZGlza19zcGFjZSAKICAqLwogCitpbnQgZml4X25vZGVzKGludCBuX29wX21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190Yiwgc3RydWN0IGl0ZW1faGVhZCAqcF9zX2luc19paCwJLy8gaXRlbSBoZWFkIG9mIGl0ZW0gYmVpbmcgaW5zZXJ0ZWQKKwkgICAgICBjb25zdCB2b2lkICpkYXRhCS8vIGluc2VydGVkIGl0ZW0gb3IgZGF0YSB0byBiZSBwYXN0ZWQKKyAgICApCit7CisJaW50IG5fcmV0X3ZhbHVlLCBuX2gsIG5faXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoKTsKKwlpbnQgbl9wb3NfaW5faXRlbTsKIAotaW50IGZpeF9ub2RlcyAoaW50IG5fb3BfbW9kZSwKLQkgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIAlwX3NfdGIsCi0JICAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwX3NfaW5zX2loLCAvLyBpdGVtIGhlYWQgb2YgaXRlbSBiZWluZyBpbnNlcnRlZAotCSAgICAgICBjb25zdCB2b2lkICogZGF0YSAvLyBpbnNlcnRlZCBpdGVtIG9yIGRhdGEgdG8gYmUgcGFzdGVkCi0gICAgKSB7Ci0gICAgaW50CW5fcmV0X3ZhbHVlLAotICAgIAluX2gsCi0gICAgCW5faXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoKTsKLSAgICBpbnQgbl9wb3NfaW5faXRlbTsKKwkvKiB3ZSBzZXQgd2FpdF90Yl9idWZmZXJzX3J1biB3aGVuIHdlIGhhdmUgdG8gcmVzdG9yZSBhbnkgZGlydHkgYml0cyBjbGVhcmVkCisJICoqIGR1cmluZyB3YWl0X3RiX2J1ZmZlcnNfcnVuCisJICovCisJaW50IHdhaXRfdGJfYnVmZmVyc19ydW4gPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3RiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpOwogCi0gICAgLyogd2Ugc2V0IHdhaXRfdGJfYnVmZmVyc19ydW4gd2hlbiB3ZSBoYXZlIHRvIHJlc3RvcmUgYW55IGRpcnR5IGJpdHMgY2xlYXJlZAotICAgICoqIGR1cmluZyB3YWl0X3RiX2J1ZmZlcnNfcnVuCi0gICAgKi8KLSAgICBpbnQgd2FpdF90Yl9idWZmZXJzX3J1biA9IDAgOyAKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3RiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpOworCSsrUkVJU0VSRlNfU0IocF9zX3RiLT50Yl9zYiktPnNfZml4X25vZGVzOwogCi0gICAgKysgUkVJU0VSRlNfU0IocF9zX3RiIC0+IHRiX3NiKSAtPiBzX2ZpeF9ub2RlczsKKwluX3Bvc19pbl9pdGVtID0gcF9zX3RiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKIAotICAgIG5fcG9zX2luX2l0ZW0gPSBwX3NfdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworCXBfc190Yi0+ZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24ocF9zX3RiLT50Yl9zYik7CiAKKwkvKiB3ZSBwcmVwYXJlIGFuZCBsb2cgdGhlIHN1cGVyIGhlcmUgc28gaXQgd2lsbCBhbHJlYWR5IGJlIGluIHRoZQorCSAqKiB0cmFuc2FjdGlvbiB3aGVuIGRvX2JhbGFuY2UgbmVlZHMgdG8gY2hhbmdlIGl0LgorCSAqKiBUaGlzIHdheSBkb19iYWxhbmNlIHdvbid0IGhhdmUgdG8gc2NoZWR1bGUgd2hlbiB0cnlpbmcgdG8gcHJlcGFyZQorCSAqKiB0aGUgc3VwZXIgZm9yIGxvZ2dpbmcKKwkgKi8KKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc190Yi0+dGJfc2IsCisJCQkJICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSwgMSk7CisJam91cm5hbF9tYXJrX2RpcnR5KHBfc190Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBwX3NfdGItPnRiX3NiLAorCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYikpOworCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkKKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLSAgICBwX3NfdGItPmZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChwX3NfdGItPnRiX3NiKTsKLQotICAgIC8qIHdlIHByZXBhcmUgYW5kIGxvZyB0aGUgc3VwZXIgaGVyZSBzbyBpdCB3aWxsIGFscmVhZHkgYmUgaW4gdGhlCi0gICAgKiogdHJhbnNhY3Rpb24gd2hlbiBkb19iYWxhbmNlIG5lZWRzIHRvIGNoYW5nZSBpdC4KLSAgICAqKiBUaGlzIHdheSBkb19iYWxhbmNlIHdvbid0IGhhdmUgdG8gc2NoZWR1bGUgd2hlbiB0cnlpbmcgdG8gcHJlcGFyZQotICAgICoqIHRoZSBzdXBlciBmb3IgbG9nZ2luZwotICAgICovCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3NfdGItPnRiX3NiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc190Yi0+dGJfc2IpLCAxKSA7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KHBfc190Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBwX3NfdGItPnRiX3NiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYikpIDsKLSAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCi0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0KLSAgICAvKiBpZiBpdCBwb3NzaWJsZSBpbiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiAqLwotICAgIGlmIChidWZmZXJfbG9ja2VkIChwX3NfdGJTMCkpIHsKLSAgICAgICAgX193YWl0X29uX2J1ZmZlciAocF9zX3RiUzApOwotICAgICAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCi0gICAgICAgICAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLSAgICB9Ci0KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpZiAoIGN1cl90YiApIHsKLQlwcmludF9jdXJfdGIgKCJmaXhfbm9kZXMiKTsKLQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMwNTogZml4X25vZGVzOiAgdGhlcmUgaXMgcGVuZGluZyBkb19iYWxhbmNlIik7Ci0gICAgfQotCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUgKHBfc190YlMwKSB8fCAhQl9JU19JTl9UUkVFIChwX3NfdGJTMCkpIHsKLQlyZWlzZXJmc19wYW5pYyAocF9zX3RiLT50Yl9zYiwgIlBBUC04MzIwOiBmaXhfbm9kZXM6IFNbMF0gKCViICV6KSBpcyBub3QgdXB0b2RhdGUgIgotCQkJImF0IHRoZSBiZWdpbm5pbmcgb2YgZml4X25vZGVzIG9yIG5vdCBpbiB0cmVlIChtb2RlICVjKSIsIHBfc190YlMwLCBwX3NfdGJTMCwgbl9vcF9tb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLwotICAgIHN3aXRjaCAobl9vcF9tb2RlKSB7Ci0gICAgY2FzZSBNX0lOU0VSVDoKLQlpZiAoIG5faXRlbV9udW0gPD0gMCB8fCBuX2l0ZW1fbnVtID4gQl9OUl9JVEVNUyhwX3NfdGJTMCkgKQotCSAgICByZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMzMDogZml4X25vZGVzOiBJbmNvcnJlY3QgaXRlbSBudW1iZXIgJWQgKGluIFMwIC0gJWQpIGluIGNhc2Ugb2YgaW5zZXJ0IiwKLQkJCSAgIG5faXRlbV9udW0sIEJfTlJfSVRFTVMocF9zX3RiUzApKTsKLQlicmVhazsKLSAgICBjYXNlIE1fUEFTVEU6Ci0gICAgY2FzZSBNX0RFTEVURToKLSAgICBjYXNlIE1fQ1VUOgotCWlmICggbl9pdGVtX251bSA8IDAgfHwgbl9pdGVtX251bSA+PSBCX05SX0lURU1TKHBfc190YlMwKSApIHsKLQkgICAgcHJpbnRfYmxvY2sgKHBfc190YlMwLCAwLCAtMSwgLTEpOwotCSAgICByZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMzNTogZml4X25vZGVzOiBJbmNvcnJlY3QgaXRlbSBudW1iZXIoJWQpOyBtb2RlID0gJWMgaW5zZXJ0X3NpemUgPSAlZFxuIiwgbl9pdGVtX251bSwgbl9vcF9tb2RlLCBwX3NfdGItPmluc2VydF9zaXplWzBdKTsKKwkvKiBpZiBpdCBwb3NzaWJsZSBpbiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiAqLworCWlmIChidWZmZXJfbG9ja2VkKHBfc190YlMwKSkgeworCQlfX3dhaXRfb25fYnVmZmVyKHBfc190YlMwKTsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAJfQotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JcmVpc2VyZnNfcGFuaWMocF9zX3RiLT50Yl9zYiwiUEFQLTgzNDA6IGZpeF9ub2RlczogSW5jb3JyZWN0IG1vZGUgb2Ygb3BlcmF0aW9uIik7Ci0gICAgfQorI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCWlmIChjdXJfdGIpIHsKKwkJcHJpbnRfY3VyX3RiKCJmaXhfbm9kZXMiKTsKKwkJcmVpc2VyZnNfcGFuaWMocF9zX3RiLT50Yl9zYiwKKwkJCSAgICAgICAiUEFQLTgzMDU6IGZpeF9ub2RlczogIHRoZXJlIGlzIHBlbmRpbmcgZG9fYmFsYW5jZSIpOworCX0KKworCWlmICghYnVmZmVyX3VwdG9kYXRlKHBfc190YlMwKSB8fCAhQl9JU19JTl9UUkVFKHBfc190YlMwKSkgeworCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtODMyMDogZml4X25vZGVzOiBTWzBdICglYiAleikgaXMgbm90IHVwdG9kYXRlICIKKwkJCSAgICAgICAiYXQgdGhlIGJlZ2lubmluZyBvZiBmaXhfbm9kZXMgb3Igbm90IGluIHRyZWUgKG1vZGUgJWMpIiwKKwkJCSAgICAgICBwX3NfdGJTMCwgcF9zX3RiUzAsIG5fb3BfbW9kZSk7CisJfQorCisJLyogQ2hlY2sgcGFyYW1ldGVycy4gKi8KKwlzd2l0Y2ggKG5fb3BfbW9kZSkgeworCWNhc2UgTV9JTlNFUlQ6CisJCWlmIChuX2l0ZW1fbnVtIDw9IDAgfHwgbl9pdGVtX251bSA+IEJfTlJfSVRFTVMocF9zX3RiUzApKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC04MzMwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciAlZCAoaW4gUzAgLSAlZCkgaW4gY2FzZSBvZiBpbnNlcnQiLAorCQkJCSAgICAgICBuX2l0ZW1fbnVtLCBCX05SX0lURU1TKHBfc190YlMwKSk7CisJCWJyZWFrOworCWNhc2UgTV9QQVNURToKKwljYXNlIE1fREVMRVRFOgorCWNhc2UgTV9DVVQ6CisJCWlmIChuX2l0ZW1fbnVtIDwgMCB8fCBuX2l0ZW1fbnVtID49IEJfTlJfSVRFTVMocF9zX3RiUzApKSB7CisJCQlwcmludF9ibG9jayhwX3NfdGJTMCwgMCwgLTEsIC0xKTsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsCisJCQkJICAgICAgICJQQVAtODMzNTogZml4X25vZGVzOiBJbmNvcnJlY3QgaXRlbSBudW1iZXIoJWQpOyBtb2RlID0gJWMgaW5zZXJ0X3NpemUgPSAlZFxuIiwKKwkJCQkgICAgICAgbl9pdGVtX251bSwgbl9vcF9tb2RlLAorCQkJCSAgICAgICBwX3NfdGItPmluc2VydF9zaXplWzBdKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtODM0MDogZml4X25vZGVzOiBJbmNvcnJlY3QgbW9kZSBvZiBvcGVyYXRpb24iKTsKKwl9CiAjZW5kaWYKIAotICAgIGlmIChnZXRfbWVtX2Zvcl92aXJ0dWFsX25vZGUgKHBfc190YikgPT0gUkVQRUFUX1NFQVJDSCkKLQkvLyBGSVhNRTogbWF5YmUgLUVOT01FTSB3aGVuIHRiLT52bl9idWYgPT0gMD8gTm93IGp1c3QgcmVwZWF0Ci0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJaWYgKGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZShwX3NfdGIpID09IFJFUEVBVF9TRUFSQ0gpCisJCS8vIEZJWE1FOiBtYXliZSAtRU5PTUVNIHdoZW4gdGItPnZuX2J1ZiA9PSAwPyBOb3cganVzdCByZXBlYXQKKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLQotICAgIC8qIFN0YXJ0aW5nIGZyb20gdGhlIGxlYWYgbGV2ZWw7IGZvciBhbGwgbGV2ZWxzIG5faCBvZiB0aGUgdHJlZS4gKi8KLSAgICBmb3IgKCBuX2ggPSAwOyBuX2ggPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oXTsgbl9oKysgKSB7IAotCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2RpcmVjdF9wYXJlbnQocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKLQkgICAgZ290byByZXBlYXQ7Ci0JfQotCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBjaGVja19iYWxhbmNlIChuX29wX21vZGUsIHBfc190Yiwgbl9oLCBuX2l0ZW1fbnVtLAotCQkJCQkgICBuX3Bvc19pbl9pdGVtLCBwX3NfaW5zX2loLCBkYXRhKSkgIT0gQ0FSUllfT04gKSB7Ci0JICAgIGlmICggbl9yZXRfdmFsdWUgPT0gTk9fQkFMQU5DSU5HX05FRURFRCApIHsKLQkJLyogTm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZC4gKi8KLQkJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfbmVpZ2hib3JzKHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04gKSB7Ci0JCSAgICBnb3RvIHJlcGVhdDsKKwkvKiBTdGFydGluZyBmcm9tIHRoZSBsZWFmIGxldmVsOyBmb3IgYWxsIGxldmVscyBuX2ggb2YgdGhlIHRyZWUuICovCisJZm9yIChuX2ggPSAwOyBuX2ggPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oXTsgbl9oKyspIHsKKwkJaWYgKChuX3JldF92YWx1ZSA9IGdldF9kaXJlY3RfcGFyZW50KHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04pIHsKKwkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWlmICggbl9oICE9IE1BWF9IRUlHSFQgLSAxICkgIAotCQkgICAgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7Ci0JCS8qIG9rLCBhbmFseXNpcyBhbmQgcmVzb3VyY2UgZ2F0aGVyaW5nIGFyZSBjb21wbGV0ZSAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBnb3RvIHJlcGVhdDsKLQl9CiAKLQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKLQkgICAgZ290byByZXBlYXQ7Ci0JfQotCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKLQkgICAgZ290byByZXBlYXQ7ICAgICAgICAvKiBObyBkaXNrIHNwYWNlLCBvciBzY2hlZHVsZSBvY2N1cnJlZCBhbmQKLQkJCQkgICBhbmFseXNpcyBtYXkgYmUgaW52YWxpZCBhbmQgbmVlZHMgdG8gYmUgcmVkb25lLiAqLwotCX0KLSAgICAKLQlpZiAoICEgUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2gpICkgewotCSAgICAvKiBXZSBoYXZlIGEgcG9zaXRpdmUgaW5zZXJ0IHNpemUgYnV0IG5vIG5vZGVzIGV4aXN0IG9uIHRoaXMKLQkgICAgICAgbGV2ZWwsIHRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm9vdC4gKi8KLQotCSAgICBSRkFMU0UoIHBfc190Yi0+YmxrbnVtW25faF0gIT0gMSwKLQkJICAgICJQQVAtODM1MDogY3JlYXRpbmcgbmV3IGVtcHR5IHJvb3QiKTsKLQotCSAgICBpZiAoIG5faCA8IE1BWF9IRUlHSFQgLSAxICkKLQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7Ci0JfQotCWVsc2UKLQkgICAgaWYgKCAhIFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oICsgMSkgKSB7Ci0JCWlmICggcF9zX3RiLT5ibGtudW1bbl9oXSA+IDEgKSB7Ci0JCSAgICAvKiBUaGUgdHJlZSBuZWVkcyB0byBiZSBncm93biwgc28gdGhpcyBub2RlIFNbbl9oXQotCQkgICAgICAgd2hpY2ggaXMgdGhlIHJvb3Qgbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBub2RlcywKLQkJICAgICAgIGFuZCBhIG5ldyBub2RlIChTW25faCsxXSkgd2lsbCBiZSBjcmVhdGVkIHRvCi0JCSAgICAgICBiZWNvbWUgdGhlIHJvb3Qgbm9kZS4gICovCi0JICAKLQkJICAgIFJGQUxTRSggbl9oID09IE1BWF9IRUlHSFQgLSAxLAotCQkJICAgICJQQVAtODM1NTogYXR0ZW1wdCB0byBjcmVhdGUgdG9vIGhpZ2ggb2YgYSB0cmVlIik7Ci0KLQkJICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAoRENfU0laRSArIEtFWV9TSVpFKSAqIChwX3NfdGItPmJsa251bVtuX2hdIC0gMSkgKyBEQ19TSVpFOworCQlpZiAoKG5fcmV0X3ZhbHVlID0KKwkJICAgICBjaGVja19iYWxhbmNlKG5fb3BfbW9kZSwgcF9zX3RiLCBuX2gsIG5faXRlbV9udW0sCisJCQkJICAgbl9wb3NfaW5faXRlbSwgcF9zX2luc19paCwKKwkJCQkgICBkYXRhKSkgIT0gQ0FSUllfT04pIHsKKwkJCWlmIChuX3JldF92YWx1ZSA9PSBOT19CQUxBTkNJTkdfTkVFREVEKSB7CisJCQkJLyogTm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZC4gKi8KKwkJCQlpZiAoKG5fcmV0X3ZhbHVlID0KKwkJCQkgICAgIGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJCQlnb3RvIHJlcGVhdDsKKwkJCQl9CisJCQkJaWYgKG5faCAhPSBNQVhfSEVJR0hUIC0gMSkKKwkJCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJCQkJLyogb2ssIGFuYWx5c2lzIGFuZCByZXNvdXJjZSBnYXRoZXJpbmcgYXJlIGNvbXBsZXRlICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlnb3RvIHJlcGVhdDsKIAkJfQotCQllbHNlCi0JCSAgICBpZiAoIG5faCA8IE1BWF9IRUlHSFQgLSAxICkKLQkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAwOwotCSAgICB9Ci0JICAgIGVsc2UKLQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IChEQ19TSVpFICsgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKTsKLSAgICB9CiAKLSAgICBpZiAoKG5fcmV0X3ZhbHVlID0gd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkIChwX3NfdGIpKSA9PSBDQVJSWV9PTikgewotCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgewotCSAgICB3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMSA7Ci0JICAgIG5fcmV0X3ZhbHVlID0gUkVQRUFUX1NFQVJDSCA7Ci0JICAgIGdvdG8gcmVwZWF0OyAKKwkJaWYgKChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X2VtcHR5X25vZGVzKHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04pIHsKKwkJCWdvdG8gcmVwZWF0OwkvKiBObyBkaXNrIHNwYWNlLCBvciBzY2hlZHVsZSBvY2N1cnJlZCBhbmQKKwkJCQkJICAgYW5hbHlzaXMgbWF5IGJlIGludmFsaWQgYW5kIG5lZWRzIHRvIGJlIHJlZG9uZS4gKi8KKwkJfQorCisJCWlmICghUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2gpKSB7CisJCQkvKiBXZSBoYXZlIGEgcG9zaXRpdmUgaW5zZXJ0IHNpemUgYnV0IG5vIG5vZGVzIGV4aXN0IG9uIHRoaXMKKwkJCSAgIGxldmVsLCB0aGlzIG1lYW5zIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IHJvb3QuICovCisKKwkJCVJGQUxTRShwX3NfdGItPmJsa251bVtuX2hdICE9IDEsCisJCQkgICAgICAgIlBBUC04MzUwOiBjcmVhdGluZyBuZXcgZW1wdHkgcm9vdCIpOworCisJCQlpZiAobl9oIDwgTUFYX0hFSUdIVCAtIDEpCisJCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJCX0gZWxzZSBpZiAoIVBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oICsgMSkpIHsKKwkJCWlmIChwX3NfdGItPmJsa251bVtuX2hdID4gMSkgeworCQkJCS8qIFRoZSB0cmVlIG5lZWRzIHRvIGJlIGdyb3duLCBzbyB0aGlzIG5vZGUgU1tuX2hdCisJCQkJICAgd2hpY2ggaXMgdGhlIHJvb3Qgbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBub2RlcywKKwkJCQkgICBhbmQgYSBuZXcgbm9kZSAoU1tuX2grMV0pIHdpbGwgYmUgY3JlYXRlZCB0bworCQkJCSAgIGJlY29tZSB0aGUgcm9vdCBub2RlLiAgKi8KKworCQkJCVJGQUxTRShuX2ggPT0gTUFYX0hFSUdIVCAtIDEsCisJCQkJICAgICAgICJQQVAtODM1NTogYXR0ZW1wdCB0byBjcmVhdGUgdG9vIGhpZ2ggb2YgYSB0cmVlIik7CisKKwkJCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0KKwkJCQkgICAgKERDX1NJWkUgKworCQkJCSAgICAgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSArCisJCQkJICAgIERDX1NJWkU7CisJCQl9IGVsc2UgaWYgKG5faCA8IE1BWF9IRUlHSFQgLSAxKQorCQkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAwOworCQl9IGVsc2UKKwkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPQorCQkJICAgIChEQ19TSVpFICsgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKTsKKwl9CisKKwlpZiAoKG5fcmV0X3ZhbHVlID0gd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkKHBfc190YikpID09IENBUlJZX09OKSB7CisJCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgeworCQkJd2FpdF90Yl9idWZmZXJzX3J1biA9IDE7CisJCQluX3JldF92YWx1ZSA9IFJFUEVBVF9TRUFSQ0g7CisJCQlnb3RvIHJlcGVhdDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQogCX0gZWxzZSB7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKLQl9Ci0gICAgfSBlbHNlIHsKLQl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMSA7Ci0JZ290byByZXBlYXQ7IAotICAgIH0KLQotIHJlcGVhdDoKLSAgICAvLyBmaXhfbm9kZXMgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGl0cyBjYWxjdWxhdGlvbiBkdWUgdG8KLSAgICAvLyBmaWxlc3lzdGVtIGdvdCBjaGFuZ2VkIHVuZGVyIHVzLCBsYWNrIG9mIGZyZWUgZGlzayBzcGFjZSBvciBpL28KLSAgICAvLyBmYWlsdXJlLiBJZiB0aGUgZmlyc3QgaXMgdGhlIGNhc2UgLSB0aGUgc2VhcmNoIHdpbGwgYmUKLSAgICAvLyByZXBlYXRlZC4gRm9yIG5vdyAtIGZyZWUgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBzbyBmYXIgZXhjZXB0Ci0gICAgLy8gZm9yIHRoZSBuZXcgYWxsb2NhdGVkIG5vZGVzCi0gICAgewotCWludCBpOwotCi0JLyogUmVsZWFzZSBwYXRoIGJ1ZmZlcnMuICovCi0JaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKLQkgICAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+dGJfcGF0aCkgOwotCX0gZWxzZSB7Ci0JICAgIHBhdGhyZWxzZSAocF9zX3RiLT50Yl9wYXRoKTsKLSAgICAgICAgfQkKLQkvKiBicmVsc2UgYWxsIHJlc291cmNlcyBjb2xsZWN0ZWQgZm9yIGJhbGFuY2luZyAqLwotCWZvciAoIGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrICkgewotCSAgICBpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgewotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldKTsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSk7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZMW2ldKTsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pOwotCSAgICB9Ci0KLQkgICAgYnJlbHNlIChwX3NfdGItPkxbaV0pO3Bfc190Yi0+TFtpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5SW2ldKTtwX3NfdGItPlJbaV0gPSBOVUxMOwotCSAgICBicmVsc2UgKHBfc190Yi0+RkxbaV0pO3Bfc190Yi0+RkxbaV0gPSBOVUxMOwotCSAgICBicmVsc2UgKHBfc190Yi0+RlJbaV0pO3Bfc190Yi0+RlJbaV0gPSBOVUxMOwotCSAgICBicmVsc2UgKHBfc190Yi0+Q0ZMW2ldKTtwX3NfdGItPkNGTFtpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5DRlJbaV0pO3Bfc190Yi0+Q0ZSW2ldID0gTlVMTDsKKwkJd2FpdF90Yl9idWZmZXJzX3J1biA9IDE7CisJCWdvdG8gcmVwZWF0OwogCX0KIAotCWlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7Ci0JICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKysgKSB7IAotCQlpZiAoIHBfc190Yi0+RkVCW2ldICkgewotCQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgCi0JCQkJCQkgICAgIHBfc190Yi0+RkVCW2ldKSA7CisgICAgICByZXBlYXQ6CisJLy8gZml4X25vZGVzIHdhcyB1bmFibGUgdG8gcGVyZm9ybSBpdHMgY2FsY3VsYXRpb24gZHVlIHRvCisJLy8gZmlsZXN5c3RlbSBnb3QgY2hhbmdlZCB1bmRlciB1cywgbGFjayBvZiBmcmVlIGRpc2sgc3BhY2Ugb3IgaS9vCisJLy8gZmFpbHVyZS4gSWYgdGhlIGZpcnN0IGlzIHRoZSBjYXNlIC0gdGhlIHNlYXJjaCB3aWxsIGJlCisJLy8gcmVwZWF0ZWQuIEZvciBub3cgLSBmcmVlIGFsbCByZXNvdXJjZXMgYWNxdWlyZWQgc28gZmFyIGV4Y2VwdAorCS8vIGZvciB0aGUgbmV3IGFsbG9jYXRlZCBub2RlcworCXsKKwkJaW50IGk7CisKKwkJLyogUmVsZWFzZSBwYXRoIGJ1ZmZlcnMuICovCisJCWlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7CisJCQlwYXRocmVsc2VfYW5kX3Jlc3RvcmUocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT50Yl9wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXBhdGhyZWxzZShwX3NfdGItPnRiX3BhdGgpOwogCQl9Ci0JICAgIH0KKwkJLyogYnJlbHNlIGFsbCByZXNvdXJjZXMgY29sbGVjdGVkIGZvciBiYWxhbmNpbmcgKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9IRUlHSFQ7IGkrKykgeworCQkJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT5MW2ldKTsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT5SW2ldKTsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT5GTFtpXSk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkJIHBfc190Yi0+RlJbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPgorCQkJCQkJCQkgQ0ZMW2ldKTsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT4KKwkJCQkJCQkJIENGUltpXSk7CisJCQl9CisKKwkJCWJyZWxzZShwX3NfdGItPkxbaV0pOworCQkJcF9zX3RiLT5MW2ldID0gTlVMTDsKKwkJCWJyZWxzZShwX3NfdGItPlJbaV0pOworCQkJcF9zX3RiLT5SW2ldID0gTlVMTDsKKwkJCWJyZWxzZShwX3NfdGItPkZMW2ldKTsKKwkJCXBfc190Yi0+RkxbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+RlJbaV0pOworCQkJcF9zX3RiLT5GUltpXSA9IE5VTEw7CisJCQlicmVsc2UocF9zX3RiLT5DRkxbaV0pOworCQkJcF9zX3RiLT5DRkxbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+Q0ZSW2ldKTsKKwkJCXBfc190Yi0+Q0ZSW2ldID0gTlVMTDsKKwkJfQorCisJCWlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspIHsKKwkJCQlpZiAocF9zX3RiLT5GRUJbaV0pIHsKKwkJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZFQltpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBuX3JldF92YWx1ZTsKIAl9Ci0JcmV0dXJuIG5fcmV0X3ZhbHVlOwotICAgIH0KIAogfQogCi0KIC8qIEFuYXRvbHkgd2lsbCBwcm9iYWJseSBmb3JnaXZlIG1lIHJlbmFtaW5nIHBfc190YiB0byB0Yi4gSSBqdXN0CiAgICB3YW50ZWQgdG8gbWFrZSBsaW5lcyBzaG9ydGVyICovCi12b2lkIHVuZml4X25vZGVzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit2b2lkIHVuZml4X25vZGVzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIGludAlpOworCWludCBpOwogCi0gICAgLyogUmVsZWFzZSBwYXRoIGJ1ZmZlcnMuICovCi0gICAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlICh0Yi0+dGJfc2IsIHRiLT50Yl9wYXRoKTsKKwkvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KKwlwYXRocmVsc2VfYW5kX3Jlc3RvcmUodGItPnRiX3NiLCB0Yi0+dGJfcGF0aCk7CiAKLSAgICAvKiBicmVsc2UgYWxsIHJlc291cmNlcyBjb2xsZWN0ZWQgZm9yIGJhbGFuY2luZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrICkgewotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5MW2ldKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+UltpXSk7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkZMW2ldKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+RlJbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5DRkxbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5DRlJbaV0pOworCS8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9IRUlHSFQ7IGkrKykgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5MW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIodGItPnRiX3NiLCB0Yi0+UltpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkZMW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIodGItPnRiX3NiLCB0Yi0+RlJbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5DRkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5DRlJbaV0pOwogCi0JYnJlbHNlICh0Yi0+TFtpXSk7Ci0JYnJlbHNlICh0Yi0+UltpXSk7Ci0JYnJlbHNlICh0Yi0+RkxbaV0pOwotCWJyZWxzZSAodGItPkZSW2ldKTsKLQlicmVsc2UgKHRiLT5DRkxbaV0pOwotCWJyZWxzZSAodGItPkNGUltpXSk7Ci0gICAgfQotCi0gICAgLyogZGVhbCB3aXRoIGxpc3Qgb2YgYWxsb2NhdGVkICh1c2VkIGFuZCB1bnVzZWQpIG5vZGVzICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKyApIHsKLQlpZiAoIHRiLT5GRUJbaV0gKSB7Ci0JICAgIGJfYmxvY2tucl90IGJsb2NrbnIgID0gdGItPkZFQltpXS0+Yl9ibG9ja25yIDsKLQkgICAgLyogZGUtYWxsb2NhdGVkIGJsb2NrIHdoaWNoIHdhcyBub3QgdXNlZCBieSBiYWxhbmNpbmcgYW5kCi0gICAgICAgICAgICAgICBiZm9yZ2V0IGFib3V0IGJ1ZmZlciBmb3IgaXQgKi8KLQkgICAgYnJlbHNlICh0Yi0+RkVCW2ldKTsKLQkgICAgcmVpc2VyZnNfZnJlZV9ibG9jayAodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwgTlVMTCwgYmxvY2tuciwgMCk7CisJCWJyZWxzZSh0Yi0+TFtpXSk7CisJCWJyZWxzZSh0Yi0+UltpXSk7CisJCWJyZWxzZSh0Yi0+RkxbaV0pOworCQlicmVsc2UodGItPkZSW2ldKTsKKwkJYnJlbHNlKHRiLT5DRkxbaV0pOworCQlicmVsc2UodGItPkNGUltpXSk7CiAJfQotCWlmICh0Yi0+dXNlZFtpXSkgewotCSAgICAvKiByZWxlYXNlIHVzZWQgYXMgbmV3IG5vZGVzIGluY2x1ZGluZyBhIG5ldyByb290ICovCi0JICAgIGJyZWxzZSAodGItPnVzZWRbaV0pOworCisJLyogZGVhbCB3aXRoIGxpc3Qgb2YgYWxsb2NhdGVkICh1c2VkIGFuZCB1bnVzZWQpIG5vZGVzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrKSB7CisJCWlmICh0Yi0+RkVCW2ldKSB7CisJCQliX2Jsb2NrbnJfdCBibG9ja25yID0gdGItPkZFQltpXS0+Yl9ibG9ja25yOworCQkJLyogZGUtYWxsb2NhdGVkIGJsb2NrIHdoaWNoIHdhcyBub3QgdXNlZCBieSBiYWxhbmNpbmcgYW5kCisJCQkgICBiZm9yZ2V0IGFib3V0IGJ1ZmZlciBmb3IgaXQgKi8KKwkJCWJyZWxzZSh0Yi0+RkVCW2ldKTsKKwkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwgTlVMTCwKKwkJCQkJICAgIGJsb2NrbnIsIDApOworCQl9CisJCWlmICh0Yi0+dXNlZFtpXSkgeworCQkJLyogcmVsZWFzZSB1c2VkIGFzIG5ldyBub2RlcyBpbmNsdWRpbmcgYSBuZXcgcm9vdCAqLworCQkJYnJlbHNlKHRiLT51c2VkW2ldKTsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAodGItPnZuX2J1ZikgCi0gICAgcmVpc2VyZnNfa2ZyZWUgKHRiLT52bl9idWYsIHRiLT52bl9idWZfc2l6ZSwgdGItPnRiX3NiKTsKKwlpZiAodGItPnZuX2J1ZikKKwkJcmVpc2VyZnNfa2ZyZWUodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOwogCi19IAotCi0KLQorfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaGFzaGVzLmMgYi9mcy9yZWlzZXJmcy9oYXNoZXMuYwppbmRleCAwOGQwNTA4Li4zN2MxMzA2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9oYXNoZXMuYworKysgYi9mcy9yZWlzZXJmcy9oYXNoZXMuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KIAotCiAjZGVmaW5lIERFTFRBIDB4OUUzNzc5QjkKICNkZWZpbmUgRlVMTFJPVU5EUyAxMAkJLyogMzIgaXMgb3ZlcmtpbGwsIDE2IGlzIHN0cm9uZyBjcnlwdG8gKi8KICNkZWZpbmUgUEFSVFJPVU5EUyA2CQkvKiA2IGdldHMgY29tcGxldGUgbWl4aW5nICovCkBAIC00OCwxMDUgKzQ3LDc1IEBACiAJCWgxICs9IGIxOwkJCQkJCVwKIAl9IHdoaWxlKDApCiAKLQogdTMyIGtleWVkX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKIHsKLQl1MzIga1tdID0geyAweDk0NjRhNDg1LCAweDU0MmUxYTk0LCAweDNlODQ2YmZmLCAweGI3NWJjZmMzfTsgCisJdTMyIGtbXSA9IHsgMHg5NDY0YTQ4NSwgMHg1NDJlMWE5NCwgMHgzZTg0NmJmZiwgMHhiNzViY2ZjMyB9OwogCiAJdTMyIGgwID0ga1swXSwgaDEgPSBrWzFdOwogCXUzMiBhLCBiLCBjLCBkOwogCXUzMiBwYWQ7CiAJaW50IGk7Ci0gCi0JLy8JYXNzZXJ0KGxlbiA+PSAwICYmIGxlbiA8IDI1Nik7CiAKLQlwYWQgPSAodTMyKWxlbiB8ICgodTMyKWxlbiA8PCA4KTsKKwkvLyAgICAgIGFzc2VydChsZW4gPj0gMCAmJiBsZW4gPCAyNTYpOworCisJcGFkID0gKHUzMikgbGVuIHwgKCh1MzIpIGxlbiA8PCA4KTsKIAlwYWQgfD0gcGFkIDw8IDE2OwogCi0Jd2hpbGUobGVuID49IDE2KQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKLQkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKLQkJYyA9ICh1MzIpbXNnWyA4XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA5XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWzEwXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWzExXSA8PCAyNDsKLQkJZCA9ICh1MzIpbXNnWzEyXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWzEzXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWzE0XSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWzE1XSA8PCAyNDsKLQkJCisJd2hpbGUgKGxlbiA+PSAxNikgeworCQlhID0gKHUzMikgbXNnWzBdIHwKKwkJICAgICh1MzIpIG1zZ1sxXSA8PCA4IHwgKHUzMikgbXNnWzJdIDw8IDE2IHwgKHUzMikgbXNnWzNdIDw8IDI0OworCQliID0gKHUzMikgbXNnWzRdIHwKKwkJICAgICh1MzIpIG1zZ1s1XSA8PCA4IHwgKHUzMikgbXNnWzZdIDw8IDE2IHwgKHUzMikgbXNnWzddIDw8IDI0OworCQljID0gKHUzMikgbXNnWzhdIHwKKwkJICAgICh1MzIpIG1zZ1s5XSA8PCA4IHwKKwkJICAgICh1MzIpIG1zZ1sxMF0gPDwgMTYgfCAodTMyKSBtc2dbMTFdIDw8IDI0OworCQlkID0gKHUzMikgbXNnWzEyXSB8CisJCSAgICAodTMyKSBtc2dbMTNdIDw8IDggfAorCQkgICAgKHUzMikgbXNnWzE0XSA8PCAxNiB8ICh1MzIpIG1zZ1sxNV0gPDwgMjQ7CisKIAkJVEVBQ09SRShQQVJUUk9VTkRTKTsKIAogCQlsZW4gLT0gMTY7CiAJCW1zZyArPSAxNjsKIAl9CiAKLQlpZiAobGVuID49IDEyKQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKLQkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKLQkJYyA9ICh1MzIpbXNnWyA4XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA5XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWzEwXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWzExXSA8PCAyNDsKKwlpZiAobGVuID49IDEyKSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CisJCWIgPSAodTMyKSBtc2dbNF0gfAorCQkgICAgKHUzMikgbXNnWzVdIDw8IDggfCAodTMyKSBtc2dbNl0gPDwgMTYgfCAodTMyKSBtc2dbN10gPDwgMjQ7CisJCWMgPSAodTMyKSBtc2dbOF0gfAorCQkgICAgKHUzMikgbXNnWzldIDw8IDggfAorCQkgICAgKHUzMikgbXNnWzEwXSA8PCAxNiB8ICh1MzIpIG1zZ1sxMV0gPDwgMjQ7CiAKIAkJZCA9IHBhZDsKLQkJZm9yKGkgPSAxMjsgaSA8IGxlbjsgaSsrKQotCQl7CisJCWZvciAoaSA9IDEyOyBpIDwgbGVuOyBpKyspIHsKIAkJCWQgPDw9IDg7CiAJCQlkIHw9IG1zZ1tpXTsKIAkJfQotCX0KLQllbHNlIGlmIChsZW4gPj0gOCkKLQl7Ci0JCWEgPSAodTMyKW1zZ1sgMF0gICAgICB8Ci0JCSAgICAodTMyKW1zZ1sgMV0gPDwgOCB8Ci0JCSAgICAodTMyKW1zZ1sgMl0gPDwgMTZ8Ci0JCSAgICAodTMyKW1zZ1sgM10gPDwgMjQ7Ci0JCWIgPSAodTMyKW1zZ1sgNF0gICAgICB8Ci0JCSAgICAodTMyKW1zZ1sgNV0gPDwgOCB8Ci0JCSAgICAodTMyKW1zZ1sgNl0gPDwgMTZ8Ci0JCSAgICAodTMyKW1zZ1sgN10gPDwgMjQ7CisJfSBlbHNlIGlmIChsZW4gPj0gOCkgeworCQlhID0gKHUzMikgbXNnWzBdIHwKKwkJICAgICh1MzIpIG1zZ1sxXSA8PCA4IHwgKHUzMikgbXNnWzJdIDw8IDE2IHwgKHUzMikgbXNnWzNdIDw8IDI0OworCQliID0gKHUzMikgbXNnWzRdIHwKKwkJICAgICh1MzIpIG1zZ1s1XSA8PCA4IHwgKHUzMikgbXNnWzZdIDw8IDE2IHwgKHUzMikgbXNnWzddIDw8IDI0OwogCiAJCWMgPSBkID0gcGFkOwotCQlmb3IoaSA9IDg7IGkgPCBsZW47IGkrKykKLQkJeworCQlmb3IgKGkgPSA4OyBpIDwgbGVuOyBpKyspIHsKIAkJCWMgPDw9IDg7CiAJCQljIHw9IG1zZ1tpXTsKIAkJfQotCX0KLQllbHNlIGlmIChsZW4gPj0gNCkKLQl7Ci0JCWEgPSAodTMyKW1zZ1sgMF0gICAgICB8Ci0JCSAgICAodTMyKW1zZ1sgMV0gPDwgOCB8Ci0JCSAgICAodTMyKW1zZ1sgMl0gPDwgMTZ8Ci0JCSAgICAodTMyKW1zZ1sgM10gPDwgMjQ7CisJfSBlbHNlIGlmIChsZW4gPj0gNCkgeworCQlhID0gKHUzMikgbXNnWzBdIHwKKwkJICAgICh1MzIpIG1zZ1sxXSA8PCA4IHwgKHUzMikgbXNnWzJdIDw8IDE2IHwgKHUzMikgbXNnWzNdIDw8IDI0OwogCiAJCWIgPSBjID0gZCA9IHBhZDsKLQkJZm9yKGkgPSA0OyBpIDwgbGVuOyBpKyspCi0JCXsKKwkJZm9yIChpID0gNDsgaSA8IGxlbjsgaSsrKSB7CiAJCQliIDw8PSA4OwogCQkJYiB8PSBtc2dbaV07CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlhID0gYiA9IGMgPSBkID0gcGFkOwotCQlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJCWEgPDw9IDg7CiAJCQlhIHw9IG1zZ1tpXTsKIAkJfQpAQCAtMTU1LDU1ICsxMjQsNTkgQEAKIAlURUFDT1JFKEZVTExST1VORFMpOwogCiAvKglyZXR1cm4gMDsqLwotCXJldHVybiBoMF5oMTsKKwlyZXR1cm4gaDAgXiBoMTsKIH0KIAogLyogV2hhdCBmb2xsb3dzIGluIHRoaXMgZmlsZSBpcyBjb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgYW5kIHRoZQogICogbGljZW5zaW5nIG9mIHdoYXQgZm9sbG93cyBpcyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUgKi8KIAotdTMyIHl1cmFfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKK3UzMiB5dXJhX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKIHsKLSAgICBpbnQgaiwgcG93OwotICAgIHUzMiBhLCBjOwotICAgIGludCBpOwotICAgIAotICAgIGZvciAocG93PTEsaT0xOyBpIDwgbGVuOyBpKyspIHBvdyA9IHBvdyAqIDEwOyAKLSAgICAKLSAgICBpZiAobGVuID09IDEpIAotCWEgPSBtc2dbMF0tNDg7Ci0gICAgZWxzZQotCWEgPSAobXNnWzBdIC0gNDgpICogcG93OwotICAgIAotICAgIGZvciAoaT0xOyBpIDwgbGVuOyBpKyspIHsKLQljID0gbXNnW2ldIC0gNDg7IAotCWZvciAocG93PTEsaj1pOyBqIDwgbGVuLTE7IGorKykgcG93ID0gcG93ICogMTA7IAotCWEgPSBhICsgYyAqIHBvdzsKLSAgICB9Ci0gICAgCi0gICAgZm9yICg7IGkgPCA0MDsgaSsrKSB7Ci0JYyA9ICcwJyAtIDQ4OyAKLQlmb3IgKHBvdz0xLGo9aTsgaiA8IGxlbi0xOyBqKyspIHBvdyA9IHBvdyAqIDEwOyAKLQlhID0gYSArIGMgKiBwb3c7Ci0gICAgfQotICAgIAotICAgIGZvciAoOyBpIDwgMjU2OyBpKyspIHsKLQljID0gaTsgCi0JZm9yIChwb3c9MSxqPWk7IGogPCBsZW4tMTsgaisrKSBwb3cgPSBwb3cgKiAxMDsgCi0JYSA9IGEgKyBjICogcG93OwotICAgIH0KLSAgICAKLSAgICBhID0gYSA8PCA3OwotICAgIHJldHVybiBhOworCWludCBqLCBwb3c7CisJdTMyIGEsIGM7CisJaW50IGk7CisKKwlmb3IgKHBvdyA9IDEsIGkgPSAxOyBpIDwgbGVuOyBpKyspCisJCXBvdyA9IHBvdyAqIDEwOworCisJaWYgKGxlbiA9PSAxKQorCQlhID0gbXNnWzBdIC0gNDg7CisJZWxzZQorCQlhID0gKG1zZ1swXSAtIDQ4KSAqIHBvdzsKKworCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQljID0gbXNnW2ldIC0gNDg7CisJCWZvciAocG93ID0gMSwgaiA9IGk7IGogPCBsZW4gLSAxOyBqKyspCisJCQlwb3cgPSBwb3cgKiAxMDsKKwkJYSA9IGEgKyBjICogcG93OworCX0KKworCWZvciAoOyBpIDwgNDA7IGkrKykgeworCQljID0gJzAnIC0gNDg7CisJCWZvciAocG93ID0gMSwgaiA9IGk7IGogPCBsZW4gLSAxOyBqKyspCisJCQlwb3cgPSBwb3cgKiAxMDsKKwkJYSA9IGEgKyBjICogcG93OworCX0KKworCWZvciAoOyBpIDwgMjU2OyBpKyspIHsKKwkJYyA9IGk7CisJCWZvciAocG93ID0gMSwgaiA9IGk7IGogPCBsZW4gLSAxOyBqKyspCisJCQlwb3cgPSBwb3cgKiAxMDsKKwkJYSA9IGEgKyBjICogcG93OworCX0KKworCWEgPSBhIDw8IDc7CisJcmV0dXJuIGE7CiB9CiAKLXUzMiByNV9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQordTMyIHI1X2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKIHsKLSAgdTMyIGE9MDsKLSAgd2hpbGUoKm1zZykgeyAKLSAgICBhICs9ICptc2cgPDwgNDsKLSAgICBhICs9ICptc2cgPj4gNDsKLSAgICBhICo9IDExOwotICAgIG1zZysrOwotICAgfSAKLSAgcmV0dXJuIGE7CisJdTMyIGEgPSAwOworCXdoaWxlICgqbXNnKSB7CisJCWEgKz0gKm1zZyA8PCA0OworCQlhICs9ICptc2cgPj4gNDsKKwkJYSAqPSAxMTsKKwkJbXNnKys7CisJfQorCXJldHVybiBhOwogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYyBiL2ZzL3JlaXNlcmZzL2liYWxhbmNlLmMKaW5kZXggYTM2MjEyNS4uNmM1YTcyNiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYworKysgYi9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jCkBAIC0xMCwxMyArMTAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKIC8qIHRoaXMgaXMgb25lIGFuZCBvbmx5IGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBvdXRzaWRlIChkb19iYWxhbmNlLmMpICovCi1pbnQJYmFsYW5jZV9pbnRlcm5hbCAoCi0JCQkgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiAsCi0JCQkgIGludCwKLQkJCSAgaW50LAotCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICogLAotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogCi0JCQkgICk7CitpbnQgYmFsYW5jZV9pbnRlcm5hbChzdHJ1Y3QgdHJlZV9iYWxhbmNlICosCisJCSAgICAgaW50LCBpbnQsIHN0cnVjdCBpdGVtX2hlYWQgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIAogLyogbW9kZXMgb2YgaW50ZXJuYWxfc2hpZnRfbGVmdCwgaW50ZXJuYWxfc2hpZnRfcmlnaHQgYW5kIGludGVybmFsX2luc2VydF9jaGlsZHMgKi8KICNkZWZpbmUgSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wgMApAQCAtMjcsNDY0ICsyMiw0NzQgQEAKICNkZWZpbmUgSU5URVJOQUxfSU5TRVJUX1RPX0wgNQogI2RlZmluZSBJTlRFUk5BTF9JTlNFUlRfVE9fUiA2CiAKLXN0YXRpYyB2b2lkCWludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAoCi0JCQkJCQlpbnQgc2hpZnRfbW9kZSwKLQkJCQkJCXN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkJCWludCBoLAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwKLQkJCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwKLQkJCQkJCWludCAqIGRfa2V5LAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGNmCi0JCQkJCQkpCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MoaW50IHNoaWZ0X21vZGUsCisJCQkJCSAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCQkgICBpbnQgaCwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkJICAgaW50ICpkX2tleSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqY2YpCiB7Ci0gICAgbWVtc2V0IChkZXN0X2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOwotICAgIG1lbXNldCAoc3JjX2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOwotICAgIC8qIGRlZmluZSBkZXN0LCBzcmMsIGRlc3QgcGFyZW50LCBkZXN0IHBvc2l0aW9uICovCi0gICAgc3dpdGNoIChzaGlmdF9tb2RlKSB7Ci0gICAgY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTDoJLyogdXNlZCBpbiBpbnRlcm5hbF9zaGlmdF9sZWZ0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFtoXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCSpkX2tleSA9IHRiLT5sa2V5W2hdOwotCSpjZiA9IHRiLT5DRkxbaF07Ci0JYnJlYWs7Ci0gICAgY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUzoKLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IHRiLT5MW2hdOwotCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7IC8qIGRlc3QgcG9zaXRpb24gaXMgYW5hbG9nIG9mIGRlc3QtPmJfaXRlbV9vcmRlciAqLwotCSpkX2tleSA9IHRiLT5sa2V5W2hdOwotCSpjZiA9IHRiLT5DRkxbaF07Ci0JYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IHRiLT5SW2hdOwotCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCSpkX2tleSA9IHRiLT5ya2V5W2hdOwotCSpjZiA9IHRiLT5DRlJbaF07Ci0JYnJlYWs7CisJbWVtc2V0KGRlc3RfYmksIDAsIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2luZm8pKTsKKwltZW1zZXQoc3JjX2JpLCAwLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisJLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KKwlzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKKwljYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQkqZF9rZXkgPSB0Yi0+bGtleVtoXTsKKwkJKmNmID0gdGItPkNGTFtoXTsKKwkJYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUzoKKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPkxbaF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOwkvKiBkZXN0IHBvc2l0aW9uIGlzIGFuYWxvZyBvZiBkZXN0LT5iX2l0ZW1fb3JkZXIgKi8KKwkJKmRfa2V5ID0gdGItPmxrZXlbaF07CisJCSpjZiA9IHRiLT5DRkxbaF07CisJCWJyZWFrOwogCi0gICAgY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUjoKLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SW2hdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUltoXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCSpkX2tleSA9IHRiLT5ya2V5W2hdOwotCSpjZiA9IHRiLT5DRlJbaF07Ci0JYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1JfVE9fUzoJLyogdXNlZCBpbiBpbnRlcm5hbF9zaGlmdF9sZWZ0ICovCisJCXNyY19iaS0+dGIgPSB0YjsKKwkJc3JjX2JpLT5iaV9iaCA9IHRiLT5SW2hdOworCQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GUltoXTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCSpkX2tleSA9IHRiLT5ya2V5W2hdOworCQkqY2YgPSB0Yi0+Q0ZSW2hdOworCQlicmVhazsKIAotICAgIGNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX0w6Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JYnJlYWs7Ci0JCi0gICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUzoKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCWJyZWFrOworCWNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1I6CisJCXNyY19iaS0+dGIgPSB0YjsKKwkJc3JjX2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UltoXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCSpkX2tleSA9IHRiLT5ya2V5W2hdOworCQkqY2YgPSB0Yi0+Q0ZSW2hdOworCQlicmVhazsKIAotICAgIGNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX1I6Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SW2hdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUltoXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCWJyZWFrOworCWNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX0w6CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWJyZWFrOwogCi0gICAgZGVmYXVsdDoKLQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zOiBzaGlmdCB0eXBlIGlzIHVua25vd24gKCVkKSIsIHNoaWZ0X21vZGUpOwotICAgIH0KKwljYXNlIElOVEVSTkFMX0lOU0VSVF9UT19TOgorCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlicmVhazsKKworCWNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX1I6CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUltoXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAiaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zOiBzaGlmdCB0eXBlIGlzIHVua25vd24gKCVkKSIsCisJCQkgICAgICAgc2hpZnRfbW9kZSk7CisJfQogfQogCi0KLQogLyogSW5zZXJ0IGNvdW50IG5vZGUgcG9pbnRlcnMgaW50byBidWZmZXIgY3VyIGJlZm9yZSBwb3NpdGlvbiB0byArIDEuCiAgKiBJbnNlcnQgY291bnQgaXRlbXMgaW50byBidWZmZXIgY3VyIGJlZm9yZSBwb3NpdGlvbiB0by4KICAqIEl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGFyZSBzcGVjaWZpZWQgYnkgaW5zZXJ0ZWQgYW5kIGJoIHJlc3BlY3RpdmVseS4KLSAqLyAKLXN0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9jaGlsZHMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwKLQkJCQkgICAgaW50IHRvLCBpbnQgY291bnQsCi0JCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRlZCwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoCi0gICAgKQorICovCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLAorCQkJCSAgIGludCB0bywgaW50IGNvdW50LAorCQkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKmluc2VydGVkLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGN1ciA9IGN1cl9iaS0+YmlfYmg7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogaWg7Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgbmV3X2RjWzJdOwotICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0gICAgaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjdXIgPSBjdXJfYmktPmJpX2JoOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCWludCBucjsKKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICppaDsKKwlzdHJ1Y3QgZGlza19jaGlsZCBuZXdfZGNbMl07CisJc3RydWN0IGRpc2tfY2hpbGQgKmRjOworCWludCBpOwogCi0gICAgaWYgKGNvdW50IDw9IDApCi0JcmV0dXJuOworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm47CiAKLSAgICBibGtoID0gQl9CTEtfSEVBRChjdXIpOwotICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGN1cik7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICBSRkFMU0UoIGNvdW50ID4gMiwKLQkgICAgInRvbyBtYW55IGNoaWxkcmVuICglZCkgYXJlIHRvIGJlIGluc2VydGVkIiwgY291bnQpOwotICAgIFJGQUxTRSggQl9GUkVFX1NQQUNFIChjdXIpIDwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSwKLQkgICAgIm5vIGVub3VnaCBmcmVlIHNwYWNlICglZCksIG5lZWRlZCAlZCBieXRlcyIsIAotCSAgICBCX0ZSRUVfU1BBQ0UgKGN1ciksIGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSkpOworCVJGQUxTRShjb3VudCA+IDIsICJ0b28gbWFueSBjaGlsZHJlbiAoJWQpIGFyZSB0byBiZSBpbnNlcnRlZCIsIGNvdW50KTsKKwlSRkFMU0UoQl9GUkVFX1NQQUNFKGN1cikgPCBjb3VudCAqIChLRVlfU0laRSArIERDX1NJWkUpLAorCSAgICAgICAibm8gZW5vdWdoIGZyZWUgc3BhY2UgKCVkKSwgbmVlZGVkICVkIGJ5dGVzIiwKKwkgICAgICAgQl9GUkVFX1NQQUNFKGN1ciksIGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSkpOwogCi0gICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY291bnQgZGlza19jaGlsZCAqLwotICAgIGRjID0gQl9OX0NISUxEKGN1cix0bysxKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBjb3VudCBkaXNrX2NoaWxkICovCisJZGMgPSBCX05fQ0hJTEQoY3VyLCB0byArIDEpOwogCi0gICAgbWVtbW92ZSAoZGMgKyBjb3VudCwgZGMsIChucisxLSh0bysxKSkgKiBEQ19TSVpFKTsKKwltZW1tb3ZlKGRjICsgY291bnQsIGRjLCAobnIgKyAxIC0gKHRvICsgMSkpICogRENfU0laRSk7CiAKLSAgICAvKiBjb3B5IHRvX2JlX2luc2VydCBkaXNrIGNoaWxkcmVuICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0JcHV0X2RjX3NpemUoICYobmV3X2RjW2ldKSwgTUFYX0NISUxEX1NJWkUoYmhbaV0pIC0gQl9GUkVFX1NQQUNFKGJoW2ldKSk7Ci0JcHV0X2RjX2Jsb2NrX251bWJlciggJihuZXdfZGNbaV0pLCBiaFtpXS0+Yl9ibG9ja25yICk7Ci0gICAgfQotICAgIG1lbWNweSAoZGMsIG5ld19kYywgRENfU0laRSAqIGNvdW50KTsKKwkvKiBjb3B5IHRvX2JlX2luc2VydCBkaXNrIGNoaWxkcmVuICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcHV0X2RjX3NpemUoJihuZXdfZGNbaV0pLAorCQkJICAgIE1BWF9DSElMRF9TSVpFKGJoW2ldKSAtIEJfRlJFRV9TUEFDRShiaFtpXSkpOworCQlwdXRfZGNfYmxvY2tfbnVtYmVyKCYobmV3X2RjW2ldKSwgYmhbaV0tPmJfYmxvY2tucik7CisJfQorCW1lbWNweShkYywgbmV3X2RjLCBEQ19TSVpFICogY291bnQpOwogCi0gIAotICAgIC8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGl0ZW1zICAqLwotICAgIGloID0gQl9OX1BERUxJTV9LRVkgKGN1ciwgKCh0byA9PSAtMSkgPyAwIDogdG8pKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBjb3VudCBpdGVtcyAgKi8KKwlpaCA9IEJfTl9QREVMSU1fS0VZKGN1ciwgKCh0byA9PSAtMSkgPyAwIDogdG8pKTsKIAotICAgIG1lbW1vdmUgKGloICsgY291bnQsIGloLCAobnIgLSB0bykgKiBLRVlfU0laRSArIChuciArIDEgKyBjb3VudCkgKiBEQ19TSVpFKTsKKwltZW1tb3ZlKGloICsgY291bnQsIGloLAorCQkobnIgLSB0bykgKiBLRVlfU0laRSArIChuciArIDEgKyBjb3VudCkgKiBEQ19TSVpFKTsKIAotICAgIC8qIGNvcHkgaXRlbSBoZWFkZXJzIChrZXlzKSAqLwotICAgIG1lbWNweSAoaWgsIGluc2VydGVkLCBLRVlfU0laRSk7Ci0gICAgaWYgKCBjb3VudCA+IDEgKQotCW1lbWNweSAoaWggKyAxLCBpbnNlcnRlZCArIDEsIEtFWV9TSVpFKTsKKwkvKiBjb3B5IGl0ZW0gaGVhZGVycyAoa2V5cykgKi8KKwltZW1jcHkoaWgsIGluc2VydGVkLCBLRVlfU0laRSk7CisJaWYgKGNvdW50ID4gMSkKKwkJbWVtY3B5KGloICsgMSwgaW5zZXJ0ZWQgKyAxLCBLRVlfU0laRSk7CiAKLSAgICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyBjb3VudCApOwotICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUgKSApOworCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgY291bnQpOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwKKwkJCSAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBjb3VudCAqIChEQ19TSVpFICsKKwkJCQkJCQkgICAgIEtFWV9TSVpFKSk7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGN1cl9iaS0+dGIsIGN1ciwwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoY3VyX2JpLT50YiwgY3VyLCAwKTsKIAotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgICBjaGVja19pbnRlcm5hbCAoY3VyKTsKLSAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKwljaGVja19pbnRlcm5hbChjdXIpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCiAKLSAgICBpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKLQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYyA9IEJfTl9DSElMRCAoY3VyX2JpLT5iaV9wYXJlbnQsY3VyX2JpLT5iaV9wb3NpdGlvbik7Ci0JcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyAoY291bnQgKiAoRENfU0laRSArIEtFWV9TSVpFKSkpOwotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXJfYmktPmJpX3BhcmVudCwgMCk7CisJaWYgKGN1cl9iaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0KKwkJICAgIEJfTl9DSElMRChjdXJfYmktPmJpX3BhcmVudCwgY3VyX2JpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsCisJCQkgICAgZGNfc2l6ZSh0X2RjKSArIChjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUpKSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXJfYmktPmJpX3BhcmVudCwKKwkJCQkJICAgICAgIDApOwogCi0JLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotCWNoZWNrX2ludGVybmFsIChjdXJfYmktPmJpX3BhcmVudCk7Ci0JLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAotICAgIH0KKwkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKwkJY2hlY2tfaW50ZXJuYWwoY3VyX2JpLT5iaV9wYXJlbnQpOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCX0KIAogfQogCi0KIC8qIERlbGV0ZSBkZWxfbnVtIGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIGN1ciBzdGFydGluZyBmcm9tICoKICAqIHRoZSBmaXJzdF9pJ3RoIGl0ZW0gYW5kIGZpcnN0X3AndGggcG9pbnRlcnMgcmVzcGVjdGl2ZWx5LgkJKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoCi0JCQkJCQlzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksCi0JCQkJCQlpbnQgZmlyc3RfcCwgCi0JCQkJCQlpbnQgZmlyc3RfaSwgCi0JCQkJCQlpbnQgZGVsX251bQotCQkJCQkJKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLAorCQkJCQkgICBpbnQgZmlyc3RfcCwKKwkJCQkJICAgaW50IGZpcnN0X2ksIGludCBkZWxfbnVtKQogewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjdXIgPSBjdXJfYmktPmJpX2JoOwotICBpbnQgbnI7Ci0gIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKLSAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmN1ciA9IGN1cl9iaS0+YmlfYmg7CisJaW50IG5yOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmtleTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CiAKLSAgUkZBTFNFKCBjdXIgPT0gTlVMTCwgImJ1ZmZlciBpcyAwIik7Ci0gIFJGQUxTRSggZGVsX251bSA8IDAsCi0gICAgICAgICAgIm5lZ2F0aXZlIG51bWJlciBvZiBpdGVtcyAoJWQpIGNhbiBub3QgYmUgZGVsZXRlZCIsIGRlbF9udW0pOwotICBSRkFMU0UoIGZpcnN0X3AgPCAwIHx8IGZpcnN0X3AgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyAoY3VyKSArIDEgfHwgZmlyc3RfaSA8IDAsCi0gICAgICAgICAgImZpcnN0IHBvaW50ZXIgb3JkZXIgKCVkKSA8IDAgb3IgIgotICAgICAgICAgICJubyBzbyBtYW55IHBvaW50ZXJzICglZCksIG9ubHkgKCVkKSBvciAiCi0gICAgICAgICAgImZpcnN0IGtleSBvcmRlciAlZCA8IDAiLCBmaXJzdF9wLCAKLSAgICAgICAgICBmaXJzdF9wICsgZGVsX251bSwgQl9OUl9JVEVNUyAoY3VyKSArIDEsIGZpcnN0X2kpOwotICBpZiAoIGRlbF9udW0gPT0gMCApCi0gICAgcmV0dXJuOworCVJGQUxTRShjdXIgPT0gTlVMTCwgImJ1ZmZlciBpcyAwIik7CisJUkZBTFNFKGRlbF9udW0gPCAwLAorCSAgICAgICAibmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zICglZCkgY2FuIG5vdCBiZSBkZWxldGVkIiwgZGVsX251bSk7CisJUkZBTFNFKGZpcnN0X3AgPCAwIHx8IGZpcnN0X3AgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyhjdXIpICsgMQorCSAgICAgICB8fCBmaXJzdF9pIDwgMCwKKwkgICAgICAgImZpcnN0IHBvaW50ZXIgb3JkZXIgKCVkKSA8IDAgb3IgIgorCSAgICAgICAibm8gc28gbWFueSBwb2ludGVycyAoJWQpLCBvbmx5ICglZCkgb3IgIgorCSAgICAgICAiZmlyc3Qga2V5IG9yZGVyICVkIDwgMCIsIGZpcnN0X3AsIGZpcnN0X3AgKyBkZWxfbnVtLAorCSAgICAgICBCX05SX0lURU1TKGN1cikgKyAxLCBmaXJzdF9pKTsKKwlpZiAoZGVsX251bSA9PSAwKQorCQlyZXR1cm47CiAKLSAgYmxraCA9IEJfQkxLX0hFQUQoY3VyKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoY3VyKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKIAotICBpZiAoIGZpcnN0X3AgPT0gMCAmJiBkZWxfbnVtID09IG5yICsgMSApIHsKLSAgICBSRkFMU0UoIGZpcnN0X2kgIT0gMCwgIjFzdCBkZWxldGVkIGtleSBtdXN0IGhhdmUgb3JkZXIgMCwgbm90ICVkIiwgZmlyc3RfaSk7Ci0gICAgbWFrZV9lbXB0eV9ub2RlIChjdXJfYmkpOwotICAgIHJldHVybjsKLSAgfQorCWlmIChmaXJzdF9wID09IDAgJiYgZGVsX251bSA9PSBuciArIDEpIHsKKwkJUkZBTFNFKGZpcnN0X2kgIT0gMCwKKwkJICAgICAgICIxc3QgZGVsZXRlZCBrZXkgbXVzdCBoYXZlIG9yZGVyIDAsIG5vdCAlZCIsIGZpcnN0X2kpOworCQltYWtlX2VtcHR5X25vZGUoY3VyX2JpKTsKKwkJcmV0dXJuOworCX0KIAotICBSRkFMU0UoIGZpcnN0X2kgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyAoY3VyKSwKLSAgICAgICAgICAiZmlyc3RfaSA9ICVkIGRlbF9udW0gPSAlZCAiCi0gICAgICAgICAgIm5vIHNvIG1hbnkga2V5cyAoJWQpIGluIHRoZSBub2RlICglYikoJXopIiwKLSAgICAgICAgICBmaXJzdF9pLCBkZWxfbnVtLCBmaXJzdF9pICsgZGVsX251bSwgY3VyLCBjdXIpOworCVJGQUxTRShmaXJzdF9pICsgZGVsX251bSA+IEJfTlJfSVRFTVMoY3VyKSwKKwkgICAgICAgImZpcnN0X2kgPSAlZCBkZWxfbnVtID0gJWQgIgorCSAgICAgICAibm8gc28gbWFueSBrZXlzICglZCkgaW4gdGhlIG5vZGUgKCViKSgleikiLAorCSAgICAgICBmaXJzdF9pLCBkZWxfbnVtLCBmaXJzdF9pICsgZGVsX251bSwgY3VyLCBjdXIpOwogCisJLyogZGVsZXRpbmcgKi8KKwlkYyA9IEJfTl9DSElMRChjdXIsIGZpcnN0X3ApOwogCi0gIC8qIGRlbGV0aW5nICovCi0gIGRjID0gQl9OX0NISUxEIChjdXIsIGZpcnN0X3ApOworCW1lbW1vdmUoZGMsIGRjICsgZGVsX251bSwgKG5yICsgMSAtIGZpcnN0X3AgLSBkZWxfbnVtKSAqIERDX1NJWkUpOworCWtleSA9IEJfTl9QREVMSU1fS0VZKGN1ciwgZmlyc3RfaSk7CisJbWVtbW92ZShrZXksIGtleSArIGRlbF9udW0sCisJCShuciAtIGZpcnN0X2kgLSBkZWxfbnVtKSAqIEtFWV9TSVpFICsgKG5yICsgMSAtCisJCQkJCQkgICAgICAgZGVsX251bSkgKiBEQ19TSVpFKTsKIAotICBtZW1tb3ZlIChkYywgZGMgKyBkZWxfbnVtLCAobnIgKyAxIC0gZmlyc3RfcCAtIGRlbF9udW0pICogRENfU0laRSk7Ci0gIGtleSA9IEJfTl9QREVMSU1fS0VZIChjdXIsIGZpcnN0X2kpOwotICBtZW1tb3ZlIChrZXksIGtleSArIGRlbF9udW0sIChuciAtIGZpcnN0X2kgLSBkZWxfbnVtKSAqIEtFWV9TSVpFICsgKG5yICsgMSAtIGRlbF9udW0pICogRENfU0laRSk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtKTsKKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsCisJCQkgICAgYmxraF9mcmVlX3NwYWNlKGJsa2gpICsKKwkJCSAgICAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpKSk7CiAKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoY3VyX2JpLT50YiwgY3VyLCAwKTsKKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJY2hlY2tfaW50ZXJuYWwoY3VyKTsKKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCiAKLSAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSAtIGRlbF9udW0gKTsKLSAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgYmxraF9mcmVlX3NwYWNlKGJsa2gpICsgKGRlbF9udW0gKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSApICk7CisJaWYgKGN1cl9iaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGN1cl9iaS0+YmlfcGFyZW50LCBjdXJfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywKKwkJCSAgICBkY19zaXplKHRfZGMpIC0gKGRlbF9udW0gKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSkpOwogCi0gIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyLCAwKTsKLSAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0gIGNoZWNrX2ludGVybmFsIChjdXIpOwotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAKLSAgaWYgKGN1cl9iaS0+YmlfcGFyZW50KSB7Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0gICAgdF9kYyA9IEJfTl9DSElMRCAoY3VyX2JpLT5iaV9wYXJlbnQsIGN1cl9iaS0+YmlfcG9zaXRpb24pOwotICAgIHB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpIC0gKGRlbF9udW0gKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSApICk7Ci0KLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LDApOwotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgICBjaGVja19pbnRlcm5hbCAoY3VyX2JpLT5iaV9wYXJlbnQpOwotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8gICAKLSAgfQorCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoY3VyX2JpLT50YiwgY3VyX2JpLT5iaV9wYXJlbnQsCisJCQkJCSAgICAgICAwKTsKKwkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKwkJY2hlY2tfaW50ZXJuYWwoY3VyX2JpLT5iaV9wYXJlbnQpOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCX0KIH0KIAotCiAvKiBkZWxldGUgbiBub2RlIHBvaW50ZXJzIGFuZCBpdGVtcyBzdGFydGluZyBmcm9tIGdpdmVuIHBvc2l0aW9uICovCi1zdGF0aWMgdm9pZCAgaW50ZXJuYWxfZGVsZXRlX2NoaWxkcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLCAKLQkJCQkgICAgIGludCBmcm9tLCBpbnQgbikKK3N0YXRpYyB2b2lkIGludGVybmFsX2RlbGV0ZV9jaGlsZHMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksIGludCBmcm9tLCBpbnQgbikKIHsKLSAgaW50IGlfZnJvbTsKKwlpbnQgaV9mcm9tOwogCi0gIGlfZnJvbSA9IChmcm9tID09IDApID8gZnJvbSA6IGZyb20gLSAxOworCWlfZnJvbSA9IChmcm9tID09IDApID8gZnJvbSA6IGZyb20gLSAxOwogCi0gIC8qIGRlbGV0ZSBuIHBvaW50ZXJzIHN0YXJ0aW5nIGZyb20gYGZyb20nIHBvc2l0aW9uIGluIENVUjsKLSAgICAgZGVsZXRlIG4ga2V5cyBzdGFydGluZyBmcm9tICdpX2Zyb20nIHBvc2l0aW9uIGluIENVUjsKLSAgICAgKi8KLSAgaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChjdXJfYmksIGZyb20sIGlfZnJvbSwgbik7CisJLyogZGVsZXRlIG4gcG9pbnRlcnMgc3RhcnRpbmcgZnJvbSBgZnJvbScgcG9zaXRpb24gaW4gQ1VSOworCSAgIGRlbGV0ZSBuIGtleXMgc3RhcnRpbmcgZnJvbSAnaV9mcm9tJyBwb3NpdGlvbiBpbiBDVVI7CisJICovCisJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zKGN1cl9iaSwgZnJvbSwgaV9mcm9tLCBuKTsKIH0KIAotCiAvKiBjb3B5IGNweV9udW0gbm9kZSBwb2ludGVycyBhbmQgY3B5X251bSAtIDEgaXRlbXMgZnJvbSBidWZmZXIgc3JjIHRvIGJ1ZmZlciBkZXN0CiAqIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCBtZWFucywgdGhhdCB3ZSBjb3B5IGZpcnN0IGl0ZW1zIGZyb20gc3JjIHRvIHRhaWwgb2YgZGVzdAogICogbGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgbGFzdCBpdGVtcyBmcm9tIHNyYyB0byBoZWFkIG9mIGRlc3QgCiAgKi8KLXN0YXRpYyB2b2lkIGludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMgKAotCQkJCQkgIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLAotCQkJCQkgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bQotCQkJCQkgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsCisJCQkJCSBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0pCiB7Ci0gIC8qIEFUVEVOVElPTiEgTnVtYmVyIG9mIG5vZGUgcG9pbnRlcnMgaW4gREVTVCBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gREVTVCAqCi0gICAqIGFzIGRlbGltaXRpbmcga2V5IGhhdmUgYWxyZWFkeSBpbnNlcnRlZCB0byBidWZmZXIgZGVzdC4qLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7Ci0gIGludCBucl9kZXN0LCBucl9zcmM7Ci0gIGludCBkZXN0X29yZGVyLCBzcmNfb3JkZXI7Ci0gIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKLSAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKwkvKiBBVFRFTlRJT04hIE51bWJlciBvZiBub2RlIHBvaW50ZXJzIGluIERFU1QgaXMgZXF1YWwgdG8gbnVtYmVyIG9mIGl0ZW1zIGluIERFU1QgKgorCSAqIGFzIGRlbGltaXRpbmcga2V5IGhhdmUgYWxyZWFkeSBpbnNlcnRlZCB0byBidWZmZXIgZGVzdC4qLworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCWludCBucl9kZXN0LCBucl9zcmM7CisJaW50IGRlc3Rfb3JkZXIsIHNyY19vcmRlcjsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXk7CisJc3RydWN0IGRpc2tfY2hpbGQgKmRjOwogCi0gIG5yX3NyYyA9IEJfTlJfSVRFTVMgKHNyYyk7CisJbnJfc3JjID0gQl9OUl9JVEVNUyhzcmMpOwogCi0gIFJGQUxTRSggZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLCAKLQkgICJzcmMgKCVwKSBvciBkZXN0ICglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOwotICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCi0JICAiaW52YWxpZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAoJWQpIiwgbGFzdF9maXJzdCk7Ci0gIFJGQUxTRSggbnJfc3JjIDwgY3B5X251bSAtIDEsIAotCSAgIm5vIHNvIG1hbnkgaXRlbXMgKCVkKSBpbiBzcmMgKCVkKSIsIGNweV9udW0sIG5yX3NyYyk7Ci0gIFJGQUxTRSggY3B5X251bSA8IDAsICJjcHlfbnVtIGxlc3MgdGhhbiAwICglZCkiLCBjcHlfbnVtKTsKLSAgUkZBTFNFKCBjcHlfbnVtIC0gMSArIEJfTlJfSVRFTVMoZGVzdCkgPiAoaW50KU1BWF9OUl9LRVkoZGVzdCksCi0JICAiY3B5X251bSAoJWQpICsgaXRlbSBudW1iZXIgaW4gZGVzdCAoJWQpIGNhbiBub3QgYmUgPiBNQVhfTlJfS0VZKCVkKSIsCi0JICBjcHlfbnVtLCBCX05SX0lURU1TKGRlc3QpLCBNQVhfTlJfS0VZKGRlc3QpKTsKKwlSRkFMU0UoZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLAorCSAgICAgICAic3JjICglcCkgb3IgZGVzdCAoJXApIGJ1ZmZlciBpcyAwIiwgc3JjLCBkZXN0KTsKKwlSRkFMU0UobGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCwKKwkgICAgICAgImludmFsaWQgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKCVkKSIsIGxhc3RfZmlyc3QpOworCVJGQUxTRShucl9zcmMgPCBjcHlfbnVtIC0gMSwKKwkgICAgICAgIm5vIHNvIG1hbnkgaXRlbXMgKCVkKSBpbiBzcmMgKCVkKSIsIGNweV9udW0sIG5yX3NyYyk7CisJUkZBTFNFKGNweV9udW0gPCAwLCAiY3B5X251bSBsZXNzIHRoYW4gMCAoJWQpIiwgY3B5X251bSk7CisJUkZBTFNFKGNweV9udW0gLSAxICsgQl9OUl9JVEVNUyhkZXN0KSA+IChpbnQpTUFYX05SX0tFWShkZXN0KSwKKwkgICAgICAgImNweV9udW0gKCVkKSArIGl0ZW0gbnVtYmVyIGluIGRlc3QgKCVkKSBjYW4gbm90IGJlID4gTUFYX05SX0tFWSglZCkiLAorCSAgICAgICBjcHlfbnVtLCBCX05SX0lURU1TKGRlc3QpLCBNQVhfTlJfS0VZKGRlc3QpKTsKIAotICBpZiAoIGNweV9udW0gPT0gMCApCi0gICAgcmV0dXJuOworCWlmIChjcHlfbnVtID09IDApCisJCXJldHVybjsKIAogCS8qIGNvcGluZyAqLwotICBibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKLSAgbnJfZGVzdCA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKKwlucl9kZXN0ID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIC8qZGVzdF9vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yX2Rlc3Q7Ki8KLSAgLypzcmNfb3JkZXIgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IChucl9zcmMgLSBjcHlfbnVtICsgMSkgOiAwOyovCi0gIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8JKGRlc3Rfb3JkZXIgPSAwLCBzcmNfb3JkZXIgPSBucl9zcmMgLSBjcHlfbnVtICsgMSkgOgotICAgIChkZXN0X29yZGVyID0gbnJfZGVzdCwgc3JjX29yZGVyID0gMCk7CisJLypkZXN0X29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogbnJfZGVzdDsgKi8KKwkvKnNyY19vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IDA7ICovCisJKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAoZGVzdF9vcmRlciA9IDAsIHNyY19vcmRlciA9CisJCQkJCSBucl9zcmMgLSBjcHlfbnVtICsgMSkgOiAoZGVzdF9vcmRlciA9CisJCQkJCQkJCSAgbnJfZGVzdCwKKwkJCQkJCQkJICBzcmNfb3JkZXIgPQorCQkJCQkJCQkgIDApOwogCi0gIC8qIHByZXBhcmUgc3BhY2UgZm9yIGNweV9udW0gcG9pbnRlcnMgKi8KLSAgZGMgPSBCX05fQ0hJTEQgKGRlc3QsIGRlc3Rfb3JkZXIpOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNweV9udW0gcG9pbnRlcnMgKi8KKwlkYyA9IEJfTl9DSElMRChkZXN0LCBkZXN0X29yZGVyKTsKIAotICBtZW1tb3ZlIChkYyArIGNweV9udW0sIGRjLCAobnJfZGVzdCAtIGRlc3Rfb3JkZXIpICogRENfU0laRSk7CisJbWVtbW92ZShkYyArIGNweV9udW0sIGRjLCAobnJfZGVzdCAtIGRlc3Rfb3JkZXIpICogRENfU0laRSk7CiAKIAkvKiBpbnNlcnQgcG9pbnRlcnMgKi8KLSAgbWVtY3B5IChkYywgQl9OX0NISUxEIChzcmMsIHNyY19vcmRlciksIERDX1NJWkUgKiBjcHlfbnVtKTsKKwltZW1jcHkoZGMsIEJfTl9DSElMRChzcmMsIHNyY19vcmRlciksIERDX1NJWkUgKiBjcHlfbnVtKTsKIAorCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNweV9udW0gLSAxIGl0ZW0gaGVhZGVycyAqLworCWtleSA9IEJfTl9QREVMSU1fS0VZKGRlc3QsIGRlc3Rfb3JkZXIpOworCW1lbW1vdmUoa2V5ICsgY3B5X251bSAtIDEsIGtleSwKKwkJS0VZX1NJWkUgKiAobnJfZGVzdCAtIGRlc3Rfb3JkZXIpICsgRENfU0laRSAqIChucl9kZXN0ICsKKwkJCQkJCQkgICAgICAgY3B5X251bSkpOwogCi0gIC8qIHByZXBhcmUgc3BhY2UgZm9yIGNweV9udW0gLSAxIGl0ZW0gaGVhZGVycyAqLwotICBrZXkgPSBCX05fUERFTElNX0tFWShkZXN0LCBkZXN0X29yZGVyKTsKLSAgbWVtbW92ZSAoa2V5ICsgY3B5X251bSAtIDEsIGtleSwKLQkgICBLRVlfU0laRSAqIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKyBEQ19TSVpFICogKG5yX2Rlc3QgKyBjcHlfbnVtKSk7CisJLyogaW5zZXJ0IGhlYWRlcnMgKi8KKwltZW1jcHkoa2V5LCBCX05fUERFTElNX0tFWShzcmMsIHNyY19vcmRlciksIEtFWV9TSVpFICogKGNweV9udW0gLSAxKSk7CiAKKwkvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIChjcHlfbnVtIC0gMSkpOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwKKwkJCSAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsKKwkJCQkJCSAgICAgRENfU0laRSAqIGNweV9udW0pKTsKIAotICAvKiBpbnNlcnQgaGVhZGVycyAqLwotICBtZW1jcHkgKGtleSwgQl9OX1BERUxJTV9LRVkgKHNyYywgc3JjX29yZGVyKSwgS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOwogCi0gIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAoY3B5X251bSAtIDEgKSApOwotICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLAotICAgICAgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gKEtFWV9TSVpFICogKGNweV9udW0gLSAxKSArIERDX1NJWkUgKiBjcHlfbnVtICkgKTsKKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCWNoZWNrX2ludGVybmFsKGRlc3QpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywKKwkJCSAgICBkY19zaXplKHRfZGMpICsgKEtFWV9TSVpFICogKGNweV9udW0gLSAxKSArCisJCQkJCSAgICAgRENfU0laRSAqIGNweV9udW0pKTsKIAotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0gIGNoZWNrX2ludGVybmFsIChkZXN0KTsKLSAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotCi0gIGlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKLSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLSAgICB0X2RjID0gQl9OX0NISUxEKGRlc3RfYmktPmJpX3BhcmVudCxkZXN0X2JpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsgRENfU0laRSAqIGNweV9udW0pICk7Ci0KLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0X2JpLT5iaV9wYXJlbnQsMCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIGNoZWNrX2ludGVybmFsIChkZXN0X2JpLT5iaV9wYXJlbnQpOwotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8gICAKLSAgfQorCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwKKwkJCQkJICAgICAgIDApOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbChkZXN0X2JpLT5iaV9wYXJlbnQpOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCX0KIAogfQogCi0KIC8qIENvcHkgY3B5X251bSBub2RlIHBvaW50ZXJzIGFuZCBjcHlfbnVtIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCiAgKiBEZWxldGUgY3B5X251bSAtIGRlbF9wYXIgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgogICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkvZGVsZXRlIGZpcnN0IGl0ZW1zIGZyb20gc3JjLgogICogbGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUIG1lYW5zLCB0aGF0IHdlIGNvcHkvZGVsZXRlIGxhc3QgaXRlbXMgZnJvbSBzcmMuCiAgKi8KLXN0YXRpYyB2b2lkIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIAotCQkJCQkgIHN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgCi0JCQkJCSAgaW50IGxhc3RfZmlyc3QsIGludCBjcHlfbnVtLCBpbnQgZGVsX3BhcikKK3N0YXRpYyB2b2lkIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9pbmZvICpzcmNfYmksCisJCQkJCSBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0sCisJCQkJCSBpbnQgZGVsX3BhcikKIHsKLSAgICBpbnQgZmlyc3RfcG9pbnRlcjsKLSAgICBpbnQgZmlyc3RfaXRlbTsKLSAgICAKLSAgICBpbnRlcm5hbF9jb3B5X3BvaW50ZXJzX2l0ZW1zIChkZXN0X2JpLCBzcmNfYmktPmJpX2JoLCBsYXN0X2ZpcnN0LCBjcHlfbnVtKTsKKwlpbnQgZmlyc3RfcG9pbnRlcjsKKwlpbnQgZmlyc3RfaXRlbTsKIAotICAgIGlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsJLyogc2hpZnRfbGVmdCBvY2N1cnMgKi8KLQlmaXJzdF9wb2ludGVyID0gMDsKLQlmaXJzdF9pdGVtID0gMDsKLQkvKiBkZWxldGUgY3B5X251bSAtIGRlbF9wYXIgcG9pbnRlcnMgYW5kIGtleXMgc3RhcnRpbmcgZm9yIHBvaW50ZXJzIHdpdGggZmlyc3RfcG9pbnRlciwgCi0JICAgZm9yIGtleSAtIHdpdGggZmlyc3RfaXRlbSAqLwotCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoc3JjX2JpLCBmaXJzdF9wb2ludGVyLCBmaXJzdF9pdGVtLCBjcHlfbnVtIC0gZGVsX3Bhcik7Ci0gICAgfSBlbHNlIHsJCQkvKiBzaGlmdF9yaWdodCBvY2N1cnMgKi8KLQlpbnQgaSwgajsKKwlpbnRlcm5hbF9jb3B5X3BvaW50ZXJzX2l0ZW1zKGRlc3RfYmksIHNyY19iaS0+YmlfYmgsIGxhc3RfZmlyc3QsCisJCQkJICAgICBjcHlfbnVtKTsKIAotCWkgPSAoIGNweV9udW0gLSBkZWxfcGFyID09ICggaiA9IEJfTlJfSVRFTVMoc3JjX2JpLT5iaV9iaCkpICsgMSApID8gMCA6IGogLSBjcHlfbnVtICsgZGVsX3BhcjsKKwlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CS8qIHNoaWZ0X2xlZnQgb2NjdXJzICovCisJCWZpcnN0X3BvaW50ZXIgPSAwOworCQlmaXJzdF9pdGVtID0gMDsKKwkJLyogZGVsZXRlIGNweV9udW0gLSBkZWxfcGFyIHBvaW50ZXJzIGFuZCBrZXlzIHN0YXJ0aW5nIGZvciBwb2ludGVycyB3aXRoIGZpcnN0X3BvaW50ZXIsIAorCQkgICBmb3Iga2V5IC0gd2l0aCBmaXJzdF9pdGVtICovCisJCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyhzcmNfYmksIGZpcnN0X3BvaW50ZXIsCisJCQkJCSAgICAgICBmaXJzdF9pdGVtLCBjcHlfbnVtIC0gZGVsX3Bhcik7CisJfSBlbHNlIHsJCS8qIHNoaWZ0X3JpZ2h0IG9jY3VycyAqLworCQlpbnQgaSwgajsKIAotCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoc3JjX2JpLCBqICsgMSAtIGNweV9udW0gKyBkZWxfcGFyLCBpLCBjcHlfbnVtIC0gZGVsX3Bhcik7Ci0gICAgfQorCQlpID0gKGNweV9udW0gLSBkZWxfcGFyID09CisJCSAgICAgKGogPQorCQkgICAgICBCX05SX0lURU1TKHNyY19iaS0+YmlfYmgpKSArIDEpID8gMCA6IGogLSBjcHlfbnVtICsKKwkJICAgIGRlbF9wYXI7CisKKwkJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zKHNyY19iaSwKKwkJCQkJICAgICAgIGogKyAxIC0gY3B5X251bSArIGRlbF9wYXIsIGksCisJCQkJCSAgICAgICBjcHlfbnVtIC0gZGVsX3Bhcik7CisJfQogfQogCiAvKiBJbnNlcnQgbl9zcmMndGgga2V5IG9mIGJ1ZmZlciBzcmMgYmVmb3JlIG5fZGVzdCd0aCBrZXkgb2YgYnVmZmVyIGRlc3QuICovCi1zdGF0aWMgdm9pZCBpbnRlcm5hbF9pbnNlcnRfa2V5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCAKLQkJCQkgaW50IGRlc3RfcG9zaXRpb25fYmVmb3JlLCAgICAgICAgICAgICAgICAgLyogaW5zZXJ0IGtleSBiZWZvcmUga2V5IHdpdGggbl9kZXN0IG51bWJlciAqLwotCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIAotCQkJCSBpbnQgc3JjX3Bvc2l0aW9uKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfaW5zZXJ0X2tleShzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksIGludCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwJLyogaW5zZXJ0IGtleSBiZWZvcmUga2V5IHdpdGggbl9kZXN0IG51bWJlciAqLworCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqc3JjLCBpbnQgc3JjX3Bvc2l0aW9uKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKLSAgICBpbnQgbnI7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJaW50IG5yOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmtleTsKIAotICAgIFJGQUxTRSggZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLAotCSAgICAic291cmNlKCVwKSBvciBkZXN0KCVwKSBidWZmZXIgaXMgMCIsIHNyYywgZGVzdCk7Ci0gICAgUkZBTFNFKCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSA8IDAgfHwgc3JjX3Bvc2l0aW9uIDwgMCwKLQkgICAgInNvdXJjZSglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciBsZXNzIHRoYW4gMCIsIAotCSAgICBzcmNfcG9zaXRpb24sIGRlc3RfcG9zaXRpb25fYmVmb3JlKTsKLSAgICBSRkFMU0UoIGRlc3RfcG9zaXRpb25fYmVmb3JlID4gQl9OUl9JVEVNUyAoZGVzdCkgfHwgCi0JICAgIHNyY19wb3NpdGlvbiA+PSBCX05SX0lURU1TKHNyYyksCi0JICAgICJpbnZhbGlkIHBvc2l0aW9uIGluIGRlc3QgKCVkIChrZXkgbnVtYmVyICVkKSkgb3IgaW4gc3JjICglZCAoa2V5IG51bWJlciAlZCkpIiwKLQkgICAgZGVzdF9wb3NpdGlvbl9iZWZvcmUsIEJfTlJfSVRFTVMgKGRlc3QpLCAKLQkgICAgc3JjX3Bvc2l0aW9uLCBCX05SX0lURU1TKHNyYykpOwotICAgIFJGQUxTRSggQl9GUkVFX1NQQUNFIChkZXN0KSA8IEtFWV9TSVpFLAotCSAgICAibm8gZW5vdWdoIGZyZWUgc3BhY2UgKCVkKSBpbiBkZXN0IGJ1ZmZlciIsIEJfRlJFRV9TUEFDRSAoZGVzdCkpOworCVJGQUxTRShkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICAgICJzb3VyY2UoJXApIG9yIGRlc3QoJXApIGJ1ZmZlciBpcyAwIiwgc3JjLCBkZXN0KTsKKwlSRkFMU0UoZGVzdF9wb3NpdGlvbl9iZWZvcmUgPCAwIHx8IHNyY19wb3NpdGlvbiA8IDAsCisJICAgICAgICJzb3VyY2UoJWQpIG9yIGRlc3QoJWQpIGtleSBudW1iZXIgbGVzcyB0aGFuIDAiLAorCSAgICAgICBzcmNfcG9zaXRpb24sIGRlc3RfcG9zaXRpb25fYmVmb3JlKTsKKwlSRkFMU0UoZGVzdF9wb3NpdGlvbl9iZWZvcmUgPiBCX05SX0lURU1TKGRlc3QpIHx8CisJICAgICAgIHNyY19wb3NpdGlvbiA+PSBCX05SX0lURU1TKHNyYyksCisJICAgICAgICJpbnZhbGlkIHBvc2l0aW9uIGluIGRlc3QgKCVkIChrZXkgbnVtYmVyICVkKSkgb3IgaW4gc3JjICglZCAoa2V5IG51bWJlciAlZCkpIiwKKwkgICAgICAgZGVzdF9wb3NpdGlvbl9iZWZvcmUsIEJfTlJfSVRFTVMoZGVzdCksCisJICAgICAgIHNyY19wb3NpdGlvbiwgQl9OUl9JVEVNUyhzcmMpKTsKKwlSRkFMU0UoQl9GUkVFX1NQQUNFKGRlc3QpIDwgS0VZX1NJWkUsCisJICAgICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpIGluIGRlc3QgYnVmZmVyIiwgQl9GUkVFX1NQQUNFKGRlc3QpKTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOwotICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgaW5zZXJ0aW5nIGtleSAqLwotICAgIGtleSA9IEJfTl9QREVMSU1fS0VZIChkZXN0LCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSk7Ci0gICAgbWVtbW92ZSAoa2V5ICsgMSwga2V5LCAobnIgLSBkZXN0X3Bvc2l0aW9uX2JlZm9yZSkgKiBLRVlfU0laRSArIChuciArIDEpICogRENfU0laRSk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgaW5zZXJ0aW5nIGtleSAqLworCWtleSA9IEJfTl9QREVMSU1fS0VZKGRlc3QsIGRlc3RfcG9zaXRpb25fYmVmb3JlKTsKKwltZW1tb3ZlKGtleSArIDEsIGtleSwKKwkJKG5yIC0gZGVzdF9wb3NpdGlvbl9iZWZvcmUpICogS0VZX1NJWkUgKyAobnIgKyAxKSAqIERDX1NJWkUpOwogCi0gICAgLyogaW5zZXJ0IGtleSAqLwotICAgIG1lbWNweSAoa2V5LCBCX05fUERFTElNX0tFWShzcmMsIHNyY19wb3NpdGlvbiksIEtFWV9TSVpFKTsKKwkvKiBpbnNlcnQga2V5ICovCisJbWVtY3B5KGtleSwgQl9OX1BERUxJTV9LRVkoc3JjLCBzcmNfcG9zaXRpb24pLCBLRVlfU0laRSk7CiAKLSAgICAvKiBDaGFuZ2UgZGlydCwgZnJlZSBzcGFjZSwgaXRlbSBudW1iZXIgZmllbGRzLiAqLworCS8qIENoYW5nZSBkaXJ0LCBmcmVlIHNwYWNlLCBpdGVtIG51bWJlciBmaWVsZHMuICovCiAKLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gS0VZX1NJWkUgKTsKKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIDEpOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gS0VZX1NJWkUpOwogCi0gICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGRlc3RfYmktPnRiLCBkZXN0LCAwKTsKIAotICAgIGlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKLQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLQl0X2RjID0gQl9OX0NISUxEKGRlc3RfYmktPmJpX3BhcmVudCxkZXN0X2JpLT5iaV9wb3NpdGlvbik7Ci0JcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyBLRVlfU0laRSApOworCWlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisJCXRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LCBkZXN0X2JpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgKyBLRVlfU0laRSk7CiAKLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0X2JpLT5iaV9wYXJlbnQsMCk7Ci0gICAgfQorCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwKKwkJCQkJICAgICAgIDApOworCX0KIH0KIAotCi0KIC8qIEluc2VydCBkX2tleSd0aCAoZGVsaW1pdGluZykga2V5IGZyb20gYnVmZmVyIGNmbCB0byB0YWlsIG9mIGRlc3QuIAogICogQ29weSBwb2ludGVyX2Ftb3VudCBub2RlIHBvaW50ZXJzIGFuZCBwb2ludGVyX2Ftb3VudCAtIDEgaXRlbXMgZnJvbSBidWZmZXIgc3JjIHRvIGJ1ZmZlciBkZXN0LgogICogUmVwbGFjZSAgZF9rZXkndGgga2V5IGluIGJ1ZmZlciBjZmwuCiAgKiBEZWxldGUgcG9pbnRlcl9hbW91bnQgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgogICovCiAvKiB0aGlzIGNhbiBiZSBpbnZva2VkIGJvdGggdG8gc2hpZnQgZnJvbSBTIHRvIEwgYW5kIGZyb20gUiB0byBTICovCi1zdGF0aWMgdm9pZAlpbnRlcm5hbF9zaGlmdF9sZWZ0ICgKLQkJCQkgICAgIGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fTCB8IElOVEVSTkFMX0ZST01fUl9UT19TICovCi0JCQkJICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCQkJICAgICBpbnQgaCwKLQkJCQkgICAgIGludCBwb2ludGVyX2Ftb3VudAotCQkJCSAgICAgKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfc2hpZnRfbGVmdChpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX0wgfCBJTlRFUk5BTF9GUk9NX1JfVE9fUyAqLworCQkJCXN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCWludCBoLCBpbnQgcG9pbnRlcl9hbW91bnQpCiB7Ci0gIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGNmOwotICBpbnQgZF9rZXlfcG9zaXRpb247CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNmOworCWludCBkX2tleV9wb3NpdGlvbjsKIAotICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOworCWludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyhtb2RlLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksCisJCQkJICAgICAgICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKIAotICAvKnByaW50aygicG9pbnRlcl9hbW91bnQgPSAlZFxuIixwb2ludGVyX2Ftb3VudCk7Ki8KKwkvKnByaW50aygicG9pbnRlcl9hbW91bnQgPSAlZFxuIixwb2ludGVyX2Ftb3VudCk7ICovCiAKLSAgaWYgKHBvaW50ZXJfYW1vdW50KSB7Ci0gICAgLyogaW5zZXJ0IGRlbGltaXRpbmcga2V5IGZyb20gY29tbW9uIGZhdGhlciBvZiBkZXN0IGFuZCBzcmMgdG8gbm9kZSBkZXN0IGludG8gcG9zaXRpb24gQl9OUl9JVEVNKGRlc3QpICovCi0gICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLCBkX2tleV9wb3NpdGlvbik7CisJaWYgKHBvaW50ZXJfYW1vdW50KSB7CisJCS8qIGluc2VydCBkZWxpbWl0aW5nIGtleSBmcm9tIGNvbW1vbiBmYXRoZXIgb2YgZGVzdCBhbmQgc3JjIHRvIG5vZGUgZGVzdCBpbnRvIHBvc2l0aW9uIEJfTlJfSVRFTShkZXN0KSAqLworCQlpbnRlcm5hbF9pbnNlcnRfa2V5KCZkZXN0X2JpLCBCX05SX0lURU1TKGRlc3RfYmkuYmlfYmgpLCBjZiwKKwkJCQkgICAgZF9rZXlfcG9zaXRpb24pOwogCi0gICAgaWYgKEJfTlJfSVRFTVMoc3JjX2JpLmJpX2JoKSA9PSBwb2ludGVyX2Ftb3VudCAtIDEpIHsKLSAgICAgIGlmIChzcmNfYmkuYmlfcG9zaXRpb24vKnNyYy0+Yl9pdGVtX29yZGVyKi8gPT0gMCkKLQlyZXBsYWNlX2tleSAodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX3BhcmVudC8qc3JjLT5iX3BhcmVudCovLCAwKTsKLSAgICB9IGVsc2UKLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsIHBvaW50ZXJfYW1vdW50IC0gMSk7Ci0gIH0KLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDApOworCQlpZiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpID09IHBvaW50ZXJfYW1vdW50IC0gMSkgeworCQkJaWYgKHNyY19iaS5iaV9wb3NpdGlvbiAvKnNyYy0+Yl9pdGVtX29yZGVyICovICA9PSAwKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sCisJCQkJCSAgICBzcmNfYmkuCisJCQkJCSAgICBiaV9wYXJlbnQgLypzcmMtPmJfcGFyZW50ICovICwgMCk7CisJCX0gZWxzZQorCQkJcmVwbGFjZV9rZXkodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX2JoLAorCQkJCSAgICBwb2ludGVyX2Ftb3VudCAtIDEpOworCX0KKwkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwKKwkJCQkgICAgIHBvaW50ZXJfYW1vdW50LCAwKTsKIAogfQogCkBAIC00OTMsNjcgKzQ5OCw2NiBAQAogICogRGVsZXRlIG4gLSAxIGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIFNbaF0uCiAgKi8KIC8qIGl0IGFsd2F5cyBzaGlmdHMgZnJvbSBTW2hdIHRvIExbaF0gKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0MV9sZWZ0ICgKLQkJCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCSAgICAgIGludCBoLCAKLQkJCQkgICAgICBpbnQgcG9pbnRlcl9hbW91bnQKLQkJCQkgICAgICApCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdDFfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgaW50IGgsIGludCBwb2ludGVyX2Ftb3VudCkKIHsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7Ci0gIGludCBkX2tleV9wb3NpdGlvbjsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY2Y7CisJaW50IGRfa2V5X3Bvc2l0aW9uOwogCi0gIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOworCWludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyhJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsCisJCQkJICAgICAgICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CiAKLSAgaWYgKCBwb2ludGVyX2Ftb3VudCA+IDAgKSAvKiBpbnNlcnQgbGtleVtoXS10aCBrZXkgIGZyb20gQ0ZMW2hdIHRvIGxlZnQgbmVpZ2hib3IgTFtoXSAqLwotICAgIGludGVybmFsX2luc2VydF9rZXkgKCZkZXN0X2JpLCBCX05SX0lURU1TKGRlc3RfYmkuYmlfYmgpLCBjZiwgZF9rZXlfcG9zaXRpb24pOwotICAvKgkJaW50ZXJuYWxfaW5zZXJ0X2tleSAodGItPkxbaF0sIEJfTlJfSVRFTSh0Yi0+TFtoXSksIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKTsqLworCWlmIChwb2ludGVyX2Ftb3VudCA+IDApCS8qIGluc2VydCBsa2V5W2hdLXRoIGtleSAgZnJvbSBDRkxbaF0gdG8gbGVmdCBuZWlnaGJvciBMW2hdICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLAorCQkJCSAgICBkX2tleV9wb3NpdGlvbik7CisJLyogICAgICAgICAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+TFtoXSwgQl9OUl9JVEVNKHRiLT5MW2hdKSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0pOyAqLwogCi0gIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KLSAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsKLSAgLyoJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAodGItPkxbaF0sIHRiLT5TW2hdLCBGSVJTVF9UT19MQVNULCBwb2ludGVyX2Ftb3VudCwgMSk7Ki8KKwkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwKKwkJCQkgICAgIHBvaW50ZXJfYW1vdW50LCAxKTsKKwkvKiAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+TFtoXSwgdGItPlNbaF0sIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsgKi8KIH0KIAotCiAvKiBJbnNlcnQgZF9rZXkndGggKGRlbGltaXRpbmcpIGtleSBmcm9tIGJ1ZmZlciBjZnIgdG8gaGVhZCBvZiBkZXN0LiAKICAqIENvcHkgbiBub2RlIHBvaW50ZXJzIGFuZCBuIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCiAgKiBSZXBsYWNlICBkX2tleSd0aCBrZXkgaW4gYnVmZmVyIGNmci4KICAqIERlbGV0ZSBuIGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIHNyYy4KICAqLwotc3RhdGljIHZvaWQgaW50ZXJuYWxfc2hpZnRfcmlnaHQgKAotCQkJCSAgaW50IG1vZGUsCS8qIElOVEVSTkFMX0ZST01fU19UT19SIHwgSU5URVJOQUxfRlJPTV9MX1RPX1MgKi8KLQkJCQkgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkgIGludCBoLAotCQkJCSAgaW50IHBvaW50ZXJfYW1vdW50Ci0JCQkJICApCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9yaWdodChpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX1IgfCBJTlRFUk5BTF9GUk9NX0xfVE9fUyAqLworCQkJCSBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgaW50IGgsIGludCBwb2ludGVyX2Ftb3VudCkKIHsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7Ci0gIGludCBkX2tleV9wb3NpdGlvbjsKLSAgaW50IG5yOworCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjZjsKKwlpbnQgZF9rZXlfcG9zaXRpb247CisJaW50IG5yOwogCisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwKKwkJCQkgICAgICAgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOwogCi0gIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAobW9kZSwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJbnIgPSBCX05SX0lURU1TKHNyY19iaS5iaV9iaCk7CiAKLSAgbnIgPSBCX05SX0lURU1TIChzcmNfYmkuYmlfYmgpOworCWlmIChwb2ludGVyX2Ftb3VudCA+IDApIHsKKwkJLyogaW5zZXJ0IGRlbGltaXRpbmcga2V5IGZyb20gY29tbW9uIGZhdGhlciBvZiBkZXN0IGFuZCBzcmMgdG8gZGVzdCBub2RlIGludG8gcG9zaXRpb24gMCAqLworCQlpbnRlcm5hbF9pbnNlcnRfa2V5KCZkZXN0X2JpLCAwLCBjZiwgZF9rZXlfcG9zaXRpb24pOworCQlpZiAobnIgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7CisJCQlSRkFMU0Uoc3JjX2JpLmJpX2JoICE9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSAvKnRiLT5TW2hdICovIHx8CisJCQkgICAgICAgZGVzdF9iaS5iaV9iaCAhPSB0Yi0+UltoXSwKKwkJCSAgICAgICAic3JjICglcCkgbXVzdCBiZSA9PSB0Yi0+U1toXSglcCkgd2hlbiBpdCBkaXNhcHBlYXJzIiwKKwkJCSAgICAgICBzcmNfYmkuYmlfYmgsIFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSk7CisJCQkvKiB3aGVuIFNbaF0gZGlzYXBwZXJzIHJlcGxhY2UgbGVmdCBkZWxlbWl0aW5nIGtleSBhcyB3ZWxsICovCisJCQlpZiAodGItPkNGTFtoXSkKKwkJCQlyZXBsYWNlX2tleSh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCB0Yi0+Q0ZMW2hdLAorCQkJCQkgICAgdGItPmxrZXlbaF0pOworCQl9IGVsc2UKKwkJCXJlcGxhY2Vfa2V5KHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHNyY19iaS5iaV9iaCwKKwkJCQkgICAgbnIgLSBwb2ludGVyX2Ftb3VudCk7CisJfQogCi0gIGlmIChwb2ludGVyX2Ftb3VudCA+IDApIHsKLSAgICAvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBkZXN0IG5vZGUgaW50byBwb3NpdGlvbiAwICovCi0gICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7Ci0gICAgaWYgKG5yID09IHBvaW50ZXJfYW1vdW50IC0gMSkgewotCSBSRkFMU0UoIHNyY19iaS5iaV9iaCAhPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpLyp0Yi0+U1toXSovIHx8IAotCQkgZGVzdF9iaS5iaV9iaCAhPSB0Yi0+UltoXSwKLQkJICJzcmMgKCVwKSBtdXN0IGJlID09IHRiLT5TW2hdKCVwKSB3aGVuIGl0IGRpc2FwcGVhcnMiLAotCQkgc3JjX2JpLmJpX2JoLCBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKTsKLSAgICAgIC8qIHdoZW4gU1toXSBkaXNhcHBlcnMgcmVwbGFjZSBsZWZ0IGRlbGVtaXRpbmcga2V5IGFzIHdlbGwgKi8KLSAgICAgIGlmICh0Yi0+Q0ZMW2hdKQotCXJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSk7Ci0gICAgfSBlbHNlCi0gICAgICByZXBsYWNlX2tleSAodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX2JoLCBuciAtIHBvaW50ZXJfYW1vdW50KTsKLSAgfSAgICAgIAotCi0gIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KLSAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAwKTsKKwkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwKKwkJCQkgICAgIHBvaW50ZXJfYW1vdW50LCAwKTsKIH0KIAogLyogSW5zZXJ0IGRlbGltaXRpbmcga2V5IHRvIFJbaF0uCkBAIC01NjEsNDk4ICs1NjUsNTI2IEBACiAgKiBEZWxldGUgbiAtIDEgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgU1toXS4KICAqLwogLyogaXQgYWx3YXlzIHNoaWZ0IGZyb20gU1toXSB0byBSW2hdICovCi1zdGF0aWMgdm9pZAlpbnRlcm5hbF9zaGlmdDFfcmlnaHQgKAotCQkJCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCSAgICAgICBpbnQgaCwgCi0JCQkJICAgICAgIGludCBwb2ludGVyX2Ftb3VudAotCQkJCSAgICAgICApCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdDFfcmlnaHQoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJICBpbnQgaCwgaW50IHBvaW50ZXJfYW1vdW50KQogewotICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKLSAgaW50IGRfa2V5X3Bvc2l0aW9uOworCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjZjsKKwlpbnQgZF9rZXlfcG9zaXRpb247CiAKLSAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwKKwkJCQkgICAgICAgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKIAotICBpZiAocG9pbnRlcl9hbW91bnQgPiAwKSAvKiBpbnNlcnQgcmtleSBmcm9tIENGUltoXSB0byByaWdodCBuZWlnaGJvciBSW2hdICovCi0gICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7Ci0gIC8qCQlpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+UltoXSwgMCwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0pOyovCi0JCi0gIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KLSAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsKLSAgLyoJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAodGItPlJbaF0sIHRiLT5TW2hdLCBMQVNUX1RPX0ZJUlNULCBwb2ludGVyX2Ftb3VudCwgMSk7Ki8KKwlpZiAocG9pbnRlcl9hbW91bnQgPiAwKQkvKiBpbnNlcnQgcmtleSBmcm9tIENGUltoXSB0byByaWdodCBuZWlnaGJvciBSW2hdICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7CisJLyogICAgICAgICAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+UltoXSwgMCwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0pOyAqLworCisJLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLworCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsCisJCQkJICAgICBwb2ludGVyX2Ftb3VudCwgMSk7CisJLyogICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAodGItPlJbaF0sIHRiLT5TW2hdLCBMQVNUX1RPX0ZJUlNULCBwb2ludGVyX2Ftb3VudCwgMSk7ICovCiB9CiAKLQogLyogRGVsZXRlIGluc2VydF9udW0gbm9kZSBwb2ludGVycyB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbXMKICAqIGFuZCBiYWxhbmNlIGN1cnJlbnQgbm9kZS4qLwotc3RhdGljIHZvaWQgYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKLQkJCQkJICBpbnQgaCwgaW50IGNoaWxkX3BvcykKK3N0YXRpYyB2b2lkIGJhbGFuY2VfaW50ZXJuYWxfd2hlbl9kZWxldGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJCSBpbnQgaCwgaW50IGNoaWxkX3BvcykKIHsKLSAgICBpbnQgaW5zZXJ0X251bTsKLSAgICBpbnQgbjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJaW50IGluc2VydF9udW07CisJaW50IG47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YlNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCXN0cnVjdCBidWZmZXJfaW5mbyBiaTsKIAotICAgIGluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0gLyAoKGludCkoRENfU0laRSArIEtFWV9TSVpFKSk7Ci0gIAotICAgIC8qIGRlbGV0ZSBjaGlsZC1ub2RlLXBvaW50ZXIocykgdG9nZXRoZXIgd2l0aCB0aGVpciBsZWZ0IGl0ZW0ocykgKi8KLSAgICBiaS50YiA9IHRiOwotICAgIGJpLmJpX2JoID0gdGJTaDsKLSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0gLyAoKGludCkoRENfU0laRSArIEtFWV9TSVpFKSk7CiAKLSAgICBpbnRlcm5hbF9kZWxldGVfY2hpbGRzICgmYmksIGNoaWxkX3BvcywgLWluc2VydF9udW0pOworCS8qIGRlbGV0ZSBjaGlsZC1ub2RlLXBvaW50ZXIocykgdG9nZXRoZXIgd2l0aCB0aGVpciBsZWZ0IGl0ZW0ocykgKi8KKwliaS50YiA9IHRiOworCWJpLmJpX2JoID0gdGJTaDsKKwliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKIAotICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA+IDEsCi0JICAgICJ0Yi0+YmxrbnVtWyVkXT0lZCB3aGVuIGluc2VydF9zaXplIDwgMCIsIGgsIHRiLT5ibGtudW1baF0pOworCWludGVybmFsX2RlbGV0ZV9jaGlsZHMoJmJpLCBjaGlsZF9wb3MsIC1pbnNlcnRfbnVtKTsKIAotICAgIG4gPSBCX05SX0lURU1TKHRiU2gpOworCVJGQUxTRSh0Yi0+YmxrbnVtW2hdID4gMSwKKwkgICAgICAgInRiLT5ibGtudW1bJWRdPSVkIHdoZW4gaW5zZXJ0X3NpemUgPCAwIiwgaCwgdGItPmJsa251bVtoXSk7CiAKLSAgICBpZiAoIHRiLT5sbnVtW2hdID09IDAgJiYgdGItPnJudW1baF0gPT0gMCApIHsKLQlpZiAoIHRiLT5ibGtudW1baF0gPT0gMCApIHsKLQkgICAgLyogbm9kZSBTW2hdIChyb290IG9mIHRoZSB0cmVlKSBpcyBlbXB0eSBub3cgKi8KLQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfcm9vdDsKKwluID0gQl9OUl9JVEVNUyh0YlNoKTsKIAotCSAgICBSRkFMU0UoIG4gfHwgQl9GUkVFX1NQQUNFICh0YlNoKSAhPSBNQVhfQ0hJTERfU0laRSh0YlNoKSAtIERDX1NJWkUsCi0JCSAgICAiYnVmZmVyIG11c3QgaGF2ZSBvbmx5IDAga2V5cyAoJWQpIiwgbik7Ci0JICAgIFJGQUxTRSggYmkuYmlfcGFyZW50LCAicm9vdCBoYXMgcGFyZW50ICglcCkiLCBiaS5iaV9wYXJlbnQpOwotCQkKLQkgICAgLyogY2hvb3NlIGEgbmV3IHJvb3QgKi8KLQkgICAgaWYgKCAhIHRiLT5MW2gtMV0gfHwgISBCX05SX0lURU1TKHRiLT5MW2gtMV0pICkKLQkJbmV3X3Jvb3QgPSB0Yi0+UltoLTFdOwotCSAgICBlbHNlCi0JCW5ld19yb290ID0gdGItPkxbaC0xXTsKLQkgICAgLyogc3dpdGNoIHN1cGVyIGJsb2NrJ3MgdHJlZSByb290IGJsb2NrIG51bWJlciB0byB0aGUgbmV3IHZhbHVlICovCi0gICAgICAgICAgICBQVVRfU0JfUk9PVF9CTE9DSyggdGItPnRiX3NiLCBuZXdfcm9vdC0+Yl9ibG9ja25yICk7Ci0JICAgIC8vUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19ycy0+c190cmVlX2hlaWdodCAtLTsKLSAgICAgICAgICAgIFBVVF9TQl9UUkVFX0hFSUdIVCggdGItPnRiX3NiLCBTQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IpIC0gMSApOworCWlmICh0Yi0+bG51bVtoXSA9PSAwICYmIHRiLT5ybnVtW2hdID09IDApIHsKKwkJaWYgKHRiLT5ibGtudW1baF0gPT0gMCkgeworCQkJLyogbm9kZSBTW2hdIChyb290IG9mIHRoZSB0cmVlKSBpcyBlbXB0eSBub3cgKi8KKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X3Jvb3Q7CiAKLQkgICAgZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5ICh0YiwgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19zYmgsIDEpOwotCSAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotCSAgICBpZiAoaCA+IDEpCi0JCS8qIHVzZSBjaGVja19pbnRlcm5hbCBpZiBuZXcgcm9vdCBpcyBhbiBpbnRlcm5hbCBub2RlICovCi0JCWNoZWNrX2ludGVybmFsIChuZXdfcm9vdCk7Ci0JICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisJCQlSRkFMU0UobgorCQkJICAgICAgIHx8IEJfRlJFRV9TUEFDRSh0YlNoKSAhPQorCQkJICAgICAgIE1BWF9DSElMRF9TSVpFKHRiU2gpIC0gRENfU0laRSwKKwkJCSAgICAgICAiYnVmZmVyIG11c3QgaGF2ZSBvbmx5IDAga2V5cyAoJWQpIiwgbik7CisJCQlSRkFMU0UoYmkuYmlfcGFyZW50LCAicm9vdCBoYXMgcGFyZW50ICglcCkiLAorCQkJICAgICAgIGJpLmJpX3BhcmVudCk7CiAKLQkgICAgLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCi0JICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKLQkgICAgcmV0dXJuOworCQkJLyogY2hvb3NlIGEgbmV3IHJvb3QgKi8KKwkJCWlmICghdGItPkxbaCAtIDFdIHx8ICFCX05SX0lURU1TKHRiLT5MW2ggLSAxXSkpCisJCQkJbmV3X3Jvb3QgPSB0Yi0+UltoIC0gMV07CisJCQllbHNlCisJCQkJbmV3X3Jvb3QgPSB0Yi0+TFtoIC0gMV07CisJCQkvKiBzd2l0Y2ggc3VwZXIgYmxvY2sncyB0cmVlIHJvb3QgYmxvY2sgbnVtYmVyIHRvIHRoZSBuZXcgdmFsdWUgKi8KKwkJCVBVVF9TQl9ST09UX0JMT0NLKHRiLT50Yl9zYiwgbmV3X3Jvb3QtPmJfYmxvY2tucik7CisJCQkvL1JFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfcnMtPnNfdHJlZV9oZWlnaHQgLS07CisJCQlQVVRfU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiLAorCQkJCQkgICBTQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IpIC0gMSk7CisKKwkJCWRvX2JhbGFuY2VfbWFya19zYl9kaXJ0eSh0YiwKKwkJCQkJCSBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwKKwkJCQkJCSAxKTsKKwkJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQkJaWYgKGggPiAxKQorCQkJCS8qIHVzZSBjaGVja19pbnRlcm5hbCBpZiBuZXcgcm9vdCBpcyBhbiBpbnRlcm5hbCBub2RlICovCisJCQkJY2hlY2tfaW50ZXJuYWwobmV3X3Jvb3QpOworCQkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisKKwkJCS8qIGRvIHdoYXQgaXMgbmVlZGVkIGZvciBidWZmZXIgdGhyb3duIGZyb20gdHJlZSAqLworCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOworCQkJcmV0dXJuOworCQl9CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuOwotICAgIH0KIAotICAgIGlmICggdGItPkxbaF0gJiYgdGItPmxudW1baF0gPT0gLUJfTlJfSVRFTVModGItPkxbaF0pIC0gMSApIHsgLyogam9pbiBTW2hdIHdpdGggTFtoXSAqLworCWlmICh0Yi0+TFtoXSAmJiB0Yi0+bG51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+TFtoXSkgLSAxKSB7CS8qIGpvaW4gU1toXSB3aXRoIExbaF0gKi8KIAotCVJGQUxTRSggdGItPnJudW1baF0gIT0gMCwKLQkJImludmFsaWQgdGItPnJudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIExbaF0iLAotCQloLCB0Yi0+cm51bVtoXSk7CisJCVJGQUxTRSh0Yi0+cm51bVtoXSAhPSAwLAorCQkgICAgICAgImludmFsaWQgdGItPnJudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIExbaF0iLAorCQkgICAgICAgaCwgdGItPnJudW1baF0pOwogCi0JaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCBuICsgMSk7Ci0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOworCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgbiArIDEpOworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CiAKLQlyZXR1cm47Ci0gICAgfQorCQlyZXR1cm47CisJfQogCi0gICAgaWYgKCB0Yi0+UltoXSAmJiAgdGItPnJudW1baF0gPT0gLUJfTlJfSVRFTVModGItPlJbaF0pIC0gMSApIHsgLyogam9pbiBTW2hdIHdpdGggUltoXSAqLwotCVJGQUxTRSggdGItPmxudW1baF0gIT0gMCwKLQkJImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIFJbaF0iLAotCQloLCB0Yi0+bG51bVtoXSk7CisJaWYgKHRiLT5SW2hdICYmIHRiLT5ybnVtW2hdID09IC1CX05SX0lURU1TKHRiLT5SW2hdKSAtIDEpIHsJLyogam9pbiBTW2hdIHdpdGggUltoXSAqLworCQlSRkFMU0UodGItPmxudW1baF0gIT0gMCwKKwkJICAgICAgICJpbnZhbGlkIHRiLT5sbnVtWyVkXT09JWQgd2hlbiBqb2luaW5nIFNbaF0gd2l0aCBSW2hdIiwKKwkJICAgICAgIGgsIHRiLT5sbnVtW2hdKTsKIAotCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIG4gKyAxKTsKKwkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLCBuICsgMSk7CiAKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0Yix0YlNoKTsKLQlyZXR1cm47Ci0gICAgfQorCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJCXJldHVybjsKKwl9CiAKLSAgICBpZiAoIHRiLT5sbnVtW2hdIDwgMCApIHsgLyogYm9ycm93IGZyb20gbGVmdCBuZWlnaGJvciBMW2hdICovCi0JUkZBTFNFKCB0Yi0+cm51bVtoXSAhPSAwLAotCQkid3JvbmcgdGItPnJudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIExbaF0iLCBoLCB0Yi0+cm51bVtoXSk7Ci0JLyppbnRlcm5hbF9zaGlmdF9yaWdodCAodGIsIGgsIHRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIC10Yi0+bG51bVtoXSk7Ki8KLQlpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9MX1RPX1MsIHRiLCBoLCAtdGItPmxudW1baF0pOwotCXJldHVybjsKLSAgICB9CisJaWYgKHRiLT5sbnVtW2hdIDwgMCkgewkvKiBib3Jyb3cgZnJvbSBsZWZ0IG5laWdoYm9yIExbaF0gKi8KKwkJUkZBTFNFKHRiLT5ybnVtW2hdICE9IDAsCisJCSAgICAgICAid3JvbmcgdGItPnJudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIExbaF0iLCBoLAorCQkgICAgICAgdGItPnJudW1baF0pOworCQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0ICh0YiwgaCwgdGItPkxbaF0sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdLCB0Yi0+U1toXSwgLXRiLT5sbnVtW2hdKTsgKi8KKwkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9MX1RPX1MsIHRiLCBoLAorCQkJCSAgICAgLXRiLT5sbnVtW2hdKTsKKwkJcmV0dXJuOworCX0KIAotICAgIGlmICggdGItPnJudW1baF0gPCAwICkgeyAvKiBib3Jyb3cgZnJvbSByaWdodCBuZWlnaGJvciBSW2hdICovCi0JIFJGQUxTRSggdGItPmxudW1baF0gIT0gMCwKLQkJICJpbnZhbGlkIHRiLT5sbnVtWyVkXT09JWQgd2hlbiBib3Jyb3cgZnJvbSBSW2hdIiwgCi0JCSBoLCB0Yi0+bG51bVtoXSk7Ci0JaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1MsIHRiLCBoLCAtdGItPnJudW1baF0pOy8qdGItPlNbaF0sIHRiLT5DRlJbaF0sIHRiLT5ya2V5W2hdLCB0Yi0+UltoXSwgLXRiLT5ybnVtW2hdKTsqLwotCXJldHVybjsKLSAgICB9CisJaWYgKHRiLT5ybnVtW2hdIDwgMCkgewkvKiBib3Jyb3cgZnJvbSByaWdodCBuZWlnaGJvciBSW2hdICovCisJCVJGQUxTRSh0Yi0+bG51bVtoXSAhPSAwLAorCQkgICAgICAgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIFJbaF0iLAorCQkgICAgICAgaCwgdGItPmxudW1baF0pOworCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TLCB0YiwgaCwgLXRiLT5ybnVtW2hdKTsJLyp0Yi0+U1toXSwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0sIHRiLT5SW2hdLCAtdGItPnJudW1baF0pOyAqLworCQlyZXR1cm47CisJfQogCi0gICAgaWYgKCB0Yi0+bG51bVtoXSA+IDAgKSB7IC8qIHNwbGl0IFNbaF0gaW50byB0d28gcGFydHMgYW5kIHB1dCB0aGVtIGludG8gbmVpZ2hib3JzICovCi0JUkZBTFNFKCB0Yi0+cm51bVtoXSA9PSAwIHx8IHRiLT5sbnVtW2hdICsgdGItPnJudW1baF0gIT0gbiArIDEsCi0JCSJpbnZhbGlkIHRiLT5sbnVtWyVkXT09JWQgb3IgdGItPnJudW1bJWRdPT0lZCB3aGVuIFNbaF0oaXRlbSBudW1iZXIgPT0gJWQpIGlzIHNwbGl0IGJldHdlZW4gdGhlbSIsCi0JCWgsIHRiLT5sbnVtW2hdLCBoLCB0Yi0+cm51bVtoXSwgbik7CisJaWYgKHRiLT5sbnVtW2hdID4gMCkgewkvKiBzcGxpdCBTW2hdIGludG8gdHdvIHBhcnRzIGFuZCBwdXQgdGhlbSBpbnRvIG5laWdoYm9ycyAqLworCQlSRkFMU0UodGItPnJudW1baF0gPT0gMCB8fCB0Yi0+bG51bVtoXSArIHRiLT5ybnVtW2hdICE9IG4gKyAxLAorCQkgICAgICAgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCBvciB0Yi0+cm51bVslZF09PSVkIHdoZW4gU1toXShpdGVtIG51bWJlciA9PSAlZCkgaXMgc3BsaXQgYmV0d2VlbiB0aGVtIiwKKwkJICAgICAgIGgsIHRiLT5sbnVtW2hdLCBoLCB0Yi0+cm51bVtoXSwgbik7CiAKLQlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsvKnRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIHRiLT5sbnVtW2hdKTsqLwotCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIHRiLT5ybnVtW2hdKTsKKwkJaW50ZXJuYWxfc2hpZnRfbGVmdChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsJLyp0Yi0+TFtoXSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0sIHRiLT5TW2hdLCB0Yi0+bG51bVtoXSk7ICovCisJCWludGVybmFsX3NoaWZ0X3JpZ2h0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwKKwkJCQkgICAgIHRiLT5ybnVtW2hdKTsKIAotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTaCk7CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKIAotCXJldHVybjsKLSAgICB9Ci0gICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgImJhbGFuY2VfaW50ZXJuYWxfd2hlbl9kZWxldGU6IHVuZXhwZWN0ZWQgdGItPmxudW1bJWRdPT0lZCBvciB0Yi0+cm51bVslZF09PSVkIiwKLQkJICAgIGgsIHRiLT5sbnVtW2hdLCBoLCB0Yi0+cm51bVtoXSk7CisJCXJldHVybjsKKwl9CisJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkgICAgICAgImJhbGFuY2VfaW50ZXJuYWxfd2hlbl9kZWxldGU6IHVuZXhwZWN0ZWQgdGItPmxudW1bJWRdPT0lZCBvciB0Yi0+cm51bVslZF09PSVkIiwKKwkJICAgICAgIGgsIHRiLT5sbnVtW2hdLCBoLCB0Yi0+cm51bVtoXSk7CiB9CiAKLQogLyogUmVwbGFjZSBkZWxpbWl0aW5nIGtleSBvZiBidWZmZXJzIExbaF0gYW5kIFNbaF0gYnkgdGhlIGdpdmVuIGtleS4qLwotc3RhdGljIHZvaWQgcmVwbGFjZV9sa2V5ICgKLQkJICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkgICAgICBpbnQgaCwKLQkJICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGtleQotCQkgICAgICApCitzdGF0aWMgdm9pZCByZXBsYWNlX2xrZXkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoLCBzdHJ1Y3QgaXRlbV9oZWFkICprZXkpCiB7Ci0gICBSRkFMU0UoIHRiLT5MW2hdID09IE5VTEwgfHwgdGItPkNGTFtoXSA9PSBOVUxMLAotCSAgICJMW2hdKCVwKSBhbmQgQ0ZMW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfbGtleSIsIAotCSAgIHRiLT5MW2hdLCB0Yi0+Q0ZMW2hdKTsKKwlSRkFMU0UodGItPkxbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZMW2hdID09IE5VTEwsCisJICAgICAgICJMW2hdKCVwKSBhbmQgQ0ZMW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfbGtleSIsCisJICAgICAgIHRiLT5MW2hdLCB0Yi0+Q0ZMW2hdKTsKIAotICBpZiAoQl9OUl9JVEVNUyhQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCkpID09IDApCi0gICAgcmV0dXJuOworCWlmIChCX05SX0lURU1TKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCkKKwkJcmV0dXJuOwogCi0gIG1lbWNweSAoQl9OX1BERUxJTV9LRVkodGItPkNGTFtoXSx0Yi0+bGtleVtoXSksIGtleSwgS0VZX1NJWkUpOworCW1lbWNweShCX05fUERFTElNX0tFWSh0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSksIGtleSwgS0VZX1NJWkUpOwogCi0gIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5DRkxbaF0sMCk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCB0Yi0+Q0ZMW2hdLCAwKTsKIH0KIAotCiAvKiBSZXBsYWNlIGRlbGltaXRpbmcga2V5IG9mIGJ1ZmZlcnMgU1toXSBhbmQgUltoXSBieSB0aGUgZ2l2ZW4ga2V5LiovCi1zdGF0aWMgdm9pZCByZXBsYWNlX3JrZXkgKAotCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCSAgICAgIGludCBoLAotCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICoga2V5Ci0JCSAgICAgICkKK3N0YXRpYyB2b2lkIHJlcGxhY2VfcmtleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgsIHN0cnVjdCBpdGVtX2hlYWQgKmtleSkKIHsKLSAgUkZBTFNFKCB0Yi0+UltoXSA9PSBOVUxMIHx8IHRiLT5DRlJbaF0gPT0gTlVMTCwKLQkgICJSW2hdKCVwKSBhbmQgQ0ZSW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfcmtleSIsIAotCSAgdGItPlJbaF0sIHRiLT5DRlJbaF0pOwotICBSRkFMU0UoIEJfTlJfSVRFTVModGItPlJbaF0pID09IDAsCi0JICAiUltoXSBjYW4gbm90IGJlIGVtcHR5IGlmIGl0IGV4aXN0cyAoaXRlbSBudW1iZXI9JWQpIiwgCi0JICBCX05SX0lURU1TKHRiLT5SW2hdKSk7CisJUkZBTFNFKHRiLT5SW2hdID09IE5VTEwgfHwgdGItPkNGUltoXSA9PSBOVUxMLAorCSAgICAgICAiUltoXSglcCkgYW5kIENGUltoXSglcCkgbXVzdCBleGlzdCBpbiByZXBsYWNlX3JrZXkiLAorCSAgICAgICB0Yi0+UltoXSwgdGItPkNGUltoXSk7CisJUkZBTFNFKEJfTlJfSVRFTVModGItPlJbaF0pID09IDAsCisJICAgICAgICJSW2hdIGNhbiBub3QgYmUgZW1wdHkgaWYgaXQgZXhpc3RzIChpdGVtIG51bWJlcj0lZCkiLAorCSAgICAgICBCX05SX0lURU1TKHRiLT5SW2hdKSk7CiAKLSAgbWVtY3B5IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CisJbWVtY3B5KEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbaF0sIHRiLT5ya2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGUltoXSwgMCk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCB0Yi0+Q0ZSW2hdLCAwKTsKIH0KIAotCi1pbnQgYmFsYW5jZV9pbnRlcm5hbCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAkJCS8qIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUgCQkqLwotCQkgICAgICBpbnQgaCwJCQkJCS8qIGxldmVsIG9mIHRoZSB0cmVlIAkJCSovCi0JCSAgICAgIGludCBjaGlsZF9wb3MsCi0JCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRfa2V5LAkJLyoga2V5IGZvciBpbnNlcnRpb24gb24gaGlnaGVyIGxldmVsICAgCSovCi0JCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBpbnNlcnRfcHRyCS8qIG5vZGUgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwqLworaW50IGJhbGFuY2VfaW50ZXJuYWwoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCS8qIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAqLworCQkgICAgIGludCBoLAkvKiBsZXZlbCBvZiB0aGUgdHJlZSAgICAgICAgICAgICAgICAgICAgKi8KKwkJICAgICBpbnQgY2hpbGRfcG9zLCBzdHJ1Y3QgaXRlbV9oZWFkICppbnNlcnRfa2V5LAkvKiBrZXkgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwgICAgKi8KKwkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKippbnNlcnRfcHRyCS8qIG5vZGUgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwgKi8KICAgICApCiAgICAgLyogaWYgaW5zZXJ0aW5nL3Bhc3RpbmcKICAgICAgICB7Ci0gICAgICAgY2hpbGRfcG9zIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS1wb2ludGVyIGluIFNbaF0gdGhhdAkgKgotICAgICAgIHBvaW50ZWQgdG8gU1toLTFdIGJlZm9yZSBiYWxhbmNpbmcgb2YgdGhlIGgtMSBsZXZlbDsJCSAqCisgICAgICAgY2hpbGRfcG9zIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS1wb2ludGVyIGluIFNbaF0gdGhhdCAgICAgICAgKgorICAgICAgIHBvaW50ZWQgdG8gU1toLTFdIGJlZm9yZSBiYWxhbmNpbmcgb2YgdGhlIGgtMSBsZXZlbDsgICAgICAgICAgICAgICoKICAgICAgICB0aGlzIG1lYW5zIHRoYXQgbmV3IHBvaW50ZXJzIGFuZCBpdGVtcyBtdXN0IGJlIGluc2VydGVkIEFGVEVSICoKICAgICAgICBjaGlsZF9wb3MKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7Ci0gICBpdCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnRtb3N0IHBvaW50ZXIgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgKHRvZ2V0aGVyIHdpdGgKLSAgIGl0cyBjb3JyZXNwb25kaW5nIGtleSB0byB0aGUgbGVmdCBvZiB0aGUgcG9pbnRlcikKLSAgIGFzIGEgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBsZXZlbCdzIGJhbGFuY2luZy4KLSAgIH0KLSovCisgICAgICAgaXQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsZWZ0bW9zdCBwb2ludGVyIHRoYXQgbXVzdCBiZSBkZWxldGVkICh0b2dldGhlciB3aXRoCisgICAgICAgaXRzIGNvcnJlc3BvbmRpbmcga2V5IHRvIHRoZSBsZWZ0IG9mIHRoZSBwb2ludGVyKQorICAgICAgIGFzIGEgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBsZXZlbCdzIGJhbGFuY2luZy4KKyAgICAgICB9CisgICAgICovCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwotICAgIGludCBvcmRlcjsJCS8qIHdlIHJldHVybiB0aGlzOiBpdCBpcyAwIGlmIHRoZXJlIGlzIG5vIFNbaF0sIGVsc2UgaXQgaXMgdGItPlNbaF0tPmJfaXRlbV9vcmRlciAqLwotICAgIGludCBpbnNlcnRfbnVtLCBuLCBrOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNfbmV3OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2luc2VydF9rZXk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbmV3X2luc2VydF9wdHIgPSBOVUxMOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBuZXdfaW5zZXJ0X2tleV9hZGRyID0gaW5zZXJ0X2tleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworCWludCBvcmRlcjsJCS8qIHdlIHJldHVybiB0aGlzOiBpdCBpcyAwIGlmIHRoZXJlIGlzIG5vIFNbaF0sIGVsc2UgaXQgaXMgdGItPlNbaF0tPmJfaXRlbV9vcmRlciAqLworCWludCBpbnNlcnRfbnVtLCBuLCBrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU19uZXc7CisJc3RydWN0IGl0ZW1faGVhZCBuZXdfaW5zZXJ0X2tleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19pbnNlcnRfcHRyID0gTlVMTDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpuZXdfaW5zZXJ0X2tleV9hZGRyID0gaW5zZXJ0X2tleTsKIAotICAgIFJGQUxTRSggaCA8IDEsICJoICglZCkgY2FuIG5vdCBiZSA8IDEgb24gaW50ZXJuYWwgbGV2ZWwiLCBoKTsKKwlSRkFMU0UoaCA8IDEsICJoICglZCkgY2FuIG5vdCBiZSA8IDEgb24gaW50ZXJuYWwgbGV2ZWwiLCBoKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBiYWxhbmNlX2F0WyBoIF0gKTsKKwlQUk9DX0lORk9fSU5DKHRiLT50Yl9zYiwgYmFsYW5jZV9hdFtoXSk7CiAKLSAgICBvcmRlciA9ICggdGJTaCApID8gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpLyp0Yi0+U1toXS0+Yl9pdGVtX29yZGVyKi8gOiAwOworCW9yZGVyID0KKwkgICAgKHRiU2gpID8gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLAorCQkJCSAgICAgaCArIDEpIC8qdGItPlNbaF0tPmJfaXRlbV9vcmRlciAqLyA6IDA7CiAKLSAgLyogVXNpbmcgaW5zZXJ0X3NpemVbaF0gY2FsY3VsYXRlIHRoZSBudW1iZXIgaW5zZXJ0X251bSBvZiBpdGVtcwotICAgICB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgdG8gb3IgZGVsZXRlZCBmcm9tIFNbaF0uICovCi0gICAgaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXS8oKGludCkoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CisJLyogVXNpbmcgaW5zZXJ0X3NpemVbaF0gY2FsY3VsYXRlIHRoZSBudW1iZXIgaW5zZXJ0X251bSBvZiBpdGVtcworCSAgIHRoYXQgbXVzdCBiZSBpbnNlcnRlZCB0byBvciBkZWxldGVkIGZyb20gU1toXS4gKi8KKwlpbnNlcnRfbnVtID0gdGItPmluc2VydF9zaXplW2hdIC8gKChpbnQpKEtFWV9TSVpFICsgRENfU0laRSkpOwogCi0gICAgLyogQ2hlY2sgd2hldGhlciBpbnNlcnRfbnVtIGlzIHByb3BlciAqKi8KLSAgICBSRkFMU0UoIGluc2VydF9udW0gPCAtMiAgfHwgIGluc2VydF9udW0gPiAyLAotCSAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyBpbnNlcnRlZCB0byB0aGUgaW50ZXJuYWwgbm9kZSAoJWQpIiwgCi0JICAgIGluc2VydF9udW0pOwotICAgIFJGQUxTRSggaCA+IDEgICYmIChpbnNlcnRfbnVtID4gMSB8fCBpbnNlcnRfbnVtIDwgLTEpLAotCSAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyAoJWQpIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlIG9uIGEgbGV2ZWwgKGg9JWQpIGhpZ2hlciB0aGFuIGxhc3QgaW50ZXJuYWwgbGV2ZWwiLCAKLQkgICAgaW5zZXJ0X251bSwgaCk7CisJLyogQ2hlY2sgd2hldGhlciBpbnNlcnRfbnVtIGlzIHByb3BlciAqICovCisJUkZBTFNFKGluc2VydF9udW0gPCAtMiB8fCBpbnNlcnRfbnVtID4gMiwKKwkgICAgICAgImluY29ycmVjdCBudW1iZXIgb2YgaXRlbXMgaW5zZXJ0ZWQgdG8gdGhlIGludGVybmFsIG5vZGUgKCVkKSIsCisJICAgICAgIGluc2VydF9udW0pOworCVJGQUxTRShoID4gMSAmJiAoaW5zZXJ0X251bSA+IDEgfHwgaW5zZXJ0X251bSA8IC0xKSwKKwkgICAgICAgImluY29ycmVjdCBudW1iZXIgb2YgaXRlbXMgKCVkKSBpbnNlcnRlZCB0byB0aGUgaW50ZXJuYWwgbm9kZSBvbiBhIGxldmVsIChoPSVkKSBoaWdoZXIgdGhhbiBsYXN0IGludGVybmFsIGxldmVsIiwKKwkgICAgICAgaW5zZXJ0X251bSwgaCk7CiAKLSAgICAvKiBNYWtlIGJhbGFuY2UgaW4gY2FzZSBpbnNlcnRfbnVtIDwgMCAqLwotICAgIGlmICggaW5zZXJ0X251bSA8IDAgKSB7Ci0JYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSAodGIsIGgsIGNoaWxkX3Bvcyk7Ci0JcmV0dXJuIG9yZGVyOwotICAgIH0KLSAKLSAgICBrID0gMDsKLSAgICBpZiAoIHRiLT5sbnVtW2hdID4gMCApIHsKLQkvKiBzaGlmdCBsbnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMW2hdLgotCSAgIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gYWZ0ZXIKLQkgICBzaGlmdGluZyAqLwotCW4gPSBCX05SX0lURU1TICh0Yi0+TFtoXSk7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBMW2hdICovCi0JaWYgKCB0Yi0+bG51bVtoXSA8PSBjaGlsZF9wb3MgKSB7Ci0JICAgIC8qIG5ldyBpdGVtcyBkb24ndCBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gKi8KLQkgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSk7Ci0JICAgIC8qaW50ZXJuYWxfc2hpZnRfbGVmdCAodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLHRiLT5sbnVtW2hdKTsqLwotCSAgICBjaGlsZF9wb3MgLT0gdGItPmxudW1baF07Ci0JfSBlbHNlIGlmICggdGItPmxudW1baF0gPiBjaGlsZF9wb3MgKyBpbnNlcnRfbnVtICkgewotCSAgICAvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdICovCi0JICAgIGludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0gLSBpbnNlcnRfbnVtKTsKLQkgICAgLyoJCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KHRiLT5MW2hdLHRiLT5DRkxbaF0sdGItPmxrZXlbaF0sdGJTaCwKLQkJCQl0Yi0+bG51bVtoXS1pbnNlcnRfbnVtKTsKLQkgICAgKi8KLQkgICAgLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIExbaF0gKi8KLQkgICAgYmkudGIgPSB0YjsKLQkgICAgYmkuYmlfYmggPSB0Yi0+TFtoXTsKLQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOwotCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQqLyBuICsgY2hpbGRfcG9zICsgMSwKLQkJCQkgICAgaW5zZXJ0X251bSxpbnNlcnRfa2V5LGluc2VydF9wdHIpOwotCi0JICAgIGluc2VydF9udW0gPSAwOyAKLQl9IGVsc2UgewotCSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOwotCi0JICAgIC8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIExbaF0gb3IgQ0ZMW2hdLCBidXQgc29tZSBkb24ndCBmYWxsICovCi0JICAgIGludGVybmFsX3NoaWZ0MV9sZWZ0KHRiLGgsY2hpbGRfcG9zKzEpOwotCSAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBMW2hdICovCi0JICAgIGsgPSB0Yi0+bG51bVtoXSAtIGNoaWxkX3BvcyAtIDE7Ci0JICAgIGJpLnRiID0gdGI7Ci0JICAgIGJpLmJpX2JoID0gdGItPkxbaF07Ci0JICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKLQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksLyp0Yi0+TFtoXSwgdGItPlNbaC0xXS0+Yl9uZXh0LCovIG4gKyBjaGlsZF9wb3MgKyAxLGssCi0JCQkJICAgIGluc2VydF9rZXksaW5zZXJ0X3B0cik7Ci0KLQkgICAgcmVwbGFjZV9sa2V5KHRiLGgsaW5zZXJ0X2tleSArIGspOwotCi0JICAgIC8qIHJlcGxhY2UgdGhlIGZpcnN0IG5vZGUtcHRyIGluIFNbaF0gYnkgbm9kZS1wdHIgdG8gaW5zZXJ0X3B0cltrXSAqLwotCSAgICBkYyA9IEJfTl9DSElMRCh0YlNoLCAwKTsKLQkgICAgcHV0X2RjX3NpemUoIGRjLCBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2tdKSAtIEJfRlJFRV9TUEFDRSAoaW5zZXJ0X3B0cltrXSkpOwotCSAgICBwdXRfZGNfYmxvY2tfbnVtYmVyKCBkYywgaW5zZXJ0X3B0cltrXS0+Yl9ibG9ja25yICk7Ci0KLQkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGJTaCwgMCk7Ci0KLQkgICAgaysrOwotCSAgICBpbnNlcnRfa2V5ICs9IGs7Ci0JICAgIGluc2VydF9wdHIgKz0gazsKLQkgICAgaW5zZXJ0X251bSAtPSBrOwotCSAgICBjaGlsZF9wb3MgPSAwOworCS8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9udW0gPCAwICovCisJaWYgKGluc2VydF9udW0gPCAwKSB7CisJCWJhbGFuY2VfaW50ZXJuYWxfd2hlbl9kZWxldGUodGIsIGgsIGNoaWxkX3Bvcyk7CisJCXJldHVybiBvcmRlcjsKIAl9Ci0gICAgfQkvKiB0Yi0+bG51bVtoXSA+IDAgKi8KIAotICAgIGlmICggdGItPnJudW1baF0gPiAwICkgewotCS8qc2hpZnQgcm51bVtoXSBpdGVtcyBmcm9tIFNbaF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yIFJbaF0qLwotCS8qIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gUiBvciBDRlIgYWZ0ZXIgc2hpZnRpbmcgKi8KLQluID0gQl9OUl9JVEVNUyAodGJTaCk7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCi0JaWYgKCBuIC0gdGItPnJudW1baF0gPj0gY2hpbGRfcG9zICkKLQkgICAgLyogbmV3IGl0ZW1zIGZhbGwgaW50byBTW2hdICovCi0JICAgIC8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sdGItPnJudW1baF0pOyovCi0JICAgIGludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIHRiLT5ybnVtW2hdKTsKLQllbHNlCi0JICAgIGlmICggbiArIGluc2VydF9udW0gLSB0Yi0+cm51bVtoXSA8IGNoaWxkX3BvcyApCi0JICAgIHsKLQkJLyogYWxsIG5ldyBpdGVtcyBmYWxsIGludG8gUltoXSAqLwotCQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0KHRiLGgsdGJTaCx0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdLHRiLT5SW2hdLAotCSAgICB0Yi0+cm51bVtoXSAtIGluc2VydF9udW0pOyovCi0JCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7CisJayA9IDA7CisJaWYgKHRiLT5sbnVtW2hdID4gMCkgeworCQkvKiBzaGlmdCBsbnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMW2hdLgorCQkgICBjaGVjayBob3cgbWFueSBvZiBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gb3IgQ0ZMW2hdIGFmdGVyCisJCSAgIHNoaWZ0aW5nICovCisJCW4gPSBCX05SX0lURU1TKHRiLT5MW2hdKTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIExbaF0gKi8KKwkJaWYgKHRiLT5sbnVtW2hdIDw9IGNoaWxkX3BvcykgeworCQkJLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSAqLworCQkJaW50ZXJuYWxfc2hpZnRfbGVmdChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsCisJCQkJCSAgICB0Yi0+bG51bVtoXSk7CisJCQkvKmludGVybmFsX3NoaWZ0X2xlZnQgKHRiLT5MW2hdLHRiLT5DRkxbaF0sdGItPmxrZXlbaF0sdGJTaCx0Yi0+bG51bVtoXSk7ICovCisJCQljaGlsZF9wb3MgLT0gdGItPmxudW1baF07CisJCX0gZWxzZSBpZiAodGItPmxudW1baF0gPiBjaGlsZF9wb3MgKyBpbnNlcnRfbnVtKSB7CisJCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdICovCisJCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwKKwkJCQkJICAgIHRiLT5sbnVtW2hdIC0gaW5zZXJ0X251bSk7CisJCQkvKiAgICAgICAgICAgICAgICAgIGludGVybmFsX3NoaWZ0X2xlZnQodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLAorCQkJICAgdGItPmxudW1baF0taW5zZXJ0X251bSk7CisJCQkgKi8KKwkJCS8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBMW2hdICovCisJCQliaS50YiA9IHRiOworCQkJYmkuYmlfYmggPSB0Yi0+TFtoXTsKKwkJCWJpLmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmYmksCisJCQkJCSAgICAgICAvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQgKi8KKwkJCQkJICAgICAgIG4gKyBjaGlsZF9wb3MgKyAxLAorCQkJCQkgICAgICAgaW5zZXJ0X251bSwgaW5zZXJ0X2tleSwKKwkJCQkJICAgICAgIGluc2VydF9wdHIpOwogCi0JCS8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBSW2hdICovCi0JCWJpLnRiID0gdGI7Ci0JCWJpLmJpX2JoID0gdGItPlJbaF07Ci0JCWJpLmJpX3BhcmVudCA9IHRiLT5GUltoXTsKLQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLCAvKnRiLT5SW2hdLHRiLT5TW2gtMV0tPmJfbmV4dCovIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsgdGItPnJudW1baF0gLSAxLAotCQkJCQlpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7Ci0JCWluc2VydF9udW0gPSAwOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCQkJaW5zZXJ0X251bSA9IDA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CiAKLQkJLyogb25lIG9mIHRoZSBpdGVtcyBmYWxscyBpbnRvIENGUltoXSAqLwotCQlpbnRlcm5hbF9zaGlmdDFfcmlnaHQodGIsaCxuIC0gY2hpbGRfcG9zICsgMSk7Ci0JCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIFJbaF0gKi8KLQkJayA9IHRiLT5ybnVtW2hdIC0gbiArIGNoaWxkX3BvcyAtIDE7Ci0JCWJpLnRiID0gdGI7Ci0JCWJpLmJpX2JoID0gdGItPlJbaF07Ci0JCWJpLmJpX3BhcmVudCA9IHRiLT5GUltoXTsKLQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLCAvKnRiLT5SW2hdLCB0Yi0+UltoXS0+Yl9jaGlsZCwqLyAwLCBrLCBpbnNlcnRfa2V5ICsgMSwgaW5zZXJ0X3B0ciArIDEpOworCQkJLyogc29tZSBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0sIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KKwkJCWludGVybmFsX3NoaWZ0MV9sZWZ0KHRiLCBoLCBjaGlsZF9wb3MgKyAxKTsKKwkJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIExbaF0gKi8KKwkJCWsgPSB0Yi0+bG51bVtoXSAtIGNoaWxkX3BvcyAtIDE7CisJCQliaS50YiA9IHRiOworCQkJYmkuYmlfYmggPSB0Yi0+TFtoXTsKKwkJCWJpLmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmYmksCisJCQkJCSAgICAgICAvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQsICovCisJCQkJCSAgICAgICBuICsgY2hpbGRfcG9zICsgMSwgaywKKwkJCQkJICAgICAgIGluc2VydF9rZXksIGluc2VydF9wdHIpOwogCi0JCXJlcGxhY2VfcmtleSh0YixoLGluc2VydF9rZXkgKyBpbnNlcnRfbnVtIC0gayAtIDEpOworCQkJcmVwbGFjZV9sa2V5KHRiLCBoLCBpbnNlcnRfa2V5ICsgayk7CiAKLQkJLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gUltoXSBieSBub2RlLXB0ciBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSovCi0JCWRjID0gQl9OX0NISUxEKHRiLT5SW2hdLCAwKTsKLQkJcHV0X2RjX3NpemUoIGRjLCBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkgLQotICAgIAkJCQkgICAgQl9GUkVFX1NQQUNFIChpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkpOwotCQlwdXRfZGNfYmxvY2tfbnVtYmVyKCBkYywgaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0tPmJfYmxvY2tuciApOworCQkJLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gU1toXSBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2tdICovCisJCQlkYyA9IEJfTl9DSElMRCh0YlNoLCAwKTsKKwkJCXB1dF9kY19zaXplKGRjLAorCQkJCSAgICBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2tdKSAtCisJCQkJICAgIEJfRlJFRV9TUEFDRShpbnNlcnRfcHRyW2tdKSk7CisJCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLCBpbnNlcnRfcHRyW2tdLT5iX2Jsb2NrbnIpOwogCi0JCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5SW2hdLDApOworCQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCB0YlNoLCAwKTsKIAotCQlpbnNlcnRfbnVtIC09IChrICsgMSk7Ci0JICAgIH0KLSAgICB9CisJCQlrKys7CisJCQlpbnNlcnRfa2V5ICs9IGs7CisJCQlpbnNlcnRfcHRyICs9IGs7CisJCQlpbnNlcnRfbnVtIC09IGs7CisJCQljaGlsZF9wb3MgPSAwOworCQl9CisJfQorCS8qIHRiLT5sbnVtW2hdID4gMCAqLworCWlmICh0Yi0+cm51bVtoXSA+IDApIHsKKwkJLypzaGlmdCBybnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUltoXSAqLworCQkvKiBjaGVjayBob3cgbWFueSBvZiBuZXcgaXRlbXMgZmFsbCBpbnRvIFIgb3IgQ0ZSIGFmdGVyIHNoaWZ0aW5nICovCisJCW4gPSBCX05SX0lURU1TKHRiU2gpOwkvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLworCQlpZiAobiAtIHRiLT5ybnVtW2hdID49IGNoaWxkX3BvcykKKwkJCS8qIG5ldyBpdGVtcyBmYWxsIGludG8gU1toXSAqLworCQkJLyppbnRlcm5hbF9zaGlmdF9yaWdodCh0YixoLHRiU2gsdGItPkNGUltoXSx0Yi0+cmtleVtoXSx0Yi0+UltoXSx0Yi0+cm51bVtoXSk7ICovCisJCQlpbnRlcm5hbF9zaGlmdF9yaWdodChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsCisJCQkJCSAgICAgdGItPnJudW1baF0pOworCQllbHNlIGlmIChuICsgaW5zZXJ0X251bSAtIHRiLT5ybnVtW2hdIDwgY2hpbGRfcG9zKSB7CisJCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBSW2hdICovCisJCQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0KHRiLGgsdGJTaCx0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdLHRiLT5SW2hdLAorCQkJICAgdGItPnJudW1baF0gLSBpbnNlcnRfbnVtKTsgKi8KKwkJCWludGVybmFsX3NoaWZ0X3JpZ2h0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwKKwkJCQkJICAgICB0Yi0+cm51bVtoXSAtIGluc2VydF9udW0pOworCisJCQkvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gUltoXSAqLworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGItPlJbaF07CisJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPlJbaF0sdGItPlNbaC0xXS0+Yl9uZXh0ICovCisJCQkJCSAgICAgICBjaGlsZF9wb3MgLSBuIC0gaW5zZXJ0X251bSArCisJCQkJCSAgICAgICB0Yi0+cm51bVtoXSAtIDEsCisJCQkJCSAgICAgICBpbnNlcnRfbnVtLCBpbnNlcnRfa2V5LAorCQkJCQkgICAgICAgaW5zZXJ0X3B0cik7CisJCQlpbnNlcnRfbnVtID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKworCQkJLyogb25lIG9mIHRoZSBpdGVtcyBmYWxscyBpbnRvIENGUltoXSAqLworCQkJaW50ZXJuYWxfc2hpZnQxX3JpZ2h0KHRiLCBoLCBuIC0gY2hpbGRfcG9zICsgMSk7CisJCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBSW2hdICovCisJCQlrID0gdGItPnJudW1baF0gLSBuICsgY2hpbGRfcG9zIC0gMTsKKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5SW2hdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIGgpOworCQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmYmksCisJCQkJCSAgICAgICAvKnRiLT5SW2hdLCB0Yi0+UltoXS0+Yl9jaGlsZCwgKi8KKwkJCQkJICAgICAgIDAsIGssIGluc2VydF9rZXkgKyAxLAorCQkJCQkgICAgICAgaW5zZXJ0X3B0ciArIDEpOworCisJCQlyZXBsYWNlX3JrZXkodGIsIGgsIGluc2VydF9rZXkgKyBpbnNlcnRfbnVtIC0gayAtIDEpOworCisJCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBSW2hdIGJ5IG5vZGUtcHRyIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdICovCisJCQlkYyA9IEJfTl9DSElMRCh0Yi0+UltoXSwgMCk7CisJCQlwdXRfZGNfc2l6ZShkYywKKwkJCQkgICAgTUFYX0NISUxEX1NJWkUoaW5zZXJ0X3B0cgorCQkJCQkJICAgW2luc2VydF9udW0gLSBrIC0gMV0pIC0KKwkJCQkgICAgQl9GUkVFX1NQQUNFKGluc2VydF9wdHIKKwkJCQkJCSBbaW5zZXJ0X251bSAtIGsgLSAxXSkpOworCQkJcHV0X2RjX2Jsb2NrX251bWJlcihkYywKKwkJCQkJICAgIGluc2VydF9wdHJbaW5zZXJ0X251bSAtIGsgLQorCQkJCQkJICAgICAgIDFdLT5iX2Jsb2NrbnIpOworCisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5SW2hdLCAwKTsKKworCQkJaW5zZXJ0X251bSAtPSAoayArIDEpOworCQl9CisJfQogCiAgICAgLyoqIEZpbGwgbmV3IG5vZGUgdGhhdCBhcHBlYXJzIGluc3RlYWQgb2YgU1toXSAqKi8KLSAgICBSRkFMU0UoIHRiLT5ibGtudW1baF0gPiAyLCAiYmxrbnVtIGNhbiBub3QgYmUgPiAyIGZvciBpbnRlcm5hbCBsZXZlbCIpOwotICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA8IDAsICJibGtudW0gY2FuIG5vdCBiZSA8IDAiKTsKKwlSRkFMU0UodGItPmJsa251bVtoXSA+IDIsICJibGtudW0gY2FuIG5vdCBiZSA+IDIgZm9yIGludGVybmFsIGxldmVsIik7CisJUkZBTFNFKHRiLT5ibGtudW1baF0gPCAwLCAiYmxrbnVtIGNhbiBub3QgYmUgPCAwIik7CiAKLSAgICBpZiAoICEgdGItPmJsa251bVtoXSApCi0gICAgeyAvKiBub2RlIFNbaF0gaXMgZW1wdHkgbm93ICovCi0JUkZBTFNFKCAhIHRiU2gsICJTW2hdIGlzIGVxdWFsIE5VTEwiKTsKKwlpZiAoIXRiLT5ibGtudW1baF0pIHsJLyogbm9kZSBTW2hdIGlzIGVtcHR5IG5vdyAqLworCQlSRkFMU0UoIXRiU2gsICJTW2hdIGlzIGVxdWFsIE5VTEwiKTsKIAotCS8qIGRvIHdoYXQgaXMgbmVlZGVkIGZvciBidWZmZXIgdGhyb3duIGZyb20gdHJlZSAqLwotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiU2gpOwotCXJldHVybiBvcmRlcjsKLSAgICB9Ci0KLSAgICBpZiAoICEgdGJTaCApIHsKLQkvKiBjcmVhdGUgbmV3IHJvb3QgKi8KLQlzdHJ1Y3QgZGlza19jaGlsZCAgKiBkYzsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoXzEgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGggLSAxKTsKLSAgICAgICAgc3RydWN0IGJsb2NrX2hlYWQgKiAgYmxraDsKLQotCi0JaWYgKCB0Yi0+YmxrbnVtW2hdICE9IDEgKQotCSAgICByZWlzZXJmc19wYW5pYyhOVUxMLCAiYmFsYW5jZV9pbnRlcm5hbDogT25lIG5ldyBub2RlIHJlcXVpcmVkIGZvciBjcmVhdGluZyB0aGUgbmV3IHJvb3QiKTsKLQkvKiBTW2hdID0gZW1wdHkgYnVmZmVyIGZyb20gdGhlIGxpc3QgRkVCLiAqLwotCXRiU2ggPSBnZXRfRkVCICh0Yik7Ci0gICAgICAgIGJsa2ggPSBCX0JMS19IRUFEKHRiU2gpOwotICAgICAgICBzZXRfYmxraF9sZXZlbCggYmxraCwgaCArIDEgKTsKLQotCS8qIFB1dCB0aGUgdW5pcXVlIG5vZGUtcG9pbnRlciB0byBTW2hdIHRoYXQgcG9pbnRzIHRvIFNbaC0xXS4gKi8KLQotCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOwotCXB1dF9kY19ibG9ja19udW1iZXIoIGRjLCB0YlNoXzEtPmJfYmxvY2tuciApOwotCXB1dF9kY19zaXplKCBkYywgKE1BWF9DSElMRF9TSVpFICh0YlNoXzEpIC0gQl9GUkVFX1NQQUNFICh0YlNoXzEpKSk7Ci0KLQl0Yi0+aW5zZXJ0X3NpemVbaF0gLT0gRENfU0laRTsKLSAgICAgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gRENfU0laRSApOwotCi0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGJTaCwgMCk7Ci0KLQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0JY2hlY2tfaW50ZXJuYWwgKHRiU2gpOwotCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgICAKLSAgICAvKiBwdXQgbmV3IHJvb3QgaW50byBwYXRoIHN0cnVjdHVyZSAqLwotCVBBVEhfT0ZGU0VUX1BCVUZGRVIodGItPnRiX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSB0YlNoOwotCi0JLyogQ2hhbmdlIHJvb3QgaW4gc3RydWN0dXJlIHN1cGVyIGJsb2NrLiAqLwotICAgICAgICBQVVRfU0JfUk9PVF9CTE9DSyggdGItPnRiX3NiLCB0YlNoLT5iX2Jsb2NrbnIgKTsKLSAgICAgICAgUFVUX1NCX1RSRUVfSEVJR0hUKCB0Yi0+dGJfc2IsIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgKyAxICk7Ci0JZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5ICh0YiwgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19zYmgsIDEpOwotICAgIH0KLQkKLSAgICBpZiAoIHRiLT5ibGtudW1baF0gPT0gMiApIHsKLQlpbnQgc251bTsKLQlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotCi0KLQkvKiBTX25ldyA9IGZyZWUgYnVmZmVyIGZyb20gbGlzdCBGRUIgKi8KLQlTX25ldyA9IGdldF9GRUIodGIpOwotCi0gICAgICAgIHNldF9ibGtoX2xldmVsKCBCX0JMS19IRUFEKFNfbmV3KSwgaCArIDEgKTsKLQotCWRlc3RfYmkudGIgPSB0YjsKLQlkZXN0X2JpLmJpX2JoID0gU19uZXc7Ci0JZGVzdF9iaS5iaV9wYXJlbnQgPSBOVUxMOwotCWRlc3RfYmkuYmlfcG9zaXRpb24gPSAwOwotCXNyY19iaS50YiA9IHRiOwotCXNyY19iaS5iaV9iaCA9IHRiU2g7Ci0Jc3JjX2JpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCQkKLQluID0gQl9OUl9JVEVNUyAodGJTaCk7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCi0Jc251bSA9IChpbnNlcnRfbnVtICsgbiArIDEpLzI7Ci0JaWYgKCBuIC0gc251bSA+PSBjaGlsZF9wb3MgKSB7Ci0JICAgIC8qIG5ldyBpdGVtcyBkb24ndCBmYWxsIGludG8gU19uZXcgKi8KLQkgICAgLyoJc3RvcmUgdGhlIGRlbGltaXRpbmcga2V5IGZvciB0aGUgbmV4dCBsZXZlbCAqLwotCSAgICAvKiBuZXdfaW5zZXJ0X2tleSA9IChuIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KLQkgICAgbWVtY3B5ICgmbmV3X2luc2VydF9rZXksQl9OX1BERUxJTV9LRVkodGJTaCxuIC0gc251bSksCi0JCSAgICBLRVlfU0laRSk7Ci0JICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KLQkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHNudW0sIDApOwotCSAgICAvKiAgICAgICAgICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsIHRiU2gsIExBU1RfVE9fRklSU1QsIHNudW0sIDApOyovCi0JfSBlbHNlIGlmICggbiArIGluc2VydF9udW0gLSBzbnVtIDwgY2hpbGRfcG9zICkgewotCSAgICAvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBTX25ldyAqLwotCSAgICAvKglzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCi0JICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gKG4gKyBpbnNlcnRfaXRlbSAtIHNudW0pJ3RoIGtleSBpbiBTW2hdICovCi0JICAgIG1lbWNweSgmbmV3X2luc2VydF9rZXksQl9OX1BERUxJTV9LRVkodGJTaCxuICsgaW5zZXJ0X251bSAtIHNudW0pLAotCQkgICBLRVlfU0laRSk7Ci0JICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KLQkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHNudW0gLSBpbnNlcnRfbnVtLCAwKTsKLQkgICAgLyoJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxzbnVtIC0gaW5zZXJ0X251bSwwKTsqLwotCi0JICAgIC8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBTX25ldyAqLwotCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmZGVzdF9iaSwgLypTX25ldyx0Yi0+U1toLTFdLT5iX25leHQsKi9jaGlsZF9wb3MgLSBuIC0gaW5zZXJ0X251bSArIHNudW0gLSAxLAotCQkJCSAgICBpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7Ci0KLQkgICAgaW5zZXJ0X251bSA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKLQotCSAgICAvKiBzb21lIGl0ZW1zIGZhbGwgaW50byBTX25ldywgYnV0IHNvbWUgZG9uJ3QgZmFsbCAqLwotCSAgICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCi0JICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULCBuIC0gY2hpbGRfcG9zICsgMSwgMSk7Ci0JICAgIC8qCQkJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldyx0YlNoLDEsbiAtIGNoaWxkX3BvcyArIDEsMSk7Ki8KLQkgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gU19uZXcgKi8KLQkgICAgayA9IHNudW0gLSBuICsgY2hpbGRfcG9zIC0gMTsKLQotCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmZGVzdF9iaSwgLypTX25ldywqLyAwLCBrLCBpbnNlcnRfa2V5ICsgMSwgaW5zZXJ0X3B0cisxKTsKLQotCSAgICAvKiBuZXdfaW5zZXJ0X2tleSA9IGluc2VydF9rZXlbaW5zZXJ0X251bSAtIGsgLSAxXSAqLwotCSAgICBtZW1jcHkoJm5ld19pbnNlcnRfa2V5LGluc2VydF9rZXkgKyBpbnNlcnRfbnVtIC0gayAtIDEsCi0JCSAgIEtFWV9TSVpFKTsKLQkgICAgLyogcmVwbGFjZSBmaXJzdCBub2RlLXB0ciBpbiBTX25ldyBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSAqLwotCi0JICAgIGRjID0gQl9OX0NISUxEKFNfbmV3LDApOwotCSAgICBwdXRfZGNfc2l6ZSggZGMsIChNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkgLQotCQkJCUJfRlJFRV9TUEFDRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkpICk7Ci0JICAgIHB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXS0+Yl9ibG9ja25yICk7Ci0KLQkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgU19uZXcsMCk7Ci0JCQkKLQkgICAgaW5zZXJ0X251bSAtPSAoayArIDEpOwotCX0KLQkvKiBuZXdfaW5zZXJ0X3B0ciA9IG5vZGVfcG9pbnRlciB0byBTX25ldyAqLwotCW5ld19pbnNlcnRfcHRyID0gU19uZXc7Ci0KLQlSRkFMU0UgKCFidWZmZXJfam91cm5hbGVkKFNfbmV3KSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShTX25ldykgfHwKLQkJYnVmZmVyX2RpcnR5IChTX25ldyksCi0JCSJjbS0wMDAwMTogYmFkIFNfbmV3ICglYikiLCBTX25ldyk7Ci0KLQkvLyBTX25ldyBpcyByZWxlYXNlZCBpbiB1bmZpeF9ub2RlcwotICAgIH0KLQotICAgIG4gPSBCX05SX0lURU1TICh0YlNoKTsgLypudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLwotCi0JaWYgKCAwIDw9IGNoaWxkX3BvcyAmJiBjaGlsZF9wb3MgPD0gbiAmJiBpbnNlcnRfbnVtID4gMCApIHsKLQkgICAgYmkudGIgPSB0YjsKLQkgICAgYmkuYmlfYmggPSB0YlNoOwotCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKLQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoCi0JCSAgICAmYmksLyp0YlNoLCovCi0JCSAgICAvKgkJKCB0Yi0+U1toLTFdLT5iX3BhcmVudCA9PSB0Yi0+U1toXSApID8gdGItPlNbaC0xXS0+Yl9uZXh0IDogIHRiLT5TW2hdLT5iX2NoaWxkLT5iX25leHQsKi8KLQkJICAgIGNoaWxkX3BvcyxpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cgotCQkgICAgKTsKKwkJLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKKwkJcmV0dXJuIG9yZGVyOwogCX0KIAorCWlmICghdGJTaCkgeworCQkvKiBjcmVhdGUgbmV3IHJvb3QgKi8KKwkJc3RydWN0IGRpc2tfY2hpbGQgKmRjOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiU2hfMSA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoIC0gMSk7CisJCXN0cnVjdCBibG9ja19oZWFkICpibGtoOwogCi0JbWVtY3B5IChuZXdfaW5zZXJ0X2tleV9hZGRyLCZuZXdfaW5zZXJ0X2tleSxLRVlfU0laRSk7CisJCWlmICh0Yi0+YmxrbnVtW2hdICE9IDEpCisJCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJCSAgICAgICAiYmFsYW5jZV9pbnRlcm5hbDogT25lIG5ldyBub2RlIHJlcXVpcmVkIGZvciBjcmVhdGluZyB0aGUgbmV3IHJvb3QiKTsKKwkJLyogU1toXSA9IGVtcHR5IGJ1ZmZlciBmcm9tIHRoZSBsaXN0IEZFQi4gKi8KKwkJdGJTaCA9IGdldF9GRUIodGIpOworCQlibGtoID0gQl9CTEtfSEVBRCh0YlNoKTsKKwkJc2V0X2Jsa2hfbGV2ZWwoYmxraCwgaCArIDEpOworCisJCS8qIFB1dCB0aGUgdW5pcXVlIG5vZGUtcG9pbnRlciB0byBTW2hdIHRoYXQgcG9pbnRzIHRvIFNbaC0xXS4gKi8KKworCQlkYyA9IEJfTl9DSElMRCh0YlNoLCAwKTsKKwkJcHV0X2RjX2Jsb2NrX251bWJlcihkYywgdGJTaF8xLT5iX2Jsb2NrbnIpOworCQlwdXRfZGNfc2l6ZShkYywKKwkJCSAgICAoTUFYX0NISUxEX1NJWkUodGJTaF8xKSAtIEJfRlJFRV9TUEFDRSh0YlNoXzEpKSk7CisKKwkJdGItPmluc2VydF9zaXplW2hdIC09IERDX1NJWkU7CisJCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gRENfU0laRSk7CisKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KHRiLCB0YlNoLCAwKTsKKworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbCh0YlNoKTsKKwkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKworCQkvKiBwdXQgbmV3IHJvb3QgaW50byBwYXRoIHN0cnVjdHVyZSAqLworCQlQQVRIX09GRlNFVF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0KKwkJICAgIHRiU2g7CisKKwkJLyogQ2hhbmdlIHJvb3QgaW4gc3RydWN0dXJlIHN1cGVyIGJsb2NrLiAqLworCQlQVVRfU0JfUk9PVF9CTE9DSyh0Yi0+dGJfc2IsIHRiU2gtPmJfYmxvY2tucik7CisJCVBVVF9TQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IsIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgKyAxKTsKKwkJZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5KHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7CisJfQorCisJaWYgKHRiLT5ibGtudW1baF0gPT0gMikgeworCQlpbnQgc251bTsKKwkJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKworCQkvKiBTX25ldyA9IGZyZWUgYnVmZmVyIGZyb20gbGlzdCBGRUIgKi8KKwkJU19uZXcgPSBnZXRfRkVCKHRiKTsKKworCQlzZXRfYmxraF9sZXZlbChCX0JMS19IRUFEKFNfbmV3KSwgaCArIDEpOworCisJCWRlc3RfYmkudGIgPSB0YjsKKwkJZGVzdF9iaS5iaV9iaCA9IFNfbmV3OworCQlkZXN0X2JpLmJpX3BhcmVudCA9IE5VTEw7CisJCWRlc3RfYmkuYmlfcG9zaXRpb24gPSAwOworCQlzcmNfYmkudGIgPSB0YjsKKwkJc3JjX2JpLmJpX2JoID0gdGJTaDsKKwkJc3JjX2JpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJc3JjX2JpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisKKwkJbiA9IEJfTlJfSVRFTVModGJTaCk7CS8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCisJCXNudW0gPSAoaW5zZXJ0X251bSArIG4gKyAxKSAvIDI7CisJCWlmIChuIC0gc251bSA+PSBjaGlsZF9wb3MpIHsKKwkJCS8qIG5ldyBpdGVtcyBkb24ndCBmYWxsIGludG8gU19uZXcgKi8KKwkJCS8qICBzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCisJCQkvKiBuZXdfaW5zZXJ0X2tleSA9IChuIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KKwkJCW1lbWNweSgmbmV3X2luc2VydF9rZXksIEJfTl9QREVMSU1fS0VZKHRiU2gsIG4gLSBzbnVtKSwKKwkJCSAgICAgICBLRVlfU0laRSk7CisJCQkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCisJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCQkJICAgICBMQVNUX1RPX0ZJUlNULCBzbnVtLCAwKTsKKwkJCS8qICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldywgdGJTaCwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7ICovCisJCX0gZWxzZSBpZiAobiArIGluc2VydF9udW0gLSBzbnVtIDwgY2hpbGRfcG9zKSB7CisJCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBTX25ldyAqLworCQkJLyogIHN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KKwkJCS8qIG5ld19pbnNlcnRfa2V5ID0gKG4gKyBpbnNlcnRfaXRlbSAtIHNudW0pJ3RoIGtleSBpbiBTW2hdICovCisJCQltZW1jcHkoJm5ld19pbnNlcnRfa2V5LAorCQkJICAgICAgIEJfTl9QREVMSU1fS0VZKHRiU2gsIG4gKyBpbnNlcnRfbnVtIC0gc251bSksCisJCQkgICAgICAgS0VZX1NJWkUpOworCQkJLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLworCQkJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwKKwkJCQkJCSAgICAgTEFTVF9UT19GSVJTVCwKKwkJCQkJCSAgICAgc251bSAtIGluc2VydF9udW0sIDApOworCQkJLyogICAgICAgICAgICAgICAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxzbnVtIC0gaW5zZXJ0X251bSwwKTsgKi8KKworCQkJLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFNfbmV3ICovCisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZkZXN0X2JpLAorCQkJCQkgICAgICAgLypTX25ldyx0Yi0+U1toLTFdLT5iX25leHQsICovCisJCQkJCSAgICAgICBjaGlsZF9wb3MgLSBuIC0gaW5zZXJ0X251bSArCisJCQkJCSAgICAgICBzbnVtIC0gMSwKKwkJCQkJICAgICAgIGluc2VydF9udW0sIGluc2VydF9rZXksCisJCQkJCSAgICAgICBpbnNlcnRfcHRyKTsKKworCQkJaW5zZXJ0X251bSA9IDA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisKKwkJCS8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIFNfbmV3LCBidXQgc29tZSBkb24ndCBmYWxsICovCisJCQkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCisJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCQkJICAgICBMQVNUX1RPX0ZJUlNULAorCQkJCQkJICAgICBuIC0gY2hpbGRfcG9zICsgMSwgMSk7CisJCQkvKiAgICAgICAgICAgICAgICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLG4gLSBjaGlsZF9wb3MgKyAxLDEpOyAqLworCQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gU19uZXcgKi8KKwkJCWsgPSBzbnVtIC0gbiArIGNoaWxkX3BvcyAtIDE7CisKKwkJCWludGVybmFsX2luc2VydF9jaGlsZHMoJmRlc3RfYmksIC8qU19uZXcsICovIDAsIGssCisJCQkJCSAgICAgICBpbnNlcnRfa2V5ICsgMSwgaW5zZXJ0X3B0ciArIDEpOworCisJCQkvKiBuZXdfaW5zZXJ0X2tleSA9IGluc2VydF9rZXlbaW5zZXJ0X251bSAtIGsgLSAxXSAqLworCQkJbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSwgaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSwKKwkJCSAgICAgICBLRVlfU0laRSk7CisJCQkvKiByZXBsYWNlIGZpcnN0IG5vZGUtcHRyIGluIFNfbmV3IGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdICovCisKKwkJCWRjID0gQl9OX0NISUxEKFNfbmV3LCAwKTsKKwkJCXB1dF9kY19zaXplKGRjLAorCQkJCSAgICAoTUFYX0NISUxEX1NJWkUKKwkJCQkgICAgIChpbnNlcnRfcHRyW2luc2VydF9udW0gLSBrIC0gMV0pIC0KKwkJCQkgICAgIEJfRlJFRV9TUEFDRShpbnNlcnRfcHRyCisJCQkJCQkgIFtpbnNlcnRfbnVtIC0gayAtIDFdKSkpOworCQkJcHV0X2RjX2Jsb2NrX251bWJlcihkYywKKwkJCQkJICAgIGluc2VydF9wdHJbaW5zZXJ0X251bSAtIGsgLQorCQkJCQkJICAgICAgIDFdLT5iX2Jsb2NrbnIpOworCisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIFNfbmV3LCAwKTsKKworCQkJaW5zZXJ0X251bSAtPSAoayArIDEpOworCQl9CisJCS8qIG5ld19pbnNlcnRfcHRyID0gbm9kZV9wb2ludGVyIHRvIFNfbmV3ICovCisJCW5ld19pbnNlcnRfcHRyID0gU19uZXc7CisKKwkJUkZBTFNFKCFidWZmZXJfam91cm5hbGVkKFNfbmV3KSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShTX25ldykKKwkJICAgICAgIHx8IGJ1ZmZlcl9kaXJ0eShTX25ldyksICJjbS0wMDAwMTogYmFkIFNfbmV3ICglYikiLAorCQkgICAgICAgU19uZXcpOworCisJCS8vIFNfbmV3IGlzIHJlbGVhc2VkIGluIHVuZml4X25vZGVzCisJfQorCisJbiA9IEJfTlJfSVRFTVModGJTaCk7CS8qbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KKworCWlmICgwIDw9IGNoaWxkX3BvcyAmJiBjaGlsZF9wb3MgPD0gbiAmJiBpbnNlcnRfbnVtID4gMCkgeworCQliaS50YiA9IHRiOworCQliaS5iaV9iaCA9IHRiU2g7CisJCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKwkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmYmksCS8qdGJTaCwgKi8KKwkJCQkgICAgICAgLyogICAgICAgICAgKCB0Yi0+U1toLTFdLT5iX3BhcmVudCA9PSB0Yi0+U1toXSApID8gdGItPlNbaC0xXS0+Yl9uZXh0IDogIHRiLT5TW2hdLT5iX2NoaWxkLT5iX25leHQsICovCisJCQkJICAgICAgIGNoaWxkX3BvcywgaW5zZXJ0X251bSwgaW5zZXJ0X2tleSwKKwkJCQkgICAgICAgaW5zZXJ0X3B0cik7CisJfQorCisJbWVtY3B5KG5ld19pbnNlcnRfa2V5X2FkZHIsICZuZXdfaW5zZXJ0X2tleSwgS0VZX1NJWkUpOwogCWluc2VydF9wdHJbMF0gPSBuZXdfaW5zZXJ0X3B0cjsKIAogCXJldHVybiBvcmRlcjsKLSAgICB9Ci0KLSAgCi0gICAgCit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCAyODlkODY0Li4xYWFmMmM3IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTE4LDEwNyArMTgsMTA5IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAotZXh0ZXJuIGludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7IC8qIGRlZmF1bHQgaW8gc2l6ZSBkZXZ1bmVkIGluIHN1cGVyLmMgKi8KK2V4dGVybiBpbnQgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOwkvKiBkZWZhdWx0IGlvIHNpemUgZGV2dW5lZCBpbiBzdXBlci5jICovCiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKKwkJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOwogc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKIAotdm9pZCByZWlzZXJmc19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQordm9pZCByZWlzZXJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkgcXVvdGEgdXBkYXRlIChwb3NzaWJseSBkZWxldGUpICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYik7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCS8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSBxdW90YSB1cGRhdGUgKHBvc3NpYmx5IGRlbGV0ZSkgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsKKwkgICAgMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwogCi0gICAgLyogVGhlID0gMCBoYXBwZW5zIHdoZW4gd2UgYWJvcnQgY3JlYXRpbmcgYSBuZXcgaW5vZGUgZm9yIHNvbWUgcmVhc29uIGxpa2UgbGFjayBvZiBzcGFjZS4uICovCi0gICAgaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgJiYgSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQgIT0gMCkgeyAvKiBhbHNvIGhhbmRsZXMgYmFkX2lub2RlIGNhc2UgKi8KLQlkb3duICgmaW5vZGUtPmlfc2VtKTsgCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CiAKLQlyZWlzZXJmc19kZWxldGVfeGF0dHJzIChpbm9kZSk7CisJLyogVGhlID0gMCBoYXBwZW5zIHdoZW4gd2UgYWJvcnQgY3JlYXRpbmcgYSBuZXcgaW5vZGUgZm9yIHNvbWUgcmVhc29uIGxpa2UgbGFjayBvZiBzcGFjZS4uICovCisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgJiYgSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQgIT0gMCkgewkvKiBhbHNvIGhhbmRsZXMgYmFkX2lub2RlIGNhc2UgKi8KKwkJZG93bigmaW5vZGUtPmlfc2VtKTsKIAotCWlmIChqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKLQkgICAgdXAgKCZpbm9kZS0+aV9zZW0pOwotCSAgICBnb3RvIG91dDsKKwkJcmVpc2VyZnNfZGVsZXRlX3hhdHRycyhpbm9kZSk7CisKKwkJaWYgKGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgeworCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCisJCWlmIChyZWlzZXJmc19kZWxldGVfb2JqZWN0KCZ0aCwgaW5vZGUpKSB7CisJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogRG8gcXVvdGEgdXBkYXRlIGluc2lkZSBhIHRyYW5zYWN0aW9uIGZvciBqb3VybmFsZWQgcXVvdGFzLiBXZSBtdXN0IGRvIHRoYXQKKwkJICogYWZ0ZXIgZGVsZXRlX29iamVjdCBzbyB0aGF0IHF1b3RhIHVwZGF0ZXMgZ28gaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcworCQkgKiBzdGF0IGRhdGEgZGVsZXRpb24gKi8KKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisKKwkJaWYgKGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKKwkJCXVwKCZpbm9kZS0+aV9zZW0pOworCQkJZ290byBvdXQ7CisJCX0KKworCQl1cCgmaW5vZGUtPmlfc2VtKTsKKworCQkvKiBhbGwgaXRlbXMgb2YgZmlsZSBhcmUgZGVsZXRlZCwgc28gd2UgY2FuIHJlbW92ZSAic2F2ZSIgbGluayAqLworCQlyZW1vdmVfc2F2ZV9saW5rKGlub2RlLCAwIC8qIG5vdCB0cnVuY2F0ZSAqLyApOwkvKiB3ZSBjYW4ndCBkbyBhbnl0aGluZworCQkJCQkJCQkgKiBhYm91dCBhbiBlcnJvciBoZXJlICovCisJfSBlbHNlIHsKKwkJLyogbm8gb2JqZWN0IGl0ZW1zIGFyZSBpbiB0aGUgdHJlZSAqLworCQk7CiAJfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotCi0JaWYgKHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKCZ0aCwgaW5vZGUpKSB7Ci0JICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKLQkgICAgZ290byBvdXQ7Ci0JfQotCi0JLyogRG8gcXVvdGEgdXBkYXRlIGluc2lkZSBhIHRyYW5zYWN0aW9uIGZvciBqb3VybmFsZWQgcXVvdGFzLiBXZSBtdXN0IGRvIHRoYXQKLQkgKiBhZnRlciBkZWxldGVfb2JqZWN0IHNvIHRoYXQgcXVvdGEgdXBkYXRlcyBnbyBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCi0JICogc3RhdCBkYXRhIGRlbGV0aW9uICovCi0JRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7Ci0KLQlpZiAoam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgewotCSAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQotICAgICAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0KLSAgICAgICAgLyogYWxsIGl0ZW1zIG9mIGZpbGUgYXJlIGRlbGV0ZWQsIHNvIHdlIGNhbiByZW1vdmUgInNhdmUiIGxpbmsgKi8KLQlyZW1vdmVfc2F2ZV9saW5rIChpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7IC8qIHdlIGNhbid0IGRvIGFueXRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWJvdXQgYW4gZXJyb3IgaGVyZSAqLwotICAgIH0gZWxzZSB7Ci0JLyogbm8gb2JqZWN0IGl0ZW1zIGFyZSBpbiB0aGUgdHJlZSAqLwotCTsKLSAgICB9Ci1vdXQ6Ci0gICAgY2xlYXJfaW5vZGUgKGlub2RlKTsgLyogbm90ZSB0aGlzIG11c3QgZ28gYWZ0ZXIgdGhlIGpvdXJuYWxfZW5kIHRvIHByZXZlbnQgZGVhZGxvY2sgKi8KLSAgICBpbm9kZS0+aV9ibG9ja3MgPSAwOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgICBvdXQ6CisJY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBub3RlIHRoaXMgbXVzdCBnbyBhZnRlciB0aGUgam91cm5hbF9lbmQgdG8gcHJldmVudCBkZWFkbG9jayAqLworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIH0KIAotc3RhdGljIHZvaWQgX21ha2VfY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIGludCB2ZXJzaW9uLCBfX3UzMiBkaXJpZCwgX191MzIgb2JqZWN0aWQsIAotCSAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCApCitzdGF0aWMgdm9pZCBfbWFrZV9jcHVfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXksIGludCB2ZXJzaW9uLCBfX3UzMiBkaXJpZCwKKwkJCSAgX191MzIgb2JqZWN0aWQsIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoKQogewotICAgIGtleS0+dmVyc2lvbiA9IHZlcnNpb247CisJa2V5LT52ZXJzaW9uID0gdmVyc2lvbjsKIAotICAgIGtleS0+b25fZGlza19rZXkua19kaXJfaWQgPSBkaXJpZDsKLSAgICBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBvYmplY3RpZDsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoa2V5LCBvZmZzZXQpOwotICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCB0eXBlKTsgIAotICAgIGtleS0+a2V5X2xlbmd0aCA9IGxlbmd0aDsKKwlrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaWQ7CisJa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gb2JqZWN0aWQ7CisJc2V0X2NwdV9rZXlfa19vZmZzZXQoa2V5LCBvZmZzZXQpOworCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIHR5cGUpOworCWtleS0+a2V5X2xlbmd0aCA9IGxlbmd0aDsKIH0KIAotCiAvKiB0YWtlIGJhc2Ugb2YgaW5vZGVfa2V5IChpdCBjb21lcyBmcm9tIGlub2RlIGFsd2F5cykgKGRpcmlkLCBvYmplY3RpZCkgYW5kIHZlcnNpb24gZnJvbSBhbiBpbm9kZSwgc2V0CiAgICBvZmZzZXQgYW5kIHR5cGUgb2Yga2V5ICovCi12b2lkIG1ha2VfY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAotCSAgICAgIGludCB0eXBlLCBpbnQgbGVuZ3RoICkKK3ZvaWQgbWFrZV9jcHVfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCSAgaW50IHR5cGUsIGludCBsZW5ndGgpCiB7Ci0gIF9tYWtlX2NwdV9rZXkgKGtleSwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSwgbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpLAotCQkgbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19vYmplY3RpZCksIAotCQkgb2Zmc2V0LCB0eXBlLCBsZW5ndGgpOworCV9tYWtlX2NwdV9rZXkoa2V5LCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksCisJCSAgICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCksCisJCSAgICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkKSwgb2Zmc2V0LCB0eXBlLAorCQkgICAgICBsZW5ndGgpOwogfQogCi0KIC8vCiAvLyB3aGVuIGtleSBpcyAwLCBkbyBub3Qgc2V0IHZlcnNpb24gYW5kIHNob3J0IGtleQogLy8KLWlubGluZSB2b2lkIG1ha2VfbGVfaXRlbV9oZWFkIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJICAgICAgIGludCB2ZXJzaW9uLAotCQkJICAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLCAKLQkJCSAgICAgICBpbnQgZW50cnlfY291bnQvKm9yIGloX2ZyZWVfc3BhY2UqLykKK2lubGluZSB2b2lkIG1ha2VfbGVfaXRlbV9oZWFkKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJICAgICAgaW50IHZlcnNpb24sCisJCQkgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCwKKwkJCSAgICAgIGludCBlbnRyeV9jb3VudCAvKm9yIGloX2ZyZWVfc3BhY2UgKi8gKQogewotICAgIGlmIChrZXkpIHsKLQlpaC0+aWhfa2V5LmtfZGlyX2lkID0gY3B1X3RvX2xlMzIgKGtleS0+b25fZGlza19rZXkua19kaXJfaWQpOwotCWloLT5paF9rZXkua19vYmplY3RpZCA9IGNwdV90b19sZTMyIChrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpOwotICAgIH0KLSAgICBwdXRfaWhfdmVyc2lvbiggaWgsIHZlcnNpb24gKTsKLSAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBvZmZzZXQpOwotICAgIHNldF9sZV9paF9rX3R5cGUgKGloLCB0eXBlKTsKLSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBsZW5ndGggKTsKLSAgICAvKiAgICBzZXRfaWhfZnJlZV9zcGFjZSAoaWgsIDApOyovCi0gICAgLy8gZm9yIGRpcmVjdG9yeSBpdGVtcyBpdCBpcyBlbnRyeSBjb3VudCwgZm9yIGRpcmVjdHMgYW5kIHN0YXQKLSAgICAvLyBkYXRhcyAtIDB4ZmZmZiwgZm9yIGluZGlyZWN0cyAtIDAKLSAgICBwdXRfaWhfZW50cnlfY291bnQoIGloLCBlbnRyeV9jb3VudCApOworCWlmIChrZXkpIHsKKwkJaWgtPmloX2tleS5rX2Rpcl9pZCA9IGNwdV90b19sZTMyKGtleS0+b25fZGlza19rZXkua19kaXJfaWQpOworCQlpaC0+aWhfa2V5Lmtfb2JqZWN0aWQgPQorCQkgICAgY3B1X3RvX2xlMzIoa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKwl9CisJcHV0X2loX3ZlcnNpb24oaWgsIHZlcnNpb24pOworCXNldF9sZV9paF9rX29mZnNldChpaCwgb2Zmc2V0KTsKKwlzZXRfbGVfaWhfa190eXBlKGloLCB0eXBlKTsKKwlwdXRfaWhfaXRlbV9sZW4oaWgsIGxlbmd0aCk7CisJLyogICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsgKi8KKwkvLyBmb3IgZGlyZWN0b3J5IGl0ZW1zIGl0IGlzIGVudHJ5IGNvdW50LCBmb3IgZGlyZWN0cyBhbmQgc3RhdAorCS8vIGRhdGFzIC0gMHhmZmZmLCBmb3IgaW5kaXJlY3RzIC0gMAorCXB1dF9paF9lbnRyeV9jb3VudChpaCwgZW50cnlfY291bnQpOwogfQogCiAvLwpAQCAtMTUzLDg0ICsxNTUsODQgQEAKICoqIHRvIGJlIHVubWFwcGVkLCBzbyB0aGF0IGJsb2NrX3ByZXBhcmVfd3JpdGUgd2lsbCBjb3JyZWN0bHkgY2FsbAogKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIGNvbnZlcnQgdGhlIHRhaWwgaW50byBhbiB1bmZvcm1hdHRlZCBub2RlCiAqLwotc3RhdGljIGlubGluZSB2b2lkIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcoc3RydWN0IHBhZ2UgKnBhZ2UpIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpuZXh0LCAqYmggOworc3RhdGljIGlubGluZSB2b2lkIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqbmV4dCwgKmJoOwogCi0gICAgaWYgKHBhZ2UgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewotCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotCWJoID0gaGVhZCA7Ci0JZG8gewotCSAgICBuZXh0ID0gYmgtPmJfdGhpc19wYWdlIDsKLQkgICAgaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkgewotCSAgICAgICAgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKGJoKSA7Ci0JICAgIH0KLQkgICAgYmggPSBuZXh0IDsKLQl9IHdoaWxlIChiaCAhPSBoZWFkKSA7Ci0gICAgfQorCWlmIChwYWdlICYmIHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJYmggPSBoZWFkOworCQlkbyB7CisJCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCQkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkgeworCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7CisJCQl9CisJCQliaCA9IG5leHQ7CisJCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCX0KIH0KIAogLyogcmVpc2VyZnNfZ2V0X2Jsb2NrIGRvZXMgbm90IG5lZWQgdG8gYWxsb2NhdGUgYSBibG9jayBvbmx5IGlmIGl0IGhhcyBiZWVuCiAgICBkb25lIGFscmVhZHkgb3Igbm9uLWhvbGUgcG9zaXRpb24gaGFzIGJlZW4gZm91bmQgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFsbG9jYXRpb25fbmVlZGVkIChpbnQgcmV0dmFsLCBiX2Jsb2NrbnJfdCBhbGxvY2F0ZWQsIAotCQkJCSAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLAotCQkJCSAgICAgX19sZTMyICogaXRlbSwgaW50IHBvc19pbl9pdGVtKQorc3RhdGljIGlubGluZSBpbnQgYWxsb2NhdGlvbl9uZWVkZWQoaW50IHJldHZhbCwgYl9ibG9ja25yX3QgYWxsb2NhdGVkLAorCQkJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwKKwkJCQkgICAgX19sZTMyICogaXRlbSwgaW50IHBvc19pbl9pdGVtKQogewotICBpZiAoYWxsb2NhdGVkKQotCSByZXR1cm4gMDsKLSAgaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCAmJiBpc19pbmRpcmVjdF9sZV9paCAoaWgpICYmIAotICAgICAgZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSkpCi0JIHJldHVybiAwOwotICByZXR1cm4gMTsKKwlpZiAoYWxsb2NhdGVkKQorCQlyZXR1cm4gMDsKKwlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSAmJgorCSAgICBnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGluZGlyZWN0X2l0ZW1fZm91bmQgKGludCByZXR2YWwsIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCkKK3N0YXRpYyBpbmxpbmUgaW50IGluZGlyZWN0X2l0ZW1fZm91bmQoaW50IHJldHZhbCwgc3RydWN0IGl0ZW1faGVhZCAqaWgpCiB7Ci0gIHJldHVybiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSAmJiBpc19pbmRpcmVjdF9sZV9paCAoaWgpOworCXJldHVybiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSAmJiBpc19pbmRpcmVjdF9sZV9paChpaCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9ibG9ja19kZXZfbWFwcGVkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgCi0JCQkJCSBiX2Jsb2NrbnJfdCBibG9jaywgc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Jsb2NrX2Rldl9tYXBwZWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkJYl9ibG9ja25yX3QgYmxvY2ssIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2spOwogfQogCi0KIC8vCiAvLyBmaWxlcyB3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGVhcmxpZXIgdmVyc2lvbiBjYW4gbm90IGJlIGxvbmdlciwKIC8vIHRoYW4gMiBnYgogLy8KLXN0YXRpYyBpbnQgZmlsZV9jYXBhYmxlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaykKK3N0YXRpYyBpbnQgZmlsZV9jYXBhYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2spCiB7Ci0gICAgaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgIT0gS0VZX0ZPUk1BVF8zXzUgfHwgLy8gaXQgaXMgbmV3IGZpbGUuCi0JYmxvY2sgPCAoMSA8PCAoMzEgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpKSAvLyBvbGQgZmlsZSwgYnV0ICdibG9jaycgaXMgaW5zaWRlIG9mIDJnYgotCXJldHVybiAxOworCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgIT0gS0VZX0ZPUk1BVF8zXzUgfHwJLy8gaXQgaXMgbmV3IGZpbGUuCisJICAgIGJsb2NrIDwgKDEgPDwgKDMxIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKSkJLy8gb2xkIGZpbGUsIGJ1dCAnYmxvY2snIGlzIGluc2lkZSBvZiAyZ2IKKwkJcmV0dXJuIDE7CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLypzdGF0aWMqLyBpbnQgcmVzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCkgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlciA7Ci0gIGludCBsZW4gPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIDsKLSAgaW50IGVycjsKKwkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlpbnQgbGVuID0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZDsKKwlpbnQgZXJyOwogCi0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfcmVmY291bnQpOwogCi0gIC8qIHdlIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLwotICBpZiAodGgtPnRfcmVmY291bnQgPiAxKSB7Ci0gICAgICByZXR1cm4gMCAgOwotICB9Ci0gIHBhdGhyZWxzZShwYXRoKSA7Ci0gIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpIDsKLSAgZXJyID0gam91cm5hbF9lbmQodGgsIHMsIGxlbikgOwotICBpZiAoIWVycikgewotICAgICAgZXJyID0gam91cm5hbF9iZWdpbih0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiA2KSA7Ci0gICAgICBpZiAoIWVycikKLSAgICAgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gIH0KLSAgcmV0dXJuIGVycjsKKwkvKiB3ZSBjYW5ub3QgcmVzdGFydCB3aGlsZSBuZXN0ZWQgKi8KKwlpZiAodGgtPnRfcmVmY291bnQgPiAxKSB7CisJCXJldHVybiAwOworCX0KKwlwYXRocmVsc2UocGF0aCk7CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJZXJyID0gam91cm5hbF9lbmQodGgsIHMsIGxlbik7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gam91cm5hbF9iZWdpbih0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiA2KTsKKwkJaWYgKCFlcnIpCisJCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvLyBpdCBpcyBjYWxsZWQgYnkgZ2V0X2Jsb2NrIHdoZW4gY3JlYXRlID09IDAuIFJldHVybnMgYmxvY2sgbnVtYmVyCkBAIC0yNDEsMTkwICsyNDMsMTkyIEBACiAvLyBQbGVhc2UgaW1wcm92ZSB0aGUgZW5nbGlzaC9jbGFyaXR5IGluIHRoZSBjb21tZW50IGFib3ZlLCBhcyBpdCBpcwogLy8gaGFyZCB0byB1bmRlcnN0YW5kLgogCi1zdGF0aWMgaW50IF9nZXRfYmxvY2tfY3JlYXRlXzAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrLAotCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsCi0JCQkJIGludCBhcmdzKQorc3RhdGljIGludCBfZ2V0X2Jsb2NrX2NyZWF0ZV8wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2ssCisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBhcmdzKQogewotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOwotICAgIGludCBmc19nZW4gOwotICAgIGludCBibG9ja25yOwotICAgIGNoYXIgKiBwID0gTlVMTDsKLSAgICBpbnQgY2hhcnM7Ci0gICAgaW50IHJldCA7Ci0gICAgaW50IHJlc3VsdCA7Ci0gICAgaW50IGRvbmUgPSAwIDsKLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWg7CisJaW50IGZzX2dlbjsKKwlpbnQgYmxvY2tucjsKKwljaGFyICpwID0gTlVMTDsKKwlpbnQgY2hhcnM7CisJaW50IHJldDsKKwlpbnQgcmVzdWx0OworCWludCBkb25lID0gMDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAotICAgIC8vIHByZXBhcmUgdGhlIGtleSB0byBsb29rIGZvciB0aGUgJ2Jsb2NrJy10aCBibG9jayBvZiBmaWxlCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwKLQkJICAobG9mZl90KWJsb2NrICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgMSwgVFlQRV9BTlksIDMpOworCS8vIHByZXBhcmUgdGhlIGtleSB0byBsb29rIGZvciB0aGUgJ2Jsb2NrJy10aCBibG9jayBvZiBmaWxlCisJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLAorCQkgICAgIChsb2ZmX3QpIGJsb2NrICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgMSwgVFlQRV9BTlksCisJCSAgICAgMyk7CiAKLXJlc2VhcmNoOgotICAgIHJlc3VsdCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpIDsKLSAgICBpZiAocmVzdWx0ICE9IFBPU0lUSU9OX0ZPVU5EKSB7Ci0JcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgICAgIGlmIChwKQotICAgICAgICAgICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0JaWYgKHJlc3VsdCA9PSBJT19FUlJPUikKLQkgICAgcmV0dXJuIC1FSU87Ci0JLy8gV2UgZG8gbm90IHJldHVybiAtRU5PRU5UIGlmIHRoZXJlIGlzIGEgaG9sZSBidXQgcGFnZSBpcyB1cHRvZGF0ZSwgYmVjYXVzZSBpdCBtZWFucwotCS8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gYmUgd3JpdHRlbiB0byBkaXNrLgotCWlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKSAmJiAhUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSApIHsKLQkgICAgcmV0dXJuIC1FTk9FTlQgOworICAgICAgcmVzZWFyY2g6CisJcmVzdWx0ID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmVzdWx0ICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCWlmIChwKQorCQkJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKwkJaWYgKHJlc3VsdCA9PSBJT19FUlJPUikKKwkJCXJldHVybiAtRUlPOworCQkvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCisJCS8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gYmUgd3JpdHRlbiB0byBkaXNrLgorCQlpZiAoKGFyZ3MgJiBHRVRfQkxPQ0tfTk9fSE9MRSkKKwkJICAgICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpKSB7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQlyZXR1cm4gMDsKIAl9Ci0gICAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICBiaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7Ci0gICAgaWggPSBnZXRfaWggKCZwYXRoKTsKLSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCV9fbGUzMiAqIGluZF9pdGVtID0gKF9fbGUzMiAqKUJfSV9QSVRFTSAoYmgsIGloKTsKLQkKLQkvKiBGSVhNRTogaGVyZSB3ZSBjb3VsZCBjYWNoZSBpbmRpcmVjdCBpdGVtIG9yIHBhcnQgb2YgaXQgaW4KLQkgICB0aGUgaW5vZGUgdG8gYXZvaWQgc2VhcmNoX2J5X2tleSBpbiBjYXNlIG9mIHN1YnNlcXVlbnQKLQkgICBhY2Nlc3MgdG8gZmlsZSAqLwotCWJsb2NrbnIgPSBnZXRfYmxvY2tfbnVtKGluZF9pdGVtLCBwYXRoLnBvc19pbl9pdGVtKSA7Ci0JcmV0ID0gMCA7Ci0JaWYgKGJsb2NrbnIpIHsKLQkgICAgbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGJsb2NrbnIpOwotCSAgICBpZiAocGF0aC5wb3NfaW5faXRlbSA9PSAoKGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFKSAtIDEpKSB7Ci0JCXNldF9idWZmZXJfYm91bmRhcnkoYmhfcmVzdWx0KTsKLQkgICAgfQotCX0gZWxzZSAKLQkgICAgLy8gV2UgZG8gbm90IHJldHVybiAtRU5PRU5UIGlmIHRoZXJlIGlzIGEgaG9sZSBidXQgcGFnZSBpcyB1cHRvZGF0ZSwgYmVjYXVzZSBpdCBtZWFucwotCSAgICAvLyBUaGF0IHRoZXJlIGlzIHNvbWUgTU1BUEVEIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXMgeWV0IHRvICBiZSB3cml0dGVuIHRvIGRpc2suCi0JICAgIGlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKSAmJiAhUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSApIHsKLQkgICAgcmV0ID0gLUVOT0VOVCA7Ci0JICAgIH0KKwkvLworCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCWloID0gZ2V0X2loKCZwYXRoKTsKKwlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCV9fbGUzMiAqaW5kX2l0ZW0gPSAoX19sZTMyICopIEJfSV9QSVRFTShiaCwgaWgpOwogCi0JcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgICAgIGlmIChwKQotICAgICAgICAgICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0JcmV0dXJuIHJldCA7Ci0gICAgfQorCQkvKiBGSVhNRTogaGVyZSB3ZSBjb3VsZCBjYWNoZSBpbmRpcmVjdCBpdGVtIG9yIHBhcnQgb2YgaXQgaW4KKwkJICAgdGhlIGlub2RlIHRvIGF2b2lkIHNlYXJjaF9ieV9rZXkgaW4gY2FzZSBvZiBzdWJzZXF1ZW50CisJCSAgIGFjY2VzcyB0byBmaWxlICovCisJCWJsb2NrbnIgPSBnZXRfYmxvY2tfbnVtKGluZF9pdGVtLCBwYXRoLnBvc19pbl9pdGVtKTsKKwkJcmV0ID0gMDsKKwkJaWYgKGJsb2NrbnIpIHsKKwkJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBibG9ja25yKTsKKwkJCWlmIChwYXRoLnBvc19pbl9pdGVtID09CisJCQkgICAgKChpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSkgLSAxKSkgeworCQkJCXNldF9idWZmZXJfYm91bmRhcnkoYmhfcmVzdWx0KTsKKwkJCX0KKwkJfSBlbHNlCisJCQkvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCisJCQkvLyBUaGF0IHRoZXJlIGlzIHNvbWUgTU1BUEVEIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXMgeWV0IHRvICBiZSB3cml0dGVuIHRvIGRpc2suCisJCWlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKQorCQkJICAgICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpKSB7CisJCQlyZXQgPSAtRU5PRU5UOworCQl9CiAKLSAgICAvLyByZXF1ZXN0ZWQgZGF0YSBhcmUgaW4gZGlyZWN0IGl0ZW0ocykKLSAgICBpZiAoIShhcmdzICYgR0VUX0JMT0NLX1JFQURfRElSRUNUKSkgewotCS8vIHdlIGFyZSBjYWxsZWQgYnkgYm1hcC4gRklYTUU6IHdlIGNhbiBub3QgbWFwIGJsb2NrIG9mIGZpbGUKLQkvLyB3aGVuIGl0IGlzIHN0b3JlZCBpbiBkaXJlY3QgaXRlbShzKQotCXBhdGhyZWxzZSAoJnBhdGgpOwkKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQlyZXR1cm4gLUVOT0VOVDsKLSAgICB9CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCWlmIChwKQorCQkJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLy8gcmVxdWVzdGVkIGRhdGEgYXJlIGluIGRpcmVjdCBpdGVtKHMpCisJaWYgKCEoYXJncyAmIEdFVF9CTE9DS19SRUFEX0RJUkVDVCkpIHsKKwkJLy8gd2UgYXJlIGNhbGxlZCBieSBibWFwLiBGSVhNRTogd2UgY2FuIG5vdCBtYXAgYmxvY2sgb2YgZmlsZQorCQkvLyB3aGVuIGl0IGlzIHN0b3JlZCBpbiBkaXJlY3QgaXRlbShzKQorCQlwYXRocmVsc2UoJnBhdGgpOworCQlpZiAocCkKKwkJCWt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KIAotICAgIC8qIGlmIHdlJ3ZlIGdvdCBhIGRpcmVjdCBpdGVtLCBhbmQgdGhlIGJ1ZmZlciBvciBwYWdlIHdhcyB1cHRvZGF0ZSwKLSAgICAqKiB3ZSBkb24ndCB3YW50IHRvIHB1bGwgZGF0YSBvZmYgZGlzayBhZ2Fpbi4gIHNraXAgdG8gdGhlCi0gICAgKiogZW5kLCB3aGVyZSB3ZSBtYXAgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuCi0gICAgKi8KLSAgICBpZiAoYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKLSAgICAgICAgZ290byBmaW5pc2hlZCA7Ci0gICAgfSBlbHNlIAotCS8qCi0JKiogZ3JhYl90YWlsX3BhZ2UgY2FuIHRyaWdnZXIgY2FsbHMgdG8gcmVpc2VyZnNfZ2V0X2Jsb2NrIG9uIHVwIHRvIGRhdGUKLQkqKiBwYWdlcyB3aXRob3V0IGFueSBidWZmZXJzLiAgSWYgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSwgd2UgZG9uJ3Qgd2FudAotCSoqIHJlYWQgb2xkIGRhdGEgb2ZmIGRpc2suICBTZXQgdGhlIHVwIHRvIGRhdGUgYml0IG9uIHRoZSBidWZmZXIgaW5zdGVhZAotCSoqIGFuZCBqdW1wIHRvIHRoZSBlbmQKLQkqLwotCSAgICBpZiAoIWJoX3Jlc3VsdC0+Yl9wYWdlIHx8IFBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkvKiBpZiB3ZSd2ZSBnb3QgYSBkaXJlY3QgaXRlbSwgYW5kIHRoZSBidWZmZXIgb3IgcGFnZSB3YXMgdXB0b2RhdGUsCisJICoqIHdlIGRvbid0IHdhbnQgdG8gcHVsbCBkYXRhIG9mZiBkaXNrIGFnYWluLiAgc2tpcCB0byB0aGUKKwkgKiogZW5kLCB3aGVyZSB3ZSBtYXAgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuCisJICovCisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB7CisJCWdvdG8gZmluaXNoZWQ7CisJfSBlbHNlCisJCS8qCisJCSAqKiBncmFiX3RhaWxfcGFnZSBjYW4gdHJpZ2dlciBjYWxscyB0byByZWlzZXJmc19nZXRfYmxvY2sgb24gdXAgdG8gZGF0ZQorCQkgKiogcGFnZXMgd2l0aG91dCBhbnkgYnVmZmVycy4gIElmIHRoZSBwYWdlIGlzIHVwIHRvIGRhdGUsIHdlIGRvbid0IHdhbnQKKwkJICoqIHJlYWQgb2xkIGRhdGEgb2ZmIGRpc2suICBTZXQgdGhlIHVwIHRvIGRhdGUgYml0IG9uIHRoZSBidWZmZXIgaW5zdGVhZAorCQkgKiogYW5kIGp1bXAgdG8gdGhlIGVuZAorCQkgKi8KKwlpZiAoIWJoX3Jlc3VsdC0+Yl9wYWdlIHx8IFBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpOwotCQlnb3RvIGZpbmlzaGVkIDsKLSAgICB9Ci0KLSAgICAvLyByZWFkIGZpbGUgdGFpbCBpbnRvIHBhcnQgb2YgcGFnZQotICAgIG9mZnNldCA9IChjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotICAgIGZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKSA7Ci0gICAgY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsKLQotICAgIC8qIHdlIG9ubHkgd2FudCB0byBrbWFwIGlmIHdlIGFyZSByZWFkaW5nIHRoZSB0YWlsIGludG8gdGhlIHBhZ2UuCi0gICAgKiogdGhpcyBpcyBub3QgdGhlIGNvbW1vbiBjYXNlLCBzbyB3ZSBkb24ndCBrbWFwIHVudGlsIHdlIGFyZQotICAgICoqIHN1cmUgd2UgbmVlZCB0by4gIEJ1dCwgdGhpcyBtZWFucyB0aGUgaXRlbSBtaWdodCBtb3ZlIGlmCi0gICAgKioga21hcCBzY2hlZHVsZXMKLSAgICAqLwotICAgIGlmICghcCkgewotCXAgPSAoY2hhciAqKWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIGdvdG8gcmVzZWFyY2g7CisJCWdvdG8gZmluaXNoZWQ7CiAJfQotICAgIH0KLSAgICBwICs9IG9mZnNldCA7Ci0gICAgbWVtc2V0IChwLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotICAgIGRvIHsKLQlpZiAoIWlzX2RpcmVjdF9sZV9paCAoaWgpKSB7Ci0JICAgIEJVRyAoKTsKLSAgICAgICAgfQotCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIG1vcmUgYnl0ZXMgdGhhbiBhY3R1YWxseSBleGlzdCBpbgotCSoqIHRoZSBmaWxlLiAgVGhpcyBjYW4gaGFwcGVuIGluIG9kZCBjYXNlcyB3aGVyZSBpX3NpemUgaXNuJ3QKLQkqKiBjb3JyZWN0LCBhbmQgd2hlbiBkaXJlY3QgaXRlbSBwYWRkaW5nIHJlc3VsdHMgaW4gYSBmZXcgCi0JKiogZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0IGl0ZW0KLQkqLwotICAgICAgICBpZiAoKGxlX2loX2tfb2Zmc2V0KGloKSArIHBhdGgucG9zX2luX2l0ZW0pID4gaW5vZGUtPmlfc2l6ZSkKLQkgICAgYnJlYWsgOwotCWlmICgobGVfaWhfa19vZmZzZXQoaWgpIC0gMSArIGloX2l0ZW1fbGVuKGloKSkgPiBpbm9kZS0+aV9zaXplKSB7Ci0JICAgIGNoYXJzID0gaW5vZGUtPmlfc2l6ZSAtIChsZV9paF9rX29mZnNldChpaCkgLSAxKSAtIHBhdGgucG9zX2luX2l0ZW07Ci0JICAgIGRvbmUgPSAxIDsKLQl9IGVsc2UgewotCSAgICBjaGFycyA9IGloX2l0ZW1fbGVuKGloKSAtIHBhdGgucG9zX2luX2l0ZW07CisJLy8gcmVhZCBmaWxlIHRhaWwgaW50byBwYXJ0IG9mIHBhZ2UKKwlvZmZzZXQgPSAoY3B1X2tleV9rX29mZnNldCgma2V5KSAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCk7CisKKwkvKiB3ZSBvbmx5IHdhbnQgdG8ga21hcCBpZiB3ZSBhcmUgcmVhZGluZyB0aGUgdGFpbCBpbnRvIHRoZSBwYWdlLgorCSAqKiB0aGlzIGlzIG5vdCB0aGUgY29tbW9uIGNhc2UsIHNvIHdlIGRvbid0IGttYXAgdW50aWwgd2UgYXJlCisJICoqIHN1cmUgd2UgbmVlZCB0by4gIEJ1dCwgdGhpcyBtZWFucyB0aGUgaXRlbSBtaWdodCBtb3ZlIGlmCisJICoqIGttYXAgc2NoZWR1bGVzCisJICovCisJaWYgKCFwKSB7CisJCXAgPSAoY2hhciAqKWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCWdvdG8gcmVzZWFyY2g7CisJCX0KIAl9Ci0JbWVtY3B5IChwLCBCX0lfUElURU0gKGJoLCBpaCkgKyBwYXRoLnBvc19pbl9pdGVtLCBjaGFycyk7CisJcCArPSBvZmZzZXQ7CisJbWVtc2V0KHAsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJZG8geworCQlpZiAoIWlzX2RpcmVjdF9sZV9paChpaCkpIHsKKwkJCUJVRygpOworCQl9CisJCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIG1vcmUgYnl0ZXMgdGhhbiBhY3R1YWxseSBleGlzdCBpbgorCQkgKiogdGhlIGZpbGUuICBUaGlzIGNhbiBoYXBwZW4gaW4gb2RkIGNhc2VzIHdoZXJlIGlfc2l6ZSBpc24ndAorCQkgKiogY29ycmVjdCwgYW5kIHdoZW4gZGlyZWN0IGl0ZW0gcGFkZGluZyByZXN1bHRzIGluIGEgZmV3IAorCQkgKiogZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0IGl0ZW0KKwkJICovCisJCWlmICgobGVfaWhfa19vZmZzZXQoaWgpICsgcGF0aC5wb3NfaW5faXRlbSkgPiBpbm9kZS0+aV9zaXplKQorCQkJYnJlYWs7CisJCWlmICgobGVfaWhfa19vZmZzZXQoaWgpIC0gMSArIGloX2l0ZW1fbGVuKGloKSkgPiBpbm9kZS0+aV9zaXplKSB7CisJCQljaGFycyA9CisJCQkgICAgaW5vZGUtPmlfc2l6ZSAtIChsZV9paF9rX29mZnNldChpaCkgLSAxKSAtCisJCQkgICAgcGF0aC5wb3NfaW5faXRlbTsKKwkJCWRvbmUgPSAxOworCQl9IGVsc2UgeworCQkJY2hhcnMgPSBpaF9pdGVtX2xlbihpaCkgLSBwYXRoLnBvc19pbl9pdGVtOworCQl9CisJCW1lbWNweShwLCBCX0lfUElURU0oYmgsIGloKSArIHBhdGgucG9zX2luX2l0ZW0sIGNoYXJzKTsKIAotCWlmIChkb25lKSAKLQkgICAgYnJlYWsgOworCQlpZiAoZG9uZSkKKwkJCWJyZWFrOwogCi0JcCArPSBjaGFyczsKKwkJcCArPSBjaGFyczsKIAotCWlmIChQQVRIX0xBU1RfUE9TSVRJT04gKCZwYXRoKSAhPSAoQl9OUl9JVEVNUyAoYmgpIC0gMSkpCi0JICAgIC8vIHdlIGRvbmUsIGlmIHJlYWQgZGlyZWN0IGl0ZW0gaXMgbm90IHRoZSBsYXN0IGl0ZW0gb2YKLQkgICAgLy8gbm9kZSBGSVhNRTogd2UgY291bGQgdHJ5IHRvIGNoZWNrIHJpZ2h0IGRlbGltaXRpbmcga2V5Ci0JICAgIC8vIHRvIHNlZSB3aGV0aGVyIGRpcmVjdCBpdGVtIGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQKLQkgICAgLy8gbmVpZ2hib3Igb3IgcmVseSBvbiBpX3NpemUKLQkgICAgYnJlYWs7CisJCWlmIChQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpICE9IChCX05SX0lURU1TKGJoKSAtIDEpKQorCQkJLy8gd2UgZG9uZSwgaWYgcmVhZCBkaXJlY3QgaXRlbSBpcyBub3QgdGhlIGxhc3QgaXRlbSBvZgorCQkJLy8gbm9kZSBGSVhNRTogd2UgY291bGQgdHJ5IHRvIGNoZWNrIHJpZ2h0IGRlbGltaXRpbmcga2V5CisJCQkvLyB0byBzZWUgd2hldGhlciBkaXJlY3QgaXRlbSBjb250aW51ZXMgaW4gdGhlIHJpZ2h0CisJCQkvLyBuZWlnaGJvciBvciByZWx5IG9uIGlfc2l6ZQorCQkJYnJlYWs7CiAKLQkvLyB1cGRhdGUga2V5IHRvIGxvb2sgZm9yIHRoZSBuZXh0IHBpZWNlCi0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZrZXksIGNwdV9rZXlfa19vZmZzZXQgKCZrZXkpICsgY2hhcnMpOwotCXJlc3VsdCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCWlmIChyZXN1bHQgIT0gUE9TSVRJT05fRk9VTkQpCi0JICAgIC8vIGkvbyBlcnJvciBtb3N0IGxpa2VseQotCSAgICBicmVhazsKLQliaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7Ci0JaWggPSBnZXRfaWggKCZwYXRoKTsKLSAgICB9IHdoaWxlICgxKTsKKwkJLy8gdXBkYXRlIGtleSB0byBsb29rIGZvciB0aGUgbmV4dCBwaWVjZQorCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgY2hhcnMpOworCQlyZXN1bHQgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQlpZiAocmVzdWx0ICE9IFBPU0lUSU9OX0ZPVU5EKQorCQkJLy8gaS9vIGVycm9yIG1vc3QgbGlrZWx5CisJCQlicmVhazsKKwkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCWloID0gZ2V0X2loKCZwYXRoKTsKKwl9IHdoaWxlICgxKTsKIAotICAgIGZsdXNoX2RjYWNoZV9wYWdlKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0gICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisJZmx1c2hfZGNhY2hlX3BhZ2UoYmhfcmVzdWx0LT5iX3BhZ2UpOworCWt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSk7CiAKLWZpbmlzaGVkOgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOworICAgICAgZmluaXNoZWQ6CisJcGF0aHJlbHNlKCZwYXRoKTsKIAotICAgIGlmIChyZXN1bHQgPT0gSU9fRVJST1IpCi0JcmV0dXJuIC1FSU87CisJaWYgKHJlc3VsdCA9PSBJT19FUlJPUikKKwkJcmV0dXJuIC1FSU87CiAKLSAgICAvKiB0aGlzIGJ1ZmZlciBoYXMgdmFsaWQgZGF0YSwgYnV0IGlzbid0IHZhbGlkIGZvciBpby4gIG1hcHBpbmcgaXQgdG8KLSAgICAgKiBibG9jayAjMCB0ZWxscyB0aGUgcmVzdCBvZiByZWlzZXJmcyBpdCBqdXN0IGhhcyBhIHRhaWwgaW4gaXQKLSAgICAgKi8KLSAgICBtYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgMCk7Ci0gICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSAoYmhfcmVzdWx0KTsKLSAgICByZXR1cm4gMDsKKwkvKiB0aGlzIGJ1ZmZlciBoYXMgdmFsaWQgZGF0YSwgYnV0IGlzbid0IHZhbGlkIGZvciBpby4gIG1hcHBpbmcgaXQgdG8KKwkgKiBibG9jayAjMCB0ZWxscyB0aGUgcmVzdCBvZiByZWlzZXJmcyBpdCBqdXN0IGhhcyBhIHRhaWwgaW4gaXQKKwkgKi8KKwltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgMCk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpOworCXJldHVybiAwOwogfQogCi0KIC8vIHRoaXMgaXMgY2FsbGVkIHRvIGNyZWF0ZSBmaWxlIG1hcC4gU28sIF9nZXRfYmxvY2tfY3JlYXRlXzAgd2lsbCBub3QKIC8vIHJlYWQgZGlyZWN0IGl0ZW0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfYm1hcCAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0gICAgaWYgKCFmaWxlX2NhcGFibGUgKGlub2RlLCBibG9jaykpCi0JcmV0dXJuIC1FRkJJRzsKKwlpZiAoIWZpbGVfY2FwYWJsZShpbm9kZSwgYmxvY2spKQorCQlyZXR1cm4gLUVGQklHOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgLyogZG8gbm90IHJlYWQgdGhlIGRpcmVjdCBpdGVtICovCi0gICAgX2dldF9ibG9ja19jcmVhdGVfMCAoaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIDApIDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCS8qIGRvIG5vdCByZWFkIHRoZSBkaXJlY3QgaXRlbSAqLworCV9nZXRfYmxvY2tfY3JlYXRlXzAoaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIDApOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHNwZWNpYWwgdmVyc2lvbiBvZiBnZXRfYmxvY2sgdGhhdCBpcyBvbmx5IHVzZWQgYnkgZ3JhYl90YWlsX3BhZ2UgcmlnaHQKQEAgLTQ0NCw5ICs0NDgsMTEgQEAKICoqIGRvbid0IHdhbnQgdG8gc2VuZCBjcmVhdGUgPT0gR0VUX0JMT0NLX05PX0hPTEUgdG8gcmVpc2VyZnNfZ2V0X2Jsb2NrLCAKICoqIGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLgogKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpIHsKLSAgICByZXR1cm4gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBHRVRfQkxPQ0tfTk9fSE9MRSkgOworc3RhdGljIGludCByZWlzZXJmc19nZXRfYmxvY2tfY3JlYXRlXzAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJCSAgICAgICBpbnQgY3JlYXRlKQoreworCXJldHVybiByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIEdFVF9CTE9DS19OT19IT0xFKTsKIH0KIAogLyogVGhpcyBpcyBzcGVjaWFsIGhlbHBlciBmb3IgcmVpc2VyZnNfZ2V0X2Jsb2NrIGluIGNhc2Ugd2UgYXJlIGV4ZWN1dGluZwpAQCAtNDU3LDQ0ICs0NjMsNDMgQEAKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAogCQkJCQkgaW50IGNyZWF0ZSkKIHsKLSAgICBpbnQgcmV0IDsKKwlpbnQgcmV0OwogCi0gICAgYmhfcmVzdWx0LT5iX3BhZ2UgPSBOVUxMOworCWJoX3Jlc3VsdC0+Yl9wYWdlID0gTlVMTDsKIAotICAgIC8qIFdlIHNldCB0aGUgYl9zaXplIGJlZm9yZSByZWlzZXJmc19nZXRfYmxvY2sgY2FsbCBzaW5jZSBpdCBpcwotICAgICAgIHJlZmVyZW5jZWQgaW4gY29udmVydF90YWlsX2Zvcl9ob2xlKCkgdGhhdCBtYXkgYmUgY2FsbGVkIGZyb20KLSAgICAgICByZWlzZXJmc19nZXRfYmxvY2soKSAqLwotICAgIGJoX3Jlc3VsdC0+Yl9zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJLyogV2Ugc2V0IHRoZSBiX3NpemUgYmVmb3JlIHJlaXNlcmZzX2dldF9ibG9jayBjYWxsIHNpbmNlIGl0IGlzCisJICAgcmVmZXJlbmNlZCBpbiBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoKSB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbQorCSAgIHJlaXNlcmZzX2dldF9ibG9jaygpICovCisJYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKIAotICAgIHJldCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB8IEdFVF9CTE9DS19OT19EQU5HTEUpIDsKLSAgICBpZiAocmV0KQotICAgICAgICBnb3RvIG91dDsKKwlyZXQgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LAorCQkJCSBjcmVhdGUgfCBHRVRfQkxPQ0tfTk9fREFOR0xFKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAotICAgIC8qIGRvbid0IGFsbG93IGRpcmVjdCBpbyBvbnRvIHRhaWwgcGFnZXMgKi8KLSAgICBpZiAoYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKLSAgICAgICAgLyogbWFrZSBzdXJlIGZ1dHVyZSBjYWxscyB0byB0aGUgZGlyZWN0IGlvIGZ1bmNzIGZvciB0aGlzIG9mZnNldAotICAgICAgICAqKiBpbiB0aGUgZmlsZSBmYWlsIGJ5IHVubWFwcGluZyB0aGUgYnVmZmVyCi0gICAgICAgICovCi0gICAgICAgIGNsZWFyX2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKLSAgICAgICAgcmV0ID0gLUVJTlZBTCA7Ci0gICAgfQotICAgIC8qIFBvc3NpYmxlIHVucGFja2VkIHRhaWwuIEZsdXNoIHRoZSBkYXRhIGJlZm9yZSBwYWdlcyBoYXZlCi0gICAgICAgZGlzYXBwZWFyZWQgKi8KLSAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBsb2NrX2tlcm5lbCgpOwotICAgICAgICBlcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKLSAgICAgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOwotICAgICAgICB1bmxvY2tfa2VybmVsKCk7Ci0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgcmV0ID0gZXJyOwotICAgIH0KLW91dDoKLSAgICByZXR1cm4gcmV0IDsKKwkvKiBkb24ndCBhbGxvdyBkaXJlY3QgaW8gb250byB0YWlsIHBhZ2VzICovCisJaWYgKGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7CisJCS8qIG1ha2Ugc3VyZSBmdXR1cmUgY2FsbHMgdG8gdGhlIGRpcmVjdCBpbyBmdW5jcyBmb3IgdGhpcyBvZmZzZXQKKwkJICoqIGluIHRoZSBmaWxlIGZhaWwgYnkgdW5tYXBwaW5nIHRoZSBidWZmZXIKKwkJICovCisJCWNsZWFyX2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJLyogUG9zc2libGUgdW5wYWNrZWQgdGFpbC4gRmx1c2ggdGhlIGRhdGEgYmVmb3JlIHBhZ2VzIGhhdmUKKwkgICBkaXNhcHBlYXJlZCAqLworCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB7CisJCWludCBlcnI7CisJCWxvY2tfa2VybmVsKCk7CisJCWVyciA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpOworCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXQgPSBlcnI7CisJfQorICAgICAgb3V0OgorCXJldHVybiByZXQ7CiB9CiAKLQogLyoKICoqIGhlbHBlciBmdW5jdGlvbiBmb3Igd2hlbiByZWlzZXJmc19nZXRfYmxvY2sgaXMgY2FsbGVkIGZvciBhIGhvbGUKICoqIGJ1dCB0aGUgZmlsZSB0YWlsIGlzIHN0aWxsIGluIGEgZGlyZWN0IGl0ZW0KQEAgLTUwNSw0OTAgKzUxMCw1NDcgQEAKICoqIHlvdSBzaG91bGQgbm90IGJlIGluIGEgdHJhbnNhY3Rpb24sIG9yIGhhdmUgYW55IHBhdGhzIGhlbGQgd2hlbiB5b3UKICoqIGNhbGwgdGhpcy4KICovCi1zdGF0aWMgaW50IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJCSBsb2ZmX3QgdGFpbF9vZmZzZXQpIHsKLSAgICB1bnNpZ25lZCBsb25nIGluZGV4IDsKLSAgICB1bnNpZ25lZCBsb25nIHRhaWxfZW5kIDsgCi0gICAgdW5zaWduZWQgbG9uZyB0YWlsX3N0YXJ0IDsKLSAgICBzdHJ1Y3QgcGFnZSAqIHRhaWxfcGFnZSA7Ci0gICAgc3RydWN0IHBhZ2UgKiBob2xlX3BhZ2UgPSBiaF9yZXN1bHQtPmJfcGFnZSA7Ci0gICAgaW50IHJldHZhbCA9IDAgOworc3RhdGljIGludCBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkJIGxvZmZfdCB0YWlsX29mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGxvbmcgdGFpbF9lbmQ7CisJdW5zaWduZWQgbG9uZyB0YWlsX3N0YXJ0OworCXN0cnVjdCBwYWdlICp0YWlsX3BhZ2U7CisJc3RydWN0IHBhZ2UgKmhvbGVfcGFnZSA9IGJoX3Jlc3VsdC0+Yl9wYWdlOworCWludCByZXR2YWwgPSAwOwogCi0gICAgaWYgKCh0YWlsX29mZnNldCAmIChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSAhPSAxKSAKLSAgICAgICAgcmV0dXJuIC1FSU8gOworCWlmICgodGFpbF9vZmZzZXQgJiAoYmhfcmVzdWx0LT5iX3NpemUgLSAxKSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CiAKLSAgICAvKiBhbHdheXMgdHJ5IHRvIHJlYWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KLSAgICB0YWlsX3N0YXJ0ID0gdGFpbF9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotICAgIHRhaWxfZW5kID0gKHRhaWxfc3RhcnQgfCAoYmhfcmVzdWx0LT5iX3NpemUgLSAxKSkgKyAxIDsKKwkvKiBhbHdheXMgdHJ5IHRvIHJlYWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwl0YWlsX3N0YXJ0ID0gdGFpbF9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJdGFpbF9lbmQgPSAodGFpbF9zdGFydCB8IChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSArIDE7CiAKLSAgICBpbmRleCA9IHRhaWxfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQgOwotICAgIC8qIGhvbGVfcGFnZSBjYW4gYmUgemVybyBpbiBjYXNlIG9mIGRpcmVjdF9pbywgd2UgYXJlIHN1cmUKLSAgICAgICB0aGF0IHdlIGNhbm5vdCBnZXQgaGVyZSBpZiB3ZSB3cml0ZSB3aXRoIE9fRElSRUNUIGludG8KLSAgICAgICB0YWlsIHBhZ2UgKi8KLSAgICBpZiAoIWhvbGVfcGFnZSB8fCBpbmRleCAhPSBob2xlX3BhZ2UtPmluZGV4KSB7Ci0JdGFpbF9wYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4KSA7Ci0JcmV0dmFsID0gLUVOT01FTTsKLQlpZiAoIXRhaWxfcGFnZSkgewotCSAgICBnb3RvIG91dCA7CisJaW5kZXggPSB0YWlsX29mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCS8qIGhvbGVfcGFnZSBjYW4gYmUgemVybyBpbiBjYXNlIG9mIGRpcmVjdF9pbywgd2UgYXJlIHN1cmUKKwkgICB0aGF0IHdlIGNhbm5vdCBnZXQgaGVyZSBpZiB3ZSB3cml0ZSB3aXRoIE9fRElSRUNUIGludG8KKwkgICB0YWlsIHBhZ2UgKi8KKwlpZiAoIWhvbGVfcGFnZSB8fCBpbmRleCAhPSBob2xlX3BhZ2UtPmluZGV4KSB7CisJCXRhaWxfcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWlmICghdGFpbF9wYWdlKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCXRhaWxfcGFnZSA9IGhvbGVfcGFnZTsKIAl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGFpbF9wYWdlID0gaG9sZV9wYWdlIDsKLSAgICB9CiAKLSAgICAvKiB3ZSBkb24ndCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgY29udmVyc2lvbiBkaWQgbm90IGhhcHBlbiB3aGlsZQotICAgICoqIHdlIHdlcmUgbG9ja2luZyB0aGUgcGFnZSBiZWNhdXNlIGFueW9uZSB0aGF0IGNvdWxkIGNvbnZlcnQKLSAgICAqKiBtdXN0IGZpcnN0IHRha2UgaV9zZW0uCi0gICAgKioKLSAgICAqKiBXZSBtdXN0IGZpeCB0aGUgdGFpbCBwYWdlIGZvciB3cml0aW5nIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBidWZmZXJzCi0gICAgKiogdGhhdCBhcmUgbWFwcGVkLCBidXQgaGF2ZSBhIGJsb2NrIG51bWJlciBvZiAwLiAgVGhpcyBpbmRpY2F0ZXMgdGFpbAotICAgICoqIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UsIGFuZCBibG9ja19wcmVwYXJlX3dyaXRlCi0gICAgKiogd29uJ3QgdHJpZ2dlciBhIGdldF9ibG9jayBpbiB0aGlzIGNhc2UuCi0gICAgKi8KLSAgICBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHRhaWxfcGFnZSkgOwotICAgIHJldHZhbCA9IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoTlVMTCwgdGFpbF9wYWdlLCB0YWlsX3N0YXJ0LCB0YWlsX2VuZCk7Ci0gICAgaWYgKHJldHZhbCkKLSAgICAgICAgZ290byB1bmxvY2sgOworCS8qIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBjb252ZXJzaW9uIGRpZCBub3QgaGFwcGVuIHdoaWxlCisJICoqIHdlIHdlcmUgbG9ja2luZyB0aGUgcGFnZSBiZWNhdXNlIGFueW9uZSB0aGF0IGNvdWxkIGNvbnZlcnQKKwkgKiogbXVzdCBmaXJzdCB0YWtlIGlfc2VtLgorCSAqKgorCSAqKiBXZSBtdXN0IGZpeCB0aGUgdGFpbCBwYWdlIGZvciB3cml0aW5nIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBidWZmZXJzCisJICoqIHRoYXQgYXJlIG1hcHBlZCwgYnV0IGhhdmUgYSBibG9jayBudW1iZXIgb2YgMC4gIFRoaXMgaW5kaWNhdGVzIHRhaWwKKwkgKiogZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQgZGlyZWN0bHkgaW50byB0aGUgcGFnZSwgYW5kIGJsb2NrX3ByZXBhcmVfd3JpdGUKKwkgKiogd29uJ3QgdHJpZ2dlciBhIGdldF9ibG9jayBpbiB0aGlzIGNhc2UuCisJICovCisJZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyh0YWlsX3BhZ2UpOworCXJldHZhbCA9IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoTlVMTCwgdGFpbF9wYWdlLCB0YWlsX3N0YXJ0LCB0YWlsX2VuZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byB1bmxvY2s7CiAKLSAgICAvKiB0YWlsIGNvbnZlcnNpb24gbWlnaHQgY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBwYWdlICovCi0gICAgZmx1c2hfZGNhY2hlX3BhZ2UodGFpbF9wYWdlKSA7CisJLyogdGFpbCBjb252ZXJzaW9uIG1pZ2h0IGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgcGFnZSAqLworCWZsdXNoX2RjYWNoZV9wYWdlKHRhaWxfcGFnZSk7CiAKLSAgICByZXR2YWwgPSByZWlzZXJmc19jb21taXRfd3JpdGUoTlVMTCwgdGFpbF9wYWdlLCB0YWlsX3N0YXJ0LCB0YWlsX2VuZCkgOworCXJldHZhbCA9IHJlaXNlcmZzX2NvbW1pdF93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKTsKIAotdW5sb2NrOgotICAgIGlmICh0YWlsX3BhZ2UgIT0gaG9sZV9wYWdlKSB7Ci0gICAgICAgIHVubG9ja19wYWdlKHRhaWxfcGFnZSkgOwotCXBhZ2VfY2FjaGVfcmVsZWFzZSh0YWlsX3BhZ2UpIDsKLSAgICB9Ci1vdXQ6Ci0gICAgcmV0dXJuIHJldHZhbCA7CisgICAgICB1bmxvY2s6CisJaWYgKHRhaWxfcGFnZSAhPSBob2xlX3BhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UodGFpbF9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHRhaWxfcGFnZSk7CisJfQorICAgICAgb3V0OgorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9hbGxvY2F0ZV9ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgIGxvbmcgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCAKLQkJCSAgIGJfYmxvY2tucl90ICphbGxvY2F0ZWRfYmxvY2tfbnIsIAotCQkJICAgc3RydWN0IHBhdGggKiBwYXRoLAotCQkJICAgaW50IGZsYWdzKSB7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAKKwkJCQkgIGxvbmcgYmxvY2ssCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgYl9ibG9ja25yX3QgKiBhbGxvY2F0ZWRfYmxvY2tfbnIsCisJCQkJICBzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IGZsYWdzKQoreworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLSAgICBpZiAoIShmbGFncyAmIEdFVF9CTE9DS19OT19JU0VNKSkgewotCXJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMih0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgcGF0aCwgYmxvY2spOwotICAgIH0KKwlpZiAoIShmbGFncyAmIEdFVF9CTE9DS19OT19JU0VNKSkgeworCQlyZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsCisJCQkJCQkgIHBhdGgsIGJsb2NrKTsKKwl9CiAjZW5kaWYKLSAgICByZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIHBhdGgsIGJsb2NrKTsKKwlyZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgcGF0aCwKKwkJCQkJIGJsb2NrKTsKIH0KIAotaW50IHJlaXNlcmZzX2dldF9ibG9jayAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoraW50IHJlaXNlcmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogewotICAgIGludCByZXBlYXQsIHJldHZhbCA9IDA7Ci0gICAgYl9ibG9ja25yX3QgYWxsb2NhdGVkX2Jsb2NrX25yID0gMDsvLyBiX2Jsb2NrbnJfdCBpcyAodW5zaWduZWQpIDMyIGJpdCBpbnQKLSAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7Ci0gICAgaW50IHBvc19pbl9pdGVtOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKiB1bmJoID0gTlVMTDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHRtcF9paDsKLSAgICBfX2xlMzIgKiBpdGVtOwotICAgIGludCBkb25lOwotICAgIGludCBmc19nZW47Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBOVUxMOwotICAgIC8qIHNwYWNlIHJlc2VydmVkIGluIHRyYW5zYWN0aW9uIGJhdGNoOiAKLSAgICAgICAgLiAzIGJhbGFuY2luZ3MgaW4gZGlyZWN0LT5pbmRpcmVjdCBjb252ZXJzaW9uCi0gICAgICAgIC4gMSBibG9jayBpbnZvbHZlZCBpbnRvIHJlaXNlcmZzX3VwZGF0ZV9zZCgpCi0gICAgICAgWFhYIGluIHByYWN0aWNhbGx5IGltcG9zc2libGUgd29yc3QgY2FzZSBkaXJlY3QyaW5kaXJlY3QoKQotICAgICAgIGNhbiBpbmN1ciAobXVjaCkgbW9yZSB0aGFuIDMgYmFsYW5jaW5ncy4KLSAgICAgICBxdW90YSB1cGRhdGUgZm9yIHVzZXIsIGdyb3VwICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKLSAgICBpbnQgdmVyc2lvbjsKLSAgICBpbnQgZGFuZ2xlID0gMTsKLSAgICBsb2ZmX3QgbmV3X29mZnNldCA9ICgoKGxvZmZfdClibG9jaykgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMSA7CisJaW50IHJlcGVhdCwgcmV0dmFsID0gMDsKKwliX2Jsb2NrbnJfdCBhbGxvY2F0ZWRfYmxvY2tfbnIgPSAwOwkvLyBiX2Jsb2NrbnJfdCBpcyAodW5zaWduZWQpIDMyIGJpdCBpbnQKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJaW50IHBvc19pbl9pdGVtOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqdW5iaCA9IE5VTEw7CisJc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paDsKKwlfX2xlMzIgKml0ZW07CisJaW50IGRvbmU7CisJaW50IGZzX2dlbjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CisJLyogc3BhY2UgcmVzZXJ2ZWQgaW4gdHJhbnNhY3Rpb24gYmF0Y2g6IAorCSAgIC4gMyBiYWxhbmNpbmdzIGluIGRpcmVjdC0+aW5kaXJlY3QgY29udmVyc2lvbgorCSAgIC4gMSBibG9jayBpbnZvbHZlZCBpbnRvIHJlaXNlcmZzX3VwZGF0ZV9zZCgpCisJICAgWFhYIGluIHByYWN0aWNhbGx5IGltcG9zc2libGUgd29yc3QgY2FzZSBkaXJlY3QyaW5kaXJlY3QoKQorCSAgIGNhbiBpbmN1ciAobXVjaCkgbW9yZSB0aGFuIDMgYmFsYW5jaW5ncy4KKwkgICBxdW90YSB1cGRhdGUgZm9yIHVzZXIsIGdyb3VwICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKworCSAgICAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZGFuZ2xlID0gMTsKKwlsb2ZmX3QgbmV3X29mZnNldCA9CisJICAgICgoKGxvZmZfdCkgYmxvY2spIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDE7CiAKLQkJCQkvKiBiYWQuLi4uICovCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgdmVyc2lvbiA9IGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSk7CisJLyogYmFkLi4uLiAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXZlcnNpb24gPSBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSk7CiAKLSAgICBpZiAoYmxvY2sgPCAwKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBpZiAoIWZpbGVfY2FwYWJsZSAoaW5vZGUsIGJsb2NrKSkgewotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JcmV0dXJuIC1FRkJJRzsKLSAgICB9Ci0KLSAgICAvKiBpZiAhY3JlYXRlLCB3ZSBhcmVuJ3QgY2hhbmdpbmcgdGhlIEZTLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgKiogbG9nIGFueXRoaW5nLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgdHJhbnNhY3Rpb24KLSAgICAqLwotICAgIGlmICghKGNyZWF0ZSAmIEdFVF9CTE9DS19DUkVBVEUpKSB7Ci0JaW50IHJldCA7Ci0JLyogZmluZCBudW1iZXIgb2YgYmxvY2stdGggbG9naWNhbCBibG9jayBvZiB0aGUgZmlsZSAqLwotCXJldCA9IF9nZXRfYmxvY2tfY3JlYXRlXzAgKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgfCBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpIDsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCXJldHVybiByZXQ7Ci0gICAgfQotICAgIC8qCi0gICAgICogaWYgd2UncmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uLCBtYWtlIHN1cmUgdG8gY2xvc2UKLSAgICAgKiBhbnkgbmV3IHRyYW5zYWN0aW9ucyB3ZSBzdGFydCBpbiB0aGlzIGZ1bmMKLSAgICAgKi8KLSAgICBpZiAoKGNyZWF0ZSAmIEdFVF9CTE9DS19OT19EQU5HTEUpIHx8Ci0gICAgICAgIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKQotICAgICAgICBkYW5nbGUgPSAwOwotCi0gICAgLyogSWYgZmlsZSBpcyBvZiBzdWNoIGEgc2l6ZSwgdGhhdCBpdCBtaWdodCBoYXZlIGEgdGFpbCBhbmQgdGFpbHMgYXJlIGVuYWJsZWQKLSAgICAqKiB3ZSBzaG91bGQgbWFyayBpdCBhcyBwb3NzaWJseSBuZWVkaW5nIHRhaWwgcGFja2luZyBvbiBjbG9zZQotICAgICovCi0gICAgaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAotCSAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCi0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2sgOwotCi0gICAgLyogc2V0IHRoZSBrZXkgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIG5ld19vZmZzZXQsCi0JCSAgVFlQRV9BTlksIDMvKmtleSBsZW5ndGgqLyk7Ci0gICAgaWYgKChuZXdfb2Zmc2V0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPiBpbm9kZS0+aV9zaXplKSB7Ci1zdGFydF90cmFuczoKLQl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7Ci0JaWYgKCF0aCkgewotCSAgICByZXR2YWwgPSAtRU5PTUVNOwotCSAgICBnb3RvIGZhaWx1cmU7Ci0JfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIH0KLSByZXNlYXJjaDoKLQotICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZXR2YWwgPSAtRUlPOwotCWdvdG8gZmFpbHVyZTsKLSAgICB9Ci0JCi0gICAgYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOwotICAgIGloID0gZ2V0X2loICgmcGF0aCk7Ci0gICAgaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7Ci0gICAgcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwotCi0gICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsKLSAgICBjb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOwotCi0gICAgaWYgKGFsbG9jYXRpb25fbmVlZGVkIChyZXR2YWwsIGFsbG9jYXRlZF9ibG9ja19uciwgaWgsIGl0ZW0sIHBvc19pbl9pdGVtKSkgewotCS8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgYmxvY2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCi0JaWYgKCF0aCkgewotCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLQkgICAgZ290byBzdGFydF90cmFuczsKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCXJlcGVhdCA9IF9hbGxvY2F0ZV9ibG9jayh0aCwgYmxvY2ssIGlub2RlLCAmYWxsb2NhdGVkX2Jsb2NrX25yLCAmcGF0aCwgY3JlYXRlKTsKLQotCWlmIChyZXBlYXQgPT0gTk9fRElTS19TUEFDRSB8fCByZXBlYXQgPT0gUVVPVEFfRVhDRUVERUQpIHsKLQkgICAgLyogcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gdG8gZ2l2ZSB0aGUgam91cm5hbCBhIGNoYW5jZSB0byBmcmVlCi0JICAgICoqIHNvbWUgYmxvY2tzLiAgcmVsZWFzZXMgdGhlIHBhdGgsIHNvIHdlIGhhdmUgdG8gZ28gYmFjayB0bwotCSAgICAqKiByZXNlYXJjaCBpZiB3ZSBzdWNjZWVkIG9uIHRoZSBzZWNvbmQgdHJ5Ci0JICAgICovCi0JICAgIFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOwotCSAgICByZXR2YWwgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpIDsKLSAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsdXJlOwotCSAgICByZXBlYXQgPSBfYWxsb2NhdGVfYmxvY2sodGgsIGJsb2NrLCBpbm9kZSwgJmFsbG9jYXRlZF9ibG9ja19uciwgTlVMTCwgY3JlYXRlKTsKLQotCSAgICBpZiAocmVwZWF0ICE9IE5PX0RJU0tfU1BBQ0UgJiYgcmVwZWF0ICE9IFFVT1RBX0VYQ0VFREVEKSB7Ci0JCWdvdG8gcmVzZWFyY2ggOwotCSAgICB9Ci0JICAgIGlmIChyZXBlYXQgPT0gUVVPVEFfRVhDRUVERUQpCi0JCXJldHZhbCA9IC1FRFFVT1Q7Ci0JICAgIGVsc2UKLQkJcmV0dmFsID0gLUVOT1NQQzsKLQkgICAgZ290byBmYWlsdXJlOworCWlmICghZmlsZV9jYXBhYmxlKGlub2RlLCBibG9jaykpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIC1FRkJJRzsKIAl9CiAKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIGdvdG8gcmVzZWFyY2g7CisJLyogaWYgIWNyZWF0ZSwgd2UgYXJlbid0IGNoYW5naW5nIHRoZSBGUywgc28gd2UgZG9uJ3QgbmVlZCB0bworCSAqKiBsb2cgYW55dGhpbmcsIHNvIHdlIGRvbid0IG5lZWQgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbgorCSAqLworCWlmICghKGNyZWF0ZSAmIEdFVF9CTE9DS19DUkVBVEUpKSB7CisJCWludCByZXQ7CisJCS8qIGZpbmQgbnVtYmVyIG9mIGJsb2NrLXRoIGxvZ2ljYWwgYmxvY2sgb2YgdGhlIGZpbGUgKi8KKwkJcmV0ID0gX2dldF9ibG9ja19jcmVhdGVfMChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwKKwkJCQkJICBjcmVhdGUgfCBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gcmV0OwogCX0KLSAgICB9CisJLyoKKwkgKiBpZiB3ZSdyZSBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIG1ha2Ugc3VyZSB0byBjbG9zZQorCSAqIGFueSBuZXcgdHJhbnNhY3Rpb25zIHdlIHN0YXJ0IGluIHRoaXMgZnVuYworCSAqLworCWlmICgoY3JlYXRlICYgR0VUX0JMT0NLX05PX0RBTkdMRSkgfHwKKwkgICAgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpCisJCWRhbmdsZSA9IDA7CiAKLSAgICBpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZCAocmV0dmFsLCBpaCkpIHsKLSAgICAgICAgYl9ibG9ja25yX3QgdW5mbV9wdHI7Ci0JLyogJ2Jsb2NrJy10aCBibG9jayBpcyBpbiB0aGUgZmlsZSBhbHJlYWR5ICh0aGVyZSBpcwotCSAgIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiBzb21lIGluZGlyZWN0IGl0ZW0pLiBCdXQgaXQgbWF5IGJlCi0JICAgemVybyB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgKGhvbGUpICovCi0gICAgICAgIHVuZm1fcHRyID0gZ2V0X2Jsb2NrX251bSAoaXRlbSwgcG9zX2luX2l0ZW0pOwotCWlmICh1bmZtX3B0ciA9PSAwKSB7Ci0JICAgIC8qIHVzZSBhbGxvY2F0ZWQgYmxvY2sgdG8gcGx1ZyB0aGUgaG9sZSAqLwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOwotCSAgICBpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCQlnb3RvIHJlc2VhcmNoOwotCSAgICB9Ci0JICAgIHNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Ci0JICAgIGlmIChidWZmZXJfZGlydHkoYmhfcmVzdWx0KSAmJiByZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpKQotCSAgICAJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmhfcmVzdWx0KTsKLQkgICAgcHV0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSwgYWxsb2NhdGVkX2Jsb2NrX25yKSA7Ci0gICAgICAgICAgICB1bmZtX3B0ciA9IGFsbG9jYXRlZF9ibG9ja19ucjsKLQkgICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworCS8qIElmIGZpbGUgaXMgb2Ygc3VjaCBhIHNpemUsIHRoYXQgaXQgbWlnaHQgaGF2ZSBhIHRhaWwgYW5kIHRhaWxzIGFyZSBlbmFibGVkCisJICoqIHdlIHNob3VsZCBtYXJrIGl0IGFzIHBvc3NpYmx5IG5lZWRpbmcgdGFpbCBwYWNraW5nIG9uIGNsb3NlCisJICovCisJaWYgKChoYXZlX2xhcmdlX3RhaWxzKGlub2RlLT5pX3NiKQorCSAgICAgJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KQorCSAgICB8fCAoaGF2ZV9zbWFsbF90YWlscyhpbm9kZS0+aV9zYikKKwkJJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpKQorCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzazsKKworCS8qIHNldCB0aGUga2V5IG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUgKi8KKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIG5ld19vZmZzZXQsIFRZUEVfQU5ZLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCWlmICgobmV3X29mZnNldCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4gaW5vZGUtPmlfc2l6ZSkgeworCSAgICAgIHN0YXJ0X3RyYW5zOgorCQl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmICghdGgpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAl9Ci0Jc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCB1bmZtX3B0ciwgaW5vZGUpOwotCXBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgICByZXR2YWwgPSAwOwotCWlmICghZGFuZ2xlICYmIHRoKQotCSAgICByZXR2YWwgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisgICAgICByZXNlYXJjaDoKIAotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JIAotCS8qIHRoZSBpdGVtIHdhcyBmb3VuZCwgc28gbmV3IGJsb2NrcyB3ZXJlIG5vdCBhZGRlZCB0byB0aGUgZmlsZQotCSoqIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyB1cGRhdGVkIHdpdGggdGhpcyAKLQkqKiB0cmFuc2FjdGlvbgotCSovCi0JcmV0dXJuIHJldHZhbDsKLSAgICB9CisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZmFpbHVyZTsKKwl9CiAKLSAgICBpZiAoIXRoKSB7Ci0JcGF0aHJlbHNlKCZwYXRoKSA7Ci0JZ290byBzdGFydF90cmFuczsKLSAgICB9CisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJaWggPSBnZXRfaWgoJnBhdGgpOworCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwogCi0gICAgLyogZGVzaXJlZCBwb3NpdGlvbiBpcyBub3QgZm91bmQgb3IgaXMgaW4gdGhlIGRpcmVjdCBpdGVtLiBXZSBoYXZlCi0gICAgICAgdG8gYXBwZW5kIGZpbGUgd2l0aCBob2xlcyB1cCB0byAnYmxvY2snLXRoIGJsb2NrIGNvbnZlcnRpbmcKLSAgICAgICBkaXJlY3QgaXRlbXMgdG8gaW5kaXJlY3Qgb25lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGRvbmUgPSAwOwotICAgIGRvIHsKLQlpZiAoaXNfc3RhdGRhdGFfbGVfaWggKGloKSkgewotCSAgICBfX2xlMzIgdW5wID0gMDsKLQkgICAgc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKwlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCi0JICAgIC8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGluc2VydGVkICovCi0JICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmdG1wX2loLCAma2V5LCB2ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULCAKLQkJCSAgICAgICBVTkZNX1BfU0laRSwgMC8qIGZyZWVfc3BhY2UgKi8pOworCWlmIChhbGxvY2F0aW9uX25lZWRlZAorCSAgICAocmV0dmFsLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGloLCBpdGVtLCBwb3NfaW5faXRlbSkpIHsKKwkJLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBibG9jayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJaWYgKCF0aCkgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gc3RhcnRfdHJhbnM7CisJCX0KIAotCSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoJmtleSkgPT0gMSkgewotCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkICdibG9jayctdGggYmxvY2sgdG8gdGhlIGZpbGUuIFVzZQotCQkgICBhbGxvY2F0ZWQgYmxvY2sgZm9yIHRoYXQgKi8KLQkJdW5wID0gY3B1X3RvX2xlMzIgKGFsbG9jYXRlZF9ibG9ja19ucik7Ci0JCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOwotCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOwotCQlkb25lID0gMTsKLQkgICAgfQotCSAgICB0bXBfa2V5ID0ga2V5OyAvLyA7KQotCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnRtcF9rZXksIDEpOwotCSAgICBQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpICsrOworCQlyZXBlYXQgPQorCQkgICAgX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsICZhbGxvY2F0ZWRfYmxvY2tfbnIsCisJCQkJICAgICZwYXRoLCBjcmVhdGUpOwogCi0JICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGgsICZ0bXBfa2V5LCAmdG1wX2loLCBpbm9kZSwgKGNoYXIgKikmdW5wKTsKLQkgICAgaWYgKHJldHZhbCkgewotCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7Ci0JCWdvdG8gZmFpbHVyZTsgLy8gcmV0dmFsID09IC1FTk9TUEMsIC1FRFFVT1Qgb3IgLUVJTyBvciAtRUVYSVNUCi0JICAgIH0KLQkgICAgLy9tYXJrX3RhaWxfY29udmVydGVkIChpbm9kZSk7Ci0JfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgewotCSAgICAvKiBkaXJlY3QgaXRlbSBoYXMgdG8gYmUgY29udmVydGVkICovCi0JICAgIGxvZmZfdCB0YWlsX29mZnNldDsKKwkJaWYgKHJlcGVhdCA9PSBOT19ESVNLX1NQQUNFIHx8IHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkgeworCQkJLyogcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gdG8gZ2l2ZSB0aGUgam91cm5hbCBhIGNoYW5jZSB0byBmcmVlCisJCQkgKiogc29tZSBibG9ja3MuICByZWxlYXNlcyB0aGUgcGF0aCwgc28gd2UgaGF2ZSB0byBnbyBiYWNrIHRvCisJCQkgKiogcmVzZWFyY2ggaWYgd2Ugc3VjY2VlZCBvbiB0aGUgc2Vjb25kIHRyeQorCQkJICovCisJCQlTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMTsKKwkJCXJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZmFpbHVyZTsKKwkJCXJlcGVhdCA9CisJCQkgICAgX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsCisJCQkJCSAgICAmYWxsb2NhdGVkX2Jsb2NrX25yLCBOVUxMLCBjcmVhdGUpOwogCi0JICAgIHRhaWxfb2Zmc2V0ID0gKChsZV9paF9rX29mZnNldCAoaWgpIC0gMSkgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7Ci0JICAgIGlmICh0YWlsX29mZnNldCA9PSBjcHVfa2V5X2tfb2Zmc2V0ICgma2V5KSkgewotCQkvKiBkaXJlY3QgaXRlbSB3ZSBqdXN0IGZvdW5kIGZpdHMgaW50byBibG9jayB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgdG8gbWFwLiBDb252ZXJ0IGl0IGludG8gdW5mb3JtYXR0ZWQgbm9kZTogdXNlCi0gICAgICAgICAgICAgICAgICAgYmhfcmVzdWx0IGZvciB0aGUgY29udmVyc2lvbiAqLwotCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKLQkJdW5iaCA9IGJoX3Jlc3VsdDsKLQkJZG9uZSA9IDE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIHdlIGhhdmUgdG8gcGFkZCBmaWxlIHRhaWwgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCi0JCSAgIHVwIHRvIGJsb2NrIHNpemUgYW5kIGNvbnZlcnQgaXQgdG8gdW5mb3JtYXR0ZWQKLQkJICAgbm9kZS4gRklYTUU6IHRoaXMgc2hvdWxkIGFsc28gZ2V0IGludG8gcGFnZSBjYWNoZSAqLwotCi0JCXBhdGhyZWxzZSgmcGF0aCkgOwotCQkvKgotCQkgKiB1Z2x5LCBidXQgd2UgY2FuIG9ubHkgZW5kIHRoZSB0cmFuc2FjdGlvbiBpZgotCQkgKiB3ZSBhcmVuJ3QgbmVzdGVkCi0JCSAqLwotCQlCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7Ci0JCWlmICh0aC0+dF9yZWZjb3VudCA9PSAxKSB7Ci0JCSAgICByZXR2YWwgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7Ci0JCSAgICB0aCA9IE5VTEw7Ci0JCSAgICBpZiAocmV0dmFsKQorCQkJaWYgKHJlcGVhdCAhPSBOT19ESVNLX1NQQUNFICYmIHJlcGVhdCAhPSBRVU9UQV9FWENFRURFRCkgeworCQkJCWdvdG8gcmVzZWFyY2g7CisJCQl9CisJCQlpZiAocmVwZWF0ID09IFFVT1RBX0VYQ0VFREVEKQorCQkJCXJldHZhbCA9IC1FRFFVT1Q7CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVOT1NQQzsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQogCi0JCXJldHZhbCA9IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShpbm9kZSwgYmhfcmVzdWx0LCB0YWlsX29mZnNldCkgOwotCQlpZiAocmV0dmFsKSB7Ci0JCSAgICBpZiAoIHJldHZhbCAhPSAtRU5PU1BDICkKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiY2xtLTYwMDQ6IGNvbnZlcnQgdGFpbCBmYWlsZWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsIGlub2RlLT5pX2lubywgcmV0dmFsKSA7Ci0JCSAgICBpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKSB7Ci0JCQkvKiB0aGUgYml0bWFwLCB0aGUgc3VwZXIsIGFuZCB0aGUgc3RhdCBkYXRhID09IDMgKi8KLQkJCWlmICghdGgpCi0JCQkgICAgdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLDMpOwotCQkJaWYgKHRoKQotCQkJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLGlub2RlLGFsbG9jYXRlZF9ibG9ja19uciwxKTsKLQkJICAgIH0KLQkJICAgIGdvdG8gZmFpbHVyZSA7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJZ290byByZXNlYXJjaDsKIAkJfQotCQlnb3RvIHJlc2VhcmNoIDsKLQkgICAgfQotCSAgICByZXR2YWwgPSBkaXJlY3QyaW5kaXJlY3QgKHRoLCBpbm9kZSwgJnBhdGgsIHVuYmgsIHRhaWxfb2Zmc2V0KTsKLQkgICAgaWYgKHJldHZhbCkgewotCQlyZWlzZXJmc191bm1hcF9idWZmZXIodW5iaCk7Ci0JCXJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKLQkJZ290byBmYWlsdXJlOwotCSAgICB9Ci0JICAgIC8qIGl0IGlzIGltcG9ydGFudCB0aGUgc2V0X2J1ZmZlcl91cHRvZGF0ZSBpcyBkb25lIGFmdGVyCi0JICAgICoqIHRoZSBkaXJlY3QyaW5kaXJlY3QuICBUaGUgYnVmZmVyIG1pZ2h0IGNvbnRhaW4gdmFsaWQKLQkgICAgKiogZGF0YSBuZXdlciB0aGFuIHRoZSBkYXRhIG9uIGRpc2sgKHJlYWQgYnkgcmVhZHBhZ2UsIGNoYW5nZWQsCi0JICAgICoqIGFuZCB0aGVuIHNlbnQgaGVyZSBieSB3cml0ZXBhZ2UpLiAgZGlyZWN0MmluZGlyZWN0IG5lZWRzCi0JICAgICoqIHRvIGtub3cgaWYgdW5iaCB3YXMgYWxyZWFkeSB1cCB0byBkYXRlLCBzbyBpdCBjYW4gZGVjaWRlCi0JICAgICoqIGlmIHRoZSBkYXRhIGluIHVuYmggbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBkYXRhIGZyb20KLQkgICAgKiogdGhlIGRpc2sKLQkgICAgKi8KLQkgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSAodW5iaCk7CisJfQogCi0JICAgIC8qIHVuYmgtPmJfcGFnZSA9PSBOVUxMIGluIGNhc2Ugb2YgRElSRUNUX0lPIHJlcXVlc3QsIHRoaXMgbWVhbnMKLQkgICAgICAgYnVmZmVyIHdpbGwgZGlzYXBwZWFyIHNob3J0bHksIHNvIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8KLQkgICAgICovCi0JICAgIGlmICggdW5iaC0+Yl9wYWdlICkgewotCQkvKiB3ZSd2ZSBjb252ZXJ0ZWQgdGhlIHRhaWwsIHNvIHdlIG11c3QKLQkJKiogZmx1c2ggdW5iaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMKLQkJKi8KLQkJcmVpc2VyZnNfYWRkX3RhaWxfbGlzdChpbm9kZSwgdW5iaCkgOworCWlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7CisJCWJfYmxvY2tucl90IHVuZm1fcHRyOworCQkvKiAnYmxvY2snLXRoIGJsb2NrIGlzIGluIHRoZSBmaWxlIGFscmVhZHkgKHRoZXJlIGlzCisJCSAgIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiBzb21lIGluZGlyZWN0IGl0ZW0pLiBCdXQgaXQgbWF5IGJlCisJCSAgIHplcm8gdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIChob2xlKSAqLworCQl1bmZtX3B0ciA9IGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pOworCQlpZiAodW5mbV9wdHIgPT0gMCkgeworCQkJLyogdXNlIGFsbG9jYXRlZCBibG9jayB0byBwbHVnIHRoZSBob2xlICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7CisJCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSBiaCk7CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCQlpZiAoYnVmZmVyX2RpcnR5KGJoX3Jlc3VsdCkKKwkJCSAgICAmJiByZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpKQorCQkJCXJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoX3Jlc3VsdCk7CisJCQlwdXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtLCBhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQkJdW5mbV9wdHIgPSBhbGxvY2F0ZWRfYmxvY2tfbnI7CisJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJfQorCQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIHVuZm1fcHRyLCBpbm9kZSk7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCXJldHZhbCA9IDA7CisJCWlmICghZGFuZ2xlICYmIHRoKQorCQkJcmV0dmFsID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwogCi0JCS8qIG1hcmsgaXQgZGlydHkgbm93IHRvIHByZXZlbnQgY29tbWl0X3dyaXRlIGZyb20gYWRkaW5nCi0JCSoqIHRoaXMgYnVmZmVyIHRvIHRoZSBpbm9kZSdzIGRpcnR5IGJ1ZmZlciBsaXN0Ci0JCSovCi0JCS8qCi0JCSAqIEFLUE06IGNoYW5nZWQgX19tYXJrX2J1ZmZlcl9kaXJ0eSB0byBtYXJrX2J1ZmZlcl9kaXJ0eSgpLgotCQkgKiBJdCdzIHN0aWxsIGF0b21pYywgYnV0IGl0IHNldHMgdGhlIHBhZ2UgZGlydHkgdG9vLAotCQkgKiB3aGljaCBtYWtlcyBpdCBlbGlnaWJsZSBmb3Igd3JpdGViYWNrIGF0IGFueSB0aW1lIGJ5IHRoZQotCQkgKiBWTSAod2hpY2ggd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCBfX21hcmtfYnVmZmVyX2RpcnR5KCkpCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisKKwkJLyogdGhlIGl0ZW0gd2FzIGZvdW5kLCBzbyBuZXcgYmxvY2tzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBmaWxlCisJCSAqKiB0aGVyZSBpcyBubyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgdXBkYXRlZCB3aXRoIHRoaXMgCisJCSAqKiB0cmFuc2FjdGlvbgogCQkgKi8KLQkJbWFya19idWZmZXJfZGlydHkodW5iaCkgOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgLyogYXBwZW5kIGluZGlyZWN0IGl0ZW0gd2l0aCBob2xlcyBpZiBuZWVkZWQsIHdoZW4gYXBwZW5kaW5nCi0JICAgICAgIHBvaW50ZXIgdG8gJ2Jsb2NrJy10aCBibG9jayB1c2UgYmxvY2ssIHdoaWNoIGlzIGFscmVhZHkKLQkgICAgICAgYWxsb2NhdGVkICovCi0JICAgIHN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7Ci0JICAgIHVucF90IHVuZl9zaW5nbGU9MDsgLy8gV2UgdXNlIHRoaXMgaW4gY2FzZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9ubHkKLQkJCQkvLyBvbmUgYmxvY2sgd2hpY2ggaXMgYSBmYXN0cGF0aAotCSAgICB1bnBfdCAqdW47Ci0JICAgIF9fdTY0IG1heF90b19pbnNlcnQ9TUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkU7Ci0JICAgIF9fdTY0IGJsb2Nrc19uZWVkZWQ7Ci0KLQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSwKLQkJICAgICJ2cy04MDQ6IGludmFsaWQgcG9zaXRpb24gZm9yIGFwcGVuZCIpOwotCSAgICAvKiBpbmRpcmVjdCBpdGVtIGhhcyB0byBiZSBhcHBlbmRlZCwgc2V0IHVwIGtleSBvZiB0aGF0IHBvc2l0aW9uICovCi0JICAgIG1ha2VfY3B1X2tleSAoJnRtcF9rZXksIGlub2RlLAotCQkJICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwKLQkJCSAgLy9wb3NfaW5faXRlbSAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKLQkJCSAgVFlQRV9JTkRJUkVDVCwgMyk7Ly8ga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKLQotCSAgICBibG9ja3NfbmVlZGVkID0gMSArICgoY3B1X2tleV9rX29mZnNldCAoJmtleSkgLSBjcHVfa2V5X2tfb2Zmc2V0ICgmdG1wX2tleSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkgICAgUkZBTFNFKCBibG9ja3NfbmVlZGVkIDwgMCwgImdyZWVuLTgwNTogaW52YWxpZCBvZmZzZXQiKTsKLQotCSAgICBpZiAoIGJsb2Nrc19uZWVkZWQgPT0gMSApIHsKLQkJdW4gPSAmdW5mX3NpbmdsZTsKLQkgICAgfSBlbHNlIHsKLQkJdW49a21hbGxvYyggbWluKGJsb2Nrc19uZWVkZWQsbWF4X3RvX2luc2VydCkqVU5GTV9QX1NJWkUsCi0JCQkgICAgR0ZQX0FUT01JQyk7IC8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KLQkJaWYgKCAhdW4pIHsKLQkJICAgIHVuID0gJnVuZl9zaW5nbGU7Ci0JCSAgICBibG9ja3NfbmVlZGVkID0gMTsKLQkJICAgIG1heF90b19pbnNlcnQgPSAwOwotCQl9IGVsc2UKLQkJICAgIG1lbXNldCh1biwgMCwgVU5GTV9QX1NJWkUgKiBtaW4oYmxvY2tzX25lZWRlZCxtYXhfdG9faW5zZXJ0KSk7Ci0JICAgIH0KLQkgICAgaWYgKCBibG9ja3NfbmVlZGVkIDw9IG1heF90b19pbnNlcnQpIHsKLQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCB0YXJnZXQgYmxvY2sgdG8gdGhlIGZpbGUuIFVzZSBhbGxvY2F0ZWQKLQkJICAgYmxvY2sgZm9yIHRoYXQgKi8KLQkJdW5bYmxvY2tzX25lZWRlZC0xXSA9IGNwdV90b19sZTMyIChhbGxvY2F0ZWRfYmxvY2tfbnIpOwotCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKLQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKLQkJZG9uZSA9IDE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIHBhc3RlIGhvbGUgdG8gdGhlIGluZGlyZWN0IGl0ZW0gKi8KLQkJLyogSWYga21hbGxvYyBmYWlsZWQsIG1heF90b19pbnNlcnQgYmVjb21lcyB6ZXJvIGFuZCBpdCBtZWFucyB3ZQotCQkgICBvbmx5IGhhdmUgc3BhY2UgZm9yIG9uZSBibG9jayAqLwotCQlibG9ja3NfbmVlZGVkPW1heF90b19pbnNlcnQ/bWF4X3RvX2luc2VydDoxOwotCSAgICB9Ci0JICAgIHJldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAodGgsICZwYXRoLCAmdG1wX2tleSwgaW5vZGUsIChjaGFyICopdW4sIFVORk1fUF9TSVpFICogYmxvY2tzX25lZWRlZCk7Ci0KLQkgICAgaWYgKGJsb2Nrc19uZWVkZWQgIT0gMSkKLQkJa2ZyZWUodW4pOwotCi0JICAgIGlmIChyZXR2YWwpIHsKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOwotCQlnb3RvIGZhaWx1cmU7Ci0JICAgIH0KLQkgICAgaWYgKCFkb25lKSB7Ci0JCS8qIFdlIG5lZWQgdG8gbWFyayBuZXcgZmlsZSBzaXplIGluIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCi0JCSAgIGludGVycnVwdGVkL2Fib3J0ZWQgbGF0ZXIgb24uIEFuZCB3ZSBtYXkgZG8gdGhpcyBvbmx5IGZvcgotCQkgICBob2xlcy4gKi8KLQkJaW5vZGUtPmlfc2l6ZSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKiBibG9ja3NfbmVlZGVkOwotCSAgICB9CisJCXJldHVybiByZXR2YWw7CiAJfQogCi0JaWYgKGRvbmUgPT0gMSkKLQkgICAgYnJlYWs7Ci0KLQkvKiB0aGlzIGxvb3AgY291bGQgbG9nIG1vcmUgYmxvY2tzIHRoYW4gd2UgaGFkIG9yaWdpbmFsbHkgYXNrZWQKLQkqKiBmb3IuICBTbywgd2UgaGF2ZSB0byBhbGxvdyB0aGUgdHJhbnNhY3Rpb24gdG8gZW5kIGlmIGl0IGlzCi0JKiogdG9vIGJpZyBvciB0b28gZnVsbC4gIFVwZGF0ZSB0aGUgaW5vZGUgc28gdGhpbmdzIGFyZSAKLQkqKiBjb25zaXN0ZW50IGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gcmV0dXJucwotCSoqCi0JKiogcmVsZWFzZSB0aGUgcGF0aCBzbyB0aGF0IGFueWJvZHkgd2FpdGluZyBvbiB0aGUgcGF0aCBiZWZvcmUKLQkqKiBlbmRpbmcgdGhlaXIgdHJhbnNhY3Rpb24gd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlLgotCSovCi0JaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKLQkgIHJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCkgOwotCSAgaWYgKHJldHZhbCkKLQkgICAgZ290byBmYWlsdXJlOworCWlmICghdGgpIHsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJZ290byBzdGFydF90cmFuczsKIAl9Ci0JLyogaW5zZXJ0aW5nIGluZGlyZWN0IHBvaW50ZXJzIGZvciBhIGhvbGUgY2FuIHRha2UgYSAKLQkqKiBsb25nIHRpbWUuICByZXNjaGVkdWxlIGlmIG5lZWRlZAotCSovCi0JY29uZF9yZXNjaGVkKCk7CiAKLQlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJldHZhbCA9IC1FSU87Ci0JICAgIGdvdG8gZmFpbHVyZTsKKwkvKiBkZXNpcmVkIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCBvciBpcyBpbiB0aGUgZGlyZWN0IGl0ZW0uIFdlIGhhdmUKKwkgICB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzIHVwIHRvICdibG9jayctdGggYmxvY2sgY29udmVydGluZworCSAgIGRpcmVjdCBpdGVtcyB0byBpbmRpcmVjdCBvbmUgaWYgbmVjZXNzYXJ5ICovCisJZG9uZSA9IDA7CisJZG8geworCQlpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKSB7CisJCQlfX2xlMzIgdW5wID0gMDsKKwkJCXN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7CisKKwkJCS8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGluc2VydGVkICovCisJCQltYWtlX2xlX2l0ZW1faGVhZCgmdG1wX2loLCAma2V5LCB2ZXJzaW9uLCAxLAorCQkJCQkgIFRZUEVfSU5ESVJFQ1QsIFVORk1fUF9TSVpFLAorCQkJCQkgIDAgLyogZnJlZV9zcGFjZSAqLyApOworCisJCQlpZiAoY3B1X2tleV9rX29mZnNldCgma2V5KSA9PSAxKSB7CisJCQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCAnYmxvY2snLXRoIGJsb2NrIHRvIHRoZSBmaWxlLiBVc2UKKwkJCQkgICBhbGxvY2F0ZWQgYmxvY2sgZm9yIHRoYXQgKi8KKwkJCQl1bnAgPSBjcHVfdG9fbGUzMihhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQkJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwKKwkJCQkJCSAgICAgYWxsb2NhdGVkX2Jsb2NrX25yLCBpbm9kZSk7CisJCQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJCXRtcF9rZXkgPSBrZXk7CS8vIDspCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgmdG1wX2tleSwgMSk7CisJCQlQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpKys7CisKKwkJCXJldHZhbCA9CisJCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoLCAmdG1wX2tleSwgJnRtcF9paCwKKwkJCQkJCSBpbm9kZSwgKGNoYXIgKikmdW5wKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJCWdvdG8gZmFpbHVyZTsJLy8gcmV0dmFsID09IC1FTk9TUEMsIC1FRFFVT1Qgb3IgLUVJTyBvciAtRUVYSVNUCisJCQl9CisJCQkvL21hcmtfdGFpbF9jb252ZXJ0ZWQgKGlub2RlKTsKKwkJfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisJCQkvKiBkaXJlY3QgaXRlbSBoYXMgdG8gYmUgY29udmVydGVkICovCisJCQlsb2ZmX3QgdGFpbF9vZmZzZXQ7CisKKwkJCXRhaWxfb2Zmc2V0ID0KKwkJCSAgICAoKGxlX2loX2tfb2Zmc2V0KGloKSAtCisJCQkgICAgICAxKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkJCWlmICh0YWlsX29mZnNldCA9PSBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpKSB7CisJCQkJLyogZGlyZWN0IGl0ZW0gd2UganVzdCBmb3VuZCBmaXRzIGludG8gYmxvY2sgd2UgaGF2ZQorCQkJCSAgIHRvIG1hcC4gQ29udmVydCBpdCBpbnRvIHVuZm9ybWF0dGVkIG5vZGU6IHVzZQorCQkJCSAgIGJoX3Jlc3VsdCBmb3IgdGhlIGNvbnZlcnNpb24gKi8KKwkJCQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsCisJCQkJCQkgICAgIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQkJCXVuYmggPSBiaF9yZXN1bHQ7CisJCQkJZG9uZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGhhdmUgdG8gcGFkZCBmaWxlIHRhaWwgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCisJCQkJICAgdXAgdG8gYmxvY2sgc2l6ZSBhbmQgY29udmVydCBpdCB0byB1bmZvcm1hdHRlZAorCQkJCSAgIG5vZGUuIEZJWE1FOiB0aGlzIHNob3VsZCBhbHNvIGdldCBpbnRvIHBhZ2UgY2FjaGUgKi8KKworCQkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQkJLyoKKwkJCQkgKiB1Z2x5LCBidXQgd2UgY2FuIG9ubHkgZW5kIHRoZSB0cmFuc2FjdGlvbiBpZgorCQkJCSAqIHdlIGFyZW4ndCBuZXN0ZWQKKwkJCQkgKi8KKwkJCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKKwkJCQlpZiAodGgtPnRfcmVmY291bnQgPT0gMSkgeworCQkJCQlyZXR2YWwgPQorCQkJCQkgICAgcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24KKwkJCQkJICAgICh0aCk7CisJCQkJCXRoID0gTlVMTDsKKwkJCQkJaWYgKHJldHZhbCkKKwkJCQkJCWdvdG8gZmFpbHVyZTsKKwkJCQl9CisKKwkJCQlyZXR2YWwgPQorCQkJCSAgICBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoaW5vZGUsIGJoX3Jlc3VsdCwKKwkJCQkJCQkgIHRhaWxfb2Zmc2V0KTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCWlmIChyZXR2YWwgIT0gLUVOT1NQQykKKwkJCQkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSAiY2xtLTYwMDQ6IGNvbnZlcnQgdGFpbCBmYWlsZWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJCQkJCQkJCSBpbm9kZS0+aV9pbm8sCisJCQkJCQkJCSByZXR2YWwpOworCQkJCQlpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKSB7CisJCQkJCQkvKiB0aGUgYml0bWFwLCB0aGUgc3VwZXIsIGFuZCB0aGUgc3RhdCBkYXRhID09IDMgKi8KKwkJCQkJCWlmICghdGgpCisJCQkJCQkJdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLCAzKTsKKwkJCQkJCWlmICh0aCkKKwkJCQkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLAorCQkJCQkJCQkJICAgIGlub2RlLAorCQkJCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwKKwkJCQkJCQkJCSAgICAxKTsKKwkJCQkJfQorCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJfQorCQkJCWdvdG8gcmVzZWFyY2g7CisJCQl9CisJCQlyZXR2YWwgPQorCQkJICAgIGRpcmVjdDJpbmRpcmVjdCh0aCwgaW5vZGUsICZwYXRoLCB1bmJoLAorCQkJCQkgICAgdGFpbF9vZmZzZXQpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcih1bmJoKTsKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJCWdvdG8gZmFpbHVyZTsKKwkJCX0KKwkJCS8qIGl0IGlzIGltcG9ydGFudCB0aGUgc2V0X2J1ZmZlcl91cHRvZGF0ZSBpcyBkb25lIGFmdGVyCisJCQkgKiogdGhlIGRpcmVjdDJpbmRpcmVjdC4gIFRoZSBidWZmZXIgbWlnaHQgY29udGFpbiB2YWxpZAorCQkJICoqIGRhdGEgbmV3ZXIgdGhhbiB0aGUgZGF0YSBvbiBkaXNrIChyZWFkIGJ5IHJlYWRwYWdlLCBjaGFuZ2VkLAorCQkJICoqIGFuZCB0aGVuIHNlbnQgaGVyZSBieSB3cml0ZXBhZ2UpLiAgZGlyZWN0MmluZGlyZWN0IG5lZWRzCisJCQkgKiogdG8ga25vdyBpZiB1bmJoIHdhcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHNvIGl0IGNhbiBkZWNpZGUKKwkJCSAqKiBpZiB0aGUgZGF0YSBpbiB1bmJoIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggZGF0YSBmcm9tCisJCQkgKiogdGhlIGRpc2sKKwkJCSAqLworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh1bmJoKTsKKworCQkJLyogdW5iaC0+Yl9wYWdlID09IE5VTEwgaW4gY2FzZSBvZiBESVJFQ1RfSU8gcmVxdWVzdCwgdGhpcyBtZWFucworCQkJICAgYnVmZmVyIHdpbGwgZGlzYXBwZWFyIHNob3J0bHksIHNvIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8KKwkJCSAqLworCQkJaWYgKHVuYmgtPmJfcGFnZSkgeworCQkJCS8qIHdlJ3ZlIGNvbnZlcnRlZCB0aGUgdGFpbCwgc28gd2UgbXVzdAorCQkJCSAqKiBmbHVzaCB1bmJoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cworCQkJCSAqLworCQkJCXJlaXNlcmZzX2FkZF90YWlsX2xpc3QoaW5vZGUsIHVuYmgpOworCisJCQkJLyogbWFyayBpdCBkaXJ0eSBub3cgdG8gcHJldmVudCBjb21taXRfd3JpdGUgZnJvbSBhZGRpbmcKKwkJCQkgKiogdGhpcyBidWZmZXIgdG8gdGhlIGlub2RlJ3MgZGlydHkgYnVmZmVyIGxpc3QKKwkJCQkgKi8KKwkJCQkvKgorCQkJCSAqIEFLUE06IGNoYW5nZWQgX19tYXJrX2J1ZmZlcl9kaXJ0eSB0byBtYXJrX2J1ZmZlcl9kaXJ0eSgpLgorCQkJCSAqIEl0J3Mgc3RpbGwgYXRvbWljLCBidXQgaXQgc2V0cyB0aGUgcGFnZSBkaXJ0eSB0b28sCisJCQkJICogd2hpY2ggbWFrZXMgaXQgZWxpZ2libGUgZm9yIHdyaXRlYmFjayBhdCBhbnkgdGltZSBieSB0aGUKKwkJCQkgKiBWTSAod2hpY2ggd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCBfX21hcmtfYnVmZmVyX2RpcnR5KCkpCisJCQkJICovCisJCQkJbWFya19idWZmZXJfZGlydHkodW5iaCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgaW5kaXJlY3QgaXRlbSB3aXRoIGhvbGVzIGlmIG5lZWRlZCwgd2hlbiBhcHBlbmRpbmcKKwkJCSAgIHBvaW50ZXIgdG8gJ2Jsb2NrJy10aCBibG9jayB1c2UgYmxvY2ssIHdoaWNoIGlzIGFscmVhZHkKKwkJCSAgIGFsbG9jYXRlZCAqLworCQkJc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKwkJCXVucF90IHVuZl9zaW5nbGUgPSAwOwkvLyBXZSB1c2UgdGhpcyBpbiBjYXNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25seQorCQkJLy8gb25lIGJsb2NrIHdoaWNoIGlzIGEgZmFzdHBhdGgKKwkJCXVucF90ICp1bjsKKwkJCV9fdTY0IG1heF90b19pbnNlcnQgPQorCQkJICAgIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpIC8KKwkJCSAgICBVTkZNX1BfU0laRTsKKwkJCV9fdTY0IGJsb2Nrc19uZWVkZWQ7CisKKwkJCVJGQUxTRShwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSwKKwkJCSAgICAgICAidnMtODA0OiBpbnZhbGlkIHBvc2l0aW9uIGZvciBhcHBlbmQiKTsKKwkJCS8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGFwcGVuZGVkLCBzZXQgdXAga2V5IG9mIHRoYXQgcG9zaXRpb24gKi8KKwkJCW1ha2VfY3B1X2tleSgmdG1wX2tleSwgaW5vZGUsCisJCQkJICAgICBsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwKKwkJCQkJCSAgICAgJihpaC0+aWhfa2V5KSkgKworCQkJCSAgICAgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLAorCQkJCSAgICAgLy9wb3NfaW5faXRlbSAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOwkvLyBrZXkgdHlwZSBpcyB1bmltcG9ydGFudAorCisJCQlibG9ja3NfbmVlZGVkID0KKwkJCSAgICAxICsKKwkJCSAgICAoKGNwdV9rZXlfa19vZmZzZXQoJmtleSkgLQorCQkJICAgICAgY3B1X2tleV9rX29mZnNldCgmdG1wX2tleSkpID4+IGlub2RlLT5pX3NiLT4KKwkJCSAgICAgc19ibG9ja3NpemVfYml0cyk7CisJCQlSRkFMU0UoYmxvY2tzX25lZWRlZCA8IDAsICJncmVlbi04MDU6IGludmFsaWQgb2Zmc2V0Iik7CisKKwkJCWlmIChibG9ja3NfbmVlZGVkID09IDEpIHsKKwkJCQl1biA9ICZ1bmZfc2luZ2xlOworCQkJfSBlbHNlIHsKKwkJCQl1biA9IGttYWxsb2MobWluKGJsb2Nrc19uZWVkZWQsIG1heF90b19pbnNlcnQpICogVU5GTV9QX1NJWkUsIEdGUF9BVE9NSUMpOwkvLyBXZSBuZWVkIHRvIGF2b2lkIHNjaGVkdWxpbmcuCisJCQkJaWYgKCF1bikgeworCQkJCQl1biA9ICZ1bmZfc2luZ2xlOworCQkJCQlibG9ja3NfbmVlZGVkID0gMTsKKwkJCQkJbWF4X3RvX2luc2VydCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCW1lbXNldCh1biwgMCwKKwkJCQkJICAgICAgIFVORk1fUF9TSVpFICogbWluKGJsb2Nrc19uZWVkZWQsCisJCQkJCQkJCSBtYXhfdG9faW5zZXJ0KSk7CisJCQl9CisJCQlpZiAoYmxvY2tzX25lZWRlZCA8PSBtYXhfdG9faW5zZXJ0KSB7CisJCQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCB0YXJnZXQgYmxvY2sgdG8gdGhlIGZpbGUuIFVzZSBhbGxvY2F0ZWQKKwkJCQkgICBibG9jayBmb3IgdGhhdCAqLworCQkJCXVuW2Jsb2Nrc19uZWVkZWQgLSAxXSA9CisJCQkJICAgIGNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja19ucik7CisJCQkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LAorCQkJCQkJICAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKKwkJCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQkJCWRvbmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBwYXN0ZSBob2xlIHRvIHRoZSBpbmRpcmVjdCBpdGVtICovCisJCQkJLyogSWYga21hbGxvYyBmYWlsZWQsIG1heF90b19pbnNlcnQgYmVjb21lcyB6ZXJvIGFuZCBpdCBtZWFucyB3ZQorCQkJCSAgIG9ubHkgaGF2ZSBzcGFjZSBmb3Igb25lIGJsb2NrICovCisJCQkJYmxvY2tzX25lZWRlZCA9CisJCQkJICAgIG1heF90b19pbnNlcnQgPyBtYXhfdG9faW5zZXJ0IDogMTsKKwkJCX0KKwkJCXJldHZhbCA9CisJCQkgICAgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCAmcGF0aCwgJnRtcF9rZXksIGlub2RlLAorCQkJCQkJICAgICAoY2hhciAqKXVuLAorCQkJCQkJICAgICBVTkZNX1BfU0laRSAqCisJCQkJCQkgICAgIGJsb2Nrc19uZWVkZWQpOworCisJCQlpZiAoYmxvY2tzX25lZWRlZCAhPSAxKQorCQkJCWtmcmVlKHVuKTsKKworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLAorCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQkJaWYgKCFkb25lKSB7CisJCQkJLyogV2UgbmVlZCB0byBtYXJrIG5ldyBmaWxlIHNpemUgaW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKKwkJCQkgICBpbnRlcnJ1cHRlZC9hYm9ydGVkIGxhdGVyIG9uLiBBbmQgd2UgbWF5IGRvIHRoaXMgb25seSBmb3IKKwkJCQkgICBob2xlcy4gKi8KKwkJCQlpbm9kZS0+aV9zaXplICs9CisJCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIGJsb2Nrc19uZWVkZWQ7CisJCQl9CisJCX0KKworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisKKwkJLyogdGhpcyBsb29wIGNvdWxkIGxvZyBtb3JlIGJsb2NrcyB0aGFuIHdlIGhhZCBvcmlnaW5hbGx5IGFza2VkCisJCSAqKiBmb3IuICBTbywgd2UgaGF2ZSB0byBhbGxvdyB0aGUgdHJhbnNhY3Rpb24gdG8gZW5kIGlmIGl0IGlzCisJCSAqKiB0b28gYmlnIG9yIHRvbyBmdWxsLiAgVXBkYXRlIHRoZSBpbm9kZSBzbyB0aGluZ3MgYXJlIAorCQkgKiogY29uc2lzdGVudCBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIGZ1bmN0aW9uIHJldHVybnMKKwkJICoqCisJCSAqKiByZWxlYXNlIHRoZSBwYXRoIHNvIHRoYXQgYW55Ym9keSB3YWl0aW5nIG9uIHRoZSBwYXRoIGJlZm9yZQorCQkgKiogZW5kaW5nIHRoZWlyIHRyYW5zYWN0aW9uIHdpbGwgYmUgYWJsZSB0byBjb250aW51ZS4KKwkJICovCisJCWlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7CisJCQlyZXR2YWwgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJLyogaW5zZXJ0aW5nIGluZGlyZWN0IHBvaW50ZXJzIGZvciBhIGhvbGUgY2FuIHRha2UgYSAKKwkJICoqIGxvbmcgdGltZS4gIHJlc2NoZWR1bGUgaWYgbmVlZGVkCisJCSAqLworCQljb25kX3Jlc2NoZWQoKTsKKworCQlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBmYWlsdXJlOworCQl9CisJCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtODI1OiByZWlzZXJmc19nZXRfYmxvY2s6ICIKKwkJCQkJICIlSyBzaG91bGQgbm90IGJlIGZvdW5kIiwgJmtleSk7CisJCQlyZXR2YWwgPSAtRUVYSVNUOworCQkJaWYgKGFsbG9jYXRlZF9ibG9ja19ucikKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJaWggPSBnZXRfaWgoJnBhdGgpOworCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQlwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW07CisJfSB3aGlsZSAoMSk7CisKKwlyZXR2YWwgPSAwOworCisgICAgICBmYWlsdXJlOgorCWlmICh0aCAmJiAoIWRhbmdsZSB8fCAocmV0dmFsICYmICF0aC0+dF90cmFuc19pZCkpKSB7CisJCWludCBlcnI7CisJCWlmICh0aC0+dF90cmFuc19pZCkKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCQllcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CiAJfQotCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy04MjU6IHJlaXNlcmZzX2dldF9ibG9jazogIgotCQkJICAgICAgIiVLIHNob3VsZCBub3QgYmUgZm91bmQiLCAma2V5KTsKLQkgICAgcmV0dmFsID0gLUVFWElTVDsKLQkgICAgaWYgKGFsbG9jYXRlZF9ibG9ja19ucikKLQkgICAgICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKLQkgICAgcGF0aHJlbHNlKCZwYXRoKSA7Ci0JICAgIGdvdG8gZmFpbHVyZTsKLQl9Ci0JYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOwotCWloID0gZ2V0X2loICgmcGF0aCk7Ci0JaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7Ci0JcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwotICAgIH0gd2hpbGUgKDEpOwogCi0KLSAgICByZXR2YWwgPSAwOwotCi0gZmFpbHVyZToKLSAgICBpZiAodGggJiYgKCFkYW5nbGUgfHwgKHJldHZhbCAmJiAhdGgtPnRfdHJhbnNfaWQpKSkgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBpZiAodGgtPnRfdHJhbnNfaWQpCi0gICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dmFsID0gZXJyOwotICAgIH0KLQotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotICAgIHJldHVybiByZXR2YWw7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50CiByZWlzZXJmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCisJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKIHsKLSAgICByZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKIH0KIAogLyogQ29tcHV0ZSByZWFsIG51bWJlciBvZiB1c2VkIGJ5dGVzIGJ5IGZpbGUKQEAgLTk5Niw1MSArMTA1OCw1NiBAQAogICovCiBzdGF0aWMgaW50IHJlYWxfc3BhY2VfZGlmZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2Rfc2l6ZSkKIHsKLSAgICBpbnQgYnl0ZXM7Ci0gICAgbG9mZl90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA7CisJaW50IGJ5dGVzOworCWxvZmZfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAKLSAgICBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKQotICAgICAgICByZXR1cm4gc2Rfc2l6ZSA7CisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIHNkX3NpemU7CiAKLSAgICAvKiBFbmQgb2YgZmlsZSBpcyBhbHNvIGluIGZ1bGwgYmxvY2sgd2l0aCBpbmRpcmVjdCByZWZlcmVuY2UsIHNvIHJvdW5kCi0gICAgKiogdXAgdG8gdGhlIG5leHQgYmxvY2suCi0gICAgKioKLSAgICAqKiB0aGVyZSBpcyBqdXN0IG5vIHdheSB0byBrbm93IGlmIHRoZSB0YWlsIGlzIGFjdHVhbGx5IHBhY2tlZAotICAgICoqIG9uIHRoZSBmaWxlLCBzbyB3ZSBoYXZlIHRvIGFzc3VtZSBpdCBpc24ndC4gIFdoZW4gd2UgcGFjayB0aGUKLSAgICAqKiB0YWlsLCB3ZSBhZGQgNCBieXRlcyB0byBwcmV0ZW5kIHRoZXJlIHJlYWxseSBpcyBhbiB1bmZvcm1hdHRlZAotICAgICoqIG5vZGUgcG9pbnRlcgotICAgICovCi0gICAgYnl0ZXMgPSAoKGlub2RlLT5pX3NpemUgKyAoYmxvY2tzaXplLTEpKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgKiBVTkZNX1BfU0laRSArIHNkX3NpemU7Ci0gICAgcmV0dXJuIGJ5dGVzIDsKKwkvKiBFbmQgb2YgZmlsZSBpcyBhbHNvIGluIGZ1bGwgYmxvY2sgd2l0aCBpbmRpcmVjdCByZWZlcmVuY2UsIHNvIHJvdW5kCisJICoqIHVwIHRvIHRoZSBuZXh0IGJsb2NrLgorCSAqKgorCSAqKiB0aGVyZSBpcyBqdXN0IG5vIHdheSB0byBrbm93IGlmIHRoZSB0YWlsIGlzIGFjdHVhbGx5IHBhY2tlZAorCSAqKiBvbiB0aGUgZmlsZSwgc28gd2UgaGF2ZSB0byBhc3N1bWUgaXQgaXNuJ3QuICBXaGVuIHdlIHBhY2sgdGhlCisJICoqIHRhaWwsIHdlIGFkZCA0IGJ5dGVzIHRvIHByZXRlbmQgdGhlcmUgcmVhbGx5IGlzIGFuIHVuZm9ybWF0dGVkCisJICoqIG5vZGUgcG9pbnRlcgorCSAqLworCWJ5dGVzID0KKwkgICAgKChpbm9kZS0+aV9zaXplICsKKwkgICAgICAoYmxvY2tzaXplIC0gMSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSAqIFVORk1fUF9TSVpFICsKKwkgICAgc2Rfc2l6ZTsKKwlyZXR1cm4gYnl0ZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9mZl90IHRvX3JlYWxfdXNlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bG9uZyBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNkX3NpemUpCisJCQkJCWludCBzZF9zaXplKQogewotICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLSAgICAgICAgcmV0dXJuIGlub2RlLT5pX3NpemUgKyAobG9mZl90KShyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSA7Ci0gICAgfQotICAgIHJldHVybiAoKGxvZmZfdClyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSArICgoKGxvZmZfdClibG9ja3MpIDw8IDkpOworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJcmV0dXJuIGlub2RlLT5pX3NpemUgKworCQkgICAgKGxvZmZfdCkgKHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpOworCX0KKwlyZXR1cm4gKChsb2ZmX3QpIHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpICsKKwkgICAgKCgobG9mZl90KSBibG9ja3MpIDw8IDkpOwogfQogCiAvKiBDb21wdXRlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSBmaWxlIGluIFJlaXNlckZTIGNvdW50aW5nICovCiBzdGF0aWMgaW5saW5lIHVsb25nIHRvX2Zha2VfdXNlZF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IHNkX3NpemUpCiB7Ci0gICAgbG9mZl90IGJ5dGVzID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKSA7Ci0gICAgbG9mZl90IHJlYWxfc3BhY2UgPSByZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpIDsKKwlsb2ZmX3QgYnl0ZXMgPSBpbm9kZV9nZXRfYnl0ZXMoaW5vZGUpOworCWxvZmZfdCByZWFsX3NwYWNlID0gcmVhbF9zcGFjZV9kaWZmKGlub2RlLCBzZF9zaXplKTsKIAotICAgIC8qIGtlZXBzIGZzY2sgYW5kIG5vbi1xdW90YSB2ZXJzaW9ucyBvZiByZWlzZXJmcyBoYXBweSAqLwotICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLSAgICAgICAgYnl0ZXMgKz0gKGxvZmZfdCk1MTEgOwotICAgIH0KKwkvKiBrZWVwcyBmc2NrIGFuZCBub24tcXVvdGEgdmVyc2lvbnMgb2YgcmVpc2VyZnMgaGFwcHkgKi8KKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWJ5dGVzICs9IChsb2ZmX3QpIDUxMTsKKwl9CiAKLSAgICAvKiBmaWxlcyBmcm9tIGJlZm9yZSB0aGUgcXVvdGEgcGF0Y2ggbWlnaHQgaV9ibG9ja3Mgc3VjaCB0aGF0Ci0gICAgKiogYnl0ZXMgPCByZWFsX3NwYWNlLiAgRGVhbCB3aXRoIHRoYXQgaGVyZSB0byBwcmV2ZW50IGl0IGZyb20KLSAgICAqKiBnb2luZyBuZWdhdGl2ZS4KLSAgICAqLwotICAgIGlmIChieXRlcyA8IHJlYWxfc3BhY2UpCi0gICAgICAgIHJldHVybiAwIDsKLSAgICByZXR1cm4gKGJ5dGVzIC0gcmVhbF9zcGFjZSkgPj4gOTsKKwkvKiBmaWxlcyBmcm9tIGJlZm9yZSB0aGUgcXVvdGEgcGF0Y2ggbWlnaHQgaV9ibG9ja3Mgc3VjaCB0aGF0CisJICoqIGJ5dGVzIDwgcmVhbF9zcGFjZS4gIERlYWwgd2l0aCB0aGF0IGhlcmUgdG8gcHJldmVudCBpdCBmcm9tCisJICoqIGdvaW5nIG5lZ2F0aXZlLgorCSAqLworCWlmIChieXRlcyA8IHJlYWxfc3BhY2UpCisJCXJldHVybiAwOworCXJldHVybiAoYnl0ZXMgLSByZWFsX3NwYWNlKSA+PiA5OwogfQogCiAvLwpAQCAtMTA1MSwyNjMgKzExMTgsMjY5IEBACiAvLwogCiAvLyBjYWxsZWQgYnkgcmVhZF9sb2NrZWRfaW5vZGUKLXN0YXRpYyB2b2lkIGluaXRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcGF0aCAqIHBhdGgpCitzdGF0aWMgdm9pZCBpbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBfX3UzMiByZGV2OwotICAgIC8vaW50IHZlcnNpb24gPSBJVEVNX1ZFUlNJT05fMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCV9fdTMyIHJkZXY7CisJLy9pbnQgdmVyc2lvbiA9IElURU1fVkVSU0lPTl8xOwogCi0gICAgYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAocGF0aCk7Ci0gICAgaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCWJoID0gUEFUSF9QTEFTVF9CVUZGRVIocGF0aCk7CisJaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CiAKKwljb3B5X2tleShJTk9ERV9QS0VZKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKIAotICAgIGNvcHlfa2V5IChJTk9ERV9QS0VZIChpbm9kZSksICYoaWgtPmloX2tleSkpOwotICAgIGlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CisJSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KSk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CisJaW5pdF9yd3NlbSgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CiAKLSAgICBJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QgKSk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7Ci0gICAgaW5pdF9yd3NlbSAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlmIChzdGF0X2RhdGFfdjEoaWgpKSB7CisJCXN0cnVjdCBzdGF0X2RhdGFfdjEgKnNkID0KKwkJICAgIChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopQl9JX1BJVEVNKGJoLCBpaCk7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tzOwogCi0gICAgaWYgKHN0YXRfZGF0YV92MSAoaWgpKSB7Ci0Jc3RydWN0IHN0YXRfZGF0YV92MSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilCX0lfUElURU0gKGJoLCBpaCk7Ci0JdW5zaWduZWQgbG9uZyBibG9ja3M7CisJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjEpOworCQlpbm9kZS0+aV9tb2RlID0gc2RfdjFfbW9kZShzZCk7CisJCWlub2RlLT5pX25saW5rID0gc2RfdjFfbmxpbmsoc2QpOworCQlpbm9kZS0+aV91aWQgPSBzZF92MV91aWQoc2QpOworCQlpbm9kZS0+aV9naWQgPSBzZF92MV9naWQoc2QpOworCQlpbm9kZS0+aV9zaXplID0gc2RfdjFfc2l6ZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YxX2F0aW1lKHNkKTsKKwkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc2RfdjFfbXRpbWUoc2QpOworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzZF92MV9jdGltZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAKLQlzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKLSAgICAgICAgc2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlLCBTVEFUX0RBVEFfVjEpOwotCWlub2RlLT5pX21vZGUgID0gc2RfdjFfbW9kZShzZCk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBzZF92MV9ubGluayhzZCk7Ci0JaW5vZGUtPmlfdWlkICAgPSBzZF92MV91aWQoc2QpOwotCWlub2RlLT5pX2dpZCAgID0gc2RfdjFfZ2lkKHNkKTsKLQlpbm9kZS0+aV9zaXplICA9IHNkX3YxX3NpemUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YxX2F0aW1lKHNkKTsKLQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzZF92MV9tdGltZShzZCk7Ci0JaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc2RfdjFfY3RpbWUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzZF92MV9ibG9ja3Moc2QpOworCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKTsKKwkJYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJCWJsb2NrcyA9IF9ST1VORF9VUChibG9ja3MsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA+PiA5KTsKKwkJaWYgKGlub2RlLT5pX2Jsb2NrcyA+IGJsb2NrcykgeworCQkJLy8gdGhlcmUgd2FzIGEgYnVnIGluIDw9My41LjIzIHdoZW4gaV9ibG9ja3MgY291bGQgdGFrZSBuZWdhdGl2ZQorCQkJLy8gdmFsdWVzLiBTdGFydGluZyBmcm9tIDMuNS4xNyB0aGlzIHZhbHVlIGNvdWxkIGV2ZW4gYmUgc3RvcmVkIGluCisJCQkvLyBzdGF0IGRhdGEuIEZvciBzdWNoIGZpbGVzIHdlIHNldCBpX2Jsb2NrcyBiYXNlZCBvbiBmaWxlCisJCQkvLyBzaXplLiBKdXN0IDIgbm90ZXM6IHRoaXMgY2FuIGJlIHdyb25nIGZvciBzcGFyY2UgZmlsZXMuIE9uLWRpc2sgdmFsdWUgd2lsbCBiZQorCQkJLy8gb25seSB1cGRhdGVkIGlmIGZpbGUncyBpbm9kZSB3aWxsIGV2ZXIgY2hhbmdlCisJCQlpbm9kZS0+aV9ibG9ja3MgPSBibG9ja3M7CisJCX0KIAotCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YxX2Jsb2NrcyhzZCk7Ci0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKTsKLQlibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKLQlibG9ja3MgPSBfUk9VTkRfVVAgKGJsb2NrcywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpOwotCWlmIChpbm9kZS0+aV9ibG9ja3MgPiBibG9ja3MpIHsKLQkgICAgLy8gdGhlcmUgd2FzIGEgYnVnIGluIDw9My41LjIzIHdoZW4gaV9ibG9ja3MgY291bGQgdGFrZSBuZWdhdGl2ZQotCSAgICAvLyB2YWx1ZXMuIFN0YXJ0aW5nIGZyb20gMy41LjE3IHRoaXMgdmFsdWUgY291bGQgZXZlbiBiZSBzdG9yZWQgaW4KLQkgICAgLy8gc3RhdCBkYXRhLiBGb3Igc3VjaCBmaWxlcyB3ZSBzZXQgaV9ibG9ja3MgYmFzZWQgb24gZmlsZQotCSAgICAvLyBzaXplLiBKdXN0IDIgbm90ZXM6IHRoaXMgY2FuIGJlIHdyb25nIGZvciBzcGFyY2UgZmlsZXMuIE9uLWRpc2sgdmFsdWUgd2lsbCBiZQotCSAgICAvLyBvbmx5IHVwZGF0ZWQgaWYgZmlsZSdzIGlub2RlIHdpbGwgZXZlciBjaGFuZ2UKLQkgICAgaW5vZGUtPmlfYmxvY2tzID0gYmxvY2tzOworCQlyZGV2ID0gc2RfdjFfcmRldihzZCk7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0KKwkJICAgIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKTsKKwkJLyogYW4gZWFybHkgYnVnIGluIHRoZSBxdW90YSBjb2RlIGNhbiBnaXZlIHVzIGFuIG9kZCBudW1iZXIgZm9yIHRoZQorCQkgKiogYmxvY2sgY291bnQuICBUaGlzIGlzIGluY29ycmVjdCwgZml4IGl0IGhlcmUuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfYmxvY2tzICYgMSkgeworCQkJaW5vZGUtPmlfYmxvY2tzKys7CisJCX0KKwkJaW5vZGVfc2V0X2J5dGVzKGlub2RlLAorCQkJCXRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAorCQkJCQkJICAgU0RfVjFfU0laRSkpOworCQkvKiBub3BhY2sgaXMgaW5pdGlhbGx5IHplcm8gZm9yIHYxIG9iamVjdHMuIEZvciB2MiBvYmplY3RzLAorCQkgICBub3BhY2sgaXMgaW5pdGlhbGlzZWQgZnJvbSBzZF9hdHRycyAqLworCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9ub3BhY2tfbWFzazsKKwl9IGVsc2UgeworCQkvLyBuZXcgc3RhdCBkYXRhIGZvdW5kLCBidXQgb2JqZWN0IG1heSBoYXZlIG9sZCBpdGVtcworCQkvLyAoZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzKQorCQlzdHJ1Y3Qgc3RhdF9kYXRhICpzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopQl9JX1BJVEVNKGJoLCBpaCk7CisKKwkJaW5vZGUtPmlfbW9kZSA9IHNkX3YyX21vZGUoc2QpOworCQlpbm9kZS0+aV9ubGluayA9IHNkX3YyX25saW5rKHNkKTsKKwkJaW5vZGUtPmlfdWlkID0gc2RfdjJfdWlkKHNkKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IHNkX3YyX3NpemUoc2QpOworCQlpbm9kZS0+aV9naWQgPSBzZF92Ml9naWQoc2QpOworCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzZF92Ml9tdGltZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YyX2F0aW1lKHNkKTsKKwkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc2RfdjJfY3RpbWUoc2QpOworCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzZF92Ml9ibG9ja3Moc2QpOworCQlyZGV2ID0gc2RfdjJfcmRldihzZCk7CisJCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0KKwkJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCQllbHNlCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2RfdjJfZ2VuZXJhdGlvbihzZCk7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJCWVsc2UKKwkJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNik7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gMDsKKwkJc2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUsIFNUQVRfREFUQV9WMik7CisJCWlub2RlX3NldF9ieXRlcyhpbm9kZSwKKwkJCQl0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKKwkJCQkJCSAgIFNEX1YyX1NJWkUpKTsKKwkJLyogcmVhZCBwZXJzaXN0ZW50IGlub2RlIGF0dHJpYnV0ZXMgZnJvbSBzZCBhbmQgaW5pdGFsaXNlCisJCSAgIGdlbmVyaWMgaW5vZGUgZmxhZ3MgZnJvbSB0aGVtICovCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0gc2RfdjJfYXR0cnMoc2QpOworCQlzZF9hdHRyc190b19pX2F0dHJzKHNkX3YyX2F0dHJzKHNkKSwgaW5vZGUpOwogCX0KIAotICAgICAgICByZGV2ID0gc2RfdjFfcmRldihzZCk7Ci0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCk7Ci0JLyogYW4gZWFybHkgYnVnIGluIHRoZSBxdW90YSBjb2RlIGNhbiBnaXZlIHVzIGFuIG9kZCBudW1iZXIgZm9yIHRoZQotCSoqIGJsb2NrIGNvdW50LiAgVGhpcyBpcyBpbmNvcnJlY3QsIGZpeCBpdCBoZXJlLgotCSovCi0JaWYgKGlub2RlLT5pX2Jsb2NrcyAmIDEpIHsKLQkgICAgaW5vZGUtPmlfYmxvY2tzKysgOworCXBhdGhyZWxzZShwYXRoKTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIG5ld19kZWNvZGVfZGV2KHJkZXYpKTsKIAl9Ci0JaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMV9TSVpFKSk7Ci0JLyogbm9wYWNrIGlzIGluaXRpYWxseSB6ZXJvIGZvciB2MSBvYmplY3RzLiBGb3IgdjIgb2JqZWN0cywKLQkgICBub3BhY2sgaXMgaW5pdGlhbGlzZWQgZnJvbSBzZF9hdHRycyAqLwotCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX25vcGFja19tYXNrOwotICAgIH0gZWxzZSB7Ci0JLy8gbmV3IHN0YXQgZGF0YSBmb3VuZCwgYnV0IG9iamVjdCBtYXkgaGF2ZSBvbGQgaXRlbXMKLQkvLyAoZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzKQotCXN0cnVjdCBzdGF0X2RhdGEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopQl9JX1BJVEVNIChiaCwgaWgpOwotCi0JaW5vZGUtPmlfbW9kZSAgID0gc2RfdjJfbW9kZShzZCk7Ci0JaW5vZGUtPmlfbmxpbmsgID0gc2RfdjJfbmxpbmsoc2QpOwotCWlub2RlLT5pX3VpZCAgICA9IHNkX3YyX3VpZChzZCk7Ci0JaW5vZGUtPmlfc2l6ZSAgID0gc2RfdjJfc2l6ZShzZCk7Ci0JaW5vZGUtPmlfZ2lkICAgID0gc2RfdjJfZ2lkKHNkKTsKLQlpbm9kZS0+aV9tdGltZS50dl9zZWMgID0gc2RfdjJfbXRpbWUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YyX2F0aW1lKHNkKTsKLQlpbm9kZS0+aV9jdGltZS50dl9zZWMgID0gc2RfdjJfY3RpbWUoc2QpOwotCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YyX2Jsb2NrcyhzZCk7Ci0gICAgICAgIHJkZXYgICAgICAgICAgICA9IHNkX3YyX3JkZXYoc2QpOwotCWlmKCBTX0lTQ0hSKCBpbm9kZSAtPiBpX21vZGUgKSB8fCBTX0lTQkxLKCBpbm9kZSAtPiBpX21vZGUgKSApCi0JICAgIGlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCk7Ci0JZWxzZQotICAgICAgICAgICAgaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHNkX3YyX2dlbmVyYXRpb24oc2QpOwotCi0JaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQotCSAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKLQllbHNlCi0JICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOwotCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gMDsKLQlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMik7Ci0JaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMl9TSVpFKSk7Ci0JLyogcmVhZCBwZXJzaXN0ZW50IGlub2RlIGF0dHJpYnV0ZXMgZnJvbSBzZCBhbmQgaW5pdGFsaXNlCi0JICAgZ2VuZXJpYyBpbm9kZSBmbGFncyBmcm9tIHRoZW0gKi8KLQlSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9IHNkX3YyX2F0dHJzKCBzZCApOwotCXNkX2F0dHJzX3RvX2lfYXR0cnMoIHNkX3YyX2F0dHJzKCBzZCApLCBpbm9kZSApOwotICAgIH0KLQotICAgIHBhdGhyZWxzZSAocGF0aCk7Ci0gICAgaWYgKFNfSVNSRUcgKGlub2RlLT5pX21vZGUpKSB7Ci0JaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKLSAgICB9IGVsc2UgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7Ci0JaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwotICAgIH0gZWxzZSBpZiAoU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpIHsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwotICAgIH0gZWxzZSB7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBuZXdfZGVjb2RlX2RldihyZGV2KSk7Ci0gICAgfQogfQogCi0KIC8vIHVwZGF0ZSBuZXcgc3RhdCBkYXRhIHdpdGggaW5vZGUgZmllbGRzCi1zdGF0aWMgdm9pZCBpbm9kZTJzZCAodm9pZCAqIHNkLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCitzdGF0aWMgdm9pZCBpbm9kZTJzZCh2b2lkICpzZCwgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCiB7Ci0gICAgc3RydWN0IHN0YXRfZGF0YSAqIHNkX3YyID0gKHN0cnVjdCBzdGF0X2RhdGEgKilzZDsKLSAgICBfX3UxNiBmbGFnczsKKwlzdHJ1Y3Qgc3RhdF9kYXRhICpzZF92MiA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopc2Q7CisJX191MTYgZmxhZ3M7CiAKLSAgICBzZXRfc2RfdjJfbW9kZShzZF92MiwgaW5vZGUtPmlfbW9kZSApOwotICAgIHNldF9zZF92Ml9ubGluayhzZF92MiwgaW5vZGUtPmlfbmxpbmsgKTsKLSAgICBzZXRfc2RfdjJfdWlkKHNkX3YyLCBpbm9kZS0+aV91aWQgKTsKLSAgICBzZXRfc2RfdjJfc2l6ZShzZF92Miwgc2l6ZSApOwotICAgIHNldF9zZF92Ml9naWQoc2RfdjIsIGlub2RlLT5pX2dpZCApOwotICAgIHNldF9zZF92Ml9tdGltZShzZF92MiwgaW5vZGUtPmlfbXRpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YyX2F0aW1lKHNkX3YyLCBpbm9kZS0+aV9hdGltZS50dl9zZWMgKTsKLSAgICBzZXRfc2RfdjJfY3RpbWUoc2RfdjIsIGlub2RlLT5pX2N0aW1lLnR2X3NlYyApOwotICAgIHNldF9zZF92Ml9ibG9ja3Moc2RfdjIsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YyX1NJWkUpKTsKLSAgICBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQotCXNldF9zZF92Ml9yZGV2KHNkX3YyLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7Ci0gICAgZWxzZQotCXNldF9zZF92Ml9nZW5lcmF0aW9uKHNkX3YyLCBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKLSAgICBmbGFncyA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzOwotICAgIGlfYXR0cnNfdG9fc2RfYXR0cnMoIGlub2RlLCAmZmxhZ3MgKTsKLSAgICBzZXRfc2RfdjJfYXR0cnMoIHNkX3YyLCBmbGFncyApOworCXNldF9zZF92Ml9tb2RlKHNkX3YyLCBpbm9kZS0+aV9tb2RlKTsKKwlzZXRfc2RfdjJfbmxpbmsoc2RfdjIsIGlub2RlLT5pX25saW5rKTsKKwlzZXRfc2RfdjJfdWlkKHNkX3YyLCBpbm9kZS0+aV91aWQpOworCXNldF9zZF92Ml9zaXplKHNkX3YyLCBzaXplKTsKKwlzZXRfc2RfdjJfZ2lkKHNkX3YyLCBpbm9kZS0+aV9naWQpOworCXNldF9zZF92Ml9tdGltZShzZF92MiwgaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKwlzZXRfc2RfdjJfYXRpbWUoc2RfdjIsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YyX2N0aW1lKHNkX3YyLCBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCXNldF9zZF92Ml9ibG9ja3Moc2RfdjIsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YyX1NJWkUpKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlzZXRfc2RfdjJfcmRldihzZF92MiwgbmV3X2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCWVsc2UKKwkJc2V0X3NkX3YyX2dlbmVyYXRpb24oc2RfdjIsIGlub2RlLT5pX2dlbmVyYXRpb24pOworCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisJaV9hdHRyc190b19zZF9hdHRycyhpbm9kZSwgJmZsYWdzKTsKKwlzZXRfc2RfdjJfYXR0cnMoc2RfdjIsIGZsYWdzKTsKIH0KIAotCiAvLyB1c2VkIHRvIGNvcHkgaW5vZGUncyBmaWVsZHMgdG8gb2xkIHN0YXQgZGF0YQotc3RhdGljIHZvaWQgaW5vZGUyc2RfdjEgKHZvaWQgKiBzZCwgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQorc3RhdGljIHZvaWQgaW5vZGUyc2RfdjEodm9pZCAqc2QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKQogewotICAgIHN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZF92MSA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopc2Q7CisJc3RydWN0IHN0YXRfZGF0YV92MSAqc2RfdjEgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKXNkOwogCi0gICAgc2V0X3NkX3YxX21vZGUoc2RfdjEsIGlub2RlLT5pX21vZGUgKTsKLSAgICBzZXRfc2RfdjFfdWlkKHNkX3YxLCBpbm9kZS0+aV91aWQgKTsKLSAgICBzZXRfc2RfdjFfZ2lkKHNkX3YxLCBpbm9kZS0+aV9naWQgKTsKLSAgICBzZXRfc2RfdjFfbmxpbmsoc2RfdjEsIGlub2RlLT5pX25saW5rICk7Ci0gICAgc2V0X3NkX3YxX3NpemUoc2RfdjEsIHNpemUgKTsKLSAgICBzZXRfc2RfdjFfYXRpbWUoc2RfdjEsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyApOwotICAgIHNldF9zZF92MV9jdGltZShzZF92MSwgaW5vZGUtPmlfY3RpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YxX210aW1lKHNkX3YxLCBpbm9kZS0+aV9tdGltZS50dl9zZWMgKTsKKwlzZXRfc2RfdjFfbW9kZShzZF92MSwgaW5vZGUtPmlfbW9kZSk7CisJc2V0X3NkX3YxX3VpZChzZF92MSwgaW5vZGUtPmlfdWlkKTsKKwlzZXRfc2RfdjFfZ2lkKHNkX3YxLCBpbm9kZS0+aV9naWQpOworCXNldF9zZF92MV9ubGluayhzZF92MSwgaW5vZGUtPmlfbmxpbmspOworCXNldF9zZF92MV9zaXplKHNkX3YxLCBzaXplKTsKKwlzZXRfc2RfdjFfYXRpbWUoc2RfdjEsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YxX2N0aW1lKHNkX3YxLCBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCXNldF9zZF92MV9tdGltZShzZF92MSwgaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKIAotICAgIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgIHNldF9zZF92MV9yZGV2KHNkX3YxLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRfc2RfdjFfYmxvY2tzKHNkX3YxLCB0b19mYWtlX3VzZWRfYmxvY2tzKGlub2RlLCBTRF9WMV9TSVpFKSk7CisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJc2V0X3NkX3YxX3JkZXYoc2RfdjEsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwllbHNlCisJCXNldF9zZF92MV9ibG9ja3Moc2RfdjEsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YxX1NJWkUpKTsKIAotICAgIC8vIFNpZ2guIGlfZmlyc3RfZGlyZWN0X2J5dGUgaXMgYmFjawotICAgIHNldF9zZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZF92MSwgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUpOworCS8vIFNpZ2guIGlfZmlyc3RfZGlyZWN0X2J5dGUgaXMgYmFjaworCXNldF9zZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZF92MSwKKwkJCQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUpOwogfQogCi0KIC8qIE5PVEUsIHlvdSBtdXN0IHByZXBhcmUgdGhlIGJ1ZmZlciBoZWFkIGJlZm9yZSBzZW5kaW5nIGl0IGhlcmUsCiAqKiBhbmQgdGhlbiBsb2cgaXQgYWZ0ZXIgdGhlIGNhbGwKICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfc3RhdF9kYXRhIChzdHJ1Y3QgcGF0aCAqIHBhdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IHNpemUpCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdF9kYXRhKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBsb2ZmX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gIAotICAgIGJoID0gUEFUSF9QTEFTVF9CVUZGRVIgKHBhdGgpOwotICAgIGloID0gUEFUSF9QSVRFTV9IRUFEIChwYXRoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgaWYgKCFpc19zdGF0ZGF0YV9sZV9paCAoaWgpKQotCXJlaXNlcmZzX3BhbmljIChpbm9kZS0+aV9zYiwgInZzLTEzMDY1OiB1cGRhdGVfc3RhdF9kYXRhOiBrZXkgJWssIGZvdW5kIGl0ZW0gJWgiLAotCQkJSU5PREVfUEtFWSAoaW5vZGUpLCBpaCk7Ci0gIAotICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgewotCS8vIHBhdGggcG9pbnRzIHRvIG9sZCBzdGF0IGRhdGEKLQlpbm9kZTJzZF92MSAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLQlpbm9kZTJzZCAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7Ci0gICAgfQorCWJoID0gUEFUSF9QTEFTVF9CVUZGRVIocGF0aCk7CisJaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CiAKLSAgICByZXR1cm47CisJaWYgKCFpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJICAgICAgICJ2cy0xMzA2NTogdXBkYXRlX3N0YXRfZGF0YToga2V5ICVrLCBmb3VuZCBpdGVtICVoIiwKKwkJCSAgICAgICBJTk9ERV9QS0VZKGlub2RlKSwgaWgpOworCisJaWYgKHN0YXRfZGF0YV92MShpaCkpIHsKKwkJLy8gcGF0aCBwb2ludHMgdG8gb2xkIHN0YXQgZGF0YQorCQlpbm9kZTJzZF92MShCX0lfUElURU0oYmgsIGloKSwgaW5vZGUsIHNpemUpOworCX0gZWxzZSB7CisJCWlub2RlMnNkKEJfSV9QSVRFTShiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7CisJfQorCisJcmV0dXJuOwogfQogCi0KLXZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgICAgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQordm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCiB7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKLSAgICBpbnQgZnNfZ2VuIDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loIDsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZnNfZ2VuOworCXN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWg7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMpOy8va2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKLSAgICAKLSAgICBmb3IoOzspIHsKLQlpbnQgcG9zOwotCS8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KLQlyZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgotCQkJICAgICAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byB1cGRhdGUgJUsgc3RhdCBkYXRhIiwKLQkJCSAgICAgICZrZXkpOwotCSAgICByZXR1cm47CisJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCAzKTsJLy9rZXkgdHlwZSBpcyB1bmltcG9ydGFudAorCisJZm9yICg7OykgeworCQlpbnQgcG9zOworCQkvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgorCQkJCQkgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byB1cGRhdGUgJUsgc3RhdCBkYXRhIiwKKwkJCQkJICZrZXkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChyZXR2YWwgPT0gSVRFTV9OT1RfRk9VTkQpIHsKKwkJCXBvcyA9IFBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCk7CisJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKKwkJCQkvKnJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogaV9ubGluayA9PSAwLCBzdGF0IGRhdGEgbm90IGZvdW5kIik7ICovCisJCQkJcmV0dXJuOworCQkJfQorCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy0xMzA2MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCisJCQkJCSAic3RhdCBkYXRhIG9mIG9iamVjdCAlayAobmxpbmsgPT0gJWQpIG5vdCBmb3VuZCAocG9zICVkKSIsCisJCQkJCSBJTk9ERV9QS0VZKGlub2RlKSwgaW5vZGUtPmlfbmxpbmssCisJCQkJCSBwb3MpOworCQkJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBzaWdoLCBwcmVwYXJlX2Zvcl9qb3VybmFsIG1pZ2h0IHNjaGVkdWxlLiAgV2hlbiBpdCBzY2hlZHVsZXMgdGhlCisJCSAqKiBGUyBtaWdodCBjaGFuZ2UuICBXZSBoYXZlIHRvIGRldGVjdCB0aGF0LCBhbmQgbG9vcCBiYWNrIHRvIHRoZQorCQkgKiogc2VhcmNoIGlmIHRoZSBzdGF0IGRhdGEgaXRlbSBoYXMgbW92ZWQKKwkJICovCisJCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKTsKKwkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKTsKKwkJCWNvbnRpbnVlOwkvKiBTdGF0X2RhdGEgaXRlbSBoYXMgYmVlbiBtb3ZlZCBhZnRlciBzY2hlZHVsaW5nLiAqLworCQl9CisJCWJyZWFrOwogCX0KLQlpZiAocmV0dmFsID09IElURU1fTk9UX0ZPVU5EKSB7Ci0JICAgIHBvcyA9IFBBVEhfTEFTVF9QT1NJVElPTiAoJnBhdGgpOwotCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLQkgICAgaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKLQkJLypyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTEzMDUwOiByZWlzZXJmc191cGRhdGVfc2Q6IGlfbmxpbmsgPT0gMCwgc3RhdCBkYXRhIG5vdCBmb3VuZCIpOyovCi0JCXJldHVybjsKLQkgICAgfQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTEzMDYwOiByZWlzZXJmc191cGRhdGVfc2Q6ICIKLQkJCSAgICAgICJzdGF0IGRhdGEgb2Ygb2JqZWN0ICVrIChubGluayA9PSAlZCkgbm90IGZvdW5kIChwb3MgJWQpIiwKLQkJCSAgICAgIElOT0RFX1BLRVkgKGlub2RlKSwgaW5vZGUtPmlfbmxpbmssIHBvcyk7Ci0JICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKLQkgICAgcmV0dXJuOwotCX0KLQkKLQkvKiBzaWdoLCBwcmVwYXJlX2Zvcl9qb3VybmFsIG1pZ2h0IHNjaGVkdWxlLiAgV2hlbiBpdCBzY2hlZHVsZXMgdGhlCi0JKiogRlMgbWlnaHQgY2hhbmdlLiAgV2UgaGF2ZSB0byBkZXRlY3QgdGhhdCwgYW5kIGxvb3AgYmFjayB0byB0aGUKLQkqKiBzZWFyY2ggaWYgdGhlIHN0YXQgZGF0YSBpdGVtIGhhcyBtb3ZlZAotCSovCi0JYmggPSBnZXRfbGFzdF9iaCgmcGF0aCkgOwotCWloID0gZ2V0X2loKCZwYXRoKSA7Ci0JY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsKLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAoaW5vZGUtPmlfc2IpOwotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7Ci0JaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCSAgICBjb250aW51ZSA7CS8qIFN0YXRfZGF0YSBpdGVtIGhhcyBiZWVuIG1vdmVkIGFmdGVyIHNjaGVkdWxpbmcuICovCi0JfQotCWJyZWFrOwotICAgIH0KLSAgICB1cGRhdGVfc3RhdF9kYXRhICgmcGF0aCwgaW5vZGUsIHNpemUpOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgdGgtPnRfc3VwZXIsIGJoKSA7IAotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIHJldHVybjsKKwl1cGRhdGVfc3RhdF9kYXRhKCZwYXRoLCBpbm9kZSwgc2l6ZSk7CisJam91cm5hbF9tYXJrX2RpcnR5KHRoLCB0aC0+dF9zdXBlciwgYmgpOworCXBhdGhyZWxzZSgmcGF0aCk7CisJcmV0dXJuOwogfQogCiAvKiByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZSBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgaW5vZGUgb2ZmIGRpc2ssIGFuZCBpdApAQCAtMTMxNiw5ICsxMzg5LDEwIEBACiAqKiBjb3JyZXNwb25kaW5nIGlwdXQgbWlnaHQgdHJ5IHRvIGRlbGV0ZSB3aGF0ZXZlciBvYmplY3QgdGhlIGlub2RlIGxhc3QKICoqIHJlcHJlc2VudGVkLgogKi8KLXN0YXRpYyB2b2lkIHJlaXNlcmZzX21ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBtZW1zZXQoSU5PREVfUEtFWShpbm9kZSksIDAsIEtFWV9TSVpFKTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSk7CitzdGF0aWMgdm9pZCByZWlzZXJmc19tYWtlX2JhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW1lbXNldChJTk9ERV9QS0VZKGlub2RlKSwgMCwgS0VZX1NJWkUpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIH0KIAogLy8KQEAgLTEzMjYsNzcgKzE0MDAsNzkgQEAKIC8vIGV2b2x2ZWQgYXMgdGhlIHByb3RvdHlwZSBkaWQKIC8vCiAKLWludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHZvaWQgKnApCitpbnQgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzID0gKHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKilwIDsKLSAgICBpbm9kZS0+aV9pbm8gPSBhcmdzLT5vYmplY3RpZDsKLSAgICBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQgPSBjcHVfdG9fbGUzMihhcmdzLT5kaXJpZCk7Ci0gICAgcmV0dXJuIDA7CisJc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncyA9IChzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICopcDsKKwlpbm9kZS0+aV9pbm8gPSBhcmdzLT5vYmplY3RpZDsKKwlJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQgPSBjcHVfdG9fbGUzMihhcmdzLT5kaXJpZCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGxvb2tzIGZvciBzdGF0IGRhdGEgaW4gdGhlIHRyZWUsIGFuZCBmaWxscyB1cCB0aGUgZmllbGRzIG9mIGluLWNvcmUKICAgIGlub2RlIHN0YXQgZGF0YSBmaWVsZHMgKi8KLXZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKQordm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX3NkKTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgdW5zaWduZWQgbG9uZyBkaXJpbm87Ci0gICAgaW50IHJldHZhbDsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19zZCk7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXVuc2lnbmVkIGxvbmcgZGlyaW5vOworCWludCByZXR2YWw7CiAKLSAgICBkaXJpbm8gPSBhcmdzLT5kaXJpZCA7CisJZGlyaW5vID0gYXJncy0+ZGlyaWQ7CiAKLSAgICAvKiBzZXQgdmVyc2lvbiAxLCB2ZXJzaW9uIDIgY291bGQgYmUgdXNlZCB0b28sIGJlY2F1c2Ugc3RhdCBkYXRhCi0gICAgICAga2V5IGlzIHRoZSBzYW1lIGluIGJvdGggdmVyc2lvbnMgKi8KLSAgICBrZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRpcmlubzsKLSAgICBrZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKLSAgICBrZXkub25fZGlza19rZXkua19vZmZzZXQgPSAwOwotICAgIGtleS5vbl9kaXNrX2tleS5rX3R5cGUgPSAwOworCS8qIHNldCB2ZXJzaW9uIDEsIHZlcnNpb24gMiBjb3VsZCBiZSB1c2VkIHRvbywgYmVjYXVzZSBzdGF0IGRhdGEKKwkgICBrZXkgaXMgdGhlIHNhbWUgaW4gYm90aCB2ZXJzaW9ucyAqLworCWtleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisJa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaW5vOworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWtleS5vbl9kaXNrX2tleS5rX29mZnNldCA9IDA7CisJa2V5Lm9uX2Rpc2tfa2V5LmtfdHlwZSA9IDA7CiAKLSAgICAvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aF90b19zZCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNzA6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCi0JCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZmluZCBzdGF0IGRhdGEgb2YgJUsiLAotCQkJICAma2V5KTsKLQlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSkgOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCAhPSBJVEVNX0ZPVU5EKSB7Ci0JLyogYSBzdGFsZSBORlMgaGFuZGxlIGNhbiB0cmlnZ2VyIHRoaXMgd2l0aG91dCBpdCBiZWluZyBhbiBlcnJvciAqLwotCXBhdGhyZWxzZSAoJnBhdGhfdG9fc2QpOwotCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKSA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwotCXJldHVybjsKLSAgICB9CisJLyogbG9vayBmb3IgdGhlIG9iamVjdCdzIHN0YXQgZGF0YSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aF90b19zZCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAidnMtMTMwNzA6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkJICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZmluZCBzdGF0IGRhdGEgb2YgJUsiLAorCQkJCSAma2V5KTsKKwkJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgeworCQkvKiBhIHN0YWxlIE5GUyBoYW5kbGUgY2FuIHRyaWdnZXIgdGhpcyB3aXRob3V0IGl0IGJlaW5nIGFuIGVycm9yICovCisJCXBhdGhyZWxzZSgmcGF0aF90b19zZCk7CisJCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlyZXR1cm47CisJfQogCi0gICAgaW5pdF9pbm9kZSAoaW5vZGUsICZwYXRoX3RvX3NkKTsKLSAgIAotICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQga25mc2QgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpbm9kZSBvZiBhIGZpbGUKLSAgICAgICB0aGF0IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZGlzayBieSBzb21lIG90aGVyIHRocmVhZC4gQXMgd2UKLSAgICAgICB1cGRhdGUgc2Qgb24gdW5saW5rIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRvIGNoZWNrIGZvciBubGluawotICAgICAgIGhlcmUuIFRoaXMgYnVnIHdhcyBmaXJzdCBmb3VuZCBieSBTaXppZiB3aGVuIGRlYnVnZ2luZwotICAgICAgIFNxdWlkTkcvQnV0dGVyZmx5LCBmb3Jnb3R0ZW4sIGFuZCBmb3VuZCBhZ2FpbiBhZnRlciBQaGlsaXBwZQotICAgICAgIEdyYW1vdWxsZSA8cGhpbGlwcGUuZ3JhbW91bGxlQG1tYW5pYS5jb20+IHJlcHJvZHVjZWQgaXQuIAorCWluaXRfaW5vZGUoaW5vZGUsICZwYXRoX3RvX3NkKTsKIAotICAgICAgIE1vcmUgbG9naWNhbCBmaXggd291bGQgcmVxdWlyZSBjaGFuZ2VzIGluIGZzL2lub2RlLmM6aXB1dCgpIHRvCi0gICAgICAgcmVtb3ZlIGlub2RlIGZyb20gaGFzaC10YWJsZSBfYWZ0ZXJfIGZzIGNsZWFuZWQgZGlzayBzdHVmZiB1cCBhbmQKLSAgICAgICBpbiBpZ2V0KCkgdG8gcmV0dXJuIE5VTEwgaWYgSV9GUkVFSU5HIGlub2RlIGlzIGZvdW5kIGluCi0gICAgICAgaGFzaC10YWJsZS4gKi8KLSAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIHBsYWNlIHdoZXJlIGl0J3Mgb2sgdG8gbWVldCBpbm9kZSB3aXRoCi0gICAgICAgbmxpbms9PTA6IHByb2Nlc3Npbmcgb2Ygb3Blbi11bmxpbmtlZCBhbmQgaGFsZi10cnVuY2F0ZWQgZmlsZXMKLSAgICAgICBkdXJpbmcgbW91bnQgKGZzL3JlaXNlcmZzL3N1cGVyLmM6ZmluaXNoX3VuZmluaXNoZWQoKSkuICovCi0gICAgaWYoICggaW5vZGUgLT4gaV9ubGluayA9PSAwICkgJiYgCi0JISBSRUlTRVJGU19TQihpbm9kZSAtPiBpX3NiKSAtPiBzX2lzX3VubGlua2VkX29rICkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKLQkJCSAgICAgICJ2cy0xMzA3NTogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKLQkJCSAgICAgICJkZWFkIGlub2RlIHJlYWQgZnJvbSBkaXNrICVLLiAiCi0JCQkgICAgICAiVGhpcyBpcyBsaWtlbHkgdG8gYmUgcmFjZSB3aXRoIGtuZnNkLiBJZ25vcmUiLAotCQkJICAgICAgJmtleSApOwotCSAgICByZWlzZXJmc19tYWtlX2JhZF9pbm9kZSggaW5vZGUgKTsKLSAgICB9CisJLyogSXQgaXMgcG9zc2libGUgdGhhdCBrbmZzZCBpcyB0cnlpbmcgdG8gYWNjZXNzIGlub2RlIG9mIGEgZmlsZQorCSAgIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkaXNrIGJ5IHNvbWUgb3RoZXIgdGhyZWFkLiBBcyB3ZQorCSAgIHVwZGF0ZSBzZCBvbiB1bmxpbmsgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gY2hlY2sgZm9yIG5saW5rCisJICAgaGVyZS4gVGhpcyBidWcgd2FzIGZpcnN0IGZvdW5kIGJ5IFNpemlmIHdoZW4gZGVidWdnaW5nCisJICAgU3F1aWRORy9CdXR0ZXJmbHksIGZvcmdvdHRlbiwgYW5kIGZvdW5kIGFnYWluIGFmdGVyIFBoaWxpcHBlCisJICAgR3JhbW91bGxlIDxwaGlsaXBwZS5ncmFtb3VsbGVAbW1hbmlhLmNvbT4gcmVwcm9kdWNlZCBpdC4gCiAKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX3NkKSA7IC8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KKwkgICBNb3JlIGxvZ2ljYWwgZml4IHdvdWxkIHJlcXVpcmUgY2hhbmdlcyBpbiBmcy9pbm9kZS5jOmlwdXQoKSB0bworCSAgIHJlbW92ZSBpbm9kZSBmcm9tIGhhc2gtdGFibGUgX2FmdGVyXyBmcyBjbGVhbmVkIGRpc2sgc3R1ZmYgdXAgYW5kCisJICAgaW4gaWdldCgpIHRvIHJldHVybiBOVUxMIGlmIElfRlJFRUlORyBpbm9kZSBpcyBmb3VuZCBpbgorCSAgIGhhc2gtdGFibGUuICovCisJLyogQ3VycmVudGx5IHRoZXJlIGlzIG9uZSBwbGFjZSB3aGVyZSBpdCdzIG9rIHRvIG1lZXQgaW5vZGUgd2l0aAorCSAgIG5saW5rPT0wOiBwcm9jZXNzaW5nIG9mIG9wZW4tdW5saW5rZWQgYW5kIGhhbGYtdHJ1bmNhdGVkIGZpbGVzCisJICAgZHVyaW5nIG1vdW50IChmcy9yZWlzZXJmcy9zdXBlci5jOmZpbmlzaF91bmZpbmlzaGVkKCkpLiAqLworCWlmICgoaW5vZGUtPmlfbmxpbmsgPT0gMCkgJiYKKwkgICAgIVJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19pc191bmxpbmtlZF9vaykgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAidnMtMTMwNzU6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkJICJkZWFkIGlub2RlIHJlYWQgZnJvbSBkaXNrICVLLiAiCisJCQkJICJUaGlzIGlzIGxpa2VseSB0byBiZSByYWNlIHdpdGgga25mc2QuIElnbm9yZSIsCisJCQkJICZrZXkpOworCQlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJfQorCisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19zZCk7CS8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KIAogfQogCkBAIC0xNDEyLDE0MSArMTQ4OCwxNDkgQEAKICAqIGlub2RlIG51bWJlcnMgKG9iamVjdGlkcykgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgcGFyZW50IGRpcmVjdG9yeSBpZHMuCiAgKgogICovCi1pbnQgcmVpc2VyZnNfZmluZF9hY3Rvciggc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlICkKK2ludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzOworCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3M7CiAKLSAgICBhcmdzID0gb3BhcXVlOwotICAgIC8qIGFyZ3MgaXMgYWxyZWFkeSBpbiBDUFUgb3JkZXIgKi8KLSAgICByZXR1cm4gKGlub2RlLT5pX2lubyA9PSBhcmdzLT5vYmplY3RpZCkgJiYKLQkobGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKSA9PSBhcmdzLT5kaXJpZCk7CisJYXJncyA9IG9wYXF1ZTsKKwkvKiBhcmdzIGlzIGFscmVhZHkgaW4gQ1BVIG9yZGVyICovCisJcmV0dXJuIChpbm9kZS0+aV9pbm8gPT0gYXJncy0+b2JqZWN0aWQpICYmCisJICAgIChsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpID09IGFyZ3MtPmRpcmlkKTsKIH0KIAotc3RydWN0IGlub2RlICogcmVpc2VyZnNfaWdldCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdHJ1Y3QgaW5vZGUgKnJlaXNlcmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgYXJncyA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3M7CiAKLSAgICBhcmdzLm9iamVjdGlkID0ga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkIDsKLSAgICBhcmdzLmRpcmlkID0ga2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA7Ci0gICAgaW5vZGUgPSBpZ2V0NV9sb2NrZWQgKHMsIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCwgCi0JCSAgIHJlaXNlcmZzX2ZpbmRfYWN0b3IsIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOwotICAgIGlmICghaW5vZGUpIAotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pIDsKKwlhcmdzLm9iamVjdGlkID0ga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkOworCWFyZ3MuZGlyaWQgPSBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkOworCWlub2RlID0gaWdldDVfbG9ja2VkKHMsIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCwKKwkJCSAgICAgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsCisJCQkgICAgICh2b2lkICopKCZhcmdzKSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLSAgICBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlLCAmYXJncyk7Ci0JdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0gICAgfQorCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlLCAmYXJncyk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KIAotICAgIGlmIChjb21wX3Nob3J0X2tleXMgKElOT0RFX1BLRVkgKGlub2RlKSwga2V5KSB8fCBpc19iYWRfaW5vZGUgKGlub2RlKSkgewotCS8qIGVpdGhlciBkdWUgdG8gaS9vIGVycm9yIG9yIGEgc3RhbGUgTkZTIGhhbmRsZSAqLwotCWlwdXQgKGlub2RlKTsKLQlpbm9kZSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBpbm9kZTsKKwlpZiAoY29tcF9zaG9ydF9rZXlzKElOT0RFX1BLRVkoaW5vZGUpLCBrZXkpIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJLyogZWl0aGVyIGR1ZSB0byBpL28gZXJyb3Igb3IgYSBzdGFsZSBORlMgaGFuZGxlICovCisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCXJldHVybiBpbm9kZTsKIH0KIAogc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKIHsKLSAgICBfX3UzMiAqZGF0YSA9IHZvYmpwOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleSA7Ci0gICAgc3RydWN0IGRlbnRyeSAqcmVzdWx0OwotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0gICAgCi0gICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBkYXRhWzBdIDsKLSAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkYXRhWzFdIDsKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKLSAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQoc2IsICZrZXkpIDsKLSAgICBpZiAoaW5vZGUgJiYgIUlTX0VSUihpbm9kZSkgJiYgZGF0YVsyXSAhPSAwICYmCi0JZGF0YVsyXSAhPSBpbm9kZS0+aV9nZW5lcmF0aW9uKSB7Ci0JICAgIGlwdXQoaW5vZGUpIDsKLQkgICAgaW5vZGUgPSBOVUxMIDsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKLSAgICBpZiAoIWlub2RlKQotCSAgICBpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7Ci0gICAgaWYgKElTX0VSUihpbm9kZSkpCi0JICAgIHJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKLSAgICByZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotICAgIGlmICghcmVzdWx0KSB7Ci0JICAgIGlwdXQoaW5vZGUpOwotCSAgICByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKwlfX3UzMiAqZGF0YSA9IHZvYmpwOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gZGF0YVswXTsKKwlrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkYXRhWzFdOworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCWlub2RlID0gcmVpc2VyZnNfaWdldChzYiwgJmtleSk7CisJaWYgKGlub2RlICYmICFJU19FUlIoaW5vZGUpICYmIGRhdGFbMl0gIT0gMCAmJgorCSAgICBkYXRhWzJdICE9IGlub2RlLT5pX2dlbmVyYXRpb24pIHsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gTlVMTDsKKwl9CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKKwlpZiAoIWlub2RlKQorCQlpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmaHR5cGUsCi0JCQkJICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZWN0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCQkJICB2b2lkICpjb250ZXh0KSB7Ci0gICAgX191MzIgb2JqWzNdLCBwYXJlbnRbM107CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKiBkYXRhLAorCQkJCSAgaW50IGxlbiwgaW50IGZodHlwZSwKKwkJCQkgIGludCAoKmFjY2VwdGFibGUpICh2b2lkICpjb250ZWN0LAorCQkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICogZGUpLAorCQkJCSAgdm9pZCAqY29udGV4dCkKK3sKKwlfX3UzMiBvYmpbM10sIHBhcmVudFszXTsKIAotICAgIC8qIGZodHlwZSBoYXBwZW5zIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiB1MzJzIGVuY29kZWQuCi0gICAgICogZHVlIHRvIGEgYnVnIGluIGVhcmxpZXIgY29kZSwgZmh0eXBlIG1pZ2h0IGluZGljYXRlIHRoZXJlCi0gICAgICogYXJlIG1vcmUgdTMycyB0aGVuIGFjdHVhbGx5IGZpdHRlZC4KLSAgICAgKiBzbyBpZiBmaHR5cGUgc2VlbXMgdG8gYmUgbW9yZSB0aGFuIGxlbiwgcmVkdWNlIGZodHlwZS4KLSAgICAgKiBWYWxpZCB0eXBlcyBhcmU6Ci0gICAgICogICAyIC0gb2JqZWN0aWQgKyBkaXJfaWQgLSBsZWdhY3kgc3VwcG9ydAotICAgICAqICAgMyAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbgotICAgICAqICAgNCAtIG9iamVjdGlkICsgZGlyX2lkICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudCAtIGxlZ2FjeQotICAgICAqICAgNSAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbiArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQKLSAgICAgKiAgIDYgLSBhcyBhYm92ZSBwbHVzIGdlbmVyYXRpb24gb2YgZGlyZWN0b3J5Ci0gICAgICogNiBkb2VzIG5vdCBmaXQgaW4gTkZTdjIgaGFuZGxlcwotICAgICAqLwotICAgIGlmIChmaHR5cGUgPiBsZW4pIHsKLQkgICAgaWYgKGZodHlwZSAhPSA2IHx8IGxlbiAhPSA1KQotCQkgICAgcmVpc2VyZnNfd2FybmluZyAoc2IsICJuZnNkL3JlaXNlcmZzLCBmaHR5cGU9JWQsIGxlbj0lZCAtIG9kZCIsCi0JCQkgICBmaHR5cGUsIGxlbik7Ci0JICAgIGZodHlwZSA9IDU7Ci0gICAgfQorCS8qIGZodHlwZSBoYXBwZW5zIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiB1MzJzIGVuY29kZWQuCisJICogZHVlIHRvIGEgYnVnIGluIGVhcmxpZXIgY29kZSwgZmh0eXBlIG1pZ2h0IGluZGljYXRlIHRoZXJlCisJICogYXJlIG1vcmUgdTMycyB0aGVuIGFjdHVhbGx5IGZpdHRlZC4KKwkgKiBzbyBpZiBmaHR5cGUgc2VlbXMgdG8gYmUgbW9yZSB0aGFuIGxlbiwgcmVkdWNlIGZodHlwZS4KKwkgKiBWYWxpZCB0eXBlcyBhcmU6CisJICogICAyIC0gb2JqZWN0aWQgKyBkaXJfaWQgLSBsZWdhY3kgc3VwcG9ydAorCSAqICAgMyAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbgorCSAqICAgNCAtIG9iamVjdGlkICsgZGlyX2lkICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudCAtIGxlZ2FjeQorCSAqICAgNSAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbiArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQKKwkgKiAgIDYgLSBhcyBhYm92ZSBwbHVzIGdlbmVyYXRpb24gb2YgZGlyZWN0b3J5CisJICogNiBkb2VzIG5vdCBmaXQgaW4gTkZTdjIgaGFuZGxlcworCSAqLworCWlmIChmaHR5cGUgPiBsZW4pIHsKKwkJaWYgKGZodHlwZSAhPSA2IHx8IGxlbiAhPSA1KQorCQkJcmVpc2VyZnNfd2FybmluZyhzYiwKKwkJCQkJICJuZnNkL3JlaXNlcmZzLCBmaHR5cGU9JWQsIGxlbj0lZCAtIG9kZCIsCisJCQkJCSBmaHR5cGUsIGxlbik7CisJCWZodHlwZSA9IDU7CisJfQogCi0gICAgb2JqWzBdID0gZGF0YVswXTsKLSAgICBvYmpbMV0gPSBkYXRhWzFdOwotICAgIGlmIChmaHR5cGUgPT0gMyB8fCBmaHR5cGUgPj0gNSkKLQkgICAgb2JqWzJdID0gZGF0YVsyXTsKLSAgICBlbHNlICAgIG9ialsyXSA9IDA7IC8qIGdlbmVyYXRpb24gbnVtYmVyICovCisJb2JqWzBdID0gZGF0YVswXTsKKwlvYmpbMV0gPSBkYXRhWzFdOworCWlmIChmaHR5cGUgPT0gMyB8fCBmaHR5cGUgPj0gNSkKKwkJb2JqWzJdID0gZGF0YVsyXTsKKwllbHNlCisJCW9ialsyXSA9IDA7CS8qIGdlbmVyYXRpb24gbnVtYmVyICovCiAKLSAgICBpZiAoZmh0eXBlID49IDQpIHsKLQkgICAgcGFyZW50WzBdID0gZGF0YVtmaHR5cGU+PTU/MzoyXSA7Ci0JICAgIHBhcmVudFsxXSA9IGRhdGFbZmh0eXBlPj01PzQ6M10gOwotCSAgICBpZiAoZmh0eXBlID09IDYpCi0JCSAgICBwYXJlbnRbMl0gPSBkYXRhWzVdOwotCSAgICBlbHNlICAgIHBhcmVudFsyXSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBvYmosIGZodHlwZSA8IDQgPyBOVUxMIDogcGFyZW50LAotCQkJICAgICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOworCWlmIChmaHR5cGUgPj0gNCkgeworCQlwYXJlbnRbMF0gPSBkYXRhW2ZodHlwZSA+PSA1ID8gMyA6IDJdOworCQlwYXJlbnRbMV0gPSBkYXRhW2ZodHlwZSA+PSA1ID8gNCA6IDNdOworCQlpZiAoZmh0eXBlID09IDYpCisJCQlwYXJlbnRbMl0gPSBkYXRhWzVdOworCQllbHNlCisJCQlwYXJlbnRbMl0gPSAwOworCX0KKwlyZXR1cm4gc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgb2JqLAorCQkJCQkJICAgICBmaHR5cGUgPCA0ID8gTlVMTCA6IHBhcmVudCwKKwkJCQkJCSAgICAgYWNjZXB0YWJsZSwgY29udGV4dCk7CiB9CiAKLWludCByZWlzZXJmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZGF0YSwgaW50ICpsZW5wLCBpbnQgbmVlZF9wYXJlbnQpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlIDsKLSAgICBpbnQgbWF4bGVuID0gKmxlbnA7Ci0gICAgCi0gICAgaWYgKG1heGxlbiA8IDMpCi0gICAgICAgIHJldHVybiAyNTUgOworaW50IHJlaXNlcmZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICogZGF0YSwgaW50ICpsZW5wLAorCQkgICAgICAgaW50IG5lZWRfcGFyZW50KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IG1heGxlbiA9ICpsZW5wOwogCi0gICAgZGF0YVswXSA9IGlub2RlLT5pX2lubyA7Ci0gICAgZGF0YVsxXSA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpIDsKLSAgICBkYXRhWzJdID0gaW5vZGUtPmlfZ2VuZXJhdGlvbiA7Ci0gICAgKmxlbnAgPSAzIDsKLSAgICAvKiBubyByb29tIGZvciBkaXJlY3RvcnkgaW5mbz8gcmV0dXJuIHdoYXQgd2UndmUgc3RvcmVkIHNvIGZhciAqLwotICAgIGlmIChtYXhsZW4gPCA1IHx8ICEgbmVlZF9wYXJlbnQpCi0gICAgICAgIHJldHVybiAzIDsKKwlpZiAobWF4bGVuIDwgMykKKwkJcmV0dXJuIDI1NTsKIAotICAgIHNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotICAgIGlub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSA7Ci0gICAgZGF0YVszXSA9IGlub2RlLT5pX2lubyA7Ci0gICAgZGF0YVs0XSA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpIDsKLSAgICAqbGVucCA9IDUgOwotICAgIGlmIChtYXhsZW4gPj0gNikgewotCSAgICBkYXRhWzVdID0gaW5vZGUtPmlfZ2VuZXJhdGlvbiA7Ci0JICAgICpsZW5wID0gNiA7Ci0gICAgfQotICAgIHNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0gICAgcmV0dXJuICpsZW5wIDsKKwlkYXRhWzBdID0gaW5vZGUtPmlfaW5vOworCWRhdGFbMV0gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCWRhdGFbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCSpsZW5wID0gMzsKKwkvKiBubyByb29tIGZvciBkaXJlY3RvcnkgaW5mbz8gcmV0dXJuIHdoYXQgd2UndmUgc3RvcmVkIHNvIGZhciAqLworCWlmIChtYXhsZW4gPCA1IHx8ICFuZWVkX3BhcmVudCkKKwkJcmV0dXJuIDM7CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJZGF0YVszXSA9IGlub2RlLT5pX2lubzsKKwlkYXRhWzRdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKTsKKwkqbGVucCA9IDU7CisJaWYgKG1heGxlbiA+PSA2KSB7CisJCWRhdGFbNV0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCQkqbGVucCA9IDY7CisJfQorCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJcmV0dXJuICpsZW5wOwogfQogCi0KIC8qIGxvb2tzIGZvciBzdGF0IGRhdGEsIHRoZW4gY29waWVzIGZpZWxkcyB0byBpdCwgbWFya3MgdGhlIGJ1ZmZlcgogICAgY29udGFpbmluZyBzdGF0IGRhdGEgYXMgZGlydHkgKi8KIC8qIHJlaXNlcmZzIGlub2RlcyBhcmUgbmV2ZXIgcmVhbGx5IGRpcnR5LCBzaW5jZSB0aGUgZGlydHkgaW5vZGUgY2FsbApAQCAtMTU1NCwxMjEgKzE2MzgsMTI4IEBACiAqKiB0byBwcm9wZXJseSBtYXJrIGlub2RlcyBmb3IgZGF0YXN5bmMgYW5kIHN1Y2gsIGJ1dCBvbmx5IGFjdHVhbGx5CiAqKiBkb2VzIHNvbWV0aGluZyB3aGVuIGNhbGxlZCBmb3IgYSBzeW5jaHJvbm91cyB1cGRhdGUuCiAqLwotaW50IHJlaXNlcmZzX3dyaXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICBpbnQgamJlZ2luX2NvdW50ID0gMSA7CitpbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50ID0gMTsKIAotICAgIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKLSAgICAgICAgcmV0dXJuIC1FUk9GUzsKLSAgICAvKiBtZW1vcnkgcHJlc3N1cmUgY2FuIHNvbWV0aW1lcyBpbml0aWF0ZSB3cml0ZV9pbm9kZSBjYWxscyB3aXRoIHN5bmMgPT0gMSwKLSAgICAqKiB0aGVzZSBjYXNlcyBhcmUganVzdCB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgcmFtLCBub3Qgd2hlbiB0aGUgCi0gICAgKiogaW5vZGUgbmVlZHMgdG8gcmVhY2ggZGlzayBmb3Igc2FmZXR5LCBhbmQgdGhleSBjYW4gc2FmZWx5IGJlCi0gICAgKiogaWdub3JlZCBiZWNhdXNlIHRoZSBhbHRlcmVkIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgotICAgICovCi0gICAgaWYgKGRvX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICgham91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7Ci0gICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotICAgICAgICAgICAgam91cm5hbF9lbmRfc3luYygmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICAgICAgfQotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotICAgIHJldHVybiAwOworCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuIC1FUk9GUzsKKwkvKiBtZW1vcnkgcHJlc3N1cmUgY2FuIHNvbWV0aW1lcyBpbml0aWF0ZSB3cml0ZV9pbm9kZSBjYWxscyB3aXRoIHN5bmMgPT0gMSwKKwkgKiogdGhlc2UgY2FzZXMgYXJlIGp1c3Qgd2hlbiB0aGUgc3lzdGVtIG5lZWRzIHJhbSwgbm90IHdoZW4gdGhlIAorCSAqKiBpbm9kZSBuZWVkcyB0byByZWFjaCBkaXNrIGZvciBzYWZldHksIGFuZCB0aGV5IGNhbiBzYWZlbHkgYmUKKwkgKiogaWdub3JlZCBiZWNhdXNlIHRoZSBhbHRlcmVkIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgorCSAqLworCWlmIChkb19zeW5jICYmICEoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICgham91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCQlqb3VybmFsX2VuZF9zeW5jKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCX0KKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIHN0YXQgZGF0YSBvZiBuZXcgb2JqZWN0IGlzIGluc2VydGVkIGFscmVhZHksIHRoaXMgaW5zZXJ0cyB0aGUgaXRlbQogICAgY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAqLwotc3RhdGljIGludCByZWlzZXJmc19uZXdfZGlyZWN0b3J5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHN0cnVjdCBwYXRoICogcGF0aCwKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKiBkaXIpCitzdGF0aWMgaW50IHJlaXNlcmZzX25ld19kaXJlY3Rvcnkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCSAgc3RydWN0IGlub2RlICpkaXIpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSB0aC0+dF9zdXBlcjsKLSAgICBjaGFyIGVtcHR5X2RpciBbRU1QVFlfRElSX1NJWkVdOwotICAgIGNoYXIgKiBib2R5ID0gZW1wdHlfZGlyOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB0aC0+dF9zdXBlcjsKKwljaGFyIGVtcHR5X2RpcltFTVBUWV9ESVJfU0laRV07CisJY2hhciAqYm9keSA9IGVtcHR5X2RpcjsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICAKLSAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNSwgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLAotCQkgICBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX29iamVjdGlkKSwgRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwgMy8qa2V5IGxlbmd0aCovKTsKLSAgICAKLSAgICAvKiBjb21wb3NlIGl0ZW0gaGVhZCBmb3IgbmV3IGl0ZW0uIERpcmVjdG9yaWVzIGNvbnNpc3Qgb2YgaXRlbXMgb2YKLSAgICAgICBvbGQgdHlwZSAoSVRFTV9WRVJTSU9OXzEpLiBEbyBub3Qgc2V0IGtleSAoc2Vjb25kIGFyZyBpcyAwKSwgaXQKLSAgICAgICBpcyBkb25lIGJ5IHJlaXNlcmZzX25ld19pbm9kZSAqLwotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkgewotCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFX1YxLCAyKTsKLQkKLQltYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCi0JCQkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAotCQkJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKLSAgICB9IGVsc2UgewotCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFLCAyKTsKLQkKLQltYWtlX2VtcHR5X2Rpcl9pdGVtIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCi0JCSAgIAkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAotCQkgICAJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCBwYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IGRpcmVjdG9yeSIpOwotCXJldHVybiAtRUlPOwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwNzA6IHJlaXNlcmZzX25ld19kaXJlY3Rvcnk6ICIKLQkJCSAgIm9iamVjdCB3aXRoIHRoaXMga2V5IGV4aXN0cyAoJWspIiwgJihpaC0+aWhfa2V5KSk7Ci0JcmV0dXJuIC1FRVhJU1Q7Ci0gICAgfQorCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogaW5zZXJ0IGl0ZW0sIHRoYXQgaXMgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKi8KLSAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIGJvZHkpOworCV9tYWtlX2NwdV9rZXkoJmtleSwgS0VZX0ZPUk1BVF8zXzUsIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLCBET1RfT0ZGU0VULAorCQkgICAgICBUWVBFX0RJUkVOVFJZLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCisJLyogY29tcG9zZSBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtLiBEaXJlY3RvcmllcyBjb25zaXN0IG9mIGl0ZW1zIG9mCisJICAgb2xkIHR5cGUgKElURU1fVkVSU0lPTl8xKS4gRG8gbm90IHNldCBrZXkgKHNlY29uZCBhcmcgaXMgMCksIGl0CisJICAgaXMgZG9uZSBieSByZWlzZXJmc19uZXdfaW5vZGUgKi8KKwlpZiAob2xkX2Zvcm1hdF9vbmx5KHNiKSkgeworCQltYWtlX2xlX2l0ZW1faGVhZChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsCisJCQkJICBUWVBFX0RJUkVOVFJZLCBFTVBUWV9ESVJfU0laRV9WMSwgMik7CisKKwkJbWFrZV9lbXB0eV9kaXJfaXRlbV92MShib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLAorCQkJCSAgICAgICBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCisJCQkJICAgICAgIElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQsCisJCQkJICAgICAgIElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZCk7CisJfSBlbHNlIHsKKwkJbWFrZV9sZV9pdGVtX2hlYWQoaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBET1RfT0ZGU0VULAorCQkJCSAgVFlQRV9ESVJFTlRSWSwgRU1QVFlfRElSX1NJWkUsIDIpOworCisJCW1ha2VfZW1wdHlfZGlyX2l0ZW0oYm9keSwgaWgtPmloX2tleS5rX2Rpcl9pZCwKKwkJCQkgICAgaWgtPmloX2tleS5rX29iamVjdGlkLAorCQkJCSAgICBJTk9ERV9QS0VZKGRpciktPmtfZGlyX2lkLAorCQkJCSAgICBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQpOworCX0KKworCS8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKHNiLCAma2V5LCBwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgorCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IGRpcmVjdG9yeSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJCXBhdGhyZWxzZShwYXRoKTsKKwkJcmVpc2VyZnNfd2FybmluZyhzYiwgInZzLTEzMDcwOiByZWlzZXJmc19uZXdfZGlyZWN0b3J5OiAiCisJCQkJICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsCisJCQkJICYoaWgtPmloX2tleSkpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBlbXB0eSBkaXJlY3RvcnkgaXRlbSAqLworCXJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgcGF0aCwgJmtleSwgaWgsIGlub2RlLCBib2R5KTsKIH0KIAotCiAvKiBzdGF0IGRhdGEgb2Ygb2JqZWN0IGhhcyBiZWVuIGluc2VydGVkLCB0aGlzIGluc2VydHMgdGhlIGl0ZW0KICAgIGNvbnRhaW5pbmcgdGhlIGJvZHkgb2Ygc3ltbGluayAqLwotc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBJbm9kZSBvZiBzeW1saW5rICovCi0JCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwKLQkJCQkgc3RydWN0IHBhdGggKiBwYXRoLCBjb25zdCBjaGFyICogc3ltbmFtZSwgaW50IGl0ZW1fbGVuKQorc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgb2Ygc3ltbGluayAqLworCQkJCXN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQkJCXN0cnVjdCBwYXRoICpwYXRoLCBjb25zdCBjaGFyICpzeW1uYW1lLAorCQkJCWludCBpdGVtX2xlbikKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IHRoLT50X3N1cGVyOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIF9tYWtlX2NwdV9rZXkgKCZrZXksIEtFWV9GT1JNQVRfM181LCAKLQkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLCAKLQkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19vYmplY3RpZCksCi0JCSAgIDEsIFRZUEVfRElSRUNULCAzLyprZXkgbGVuZ3RoKi8pOworCV9tYWtlX2NwdV9rZXkoJmtleSwgS0VZX0ZPUk1BVF8zXzUsCisJCSAgICAgIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLAorCQkgICAgICAxLCBUWVBFX0RJUkVDVCwgMyAvKmtleSBsZW5ndGggKi8gKTsKIAotICAgIG1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIDEsIFRZUEVfRElSRUNULCBpdGVtX2xlbiwgMC8qZnJlZV9zcGFjZSovKTsKKwltYWtlX2xlX2l0ZW1faGVhZChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIDEsIFRZUEVfRElSRUNULCBpdGVtX2xlbiwKKwkJCSAgMCAvKmZyZWVfc3BhY2UgKi8gKTsKIAotICAgIC8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLwotICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgcGF0aCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5pazogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IHN5bWxpbmsiKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7Ci0JcGF0aHJlbHNlIChwYXRoKTsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfc3ltbGluazogIgotCQkJICAib2JqZWN0IHdpdGggdGhpcyBrZXkgZXhpc3RzICglaykiLCAmKGloLT5paF9rZXkpKTsKLQlyZXR1cm4gLUVFWElTVDsKLSAgICB9CisJLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsICZrZXksIHBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfc3ltbGluaWs6ICIKKwkJCQkgImkvbyBmYWlsdXJlIG9jY3VycmVkIGNyZWF0aW5nIG5ldyBzeW1saW5rIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKHBhdGgpOworCQlyZWlzZXJmc193YXJuaW5nKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5rOiAiCisJCQkJICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsCisJCQkJICYoaWgtPmloX2tleSkpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CiAKLSAgICAvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBib2R5IG9mIHN5bWxpbmsgKi8KLSAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIHN5bW5hbWUpOworCS8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGJvZHkgb2Ygc3ltbGluayAqLworCXJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgcGF0aCwgJmtleSwgaWgsIGlub2RlLCBzeW1uYW1lKTsKIH0KIAotCiAvKiBpbnNlcnRzIHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSwgYW5kIHRoZW4gY2FsbHMKICAgIHJlaXNlcmZzX25ld19kaXJlY3RvcnkgKHRvIGluc2VydCAiLiIsICIuLiIgaXRlbSBpZiBuZXcgb2JqZWN0IGlzCiAgICBkaXJlY3RvcnkpIG9yIHJlaXNlcmZzX25ld19zeW1saW5rICh0byBpbnNlcnQgc3ltbGluayBib2R5IGlmIG5ldwpAQCAtMTY3OCwyMTMgKzE3NjksMjE5IEBACiAgICBub24temVybyBkdWUgdG8gYW4gZXJyb3IsIHdlIGhhdmUgdG8gZHJvcCB0aGUgcXVvdGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKICAgIGZvciB0aGUgZnJlc2ggaW5vZGUuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uLCBzbwogICAgaWYgd2UgcmV0dXJuIG5vbi16ZXJvLCB3ZSBhbHNvIGVuZCB0aGUgdHJhbnNhY3Rpb24uICAqLwotaW50IHJlaXNlcmZzX25ld19pbm9kZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQlzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlLCAKLQkJCWNvbnN0IGNoYXIgKiBzeW1uYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgZm9yIHJlZ3VsYXIsIEVNVFJZX0RJUl9TSVpFIGZvciBkaXJzLCAKLQkJCSAgIHN0cmxlbiAoc3ltbmFtZSkgZm9yIHN5bWxpbmtzKSovCi0JCSAgICAgICAgIGxvZmZfdCBpX3NpemUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgCi0JCQkgc3RydWN0IGlub2RlICppbm9kZSkKK2ludCByZWlzZXJmc19uZXdfaW5vZGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUsIGNvbnN0IGNoYXIgKnN5bW5hbWUsCisJCSAgICAgICAvKiAwIGZvciByZWd1bGFyLCBFTVRSWV9ESVJfU0laRSBmb3IgZGlycywgCisJCSAgICAgICAgICBzdHJsZW4gKHN5bW5hbWUpIGZvciBzeW1saW5rcykgKi8KKwkJICAgICAgIGxvZmZfdCBpX3NpemUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2tleSk7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaWg7Ci0gICAgc3RydWN0IHN0YXRfZGF0YSBzZDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBlcnI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19rZXkpOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgaXRlbV9oZWFkIGloOworCXN0cnVjdCBzdGF0X2RhdGEgc2Q7CisJaW50IHJldHZhbDsKKwlpbnQgZXJyOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAKLSAgICBpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7Ci0JZXJyID0gLUVEUVVPVDsKLQlnb3RvIG91dF9lbmRfdHJhbnM7Ci0gICAgfQotICAgIGlmICghZGlyIHx8ICFkaXItPmlfbmxpbmspIHsKLQllcnIgPSAtRVBFUk07Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIHNiID0gZGlyLT5pX3NiOwotCi0gICAgLyogaXRlbSBoZWFkIG9mIG5ldyBpdGVtICovCi0gICAgaWguaWhfa2V5LmtfZGlyX2lkID0gcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoZGlyKTsKLSAgICBpaC5paF9rZXkua19vYmplY3RpZCA9IGNwdV90b19sZTMyIChyZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkICh0aCkpOwotICAgIGlmICghaWguaWhfa2V5Lmtfb2JqZWN0aWQpIHsKLQllcnIgPSAtRU5PTUVNOwotCWdvdG8gb3V0X2JhZF9pbm9kZSA7Ci0gICAgfQotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKLQkvKiBub3QgYSBwZXJmZWN0IGdlbmVyYXRpb24gY291bnQsIGFzIG9iamVjdCBpZHMgY2FuIGJlIHJldXNlZCwgYnV0IAotCSoqIHRoaXMgaXMgYXMgZ29vZCBhcyByZWlzZXJmcyBjYW4gZG8gcmlnaHQgbm93LgotCSoqIG5vdGUgdGhhdCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIGlub2RlIGlzbid0IGZpbGxlZCBpbiB5ZXQsIHdlIGhhdmUKLQkqKiB0byB1c2UgdGhlIGRpcmVjdG9yeS4KLQkqLwotCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoZGlyKS0+a19vYmplY3RpZCk7Ci0gICAgZWxzZQotI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQotCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShSRUlTRVJGU19TQihzYiktPnNfcnMtPnNfaW5vZGVfZ2VuZXJhdGlvbik7Ci0jZWxzZQotCWlub2RlLT5pX2dlbmVyYXRpb24gPSArK2V2ZW50OwotI2VuZGlmCi0KLSAgICAvKiBmaWxsIHN0YXQgZGF0YSAqLwotICAgIGlub2RlLT5pX25saW5rID0gKFNfSVNESVIgKG1vZGUpID8gMiA6IDEpOwotCi0gICAgLyogdWlkIGFuZCBnaWQgbXVzdCBhbHJlYWR5IGJlIHNldCBieSB0aGUgY2FsbGVyIGZvciBxdW90YSBpbml0ICovCi0KLSAgICAvKiBzeW1saW5rIGNhbm5vdCBiZSBpbW11dGFibGUgb3IgYXBwZW5kIG9ubHksIHJpZ2h0PyAqLwotICAgIGlmKCBTX0lTTE5LKCBpbm9kZSAtPiBpX21vZGUgKSApCi0JICAgIGlub2RlIC0+IGlfZmxhZ3MgJj0gfiAoIFNfSU1NVVRBQkxFIHwgU19BUFBFTkQgKTsKLQotICAgIGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9Ci0JICAgIENVUlJFTlRfVElNRV9TRUM7Ci0gICAgaW5vZGUtPmlfc2l6ZSA9IGlfc2l6ZTsKLSAgICBpbm9kZS0+aV9ibG9ja3MgPSAwOwotICAgIGlub2RlLT5pX2J5dGVzID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFNfSVNMTksobW9kZSkgPyAxIDogCi0gICAgICBVMzJfTUFYLypOT19CWVRFU19JTl9ESVJFQ1RfSVRFTSovOwotCi0gICAgSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0ICkpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IE5VTEw7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPQotCVJFSVNFUkZTX0koZGlyKS0+aV9hdHRycyAmIFJFSVNFUkZTX0lOSEVSSVRfTUFTSzsKLSAgICBzZF9hdHRyc190b19pX2F0dHJzKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2F0dHJzLCBpbm9kZSApOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKLSAgICBpbml0X3J3c2VtICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7Ci0KLSAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpCi0JbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIFNEX1YxX1NJWkUsIE1BWF9VU19JTlQpOwotICAgIGVsc2UKLQltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCBOVUxMLCBLRVlfRk9STUFUXzNfNiwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7Ci0KLSAgICAvKiBrZXkgdG8gc2VhcmNoIGZvciBjb3JyZWN0IHBsYWNlIGZvciBuZXcgc3RhdCBkYXRhICovCi0gICAgX21ha2VfY3B1X2tleSAoJmtleSwgS0VZX0ZPUk1BVF8zXzYsIGxlMzJfdG9fY3B1IChpaC5paF9rZXkua19kaXJfaWQpLAotCQkgICBsZTMyX3RvX2NwdSAoaWguaWhfa2V5Lmtfb2JqZWN0aWQpLCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCAzLyprZXkgbGVuZ3RoKi8pOwotCi0gICAgLyogZmluZCBwcm9wZXIgcGxhY2UgZm9yIGluc2VydGluZyBvZiBzdGF0IGRhdGEgKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsICZrZXksICZwYXRoX3RvX2tleSk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCWVyciA9IC1FSU87Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQlwYXRocmVsc2UgKCZwYXRoX3RvX2tleSk7Ci0JZXJyID0gLUVFWElTVDsKLQlnb3RvIG91dF9iYWRfaW5vZGU7Ci0gICAgfQotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkgewotCWlmIChpbm9kZS0+aV91aWQgJiB+MHhmZmZmIHx8IGlub2RlLT5pX2dpZCAmIH4weGZmZmYpIHsKLQkgICAgcGF0aHJlbHNlICgmcGF0aF90b19rZXkpOwotCSAgICAvKiBpX3VpZCBvciBpX2dpZCBpcyB0b28gYmlnIHRvIGJlIHN0b3JlZCBpbiBzdGF0IGRhdGEgdjMuNSAqLwotCSAgICBlcnIgPSAtRUlOVkFMOwotCSAgICBnb3RvIG91dF9iYWRfaW5vZGU7CisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQllcnIgPSAtRURRVU9UOworCQlnb3RvIG91dF9lbmRfdHJhbnM7CiAJfQotCWlub2RlMnNkX3YxICgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKLSAgICB9IGVsc2UgewotCWlub2RlMnNkICgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKLSAgICB9Ci0gICAgLy8gdGhlc2UgZG8gbm90IGdvIHRvIG9uLWRpc2sgc3RhdCBkYXRhCi0gICAgaW5vZGUtPmlfaW5vID0gbGUzMl90b19jcHUgKGloLmloX2tleS5rX29iamVjdGlkKTsKLSAgICBpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOwotICAKLSAgICAvLyBzdG9yZSBpbiBpbi1jb3JlIGlub2RlIHRoZSBrZXkgb2Ygc3RhdCBkYXRhIGFuZCB2ZXJzaW9uIGFsbAotICAgIC8vIG9iamVjdCBpdGVtcyB3aWxsIGhhdmUgKGRpcmVjdG9yeSBpdGVtcyB3aWxsIGhhdmUgb2xkIG9mZnNldAotICAgIC8vIGZvcm1hdCwgb3RoZXIgbmV3IG9iamVjdHMgd2lsbCBjb25zaXN0IG9mIG5ldyBpdGVtcykKLSAgICBtZW1jcHkgKElOT0RFX1BLRVkgKGlub2RlKSwgJihpaC5paF9rZXkpLCBLRVlfU0laRSk7Ci0gICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkKLSAgICAgICAgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM182KTsKLSAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpCi0Jc2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlLCBTVEFUX0RBVEFfVjEpOwotICAgIGVsc2UKLQlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMik7Ci0gICAgCi0gICAgLyogaW5zZXJ0IHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSAqLwotI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBpZiAoUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSkKLQl0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDE7CisJaWYgKCFkaXIgfHwgIWRpci0+aV9ubGluaykgeworCQllcnIgPSAtRVBFUk07CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisKKwlzYiA9IGRpci0+aV9zYjsKKworCS8qIGl0ZW0gaGVhZCBvZiBuZXcgaXRlbSAqLworCWloLmloX2tleS5rX2Rpcl9pZCA9IHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKGRpcik7CisJaWguaWhfa2V5Lmtfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMihyZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHRoKSk7CisJaWYgKCFpaC5paF9rZXkua19vYmplY3RpZCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJfQorCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQkvKiBub3QgYSBwZXJmZWN0IGdlbmVyYXRpb24gY291bnQsIGFzIG9iamVjdCBpZHMgY2FuIGJlIHJldXNlZCwgYnV0IAorCQkgKiogdGhpcyBpcyBhcyBnb29kIGFzIHJlaXNlcmZzIGNhbiBkbyByaWdodCBub3cuCisJCSAqKiBub3RlIHRoYXQgdGhlIHByaXZhdGUgcGFydCBvZiBpbm9kZSBpc24ndCBmaWxsZWQgaW4geWV0LCB3ZSBoYXZlCisJCSAqKiB0byB1c2UgdGhlIGRpcmVjdG9yeS4KKwkJICovCisJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQpOworCWVsc2UKKyNpZiBkZWZpbmVkKCBVU0VfSU5PREVfR0VORVJBVElPTl9DT1VOVEVSICkKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9CisJCSAgICBsZTMyX3RvX2NwdShSRUlTRVJGU19TQihzYiktPnNfcnMtPnNfaW5vZGVfZ2VuZXJhdGlvbik7CisjZWxzZQorCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gKytldmVudDsKICNlbmRpZgotICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGhfdG9fa2V5LCAma2V5LCAmaWgsIGlub2RlLCAoY2hhciAqKSgmc2QpKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JZXJyID0gcmV0dmFsOwotCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KIAorCS8qIGZpbGwgc3RhdCBkYXRhICovCisJaW5vZGUtPmlfbmxpbmsgPSAoU19JU0RJUihtb2RlKSA/IDIgOiAxKTsKKworCS8qIHVpZCBhbmQgZ2lkIG11c3QgYWxyZWFkeSBiZSBzZXQgYnkgdGhlIGNhbGxlciBmb3IgcXVvdGEgaW5pdCAqLworCisJLyogc3ltbGluayBjYW5ub3QgYmUgaW1tdXRhYmxlIG9yIGFwcGVuZCBvbmx5LCByaWdodD8gKi8KKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX0lNTVVUQUJMRSB8IFNfQVBQRU5EKTsKKworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfc2l6ZSA9IGlfc2l6ZTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2J5dGVzID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFNfSVNMTksobW9kZSkgPyAxIDoKKwkgICAgVTMyX01BWCAvKk5PX0JZVEVTX0lOX0RJUkVDVF9JVEVNICovIDsKKworCUlOSVRfTElTVF9IRUFEKCYoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCkpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IE5VTEw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPQorCSAgICBSRUlTRVJGU19JKGRpciktPmlfYXR0cnMgJiBSRUlTRVJGU19JTkhFUklUX01BU0s7CisJc2RfYXR0cnNfdG9faV9hdHRycyhSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycywgaW5vZGUpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKwlpbml0X3J3c2VtKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7CisJZWxzZQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7CisKKwkvKiBrZXkgdG8gc2VhcmNoIGZvciBjb3JyZWN0IHBsYWNlIGZvciBuZXcgc3RhdCBkYXRhICovCisJX21ha2VfY3B1X2tleSgma2V5LCBLRVlfRk9STUFUXzNfNiwgbGUzMl90b19jcHUoaWguaWhfa2V5LmtfZGlyX2lkKSwKKwkJICAgICAgbGUzMl90b19jcHUoaWguaWhfa2V5Lmtfb2JqZWN0aWQpLCBTRF9PRkZTRVQsCisJCSAgICAgIFRZUEVfU1RBVF9EQVRBLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCisJLyogZmluZCBwcm9wZXIgcGxhY2UgZm9yIGluc2VydGluZyBvZiBzdGF0IGRhdGEgKi8KKwlyZXR2YWwgPSBzZWFyY2hfaXRlbShzYiwgJmtleSwgJnBhdGhfdG9fa2V5KTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisJaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJCXBhdGhyZWxzZSgmcGF0aF90b19rZXkpOworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJfQorCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKSB7CisJCWlmIChpbm9kZS0+aV91aWQgJiB+MHhmZmZmIHx8IGlub2RlLT5pX2dpZCAmIH4weGZmZmYpIHsKKwkJCXBhdGhyZWxzZSgmcGF0aF90b19rZXkpOworCQkJLyogaV91aWQgb3IgaV9naWQgaXMgdG9vIGJpZyB0byBiZSBzdG9yZWQgaW4gc3RhdCBkYXRhIHYzLjUgKi8KKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJCX0KKwkJaW5vZGUyc2RfdjEoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJfSBlbHNlIHsKKwkJaW5vZGUyc2QoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJfQorCS8vIHRoZXNlIGRvIG5vdCBnbyB0byBvbi1kaXNrIHN0YXQgZGF0YQorCWlub2RlLT5pX2lubyA9IGxlMzJfdG9fY3B1KGloLmloX2tleS5rX29iamVjdGlkKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOworCisJLy8gc3RvcmUgaW4gaW4tY29yZSBpbm9kZSB0aGUga2V5IG9mIHN0YXQgZGF0YSBhbmQgdmVyc2lvbiBhbGwKKwkvLyBvYmplY3QgaXRlbXMgd2lsbCBoYXZlIChkaXJlY3RvcnkgaXRlbXMgd2lsbCBoYXZlIG9sZCBvZmZzZXQKKwkvLyBmb3JtYXQsIG90aGVyIG5ldyBvYmplY3RzIHdpbGwgY29uc2lzdCBvZiBuZXcgaXRlbXMpCisJbWVtY3B5KElOT0RFX1BLRVkoaW5vZGUpLCAmKGloLmloX2tleSksIEtFWV9TSVpFKTsKKwlpZiAob2xkX2Zvcm1hdF9vbmx5KHNiKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpCisJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJZWxzZQorCQlzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQlzZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSwgU1RBVF9EQVRBX1YxKTsKKwllbHNlCisJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjIpOworCisJLyogaW5zZXJ0IHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSAqLwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBpZiAoIXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKQotCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAwOworCWlmIChSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5KQorCQl0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDE7CiAjZW5kaWYKLSAgICBpZiAoU19JU0RJUihtb2RlKSkgewotCS8qIGluc2VydCBpdGVtIHdpdGggIi4iIGFuZCAiLi4iICovCi0JcmV0dmFsID0gcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAodGgsIGlub2RlLCAmaWgsICZwYXRoX3RvX2tleSwgZGlyKTsKLSAgICB9CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoX3RvX2tleSwgJmtleSwgJmloLCBpbm9kZSwKKwkJCQkgKGNoYXIgKikoJnNkKSk7CisJaWYgKHJldHZhbCkgeworCQllcnIgPSByZXR2YWw7CisJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKKwkJZ290byBvdXRfYmFkX2lub2RlOworCX0KKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisJaWYgKCF0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcykKKwkJUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSA9IDA7CisjZW5kaWYKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQkvKiBpbnNlcnQgaXRlbSB3aXRoICIuIiBhbmQgIi4uIiAqLworCQlyZXR2YWwgPQorCQkgICAgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBkaXIpOworCX0KIAotICAgIGlmIChTX0lTTE5LKG1vZGUpKSB7Ci0JLyogaW5zZXJ0IGJvZHkgb2Ygc3ltbGluayAqLwotCWlmICghb2xkX2Zvcm1hdF9vbmx5IChzYikpCi0JICAgIGlfc2l6ZSA9IFJPVU5EX1VQKGlfc2l6ZSk7Ci0JcmV0dmFsID0gcmVpc2VyZnNfbmV3X3N5bWxpbmsgKHRoLCBpbm9kZSwgJmloLCAmcGF0aF90b19rZXksIHN5bW5hbWUsIGlfc2l6ZSk7Ci0gICAgfQotICAgIGlmIChyZXR2YWwpIHsKLQllcnIgPSByZXR2YWw7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKLQlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOwotCWdvdG8gb3V0X2luc2VydGVkX3NkOwotICAgIH0KKwlpZiAoU19JU0xOSyhtb2RlKSkgeworCQkvKiBpbnNlcnQgYm9keSBvZiBzeW1saW5rICovCisJCWlmICghb2xkX2Zvcm1hdF9vbmx5KHNiKSkKKwkJCWlfc2l6ZSA9IFJPVU5EX1VQKGlfc2l6ZSk7CisJCXJldHZhbCA9CisJCSAgICByZWlzZXJmc19uZXdfc3ltbGluayh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBzeW1uYW1lLAorCQkJCQkgaV9zaXplKTsKKwl9CisJaWYgKHJldHZhbCkgeworCQllcnIgPSByZXR2YWw7CisJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKKwkJam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKwkJZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisJfQogCi0gICAgLyogWFhYIENIRUNLIFRISVMgKi8KLSAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSkgewotICAgICAgICByZXR2YWwgPSByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChkaXIsIGRlbnRyeSwgaW5vZGUpOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICBlcnIgPSByZXR2YWw7Ci0gICAgICAgICAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOwotICAgICAgICAgICAgam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKLSAgICAgICAgICAgIGdvdG8gb3V0X2luc2VydGVkX3NkOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1BPU0lYQUNMKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJBQ0xzIGFyZW4ndCBlbmFibGVkIGluIHRoZSBmcywgIgotCQkJICAiYnV0IHZmcyB0aGlua3MgdGhleSBhcmUhIik7Ci0gICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgewotCXJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoaW5vZGUpOwotICAgIH0KKwkvKiBYWFggQ0hFQ0sgVEhJUyAqLworCWlmIChyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpIHsKKwkJcmV0dmFsID0gcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChkaXIsIGRlbnRyeSwgaW5vZGUpOworCQlpZiAocmV0dmFsKSB7CisJCQllcnIgPSByZXR2YWw7CisJCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSk7CisJCQlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCQkJZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisJCX0KKwl9IGVsc2UgaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUE9TSVhBQ0wpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgIkFDTHMgYXJlbid0IGVuYWJsZWQgaW4gdGhlIGZzLCAiCisJCQkJICJidXQgdmZzIHRoaW5rcyB0aGV5IGFyZSEiKTsKKwl9IGVsc2UgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGRpcikpIHsKKwkJcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlKGlub2RlKTsKKwl9CiAKLSAgICBpbnNlcnRfaW5vZGVfaGFzaCAoaW5vZGUpOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogCiAvKiBpdCBsb29rcyBsaWtlIHlvdSBjYW4gZWFzaWx5IGNvbXByZXNzIHRoZXNlIHR3byBnb3RvIHRhcmdldHMgaW50bwogICogb25lLiAgS2VlcGluZyBpdCBsaWtlIHRoaXMgZG9lc24ndCBhY3R1YWxseSBodXJ0IGFueXRoaW5nLCBhbmQgdGhleQogICogYXJlIHBsYWNlIGhvbGRlcnMgZm9yIHdoYXQgdGhlIHF1b3RhIGNvZGUgYWN0dWFsbHkgbmVlZHMuCiAgKi8KLW91dF9iYWRfaW5vZGU6Ci0gICAgLyogSW52YWxpZGF0ZSB0aGUgb2JqZWN0LCBub3RoaW5nIHdhcyBpbnNlcnRlZCB5ZXQgKi8KLSAgICBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCA9IDA7CisgICAgICBvdXRfYmFkX2lub2RlOgorCS8qIEludmFsaWRhdGUgdGhlIG9iamVjdCwgbm90aGluZyB3YXMgaW5zZXJ0ZWQgeWV0ICovCisJSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQgPSAwOwogCi0gICAgLyogUXVvdGEgY2hhbmdlIG11c3QgYmUgaW5zaWRlIGEgdHJhbnNhY3Rpb24gZm9yIGpvdXJuYWxpbmcgKi8KLSAgICBEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwkvKiBRdW90YSBjaGFuZ2UgbXVzdCBiZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGluZyAqLworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOwogCi1vdXRfZW5kX3RyYW5zOgotICAgIGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkgOwotICAgIC8qIERyb3AgY2FuIGJlIG91dHNpZGUgYW5kIGl0IG5lZWRzIG1vcmUgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IG91dHNpZGUgKi8KLSAgICBEUVVPVF9EUk9QKGlub2RlKTsKLSAgICBpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0gICAgbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworICAgICAgb3V0X2VuZF90cmFuczoKKwlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCS8qIERyb3AgY2FuIGJlIG91dHNpZGUgYW5kIGl0IG5lZWRzIG1vcmUgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IG91dHNpZGUgKi8KKwlEUVVPVF9EUk9QKGlub2RlKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCi1vdXRfaW5zZXJ0ZWRfc2Q6Ci0gICAgaW5vZGUtPmlfbmxpbmsgPSAwOwotICAgIHRoLT50X3RyYW5zX2lkID0gMDsgLyogc28gdGhlIGNhbGxlciBjYW4ndCB1c2UgdGhpcyBoYW5kbGUgbGF0ZXIgKi8KLSAgICBpcHV0KGlub2RlKTsKLSAgICByZXR1cm4gZXJyOworICAgICAgb3V0X2luc2VydGVkX3NkOgorCWlub2RlLT5pX25saW5rID0gMDsKKwl0aC0+dF90cmFuc19pZCA9IDA7CS8qIHNvIHRoZSBjYWxsZXIgY2FuJ3QgdXNlIHRoaXMgaGFuZGxlIGxhdGVyICovCisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTE5MDAsNzcgKzE5OTcsNzggQEAKICoqCiAqKiBvbiBmYWlsdXJlLCBub256ZXJvIGlzIHJldHVybmVkLCBwYWdlX3Jlc3VsdCBhbmQgYmhfcmVzdWx0IGFyZSB1bnRvdWNoZWQuCiAqLwotc3RhdGljIGludCBncmFiX3RhaWxfcGFnZShzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgCi0JCQkgIHN0cnVjdCBwYWdlICoqcGFnZV9yZXN1bHQsIAotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaF9yZXN1bHQpIHsKK3N0YXRpYyBpbnQgZ3JhYl90YWlsX3BhZ2Uoc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCisJCQkgIHN0cnVjdCBwYWdlICoqcGFnZV9yZXN1bHQsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoX3Jlc3VsdCkKK3sKIAotICAgIC8qIHdlIHdhbnQgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFzdCBieXRlIGluIHRoZSBmaWxlLAotICAgICoqIG5vdCB0aGUgcGFnZSB0aGF0IHdpbGwgaG9sZCB0aGUgbmV4dCBieXRlIGZvciBhcHBlbmRpbmcKLSAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSAocF9zX2lub2RlLT5pX3NpemUtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgdW5zaWduZWQgbG9uZyBwb3MgPSAwIDsKLSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gMCA7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IChwX3NfaW5vZGUtPmlfc2l6ZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA7Ci0gICAgc3RydWN0IHBhZ2UgKiBwYWdlIDsKLSAgICBpbnQgZXJyb3IgOwotICAgIAotICAgIC8qIHdlIGtub3cgdGhhdCB3ZSBhcmUgb25seSBjYWxsZWQgd2l0aCBpbm9kZS0+aV9zaXplID4gMC4KLSAgICAqKiB3ZSBhbHNvIGtub3cgdGhhdCBhIGZpbGUgdGFpbCBjYW4gbmV2ZXIgYmUgYXMgYmlnIGFzIGEgYmxvY2sKLSAgICAqKiBJZiBpX3NpemUgJSBibG9ja3NpemUgPT0gMCwgb3VyIGZpbGUgaXMgY3VycmVudGx5IGJsb2NrIGFsaWduZWQKLSAgICAqKiBhbmQgaXQgd29uJ3QgbmVlZCBjb252ZXJ0aW5nIG9yIHplcm9pbmcgYWZ0ZXIgYSB0cnVuY2F0ZS4KLSAgICAqLwotICAgIGlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UIDsKLSAgICB9Ci0gICAgcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShwX3NfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpIDsKLSAgICBlcnJvciA9IC1FTk9NRU0gOwotICAgIGlmICghcGFnZSkgewotICAgICAgICBnb3RvIG91dCA7Ci0gICAgfQotICAgIC8qIHN0YXJ0IHdpdGhpbiB0aGUgcGFnZSBvZiB0aGUgbGFzdCBibG9jayBpbiB0aGUgZmlsZSAqLwotICAgIHN0YXJ0ID0gKG9mZnNldCAvIGJsb2Nrc2l6ZSkgKiBibG9ja3NpemUgOworCS8qIHdlIHdhbnQgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFzdCBieXRlIGluIHRoZSBmaWxlLAorCSAqKiBub3QgdGhlIHBhZ2UgdGhhdCB3aWxsIGhvbGQgdGhlIG5leHQgYnl0ZSBmb3IgYXBwZW5kaW5nCisJICovCisJdW5zaWduZWQgbG9uZyBpbmRleCA9IChwX3NfaW5vZGUtPmlfc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gcF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IChwX3NfaW5vZGUtPmlfc2l6ZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGVycm9yOwogCi0gICAgZXJyb3IgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIHN0YXJ0LCBvZmZzZXQsIAotCQkJCXJlaXNlcmZzX2dldF9ibG9ja19jcmVhdGVfMCkgOwotICAgIGlmIChlcnJvcikKLQlnb3RvIHVubG9jayA7Ci0KLSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsgICAgICAKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCWlmIChwb3MgPj0gc3RhcnQpIHsKLQkgICAgYnJlYWsgOworCS8qIHdlIGtub3cgdGhhdCB3ZSBhcmUgb25seSBjYWxsZWQgd2l0aCBpbm9kZS0+aV9zaXplID4gMC4KKwkgKiogd2UgYWxzbyBrbm93IHRoYXQgYSBmaWxlIHRhaWwgY2FuIG5ldmVyIGJlIGFzIGJpZyBhcyBhIGJsb2NrCisJICoqIElmIGlfc2l6ZSAlIGJsb2Nrc2l6ZSA9PSAwLCBvdXIgZmlsZSBpcyBjdXJyZW50bHkgYmxvY2sgYWxpZ25lZAorCSAqKiBhbmQgaXQgd29uJ3QgbmVlZCBjb252ZXJ0aW5nIG9yIHplcm9pbmcgYWZ0ZXIgYSB0cnVuY2F0ZS4KKwkgKi8KKwlpZiAoKG9mZnNldCAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JYmggPSBiaC0+Yl90aGlzX3BhZ2UgOwotCXBvcyArPSBibG9ja3NpemUgOwotICAgIH0gd2hpbGUoYmggIT0gaGVhZCkgOworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UocF9zX2lub2RlLT5pX21hcHBpbmcsIGluZGV4KTsKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKCFwYWdlKSB7CisJCWdvdG8gb3V0OworCX0KKwkvKiBzdGFydCB3aXRoaW4gdGhlIHBhZ2Ugb2YgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUgKi8KKwlzdGFydCA9IChvZmZzZXQgLyBibG9ja3NpemUpICogYmxvY2tzaXplOwogCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JLyogbm90ZSwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBwcmVwYXJlX3dyaXRlIHNob3VsZAotCSoqIGJlIHRha2luZyBjYXJlIG9mIHRoaXMgZm9yIHVzLiAgSWYgdGhlIGJ1ZmZlciBpc24ndCB1cCB0byBkYXRlLAotCSoqIEkndmUgc2NyZXdlZCB1cCB0aGUgY29kZSB0byBmaW5kIHRoZSBidWZmZXIsIG9yIHRoZSBjb2RlIHRvCi0JKiogY2FsbCBwcmVwYXJlX3dyaXRlCi0JKi8KLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCi0JCQkgICJjbG0tNjAwMDogZXJyb3IgcmVhZGluZyBibG9jayAlbHUgb24gZGV2ICVzIiwKLQkJCSAgYmgtPmJfYmxvY2tuciwKLQkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKHBfc19pbm9kZS0+aV9zYikpIDsKLQllcnJvciA9IC1FSU8gOwotCWdvdG8gdW5sb2NrIDsKLSAgICB9Ci0gICAgKmJoX3Jlc3VsdCA9IGJoIDsKLSAgICAqcGFnZV9yZXN1bHQgPSBwYWdlIDsKKwllcnJvciA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgc3RhcnQsIG9mZnNldCwKKwkJCQkgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gdW5sb2NrOwogCi1vdXQ6Ci0gICAgcmV0dXJuIGVycm9yIDsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCWlmIChwb3MgPj0gc3RhcnQpIHsKKwkJCWJyZWFrOworCQl9CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOwogCi11bmxvY2s6Ci0gICAgdW5sb2NrX3BhZ2UocGFnZSkgOwotICAgIHBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7Ci0gICAgcmV0dXJuIGVycm9yIDsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyogbm90ZSwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBwcmVwYXJlX3dyaXRlIHNob3VsZAorCQkgKiogYmUgdGFraW5nIGNhcmUgb2YgdGhpcyBmb3IgdXMuICBJZiB0aGUgYnVmZmVyIGlzbid0IHVwIHRvIGRhdGUsCisJCSAqKiBJJ3ZlIHNjcmV3ZWQgdXAgdGhlIGNvZGUgdG8gZmluZCB0aGUgYnVmZmVyLCBvciB0aGUgY29kZSB0bworCQkgKiogY2FsbCBwcmVwYXJlX3dyaXRlCisJCSAqLworCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkgImNsbS02MDAwOiBlcnJvciByZWFkaW5nIGJsb2NrICVsdSBvbiBkZXYgJXMiLAorCQkJCSBiaC0+Yl9ibG9ja25yLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShwX3NfaW5vZGUtPmlfc2IpKTsKKwkJZXJyb3IgPSAtRUlPOworCQlnb3RvIHVubG9jazsKKwl9CisJKmJoX3Jlc3VsdCA9IGJoOworCSpwYWdlX3Jlc3VsdCA9IHBhZ2U7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gZXJyb3I7CisKKyAgICAgIHVubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMTk3OSwyMzUgKzIwNzcsMjQ3IEBACiAqKgogKiogc29tZSBjb2RlIHRha2VuIGZyb20gYmxvY2tfdHJ1bmNhdGVfcGFnZQogKi8KLWludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICAvKiB3ZSB3YW50IHRoZSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBfc19pbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLSAgICB1bnNpZ25lZCBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICB1bnNpZ25lZCBsZW5ndGggOwotICAgIHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCA7Ci0gICAgaW50IGVycm9yIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTCA7CitpbnQgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgaW50IHVwZGF0ZV90aW1lc3RhbXBzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogd2Ugd2FudCB0aGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwX3NfaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGxlbmd0aDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJaW50IGVycm9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2socF9zX2lub2RlLT5pX3NiKTsKIAotICAgIGlmIChwX3NfaW5vZGUtPmlfc2l6ZSA+IDApIHsKLSAgICAgICAgaWYgKChlcnJvciA9IGdyYWJfdGFpbF9wYWdlKHBfc19pbm9kZSwgJnBhZ2UsICZiaCkpKSB7Ci0JICAgIC8vIC1FTk9FTlQgbWVhbnMgd2UgdHJ1bmNhdGVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwgCi0JICAgIC8vIGFuZCBnZXRfYmxvY2tfY3JlYXRlXzAgY291bGQgbm90IGZpbmQgYSBibG9jayB0byByZWFkIGluLAotCSAgICAvLyB3aGljaCBpcyBvay4KLQkgICAgaWYgKGVycm9yICE9IC1FTk9FTlQpCi0JICAgICAgICByZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCi0JCQkJICAiY2xtLTYwMDE6IGdyYWJfdGFpbF9wYWdlIGZhaWxlZCAlZCIsCi0JCQkJICBlcnJvcik7Ci0JICAgIHBhZ2UgPSBOVUxMIDsKLQkgICAgYmggPSBOVUxMIDsKKwlpZiAocF9zX2lub2RlLT5pX3NpemUgPiAwKSB7CisJCWlmICgoZXJyb3IgPSBncmFiX3RhaWxfcGFnZShwX3NfaW5vZGUsICZwYWdlLCAmYmgpKSkgeworCQkJLy8gLUVOT0VOVCBtZWFucyB3ZSB0cnVuY2F0ZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCAKKwkJCS8vIGFuZCBnZXRfYmxvY2tfY3JlYXRlXzAgY291bGQgbm90IGZpbmQgYSBibG9jayB0byByZWFkIGluLAorCQkJLy8gd2hpY2ggaXMgb2suCisJCQlpZiAoZXJyb3IgIT0gLUVOT0VOVCkKKwkJCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkJCSAiY2xtLTYwMDE6IGdyYWJfdGFpbF9wYWdlIGZhaWxlZCAlZCIsCisJCQkJCQkgZXJyb3IpOworCQkJcGFnZSA9IE5VTEw7CisJCQliaCA9IE5VTEw7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogc28sIGlmIHBhZ2UgIT0gTlVMTCwgd2UgaGF2ZSBhIGJ1ZmZlciBoZWFkIGZvciB0aGUgb2Zmc2V0IGF0IAotICAgICoqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIGlmIHRoZSBiaCBpcyBtYXBwZWQsIGFuZCBiaC0+Yl9ibG9ja25yICE9IDAsIAotICAgICoqIHRoZW4gd2UgaGF2ZSBhbiB1bmZvcm1hdHRlZCBub2RlLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgZGlyZWN0IGl0ZW0sIAotICAgICoqIGFuZCBubyB6ZXJvaW5nIGlzIHJlcXVpcmVkIG9uIGRpc2suICBXZSB6ZXJvIGFmdGVyIHRoZSB0cnVuY2F0ZSwgCi0gICAgKiogYmVjYXVzZSB0aGUgdHJ1bmNhdGUgbWlnaHQgcGFjayB0aGUgaXRlbSBhbnl3YXkgCi0gICAgKiogKGl0IHdpbGwgdW5tYXAgYmggaWYgaXQgcGFja3MpLgotICAgICovCi0gICAgLyogaXQgaXMgZW5vdWdoIHRvIHJlc2VydmUgc3BhY2UgaW4gdHJhbnNhY3Rpb24gZm9yIDIgYmFsYW5jaW5nczoKLSAgICAgICBvbmUgZm9yICJzYXZlIiBsaW5rIGFkZGluZyBhbmQgYW5vdGhlciBmb3IgdGhlIGZpcnN0Ci0gICAgICAgY3V0X2Zyb21faXRlbS4gMSBpcyBmb3IgdXBkYXRlX3NkICovCi0gICAgZXJyb3IgPSBqb3VybmFsX2JlZ2luICgmdGgsIHBfc19pbm9kZS0+aV9zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDEpOwotICAgIGlmIChlcnJvcikKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSkgOwotICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykKLQkgICAgLyogd2UgYXJlIGRvaW5nIHJlYWwgdHJ1bmNhdGU6IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGxhc3QKLQkgICAgICAgdHJhbnNhY3Rpb24gb2YgdHJ1bmNhdGluZyBnZXRzIGNvbW1pdHRlZCAtIG9uIHJlYm9vdCB0aGUgZmlsZQotCSAgICAgICBlaXRoZXIgYXBwZWFycyB0cnVuY2F0ZWQgcHJvcGVybHkgb3Igbm90IHRydW5jYXRlZCBhdCBhbGwgKi8KLQlhZGRfc2F2ZV9saW5rICgmdGgsIHBfc19pbm9kZSwgMSk7Ci0gICAgZXJyb3IgPSByZWlzZXJmc19kb190cnVuY2F0ZSAoJnRoLCBwX3NfaW5vZGUsIHBhZ2UsIHVwZGF0ZV90aW1lc3RhbXBzKSA7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICBnb3RvIG91dDsKLSAgICBlcnJvciA9IGpvdXJuYWxfZW5kICgmdGgsIHBfc19pbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICBnb3RvIG91dDsKKwkvKiBzbywgaWYgcGFnZSAhPSBOVUxMLCB3ZSBoYXZlIGEgYnVmZmVyIGhlYWQgZm9yIHRoZSBvZmZzZXQgYXQgCisJICoqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIGlmIHRoZSBiaCBpcyBtYXBwZWQsIGFuZCBiaC0+Yl9ibG9ja25yICE9IDAsIAorCSAqKiB0aGVuIHdlIGhhdmUgYW4gdW5mb3JtYXR0ZWQgbm9kZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGRpcmVjdCBpdGVtLCAKKwkgKiogYW5kIG5vIHplcm9pbmcgaXMgcmVxdWlyZWQgb24gZGlzay4gIFdlIHplcm8gYWZ0ZXIgdGhlIHRydW5jYXRlLCAKKwkgKiogYmVjYXVzZSB0aGUgdHJ1bmNhdGUgbWlnaHQgcGFjayB0aGUgaXRlbSBhbnl3YXkgCisJICoqIChpdCB3aWxsIHVubWFwIGJoIGlmIGl0IHBhY2tzKS4KKwkgKi8KKwkvKiBpdCBpcyBlbm91Z2ggdG8gcmVzZXJ2ZSBzcGFjZSBpbiB0cmFuc2FjdGlvbiBmb3IgMiBiYWxhbmNpbmdzOgorCSAgIG9uZSBmb3IgInNhdmUiIGxpbmsgYWRkaW5nIGFuZCBhbm90aGVyIGZvciB0aGUgZmlyc3QKKwkgICBjdXRfZnJvbV9pdGVtLiAxIGlzIGZvciB1cGRhdGVfc2QgKi8KKwllcnJvciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBwX3NfaW5vZGUtPmlfc2IsCisJCQkgICAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAxKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpOworCWlmICh1cGRhdGVfdGltZXN0YW1wcykKKwkJLyogd2UgYXJlIGRvaW5nIHJlYWwgdHJ1bmNhdGU6IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGxhc3QKKwkJICAgdHJhbnNhY3Rpb24gb2YgdHJ1bmNhdGluZyBnZXRzIGNvbW1pdHRlZCAtIG9uIHJlYm9vdCB0aGUgZmlsZQorCQkgICBlaXRoZXIgYXBwZWFycyB0cnVuY2F0ZWQgcHJvcGVybHkgb3Igbm90IHRydW5jYXRlZCBhdCBhbGwgKi8KKwkJYWRkX3NhdmVfbGluaygmdGgsIHBfc19pbm9kZSwgMSk7CisJZXJyb3IgPSByZWlzZXJmc19kb190cnVuY2F0ZSgmdGgsIHBfc19pbm9kZSwgcGFnZSwgdXBkYXRlX3RpbWVzdGFtcHMpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJZXJyb3IgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIHBfc19pbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKIAotICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgewotCWVycm9yID0gcmVtb3ZlX3NhdmVfbGluayAocF9zX2lub2RlLCAxLyogdHJ1bmNhdGUgKi8pOwotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBpZiAocGFnZSkgewotICAgICAgICBsZW5ndGggPSBvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkgOwotCS8qIGlmIHdlIGFyZSBub3Qgb24gYSBibG9jayBib3VuZGFyeSAqLwotCWlmIChsZW5ndGgpIHsKLQkgICAgY2hhciAqa2FkZHI7Ci0KLQkgICAgbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoIDsKLQkgICAga2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgOwotCSAgICBtZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCkgOyAgIAotCSAgICBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7Ci0JICAgIGt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKSA7Ci0JICAgIGlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKLQkgICAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKSA7Ci0JICAgIH0KKwlpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKKwkJZXJyb3IgPSByZW1vdmVfc2F2ZV9saW5rKHBfc19pbm9kZSwgMSAvKiB0cnVuY2F0ZSAqLyApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKIAl9Ci0JdW5sb2NrX3BhZ2UocGFnZSkgOwotCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7Ci0gICAgfQogCi0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIDA7Ci1vdXQ6Ci0gICAgaWYgKHBhZ2UpIHsKLSAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UgKHBhZ2UpOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyb3I7CisJaWYgKHBhZ2UpIHsKKwkJbGVuZ3RoID0gb2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpOworCQkvKiBpZiB3ZSBhcmUgbm90IG9uIGEgYmxvY2sgYm91bmRhcnkgKi8KKwkJaWYgKGxlbmd0aCkgeworCQkJY2hhciAqa2FkZHI7CisKKwkJCWxlbmd0aCA9IGJsb2Nrc2l6ZSAtIGxlbmd0aDsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPSAwKSB7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJfQorCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJcmV0dXJuIDA7CisgICAgICBvdXQ6CisJaWYgKHBhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGZzX2dlbiA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCB0bXBfaWggOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKLSAgICBfX2xlMzIgKml0ZW0gOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleSA7Ci0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpIDsKLSAgICBpbnQgcG9zX2luX2l0ZW0gOwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7Ci0gICAgbG9mZl90IGJ5dGVfb2Zmc2V0ID0gKGJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDEgOwotICAgIGludCByZXR2YWwgOwotICAgIGludCB1c2VfZ2V0X2Jsb2NrID0gMCA7Ci0gICAgaW50IGJ5dGVzX2NvcGllZCA9IDAgOwotICAgIGludCBjb3B5X3NpemUgOwotICAgIGludCB0cmFuc19ydW5uaW5nID0gMDsKK3N0YXRpYyBpbnQgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGJsb2NrKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IGZzX2dlbjsKKwlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fbGUzMiAqaXRlbTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCWludCBwb3NfaW5faXRlbTsKKwlpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJbG9mZl90IGJ5dGVfb2Zmc2V0ID0gKGJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDE7CisJaW50IHJldHZhbDsKKwlpbnQgdXNlX2dldF9ibG9jayA9IDA7CisJaW50IGJ5dGVzX2NvcGllZCA9IDA7CisJaW50IGNvcHlfc2l6ZTsKKwlpbnQgdHJhbnNfcnVubmluZyA9IDA7CiAKLSAgICAvKiBjYXRjaCBwbGFjZXMgYmVsb3cgdGhhdCB0cnkgdG8gbG9nIHNvbWV0aGluZyB3aXRob3V0IHN0YXJ0aW5nIGEgdHJhbnMgKi8KLSAgICB0aC50X3RyYW5zX2lkID0gMDsKKwkvKiBjYXRjaCBwbGFjZXMgYmVsb3cgdGhhdCB0cnkgdG8gbG9nIHNvbWV0aGluZyB3aXRob3V0IHN0YXJ0aW5nIGEgdHJhbnMgKi8KKwl0aC50X3RyYW5zX2lkID0gMDsKIAotICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBrbWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci1zdGFydF9vdmVyOgotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIG1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgYnl0ZV9vZmZzZXQsIFRZUEVfQU5ZLCAzKSA7Ci0KLXJlc2VhcmNoOgotICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCkgOwotICAgIGlmIChyZXR2YWwgIT0gUE9TSVRJT05fRk9VTkQpIHsKLSAgICAgICAgdXNlX2dldF9ibG9jayA9IDE7Ci0JZ290byBvdXQgOwotICAgIH0gCi0KLSAgICBiaCA9IGdldF9sYXN0X2JoKCZwYXRoKSA7Ci0gICAgaWggPSBnZXRfaWgoJnBhdGgpIDsKLSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpIDsKLSAgICBwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW0gOwotCi0gICAgLyogd2UndmUgZm91bmQgYW4gdW5mb3JtYXR0ZWQgbm9kZSAqLwotICAgIGlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7Ci0JaWYgKGJ5dGVzX2NvcGllZCA+IDApIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJjbG0tNjAwMjogYnl0ZXNfY29waWVkICVkIiwKLQkJCSAgICAgIGJ5dGVzX2NvcGllZCkgOwotCX0KLSAgICAgICAgaWYgKCFnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkgewotCSAgICAvKiBjcmFwLCB3ZSBhcmUgd3JpdGluZyB0byBhIGhvbGUgKi8KLQkgICAgdXNlX2dldF9ibG9jayA9IDE7Ci0JICAgIGdvdG8gb3V0IDsKLQl9Ci0Jc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCBnZXRfYmxvY2tfbnVtKGl0ZW0scG9zX2luX2l0ZW0pLGlub2RlKTsKLSAgICB9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKLSAgICAgICAgY2hhciAqcCA7IAotICAgICAgICBwID0gcGFnZV9hZGRyZXNzKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0gICAgICAgIHAgKz0gKGJ5dGVfb2Zmc2V0IC0xKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgICAgIGNvcHlfc2l6ZSA9IGloX2l0ZW1fbGVuKGloKSAtIHBvc19pbl9pdGVtOwotCi0JZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKLQljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCkgOwotCi0JaWYgKCF0cmFuc19ydW5uaW5nKSB7Ci0JICAgIC8qIHZzLTMwNTAgaXMgZ29uZSwgbm8gbmVlZCB0byBkcm9wIHRoZSBwYXRoICovCi0JICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQkgICAgdHJhbnNfcnVubmluZyA9IDE7Ci0JICAgIGlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCQlnb3RvIHJlc2VhcmNoOwotCSAgICB9CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KSkgeworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOworCWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworICAgICAgc3RhcnRfb3ZlcjoKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIGJ5dGVfb2Zmc2V0LCBUWVBFX0FOWSwgMyk7CiAKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCSAgICBnb3RvIHJlc2VhcmNoOworICAgICAgcmVzZWFyY2g6CisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXVzZV9nZXRfYmxvY2sgPSAxOworCQlnb3RvIG91dDsKIAl9CiAKLQltZW1jcHkoIEJfSV9QSVRFTShiaCwgaWgpICsgcG9zX2luX2l0ZW0sIHAgKyBieXRlc19jb3BpZWQsIGNvcHlfc2l6ZSkgOworCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCWloID0gZ2V0X2loKCZwYXRoKTsKKwlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCXBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbTsKIAotCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIGlub2RlLT5pX3NiLCBiaCkgOwotCWJ5dGVzX2NvcGllZCArPSBjb3B5X3NpemUgOwotCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgMCwgaW5vZGUpOworCS8qIHdlJ3ZlIGZvdW5kIGFuIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwlpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZChyZXR2YWwsIGloKSkgeworCQlpZiAoYnl0ZXNfY29waWVkID4gMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJjbG0tNjAwMjogYnl0ZXNfY29waWVkICVkIiwKKwkJCQkJIGJ5dGVzX2NvcGllZCk7CisJCX0KKwkJaWYgKCFnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkgeworCQkJLyogY3JhcCwgd2UgYXJlIHdyaXRpbmcgdG8gYSBob2xlICovCisJCQl1c2VfZ2V0X2Jsb2NrID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwKKwkJCQkgICAgIGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pLCBpbm9kZSk7CisJfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisJCWNoYXIgKnA7CisJCXAgPSBwYWdlX2FkZHJlc3MoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlwICs9IChieXRlX29mZnNldCAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQljb3B5X3NpemUgPSBpaF9pdGVtX2xlbihpaCkgLSBwb3NfaW5faXRlbTsKIAotCS8qIGFyZSB0aGVyZSBzdGlsbCBieXRlcyBsZWZ0PyAqLwotICAgICAgICBpZiAoYnl0ZXNfY29waWVkIDwgYmhfcmVzdWx0LT5iX3NpemUgJiYgCi0JICAgIChieXRlX29mZnNldCArIGJ5dGVzX2NvcGllZCkgPCBpbm9kZS0+aV9zaXplKSB7Ci0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBjb3B5X3NpemUpIDsKLQkgICAgZ290byByZXNlYXJjaCA7CisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCisJCWlmICghdHJhbnNfcnVubmluZykgeworCQkJLyogdnMtMzA1MCBpcyBnb25lLCBubyBuZWVkIHRvIGRyb3AgdGhlIHBhdGggKi8KKwkJCXJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXQ7CisJCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQkJdHJhbnNfcnVubmluZyA9IDE7CisJCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSBiaCk7CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJfQorCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsKKworCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCk7CisJCQlnb3RvIHJlc2VhcmNoOworCQl9CisKKwkJbWVtY3B5KEJfSV9QSVRFTShiaCwgaWgpICsgcG9zX2luX2l0ZW0sIHAgKyBieXRlc19jb3BpZWQsCisJCSAgICAgICBjb3B5X3NpemUpOworCisJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCWJ5dGVzX2NvcGllZCArPSBjb3B5X3NpemU7CisJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgMCwgaW5vZGUpOworCisJCS8qIGFyZSB0aGVyZSBzdGlsbCBieXRlcyBsZWZ0PyAqLworCQlpZiAoYnl0ZXNfY29waWVkIDwgYmhfcmVzdWx0LT5iX3NpemUgJiYKKwkJICAgIChieXRlX29mZnNldCArIGJ5dGVzX2NvcGllZCkgPCBpbm9kZS0+aV9zaXplKSB7CisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkgICAgIGNvcHlfc2l6ZSk7CisJCQlnb3RvIHJlc2VhcmNoOworCQl9CisJfSBlbHNlIHsKKwkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkgImNsbS02MDAzOiBiYWQgaXRlbSBpbm9kZSAlbHUsIGRldmljZSAlcyIsCisJCQkJIGlub2RlLT5pX2lubywgcmVpc2VyZnNfYmRldm5hbWUoaW5vZGUtPmlfc2IpKTsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAiY2xtLTYwMDM6IGJhZCBpdGVtIGlub2RlICVsdSwgZGV2aWNlICVzIiwKLQkJCSAgaW5vZGUtPmlfaW5vLCByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKSA7Ci0gICAgICAgIHJldHZhbCA9IC1FSU8gOwotCWdvdG8gb3V0IDsKLSAgICB9Ci0gICAgcmV0dmFsID0gMCA7Ci0gICAgCi1vdXQ6Ci0gICAgcGF0aHJlbHNlKCZwYXRoKSA7Ci0gICAgaWYgKHRyYW5zX3J1bm5pbmcpIHsKLSAgICAgICAgaW50IGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dmFsID0gZXJyOwotCXRyYW5zX3J1bm5pbmcgPSAwOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHZhbCA9IDA7CiAKLSAgICAvKiB0aGlzIGlzIHdoZXJlIHdlIGZpbGwgaW4gaG9sZXMgaW4gdGhlIGZpbGUuICovCi0gICAgaWYgKHVzZV9nZXRfYmxvY2spIHsKLQlyZXR2YWwgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfQkxPQ0tfQ1JFQVRFIHwgR0VUX0JMT0NLX05PX0lTRU0gfAotCQkJCSAgICBHRVRfQkxPQ0tfTk9fREFOR0xFKTsKLQlpZiAoIXJldHZhbCkgewotCSAgICBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSB8fCBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7Ci0JICAgICAgICAvKiBnZXRfYmxvY2sgZmFpbGVkIHRvIGZpbmQgYSBtYXBwZWQgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLQkJdXNlX2dldF9ibG9jayA9IDAgOwotCQlnb3RvIHN0YXJ0X292ZXIgOwotCSAgICB9CisgICAgICBvdXQ6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwlpZiAodHJhbnNfcnVubmluZykgeworCQlpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJaWYgKGVycikKKwkJCXJldHZhbCA9IGVycjsKKwkJdHJhbnNfcnVubmluZyA9IDA7CiAJfQotICAgIH0KLSAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCi0gICAgaWYgKCFyZXR2YWwgJiYgYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKLQkvKiB3ZSd2ZSBjb3BpZWQgZGF0YSBmcm9tIHRoZSBwYWdlIGludG8gdGhlIGRpcmVjdCBpdGVtLCBzbyB0aGUKLQkgKiBidWZmZXIgaW4gdGhlIHBhZ2UgaXMgbm93IGNsZWFuLCBtYXJrIGl0IHRvIHJlZmxlY3QgdGhhdC4KLQkgKi8KLSAgICAgICAgbG9ja19idWZmZXIoYmhfcmVzdWx0KTsKLQljbGVhcl9idWZmZXJfZGlydHkoYmhfcmVzdWx0KTsKLQl1bmxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXR2YWwgOworCS8qIHRoaXMgaXMgd2hlcmUgd2UgZmlsbCBpbiBob2xlcyBpbiB0aGUgZmlsZS4gKi8KKwlpZiAodXNlX2dldF9ibG9jaykgeworCQlyZXR2YWwgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsCisJCQkJCSAgICBHRVRfQkxPQ0tfQ1JFQVRFIHwgR0VUX0JMT0NLX05PX0lTRU0KKwkJCQkJICAgIHwgR0VUX0JMT0NLX05PX0RBTkdMRSk7CisJCWlmICghcmV0dmFsKSB7CisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KQorCQkJICAgIHx8IGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKKwkJCQkvKiBnZXRfYmxvY2sgZmFpbGVkIHRvIGZpbmQgYSBtYXBwZWQgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKwkJCQl1c2VfZ2V0X2Jsb2NrID0gMDsKKwkJCQlnb3RvIHN0YXJ0X292ZXI7CisJCQl9CisJCX0KKwl9CisJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKworCWlmICghcmV0dmFsICYmIGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7CisJCS8qIHdlJ3ZlIGNvcGllZCBkYXRhIGZyb20gdGhlIHBhZ2UgaW50byB0aGUgZGlyZWN0IGl0ZW0sIHNvIHRoZQorCQkgKiBidWZmZXIgaW4gdGhlIHBhZ2UgaXMgbm93IGNsZWFuLCBtYXJrIGl0IHRvIHJlZmxlY3QgdGhhdC4KKwkJICovCisJCWxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7CisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpOworCQl1bmxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7CisJfQorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIApAQCAtMjIxNSwzODMgKzIzMjUsMzkwIEBACiAgKiBzdGFydC9yZWNvdmVyeSBwYXRoIGFzIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlLCBhbG9uZyB3aXRoIHNwZWNpYWwKICAqIGNvZGUgdG8gaGFuZGxlIHJlaXNlcmZzIHRhaWxzLgogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2Z1bGxfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7Ci0gICAgdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQgOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9jayA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7Ci0gICAgaW50IHBhcnRpYWwgPSAwIDsKLSAgICBpbnQgbnIgPSAwOwotICAgIGludCBjaGVja2VkID0gUGFnZUNoZWNrZWQocGFnZSk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKLSAgICBpbnQgYmhfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzLT5zX2Jsb2Nrc2l6ZTsKLSAgICB0aC50X3RyYW5zX2lkID0gMDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CisJaW50IHBhcnRpYWwgPSAwOworCWludCBuciA9IDA7CisJaW50IGNoZWNrZWQgPSBQYWdlQ2hlY2tlZChwYWdlKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGlub2RlLT5pX3NiOworCWludCBiaF9wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHMtPnNfYmxvY2tzaXplOworCXRoLnRfdHJhbnNfaWQgPSAwOwogCi0gICAgLyogVGhlIHBhZ2UgZGlydHkgYml0IGlzIGNsZWFyZWQgYmVmb3JlIHdyaXRlcGFnZSBpcyBjYWxsZWQsIHdoaWNoCi0gICAgICogbWVhbnMgd2UgaGF2ZSB0byB0ZWxsIGNyZWF0ZV9lbXB0eV9idWZmZXJzIHRvIG1ha2UgZGlydHkgYnVmZmVycwotICAgICAqIFRoZSBwYWdlIHJlYWxseSBzaG91bGQgYmUgdXAgdG8gZGF0ZSBhdCB0aGlzIHBvaW50LCBzbyB0b3NzaW5nCi0gICAgICogaW4gdGhlIEJIX1VwdG9kYXRlIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2suCi0gICAgICovCi0gICAgaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgcy0+c19ibG9ja3NpemUsCi0JICAgICAgICAgICAgICAgICAgICAoMSA8PCBCSF9EaXJ0eSkgfCAoMSA8PCBCSF9VcHRvZGF0ZSkpOwotICAgIH0KLSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKLQotICAgIC8qIGxhc3QgcGFnZSBpbiB0aGUgZmlsZSwgemVybyBvdXQgYW55IGNvbnRlbnRzIHBhc3QgdGhlCi0gICAgKiogbGFzdCBieXRlIGluIHRoZSBmaWxlCi0gICAgKi8KLSAgICBpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KSB7Ci0JY2hhciAqa2FkZHI7Ci0JdW5zaWduZWQgbGFzdF9vZmZzZXQ7Ci0KLSAgICAgICAgbGFzdF9vZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLQkvKiBubyBmaWxlIGNvbnRlbnRzIGluIHRoaXMgcGFnZSAqLwotCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXggKyAxIHx8ICFsYXN0X29mZnNldCkgewotICAgIAkgICAgdW5sb2NrX3BhZ2UocGFnZSk7Ci0JICAgIHJldHVybiAwOworCS8qIFRoZSBwYWdlIGRpcnR5IGJpdCBpcyBjbGVhcmVkIGJlZm9yZSB3cml0ZXBhZ2UgaXMgY2FsbGVkLCB3aGljaAorCSAqIG1lYW5zIHdlIGhhdmUgdG8gdGVsbCBjcmVhdGVfZW1wdHlfYnVmZmVycyB0byBtYWtlIGRpcnR5IGJ1ZmZlcnMKKwkgKiBUaGUgcGFnZSByZWFsbHkgc2hvdWxkIGJlIHVwIHRvIGRhdGUgYXQgdGhpcyBwb2ludCwgc28gdG9zc2luZworCSAqIGluIHRoZSBCSF9VcHRvZGF0ZSBpcyBqdXN0IGEgc2FuaXR5IGNoZWNrLgorCSAqLworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBzLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgICgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX1VwdG9kYXRlKSk7CiAJfQotCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCW1lbXNldChrYWRkciArIGxhc3Rfb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUtbGFzdF9vZmZzZXQpIDsKLQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7Ci0Ja3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApIDsKLSAgICB9Ci0gICAgYmggPSBoZWFkIDsKLSAgICBibG9jayA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gcy0+c19ibG9ja3NpemVfYml0cykgOwotICAgIC8qIGZpcnN0IG1hcCBhbGwgdGhlIGJ1ZmZlcnMsIGxvZ2dpbmcgYW55IGRpcmVjdCBpdGVtcyB3ZSBmaW5kICovCi0gICAgZG8gewotCWlmICgoY2hlY2tlZCB8fCBidWZmZXJfZGlydHkoYmgpKSAmJiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8Ci0JICAgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkpKSB7Ci0JICAgIC8qIG5vdCBtYXBwZWQgeWV0LCBvciBpdCBwb2ludHMgdG8gYSBkaXJlY3QgaXRlbSwgc2VhcmNoCi0JICAgICAqIHRoZSBidHJlZSBmb3IgdGhlIG1hcHBpbmcgaW5mbywgYW5kIGxvZyBhbnkgZGlyZWN0Ci0JICAgICAqIGl0ZW1zIGZvdW5kCi0JICAgICAqLwotCSAgICBpZiAoKGVycm9yID0gbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UoaW5vZGUsIGJoLCBibG9jaykpKSB7Ci0JCWdvdG8gZmFpbCA7Ci0JICAgIH0KLQl9Ci0gICAgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOwotCWJsb2NrKys7Ci0gICAgfSB3aGlsZShiaCAhPSBoZWFkKSA7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAotICAgIC8qCi0gICAgICogd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlLAotICAgICAqIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBob2xlcyBpbiB0aGUgZmlsZSAoYW4gdW5ib3VuZGVkIG9wZXJhdGlvbikuCi0gICAgICogc3RhcnRpbmcgaXQgaGVyZSwgd2UgY2FuIG1ha2UgYSByZWxpYWJsZSBlc3RpbWF0ZSBmb3IgaG93IG1hbnkKLSAgICAgKiBibG9ja3Mgd2UncmUgZ29pbmcgdG8gbG9nCi0gICAgICovCi0gICAgaWYgKGNoZWNrZWQpIHsKLQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwotCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7Ci0JZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKLQlpZiAoZXJyb3IpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwotCSAgICBnb3RvIGZhaWw7CisJLyogbGFzdCBwYWdlIGluIHRoZSBmaWxlLCB6ZXJvIG91dCBhbnkgY29udGVudHMgcGFzdCB0aGUKKwkgKiogbGFzdCBieXRlIGluIHRoZSBmaWxlCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCQljaGFyICprYWRkcjsKKwkJdW5zaWduZWQgbGFzdF9vZmZzZXQ7CisKKwkJbGFzdF9vZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkvKiBubyBmaWxlIGNvbnRlbnRzIGluIHRoaXMgcGFnZSAqLworCQlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4ICsgMSB8fCAhbGFzdF9vZmZzZXQpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciArIGxhc3Rfb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBsYXN0X29mZnNldCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7Ci0gICAgfQotICAgIC8qIG5vdyBnbyB0aHJvdWdoIGFuZCBsb2NrIGFueSBkaXJ0eSBidWZmZXJzIG9uIHRoZSBwYWdlICovCi0gICAgZG8gewotCWdldF9iaChiaCk7Ci0JaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKLQkgICAgY29udGludWU7Ci0JaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkKLQkgICAgY29udGludWU7CisJYmggPSBoZWFkOworCWJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkvKiBmaXJzdCBtYXAgYWxsIHRoZSBidWZmZXJzLCBsb2dnaW5nIGFueSBkaXJlY3QgaXRlbXMgd2UgZmluZCAqLworCWRvIHsKKwkJaWYgKChjaGVja2VkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpICYmICghYnVmZmVyX21hcHBlZChiaCkgfHwKKwkJCQkJCSAgICAgIChidWZmZXJfbWFwcGVkKGJoKQorCQkJCQkJICAgICAgICYmIGJoLT5iX2Jsb2NrbnIgPT0KKwkJCQkJCSAgICAgICAwKSkpIHsKKwkJCS8qIG5vdCBtYXBwZWQgeWV0LCBvciBpdCBwb2ludHMgdG8gYSBkaXJlY3QgaXRlbSwgc2VhcmNoCisJCQkgKiB0aGUgYnRyZWUgZm9yIHRoZSBtYXBwaW5nIGluZm8sIGFuZCBsb2cgYW55IGRpcmVjdAorCQkJICogaXRlbXMgZm91bmQKKwkJCSAqLworCQkJaWYgKChlcnJvciA9IG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlKGlub2RlLCBiaCwgYmxvY2spKSkgeworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJYmxvY2srKzsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qCisJICogd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlLAorCSAqIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBob2xlcyBpbiB0aGUgZmlsZSAoYW4gdW5ib3VuZGVkIG9wZXJhdGlvbikuCisJICogc3RhcnRpbmcgaXQgaGVyZSwgd2UgY2FuIG1ha2UgYSByZWxpYWJsZSBlc3RpbWF0ZSBmb3IgaG93IG1hbnkKKwkgKiBibG9ja3Mgd2UncmUgZ29pbmcgdG8gbG9nCisJICovCisJaWYgKGNoZWNrZWQpIHsKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwkJZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwl9CisJLyogbm93IGdvIHRocm91Z2ggYW5kIGxvY2sgYW55IGRpcnR5IGJ1ZmZlcnMgb24gdGhlIHBhZ2UgKi8KKwlkbyB7CisJCWdldF9iaChiaCk7CisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpCisJCQljb250aW51ZTsKKwkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjaGVja2VkKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2Uga25vdyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byBhCisJCSAqIHJlYWwgYmxvY2sgYW5kIG5vdCBhIGRpcmVjdCBpdGVtCisJCSAqLworCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FIHx8ICF3YmMtPm5vbmJsb2NraW5nKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQl9CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKIAogCWlmIChjaGVja2VkKSB7Ci0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7Ci0JICAgIGNvbnRpbnVlOworCQllcnJvciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGZhaWw7CiAJfQotCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2Uga25vdyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byBhCi0JICogcmVhbCBibG9jayBhbmQgbm90IGEgZGlyZWN0IGl0ZW0KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJLyoKKwkgKiBzaW5jZSBhbnkgYnVmZmVyIG1pZ2h0IGJlIHRoZSBvbmx5IGRpcnR5IGJ1ZmZlciBvbiB0aGUgcGFnZSwgCisJICogdGhlIGZpcnN0IHN1Ym1pdF9iaCBjYW4gYnJpbmcgdGhlIHBhZ2Ugb3V0IG9mIHdyaXRlYmFjay4KKwkgKiBiZSBjYXJlZnVsIHdpdGggdGhlIGJ1ZmZlcnMuCiAJICovCi0JaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgewotCSAgICBsb2NrX2J1ZmZlcihiaCk7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKLQkgICAgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOwotCX0gZWxzZSB7Ci0JICAgIHVubG9ja19idWZmZXIoYmgpOwotCX0KLSAgICB9IHdoaWxlKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7Ci0KLSAgICBpZiAoY2hlY2tlZCkgewotCWVycm9yID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLQlpZiAoZXJyb3IpCi0JICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwotICAgIHNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLSAgICB1bmxvY2tfcGFnZShwYWdlKTsKLQotICAgIC8qCi0gICAgICogc2luY2UgYW55IGJ1ZmZlciBtaWdodCBiZSB0aGUgb25seSBkaXJ0eSBidWZmZXIgb24gdGhlIHBhZ2UsIAotICAgICAqIHRoZSBmaXJzdCBzdWJtaXRfYmggY2FuIGJyaW5nIHRoZSBwYWdlIG91dCBvZiB3cml0ZWJhY2suCi0gICAgICogYmUgY2FyZWZ1bCB3aXRoIHRoZSBidWZmZXJzLgotICAgICAqLwotICAgIGRvIHsKLSAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOwotCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7Ci0JICAgIHN1Ym1pdF9iaChXUklURSwgYmgpOwotCSAgICBucisrOwotCX0KLQlwdXRfYmgoYmgpOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotCi0gICAgZXJyb3IgPSAwOwotZG9uZToKLSAgICBpZiAobnIgPT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiBpZiB0aGlzIHBhZ2Ugb25seSBoYWQgYSBkaXJlY3QgaXRlbSwgaXQgaXMgdmVyeSBwb3NzaWJsZSBmb3IKLSAgICAgICAgICogbm8gaW8gdG8gYmUgcmVxdWlyZWQgd2l0aG91dCB0aGVyZSBiZWluZyBhbiBlcnJvci4gIE9yLCAKLQkgKiBzb21lb25lIGVsc2UgY291bGQgaGF2ZSBsb2NrZWQgdGhlbSBhbmQgc2VudCB0aGVtIGRvd24gdGhlIAotCSAqIHBpcGUgd2l0aG91dCBsb2NraW5nIHRoZSBwYWdlCi0JICovCi0JYmggPSBoZWFkIDsKIAlkbyB7Ci0JICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCSAgICAgICAgcGFydGlhbCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOwotCX0gd2hpbGUoYmggIT0gaGVhZCk7Ci0JaWYgKCFwYXJ0aWFsKQotCSAgICBTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCXN1Ym1pdF9iaChXUklURSwgYmgpOworCQkJbnIrKzsKKwkJfQorCQlwdXRfYmgoYmgpOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CiAKLWZhaWw6Ci0gICAgLyogY2F0Y2hlcyB2YXJpb3VzIGVycm9ycywgd2UgbmVlZCB0byBtYWtlIHN1cmUgYW55IHZhbGlkIGRpcnR5IGJsb2NrcwotICAgICAqIGdldCB0byB0aGUgbWVkaWEuICBUaGUgcGFnZSBpcyBjdXJyZW50bHkgbG9ja2VkIGFuZCBub3QgbWFya2VkIGZvciAKLSAgICAgKiB3cml0ZWJhY2sKLSAgICAgKi8KLSAgICBDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCWdldF9iaChiaCk7Ci0JaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJ1ZmZlcl9kaXJ0eShiaCkgJiYgYmgtPmJfYmxvY2tucikgewotCSAgICBsb2NrX2J1ZmZlcihiaCk7Ci0JICAgIG1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKLQl9IGVsc2UgewotCSAgICAvKgotCSAgICAgKiBjbGVhciBhbnkgZGlydHkgYml0cyB0aGF0IG1pZ2h0IGhhdmUgY29tZSBmcm9tIGdldHRpbmcKLQkgICAgICogYXR0YWNoZWQgdG8gYSBkaXJ0eSBwYWdlCi0JICAgICAqLwotCSAgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwllcnJvciA9IDA7CisgICAgICBkb25lOgorCWlmIChuciA9PSAwKSB7CisJCS8qCisJCSAqIGlmIHRoaXMgcGFnZSBvbmx5IGhhZCBhIGRpcmVjdCBpdGVtLCBpdCBpcyB2ZXJ5IHBvc3NpYmxlIGZvcgorCQkgKiBubyBpbyB0byBiZSByZXF1aXJlZCB3aXRob3V0IHRoZXJlIGJlaW5nIGFuIGVycm9yLiAgT3IsIAorCQkgKiBzb21lb25lIGVsc2UgY291bGQgaGF2ZSBsb2NrZWQgdGhlbSBhbmQgc2VudCB0aGVtIGRvd24gdGhlIAorCQkgKiBwaXBlIHdpdGhvdXQgbG9ja2luZyB0aGUgcGFnZQorCQkgKi8KKwkJYmggPSBoZWFkOworCQlkbyB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCQlwYXJ0aWFsID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkJaWYgKCFwYXJ0aWFsKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CiAJfQotICAgICAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZTsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotICAgIFNldFBhZ2VFcnJvcihwYWdlKTsKLSAgICBCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0gICAgc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotICAgIHVubG9ja19wYWdlKHBhZ2UpOwotICAgIGRvIHsKLSAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOwotCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7Ci0JICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JICAgIHN1Ym1pdF9iaChXUklURSwgYmgpOwotCSAgICBucisrOwotCX0KLQlwdXRfYmgoYmgpOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotICAgIGdvdG8gZG9uZTsKKwlyZXR1cm4gZXJyb3I7CisKKyAgICAgIGZhaWw6CisJLyogY2F0Y2hlcyB2YXJpb3VzIGVycm9ycywgd2UgbmVlZCB0byBtYWtlIHN1cmUgYW55IHZhbGlkIGRpcnR5IGJsb2NrcworCSAqIGdldCB0byB0aGUgbWVkaWEuICBUaGUgcGFnZSBpcyBjdXJyZW50bHkgbG9ja2VkIGFuZCBub3QgbWFya2VkIGZvciAKKwkgKiB3cml0ZWJhY2sKKwkgKi8KKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSAmJiBiaC0+Yl9ibG9ja25yKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogY2xlYXIgYW55IGRpcnR5IGJpdHMgdGhhdCBtaWdodCBoYXZlIGNvbWUgZnJvbSBnZXR0aW5nCisJCQkgKiBhdHRhY2hlZCB0byBhIGRpcnR5IHBhZ2UKKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlkbyB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5yKys7CisJCX0KKwkJcHV0X2JoKGJoKTsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCWdvdG8gZG9uZTsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRwYWdlIChzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKiBwYWdlKQorc3RhdGljIGludCByZWlzZXJmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0gICAgcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlIChwYWdlLCByZWlzZXJmc19nZXRfYmxvY2spOworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCByZWlzZXJmc19nZXRfYmxvY2spOwogfQogCi0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVwYWdlIChzdHJ1Y3QgcGFnZSAqIHBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQorc3RhdGljIGludCByZWlzZXJmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKSA7Ci0gICAgcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCB3YmMpIDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlyZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIHdiYyk7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBpbnQgcmV0OwotICAgIGludCBvbGRfcmVmID0gMDsKLQotICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKLSAgICBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHBhZ2UpIDsKLSAgICBpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKLQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsKLQl0aCA9IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICopY3VycmVudC0+am91cm5hbF9pbmZvOwotICAgICAgICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7Ci0gICAgICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLQlvbGRfcmVmID0gdGgtPnRfcmVmY291bnQ7Ci0JdGgtPnRfcmVmY291bnQrKzsKLSAgICB9Ci0KLSAgICByZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCByZWlzZXJmc19nZXRfYmxvY2spIDsKLSAgICBpZiAocmV0ICYmIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7Ci0gICAgCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwotCS8qIHRoaXMgZ2V0cyBhIGxpdHRsZSB1Z2x5LiAgSWYgcmVpc2VyZnNfZ2V0X2Jsb2NrIHJldHVybmVkIGFuCi0JICogZXJyb3IgYW5kIGxlZnQgYSB0cmFuc2Fjc3Rpb24gcnVubmluZywgd2UndmUgZ290IHRvIGNsb3NlIGl0LAotCSAqIGFuZCB3ZSd2ZSBnb3QgdG8gZnJlZSBoYW5kbGUgaWYgaXQgd2FzIGEgcGVyc2lzdGVudCB0cmFuc2FjdGlvbi4KLQkgKgotCSAqIEJ1dCwgaWYgd2UgaGFkIG5lc3RlZCBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLCB3ZSBuZWVkCi0JICogdG8ganVzdCBkcm9wIHRoZSByZWYgY291bnQgb24gdGhlIGhhbmRsZS4KLQkgKgotCSAqIElmIG9sZF9yZWYgPT0gMCwgdGhlIHRyYW5zYWN0aW9uIGlzIGZyb20gcmVpc2VyZnNfZ2V0X2Jsb2NrLAotCSAqIGFuZCBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zLiAgT3RoZXJ3aXNlLCBpdCB3YXMgbmVzdGVkIGFib3ZlLgotCSAqLwotCWlmICh0aC0+dF9yZWZjb3VudCA+IG9sZF9yZWYpIHsKLQkgICAgaWYgKG9sZF9yZWYpCi0JICAgIAl0aC0+dF9yZWZjb3VudC0tOwotCSAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyOwotCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkJZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IGVycjsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLQotfQotCi0KLXN0YXRpYyBzZWN0b3JfdCByZWlzZXJmc19hb3BfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYXMsIHNlY3Rvcl90IGJsb2NrKSB7Ci0gIHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAoYXMsIGJsb2NrLCByZWlzZXJmc19ibWFwKSA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpbnQgdXBkYXRlX3NkID0gMDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7Ci0gICAgCi0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYikgOwotICAgIGlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgewotICAgICAgICB0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKLSAgICB9Ci0gICAgcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKLSAKLSAgICAvKiBnZW5lcmljX2NvbW1pdF93cml0ZSBkb2VzIHRoaXMgZm9yIHVzLCBidXQgZG9lcyBub3QgdXBkYXRlIHRoZQotICAgICoqIHRyYW5zYWN0aW9uIHRyYWNraW5nIHN0dWZmIHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gIFNvLCB3ZSBoYXZlCi0gICAgKiogdG8gZG8gdGhlIGlfc2l6ZSB1cGRhdGVzIGhlcmUuCi0gICAgKi8KLSAgICBpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgewotCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBiZXlvbmQgdGhlIGJvcmRlciB3aGVyZSBpdAotCSAgIGNhbiBoYXZlIGEgdGFpbCwgdW5tYXJrIGl0IGFzIG5lZWRpbmcgYSB0YWlsCi0JICAgcGFja2luZyAqLwotCWlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKLQkgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKLQotCXJldCA9IGpvdXJuYWxfYmVnaW4oJm15dGgsIGlub2RlLT5pX3NiLCAxKSA7Ci0JaWYgKHJldCkgewotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCSAgICBnb3RvIGpvdXJuYWxfZXJyb3I7Ci0JfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotCWlub2RlLT5pX3NpemUgPSBwb3MgOwotCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpIDsKLQl1cGRhdGVfc2QgPSAxOwotCXJldCA9IGpvdXJuYWxfZW5kKCZteXRoLCBpbm9kZS0+aV9zYiwgMSkgOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JaWYgKHJldCkKLQkgICAgZ290byBqb3VybmFsX2Vycm9yOwotICAgIH0KLSAgICBpZiAodGgpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQlpZiAoIXVwZGF0ZV9zZCkKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOwotCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCWlmIChyZXQpCi0JICAgIGdvdG8gb3V0OwotICAgIH0KLSAKLSAgICAvKiB3ZSB0ZXN0IGZvciBPX1NZTkMgaGVyZSBzbyB3ZSBjYW4gY29tbWl0IHRoZSB0cmFuc2FjdGlvbgotICAgICoqIGZvciBhbnkgcGFja2VkIHRhaWxzIHRoZSBmaWxlIG1pZ2h0IGhhdmUgaGFkCi0gICAgKi8KLSAgICBpZiAoZiAmJiAoZi0+Zl9mbGFncyAmIE9fU1lOQykpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAJcmV0ID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSkgOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotb3V0OgotICAgIHJldHVybiByZXQgOwotCi1qb3VybmFsX2Vycm9yOgotICAgIGlmICh0aCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICghdXBkYXRlX3NkKQotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7Ci0gICAgICAgIHJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyggX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUgKQorCQkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0JaWYoIHJlaXNlcmZzX2F0dHJzKCBpbm9kZSAtPiBpX3NiICkgKSB7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX1NZTkNfRkwgKQotCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX1NZTkM7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IHJldDsKKwlpbnQgb2xkX3JlZiA9IDA7CisKKwlyZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKTsKKwlmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHBhZ2UpOworCWlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsKKwkJdGggPSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqKWN1cnJlbnQtPgorCQkgICAgam91cm5hbF9pbmZvOworCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKKwkJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJCW9sZF9yZWYgPSB0aC0+dF9yZWZjb3VudDsKKwkJdGgtPnRfcmVmY291bnQrKzsKKwl9CisKKwlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCByZWlzZXJmc19nZXRfYmxvY2spOworCWlmIChyZXQgJiYgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCS8qIHRoaXMgZ2V0cyBhIGxpdHRsZSB1Z2x5LiAgSWYgcmVpc2VyZnNfZ2V0X2Jsb2NrIHJldHVybmVkIGFuCisJCSAqIGVycm9yIGFuZCBsZWZ0IGEgdHJhbnNhY3N0aW9uIHJ1bm5pbmcsIHdlJ3ZlIGdvdCB0byBjbG9zZSBpdCwKKwkJICogYW5kIHdlJ3ZlIGdvdCB0byBmcmVlIGhhbmRsZSBpZiBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zYWN0aW9uLgorCQkgKgorCQkgKiBCdXQsIGlmIHdlIGhhZCBuZXN0ZWQgaW50byBhbiBleGlzdGluZyB0cmFuc2FjdGlvbiwgd2UgbmVlZAorCQkgKiB0byBqdXN0IGRyb3AgdGhlIHJlZiBjb3VudCBvbiB0aGUgaGFuZGxlLgorCQkgKgorCQkgKiBJZiBvbGRfcmVmID09IDAsIHRoZSB0cmFuc2FjdGlvbiBpcyBmcm9tIHJlaXNlcmZzX2dldF9ibG9jaywKKwkJICogYW5kIGl0IHdhcyBhIHBlcnNpc3RlbnQgdHJhbnMuICBPdGhlcndpc2UsIGl0IHdhcyBuZXN0ZWQgYWJvdmUuCisJCSAqLworCQlpZiAodGgtPnRfcmVmY291bnQgPiBvbGRfcmVmKSB7CisJCQlpZiAob2xkX3JlZikKKwkJCQl0aC0+dF9yZWZjb3VudC0tOworCQkJZWxzZSB7CisJCQkJaW50IGVycjsKKwkJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQllcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXQgPSBlcnI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgc2VjdG9yX3QgcmVpc2VyZnNfYW9wX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmFzLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKGFzLCBibG9jaywgcmVpc2VyZnNfYm1hcCk7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IHBvcyA9ICgobG9mZl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOworCWludCByZXQgPSAwOworCWludCB1cGRhdGVfc2QgPSAwOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKKworCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworCQl0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwl9CisJcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKKworCS8qIGdlbmVyaWNfY29tbWl0X3dyaXRlIGRvZXMgdGhpcyBmb3IgdXMsIGJ1dCBkb2VzIG5vdCB1cGRhdGUgdGhlCisJICoqIHRyYW5zYWN0aW9uIHRyYWNraW5nIHN0dWZmIHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gIFNvLCB3ZSBoYXZlCisJICoqIHRvIGRvIHRoZSBpX3NpemUgdXBkYXRlcyBoZXJlLgorCSAqLworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CisJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aDsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCS8qIElmIHRoZSBmaWxlIGhhdmUgZ3Jvd24gYmV5b25kIHRoZSBib3JkZXIgd2hlcmUgaXQKKwkJICAgY2FuIGhhdmUgYSB0YWlsLCB1bm1hcmsgaXQgYXMgbmVlZGluZyBhIHRhaWwKKwkJICAgcGFja2luZyAqLworCQlpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpCisJCSAgICAgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KQorCQkgICAgfHwgKGhhdmVfc21hbGxfdGFpbHMoaW5vZGUtPmlfc2IpCisJCQkmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSkpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmbXl0aCwgaW5vZGUtPmlfc2IsIDEpOworCQlpZiAocmV0KSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJZ290byBqb3VybmFsX2Vycm9yOworCQl9CisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCWlub2RlLT5pX3NpemUgPSBwb3M7CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpOworCQl1cGRhdGVfc2QgPSAxOworCQlyZXQgPSBqb3VybmFsX2VuZCgmbXl0aCwgaW5vZGUtPmlfc2IsIDEpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlpZiAocmV0KQorCQkJZ290byBqb3VybmFsX2Vycm9yOworCX0KKwlpZiAodGgpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghdXBkYXRlX3NkKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHdlIHRlc3QgZm9yIE9fU1lOQyBoZXJlIHNvIHdlIGNhbiBjb21taXQgdGhlIHRyYW5zYWN0aW9uCisJICoqIGZvciBhbnkgcGFja2VkIHRhaWxzIHRoZSBmaWxlIG1pZ2h0IGhhdmUgaGFkCisJICovCisJaWYgKGYgJiYgKGYtPmZfZmxhZ3MgJiBPX1NZTkMpKSB7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQlyZXQgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKKworICAgICAgam91cm5hbF9lcnJvcjoKKwlpZiAodGgpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghdXBkYXRlX3NkKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNkX2F0dHJzX3RvX2lfYXR0cnMoX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKHJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkgeworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19TWU5DX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOwogCQllbHNlCi0JCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX1NZTkM7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCApCi0JCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfU1lOQzsKKwkJaWYgKHNkX2F0dHJzICYgUkVJU0VSRlNfSU1NVVRBQkxFX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwotCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19BUFBFTkRfRkwgKQotCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX0FQUEVORDsKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0lNTVVUQUJMRTsKKwkJaWYgKHNkX2F0dHJzICYgUkVJU0VSRlNfQVBQRU5EX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfQVBQRU5EOwotCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19OT0FUSU1FX0ZMICkKLQkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19OT0FUSU1FOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfQVBQRU5EOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19OT0FUSU1FX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwogCQllbHNlCi0JCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX05PQVRJTUU7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX05PVEFJTF9GTCApCisJCQlpbm9kZS0+aV9mbGFncyAmPSB+U19OT0FUSU1FOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19OT1RBSUxfRkwpCiAJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwogCQllbHNlCiAJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9ub3BhY2tfbWFzazsKIAl9CiB9CiAKLXZvaWQgaV9hdHRyc190b19zZF9hdHRycyggc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKnNkX2F0dHJzICkKK3ZvaWQgaV9hdHRyc190b19zZF9hdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UxNiAqIHNkX2F0dHJzKQogewotCWlmKCByZWlzZXJmc19hdHRycyggaW5vZGUgLT4gaV9zYiApICkgewotCQlpZiggaW5vZGUgLT4gaV9mbGFncyAmIFNfSU1NVVRBQkxFICkKKwlpZiAocmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKSB7CisJCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfSU1NVVRBQkxFKQogCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX0lNTVVUQUJMRV9GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19JTU1VVEFCTEVfRkw7Ci0JCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19TWU5DICkKKwkJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19TWU5DKQogCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX1NZTkNfRkw7CiAJCWVsc2UKIAkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfU1lOQ19GTDsKLQkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX05PQVRJTUUgKQorCQlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpCiAJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfTk9BVElNRV9GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19OT0FUSU1FX0ZMOwotCQlpZiggUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrICkKKwkJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykKIAkJCSpzZF9hdHRycyB8PSBSRUlTRVJGU19OT1RBSUxfRkw7CiAJCWVsc2UKIAkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfTk9UQUlMX0ZMOwpAQCAtMjYwMywxMDYgKzI3MjAsMTA3IEBACiAqLwogc3RhdGljIGludCBpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIGludCByZXQgPSAxIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKKwlpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOwogCi0gICAgc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIGlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKLSAgICAgICAgZ290byBmcmVlX2poOwotICAgIH0KLSAgICAvKiB0aGUgcGFnZSBpcyBsb2NrZWQsIGFuZCB0aGUgb25seSBwbGFjZXMgdGhhdCBsb2cgYSBkYXRhIGJ1ZmZlcgotICAgICAqIGFsc28gbG9jayB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKLQkvKgotCSAqIHZlcnkgY29uc2VydmF0aXZlLCBsZWF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBpZgotCSAqIGFueW9uZSBtaWdodCBuZWVkIGl0LgotCSAqLwotICAgICAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7Ci0JICAgIHJldCA9IDAgOworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJZ290byBmcmVlX2poOwogCX0KLSAgICB9IGVsc2UKLSAgICBpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgewotCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotCXN0cnVjdCByZWlzZXJmc19qaCAqamggPSBiaC0+Yl9wcml2YXRlOwotCi0JLyogd2h5IGlzIHRoaXMgc2FmZT8KLQkgKiByZWlzZXJmc19zZXRhdHRyIHVwZGF0ZXMgaV9zaXplIGluIHRoZSBvbiBkaXNrCi0JICogc3RhdCBkYXRhIGJlZm9yZSBhbGxvd2luZyB2bXRydW5jYXRlIHRvIGJlIGNhbGxlZC4KLQkgKgotCSAqIElmIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgdGhpcwotCSAqIHRyYW5zYWN0aW9uLCB3ZSBrbm93IGZvciBzdXJlIGVpdGhlciB0aGlzIHRyYW5zYWN0aW9uCi0JICogb3IgYW4gb2xkZXIgb25lIGFscmVhZHkgaGFzIHVwZGF0ZWQgaV9zaXplIG9uIGRpc2ssCi0JICogYW5kIHRoaXMgb3JkZXJlZCBkYXRhIHdvbid0IGJlIHJlZmVyZW5jZWQgaW4gdGhlIGZpbGUKLQkgKiBpZiB3ZSBjcmFzaC4KLQkgKgotCSAqIGlmIHRoZSBidWZmZXIgd2FzIHB1dCBvbnRvIHRoZSBvcmRlcmVkIGxpc3QgZm9yIGFuIG9sZGVyCi0JICogdHJhbnNhY3Rpb24sIHdlIG5lZWQgdG8gbGVhdmUgaXQgYXJvdW5kCisJLyogdGhlIHBhZ2UgaXMgbG9ja2VkLCBhbmQgdGhlIG9ubHkgcGxhY2VzIHRoYXQgbG9nIGEgZGF0YSBidWZmZXIKKwkgKiBhbHNvIGxvY2sgdGhlIHBhZ2UuCiAJICovCi0JaWYgKGpoICYmIChqbCA9IGpoLT5qbCkgJiYgamwgIT0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfY3VycmVudF9qbCkKLQkgICAgcmV0ID0gMDsKLSAgICB9Ci1mcmVlX2poOgotICAgIGlmIChyZXQgJiYgYmgtPmJfcHJpdmF0ZSkgewotICAgICAgICByZWlzZXJmc19mcmVlX2poKGJoKTsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7Ci0gICAgcmV0dXJuIHJldCA7CisJaWYgKHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpKSB7CisJCS8qCisJCSAqIHZlcnkgY29uc2VydmF0aXZlLCBsZWF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBpZgorCQkgKiBhbnlvbmUgbWlnaHQgbmVlZCBpdC4KKwkJICovCisJCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJCXJldCA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgfHwgYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJCXN0cnVjdCByZWlzZXJmc19qaCAqamggPSBiaC0+Yl9wcml2YXRlOworCisJCS8qIHdoeSBpcyB0aGlzIHNhZmU/CisJCSAqIHJlaXNlcmZzX3NldGF0dHIgdXBkYXRlcyBpX3NpemUgaW4gdGhlIG9uIGRpc2sKKwkJICogc3RhdCBkYXRhIGJlZm9yZSBhbGxvd2luZyB2bXRydW5jYXRlIHRvIGJlIGNhbGxlZC4KKwkJICoKKwkJICogSWYgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciB0aGlzCisJCSAqIHRyYW5zYWN0aW9uLCB3ZSBrbm93IGZvciBzdXJlIGVpdGhlciB0aGlzIHRyYW5zYWN0aW9uCisJCSAqIG9yIGFuIG9sZGVyIG9uZSBhbHJlYWR5IGhhcyB1cGRhdGVkIGlfc2l6ZSBvbiBkaXNrLAorCQkgKiBhbmQgdGhpcyBvcmRlcmVkIGRhdGEgd29uJ3QgYmUgcmVmZXJlbmNlZCBpbiB0aGUgZmlsZQorCQkgKiBpZiB3ZSBjcmFzaC4KKwkJICoKKwkJICogaWYgdGhlIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgYW4gb2xkZXIKKwkJICogdHJhbnNhY3Rpb24sIHdlIG5lZWQgdG8gbGVhdmUgaXQgYXJvdW5kCisJCSAqLworCQlpZiAoamggJiYgKGpsID0gamgtPmpsKQorCQkgICAgJiYgamwgIT0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfY3VycmVudF9qbCkKKwkJCXJldCA9IDA7CisJfQorICAgICAgZnJlZV9qaDoKKwlpZiAocmV0ICYmIGJoLT5iX3ByaXZhdGUpIHsKKwkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJfQorCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogY2xtIC0tIHRha2VuIGZyb20gZnMvYnVmZmVyLmM6YmxvY2tfaW52YWxpZGF0ZV9wYWdlICovCiBzdGF0aWMgaW50IHJlaXNlcmZzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0gICAgdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKLSAgICBpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgcmV0ID0gMTsKIAotICAgIEJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAotICAgIGlmIChvZmZzZXQgPT0gMCkKLQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCWlmIChvZmZzZXQgPT0gMCkKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKIAotICAgIGlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKLQlnb3RvIG91dDsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWdvdG8gb3V0OwogCi0gICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCXVuc2lnbmVkIGludCBuZXh0X29mZiA9IGN1cnJfb2ZmICsgYmgtPmJfc2l6ZTsKLQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qCisJCSAqIGlzIHRoaXMgYmxvY2sgZnVsbHkgaW52YWxpZGF0ZWQ/CisJCSAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJCQlpZiAoaW52YWxpZGF0ZXBhZ2VfY2FuX2Ryb3AoaW5vZGUsIGJoKSkKKwkJCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOworCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCX0KKwkJY3Vycl9vZmYgPSBuZXh0X29mZjsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOwogCiAJLyoKLQkgKiBpcyB0aGlzIGJsb2NrIGZ1bGx5IGludmFsaWRhdGVkPworCSAqIFdlIHJlbGVhc2UgYnVmZmVycyBvbmx5IGlmIHRoZSBlbnRpcmUgcGFnZSBpcyBiZWluZyBpbnZhbGlkYXRlZC4KKwkgKiBUaGUgZ2V0X2Jsb2NrIGNhY2hlZCB2YWx1ZSBoYXMgYmVlbiB1bmNvbmRpdGlvbmFsbHkgaW52YWxpZGF0ZWQsCisJICogc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KIAkgKi8KLQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7Ci0JICAgIGlmIChpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChpbm9kZSwgYmgpKQotCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOwotCSAgICBlbHNlCi0JICAgICAgICByZXQgPSAwOwotCX0KLQljdXJyX29mZiA9IG5leHRfb2ZmOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlIChiaCAhPSBoZWFkKTsKLQotICAgIC8qCi0gICAgICogV2UgcmVsZWFzZSBidWZmZXJzIG9ubHkgaWYgdGhlIGVudGlyZSBwYWdlIGlzIGJlaW5nIGludmFsaWRhdGVkLgotICAgICAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseSBpbnZhbGlkYXRlZCwKLSAgICAgKiBzbyByZWFsIElPIGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlLgotICAgICAqLwotICAgIGlmICghb2Zmc2V0ICYmIHJldCkKLQlyZXQgPSB0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotb3V0OgotICAgIHJldHVybiByZXQ7CisJaWYgKCFvZmZzZXQgJiYgcmV0KQorCQlyZXQgPSB0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworICAgICAgb3V0OgorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLSAgICBpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKLQlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKLQlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7Ci0gICAgfQotICAgIHJldHVybiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMocGFnZSk7CitzdGF0aWMgaW50IHJlaXNlcmZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgeworCQlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKKwkJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworCX0KKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKHBhZ2UpOwogfQogCiAvKgpAQCAtMjcxNiwxNDMgKzI4MzQsMTUyIEBACiAgKi8KIHN0YXRpYyBpbnQgcmVpc2VyZnNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB1bnVzZWRfZ2ZwX2ZsYWdzKQogewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIGludCByZXQgPSAxIDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQgPSAxOwogCi0gICAgV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7Ci0gICAgc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotICAgIGJoID0gaGVhZCA7Ci0gICAgZG8gewotCWlmIChiaC0+Yl9wcml2YXRlKSB7Ci0JICAgIGlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkJcmVpc2VyZnNfZnJlZV9qaChiaCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXJldCA9IDAgOwotCQlicmVhayA7Ci0JICAgIH0KLQl9Ci0JYmggPSBiaC0+Yl90aGlzX3BhZ2UgOwotICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpIDsKLSAgICBpZiAocmV0KQotCXJldCA9IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkgOwotICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIHJldHVybiByZXQgOworCVdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJoLT5iX3ByaXZhdGUpIHsKKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlpZiAocmV0KQorCQlyZXQgPSB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogV2UgdGhhbmsgTWluZ21pbmcgQ2FvIGZvciBoZWxwaW5nIHVzIHVuZGVyc3RhbmQgaW4gZ3JlYXQgZGV0YWlsIHdoYXQKICAgIHRvIGRvIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZS4gKi8KIHN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJCQkgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQogewotICAgIHN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCi0gICAgcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCW9mZnNldCwgbnJfc2VncywgcmVpc2VyZnNfZ2V0X2Jsb2Nrc19kaXJlY3RfaW8sIE5VTEwpOworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJICByZWlzZXJmc19nZXRfYmxvY2tzX2RpcmVjdF9pbywgTlVMTCk7CiB9CiAKLWludCByZWlzZXJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKSB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZSA7Ci0gICAgaW50IGVycm9yIDsKLSAgICB1bnNpZ25lZCBpbnQgaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZDsKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKLQkvKiB2ZXJzaW9uIDIgaXRlbXMgd2lsbCBiZSBjYXVnaHQgYnkgdGhlIHNfbWF4Ynl0ZXMgY2hlY2sKLQkqKiBkb25lIGZvciB1cyBpbiB2bXRydW5jYXRlCi0JKi8KLQlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpID09IEtFWV9GT1JNQVRfM181ICYmCi0JICAgIGF0dHItPmlhX3NpemUgPiBNQVhfTk9OX0xGUykgewotCSAgICBlcnJvciA9IC1FRkJJRyA7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQkvKiBmaWxsIGluIGhvbGUgcG9pbnRlcnMgaW4gdGhlIGV4cGFuZGluZyB0cnVuY2F0ZSBjYXNlLiAqLwotICAgICAgICBpZiAoYXR0ci0+aWFfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKLQkgICAgZXJyb3IgPSBnZW5lcmljX2NvbnRfZXhwYW5kKGlub2RlLCBhdHRyLT5pYV9zaXplKSA7Ci0JICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKLQkJaW50IGVycjsKLQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0JCS8qIHdlJ3JlIGNoYW5naW5nIGF0IG1vc3QgMiBiaXRtYXBzLCBpbm9kZSArIHN1cGVyICovCi0JCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgNCkgOwotCQlpZiAoIWVycikgewotCQkgICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoJnRoLCBpbm9kZSk7Ci0JCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KSA7Ci0JCX0KLQkJaWYgKGVycikKLQkJICAgIGVycm9yID0gZXJyOwotCSAgICB9Ci0JICAgIGlmIChlcnJvcikKLQkgICAgICAgIGdvdG8gb3V0OwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYgKGF0dHItPmlhX3VpZCAmIH4weGZmZmYpKSB8fAotCSAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIChhdHRyLT5pYV9naWQgJiB+MHhmZmZmKSkpICYmCi0JKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKSkgewotCQkvKiBzdGF0IGRhdGEgb2YgZm9ybWF0IHYzLjUgaGFzIDE2IGJpdCB1aWQgYW5kIGdpZCAqLwotCSAgICBlcnJvciA9IC1FSU5WQUw7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQotICAgIGVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKSA7Ci0gICAgaWYgKCFlcnJvcikgewotCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKSB8fAotCSAgICAoaWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgewotICAgICAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfY2hvd25feGF0dHJzIChpbm9kZSwgYXR0cik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7Ci0JCSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotCQkgICAgaW50IGpiZWdpbl9jb3VudCA9IDIqKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKStSRUlTRVJGU19RVU9UQV9ERUxfQkxPQ0tTKGlub2RlLT5pX3NiKSkrMjsKLQotCQkgICAgLyogKHVzZXIrZ3JvdXApKihvbGQrbmV3KSBzdHJ1Y3R1cmUgLSB3ZSBjb3VudCBxdW90YSBpbmZvIGFuZCAsIGlub2RlIHdyaXRlIChzYiwgaW5vZGUpICovCi0JCSAgICBlcnJvciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKLSAJCSAgICBpZiAoZXJyb3IpCi0gCQkJZ290byBvdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7Ci0JCSAgICBpZiAoZXJyb3IpIHsKLQkJCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CitpbnQgcmVpc2VyZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZDsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJLyogdmVyc2lvbiAyIGl0ZW1zIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBzX21heGJ5dGVzIGNoZWNrCisJCSAqKiBkb25lIGZvciB1cyBpbiB2bXRydW5jYXRlCisJCSAqLworCQlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpID09IEtFWV9GT1JNQVRfM181ICYmCisJCSAgICBhdHRyLT5pYV9zaXplID4gTUFYX05PTl9MRlMpIHsKKwkJCWVycm9yID0gLUVGQklHOwogCQkJZ290byBvdXQ7Ci0JCSAgICB9Ci0JCSAgICAvKiBVcGRhdGUgY29ycmVzcG9uZGluZyBpbmZvIGluIGlub2RlIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBpbgotCQkgICAgICogb25lIHRyYW5zYWN0aW9uICovCi0JCSAgICBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKLQkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKLQkJICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQotCQkJaW5vZGUtPmlfZ2lkID0gYXR0ci0+aWFfZ2lkOwotCQkgICAgbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JCSAgICBlcnJvciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CiAJCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWVycm9yKQotICAgICAgICAgICAgZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKSA7Ci0gICAgfQorCQkvKiBmaWxsIGluIGhvbGUgcG9pbnRlcnMgaW4gdGhlIGV4cGFuZGluZyB0cnVuY2F0ZSBjYXNlLiAqLworCQlpZiAoYXR0ci0+aWFfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKKwkJCWVycm9yID0gZ2VuZXJpY19jb250X2V4cGFuZChpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCQlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJCQkJaW50IGVycjsKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCQkJCS8qIHdlJ3JlIGNoYW5naW5nIGF0IG1vc3QgMiBiaXRtYXBzLCBpbm9kZSArIHN1cGVyICovCisJCQkJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCA0KTsKKwkJCQlpZiAoIWVycikgeworCQkJCQlyZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKCZ0aCwgaW5vZGUpOworCQkJCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KTsKKwkJCQl9CisJCQkJaWYgKGVycikKKwkJCQkJZXJyb3IgPSBlcnI7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKKwlpZiAoKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYgKGF0dHItPmlhX3VpZCAmIH4weGZmZmYpKSB8fAorCSAgICAgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSAmJiAoYXR0ci0+aWFfZ2lkICYgfjB4ZmZmZikpKSAmJgorCSAgICAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSkpIHsKKwkJLyogc3RhdCBkYXRhIG9mIGZvcm1hdCB2My41IGhhcyAxNiBiaXQgdWlkIGFuZCBnaWQgKi8KKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBpZiAoIWVycm9yICYmIHJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpIHsKLSAgICAgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQotICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19hY2xfY2htb2QgKGlub2RlKTsKLSAgICB9CisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJCSAgICAoaWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgeworCQkJZXJyb3IgPSByZWlzZXJmc19jaG93bl94YXR0cnMoaW5vZGUsIGF0dHIpOwogCi1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyb3IgOworCQkJaWYgKCFlcnJvcikgeworCQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCQkJaW50IGpiZWdpbl9jb3VudCA9CisJCQkJICAgIDIgKgorCQkJCSAgICAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpICsKKwkJCQkgICAgIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKSArCisJCQkJICAgIDI7CisKKwkJCQkvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSAtIHdlIGNvdW50IHF1b3RhIGluZm8gYW5kICwgaW5vZGUgd3JpdGUgKHNiLCBpbm9kZSkgKi8KKwkJCQllcnJvciA9CisJCQkJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJCSAgamJlZ2luX2NvdW50KTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gb3V0OworCQkJCWVycm9yID0KKwkJCQkgICAgRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsCisJCQkJCQkgICAgamJlZ2luX2NvdW50KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCS8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCQkJICogb25lIHRyYW5zYWN0aW9uICovCisJCQkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCQkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkKKwkJCQkJaW5vZGUtPmlfZ2lkID0gYXR0ci0+aWFfZ2lkOworCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCWVycm9yID0KKwkJCQkgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJCX0KKwkJfQorCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKTsKKwl9CisKKwlpZiAoIWVycm9yICYmIHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkgeworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCisJCQllcnJvciA9IHJlaXNlcmZzX2FjbF9jaG1vZChpbm9kZSk7CisJfQorCisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLQotCiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA9IHsKLSAgICAud3JpdGVwYWdlID0gcmVpc2VyZnNfd3JpdGVwYWdlLAotICAgIC5yZWFkcGFnZSA9IHJlaXNlcmZzX3JlYWRwYWdlLCAKLSAgICAucmVhZHBhZ2VzID0gcmVpc2VyZnNfcmVhZHBhZ2VzLCAKLSAgICAucmVsZWFzZXBhZ2UgPSByZWlzZXJmc19yZWxlYXNlcGFnZSwKLSAgICAuaW52YWxpZGF0ZXBhZ2UgPSByZWlzZXJmc19pbnZhbGlkYXRlcGFnZSwKLSAgICAuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAotICAgIC5wcmVwYXJlX3dyaXRlID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZSwKLSAgICAuY29tbWl0X3dyaXRlID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlLAotICAgIC5ibWFwID0gcmVpc2VyZnNfYW9wX2JtYXAsCi0gICAgLmRpcmVjdF9JTyA9IHJlaXNlcmZzX2RpcmVjdF9JTywKLSAgICAuc2V0X3BhZ2VfZGlydHkgPSByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eSwKLX0gOworCS53cml0ZXBhZ2UgPSByZWlzZXJmc193cml0ZXBhZ2UsCisJLnJlYWRwYWdlID0gcmVpc2VyZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IHJlaXNlcmZzX3JlYWRwYWdlcywKKwkucmVsZWFzZXBhZ2UgPSByZWlzZXJmc19yZWxlYXNlcGFnZSwKKwkuaW52YWxpZGF0ZXBhZ2UgPSByZWlzZXJmc19pbnZhbGlkYXRlcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gcmVpc2VyZnNfYW9wX2JtYXAsCisJLmRpcmVjdF9JTyA9IHJlaXNlcmZzX2RpcmVjdF9JTywKKwkuc2V0X3BhZ2VfZGlydHkgPSByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eSwKK307CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pb2N0bC5jIGIvZnMvcmVpc2VyZnMvaW9jdGwuYwppbmRleCA5NGRjNDI0Li44MWZjMDAyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pb2N0bC5jCisrKyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAogLyoKICoqIHJlaXNlcmZzX2lvY3RsIC0gaGFuZGxlciBmb3IgaW9jdGwgZm9yIGlub2RlCkBAIC0xOSw2MyArMTksNzIgQEAKICoqICAyKSBSRUlTRVJGU19JT0NfW0dTXUVURkxBR1MsIFJFSVNFUkZTX0lPQ19bR1NdRVRWRVJTSU9OCiAqKiAgMykgVGhhdCdzIGFsbCBmb3IgYSB3aGlsZSAuLi4KICovCi1pbnQgcmVpc2VyZnNfaW9jdGwgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQoraW50IHJlaXNlcmZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAlzd2l0Y2ggKGNtZCkgewotCSAgICBjYXNlIFJFSVNFUkZTX0lPQ19VTlBBQ0s6Ci0JCWlmKCBTX0lTUkVHKCBpbm9kZSAtPiBpX21vZGUgKSApIHsKLQkJaWYgKGFyZykKLQkJICAgIHJldHVybiByZWlzZXJmc191bnBhY2sgKGlub2RlLCBmaWxwKTsKKwljYXNlIFJFSVNFUkZTX0lPQ19VTlBBQ0s6CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpZiAoYXJnKQorCQkJCXJldHVybiByZWlzZXJmc191bnBhY2soaW5vZGUsIGZpbHApOwogCQkJZWxzZQogCQkJCXJldHVybiAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRU5PVFRZOwotCS8qIGZvbGxvd2luZyB0d28gY2FzZXMgYXJlIHRha2VuIGZyb20gZnMvZXh0Mi9pb2N0bC5jIGJ5IFJlbXkKLQkgICBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKSAqLworCQkvKiBmb2xsb3dpbmcgdHdvIGNhc2VzIGFyZSB0YWtlbiBmcm9tIGZzL2V4dDIvaW9jdGwuYyBieSBSZW15CisJCSAgIENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpICovCiAJY2FzZSBSRUlTRVJGU19JT0NfR0VURkxBR1M6Ci0JCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRyczsKLQkJaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICggX191MTYgKiApICZmbGFncyApOwotCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7Ci0JY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6IHsKLQkJaWYgKElTX1JET05MWShpbm9kZSkpCi0JCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoIXJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkKKwkJCXJldHVybiAtRU5PVFRZOwogCi0JCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKLQkJCXJldHVybiAtRVBFUk07CisJCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisJCWlfYXR0cnNfdG9fc2RfYXR0cnMoaW5vZGUsIChfX3UxNiAqKSAmIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6eworCQkJaWYgKCFyZWlzZXJmc19hdHRycyhpbm9kZS0+aV9zYikpCisJCQkJcmV0dXJuIC1FTk9UVFk7CiAKLQkJaWYgKGdldF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJCQlyZXR1cm4gLUVST0ZTOwogCi0JCWlmICggKCAoIGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycykgJiAoIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCB8IFJFSVNFUkZTX0FQUEVORF9GTCkpICYmCi0JCSAgICAgIWNhcGFibGUoIENBUF9MSU5VWF9JTU1VVEFCTEUgKSApCi0JCQlyZXR1cm4gLUVQRVJNOwotCQkJCi0JCWlmKCAoIGZsYWdzICYgUkVJU0VSRlNfTk9UQUlMX0ZMICkgJiYKLQkJICAgIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgeworCQkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpCisJCQkgICAgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKGdldF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICgoKGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSktPgorCQkJICAgICAgaV9hdHRycykgJiAoUkVJU0VSRlNfSU1NVVRBQkxFX0ZMIHwKKwkJCQkJICBSRUlTRVJGU19BUFBFTkRfRkwpKQorCQkJICAgICYmICFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWlmICgoZmxhZ3MgJiBSRUlTRVJGU19OT1RBSUxfRkwpICYmCisJCQkgICAgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJCWludCByZXN1bHQ7CiAKLQkJCQlyZXN1bHQgPSByZWlzZXJmc191bnBhY2soIGlub2RlLCBmaWxwICk7Ci0JCQkJaWYoIHJlc3VsdCApCisJCQkJcmVzdWx0ID0gcmVpc2VyZnNfdW5wYWNrKGlub2RlLCBmaWxwKTsKKwkJCQlpZiAocmVzdWx0KQogCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJc2RfYXR0cnNfdG9faV9hdHRycyhmbGFncywgaW5vZGUpOworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPSBmbGFnczsKKwkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJcmV0dXJuIDA7CiAJCX0KLQkJc2RfYXR0cnNfdG9faV9hdHRycyggZmxhZ3MsIGlub2RlICk7Ci0JCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnMgPSBmbGFnczsKLQkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJcmV0dXJuIDA7Ci0JfQogCWNhc2UgUkVJU0VSRlNfSU9DX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKilhcmcpOwogCWNhc2UgUkVJU0VSRlNfSU9DX1NFVFZFUlNJT046CiAJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCWlmIChJU19SRE9OTFkoaW5vZGUpKQogCQkJcmV0dXJuIC1FUk9GUzsKLQkJaWYgKGdldF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsJCisJCWlmIChnZXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJcmV0dXJuIDA7CkBAIC04OSw2MyArOTgsNjUgQEAKICoqIEZ1bmN0aW9uIHRyeSB0byBjb252ZXJ0IHRhaWwgZnJvbSBkaXJlY3QgaXRlbSBpbnRvIGluZGlyZWN0LgogKiogSXQgc2V0IHVwIG5vcGFjayBhdHRyaWJ1dGUgaW4gdGhlIFJFSVNFUkZTX0koaW5vZGUpLT5ub3BhY2sKICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3VucGFjayAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotICAgIGludCByZXR2YWwgPSAwOwotICAgIGludCBpbmRleCA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2UgOwotICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nIDsKLSAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2Zyb20gOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICAJCi0gICAgaWYgKGlub2RlLT5pX3NpemUgPT0gMCkgewotICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIC8qIGlvY3RsIGFscmVhZHkgZG9uZSAqLwotICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spIHsKLSAgICAgICAgcmV0dXJuIDAgOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJdW5zaWduZWQgbG9uZyB3cml0ZV9mcm9tOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCi0gICAgLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAotICAgICoqIHVzCi0gICAgKi8KLSAgICBkb3duKCZpbm9kZS0+aV9zZW0pIDsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKSB7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CisJCXJldHVybiAwOworCX0KKwkvKiBpb2N0bCBhbHJlYWR5IGRvbmUgKi8KKwlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJCXJldHVybiAwOworCX0KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotICAgIHdyaXRlX2Zyb20gPSBpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpIDsKLSAgICAvKiBpZiB3ZSBhcmUgb24gYSBibG9jayBib3VuZGFyeSwgd2UgYXJlIGFscmVhZHkgdW5wYWNrZWQuICAqLwotICAgIGlmICggd3JpdGVfZnJvbSA9PSAwKSB7CisJLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAorCSAqKiB1cworCSAqLworCWRvd24oJmlub2RlLT5pX3NlbSk7CisKKwl3cml0ZV9mcm9tID0gaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKTsKKwkvKiBpZiB3ZSBhcmUgb24gYSBibG9jayBib3VuZGFyeSwgd2UgYXJlIGFscmVhZHkgdW5wYWNrZWQuICAqLworCWlmICh3cml0ZV9mcm9tID09IDApIHsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9ub3BhY2tfbWFzazsKKwkJZ290byBvdXQ7CisJfQorCisJLyogd2UgdW5wYWNrIGJ5IGZpbmRpbmcgdGhlIHBhZ2Ugd2l0aCB0aGUgdGFpbCwgYW5kIGNhbGxpbmcKKwkgKiogcmVpc2VyZnNfcHJlcGFyZV93cml0ZSBvbiB0aGF0IHBhZ2UuICBUaGlzIHdpbGwgZm9yY2UgYSAKKwkgKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIHVucGFjayB0aGUgdGFpbCBmb3IgdXMuCisJICovCisJaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpIHsKKwkJZ290byBvdXQ7CisJfQorCXJldHZhbCA9CisJICAgIG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIGNvbnZlcnNpb24gY2FuIGNoYW5nZSBwYWdlIGNvbnRlbnRzLCBtdXN0IGZsdXNoICovCisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJcmV0dmFsID0KKwkgICAgbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCB3cml0ZV9mcm9tLCB3cml0ZV9mcm9tKTsKIAlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotCWdvdG8gb3V0IDsKLSAgICB9CiAKLSAgICAvKiB3ZSB1bnBhY2sgYnkgZmluZGluZyB0aGUgcGFnZSB3aXRoIHRoZSB0YWlsLCBhbmQgY2FsbGluZwotICAgICoqIHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUgb24gdGhhdCBwYWdlLiAgVGhpcyB3aWxsIGZvcmNlIGEgCi0gICAgKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIHVucGFjayB0aGUgdGFpbCBmb3IgdXMuCi0gICAgKi8KLSAgICBpbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmcgOwotICAgIHBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpIDsKLSAgICByZXR2YWwgPSAtRU5PTUVNOwotICAgIGlmICghcGFnZSkgewotICAgICAgICBnb3RvIG91dCA7Ci0gICAgfQotICAgIHJldHZhbCA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF91bmxvY2sgOworICAgICAgb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKLSAgICAvKiBjb252ZXJzaW9uIGNhbiBjaGFuZ2UgcGFnZSBjb250ZW50cywgbXVzdCBmbHVzaCAqLwotICAgIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKLSAgICByZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pIDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotCi1vdXRfdW5sb2NrOgotICAgIHVubG9ja19wYWdlKHBhZ2UpIDsKLSAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSkgOwotCi1vdXQ6Ci0gICAgdXAoJmlub2RlLT5pX3NlbSkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIG91dDoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pdGVtX29wcy5jIGIvZnMvcmVpc2VyZnMvaXRlbV9vcHMuYwppbmRleCAwY2UzM2RiLi5lMjM3Y2Q2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pdGVtX29wcy5jCisrKyBiL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMKQEAgLTE0LDc3NiArMTQsNzQxIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIHN0YXQgZGF0YSBmdW5jdGlvbnMKIC8vCi1zdGF0aWMgaW50IHNkX2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgc2RfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIHZvaWQgc2RfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCAtLTsKLSAgICBzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgVFlQRV9BTlkpOwotICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KGtleSwgKGxvZmZfdCkoLTEpKTsKKwlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQtLTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoa2V5LCBUWVBFX0FOWSk7CisJc2V0X2NwdV9rZXlfa19vZmZzZXQoa2V5LCAobG9mZl90KSAoLTEpKTsKIH0KIAotc3RhdGljIGludCBzZF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgc2RfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi0KLQotc3RhdGljIGNoYXIgKiBwcmludF90aW1lICh0aW1lX3QgdCkKK3N0YXRpYyBjaGFyICpwcmludF90aW1lKHRpbWVfdCB0KQogewotICAgIHN0YXRpYyBjaGFyIHRpbWVidWZbMjU2XTsKKwlzdGF0aWMgY2hhciB0aW1lYnVmWzI1Nl07CiAKLSAgICBzcHJpbnRmICh0aW1lYnVmLCAiJWxkIiwgdCk7Ci0gICAgcmV0dXJuIHRpbWVidWY7CisJc3ByaW50Zih0aW1lYnVmLCAiJWxkIiwgdCk7CisJcmV0dXJuIHRpbWVidWY7CiB9CiAKLQotc3RhdGljIHZvaWQgc2RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIHNkX3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcHJpbnRrICgiXHRtb2RlIHwgc2l6ZSB8IG5saW5rcyB8IGZpcnN0IGRpcmVjdCB8IG10aW1lXG4iKTsKLSAgICBpZiAoc3RhdF9kYXRhX3YxIChpaCkpIHsKLSAgICAgIAlzdHJ1Y3Qgc3RhdF9kYXRhX3YxICogc2QgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKWl0ZW07CisJcHJpbnRrKCJcdG1vZGUgfCBzaXplIHwgbmxpbmtzIHwgZmlyc3QgZGlyZWN0IHwgbXRpbWVcbiIpOworCWlmIChzdGF0X2RhdGFfdjEoaWgpKSB7CisJCXN0cnVjdCBzdGF0X2RhdGFfdjEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilpdGVtOwogCi0JcHJpbnRrICgiXHQwJS02byB8ICU2dSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YxX21vZGUoc2QpLAotICAgICAgICAgICAgICAgIHNkX3YxX3NpemUoc2QpLCBzZF92MV9ubGluayhzZCksIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKSwKLSAgICAgICAgICAgICAgICBwcmludF90aW1lKCBzZF92MV9tdGltZShzZCkgKSApOwotICAgIH0gZWxzZSB7Ci0Jc3RydWN0IHN0YXRfZGF0YSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilpdGVtOworCQlwcmludGsoIlx0MCUtNm8gfCAlNnUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92MV9tb2RlKHNkKSwKKwkJICAgICAgIHNkX3YxX3NpemUoc2QpLCBzZF92MV9ubGluayhzZCksCisJCSAgICAgICBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCksCisJCSAgICAgICBwcmludF90aW1lKHNkX3YxX210aW1lKHNkKSkpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzdGF0X2RhdGEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilpdGVtOwogCi0JcHJpbnRrICgiXHQwJS02byB8ICU2THUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92Ml9tb2RlKHNkKSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2RfdjJfc2l6ZShzZCksIHNkX3YyX25saW5rKHNkKSwKLSAgICAgICAgICAgIHNkX3YyX3JkZXYoc2QpLCBwcmludF90aW1lKHNkX3YyX210aW1lKHNkKSkpOwotICAgIH0KKwkJcHJpbnRrKCJcdDAlLTZvIHwgJTZMdSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YyX21vZGUoc2QpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZF92Ml9zaXplKHNkKSwgc2RfdjJfbmxpbmsoc2QpLAorCQkgICAgICAgc2RfdjJfcmRldihzZCksIHByaW50X3RpbWUoc2RfdjJfbXRpbWUoc2QpKSk7CisJfQogfQogCi1zdGF0aWMgdm9pZCBzZF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgc2RfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKwkvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAotCQkJIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCi0JCQkgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSBpbnQgaW5zZXJ0X3NpemUpCitzdGF0aWMgaW50IHNkX2NyZWF0ZV92aShzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biwKKwkJCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLAorCQkJaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpCiB7Ci0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9TVEFUX0RBVEE7Ci0gICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX1NUQVRfREFUQTsvLyBub3QgbmVlZGVkPwotICAgIHJldHVybiAwOworCXZpLT52aV9pbmRleCA9IFRZUEVfU1RBVF9EQVRBOworCS8vdmktPnZpX3R5cGUgfD0gVklfVFlQRV9TVEFUX0RBVEE7Ly8gbm90IG5lZWRlZD8KKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsIAotCQkJICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQorc3RhdGljIGludCBzZF9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQogewotICAgIGlmIChzdGFydF9za2lwIHx8IGVuZF9za2lwKQotCUJVRyAoKTsKLSAgICByZXR1cm4gLTE7CisJaWYgKHN0YXJ0X3NraXAgfHwgZW5kX3NraXApCisJCUJVRygpOworCXJldHVybiAtMTsKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBzZF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgcmV0dXJuIC0xOworCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBzZF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCitzdGF0aWMgaW50IHNkX3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgaWYgKGNvdW50KQotCUJVRyAoKTsKLSAgICByZXR1cm4gMDsKKwlpZiAoY291bnQpCisJCUJVRygpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgaW50IHNkX3VuaXRfbnVtKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOworCXJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOwogfQogCi0KLXN0YXRpYyB2b2lkIHNkX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBzZF9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiU1RBVERBVEEsIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoIiwKLQkJICAgICAgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJTVEFUREFUQSwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkJIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIHN0YXRfZGF0YV9vcHMgPSB7Ci0JLmJ5dGVzX251bWJlcgkJPSBzZF9ieXRlc19udW1iZXIsCi0JLmRlY3JlbWVudF9rZXkJCT0gc2RfZGVjcmVtZW50X2tleSwKLQkuaXNfbGVmdF9tZXJnZWFibGUJPSBzZF9pc19sZWZ0X21lcmdlYWJsZSwKLQkucHJpbnRfaXRlbQkJPSBzZF9wcmludF9pdGVtLAotCS5jaGVja19pdGVtCQk9IHNkX2NoZWNrX2l0ZW0sCisJLmJ5dGVzX251bWJlciA9IHNkX2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleSA9IHNkX2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlID0gc2RfaXNfbGVmdF9tZXJnZWFibGUsCisJLnByaW50X2l0ZW0gPSBzZF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtID0gc2RfY2hlY2tfaXRlbSwKIAotCS5jcmVhdGVfdmkJCT0gc2RfY3JlYXRlX3ZpLAotCS5jaGVja19sZWZ0CQk9IHNkX2NoZWNrX2xlZnQsCi0JLmNoZWNrX3JpZ2h0CQk9IHNkX2NoZWNrX3JpZ2h0LAotCS5wYXJ0X3NpemUJCT0gc2RfcGFydF9zaXplLAotCS51bml0X251bQkJPSBzZF91bml0X251bSwKLQkucHJpbnRfdmkJCT0gc2RfcHJpbnRfdmkKKwkuY3JlYXRlX3ZpID0gc2RfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0ID0gc2RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQgPSBzZF9jaGVja19yaWdodCwKKwkucGFydF9zaXplID0gc2RfcGFydF9zaXplLAorCS51bml0X251bSA9IHNkX3VuaXRfbnVtLAorCS5wcmludF92aSA9IHNkX3ByaW50X3ZpCiB9OwogCi0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBkaXJlY3QgaXRlbSBmdW5jdGlvbnMKIC8vCi1zdGF0aWMgaW50IGRpcmVjdF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCitzdGF0aWMgaW50IGRpcmVjdF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpOworCXJldHVybiBpaF9pdGVtX2xlbihpaCk7CiB9CiAKLQogLy8gRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHN3aXRjaCB0byBpbmRpcmVjdCBhcyB3ZWxsCi1zdGF0aWMgdm9pZCBkaXJlY3RfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBkaXJlY3RfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOwotICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCi0Jc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsJCisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlKHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBic2l6ZSkKIHsKLSAgICBpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOwotICAgIHJldHVybiAoKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSAmIChic2l6ZSAtIDEpKSAhPSAxKTsKKwlpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisJcmV0dXJuICgobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkgJiAoYnNpemUgLSAxKSkgIT0gMSk7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBpbnQgaiA9IDA7CisJaW50IGogPSAwOwogCiAvLyAgICByZXR1cm47Ci0gICAgcHJpbnRrICgiXCIiKTsKLSAgICB3aGlsZSAoaiA8IGloX2l0ZW1fbGVuKGloKSkKLQlwcmludGsgKCIlYyIsIGl0ZW1baisrXSk7Ci0gICAgcHJpbnRrICgiXCJcbiIpOworCXByaW50aygiXCIiKTsKKwl3aGlsZSAoaiA8IGloX2l0ZW1fbGVuKGloKSkKKwkJcHJpbnRrKCIlYyIsIGl0ZW1baisrXSk7CisJcHJpbnRrKCJcIlxuIik7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBkaXJlY3RfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKwkvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKLQkJCSAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSAgICAgaW50IGluc2VydF9zaXplKQorc3RhdGljIGludCBkaXJlY3RfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLAorCQkJICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKQogewotICAgIHZpLT52aV9pbmRleCA9IFRZUEVfRElSRUNUOwotICAgIC8vdmktPnZpX3R5cGUgfD0gVklfVFlQRV9ESVJFQ1Q7Ci0gICAgcmV0dXJuIDA7CisJdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFQ1Q7CisJLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0RJUkVDVDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkaXJlY3RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKLQkJCSAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IGRpcmVjdF9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKIHsKLSAgICBpbnQgYnl0ZXM7CisJaW50IGJ5dGVzOwogCi0gICAgYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIDg7Ci0gICAgcmV0dXJuIGJ5dGVzID86IC0xOyAgICAKKwlieXRlcyA9IGZyZWUgLSBmcmVlICUgODsKKwlyZXR1cm4gYnl0ZXMgPyA6IC0xOwogfQogCi0KLXN0YXRpYyBpbnQgZGlyZWN0X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBkaXJlY3RfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQogewotICAgIHJldHVybiBkaXJlY3RfY2hlY2tfbGVmdCAodmksIGZyZWUsIDAsIDApOworCXJldHVybiBkaXJlY3RfY2hlY2tfbGVmdCh2aSwgZnJlZSwgMCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgZGlyZWN0X3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZGlyZWN0X3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgcmV0dXJuIGNvdW50OworCXJldHVybiBjb3VudDsKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQorc3RhdGljIGludCBkaXJlY3RfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CisJcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfdmkoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAotCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkJIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGRpcmVjdF9vcHMgPSB7Ci0JLmJ5dGVzX251bWJlcgkJPSBkaXJlY3RfYnl0ZXNfbnVtYmVyLAotCS5kZWNyZW1lbnRfa2V5CQk9IGRpcmVjdF9kZWNyZW1lbnRfa2V5LAotCS5pc19sZWZ0X21lcmdlYWJsZQk9IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKLQkucHJpbnRfaXRlbQkJPSBkaXJlY3RfcHJpbnRfaXRlbSwKLQkuY2hlY2tfaXRlbQkJPSBkaXJlY3RfY2hlY2tfaXRlbSwKKwkuYnl0ZXNfbnVtYmVyID0gZGlyZWN0X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleSA9IGRpcmVjdF9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZSA9IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbSA9IGRpcmVjdF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtID0gZGlyZWN0X2NoZWNrX2l0ZW0sCiAKLQkuY3JlYXRlX3ZpCQk9IGRpcmVjdF9jcmVhdGVfdmksCi0JLmNoZWNrX2xlZnQJCT0gZGlyZWN0X2NoZWNrX2xlZnQsCi0JLmNoZWNrX3JpZ2h0CQk9IGRpcmVjdF9jaGVja19yaWdodCwKLQkucGFydF9zaXplCQk9IGRpcmVjdF9wYXJ0X3NpemUsCi0JLnVuaXRfbnVtCQk9IGRpcmVjdF91bml0X251bSwKLQkucHJpbnRfdmkJCT0gZGlyZWN0X3ByaW50X3ZpCisJLmNyZWF0ZV92aSA9IGRpcmVjdF9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQgPSBkaXJlY3RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQgPSBkaXJlY3RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZSA9IGRpcmVjdF9wYXJ0X3NpemUsCisJLnVuaXRfbnVtID0gZGlyZWN0X3VuaXRfbnVtLAorCS5wcmludF92aSA9IGRpcmVjdF9wcmludF92aQogfTsKIAotCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gaW5kaXJlY3QgaXRlbSBmdW5jdGlvbnMKIC8vCiAKLXN0YXRpYyBpbnQgaW5kaXJlY3RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQorc3RhdGljIGludCBpbmRpcmVjdF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUgKiBibG9ja19zaXplOyAvLy0gZ2V0X2loX2ZyZWVfc3BhY2UgKGloKTsKKwlyZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUgKiBibG9ja19zaXplOwkvLy0gZ2V0X2loX2ZyZWVfc3BhY2UgKGloKTsKIH0KIAotCiAvLyBkZWNyZWFzZSBvZmZzZXQsIGlmIGl0IGJlY29tZXMgMCwgY2hhbmdlIHR5cGUgdG8gc3RhdCBkYXRhCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2RlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoa2V5KTsKLSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSA9PSAwKQotCXNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX1NUQVRfREFUQSk7CisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKIH0KIAotCiAvLyBpZiBpdCBpcyBub3QgZmlyc3QgaXRlbSBvZiB0aGUgYm9keSwgdGhlbiBpdCBpcyBtZXJnZWFibGUKLXN0YXRpYyBpbnQgaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCitzdGF0aWMgaW50IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlKHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJzaXplKQogewotICAgIGludCB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGtleSk7Ci0gICAgcmV0dXJuIChsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIGtleSkgIT0gMSk7CisJaW50IHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbihrZXkpOworCXJldHVybiAobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkgIT0gMSk7CiB9CiAKLQogLy8gcHJpbnRpbmcgb2YgaW5kaXJlY3QgaXRlbQotc3RhdGljIHZvaWQgc3RhcnRfbmV3X3NlcXVlbmNlIChfX3UzMiAqIHN0YXJ0LCBpbnQgKiBsZW4sIF9fdTMyIG5ldykKK3N0YXRpYyB2b2lkIHN0YXJ0X25ld19zZXF1ZW5jZShfX3UzMiAqIHN0YXJ0LCBpbnQgKmxlbiwgX191MzIgbmV3KQogewotICAgICpzdGFydCA9IG5ldzsKLSAgICAqbGVuID0gMTsKKwkqc3RhcnQgPSBuZXc7CisJKmxlbiA9IDE7CiB9CiAKLQotc3RhdGljIGludCBzZXF1ZW5jZV9maW5pc2hlZCAoX191MzIgc3RhcnQsIGludCAqIGxlbiwgX191MzIgbmV3KQorc3RhdGljIGludCBzZXF1ZW5jZV9maW5pc2hlZChfX3UzMiBzdGFydCwgaW50ICpsZW4sIF9fdTMyIG5ldykKIHsKLSAgICBpZiAoc3RhcnQgPT0gSU5UX01BWCkKLQlyZXR1cm4gMTsKKwlpZiAoc3RhcnQgPT0gSU5UX01BWCkKKwkJcmV0dXJuIDE7CiAKLSAgICBpZiAoc3RhcnQgPT0gMCAmJiBuZXcgPT0gMCkgewotCSgqbGVuKSArKzsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0ICE9IDAgJiYgKHN0YXJ0ICsgKmxlbikgPT0gbmV3KSB7Ci0JKCpsZW4pICsrOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UgKF9fdTMyIHN0YXJ0LCBpbnQgbGVuKQotewotICAgIGlmIChzdGFydCA9PSBJTlRfTUFYKQotCXJldHVybjsKLQotICAgIGlmIChsZW4gPT0gMSkKLQlwcmludGsgKCIgJWQiLCBzdGFydCk7Ci0gICAgZWxzZQotCXByaW50ayAoIiAlZCglZCkiLCBzdGFydCwgbGVuKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQotewotICAgIGludCBqOwotICAgIF9fbGUzMiAqIHVucDsKLSAgICBfX3UzMiBwcmV2ID0gSU5UX01BWDsKLSAgICBpbnQgbnVtOwotCi0gICAgdW5wID0gKF9fbGUzMiAqKWl0ZW07Ci0KLSAgICBpZiAoaWhfaXRlbV9sZW4oaWgpICUgVU5GTV9QX1NJWkUpCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImluZGlyZWN0X3ByaW50X2l0ZW06IGludmFsaWQgaXRlbSBsZW4iKTsKLQotICAgIHByaW50ayAoIiVkIHBvaW50ZXJzXG5bICIsIChpbnQpSV9VTkZNX05VTSAoaWgpKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgSV9VTkZNX05VTSAoaWgpOyBqICsrKSB7Ci0JaWYgKHNlcXVlbmNlX2ZpbmlzaGVkIChwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpKSB7Ci0JICAgIHByaW50X3NlcXVlbmNlIChwcmV2LCBudW0pOwotCSAgICBzdGFydF9uZXdfc2VxdWVuY2UgKCZwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpOworCWlmIChzdGFydCA9PSAwICYmIG5ldyA9PSAwKSB7CisJCSgqbGVuKSsrOworCQlyZXR1cm4gMDsKIAl9Ci0gICAgfQotICAgIHByaW50X3NlcXVlbmNlIChwcmV2LCBudW0pOwotICAgIHByaW50ayAoIl1cbiIpOworCWlmIChzdGFydCAhPSAwICYmIChzdGFydCArICpsZW4pID09IG5ldykgeworCQkoKmxlbikrKzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UoX191MzIgc3RhcnQsIGludCBsZW4pCiB7Ci0gICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCisJaWYgKHN0YXJ0ID09IElOVF9NQVgpCisJCXJldHVybjsKKworCWlmIChsZW4gPT0gMSkKKwkJcHJpbnRrKCIgJWQiLCBzdGFydCk7CisJZWxzZQorCQlwcmludGsoIiAlZCglZCkiLCBzdGFydCwgbGVuKTsKIH0KIAotCi1zdGF0aWMgaW50IGluZGlyZWN0X2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAotCQkJICAgICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCi0JCQkgICAgICAgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSAgICAgICBpbnQgaW5zZXJ0X3NpemUpCitzdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF9pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIHZpLT52aV9pbmRleCA9IFRZUEVfSU5ESVJFQ1Q7Ci0gICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0lORElSRUNUOwotICAgIHJldHVybiAwOworCWludCBqOworCV9fbGUzMiAqdW5wOworCV9fdTMyIHByZXYgPSBJTlRfTUFYOworCWludCBudW07CisKKwl1bnAgPSAoX19sZTMyICopIGl0ZW07CisKKwlpZiAoaWhfaXRlbV9sZW4oaWgpICUgVU5GTV9QX1NJWkUpCisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgImluZGlyZWN0X3ByaW50X2l0ZW06IGludmFsaWQgaXRlbSBsZW4iKTsKKworCXByaW50aygiJWQgcG9pbnRlcnNcblsgIiwgKGludClJX1VORk1fTlVNKGloKSk7CisJZm9yIChqID0gMDsgaiA8IElfVU5GTV9OVU0oaWgpOyBqKyspIHsKKwkJaWYgKHNlcXVlbmNlX2ZpbmlzaGVkKHByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSkpIHsKKwkJCXByaW50X3NlcXVlbmNlKHByZXYsIG51bSk7CisJCQlzdGFydF9uZXdfc2VxdWVuY2UoJnByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSk7CisJCX0KKwl9CisJcHJpbnRfc2VxdWVuY2UocHJldiwgbnVtKTsKKwlwcmludGsoIl1cbiIpOwogfQogCi1zdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCi0JCQkJaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2NoZWNrX2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgaW50IGJ5dGVzOwotCi0gICAgYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIFVORk1fUF9TSVpFOwotICAgIHJldHVybiBieXRlcyA/OiAtMTsgICAgCisJLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCiB9CiAKLQotc3RhdGljIGludCBpbmRpcmVjdF9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICByZXR1cm4gaW5kaXJlY3RfY2hlY2tfbGVmdCAodmksIGZyZWUsIDAsIDApOworCXZpLT52aV9pbmRleCA9IFRZUEVfSU5ESVJFQ1Q7CisJLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0lORElSRUNUOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisJaW50IGJ5dGVzOwogCisJYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIFVORk1fUF9TSVpFOworCXJldHVybiBieXRlcyA/IDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQoreworCXJldHVybiBpbmRpcmVjdF9jaGVja19sZWZ0KHZpLCBmcmVlLCAwLCAwKTsKK30KIAogLy8gcmV0dXJuIHNpemUgaW4gYnl0ZXMgb2YgJ3VuaXRzJyB1bml0cy4gSWYgZmlyc3QgPT0gMCAtIGNhbGN1bGF0ZSBmcm9tIHRoZSBoZWFkIChsZWZ0KSwgb3RoZXJ3aXNlIC0gZnJvbSB0YWlsIChyaWdodCkKLXN0YXRpYyBpbnQgaW5kaXJlY3RfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IHVuaXRzKQorc3RhdGljIGludCBpbmRpcmVjdF9wYXJ0X3NpemUoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmaXJzdCwgaW50IHVuaXRzKQogewotICAgIC8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCi0gICAgcmV0dXJuIHVuaXRzOworCS8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCisJcmV0dXJuIHVuaXRzOwogfQogCi1zdGF0aWMgaW50IGluZGlyZWN0X3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgaW50IGluZGlyZWN0X3VuaXRfbnVtKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIC8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCi0gICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CisJLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKKwlyZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKIH0KIAotc3RhdGljIHZvaWQgaW5kaXJlY3RfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X3ByaW50X3ZpKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJJTkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAotCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIklORElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgaW5kaXJlY3Rfb3BzID0gewotCS5ieXRlc19udW1iZXIJCT0gaW5kaXJlY3RfYnl0ZXNfbnVtYmVyLAotCS5kZWNyZW1lbnRfa2V5CQk9IGluZGlyZWN0X2RlY3JlbWVudF9rZXksCi0JLmlzX2xlZnRfbWVyZ2VhYmxlCT0gaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUsCi0JLnByaW50X2l0ZW0JCT0gaW5kaXJlY3RfcHJpbnRfaXRlbSwKLQkuY2hlY2tfaXRlbQkJPSBpbmRpcmVjdF9jaGVja19pdGVtLAorCS5ieXRlc19udW1iZXIgPSBpbmRpcmVjdF9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkgPSBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZSA9IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtID0gaW5kaXJlY3RfcHJpbnRfaXRlbSwKKwkuY2hlY2tfaXRlbSA9IGluZGlyZWN0X2NoZWNrX2l0ZW0sCiAKLQkuY3JlYXRlX3ZpCQk9IGluZGlyZWN0X2NyZWF0ZV92aSwKLQkuY2hlY2tfbGVmdAkJPSBpbmRpcmVjdF9jaGVja19sZWZ0LAotCS5jaGVja19yaWdodAkJPSBpbmRpcmVjdF9jaGVja19yaWdodCwKLQkucGFydF9zaXplCQk9IGluZGlyZWN0X3BhcnRfc2l6ZSwKLQkudW5pdF9udW0JCT0gaW5kaXJlY3RfdW5pdF9udW0sCi0JLnByaW50X3ZpCQk9IGluZGlyZWN0X3ByaW50X3ZpCisJLmNyZWF0ZV92aSA9IGluZGlyZWN0X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdCA9IGluZGlyZWN0X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0ID0gaW5kaXJlY3RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZSA9IGluZGlyZWN0X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0gPSBpbmRpcmVjdF91bml0X251bSwKKwkucHJpbnRfdmkgPSBpbmRpcmVjdF9wcmludF92aQogfTsKIAotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIGRpcmVudHJ5IGZ1bmN0aW9ucwogLy8KIAotCi1zdGF0aWMgaW50IGRpcmVudHJ5X2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAidnMtMTYwOTA6IGRpcmVudHJ5X2J5dGVzX251bWJlcjogIgotCQkgICAgICAiYnl0ZXMgbnVtYmVyIGlzIGFza2VkIGZvciBkaXJlbnRyeSIpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKLXsKLSAgICBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoa2V5KTsKLSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSA9PSAwKQotCXNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX1NUQVRfREFUQSk7CQotfQotCi0KLXN0YXRpYyBpbnQgZGlyZW50cnlfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCi17Ci0gICAgaWYgKGxlMzJfdG9fY3B1IChrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQpID09IERPVF9PRkZTRVQpCisJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAidnMtMTYwOTA6IGRpcmVudHJ5X2J5dGVzX251bWJlcjogIgorCQkJICJieXRlcyBudW1iZXIgaXMgYXNrZWQgZm9yIGRpcmVudHJ5Iik7CiAJcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci0JCiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZW50cnlfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X2RlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbmFtZWxlbjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgICBjaGFyICogbmFtZTsKLSAgICBzdGF0aWMgY2hhciBuYW1lYnVmIFs4MF07CisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKK30KIAorc3RhdGljIGludCBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXksCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3sKKwlpZiAobGUzMl90b19jcHUoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0KSA9PSBET1RfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIAotICAgIHByaW50ayAoIlxuICMgJS0xNXMlLTMwcyUtMTVzJS0xNXMlLTE1c1xuIiwgIk5hbWUiLCAiS2V5IG9mIHBvaW50ZWQgb2JqZWN0IiwgIkhhc2giLCAiR2VuIG51bWJlciIsICJTdGF0dXMiKTsKK30KIAotICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWl0ZW07CitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF9pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQoreworCWludCBpOworCWludCBuYW1lbGVuOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJY2hhciAqbmFtZTsKKwlzdGF0aWMgY2hhciBuYW1lYnVmWzgwXTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UIChpaCk7IGkgKyssIGRlaCArKykgewotCW5hbWVsZW4gPSAoaSA/IChkZWhfbG9jYXRpb24oZGVoIC0gMSkpIDogaWhfaXRlbV9sZW4oaWgpKSAtIGRlaF9sb2NhdGlvbihkZWgpOwotCW5hbWUgPSBpdGVtICsgZGVoX2xvY2F0aW9uKGRlaCk7Ci0JaWYgKG5hbWVbbmFtZWxlbi0xXSA9PSAwKQotCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0JbmFtZWJ1ZlswXSA9ICciJzsKLQlpZiAobmFtZWxlbiA+IHNpemVvZiAobmFtZWJ1ZikgLSAzKSB7Ci0JICAgIHN0cm5jcHkgKG5hbWVidWYgKyAxLCBuYW1lLCBzaXplb2YgKG5hbWVidWYpIC0gMyk7Ci0JICAgIG5hbWVidWZbc2l6ZW9mIChuYW1lYnVmKSAtIDJdID0gJyInOwotCSAgICBuYW1lYnVmW3NpemVvZiAobmFtZWJ1ZikgLSAxXSA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgbWVtY3B5IChuYW1lYnVmICsgMSwgbmFtZSwgbmFtZWxlbik7Ci0JICAgIG5hbWVidWZbbmFtZWxlbiArIDFdID0gJyInOwotCSAgICBuYW1lYnVmW25hbWVsZW4gKyAyXSA9IDA7CisJcHJpbnRrKCJcbiAjICUtMTVzJS0zMHMlLTE1cyUtMTVzJS0xNXNcbiIsICJOYW1lIiwKKwkgICAgICAgIktleSBvZiBwb2ludGVkIG9iamVjdCIsICJIYXNoIiwgIkdlbiBudW1iZXIiLCAiU3RhdHVzIik7CisKKwlkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilpdGVtOworCisJZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpKyssIGRlaCsrKSB7CisJCW5hbWVsZW4gPQorCQkgICAgKGkgPyAoZGVoX2xvY2F0aW9uKGRlaCAtIDEpKSA6IGloX2l0ZW1fbGVuKGloKSkgLQorCQkgICAgZGVoX2xvY2F0aW9uKGRlaCk7CisJCW5hbWUgPSBpdGVtICsgZGVoX2xvY2F0aW9uKGRlaCk7CisJCWlmIChuYW1lW25hbWVsZW4gLSAxXSA9PSAwKQorCQkJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJbmFtZWJ1ZlswXSA9ICciJzsKKwkJaWYgKG5hbWVsZW4gPiBzaXplb2YobmFtZWJ1ZikgLSAzKSB7CisJCQlzdHJuY3B5KG5hbWVidWYgKyAxLCBuYW1lLCBzaXplb2YobmFtZWJ1ZikgLSAzKTsKKwkJCW5hbWVidWZbc2l6ZW9mKG5hbWVidWYpIC0gMl0gPSAnIic7CisJCQluYW1lYnVmW3NpemVvZihuYW1lYnVmKSAtIDFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShuYW1lYnVmICsgMSwgbmFtZSwgbmFtZWxlbik7CisJCQluYW1lYnVmW25hbWVsZW4gKyAxXSA9ICciJzsKKwkJCW5hbWVidWZbbmFtZWxlbiArIDJdID0gMDsKKwkJfQorCisJCXByaW50aygiJWQ6ICAlLTE1cyUtMTVkJS0xNWQlLTE1TGQlLTE1TGQoJXMpXG4iLAorCQkgICAgICAgaSwgbmFtZWJ1ZiwKKwkJICAgICAgIGRlaF9kaXJfaWQoZGVoKSwgZGVoX29iamVjdGlkKGRlaCksCisJCSAgICAgICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0KGRlaCkpLAorCQkgICAgICAgR0VUX0dFTkVSQVRJT05fTlVNQkVSKChkZWhfb2Zmc2V0KGRlaCkpKSwKKwkJICAgICAgIChkZV9oaWRkZW4oZGVoKSkgPyAiSElEREVOIiA6ICJWSVNJQkxFIik7CiAJfQotCi0JcHJpbnRrICgiJWQ6ICAlLTE1cyUtMTVkJS0xNWQlLTE1TGQlLTE1TGQoJXMpXG4iLCAKLQkJaSwgbmFtZWJ1ZiwKLQkJZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKLQkJR0VUX0hBU0hfVkFMVUUgKGRlaF9vZmZzZXQgKGRlaCkpLCBHRVRfR0VORVJBVElPTl9OVU1CRVIgKChkZWhfb2Zmc2V0IChkZWgpKSksCi0JCShkZV9oaWRkZW4gKGRlaCkpID8gIkhJRERFTiIgOiAiVklTSUJMRSIpOwotICAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlbnRyeV9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgZGlyZW50cnlfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCi0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgSV9FTlRSWV9DT1VOVCAoaWgpOyBpICsrLCBkZWggKyspIHsKLQk7Ci0gICAgfQorCS8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQorCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWl0ZW07CisJZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpKyssIGRlaCsrKSB7CisJCTsKKwl9CiB9CiAKLQotCiAjZGVmaW5lIERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU0gMQogCiAvKgogICogZnVuY3Rpb24gcmV0dXJucyBvbGQgZW50cnkgbnVtYmVyIGluIGRpcmVjdG9yeSBpdGVtIGluIHJlYWwgbm9kZQogICogdXNpbmcgbmV3IGVudHJ5IG51bWJlciBpbiB2aXJ0dWFsIGl0ZW0gaW4gdmlydHVhbCBub2RlICovCi1zdGF0aWMgaW5saW5lIGludCBvbGRfZW50cnlfbnVtIChpbnQgaXNfYWZmZWN0ZWQsIGludCB2aXJ0dWFsX2VudHJ5X251bSwgaW50IHBvc19pbl9pdGVtLCBpbnQgbW9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9lbnRyeV9udW0oaW50IGlzX2FmZmVjdGVkLCBpbnQgdmlydHVhbF9lbnRyeV9udW0sCisJCQkJaW50IHBvc19pbl9pdGVtLCBpbnQgbW9kZSkKIHsKLSAgICBpZiAoIG1vZGUgPT0gTV9JTlNFUlQgfHwgbW9kZSA9PSBNX0RFTEVURSkKLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07Ci0gICAgCi0gICAgaWYgKCFpc19hZmZlY3RlZCkKLQkvKiBjdXQgb3IgcGFzdGUgaXMgYXBwbGllZCB0byBhbm90aGVyIGl0ZW0gKi8KLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisJaWYgKG1vZGUgPT0gTV9JTlNFUlQgfHwgbW9kZSA9PSBNX0RFTEVURSkKKwkJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOwogCi0gICAgaWYgKHZpcnR1YWxfZW50cnlfbnVtIDwgcG9zX2luX2l0ZW0pCi0JcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOworCWlmICghaXNfYWZmZWN0ZWQpCisJCS8qIGN1dCBvciBwYXN0ZSBpcyBhcHBsaWVkIHRvIGFub3RoZXIgaXRlbSAqLworCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CiAKLSAgICBpZiAobW9kZSA9PSBNX0NVVCkKLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gKyAxOworCWlmICh2aXJ0dWFsX2VudHJ5X251bSA8IHBvc19pbl9pdGVtKQorCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CiAKLSAgICBSRkFMU0UoIG1vZGUgIT0gTV9QQVNURSB8fCB2aXJ0dWFsX2VudHJ5X251bSA9PSAwLAotCSAgICAidnMtODAxNTogb2xkX2VudHJ5X251bTogbW9kZSBtdXN0IGJlIE1fUEFTVEUgKG1vZGUgPSBcJyVjXCciLCBtb2RlKTsKLSAgICAKLSAgICByZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gLSAxOworCWlmIChtb2RlID09IE1fQ1VUKQorCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gKyAxOworCisJUkZBTFNFKG1vZGUgIT0gTV9QQVNURSB8fCB2aXJ0dWFsX2VudHJ5X251bSA9PSAwLAorCSAgICAgICAidnMtODAxNTogb2xkX2VudHJ5X251bTogbW9kZSBtdXN0IGJlIE1fUEFTVEUgKG1vZGUgPSBcJyVjXCciLAorCSAgICAgICBtb2RlKTsKKworCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bSAtIDE7CiB9CiAKLQotCi0KIC8qIENyZWF0ZSBhbiBhcnJheSBvZiBzaXplcyBvZiBkaXJlY3RvcnkgZW50cmllcyBmb3IgdmlydHVhbAogICAgaXRlbS4gUmV0dXJuIHNwYWNlIHVzZWQgYnkgYW4gaXRlbS4gRklYTUU6IG5vIGNvbnRyb2wgb3ZlcgogICAgY29uc3VtaW5nIG9mIHNwYWNlIHVzZWQgYnkgdGhpcyBpdGVtIGhhbmRsZXIgKi8KLXN0YXRpYyBpbnQgZGlyZW50cnlfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGRpcmVudHJ5X3VhcmVhKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgCi0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFTlRSWTsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOworCWludCBpLCBqOworCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBkaXJlbnRyeV91YXJlYSk7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKIAotICAgIGlmICghKHZpLT52aV9paCkgfHwgIXZpLT52aV9pdGVtKQotCUJVRyAoKTsKKwl2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVOVFJZOwogCisJaWYgKCEodmktPnZpX2loKSB8fCAhdmktPnZpX2l0ZW0pCisJCUJVRygpOwogCi0gICAgZGlyX3UtPmZsYWdzID0gMDsKLSAgICBpZiAobGVfaWhfa19vZmZzZXQgKHZpLT52aV9paCkgPT0gRE9UX09GRlNFVCkKLQlkaXJfdS0+ZmxhZ3MgfD0gRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTTsKKwlkaXJfdS0+ZmxhZ3MgPSAwOworCWlmIChsZV9paF9rX29mZnNldCh2aS0+dmlfaWgpID09IERPVF9PRkZTRVQpCisJCWRpcl91LT5mbGFncyB8PSBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNOwogCi0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKHZpLT52aV9pdGVtKTsKLSAgICAKLSAgICAKLSAgICAvKiB2aXJ0dWFsIGRpcmVjdG9yeSBpdGVtIGhhdmUgdGhpcyBhbW91bnQgb2YgZW50cnkgYWZ0ZXIgKi8KLSAgICBkaXJfdS0+ZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudCAodmktPnZpX2loKSArIAotCSgoaXNfYWZmZWN0ZWQpID8gKCh2bi0+dm5fbW9kZSA9PSBNX0NVVCkgPyAtMSA6Ci0JCQkgICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFID8gMSA6IDApKSA6IDApOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspIHsKLQlqID0gb2xkX2VudHJ5X251bSAoaXNfYWZmZWN0ZWQsIGksIHZuLT52bl9wb3NfaW5faXRlbSwgdm4tPnZuX21vZGUpOwotICAgICAgICBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPSAoaiA/IGRlaF9sb2NhdGlvbiggJihkZWhbaiAtIDFdKSApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhfaXRlbV9sZW4gKHZpLT52aV9paCkpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtqXSkpICsgREVIX1NJWkU7Ci0gICAgfQorCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSh2aS0+dmlfaXRlbSk7CiAKLSAgICBzaXplICs9IChkaXJfdS0+ZW50cnlfY291bnQgKiBzaXplb2YgKHNob3J0KSk7Ci0gICAgCi0gICAgLyogc2V0IHNpemUgb2YgcGFzdGVkIGVudHJ5ICovCi0gICAgaWYgKGlzX2FmZmVjdGVkICYmIHZuLT52bl9tb2RlID09IE1fUEFTVEUpCi0JZGlyX3UtPmVudHJ5X3NpemVzW3ZuLT52bl9wb3NfaW5faXRlbV0gPSBpbnNlcnRfc2l6ZTsKKwkvKiB2aXJ0dWFsIGRpcmVjdG9yeSBpdGVtIGhhdmUgdGhpcyBhbW91bnQgb2YgZW50cnkgYWZ0ZXIgKi8KKwlkaXJfdS0+ZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudCh2aS0+dmlfaWgpICsKKwkgICAgKChpc19hZmZlY3RlZCkgPyAoKHZuLT52bl9tb2RlID09IE1fQ1VUKSA/IC0xIDoKKwkJCSAgICAgICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFID8gMSA6IDApKSA6IDApOwogCisJZm9yIChpID0gMDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudDsgaSsrKSB7CisJCWogPSBvbGRfZW50cnlfbnVtKGlzX2FmZmVjdGVkLCBpLCB2bi0+dm5fcG9zX2luX2l0ZW0sCisJCQkJICB2bi0+dm5fbW9kZSk7CisJCWRpcl91LT5lbnRyeV9zaXplc1tpXSA9CisJCSAgICAoaiA/IGRlaF9sb2NhdGlvbigmKGRlaFtqIC0gMV0pKSA6IGloX2l0ZW1fbGVuKHZpLT52aV9paCkpIC0KKwkJICAgIGRlaF9sb2NhdGlvbigmKGRlaFtqXSkpICsgREVIX1NJWkU7CisJfQorCisJc2l6ZSArPSAoZGlyX3UtPmVudHJ5X2NvdW50ICogc2l6ZW9mKHNob3J0KSk7CisKKwkvKiBzZXQgc2l6ZSBvZiBwYXN0ZWQgZW50cnkgKi8KKwlpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9QQVNURSkKKwkJZGlyX3UtPmVudHJ5X3NpemVzW3ZuLT52bl9wb3NfaW5faXRlbV0gPSBpbnNlcnRfc2l6ZTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIC8qIGNvbXBhcmUgdG90YWwgc2l6ZSBvZiBlbnRyaWVzIHdpdGggaXRlbSBsZW5ndGggKi8KLSAgICB7Ci0JaW50IGssIGw7Ci0gICAgCi0JbCA9IDA7Ci0JZm9yIChrID0gMDsgayA8IGRpcl91LT5lbnRyeV9jb3VudDsgayArKykKLQkgICAgbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNba107Ci0gICAgCi0JaWYgKGwgKyBJSF9TSVpFICE9IHZpLT52aV9pdGVtX2xlbiArIAotCSAgICAoKGlzX2FmZmVjdGVkICYmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSkgPyBpbnNlcnRfc2l6ZSA6IDApICkgewotCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTgwMjU6IHNldF9lbnRyeV9zaXplczogKG1vZGU9PSVjLCBpbnNlcnRfc2l6ZT09JWQpLCBpbnZhbGlkIGxlbmd0aCBvZiBkaXJlY3RvcnkgaXRlbSIsCi0JCQkgICAgdm4tPnZuX21vZGUsIGluc2VydF9zaXplKTsKKwkvKiBjb21wYXJlIHRvdGFsIHNpemUgb2YgZW50cmllcyB3aXRoIGl0ZW0gbGVuZ3RoICovCisJeworCQlpbnQgaywgbDsKKworCQlsID0gMDsKKwkJZm9yIChrID0gMDsgayA8IGRpcl91LT5lbnRyeV9jb3VudDsgaysrKQorCQkJbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNba107CisKKwkJaWYgKGwgKyBJSF9TSVpFICE9IHZpLT52aV9pdGVtX2xlbiArCisJCSAgICAoKGlzX2FmZmVjdGVkCisJCSAgICAgICYmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFCisJCQkgIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSkgPyBpbnNlcnRfc2l6ZSA6IDApKSB7CisJCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJCSAgICAgICAidnMtODAyNTogc2V0X2VudHJ5X3NpemVzOiAobW9kZT09JWMsIGluc2VydF9zaXplPT0lZCksIGludmFsaWQgbGVuZ3RoIG9mIGRpcmVjdG9yeSBpdGVtIiwKKwkJCQkgICAgICAgdm4tPnZuX21vZGUsIGluc2VydF9zaXplKTsKKwkJfQogCX0KLSAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBzaXplOwotCisJcmV0dXJuIHNpemU7CiAKIH0KIAotCiAvLwogLy8gcmV0dXJuIG51bWJlciBvZiBlbnRyaWVzIHdoaWNoIG1heSBmaXQgaW50byBzcGVjaWZpZWQgYW1vdW50IG9mCiAvLyBmcmVlIHNwYWNlLCBvciAtMSBpZiBmcmVlIHNwYWNlIGlzIG5vdCBlbm91Z2ggZXZlbiBmb3IgMSBlbnRyeQogLy8KLXN0YXRpYyBpbnQgZGlyZW50cnlfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKLQkJCQlpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQorc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSAgICAgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQogewotICAgIGludCBpOwotICAgIGludCBlbnRyaWVzID0gMDsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKwlpbnQgaTsKKwlpbnQgZW50cmllcyA9IDA7CisJc3RydWN0IGRpcmVudHJ5X3VhcmVhICpkaXJfdSA9IHZpLT52aV91YXJlYTsKIAotICAgIGZvciAoaSA9IHN0YXJ0X3NraXA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQgLSBlbmRfc2tpcDsgaSArKykgewotCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQotCSAgICAvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCi0JICAgIGJyZWFrOwotCQkgIAotCWZyZWUgLT0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOwotCWVudHJpZXMgKys7Ci0gICAgfQorCWZvciAoaSA9IHN0YXJ0X3NraXA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQgLSBlbmRfc2tpcDsgaSsrKSB7CisJCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQorCQkJLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLworCQkJYnJlYWs7CiAKLSAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpIHsKLQlyZWlzZXJmc19wYW5pYyAoTlVMTCwgImZyZWUgc3BhY2UgJWQsIGVudHJ5X2NvdW50ICVkXG4iLCBmcmVlLCBkaXJfdS0+ZW50cnlfY291bnQpOwotICAgIH0KKwkJZnJlZSAtPSBkaXJfdS0+ZW50cnlfc2l6ZXNbaV07CisJCWVudHJpZXMrKzsKKwl9CiAKLSAgICAvKiAiLiIgYW5kICIuLiIgY2FuIG5vdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyICovCi0gICAgaWYgKHN0YXJ0X3NraXAgPT0gMCAmJiAoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkgJiYgZW50cmllcyA8IDIpCi0JZW50cmllcyA9IDA7Ci0gICAgCi0gICAgcmV0dXJuIGVudHJpZXMgPzogLTE7CisJaWYgKGVudHJpZXMgPT0gZGlyX3UtPmVudHJ5X2NvdW50KSB7CisJCXJlaXNlcmZzX3BhbmljKE5VTEwsICJmcmVlIHNwYWNlICVkLCBlbnRyeV9jb3VudCAlZFxuIiwgZnJlZSwKKwkJCSAgICAgICBkaXJfdS0+ZW50cnlfY291bnQpOworCX0KKworCS8qICIuIiBhbmQgIi4uIiBjYW4gbm90IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKi8KKwlpZiAoc3RhcnRfc2tpcCA9PSAwICYmIChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKQorCSAgICAmJiBlbnRyaWVzIDwgMikKKwkJZW50cmllcyA9IDA7CisKKwlyZXR1cm4gZW50cmllcyA/IDogLTE7CiB9CiAKLQotc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQogewotICAgIGludCBpOwotICAgIGludCBlbnRyaWVzID0gMDsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKLSAgICAKLSAgICBmb3IgKGkgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAxOyBpID49IDA7IGkgLS0pIHsKLQlpZiAoZGlyX3UtPmVudHJ5X3NpemVzW2ldID4gZnJlZSkKLQkgICAgLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLwotCSAgICBicmVhazsKLQkKLQlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKLQllbnRyaWVzICsrOwotICAgIH0KLSAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpCi0JQlVHICgpOworCWludCBpOworCWludCBlbnRyaWVzID0gMDsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLwotICAgIGlmICgoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkgJiYgZW50cmllcyA+IGRpcl91LT5lbnRyeV9jb3VudCAtIDIpCi0JZW50cmllcyA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDI7CisJZm9yIChpID0gZGlyX3UtPmVudHJ5X2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGRpcl91LT5lbnRyeV9zaXplc1tpXSA+IGZyZWUpCisJCQkvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCisJCQlicmVhazsKIAotICAgIHJldHVybiBlbnRyaWVzID86IC0xOworCQlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwkJZW50cmllcysrOworCX0KKwlpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpCisJCUJVRygpOworCisJLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLworCWlmICgoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkKKwkgICAgJiYgZW50cmllcyA+IGRpcl91LT5lbnRyeV9jb3VudCAtIDIpCisJCWVudHJpZXMgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAyOworCisJcmV0dXJuIGVudHJpZXMgPyA6IC0xOwogfQogCi0KIC8qIHN1bSBvZiBlbnRyeSBzaXplcyBiZXR3ZWVuIGZyb20tdGggYW5kIHRvLXRoIGVudHJpZXMgaW5jbHVkaW5nIGJvdGggZWRnZXMgKi8KLXN0YXRpYyBpbnQgZGlyZW50cnlfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQorc3RhdGljIGludCBkaXJlbnRyeV9wYXJ0X3NpemUoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmaXJzdCwgaW50IGNvdW50KQogewotICAgIGludCBpLCByZXR2YWw7Ci0gICAgaW50IGZyb20sIHRvOwotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOwotICAgIAotICAgIHJldHZhbCA9IDA7Ci0gICAgaWYgKGZpcnN0ID09IDApCi0JZnJvbSA9IDA7Ci0gICAgZWxzZQotCWZyb20gPSBkaXJfdS0+ZW50cnlfY291bnQgLSBjb3VudDsKLSAgICB0byA9IGZyb20gKyBjb3VudCAtIDE7CisJaW50IGksIHJldHZhbDsKKwlpbnQgZnJvbSwgdG87CisJc3RydWN0IGRpcmVudHJ5X3VhcmVhICpkaXJfdSA9IHZpLT52aV91YXJlYTsKIAotICAgIGZvciAoaSA9IGZyb207IGkgPD0gdG87IGkgKyspCi0JcmV0dmFsICs9IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwlyZXR2YWwgPSAwOworCWlmIChmaXJzdCA9PSAwKQorCQlmcm9tID0gMDsKKwllbHNlCisJCWZyb20gPSBkaXJfdS0+ZW50cnlfY291bnQgLSBjb3VudDsKKwl0byA9IGZyb20gKyBjb3VudCAtIDE7CiAKLSAgICByZXR1cm4gcmV0dmFsOworCWZvciAoaSA9IGZyb207IGkgPD0gdG87IGkrKykKKwkJcmV0dmFsICs9IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZGlyZW50cnlfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7Ci0gICAgCi0gICAgcmV0dXJuIGRpcl91LT5lbnRyeV9jb3VudDsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOworCisJcmV0dXJuIGRpcl91LT5lbnRyeV9jb3VudDsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKwlpbnQgaTsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVOVFJZLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCwgZmxhZ3MgMHgleCIsCi0JCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCwgZGlyX3UtPmZsYWdzKTsKLSAgICBwcmludGsgKCIlZCBlbnRyaWVzOiAiLCBkaXJfdS0+ZW50cnlfY291bnQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspCi0JcHJpbnRrICgiJWQgIiwgZGlyX3UtPmVudHJ5X3NpemVzW2ldKTsKLSAgICBwcmludGsgKCJcbiIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIkRJUkVOVFJZLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCwgZmxhZ3MgMHgleCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loLCBkaXJfdS0+ZmxhZ3MpOworCXByaW50aygiJWQgZW50cmllczogIiwgZGlyX3UtPmVudHJ5X2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBpKyspCisJCXByaW50aygiJWQgIiwgZGlyX3UtPmVudHJ5X3NpemVzW2ldKTsKKwlwcmludGsoIlxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGRpcmVudHJ5X29wcyA9IHsKLQkuYnl0ZXNfbnVtYmVyCQk9IGRpcmVudHJ5X2J5dGVzX251bWJlciwKLQkuZGVjcmVtZW50X2tleQkJPSBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5LAotCS5pc19sZWZ0X21lcmdlYWJsZQk9IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlLAotCS5wcmludF9pdGVtCQk9IGRpcmVudHJ5X3ByaW50X2l0ZW0sCi0JLmNoZWNrX2l0ZW0JCT0gZGlyZW50cnlfY2hlY2tfaXRlbSwKKwkuYnl0ZXNfbnVtYmVyID0gZGlyZW50cnlfYnl0ZXNfbnVtYmVyLAorCS5kZWNyZW1lbnRfa2V5ID0gZGlyZW50cnlfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUgPSBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbSA9IGRpcmVudHJ5X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0gPSBkaXJlbnRyeV9jaGVja19pdGVtLAogCi0JLmNyZWF0ZV92aQkJPSBkaXJlbnRyeV9jcmVhdGVfdmksCi0JLmNoZWNrX2xlZnQJCT0gZGlyZW50cnlfY2hlY2tfbGVmdCwKLQkuY2hlY2tfcmlnaHQJCT0gZGlyZW50cnlfY2hlY2tfcmlnaHQsCi0JLnBhcnRfc2l6ZQkJPSBkaXJlbnRyeV9wYXJ0X3NpemUsCi0JLnVuaXRfbnVtCQk9IGRpcmVudHJ5X3VuaXRfbnVtLAotCS5wcmludF92aQkJPSBkaXJlbnRyeV9wcmludF92aQorCS5jcmVhdGVfdmkgPSBkaXJlbnRyeV9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQgPSBkaXJlbnRyeV9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodCA9IGRpcmVudHJ5X2NoZWNrX3JpZ2h0LAorCS5wYXJ0X3NpemUgPSBkaXJlbnRyeV9wYXJ0X3NpemUsCisJLnVuaXRfbnVtID0gZGlyZW50cnlfdW5pdF9udW0sCisJLnByaW50X3ZpID0gZGlyZW50cnlfcHJpbnRfdmkKIH07CiAKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBFcnJvciBjYXRjaGluZyBmdW5jdGlvbnMgdG8gY2F0Y2ggZXJyb3JzIGNhdXNlZCBieSBpbmNvcnJlY3QgaXRlbSB0eXBlcy4KIC8vCi1zdGF0aWMgaW50IGVycmNhdGNoX2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXJyY2F0Y2hfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDAyOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDI6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLQotc3RhdGljIGludCBlcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYnNpemUpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDAzOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDM6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA0OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDQ6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLQotc3RhdGljIHZvaWQgZXJyY2F0Y2hfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX2NoZWNrX2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA1OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDU6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLXN0YXRpYyBpbnQgZXJyY2F0Y2hfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDY6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CS8vIFdlIG1pZ2h0IHJldHVybiAtMSBoZXJlIGFzIHdlbGwsIGJ1dCBpdCB3b24ndCBoZWxwIGFzIGNyZWF0ZV92aXJ0dWFsX25vZGUoKSBmcm9tIHdoZXJlCi0JCS8vIHRoaXMgb3BlcmF0aW9uIGlzIGNhbGxlZCBmcm9tIGlzIG9mIHJldHVybiB0eXBlIHZvaWQuCisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwNjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsJCS8vIFdlIG1pZ2h0IHJldHVybiAtMSBoZXJlIGFzIHdlbGwsIGJ1dCBpdCB3b24ndCBoZWxwIGFzIGNyZWF0ZV92aXJ0dWFsX25vZGUoKSBmcm9tIHdoZXJlCisJLy8gdGhpcyBvcGVyYXRpb24gaXMgY2FsbGVkIGZyb20gaXMgb2YgcmV0dXJuIHR5cGUgdm9pZC4KIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAotCQkJCWludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA3OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAtMTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDA3OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAtMTsKIH0KIAotCi1zdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA4OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAtMTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDA4OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCitzdGF0aWMgaW50IGVycmNhdGNoX3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA5OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDk6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXJyY2F0Y2hfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDEwOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMTA6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMTE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAxMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgZXJyY2F0Y2hfb3BzID0gewotICAgIGVycmNhdGNoX2J5dGVzX251bWJlciwKLSAgICBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5LAotICAgIGVycmNhdGNoX2lzX2xlZnRfbWVyZ2VhYmxlLAotICAgIGVycmNhdGNoX3ByaW50X2l0ZW0sCi0gICAgZXJyY2F0Y2hfY2hlY2tfaXRlbSwKKwllcnJjYXRjaF9ieXRlc19udW1iZXIsCisJZXJyY2F0Y2hfZGVjcmVtZW50X2tleSwKKwllcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSwKKwllcnJjYXRjaF9wcmludF9pdGVtLAorCWVycmNhdGNoX2NoZWNrX2l0ZW0sCiAKLSAgICBlcnJjYXRjaF9jcmVhdGVfdmksCi0gICAgZXJyY2F0Y2hfY2hlY2tfbGVmdCwKLSAgICBlcnJjYXRjaF9jaGVja19yaWdodCwKLSAgICBlcnJjYXRjaF9wYXJ0X3NpemUsCi0gICAgZXJyY2F0Y2hfdW5pdF9udW0sCi0gICAgZXJyY2F0Y2hfcHJpbnRfdmkKKwllcnJjYXRjaF9jcmVhdGVfdmksCisJZXJyY2F0Y2hfY2hlY2tfbGVmdCwKKwllcnJjYXRjaF9jaGVja19yaWdodCwKKwllcnJjYXRjaF9wYXJ0X3NpemUsCisJZXJyY2F0Y2hfdW5pdF9udW0sCisJZXJyY2F0Y2hfcHJpbnRfdmkKIH07CiAKLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLwogI2lmICEgKFRZUEVfU1RBVF9EQVRBID09IDAgJiYgVFlQRV9JTkRJUkVDVCA9PSAxICYmIFRZUEVfRElSRUNUID09IDIgJiYgVFlQRV9ESVJFTlRSWSA9PSAzKQotICBkbyBub3QgY29tcGlsZQorI2Vycm9yIEl0ZW0gdHlwZXMgbXVzdCB1c2UgZGlzay1mb3JtYXQgYXNzaWduZWQgdmFsdWVzLgogI2VuZGlmCiAKLXN0cnVjdCBpdGVtX29wZXJhdGlvbnMgKiBpdGVtX29wcyBbVFlQRV9BTlkgKyAxXSA9IHsKLSAgJnN0YXRfZGF0YV9vcHMsCi0gICZpbmRpcmVjdF9vcHMsCi0gICZkaXJlY3Rfb3BzLAotICAmZGlyZW50cnlfb3BzLAotICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAmZXJyY2F0Y2hfb3BzCQkvKiBUaGlzIGlzIHRvIGNhdGNoIGVycm9ycyB3aXRoIGludmFsaWQgdHlwZSAoMTV0aCBlbnRyeSBmb3IgVFlQRV9BTlkpICovCitzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICppdGVtX29wc1tUWVBFX0FOWSArIDFdID0geworCSZzdGF0X2RhdGFfb3BzLAorCSZpbmRpcmVjdF9vcHMsCisJJmRpcmVjdF9vcHMsCisJJmRpcmVudHJ5X29wcywKKwlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCSZlcnJjYXRjaF9vcHMJCS8qIFRoaXMgaXMgdG8gY2F0Y2ggZXJyb3JzIHdpdGggaW52YWxpZCB0eXBlICgxNXRoIGVudHJ5IGZvciBUWVBFX0FOWSkgKi8KIH07Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCA3Yjg3NzA3Li5jNjZjMjdlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC01NSw3ICs1NSw2IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAKLQogLyogZ2V0cyBhIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKiBmcm9tIGEgbGlzdCBoZWFkICovCiAjZGVmaW5lIEpPVVJOQUxfTElTVF9FTlRSWShoKSAobGlzdF9lbnRyeSgoaCksIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqX2xpc3QpKQpAQCAtNjksNTUgKzY4LDYxIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29tbWl0X3dxOwogCi0jZGVmaW5lIEpPVVJOQUxfVFJBTlNfSEFMRiAxMDE4ICAgLyogbXVzdCBiZSBjb3JyZWN0IHRvIGtlZXAgdGhlIGRlc2MgYW5kIGNvbW1pdAotCQkJCSAgICAgc3RydWN0cyBhdCA0ayAqLwotI2RlZmluZSBCVUZOUiA2NCAvKnJlYWQgYWhlYWQgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19IQUxGIDEwMTgJLyogbXVzdCBiZSBjb3JyZWN0IHRvIGtlZXAgdGhlIGRlc2MgYW5kIGNvbW1pdAorCQkJCSAgIHN0cnVjdHMgYXQgNGsgKi8KKyNkZWZpbmUgQlVGTlIgNjQJCS8qcmVhZCBhaGVhZCAqLwogCiAvKiBjbm9kZSBzdGF0IGJpdHMuICBNb3ZlIHRoZXNlIGludG8gcmVpc2VyZnNfZnMuaCAqLwogCiAjZGVmaW5lIEJMT0NLX0ZSRUVEIDIJCS8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbi4gICovCi0jZGVmaW5lIEJMT0NLX0ZSRUVEX0hPTERFUiAzICAgIC8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbiAqLworI2RlZmluZSBCTE9DS19GUkVFRF9IT0xERVIgMwkvKiB0aGlzIGJsb2NrIHdhcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiwgYW5kIGNhbid0IGJlIHdyaXR0ZW4gKi8KIAogI2RlZmluZSBCTE9DS19ORUVEU19GTFVTSCA0CS8qIHVzZWQgaW4gZmx1c2hfam91cm5hbF9saXN0ICovCiAjZGVmaW5lIEJMT0NLX0RJUlRJRUQgNQogCi0KIC8qIGpvdXJuYWwgbGlzdCBzdGF0ZSBiaXRzICovCiAjZGVmaW5lIExJU1RfVE9VQ0hFRCAxCiAjZGVmaW5lIExJU1RfRElSVFkgICAyCi0jZGVmaW5lIExJU1RfQ09NTUlUX1BFTkRJTkcgIDQJCS8qIHNvbWVvbmUgd2lsbCBjb21taXQgdGhpcyBsaXN0ICovCisjZGVmaW5lIExJU1RfQ09NTUlUX1BFTkRJTkcgIDQJLyogc29tZW9uZSB3aWxsIGNvbW1pdCB0aGlzIGxpc3QgKi8KIAogLyogZmxhZ3MgZm9yIGRvX2pvdXJuYWxfZW5kICovCiAjZGVmaW5lIEZMVVNIX0FMTCAgIDEJCS8qIGZsdXNoIGNvbW1pdCBhbmQgcmVhbCBibG9ja3MgKi8KICNkZWZpbmUgQ09NTUlUX05PVyAgMgkJLyogZW5kIGFuZCBjb21taXQgdGhpcyB0cmFuc2FjdGlvbiAqLwotI2RlZmluZSBXQUlUICAgICAgICA0CQkvKiB3YWl0IGZvciB0aGUgbG9nIGJsb2NrcyB0byBoaXQgdGhlIGRpc2sqLworI2RlZmluZSBXQUlUICAgICAgICA0CQkvKiB3YWl0IGZvciB0aGUgbG9nIGJsb2NrcyB0byBoaXQgdGhlIGRpc2sgKi8KIAotc3RhdGljIGludCBkb19qb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosc3RydWN0IHN1cGVyX2Jsb2NrICosdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBmbGFncykgOwotc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSA7Ci1zdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgIDsKLXN0YXRpYyBpbnQgY2FuX2RpcnR5KHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgOwotc3RhdGljIGludCBqb3VybmFsX2pvaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpOwotc3RhdGljIGludCByZWxlYXNlX2pvdXJuYWxfZGV2KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAotCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsICk7CitzdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywKKwkJCSAgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgZmx1c2hfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCSAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpOworc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpOworc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKTsKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2Nrcyk7CitzdGF0aWMgaW50IHJlbGVhc2Vfam91cm5hbF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCk7CiBzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCk7CisJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKTsKIHN0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCk7CiBzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CiAKIC8qIHZhbHVlcyBmb3Igam9pbiBpbiBkb19qb3VybmFsX2JlZ2luX3IgKi8KIGVudW0gewotICAgIEpCRUdJTl9SRUcgPSAwLCAvKiByZWd1bGFyIGpvdXJuYWwgYmVnaW4gKi8KLSAgICBKQkVHSU5fSk9JTiA9IDEsIC8qIGpvaW4gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgYXQgYWxsIHBvc3NpYmxlICovCi0gICAgSkJFR0lOX0FCT1JUID0gMiwgLyogY2FsbGVkIGZyb20gY2xlYW51cCBjb2RlLCBpZ25vcmVzIGFib3J0ZWQgZmxhZyAqLworCUpCRUdJTl9SRUcgPSAwLAkJLyogcmVndWxhciBqb3VybmFsIGJlZ2luICovCisJSkJFR0lOX0pPSU4gPSAxLAkvKiBqb2luIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIGF0IGFsbCBwb3NzaWJsZSAqLworCUpCRUdJTl9BQk9SVCA9IDIsCS8qIGNhbGxlZCBmcm9tIGNsZWFudXAgY29kZSwgaWdub3JlcyBhYm9ydGVkIGZsYWcgKi8KIH07CiAKIHN0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcyxpbnQgam9pbik7CisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywgaW50IGpvaW4pOwogCi1zdGF0aWMgdm9pZCBpbml0X2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIG1lbXNldChqb3VybmFsLT5qX2hhc2hfdGFibGUsIDAsIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKSA7CitzdGF0aWMgdm9pZCBpbml0X2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwltZW1zZXQoam91cm5hbC0+al9oYXNoX3RhYmxlLCAwLAorCSAgICAgICBKT1VSTkFMX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKSk7CiB9CiAKIC8qCkBAIC0xMjUsMTQ5ICsxMzAsMTU5IEBACiAqKiBtYWtlIHNjaGVkdWxlIGhhcHBlbiBhZnRlciBJJ3ZlIGZyZWVkIGEgYmxvY2suICBMb29rIGF0IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uIGFuZCBqb3VybmFsX21hcmtfZnJlZWQgZm9yCiAqKiBtb3JlIGRldGFpbHMuCiAqLwotc3RhdGljIGludCByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBpZiAoYmgpIHsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOwotICB9Ci0gIHJldHVybiAwIDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY2xlYW5fYW5kX2ZpbGVfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGJoKSB7CisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9iYXJyaWVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfigxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gpOwotICAgIHByaW50aygicmVpc2VyZnM6IGRpc2FibGluZyBmbHVzaCBiYXJyaWVycyBvbiAlc1xuIiwgcmVpc2VyZnNfYmRldm5hbWUocykpOworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7CisJcHJpbnRrKCJyZWlzZXJmczogZGlzYWJsaW5nIGZsdXNoIGJhcnJpZXJzIG9uICVzXG4iLAorCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKgotYWxsb2NhdGVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA7Ci0gIHN0YXRpYyBpbnQgaWQ7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICphbGxvY2F0ZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sKKwkJCQkJCQkgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuOworCXN0YXRpYyBpbnQgaWQ7CiAKLSAgYm4gPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBHRlBfTk9GUywgcF9zX3NiKSA7Ci0gIGlmICghYm4pIHsKLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgYm4tPmRhdGEgPSByZWlzZXJmc19rbWFsbG9jKHBfc19zYi0+c19ibG9ja3NpemUsIEdGUF9OT0ZTLCBwX3Nfc2IpIDsKLSAgaWYgKCFibi0+ZGF0YSkgewotICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGJuLT5pZCA9IGlkKysgOwotICBtZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpIDsKLSAgSU5JVF9MSVNUX0hFQUQoJmJuLT5saXN0KSA7Ci0gIHJldHVybiBibiA7CisJYm4gPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBHRlBfTk9GUywKKwkJCSAgICAgIHBfc19zYik7CisJaWYgKCFibikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm4tPmRhdGEgPSByZWlzZXJmc19rbWFsbG9jKHBfc19zYi0+c19ibG9ja3NpemUsIEdGUF9OT0ZTLCBwX3Nfc2IpOworCWlmICghYm4tPmRhdGEpIHsKKwkJcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm4tPmlkID0gaWQrKzsKKwltZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZibi0+bGlzdCk7CisJcmV0dXJuIGJuOwogfQogCi1zdGF0aWMgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICoKLWdldF9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gPSBOVUxMOwotICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9IGpvdXJuYWwtPmpfYml0bWFwX25vZGVzLm5leHQgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqZ2V0X2JpdG1hcF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dDsKIAotICBqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzKysgOwotcmVwZWF0OgorCWpvdXJuYWwtPmpfdXNlZF9iaXRtYXBfbm9kZXMrKzsKKyAgICAgIHJlcGVhdDoKIAotICBpZihlbnRyeSAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKLSAgICBibiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCkgOwotICAgIGxpc3RfZGVsKGVudHJ5KSA7Ci0gICAgbWVtc2V0KGJuLT5kYXRhLCAwLCBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7Ci0gICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tIDsKLSAgICByZXR1cm4gYm4gOwotICB9Ci0gIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gIGlmICghYm4pIHsKLSAgICB5aWVsZCgpOwotICAgIGdvdG8gcmVwZWF0IDsKLSAgfQotICByZXR1cm4gYm4gOworCWlmIChlbnRyeSAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKKwkJYm4gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCW1lbXNldChibi0+ZGF0YSwgMCwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCWpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMtLTsKKwkJcmV0dXJuIGJuOworCX0KKwlibiA9IGFsbG9jYXRlX2JpdG1hcF9ub2RlKHBfc19zYik7CisJaWYgKCFibikgeworCQl5aWVsZCgpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJcmV0dXJuIGJuOwogfQogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2Rlcy0tIDsKLSAgaWYgKGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMgPiBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTKSB7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4tPmRhdGEsIHBfc19zYi0+c19ibG9ja3NpemUsIHBfc19zYikgOwotICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7Ci0gIH0gZWxzZSB7Ci0gICAgbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKLSAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKysgOwotICB9CisJCQkJICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4pCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2Rlcy0tOworCWlmIChqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzID4gUkVJU0VSRlNfTUFYX0JJVE1BUF9OT0RFUykgeworCQlyZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKTsKKwkJcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkKCZibi0+bGlzdCwgJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKTsKKwkJam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrOworCX0KIH0KIAotc3RhdGljIHZvaWQgYWxsb2NhdGVfYml0bWFwX25vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIGludCBpIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuID0gTlVMTCA7Ci0gIGZvciAoaSA9IDAgOyBpIDwgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUyA7IGkrKykgewotICAgIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gICAgaWYgKGJuKSB7Ci0gICAgICBsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgOwotICAgICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrIDsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWsgOyAvLyB0aGlzIGlzIG9rLCB3ZSdsbCB0cnkgYWdhaW4gd2hlbiBtb3JlIGFyZSBuZWVkZWQgCi0gICAgfQotICB9CitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVM7IGkrKykgeworCQlibiA9IGFsbG9jYXRlX2JpdG1hcF9ub2RlKHBfc19zYik7CisJCWlmIChibikgeworCQkJbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCQkJam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CS8vIHRoaXMgaXMgb2ssIHdlJ2xsIHRyeSBhZ2FpbiB3aGVuIG1vcmUgYXJlIG5lZWRlZCAKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCBzZXRfYml0X2luX2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYikgewotICBpbnQgYm1hcF9uciA9IGJsb2NrIC8gKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgOwotICBpbnQgYml0X25yID0gYmxvY2sgJSAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSA7CisJCQkJICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKQoreworCWludCBibWFwX25yID0gYmxvY2sgLyAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwlpbnQgYml0X25yID0gYmxvY2sgJSAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKIAotICBpZiAoIWpiLT5iaXRtYXBzW2JtYXBfbnJdKSB7Ci0gICAgamItPmJpdG1hcHNbYm1hcF9ucl0gPSBnZXRfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gIH0KLSAgc2V0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpIDsKLSAgcmV0dXJuIDAgOworCWlmICghamItPmJpdG1hcHNbYm1hcF9ucl0pIHsKKwkJamItPmJpdG1hcHNbYm1hcF9ucl0gPSBnZXRfYml0bWFwX25vZGUocF9zX3NiKTsKKwl9CisJc2V0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2JpdG1hcF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKSB7Ci0gIGludCBpOwotICBpZiAoamItPmJpdG1hcHMgPT0gTlVMTCkKLSAgICByZXR1cm47CisJCQkJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYikKK3sKKwlpbnQgaTsKKwlpZiAoamItPmJpdG1hcHMgPT0gTlVMTCkKKwkJcmV0dXJuOwogCi0gIGZvciAoaSA9IDAgOyBpIDwgU0JfQk1BUF9OUihwX3Nfc2IpIDsgaSsrKSB7Ci0gICAgaWYgKGpiLT5iaXRtYXBzW2ldKSB7Ci0gICAgICBmcmVlX2JpdG1hcF9ub2RlKHBfc19zYiwgamItPmJpdG1hcHNbaV0pIDsKLSAgICAgIGpiLT5iaXRtYXBzW2ldID0gTlVMTCA7Ci0gICAgfQotICB9CisJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocF9zX3NiKTsgaSsrKSB7CisJCWlmIChqYi0+Yml0bWFwc1tpXSkgeworCQkJZnJlZV9iaXRtYXBfbm9kZShwX3Nfc2IsIGpiLT5iaXRtYXBzW2ldKTsKKwkJCWpiLT5iaXRtYXBzW2ldID0gTlVMTDsKKwkJfQorCX0KIH0KIAogLyoKICoqIG9ubHkgY2FsbCB0aGlzIG9uIEZTIHVubW91bnQuCiAqLwogc3RhdGljIGludCBmcmVlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSkgewotICBpbnQgaSA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKLSAgICBqYiA9IGpiX2FycmF5ICsgaSA7Ci0gICAgamItPmpvdXJuYWxfbGlzdCA9IE5VTEwgOwotICAgIGNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYikgOwotICAgIHZmcmVlKGpiLT5iaXRtYXBzKSA7Ci0gICAgamItPmJpdG1hcHMgPSBOVUxMIDsKLSAgfQotICByZXR1cm4gMDsKKwkJCSAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOworCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJamIgPSBqYl9hcnJheSArIGk7CisJCWpiLT5qb3VybmFsX2xpc3QgPSBOVUxMOworCQljbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpOworCQl2ZnJlZShqYi0+Yml0bWFwcyk7CisJCWpiLT5iaXRtYXBzID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZnJlZV9iaXRtYXBfbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gOworc3RhdGljIGludCBmcmVlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dDsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuOwogCi0gIHdoaWxlKG5leHQgIT0gJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKSB7Ci0gICAgYm4gPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCkgOwotICAgIGxpc3RfZGVsKG5leHQpIDsKLSAgICByZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKLSAgICBuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7Ci0gICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tIDsKLSAgfQorCXdoaWxlIChuZXh0ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgeworCQlibiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwobmV4dCk7CisJCXJlaXNlcmZzX2tmcmVlKGJuLT5kYXRhLCBwX3Nfc2ItPnNfYmxvY2tzaXplLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYik7CisJCW5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0OworCQlqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS07CisJfQogCi0gIHJldHVybiAwIDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTI3NSw1OSArMjkwLDY1IEBACiAqKiBqYl9hcnJheSBpcyB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkIGluLgogKi8KIGludCByZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamJfYXJyYXksCi0JCQkJICAgaW50IGJtYXBfbnIpIHsKLSAgaW50IGkgOwotICBpbnQgZmFpbGVkID0gMCA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBpbnQgbWVtID0gYm1hcF9uciAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKikgOworCQkJCSAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamJfYXJyYXksCisJCQkJICAgaW50IGJtYXBfbnIpCit7CisJaW50IGk7CisJaW50IGZhaWxlZCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYjsKKwlpbnQgbWVtID0gYm1hcF9uciAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKik7CiAKLSAgZm9yIChpID0gMCA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTIDsgaSsrKSB7Ci0gICAgamIgPSBqYl9hcnJheSArIGkgOwotICAgIGpiLT5qb3VybmFsX2xpc3QgPSBOVUxMIDsKLSAgICBqYi0+Yml0bWFwcyA9IHZtYWxsb2MoIG1lbSApIDsKLSAgICBpZiAoIWpiLT5iaXRtYXBzKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMDAwLCB1bmFibGUgdG8gYWxsb2NhdGUgYml0bWFwcyBmb3Igam91cm5hbCBsaXN0cyIpIDsKLSAgICAgIGZhaWxlZCA9IDE7ICAgCi0gICAgICBicmVhayA7Ci0gICAgfQotICAgIG1lbXNldChqYi0+Yml0bWFwcywgMCwgbWVtKSA7Ci0gIH0KLSAgaWYgKGZhaWxlZCkgewotICAgIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgamJfYXJyYXkpIDsKLSAgICByZXR1cm4gLTEgOwotICB9Ci0gIHJldHVybiAwIDsKKwlmb3IgKGkgPSAwOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUzsgaSsrKSB7CisJCWpiID0gamJfYXJyYXkgKyBpOworCQlqYi0+am91cm5hbF9saXN0ID0gTlVMTDsKKwkJamItPmJpdG1hcHMgPSB2bWFsbG9jKG1lbSk7CisJCWlmICghamItPmJpdG1hcHMpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImNsbS0yMDAwLCB1bmFibGUgdG8gYWxsb2NhdGUgYml0bWFwcyBmb3Igam91cm5hbCBsaXN0cyIpOworCQkJZmFpbGVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChqYi0+Yml0bWFwcywgMCwgbWVtKTsKKwl9CisJaWYgKGZhaWxlZCkgeworCQlmcmVlX2xpc3RfYml0bWFwcyhwX3Nfc2IsIGpiX2FycmF5KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKICoqIGZpbmQgYW4gYXZhaWxhYmxlIGxpc3QgYml0bWFwLiAgSWYgeW91IGNhbid0IGZpbmQgb25lLCBmbHVzaCBhIGNvbW1pdCBsaXN0IAogKiogYW5kIHRyeSBhZ2FpbgogKi8KLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKgotZ2V0X2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICBpbnQgaSxqIDsgCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEwgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqZ2V0X2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQkJICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QKKwkJCQkJCSAgICAqamwpCit7CisJaW50IGksIGo7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEw7CiAKLSAgZm9yIChqID0gMCA7IGogPCAoSk9VUk5BTF9OVU1fQklUTUFQUyAqIDMpIDsgaisrKSB7Ci0gICAgaSA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggOwotICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAoaSArIDEpICUgSk9VUk5BTF9OVU1fQklUTUFQUyA7Ci0gICAgamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaSA7Ci0gICAgaWYgKGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7Ci0gICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0LCAxKSA7Ci0gICAgICBpZiAoIWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7Ci0JYnJlYWsgOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhayA7Ci0gICAgfQotICB9Ci0gIGlmIChqYi0+am91cm5hbF9saXN0KSB7IC8qIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgaWYgZmx1c2hlZCBjb3JyZWN0bHkgKi8KLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgamItPmpvdXJuYWxfbGlzdCA9IGpsIDsKLSAgcmV0dXJuIGpiIDsKKwlmb3IgKGogPSAwOyBqIDwgKEpPVVJOQUxfTlVNX0JJVE1BUFMgKiAzKTsgaisrKSB7CisJCWkgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4OworCQlqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gKGkgKyAxKSAlIEpPVVJOQUxfTlVNX0JJVE1BUFM7CisJCWpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGk7CisJCWlmIChqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCkgeworCQkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLAorCQkJCQkgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uCisJCQkJCSAgam91cm5hbF9saXN0LCAxKTsKKwkJCWlmICgham91cm5hbC0+al9saXN0X2JpdG1hcFtpXS5qb3VybmFsX2xpc3QpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChqYi0+am91cm5hbF9saXN0KSB7CS8qIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgaWYgZmx1c2hlZCBjb3JyZWN0bHkgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCWpiLT5qb3VybmFsX2xpc3QgPSBqbDsKKwlyZXR1cm4gamI7CiB9CiAKIC8qIApAQCAtMzM1LDEwNCArMzU2LDExNCBAQAogKiogVXNlcyB0aGUgY25vZGUtPm5leHQgYW5kIGNub2RlLT5wcmV2IHBvaW50ZXJzCiAqKiByZXR1cm5zIE5VTEwgb24gZmFpbHVyZQogKi8KLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqYWxsb2NhdGVfY25vZGVzKGludCBudW1fY25vZGVzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpoZWFkIDsKLSAgaW50IGkgOwotICBpZiAobnVtX2Nub2RlcyA8PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGhlYWQgPSB2bWFsbG9jKG51bV9jbm9kZXMgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKSA7Ci0gIGlmICghaGVhZCkgewotICAgIHJldHVybiBOVUxMIDsKLSAgfQotICBtZW1zZXQoaGVhZCwgMCwgbnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKLSAgaGVhZFswXS5wcmV2ID0gTlVMTCA7Ci0gIGhlYWRbMF0ubmV4dCA9IGhlYWQgKyAxIDsKLSAgZm9yIChpID0gMSA7IGkgPCBudW1fY25vZGVzOyBpKyspIHsKLSAgICBoZWFkW2ldLnByZXYgPSBoZWFkICsgKGkgLSAxKSA7Ci0gICAgaGVhZFtpXS5uZXh0ID0gaGVhZCArIChpICsgMSkgOyAvKiBpZiBsYXN0IG9uZSwgb3ZlcndyaXRlIGl0IGFmdGVyIHRoZSBpZiAqLwotICB9Ci0gIGhlYWRbbnVtX2Nub2RlcyAtMV0ubmV4dCA9IE5VTEwgOwotICByZXR1cm4gaGVhZCA7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmFsbG9jYXRlX2Nub2RlcyhpbnQgbnVtX2Nub2RlcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaGVhZDsKKwlpbnQgaTsKKwlpZiAobnVtX2Nub2RlcyA8PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwloZWFkID0gdm1hbGxvYyhudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSk7CisJaWYgKCFoZWFkKSB7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoaGVhZCwgMCwgbnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpOworCWhlYWRbMF0ucHJldiA9IE5VTEw7CisJaGVhZFswXS5uZXh0ID0gaGVhZCArIDE7CisJZm9yIChpID0gMTsgaSA8IG51bV9jbm9kZXM7IGkrKykgeworCQloZWFkW2ldLnByZXYgPSBoZWFkICsgKGkgLSAxKTsKKwkJaGVhZFtpXS5uZXh0ID0gaGVhZCArIChpICsgMSk7CS8qIGlmIGxhc3Qgb25lLCBvdmVyd3JpdGUgaXQgYWZ0ZXIgdGhlIGlmICovCisJfQorCWhlYWRbbnVtX2Nub2RlcyAtIDFdLm5leHQgPSBOVUxMOworCXJldHVybiBoZWFkOwogfQogCiAvKgogKiogcHVsbHMgYSBjbm9kZSBvZmYgdGhlIGZyZWUgbGlzdCwgb3IgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOwogCi0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZ2V0X2Nub2RlIikgOworCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZ2V0X2Nub2RlIik7CiAKLSAgaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZCsrIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlLS0gOwotICBjbiA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgaWYgKCFjbikgewotICAgIHJldHVybiBjbiA7Ci0gIH0KLSAgaWYgKGNuLT5uZXh0KSB7Ci0gICAgY24tPm5leHQtPnByZXYgPSBOVUxMIDsKLSAgfQotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuLT5uZXh0IDsKLSAgbWVtc2V0KGNuLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKSA7Ci0gIHJldHVybiBjbiA7CisJaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlqb3VybmFsLT5qX2Nub2RlX3VzZWQrKzsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUtLTsKKwljbiA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0OworCWlmICghY24pIHsKKwkJcmV0dXJuIGNuOworCX0KKwlpZiAoY24tPm5leHQpIHsKKwkJY24tPm5leHQtPnByZXYgPSBOVUxMOworCX0KKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuLT5uZXh0OworCW1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSk7CisJcmV0dXJuIGNuOwogfQogCiAvKgogKiogcmV0dXJucyBhIGNub2RlIHRvIHRoZSBmcmVlIGxpc3QgCiAqLwotc3RhdGljIHZvaWQgZnJlZV9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKK3N0YXRpYyB2b2lkIGZyZWVfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJmcmVlX2Nub2RlIikgOworCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZnJlZV9jbm9kZSIpOwogCi0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZC0tIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlKysgOwotICAvKiBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsgKi8KLSAgY24tPm5leHQgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA7Ci0gIGlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCkgewotICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0LT5wcmV2ID0gY24gOwotICB9Ci0gIGNuLT5wcmV2ID0gTlVMTCA7IC8qIG5vdCBuZWVkZWQgd2l0aCB0aGUgbWVtc2V0LCBidXQgSSBtaWdodCBraWxsIHRoZSBtZW1zZXQsIGFuZCBmb3JnZXQgdG8gZG8gdGhpcyAqLwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuIDsKKwlqb3VybmFsLT5qX2Nub2RlX3VzZWQtLTsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUrKzsKKwkvKiBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsgKi8KKwljbi0+bmV4dCA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0OworCWlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCkgeworCQlqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdC0+cHJldiA9IGNuOworCX0KKwljbi0+cHJldiA9IE5VTEw7CS8qIG5vdCBuZWVkZWQgd2l0aCB0aGUgbWVtc2V0LCBidXQgSSBtaWdodCBraWxsIHRoZSBtZW1zZXQsIGFuZCBmb3JnZXQgdG8gZG8gdGhpcyAqLworCWpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY247CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX3ByZXBhcmVkX2JpdHMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotICBjbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7CitzdGF0aWMgdm9pZCBjbGVhcl9wcmVwYXJlZF9iaXRzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpOworCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkoYmgpOwogfQogCiAvKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGZvcmNlIGEgQlVHIGlmIGl0IGlzIGNhbGxlZCB3aXRob3V0IHRoZSBiaWcKICoqIGtlcm5lbCBsb2NrIGhlbGQuICBjYWxsZXIgaXMgdGhlIHN0cmluZyBwcmludGVkIGp1c3QgYmVmb3JlIGNhbGxpbmcgQlVHKCkKICovCi12b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqY2FsbGVyKSB7Cit2b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqY2FsbGVyKQorewogI2lmZGVmIENPTkZJR19TTVAKLSAgaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCIsIGNhbGxlcikgOwotICB9CisJaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7CisJCXJlaXNlcmZzX3BhbmljKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCIsCisJCQkgICAgICAgY2FsbGVyKTsKKwl9CiAjZWxzZQotICA7CisJOwogI2VuZGlmCiB9CiAKIC8qIHJldHVybiBhIGNub2RlIHdpdGggc2FtZSBkZXYsIGJsb2NrIG51bWJlciBhbmQgc2l6ZSBpbiB0YWJsZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKgotZ2V0X2pvdXJuYWxfaGFzaF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAotCQkgICAgIGxvbmcgYmwpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfam91cm5hbF9oYXNoX2RldihzdHJ1Y3QKKwkJCQkJCQkJICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICpzYiwKKwkJCQkJCQkJICBzdHJ1Y3QKKwkJCQkJCQkJICByZWlzZXJmc19qb3VybmFsX2Nub2RlCisJCQkJCQkJCSAgKip0YWJsZSwKKwkJCQkJCQkJICBsb25nIGJsKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBjbiA9IGpvdXJuYWxfaGFzaCh0YWJsZSwgc2IsIGJsKSA7Ci0gIHdoaWxlKGNuKSB7Ci0gICAgaWYgKGNuLT5ibG9ja25yID09IGJsICYmIGNuLT5zYiA9PSBzYikKLSAgICAgIHJldHVybiBjbiA7Ci0gICAgY24gPSBjbi0+aG5leHQgOwotICB9Ci0gIHJldHVybiAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikwIDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisJY24gPSBqb3VybmFsX2hhc2godGFibGUsIHNiLCBibCk7CisJd2hpbGUgKGNuKSB7CisJCWlmIChjbi0+YmxvY2tuciA9PSBibCAmJiBjbi0+c2IgPT0gc2IpCisJCQlyZXR1cm4gY247CisJCWNuID0gY24tPmhuZXh0OworCX0KKwlyZXR1cm4gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopMDsKIH0KIAogLyoKQEAgLTQ1NCw5MSArNDg1LDEwMyBAQAogKioKICovCiBpbnQgcmVpc2VyZnNfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibWFwX25yLCBpbnQgYml0X25yLCBpbnQgc2VhcmNoX2FsbCwgCi0JCQliX2Jsb2NrbnJfdCAqbmV4dF96ZXJvX2JpdCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBpbnQgaSA7Ci0gIHVuc2lnbmVkIGxvbmcgYmw7CisJCQlpbnQgYm1hcF9uciwgaW50IGJpdF9uciwgaW50IHNlYXJjaF9hbGwsCisJCQliX2Jsb2NrbnJfdCAqIG5leHRfemVyb19iaXQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamI7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBibDsKIAotICAqbmV4dF96ZXJvX2JpdCA9IDAgOyAvKiBhbHdheXMgc3RhcnQgdGhpcyBhdCB6ZXJvLiAqLworCSpuZXh0X3plcm9fYml0ID0gMDsJLyogYWx3YXlzIHN0YXJ0IHRoaXMgYXQgemVyby4gKi8KIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbCApOwotICAvKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgYSBzZWFyY2hfYWxsLCB0aGlzIGlzIGEgbWV0YWJsb2NrLCBhbmQgaXQgd2lsbCBiZSBsb2dnZWQgYmVmb3JlIHVzZS4KLSAgKiogaWYgd2UgY3Jhc2ggYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGZyZWVkIGl0IGNvbW1pdHMsICB0aGlzIHRyYW5zYWN0aW9uIHdvbid0Ci0gICoqIGhhdmUgY29tbWl0dGVkIGVpdGhlciwgYW5kIHRoZSBibG9jayB3aWxsIG5ldmVyIGJlIHdyaXR0ZW4KLSAgKi8KLSAgaWYgKHNlYXJjaF9hbGwpIHsKLSAgICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKLSAgICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5pbl9qb3VybmFsX2JpdG1hcCApOwotICAgICAgamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaSA7Ci0gICAgICBpZiAoamItPmpvdXJuYWxfbGlzdCAmJiBqYi0+Yml0bWFwc1tibWFwX25yXSAmJgotICAgICAgICAgIHRlc3RfYml0KGJpdF9uciwgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSkpIHsKLQkqbmV4dF96ZXJvX2JpdCA9IGZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpiLT5iaXRtYXBzW2JtYXBfbnJdLT5kYXRhKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc19zYi0+c19ibG9ja3NpemUgPDwgMywgYml0X25yKzEpIDsgCi0JcmV0dXJuIDEgOwotICAgICAgfQotICAgIH0KLSAgfQorCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWwpOworCS8qIElmIHdlIGFyZW4ndCBkb2luZyBhIHNlYXJjaF9hbGwsIHRoaXMgaXMgYSBtZXRhYmxvY2ssIGFuZCBpdCB3aWxsIGJlIGxvZ2dlZCBiZWZvcmUgdXNlLgorCSAqKiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZWQgaXQgY29tbWl0cywgIHRoaXMgdHJhbnNhY3Rpb24gd29uJ3QKKwkgKiogaGF2ZSBjb21taXR0ZWQgZWl0aGVyLCBhbmQgdGhlIGJsb2NrIHdpbGwgbmV2ZXIgYmUgd3JpdHRlbgorCSAqLworCWlmIChzZWFyY2hfYWxsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfYml0bWFwKTsKKwkJCWpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGk7CisJCQlpZiAoamItPmpvdXJuYWxfbGlzdCAmJiBqYi0+Yml0bWFwc1tibWFwX25yXSAmJgorCQkJICAgIHRlc3RfYml0KGJpdF9uciwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPgorCQkJCSAgICAgZGF0YSkpIHsKKwkJCQkqbmV4dF96ZXJvX2JpdCA9CisJCQkJICAgIGZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQorCQkJCQkJICAgICAgIChqYi0+Yml0bWFwc1tibWFwX25yXS0+CisJCQkJCQkJZGF0YSksCisJCQkJCQkgICAgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzLAorCQkJCQkJICAgICAgIGJpdF9uciArIDEpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQogCi0gIGJsID0gYm1hcF9uciAqIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpICsgYml0X25yOwotICAvKiBpcyBpdCBpbiBhbnkgb2xkIHRyYW5zYWN0aW9ucz8gKi8KLSAgaWYgKHNlYXJjaF9hbGwgJiYgKGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgYmwpKSkgewotICAgIHJldHVybiAxOyAKLSAgfQorCWJsID0gYm1hcF9uciAqIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpICsgYml0X25yOworCS8qIGlzIGl0IGluIGFueSBvbGQgdHJhbnNhY3Rpb25zPyAqLworCWlmIChzZWFyY2hfYWxsCisJICAgICYmIChjbiA9CisJCWdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIGJsKSkpIHsKKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGlzIGl0IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0gIGlmICgoY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgYmwpKSkgewotICAgIEJVRygpOwotICAgIHJldHVybiAxOyAKLSAgfQorCS8qIGlzIGl0IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKChjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibCkpKSB7CisJCUJVRygpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfcmV1c2FibGUgKTsKLSAgLyogc2FmZSBmb3IgcmV1c2UgKi8KLSAgcmV0dXJuIDAgOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfcmV1c2FibGUpOworCS8qIHNhZmUgZm9yIHJldXNlICovCisJcmV0dXJuIDA7CiB9CiAKIC8qIGluc2VydCBjbiBpbnRvIHRhYmxlCiAqLwotc3RhdGljIGlubGluZSB2b2lkIGluc2VydF9qb3VybmFsX2hhc2goc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbl9vcmlnIDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfam91cm5hbF9oYXNoKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY25fb3JpZzsKIAotICBjbl9vcmlnID0gam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA7Ci0gIGNuLT5obmV4dCA9IGNuX29yaWcgOwotICBjbi0+aHByZXYgPSBOVUxMIDsKLSAgaWYgKGNuX29yaWcpIHsKLSAgICBjbl9vcmlnLT5ocHJldiA9IGNuIDsKLSAgfQotICBqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpID0gIGNuIDsKKwljbl9vcmlnID0gam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKTsKKwljbi0+aG5leHQgPSBjbl9vcmlnOworCWNuLT5ocHJldiA9IE5VTEw7CisJaWYgKGNuX29yaWcpIHsKKwkJY25fb3JpZy0+aHByZXYgPSBjbjsKKwl9CisJam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA9IGNuOwogfQogCiAvKiBsb2NrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCi1pbmxpbmUgc3RhdGljIHZvaWQgbG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmxvY2tfam91cm5hbCApOwotICAgIGRvd24oJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKK2lubGluZSBzdGF0aWMgdm9pZCBsb2NrX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubG9ja19qb3VybmFsKTsKKwlkb3duKCZTQl9KT1VSTkFMKHBfc19zYiktPmpfbG9jayk7CiB9CiAKIC8qIHVubG9jayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwotaW5saW5lIHN0YXRpYyB2b2lkIHVubG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgdXAoJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKK2lubGluZSBzdGF0aWMgdm9pZCB1bmxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwl1cCgmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2pvdXJuYWxfbGlzdChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKIHsKLSAgICBqbC0+al9yZWZjb3VudCsrOworCWpsLT5qX3JlZmNvdW50Kys7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkJICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIGlmIChqbC0+al9yZWZjb3VudCA8IDEpIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWMgKHMsICJ0cmFucyBpZCAlbHUsIHJlZmNvdW50IGF0ICVkIiwgamwtPmpfdHJhbnNfaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbC0+al9yZWZjb3VudCk7Ci0gICAgfQotICAgIGlmICgtLWpsLT5qX3JlZmNvdW50ID09IDApCi0gICAgICAgIHJlaXNlcmZzX2tmcmVlKGpsLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHMpOworCWlmIChqbC0+al9yZWZjb3VudCA8IDEpIHsKKwkJcmVpc2VyZnNfcGFuaWMocywgInRyYW5zIGlkICVsdSwgcmVmY291bnQgYXQgJWQiLAorCQkJICAgICAgIGpsLT5qX3RyYW5zX2lkLCBqbC0+al9yZWZjb3VudCk7CisJfQorCWlmICgtLWpsLT5qX3JlZmNvdW50ID09IDApCisJCXJlaXNlcmZzX2tmcmVlKGpsLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHMpOwogfQogCiAvKgpAQCAtNTQ2LDM1NCArNTg5LDM3NSBAQAogKiogaXQgZ2V0cyBjYWxsZWQgYnkgZmx1c2hfY29tbWl0X2xpc3QsIGFuZCBjbGVhbnMgdXAgYW55IGRhdGEgc3RvcmVkIGFib3V0IGJsb2NrcyBmcmVlZCBkdXJpbmcgYQogKiogdHJhbnNhY3Rpb24uCiAqLwotc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQkgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKIAotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gamwtPmpfbGlzdF9iaXRtYXAgOwotICBpZiAoamIpIHsKLSAgICBjbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpIDsKLSAgfQotICBqbC0+al9saXN0X2JpdG1hcC0+am91cm5hbF9saXN0ID0gTlVMTCA7Ci0gIGpsLT5qX2xpc3RfYml0bWFwID0gTlVMTCA7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IGpsLT5qX2xpc3RfYml0bWFwOworCWlmIChqYikgeworCQljbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpOworCX0KKwlqbC0+al9saXN0X2JpdG1hcC0+am91cm5hbF9saXN0ID0gTlVMTDsKKwlqbC0+al9saXN0X2JpdG1hcCA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSAmam91cm5hbC0+al9qb3VybmFsX2xpc3Q7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CiAKLSAgICBpZiAoIWxpc3RfZW1wdHkoZW50cnkpKSB7Ci0gICAgICAgIGpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5LT5uZXh0KTsKLQlpZiAoamwtPmpfdHJhbnNfaWQgPD0gdHJhbnNfaWQpIHsKLQkgICAgcmV0dXJuIDE7CisJaWYgKCFsaXN0X2VtcHR5KGVudHJ5KSkgeworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeS0+bmV4dCk7CisJCWlmIChqbC0+al90cmFuc19pZCA8PSB0cmFuc19pZCkgeworCQkJcmV0dXJuIDE7CisJCX0KIAl9Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7Ci0gICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworc3RhdGljIHZvaWQgcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLSAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiY2xtLTIwODQ6IHBpbm5lZCBidWZmZXIgJWx1OiVzIHNlbnQgdG8gZGlzayIsCi0JICAgICAgICAgICAgICAgICBiaC0+Yl9ibG9ja25yLCBiZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSkgOwotICAgIH0KLSAgICBpZiAodXB0b2RhdGUpCi0gICAgCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpIDsKLSAgICBlbHNlCi0gICAgCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCkgOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKLSAgICBwdXRfYmgoYmgpIDsKKwlpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiY2xtLTIwODQ6IHBpbm5lZCBidWZmZXIgJWx1OiVzIHNlbnQgdG8gZGlzayIsCisJCQkJIGJoLT5iX2Jsb2NrbnIsIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKTsKKwl9CisJaWYgKHVwdG9kYXRlKQorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwllbHNlCisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKIH0KIAotc3RhdGljIHZvaWQgcmVpc2VyZnNfZW5kX29yZGVyZWRfaW8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7Ci0gICAgaWYgKHVwdG9kYXRlKQotICAgIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKSA7Ci0gICAgZWxzZQotICAgIAljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpIDsKLSAgICB1bmxvY2tfYnVmZmVyKGJoKSA7Ci0gICAgcHV0X2JoKGJoKSA7CitzdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfb3JkZXJlZF9pbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKQorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwllbHNlCisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKIH0KIAotc3RhdGljIHZvaWQgc3VibWl0X2xvZ2dlZF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIGdldF9iaChiaCkgOwotICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9idWZmZXJfaW9fc3luYyA7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChiaCk7Ci0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7Ci0gICAgaWYgKCF0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKSkKLSAgICAgICAgQlVHKCk7Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKSA7CitzdGF0aWMgdm9pZCBzdWJtaXRfbG9nZ2VkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jOworCWNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyhiaCk7CisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChiaCkpCisJCUJVRygpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJQlVHKCk7CisJc3VibWl0X2JoKFdSSVRFLCBiaCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN1Ym1pdF9vcmRlcmVkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgZ2V0X2JoKGJoKSA7Ci0gICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87Ci0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKSA7CitzdGF0aWMgdm9pZCBzdWJtaXRfb3JkZXJlZF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlnZXRfYmgoYmgpOworCWJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlCVUcoKTsKKwlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKIH0KIAotc3RhdGljIGludCBzdWJtaXRfYmFycmllcl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIGdldF9iaChiaCkgOwotICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOwotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOwotICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKLSAgICAgICAgQlVHKCk7Ci0gICAgcmV0dXJuIHN1Ym1pdF9iaChXUklURV9CQVJSSUVSLCBiaCkgOworc3RhdGljIGludCBzdWJtaXRfYmFycmllcl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlnZXRfYmgoYmgpOworCWJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlCVUcoKTsKKwlyZXR1cm4gc3VibWl0X2JoKFdSSVRFX0JBUlJJRVIsIGJoKTsKIH0KIAogc3RhdGljIHZvaWQgY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSkgewotCWNsZWFyX2J1ZmZlcl9lb3Bub3RzdXBwKGJoKTsKLQlkaXNhYmxlX2JhcnJpZXIocyk7Ci0Jc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0Jc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0Jc3luY19kaXJ0eV9idWZmZXIoYmgpOwotICAgIH0KKwkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSkgeworCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJCWRpc2FibGVfYmFycmllcihzKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJfQogfQogCiAjZGVmaW5lIENIVU5LX1NJWkUgMzIKIHN0cnVjdCBidWZmZXJfY2h1bmsgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbQ0hVTktfU0laRV07Ci0gICAgaW50IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhbQ0hVTktfU0laRV07CisJaW50IG5yOwogfTsKIAotc3RhdGljIHZvaWQgd3JpdGVfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7Ci0Jc3VibWl0X2xvZ2dlZF9idWZmZXIoY2h1bmstPmJoW2ldKSA7Ci0gICAgfQotICAgIGNodW5rLT5uciA9IDA7CitzdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKwlpbnQgaTsKKwlnZXRfZnNfZXhjbCgpOworCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgeworCQlzdWJtaXRfbG9nZ2VkX2J1ZmZlcihjaHVuay0+YmhbaV0pOworCX0KKwljaHVuay0+bnIgPSAwOworCXB1dF9mc19leGNsKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7Ci0Jc3VibWl0X29yZGVyZWRfYnVmZmVyKGNodW5rLT5iaFtpXSkgOwotICAgIH0KLSAgICBjaHVuay0+bnIgPSAwOworc3RhdGljIHZvaWQgd3JpdGVfb3JkZXJlZF9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKwlpbnQgaTsKKwlnZXRfZnNfZXhjbCgpOworCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgeworCQlzdWJtaXRfb3JkZXJlZF9idWZmZXIoY2h1bmstPmJoW2ldKTsKKwl9CisJY2h1bmstPm5yID0gMDsKKwlwdXRfZnNfZXhjbCgpOwogfQogCiBzdGF0aWMgaW50IGFkZF90b19jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSBzcGlubG9ja190ICpsb2NrLAotCQkJIHZvaWQgKGZuKShzdHJ1Y3QgYnVmZmVyX2NodW5rICopKQorCQkJc3BpbmxvY2tfdCAqIGxvY2ssIHZvaWQgKGZuKSAoc3RydWN0IGJ1ZmZlcl9jaHVuayAqKSkKIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpCi0gICAgICAgIEJVRygpOwotICAgIGNodW5rLT5iaFtjaHVuay0+bnIrK10gPSBiaDsKLSAgICBpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpIHsKLQlyZXQgPSAxOwotICAgICAgICBpZiAobG9jaykKLQkgICAgc3Bpbl91bmxvY2sobG9jayk7Ci0gICAgICAgIGZuKGNodW5rKTsKLSAgICAgICAgaWYgKGxvY2spCi0JICAgIHNwaW5fbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpCisJCUJVRygpOworCWNodW5rLT5iaFtjaHVuay0+bnIrK10gPSBiaDsKKwlpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpIHsKKwkJcmV0ID0gMTsKKwkJaWYgKGxvY2spCisJCQlzcGluX3VubG9jayhsb2NrKTsKKwkJZm4oY2h1bmspOworCQlpZiAobG9jaykKKwkJCXNwaW5fbG9jayhsb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgYXRvbWljX3QgbnJfcmVpc2VyZnNfamggPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfamggKmFsbG9jX2poKHZvaWQpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwotICAgIHdoaWxlKDEpIHsKLQlqaCA9IGttYWxsb2Moc2l6ZW9mKCpqaCksIEdGUF9OT0ZTKTsKLQlpZiAoamgpIHsKLQkgICAgYXRvbWljX2luYygmbnJfcmVpc2VyZnNfamgpOwotCSAgICByZXR1cm4gamg7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2poICphbGxvY19qaCh2b2lkKQoreworCXN0cnVjdCByZWlzZXJmc19qaCAqamg7CisJd2hpbGUgKDEpIHsKKwkJamggPSBrbWFsbG9jKHNpemVvZigqamgpLCBHRlBfTk9GUyk7CisJCWlmIChqaCkgeworCQkJYXRvbWljX2luYygmbnJfcmVpc2VyZnNfamgpOworCQkJcmV0dXJuIGpoOworCQl9CisJCXlpZWxkKCk7CiAJfQotICAgICAgICB5aWVsZCgpOwotICAgIH0KIH0KIAogLyoKICAqIHdlIHdhbnQgdG8gZnJlZSB0aGUgamggd2hlbiB0aGUgYnVmZmVyIGhhcyBiZWVuIHdyaXR0ZW4KICAqIGFuZCB3YWl0ZWQgb24KICAqLwotdm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwordm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHJlaXNlcmZzX2poICpqaDsKIAotICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKLSAgICBpZiAoamgpIHsKLQliaC0+Yl9wcml2YXRlID0gTlVMTDsKLQlqaC0+YmggPSBOVUxMOwotCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKLQlrZnJlZShqaCk7Ci0JaWYgKGF0b21pY19yZWFkKCZucl9yZWlzZXJmc19qaCkgPD0gMCkKLQkgICAgQlVHKCk7Ci0JYXRvbWljX2RlYygmbnJfcmVpc2VyZnNfamgpOwotCXB1dF9iaChiaCk7Ci0gICAgfQorCWpoID0gYmgtPmJfcHJpdmF0ZTsKKwlpZiAoamgpIHsKKwkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJCWpoLT5iaCA9IE5VTEw7CisJCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwkJa2ZyZWUoamgpOworCQlpZiAoYXRvbWljX3JlYWQoJm5yX3JlaXNlcmZzX2poKSA8PSAwKQorCQkJQlVHKCk7CisJCWF0b21pY19kZWMoJm5yX3JlaXNlcmZzX2poKTsKKwkJcHV0X2JoKGJoKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fYWRkX2poKHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhaWwpCisJCQkgICBpbnQgdGFpbCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCXN0cnVjdCByZWlzZXJmc19qaCAqamg7CiAKLSAgICBpZiAoYmgtPmJfcHJpdmF0ZSkgewotCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCWlmICghYmgtPmJfcHJpdmF0ZSkgewotCSAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCSAgICBnb3RvIG5vX2poOworCWlmIChiaC0+Yl9wcml2YXRlKSB7CisJCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCQlpZiAoIWJoLT5iX3ByaXZhdGUpIHsKKwkJCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJCQlnb3RvIG5vX2poOworCQl9CisJCWpoID0gYmgtPmJfcHJpdmF0ZTsKKwkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCX0gZWxzZSB7CisJICAgICAgbm9famg6CisJCWdldF9iaChiaCk7CisJCWpoID0gYWxsb2NfamgoKTsKKwkJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJCS8qIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCBmb3IgX19hZGRfamgsIHNob3VsZCBiZSBhYmxlIHRvIGhhdmUKKwkJICogdHdvIGFkZHMgYXQgdGhlIHNhbWUgdGltZQorCQkgKi8KKwkJaWYgKGJoLT5iX3ByaXZhdGUpCisJCQlCVUcoKTsKKwkJamgtPmJoID0gYmg7CisJCWJoLT5iX3ByaXZhdGUgPSBqaDsKIAl9Ci0gICAgICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKLQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0gICAgfSBlbHNlIHsKLW5vX2poOgotCWdldF9iaChiaCk7Ci0JamggPSBhbGxvY19qaCgpOwotCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCS8qIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCBmb3IgX19hZGRfamgsIHNob3VsZCBiZSBhYmxlIHRvIGhhdmUKLQkgKiB0d28gYWRkcyBhdCB0aGUgc2FtZSB0aW1lCi0JICovCi0JaWYgKGJoLT5iX3ByaXZhdGUpCi0JICAgIEJVRygpOwotCWpoLT5iaCA9IGJoOwotCWJoLT5iX3ByaXZhdGUgPSBqaDsKLSAgICB9Ci0gICAgamgtPmpsID0gai0+al9jdXJyZW50X2psOwotICAgIGlmICh0YWlsKQotCWxpc3RfYWRkX3RhaWwoJmpoLT5saXN0LCAmamgtPmpsLT5qX3RhaWxfYmhfbGlzdCk7Ci0gICAgZWxzZSB7Ci0JbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfYmhfbGlzdCk7Ci0gICAgfQotICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7Ci0gICAgcmV0dXJuIDA7CisJamgtPmpsID0gai0+al9jdXJyZW50X2psOworCWlmICh0YWlsKQorCQlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al90YWlsX2JoX2xpc3QpOworCWVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al9iaF9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIHJldHVybiBfX2FkZF9qaChTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSwgYmgsIDEpOworaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAxKTsKIH0KLWludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICByZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAwKTsKK2ludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIF9fYWRkX2poKFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLCBiaCwgMCk7CiB9CiAKICNkZWZpbmUgSkhfRU5UUlkobCkgbGlzdF9lbnRyeSgobCksIHN0cnVjdCByZWlzZXJmc19qaCwgbGlzdCkKLXN0YXRpYyBpbnQgd3JpdGVfb3JkZXJlZF9idWZmZXJzKHNwaW5sb2NrX3QgKmxvY2ssCitzdGF0aWMgaW50IHdyaXRlX29yZGVyZWRfYnVmZmVycyhzcGlubG9ja190ICogbG9jaywKIAkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCiAJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwotICAgIGludCByZXQgPSBqLT5qX2Vycm5vOwotICAgIHN0cnVjdCBidWZmZXJfY2h1bmsgY2h1bms7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCB0bXA7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCWludCByZXQgPSBqLT5qX2Vycm5vOworCXN0cnVjdCBidWZmZXJfY2h1bmsgY2h1bms7CisJc3RydWN0IGxpc3RfaGVhZCB0bXA7CisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAKLSAgICBjaHVuay5uciA9IDA7Ci0gICAgc3Bpbl9sb2NrKGxvY2spOwotICAgIHdoaWxlKCFsaXN0X2VtcHR5KGxpc3QpKSB7Ci0gICAgICAgIGpoID0gSkhfRU5UUlkobGlzdC0+bmV4dCk7Ci0JYmggPSBqaC0+Ymg7Ci0JZ2V0X2JoKGJoKTsKLQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkgICAgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKLQkJbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKLQkJZ290byBsb29wX25leHQ7Ci0JICAgIH0KLQkgICAgc3Bpbl91bmxvY2sobG9jayk7Ci0JICAgIGlmIChjaHVuay5ucikKLQkJd3JpdGVfb3JkZXJlZF9jaHVuaygmY2h1bmspOwotCSAgICB3YWl0X29uX2J1ZmZlcihiaCk7Ci0JICAgIGNvbmRfcmVzY2hlZCgpOwotCSAgICBzcGluX2xvY2sobG9jayk7Ci0JICAgIGdvdG8gbG9vcF9uZXh0OwotICAgICAgICB9Ci0JaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkgICAgbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOwotCSAgICBsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOwotICAgICAgICAgICAgYWRkX3RvX2NodW5rKCZjaHVuaywgYmgsIGxvY2ssIHdyaXRlX29yZGVyZWRfY2h1bmspOwotCX0gZWxzZSB7Ci0JICAgIHJlaXNlcmZzX2ZyZWVfamgoYmgpOwotCSAgICB1bmxvY2tfYnVmZmVyKGJoKTsKLQl9Ci1sb29wX25leHQ6Ci0JcHV0X2JoKGJoKTsKLQljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgaWYgKGNodW5rLm5yKSB7Ci0Jc3Bpbl91bmxvY2sobG9jayk7Ci0gICAgICAgIHdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKKwljaHVuay5uciA9IDA7CiAJc3Bpbl9sb2NrKGxvY2spOwotICAgIH0KLSAgICB3aGlsZSghbGlzdF9lbXB0eSgmdG1wKSkgewotICAgICAgICBqaCA9IEpIX0VOVFJZKHRtcC5wcmV2KTsKLQliaCA9IGpoLT5iaDsKLQlnZXRfYmgoYmgpOwotCXJlaXNlcmZzX2ZyZWVfamgoYmgpOwotCi0JaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JICAgIHNwaW5fdW5sb2NrKGxvY2spOwotCSAgICB3YWl0X29uX2J1ZmZlcihiaCk7Ci0JICAgIHNwaW5fbG9jayhsb2NrKTsKLQl9Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JICAgIHJldCA9IC1FSU87Ci0gICAgICAgIH0KLQlwdXRfYmgoYmgpOwotCWNvbmRfcmVzY2hlZF9sb2NrKGxvY2spOwotICAgIH0KLSAgICBzcGluX3VubG9jayhsb2NrKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZsdXNoX29sZGVyX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamw7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmlyc3Rfamw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0gICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICAgIHVuc2lnbmVkIGxvbmcgb3RoZXJfdHJhbnNfaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmaXJzdF90cmFuc19pZDsKLQotZmluZF9maXJzdDoKLSAgICAvKgotICAgICAqIGZpcnN0IHdlIHdhbGsgYmFja3dhcmRzIHRvIGZpbmQgdGhlIG9sZGVzdCB1bmNvbW1pdHRlZCB0cmFuc2F0aW9uCi0gICAgICovCi0gICAgZmlyc3RfamwgPSBqbDsKLSAgICBlbnRyeSA9IGpsLT5qX2xpc3QucHJldjsKLSAgICB3aGlsZSgxKSB7Ci0Jb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwotCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QgfHwKLQkgICAgYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpCi0JICAgIGJyZWFrOwotCi0gICAgICAgIGZpcnN0X2psID0gb3RoZXJfamw7Ci0JZW50cnkgPSBvdGhlcl9qbC0+al9saXN0LnByZXY7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgZGlkbid0IGZpbmQgYW55IG9sZGVyIHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIG5vdyAqLwotICAgIGlmIChmaXJzdF9qbCA9PSBqbCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmaXJzdF90cmFuc19pZCA9IGZpcnN0X2psLT5qX3RyYW5zX2lkOwotCi0gICAgZW50cnkgPSAmZmlyc3RfamwtPmpfbGlzdDsKLSAgICB3aGlsZSgxKSB7Ci0Jb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwotCW90aGVyX3RyYW5zX2lkID0gb3RoZXJfamwtPmpfdHJhbnNfaWQ7Ci0KLQlpZiAob3RoZXJfdHJhbnNfaWQgPCB0cmFuc19pZCkgewotCSAgICBpZiAoYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX2NvbW1pdF9sZWZ0KSAhPSAwKSB7Ci0JCWZsdXNoX2NvbW1pdF9saXN0KHMsIG90aGVyX2psLCAwKTsKLQotCQkvKiBsaXN0IHdlIHdlcmUgY2FsbGVkIHdpdGggaXMgZ29uZSwgcmV0dXJuICovCi0JCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkKLQkJICAgIHJldHVybiAxOwotCi0JCS8qIHRoZSBvbmUgd2UganVzdCBmbHVzaGVkIGlzIGdvbmUsIHRoaXMgbWVhbnMgYWxsCi0JCSAqIG9sZGVyIGxpc3RzIGFyZSBhbHNvIGdvbmUsIHNvIGZpcnN0X2psIGlzIG5vIGxvbmdlcgotCQkgKiB2YWxpZCBlaXRoZXIuICBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuCi0JCSAqLwotCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCBvdGhlcl90cmFuc19pZCkpIHsKLQkJICAgIGdvdG8gZmluZF9maXJzdDsKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJamggPSBKSF9FTlRSWShsaXN0LT5uZXh0KTsKKwkJYmggPSBqaC0+Ymg7CisJCWdldF9iaChiaCk7CisJCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQkJaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCQkJCWxpc3RfYWRkKCZqaC0+bGlzdCwgJnRtcCk7CisJCQkJZ290byBsb29wX25leHQ7CisJCQl9CisJCQlzcGluX3VubG9jayhsb2NrKTsKKwkJCWlmIChjaHVuay5ucikKKwkJCQl3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCXNwaW5fbG9jayhsb2NrKTsKKwkJCWdvdG8gbG9vcF9uZXh0OwogCQl9Ci0JICAgIH0KLQkgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLQkgICAgaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkgICAgcmV0dXJuIDA7CisJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJCQlsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOworCQkJYWRkX3RvX2NodW5rKCZjaHVuaywgYmgsIGxvY2ssIHdyaXRlX29yZGVyZWRfY2h1bmspOworCQl9IGVsc2UgeworCQkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfQorCSAgICAgIGxvb3BfbmV4dDoKKwkJcHV0X2JoKGJoKTsKKwkJY29uZF9yZXNjaGVkX2xvY2sobG9jayk7CiAJfQotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAoY2h1bmsubnIpIHsKKwkJc3Bpbl91bmxvY2sobG9jayk7CisJCXdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKKwkJc3Bpbl9sb2NrKGxvY2spOworCX0KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJamggPSBKSF9FTlRSWSh0bXAucHJldik7CisJCWJoID0gamgtPmJoOworCQlnZXRfYmgoYmgpOworCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKKworCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCXNwaW5fdW5sb2NrKGxvY2spOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJc3Bpbl9sb2NrKGxvY2spOworCQl9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlwdXRfYmgoYmgpOworCQljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKKwl9CisJc3Bpbl91bmxvY2sobG9jayk7CisJcmV0dXJuIHJldDsKIH0KLWludCByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIERFRklORV9XQUlUKHdhaXQpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChzKTsKLSAgICBpZiAoYXRvbWljX3JlYWQoJmotPmpfYXN5bmNfdGhyb3R0bGUpKQotICAgIAlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7Ci0gICAgcmV0dXJuIDA7CisKK3N0YXRpYyBpbnQgZmx1c2hfb2xkZXJfY29tbWl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKm90aGVyX2psOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpcnN0X2psOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwl1bnNpZ25lZCBsb25nIG90aGVyX3RyYW5zX2lkOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfdHJhbnNfaWQ7CisKKyAgICAgIGZpbmRfZmlyc3Q6CisJLyoKKwkgKiBmaXJzdCB3ZSB3YWxrIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBvbGRlc3QgdW5jb21taXR0ZWQgdHJhbnNhdGlvbgorCSAqLworCWZpcnN0X2psID0gamw7CisJZW50cnkgPSBqbC0+al9saXN0LnByZXY7CisJd2hpbGUgKDEpIHsKKwkJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0IHx8CisJCSAgICBhdG9taWNfcmVhZCgmb3RoZXJfamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkKKwkJCWJyZWFrOworCisJCWZpcnN0X2psID0gb3RoZXJfamw7CisJCWVudHJ5ID0gb3RoZXJfamwtPmpfbGlzdC5wcmV2OworCX0KKworCS8qIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBvbGRlciB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMsIHJldHVybiBub3cgKi8KKwlpZiAoZmlyc3RfamwgPT0gamwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZmlyc3RfdHJhbnNfaWQgPSBmaXJzdF9qbC0+al90cmFuc19pZDsKKworCWVudHJ5ID0gJmZpcnN0X2psLT5qX2xpc3Q7CisJd2hpbGUgKDEpIHsKKwkJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlvdGhlcl90cmFuc19pZCA9IG90aGVyX2psLT5qX3RyYW5zX2lkOworCisJCWlmIChvdGhlcl90cmFuc19pZCA8IHRyYW5zX2lkKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX2NvbW1pdF9sZWZ0KSAhPSAwKSB7CisJCQkJZmx1c2hfY29tbWl0X2xpc3Qocywgb3RoZXJfamwsIDApOworCisJCQkJLyogbGlzdCB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGlzIGdvbmUsIHJldHVybiAqLworCQkJCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQkvKiB0aGUgb25lIHdlIGp1c3QgZmx1c2hlZCBpcyBnb25lLCB0aGlzIG1lYW5zIGFsbAorCQkJCSAqIG9sZGVyIGxpc3RzIGFyZSBhbHNvIGdvbmUsIHNvIGZpcnN0X2psIGlzIG5vIGxvbmdlcgorCQkJCSAqIHZhbGlkIGVpdGhlci4gIEdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4KKwkJCQkgKi8KKwkJCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZQorCQkJCSAgICAocywgb3RoZXJfdHJhbnNfaWQpKSB7CisJCQkJCWdvdG8gZmluZF9maXJzdDsKKwkJCQl9CisJCQl9CisJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAwOworfQoraW50IHJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChzKTsKKwlpZiAoYXRvbWljX3JlYWQoJmotPmpfYXN5bmNfdGhyb3R0bGUpKQorCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWiAvIDEwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTkwMywyMDkgKzk2NywyMjUgQEAKICoqIEJlZm9yZSB0aGUgY29tbWl0IGJsb2NrIGNhbiBieSB3cml0dGVuLCBldmVyeSBvdGhlciBsb2cgYmxvY2sgbXVzdCBiZSBzYWZlbHkgb24gZGlzawogKioKICovCi1zdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgewotICBpbnQgaTsKLSAgaW50IGJuIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBOVUxMIDsKLSAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICBpbnQgYmFycmllciA9IDA7Ci0gIGludCByZXR2YWwgPSAwOworc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpCit7CisJaW50IGk7CisJaW50IGJuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWludCBiYXJyaWVyID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKIAotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHMsICJmbHVzaF9jb21taXRfbGlzdCIpIDsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHMsICJmbHVzaF9jb21taXRfbGlzdCIpOwogCi0gIGlmIChhdG9taWNfcmVhZCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkgewotICAgIHJldHVybiAwIDsKLSAgfQorCWlmIChhdG9taWNfcmVhZCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkgeworCQlyZXR1cm4gMDsKKwl9CiAKLSAgLyogYmVmb3JlIHdlIGNhbiBwdXQgb3VyIGNvbW1pdCBibG9ja3Mgb24gZGlzaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgZXZlcnlvbmUgb2xkZXIgdGhhbgotICAqKiB1cyBpcyBvbiBkaXNrIHRvbwotICAqLwotICBCVUdfT04gKGpsLT5qX2xlbiA8PSAwKTsKLSAgQlVHX09OICh0cmFuc19pZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKTsKKwlnZXRfZnNfZXhjbCgpOwogCi0gIGdldF9qb3VybmFsX2xpc3QoamwpOwotICBpZiAoZmx1c2hhbGwpIHsKLSAgICBpZiAoZmx1c2hfb2xkZXJfY29tbWl0cyhzLCBqbCkgPT0gMSkgewotICAgICAgLyogbGlzdCBkaXNhcHBlYXJlZCBkdXJpbmcgZmx1c2hfb2xkZXJfY29tbWl0cy4gIHJldHVybiAqLwotICAgICAgZ290byBwdXRfamw7Ci0gICAgfQotICB9CisJLyogYmVmb3JlIHdlIGNhbiBwdXQgb3VyIGNvbW1pdCBibG9ja3Mgb24gZGlzaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgZXZlcnlvbmUgb2xkZXIgdGhhbgorCSAqKiB1cyBpcyBvbiBkaXNrIHRvbworCSAqLworCUJVR19PTihqbC0+al9sZW4gPD0gMCk7CisJQlVHX09OKHRyYW5zX2lkID09IGpvdXJuYWwtPmpfdHJhbnNfaWQpOwogCi0gIC8qIG1ha2Ugc3VyZSBub2JvZHkgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoaXMgb25lIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgZG93bigmamwtPmpfY29tbWl0X2xvY2spOwotICBpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpIHsKLSAgICB1cCgmamwtPmpfY29tbWl0X2xvY2spOwotICAgIGdvdG8gcHV0X2psOwotICB9Ci0gIEJVR19PTiAoamwtPmpfdHJhbnNfaWQgPT0gMCk7CisJZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisJaWYgKGZsdXNoYWxsKSB7CisJCWlmIChmbHVzaF9vbGRlcl9jb21taXRzKHMsIGpsKSA9PSAxKSB7CisJCQkvKiBsaXN0IGRpc2FwcGVhcmVkIGR1cmluZyBmbHVzaF9vbGRlcl9jb21taXRzLiAgcmV0dXJuICovCisJCQlnb3RvIHB1dF9qbDsKKwkJfQorCX0KIAotICAvKiB0aGlzIGNvbW1pdCBpcyBkb25lLCBleGl0ICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgewotICAgIGlmIChmbHVzaGFsbCkgewotICAgICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKLSAgICB9Ci0gICAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKLSAgICBnb3RvIHB1dF9qbDsKLSAgfQorCS8qIG1ha2Ugc3VyZSBub2JvZHkgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoaXMgb25lIGF0IHRoZSBzYW1lIHRpbWUgKi8KKwlkb3duKCZqbC0+al9jb21taXRfbG9jayk7CisJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgdHJhbnNfaWQpKSB7CisJCXVwKCZqbC0+al9jb21taXRfbG9jayk7CisJCWdvdG8gcHV0X2psOworCX0KKwlCVUdfT04oamwtPmpfdHJhbnNfaWQgPT0gMCk7CiAKLSAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgewotICAgICAgdW5sb2NrX2tlcm5lbCgpOwotICAgICAgd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLCBqbCwgJmpsLT5qX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBCVUdfT04gKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7Ci0gIC8qCi0gICAqIGZvciB0aGUgZGVzY3JpcHRpb24gYmxvY2sgYW5kIGFsbCB0aGUgbG9nIGJsb2Nrcywgc3VibWl0IGFueSBidWZmZXJzCi0gICAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKLSAgICovCi0gIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICBmb3IgKGkgPSAwIDsgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgewotICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsgKGpsLT5qX3N0YXJ0K2kpICUKLSAgICAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7Ci0gICAgdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibikgOwotICAgIGlmIChidWZmZXJfZGlydHkodGJoKSkgLyogcmVkdW5kYW50LCBsbF9yd19ibG9jaygpIGNoZWNrcyAqLwotCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKSA7Ci0gICAgcHV0X2JoKHRiaCkgOwotICB9Ci0gIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCS8qIHRoaXMgY29tbWl0IGlzIGRvbmUsIGV4aXQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKKwkJaWYgKGZsdXNoYWxsKSB7CisJCQlhdG9taWNfc2V0KCYoamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSwgMSk7CisJCX0KKwkJdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkJZ290byBwdXRfamw7CisJfQogCi0gIC8qIHdhaXQgb24gZXZlcnl0aGluZyB3cml0dGVuIHNvIGZhciBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWl0Ci0gICAqIGlmIHdlIGFyZSBpbiBiYXJyaWVyIG1vZGUsIHNlbmQgdGhlIGNvbW1pdCBkb3duIG5vdwotICAgKi8KLSAgYmFycmllciA9IHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocyk7Ci0gIGlmIChiYXJyaWVyKSB7Ci0gICAgICBpbnQgcmV0OwotICAgICAgbG9ja19idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKLSAgICAgIHJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOwotICAgICAgaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgewotCSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShqbC0+al9jb21taXRfYmgpOwotICAgICAgICAgIGRpc2FibGVfYmFycmllcihzKTsKLQkgIGJhcnJpZXIgPSAwOwotICAgICAgfQotICB9Ci0gIGZvciAoaSA9IDAgOyAgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgewotICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsKLQkgKGpsLT5qX3N0YXJ0ICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpIDsKLSAgICB0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKSA7Ci0gICAgd2FpdF9vbl9idWZmZXIodGJoKSA7Ci0gICAgLy8gc2luY2Ugd2UncmUgdXNpbmcgbGxfcndfYmxrIGFib3ZlLCBpdCBtaWdodCBoYXZlIHNraXBwZWQgb3ZlcgotICAgIC8vIGEgbG9ja2VkIGJ1ZmZlci4gIERvdWJsZSBjaGVjayBoZXJlCi0gICAgLy8KLSAgICBpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIC8qIHJlZHVuZGFudCwgc3luY19kaXJ0eV9idWZmZXIoKSBjaGVja3MgKi8KLSAgICAgIHN5bmNfZGlydHlfYnVmZmVyKHRiaCk7Ci0gICAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisJCQkJICAgICAgam91cm5hbCwgamwsICZqbC0+al9iaF9saXN0KTsKKwkJbG9ja19rZXJuZWwoKTsKKwl9CisJQlVHX09OKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7CisJLyoKKwkgKiBmb3IgdGhlIGRlc2NyaXB0aW9uIGJsb2NrIGFuZCBhbGwgdGhlIGxvZyBibG9ja3MsIHN1Ym1pdCBhbnkgYnVmZmVycworCSAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKKwkgKi8KKwlhdG9taWNfaW5jKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGpsLT5qX2xlbiArIDEpOyBpKyspIHsKKwkJYm4gPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socykgKyAoamwtPmpfc3RhcnQgKyBpKSAlCisJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpOworCQl0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKTsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eSh0YmgpKQkvKiByZWR1bmRhbnQsIGxsX3J3X2Jsb2NrKCkgY2hlY2tzICovCisJCQlsbF9yd19ibG9jayhXUklURSwgMSwgJnRiaCk7CisJCXB1dF9iaCh0YmgpOworCX0KKwlhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKworCS8qIHdhaXQgb24gZXZlcnl0aGluZyB3cml0dGVuIHNvIGZhciBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWl0CisJICogaWYgd2UgYXJlIGluIGJhcnJpZXIgbW9kZSwgc2VuZCB0aGUgY29tbWl0IGRvd24gbm93CisJICovCisJYmFycmllciA9IHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocyk7CisJaWYgKGJhcnJpZXIpIHsKKwkJaW50IHJldDsKKwkJbG9ja19idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKwkJcmV0ID0gc3VibWl0X2JhcnJpZXJfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKTsKKwkJCWRpc2FibGVfYmFycmllcihzKTsKKwkJCWJhcnJpZXIgPSAwOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCAoamwtPmpfbGVuICsgMSk7IGkrKykgeworCQlibiA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSArCisJCSAgICAoamwtPmpfc3RhcnQgKyBpKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CisJCXRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQkvLyBzaW5jZSB3ZSdyZSB1c2luZyBsbF9yd19ibGsgYWJvdmUsIGl0IG1pZ2h0IGhhdmUgc2tpcHBlZCBvdmVyCisJCS8vIGEgbG9ja2VkIGJ1ZmZlci4gIERvdWJsZSBjaGVjayBoZXJlCisJCS8vCisJCWlmIChidWZmZXJfZGlydHkodGJoKSkJLyogcmVkdW5kYW50LCBzeW5jX2RpcnR5X2J1ZmZlcigpIGNoZWNrcyAqLworCQkJc3luY19kaXJ0eV9idWZmZXIodGJoKTsKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtNjAxLCBidWZmZXIgd3JpdGUgZmFpbGVkIikgOworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MDEsIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKICNlbmRpZgotICAgICAgcmV0dmFsID0gLUVJTzsKLSAgICB9Ci0gICAgcHV0X2JoKHRiaCkgOyAvKiBvbmNlIGZvciBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrICovCi0gICAgcHV0X2JoKHRiaCkgOyAgICAvKiBvbmNlIGR1ZSB0byBvcmlnaW5hbCBnZXRibGsgaW4gZG9fam91cm5hbF9lbmQgKi8KLSAgICBhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKSA7Ci0gIH0KKwkJCXJldHZhbCA9IC1FSU87CisJCX0KKwkJcHV0X2JoKHRiaCk7CS8qIG9uY2UgZm9yIGpvdXJuYWxfZmluZF9nZXRfYmxvY2sgKi8KKwkJcHV0X2JoKHRiaCk7CS8qIG9uY2UgZHVlIHRvIG9yaWdpbmFsIGdldGJsayBpbiBkb19qb3VybmFsX2VuZCAqLworCQlhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKTsKKwl9CiAKLSAgQlVHX09OIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgIT0gMSk7CisJQlVHX09OKGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSAhPSAxKTsKIAotICBpZiAoIWJhcnJpZXIpIHsKLSAgICAgIGlmIChidWZmZXJfZGlydHkoamwtPmpfY29tbWl0X2JoKSkKLQlCVUcoKTsKLSAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkgOwotICAgICAgc3luY19kaXJ0eV9idWZmZXIoamwtPmpfY29tbWl0X2JoKSA7Ci0gIH0gZWxzZQotICAgICAgd2FpdF9vbl9idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKwlpZiAoIWJhcnJpZXIpIHsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpKQorCQkJQlVHKCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJfSBlbHNlCisJCXdhaXRfb25fYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CiAKLSAgY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHMsIGpsLT5qX2NvbW1pdF9iaCk7CisJY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHMsIGpsLT5qX2NvbW1pdF9iaCk7CiAKLSAgLyogSWYgdGhlcmUgd2FzIGEgd3JpdGUgZXJyb3IgaW4gdGhlIGpvdXJuYWwgLSB3ZSBjYW4ndCBjb21taXQgdGhpcwotICAgKiB0cmFuc2FjdGlvbiAtIGl0IHdpbGwgYmUgaW52YWxpZCBhbmQsIGlmIHN1Y2Nlc3NmdWwsIHdpbGwganVzdCBlbmQKLSAgICogdXAgcHJvcG9nYXRpbmcgdGhlIHdyaXRlIGVycm9yIG91dCB0byB0aGUgZmlsZXN5c3RlbS4gKi8KLSAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCkpKSB7CisJLyogSWYgdGhlcmUgd2FzIGEgd3JpdGUgZXJyb3IgaW4gdGhlIGpvdXJuYWwgLSB3ZSBjYW4ndCBjb21taXQgdGhpcworCSAqIHRyYW5zYWN0aW9uIC0gaXQgd2lsbCBiZSBpbnZhbGlkIGFuZCwgaWYgc3VjY2Vzc2Z1bCwgd2lsbCBqdXN0IGVuZAorCSAqIHVwIHByb3BvZ2F0aW5nIHRoZSB3cml0ZSBlcnJvciBvdXQgdG8gdGhlIGZpbGVzeXN0ZW0uICovCisJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYxNTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MTU6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKICNlbmRpZgotICAgIHJldHZhbCA9IC1FSU87Ci0gIH0KLSAgYmZvcmdldChqbC0+al9jb21taXRfYmgpIDsKLSAgaWYgKGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgIT0gMCAmJgotICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkKSAhPSAxKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMDogbGFzdCBjb21taXQgJWx1LCBjdXJyZW50ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQsCi0JCSAgICAgICBqbC0+al90cmFuc19pZCk7Ci0gIH0KLSAgam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCA9IGpsLT5qX3RyYW5zX2lkOworCQlyZXR2YWwgPSAtRUlPOworCX0KKwliZm9yZ2V0KGpsLT5qX2NvbW1pdF9iaCk7CisJaWYgKGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgIT0gMCAmJgorCSAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkKSAhPSAxKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAwOiBsYXN0IGNvbW1pdCAlbHUsIGN1cnJlbnQgJWx1IiwKKwkJCQkgam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCwgamwtPmpfdHJhbnNfaWQpOworCX0KKwlqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgLyogbm93LCBldmVyeSBjb21taXQgYmxvY2sgaXMgb24gdGhlIGRpc2suICBJdCBpcyBzYWZlIHRvIGFsbG93IGJsb2NrcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiB0byBiZSByZWFsbG9jYXRlZCAqLwotICBjbGVhbnVwX2ZyZWVkX2Zvcl9qb3VybmFsX2xpc3QocywgamwpIDsKKwkvKiBub3csIGV2ZXJ5IGNvbW1pdCBibG9jayBpcyBvbiB0aGUgZGlzay4gIEl0IGlzIHNhZmUgdG8gYWxsb3cgYmxvY2tzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHRvIGJlIHJlYWxsb2NhdGVkICovCisJY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHMsIGpsKTsKIAotICByZXR2YWwgPSByZXR2YWwgPyByZXR2YWwgOiBqb3VybmFsLT5qX2Vycm5vOworCXJldHZhbCA9IHJldHZhbCA/IHJldHZhbCA6IGpvdXJuYWwtPmpfZXJybm87CiAKLSAgLyogbWFyayB0aGUgbWV0YWRhdGEgZGlydHkgKi8KLSAgaWYgKCFyZXR2YWwpCi0gICAgZGlydHlfb25lX3RyYW5zYWN0aW9uKHMsIGpsKTsKLSAgYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgOworCS8qIG1hcmsgdGhlIG1ldGFkYXRhIGRpcnR5ICovCisJaWYgKCFyZXR2YWwpCisJCWRpcnR5X29uZV90cmFuc2FjdGlvbihzLCBqbCk7CisJYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSk7CiAKLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKLSAgfQotICB1cCgmamwtPmpfY29tbWl0X2xvY2spOwotcHV0X2psOgotICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKwlpZiAoZmx1c2hhbGwpIHsKKwkJYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpOworCX0KKwl1cCgmamwtPmpfY29tbWl0X2xvY2spOworICAgICAgcHV0X2psOgorCXB1dF9qb3VybmFsX2xpc3QocywgamwpOwogCi0gIGlmIChyZXR2YWwpCi0gICAgcmVpc2VyZnNfYWJvcnQgKHMsIHJldHZhbCwgIkpvdXJuYWwgd3JpdGUgZXJyb3IgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotICByZXR1cm4gcmV0dmFsOworCWlmIChyZXR2YWwpCisJCXJlaXNlcmZzX2Fib3J0KHMsIHJldHZhbCwgIkpvdXJuYWwgd3JpdGUgZXJyb3IgaW4gJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJcHV0X2ZzX2V4Y2woKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgogKiogZmx1c2hfam91cm5hbF9saXN0IGZyZXF1ZW50bHkgbmVlZHMgdG8gZmluZCBhIG5ld2VyIHRyYW5zYWN0aW9uIGZvciBhIGdpdmVuIGJsb2NrLiAgVGhpcyBkb2VzIHRoYXQsIG9yIAogKiogcmV0dXJucyBOVUxMIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcgCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpbmRfbmV3ZXJfamxfZm9yX2NuKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY24tPnNiOwotICBiX2Jsb2NrbnJfdCBibG9ja25yID0gY24tPmJsb2NrbnIgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpbmRfbmV3ZXJfamxfZm9yX2NuKHN0cnVjdAorCQkJCQkJCSAgcmVpc2VyZnNfam91cm5hbF9jbm9kZQorCQkJCQkJCSAgKmNuKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7CisJYl9ibG9ja25yX3QgYmxvY2tuciA9IGNuLT5ibG9ja25yOwogCi0gIGNuID0gY24tPmhwcmV2IDsKLSAgd2hpbGUoY24pIHsKLSAgICBpZiAoY24tPnNiID09IHNiICYmIGNuLT5ibG9ja25yID09IGJsb2NrbnIgJiYgY24tPmpsaXN0KSB7Ci0gICAgICByZXR1cm4gY24tPmpsaXN0IDsKLSAgICB9Ci0gICAgY24gPSBjbi0+aHByZXYgOwotICB9Ci0gIHJldHVybiBOVUxMIDsKKwljbiA9IGNuLT5ocHJldjsKKwl3aGlsZSAoY24pIHsKKwkJaWYgKGNuLT5zYiA9PSBzYiAmJiBjbi0+YmxvY2tuciA9PSBibG9ja25yICYmIGNuLT5qbGlzdCkgeworCQkJcmV0dXJuIGNuLT5qbGlzdDsKKwkJfQorCQljbiA9IGNuLT5ocHJldjsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9qb3VybmFsX2hhc2goc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqLAotc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworc3RhdGljIHZvaWQgcmVtb3ZlX2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKiwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICosIHVuc2lnbmVkIGxvbmcsCisJCQkJaW50KTsKIAogLyoKICoqIG9uY2UgYWxsIHRoZSByZWFsIGJsb2NrcyBoYXZlIGJlZW4gZmx1c2hlZCwgaXQgaXMgc2FmZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZQogKiogam91cm5hbCBsaXN0IGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgQXNpZGUgZnJvbSBmcmVlaW5nIHRoZSBjbm9kZSwgdGhpcyBhbHNvIGFsbG93cyB0aGUKICoqIGJsb2NrIHRvIGJlIHJlYWxsb2NhdGVkIGZvciBkYXRhIGJsb2NrcyBpZiBpdCBoYWQgYmVlbiBkZWxldGVkLgogKi8KLXN0YXRpYyB2b2lkIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZGVidWcpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0IDsKLSAgY24gPSBqbC0+al9yZWFsYmxvY2sgOworc3RhdGljIHZvaWQgcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCQkgaW50IGRlYnVnKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3Q7CisJY24gPSBqbC0+al9yZWFsYmxvY2s7CiAKLSAgLyogd2hpY2ggaXMgYmV0dGVyLCB0byBsb2NrIG9uY2UgYXJvdW5kIHRoZSB3aG9sZSBsb29wLCBvcgotICAqKiB0byBsb2NrIGZvciBlYWNoIGNhbGwgdG8gcmVtb3ZlX2pvdXJuYWxfaGFzaD8KLSAgKi8KLSAgd2hpbGUoY24pIHsKLSAgICBpZiAoY24tPmJsb2NrbnIgIT0gMCkgewotICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiYmxvY2sgJXUsIGJoIGlzICVkLCBzdGF0ZSAlbGQiLCBjbi0+YmxvY2tuciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbi0+YmggPyAxOiAwLCBjbi0+c3RhdGUpIDsKLSAgICAgIH0KLSAgICAgIGNuLT5zdGF0ZSA9IDAgOwotICAgICAgcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbCwgY24tPmJsb2NrbnIsIDEpIDsKLSAgICB9Ci0gICAgbGFzdCA9IGNuIDsKLSAgICBjbiA9IGNuLT5uZXh0IDsKLSAgICBmcmVlX2Nub2RlKHBfc19zYiwgbGFzdCkgOwotICB9Ci0gIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOworCS8qIHdoaWNoIGlzIGJldHRlciwgdG8gbG9jayBvbmNlIGFyb3VuZCB0aGUgd2hvbGUgbG9vcCwgb3IKKwkgKiogdG8gbG9jayBmb3IgZWFjaCBjYWxsIHRvIHJlbW92ZV9qb3VybmFsX2hhc2g/CisJICovCisJd2hpbGUgKGNuKSB7CisJCWlmIChjbi0+YmxvY2tuciAhPSAwKSB7CisJCQlpZiAoZGVidWcpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJCSAiYmxvY2sgJXUsIGJoIGlzICVkLCBzdGF0ZSAlbGQiLAorCQkJCQkJIGNuLT5ibG9ja25yLCBjbi0+YmggPyAxIDogMCwKKwkJCQkJCSBjbi0+c3RhdGUpOworCQkJfQorCQkJY24tPnN0YXRlID0gMDsKKwkJCXJlbW92ZV9qb3VybmFsX2hhc2gocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwKKwkJCQkJICAgIGpsLCBjbi0+YmxvY2tuciwgMSk7CisJCX0KKwkJbGFzdCA9IGNuOworCQljbiA9IGNuLT5uZXh0OworCQlmcmVlX2Nub2RlKHBfc19zYiwgbGFzdCk7CisJfQorCWpsLT5qX3JlYWxibG9jayA9IE5VTEw7CiB9CiAKIC8qCkBAIC0xMTE1LDk4ICsxMTk1LDEwNyBAQAogKiogY2FsbGVkIGJ5IGZsdXNoX2pvdXJuYWxfbGlzdCwgYmVmb3JlIGl0IGNhbGxzIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3QKICoqCiAqLwotc3RhdGljIGludCBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworc3RhdGljIGludCBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOwogCi0gIGlmIChyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKGpvdXJuYWwpKQotICAgIHJldHVybiAtRUlPOworCWlmIChyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCisJCXJldHVybiAtRUlPOwogCi0gIGlmICh0cmFuc19pZCA+PSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpIHsKLSAgICBpZiAoYnVmZmVyX2xvY2tlZCgoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgIHsKLSAgICAgIHdhaXRfb25fYnVmZmVyKChqb3VybmFsLT5qX2hlYWRlcl9iaCkpIDsKLSAgICAgIGlmICh1bmxpa2VseSAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpKSB7CisJaWYgKHRyYW5zX2lkID49IGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgeworCQlpZiAoYnVmZmVyX2xvY2tlZCgoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgeworCQkJd2FpdF9vbl9idWZmZXIoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpKSB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtNjk5OiBidWZmZXIgd3JpdGUgZmFpbGVkIikgOworCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkJICJqb3VybmFsLTY5OTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpOwogI2VuZGlmCi0gICAgICAgIHJldHVybiAtRUlPOwotICAgICAgfQotICAgIH0KLSAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7Ci0gICAgam91cm5hbC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gb2Zmc2V0IDsKLSAgICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOwotICAgIGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBjcHVfdG9fbGUzMih0cmFuc19pZCkgOwotICAgIGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpIDsKLSAgICBqaC0+al9tb3VudF9pZCA9IGNwdV90b19sZTMyKGpvdXJuYWwtPmpfbW91bnRfaWQpIDsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCQlqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZDsKKwkJam91cm5hbC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gb2Zmc2V0OworCQlqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPgorCQkJCQkJCWJfZGF0YSk7CisJCWpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBjcHVfdG9fbGUzMih0cmFuc19pZCk7CisJCWpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpOworCQlqaC0+al9tb3VudF9pZCA9IGNwdV90b19sZTMyKGpvdXJuYWwtPmpfbW91bnRfaWQpOwogCi0gICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocF9zX3NiKSkgewotCWludCByZXQ7Ci0JbG9ja19idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOwotCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7Ci0JaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgewotCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKLQkgICAgZGlzYWJsZV9iYXJyaWVyKHBfc19zYik7Ci0JICAgIGdvdG8gc3luYzsKKwkJaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocF9zX3NiKSkgeworCQkJaW50IHJldDsKKwkJCWxvY2tfYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkJCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQlpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQkJZGlzYWJsZV9iYXJyaWVyKHBfc19zYik7CisJCQkJZ290byBzeW5jOworCQkJfQorCQkJd2FpdF9vbl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHBfc19zYiwgam91cm5hbC0+al9oZWFkZXJfYmgpOworCQl9IGVsc2UgeworCQkgICAgICBzeW5jOgorCQkJc2V0X2J1ZmZlcl9kaXJ0eShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCX0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTgzNzogSU8gZXJyb3IgZHVyaW5nIGpvdXJuYWwgcmVwbGF5Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KLQl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7Ci0JY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHBfc19zYiwgam91cm5hbC0+al9oZWFkZXJfYmgpOwotICAgIH0gZWxzZSB7Ci1zeW5jOgotCXNldF9idWZmZXJfZGlydHkoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLQlzeW5jX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCkgOwotICAgIH0KLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtODM3OiBJTyBlcnJvciBkdXJpbmcgam91cm5hbCByZXBsYXkiKTsKLSAgICAgIHJldHVybiAtRUlPIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpIHsKLSAgICByZXR1cm4gX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIG9mZnNldCwgdHJhbnNfaWQpOworc3RhdGljIGludCB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKQoreworCXJldHVybiBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHBfc19zYiwgb2Zmc2V0LCB0cmFuc19pZCk7CiB9CisKIC8qIAogKiogZmx1c2ggYW55IGFuZCBhbGwgam91cm5hbCBsaXN0cyBvbGRlciB0aGFuIHlvdSBhcmUgCiAqKiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBmbHVzaF9qb3VybmFsX2xpc3QKICovCiBzdGF0aWMgaW50IGZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKIHsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgICAvKiB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGZsdXNoaW5nIHRoaW5ncywgbm8gZXh0cmEgcmFjZQotICAgICAqIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCi0gICAgICovCi1yZXN0YXJ0OgotICAgIGVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKLSAgICAvKiBEaWQgd2Ugd3JhcD8gKi8KLSAgICBpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBvdGhlcl9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgaWYgKG90aGVyX2psLT5qX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKLSAgICAgICAgQlVHX09OIChvdGhlcl9qbC0+al9yZWZjb3VudCA8PSAwKTsKLQkvKiBkbyBub3QgZmx1c2ggYWxsICovCi0JZmx1c2hfam91cm5hbF9saXN0KHBfc19zYiwgb3RoZXJfamwsIDApIDsKKwkvKiB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGZsdXNoaW5nIHRoaW5ncywgbm8gZXh0cmEgcmFjZQorCSAqIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCisJICovCisgICAgICByZXN0YXJ0OgorCWVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKKwkvKiBEaWQgd2Ugd3JhcD8gKi8KKwlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQorCQlyZXR1cm4gMDsKKwlvdGhlcl9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJaWYgKG90aGVyX2psLT5qX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKKwkJQlVHX09OKG90aGVyX2psLT5qX3JlZmNvdW50IDw9IDApOworCQkvKiBkbyBub3QgZmx1c2ggYWxsICovCisJCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIG90aGVyX2psLCAwKTsKIAotCS8qIG90aGVyX2psIGlzIG5vdyBkZWxldGVkIGZyb20gdGhlIGxpc3QgKi8KLQlnb3RvIHJlc3RhcnQ7Ci0gICAgfQotICAgIHJldHVybiAwIDsKKwkJLyogb3RoZXJfamwgaXMgbm93IGRlbGV0ZWQgZnJvbSB0aGUgbGlzdCAqLworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZWxfZnJvbV93b3JrX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3dvcmtpbmdfbGlzdCkpIHsKLQlsaXN0X2RlbF9pbml0KCZqbC0+al93b3JraW5nX2xpc3QpOwotCWpvdXJuYWwtPmpfbnVtX3dvcmtfbGlzdHMtLTsKLSAgICB9CisJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfd29ya2luZ19saXN0KSkgeworCQlsaXN0X2RlbF9pbml0KCZqbC0+al93b3JraW5nX2xpc3QpOworCQlqb3VybmFsLT5qX251bV93b3JrX2xpc3RzLS07CisJfQogfQogCiAvKiBmbHVzaCBhIGpvdXJuYWwgbGlzdCwgYm90aCBjb21taXQgYW5kIHJlYWwgYmxvY2tzCkBAIC0xMjE4LDM4MyArMTMwNyw0MDcgQEAKICoqIGFuZCB0aGUgam91cm5hbCBpcyBsb2NrZWQuICBUaGF0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIAogKiogZG9fam91cm5hbF9lbmQsIG9yIGJ5IGpvdXJuYWxfcmVsZWFzZQogKi8KLXN0YXRpYyBpbnQgZmx1c2hfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3QgOwotICBpbnQgY291bnQgOwotICBpbnQgd2FzX2p3YWl0ID0gMCA7Ci0gIGludCB3YXNfZGlydHkgPSAwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzYXZlZF9iaCA7IAotICB1bnNpZ25lZCBsb25nIGpfbGVuX3NhdmVkID0gamwtPmpfbGVuIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgaW50IGVyciA9IDA7CitzdGF0aWMgaW50IGZsdXNoX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0OworCWludCBjb3VudDsKKwlpbnQgd2FzX2p3YWl0ID0gMDsKKwlpbnQgd2FzX2RpcnR5ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNhdmVkX2JoOworCXVuc2lnbmVkIGxvbmcgal9sZW5fc2F2ZWQgPSBqbC0+al9sZW47CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWludCBlcnIgPSAwOwogCi0gIEJVR19PTiAoal9sZW5fc2F2ZWQgPD0gMCk7CisJQlVHX09OKGpfbGVuX3NhdmVkIDw9IDApOwogCi0gIGlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjA0ODogZmx1c2hfam91cm5hbF9saXN0IGNhbGxlZCB3aXRoIHdjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSkgOwotICB9Ci0gIEJVR19PTiAoamwtPmpfdHJhbnNfaWQgPT0gMCk7Ci0KLSAgLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCi0gIGlmIChmbHVzaGFsbCkgewotICAgICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICB9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgewotICAgICAgQlVHKCk7Ci0gIH0KLQotICBjb3VudCA9IDAgOwotICBpZiAoal9sZW5fc2F2ZWQgPiBqb3VybmFsLT5qX3RyYW5zX21heCkgewotICAgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTcxNTogZmx1c2hfam91cm5hbF9saXN0LCBsZW5ndGggaXMgJWx1LCB0cmFucyBpZCAlbHVcbiIsIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7Ci0gICAgcmV0dXJuIDAgOwotICB9Ci0KLSAgLyogaWYgYWxsIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSwgZ2V0IG91dCBvZiBoZXJlICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9IAotCi0gIC8qIHN0YXJ0IGJ5IHB1dHRpbmcgdGhlIGNvbW1pdCBsaXN0IG9uIGRpc2suICBUaGlzIHdpbGwgYWxzbyBmbHVzaCAKLSAgKiogdGhlIGNvbW1pdCBsaXN0cyBvZiBhbnkgb2xkZXJzIHRyYW5zYWN0aW9ucwotICAqLwotICBmbHVzaF9jb21taXRfbGlzdChzLCBqbCwgMSkgOwotCi0gIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0gICAgICBCVUcoKTsKLQotICAvKiBhcmUgd2UgZG9uZSBub3c/ICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9Ci0KLSAgLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKLSAgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKLSAgKi8KLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSAhPSAwKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtODQ0OiBwYW5pYyBqb3VybmFsIGxpc3QgaXMgZmx1c2hpbmcsIHdjb3VudCBpcyBub3QgMFxuIikgOwotICB9Ci0gIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgd2hpbGUoY24pIHsKLSAgICB3YXNfandhaXQgPSAwIDsKLSAgICB3YXNfZGlydHkgPSAwIDsKLSAgICBzYXZlZF9iaCA9IE5VTEwgOwotICAgIC8qIGJsb2NrbnIgb2YgMCBpcyBubyBsb25nZXIgaW4gdGhlIGhhc2gsIGlnbm9yZSBpdCAqLwotICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICBnb3RvIGZyZWVfY25vZGUgOwotICAgIH0KLQotICAgIC8qIFRoaXMgdHJhbnNhY3Rpb24gZmFpbGVkIGNvbW1pdC4gRG9uJ3Qgd3JpdGUgb3V0IHRvIHRoZSBkaXNrICovCi0gICAgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKSkKLSAgICAgICAgZ290byBmcmVlX2Nub2RlOwotCi0gICAgcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAvKiB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuICBXZSBjaGVjayBwamwgdG8gbWFrZSBzdXJlIHdlCi0gICAgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCi0gICAgKiogYmxvY2sgdG8gZGlzawotICAgICovCi0gICAgaWYgKCFwamwgJiYgY24tPmJoKSB7Ci0gICAgICBzYXZlZF9iaCA9IGNuLT5iaCA7Ci0KLSAgICAgIC8qIHdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIG5vYm9keSByZWxlYXNlcyB0aGUgYnVmZmVyIHdoaWxlIAotICAgICAgKiogd2UgYXJlIHdvcmtpbmcgd2l0aCBpdCAKLSAgICAgICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLQotICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX2RpcnR5KHNhdmVkX2JoKSkgewotICAgICAgICBCVUdfT04gKCFjYW5fZGlydHkgKGNuKSk7Ci0gICAgICAgIHdhc19qd2FpdCA9IDEgOwotICAgICAgICB3YXNfZGlydHkgPSAxIDsKLSAgICAgIH0gZWxzZSBpZiAoY2FuX2RpcnR5KGNuKSkgewotICAgICAgICAvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KLQlCVUcoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZiBzb21lb25lIGhhcyB0aGlzIGJsb2NrIGluIGEgbmV3ZXIgdHJhbnNhY3Rpb24sIGp1c3QgbWFrZQotICAgICoqIHN1cmUgdGhleSBhcmUgY29tbWl0ZWQsIGFuZCBkb24ndCB0cnkgd3JpdGluZyBpdCB0byBkaXNrCi0gICAgKi8KLSAgICBpZiAocGpsKSB7Ci0gICAgICBpZiAoYXRvbWljX3JlYWQoJnBqbC0+al9jb21taXRfbGVmdCkpCi0gICAgICAgIGZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSkgOwotICAgICAgZ290byBmcmVlX2Nub2RlIDsKLSAgICB9Ci0KLSAgICAvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKLSAgICAqKiB0aGUgYmxvY2sgZ290IGZyZWVkIGluIGEgZnV0dXJlIHRyYW5zYWN0aW9uIAotICAgICovCi0gICAgaWYgKHNhdmVkX2JoID09IE5VTEwpIHsKLSAgICAgIGdvdG8gZnJlZV9jbm9kZSA7Ci0gICAgfQotCi0gICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAotICAgICoqIGxvY2tlZCB3aGlsZSBpdCB3b3Jrcywgc28gd2Ugc2hvdWxkIG5ldmVyIHNlZSBhIGJ1ZmZlciBoZXJlIHRoYXQKLSAgICAqKiBpcyBub3QgbWFya2VkIEpEaXJ0eV93YWl0Ci0gICAgKi8KLSAgICBpZiAoKCF3YXNfandhaXQpICYmICFidWZmZXJfbG9ja2VkKHNhdmVkX2JoKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKLQkJCSAgIm5vdCBpbiBhIG5ld2VyIHRyYW5hc2N0aW9uIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLAotCQkJICB3YXNfZGlydHkgPyAnICcgOiAnIScsIHdhc19qd2FpdCA/ICcgJyA6ICchJykgOwotICAgIH0KLSAgICBpZiAod2FzX2RpcnR5KSB7IAotICAgICAgLyogd2UgaW5jIGFnYWluIGJlY2F1c2Ugc2F2ZWRfYmggZ2V0cyBkZWNyZW1lbnRlZCBhdCBmcmVlX2Nub2RlICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLSAgICAgIHNldF9iaXQoQkxPQ0tfTkVFRFNfRkxVU0gsICZjbi0+c3RhdGUpIDsKLSAgICAgIGxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKLSAgICAgIEJVR19PTiAoY24tPmJsb2NrbnIgIT0gc2F2ZWRfYmgtPmJfYmxvY2tucik7Ci0gICAgICBpZiAoYnVmZmVyX2RpcnR5KHNhdmVkX2JoKSkKLSAgICAgICAgc3VibWl0X2xvZ2dlZF9idWZmZXIoc2F2ZWRfYmgpIDsKLSAgICAgIGVsc2UKLSAgICAgICAgdW5sb2NrX2J1ZmZlcihzYXZlZF9iaCk7Ci0gICAgICBjb3VudCsrIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImNsbS0yMDgyOiBVbmFibGUgdG8gZmx1c2ggYnVmZmVyICVsbHUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLWZyZWVfY25vZGU6Ci0gICAgbGFzdCA9IGNuIDsKLSAgICBjbiA9IGNuLT5uZXh0IDsKLSAgICBpZiAoc2F2ZWRfYmgpIHsKLSAgICAgIC8qIHdlIGluY3JlbWVudGVkIHRoaXMgdG8ga2VlcCBvdGhlcnMgZnJvbSB0YWtpbmcgdGhlIGJ1ZmZlciBoZWFkIGF3YXkgKi8KLSAgICAgIHB1dF9iaChzYXZlZF9iaCkgOwotICAgICAgaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGNvdW50ID4gMCkgewotICAgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgICB3aGlsZShjbikgewotICAgICAgaWYgKHRlc3RfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKSkgewotCWlmICghY24tPmJoKSB7Ci0JICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC0xMDExOiBjbi0+YmggaXMgTlVMTFxuIikgOworCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAiY2xtLTIwNDg6IGZsdXNoX2pvdXJuYWxfbGlzdCBjYWxsZWQgd2l0aCB3Y291bnQgJWQiLAorCQkJCSBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpKTsKIAl9Ci0Jd2FpdF9vbl9idWZmZXIoY24tPmJoKSA7Ci0JaWYgKCFjbi0+YmgpIHsKLQkgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKSA7CisJQlVHX09OKGpsLT5qX3RyYW5zX2lkID09IDApOworCisJLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWRvd24oJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKwl9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgeworCQlCVUcoKTsKIAl9Ci0JaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGNuLT5iaCkpKSB7CisKKwljb3VudCA9IDA7CisJaWYgKGpfbGVuX3NhdmVkID4gam91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC03MTU6IGZsdXNoX2pvdXJuYWxfbGlzdCwgbGVuZ3RoIGlzICVsdSwgdHJhbnMgaWQgJWx1XG4iLAorCQkJICAgICAgIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7CisJCXJldHVybiAwOworCX0KKworCWdldF9mc19leGNsKCk7CisKKwkvKiBpZiBhbGwgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lLCBnZXQgb3V0IG9mIGhlcmUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogc3RhcnQgYnkgcHV0dGluZyB0aGUgY29tbWl0IGxpc3Qgb24gZGlzay4gIFRoaXMgd2lsbCBhbHNvIGZsdXNoIAorCSAqKiB0aGUgY29tbWl0IGxpc3RzIG9mIGFueSBvbGRlcnMgdHJhbnNhY3Rpb25zCisJICovCisJZmx1c2hfY29tbWl0X2xpc3QocywgamwsIDEpOworCisJaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKQorCSAgICAmJiAhcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlCVUcoKTsKKworCS8qIGFyZSB3ZSBkb25lIG5vdz8gKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKKwkgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpICE9IDApIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC04NDQ6IHBhbmljIGpvdXJuYWwgbGlzdCBpcyBmbHVzaGluZywgd2NvdW50IGlzIG5vdCAwXG4iKTsKKwl9CisJY24gPSBqbC0+al9yZWFsYmxvY2s7CisJd2hpbGUgKGNuKSB7CisJCXdhc19qd2FpdCA9IDA7CisJCXdhc19kaXJ0eSA9IDA7CisJCXNhdmVkX2JoID0gTlVMTDsKKwkJLyogYmxvY2tuciBvZiAwIGlzIG5vIGxvbmdlciBpbiB0aGUgaGFzaCwgaWdub3JlIGl0ICovCisJCWlmIChjbi0+YmxvY2tuciA9PSAwKSB7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBUaGlzIHRyYW5zYWN0aW9uIGZhaWxlZCBjb21taXQuIERvbid0IHdyaXRlIG91dCB0byB0aGUgZGlzayAqLworCQlpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfRElSVFkpKQorCQkJZ290byBmcmVlX2Nub2RlOworCisJCXBqbCA9IGZpbmRfbmV3ZXJfamxfZm9yX2NuKGNuKTsKKwkJLyogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLiAgV2UgY2hlY2sgcGpsIHRvIG1ha2Ugc3VyZSB3ZQorCQkgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCisJCSAqKiBibG9jayB0byBkaXNrCisJCSAqLworCQlpZiAoIXBqbCAmJiBjbi0+YmgpIHsKKwkJCXNhdmVkX2JoID0gY24tPmJoOworCisJCQkvKiB3ZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSBub2JvZHkgcmVsZWFzZXMgdGhlIGJ1ZmZlciB3aGlsZSAKKwkJCSAqKiB3ZSBhcmUgd29ya2luZyB3aXRoIGl0IAorCQkJICovCisJCQlnZXRfYmgoc2F2ZWRfYmgpOworCisJCQlpZiAoYnVmZmVyX2pvdXJuYWxfZGlydHkoc2F2ZWRfYmgpKSB7CisJCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCQl3YXNfandhaXQgPSAxOworCQkJCXdhc19kaXJ0eSA9IDE7CisJCQl9IGVsc2UgaWYgKGNhbl9kaXJ0eShjbikpIHsKKwkJCQkvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCisJCS8qIGlmIHNvbWVvbmUgaGFzIHRoaXMgYmxvY2sgaW4gYSBuZXdlciB0cmFuc2FjdGlvbiwganVzdCBtYWtlCisJCSAqKiBzdXJlIHRoZXkgYXJlIGNvbW1pdGVkLCBhbmQgZG9uJ3QgdHJ5IHdyaXRpbmcgaXQgdG8gZGlzaworCQkgKi8KKwkJaWYgKHBqbCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZwamwtPmpfY29tbWl0X2xlZnQpKQorCQkJCWZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSk7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKKwkJICoqIHRoZSBibG9jayBnb3QgZnJlZWQgaW4gYSBmdXR1cmUgdHJhbnNhY3Rpb24gCisJCSAqLworCQlpZiAoc2F2ZWRfYmggPT0gTlVMTCkgeworCQkJZ290byBmcmVlX2Nub2RlOworCQl9CisKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAorCQkgKiogbG9ja2VkIHdoaWxlIGl0IHdvcmtzLCBzbyB3ZSBzaG91bGQgbmV2ZXIgc2VlIGEgYnVmZmVyIGhlcmUgdGhhdAorCQkgKiogaXMgbm90IG1hcmtlZCBKRGlydHlfd2FpdAorCQkgKi8KKwkJaWYgKCghd2FzX2p3YWl0KSAmJiAhYnVmZmVyX2xvY2tlZChzYXZlZF9iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKKwkJCQkJICJub3QgaW4gYSBuZXdlciB0cmFuYXNjdGlvbiIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgd2FzX2RpcnR5ID8gJyAnIDogJyEnLAorCQkJCQkgd2FzX2p3YWl0ID8gJyAnIDogJyEnKTsKKwkJfQorCQlpZiAod2FzX2RpcnR5KSB7CisJCQkvKiB3ZSBpbmMgYWdhaW4gYmVjYXVzZSBzYXZlZF9iaCBnZXRzIGRlY3JlbWVudGVkIGF0IGZyZWVfY25vZGUgKi8KKwkJCWdldF9iaChzYXZlZF9iaCk7CisJCQlzZXRfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKTsKKwkJCWxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCUJVR19PTihjbi0+YmxvY2tuciAhPSBzYXZlZF9iaC0+Yl9ibG9ja25yKTsKKwkJCWlmIChidWZmZXJfZGlydHkoc2F2ZWRfYmgpKQorCQkJCXN1Ym1pdF9sb2dnZWRfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWVsc2UKKwkJCQl1bmxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAiY2xtLTIwODI6IFVuYWJsZSB0byBmbHVzaCBidWZmZXIgJWxsdSBpbiAlcyIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgX19GVU5DVElPTl9fKTsKKwkJfQorCSAgICAgIGZyZWVfY25vZGU6CisJCWxhc3QgPSBjbjsKKwkJY24gPSBjbi0+bmV4dDsKKwkJaWYgKHNhdmVkX2JoKSB7CisJCQkvKiB3ZSBpbmNyZW1lbnRlZCB0aGlzIHRvIGtlZXAgb3RoZXJzIGZyb20gdGFraW5nIHRoZSBidWZmZXIgaGVhZCBhd2F5ICovCisJCQlwdXRfYmgoc2F2ZWRfYmgpOworCQkJaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY291bnQgPiAwKSB7CisJCWNuID0gamwtPmpfcmVhbGJsb2NrOworCQl3aGlsZSAoY24pIHsKKwkJCWlmICh0ZXN0X2JpdChCTE9DS19ORUVEU19GTFVTSCwgJmNuLT5zdGF0ZSkpIHsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTE6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJd2FpdF9vbl9idWZmZXIoY24tPmJoKTsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoY24tPmJoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkgIHJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKSA7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKTsKICNlbmRpZgotICAgICAgICAgIGVyciA9IC1FSU87Ci0gIAl9Ci0JLyogbm90ZSwgd2UgbXVzdCBjbGVhciB0aGUgSkRpcnR5X3dhaXQgYml0IGFmdGVyIHRoZSB1cCB0byBkYXRlCi0JKiogY2hlY2ssIG90aGVyd2lzZSB3ZSByYWNlIGFnYWluc3Qgb3VyIGZsdXNocGFnZSByb3V0aW5lCi0JKi8KLSAgICAgICAgQlVHX09OICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKSk7CisJCQkJCWVyciA9IC1FSU87CisJCQkJfQorCQkJCS8qIG5vdGUsIHdlIG11c3QgY2xlYXIgdGhlIEpEaXJ0eV93YWl0IGJpdCBhZnRlciB0aGUgdXAgdG8gZGF0ZQorCQkJCSAqKiBjaGVjaywgb3RoZXJ3aXNlIHdlIHJhY2UgYWdhaW5zdCBvdXIgZmx1c2hwYWdlIHJvdXRpbmUKKwkJCQkgKi8KKwkJCQlCVUdfT04oIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkKKwkJCQkgICAgICAgKGNuLT5iaCkpOwogCi0gICAgICAgIC8qIHVuZG8gdGhlIGluYyBmcm9tIGpvdXJuYWxfbWFya19kaXJ0eSAqLwotCXB1dF9iaChjbi0+YmgpIDsKLSAgICAgICAgYnJlbHNlKGNuLT5iaCkgOwotICAgICAgfQotICAgICAgY24gPSBjbi0+bmV4dCA7Ci0gICAgfQotICB9CisJCQkJLyogdW5kbyB0aGUgaW5jIGZyb20gam91cm5hbF9tYXJrX2RpcnR5ICovCisJCQkJcHV0X2JoKGNuLT5iaCk7CisJCQkJYnJlbHNlKGNuLT5iaCk7CisJCQl9CisJCQljbiA9IGNuLT5uZXh0OworCQl9CisJfQogCi0gIGlmIChlcnIpCi0gICAgcmVpc2VyZnNfYWJvcnQgKHMsIC1FSU8sICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotZmx1c2hfb2xkZXJfYW5kX3JldHVybjoKKwlpZiAoZXJyKQorCQlyZWlzZXJmc19hYm9ydChzLCAtRUlPLAorCQkJICAgICAgICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBmbHVzaF9vbGRlcl9hbmRfcmV0dXJuOgogCisJLyogYmVmb3JlIHdlIGNhbiB1cGRhdGUgdGhlIGpvdXJuYWwgaGVhZGVyIGJsb2NrLCB3ZSBfbXVzdF8gZmx1c2ggYWxsIAorCSAqKiByZWFsIGJsb2NrcyBmcm9tIGFsbCBvbGRlciB0cmFuc2FjdGlvbnMgdG8gZGlzay4gIFRoaXMgaXMgYmVjYXVzZQorCSAqKiBvbmNlIHRoZSBoZWFkZXIgYmxvY2sgaXMgdXBkYXRlZCwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsIG5vdCBiZQorCSAqKiByZXBsYXllZCBhZnRlciBhIGNyYXNoCisJICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMocywgamwpOworCX0KIAotICAvKiBiZWZvcmUgd2UgY2FuIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2ssIHdlIF9tdXN0XyBmbHVzaCBhbGwgCi0gICoqIHJlYWwgYmxvY2tzIGZyb20gYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB0byBkaXNrLiAgVGhpcyBpcyBiZWNhdXNlCi0gICoqIG9uY2UgdGhlIGhlYWRlciBibG9jayBpcyB1cGRhdGVkLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbm90IGJlCi0gICoqIHJlcGxheWVkIGFmdGVyIGEgY3Jhc2gKLSAgKi8KLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgZmx1c2hfb2xkZXJfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0gIH0gCi0gIAotICBlcnIgPSBqb3VybmFsLT5qX2Vycm5vOwotICAvKiBiZWZvcmUgd2UgY2FuIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGhhc2ggdGFibGVzIGZvciB0aGlzIAotICAqKiB0cmFuc2FjdGlvbiwgd2UgbXVzdCBtYWtlIHN1cmUgaXQgY2FuIG5ldmVyIGJlIHJlcGxheWVkCi0gICoqCi0gICoqIHNpbmNlIHdlIGFyZSBvbmx5IGNhbGxlZCBmcm9tIGRvX2pvdXJuYWxfZW5kLCB3ZSBrbm93IGZvciBzdXJlIHRoZXJlCi0gICoqIGFyZSBubyBhbGxvY2F0aW9ucyBnb2luZyBvbiB3aGlsZSB3ZSBhcmUgZmx1c2hpbmcgam91cm5hbCBsaXN0cy4gIFNvLAotICAqKiB3ZSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBqb3VybmFsIGhlYWRlciBibG9jayBmb3IgdGhlIGxhc3QgbGlzdAotICAqKiBiZWluZyBmbHVzaGVkCi0gICovCi0gIGlmICghZXJyICYmIGZsdXNoYWxsKSB7Ci0gICAgZXJyID0gdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHMsIChqbC0+al9zdGFydCArIGpsLT5qX2xlbiArIDIpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSwgamwtPmpfdHJhbnNfaWQpIDsKLSAgICBpZiAoZXJyKQotICAgICAgICByZWlzZXJmc19hYm9ydCAocywgLUVJTywgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKLSAgfQotICByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0KHMsIGpsLCAwKSA7Ci0gIGxpc3RfZGVsX2luaXQoJmpsLT5qX2xpc3QpOwotICBqb3VybmFsLT5qX251bV9saXN0cy0tOwotICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworCWVyciA9IGpvdXJuYWwtPmpfZXJybm87CisJLyogYmVmb3JlIHdlIGNhbiByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBoYXNoIHRhYmxlcyBmb3IgdGhpcyAKKwkgKiogdHJhbnNhY3Rpb24sIHdlIG11c3QgbWFrZSBzdXJlIGl0IGNhbiBuZXZlciBiZSByZXBsYXllZAorCSAqKgorCSAqKiBzaW5jZSB3ZSBhcmUgb25seSBjYWxsZWQgZnJvbSBkb19qb3VybmFsX2VuZCwgd2Uga25vdyBmb3Igc3VyZSB0aGVyZQorCSAqKiBhcmUgbm8gYWxsb2NhdGlvbnMgZ29pbmcgb24gd2hpbGUgd2UgYXJlIGZsdXNoaW5nIGpvdXJuYWwgbGlzdHMuICBTbywKKwkgKiogd2Ugb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2sgZm9yIHRoZSBsYXN0IGxpc3QKKwkgKiogYmVpbmcgZmx1c2hlZAorCSAqLworCWlmICghZXJyICYmIGZsdXNoYWxsKSB7CisJCWVyciA9CisJCSAgICB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socywKKwkJCQkJCShqbC0+al9zdGFydCArIGpsLT5qX2xlbiArCisJCQkJCQkgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpLAorCQkJCQkJamwtPmpfdHJhbnNfaWQpOworCQlpZiAoZXJyKQorCQkJcmVpc2VyZnNfYWJvcnQocywgLUVJTywKKwkJCQkgICAgICAgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwl9CisJcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzLCBqbCwgMCk7CisJbGlzdF9kZWxfaW5pdCgmamwtPmpfbGlzdCk7CisJam91cm5hbC0+al9udW1fbGlzdHMtLTsKKwlkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwogCi0gIGlmIChqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQgIT0gMCAmJgotICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQpICE9IDEpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAxOiBsYXN0IGZsdXNoICVsdSwgY3VycmVudCAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQsCi0JCSAgICAgICBqbC0+al90cmFuc19pZCk7Ci0gIH0KLSAgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJaWYgKGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCAhPSAwICYmCisJICAgIChqbC0+al90cmFuc19pZCAtIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCkgIT0gMSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMTogbGFzdCBmbHVzaCAlbHUsIGN1cnJlbnQgJWx1IiwKKwkJCQkgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkLCBqbC0+al90cmFuc19pZCk7CisJfQorCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCA9IGpsLT5qX3RyYW5zX2lkOwogCi0gIC8qIG5vdCBzdHJpY3RseSByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgZnJlZWluZyB0aGUgbGlzdCwgYnV0IGl0IHNob3VsZAotICAgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCi0gICAqLwotICBqbC0+al9sZW4gPSAwIDsKLSAgYXRvbWljX3NldCgmKGpsLT5qX25vbnplcm9sZW4pLCAwKSA7Ci0gIGpsLT5qX3N0YXJ0ID0gMCA7Ci0gIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOwotICBqbC0+al9jb21taXRfYmggPSBOVUxMIDsKLSAgamwtPmpfdHJhbnNfaWQgPSAwIDsKLSAgamwtPmpfc3RhdGUgPSAwOwotICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKLSAgaWYgKGZsdXNoYWxsKQotICAgIHVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7Ci0gIHJldHVybiBlcnIgOwotfSAKKwkvKiBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGZyZWVpbmcgdGhlIGxpc3QsIGJ1dCBpdCBzaG91bGQKKwkgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCisJICovCisJamwtPmpfbGVuID0gMDsKKwlhdG9taWNfc2V0KCYoamwtPmpfbm9uemVyb2xlbiksIDApOworCWpsLT5qX3N0YXJ0ID0gMDsKKwlqbC0+al9yZWFsYmxvY2sgPSBOVUxMOworCWpsLT5qX2NvbW1pdF9iaCA9IE5VTEw7CisJamwtPmpfdHJhbnNfaWQgPSAwOworCWpsLT5qX3N0YXRlID0gMDsKKwlwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKwlpZiAoZmx1c2hhbGwpCisJCXVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJcHV0X2ZzX2V4Y2woKTsKKwlyZXR1cm4gZXJyOworfQogCiBzdGF0aWMgaW50IHdyaXRlX29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCiAJCQkJIHN0cnVjdCBidWZmZXJfY2h1bmsgKmNodW5rKQogewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCWludCByZXQgPSAwOwogCi0gICAgamwtPmpfc3RhdGUgfD0gTElTVF9UT1VDSEVEOwotICAgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7Ci0gICAgaWYgKGpsLT5qX2xlbiA9PSAwIHx8IGF0b21pY19yZWFkKCZqbC0+al9ub256ZXJvbGVuKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlqbC0+al9zdGF0ZSB8PSBMSVNUX1RPVUNIRUQ7CisJZGVsX2Zyb21fd29ya19saXN0KHMsIGpsKTsKKwlpZiAoamwtPmpfbGVuID09IDAgfHwgYXRvbWljX3JlYWQoJmpsLT5qX25vbnplcm9sZW4pID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGlmIHRoZSBibG9ja25yID09IDAsIHRoaXMgaGFzIGJlZW4gY2xlYXJlZCBmcm9tIHRoZSBoYXNoLAotICAgICAgICAqKiBza2lwIGl0Ci0gICAgICAgICovCi0gICAgICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIG5leHQgOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgewotCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaDsKLQkgICAgLyogd2UgY2FuIHJhY2UgYWdhaW5zdCBqb3VybmFsX21hcmtfZnJlZWQgd2hlbiB3ZSB0cnkKLQkgICAgICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgotCSAgICAgKiBjb3VudCwgYW5kIHJlY2hlY2sgdGhpbmdzIGFmdGVyIGxvY2tpbmcKLQkgICAgICovCi0JICAgIHRtcF9iaCA9IGNuLT5iaDsKLQkgICAgZ2V0X2JoKHRtcF9iaCk7Ci0JICAgIGxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgewotCQlpZiAoIWJ1ZmZlcl9qb3VybmFsX2RpcnR5KHRtcF9iaCkgfHwKLQkJICAgIGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKHRtcF9iaCkpCi0JCSAgICBCVUcoKTsKLQkJYWRkX3RvX2NodW5rKGNodW5rLCB0bXBfYmgsIE5VTEwsIHdyaXRlX2NodW5rKTsKLQkJcmV0Kys7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdGUsIGNuLT5iaCBtaWdodCBiZSBudWxsIG5vdyAqLwotCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIH0KLQkgICAgcHV0X2JoKHRtcF9iaCk7Ci0gICAgICAgIH0KLW5leHQ6Ci0gICAgICAgIGNuID0gY24tPm5leHQgOwotCWNvbmRfcmVzY2hlZCgpOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwljbiA9IGpsLT5qX3JlYWxibG9jazsKKwl3aGlsZSAoY24pIHsKKwkJLyogaWYgdGhlIGJsb2NrbnIgPT0gMCwgdGhpcyBoYXMgYmVlbiBjbGVhcmVkIGZyb20gdGhlIGhhc2gsCisJCSAqKiBza2lwIGl0CisJCSAqLworCQlpZiAoY24tPmJsb2NrbnIgPT0gMCkgeworCQkJZ290byBuZXh0OworCQl9CisJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXBfYmg7CisJCQkvKiB3ZSBjYW4gcmFjZSBhZ2FpbnN0IGpvdXJuYWxfbWFya19mcmVlZCB3aGVuIHdlIHRyeQorCQkJICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgorCQkJICogY291bnQsIGFuZCByZWNoZWNrIHRoaW5ncyBhZnRlciBsb2NraW5nCisJCQkgKi8KKwkJCXRtcF9iaCA9IGNuLT5iaDsKKwkJCWdldF9iaCh0bXBfYmgpOworCQkJbG9ja19idWZmZXIodG1wX2JoKTsKKwkJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgeworCQkJCWlmICghYnVmZmVyX2pvdXJuYWxfZGlydHkodG1wX2JoKSB8fAorCQkJCSAgICBidWZmZXJfam91cm5hbF9wcmVwYXJlZCh0bXBfYmgpKQorCQkJCQlCVUcoKTsKKwkJCQlhZGRfdG9fY2h1bmsoY2h1bmssIHRtcF9iaCwgTlVMTCwgd3JpdGVfY2h1bmspOworCQkJCXJldCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBub3RlLCBjbi0+YmggbWlnaHQgYmUgbnVsbCBub3cgKi8KKwkJCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7CisJCQl9CisJCQlwdXRfYmgodG1wX2JoKTsKKwkJfQorCSAgICAgIG5leHQ6CisJCWNuID0gY24tPm5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKiB1c2VkIGJ5IGZsdXNoX2NvbW1pdF9saXN0ICovCiBzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKKwlpbnQgcmV0ID0gMDsKIAotICAgIGpsLT5qX3N0YXRlIHw9IExJU1RfRElSVFk7Ci0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGxvb2sgZm9yIGEgbW9yZSByZWNlbnQgdHJhbnNhY3Rpb24gdGhhdCBsb2dnZWQgdGhpcwotICAgICAgICAqKiBidWZmZXIuICBPbmx5IHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiB3aXRoIGEgYnVmZmVyIGluCi0gICAgICAgICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCi0gICAgICAgICovCi0JcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAgICAgaWYgKCFwamwgJiYgY24tPmJsb2NrbnIgJiYgY24tPmJoICYmIGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGNuLT5iaCkpCi0JewotCSAgICBCVUdfT04gKCFjYW5fZGlydHkoY24pKTsKLQkgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBwcmVwYXJlZCwgaXQgd2lsbCBlaXRoZXIgYmUgbG9nZ2VkCi0JICAgICAqIG9yIHJlc3RvcmVkLiAgSWYgcmVzdG9yZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JICAgICAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5Ci0JICAgICAqLwotICAgICAgICAgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChjbi0+YmgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGNuLT5iaCk7Ci0JICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGNuLT5iaCk7Ci0JICAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShjbi0+YmgpOwotCSAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNuID0gY24tPm5leHQgOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwlqbC0+al9zdGF0ZSB8PSBMSVNUX0RJUlRZOworCWNuID0gamwtPmpfcmVhbGJsb2NrOworCXdoaWxlIChjbikgeworCQkvKiBsb29rIGZvciBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uIHRoYXQgbG9nZ2VkIHRoaXMKKwkJICoqIGJ1ZmZlci4gIE9ubHkgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIHdpdGggYSBidWZmZXIgaW4KKwkJICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCisJCSAqLworCQlwamwgPSBmaW5kX25ld2VyX2psX2Zvcl9jbihjbik7CisJCWlmICghcGpsICYmIGNuLT5ibG9ja25yICYmIGNuLT5iaAorCQkgICAgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPmJoKSkgeworCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCS8qIGlmIHRoZSBidWZmZXIgaXMgcHJlcGFyZWQsIGl0IHdpbGwgZWl0aGVyIGJlIGxvZ2dlZAorCQkJICogb3IgcmVzdG9yZWQuICBJZiByZXN0b3JlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJCSAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5CisJCQkgKi8KKwkJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyhjbi0+YmgpOworCQkJaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGNuLT5iaCkpIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShjbi0+YmgpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfdGVzdChjbi0+YmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQl9CisJCX0KKwkJY24gPSBjbi0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAotCQkJCSAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCi0JCQkJICAgaW50IG51bV9ibG9ja3MsCi0JCQkJICAgaW50IG51bV90cmFucykgewotICAgIGludCByZXQgPSAwOwotICAgIGludCB3cml0dGVuID0gMCA7Ci0gICAgaW50IHRyYW5zYWN0aW9uc19mbHVzaGVkID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIG9yaWdfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgY2h1bmsubnIgPSAwOworCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAorCQkJCXVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCisJCQkJaW50IG51bV9ibG9ja3MsIGludCBudW1fdHJhbnMpCit7CisJaW50IHJldCA9IDA7CisJaW50IHdyaXR0ZW4gPSAwOworCWludCB0cmFuc2FjdGlvbnNfZmx1c2hlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IGJ1ZmZlcl9jaHVuayBjaHVuazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2h1bmsubnIgPSAwOwogCi0gICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIG9yaWdfdHJhbnNfaWQpKSB7Ci0JZ290byBkb25lOwotICAgIH0KLQotICAgIC8qIHdlJ3ZlIGdvdCBqX2ZsdXNoX3NlbSBoZWxkLCBub2JvZHkgaXMgZ29pbmcgdG8gZGVsZXRlIGFueQotICAgICAqIG9mIHRoZXNlIGxpc3RzIG91dCBmcm9tIHVuZGVybmVhdGggdXMKLSAgICAgKi8KLSAgICB3aGlsZSgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAotICAgICAgICAgICghbnVtX3RyYW5zICYmIHdyaXR0ZW4gPCBudW1fYmxvY2tzKSkgewotCi0JaWYgKGpsLT5qX2xlbiA9PSAwIHx8IChqbC0+al9zdGF0ZSAmIExJU1RfVE9VQ0hFRCkgfHwKLQkgICAgYXRvbWljX3JlYWQoJmpsLT5qX2NvbW1pdF9sZWZ0KSB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpCi0JewotCSAgICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwotCSAgICBicmVhazsKKwlkb3duKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3JpZ190cmFuc19pZCkpIHsKKwkJZ290byBkb25lOwogCX0KLQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQlpZiAocmV0IDwgMCkKLQkgICAgZ290byBkb25lOwotCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7Ci0Jd3JpdHRlbiArPSByZXQ7Ci0JZW50cnkgPSBqbC0+al9saXN0Lm5leHQ7CisJLyogd2UndmUgZ290IGpfZmx1c2hfc2VtIGhlbGQsIG5vYm9keSBpcyBnb2luZyB0byBkZWxldGUgYW55CisJICogb2YgdGhlc2UgbGlzdHMgb3V0IGZyb20gdW5kZXJuZWF0aCB1cworCSAqLworCXdoaWxlICgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAorCSAgICAgICAoIW51bV90cmFucyAmJiB3cml0dGVuIDwgbnVtX2Jsb2NrcykpIHsKIAotCS8qIGRpZCB3ZSB3cmFwPyAqLwotCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpIHsKLQkgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWlmIChqbC0+al9sZW4gPT0gMCB8fCAoamwtPmpfc3RhdGUgJiBMSVNUX1RPVUNIRUQpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpCisJCSAgICB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpIHsKKwkJCWRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQkvKiBkb24ndCBib3RoZXIgd2l0aCBvbGRlciB0cmFuc2FjdGlvbnMgKi8KLQlpZiAoamwtPmpfdHJhbnNfaWQgPD0gb3JpZ190cmFuc19pZCkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjaHVuay5ucikgewotICAgICAgICB3cml0ZV9jaHVuaygmY2h1bmspOwotICAgIH0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7CisJCXdyaXR0ZW4gKz0gcmV0OworCQllbnRyeSA9IGpsLT5qX2xpc3QubmV4dDsKIAotZG9uZToKLSAgICB1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIHJldHVybiByZXQ7CisJCS8qIGRpZCB3ZSB3cmFwPyAqLworCQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCQlicmVhazsKKwkJfQorCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisKKwkJLyogZG9uJ3QgYm90aGVyIHdpdGggb2xkZXIgdHJhbnNhY3Rpb25zICovCisJCWlmIChqbC0+al90cmFuc19pZCA8PSBvcmlnX3RyYW5zX2lkKQorCQkJYnJlYWs7CisJfQorCWlmIChjaHVuay5ucikgeworCQl3cml0ZV9jaHVuaygmY2h1bmspOworCX0KKworICAgICAgZG9uZToKKwl1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOworCXJldHVybiByZXQ7CiB9CiAKIC8qIGZvciBvX3N5bmMgYW5kIGZzeW5jIGhlYXZ5IGFwcGxpY2F0aW9ucywgdGhleSB0ZW5kIHRvIHVzZQpAQCAtMTYwNyw0NyArMTcyMCw0OCBAQAogKiogbGlzdCB1cGRhdGVzIHRoZSBoZWFkZXIgYmxvY2sKICovCiBzdGF0aWMgaW50IGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGN1cl9sZW47Ci0gICAgaW50IHJldDsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGltaXQgPSAyNTY7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqdGpsOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZsdXNoX2psOwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKwkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgY3VyX2xlbjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBsaW1pdCA9IDI1NjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICp0amw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmx1c2hfamw7CisJdW5zaWduZWQgbG9uZyB0cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CiAKLSAgICBmbHVzaF9qbCA9IHRqbCA9IGpsOworCWZsdXNoX2psID0gdGpsID0gamw7CiAKLSAgICAvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KLSAgICBpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCi0JbGltaXQgPSAxMDI0OwotICAgIC8qIGZsdXNoIGZvciAyNTYgdHJhbnNhY3Rpb25zIG9yIGxpbWl0IGJsb2Nrcywgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCi0gICAgZm9yKGkgPSAwIDsgaSA8IDI1NiAmJiBsZW4gPCBsaW1pdCA7IGkrKykgewotCWlmIChhdG9taWNfcmVhZCgmdGpsLT5qX2NvbW1pdF9sZWZ0KSB8fAotCSAgICB0amwtPmpfdHJhbnNfaWQgPCBqbC0+al90cmFuc19pZCkgewotCSAgICBicmVhazsKKwkvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCisJCWxpbWl0ID0gMTAyNDsKKwkvKiBmbHVzaCBmb3IgMjU2IHRyYW5zYWN0aW9ucyBvciBsaW1pdCBibG9ja3MsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLworCWZvciAoaSA9IDA7IGkgPCAyNTYgJiYgbGVuIDwgbGltaXQ7IGkrKykgeworCQlpZiAoYXRvbWljX3JlYWQoJnRqbC0+al9jb21taXRfbGVmdCkgfHwKKwkJICAgIHRqbC0+al90cmFuc19pZCA8IGpsLT5qX3RyYW5zX2lkKSB7CisJCQlicmVhazsKKwkJfQorCQljdXJfbGVuID0gYXRvbWljX3JlYWQoJnRqbC0+al9ub256ZXJvbGVuKTsKKwkJaWYgKGN1cl9sZW4gPiAwKSB7CisJCQl0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkJfQorCQlsZW4gKz0gY3VyX2xlbjsKKwkJZmx1c2hfamwgPSB0amw7CisJCWlmICh0amwtPmpfbGlzdC5uZXh0ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJCWJyZWFrOworCQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7CiAJfQotCWN1cl9sZW4gPSBhdG9taWNfcmVhZCgmdGpsLT5qX25vbnplcm9sZW4pOwotCWlmIChjdXJfbGVuID4gMCkgewotCSAgICB0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkvKiB0cnkgdG8gZmluZCBhIGdyb3VwIG9mIGJsb2NrcyB3ZSBjYW4gZmx1c2ggYWNyb3NzIGFsbCB0aGUKKwkgKiogdHJhbnNhY3Rpb25zLCBidXQgb25seSBib3RoZXIgaWYgd2UndmUgYWN0dWFsbHkgc3Bhbm5lZAorCSAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKKwkgKi8KKwlpZiAoZmx1c2hfamwgIT0gamwpIHsKKwkJcmV0ID0ga3VwZGF0ZV90cmFuc2FjdGlvbnMocywgamwsICZ0amwsICZ0cmFuc19pZCwgbGVuLCBpKTsKIAl9Ci0JbGVuICs9IGN1cl9sZW47Ci0JZmx1c2hfamwgPSB0amw7Ci0JaWYgKHRqbC0+al9saXN0Lm5leHQgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQotCSAgICBicmVhazsKLQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7Ci0gICAgfQotICAgIC8qIHRyeSB0byBmaW5kIGEgZ3JvdXAgb2YgYmxvY2tzIHdlIGNhbiBmbHVzaCBhY3Jvc3MgYWxsIHRoZQotICAgICoqIHRyYW5zYWN0aW9ucywgYnV0IG9ubHkgYm90aGVyIGlmIHdlJ3ZlIGFjdHVhbGx5IHNwYW5uZWQKLSAgICAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKLSAgICAqLwotICAgIGlmIChmbHVzaF9qbCAhPSBqbCkgewotICAgICAgICByZXQgPSBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzLCBqbCwgJnRqbCwgJnRyYW5zX2lkLCBsZW4sIGkpOwotICAgIH0KLSAgICBmbHVzaF9qb3VybmFsX2xpc3QocywgZmx1c2hfamwsIDEpOwotICAgIHJldHVybiAwOworCWZsdXNoX2pvdXJuYWxfbGlzdChzLCBmbHVzaF9qbCwgMSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjU1LDIwNyArMTc2OSwyNDggQEAKICoqIG9ubHkgdG91Y2hzIHRoZSBobmV4dCBhbmQgaHByZXYgcG9pbnRlcnMuCiAqLwogdm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAotCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCi0JCQl1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgcmVtb3ZlX2ZyZWVkKQorCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQkgdW5zaWduZWQgbG9uZyBibG9jaywgaW50IHJlbW92ZV9mcmVlZCkKIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqaGVhZCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1cjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKmhlYWQ7CiAKLSAgaGVhZD0gJihqb3VybmFsX2hhc2godGFibGUsIHNiLCBibG9jaykpIDsKLSAgaWYgKCFoZWFkKSB7Ci0gICAgcmV0dXJuIDsKLSAgfQotICBjdXIgPSAqaGVhZCA7Ci0gIHdoaWxlKGN1cikgewotICAgIGlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYiAmJiAoamwgPT0gTlVMTCB8fCBqbCA9PSBjdXItPmpsaXN0KSAmJiAKLSAgICAgICAgKCF0ZXN0X2JpdChCTE9DS19GUkVFRCwgJmN1ci0+c3RhdGUpIHx8IHJlbW92ZV9mcmVlZCkpIHsKLSAgICAgIGlmIChjdXItPmhuZXh0KSB7Ci0gICAgICAgIGN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldiA7Ci0gICAgICB9Ci0gICAgICBpZiAoY3VyLT5ocHJldikgewotCWN1ci0+aHByZXYtPmhuZXh0ID0gY3VyLT5obmV4dCA7Ci0gICAgICB9IGVsc2UgewotCSpoZWFkID0gY3VyLT5obmV4dCA7Ci0gICAgICB9Ci0gICAgICBjdXItPmJsb2NrbnIgPSAwIDsKLSAgICAgIGN1ci0+c2IgPSBOVUxMIDsKLSAgICAgIGN1ci0+c3RhdGUgPSAwIDsKLSAgICAgIGlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpIC8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCi0JYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpIDsKLSAgICAgIGN1ci0+YmggPSBOVUxMIDsKLSAgICAgIGN1ci0+amxpc3QgPSBOVUxMIDsKLSAgICB9IAotICAgIGN1ciA9IGN1ci0+aG5leHQgOwotICB9CisJaGVhZCA9ICYoam91cm5hbF9oYXNoKHRhYmxlLCBzYiwgYmxvY2spKTsKKwlpZiAoIWhlYWQpIHsKKwkJcmV0dXJuOworCX0KKwljdXIgPSAqaGVhZDsKKwl3aGlsZSAoY3VyKSB7CisJCWlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYgorCQkgICAgJiYgKGpsID09IE5VTEwgfHwgamwgPT0gY3VyLT5qbGlzdCkKKwkJICAgICYmICghdGVzdF9iaXQoQkxPQ0tfRlJFRUQsICZjdXItPnN0YXRlKSB8fCByZW1vdmVfZnJlZWQpKSB7CisJCQlpZiAoY3VyLT5obmV4dCkgeworCQkJCWN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldjsKKwkJCX0KKwkJCWlmIChjdXItPmhwcmV2KSB7CisJCQkJY3VyLT5ocHJldi0+aG5leHQgPSBjdXItPmhuZXh0OworCQkJfSBlbHNlIHsKKwkJCQkqaGVhZCA9IGN1ci0+aG5leHQ7CisJCQl9CisJCQljdXItPmJsb2NrbnIgPSAwOworCQkJY3VyLT5zYiA9IE5VTEw7CisJCQljdXItPnN0YXRlID0gMDsKKwkJCWlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpCS8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCisJCQkJYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpOworCQkJY3VyLT5iaCA9IE5VTEw7CisJCQljdXItPmpsaXN0ID0gTlVMTDsKKwkJfQorCQljdXIgPSBjdXItPmhuZXh0OworCX0KIH0KIAotc3RhdGljIHZvaWQgZnJlZV9qb3VybmFsX3JhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgcmVpc2VyZnNfa2ZyZWUoam91cm5hbC0+al9jdXJyZW50X2psLAotICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHBfc19zYik7Ci0gIGpvdXJuYWwtPmpfbnVtX2xpc3RzLS07CitzdGF0aWMgdm9pZCBmcmVlX2pvdXJuYWxfcmFtKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXJlaXNlcmZzX2tmcmVlKGpvdXJuYWwtPmpfY3VycmVudF9qbCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcF9zX3NiKTsKKwlqb3VybmFsLT5qX251bV9saXN0cy0tOwogCi0gIHZmcmVlKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9vcmlnKSA7Ci0gIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgam91cm5hbC0+al9saXN0X2JpdG1hcCkgOwotICBmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpIDsgLyogbXVzdCBiZSBhZnRlciBmcmVlX2xpc3RfYml0bWFwcyAqLwotICBpZiAoam91cm5hbC0+al9oZWFkZXJfYmgpIHsKLSAgICBicmVsc2Uoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLSAgfQotICAvKiBqX2hlYWRlcl9iaCBpcyBvbiB0aGUgam91cm5hbCBkZXYsIG1ha2Ugc3VyZSBub3QgdG8gcmVsZWFzZSB0aGUgam91cm5hbAotICAgKiBkZXYgdW50aWwgd2UgYnJlbHNlIGpfaGVhZGVyX2JoCi0gICAqLwotICByZWxlYXNlX2pvdXJuYWxfZGV2KHBfc19zYiwgam91cm5hbCk7Ci0gIHZmcmVlKGpvdXJuYWwpIDsKKwl2ZnJlZShqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyk7CisJZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfYml0bWFwKTsKKwlmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpOwkvKiBtdXN0IGJlIGFmdGVyIGZyZWVfbGlzdF9iaXRtYXBzICovCisJaWYgKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSB7CisJCWJyZWxzZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJfQorCS8qIGpfaGVhZGVyX2JoIGlzIG9uIHRoZSBqb3VybmFsIGRldiwgbWFrZSBzdXJlIG5vdCB0byByZWxlYXNlIHRoZSBqb3VybmFsCisJICogZGV2IHVudGlsIHdlIGJyZWxzZSBqX2hlYWRlcl9iaAorCSAqLworCXJlbGVhc2Vfam91cm5hbF9kZXYocF9zX3NiLCBqb3VybmFsKTsKKwl2ZnJlZShqb3VybmFsKTsKIH0KIAogLyoKICoqIGNhbGwgb24gdW5tb3VudC4gIE9ubHkgc2V0IGVycm9yIHRvIDEgaWYgeW91IGhhdmVuJ3QgbWFkZSB5b3VyIHdheSBvdXQKICoqIG9mIHJlYWRfc3VwZXIoKSB5ZXQuICBBbnkgb3RoZXIgY2FsbGVyIG11c3Qga2VlcCBlcnJvciBhdCAwLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGVycm9yKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7Ci0gIGludCBmbHVzaGVkID0gMDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CitzdGF0aWMgaW50IGRvX2pvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOworCWludCBmbHVzaGVkID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAvKiB3ZSBvbmx5IHdhbnQgdG8gZmx1c2ggb3V0IHRyYW5zYWN0aW9ucyBpZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGVycm9yID09IDAKLSAgKi8KLSAgaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLSAgICAvKiBlbmQgdGhlIGN1cnJlbnQgdHJhbnMgKi8KLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwxMCwgRkxVU0hfQUxMKSA7CisJLyogd2Ugb25seSB3YW50IHRvIGZsdXNoIG91dCB0cmFuc2FjdGlvbnMgaWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBlcnJvciA9PSAwCisJICovCisJaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJLyogZW5kIHRoZSBjdXJyZW50IHRyYW5zICovCisJCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCQlkb19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCAxMCwgRkxVU0hfQUxMKTsKIAotICAgIC8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCi0gICAgaWYgKCFqb3VybmFsX2pvaW4oJm15dGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksIDEpIDsKLSAgICAgICAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwxLCBGTFVTSF9BTEwpIDsKLSAgICAgICAgZmx1c2hlZCA9IDE7Ci0gICAgfQotICB9CisJCS8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCisJCWlmICgham91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwKKwkJCQkJCSAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJCSAgICAgMSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkoJm15dGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJCQlkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpOworCQkJZmx1c2hlZCA9IDE7CisJCX0KKwl9CiAKLSAgLyogdGhpcyBhbHNvIGNhdGNoZXMgZXJyb3JzIGR1cmluZyB0aGUgZG9fam91cm5hbF9lbmQgYWJvdmUgKi8KLSAgaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKLSAgICAgIG1lbXNldCgmbXl0aCwgMCwgc2l6ZW9mKG15dGgpKTsKLSAgICAgIGlmICgham91cm5hbF9qb2luX2Fib3J0KCZteXRoLCBwX3Nfc2IsIDEpKSB7Ci0JICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotCSAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgICBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpIDsKLSAgICAgIH0KLSAgfQorCS8qIHRoaXMgYWxzbyBjYXRjaGVzIGVycm9ycyBkdXJpbmcgdGhlIGRvX2pvdXJuYWxfZW5kIGFib3ZlICovCisJaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJbWVtc2V0KCZteXRoLCAwLCBzaXplb2YobXl0aCkpOworCQlpZiAoIWpvdXJuYWxfam9pbl9hYm9ydCgmbXl0aCwgcF9zX3NiLCAxKSkgeworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsCisJCQkJCQkgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsCisJCQkJCSAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCQkJZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgRkxVU0hfQUxMKTsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50LS0gOwotICAvKiB3YWl0IGZvciBhbGwgY29tbWl0cyB0byBmaW5pc2ggKi8KLSAgY2FuY2VsX2RlbGF5ZWRfd29yaygmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3dvcmspOwotICBmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgaWYgKCFyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KSB7Ci0gICAgZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgICBjb21taXRfd3EgPSBOVUxMOwotICB9CisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudC0tOworCS8qIHdhaXQgZm9yIGFsbCBjb21taXRzIHRvIGZpbmlzaCAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJlNCX0pPVVJOQUwocF9zX3NiKS0+al93b3JrKTsKKwlmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKKwlpZiAoIXJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKKwkJY29tbWl0X3dxID0gTlVMTDsKKwl9CiAKLSAgZnJlZV9qb3VybmFsX3JhbShwX3Nfc2IpIDsKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CiAKLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCiAvKgogKiogY2FsbCBvbiB1bm1vdW50LiAgZmx1c2ggYWxsIGpvdXJuYWwgdHJhbnMsIHJlbGVhc2UgYWxsIGFsbG9jJ2QgcmFtCiAqLwotaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKSA7CitpbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKTsKIH0KKwogLyoKICoqIG9ubHkgY2FsbCBmcm9tIGFuIGVycm9yIGNvbmRpdGlvbiBpbnNpZGUgcmVpc2VyZnNfcmVhZF9zdXBlciEKICovCi1pbnQgam91cm5hbF9yZWxlYXNlX2Vycm9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICByZXR1cm4gZG9fam91cm5hbF9yZWxlYXNlKHRoLCBwX3Nfc2IsIDEpIDsKK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXJldHVybiBkb19qb3VybmFsX3JlbGVhc2UodGgsIHBfc19zYiwgMSk7CiB9CiAKIC8qIGNvbXBhcmVzIGRlc2NyaXB0aW9uIGJsb2NrIHdpdGggY29tbWl0IGJsb2NrLiAgcmV0dXJucyAxIGlmIHRoZXkgZGlmZmVyLCAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lICovCi1zdGF0aWMgaW50IGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYywgCi0JCQkgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCkgewotICBpZiAoZ2V0X2NvbW1pdF90cmFuc19pZCAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19pZCAoZGVzYykgfHwgCi0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpIHx8IAotICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgPiBTQl9KT1VSTkFMKHBfc19zYiktPmpfdHJhbnNfbWF4IHx8Ci0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSA8PSAwIAotICApIHsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworc3RhdGljIGludCBqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0KQoreworCWlmIChnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCkgIT0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA+IFNCX0pPVVJOQUwocF9zX3NiKS0+al90cmFuc19tYXggfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA8PSAwKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KKwogLyogcmV0dXJucyAwIGlmIGl0IGRpZCBub3QgZmluZCBhIGRlc2NyaXB0aW9uIGJsb2NrICAKICoqIHJldHVybnMgLTEgaWYgaXQgZm91bmQgYSBjb3JydXB0IGNvbW1pdCBibG9jawogKiogcmV0dXJucyAxIGlmIGJvdGggZGVzYyBhbmQgY29tbWl0IHdlcmUgdmFsaWQgCiAqLwotc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsIHVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQl1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAKLSAgaWYgKCFkX2JoKQotICAgICAgcmV0dXJuIDAgOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDA7CiAKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgaWYgKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA+IDAgJiYgIW1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgewotICAgIGlmIChvbGRlc3RfaW52YWxpZF90cmFuc19pZCAmJiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgPiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLSAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtOTg2OiB0cmFuc2FjdGlvbiAiCi0JICAgICAgICAgICAgICAiaXMgdmFsaWQgcmV0dXJuaW5nIGJlY2F1c2UgdHJhbnNfaWQgJWQgaXMgZ3JlYXRlciB0aGFuICIKLQkJICAgICAgIm9sZGVzdF9pbnZhbGlkICVsdSIsIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpLAotCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKLSAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgaWYgKG5ld2VzdF9tb3VudF9pZCAmJiAqbmV3ZXN0X21vdW50X2lkID4gZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpKSB7Ci0gICAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwODc6IHRyYW5zYWN0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgotCQkgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCQkgICAgICpuZXdlc3RfbW91bnRfaWQpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICAgIGlmICggZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSk7Ci0gICAgICByZXR1cm4gLTEgOwotICAgIH0KLSAgICBvZmZzZXQgPSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCWlmIChnZXRfZGVzY190cmFuc19sZW4oZGVzYykgPiAwCisJICAgICYmICFtZW1jbXAoZ2V0X2pvdXJuYWxfZGVzY19tYWdpYyhkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgeworCQlpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkCisJCSAgICAmJiBnZXRfZGVzY190cmFuc19pZChkZXNjKSA+ICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC05ODY6IHRyYW5zYWN0aW9uICIKKwkJCQkgICAgICAgImlzIHZhbGlkIHJldHVybmluZyBiZWNhdXNlIHRyYW5zX2lkICVkIGlzIGdyZWF0ZXIgdGhhbiAiCisJCQkJICAgICAgICJvbGRlc3RfaW52YWxpZCAlbHUiLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19pZChkZXNjKSwKKwkJCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChuZXdlc3RfbW91bnRfaWQKKwkJICAgICYmICpuZXdlc3RfbW91bnRfaWQgPiBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC0xMDg3OiB0cmFuc2FjdGlvbiAiCisJCQkJICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgorCQkJCSAgICAgICAibmV3ZXN0X21vdW50X2lkICVsdSIsCisJCQkJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAorCQkJCSAgICAgICAqbmV3ZXN0X21vdW50X2lkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsCisJCQkJCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW9mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOwogCi0gICAgLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCi0gICAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgIGlmICghY19iaCkKLSAgICAgIHJldHVybiAwIDsKLSAgICBjb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhIDsKLSAgICBpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgewotICAgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAKLSAgICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkLCBjb21taXQgb2Zmc2V0ICVsZCBoYWQgYmFkICIKLQkJICAgICAidGltZSAlZCBvciBsZW5ndGggJWQiLAotCQkgICAgIGNfYmgtPmJfYmxvY2tuciAtICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2lkIChjb21taXQpLCAKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgICBpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLQkqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgPSBnZXRfZGVzY190cmFuc19pZChkZXNjKSA7Ci0JcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDA0OiAiCi0JCSAgICAgICAidHJhbnNhY3Rpb25faXNfdmFsaWQgc2V0dGluZyBvbGRlc3QgaW52YWxpZCB0cmFuc19pZCAiCi0JCSAgICAgICAidG8gJWQiLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOyAKLSAgICB9Ci0gICAgYnJlbHNlKGNfYmgpIDsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMDY6IGZvdW5kIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb24gc3RhcnQgb2Zmc2V0ICVsbHUsIGxlbiAlZCBpZCAlZCIsCi0JCSAgIGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgIHJldHVybiAxIDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwkJLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCisJCWNfYmggPQorCQkgICAgam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkJICAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArCisJCQkJICAgIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCWlmICghY19iaCkKKwkJCXJldHVybiAwOworCQljb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhOworCQlpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZCwgY29tbWl0IG9mZnNldCAlbGQgaGFkIGJhZCAiCisJCQkJICAgICAgICJ0aW1lICVkIG9yIGxlbmd0aCAlZCIsCisJCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAorCQkJCSAgICAgICBnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCksCisJCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJaWYgKG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKSB7CisJCQkJKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkID0KKwkJCQkgICAgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTAwNDogIgorCQkJCQkgICAgICAgInRyYW5zYWN0aW9uX2lzX3ZhbGlkIHNldHRpbmcgb2xkZXN0IGludmFsaWQgdHJhbnNfaWQgIgorCQkJCQkgICAgICAgInRvICVkIiwKKwkJCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVsc2UoY19iaCk7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMDA2OiBmb3VuZCB2YWxpZCAiCisJCQkgICAgICAgInRyYW5zYWN0aW9uIHN0YXJ0IG9mZnNldCAlbGx1LCBsZW4gJWQgaWQgJWQiLAorCQkJICAgICAgIGRfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLAorCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQogfQogCi1zdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pIHsKLSAgaW50IGkgOwotICBmb3IgKGkgPSAwIDsgaSA8IG51bSA7IGkrKykgewotICAgIGJyZWxzZShoZWFkc1tpXSkgOwotICB9CitzdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWJyZWxzZShoZWFkc1tpXSk7CisJfQogfQogCiAvKgpAQCAtMTg2MywxNDkgKzIwMTgsMjAyIEBACiAqKiB0aGlzIGVpdGhlciByZWFkcyBpbiBhIHJlcGxheXMgYSB0cmFuc2FjdGlvbiwgb3IgcmV0dXJucyBiZWNhdXNlIHRoZSB0cmFuc2FjdGlvbgogKiogaXMgaW52YWxpZCwgb3IgdG9vIG9sZC4KICovCi1zdGF0aWMgaW50IGpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBjdXJfZGJsb2NrLCB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCwgCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7Ci0gIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSAwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbG9nX2Jsb2NrcyA9IE5VTEwgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZWFsX2Jsb2NrcyA9IE5VTEwgOwotICB1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldCA7Ci0gIGludCBpOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2ssCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmxvZ19ibG9ja3MgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnJlYWxfYmxvY2tzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldDsKKwlpbnQgaTsKKwlpbnQgdHJhbnNfaGFsZjsKIAotICBkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spIDsKLSAgaWYgKCFkX2JoKQotICAgIHJldHVybiAxIDsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgdHJhbnNfb2Zmc2V0ID0gZF9iaC0+Yl9ibG9ja25yIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzc6ICIKLSAgICAgICAgICAgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCi0JCSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGdldF9kZXNjX21vdW50X2lkKGRlc2MpKSA7Ci0gIGlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgewotICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzOTogIgotICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnMgc2tpcHBpbmcgYmVjYXVzZSAlbHUgaXMgdG9vIG9sZCIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIGlmIChnZXRfZGVzY19tb3VudF9pZChkZXNjKSAhPSBuZXdlc3RfbW91bnRfaWQpIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKLSAgICAgICAgICAgICAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgotCQkgICAibmV3ZXN0X21vdW50X2lkICVsdSIsIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAotCQkgICAgbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJSAKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgaWYgKCFjX2JoKSB7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIGlmIChqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQocF9zX3NiLCBkZXNjLCBjb21taXQpKSB7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uLCAiCi0gICAgICAgICAgICAgICAgICAgImNvbW1pdCBvZmZzZXQgJWxsdSBoYWQgYmFkIHRpbWUgJWQgb3IgbGVuZ3RoICVkIiwKLQkJICAgY19iaC0+Yl9ibG9ja25yIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLCBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICBicmVsc2UoY19iaCkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDE7IAotICB9Ci0gIHRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOwotICAvKiBub3cgd2Uga25vdyB3ZSd2ZSBnb3QgYSBnb29kIHRyYW5zYWN0aW9uLCBhbmQgaXQgd2FzIGluc2lkZSB0aGUgdmFsaWQgdGltZSByYW5nZXMgKi8KLSAgbG9nX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICByZWFsX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICBpZiAoIWxvZ19ibG9ja3MgIHx8ICFyZWFsX2Jsb2NrcykgewotICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTExNjk6IGttYWxsb2MgZmFpbGVkLCB1bmFibGUgdG8gbW91bnQgRlMiKSA7Ci0gICAgcmV0dXJuIC0xIDsKLSAgfQotICAvKiBnZXQgYWxsIHRoZSBidWZmZXIgaGVhZHMgKi8KLSAgdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOwotICBmb3IoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgbG9nX2Jsb2Nrc1tpXSA9ICBqb3VybmFsX2dldGJsayhwX3Nfc2IsICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICh0cmFuc19vZmZzZXQgKyAxICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgIGlmIChpIDwgdHJhbnNfaGFsZikgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShkZXNjLT5qX3JlYWxibG9ja1tpXSkpIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShjb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSkpIDsKLSAgICB9Ci0gICAgaWYgKCByZWFsX2Jsb2Nrc1tpXS0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjA3OiBSRVBMQVkgRkFJTFVSRSBmc2NrIHJlcXVpcmVkISBCbG9jayB0byByZXBsYXkgaXMgb3V0c2lkZSBvZiBmaWxlc3lzdGVtIik7Ci0gICAgICBnb3RvIGFib3J0X3JlcGxheTsKLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLwotICAgIGlmIChpc19ibG9ja19pbl9sb2dfb3JfcmVzZXJ2ZWRfYXJlYShwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIwNDogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgVHJ5aW5nIHRvIHJlcGxheSBvbnRvIGEgbG9nIGJsb2NrIikgOwotYWJvcnRfcmVwbGF5OgotICAgICAgYnJlbHNlX2FycmF5KGxvZ19ibG9ja3MsIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgaSkgOwotICAgICAgYnJlbHNlKGNfYmgpIDsKLSAgICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICB9Ci0gIC8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCi0gIGxsX3J3X2Jsb2NrKFJFQUQsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgbG9nX2Jsb2NrcykgOwotICBmb3IgKGkgPSAwIDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA7IGkrKykgewotICAgIHdhaXRfb25fYnVmZmVyKGxvZ19ibG9ja3NbaV0pIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShsb2dfYmxvY2tzW2ldKSkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkobG9nX2Jsb2NrcyArIGksIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgbWVtY3B5KHJlYWxfYmxvY2tzW2ldLT5iX2RhdGEsIGxvZ19ibG9ja3NbaV0tPmJfZGF0YSwgcmVhbF9ibG9ja3NbaV0tPmJfc2l6ZSkgOwotICAgIHNldF9idWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pIDsKLSAgICBicmVsc2UobG9nX2Jsb2Nrc1tpXSkgOwotICB9Ci0gIC8qIGZsdXNoIG91dCB0aGUgcmVhbCBibG9ja3MgKi8KLSAgZm9yIChpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKLSAgICBzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKSA7Ci0gICAgbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSkgOwotICB9Ci0gIGZvciAoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgd2FpdF9vbl9idWZmZXIocmVhbF9ibG9ja3NbaV0pIDsgCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIyNjogUkVQTEFZIEZBSUxVUkUsIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MgKyBpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgLSBpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgYnJlbHNlKHJlYWxfYmxvY2tzW2ldKSA7Ci0gIH0KLSAgY3VyX2RibG9jayA9ICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDk1OiBzZXR0aW5nIGpvdXJuYWwgIgotICAgICAgICAgICAgICAgICAic3RhcnQgdG8gb2Zmc2V0ICVsZCIsCi0JCSBjdXJfZGJsb2NrIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKSA7Ci0gIAotICAvKiBpbml0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGZpcnN0IHRyYW5zYWN0aW9uLCBpbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdG8gYmUgcmVwbGF5ZWQuICovCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSBjdXJfZGJsb2NrIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7Ci0gIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7Ci0gIGJyZWxzZShjX2JoKSA7Ci0gIGJyZWxzZShkX2JoKSA7Ci0gIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGxlMzJfdG9fY3B1KGRlc2MtPmpfbGVuKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gIHJldHVybiAwIDsKKwlkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDE7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCXRyYW5zX29mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzNzogIgorCQkgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCisJCSAgICAgICBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJICAgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCWlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzk6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWx1IGlzIHRvbyBvbGQiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLQorCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGdldF9kZXNjX21vdW50X2lkKGRlc2MpICE9IG5ld2VzdF9tb3VudF9pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgorCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYyksCisJCQkgICAgICAgbmV3ZXN0X21vdW50X2lkKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJQorCQkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJaWYgKCFjX2JoKSB7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJaWYgKGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChwX3Nfc2IsIGRlc2MsIGNvbW1pdCkpIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24sICIKKwkJCSAgICAgICAiY29tbWl0IG9mZnNldCAlbGx1IGhhZCBiYWQgdGltZSAlZCBvciBsZW5ndGggJWQiLAorCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLAorCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQlicmVsc2UoY19iaCk7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCXRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJLyogbm93IHdlIGtub3cgd2UndmUgZ290IGEgZ29vZCB0cmFuc2FjdGlvbiwgYW5kIGl0IHdhcyBpbnNpZGUgdGhlIHZhbGlkIHRpbWUgcmFuZ2VzICovCisJbG9nX2Jsb2NrcyA9CisJICAgIHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYik7CisJcmVhbF9ibG9ja3MgPQorCSAgICByZWlzZXJmc19rbWFsbG9jKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIEdGUF9OT0ZTLCBwX3Nfc2IpOworCWlmICghbG9nX2Jsb2NrcyB8fCAhcmVhbF9ibG9ja3MpIHsKKwkJYnJlbHNlKGNfYmgpOworCQlicmVsc2UoZF9iaCk7CisJCXJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywKKwkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYik7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMTY5OiBrbWFsbG9jIGZhaWxlZCwgdW5hYmxlIHRvIG1vdW50IEZTIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogZ2V0IGFsbCB0aGUgYnVmZmVyIGhlYWRzICovCisJdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZihwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJbG9nX2Jsb2Nrc1tpXSA9CisJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICh0cmFuc19vZmZzZXQgKyAxICsKKwkJCQkgICAgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlpZiAoaSA8IHRyYW5zX2hhbGYpIHsKKwkJCXJlYWxfYmxvY2tzW2ldID0KKwkJCSAgICBzYl9nZXRibGsocF9zX3NiLAorCQkJCSAgICAgIGxlMzJfdG9fY3B1KGRlc2MtPmpfcmVhbGJsb2NrW2ldKSk7CisJCX0gZWxzZSB7CisJCQlyZWFsX2Jsb2Nrc1tpXSA9CisJCQkgICAgc2JfZ2V0YmxrKHBfc19zYiwKKwkJCQkgICAgICBsZTMyX3RvX2NwdShjb21taXQtPgorCQkJCQkJICBqX3JlYWxibG9ja1tpIC0gdHJhbnNfaGFsZl0pKTsKKwkJfQorCQlpZiAocmVhbF9ibG9ja3NbaV0tPmJfYmxvY2tuciA+IFNCX0JMT0NLX0NPVU5UKHBfc19zYikpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTIwNzogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgQmxvY2sgdG8gcmVwbGF5IGlzIG91dHNpZGUgb2YgZmlsZXN5c3RlbSIpOworCQkJZ290byBhYm9ydF9yZXBsYXk7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJICAgIChwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMDQ6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIFRyeWluZyB0byByZXBsYXkgb250byBhIGxvZyBibG9jayIpOworCQkgICAgICBhYm9ydF9yZXBsYXk6CisJCQlicmVsc2VfYXJyYXkobG9nX2Jsb2NrcywgaSk7CisJCQlicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MsIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCS8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCisJbGxfcndfYmxvY2soUkVBRCwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBsb2dfYmxvY2tzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJd2FpdF9vbl9idWZmZXIobG9nX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGxvZ19ibG9ja3NbaV0pKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKKwkJCWJyZWxzZV9hcnJheShsb2dfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShyZWFsX2Jsb2Nrc1tpXS0+Yl9kYXRhLCBsb2dfYmxvY2tzW2ldLT5iX2RhdGEsCisJCSAgICAgICByZWFsX2Jsb2Nrc1tpXS0+Yl9zaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShyZWFsX2Jsb2Nrc1tpXSk7CisJCWJyZWxzZShsb2dfYmxvY2tzW2ldKTsKKwl9CisJLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLworCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQlzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKTsKKwkJbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQl3YWl0X29uX2J1ZmZlcihyZWFsX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHJlYWxfYmxvY2tzW2ldKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0xMjI2OiBSRVBMQVkgRkFJTFVSRSwgZnNjayByZXF1aXJlZCEgYnVmZmVyIHdyaXRlIGZhaWxlZCIpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWxzZShyZWFsX2Jsb2Nrc1tpXSk7CisJfQorCWN1cl9kYmxvY2sgPQorCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsKKwkgICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgImpvdXJuYWwtMTA5NTogc2V0dGluZyBqb3VybmFsICIgInN0YXJ0IHRvIG9mZnNldCAlbGQiLAorCQkgICAgICAgY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKworCS8qIGluaXQgc3RhcnRpbmcgdmFsdWVzIGZvciB0aGUgZmlyc3QgdHJhbnNhY3Rpb24sIGluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBiZSByZXBsYXllZC4gKi8KKwlqb3VybmFsLT5qX3N0YXJ0ID0gY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IHRyYW5zX2lkOworCWpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7CisJYnJlbHNlKGNfYmgpOworCWJyZWxzZShkX2JoKTsKKwlyZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLAorCQkgICAgICAgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJICAgICAgIHBfc19zYik7CisJcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsCisJCSAgICAgICBsZTMyX3RvX2NwdShkZXNjLT5qX2xlbikgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkgICAgICAgcF9zX3NiKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZWFkcyBibG9ja3Mgc3RhcnRpbmcgZnJvbSBibG9jayBhbmQgdG8gbWF4X2Jsb2NrIG9mIGJ1ZnNpemUKQEAgLTIwMTQsMzkgKzIyMjIsMzkgQEAKICAgIFJpZ2h0IG5vdyBpdCBpcyBvbmx5IHVzZWQgZnJvbSBqb3VybmFsIGNvZGUuIEJ1dCBsYXRlciB3ZSBtaWdodCB1c2UgaXQKICAgIGZyb20gb3RoZXIgcGxhY2VzLgogICAgTm90ZTogRG8gbm90IHVzZSBqb3VybmFsX2dldGJsay9zYl9nZXRibGsgZnVuY3Rpb25zIGhlcmUhICovCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVpc2VyZnNfYnJlYWRhIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywgaW50IGJ1ZnNpemUsCi0JCQkgICAgdW5zaWduZWQgaW50IG1heF9ibG9jaykKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlaXNlcmZzX2JyZWFkYShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywKKwkJCQkJICAgaW50IGJ1ZnNpemUsIHVuc2lnbmVkIGludCBtYXhfYmxvY2spCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhsaXN0W0JVRk5SXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJobGlzdFtCVUZOUl07CiAJdW5zaWduZWQgaW50IGJsb2NrcyA9IEJVRk5SOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGksIGo7Ci0JCi0JYmggPSBfX2dldGJsayAoZGV2LCBibG9jaywgYnVmc2l6ZSApOwotCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkKLQkJcmV0dXJuIChiaCk7ICAgCi0JCQorCisJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrLCBidWZzaXplKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIChiaCk7CisKIAlpZiAoYmxvY2sgKyBCVUZOUiA+IG1heF9ibG9jaykgewogCQlibG9ja3MgPSBtYXhfYmxvY2sgLSBibG9jazsKIAl9CiAJYmhsaXN0WzBdID0gYmg7CiAJaiA9IDE7CiAJZm9yIChpID0gMTsgaSA8IGJsb2NrczsgaSsrKSB7Ci0JCWJoID0gX19nZXRibGsgKGRldiwgYmxvY2sgKyBpLCBidWZzaXplKTsKLQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKSB7Ci0JCQlicmVsc2UgKGJoKTsKKwkJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrICsgaSwgYnVmc2l6ZSk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQlicmVsc2UoYmgpOwogCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBiaGxpc3RbaisrXSA9IGJoOworCQl9IGVsc2UKKwkJCWJobGlzdFtqKytdID0gYmg7CiAJfQotCWxsX3J3X2Jsb2NrIChSRUFELCBqLCBiaGxpc3QpOwotCWZvcihpID0gMTsgaSA8IGo7IGkrKykgCi0JCWJyZWxzZSAoYmhsaXN0W2ldKTsKKwlsbF9yd19ibG9jayhSRUFELCBqLCBiaGxpc3QpOworCWZvciAoaSA9IDE7IGkgPCBqOyBpKyspCisJCWJyZWxzZShiaGxpc3RbaV0pOwogCWJoID0gYmhsaXN0WzBdOwotCXdhaXRfb25fYnVmZmVyIChiaCk7Ci0JaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKQorCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJcmV0dXJuIGJoOwotCWJyZWxzZSAoYmgpOworCWJyZWxzZShiaCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTIwNTksMjE4ICsyMjY3LDI1MCBAQAogKioKICoqIE9uIGV4aXQsIGl0IHNldHMgdGhpbmdzIHVwIHNvIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5LgogKi8KLXN0YXRpYyBpbnQgam91cm5hbF9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkID0gMDsKLSAgdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDAgOwotICB0aW1lX3Qgc3RhcnQgOwotICB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgY3VyX2RibG9jayA9IDAgOwotICB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCA9IDkgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoIDsKLSAgaW50IHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMCA7Ci0gIGludCByZXBsYXlfY291bnQgPSAwIDsKLSAgaW50IGNvbnRpbnVlX3JlcGxheSA9IDEgOwotICBpbnQgcmV0IDsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworc3RhdGljIGludCBqb3VybmFsX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDA7CisJdGltZV90IHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2sgPSAwOworCXVuc2lnbmVkIGxvbmcgbmV3ZXN0X21vdW50X2lkID0gOTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlpbnQgdmFsaWRfam91cm5hbF9oZWFkZXIgPSAwOworCWludCByZXBsYXlfY291bnQgPSAwOworCWludCBjb250aW51ZV9yZXBsYXkgPSAxOworCWludCByZXQ7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7Ci0gIHJlaXNlcmZzX2luZm8gKHBfc19zYiwgImNoZWNraW5nIHRyYW5zYWN0aW9uIGxvZyAoJXMpXG4iLAotCSBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYikpOwotICBzdGFydCA9IGdldF9zZWNvbmRzKCk7CisJY3VyX2RibG9jayA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2luZm8ocF9zX3NiLCAiY2hlY2tpbmcgdHJhbnNhY3Rpb24gbG9nICglcylcbiIsCisJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CisJc3RhcnQgPSBnZXRfc2Vjb25kcygpOwogCi0gIC8qIHN0ZXAgMSwgcmVhZCBpbiB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2suICBDaGVjayB0aGUgdHJhbnNhY3Rpb24gaXQgc2F5cyAKLSAgKiogaXMgdGhlIGZpcnN0IHVuZmx1c2hlZCwgYW5kIGlmIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IHZhbGlkLCAKLSAgKiogcmVwbGF5IGlzIGRvbmUKLSAgKi8KLSAgam91cm5hbC0+al9oZWFkZXJfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKLSAgaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgewotICAgIHJldHVybiAxIDsKLSAgfQotICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOwotICBpZiAobGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgPj0gMCAmJiAKLSAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpICYmIAotICAgICAgbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgPiAwKSB7Ci0gICAgb2xkZXN0X3N0YXJ0ID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgOwotICAgIG9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBuZXdlc3RfbW91bnRfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9tb3VudF9pZCk7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMTUzOiBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgImhlYWRlcjogZmlyc3RfdW5mbHVzaGVkX29mZnNldCAlZCwgbGFzdF9mbHVzaGVkX3RyYW5zX2lkICIKLQkJICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAotCQkgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSkgOwotICAgIHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMSA7CisJLyogc3RlcCAxLCByZWFkIGluIHRoZSBqb3VybmFsIGhlYWRlciBibG9jay4gIENoZWNrIHRoZSB0cmFuc2FjdGlvbiBpdCBzYXlzIAorCSAqKiBpcyB0aGUgZmlyc3QgdW5mbHVzaGVkLCBhbmQgaWYgdGhhdCB0cmFuc2FjdGlvbiBpcyBub3QgdmFsaWQsIAorCSAqKiByZXBsYXkgaXMgZG9uZQorCSAqLworCWpvdXJuYWwtPmpfaGVhZGVyX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikKKwkJCQkJICAgICArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgeworCQlyZXR1cm4gMTsKKwl9CisJamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpOworCWlmIChsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA+PSAwICYmCisJICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwKKwkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpCisJICAgICYmIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpID4gMCkgeworCQlvbGRlc3Rfc3RhcnQgPQorCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCk7CisJCW9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKKwkJbmV3ZXN0X21vdW50X2lkID0gbGUzMl90b19jcHUoamgtPmpfbW91bnRfaWQpOworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkgICAgICAgImpvdXJuYWwtMTE1MzogZm91bmQgaW4gIgorCQkJICAgICAgICJoZWFkZXI6IGZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgJWQsIGxhc3RfZmx1c2hlZF90cmFuc19pZCAiCisJCQkgICAgICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKTsKKwkJdmFsaWRfam91cm5hbF9oZWFkZXIgPSAxOwogCi0gICAgLyogbm93LCB3ZSB0cnkgdG8gcmVhZCB0aGUgZmlyc3QgdW5mbHVzaGVkIG9mZnNldC4gIElmIGl0IGlzIG5vdCB2YWxpZCwgCi0gICAgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCi0gICAgKiogdGhyb3VnaCB0aGUgd2hvbGUgbG9nLgotICAgICovCi0gICAgZF9iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpKSA7Ci0gICAgcmV0ID0gam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsIE5VTEwsIE5VTEwpIDsKLSAgICBpZiAoIXJldCkgewotICAgICAgY29udGludWVfcmVwbGF5ID0gMCA7Ci0gICAgfQotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgZ290byBzdGFydF9sb2dfcmVwbGF5OwotICB9CisJCS8qIG5vdywgd2UgdHJ5IHRvIHJlYWQgdGhlIGZpcnN0IHVuZmx1c2hlZCBvZmZzZXQuICBJZiBpdCBpcyBub3QgdmFsaWQsIAorCQkgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCisJCSAqKiB0aHJvdWdoIHRoZSB3aG9sZSBsb2cuCisJCSAqLworCQlkX2JoID0KKwkJICAgIGpvdXJuYWxfYnJlYWQocF9zX3NiLAorCQkJCSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkpOworCQlyZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgTlVMTCwgTlVMTCk7CisJCWlmICghcmV0KSB7CisJCQljb250aW51ZV9yZXBsYXkgPSAwOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwkJZ290byBzdGFydF9sb2dfcmVwbGF5OworCX0KIAotICBpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwKLQkJICAgICAgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIikgOwotICAgIHJldHVybiAtMSA7Ci0gIH0KKwlpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIik7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCi0gICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KLSAgKi8KLSAgd2hpbGUoY29udGludWVfcmVwbGF5ICYmIGN1cl9kYmxvY2sgPCAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7Ci0gICAgLyogTm90ZSB0aGF0IGl0IGlzIHJlcXVpcmVkIGZvciBibG9ja3NpemUgb2YgcHJpbWFyeSBmcyBkZXZpY2UgYW5kIGpvdXJuYWwKLSAgICAgICBkZXZpY2UgdG8gYmUgdGhlIHNhbWUgKi8KLSAgICBkX2JoID0gcmVpc2VyZnNfYnJlYWRhKGpvdXJuYWwtPmpfZGV2X2JkLCBjdXJfZGJsb2NrLCBwX3Nfc2ItPnNfYmxvY2tzaXplLAotCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgICByZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCAmbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgaWYgKHJldCA9PSAxKSB7Ci0gICAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOwotICAgICAgaWYgKG9sZGVzdF9zdGFydCA9PSAwKSB7IC8qIGluaXQgYWxsIG9sZGVzdF8gdmFsdWVzICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCW5ld2VzdF9tb3VudF9pZCA9IGdldF9kZXNjX21vdW50X2lkKGRlc2MpIDsKLQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNzk6IFNldHRpbmcgIgotCSAgICAgICAgICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgICAgICBvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsgCi0gICAgICAgIC8qIG9uZSB3ZSBqdXN0IHJlYWQgd2FzIG9sZGVyICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE4MDogUmVzZXR0aW5nICIKLQkgICAgICAgICAgICAgICAib2xkZXN0X3N0YXJ0IHRvIG9mZnNldCAlbHUsIHRyYW5zX2lkICVsdSIsCi0JCQlvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCQlvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0KLSAgICAgIGlmIChuZXdlc3RfbW91bnRfaWQgPCBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgewotICAgICAgICBuZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKSA7CisJLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCisJICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KKwkgKi8KKwl3aGlsZSAoY29udGludWVfcmVwbGF5CisJICAgICAgICYmIGN1cl9kYmxvY2sgPAorCSAgICAgICAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7CisJCS8qIE5vdGUgdGhhdCBpdCBpcyByZXF1aXJlZCBmb3IgYmxvY2tzaXplIG9mIHByaW1hcnkgZnMgZGV2aWNlIGFuZCBqb3VybmFsCisJCSAgIGRldmljZSB0byBiZSB0aGUgc2FtZSAqLworCQlkX2JoID0KKwkJICAgIHJlaXNlcmZzX2JyZWFkYShqb3VybmFsLT5qX2Rldl9iZCwgY3VyX2RibG9jaywKKwkJCQkgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlyZXQgPQorCQkgICAgam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsCisJCQkJCQkgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQkJICZuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKWRfYmgtPmJfZGF0YTsKKwkJCWlmIChvbGRlc3Rfc3RhcnQgPT0gMCkgewkvKiBpbml0IGFsbCBvbGRlc3RfIHZhbHVlcyAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTc5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCisJCQkJCSAgICAgICBvbGRlc3Rfc3RhcnQgLQorCQkJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLCisJCQkJCSAgICAgICAocF9zX3NiKSwgb2xkZXN0X3RyYW5zX2lkKTsKKwkJCX0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsKKwkJCQkvKiBvbmUgd2UganVzdCByZWFkIHdhcyBvbGRlciAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTgwOiBSZXNldHRpbmcgIgorCQkJCQkgICAgICAgIm9sZGVzdF9zdGFydCB0byBvZmZzZXQgJWx1LCB0cmFuc19pZCAlbHUiLAorCQkJCQkgICAgICAgb2xkZXN0X3N0YXJ0IC0KKwkJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSworCQkJCQkgICAgICAgKHBfc19zYiksIG9sZGVzdF90cmFuc19pZCk7CisJCQl9CisJCQlpZiAobmV3ZXN0X21vdW50X2lkIDwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpIHsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMjk5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWQiLAorCQkJCQkgICAgICAgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCQkJfQorCQkJY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyOworCQl9IGVsc2UgeworCQkJY3VyX2RibG9jaysrOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwl9CisKKyAgICAgIHN0YXJ0X2xvZ19yZXBsYXk6CisJY3VyX2RibG9jayA9IG9sZGVzdF9zdGFydDsKKwlpZiAob2xkZXN0X3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMjA2OiBTdGFydGluZyByZXBsYXkgIgorCQkJICAgICAgICJmcm9tIG9mZnNldCAlbGx1LCB0cmFuc19pZCAlbHUiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpOworCisJfQorCXJlcGxheV9jb3VudCA9IDA7CisJd2hpbGUgKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7CisJCXJldCA9CisJCSAgICBqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24ocF9zX3NiLCBjdXJfZGJsb2NrLCBvbGRlc3Rfc3RhcnQsCisJCQkJCSAgICAgb2xkZXN0X3RyYW5zX2lkLCBuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChyZXQgIT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJY3VyX2RibG9jayA9CisJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQ7CisJCXJlcGxheV9jb3VudCsrOworCQlpZiAoY3VyX2RibG9jayA9PSBvbGRlc3Rfc3RhcnQpCisJCQlicmVhazsKKwl9CisKKwlpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIgInRyYW5zYWN0aW9ucyBmb3VuZCIpOworCX0KKwkvKiBqX3N0YXJ0IGRvZXMgbm90IGdldCBzZXQgY29ycmVjdGx5IGlmIHdlIGRvbid0IHJlcGxheSBhbnkgdHJhbnNhY3Rpb25zLgorCSAqKiBpZiB3ZSBoYWQgYSB2YWxpZCBqb3VybmFsX2hlYWRlciwgc2V0IGpfc3RhcnQgdG8gdGhlIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbiB2YWx1ZSwKKwkgKiogY29weSB0aGUgdHJhbnNfaWQgZnJvbSB0aGUgaGVhZGVyCisJICovCisJaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7CisJCWpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KTsKKwkJam91cm5hbC0+al90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSArIDE7CisJCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKTsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDE7CisJfQogCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0JICAgICAgICAgICAgICAibmV3ZXN0X21vdW50X2lkIHRvICVkIiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOwotICAgICAgfQotICAgICAgY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyIDsKLSAgICB9IGVsc2UgewotICAgICAgY3VyX2RibG9jaysrIDsKLSAgICB9Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgfQotCi1zdGFydF9sb2dfcmVwbGF5OgotICBjdXJfZGJsb2NrID0gb2xkZXN0X3N0YXJ0IDsKLSAgaWYgKG9sZGVzdF90cmFuc19pZCkgIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMDY6IFN0YXJ0aW5nIHJlcGxheSAiCi0gICAgICAgICAgICAgICAgICAgImZyb20gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgIG9sZGVzdF90cmFuc19pZCkgOwotCi0gIH0KLSAgcmVwbGF5X2NvdW50ID0gMCA7Ci0gIHdoaWxlKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7Ci0gICAgcmV0ID0gam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHBfc19zYiwgY3VyX2RibG9jaywgb2xkZXN0X3N0YXJ0LCBvbGRlc3RfdHJhbnNfaWQsIG5ld2VzdF9tb3VudF9pZCkgOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICByZXR1cm4gcmV0IDsKLSAgICB9IGVsc2UgaWYgKHJldCAhPSAwKSB7Ci0gICAgICBicmVhayA7Ci0gICAgfQotICAgIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQgOwotICAgIHJlcGxheV9jb3VudCsrIDsKLSAgIGlmIChjdXJfZGJsb2NrID09IG9sZGVzdF9zdGFydCkKLSAgICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb25zIGZvdW5kIikgOwotICB9Ci0gIC8qIGpfc3RhcnQgZG9lcyBub3QgZ2V0IHNldCBjb3JyZWN0bHkgaWYgd2UgZG9uJ3QgcmVwbGF5IGFueSB0cmFuc2FjdGlvbnMuCi0gICoqIGlmIHdlIGhhZCBhIHZhbGlkIGpvdXJuYWxfaGVhZGVyLCBzZXQgal9zdGFydCB0byB0aGUgZmlyc3QgdW5mbHVzaGVkIHRyYW5zYWN0aW9uIHZhbHVlLAotICAqKiBjb3B5IHRoZSB0cmFuc19pZCBmcm9tIHRoZSBoZWFkZXIKLSAgKi8KLSAgaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7IAotICAgIGpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA7Ci0gICAgam91cm5hbC0+al90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSA7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDEgOwotICB9Ci0gIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0gICAgICAgICAgICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWx1Iiwgam91cm5hbC0+al9tb3VudF9pZCkgOwotICBqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgaWYgKHJlcGxheV9jb3VudCA+IDApIHsKLSAgICByZWlzZXJmc19pbmZvIChwX3Nfc2IsICJyZXBsYXllZCAlZCB0cmFuc2FjdGlvbnMgaW4gJWx1IHNlY29uZHNcbiIsCi0JCSAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KSA7Ci0gIH0KLSAgaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYgCi0gICAgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkpCi0gIHsKLSAgICAgIC8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKLSAgICAgICoqIHRoZSBtb3VudAotICAgICAgKi8KLSAgICAgIHJldHVybiAtMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworCQkgICAgICAgIm5ld2VzdF9tb3VudF9pZCB0byAlbHUiLCBqb3VybmFsLT5qX21vdW50X2lkKTsKKwlqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWlmIChyZXBsYXlfY291bnQgPiAwKSB7CisJCXJlaXNlcmZzX2luZm8ocF9zX3NiLAorCQkJICAgICAgInJlcGxheWVkICVkIHRyYW5zYWN0aW9ucyBpbiAlbHUgc2Vjb25kc1xuIiwKKwkJCSAgICAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KTsKKwl9CisJaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYKKwkgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCisJCQkJCSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKSB7CisJCS8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKKwkJICoqIHRoZSBtb3VudAorCQkgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmFsbG9jX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci1yZXRyeToKLSAgICBqbCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBHRlBfTk9GUywgcyk7Ci0gICAgaWYgKCFqbCkgewotCXlpZWxkKCk7Ci0JZ290byByZXRyeTsKLSAgICB9Ci0gICAgbWVtc2V0KGpsLCAwLCBzaXplb2YoKmpsKSk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al93b3JraW5nX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al9iaF9saXN0KTsKLSAgICBzZW1hX2luaXQoJmpsLT5qX2NvbW1pdF9sb2NrLCAxKTsKLSAgICBTQl9KT1VSTkFMKHMpLT5qX251bV9saXN0cysrOwotICAgIGdldF9qb3VybmFsX2xpc3QoamwpOwotICAgIHJldHVybiBqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgICAgIHJldHJ5OgorCWpsID0gcmVpc2VyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIEdGUF9OT0ZTLAorCQkJICAgICAgcyk7CisJaWYgKCFqbCkgeworCQl5aWVsZCgpOworCQlnb3RvIHJldHJ5OworCX0KKwltZW1zZXQoamwsIDAsIHNpemVvZigqamwpKTsKKwlJTklUX0xJU1RfSEVBRCgmamwtPmpfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3RhaWxfYmhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2JoX2xpc3QpOworCXNlbWFfaW5pdCgmamwtPmpfY29tbWl0X2xvY2ssIDEpOworCVNCX0pPVVJOQUwocyktPmpfbnVtX2xpc3RzKys7CisJZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisJcmV0dXJuIGpsOwogfQogCi1zdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICAgIFNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCApCitzdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9IDA7Ci0KLSAgICBpZiggam91cm5hbCAtPiBqX2Rldl9maWxlICE9IE5VTEwgKSB7Ci0JcmVzdWx0ID0gZmlscF9jbG9zZSggam91cm5hbCAtPiBqX2Rldl9maWxlLCBOVUxMICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKLSAgICB9IGVsc2UgaWYoIGpvdXJuYWwgLT4gal9kZXZfYmQgIT0gTlVMTCApIHsKLQlyZXN1bHQgPSBibGtkZXZfcHV0KCBqb3VybmFsIC0+IGpfZGV2X2JkICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9iZCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIHJlc3VsdCAhPSAwICkgewotCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsICJzaC00NTc6IHJlbGVhc2Vfam91cm5hbF9kZXY6IENhbm5vdCByZWxlYXNlIGpvdXJuYWwgZGV2aWNlOiAlaSIsIHJlc3VsdCApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworCVNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7CiB9CiAKLXN0YXRpYyBpbnQgam91cm5hbF9pbml0X2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwgCi0JCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsLCAKLQkJCSAgICAgY29uc3QgY2hhciAqamRldl9uYW1lICkKK3N0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKGpvdXJuYWwtPmpfZGV2X2ZpbGUgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBmaWxwX2Nsb3NlKGpvdXJuYWwtPmpfZGV2X2ZpbGUsIE5VTEwpOworCQlqb3VybmFsLT5qX2Rldl9maWxlID0gTlVMTDsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9kZXZfYmQgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBibGtkZXZfcHV0KGpvdXJuYWwtPmpfZGV2X2JkKTsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0KKworCWlmIChyZXN1bHQgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLAorCQkJCSAic2gtNDU3OiByZWxlYXNlX2pvdXJuYWxfZGV2OiBDYW5ub3QgcmVsZWFzZSBqb3VybmFsIGRldmljZTogJWkiLAorCQkJCSByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfaW5pdF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCwKKwkJCSAgICBjb25zdCBjaGFyICpqZGV2X25hbWUpCiB7CiAJaW50IHJlc3VsdDsKIAlkZXZfdCBqZGV2OwpAQCAtMjI3OSw1MCArMjUxOSw1MSBAQAogCiAJcmVzdWx0ID0gMDsKIAotCWpvdXJuYWwgLT4gal9kZXZfYmQgPSBOVUxMOwotCWpvdXJuYWwgLT4gal9kZXZfZmlsZSA9IE5VTEw7Ci0JamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRSggc3VwZXIgKSA/Ci0JCW5ld19kZWNvZGVfZGV2KFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikpIDogc3VwZXItPnNfZGV2OwkKKwlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7CisJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikgPworCSAgICBuZXdfZGVjb2RlX2RldihTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0Uoc3VwZXIpKSA6IHN1cGVyLT5zX2RldjsKIAogCWlmIChiZGV2X3JlYWRfb25seShzdXBlci0+c19iZGV2KSkKLQkgICAgYmxrZGV2X21vZGUgPSBGTU9ERV9SRUFEOworCQlibGtkZXZfbW9kZSA9IEZNT0RFX1JFQUQ7CiAKIAkvKiB0aGVyZSBpcyBubyAiamRldiIgb3B0aW9uIGFuZCBqb3VybmFsIGlzIG9uIHNlcGFyYXRlIGRldmljZSAqLwotCWlmKCAoICFqZGV2X25hbWUgfHwgIWpkZXZfbmFtZVsgMCBdICkgKSB7CisJaWYgKCghamRldl9uYW1lIHx8ICFqZGV2X25hbWVbMF0pKSB7CiAJCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9ieV9kZXZudW0oamRldiwgYmxrZGV2X21vZGUpOwogCQlpZiAoSVNfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKSkgewogCQkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9iZCk7CiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7Ci0JCQlyZWlzZXJmc193YXJuaW5nIChzdXBlciwgInNoLTQ1ODogam91cm5hbF9pbml0X2RldjogIgotCQkJCQkgICJjYW5ub3QgaW5pdCBqb3VybmFsIGRldmljZSAnJXMnOiAlaSIsCi0JCQkJCSAgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0ICk7CisJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAic2gtNDU4OiBqb3VybmFsX2luaXRfZGV2OiAiCisJCQkJCSAiY2Fubm90IGluaXQgam91cm5hbCBkZXZpY2UgJyVzJzogJWkiLAorCQkJCQkgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0KTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0gZWxzZSBpZiAoamRldiAhPSBzdXBlci0+c19kZXYpCiAJCQlzZXRfYmxvY2tzaXplKGpvdXJuYWwtPmpfZGV2X2JkLCBzdXBlci0+c19ibG9ja3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBmaWxwX29wZW4oIGpkZXZfbmFtZSwgMCwgMCApOwotCWlmKCAhSVNfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKSApIHsKKwlqb3VybmFsLT5qX2Rldl9maWxlID0gZmlscF9vcGVuKGpkZXZfbmFtZSwgMCwgMCk7CisJaWYgKCFJU19FUlIoam91cm5hbC0+al9kZXZfZmlsZSkpIHsKIAkJc3RydWN0IGlub2RlICpqZGV2X2lub2RlID0gam91cm5hbC0+al9kZXZfZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCQlpZiggIVNfSVNCTEsoIGpkZXZfaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCWlmICghU19JU0JMSyhqZGV2X2lub2RlLT5pX21vZGUpKSB7CiAJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAiam91cm5hbF9pbml0X2RldjogJyVzJyBpcyAiCi0JCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lICk7CisJCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lKTsKIAkJCXJlc3VsdCA9IC1FTk9UQkxLOwotCQkJcmVsZWFzZV9qb3VybmFsX2Rldiggc3VwZXIsIGpvdXJuYWwgKTsKLQkJfSBlbHNlICB7CisJCQlyZWxlYXNlX2pvdXJuYWxfZGV2KHN1cGVyLCBqb3VybmFsKTsKKwkJfSBlbHNlIHsKIAkJCS8qIG9rICovCiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IElfQkRFVihqZGV2X2lub2RlKTsKIAkJCXNldF9ibG9ja3NpemUoam91cm5hbC0+al9kZXZfYmQsIHN1cGVyLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQlyZWlzZXJmc19pbmZvKHN1cGVyLCAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAorCQkJcmVpc2VyZnNfaW5mbyhzdXBlciwKKwkJCQkgICAgICAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAogCQkJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CiAJCX0KIAl9IGVsc2UgewotCQlyZXN1bHQgPSBQVFJfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKTsKLQkJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQkJcmVpc2VyZnNfd2FybmluZyAoc3VwZXIsCi0JCQkJICAiam91cm5hbF9pbml0X2RldjogQ2Fubm90IG9wZW4gJyVzJzogJWkiLAotCQkJCSAgamRldl9uYW1lLCByZXN1bHQgKTsKKwkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9maWxlKTsKKwkJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsCisJCQkJICJqb3VybmFsX2luaXRfZGV2OiBDYW5ub3Qgb3BlbiAnJXMnOiAlaSIsCisJCQkJIGpkZXZfbmFtZSwgcmVzdWx0KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIzMzAsMTkzICsyNTcxLDIxNCBAQAogLyoKICoqIG11c3QgYmUgY2FsbGVkIG9uY2Ugb24gZnMgbW91bnQuICBjYWxscyBqb3VybmFsX3JlYWQgZm9yIHlvdQogKi8KLWludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IGNoYXIgKiBqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlKSB7Ci0gICAgaW50IG51bV9jbm9kZXMgPSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgKiAyIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoamg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CitpbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBjb25zdCBjaGFyICpqX2Rldl9uYW1lLAorCQkgaW50IG9sZF9mb3JtYXQsIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSkKK3sKKwlpbnQgbnVtX2Nub2RlcyA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAqIDI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaGpoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLSAgICBqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpID0gdm1hbGxvYyhzaXplb2YgKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSkgOwotICAgIGlmICgham91cm5hbCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTI1NjogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGpvdXJuYWwgc3RydWN0dXJlIikgOwotCXJldHVybiAxIDsKLSAgICB9Ci0gICAgbWVtc2V0KGpvdXJuYWwsIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCkpIDsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKLSAgICBJTklUX0xJU1RfSEVBRCAoJmpvdXJuYWwtPmpfcHJlYWxsb2NfbGlzdCk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpOwotICAgIGpvdXJuYWwtPmpfcGVyc2lzdGVudF90cmFucyA9IDA7Ci0gICAgaWYgKHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhwX3Nfc2IsCi0JCQkJICAgICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAsCi0gCQkJCSAgICAgICBTQl9CTUFQX05SKHBfc19zYikpKQotCWdvdG8gZnJlZV9hbmRfcmV0dXJuIDsKLSAgICBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKSA7CisJam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMjU2OiB1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3Igam91cm5hbCBzdHJ1Y3R1cmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChqb3VybmFsLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwpKTsKKwlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3ByZWFsbG9jX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlqb3VybmFsLT5qX3BlcnNpc3RlbnRfdHJhbnMgPSAwOworCWlmIChyZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMocF9zX3NiLAorCQkJCQkgICBqb3VybmFsLT5qX2xpc3RfYml0bWFwLAorCQkJCQkgICBTQl9CTUFQX05SKHBfc19zYikpKQorCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwlhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKTsKIAotICAgIC8qIHJlc2VydmVkIGZvciBqb3VybmFsIGFyZWEgc3VwcG9ydCAqLwotICAgIFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgPSAob2xkX2Zvcm1hdCA/Ci0JCQkJCSAgICAgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCi0JCQkJCSAgICAgU0JfQk1BUF9OUihwX3Nfc2IpICsgMSA6Ci0JCQkJCSAgICAgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgLyBwX3Nfc2ItPnNfYmxvY2tzaXplICsgMik7IAotICAgIAotICAgIC8qIFNhbml0eSBjaGVjayB0byBzZWUgaXMgdGhlIHN0YW5kYXJkIGpvdXJuYWwgZml0dGluZyB3aXRoaW5nIGZpcnN0IGJpdG1hcAotICAgICAgIChhY3R1YWwgZm9yIHNtYWxsIGJsb2Nrc2l6ZXMpICovCi0gICAgaWYgKCAhU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKCBwX3Nfc2IgKSAmJgotICAgICAgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgPiBwX3Nfc2ItPnNfYmxvY2tzaXplICogOCkgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCi0JCQkgICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKLQkJCSAgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAotCQkJICBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAotCQkJICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksIHBfc19zYi0+c19ibG9ja3NpemUpOwotCWdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiByZXNlcnZlZCBmb3Igam91cm5hbCBhcmVhIHN1cHBvcnQgKi8KKwlTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpID0gKG9sZF9mb3JtYXQgPworCQkJCQkJIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUworCQkJCQkJIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCisJCQkJCQkgU0JfQk1BUF9OUihwX3Nfc2IpICsKKwkJCQkJCSAxIDoKKwkJCQkJCSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvCisJCQkJCQkgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIDIpOwogCi0gICAgaWYoIGpvdXJuYWxfaW5pdF9kZXYoIHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSApICE9IDAgKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvcm5hbCBkZXZpY2UiKTsKLSAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiBTYW5pdHkgY2hlY2sgdG8gc2VlIGlzIHRoZSBzdGFuZGFyZCBqb3VybmFsIGZpdHRpbmcgd2l0aGluZyBmaXJzdCBiaXRtYXAKKwkgICAoYWN0dWFsIGZvciBzbWFsbCBibG9ja3NpemVzKSAqLworCWlmICghU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKHBfc19zYikgJiYKKwkgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKworCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpID4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAqIDgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCisJCQkJICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKKwkJCQkgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAorCQkJCSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAorCQkJCSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksCisJCQkJIHBfc19zYi0+c19ibG9ja3NpemUpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHBfc19zYik7Ci0gICAgIAotICAgICAvKiByZWFkIGpvdXJuYWwgaGVhZGVyICovCi0gICAgIGJoamggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgICBpZiAoIWJoamgpIHsKLQkgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDU5OiB1bmFibGUgdG8gcmVhZCBqb3VybmFsIGhlYWRlciIpOwotCSBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgICAgfQotICAgICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKLSAgICAgCi0gICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KLSAgICAgaWYgKGlzX3JlaXNlcmZzX2pyKHJzKSAmJiAobGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYykgIT0gc2JfanBfam91cm5hbF9tYWdpYyhycykpKSB7Ci0JIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MDogam91cm5hbCBoZWFkZXIgbWFnaWMgJXggIgotCQkJICAgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKLQkJCSAgICJibG9jayAleCIsCi0JCQkgICBqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljLAotCQkJICAgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJCSAgIHNiX2pwX2pvdXJuYWxfbWFnaWMocnMpKTsKLQkgYnJlbHNlIChiaGpoKTsKLQkgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgICAgCi0gIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBsZTMyX3RvX2NwdSAoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOwotICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gbGUzMl90b19jcHUgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfbWF4X2JhdGNoKTsKLSAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGxlMzJfdG9fY3B1IChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKLSAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gSk9VUk5BTF9NQVhfVFJBTlNfQUdFOworCWlmIChqb3VybmFsX2luaXRfZGV2KHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSkgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgInNoLTQ2MjogdW5hYmxlIHRvIGluaXRpYWxpemUgam9ybmFsIGRldmljZSIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7Ci0gICAgLyogbWFrZSBzdXJlIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgYXNzaWduIGl0IGlmIHRoZXkgYXJlIG5vdCAqLwotICAgIF9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKLSAgICBfX3UzMiByYXRpbyA9IDE7Ci0gICAgCi0gICAgaWYgKHBfc19zYi0+c19ibG9ja3NpemUgPCA0MDk2KQotICAgICAgcmF0aW8gPSA0MDk2IC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKLSAgICAKLSAgICBpZiAoU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpL2pvdXJuYWwtPmpfdHJhbnNfbWF4IDwgSk9VUk5BTF9NSU5fUkFUSU8pCi0gICAgICBqb3VybmFsLT5qX3RyYW5zX21heCA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA+IEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA8IEpPVVJOQUxfVFJBTlNfTUlOX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwotICAgIAotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAotCSAgICAgIGluaXRpYWwsIGpvdXJuYWwtPmpfdHJhbnNfbWF4KTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socF9zX3NiKTsKIAotICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoID0gam91cm5hbC0+al90cmFuc19tYXgqCi0gICAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUL0pPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQ7Ci0gIH0gIAotICAKLSAgaWYgKCFqb3VybmFsLT5qX3RyYW5zX21heCkgewotICAgIC8qd2UgaGF2ZSB0aGUgZmlsZSBzeXN0ZW0gd2FzIGNyZWF0ZWQgYnkgb2xkIHZlcnNpb24gb2YgbWtyZWlzZXJmcyAKLSAgICAgIHNvIHRoaXMgZmllbGQgY29udGFpbnMgemVybyB2YWx1ZSAqLwotICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIDsKLSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVCA7Ci0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgOwotICAgIAotICAgIC8qIGZvciBibG9ja3NpemUgPj0gNDA5NiAtIG1heCB0cmFuc2FjdGlvbiBzaXplIGlzIDEwMjQuIEZvciBibG9jayBzaXplIDwgNDA5NgotICAgICAgIHRyYW5zIG1heCBzaXplIGlzIGRlY3JlYXNlZCBwcm9wb3J0aW9uYWxseSAqLwotICAgIGlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgewotICAgICAgam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7Ci0gICAgICBqb3VybmFsLT5qX21heF9iYXRjaCA9IChqb3VybmFsLT5qX3RyYW5zX21heCkgKiA5IC8gMTAgOwotICAgIH0KLSAgfQorCS8qIHJlYWQgam91cm5hbCBoZWFkZXIgKi8KKwliaGpoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKKwlpZiAoIWJoamgpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NTk6IHVuYWJsZSB0byByZWFkIGpvdXJuYWwgaGVhZGVyIik7CisJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCX0KKwlqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKIAotICBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX21heF9jb21taXRfYWdlOworCS8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KKwlpZiAoaXNfcmVpc2VyZnNfanIocnMpCisJICAgICYmIChsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljKSAhPQorCQlzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NjA6IGpvdXJuYWwgaGVhZGVyIG1hZ2ljICV4ICIKKwkJCQkgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKKwkJCQkgImJsb2NrICV4IiwgamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYywKKwkJCQkgYmRldm5hbWUoam91cm5hbC0+al9kZXZfYmQsIGIpLAorCQkJCSBzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSk7CisJCWJyZWxzZShiaGpoKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQogCi0gIGlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7Ci0gICAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7Ci0gICAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQorCWpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYXhfYmF0Y2gpOworCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPQorCSAgICBsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKKwlqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7CiAKLSAgcmVpc2VyZnNfaW5mbyAocF9zX3NiLCAiam91cm5hbCBwYXJhbXM6IGRldmljZSAlcywgc2l6ZSAldSwgIgotCQkgImpvdXJuYWwgZmlyc3QgYmxvY2sgJXUsIG1heCB0cmFucyBsZW4gJXUsIG1heCBiYXRjaCAldSwgIgotCQkgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAotCQkgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAotCQkgam91cm5hbC0+al90cmFuc19tYXgsCi0JCSBqb3VybmFsLT5qX21heF9iYXRjaCwKLQkJIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UsCi0JCSBqb3VybmFsLT5qX21heF90cmFuc19hZ2UpOworCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCkgeworCQkvKiBtYWtlIHN1cmUgdGhlc2UgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCBhc3NpZ24gaXQgaWYgdGhleSBhcmUgbm90ICovCisJCV9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKKwkJX191MzIgcmF0aW8gPSAxOwogCi0gIGJyZWxzZSAoYmhqaCk7Ci0gICAgIAotICBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gMCA7Ci0gIGpvdXJuYWxfbGlzdF9pbml0KHBfc19zYikgOworCQlpZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8IDQwOTYpCisJCQlyYXRpbyA9IDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplOwogCi0gIG1lbXNldChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgMCwgSk9VUk5BTF9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikpIDsKKwkJaWYgKFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIGpvdXJuYWwtPmpfdHJhbnNfbWF4IDwKKwkJICAgIEpPVVJOQUxfTUlOX1JBVElPKQorCQkJam91cm5hbC0+al90cmFuc19tYXggPQorCQkJICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPiBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPCBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwogCi0gIElOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpIDsKLSAgc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQorCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAorCQkJCQkgaW5pdGlhbCwgam91cm5hbC0+al90cmFuc19tYXgpOwogCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSAwIDsKLSAgam91cm5hbC0+al9sZW4gPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9hc3luY190aHJvdHRsZSksIDApIDsKLSAgam91cm5hbC0+al9iY291bnQgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMCA7Ci0gIGpvdXJuYWwtPmpfbGFzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTCA7Ci0gIGluaXRfd2FpdHF1ZXVlX2hlYWQoJihqb3VybmFsLT5qX2pvaW5fd2FpdCkpIDsKLSAgc2VtYV9pbml0KCZqb3VybmFsLT5qX2xvY2ssIDEpOwotICBzZW1hX2luaXQoJmpvdXJuYWwtPmpfZmx1c2hfc2VtLCAxKTsKKwkJam91cm5hbC0+al9tYXhfYmF0Y2ggPSBqb3VybmFsLT5qX3RyYW5zX21heCAqCisJCSAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUIC8gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVDsKKwl9CiAKLSAgam91cm5hbC0+al90cmFuc19pZCA9IDEwIDsKLSAgam91cm5hbC0+al9tb3VudF9pZCA9IDEwIDsKLSAgam91cm5hbC0+al9zdGF0ZSA9IDAgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2RlcykgOwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPyBudW1fY25vZGVzIDogMCA7Ci0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDAgOwotICBqb3VybmFsLT5qX211c3Rfd2FpdCA9IDAgOworCWlmICgham91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJLyp3ZSBoYXZlIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCBieSBvbGQgdmVyc2lvbiBvZiBta3JlaXNlcmZzIAorCQkgICBzbyB0aGlzIGZpZWxkIGNvbnRhaW5zIHplcm8gdmFsdWUgKi8KKwkJam91cm5hbC0+al90cmFuc19tYXggPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUOworCQlqb3VybmFsLT5qX21heF9iYXRjaCA9IEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQ7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBKT1VSTkFMX01BWF9DT01NSVRfQUdFOwogCi0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKLSAgamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqbCk7Ci0gIGlmICghamwtPmpfbGlzdF9iaXRtYXApIHsKLSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMjAwNSwgZ2V0X2xpc3RfYml0bWFwIGZhaWxlZCBmb3Igam91cm5hbCBsaXN0IDAiKSA7Ci0gICAgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiUmVwbGF5IEZhaWx1cmUsIHVuYWJsZSB0byBtb3VudCIpIDsKLSAgICBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgfQorCQkvKiBmb3IgYmxvY2tzaXplID49IDQwOTYgLSBtYXggdHJhbnNhY3Rpb24gc2l6ZSBpcyAxMDI0LiBGb3IgYmxvY2sgc2l6ZSA8IDQwOTYKKwkJICAgdHJhbnMgbWF4IHNpemUgaXMgZGVjcmVhc2VkIHByb3BvcnRpb25hbGx5ICovCisJCWlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgeworCQkJam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwkJCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSAqIDkgLyAxMDsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KysgOwotICBpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKQotICAgIGNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisJam91cm5hbC0+al9kZWZhdWx0X21heF9jb21taXRfYWdlID0gam91cm5hbC0+al9tYXhfY29tbWl0X2FnZTsKIAotICBJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKLSAgcmV0dXJuIDAgOwotZnJlZV9hbmRfcmV0dXJuOgotICBmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7Ci0gIHJldHVybiAxOworCWlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKKwkJam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gY29tbWl0X21heF9hZ2U7CisJfQorCisJcmVpc2VyZnNfaW5mbyhwX3Nfc2IsICJqb3VybmFsIHBhcmFtczogZGV2aWNlICVzLCBzaXplICV1LCAiCisJCSAgICAgICJqb3VybmFsIGZpcnN0IGJsb2NrICV1LCBtYXggdHJhbnMgbGVuICV1LCBtYXggYmF0Y2ggJXUsICIKKwkJICAgICAgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAorCQkgICAgICBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYiksCisJCSAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKKwkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4LAorCQkgICAgICBqb3VybmFsLT5qX21heF9iYXRjaCwKKwkJICAgICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSwgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKTsKKworCWJyZWxzZShiaGpoKTsKKworCWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAwOworCWpvdXJuYWxfbGlzdF9pbml0KHBfc19zYik7CisKKwltZW1zZXQoam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIDAsCisJICAgICAgIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKTsKKworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisKKwlqb3VybmFsLT5qX3N0YXJ0ID0gMDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX3djb3VudCksIDApOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKSwgMCk7CisJam91cm5hbC0+al9iY291bnQgPSAwOworCWpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoam91cm5hbC0+al9qb2luX3dhaXQpKTsKKwlzZW1hX2luaXQoJmpvdXJuYWwtPmpfbG9jaywgMSk7CisJc2VtYV9pbml0KCZqb3VybmFsLT5qX2ZsdXNoX3NlbSwgMSk7CisKKwlqb3VybmFsLT5qX3RyYW5zX2lkID0gMTA7CisJam91cm5hbC0+al9tb3VudF9pZCA9IDEwOworCWpvdXJuYWwtPmpfc3RhdGUgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwgMCk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2Rlcyk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX29yaWcgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdDsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA/IG51bV9jbm9kZXMgOiAwOworCWpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDA7CisJam91cm5hbC0+al9tdXN0X3dhaXQgPSAwOworCisJaW5pdF9qb3VybmFsX2hhc2gocF9zX3NiKTsKKwlqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwlqbC0+al9saXN0X2JpdG1hcCA9IGdldF9saXN0X2JpdG1hcChwX3Nfc2IsIGpsKTsKKwlpZiAoIWpsLT5qX2xpc3RfYml0bWFwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0yMDA1LCBnZXRfbGlzdF9iaXRtYXAgZmFpbGVkIGZvciBqb3VybmFsIGxpc3QgMCIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CisJaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJlcGxheSBGYWlsdXJlLCB1bmFibGUgdG8gbW91bnQiKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQorCisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCsrOworCWlmIChyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50IDw9IDEpCisJCWNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisKKwlJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKKwlyZXR1cm4gMDsKKyAgICAgIGZyZWVfYW5kX3JldHVybjoKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0yNTI0LDk2ICsyNzg2LDEwMiBAQAogKiogYmUgdXNlZCBieSBkZWxldGUgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3Qgd3JpdGUgbW9yZSB0aGFuIGNhbiBmaXQgaW5zaWRlIGEgc2luZ2xlCiAqKiB0cmFuc2FjdGlvbgogKi8KLWludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIGludCBuZXdfYWxsb2MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMICh0aC0+dF9zdXBlcik7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgLyogY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCi0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkKLSAgICByZXR1cm4gMCA7Ci0gIGlmICggam91cm5hbC0+al9tdXN0X3dhaXQgPiAwIHx8Ci0gICAgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAotICAgICAgIGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpIHx8Ci0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAotICAgICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIHJldHVybiAwIDsKK2ludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICAgaW50IG5ld19hbGxvYykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwodGgtPnRfc3VwZXIpOworCXRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDEpCisJCXJldHVybiAwOworCWlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDAgfHwKKwkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAorCSAgICBhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSB8fAorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAorCSAgICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgdHJhbnNhY3Rpb24sIGFuZCByZXF1aXJlcyB0aGUgCiAqKiBrZXJuZWxfbG9jayB0byBiZSBoZWxkCiAqLwotdm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHRoLT50X3N1cGVyKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAxIDsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkgOwotICAgIHJldHVybiA7Ci19Ci0KLS8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGFuZCBkb2VzIG5vdAotKiogcmVxdWlyZSBCS0wKLSovCi12b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGNsZWFyX2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpIDsKLSAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCkgOwotfQotCi0vKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKLSoqIHJlcXVpcmUgQktMCi0qLwotdm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKLSAgICAgICAgICAgICAgICF0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSA7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2xvZ193cml0ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gICAgd2FpdF9xdWV1ZV90IHdhaXQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKTsKLQotICAgIC8qCi0gICAgICogd2UgZG9uJ3Qgd2FudCB0byB1c2Ugd2FpdF9ldmVudCBoZXJlIGJlY2F1c2UKLSAgICAgKiB3ZSBvbmx5IHdhbnQgdG8gd2FpdCBvbmNlLgotICAgICAqLwotICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLSAgICBhZGRfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0gICAgaWYgKHRlc3RfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgc2NoZWR1bGUoKTsKLSAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgd2FrZV9xdWV1ZWRfd3JpdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxldF90cmFuc2FjdGlvbl9ncm93KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKQordm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgdW5zaWduZWQgbG9uZyBiY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKLSAgICB3aGlsZSgxKSB7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHRoLT50X3N1cGVyKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDE7CisJc2V0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOworCXJldHVybjsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGEgdHJhbnNhY3Rpb24gc3RhcnRlZCwgYW5kIGRvZXMgbm90CisqKiByZXF1aXJlIEJLTAorKi8KK3ZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2xlYXJfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmam91cm5hbC0+al9qb2luX3dhaXQpOworfQorCisvKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKKyoqIHJlcXVpcmUgQktMCisqLwordm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKKwkJICAgIXRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJc2V0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisKKwkvKgorCSAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIHdhaXRfZXZlbnQgaGVyZSBiZWNhdXNlCisJICogd2Ugb25seSB3YW50IHRvIHdhaXQgb25jZS4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0Jam91cm5hbC0+al9jdXJyZW50X2psLT5qX3N0YXRlIHw9IExJU1RfQ09NTUlUX1BFTkRJTkc7Ci0gICAgICAgIHdoaWxlICgoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDAgfHwKLQkgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgJiYKLQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlzY2hlZHVsZSgpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOworfQorCitzdGF0aWMgdm9pZCB3YWtlX3F1ZXVlZF93cml0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXdha2VfdXAoJmpvdXJuYWwtPmpfam9pbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbGV0X3RyYW5zYWN0aW9uX2dyb3coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwoc2IpOworCXVuc2lnbmVkIGxvbmcgYmNvdW50ID0gam91cm5hbC0+al9iY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfc3RhdGUgfD0gTElTVF9DT01NSVRfUEVORElORzsKKwkJd2hpbGUgKChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCB8fAorCQkJYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSAmJgorCQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworCQkJcXVldWVfbG9nX3dyaXRlcihzYik7CisJCX0KKwkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCisJCQlicmVhazsKKwkJaWYgKGJjb3VudCA9PSBqb3VybmFsLT5qX2Jjb3VudCkKKwkJCWJyZWFrOworCQliY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKIAl9Ci0JaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCi0JICAgIGJyZWFrOwotCWlmIChiY291bnQgPT0gam91cm5hbC0+al9iY291bnQpCi0JICAgIGJyZWFrOwotCWJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OwotICAgIH0KIH0KIAogLyogam9pbiA9PSB0cnVlIGlmIHlvdSBtdXN0IGpvaW4gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uCkBAIC0yNjIyLDIyMyArMjg5MCwyNDQgQEAKICoqIHRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgam9pbmFibGUuICBzZW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIHlvdQogKiogZXhwZWN0IHRvIHVzZSBpbiBuYmxvY2tzLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKSB7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgaW50IG9sZF90cmFuc19pZCAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOwotICBpbnQgc2NoZWRfY291bnQgPSAwOwotICBpbnQgcmV0dmFsOworc3RhdGljIGludCBkb19qb3VybmFsX2JlZ2luX3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzLAorCQkJICAgICAgaW50IGpvaW4pCit7CisJdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CisJaW50IG9sZF90cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIG15dGg7CisJaW50IHNjaGVkX2NvdW50ID0gMDsKKwlpbnQgcmV0dmFsOwogCi0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbF9iZWdpbiIpIDsKLSAgaWYgKG5ibG9ja3MgPiBqb3VybmFsLT5qX3RyYW5zX21heCkKLQlCVUcoKTsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWxfYmVnaW4iKTsKKwlpZiAobmJsb2NrcyA+IGpvdXJuYWwtPmpfdHJhbnNfbWF4KQorCQlCVUcoKTsKIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9iZWluZyApOwotICAvKiBzZXQgaGVyZSBmb3Igam91cm5hbF9qb2luICovCi0gIHRoLT50X3JlZmNvdW50ID0gMTsKLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2IgOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfYmVpbmcpOworCS8qIHNldCBoZXJlIGZvciBqb3VybmFsX2pvaW4gKi8KKwl0aC0+dF9yZWZjb3VudCA9IDE7CisJdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CiAKLXJlbG9jazoKLSAgbG9ja19qb3VybmFsKHBfc19zYikgOwotICBpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkgewotICAgIHVubG9ja19qb3VybmFsIChwX3Nfc2IpOwotICAgIHJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87Ci0gICAgZ290byBvdXRfZmFpbDsKLSAgfQotICBqb3VybmFsLT5qX2Jjb3VudCsrOwotCi0gIGlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7Ci0gICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhwX3Nfc2IpIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyApOwotICAgIGdvdG8gcmVsb2NrIDsKLSAgfQotICBub3cgPSBnZXRfc2Vjb25kcygpOwotCi0gIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIGpvdXJuYWwgT1IKLSAgKiogaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyB0b28gb2xkLCBhbmQgd2Ugd2VyZW4ndCBjYWxsZWQgam9pbmFibGUsIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBiZWZvcmUgYmVnaW5uaW5nIAotICAqKiB3ZSBkb24ndCBzbGVlcCBpZiB0aGVyZSBhcmVuJ3Qgb3RoZXIgd3JpdGVycwotICAqLwotCi0gIGlmICggKCFqb2luICYmIGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgfHwKLSAgICAgKCAham9pbiAmJiAoam91cm5hbC0+al9sZW5fYWxsb2MgKyBuYmxvY2tzICsgMikgPj0gam91cm5hbC0+al9tYXhfYmF0Y2gpIHx8Ci0gICAgICgham9pbiAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCAmJiBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCi0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgfHwKLSAgICAgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgfHwKLSAgICAgKCFqb2luICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSkgewotCi0gICAgb2xkX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsgLyogYWxsb3cgb3RoZXJzIHRvIGZpbmlzaCB0aGlzIHRyYW5zYWN0aW9uICovCi0KLSAgICBpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49Ci0gICAgICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoICYmCi0JKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPCAoam91cm5hbC0+al9sZW5fYWxsb2MgKiA3NSkpCi0gICAgewotCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMTApIHsKLQkgICAgc2NoZWRfY291bnQrKzsKLQkgICAgcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOwotCSAgICBnb3RvIHJlbG9jazsKKyAgICAgIHJlbG9jazoKKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87CisJCWdvdG8gb3V0X2ZhaWw7CiAJfQotICAgIH0KLSAgICAvKiBkb24ndCBtZXNzIHdpdGggam9pbmluZyB0aGUgdHJhbnNhY3Rpb24gaWYgYWxsIHdlIGhhdmUgdG8gZG8gaXMKLSAgICAgKiB3YWl0IGZvciBzb21lb25lIGVsc2UgdG8gZG8gYSBjb21taXQKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0Jd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCi0JICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7Ci0gICAgICAgIH0KLQlnb3RvIHJlbG9jazsKLSAgICB9Ci0gICAgcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9mYWlsOworCWpvdXJuYWwtPmpfYmNvdW50Kys7CiAKLSAgICAvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotICAgIGlmIChvbGRfdHJhbnNfaWQgIT0gam91cm5hbC0+al90cmFuc19pZCkgewotICAgICAgICByZXR2YWwgPSBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCAwKSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVykgOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X2ZhaWw7Ci0KLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd2NvdW50ICk7Ci0gICAgZ290byByZWxvY2sgOwotICB9Ci0gIC8qIHdlIGFyZSB0aGUgZmlyc3Qgd3JpdGVyLCBzZXQgdHJhbnNfaWQgKi8KLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9PSAwKSB7Ci0gICAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLSAgfQotICBhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jICs9IG5ibG9ja3MgOwotICB0aC0+dF9ibG9ja3NfbG9nZ2VkID0gMCA7Ci0gIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzIDsKLSAgdGgtPnRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIElOSVRfTElTVF9IRUFEICgmdGgtPnRfbGlzdCk7Ci0gIHJldHVybiAwIDsKLQotb3V0X2ZhaWw6Ci0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKgotcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBuYmxvY2tzKSB7Ci0gICAgaW50IHJldCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggOwotCi0gICAgLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQotICAgICoqIHBlcnNpc3RlbnQgb24gaXRzIG93bgotICAgICovCi0gICAgaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcocykpIHsKLSAgICAgICAgdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotCXRoLT50X3JlZmNvdW50KysgOwotCWlmICh0aC0+dF9yZWZjb3VudCA8IDIpIHsKLQkgICAgQlVHKCkgOworCWlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2socF9zX3NiKTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyk7CisJCWdvdG8gcmVsb2NrOwogCX0KLQlyZXR1cm4gdGggOwotICAgIH0KLSAgICB0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBHRlBfTk9GUywgcykgOwotICAgIGlmICghdGgpCi0gICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbih0aCwgcywgbmJsb2NrcykgOwotICAgIGlmIChyZXQpIHsKLQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBzKSA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOwogCi0gICAgU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7Ci0gICAgcmV0dXJuIHRoIDsKKwkvKiBpZiB0aGVyZSBpcyBubyByb29tIGluIHRoZSBqb3VybmFsIE9SCisJICoqIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgYW5kIHdlIHdlcmVuJ3QgY2FsbGVkIGpvaW5hYmxlLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggYmVmb3JlIGJlZ2lubmluZyAKKwkgKiogd2UgZG9uJ3Qgc2xlZXAgaWYgdGhlcmUgYXJlbid0IG90aGVyIHdyaXRlcnMKKwkgKi8KKworCWlmICgoIWpvaW4gJiYgam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSB8fAorCSAgICAoIWpvaW4KKwkgICAgICYmIChqb3VybmFsLT5qX2xlbl9hbGxvYyArIG5ibG9ja3MgKyAyKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCkKKwkgICAgfHwgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwCisJCSYmIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAKKwkJJiYgKG5vdyAtIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSkgPgorCQlqb3VybmFsLT5qX21heF90cmFuc19hZ2UpIHx8ICgham9pbgorCQkJCQkgICAgICAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpCisJICAgIHx8ICgham9pbiAmJiBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkpIHsKKworCQlvbGRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOwkvKiBhbGxvdyBvdGhlcnMgdG8gZmluaXNoIHRoaXMgdHJhbnNhY3Rpb24gKi8KKworCQlpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49CisJCSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAmJgorCQkgICAgKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPAorCQkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICogNzUpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDEwKSB7CisJCQkJc2NoZWRfY291bnQrKzsKKwkJCQlxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisJCQkJZ290byByZWxvY2s7CisJCQl9CisJCX0KKwkJLyogZG9uJ3QgbWVzcyB3aXRoIGpvaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGlmIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisJCSAqIHdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBkbyBhIGNvbW1pdAorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCisJCQkgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOworCQkJfQorCQkJZ290byByZWxvY2s7CisJCX0KKwkJcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQkvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLworCQlpZiAob2xkX3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJCXJldHZhbCA9IGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIDApOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVyk7CisJCX0KKworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgam91cm5hbC5qb3VybmFsX3JlbG9ja193Y291bnQpOworCQlnb3RvIHJlbG9jazsKKwl9CisJLyogd2UgYXJlIHRoZSBmaXJzdCB3cml0ZXIsIHNldCB0cmFuc19pZCAqLworCWlmIChqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPT0gMCkgeworCQlqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOworCX0KKwlhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYyArPSBuYmxvY2tzOworCXRoLT50X2Jsb2Nrc19sb2dnZWQgPSAwOworCXRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzOworCXRoLT50X3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCUlOSVRfTElTVF9IRUFEKCZ0aC0+dF9saXN0KTsKKwlnZXRfZnNfZXhjbCgpOworCXJldHVybiAwOworCisgICAgICBvdXRfZmFpbDoKKwltZW1zZXQodGgsIDAsIHNpemVvZigqdGgpKTsKKwkvKiBSZS1zZXQgdGgtPnRfc3VwZXIsIHNvIHdlIGNhbiBwcm9wZXJseSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisJICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcworCSAqIGNhbGwgaXMgcGFydCBvZiBhIGZhaWxlZCByZXN0YXJ0X3RyYW5zYWN0aW9uLCB3ZSBjYW4gZnJlZSBpdCBsYXRlciAqLworCXRoLT50X3N1cGVyID0gcF9zX3NiOworCXJldHVybiByZXR2YWw7CiB9CiAKLWludAotcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpCi0gICAgICAgIHJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSAtRUlPOwotICAgIGlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7Ci0gICAgICAgIFNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOwotCXJlaXNlcmZzX2tmcmVlKHRoLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSksIHMpIDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKK3N0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0CisJCQkJCQkJCSAgICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICAgKnMsCisJCQkJCQkJCSAgICBpbnQgbmJsb2NrcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOworCisJLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQorCSAqKiBwZXJzaXN0ZW50IG9uIGl0cyBvd24KKwkgKi8KKwlpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzKSkgeworCQl0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJdGgtPnRfcmVmY291bnQrKzsKKwkJaWYgKHRoLT50X3JlZmNvdW50IDwgMikgeworCQkJQlVHKCk7CisJCX0KKwkJcmV0dXJuIHRoOworCX0KKwl0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgR0ZQX05PRlMsIHMpOworCWlmICghdGgpCisJCXJldHVybiBOVUxMOworCXJldCA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIG5ibG9ja3MpOworCWlmIChyZXQpIHsKKwkJcmVpc2VyZnNfa2ZyZWUodGgsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwKKwkJCSAgICAgICBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7CisJcmV0dXJuIHRoOwogfQogCi1zdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87Ci0KLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0pPSU4pIDsKK2ludCByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlpbnQgcmV0ID0gMDsKKwlpZiAodGgtPnRfdHJhbnNfaWQpCisJCXJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7CisJCVNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOworCQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgIHMpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCi1pbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CiAKLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0FCT1JUKSA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fSk9JTik7CiB9CiAKLWludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotICAgIGludCByZXQgOworaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwogCi0gICAgdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMIDsKLSAgICBpZiAoY3VyX3RoKSB7Ci0JLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwotCWlmIChjdXJfdGgtPnRfc3VwZXIgPT0gcF9zX3NiKSB7Ci0gICAgICAgICAgICAgIEJVR19PTiAoIWN1cl90aC0+dF9yZWZjb3VudCk7Ci0JICAgICAgY3VyX3RoLT50X3JlZmNvdW50KysgOwotCSAgICAgIG1lbWNweSh0aCwgY3VyX3RoLCBzaXplb2YoKnRoKSk7Ci0JICAgICAgaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCi0JCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7Ci0JICAgICAgcmV0dXJuIDA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fQUJPUlQpOworfQorCitpbnQgam91cm5hbF9iZWdpbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpbnQgcmV0OworCisJdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMOworCWlmIChjdXJfdGgpIHsKKwkJLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyID09IHBfc19zYikgeworCQkJQlVHX09OKCFjdXJfdGgtPnRfcmVmY291bnQpOworCQkJY3VyX3RoLT50X3JlZmNvdW50Kys7CisJCQltZW1jcHkodGgsIGN1cl90aCwgc2l6ZW9mKCp0aCkpOworCQkJaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCQkgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCQkJICoqIHNhdmUgaXQgYW5kIHJlc3RvcmUgb24gam91cm5hbF9lbmQuICBUaGlzIHNob3VsZCBuZXZlcgorCQkJICoqIHJlYWxseSBoYXBwZW4uLi4KKwkJCSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiY2xtLTIxMDA6IG5lc3RpbmcgaW5mbyBhIGRpZmZlcmVudCBGUyIpOworCQkJdGgtPnRfaGFuZGxlX3NhdmUgPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwkJfQogCX0gZWxzZSB7Ci0JICAgIC8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgotCSAgICAqKiBzYXZlIGl0IGFuZCByZXN0b3JlIG9uIGpvdXJuYWxfZW5kLiAgVGhpcyBzaG91bGQgbmV2ZXIKLQkgICAgKiogcmVhbGx5IGhhcHBlbi4uLgotCSAgICAqLwotCSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMTAwOiBuZXN0aW5nIGluZm8gYSBkaWZmZXJlbnQgRlMiKSA7Ci0JICAgIHRoLT50X2hhbmRsZV9zYXZlID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKLQkgICAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGg7CisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwogCX0KLSAgICB9IGVsc2UgewotCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwotICAgIH0KLSAgICByZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRykgOwotICAgIGlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gIT0gdGgpCi0gICAgICAgIEJVRygpIDsKKwlyZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRyk7CisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyAhPSB0aCkKKwkJQlVHKCk7CiAKLSAgICAvKiBJIGd1ZXNzIHRoaXMgYm9pbHMgZG93biB0byBiZWluZyB0aGUgcmVjaXByb2NhbCBvZiBjbG0tMjEwMCBhYm92ZS4KLSAgICAgKiBJZiBkb19qb3VybmFsX2JlZ2luX3IgZmFpbHMsIHdlIG5lZWQgdG8gcHV0IGl0IGJhY2ssIHNpbmNlIGpvdXJuYWxfZW5kCi0gICAgICogd29uJ3QgYmUgY2FsbGVkIHRvIGRvIGl0LiAqLwotICAgIGlmIChyZXQpCi0gICAgICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICAgIGVsc2UKLSAgICAgICAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCS8qIEkgZ3Vlc3MgdGhpcyBib2lscyBkb3duIHRvIGJlaW5nIHRoZSByZWNpcHJvY2FsIG9mIGNsbS0yMTAwIGFib3ZlLgorCSAqIElmIGRvX2pvdXJuYWxfYmVnaW5fciBmYWlscywgd2UgbmVlZCB0byBwdXQgaXQgYmFjaywgc2luY2Ugam91cm5hbF9lbmQKKwkgKiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICovCisJaWYgKHJldCkKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJZWxzZQorCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKIAotICAgIHJldHVybiByZXQgOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0yODUwLDEyOSArMzEzOSwxNDAgQEAKICoqIAogKiogaWYgal9sZW4sIGlzIGJpZ2dlciB0aGFuIGpfbGVuX2FsbG9jLCBpdCBwdXNoZXMgal9sZW5fYWxsb2MgdG8gMTAgKyBqX2xlbi4KICovCi1pbnQgam91cm5hbF9tYXJrX2RpcnR5KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA9IE5VTEw7Ci0gIGludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwIDsKLSAgaW50IHByZXBhcmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCWludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwOworCWludCBwcmVwYXJlZCA9IDA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHkgKTsKLSAgaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwotICB9CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eSk7CisJaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsCisJCQkgICAgICAgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwKKwkJCSAgICAgICB0aC0+dF90cmFuc19pZCwgam91cm5hbC0+al90cmFuc19pZCk7CisJfQogCi0gIHBfc19zYi0+c19kaXJ0ID0gMTsKKwlwX3Nfc2ItPnNfZGlydCA9IDE7CiAKLSAgcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7Ci0gIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKLSAgLyogYWxyZWFkeSBpbiB0aGlzIHRyYW5zYWN0aW9uLCB3ZSBhcmUgZG9uZSAqLwotICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9hbHJlYWR5ICk7Ci0gICAgcmV0dXJuIDAgOwotICB9CisJcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGJoKTsKKwljbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKTsKKwkvKiBhbHJlYWR5IGluIHRoaXMgdHJhbnNhY3Rpb24sIHdlIGFyZSBkb25lICovCisJaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpKSB7CisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHlfYWxyZWFkeSk7CisJCXJldHVybiAwOworCX0KIAotICAvKiB0aGlzIG11c3QgYmUgdHVybmVkIGludG8gYSBwYW5pYyBpbnN0ZWFkIG9mIGEgd2FybmluZy4gIFdlIGNhbid0IGFsbG93Ci0gICoqIGEgZGlydHkgb3Igam91cm5hbF9kaXJ0eSBvciBsb2NrZWQgYnVmZmVyIHRvIGJlIGxvZ2dlZCwgYXMgc29tZSBjaGFuZ2VzCi0gICoqIGNvdWxkIGdldCB0byBkaXNrIHRvbyBlYXJseS4gIE5PVCBHT09ELgotICAqLwotICBpZiAoIXByZXBhcmVkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTE3Nzc6IGJ1ZmZlciAlbGx1IGJhZCBzdGF0ZSAiCi0JCSAgICAgICIlY1BSRVBBUkVEICVjTE9DS0VEICVjRElSVFkgJWNKRElSVFlfV0FJVCIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgcHJlcGFyZWQgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2xvY2tlZChiaCkgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKLQkJCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkgPyAnICcgOiAnIScpIDsKLSAgfQorCS8qIHRoaXMgbXVzdCBiZSB0dXJuZWQgaW50byBhIHBhbmljIGluc3RlYWQgb2YgYSB3YXJuaW5nLiAgV2UgY2FuJ3QgYWxsb3cKKwkgKiogYSBkaXJ0eSBvciBqb3VybmFsX2RpcnR5IG9yIGxvY2tlZCBidWZmZXIgdG8gYmUgbG9nZ2VkLCBhcyBzb21lIGNoYW5nZXMKKwkgKiogY291bGQgZ2V0IHRvIGRpc2sgdG9vIGVhcmx5LiAgTk9UIEdPT0QuCisJICovCisJaWYgKCFwcmVwYXJlZCB8fCBidWZmZXJfZGlydHkoYmgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xNzc3OiBidWZmZXIgJWxsdSBiYWQgc3RhdGUgIgorCQkJCSAiJWNQUkVQQVJFRCAlY0xPQ0tFRCAlY0RJUlRZICVjSkRJUlRZX1dBSVQiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkJIHByZXBhcmVkID8gJyAnIDogJyEnLAorCQkJCSBidWZmZXJfbG9ja2VkKGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpID8gJyAnIDogJyEnKTsKKwl9CiAKLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIC8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKLSAgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCi0gICovIAotICBpZiAoam91cm5hbC0+al9sZW4gPj0gam91cm5hbC0+al90cmFuc19tYXgpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTQxMzogam91cm5hbF9tYXJrX2RpcnR5OiBqX2xlbiAoJWx1KSBpcyB0b28gYmlnXG4iLCBqb3VybmFsLT5qX2xlbikgOwotICB9CisJaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwKKwkJCQkgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKKwkgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID49IGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE0MTM6IGpvdXJuYWxfbWFya19kaXJ0eTogal9sZW4gKCVsdSkgaXMgdG9vIGJpZ1xuIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2xlbik7CisJfQogCi0gIGlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKLSAgICBjb3VudF9hbHJlYWR5X2luY2QgPSAxIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsICk7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgfQorCWlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJY291bnRfYWxyZWFkeV9pbmNkID0gMTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsKTsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCX0KIAotICBpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgewotICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jID0gam91cm5hbC0+al9sZW4gKyBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7Ci0gIH0KKwlpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgeworCQlqb3VybmFsLT5qX2xlbl9hbGxvYyA9IGpvdXJuYWwtPmpfbGVuICsgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJfQogCi0gIHNldF9idWZmZXJfam91cm5hbGVkIChiaCk7CisJc2V0X2J1ZmZlcl9qb3VybmFsZWQoYmgpOwogCi0gIC8qIG5vdyBwdXQgdGhpcyBndXkgb24gdGhlIGVuZCAqLwotICBpZiAoIWNuKSB7Ci0gICAgY24gPSBnZXRfY25vZGUocF9zX3NiKSA7Ci0gICAgaWYgKCFjbikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiZ2V0X2Nub2RlIGZhaWxlZCFcbiIpOyAKLSAgICB9CisJLyogbm93IHB1dCB0aGlzIGd1eSBvbiB0aGUgZW5kICovCisJaWYgKCFjbikgeworCQljbiA9IGdldF9jbm9kZShwX3Nfc2IpOworCQlpZiAoIWNuKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJnZXRfY25vZGUgZmFpbGVkIVxuIik7CisJCX0KIAotICAgIGlmICh0aC0+dF9ibG9ja3NfbG9nZ2VkID09IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpIHsKLSAgICAgIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgICAgam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgIH0KLSAgICB0aC0+dF9ibG9ja3NfbG9nZ2VkKysgOwotICAgIGpvdXJuYWwtPmpfbGVuKysgOworCQlpZiAodGgtPnRfYmxvY2tzX2xvZ2dlZCA9PSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSB7CisJCQl0aC0+dF9ibG9ja3NfYWxsb2NhdGVkICs9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UOworCQkJam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJCX0KKwkJdGgtPnRfYmxvY2tzX2xvZ2dlZCsrOworCQlqb3VybmFsLT5qX2xlbisrOwogCi0gICAgY24tPmJoID0gYmggOwotICAgIGNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tuciA7Ci0gICAgY24tPnNiID0gcF9zX3NiOwotICAgIGNuLT5qbGlzdCA9IE5VTEwgOwotICAgIGluc2VydF9qb3VybmFsX2hhc2goam91cm5hbC0+al9oYXNoX3RhYmxlLCBjbikgOwotICAgIGlmICghY291bnRfYWxyZWFkeV9pbmNkKSB7Ci0gICAgICBnZXRfYmgoYmgpIDsKLSAgICB9Ci0gIH0KLSAgY24tPm5leHQgPSBOVUxMIDsKLSAgY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3QgOwotICBjbi0+YmggPSBiaCA7Ci0gIGlmIChqb3VybmFsLT5qX2xhc3QpIHsKLSAgICBqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9IGVsc2UgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9Ci0gIHJldHVybiAwIDsKKwkJY24tPmJoID0gYmg7CisJCWNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tucjsKKwkJY24tPnNiID0gcF9zX3NiOworCQljbi0+amxpc3QgPSBOVUxMOworCQlpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgY24pOworCQlpZiAoIWNvdW50X2FscmVhZHlfaW5jZCkgeworCQkJZ2V0X2JoKGJoKTsKKwkJfQorCX0KKwljbi0+bmV4dCA9IE5VTEw7CisJY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3Q7CisJY24tPmJoID0gYmg7CisJaWYgKGpvdXJuYWwtPmpfbGFzdCkgeworCQlqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbjsKKwkJam91cm5hbC0+al9sYXN0ID0gY247CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9maXJzdCA9IGNuOworCQlqb3VybmFsLT5qX2xhc3QgPSBjbjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLWludCBqb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBpZiAoIWN1cnJlbnQtPmpvdXJuYWxfaW5mbyAmJiB0aC0+dF9yZWZjb3VudCA+IDEpCi0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUkVJU0VSLU5FU1RJTkc6IHRoIE5VTEwsIHJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICB0aC0+dF9yZWZjb3VudCk7CitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8gJiYgdGgtPnRfcmVmY291bnQgPiAxKQorCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJFSVNFUi1ORVNUSU5HOiB0aCBOVUxMLCByZWZjb3VudCAlZCIsCisJCQkJIHRoLT50X3JlZmNvdW50KTsKIAotICBpZiAoIXRoLT50X3RyYW5zX2lkKSB7Ci0gICAgV0FSTl9PTiAoMSk7Ci0gICAgcmV0dXJuIC1FSU87Ci0gIH0KKwlpZiAoIXRoLT50X3RyYW5zX2lkKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRUlPOworCX0KIAotICB0aC0+dF9yZWZjb3VudC0tOwotICBpZiAodGgtPnRfcmVmY291bnQgPiAwKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKKwl0aC0+dF9yZWZjb3VudC0tOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDApIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0KKwkJICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIAotICAgIC8qIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNsb3NlIGEgbmVzdGVkIHRyYW5zYWN0aW9uIG9uIGEgZGlmZmVyZW50Ci0gICAgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0Ci0gICAgKi8KLSAgICBpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQotICAgICAgQlVHKCkgOworCQkvKiB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBjbG9zZSBhIG5lc3RlZCB0cmFuc2FjdGlvbiBvbiBhIGRpZmZlcmVudAorCQkgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0CisJCSAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQorCQkJQlVHKCk7CiAKLSAgICBpZiAodGggIT0gY3VyX3RoKSB7Ci0gICAgICBtZW1jcHkoY3VycmVudC0+am91cm5hbF9pbmZvLCB0aCwgc2l6ZW9mKCp0aCkpOwotICAgICAgdGgtPnRfdHJhbnNfaWQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgMCkgOwotICB9CisJCWlmICh0aCAhPSBjdXJfdGgpIHsKKwkJCW1lbWNweShjdXJyZW50LT5qb3VybmFsX2luZm8sIHRoLCBzaXplb2YoKnRoKSk7CisJCQl0aC0+dF90cmFuc19pZCA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIDApOworCX0KIH0KIAogLyogcmVtb3ZlcyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCByZWxzaW5nIGFuZCBkZXNjcmVtZW50aW5nIGFueSBjb3VudGVycy4gIApAQCAtMjk4Miw0NyArMzI4Miw1MSBAQAogKioKICoqIHJldHVybnMgMSBpZiBpdCBjbGVhbmVkIGFuZCByZWxzZWQgdGhlIGJ1ZmZlci4gMCBvdGhlcndpc2UKICovCi1zdGF0aWMgaW50IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIGludCByZXQgPSAwOworc3RhdGljIGludCByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCWludCByZXQgPSAwOwogCi0gIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsb2NrbnIpIDsKLSAgaWYgKCFjbiB8fCAhY24tPmJoKSB7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0KLSAgYmggPSBjbi0+YmggOwotICBpZiAoY24tPnByZXYpIHsKLSAgICBjbi0+cHJldi0+bmV4dCA9IGNuLT5uZXh0IDsKLSAgfQotICBpZiAoY24tPm5leHQpIHsKLSAgICBjbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbi0+bmV4dCA7Ci0gIH0KLSAgaWYgKGNuID09IGpvdXJuYWwtPmpfbGFzdCkgewotICAgIGpvdXJuYWwtPmpfbGFzdCA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoYmgpCi0JcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwgYmgtPmJfYmxvY2tuciwgMCkgOwotICBjbGVhcl9idWZmZXJfam91cm5hbGVkICAoYmgpOyAvKiBkb24ndCBsb2cgdGhpcyBvbmUgKi8KKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoIWNuIHx8ICFjbi0+YmgpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJYmggPSBjbi0+Ymg7CisJaWYgKGNuLT5wcmV2KSB7CisJCWNuLT5wcmV2LT5uZXh0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbi0+bmV4dCkgeworCQljbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2OworCX0KKwlpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgeworCQlqb3VybmFsLT5qX2ZpcnN0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbiA9PSBqb3VybmFsLT5qX2xhc3QpIHsKKwkJam91cm5hbC0+al9sYXN0ID0gY24tPnByZXY7CisJfQorCWlmIChiaCkKKwkJcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwKKwkJCQkgICAgYmgtPmJfYmxvY2tuciwgMCk7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChiaCk7CS8qIGRvbid0IGxvZyB0aGlzIG9uZSAqLwogCi0gIGlmICghYWxyZWFkeV9jbGVhbmVkKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKLSAgICBwdXRfYmgoYmgpIDsKLSAgICBpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNzUyOiByZW1vdmUgZnJvbSB0cmFucywgYl9jb3VudCA8IDAiKTsKLSAgICB9Ci0gICAgcmV0ID0gMSA7Ci0gIH0KLSAgam91cm5hbC0+al9sZW4tLSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jLS0gOwotICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgcmV0dXJuIHJldCA7CisJaWYgKCFhbHJlYWR5X2NsZWFuZWQpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJcHV0X2JoKGJoKTsKKwkJaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTc1MjogcmVtb3ZlIGZyb20gdHJhbnMsIGJfY291bnQgPCAwIik7CisJCX0KKwkJcmV0ID0gMTsKKwl9CisJam91cm5hbC0+al9sZW4tLTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYy0tOworCWZyZWVfY25vZGUocF9zX3NiLCBjbik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTMwMzUsMTIwICszMzM5LDEyOSBAQAogKiogYmxvY2tzIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG9uIGRpc2sKICoqCiAqLwotc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7Ci0gIGJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tuciAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY3VyID0gY24tPmhwcmV2IDsKLSAgaW50IGNhbl9kaXJ0eSA9IDEgOwotICAKLSAgLyogZmlyc3QgdGVzdCBocHJldi4gIFRoZXNlIGFyZSBhbGwgbmV3ZXIgdGhhbiBjbiwgc28gYW55IG5vZGUgaGVyZQotICAqKiB3aXRoIHRoZSBzYW1lIGJsb2NrIG51bWJlciBhbmQgZGV2IG1lYW5zIHRoaXMgbm9kZSBjYW4ndCBiZSBzZW50Ci0gICoqIHRvIGRpc2sgcmlnaHQgbm93LgotICAqLwotICB3aGlsZShjdXIgJiYgY2FuX2RpcnR5KSB7Ci0gICAgaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5iaCAmJiBjdXItPmJsb2NrbnIgJiYgY3VyLT5zYiA9PSBzYiAmJiAKLSAgICAgICAgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKLSAgICAgIGNhbl9kaXJ0eSA9IDAgOwotICAgIH0KLSAgICBjdXIgPSBjdXItPmhwcmV2IDsKLSAgfQotICAvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKLSAgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKLSAgKi8KLSAgY3VyID0gY24tPmhuZXh0IDsKLSAgd2hpbGUoY3VyICYmIGNhbl9kaXJ0eSkgewotICAgIGlmIChjdXItPmpsaXN0ICYmIGN1ci0+amxpc3QtPmpfbGVuID4gMCAmJiAKLSAgICAgICAgYXRvbWljX3JlYWQoJihjdXItPmpsaXN0LT5qX2NvbW1pdF9sZWZ0KSkgPiAwICYmIGN1ci0+YmggJiYgCi0gICAgICAgIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmIGN1ci0+YmxvY2tuciA9PSBibG9ja25yKSB7Ci0gICAgICBjYW5fZGlydHkgPSAwIDsKLSAgICB9Ci0gICAgY3VyID0gY3VyLT5obmV4dCA7Ci0gIH0KLSAgcmV0dXJuIGNhbl9kaXJ0eSA7CitzdGF0aWMgaW50IGNhbl9kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKKwliX2Jsb2NrbnJfdCBibG9ja25yID0gY24tPmJsb2NrbnI7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA9IGNuLT5ocHJldjsKKwlpbnQgY2FuX2RpcnR5ID0gMTsKKworCS8qIGZpcnN0IHRlc3QgaHByZXYuICBUaGVzZSBhcmUgYWxsIG5ld2VyIHRoYW4gY24sIHNvIGFueSBub2RlIGhlcmUKKwkgKiogd2l0aCB0aGUgc2FtZSBibG9jayBudW1iZXIgYW5kIGRldiBtZWFucyB0aGlzIG5vZGUgY2FuJ3QgYmUgc2VudAorCSAqKiB0byBkaXNrIHJpZ2h0IG5vdy4KKwkgKi8KKwl3aGlsZSAoY3VyICYmIGNhbl9kaXJ0eSkgeworCQlpZiAoY3VyLT5qbGlzdCAmJiBjdXItPmJoICYmIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmCisJCSAgICBjdXItPmJsb2NrbnIgPT0gYmxvY2tucikgeworCQkJY2FuX2RpcnR5ID0gMDsKKwkJfQorCQljdXIgPSBjdXItPmhwcmV2OworCX0KKwkvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKKwkgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKKwkgKi8KKwljdXIgPSBjbi0+aG5leHQ7CisJd2hpbGUgKGN1ciAmJiBjYW5fZGlydHkpIHsKKwkJaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5qbGlzdC0+al9sZW4gPiAwICYmCisJCSAgICBhdG9taWNfcmVhZCgmKGN1ci0+amxpc3QtPmpfY29tbWl0X2xlZnQpKSA+IDAgJiYgY3VyLT5iaCAmJgorCQkgICAgY3VyLT5ibG9ja25yICYmIGN1ci0+c2IgPT0gc2IgJiYgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKwkJCWNhbl9kaXJ0eSA9IDA7CisJCX0KKwkJY3VyID0gY3VyLT5obmV4dDsKKwl9CisJcmV0dXJuIGNhbl9kaXJ0eTsKIH0KIAogLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKICoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCiAqLwotaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIC8qIHlvdSBjYW4gc3luYyB3aGlsZSBuZXN0ZWQsIHZlcnksIHZlcnkgYmFkICovCi0gIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKLSAgICBCVUcoKSA7Ci0gIH0KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7Ci0gIH0KLSAgcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIENPTU1JVF9OT1cgfCBXQUlUKSA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJLyogeW91IGNhbiBzeW5jIHdoaWxlIG5lc3RlZCwgdmVyeSwgdmVyeSBiYWQgKi8KKwlpZiAodGgtPnRfcmVmY291bnQgPiAxKSB7CisJCUJVRygpOworCX0KKwlpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgeworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJICAgICAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCX0KKwlyZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgQ09NTUlUX05PVyB8IFdBSVQpOwogfQogCiAvKgogKiogd3JpdGViYWNrIHRoZSBwZW5kaW5nIGFzeW5jIGNvbW1pdHMgdG8gZGlzawogKi8KLXN0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCkgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5Oworc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyh2b2lkICpwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAotICBsb2NrX2tlcm5lbCgpOwotICBpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgewotICAgICAgLyogbGFzdCBlbnRyeSBpcyB0aGUgeW91bmdlc3QsIGNvbW1pdCBpdCBhbmQgeW91IGdldCBldmVyeXRoaW5nICovCi0gICAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0LnByZXY7Ci0gICAgICBqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKTsKLSAgfQotICB1bmxvY2tfa2VybmVsKCk7Ci0gIC8qCi0gICAqIHRoaXMgaXMgYSBsaXR0bGUgcmFjZXksIGJ1dCB0aGVyZSdzIG5vIGhhcm0gaW4gbWlzc2luZwotICAgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQotICAgKi8KLSAgaWYgKCFhdG9taWNfcmVhZCgmam91cm5hbC0+al9hc3luY190aHJvdHRsZSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpIHsKLSAgICAgIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICAgICAgZmlsZW1hcF9mZGF0YXdyaXRlKHBfc19zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKLSAgICAgIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICB9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgeworCQkvKiBsYXN0IGVudHJ5IGlzIHRoZSB5b3VuZ2VzdCwgY29tbWl0IGl0IGFuZCB5b3UgZ2V0IGV2ZXJ5dGhpbmcgKi8KKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5wcmV2OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJLyoKKwkgKiB0aGlzIGlzIGEgbGl0dGxlIHJhY2V5LCBidXQgdGhlcmUncyBubyBoYXJtIGluIG1pc3NpbmcKKwkgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQorCSAqLworCWlmICghYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpCisJICAgICYmICFyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJYXRvbWljX2luYygmam91cm5hbC0+al9hc3luY190aHJvdHRsZSk7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShwX3Nfc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCWF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCX0KIH0KIAogLyoKICoqIGZsdXNoZXMgYW55IG9sZCB0cmFuc2FjdGlvbnMgdG8gZGlzawogKiogZW5kcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZiBpdCBpcyB0b28gb2xkCiAqLwotaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgdGltZV90IG5vdyA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXRpbWVfdCBub3c7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAgIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gICAgLyogc2FmZXR5IGNoZWNrIHNvIHdlIGRvbid0IGZsdXNoIHdoaWxlIHdlIGFyZSByZXBsYXlpbmcgdGhlIGxvZyBkdXJpbmcKLSAgICAgKiBtb3VudAotICAgICAqLwotICAgIGlmIChsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLQlyZXR1cm4gMCAgOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIHNhZmV0eSBjaGVjayBzbyB3ZSBkb24ndCBmbHVzaCB3aGlsZSB3ZSBhcmUgcmVwbGF5aW5nIHRoZSBsb2cgZHVyaW5nCisJICogbW91bnQKKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpKSB7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIGNoZWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlcmUgYXJlIG5vIHdyaXRlcnMsIGFuZCBpdCBpcwotICAgICAqIHRvbyBvbGQsIGZpbmlzaCBpdCwgYW5kIGZvcmNlIHRoZSBjb21taXQgYmxvY2tzIHRvIGRpc2sKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA8PSAwICYmCi0gICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAgJiYKLSAgICAgICAgam91cm5hbC0+al9sZW4gPiAwICYmCi0gICAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKQotICAgIHsKLQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7Ci0gICAgICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKKwkvKiBjaGVjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZXJlIGFyZSBubyB3cml0ZXJzLCBhbmQgaXQgaXMKKwkgKiB0b28gb2xkLCBmaW5pc2ggaXQsIGFuZCBmb3JjZSB0aGUgY29tbWl0IGJsb2NrcyB0byBkaXNrCisJICovCisJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPD0gMCAmJgorCSAgICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCisJICAgIGpvdXJuYWwtPmpfbGVuID4gMCAmJgorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgeworCQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLAorCQkJCQkJICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkJICAgICAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CiAKLSAgICAgICAgICAgIC8qIHdlJ3JlIG9ubHkgYmVpbmcgY2FsbGVkIGZyb20ga3JlaXNlcmZzZCwgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gZG8KLSAgICAgICAgICAgICoqIGFuIGFzeW5jIGNvbW1pdCBzbyB0aGF0IGtyZWlzZXJmc2QgY2FuIGRvIGl0IGxhdGVyCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsMSwgQ09NTUlUX05PVyB8IFdBSVQpIDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CisJCQkvKiB3ZSdyZSBvbmx5IGJlaW5nIGNhbGxlZCBmcm9tIGtyZWlzZXJmc2QsIGl0IG1ha2VzIG5vIHNlbnNlIHRvIGRvCisJCQkgKiogYW4gYXN5bmMgY29tbWl0IHNvIHRoYXQga3JlaXNlcmZzZCBjYW4gZG8gaXQgbGF0ZXIKKwkJCSAqLworCQkJZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsIDEsIENPTU1JVF9OT1cgfCBXQUlUKTsKKwkJfQorCX0KKwlyZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CiB9CiAKIC8qCkBAIC0zMTYyLDEwMSArMzQ3NSwxMDggQEAKICoqIAogKiogTm90ZSwgd2UgY2FuJ3QgYWxsb3cgdGhlIGpvdXJuYWxfZW5kIHRvIHByb2NlZWQgd2hpbGUgdGhlcmUgYXJlIHN0aWxsIHdyaXRlcnMgaW4gdGhlIGxvZy4KICovCi1zdGF0aWMgaW50IGNoZWNrX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCBpbnQgZmxhZ3MpIHsKK3N0YXRpYyBpbnQgY2hlY2tfam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgICAgIGludCBmbGFncykKK3sKIAotICB0aW1lX3Qgbm93IDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVyA7Ci0gIGludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisJdGltZV90IG5vdzsKKwlpbnQgZmx1c2ggPSBmbGFncyAmIEZMVVNIX0FMTDsKKwlpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVzsKKwlpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIGlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsIAotICAgICAgICAgICAgICAgICAgIHRoLT50X3RyYW5zX2lkLCBqb3VybmFsLT5qX3RyYW5zX2lkKTsKLSAgfQotCi0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jIC09ICh0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIC0gdGgtPnRfYmxvY2tzX2xvZ2dlZCkgOwotICBpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeyAvKiA8PSAwIGlzIGFsbG93ZWQuICB1bm1vdW50aW5nIG1pZ2h0IG5vdCBjYWxsIGJlZ2luICovCi0gICAgYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSkgOwotICB9Ci0KLSAgLyogQlVHLCBkZWFsIHdpdGggY2FzZSB3aGVyZSBqX2xlbiBpcyAwLCBidXQgcGVvcGxlIHByZXZpb3VzbHkgZnJlZWQgYmxvY2tzIG5lZWQgdG8gYmUgcmVsZWFzZWQgCi0gICoqIHdpbGwgYmUgZGVhbHQgd2l0aCBieSBuZXh0IHRyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgd3JpdGVzIHNvbWV0aGluZywgYnV0IHNob3VsZCBiZSB0YWtlbgotICAqKiBjYXJlIG9mIGluIHRoaXMgdHJhbnMKLSAgKi8KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICBCVUcoKTsKLSAgfQotICAvKiBpZiB3Y291bnQgPiAwLCBhbmQgd2UgYXJlIGNhbGxlZCB0byB3aXRoIGZsdXNoIG9yIGNvbW1pdF9ub3csCi0gICoqIHdlIHdhaXQgb24gal9qb2luX3dhaXQuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUgbGFzdCB3cml0ZXIgaGFzCi0gICoqIGZpbmlzaGVkIHRoZSB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0ZWQgaXQgb24gaXRzIHdheSB0byB0aGUgZGlzay4KLSAgKiogVGhlbiwgd2UgZmx1c2ggdGhlIGNvbW1pdCBvciBqb3VybmFsIGxpc3QsIGFuZCBqdXN0IHJldHVybiAwIAotICAqKiBiZWNhdXNlIHRoZSByZXN0IG9mIGpvdXJuYWwgZW5kIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24uCi0gICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7Ci0gICAgaWYgKGZsdXNoIHx8IGNvbW1pdF9ub3cpIHsKLSAgICAgIHVuc2lnbmVkIHRyYW5zX2lkIDsKLQotICAgICAgamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gICAgICB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICAgICAgaWYgKHdhaXRfb25fY29tbWl0KQotICAgICAgICBqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwotICAgICAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKSA7Ci0gICAgICBpZiAoZmx1c2gpIHsKLSAgICAgICAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAxIDsKLSAgICAgIH0KLSAgICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotCi0gICAgICAvKiBzbGVlcCB3aGlsZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzdGlsbCBqX2psb2NrZWQgKi8KLSAgICAgIHdoaWxlKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKLQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0JICAgIHF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgbG9ja19qb3VybmFsKHBfc19zYik7Ci0JICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0JICAgICAgICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDEpIDsKLQkgICAgfQotCSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCWlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsCisJCQkgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwogCX0KLSAgICAgIH0KLSAgICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0gICAgICAgICAgQlVHKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWl0X25vdyAmJiBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCB0cmFuc19pZCkgJiYKLSAgICAgICAgICB3YWl0X29uX2NvbW1pdCkKLSAgICAgIHsKLQkgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwIDsKLSAgICB9IAotICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotICAgIHJldHVybiAwIDsKLSAgfQogCi0gIC8qIGRlYWwgd2l0aCBvbGQgdHJhbnNhY3Rpb25zIHdoZXJlIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXJzICovCi0gIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gIGlmICgobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgewotICAgIGNvbW1pdF9ub3cgPSAxIDsKLSAgICBqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxIDsKLSAgfQotICAvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLwotICAvKiBkb24ndCBiYXRjaCB3aGVuIHN5bmNpbmcgdGhlIGNvbW1pdCBvciBmbHVzaGluZyB0aGUgd2hvbGUgdHJhbnMgKi8KLSAgaWYgKCEoam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSAmJiAhKGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpKSAmJiAhZmx1c2ggJiYgIWNvbW1pdF9ub3cgJiYKLSAgICAgIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKSAgJiYKLSAgICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jIDwgam91cm5hbC0+al9tYXhfYmF0Y2ggJiYgam91cm5hbC0+al9jbm9kZV9mcmVlID4gKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpIHsKLSAgICBqb3VybmFsLT5qX2Jjb3VudCsrIDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwlqb3VybmFsLT5qX2xlbl9hbGxvYyAtPSAodGgtPnRfYmxvY2tzX2FsbG9jYXRlZCAtIHRoLT50X2Jsb2Nrc19sb2dnZWQpOworCWlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7CS8qIDw9IDAgaXMgYWxsb3dlZC4gIHVubW91bnRpbmcgbWlnaHQgbm90IGNhbGwgYmVnaW4gKi8KKwkJYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSk7CisJfQogCi0gIGlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLCBqb3VybmFsLT5qX3N0YXJ0KSA7Ci0gIH0KLSAgcmV0dXJuIDEgOworCS8qIEJVRywgZGVhbCB3aXRoIGNhc2Ugd2hlcmUgal9sZW4gaXMgMCwgYnV0IHBlb3BsZSBwcmV2aW91c2x5IGZyZWVkIGJsb2NrcyBuZWVkIHRvIGJlIHJlbGVhc2VkIAorCSAqKiB3aWxsIGJlIGRlYWx0IHdpdGggYnkgbmV4dCB0cmFuc2FjdGlvbiB0aGF0IGFjdHVhbGx5IHdyaXRlcyBzb21ldGhpbmcsIGJ1dCBzaG91bGQgYmUgdGFrZW4KKwkgKiogY2FyZSBvZiBpbiB0aGlzIHRyYW5zCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQorCS8qIGlmIHdjb3VudCA+IDAsIGFuZCB3ZSBhcmUgY2FsbGVkIHRvIHdpdGggZmx1c2ggb3IgY29tbWl0X25vdywKKwkgKiogd2Ugd2FpdCBvbiBqX2pvaW5fd2FpdC4gIFdlIHdpbGwgd2FrZSB1cCB3aGVuIHRoZSBsYXN0IHdyaXRlciBoYXMKKwkgKiogZmluaXNoZWQgdGhlIHRyYW5zYWN0aW9uLCBhbmQgc3RhcnRlZCBpdCBvbiBpdHMgd2F5IHRvIHRoZSBkaXNrLgorCSAqKiBUaGVuLCB3ZSBmbHVzaCB0aGUgY29tbWl0IG9yIGpvdXJuYWwgbGlzdCwgYW5kIGp1c3QgcmV0dXJuIDAgCisJICoqIGJlY2F1c2UgdGhlIHJlc3Qgb2Ygam91cm5hbCBlbmQgd2FzIGFscmVhZHkgZG9uZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeworCQlpZiAoZmx1c2ggfHwgY29tbWl0X25vdykgeworCQkJdW5zaWduZWQgdHJhbnNfaWQ7CisKKwkJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkJdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkJCWlmICh3YWl0X29uX2NvbW1pdCkKKwkJCQlqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOworCQkJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKTsKKwkJCWlmIChmbHVzaCkgeworCQkJCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMTsKKwkJCX0KKwkJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisKKwkJCS8qIHNsZWVwIHdoaWxlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHN0aWxsIGpfamxvY2tlZCAqLworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJCXF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwkJCQkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQkJCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwKKwkJCQkJCQkgICAxKTsKKwkJCQkJfQorCQkJCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQkJCX0KKwkJCX0KKwkJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJCQkJQlVHKCk7CisJCQl9CisJCQlpZiAoY29tbWl0X25vdworCQkJICAgICYmIGpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShwX3Nfc2IsIHRyYW5zX2lkKQorCQkJICAgICYmIHdhaXRfb25fY29tbWl0KSB7CisJCQkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkZWFsIHdpdGggb2xkIHRyYW5zYWN0aW9ucyB3aGVyZSB3ZSBhcmUgdGhlIGxhc3Qgd3JpdGVycyAqLworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJaWYgKChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKSB7CisJCWNvbW1pdF9ub3cgPSAxOworCQlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOworCX0KKwkvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLworCS8qIGRvbid0IGJhdGNoIHdoZW4gc3luY2luZyB0aGUgY29tbWl0IG9yIGZsdXNoaW5nIHRoZSB3aG9sZSB0cmFucyAqLworCWlmICghKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgJiYgIShhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSkKKwkgICAgJiYgIWZsdXNoICYmICFjb21taXRfbm93ICYmIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKQorCSAgICAmJiBqb3VybmFsLT5qX2xlbl9hbGxvYyA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoCisJICAgICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA+IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7CisJCWpvdXJuYWwtPmpfYmNvdW50Kys7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHVybiAwOworCX0KKworCWlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCSAgICAgICAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLAorCQkJICAgICAgIGpvdXJuYWwtPmpfc3RhcnQpOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTMyNzMsODMgKzM1OTMsOTUgQEAKICoqCiAqKiBUaGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBkZWNyZW1lbnRpbmcgYW55IGNvdW50ZXJzIGFuZCBmaWxpbmcgaXQgb24gdGhlIGNsZWFuIGxpc3QuCiAqLwotaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGJfYmxvY2tucl90IGJsb2NrbnIpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwgOwotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7Ci0gIGludCBjbGVhbmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgYl9ibG9ja25yX3QgYmxvY2tucikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgPSBOVUxMOworCWludCBjbGVhbmVkID0gMDsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICBjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKLSAgaWYgKGNuICYmIGNuLT5iaCkgewotICAgICAgYmggPSBjbi0+YmggOwotICAgICAgZ2V0X2JoKGJoKSA7Ci0gIH0KLSAgLyogaWYgaXQgaXMgam91cm5hbCBuZXcsIHdlIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhpcyB0cmFuc2FjdGlvbiAqLwotICBpZiAoYmggJiYgYnVmZmVyX2pvdXJuYWxfbmV3KGJoKSkgewotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyAoYmgpOwotICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpIDsKLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogc2V0IHRoZSBiaXQgZm9yIHRoaXMgYmxvY2sgaW4gdGhlIGpvdXJuYWwgYml0bWFwIGZvciB0aGlzIHRyYW5zYWN0aW9uICovCi0gICAgamIgPSBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXA7Ci0gICAgaWYgKCFqYikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIikgOwotICAgIH0KLSAgICBzZXRfYml0X2luX2xpc3RfYml0bWFwKHBfc19zYiwgYmxvY2tuciwgamIpIDsKKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoY24gJiYgY24tPmJoKSB7CisJCWJoID0gY24tPmJoOworCQlnZXRfYmgoYmgpOworCX0KKwkvKiBpZiBpdCBpcyBqb3VybmFsIG5ldywgd2UganVzdCByZW1vdmUgaXQgZnJvbSB0aGlzIHRyYW5zYWN0aW9uICovCisJaWYgKGJoICYmIGJ1ZmZlcl9qb3VybmFsX25ldyhiaCkpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3KGJoKTsKKwkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCXJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCk7CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgYml0IGZvciB0aGlzIGJsb2NrIGluIHRoZSBqb3VybmFsIGJpdG1hcCBmb3IgdGhpcyB0cmFuc2FjdGlvbiAqLworCQlqYiA9IGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcDsKKwkJaWYgKCFqYikgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIik7CisJCX0KKwkJc2V0X2JpdF9pbl9saXN0X2JpdG1hcChwX3Nfc2IsIGJsb2NrbnIsIGpiKTsKIAotICAgIC8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCisJCS8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCiAKLSAgICBpZiAoYmgpIHsKLSAgICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICAgIHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCkgOwotICAgIH0KLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7CisJCWlmIChiaCkgeworCQkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCQlyZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpOworCQl9CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOwogCi0gICAgLyogZmluZCBhbGwgb2xkZXIgdHJhbnNhY3Rpb25zIHdpdGggdGhpcyBibG9jaywgbWFrZSBzdXJlIHRoZXkgZG9uJ3QgdHJ5IHRvIHdyaXRlIGl0IG91dCAqLwotICAgIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCAgYmxvY2tucikgOwotICAgIHdoaWxlIChjbikgewotICAgICAgaWYgKHBfc19zYiA9PSBjbi0+c2IgJiYgYmxvY2tuciA9PSBjbi0+YmxvY2tucikgewotCXNldF9iaXQoQkxPQ0tfRlJFRUQsICZjbi0+c3RhdGUpIDsKLQlpZiAoY24tPmJoKSB7Ci0JICBpZiAoIWNsZWFuZWQpIHsKLQkgICAgLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCi0JICAgICoqIGluIHRoZSBjdXJyZW50IHRyYW5zCi0JICAgICovCi0gICAgICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLQkgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7Ci0JICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoY24tPmJoKTsKLQkgICAgY2xlYW5lZCA9IDEgOwotCSAgICBwdXRfYmgoY24tPmJoKSA7Ci0JICAgIGlmIChhdG9taWNfcmVhZCgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgewotCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjEzODogY24tPmJoLT5iX2NvdW50IDwgMCIpOwotCSAgICB9Ci0JICB9Ci0JICBpZiAoY24tPmpsaXN0KSB7IC8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KLQkgICAgYXRvbWljX2RlYygmKGNuLT5qbGlzdC0+al9ub256ZXJvbGVuKSkgOwotCSAgfQotCSAgY24tPmJoID0gTlVMTCA7IAotCX0gCi0gICAgICB9Ci0gICAgICBjbiA9IGNuLT5obmV4dCA7Ci0gICAgfQotICB9CisJCS8qIGZpbmQgYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB3aXRoIHRoaXMgYmxvY2ssIG1ha2Ugc3VyZSB0aGV5IGRvbid0IHRyeSB0byB3cml0ZSBpdCBvdXQgKi8KKwkJY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAorCQkJCQkgIGJsb2NrbnIpOworCQl3aGlsZSAoY24pIHsKKwkJCWlmIChwX3Nfc2IgPT0gY24tPnNiICYmIGJsb2NrbnIgPT0gY24tPmJsb2NrbnIpIHsKKwkJCQlzZXRfYml0KEJMT0NLX0ZSRUVELCAmY24tPnN0YXRlKTsKKwkJCQlpZiAoY24tPmJoKSB7CisJCQkJCWlmICghY2xlYW5lZCkgeworCQkJCQkJLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCisJCQkJCQkgKiogaW4gdGhlIGN1cnJlbnQgdHJhbnMKKwkJCQkJCSAqLworCQkJCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPgorCQkJCQkJCQkJICAgYmgpOworCQkJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQkJCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGNuLT4KKwkJCQkJCQkJCSAgYmgpOworCQkJCQkJY2xlYW5lZCA9IDE7CisJCQkJCQlwdXRfYmgoY24tPmJoKTsKKwkJCQkJCWlmIChhdG9taWNfcmVhZAorCQkJCQkJICAgICgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkJCQkJICJqb3VybmFsLTIxMzg6IGNuLT5iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoY24tPmpsaXN0KSB7CS8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KKwkJCQkJCWF0b21pY19kZWMoJgorCQkJCQkJCSAgIChjbi0+amxpc3QtPgorCQkJCQkJCSAgICBqX25vbnplcm9sZW4pKTsKKwkJCQkJfQorCQkJCQljbi0+YmggPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWNuID0gY24tPmhuZXh0OworCQl9CisJfQogCi0gIGlmIChiaCkgewotICAgIHB1dF9iaChiaCkgOyAvKiBnZXRfaGFzaCBncmFicyB0aGUgYnVmZmVyICovCi0gICAgaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjE2NTogYmgtPmJfY291bnQgPCAwIik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwIDsKKwlpZiAoYmgpIHsKKwkJcHV0X2JoKGJoKTsJLyogZ2V0X2hhc2ggZ3JhYnMgdGhlIGJ1ZmZlciAqLworCQlpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMTY1OiBiaC0+Yl9jb3VudCA8IDAiKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKGlub2RlLT5pX3NiKTsKLSAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Cit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOwogfQogCiAvKgpAQCAtMzM1Nyw5OSArMzY4OSwxMDIgQEAKICAqIGlmIGEgdHJhbnNhY3Rpb24gd2FzIGFjdHVhbGx5IGNvbW1pdHRlZCBhbmQgdGhlIGJhcnJpZXIgd2FzIGRvbmUKICAqLwogc3RhdGljIGludCBfX2NvbW1pdF90cmFuc19qbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYiA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaW50IHJldCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIC8qIGlzIGl0IGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIG9yIGZyb20gYW4gdW5rbm93biB0cmFuc2FjdGlvbj8gKi8KLSAgICBpZiAoaWQgPT0gam91cm5hbC0+al90cmFuc19pZCkgewotCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOwotCS8qIHRyeSB0byBsZXQgb3RoZXIgd3JpdGVycyBjb21lIGluIGFuZCBncm93IHRoaXMgdHJhbnNhY3Rpb24gKi8KLQlsZXRfdHJhbnNhY3Rpb25fZ3JvdyhzYiwgaWQpOwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIGdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJLyogaXMgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgb3IgZnJvbSBhbiB1bmtub3duIHRyYW5zYWN0aW9uPyAqLworCWlmIChpZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkvKiB0cnkgdG8gbGV0IG90aGVyIHdyaXRlcnMgY29tZSBpbiBhbmQgZ3JvdyB0aGlzIHRyYW5zYWN0aW9uICovCisJCWxldF90cmFuc2FjdGlvbl9ncm93KHNiLCBpZCk7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlnb3RvIGZsdXNoX2NvbW1pdF9vbmx5OworCQl9CisKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHNiLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogc29tZW9uZSBtaWdodCBoYXZlIGVuZGVkIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugam9pbmVkICovCisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHNiLCBTQl9CVUZGRVJfV0lUSF9TQihzYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSk7CisJCQlyZXQgPSBqb3VybmFsX2VuZCgmdGgsIHNiLCAxKTsKKwkJCWdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJCX0KKworCQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IDE7CisKKwl9IGVsc2UgeworCQkvKiB0aGlzIGdldHMgdHJpY2t5LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgam91cm5hbCBsaXN0IGluCisJCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAorCQkgKiBpZiB3ZSd2ZSBnb3QgYSBsYXJnZXIgdHJhbnNhY3Rpb24gaWQgdGhhbiB0aGUgb2xkZXN0IGxpc3QKKwkJICovCisJICAgICAgZmx1c2hfY29tbWl0X29ubHk6CisJCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgeworCQkJLyoKKwkJCSAqIHdlIG9ubHkgc2V0IHJldCB0byAxIHdoZW4gd2Uga25vdyBmb3Igc3VyZQorCQkJICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAorCQkJICogYmxvY2suCisJCQkgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKKwkJCQlyZXQgPSAxOworCQkJZmx1c2hfY29tbWl0X2xpc3Qoc2IsIGpsLCAxKTsKKwkJCWlmIChqb3VybmFsLT5qX2Vycm5vKQorCQkJCXJldCA9IGpvdXJuYWwtPmpfZXJybm87CisJCX0KIAl9CisJLyogb3RoZXJ3aXNlIHRoZSBsaXN0IGlzIGdvbmUsIGFuZCBsb25nIHNpbmNlIGNvbW1pdHRlZCAqLworCXJldHVybiByZXQ7Cit9CiAKLQlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDEpIDsKLQlpZiAocmV0KQotCSAgICByZXR1cm4gcmV0OworaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkID0gUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9qbDsKIAotCS8qIHNvbWVvbmUgbWlnaHQgaGF2ZSBlbmRlZCB0aGlzIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSwgMSkgOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzYiwgU0JfQlVGRkVSX1dJVEhfU0Ioc2IpKSA7Ci0JICAgIHJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDEpIDsKLQkgICAgZ290byBmbHVzaF9jb21taXRfb25seTsKLQl9Ci0KLQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpIDsKLQlpZiAoIXJldCkKLQkgICAgcmV0ID0gMTsKLQotICAgIH0gZWxzZSB7Ci0JLyogdGhpcyBnZXRzIHRyaWNreSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGpvdXJuYWwgbGlzdCBpbgotCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAotCSAqIGlmIHdlJ3ZlIGdvdCBhIGxhcmdlciB0cmFuc2FjdGlvbiBpZCB0aGFuIHRoZSBvbGRlc3QgbGlzdAorCS8qIGZvciB0aGUgd2hvbGUgaW5vZGUsIGFzc3VtZSB1bnNldCBpZCBtZWFucyBpdCB3YXMKKwkgKiBjaGFuZ2VkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgTW9yZSBjb25zZXJ2YXRpdmUKIAkgKi8KLWZsdXNoX2NvbW1pdF9vbmx5OgotCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgewotCSAgICAvKgotCSAgICAgKiB3ZSBvbmx5IHNldCByZXQgdG8gMSB3aGVuIHdlIGtub3cgZm9yIHN1cmUKLQkgICAgICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAotCSAgICAgKiBibG9jay4KLQkgICAgICovCi0JICAgIGlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKLQkgICAgICAgIHJldCA9IDE7Ci0JICAgIGZsdXNoX2NvbW1pdF9saXN0KHNiLCBqbCwgMSkgOwotCSAgICBpZiAoam91cm5hbC0+al9lcnJubykKLQkJcmV0ID0gam91cm5hbC0+al9lcnJubzsKKwlpZiAoIWlkIHx8ICFqbCkgeworCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOworCQkvKiBqbCB3aWxsIGJlIHVwZGF0ZWQgaW4gX19jb21taXRfdHJhbnNfamwgKi8KIAl9Ci0gICAgfQotICAgIC8qIG90aGVyd2lzZSB0aGUgbGlzdCBpcyBnb25lLCBhbmQgbG9uZyBzaW5jZSBjb21taXR0ZWQgKi8KLSAgICByZXR1cm4gcmV0OworCisJcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwogfQogCi1pbnQgcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7Ci0gICAgdW5zaWduZWQgbG9uZyBpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfamw7Ci0KLSAgICAvKiBmb3IgdGhlIHdob2xlIGlub2RlLCBhc3N1bWUgdW5zZXQgaWQgbWVhbnMgaXQgd2FzCi0gICAgICogY2hhbmdlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIE1vcmUgY29uc2VydmF0aXZlCi0gICAgICovCi0gICAgaWYgKCFpZCB8fCAhamwpIHsKLQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotCS8qIGpsIHdpbGwgYmUgdXBkYXRlZCBpbiBfX2NvbW1pdF90cmFuc19qbCAqLwotICAgIH0KLQotICAgcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwordm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnJlc3RvcmVfcHJlcGFyZWQpOworCWlmICghYmgpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKSAmJgorCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKKwkJCQkJICBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwKKwkJCQkJICBiaC0+Yl9ibG9ja25yKTsKKwkJaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKKwkJCXNldF9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0KKwljbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZChiaCk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5yZXN0b3JlX3ByZXBhcmVkICk7Ci0gICAgaWYgKCFiaCkgewotCXJldHVybiA7Ci0gICAgfQotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKSAmJgotCWJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgewotCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAotCQkJCSAgYmgtPmJfYmxvY2tucik7Ci0JaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKLSAgICAgICAgICAgIHNldF9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0JICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotfQotCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiIDsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAvKgogKiogYmVmb3JlIHdlIGNhbiBjaGFuZ2UgYSBtZXRhZGF0YSBibG9jaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgd29uJ3QKICoqIGJlIHdyaXR0ZW4gdG8gZGlzayB3aGlsZSB3ZSBhcmUgYWx0ZXJpbmcgaXQuICBTbywgd2UgbXVzdDoKQEAgLTM0NTgsMzkgKzM3OTMsNDEgQEAKICoqIAogKi8KIGludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KSB7Ci0gIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5wcmVwYXJlICk7CisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KQoreworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnByZXBhcmUpOwogCi0gICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JaWYgKCF3YWl0KQotCSAgICByZXR1cm4gMDsKLQlsb2NrX2J1ZmZlcihiaCk7Ci0gICAgfQotICAgIHNldF9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSAgewotICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0gICAgICAgIHNldF9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7Ci0gICAgfQotICAgIHVubG9ja19idWZmZXIoYmgpOwotICAgIHJldHVybiAxOworCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQlpZiAoIXdhaXQpCisJCQlyZXR1cm4gMDsKKwkJbG9ja19idWZmZXIoYmgpOworCX0KKwlzZXRfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7CisJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOworCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShiaCk7CisJfQorCXVubG9ja19idWZmZXIoYmgpOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworc3RhdGljIHZvaWQgZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl0aW1lX3Qgbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotICAgIHdoaWxlKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLSAgICAgICAgZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OwotCWpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKLQkvKiB0aGlzIGNoZWNrIHNob3VsZCBhbHdheXMgYmUgcnVuLCB0byBzZW5kIG9sZCBsaXN0cyB0byBkaXNrICovCi0JaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7Ci0JICAgIGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0JfSBlbHNlIHsKLQkgICAgYnJlYWs7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCS8qIHRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBydW4sIHRvIHNlbmQgb2xkIGxpc3RzIHRvIGRpc2sgKi8KKwkJaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7CisJCQlmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMocywgamwpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KIAl9Ci0gICAgfQogfQogCiAvKiAKQEAgLTM1MDMsMzc0ICszODQwLDM5MCBAQAogKiogSWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCwgd2UganVzdCBjbGVhbiB1cC4gVGhpbmdzIGxpa2UgZmx1c2hpbmcKICoqIGpvdXJuYWwgbGlzdHMsIGV0YyBqdXN0IHdvbid0IGhhcHBlbi4KICovCi1zdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsIAotCQkgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbmV4dCwgKmpsX2NuOyAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjIDsgCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsgCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqY19iaCA7IC8qIGNvbW1pdCBiaCAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOyAvKiBkZXNjIGJoICovCi0gIGludCBjdXJfd3JpdGVfc3RhcnQgPSAwIDsgLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KLSAgaW50IG9sZF9zdGFydCA7Ci0gIGludCBpIDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqc2FmZTsKLSAgdW5zaWduZWQgbG9uZyBqaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpuZXh0LCAqamxfY247CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoOwkvKiBjb21taXQgYmggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CS8qIGRlc2MgYmggKi8KKwlpbnQgY3VyX3dyaXRlX3N0YXJ0ID0gMDsJLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KKwlpbnQgb2xkX3N0YXJ0OworCWludCBpOworCWludCBmbHVzaCA9IGZsYWdzICYgRkxVU0hfQUxMOworCWludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpzYWZlOworCXVuc2lnbmVkIGxvbmcgamluZGV4OworCXVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOworCWludCB0cmFuc19oYWxmOwogCi0gIEJVR19PTiAodGgtPnRfcmVmY291bnQgPiAxKTsKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTih0aC0+dF9yZWZjb3VudCA+IDEpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kIik7Ci0gIGlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7Ci0gICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgfQorCXB1dF9mc19leGNsKCk7CisJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJqb3VybmFsIGVuZCIpOworCWlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkgICAgIDEpOworCQlqb3VybmFsX21hcmtfZGlydHkodGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJfQogCi0gIGxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmxhZ3MgfD0gRkxVU0hfQUxMIDsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0gIGlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKLSAgICBmbGFncyB8PSBDT01NSVRfTk9XIHwgV0FJVDsKLSAgICB3YWl0X29uX2NvbW1pdCA9IDE7Ci0gIH0KKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gRkxVU0hfQUxMOworCQlmbHVzaCA9IDE7CisJfQorCWlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gQ09NTUlUX05PVyB8IFdBSVQ7CisJCXdhaXRfb25fY29tbWl0ID0gMTsKKwl9CiAKLSAgLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAotICAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCi0gICovCi0gIGlmICghY2hlY2tfam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgZmxhZ3MpKSB7Ci0gICAgcF9zX3NiLT5zX2RpcnQgPSAxOwotICAgIHdha2VfcXVldWVkX3dyaXRlcnMocF9zX3NiKTsKLSAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHBfc19zYik7Ci0gICAgZ290byBvdXQgOwotICB9CisJLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAorCSAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCisJICovCisJaWYgKCFjaGVja19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCBuYmxvY2tzLCBmbGFncykpIHsKKwkJcF9zX3NiLT5zX2RpcnQgPSAxOworCQl3YWtlX3F1ZXVlZF93cml0ZXJzKHBfc19zYik7CisJCXJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQocF9zX3NiKTsKKwkJZ290byBvdXQ7CisJfQogCi0gIC8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmx1c2ggPSAxIDsKLSAgfQorCS8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmx1c2ggPSAxOworCX0KIAotICAvKgotICAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgotICAqKiB0aGlzIHRyYW5zYWN0aW9uCi0gICovCi0gIGlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDApIHsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0KKwkvKgorCSAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgorCSAqKiB0aGlzIHRyYW5zYWN0aW9uCisJICovCisJaWYgKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgeworCQlmbHVzaCA9IDE7CisJfQogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi0gIC8qIHF1b3RhIG9wcyBtaWdodCBuZWVkIHRvIG5lc3QsIHNldHVwIHRoZSBqb3VybmFsX2luZm8gcG9pbnRlciBmb3IgdGhlbSAqLwotICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aCA7Ci0gIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHRoKTsgLyogaXQgc2hvdWxkIG5vdCBpbnZvbHZlIG5ldyBibG9ja3MgaW50bwotCQkJCSAgICAgICogdGhlIHRyYW5zYWN0aW9uICovCi0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlIDsKKwkvKiBxdW90YSBvcHMgbWlnaHQgbmVlZCB0byBuZXN0LCBzZXR1cCB0aGUgam91cm5hbF9pbmZvIHBvaW50ZXIgZm9yIHRoZW0gKi8KKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwlyZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyh0aCk7CS8qIGl0IHNob3VsZCBub3QgaW52b2x2ZSBuZXcgYmxvY2tzIGludG8KKwkJCQkJCSAqIHRoZSB0cmFuc2FjdGlvbiAqLworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwogI2VuZGlmCi0gIAotICAvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLwotICBkX2JoID0gam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQpIDsKLSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShkX2JoKTsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopKGRfYmgpLT5iX2RhdGEgOwotICBtZW1zZXQoZF9iaC0+Yl9kYXRhLCAwLCBkX2JoLT5iX3NpemUpIDsKLSAgbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMgKGRfYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpIDsKLSAgc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCkgOwogCi0gIC8qIHNldHVwIGNvbW1pdCBibG9jay4gIERvbid0IHdyaXRlIChrZWVwIGl0IGNsZWFuIHRvbykgdGhpcyBvbmUgdW50aWwgYWZ0ZXIgZXZlcnlvbmUgZWxzZSBpcyB3cml0dGVuICovCi0gIGNfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIG1lbXNldChjX2JoLT5iX2RhdGEsIDAsIGNfYmgtPmJfc2l6ZSkgOwotICBzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCkgOwotICBzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpIDsKKwkvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLworCWRfYmggPQorCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICBqb3VybmFsLT5qX3N0YXJ0KTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGRfYmgpOworCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKShkX2JoKS0+Yl9kYXRhOworCW1lbXNldChkX2JoLT5iX2RhdGEsIDAsIGRfYmgtPmJfc2l6ZSk7CisJbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMoZF9iaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CiAKLSAgLyogaW5pdCB0aGlzIGpvdXJuYWwgbGlzdCAqLwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwkvKiBzZXR1cCBjb21taXQgYmxvY2suICBEb24ndCB3cml0ZSAoa2VlcCBpdCBjbGVhbiB0b28pIHRoaXMgb25lIHVudGlsIGFmdGVyIGV2ZXJ5b25lIGVsc2UgaXMgd3JpdHRlbiAqLworCWNfYmggPSBqb3VybmFsX2dldGJsayhwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgICgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfbGVuICsKKwkJCQkxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpOworCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJbWVtc2V0KGNfYmgtPmJfZGF0YSwgMCwgY19iaC0+Yl9zaXplKTsKKwlzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShjX2JoKTsKIAotICAvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKLSAgICogd2Ugd2FudCB0byBtYWtlIHN1cmUgbm9ib2R5IHRyaWVzIHRvIHJ1biBmbHVzaF9jb21taXRfbGlzdCB1bnRpbAotICAgKiB0aGUgbmV3IHRyYW5zYWN0aW9uIGlzIGZ1bGx5IHNldHVwLCBhbmQgd2UndmUgYWxyZWFkeSBmbHVzaGVkIHRoZQotICAgKiBvcmRlcmVkIGJoIGxpc3QKLSAgICovCi0gIGRvd24oJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvKiBpbml0IHRoaXMgam91cm5hbCBsaXN0ICovCisJamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CiAKLSAgLyogc2F2ZSB0aGUgdHJhbnNhY3Rpb24gaWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNvbW1pdCBpdCBsYXRlciAqLwotICBjb21taXRfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKKwkgKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gcnVuIGZsdXNoX2NvbW1pdF9saXN0IHVudGlsCisJICogdGhlIG5ldyB0cmFuc2FjdGlvbiBpcyBmdWxseSBzZXR1cCwgYW5kIHdlJ3ZlIGFscmVhZHkgZmx1c2hlZCB0aGUKKwkgKiBvcmRlcmVkIGJoIGxpc3QKKwkgKi8KKwlkb3duKCZqbC0+al9jb21taXRfbG9jayk7CiAKLSAgYXRvbWljX3NldCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lLCAwKSA7Ci0gIGpsLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Ci0gIGpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA7Ci0gIGpsLT5qX2NvbW1pdF9iaCA9IGNfYmggOwotICBqbC0+al9zdGFydCA9IGpvdXJuYWwtPmpfc3RhcnQgOwotICBqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbiA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX25vbnplcm9sZW4sIGpvdXJuYWwtPmpfbGVuKSA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX2NvbW1pdF9sZWZ0LCBqb3VybmFsLT5qX2xlbiArIDIpOwotICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKwkvKiBzYXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBpbiBjYXNlIHdlIG5lZWQgdG8gY29tbWl0IGl0IGxhdGVyICovCisJY29tbWl0X3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KLSAgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCi0gICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jawotICAqLwotICB0cmFuc19oYWxmID0gam91cm5hbF90cmFuc19oYWxmKHBfc19zYi0+c19ibG9ja3NpemUpOwotICBmb3IgKGkgPSAwLCBjbiA9IGpvdXJuYWwtPmpfZmlyc3QgOyBjbiA7IGNuID0gY24tPm5leHQsIGkrKykgewotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBqbF9jbiA9IGdldF9jbm9kZShwX3Nfc2IpIDsKLSAgICAgIGlmICghamxfY24pIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNjc2LCBnZXRfY25vZGUgcmV0dXJuZWQgTlVMTFxuIikgOwotICAgICAgfQotICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICBqbC0+al9yZWFsYmxvY2sgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBqbF9jbi0+cHJldiA9IGxhc3RfY24gOwotICAgICAgamxfY24tPm5leHQgPSBOVUxMIDsKLSAgICAgIGlmIChsYXN0X2NuKSB7Ci0gICAgICAgIGxhc3RfY24tPm5leHQgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBsYXN0X2NuID0gamxfY24gOwotICAgICAgLyogbWFrZSBzdXJlIHRoZSBibG9jayB3ZSBhcmUgdHJ5aW5nIHRvIGxvZyBpcyBub3QgYSBibG9jayAKLSAgICAgICAgIG9mIGpvdXJuYWwgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCWF0b21pY19zZXQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSwgMCk7CisJamwtPmpfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCWpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZTsKKwlqbC0+al9jb21taXRfYmggPSBjX2JoOworCWpsLT5qX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbjsKKwlhdG9taWNfc2V0KCZqbC0+al9ub256ZXJvbGVuLCBqb3VybmFsLT5qX2xlbik7CisJYXRvbWljX3NldCgmamwtPmpfY29tbWl0X2xlZnQsIGpvdXJuYWwtPmpfbGVuICsgMik7CisJamwtPmpfcmVhbGJsb2NrID0gTlVMTDsKIAotICAgICAgaWYgKGlzX2Jsb2NrX2luX2xvZ19vcl9yZXNlcnZlZF9hcmVhKHBfc19zYiwgY24tPmJoLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMjMzMjogVHJ5aW5nIHRvIGxvZyBibG9jayAlbHUsIHdoaWNoIGlzIGEgbG9nIGJsb2NrXG4iLCBjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfQotICAgICAgamxfY24tPmJsb2NrbnIgPSBjbi0+YmgtPmJfYmxvY2tuciA7IAotICAgICAgamxfY24tPnN0YXRlID0gMCA7Ci0gICAgICBqbF9jbi0+c2IgPSBwX3Nfc2I7Ci0gICAgICBqbF9jbi0+YmggPSBjbi0+YmggOwotICAgICAgamxfY24tPmpsaXN0ID0gamw7Ci0gICAgICBpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbF9jbikgOwotICAgICAgaWYgKGkgPCB0cmFuc19oYWxmKSB7Ci0JZGVzYy0+al9yZWFsYmxvY2tbaV0gPSBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfSBlbHNlIHsKLQljb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSA9IGNwdV90b19sZTMyKGNuLT5iaC0+Yl9ibG9ja25yKSA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGktLSA7Ci0gICAgfQotICB9Ci0gIHNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbikgOwotICBzZXRfZGVzY19tb3VudF9pZChkZXNjLCBqb3VybmFsLT5qX21vdW50X2lkKSA7Ci0gIHNldF9kZXNjX3RyYW5zX2lkKGRlc2MsIGpvdXJuYWwtPmpfdHJhbnNfaWQpIDsKLSAgc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CisJLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KKwkgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCisJICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jaworCSAqLworCXRyYW5zX2hhbGYgPSBqb3VybmFsX3RyYW5zX2hhbGYocF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJZm9yIChpID0gMCwgY24gPSBqb3VybmFsLT5qX2ZpcnN0OyBjbjsgY24gPSBjbi0+bmV4dCwgaSsrKSB7CisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCWpsX2NuID0gZ2V0X2Nub2RlKHBfc19zYik7CisJCQlpZiAoIWpsX2NuKSB7CisJCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTY3NiwgZ2V0X2Nub2RlIHJldHVybmVkIE5VTExcbiIpOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCWpsLT5qX3JlYWxibG9jayA9IGpsX2NuOworCQkJfQorCQkJamxfY24tPnByZXYgPSBsYXN0X2NuOworCQkJamxfY24tPm5leHQgPSBOVUxMOworCQkJaWYgKGxhc3RfY24pIHsKKwkJCQlsYXN0X2NuLT5uZXh0ID0gamxfY247CisJCQl9CisJCQlsYXN0X2NuID0gamxfY247CisJCQkvKiBtYWtlIHN1cmUgdGhlIGJsb2NrIHdlIGFyZSB0cnlpbmcgdG8gbG9nIGlzIG5vdCBhIGJsb2NrIAorCQkJICAgb2Ygam91cm5hbCBvciByZXNlcnZlZCBhcmVhICovCiAKLSAgLyogc3BlY2lhbCBjaGVjayBpbiBjYXNlIGFsbCBidWZmZXJzIGluIHRoZSBqb3VybmFsIHdlcmUgbWFya2VkIGZvciBub3QgbG9nZ2luZyAqLwotICBpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgewotICAgIEJVRygpOwotICB9CisJCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJCSAgICAocF9zX3NiLCBjbi0+YmgtPmJfYmxvY2tucikpIHsKKwkJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJCSAgICAgICAiam91cm5hbC0yMzMyOiBUcnlpbmcgdG8gbG9nIGJsb2NrICVsdSwgd2hpY2ggaXMgYSBsb2cgYmxvY2tcbiIsCisJCQkJCSAgICAgICBjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9CisJCQlqbF9jbi0+YmxvY2tuciA9IGNuLT5iaC0+Yl9ibG9ja25yOworCQkJamxfY24tPnN0YXRlID0gMDsKKwkJCWpsX2NuLT5zYiA9IHBfc19zYjsKKwkJCWpsX2NuLT5iaCA9IGNuLT5iaDsKKwkJCWpsX2NuLT5qbGlzdCA9IGpsOworCQkJaW5zZXJ0X2pvdXJuYWxfaGFzaChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamxfY24pOworCQkJaWYgKGkgPCB0cmFuc19oYWxmKSB7CisJCQkJZGVzYy0+al9yZWFsYmxvY2tbaV0gPQorCQkJCSAgICBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9IGVsc2UgeworCQkJCWNvbW1pdC0+al9yZWFsYmxvY2tbaSAtIHRyYW5zX2hhbGZdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoY24tPmJoLT5iX2Jsb2NrbnIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaS0tOworCQl9CisJfQorCXNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbik7CisJc2V0X2Rlc2NfbW91bnRfaWQoZGVzYywgam91cm5hbC0+al9tb3VudF9pZCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CiAKLSAgLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jawotICAgKiBkaXJ0eSBub3cgdG9vLiAgRG9uJ3QgbWFyayB0aGUgY29tbWl0IGJsb2NrIGRpcnR5IHVudGlsIGFsbCB0aGUKLSAgICogb3RoZXJzIGFyZSBvbiBkaXNrCi0gICAqLwotICBtYXJrX2J1ZmZlcl9kaXJ0eShkX2JoKTsKKwkvKiBzcGVjaWFsIGNoZWNrIGluIGNhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgd2VyZSBtYXJrZWQgZm9yIG5vdCBsb2dnaW5nICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQogCi0gIC8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KLSAgY3VyX3dyaXRlX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydCA7Ci0gIGNuID0gam91cm5hbC0+al9maXJzdCA7Ci0gIGppbmRleCA9IDEgOyAvKiBzdGFydCBhdCBvbmUgc28gd2UgZG9uJ3QgZ2V0IHRoZSBkZXNjIGFnYWluICovCi0gIHdoaWxlKGNuKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgIC8qIGNvcHkgYWxsIHRoZSByZWFsIGJsb2NrcyBpbnRvIGxvZyBhcmVhLiAgZGlydHkgbG9nIGJsb2NrcyAqLwotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaCA7Ci0gICAgICBjaGFyICphZGRyOwotICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgICB0bXBfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgICAgICAgKChjdXJfd3JpdGVfc3RhcnQgKyBqaW5kZXgpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSh0bXBfYmgpOwotICAgICAgcGFnZSA9IGNuLT5iaC0+Yl9wYWdlOwotICAgICAgYWRkciA9IGttYXAocGFnZSk7Ci0gICAgICBtZW1jcHkodG1wX2JoLT5iX2RhdGEsIGFkZHIgKyBvZmZzZXRfaW5fcGFnZShjbi0+YmgtPmJfZGF0YSksCi0gICAgICAgICAgICAgY24tPmJoLT5iX3NpemUpOwotICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgbWFya19idWZmZXJfZGlydHkodG1wX2JoKTsKLSAgICAgIGppbmRleCsrIDsKLSAgICAgIHNldF9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLSAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEpEaXJ0eSBjbGVhcmVkIHNvbWV0aW1lIGR1cmluZyB0cmFuc2FjdGlvbi4gIGRvbid0IGxvZyB0aGlzIG9uZSAqLwotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpIDsKLSAgICAgIGJyZWxzZShjbi0+YmgpIDsKLSAgICB9Ci0gICAgbmV4dCA9IGNuLT5uZXh0IDsKLSAgICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgICBjbiA9IG5leHQgOwotICAgIGNvbmRfcmVzY2hlZCgpOwotICB9CisJLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jaworCSAqIGRpcnR5IG5vdyB0b28uICBEb24ndCBtYXJrIHRoZSBjb21taXQgYmxvY2sgZGlydHkgdW50aWwgYWxsIHRoZQorCSAqIG90aGVycyBhcmUgb24gZGlzaworCSAqLworCW1hcmtfYnVmZmVyX2RpcnR5KGRfYmgpOwogCi0gIC8qIHdlIGFyZSBkb25lICB3aXRoIGJvdGggdGhlIGNfYmggYW5kIGRfYmgsIGJ1dAotICAqKiBjX2JoIG11c3QgYmUgd3JpdHRlbiBhZnRlciBhbGwgb3RoZXIgY29tbWl0IGJsb2NrcywKLSAgKiogc28gd2UgZGlydHkvcmVsc2UgY19iaCBpbiBmbHVzaF9jb21taXRfbGlzdCwgd2l0aCBjb21taXRfbGVmdCA8PSAxLgotICAqLworCS8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KKwljdXJfd3JpdGVfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWNuID0gam91cm5hbC0+al9maXJzdDsKKwlqaW5kZXggPSAxOwkJLyogc3RhcnQgYXQgb25lIHNvIHdlIGRvbid0IGdldCB0aGUgZGVzYyBhZ2FpbiAqLworCXdoaWxlIChjbikgeworCQljbGVhcl9idWZmZXJfam91cm5hbF9uZXcoY24tPmJoKTsKKwkJLyogY29weSBhbGwgdGhlIHJlYWwgYmxvY2tzIGludG8gbG9nIGFyZWEuICBkaXJ0eSBsb2cgYmxvY2tzICovCisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wX2JoOworCQkJY2hhciAqYWRkcjsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCQkJdG1wX2JoID0KKwkJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJCSAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCQkJICAgKChjdXJfd3JpdGVfc3RhcnQgKworCQkJCQkgICAgIGppbmRleCkgJQorCQkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHRtcF9iaCk7CisJCQlwYWdlID0gY24tPmJoLT5iX3BhZ2U7CisJCQlhZGRyID0ga21hcChwYWdlKTsKKwkJCW1lbWNweSh0bXBfYmgtPmJfZGF0YSwKKwkJCSAgICAgICBhZGRyICsgb2Zmc2V0X2luX3BhZ2UoY24tPmJoLT5iX2RhdGEpLAorCQkJICAgICAgIGNuLT5iaC0+Yl9zaXplKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KHRtcF9iaCk7CisJCQlqaW5kZXgrKzsKKwkJCXNldF9idWZmZXJfam91cm5hbF9kaXJ0eShjbi0+YmgpOworCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChjbi0+YmgpOworCQl9IGVsc2UgeworCQkJLyogSkRpcnR5IGNsZWFyZWQgc29tZXRpbWUgZHVyaW5nIHRyYW5zYWN0aW9uLiAgZG9uJ3QgbG9nIHRoaXMgb25lICovCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpOworCQkJYnJlbHNlKGNuLT5iaCk7CisJCX0KKwkJbmV4dCA9IGNuLT5uZXh0OworCQlmcmVlX2Nub2RlKHBfc19zYiwgY24pOworCQljbiA9IG5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwgPSBhbGxvY19qb3VybmFsX2xpc3QocF9zX3NiKTsKKwkvKiB3ZSBhcmUgZG9uZSAgd2l0aCBib3RoIHRoZSBjX2JoIGFuZCBkX2JoLCBidXQKKwkgKiogY19iaCBtdXN0IGJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIG90aGVyIGNvbW1pdCBibG9ja3MsCisJICoqIHNvIHdlIGRpcnR5L3JlbHNlIGNfYmggaW4gZmx1c2hfY29tbWl0X2xpc3QsIHdpdGggY29tbWl0X2xlZnQgPD0gMS4KKwkgKi8KIAotICAvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCi0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX2xpc3QsICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCk7Ci0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX3dvcmtpbmdfbGlzdCwgJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgam91cm5hbC0+al9udW1fd29ya19saXN0cysrOworCWpvdXJuYWwtPmpfY3VycmVudF9qbCA9IGFsbG9jX2pvdXJuYWxfbGlzdChwX3Nfc2IpOwogCi0gIC8qIHJlc2V0IGpvdXJuYWwgdmFsdWVzIGZvciB0aGUgbmV4dCB0cmFuc2FjdGlvbiAqLwotICBvbGRfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgam91cm5hbC0+al9zdGFydCA9IChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBqb3VybmFsLT5qX2Jjb3VudCA9IDAgOwotICBqb3VybmFsLT5qX2xhc3QgPSBOVUxMIDsKLSAgam91cm5hbC0+al9maXJzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2xlbiA9IDAgOwotICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19pZCsrIDsKLSAgam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMCA7Ci0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOyAKKwkvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmamwtPmpfbGlzdCwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZqbC0+al93b3JraW5nX2xpc3QsICZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJam91cm5hbC0+al9udW1fd29ya19saXN0cysrOwogCi0gIC8vIG1ha2Ugc3VyZSByZWlzZXJmc19hZGRfamggc2VlcyB0aGUgbmV3IGN1cnJlbnRfamwgYmVmb3JlIHdlCi0gIC8vIHdyaXRlIG91dCB0aGUgdGFpbHMKLSAgc21wX21iKCk7CisJLyogcmVzZXQgam91cm5hbCB2YWx1ZXMgZm9yIHRoZSBuZXh0IHRyYW5zYWN0aW9uICovCisJb2xkX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqb3VybmFsLT5qX3N0YXJ0ID0KKwkgICAgKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX2xlbiArCisJICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKKwlhdG9taWNfc2V0KCYoam91cm5hbC0+al93Y291bnQpLCAwKTsKKwlqb3VybmFsLT5qX2Jjb3VudCA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMDsKKwlqb3VybmFsLT5qX3RyYW5zX2lkKys7CisJam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMDsKKwlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAwOworCWluaXRfam91cm5hbF9oYXNoKHBfc19zYik7CiAKLSAgLyogdGFpbCBjb252ZXJzaW9uIHRhcmdldHMgaGF2ZSB0byBoaXQgdGhlIGRpc2sgYmVmb3JlIHdlIGVuZCB0aGUKLSAgICogdHJhbnNhY3Rpb24uICBPdGhlcndpc2UgYSBsYXRlciB0cmFuc2FjdGlvbiBtaWdodCByZXBhY2sgdGhlIHRhaWwKLSAgICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCi0gICAqIGNsZWFuLCBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIGxhdGVyIHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZSBkYXRhIGJsb2NrCi0gICAqIGlzIGxvc3QuCi0gICAqLwotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpIHsKLSAgICAgIHVubG9ja19rZXJuZWwoKTsKLSAgICAgIHdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCi0JCQkgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCi0gICAgICBCVUcoKTsKLSAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvLyBtYWtlIHN1cmUgcmVpc2VyZnNfYWRkX2poIHNlZXMgdGhlIG5ldyBjdXJyZW50X2psIGJlZm9yZSB3ZQorCS8vIHdyaXRlIG91dCB0aGUgdGFpbHMKKwlzbXBfbWIoKTsKIAotICAvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCi0gICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93Ci0gICoqCi0gICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCi0gICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yawotICAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KLSAgKi8KLSAgaWYgKGZsdXNoKSB7Ci0gICAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICAgIGZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKSA7Ci0gIH0gZWxzZSBpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfQ09NTUlUX1BFTkRJTkcpKQotICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhjb21taXRfd3EsICZqb3VybmFsLT5qX3dvcmssIEhaLzEwKTsKKwkvKiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBoYXZlIHRvIGhpdCB0aGUgZGlzayBiZWZvcmUgd2UgZW5kIHRoZQorCSAqIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGEgbGF0ZXIgdHJhbnNhY3Rpb24gbWlnaHQgcmVwYWNrIHRoZSB0YWlsCisJICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCisJICogY2xlYW4sIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgbGF0ZXIgdHJhbnNhY3Rpb24gY29tbWl0cywgdGhlIGRhdGEgYmxvY2sKKwkgKiBpcyBsb3N0LgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisJCQkJICAgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOworCQlsb2NrX2tlcm5lbCgpOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCisJCUJVRygpOworCXVwKCZqbC0+al9jb21taXRfbG9jayk7CiAKKwkvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCisJICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93CisJICoqCisJICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCisJICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yaworCSAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KKwkgKi8KKwlpZiAoZmx1c2gpIHsKKwkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKTsKKwl9IGVsc2UgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0NPTU1JVF9QRU5ESU5HKSkKKwkJcXVldWVfZGVsYXllZF93b3JrKGNvbW1pdF93cSwgJmpvdXJuYWwtPmpfd29yaywgSFogLyAxMCk7CiAKLSAgLyogaWYgdGhlIG5leHQgdHJhbnNhY3Rpb24gaGFzIGFueSBjaGFuY2Ugb2Ygd3JhcHBpbmcsIGZsdXNoIAotICAqKiB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBnZXQgb3ZlcndyaXR0ZW4uICBJZiBhbnkgam91cm5hbCBsaXN0cyBhcmUgdmVyeSAKLSAgKiogb2xkIGZsdXNoIHRoZW0gYXMgd2VsbC4gIAotICAqLwotZmlyc3Rfamw6Ci0gIGxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7Ci0gICAgdGVtcF9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgaWYgKGpvdXJuYWwtPmpfc3RhcnQgPD0gdGVtcF9qbC0+al9zdGFydCkgewotICAgICAgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA+PQotICAgICAgICAgIHRlbXBfamwtPmpfc3RhcnQpCi0gICAgICB7Ci0JZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHBfc19zYiwgdGVtcF9qbCk7Ci0JZ290byBmaXJzdF9qbDsKLSAgICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8Ci0JCSAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKQotICAgICAgewotICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGNyb3NzIGludG8gdGhlIG5leHQgdHJhbnNhY3Rpb24gYW5kIHdlIGRvbid0Ci0JICAgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucwotCSAgICogYnJlYWsgbm93Ci0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgPgotCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpCi0gICAgewotICAgICAgaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQotICAgICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSA+PSB0ZW1wX2psLT5qX3N0YXJ0KQotICAgICAgewotCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOwotCWdvdG8gZmlyc3Rfamw7Ci0gICAgICB9IGVsc2UgewotCSAgLyogd2UgZG9uJ3Qgb3ZlcmxhcCBhbnl0aGluZyBmcm9tIG91dCBzdGFydCB0byB0aGUgZW5kIG9mIHRoZQotCSAgICogbG9nLCBhbmQgb3VyIHdyYXBwZWQgcG9ydGlvbiBkb2Vzbid0IG92ZXJsYXAgYW55dGhpbmcgYXQKLQkgICAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCi0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhwX3Nfc2IpOworCS8qIGlmIHRoZSBuZXh0IHRyYW5zYWN0aW9uIGhhcyBhbnkgY2hhbmNlIG9mIHdyYXBwaW5nLCBmbHVzaCAKKwkgKiogdHJhbnNhY3Rpb25zIHRoYXQgbWlnaHQgZ2V0IG92ZXJ3cml0dGVuLiAgSWYgYW55IGpvdXJuYWwgbGlzdHMgYXJlIHZlcnkgCisJICoqIG9sZCBmbHVzaCB0aGVtIGFzIHdlbGwuICAKKwkgKi8KKyAgICAgIGZpcnN0X2psOgorCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCXRlbXBfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlpZiAoam91cm5hbC0+al9zdGFydCA8PSB0ZW1wX2psLT5qX3N0YXJ0KSB7CisJCQlpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCQkgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8CisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCQkJLyogaWYgd2UgZG9uJ3QgY3Jvc3MgaW50byB0aGUgbmV4dCB0cmFuc2FjdGlvbiBhbmQgd2UgZG9uJ3QKKwkJCQkgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucworCQkJCSAqIGJyZWFrIG5vdworCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCSAgICBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID4KKwkJCSAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgeworCQkJaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQorCQkJICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGRvbid0IG92ZXJsYXAgYW55dGhpbmcgZnJvbSBvdXQgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUKKwkJCQkgKiBsb2csIGFuZCBvdXIgd3JhcHBlZCBwb3J0aW9uIGRvZXNuJ3Qgb3ZlcmxhcCBhbnl0aGluZyBhdAorCQkJCSAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMocF9zX3NiKTsKIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpIDsKKwlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPQorCSAgICBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpOwogCi0gIGlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKLSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpIDsKLSAgfQorCWlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKKwkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJICAgICAgICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpOworCX0KIAotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIC8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLwotICBjbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOwotICB3YWtlX3VwKCYoam91cm5hbC0+al9qb2luX3dhaXQpKSA7CisJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAwKTsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCS8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLworCWNsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmKGpvdXJuYWwtPmpfam9pbl93YWl0KSk7CiAKLSAgaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgotICAgICAgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHBfc19zYiwgY29tbWl0X3RyYW5zX2lkKSkgewotCSAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICB9Ci1vdXQ6Ci0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbCBlbmQyIik7CisJaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgorCSAgICBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCBjb21taXRfdHJhbnNfaWQpKSB7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKyAgICAgIG91dDoKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kMiIpOwogCi0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CisJbWVtc2V0KHRoLCAwLCBzaXplb2YoKnRoKSk7CisJLyogUmUtc2V0IHRoLT50X3N1cGVyLCBzbyB3ZSBjYW4gcHJvcGVybHkga2VlcCB0cmFjayBvZiBob3cgbWFueQorCSAqIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb25zIHRoZXJlIGFyZS4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIGlmIHRoaXMKKwkgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KKwl0aC0+dF9zdXBlciA9IHBfc19zYjsKIAotICByZXR1cm4gam91cm5hbC0+al9lcnJubzsKKwlyZXR1cm4gam91cm5hbC0+al9lcnJubzsKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKLSAgICBpZiAodGVzdF9iaXQgKEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICByZXR1cm47CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKKwkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUoc2IpKTsKIAotICAgIHNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLSAgICBzZXRfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJc2V0X2JpdChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGR1bXBfc3RhY2soKTsKKwlkdW1wX3N0YWNrKCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9zb2Z0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCitzdGF0aWMgdm9pZCBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaWYgKHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgcmV0dXJuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzYik7CisJaWYgKHRlc3RfYml0KEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlyZXR1cm47CiAKLSAgICBpZiAoIWpvdXJuYWwtPmpfZXJybm8pCi0gICAgICAgIGpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKKwlpZiAoIWpvdXJuYWwtPmpfZXJybm8pCisJCWpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKIAotICAgIF9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzYik7CisJX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc2IpOwogfQogCi12b2lkCi1yZWlzZXJmc19qb3VybmFsX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCit2b2lkIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKQogewotICAgIHJldHVybiBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdCAoc2IsIGVycm5vKTsKKwlyZXR1cm4gX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X3NvZnQoc2IsIGVycm5vKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMgYi9mcy9yZWlzZXJmcy9sYmFsYW5jZS5jCmluZGV4IDI0MDY2MDguLjI1MzNjMWYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMKKysrIGIvZnMvcmVpc2VyZnMvbGJhbGFuY2UuYwpAQCAtMjEsNjQ4ICsyMSw3MDkgQEAKICAgIGxlYWZfcGFzdGVfZW50cmllcwogICAgKi8KIAotCiAvKiBjb3B5IGNvcHlfY291bnQgZW50cmllcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgaXRlbSB0byBkZXN0IGJ1ZmZlciAoY3JlYXRpbmcgbmV3IGl0ZW0gaWYgbmVlZGVkKSAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzb3VyY2UsIAotCQkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKK3N0YXRpYyB2b2lkIGxlYWZfY29weV9kaXJfZW50cmllcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNvdXJjZSwgaW50IGxhc3RfZmlyc3QsCisJCQkJICBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7Ci0gICAgaW50IGl0ZW1fbnVtX2luX2Rlc3Q7CQkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKLQkJCQkJICAgb3IgaWYgd2UgbXVzdCBjcmVhdGUgYSBuZXcgaXRlbSwKLQkJCQkJICAgdGhlIG51bWJlciBvZiB0aGUgaXRlbSB3ZSB3aWxsCi0JCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGludCBjb3B5X3JlY29yZHNfbGVuOwkJCS8qIGxlbmd0aCBvZiBhbGwgcmVjb3JkcyBpbiBpdGVtIHRvIGJlIGNvcGllZCAqLwotICAgIGNoYXIgKiByZWNvcmRzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCWludCBpdGVtX251bV9pbl9kZXN0OwkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKKwkJCQkgICBvciBpZiB3ZSBtdXN0IGNyZWF0ZSBhIG5ldyBpdGVtLAorCQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGl0ZW0gd2Ugd2lsbAorCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKKwlpbnQgY29weV9yZWNvcmRzX2xlbjsJLyogbGVuZ3RoIG9mIGFsbCByZWNvcmRzIGluIGl0ZW0gdG8gYmUgY29waWVkICovCisJY2hhciAqcmVjb3JkczsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNvdXJjZSwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoc291cmNlLCBpdGVtX251bSk7CiAKLSAgICBSRkFMU0UoICFpc19kaXJlbnRyeV9sZV9paCAoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOwogCi0gICAgLyogbGVuZ3RoIG9mIGFsbCByZWNvcmQgdG8gYmUgY29waWVkIGFuZCBmaXJzdCBieXRlIG9mIHRoZSBsYXN0IG9mIHRoZW0gKi8KLSAgICBkZWggPSBCX0lfREVIIChzb3VyY2UsIGloKTsKLSAgICBpZiAoY29weV9jb3VudCkgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAoZnJvbSA/IGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSAtIDFdKSApIDoKLSAgICAgICAgICAgIGloX2l0ZW1fbGVuKGloKSkgLSBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLQlyZWNvcmRzID0gc291cmNlLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLSAgICB9IGVsc2UgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAwOwotCXJlY29yZHMgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIHdoZW4gY29weSBsYXN0IHRvIGZpcnN0LCBkZXN0IGJ1ZmZlciBjYW4gY29udGFpbiAwIGl0ZW1zICovCi0gICAgaXRlbV9udW1faW5fZGVzdCA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKCggQl9OUl9JVEVNUyhkZXN0KSApID8gMCA6IC0xKSA6IChCX05SX0lURU1TKGRlc3QpIC0gMSk7Ci0KLSAgICAvKiBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gZGVzdCBvciB0aGUgZmlyc3QvbGFzdCBpdGVtIGluIGRlc3QgaXMgbm90IGl0ZW0gb2YgdGhlIHNhbWUgZGlyZWN0b3J5ICovCi0gICAgaWYgKCAoaXRlbV9udW1faW5fZGVzdCA9PSAtIDEpIHx8Ci0JKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldCAoaWgpID09IERPVF9PRkZTRVQpIHx8Ci0JICAgIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgJiYgY29tcF9zaG9ydF9sZV9rZXlzLypDT01QX1NIT1JUX0tFWVMqLyAoJmloLT5paF9rZXksIEJfTl9QS0VZIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkpKSB7Ci0JLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KLQlzdHJ1Y3QgaXRlbV9oZWFkIG5ld19paDsKLQotCS8qIGZvcm0gaXRlbSBoZWFkZXIgKi8KLQltZW1jcHkgKCZuZXdfaWguaWhfa2V5LCAmaWgtPmloX2tleSwgS0VZX1NJWkUpOwotCXB1dF9paF92ZXJzaW9uKCAmbmV3X2loLCBLRVlfRk9STUFUXzNfNSApOwotCS8qIGNhbGN1bGF0ZSBpdGVtIGxlbiAqLwotCXB1dF9paF9pdGVtX2xlbiggJm5ld19paCwgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiApOwotCXB1dF9paF9lbnRyeV9jb3VudCggJm5ld19paCwgMCApOwotICAgIAotCWlmIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpIHsKLQkgICAgLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KLQkgICAgaWYgKGZyb20gPCBJX0VOVFJZX0NPVU5UKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQoICZuZXdfaWgsIGRlaF9vZmZzZXQoICYoZGVoW2Zyb21dKSApICk7Ci0JCS8qbWVtY3B5ICgmbmV3X2loLmloX2tleS5rX29mZnNldCwgJmRlaFtmcm9tXS5kZWhfb2Zmc2V0LCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfSBlbHNlIHsKLQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuZXdfaWgsIFUzMl9NQVgpOwotCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCi0JICAgIH0KLQkgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAmKG5ld19paC5paF9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBsZW5ndGggb2YgYWxsIHJlY29yZCB0byBiZSBjb3BpZWQgYW5kIGZpcnN0IGJ5dGUgb2YgdGhlIGxhc3Qgb2YgdGhlbSAqLworCWRlaCA9IEJfSV9ERUgoc291cmNlLCBpaCk7CisJaWYgKGNvcHlfY291bnQpIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDoKKwkJCQkgICAgaWhfaXRlbV9sZW4oaWgpKSAtCisJCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGNvcHlfY291bnQgLSAxXSkpOworCQlyZWNvcmRzID0KKwkJICAgIHNvdXJjZS0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJICAgIGRlaF9sb2NhdGlvbigmKGRlaFtmcm9tICsgY29weV9jb3VudCAtIDFdKSk7CisJfSBlbHNlIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IDA7CisJCXJlY29yZHMgPSBOVUxMOwogCX0KLSAgICAKLQkvKiBpbnNlcnQgaXRlbSBpbnRvIGRlc3QgYnVmZmVyICovCi0JbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IEJfTlJfSVRFTVMoZGVzdCksICZuZXdfaWgsIE5VTEwsIDApOwotICAgIH0gZWxzZSB7Ci0JLyogcHJlcGFyZSBzcGFjZSBmb3IgZW50cmllcyAqLwotCWxlYWZfcGFzdGVfaW5fYnVmZmVyIChkZXN0X2JpLCAobGFzdF9maXJzdD09RklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtIDEpIDogMCwgTUFYX1VTX0lOVCwKLQkJCSAgICAgIERFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4sIHJlY29yZHMsIDAKLQkgICAgKTsKLSAgICB9Ci0gIAotICAgIGl0ZW1fbnVtX2luX2Rlc3QgPSAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpLTEpIDogMDsKLSAgICAKLSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAotCQkJKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgPyBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkgOiAwLAotCQkJY29weV9jb3VudCwgZGVoICsgZnJvbSwgcmVjb3JkcywKLQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4KLQkpOwotfQogCisJLyogd2hlbiBjb3B5IGxhc3QgdG8gZmlyc3QsIGRlc3QgYnVmZmVyIGNhbiBjb250YWluIDAgaXRlbXMgKi8KKwlpdGVtX251bV9pbl9kZXN0ID0KKwkgICAgKGxhc3RfZmlyc3QgPT0KKwkgICAgIExBU1RfVE9fRklSU1QpID8gKChCX05SX0lURU1TKGRlc3QpKSA/IDAgOiAtMSkgOiAoQl9OUl9JVEVNUyhkZXN0KQorCQkJCQkJCSAgICAgICAtIDEpOworCisJLyogaWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIGRlc3Qgb3IgdGhlIGZpcnN0L2xhc3QgaXRlbSBpbiBkZXN0IGlzIG5vdCBpdGVtIG9mIHRoZSBzYW1lIGRpcmVjdG9yeSAqLworCWlmICgoaXRlbV9udW1faW5fZGVzdCA9PSAtMSkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldChpaCkgPT0gRE9UX09GRlNFVCkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVAorCSAgICAgJiYgY29tcF9zaG9ydF9sZV9rZXlzIC8qQ09NUF9TSE9SVF9LRVlTICovICgmaWgtPmloX2tleSwKKwkJCQkJCQkgQl9OX1BLRVkoZGVzdCwKKwkJCQkJCQkJICBpdGVtX251bV9pbl9kZXN0KSkpKQorCXsKKwkJLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCBuZXdfaWg7CisKKwkJLyogZm9ybSBpdGVtIGhlYWRlciAqLworCQltZW1jcHkoJm5ld19paC5paF9rZXksICZpaC0+aWhfa2V5LCBLRVlfU0laRSk7CisJCXB1dF9paF92ZXJzaW9uKCZuZXdfaWgsIEtFWV9GT1JNQVRfM181KTsKKwkJLyogY2FsY3VsYXRlIGl0ZW0gbGVuICovCisJCXB1dF9paF9pdGVtX2xlbigmbmV3X2loLAorCQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4pOworCQlwdXRfaWhfZW50cnlfY291bnQoJm5ld19paCwgMCk7CisKKwkJaWYgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgeworCQkJLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KKwkJCWlmIChmcm9tIDwgSV9FTlRSWV9DT1VOVChpaCkpIHsKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoJm5ld19paCwKKwkJCQkJCSAgIGRlaF9vZmZzZXQoJihkZWhbZnJvbV0pKSk7CisJCQkJLyptZW1jcHkgKCZuZXdfaWguaWhfa2V5Lmtfb2Zmc2V0LCAmZGVoW2Zyb21dLmRlaF9vZmZzZXQsIFNIT1JUX0tFWV9TSVpFKTsgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbmV3X2loLCBVMzJfTUFYKTsKKwkJCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCisJCQl9CisJCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJihuZXdfaWguaWhfa2V5KSwKKwkJCQkJICBUWVBFX0RJUkVOVFJZKTsKKwkJfQorCisJCS8qIGluc2VydCBpdGVtIGludG8gZGVzdCBidWZmZXIgKi8KKwkJbGVhZl9pbnNlcnRfaW50b19idWYoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgTEFTVF9UT19GSVJTVCkgPyAwIDogQl9OUl9JVEVNUyhkZXN0KSwKKwkJCQkgICAgICZuZXdfaWgsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCS8qIHByZXBhcmUgc3BhY2UgZm9yIGVudHJpZXMgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgRklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtCisJCQkJCQkJMSkgOiAwLCBNQVhfVVNfSU5ULAorCQkJCSAgICAgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiwKKwkJCQkgICAgIHJlY29yZHMsIDApOworCX0KKworCWl0ZW1fbnVtX2luX2Rlc3QgPQorCSAgICAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpIC0gMSkgOiAwOworCisJbGVhZl9wYXN0ZV9lbnRyaWVzKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAorCQkJICAgKGxhc3RfZmlyc3QgPT0KKwkJCSAgICBGSVJTVF9UT19MQVNUKSA/IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoZGVzdCwKKwkJCQkJCQkJCSAgaXRlbV9udW1faW5fZGVzdCkpCisJCQkgICA6IDAsIGNvcHlfY291bnQsIGRlaCArIGZyb20sIHJlY29yZHMsCisJCQkgICBERUhfU0laRSAqIGNvcHlfY291bnQgKyBjb3B5X3JlY29yZHNfbGVuKTsKK30KIAogLyogQ29weSB0aGUgZmlyc3QgKGlmIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgb3IgbGFzdCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSBpdGVtIG9yIAogICAgcGFydCBvZiBpdCBvciBub3RoaW5nIChzZWUgdGhlIHJldHVybiAwIGJlbG93KSBmcm9tIFNPVVJDRSB0byB0aGUgZW5kIAogICAgKGlmIGxhc3RfZmlyc3QpIG9yIGJlZ2lubmluZyAoIWxhc3RfZmlyc3QpIG9mIHRoZSBERVNUICovCiAvKiByZXR1cm5zIDEgaWYgYW55dGhpbmcgd2FzIGNvcGllZCwgZWxzZSAwICovCi1zdGF0aWMgaW50IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKK3N0YXRpYyBpbnQgbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqc3JjLCBpbnQgbGFzdF9maXJzdCwKKwkJCQkgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KLSAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICBzdHJ1Y3QgaXRlbV9oZWFkICogZGloOwotICAKLSAgZGVzdF9ucl9pdGVtID0gQl9OUl9JVEVNUyhkZXN0KTsKLSAgCi0gIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgIC8qIGlmICggREVTVCBpcyBlbXB0eSBvciBmaXJzdCBpdGVtIG9mIFNPVVJDRSBhbmQgbGFzdCBpdGVtIG9mIERFU1QgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0cwotICAgICAgIG9yIG9mIGRpZmZlcmVudCB0eXBlcyApIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byB0cmVhdCB0aGlzIGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgaXRlbXMKLSAgICAgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgMCk7Ci0gICAgZGloID0gQl9OX1BJVEVNX0hFQUQgKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOwotICAgIGlmICghZGVzdF9ucl9pdGVtIHx8ICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSkpCi0gICAgICAvKiB0aGVyZSBpcyBub3RoaW5nIHRvIG1lcmdlICovCi0gICAgICByZXR1cm4gMDsKLSAgICAgIAotICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksICJ2cy0xMDAxMDogaXRlbSBjYW4gbm90IGhhdmUgZW1wdHkgbGVuZ3RoIik7Ci0gICAgICAKLSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChpaCkgKSB7Ci0gICAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLwotCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgICBsZWFmX2NvcHlfZGlyX2VudHJpZXMgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgICAKLSAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiB0aGUgREVTVAotICAgICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgY29weSB3aG9sZSBib2R5OyBkb24ndCBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyCi0gICAgICAgKi8KLSAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotICAgICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpkaWg7CisKKwlkZXN0X25yX2l0ZW0gPSBCX05SX0lURU1TKGRlc3QpOworCisJaWYgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgeworCQkvKiBpZiAoIERFU1QgaXMgZW1wdHkgb3IgZmlyc3QgaXRlbSBvZiBTT1VSQ0UgYW5kIGxhc3QgaXRlbSBvZiBERVNUIGFyZSB0aGUgaXRlbXMgb2YgZGlmZmVyZW50IG9iamVjdHMKKwkJICAgb3Igb2YgZGlmZmVyZW50IHR5cGVzICkgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHRyZWF0IHRoaXMgaXRlbSBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciBpdGVtcworCQkgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKHNyYywgMCk7CisJCWRpaCA9IEJfTl9QSVRFTV9IRUFEKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOworCQlpZiAoIWRlc3RfbnJfaXRlbQorCQkgICAgfHwgKCFvcF9pc19sZWZ0X21lcmdlYWJsZSgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpKQorCQkJLyogdGhlcmUgaXMgbm90aGluZyB0byBtZXJnZSAqLworCQkJcmV0dXJuIDA7CisKKwkJUkZBTFNFKCFpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAidnMtMTAwMTA6IGl0ZW0gY2FuIG5vdCBoYXZlIGVtcHR5IGxlbmd0aCIpOworCisJCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLworCQkJCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCAwLCAwLAorCQkJCQkgICAgICBieXRlc19vcl9lbnRyaWVzKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBib2R5IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIERFU1QKKwkJICAgcGFydCBkZWZpbmVkIGJ5ICdieXRlc19vcl9lbnRyaWVzJzsgaWYgYnl0ZXNfb3JfZW50cmllcyA9PSAtMSBjb3B5IHdob2xlIGJvZHk7IGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKKwkJICovCisJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGVsc2UgewotICAgICAgaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSkKLQlpZiAoZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSkKLQkgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtMTAwMjA6IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtOiAiCi0JCQkgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCQkgIGloKTsKLSAgICB9CisJCWVsc2UgeworCQkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpCisJCQkgICAgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQkJCWlmIChnZXRfaWhfZnJlZV9zcGFjZShpaCkpCisJCQkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJCQkgICAgICAgInZzLTEwMDIwOiBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbTogIgorCQkJCQkJICAgICAgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCisJCQkJCQkgICAgICAgaWgpOworCQl9CiAjZW5kaWYKLSAgICAgIAotICAgIC8qIG1lcmdlIGZpcnN0IGl0ZW0gKG9yIGl0cyBwYXJ0KSBvZiBzcmMgYnVmZmVyIHdpdGggdGhlIGxhc3QKLSAgICAgICBpdGVtIG9mIGRlc3QgYnVmZmVyLiBCb3RoIGFyZSBvZiB0aGUgc2FtZSBmaWxlICovCi0gICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksCi0JCQkgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpLCAwCi0JCQkgICk7Ci0gICAgICAKLSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGRpaCkpIHsKLSAgICAgIFJGQUxTRSggZ2V0X2loX2ZyZWVfc3BhY2UgKGRpaCksCi0gICAgICAgICAgICAgICJ2cy0xMDAzMDogbWVyZ2UgdG8gbGVmdDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gJWggbXVzdCBoYXZlIHplcnRvIGZyZWUgc3BhY2UiLAotICAgICAgICAgICAgICBpaCk7Ci0gICAgICBpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCi0Jc2V0X2loX2ZyZWVfc3BhY2UgKGRpaCwgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAxOwotICB9Ci0gIAogCi0gIC8qIGNvcHkgYm91bmRhcnkgaXRlbSB0byByaWdodCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSAqLworCQkvKiBtZXJnZSBmaXJzdCBpdGVtIChvciBpdHMgcGFydCkgb2Ygc3JjIGJ1ZmZlciB3aXRoIHRoZSBsYXN0CisJCSAgIGl0ZW0gb2YgZGVzdCBidWZmZXIuIEJvdGggYXJlIG9mIHRoZSBzYW1lIGZpbGUgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksCisJCQkJICAgICBieXRlc19vcl9lbnRyaWVzLCBCX0lfUElURU0oc3JjLCBpaCksIDApOwogCi0gIC8qICggREVTVCBpcyBlbXB0eSBvciBsYXN0IGl0ZW0gb2YgU09VUkNFIGFuZCBmaXJzdCBpdGVtIG9mIERFU1QKLSAgICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCi0gICAgICovCi0gIHNyY19ucl9pdGVtID0gQl9OUl9JVEVNUyAoc3JjKTsKLSAgaWggPSBCX05fUElURU1fSEVBRCAoc3JjLCBzcmNfbnJfaXRlbSAtIDEpOwotICBkaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgMCk7CisJCWlmIChpc19pbmRpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UoZ2V0X2loX2ZyZWVfc3BhY2UoZGloKSwKKwkJCSAgICAgICAidnMtMTAwMzA6IG1lcmdlIHRvIGxlZnQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtICVoIG11c3QgaGF2ZSB6ZXJ0byBmcmVlIHNwYWNlIiwKKwkJCSAgICAgICBpaCk7CisJCQlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCisJCQkJc2V0X2loX2ZyZWVfc3BhY2UoZGloLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQl9CiAKLSAgaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGRpaC0+aWhfa2V5KSwgc3JjLT5iX3NpemUpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0gICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKLSAgICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBlbnRyaWVzIG51bWJlciBpbiBsYXN0IGl0ZW0gYm9keSBvZiBTT1VSQ0UgKi8KLSAgICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgCi0gICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIHNyY19ucl9pdGVtIC0gMSwgaWhfZW50cnlfY291bnQoaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgbGFzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIERFU1Q7Ci0gICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7Ci0gICAgIGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKLSAgICAgKi8KLSAgCi0gIFJGQUxTRSggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgInZzLTEwMDQwOiBtZXJnZSB0byByaWdodDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCSAgICBpaCk7CisJLyogY29weSBib3VuZGFyeSBpdGVtIHRvIHJpZ2h0IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpICovCiAKLSAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkgewotICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBsZW5ndGggb2YgbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCi0gICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwkvKiAoIERFU1QgaXMgZW1wdHkgb3IgbGFzdCBpdGVtIG9mIFNPVVJDRSBhbmQgZmlyc3QgaXRlbSBvZiBERVNUCisJICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCisJICovCisJc3JjX25yX2l0ZW0gPSBCX05SX0lURU1TKHNyYyk7CisJaWggPSBCX05fUElURU1fSEVBRChzcmMsIHNyY19ucl9pdGVtIC0gMSk7CisJZGloID0gQl9OX1BJVEVNX0hFQUQoZGVzdCwgMCk7CiAKLSAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpICE9Ci0gICAgICAgICAgICBsZV9paF9rX29mZnNldCAoaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgc3JjLT5iX3NpemUpLAotICAgICAgICAgICAgInZzLTEwMDUwOiBpdGVtcyAlaCBhbmQgJWggZG8gbm90IG1hdGNoIiwgaWgsIGRpaCk7CisJaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoZGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUICovCi0gICAgc2V0X2xlX2loX2tfb2Zmc2V0IChkaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkpOworCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gLTEpCisJCQkvKiBieXRlc19vcl9lbnRyaWVzID0gZW50cmllcyBudW1iZXIgaW4gbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCisJCQlieXRlc19vcl9lbnRyaWVzID0gaWhfZW50cnlfY291bnQoaWgpOwogCi0gICAgLyogaXRlbSBiZWNvbWVzIG5vbi1tZXJnZWFibGUgKi8KLSAgICAvKiBvciBtZXJnZWFibGUgaWYgbGVmdCBpdGVtIHdhcyAqLwotICAgIHNldF9sZV9paF9rX3R5cGUgKGRpaCwgbGVfaWhfa190eXBlIChpaCkpOwotICB9IGVsc2UgewotICAgIC8qIG1lcmdlIHRvIHJpZ2h0IG9ubHkgcGFydCBvZiBpdGVtICovCi0gICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gYnl0ZXNfb3JfZW50cmllcywKLSAgICAgICAgICAgICJ2cy0xMDA2MDogbm8gc28gbXVjaCBieXRlcyAlbHUgKG5lZWRlZCAlbHUpIiwKLSAgICAgICAgICAgICggdW5zaWduZWQgbG9uZyApaWhfaXRlbV9sZW4oaWgpLCAoIHVuc2lnbmVkIGxvbmcgKWJ5dGVzX29yX2VudHJpZXMpOwotICAgIAotICAgIC8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLwotICAgIGlmICggaXNfZGlyZWN0X2xlX2loIChkaWgpICkgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PSAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzLAotCSAgICAgICJ2cy0xMDA3MDogZGloICVoLCBieXRlc19vcl9lbnRyaWVzKCVkKSIsIGRpaCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGRpaCwgbGVfaWhfa19vZmZzZXQgKGRpaCkgLSBieXRlc19vcl9lbnRyaWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PQotICAgICAgICAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKLSAgICAgICAgICAgICAgInZzLTEwMDgwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwKLSAgICAgICAgICAgICAgZGloLCAoYnl0ZXNfb3JfZW50cmllcy9VTkZNX1BfU0laRSkqZGVzdC0+Yl9zaXplKTsKLSAgICAgIHNldF9sZV9paF9rX29mZnNldCAoZGloLCBsZV9paF9rX29mZnNldCAoZGloKSAtICgoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSkpOwotICAgIH0KLSAgfQotICAKLSAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksIDAsIDAsIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgMCk7Ci0gIHJldHVybiAxOworCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCSAgICAgIHNyY19ucl9pdGVtIC0gMSwKKwkJCQkgICAgICBpaF9lbnRyeV9jb3VudChpaCkgLSBieXRlc19vcl9lbnRyaWVzLAorCQkJCSAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBERVNUOworCSAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7CisJICAgZG9uJ3QgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcgorCSAqLworCisJUkZBTFNFKGlzX2luZGlyZWN0X2xlX2loKGloKSAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJICAgICAgICJ2cy0xMDA0MDogbWVyZ2UgdG8gcmlnaHQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtIG11c3QgYmUgZmlsbGVkIGVudGlyZWx5ICglaCkiLAorCSAgICAgICBpaCk7CisKKwlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSAtMSkgeworCQkvKiBieXRlc19vcl9lbnRyaWVzID0gbGVuZ3RoIG9mIGxhc3QgaXRlbSBib2R5IG9mIFNPVVJDRSAqLworCQlieXRlc19vcl9lbnRyaWVzID0gaWhfaXRlbV9sZW4oaWgpOworCisJCVJGQUxTRShsZV9paF9rX29mZnNldChkaWgpICE9CisJCSAgICAgICBsZV9paF9rX29mZnNldChpaCkgKyBvcF9ieXRlc19udW1iZXIoaWgsIHNyYy0+Yl9zaXplKSwKKwkJICAgICAgICJ2cy0xMDA1MDogaXRlbXMgJWggYW5kICVoIGRvIG5vdCBtYXRjaCIsIGloLCBkaWgpOworCisJCS8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLworCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLCBsZV9paF9rX29mZnNldChpaCkpOworCisJCS8qIGl0ZW0gYmVjb21lcyBub24tbWVyZ2VhYmxlICovCisJCS8qIG9yIG1lcmdlYWJsZSBpZiBsZWZ0IGl0ZW0gd2FzICovCisJCXNldF9sZV9paF9rX3R5cGUoZGloLCBsZV9paF9rX3R5cGUoaWgpKTsKKwl9IGVsc2UgeworCQkvKiBtZXJnZSB0byByaWdodCBvbmx5IHBhcnQgb2YgaXRlbSAqLworCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpIDw9IGJ5dGVzX29yX2VudHJpZXMsCisJCSAgICAgICAidnMtMTAwNjA6IG5vIHNvIG11Y2ggYnl0ZXMgJWx1IChuZWVkZWQgJWx1KSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzKTsKKworCQkvKiBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1QgKi8KKwkJaWYgKGlzX2RpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UobGVfaWhfa19vZmZzZXQoZGloKSA8PQorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWJ5dGVzX29yX2VudHJpZXMsCisJCQkgICAgICAgInZzLTEwMDcwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwgZGloLAorCQkJICAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGRpaCwKKwkJCQkJICAgbGVfaWhfa19vZmZzZXQoZGloKSAtCisJCQkJCSAgIGJ5dGVzX29yX2VudHJpZXMpOworCQl9IGVsc2UgeworCQkJUkZBTFNFKGxlX2loX2tfb2Zmc2V0KGRpaCkgPD0KKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKKwkJCSAgICAgICAidnMtMTAwODA6IGRpaCAlaCwgYnl0ZXNfb3JfZW50cmllcyglZCkiLAorCQkJICAgICAgIGRpaCwKKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSk7CisJCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLAorCQkJCQkgICBsZV9paF9rX29mZnNldChkaWgpIC0KKwkJCQkJICAgKChieXRlc19vcl9lbnRyaWVzIC8gVU5GTV9QX1NJWkUpICoKKwkJCQkJICAgIGRlc3QtPmJfc2l6ZSkpOworCQl9CisJfQorCisJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgQl9JX1BJVEVNKHNyYywKKwkJCQkgICAgICAgaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgMCk7CisJcmV0dXJuIDE7CiB9CiAKLQogLyogY29weSBjcHlfbXVuIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdAogICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgY3B5X251bSAgaXRlbXMgYmVnaW5uaW5nIGZyb20gZmlyc3QtdGggaXRlbSBpbiBzcmMgdG8gdGFpbCBvZiBkZXN0CiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBjcHlfbnVtICBpdGVtcyBiZWdpbm5pbmcgZnJvbSBmaXJzdC10aCBpdGVtIGluIHNyYyB0byBoZWFkIG9mIGRlc3QKICAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICAgIGludCBmaXJzdCwgaW50IGNweV9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJCSAgICAgaW50IGZpcnN0LCBpbnQgY3B5X251bSkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0OwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBpbnQgZGVzdF9iZWZvcmU7Ci0gICAgaW50IGxhc3RfbG9jLCBsYXN0X2luc2VydGVkX2xvYywgbG9jYXRpb247Ci0gICAgaW50IGksIGo7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3Q7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCWludCBkZXN0X2JlZm9yZTsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfaW5zZXJ0ZWRfbG9jLCBsb2NhdGlvbjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKIAotICAgIFJGQUxTRSggbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUICAmJiBsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QsCi0JICAgICJ2cy0xMDA5MDogYmFkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICVkIiwgbGFzdF9maXJzdCk7Ci0gICAgUkZBTFNFKCBCX05SX0lURU1TIChzcmMpIC0gZmlyc3QgPCBjcHlfbnVtLAotCSAgICAidnMtMTAxMDA6IHRvbyBmZXcgaXRlbXMgaW4gc291cmNlICVkLCByZXF1aXJlZCAlZCBmcm9tICVkIiwKLQkgICAgQl9OUl9JVEVNUyhzcmMpLCBjcHlfbnVtLCBmaXJzdCk7Ci0gICAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgInZzLTEwMTEwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7Ci0gICAgUkZBTFNFKCAhIGRlc3RfYmksICJ2cy0xMDEyMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRShsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QgJiYgbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNULAorCSAgICAgICAidnMtMTAwOTA6IGJhZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAlZCIsIGxhc3RfZmlyc3QpOworCVJGQUxTRShCX05SX0lURU1TKHNyYykgLSBmaXJzdCA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDEwMDogdG9vIGZldyBpdGVtcyBpbiBzb3VyY2UgJWQsIHJlcXVpcmVkICVkIGZyb20gJWQiLAorCSAgICAgICBCX05SX0lURU1TKHNyYyksIGNweV9udW0sIGZpcnN0KTsKKwlSRkFMU0UoY3B5X251bSA8IDAsICJ2cy0xMDExMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdF9iaSwgInZzLTEwMTIwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJZGVzdCA9IGRlc3RfYmktPmJpX2JoOwogCi0gICAgUkZBTFNFKCAhIGRlc3QsICJ2cy0xMDEzMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdCwgInZzLTEwMTMwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBpZiAoY3B5X251bSA9PSAwKQotCXJldHVybjsKKwlpZiAoY3B5X251bSA9PSAwKQorCQlyZXR1cm47CiAKLSAgICBibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbSggYmxraCApOwotICAgIGZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7Ci0gIAotICAgIC8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KLSAgICBkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgZGVzdF9iZWZvcmUpOworCS8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KKwlkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOwogCi0gICAgUkZBTFNFKCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE0MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGZvciBoZWFkZXJzICVkIChuZWVkZWQgJWQpIiwKLSAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKKwkvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCisJaWggPSBCX05fUElURU1fSEVBRChkZXN0LCBkZXN0X2JlZm9yZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBoZWFkZXJzICovCi0gICAgbWVtbW92ZSAoaWggKyBjcHlfbnVtLCBpaCwgKG5yLWRlc3RfYmVmb3JlKSAqIElIX1NJWkUpOworCVJGQUxTRShibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKKwkgICAgICAgInZzLTEwMTQwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGhlYWRlcnMgJWQgKG5lZWRlZCAlZCkiLAorCSAgICAgICBCX0ZSRUVfU1BBQ0UoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKIAotICAgIC8qIGNvcHkgaXRlbSBoZWFkZXJzICovCi0gICAgbWVtY3B5IChpaCwgQl9OX1BJVEVNX0hFQUQgKHNyYywgZmlyc3QpLCBjcHlfbnVtICogSUhfU0laRSk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgaGVhZGVycyAqLworCW1lbW1vdmUoaWggKyBjcHlfbnVtLCBpaCwgKG5yIC0gZGVzdF9iZWZvcmUpICogSUhfU0laRSk7CiAKLSAgICBmcmVlX3NwYWNlIC09IChJSF9TSVpFICogY3B5X251bSk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSApOworCS8qIGNvcHkgaXRlbSBoZWFkZXJzICovCisJbWVtY3B5KGloLCBCX05fUElURU1fSEVBRChzcmMsIGZpcnN0KSwgY3B5X251bSAqIElIX1NJWkUpOwogCi0gICAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgICBqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICBmb3IgKGkgPSBkZXN0X2JlZm9yZTsgaSA8IG5yICsgY3B5X251bTsgaSArKykgewotICAgICAgICBsb2NhdGlvbiAtPSBpaF9pdGVtX2xlbiggaWggKyBpIC0gZGVzdF9iZWZvcmUgKTsKLSAgICAgICAgcHV0X2loX2xvY2F0aW9uKCBpaCArIGkgLSBkZXN0X2JlZm9yZSwgbG9jYXRpb24gKTsKLSAgICB9CisJZnJlZV9zcGFjZSAtPSAoSUhfU0laRSAqIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLwotICAgIGxhc3RfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbbnIrY3B5X251bS0xLWRlc3RfYmVmb3JlXSkgKTsKLSAgICBsYXN0X2luc2VydGVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2NweV9udW0tMV0pICk7CisJLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KKwlqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOworCWZvciAoaSA9IGRlc3RfYmVmb3JlOyBpIDwgbnIgKyBjcHlfbnVtOyBpKyspIHsKKwkJbG9jYXRpb24gLT0gaWhfaXRlbV9sZW4oaWggKyBpIC0gZGVzdF9iZWZvcmUpOworCQlwdXRfaWhfbG9jYXRpb24oaWggKyBpIC0gZGVzdF9iZWZvcmUsIGxvY2F0aW9uKTsKKwl9CiAKLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jLAotCSAgICAidnMtMTAxNTA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgaXRlbXMgJWQgKG5lZWRlZCAlZCkiLAotICAgICAgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciArIGNweV9udW0gLSAxIC0gZGVzdF9iZWZvcmVdKSk7CisJbGFzdF9pbnNlcnRlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2NweV9udW0gLSAxXSkpOwogCi0gICAgbWVtbW92ZSAoZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MsCi0JICAgICBkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X2luc2VydGVkX2xvYywKLQkgICAgIGxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOworCS8qIGNoZWNrIGZyZWUgc3BhY2UgKi8KKwlSRkFMU0UoZnJlZV9zcGFjZSA8IGogLSBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgInZzLTEwMTUwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGl0ZW1zICVkIChuZWVkZWQgJWQpIiwKKwkgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIC8qIGNvcHkgaXRlbXMgKi8KLSAgICBtZW1jcHkgKGRlc3QtPmJfZGF0YSArIGxhc3RfaW5zZXJ0ZWRfbG9jLCBCX05fUElURU0oc3JjLChmaXJzdCArIGNweV9udW0gLSAxKSksCi0JICAgIGogLSBsYXN0X2luc2VydGVkX2xvYyk7CisJbWVtbW92ZShkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYywKKwkJZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9pbnNlcnRlZF9sb2MsCisJCWxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOwogCi0gICAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgbnIgKyBjcHlfbnVtICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpICk7CisJLyogY29weSBpdGVtcyAqLworCW1lbWNweShkZXN0LT5iX2RhdGEgKyBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgQl9OX1BJVEVNKHNyYywgKGZpcnN0ICsgY3B5X251bSAtIDEpKSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBuciArIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpKTsKIAotICAgIGlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKLQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLQl0X2RjID0gQl9OX0NISUxEIChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLQlSRkFMU0UoIGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCi0JICAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZGVzdC0+Yl9ibG9ja25yLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgZGNfYmxvY2tfbnVtYmVyKHRfZGMpKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MgKyBJSF9TSVpFICogY3B5X251bSApICk7Ci0gICAgCi0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJUkZBTFNFKGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkY19ibG9ja19udW1iZXIodF9kYykpOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgKyAoaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jICsKKwkJCQkJICAgICBJSF9TSVpFICogY3B5X251bSkpOworCisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJfQogfQogCi0KIC8qIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSAobGlxdWlkKSBpdGVtIGludG8gdHdvIGl0ZW1zICh1c2VmdWwgd2hlbgogICAgc2hpZnRpbmcgcGFydCBvZiBhbiBpdGVtIGludG8gYW5vdGhlciBub2RlLikgKi8KLXN0YXRpYyB2b2lkIGxlYWZfaXRlbV9ib3R0bGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IGxhc3RfZmlyc3QsCi0JCQkgICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCitzdGF0aWMgdm9pZCBsZWFmX2l0ZW1fYm90dGxlKHN0cnVjdCBidWZmZXJfaW5mbyAqZGVzdF9iaSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgCi0gICAgUkZBTFNFKCBjcHlfYnl0ZXMgPT0gLTEsICJ2cy0xMDE3MDogYnl0ZXMgPT0gLSAxIG1lYW5zOiBkbyBub3Qgc3BsaXQgaXRlbSIpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgaWYgKCBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgKSB7Ci0JLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLwotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChzcmMsaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGl0ZW1fbnVtLCAwLCBjcHlfYnl0ZXMpOwotCWVsc2UgewotCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7Ci0gICAgICAKLQkgICAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBpdGVtIG51bWJlciAnaXRlbV9udW0nIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7IGNoYW5nZSBvbGQgaXRlbV9oZWFkZXIgKD8/Pz8pOwotCSAgICAgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOwotCSAgICAqLwotCSAgICBtZW1jcHkgKCZuX2loLCBpaCwgSUhfU0laRSk7Ci0JICAgIHB1dF9paF9pdGVtX2xlbiggJm5faWgsIGNweV9ieXRlcyApOwotCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCQlSRkFMU0UoIGNweV9ieXRlcyA9PSBpaF9pdGVtX2xlbihpaCkgJiYgZ2V0X2loX2ZyZWVfc3BhY2UoaWgpLAotCQkgICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0JCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgMCk7Ci0JICAgIH0KKwlSRkFMU0UoY3B5X2J5dGVzID09IC0xLAorCSAgICAgICAidnMtMTAxNzA6IGJ5dGVzID09IC0gMSBtZWFuczogZG8gbm90IHNwbGl0IGl0ZW0iKTsKIAotCSAgICBSRkFMU0UoIG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSksCi0JCSAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0KSwgJm5faWgsIEJfTl9QSVRFTSAoc3JjLCBpdGVtX251bSksIDApOworCWlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsKKwkJLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULAorCQkJCQkgICAgICBpdGVtX251bSwgMCwgY3B5X2J5dGVzKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsgY2hhbmdlIG9sZCBpdGVtX2hlYWRlciAoPz8/Pyk7CisJCQkgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOworCQkJICovCisJCQltZW1jcHkoJm5faWgsIGloLCBJSF9TSVpFKTsKKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKwkJCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJCQlSRkFMU0UoY3B5X2J5dGVzID09IGloX2l0ZW1fbGVuKGloKQorCQkJCSAgICAgICAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAorCQkJCSAgICAgICAobG9uZyB1bnNpZ25lZClnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCAwKTsKKwkJCX0KKworCQkJUkZBTFNFKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSwKKwkJCSAgICAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKKwkJCW5faWguaWhfdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOwkvKiBKRE0gRW5kaWFuIHNhZmUsIGJvdGggbGUgKi8KKwkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKGRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdCksICZuX2loLAorCQkJCQkgICAgIEJfTl9QSVRFTShzcmMsIGl0ZW1fbnVtKSwgMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiAgaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkgICAgICBpdGVtX251bSwKKwkJCQkJICAgICAgSV9FTlRSWV9DT1VOVChpaCkgLSBjcHlfYnl0ZXMsCisJCQkJCSAgICAgIGNweV9ieXRlcyk7CisJCWVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCBuX2loOworCisJCQkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGl0ZW0gbnVtYmVyICdpdGVtX251bScgb2YgU09VUkNFIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsKKwkJCSAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7CisJCQkgKi8KKwkJCW1lbWNweSgmbl9paCwgaWgsIFNIT1JUX0tFWV9TSVpFKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkgeworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbl9paCwKKwkJCQkJCSAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCQkgICBpaF9pdGVtX2xlbihpaCkgLSBjcHlfYnl0ZXMpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfRElSRUNUKTsKKwkJCQlzZXRfaWhfZnJlZV9zcGFjZSgmbl9paCwgTUFYX1VTX0lOVCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGluZGlyZWN0IGl0ZW0gKi8KKwkJCQlSRkFMU0UoIWNweV9ieXRlcyAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDIwMDogaWgtPmloX2ZyZWVfc3BhY2UgbXVzdCBiZSAwIHdoZW4gaW5kaXJlY3QgaXRlbSB3aWxsIGJlIGFwcGVuZGVkIik7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCZuX2loLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChpaF9pdGVtX2xlbihpaCkgLQorCQkJCQkJICAgIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqCisJCQkJCQkgICBkZXN0LT5iX3NpemUpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfSU5ESVJFQ1QpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJfQorCisJCQkvKiBzZXQgaXRlbSBsZW5ndGggKi8KKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlsZWFmX2luc2VydF9pbnRvX2J1ZihkZXN0X2JpLCAwLCAmbl9paCwKKwkJCQkJICAgICBCX05fUElURU0oc3JjLAorCQkJCQkJICAgICAgIGl0ZW1fbnVtKSArCisJCQkJCSAgICAgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzLCAwKTsKKwkJfQogCX0KLSAgICB9IGVsc2UgewotCS8qICBpZiAoIGlmIGl0ZW0gaW4gcG9zaXRpb24gaXRlbV9udW0gaW4gYnVmZmVyIFNPVVJDRSBpcyBkaXJlY3RvcnkgaXRlbSApICovCi0JaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIGl0ZW1fbnVtLCBJX0VOVFJZX0NPVU5UKGloKSAtIGNweV9ieXRlcywgY3B5X2J5dGVzKTsKLQllbHNlIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCBuX2loOwotICAgICAgCi0JICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7Ci0JICAgICAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7Ci0JICAgICovCi0JICAgIG1lbWNweSAoJm5faWgsIGloLCBTSE9SVF9LRVlfU0laRSk7Ci0KLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCi0JICAgIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzKTsKLQkJc2V0X2xlX2loX2tfdHlwZSAoJm5faWgsIFRZUEVfRElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBNQVhfVVNfSU5UKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogaW5kaXJlY3QgaXRlbSAqLwotCQlSRkFMU0UoICFjcHlfYnl0ZXMgJiYgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSwKLQkJICAgICAgICAidnMtMTAyMDA6IGloLT5paF9mcmVlX3NwYWNlIG11c3QgYmUgMCB3aGVuIGluZGlyZWN0IGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCIpOwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgKGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqIGRlc3QtPmJfc2l6ZSk7Ci0JCXNldF9sZV9paF9rX3R5cGUgKCZuX2loLCBUWVBFX0lORElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpKTsKLQkgICAgfQotICAgICAgCi0JICAgIC8qIHNldCBpdGVtIGxlbmd0aCAqLwotCSAgICBwdXRfaWhfaXRlbV9sZW4oICZuX2loLCBjcHlfYnl0ZXMgKTsKLQotCSAgICBuX2loLmloX3ZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsgLyogSkRNIEVuZGlhbiBzYWZlLCBib3RoIGxlICovCi0KLQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIDAsICZuX2loLCBCX05fUElURU0oc3JjLGl0ZW1fbnVtKSArIGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcywgMCk7Ci0JfQotICAgIH0KIH0KIAotCiAvKiBJZiBjcHlfYnl0ZXMgZXF1YWxzIG1pbnVzIG9uZSB0aGFuIGNvcHkgY3B5X251bSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgSWYgY3B5X2J5dGVzIG5vdCBlcXVhbCB0byBtaW51cyBvbmUgdGhhbiBjb3B5IGNweV9udW0tMSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgRnJvbSBsYXN0IGl0ZW0gY29weSBjcHlfbnVtIGJ5dGVzIGZvciByZWd1bGFyIGl0ZW0gYW5kIGNweV9udW0gZGlyZWN0b3J5IGVudHJpZXMgZm9yCiAgICBkaXJlY3RvcnkgaXRlbS4gKi8KLXN0YXRpYyBpbnQgbGVhZl9jb3B5X2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKLQkJCSAgICBpbnQgY3B5X2J5dGVzKQorc3RhdGljIGludCBsZWFmX2NvcHlfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywKKwkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwgaW50IGNweV9ieXRlcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdDsKLSAgaW50IHBvcywgaSwgc3JjX25yX2l0ZW0sIGJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdDsKKwlpbnQgcG9zLCBpLCBzcmNfbnJfaXRlbSwgYnl0ZXM7CiAKLSAgZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBSRkFMU0UoICFkZXN0IHx8ICFzcmMsICJ2cy0xMDIxMDogIWRlc3QgfHwgIXNyYyIpOwotICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCi0JICAidnMtMTAyMjA6bGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCIpOwotICBSRkFMU0UoIEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCi0JICAidnMtMTAyMzA6IE5vIGVub3VnaCBpdGVtczogJWQsIHJlcS4gJWQiLCBCX05SX0lURU1TKHNyYyksIGNweV9udW0pOwotICBSRkFMU0UoIGNweV9udW0gPCAwLCJ2cy0xMDI0MDogY3B5X251bSA8IDAgKCVkKSIsIGNweV9udW0pOworCWRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlSRkFMU0UoIWRlc3QgfHwgIXNyYywgInZzLTEwMjEwOiAhZGVzdCB8fCAhc3JjIik7CisJUkZBTFNFKGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCisJICAgICAgICJ2cy0xMDIyMDpsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUIik7CisJUkZBTFNFKEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDIzMDogTm8gZW5vdWdoIGl0ZW1zOiAlZCwgcmVxLiAlZCIsIEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgY3B5X251bSk7CisJUkZBTFNFKGNweV9udW0gPCAwLCAidnMtMTAyNDA6IGNweV9udW0gPCAwICglZCkiLCBjcHlfbnVtKTsKIAotIGlmICggY3B5X251bSA9PSAwICkKLSAgIHJldHVybiAwOwotIAotIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgLyogY29weSBpdGVtcyB0byBsZWZ0ICovCi0gICBwb3MgPSAwOwotICAgaWYgKCBjcHlfbnVtID09IDEgKQotICAgICBieXRlcyA9IGNweV9ieXRlczsKLSAgIGVsc2UKLSAgICAgYnl0ZXMgPSAtMTsKLSAgIAotICAgLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLwotICAgaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGJ5dGVzKTsKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICBwb3MgKz0gaTsKLSAgIGlmICggY3B5X2J5dGVzID09IC0xICkKLSAgICAgLyogY29weSBmaXJzdCBjcHlfbnVtIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcycgb2YgU09VUkNFIHRvIGVuZCBvZiBERVNUICovCi0gICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBwb3MsIGNweV9udW0pOwotICAgZWxzZSB7Ci0gICAgIC8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KLSAgICAgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIHBvcywgY3B5X251bS0xKTsKLQkgICAgIAotICAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGl0ZW0gd2hpY2ggbnVtYmVyIGlzIGNweV9udW0rcG9zLTEgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAqLwotICAgICBsZWFmX2l0ZW1fYm90dGxlIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGNweV9udW0rcG9zLTEsIGNweV9ieXRlcyk7Ci0gICB9IAotIH0gZWxzZSB7Ci0gICAvKiBjb3B5IGl0ZW1zIHRvIHJpZ2h0ICovCi0gICBzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMgKHNyYyk7Ci0gICBpZiAoIGNweV9udW0gPT0gMSApCi0gICAgIGJ5dGVzID0gY3B5X2J5dGVzOwotICAgZWxzZQotICAgICBieXRlcyA9IC0xOwotICAgCi0gICAvKiBjb3B5IHRoZSBsYXN0IGl0ZW0gb3IgaXQgcGFydCBvciBub3RoaW5nIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDEsYnl0ZXMpKTsgKi8KLSAgIGkgPSBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7Ci0gICAKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICAKLSAgIHBvcyA9IHNyY19ucl9pdGVtIC0gY3B5X251bSAtIGk7Ci0gICBpZiAoIGNweV9ieXRlcyA9PSAtMSApIHsKLSAgICAgLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfbnVtKTsKLSAgIH0gZWxzZSB7Ci0gICAgIC8qIGNvcHkgbGFzdCBjcHlfbnVtLTEgaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zKzEnIG9mIHRoZSBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUOyAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zKzEsIGNweV9udW0tMSk7CisJaWYgKGNweV9udW0gPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgICAgLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCi0gICAgIGxlYWZfaXRlbV9ib3R0bGUgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfYnl0ZXMpOwotICAgfQotIH0KLSByZXR1cm4gaTsKKwlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCS8qIGNvcHkgaXRlbXMgdG8gbGVmdCAqLworCQlwb3MgPSAwOworCQlpZiAoY3B5X251bSA9PSAxKQorCQkJYnl0ZXMgPSBjcHlfYnl0ZXM7CisJCWVsc2UKKwkJCWJ5dGVzID0gLTE7CisKKwkJLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBieXRlcyk7CisJCWNweV9udW0gLT0gaTsKKwkJaWYgKGNweV9udW0gPT0gMCkKKwkJCXJldHVybiBpOworCQlwb3MgKz0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MnIG9mIFNPVVJDRSB0byBlbmQgb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQllbHNlIHsKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KKwkJCWxlYWZfY29weV9pdGVtc19lbnRpcmVseShkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsCisJCQkJCQkgcG9zLCBjcHlfbnVtIC0gMSk7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgaXRlbSB3aGljaCBudW1iZXIgaXMgY3B5X251bStwb3MtMSB0byB0aGUgZW5kIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJIGNweV9udW0gKyBwb3MgLSAxLCBjcHlfYnl0ZXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogY29weSBpdGVtcyB0byByaWdodCAqLworCQlzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMoc3JjKTsKKwkJaWYgKGNweV9udW0gPT0gMSkKKwkJCWJ5dGVzID0gY3B5X2J5dGVzOworCQllbHNlCisJCQlieXRlcyA9IC0xOworCisJCS8qIGNvcHkgdGhlIGxhc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIChpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oREVTVCxTT1VSQ0UsMSxieXRlcykpOyAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7CisKKwkJY3B5X251bSAtPSBpOworCQlpZiAoY3B5X251bSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwkJcG9zID0gc3JjX25yX2l0ZW0gLSBjcHlfbnVtIC0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkgeworCQkJLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQl9IGVsc2UgeworCQkJLyogY29weSBsYXN0IGNweV9udW0tMSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MrMScgb2YgdGhlIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIERFU1Q7ICovCisJCQlsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkJIHBvcyArIDEsIGNweV9udW0gLSAxKTsKKworCQkJLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLAorCQkJCQkgY3B5X2J5dGVzKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKIH0KIAotCiAvKiB0aGVyZSBhcmUgdHlwZXMgb2YgY29waW5nOiBmcm9tIFNbMF0gdG8gTFswXSwgZnJvbSBTWzBdIHRvIFJbMF0sCiAgICBmcm9tIFJbMF0gdG8gTFswXS4gZm9yIGVhY2ggb2YgdGhlc2Ugd2UgaGF2ZSB0byBkZWZpbmUgcGFyZW50IGFuZAogICAgcG9zaXRpb25zIG9mIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgYnVmZmVycyAqLwotc3RhdGljIHZvaWQgbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCi0JCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgaW50ICogZmlyc3RfbGFzdCwKLQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK3N0YXRpYyB2b2lkIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkgICAgICAgaW50ICpmaXJzdF9sYXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNuZXcpCiB7Ci0gICAgbWVtc2V0IChkZXN0X2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOwotICAgIG1lbXNldCAoc3JjX2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOworCW1lbXNldChkZXN0X2JpLCAwLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisJbWVtc2V0KHNyY19iaSwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaW5mbykpOwogCi0gICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKLSAgICBjYXNlIExFQUZfRlJPTV9TX1RPX0w6ICAgIC8qIGl0IGlzIHVzZWQgaW4gbGVhZl9zaGlmdF9sZWZ0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCSpmaXJzdF9sYXN0ID0gRklSU1RfVE9fTEFTVDsKLQlicmVhazsKKwkvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworCXN3aXRjaCAoc2hpZnRfbW9kZSkgeworCWNhc2UgTEVBRl9GUk9NX1NfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IEZJUlNUX1RPX0xBU1Q7CisJCWJyZWFrOwogCi0gICAgY2FzZSBMRUFGX0ZST01fU19UT19SOiAgLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X3JpZ2h0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7Ci0JYnJlYWs7CisJY2FzZSBMRUFGX0ZST01fU19UT19SOgkvKiBpdCBpcyB1c2VkIGluIGxlYWZfc2hpZnRfcmlnaHQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1JfVE9fTDogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOwotCWJyZWFrOwotICAgIAotICAgIGNhc2UgTEVBRl9GUk9NX0xfVE9fUjogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOworCWNhc2UgTEVBRl9GUk9NX1JfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPlJbMF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMWzBdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1NfVE9fU05FVzoKLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IFNuZXc7Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IDA7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOwotICAgIAotICAgIGRlZmF1bHQ6Ci0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy0xMDI1MDogbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7Ci0gICAgfQotICAgIFJGQUxTRSggc3JjX2JpLT5iaV9iaCA9PSAwIHx8IGRlc3RfYmktPmJpX2JoID09IDAsCi0JICAgICJ2cy0xMDI2MDogbW9kZT09JWQsIHNvdXJjZSAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgaW5jb3JyZWN0bHkiLAotCSAgICBzaGlmdF9tb2RlLCBzcmNfYmktPmJpX2JoLCBkZXN0X2JpLT5iaV9iaCk7CisJY2FzZSBMRUFGX0ZST01fTF9UT19SOgkvKiBpdCBpcyB1c2VkIGluIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAqLworCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJY2FzZSBMRUFGX0ZST01fU19UT19TTkVXOgorCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gU25ldzsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSAwOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAyNTA6IGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zOiBzaGlmdCB0eXBlIGlzIHVua25vd24gKCVkKSIsCisJCQkgICAgICAgc2hpZnRfbW9kZSk7CisJfQorCVJGQUxTRShzcmNfYmktPmJpX2JoID09IDAgfHwgZGVzdF9iaS0+YmlfYmggPT0gMCwKKwkgICAgICAgInZzLTEwMjYwOiBtb2RlPT0lZCwgc291cmNlICglcCkgb3IgZGVzdCAoJXApIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBpbmNvcnJlY3RseSIsCisJICAgICAgIHNoaWZ0X21vZGUsIHNyY19iaS0+YmlfYmgsIGRlc3RfYmktPmJpX2JoKTsKIH0KIAotCi0KLQogLyogY29weSBtb3ZfbnVtIGl0ZW1zIGFuZCBtb3ZfYnl0ZXMgb2YgdGhlIChtb3ZfbnVtLTEpdGggaXRlbSB0bwogICAgbmVpZ2hib3IuIERlbGV0ZSB0aGVtIGZyb20gc291cmNlICovCi1pbnQgbGVhZl9tb3ZlX2l0ZW1zIChpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbW92X251bSwgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK2ludCBsZWFmX21vdmVfaXRlbXMoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgbW92X251bSwKKwkJICAgIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqU25ldykKIHsKLSAgaW50IHJldF92YWx1ZTsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgaW50IGZpcnN0X2xhc3Q7CisJaW50IHJldF92YWx1ZTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCWludCBmaXJzdF9sYXN0OwogCi0gIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksICZmaXJzdF9sYXN0LCBTbmV3KTsKKwlsZWFmX2RlZmluZV9kZXN0X3NyY19pbmZvcyhzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksCisJCQkJICAgJmZpcnN0X2xhc3QsIFNuZXcpOwogCi0gIHJldF92YWx1ZSA9IGxlYWZfY29weV9pdGVtcyAoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwgbW92X2J5dGVzKTsKKwlyZXRfdmFsdWUgPQorCSAgICBsZWFmX2NvcHlfaXRlbXMoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwKKwkJCSAgICBtb3ZfYnl0ZXMpOwogCi0gIGxlYWZfZGVsZXRlX2l0ZW1zICgmc3JjX2JpLCBmaXJzdF9sYXN0LCAoZmlyc3RfbGFzdCA9PSBGSVJTVF9UT19MQVNUKSA/IDAgOiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpIC0gbW92X251bSksIG1vdl9udW0sIG1vdl9ieXRlcyk7CisJbGVhZl9kZWxldGVfaXRlbXMoJnNyY19iaSwgZmlyc3RfbGFzdCwKKwkJCSAgKGZpcnN0X2xhc3QgPT0KKwkJCSAgIEZJUlNUX1RPX0xBU1QpID8gMCA6IChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgLQorCQkJCQkJIG1vdl9udW0pLCBtb3ZfbnVtLCBtb3ZfYnl0ZXMpOwogCi0gIAotICByZXR1cm4gcmV0X3ZhbHVlOworCXJldHVybiByZXRfdmFsdWU7CiB9CiAKLQogLyogU2hpZnQgc2hpZnRfbnVtIGl0ZW1zIChhbmQgc2hpZnRfYnl0ZXMgb2YgbGFzdCBzaGlmdGVkIGl0ZW0gaWYgc2hpZnRfYnl0ZXMgIT0gLTEpCiAgICBmcm9tIFNbMF0gdG8gTFswXSBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludCBsZWFmX3NoaWZ0X2xlZnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQoraW50IGxlYWZfc2hpZnRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0gIGludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqUzAgPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJaW50IGk7CiAKLSAgLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLwotICBpID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CisJLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLworCWkgPSBsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fTCwgdGIsIHNoaWZ0X251bSwgc2hpZnRfYnl0ZXMsIE5VTEwpOwogCi0gIGlmICggc2hpZnRfbnVtICkgewotICAgIGlmIChCX05SX0lURU1TIChTMCkgPT0gMCkgeyAvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCisJaWYgKHNoaWZ0X251bSkgeworCQlpZiAoQl9OUl9JVEVNUyhTMCkgPT0gMCkgewkvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCiAKLSAgICAgIFJGQUxTRSggc2hpZnRfYnl0ZXMgIT0gLTEsCi0JICAgICAgInZzLTEwMjcwOiBTMCBpcyBlbXB0eSBub3csIGJ1dCBzaGlmdF9ieXRlcyAhPSAtMSAoJWQpIiwgCi0JICAgICAgc2hpZnRfYnl0ZXMpOworCQkJUkZBTFNFKHNoaWZ0X2J5dGVzICE9IC0xLAorCQkJICAgICAgICJ2cy0xMDI3MDogUzAgaXMgZW1wdHkgbm93LCBidXQgc2hpZnRfYnl0ZXMgIT0gLTEgKCVkKSIsCisJCQkgICAgICAgc2hpZnRfYnl0ZXMpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgICAgaWYgKHRiLT50Yl9tb2RlID09IE1fUEFTVEUgfHwgdGItPnRiX21vZGUgPT0gTV9JTlNFUlQpIHsKLQlwcmludF9jdXJfdGIgKCJ2cy0xMDI3NSIpOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsIHRiLT50Yl9tb2RlKTsKLSAgICAgIH0KKwkJCWlmICh0Yi0+dGJfbW9kZSA9PSBNX1BBU1RFIHx8IHRiLT50Yl9tb2RlID09IE1fSU5TRVJUKSB7CisJCQkJcHJpbnRfY3VyX3RiKCJ2cy0xMDI3NSIpOworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsCisJCQkJCSAgICAgICB0Yi0+dGJfbW9kZSk7CisJCQl9CiAjZW5kaWYKIAotICAgICAgaWYgKFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpID09IDApCi0JcmVwbGFjZV9rZXkgKHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwgMCk7CisJCQlpZiAoUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSA9PSAwKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwgMCk7CiAKLSAgICB9IGVsc2UgeyAgICAgCi0gICAgICAvKiByZXBsYWNlIGxrZXkgaW4gQ0ZMWzBdIGJ5IDAtdGgga2V5IGZyb20gU1swXTsgKi8KLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKLSAgICAgIAotICAgICAgUkZBTFNFKCAoc2hpZnRfYnl0ZXMgIT0gLTEgJiYKLSAgICAgICAgICAgICAgIShpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkKLSAgICAgICAgICAgICAgICAmJiAhSV9FTlRSWV9DT1VOVCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkpKSAmJgotCSAgICAgICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZIChTMCwgMCksIFMwLT5iX3NpemUpKSwKLQkgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBpOworCQl9IGVsc2UgeworCQkJLyogcmVwbGFjZSBsa2V5IGluIENGTFswXSBieSAwLXRoIGtleSBmcm9tIFNbMF07ICovCisJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKKworCQkJUkZBTFNFKChzaGlmdF9ieXRlcyAhPSAtMSAmJgorCQkJCSEoaXNfZGlyZW50cnlfbGVfaWgoQl9OX1BJVEVNX0hFQUQoUzAsIDApKQorCQkJCSAgJiYgIUlfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoUzAsIDApKSkpICYmCisJCQkgICAgICAgKCFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCShCX05fUEtFWShTMCwgMCksIFMwLT5iX3NpemUpKSwKKwkJCSAgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKKwkJfQorCX0KKworCXJldHVybiBpOwogfQogCi0KLQotCi0KIC8qIENMRUFOSU5HIFNUT1BQRUQgSEVSRSAqLwogCi0KLQotCiAvKiBTaGlmdCBzaGlmdF9udW0gKHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludAlsZWFmX3NoaWZ0X3JpZ2h0KAotCQlzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQlpbnQgc2hpZnRfbnVtLAotCQlpbnQgc2hpZnRfYnl0ZXMKLQkpCitpbnQgbGVhZl9zaGlmdF9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICAvLyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotICBpbnQgcmV0X3ZhbHVlOworCS8vICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJaW50IHJldF92YWx1ZTsKIAotICAvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLwotICByZXRfdmFsdWUgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1IsIHRiLCBzaGlmdF9udW0sIHNoaWZ0X2J5dGVzLCBOVUxMKTsKKwkvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLworCXJldF92YWx1ZSA9CisJICAgIGxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19SLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CiAKLSAgLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCi0gIGlmIChzaGlmdF9udW0pIHsKLSAgICByZXBsYWNlX2tleSAodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLCB0Yi0+UlswXSwgMCk7CisJLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCisJaWYgKHNoaWZ0X251bSkgeworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwgdGItPnJrZXlbMF0sIHRiLT5SWzBdLCAwKTsKIAotICB9CisJfQogCi0gIHJldHVybiByZXRfdmFsdWU7CisJcmV0dXJuIHJldF92YWx1ZTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwKLQkJCQkJaW50IGZpcnN0LCBpbnQgZGVsX251bSk7CitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKTsKIC8qICBJZiBkZWxfYnl0ZXMgPT0gLTEsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0JyBkZWxldGUgZGVsX251bSBpdGVtcyBpbiB3aG9sZSBpbiBidWZmZXIgQ1VSLgogICAgIElmIG5vdC4gCiAgICAgSWYgbGFzdF9maXJzdCA9PSAwLiBTdGFydGluZyBmcm9tIHBvc2l0aW9uICdmaXJzdCcgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgpAQCAtNjcwLDI4NyArNzMxLDI5MiBAQAogICAgIElmIGxhc3RfZmlyc3QgPT0gMS4gU3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAnZmlyc3QrMScgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgogICAgIHRoZSBsYXN0IGl0ZW0gLiBQYXJ0IGRlZmluZWQgYnkgZGVsX2J5dGVzLiBEb24ndCBkZWxldGUgbGFzdCBpdGVtIGhlYWRlci4KICovCi12b2lkIGxlYWZfZGVsZXRlX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIGludCBsYXN0X2ZpcnN0LCAKLQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCit2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwKKwkJICAgICAgIGludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgaW50IGl0ZW1fYW1vdW50ID0gQl9OUl9JVEVNUyAoYmggPSBjdXJfYmktPmJpX2JoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX2Ftb3VudCA9IEJfTlJfSVRFTVMoYmggPSBjdXJfYmktPmJpX2JoKTsKIAotICAgIFJGQUxTRSggIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7Ci0gICAgUkZBTFNFKCBkZWxfbnVtIDwgMCwgIjEwMTYwOiBkZWxfbnVtIGNhbiBub3QgYmUgPCAwLiBkZWxfbnVtPT0lZCIsIGRlbF9udW0pOwotICAgIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IGl0ZW1fYW1vdW50LAotCSAgICAiMTAxNjU6IGludmFsaWQgbnVtYmVyIG9mIGZpcnN0IGl0ZW0gdG8gYmUgZGVsZXRlZCAoJWQpIG9yICIKLQkgICAgIm5vIHNvIG11Y2ggaXRlbXMgKCVkKSB0byBkZWxldGUgKG9ubHkgJWQpIiwgCi0JICAgIGZpcnN0LCBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKKwlSRkFMU0UoIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7CisJUkZBTFNFKGRlbF9udW0gPCAwLCAiMTAxNjA6IGRlbF9udW0gY2FuIG5vdCBiZSA8IDAuIGRlbF9udW09PSVkIiwKKwkgICAgICAgZGVsX251bSk7CisJUkZBTFNFKGZpcnN0IDwgMAorCSAgICAgICB8fCBmaXJzdCArIGRlbF9udW0gPiBpdGVtX2Ftb3VudCwKKwkgICAgICAgIjEwMTY1OiBpbnZhbGlkIG51bWJlciBvZiBmaXJzdCBpdGVtIHRvIGJlIGRlbGV0ZWQgKCVkKSBvciAiCisJICAgICAgICJubyBzbyBtdWNoIGl0ZW1zICglZCkgdG8gZGVsZXRlIChvbmx5ICVkKSIsIGZpcnN0LAorCSAgICAgICBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKIAotICAgIGlmICggZGVsX251bSA9PSAwICkKLQlyZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWYgKCBmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gaXRlbV9hbW91bnQgJiYgZGVsX2J5dGVzID09IC0xICkgewotCW1ha2VfZW1wdHlfbm9kZSAoY3VyX2JpKTsKLQlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoY3VyX2JpLT50YiwgYmgsIDApOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIGRlbF9ieXRlcyA9PSAtMSApCi0JLyogZGVsZXRlIGRlbF9udW0gaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCAqLwotCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0LCBkZWxfbnVtKTsKLSAgICBlbHNlIHsKLQlpZiAoIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCApIHsKLQkgICAgLyogZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCwgZGVsX251bS0xKTsKLQotCSAgICAvKiBkZWxldGUgdGhlIHBhcnQgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIGJoCi0JICAgICAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKLQkgICAgKi8KLQkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKGN1cl9iaSwgMCwgMCwgZGVsX2J5dGVzKTsKLQl9IGVsc2UgIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotCSAgICBpbnQgbGVuOwotCi0JICAgIC8qIGRlbGV0ZSBkZWxfbnVtLTEgaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCsxICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCsxLCBkZWxfbnVtLTEpOwotCi0JICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCktMSkpKSAJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCi0JICAgICAgICAvKiBsZW4gPSBudW1iZXJzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoaXMgaXRlbSAqLwotCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0JICAgIGVsc2UKLQkgICAgICAgIC8qIGxlbiA9IGJvZHkgbGVuIG9mIGl0ZW0gKi8KLQkJbGVuID0gaWhfaXRlbV9sZW4oaWgpOwotCi0JICAgIC8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGFzdCBpdGVtIG9mIHRoZSBiaCAKLQkgICAgICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgotCSAgICAqLwotCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoY3VyX2JpLCBCX05SX0lURU1TKGJoKS0xLCBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBpdGVtX2Ftb3VudCAmJiBkZWxfYnl0ZXMgPT0gLTEpIHsKKwkJbWFrZV9lbXB0eV9ub2RlKGN1cl9iaSk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGN1cl9iaS0+dGIsIGJoLCAwKTsKKwkJcmV0dXJuOwogCX0KLSAgICB9Ci19CiAKKwlpZiAoZGVsX2J5dGVzID09IC0xKQorCQkvKiBkZWxldGUgZGVsX251bSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICovCisJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QsIGRlbF9udW0pOworCWVsc2UgeworCQlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QgICovCisJCQlsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShjdXJfYmksIGZpcnN0LCBkZWxfbnVtIC0gMSk7CisKKwkJCS8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgYmgKKwkJCSAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKKwkJCSAqLworCQkJbGVhZl9jdXRfZnJvbV9idWZmZXIoY3VyX2JpLCAwLCAwLCBkZWxfYnl0ZXMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJCQlpbnQgbGVuOworCisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QrMSAgKi8KKwkJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QgKyAxLAorCQkJCQkJICAgZGVsX251bSAtIDEpOworCisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgKKwkJCSAgICAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCkgLSAxKSkpCisJCQkJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCisJCQkJLyogbGVuID0gbnVtYmVycyBvZiBkaXJlY3RvcnkgZW50cmllcyBpbiB0aGlzIGl0ZW0gKi8KKwkJCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQllbHNlCisJCQkJLyogbGVuID0gYm9keSBsZW4gb2YgaXRlbSAqLworCQkJCWxlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkJLyogZGVsZXRlIHRoZSBwYXJ0IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJoIAorCQkJICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgorCQkJICovCisJCQlsZWFmX2N1dF9mcm9tX2J1ZmZlcihjdXJfYmksIEJfTlJfSVRFTVMoYmgpIC0gMSwKKwkJCQkJICAgICBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJCX0KKwl9Cit9CiAKIC8qIGluc2VydCBpdGVtIGludG8gdGhlIGxlYWYgbm9kZSBpbiBwb3NpdGlvbiBiZWZvcmUgKi8KLXZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYmVmb3JlLAotCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkX2l0ZW1faWgsCi0JCQkgICBjb25zdCBjaGFyICogaW5zZXJ0ZWRfaXRlbV9ib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGJlZm9yZSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWRfaXRlbV9paCwKKwkJCSAgY29uc3QgY2hhciAqaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgY2hhciAqIHRvOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpOworCWludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJY2hhciAqdG87CiAKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJZnJlZV9zcGFjZSA9IGJsa2hfZnJlZV9zcGFjZShibGtoKTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKCBibGtoICk7CisJLyogY2hlY2sgZnJlZSBzcGFjZSAqLworCVJGQUxTRShmcmVlX3NwYWNlIDwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgKyBJSF9TSVpFLAorCSAgICAgICAidnMtMTAxNzA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiBibG9jayAleiwgbmV3IGl0ZW0gJWgiLAorCSAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7CisJUkZBTFNFKHplcm9zX251bWJlciA+IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpLAorCSAgICAgICAidnMtMTAxNzI6IHplcm8gbnVtYmVyID09ICVkLCBpdGVtIGxlbmd0aCA9PSAlZCIsCisJICAgICAgIHplcm9zX251bWJlciwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpOwogCi0gICAgLyogY2hlY2sgZnJlZSBzcGFjZSAqLwotICAgIFJGQUxTRSggZnJlZV9zcGFjZSA8IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpICsgSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE3MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGluIGJsb2NrICV6LCBuZXcgaXRlbSAlaCIsCi0gICAgICAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgUkZBTFNFKCB6ZXJvc19udW1iZXIgPiBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSwKLQkgICAgInZzLTEwMTcyOiB6ZXJvIG51bWJlciA9PSAlZCwgaXRlbSBsZW5ndGggPT0gJWQiLAotICAgICAgICAgICAgemVyb3NfbnVtYmVyLCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSk7CisJLyogZ2V0IGl0ZW0gbmV3IGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBiZWZvcmUpOwogCisJLyogcHJlcGFyZSBzcGFjZSBmb3IgdGhlIGJvZHkgb2YgbmV3IGl0ZW0gKi8KKwlsYXN0X2xvYyA9IG5yID8gaWhfbG9jYXRpb24oJihpaFtuciAtIGJlZm9yZSAtIDFdKSkgOiBiaC0+Yl9zaXplOworCXVubW92ZWRfbG9jID0gYmVmb3JlID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICAvKiBnZXQgaXRlbSBuZXcgaXRlbSBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBiZWZvcmUpOworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksCisJCWJoLT5iX2RhdGEgKyBsYXN0X2xvYywgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciB0aGUgYm9keSBvZiBuZXcgaXRlbSAqLwotICAgIGxhc3RfbG9jID0gbnIgPyBpaF9sb2NhdGlvbiggJihpaFtuciAtIGJlZm9yZSAtIDFdKSApIDogYmgtPmJfc2l6ZTsKLSAgICB1bm1vdmVkX2xvYyA9IGJlZm9yZSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOworCXRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7CisJbWVtc2V0KHRvLCAwLCB6ZXJvc19udW1iZXIpOworCXRvICs9IHplcm9zX251bWJlcjsKIAorCS8qIGNvcHkgYm9keSB0byBwcmVwYXJlZCBzcGFjZSAqLworCWlmIChpbnNlcnRlZF9pdGVtX2JvZHkpCisJCW1lbW1vdmUodG8sIGluc2VydGVkX2l0ZW1fYm9keSwKKwkJCWloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpIC0gemVyb3NfbnVtYmVyKTsKKwllbHNlCisJCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwogCi0gICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksIAotCSAgICAgYmgtPmJfZGF0YSArIGxhc3RfbG9jLCB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKKwkvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KKwltZW1tb3ZlKGloICsgMSwgaWgsIElIX1NJWkUgKiAobnIgLSBiZWZvcmUpKTsKKwltZW1tb3ZlKGloLCBpbnNlcnRlZF9pdGVtX2loLCBJSF9TSVpFKTsKIAotICAgIHRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgbWVtc2V0ICh0bywgMCwgemVyb3NfbnVtYmVyKTsKLSAgICB0byArPSB6ZXJvc19udW1iZXI7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGJlZm9yZTsgaSA8IG5yICsgMTsgaSsrKSB7CisJCXVubW92ZWRfbG9jIC09IGloX2l0ZW1fbGVuKCYoaWhbaSAtIGJlZm9yZV0pKTsKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGJlZm9yZV0pLCB1bm1vdmVkX2xvYyk7CisJfQogCi0gICAgLyogY29weSBib2R5IHRvIHByZXBhcmVkIHNwYWNlICovCi0gICAgaWYgKGluc2VydGVkX2l0ZW1fYm9keSkKLQltZW1tb3ZlICh0bywgaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSAtIHplcm9zX251bWJlcik7Ci0gICAgZWxzZQotCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwotICAKLSAgICAvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KLSAgICBtZW1tb3ZlIChpaCArIDEsIGloLCBJSF9TSVpFICogKG5yIC0gYmVmb3JlKSk7Ci0gICAgbWVtbW92ZSAoaWgsIGluc2VydGVkX2l0ZW1faWgsIElIX1NJWkUpOwotICAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYmVmb3JlOyBpIDwgbnIgKyAxOyBpICsrKQotICAgIHsKLSAgICAgICAgdW5tb3ZlZF9sb2MgLT0gaWhfaXRlbV9sZW4oICYoaWhbaS1iZWZvcmVdKSk7Ci0JcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktYmVmb3JlXSksIHVubW92ZWRfbG9jICk7Ci0gICAgfQotICAKLSAgICAvKiBzaXplcywgZnJlZSBzcGFjZSwgaXRlbSBudW1iZXIgKi8KLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCApICkgKTsKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMSk7CisJLyogc2l6ZXMsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxKTsKKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsCisJCQkgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsKKwkJCQkJICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDEpOwogCi0gICAgaWYgKGJpLT5iaV9wYXJlbnQpIHsgCi0Jc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0JdF9kYyA9IEJfTl9DSElMRCAoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpKTsKLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7Ci0gICAgfQorCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsCisJCQkgICAgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsKKwkJCQkJICAgICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKKwl9CiB9CiAKLQogLyogcGFzdGUgcGFzdGVfc2l6ZSBieXRlcyB0byBhZmZlY3RlZF9pdGVtX251bS10aCBpdGVtLiAKICAgIFdoZW4gaXRlbSBpcyBhIGRpcmVjdG9yeSwgdGhpcyBvbmx5IHByZXBhcmUgc3BhY2UgZm9yIG5ldyBlbnRyaWVzICovCi12b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwKLQkJCSAgIGNvbnN0IGNoYXIgKiBib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAorCQkJICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLAorCQkJICBjb25zdCBjaGFyICpib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJpLT5iaV9iaDsKKwlpbnQgbnIsIGZyZWVfc3BhY2U7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGk7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOwogCi0KLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgcGFzdGVfc2l6ZSwKLSAgICAgICAgICAgICJ2cy0xMDE3NTogbm90IGVub3VnaCBmcmVlIHNwYWNlOiBuZWVkZWQgJWQsIGF2YWlsYWJsZSAlZCIsCi0gICAgICAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKKwkvKiBjaGVjayBmcmVlIHNwYWNlICovCisJUkZBTFNFKGZyZWVfc3BhY2UgPCBwYXN0ZV9zaXplLAorCSAgICAgICAidnMtMTAxNzU6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZTogbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorCSAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7Ci0JcHJpbnRfY3VyX3RiICgiMTAxNzciKTsKLQlyZWlzZXJmc19wYW5pYyAoIE5VTEwsICJ2cy0xMDE3NzogbGVhZl9wYXN0ZV9pbl9idWZmZXI6IGVybyBudW1iZXIgPT0gJWQsIHBhc3RlX3NpemUgPT0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zX251bWJlciwgcGFzdGVfc2l6ZSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCi0KLSAgICAvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwotCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pICk7Ci0gICAgdW5tb3ZlZF9sb2MgPSBhZmZlY3RlZF9pdGVtX251bSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOwotCi0gICAgLyogcHJlcGFyZSBzcGFjZSAqLwotICAgIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyAtIHBhc3RlX3NpemUsIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywKLQkgICAgIHVubW92ZWRfbG9jIC0gbGFzdF9sb2MpOwotCi0KLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYWZmZWN0ZWRfaXRlbV9udW07IGkgPCBucjsgaSArKykKLQlwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1hZmZlY3RlZF9pdGVtX251bV0pLAotICAgICAgICAgICAgICAgICAgICBpaF9sb2NhdGlvbiggJihpaFtpLWFmZmVjdGVkX2l0ZW1fbnVtXSkpIC0gcGFzdGVfc2l6ZSApOwotCi0gICAgaWYgKCBib2R5ICkgewotCWlmICghaXNfZGlyZW50cnlfbGVfaWggKGloKSkgewotCSAgICBpZiAoIXBvc19pbl9pdGVtKSB7Ci0JCS8qIHNoaWZ0IGRhdGEgdG8gcmlnaHQgKi8KLQkJbWVtbW92ZSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHBhc3RlX3NpemUsIAotCQkJIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIGloX2l0ZW1fbGVuKGloKSk7Ci0JCS8qIHBhc3RlIGRhdGEgaW4gdGhlIGhlYWQgb2YgaXRlbSAqLwotCQltZW1zZXQgKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIDAsIHplcm9zX251bWJlcik7Ci0JCW1lbWNweSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHplcm9zX251bWJlciwgYm9keSwgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7Ci0JICAgIH0gZWxzZSB7Ci0JCW1lbXNldCAoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgMCwgemVyb3NfbnVtYmVyKTsKLQkJbWVtY3B5IChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsgemVyb3NfbnVtYmVyLCBib2R5LCBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKLQkgICAgfQorCWlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7CisJCXByaW50X2N1cl90YigiMTAxNzciKTsKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAxNzc6IGxlYWZfcGFzdGVfaW5fYnVmZmVyOiBlcm8gbnVtYmVyID09ICVkLCBwYXN0ZV9zaXplID09ICVkIiwKKwkJCSAgICAgICB6ZXJvc19udW1iZXIsIHBhc3RlX3NpemUpOwogCX0KLSAgICB9Ci0gICAgZWxzZQotCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAnXDAnLCBwYXN0ZV9zaXplKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUgKTsKKwkvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCisJaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwogCi0gICAgLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBmcmVlX3NwYWNlIC0gcGFzdGVfc2l6ZSApOworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pKTsKKwl1bm1vdmVkX2xvYyA9IGFmZmVjdGVkX2l0ZW1fbnVtID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisJLyogcHJlcGFyZSBzcGFjZSAqLworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gcGFzdGVfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgcGFzdGVfc2l6ZSApOwotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGFmZmVjdGVkX2l0ZW1fbnVtOyBpIDwgbnI7IGkrKykKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGFmZmVjdGVkX2l0ZW1fbnVtXSksCisJCQkJaWhfbG9jYXRpb24oJihpaFtpIC0gYWZmZWN0ZWRfaXRlbV9udW1dKSkgLQorCQkJCXBhc3RlX3NpemUpOworCisJaWYgKGJvZHkpIHsKKwkJaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmICghcG9zX2luX2l0ZW0pIHsKKwkJCQkvKiBzaGlmdCBkYXRhIHRvIHJpZ2h0ICovCisJCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJCQkJcGFzdGVfc2l6ZSwKKwkJCQkJYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwKKwkJCQkJaWhfaXRlbV9sZW4oaWgpKTsKKwkJCQkvKiBwYXN0ZSBkYXRhIGluIHRoZSBoZWFkIG9mIGl0ZW0gKi8KKwkJCQltZW1zZXQoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwgMCwKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyKTsKKwkJCQltZW1jcHkoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArCisJCQkJICAgICAgIHplcm9zX251bWJlciwgYm9keSwKKwkJCQkgICAgICAgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAwLAorCQkJCSAgICAgICB6ZXJvc19udW1iZXIpOworCQkJCW1lbWNweShiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyLCBib2R5LAorCQkJCSAgICAgICBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQltZW1zZXQoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgJ1wwJywgcGFzdGVfc2l6ZSk7CisKKwlwdXRfaWhfaXRlbV9sZW4oaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUpOworCisJLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsIGZyZWVfc3BhY2UgLSBwYXN0ZV9zaXplKTsKKworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCisJaWYgKGJpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPQorCQkgICAgQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgKyBwYXN0ZV9zaXplKTsKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7CisJfQogfQogCi0KIC8qIGN1dHMgREVMX0NPVU5UIGVudHJpZXMgYmVnaW5uaW5nIGZyb20gRlJPTS10aCBlbnRyeS4gRGlyZWN0b3J5IGl0ZW0KICAgIGRvZXMgbm90IGhhdmUgZnJlZSBzcGFjZSwgc28gaXQgbW92ZXMgREVIcyBhbmQgcmVtYWluaW5nIHJlY29yZHMgYXMKICAgIG5lY2Vzc2FyeS4gUmV0dXJuIHZhbHVlIGlzIHNpemUgb2YgcmVtb3ZlZCBwYXJ0IG9mIGRpcmVjdG9yeSBpdGVtCiAgICBpbiBieXRlcy4gKi8KLXN0YXRpYyBpbnQJbGVhZl9jdXRfZW50cmllcyAoCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCi0JCQkJc3RydWN0IGl0ZW1faGVhZCAqIGloLCAKLQkJCQlpbnQgZnJvbSwgCi0JCQkJaW50IGRlbF9jb3VudAotCQkJKQorc3RhdGljIGludCBsZWFmX2N1dF9lbnRyaWVzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBmcm9tLCBpbnQgZGVsX2NvdW50KQogewotICBjaGFyICogaXRlbTsKLSAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7Ci0gIGludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLwotICBjaGFyICogcHJldl9yZWNvcmQ7CQkvKiAqLwotICBpbnQgY3V0X3JlY29yZHNfbGVuOwkJLyogbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKi8KLSAgaW50IGk7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLworCWNoYXIgKnByZXZfcmVjb3JkOwkvKiAqLworCWludCBjdXRfcmVjb3Jkc19sZW47CS8qIGxlbmd0aCBvZiBhbGwgcmVtb3ZlZCByZWNvcmRzICovCisJaW50IGk7CiAKKwkvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnkgYW5kIHRoZXJlIGFyZSBlbm91Z2ggZW50cmllcyB0bworCSAgIHJlbW92ZSAqLworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAiMTAxODA6IGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtIik7CisJUkZBTFNFKElfRU5UUllfQ09VTlQoaWgpIDwgZnJvbSArIGRlbF9jb3VudCwKKwkgICAgICAgIjEwMTg1OiBpdGVtIGNvbnRhaW5zIG5vdCBlbm91Z2ggZW50cmllczogZW50cnlfY291dCA9ICVkLCBmcm9tID0gJWQsIHRvIGRlbGV0ZSA9ICVkIiwKKwkgICAgICAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CiAKLSAgLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5IGFuZCB0aGVyZSBhcmUgZW5vdWdoIGVudHJpZXMgdG8KLSAgICAgcmVtb3ZlICovCi0gIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICIxMDE4MDogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKLSAgUkZBTFNFKCBJX0VOVFJZX0NPVU5UKGloKSA8IGZyb20gKyBkZWxfY291bnQsCi0JICAiMTAxODU6IGl0ZW0gY29udGFpbnMgbm90IGVub3VnaCBlbnRyaWVzOiBlbnRyeV9jb3V0ID0gJWQsIGZyb20gPSAlZCwgdG8gZGVsZXRlID0gJWQiLAotCSAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CisJaWYgKGRlbF9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKIAotICBpZiAoZGVsX2NvdW50ID09IDApCi0gICAgcmV0dXJuIDA7CisJLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCisJaXRlbSA9IGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCk7CiAKLSAgLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCi0gIGl0ZW0gPSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpOworCS8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KKwlkZWggPSBCX0lfREVIKGJoLCBpaCk7CiAKLSAgLyogZW50cnkgaGVhZCBhcnJheSAqLwotICBkZWggPSBCX0lfREVIIChiaCwgaWgpOworCS8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKKwkgICAocHJldl9yZWNvcmQpIGFuZCBsZW5ndGggb2YgYWxsIHJlbW92ZWQgcmVjb3JkcyAoY3V0X3JlY29yZHNfbGVuKSAqLworCXByZXZfcmVjb3JkX29mZnNldCA9CisJICAgIChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKKwljdXRfcmVjb3Jkc19sZW4gPSBwcmV2X3JlY29yZF9vZmZzZXQgLypmcm9tX3JlY29yZCAqLyAgLQorCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGRlbF9jb3VudCAtIDFdKSk7CisJcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OwogCi0gIC8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKLSAgICAgKHByZXZfcmVjb3JkKSBhbmQgbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKGN1dF9yZWNvcmRzX2xlbikgKi8KLSAgcHJldl9yZWNvcmRfb2Zmc2V0ID0gKGZyb20gPyBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKLSAgY3V0X3JlY29yZHNfbGVuID0gcHJldl9yZWNvcmRfb2Zmc2V0Lypmcm9tX3JlY29yZCovIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tICsgZGVsX2NvdW50IC0gMV0pKTsKLSAgcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPiBmcm9tICsgZGVsX2NvdW50IC0gMTsgaS0tKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0KKwkJCQkgKERFSF9TSVpFICogZGVsX2NvdW50KSk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsKKwkJCQkJCQkgIGN1dF9yZWNvcmRzX2xlbikpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID4gZnJvbSArIGRlbF9jb3VudCAtIDE7IGkgLS0pCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmZGVoW2ldICkgLSAoREVIX1NJWkUgKiBkZWxfY291bnQgKSApOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpIC0gZGVsX2NvdW50KTsKIAotICBmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSArKykKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgIGRlaF9sb2NhdGlvbiggJmRlaFtpXSApIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsgY3V0X3JlY29yZHNfbGVuKSApOworCS8qIHNoaWZ0IGVudHJ5IGhlYWQgYXJyYXkgYW5kIGVudHJpZXMgdGhvc2UgYXJlIEFGVEVSIHJlbW92ZWQgZW50cmllcyAqLworCW1lbW1vdmUoKGNoYXIgKikoZGVoICsgZnJvbSksCisJCWRlaCArIGZyb20gKyBkZWxfY291bnQsCisJCXByZXZfcmVjb3JkIC0gY3V0X3JlY29yZHNfbGVuIC0gKGNoYXIgKikoZGVoICsgZnJvbSArCisJCQkJCQkJIGRlbF9jb3VudCkpOwogCi0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSAtIGRlbF9jb3VudCApOworCS8qIHNoaWZ0IHJlY29yZHMsIHRob3NlIGFyZSBCRUZPUkUgcmVtb3ZlZCBlbnRyaWVzICovCisJbWVtbW92ZShwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAorCQlwcmV2X3JlY29yZCwgaXRlbSArIGloX2l0ZW1fbGVuKGloKSAtIHByZXZfcmVjb3JkKTsKIAotICAvKiBzaGlmdCBlbnRyeSBoZWFkIGFycmF5IGFuZCBlbnRyaWVzIHRob3NlIGFyZSBBRlRFUiByZW1vdmVkIGVudHJpZXMgKi8KLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgZnJvbSksCi0JICAgZGVoICsgZnJvbSArIGRlbF9jb3VudCwgCi0JICAgcHJldl9yZWNvcmQgLSBjdXRfcmVjb3Jkc19sZW4gLSAoY2hhciAqKShkZWggKyBmcm9tICsgZGVsX2NvdW50KSk7Ci0gIAotICAvKiBzaGlmdCByZWNvcmRzLCB0aG9zZSBhcmUgQkVGT1JFIHJlbW92ZWQgZW50cmllcyAqLwotICBtZW1tb3ZlIChwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAotCSAgIHByZXZfcmVjb3JkLCBpdGVtICsgaWhfaXRlbV9sZW4oaWgpIC0gcHJldl9yZWNvcmQpOwotCi0gIHJldHVybiBERUhfU0laRSAqIGRlbF9jb3VudCArIGN1dF9yZWNvcmRzX2xlbjsKKwlyZXR1cm4gREVIX1NJWkUgKiBkZWxfY291bnQgKyBjdXRfcmVjb3Jkc19sZW47CiB9CiAKLQogLyogIHdoZW4gY3V0IGl0ZW0gaXMgcGFydCBvZiByZWd1bGFyIGZpbGUKICAgICAgICAgcG9zX2luX2l0ZW0gLSBmaXJzdCBieXRlIHRoYXQgbXVzdCBiZSBjdXQKICAgICAgICAgY3V0X3NpemUgLSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY3V0IGJlZ2lubmluZyBmcm9tIHBvc19pbl9pdGVtCkBAIC05NTksMjY0ICsxMDI1LDI3OCBAQAogICAgICAgICBwb3NfaW5faXRlbSAtIG51bWJlciBvZiBmaXJzdCBkZWxldGVkIGVudHJ5CiAgICAgICAgIGN1dF9zaXplIC0gY291bnQgb2YgZGVsZXRlZCBlbnRyaWVzCiAgICAgKi8KLXZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgY3V0X2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgY3V0X3NpemUpCit2b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IGN1dF9zaXplKQogewotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgaW50IGk7CisJaW50IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKKwlpbnQgaTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICAvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgY3V0X2l0ZW1fbnVtKTsKKwkvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBjdXRfaXRlbV9udW0pOwogCi0gICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKLSAgICAgICAgLyogZmlyc3QgY3V0IGVudHJ5ICgpKi8KLSAgICAgICAgY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzIChiaCwgaWgsIHBvc19pbl9pdGVtLCBjdXRfc2l6ZSk7Ci0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0JICAgICAgICAvKiBjaGFuZ2Uga2V5ICovCi0gICAgICAgICAgICBSRkFMU0UoIGN1dF9pdGVtX251bSwKLSAgICAgICAgICAgICAgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsIGN1dF9pdGVtX251bSk7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgaXRlbSBrZXkgYnkga2V5IG9mIGZpcnN0IGVudHJ5IGluIHRoZSBpdGVtICovCi0JICAgIHNldF9sZV9paF9rX29mZnNldCAoaWgsIGRlaF9vZmZzZXQoQl9JX0RFSCAoYmgsIGloKSkpOwotICAgICAgICAgICAgLyptZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAmKEJfSV9ERUggKGJoLCBpaCktPmRlaF9vZmZzZXQpLCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGl0ZW0gaXMgZGlyZWN0IG9yIGluZGlyZWN0ICovCi0gICAgICAgIFJGQUxTRSggaXNfc3RhdGRhdGFfbGVfaWggKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOwotICAgICAgICBSRkFMU0UoIHBvc19pbl9pdGVtICYmIHBvc19pbl9pdGVtICsgY3V0X3NpemUgIT0gaWhfaXRlbV9sZW4oaWgpLAotICAgICAgICAgICAgICAgICIxMDIwMDogaW52YWxpZCBvZmZzZXQgKCVsdSkgb3IgdHJ1bmNfc2l6ZSAoJWx1KSBvciBpaF9pdGVtX2xlbiAoJWx1KSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgcG9zX2luX2l0ZW0sICggbG9uZyB1bnNpZ25lZCApIGN1dF9zaXplLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgaWhfaXRlbV9sZW4gKGloKSk7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkgeworCQkvKiBmaXJzdCBjdXQgZW50cnkgKCkgKi8KKwkJY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzKGJoLCBpaCwgcG9zX2luX2l0ZW0sIGN1dF9zaXplKTsKKwkJaWYgKHBvc19pbl9pdGVtID09IDApIHsKKwkJCS8qIGNoYW5nZSBrZXkgKi8KKwkJCVJGQUxTRShjdXRfaXRlbV9udW0sCisJCQkgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsCisJCQkgICAgICAgY3V0X2l0ZW1fbnVtKTsKKwkJCS8qIGNoYW5nZSBpdGVtIGtleSBieSBrZXkgb2YgZmlyc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChCX0lfREVIKGJoLCBpaCkpKTsKKwkJCS8qbWVtY3B5ICgmaWgtPmloX2tleS5rX29mZnNldCwgJihCX0lfREVIIChiaCwgaWgpLT5kZWhfb2Zmc2V0KSwgU0hPUlRfS0VZX1NJWkUpOyAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogaXRlbSBpcyBkaXJlY3Qgb3IgaW5kaXJlY3QgKi8KKwkJUkZBTFNFKGlzX3N0YXRkYXRhX2xlX2loKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOworCQlSRkFMU0UocG9zX2luX2l0ZW0gJiYgcG9zX2luX2l0ZW0gKyBjdXRfc2l6ZSAhPSBpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAiMTAyMDA6IGludmFsaWQgb2Zmc2V0ICglbHUpIG9yIHRydW5jX3NpemUgKCVsdSkgb3IgaWhfaXRlbV9sZW4gKCVsdSkiLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpcG9zX2luX2l0ZW0sIChsb25nIHVuc2lnbmVkKWN1dF9zaXplLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpaWhfaXRlbV9sZW4oaWgpKTsKIAotICAgICAgICAvKiBzaGlmdCBpdGVtIGJvZHkgdG8gbGVmdCBpZiBjdXQgaXMgZnJvbSB0aGUgaGVhZCBvZiBpdGVtICovCi0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0gICAgICAgICAgICBtZW1tb3ZlKCBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAotCQkgICAgIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKLQkJICAgICBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7Ci0JICAgIAotICAgICAgICAgICAgLyogY2hhbmdlIGtleSBvZiBpdGVtICovCi0gICAgICAgICAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpCi0JCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkgKyBjdXRfc2l6ZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLQkJc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgbGVfaWhfa19vZmZzZXQgKGloKSArIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqIGJoLT5iX3NpemUpOwotICAgICAgICAgICAgICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAyMDU6IGludmFsaWQgaWhfZnJlZV9zcGFjZSAoJWgpIiwgaWgpOwotCSAgICAgICAgfQotCSAgICB9Ci0gICAgfQotICAKKwkJLyogc2hpZnQgaXRlbSBib2R5IHRvIGxlZnQgaWYgY3V0IGlzIGZyb20gdGhlIGhlYWQgb2YgaXRlbSAqLworCQlpZiAocG9zX2luX2l0ZW0gPT0gMCkgeworCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAorCQkJCWJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKKwkJCQlpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGN1dF9pdGVtX251bSAtIDFdKSApOworCQkJLyogY2hhbmdlIGtleSBvZiBpdGVtICovCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsCisJCQkJCQkgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkJICAgY3V0X3NpemUpOworCQkJZWxzZSB7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqCisJCQkJCQkgICBiaC0+Yl9zaXplKTsKKwkJCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplCisJCQkJICAgICAgICYmIGdldF9paF9mcmVlX3NwYWNlKGloKSwKKwkJCQkgICAgICAgIjEwMjA1OiBpbnZhbGlkIGloX2ZyZWVfc3BhY2UgKCVoKSIsIGloKTsKKwkJCX0KKwkJfQorCX0KIAotICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KLSAgICB1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloLTEpIDogYmgtPmJfc2l6ZTsKKwkvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gY3V0X2l0ZW1fbnVtIC0gMV0pKTsKIAorCS8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KKwl1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloIC0gMSkgOiBiaC0+Yl9zaXplOwogCi0gICAgLyogc2hpZnQgKi8KLSAgICBtZW1tb3ZlIChiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAotCSAgICAgICB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOworCS8qIHNoaWZ0ICovCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOwogCi0gICAgLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCi0gICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgaWhfaXRlbV9sZW4oaWgpIC0gY3V0X3NpemUgKTsKLSAgCi0gICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKLSAgICAgICAgaWYgKHBvc19pbl9pdGVtKQotICAgICAgICAgICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCisJcHV0X2loX2l0ZW1fbGVuKGloLCBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gY3V0X2l0ZW1fbnVtOyBpIDwgbnI7IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktY3V0X2l0ZW1fbnVtXSksIGloX2xvY2F0aW9uKCAmaWhbaS1jdXRfaXRlbV9udW1dKSArIGN1dF9zaXplICk7CisJaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQlpZiAocG9zX2luX2l0ZW0pCisJCQlzZXRfaWhfZnJlZV9zcGFjZShpaCwgMCk7CisJfQogCi0gICAgLyogc2l6ZSwgZnJlZSBzcGFjZSAqLwotICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIGN1dF9zaXplICk7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGN1dF9pdGVtX251bTsgaSA8IG5yOyBpKyspCisJCXB1dF9paF9sb2NhdGlvbigmKGloW2kgLSBjdXRfaXRlbV9udW1dKSwKKwkJCQlpaF9sb2NhdGlvbigmaWhbaSAtIGN1dF9pdGVtX251bV0pICsgY3V0X3NpemUpOwogCi0gICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOwotICAgIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotICAgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0gICAgICB0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotICAgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSApOwotICAgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICAgIH0KKwkvKiBzaXplLCBmcmVlIHNwYWNlICovCisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyBjdXRfc2l6ZSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCiAvKiBkZWxldGUgZGVsX251bSBpdGVtcyBmcm9tIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCd0aCBpdGVtICovCi1zdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksCi0JCQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBucjsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmktPmJpX2JoOworCWludCBucjsKKwlpbnQgaSwgajsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgUkZBTFNFKCBiaCA9PSBOVUxMLCAiMTAyMTA6IGJ1ZmZlciBpcyAwIik7Ci0gIFJGQUxTRSggZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CisJUkZBTFNFKGJoID09IE5VTEwsICIxMDIxMDogYnVmZmVyIGlzIDAiKTsKKwlSRkFMU0UoZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CiAKLSAgaWYgKGRlbF9udW0gPT0gMCkKLSAgICByZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoYmgpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IG5yLAotICAgICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwgbnIpOworCVJGQUxTRShmaXJzdCA8IDAgfHwgZmlyc3QgKyBkZWxfbnVtID4gbnIsCisJICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwKKwkgICAgICAgbnIpOwogCi0gIGlmIChmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gbnIpIHsKLSAgICAvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KLSAgICBtYWtlX2VtcHR5X25vZGUgKGJpKTsKLSAgICAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBucikgeworCQkvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KKwkJbWFrZV9lbXB0eV9ub2RlKGJpKTsKIAotICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgZmlyc3QpOwotICAKLSAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICAgIAotICAvKiBkZWxldGUgaXRlbXMgKi8KLSAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuci0xLWZpcnN0XSkgKTsKLSAgbGFzdF9yZW1vdmVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2RlbF9udW0tMV0pICk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCQlyZXR1cm47CisJfQogCi0gIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X3JlbW92ZWRfbG9jLAotCSAgIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywgbGFzdF9yZW1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKLSAgCi0gIC8qIGRlbGV0ZSBpdGVtIGhlYWRlcnMgKi8KLSAgbWVtbW92ZSAoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOwotICAKLSAgLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KLSAgZm9yIChpID0gZmlyc3Q7IGkgPCBuciAtIGRlbF9udW07IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktZmlyc3RdKSwgaWhfbG9jYXRpb24oICYoaWhbaS1maXJzdF0pICkgKyAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MpICk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgZmlyc3QpOwogCi0gIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtICk7Ci0gIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSApOworCS8qIGxvY2F0aW9uIG9mIHVubW92YWJsZSBpdGVtICovCisJaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOwogCi0gIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAwKTsKLSAgCi0gIGlmIChiaS0+YmlfcGFyZW50KSB7Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLQotCQkJCShqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSk7Ci0gICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICB9CisJLyogZGVsZXRlIGl0ZW1zICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gMSAtIGZpcnN0XSkpOworCWxhc3RfcmVtb3ZlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2RlbF9udW0gLSAxXSkpOworCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9yZW1vdmVkX2xvYywKKwkJYmgtPmJfZGF0YSArIGxhc3RfbG9jLCBsYXN0X3JlbW92ZWRfbG9jIC0gbGFzdF9sb2MpOworCisJLyogZGVsZXRlIGl0ZW0gaGVhZGVycyAqLworCW1lbW1vdmUoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOworCisJLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KKwlmb3IgKGkgPSBmaXJzdDsgaSA8IG5yIC0gZGVsX251bTsgaSsrKQorCQlwdXRfaWhfbG9jYXRpb24oJihpaFtpIC0gZmlyc3RdKSwKKwkJCQlpaF9sb2NhdGlvbigmKGloW2kgLSBmaXJzdF0pKSArIChqIC0KKwkJCQkJCQkJIGxhc3RfcmVtb3ZlZF9sb2MpKTsKKworCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArCisJCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0KKwkJICAgIEJfTl9DSElMRChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgLSAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MgKworCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCi0KLQotCiAvKiBwYXN0ZSBuZXdfZW50cnlfY291bnQgZW50cmllcyAobmV3X2RlaHMsIHJlY29yZHMpIGludG8gcG9zaXRpb24gYmVmb3JlIHRvIGl0ZW1fbnVtLXRoIGl0ZW0gKi8KLXZvaWQgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLAordm9pZCBsZWFmX3Bhc3RlX2VudHJpZXMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCWludCBpdGVtX251bSwKIAkJCWludCBiZWZvcmUsCiAJCQlpbnQgbmV3X2VudHJ5X2NvdW50LAotCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBuZXdfZGVocywKLQkJCWNvbnN0IGNoYXIgKiByZWNvcmRzLAotCQkJaW50IHBhc3RlX3NpemUKLQkJKQorCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKm5ld19kZWhzLAorCQkJY29uc3QgY2hhciAqcmVjb3JkcywgaW50IHBhc3RlX3NpemUpCiB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGNoYXIgKiBpdGVtOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGNoYXIgKiBpbnNlcnRfcG9pbnQ7Ci0gICAgaW50IGksIG9sZF9lbnRyeV9udW07CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWNoYXIgKmluc2VydF9wb2ludDsKKwlpbnQgaSwgb2xkX2VudHJ5X251bTsKIAotICAgIGlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuOworCWlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoYmgsIGl0ZW1fbnVtKTsKIAotICAvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnksIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHJlY29yZHMgaW4gaXQgKi8KLSAgUkZBTFNFKCAhaXNfZGlyZW50cnlfbGVfaWggKGloKSwgIjEwMjI1OiBpdGVtIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSIpOwotICBSRkFMU0UoIElfRU5UUllfQ09VTlQgKGloKSA8IGJlZm9yZSwKLQkgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCi0JICBJX0VOVFJZX0NPVU5UIChpaCksIGJlZm9yZSk7CisJLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5LCBhbmQgdGhlcmUgYXJlIGVub3VnaCByZWNvcmRzIGluIGl0ICovCisJUkZBTFNFKCFpc19kaXJlbnRyeV9sZV9paChpaCksICIxMDIyNTogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKKwlSRkFMU0UoSV9FTlRSWV9DT1VOVChpaCkgPCBiZWZvcmUsCisJICAgICAgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCisJICAgICAgIElfRU5UUllfQ09VTlQoaWgpLCBiZWZvcmUpOwogCisJLyogZmlyc3QgYnl0ZSBvZiBkZXN0IGl0ZW0gKi8KKwlpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKIAotICAvKiBmaXJzdCBieXRlIG9mIGRlc3QgaXRlbSAqLwotICBpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKKwkvKiBlbnRyeSBoZWFkIGFycmF5ICovCisJZGVoID0gQl9JX0RFSChiaCwgaWgpOwogCi0gIC8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KLSAgZGVoID0gQl9JX0RFSCAoYmgsIGloKTsKKwkvKiBuZXcgcmVjb3JkcyB3aWxsIGJlIHBhc3RlZCBhdCB0aGlzIHBvaW50ICovCisJaW5zZXJ0X3BvaW50ID0KKwkgICAgaXRlbSArCisJICAgIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oJihkZWhbYmVmb3JlIC0gMV0pKQorCSAgICAgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOwogCi0gIC8qIG5ldyByZWNvcmRzIHdpbGwgYmUgcGFzdGVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgaW5zZXJ0X3BvaW50ID0gaXRlbSArIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oICYoZGVoW2JlZm9yZSAtIDFdKSkgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPj0gYmVmb3JlOyBpLS0pCisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJIChERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCkpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID49IGJlZm9yZTsgaSAtLSkKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyAoREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgKSk7IAorCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQkVGT1JFIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IGJlZm9yZTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplKTsKIAotICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIEJFRk9SRSBuZXcgcmVjb3JkcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmVmb3JlOyBpICsrKQotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplICk7CisJb2xkX2VudHJ5X251bSA9IElfRU5UUllfQ09VTlQoaWgpOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpICsgbmV3X2VudHJ5X2NvdW50KTsKIAotICBvbGRfZW50cnlfbnVtID0gSV9FTlRSWV9DT1VOVChpaCk7Ci0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSArIG5ld19lbnRyeV9jb3VudCApOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCisJbWVtbW92ZShpbnNlcnRfcG9pbnQgKyBwYXN0ZV9zaXplLCBpbnNlcnRfcG9pbnQsCisJCWl0ZW0gKyAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkgLSBpbnNlcnRfcG9pbnQpOwogCi0gIC8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCi0gIG1lbW1vdmUgKGluc2VydF9wb2ludCArIHBhc3RlX3NpemUsIGluc2VydF9wb2ludCwgaXRlbSArIChpaF9pdGVtX2xlbihpaCkgLSBwYXN0ZV9zaXplKSAtIGluc2VydF9wb2ludCk7CisJLyogY29weSBuZXcgcmVjb3JkcyAqLworCW1lbWNweShpbnNlcnRfcG9pbnQgKyBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCwgcmVjb3JkcywKKwkgICAgICAgcGFzdGVfc2l6ZSAtIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50KTsKIAotICAvKiBjb3B5IG5ldyByZWNvcmRzICovCi0gIG1lbWNweSAoaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQsIHJlY29yZHMsCi0JCSAgIHBhc3RlX3NpemUgLSBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCk7Ci0gIAotICAvKiBwcmVwYXJlIHNwYWNlIGZvciBuZXcgZW50cnkgaGVhZHMgKi8KLSAgZGVoICs9IGJlZm9yZTsKLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgbmV3X2VudHJ5X2NvdW50KSwgZGVoLCBpbnNlcnRfcG9pbnQgLSAoY2hhciAqKWRlaCk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoICs9IGJlZm9yZTsKKwltZW1tb3ZlKChjaGFyICopKGRlaCArIG5ld19lbnRyeV9jb3VudCksIGRlaCwKKwkJaW5zZXJ0X3BvaW50IC0gKGNoYXIgKilkZWgpOwogCi0gIC8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCi0gIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSgoY2hhciAqKWRlaCk7Ci0gIG1lbWNweSAoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOworCS8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKChjaGFyICopZGVoKTsKKwltZW1jcHkoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOwogCi0gIC8qIHNldCBsb2NhdGlvbnMgb2YgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSArKykKLSAgewotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKLSAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSApKSArCi0gICAgICAgICgtIGRlaF9sb2NhdGlvbiggJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKLSAgICAgICAgaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgLSBpdGVtKSk7Ci0gIH0KKwkvKiBzZXQgbG9jYXRpb25zIG9mIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSsrKSB7CisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJICgtZGVoX2xvY2F0aW9uCisJCQkJICAoJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKKwkJCQkgIGluc2VydF9wb2ludCArIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50IC0KKwkJCQkgIGl0ZW0pKTsKKwl9CiAKLQotICAvKiBjaGFuZ2UgaXRlbSBrZXkgaWYgbmVjZXNzYXJ5ICh3aGVuIHdlIHBhc3RlIGJlZm9yZSAwLXRoIGVudHJ5ICovCi0gIGlmICghYmVmb3JlKQotICAgIHsKLQlzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBkZWhfb2Zmc2V0KG5ld19kZWhzKSk7CisJLyogY2hhbmdlIGl0ZW0ga2V5IGlmIG5lY2Vzc2FyeSAod2hlbiB3ZSBwYXN0ZSBiZWZvcmUgMC10aCBlbnRyeSAqLworCWlmICghYmVmb3JlKSB7CisJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChuZXdfZGVocykpOwogLyogICAgICBtZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAKIAkJICAgICAgICZuZXdfZGVocy0+ZGVoX29mZnNldCwgU0hPUlRfS0VZX1NJWkUpOyovCi0gICAgfQotCisJfQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICB7Ci0gICAgaW50IHByZXYsIG5leHQ7Ci0gICAgLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLwotICAgIGRlaCA9IEJfSV9ERUggKGJoLCBpaCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpICsrKSB7Ci0gICAgICBuZXh0ID0gKGkgPCBJX0VOVFJZX0NPVU5UKGloKSAtIDEpID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtpICsgMV0pKSA6IDA7Ci0gICAgICBwcmV2ID0gKGkgIT0gMCkgPyBkZWhfbG9jYXRpb24oICYoZGVoW2kgLSAxXSkgKSA6IDA7Ci0gICAgICAKLSAgICAgIGlmIChwcmV2ICYmIHByZXYgPD0gZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSkpKQotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMDI0MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAocHJldiAlYSwgY3VyKCVkKSAlYSkiLAotCQkJICBpaCwgZGVoICsgaSAtIDEsIGksIGRlaCArIGkpOwotICAgICAgaWYgKG5leHQgJiYgbmV4dCA+PSBkZWhfbG9jYXRpb24oICYoZGVoW2ldKSkpCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEwMjUwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChjdXIoJWQpICVhLCBuZXh0ICVhKSIsCi0JCQkgIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7Ci0gICAgfQotICB9CisJeworCQlpbnQgcHJldiwgbmV4dDsKKwkJLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLworCQlkZWggPSBCX0lfREVIKGJoLCBpaCk7CisJCWZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UKGloKTsgaSsrKSB7CisJCQluZXh0ID0KKwkJCSAgICAoaSA8CisJCQkgICAgIElfRU5UUllfQ09VTlQoaWgpIC0KKwkJCSAgICAgMSkgPyBkZWhfbG9jYXRpb24oJihkZWhbaSArIDFdKSkgOiAwOworCQkJcHJldiA9IChpICE9IDApID8gZGVoX2xvY2F0aW9uKCYoZGVoW2kgLSAxXSkpIDogMDsKKworCQkJaWYgKHByZXYgJiYgcHJldiA8PSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSkKKwkJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCQkgInZzLTEwMjQwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChwcmV2ICVhLCBjdXIoJWQpICVhKSIsCisJCQkJCQkgaWgsIGRlaCArIGkgLSAxLCBpLCBkZWggKyBpKTsKKwkJCWlmIChuZXh0ICYmIG5leHQgPj0gZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkpCisJCQkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCQkJICJ2cy0xMDI1MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAoY3VyKCVkKSAlYSwgbmV4dCAlYSkiLAorCQkJCQkJIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7CisJCX0KKwl9CiAjZW5kaWYKIAogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggNGEzMzMyNS4uYTIwYmJjMSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0yNSw4NiArMjUsODUgQEAKIAogLy8gZGlyZWN0b3J5IGl0ZW0gY29udGFpbnMgYXJyYXkgb2YgZW50cnkgaGVhZGVycy4gVGhpcyBwZXJmb3JtcwogLy8gYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoYXQgYXJyYXkKLXN0YXRpYyBpbnQgYmluX3NlYXJjaF9pbl9kaXJfaXRlbSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBsb2ZmX3Qgb2ZmKQorc3RhdGljIGludCBiaW5fc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLCBsb2ZmX3Qgb2ZmKQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCA9IGRlLT5kZV9paDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWg7Ci0gICAgaW50IHJib3VuZCwgbGJvdW5kLCBqOworCXN0cnVjdCBpdGVtX2hlYWQgKmloID0gZGUtPmRlX2loOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByYm91bmQsIGxib3VuZCwgajsKIAotICAgIGxib3VuZCA9IDA7Ci0gICAgcmJvdW5kID0gSV9FTlRSWV9DT1VOVCAoaWgpIC0gMTsKKwlsYm91bmQgPSAwOworCXJib3VuZCA9IElfRU5UUllfQ09VTlQoaWgpIC0gMTsKIAotICAgIGZvciAoaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMjsgbGJvdW5kIDw9IHJib3VuZDsgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgewotCWlmIChvZmYgPCBkZWhfb2Zmc2V0IChkZWggKyBqKSkgewotCSAgICByYm91bmQgPSBqIC0gMTsKLQkgICAgY29udGludWU7CisJZm9yIChqID0gKHJib3VuZCArIGxib3VuZCkgLyAyOyBsYm91bmQgPD0gcmJvdW5kOworCSAgICAgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgeworCQlpZiAob2ZmIDwgZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJcmJvdW5kID0gaiAtIDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2ZmID4gZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJbGJvdW5kID0gaiArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyB0aGlzIGlzIG5vdCBuYW1lIGZvdW5kLCBidXQgbWF0Y2hlZCB0aGlyZCBrZXkgY29tcG9uZW50CisJCWRlLT5kZV9lbnRyeV9udW0gPSBqOworCQlyZXR1cm4gTkFNRV9GT1VORDsKIAl9Ci0JaWYgKG9mZiA+IGRlaF9vZmZzZXQgKGRlaCArIGopKSB7Ci0JICAgIGxib3VuZCA9IGogKyAxOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLy8gdGhpcyBpcyBub3QgbmFtZSBmb3VuZCwgYnV0IG1hdGNoZWQgdGhpcmQga2V5IGNvbXBvbmVudAotCWRlLT5kZV9lbnRyeV9udW0gPSBqOwotCXJldHVybiBOQU1FX0ZPVU5EOwotICAgIH0KIAotICAgIGRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7CisJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCi0KIC8vIGNvbW1lbnQ/ICBtYXliZSBzb21ldGhpbmcgbGlrZSBzZXQgZGUgdG8gcG9pbnQgdG8gd2hhdCB0aGUgcGF0aCBwb2ludHMgdG8/Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX2l0ZW1fbG9jYXRpb24gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwgc3RydWN0IHBhdGggKiBwYXRoKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9pdGVtX2xvY2F0aW9uKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLAorCQkJCQlzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLSAgICBkZS0+ZGVfYmggPSBnZXRfbGFzdF9iaCAocGF0aCk7Ci0gICAgZGUtPmRlX2loID0gZ2V0X2loIChwYXRoKTsKLSAgICBkZS0+ZGVfZGVoID0gQl9JX0RFSCAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpOwotICAgIGRlLT5kZV9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCk7Ci19IAotCisJZGUtPmRlX2JoID0gZ2V0X2xhc3RfYmgocGF0aCk7CisJZGUtPmRlX2loID0gZ2V0X2loKHBhdGgpOworCWRlLT5kZV9kZWggPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKTsKKwlkZS0+ZGVfaXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCk7Cit9CiAKIC8vIGRlX2JoLCBkZV9paCwgZGVfZGVoIChwb2ludHMgdG8gZmlyc3QgZWxlbWVudCBvZiBhcnJheSksIGRlX2l0ZW1fbnVtIGlzIHNldAotaW5saW5lIHZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK2lubGluZSB2b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgZGUtPmRlX2VudHJ5bGVuID0gZW50cnlfbGVuZ3RoIChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7Ci0gICAgZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZCAoZGVoKSA/IFNEX1NJWkUgOiAwKTsKLSAgICBkZS0+ZGVfbmFtZSA9IEJfSV9QSVRFTSAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpICsgZGVoX2xvY2F0aW9uKGRlaCk7Ci0gICAgaWYgKGRlLT5kZV9uYW1lW2RlLT5kZV9uYW1lbGVuIC0gMV0gPT0gMCkKLQlkZS0+ZGVfbmFtZWxlbiA9IHN0cmxlbiAoZGUtPmRlX25hbWUpOworCWRlLT5kZV9lbnRyeWxlbiA9IGVudHJ5X2xlbmd0aChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7CisJZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZChkZWgpID8gU0RfU0laRSA6IDApOworCWRlLT5kZV9uYW1lID0gQl9JX1BJVEVNKGRlLT5kZV9iaCwgZGUtPmRlX2loKSArIGRlaF9sb2NhdGlvbihkZWgpOworCWlmIChkZS0+ZGVfbmFtZVtkZS0+ZGVfbmFtZWxlbiAtIDFdID09IDApCisJCWRlLT5kZV9uYW1lbGVuID0gc3RybGVuKGRlLT5kZV9uYW1lKTsKIH0KIAotCiAvLyB3aGF0IGVudHJ5IHBvaW50cyB0bwotc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9vYmplY3Rfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX29iamVjdF9rZXkoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOwotICAgIGRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCAmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKLSAgICBkZS0+ZGVfb2JqZWN0aWQgPSBkZWhfb2JqZWN0aWQoICYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOworCWRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWRlLT5kZV9vYmplY3RpZCA9IGRlaF9vYmplY3RpZCgmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5KHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgLyogc3RvcmUga2V5IG9mIHRoZSBmb3VuZCBlbnRyeSAqLwotICAgIGRlLT5kZV9lbnRyeV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoZGUtPmRlX2loLT5paF9rZXkua19kaXJfaWQpOwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJihkZS0+ZGVfZW50cnlfa2V5KSwgZGVoX29mZnNldCAoZGVoKSk7Ci0gICAgc2V0X2NwdV9rZXlfa190eXBlICgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBzdG9yZSBrZXkgb2YgdGhlIGZvdW5kIGVudHJ5ICovCisJZGUtPmRlX2VudHJ5X2tleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisJZGUtPmRlX2VudHJ5X2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9CisJICAgIGxlMzJfdG9fY3B1KGRlLT5kZV9paC0+aWhfa2V5LmtfZGlyX2lkKTsKKwlkZS0+ZGVfZW50cnlfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPQorCSAgICBsZTMyX3RvX2NwdShkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmKGRlLT5kZV9lbnRyeV9rZXkpLCBkZWhfb2Zmc2V0KGRlaCkpOworCXNldF9jcHVfa2V5X2tfdHlwZSgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKIH0KIAotCiAvKiBXZSBhc3NpZ24gYSBrZXkgdG8gZWFjaCBkaXJlY3RvcnkgaXRlbSwgYW5kIHBsYWNlIG11bHRpcGxlIGVudHJpZXMKIGluIGEgc2luZ2xlIGRpcmVjdG9yeSBpdGVtLiAgQSBkaXJlY3RvcnkgaXRlbSBoYXMgYSBrZXkgZXF1YWwgdG8gdGhlCiBrZXkgb2YgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSBpbiBpdC4KQEAgLTExNyw1OCArMTE2LDYwIEBACiAqLwogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2J5X2VudHJ5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoraW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCXN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBpbnQgcmV0dmFsOworCWludCByZXR2YWw7CiAKLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsIGtleSwgcGF0aCk7Ci0gICAgc3dpdGNoIChyZXR2YWwpIHsKLSAgICBjYXNlIElURU1fTk9UX0ZPVU5EOgotCWlmICghUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTcwMDA6IHNlYXJjaF9ieV9lbnRyeV9rZXk6IHNlYXJjaF9ieV9rZXkgcmV0dXJuZWQgaXRlbSBwb3NpdGlvbiA9PSAwIik7Ci0JICAgIHBhdGhyZWxzZShwYXRoKSA7Ci0JICAgIHJldHVybiBJT19FUlJPUiA7CisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsIGtleSwgcGF0aCk7CisJc3dpdGNoIChyZXR2YWwpIHsKKwljYXNlIElURU1fTk9UX0ZPVU5EOgorCQlpZiAoIVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzYiwKKwkJCQkJICJ2cy03MDAwOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBzZWFyY2hfYnlfa2V5IHJldHVybmVkIGl0ZW0gcG9zaXRpb24gPT0gMCIpOworCQkJcGF0aHJlbHNlKHBhdGgpOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CisJCVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKS0tOworCisJY2FzZSBJVEVNX0ZPVU5EOgorCQlicmVhazsKKworCWNhc2UgSU9fRVJST1I6CisJCXJldHVybiByZXR2YWw7CisKKwlkZWZhdWx0OgorCQlwYXRocmVsc2UocGF0aCk7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJ2cy03MDAyOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBubyBwYXRoIHRvIGhlcmUiKTsKKwkJcmV0dXJuIElPX0VSUk9SOwogCX0KLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOwogCi0gICAgY2FzZSBJVEVNX0ZPVU5EOgotCWJyZWFrOwotCi0gICAgY2FzZSBJT19FUlJPUjoKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgZGVmYXVsdDoKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtNzAwMjogc2VhcmNoX2J5X2VudHJ5X2tleTogbm8gcGF0aCB0byBoZXJlIik7Ci0JcmV0dXJuIElPX0VSUk9SOwotICAgIH0KLQotICAgIHNldF9kZV9pdGVtX2xvY2F0aW9uIChkZSwgcGF0aCk7CisJc2V0X2RlX2l0ZW1fbG9jYXRpb24oZGUsIHBhdGgpOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKCFpc19kaXJlbnRyeV9sZV9paCAoZGUtPmRlX2loKSB8fCAKLQlDT01QX1NIT1JUX0tFWVMgKCYoZGUtPmRlX2loLT5paF9rZXkpLCBrZXkpKSB7Ci0JcHJpbnRfYmxvY2sgKGRlLT5kZV9iaCwgMCwgLTEsIC0xKTsKLQlyZWlzZXJmc19wYW5pYyAoc2IsICJ2cy03MDA1OiBzZWFyY2hfYnlfZW50cnlfa2V5OiBmb3VuZCBpdGVtICVoIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBrZXkgJUsiLCBkZS0+ZGVfaWgsIGtleSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCWlmICghaXNfZGlyZW50cnlfbGVfaWgoZGUtPmRlX2loKSB8fAorCSAgICBDT01QX1NIT1JUX0tFWVMoJihkZS0+ZGVfaWgtPmloX2tleSksIGtleSkpIHsKKwkJcHJpbnRfYmxvY2soZGUtPmRlX2JoLCAwLCAtMSwgLTEpOworCQlyZWlzZXJmc19wYW5pYyhzYiwKKwkJCSAgICAgICAidnMtNzAwNTogc2VhcmNoX2J5X2VudHJ5X2tleTogZm91bmQgaXRlbSAlaCBpcyBub3QgZGlyZWN0b3J5IGl0ZW0gb3IgIgorCQkJICAgICAgICJkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGtleSAlSyIsCisJCQkgICAgICAgZGUtPmRlX2loLCBrZXkpOworCX0KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIC8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKLSAgICAgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLwotICAgIHJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0gKGRlLCBjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgICBwYXRoLT5wb3NfaW5faXRlbSA9IGRlLT5kZV9lbnRyeV9udW07Ci0gICAgaWYgKHJldHZhbCAhPSBOQU1FX05PVF9GT1VORCkgewotCS8vIHVnbHksIGJ1dCByZW5hbWUgbmVlZHMgZGVfYmgsIGRlX2RlaCwgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfb2JqZWN0aWQgc2V0Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKLQlzZXRfZGVfb2JqZWN0X2tleSAoZGUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworCS8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKKwkgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLworCXJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0oZGUsIGNwdV9rZXlfa19vZmZzZXQoa2V5KSk7CisJcGF0aC0+cG9zX2luX2l0ZW0gPSBkZS0+ZGVfZW50cnlfbnVtOworCWlmIChyZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJLy8gdWdseSwgYnV0IHJlbmFtZSBuZWVkcyBkZV9iaCwgZGVfZGVoLCBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9vYmplY3RpZCBzZXQKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oZGUpOworCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisJfQorCXJldHVybiByZXR2YWw7CiB9CiAKLQotCiAvKiBLZXllZCAzMi1iaXQgaGFzaCBmdW5jdGlvbiB1c2luZyBURUEgaW4gYSBEYXZpcy1NZXllciBmdW5jdGlvbiAqLwogCiAvKiBUaGUgdGhpcmQgY29tcG9uZW50IGlzIGhhc2hlZCwgYW5kIHlvdSBjYW4gY2hvb3NlIGZyb20gbW9yZSB0aGFuCkBAIC0xNzYsMzcxICsxNzcsMzkzIEBACiAgICBidXQgYXJlIHRob3VnaHQgYWJvdXQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG1vdmVkIHRvIGhhc2hlcy5jCiAgICBKZWRpLCBwbGVhc2UgZG8gc28uICAtSGFucyAqLwogCi1zdGF0aWMgX191MzIgZ2V0X3RoaXJkX2NvbXBvbmVudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgCi0JCQkJICBjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBnZXRfdGhpcmRfY29tcG9uZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLSAgICBfX3UzMiByZXM7CisJX191MzIgcmVzOwogCi0gICAgaWYgKCFsZW4gfHwgKGxlbiA9PSAxICYmIG5hbWVbMF0gPT0gJy4nKSkKLQlyZXR1cm4gRE9UX09GRlNFVDsKLSAgICBpZiAobGVuID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0JcmV0dXJuIERPVF9ET1RfT0ZGU0VUOworCWlmICghbGVuIHx8IChsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykpCisJCXJldHVybiBET1RfT0ZGU0VUOworCWlmIChsZW4gPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKKwkJcmV0dXJuIERPVF9ET1RfT0ZGU0VUOwogCi0gICAgcmVzID0gUkVJU0VSRlNfU0IocyktPnNfaGFzaF9mdW5jdGlvbiAobmFtZSwgbGVuKTsKKwlyZXMgPSBSRUlTRVJGU19TQihzKS0+c19oYXNoX2Z1bmN0aW9uKG5hbWUsIGxlbik7CiAKLSAgICAvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcwotICAgIHJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7Ci0gICAgaWYgKHJlcyA9PSAwKQotCS8vIG5lZWRlZCB0byBoYXZlIG5vIG5hbWVzIGJlZm9yZSAiLiIgYW5kICIuLiIgdGhvc2UgaGF2ZSBoYXNoCi0JLy8gdmFsdWUgPT0gMCBhbmQgZ2VuZXJhdGlvbiBjb250ZXJzIDEgYW5kIDIgYWNjb3JkaW5nbHkKLQlyZXMgPSAxMjg7Ci0gICAgcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKKwkvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcworCXJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7CisJaWYgKHJlcyA9PSAwKQorCQkvLyBuZWVkZWQgdG8gaGF2ZSBubyBuYW1lcyBiZWZvcmUgIi4iIGFuZCAiLi4iIHRob3NlIGhhdmUgaGFzaAorCQkvLyB2YWx1ZSA9PSAwIGFuZCBnZW5lcmF0aW9uIGNvbnRlcnMgMSBhbmQgMiBhY2NvcmRpbmdseQorCQlyZXMgPSAxMjg7CisJcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX21hdGNoIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIAotCQkJICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCByZWlzZXJmc19tYXRjaChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCiB7Ci0gICAgaW50IHJldHZhbCA9IE5BTUVfTk9UX0ZPVU5EOworCWludCByZXR2YWwgPSBOQU1FX05PVF9GT1VORDsKIAotICAgIGlmICgobmFtZWxlbiA9PSBkZS0+ZGVfbmFtZWxlbikgJiYKLQkhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCi0JcmV0dmFsID0gKGRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSA/IE5BTUVfRk9VTkQgOiBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CisJaWYgKChuYW1lbGVuID09IGRlLT5kZV9uYW1lbGVuKSAmJgorCSAgICAhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCisJCXJldHZhbCA9CisJCSAgICAoZGVfdmlzaWJsZShkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkgPyBOQU1FX0ZPVU5EIDoKKwkJICAgICBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CiAKLSAgICByZXR1cm4gcmV0dmFsOworCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyogZGUncyBkZV9iaCwgZGVfaWgsIGRlX2RlaCwgZGVfaXRlbV9udW0sIGRlX2VudHJ5X251bSBhcmUgc2V0IGFscmVhZHkgKi8KIAogCQkJCS8qIHVzZWQgd2hlbiBoYXNoIGNvbGxpc2lvbnMgZXhpc3QgKi8KIAotCi1zdGF0aWMgaW50IGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0gKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsCi0JCQkJICAgICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCBsaW5lYXJfc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBpOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByZXR2YWw7CisJaW50IGk7CiAKLSAgICBpID0gZGUtPmRlX2VudHJ5X251bTsKKwlpID0gZGUtPmRlX2VudHJ5X251bTsKIAotICAgIGlmIChpID09IElfRU5UUllfQ09VTlQgKGRlLT5kZV9paCkgfHwKLQlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoICsgaSkpICE9IEdFVF9IQVNIX1ZBTFVFIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSkgewotCWkgLS07Ci0gICAgfQotCi0gICAgUkZBTFNFKCBkZS0+ZGVfZGVoICE9IEJfSV9ERUggKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKLQkgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7Ci0KLSAgICBkZWggKz0gaTsKLQotICAgIGZvciAoOyBpID49IDA7IGkgLS0sIGRlaCAtLSkgewotCWlmIChHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSkgIT0KLQkgICAgR0VUX0hBU0hfVkFMVUUgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkpKSB7Ci0JICAgIC8vIGhhc2ggdmFsdWUgZG9lcyBub3QgbWF0Y2gsIG5vIG5lZWQgdG8gY2hlY2sgd2hvbGUgbmFtZQotCSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJaWYgKGkgPT0gSV9FTlRSWV9DT1VOVChkZS0+ZGVfaWgpIHx8CisJICAgIEdFVF9IQVNIX1ZBTFVFKGRlaF9vZmZzZXQoZGVoICsgaSkpICE9CisJICAgIEdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpIHsKKwkJaS0tOwogCX0KLSAgIAotCS8qIG1hcmssIHRoYXQgdGhpcyBnZW5lcmF0aW9uIG51bWJlciBpcyB1c2VkICovCi0JaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCi0JICAgIHNldF9iaXQgKEdFVF9HRU5FUkFUSU9OX05VTUJFUiAoZGVoX29mZnNldCAoZGVoKSksICh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkvLyBjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lbGVuCi0JZGUtPmRlX2VudHJ5X251bSA9IGk7Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKKwlSRkFMU0UoZGUtPmRlX2RlaCAhPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKKwkgICAgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7CiAKLQlpZiAoKHJldHZhbCA9IHJlaXNlcmZzX21hdGNoIChkZSwgbmFtZSwgbmFtZWxlbikpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0JICAgIC8vIGRlJ3MgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfcmVjb3JkbGVuIGFyZSBzZXQuIEZpbGwgdGhlIHJlc3Q6CisJZGVoICs9IGk7CiAKLQkgICAgLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0Ci0JICAgIHNldF9kZV9vYmplY3Rfa2V5IChkZSk7CisJZm9yICg7IGkgPj0gMDsgaS0tLCBkZWgtLSkgeworCQlpZiAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldChkZWgpKSAhPQorCQkgICAgR0VUX0hBU0hfVkFMVUUoY3B1X2tleV9rX29mZnNldChrZXkpKSkgeworCQkJLy8gaGFzaCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgbm8gbmVlZCB0byBjaGVjayB3aG9sZSBuYW1lCisJCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJCX0KIAotCSAgICBzdG9yZV9kZV9lbnRyeV9rZXkgKGRlKTsKKwkJLyogbWFyaywgdGhhdCB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIGlzIHVzZWQgKi8KKwkJaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCisJCQlzZXRfYml0KEdFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCkpLAorCQkJCSh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkgICAgLy8gcmV0dmFsIGNhbiBiZSBOQU1FX0ZPVU5EIG9yIE5BTUVfRk9VTkRfSU5WSVNJQkxFCi0JICAgIHJldHVybiByZXR2YWw7CisJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIG5hbWUgYW5kIG5hbWVsZW4KKwkJZGUtPmRlX2VudHJ5X251bSA9IGk7CisJCXNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKGRlKTsKKworCQlpZiAoKHJldHZhbCA9CisJCSAgICAgcmVpc2VyZnNfbWF0Y2goZGUsIG5hbWUsIG5hbWVsZW4pKSAhPSBOQU1FX05PVF9GT1VORCkgeworCQkJLy8gZGUncyBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9yZWNvcmRsZW4gYXJlIHNldC4gRmlsbCB0aGUgcmVzdDoKKworCQkJLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0CisJCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisKKwkJCXN0b3JlX2RlX2VudHJ5X2tleShkZSk7CisKKwkJCS8vIHJldHZhbCBjYW4gYmUgTkFNRV9GT1VORCBvciBOQU1FX0ZPVU5EX0lOVklTSUJMRQorCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAoR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9paF9rX29mZnNldCAoZGUtPmRlX2loKSkgPT0gMCkKLQkvKiB3ZSBoYXZlIHJlYWNoZWQgbGVmdCBtb3N0IGVudHJ5IGluIHRoZSBub2RlLiBJbiBjb21tb24gd2UKLSAgICAgICAgICAgaGF2ZSB0byBnbyB0byB0aGUgbGVmdCBuZWlnaGJvciwgYnV0IGlmIGdlbmVyYXRpb24gY291bnRlcgotICAgICAgICAgICBpcyAwIGFscmVhZHksIHdlIGtub3cgZm9yIHN1cmUsIHRoYXQgdGhlcmUgaXMgbm8gbmFtZSB3aXRoCi0gICAgICAgICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUgKi8KLQkvLyBGSVhNRTogdGhpcyB3b3JrIGNvcnJlY3RseSBvbmx5IGJlY2F1c2UgaGFzaCB2YWx1ZSBjYW4gbm90Ci0JLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAotCS8vIHNvLCB0aGlzIGlzIGEgYnVnCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWlmIChHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfaWhfa19vZmZzZXQoZGUtPmRlX2loKSkgPT0gMCkKKwkJLyogd2UgaGF2ZSByZWFjaGVkIGxlZnQgbW9zdCBlbnRyeSBpbiB0aGUgbm9kZS4gSW4gY29tbW9uIHdlCisJCSAgIGhhdmUgdG8gZ28gdG8gdGhlIGxlZnQgbmVpZ2hib3IsIGJ1dCBpZiBnZW5lcmF0aW9uIGNvdW50ZXIKKwkJICAgaXMgMCBhbHJlYWR5LCB3ZSBrbm93IGZvciBzdXJlLCB0aGF0IHRoZXJlIGlzIG5vIG5hbWUgd2l0aAorCQkgICB0aGUgc2FtZSBoYXNoIHZhbHVlICovCisJCS8vIEZJWE1FOiB0aGlzIHdvcmsgY29ycmVjdGx5IG9ubHkgYmVjYXVzZSBoYXNoIHZhbHVlIGNhbiBub3QKKwkJLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAorCQkvLyBzbywgdGhpcyBpcyBhIGJ1ZworCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKLSAgICBSRkFMU0UoIGRlLT5kZV9pdGVtX251bSwKLQkgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CisJUkZBTFNFKGRlLT5kZV9pdGVtX251bSwKKwkgICAgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CiAKLSAgICByZXR1cm4gR09UT19QUkVWSU9VU19JVEVNOworCXJldHVybiBHT1RPX1BSRVZJT1VTX0lURU07CiB9CiAKLQogLy8gbWF5IHJldHVybiBOQU1FX0ZPVU5ELCBOQU1FX0ZPVU5EX0lOVklTSUJMRSwgTkFNRV9OT1RfRk9VTkQKIC8vIEZJWE1FOiBzaG91bGQgYWRkIHNvbWV0aGluZyBsaWtlIElPRVJST1IKLXN0YXRpYyBpbnQgcmVpc2VyZnNfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIAotCQkJCXN0cnVjdCBwYXRoICogcGF0aF90b19lbnRyeSwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQorc3RhdGljIGludCByZWlzZXJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgcGF0aCAqcGF0aF90b19lbnRyeSwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXlfdG9fc2VhcmNoOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5X3RvX3NlYXJjaDsKKwlpbnQgcmV0dmFsOwogCisJaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkKKwkJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCi0gICAgaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRSAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCS8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLworCW1ha2VfY3B1X2tleSgma2V5X3RvX3NlYXJjaCwgZGlyLAorCQkgICAgIGdldF90aGlyZF9jb21wb25lbnQoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwKKwkJICAgICBUWVBFX0RJUkVOVFJZLCAzKTsKIAotICAgIC8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleV90b19zZWFyY2gsIGRpciwgCi0JCSAgZ2V0X3RoaXJkX2NvbXBvbmVudCAoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwgVFlQRV9ESVJFTlRSWSwgMyk7CisJd2hpbGUgKDEpIHsKKwkJcmV0dmFsID0KKwkJICAgIHNlYXJjaF9ieV9lbnRyeV9rZXkoZGlyLT5pX3NiLCAma2V5X3RvX3NlYXJjaCwKKwkJCQkJcGF0aF90b19lbnRyeSwgZGUpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCisJCQkJCSBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CiAKLSAgICB3aGlsZSAoMSkgewotCXJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKGRpci0+aV9zYiwgJmtleV90b19zZWFyY2gsIHBhdGhfdG9fZW50cnksIGRlKTsKKwkJLyogY29tcGFyZSBuYW1lcyBmb3IgYWxsIGVudHJpZXMgaGF2aW5nIGdpdmVuIGhhc2ggdmFsdWUgKi8KKwkJcmV0dmFsID0KKwkJICAgIGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0oJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLAorCQkJCQkgICAgICBuYW1lbGVuKTsKKwkJaWYgKHJldHZhbCAhPSBHT1RPX1BSRVZJT1VTX0lURU0pIHsKKwkJCS8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2NhbiBkaXJlY3RvcnkgYW55bW9yZS4gR2l2ZW4gZW50cnkgZm91bmQgb3IgZG9lcyBub3QgZXhpc3QgKi8KKwkJCXBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLworCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5X3RvX3NlYXJjaCwKKwkJCQkgICAgIGxlX2loX2tfb2Zmc2V0KGRlLT5kZV9paCkgLSAxKTsKKwkJcGF0aHJlbHNlKHBhdGhfdG9fZW50cnkpOworCisJfQkJCS8qIHdoaWxlICgxKSAqLworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2VudHJ5KTsKKworCWlmIChSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSA8IGRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSZwYXRoX3RvX2VudHJ5LCAmZGUpOworCXBhdGhyZWxzZSgmcGF0aF90b19lbnRyeSk7CisJaWYgKHJldHZhbCA9PSBOQU1FX0ZPVU5EKSB7CisJCS8qIEhpZGUgdGhlIC5yZWlzZXJmc19wcml2IGRpcmVjdG9yeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGRpci0+aV9zYikgJiYKKwkJICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgorCQkgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCisJCSAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKKwkJICAgIGRlLmRlX29iamVjdGlkID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGRpci0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPgorCQkJCWtfb2JqZWN0aWQpKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisKKwkJaW5vZGUgPQorCQkgICAgcmVpc2VyZnNfaWdldChkaXItPmlfc2IsIChzdHJ1Y3QgY3B1X2tleSAqKSYoZGUuZGVfZGlyX2lkKSk7CisJCWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCisJCS8qIFByb3BvZ2F0ZSB0aGUgcHJpdl9vYmplY3QgZmxhZyBzbyB3ZSBrbm93IHdlJ3JlIGluIHRoZSBwcml2IHRyZWUgKi8KKwkJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGRpcikpCisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18pOwotCSAgICByZXR1cm4gSU9fRVJST1I7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAotCS8qIGNvbXBhcmUgbmFtZXMgZm9yIGFsbCBlbnRyaWVzIGhhdmluZyBnaXZlbiBoYXNoIHZhbHVlICovCi0JcmV0dmFsID0gbGluZWFyX3NlYXJjaF9pbl9kaXJfaXRlbSAoJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLCBuYW1lbGVuKTsKLQlpZiAocmV0dmFsICE9IEdPVE9fUFJFVklPVVNfSVRFTSkgewotCSAgICAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHNjYW4gZGlyZWN0b3J5IGFueW1vcmUuIEdpdmVuIGVudHJ5IGZvdW5kIG9yIGRvZXMgbm90IGV4aXN0ICovCi0JICAgIHBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9CisJaWYgKGlub2RlKQorCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAKLQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5X3RvX3NlYXJjaCwgbGVfaWhfa19vZmZzZXQgKGRlLT5kZV9paCkgLSAxKTsKLQlwYXRocmVsc2UgKHBhdGhfdG9fZW50cnkpOwotCi0gICAgfSAvKiB3aGlsZSAoMSkgKi8KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlaXNlcmZzX2xvb2t1cCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0KLSAgICBpZiAoUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpIDwgZGVudHJ5LT5kX25hbWUubGVuKQotCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgPT0gTkFNRV9GT1VORCkgewotICAgICAgICAvKiBIaWRlIHRoZSAucmVpc2VyZnNfcHJpdiBkaXJlY3RvcnkgKi8KLQlpZiAocmVpc2VyZnNfeGF0dHJzIChkaXItPmlfc2IpICYmCi0JICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgotICAgICAgICAgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCi0gICAgICAgICAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKLQkgICAgZGUuZGVfb2JqZWN0aWQgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpIHsKLQkgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoZGlyLT5pX3NiKTsKLQkgIHJldHVybiBFUlJfUFRSICgtRUFDQ0VTKTsKLQl9Ci0KLQlpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLQlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JICAgIHJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgICAgICB9Ci0KLQkvKiBQcm9wb2dhdGUgdGhlIHByaXZfb2JqZWN0IGZsYWcgc28gd2Uga25vdyB3ZSdyZSBpbiB0aGUgcHJpdiB0cmVlICovCi0JaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKQotCSAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKCByZXR2YWwgPT0gSU9fRVJST1IgKSB7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTyk7Ci0gICAgfQotCi0gICAgaWYgKGlub2RlKQotCSAgICByZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0gICAgCi0gICAgZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogLyogCiAqKiBsb29rcyB1cCB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBjaGlsZC4KICoqIHRha2VuIGZyb20gZXh0Ml9nZXRfcGFyZW50CiAqLwogc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0gICAgc3RydWN0IGRlbnRyeSAqcGFyZW50OwotICAgIHN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGUgOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19lbnRyeSk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGU7CiAKKwlpZiAoZGlyLT5pX25saW5rID09IDApIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoZGlyLT5pX25saW5rID09IDApIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLSAgICB9Ci0gICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsICIuLiIsIDIsICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgIi4uIiwgMiwgJnBhdGhfdG9fZW50cnksICZkZSk7CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwlpbm9kZSA9IHJlaXNlcmZzX2lnZXQoZGlyLT5pX3NiLCAoc3RydWN0IGNwdV9rZXkgKikmKGRlLmRlX2Rpcl9pZCkpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotICAgIH0KLSAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAotICAgIGlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgewotCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgIH0KLSAgICBwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotICAgIGlmICghcGFyZW50KSB7Ci0JaXB1dChpbm9kZSk7Ci0JcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudDsKKwlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7CiB9CiAKLQogLyogYWRkIGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgKGVudHJ5IGNhbiBiZSBoaWRkZW4pLiAKIAogaW5zZXJ0IGRlZmluaXRpb24gb2Ygd2hlbiBoaWRkZW4gZGlyZWN0b3JpZXMgYXJlIHVzZWQgaGVyZSAtSGFucwogCiAgRG9lcyBub3QgbWFyayBkaXIgICBpbm9kZSBkaXJ0eSwgZG8gaXQgYWZ0ZXIgc3VjY2Vzc2VzZnVsbCBjYWxsIHRvIGl0ICovCiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfYWRkX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkgICAgICAgaW50IHZpc2libGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX2FkZF9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB2aXNpYmxlKQogewotICAgIHN0cnVjdCBjcHVfa2V5IGVudHJ5X2tleTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgaW50IGJpdF9zdHJpbmcgW01BWF9HRU5FUkFUSU9OX05VTUJFUiAvIChzaXplb2YoaW50KSAqIDgpICsgMV07Ci0gICAgaW50IGdlbl9udW1iZXI7Ci0gICAgY2hhciBzbWFsbF9idWZbMzIrREVIX1NJWkVdIDsgLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgY3JlYXRlIGZpbGUgd2l0aCBzaG9ydCBuYW1lICovCi0gICAgY2hhciAqIGJ1ZmZlcjsKLSAgICBpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkgZW50cnlfa2V5OworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJaW50IGJpdF9zdHJpbmdbTUFYX0dFTkVSQVRJT05fTlVNQkVSIC8gKHNpemVvZihpbnQpICogOCkgKyAxXTsKKwlpbnQgZ2VuX251bWJlcjsKKwljaGFyIHNtYWxsX2J1ZlszMiArIERFSF9TSVpFXTsJLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCisJCQkJCSAgIGlmIHdlIGNyZWF0ZSBmaWxlIHdpdGggc2hvcnQgbmFtZSAqLworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOworCWludCByZXR2YWw7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBjYW5ub3QgYWxsb3cgaXRlbXMgdG8gYmUgYWRkZWQgaW50byBhIGJ1c3kgZGVsZXRlZCBkaXJlY3RvcnkgKi8KLSAgICBpZiAoIW5hbWVsZW4pCi0JcmV0dXJuIC1FSU5WQUw7CisJLyogY2Fubm90IGFsbG93IGl0ZW1zIHRvIGJlIGFkZGVkIGludG8gYSBidXN5IGRlbGV0ZWQgZGlyZWN0b3J5ICovCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQotCXJldHVybiAtRU5BTUVUT09MT05HOworCWlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOwogCi0gICAgLyogZWFjaCBlbnRyeSBoYXMgdW5pcXVlIGtleS4gY29tcG9zZSBpdCAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVudHJ5X2tleSwgZGlyLCAKLQkJICBnZXRfdGhpcmRfY29tcG9uZW50IChkaXItPmlfc2IsIG5hbWUsIG5hbWVsZW4pLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkvKiBlYWNoIGVudHJ5IGhhcyB1bmlxdWUga2V5LiBjb21wb3NlIGl0ICovCisJbWFrZV9jcHVfa2V5KCZlbnRyeV9rZXksIGRpciwKKwkJICAgICBnZXRfdGhpcmRfY29tcG9uZW50KGRpci0+aV9zYiwgbmFtZSwgbmFtZWxlbiksCisJCSAgICAgVFlQRV9ESVJFTlRSWSwgMyk7CiAKLSAgICAvKiBnZXQgbWVtb3J5IGZvciBjb21wb3NpbmcgdGhlIGVudHJ5ICovCi0gICAgYnVmbGVuID0gREVIX1NJWkUgKyBST1VORF9VUCAobmFtZWxlbik7Ci0gICAgaWYgKGJ1ZmxlbiA+IHNpemVvZiAoc21hbGxfYnVmKSkgewotCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MgKGJ1ZmxlbiwgR0ZQX05PRlMsIGRpci0+aV9zYik7Ci0JaWYgKGJ1ZmZlciA9PSAwKQotCSAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9IGVsc2UKLQlidWZmZXIgPSBzbWFsbF9idWY7CisJLyogZ2V0IG1lbW9yeSBmb3IgY29tcG9zaW5nIHRoZSBlbnRyeSAqLworCWJ1ZmxlbiA9IERFSF9TSVpFICsgUk9VTkRfVVAobmFtZWxlbik7CisJaWYgKGJ1ZmxlbiA+IHNpemVvZihzbWFsbF9idWYpKSB7CisJCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MoYnVmbGVuLCBHRlBfTk9GUywgZGlyLT5pX3NiKTsKKwkJaWYgKGJ1ZmZlciA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlCisJCWJ1ZmZlciA9IHNtYWxsX2J1ZjsKIAotICAgIHBhc3RlX3NpemUgPSAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRpcikgPT0gU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOworCXBhc3RlX3NpemUgPQorCSAgICAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PQorCSAgICAgU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOwogCi0gICAgLyogZmlsbCBidWZmZXIgOiBkaXJlY3RvcnkgZW50cnkgaGVhZCwgbmFtZVssIGRpciBvYmplY3RpZCB8ICwgc3RhdCBkYXRhIHwgLHN0YXQgZGF0YSwgZGlyIG9iamVjdGlkIF0gKi8KLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilidWZmZXI7Ci0gICAgZGVoLT5kZWhfbG9jYXRpb24gPSAwOyAvKiBKRE0gRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCBkZWgsIGNwdV9rZXlfa19vZmZzZXQoICZlbnRyeV9rZXkgKSApOwotICAgIGRlaC0+ZGVoX3N0YXRlID0gMDsgLyogSkRNIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICAvKiBwdXQga2V5IChpbm8gYW5hbG9nKSB0byBkZSAqLwotICAgIGRlaC0+ZGVoX2Rpcl9pZCA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7IC8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCi0gICAgZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQ7IC8qIHNhZmU6IGtfb2JqZWN0aWQgaXMgbGUgKi8KKwkvKiBmaWxsIGJ1ZmZlciA6IGRpcmVjdG9yeSBlbnRyeSBoZWFkLCBuYW1lWywgZGlyIG9iamVjdGlkIHwgLCBzdGF0IGRhdGEgfCAsc3RhdCBkYXRhLCBkaXIgb2JqZWN0aWQgXSAqLworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJ1ZmZlcjsKKwlkZWgtPmRlaF9sb2NhdGlvbiA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9vZmZzZXQoZGVoLCBjcHVfa2V5X2tfb2Zmc2V0KCZlbnRyeV9rZXkpKTsKKwlkZWgtPmRlaF9zdGF0ZSA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJLyogcHV0IGtleSAoaW5vIGFuYWxvZykgdG8gZGUgKi8KKwlkZWgtPmRlaF9kaXJfaWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQ7CS8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCisJZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZDsJLyogc2FmZToga19vYmplY3RpZCBpcyBsZSAqLwogCi0gICAgLyogY29weSBuYW1lICovCi0gICAgbWVtY3B5ICgoY2hhciAqKShkZWggKyAxKSwgbmFtZSwgbmFtZWxlbik7Ci0gICAgLyogcGFkZCBieSAwcyB0byB0aGUgNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgcGFkZF9pdGVtICgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAgKG5hbWVsZW4pLCBuYW1lbGVuKTsKKwkvKiBjb3B5IG5hbWUgKi8KKwltZW1jcHkoKGNoYXIgKikoZGVoICsgMSksIG5hbWUsIG5hbWVsZW4pOworCS8qIHBhZGQgYnkgMHMgdG8gdGhlIDQgYnl0ZSBib3VuZGFyeSAqLworCXBhZGRfaXRlbSgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAobmFtZWxlbiksIG5hbWVsZW4pOwogCi0gICAgLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLwotICAgIG1hcmtfZGVfd2l0aG91dF9zZCAoZGVoKTsKLSAgICB2aXNpYmxlID8gbWFya19kZV92aXNpYmxlIChkZWgpIDogbWFya19kZV9oaWRkZW4gKGRlaCk7CisJLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLworCW1hcmtfZGVfd2l0aG91dF9zZChkZWgpOworCXZpc2libGUgPyBtYXJrX2RlX3Zpc2libGUoZGVoKSA6IG1hcmtfZGVfaGlkZGVuKGRlaCk7CiAKLSAgICAvKiBmaW5kIHRoZSBwcm9wZXIgcGxhY2UgZm9yIHRoZSBuZXcgZW50cnkgKi8KLSAgICBtZW1zZXQgKGJpdF9zdHJpbmcsIDAsIHNpemVvZiAoYml0X3N0cmluZykpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IChjaGFyICopYml0X3N0cmluZzsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIG5hbWUsIG5hbWVsZW4sICZwYXRoLCAmZGUpOwotICAgIGlmKCByZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQgKSB7CisJLyogZmluZCB0aGUgcHJvcGVyIHBsYWNlIGZvciB0aGUgbmV3IGVudHJ5ICovCisJbWVtc2V0KGJpdF9zdHJpbmcsIDAsIHNpemVvZihiaXRfc3RyaW5nKSk7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gKGNoYXIgKiliaXRfc3RyaW5nOworCXJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkoZGlyLCBuYW1lLCBuYW1lbGVuLCAmcGF0aCwgJmRlKTsKKwlpZiAocmV0dmFsICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLAorCQkJCQkgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCisJCQkJCSAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCisJCQkJCSBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCX0KKworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlnZW5fbnVtYmVyID0KKwkgICAgZmluZF9maXJzdF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKWJpdF9zdHJpbmcsCisJCQkJTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7CisJaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKKwkJLyogdGhlcmUgaXMgbm8gZnJlZSBnZW5lcmF0aW9uIG51bWJlciAqLworCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKKwkJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCisJCQlyZWlzZXJmc19rZnJlZShidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KKwlwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmZW50cnlfa2V5LCBkZWhfb2Zmc2V0KGRlaCkpOworCisJLyogdXBkYXRlIG1heC1oYXNoLWNvbGxpc2lvbnMgY291bnRlciBpbiByZWlzZXJmc19zYl9pbmZvICovCisJUFJPQ19JTkZPX01BWCh0aC0+dF9zdXBlciwgbWF4X2hhc2hfY29sbGlzaW9ucywgZ2VuX251bWJlcik7CisKKwlpZiAoZ2VuX251bWJlciAhPSAwKSB7CS8qIHdlIG5lZWQgdG8gcmUtc2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50ICovCisJCWlmIChzZWFyY2hfYnlfZW50cnlfa2V5KGRpci0+aV9zYiwgJmVudHJ5X2tleSwgJnBhdGgsICZkZSkgIT0KKwkJICAgIE5BTUVfTk9UX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkJICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKKwkJCQkJICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAorCQkJCQkgJmVudHJ5X2tleSk7CisKKwkJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJCXJlaXNlcmZzX2tmcmVlKGJ1ZmZlciwgYnVmbGVuLCBkaXItPmlfc2IpOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBwZXJmb3JtIHRoZSBpbnNlcnRpb24gb2YgdGhlIGVudHJ5IHRoYXQgd2UgaGF2ZSBwcmVwYXJlZCAqLworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgJnBhdGgsICZlbnRyeV9rZXksIGRpciwgYnVmZmVyLAorCQkJCSAgICAgcGFzdGVfc2l6ZSk7CiAJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLQotCWlmICggcmV0dmFsID09IElPX0VSUk9SICkgewotCSAgICByZXR1cm4gLUVJTzsKKwkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLSAgICAgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCi0JCQkgICAgICAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Ci0gICAgICAgfQorCWRpci0+aV9zaXplICs9IHBhc3RlX3NpemU7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKKwkJLy8gcmVpc2VyZnNfbWtkaXIgb3IgcmVpc2VyZnNfcmVuYW1lIHdpbGwgZG8gdGhhdCBieSBpdHNlbGYKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBkaXIpOwogCi0JcmV0dXJuIC1FRVhJU1Q7Ci0gICAgfQotCi0gICAgZ2VuX251bWJlciA9IGZpbmRfZmlyc3RfemVyb19iaXQgKCh1bnNpZ25lZCBsb25nICopYml0X3N0cmluZywgTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7Ci0gICAgaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKLSAgICAgIC8qIHRoZXJlIGlzIG5vIGZyZWUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKLSAgICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotICAgICAgICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0gICAgLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KLSAgICBwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJmVudHJ5X2tleSwgZGVoX29mZnNldChkZWgpKTsKLSAKLSAgICAvKiB1cGRhdGUgbWF4LWhhc2gtY29sbGlzaW9ucyBjb3VudGVyIGluIHJlaXNlcmZzX3NiX2luZm8gKi8KLSAgICBQUk9DX0lORk9fTUFYKCB0aCAtPiB0X3N1cGVyLCBtYXhfaGFzaF9jb2xsaXNpb25zLCBnZW5fbnVtYmVyICk7Ci0gCQkgIAotICAgIGlmIChnZW5fbnVtYmVyICE9IDApIHsJLyogd2UgbmVlZCB0byByZS1zZWFyY2ggZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgKi8KLSAgICAgIGlmIChzZWFyY2hfYnlfZW50cnlfa2V5IChkaXItPmlfc2IsICZlbnRyeV9rZXksICZwYXRoLCAmZGUpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X2tleSk7Ci0KLQkgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQkgICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0JICAgIHJldHVybiAtRUJVU1k7Ci0JfQotICAgIH0KLSAgCi0gICAgLyogcGVyZm9ybSB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdlIGhhdmUgcHJlcGFyZWQgKi8KLSAgICByZXR2YWwgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHRoLCAmcGF0aCwgJmVudHJ5X2tleSwgZGlyLCBidWZmZXIsIHBhc3RlX3NpemUpOwotICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotCXJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgZGlyLT5pX3NpemUgKz0gcGFzdGVfc2l6ZTsKLSAgICBkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKLQkvLyByZWlzZXJmc19ta2RpciBvciByZWlzZXJmc19yZW5hbWUgd2lsbCBkbyB0aGF0IGJ5IGl0c2VsZgotCXJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIGRpcik7Ci0KLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHF1b3RhIHV0aWxpdHkgZnVuY3Rpb24sIGNhbGwgaWYgeW91J3ZlIGhhZCB0byBhYm9ydCBhZnRlciBjYWxsaW5nCkBAIC01NDgsMTIgKzU3MSwxMyBAQAogKiogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gaW5vZGVzIHRoYXQgZG8gbm90IGhhdmUgc3RhdCBkYXRhCiAqKiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIHlldC4KICovCi1zdGF0aWMgaW50IGRyb3BfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBEUVVPVF9EUk9QKGlub2RlKTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSkgOwotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKLSAgICBpcHV0KGlub2RlKSA7Ci0gICAgcmV0dXJuIDAgOworc3RhdGljIGludCBkcm9wX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCURRVU9UX0RST1AoaW5vZGUpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBkb2VzIHNldHVwIGZvciByZWlzZXJmc19uZXdfaW5vZGUuICAKQEAgLTU2MSw5MDUgKzU4NSw5NjggQEAKICoqIG91dHNpZGUgb2YgYSB0cmFuc2FjdGlvbiwgc28gd2UgaGFkIHRvIHB1bGwgc29tZSBiaXRzIG9mCiAqKiByZWlzZXJmc19uZXdfaW5vZGUgb3V0IGludG8gdGhpcyBmdW5jLgogKi8KLXN0YXRpYyBpbnQgbmV3X2lub2RlX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlKSB7CitzdGF0aWMgaW50IG5ld19pbm9kZV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKK3sKIAotICAgIC8qIHRoZSBxdW90YSBpbml0IGNhbGxzIGhhdmUgdG8ga25vdyB3aG8gdG8gY2hhcmdlIHRoZSBxdW90YSB0bywgc28KLSAgICAqKiB3ZSBoYXZlIHRvIHNldCB1aWQgYW5kIGdpZCBoZXJlCi0gICAgKi8KLSAgICBpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKLSAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkvKiB0aGUgcXVvdGEgaW5pdCBjYWxscyBoYXZlIHRvIGtub3cgd2hvIHRvIGNoYXJnZSB0aGUgcXVvdGEgdG8sIHNvCisJICoqIHdlIGhhdmUgdG8gc2V0IHVpZCBhbmQgZ2lkIGhlcmUKKwkgKi8KKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAotICAgIGlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKLSAgICAgICAgaWYgKFNfSVNESVIobW9kZSkpCi0gICAgICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0gICAgfQotICAgIERRVU9UX0lOSVQoaW5vZGUpOwotICAgIHJldHVybiAwIDsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZSB7CisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCX0KKwlEUVVPVF9JTklUKGlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKLQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW50IHJlaXNlcmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCS8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsKKwkgICAgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBsb2NrZWQ7CiAKLSAgICBpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgewotCXJldHVybiAtRU5PTUVNIDsKLSAgICB9Ci0gICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CisJaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOwogCi0gICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisJbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woZGlyKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CiAKLSAgICBpZiAobG9ja2VkKQotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhkaXItPmlfc2IpOwogCi0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7Ci0gICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlpZiAocmV0dmFsKSB7CisJCWRyb3BfbmV3X2lub2RlKGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAvKmlfc2l6ZSovLCBkZW50cnksIGlub2RlKTsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9mYWlsZWQ7Ci0JCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOwotICAgICAgICBsb2NrZWQgPSAwOwotICAgIH0KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAgLyppX3NpemUgKi8gLCBkZW50cnksCisJCQkgICAgICAgaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZhaWxlZDsKIAotICAgIGlub2RlLT5pX29wID0gJnJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLSAgICBpbm9kZS0+aV9mb3AgPSAmcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zOwotICAgIGlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA7CisJaWYgKGxvY2tlZCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJCWxvY2tlZCA9IDA7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKLQkJCQlpbm9kZSwgMS8qdmlzaWJsZSovKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwogCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQlpZiAoZXJyKQorCQkJcmV0dmFsID0gZXJyOworCQlpcHV0KGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOwogCi1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCisgICAgICBvdXRfZmFpbGVkOgorCWlmIChsb2NrZWQpCisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCi0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgIGRldl90IHJkZXYpCiB7Ci0gICAgaW50IHJldHZhbDsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKStSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7Ci0gICAgaW50IGxvY2tlZDsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCisJICAgIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSArCisJCSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7CisJaW50IGxvY2tlZDsKIAotICAgIGlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKLQlyZXR1cm4gLUVOT01FTSA7Ci0gICAgfQotICAgIG5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOworCWlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwluZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKIAotICAgIGxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChkaXIpOworCWxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKGRpcik7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwogCi0gICAgaWYgKGxvY2tlZCkKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRpci0+aV9zYik7CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGlyLT5pX3NiKTsKIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTCwgMC8qaV9zaXplKi8sIGRlbnRyeSwgaW5vZGUpOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAgLyppX3NpemUgKi8gLCBkZW50cnksCisJCQkgICAgICAgaW5vZGUpOworCWlmIChyZXR2YWwpIHsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKLSAgICAgICAgbG9ja2VkID0gMDsKLSAgICB9CisJaWYgKGxvY2tlZCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJCWxvY2tlZCA9IDA7CisJfQogCisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CiAKLSAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KSA7CisJLy9GSVhNRTogbmVlZGVkIGZvciBibG9jayBhbmQgY2hhciBkZXZpY2VzIG9ubHkKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CiAKLSAgICAvL0ZJWE1FOiBuZWVkZWQgZm9yIGJsb2NrIGFuZCBjaGFyIGRldmljZXMgb25seQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKTsKIAotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZSwgMSAvKnZpc2libGUgKi8gKTsKKwlpZiAocmV0dmFsKSB7CisJCWludCBlcnI7CisJCWlub2RlLT5pX25saW5rLS07CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKLQkJCQkgaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotICAgICAgICBpbnQgZXJyOwotCWlub2RlLT5pX25saW5rLS07Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgICAgIGlmIChlcnIpCi0JICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwogCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0KLW91dF9mYWlsZWQ6Ci0gICAgaWYgKGxvY2tlZCkKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOworICAgICAgb3V0X2ZhaWxlZDoKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX21rZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKworCSAgICAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCWludCBsb2NrZWQ7CiAKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgLyogc2V0IGZsYWcgdGhhdCBuZXcgcGFja2luZyBsb2NhbGl0eSBjcmVhdGVkIGFuZCBuZXcgYmxvY2tzIGZvciB0aGUgY29udGVudCAgICAgKiBvZiB0aGF0IGRpcmVjdG9yeSBhcmUgbm90IGRpc3BsYWNlZCB5ZXQgKi8KLSAgICBSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5ID0gMTsKKwkvKiBzZXQgZmxhZyB0aGF0IG5ldyBwYWNraW5nIGxvY2FsaXR5IGNyZWF0ZWQgYW5kIG5ldyBibG9ja3MgZm9yIHRoZSBjb250ZW50ICAgICAqIG9mIHRoYXQgZGlyZWN0b3J5IGFyZSBub3QgZGlzcGxhY2VkIHlldCAqLworCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAxOwogI2VuZGlmCi0gICAgbW9kZSA9IFNfSUZESVIgfCBtb2RlOwotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKwltb2RlID0gU19JRkRJUiB8IG1vZGU7CisJaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOwogCi0gICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisJbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woZGlyKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICBpZiAobG9ja2VkKQotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGlyLT5pX3NiKTsKIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCisJLyogaW5jIHRoZSBsaW5rIGNvdW50IG5vdywgc28gYW5vdGhlciB3cml0ZXIgZG9lc24ndCBvdmVyZmxvdyBpdCB3aGlsZQorCSAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KKwkgKi8KKwlJTkNfRElSX0lOT0RFX05MSU5LKGRpcikKIAotICAgIC8qIGluYyB0aGUgbGluayBjb3VudCBub3csIHNvIGFub3RoZXIgd3JpdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cgaXQgd2hpbGUKLSAgICAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KLSAgICAqLwotICAgIElOQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwgLypzeW1saW5rICovICwKKwkJCQkJb2xkX2Zvcm1hdF9vbmx5KGRpci0+aV9zYikgPworCQkJCQlFTVBUWV9ESVJfU0laRV9WMSA6IEVNUFRZX0RJUl9TSVpFLAorCQkJCQlkZW50cnksIGlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCWRpci0+aV9ubGluay0tOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTC8qc3ltbGluayovLAotCQkJCW9sZF9mb3JtYXRfb25seSAoZGlyLT5pX3NiKSA/IAotCQkJCUVNUFRZX0RJUl9TSVpFX1YxIDogRU1QVFlfRElSX1NJWkUsCi0JCQkJZGVudHJ5LCBpbm9kZSk7Ci0gICAgaWYgKHJldHZhbCkgewotCWRpci0+aV9ubGluay0tIDsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQorCWlmIChsb2NrZWQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCQlsb2NrZWQgPSAwOworCX0KIAotICAgIGlmIChsb2NrZWQpIHsKLQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOwotCWxvY2tlZCA9IDA7Ci0gICAgfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcik7CiAKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwogCi0gICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworCS8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQorCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX2FkZF9lbnRyeSgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlERUNfRElSX0lOT0RFX05MSU5LKGRpcik7CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCS8vIHRoZSBhYm92ZSBhZGRfZW50cnkgZGlkIG5vdCB1cGRhdGUgZGlyJ3Mgc3RhdCBkYXRhCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKIAotICAgIC8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwotCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlpZiAoZXJyKQotCSAgICByZXR2YWwgPSBlcnI7Ci0JaXB1dCAoaW5vZGUpOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9Ci0KLSAgICAvLyB0aGUgYWJvdmUgYWRkX2VudHJ5IGRpZCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBkaXIpOwotCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICAvKiB3ZSBjYW4gY2hlYXQgYmVjYXVzZSBhbiBvbGQgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFLCBhbmQgYSBuZXcgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCi0gICAgKiogcmVnYXJkbGVzcyBvZiBkaXNrIGZvcm1hdCB2ZXJzaW9uLCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LgotICAgICovCi0gICAgaWYgKGlub2RlLT5pX3NpemUgIT0gRU1QVFlfRElSX1NJWkUgJiYKLSAgICAgICAgaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRV9WMSkgewotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIHJldHVybiAxIDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0gICAgaW50IHJldHZhbCwgZXJyOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBqYmVnaW5fY291bnQ7IAotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLQotCi0gICAgLyogd2Ugd2lsbCBiZSBkb2luZyAyIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZSAyIHN0YXQgZGF0YSwgd2UgY2hhbmdlIHF1b3RhcwotICAgICAqIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZiB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gICAgICogVGhlIHF1b3RhIHN0cnVjdHVyZSBpcyBwb3NzaWJseSBkZWxldGVkIG9ubHkgb24gbGFzdCBpcHV0ID0+IG91dHNpZGUKLSAgICAgKiBvZiB0aGlzIHRyYW5zYWN0aW9uICovCi0gICAgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArIDQgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKTsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9ybWRpcjsKLQotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgewotCXJldHZhbCA9IC1FTk9FTlQ7Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfSBlbHNlIGlmICggcmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF9ybWRpcjsKLSAgICB9Ci0KLSAgICBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKLQotICAgIGlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKLQkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKLQkvLyBlbnRyeQotCXJldHZhbCA9IC1FSU87Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfQotICAgIGlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgewotCXJldHZhbCA9IC1FTk9URU1QVFk7Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfQotCi0gICAgLyogY3V0IGVudHJ5IGZyb20gZGlyIGRpcmVjdG9yeSAqLwotICAgIHJldHZhbCA9IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKCZ0aCwgJnBhdGgsICYoZGUuZGVfZW50cnlfa2V5KSwgZGlyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBwYWdlICovIAotCQkJCSAgICAgMC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUqLyk7Ci0gICAgaWYgKHJldHZhbCA8IDApCi0JZ290byBlbmRfcm1kaXI7Ci0KLSAgICBpZiAoIGlub2RlLT5pX25saW5rICE9IDIgJiYgaW5vZGUtPmlfbmxpbmsgIT0gMSApCi0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayAiCi0JCQkgICIhPSAyICglZCkiLCBfX0ZVTkNUSU9OX18sIGlub2RlLT5pX25saW5rKTsKLQotICAgIGlub2RlLT5pX25saW5rID0gMDsKLSAgICBpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQotICAgIERFQ19ESVJfSU5PREVfTkxJTksoZGlyKQotICAgIGRpci0+aV9zaXplIC09IChERUhfU0laRSArIGRlLmRlX2VudHJ5bGVuKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKLQotICAgIC8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCi0gICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0KLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotb3V0X3JtZGlyOgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci0JCi0gZW5kX3JtZGlyOgotICAgIC8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAotICAgICAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKLSAgICAgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KLSAgICBwYXRocmVsc2UgKCZwYXRoKTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc191bmxpbmsgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQotewotICAgIGludCByZXR2YWwsIGVycjsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGpiZWdpbl9jb3VudDsKLSAgICB1bnNpZ25lZCBsb25nIHNhdmVsaW5rOwotCi0gICAgaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0KLSAgICAvKiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdlIGNhbiBiZSBkb2luZyBhdCBtYXggdHdvIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZQotICAgICAqIHR3byBzdGF0IGRhdGFzLCB3ZSBjaGFuZ2UgcXVvdGFzIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZgotICAgICAqIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4gVGhlIHF1b3RhIHN0cnVjdHVyZSBpcyBwb3NzaWJseQotICAgICAqIGRlbGV0ZWQgb25seSBvbiBpcHV0ID0+IG91dHNpZGUgb2YgdGhpcyB0cmFuc2FjdGlvbiAqLwotICAgIGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKyA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYik7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgaWYgKHJldHZhbCkKLSAgICAgICAgZ290byBvdXRfdW5saW5rOwotCQotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgewotCXJldHZhbCA9IC1FTk9FTlQ7Ci0JZ290byBlbmRfdW5saW5rOwotICAgIH0gZWxzZSBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF91bmxpbms7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOwotCi0gICAgaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgewotCS8vIEZJWE1FOiBjb21wYXJlIGtleSBvZiBhbiBvYmplY3QgYW5kIGEga2V5IGZvdW5kIGluIHRoZQotCS8vIGVudHJ5Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF91bmxpbms7Ci0gICAgfQotICAKLSAgICBpZiAoIWlub2RlLT5pX25saW5rKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCi0JCQkgICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCi0JCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubywKLQkJCSAgaW5vZGUtPmlfbmxpbmspOwotCWlub2RlLT5pX25saW5rID0gMTsKLSAgICB9Ci0KLSAgICBpbm9kZS0+aV9ubGluay0tOwotCi0gICAgLyoKLSAgICAgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluawotICAgICAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKLSAgICAgKi8KLSAgICBzYXZlbGluayA9IGlub2RlLT5pX25saW5rOwotCi0KLSAgICByZXR2YWwgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtICgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwgMCk7Ci0gICAgaWYgKHJldHZhbCA8IDApIHsKLQlpbm9kZS0+aV9ubGluaysrOwotCWdvdG8gZW5kX3VubGluazsKLSAgICB9Ci0gICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0KLSAgICBkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7Ci0gICAgZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKLQotICAgIGlmICghc2F2ZWxpbmspCi0gICAgICAgLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCi0gICAgICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0KLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci0KLSBlbmRfdW5saW5rOgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dmFsID0gZXJyOwotb3V0X3VubGluazoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJlaXNlcmZzX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqIHBhcmVudF9kaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQotewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgY2hhciAqIG5hbWU7Ci0gICAgaW50IGl0ZW1fbGVuOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKLSAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocGFyZW50X2Rpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKHBhcmVudF9kaXItPmlfc2IpKTsKLQotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgewotCXJldHVybiAtRU5PTUVNIDsKLSAgICB9Ci0gICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICBpdGVtX2xlbiA9IFJPVU5EX1VQIChzdHJsZW4gKHN5bW5hbWUpKTsKLSAgICBpZiAoaXRlbV9sZW4gPiBNQVhfRElSRUNUX0lURU1fTEVOIChwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKLQlyZXR2YWwgPSAgLUVOQU1FVE9PTE9ORzsKLQlkcm9wX25ld19pbm9kZShpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLSAgCi0gICAgbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MgKGl0ZW1fbGVuLCBHRlBfTk9GUywgcGFyZW50X2Rpci0+aV9zYik7Ci0gICAgaWYgKCFuYW1lKSB7Ci0JZHJvcF9uZXdfaW5vZGUoaW5vZGUpOwotCXJldHZhbCA9ICAtRU5PTUVNOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9Ci0gICAgbWVtY3B5IChuYW1lLCBzeW1uYW1lLCBzdHJsZW4gKHN5bW5hbWUpKTsKLSAgICBwYWRkX2l0ZW0gKG5hbWUsIGl0ZW1fbGVuLCBzdHJsZW4gKHN5bW5hbWUpKTsKLQotICAgIC8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLwotCi0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgcmVpc2VyZnNfa2ZyZWUgKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBwYXJlbnRfZGlyLCBtb2RlLCBuYW1lLCBzdHJsZW4gKHN5bW5hbWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnRyeSwgaW5vZGUpOwotICAgIHJlaXNlcmZzX2tmcmVlIChuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7Ci0gICAgaWYgKHJldHZhbCkgeyAvKiByZWlzZXJmc19uZXdfaW5vZGUgaXB1dHMgZm9yIHVzICovCi0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwYXJlbnRfZGlyKSA7Ci0KLSAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwotCi0gICAgLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KLSAgICAvLwotICAgIC8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7Ci0KLSAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgcGFyZW50X2RpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxLyp2aXNpYmxlKi8pOwotICAgIGlmIChyZXR2YWwpIHsKLQlpbnQgZXJyOwotCWlub2RlLT5pX25saW5rLS07Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotCWlmIChlcnIpCi0JICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBwYXJlbnRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLW91dF9mYWlsZWQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBhcmVudF9kaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKLXsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArIHVwZGF0ZSBvZiBxdW90YXMgZm9yIHRoZSBvd25lcnMgb2YgdGhlIGRpcmVjdG9yeSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYik7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKGlub2RlLT5pX25saW5rID49IFJFSVNFUkZTX0xJTktfTUFYKSB7Ci0JLy9GSVhNRTogc2RfbmxpbmsgaXMgMzIgYml0IGZvciBuZXcgZmlsZXMKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworICAgICAgb3V0X2ZhaWxlZDoKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CiAJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JcmV0dXJuIC1FTUxJTks7Ci0gICAgfQotICAgIGlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9CisJcmV0dXJuIHJldHZhbDsKK30KIAotICAgIC8qIGluYyBiZWZvcmUgc2NoZWR1bGluZyBzbyByZWlzZXJmc191bmxpbmsga25vd3Mgd2UgYXJlIGhlcmUgKi8KLSAgICBpbm9kZS0+aV9ubGluaysrOworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogd2UgY2FuIGNoZWF0IGJlY2F1c2UgYW4gb2xkIGZvcm1hdCBkaXIgY2Fubm90IGhhdmUKKwkgKiogRU1QVFlfRElSX1NJWkUsIGFuZCBhIG5ldyBmb3JtYXQgZGlyIGNhbm5vdCBoYXZlCisJICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCisJICoqIHJlZ2FyZGxlc3Mgb2YgZGlzayBmb3JtYXQgdmVyc2lvbiwgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRSAmJgorCSAgICBpbm9kZS0+aV9zaXplICE9IEVNUFRZX0RJUl9TSVpFX1YxKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgaW5vZGUtPmlfbmxpbmstLTsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsLCBlcnI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBqYmVnaW5fY291bnQ7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CiAKLSAgICAvKiBjcmVhdGUgbmV3IGVudHJ5ICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAotCQkJCSBpbm9kZSwgMS8qdmlzaWJsZSovKTsKKwkvKiB3ZSB3aWxsIGJlIGRvaW5nIDIgYmFsYW5jaW5ncyBhbmQgdXBkYXRlIDIgc3RhdCBkYXRhLCB3ZSBjaGFuZ2UgcXVvdGFzCisJICogb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5IGRlbGV0ZWQgb25seSBvbiBsYXN0IGlwdXQgPT4gb3V0c2lkZQorCSAqIG9mIHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICsKKwkgICAgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOwogCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3JtZGlyOwogCi0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlpZiAoKHJldHZhbCA9CisJICAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSAmcGF0aCwgJmRlKSkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJcmV0dmFsID0gLUVOT0VOVDsKKwkJZ290byBlbmRfcm1kaXI7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgeworCQkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKKwkJLy8gZW50cnkKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCWlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgeworCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQlnb3RvIGVuZF9ybWRpcjsKKwl9CisKKwkvKiBjdXQgZW50cnkgZnJvbSBkaXIgZGlyZWN0b3J5ICovCisJcmV0dmFsID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwJLyogcGFnZSAqLworCQkJCQkwIC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUgKi8gKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlbmRfcm1kaXI7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMiAmJiBpbm9kZS0+aV9ubGluayAhPSAxKQorCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiJXM6IGVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIgorCQkJCSAiIT0gMiAoJWQpIiwgX19GVU5DVElPTl9fLCBpbm9kZS0+aV9ubGluayk7CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICBkaXItPmlfc2l6ZSAtPSAoREVIX1NJWkUgKyBkZS5kZV9lbnRyeWxlbik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKKworCS8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCisJYWRkX3NhdmVfbGluaygmdGgsIGlub2RlLCAwIC8qIG5vdCB0cnVuY2F0ZSAqLyApOworCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisgICAgICBvdXRfcm1kaXI6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZW5kX3JtZGlyOgorCS8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAorCSAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKKwkgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KKwlwYXRocmVsc2UoJnBhdGgpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwogCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7Ci0gICAgfQotCi0gICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0KLSAgICBhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCkgOwotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbCwgZXJyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2F2ZWxpbms7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIGluIHRoaXMgdHJhbnNhY3Rpb24gd2UgY2FuIGJlIGRvaW5nIGF0IG1heCB0d28gYmFsYW5jaW5ncyBhbmQgdXBkYXRlCisJICogdHdvIHN0YXQgZGF0YXMsIHdlIGNoYW5nZSBxdW90YXMgb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mCisJICogdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5CisJICogZGVsZXRlZCBvbmx5IG9uIGlwdXQgPT4gb3V0c2lkZSBvZiB0aGlzIHRyYW5zYWN0aW9uICovCisJamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArCisJICAgIDQgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKTsKKworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubGluazsKKworCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJaWYgKChyZXR2YWwgPQorCSAgICAgcmVpc2VyZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgJnBhdGgsICZkZSkpID09IE5BTUVfTk9UX0ZPVU5EKSB7CisJCXJldHZhbCA9IC1FTk9FTlQ7CisJCWdvdG8gZW5kX3VubGluazsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKTsKKworCWlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJLy8gRklYTUU6IGNvbXBhcmUga2V5IG9mIGFuIG9iamVjdCBhbmQgYSBrZXkgZm91bmQgaW4gdGhlCisJCS8vIGVudHJ5CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX3VubGluazsKKwl9CisKKwlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCisJCQkJICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKGlub2RlLT5pX3NiKSwgaW5vZGUtPmlfaW5vLAorCQkJCSBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisKKwlpbm9kZS0+aV9ubGluay0tOworCisJLyoKKwkgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluaworCSAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKKwkgKi8KKwlzYXZlbGluayA9IGlub2RlLT5pX25saW5rOworCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwKKwkJCQkgICAwKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlpbm9kZS0+aV9ubGluaysrOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisKKwlkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBkaXIpOworCisJaWYgKCFzYXZlbGluaykKKwkJLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCisJCWFkZF9zYXZlX2xpbmsoJnRoLCBpbm9kZSwgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7CisKKyAgICAgIGVuZF91bmxpbms6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwlpZiAoZXJyKQorCQlyZXR2YWwgPSBlcnI7CisgICAgICBvdXRfdW5saW5rOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKnBhcmVudF9kaXIsCisJCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpuYW1lOworCWludCBpdGVtX2xlbjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCisJICAgIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocGFyZW50X2Rpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKHBhcmVudF9kaXItPmlfc2IpKTsKKworCWlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlpdGVtX2xlbiA9IFJPVU5EX1VQKHN0cmxlbihzeW1uYW1lKSk7CisJaWYgKGl0ZW1fbGVuID4gTUFYX0RJUkVDVF9JVEVNX0xFTihwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJcmV0dmFsID0gLUVOQU1FVE9PTE9ORzsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MoaXRlbV9sZW4sIEdGUF9OT0ZTLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwlpZiAoIW5hbWUpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCW1lbWNweShuYW1lLCBzeW1uYW1lLCBzdHJsZW4oc3ltbmFtZSkpOworCXBhZGRfaXRlbShuYW1lLCBpdGVtX2xlbiwgc3RybGVuKHN5bW5hbWUpKTsKKworCS8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLworCisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlkcm9wX25ld19pbm9kZShpbm9kZSk7CisJCXJlaXNlcmZzX2tmcmVlKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX25ld19pbm9kZSgmdGgsIHBhcmVudF9kaXIsIG1vZGUsIG5hbWUsIHN0cmxlbihzeW1uYW1lKSwKKwkJCSAgICAgICBkZW50cnksIGlub2RlKTsKKwlyZWlzZXJmc19rZnJlZShuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7CisJaWYgKHJldHZhbCkgewkJLyogcmVpc2VyZnNfbmV3X2lub2RlIGlwdXRzIGZvciB1cyAqLworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocGFyZW50X2Rpcik7CisKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCisJLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkvLworCS8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7CisKKwlyZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBwYXJlbnRfZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisgICAgICBvdXRfZmFpbGVkOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyB1cGRhdGUgb2YgcXVvdGFzIGZvciB0aGUgb3duZXJzIG9mIHRoZSBkaXJlY3RvcnkgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsKKwkgICAgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCWlmIChpbm9kZS0+aV9ubGluayA+PSBSRUlTRVJGU19MSU5LX01BWCkgeworCQkvL0ZJWE1FOiBzZF9ubGluayBpcyAzMiBiaXQgZm9yIG5ldyBmaWxlcworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIC1FTUxJTks7CisJfQorCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBpbmMgYmVmb3JlIHNjaGVkdWxpbmcgc28gcmVpc2VyZnNfdW5saW5rIGtub3dzIHdlIGFyZSBoZXJlICovCisJaW5vZGUtPmlfbmxpbmsrKzsKKworCXJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IGVudHJ5ICovCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7CisJfQorCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CiAKIC8vIGRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHBvaW50aW5nIHRvIGFuIGVudHJ5IHdoaWNoIAotc3RhdGljIGludCBkZV9zdGlsbF92YWxpZCAoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4sIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyBpbnQgZGVfc3RpbGxfdmFsaWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSB0bXAgPSAqZGU7Ci0gICAgCi0gICAgLy8gcmVjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lIGxlbmd0aAotICAgIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuICgmdG1wKTsKLSAgICAvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQotICAgIGlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wIChuYW1lLCBkZS0+ZGVfbmFtZSwgbGVuKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IHRtcCA9ICpkZTsKKworCS8vIHJlY2FsY3VsYXRlIHBvaW50ZXIgdG8gbmFtZSBhbmQgbmFtZSBsZW5ndGgKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmdG1wKTsKKwkvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQorCWlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wKG5hbWUsIGRlLT5kZV9uYW1lLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotCi1zdGF0aWMgaW50IGVudHJ5X3BvaW50c190b19vYmplY3QgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGludCBlbnRyeV9wb2ludHNfdG9fb2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCQkJICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgaWYgKCFkZV9zdGlsbF92YWxpZCAobmFtZSwgbGVuLCBkZSkpCi0JcmV0dXJuIDA7CisJaWYgKCFkZV9zdGlsbF92YWxpZChuYW1lLCBsZW4sIGRlKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoaW5vZGUpIHsKLQlpZiAoIWRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQyOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKLQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7Ci0gICAgfQorCWlmIChpbm9kZSkgeworCQlpZiAoIWRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCQkgICAgICAgInZzLTcwNDI6IGVudHJ5X3BvaW50c190b19vYmplY3Q6IGVudHJ5IG11c3QgYmUgdmlzaWJsZSIpOworCQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7CisJfQogCi0gICAgLyogdGhpcyBtdXN0IGJlIGFkZGVkIGhpZGRlbiBlbnRyeSAqLwotICAgIGlmIChkZV92aXNpYmxlIChkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkpCi0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKKwkvKiB0aGlzIG11c3QgYmUgYWRkZWQgaGlkZGVuIGVudHJ5ICovCisJaWYgKGRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKIAotICAgIHJldHVybiAxOworCXJldHVybiAxOwogfQogCi0KIC8qIHNldHMga2V5IG9mIG9iamVjdGlkIHRoZSBlbnRyeSBoYXMgdG8gcG9pbnQgdG8gKi8KLXN0YXRpYyB2b2lkIHNldF9pbm9faW5fZGlyX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzZXRfaW5vX2luX2Rpcl9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIC8qIEpETSBUaGVzZSBvcGVyYXRpb25zIGFyZSBlbmRpYW4gc2FmZSAtIGJvdGggYXJlIGxlICovCi0gICAgZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfZGlyX2lkID0ga2V5LT5rX2Rpcl9pZDsKLSAgICBkZS0+ZGVfZGVoW2RlLT5kZV9lbnRyeV9udW1dLmRlaF9vYmplY3RpZCA9IGtleS0+a19vYmplY3RpZDsKKwkvKiBKRE0gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZW5kaWFuIHNhZmUgLSBib3RoIGFyZSBsZSAqLworCWRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0uZGVoX2Rpcl9pZCA9IGtleS0+a19kaXJfaWQ7CisJZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfb2JqZWN0aWQgPSBrZXktPmtfb2JqZWN0aWQ7CiB9CiAKLQogLyogCiAgKiBwcm9jZXNzLCB0aGF0IGlzIGdvaW5nIHRvIGNhbGwgZml4X25vZGVzL2RvX2JhbGFuY2UgbXVzdCBob2xkIG9ubHkKICAqIG9uZSBwYXRoLiBJZiBpdCBob2xkcyAyIG9yIG1vcmUsIGl0IGNhbiBnZXQgaW50byBlbmRsZXNzIHdhaXRpbmcgaW4KICAqIGdldF9lbXB0eV9ub2RlcyBvciBpdHMgY2xvbmVzIAogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQorc3RhdGljIGludCByZWlzZXJmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewotICAgIGludCByZXR2YWw7Ci0gICAgSU5JVElBTElaRV9QQVRIIChvbGRfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChuZXdfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChkb3RfZG90X2VudHJ5X3BhdGgpOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWggOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgb2xkX2RlLCBuZXdfZGUsIGRvdF9kb3RfZGU7Ci0gICAgc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19kZW50cnlfaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGpiZWdpbl9jb3VudCA7IAotICAgIHVtb2RlX3Qgb2xkX2lub2RlX21vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7Ci0gICAgc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCWludCByZXR2YWw7CisJSU5JVElBTElaRV9QQVRIKG9sZF9lbnRyeV9wYXRoKTsKKwlJTklUSUFMSVpFX1BBVEgobmV3X2VudHJ5X3BhdGgpOworCUlOSVRJQUxJWkVfUEFUSChkb3RfZG90X2VudHJ5X3BhdGgpOworCXN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWg7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBvbGRfZGUsIG5ld19kZSwgZG90X2RvdF9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19kZW50cnlfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVtb2RlX3Qgb2xkX2lub2RlX21vZGU7CisJdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7CisJc3RydWN0IHRpbWVzcGVjIGN0aW1lOwogCi0gICAgLyogdGhyZWUgYmFsYW5jaW5nczogKDEpIG9sZCBuYW1lIHJlbW92YWwsICgyKSBuZXcgbmFtZSBpbnNlcnRpb24KLSAgICAgICBhbmQgKDMpIG1heWJlICJzYXZlIiBsaW5rIGluc2VydGlvbgotICAgICAgIHN0YXQgZGF0YSB1cGRhdGVzOiAoMSkgb2xkIGRpcmVjdG9yeSwKLSAgICAgICAoMikgbmV3IGRpcmVjdG9yeSBhbmQgKDMpIG1heWJlIG9sZCBvYmplY3Qgc3RhdCBkYXRhICh3aGVuIGl0IGlzCi0gICAgICAgZGlyZWN0b3J5KSBhbmQgKDQpIG1heWJlIHN0YXQgZGF0YSBvZiBvYmplY3QgdG8gd2hpY2ggbmV3IGVudHJ5Ci0gICAgICAgcG9pbnRlZCBpbml0aWFsbHkgYW5kICg1KSBtYXliZSBibG9jayBjb250YWluaW5nICIuLiIgb2YKLSAgICAgICByZW5hbWVkIGRpcmVjdG9yeQotICAgICAgIHF1b3RhIHVwZGF0ZXM6IHR3byBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KLSAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyA1ICsgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhvbGRfZGlyLT5pX3NiKTsKKwkvKiB0aHJlZSBiYWxhbmNpbmdzOiAoMSkgb2xkIG5hbWUgcmVtb3ZhbCwgKDIpIG5ldyBuYW1lIGluc2VydGlvbgorCSAgIGFuZCAoMykgbWF5YmUgInNhdmUiIGxpbmsgaW5zZXJ0aW9uCisJICAgc3RhdCBkYXRhIHVwZGF0ZXM6ICgxKSBvbGQgZGlyZWN0b3J5LAorCSAgICgyKSBuZXcgZGlyZWN0b3J5IGFuZCAoMykgbWF5YmUgb2xkIG9iamVjdCBzdGF0IGRhdGEgKHdoZW4gaXQgaXMKKwkgICBkaXJlY3RvcnkpIGFuZCAoNCkgbWF5YmUgc3RhdCBkYXRhIG9mIG9iamVjdCB0byB3aGljaCBuZXcgZW50cnkKKwkgICBwb2ludGVkIGluaXRpYWxseSBhbmQgKDUpIG1heWJlIGJsb2NrIGNvbnRhaW5pbmcgIi4uIiBvZgorCSAgIHJlbmFtZWQgZGlyZWN0b3J5CisJICAgcXVvdGEgdXBkYXRlczogdHdvIHBhcmVudCBkaXJlY3RvcmllcyAqLworCWpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDUgKworCSAgICA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKG9sZF9kaXItPmlfc2IpOwogCi0gICAgb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBuZXdfZGVudHJ5X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19kZW50cnlfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCi0gICAgLy8gbWFrZSBzdXJlLCB0aGF0IG9sZG5hbWUgc3RpbGwgZXhpc3RzIGFuZCBwb2ludHMgdG8gYW4gb2JqZWN0IHdlCi0gICAgLy8gYXJlIGdvaW5nIHRvIHJlbmFtZQotICAgIG9sZF9kZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2Rpciwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCi0JCQkJICAmb2xkX2VudHJ5X3BhdGgsICZvbGRfZGUpOwotICAgIHBhdGhyZWxzZSAoJm9sZF9lbnRyeV9wYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCXJldHVybiAtRUlPOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCB8fCBvbGRfZGUuZGVfb2JqZWN0aWQgIT0gb2xkX2lub2RlLT5pX2lubykgewotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQlyZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwotICAgIGlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCS8vIG1ha2Ugc3VyZSwgdGhhdCBkaXJlY3RvcnkgYmVpbmcgcmVuYW1lZCBoYXMgY29ycmVjdCAiLi4iIAotCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCi0JLy8gYWxyZWFkeQotCi0JaWYgKG5ld19kZW50cnlfaW5vZGUpIHsKLQkgICAgaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCQlyZXR1cm4gLUVOT1RFTVBUWTsKLQkgICAgfQotCX0KLQkKLQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKLQkqKiBzbyBmaW5kICIuLiIgZW50cnkgCi0JKi8KLQlkb3RfZG90X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSk7Ci0JcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCSAgICByZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBpbm9kZSBudW1iZXIgb2YgLi4gbXVzdCBlcXVhbCBvbGRfZGlyLT5pX2lubyAqLwotCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7Ci0JICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQotICAgIH0KLQotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAob2xkX2Rpci0+aV9zYik7Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgLyogYWRkIG5ldyBlbnRyeSAob3IgZmluZCB0aGUgZXhpc3Rpbmcgb25lKSAqLwotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJIG9sZF9pbm9kZSwgMCk7Ci0gICAgaWYgKHJldHZhbCA9PSAtRUVYSVNUKSB7Ci0JaWYgKCFuZXdfZGVudHJ5X2lub2RlKSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljIChvbGRfZGlyLT5pX3NiLAotCQkJICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKLQl9Ci0gICAgfSBlbHNlIGlmIChyZXR2YWwpIHsKLQlpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKLSAgICB9Ci0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2RpcikgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGlyKSA7Ci0KLSAgICAvKiB0aGlzIG1ha2VzIGl0IHNvIGFuIGZzeW5jIG9uIGFuIG9wZW4gZmQgZm9yIHRoZSBvbGQgbmFtZSB3aWxsCi0gICAgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCi0gICAgKi8KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2lub2RlKSA7Ci0KLSAgICBpZiAobmV3X2RlbnRyeV9pbm9kZSkgCi0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kZW50cnlfaW5vZGUpIDsKLQotICAgIHdoaWxlICgxKSB7Ci0JLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCi0JaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmb2xkX2RlLmRlX2VudHJ5X2tleSwKLQkJCQkJICAgJm9sZF9lbnRyeV9wYXRoLCAmb2xkX2RlKSkgIT0gTkFNRV9GT1VORCkgewotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZvbGRfZW50cnlfaWgsIGdldF9paCgmb2xkX2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoLCAxKSA7Ci0KLQkvLyBsb29rIGZvciBuZXcgbmFtZSBieSByZWlzZXJmc19maW5kX2VudHJ5Ci0JbmV3X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sIAotCQkJCSAgICAgICZuZXdfZW50cnlfcGF0aCwgJm5ld19kZSk7Ci0JLy8gcmVpc2VyZnNfYWRkX2VudHJ5IHNob3VsZCBub3QgcmV0dXJuIElPX0VSUk9SLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCB3aXRoIGVzc2VudGlhbGx5IHNhbWUgcGFyYW1ldGVycyBmcm9tCi0gICAgICAgIC8vIHJlaXNlcmZzX2FkZF9lbnRyeSBhYm92ZSwgYW5kIHdlJ2xsIGNhdGNoIGFueSBpL28gZXJyb3JzIGJlZm9yZSB3ZSBnZXQgaGVyZS4KLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkRfSU5WSVNJQkxFICYmIHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOwotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKSA7Ci0KLQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKLQkgICAgaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmZG90X2RvdF9kZS5kZV9lbnRyeV9rZXksCi0JCQkJCSAgICAgICAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKLQkJcGF0aHJlbHNlKCZkb3RfZG90X2VudHJ5X3BhdGgpOwotCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKLQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7Ci0JCWpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkvLyBtYWtlIHN1cmUsIHRoYXQgb2xkbmFtZSBzdGlsbCBleGlzdHMgYW5kIHBvaW50cyB0byBhbiBvYmplY3Qgd2UKKwkvLyBhcmUgZ29pbmcgdG8gcmVuYW1lCisJb2xkX2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCW9sZF9kZW50cnktPmRfbmFtZS5sZW4sICZvbGRfZW50cnlfcGF0aCwKKwkJCQkmb2xkX2RlKTsKKwlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CiAJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKIAkJcmV0dXJuIC1FSU87Ci0JICAgIH0KLQkgICAgY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSkgOwotCSAgICAvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgsIDEpIDsKIAl9Ci0JCQkJLyogd2Ugc2hvdWxkIGNoZWNrIHNlYWxzIGhlcmUsIG5vdCBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0dWZmLCB5ZXM/IFRoZW4sIGhhdmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZCBldmVyeXRoaW5nIGludG8gUkFNIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBsb2NrIHRoZSBidWZmZXJzLCB5ZXM/ICAtSGFucyAqLwotCQkJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCi0JCQkJKiogdGhhbiBvbmUgcGF0aCBhdCBvbmNlLiAgVGhlIHNlYWxzIHdvdWxkIAotCQkJCSoqIGhhdmUgdG8gYmUgd3JpdHRlbiB0byBkZWFsIHdpdGggbXVsdGktcGF0aCAKLQkJCQkqKiBpc3N1ZXMgLWNocmlzCi0JCQkJKi8KLQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55Ci0JKiogb2YgdGhlIGFib3ZlIGNoZWNrcyBjb3VsZCBoYXZlIHNjaGVkdWxlZC4gIFdlIGhhdmUgdG8gYmUKLQkqKiBzdXJlIG91ciBpdGVtcyBoYXZlbid0IGJlZW4gc2hpZnRlZCBieSBhbm90aGVyIHByb2Nlc3MuCi0JKi8KLQlpZiAoaXRlbV9tb3ZlZCgmbmV3X2VudHJ5X2loLCAmbmV3X2VudHJ5X3BhdGgpIHx8Ci0JICAgICFlbnRyeV9wb2ludHNfdG9fb2JqZWN0KG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKLQkgICAgaXRlbV9tb3ZlZCgmb2xkX2VudHJ5X2loLCAmb2xkX2VudHJ5X3BhdGgpIHx8IAotCSAgICAhZW50cnlfcG9pbnRzX3RvX29iamVjdCAob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgICZvbGRfZGUsIG9sZF9pbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKLQkgICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkgICAgY29udGludWU7CisKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQgfHwgb2xkX2RlLmRlX29iamVjdGlkICE9IG9sZF9pbm9kZS0+aV9pbm8pIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CisKKwlvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwogCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCSAgICBpZiAoIGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8Ci0JCSFlbnRyeV9wb2ludHNfdG9fb2JqZWN0ICggIi4uIiwgMiwgJmRvdF9kb3RfZGUsIG9sZF9kaXIpICkgewotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBvbGRfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBuZXdfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkJY29udGludWU7Ci0JICAgIH0KKwkJLy8gbWFrZSBzdXJlLCB0aGF0IGRpcmVjdG9yeSBiZWluZyByZW5hbWVkIGhhcyBjb3JyZWN0ICIuLiIgCisJCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCisJCS8vIGFscmVhZHkKKworCQlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkJaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJCQl9CisJCX0KKworCQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKKwkJICoqIHNvIGZpbmQgIi4uIiBlbnRyeSAKKwkJICovCisJCWRvdF9kb3RfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkmZG90X2RvdF9kZSk7CisJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGlub2RlIG51bWJlciBvZiAuLiBtdXN0IGVxdWFsIG9sZF9kaXItPmlfaW5vICovCisJCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAotCVJGQUxTRSggU19JU0RJUihvbGRfaW5vZGVfbW9kZSkgJiYgCi0JCSAhYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoZG90X2RvdF9kZS5kZV9iaCksICIiICk7Ci0KLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBvaywgYWxsIHRoZSBjaGFuZ2VzIGNhbiBiZSBkb25lIGluIG9uZSBmZWxsIHN3b29wIHdoZW4gd2UKLSAgICAgICBoYXZlIGNsYWltZWQgYWxsIHRoZSBidWZmZXJzIG5lZWRlZC4qLwotICAgIAotICAgIG1hcmtfZGVfdmlzaWJsZSAobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOwotICAgIHNldF9pbm9faW5fZGlyX2VudHJ5ICgmbmV3X2RlLCBJTk9ERV9QS0VZIChvbGRfaW5vZGUpKTsKLSAgICBqb3VybmFsX21hcmtfZGlydHkgKCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQotICAgIG1hcmtfZGVfaGlkZGVuIChvbGRfZGUuZGVfZGVoICsgb2xkX2RlLmRlX2VudHJ5X251bSk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG9sZF9kaXItPmlfc2IsIG9sZF9kZS5kZV9iaCk7Ci0gICAgY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIG9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gY3RpbWU7Ci0gICAgbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdGltZTsKLSAgICAvKiB0aGFua3MgdG8gQWxleCBBZHJpYWFuc2UgPGFsZXhfYUBjYWx0ZWNoLmVkdT4gZm9yIHBhdGNoIHdoaWNoIGFkZHMgY3RpbWUgdXBkYXRlIG9mCi0gICAgICAgcmVuYW1lZCBvYmplY3QgKi8KLSAgICBvbGRfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JLy8gYWRqdXN0IGxpbmsgbnVtYmVyIG9mIHRoZSB2aWN0aW0KLQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7Ci0JICAgIG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmsgID0gMDsKLQl9IGVsc2UgewotCSAgICBuZXdfZGVudHJ5X2lub2RlLT5pX25saW5rLS07CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCXJldHVybiByZXR2YWw7CiAJfQotCW5ld19kZW50cnlfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQlzYXZlbGluayA9IG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbms7Ci0gICAgfQogCi0gICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKSB7Ci0JLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCi0Jc2V0X2lub19pbl9kaXJfZW50cnkgKCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZIChuZXdfZGlyKSk7Ci0Jam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG5ld19kaXItPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgpOwotCQotICAgICAgICBpZiAoIW5ld19kZW50cnlfaW5vZGUpCi0JICAgIC8qIHRoZXJlIChpbiBuZXdfZGlyKSB3YXMgbm8gZGlyZWN0b3J5LCBzbyBpdCBnb3QgbmV3IGxpbmsKLQkgICAgICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLwotCSAgICBJTkNfRElSX0lOT0RFX05MSU5LKG5ld19kaXIpOwotCQkKLQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLwotCURFQ19ESVJfSU5PREVfTkxJTksob2xkX2Rpcik7Ci0gICAgfQorCS8qIGFkZCBuZXcgZW50cnkgKG9yIGZpbmQgdGhlIGV4aXN0aW5nIG9uZSkgKi8KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLCBvbGRfaW5vZGUsIDApOworCWlmIChyZXR2YWwgPT0gLUVFWElTVCkgeworCQlpZiAoIW5ld19kZW50cnlfaW5vZGUpIHsKKwkJCXJlaXNlcmZzX3BhbmljKG9sZF9kaXItPmlfc2IsCisJCQkJICAgICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAocmV0dmFsKSB7CisJCWludCBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkJcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKKwl9CiAKLSAgICAvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKLSAgICBwYXRocmVsc2UgKCZuZXdfZW50cnlfcGF0aCk7Ci0gICAgcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kaXIpOwogCi0gICAgLy8gRklYTUU6IHRoaXMgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSdzIHJldHVybiB2YWx1ZSBtYXkgc2NyZXcgdXAKLSAgICAvLyBhbnlib2R5LCBidXQgaXQgd2lsbCBwYW5pYyBpZiB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlCi0gICAgLy8gZW50cnkuIFRoaXMgbmVlZHMgb25lIG1vcmUgY2xlYW4gdXAKLSAgICBpZiAocmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmb2xkX2VudHJ5X3BhdGgsICYob2xkX2RlLmRlX2VudHJ5X2tleSksIG9sZF9kaXIsIE5VTEwsIDApIDwgMCkKLQlyZWlzZXJmc193YXJuaW5nIChvbGRfZGlyLT5pX3NiLCAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCS8qIHRoaXMgbWFrZXMgaXQgc28gYW4gZnN5bmMgb24gYW4gb3BlbiBmZCBmb3IgdGhlIG9sZCBuYW1lIHdpbGwKKwkgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCisJICovCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG9sZF9pbm9kZSk7CiAKLSAgICBvbGRfZGlyLT5pX3NpemUgLT0gREVIX1NJWkUgKyBvbGRfZGUuZGVfZW50cnlsZW47CisJaWYgKG5ld19kZW50cnlfaW5vZGUpCisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGVudHJ5X2lub2RlKTsKIAotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBvbGRfZGlyKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgbmV3X2Rpcik7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG9sZF9pbm9kZSk7CisJd2hpbGUgKDEpIHsKKwkJLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCisJCWlmICgocmV0dmFsID0KKwkJICAgICBzZWFyY2hfYnlfZW50cnlfa2V5KG5ld19kaXItPmlfc2IsICZvbGRfZGUuZGVfZW50cnlfa2V5LAorCQkJCQkgJm9sZF9lbnRyeV9wYXRoLAorCQkJCQkgJm9sZF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCQkJam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JaWYgKHNhdmVsaW5rID09IDApCi0JICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG5ld19kZW50cnlfaW5vZGUpOwotICAgIH0KKwkJY29weV9pdGVtX2hlYWQoJm9sZF9lbnRyeV9paCwgZ2V0X2loKCZvbGRfZW50cnlfcGF0aCkpOwogCi0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIG9sZF9kZS5kZV9iaCwgMSk7CisKKwkJLy8gbG9vayBmb3IgbmV3IG5hbWUgYnkgcmVpc2VyZnNfZmluZF9lbnRyeQorCQluZXdfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5sZW4sICZuZXdfZW50cnlfcGF0aCwKKwkJCQkJJm5ld19kZSk7CisJCS8vIHJlaXNlcmZzX2FkZF9lbnRyeSBzaG91bGQgbm90IHJldHVybiBJT19FUlJPUiwgYmVjYXVzZSBpdCBpcyBjYWxsZWQgd2l0aCBlc3NlbnRpYWxseSBzYW1lIHBhcmFtZXRlcnMgZnJvbQorCQkvLyByZWlzZXJmc19hZGRfZW50cnkgYWJvdmUsIGFuZCB3ZSdsbCBjYXRjaCBhbnkgaS9vIGVycm9ycyBiZWZvcmUgd2UgZ2V0IGhlcmUuCisJCWlmIChyZXR2YWwgIT0gTkFNRV9GT1VORF9JTlZJU0lCTEUgJiYgcmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOworCQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7CisJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKTsKKworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKTsKKworCQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlmICgocmV0dmFsID0KKwkJCSAgICAgc2VhcmNoX2J5X2VudHJ5X2tleShuZXdfZGlyLT5pX3NiLAorCQkJCQkJICZkb3RfZG90X2RlLmRlX2VudHJ5X2tleSwKKwkJCQkJCSAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkJICZkb3RfZG90X2RlKSkgIT0gTkFNRV9GT1VORCkgeworCQkJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwkJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsCisJCQkJICAgICAgIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSk7CisJCQkvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJICAgICBkb3RfZG90X2RlLmRlX2JoLCAxKTsKKwkJfQorCQkvKiB3ZSBzaG91bGQgY2hlY2sgc2VhbHMgaGVyZSwgbm90IGRvCisJCSAgIHRoaXMgc3R1ZmYsIHllcz8gVGhlbiwgaGF2aW5nCisJCSAgIGdhdGhlcmVkIGV2ZXJ5dGhpbmcgaW50byBSQU0gd2UKKwkJICAgc2hvdWxkIGxvY2sgdGhlIGJ1ZmZlcnMsIHllcz8gIC1IYW5zICovCisJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCisJCSAqKiB0aGFuIG9uZSBwYXRoIGF0IG9uY2UuICBUaGUgc2VhbHMgd291bGQgCisJCSAqKiBoYXZlIHRvIGJlIHdyaXR0ZW4gdG8gZGVhbCB3aXRoIG11bHRpLXBhdGggCisJCSAqKiBpc3N1ZXMgLWNocmlzCisJCSAqLworCQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55CisJCSAqKiBvZiB0aGUgYWJvdmUgY2hlY2tzIGNvdWxkIGhhdmUgc2NoZWR1bGVkLiAgV2UgaGF2ZSB0byBiZQorCQkgKiogc3VyZSBvdXIgaXRlbXMgaGF2ZW4ndCBiZWVuIHNoaWZ0ZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorCQkgKi8KKwkJaWYgKGl0ZW1fbW92ZWQoJm5ld19lbnRyeV9paCwgJm5ld19lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QobmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKKwkJICAgIGl0ZW1fbW92ZWQoJm9sZF9lbnRyeV9paCwgJm9sZF9lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3Qob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBvbGRfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm9sZF9kZSwgb2xkX2lub2RlKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBvbGRfZGUuZGVfYmgpOworCQkJaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQorCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgeworCQkJaWYgKGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8CisJCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QoIi4uIiwgMiwgJmRvdF9kb3RfZGUsCisJCQkJCQkgICAgb2xkX2RpcikpIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihvbGRfaW5vZGUtPgorCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJIG9sZF9kZS5kZV9iaCk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT4KKwkJCQkJCQkJIGlfc2IsCisJCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCVJGQUxTRShTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSAmJgorCQkgICAgICAgIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGRvdF9kb3RfZGUuZGVfYmgpLCAiIik7CisKKwkJYnJlYWs7CisJfQorCisJLyogb2ssIGFsbCB0aGUgY2hhbmdlcyBjYW4gYmUgZG9uZSBpbiBvbmUgZmVsbCBzd29vcCB3aGVuIHdlCisJICAgaGF2ZSBjbGFpbWVkIGFsbCB0aGUgYnVmZmVycyBuZWVkZWQuICovCisKKwltYXJrX2RlX3Zpc2libGUobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOworCXNldF9pbm9faW5fZGlyX2VudHJ5KCZuZXdfZGUsIElOT0RFX1BLRVkob2xkX2lub2RlKSk7CisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKKworCW1hcmtfZGVfaGlkZGVuKG9sZF9kZS5kZV9kZWggKyBvbGRfZGUuZGVfZW50cnlfbnVtKTsKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBvbGRfZGlyLT5pX3NiLCBvbGRfZGUuZGVfYmgpOworCWN0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IGN0aW1lOworCW5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0gY3RpbWU7CisJLyogdGhhbmtzIHRvIEFsZXggQWRyaWFhbnNlIDxhbGV4X2FAY2FsdGVjaC5lZHU+IGZvciBwYXRjaCB3aGljaCBhZGRzIGN0aW1lIHVwZGF0ZSBvZgorCSAgIHJlbmFtZWQgb2JqZWN0ICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisKKwlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkvLyBhZGp1c3QgbGluayBudW1iZXIgb2YgdGhlIHZpY3RpbQorCQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7CisJCQluZXdfZGVudHJ5X2lub2RlLT5pX25saW5rID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmstLTsKKwkJfQorCQluZXdfZGVudHJ5X2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisJCXNhdmVsaW5rID0gbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluazsKKwl9CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkJLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCisJCXNldF9pbm9faW5fZGlyX2VudHJ5KCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZKG5ld19kaXIpKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgbmV3X2Rpci0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisKKwkJaWYgKCFuZXdfZGVudHJ5X2lub2RlKQorCQkJLyogdGhlcmUgKGluIG5ld19kaXIpIHdhcyBubyBkaXJlY3RvcnksIHNvIGl0IGdvdCBuZXcgbGluaworCQkJICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLworCQkJSU5DX0RJUl9JTk9ERV9OTElOSyhuZXdfZGlyKTsKKworCQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLworCQlERUNfRElSX0lOT0RFX05MSU5LKG9sZF9kaXIpOworCX0KKwkvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKKwlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwlwYXRocmVsc2UoJmRvdF9kb3RfZW50cnlfcGF0aCk7CisKKwkvLyBGSVhNRTogdGhpcyByZWlzZXJmc19jdXRfZnJvbV9pdGVtJ3MgcmV0dXJuIHZhbHVlIG1heSBzY3JldyB1cAorCS8vIGFueWJvZHksIGJ1dCBpdCB3aWxsIHBhbmljIGlmIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUKKwkvLyBlbnRyeS4gVGhpcyBuZWVkcyBvbmUgbW9yZSBjbGVhbiB1cAorCWlmIChyZWlzZXJmc19jdXRfZnJvbV9pdGVtCisJICAgICgmdGgsICZvbGRfZW50cnlfcGF0aCwgJihvbGRfZGUuZGVfZW50cnlfa2V5KSwgb2xkX2RpciwgTlVMTCwKKwkgICAgIDApIDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhvbGRfZGlyLT5pX3NiLAorCQkJCSAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCisJb2xkX2Rpci0+aV9zaXplIC09IERFSF9TSVpFICsgb2xkX2RlLmRlX2VudHJ5bGVuOworCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2lub2RlKTsKKworCWlmIChuZXdfZGVudHJ5X2lub2RlKSB7CisJCWlmIChzYXZlbGluayA9PSAwKQorCQkJYWRkX3NhdmVfbGluaygmdGgsIG5ld19kZW50cnlfaW5vZGUsCisJCQkJICAgICAgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSk7CisJfQorCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgogICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gIC8vJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zLAkvKiBkZWZhdWx0X2ZpbGVfb3BzICovCi0gICAgLmNyZWF0ZQk9IHJlaXNlcmZzX2NyZWF0ZSwKLSAgICAubG9va3VwCT0gcmVpc2VyZnNfbG9va3VwLAotICAgIC5saW5rCT0gcmVpc2VyZnNfbGluaywKLSAgICAudW5saW5rCT0gcmVpc2VyZnNfdW5saW5rLAotICAgIC5zeW1saW5rCT0gcmVpc2VyZnNfc3ltbGluaywKLSAgICAubWtkaXIJPSByZWlzZXJmc19ta2RpciwKLSAgICAucm1kaXIJPSByZWlzZXJmc19ybWRpciwKLSAgICAubWtub2QJPSByZWlzZXJmc19ta25vZCwKLSAgICAucmVuYW1lCT0gcmVpc2VyZnNfcmVuYW1lLAotICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAotICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkvLyZyZWlzZXJmc19kaXJfb3BlcmF0aW9ucywgICAvKiBkZWZhdWx0X2ZpbGVfb3BzICovCisJLmNyZWF0ZSA9IHJlaXNlcmZzX2NyZWF0ZSwKKwkubG9va3VwID0gcmVpc2VyZnNfbG9va3VwLAorCS5saW5rID0gcmVpc2VyZnNfbGluaywKKwkudW5saW5rID0gcmVpc2VyZnNfdW5saW5rLAorCS5zeW1saW5rID0gcmVpc2VyZnNfc3ltbGluaywKKwkubWtkaXIgPSByZWlzZXJmc19ta2RpciwKKwkucm1kaXIgPSByZWlzZXJmc19ybWRpciwKKwkubWtub2QgPSByZWlzZXJmc19ta25vZCwKKwkucmVuYW1lID0gcmVpc2VyZnNfcmVuYW1lLAorCS5zZXRhdHRyID0gcmVpc2VyZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIgPSByZWlzZXJmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSByZWlzZXJmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gcmVpc2VyZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAorCS5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKIH07CiAKIC8qCkBAIC0xNDY3LDI4ICsxNTU0LDI3IEBACiAgKiBzdHVmZiBhZGRlZAogICovCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWRsaW5rICAgICAgID0gZ2VuZXJpY19yZWFkbGluaywKLSAgICAuZm9sbG93X2xpbmsgICAgPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAotICAgIC5wdXRfbGluayAgICAgICA9IHBhZ2VfcHV0X2xpbmssCi0gICAgLnNldGF0dHIgICAgICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19zZXR4YXR0ciwKLSAgICAuZ2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19nZXR4YXR0ciwKLSAgICAubGlzdHhhdHRyICAgICAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyICAgID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkucmVhZGxpbmsgPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluayA9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rID0gcGFnZV9wdXRfbGluaywKKwkuc2V0YXR0ciA9IHJlaXNlcmZzX3NldGF0dHIsCisJLnNldHhhdHRyID0gcmVpc2VyZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKwkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCiAKIH07CiAKLQogLyoKICAqIHNwZWNpYWwgZmlsZSBvcGVyYXRpb25zLi4ganVzdCB4YXR0ci9hY2wgc3R1ZmYKICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewotICAgIC5zZXRhdHRyICAgICAgICA9IHJlaXNlcmZzX3NldGF0dHIsCi0gICAgLnNldHhhdHRyICAgICAgID0gcmVpc2VyZnNfc2V0eGF0dHIsCi0gICAgLmdldHhhdHRyICAgICAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgICAgID0gcmVpc2VyZnNfbGlzdHhhdHRyLAotICAgIC5yZW1vdmV4YXR0ciAgICA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAotICAgIC5wZXJtaXNzaW9uICAgICA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIgPSByZWlzZXJmc19zZXRhdHRyLAorCS5zZXR4YXR0ciA9IHJlaXNlcmZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IHJlaXNlcmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIgPSByZWlzZXJmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisJLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAogCiB9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYyBiL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMKaW5kZXggYmZlOGUyNS4uZjYyNTkwYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYworKysgYi9mcy9yZWlzZXJmcy9vYmplY3RpZC5jCkBAIC0xNCwyNCArMTQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoX19sZTMyICopKChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKikocnMpICsgMSkgOlwKIAkJCSAoX19sZTMyICopKChycykgKyAxKSkKIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQorc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0aWRfbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgX19sZTMyICogbWFwKQogewotICAgIGlmIChsZTMyX3RvX2NwdSAobWFwWzBdKSAhPSAxKQotCXJlaXNlcmZzX3BhbmljIChzLCAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKLQkJCSggbG9uZyB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAobWFwWzBdKSk7CisJaWYgKGxlMzJfdG9fY3B1KG1hcFswXSkgIT0gMSkKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKKwkJCSAgICAgICAobG9uZyB1bnNpZ25lZCBpbnQpbGUzMl90b19jcHUobWFwWzBdKSk7CiAKLSAgICAvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKKwkvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKIH0KIAogI2Vsc2UKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQotezt9CitzdGF0aWMgdm9pZCBjaGVja19vYmplY3RpZF9tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBfX2xlMzIgKiBtYXApCit7OworfQogI2VuZGlmCiAKLQogLyogV2hlbiB3ZSBhbGxvY2F0ZSBvYmplY3RpZHMgd2UgYWxsb2NhdGUgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4KICAgIEVhY2ggc2VxdWVuY2Ugb2Ygb2JqZWN0aWRzIGluIHVzZSAodGhlIG9kZCBzZXF1ZW5jZXMpIGlzIGZvbGxvd2VkCiAgICBieSBhIHNlcXVlbmNlIG9mIG9iamVjdGlkcyBub3QgaW4gdXNlICh0aGUgZXZlbiBzZXF1ZW5jZXMpLiAgV2UKQEAgLTQ2LDE2MSArNDYsMTYyIEBACiAgICBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zIG9mIGxheW91dCBjb3VsZCByZXN1bHQgZnJvbSBjb21wbGljYXRpbmcKICAgIG9iamVjdGlkIGFzc2lnbm1lbnQsIGJ1dCB3ZSBoYXZlIGRlZmVycmVkIG1ha2luZyB0aGVtIGZvciBub3cuICovCiAKLQogLyogZ2V0IHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllciAqLwotX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCitfX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIF9fdTMyIHVudXNlZF9vYmplY3RpZDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJX191MzIgdW51c2VkX29iamVjdGlkOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgY2hlY2tfb2JqZWN0aWRfbWFwIChzLCBtYXApOworCWNoZWNrX29iamVjdGlkX21hcChzLCBtYXApOwogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLwotICAgIHVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChtYXBbMV0pOwotICAgIGlmICh1bnVzZWRfb2JqZWN0aWQgPT0gVTMyX01BWCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICIlczogbm8gbW9yZSBvYmplY3QgaWRzIiwgX19GVU5DVElPTl9fKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSkgOwotCXJldHVybiAwOwotICAgIH0KKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKwkvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLworCXVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1KG1hcFsxXSk7CisJaWYgKHVudXNlZF9vYmplY3RpZCA9PSBVMzJfTUFYKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzOiBubyBtb3JlIG9iamVjdCBpZHMiLCBfX0ZVTkNUSU9OX18pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gYWxsb2NhdGVzIHRoZSBmaXJzdCB1bnVzZWQgb2JqZWN0aWQuIFRoYXQKLSAgICAgICBpcyB0byBzYXksIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgb2JqZWN0aWQgbWFwIGlzIHRoZSBmaXJzdAotICAgICAgIHVudXNlZCBvYmplY3RpZCwgYW5kIGJ5IGluY3JlbWVudGluZyBpdCB3ZSB1c2UgaXQuICBTZWUgYmVsb3cKLSAgICAgICB3aGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgd2UgZWxpbWluYXRlZCBhIHNlcXVlbmNlIG9mIHVudXNlZAotICAgICAgIG9iamVjdGlkcy4uLi4gKi8KLSAgICBtYXBbMV0gPSBjcHVfdG9fbGUzMiAodW51c2VkX29iamVjdGlkICsgMSk7CisJLyogVGhpcyBpbmNyZW1lbnRhdGlvbiBhbGxvY2F0ZXMgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4gVGhhdAorCSAgIGlzIHRvIHNheSwgdGhlIGZpcnN0IGVudHJ5IG9uIHRoZSBvYmplY3RpZCBtYXAgaXMgdGhlIGZpcnN0CisJICAgdW51c2VkIG9iamVjdGlkLCBhbmQgYnkgaW5jcmVtZW50aW5nIGl0IHdlIHVzZSBpdC4gIFNlZSBiZWxvdworCSAgIHdoZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIGEgc2VxdWVuY2Ugb2YgdW51c2VkCisJICAgb2JqZWN0aWRzLi4uLiAqLworCW1hcFsxXSA9IGNwdV90b19sZTMyKHVudXNlZF9vYmplY3RpZCArIDEpOwogCi0gICAgLyogTm93IHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIHRoZSBsYXN0IHJlbWFpbmluZyBtZW1iZXIgb2YKLSAgICAgICB0aGUgZmlyc3QgZXZlbiBzZXF1ZW5jZSAoYW5kIGNhbiBlbGltaW5hdGUgdGhlIHNlcXVlbmNlIGJ5Ci0gICAgICAgZWxpbWluYXRpbmcgaXRzIGxhc3Qgb2JqZWN0aWQgZnJvbSBvaWRzKSwgYW5kIGNhbiBjb2xsYXBzZSB0aGUKLSAgICAgICBmaXJzdCB0d28gb2RkIHNlcXVlbmNlcyBpbnRvIG9uZSBzZXF1ZW5jZS4gIElmIHNvLCB0aGVuIHRoZSBuZXQKLSAgICAgICByZXN1bHQgaXMgdG8gZWxpbWluYXRlIGEgcGFpciBvZiBvYmplY3RpZHMgZnJvbSBvaWRzLiAgV2UgZG8gdGhpcwotICAgICAgIGJ5IHNoaWZ0aW5nIHRoZSBlbnRpcmUgbWFwIHRvIHRoZSBsZWZ0LiAqLwotICAgIGlmIChzYl9vaWRfY3Vyc2l6ZShycykgPiAyICYmIG1hcFsxXSA9PSBtYXBbMl0pIHsKLQltZW1tb3ZlIChtYXAgKyAxLCBtYXAgKyAzLCAoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKLSAgICAgICAgc2V0X3NiX29pZF9jdXJzaXplKCBycywgc2Jfb2lkX2N1cnNpemUocnMpIC0gMiApOwotICAgIH0KKwkvKiBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtYWluaW5nIG1lbWJlciBvZgorCSAgIHRoZSBmaXJzdCBldmVuIHNlcXVlbmNlIChhbmQgY2FuIGVsaW1pbmF0ZSB0aGUgc2VxdWVuY2UgYnkKKwkgICBlbGltaW5hdGluZyBpdHMgbGFzdCBvYmplY3RpZCBmcm9tIG9pZHMpLCBhbmQgY2FuIGNvbGxhcHNlIHRoZQorCSAgIGZpcnN0IHR3byBvZGQgc2VxdWVuY2VzIGludG8gb25lIHNlcXVlbmNlLiAgSWYgc28sIHRoZW4gdGhlIG5ldAorCSAgIHJlc3VsdCBpcyB0byBlbGltaW5hdGUgYSBwYWlyIG9mIG9iamVjdGlkcyBmcm9tIG9pZHMuICBXZSBkbyB0aGlzCisJICAgYnkgc2hpZnRpbmcgdGhlIGVudGlyZSBtYXAgdG8gdGhlIGxlZnQuICovCisJaWYgKHNiX29pZF9jdXJzaXplKHJzKSA+IDIgJiYgbWFwWzFdID09IG1hcFsyXSkgeworCQltZW1tb3ZlKG1hcCArIDEsIG1hcCArIDMsCisJCQkoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKHJzLCBzYl9vaWRfY3Vyc2l6ZShycykgLSAyKTsKKwl9CiAKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgcmV0dXJuIHVudXNlZF9vYmplY3RpZDsKKwlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlyZXR1cm4gdW51c2VkX29iamVjdGlkOwogfQogCi0KIC8qIG1ha2VzIG9iamVjdCBpZGVudGlmaWVyIHVudXNlZCAqLwotdm9pZCByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJX191MzIgb2JqZWN0aWRfdG9fcmVsZWFzZSkKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIGludCBpID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJaW50IGkgPSAwOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIC8vcmV0dXJuOwotICAgIGNoZWNrX29iamVjdGlkX21hcCAocywgbWFwKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwkvL3JldHVybjsKKwljaGVja19vYmplY3RpZF9tYXAocywgbWFwKTsKIAotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7IAorCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwogCi0gICAgLyogc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0aWQgbWFwIChpID0gMCkgYW5kIGdvIHRvCi0gICAgICAgdGhlIGVuZCBvZiBpdCAoaSA9IGRpc2tfc2ItPnNfb2lkX2N1cnNpemUpLiAgTGluZWFyIHNlYXJjaCBpcwotICAgICAgIHdoYXQgd2UgdXNlLCB0aG91Z2ggaXQgaXMgcG9zc2libGUgdGhhdCBiaW5hcnkgc2VhcmNoIHdvdWxkIGJlCi0gICAgICAgbW9yZSBlZmZpY2llbnQgYWZ0ZXIgcGVyZm9ybWluZyBsb3RzIG9mIGRlbGV0aW9ucyAod2hpY2ggaXMKLSAgICAgICB3aGVuIG9pZHMgaXMgbGFyZ2UuKSAgV2Ugb25seSBjaGVjayBldmVuIGkncy4gKi8KLSAgICB3aGlsZSAoaSA8IHNiX29pZF9jdXJzaXplKHJzKSkgewotCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1IChtYXBbaV0pKSB7Ci0JICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLwotCSAgICAvL21hcFtpXSsrOwotCSAgICBtYXBbaV0gPSBjcHVfdG9fbGUzMiAobGUzMl90b19jcHUgKG1hcFtpXSkgKyAxKTsKKwkvKiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3RpZCBtYXAgKGkgPSAwKSBhbmQgZ28gdG8KKwkgICB0aGUgZW5kIG9mIGl0IChpID0gZGlza19zYi0+c19vaWRfY3Vyc2l6ZSkuICBMaW5lYXIgc2VhcmNoIGlzCisJICAgd2hhdCB3ZSB1c2UsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0aGF0IGJpbmFyeSBzZWFyY2ggd291bGQgYmUKKwkgICBtb3JlIGVmZmljaWVudCBhZnRlciBwZXJmb3JtaW5nIGxvdHMgb2YgZGVsZXRpb25zICh3aGljaCBpcworCSAgIHdoZW4gb2lkcyBpcyBsYXJnZS4pICBXZSBvbmx5IGNoZWNrIGV2ZW4gaSdzLiAqLworCXdoaWxlIChpIDwgc2Jfb2lkX2N1cnNpemUocnMpKSB7CisJCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1KG1hcFtpXSkpIHsKKwkJCS8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLworCQkJLy9tYXBbaV0rKzsKKwkJCW1hcFtpXSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KG1hcFtpXSkgKyAxKTsKIAotCSAgICAvKiBEaWQgd2UgdW5hbGxvY2F0ZSB0aGUgbGFzdCBtZW1iZXIgb2YgYW4gb2RkIHNlcXVlbmNlLCBhbmQgY2FuIHNocmluayBvaWRzPyAqLwotCSAgICBpZiAobWFwW2ldID09IG1hcFtpKzFdKSB7Ci0JCS8qIHNocmluayBvYmplY3RpZCBtYXAgKi8KLQkJbWVtbW92ZSAobWFwICsgaSwgbWFwICsgaSArIDIsIAotCQkJIChzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMikgKiBzaXplb2YgKF9fdTMyKSk7Ci0JCS8vZGlza19zYi0+c19vaWRfY3Vyc2l6ZSAtPSAyOwotICAgICAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIgKTsKKwkJCS8qIERpZCB3ZSB1bmFsbG9jYXRlIHRoZSBsYXN0IG1lbWJlciBvZiBhbiBvZGQgc2VxdWVuY2UsIGFuZCBjYW4gc2hyaW5rIG9pZHM/ICovCisJCQlpZiAobWFwW2ldID09IG1hcFtpICsgMV0pIHsKKwkJCQkvKiBzaHJpbmsgb2JqZWN0aWQgbWFwICovCisJCQkJbWVtbW92ZShtYXAgKyBpLCBtYXAgKyBpICsgMiwKKwkJCQkJKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLQorCQkJCQkgMikgKiBzaXplb2YoX191MzIpKTsKKwkJCQkvL2Rpc2tfc2ItPnNfb2lkX2N1cnNpemUgLT0gMjsKKwkJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIpOwogCi0JCVJGQUxTRSggc2Jfb2lkX2N1cnNpemUocnMpIDwgMiB8fCAKLQkJICAgICAgICBzYl9vaWRfY3Vyc2l6ZShycykgPiBzYl9vaWRfbWF4c2l6ZShycyksCi0JCSAgICAgICAgInZzLTE1MDA1OiBvYmplY3RpZCBtYXAgY29ycnVwdGVkIGN1cl9zaXplID09ICVkIChtYXggPT0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiX29pZF9jdXJzaXplKHJzKSwgc2Jfb2lkX21heHNpemUocnMpKTsKLQkgICAgfQotCSAgICByZXR1cm47CisJCQkJUkZBTFNFKHNiX29pZF9jdXJzaXplKHJzKSA8IDIgfHwKKwkJCQkgICAgICAgc2Jfb2lkX2N1cnNpemUocnMpID4gc2Jfb2lkX21heHNpemUocnMpLAorCQkJCSAgICAgICAidnMtMTUwMDU6IG9iamVjdGlkIG1hcCBjb3JydXB0ZWQgY3VyX3NpemUgPT0gJWQgKG1heCA9PSAlZCkiLAorCQkJCSAgICAgICBzYl9vaWRfY3Vyc2l6ZShycyksIHNiX29pZF9tYXhzaXplKHJzKSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1KG1hcFtpXSkgJiYKKwkJICAgIG9iamVjdGlkX3RvX3JlbGVhc2UgPCBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJLyogc2l6ZSBvZiBvYmplY3RpZCBtYXAgaXMgbm90IGNoYW5nZWQgKi8KKwkJCWlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJCS8vb2JqZWN0aWRfbWFwW2krMV0tLTsKKwkJCQltYXBbaSArIDFdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUobWFwW2kgKyAxXSkgLSAxKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIEpETSBjb21wYXJpbmcgdHdvIGxpdHRsZS1lbmRpYW4gdmFsdWVzIGZvciBlcXVhbGl0eSAtLSBzYWZlICovCisJCQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgeworCQkJCS8qIG9iamVjdGlkIG1hcCBtdXN0IGJlIGV4cGFuZGVkLCBidXQgdGhlcmUgaXMgbm8gc3BhY2UgKi8KKwkJCQlQUk9DX0lORk9fSU5DKHMsIGxlYWtlZF9vaWQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogZXhwYW5kIHRoZSBvYmplY3RpZCBtYXAgKi8KKwkJCW1lbW1vdmUobWFwICsgaSArIDMsIG1hcCArIGkgKyAxLAorCQkJCShzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMSkgKiBzaXplb2YoX191MzIpKTsKKwkJCW1hcFtpICsgMV0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlKTsKKwkJCW1hcFtpICsgMl0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlICsgMSk7CisJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIpOworCQkJcmV0dXJuOworCQl9CisJCWkgKz0gMjsKIAl9CiAKLQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1IChtYXBbaV0pICYmIAotCSAgICBvYmplY3RpZF90b19yZWxlYXNlIDwgbGUzMl90b19jcHUgKG1hcFtpICsgMV0pKSB7Ci0JICAgIC8qIHNpemUgb2Ygb2JqZWN0aWQgbWFwIGlzIG5vdCBjaGFuZ2VkICovCi0JICAgIGlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdSAobWFwW2kgKyAxXSkpIHsKLQkJLy9vYmplY3RpZF9tYXBbaSsxXS0tOwotCQltYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKGxlMzJfdG9fY3B1IChtYXBbaSArIDFdKSAtIDEpOwotCQlyZXR1cm47Ci0JICAgIH0KLQotICAgICAgICAgICAgLyogSkRNIGNvbXBhcmluZyB0d28gbGl0dGxlLWVuZGlhbiB2YWx1ZXMgZm9yIGVxdWFsaXR5IC0tIHNhZmUgKi8KLQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgewotCQkvKiBvYmplY3RpZCBtYXAgbXVzdCBiZSBleHBhbmRlZCwgYnV0IHRoZXJlIGlzIG5vIHNwYWNlICovCi0JCVBST0NfSU5GT19JTkMoIHMsIGxlYWtlZF9vaWQgKTsKLQkJcmV0dXJuOwotCX0KLQotCSAgICAvKiBleHBhbmQgdGhlIG9iamVjdGlkIG1hcCovCi0JICAgIG1lbW1vdmUgKG1hcCArIGkgKyAzLCBtYXAgKyBpICsgMSwgCi0JCSAgICAgKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLSAxKSAqIHNpemVvZihfX3UzMikpOwotCSAgICBtYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UpOwotCSAgICBtYXBbaSArIDJdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UgKyAxKTsKLSAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIgKTsKLQkgICAgcmV0dXJuOwotCX0KLQlpICs9IDI7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTE1MDExOiByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkOiB0cmllZCB0byBmcmVlIGZyZWUgb2JqZWN0IGlkICglbHUpIiwKLQkJICAgICAgKCBsb25nIHVuc2lnbmVkICkgb2JqZWN0aWRfdG9fcmVsZWFzZSk7CisJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJICJ2cy0xNTAxMTogcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZDogdHJpZWQgdG8gZnJlZSBmcmVlIG9iamVjdCBpZCAoJWx1KSIsCisJCQkgKGxvbmcgdW5zaWduZWQpb2JqZWN0aWRfdG9fcmVsZWFzZSk7CiB9CiAKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpkaXNrX3NiID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKKwlpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMjsKKwlpbnQgb2xkX21heCA9IHNiX29pZF9tYXhzaXplKGRpc2tfc2IpOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSAqZGlza19zYl92MTsKKwlfX2xlMzIgKm9iamVjdGlkX21hcCwgKm5ld19vYmplY3RpZF9tYXA7CisJaW50IGk7CiAKLWludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc2IgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICBpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKLSAgICBpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMiA7Ci0gICAgaW50IG9sZF9tYXggPSBzYl9vaWRfbWF4c2l6ZShkaXNrX3NiKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKmRpc2tfc2JfdjEgOwotICAgIF9fbGUzMiAqb2JqZWN0aWRfbWFwLCAqbmV3X29iamVjdGlkX21hcCA7Ci0gICAgaW50IGkgOworCWRpc2tfc2JfdjEgPQorCSAgICAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOworCW9iamVjdGlkX21hcCA9IChfX2xlMzIgKikgKGRpc2tfc2JfdjEgKyAxKTsKKwluZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKSAoZGlza19zYiArIDEpOwogCi0gICAgZGlza19zYl92MT0oc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOwotICAgIG9iamVjdGlkX21hcCA9IChfX2xlMzIgKikoZGlza19zYl92MSArIDEpIDsKLSAgICBuZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKShkaXNrX3NiICsgMSkgOworCWlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7CisJCS8qIG1hcmsgZXZlcnlvbmUgdXNlZCB0aGF0IHdhcyBsaXN0ZWQgYXMgZnJlZSBhdCB0aGUgZW5kIG9mIHRoZSBvYmplY3RpZAorCQkgKiogbWFwIAorCQkgKi8KKwkJb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsIG5ld19zaXplKTsKKwl9CisJLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwlmb3IgKGkgPSBuZXdfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW9iamVjdGlkX21hcFtpICsgKG9sZF9tYXggLSBuZXdfc2l6ZSldID0gb2JqZWN0aWRfbWFwW2ldOworCX0KIAotICAgIGlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7Ci0JLyogbWFyayBldmVyeW9uZSB1c2VkIHRoYXQgd2FzIGxpc3RlZCBhcyBmcmVlIGF0IHRoZSBlbmQgb2YgdGhlIG9iamVjdGlkCi0JKiogbWFwIAotCSovCi0Jb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXSA7Ci0Jc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsbmV3X3NpemUpIDsKLSAgICB9Ci0gICAgLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KLSAgICBmb3IgKGkgPSBuZXdfc2l6ZSAtIDEgOyBpID49IDAgOyBpLS0pIHsKLSAgICAgICAgb2JqZWN0aWRfbWFwW2kgKyAob2xkX21heCAtIG5ld19zaXplKV0gPSBvYmplY3RpZF9tYXBbaV0gOyAKLSAgICB9CisJLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLworCXNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLCBuZXdfc2l6ZSk7CiAKKwkvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KKwltZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKTsKKwlnZW5lcmF0ZV9yYW5kb21fdXVpZChkaXNrX3NiLT5zX3V1aWQpOwogCi0gICAgLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLwotICAgIHNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLG5ld19zaXplKSA7Ci0KLSAgICAvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KLSAgICBtZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKSA7Ci0gICAgZ2VuZXJhdGVfcmFuZG9tX3V1aWQoZGlza19zYi0+c191dWlkKTsKLQotICAgIC8qIGZpbmFsbHksIHplcm8gb3V0IHRoZSB1bnVzZWQgY2h1bmsgb2YgdGhlIG5ldyBzdXBlciAqLwotICAgIG1lbXNldChkaXNrX3NiLT5zX3VudXNlZCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfdW51c2VkKSkgOwotICAgIHJldHVybiAwIDsKKwkvKiBmaW5hbGx5LCB6ZXJvIG91dCB0aGUgdW51c2VkIGNodW5rIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwltZW1zZXQoZGlza19zYi0+c191bnVzZWQsIDAsIHNpemVvZihkaXNrX3NiLT5zX3VudXNlZCkpOworCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcmludHMuYyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCmluZGV4IDE2ZmRjYTEuLmQ1NWUxNjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jCisrKyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCkBAIC0xNSwxNjkgKzE1LDE2NyBAQAogc3RhdGljIGNoYXIgZm10X2J1ZlsxMDI0XTsKIHN0YXRpYyBjaGFyIG9mZl9idWZbODBdOwogCi0KLXN0YXRpYyBjaGFyICogcmVpc2VyZnNfY3B1X29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqcmVpc2VyZnNfY3B1X29mZnNldChzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotICAgIHNwcmludGYgKG9mZl9idWYsICIlTHUoJUx1KSIsIAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylHRVRfSEFTSF9WQUxVRSAoY3B1X2tleV9rX29mZnNldCAoa2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSkpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob2ZmX2J1ZiwgIjB4JUx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgcmV0dXJuIG9mZl9idWY7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJR0VUX0dFTkVSQVRJT05fTlVNQkVSKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpOworCWVsc2UKKwkJc3ByaW50ZihvZmZfYnVmLCAiMHglTHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0KGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogbGVfb2Zmc2V0IChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmxlX29mZnNldChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gIGludCB2ZXJzaW9uOworCWludCB2ZXJzaW9uOwogCi0gIHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKLSAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiJUx1KCVMdSkiLCAKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0hBU0hfVkFMVUUgKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiMHglTHgiLCAodW5zaWduZWQgbG9uZyBsb25nKWxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSk7Ci0gIHJldHVybiBvZmZfYnVmOworCXZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbihrZXkpOworCWlmIChsZV9rZXlfa190eXBlKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGxlX2tleV9rX29mZnNldCh2ZXJzaW9uLCBrZXkpKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQlHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpKTsKKwllbHNlCisJCXNwcmludGYob2ZmX2J1ZiwgIjB4JUx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogY3B1X3R5cGUgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmNwdV90eXBlKHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgaWYgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfU1RBVF9EQVRBKQotCXJldHVybiAiU0QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotCXJldHVybiAiRElSIjsKLSAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0lORElSRUNUKQotCXJldHVybiAiSU5EIjsKLSAgICByZXR1cm4gIlVOS05PV04iOworCWlmIChjcHVfa2V5X2tfdHlwZShrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorCQlyZXR1cm4gIkRJUiI7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFQ1QpCisJCXJldHVybiAiRElSRUNUIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCi1zdGF0aWMgY2hhciAqIGxlX3R5cGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqbGVfdHlwZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgaW50IHZlcnNpb247Ci0gICAgCi0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworCWludCB2ZXJzaW9uOwogCi0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9TVEFUX0RBVEEpCi0JcmV0dXJuICJTRCI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLQlyZXR1cm4gIkRJUiI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChsZV9rZXlfa190eXBlICh2ZXJzaW9uLCBrZXkpID09IFRZUEVfSU5ESVJFQ1QpCi0JcmV0dXJuICJJTkQiOwotICAgIHJldHVybiAiVU5LTk9XTiI7CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRU5UUlkpCisJCXJldHVybiAiRElSIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRUNUKQorCQlyZXR1cm4gIkRJUkVDVCI7CisJaWYgKGxlX2tleV9rX3R5cGUodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCiAvKiAlayAqLwotc3RhdGljIHZvaWQgc3ByaW50Zl9sZV9rZXkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2xlX2tleShjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgaWYgKGtleSkKLSAgICBzcHJpbnRmIChidWYsICJbJWQgJWQgJXMgJXNdIiwgbGUzMl90b19jcHUgKGtleS0+a19kaXJfaWQpLAotCSAgICAgbGUzMl90b19jcHUgKGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldCAoa2V5KSwgbGVfdHlwZSAoa2V5KSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJbTlVMTF0iKTsKKwlpZiAoa2V5KQorCQlzcHJpbnRmKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBsZTMyX3RvX2NwdShrZXktPmtfZGlyX2lkKSwKKwkJCWxlMzJfdG9fY3B1KGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldChrZXkpLAorCQkJbGVfdHlwZShrZXkpKTsKKwllbHNlCisJCXNwcmludGYoYnVmLCAiW05VTExdIik7CiB9CiAKLQogLyogJUsgKi8KLXN0YXRpYyB2b2lkIHNwcmludGZfY3B1X2tleSAoY2hhciAqIGJ1Ziwgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2NwdV9rZXkoY2hhciAqYnVmLCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoa2V5KQotICAgIHNwcmludGYgKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkLAotCSAgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCByZWlzZXJmc19jcHVfb2Zmc2V0IChrZXkpLAotICAgICAgICAgICAgIGNwdV90eXBlIChrZXkpKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChrZXkpCisJCXNwcmludGYoYnVmLCAiWyVkICVkICVzICVzXSIsIGtleS0+b25fZGlza19rZXkua19kaXJfaWQsCisJCQlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQsIHJlaXNlcmZzX2NwdV9vZmZzZXQoa2V5KSwKKwkJCWNwdV90eXBlKGtleSkpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICJbTlVMTF0iKTsKIH0KIAotc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKCBjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggKQorc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCkKIHsKLSAgICBpZiggZGVoICkKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW29mZnNldD0lZCBkaXJfaWQ9JWQgb2JqZWN0aWQ9JWQgbG9jYXRpb249JWQgc3RhdGU9JTA0eF0iLCBkZWhfb2Zmc2V0KGRlaCksIGRlaF9kaXJfaWQoZGVoKSwKLSAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCksIGRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSApOwotICAgIGVsc2UKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW05VTExdIiApOworCWlmIChkZWgpCisJCXNwcmludGYoYnVmLAorCQkJIltvZmZzZXQ9JWQgZGlyX2lkPSVkIG9iamVjdGlkPSVkIGxvY2F0aW9uPSVkIHN0YXRlPSUwNHhdIiwKKwkJCWRlaF9vZmZzZXQoZGVoKSwgZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKKwkJCWRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogCiB9CiAKLXN0YXRpYyB2b2lkIHNwcmludGZfaXRlbV9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2l0ZW1faGVhZChjaGFyICpidWYsIHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIGlmIChpaCkgewotCXN0cmNweSAoYnVmLCAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7Ci0Jc3ByaW50Zl9sZV9rZXkgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgJihpaC0+aWhfa2V5KSk7Ci0Jc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiLCBpdGVtX2xlbiAlZCwgaXRlbV9sb2NhdGlvbiAlZCwgIgotCQkgImZyZWVfc3BhY2UoZW50cnlfY291bnQpICVkIiwKLQkJIGloX2l0ZW1fbGVuKGloKSwgaWhfbG9jYXRpb24oaWgpLCBpaF9mcmVlX3NwYWNlIChpaCkpOwotICAgIH0gZWxzZQotCXNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChpaCkgeworCQlzdHJjcHkoYnVmLAorCQkgICAgICAgKGloX3ZlcnNpb24oaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7CisJCXNwcmludGZfbGVfa2V5KGJ1ZiArIHN0cmxlbihidWYpLCAmKGloLT5paF9rZXkpKTsKKwkJc3ByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgIiwgaXRlbV9sZW4gJWQsIGl0ZW1fbG9jYXRpb24gJWQsICIKKwkJCSJmcmVlX3NwYWNlKGVudHJ5X2NvdW50KSAlZCIsCisJCQlpaF9pdGVtX2xlbihpaCksIGloX2xvY2F0aW9uKGloKSwgaWhfZnJlZV9zcGFjZShpaCkpOworCX0gZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogfQogCi0KLXN0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkoY2hhciAqYnVmLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgY2hhciBuYW1lWzIwXTsKKwljaGFyIG5hbWVbMjBdOwogCi0gIG1lbWNweSAobmFtZSwgZGUtPmRlX25hbWUsIGRlLT5kZV9uYW1lbGVuID4gMTkgPyAxOSA6IGRlLT5kZV9uYW1lbGVuKTsKLSAgbmFtZSBbZGUtPmRlX25hbWVsZW4gPiAxOSA/IDE5IDogZGUtPmRlX25hbWVsZW5dID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CisJbWVtY3B5KG5hbWUsIGRlLT5kZV9uYW1lLCBkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbik7CisJbmFtZVtkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbl0gPSAwOworCXNwcmludGYoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3ByaW50Zl9ibG9ja19oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIHNwcmludGZfYmxvY2tfaGVhZChjaGFyICpidWYsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgImxldmVsPSVkLCBucl9pdGVtcz0lZCwgZnJlZV9zcGFjZT0lZCByZGtleSAiLAotCSAgIEJfTEVWRUwgKGJoKSwgQl9OUl9JVEVNUyAoYmgpLCBCX0ZSRUVfU1BBQ0UgKGJoKSk7CisJc3ByaW50ZihidWYsICJsZXZlbD0lZCwgbnJfaXRlbXM9JWQsIGZyZWVfc3BhY2U9JWQgcmRrZXkgIiwKKwkJQl9MRVZFTChiaCksIEJfTlJfSVRFTVMoYmgpLCBCX0ZSRUVfU1BBQ0UoYmgpKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkgCitzdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotICBzcHJpbnRmIChidWYsICJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAotCSAgIGJkZXZuYW1lIChiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKLQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCi0JICAgYXRvbWljX3JlYWQgKCYoYmgtPmJfY291bnQpKSwKLQkgICBiaC0+Yl9zdGF0ZSwgYmgtPmJfcGFnZSwKLQkgICBidWZmZXJfdXB0b2RhdGUgKGJoKSA/ICJVUFRPREFURSIgOiAiIVVQVE9EQVRFIiwKLQkgICBidWZmZXJfZGlydHkgKGJoKSA/ICJESVJUWSIgOiAiQ0xFQU4iLAotCSAgIGJ1ZmZlcl9sb2NrZWQgKGJoKSA/ICJMT0NLRUQiIDogIlVOTE9DS0VEIik7CisJc3ByaW50ZihidWYsCisJCSJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAorCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksCisJCWJoLT5iX3N0YXRlLCBiaC0+Yl9wYWdlLAorCQlidWZmZXJfdXB0b2RhdGUoYmgpID8gIlVQVE9EQVRFIiA6ICIhVVBUT0RBVEUiLAorCQlidWZmZXJfZGlydHkoYmgpID8gIkRJUlRZIiA6ICJDTEVBTiIsCisJCWJ1ZmZlcl9sb2NrZWQoYmgpID8gIkxPQ0tFRCIgOiAiVU5MT0NLRUQiKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQgKGNoYXIgKiBidWYsIHN0cnVjdCBkaXNrX2NoaWxkICogZGMpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQoY2hhciAqYnVmLCBzdHJ1Y3QgZGlza19jaGlsZCAqZGMpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgIltkY19udW1iZXI9JWQsIGRjX3NpemU9JXVdIiwgZGNfYmxvY2tfbnVtYmVyKGRjKSwgZGNfc2l6ZShkYykpOworCXNwcmludGYoYnVmLCAiW2RjX251bWJlcj0lZCwgZGNfc2l6ZT0ldV0iLCBkY19ibG9ja19udW1iZXIoZGMpLAorCQlkY19zaXplKGRjKSk7CiB9CiAKLQotc3RhdGljIGNoYXIgKiBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QgKGNoYXIgKiBmbXQsIGludCAqIHdoYXQsIGludCAqIHNraXApCitzdGF0aWMgY2hhciAqaXNfdGhlcmVfcmVpc2VyZnNfc3RydWN0KGNoYXIgKmZtdCwgaW50ICp3aGF0LCBpbnQgKnNraXApCiB7Ci0gIGNoYXIgKiBrID0gZm10OworCWNoYXIgKmsgPSBmbXQ7CiAKLSAgKnNraXAgPSAwOwotICAKLSAgd2hpbGUgKChrID0gc3RyY2hyIChrLCAnJScpKSAhPSBOVUxMKQotICB7Ci0gICAgaWYgKGtbMV0gPT0gJ2snIHx8IGtbMV0gPT0gJ0snIHx8IGtbMV0gPT0gJ2gnIHx8IGtbMV0gPT0gJ3QnIHx8Ci0JICAgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScgKSB7Ci0gICAgICAqd2hhdCA9IGtbMV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpza2lwKSArKzsKLSAgICBrICsrOwotICB9Ci0gIHJldHVybiBrOworCSpza2lwID0gMDsKKworCXdoaWxlICgoayA9IHN0cmNocihrLCAnJScpKSAhPSBOVUxMKSB7CisJCWlmIChrWzFdID09ICdrJyB8fCBrWzFdID09ICdLJyB8fCBrWzFdID09ICdoJyB8fCBrWzFdID09ICd0JyB8fAorCQkgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScpIHsKKwkJCSp3aGF0ID0ga1sxXTsKKwkJCWJyZWFrOworCQl9CisJCSgqc2tpcCkrKzsKKwkJaysrOworCX0KKwlyZXR1cm4gazsKIH0KIAotCiAvKiBkZWJ1Z2dpbmcgcmVpc2VyZnMgd2UgdXNlZCB0byBwcmludCBvdXQgYSBsb3Qgb2YgZGlmZmVyZW50CiAgICB2YXJpYWJsZXMsIGxpa2Uga2V5cywgaXRlbSBoZWFkZXJzLCBidWZmZXIgaGVhZHMgZXRjLiBWYWx1ZXMgb2YKICAgIG1vc3QgZmllbGRzIG1hdHRlci4gU28gaXQgdG9vayBhIGxvbmcgdGltZSBqdXN0IHRvIHdyaXRlCkBAIC0xOTEsNjEgKzE4OSw2NCBAQAogICAgICAgICAgICBrZXktPmtfb2Zmc2V0LCBrZXktPmtfdW5pcXVlbmVzcyk7IAogKi8KIAotCi1zdGF0aWMgdm9pZAotcHJlcGFyZV9lcnJvcl9idWYoIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfZXJyb3JfYnVmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewotICAgIGNoYXIgKiBmbXQxID0gZm10X2J1ZjsKLSAgICBjaGFyICogazsKLSAgICBjaGFyICogcCA9IGVycm9yX2J1ZjsKLSAgICBpbnQgaSwgaiwgd2hhdCwgc2tpcDsKKwljaGFyICpmbXQxID0gZm10X2J1ZjsKKwljaGFyICprOworCWNoYXIgKnAgPSBlcnJvcl9idWY7CisJaW50IGksIGosIHdoYXQsIHNraXA7CiAKLSAgICBzdHJjcHkgKGZtdDEsIGZtdCk7CisJc3RyY3B5KGZtdDEsIGZtdCk7CiAKLSAgICB3aGlsZSggKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoIGZtdDEsICZ3aGF0LCAmc2tpcCApKSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgICprID0gMDsKKwl3aGlsZSAoKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoZm10MSwgJndoYXQsICZza2lwKSkgIT0gTlVMTCkgeworCQkqayA9IDA7CiAKLSAgICAgICAgcCArPSB2c3ByaW50ZiAocCwgZm10MSwgYXJncyk7CisJCXAgKz0gdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNraXA7IGkgKyspCi0gICAgICAgICAgICBqID0gdmFfYXJnIChhcmdzLCBpbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tpcDsgaSsrKQorCQkJaiA9IHZhX2FyZyhhcmdzLCBpbnQpOwogCi0gICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlICdrJzoKLSAgICAgICAgICAgIHNwcmludGZfbGVfa2V5IChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICBzcHJpbnRmX2NwdV9rZXkgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICBzcHJpbnRmX2l0ZW1faGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBpdGVtX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgc3ByaW50Zl9kaXJlbnRyeSAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgc3ByaW50Zl9kaXNrX2NoaWxkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGRpc2tfY2hpbGQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgc3ByaW50Zl9ibG9ja19oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgIHNwcmludGZfYnVmZmVyX2hlYWQgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgc3ByaW50Zl9kZV9oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkJc3dpdGNoICh3aGF0KSB7CisJCWNhc2UgJ2snOgorCQkJc3ByaW50Zl9sZV9rZXkocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19rZXkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgorCQkJc3ByaW50Zl9jcHVfa2V5KHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlzcHJpbnRmX2l0ZW1faGVhZChwLCB2YV9hcmcoYXJncywgc3RydWN0IGl0ZW1faGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlzcHJpbnRmX2RpcmVudHJ5KHAsCisJCQkJCSB2YV9hcmcoYXJncywKKwkJCQkJCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJc3ByaW50Zl9kaXNrX2NoaWxkKHAsCisJCQkJCSAgIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgZGlza19jaGlsZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzcHJpbnRmX2Jsb2NrX2hlYWQocCwKKwkJCQkJICAgdmFfYXJnKGFyZ3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlzcHJpbnRmX2J1ZmZlcl9oZWFkKHAsCisJCQkJCSAgICB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCXNwcmludGZfZGVfaGVhZChwLAorCQkJCQl2YV9hcmcoYXJncywKKwkJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgcCArPSBzdHJsZW4gKHApOwotICAgICAgICBmbXQxID0gayArIDI7Ci0gICAgfQotICAgIHZzcHJpbnRmIChwLCBmbXQxLCBhcmdzKTsKKwkJcCArPSBzdHJsZW4ocCk7CisJCWZtdDEgPSBrICsgMjsKKwl9CisJdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKIH0KIAotCiAvKiBpbiBhZGRpdGlvbiB0byB1c3VhbCBjb252ZXJzaW9uIHNwZWNpZmllcnMgdGhpcyBhY2NlcHRzIHJlaXNlcmZzCiAgICBzcGVjaWZpYyBjb252ZXJzaW9uIHNwZWNpZmllcnM6IAogICAgJWsgdG8gcHJpbnQgbGl0dGxlIGVuZGlhbiBrZXksIApAQCAtMjY0LDQzICsyNjUsNDMgQEAKICAgICB2YV9lbmQoIGFyZ3MgKTtcCiB9CiAKLXZvaWQgcmVpc2VyZnNfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7Ci0gIGlmIChzYikKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogJXM6IHdhcm5pbmc6ICVzXG4iLAotICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIGVsc2UKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogd2FybmluZzogJXNcbiIsIGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCWlmIChzYikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVpc2VyRlM6ICVzOiB3YXJuaW5nOiAlc1xuIiwKKwkJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlaXNlckZTOiB3YXJuaW5nOiAlc1xuIiwgZXJyb3JfYnVmKTsKIH0KIAogLyogTm8gbmV3bGluZS4uIHJlaXNlcmZzX2luZm8gY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi12b2lkIHJlaXNlcmZzX2luZm8gKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBpZiAoc2IpCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXM6ICVzIiwKLSAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXMiLCBlcnJvcl9idWYpOworCWRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX05PVElDRSAiUmVpc2VyRlM6ICVzOiAlcyIsCisJCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlaXNlckZTOiAlcyIsIGVycm9yX2J1Zik7CiB9CiAKIC8qIE5vIG5ld2xpbmUuLiByZWlzZXJmc19wcmludGsgY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi1zdGF0aWMgdm9pZCByZWlzZXJmc19wcmludGsgKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBwcmludGsgKGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCXByaW50ayhlcnJvcl9idWYpOwogfQogCi12b2lkIHJlaXNlcmZzX2RlYnVnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc19kZWJ1ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgaWYgKHMpCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlczogJXNcbiIsCi0gICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlc1xuIiwgZXJyb3JfYnVmKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJaWYgKHMpCisJCXByaW50ayhLRVJOX0RFQlVHICJSZWlzZXJGUzogJXM6ICVzXG4iLAorCQkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUocyksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiUmVpc2VyRlM6ICVzXG4iLCBlcnJvcl9idWYpOwogI2VuZGlmCiB9CiAKQEAgLTM0OSwzNzkgKzM1MCw0MDMgQEAKIAogICAgLiAgKi8KIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YjsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAjZW5kaWYKIAotdm9pZCByZWlzZXJmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfcGFuaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgcHJpbnRrIChLRVJOX0VNRVJHICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIEJVRyAoKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwlCVUcoKTsKIAotICAvKiB0aGlzIGlzIG5vdCBhY3R1YWxseSBjYWxsZWQsIGJ1dCBtYWtlcyByZWlzZXJmc19wYW5pYygpICJub3JldHVybiIgKi8KLSAgcGFuaWMgKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotCSByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworCS8qIHRoaXMgaXMgbm90IGFjdHVhbGx5IGNhbGxlZCwgYnV0IG1ha2VzIHJlaXNlcmZzX3BhbmljKCkgIm5vcmV0dXJuIiAqLworCXBhbmljKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKIH0KIAotdm9pZAotcmVpc2VyZnNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCit2b2lkIHJlaXNlcmZzX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgZG9fcmVpc2VyZnNfd2FybmluZyAoZm10KTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CiAKLSAgICBpZiAocmVpc2VyZnNfZXJyb3JfcGFuaWMgKHNiKSkgewotICAgICAgICBwYW5pYyAoS0VSTl9DUklUICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKLSAgICB9CisJaWYgKHJlaXNlcmZzX2Vycm9yX3BhbmljKHNiKSkgeworCQlwYW5pYyhLRVJOX0NSSVQgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwl9CiAKLSAgICBpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCi0gICAgICAgIHJldHVybjsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CiAKLSAgICBzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0gICAgcmVpc2VyZnNfam91cm5hbF9hYm9ydCAoc2IsIGVycm5vKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJcmVpc2VyZnNfam91cm5hbF9hYm9ydChzYiwgZXJybm8pOwogfQogCiAvKiB0aGlzIHByaW50cyBpbnRlcm5hbCBub2RlcyAoNCBrZXlzL2l0ZW1zIGluIGxpbmUpIChkY19udW1iZXIsCiAgICBkY19zaXplKVtrX2RpcmlkLCBrX29iamVjdGlkLCBrX29mZnNldCwga191bmlxdWVuZXNzXShkY19udW1iZXIsCiAgICBkY19zaXplKS4uLiovCi1zdGF0aWMgaW50IHByaW50X2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3N0YXRpYyBpbnQgcHJpbnRfaW50ZXJuYWwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0gICAgaW50IGk7Ci0gICAgaW50IGZyb20sIHRvOwotICAgIAotICAgIGlmICghQl9JU19LRVlTX0xFVkVMIChiaCkpCi0JcmV0dXJuIDE7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKwlpbnQgaTsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICBjaGVja19pbnRlcm5hbCAoYmgpOwotICAgIAotICAgIGlmIChmaXJzdCA9PSAtMSkgewotCWZyb20gPSAwOwotCXRvID0gQl9OUl9JVEVNUyAoYmgpOwotICAgIH0gZWxzZSB7Ci0JZnJvbSA9IGZpcnN0OwotCXRvID0gbGFzdCA8IEJfTlJfSVRFTVMgKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TIChiaCk7Ci0gICAgfQorCWlmICghQl9JU19LRVlTX0xFVkVMKGJoKSkKKwkJcmV0dXJuIDE7CiAKLSAgICByZWlzZXJmc19wcmludGsgKCJJTlRFUk5BTCBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCAgYmgtPmJfYmxvY2tuciwgYmgpOwotICAgIAotICAgIGRjID0gQl9OX0NISUxEIChiaCwgZnJvbSk7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiUFRSICVkOiAleSAiLCBmcm9tLCBkYyk7Ci0gICAgCi0gICAgZm9yIChpID0gZnJvbSwga2V5ID0gQl9OX1BERUxJTV9LRVkgKGJoLCBmcm9tKSwgZGMgKys7IGkgPCB0bzsgaSArKywga2V5ICsrLCBkYyArKykgewotCXJlaXNlcmZzX3ByaW50ayAoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7Ci0JaWYgKGkgJiYgaSAlIDQgPT0gMCkKLQkgICAgcHJpbnRrICgiXG4iKTsKLSAgICB9Ci0gICAgcHJpbnRrICgiXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KKwljaGVja19pbnRlcm5hbChiaCk7CiAKKwlpZiAoZmlyc3QgPT0gLTEpIHsKKwkJZnJvbSA9IDA7CisJCXRvID0gQl9OUl9JVEVNUyhiaCk7CisJfSBlbHNlIHsKKwkJZnJvbSA9IGZpcnN0OworCQl0byA9IGxhc3QgPCBCX05SX0lURU1TKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TKGJoKTsKKwl9CiAKKwlyZWlzZXJmc19wcmludGsoIklOVEVSTkFMIE5PREUgKCVsZCkgY29udGFpbnMgJXpcbiIsIGJoLT5iX2Jsb2NrbnIsIGJoKTsKIAorCWRjID0gQl9OX0NISUxEKGJoLCBmcm9tKTsKKwlyZWlzZXJmc19wcmludGsoIlBUUiAlZDogJXkgIiwgZnJvbSwgZGMpOwogCi0KLXN0YXRpYyBpbnQgcHJpbnRfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQotewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgaW50IGksIG5yOwotICAgIGludCBmcm9tLCB0bzsKLQotICAgIGlmICghQl9JU19JVEVNU19MRVZFTCAoYmgpKQotCXJldHVybiAxOwotCi0gICAgY2hlY2tfbGVhZiAoYmgpOwotCi0gICAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwwKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLQotICAgIHByaW50ayAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7Ci0KLSAgICBpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKLQlyZWlzZXJmc19wcmludGsgKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAotCQkJICAmKGloLT5paF9rZXkpLCAmKChpaCArIG5yIC0gMSktPmloX2tleSkpOworCWZvciAoaSA9IGZyb20sIGtleSA9IEJfTl9QREVMSU1fS0VZKGJoLCBmcm9tKSwgZGMrKzsgaSA8IHRvOworCSAgICAgaSsrLCBrZXkrKywgZGMrKykgeworCQlyZWlzZXJmc19wcmludGsoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7CisJCWlmIChpICYmIGkgJSA0ID09IDApCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKIAlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlyc3QgPCAwIHx8IGZpcnN0ID4gbnIgLSAxKSAKLQlmcm9tID0gMDsKLSAgICBlbHNlIAotCWZyb20gPSBmaXJzdDsKLQotICAgIGlmIChsYXN0IDwgMCB8fCBsYXN0ID4gbnIgKQotCXRvID0gbnI7Ci0gICAgZWxzZQotCXRvID0gbGFzdDsKLQotICAgIGloICs9IGZyb207Ci0gICAgcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgcHJpbnRrICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7Ci0gICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloICsrKSB7Ci0JcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcmVpc2VyZnNfcHJpbnRrICgifCUyZHwgJWggfFxuIiwgaSwgaWgpOwotCWlmIChwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykKLQkgICAgb3BfcHJpbnRfaXRlbSAoaWgsIEJfSV9QSVRFTSAoYmgsIGloKSk7Ci0gICAgfQotCi0gICAgcHJpbnRrICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0KLSAgICByZXR1cm4gMDsKIH0KIAotY2hhciAqIHJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQorc3RhdGljIGludCBwcmludF9sZWFmKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsCisJCSAgICAgIGludCBsYXN0KQogewotICAgIGlmICggY29kZSA9PSBZVVJBX0hBU0gpCi0JcmV0dXJuICJydXBhc292IjsKLSAgICBpZiAoIGNvZGUgPT0gVEVBX0hBU0gpCi0JcmV0dXJuICJ0ZWEiOwotICAgIGlmICggY29kZSA9PSBSNV9IQVNIKQotCXJldHVybiAicjUiOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpLCBucjsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICByZXR1cm4gInVua25vd24iOworCWlmICghQl9JU19JVEVNU19MRVZFTChiaCkpCisJCXJldHVybiAxOworCisJY2hlY2tfbGVhZihiaCk7CisKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgMCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKwlwcmludGsKKwkgICAgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJlaXNlcmZzX3ByaW50aygiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7CisKKwlpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKKwkJcmVpc2VyZnNfcHJpbnRrKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAorCQkJCSYoaWgtPmloX2tleSksICYoKGloICsgbnIgLSAxKS0+aWhfa2V5KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiBuciAtIDEpCisJCWZyb20gPSAwOworCWVsc2UKKwkJZnJvbSA9IGZpcnN0OworCisJaWYgKGxhc3QgPCAwIHx8IGxhc3QgPiBucikKKwkJdG8gPSBucjsKKwllbHNlCisJCXRvID0gbGFzdDsKKworCWloICs9IGZyb207CisJcHJpbnRrCisJICAgICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrCisJICAgICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7CisJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloKyspIHsKKwkJcHJpbnRrCisJCSAgICAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZWlzZXJmc19wcmludGsoInwlMmR8ICVoIHxcbiIsIGksIGloKTsKKwkJaWYgKHByaW50X21vZGUgJiBQUklOVF9MRUFGX0lURU1TKQorCQkJb3BfcHJpbnRfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOworCX0KKworCXByaW50aworCSAgICAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQoreworCWlmIChjb2RlID09IFlVUkFfSEFTSCkKKwkJcmV0dXJuICJydXBhc292IjsKKwlpZiAoY29kZSA9PSBURUFfSEFTSCkKKwkJcmV0dXJuICJ0ZWEiOworCWlmIChjb2RlID09IFI1X0hBU0gpCisJCXJldHVybiAicjUiOworCisJcmV0dXJuICJ1bmtub3duIjsKIH0KIAogLyogcmV0dXJuIDEgaWYgdGhpcyBpcyBub3Qgc3VwZXIgYmxvY2sgKi8KLXN0YXRpYyBpbnQgcHJpbnRfc3VwZXJfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIGludCBwcmludF9zdXBlcl9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKShiaC0+Yl9kYXRhKTsKLSAgICBpbnQgc2tpcHBlZCwgZGF0YV9ibG9ja3M7Ci0gICAgY2hhciAqdmVyc2lvbjsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9CisJICAgIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKikoYmgtPmJfZGF0YSk7CisJaW50IHNraXBwZWQsIGRhdGFfYmxvY2tzOworCWNoYXIgKnZlcnNpb247CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKLSAgICAgICAgdmVyc2lvbiA9ICIzLjUiOwotICAgIH0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgewotICAgICAgICB2ZXJzaW9uID0gIjMuNiI7Ci0gICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKLSAgICAgIHZlcnNpb24gPSAoKHNiX3ZlcnNpb24ocnMpID09IFJFSVNFUkZTX1ZFUlNJT05fMikgPwotIAkJICIzLjYiIDogIjMuNSIpOyAgCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gMTsKLSAgICB9CisJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKKwkJdmVyc2lvbiA9ICIzLjUiOworCX0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgeworCQl2ZXJzaW9uID0gIjMuNiI7CisJfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJdmVyc2lvbiA9ICgoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8yKSA/CisJCQkgICAiMy42IiA6ICIzLjUiKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9CiAKLSAgICBwcmludGsgKCIlc1wncyBzdXBlciBibG9jayBpcyBpbiBibG9jayAlbGx1XG4iLCBiZGV2bmFtZSAoYmgtPmJfYmRldiwgYiksCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwotICAgIHByaW50ayAoIlJlaXNlcmZzIHZlcnNpb24gJXNcbiIsIHZlcnNpb24gKTsKLSAgICBwcmludGsgKCJCbG9jayBjb3VudCAldVxuIiwgc2JfYmxvY2tfY291bnQocnMpKTsKLSAgICBwcmludGsgKCJCbG9ja3NpemUgJWRcbiIsIHNiX2Jsb2Nrc2l6ZShycykpOwotICAgIHByaW50ayAoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOwotICAgIC8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgotICAgIC8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQorCXByaW50aygiJXNcJ3Mgc3VwZXIgYmxvY2sgaXMgaW4gYmxvY2sgJWxsdVxuIiwgYmRldm5hbWUoYmgtPmJfYmRldiwgYiksCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJcHJpbnRrKCJSZWlzZXJmcyB2ZXJzaW9uICVzXG4iLCB2ZXJzaW9uKTsKKwlwcmludGsoIkJsb2NrIGNvdW50ICV1XG4iLCBzYl9ibG9ja19jb3VudChycykpOworCXByaW50aygiQmxvY2tzaXplICVkXG4iLCBzYl9ibG9ja3NpemUocnMpKTsKKwlwcmludGsoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOworCS8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgorCS8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQogLy8gICAgc2tpcHBlZCA9IChiaC0+Yl9ibG9ja25yICogYmgtPmJfc2l6ZSkgLyBzYl9ibG9ja3NpemUocnMpOwotICAgIHNraXBwZWQgPSBiaC0+Yl9ibG9ja25yOwotICAgIGRhdGFfYmxvY2tzID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2tpcHBlZCAtIDEgLSBzYl9ibWFwX25yKHJzKSAtCi0JICAgICghaXNfcmVpc2VyZnNfanIocnMpID8gc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEgOiBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpIC0JICAgIAotCSAgICBzYl9mcmVlX2Jsb2Nrcyhycyk7Ci0gICAgcHJpbnRrICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCi0JICAgICIxIHN1cGVyIGJsb2NrLCAlZCBkYXRhIGJsb2Nrc1xuIiwgCi0JICAgIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLCAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IChzYl9qcF9qb3VybmFsX3NpemUocnMpICsgMSkgOgotCQkJCSAgICAgIHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLCBkYXRhX2Jsb2Nrcyk7Ci0gICAgcHJpbnRrICgiUm9vdCBibG9jayAldVxuIiwgc2Jfcm9vdF9ibG9jayhycykpOwotICAgIHByaW50ayAoIkpvdXJuYWwgYmxvY2sgKGZpcnN0KSAlZFxuIiwgc2JfanBfam91cm5hbF8xc3RfYmxvY2socnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIG9yaWcgc2l6ZSAlZFxuIiwgc2JfanBfam91cm5hbF9zaXplKHJzKSk7Ci0gICAgcHJpbnRrICgiRlMgc3RhdGUgJWRcbiIsIHNiX2ZzX3N0YXRlKHJzKSk7Ci0gICAgcHJpbnRrICgiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCi0JICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKLSAgICAKLSAgICBwcmludGsgKCJUcmVlIGhlaWdodCAlZFxuIiwgc2JfdHJlZV9oZWlnaHQocnMpKTsKLSAgICByZXR1cm4gMDsKKwlza2lwcGVkID0gYmgtPmJfYmxvY2tucjsKKwlkYXRhX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNraXBwZWQgLSAxIC0gc2JfYm1hcF9ucihycykgLQorCSAgICAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IHNiX2pwX2pvdXJuYWxfc2l6ZShycykgKworCSAgICAgMSA6IHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLSBzYl9mcmVlX2Jsb2Nrcyhycyk7CisJcHJpbnRrCisJICAgICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCisJICAgICAiMSBzdXBlciBibG9jaywgJWQgZGF0YSBibG9ja3NcbiIsIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLAorCSAgICAgKCFpc19yZWlzZXJmc19qcihycykgPyAoc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEpIDoKKwkgICAgICBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpLCBkYXRhX2Jsb2Nrcyk7CisJcHJpbnRrKCJSb290IGJsb2NrICV1XG4iLCBzYl9yb290X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGJsb2NrIChmaXJzdCkgJWRcbiIsIHNiX2pwX2pvdXJuYWxfMXN0X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKKwlwcmludGsoIkpvdXJuYWwgb3JpZyBzaXplICVkXG4iLCBzYl9qcF9qb3VybmFsX3NpemUocnMpKTsKKwlwcmludGsoIkZTIHN0YXRlICVkXG4iLCBzYl9mc19zdGF0ZShycykpOworCXByaW50aygiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCisJICAgICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKKworCXByaW50aygiVHJlZSBoZWlnaHQgJWRcbiIsIHNiX3RyZWVfaGVpZ2h0KHJzKSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfZGVzY19ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IHByaW50X2Rlc2NfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjOwogCi0gICAgaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChiaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCkpCi0JcmV0dXJuIDE7CisJaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljKGJoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkKKwkJcmV0dXJuIDE7CiAKLSAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7Ci0gICAgcHJpbnRrICgiRGVzYyBibG9jayAlbGx1IChqX3RyYW5zX2lkICVkLCBqX21vdW50X2lkICVkLCBqX2xlbiAlZCkiLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGdldF9kZXNjX3RyYW5zX2lkIChkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCSAgICBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpKTsKKwlkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7CisJcHJpbnRrKCJEZXNjIGJsb2NrICVsbHUgKGpfdHJhbnNfaWQgJWQsIGpfbW91bnRfaWQgJWQsIGpfbGVuICVkKSIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyksCisJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotdm9pZCBwcmludF9ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIC4uLikvL2ludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQordm9pZCBwcmludF9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAuLi4pCS8vaW50IHByaW50X21vZGUsIGludCBmaXJzdCwgaW50IGxhc3QpCiB7Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGludCBtb2RlLCBmaXJzdCwgbGFzdDsKKwl2YV9saXN0IGFyZ3M7CisJaW50IG1vZGUsIGZpcnN0LCBsYXN0OwogCi0gICAgdmFfc3RhcnQgKGFyZ3MsIGJoKTsKKwl2YV9zdGFydChhcmdzLCBiaCk7CiAKLSAgICBpZiAoICEgYmggKSB7Ci0JcHJpbnRrKCJwcmludF9ibG9jazogYnVmZmVyIGlzIE5VTExcbiIpOwotCXJldHVybjsKLSAgICB9CisJaWYgKCFiaCkgeworCQlwcmludGsoInByaW50X2Jsb2NrOiBidWZmZXIgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CiAKLSAgICBtb2RlID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGxhc3QgPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0gICAgaWYgKHByaW50X2xlYWYgKGJoLCBtb2RlLCBmaXJzdCwgbGFzdCkpCi0JaWYgKHByaW50X2ludGVybmFsIChiaCwgZmlyc3QsIGxhc3QpKQotCSAgICBpZiAocHJpbnRfc3VwZXJfYmxvY2sgKGJoKSkKLQkJaWYgKHByaW50X2Rlc2NfYmxvY2sgKGJoKSkKLQkJICAgIHByaW50ayAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwltb2RlID0gdmFfYXJnKGFyZ3MsIGludCk7CisJZmlyc3QgPSB2YV9hcmcoYXJncywgaW50KTsKKwlsYXN0ID0gdmFfYXJnKGFyZ3MsIGludCk7CisJaWYgKHByaW50X2xlYWYoYmgsIG1vZGUsIGZpcnN0LCBsYXN0KSkKKwkJaWYgKHByaW50X2ludGVybmFsKGJoLCBmaXJzdCwgbGFzdCkpCisJCQlpZiAocHJpbnRfc3VwZXJfYmxvY2soYmgpKQorCQkJCWlmIChwcmludF9kZXNjX2Jsb2NrKGJoKSkKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwKKwkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwogfQogCi0KLQogc3RhdGljIGNoYXIgcHJpbnRfdGJfYnVmWzIwNDhdOwogCiAvKiB0aGlzIHN0b3JlcyBpbml0aWFsIHN0YXRlIG9mIHRyZWUgYmFsYW5jZSBpbiB0aGUgcHJpbnRfdGJfYnVmICovCi12b2lkIHN0b3JlX3ByaW50X3RiIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit2b2lkIHN0b3JlX3ByaW50X3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIGludCBoID0gMDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoLCAqIHRiRmg7CisJaW50IGggPSAwOworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaCwgKnRiRmg7CiAKLSAgICBpZiAoIXRiKQotCXJldHVybjsKKwlpZiAoIXRiKQorCQlyZXR1cm47CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYsICJcbiIKLQkgICAgICJCQUxBTkNJTkcgJWRcbiIKLQkgICAgICJNT0RFPSVjLCBJVEVNX1BPUz0lZCBQT1NfSU5fSVRFTT0lZFxuIiAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiAgICBTICAgICogICAgTCAgICAqICAgIFIgICAgKiAgIEYgICAqICAgRkwgICogICBGUiAgKiAgQ0ZMICAqICBDRlIgICpcbiIsCi0JICAgICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCi0JICAgICB0Yi0+dGJfbW9kZSwgUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCksIHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbSk7Ci0gIAotICAgIGZvciAoaCA9IDA7IGggPCBzaXplb2YodGItPmluc2VydF9zaXplKSAvIHNpemVvZiAodGItPmluc2VydF9zaXplWzBdKTsgaCArKykgewotCWlmIChQQVRIX0hfUEFUSF9PRkZTRVQgKHRiLT50Yl9wYXRoLCBoKSA8PSB0Yi0+dGJfcGF0aC0+cGF0aF9sZW5ndGggJiYgCi0JICAgIFBBVEhfSF9QQVRIX09GRlNFVCAodGItPnRiX3BhdGgsIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7Ci0JICAgIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCSAgICB0YkZoID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQl9IGVsc2UgewotCSAgICB0YlNoID0gTlVMTDsKLQkgICAgdGJGaCA9IE5VTEw7CisJc3ByaW50ZihwcmludF90Yl9idWYsICJcbiIKKwkJIkJBTEFOQ0lORyAlZFxuIgorCQkiTU9ERT0lYywgSVRFTV9QT1M9JWQgUE9TX0lOX0lURU09JWRcbiIKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkiKiBoICogICAgUyAgICAqICAgIEwgICAgKiAgICBSICAgICogICBGICAgKiAgIEZMICAqICAgRlIgICogIENGTCAgKiAgQ0ZSICAqXG4iLAorCQlSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCisJCXRiLT50Yl9tb2RlLCBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpLAorCQl0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW0pOworCisJZm9yIChoID0gMDsgaCA8IHNpemVvZih0Yi0+aW5zZXJ0X3NpemUpIC8gc2l6ZW9mKHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJICAgICBoKyspIHsKKwkJaWYgKFBBVEhfSF9QQVRIX09GRlNFVCh0Yi0+dGJfcGF0aCwgaCkgPD0KKwkJICAgIHRiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aAorCQkgICAgJiYgUEFUSF9IX1BBVEhfT0ZGU0VUKHRiLT50Yl9wYXRoLAorCQkJCQkgIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCQl0YlNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQkJdGJGaCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJfSBlbHNlIHsKKwkJCXRiU2ggPSBOVUxMOworCQkJdGJGaCA9IE5VTEw7CisJCX0KKwkJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJCSIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAorCQkJaCwKKwkJCSh0YlNoKSA/IChsb25nIGxvbmcpKHRiU2gtPmJfYmxvY2tucikgOiAoLTFMTCksCisJCQkodGJTaCkgPyBhdG9taWNfcmVhZCgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5MW2hdKSA/IGF0b21pY19yZWFkKCYodGItPkxbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5SW2hdKSA/IChsb25nIGxvbmcpKHRiLT5SW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkKCYodGItPlJbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiRmgpID8gKGxvbmcgbG9uZykodGJGaC0+Yl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RkxbaF0pID8gKGxvbmcgbG9uZykodGItPkZMW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RlJbaF0pID8gKGxvbmcgbG9uZykodGItPkZSW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZMW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRkxbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZSW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRlJbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSk7CiAJfQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAotCQkgaCwgCi0JCSAodGJTaCkgPyAobG9uZyBsb25nKSh0YlNoLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0YlNoKSA/IGF0b21pY19yZWFkICgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAotCQkgKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0Yi0+TFtoXSkgPyBhdG9taWNfcmVhZCAoJih0Yi0+TFtoXS0+Yl9jb3VudCkpIDogLTEsCi0JCSAodGItPlJbaF0pID8gKGxvbmcgbG9uZykodGItPlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkICgmKHRiLT5SW2hdLT5iX2NvdW50KSkgOiAtMSwKLQkJICh0YkZoKSA/IChsb25nIGxvbmcpKHRiRmgtPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GTFtoXSkgPyAobG9uZyBsb25nKSh0Yi0+RkxbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+RlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5DRkxbaF0pID8gKGxvbmcgbG9uZykodGItPkNGTFtoXS0+Yl9ibG9ja25yKTooLTFMTCksCi0JCSAodGItPkNGUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+Q0ZSW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSk7Ci0gICAgfQogCi0gICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLCAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiBzaXplICogbG4gKiBsYiAqIHJuICogcmIgKiBibGtuICogczAgKiBzMSAqIHMxYiAqIHMyICogczJiICogY3VyYiAqIGxrICogcmsgKlxuIgotCSAgICAgIiogMCAqICU0ZCAqICUyZCAqICUyZCAqICUyZCAqICUyZCAqICU0ZCAqICUyZCAqICUyZCAqICUzZCAqICUyZCAqICUzZCAqICU0ZCAqICUyZCAqICUyZCAqXG4iLAotCSAgICAgdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sdGItPnJieXRlcywgdGItPmJsa251bVswXSwgCi0JICAgICB0Yi0+czBudW0sIHRiLT5zMW51bSx0Yi0+czFieXRlcywgIHRiLT5zMm51bSwgdGItPnMyYnl0ZXMsIHRiLT5jdXJfYmxrbnVtLCB0Yi0+bGtleVswXSwgdGItPnJrZXlbMF0pOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIiogaCAqIHNpemUgKiBsbiAqIGxiICogcm4gKiByYiAqIGJsa24gKiBzMCAqIHMxICogczFiICogczIgKiBzMmIgKiBjdXJiICogbGsgKiByayAqXG4iCisJCSIqIDAgKiAlNGQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlNGQgKiAlMmQgKiAlMmQgKiAlM2QgKiAlMmQgKiAlM2QgKiAlNGQgKiAlMmQgKiAlMmQgKlxuIiwKKwkJdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sCisJCXRiLT5yYnl0ZXMsIHRiLT5ibGtudW1bMF0sIHRiLT5zMG51bSwgdGItPnMxbnVtLCB0Yi0+czFieXRlcywKKwkJdGItPnMybnVtLCB0Yi0+czJieXRlcywgdGItPmN1cl9ibGtudW0sIHRiLT5sa2V5WzBdLAorCQl0Yi0+cmtleVswXSk7CiAKLSAgICAvKiB0aGlzIHByaW50cyBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIG5vbi1sZWFmIGxldmVscyAqLwotICAgIGggPSAwOwotICAgIGRvIHsKLQloKys7Ci0Jc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLAotCQkgIiogJWQgKiAlNGQgKiAlMmQgKiAgICAqICUyZCAqICAgICogJTJkICpcbiIsCi0JCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLCB0Yi0+YmxrbnVtW2hdKTsKLSAgICB9IHdoaWxlICh0Yi0+aW5zZXJ0X3NpemVbaF0pOworCS8qIHRoaXMgcHJpbnRzIGJhbGFuY2UgcGFyYW1ldGVycyBmb3Igbm9uLWxlYWYgbGV2ZWxzICovCisJaCA9IDA7CisJZG8geworCQloKys7CisJCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCQkiKiAlZCAqICU0ZCAqICUyZCAqICAgICogJTJkICogICAgKiAlMmQgKlxuIiwKKwkJCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLAorCQkJdGItPmJsa251bVtoXSk7CisJfSB3aGlsZSAodGItPmluc2VydF9zaXplW2hdKTsKIAotICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwgCi0JICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JICAgICAiRkVCIGxpc3Q6ICIpOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIkZFQiBsaXN0OiAiKTsKIAotICAgIC8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCi0gICAgaCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPkZFQikgLyBzaXplb2YgKHRiLT5GRUJbMF0pOyBpICsrKQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIlcCAoJWxsdSAlZCklcyIsIHRiLT5GRUJbaV0sIHRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPmJfYmxvY2tuciA6IDBVTEwsCi0JCSB0Yi0+RkVCW2ldID8gYXRvbWljX3JlYWQgKCYodGItPkZFQltpXS0+Yl9jb3VudCkpIDogMCwgCi0JCSAoaSA9PSBzaXplb2YgKHRiLT5GRUIpIC8gc2l6ZW9mICh0Yi0+RkVCWzBdKSAtIDEpID8gIlxuIiA6ICIsICIpOworCS8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCisJaCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKTsgaSsrKQorCQlzcHJpbnRmKHByaW50X3RiX2J1ZiArIHN0cmxlbihwcmludF90Yl9idWYpLAorCQkJIiVwICglbGx1ICVkKSVzIiwgdGItPkZFQltpXSwKKwkJCXRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPgorCQkJYl9ibG9ja25yIDogMFVMTCwKKwkJCXRiLT5GRUJbaV0gPyBhdG9taWNfcmVhZCgmKHRiLT5GRUJbaV0tPmJfY291bnQpKSA6IDAsCisJCQkoaSA9PQorCQkJIHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKSAtCisJCQkgMSkgPyAiXG4iIDogIiwgIik7CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksIAotCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiB9CiAKLXZvaWQgcHJpbnRfY3VyX3RiIChjaGFyICogbWVzKQordm9pZCBwcmludF9jdXJfdGIoY2hhciAqbWVzKQogewotICAgIHByaW50ayAoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKKwlwcmludGsoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWZfYmxvY2tfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gIGludCBucjsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlpbnQgbnI7CiAKLSAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7Ci0gIGlmICggbnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAxMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGl0ZW0gbnVtYmVyICV6IiwgYmgpOwotICBpZiAoIGJsa2hfZnJlZV9zcGFjZShibGtoKSA+IAotICAgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBuciApCi0gICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDIwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsIGJoKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCi17Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIAotICAgIGJsa2ggPSBCX0JMS19IRUFEIChiaCk7Ci0gICAgaWYgKCEoQl9MRVZFTCAoYmgpID4gRElTS19MRUFGX05PREVfTEVWRUwgJiYgQl9MRVZFTCAoYmgpIDw9IE1BWF9IRUlHSFQpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsIGJoKTsKLQotICAgIGlmIChCX05SX0lURU1TIChiaCkgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsIGJoKTsKLQotICAgIGlmIChCX0ZSRUVfU1BBQ0UgKGJoKSAhPSAKLQliaC0+Yl9zaXplIC0gQkxLSF9TSVpFIC0gS0VZX1NJWkUgKiBCX05SX0lURU1TIChiaCkgLSBEQ19TSVpFICogKEJfTlJfSVRFTVMgKGJoKSArIDEpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjA0MDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBmcmVlIHNwYWNlICV6IiwgYmgpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlpZiAobnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy02MDEwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgaXRlbSBudW1iZXIgJXoiLAorCQkJICAgICAgIGJoKTsKKwlpZiAoYmxraF9mcmVlX3NwYWNlKGJsa2gpID4gYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBucikKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGZyZWUgc3BhY2UgJXoiLAorCQkJICAgICAgIGJoKTsKIAogfQogCi0KLXZvaWQgY2hlY2tfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOwogCi0gICAgaWYgKCFiaCkKLQlyZXR1cm47Ci0gICAgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChiaCk7Ci0gICAgZm9yIChpID0gMCwgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyAoYmgpOyBpICsrLCBpaCArKykKLQlvcF9jaGVja19pdGVtIChpaCwgQl9JX1BJVEVNIChiaCwgaWgpKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWYgKCEoQl9MRVZFTChiaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCAmJiBCX0xFVkVMKGJoKSA8PSBNQVhfSEVJR0hUKSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfTlJfSVRFTVMoYmgpID4gKGJoLT5iX3NpemUgLSBCTEtIX1NJWkUpIC8gSUhfU0laRSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfRlJFRV9TUEFDRShiaCkgIT0KKwkgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIEtFWV9TSVpFICogQl9OUl9JVEVNUyhiaCkgLQorCSAgICBEQ19TSVpFICogKEJfTlJfSVRFTVMoYmgpICsgMSkpCisJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkgICAgICAgInZzLTYwNDA6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsCisJCQkgICAgICAgYmgpOworCiB9CiAKLQotdm9pZCBjaGVja19pbnRlcm5hbCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit2b2lkIGNoZWNrX2xlYWYoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgaWYgKCFiaCkKLSAgICByZXR1cm47Ci0gIGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQgKGJoKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKworCWlmICghYmgpCisJCXJldHVybjsKKwljaGVja19sZWFmX2Jsb2NrX2hlYWQoYmgpOworCWZvciAoaSA9IDAsIGloID0gQl9OX1BJVEVNX0hFQUQoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyhiaCk7IGkrKywgaWgrKykKKwkJb3BfY2hlY2tfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOwogfQogCit2b2lkIGNoZWNrX2ludGVybmFsKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFiaCkKKwkJcmV0dXJuOworCWNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQoYmgpOworfQogCi12b2lkIHByaW50X3N0YXRpc3RpY3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit2b2lkIHByaW50X3N0YXRpc3RpY3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCi0gIC8qCi0gIHByaW50ayAoInJlaXNlcmZzX3B1dF9zdXBlcjogc2Vzc2lvbiBzdGF0aXN0aWNzOiBiYWxhbmNlcyAlZCwgZml4X25vZGVzICVkLCBcCi1ibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZG9fYmFsYW5jZSwgUkVJU0VSRlNfU0IocyktPnNfZml4X25vZGVzLAotCSAgUkVJU0VSRlNfU0IocyktPnNfYm1hcHMsIFJFSVNFUkZTX1NCKHMpLT5zX2JtYXBzX3dpdGhvdXRfc2VhcmNoLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOwotICAqLworCS8qCisJICAgcHJpbnRrICgicmVpc2VyZnNfcHV0X3N1cGVyOiBzZXNzaW9uIHN0YXRpc3RpY3M6IGJhbGFuY2VzICVkLCBmaXhfbm9kZXMgJWQsIFwKKwkgICBibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAorCSAgIFJFSVNFUkZTX1NCKHMpLT5zX2RvX2JhbGFuY2UsIFJFSVNFUkZTX1NCKHMpLT5zX2ZpeF9ub2RlcywKKwkgICBSRUlTRVJGU19TQihzKS0+c19ibWFwcywgUkVJU0VSRlNfU0IocyktPnNfYm1hcHNfd2l0aG91dF9zZWFyY2gsCisJICAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOworCSAqLwogCiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCmluZGV4IGUyNDJlYmMuLmZjMmY0M2MgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC0zMywyOCArMzMsMjcgQEAKIHN0YXRpYyBpbnQgc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAljaGFyICpmb3JtYXQ7Ci0gICAgCi0JaWYgKCBSRUlTRVJGU19TQihzYiktPnNfcHJvcGVydGllcyAmICgxIDw8IFJFSVNFUkZTXzNfNikgKSB7CisKKwlpZiAoUkVJU0VSRlNfU0Ioc2IpLT5zX3Byb3BlcnRpZXMgJiAoMSA8PCBSRUlTRVJGU18zXzYpKSB7CiAJCWZvcm1hdCA9ICIzLjYiOwotCX0gZWxzZSBpZiAoIFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSApIHsKKwl9IGVsc2UgaWYgKFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSkgewogCQlmb3JtYXQgPSAiMy41IjsKIAl9IGVsc2UgewogCQlmb3JtYXQgPSAidW5rbm93biI7CiAJfQogCi0Jc2VxX3ByaW50ZihtLCAiJXMgZm9ybWF0XHR3aXRoIGNoZWNrcyAlc1xuIiwKLQkJCWZvcm1hdCwKKwlzZXFfcHJpbnRmKG0sICIlcyBmb3JtYXRcdHdpdGggY2hlY2tzICVzXG4iLCBmb3JtYXQsCiAjaWYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX0NIRUNLICkKLQkJCSJvbiIKKwkJICAgIm9uIgogI2Vsc2UKLQkJCSJvZmYiCisJCSAgICJvZmYiCiAjZW5kaWYKLQkJKTsKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhICkKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJKnN0YXJ0ID0gYnVmZmVyOwogCSplb2YgPSAxOwpAQCAtNzksODcgKzc4LDY4IEBACiAKICNkZWZpbmUgREpGKCB4ICkgbGUzMl90b19jcHUoIHJzIC0+IHggKQogI2RlZmluZSBESlYoIHggKSBsZTMyX3RvX2NwdSggc192MSAtPiB4ICkKLSNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKSAKKyNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKQogI2RlZmluZSBKRiggeCApICggciAtPiBzX2pvdXJuYWwgLT4geCApCiAKIHN0YXRpYyBpbnQgc2hvd19zdXBlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7Ci0gICAgCi0Jc2VxX3ByaW50ZihtLAkic3RhdGU6IFx0JXNcbiIKLQkJCSJtb3VudCBvcHRpb25zOiBcdCVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIKLQkJCSJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKLQkJCSJzX2ttYWxsb2NzOiBcdCVpXG4iCi0JCQkic19kaXNrX3JlYWRzOiBcdCVpXG4iCi0JCQkic19kaXNrX3dyaXRlczogXHQlaVxuIgotCQkJInNfZml4X25vZGVzOiBcdCVpXG4iCi0JCQkic19kb19iYWxhbmNlOiBcdCVpXG4iCi0JCQkic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCi0JCQkic19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE6IFx0JWlcbiIKLQkJCSJzX2JtYXBzOiBcdCVpXG4iCi0JCQkic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgotCQkJInNfZGlyZWN0MmluZGlyZWN0OiBcdCVpXG4iCi0JCQkic19pbmRpcmVjdDJkaXJlY3Q6IFx0JWlcbiIKLQkJCSJcbiIKLQkJCSJtYXhfaGFzaF9jb2xsaXNpb25zOiBcdCVpXG4iCiAKLQkJCSJicmVhZHM6IFx0JWx1XG4iCi0JCQkiYnJlYWRfbWlzc2VzOiBcdCVsdVxuIgotCi0JCQkic2VhcmNoX2J5X2tleTogXHQlbHVcbiIKLQkJCSJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCi0JCQkic2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkKLQkJCSJpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkicGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkiZGVsZXRlX2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgotCi0JCQkibGVha2VkX29pZDogXHQlbHVcbiIKLQkJCSJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKLQotCQkJU0YoIHNfbW91bnRfc3RhdGUgKSA9PSBSRUlTRVJGU19WQUxJRF9GUyA/Ci0JCQkiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKLQkJCXJlaXNlcmZzX3I1X2hhc2goIHNiICkgPyAiRk9SQ0VfUjUgIiA6ICIiLAotCQkJcmVpc2VyZnNfcnVwYXNvdl9oYXNoKCBzYiApID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAotCQkJcmVpc2VyZnNfdGVhX2hhc2goIHNiICkgPyAiRk9SQ0VfVEVBICIgOiAiIiwKLQkJCXJlaXNlcmZzX2hhc2hfZGV0ZWN0KCBzYiApID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKLQkJCXJlaXNlcmZzX25vX2JvcmRlciggc2IgKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKLQkJCXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24oIHNiICkgPyAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCi0JCQlyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbiggc2IgKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKLQkJCXJlaXNlcmZzX3Rlc3Q0KCBzYiApID8gIlRFU1Q0ICIgOiAiIiwKLQkJCWhhdmVfbGFyZ2VfdGFpbHMoIHNiICkgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpPyJTTUFMTF9UQUlMUyAiOiJOT19UQUlMUyAiLAotCQkJcmVwbGF5X29ubHkoIHNiICkgPyAiUkVQTEFZX09OTFkgIiA6ICIiLAotCQkJY29udmVydF9yZWlzZXJmcyggc2IgKSA/ICJDT05WICIgOiAiIiwKLQotCQkJYXRvbWljX3JlYWQoICZyIC0+IHNfZ2VuZXJhdGlvbl9jb3VudGVyICksCi0JCQlTRiggc19rbWFsbG9jcyApLAotCQkJU0YoIHNfZGlza19yZWFkcyApLAotCQkJU0YoIHNfZGlza193cml0ZXMgKSwKLQkJCVNGKCBzX2ZpeF9ub2RlcyApLAotCQkJU0YoIHNfZG9fYmFsYW5jZSApLAotCQkJU0YoIHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvciApLAotCQkJU0YoIHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhICksCi0JCQlTRiggc19ibWFwcyApLAotCQkJU0YoIHNfYm1hcHNfd2l0aG91dF9zZWFyY2ggKSwKLQkJCVNGKCBzX2RpcmVjdDJpbmRpcmVjdCApLAotCQkJU0YoIHNfaW5kaXJlY3QyZGlyZWN0ICksCi0JCQlTRlAoIG1heF9oYXNoX2NvbGxpc2lvbnMgKSwKLQkJCVNGUCggYnJlYWRzICksCi0JCQlTRlAoIGJyZWFkX21pc3MgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleSApLAotCQkJU0ZQKCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKSwKLQotCQkJU0ZQKCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggZGVsZXRlX2l0ZW1fcmVzdGFydGVkICksCi0KLQkJCVNGUCggbGVha2VkX29pZCApLAotCQkJU0ZQKCBsZWF2ZXNfcmVtb3ZhYmxlICkgKTsKKwlzZXFfcHJpbnRmKG0sICJzdGF0ZTogXHQlc1xuIgorCQkgICAibW91bnQgb3B0aW9uczogXHQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iCisJCSAgICJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKKwkJICAgInNfa21hbGxvY3M6IFx0JWlcbiIKKwkJICAgInNfZGlza19yZWFkczogXHQlaVxuIgorCQkgICAic19kaXNrX3dyaXRlczogXHQlaVxuIgorCQkgICAic19maXhfbm9kZXM6IFx0JWlcbiIKKwkJICAgInNfZG9fYmFsYW5jZTogXHQlaVxuIgorCQkgICAic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCisJCSAgICJzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYTogXHQlaVxuIgorCQkgICAic19ibWFwczogXHQlaVxuIgorCQkgICAic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgorCQkgICAic19kaXJlY3QyaW5kaXJlY3Q6IFx0JWlcbiIKKwkJICAgInNfaW5kaXJlY3QyZGlyZWN0OiBcdCVpXG4iCisJCSAgICJcbiIKKwkJICAgIm1heF9oYXNoX2NvbGxpc2lvbnM6IFx0JWlcbiIKKwkJICAgImJyZWFkczogXHQlbHVcbiIKKwkJICAgImJyZWFkX21pc3NlczogXHQlbHVcbiIKKwkJICAgInNlYXJjaF9ieV9rZXk6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImluc2VydF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgInBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCSAgICJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImxlYWtlZF9vaWQ6IFx0JWx1XG4iCisJCSAgICJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKKwkJICAgU0Yoc19tb3VudF9zdGF0ZSkgPT0gUkVJU0VSRlNfVkFMSURfRlMgPworCQkgICAiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKKwkJICAgcmVpc2VyZnNfcjVfaGFzaChzYikgPyAiRk9SQ0VfUjUgIiA6ICIiLAorCQkgICByZWlzZXJmc19ydXBhc292X2hhc2goc2IpID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAorCQkgICByZWlzZXJmc190ZWFfaGFzaChzYikgPyAiRk9SQ0VfVEVBICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfaGFzaF9kZXRlY3Qoc2IpID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfbm9fYm9yZGVyKHNiKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKKwkJICAgcmVpc2VyZnNfbm9fdW5oYXNoZWRfcmVsb2NhdGlvbihzYikgPworCQkgICAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCisJCSAgIHJlaXNlcmZzX2hhc2hlZF9yZWxvY2F0aW9uKHNiKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfdGVzdDQoc2IpID8gIlRFU1Q0ICIgOiAiIiwKKwkJICAgaGF2ZV9sYXJnZV90YWlscyhzYikgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpID8KKwkJICAgIlNNQUxMX1RBSUxTICIgOiAiTk9fVEFJTFMgIiwKKwkJICAgcmVwbGF5X29ubHkoc2IpID8gIlJFUExBWV9PTkxZICIgOiAiIiwKKwkJICAgY29udmVydF9yZWlzZXJmcyhzYikgPyAiQ09OViAiIDogIiIsCisJCSAgIGF0b21pY19yZWFkKCZyLT5zX2dlbmVyYXRpb25fY291bnRlciksIFNGKHNfa21hbGxvY3MpLAorCQkgICBTRihzX2Rpc2tfcmVhZHMpLCBTRihzX2Rpc2tfd3JpdGVzKSwgU0Yoc19maXhfbm9kZXMpLAorCQkgICBTRihzX2RvX2JhbGFuY2UpLCBTRihzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3IpLAorCQkgICBTRihzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYSksIFNGKHNfYm1hcHMpLAorCQkgICBTRihzX2JtYXBzX3dpdGhvdXRfc2VhcmNoKSwgU0Yoc19kaXJlY3QyaW5kaXJlY3QpLAorCQkgICBTRihzX2luZGlyZWN0MmRpcmVjdCksIFNGUChtYXhfaGFzaF9jb2xsaXNpb25zKSwgU0ZQKGJyZWFkcyksCisJCSAgIFNGUChicmVhZF9taXNzKSwgU0ZQKHNlYXJjaF9ieV9rZXkpLAorCQkgICBTRlAoc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkKSwgU0ZQKHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkKSwKKwkJICAgU0ZQKGluc2VydF9pdGVtX3Jlc3RhcnRlZCksIFNGUChwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCksIFNGUChkZWxldGVfaXRlbV9yZXN0YXJ0ZWQpLAorCQkgICBTRlAobGVha2VkX29pZCksIFNGUChsZWF2ZXNfcmVtb3ZhYmxlKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OSw2MSArMTQ5LDU1IEBACiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAJaW50IGxldmVsOwogCi0Jc2VxX3ByaW50ZihtLAkibGV2ZWxcdCIKLQkJCSIgICAgIGJhbGFuY2VzIgotCQkJIiBbc2JrOiAgcmVhZHMiCi0JCQkiICAgZnNfY2hhbmdlZCIKLQkJCSIgICByZXN0YXJ0ZWRdIgotCQkJIiAgIGZyZWUgc3BhY2UiCi0JCQkiICAgICAgICBpdGVtcyIKLQkJCSIgICBjYW5fcmVtb3ZlIgotCQkJIiAgICAgICAgIGxudW0iCi0JCQkiICAgICAgICAgcm51bSIKLQkJCSIgICAgICAgbGJ5dGVzIgotCQkJIiAgICAgICByYnl0ZXMiCi0JCQkiICAgICBnZXRfbmVpZyIKLQkJCSIgZ2V0X25laWdfcmVzIgotCQkJIiAgbmVlZF9sX25laWciCi0JCQkiICBuZWVkX3JfbmVpZyIKLQkJCSJcbiIKLQkJCQotCQkpOworCXNlcV9wcmludGYobSwgImxldmVsXHQiCisJCSAgICIgICAgIGJhbGFuY2VzIgorCQkgICAiIFtzYms6ICByZWFkcyIKKwkJICAgIiAgIGZzX2NoYW5nZWQiCisJCSAgICIgICByZXN0YXJ0ZWRdIgorCQkgICAiICAgZnJlZSBzcGFjZSIKKwkJICAgIiAgICAgICAgaXRlbXMiCisJCSAgICIgICBjYW5fcmVtb3ZlIgorCQkgICAiICAgICAgICAgbG51bSIKKwkJICAgIiAgICAgICAgIHJudW0iCisJCSAgICIgICAgICAgbGJ5dGVzIgorCQkgICAiICAgICAgIHJieXRlcyIKKwkJICAgIiAgICAgZ2V0X25laWciCisJCSAgICIgZ2V0X25laWdfcmVzIiAiICBuZWVkX2xfbmVpZyIgIiAgbmVlZF9yX25laWciICJcbiIpOwogCi0JZm9yKCBsZXZlbCA9IDAgOyBsZXZlbCA8IE1BWF9IRUlHSFQgOyArKyBsZXZlbCApIHsKLQkJc2VxX3ByaW50ZihtLAkiJWlcdCIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsaSIKLQkJCQkiICUxMmxpIgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiXG4iLAotCQkJCWxldmVsLCAKLQkJCQlTRlBMKCBiYWxhbmNlX2F0ICksCi0JCQkJU0ZQTCggc2JrX3JlYWRfYXQgKSwKLQkJCQlTRlBMKCBzYmtfZnNfY2hhbmdlZCApLAotCQkJCVNGUEwoIHNia19yZXN0YXJ0ZWQgKSwKLQkJCQlTRlBMKCBmcmVlX2F0ICksCi0JCQkJU0ZQTCggaXRlbXNfYXQgKSwKLQkJCQlTRlBMKCBjYW5fbm9kZV9iZV9yZW1vdmVkICksCi0JCQkJU0ZQTCggbG51bSApLAotCQkJCVNGUEwoIHJudW0gKSwKLQkJCQlTRlBMKCBsYnl0ZXMgKSwKLQkJCQlTRlBMKCByYnl0ZXMgKSwKLQkJCQlTRlBMKCBnZXRfbmVpZ2hib3JzICksCi0JCQkJU0ZQTCggZ2V0X25laWdoYm9yc19yZXN0YXJ0ICksCi0JCQkJU0ZQTCggbmVlZF9sX25laWdoYm9yICksCi0JCQkJU0ZQTCggbmVlZF9yX25laWdoYm9yICkKLQkJCSk7CisJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgTUFYX0hFSUdIVDsgKytsZXZlbCkgeworCQlzZXFfcHJpbnRmKG0sICIlaVx0IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmxpIgorCQkJICAgIiAlMTJsaSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIlxuIiwKKwkJCSAgIGxldmVsLAorCQkJICAgU0ZQTChiYWxhbmNlX2F0KSwKKwkJCSAgIFNGUEwoc2JrX3JlYWRfYXQpLAorCQkJICAgU0ZQTChzYmtfZnNfY2hhbmdlZCksCisJCQkgICBTRlBMKHNia19yZXN0YXJ0ZWQpLAorCQkJICAgU0ZQTChmcmVlX2F0KSwKKwkJCSAgIFNGUEwoaXRlbXNfYXQpLAorCQkJICAgU0ZQTChjYW5fbm9kZV9iZV9yZW1vdmVkKSwKKwkJCSAgIFNGUEwobG51bSksCisJCQkgICBTRlBMKHJudW0pLAorCQkJICAgU0ZQTChsYnl0ZXMpLAorCQkJICAgU0ZQTChyYnl0ZXMpLAorCQkJICAgU0ZQTChnZXRfbmVpZ2hib3JzKSwKKwkJCSAgIFNGUEwoZ2V0X25laWdoYm9yc19yZXN0YXJ0KSwKKwkJCSAgIFNGUEwobmVlZF9sX25laWdoYm9yKSwgU0ZQTChuZWVkX3JfbmVpZ2hib3IpCisJCSAgICApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIzMiwzMSArMjA2LDMwIEBACiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAKLQlzZXFfcHJpbnRmKG0sCSJmcmVlX2Jsb2NrOiAlbHVcbiIKLQkJCSIgIHNjYW5fYml0bWFwOiIKLQkJCSIgICAgICAgICAgd2FpdCIKLQkJCSIgICAgICAgICAgYm1hcCIKLQkJCSIgICAgICAgICByZXRyeSIKLQkJCSIgICAgICAgIHN0b2xlbiIKLQkJCSIgIGpvdXJuYWxfaGludCIKLQkJCSJqb3VybmFsX25vaGludCIKLQkJCSJcbiIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiXG4iLAotCQkJU0ZQKCBmcmVlX2Jsb2NrICksCi0JCQlTRlBGKCBjYWxsICksIAotCQkJU0ZQRiggd2FpdCApLCAKLQkJCVNGUEYoIGJtYXAgKSwKLQkJCVNGUEYoIHJldHJ5ICksCi0JCQlTRlBGKCBzdG9sZW4gKSwKLQkJCVNGUEYoIGluX2pvdXJuYWxfaGludCApLAotCQkJU0ZQRiggaW5fam91cm5hbF9ub2hpbnQgKSApOworCXNlcV9wcmludGYobSwgImZyZWVfYmxvY2s6ICVsdVxuIgorCQkgICAiICBzY2FuX2JpdG1hcDoiCisJCSAgICIgICAgICAgICAgd2FpdCIKKwkJICAgIiAgICAgICAgICBibWFwIgorCQkgICAiICAgICAgICAgcmV0cnkiCisJCSAgICIgICAgICAgIHN0b2xlbiIKKwkJICAgIiAgam91cm5hbF9oaW50IgorCQkgICAiam91cm5hbF9ub2hpbnQiCisJCSAgICJcbiIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIlxuIiwKKwkJICAgU0ZQKGZyZWVfYmxvY2spLAorCQkgICBTRlBGKGNhbGwpLAorCQkgICBTRlBGKHdhaXQpLAorCQkgICBTRlBGKGJtYXApLAorCQkgICBTRlBGKHJldHJ5KSwKKwkJICAgU0ZQRihzdG9sZW4pLAorCQkgICBTRlBGKGluX2pvdXJuYWxfaGludCksIFNGUEYoaW5fam91cm5hbF9ub2hpbnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY0LDQ2ICsyMzcsNDIgQEAKIHN0YXRpYyBpbnQgc2hvd19vbl9kaXNrX3N1cGVyKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCWludCBoYXNoX2NvZGUgPSBERkwoIHNfaGFzaF9mdW5jdGlvbl9jb2RlICk7Ci0JX191MzIgZmxhZ3MgPSBESkYoIHNfZmxhZ3MgKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mby0+c19yczsKKwlpbnQgaGFzaF9jb2RlID0gREZMKHNfaGFzaF9mdW5jdGlvbl9jb2RlKTsKKwlfX3UzMiBmbGFncyA9IERKRihzX2ZsYWdzKTsKIAotCXNlcV9wcmludGYobSwJImJsb2NrX2NvdW50OiBcdCVpXG4iCi0JCQkiZnJlZV9ibG9ja3M6IFx0JWlcbiIKLQkJCSJyb290X2Jsb2NrOiBcdCVpXG4iCi0JCQkiYmxvY2tzaXplOiBcdCVpXG4iCi0JCQkib2lkX21heHNpemU6IFx0JWlcbiIKLQkJCSJvaWRfY3Vyc2l6ZTogXHQlaVxuIgotCQkJInVtb3VudF9zdGF0ZTogXHQlaVxuIgotCQkJIm1hZ2ljOiBcdCUxMC4xMHNcbiIKLQkJCSJmc19zdGF0ZTogXHQlaVxuIgotCQkJImhhc2g6IFx0JXNcbiIKLQkJCSJ0cmVlX2hlaWdodDogXHQlaVxuIgotCQkJImJtYXBfbnI6IFx0JWlcbiIKLQkJCSJ2ZXJzaW9uOiBcdCVpXG4iCi0JCQkiZmxhZ3M6IFx0JXhbJXNdXG4iCi0JCQkicmVzZXJ2ZWRfZm9yX2pvdXJuYWw6IFx0JWlcbiIsCi0KLQkJCURGTCggc19ibG9ja19jb3VudCApLAotCQkJREZMKCBzX2ZyZWVfYmxvY2tzICksCi0JCQlERkwoIHNfcm9vdF9ibG9jayApLAotCQkJREYoIHNfYmxvY2tzaXplICksCi0JCQlERiggc19vaWRfbWF4c2l6ZSApLAotCQkJREYoIHNfb2lkX2N1cnNpemUgKSwKLQkJCURGKCBzX3Vtb3VudF9zdGF0ZSApLAotCQkJcnMgLT4gc192MS5zX21hZ2ljLAotCQkJREYoIHNfZnNfc3RhdGUgKSwKLQkJCWhhc2hfY29kZSA9PSBURUFfSEFTSCA/ICJ0ZWEiIDoKLQkJCSggaGFzaF9jb2RlID09IFlVUkFfSEFTSCApID8gInJ1cGFzb3YiIDoKLQkJCSggaGFzaF9jb2RlID09IFI1X0hBU0ggKSA/ICJyNSIgOgotCQkJKCBoYXNoX2NvZGUgPT0gVU5TRVRfSEFTSCApID8gInVuc2V0IiA6ICJ1bmtub3duIiwKLQkJCURGKCBzX3RyZWVfaGVpZ2h0ICksCi0JCQlERiggc19ibWFwX25yICksCi0JCQlERiggc192ZXJzaW9uICksCi0JCQlmbGFncywKLQkJCSggZmxhZ3MgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkICkKLQkJCT8gImF0dHJzX2NsZWFyZWQiIDogIiIsCi0JCQlERiAoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOworCXNlcV9wcmludGYobSwgImJsb2NrX2NvdW50OiBcdCVpXG4iCisJCSAgICJmcmVlX2Jsb2NrczogXHQlaVxuIgorCQkgICAicm9vdF9ibG9jazogXHQlaVxuIgorCQkgICAiYmxvY2tzaXplOiBcdCVpXG4iCisJCSAgICJvaWRfbWF4c2l6ZTogXHQlaVxuIgorCQkgICAib2lkX2N1cnNpemU6IFx0JWlcbiIKKwkJICAgInVtb3VudF9zdGF0ZTogXHQlaVxuIgorCQkgICAibWFnaWM6IFx0JTEwLjEwc1xuIgorCQkgICAiZnNfc3RhdGU6IFx0JWlcbiIKKwkJICAgImhhc2g6IFx0JXNcbiIKKwkJICAgInRyZWVfaGVpZ2h0OiBcdCVpXG4iCisJCSAgICJibWFwX25yOiBcdCVpXG4iCisJCSAgICJ2ZXJzaW9uOiBcdCVpXG4iCisJCSAgICJmbGFnczogXHQleFslc11cbiIKKwkJICAgInJlc2VydmVkX2Zvcl9qb3VybmFsOiBcdCVpXG4iLAorCQkgICBERkwoc19ibG9ja19jb3VudCksCisJCSAgIERGTChzX2ZyZWVfYmxvY2tzKSwKKwkJICAgREZMKHNfcm9vdF9ibG9jayksCisJCSAgIERGKHNfYmxvY2tzaXplKSwKKwkJICAgREYoc19vaWRfbWF4c2l6ZSksCisJCSAgIERGKHNfb2lkX2N1cnNpemUpLAorCQkgICBERihzX3Vtb3VudF9zdGF0ZSksCisJCSAgIHJzLT5zX3YxLnNfbWFnaWMsCisJCSAgIERGKHNfZnNfc3RhdGUpLAorCQkgICBoYXNoX2NvZGUgPT0gVEVBX0hBU0ggPyAidGVhIiA6CisJCSAgIChoYXNoX2NvZGUgPT0gWVVSQV9IQVNIKSA/ICJydXBhc292IiA6CisJCSAgIChoYXNoX2NvZGUgPT0gUjVfSEFTSCkgPyAicjUiIDoKKwkJICAgKGhhc2hfY29kZSA9PSBVTlNFVF9IQVNIKSA/ICJ1bnNldCIgOiAidW5rbm93biIsCisJCSAgIERGKHNfdHJlZV9oZWlnaHQpLAorCQkgICBERihzX2JtYXBfbnIpLAorCQkgICBERihzX3ZlcnNpb24pLCBmbGFncywgKGZsYWdzICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCkKKwkJICAgPyAiYXR0cnNfY2xlYXJlZCIgOiAiIiwgREYoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTEsMTMxICsyODAsMTIyIEBACiBzdGF0aWMgaW50IHNob3dfb2lkbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUoIHJzIC0+IHNfdjEuc19vaWRfY3Vyc2l6ZSApOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSBzYl9pbmZvLT5zX3JzOworCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUocnMtPnNfdjEuc19vaWRfY3Vyc2l6ZSk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF91c2VkID0gMDsKIAlpbnQgaTsKIAotCWZvciggaSA9IDAgOyBpIDwgbWFwc2l6ZSA7ICsraSApIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWFwc2l6ZTsgKytpKSB7CiAJCV9fdTMyIHJpZ2h0OwogCi0JCXJpZ2h0ID0gKCBpID09IG1hcHNpemUgLSAxICkgPyBNQVhfS0VZX09CSkVDVElEIDogTUFQKCBpICsgMSApOworCQlyaWdodCA9IChpID09IG1hcHNpemUgLSAxKSA/IE1BWF9LRVlfT0JKRUNUSUQgOiBNQVAoaSArIDEpOwogCQlzZXFfcHJpbnRmKG0sICIlczogWyAleCAuLiAleCApXG4iLAotCQkJCSggaSAmIDEgKSA/ICJmcmVlIiA6ICJ1c2VkIiwgTUFQKCBpICksIHJpZ2h0ICk7Ci0JCWlmKCAhICggaSAmIDEgKSApIHsKLQkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoIGkgKTsKKwkJCSAgIChpICYgMSkgPyAiZnJlZSIgOiAidXNlZCIsIE1BUChpKSwgcmlnaHQpOworCQlpZiAoIShpICYgMSkpIHsKKwkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoaSk7CiAJCX0KIAl9CiAjaWYgZGVmaW5lZCggUkVJU0VSRlNfVVNFX09JRE1BUEYgKQotCWlmKCBzYl9pbmZvIC0+IG9pZG1hcC51c2VfZmlsZSAmJiAoIHNiX2luZm8gLT4gb2lkbWFwLm1hcGYgIT0gTlVMTCApICkgeworCWlmIChzYl9pbmZvLT5vaWRtYXAudXNlX2ZpbGUgJiYgKHNiX2luZm8tPm9pZG1hcC5tYXBmICE9IE5VTEwpKSB7CiAJCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7Ci0JCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZiggcmVpc2VyZnNfb2lkaW50ZXJ2YWxfZF90ICk7CisJCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZihyZWlzZXJmc19vaWRpbnRlcnZhbF9kX3QpOwogCX0KICNlbmRpZgotCXNlcV9wcmludGYobSwgInRvdGFsOiBcdCVpIFslaS8laV0gdXNlZDogJWx1IFtleGFjdF1cbiIsIAotCQkJbWFwc2l6ZSwgCi0JCQltYXBzaXplLCBsZTE2X3RvX2NwdSggcnMgLT4gc192MS5zX29pZF9tYXhzaXplICksCi0JCQl0b3RhbF91c2VkKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbDogXHQlaSBbJWkvJWldIHVzZWQ6ICVsdSBbZXhhY3RdXG4iLAorCQkgICBtYXBzaXplLAorCQkgICBtYXBzaXplLCBsZTE2X3RvX2NwdShycy0+c192MS5zX29pZF9tYXhzaXplKSwgdG90YWxfdXNlZCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hvd19qb3VybmFsKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqciA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gciAtPiBzX3JzOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSByLT5zX3JzOwogCXN0cnVjdCBqb3VybmFsX3BhcmFtcyAqanAgPSAmcnMtPnNfdjEuc19qb3VybmFsOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLSAgICAKIAotCXNlcV9wcmludGYobSwJIC8qIG9uLWRpc2sgZmllbGRzICovCi0gCQkJImpwX2pvdXJuYWxfMXN0X2Jsb2NrOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgotIAkJCSJqcF9qb3VybmFsX3NpemU6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF90cmFuc19tYXg6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9iYXRjaDogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9jb21taXRfYWdlOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgotCQkJLyogaW5jb3JlIGZpZWxkcyAqLwotCQkJImpfMXN0X3Jlc2VydmVkX2Jsb2NrOiBcdCVpXG4iCSAgCi0JCQkial9zdGF0ZTogXHQlbGlcbiIJCQkKLQkJCSJqX3RyYW5zX2lkOiBcdCVsdVxuIgotCQkJImpfbW91bnRfaWQ6IFx0JWx1XG4iCi0JCQkial9zdGFydDogXHQlbHVcbiIKLQkJCSJqX2xlbjogXHQlbHVcbiIKLQkJCSJqX2xlbl9hbGxvYzogXHQlbHVcbiIKLQkJCSJqX3djb3VudDogXHQlaVxuIgotCQkJImpfYmNvdW50OiBcdCVsdVxuIgotCQkJImpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDogXHQlbHVcbiIKLQkJCSJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCi0JCQkial90cmFuc19zdGFydF90aW1lOiBcdCVsaVxuIgotCQkJImpfbGlzdF9iaXRtYXBfaW5kZXg6IFx0JWlcbiIKLQkJCSJqX211c3Rfd2FpdDogXHQlaVxuIgotCQkJImpfbmV4dF9mdWxsX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9uZXh0X2FzeW5jX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9jbm9kZV91c2VkOiBcdCVpXG4iCi0JCQkial9jbm9kZV9mcmVlOiBcdCVpXG4iCi0JCQkiXG4iCi0JCQkvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCi0JCQkiaW5fam91cm5hbDogXHQlMTJsdVxuIgotCQkJImluX2pvdXJuYWxfYml0bWFwOiBcdCUxMmx1XG4iCi0JCQkiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbDogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbF93YWl0OiBcdCUxMmx1XG4iCi0JCQkiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgotCQkJImpvdXJuYWxfcmVsb2NrX3dyaXRlcnM6IFx0JTEybHVcbiIKLQkJCSJqb3VybmFsX3JlbG9ja193Y291bnQ6IFx0JTEybHVcbiIKLQkJCSJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9hbHJlYWR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9ub3Rqb3VybmFsOiBcdCUxMmx1XG4iCi0JCQkicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgotCQkJInByZXBhcmU6IFx0JTEybHVcbiIKLQkJCSJwcmVwYXJlX3JldHJ5OiBcdCUxMmx1XG4iLAotCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfMXN0X2Jsb2NrICksCi0gICAgICAgICAgICAgICAgICAgICAgICBiZGV2bmFtZShTQl9KT1VSTkFMKHNiKS0+al9kZXZfYmQsIGIpLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX2RldiApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX3NpemUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF90cmFuc19tYXggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9tYWdpYyApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX21heF9iYXRjaCApLAotCQkJU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZSApLAotCi0JCQlKRiggal8xc3RfcmVzZXJ2ZWRfYmxvY2sgKSwJCQkKLQkJCUpGKCBqX3N0YXRlICksCQkJCi0JCQlKRiggal90cmFuc19pZCApLAotCQkJSkYoIGpfbW91bnRfaWQgKSwKLQkJCUpGKCBqX3N0YXJ0ICksCi0JCQlKRiggal9sZW4gKSwKLQkJCUpGKCBqX2xlbl9hbGxvYyApLAotCQkJYXRvbWljX3JlYWQoICYgciAtPiBzX2pvdXJuYWwgLT4gal93Y291bnQgKSwKLQkJCUpGKCBqX2Jjb3VudCApLAotCQkJSkYoIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCApLAotCQkJSkYoIGpfbGFzdF9mbHVzaF90cmFuc19pZCApLAotCQkJSkYoIGpfdHJhbnNfc3RhcnRfdGltZSApLAotCQkJSkYoIGpfbGlzdF9iaXRtYXBfaW5kZXggKSwKLQkJCUpGKCBqX211c3Rfd2FpdCApLAotCQkJSkYoIGpfbmV4dF9mdWxsX2ZsdXNoICksCi0JCQlKRiggal9uZXh0X2FzeW5jX2ZsdXNoICksCi0JCQlKRiggal9jbm9kZV91c2VkICksCi0JCQlKRiggal9jbm9kZV9mcmVlICksCi0KLQkJCVNGUEooIGluX2pvdXJuYWwgKSwKLQkJCVNGUEooIGluX2pvdXJuYWxfYml0bWFwICksCi0JCQlTRlBKKCBpbl9qb3VybmFsX3JldXNhYmxlICksCi0JCQlTRlBKKCBsb2NrX2pvdXJuYWwgKSwKLQkJCVNGUEooIGxvY2tfam91cm5hbF93YWl0ICksCi0JCQlTRlBKKCBqb3VybmFsX2JlaW5nICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193cml0ZXJzICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193Y291bnQgKSwKLQkJCVNGUEooIG1hcmtfZGlydHkgKSwKLQkJCVNGUEooIG1hcmtfZGlydHlfYWxyZWFkeSApLAotCQkJU0ZQSiggbWFya19kaXJ0eV9ub3Rqb3VybmFsICksCi0JCQlTRlBKKCByZXN0b3JlX3ByZXBhcmVkICksCi0JCQlTRlBKKCBwcmVwYXJlICksCi0JCQlTRlBKKCBwcmVwYXJlX3JldHJ5ICkKLQkJKTsKKwlzZXFfcHJpbnRmKG0sCQkvKiBvbi1kaXNrIGZpZWxkcyAqLworCQkgICAianBfam91cm5hbF8xc3RfYmxvY2s6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgorCQkgICAianBfam91cm5hbF9zaXplOiBcdCVpXG4iCisJCSAgICJqcF9qb3VybmFsX3RyYW5zX21heDogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYXhfYmF0Y2g6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgorCQkgICAvKiBpbmNvcmUgZmllbGRzICovCisJCSAgICJqXzFzdF9yZXNlcnZlZF9ibG9jazogXHQlaVxuIgorCQkgICAial9zdGF0ZTogXHQlbGlcbiIKKwkJICAgImpfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX21vdW50X2lkOiBcdCVsdVxuIgorCQkgICAial9zdGFydDogXHQlbHVcbiIKKwkJICAgImpfbGVuOiBcdCVsdVxuIgorCQkgICAial9sZW5fYWxsb2M6IFx0JWx1XG4iCisJCSAgICJqX3djb3VudDogXHQlaVxuIgorCQkgICAial9iY291bnQ6IFx0JWx1XG4iCisJCSAgICJqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ6IFx0JWx1XG4iCisJCSAgICJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX3RyYW5zX3N0YXJ0X3RpbWU6IFx0JWxpXG4iCisJCSAgICJqX2xpc3RfYml0bWFwX2luZGV4OiBcdCVpXG4iCisJCSAgICJqX211c3Rfd2FpdDogXHQlaVxuIgorCQkgICAial9uZXh0X2Z1bGxfZmx1c2g6IFx0JWlcbiIKKwkJICAgImpfbmV4dF9hc3luY19mbHVzaDogXHQlaVxuIgorCQkgICAial9jbm9kZV91c2VkOiBcdCVpXG4iICJqX2Nub2RlX2ZyZWU6IFx0JWlcbiIgIlxuIgorCQkgICAvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCisJCSAgICJpbl9qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJpbl9qb3VybmFsX2JpdG1hcDogXHQlMTJsdVxuIgorCQkgICAiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgorCQkgICAibG9ja19qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJsb2NrX2pvdXJuYWxfd2FpdDogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd3JpdGVyczogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd2NvdW50OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5X2FscmVhZHk6IFx0JTEybHVcbiIKKwkJICAgIm1hcmtfZGlydHlfbm90am91cm5hbDogXHQlMTJsdVxuIgorCQkgICAicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZTogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZV9yZXRyeTogXHQlMTJsdVxuIiwKKwkJICAgREpQKGpwX2pvdXJuYWxfMXN0X2Jsb2NrKSwKKwkJICAgYmRldm5hbWUoU0JfSk9VUk5BTChzYiktPmpfZGV2X2JkLCBiKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfZGV2KSwKKwkJICAgREpQKGpwX2pvdXJuYWxfc2l6ZSksCisJCSAgIERKUChqcF9qb3VybmFsX3RyYW5zX21heCksCisJCSAgIERKUChqcF9qb3VybmFsX21hZ2ljKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfbWF4X2JhdGNoKSwKKwkJICAgU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCisJCSAgIERKUChqcF9qb3VybmFsX21heF90cmFuc19hZ2UpLAorCQkgICBKRihqXzFzdF9yZXNlcnZlZF9ibG9jayksCisJCSAgIEpGKGpfc3RhdGUpLAorCQkgICBKRihqX3RyYW5zX2lkKSwKKwkJICAgSkYoal9tb3VudF9pZCksCisJCSAgIEpGKGpfc3RhcnQpLAorCQkgICBKRihqX2xlbiksCisJCSAgIEpGKGpfbGVuX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnItPnNfam91cm5hbC0+al93Y291bnQpLAorCQkgICBKRihqX2Jjb3VudCksCisJCSAgIEpGKGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCksCisJCSAgIEpGKGpfbGFzdF9mbHVzaF90cmFuc19pZCksCisJCSAgIEpGKGpfdHJhbnNfc3RhcnRfdGltZSksCisJCSAgIEpGKGpfbGlzdF9iaXRtYXBfaW5kZXgpLAorCQkgICBKRihqX211c3Rfd2FpdCksCisJCSAgIEpGKGpfbmV4dF9mdWxsX2ZsdXNoKSwKKwkJICAgSkYoal9uZXh0X2FzeW5jX2ZsdXNoKSwKKwkJICAgSkYoal9jbm9kZV91c2VkKSwKKwkJICAgSkYoal9jbm9kZV9mcmVlKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsX2JpdG1hcCksCisJCSAgIFNGUEooaW5fam91cm5hbF9yZXVzYWJsZSksCisJCSAgIFNGUEoobG9ja19qb3VybmFsKSwKKwkJICAgU0ZQSihsb2NrX2pvdXJuYWxfd2FpdCksCisJCSAgIFNGUEooam91cm5hbF9iZWluZyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd3JpdGVycyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd2NvdW50KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5X2FscmVhZHkpLAorCQkgICBTRlBKKG1hcmtfZGlydHlfbm90am91cm5hbCksCisJCSAgIFNGUEoocmVzdG9yZV9wcmVwYXJlZCksIFNGUEoocHJlcGFyZSksIFNGUEoocHJlcGFyZV9yZXRyeSkKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUwLDcgKzQxMCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqIHBvcykKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZS0+cGFyZW50LT5kYXRhOwpAQCAtNDcyLDcgKzQzMiw3IEBACiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3N0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKiBwb3MpCiB7CiAJKysqcG9zOwogCWlmICh2KQpAQCAtNDg5LDcgKzQ0OSw3IEBACiBzdGF0aWMgaW50IHJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IG0tPnByaXZhdGU7Ci0JaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSA9IGRlLT5kYXRhOworCWludCAoKnNob3cpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopID0gZGUtPmRhdGE7CiAJcmV0dXJuIHNob3cobSwgdik7CiB9CiAKQEAgLTUxMiwxNyArNDcyLDE3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJfZmlsZV9vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHJfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorCS5vcGVuID0gcl9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvX3Jvb3QgPSBOVUxMOwogc3RhdGljIGNvbnN0IGNoYXIgcHJvY19pbmZvX3Jvb3RfbmFtZVtdID0gImZzL3JlaXNlcmZzIjsKIAogc3RhdGljIHZvaWQgYWRkX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqbmFtZSwKLQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQorCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7CiAJZGUgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCAwLCBSRUlTRVJGU19TQihzYiktPnByb2NkaXIpOwpAQCAtNTMyLDExICs0OTIsMTIgQEAKIAl9CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzcGluX2xvY2tfaW5pdCggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPSBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIHByb2NfaW5mb19yb290KTsKLQlpZiggUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyICkgeworCXNwaW5fbG9ja19pbml0KCZfX1BJTkZPKHNiKS5sb2NrKTsKKwlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPQorCSAgICBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgcHJvY19pbmZvX3Jvb3QpOworCWlmIChSRUlTRVJGU19TQihzYiktPnByb2NkaXIpIHsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwogCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXItPmRhdGEgPSBzYjsKIAkJYWRkX2ZpbGUoc2IsICJ2ZXJzaW9uIiwgc2hvd192ZXJzaW9uKTsKQEAgLTU0OSwxMSArNTEwLDExIEBACiAJCXJldHVybiAwOwogCX0KIAlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMvJXMiLAotCQkJIHByb2NfaW5mb19yb290X25hbWUsIHJlaXNlcmZzX2JkZXZuYW1lIChzYikgKTsKKwkJCSBwcm9jX2luZm9fcm9vdF9uYW1lLCByZWlzZXJmc19iZGV2bmFtZShzYikpOwogCXJldHVybiAxOwogfQogCi1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFJFSVNFUkZTX1NCKHNiKS0+cHJvY2RpcjsKIAlpZiAoZGUpIHsKQEAgLTU2NSw0OCArNTI2LDQ4IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdXBlciIsIGRlKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcnNpb24iLCBkZSk7CiAJfQotCXNwaW5fbG9jayggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlfX1BJTkZPKCBzYiApLmV4aXRpbmcgPSAxOwotCXNwaW5fdW5sb2NrKCAmIF9fUElORk8oIHNiICkubG9jayApOwotCWlmICggcHJvY19pbmZvX3Jvb3QgKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBwcm9jX2luZm9fcm9vdCApOworCXNwaW5fbG9jaygmX19QSU5GTyhzYikubG9jayk7CisJX19QSU5GTyhzYikuZXhpdGluZyA9IDE7CisJc3Bpbl91bmxvY2soJl9fUElORk8oc2IpLmxvY2spOworCWlmIChwcm9jX2luZm9fcm9vdCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShyZWlzZXJmc19iZGV2bmFtZShzYiksIHByb2NfaW5mb19yb290KTsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoIGNoYXIgKm5hbWUsIAotCQkJCQkJICAgICAgcmVhZF9wcm9jX3QgKmZ1bmMgKQorc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbChjaGFyICpuYW1lLAorCQkJCQkJICAgICByZWFkX3Byb2NfdCAqIGZ1bmMpCiB7Ci0JcmV0dXJuICggcHJvY19pbmZvX3Jvb3QgKSA/IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIG5hbWUsIDAsIAotCQkJCQkJCSAgICBwcm9jX2luZm9fcm9vdCwgCi0JCQkJCQkJICAgIGZ1bmMsIE5VTEwgKSA6IE5VTEw7CisJcmV0dXJuIChwcm9jX2luZm9fcm9vdCkgPyBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIDAsCisJCQkJCQkJIHByb2NfaW5mb19yb290LAorCQkJCQkJCSBmdW5jLCBOVUxMKSA6IE5VTEw7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApCit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeSggbmFtZSwgcHJvY19pbmZvX3Jvb3QgKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBwcm9jX2luZm9fcm9vdCk7CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQogewotCWlmKCBwcm9jX2luZm9fcm9vdCA9PSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCA9PSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gcHJvY19ta2Rpcihwcm9jX2luZm9fcm9vdF9uYW1lLCBOVUxMKTsKLQkJaWYoIHByb2NfaW5mb19yb290ICkgewotCQkJcHJvY19pbmZvX3Jvb3QgLT4gb3duZXIgPSBUSElTX01PRFVMRTsKKwkJaWYgKHByb2NfaW5mb19yb290KSB7CisJCQlwcm9jX2luZm9fcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJfSBlbHNlIHsKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsCi0JCQkJCSAgInJlaXNlcmZzOiBjYW5ub3QgY3JlYXRlIC9wcm9jLyVzIiwKLQkJCQkJICBwcm9jX2luZm9fcm9vdF9uYW1lICk7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMiLAorCQkJCQkgcHJvY19pbmZvX3Jvb3RfbmFtZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSggdm9pZCApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKHZvaWQpCiB7Ci0JaWYgKCBwcm9jX2luZm9fcm9vdCAhPSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCAhPSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gTlVMTDsKIAkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19pbmZvX3Jvb3RfbmFtZSwgTlVMTCk7CiAJfQpAQCAtNjE2LDIyICs1NzcsNDAgQEAKIC8qIFJFSVNFUkZTX1BST0NfSU5GTyAqLwogI2Vsc2UKIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMDsKK30KIAotc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCi0JCQkJCQkgICAgICByZWFkX3Byb2NfdCAqZnVuYyApCi17IHJldHVybiBOVUxMOyB9CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKGNoYXIgKm5hbWUsCisJCQkJCQkgICAgIHJlYWRfcHJvY190ICogZnVuYykKK3sKKwlyZXR1cm4gTlVMTDsKK30KIAotdm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKCBjb25zdCBjaGFyICpuYW1lICkgezt9Cit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKK3s7Cit9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKSB7IHJldHVybiAwOyB9Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSh2b2lkKQoreworCXJldHVybiAwOworfQogCi1pbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIAotCQkJCSAgICAgb2ZmX3Qgb2Zmc2V0LAotCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCi17IHJldHVybiAwOyB9CitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJCQkgICAgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQogCiAvKiBSRUlTRVJGU19QUk9DX0lORk8gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcmVzaXplLmMgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwppbmRleCAxNzAwMTIwLi4zOWNjN2Y0IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9yZXNpemUuYworKysgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIAogICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKICAqLwotIAorCiAvKiAKICAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFphcm9jaGVudGNldi4KICAqCkBAIC0xNywyMyArMTcsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKLWludCByZWlzZXJmc19yZXNpemUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQoraW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQogewotICAgICAgICBpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBzYjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaXRtYXA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmJpdG1hcDsKIAlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKm9sZF9iaXRtYXAgPSBTQl9BUF9CSVRNQVAocyk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwogCXVuc2lnbmVkIGludCBibWFwX25yX25ldywgYm1hcF9ucjsKIAl1bnNpZ25lZCBpbnQgYmxvY2tfcl9uZXcsIGJsb2NrX3I7Ci0JCi0Jc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICogamI7CisKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOwogCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCBqYml0bWFwW0pPVVJOQUxfTlVNX0JJVE1BUFNdOwotCQorCiAJdW5zaWduZWQgbG9uZyBpbnQgYmxvY2tfY291bnQsIGZyZWVfYmxvY2tzOwogCWludCBpOwotCWludCBjb3B5X3NpemUgOworCWludCBjb3B5X3NpemU7CiAKIAlzYiA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CiAKQEAgLTQ3LDEzNiArNDcsMTQ1IEBACiAJaWYgKCFiaCkgewogCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogY2FuXCd0IHJlYWQgbGFzdCBibG9ja1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwotCX0JCisJfQogCWJmb3JnZXQoYmgpOwogCiAJLyogb2xkIGRpc2sgbGF5b3V0IGRldGVjdGlvbjsgdGhvc2UgcGFydGl0aW9ucyBjYW4gYmUgbW91bnRlZCwgYnV0CiAJICogY2Fubm90IGJlIHJlc2l6ZWQgKi8KLQlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocyktPmJfYmxvY2tuciAqCVNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX3NpemUgCi0JCSE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICkgewotCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIHJlc2l6ZSBhIHJlaXNlcmZzIHdpdGhvdXQgZGlzdHJpYnV0ZWQgYml0bWFwIChmcyB2ZXJzaW9uIDwgMy41LjEyKVxuIik7CisJaWYgKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2Jsb2NrbnIgKiBTQl9CVUZGRVJfV0lUSF9TQihzKS0+Yl9zaXplCisJICAgICE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSB7CisJCXByaW50aworCQkgICAgKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byByZXNpemUgYSByZWlzZXJmcyB3aXRob3V0IGRpc3RyaWJ1dGVkIGJpdG1hcCAoZnMgdmVyc2lvbiA8IDMuNS4xMilcbiIpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KLSAgICAgICAKKwogCS8qIGNvdW50IHVzZWQgYml0cyBpbiBsYXN0IGJpdG1hcCBibG9jayAqLwotCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtCi0JICAgICAgICAoU0JfQk1BUF9OUihzKSAtIDEpICogcy0+c19ibG9ja3NpemUgKiA4OwotCQorCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtIChTQl9CTUFQX05SKHMpIC0gMSkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7CisKIAkvKiBjb3VudCBiaXRtYXAgYmxvY2tzIGluIG5ldyBmcyAqLwotCWJtYXBfbnJfbmV3ID0gYmxvY2tfY291bnRfbmV3IC8gKCBzLT5zX2Jsb2Nrc2l6ZSAqIDggKTsKKwlibWFwX25yX25ldyA9IGJsb2NrX2NvdW50X25ldyAvIChzLT5zX2Jsb2Nrc2l6ZSAqIDgpOwogCWJsb2NrX3JfbmV3ID0gYmxvY2tfY291bnRfbmV3IC0gYm1hcF9ucl9uZXcgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7Ci0JaWYgKGJsb2NrX3JfbmV3KSAKKwlpZiAoYmxvY2tfcl9uZXcpCiAJCWJtYXBfbnJfbmV3Kys7CiAJZWxzZQogCQlibG9ja19yX25ldyA9IHMtPnNfYmxvY2tzaXplICogODsKIAogCS8qIHNhdmUgb2xkIHZhbHVlcyAqLwogCWJsb2NrX2NvdW50ID0gU0JfQkxPQ0tfQ09VTlQocyk7Ci0JYm1hcF9uciAgICAgPSBTQl9CTUFQX05SKHMpOworCWJtYXBfbnIgPSBTQl9CTUFQX05SKHMpOwogCiAJLyogcmVzaXppbmcgb2YgcmVpc2VyZnMgYml0bWFwcyAoam91cm5hbCBhbmQgcmVhbCksIGlmIG5lZWRlZCAqLwotCWlmIChibWFwX25yX25ldyA+IGJtYXBfbnIpIHsJICAgIAotCSAgICAvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLwotCSAgICBpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGpvdXJuYWwgYml0bWFwc1xuIik7Ci0JCXVubG9ja19zdXBlcihzKSA7Ci0JCXJldHVybiAtRU5PTUVNIDsKLQkgICAgfQotCSAgICAvKiB0aGUgbmV3IGpvdXJuYWwgYml0bWFwcyBhcmUgemVybyBmaWxsZWQsIG5vdyB3ZSBjb3B5IGluIHRoZSBiaXRtYXAKLQkgICAgKiogbm9kZSBwb2ludGVycyBmcm9tIHRoZSBvbGQgam91cm5hbCBiaXRtYXAgc3RydWN0cywgYW5kIHRoZW4KLQkgICAgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCi0JICAgICoqCi0JICAgICoqIHVzaW5nIHRoZSBjb3B5X3NpemUgdmFyIGJlbG93IGFsbG93cyB0aGlzIGNvZGUgdG8gd29yayBmb3IKLQkgICAgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCi0JICAgICovCi0JICAgIGNvcHlfc2l6ZSA9IGJtYXBfbnJfbmV3IDwgYm1hcF9uciA/IGJtYXBfbnJfbmV3IDogYm1hcF9uciA7Ci0JICAgIGNvcHlfc2l6ZSA9IGNvcHlfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXBfbm9kZSAqKSA7Ci0JICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgewotCQlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipub2RlX3RtcCA7Ci0JCWpiID0gU0JfSk9VUk5BTChzKS0+al9saXN0X2JpdG1hcCArIGkgOwotCQltZW1jcHkoamJpdG1hcFtpXS5iaXRtYXBzLCBqYi0+Yml0bWFwcywgY29weV9zaXplKSA7CisJaWYgKGJtYXBfbnJfbmV3ID4gYm1hcF9ucikgeworCQkvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLworCQlpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKKwkJCXByaW50aworCQkJICAgICgicmVpc2VyZnNfcmVzaXplOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsIGJpdG1hcHNcbiIpOworCQkJdW5sb2NrX3N1cGVyKHMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogdGhlIG5ldyBqb3VybmFsIGJpdG1hcHMgYXJlIHplcm8gZmlsbGVkLCBub3cgd2UgY29weSBpbiB0aGUgYml0bWFwCisJCSAqKiBub2RlIHBvaW50ZXJzIGZyb20gdGhlIG9sZCBqb3VybmFsIGJpdG1hcCBzdHJ1Y3RzLCBhbmQgdGhlbgorCQkgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCisJCSAqKgorCQkgKiogdXNpbmcgdGhlIGNvcHlfc2l6ZSB2YXIgYmVsb3cgYWxsb3dzIHRoaXMgY29kZSB0byB3b3JrIGZvcgorCQkgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCisJCSAqLworCQljb3B5X3NpemUgPSBibWFwX25yX25ldyA8IGJtYXBfbnIgPyBibWFwX25yX25ldyA6IGJtYXBfbnI7CisJCWNvcHlfc2l6ZSA9CisJCSAgICBjb3B5X3NpemUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwX25vZGUgKik7CisJCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKm5vZGVfdG1wOworCQkJamIgPSBTQl9KT1VSTkFMKHMpLT5qX2xpc3RfYml0bWFwICsgaTsKKwkJCW1lbWNweShqYml0bWFwW2ldLmJpdG1hcHMsIGpiLT5iaXRtYXBzLCBjb3B5X3NpemUpOwogCi0JCS8qIGp1c3QgaW4gY2FzZSB2ZnJlZSBzY2hlZHVsZXMgb24gdXMsIGNvcHkgdGhlIG5ldwotCQkqKiBwb2ludGVyIGludG8gdGhlIGpvdXJuYWwgc3RydWN0IGJlZm9yZSBmcmVlaW5nIHRoZSAKLQkJKiogb2xkIG9uZQotCQkqLwotCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzIDsKLQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHMgOwotCQl2ZnJlZShub2RlX3RtcCkgOwotCSAgICB9CQotCQotCSAgICAvKiBhbGxvY2F0ZSBhZGRpdGlvbmFsIGJpdG1hcCBibG9ja3MsIHJlYWxsb2NhdGUgYXJyYXkgb2YgYml0bWFwCi0JICAgICAqIGJsb2NrIHBvaW50ZXJzICovCi0JICAgIGJpdG1hcCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7Ci0JICAgIGlmICghYml0bWFwKSB7Ci0JCS8qIEpvdXJuYWwgYml0bWFwcyBhcmUgc3RpbGwgc3VwZXJzaXplZCwgYnV0IHRoZSBtZW1vcnkgaXNuJ3QKLQkJICogbGVha2VkLCBzbyBJIGd1ZXNzIGl0J3Mgb2sgKi8KLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JICAgIH0KLQkgICAgbWVtc2V0IChiaXRtYXAsIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQotCQliaXRtYXBbaV0gPSBvbGRfYml0bWFwW2ldOworCQkJLyoganVzdCBpbiBjYXNlIHZmcmVlIHNjaGVkdWxlcyBvbiB1cywgY29weSB0aGUgbmV3CisJCQkgKiogcG9pbnRlciBpbnRvIHRoZSBqb3VybmFsIHN0cnVjdCBiZWZvcmUgZnJlZWluZyB0aGUgCisJCQkgKiogb2xkIG9uZQorCQkJICovCisJCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzOworCQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHM7CisJCQl2ZnJlZShub2RlX3RtcCk7CisJCX0KIAotCSAgICAvKiBUaGlzIGRvZXNuJ3QgZ28gdGhyb3VnaCB0aGUgam91cm5hbCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0by4KLQkgICAgICogVGhlIGNoYW5nZXMgYXJlIHN0aWxsIGF0b21pYzogV2UncmUgc3luY2VkIHVwIHdoZW4gdGhlIGpvdXJuYWwKLQkgICAgICogdHJhbnNhY3Rpb24gYmVnaW5zLCBhbmQgdGhlIG5ldyBiaXRtYXBzIGRvbid0IG1hdHRlciBpZiB0aGUKLQkgICAgICogdHJhbnNhY3Rpb24gZmFpbHMuICovCi0JICAgIGZvciAoaSA9IGJtYXBfbnI7IGkgPCBibWFwX25yX25ldzsgaSsrKSB7Ci0JCWJpdG1hcFtpXS5iaCA9IHNiX2dldGJsayhzLCBpICogcy0+c19ibG9ja3NpemUgKiA4KTsKLQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKLQkJcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCgwLCBiaXRtYXBbaV0uYmgtPmJfZGF0YSk7CisJCS8qIGFsbG9jYXRlIGFkZGl0aW9uYWwgYml0bWFwIGJsb2NrcywgcmVhbGxvY2F0ZSBhcnJheSBvZiBiaXRtYXAKKwkJICogYmxvY2sgcG9pbnRlcnMgKi8KKwkJYml0bWFwID0KKwkJICAgIHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7CisJCWlmICghYml0bWFwKSB7CisJCQkvKiBKb3VybmFsIGJpdG1hcHMgYXJlIHN0aWxsIHN1cGVyc2l6ZWQsIGJ1dCB0aGUgbWVtb3J5IGlzbid0CisJCQkgKiBsZWFrZWQsIHNvIEkgZ3Vlc3MgaXQncyBvayAqLworCQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChiaXRtYXAsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCQlmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQorCQkJYml0bWFwW2ldID0gb2xkX2JpdG1hcFtpXTsKIAotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJpdG1hcFtpXS5iaCkgOwotCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBbaV0uYmgpOwotCQkvLyB1cGRhdGUgYml0bWFwX2luZm8gc3R1ZmYKLQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludD0xOwotCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKLQkgICAgfQkKLQkgICAgLyogZnJlZSBvbGQgYml0bWFwIGJsb2NrcyBhcnJheSAqLwotCSAgICBTQl9BUF9CSVRNQVAocykgPSBiaXRtYXA7Ci0JICAgIHZmcmVlIChvbGRfYml0bWFwKTsKKwkJLyogVGhpcyBkb2Vzbid0IGdvIHRocm91Z2ggdGhlIGpvdXJuYWwsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8uCisJCSAqIFRoZSBjaGFuZ2VzIGFyZSBzdGlsbCBhdG9taWM6IFdlJ3JlIHN5bmNlZCB1cCB3aGVuIHRoZSBqb3VybmFsCisJCSAqIHRyYW5zYWN0aW9uIGJlZ2lucywgYW5kIHRoZSBuZXcgYml0bWFwcyBkb24ndCBtYXR0ZXIgaWYgdGhlCisJCSAqIHRyYW5zYWN0aW9uIGZhaWxzLiAqLworCQlmb3IgKGkgPSBibWFwX25yOyBpIDwgYm1hcF9ucl9uZXc7IGkrKykgeworCQkJYml0bWFwW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDgpOworCQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKKwkJCXJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoMCwgYml0bWFwW2ldLmJoLT5iX2RhdGEpOworCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBbaV0uYmgpOworCQkJc3luY19kaXJ0eV9idWZmZXIoYml0bWFwW2ldLmJoKTsKKwkJCS8vIHVwZGF0ZSBiaXRtYXBfaW5mbyBzdHVmZgorCQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludCA9IDE7CisJCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKKwkJfQorCQkvKiBmcmVlIG9sZCBiaXRtYXAgYmxvY2tzIGFycmF5ICovCisJCVNCX0FQX0JJVE1BUChzKSA9IGJpdG1hcDsKKwkJdmZyZWUob2xkX2JpdG1hcCk7CiAJfQotCQorCiAJLyogYmVnaW4gdHJhbnNhY3Rpb24sIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgaXQncyBmaW5lLiBZZXMsIHdlIGhhdmUKIAkgKiBpbmNvcnJlY3QgYml0bWFwcyBub3csIGJ1dCBub25lIG9mIGl0IGlzIGV2ZXIgZ29pbmcgdG8gdG91Y2ggdGhlCiAJICogZGlzayBhbnl3YXkuICovCiAJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKTsKIAlpZiAoZXJyKQotCSAgICByZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCiAJLyogY29ycmVjdCBsYXN0IGJpdG1hcCBibG9ja3MgaW4gb2xkIGFuZCBuZXcgZGlzayBsYXlvdXQgKi8KIAlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3I7IGkgPCBzLT5zX2Jsb2Nrc2l6ZSAqIDg7IGkrKykKLQkgICAgcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0KGksIAotCQkJCQkgICBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQoaSwKKwkJCQkJICAgICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0KKwkJCQkJCQkgICAgICAgMV0uYmgtPmJfZGF0YSk7CiAJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5mcmVlX2NvdW50ICs9IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3I7Ci0JaWYgKCAhU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5maXJzdF96ZXJvX2hpbnQpCi0JICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50ID0gYmxvY2tfcjsKKwlpZiAoIVNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmZpcnN0X3plcm9faGludCA9IGJsb2NrX3I7CiAKIAlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoKTsKIAogCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3JfbmV3OyBpIDwgcy0+c19ibG9ja3NpemUgKiA4OyBpKyspCi0JICAgIHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoaSwKLQkJCQkJIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0KGksCisJCQkJCSAgICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0KKwkJCQkJCQkgICAgIDFdLmJoLT5iX2RhdGEpOwogCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoKTsKLSAKLQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50IC09IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3JfbmV3OworCisJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uZnJlZV9jb3VudCAtPQorCSAgICBzLT5zX2Jsb2Nrc2l6ZSAqIDggLSBibG9ja19yX25ldzsKIAkvKiBFeHRyZW1lIGNhc2Ugd2hlcmUgbGFzdCBiaXRtYXAgaXMgdGhlIG9ubHkgdmFsaWQgYmxvY2sgaW4gaXRzZWxmLiAqLwotCWlmICggIVNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmZyZWVfY291bnQgKQotCSAgICBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOwotIAkvKiB1cGRhdGUgc3VwZXIgKi8KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisJaWYgKCFTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOworCS8qIHVwZGF0ZSBzdXBlciAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwogCWZyZWVfYmxvY2tzID0gU0JfRlJFRV9CTE9DS1Mocyk7Ci0JUFVUX1NCX0ZSRUVfQkxPQ0tTKHMsIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0gKGJtYXBfbnJfbmV3IC0gYm1hcF9ucikpKTsKKwlQVVRfU0JfRlJFRV9CTE9DS1MocywKKwkJCSAgIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0KKwkJCQkJICAoYm1hcF9ucl9uZXcgLSBibWFwX25yKSkpOwogCVBVVF9TQl9CTE9DS19DT1VOVChzLCBibG9ja19jb3VudF9uZXcpOwogCVBVVF9TQl9CTUFQX05SKHMsIGJtYXBfbnJfbmV3KTsKIAlzLT5zX2RpcnQgPSAxOwogCiAJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwotCQorCiAJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOwogCXJldHVybiBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMgYi9mcy9yZWlzZXJmcy9zdHJlZS5jCmluZGV4IDYzMTU4NDkuLmUyZDA4ZDcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMKKysrIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpAQCAtNTksNDYgKzU5LDQ1IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogLyogRG9lcyB0aGUgYnVmZmVyIGNvbnRhaW4gYSBkaXNrIGJsb2NrIHdoaWNoIGlzIGluIHRoZSB0cmVlLiAqLwotaW5saW5lIGludCBCX0lTX0lOX1RSRUUgKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCkKK2lubGluZSBpbnQgQl9JU19JTl9UUkVFKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKQogewogCi0gIFJGQUxTRSggQl9MRVZFTCAocF9zX2JoKSA+IE1BWF9IRUlHSFQsCi0JICAiUEFQLTEwMTA6IGJsb2NrICglYikgaGFzIHRvbyBiaWcgbGV2ZWwgKCV6KSIsIHBfc19iaCwgcF9zX2JoKTsKKwlSRkFMU0UoQl9MRVZFTChwX3NfYmgpID4gTUFYX0hFSUdIVCwKKwkgICAgICAgIlBBUC0xMDEwOiBibG9jayAoJWIpIGhhcyB0b28gYmlnIGxldmVsICgleikiLCBwX3NfYmgsIHBfc19iaCk7CiAKLSAgcmV0dXJuICggQl9MRVZFTCAocF9zX2JoKSAhPSBGUkVFX0xFVkVMICk7CisJcmV0dXJuIChCX0xFVkVMKHBfc19iaCkgIT0gRlJFRV9MRVZFTCk7CiB9CiAKIC8vCiAvLyB0byBnZXRzIGl0ZW0gaGVhZCBpbiBsZSBmb3JtCiAvLwotaW5saW5lIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqIHBfdl90bywgCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogcF92X2Zyb20pCitpbmxpbmUgdm9pZCBjb3B5X2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfdG8sCisJCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfZnJvbSkKIHsKLSAgbWVtY3B5IChwX3ZfdG8sIHBfdl9mcm9tLCBJSF9TSVpFKTsKKwltZW1jcHkocF92X3RvLCBwX3ZfZnJvbSwgSUhfU0laRSk7CiB9CiAKLQogLyogazEgaXMgcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSB3aGljaCBpcyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbgogICAgZm9ybS4gazIgaXMgcG9pbnRlciB0byBjcHUgdmFyaWFibGUuIEZvciBrZXkgb2YgaXRlbXMgb2YgdGhlIHNhbWUKICAgIG9iamVjdCB0aGlzIHJldHVybnMgMC4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIAogICAgMCBpZiBrZXkxID09IGtleTIKICAgIDEgaWYga2V5MSA+IGtleTIgKi8KLWlubGluZSBpbnQgIGNvbXBfc2hvcnRfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KQoraW5saW5lIGludCBjb21wX3Nob3J0X2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqbGVfa2V5LAorCQkJICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIF9fdTMyIG47Ci0gIG4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfZGlyX2lkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAtMTsKLSAgaWYgKG4gPiBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAxOwotICBuID0gbGUzMl90b19jcHUobGVfa2V5LT5rX29iamVjdGlkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQotICAgICAgcmV0dXJuIC0xOwotICBpZiAobiA+IGNwdV9rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7CisJX191MzIgbjsKKwluID0gbGUzMl90b19jcHUobGVfa2V5LT5rX2Rpcl9pZCk7CisJaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19kaXJfaWQpCisJCXJldHVybiAxOworCW4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpOworCWlmIChuIDwgY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGsxIGlzIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KQEAgLTEwNiw2OCArMTA1LDcyIEBACiAgICBDb21wYXJlIGtleXMgdXNpbmcgYWxsIDQga2V5IGZpZWxkcy4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIDAKICAgIGlmIGtleTEgPSBrZXkyIDEgaWYga2V5MSA+IGtleTIgKi8KLXN0YXRpYyBpbmxpbmUgaW50ICBjb21wX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBsZV9rZXksIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSkKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXksCisJCQkgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIGludCByZXR2YWw7CisJaW50IHJldHZhbDsKIAotICByZXR2YWwgPSBjb21wX3Nob3J0X2tleXMgKGxlX2tleSwgY3B1X2tleSk7Ci0gIGlmIChyZXR2YWwpCi0gICAgICByZXR1cm4gcmV0dmFsOwotICBpZiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwgY3B1X2tleV9rX29mZnNldCAoY3B1X2tleSkpCi0gICAgICByZXR1cm4gLTE7Ci0gIGlmIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPiBjcHVfa2V5X2tfb2Zmc2V0IChjcHVfa2V5KSkKLSAgICAgIHJldHVybiAxOworCXJldHZhbCA9IGNvbXBfc2hvcnRfa2V5cyhsZV9rZXksIGNwdV9rZXkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGxlX2tleV9rX29mZnNldChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwKKwkgICAgY3B1X2tleV9rX29mZnNldChjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOworCWlmIChsZV9rZXlfa19vZmZzZXQobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA+CisJICAgIGNwdV9rZXlfa19vZmZzZXQoY3B1X2tleSkpCisJCXJldHVybiAxOwogCi0gIGlmIChjcHVfa2V5LT5rZXlfbGVuZ3RoID09IDMpCi0gICAgICByZXR1cm4gMDsKKwlpZiAoY3B1X2tleS0+a2V5X2xlbmd0aCA9PSAzKQorCQlyZXR1cm4gMDsKIAotICAvKiB0aGlzIHBhcnQgaXMgbmVlZGVkIG9ubHkgd2hlbiB0YWlsIGNvbnZlcnNpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgaWYgKGxlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPCBjcHVfa2V5X2tfdHlwZSAoY3B1X2tleSkpCi0gICAgcmV0dXJuIC0xOworCS8qIHRoaXMgcGFydCBpcyBuZWVkZWQgb25seSB3aGVuIHRhaWwgY29udmVyc2lvbiBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPAorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOwogCi0gIGlmIChsZV9rZXlfa190eXBlIChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpID4gY3B1X2tleV9rX3R5cGUgKGNwdV9rZXkpKQotICAgIHJldHVybiAxOworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPgorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIDE7CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotaW5saW5lIGludCBjb21wX3Nob3J0X2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkxLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5MikKK2lubGluZSBpbnQgY29tcF9zaG9ydF9sZV9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleTEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkyKQogewotICBfX3UzMiAqIHBfc18xX3UzMiwgKiBwX3NfMl91MzI7Ci0gIGludCBuX2tleV9sZW5ndGggPSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOOworCV9fdTMyICpwX3NfMV91MzIsICpwX3NfMl91MzI7CisJaW50IG5fa2V5X2xlbmd0aCA9IFJFSVNFUkZTX1NIT1JUX0tFWV9MRU47CiAKLSAgcF9zXzFfdTMyID0gKF9fdTMyICopa2V5MTsKLSAgcF9zXzJfdTMyID0gKF9fdTMyICopa2V5MjsKLSAgZm9yKCA7IG5fa2V5X2xlbmd0aC0tOyArK3Bfc18xX3UzMiwgKytwX3NfMl91MzIgKSB7Ci0gICAgaWYgKCBsZTMyX3RvX2NwdSAoKnBfc18xX3UzMikgPCBsZTMyX3RvX2NwdSAoKnBfc18yX3UzMikgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmICggbGUzMl90b19jcHUgKCpwX3NfMV91MzIpID4gbGUzMl90b19jcHUgKCpwX3NfMl91MzIpICkKLSAgICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworCXBfc18xX3UzMiA9IChfX3UzMiAqKSBrZXkxOworCXBfc18yX3UzMiA9IChfX3UzMiAqKSBrZXkyOworCWZvciAoOyBuX2tleV9sZW5ndGgtLTsgKytwX3NfMV91MzIsICsrcF9zXzJfdTMyKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqcF9zXzFfdTMyKSA8IGxlMzJfdG9fY3B1KCpwX3NfMl91MzIpKQorCQkJcmV0dXJuIC0xOworCQlpZiAobGUzMl90b19jcHUoKnBfc18xX3UzMikgPiBsZTMyX3RvX2NwdSgqcF9zXzJfdTMyKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAotaW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBmcm9tKQoraW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkoc3RydWN0IGNwdV9rZXkgKnRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKQogewotICAgIGludCB2ZXJzaW9uOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1IChmcm9tLT5rX2Rpcl9pZCk7Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+a19vYmplY3RpZCk7Ci0gICAgCi0gICAgLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5Ci0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChmcm9tKTsKLSAgICB0by0+dmVyc2lvbiA9IHZlcnNpb247Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGZyb20pOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX3R5cGUgPSBsZV9rZXlfa190eXBlKHZlcnNpb24sIGZyb20pOworCWludCB2ZXJzaW9uOworCXRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfZGlyX2lkKTsKKwl0by0+b25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfb2JqZWN0aWQpOworCisJLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGZyb20pOworCXRvLT52ZXJzaW9uID0gdmVyc2lvbjsKKwl0by0+b25fZGlza19rZXkua19vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwgZnJvbSk7CisJdG8tPm9uX2Rpc2tfa2V5LmtfdHlwZSA9IGxlX2tleV9rX3R5cGUodmVyc2lvbiwgZnJvbSk7CiB9CiAKLQotCiAvLyB0aGlzIGRvZXMgbm90IHNheSB3aGljaCBvbmUgaXMgYmlnZ2VyLCBpdCBvbmx5IHJldHVybnMgMSBpZiBrZXlzCiAvLyBhcmUgbm90IGVxdWFsLCAwIG90aGVyd2lzZQotaW5saW5lIGludCBjb21wX2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrMSwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGsyKQoraW5saW5lIGludCBjb21wX2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqazEsCisJCQljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprMikKIHsKLSAgICByZXR1cm4gbWVtY21wIChrMSwgazIsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2tleSkpOworCXJldHVybiBtZW1jbXAoazEsIGsyLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2tleSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NCwzNzMgKzE4NywzOTYgQEAKICB0aGVyZSBhcmUgbm8gcG9zc2libGUgaXRlbXMsIGFuZCB3ZSBoYXZlIG5vdCBmb3VuZCBpdC4gV2l0aCBlYWNoIGV4YW1pbmF0aW9uIHdlCiAgY3V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgaXRlbXMgaXQgY291bGQgYmUgYnkgb25lIG1vcmUgdGhhbiBoYWxmIHJvdW5kZWQgZG93biwKICBvciB3ZSBmaW5kIGl0LiAqLwotc3RhdGljIGlubGluZQlpbnQgYmluX3NlYXJjaCAoCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBwX3Zfa2V5LCAvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBjb25zdCB2b2lkICogcF92X2Jhc2UsLyogRmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkuICAgICAgICAgICAgICovCi0JICAgICAgaW50ICAgICAgIHBfbl9udW0sICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXkuICAgICAgICAqLwotCSAgICAgIGludCAgICAgICBwX25fd2lkdGgsICAvKiBJdGVtIHNpemUgaW4gdGhlIGFycmF5LgotCQkJCSAgICAgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCi0JCQkJICAgICAgIGNvbmZ1c2VkLCBub3RlIHRoYXQgdGhpcyBpcyBjcmFmdGVkCi0JCQkJICAgICAgIGFzIGEgZ2VuZXJhbCBmdW5jdGlvbiwgYW5kIHdoZW4gaXQKLQkJCQkgICAgICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5Ci0JCQkJICAgICAgIG9mIGl0ZW0gaGVhZGVycyBpbiBhIG5vZGUsIHBfbl93aWR0aAotCQkJCSAgICAgICBpcyBhY3R1YWxseSB0aGUgaXRlbSBoZWFkZXIgc2l6ZSBub3QKLQkJCQkgICAgICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBpbnQgICAgICogcF9uX3BvcyAgICAgLyogTnVtYmVyIG9mIHRoZSBzZWFyY2hlZCBmb3IgZWxlbWVudC4gKi8KLSAgICAgICAgICAgICkgewotICAgIGludCAgIG5fcmJvdW5kLCBuX2xib3VuZCwgbl9qOworc3RhdGljIGlubGluZSBpbnQgYmluX3NlYXJjaChjb25zdCB2b2lkICpwX3Zfa2V5LAkvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgY29uc3Qgdm9pZCAqcF92X2Jhc2UsCS8qIEZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5LiAgICAgICAgICAgICAqLworCQkJICAgICBpbnQgcF9uX251bSwJLyogTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJheS4gICAgICAgICovCisJCQkgICAgIGludCBwX25fd2lkdGgsCS8qIEl0ZW0gc2l6ZSBpbiB0aGUgYXJyYXkuCisJCQkJCQkgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCisJCQkJCQkgICBjb25mdXNlZCwgbm90ZSB0aGF0IHRoaXMgaXMgY3JhZnRlZAorCQkJCQkJICAgYXMgYSBnZW5lcmFsIGZ1bmN0aW9uLCBhbmQgd2hlbiBpdAorCQkJCQkJICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5CisJCQkJCQkgICBvZiBpdGVtIGhlYWRlcnMgaW4gYSBub2RlLCBwX25fd2lkdGgKKwkJCQkJCSAgIGlzIGFjdHVhbGx5IHRoZSBpdGVtIGhlYWRlciBzaXplIG5vdAorCQkJCQkJICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgaW50ICpwX25fcG9zCS8qIE51bWJlciBvZiB0aGUgc2VhcmNoZWQgZm9yIGVsZW1lbnQuICovCisgICAgKQoreworCWludCBuX3Jib3VuZCwgbl9sYm91bmQsIG5fajsKIAotICAgZm9yICggbl9qID0gKChuX3Jib3VuZCA9IHBfbl9udW0gLSAxKSArIChuX2xib3VuZCA9IDApKS8yOyBuX2xib3VuZCA8PSBuX3Jib3VuZDsgbl9qID0gKG5fcmJvdW5kICsgbl9sYm91bmQpLzIgKQotICAgICBzd2l0Y2goIGNvbXBfa2V5cygoc3RydWN0IHJlaXNlcmZzX2tleSAqKSgoY2hhciAqIClwX3ZfYmFzZSArIG5faiAqIHBfbl93aWR0aCksIChzdHJ1Y3QgY3B1X2tleSAqKXBfdl9rZXkpICkgIHsKLSAgICAgY2FzZSAtMTogbl9sYm91bmQgPSBuX2ogKyAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMTogbl9yYm91bmQgPSBuX2ogLSAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMDogKnBfbl9wb3MgPSBuX2o7ICAgICByZXR1cm4gSVRFTV9GT1VORDsgLyogS2V5IGZvdW5kIGluIHRoZSBhcnJheS4gICovCi0gICAgICAgIH0KKwlmb3IgKG5faiA9ICgobl9yYm91bmQgPSBwX25fbnVtIC0gMSkgKyAobl9sYm91bmQgPSAwKSkgLyAyOworCSAgICAgbl9sYm91bmQgPD0gbl9yYm91bmQ7IG5faiA9IChuX3Jib3VuZCArIG5fbGJvdW5kKSAvIDIpCisJCXN3aXRjaCAoY29tcF9rZXlzCisJCQkoKHN0cnVjdCByZWlzZXJmc19rZXkgKikoKGNoYXIgKilwX3ZfYmFzZSArCisJCQkJCQkgbl9qICogcF9uX3dpZHRoKSwKKwkJCSAoc3RydWN0IGNwdV9rZXkgKilwX3Zfa2V5KSkgeworCQljYXNlIC0xOgorCQkJbl9sYm91bmQgPSBuX2ogKyAxOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCW5fcmJvdW5kID0gbl9qIC0gMTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQkqcF9uX3BvcyA9IG5fajsKKwkJCXJldHVybiBJVEVNX0ZPVU5EOwkvKiBLZXkgZm91bmQgaW4gdGhlIGFycmF5LiAgKi8KKwkJfQogCi0gICAgLyogYmluX3NlYXJjaCBkaWQgbm90IGZpbmQgZ2l2ZW4ga2V5LCBpdCByZXR1cm5zIHBvc2l0aW9uIG9mIGtleSwKLSAgICAgICAgdGhhdCBpcyBtaW5pbWFsIGFuZCBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4gKi8KLSAgICAqcF9uX3BvcyA9IG5fbGJvdW5kOwotICAgIHJldHVybiBJVEVNX05PVF9GT1VORDsKKwkvKiBiaW5fc2VhcmNoIGRpZCBub3QgZmluZCBnaXZlbiBrZXksIGl0IHJldHVybnMgcG9zaXRpb24gb2Yga2V5LAorCSAgIHRoYXQgaXMgbWluaW1hbCBhbmQgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmUuICovCisJKnBfbl9wb3MgPSBuX2xib3VuZDsKKwlyZXR1cm4gSVRFTV9OT1RfRk9VTkQ7CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiOworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsKICNlbmRpZgogCi0KLQogLyogTWluaW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWSA9IHswLCAwLCB7ezAsIDB9LH19OworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNSU5fS0VZID0geyAwLCAwLCB7ezAsIDB9LH0gfTsKIAogLyogTWF4aW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgIE1BWF9LRVkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNQVhfS0VZID0gewogCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZiksCiAJX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSwKIAl7e19fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZiksCi0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKX0sfQorCSAgX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKX0sfQogfTsKIAotCiAvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBieSBsb29raW5nIGZvciBpdCBpbiB0aGUgYnVmZmVycyBpbiB0aGUgcGF0aCwgc3RhcnRpbmcgZnJvbSB0aGUgYm90dG9tCiAgICBvZiB0aGUgcGF0aCwgYW5kIGdvaW5nIHVwd2FyZHMuICBXZSBtdXN0IGNoZWNrIHRoZSBwYXRoJ3MgdmFsaWRpdHkgYXQgZWFjaCBzdGVwLiAgSWYgdGhlIGtleSBpcyBub3QgaW4KICAgIHRoZSBwYXRoLCB0aGVyZSBpcyBubyBkZWxpbWl0aW5nIGtleSBpbiB0aGUgdHJlZSAoYnVmZmVyIGlzIGZpcnN0IG9yIGxhc3QgYnVmZmVyIGluIHRyZWUpLCBhbmQgaW4gdGhpcwogICAgY2FzZSB3ZSByZXR1cm4gYSBzcGVjaWFsIGtleSwgZWl0aGVyIE1JTl9LRVkgb3IgTUFYX0tFWS4gKi8KLXN0YXRpYyBpbmxpbmUJY29uc3Qgc3RydWN0ICByZWlzZXJmc19rZXkgKiBnZXRfbGtleSAgKAotCSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX2Noa19wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYgotICAgICAgICAgICAgICAgICAgICAgICkgewotICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwgbl9wYXRoX29mZnNldCA9IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGg7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OwotICAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwgCi0JICAiUEFQLTUwMTA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9sa2V5KGNvbnN0IHN0cnVjdCBwYXRoCisJCQkJCQkgICpwX3NfY2hrX3BhdGgsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jaworCQkJCQkJICAqcF9zX3NiKQoreworCWludCBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CiAKLSAgLyogV2hpbGUgbm90IGhpZ2hlciBpbiBwYXRoIHRoYW4gZmlyc3QgZWxlbWVudC4gKi8KLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0LS0gPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgeworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgIlBBUC01MDEwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOwogCi0gICAgUkZBTFNFKCAhIGJ1ZmZlcl91cHRvZGF0ZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAotCSAgICAiUEFQLTUwMjA6IHBhcmVudCBpcyBub3QgdXB0b2RhdGUiKTsKKwkvKiBXaGlsZSBub3QgaGlnaGVyIGluIHBhdGggdGhhbiBmaXJzdCBlbGVtZW50LiAqLworCXdoaWxlIChuX3BhdGhfb2Zmc2V0LS0gPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CiAKLSAgICAvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KLSAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpICkKLSAgICAgIHJldHVybiAmTUFYX0tFWTsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KLSAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLSAgICAgICByZXR1cm4gJk1BWF9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCi0gICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9Ci0JIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tuciApCi0gICAgICByZXR1cm4gJk1BWF9LRVk7Ci0gICAgLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIHplcm8uICovCi0gICAgaWYgKCBuX3Bvc2l0aW9uICkKLSAgICAgIHJldHVybiBCX05fUERFTElNX0tFWShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uIC0gMSk7Ci0gIH0KLSAgLyogUmV0dXJuIE1JTl9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KLSAgaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQotICAgICAgIFNCX1JPT1RfQkxPQ0sgKHBfc19zYikgKQotICAgIHJldHVybiAmTUlOX0tFWTsKLSAgcmV0dXJuICAmTUFYX0tFWTsKKwkJUkZBTFNFKCFidWZmZXJfdXB0b2RhdGUKKwkJICAgICAgIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAorCQkgICAgICAgIlBBUC01MDIwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisKKwkJLyogUGFyZW50IGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZSBub3cuICovCisJCWlmICghQl9JU19JTl9UUkVFCisJCSAgICAocF9zX3BhcmVudCA9CisJCSAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSkKKwkJCXJldHVybiAmTUFYX0tFWTsKKwkJLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisJCWlmICgobl9wb3NpdGlvbiA9CisJCSAgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLAorCQkJCQkgIG5fcGF0aF9vZmZzZXQpKSA+CisJCSAgICBCX05SX0lURU1TKHBfc19wYXJlbnQpKQorCQkJcmV0dXJuICZNQVhfS0VZOworCQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KKwkJaWYgKEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLAorCQkJCQluX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tucikKKwkJCXJldHVybiAmTUFYX0tFWTsKKwkJLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIHplcm8uICovCisJCWlmIChuX3Bvc2l0aW9uKQorCQkJcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24gLSAxKTsKKwl9CisJLyogUmV0dXJuIE1JTl9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KKwlpZiAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT4KKwkgICAgYl9ibG9ja25yID09IFNCX1JPT1RfQkxPQ0socF9zX3NiKSkKKwkJcmV0dXJuICZNSU5fS0VZOworCXJldHVybiAmTUFYX0tFWTsKIH0KIAotCiAvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yLiAqLwotaW5saW5lCWNvbnN0IHN0cnVjdCAgcmVpc2VyZnNfa2V5ICogZ2V0X3JrZXkgICgKLQkgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19jaGtfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IKLSAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCi0gICAgCQkJbl9wYXRoX29mZnNldCA9IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGg7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OworaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9ya2V5KGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCWludCBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CiAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICJQQVAtNTAzMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJQQVAtNTAzMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKIAotICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJd2hpbGUgKG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKIAotICAgIFJGQUxTRSggISBidWZmZXJfdXB0b2RhdGUoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKLQkgICAgIlBBUC01MDQwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisJCVJGQUxTRSghYnVmZmVyX3VwdG9kYXRlCisJCSAgICAgICAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKKwkJICAgICAgICJQQVAtNTA0MDogcGFyZW50IGlzIG5vdCB1cHRvZGF0ZSIpOwogCi0gICAgLyogUGFyZW50IGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZSBub3cuICovCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSApCi0gICAgICByZXR1cm4gJk1JTl9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCi0gICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpID4gQl9OUl9JVEVNUyhwX3NfcGFyZW50KSApCi0gICAgICByZXR1cm4gJk1JTl9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCi0gICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yICkKLSAgICAgIHJldHVybiAmTUlOX0tFWTsKLSAgICAvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgdGhlIGxhc3Qgb25lLiAqLwotICAgIGlmICggbl9wb3NpdGlvbiAhPSBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLSAgICAgIHJldHVybiBCX05fUERFTElNX0tFWShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKTsKLSAgfQotICAvKiBSZXR1cm4gTUFYX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLwotICBpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0gICAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3NiKSApCi0gICAgcmV0dXJuICZNQVhfS0VZOwotICByZXR1cm4gICZNSU5fS0VZOworCQkvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KKwkJaWYgKCFCX0lTX0lOX1RSRUUKKwkJICAgIChwX3NfcGFyZW50ID0KKwkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpKQorCQkJcmV0dXJuICZNSU5fS0VZOworCQkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKwkJaWYgKChuX3Bvc2l0aW9uID0KKwkJICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfY2hrX3BhdGgsCisJCQkJCSAgbl9wYXRoX29mZnNldCkpID4KKwkJICAgIEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gJk1JTl9LRVk7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworCQlpZiAoQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsCisJCQkJCW5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yKQorCQkJcmV0dXJuICZNSU5fS0VZOworCQkvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgdGhlIGxhc3Qgb25lLiAqLworCQlpZiAobl9wb3NpdGlvbiAhPSBCX05SX0lURU1TKHBfc19wYXJlbnQpKQorCQkJcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pOworCX0KKwkvKiBSZXR1cm4gTUFYX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLworCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPgorCSAgICBiX2Jsb2NrbnIgPT0gU0JfUk9PVF9CTE9DSyhwX3Nfc2IpKQorCQlyZXR1cm4gJk1BWF9LRVk7CisJcmV0dXJuICZNSU5fS0VZOwogfQogCi0KIC8qIENoZWNrIHdoZXRoZXIgYSBrZXkgaXMgY29udGFpbmVkIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIGEgYnVmZmVyIGF0IGEgcGF0aC4gKi8KIC8qIFRoaXMgd29ya3MgYnkgbG9va2luZyBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgZGVsaW1pdGluZyBrZXlzIGZvciB0aGUgYnVmZmVyIGluIHRoZSBsYXN0IHBhdGhfZWxlbWVudCBpbgogICAgdGhlIHBhdGguICBUaGVzZSBkZWxpbWl0aW5nIGtleXMgYXJlIHN0b3JlZCBhdCBsZWFzdCBvbmUgbGV2ZWwgYWJvdmUgdGhhdCBidWZmZXIgaW4gdGhlIHRyZWUuIElmIHRoZQogICAgYnVmZmVyIGlzIHRoZSBmaXJzdCBvciBsYXN0IG5vZGUgaW4gdGhlIHRyZWUgb3JkZXIgdGhlbiBvbmUgb2YgdGhlIGRlbGltaXRpbmcga2V5cyBtYXkgYmUgYWJzZW50LCBhbmQgaW4KICAgIHRoaXMgY2FzZSBnZXRfbGtleSBhbmQgZ2V0X3JrZXkgcmV0dXJuIGEgc3BlY2lhbCBrZXkgd2hpY2ggaXMgTUlOX0tFWSBvciBNQVhfS0VZLiAqLwotc3RhdGljICBpbmxpbmUgIGludCBrZXlfaW5fYnVmZmVyICgKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX2Noa19wYXRoLCAvKiBQYXRoIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2tleSwgICAgICAvKiBLZXkgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiICAgICAgICAvKiBTdXBlciBibG9jayBwb2ludGVyLiAgICAgICAgICAgKi8KLQkJICAgICAgKSB7CitzdGF0aWMgaW5saW5lIGludCBrZXlfaW5fYnVmZmVyKHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCS8qIFBhdGggd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAqLworCQkJCWNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAgKi8KKwkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYgkvKiBTdXBlciBibG9jayBwb2ludGVyLiAgICAgICAgICAgKi8KKyAgICApCit7CiAKLSAgUkZBTFNFKCAhIHBfc19rZXkgfHwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKLQkgIHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPiBNQVhfSEVJR0hULAotCSAgIlBBUC01MDUwOiBwb2ludGVyIHRvIHRoZSBrZXkoJXApIGlzIE5VTEwgb3IgaW52YWxpZCBwYXRoIGxlbmd0aCglZCkiLAotCSAgcF9zX2tleSwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCk7Ci0gIFJGQUxTRSggIVBBVEhfUExBU1RfQlVGRkVSKHBfc19jaGtfcGF0aCktPmJfYmRldiwKLQkgICJQQVAtNTA2MDogZGV2aWNlIG11c3Qgbm90IGJlIE5PREVWIik7CisJUkZBTFNFKCFwX3Nfa2V5IHx8IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUCisJICAgICAgIHx8IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPiBNQVhfSEVJR0hULAorCSAgICAgICAiUEFQLTUwNTA6IHBvaW50ZXIgdG8gdGhlIGtleSglcCkgaXMgTlVMTCBvciBpbnZhbGlkIHBhdGggbGVuZ3RoKCVkKSIsCisJICAgICAgIHBfc19rZXksIHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGgpOworCVJGQUxTRSghUEFUSF9QTEFTVF9CVUZGRVIocF9zX2Noa19wYXRoKS0+Yl9iZGV2LAorCSAgICAgICAiUEFQLTUwNjA6IGRldmljZSBtdXN0IG5vdCBiZSBOT0RFViIpOwogCi0gIGlmICggY29tcF9rZXlzKGdldF9sa2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgPT0gMSApCi0gICAgLyogbGVmdCBkZWxpbWl0aW5nIGtleSBpcyBiaWdnZXIsIHRoYXQgdGhlIGtleSB3ZSBsb29rIGZvciAqLwotICAgIHJldHVybiAwOwotICAvLyAgaWYgKCBjb21wX2tleXMocF9zX2tleSwgZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpKSAhPSAtMSApCi0gIGlmICggY29tcF9rZXlzKGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgIT0gMSApCi0gICAgLyogcF9zX2tleSBtdXN0IGJlIGxlc3MgdGhhbiByaWdodCBkZWxpbWl0aWluZyBrZXkgKi8KLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CisJaWYgKGNvbXBfa2V5cyhnZXRfbGtleShwX3NfY2hrX3BhdGgsIHBfc19zYiksIHBfc19rZXkpID09IDEpCisJCS8qIGxlZnQgZGVsaW1pdGluZyBrZXkgaXMgYmlnZ2VyLCB0aGF0IHRoZSBrZXkgd2UgbG9vayBmb3IgKi8KKwkJcmV0dXJuIDA7CisJLy8gIGlmICggY29tcF9rZXlzKHBfc19rZXksIGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSkgIT0gLTEgKQorCWlmIChjb21wX2tleXMoZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpLCBwX3Nfa2V5KSAhPSAxKQorCQkvKiBwX3Nfa2V5IG11c3QgYmUgbGVzcyB0aGFuIHJpZ2h0IGRlbGltaXRpaW5nIGtleSAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotCi1pbmxpbmUgdm9pZCBkZWNyZW1lbnRfYmNvdW50KAotICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoCi0gICAgICAgICAgICApIHsgCi0gIGlmICggcF9zX2JoICkgewotICAgIGlmICggYXRvbWljX3JlYWQgKCYocF9zX2JoLT5iX2NvdW50KSkgKSB7Ci0gICAgICBwdXRfYmgocF9zX2JoKSA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlaXNlcmZzX3BhbmljKE5VTEwsICJQQVAtNTA3MDogZGVjcmVtZW50X2Jjb3VudDogdHJ5aW5nIHRvIGZyZWUgZnJlZSBidWZmZXIgJWIiLCBwX3NfYmgpOwotICB9CitpbmxpbmUgdm9pZCBkZWNyZW1lbnRfYmNvdW50KHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKQoreworCWlmIChwX3NfYmgpIHsKKwkJaWYgKGF0b21pY19yZWFkKCYocF9zX2JoLT5iX2NvdW50KSkpIHsKKwkJCXB1dF9iaChwX3NfYmgpOworCQkJcmV0dXJuOworCQl9CisJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkgICAgICAgIlBBUC01MDcwOiBkZWNyZW1lbnRfYmNvdW50OiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlciAlYiIsCisJCQkgICAgICAgcF9zX2JoKTsKKwl9CiB9CiAKLQogLyogRGVjcmVtZW50IGJfY291bnQgZmllbGQgb2YgdGhlIGFsbCBidWZmZXJzIGluIHRoZSBwYXRoLiAqLwotdm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCAoCi0gICAgICAgICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCi0gICAgICAgICAgICApIHsKLSAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwordm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQoreworCWludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKIAotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKLQkgIG5fcGF0aF9vZmZzZXQgPiBFWFRFTkRFRF9NQVhfSEVJR0hUIC0gMSwKLQkgICJQQVAtNTA4MDogaW52YWxpZCBwYXRoIG9mZnNldCBvZiAlZCIsIG5fcGF0aF9vZmZzZXQpOworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUIHx8CisJICAgICAgIG5fcGF0aF9vZmZzZXQgPiBFWFRFTkRFRF9NQVhfSEVJR0hUIC0gMSwKKwkgICAgICAgIlBBUC01MDgwOiBpbnZhbGlkIHBhdGggb2Zmc2V0IG9mICVkIiwgbl9wYXRoX29mZnNldCk7CiAKLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXdoaWxlIChuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLSAgICBiaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pOwotICAgIGRlY3JlbWVudF9iY291bnQgKGJoKTsKLSAgfQotICBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOworCQliaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pOworCQlkZWNyZW1lbnRfYmNvdW50KGJoKTsKKwl9CisJcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKIH0KIAotCi1pbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgcGF0aCAqcCkgewotICBSRkFMU0UoIHAtPnBhdGhfbGVuZ3RoICE9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICJwYXRoIG5vdCBwcm9wZXJseSByZWxzZWQiKSA7Ci0gIHJldHVybiAwIDsKK2ludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKQoreworCVJGQUxTRShwLT5wYXRoX2xlbmd0aCAhPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJwYXRoIG5vdCBwcm9wZXJseSByZWxzZWQiKTsKKwlyZXR1cm4gMDsKIH0KIAotCiAvKiBSZWxlYXNlIGFsbCBidWZmZXJzIGluIHRoZSBwYXRoLiBSZXN0b3JlIGRpcnR5IGJpdHMgY2xlYW4KICoqIHdoZW4gcHJlcGFyaW5nIHRoZSBidWZmZXIgZm9yIHRoZSBsb2cKICoqCiAqKiBvbmx5IGNhbGxlZCBmcm9tIGZpeF9ub2RlcygpCiAqLwotdm9pZCAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlICgKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIAotICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAotICAgICAgKSB7Ci0gIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKK3ZvaWQgcGF0aHJlbHNlX2FuZF9yZXN0b3JlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCkKK3sKKwlpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CiAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAKLQkgICJjbG0tNDAwMDogaW52YWxpZCBwYXRoIG9mZnNldCIpOwotICAKLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgIHsKLSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wYXRoX29mZnNldCkpOwotICAgIGJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7Ci0gIH0KLSAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgImNsbS00MDAwOiBpbnZhbGlkIHBhdGggb2Zmc2V0Iik7CisKKwl3aGlsZSAobl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLAorCQkJCQkJIFBBVEhfT0ZGU0VUX1BCVUZGRVIKKwkJCQkJCSAocF9zX3NlYXJjaF9wYXRoLAorCQkJCQkJICBuX3BhdGhfb2Zmc2V0KSk7CisJCWJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CisJfQorCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7CiB9CiAKIC8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCi12b2lkICBwYXRocmVsc2UgKAotICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAotICAgICAgKSB7Ci0gIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKLQotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCi0JICAiUEFQLTUwOTA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKLSAgCi0gIHdoaWxlICggbl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCApICAKLSAgICBicmVsc2UoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSkpOwotCi0gIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGlzX2xlYWYgKGNoYXIgKiBidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQordm9pZCBwYXRocmVsc2Uoc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCkKIHsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCB1c2VkX3NwYWNlOwotICAgIGludCBwcmV2X2xvY2F0aW9uOwotICAgIGludCBpOwotICAgIGludCBucjsKKwlpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CiAKLSAgICBibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOwotICAgIGlmICggYmxraF9sZXZlbChibGtoKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOwotCXJldHVybiAwOwotICAgIH0KKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgIlBBUC01MDkwOiBpbnZhbGlkIHBhdGggb2Zmc2V0Iik7CiAKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBpZiAobnIgPCAxIHx8IG5yID4gKChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pKSkgewotCS8qIGl0ZW0gbnVtYmVyIGlzIHRvbyBiaWcgb3IgdG9vIHNtYWxsICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IG5yX2l0ZW0gc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSkgKyBuciAtIDE7Ci0gICAgdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIElIX1NJWkUgKiBuciArIChibG9ja3NpemUgLSBpaF9sb2NhdGlvbiAoaWgpKTsKLSAgICBpZiAodXNlZF9zcGFjZSAhPSBibG9ja3NpemUgLSBibGtoX2ZyZWVfc3BhY2UoYmxraCkpIHsKLQkvKiBmcmVlIHNwYWNlIGRvZXMgbm90IG1hdGNoIHRvIGNhbGN1bGF0ZWQgYW1vdW50IG9mIHVzZSBzcGFjZSAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJd2hpbGUgKG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpCisJCWJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CiAKLSAgICAvLyBGSVhNRTogaXQgaXNfbGVhZiB3aWxsIGhpdCBwZXJmb3JtYW5jZSB0b28gbXVjaCAtIHdlIG1heSBoYXZlCi0gICAgLy8gcmV0dXJuIDEgaGVyZQotCi0gICAgLyogY2hlY2sgdGFibGVzIG9mIGl0ZW0gaGVhZHMgKi8KLSAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSk7Ci0gICAgcHJldl9sb2NhdGlvbiA9IGJsb2Nrc2l6ZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkgKyssIGloICsrKSB7Ci0JaWYgKCBsZV9paF9rX3R5cGUoaWgpID09IFRZUEVfQU5ZKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB3cm9uZyBpdGVtIHR5cGUgZm9yIGl0ZW0gJWgiLGloKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChpaF9sb2NhdGlvbiAoaWgpID49IGJsb2Nrc2l6ZSB8fCBpaF9sb2NhdGlvbiAoaWgpIDwgSUhfU0laRSAqIG5yKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nOiAlaCIsIGloKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChpaF9pdGVtX2xlbiAoaWgpIDwgMSB8fCBpaF9pdGVtX2xlbiAoaWgpID4gTUFYX0lURU1fTEVOIChibG9ja3NpemUpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxlbmd0aCBzZWVtcyB3cm9uZzogJWgiLCBpaCk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlpZiAocHJldl9sb2NhdGlvbiAtIGloX2xvY2F0aW9uIChpaCkgIT0gaWhfaXRlbV9sZW4gKGloKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogaXRlbSBsb2NhdGlvbiBzZWVtcyB3cm9uZyAoc2Vjb25kIG9uZSk6ICVoIiwgaWgpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JcHJldl9sb2NhdGlvbiA9IGloX2xvY2F0aW9uIChpaCk7Ci0gICAgfQotCi0gICAgLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKLSAgICByZXR1cm4gMTsKKwlwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOwogfQogCitzdGF0aWMgaW50IGlzX2xlYWYoY2hhciAqYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCB1c2VkX3NwYWNlOworCWludCBwcmV2X2xvY2F0aW9uOworCWludCBpOworCWludCBucjsKKworCWJsa2ggPSAoc3RydWN0IGJsb2NrX2hlYWQgKilidWY7CisJaWYgKGJsa2hfbGV2ZWwoYmxraCkgIT0gRElTS19MRUFGX05PREVfTEVWRUwpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfbGVhZjogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJaWYgKG5yIDwgMSB8fCBuciA+ICgoYmxvY2tzaXplIC0gQkxLSF9TSVpFKSAvIChJSF9TSVpFICsgTUlOX0lURU1fTEVOKSkpIHsKKwkJLyogaXRlbSBudW1iZXIgaXMgdG9vIGJpZyBvciB0b28gc21hbGwgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiaXNfbGVhZjogbnJfaXRlbSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJCXJldHVybiAwOworCX0KKwlpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSkgKyBuciAtIDE7CisJdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIElIX1NJWkUgKiBuciArIChibG9ja3NpemUgLSBpaF9sb2NhdGlvbihpaCkpOworCWlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCQkvKiBmcmVlIHNwYWNlIGRvZXMgbm90IG1hdGNoIHRvIGNhbGN1bGF0ZWQgYW1vdW50IG9mIHVzZSBzcGFjZSAqLworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJpc19sZWFmOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsCisJCQkJIGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIEZJWE1FOiBpdCBpc19sZWFmIHdpbGwgaGl0IHBlcmZvcm1hbmNlIHRvbyBtdWNoIC0gd2UgbWF5IGhhdmUKKwkvLyByZXR1cm4gMSBoZXJlCisKKwkvKiBjaGVjayB0YWJsZXMgb2YgaXRlbSBoZWFkcyAqLworCWloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKTsKKwlwcmV2X2xvY2F0aW9uID0gYmxvY2tzaXplOworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrLCBpaCsrKSB7CisJCWlmIChsZV9paF9rX3R5cGUoaWgpID09IFRZUEVfQU5ZKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAiaXNfbGVhZjogd3JvbmcgaXRlbSB0eXBlIGZvciBpdGVtICVoIiwKKwkJCQkJIGloKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChpaF9sb2NhdGlvbihpaCkgPj0gYmxvY2tzaXplCisJCSAgICB8fCBpaF9sb2NhdGlvbihpaCkgPCBJSF9TSVpFICogbnIpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nOiAlaCIsCisJCQkJCSBpaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoaWhfaXRlbV9sZW4oaWgpIDwgMQorCQkgICAgfHwgaWhfaXRlbV9sZW4oaWgpID4gTUFYX0lURU1fTEVOKGJsb2Nrc2l6ZSkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiBpdGVtIGxlbmd0aCBzZWVtcyB3cm9uZzogJWgiLAorCQkJCQkgaWgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHByZXZfbG9jYXRpb24gLSBpaF9sb2NhdGlvbihpaCkgIT0gaWhfaXRlbV9sZW4oaWgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAiaXNfbGVhZjogaXRlbSBsb2NhdGlvbiBzZWVtcyB3cm9uZyAoc2Vjb25kIG9uZSk6ICVoIiwKKwkJCQkJIGloKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByZXZfbG9jYXRpb24gPSBpaF9sb2NhdGlvbihpaCk7CisJfQorCisJLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKKwlyZXR1cm4gMTsKK30KIAogLyogcmV0dXJucyAxIGlmIGJ1ZiBsb29rcyBsaWtlIGFuIGludGVybmFsIG5vZGUsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW50IGlzX2ludGVybmFsIChjaGFyICogYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyBpbnQgaXNfaW50ZXJuYWwoY2hhciAqYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBpbnQgbnI7Ci0gICAgaW50IHVzZWRfc3BhY2U7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJaW50IG5yOworCWludCB1c2VkX3NwYWNlOwogCi0gICAgYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKLSAgICBuciA9IGJsa2hfbGV2ZWwoYmxraCk7Ci0gICAgaWYgKG5yIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMIHx8IG5yID4gTUFYX0hFSUdIVCkgewotCS8qIHRoaXMgbGV2ZWwgaXMgbm90IHBvc3NpYmxlIGZvciBpbnRlcm5hbCBub2RlcyAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7Ci0gICAgaWYgKG5yID4gKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSAtIERDX1NJWkUpIC8gKEtFWV9TSVpFICsgRENfU0laRSkpIHsKLQkvKiBmb3IgaW50ZXJuYWwgd2hpY2ggaXMgbm90IHJvb3Qgd2UgbWlnaHQgY2hlY2sgbWluIG51bWJlciBvZiBrZXlzICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiBudW1iZXIgb2Yga2V5IHNlZW1zIHdyb25nOiAleiIsIGJoKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKwluciA9IGJsa2hfbGV2ZWwoYmxraCk7CisJaWYgKG5yIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMIHx8IG5yID4gTUFYX0hFSUdIVCkgeworCQkvKiB0aGlzIGxldmVsIGlzIG5vdCBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgbm9kZXMgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfaW50ZXJuYWw6IHRoaXMgc2hvdWxkIGJlIGNhdWdodCBlYXJsaWVyIik7CisJCXJldHVybiAwOworCX0KIAotICAgIHVzZWRfc3BhY2UgPSBCTEtIX1NJWkUgKyBLRVlfU0laRSAqIG5yICsgRENfU0laRSAqIChuciArIDEpOwotICAgIGlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogZnJlZSBzcGFjZSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQorCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWlmIChuciA+IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBEQ19TSVpFKSAvIChLRVlfU0laRSArIERDX1NJWkUpKSB7CisJCS8qIGZvciBpbnRlcm5hbCB3aGljaCBpcyBub3Qgcm9vdCB3ZSBtaWdodCBjaGVjayBtaW4gbnVtYmVyIG9mIGtleXMgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfaW50ZXJuYWw6IG51bWJlciBvZiBrZXkgc2VlbXMgd3Jvbmc6ICV6IiwKKwkJCQkgYmgpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcwotICAgIHJldHVybiAxOworCXVzZWRfc3BhY2UgPSBCTEtIX1NJWkUgKyBLRVlfU0laRSAqIG5yICsgRENfU0laRSAqIChuciArIDEpOworCWlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJpc19pbnRlcm5hbDogZnJlZSBzcGFjZSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJCXJldHVybiAwOworCX0KKwkvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcworCXJldHVybiAxOwogfQogCi0KIC8vIG1ha2Ugc3VyZSB0aGF0IGJoIGNvbnRhaW5zIGZvcm1hdHRlZCBub2RlIG9mIHJlaXNlcmZzIHRyZWUgb2YKIC8vICdsZXZlbCctdGggbGV2ZWwKLXN0YXRpYyBpbnQgaXNfdHJlZV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGxldmVsKQorc3RhdGljIGludCBpc190cmVlX25vZGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGxldmVsKQogewotICAgIGlmIChCX0xFVkVMIChiaCkgIT0gbGV2ZWwpIHsKLQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfdHJlZV9ub2RlOiBub2RlIGxldmVsICVkIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBleHBlY3RlZCBvbmUgJWQiLAotCQlCX0xFVkVMIChiaCksIGxldmVsKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQotCXJldHVybiBpc19sZWFmIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CisJaWYgKEJfTEVWRUwoYmgpICE9IGxldmVsKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgImlzX3RyZWVfbm9kZTogbm9kZSBsZXZlbCAlZCBkb2VzIG5vdCBtYXRjaCB0byB0aGUgZXhwZWN0ZWQgb25lICVkIiwKKwkJCQkgQl9MRVZFTChiaCksIGxldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsZXZlbCA9PSBESVNLX0xFQUZfTk9ERV9MRVZFTCkKKwkJcmV0dXJuIGlzX2xlYWYoYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSwgYmgpOwogCi0gICAgcmV0dXJuIGlzX2ludGVybmFsIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CisJcmV0dXJuIGlzX2ludGVybmFsKGJoLT5iX2RhdGEsIGJoLT5iX3NpemUsIGJoKTsKIH0KIAotCi0KICNkZWZpbmUgU0VBUkNIX0JZX0tFWV9SRUFEQSAxNgogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1zdGF0aWMgdm9pZCBzZWFyY2hfYnlfa2V5X3JlYWRhIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCi0JCQkJIHVuc2lnbmVkIGxvbmcgKmIsIGludCBudW0pCitzdGF0aWMgdm9pZCBzZWFyY2hfYnlfa2V5X3JlYWRhKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKKwkJCQl1bnNpZ25lZCBsb25nICpiLCBpbnQgbnVtKQogewotICAgIGludCBpLGo7Ci0gIAotICAgIGZvciAoaSA9IDAgOyBpIDwgbnVtIDsgaSsrKSB7Ci0JYmhbaV0gPSBzYl9nZXRibGsgKHMsIGJbaV0pOwotICAgIH0KLSAgICBmb3IgKGogPSAwIDsgaiA8IGkgOyBqKyspIHsKLQkvKgotCSAqIG5vdGUsIHRoaXMgbmVlZHMgYXR0ZW50aW9uIGlmIHdlIGFyZSBnZXR0aW5nIHJpZCBvZiB0aGUgQktMCi0JICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCi0JICovCi0JaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhbal0pKQotCSAgICBsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKLSAgICAJYnJlbHNlKGJoW2pdKTsKLSAgICB9CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJYmhbaV0gPSBzYl9nZXRibGsocywgYltpXSk7CisJfQorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJLyoKKwkJICogbm90ZSwgdGhpcyBuZWVkcyBhdHRlbnRpb24gaWYgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZSBCS0wKKwkJICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCisJCSAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtqXSkpCisJCQlsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKKwkJYnJlbHNlKGJoW2pdKTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTc2LDE5MyArNjAyLDE5OSBAQAogICAgY29ycmVjdG5lc3Mgb2YgdGhlIHRvcCBvZiB0aGUgcGF0aCBidXQgbmVlZCBub3QgYmUgY2hlY2tlZCBmb3IgdGhlCiAgICBjb3JyZWN0bmVzcyBvZiB0aGUgYm90dG9tIG9mIHRoZSBwYXRoICovCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiLAotCQkgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19rZXksIC8qIEtleSB0byBzZWFyY2guICovCi0JCSAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoLCAvKiBUaGlzIHN0cnVjdHVyZSB3YXMKLQkJCQkJCSAgICAgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAotCQkJCQkJICAgICBieSB0aGUgY2FsbGluZwotCQkJCQkJICAgICBmdW5jdGlvbi4gSXQgaXMgZmlsbGVkIHVwCi0JCQkJCQkgICAgIGJ5IHRoaXMgZnVuY3Rpb24uICAqLwotCQkgICBpbnQgbl9zdG9wX2xldmVsIC8qIEhvdyBmYXIgZG93biB0aGUgdHJlZSB0byBzZWFyY2guIFRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wIGF0IGxlYWYgbGV2ZWwgLSBzZXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0tfTEVBRl9OT0RFX0xFVkVMICovCi0gICAgKSB7Ci0gICAgaW50ICBuX2Jsb2NrX251bWJlcjsKLSAgICBpbnQgIGV4cGVjdGVkX2xldmVsOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiAgICAgICBwX3NfYmg7Ci0gICAgc3RydWN0IHBhdGhfZWxlbWVudCAqICAgICAgIHBfc19sYXN0X2VsZW1lbnQ7Ci0gICAgaW50CQkJCW5fbm9kZV9sZXZlbCwgbl9yZXR2YWw7Ci0gICAgaW50IAkJCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZTsKLSAgICBpbnQJCQkJZnNfZ2VuOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZGFfYmhbU0VBUkNIX0JZX0tFWV9SRUFEQV07Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgIHJlYWRhX2Jsb2Nrc1tTRUFSQ0hfQllfS0VZX1JFQURBXTsKLSAgICBpbnQgcmVhZGFfY291bnQgPSAwOworaW50IHNlYXJjaF9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgdG8gc2VhcmNoLiAqLworCQkgIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgsCS8qIFRoaXMgc3RydWN0dXJlIHdhcworCQkJCQkJICAgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorCQkJCQkJICAgYnkgdGhlIGNhbGxpbmcKKwkJCQkJCSAgIGZ1bmN0aW9uLiBJdCBpcyBmaWxsZWQgdXAKKwkJCQkJCSAgIGJ5IHRoaXMgZnVuY3Rpb24uICAqLworCQkgIGludCBuX3N0b3BfbGV2ZWwJLyogSG93IGZhciBkb3duIHRoZSB0cmVlIHRvIHNlYXJjaC4gVG8KKwkJCQkJICAgc3RvcCBhdCBsZWFmIGxldmVsIC0gc2V0IHRvCisJCQkJCSAgIERJU0tfTEVBRl9OT0RFX0xFVkVMICovCisgICAgKQoreworCWludCBuX2Jsb2NrX251bWJlcjsKKwlpbnQgZXhwZWN0ZWRfbGV2ZWw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CisJc3RydWN0IHBhdGhfZWxlbWVudCAqcF9zX2xhc3RfZWxlbWVudDsKKwlpbnQgbl9ub2RlX2xldmVsLCBuX3JldHZhbDsKKwlpbnQgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlOworCWludCBmc19nZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWFkYV9iaFtTRUFSQ0hfQllfS0VZX1JFQURBXTsKKwl1bnNpZ25lZCBsb25nIHJlYWRhX2Jsb2Nrc1tTRUFSQ0hfQllfS0VZX1JFQURBXTsKKwlpbnQgcmVhZGFfY291bnQgPSAwOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaW50IG5fcmVwZWF0X2NvdW50ZXIgPSAwOworCWludCBuX3JlcGVhdF9jb3VudGVyID0gMDsKICNlbmRpZgotICAgIAotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleSApOwotICAgIAotICAgIC8qIEFzIHdlIGFkZCBlYWNoIG5vZGUgdG8gYSBwYXRoIHdlIGluY3JlYXNlIGl0cyBjb3VudC4gIFRoaXMgbWVhbnMgdGhhdAotICAgICAgIHdlIG11c3QgYmUgY2FyZWZ1bCB0byByZWxlYXNlIGFsbCBub2RlcyBpbiBhIHBhdGggYmVmb3JlIHdlIGVpdGhlcgotICAgICAgIGRpc2NhcmQgdGhlIHBhdGggc3RydWN0IG9yIHJlLXVzZSB0aGUgcGF0aCBzdHJ1Y3QsIGFzIHdlIGRvIGhlcmUuICovCiAKLSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBzZWFyY2hfYnlfa2V5KTsKIAotICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisJLyogQXMgd2UgYWRkIGVhY2ggbm9kZSB0byBhIHBhdGggd2UgaW5jcmVhc2UgaXRzIGNvdW50LiAgVGhpcyBtZWFucyB0aGF0CisJICAgd2UgbXVzdCBiZSBjYXJlZnVsIHRvIHJlbGVhc2UgYWxsIG5vZGVzIGluIGEgcGF0aCBiZWZvcmUgd2UgZWl0aGVyCisJICAgZGlzY2FyZCB0aGUgcGF0aCBzdHJ1Y3Qgb3IgcmUtdXNlIHRoZSBwYXRoIHN0cnVjdCwgYXMgd2UgZG8gaGVyZS4gKi8KIAotICAgIC8qIFdpdGggZWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIHdlIHNlYXJjaCB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUKLSAgICAgICBjdXJyZW50IG5vZGUsIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgY3VycmVudCBub2RlKG5leHQgcGF0aCBlbGVtZW50KQotICAgICAgIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhpcyBsb29wLi4gKi8KLSAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7Ci0gICAgZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKLSAgICB3aGlsZSAoIDEgKSB7CisJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3NlYXJjaF9wYXRoKTsKKworCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisKKwkvKiBXaXRoIGVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCB3ZSBzZWFyY2ggdGhyb3VnaCB0aGUgaXRlbXMgaW4gdGhlCisJICAgY3VycmVudCBub2RlLCBhbmQgY2FsY3VsYXRlIHRoZSBuZXh0IGN1cnJlbnQgbm9kZShuZXh0IHBhdGggZWxlbWVudCkKKwkgICBmb3IgdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcC4uICovCisJbl9ibG9ja19udW1iZXIgPSBTQl9ST09UX0JMT0NLKHBfc19zYik7CisJZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKwl3aGlsZSAoMSkgewogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JaWYgKCAhKCsrbl9yZXBlYXRfY291bnRlciAlIDUwMDAwKSApCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIlBBUC01MTAwOiBzZWFyY2hfYnlfa2V5OiAlczoiCi0JCQkgICAgICAidGhlcmUgd2VyZSAlZCBpdGVyYXRpb25zIG9mIHdoaWxlIGxvb3AgIgotCQkJICAgICAgImxvb2tpbmcgZm9yIGtleSAlSyIsCi0JCQkgICAgICBjdXJyZW50LT5jb21tLCBuX3JlcGVhdF9jb3VudGVyLCBwX3Nfa2V5KTsKKwkJaWYgKCEoKytuX3JlcGVhdF9jb3VudGVyICUgNTAwMDApKQorCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJQQVAtNTEwMDogc2VhcmNoX2J5X2tleTogJXM6IgorCQkJCQkgInRoZXJlIHdlcmUgJWQgaXRlcmF0aW9ucyBvZiB3aGlsZSBsb29wICIKKwkJCQkJICJsb29raW5nIGZvciBrZXkgJUsiLAorCQkJCQkgY3VycmVudC0+Y29tbSwgbl9yZXBlYXRfY291bnRlciwKKwkJCQkJIHBfc19rZXkpOwogI2VuZGlmCiAKLQkvKiBwcmVwIHBhdGggdG8gaGF2ZSBhbm90aGVyIGVsZW1lbnQgYWRkZWQgdG8gaXQuICovCi0JcF9zX2xhc3RfZWxlbWVudCA9IFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19zZWFyY2hfcGF0aCwgKytwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoKTsKLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAocF9zX3NiKTsKKwkJLyogcHJlcCBwYXRoIHRvIGhhdmUgYW5vdGhlciBlbGVtZW50IGFkZGVkIHRvIGl0LiAqLworCQlwX3NfbGFzdF9lbGVtZW50ID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19zZWFyY2hfcGF0aCwKKwkJCQkJICsrcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCk7CisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKHBfc19zYik7CiAKLQkvKiBSZWFkIHRoZSBuZXh0IHRyZWUgbm9kZSwgYW5kIHNldCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBwYXRoIHRvCi0gICAgICAgICAgIGhhdmUgYSBwb2ludGVyIHRvIGl0LiAqLwotCWlmICgocF9zX2JoID0gcF9zX2xhc3RfZWxlbWVudC0+cGVfYnVmZmVyID0KLQkgICAgIHNiX2dldGJsayhwX3Nfc2IsIG5fYmxvY2tfbnVtYmVyKSkgKSB7Ci0JICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkgJiYgcmVhZGFfY291bnQgPiAxKSB7Ci0JCXNlYXJjaF9ieV9rZXlfcmVhZGEgKHBfc19zYiwgcmVhZGFfYmgsCi0JCSAgICAgICAgICAgICAgICAgICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOwotCSAgICB9Ci0JICAgIGxsX3J3X2Jsb2NrKFJFQUQsIDEsICZwX3NfYmgpOwotCSAgICB3YWl0X29uX2J1ZmZlcihwX3NfYmgpOwotCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShwX3NfYmgpKQotCSAgICAgICAgZ290byBpb19lcnJvcjsKLQl9IGVsc2UgewotaW9fZXJyb3I6Ci0JICAgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggLS07Ci0JICAgIHBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOwotCSAgICByZXR1cm4gSU9fRVJST1I7Ci0JfQotCXJlYWRhX2NvdW50ID0gMDsKLQlpZiAoZXhwZWN0ZWRfbGV2ZWwgPT0gLTEpCi0JCWV4cGVjdGVkX2xldmVsID0gU0JfVFJFRV9IRUlHSFQgKHBfc19zYik7Ci0JZXhwZWN0ZWRfbGV2ZWwgLS07Ci0KLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNjaGVkdWxlIG9jY3VycmVkLiBXZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGtleQotCSAgIHRvIHNlYXJjaCBpcyBzdGlsbCBpbiB0aGUgdHJlZSByb290ZWQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIElmCi0JICAgbm90IHRoZW4gcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290LiAqLwotCWlmICggZnNfY2hhbmdlZCAoZnNfZ2VuLCBwX3Nfc2IpICYmIAotCSAgICAoIUJfSVNfSU5fVFJFRSAocF9zX2JoKSB8fAotCSAgICAgQl9MRVZFTChwX3NfYmgpICE9IGV4cGVjdGVkX2xldmVsIHx8Ci0JICAgICAha2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYikpKSB7Ci0JICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkICk7Ci0JICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzYmtfcmVzdGFydGVkWyBleHBlY3RlZF9sZXZlbCAtIDEgXSApOwotCSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOwotCSAgICAKLQkgICAgLyogR2V0IHRoZSByb290IGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZXBlYXQgdGhlIHNlYXJjaAotCSAgICAgICBzdGFydGluZyBmcm9tIHRoZSByb290LiAqLwotCSAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7Ci0JICAgIGV4cGVjdGVkX2xldmVsID0gLTE7Ci0JICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7Ci0JICAgIAotCSAgICAvKiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QgKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAgIC8qIG9ubHkgY2hlY2sgdGhhdCB0aGUga2V5IGlzIGluIHRoZSBidWZmZXIgaWYgcF9zX2tleSBpcyBub3QKLSAgICAgICAgICAgZXF1YWwgdG8gdGhlIE1BWF9LRVkuIExhdHRlciBjYXNlIGlzIG9ubHkgcG9zc2libGUgaW4KLSAgICAgICAgICAgImZpbmlzaF91bmZpbmlzaGVkKCkiIHByb2Nlc3NpbmcgZHVyaW5nIG1vdW50LiAqLwotICAgICAgICBSRkFMU0UoIGNvbXBfa2V5cyggJk1BWF9LRVksIHBfc19rZXkgKSAmJgotICAgICAgICAgICAgICAgICEga2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYiksCi0JCSJQQVAtNTEzMDoga2V5IGlzIG5vdCBpbiB0aGUgYnVmZmVyIik7Ci0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JaWYgKCBjdXJfdGIgKSB7Ci0JICAgIHByaW50X2N1cl90YiAoIjUxNDAiKTsKLQkgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiUEFQLTUxNDA6IHNlYXJjaF9ieV9rZXk6IHNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7Ci0JfQotI2VuZGlmCi0KLQkvLyBtYWtlIHN1cmUsIHRoYXQgdGhlIG5vZGUgY29udGVudHMgbG9vayBsaWtlIGEgbm9kZSBvZgotCS8vIGNlcnRhaW4gbGV2ZWwKLQlpZiAoIWlzX3RyZWVfbm9kZSAocF9zX2JoLCBleHBlY3RlZF9sZXZlbCkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTE1MDogc2VhcmNoX2J5X2tleTogIgotCQkJICAgICAgImludmFsaWQgZm9ybWF0IGZvdW5kIGluIGJsb2NrICVsZC4gRnNjaz8iLAotCQkJICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIpOwotCSAgICBwYXRocmVsc2UgKHBfc19zZWFyY2hfcGF0aCk7Ci0JICAgIHJldHVybiBJT19FUlJPUjsKLQl9Ci0JCi0JLyogb2ssIHdlIGhhdmUgYWNxdWlyZWQgbmV4dCBmb3JtYXR0ZWQgbm9kZSBpbiB0aGUgdHJlZSAqLwotCW5fbm9kZV9sZXZlbCA9IEJfTEVWRUwgKHBfc19iaCk7Ci0KLQlQUk9DX0lORk9fQkhfU1RBVCggcF9zX3NiLCBwX3NfYmgsIG5fbm9kZV9sZXZlbCAtIDEgKTsKLQotCVJGQUxTRSggbl9ub2RlX2xldmVsIDwgbl9zdG9wX2xldmVsLAotCQkidnMtNTE1MjogdHJlZSBsZXZlbCAoJWQpIGlzIGxlc3MgdGhhbiBzdG9wIGxldmVsICglZCkiLAotCQluX25vZGVfbGV2ZWwsIG5fc3RvcF9sZXZlbCk7Ci0KLQluX3JldHZhbCA9IGJpbl9zZWFyY2goIHBfc19rZXksIEJfTl9QSVRFTV9IRUFEKHBfc19iaCwgMCksCi0gICAgICAgICAgICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAotICAgICAgICAgICAgICAgICggbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICkgPyBJSF9TSVpFIDogS0VZX1NJWkUsCi0gICAgICAgICAgICAgICAgJihwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbikpOwotCWlmIChuX25vZGVfbGV2ZWwgPT0gbl9zdG9wX2xldmVsKSB7Ci0JICAgIHJldHVybiBuX3JldHZhbDsKLQl9Ci0KLQkvKiB3ZSBhcmUgbm90IGluIHRoZSBzdG9wIGxldmVsICovCi0JaWYgKG5fcmV0dmFsID09IElURU1fRk9VTkQpCi0JICAgIC8qIGl0ZW0gaGFzIGJlZW4gZm91bmQsIHNvIHdlIGNob29zZSB0aGUgcG9pbnRlciB3aGljaCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGZvdW5kIG9uZSAqLwotCSAgICBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbisrOwotCi0JLyogaWYgaXRlbSB3YXMgbm90IGZvdW5kIHdlIGNob29zZSB0aGUgcG9zaXRpb24gd2hpY2ggaXMgdG8KLQkgICB0aGUgbGVmdCBvZiB0aGUgZm91bmQgaXRlbS4gVGhpcyByZXF1aXJlcyBubyBjb2RlLAotCSAgIGJpbl9zZWFyY2ggZGlkIGl0IGFscmVhZHkuKi8KLQotCS8qIFNvIHdlIGhhdmUgY2hvc2VuIGEgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcwotCSAgIGFuIGludGVybmFsIG5vZGUuICBOb3cgd2UgY2FsY3VsYXRlIGNoaWxkIGJsb2NrIG51bWJlciBieQotCSAgIHBvc2l0aW9uIGluIHRoZSBub2RlLiAqLwotCW5fYmxvY2tfbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfYmgsIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKTsKLQotCS8qIGlmIHdlIGFyZSBnb2luZyB0byByZWFkIGxlYWYgbm9kZXMsIHRyeSBmb3IgcmVhZCBhaGVhZCBhcyB3ZWxsICovCi0JaWYgKChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQSkgJiYKLQkgICAgbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSkKLQl7Ci0JICAgIGludCBwb3MgPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbjsKLQkgICAgaW50IGxpbWl0ID0gQl9OUl9JVEVNUyhwX3NfYmgpOwotCSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXk7Ci0KLQkgICAgaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCi0JCWxpbWl0ID0gMDsKLQkgICAgd2hpbGUocmVhZGFfY291bnQgPCBTRUFSQ0hfQllfS0VZX1JFQURBKSB7Ci0JCWlmIChwb3MgPT0gbGltaXQpCi0JCSAgICBicmVhazsKLQkgICAgICAgIHJlYWRhX2Jsb2Nrc1tyZWFkYV9jb3VudCsrXSA9IEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwb3MpOwotCQlpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKLQkJICAgIHBvcy0tOwotCQllbHNlCi0JCSAgICBwb3MrKzsKLQotCQkvKgotCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHNhbWUgb2JqZWN0Ci0JCSAqLwotCQlsZV9rZXkgPSBCX05fUERFTElNX0tFWShwX3NfYmgsIHBvcyk7Ci0JCWlmIChsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpICE9Ci0JCSAgICBwX3Nfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQotCQl7Ci0JCSAgICBicmVhazsKKwkJLyogUmVhZCB0aGUgbmV4dCB0cmVlIG5vZGUsIGFuZCBzZXQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcGF0aCB0bworCQkgICBoYXZlIGEgcG9pbnRlciB0byBpdC4gKi8KKwkJaWYgKChwX3NfYmggPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9idWZmZXIgPQorCQkgICAgIHNiX2dldGJsayhwX3Nfc2IsIG5fYmxvY2tfbnVtYmVyKSkpIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkgJiYgcmVhZGFfY291bnQgPiAxKSB7CisJCQkJc2VhcmNoX2J5X2tleV9yZWFkYShwX3Nfc2IsIHJlYWRhX2JoLAorCQkJCQkJICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOworCQkJfQorCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJnBfc19iaCk7CisJCQl3YWl0X29uX2J1ZmZlcihwX3NfYmgpOworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSkKKwkJCQlnb3RvIGlvX2Vycm9yOworCQl9IGVsc2UgeworCQkgICAgICBpb19lcnJvcjoKKwkJCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGgtLTsKKwkJCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCQkJcmV0dXJuIElPX0VSUk9SOwogCQl9Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KKwkJcmVhZGFfY291bnQgPSAwOworCQlpZiAoZXhwZWN0ZWRfbGV2ZWwgPT0gLTEpCisJCQlleHBlY3RlZF9sZXZlbCA9IFNCX1RSRUVfSEVJR0hUKHBfc19zYik7CisJCWV4cGVjdGVkX2xldmVsLS07CiAKKwkJLyogSXQgaXMgcG9zc2libGUgdGhhdCBzY2hlZHVsZSBvY2N1cnJlZC4gV2UgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBrZXkKKwkJICAgdG8gc2VhcmNoIGlzIHN0aWxsIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlci4gSWYKKwkJICAgbm90IHRoZW4gcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290LiAqLworCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIHBfc19zYikgJiYKKwkJICAgICghQl9JU19JTl9UUkVFKHBfc19iaCkgfHwKKwkJICAgICBCX0xFVkVMKHBfc19iaCkgIT0gZXhwZWN0ZWRfbGV2ZWwgfHwKKwkJICAgICAha2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYikpKSB7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZCk7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwKKwkJCQkgICAgICBzYmtfcmVzdGFydGVkW2V4cGVjdGVkX2xldmVsIC0gMV0pOworCQkJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3NlYXJjaF9wYXRoKTsKKworCQkJLyogR2V0IHRoZSByb290IGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZXBlYXQgdGhlIHNlYXJjaAorCQkJICAgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdC4gKi8KKwkJCW5fYmxvY2tfbnVtYmVyID0gU0JfUk9PVF9CTE9DSyhwX3Nfc2IpOworCQkJZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKwkJCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisKKwkJCS8qIHJlcGVhdCBzZWFyY2ggZnJvbSB0aGUgcm9vdCAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBvbmx5IGNoZWNrIHRoYXQgdGhlIGtleSBpcyBpbiB0aGUgYnVmZmVyIGlmIHBfc19rZXkgaXMgbm90CisJCSAgIGVxdWFsIHRvIHRoZSBNQVhfS0VZLiBMYXR0ZXIgY2FzZSBpcyBvbmx5IHBvc3NpYmxlIGluCisJCSAgICJmaW5pc2hfdW5maW5pc2hlZCgpIiBwcm9jZXNzaW5nIGR1cmluZyBtb3VudC4gKi8KKwkJUkZBTFNFKGNvbXBfa2V5cygmTUFYX0tFWSwgcF9zX2tleSkgJiYKKwkJICAgICAgICFrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSwKKwkJICAgICAgICJQQVAtNTEzMDoga2V5IGlzIG5vdCBpbiB0aGUgYnVmZmVyIik7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCWlmIChjdXJfdGIpIHsKKwkJCXByaW50X2N1cl90YigiNTE0MCIpOworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiUEFQLTUxNDA6IHNlYXJjaF9ieV9rZXk6IHNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7CisJCX0KKyNlbmRpZgorCisJCS8vIG1ha2Ugc3VyZSwgdGhhdCB0aGUgbm9kZSBjb250ZW50cyBsb29rIGxpa2UgYSBub2RlIG9mCisJCS8vIGNlcnRhaW4gbGV2ZWwKKwkJaWYgKCFpc190cmVlX25vZGUocF9zX2JoLCBleHBlY3RlZF9sZXZlbCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAidnMtNTE1MDogc2VhcmNoX2J5X2tleTogIgorCQkJCQkgImludmFsaWQgZm9ybWF0IGZvdW5kIGluIGJsb2NrICVsZC4gRnNjaz8iLAorCQkJCQkgcF9zX2JoLT5iX2Jsb2NrbnIpOworCQkJcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJCQlyZXR1cm4gSU9fRVJST1I7CisJCX0KKworCQkvKiBvaywgd2UgaGF2ZSBhY3F1aXJlZCBuZXh0IGZvcm1hdHRlZCBub2RlIGluIHRoZSB0cmVlICovCisJCW5fbm9kZV9sZXZlbCA9IEJfTEVWRUwocF9zX2JoKTsKKworCQlQUk9DX0lORk9fQkhfU1RBVChwX3Nfc2IsIHBfc19iaCwgbl9ub2RlX2xldmVsIC0gMSk7CisKKwkJUkZBTFNFKG5fbm9kZV9sZXZlbCA8IG5fc3RvcF9sZXZlbCwKKwkJICAgICAgICJ2cy01MTUyOiB0cmVlIGxldmVsICglZCkgaXMgbGVzcyB0aGFuIHN0b3AgbGV2ZWwgKCVkKSIsCisJCSAgICAgICBuX25vZGVfbGV2ZWwsIG5fc3RvcF9sZXZlbCk7CisKKwkJbl9yZXR2YWwgPSBiaW5fc2VhcmNoKHBfc19rZXksIEJfTl9QSVRFTV9IRUFEKHBfc19iaCwgMCksCisJCQkJICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAorCQkJCSAgICAgIChuX25vZGVfbGV2ZWwgPT0KKwkJCQkgICAgICAgRElTS19MRUFGX05PREVfTEVWRUwpID8gSUhfU0laRSA6CisJCQkJICAgICAgS0VZX1NJWkUsCisJCQkJICAgICAgJihwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbikpOworCQlpZiAobl9ub2RlX2xldmVsID09IG5fc3RvcF9sZXZlbCkgeworCQkJcmV0dXJuIG5fcmV0dmFsOworCQl9CisKKwkJLyogd2UgYXJlIG5vdCBpbiB0aGUgc3RvcCBsZXZlbCAqLworCQlpZiAobl9yZXR2YWwgPT0gSVRFTV9GT1VORCkKKwkJCS8qIGl0ZW0gaGFzIGJlZW4gZm91bmQsIHNvIHdlIGNob29zZSB0aGUgcG9pbnRlciB3aGljaCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGZvdW5kIG9uZSAqLworCQkJcF9zX2xhc3RfZWxlbWVudC0+cGVfcG9zaXRpb24rKzsKKworCQkvKiBpZiBpdGVtIHdhcyBub3QgZm91bmQgd2UgY2hvb3NlIHRoZSBwb3NpdGlvbiB3aGljaCBpcyB0bworCQkgICB0aGUgbGVmdCBvZiB0aGUgZm91bmQgaXRlbS4gVGhpcyByZXF1aXJlcyBubyBjb2RlLAorCQkgICBiaW5fc2VhcmNoIGRpZCBpdCBhbHJlYWR5LiAqLworCisJCS8qIFNvIHdlIGhhdmUgY2hvc2VuIGEgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcworCQkgICBhbiBpbnRlcm5hbCBub2RlLiAgTm93IHdlIGNhbGN1bGF0ZSBjaGlsZCBibG9jayBudW1iZXIgYnkKKwkJICAgcG9zaXRpb24gaW4gdGhlIG5vZGUuICovCisJCW5fYmxvY2tfbnVtYmVyID0KKwkJICAgIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbik7CisKKwkJLyogaWYgd2UgYXJlIGdvaW5nIHRvIHJlYWQgbGVhZiBub2RlcywgdHJ5IGZvciByZWFkIGFoZWFkIGFzIHdlbGwgKi8KKwkJaWYgKChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQSkgJiYKKwkJICAgIG5fbm9kZV9sZXZlbCA9PSBESVNLX0xFQUZfTk9ERV9MRVZFTCArIDEpIHsKKwkJCWludCBwb3MgPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbjsKKwkJCWludCBsaW1pdCA9IEJfTlJfSVRFTVMocF9zX2JoKTsKKwkJCXN0cnVjdCByZWlzZXJmc19rZXkgKmxlX2tleTsKKworCQkJaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCisJCQkJbGltaXQgPSAwOworCQkJd2hpbGUgKHJlYWRhX2NvdW50IDwgU0VBUkNIX0JZX0tFWV9SRUFEQSkgeworCQkJCWlmIChwb3MgPT0gbGltaXQpCisJCQkJCWJyZWFrOworCQkJCXJlYWRhX2Jsb2Nrc1tyZWFkYV9jb3VudCsrXSA9CisJCQkJICAgIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwb3MpOworCQkJCWlmIChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQV9CQUNLKQorCQkJCQlwb3MtLTsKKwkJCQllbHNlCisJCQkJCXBvcysrOworCisJCQkJLyoKKwkJCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHNhbWUgb2JqZWN0CisJCQkJICovCisJCQkJbGVfa2V5ID0gQl9OX1BERUxJTV9LRVkocF9zX2JoLCBwb3MpOworCQkJCWlmIChsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpICE9CisJCQkJICAgIHBfc19rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQogCiAvKiBGb3JtIHRoZSBwYXRoIHRvIGFuIGl0ZW0gYW5kIHBvc2l0aW9uIGluIHRoaXMgaXRlbSB3aGljaCBjb250YWlucwogICAgZmlsZSBieXRlIGRlZmluZWQgYnkgcF9zX2tleS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtCkBAIC03ODAsOTQgKzgxMiw5NyBAQAogICAgdW5pdHMgb2YgZGlyZWN0b3J5IGVudHJpZXMuICAqLwogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IsICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2suICAgICAgICAgICovCi0JCQkJY29uc3Qgc3RydWN0IGNwdV9rZXkgICogcF9jcHVfa2V5LCAgICAgIC8qIEtleSB0byBzZWFyY2ggKGNwdSB2YXJpYWJsZSkgICAgICAgICAqLwotCQkJCXN0cnVjdCBwYXRoICAgICAgICAgKiBwX3Nfc2VhcmNoX3BhdGggLyogRmlsbGVkIHVwIGJ5IHRoaXMgZnVuY3Rpb24uICAgICAgICAgICovCi0gICAgKSB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWg7IC8qIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9ibGtfc2l6ZTsKLSAgICBsb2ZmX3QgaXRlbV9vZmZzZXQsIG9mZnNldDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIGludCByZXR2YWw7CitpbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrLiAgICAgICAgICAqLworCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX2NwdV9rZXksCS8qIEtleSB0byBzZWFyY2ggKGNwdSB2YXJpYWJsZSkgICAgICAgICAqLworCQkJICAgICAgIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgJLyogRmlsbGVkIHVwIGJ5IHRoaXMgZnVuY3Rpb24uICAgICAgICAgICovCisgICAgKQoreworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWg7CS8qIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgKi8KKwlpbnQgbl9ibGtfc2l6ZTsKKwlsb2ZmX3QgaXRlbV9vZmZzZXQsIG9mZnNldDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCWludCByZXR2YWw7CiAKLSAgICAvKiBJZiBzZWFyY2hpbmcgZm9yIGRpcmVjdG9yeSBlbnRyeS4gKi8KLSAgICBpZiAoIGlzX2RpcmVudHJ5X2NwdV9rZXkgKHBfY3B1X2tleSkgKQotCXJldHVybiAgc2VhcmNoX2J5X2VudHJ5X2tleSAocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCwgJmRlKTsKKwkvKiBJZiBzZWFyY2hpbmcgZm9yIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwlpZiAoaXNfZGlyZW50cnlfY3B1X2tleShwX2NwdV9rZXkpKQorCQlyZXR1cm4gc2VhcmNoX2J5X2VudHJ5X2tleShwX3Nfc2IsIHBfY3B1X2tleSwgcF9zX3NlYXJjaF9wYXRoLAorCQkJCQkgICAmZGUpOwogCi0gICAgLyogSWYgbm90IHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLwotICAgIAotICAgIC8qIElmIGl0ZW0gaXMgZm91bmQuICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHBfc19zYiwgcF9jcHVfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpCi0JcmV0dXJuIHJldHZhbDsKLSAgICBpZiAoIHJldHZhbCA9PSBJVEVNX0ZPVU5EICkgIHsKKwkvKiBJZiBub3Qgc2VhcmNoaW5nIGZvciBkaXJlY3RvcnkgZW50cnkuICovCiAKLQlSRkFMU0UoICEgaWhfaXRlbV9sZW4oCi0gICAgICAgICAgICAgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwKLQkJCSAgICAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSkpLAotCSAgICAgICAgIlBBUC01MTY1OiBpdGVtIGxlbmd0aCBlcXVhbHMgemVybyIpOworCS8qIElmIGl0ZW0gaXMgZm91bmQuICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0ocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKIAotCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgPSAwOwotCXJldHVybiBQT1NJVElPTl9GT1VORDsKLSAgICB9CisJCVJGQUxTRSghaWhfaXRlbV9sZW4KKwkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJKFBBVEhfUExBU1RfQlVGRkVSKHBfc19zZWFyY2hfcGF0aCksCisJCQkgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpKSwKKwkJICAgICAgICJQQVAtNTE2NTogaXRlbSBsZW5ndGggZXF1YWxzIHplcm8iKTsKIAotICAgIFJGQUxTRSggISBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSwKLQkgICAgIlBBUC01MTcwOiBwb3NpdGlvbiBlcXVhbHMgemVybyIpOwotCi0gICAgLyogSXRlbSBpcyBub3QgZm91bmQuIFNldCBwYXRoIHRvIHRoZSBwcmV2aW91cyBpdGVtLiAqLwotICAgIHBfbGVfaWggPSBCX05fUElURU1fSEVBRChQQVRIX1BMQVNUX0JVRkZFUihwX3Nfc2VhcmNoX3BhdGgpLCAtLVBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpKTsKLSAgICBuX2Jsa19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKLQotICAgIGlmIChjb21wX3Nob3J0X2tleXMgKCYocF9sZV9paC0+aWhfa2V5KSwgcF9jcHVfa2V5KSkgewotCXJldHVybiBGSUxFX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogcXVpdGUgdWdseSB0aGlzIGZhcgotCi0gICAgaXRlbV9vZmZzZXQgPSBsZV9paF9rX29mZnNldCAocF9sZV9paCk7Ci0gICAgb2Zmc2V0ID0gY3B1X2tleV9rX29mZnNldCAocF9jcHVfa2V5KTsKLQotICAgIC8qIE5lZWRlZCBieXRlIGlzIGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBwYXRoLiovCi0gICAgaWYgKGl0ZW1fb2Zmc2V0IDw9IG9mZnNldCAmJgotCWl0ZW1fb2Zmc2V0ICsgb3BfYnl0ZXNfbnVtYmVyIChwX2xlX2loLCBuX2Jsa19zaXplKSA+IG9mZnNldCkgewotCXBvc19pbl9pdGVtIChwX3Nfc2VhcmNoX3BhdGgpID0gb2Zmc2V0IC0gaXRlbV9vZmZzZXQ7Ci0JaWYgKCBpc19pbmRpcmVjdF9sZV9paChwX2xlX2loKSApIHsKLQkgICAgcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgLz0gbl9ibGtfc2l6ZTsKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IDA7CisJCXJldHVybiBQT1NJVElPTl9GT1VORDsKIAl9Ci0JcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOwotICAgIH0KIAotICAgIC8qIE5lZWRlZCBieXRlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUKLSAgICAgcGF0aC4gU2V0IHBvc19pbl9pdGVtIG91dCBvZiB0aGUgaXRlbS4gKi8KLSAgICBpZiAoIGlzX2luZGlyZWN0X2xlX2loIChwX2xlX2loKSApCi0JcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBpaF9pdGVtX2xlbihwX2xlX2loKSAvIFVORk1fUF9TSVpFOwotICAgIGVsc2UKLSAgICAgICAgcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBpaF9pdGVtX2xlbiggcF9sZV9paCApOwotICAKLSAgICByZXR1cm4gUE9TSVRJT05fTk9UX0ZPVU5EOworCVJGQUxTRSghUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCksCisJICAgICAgICJQQVAtNTE3MDogcG9zaXRpb24gZXF1YWxzIHplcm8iKTsKKworCS8qIEl0ZW0gaXMgbm90IGZvdW5kLiBTZXQgcGF0aCB0byB0aGUgcHJldmlvdXMgaXRlbS4gKi8KKwlwX2xlX2loID0KKwkgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwKKwkJCSAgIC0tUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpOworCW5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCisJaWYgKGNvbXBfc2hvcnRfa2V5cygmKHBfbGVfaWgtPmloX2tleSksIHBfY3B1X2tleSkpIHsKKwkJcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOworCX0KKwkvLyBGSVhNRTogcXVpdGUgdWdseSB0aGlzIGZhcgorCisJaXRlbV9vZmZzZXQgPSBsZV9paF9rX29mZnNldChwX2xlX2loKTsKKwlvZmZzZXQgPSBjcHVfa2V5X2tfb2Zmc2V0KHBfY3B1X2tleSk7CisKKwkvKiBOZWVkZWQgYnl0ZSBpcyBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4gKi8KKwlpZiAoaXRlbV9vZmZzZXQgPD0gb2Zmc2V0ICYmCisJICAgIGl0ZW1fb2Zmc2V0ICsgb3BfYnl0ZXNfbnVtYmVyKHBfbGVfaWgsIG5fYmxrX3NpemUpID4gb2Zmc2V0KSB7CisJCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgPSBvZmZzZXQgLSBpdGVtX29mZnNldDsKKwkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpKSB7CisJCQlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpIC89IG5fYmxrX3NpemU7CisJCX0KKwkJcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOworCX0KKworCS8qIE5lZWRlZCBieXRlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUKKwkgICBwYXRoLiBTZXQgcG9zX2luX2l0ZW0gb3V0IG9mIHRoZSBpdGVtLiAqLworCWlmIChpc19pbmRpcmVjdF9sZV9paChwX2xlX2loKSkKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9CisJCSAgICBpaF9pdGVtX2xlbihwX2xlX2loKSAvIFVORk1fUF9TSVpFOworCWVsc2UKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKHBfbGVfaWgpOworCisJcmV0dXJuIFBPU0lUSU9OX05PVF9GT1VORDsKIH0KIAotCiAvKiBDb21wYXJlIGdpdmVuIGl0ZW0gYW5kIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4gKi8KLWludCBjb21wX2l0ZW1zIChjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoKQoraW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogaWg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgICAvKiBMYXN0IGJ1ZmZlciBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCkpICkKLQlyZXR1cm4gMTsKKwkvKiBMYXN0IGJ1ZmZlciBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCisJaWYgKCFCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpKSkKKwkJcmV0dXJuIDE7CiAKLSAgICAvKiBMYXN0IHBhdGggcG9zaXRpb24gaXMgaW52YWxpZC4gKi8KLSAgICBpZiAoIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgPj0gQl9OUl9JVEVNUyhwX3NfYmgpICkKLQlyZXR1cm4gMTsKKwkvKiBMYXN0IHBhdGggcG9zaXRpb24gaXMgaW52YWxpZC4gKi8KKwlpZiAoUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSA+PSBCX05SX0lURU1TKHBfc19iaCkpCisJCXJldHVybiAxOwogCi0gICAgLyogd2UgbmVlZCBvbmx5IHRvIGtub3csIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgaXRlbSAqLwotICAgIGloID0gZ2V0X2loIChwX3NfcGF0aCk7Ci0gICAgcmV0dXJuIG1lbWNtcCAoc3RvcmVkX2loLCBpaCwgSUhfU0laRSk7CisJLyogd2UgbmVlZCBvbmx5IHRvIGtub3csIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgaXRlbSAqLworCWloID0gZ2V0X2loKHBfc19wYXRoKTsKKwlyZXR1cm4gbWVtY21wKHN0b3JlZF9paCwgaWgsIElIX1NJWkUpOwogfQogCi0KIC8qIHVuZm9ybWF0dGVkIG5vZGVzIGFyZSBub3QgbG9nZ2VkIGFueW1vcmUsIGV2ZXIuICBUaGlzIGlzIHNhZmUKICoqIG5vdwogKi8KQEAgLTg3Niw0NjEgKzkxMSw0NjYgQEAKIC8vIGJsb2NrIGNhbiBub3QgYmUgZm9yZ290dGVuIGFzIGl0IGlzIGluIEkvTyBvciBoZWxkIGJ5IHNvbWVvbmUKICNkZWZpbmUgYmxvY2tfaW5fdXNlKGJoKSAoYnVmZmVyX2xvY2tlZChiaCkgfHwgKGhlbGRfYnlfb3RoZXJzKGJoKSkpCiAKLQotCiAvLyBwcmVwYXJlIGZvciBkZWxldGUgb3IgY3V0IG9mIGRpcmVjdCBpdGVtCi1zdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2Zvcl9kaXJlY3RfaXRlbSAoc3RydWN0IHBhdGggKiBwYXRoLAotCQkJCQkgICBzdHJ1Y3QgaXRlbV9oZWFkICogbGVfaWgsCi0JCQkJCSAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCQkgICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLAotCQkJCQkgICBpbnQgKiBjdXRfc2l6ZSkKK3N0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtKHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCQkgIHN0cnVjdCBpdGVtX2hlYWQgKmxlX2loLAorCQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwgaW50ICpjdXRfc2l6ZSkKIHsKLSAgICBsb2ZmX3Qgcm91bmRfbGVuOworCWxvZmZfdCByb3VuZF9sZW47CiAKKwlpZiAobmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpKSB7CisJCS8qIGl0ZW0gaGFzIHRvIGJlIGRlbGV0ZWQgKi8KKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOworCX0KKwkvLyBuZXcgZmlsZSBnZXRzIHRydW5jYXRlZAorCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzYpIHsKKwkJLy8gCisJCXJvdW5kX2xlbiA9IFJPVU5EX1VQKG5ld19maWxlX2xlbmd0aCk7CisJCS8qIHRoaXMgd2FzIG5fbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWggLi4uICovCisJCWlmIChyb3VuZF9sZW4gPCBsZV9paF9rX29mZnNldChsZV9paCkpIHsKKwkJCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJCQlyZXR1cm4gTV9ERUxFVEU7CS8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisJCX0KKwkJLyogQ2FsY3VsYXRlIGZpcnN0IHBvc2l0aW9uIGFuZCBzaXplIGZvciBjdXR0aW5nIGZyb20gaXRlbS4gKi8KKwkJcG9zX2luX2l0ZW0ocGF0aCkgPSByb3VuZF9sZW4gLSAobGVfaWhfa19vZmZzZXQobGVfaWgpIC0gMSk7CisJCSpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0gcG9zX2luX2l0ZW0ocGF0aCkpOwogCi0gICAgaWYgKCBuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpICkgewotCS8qIGl0ZW0gaGFzIHRvIGJlIGRlbGV0ZWQgKi8KLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsKLSAgICB9Ci0JCi0gICAgLy8gbmV3IGZpbGUgZ2V0cyB0cnVuY2F0ZWQKLSAgICBpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNikgewotCS8vIAotCXJvdW5kX2xlbiA9IFJPVU5EX1VQIChuZXdfZmlsZV9sZW5ndGgpOyAKLQkvKiB0aGlzIHdhcyBuX25ld19maWxlX2xlbmd0aCA8IGxlX2loIC4uLiAqLwotCWlmICggcm91bmRfbGVuIDwgbGVfaWhfa19vZmZzZXQgKGxlX2loKSApICB7Ci0JICAgICpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JICAgIHJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KKwkJcmV0dXJuIE1fQ1VUOwkvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCisJfQorCisJLy8gb2xkIGZpbGU6IGl0ZW1zIG1heSBoYXZlIGFueSBsZW5ndGgKKworCWlmIChuZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldChsZV9paCkpIHsKKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOwkvKiBEZWxldGUgdGhpcyBpdGVtLiAqLwogCX0KIAkvKiBDYWxjdWxhdGUgZmlyc3QgcG9zaXRpb24gYW5kIHNpemUgZm9yIGN1dHRpbmcgZnJvbSBpdGVtLiAqLwotCXBvc19pbl9pdGVtIChwYXRoKSA9IHJvdW5kX2xlbiAtIChsZV9paF9rX29mZnNldCAobGVfaWgpIC0gMSk7Ci0JKmN1dF9zaXplID0gLShpaF9pdGVtX2xlbihsZV9paCkgLSBwb3NfaW5faXRlbShwYXRoKSk7Ci0JCi0JcmV0dXJuIE1fQ1VUOyAvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCi0gICAgfQotCi0KLSAgICAvLyBvbGQgZmlsZTogaXRlbXMgbWF5IGhhdmUgYW55IGxlbmd0aAotCi0gICAgaWYgKCBuZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldCAobGVfaWgpICkgIHsKLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KLSAgICB9Ci0gICAgLyogQ2FsY3VsYXRlIGZpcnN0IHBvc2l0aW9uIGFuZCBzaXplIGZvciBjdXR0aW5nIGZyb20gaXRlbS4gKi8KLSAgICAqY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKGxlX2loKSAtCi0JCSAgICAgIChwb3NfaW5faXRlbSAocGF0aCkgPSBuZXdfZmlsZV9sZW5ndGggKyAxIC0gbGVfaWhfa19vZmZzZXQgKGxlX2loKSkpOwotICAgIHJldHVybiBNX0NVVDsgLyogQ3V0IGZyb20gdGhpcyBpdGVtLiAqLworCSpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0KKwkJICAgICAgKHBvc19pbl9pdGVtKHBhdGgpID0KKwkJICAgICAgIG5ld19maWxlX2xlbmd0aCArIDEgLSBsZV9paF9rX29mZnNldChsZV9paCkpKTsKKwlyZXR1cm4gTV9DVVQ7CQkvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCiB9CiAKLQotc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbSAoc3RydWN0IHBhdGggKiBwYXRoLAotCQkJCQkgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCQkJICAgICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLAotCQkJCQkgICAgIGludCAqIGN1dF9zaXplKQorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbShzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKmxlX2loLAorCQkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCisJCQkJCSAgICBpbnQgKmN1dF9zaXplKQogewotICAgIGlmIChsZV9paF9rX29mZnNldCAobGVfaWgpID09IERPVF9PRkZTRVQgJiYgCi0JbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSkgewotCVJGQUxTRSggaWhfZW50cnlfY291bnQgKGxlX2loKSAhPSAyLAotCSAgICAgICAgIlBBUC01MjIwOiBpbmNvcnJlY3QgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKCVoKSIsIGxlX2loKTsKLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyeS4gKi8KLSAgICB9Ci0gICAgCi0gICAgaWYgKCBpaF9lbnRyeV9jb3VudCAobGVfaWgpID09IDEgKSAgewotCS8qIERlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0ZW0gc3VjaCBhcyB0aGVyZSBpcyBvbmUgcmVjb3JkIG9ubHkKLQkgICBpbiB0aGlzIGl0ZW0qLwotCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOwotICAgIH0KLSAgICAKLSAgICAvKiBDdXQgb25lIHJlY29yZCBmcm9tIHRoZSBkaXJlY3RvcnkgaXRlbS4gKi8KLSAgICAqY3V0X3NpemUgPSAtKERFSF9TSVpFICsgZW50cnlfbGVuZ3RoIChnZXRfbGFzdF9iaCAocGF0aCksIGxlX2loLCBwb3NfaW5faXRlbSAocGF0aCkpKTsKLSAgICByZXR1cm4gTV9DVVQ7IAotfQorCWlmIChsZV9paF9rX29mZnNldChsZV9paCkgPT0gRE9UX09GRlNFVCAmJgorCSAgICBuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSkpIHsKKwkJUkZBTFNFKGloX2VudHJ5X2NvdW50KGxlX2loKSAhPSAyLAorCQkgICAgICAgIlBBUC01MjIwOiBpbmNvcnJlY3QgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKCVoKSIsIGxlX2loKTsKKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOwkvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJ5LiAqLworCX0KIAorCWlmIChpaF9lbnRyeV9jb3VudChsZV9paCkgPT0gMSkgeworCQkvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIHN1Y2ggYXMgdGhlcmUgaXMgb25lIHJlY29yZCBvbmx5CisJCSAgIGluIHRoaXMgaXRlbSAqLworCQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CisJfQorCisJLyogQ3V0IG9uZSByZWNvcmQgZnJvbSB0aGUgZGlyZWN0b3J5IGl0ZW0uICovCisJKmN1dF9zaXplID0KKwkgICAgLShERUhfU0laRSArCisJICAgICAgZW50cnlfbGVuZ3RoKGdldF9sYXN0X2JoKHBhdGgpLCBsZV9paCwgcG9zX2luX2l0ZW0ocGF0aCkpKTsKKwlyZXR1cm4gTV9DVVQ7Cit9CiAKIC8qICBJZiB0aGUgcGF0aCBwb2ludHMgdG8gYSBkaXJlY3Rvcnkgb3IgZGlyZWN0IGl0ZW0sIGNhbGN1bGF0ZSBtb2RlIGFuZCB0aGUgc2l6ZSBjdXQsIGZvciBiYWxhbmNlLgogICAgIElmIHRoZSBwYXRoIHBvaW50cyB0byBhbiBpbmRpcmVjdCBpdGVtLCByZW1vdmUgc29tZSBudW1iZXIgb2YgaXRzIHVuZm9ybWF0dGVkIG5vZGVzLgogICAgIEluIGNhc2Ugb2YgZmlsZSB0cnVuY2F0ZSBjYWxjdWxhdGUgd2hldGhlciB0aGlzIGl0ZW0gbXVzdCBiZSBkZWxldGVkL3RydW5jYXRlZCBvciBsYXN0CiAgICAgdW5mb3JtYXR0ZWQgbm9kZSBvZiB0aGlzIGl0ZW0gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBkaXJlY3QgaXRlbS4KICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkZXRlcm1pbmF0aW9uIG9mIHdoYXQgYmFsYW5jZSBtb2RlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBlbXBsb3kuICovCi1zdGF0aWMgY2hhciAgcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCgKLQkJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2l0ZW1fa2V5LAotCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICogcF9uX3JlbW92ZWQsICAgICAgLyogTnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIHdlcmUgcmVtb3ZlZAotCQkJCQkJCQkJCSAgZnJvbSBlbmQgb2YgdGhlIGZpbGUuICovCi0JCQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgKiBwX25fY3V0X3NpemUsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICBuX25ld19maWxlX2xlbmd0aCAvKiBNQVhfS0VZX09GRlNFVCBpbiBjYXNlIG9mIGRlbGV0ZS4gKi8KLSAgICApIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiID0gaW5vZGUtPmlfc2I7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7CitzdGF0aWMgY2hhciBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksIGludCAqcF9uX3JlbW92ZWQsCS8qIE51bWJlciBvZiB1bmZvcm1hdHRlZCBub2RlcyB3aGljaCB3ZXJlIHJlbW92ZWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBmcm9tIGVuZCBvZiB0aGUgZmlsZS4gKi8KKwkJCQkgICAgICBpbnQgKnBfbl9jdXRfc2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nIG5fbmV3X2ZpbGVfbGVuZ3RoCS8qIE1BWF9LRVlfT0ZGU0VUIGluIGNhc2Ugb2YgZGVsZXRlLiAqLworICAgICkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogU3RhdF9kYXRhIGl0ZW0uICovCi0gICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKSB7CisJLyogU3RhdF9kYXRhIGl0ZW0uICovCisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKSB7CiAKLQlSRkFMU0UoIG5fbmV3X2ZpbGVfbGVuZ3RoICE9IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSwKLQkJIlBBUC01MjEwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKKwkJUkZBTFNFKG5fbmV3X2ZpbGVfbGVuZ3RoICE9IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpLAorCQkgICAgICAgIlBBUC01MjEwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKIAotCSpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihwX2xlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOwotICAgIH0KKwkJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfbGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOworCX0KIAorCS8qIERpcmVjdG9yeSBpdGVtLiAqLworCWlmIChpc19kaXJlbnRyeV9sZV9paChwX2xlX2loKSkKKwkJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0ocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLAorCQkJCQkJIG5fbmV3X2ZpbGVfbGVuZ3RoLAorCQkJCQkJIHBfbl9jdXRfc2l6ZSk7CiAKLSAgICAvKiBEaXJlY3RvcnkgaXRlbS4gKi8KLSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwX2xlX2loKSApCi0JcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0gKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CisJLyogRGlyZWN0IGl0ZW0uICovCisJaWYgKGlzX2RpcmVjdF9sZV9paChwX2xlX2loKSkKKwkJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwKKwkJCQkJICAgICAgIG5fbmV3X2ZpbGVfbGVuZ3RoLCBwX25fY3V0X3NpemUpOwogCi0gICAgLyogRGlyZWN0IGl0ZW0uICovCi0gICAgaWYgKCBpc19kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKLQlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0gKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CisJLyogQ2FzZSBvZiBhbiBpbmRpcmVjdCBpdGVtLiAqLworCXsKKwkJaW50IG5fdW5mbV9udW1iZXIsCS8qIE51bWJlciBvZiB0aGUgaXRlbSB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwkJIG5fY291bnRlciwgbl9ibGtfc2l6ZTsKKwkJX19sZTMyICpwX25fdW5mbV9wb2ludGVyOwkvKiBQb2ludGVyIHRvIHRoZSB1bmZvcm1hdHRlZCBub2RlIG51bWJlci4gKi8KKwkJX191MzIgdG1wOworCQlzdHJ1Y3QgaXRlbV9oZWFkIHNfaWg7CS8qIEl0ZW0gaGVhZGVyLiAqLworCQljaGFyIGNfbW9kZTsJLyogUmV0dXJuZWQgbW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KKwkJaW50IG5lZWRfcmVzZWFyY2g7CiAKKwkJbl9ibGtfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CiAKLSAgICAvKiBDYXNlIG9mIGFuIGluZGlyZWN0IGl0ZW0uICovCi0gICAgewotCWludCAgICAgICAgICAgICAgICAgICBuX3VuZm1fbnVtYmVyLCAgICAvKiBOdW1iZXIgb2YgdGhlIGl0ZW0gdW5mb3JtYXR0ZWQgbm9kZXMuICovCi0JICAgIG5fY291bnRlciwKLQkgICAgbl9ibGtfc2l6ZTsKLQlfX2xlMzIgICAgICAgICAgICAgICAqIHBfbl91bmZtX3BvaW50ZXI7IC8qIFBvaW50ZXIgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgbnVtYmVyLiAqLwotCV9fdTMyIHRtcDsKLQlzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsgICAgICAgICAgIC8qIEl0ZW0gaGVhZGVyLiAqLwotCWNoYXIgICAgICAgICAgICAgICAgICBjX21vZGU7ICAgICAgICAgICAvKiBSZXR1cm5lZCBtb2RlIG9mIHRoZSBiYWxhbmNlLiAqLwotCWludCBuZWVkX3Jlc2VhcmNoOworCQkvKiBTZWFyY2ggZm9yIHRoZSBuZWVkZWQgb2JqZWN0IGluZGlyZWN0IGl0ZW0gdW50aWwgdGhlcmUgYXJlIG5vIHVuZm9ybWF0dGVkIG5vZGVzIHRvIGJlIHJlbW92ZWQuICovCisJCWRvIHsKKwkJCW5lZWRfcmVzZWFyY2ggPSAwOworCQkJcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOworCQkJLyogQ29weSBpbmRpcmVjdCBpdGVtIGhlYWRlciB0byBhIHRlbXAgdmFyaWFibGUuICovCisJCQljb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7CisJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoaXMgaXRlbS4gKi8KKwkJCW5fdW5mbV9udW1iZXIgPSBJX1VORk1fTlVNKCZzX2loKTsKIAorCQkJUkZBTFNFKCFpc19pbmRpcmVjdF9sZV9paCgmc19paCkgfHwgIW5fdW5mbV9udW1iZXIgfHwKKwkJCSAgICAgICBwb3NfaW5faXRlbShwX3NfcGF0aCkgKyAxICE9IG5fdW5mbV9udW1iZXIsCisJCQkgICAgICAgIlBBUC01MjQwOiBpbnZhbGlkIGl0ZW0gJWggIgorCQkJICAgICAgICJuX3VuZm1fbnVtYmVyID0gJWQgKnBfbl9wb3NfaW5faXRlbSA9ICVkIiwKKwkJCSAgICAgICAmc19paCwgbl91bmZtX251bWJlciwgcG9zX2luX2l0ZW0ocF9zX3BhdGgpKTsKIAotCW5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCQkJLyogQ2FsY3VsYXRlIGJhbGFuY2UgbW9kZSBhbmQgcG9zaXRpb24gaW4gdGhlIGl0ZW0gdG8gcmVtb3ZlIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCQkJaWYgKG5fbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpKSB7CS8qIENhc2Ugb2YgZGVsZXRlLiAqLworCQkJCXBvc19pbl9pdGVtKHBfc19wYXRoKSA9IDA7CisJCQkJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7CisJCQkJY19tb2RlID0gTV9ERUxFVEU7CisJCQl9IGVsc2UgewkvKiBDYXNlIG9mIHRydW5jYXRlLiAqLworCQkJCWlmIChuX25ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0KCZzX2loKSkgeworCQkJCQlwb3NfaW5faXRlbShwX3NfcGF0aCkgPSAwOworCQkJCQkqcF9uX2N1dF9zaXplID0KKwkJCQkJICAgIC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7CisJCQkJCWNfbW9kZSA9IE1fREVMRVRFOwkvKiBEZWxldGUgdGhpcyBpdGVtLiAqLworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGluZGlyZWN0IGl0ZW0gbXVzdCBiZSB0cnVuY2F0ZWQgc3RhcnRpbmcgZnJvbSAqcF9uX3Bvc19pbl9pdGVtLXRoIHBvc2l0aW9uICovCisJCQkJCXBvc19pbl9pdGVtKHBfc19wYXRoKSA9CisJCQkJCSAgICAobl9uZXdfZmlsZV9sZW5ndGggKyBuX2Jsa19zaXplIC0KKwkJCQkJICAgICBsZV9paF9rX29mZnNldCgmc19paCkpID4+IHBfc19zYi0+CisJCQkJCSAgICBzX2Jsb2Nrc2l6ZV9iaXRzOwogCi0JLyogU2VhcmNoIGZvciB0aGUgbmVlZGVkIG9iamVjdCBpbmRpcmVjdCBpdGVtIHVudGlsIHRoZXJlIGFyZSBubyB1bmZvcm1hdHRlZCBub2RlcyB0byBiZSByZW1vdmVkLiAqLwotCWRvICB7Ci0JICAgIG5lZWRfcmVzZWFyY2ggPSAwOwotICAgICAgICAgICAgcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOwotCSAgICAvKiBDb3B5IGluZGlyZWN0IGl0ZW0gaGVhZGVyIHRvIGEgdGVtcCB2YXJpYWJsZS4gKi8KLQkgICAgY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOwotCSAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoaXMgaXRlbS4gKi8KLQkgICAgbl91bmZtX251bWJlciA9IElfVU5GTV9OVU0oJnNfaWgpOworCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0ocF9zX3BhdGgpID4KKwkJCQkJICAgICAgIG5fdW5mbV9udW1iZXIsCisJCQkJCSAgICAgICAiUEFQLTUyNTA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGl0ZW0iKTsKIAotCSAgICBSRkFMU0UoICEgaXNfaW5kaXJlY3RfbGVfaWgoJnNfaWgpIHx8ICEgbl91bmZtX251bWJlciB8fAotCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSArIDEgIT0gIG5fdW5mbV9udW1iZXIsCi0JCSAgICAiUEFQLTUyNDA6IGludmFsaWQgaXRlbSAlaCAiCi0JCSAgICAibl91bmZtX251bWJlciA9ICVkICpwX25fcG9zX2luX2l0ZW0gPSAlZCIsIAotCQkgICAgJnNfaWgsIG5fdW5mbV9udW1iZXIsIHBvc19pbl9pdGVtIChwX3NfcGF0aCkpOworCQkJCQkvKiBFaXRoZXIgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgb2YgaW5kaXJlY3QgaXRlbSB0byBkaXJlY3QgaXRlbSBvciBpbmNyZWFzZQorCQkJCQkgICBpdHMgZnJlZSBzcGFjZS4gICovCisJCQkJCWlmIChwb3NfaW5faXRlbShwX3NfcGF0aCkgPT0KKwkJCQkJICAgIG5fdW5mbV9udW1iZXIpIHsKKwkJCQkJCSpwX25fY3V0X3NpemUgPSAwOwkvKiBOb3RoaW5nIHRvIGN1dC4gKi8KKwkJCQkJCXJldHVybiBNX0NPTlZFUlQ7CS8qIE1heWJlIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIHRoZSBkaXJlY3QgaXRlbS4gKi8KKwkJCQkJfQorCQkJCQkvKiBDYWxjdWxhdGUgc2l6ZSB0byBjdXQuICovCisJCQkJCSpwX25fY3V0X3NpemUgPQorCQkJCQkgICAgLShpaF9pdGVtX2xlbigmc19paCkgLQorCQkJCQkgICAgICBwb3NfaW5faXRlbShwX3NfcGF0aCkgKgorCQkJCQkgICAgICBVTkZNX1BfU0laRSk7CiAKLQkgICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgbW9kZSBhbmQgcG9zaXRpb24gaW4gdGhlIGl0ZW0gdG8gcmVtb3ZlIHVuZm9ybWF0dGVkIG5vZGVzLiAqLwotCSAgICBpZiAoIG5fbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSApIHsvKiBDYXNlIG9mIGRlbGV0ZS4gKi8KLQkJcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IDA7Ci0JCSpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbigmc19paCkpOwotCQljX21vZGUgPSBNX0RFTEVURTsKLQkgICAgfQotCSAgICBlbHNlICB7IC8qIENhc2Ugb2YgdHJ1bmNhdGUuICovCi0JCWlmICggbl9uZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgIHsKLQkJICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPSAwOwotCQkgICAgKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7Ci0JCSAgICBjX21vZGUgPSBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KLQkJfQotCQllbHNlICB7Ci0JCSAgICAvKiBpbmRpcmVjdCBpdGVtIG11c3QgYmUgdHJ1bmNhdGVkIHN0YXJ0aW5nIGZyb20gKnBfbl9wb3NfaW5faXRlbS10aCBwb3NpdGlvbiAqLwotCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IChuX25ld19maWxlX2xlbmd0aCArIG5fYmxrX3NpemUgLSBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgPj4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJCQljX21vZGUgPSBNX0NVVDsJLyogQ3V0IGZyb20gdGhpcyBpbmRpcmVjdCBpdGVtLiAqLworCQkJCX0KKwkJCX0KIAotCQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAocF9zX3BhdGgpID4gbl91bmZtX251bWJlciwKLQkJCSAgICAiUEFQLTUyNTA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGl0ZW0iKTsKKwkJCVJGQUxTRShuX3VuZm1fbnVtYmVyIDw9IHBvc19pbl9pdGVtKHBfc19wYXRoKSwKKwkJCSAgICAgICAiUEFQLTUyNjA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGluZGlyZWN0IGl0ZW0iKTsKIAotCQkgICAgLyogRWl0aGVyIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIGluZGlyZWN0IGl0ZW0gdG8gZGlyZWN0IGl0ZW0gb3IgaW5jcmVhc2UKLQkJICAgICAgIGl0cyBmcmVlIHNwYWNlLiAgKi8KLQkJICAgIGlmICggcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9PSBuX3VuZm1fbnVtYmVyICkgIHsKLQkJCSpwX25fY3V0X3NpemUgPSAwOyAvKiBOb3RoaW5nIHRvIGN1dC4gKi8KLQkJCXJldHVybiBNX0NPTlZFUlQ7IC8qIE1heWJlIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIHRoZSBkaXJlY3QgaXRlbS4gKi8KLQkJICAgIH0KLQkJICAgIC8qIENhbGN1bGF0ZSBzaXplIHRvIGN1dC4gKi8KLQkJICAgICpwX25fY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKCZzX2loKSAtIHBvc19pbl9pdGVtKHBfc19wYXRoKSAqIFVORk1fUF9TSVpFKTsKKwkJCS8qIHBvaW50ZXJzIHRvIGJlIGN1dCAqLworCQkJbl91bmZtX251bWJlciAtPSBwb3NfaW5faXRlbShwX3NfcGF0aCk7CisJCQkvKiBTZXQgcG9pbnRlciB0byB0aGUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdGhhdCBpcyB0byBiZSBjdXQuICovCisJCQlwX25fdW5mbV9wb2ludGVyID0KKwkJCSAgICAoX19sZTMyICopIEJfSV9QSVRFTShwX3NfYmgsCisJCQkJCQkgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLQorCQkJICAgIDEgLSAqcF9uX3JlbW92ZWQ7CiAKLQkJICAgIGNfbW9kZSA9IE1fQ1VUOyAgICAgLyogQ3V0IGZyb20gdGhpcyBpbmRpcmVjdCBpdGVtLiAqLwotCQl9Ci0JICAgIH0KKwkJCS8qIFdlIGdvIHRocm91Z2ggdGhlIHVuZm9ybWF0dGVkIG5vZGVzIHBvaW50ZXJzIG9mIHRoZSBpbmRpcmVjdAorCQkJICAgaXRlbSBhbmQgbG9vayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoZSBjYWNoZS4gSWYgd2UKKwkJCSAgIGZvdW5kIHNvbWUgb2YgdGhlbSB3ZSBmcmVlIGl0LCB6ZXJvIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgaXRlbQorCQkJICAgZW50cnkgYW5kIGxvZyBidWZmZXIgY29udGFpbmluZyB0aGF0IGluZGlyZWN0IGl0ZW0uIEZvciB0aGlzIHdlCisJCQkgICBuZWVkIHRvIHByZXBhcmUgbGFzdCBwYXRoIGVsZW1lbnQgZm9yIGxvZ2dpbmcuIElmIHNvbWUKKwkJCSAgIHVuZm9ybWF0dGVkIG5vZGUgaGFzIGJfY291bnQgPiAxIHdlIG11c3Qgbm90IGZyZWUgdGhpcworCQkJICAgdW5mb3JtYXR0ZWQgbm9kZSBzaW5jZSBpdCBpcyBpbiB1c2UuICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgcF9zX2JoLCAxKTsKKwkJCS8vIG5vdGU6IHBhdGggY291bGQgYmUgY2hhbmdlZCwgZmlyc3QgbGluZSBpbiBmb3IgbG9vcCB0YWtlcyBjYXJlCisJCQkvLyBvZiBpdAogCi0JICAgIFJGQUxTRSggbl91bmZtX251bWJlciA8PSBwb3NfaW5faXRlbSAocF9zX3BhdGgpLAotCQkgICAgIlBBUC01MjYwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBpbmRpcmVjdCBpdGVtIik7CisJCQlmb3IgKG5fY291bnRlciA9ICpwX25fcmVtb3ZlZDsKKwkJCSAgICAgbl9jb3VudGVyIDwgbl91bmZtX251bWJlcjsKKwkJCSAgICAgbl9jb3VudGVyKyssIHBfbl91bmZtX3BvaW50ZXItLSkgewogCi0JICAgIC8qIHBvaW50ZXJzIHRvIGJlIGN1dCAqLwotCSAgICBuX3VuZm1fbnVtYmVyIC09IHBvc19pbl9pdGVtIChwX3NfcGF0aCk7Ci0JICAgIC8qIFNldCBwb2ludGVyIHRvIHRoZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0aGF0IGlzIHRvIGJlIGN1dC4gKi8KLQkgICAgcF9uX3VuZm1fcG9pbnRlciA9IChfX2xlMzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtIDEgLSAqcF9uX3JlbW92ZWQ7CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJaWYgKGl0ZW1fbW92ZWQoJnNfaWgsIHBfc19wYXRoKSkgeworCQkJCQluZWVkX3Jlc2VhcmNoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCVJGQUxTRShwX25fdW5mbV9wb2ludGVyIDwKKwkJCQkgICAgICAgKF9fbGUzMiAqKSBCX0lfUElURU0ocF9zX2JoLCAmc19paCkKKwkJCQkgICAgICAgfHwgcF9uX3VuZm1fcG9pbnRlciA+CisJCQkJICAgICAgIChfX2xlMzIgKikgQl9JX1BJVEVNKHBfc19iaCwKKwkJCQkJCQkgICAgJnNfaWgpICsKKwkJCQkgICAgICAgSV9VTkZNX05VTSgmc19paCkgLSAxLAorCQkJCSAgICAgICAidnMtNTI2NTogcG9pbnRlciBvdXQgb2YgcmFuZ2UiKTsKIAorCQkJCS8qIEhvbGUsIG5vdGhpbmcgdG8gcmVtb3ZlLiAqLworCQkJCWlmICghZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwKSkgeworCQkJCQkoKnBfbl9yZW1vdmVkKSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAKLQkgICAgLyogV2UgZ28gdGhyb3VnaCB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgcG9pbnRlcnMgb2YgdGhlIGluZGlyZWN0Ci0JICAgICAgIGl0ZW0gYW5kIGxvb2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlcyBpbiB0aGUgY2FjaGUuIElmIHdlCi0JICAgICAgIGZvdW5kIHNvbWUgb2YgdGhlbSB3ZSBmcmVlIGl0LCB6ZXJvIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgaXRlbQotCSAgICAgICBlbnRyeSBhbmQgbG9nIGJ1ZmZlciBjb250YWluaW5nIHRoYXQgaW5kaXJlY3QgaXRlbS4gRm9yIHRoaXMgd2UKLQkgICAgICAgbmVlZCB0byBwcmVwYXJlIGxhc3QgcGF0aCBlbGVtZW50IGZvciBsb2dnaW5nLiBJZiBzb21lCi0JICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgaGFzIGJfY291bnQgPiAxIHdlIG11c3Qgbm90IGZyZWUgdGhpcwotCSAgICAgICB1bmZvcm1hdHRlZCBub2RlIHNpbmNlIGl0IGlzIGluIHVzZS4gKi8KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIHBfc19iaCwgMSk7Ci0JICAgIC8vIG5vdGU6IHBhdGggY291bGQgYmUgY2hhbmdlZCwgZmlyc3QgbGluZSBpbiBmb3IgbG9vcCB0YWtlcyBjYXJlCi0JICAgIC8vIG9mIGl0CisJCQkJKCpwX25fcmVtb3ZlZCkrKzsKIAotCSAgICBmb3IgKG5fY291bnRlciA9ICpwX25fcmVtb3ZlZDsKLQkJIG5fY291bnRlciA8IG5fdW5mbV9udW1iZXI7IG5fY291bnRlcisrLCBwX25fdW5mbV9wb2ludGVyLS0gKSB7CisJCQkJdG1wID0gZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwKTsKKwkJCQlwdXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsIDAsIDApOworCQkJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBwX3NfYmgpOworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCB0bXAsIDEpOworCQkJCWlmIChpdGVtX21vdmVkKCZzX2loLCBwX3NfcGF0aCkpIHsKKwkJCQkJbmVlZF9yZXNlYXJjaCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAotCQljb25kX3Jlc2NoZWQoKTsKLQkJaWYgKGl0ZW1fbW92ZWQgKCZzX2loLCBwX3NfcGF0aCkpIHsKLQkJICAgIG5lZWRfcmVzZWFyY2ggPSAxIDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCVJGQUxTRSggcF9uX3VuZm1fcG9pbnRlciA8IChfX2xlMzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgfHwKLQkJCXBfbl91bmZtX3BvaW50ZXIgPiAoX19sZTMyICopQl9JX1BJVEVNKHBfc19iaCwgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLSAxLAotCQkJInZzLTUyNjU6IHBvaW50ZXIgb3V0IG9mIHJhbmdlIik7CisJCQkvKiBhIHRyaWNrLiAgSWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBsb2dnZWQsIHRoaXMKKwkJCSAqKiB3aWxsIGRvIG5vdGhpbmcuICBJZiB3ZSd2ZSBicm9rZW4gdGhlIGxvb3Agd2l0aG91dAorCQkJICoqIGxvZ2dpbmcgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGUgYnVmZmVyCisJCQkgKioKKwkJCSAqLworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3NiLCBwX3NfYmgpOwogCi0JCS8qIEhvbGUsIG5vdGhpbmcgdG8gcmVtb3ZlLiAqLwotCQlpZiAoICEgZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLDApICkgIHsKLQkJCSgqcF9uX3JlbW92ZWQpKys7Ci0JCQljb250aW51ZTsKLQkJfQorCQkJLyogVGhpcyBsb29wIGNhbiBiZSBvcHRpbWl6ZWQuICovCisJCX0gd2hpbGUgKCgqcF9uX3JlbW92ZWQgPCBuX3VuZm1fbnVtYmVyIHx8IG5lZWRfcmVzZWFyY2gpICYmCisJCQkgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksCisJCQkJCQkgICAgcF9zX3BhdGgpID09CisJCQkgUE9TSVRJT05fRk9VTkQpOwogCi0JCSgqcF9uX3JlbW92ZWQpKys7CisJCVJGQUxTRSgqcF9uX3JlbW92ZWQgPCBuX3VuZm1fbnVtYmVyLAorCQkgICAgICAgIlBBUC01MzEwOiBpbmRpcmVjdCBpdGVtIGlzIG5vdCBmb3VuZCIpOworCQlSRkFMU0UoaXRlbV9tb3ZlZCgmc19paCwgcF9zX3BhdGgpLAorCQkgICAgICAgImFmdGVyIHdoaWxlLCBjb21wIGZhaWxlZCwgcmV0cnkiKTsKIAotCQl0bXAgPSBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsMCk7Ci0JCXB1dF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwgMCwgMCk7Ci0JCWpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHBfc19zYiwgcF9zX2JoKTsKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIHRtcCwgMSk7Ci0JCWlmICggaXRlbV9tb3ZlZCAoJnNfaWgsIHBfc19wYXRoKSApICB7Ci0JCQluZWVkX3Jlc2VhcmNoID0gMTsKLQkJCWJyZWFrIDsKLQkJfQotCSAgICB9Ci0KLQkgICAgLyogYSB0cmljay4gIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gbG9nZ2VkLCB0aGlzCi0JICAgICoqIHdpbGwgZG8gbm90aGluZy4gIElmIHdlJ3ZlIGJyb2tlbiB0aGUgbG9vcCB3aXRob3V0Ci0JICAgICoqIGxvZ2dpbmcgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGUgYnVmZmVyCi0JICAgICoqCi0JICAgICovCi0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc19zYiwgcF9zX2JoKTsKLQotCSAgICAvKiBUaGlzIGxvb3AgY2FuIGJlIG9wdGltaXplZC4gKi8KLQl9IHdoaWxlICggKCpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIgfHwgbmVlZF9yZXNlYXJjaCkgJiYKLQkJICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX0ZPVU5EICk7Ci0KLQlSRkFMU0UoICpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIsIAotCQkiUEFQLTUzMTA6IGluZGlyZWN0IGl0ZW0gaXMgbm90IGZvdW5kIik7Ci0JUkZBTFNFKCBpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpLCAKLQkJImFmdGVyIHdoaWxlLCBjb21wIGZhaWxlZCwgcmV0cnkiKSA7Ci0KLQlpZiAoY19tb2RlID09IE1fQ1VUKQotCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpICo9IFVORk1fUF9TSVpFOwotCXJldHVybiBjX21vZGU7Ci0gICAgfQorCQlpZiAoY19tb2RlID09IE1fQ1VUKQorCQkJcG9zX2luX2l0ZW0ocF9zX3BhdGgpICo9IFVORk1fUF9TSVpFOworCQlyZXR1cm4gY19tb2RlOworCX0KIH0KIAogLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIGRlbGV0ZWQgb3IgY3V0IGR1cmluZyBiYWxhbmNlICovCi1zdGF0aWMgaW50IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoCi0gICAgc3RydWN0ICB0cmVlX2JhbGFuY2UgICogcF9zX3RiLAotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGNfbW9kZQotICAgICkgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5fZGVsX3NpemU7Ci0gICAgc3RydWN0ICBpdGVtX2hlYWQgICAgICogcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfdGItPnRiX3BhdGgpOwotCi0gICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKQotCXJldHVybiAwOwotCi0gICAgbl9kZWxfc2l6ZSA9ICggY19tb2RlID09IE1fREVMRVRFICkgPyBpaF9pdGVtX2xlbihwX2xlX2loKSA6IC1wX3NfdGItPmluc2VydF9zaXplWzBdOwotICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBfbGVfaWgpICkgewotCS8vIHJldHVybiBFTVBUWV9ESVJfU0laRTsgLyogV2UgZGVsZXRlIGVtdHkgZGlyZWN0b3JpcyBvbmx5LiAqLwotCS8vIHdlIGNhbid0IHVzZSBFTVBUWV9ESVJfU0laRSwgYXMgb2xkIGZvcm1hdCBkaXJzIGhhdmUgYSBkaWZmZXJlbnQKLQkvLyBlbXB0eSBzaXplLiAgaWNrLiBGSVhNRSwgaXMgdGhpcyByaWdodD8KLQkvLwotCXJldHVybiBuX2RlbF9zaXplIDsKLSAgICB9Ci0KLSAgICBpZiAoIGlzX2luZGlyZWN0X2xlX2loIChwX2xlX2loKSApCi0Jbl9kZWxfc2l6ZSA9IChuX2RlbF9zaXplL1VORk1fUF9TSVpFKSoKLQkgIChQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpLT5iX3NpemUpOy8vIC0gZ2V0X2loX2ZyZWVfc3BhY2UgKHBfbGVfaWgpOwotICAgIHJldHVybiBuX2RlbF9zaXplOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3RiX3N0cnVjdCgKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IsCi0gICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotICAgIGludCAgICAgICAgICAgICAgICAgICBuX3NpemUKLSAgICApIHsKLQotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLQotICAgIG1lbXNldCAocF9zX3RiLCdcMCcsc2l6ZW9mKHN0cnVjdCB0cmVlX2JhbGFuY2UpKTsKLSAgICBwX3NfdGItPnRyYW5zYWN0aW9uX2hhbmRsZSA9IHRoIDsKLSAgICBwX3NfdGItPnRiX3NiID0gcF9zX3NiOwotICAgIHBfc190Yi0+dGJfcGF0aCA9IHBfc19wYXRoOwotICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSBOVUxMOwotICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0gMDsKLSAgICBwX3NfdGItPmluc2VydF9zaXplWzBdID0gbl9zaXplOwotfQotCi0KLQotdm9pZCBwYWRkX2l0ZW0gKGNoYXIgKiBpdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKQorc3RhdGljIGludCBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgY2hhciBjX21vZGUpCiB7Ci0gICAgaW50IGk7CisJaW50IG5fZGVsX3NpemU7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfdGItPnRiX3BhdGgpOwogCi0gICAgZm9yIChpID0gdG90YWxfbGVuZ3RoOyBpID4gbGVuZ3RoOyApCi0JaXRlbSBbLS1pXSA9IDA7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKQorCQlyZXR1cm4gMDsKKworCW5fZGVsX3NpemUgPQorCSAgICAoY19tb2RlID09CisJICAgICBNX0RFTEVURSkgPyBpaF9pdGVtX2xlbihwX2xlX2loKSA6IC1wX3NfdGItPmluc2VydF9zaXplWzBdOworCWlmIChpc19kaXJlbnRyeV9sZV9paChwX2xlX2loKSkgeworCQkvLyByZXR1cm4gRU1QVFlfRElSX1NJWkU7IC8qIFdlIGRlbGV0ZSBlbXR5IGRpcmVjdG9yaXMgb25seS4gKi8KKwkJLy8gd2UgY2FuJ3QgdXNlIEVNUFRZX0RJUl9TSVpFLCBhcyBvbGQgZm9ybWF0IGRpcnMgaGF2ZSBhIGRpZmZlcmVudAorCQkvLyBlbXB0eSBzaXplLiAgaWNrLiBGSVhNRSwgaXMgdGhpcyByaWdodD8KKwkJLy8KKwkJcmV0dXJuIG5fZGVsX3NpemU7CisJfQorCisJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpKQorCQluX2RlbF9zaXplID0gKG5fZGVsX3NpemUgLyBVTkZNX1BfU0laRSkgKiAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKS0+Yl9zaXplKTsJLy8gLSBnZXRfaWhfZnJlZV9zcGFjZSAocF9sZV9paCk7CisJcmV0dXJuIG5fZGVsX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfdGJfc3RydWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLAorCQkJICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkgICBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsIGludCBuX3NpemUpCit7CisKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKworCW1lbXNldChwX3NfdGIsICdcMCcsIHNpemVvZihzdHJ1Y3QgdHJlZV9iYWxhbmNlKSk7CisJcF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUgPSB0aDsKKwlwX3NfdGItPnRiX3NiID0gcF9zX3NiOworCXBfc190Yi0+dGJfcGF0aCA9IHBfc19wYXRoOworCVBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSBOVUxMOworCVBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0gMDsKKwlwX3NfdGItPmluc2VydF9zaXplWzBdID0gbl9zaXplOworfQorCit2b2lkIHBhZGRfaXRlbShjaGFyICppdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJZm9yIChpID0gdG90YWxfbGVuZ3RoOyBpID4gbGVuZ3RoOykKKwkJaXRlbVstLWldID0gMDsKIH0KIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCiBjaGFyIGtleTJ0eXBlKHN0cnVjdCByZWlzZXJmc19rZXkgKmloKQogewotICBpZiAoaXNfZGlyZW50cnlfbGVfa2V5KDIsIGloKSkKLSAgICByZXR1cm4gJ2QnOwotICBpZiAoaXNfZGlyZWN0X2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdEJzsKLSAgaWYgKGlzX2luZGlyZWN0X2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdpJzsKLSAgaWYgKGlzX3N0YXRkYXRhX2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdzJzsKLSAgcmV0dXJuICd1JzsKKwlpZiAoaXNfZGlyZW50cnlfbGVfa2V5KDIsIGloKSkKKwkJcmV0dXJuICdkJzsKKwlpZiAoaXNfZGlyZWN0X2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAnRCc7CisJaWYgKGlzX2luZGlyZWN0X2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAnaSc7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAncyc7CisJcmV0dXJuICd1JzsKIH0KIAogY2hhciBoZWFkMnR5cGUoc3RydWN0IGl0ZW1faGVhZCAqaWgpCiB7Ci0gIGlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpCi0gICAgcmV0dXJuICdEJzsKLSAgaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkKLSAgICByZXR1cm4gJ2knOwotICBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKQotICAgIHJldHVybiAncyc7Ci0gIHJldHVybiAndSc7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkKKwkJcmV0dXJuICdkJzsKKwlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKwkJcmV0dXJuICdEJzsKKwlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQlyZXR1cm4gJ2knOworCWlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCXJldHVybiAncyc7CisJcmV0dXJuICd1JzsKIH0KICNlbmRpZgogCiAvKiBEZWxldGUgb2JqZWN0IGl0ZW0uICovCi1pbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLwotCQkJICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRlbGV0ZWQgaXRlbS4gICovCi0JCQkgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwvKiBpbm9kZSBpcyBoZXJlIGp1c3QgdG8gdXBkYXRlIGlfYmxvY2tzIGFuZCBxdW90YXMgKi8KLQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc191bl9iaCkgICAgLyogTlVMTCBvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuICAgICovCi17Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgICBzX2RlbF9iYWxhbmNlOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICAqcV9paDsKLSAgICBpbnQJCQkgIHF1b3RhX2N1dF9ieXRlczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9yZXRfdmFsdWUsCi0Jbl9kZWxfc2l6ZSwKLQluX3JlbW92ZWQ7CitpbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLworCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCS8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBkZWxldGVkIGl0ZW0uICAqLworCQkJIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAkvKiBpbm9kZSBpcyBoZXJlIGp1c3QgdG8gdXBkYXRlIGlfYmxvY2tzIGFuZCBxdW90YXMgKi8KKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc191bl9iaCkKK3sJCQkJLyogTlVMTCBvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuICAgICovCisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisJc3RydWN0IHRyZWVfYmFsYW5jZSBzX2RlbF9iYWxhbmNlOworCXN0cnVjdCBpdGVtX2hlYWQgc19paDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpxX2loOworCWludCBxdW90YV9jdXRfYnl0ZXM7CisJaW50IG5fcmV0X3ZhbHVlLCBuX2RlbF9zaXplLCBuX3JlbW92ZWQ7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgY19tb2RlOwotICAgIGludAkJCW5faXRlciA9IDA7CisJY2hhciBjX21vZGU7CisJaW50IG5faXRlciA9IDA7CiAjZW5kaWYKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19kZWxfYmFsYW5jZSwgcF9zX3NiLCBwX3NfcGF0aCwgMC8qc2l6ZSBpcyB1bmtub3duKi8pOworCWluaXRfdGJfc3RydWN0KHRoLCAmc19kZWxfYmFsYW5jZSwgcF9zX3NiLCBwX3NfcGF0aCwKKwkJICAgICAgIDAgLypzaXplIGlzIHVua25vd24gKi8gKTsKIAotICAgIHdoaWxlICggMSApIHsKLQluX3JlbW92ZWQgPSAwOworCXdoaWxlICgxKSB7CisJCW5fcmVtb3ZlZCA9IDA7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQluX2l0ZXIrKzsKLQljX21vZGUgPQorCQluX2l0ZXIrKzsKKwkJY19tb2RlID0KICNlbmRpZgotCSAgICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsICZuX2RlbF9zaXplLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChwX3NfaW5vZGUpKTsKKwkJICAgIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsCisJCQkJCSAgICAgIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwKKwkJCQkJICAgICAgJm5fZGVsX3NpemUsCisJCQkJCSAgICAgIG1heF9yZWlzZXJmc19vZmZzZXQocF9zX2lub2RlKSk7CiAKLQlSRkFMU0UoIGNfbW9kZSAhPSBNX0RFTEVURSwgIlBBUC01MzIwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKKwkJUkZBTFNFKGNfbW9kZSAhPSBNX0RFTEVURSwgIlBBUC01MzIwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKIAotCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKLQlzX2RlbF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9kZWxfc2l6ZTsKKwkJY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOworCQlzX2RlbF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9kZWxfc2l6ZTsKIAotCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKE1fREVMRVRFLCAmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKCBuX3JldF92YWx1ZSAhPSBSRVBFQVRfU0VBUkNIICkKLQkgICAgYnJlYWs7CisJCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKE1fREVMRVRFLCAmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCk7CisJCWlmIChuX3JldF92YWx1ZSAhPSBSRVBFQVRfU0VBUkNIKQorCQkJYnJlYWs7CiAKLQlQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGRlbGV0ZV9pdGVtX3Jlc3RhcnRlZCApOworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgZGVsZXRlX2l0ZW1fcmVzdGFydGVkKTsKIAotCS8vIGZpbGUgc3lzdGVtIGNoYW5nZWQsIHJlcGVhdCBzZWFyY2gKLQluX3JldF92YWx1ZSA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7Ci0JaWYgKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKQotCSAgICBicmVhazsKLQlpZiAobl9yZXRfdmFsdWUgPT0gRklMRV9OT1RfRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTM0MDogcmVpc2VyZnNfZGVsZXRlX2l0ZW06ICIKLQkJCSAgICAgICJubyBpdGVtcyBvZiB0aGUgZmlsZSAlSyBmb3VuZCIsIHBfc19pdGVtX2tleSk7Ci0JICAgIGJyZWFrOworCQkvLyBmaWxlIHN5c3RlbSBjaGFuZ2VkLCByZXBlYXQgc2VhcmNoCisJCW5fcmV0X3ZhbHVlID0KKwkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7CisJCWlmIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikKKwkJCWJyZWFrOworCQlpZiAobl9yZXRfdmFsdWUgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgInZzLTUzNDA6IHJlaXNlcmZzX2RlbGV0ZV9pdGVtOiAiCisJCQkJCSAibm8gaXRlbXMgb2YgdGhlIGZpbGUgJUsgZm91bmQiLAorCQkJCQkgcF9zX2l0ZW1fa2V5KTsKKwkJCWJyZWFrOworCQl9CisJfQkJCS8qIHdoaWxlICgxKSAqLworCisJaWYgKG5fcmV0X3ZhbHVlICE9IENBUlJZX09OKSB7CisJCXVuZml4X25vZGVzKCZzX2RlbF9iYWxhbmNlKTsKKwkJcmV0dXJuIDA7CiAJfQotICAgIH0gLyogd2hpbGUgKDEpICovCisJLy8gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gcmV0dXJucyBpdGVtIGxlbmd0aCB3aGVuIHN1Y2Nlc3MKKwluX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfZGVsX2JhbGFuY2UsIE1fREVMRVRFKTsKKwlxX2loID0gZ2V0X2loKHBfc19wYXRoKTsKKwlxdW90YV9jdXRfYnl0ZXMgPSBpaF9pdGVtX2xlbihxX2loKTsKIAotICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7Ci0JdW5maXhfbm9kZXMoJnNfZGVsX2JhbGFuY2UpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8vIHJlaXNlcmZzX2RlbGV0ZV9pdGVtIHJldHVybnMgaXRlbSBsZW5ndGggd2hlbiBzdWNjZXNzCi0gICAgbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2RlbF9iYWxhbmNlLCBNX0RFTEVURSk7Ci0gICAgcV9paCA9IGdldF9paChwX3NfcGF0aCkgOwotICAgIHF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKHFfaWgpIDsKLQotICAgIC8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlCi0gICAgKiogaGFzIGEgdGFpbC4gIE9uIHRhaWwgaW5zZXJ0LCB3ZSBhbGxvY2F0ZSBxdW90YSBmb3IgMSB1bmZvcm1hdHRlZCBub2RlLgotICAgICoqIFdlIHRlc3QgdGhlIG9mZnNldCBiZWNhdXNlIHRoZSB0YWlsIG1pZ2h0IGhhdmUgYmVlbgotICAgICoqIHNwbGl0IGludG8gbXVsdGlwbGUgaXRlbXMsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVjcmVtZW50IGZvcgotICAgICoqIHRoZSB1bmZtIG5vZGUgb25jZQotICAgICovCi0gICAgaWYgKCFTX0lTTE5LIChwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHFfaWgpKSB7Ci0gICAgICAgIGlmICgobGVfaWhfa19vZmZzZXQocV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAxKSB7Ci0gICAgICAgICAgICBxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IDAgOworCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlCisJICoqIGhhcyBhIHRhaWwuICBPbiB0YWlsIGluc2VydCwgd2UgYWxsb2NhdGUgcXVvdGEgZm9yIDEgdW5mb3JtYXR0ZWQgbm9kZS4KKwkgKiogV2UgdGVzdCB0aGUgb2Zmc2V0IGJlY2F1c2UgdGhlIHRhaWwgbWlnaHQgaGF2ZSBiZWVuCisJICoqIHNwbGl0IGludG8gbXVsdGlwbGUgaXRlbXMsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVjcmVtZW50IGZvcgorCSAqKiB0aGUgdW5mbSBub2RlIG9uY2UKKwkgKi8KKwlpZiAoIVNfSVNMTksocF9zX2lub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChxX2loKSkgeworCQlpZiAoKGxlX2loX2tfb2Zmc2V0KHFfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMSkgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9IGVsc2UgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gMDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAoIHBfc191bl9iaCApICB7Ci0JaW50IG9mZjsKLSAgICAgICAgY2hhciAqZGF0YSA7CisJaWYgKHBfc191bl9iaCkgeworCQlpbnQgb2ZmOworCQljaGFyICpkYXRhOwogCi0JLyogV2UgYXJlIGluIGRpcmVjdDJpbmRpcmVjdCBjb252ZXJzaW9uLCBzbyBtb3ZlIHRhaWwgY29udGVudHMKLSAgICAgICAgICAgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KLQkvKiBub3RlLCB3ZSBkbyB0aGUgY29weSBiZWZvcmUgcHJlcGFyaW5nIHRoZSBidWZmZXIgYmVjYXVzZSB3ZQotCSoqIGRvbid0IGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmZvcm1hdHRlZCBub2RlIHlldC4KLQkqKiB0aGUgb25seSB0aGluZyB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZGlyZWN0IGl0ZW0ncyBkYXRhCi0JKiogaXMgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUuCi0JKioKLQkqKiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgdG8gY2FsbCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIG9uCi0JKiogdGhlIHVuZm9ybWF0dGVkIG5vZGUsIHdoaWNoIG1pZ2h0IHNjaGVkdWxlLCBtZWFuaW5nIHdlJ2QgaGF2ZSB0bwotCSoqIGxvb3AgYWxsIHRoZSB3YXkgYmFjayB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIHdoaWxlIGxvb3AuCi0JKioKLQkqKiBUaGUgdW5mb3JtYXR0ZWQgbm9kZSBtdXN0IGJlIGRpcnRpZWQgbGF0ZXIgb24uICBXZSBjYW4ndCBiZQotCSoqIHN1cmUgaGVyZSBpZiB0aGUgZW50aXJlIHRhaWwgaGFzIGJlZW4gZGVsZXRlZCB5ZXQuCi0gICAgICAgICoqCi0gICAgICAgICoqIHBfc191bl9iaCBpcyBmcm9tIHRoZSBwYWdlIGNhY2hlIChhbGwgdW5mb3JtYXR0ZWQgbm9kZXMgYXJlCi0gICAgICAgICoqIGZyb20gdGhlIHBhZ2UgY2FjaGUpIGFuZCBtaWdodCBiZSBhIGhpZ2htZW0gcGFnZS4gIFNvLCB3ZQotICAgICAgICAqKiBjYW4ndCB1c2UgcF9zX3VuX2JoLT5iX2RhdGEuCi0JKiogLWNsbQotCSovCisJCS8qIFdlIGFyZSBpbiBkaXJlY3QyaW5kaXJlY3QgY29udmVyc2lvbiwgc28gbW92ZSB0YWlsIGNvbnRlbnRzCisJCSAgIHRvIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJCS8qIG5vdGUsIHdlIGRvIHRoZSBjb3B5IGJlZm9yZSBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBiZWNhdXNlIHdlCisJCSAqKiBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSB5ZXQuCisJCSAqKiB0aGUgb25seSB0aGluZyB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZGlyZWN0IGl0ZW0ncyBkYXRhCisJCSAqKiBpcyBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZS4KKwkJICoqCisJCSAqKiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgdG8gY2FsbCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIG9uCisJCSAqKiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSwgd2hpY2ggbWlnaHQgc2NoZWR1bGUsIG1lYW5pbmcgd2UnZCBoYXZlIHRvCisJCSAqKiBsb29wIGFsbCB0aGUgd2F5IGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKioKKwkJICoqIFRoZSB1bmZvcm1hdHRlZCBub2RlIG11c3QgYmUgZGlydGllZCBsYXRlciBvbi4gIFdlIGNhbid0IGJlCisJCSAqKiBzdXJlIGhlcmUgaWYgdGhlIGVudGlyZSB0YWlsIGhhcyBiZWVuIGRlbGV0ZWQgeWV0LgorCQkgKioKKwkJICoqIHBfc191bl9iaCBpcyBmcm9tIHRoZSBwYWdlIGNhY2hlIChhbGwgdW5mb3JtYXR0ZWQgbm9kZXMgYXJlCisJCSAqKiBmcm9tIHRoZSBwYWdlIGNhY2hlKSBhbmQgbWlnaHQgYmUgYSBoaWdobWVtIHBhZ2UuICBTbywgd2UKKwkJICoqIGNhbid0IHVzZSBwX3NfdW5fYmgtPmJfZGF0YS4KKwkJICoqIC1jbG0KKwkJICovCiAKLSAgICAgICAgZGF0YSA9IGttYXBfYXRvbWljKHBfc191bl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0Jb2ZmID0gKChsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotCW1lbWNweShkYXRhICsgb2ZmLAotCSAgICAgICBCX0lfUElURU0oUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpLCAmc19paCksIG5fcmV0X3ZhbHVlKTsKLQlrdW5tYXBfYXRvbWljKGRhdGEsIEtNX1VTRVIwKTsKLSAgICB9Ci0gICAgLyogUGVyZm9ybSBiYWxhbmNpbmcgYWZ0ZXIgYWxsIHJlc291cmNlcyBoYXZlIGJlZW4gY29sbGVjdGVkIGF0IG9uY2UuICovIAotICAgIGRvX2JhbGFuY2UoJnNfZGVsX2JhbGFuY2UsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKKwkJZGF0YSA9IGttYXBfYXRvbWljKHBfc191bl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7CisJCW9mZiA9ICgobGVfaWhfa19vZmZzZXQoJnNfaWgpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCQltZW1jcHkoZGF0YSArIG9mZiwKKwkJICAgICAgIEJfSV9QSVRFTShQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksICZzX2loKSwKKwkJICAgICAgIG5fcmV0X3ZhbHVlKTsKKwkJa3VubWFwX2F0b21pYyhkYXRhLCBLTV9VU0VSMCk7CisJfQorCS8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZCBhdCBvbmNlLiAqLworCWRvX2JhbGFuY2UoJnNfZGVsX2JhbGFuY2UsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGRlbGV0ZV9pdGVtKCk6IGZyZWVpbmcgJXUsIGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsIGhlYWQydHlwZSgmc19paCkpOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBkZWxldGVfaXRlbSgpOiBmcmVlaW5nICV1LCBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKCZzX2loKSk7CiAjZW5kaWYKLSAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CiAKLSAgICAvKiBSZXR1cm4gZGVsZXRlZCBib2R5IGxlbmd0aCAqLwotICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwkvKiBSZXR1cm4gZGVsZXRlZCBib2R5IGxlbmd0aCAqLworCXJldHVybiBuX3JldF92YWx1ZTsKIH0KIAotCiAvKiBTdW1tYXJ5IE9mIE1lY2hhbmlzbXMgRm9yIEhhbmRsaW5nIENvbGxpc2lvbnMgQmV0d2VlbiBQcm9jZXNzZXM6CiAKICBkZWxldGlvbiBvZiB0aGUgYm9keSBvZiB0aGUgb2JqZWN0IGlzIHBlcmZvcm1lZCBieSBpcHV0KCksIHdpdGggdGhlCkBAIC0xMzQ3LDcyNyArMTM4Nyw4MDQgQEAKICAtIEhhbnMKICovCiAKLQogLyogdGhpcyBkZWxldGVzIGl0ZW0gd2hpY2ggbmV2ZXIgZ2V0cyBzcGxpdCAqLwotdm9pZCByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHRiOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgaW50IGl0ZW1fbGVuID0gMDsKLSAgICBpbnQgdGJfaW5pdCA9IDAgOwotICAgIHN0cnVjdCBjcHVfa2V5IGNwdV9rZXk7Ci0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgcXVvdGFfY3V0X2J5dGVzID0gMDsKKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHRiOworCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKKwlpbnQgaXRlbV9sZW4gPSAwOworCWludCB0Yl9pbml0ID0gMDsKKwlzdHJ1Y3QgY3B1X2tleSBjcHVfa2V5OworCWludCByZXR2YWw7CisJaW50IHF1b3RhX2N1dF9ieXRlcyA9IDA7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgCi0gICAgbGVfa2V5MmNwdV9rZXkgKCZjcHVfa2V5LCBrZXkpOwotICAgIAotICAgIHdoaWxlICgxKSB7Ci0JcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHRoLT50X3N1cGVyLCAmY3B1X2tleSwgJnBhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsCi0JCQkgICAgICAidnMtNTM1MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKLQkJCSAgICAgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZGVsZXRlICVLIiwKLQkJCSAgICAgICZjcHVfa2V5KTsKLQkgICAgYnJlYWs7Ci0JfQotCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgewotCSAgICBwYXRocmVsc2UgKCZwYXRoKTsKLQkgICAgLy8gTm8gbmVlZCBmb3IgYSB3YXJuaW5nLCBpZiB0aGVyZSBpcyBqdXN0IG5vIGZyZWUgc3BhY2UgdG8gaW5zZXJ0ICcuLicgaXRlbSBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIHN1YmRpcgotCSAgICBpZiAoICEoICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9IQVNIX1ZBTFVFIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpKSA9PSAwICYmIFwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbiAoa2V5KSwga2V5KSkgPT0gMSApICkKLQkJcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ2cy01MzU1OiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogJWsgbm90IGZvdW5kIiwga2V5KTsKLQkgICAgYnJlYWs7Ci0JfQotCWlmICghdGJfaW5pdCkgewotCSAgICB0Yl9pbml0ID0gMSA7Ci0JICAgIGl0ZW1fbGVuID0gaWhfaXRlbV9sZW4oIFBBVEhfUElURU1fSEVBRCgmcGF0aCkgKTsKLQkgICAgaW5pdF90Yl9zdHJ1Y3QgKHRoLCAmdGIsIHRoLT50X3N1cGVyLCAmcGF0aCwgLSAoSUhfU0laRSArIGl0ZW1fbGVuKSk7Ci0JfQotCXF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCgmcGF0aCkpIDsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotCXJldHZhbCA9IGZpeF9ub2RlcyAoTV9ERUxFVEUsICZ0YiwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJldHZhbCA9PSBSRVBFQVRfU0VBUkNIKSB7Ci0JICAgIFBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCApOwotCSAgICBjb250aW51ZTsKLQl9CisJbGVfa2V5MmNwdV9rZXkoJmNwdV9rZXksIGtleSk7CiAKLQlpZiAocmV0dmFsID09IENBUlJZX09OKSB7Ci0JICAgIGRvX2JhbGFuY2UgKCZ0YiwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOwotCSAgICBpZiAoaW5vZGUpIHsJLyogU2hvdWxkIHdlIGNvdW50IHF1b3RhIGZvciBpdGVtPyAod2UgZG9uJ3QgY291bnQgcXVvdGFzIGZvciBzYXZlLWxpbmtzKSAqLworCXdoaWxlICgxKSB7CisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKHRoLT50X3N1cGVyLCAmY3B1X2tleSwgJnBhdGgpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCQkgInZzLTUzNTA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCisJCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIGRlbGV0ZSAlSyIsCisJCQkJCSAmY3B1X2tleSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmV0dmFsICE9IElURU1fRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQkvLyBObyBuZWVkIGZvciBhIHdhcm5pbmcsIGlmIHRoZXJlIGlzIGp1c3Qgbm8gZnJlZSBzcGFjZSB0byBpbnNlcnQgJy4uJyBpdGVtIGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgc3ViZGlyCisJCQlpZiAoIQorCQkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICBHRVRfSEFTSF9WQUxVRShsZV9rZXlfa19vZmZzZXQKKwkJCQkJICAgIChsZV9rZXlfdmVyc2lvbihrZXkpLCBrZXkpKSA9PSAwCisJCQkgICAgICYmICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkgICAgIEdFVF9HRU5FUkFUSU9OX05VTUJFUihsZV9rZXlfa19vZmZzZXQKKwkJCQkJCSAgIChsZV9rZXlfdmVyc2lvbihrZXkpLAorCQkJCQkJICAgIGtleSkpID09IDEpKQorCQkJCXJlaXNlcmZzX3dhcm5pbmcodGgtPnRfc3VwZXIsCisJCQkJCQkgInZzLTUzNTU6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAlayBub3QgZm91bmQiLAorCQkJCQkJIGtleSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXRiX2luaXQpIHsKKwkJCXRiX2luaXQgPSAxOworCQkJaXRlbV9sZW4gPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQoJnBhdGgpKTsKKwkJCWluaXRfdGJfc3RydWN0KHRoLCAmdGIsIHRoLT50X3N1cGVyLCAmcGF0aCwKKwkJCQkgICAgICAgLShJSF9TSVpFICsgaXRlbV9sZW4pKTsKKwkJfQorCQlxdW90YV9jdXRfYnl0ZXMgPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQoJnBhdGgpKTsKKworCQlyZXR2YWwgPSBmaXhfbm9kZXMoTV9ERUxFVEUsICZ0YiwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXR2YWwgPT0gUkVQRUFUX1NFQVJDSCkgeworCQkJUFJPQ19JTkZPX0lOQyh0aC0+dF9zdXBlciwgZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCQkJZG9fYmFsYW5jZSgmdGIsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKKwkJCWlmIChpbm9kZSkgewkvKiBTaG91bGQgd2UgY291bnQgcXVvdGEgZm9yIGl0ZW0/ICh3ZSBkb24ndCBjb3VudCBxdW90YXMgZm9yIHNhdmUtbGlua3MpICovCiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLQkJcmVpc2VyZnNfZGVidWcgKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgZGVsZXRlX3NvbGlkX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfY3V0X2J5dGVzLCBpbm9kZS0+aV91aWQsIGtleTJ0eXBlKGtleSkpOworCQkJCXJlaXNlcmZzX2RlYnVnKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgInJlaXNlcnF1b3RhIGRlbGV0ZV9zb2xpZF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCQkJCSAgICAgICBxdW90YV9jdXRfYnl0ZXMsIGlub2RlLT5pX3VpZCwKKwkJCQkJICAgICAgIGtleTJ0eXBlKGtleSkpOwogI2VuZGlmCi0JCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfY3V0X2J5dGVzKTsKLQkgICAgfQotCSAgICBicmVhazsKKwkJCQlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsCisJCQkJCQkJIHF1b3RhX2N1dF9ieXRlcyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvLyBJT19FUlJPUiwgTk9fRElTS19TUEFDRSwgZXRjCisJCXJlaXNlcmZzX3dhcm5pbmcodGgtPnRfc3VwZXIsCisJCQkJICJ2cy01MzYwOiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogIgorCQkJCSAiY291bGQgbm90IGRlbGV0ZSAlSyBkdWUgdG8gZml4X25vZGVzIGZhaWx1cmUiLAorCQkJCSAmY3B1X2tleSk7CisJCXVuZml4X25vZGVzKCZ0Yik7CisJCWJyZWFrOwogCX0KIAotCS8vIElPX0VSUk9SLCBOT19ESVNLX1NQQUNFLCBldGMKLQlyZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInZzLTUzNjA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCi0JCQkgICJjb3VsZCBub3QgZGVsZXRlICVLIGR1ZSB0byBmaXhfbm9kZXMgZmFpbHVyZSIsICZjcHVfa2V5KTsKLQl1bmZpeF9ub2RlcyAoJnRiKTsKLQlicmVhazsKLSAgICB9Ci0KLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CiB9CiAKLQotaW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK2ludCByZWlzZXJmc19kZWxldGVfb2JqZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbnQgZXJyOwotICAgIGlub2RlLT5pX3NpemUgPSAwOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlpbnQgZXJyOworCWlub2RlLT5pX3NpemUgPSAwOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogZm9yIGRpcmVjdG9yeSB0aGlzIGRlbGV0ZXMgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiAqLwotICAgIGVyciA9IHJlaXNlcmZzX2RvX3RydW5jYXRlICh0aCwgaW5vZGUsIE5VTEwsIDAvKm5vIHRpbWVzdGFtcCB1cGRhdGVzKi8pOwotICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgCisJLyogZm9yIGRpcmVjdG9yeSB0aGlzIGRlbGV0ZXMgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiAqLworCWVyciA9CisJICAgIHJlaXNlcmZzX2RvX3RydW5jYXRlKHRoLCBpbm9kZSwgTlVMTCwgMCAvKm5vIHRpbWVzdGFtcCB1cGRhdGVzICovICk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQotICAgIGlmKCAhb2xkX2Zvcm1hdF9vbmx5ICggdGggLT4gdF9zdXBlciApICkKLSAgICAgIHsKLSAgICAgICBfX2xlMzIgKmlub2RlX2dlbmVyYXRpb247Ci0gICAgICAgCi0gICAgICAgaW5vZGVfZ2VuZXJhdGlvbiA9IAotICAgICAgICAgJlJFSVNFUkZTX1NCKHRoIC0+IHRfc3VwZXIpIC0+IHNfcnMgLT4gc19pbm9kZV9nZW5lcmF0aW9uOwotICAgICAgICppbm9kZV9nZW5lcmF0aW9uID0gY3B1X3RvX2xlMzIoIGxlMzJfdG9fY3B1KCAqaW5vZGVfZ2VuZXJhdGlvbiApICsgMSApOwotICAgICAgfQorCWlmICghb2xkX2Zvcm1hdF9vbmx5KHRoLT50X3N1cGVyKSkgeworCQlfX2xlMzIgKmlub2RlX2dlbmVyYXRpb247CisKKwkJaW5vZGVfZ2VuZXJhdGlvbiA9CisJCSAgICAmUkVJU0VSRlNfU0IodGgtPnRfc3VwZXIpLT5zX3JzLT5zX2lub2RlX2dlbmVyYXRpb247CisJCSppbm9kZV9nZW5lcmF0aW9uID0KKwkJICAgIGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCppbm9kZV9nZW5lcmF0aW9uKSArIDEpOworCX0KIC8qIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKi8KICNlbmRpZgotICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICh0aCwgaW5vZGUsIElOT0RFX1BLRVkgKGlub2RlKSk7CisJcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0odGgsIGlub2RlLCBJTk9ERV9QS0VZKGlub2RlKSk7CiAKLSAgICByZXR1cm4gZXJyOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkCi11bm1hcF9idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgcG9zKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgOwotICAgIHVuc2lnbmVkIGxvbmcgdGFpbF9pbmRleCA7Ci0gICAgdW5zaWduZWQgbG9uZyBjdXJfaW5kZXggOworc3RhdGljIHZvaWQgdW5tYXBfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQ7CisJdW5zaWduZWQgbG9uZyB0YWlsX2luZGV4OworCXVuc2lnbmVkIGxvbmcgY3VyX2luZGV4OwogCi0gICAgaWYgKHBhZ2UpIHsKLQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewotCSAgICB0YWlsX2luZGV4ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLQkgICAgY3VyX2luZGV4ID0gMCA7Ci0JICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotCSAgICBiaCA9IGhlYWQgOwotCSAgICBkbyB7Ci0JCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2UgOworCWlmIChwYWdlKSB7CisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQl0YWlsX2luZGV4ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkJY3VyX2luZGV4ID0gMDsKKwkJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQliaCA9IGhlYWQ7CisJCQlkbyB7CisJCQkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKIAotCQkvKiB3ZSB3YW50IHRvIHVubWFwIHRoZSBidWZmZXJzIHRoYXQgY29udGFpbiB0aGUgdGFpbCwgYW5kCi0JCSoqIGFsbCB0aGUgYnVmZmVycyBhZnRlciBpdCAoc2luY2UgdGhlIHRhaWwgbXVzdCBiZSBhdCB0aGUKLQkJKiogZW5kIG9mIHRoZSBmaWxlKS4gIFdlIGRvbid0IHdhbnQgdG8gdW5tYXAgZmlsZSBkYXRhCi0JCSoqIGJlZm9yZSB0aGUgdGFpbCwgc2luY2UgaXQgbWlnaHQgYmUgZGlydHkgYW5kIHdhaXRpbmcgdG8KLQkJKiogcmVhY2ggZGlzawotCQkqLwotCQljdXJfaW5kZXggKz0gYmgtPmJfc2l6ZSA7Ci0JCWlmIChjdXJfaW5kZXggPiB0YWlsX2luZGV4KSB7Ci0JCSAgICByZWlzZXJmc191bm1hcF9idWZmZXIoYmgpIDsKKwkJCQkvKiB3ZSB3YW50IHRvIHVubWFwIHRoZSBidWZmZXJzIHRoYXQgY29udGFpbiB0aGUgdGFpbCwgYW5kCisJCQkJICoqIGFsbCB0aGUgYnVmZmVycyBhZnRlciBpdCAoc2luY2UgdGhlIHRhaWwgbXVzdCBiZSBhdCB0aGUKKwkJCQkgKiogZW5kIG9mIHRoZSBmaWxlKS4gIFdlIGRvbid0IHdhbnQgdG8gdW5tYXAgZmlsZSBkYXRhCisJCQkJICoqIGJlZm9yZSB0aGUgdGFpbCwgc2luY2UgaXQgbWlnaHQgYmUgZGlydHkgYW5kIHdhaXRpbmcgdG8KKwkJCQkgKiogcmVhY2ggZGlzaworCQkJCSAqLworCQkJCWN1cl9pbmRleCArPSBiaC0+Yl9zaXplOworCQkJCWlmIChjdXJfaW5kZXggPiB0YWlsX2luZGV4KSB7CisJCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7CisJCQkJfQorCQkJCWJoID0gbmV4dDsKKwkJCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCQkJaWYgKFBBR0VfU0laRSA9PSBiaC0+Yl9zaXplKSB7CisJCQkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCX0KIAkJfQotCQliaCA9IG5leHQgOwotCSAgICB9IHdoaWxlIChiaCAhPSBoZWFkKSA7Ci0JICAgIGlmICggUEFHRV9TSVpFID09IGJoLT5iX3NpemUgKSB7Ci0JCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7Ci0JICAgIH0KIAl9Ci0gICAgfQogfQogCi1zdGF0aWMgaW50IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICAgICAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLAotCQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAotCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgICAgICAqIHBfc19pdGVtX2tleSwKLQkJCSAgICAgIGxvZmZfdCAgICAgICAgIG5fbmV3X2ZpbGVfc2l6ZSwKLQkJCSAgICAgIGNoYXIgICAgICAgICAgICAgICAgKiBwX2NfbW9kZQotCQkJICAgICAgKSB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIGludCBuX2Jsb2NrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOwotICAgIGludCBjdXRfYnl0ZXM7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworc3RhdGljIGludCBtYXliZV9pbmRpcmVjdF90b19kaXJlY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICAgIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAorCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgc3RydWN0IHBhdGggKnBfc19wYXRoLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2l0ZW1fa2V5LAorCQkJCSAgICBsb2ZmX3Qgbl9uZXdfZmlsZV9zaXplLCBjaGFyICpwX2NfbW9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKwlpbnQgbl9ibG9ja19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgY3V0X2J5dGVzOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgaWYgKG5fbmV3X2ZpbGVfc2l6ZSAhPSBwX3NfaW5vZGUtPmlfc2l6ZSkKLQlCVUcgKCk7CisJaWYgKG5fbmV3X2ZpbGVfc2l6ZSAhPSBwX3NfaW5vZGUtPmlfc2l6ZSkKKwkJQlVHKCk7CiAKLSAgICAvKiB0aGUgcGFnZSBiZWluZyBzZW50IGluIGNvdWxkIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGkvbyBlcnJvcgotICAgICoqIHJlYWRpbmcgaW4gdGhlIGxhc3QgYmxvY2suICBUaGUgdXNlciB3aWxsIGhpdCBwcm9ibGVtcyB0cnlpbmcgdG8KLSAgICAqKiByZWFkIHRoZSBmaWxlLCBidXQgZm9yIG5vdyB3ZSBqdXN0IHNraXAgdGhlIGluZGlyZWN0MmRpcmVjdAotICAgICovCi0gICAgaWYgKGF0b21pY19yZWFkKCZwX3NfaW5vZGUtPmlfY291bnQpID4gMSB8fCAKLSAgICAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZCAocF9zX2lub2RlKSB8fCAKLQkhcGFnZSB8fCAoUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykpIHsKLQkvLyBsZWF2ZSB0YWlsIGluIGFuIHVuZm9ybWF0dGVkIG5vZGUJCi0JKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKLQljdXRfYnl0ZXMgPSBuX2Jsb2NrX3NpemUgLSAobl9uZXdfZmlsZV9zaXplICYgKG5fYmxvY2tfc2l6ZSAtIDEpKTsKLQlwYXRocmVsc2UocF9zX3BhdGgpOwotCXJldHVybiBjdXRfYnl0ZXM7Ci0gICAgfQotICAgIC8qIFBlcm1vcm0gdGhlIGNvbnZlcnNpb24gdG8gYSBkaXJlY3RfaXRlbS4gKi8KLSAgICAvKnJldHVybiBpbmRpcmVjdF90b19kaXJlY3QgKHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplLCBwX2NfbW9kZSk7Ki8KLSAgICByZXR1cm4gaW5kaXJlY3QyZGlyZWN0ICh0aCwgcF9zX2lub2RlLCBwYWdlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsKKwkvKiB0aGUgcGFnZSBiZWluZyBzZW50IGluIGNvdWxkIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGkvbyBlcnJvcgorCSAqKiByZWFkaW5nIGluIHRoZSBsYXN0IGJsb2NrLiAgVGhlIHVzZXIgd2lsbCBoaXQgcHJvYmxlbXMgdHJ5aW5nIHRvCisJICoqIHJlYWQgdGhlIGZpbGUsIGJ1dCBmb3Igbm93IHdlIGp1c3Qgc2tpcCB0aGUgaW5kaXJlY3QyZGlyZWN0CisJICovCisJaWYgKGF0b21pY19yZWFkKCZwX3NfaW5vZGUtPmlfY291bnQpID4gMSB8fAorCSAgICAhdGFpbF9oYXNfdG9fYmVfcGFja2VkKHBfc19pbm9kZSkgfHwKKwkgICAgIXBhZ2UgfHwgKFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spKSB7CisJCS8vIGxlYXZlIHRhaWwgaW4gYW4gdW5mb3JtYXR0ZWQgbm9kZSAgICAKKwkJKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwkJY3V0X2J5dGVzID0KKwkJICAgIG5fYmxvY2tfc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOworCQlwYXRocmVsc2UocF9zX3BhdGgpOworCQlyZXR1cm4gY3V0X2J5dGVzOworCX0KKwkvKiBQZXJtb3JtIHRoZSBjb252ZXJzaW9uIHRvIGEgZGlyZWN0X2l0ZW0uICovCisJLypyZXR1cm4gaW5kaXJlY3RfdG9fZGlyZWN0IChwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSwgcF9jX21vZGUpOyAqLworCXJldHVybiBpbmRpcmVjdDJkaXJlY3QodGgsIHBfc19pbm9kZSwgcGFnZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKKwkJCSAgICAgICBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsKIH0KIAotCiAvKiB3ZSBkaWQgaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24uIEFuZCB3ZSBoYXZlIGluc2VydGVkIGRpcmVjdAogICAgaXRlbSBzdWNjZXNzZXNmdWxseSwgYnV0IHRoZXJlIHdlcmUgbm8gZGlzayBzcGFjZSB0byBjdXQgdW5mbQogICAgcG9pbnRlciBiZWluZyBjb252ZXJ0ZWQuIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGRlbGV0ZSBpbnNlcnRlZAogICAgZGlyZWN0IGl0ZW0ocykgKi8KLXN0YXRpYyB2b2lkIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHBhdGggKiBwYXRoKQorc3RhdGljIHZvaWQgaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQogewotICAgIHN0cnVjdCBjcHVfa2V5IHRhaWxfa2V5OwotICAgIGludCB0YWlsX2xlbjsKLSAgICBpbnQgcmVtb3ZlZDsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJc3RydWN0IGNwdV9rZXkgdGFpbF9rZXk7CisJaW50IHRhaWxfbGVuOworCWludCByZW1vdmVkOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgbWFrZV9jcHVfa2V5ICgmdGFpbF9rZXksIGlub2RlLCBpbm9kZS0+aV9zaXplICsgMSwgVFlQRV9ESVJFQ1QsIDQpOy8vICEhISEKLSAgICB0YWlsX2tleS5rZXlfbGVuZ3RoID0gNDsKKwltYWtlX2NwdV9rZXkoJnRhaWxfa2V5LCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSArIDEsIFRZUEVfRElSRUNULCA0KTsJLy8gISEhIQorCXRhaWxfa2V5LmtleV9sZW5ndGggPSA0OwogCi0gICAgdGFpbF9sZW4gPSAoY3B1X2tleV9rX29mZnNldCAoJnRhaWxfa2V5KSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgLSAxOwotICAgIHdoaWxlICh0YWlsX2xlbikgewotCS8qIGxvb2sgZm9yIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KLQlpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAmdGFpbF9rZXksIHBhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKGlub2RlLT5pX3NiLCAidnMtNTYxNTogaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogZm91bmQgaW52YWxpZCBpdGVtIik7Ci0JUkZBTFNFKCBwYXRoLT5wb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQgKHBhdGgpKSAtIDEsCi0JICAgICAgICAidnMtNTYxNjogYXBwZW5kZWQgYnl0ZXMgZm91bmQiKTsKLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOwotCQotCXJlbW92ZWQgPSByZWlzZXJmc19kZWxldGVfaXRlbSAodGgsIHBhdGgsICZ0YWlsX2tleSwgaW5vZGUsIE5VTEwvKnVuYmggbm90IG5lZWRlZCovKTsKLQlSRkFMU0UoIHJlbW92ZWQgPD0gMCB8fCByZW1vdmVkID4gdGFpbF9sZW4sCi0JICAgICAgICAidnMtNTYxNzogdGhlcmUgd2FzIHRhaWwgJWQgYnl0ZXMsIHJlbW92ZWQgaXRlbSBsZW5ndGggJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIHRhaWxfbGVuLCByZW1vdmVkKTsKLQl0YWlsX2xlbiAtPSByZW1vdmVkOwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmdGFpbF9rZXksIGNwdV9rZXlfa19vZmZzZXQgKCZ0YWlsX2tleSkgLSByZW1vdmVkKTsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiBoYXMgYmVlbiByb2xsZWQgYmFjayBkdWUgdG8gbGFjayBvZiBkaXNrIHNwYWNlIik7Ci0gICAgLy9tYXJrX2ZpbGVfd2l0aG91dF90YWlsIChpbm9kZSk7Ci0gICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOworCXRhaWxfbGVuID0KKwkgICAgKGNwdV9rZXlfa19vZmZzZXQoJnRhaWxfa2V5KSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgLSAxOworCXdoaWxlICh0YWlsX2xlbikgeworCQkvKiBsb29rIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZSB0YWlsICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJnRhaWxfa2V5LCBwYXRoKSA9PQorCQkgICAgUE9TSVRJT05fTk9UX0ZPVU5EKQorCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgICJ2cy01NjE1OiBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBmb3VuZCBpbnZhbGlkIGl0ZW0iKTsKKwkJUkZBTFNFKHBhdGgtPnBvc19pbl9pdGVtICE9CisJCSAgICAgICBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQocGF0aCkpIC0gMSwKKwkJICAgICAgICJ2cy01NjE2OiBhcHBlbmRlZCBieXRlcyBmb3VuZCIpOworCQlQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCktLTsKKworCQlyZW1vdmVkID0KKwkJICAgIHJlaXNlcmZzX2RlbGV0ZV9pdGVtKHRoLCBwYXRoLCAmdGFpbF9rZXksIGlub2RlLAorCQkJCQkgTlVMTCAvKnVuYmggbm90IG5lZWRlZCAqLyApOworCQlSRkFMU0UocmVtb3ZlZCA8PSAwCisJCSAgICAgICB8fCByZW1vdmVkID4gdGFpbF9sZW4sCisJCSAgICAgICAidnMtNTYxNzogdGhlcmUgd2FzIHRhaWwgJWQgYnl0ZXMsIHJlbW92ZWQgaXRlbSBsZW5ndGggJWQgYnl0ZXMiLAorCQkgICAgICAgdGFpbF9sZW4sIHJlbW92ZWQpOworCQl0YWlsX2xlbiAtPSByZW1vdmVkOworCQlzZXRfY3B1X2tleV9rX29mZnNldCgmdGFpbF9rZXksCisJCQkJICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZ0YWlsX2tleSkgLSByZW1vdmVkKTsKKwl9CisJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCSAiaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gaGFzIGJlZW4gcm9sbGVkIGJhY2sgZHVlIHRvIGxhY2sgb2YgZGlzayBzcGFjZSIpOworCS8vbWFya19maWxlX3dpdGhvdXRfdGFpbCAoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogfQogCi0KIC8qIChUcnVuY2F0ZSBvciBjdXQgZW50cnkpIG9yIGRlbGV0ZSBvYmplY3QgaXRlbS4gUmV0dXJucyA8IDAgb24gZmFpbHVyZSAqLwotaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoLAotCQkJICAgIHN0cnVjdCBjcHVfa2V5ICogcF9zX2l0ZW1fa2V5LAotCQkJICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSkKK2ludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IHBhdGggKnBfc19wYXRoLAorCQkJICAgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAorCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIGxvZmZfdCBuX25ld19maWxlX3NpemUpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIC8qIEV2ZXJ5IGZ1bmN0aW9uIHdoaWNoIGlzIGdvaW5nIHRvIGNhbGwgZG9fYmFsYW5jZSBtdXN0IGZpcnN0Ci0gICAgICAgY3JlYXRlIGEgdHJlZV9iYWxhbmNlIHN0cnVjdHVyZS4gIFRoZW4gaXQgbXVzdCBmaWxsIHVwIHRoaXMKLSAgICAgICBzdHJ1Y3R1cmUgYnkgdXNpbmcgdGhlIGluaXRfdGJfc3RydWN0IGFuZCBmaXhfbm9kZXMgZnVuY3Rpb25zLgotICAgICAgIEFmdGVyIHRoYXQgd2UgY2FuIG1ha2UgdHJlZSBiYWxhbmNpbmcuICovCi0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2N1dF9iYWxhbmNlOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWg7Ci0gICAgaW50IG5fY3V0X3NpemUgPSAwLCAgICAgICAgLyogQW1vdW50IHRvIGJlIGN1dC4gKi8KLQluX3JldF92YWx1ZSA9IENBUlJZX09OLAotCW5fcmVtb3ZlZCA9IDAsICAgICAvKiBOdW1iZXIgb2YgdGhlIHJlbW92ZWQgdW5mb3JtYXR0ZWQgbm9kZXMuICovCi0Jbl9pc19pbm9kZV9sb2NrZWQgPSAwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgY19tb2RlOyAgICAgICAgICAgIC8qIE1vZGUgb2YgdGhlIGJhbGFuY2UuICovCi0gICAgaW50IHJldHZhbDIgPSAtMTsKLSAgICBpbnQgcXVvdGFfY3V0X2J5dGVzOwotICAgIGxvZmZfdCB0YWlsX3BvcyA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisJLyogRXZlcnkgZnVuY3Rpb24gd2hpY2ggaXMgZ29pbmcgdG8gY2FsbCBkb19iYWxhbmNlIG11c3QgZmlyc3QKKwkgICBjcmVhdGUgYSB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlLiAgVGhlbiBpdCBtdXN0IGZpbGwgdXAgdGhpcworCSAgIHN0cnVjdHVyZSBieSB1c2luZyB0aGUgaW5pdF90Yl9zdHJ1Y3QgYW5kIGZpeF9ub2RlcyBmdW5jdGlvbnMuCisJICAgQWZ0ZXIgdGhhdCB3ZSBjYW4gbWFrZSB0cmVlIGJhbGFuY2luZy4gKi8KKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfY3V0X2JhbGFuY2U7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsKKwlpbnQgbl9jdXRfc2l6ZSA9IDAsCS8qIEFtb3VudCB0byBiZSBjdXQuICovCisJICAgIG5fcmV0X3ZhbHVlID0gQ0FSUllfT04sIG5fcmVtb3ZlZCA9IDAsCS8qIE51bWJlciBvZiB0aGUgcmVtb3ZlZCB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwkgICAgbl9pc19pbm9kZV9sb2NrZWQgPSAwOworCWNoYXIgY19tb2RlOwkJLyogTW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KKwlpbnQgcmV0dmFsMiA9IC0xOworCWludCBxdW90YV9jdXRfYnl0ZXM7CisJbG9mZl90IHRhaWxfcG9zID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICAKLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfY3V0X2JhbGFuY2UsIHBfc19pbm9kZS0+aV9zYiwgcF9zX3BhdGgsIG5fY3V0X3NpemUpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2N1dF9iYWxhbmNlLCBwX3NfaW5vZGUtPmlfc2IsIHBfc19wYXRoLAorCQkgICAgICAgbl9jdXRfc2l6ZSk7CiAKLSAgICAvKiBSZXBlYXQgdGhpcyBsb29wIHVudGlsIHdlIGVpdGhlciBjdXQgdGhlIGl0ZW0gd2l0aG91dCBuZWVkaW5nCi0gICAgICAgdG8gYmFsYW5jZSwgb3Igd2UgZml4X25vZGVzIHdpdGhvdXQgc2NoZWR1bGUgb2NjdXJyaW5nICovCi0gICAgd2hpbGUgKCAxICkgewotCS8qIERldGVybWluZSB0aGUgYmFsYW5jZSBtb2RlLCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSB0bwotCSAgIGJlIGN1dCwgYW5kIHNpemUgdG8gYmUgY3V0LiAgSW4gY2FzZSBvZiB0aGUgaW5kaXJlY3QgaXRlbQotCSAgIGZyZWUgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggYXJlIHBvaW50ZWQgdG8gYnkgdGhlIGN1dAotCSAgIHBvaW50ZXJzLiAqLwotICAgICAgCi0JY19tb2RlID0gcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCAmbl9yZW1vdmVkLCAKLQkJCQkJICAgJm5fY3V0X3NpemUsIG5fbmV3X2ZpbGVfc2l6ZSk7Ci0JaWYgKCBjX21vZGUgPT0gTV9DT05WRVJUICkgIHsKLQkgICAgLyogY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gZGlyZWN0IGl0ZW0gb3IgbGVhdmUKLSAgICAgICAgICAgICAgIHRhaWwgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KLQkgICAgUkZBTFNFKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiwgIlBBUC01NTcwOiBjYW4gbm90IGNvbnZlcnQgdHdpY2UiKTsKKwkvKiBSZXBlYXQgdGhpcyBsb29wIHVudGlsIHdlIGVpdGhlciBjdXQgdGhlIGl0ZW0gd2l0aG91dCBuZWVkaW5nCisJICAgdG8gYmFsYW5jZSwgb3Igd2UgZml4X25vZGVzIHdpdGhvdXQgc2NoZWR1bGUgb2NjdXJyaW5nICovCisJd2hpbGUgKDEpIHsKKwkJLyogRGV0ZXJtaW5lIHRoZSBiYWxhbmNlIG1vZGUsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIHRvCisJCSAgIGJlIGN1dCwgYW5kIHNpemUgdG8gYmUgY3V0LiAgSW4gY2FzZSBvZiB0aGUgaW5kaXJlY3QgaXRlbQorCQkgICBmcmVlIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIGFyZSBwb2ludGVkIHRvIGJ5IHRoZSBjdXQKKwkJICAgcG9pbnRlcnMuICovCiAKLQkgICAgbl9yZXRfdmFsdWUgPSBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QgKHRoLCBwX3NfaW5vZGUsIHBhZ2UsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksCi0JCQkJCQkgICAgbl9uZXdfZmlsZV9zaXplLCAmY19tb2RlKTsKLQkgICAgaWYgKCBjX21vZGUgPT0gTV9TS0lQX0JBTEFOQ0lORyApCi0JCS8qIHRhaWwgaGFzIGJlZW4gbGVmdCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLwotCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJCWNfbW9kZSA9CisJCSAgICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLAorCQkJCQkgICAgICBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsCisJCQkJCSAgICAgICZuX2N1dF9zaXplLCBuX25ld19maWxlX3NpemUpOworCQlpZiAoY19tb2RlID09IE1fQ09OVkVSVCkgeworCQkJLyogY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gZGlyZWN0IGl0ZW0gb3IgbGVhdmUKKwkJCSAgIHRhaWwgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJCVJGQUxTRShuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiwKKwkJCSAgICAgICAiUEFQLTU1NzA6IGNhbiBub3QgY29udmVydCB0d2ljZSIpOwogCi0JICAgIG5faXNfaW5vZGVfbG9ja2VkID0gMTsKLQkgIAotCSAgICAvKiByZW1vdmluZyBvZiBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgd2lsbCBjaGFuZ2UgdmFsdWUgd2UKLSAgICAgICAgICAgICAgIGhhdmUgdG8gcmV0dXJuIHRvIHRydW5jYXRlLiBTYXZlIGl0ICovCi0JICAgIHJldHZhbDIgPSBuX3JldF92YWx1ZTsKLQkgICAgLypyZXR2YWwyID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsqLwotCSAgCi0JICAgIC8qIFNvLCB3ZSBoYXZlIHBlcmZvcm1lZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgY29udmVyc2lvbjoKLQkgICAgICAgaW5zZXJ0aW5nIHRoZSBuZXcgZGlyZWN0IGl0ZW0uICBOb3cgd2UgYXJlIHJlbW92aW5nIHRoZQotCSAgICAgICBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlci4gU2V0IGtleSB0byBzZWFyY2ggZm9yCi0JICAgICAgIGl0LiAqLwotICAgICAgCSAgICBzZXRfY3B1X2tleV9rX3R5cGUgKHBfc19pdGVtX2tleSwgVFlQRV9JTkRJUkVDVCk7Ci0JICAgIHBfc19pdGVtX2tleS0+a2V5X2xlbmd0aCA9IDQ7Ci0JICAgIG5fbmV3X2ZpbGVfc2l6ZSAtPSAobl9uZXdfZmlsZV9zaXplICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSk7Ci0JICAgIHRhaWxfcG9zID0gbl9uZXdfZmlsZV9zaXplOwotCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAocF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUgKyAxKTsKLQkgICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCApewotCQlwcmludF9ibG9jayAoUEFUSF9QTEFTVF9CVUZGRVIgKHBfc19wYXRoKSwgMywgUEFUSF9MQVNUX1BPU0lUSU9OIChwX3NfcGF0aCkgLSAxLCBQQVRIX0xBU1RfUE9TSVRJT04gKHBfc19wYXRoKSArIDEpOwotCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJQQVAtNTU4MDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSB0byBjb252ZXJ0IGRvZXMgbm90IGV4aXN0ICglSykiLCBwX3NfaXRlbV9rZXkpOwotCSAgICB9Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAobl9jdXRfc2l6ZSA9PSAwKSB7Ci0JICAgIHBhdGhyZWxzZSAocF9zX3BhdGgpOwotCSAgICByZXR1cm4gMDsKKwkJCW5fcmV0X3ZhbHVlID0KKwkJCSAgICBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QodGgsIHBfc19pbm9kZSwgcGFnZSwKKwkJCQkJCSAgICAgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKKwkJCQkJCSAgICAgbl9uZXdfZmlsZV9zaXplLCAmY19tb2RlKTsKKwkJCWlmIChjX21vZGUgPT0gTV9TS0lQX0JBTEFOQ0lORykKKwkJCQkvKiB0YWlsIGhhcyBiZWVuIGxlZnQgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisKKwkJCW5faXNfaW5vZGVfbG9ja2VkID0gMTsKKworCQkJLyogcmVtb3Zpbmcgb2YgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHdpbGwgY2hhbmdlIHZhbHVlIHdlCisJCQkgICBoYXZlIHRvIHJldHVybiB0byB0cnVuY2F0ZS4gU2F2ZSBpdCAqLworCQkJcmV0dmFsMiA9IG5fcmV0X3ZhbHVlOworCQkJLypyZXR2YWwyID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsgKi8KKworCQkJLyogU28sIHdlIGhhdmUgcGVyZm9ybWVkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uOgorCQkJICAgaW5zZXJ0aW5nIHRoZSBuZXcgZGlyZWN0IGl0ZW0uICBOb3cgd2UgYXJlIHJlbW92aW5nIHRoZQorCQkJICAgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuIFNldCBrZXkgdG8gc2VhcmNoIGZvcgorCQkJICAgaXQuICovCisJCQlzZXRfY3B1X2tleV9rX3R5cGUocF9zX2l0ZW1fa2V5LCBUWVBFX0lORElSRUNUKTsKKwkJCXBfc19pdGVtX2tleS0+a2V5X2xlbmd0aCA9IDQ7CisJCQluX25ld19maWxlX3NpemUgLT0KKwkJCSAgICAobl9uZXdfZmlsZV9zaXplICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSk7CisJCQl0YWlsX3BvcyA9IG5fbmV3X2ZpbGVfc2l6ZTsKKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplICsgMSk7CisJCQlpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkKKwkJCSAgICAocF9zX3NiLCBwX3NfaXRlbV9rZXksCisJCQkgICAgIHBfc19wYXRoKSA9PSBQT1NJVElPTl9OT1RfRk9VTkQpIHsKKwkJCQlwcmludF9ibG9jayhQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksIDMsCisJCQkJCSAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpIC0gMSwKKwkJCQkJICAgIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgKyAxKTsKKwkJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJCSAgICAgICAiUEFQLTU1ODA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gdG8gY29udmVydCBkb2VzIG5vdCBleGlzdCAoJUspIiwKKwkJCQkJICAgICAgIHBfc19pdGVtX2tleSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobl9jdXRfc2l6ZSA9PSAwKSB7CisJCQlwYXRocmVsc2UocF9zX3BhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9jdXRfc2l6ZTsKKworCQluX3JldF92YWx1ZSA9IGZpeF9ub2RlcyhjX21vZGUsICZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0gpCisJCQlicmVhazsKKworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQpOworCisJCW5fcmV0X3ZhbHVlID0KKwkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7CisJCWlmIChuX3JldF92YWx1ZSA9PSBQT1NJVElPTl9GT1VORCkKKwkJCWNvbnRpbnVlOworCisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiUEFQLTU2MTA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gJUsgbm90IGZvdW5kIiwKKwkJCQkgcF9zX2l0ZW1fa2V5KTsKKwkJdW5maXhfbm9kZXMoJnNfY3V0X2JhbGFuY2UpOworCQlyZXR1cm4gKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKSA/IC1FSU8gOiAtRU5PRU5UOworCX0JCQkvKiB3aGlsZSAqLworCisJLy8gY2hlY2sgZml4X25vZGVzIHJlc3VsdHMgKElPX0VSUk9SIG9yIE5PX0RJU0tfU1BBQ0UpCisJaWYgKG5fcmV0X3ZhbHVlICE9IENBUlJZX09OKSB7CisJCWlmIChuX2lzX2lub2RlX2xvY2tlZCkgeworCQkJLy8gRklYTUU6IHRoaXMgc2VlbXMgdG8gYmUgbm90IG5lZWRlZDogd2UgYXJlIGFsd2F5cyBhYmxlCisJCQkvLyB0byBjdXQgaXRlbQorCQkJaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCk7CisJCX0KKwkJaWYgKG5fcmV0X3ZhbHVlID09IE5PX0RJU0tfU1BBQ0UpCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIk5PX0RJU0tfU1BBQ0UiKTsKKwkJdW5maXhfbm9kZXMoJnNfY3V0X2JhbGFuY2UpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9jdXRfc2l6ZTsKLQkKLQluX3JldF92YWx1ZSA9IGZpeF9ub2RlcyhjX21vZGUsICZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKLSAgICAgIAlpZiAoIG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0ggKQotCSAgICBicmVhazsKLQkKLQlQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkICk7CisJLyogZ28gYWhlYWQgYW5kIHBlcmZvcm0gYmFsYW5jaW5nICovCiAKLQluX3JldF92YWx1ZSA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7Ci0JaWYgKG5fcmV0X3ZhbHVlID09IFBPU0lUSU9OX0ZPVU5EKQotCSAgICBjb250aW51ZTsKKwlSRkFMU0UoY19tb2RlID09IE1fUEFTVEUgfHwgY19tb2RlID09IE1fSU5TRVJULCAiaW52YWxpZCBtb2RlIik7CiAKLQlyZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJQQVAtNTYxMDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSAlSyBub3QgZm91bmQiLCBwX3NfaXRlbV9rZXkpOwotCXVuZml4X25vZGVzICgmc19jdXRfYmFsYW5jZSk7Ci0JcmV0dXJuIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikgPyAtRUlPIDogLUVOT0VOVDsKLSAgICB9IC8qIHdoaWxlICovCi0gIAotICAgIC8vIGNoZWNrIGZpeF9ub2RlcyByZXN1bHRzIChJT19FUlJPUiBvciBOT19ESVNLX1NQQUNFKQotICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7Ci0JaWYgKCBuX2lzX2lub2RlX2xvY2tlZCApIHsKLQkgICAgLy8gRklYTUU6IHRoaXMgc2VlbXMgdG8gYmUgbm90IG5lZWRlZDogd2UgYXJlIGFsd2F5cyBhYmxlCi0JICAgIC8vIHRvIGN1dCBpdGVtCi0JICAgIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoKTsKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBjdXQgZnJvbSB0aGUgaXRlbS4gKi8KKwlxdW90YV9jdXRfYnl0ZXMgPQorCSAgICAoY19tb2RlID09CisJICAgICBNX0RFTEVURSkgPyBpaF9pdGVtX2xlbihnZXRfaWgocF9zX3BhdGgpKSA6IC1zX2N1dF9iYWxhbmNlLgorCSAgICBpbnNlcnRfc2l6ZVswXTsKKwlpZiAocmV0dmFsMiA9PSAtMSkKKwkJbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2N1dF9iYWxhbmNlLCBjX21vZGUpOworCWVsc2UKKwkJbl9yZXRfdmFsdWUgPSByZXR2YWwyOworCisJLyogRm9yIGRpcmVjdCBpdGVtcywgd2Ugb25seSBjaGFuZ2UgdGhlIHF1b3RhIHdoZW4gZGVsZXRpbmcgdGhlIGxhc3QKKwkgKiogaXRlbS4KKwkgKi8KKwlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7CisJaWYgKCFTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocF9sZV9paCkpIHsKKwkJaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJgorCQkgICAgKGxlX2loX2tfb2Zmc2V0KHBfbGVfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0KKwkJICAgIDEpIHsKKwkJCS8vIEZJWE1FOiB0aGlzIGlzIHRvIGtlZXAgMy41IGhhcHB5CisJCQlSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBVMzJfTUFYOworCQkJcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9IGVsc2UgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gMDsKKwkJfQogCX0KLQlpZiAobl9yZXRfdmFsdWUgPT0gTk9fRElTS19TUEFDRSkKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiTk9fRElTS19TUEFDRSIpOwotCXVuZml4X25vZGVzICgmc19jdXRfYmFsYW5jZSk7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotCi0gICAgLyogZ28gYWhlYWQgYW5kIHBlcmZvcm0gYmFsYW5jaW5nICovCi0gICAgCi0gICAgUkZBTFNFKCBjX21vZGUgPT0gTV9QQVNURSB8fCBjX21vZGUgPT0gTV9JTlNFUlQsICJpbnZhbGlkIG1vZGUiKTsKLQotICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIGN1dCBmcm9tIHRoZSBpdGVtLiAqLwotICAgIHF1b3RhX2N1dF9ieXRlcyA9ICggY19tb2RlID09IE1fREVMRVRFICkgPyBpaF9pdGVtX2xlbihnZXRfaWgocF9zX3BhdGgpKSA6IC1zX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdOwotICAgIGlmIChyZXR2YWwyID09IC0xKQotCW5fcmV0X3ZhbHVlID0gY2FsY19kZWxldGVkX2J5dGVzX251bWJlcigmc19jdXRfYmFsYW5jZSwgY19tb2RlKTsKLSAgICBlbHNlCi0Jbl9yZXRfdmFsdWUgPSByZXR2YWwyOwotCi0KLSAgICAvKiBGb3IgZGlyZWN0IGl0ZW1zLCB3ZSBvbmx5IGNoYW5nZSB0aGUgcXVvdGEgd2hlbiBkZWxldGluZyB0aGUgbGFzdAotICAgICoqIGl0ZW0uCi0gICAgKi8KLSAgICBwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEIChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOwotICAgIGlmICghU19JU0xOSyAocF9zX2lub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX2xlX2loKSkgewotICAgICAgICBpZiAoY19tb2RlID09IE1fREVMRVRFICYmCi0JICAgKGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpID09IDEgKSB7Ci0JICAgIC8vIEZJWE1FOiB0aGlzIGlzIHRvIGtlZXAgMy41IGhhcHB5Ci0JICAgIFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IHBfc19zYi0+c19ibG9ja3NpemUgKyBVTkZNX1BfU0laRSA7Ci0gICAgICAgIH0gZWxzZSB7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IDAgOwotCX0KLSAgICB9CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7Ci0Jc3RydWN0IGl0ZW1faGVhZCAqIGxlX2loID0gUEFUSF9QSVRFTV9IRUFEIChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOwotCS8qIHdlIGFyZSBnb2luZyB0byBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbi4gTWFrZQotICAgICAgICAgICBzdXJlLCB0aGF0IHdlIGV4YWN0bHkgcmVtb3ZlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyCi0gICAgICAgICAgIG9mIHRoZSBpdGVtICovCi0JaWYgKCFpc19pbmRpcmVjdF9sZV9paCAobGVfaWgpKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1MjogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgotCQkJICAgICJpdGVtIG11c3QgYmUgaW5kaXJlY3QgJWgiLCBsZV9paCk7CisJaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7CisJCXN0cnVjdCBpdGVtX2hlYWQgKmxlX2loID0KKwkJICAgIFBBVEhfUElURU1fSEVBRChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOworCQkvKiB3ZSBhcmUgZ29pbmcgdG8gY29tcGxldGUgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24uIE1ha2UKKwkJICAgc3VyZSwgdGhhdCB3ZSBleGFjdGx5IHJlbW92ZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlcgorCQkgICBvZiB0aGUgaXRlbSAqLworCQlpZiAoIWlzX2luZGlyZWN0X2xlX2loKGxlX2loKSkKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgInZzLTU2NTI6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKKwkJCQkgICAgICAgIml0ZW0gbXVzdCBiZSBpbmRpcmVjdCAlaCIsIGxlX2loKTsKIAotCWlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYgaWhfaXRlbV9sZW4obGVfaWgpICE9IFVORk1fUF9TSVpFKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1MzogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgotCQkJICAgICJjb21wbGV0aW5nIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIGluZGlyZWN0IGl0ZW0gJWggIgotCQkJICAgICJiZWluZyBkZWxldGVkIG11c3QgYmUgb2YgNCBieXRlIGxvbmciLCBsZV9paCk7CisJCWlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYgaWhfaXRlbV9sZW4obGVfaWgpICE9IFVORk1fUF9TSVpFKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAidnMtNTY1MzogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgorCQkJCSAgICAgICAiY29tcGxldGluZyBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiBpbmRpcmVjdCBpdGVtICVoICIKKwkJCQkgICAgICAgImJlaW5nIGRlbGV0ZWQgbXVzdCBiZSBvZiA0IGJ5dGUgbG9uZyIsCisJCQkJICAgICAgIGxlX2loKTsKIAotCWlmIChjX21vZGUgPT0gTV9DVVQgJiYgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSAhPSAtVU5GTV9QX1NJWkUpIHsKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgInZzLTU2NTQ6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKLQkJCSAgICAiY2FuIG5vdCBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiBvZiAlaCAoQ1VULCBpbnNlcnRfc2l6ZT09JWQpIiwKLQkJCSAgICBsZV9paCwgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSk7CisJCWlmIChjX21vZGUgPT0gTV9DVVQKKwkJICAgICYmIHNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gIT0gLVVORk1fUF9TSVpFKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJ2cy01NjU0OiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkJICAgICAgICJjYW4gbm90IGNvbXBsZXRlIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIG9mICVoIChDVVQsIGluc2VydF9zaXplPT0lZCkiLAorCQkJCSAgICAgICBsZV9paCwgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSk7CisJCX0KKwkJLyogaXQgd291bGQgYmUgdXNlZnVsIHRvIG1ha2Ugc3VyZSwgdGhhdCByaWdodCBuZWlnaGJvcmluZworCQkgICBpdGVtIGlzIGRpcmVjdCBpdGVtIG9mIHRoaXMgZmlsZSAqLwogCX0KLQkvKiBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gbWFrZSBzdXJlLCB0aGF0IHJpZ2h0IG5laWdoYm9yaW5nCi0gICAgICAgICAgIGl0ZW0gaXMgZGlyZWN0IGl0ZW0gb2YgdGhpcyBmaWxlICovCi0gICAgfQogI2VuZGlmCi0gICAgCi0gICAgZG9fYmFsYW5jZSgmc19jdXRfYmFsYW5jZSwgTlVMTCwgTlVMTCwgY19tb2RlKTsKLSAgICBpZiAoIG5faXNfaW5vZGVfbG9ja2VkICkgewotCS8qIHdlJ3ZlIGRvbmUgYW4gaW5kaXJlY3QtPmRpcmVjdCBjb252ZXJzaW9uLiAgd2hlbiB0aGUgZGF0YSBibG9jawotCSoqIHdhcyBmcmVlZCwgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBtdXN0Ci0JKiogYmUgZmx1c2hlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsIG1ha2Ugc3VyZSB0bwotCSoqIHVubWFwIGFuZCBpbnZhbGlkYXRlIGl0Ci0JKi8KLQl1bm1hcF9idWZmZXJzKHBhZ2UsIHRhaWxfcG9zKTsKLQlSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKLSAgICB9CisKKwlkb19iYWxhbmNlKCZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMLCBjX21vZGUpOworCWlmIChuX2lzX2lub2RlX2xvY2tlZCkgeworCQkvKiB3ZSd2ZSBkb25lIGFuIGluZGlyZWN0LT5kaXJlY3QgY29udmVyc2lvbi4gIHdoZW4gdGhlIGRhdGEgYmxvY2sKKwkJICoqIHdhcyBmcmVlZCwgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBtdXN0CisJCSAqKiBiZSBmbHVzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywgbWFrZSBzdXJlIHRvCisJCSAqKiB1bm1hcCBhbmQgaW52YWxpZGF0ZSBpdAorCQkgKi8KKwkJdW5tYXBfYnVmZmVycyhwYWdlLCB0YWlsX3Bvcyk7CisJCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisJfQogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKHBfc19pbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGN1dF9mcm9tX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfY3V0X2J5dGVzLCBwX3NfaW5vZGUtPmlfdWlkLCAnPycpOworCXJlaXNlcmZzX2RlYnVnKHBfc19pbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBjdXRfZnJvbV9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCSAgICAgICBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsICc/Jyk7CiAjZW5kaWYKLSAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOwotICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCXJldHVybiBuX3JldF92YWx1ZTsKIH0KIAotc3RhdGljIHZvaWQgdHJ1bmNhdGVfZGlyZWN0b3J5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgdm9pZCB0cnVuY2F0ZV9kaXJlY3Rvcnkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgaWYgKGlub2RlLT5pX25saW5rKQotCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAidnMtNTY1NTogdHJ1bmNhdGVfZGlyZWN0b3J5OiBsaW5rIGNvdW50ICE9IDAiKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJ2cy01NjU1OiB0cnVuY2F0ZV9kaXJlY3Rvcnk6IGxpbmsgY291bnQgIT0gMCIpOwogCi0gICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgRE9UX09GRlNFVCk7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFRZUEVfRElSRU5UUlkpOwotICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICh0aCwgaW5vZGUsIElOT0RFX1BLRVkgKGlub2RlKSk7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOwotICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFNEX09GRlNFVCk7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFRZUEVfU1RBVF9EQVRBKTsgICAgCisJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWShpbm9kZSksIERPVF9PRkZTRVQpOworCXNldF9sZV9rZXlfa190eXBlKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZKGlub2RlKSwgVFlQRV9ESVJFTlRSWSk7CisJcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0odGgsIGlub2RlLCBJTk9ERV9QS0VZKGlub2RlKSk7CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWShpbm9kZSksIFNEX09GRlNFVCk7CisJc2V0X2xlX2tleV9rX3R5cGUoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkoaW5vZGUpLCBUWVBFX1NUQVRfREFUQSk7CiB9CiAKLQotCi0KIC8qIFRydW5jYXRlIGZpbGUgdG8gdGhlIG5ldyBzaXplLiBOb3RlLCB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGggYSB0cmFuc2FjdGlvbgogICAgYWxyZWFkeSBzdGFydGVkICovCi1pbnQgcmVpc2VyZnNfZG9fdHJ1bmNhdGUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgc3RydWN0ICBpbm9kZSAqIHBfc19pbm9kZSwgLyogLT5pX3NpemUgY29udGFpbnMgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICovCi0JCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgLyogdXAgdG8gZGF0ZSBmb3IgbGFzdCBibG9jayAqLwotCQkJICAgaW50IHVwZGF0ZV90aW1lc3RhbXBzICAvKiB3aGVuIGl0IGlzIGNhbGxlZCBieQotCQkJCQkJICAgICBmaWxlX3JlbGVhc2UgdG8gY29udmVydAotCQkJCQkJICAgICB0aGUgdGFpbCAtIG5vIHRpbWVzdGFtcHMKLQkJCQkJCSAgICAgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KLSAgICApIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHNfc2VhcmNoX3BhdGgpOyAgICAgICAvKiBQYXRoIHRvIHRoZSBjdXJyZW50IG9iamVjdCBpdGVtLiAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgKiBwX2xlX2loOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gYW4gaXRlbSBoZWFkZXIuICovCi0gICAgc3RydWN0IGNwdV9rZXkgICAgICBzX2l0ZW1fa2V5OyAgICAgLyogS2V5IHRvIHNlYXJjaCBmb3IgYSBwcmV2aW91cyBmaWxlIGl0ZW0uICovCi0gICAgbG9mZl90ICAgICAgICAgbl9maWxlX3NpemUsICAgIC8qIE9sZCBmaWxlIHNpemUuICovCi0Jbl9uZXdfZmlsZV9zaXplOy8qIE5ldyBmaWxlIHNpemUuICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fZGVsZXRlZDsgICAgICAvKiBOdW1iZXIgb2YgZGVsZXRlZCBvciB0cnVuY2F0ZWQgYnl0ZXMuICovCi0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgZXJyID0gMDsKK2ludCByZWlzZXJmc19kb190cnVuY2F0ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCS8qIC0+aV9zaXplIGNvbnRhaW5zIG5ldworCQkJCQkJCQkJCQkJICAgc2l6ZSAqLworCQkJIHN0cnVjdCBwYWdlICpwYWdlLAkvKiB1cCB0byBkYXRlIGZvciBsYXN0IGJsb2NrICovCisJCQkgaW50IHVwZGF0ZV90aW1lc3RhbXBzCS8qIHdoZW4gaXQgaXMgY2FsbGVkIGJ5CisJCQkJCQkgICBmaWxlX3JlbGVhc2UgdG8gY29udmVydAorCQkJCQkJICAgdGhlIHRhaWwgLSBubyB0aW1lc3RhbXBzCisJCQkJCQkgICBzaG91bGQgYmUgdXBkYXRlZCAqLworICAgICkKK3sKKwlJTklUSUFMSVpFX1BBVEgoc19zZWFyY2hfcGF0aCk7CS8qIFBhdGggdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGl0ZW0uICovCisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsJLyogUG9pbnRlciB0byBhbiBpdGVtIGhlYWRlci4gKi8KKwlzdHJ1Y3QgY3B1X2tleSBzX2l0ZW1fa2V5OwkvKiBLZXkgdG8gc2VhcmNoIGZvciBhIHByZXZpb3VzIGZpbGUgaXRlbS4gKi8KKwlsb2ZmX3Qgbl9maWxlX3NpemUsCS8qIE9sZCBmaWxlIHNpemUuICovCisJIG5fbmV3X2ZpbGVfc2l6ZTsJLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwlpbnQgbl9kZWxldGVkOwkJLyogTnVtYmVyIG9mIGRlbGV0ZWQgb3IgdHJ1bmNhdGVkIGJ5dGVzLiAqLworCWludCByZXR2YWw7CisJaW50IGVyciA9IDA7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgaWYgKCAhIChTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSkgKQotCXJldHVybiAwOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmICghCisJICAgIChTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKQorCSAgICAgfHwgU19JU0xOSyhwX3NfaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm4gMDsKIAotICAgIGlmIChTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSkgewotCS8vIGRlbGV0aW9uIG9mIGRpcmVjdG9yeSAtIG5vIG5lZWQgdG8gdXBkYXRlIHRpbWVzdGFtcHMKLQl0cnVuY2F0ZV9kaXJlY3RvcnkgKHRoLCBwX3NfaW5vZGUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEdldCBuZXcgZmlsZSBzaXplLiAqLwotICAgIG5fbmV3X2ZpbGVfc2l6ZSA9IHBfc19pbm9kZS0+aV9zaXplOwotCi0gICAgLy8gRklYTUU6IG5vdGUsIHRoYXQga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQgaGVyZQotICAgIG1ha2VfY3B1X2tleSAoJnNfaXRlbV9rZXksIHBfc19pbm9kZSwgbWF4X3JlaXNlcmZzX29mZnNldCAocF9zX2lub2RlKSwgVFlQRV9ESVJFQ1QsIDMpOwotCi0gICAgcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX2lub2RlLT5pX3NiLCAmc19pdGVtX2tleSwgJnNfc2VhcmNoX3BhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJ2cy01NjU3OiByZWlzZXJmc19kb190cnVuY2F0ZTogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHRydW5jYXRlICVLIiwgJnNfaXRlbV9rZXkpOwotICAgICAgICBlcnIgPSAtRUlPOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCB8fCByZXR2YWwgPT0gRklMRV9OT1RfRk9VTkQpIHsKLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJQQVAtNTY2MDogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6ICIKLQkJCSAgIndyb25nIHJlc3VsdCAlZCBvZiBzZWFyY2ggZm9yICVLIiwgcmV0dmFsLCAmc19pdGVtX2tleSk7Ci0KLSAgICAgICAgZXJyID0gLUVJTzsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgc19zZWFyY2hfcGF0aC5wb3NfaW5faXRlbSAtLTsKLQotICAgIC8qIEdldCByZWFsIGZpbGUgc2l6ZSAodG90YWwgbGVuZ3RoIG9mIGFsbCBmaWxlIGl0ZW1zKSAqLwotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoJnNfc2VhcmNoX3BhdGgpOwotICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkKLQluX2ZpbGVfc2l6ZSA9IDA7Ci0gICAgZWxzZSB7Ci0JbG9mZl90IG9mZnNldCA9IGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKTsKLQlpbnQgYnl0ZXMgPSBvcF9ieXRlc19udW1iZXIgKHBfbGVfaWgscF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0KLQkvKiB0aGlzIG1heSBtaXNtYXRjaCB3aXRoIHJlYWwgZmlsZSBzaXplOiBpZiBsYXN0IGRpcmVjdCBpdGVtCi0gICAgICAgICAgIGhhZCBubyBwYWRkaW5nIHplcm9zIGFuZCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgaGFkIG5vIGZyZWUKLSAgICAgICAgICAgc3BhY2UsIHRoaXMgZmlsZSB3b3VsZCBoYXZlIHRoaXMgZmlsZSBzaXplICovCi0Jbl9maWxlX3NpemUgPSBvZmZzZXQgKyBieXRlcyAtIDE7Ci0gICAgfQotICAgIC8qCi0gICAgICogYXJlIHdlIGRvaW5nIGEgZnVsbCB0cnVuY2F0ZSBvciBkZWxldGUsIGlmIHNvCi0gICAgICoga2ljayBpbiB0aGUgcmVhZGEgY29kZQotICAgICAqLwotICAgIGlmIChuX25ld19maWxlX3NpemUgPT0gMCkKLSAgICAgICAgc19zZWFyY2hfcGF0aC5yZWFkYSA9IFBBVEhfUkVBREEgfCBQQVRIX1JFQURBX0JBQ0s7Ci0KLSAgICBpZiAoIG5fZmlsZV9zaXplID09IDAgfHwgbl9maWxlX3NpemUgPCBuX25ld19maWxlX3NpemUgKSB7Ci0JZ290byB1cGRhdGVfYW5kX291dCA7Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnNfaXRlbV9rZXksIG5fZmlsZV9zaXplKTsKLQotICAgIGRvICB7Ci0JLyogQ3V0IG9yIGRlbGV0ZSBmaWxlIGl0ZW0uICovCi0Jbl9kZWxldGVkID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSh0aCwgJnNfc2VhcmNoX3BhdGgsICZzX2l0ZW1fa2V5LCBwX3NfaW5vZGUsICBwYWdlLCBuX25ld19maWxlX3NpemUpOwotCWlmIChuX2RlbGV0ZWQgPCAwKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgInZzLTU2NjU6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtIGZhaWxlZCIpOwotCSAgICByZWlzZXJmc19jaGVja19wYXRoKCZzX3NlYXJjaF9wYXRoKSA7Ci0JICAgIHJldHVybiAwOworCWlmIChTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSkgeworCQkvLyBkZWxldGlvbiBvZiBkaXJlY3RvcnkgLSBubyBuZWVkIHRvIHVwZGF0ZSB0aW1lc3RhbXBzCisJCXRydW5jYXRlX2RpcmVjdG9yeSh0aCwgcF9zX2lub2RlKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JUkZBTFNFKCBuX2RlbGV0ZWQgPiBuX2ZpbGVfc2l6ZSwKLQkJIlBBUC01NjcwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiB0b28gbWFueSBieXRlcyBkZWxldGVkOiBkZWxldGVkICVkLCBmaWxlX3NpemUgJWx1LCBpdGVtX2tleSAlSyIsCi0JCW5fZGVsZXRlZCwgbl9maWxlX3NpemUsICZzX2l0ZW1fa2V5KTsKKwkvKiBHZXQgbmV3IGZpbGUgc2l6ZS4gKi8KKwluX25ld19maWxlX3NpemUgPSBwX3NfaW5vZGUtPmlfc2l6ZTsKIAotCS8qIENoYW5nZSBrZXkgdG8gc2VhcmNoIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KLQluX2ZpbGVfc2l6ZSAtPSBuX2RlbGV0ZWQ7CisJLy8gRklYTUU6IG5vdGUsIHRoYXQga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQgaGVyZQorCW1ha2VfY3B1X2tleSgmc19pdGVtX2tleSwgcF9zX2lub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0KHBfc19pbm9kZSksCisJCSAgICAgVFlQRV9ESVJFQ1QsIDMpOwogCi0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZzX2l0ZW1fa2V5LCBuX2ZpbGVfc2l6ZSk7CisJcmV0dmFsID0KKwkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX2lub2RlLT5pX3NiLCAmc19pdGVtX2tleSwKKwkJCQkgICAgICAgJnNfc2VhcmNoX3BhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJICJ2cy01NjU3OiByZWlzZXJmc19kb190cnVuY2F0ZTogIgorCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHRydW5jYXRlICVLIiwKKwkJCQkgJnNfaXRlbV9rZXkpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCB8fCByZXR2YWwgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJICJQQVAtNTY2MDogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6ICIKKwkJCQkgIndyb25nIHJlc3VsdCAlZCBvZiBzZWFyY2ggZm9yICVLIiwgcmV0dmFsLAorCQkJCSAmc19pdGVtX2tleSk7CiAKLQkvKiBXaGlsZSB0aGVyZSBhcmUgYnl0ZXMgdG8gdHJ1bmNhdGUgYW5kIHByZXZpb3VzIGZpbGUgaXRlbSBpcyBwcmVzZW50ZWQgaW4gdGhlIHRyZWUuICovCisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KIAorCXNfc2VhcmNoX3BhdGgucG9zX2luX2l0ZW0tLTsKKworCS8qIEdldCByZWFsIGZpbGUgc2l6ZSAodG90YWwgbGVuZ3RoIG9mIGFsbCBmaWxlIGl0ZW1zKSAqLworCXBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoJnNfc2VhcmNoX3BhdGgpOworCWlmIChpc19zdGF0ZGF0YV9sZV9paChwX2xlX2loKSkKKwkJbl9maWxlX3NpemUgPSAwOworCWVsc2UgeworCQlsb2ZmX3Qgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQocF9sZV9paCk7CisJCWludCBieXRlcyA9CisJCSAgICBvcF9ieXRlc19udW1iZXIocF9sZV9paCwgcF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisKKwkJLyogdGhpcyBtYXkgbWlzbWF0Y2ggd2l0aCByZWFsIGZpbGUgc2l6ZTogaWYgbGFzdCBkaXJlY3QgaXRlbQorCQkgICBoYWQgbm8gcGFkZGluZyB6ZXJvcyBhbmQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIGhhZCBubyBmcmVlCisJCSAgIHNwYWNlLCB0aGlzIGZpbGUgd291bGQgaGF2ZSB0aGlzIGZpbGUgc2l6ZSAqLworCQluX2ZpbGVfc2l6ZSA9IG9mZnNldCArIGJ5dGVzIC0gMTsKKwl9CiAJLyoKLQkqKiBUaGlzIGxvb3AgY291bGQgdGFrZSBhIHJlYWxseSBsb25nIHRpbWUsIGFuZCBjb3VsZCBsb2cgCi0JKiogbWFueSBtb3JlIGJsb2NrcyB0aGFuIGEgdHJhbnNhY3Rpb24gY2FuIGhvbGQuICBTbywgd2UgZG8gYSBwb2xpdGUKLQkqKiBqb3VybmFsIGVuZCBoZXJlLCBhbmQgaWYgdGhlIHRyYW5zYWN0aW9uIG5lZWRzIGVuZGluZywgd2UgbWFrZQotCSoqIHN1cmUgdGhlIGZpbGUgaXMgY29uc2lzdGVudCBiZWZvcmUgZW5kaW5nIHRoZSBjdXJyZW50IHRyYW5zCi0JKiogYW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQotCSovCi0gICAgICAgIGlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7Ci0JICBpbnQgb3JpZ19sZW5fYWxsb2MgPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIDsKLQkgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3NlYXJjaF9wYXRoKSA7CisJICogYXJlIHdlIGRvaW5nIGEgZnVsbCB0cnVuY2F0ZSBvciBkZWxldGUsIGlmIHNvCisJICoga2ljayBpbiB0aGUgcmVhZGEgY29kZQorCSAqLworCWlmIChuX25ld19maWxlX3NpemUgPT0gMCkKKwkJc19zZWFyY2hfcGF0aC5yZWFkYSA9IFBBVEhfUkVBREEgfCBQQVRIX1JFQURBX0JBQ0s7CiAKLQkgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgewotCSAgICAgIHBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JICB9IAotCSAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpIDsKLQotCSAgZXJyID0gam91cm5hbF9lbmQodGgsIHBfc19pbm9kZS0+aV9zYiwgb3JpZ19sZW5fYWxsb2MpIDsKLQkgIGlmIChlcnIpCi0JICAgIGdvdG8gb3V0OwotCSAgZXJyID0gam91cm5hbF9iZWdpbiAodGgsIHBfc19pbm9kZS0+aV9zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpOwotCSAgaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocF9zX2lub2RlKSA7CisJaWYgKG5fZmlsZV9zaXplID09IDAgfHwgbl9maWxlX3NpemUgPCBuX25ld19maWxlX3NpemUpIHsKKwkJZ290byB1cGRhdGVfYW5kX291dDsKIAl9Ci0gICAgfSB3aGlsZSAoIG5fZmlsZV9zaXplID4gUk9VTkRfVVAgKG5fbmV3X2ZpbGVfc2l6ZSkgJiYKLQkgICAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LCAmc19zZWFyY2hfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKSAgOwogCi0gICAgUkZBTFNFKCBuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQIChuX25ld19maWxlX3NpemUpLAotCSAgICAiUEFQLTU2ODA6IHRydW5jYXRlIGRpZCBub3QgZmluaXNoOiBuZXdfZmlsZV9zaXplICVMZCwgY3VycmVudCAlTGQsIG9pZCAlZCIsCi0JICAgIG5fbmV3X2ZpbGVfc2l6ZSwgbl9maWxlX3NpemUsIHNfaXRlbV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCk7CisJLyogVXBkYXRlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KKwlzZXRfY3B1X2tleV9rX29mZnNldCgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOwogCi11cGRhdGVfYW5kX291dDoKLSAgICBpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKLQkvLyB0aGlzIGlzIHRydW5jYXRlLCBub3QgZmlsZSBjbG9zaW5nCi0JICAgIHBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIHBfc19pbm9kZSk7CisJZG8geworCQkvKiBDdXQgb3IgZGVsZXRlIGZpbGUgaXRlbS4gKi8KKwkJbl9kZWxldGVkID0KKwkJICAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0odGgsICZzX3NlYXJjaF9wYXRoLCAmc19pdGVtX2tleSwKKwkJCQkJICAgcF9zX2lub2RlLCBwYWdlLCBuX25ld19maWxlX3NpemUpOworCQlpZiAobl9kZWxldGVkIDwgMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtNTY2NTogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZmFpbGVkIik7CisJCQlyZWlzZXJmc19jaGVja19wYXRoKCZzX3NlYXJjaF9wYXRoKTsKKwkJCXJldHVybiAwOworCQl9CiAKLW91dDoKLSAgICBwYXRocmVsc2UoJnNfc2VhcmNoX3BhdGgpIDsKLSAgICByZXR1cm4gZXJyOworCQlSRkFMU0Uobl9kZWxldGVkID4gbl9maWxlX3NpemUsCisJCSAgICAgICAiUEFQLTU2NzA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IHRvbyBtYW55IGJ5dGVzIGRlbGV0ZWQ6IGRlbGV0ZWQgJWQsIGZpbGVfc2l6ZSAlbHUsIGl0ZW1fa2V5ICVLIiwKKwkJICAgICAgIG5fZGVsZXRlZCwgbl9maWxlX3NpemUsICZzX2l0ZW1fa2V5KTsKKworCQkvKiBDaGFuZ2Uga2V5IHRvIHNlYXJjaCB0aGUgbGFzdCBmaWxlIGl0ZW0uICovCisJCW5fZmlsZV9zaXplIC09IG5fZGVsZXRlZDsKKworCQlzZXRfY3B1X2tleV9rX29mZnNldCgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOworCisJCS8qIFdoaWxlIHRoZXJlIGFyZSBieXRlcyB0byB0cnVuY2F0ZSBhbmQgcHJldmlvdXMgZmlsZSBpdGVtIGlzIHByZXNlbnRlZCBpbiB0aGUgdHJlZS4gKi8KKworCQkvKgorCQkgKiogVGhpcyBsb29wIGNvdWxkIHRha2UgYSByZWFsbHkgbG9uZyB0aW1lLCBhbmQgY291bGQgbG9nIAorCQkgKiogbWFueSBtb3JlIGJsb2NrcyB0aGFuIGEgdHJhbnNhY3Rpb24gY2FuIGhvbGQuICBTbywgd2UgZG8gYSBwb2xpdGUKKwkJICoqIGpvdXJuYWwgZW5kIGhlcmUsIGFuZCBpZiB0aGUgdHJhbnNhY3Rpb24gbmVlZHMgZW5kaW5nLCB3ZSBtYWtlCisJCSAqKiBzdXJlIHRoZSBmaWxlIGlzIGNvbnNpc3RlbnQgYmVmb3JlIGVuZGluZyB0aGUgY3VycmVudCB0cmFucworCQkgKiogYW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQorCQkgKi8KKwkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkJCWludCBvcmlnX2xlbl9hbGxvYyA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQ7CisJCQlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19zZWFyY2hfcGF0aCk7CisKKwkJCWlmICh1cGRhdGVfdGltZXN0YW1wcykgeworCQkJCXBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9CisJCQkJICAgIENVUlJFTlRfVElNRV9TRUM7CisJCQl9CisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKwkJCWVyciA9IGpvdXJuYWxfZW5kKHRoLCBwX3NfaW5vZGUtPmlfc2IsIG9yaWdfbGVuX2FsbG9jKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQllcnIgPSBqb3VybmFsX2JlZ2luKHRoLCBwX3NfaW5vZGUtPmlfc2IsCisJCQkJCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpOworCQl9CisJfSB3aGlsZSAobl9maWxlX3NpemUgPiBST1VORF9VUChuX25ld19maWxlX3NpemUpICYmCisJCSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LAorCQkJCQkgICAgJnNfc2VhcmNoX3BhdGgpID09IFBPU0lUSU9OX0ZPVU5EKTsKKworCVJGQUxTRShuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQKG5fbmV3X2ZpbGVfc2l6ZSksCisJICAgICAgICJQQVAtNTY4MDogdHJ1bmNhdGUgZGlkIG5vdCBmaW5pc2g6IG5ld19maWxlX3NpemUgJUxkLCBjdXJyZW50ICVMZCwgb2lkICVkIiwKKwkgICAgICAgbl9uZXdfZmlsZV9zaXplLCBuX2ZpbGVfc2l6ZSwgc19pdGVtX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKworICAgICAgdXBkYXRlX2FuZF9vdXQ6CisJaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7CisJCS8vIHRoaXMgaXMgdHJ1bmNhdGUsIG5vdCBmaWxlIGNsb3NpbmcKKwkJcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl9CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOworCisgICAgICBvdXQ6CisJcGF0aHJlbHNlKCZzX3NlYXJjaF9wYXRoKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIC8vIHRoaXMgbWFrZXMgc3VyZSwgdGhhdCB3ZSBfX2FwcGVuZF9fLCBub3Qgb3ZlcndyaXRlIG9yIGFkZCBob2xlcwotc3RhdGljIHZvaWQgY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlIChzdHJ1Y3QgcGF0aCAqIHBhdGgsIAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSkKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5KQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBmb3VuZF9paCA9IGdldF9paCAocGF0aCk7Ci0gICAgCi0gICAgaWYgKGlzX2RpcmVjdF9sZV9paCAoZm91bmRfaWgpKSB7Ci0JaWYgKGxlX2loX2tfb2Zmc2V0IChmb3VuZF9paCkgKyBvcF9ieXRlc19udW1iZXIgKGZvdW5kX2loLCBnZXRfbGFzdF9iaCAocGF0aCktPmJfc2l6ZSkgIT0KLQkgICAgY3B1X2tleV9rX29mZnNldCAocF9zX2tleSkgfHwKLQkgICAgb3BfYnl0ZXNfbnVtYmVyIChmb3VuZF9paCwgZ2V0X2xhc3RfYmggKHBhdGgpLT5iX3NpemUpICE9IHBvc19pbl9pdGVtIChwYXRoKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJQQVAtNTcyMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCi0JCQkgICAgImZvdW5kIGRpcmVjdCBpdGVtICVoIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICVLIiwKLQkJCSAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0gKHBhdGgpLCBwX3Nfa2V5KTsKLSAgICB9Ci0gICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChmb3VuZF9paCkpIHsKLQlpZiAobGVfaWhfa19vZmZzZXQgKGZvdW5kX2loKSArIG9wX2J5dGVzX251bWJlciAoZm91bmRfaWgsIGdldF9sYXN0X2JoIChwYXRoKS0+Yl9zaXplKSAhPSBjcHVfa2V5X2tfb2Zmc2V0IChwX3Nfa2V5KSB8fCAKLQkgICAgSV9VTkZNX05VTSAoZm91bmRfaWgpICE9IHBvc19pbl9pdGVtIChwYXRoKSB8fAotCSAgICBnZXRfaWhfZnJlZV9zcGFjZSAoZm91bmRfaWgpICE9IDApCi0JICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAiUEFQLTU3MzA6IGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZTogIgotCQkJICAgICJmb3VuZCBpbmRpcmVjdCBpdGVtICglaCkgb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgKCVLKSIsCi0JCQkgICAgZm91bmRfaWgsIHBvc19pbl9pdGVtIChwYXRoKSwgcF9zX2tleSk7Ci0gICAgfQotfQotI2VuZGlmIC8qIGNvbmZpZyByZWlzZXJmcyBjaGVjayAqLworCXN0cnVjdCBpdGVtX2hlYWQgKmZvdW5kX2loID0gZ2V0X2loKHBhdGgpOwogCisJaWYgKGlzX2RpcmVjdF9sZV9paChmb3VuZF9paCkpIHsKKwkJaWYgKGxlX2loX2tfb2Zmc2V0KGZvdW5kX2loKSArCisJCSAgICBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBjcHVfa2V5X2tfb2Zmc2V0KHBfc19rZXkpCisJCSAgICB8fCBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBwb3NfaW5faXRlbShwYXRoKSkKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJQQVAtNTcyMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCisJCQkJICAgICAgICJmb3VuZCBkaXJlY3QgaXRlbSAlaCBvciBwb3NpdGlvbiAoJWQpIGRvZXMgbm90IG1hdGNoIHRvIGtleSAlSyIsCisJCQkJICAgICAgIGZvdW5kX2loLCBwb3NfaW5faXRlbShwYXRoKSwgcF9zX2tleSk7CisJfQorCWlmIChpc19pbmRpcmVjdF9sZV9paChmb3VuZF9paCkpIHsKKwkJaWYgKGxlX2loX2tfb2Zmc2V0KGZvdW5kX2loKSArCisJCSAgICBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBjcHVfa2V5X2tfb2Zmc2V0KHBfc19rZXkpCisJCSAgICB8fCBJX1VORk1fTlVNKGZvdW5kX2loKSAhPSBwb3NfaW5faXRlbShwYXRoKQorCQkgICAgfHwgZ2V0X2loX2ZyZWVfc3BhY2UoZm91bmRfaWgpICE9IDApCisJCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJCSAgICAgICAiUEFQLTU3MzA6IGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZTogIgorCQkJCSAgICAgICAiZm91bmQgaW5kaXJlY3QgaXRlbSAoJWgpIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICglSykiLAorCQkJCSAgICAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0ocGF0aCksIHBfc19rZXkpOworCX0KK30KKyNlbmRpZgkJCQkvKiBjb25maWcgcmVpc2VyZnMgY2hlY2sgKi8KIAogLyogUGFzdGUgYnl0ZXMgdG8gdGhlIGV4aXN0aW5nIGl0ZW0uIFJldHVybnMgYnl0ZXMgbnVtYmVyIHBhc3RlZCBpbnRvIHRoZSBpdGVtLiAqLwotaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19zZWFyY2hfcGF0aCwJLyogUGF0aCB0byB0aGUgcGFzdGVkIGl0ZW0uICAgICAgICAgICovCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2tleSwgICAgICAgIAkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbmVlZGVkIGl0ZW0uKi8KLQkJCSAgICAgIHN0cnVjdCBpbm9kZQkgICogaW5vZGUsCQkvKiBJbm9kZSBpdGVtIGJlbG9uZ3MgdG8gKi8KLQkJCSAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKiBwX2NfYm9keSwgICAgICAgCS8qIFBvaW50ZXIgdG8gdGhlIGJ5dGVzIHRvIHBhc3RlLiAgICAqLwotCQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcGFzdGVkX3NpemUpICAJLyogU2l6ZSBvZiBwYXN0ZWQgYnl0ZXMuICAgICAgICAgICAgICovCi17Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX3Bhc3RlX2JhbGFuY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7Ci0gICAgaW50CQkJZnNfZ2VuOworaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCwJLyogUGF0aCB0byB0aGUgcGFzdGVkIGl0ZW0uICAgICAgICAgICovCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbmVlZGVkIGl0ZW0uICovCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIElub2RlIGl0ZW0gYmVsb25ncyB0byAqLworCQkJICAgICBjb25zdCBjaGFyICpwX2NfYm9keSwJLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gcGFzdGUuICAgICovCisJCQkgICAgIGludCBuX3Bhc3RlZF9zaXplKQorewkJCQkvKiBTaXplIG9mIHBhc3RlZCBieXRlcy4gICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfcGFzdGVfYmFsYW5jZTsKKwlpbnQgcmV0dmFsOworCWludCBmc19nZW47CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYikgOworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKKwlyZWlzZXJmc19kZWJ1Zyhpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBwYXN0ZV9pbnRvX2l0ZW0oKTogYWxsb2NhdGluZyAldSBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwKKwkJICAgICAgIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CiAjZW5kaWYKIAotICAgIGlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKSkgewotCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOwotCXJldHVybiAtRURRVU9UOwotICAgIH0KLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfcGFzdGVfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19zZWFyY2hfcGF0aCwgbl9wYXN0ZWRfc2l6ZSk7CisJaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpKSB7CisJCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX3Bhc3RlX2JhbGFuY2UsIHRoLT50X3N1cGVyLCBwX3Nfc2VhcmNoX3BhdGgsCisJCSAgICAgICBuX3Bhc3RlZF9zaXplKTsKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgc19wYXN0ZV9iYWxhbmNlLmtleSA9IHBfc19rZXktPm9uX2Rpc2tfa2V5OworCXNfcGFzdGVfYmFsYW5jZS5rZXkgPSBwX3Nfa2V5LT5vbl9kaXNrX2tleTsKICNlbmRpZgogCi0gICAgLyogRFFVT1RfKiBjYW4gc2NoZWR1bGUsIG11c3QgY2hlY2sgYmVmb3JlIHRoZSBmaXhfbm9kZXMgKi8KLSAgICBpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgewotCWdvdG8gc2VhcmNoX2FnYWluOwotICAgIH0KKwkvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayBiZWZvcmUgdGhlIGZpeF9ub2RlcyAqLworCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7CisJCWdvdG8gc2VhcmNoX2FnYWluOworCX0KIAotICAgIHdoaWxlICgocmV0dmFsID0gZml4X25vZGVzKE1fUEFTVEUsICZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwsIHBfY19ib2R5KSkgPT0KLVJFUEVBVF9TRUFSQ0ggKSB7Ci1zZWFyY2hfYWdhaW46Ci0JLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KLQlQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkICk7Ci0JcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHRoLT50X3N1cGVyLCBwX3Nfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmV0dmFsID0gLUVJTyA7Ci0JICAgIGdvdG8gZXJyb3Jfb3V0IDsKLQl9Ci0JaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIlBBUC01NzEwOiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW06IGVudHJ5IG9yIHBhc3RlZCBieXRlICglSykgZXhpc3RzIiwgcF9zX2tleSk7Ci0JICAgIHJldHZhbCA9IC1FRVhJU1QgOwotCSAgICBnb3RvIGVycm9yX291dCA7Ci0JfQotCQorCXdoaWxlICgocmV0dmFsID0KKwkJZml4X25vZGVzKE1fUEFTVEUsICZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwsCisJCQkgIHBfY19ib2R5KSkgPT0gUkVQRUFUX1NFQVJDSCkgeworCSAgICAgIHNlYXJjaF9hZ2FpbjoKKwkJLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KKwkJUFJPQ19JTkZPX0lOQyh0aC0+dF9zdXBlciwgcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCk7CisJCXJldHZhbCA9CisJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSh0aC0+dF9zdXBlciwgcF9zX2tleSwKKwkJCQkJICAgICAgIHBfc19zZWFyY2hfcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCQlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkgIlBBUC01NzEwOiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW06IGVudHJ5IG9yIHBhc3RlZCBieXRlICglSykgZXhpc3RzIiwKKwkJCQkJIHBfc19rZXkpOworCQkJcmV0dmFsID0gLUVFWElTVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlIChwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXkpOworCQljaGVja19yZXNlYXJjaF9mb3JfcGFzdGUocF9zX3NlYXJjaF9wYXRoLCBwX3Nfa2V5KTsKICNlbmRpZgotICAgIH0KKwl9CiAKLSAgICAvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBjb2xsZWN0ZWQgYnkgZml4X25vZGVzLCBhbmQKLSAgICAgICBhY2Nlc3NpbmcgdGhlbSB3aWxsIG5vdCByaXNrIHRyaWdnZXJpbmcgc2NoZWR1bGUuICovCi0gICAgaWYgKCByZXR2YWwgPT0gQ0FSUllfT04gKSB7Ci0JZG9fYmFsYW5jZSgmc19wYXN0ZV9iYWxhbmNlLCBOVUxMLyppaCovLCBwX2NfYm9keSwgTV9QQVNURSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKLWVycm9yX291dDoKLSAgICAvKiB0aGlzIGFsc28gcmVsZWFzZXMgdGhlIHBhdGggKi8KLSAgICB1bmZpeF9ub2Rlcygmc19wYXN0ZV9iYWxhbmNlKTsKKwkvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBjb2xsZWN0ZWQgYnkgZml4X25vZGVzLCBhbmQKKwkgICBhY2Nlc3NpbmcgdGhlbSB3aWxsIG5vdCByaXNrIHRyaWdnZXJpbmcgc2NoZWR1bGUuICovCisJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCQlkb19iYWxhbmNlKCZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwgLyppaCAqLyAsIHBfY19ib2R5LCBNX1BBU1RFKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKKyAgICAgIGVycm9yX291dDoKKwkvKiB0aGlzIGFsc28gcmVsZWFzZXMgdGhlIHBhdGggKi8KKwl1bmZpeF9ub2Rlcygmc19wYXN0ZV9iYWxhbmNlKTsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotICAgIHJlaXNlcmZzX2RlYnVnIChpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIHBhc3RlX2ludG9faXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBuX3Bhc3RlZF9zaXplLCBpbm9kZS0+aV91aWQsIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CisJcmVpc2VyZnNfZGVidWcoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCSAgICAgICAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCSAgICAgICBuX3Bhc3RlZF9zaXplLCBpbm9kZS0+aV91aWQsCisJCSAgICAgICBrZXkydHlwZSgmKHBfc19rZXktPm9uX2Rpc2tfa2V5KSkpOwogI2VuZGlmCi0gICAgRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKTsKLSAgICByZXR1cm4gcmV0dmFsIDsKKwlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpOworCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aC4gKi8KLWludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkgc3RydWN0IHBhdGggICAgICAgICAqIAlwX3NfcGF0aCwgICAgICAgICAvKiBQYXRoIHRvIHRoZSBpbnNlcnRlZGVkIGl0ZW0uICAgICAgICAgKi8KLQkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICoga2V5LAotCQkJIHN0cnVjdCBpdGVtX2hlYWQgICAgKiAJcF9zX2loLCAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiovCi0JCQkgc3RydWN0IGlub2RlICAgICAgICAqIGlub2RlLAotCQkJIGNvbnN0IGNoYXIgICAgICAgICAgKiAJcF9jX2JvZHkpICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gaW5zZXJ0LiAgICAgICovCi17Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2luc19iYWxhbmNlOwotICAgIGludCAgICAgICAgICAgICAgICAgcmV0dmFsOwotICAgIGludCBmc19nZW4gPSAwIDsKLSAgICBpbnQgcXVvdGFfYnl0ZXMgPSAwIDsKK2ludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHBhdGggKnBfc19wYXRoLAkvKiBQYXRoIHRvIHRoZSBpbnNlcnRlZGVkIGl0ZW0uICAgICAgICAgKi8KKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaWgsCS8qIFBvaW50ZXIgdG8gdGhlIGl0ZW0gaGVhZGVyIHRvIGluc2VydC4gKi8KKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpwX2NfYm9keSkKK3sJCQkJLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gaW5zZXJ0LiAgICAgICovCisJc3RydWN0IHRyZWVfYmFsYW5jZSBzX2luc19iYWxhbmNlOworCWludCByZXR2YWw7CisJaW50IGZzX2dlbiA9IDA7CisJaW50IHF1b3RhX2J5dGVzID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIGlmIChpbm9kZSkgeyAgICAgIC8qIERvIHdlIGNvdW50IHF1b3RhcyBmb3IgaXRlbT8gKi8KLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7Ci0JcXVvdGFfYnl0ZXMgPSBpaF9pdGVtX2xlbihwX3NfaWgpOworCWlmIChpbm9kZSkgewkJLyogRG8gd2UgY291bnQgcXVvdGFzIGZvciBpdGVtPyAqLworCQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJCXF1b3RhX2J5dGVzID0gaWhfaXRlbV9sZW4ocF9zX2loKTsKIAotCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlIGhhcwotCSAqKiBhIHRhaWwsIGxpbmtzIGFyZSBhbHdheXMgdGFpbHMsIHNvIHRoZXJlJ3Mgbm8gZ3Vlc3NpbmcgbmVlZGVkCi0JICovCi0JaWYgKCFTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocF9zX2loKSkgewotCSAgICBxdW90YV9ieXRlcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFIDsKLQl9CisJCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlIGhhcworCQkgKiogYSB0YWlsLCBsaW5rcyBhcmUgYWx3YXlzIHRhaWxzLCBzbyB0aGVyZSdzIG5vIGd1ZXNzaW5nIG5lZWRlZAorCQkgKi8KKwkJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX3NfaWgpKSB7CisJCQlxdW90YV9ieXRlcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9CiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLQlyZWlzZXJmc19kZWJ1ZyAoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9ieXRlcywgaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUocF9zX2loKSk7CisJCXJlaXNlcmZzX2RlYnVnKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLAorCQkJICAgICAgIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKICNlbmRpZgotCS8qIFdlIGNhbid0IGRpcnR5IGlub2RlIGhlcmUuIEl0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gYnV0Ci0JICogYXBwcm9wcmlhdGUgc3RhdCBpdGVtIGlzbid0IGluc2VydGVkIHlldC4uLiAqLwotCWlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcykpIHsKLQkgICAgcGF0aHJlbHNlKHBfc19wYXRoKTsKLQkgICAgcmV0dXJuIC1FRFFVT1Q7CisJCS8qIFdlIGNhbid0IGRpcnR5IGlub2RlIGhlcmUuIEl0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gYnV0CisJCSAqIGFwcHJvcHJpYXRlIHN0YXQgaXRlbSBpc24ndCBpbnNlcnRlZCB5ZXQuLi4gKi8KKwkJaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIHF1b3RhX2J5dGVzKSkgeworCQkJcGF0aHJlbHNlKHBfc19wYXRoKTsKKwkJCXJldHVybiAtRURRVU9UOworCQl9CiAJfQotICAgIH0KLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfaW5zX2JhbGFuY2UsIHRoLT50X3N1cGVyLCBwX3NfcGF0aCwgSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfc19paCkpOworCWluaXRfdGJfc3RydWN0KHRoLCAmc19pbnNfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19wYXRoLAorCQkgICAgICAgSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfc19paCkpOwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBzX2luc19iYWxhbmNlLmtleSA9IGtleS0+b25fZGlza19rZXk7CisJc19pbnNfYmFsYW5jZS5rZXkgPSBrZXktPm9uX2Rpc2tfa2V5OwogI2VuZGlmCi0gICAgLyogRFFVT1RfKiBjYW4gc2NoZWR1bGUsIG11c3QgY2hlY2sgdG8gYmUgc3VyZSBjYWxsaW5nIGZpeF9ub2RlcyBpcyBzYWZlICovCi0gICAgaWYgKGlub2RlICYmIGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikpIHsKLQlnb3RvIHNlYXJjaF9hZ2FpbjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIChyZXR2YWwgPSBmaXhfbm9kZXMoTV9JTlNFUlQsICZzX2luc19iYWxhbmNlLCBwX3NfaWgsIHBfY19ib2R5KSkgPT0gUkVQRUFUX1NFQVJDSCkgewotc2VhcmNoX2FnYWluOgotCS8qIGZpbGUgc3lzdGVtIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSBpbiB0aGUgZml4X25vZGVzICovCi0JUFJPQ19JTkZPX0lOQyggdGggLT4gdF9zdXBlciwgaW5zZXJ0X2l0ZW1fcmVzdGFydGVkICk7Ci0JcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHRoLT50X3N1cGVyLCBrZXksIHBfc19wYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJldHZhbCA9IC1FSU87Ci0JICAgIGdvdG8gZXJyb3Jfb3V0IDsKKwkvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayB0byBiZSBzdXJlIGNhbGxpbmcgZml4X25vZGVzIGlzIHNhZmUgKi8KKwlpZiAoaW5vZGUgJiYgZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgeworCQlnb3RvIHNlYXJjaF9hZ2FpbjsKIAl9Ci0JaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiUEFQLTU3NjA6IHJlaXNlcmZzX2luc2VydF9pdGVtOiAiCi0JCQkgICAgICAia2V5ICVLIGFscmVhZHkgZXhpc3RzIGluIHRoZSB0cmVlIiwga2V5KTsKLQkgICAgcmV0dmFsID0gLUVFWElTVCA7Ci0JICAgIGdvdG8gZXJyb3Jfb3V0OyAKKworCXdoaWxlICgocmV0dmFsID0KKwkJZml4X25vZGVzKE1fSU5TRVJULCAmc19pbnNfYmFsYW5jZSwgcF9zX2loLAorCQkJICBwX2NfYm9keSkpID09IFJFUEVBVF9TRUFSQ0gpIHsKKwkgICAgICBzZWFyY2hfYWdhaW46CisJCS8qIGZpbGUgc3lzdGVtIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSBpbiB0aGUgZml4X25vZGVzICovCisJCVBST0NfSU5GT19JTkModGgtPnRfc3VwZXIsIGluc2VydF9pdGVtX3Jlc3RhcnRlZCk7CisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKHRoLT50X3N1cGVyLCBrZXksIHBfc19wYXRoKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkJICJQQVAtNTc2MDogcmVpc2VyZnNfaW5zZXJ0X2l0ZW06ICIKKwkJCQkJICJrZXkgJUsgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyZWUiLAorCQkJCQkga2V5KTsKKwkJCXJldHZhbCA9IC1FRVhJU1Q7CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBtYWtlIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIHdpbGwgYmUgY29sbGVjdGVkIGF0IGEgdGltZSAqLyAKLSAgICBpZiAoIHJldHZhbCA9PSBDQVJSWV9PTiApIHsKLQlkb19iYWxhbmNlICgmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSwgTV9JTlNFUlQpOwotCXJldHVybiAwOwotICAgIH0KKwkvKiBtYWtlIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIHdpbGwgYmUgY29sbGVjdGVkIGF0IGEgdGltZSAqLworCWlmIChyZXR2YWwgPT0gQ0FSUllfT04pIHsKKwkJZG9fYmFsYW5jZSgmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSwgTV9JTlNFUlQpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICByZXR2YWwgPSAocmV0dmFsID09IE5PX0RJU0tfU1BBQ0UpID8gLUVOT1NQQyA6IC1FSU87Ci1lcnJvcl9vdXQ6Ci0gICAgLyogYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLwotICAgIHVuZml4X25vZGVzKCZzX2luc19iYWxhbmNlKTsKKwlyZXR2YWwgPSAocmV0dmFsID09IE5PX0RJU0tfU1BBQ0UpID8gLUVOT1NQQyA6IC1FSU87CisgICAgICBlcnJvcl9vdXQ6CisJLyogYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLworCXVuZml4X25vZGVzKCZzX2luc19iYWxhbmNlKTsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotICAgIHJlaXNlcmZzX2RlYnVnICh0aC0+dF9zdXBlciwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKKwlyZWlzZXJmc19kZWJ1Zyh0aC0+dF9zdXBlciwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLAorCQkgICAgICAgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOwogI2VuZGlmCi0gICAgaWYgKGlub2RlKQotCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpIDsKLSAgICByZXR1cm4gcmV0dmFsOyAKKwlpZiAoaW5vZGUpCisJCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpOworCXJldHVybiByZXR2YWw7CiB9Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDY2MGFlZmMuLjY5NTFjMzUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMzUsODMgKzM1LDgxIEBACiBzdGF0aWMgY29uc3QgY2hhciByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HOwogc3RhdGljIGNvbnN0IGNoYXIgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HOwogCi1pbnQgaXNfcmVpc2VyZnNfM181IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK2ludCBpc19yZWlzZXJmc18zXzUoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nLAotCQkgICBzdHJsZW4gKHJlaXNlcmZzXzNfNV9tYWdpY19zdHJpbmcpKTsKKwlyZXR1cm4gIXN0cm5jbXAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM181X21hZ2ljX3N0cmluZywKKwkJCXN0cmxlbihyZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nKSk7CiB9CiAKLQotaW50IGlzX3JlaXNlcmZzXzNfNiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCitpbnQgaXNfcmVpc2VyZnNfM182KHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpCiB7Ci0gIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM182X21hZ2ljX3N0cmluZywKLSAJCSAgIHN0cmxlbiAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworCXJldHVybiAhc3RybmNtcChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkJc3RybGVuKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKIH0KIAotCi1pbnQgaXNfcmVpc2VyZnNfanIgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKQoraW50IGlzX3JlaXNlcmZzX2pyKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpCiB7Ci0gIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nLAotIAkJICAgc3RybGVuIChyZWlzZXJmc19qcl9tYWdpY19zdHJpbmcpKTsKKwlyZXR1cm4gIXN0cm5jbXAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nLAorCQkJc3RybGVuKHJlaXNlcmZzX2pyX21hZ2ljX3N0cmluZykpOwogfQogCi0KLXN0YXRpYyBpbnQgaXNfYW55X3JlaXNlcmZzX21hZ2ljX3N0cmluZyAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCitzdGF0aWMgaW50IGlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuIChpc19yZWlzZXJmc18zXzUgKHJzKSB8fCBpc19yZWlzZXJmc18zXzYgKHJzKSB8fAotCSAgaXNfcmVpc2VyZnNfanIgKHJzKSk7CisJcmV0dXJuIChpc19yZWlzZXJmc18zXzUocnMpIHx8IGlzX3JlaXNlcmZzXzNfNihycykgfHwKKwkJaXNfcmVpc2VyZnNfanIocnMpKTsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOwotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOworc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIAotc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgd2FpdCkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCB3YWl0KQogewotICAgIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKLQlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSkKLSAgICAgICAgICAgIGlmICgham91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpKQotICAgICAgICAgICAgICAgIHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHMpOwotCXMtPnNfZGlydCA9IDA7IC8qIEV2ZW4gaWYgaXQncyBub3QgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICogV2UnbGwgbG9vcCBmb3JldmVyIGluIHN5bmNfc3VwZXJzIG90aGVyd2lzZSAqLwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLT5zX2RpcnQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSkKKwkJCWlmICgham91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpKQorCQkJCXJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHMpOworCQlzLT5zX2RpcnQgPSAwOwkvKiBFdmVuIGlmIGl0J3Mgbm90IHRydWUuCisJCQkJICogV2UnbGwgbG9vcCBmb3JldmVyIGluIHN5bmNfc3VwZXJzIG90aGVyd2lzZSAqLworCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJfSBlbHNlIHsKKwkJcy0+c19kaXJ0ID0gMDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICByZWlzZXJmc19zeW5jX2ZzKHMsIDEpOworCXJlaXNlcmZzX3N5bmNfZnMocywgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICByZWlzZXJmc193cml0ZV9sb2NrKHMpOwotICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgIGludCBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMSkgOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCkgOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwotICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOwotICAgICAgICByZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKSA7Ci0gICAgICAgIGpvdXJuYWxfZW5kX3N5bmMoJnRoLCBzLCAxKSA7Ci0gICAgfQotICB9Ci0gIHMtPnNfZGlydCA9IDA7Ci0gIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaW50IGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKTsKKwkJaWYgKGVycikgeworCQkJcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCk7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLAorCQkJCQkJICAgICAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkJCXJlaXNlcmZzX2Jsb2NrX3dyaXRlcygmdGgpOworCQkJam91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpOworCQl9CisJfQorCXMtPnNfZGlydCA9IDA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHMpIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlyZWlzZXJmc19hbGxvd193cml0ZXMocyk7CiB9CiAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5fY29yZV9rZXkgIE1BWF9JTl9DT1JFX0tFWTsKLQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9jb3JlX2tleSBNQVhfSU5fQ09SRV9LRVk7CiAKIC8qIHRoaXMgaXMgdXNlZCB0byBkZWxldGUgInNhdmUgbGluayIgd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXMgb2YgYQogICAgZmlsZSBpdCBwb2ludHMgdG8uIEl0IGNhbiBlaXRoZXIgaGFwcGVuIGlmIHVubGluayBpcyBjb21wbGV0ZWQgYnV0CkBAIC0xMjAsMzY0ICsxMTgsMzg3IEBACiAgICBwcm90ZWN0aW5nIHVubGluayBpcyBiaWdnZXIgdGhhdCBhIGtleSBsZiAic2F2ZSBsaW5rIiB3aGljaAogICAgcHJvdGVjdHMgdHJ1bmNhdGUpLCBzbyB0aGVyZSBsZWZ0IG5vIGl0ZW1zIHRvIG1ha2UgdHJ1bmNhdGUKICAgIGNvbXBsZXRpb24gb24gKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCBpbnQgb2lkX2ZyZWUpCitzdGF0aWMgaW50IHJlbW92ZV9zYXZlX2xpbmtfb25seShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwgaW50IG9pZF9mcmVlKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBlcnI7CiAKLSAgICAgLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgKi8KLSAgICAgZXJyID0gam91cm5hbF9iZWdpbiAoJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7Ci0gICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gCi0gICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICgmdGgsIE5VTEwsIGtleSk7Ci0gICAgIGlmIChvaWRfZnJlZSkKLSAgICAgICAgLyogcmVtb3ZhbHMgYXJlIHByb3RlY3RlZCBieSBkaXJlY3QgaXRlbXMgKi8KLSAgICAgICAgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoJnRoLCBsZTMyX3RvX2NwdSAoa2V5LT5rX29iamVjdGlkKSk7CisJLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgKi8KKwllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLSAgICAgcmV0dXJuIGpvdXJuYWxfZW5kICgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKwlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSgmdGgsIE5VTEwsIGtleSk7CisJaWYgKG9pZF9mcmVlKQorCQkvKiByZW1vdmFscyBhcmUgcHJvdGVjdGVkIGJ5IGRpcmVjdCBpdGVtcyAqLworCQlyZWlzZXJmc19yZWxlYXNlX29iamVjdGlkKCZ0aCwgbGUzMl90b19jcHUoa2V5LT5rX29iamVjdGlkKSk7CisKKwlyZXR1cm4gam91cm5hbF9lbmQoJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CiB9Ci0gCisKICNpZmRlZiBDT05GSUdfUVVPVEEKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7CiAjZW5kaWYKLSAKKwogLyogbG9vayBmb3IgdW5jb21wbGV0ZWQgdW5saW5rcyBhbmQgdHJ1bmNhdGVzIGFuZCBjb21wbGV0ZSB0aGVtICovCi1zdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGludCBmaW5pc2hfdW5maW5pc2hlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBtYXhfY3B1X2tleSwgb2JqX2tleTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5IHNhdmVfbGlua19rZXk7Ci0gICAgaW50IHJldHZhbCA9IDA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBpdGVtX3BvczsKLSAgICBjaGFyICogaXRlbTsKLSAgICBpbnQgZG9uZTsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBpbnQgdHJ1bmNhdGU7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCBjcHVfa2V5IG1heF9jcHVfa2V5LCBvYmpfa2V5OworCXN0cnVjdCByZWlzZXJmc19rZXkgc2F2ZV9saW5rX2tleTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX3BvczsKKwljaGFyICppdGVtOworCWludCBkb25lOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHRydW5jYXRlOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIGludCBpOwotICAgIGludCBtc19hY3RpdmVfc2V0OworCWludCBpOworCWludCBtc19hY3RpdmVfc2V0OwogI2VuZGlmCi0gCi0gCi0gICAgLyogY29tcG9zZSBrZXkgdG8gbG9vayBmb3IgInNhdmUiIGxpbmtzICovCi0gICAgbWF4X2NwdV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIG1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gfjBVOwotICAgIG1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSB+MFU7Ci0gICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZtYXhfY3B1X2tleSwgfjBVKTsKLSAgICBtYXhfY3B1X2tleS5rZXlfbGVuZ3RoID0gMzsKKworCS8qIGNvbXBvc2Uga2V5IHRvIGxvb2sgZm9yICJzYXZlIiBsaW5rcyAqLworCW1heF9jcHVfa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKwltYXhfY3B1X2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IH4wVTsKKwltYXhfY3B1X2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gfjBVOworCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZtYXhfY3B1X2tleSwgfjBVKTsKKwltYXhfY3B1X2tleS5rZXlfbGVuZ3RoID0gMzsKIAogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIC8qIE5lZWRlZCBmb3IgaXB1dCgpIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBub3QgdHJhc2ggZGF0YSAqLwotICAgIGlmIChzLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7Ci0JICAgIG1zX2FjdGl2ZV9zZXQgPSAwOwotICAgIH0gZWxzZSB7Ci0JICAgIG1zX2FjdGl2ZV9zZXQgPSAxOwotCSAgICBzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLSAgICB9Ci0gICAgLyogVHVybiBvbiBxdW90YXMgc28gdGhhdCB0aGV5IGFyZSB1cGRhdGVkIGNvcnJlY3RseSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewotCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgewotCSAgICBpbnQgcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7Ci0JICAgIGlmIChyZXQgPCAwKQotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHR1cm4gb24gam91cm5hbGxlZCBxdW90YTogZXJyb3IgJWQiLCByZXQpOworCS8qIE5lZWRlZCBmb3IgaXB1dCgpIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBub3QgdHJhc2ggZGF0YSAqLworCWlmIChzLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CisJCW1zX2FjdGl2ZV9zZXQgPSAwOworCX0gZWxzZSB7CisJCW1zX2FjdGl2ZV9zZXQgPSAxOworCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKIAl9Ci0gICAgfQorCS8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKSB7CisJCQlpbnQgcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzOiBjYW5ub3QgdHVybiBvbiBqb3VybmFsbGVkIHF1b3RhOiBlcnJvciAlZCIsCisJCQkJCQkgcmV0KTsKKwkJfQorCX0KICNlbmRpZgotIAotICAgIGRvbmUgPSAwOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMTsKLSAgICB3aGlsZSAoIXJldHZhbCkgewotICAgICAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAocywgJm1heF9jcHVfa2V5LCAmcGF0aCk7Ci0gICAgICAgIGlmIChyZXR2YWwgIT0gSVRFTV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTQwOiBmaW5pc2hfdW5maW5pc2hlZDogc2VhcmNoX2J5X2tleSByZXR1cm5lZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKLSAgICAgICAgaXRlbV9wb3MgPSBnZXRfaXRlbV9wb3MgKCZwYXRoKTsKLSAgICAgICAgaWYgKGl0ZW1fcG9zICE9IEJfTlJfSVRFTVMgKGJoKSkgewotICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIwNjA6IGZpbmlzaF91bmZpbmlzaGVkOiB3cm9uZyBwb3NpdGlvbiBmb3VuZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlbV9wb3MgLS07Ci0gICAgICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBpdGVtX3Bvcyk7Ci0gCi0gICAgICAgIGlmIChsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX2Rpcl9pZCkgIT0gTUFYX0tFWV9PQkpFQ1RJRCkKLSAgICAgICAgICAgIC8qIHRoZXJlIGFyZSBubyAic2F2ZSIgbGlua3MgYW55bW9yZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIHNhdmVfbGlua19rZXkgPSBpaC0+aWhfa2V5OwotICAgICAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkKLSAgICAgICAgICAgIHRydW5jYXRlID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHJ1bmNhdGUgPSAwOwotIAotICAgICAgICAvKiByZWlzZXJmc19pZ2V0IG5lZWRzIGtfZGlyaWQgYW5kIGtfb2JqZWN0aWQgb25seSAqLwotICAgICAgICBpdGVtID0gQl9JX1BJVEVNIChiaCwgaWgpOwotICAgICAgICBvYmpfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gbGUzMl90b19jcHUgKCooX19sZTMyICopaXRlbSk7Ci0gICAgICAgIG9ial9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpOwotCW9ial9rZXkub25fZGlza19rZXkua19vZmZzZXQgPSAwOwotCW9ial9rZXkub25fZGlza19rZXkua190eXBlID0gMDsKLQkKLSAgICAgICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0gCi0gICAgICAgIGlub2RlID0gcmVpc2VyZnNfaWdldCAocywgJm9ial9rZXkpOwotICAgICAgICBpZiAoIWlub2RlKSB7Ci0gICAgICAgICAgICAvKiB0aGUgdW5saW5rIGFsbW9zdCBjb21wbGV0ZWQsIGl0IGp1c3QgZGlkIG5vdCBtYW5hZ2UgdG8gcmVtb3ZlCi0JICAgICAgICJzYXZlIiBsaW5rIGFuZCByZWxlYXNlIG9iamVjdGlkICovCi0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjE4MDogZmluaXNoX3VuZmluaXNoZWQ6IGlnZXQgZmFpbGVkIGZvciAlSyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqX2tleSk7Ci0gICAgICAgICAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHMsICZzYXZlX2xpbmtfa2V5LCAxKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CiAKLQlpZiAoIXRydW5jYXRlICYmIGlub2RlLT5pX25saW5rKSB7Ci0JICAgIC8qIGZpbGUgaXMgbm90IHVubGlua2VkICovCi0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjE4NTogZmluaXNoX3VuZmluaXNoZWQ6IGZpbGUgJUsgaXMgbm90IHVubGlua2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpfa2V5KTsKLSAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDApOwotICAgICAgICAgICAgY29udGludWU7Ci0JfQotCURRVU9UX0lOSVQoaW5vZGUpOworCWRvbmUgPSAwOworCVJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMTsKKwl3aGlsZSAoIXJldHZhbCkgeworCQlyZXR2YWwgPSBzZWFyY2hfaXRlbShzLCAmbWF4X2NwdV9rZXksICZwYXRoKTsKKwkJaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInZzLTIxNDA6IGZpbmlzaF91bmZpbmlzaGVkOiBzZWFyY2hfYnlfa2V5IHJldHVybmVkICVkIiwKKwkJCQkJIHJldHZhbCk7CisJCQlicmVhazsKKwkJfQogCi0JaWYgKHRydW5jYXRlICYmIFNfSVNESVIgKGlub2RlLT5pX21vZGUpICkgewotCSAgICAvKiBXZSBnb3QgYSB0cnVuY2F0ZSByZXF1ZXN0IGZvciBhIGRpciB3aGljaCBpcyBpbXBvc3NpYmxlLgotCSAgICAgICBUaGUgb25seSBpbWFnaW5hYmxlIHdheSBpcyB0byBleGVjdXRlIHVuZmluaXNoZWQgdHJ1bmNhdGUgcmVxdWVzdAotCSAgICAgICB0aGVuIGJvb3QgaW50byBvbGQga2VybmVsLCByZW1vdmUgdGhlIGZpbGUgYW5kIGNyZWF0ZSBkaXIgd2l0aAotCSAgICAgICB0aGUgc2FtZSBrZXkuICovCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImdyZWVuLTIxMDE6IGltcG9zc2libGUgdHJ1bmNhdGUgb24gYSBkaXJlY3RvcnkgJWsuIFBsZWFzZSByZXBvcnQiLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotCSAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKLQkgICAgdHJ1bmNhdGUgPSAwOwotCSAgICBpcHV0IChpbm9kZSk7IAotCSAgICBjb250aW51ZTsKKwkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCWl0ZW1fcG9zID0gZ2V0X2l0ZW1fcG9zKCZwYXRoKTsKKwkJaWYgKGl0ZW1fcG9zICE9IEJfTlJfSVRFTVMoYmgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtMjA2MDogZmluaXNoX3VuZmluaXNoZWQ6IHdyb25nIHBvc2l0aW9uIGZvdW5kIik7CisJCQlicmVhazsKKwkJfQorCQlpdGVtX3Bvcy0tOworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBpdGVtX3Bvcyk7CisKKwkJaWYgKGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpICE9IE1BWF9LRVlfT0JKRUNUSUQpCisJCQkvKiB0aGVyZSBhcmUgbm8gInNhdmUiIGxpbmtzIGFueW1vcmUgKi8KKwkJCWJyZWFrOworCisJCXNhdmVfbGlua19rZXkgPSBpaC0+aWhfa2V5OworCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQkJdHJ1bmNhdGUgPSAxOworCQllbHNlCisJCQl0cnVuY2F0ZSA9IDA7CisKKwkJLyogcmVpc2VyZnNfaWdldCBuZWVkcyBrX2RpcmlkIGFuZCBrX29iamVjdGlkIG9ubHkgKi8KKwkJaXRlbSA9IEJfSV9QSVRFTShiaCwgaWgpOworCQlvYmpfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikgaXRlbSk7CisJCW9ial9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9CisJCSAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpOworCQlvYmpfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gMDsKKwkJb2JqX2tleS5vbl9kaXNrX2tleS5rX3R5cGUgPSAwOworCisJCXBhdGhyZWxzZSgmcGF0aCk7CisKKwkJaW5vZGUgPSByZWlzZXJmc19pZ2V0KHMsICZvYmpfa2V5KTsKKwkJaWYgKCFpbm9kZSkgeworCQkJLyogdGhlIHVubGluayBhbG1vc3QgY29tcGxldGVkLCBpdCBqdXN0IGRpZCBub3QgbWFuYWdlIHRvIHJlbW92ZQorCQkJICAgInNhdmUiIGxpbmsgYW5kIHJlbGVhc2Ugb2JqZWN0aWQgKi8KKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ2cy0yMTgwOiBmaW5pc2hfdW5maW5pc2hlZDogaWdldCBmYWlsZWQgZm9yICVLIiwKKwkJCQkJICZvYmpfa2V5KTsKKwkJCXJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seShzLCAmc2F2ZV9saW5rX2tleSwgMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghdHJ1bmNhdGUgJiYgaW5vZGUtPmlfbmxpbmspIHsKKwkJCS8qIGZpbGUgaXMgbm90IHVubGlua2VkICovCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtMjE4NTogZmluaXNoX3VuZmluaXNoZWQ6IGZpbGUgJUsgaXMgbm90IHVubGlua2VkIiwKKwkJCQkJICZvYmpfa2V5KTsKKwkJCXJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seShzLCAmc2F2ZV9saW5rX2tleSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlEUVVPVF9JTklUKGlub2RlKTsKKworCQlpZiAodHJ1bmNhdGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJLyogV2UgZ290IGEgdHJ1bmNhdGUgcmVxdWVzdCBmb3IgYSBkaXIgd2hpY2ggaXMgaW1wb3NzaWJsZS4KKwkJCSAgIFRoZSBvbmx5IGltYWdpbmFibGUgd2F5IGlzIHRvIGV4ZWN1dGUgdW5maW5pc2hlZCB0cnVuY2F0ZSByZXF1ZXN0CisJCQkgICB0aGVuIGJvb3QgaW50byBvbGQga2VybmVsLCByZW1vdmUgdGhlIGZpbGUgYW5kIGNyZWF0ZSBkaXIgd2l0aAorCQkJICAgdGhlIHNhbWUga2V5LiAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgImdyZWVuLTIxMDE6IGltcG9zc2libGUgdHJ1bmNhdGUgb24gYSBkaXJlY3RvcnkgJWsuIFBsZWFzZSByZXBvcnQiLAorCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5KHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKKwkJCXRydW5jYXRlID0gMDsKKwkJCWlwdXQoaW5vZGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodHJ1bmNhdGUpIHsKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9CisJCQkgICAgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisJCQkvKiBub3QgY29tcGxldGVkIHRydW5jYXRlIGZvdW5kLiBOZXcgc2l6ZSB3YXMgY29tbWl0dGVkIHRvZ2V0aGVyCisJCQkgICB3aXRoICJzYXZlIiBsaW5rICovCisJCQlyZWlzZXJmc19pbmZvKHMsICJUcnVuY2F0aW5nICVrIHRvICVMZCAuLiIsCisJCQkJICAgICAgSU5PREVfUEtFWShpbm9kZSksIGlub2RlLT5pX3NpemUpOworCQkJcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwKKwkJCQkJICAgICAgIDAKKwkJCQkJICAgICAgIC8qZG9uJ3QgdXBkYXRlIG1vZGlmaWNhdGlvbiB0aW1lICovCisJCQkJCSAgICAgICApOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGluayhpbm9kZSwgdHJ1bmNhdGUpOworCQl9IGVsc2UgeworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3VubGlua19tYXNrOworCQkJLyogbm90IGNvbXBsZXRlZCB1bmxpbmsgKHJtZGlyKSBmb3VuZCAqLworCQkJcmVpc2VyZnNfaW5mbyhzLCAiUmVtb3ZpbmcgJWsuLiIsIElOT0RFX1BLRVkoaW5vZGUpKTsKKwkJCS8qIHJlbW92YWwgZ2V0cyBjb21wbGV0ZWQgaW4gaXB1dCAqLworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlwdXQoaW5vZGUpOworCQlwcmludGsoImRvbmVcbiIpOworCQlkb25lKys7CiAJfQotIAotICAgICAgICBpZiAodHJ1bmNhdGUpIHsKLSAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0gICAgICAgICAgICAvKiBub3QgY29tcGxldGVkIHRydW5jYXRlIGZvdW5kLiBOZXcgc2l6ZSB3YXMgY29tbWl0dGVkIHRvZ2V0aGVyCi0JICAgICAgIHdpdGggInNhdmUiIGxpbmsgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJUcnVuY2F0aW5nICVrIHRvICVMZCAuLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSksIGlub2RlLT5pX3NpemUpOwotICAgICAgICAgICAgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZSAoaW5vZGUsIDAvKmRvbid0IHVwZGF0ZSBtb2RpZmljYXRpb24gdGltZSovKTsKLSAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCB0cnVuY2F0ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKLSAgICAgICAgICAgIC8qIG5vdCBjb21wbGV0ZWQgdW5saW5rIChybWRpcikgZm91bmQgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJSZW1vdmluZyAlay4uIiwgSU5PREVfUEtFWSAoaW5vZGUpKTsKLSAgICAgICAgICAgIC8qIHJlbW92YWwgZ2V0cyBjb21wbGV0ZWQgaW4gaXB1dCAqLwotICAgICAgICAgICAgcmV0dmFsID0gMDsKLSAgICAgICAgfQotIAotICAgICAgICBpcHV0IChpbm9kZSk7Ci0gICAgICAgIHByaW50ayAoImRvbmVcbiIpOwotICAgICAgICBkb25lICsrOwotICAgIH0KLSAgICBSRUlTRVJGU19TQihzKS0+c19pc191bmxpbmtlZF9vayA9IDA7Ci0gICAgIAorCVJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMDsKKwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIC8qIFR1cm4gcXVvdGFzIG9mZiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewotICAgICAgICAgICAgaWYgKHNiX2Rxb3B0KHMpLT5maWxlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgdmZzX3F1b3RhX29mZl9tb3VudChzLCBpKTsKLSAgICB9Ci0gICAgaWYgKG1zX2FjdGl2ZV9zZXQpCi0JICAgIC8qIFJlc3RvcmUgdGhlIGZsYWcgYmFjayAqLwotCSAgICBzLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisJLyogVHVybiBxdW90YXMgb2ZmICovCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CisJCWlmIChzYl9kcW9wdChzKS0+ZmlsZXNbaV0pCisJCQl2ZnNfcXVvdGFfb2ZmX21vdW50KHMsIGkpOworCX0KKwlpZiAobXNfYWN0aXZlX3NldCkKKwkJLyogUmVzdG9yZSB0aGUgZmxhZyBiYWNrICovCisJCXMtPnNfZmxhZ3MgJj0gfk1TX0FDVElWRTsKICNlbmRpZgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIGlmIChkb25lKQotICAgICAgICByZWlzZXJmc19pbmZvIChzLCAiVGhlcmUgd2VyZSAlZCB1bmNvbXBsZXRlZCB1bmxpbmtzL3RydW5jYXRlcy4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGVkXG4iLCBkb25lKTsKLSAgICByZXR1cm4gcmV0dmFsOworCXBhdGhyZWxzZSgmcGF0aCk7CisJaWYgKGRvbmUpCisJCXJlaXNlcmZzX2luZm8ocywgIlRoZXJlIHdlcmUgJWQgdW5jb21wbGV0ZWQgdW5saW5rcy90cnVuY2F0ZXMuICIKKwkJCSAgICAgICJDb21wbGV0ZWRcbiIsIGRvbmUpOworCXJldHVybiByZXR2YWw7CiB9Ci0gCisKIC8qIHRvIHByb3RlY3QgZmlsZSBiZWluZyB1bmxpbmtlZCBmcm9tIGdldHRpbmcgbG9zdCB3ZSAic2FmZSIgbGluayBmaWxlcwogICAgYmVpbmcgdW5saW5rZWQuIFRoaXMgbGluayB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gd2l0aCBsYXN0CiAgICBpdGVtIG9mIGZpbGUuIG1vdW50aW5nIHRoZSBmaWxlc3l0ZW0gd2Ugc2NhbiBhbGwgdGhlc2UgbGlua3MgYW5kIHJlbW92ZQogICAgZmlsZXMgd2hpY2ggYWxtb3N0IGdvdCBsb3N0ICovCi12b2lkIGFkZF9zYXZlX2xpbmsgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aCwKLQkJICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpCit2b2lkIGFkZF9zYXZlX2xpbmsoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0cnVuY2F0ZSkKIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaWg7Ci0gICAgX19sZTMyIGxpbms7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCWludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBpdGVtX2hlYWQgaWg7CisJX19sZTMyIGxpbms7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBmaWxlIGNhbiBvbmx5IGdldCBvbmUgInNhdmUgbGluayIgb2YgZWFjaCBraW5kICovCi0gICAgUkZBTFNFKCB0cnVuY2F0ZSAmJiAKLQkgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgKSwKLQkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHRydW5jYXRlZCBpbm9kZSAlbHgiLAotCSAgICAoIGxvbmcgKSBpbm9kZSAtPiBpX2lubyApOwotICAgIFJGQUxTRSggIXRydW5jYXRlICYmIAotCSAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgKSwKLQkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHVubGlua2VkIGlub2RlICVseCIsCi0JICAgICggbG9uZyApIGlub2RlIC0+IGlfaW5vICk7CisJLyogZmlsZSBjYW4gb25seSBnZXQgb25lICJzYXZlIGxpbmsiIG9mIGVhY2gga2luZCAqLworCVJGQUxTRSh0cnVuY2F0ZSAmJgorCSAgICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayksCisJICAgICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB0cnVuY2F0ZWQgaW5vZGUgJWx4IiwKKwkgICAgICAgKGxvbmcpaW5vZGUtPmlfaW5vKTsKKwlSRkFMU0UoIXRydW5jYXRlICYmCisJICAgICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbGlua19zYXZlZF91bmxpbmtfbWFzayksCisJICAgICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB1bmxpbmtlZCBpbm9kZSAlbHgiLAorCSAgICAgICAobG9uZylpbm9kZS0+aV9pbm8pOwogCi0gICAgLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCi0gICAga2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKLSAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBNQVhfS0VZX09CSkVDVElEOwotICAgIGtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOwotICAgIGlmICghdHJ1bmNhdGUpIHsKLQkvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0Jc2V0X2NwdV9rZXlfa190eXBlICgma2V5LCBUWVBFX0RJUkVDVCk7CisJLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCisJa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKwlrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBNQVhfS0VZX09CSkVDVElEOworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWlmICghdHJ1bmNhdGUpIHsKKwkJLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfY3B1X2tleV9rX3R5cGUoJmtleSwgVFlQRV9ESVJFQ1QpOwogCi0JLyogaXRlbSBoZWFkIG9mICJzYWZlIiBsaW5rICovCi0JbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgJmtleSwga2V5LnZlcnNpb24sIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIFRZUEVfRElSRUNULAotCQkJICAgNC8qbGVuZ3RoKi8sIDB4ZmZmZi8qZnJlZSBzcGFjZSovKTsKLSAgICB9IGVsc2UgewotCS8qIHRydW5jYXRlICovCi0JaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKQotCSAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiZ3JlZW4tMjEwMjogQWRkaW5nIGEgdHJ1bmNhdGUgc2F2ZWxpbmsgZm9yIGEgZGlyZWN0b3J5ICVrISBQbGVhc2UgcmVwb3J0IiwgSU5PREVfUEtFWShpbm9kZSkpOwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5LCAxKTsKLQlzZXRfY3B1X2tleV9rX3R5cGUgKCZrZXksIFRZUEVfSU5ESVJFQ1QpOworCQkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KKwkJbWFrZV9sZV9pdGVtX2hlYWQoJmloLCAma2V5LCBrZXkudmVyc2lvbiwKKwkJCQkgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIFRZUEVfRElSRUNULAorCQkJCSAgNCAvKmxlbmd0aCAqLyAsIDB4ZmZmZiAvKmZyZWUgc3BhY2UgKi8gKTsKKwl9IGVsc2UgeworCQkvKiB0cnVuY2F0ZSAqLworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAiZ3JlZW4tMjEwMjogQWRkaW5nIGEgdHJ1bmNhdGUgc2F2ZWxpbmsgZm9yIGEgZGlyZWN0b3J5ICVrISBQbGVhc2UgcmVwb3J0IiwKKwkJCQkJIElOT0RFX1BLRVkoaW5vZGUpKTsKKwkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwgMSk7CisJCXNldF9jcHVfa2V5X2tfdHlwZSgma2V5LCBUWVBFX0lORElSRUNUKTsKIAotCS8qIGl0ZW0gaGVhZCBvZiAic2FmZSIgbGluayAqLwotCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULAotCQkJICAgNC8qbGVuZ3RoKi8sIDAvKmZyZWUgc3BhY2UqLyk7Ci0gICAgfQotICAgIGtleS5rZXlfbGVuZ3RoID0gMzsKKwkJLyogaXRlbSBoZWFkIG9mICJzYWZlIiBsaW5rICovCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgJmtleSwga2V5LnZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsCisJCQkJICA0IC8qbGVuZ3RoICovICwgMCAvKmZyZWUgc3BhY2UgKi8gKTsKKwl9CisJa2V5LmtleV9sZW5ndGggPSAzOwogCi0gICAgLyogbG9vayBmb3IgaXRzIHBsYWNlIGluIHRoZSB0cmVlICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgewotCWlmICggcmV0dmFsICE9IC1FTk9TUEMgKQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTIxMDA6IGFkZF9zYXZlX2xpbms6IgotCQkJICAic2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwgJmtleSwgcmV0dmFsKTsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLQlyZXR1cm47Ci0gICAgfQorCS8qIGxvb2sgZm9yIGl0cyBwbGFjZSBpbiB0aGUgdHJlZSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgeworCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAidnMtMjEwMDogYWRkX3NhdmVfbGluazoiCisJCQkJCSAic2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwgJmtleSwKKwkJCQkJIHJldHZhbCk7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCXJldHVybjsKKwl9CiAKLSAgICAvKiBib2R5IG9mICJzYXZlIiBsaW5rICovCi0gICAgbGluayA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7CisJLyogYm9keSBvZiAic2F2ZSIgbGluayAqLworCWxpbmsgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQ7CiAKLSAgICAvKiBwdXQgInNhdmUiIGxpbmsgaW5vdCB0cmVlLCBkb24ndCBjaGFyZ2UgcXVvdGEgdG8gYW55b25lICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aCwgJmtleSwgJmloLCBOVUxMLCAoY2hhciAqKSZsaW5rKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JaWYgKHJldHZhbCAhPSAtRU5PU1BDKQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTIxMjA6IGFkZF9zYXZlX2xpbms6IGluc2VydF9pdGVtIHJldHVybmVkICVkIiwKLQkJCSAgcmV0dmFsKTsKLSAgICB9IGVsc2UgewotCWlmKCB0cnVuY2F0ZSApCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0JZWxzZQotCSAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKLSAgICB9CisJLyogcHV0ICJzYXZlIiBsaW5rIGlub3QgdHJlZSwgZG9uJ3QgY2hhcmdlIHF1b3RhIHRvIGFueW9uZSAqLworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCAmcGF0aCwgJmtleSwgJmloLCBOVUxMLCAoY2hhciAqKSZsaW5rKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmIChyZXR2YWwgIT0gLUVOT1NQQykKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtMjEyMDogYWRkX3NhdmVfbGluazogaW5zZXJ0X2l0ZW0gcmV0dXJuZWQgJWQiLAorCQkJCQkgcmV0dmFsKTsKKwl9IGVsc2UgeworCQlpZiAodHJ1bmNhdGUpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PQorCQkJICAgIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworCQllbHNlCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7CisJfQogfQogCi0KIC8qIHRoaXMgb3BlbnMgdHJhbnNhY3Rpb24gdW5saWtlIGFkZF9zYXZlX2xpbmsgKi8KLWludCByZW1vdmVfc2F2ZV9saW5rIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHRydW5jYXRlKQoraW50IHJlbW92ZV9zYXZlX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHRydW5jYXRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2tleSBrZXk7Ci0gICAgaW50IGVycjsKLSAKLSAgICAvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyBvbmx5ICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbiAoJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOwotICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gCi0gICAgLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCi0gICAga2V5LmtfZGlyX2lkID0gY3B1X3RvX2xlMzIgKE1BWF9LRVlfT0JKRUNUSUQpOwotICAgIGtleS5rX29iamVjdGlkID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX29iamVjdGlkOwotICAgIGlmICghdHJ1bmNhdGUpIHsKLSAgICAgICAgLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCi0gICAgICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCAma2V5LAotCQkJICAgICAxICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLSAgICAgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAma2V5LCBUWVBFX0RJUkVDVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogdHJ1bmNhdGUgKi8KLSAgICAgICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIDEpOwotICAgICAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIFRZUEVfSU5ESVJFQ1QpOwotICAgIH0KLSAKLSAgICBpZiggKCB0cnVuY2F0ZSAmJiAKLSAgICAgICAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayApICkgfHwKLSAgICAgICAgKCAhdHJ1bmNhdGUgJiYgCi0gICAgICAgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3VubGlua19tYXNrICkgKSApCi0JLyogZG9uJ3QgdGFrZSBxdW90YSBieXRlcyBmcm9tIGFueXdoZXJlICovCi0JcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKCZ0aCwgTlVMTCwgJmtleSk7Ci0gICAgaWYgKCF0cnVuY2F0ZSkgewotCXJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQgKCZ0aCwgaW5vZGUtPmlfaW5vKTsKLQlSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICY9IH5pX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7Ci0gICAgfSBlbHNlCi0JUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmPSB+aV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0gCi0gICAgcmV0dXJuIGpvdXJuYWxfZW5kICgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5IGtleTsKKwlpbnQgZXJyOworCisJLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgb25seSAqLworCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KKwlrZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMihNQVhfS0VZX09CSkVDVElEKTsKKwlrZXkua19vYmplY3RpZCA9IElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkOworCWlmICghdHJ1bmNhdGUpIHsKKwkJLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCisJCXNldF9sZV9rZXlfa19vZmZzZXQoS0VZX0ZPUk1BVF8zXzUsICZrZXksCisJCQkJICAgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9ESVJFQ1QpOworCX0gZWxzZSB7CisJCS8qIHRydW5jYXRlICovCisJCXNldF9sZV9rZXlfa19vZmZzZXQoS0VZX0ZPUk1BVF8zXzUsICZrZXksIDEpOworCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9JTkRJUkVDVCk7CisJfQorCisJaWYgKCh0cnVuY2F0ZSAmJgorCSAgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2spKSB8fAorCSAgICAoIXRydW5jYXRlICYmCisJICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2spKSkKKwkJLyogZG9uJ3QgdGFrZSBxdW90YSBieXRlcyBmcm9tIGFueXdoZXJlICovCisJCXJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKCZ0aCwgTlVMTCwgJmtleSk7CisJaWYgKCF0cnVuY2F0ZSkgeworCQlyZWlzZXJmc19yZWxlYXNlX29iamVjdGlkKCZ0aCwgaW5vZGUtPmlfaW5vKTsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKwl9IGVsc2UKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworCisJcmV0dXJuIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKIH0KIAotCi1zdGF0aWMgdm9pZCByZWlzZXJmc19wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgdm9pZCByZWlzZXJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICBpbnQgaTsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gIHRoLnRfdHJhbnNfaWQgPSAwOworCWludCBpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJdGgudF90cmFuc19pZCA9IDA7CiAKLSAgaWYgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KSB7Ci0gICAgZF9pbnZhbGlkYXRlIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7Ci0gICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOwotICB9Ci0gIAotICBpZiAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgewotICAgIGRfaW52YWxpZGF0ZSAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0gICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0gIH0KKwlpZiAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpIHsKKwkJZF9pbnZhbGlkYXRlKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKwkJZHB1dChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisJfQogCi0gIC8qIGNoYW5nZSBmaWxlIHN5c3RlbSBzdGF0ZSB0byBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBtb3VudGVkIHdpdGggcmVhZC13cml0ZSBwZXJtaXNzaW9ucyAqLwotICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgIGlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSkgewotICAgICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7Ci0gICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIFNCX0RJU0tfU1VQRVJfQkxPQ0socyksIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7Ci0gICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgfQotICB9CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJZF9pbnZhbGlkYXRlKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCQlkcHV0KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCX0KIAotICAvKiBub3RlLCBqb3VybmFsX3JlbGVhc2UgY2hlY2tzIGZvciByZWFkb25seSBtb3VudCwgYW5kIGNhbiBkZWNpZGUgbm90Ci0gICoqIHRvIGRvIGEgam91cm5hbF9lbmQKLSAgKi8KLSAgam91cm5hbF9yZWxlYXNlKCZ0aCwgcykgOworCS8qIGNoYW5nZSBmaWxlIHN5c3RlbSBzdGF0ZSB0byBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBtb3VudGVkIHdpdGggcmVhZC13cml0ZSBwZXJtaXNzaW9ucyAqLworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSkgeworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwKKwkJCQkJCSAgICAgMSk7CisJCQlzZXRfc2JfdW1vdW50X3N0YXRlKFNCX0RJU0tfU1VQRVJfQkxPQ0socyksCisJCQkJCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCX0KKwl9CiAKLSAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIgKHMpOyBpICsrKQotICAgIGJyZWxzZSAoU0JfQVBfQklUTUFQIChzKVtpXS5iaCk7CisJLyogbm90ZSwgam91cm5hbF9yZWxlYXNlIGNoZWNrcyBmb3IgcmVhZG9ubHkgbW91bnQsIGFuZCBjYW4gZGVjaWRlIG5vdAorCSAqKiB0byBkbyBhIGpvdXJuYWxfZW5kCisJICovCisJam91cm5hbF9yZWxlYXNlKCZ0aCwgcyk7CiAKLSAgdmZyZWUgKFNCX0FQX0JJVE1BUCAocykpOworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspCisJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbaV0uYmgpOwogCi0gIGJyZWxzZSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKwl2ZnJlZShTQl9BUF9CSVRNQVAocykpOwogCi0gIHByaW50X3N0YXRpc3RpY3MgKHMpOworCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CiAKLSAgaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjAwNDogcmVpc2VyZnNfcHV0X3N1cGVyOiBhbGxvY2F0ZWQgbWVtb3J5IGxlZnQgJWQiLAotCQkgICAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7Ci0gIH0KKwlwcmludF9zdGF0aXN0aWNzKHMpOwogCi0gIGlmIChSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiZ3JlZW4tMjAwNTogcmVpc2VyZnNfcHV0X3N1cGVyOiByZXNlcnZlZCBibG9ja3MgbGVmdCAlZCIsCi0JCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MpOwotICB9CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICE9IDApIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtMjAwNDogcmVpc2VyZnNfcHV0X3N1cGVyOiBhbGxvY2F0ZWQgbWVtb3J5IGxlZnQgJWQiLAorCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CisJfQogCi0gIHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzICk7CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJncmVlbi0yMDA1OiByZWlzZXJmc19wdXRfc3VwZXI6IHJlc2VydmVkIGJsb2NrcyBsZWZ0ICVkIiwKKwkJCQkgUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2Nrcyk7CisJfQogCi0gIGtmcmVlKHMtPnNfZnNfaW5mbyk7Ci0gIHMtPnNfZnNfaW5mbyA9IE5VTEw7CisJcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUocyk7CiAKLSAgcmV0dXJuOworCWtmcmVlKHMtPnNfZnNfaW5mbyk7CisJcy0+c19mc19pbmZvID0gTlVMTDsKKworCXJldHVybjsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIHJlaXNlcmZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJlaXNlcmZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVpc2VyZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICopCisJICAgIGttZW1fY2FjaGVfYWxsb2MocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNDg4LDI1ICs1MDksMjYgQEAKIAlrbWVtX2NhY2hlX2ZyZWUocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBSRUlTRVJGU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICopIGZvbzsKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilmb287CiAKLQlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQogCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpIDsKKwkJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpOwogCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOwogCQllaS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKIAkJZWktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOwogCX0KIH0KLSAKKwogc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKIHsKIAlyZWlzZXJmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicmVpc2VyX2lub2RlX2NhY2hlIiwKLQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8pLAotCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAotCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJCQkJCQkgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgcmVpc2VyZnNfaW5vZGVfaW5mbyksCisJCQkJCQkgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkJICBpbml0X29uY2UsIE5VTEwpOwogCWlmIChyZWlzZXJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC01MTUsNzIgKzUzNyw3NiBAQAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJaWYgKGttZW1fY2FjaGVfZGVzdHJveShyZWlzZXJmc19pbm9kZV9jYWNoZXApKQotCQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAicmVpc2VyZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkIik7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgInJlaXNlcmZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZCIpOwogfQogCiAvKiB3ZSBkb24ndCBtYXJrIGlub2RlcyBkaXJ0eSwgd2UganVzdCBsb2cgdGhlbSAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfZGlydHlfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CitzdGF0aWMgdm9pZCByZWlzZXJmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAKLSAgICBpbnQgZXJyID0gMDsKLSAgICBpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgImNsbS02MDA2OiB3cml0aW5nIGlub2RlICVsdSBvbiByZWFkb25seSBGUyIsCi0JICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfaW5vKSA7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWludCBlcnIgPSAwOworCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiY2xtLTYwMDY6IHdyaXRpbmcgaW5vZGUgJWx1IG9uIHJlYWRvbmx5IEZTIiwKKwkJCQkgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuOworCX0KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotICAgIC8qIHRoaXMgaXMgcmVhbGx5IG9ubHkgdXNlZCBmb3IgYXRpbWUgdXBkYXRlcywgc28gdGhleSBkb24ndCBoYXZlCi0gICAgKiogdG8gYmUgaW5jbHVkZWQgaW4gT19TWU5DIG9yIGZzeW5jCi0gICAgKi8KLSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpIDsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0gICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJLyogdGhpcyBpcyByZWFsbHkgb25seSB1c2VkIGZvciBhdGltZSB1cGRhdGVzLCBzbyB0aGV5IGRvbid0IGhhdmUKKwkgKiogdG8gYmUgaW5jbHVkZWQgaW4gT19TWU5DIG9yIGZzeW5jCisJICovCisJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKKwlpZiAoZXJyKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJldHVybjsKKwl9CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX2NsZWFyX2lub2RlIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHZvaWQgcmVpc2VyZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCi0gICAgYWNsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzczsKLSAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCi0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCWFjbCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3M7CisJaWYgKGFjbCAmJiAhSVNfRVJSKGFjbCkpCisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CiAKLSAgICBhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdDsKLSAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCi0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKwlhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdDsKKwlpZiAoYWNsICYmICFJU19FUlIoYWNsKSkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CiB9CiAKICNpZmRlZiBDT05GSUdfUVVPVEEKLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOwotc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwKKwkJCQkgICAgc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwKKwkJCQkgICBsb2ZmX3QpOwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByZWlzZXJmc19zb3BzID0KLXsKLSAgLmFsbG9jX2lub2RlID0gcmVpc2VyZnNfYWxsb2NfaW5vZGUsCi0gIC5kZXN0cm95X2lub2RlID0gcmVpc2VyZnNfZGVzdHJveV9pbm9kZSwKLSAgLndyaXRlX2lub2RlID0gcmVpc2VyZnNfd3JpdGVfaW5vZGUsCi0gIC5kaXJ0eV9pbm9kZSA9IHJlaXNlcmZzX2RpcnR5X2lub2RlLAotICAuZGVsZXRlX2lub2RlID0gcmVpc2VyZnNfZGVsZXRlX2lub2RlLAotICAuY2xlYXJfaW5vZGUgID0gcmVpc2VyZnNfY2xlYXJfaW5vZGUsCi0gIC5wdXRfc3VwZXIgPSByZWlzZXJmc19wdXRfc3VwZXIsCi0gIC53cml0ZV9zdXBlciA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyLAotICAuc3luY19mcyA9IHJlaXNlcmZzX3N5bmNfZnMsCi0gIC53cml0ZV9zdXBlcl9sb2NrZnMgPSByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMsCi0gIC51bmxvY2tmcyA9IHJlaXNlcmZzX3VubG9ja2ZzLAotICAuc3RhdGZzID0gcmVpc2VyZnNfc3RhdGZzLAotICAucmVtb3VudF9mcyA9IHJlaXNlcmZzX3JlbW91bnQsCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmVpc2VyZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUgPSByZWlzZXJmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IHJlaXNlcmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlID0gcmVpc2VyZnNfd3JpdGVfaW5vZGUsCisJLmRpcnR5X2lub2RlID0gcmVpc2VyZnNfZGlydHlfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZSA9IHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUgPSByZWlzZXJmc19jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyID0gcmVpc2VyZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlciA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzID0gcmVpc2VyZnNfc3luY19mcywKKwkud3JpdGVfc3VwZXJfbG9ja2ZzID0gcmVpc2VyZnNfd3JpdGVfc3VwZXJfbG9ja2ZzLAorCS51bmxvY2tmcyA9IHJlaXNlcmZzX3VubG9ja2ZzLAorCS5zdGF0ZnMgPSByZWlzZXJmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMgPSByZWlzZXJmc19yZW1vdW50LAogI2lmZGVmIENPTkZJR19RVU9UQQotICAucXVvdGFfcmVhZCA9IHJlaXNlcmZzX3F1b3RhX3JlYWQsCi0gIC5xdW90YV93cml0ZSA9IHJlaXNlcmZzX3F1b3RhX3dyaXRlLAorCS5xdW90YV9yZWFkID0gcmVpc2VyZnNfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUgPSByZWlzZXJmc19xdW90YV93cml0ZSwKICNlbmRpZgogfTsKIApAQCAtNTk2LDUwICs2MjIsNDggQEAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50LCBjaGFyICopOwogCi1zdGF0aWMgc3RydWN0IGRxdW90X29wZXJhdGlvbnMgcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9ucyA9Ci17Ci0gIC5pbml0aWFsaXplID0gcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZSwKLSAgLmRyb3AgPSByZWlzZXJmc19kcXVvdF9kcm9wLAotICAuYWxsb2Nfc3BhY2UgPSBkcXVvdF9hbGxvY19zcGFjZSwKLSAgLmFsbG9jX2lub2RlID0gZHF1b3RfYWxsb2NfaW5vZGUsCi0gIC5mcmVlX3NwYWNlID0gZHF1b3RfZnJlZV9zcGFjZSwKLSAgLmZyZWVfaW5vZGUgPSBkcXVvdF9mcmVlX2lub2RlLAotICAudHJhbnNmZXIgPSBkcXVvdF90cmFuc2ZlciwKLSAgLndyaXRlX2RxdW90ID0gcmVpc2VyZnNfd3JpdGVfZHF1b3QsCi0gIC5hY3F1aXJlX2RxdW90ID0gcmVpc2VyZnNfYWNxdWlyZV9kcXVvdCwKLSAgLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAotICAubWFya19kaXJ0eSA9IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHksCi0gIC53cml0ZV9pbmZvID0gcmVpc2VyZnNfd3JpdGVfaW5mbywKK3N0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyByZWlzZXJmc19xdW90YV9vcGVyYXRpb25zID0geworCS5pbml0aWFsaXplID0gcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcCA9IHJlaXNlcmZzX2RxdW90X2Ryb3AsCisJLmFsbG9jX3NwYWNlID0gZHF1b3RfYWxsb2Nfc3BhY2UsCisJLmFsbG9jX2lub2RlID0gZHF1b3RfYWxsb2NfaW5vZGUsCisJLmZyZWVfc3BhY2UgPSBkcXVvdF9mcmVlX3NwYWNlLAorCS5mcmVlX2lub2RlID0gZHF1b3RfZnJlZV9pbm9kZSwKKwkudHJhbnNmZXIgPSBkcXVvdF90cmFuc2ZlciwKKwkud3JpdGVfZHF1b3QgPSByZWlzZXJmc193cml0ZV9kcXVvdCwKKwkuYWNxdWlyZV9kcXVvdCA9IHJlaXNlcmZzX2FjcXVpcmVfZHF1b3QsCisJLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAorCS5tYXJrX2RpcnR5ID0gcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eSwKKwkud3JpdGVfaW5mbyA9IHJlaXNlcmZzX3dyaXRlX2luZm8sCiB9OwogCi1zdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyByZWlzZXJmc19xY3RsX29wZXJhdGlvbnMgPQotewotICAucXVvdGFfb24gPSByZWlzZXJmc19xdW90YV9vbiwKLSAgLnF1b3RhX29mZiA9IHZmc19xdW90YV9vZmYsCi0gIC5xdW90YV9zeW5jID0gdmZzX3F1b3RhX3N5bmMsCi0gIC5nZXRfaW5mbyA9IHZmc19nZXRfZHFpbmZvLAotICAuc2V0X2luZm8gPSB2ZnNfc2V0X2RxaW5mbywKLSAgLmdldF9kcWJsayA9IHZmc19nZXRfZHFibGssCi0gIC5zZXRfZHFibGsgPSB2ZnNfc2V0X2RxYmxrLAorc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zID0geworCS5xdW90YV9vbiA9IHJlaXNlcmZzX3F1b3RhX29uLAorCS5xdW90YV9vZmYgPSB2ZnNfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jID0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvID0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvID0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsayA9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsayA9IHZmc19zZXRfZHFibGssCiB9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcmVpc2VyZnNfZXhwb3J0X29wcyA9IHsKLSAgLmVuY29kZV9maCA9IHJlaXNlcmZzX2VuY29kZV9maCwKLSAgLmRlY29kZV9maCA9IHJlaXNlcmZzX2RlY29kZV9maCwKLSAgLmdldF9wYXJlbnQgPSByZWlzZXJmc19nZXRfcGFyZW50LAotICAuZ2V0X2RlbnRyeSA9IHJlaXNlcmZzX2dldF9kZW50cnksCi19IDsKKwkuZW5jb2RlX2ZoID0gcmVpc2VyZnNfZW5jb2RlX2ZoLAorCS5kZWNvZGVfZmggPSByZWlzZXJmc19kZWNvZGVfZmgsCisJLmdldF9wYXJlbnQgPSByZWlzZXJmc19nZXRfcGFyZW50LAorCS5nZXRfZGVudHJ5ID0gcmVpc2VyZnNfZ2V0X2RlbnRyeSwKK307CiAKIC8qIHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gcmVpc2VyZnNfZ2V0b3B0ICgpIGZvciBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3IgdGhvc2UKICAgIG1vdW50IG9wdGlvbnMgdGhhdCBoYXZlIHZhbHVlcyByYXRoZXIgdGhhbiBiZWluZyB0b2dnbGVzLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKiB2YWx1ZTsKLSAgICBpbnQgc2V0bWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiAqLwotICAgIGludCBjbHJtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCi0JCSAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCi0JCSAgICBhcHBsaWVkIEJFRk9SRSBzZXRtYXNrICovCisJY2hhciAqdmFsdWU7CisJaW50IHNldG1hc2s7CQkvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCisJCQkJICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KKwlpbnQgY2xybWFzazsJCS8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKKwkJCQkgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCisJCQkJICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLwogfSBhcmdfZGVzY190OwogCiAvKiBTZXQgdGhpcyBiaXQgaW4gYXJnX3JlcXVpcmVkIHRvIGFsbG93IGVtcHR5IGFyZ3VtZW50cyAqLwpAQCAtNjQ4LDY3ICs2NzIsNzAgQEAKIC8qIHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gcmVpc2VyZnNfZ2V0b3B0KCkgZm9yIGRlc2NyaWJpbmcgdGhlIHNldCBvZiByZWlzZXJmcwogICAgbW91bnQgb3B0aW9ucyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKiBvcHRpb25fbmFtZTsKLSAgICBpbnQgYXJnX3JlcXVpcmVkOyAvKiAwIGlmIGFyZ3VtZW50IGlzIG5vdCByZXF1aXJlZCwgbm90IDAgb3RoZXJ3aXNlICovCi0gICAgY29uc3QgYXJnX2Rlc2NfdCAqIHZhbHVlczsgLyogbGlzdCBvZiB2YWx1ZXMgYWNjZXB0ZWQgYnkgYW4gb3B0aW9uICovCi0gICAgaW50IHNldG1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gc2V0IG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KLSAgICBpbnQgY2xybWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBjbGVhciBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiAgdGhpcwotCQkgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gVGhpcyBpcwotCQkgICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLworCWNoYXIgKm9wdGlvbl9uYW1lOworCWludCBhcmdfcmVxdWlyZWQ7CS8qIDAgaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkLCBub3QgMCBvdGhlcndpc2UgKi8KKwljb25zdCBhcmdfZGVzY190ICp2YWx1ZXM7CS8qIGxpc3Qgb2YgdmFsdWVzIGFjY2VwdGVkIGJ5IGFuIG9wdGlvbiAqLworCWludCBzZXRtYXNrOwkJLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcworCQkJCSAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuICovCisJaW50IGNscm1hc2s7CQkvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCisJCQkJICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gVGhpcyBpcworCQkJCSAgIGFwcGxpZWQgQkVGT1JFIHNldG1hc2sgKi8KIH0gb3B0X2Rlc2NfdDsKIAogLyogcG9zc2libGUgdmFsdWVzIGZvciAtbyBkYXRhPSAqLwogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgbG9nZ2luZ19tb2RlW10gPSB7Ci0gICAgeyJvcmRlcmVkIiwgMTw8UkVJU0VSRlNfREFUQV9PUkRFUkVELCAoMTw8UkVJU0VSRlNfREFUQV9MT0d8MTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0spfSwKLSAgICB7ImpvdXJuYWwiLCAxPDxSRUlTRVJGU19EQVRBX0xPRywgKDE8PFJFSVNFUkZTX0RBVEFfT1JERVJFRHwxPDxSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAotICAgIHsid3JpdGViYWNrIiwgMTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0ssICgxPDxSRUlTRVJGU19EQVRBX09SREVSRUR8MTw8UkVJU0VSRlNfREFUQV9MT0cpfSwKLSAgICB7TlVMTCwgMH0KKwl7Im9yZGVyZWQiLCAxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCwKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cgfCAxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKX0sCisJeyJqb3VybmFsIiwgMSA8PCBSRUlTRVJGU19EQVRBX0xPRywKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEIHwgMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAorCXsid3JpdGViYWNrIiwgMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSywKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEIHwgMSA8PCBSRUlTRVJGU19EQVRBX0xPRyl9LAorCXtOVUxMLCAwfQogfTsKIAogLyogcG9zc2libGUgdmFsdWVzIGZvciAtbyBiYXJyaWVyPSAqLwogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgYmFycmllcl9tb2RlW10gPSB7Ci0gICAgeyJub25lIiwgMTw8UkVJU0VSRlNfQkFSUklFUl9OT05FLCAxPDxSRUlTRVJGU19CQVJSSUVSX0ZMVVNIfSwKLSAgICB7ImZsdXNoIiwgMTw8UkVJU0VSRlNfQkFSUklFUl9GTFVTSCwgMTw8UkVJU0VSRlNfQkFSUklFUl9OT05FfSwKLSAgICB7TlVMTCwgMH0KKwl7Im5vbmUiLCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORSwgMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIfSwKKwl7ImZsdXNoIiwgMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNILCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORX0sCisJe05VTEwsIDB9CiB9OwogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yICItbyBibG9jay1hbGxvY2F0b3I9IiBhbmQgYml0cyB3aGljaCBhcmUgdG8gYmUgc2V0IGluCiAgICBzX21vdW50X29wdCBvZiByZWlzZXJmcyBzcGVjaWZpYyBwYXJ0IG9mIGluLWNvcmUgc3VwZXIgYmxvY2sgKi8KIHN0YXRpYyBjb25zdCBhcmdfZGVzY190IGJhbGxvY1tdID0gewotICAgIHsibm9ib3JkZXIiLCAxPDxSRUlTRVJGU19OT19CT1JERVIsIDB9LAotICAgIHsiYm9yZGVyIiwgMCwgMTw8UkVJU0VSRlNfTk9fQk9SREVSfSwKLSAgICB7Im5vX3VuaGFzaGVkX3JlbG9jYXRpb24iLCAxPDxSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKLSAgICB7Imhhc2hlZF9yZWxvY2F0aW9uIiwgMTw8UkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT04sIDB9LAotICAgIHsidGVzdDQiLCAxPDxSRUlTRVJGU19URVNUNCwgMH0sCi0gICAgeyJub3Rlc3Q0IiwgMCwgMTw8UkVJU0VSRlNfVEVTVDR9LAotICAgIHtOVUxMLCAwLCAwfQorCXsibm9ib3JkZXIiLCAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUiwgMH0sCisJeyJib3JkZXIiLCAwLCAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUn0sCisJeyJub191bmhhc2hlZF9yZWxvY2F0aW9uIiwgMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKKwl7Imhhc2hlZF9yZWxvY2F0aW9uIiwgMSA8PCBSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTiwgMH0sCisJeyJ0ZXN0NCIsIDEgPDwgUkVJU0VSRlNfVEVTVDQsIDB9LAorCXsibm90ZXN0NCIsIDAsIDEgPDwgUkVJU0VSRlNfVEVTVDR9LAorCXtOVUxMLCAwLCAwfQogfTsKIAogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgdGFpbHNbXSA9IHsKLSAgICB7Im9uIiwgMTw8UkVJU0VSRlNfTEFSR0VUQUlMLCAxPDxSRUlTRVJGU19TTUFMTFRBSUx9LAotICAgIHsib2ZmIiwgMCwgKDE8PFJFSVNFUkZTX0xBUkdFVEFJTCl8KDE8PFJFSVNFUkZTX1NNQUxMVEFJTCl9LAotICAgIHsic21hbGwiLCAxPDxSRUlTRVJGU19TTUFMTFRBSUwsIDE8PFJFSVNFUkZTX0xBUkdFVEFJTH0sCi0gICAge05VTEwsIDAsIDB9CisJeyJvbiIsIDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMLCAxIDw8IFJFSVNFUkZTX1NNQUxMVEFJTH0sCisJeyJvZmYiLCAwLCAoMSA8PCBSRUlTRVJGU19MQVJHRVRBSUwpIHwgKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKX0sCisJeyJzbWFsbCIsIDEgPDwgUkVJU0VSRlNfU01BTExUQUlMLCAxIDw8IFJFSVNFUkZTX0xBUkdFVEFJTH0sCisJe05VTEwsIDAsIDB9CiB9OwogCiBzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBlcnJvcl9hY3Rpb25zW10gPSB7Ci0gICAgeyJwYW5pYyIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMsCi0gICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1JPIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAotICAgIHsicm8tcmVtb3VudCIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUk8sCi0gICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAorCXsicGFuaWMiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDLAorCSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKKwl7InJvLXJlbW91bnQiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPLAorCSAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKICNpZmRlZiBSRUlTRVJGU19KT1VSTkFMX0VSUk9SX0FMTE9XU19OT19MT0cKLSAgICB7ImNvbnRpbnVlIiwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKLSAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMgfCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPKX0sCisJeyJjb250aW51ZSIsIDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUsCisJICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9STyl9LAogI2VuZGlmCi0gICAge05VTEwsIDAsIDB9LAorCXtOVUxMLCAwLCAwfSwKIH07CiAKLWludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OyAvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCi0JCQkJCSAgICAgIFRoZXJlIG1pZ2h0IGJlIGJyb2tlbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUKLQkJCQkJICAgICAgY29uZnVzZWQgYnkgdGhpcy4gVXNlIG5vbGFyZ2VpbyBtb3VudCBvcHRpb24KLQkJCQkJICAgICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgotCQkJCQkgICAgKi8KK2ludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OwkvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCisJCQkJCQkgICBUaGVyZSBtaWdodCBiZSBicm9rZW4gYXBwbGljYXRpb25zIHRoYXQgYXJlCisJCQkJCQkgICBjb25mdXNlZCBieSB0aGlzLiBVc2Ugbm9sYXJnZWlvIG1vdW50IG9wdGlvbgorCQkJCQkJICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgorCQkJCQkJICovCiAKIC8qIHByb2NlZWQgb25seSBvbmUgb3B0aW9uIGZyb20gYSBsaXN0ICpjdXIgLSBzdHJpbmcgY29udGFpbmluZyBvZiBtb3VudCBvcHRpb25zCiAgICBvcHRzIC0gYXJyYXkgb2Ygb3B0aW9ucyB3aGljaCBhcmUgYWNjZXB0ZWQKQEAgLTcxNiw0ODUgKzc0Myw1MzAgQEAKICAgIGluIHRoZSBpbnB1dCAtIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGlzIHN0b3JlZCBoZXJlCiAgICBiaXRfZmxhZ3MgLSBpZiBvcHRpb24gcmVxdWlyZXMgdG8gc2V0IGEgY2VydGFpbiBiaXQgLSBpdCBpcyBzZXQgaGVyZQogICAgcmV0dXJuIC0xIGlmIHVua25vd24gb3B0aW9uIGlzIGZvdW5kLCBvcHQtPmFyZ19yZXF1aXJlZCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0b3B0ICggc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqKiBjdXIsIG9wdF9kZXNjX3QgKiBvcHRzLCBjaGFyICoqIG9wdF9hcmcsCi0JCQkgICAgdW5zaWduZWQgbG9uZyAqIGJpdF9mbGFncykKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0b3B0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqKmN1ciwgb3B0X2Rlc2NfdCAqIG9wdHMsCisJCQkgICBjaGFyICoqb3B0X2FyZywgdW5zaWduZWQgbG9uZyAqYml0X2ZsYWdzKQogewotICAgIGNoYXIgKiBwOwotICAgIC8qIGZvbz1iYXIsIAotICAgICAgIF4gICBeICBeCi0gICAgICAgfCAgIHwgICstLSBvcHRpb25fZW5kCi0gICAgICAgfCAgICstLSBhcmdfc3RhcnQKLSAgICAgICArLS0gb3B0aW9uX3N0YXJ0Ci0gICAgKi8KLSAgICBjb25zdCBvcHRfZGVzY190ICogb3B0OwotICAgIGNvbnN0IGFyZ19kZXNjX3QgKiBhcmc7Ci0gICAgCi0gICAgCi0gICAgcCA9ICpjdXI7Ci0gICAgCi0gICAgLyogYXNzdW1lIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIGNvbW1hcyAqLwotICAgICpjdXIgPSBzdHJjaHIgKHAsICcsJyk7Ci0gICAgaWYgKCpjdXIpIHsKLQkqKCpjdXIpID0gJ1wwJzsKLQkoKmN1cikgKys7Ci0gICAgfQorCWNoYXIgKnA7CisJLyogZm9vPWJhciwgCisJICAgXiAgIF4gIF4KKwkgICB8ICAgfCAgKy0tIG9wdGlvbl9lbmQKKwkgICB8ICAgKy0tIGFyZ19zdGFydAorCSAgICstLSBvcHRpb25fc3RhcnQKKwkgKi8KKwljb25zdCBvcHRfZGVzY190ICpvcHQ7CisJY29uc3QgYXJnX2Rlc2NfdCAqYXJnOwogCi0gICAgaWYgKCAhc3RybmNtcCAocCwgImFsbG9jPSIsIDYpICkgewotCS8qIFVnbHkgc3BlY2lhbCBjYXNlLCBwcm9iYWJseSB3ZSBzaG91bGQgcmVkbyBvcHRpb25zIHBhcnNlciBzbyB0aGF0Ci0JICAgaXQgY2FuIHVuZGVyc3RhbmQgc2V2ZXJhbCBhcmd1bWVudHMgZm9yIHNvbWUgb3B0aW9ucywgYWxzbyBzbyB0aGF0Ci0JICAgaXQgY2FuIGZpbGwgc2V2ZXJhbCBiaXRmaWVsZHMgd2l0aCBvcHRpb24gdmFsdWVzLiAqLwotCWlmICggcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyggcywgcCArIDYpICkgewotCSAgICByZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KKwlwID0gKmN1cjsKIAotIAotICAgIC8qIGZvciBldmVyeSBvcHRpb24gaW4gdGhlIGxpc3QgKi8KLSAgICBmb3IgKG9wdCA9IG9wdHM7IG9wdC0+b3B0aW9uX25hbWU7IG9wdCArKykgewotCWlmICghc3RybmNtcCAocCwgb3B0LT5vcHRpb25fbmFtZSwgc3RybGVuIChvcHQtPm9wdGlvbl9uYW1lKSkpIHsKLQkgICAgaWYgKGJpdF9mbGFncykgewotICAgICAgICAgICAgICAgIGlmIChvcHQtPmNscm1hc2sgPT0gKDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUKSkKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwgcCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqYml0X2ZsYWdzICY9IH5vcHQtPmNscm1hc2s7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdC0+c2V0bWFzayA9PSAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiJXMgbm90IHN1cHBvcnRlZC4iLCBwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpiaXRfZmxhZ3MgfD0gb3B0LT5zZXRtYXNrOwotCSAgICB9Ci0JICAgIGJyZWFrOworCS8qIGFzc3VtZSBhcmd1bWVudCBjYW5ub3QgY29udGFpbiBjb21tYXMgKi8KKwkqY3VyID0gc3RyY2hyKHAsICcsJyk7CisJaWYgKCpjdXIpIHsKKwkJKigqY3VyKSA9ICdcMCc7CisJCSgqY3VyKSsrOwogCX0KLSAgICB9Ci0gICAgaWYgKCFvcHQtPm9wdGlvbl9uYW1lKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInVua25vd24gbW91bnQgb3B0aW9uIFwiJXNcIiIsIHApOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgcCArPSBzdHJsZW4gKG9wdC0+b3B0aW9uX25hbWUpOwotICAgIHN3aXRjaCAoKnApIHsKLSAgICBjYXNlICc9JzoKLQlpZiAoIW9wdC0+YXJnX3JlcXVpcmVkKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ0aGUgb3B0aW9uIFwiJXNcIiBkb2VzIG5vdCByZXF1aXJlIGFuIGFyZ3VtZW50IiwKLQkJICAgIG9wdC0+b3B0aW9uX25hbWUpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCWJyZWFrOwotCQotICAgIGNhc2UgMDoKLQlpZiAob3B0LT5hcmdfcmVxdWlyZWQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInRoZSBvcHRpb24gXCIlc1wiIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iiwgb3B0LT5vcHRpb25fbmFtZSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlyZWlzZXJmc193YXJuaW5nIChzLCAiaGVhZCBvZiBvcHRpb24gXCIlc1wiIGlzIG9ubHkgY29ycmVjdCIsIG9wdC0+b3B0aW9uX25hbWUpOwotCXJldHVybiAtMTsKLSAgICB9CiAKLSAgICAvKiBtb3ZlIHRvIHRoZSBhcmd1bWVudCwgb3IgdG8gbmV4dCBvcHRpb24gaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkICovCi0gICAgcCArKzsKLSAgICAKLSAgICBpZiAoIG9wdC0+YXJnX3JlcXVpcmVkICYmICEob3B0LT5hcmdfcmVxdWlyZWQgJiAoMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpKSAmJiAhc3RybGVuIChwKSApIHsKLQkvKiB0aGlzIGNhdGNoZXMgIm9wdGlvbj0sIiBpZiBub3QgYWxsb3dlZCAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJlbXB0eSBhcmd1bWVudCBmb3IgXCIlc1wiIiwgb3B0LT5vcHRpb25fbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBpZiAoIW9wdC0+dmFsdWVzKSB7Ci0JLyogKj1OVUxMb3B0X2FyZyBjb250YWlucyBwb2ludGVyIHRvIGFyZ3VtZW50ICovCi0JKm9wdF9hcmcgPSBwOwotCXJldHVybiBvcHQtPmFyZ19yZXF1aXJlZCAmIH4oMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpOwotICAgIH0KLSAgICAKLSAgICAvKiB2YWx1ZXMgcG9zc2libGUgZm9yIHRoaXMgb3B0aW9uIGFyZSBsaXN0ZWQgaW4gb3B0LT52YWx1ZXMgKi8KLSAgICBmb3IgKGFyZyA9IG9wdC0+dmFsdWVzOyBhcmctPnZhbHVlOyBhcmcgKyspIHsKLQlpZiAoIXN0cmNtcCAocCwgYXJnLT52YWx1ZSkpIHsKLQkgICAgaWYgKGJpdF9mbGFncykgewotCQkqYml0X2ZsYWdzICY9IH5hcmctPmNscm1hc2s7Ci0JCSpiaXRfZmxhZ3MgfD0gYXJnLT5zZXRtYXNrOwotCSAgICB9Ci0JICAgIHJldHVybiBvcHQtPmFyZ19yZXF1aXJlZDsKKwlpZiAoIXN0cm5jbXAocCwgImFsbG9jPSIsIDYpKSB7CisJCS8qIFVnbHkgc3BlY2lhbCBjYXNlLCBwcm9iYWJseSB3ZSBzaG91bGQgcmVkbyBvcHRpb25zIHBhcnNlciBzbyB0aGF0CisJCSAgIGl0IGNhbiB1bmRlcnN0YW5kIHNldmVyYWwgYXJndW1lbnRzIGZvciBzb21lIG9wdGlvbnMsIGFsc28gc28gdGhhdAorCQkgICBpdCBjYW4gZmlsbCBzZXZlcmFsIGJpdGZpZWxkcyB3aXRoIG9wdGlvbiB2YWx1ZXMuICovCisJCWlmIChyZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHMsIHAgKyA2KSkgeworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KIAl9Ci0gICAgfQotICAgIAotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJiYWQgdmFsdWUgXCIlc1wiIGZvciBvcHRpb24gXCIlc1wiIiwgcCwgb3B0LT5vcHRpb25fbmFtZSk7Ci0gICAgcmV0dXJuIC0xOworCisJLyogZm9yIGV2ZXJ5IG9wdGlvbiBpbiB0aGUgbGlzdCAqLworCWZvciAob3B0ID0gb3B0czsgb3B0LT5vcHRpb25fbmFtZTsgb3B0KyspIHsKKwkJaWYgKCFzdHJuY21wKHAsIG9wdC0+b3B0aW9uX25hbWUsIHN0cmxlbihvcHQtPm9wdGlvbl9uYW1lKSkpIHsKKwkJCWlmIChiaXRfZmxhZ3MpIHsKKwkJCQlpZiAob3B0LT5jbHJtYXNrID09CisJCQkJICAgICgxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCkpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwKKwkJCQkJCQkgcCk7CisJCQkJZWxzZQorCQkJCQkqYml0X2ZsYWdzICY9IH5vcHQtPmNscm1hc2s7CisJCQkJaWYgKG9wdC0+c2V0bWFzayA9PQorCQkJCSAgICAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQorCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsICIlcyBub3Qgc3VwcG9ydGVkLiIsCisJCQkJCQkJIHApOworCQkJCWVsc2UKKwkJCQkJKmJpdF9mbGFncyB8PSBvcHQtPnNldG1hc2s7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIW9wdC0+b3B0aW9uX25hbWUpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAidW5rbm93biBtb3VudCBvcHRpb24gXCIlc1wiIiwgcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwICs9IHN0cmxlbihvcHQtPm9wdGlvbl9uYW1lKTsKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSAnPSc6CisJCWlmICghb3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ0aGUgb3B0aW9uIFwiJXNcIiBkb2VzIG5vdCByZXF1aXJlIGFuIGFyZ3VtZW50IiwKKwkJCQkJIG9wdC0+b3B0aW9uX25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSAwOgorCQlpZiAob3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ0aGUgb3B0aW9uIFwiJXNcIiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCSBvcHQtPm9wdGlvbl9uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKHMsICJoZWFkIG9mIG9wdGlvbiBcIiVzXCIgaXMgb25seSBjb3JyZWN0IiwKKwkJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtb3ZlIHRvIHRoZSBhcmd1bWVudCwgb3IgdG8gbmV4dCBvcHRpb24gaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkICovCisJcCsrOworCisJaWYgKG9wdC0+YXJnX3JlcXVpcmVkCisJICAgICYmICEob3B0LT5hcmdfcmVxdWlyZWQgJiAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSkpCisJICAgICYmICFzdHJsZW4ocCkpIHsKKwkJLyogdGhpcyBjYXRjaGVzICJvcHRpb249LCIgaWYgbm90IGFsbG93ZWQgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiZW1wdHkgYXJndW1lbnQgZm9yIFwiJXNcIiIsCisJCQkJIG9wdC0+b3B0aW9uX25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFvcHQtPnZhbHVlcykgeworCQkvKiAqPU5VTExvcHRfYXJnIGNvbnRhaW5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKi8KKwkJKm9wdF9hcmcgPSBwOworCQlyZXR1cm4gb3B0LT5hcmdfcmVxdWlyZWQgJiB+KDEgPDwgUkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpOworCX0KKworCS8qIHZhbHVlcyBwb3NzaWJsZSBmb3IgdGhpcyBvcHRpb24gYXJlIGxpc3RlZCBpbiBvcHQtPnZhbHVlcyAqLworCWZvciAoYXJnID0gb3B0LT52YWx1ZXM7IGFyZy0+dmFsdWU7IGFyZysrKSB7CisJCWlmICghc3RyY21wKHAsIGFyZy0+dmFsdWUpKSB7CisJCQlpZiAoYml0X2ZsYWdzKSB7CisJCQkJKmJpdF9mbGFncyAmPSB+YXJnLT5jbHJtYXNrOworCQkJCSpiaXRfZmxhZ3MgfD0gYXJnLT5zZXRtYXNrOworCQkJfQorCQkJcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkOworCQl9CisJfQorCisJcmVpc2VyZnNfd2FybmluZyhzLCAiYmFkIHZhbHVlIFwiJXNcIiBmb3Igb3B0aW9uIFwiJXNcIiIsIHAsCisJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJcmV0dXJuIC0xOwogfQogCiAvKiByZXR1cm5zIDAgaWYgc29tZXRoaW5nIGlzIHdyb25nIGluIG9wdGlvbiBzdHJpbmcsIDEgLSBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMsIC8qIHN0cmluZyBnaXZlbiB2aWEgbW91bnQncyAtbyAqLwotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKiBtb3VudF9vcHRpb25zLAotCQkJCSAgIC8qIGFmdGVyIHRoZSBwYXJzaW5nIHBoYXNlLCBjb250YWlucyB0aGUKLQkJCQkgICAgICBjb2xsZWN0aW9uIG9mIGJpdGZsYWdzIGRlZmluaW5nIHdoYXQKLQkJCQkgICAgICBtb3VudCBvcHRpb25zIHdlcmUgc2VsZWN0ZWQuICovCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqIGJsb2NrcywgLyogc3RydG9sLWVkIGZyb20gTk5OIG9mIHJlc2l6ZT1OTk4gKi8KLQkJCQkgICBjaGFyICoqIGpkZXZfbmFtZSwKLQkJCQkgICB1bnNpZ25lZCBpbnQgKiBjb21taXRfbWF4X2FnZSkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKm9wdGlvbnMsCS8qIHN0cmluZyBnaXZlbiB2aWEgbW91bnQncyAtbyAqLworCQkJCSAgdW5zaWduZWQgbG9uZyAqbW91bnRfb3B0aW9ucywKKwkJCQkgIC8qIGFmdGVyIHRoZSBwYXJzaW5nIHBoYXNlLCBjb250YWlucyB0aGUKKwkJCQkgICAgIGNvbGxlY3Rpb24gb2YgYml0ZmxhZ3MgZGVmaW5pbmcgd2hhdAorCQkJCSAgICAgbW91bnQgb3B0aW9ucyB3ZXJlIHNlbGVjdGVkLiAqLworCQkJCSAgdW5zaWduZWQgbG9uZyAqYmxvY2tzLAkvKiBzdHJ0b2wtZWQgZnJvbSBOTk4gb2YgcmVzaXplPU5OTiAqLworCQkJCSAgY2hhciAqKmpkZXZfbmFtZSwKKwkJCQkgIHVuc2lnbmVkIGludCAqY29tbWl0X21heF9hZ2UpCiB7Ci0gICAgaW50IGM7Ci0gICAgY2hhciAqIGFyZyA9IE5VTEw7Ci0gICAgY2hhciAqIHBvczsKLSAgICBvcHRfZGVzY190IG9wdHNbXSA9IHsKLQkvKiBDb21wYXRpYmlsaXR5IHN0dWZmLCBzbyB0aGF0IC1vIG5vdGFpbCBmb3Igb2xkIHNldHVwcyBzdGlsbCB3b3JrICovCi0JeyJ0YWlscyIsCS5hcmdfcmVxdWlyZWQgPSAndCcsIC52YWx1ZXMgPSB0YWlsc30sCi0JeyJub3RhaWwiLAkuY2xybWFzayA9ICgxPDxSRUlTRVJGU19MQVJHRVRBSUwpfCgxPDxSRUlTRVJGU19TTUFMTFRBSUwpfSwKLQl7ImNvbnYiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX0NPTlZFUlR9LAotCXsiYXR0cnMiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX0FUVFJTfSwKLQl7Im5vYXR0cnMiLAkuY2xybWFzayA9IDE8PFJFSVNFUkZTX0FUVFJTfSwKKwlpbnQgYzsKKwljaGFyICphcmcgPSBOVUxMOworCWNoYXIgKnBvczsKKwlvcHRfZGVzY190IG9wdHNbXSA9IHsKKwkJLyogQ29tcGF0aWJpbGl0eSBzdHVmZiwgc28gdGhhdCAtbyBub3RhaWwgZm9yIG9sZCBzZXR1cHMgc3RpbGwgd29yayAqLworCQl7InRhaWxzIiwuYXJnX3JlcXVpcmVkID0gJ3QnLC52YWx1ZXMgPSB0YWlsc30sCisJCXsibm90YWlsIiwuY2xybWFzayA9CisJCSAoMSA8PCBSRUlTRVJGU19MQVJHRVRBSUwpIHwgKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKX0sCisJCXsiY29udiIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX0NPTlZFUlR9LAorCQl7ImF0dHJzIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfQVRUUlN9LAorCQl7Im5vYXR0cnMiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19BVFRSU30sCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSCi0JeyJ1c2VyX3hhdHRyIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19YQVRUUlNfVVNFUn0sCi0JeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAorCQl7InVzZXJfeGF0dHIiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19YQVRUUlNfVVNFUn0sCisJCXsibm91c2VyX3hhdHRyIiwuY2xybWFzayA9IDEgPDwgUkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAogI2Vsc2UKLQl7InVzZXJfeGF0dHIiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCi0JeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwkJeyJ1c2VyX3hhdHRyIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwkJeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAotCXsiYWNsIiwJCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfUE9TSVhBQ0x9LAotCXsibm9hY2wiLAkuY2xybWFzayA9IDE8PFJFSVNFUkZTX1BPU0lYQUNMfSwKKwkJeyJhY2wiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTH0sCisJCXsibm9hY2wiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTH0sCiAjZWxzZQotCXsiYWNsIiwJCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKLQl7Im5vYWNsIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorCQl7ImFjbCIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisJCXsibm9hY2wiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAogI2VuZGlmCi0JeyJub2xvZyIsfSwJIC8qIFRoaXMgaXMgdW5zdXBwb3J0ZWQgKi8KLQl7InJlcGxheW9ubHkiLAkuc2V0bWFzayA9IDE8PFJFUExBWU9OTFl9LAotCXsiYmxvY2stYWxsb2NhdG9yIiwgLmFyZ19yZXF1aXJlZCA9ICdhJywgLnZhbHVlcyA9IGJhbGxvY30sCi0JeyJkYXRhIiwJLmFyZ19yZXF1aXJlZCA9ICdkJywgLnZhbHVlcyA9IGxvZ2dpbmdfbW9kZX0sCi0JeyJiYXJyaWVyIiwJLmFyZ19yZXF1aXJlZCA9ICdiJywgLnZhbHVlcyA9IGJhcnJpZXJfbW9kZX0sCi0JeyJyZXNpemUiLAkuYXJnX3JlcXVpcmVkID0gJ3InLCAudmFsdWVzID0gTlVMTH0sCi0JeyJqZGV2IiwJLmFyZ19yZXF1aXJlZCA9ICdqJywgLnZhbHVlcyA9IE5VTEx9LAotCXsibm9sYXJnZWlvIiwJLmFyZ19yZXF1aXJlZCA9ICd3JywgLnZhbHVlcyA9IE5VTEx9LAotCXsiY29tbWl0IiwJLmFyZ19yZXF1aXJlZCA9ICdjJywgLnZhbHVlcyA9IE5VTEx9LAotCXsidXNycXVvdGEiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1FVT1RBfSwKLQl7ImdycHF1b3RhIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19RVU9UQX0sCi0JeyJub3F1b3RhIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19RVU9UQX0sCi0JeyJlcnJvcnMiLCAJLmFyZ19yZXF1aXJlZCA9ICdlJywgLnZhbHVlcyA9IGVycm9yX2FjdGlvbnN9LAotCXsidXNyanF1b3RhIiwJLmFyZ19yZXF1aXJlZCA9ICd1J3woMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLCAudmFsdWVzID0gTlVMTH0sCi0JeyJncnBqcXVvdGEiLAkuYXJnX3JlcXVpcmVkID0gJ2cnfCgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksIC52YWx1ZXMgPSBOVUxMfSwKLQl7ImpxZm10IiwJLmFyZ19yZXF1aXJlZCA9ICdmJywgLnZhbHVlcyA9IE5VTEx9LAotCXtOVUxMLH0KLSAgICB9OwotCQotICAgICpibG9ja3MgPSAwOwotICAgIGlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JLyogdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbjogY3JlYXRlIHRhaWxzLCBqb3VybmFsaW5nIG9uLCBubwotCSAgIGNvbnZlcnNpb24gdG8gbmV3ZXN0IGZvcm1hdCAqLworCQl7Im5vbG9nIix9LAkvKiBUaGlzIGlzIHVuc3VwcG9ydGVkICovCisJCXsicmVwbGF5b25seSIsLnNldG1hc2sgPSAxIDw8IFJFUExBWU9OTFl9LAorCQl7ImJsb2NrLWFsbG9jYXRvciIsLmFyZ19yZXF1aXJlZCA9ICdhJywudmFsdWVzID0gYmFsbG9jfSwKKwkJeyJkYXRhIiwuYXJnX3JlcXVpcmVkID0gJ2QnLC52YWx1ZXMgPSBsb2dnaW5nX21vZGV9LAorCQl7ImJhcnJpZXIiLC5hcmdfcmVxdWlyZWQgPSAnYicsLnZhbHVlcyA9IGJhcnJpZXJfbW9kZX0sCisJCXsicmVzaXplIiwuYXJnX3JlcXVpcmVkID0gJ3InLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJqZGV2IiwuYXJnX3JlcXVpcmVkID0gJ2onLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJub2xhcmdlaW8iLC5hcmdfcmVxdWlyZWQgPSAndycsLnZhbHVlcyA9IE5VTEx9LAorCQl7ImNvbW1pdCIsLmFyZ19yZXF1aXJlZCA9ICdjJywudmFsdWVzID0gTlVMTH0sCisJCXsidXNycXVvdGEiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19RVU9UQX0sCisJCXsiZ3JwcXVvdGEiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19RVU9UQX0sCisJCXsibm9xdW90YSIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX1FVT1RBfSwKKwkJeyJlcnJvcnMiLC5hcmdfcmVxdWlyZWQgPSAnZScsLnZhbHVlcyA9IGVycm9yX2FjdGlvbnN9LAorCQl7InVzcmpxdW90YSIsLmFyZ19yZXF1aXJlZCA9CisJCSAndScgfCAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksLnZhbHVlcyA9IE5VTEx9LAorCQl7ImdycGpxdW90YSIsLmFyZ19yZXF1aXJlZCA9CisJCSAnZycgfCAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksLnZhbHVlcyA9IE5VTEx9LAorCQl7ImpxZm10IiwuYXJnX3JlcXVpcmVkID0gJ2YnLC52YWx1ZXMgPSBOVUxMfSwKKwkJe05VTEwsfQorCX07CisKKwkqYmxvY2tzID0gMDsKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQkvKiB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9uOiBjcmVhdGUgdGFpbHMsIGpvdXJuYWxpbmcgb24sIG5vCisJCSAgIGNvbnZlcnNpb24gdG8gbmV3ZXN0IGZvcm1hdCAqLworCQlyZXR1cm4gMTsKKworCWZvciAocG9zID0gb3B0aW9uczsgcG9zOykgeworCQljID0gcmVpc2VyZnNfZ2V0b3B0KHMsICZwb3MsIG9wdHMsICZhcmcsIG1vdW50X29wdGlvbnMpOworCQlpZiAoYyA9PSAtMSkKKwkJCS8qIHdyb25nIG9wdGlvbiBpcyBnaXZlbiAqLworCQkJcmV0dXJuIDA7CisKKwkJaWYgKGMgPT0gJ3InKSB7CisJCQljaGFyICpwOworCisJCQlwID0gTlVMTDsKKwkJCS8qICJyZXNpemU9Tk5OIiBvciAicmVzaXplPWF1dG8iICovCisKKwkJCWlmICghc3RyY21wKGFyZywgImF1dG8iKSkgeworCQkJCS8qIEZyb20gSkZTIGNvZGUsIHRvIGF1dG8tZ2V0IHRoZSBzaXplLiAqLworCQkJCSpibG9ja3MgPQorCQkJCSAgICBzLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gcy0+CisJCQkJICAgIHNfYmxvY2tzaXplX2JpdHM7CisJCQl9IGVsc2UgeworCQkJCSpibG9ja3MgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKKwkJCQlpZiAoKnAgIT0gJ1wwJykgeworCQkJCQkvKiBOTk4gZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyICovCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsCisJCQkJCQkJIGFyZyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjID09ICdjJykgeworCQkJY2hhciAqcCA9IE5VTEw7CisJCQl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZywgJnAsIDApOworCQkJLyogY29tbWl0PU5OTiAodGltZSBpbiBzZWNvbmRzKSAqLworCQkJaWYgKCpwICE9ICdcMCcgfHwgdmFsID49ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsCisJCQkJCQkgYXJnKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSpjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpdmFsOworCQl9CisKKwkJaWYgKGMgPT0gJ3cnKSB7CisJCQljaGFyICpwID0gTlVMTDsKKwkJCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKKworCQkJaWYgKCpwICE9ICdcMCcpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vbi1udW1lcmljIHZhbHVlICVzIGZvciBub2xhcmdlaW8gb3B0aW9uIiwKKwkJCQkJCSBhcmcpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHZhbCkKKwkJCQlyZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSBQQUdFX1NJWkU7CisJCQllbHNlCisJCQkJcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKKwkJfQorCisJCWlmIChjID09ICdqJykgeworCQkJaWYgKGFyZyAmJiAqYXJnICYmIGpkZXZfbmFtZSkgeworCQkJCWlmICgqamRldl9uYW1lKSB7CS8vSG0sIGFscmVhZHkgYXNzaWduZWQ/CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWwgZGV2aWNlIHdhcyBhbHJlYWR5ICBzcGVjaWZpZWQgdG8gYmUgJXMiLAorCQkJCQkJCSAqamRldl9uYW1lKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCSpqZGV2X25hbWUgPSBhcmc7CisJCQl9CisJCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJaWYgKGMgPT0gJ3UnIHx8IGMgPT0gJ2cnKSB7CisJCQlpbnQgcXR5cGUgPSBjID09ICd1JyA/IFVTUlFVT1RBIDogR1JQUVVPVEE7CisKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzKSkgeworCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogY2Fubm90IGNoYW5nZSBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoKmFyZykgewkvKiBTb21lIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KKwkJCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdCisJCQkJICAgICYmIHN0cmNtcChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sCisJCQkJCSAgICAgIGFyZykpIHsKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5IHNwZWNpZmllZC4iLAorCQkJCQkJCSBRVFlQRTJOQU1FKHF0eXBlKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAoc3RyY2hyKGFyZywgJy8nKSkgeworCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YWZpbGUgbXVzdCBiZSBvbiBmaWxlc3lzdGVtIHJvb3QuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gPQorCQkJCSAgICBrbWFsbG9jKHN0cmxlbihhcmcpICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm90IGVub3VnaCBtZW1vcnkgZm9yIHN0b3JpbmcgcXVvdGFmaWxlIG5hbWUuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlzdHJjcHkoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdLCBhcmcpOworCQkJCSptb3VudF9vcHRpb25zIHw9IDEgPDwgUkVJU0VSRlNfUVVPVEE7CisJCQl9IGVsc2UgeworCQkJCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJCQkJa2ZyZWUoUkVJU0VSRlNfU0IocyktPgorCQkJCQkgICAgICBzX3FmX25hbWVzW3F0eXBlXSk7CisJCQkJCVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9CisJCQkJCSAgICBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAnZicpIHsKKwkJCWlmICghc3RyY21wKGFyZywgInZmc29sZCIpKQorCQkJCVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19PTEQ7CisJCQllbHNlIGlmICghc3RyY21wKGFyZywgInZmc3YwIikpCisJCQkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX1YwOworCQkJZWxzZSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbHNlCisJCWlmIChjID09ICd1JyB8fCBjID09ICdnJyB8fCBjID09ICdmJykgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyBub3Qgc3VwcG9ydGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCX0KKworI2lmZGVmIENPTkZJR19RVU9UQQorCWlmICghUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdAorCSAgICAmJiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbVVNSUVVPVEFdCisJCXx8IFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgbm90IHNwZWNpZmllZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFRoaXMgY2hlY2tpbmcgaXMgbm90IHByZWNpc2Ugd3J0IHRoZSBxdW90YSB0eXBlIGJ1dCBmb3Igb3VyIHB1cnBvc2VzIGl0IGlzIHN1ZmZpY2llbnQgKi8KKwlpZiAoISgqbW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX1FVT1RBKSkKKwkgICAgJiYgc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGEgb3B0aW9ucyBtdXN0IGJlIHByZXNlbnQgd2hlbiBxdW90YSBpcyB0dXJuZWQgb24uIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDE7Ci0gICAgCi0gICAgZm9yIChwb3MgPSBvcHRpb25zOyBwb3M7ICkgewotCWMgPSByZWlzZXJmc19nZXRvcHQgKHMsICZwb3MsIG9wdHMsICZhcmcsIG1vdW50X29wdGlvbnMpOwotCWlmIChjID09IC0xKQotCSAgICAvKiB3cm9uZyBvcHRpb24gaXMgZ2l2ZW4gKi8KLQkgICAgcmV0dXJuIDA7Ci0JCi0JaWYgKGMgPT0gJ3InKSB7Ci0JICAgIGNoYXIgKiBwOwotCSAgICAKLQkgICAgcCA9IE5VTEw7Ci0JICAgIC8qICJyZXNpemU9Tk5OIiBvciAicmVzaXplPWF1dG8iICovCi0KLQkgICAgaWYgKCFzdHJjbXAoYXJnLCAiYXV0byIpKSB7Ci0JCSAgICAvKiBGcm9tIEpGUyBjb2RlLCB0byBhdXRvLWdldCB0aGUgc2l6ZS4qLwotCQkgICAgKmJsb2NrcyA9IHMtPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiBzLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCSAgICB9IGVsc2UgewotCQkgICAgKmJsb2NrcyA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKLQkJICAgIGlmICgqcCAhPSAnXDAnKSB7Ci0JCQkvKiBOTk4gZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyICovCi0JCQlyZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogYmFkIHZhbHVlICVzIiwgYXJnKTsKLQkJCXJldHVybiAwOwotCQkgICAgfQotCSAgICB9Ci0JfQotCi0JaWYgKCBjID09ICdjJyApIHsKLQkJY2hhciAqcCA9IE5VTEw7Ci0JCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwgKGFyZywgJnAsIDApOwotCQkvKiBjb21taXQ9Tk5OICh0aW1lIGluIHNlY29uZHMpICovCi0JCWlmICggKnAgIT0gJ1wwJyB8fCB2YWwgPj0gKHVuc2lnbmVkIGludCktMSkgewotCQkJcmVpc2VyZnNfd2FybmluZyAocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsIGFyZyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KXZhbDsKLQl9Ci0KLQlpZiAoIGMgPT0gJ3cnICkgewotCQljaGFyICpwPU5VTEw7Ci0JCWludCB2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJnLCAmcCwgMCk7Ci0KLQkJaWYgKCAqcCAhPSAnXDAnKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm9uLW51bWVyaWMgdmFsdWUgJXMgZm9yIG5vbGFyZ2VpbyBvcHRpb24iLCBhcmcpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCB2YWwgKSAKLQkJICAgIHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IFBBR0VfU0laRTsKLQkJZWxzZQotCQkgICAgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKLQl9Ci0KLQlpZiAoYyA9PSAnaicpIHsKLQkgICAgaWYgKGFyZyAmJiAqYXJnICYmIGpkZXZfbmFtZSkgewotCQlpZiAoICpqZGV2X25hbWUgKSB7IC8vSG0sIGFscmVhZHkgYXNzaWduZWQ/Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbCBkZXZpY2Ugd2FzIGFscmVhZHkgIHNwZWNpZmllZCB0byBiZSAlcyIsICpqZGV2X25hbWUpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJKmpkZXZfbmFtZSA9IGFyZzsKLQkgICAgfQotCX0KLQotI2lmZGVmIENPTkZJR19RVU9UQQotCWlmIChjID09ICd1JyB8fCBjID09ICdnJykgewotCSAgICBpbnQgcXR5cGUgPSBjID09ICd1JyA/IFVTUlFVT1RBIDogR1JQUVVPVEE7Ci0KLQkgICAgaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHMpKSB7Ci0JCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCBxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLiIpOwotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICBpZiAoKmFyZykgewkvKiBTb21lIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KLQkgICAgICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gJiYgc3RyY21wKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSwgYXJnKSkgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5IHNwZWNpZmllZC4iLCBRVFlQRTJOQU1FKHF0eXBlKSk7Ci0JCSAgICByZXR1cm4gMDsKLQkJfQotCQlpZiAoc3RyY2hyKGFyZywgJy8nKSkgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGFmaWxlIG11c3QgYmUgb24gZmlsZXN5c3RlbSByb290LiIpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgCVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9IGttYWxsb2Moc3RybGVuKGFyZykrMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBub3QgZW5vdWdoIG1lbW9yeSBmb3Igc3RvcmluZyBxdW90YWZpbGUgbmFtZS4iKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JCXN0cmNweShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sIGFyZyk7Ci0JCSptb3VudF9vcHRpb25zIHw9IDE8PFJFSVNFUkZTX1FVT1RBOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCSAgICBrZnJlZShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pOwotCQkgICAgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JfQotCWlmIChjID09ICdmJykgewotCSAgICBpZiAoIXN0cmNtcChhcmcsICJ2ZnNvbGQiKSkKLQkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX09MRDsKLQkgICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ2ZnN2MCIpKQotCQlSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7Ci0JICAgIGVsc2UgewotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotI2Vsc2UKLQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycgfHwgYyA9PSAnZicpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICAKLSNpZmRlZiBDT05GSUdfUVVPVEEKLSAgICBpZiAoIVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgJiYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7Ci0JcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgbm90IHNwZWNpZmllZC4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogVGhpcyBjaGVja2luZyBpcyBub3QgcHJlY2lzZSB3cnQgdGhlIHF1b3RhIHR5cGUgYnV0IGZvciBvdXIgcHVycG9zZXMgaXQgaXMgc3VmZmljaWVudCAqLwotICAgIGlmICghKCptb3VudF9vcHRpb25zICYgKDE8PFJFSVNFUkZTX1FVT1RBKSkgJiYgc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKLQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YSBvcHRpb25zIG11c3QgYmUgcHJlc2VudCB3aGVuIHF1b3RhIGlzIHR1cm5lZCBvbi4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBzd2l0Y2hfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb2RlKSB7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkgfAotCQkJCSAgICAgICAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBtb2RlKTsKK3N0YXRpYyB2b2lkIHN3aXRjaF9kYXRhX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIG1vZGUpCit7CisJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpIHwKKwkJCQkJICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkgfAorCQkJCQkgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKTsKKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgbW9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9kYXRhX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIG1vdW50X29wdGlvbnMpCiB7Ci0gICAgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX0xPRykpIHsKLSAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfTE9HKTsKLQkgICAgcmVpc2VyZnNfaW5mbyAocywgInN3aXRjaGluZyB0byBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKKwlpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKSkgeworCQlpZiAoIXJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7CisJCQlzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfTE9HKTsKKwkJCXJlaXNlcmZzX2luZm8ocywgInN3aXRjaGluZyB0byBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkpIHsKKwkJaWYgKCFyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkJCXN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKKwkJCXJlaXNlcmZzX2luZm8ocywgInN3aXRjaGluZyB0byBvcmRlcmVkIGRhdGEgbW9kZVxuIik7CisJCX0KKwl9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpIHsKKwkJaWYgKCFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgeworCQkJc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyk7CisJCQlyZWlzZXJmc19pbmZvKHMsICJzd2l0Y2hpbmcgdG8gd3JpdGViYWNrIGRhdGEgbW9kZVxuIik7CisJCX0KIAl9Ci0gICAgfSBlbHNlIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKSkgewotICAgICAgICBpZiAoIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gb3JkZXJlZCBkYXRhIG1vZGVcbiIpOwotCX0KLSAgICB9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpIHsKLSAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKTsKLQkgICAgcmVpc2VyZnNfaW5mbyAocywgInN3aXRjaGluZyB0byB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKLQl9Ci0gICAgfQogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfYmFycmllcl9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBiaXRzKSB7Ci0gICAgaW50IGZsdXNoID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7Ci0gICAgaW50IG5vbmUgPSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX05PTkUpOwotICAgIGludCBhbGxfYmFycmllciA9IGZsdXNoIHwgbm9uZTsKLQotICAgIGlmIChiaXRzICYgYWxsX2JhcnJpZXIpIHsKLSAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH5hbGxfYmFycmllcjsKLQlpZiAoYml0cyAmIGZsdXNoKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBmbHVzaDsKLQkgICAgcHJpbnRrKCJyZWlzZXJmczogZW5hYmxpbmcgd3JpdGUgYmFycmllciBmbHVzaCBtb2RlXG4iKTsKLQl9IGVsc2UgaWYgKGJpdHMgJiBub25lKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBub25lOwotCSAgICBwcmludGsoInJlaXNlcmZzOiB3cml0ZSBiYXJyaWVycyB0dXJuZWQgb2ZmXG4iKTsKLQl9Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9hdHRycyggc3RydWN0IHN1cGVyX2Jsb2NrICpzICkKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYXJyaWVyX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIGJpdHMpCiB7Ci0Jc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisJaW50IGZsdXNoID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7CisJaW50IG5vbmUgPSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX05PTkUpOworCWludCBhbGxfYmFycmllciA9IGZsdXNoIHwgbm9uZTsKIAotCWlmKCByZWlzZXJmc19hdHRycyggcyApICkgewotCQlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotCQlpZiggb2xkX2Zvcm1hdF9vbmx5KHMpICkgewotCQkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnM6IGNhbm5vdCBzdXBwb3J0IGF0dHJpYnV0ZXMgb24gMy41LnggZGlzayBmb3JtYXQiICk7Ci0JCQlSRUlTRVJGU19TQihzKSAtPiBzX21vdW50X29wdCAmPSB+ICggMSA8PCBSRUlTRVJGU19BVFRSUyApOworCWlmIChiaXRzICYgYWxsX2JhcnJpZXIpIHsKKwkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH5hbGxfYmFycmllcjsKKwkJaWYgKGJpdHMgJiBmbHVzaCkgeworCQkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9IGZsdXNoOworCQkJcHJpbnRrKCJyZWlzZXJmczogZW5hYmxpbmcgd3JpdGUgYmFycmllciBmbHVzaCBtb2RlXG4iKTsKKwkJfSBlbHNlIGlmIChiaXRzICYgbm9uZSkgeworCQkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9IG5vbmU7CisJCQlwcmludGsoInJlaXNlcmZzOiB3cml0ZSBiYXJyaWVycyB0dXJuZWQgb2ZmXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2F0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKworCWlmIChyZWlzZXJmc19hdHRycyhzKSkgeworCQlpZiAob2xkX2Zvcm1hdF9vbmx5KHMpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCBzdXBwb3J0IGF0dHJpYnV0ZXMgb24gMy41LnggZGlzayBmb3JtYXQiKTsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQVRUUlMpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmKCAhKCBsZTMyX3RvX2NwdSggcnMgLT4gc19mbGFncyApICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCApICkgewotCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzOiBjYW5ub3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIHVudGlsIGZsYWcgaXMgc2V0IGluIHN1cGVyLWJsb2NrIiApOwotCQkJCVJFSVNFUkZTX1NCKHMpIC0+IHNfbW91bnRfb3B0ICY9IH4gKCAxIDw8IFJFSVNFUkZTX0FUVFJTICk7CisJCWlmICghKGxlMzJfdG9fY3B1KHJzLT5zX2ZsYWdzKSAmIHJlaXNlcmZzX2F0dHJzX2NsZWFyZWQpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCBzdXBwb3J0IGF0dHJpYnV0ZXMgdW50aWwgZmxhZyBpcyBzZXQgaW4gc3VwZXItYmxvY2siKTsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQVRUUlMpOwogCQl9CisJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShycy0+c19mbGFncykgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkKSB7CisJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBSRUlTRVJGU19BVFRSUzsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50ICogbW91bnRfZmxhZ3MsIGNoYXIgKiBhcmcpCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgKm1vdW50X2ZsYWdzLCBjaGFyICphcmcpCiB7Ci0gIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgdW5zaWduZWQgbG9uZyBibG9ja3M7Ci0gIHVuc2lnbmVkIGxvbmcgbW91bnRfb3B0aW9ucyA9IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdDsKLSAgdW5zaWduZWQgbG9uZyBzYWZlX21hc2sgPSAwOwotICB1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KS0xOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7Ci0gIGludCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgbW91bnRfb3B0aW9ucyA9IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdDsKKwl1bnNpZ25lZCBsb25nIHNhZmVfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlID0gKHVuc2lnbmVkIGludCktMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJaW50IGVycjsKICNpZmRlZiBDT05GSUdfUVVPVEEKLSAgaW50IGk7CisJaW50IGk7CiAjZW5kaWYKIAotICBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworCXJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKIAotICBpZiAoIXJlaXNlcmZzX3BhcnNlX29wdGlvbnMocywgYXJnLCAmbW91bnRfb3B0aW9ucywgJmJsb2NrcywgTlVMTCwgJmNvbW1pdF9tYXhfYWdlKSkgeworCWlmICghcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucworCSAgICAocywgYXJnLCAmbW91bnRfb3B0aW9ucywgJmJsb2NrcywgTlVMTCwgJmNvbW1pdF9tYXhfYWdlKSkgewogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKLQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pIHsKLQkgICAga2ZyZWUoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pOwotCSAgICBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgeworCQkJCWtmcmVlKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKTsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSA9IE5VTEw7CisJCQl9CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotI2VuZGlmCi0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgCi0gIGhhbmRsZV9hdHRycyhzKTsKIAotICAvKiBBZGQgb3B0aW9ucyB0aGF0IGFyZSBzYWZlIGhlcmUgKi8KLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfU01BTExUQUlMOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19MQVJHRVRBSUw7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUjsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTk9fVU5IQVNIRURfUkVMT0NBVElPTjsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT047Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1RFU1Q0OwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19BVFRSUzsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfWEFUVFJTX1VTRVI7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19CQVJSSUVSX05PTkU7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRTsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUM7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOworCWhhbmRsZV9hdHRycyhzKTsKIAotICAvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKLSAgICogdGhlIGJpdHMgd2UncmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhlcmUgKi8KLSAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ID0gKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgIChtb3VudF9vcHRpb25zICYgc2FmZV9tYXNrKTsKKwkvKiBBZGQgb3B0aW9ucyB0aGF0IGFyZSBzYWZlIGhlcmUgKi8KKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19TTUFMTFRBSUw7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUjsKKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1RFU1Q0OworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0FUVFJTOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0g7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOwogCi0gIGlmKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgewotICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQotICBlbHNlIGlmKGNvbW1pdF9tYXhfYWdlID09IDApCi0gIHsKLSAgICAvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCi0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGpvdXJuYWwtPmpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7Ci0gIH0KKwkvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKKwkgKiB0aGUgYml0cyB3ZSdyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgaGVyZSAqLworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCA9CisJICAgIChSRUlTRVJGU19TQihzKS0+CisJICAgICBzX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgKG1vdW50X29wdGlvbnMgJiBzYWZlX21hc2spOwogCi0gIGlmKGJsb2NrcykgewotICAgIGludCByYyA9IHJlaXNlcmZzX3Jlc2l6ZShzLCBibG9ja3MpOwotICAgIGlmIChyYyAhPSAwKQotICAgICAgcmV0dXJuIHJjOwotICB9CisJaWYgKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgeworCQlqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IGNvbW1pdF9tYXhfYWdlOworCX0gZWxzZSBpZiAoY29tbWl0X21heF9hZ2UgPT0gMCkgeworCQkvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IEpPVVJOQUxfTUFYX1RSQU5TX0FHRTsKKwl9CiAKLSAgaWYgKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkgewotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gICAgLyogcmVtb3VudCByZWFkLW9ubHkgKi8KLSAgICBpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkKLSAgICAgIC8qIGl0IGlzIHJlYWQtb25seSBhbHJlYWR5ICovCi0gICAgICByZXR1cm4gMDsKLSAgICAvKiB0cnkgdG8gcmVtb3VudCBmaWxlIHN5c3RlbSB3aXRoIHJlYWQtb25seSBwZXJtaXNzaW9ucyAqLwotICAgIGlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTIHx8IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICE9IFJFSVNFUkZTX1ZBTElEX0ZTKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisJaWYgKGJsb2NrcykgeworCQlpbnQgcmMgPSByZWlzZXJmc19yZXNpemUocywgYmxvY2tzKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gcmM7CisJfQogCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKwlpZiAoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwkJLyogcmVtb3VudCByZWFkLW9ubHkgKi8KKwkJaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCQkvKiBpdCBpcyByZWFkLW9ubHkgYWxyZWFkeSAqLworCQkJcmV0dXJuIDA7CisJCS8qIHRyeSB0byByZW1vdW50IGZpbGUgc3lzdGVtIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zICovCisJCWlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTCisJCSAgICB8fCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSAhPSBSRUlTRVJGU19WQUxJRF9GUykgeworCQkJcmV0dXJuIDA7CisJCX0KIAotICAgIC8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7Ci0gICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggcnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKLSAgfSBlbHNlIHsKLSAgICAvKiByZW1vdW50IHJlYWQtd3JpdGUgKi8KLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCXJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0JcmV0dXJuIDA7IC8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KLSAgICB9CisJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0gICAgaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0JcmV0dXJuIGpvdXJuYWwtPmpfZXJybm87CisJCS8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CisJCXNldF9zYl91bW91bnRfc3RhdGUocnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCX0gZWxzZSB7CisJCS8qIHJlbW91bnQgcmVhZC13cml0ZSAqLworCQlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcmVpc2VyZnNfeGF0dHJfaW5pdChzLCAqbW91bnRfZmxhZ3MpOworCQkJcmV0dXJuIDA7CS8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KKwkJfQogCi0gICAgaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKLSAgICBoYW5kbGVfYmFycmllcl9tb2RlKHMsIG1vdW50X29wdGlvbnMpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlID0gc2JfdW1vdW50X3N0YXRlKHJzKSA7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZIDsgLyogbm93IGl0IGlzIHNhZmUgdG8gY2FsbCBqb3VybmFsX2JlZ2luICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLQlyZXR1cm4gZXJyOwotICAgIAotICAgIC8qIE1vdW50IGEgcGFydGl0aW9uIHdoaWNoIGlzIHJlYWQtb25seSwgcmVhZC13cml0ZSAqLwotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwotICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotICAgIC8qIG1hcmtfYnVmZmVyX2RpcnR5IChTQl9CVUZGRVJfV0lUSF9TQiAocyksIDEpOyAqLwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBSRUlTRVJGU19WQUxJRF9GUyA7Ci0gIH0KLSAgLyogdGhpcyB3aWxsIGZvcmNlIGEgZnVsbCBmbHVzaCBvZiBhbGwgam91cm5hbCBsaXN0cyAqLwotICBTQl9KT1VSTkFMKHMpLT5qX211c3Rfd2FpdCA9IDEgOwotICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKSA7Ci0gIGlmIChlcnIpCi0gICAgcmV0dXJuIGVycjsKLSAgcy0+c19kaXJ0ID0gMDsKKwkJaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJCXJldHVybiBqb3VybmFsLT5qX2Vycm5vOwogCi0gIGlmICghKCAqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkgKSApIHsKLSAgICBmaW5pc2hfdW5maW5pc2hlZCggcyApOwotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gIH0KKwkJaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJaGFuZGxlX2JhcnJpZXJfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBzYl91bW91bnRfc3RhdGUocnMpOworCQlzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CS8qIG5vdyBpdCBpcyBzYWZlIHRvIGNhbGwgam91cm5hbF9iZWdpbiAqLworCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotICByZXR1cm4gMDsKKwkJLyogTW91bnQgYSBwYXJ0aXRpb24gd2hpY2ggaXMgcmVhZC1vbmx5LCByZWFkLXdyaXRlICovCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7CisJCXMtPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJc2V0X3NiX3Vtb3VudF9zdGF0ZShycywgUkVJU0VSRlNfRVJST1JfRlMpOworCQkvKiBtYXJrX2J1ZmZlcl9kaXJ0eSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpLCAxKTsgKi8KKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOworCX0KKwkvKiB0aGlzIHdpbGwgZm9yY2UgYSBmdWxsIGZsdXNoIG9mIGFsbCBqb3VybmFsIGxpc3RzICovCisJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMTApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcy0+c19kaXJ0ID0gMDsKKworCWlmICghKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJZmluaXNoX3VuZmluaXNoZWQocyk7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyogbG9hZF9iaXRtYXBfaW5mb19kYXRhIC0gU2V0cyB1cCB0aGUgcmVpc2VyZnNfYml0bWFwX2luZm8gc3RydWN0dXJlIGZyb20gZGlzay4KQEAgLTEyMTMsNzYxICsxMjg1LDgyOSBAQAogICogZnJlZSBibG9ja3MgYXQgYWxsLgogICovCiAKLXN0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKK3N0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKIHsKLSAgICB1bnNpZ25lZCBsb25nICpjdXIgPSAodW5zaWduZWQgbG9uZyAqKWJpLT5iaC0+Yl9kYXRhOworCXVuc2lnbmVkIGxvbmcgKmN1ciA9ICh1bnNpZ25lZCBsb25nICopYmktPmJoLT5iX2RhdGE7CiAKLSAgICB3aGlsZSAoKGNoYXIgKiljdXIgPCAoYmktPmJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7CisJd2hpbGUgKChjaGFyICopY3VyIDwgKGJpLT5iaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKSkgewogCi0JLyogTm8gbmVlZCB0byBzY2FuIGlmIGFsbCAwJ3Mgb3IgYWxsIDEncy4KLQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLwotCWlmICgqY3VyID09IDApIHsKLQkgICAgaWYgKGJpLT5maXJzdF96ZXJvX2hpbnQgPT0gMCkgewotCQliaS0+Zmlyc3RfemVyb19oaW50ID0gKChjaGFyICopY3VyIC0gYmktPmJoLT5iX2RhdGEpIDw8IDM7Ci0JICAgIH0KLQkgICAgYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjg7Ci0JfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgewotCSAgICBpbnQgYjsKLQkgICAgZm9yIChiID0gMDsgYiA8IHNpemVvZih1bnNpZ25lZCBsb25nKSo4OyBiKyspIHsKLQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdCAoYiwgY3VyKSkgewotCQkgICAgYmktPmZyZWVfY291bnQgKys7Ci0JCSAgICBpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKQotCQkJYmktPmZpcnN0X3plcm9faGludCA9Ci0JCQkJCSgoKGNoYXIgKiljdXIgLSBiaS0+YmgtPmJfZGF0YSkgPDwgMykgKyBiOwotCQkgICAgfQorCQkvKiBObyBuZWVkIHRvIHNjYW4gaWYgYWxsIDAncyBvciBhbGwgMSdzLgorCQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLworCQlpZiAoKmN1ciA9PSAwKSB7CisJCQlpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKSB7CisJCQkJYmktPmZpcnN0X3plcm9faGludCA9CisJCQkJICAgICgoY2hhciAqKWN1ciAtIGJpLT5iaC0+Yl9kYXRhKSA8PCAzOworCQkJfQorCQkJYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsKKwkJfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgeworCQkJaW50IGI7CisJCQlmb3IgKGIgPSAwOyBiIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsgYisrKSB7CisJCQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdChiLCBjdXIpKSB7CisJCQkJCWJpLT5mcmVlX2NvdW50Kys7CisJCQkJCWlmIChiaS0+Zmlyc3RfemVyb19oaW50ID09IDApCisJCQkJCQliaS0+Zmlyc3RfemVyb19oaW50ID0KKwkJCQkJCSAgICAoKChjaGFyICopY3VyIC0KKwkJCQkJCSAgICAgIGJpLT5iaC0+Yl9kYXRhKSA8PCAzKSArIGI7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KLQljdXIgKys7Ci0gICAgfQorCQljdXIrKzsKKwl9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIC8vIFRoaXMgb3V0cHV0cyBhIGxvdCBvZiB1bm5lZGVkIGluZm8gb24gYmlnIEZTZXMKIC8vICAgIHJlaXNlcmZzX3dhcm5pbmcgKCJiaXRtYXAgbG9hZGVkIGZyb20gYmxvY2sgJWQ6ICVkIGZyZWUgYmxvY2tzIiwKLS8vCQkgICAgICBiaS0+YmgtPmJfYmxvY2tuciwgYmktPmZyZWVfY291bnQpOworLy8gICAgICAgICAgICAgICAgICAgIGJpLT5iaC0+Yl9ibG9ja25yLCBiaS0+ZnJlZV9jb3VudCk7CiAjZW5kaWYKIH0KLSAgCi1zdGF0aWMgaW50IHJlYWRfYml0bWFwcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKLXsKLSAgICBpbnQgaSwgYm1hcF9ucjsKIAotICAgIFNCX0FQX0JJVE1BUCAocykgPSB2bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKLSAgICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotCXJldHVybiAxOwotICAgIG1lbXNldCAoU0JfQVBfQklUTUFQIChzKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7Ci0gICAgZm9yIChpID0gMCwgYm1hcF9uciA9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOwotCSBpIDwgU0JfQk1BUF9OUihzKTsgaSsrLCBibWFwX25yID0gcy0+c19ibG9ja3NpemUgKiA4ICogaSkgewotCVNCX0FQX0JJVE1BUCAocylbaV0uYmggPSBzYl9nZXRibGsocywgYm1hcF9ucik7Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkKLQkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKLQl3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywic2gtMjAyOTogcmVpc2VyZnMgcmVhZF9iaXRtYXBzOiAiCi0JCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAotCQkJIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKLQkJYnJlbHNlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0JICAgIHZmcmVlKFNCX0FQX0JJVE1BUChzKSk7Ci0JICAgIFNCX0FQX0JJVE1BUChzKSA9IE5VTEw7Ci0JICAgIHJldHVybiAxOworc3RhdGljIGludCByZWFkX2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCWludCBpLCBibWFwX25yOworCisJU0JfQVBfQklUTUFQKHMpID0KKwkgICAgdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCWlmIChTQl9BUF9CSVRNQVAocykgPT0gMCkKKwkJcmV0dXJuIDE7CisJbWVtc2V0KFNCX0FQX0JJVE1BUChzKSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKKwlmb3IgKGkgPSAwLCBibWFwX25yID0KKwkgICAgIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOworCSAgICAgaSA8IFNCX0JNQVBfTlIocyk7IGkrKywgYm1hcF9uciA9IHMtPnNfYmxvY2tzaXplICogOCAqIGkpIHsKKwkJU0JfQVBfQklUTUFQKHMpW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGJtYXBfbnIpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKQorCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CiAJfQotCWxvYWRfYml0bWFwX2luZm9fZGF0YSAocywgU0JfQVBfQklUTUFQIChzKSArIGkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUihzKTsgaSsrKSB7CisJCXdhaXRfb25fYnVmZmVyKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMjk6IHJlaXNlcmZzIHJlYWRfYml0bWFwczogIgorCQkJCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAorCQkJCQkgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpOworCQkJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJCQlicmVsc2UoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJCXZmcmVlKFNCX0FQX0JJVE1BUChzKSk7CisJCQlTQl9BUF9CSVRNQVAocykgPSBOVUxMOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbG9hZF9iaXRtYXBfaW5mb19kYXRhKHMsIFNCX0FQX0JJVE1BUChzKSArIGkpOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgaW50IGkgOwotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7Ci0gIGludCBibXAxID0gKFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHMtPnNfYmxvY2tzaXplKSArIDE7ICAvKiBmaXJzdCBvZiBiaXRtYXAgYmxvY2tzICovCisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJaW50IGJtcDEgPSAoUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUpICsgMTsJLyogZmlyc3Qgb2YgYml0bWFwIGJsb2NrcyAqLwogCi0gIC8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KLSAgU0JfQVBfQklUTUFQIChzKSA9IHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOwotICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotICAgIHJldHVybiAxOworCS8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KKwlTQl9BUF9CSVRNQVAocykgPQorCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CisJaWYgKFNCX0FQX0JJVE1BUChzKSA9PSAwKQorCQlyZXR1cm4gMTsKIAotICBtZW1zZXQgKFNCX0FQX0JJVE1BUCAocyksIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOworCW1lbXNldChTQl9BUF9CSVRNQVAocyksIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CiAKLSAgZm9yIChpID0gMDsgaSA8IHNiX2JtYXBfbnIocnMpOyBpICsrKSB7Ci0gICAgU0JfQVBfQklUTUFQIChzKVtpXS5iaCA9IHNiX2JyZWFkIChzLCBibXAxICsgaSk7Ci0gICAgaWYgKCFTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKQotICAgICAgcmV0dXJuIDE7Ci0gICAgbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzLCBTQl9BUF9CSVRNQVAgKHMpICsgaSk7Ci0gIH0KKwlmb3IgKGkgPSAwOyBpIDwgc2JfYm1hcF9ucihycyk7IGkrKykgeworCQlTQl9BUF9CSVRNQVAocylbaV0uYmggPSBzYl9icmVhZChzLCBibXAxICsgaSk7CisJCWlmICghU0JfQVBfQklUTUFQKHMpW2ldLmJoKQorCQkJcmV0dXJuIDE7CisJCWxvYWRfYml0bWFwX2luZm9fZGF0YShzLCBTQl9BUF9CSVRNQVAocykgKyBpKTsKKwl9CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBvZmZzZXQpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgaW50IGZzX2Jsb2Nrc2l6ZTsKLSAKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJaW50IGZzX2Jsb2Nrc2l6ZTsKIAotICAgIGJoID0gc2JfYnJlYWQgKHMsIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplKTsKLSAgICBpZiAoIWJoKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAwNjogcmVhZF9zdXBlcl9ibG9jazogIgotICAgICAgICAgICAgICAiYnJlYWQgZmFpbGVkIChkZXYgJXMsIGJsb2NrICVsdSwgc2l6ZSAlbHUpIiwKLSAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwgcy0+c19ibG9ja3NpemUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKCFpc19hbnlfcmVpc2VyZnNfbWFnaWNfc3RyaW5nIChycykpIHsKLSAgICAgIGJyZWxzZSAoYmgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIC8vCi0gICAgLy8gb2ssIHJlaXNlcmZzIHNpZ25hdHVyZSAob2xkIG9yIG5ldykgZm91bmQgaW4gYXQgdGhlIGdpdmVuIG9mZnNldAotICAgIC8vICAgIAotICAgIGZzX2Jsb2Nrc2l6ZSA9IHNiX2Jsb2Nrc2l6ZShycyk7Ci0gICAgYnJlbHNlIChiaCk7Ci0gICAgc2Jfc2V0X2Jsb2Nrc2l6ZSAocywgZnNfYmxvY2tzaXplKTsKLSAgICAKLSAgICBiaCA9IHNiX2JyZWFkIChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7Ci0gICAgaWYgKCFiaCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCi0gICAgICAgICAgICAgICAgImJyZWFkIGZhaWxlZCAoZGV2ICVzLCBibG9jayAlbHUsIHNpemUgJWx1KVxuIiwKLSAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAocyksIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKHNiX2Jsb2Nrc2l6ZShycykgIT0gcy0+c19ibG9ja3NpemUpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAxMTogcmVhZF9zdXBlcl9ibG9jazogIgotCQkiY2FuJ3QgZmluZCBhIHJlaXNlcmZzIGZpbGVzeXN0ZW0gb24gKGRldiAlcywgYmxvY2sgJUx1LCBzaXplICVsdSlcbiIsCi0JCXJlaXNlcmZzX2JkZXZuYW1lIChzKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JYnJlbHNlIChiaCk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCBycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpICkgewotICAgICAgIGJyZWxzZShiaCkgOwotICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJVbmZpbmlzaGVkIHJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgcnVuIGRldGVjdGVkLiBQbGVhc2UgcnVuXG4iCi0gICAgICAgICAgICAgICJyZWlzZXJmc2NrIC0tcmVidWlsZC10cmVlIGFuZCB3YWl0IGZvciBhIGNvbXBsZXRpb24uIElmIHRoYXQgZmFpbHNcbiIKLSAgICAgICAgICAgICAgImdldCBuZXdlciByZWlzZXJmc3Byb2dzIHBhY2thZ2UiKTsKLSAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBTQl9CVUZGRVJfV0lUSF9TQiAocykgPSBiaDsKLSAgICBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKSA9IHJzOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX2pyIChycykpIHsKLQkvKiBtYWdpYyBpcyBvZiBub24tc3RhbmRhcmQgam91cm5hbCBmaWxlc3lzdGVtLCBsb29rIGF0IHNfdmVyc2lvbiB0bwotCSAgIGZpbmQgd2hpY2ggZm9ybWF0IGlzIGluIHVzZSAqLwotCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCi0JICByZWlzZXJmc193YXJuaW5nIChzLCAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCi0JCSAgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7Ci0JZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgotCQkgICIgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCIpOwotCWVsc2UgewotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgotCQkJICAgICJmb3JtYXQgXCIldVwiIG9mIHJlaXNlcmZzIHdpdGggbm9uLXN0YW5kYXJkIG1hZ2ljIiwKLQkJCSAgICBzYl92ZXJzaW9uKHJzKSk7Ci0JcmV0dXJuIDE7CisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA2OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSkiLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwgb2Zmc2V0IC8gcy0+c19ibG9ja3NpemUsCisJCQkJIHMtPnNfYmxvY2tzaXplKTsKKwkJcmV0dXJuIDE7CiAJfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAvKiBzX3ZlcnNpb24gb2Ygc3RhbmRhcmQgZm9ybWF0IG1heSBjb250YWluIGluY29ycmVjdCBpbmZvcm1hdGlvbiwKLQkgc28gd2UganVzdCBsb29rIGF0IHRoZSBtYWdpYyBzdHJpbmcgKi8KLSAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKLQkgICAgICBpc19yZWlzZXJmc18zXzUgKHJzKSA/ICIzLjUiIDogIjMuNiIpOwogCi0gICAgcy0+c19vcCA9ICZyZWlzZXJmc19zb3BzOwotICAgIHMtPnNfZXhwb3J0X29wID0gJnJlaXNlcmZzX2V4cG9ydF9vcHM7CisJcnMgPSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwlpZiAoIWlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcocnMpKSB7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKwkvLworCS8vIG9rLCByZWlzZXJmcyBzaWduYXR1cmUgKG9sZCBvciBuZXcpIGZvdW5kIGluIGF0IHRoZSBnaXZlbiBvZmZzZXQKKwkvLyAgICAKKwlmc19ibG9ja3NpemUgPSBzYl9ibG9ja3NpemUocnMpOworCWJyZWxzZShiaCk7CisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBmc19ibG9ja3NpemUpOworCisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSlcbiIsCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgcy0+c19ibG9ja3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmIChzYl9ibG9ja3NpemUocnMpICE9IHMtPnNfYmxvY2tzaXplKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMTE6IHJlYWRfc3VwZXJfYmxvY2s6ICIKKwkJCQkgImNhbid0IGZpbmQgYSByZWlzZXJmcyBmaWxlc3lzdGVtIG9uIChkZXYgJXMsIGJsb2NrICVMdSwgc2l6ZSAlbHUpXG4iLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJCSBzLT5zX2Jsb2Nrc2l6ZSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpKSB7CisJCWJyZWxzZShiaCk7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgIlVuZmluaXNoZWQgcmVpc2VyZnNjayAtLXJlYnVpbGQtdHJlZSBydW4gZGV0ZWN0ZWQuIFBsZWFzZSBydW5cbiIKKwkJCQkgInJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgYW5kIHdhaXQgZm9yIGEgY29tcGxldGlvbi4gSWYgdGhhdCBmYWlsc1xuIgorCQkJCSAiZ2V0IG5ld2VyIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlTQl9CVUZGRVJfV0lUSF9TQihzKSA9IGJoOworCVNCX0RJU0tfU1VQRVJfQkxPQ0socykgPSByczsKKworCWlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJLyogbWFnaWMgaXMgb2Ygbm9uLXN0YW5kYXJkIGpvdXJuYWwgZmlsZXN5c3RlbSwgbG9vayBhdCBzX3ZlcnNpb24gdG8KKwkJICAgZmluZCB3aGljaCBmb3JtYXQgaXMgaW4gdXNlICovCisJCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCisJCQkJCSAiIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwiKTsKKwkJZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQorCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgorCQkJCQkgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7CisJCWVsc2UgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgorCQkJCQkgImZvcm1hdCBcIiV1XCIgb2YgcmVpc2VyZnMgd2l0aCBub24tc3RhbmRhcmQgbWFnaWMiLAorCQkJCQkgc2JfdmVyc2lvbihycykpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKwkJLyogc192ZXJzaW9uIG9mIHN0YW5kYXJkIGZvcm1hdCBtYXkgY29udGFpbiBpbmNvcnJlY3QgaW5mb3JtYXRpb24sCisJCSAgIHNvIHdlIGp1c3QgbG9vayBhdCB0aGUgbWFnaWMgc3RyaW5nICovCisJCXJlaXNlcmZzX2luZm8ocywKKwkJCSAgICAgICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKKwkJCSAgICAgIGlzX3JlaXNlcmZzXzNfNShycykgPyAiMy41IiA6ICIzLjYiKTsKKworCXMtPnNfb3AgPSAmcmVpc2VyZnNfc29wczsKKwlzLT5zX2V4cG9ydF9vcCA9ICZyZWlzZXJmc19leHBvcnRfb3BzOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIHMtPnNfcWNvcCA9ICZyZWlzZXJmc19xY3RsX29wZXJhdGlvbnM7Ci0gICAgcy0+ZHFfb3AgPSAmcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9uczsKKwlzLT5zX3Fjb3AgPSAmcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zOworCXMtPmRxX29wID0gJnJlaXNlcmZzX3F1b3RhX29wZXJhdGlvbnM7CiAjZW5kaWYKIAotICAgIC8qIG5ldyBmb3JtYXQgaXMgbGltaXRlZCBieSB0aGUgMzIgYml0IHdpZGUgaV9ibG9ja3MgZmllbGQsIHdhbnQgdG8KLSAgICAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgotICAgICovCi0gICAgcy0+c19tYXhieXRlcyA9ICg1MTJMTCA8PCAzMikgLSBzLT5zX2Jsb2Nrc2l6ZSA7Ci0gICAgcmV0dXJuIDA7CisJLyogbmV3IGZvcm1hdCBpcyBsaW1pdGVkIGJ5IHRoZSAzMiBiaXQgd2lkZSBpX2Jsb2NrcyBmaWVsZCwgd2FudCB0bworCSAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgorCSAqLworCXMtPnNfbWF4Ynl0ZXMgPSAoNTEyTEwgPDwgMzIpIC0gcy0+c19ibG9ja3NpemU7CisJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiBhZnRlciBqb3VybmFsIHJlcGxheSwgcmVyZWFkIGFsbCBiaXRtYXAgYW5kIHN1cGVyIGJsb2NrcyAqLwotc3RhdGljIGludCByZXJlYWRfbWV0YV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gIGludCBpIDsKLSAgbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpIDsKLSAgd2FpdF9vbl9idWZmZXIoU0JfQlVGRkVSX1dJVEhfU0IocykpIDsKLSAgaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQlVGRkVSX1dJVEhfU0IocykpKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyB0aGUgc3VwZXIiKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9CitzdGF0aWMgaW50IHJlcmVhZF9tZXRhX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJaW50IGk7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpOworCXdhaXRfb25fYnVmZmVyKFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9CVUZGRVJfV0lUSF9TQihzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIHRoZSBzdXBlciIpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocykgOyBpKyspIHsKLSAgICBsbF9yd19ibG9jayhSRUFELCAxLCAmKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIDsKLSAgICB3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAocylbaV0uYmgpIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIGJpdG1hcCBibG9jayBudW1iZXIgJWQgYXQgJWxsdSIsCi0gICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpIDsKLSAgICAgIHJldHVybiAxIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAgOworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9BUF9CSVRNQVAocylbaV0uYmgpKTsKKwkJd2FpdF9vbl9idWZmZXIoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyBiaXRtYXAgYmxvY2sgbnVtYmVyICVkIGF0ICVsbHUiLAorCQkJCQkgaSwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLgorCQkJCQkgYmgtPmJfYmxvY2tucik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIAogfQogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBoYXNoIGRldGVjdGlvbiBzdHVmZgogCi0KIC8vIGlmIHJvb3QgZGlyZWN0b3J5IGlzIGVtcHR5IC0gd2Ugc2V0IGRlZmF1bHQgLSBZdXJhJ3MgLSBoYXNoIGFuZAogLy8gd2FybiBhYm91dCBpdAogLy8gRklYTUU6IHdlIGxvb2sgZm9yIG9ubHkgb25lIG5hbWUgaW4gYSBkaXJlY3RvcnkuIElmIHRlYSBhbmQgeXVyYQogLy8gYml0aCBoYXZlIHRoZSBzYW1lIHZhbHVlIC0gd2UgYXNrIHVzZXIgdG8gc2VuZCByZXBvcnQgdG8gdGhlCiAvLyBtYWlsaW5nIGxpc3QKLXN0YXRpYyBfX3UzMiBmaW5kX2hhc2hfb3V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIF9fdTMyIGZpbmRfaGFzaF9vdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLSAgICBfX3UzMiBoYXNoID0gREVGQVVMVF9IQVNIOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJX191MzIgaGFzaCA9IERFRkFVTFRfSEFTSDsKIAotICAgIGlub2RlID0gcy0+c19yb290LT5kX2lub2RlOworCWlub2RlID0gcy0+c19yb290LT5kX2lub2RlOwogCi0gICAgZG8geyAvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQotCXUzMiB0ZWFoYXNoLCByNWhhc2gsIHl1cmFoYXNoOworCWRvIHsJCQkvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQorCQl1MzIgdGVhaGFzaCwgcjVoYXNoLCB5dXJhaGFzaDsKIAotCW1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKLQlyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChzLCAma2V5LCAmcGF0aCwgJmRlKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotCSAgICByZXR1cm4gVU5TRVRfSEFTSCA7Ci0JfQotCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bSAtLTsKLQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoJmRlKTsKLQlpZiAoZGVoX29mZnNldCggJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkgKSA9PSBET1RfRE9UX09GRlNFVCkgewotCSAgICAvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KLQkgICAgaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSkgewotCQloYXNoID0gWVVSQV9IQVNIIDsKLQkgICAgfQotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIkZTIHNlZW1zIHRvIGJlIGVtcHR5LCBhdXRvZGV0ZWN0ICIKLQkgICAgICAgICAgICAgICAgICAgICAiaXMgdXNpbmcgdGhlIGRlZmF1bHQgaGFzaCIpOwotCSAgICBicmVhazsKLQl9Ci0JcjVoYXNoPUdFVF9IQVNIX1ZBTFVFIChyNV9oYXNoIChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7Ci0JdGVhaGFzaD1HRVRfSEFTSF9WQUxVRSAoa2V5ZWRfaGFzaCAoZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOwotCXl1cmFoYXNoPUdFVF9IQVNIX1ZBTFVFICh5dXJhX2hhc2ggKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKLQlpZiAoICggKHRlYWhhc2ggPT0gcjVoYXNoKSAmJiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpICkgfHwKLQkgICAgICggKHRlYWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApIHx8Ci0JICAgICAoIChyNWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApICkgewotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIlVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBoYXNoIGZ1bmN0aW9uLiAiCi0JCQkgICAgICJQbGVhc2UgbW91bnQgd2l0aCAtbyBoYXNoPXt0ZWEscnVwYXNvdixyNX0iLAotCQkJICAgICByZWlzZXJmc19iZGV2bmFtZSAocykpOwotCSAgICBoYXNoID0gVU5TRVRfSEFTSDsKLQkgICAgYnJlYWs7Ci0JfQotCWlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB5dXJhaGFzaCkKLQkgICAgaGFzaCA9IFlVUkFfSEFTSDsKLQllbHNlIGlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB0ZWFoYXNoKQotCSAgICBoYXNoID0gVEVBX0hBU0g7Ci0JZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0gcjVoYXNoKQotCSAgICBoYXNoID0gUjVfSEFTSDsKLQllbHNlIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywiVW5yZWNvZ25pc2VkIGhhc2ggZnVuY3Rpb24iKTsKLQkgICAgaGFzaCA9IFVOU0VUX0hBU0g7Ci0JfQotICAgIH0gd2hpbGUgKDApOworCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJcmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleShzLCAma2V5LCAmcGF0aCwgJmRlKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiBVTlNFVF9IQVNIOworCQl9CisJCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCisJCQlkZS5kZV9lbnRyeV9udW0tLTsKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKKwkJaWYgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpID09IERPVF9ET1RfT0ZGU0VUKSB7CisJCQkvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KKwkJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCQloYXNoID0gWVVSQV9IQVNIOworCQkJfQorCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRlMgc2VlbXMgdG8gYmUgZW1wdHksIGF1dG9kZXRlY3QgIgorCQkJCQkgImlzIHVzaW5nIHRoZSBkZWZhdWx0IGhhc2giKTsKKwkJCWJyZWFrOworCQl9CisJCXI1aGFzaCA9IEdFVF9IQVNIX1ZBTFVFKHI1X2hhc2goZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOworCQl0ZWFoYXNoID0gR0VUX0hBU0hfVkFMVUUoa2V5ZWRfaGFzaChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7CisJCXl1cmFoYXNoID0gR0VUX0hBU0hfVkFMVUUoeXVyYV9oYXNoKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKKwkJaWYgKCgodGVhaGFzaCA9PSByNWhhc2gpCisJCSAgICAgJiYKKwkJICAgICAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpCisJCSAgICAgID09IHI1aGFzaCkpIHx8ICgodGVhaGFzaCA9PSB5dXJhaGFzaCkKKwkJCQkgICAgICAmJiAoeXVyYWhhc2ggPT0KKwkJCQkJICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCQkJICgmCisJCQkJCQkJICAoZGUuCisJCQkJCQkJICAgZGVfZGVoW2RlLgorCQkJCQkJCQkgIGRlX2VudHJ5X251bV0pKSkpKQorCQkgICAgfHwgKChyNWhhc2ggPT0geXVyYWhhc2gpCisJCQkmJiAoeXVyYWhhc2ggPT0KKwkJCSAgICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCSAgICgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgaGFzaCBmdW5jdGlvbi4gIgorCQkJCQkgIlBsZWFzZSBtb3VudCB3aXRoIC1vIGhhc2g9e3RlYSxydXBhc292LHI1fSIsCisJCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCQloYXNoID0gVU5TRVRfSEFTSDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0KCYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pKSkgPT0KKwkJICAgIHl1cmFoYXNoKQorCQkJaGFzaCA9IFlVUkFfSEFTSDsKKwkJZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUKKwkJCSAoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpID09IHRlYWhhc2gpCisJCQloYXNoID0gVEVBX0hBU0g7CisJCWVsc2UgaWYgKEdFVF9IQVNIX1ZBTFVFCisJCQkgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpCisJCQloYXNoID0gUjVfSEFTSDsKKwkJZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJVbnJlY29nbmlzZWQgaGFzaCBmdW5jdGlvbiIpOworCQkJaGFzaCA9IFVOU0VUX0hBU0g7CisJCX0KKwl9IHdoaWxlICgwKTsKIAotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIHJldHVybiBoYXNoOworCXBhdGhyZWxzZSgmcGF0aCk7CisJcmV0dXJuIGhhc2g7CiB9CiAKIC8vIGZpbmRzIG91dCB3aGljaCBoYXNoIG5hbWVzIGFyZSBzb3J0ZWQgd2l0aAotc3RhdGljIGludCB3aGF0X2hhc2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgaW50IHdoYXRfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgX191MzIgY29kZTsKKwlfX3UzMiBjb2RlOwogCi0gICAgY29kZSA9IHNiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpKTsKKwljb2RlID0gc2JfaGFzaF9mdW5jdGlvbl9jb2RlKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpOwogCi0gICAgLyogcmVpc2VyZnNfaGFzaF9kZXRlY3QoKSA9PSB0cnVlIGlmIGFueSBvZiB0aGUgaGFzaCBtb3VudCBvcHRpb25zCi0gICAgKiogd2VyZSB1c2VkLiAgV2UgbXVzdCBjaGVjayB0aGVtIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpc24ndAotICAgICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKLSAgICAqLwotICAgIGlmIChjb2RlID09IFVOU0VUX0hBU0ggfHwgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpCi0JY29kZSA9IGZpbmRfaGFzaF9vdXQgKHMpOworCS8qIHJlaXNlcmZzX2hhc2hfZGV0ZWN0KCkgPT0gdHJ1ZSBpZiBhbnkgb2YgdGhlIGhhc2ggbW91bnQgb3B0aW9ucworCSAqKiB3ZXJlIHVzZWQuICBXZSBtdXN0IGNoZWNrIHRoZW0gdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0CisJICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKKwkgKi8KKwlpZiAoY29kZSA9PSBVTlNFVF9IQVNIIHx8IHJlaXNlcmZzX2hhc2hfZGV0ZWN0KHMpKQorCQljb2RlID0gZmluZF9oYXNoX291dChzKTsKIAotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKLQkvKiBkZXRlY3Rpb24gaGFzIGZvdW5kIHRoZSBoYXNoLCBhbmQgd2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZSAKLQkqKiBtb3VudCBvcHRpb25zIAotCSovCi0JaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKLQkJICAgInVuYWJsZSB0byBmb3JjZSBydXBhc292IGhhc2giLCByZWlzZXJmc19oYXNobmFtZShjb2RlKSkgOwotCSAgICBjb2RlID0gVU5TRVRfSEFTSCA7Ci0JfSBlbHNlIGlmIChyZWlzZXJmc190ZWFfaGFzaChzKSAmJiBjb2RlICE9IFRFQV9IQVNIKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgotCQkgICAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwgcmVpc2VyZnNfaGFzaG5hbWUoY29kZSkpIDsKLQkgICAgY29kZSA9IFVOU0VUX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfcjVfaGFzaChzKSAmJiBjb2RlICE9IFI1X0hBU0gpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCi0JCSAgICJ1bmFibGUgdG8gZm9yY2UgcjUgaGFzaCIsIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKSA7Ci0JICAgIGNvZGUgPSBVTlNFVF9IQVNIIDsKLQl9IAotICAgIH0gZWxzZSB7IAotICAgICAgICAvKiBmaW5kX2hhc2hfb3V0IHdhcyBub3QgY2FsbGVkIG9yIGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGhhc2ggKi8KLQlpZiAocmVpc2VyZnNfcnVwYXNvdl9oYXNoKHMpKSB7Ci0JICAgIGNvZGUgPSBZVVJBX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKLQkgICAgY29kZSA9IFRFQV9IQVNIIDsKLQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykpIHsKLQkgICAgY29kZSA9IFI1X0hBU0ggOwotCX0gCi0gICAgfQorCWlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKKwkJLyogZGV0ZWN0aW9uIGhhcyBmb3VuZCB0aGUgaGFzaCwgYW5kIHdlIG11c3QgY2hlY2sgYWdhaW5zdCB0aGUgCisJCSAqKiBtb3VudCBvcHRpb25zIAorCQkgKi8KKwkJaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKKwkJCQkJICJ1bmFibGUgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3RlYV9oYXNoKHMpICYmIGNvZGUgIT0gVEVBX0hBU0gpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCisJCQkJCSAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykgJiYgY29kZSAhPSBSNV9IQVNIKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgorCQkJCQkgInVuYWJsZSB0byBmb3JjZSByNSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9CisJfSBlbHNlIHsKKwkJLyogZmluZF9oYXNoX291dCB3YXMgbm90IGNhbGxlZCBvciBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBoYXNoICovCisJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCWNvZGUgPSBZVVJBX0hBU0g7CisJCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKKwkJCWNvZGUgPSBURUFfSEFTSDsKKwkJfSBlbHNlIGlmIChyZWlzZXJmc19yNV9oYXNoKHMpKSB7CisJCQljb2RlID0gUjVfSEFTSDsKKwkJfQorCX0KIAotICAgIC8qIGlmIHdlIGFyZSBtb3VudGVkIFJXLCBhbmQgd2UgaGF2ZSBhIG5ldyB2YWxpZCBoYXNoIGNvZGUsIHVwZGF0ZSAKLSAgICAqKiB0aGUgc3VwZXIKLSAgICAqLwotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgCi0JIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAKLSAgICAgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKLSAgICAgICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvZGU7CisJLyogaWYgd2UgYXJlIG1vdW50ZWQgUlcsIGFuZCB3ZSBoYXZlIGEgbmV3IHZhbGlkIGhhc2ggY29kZSwgdXBkYXRlIAorCSAqKiB0aGUgc3VwZXIKKwkgKi8KKwlpZiAoY29kZSAhPSBVTlNFVF9IQVNIICYmCisJICAgICEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKKwkJc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKKwl9CisJcmV0dXJuIGNvZGU7CiB9CiAKIC8vIHJldHVybiBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIGZ1bmN0aW9uCi1zdGF0aWMgaGFzaGZfdCBoYXNoX2Z1bmN0aW9uIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGhhc2hmX3QgaGFzaF9mdW5jdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3dpdGNoICh3aGF0X2hhc2ggKHMpKSB7Ci0gICAgY2FzZSBURUFfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgdGVhIGhhc2ggdG8gc29ydCBuYW1lc1xuIik7Ci0JcmV0dXJuIGtleWVkX2hhc2g7Ci0gICAgY2FzZSBZVVJBX0hBU0g6Ci0JcmVpc2VyZnNfaW5mbyAocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4geXVyYV9oYXNoOwotICAgIGNhc2UgUjVfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgcjUgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4gcjVfaGFzaDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisJc3dpdGNoICh3aGF0X2hhc2gocykpIHsKKwljYXNlIFRFQV9IQVNIOgorCQlyZWlzZXJmc19pbmZvKHMsICJVc2luZyB0ZWEgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIGtleWVkX2hhc2g7CisJY2FzZSBZVVJBX0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIHl1cmFfaGFzaDsKKwljYXNlIFI1X0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHI1IGhhc2ggdG8gc29ydCBuYW1lc1xuIik7CisJCXJldHVybiByNV9oYXNoOworCX0KKwlyZXR1cm4gTlVMTDsKIH0KIAogLy8gdGhpcyBpcyB1c2VkIHRvIHNldCB1cCBjb3JyZWN0IHZhbHVlIGZvciBvbGQgcGFydGl0aW9ucwotc3RhdGljIGludCBmdW5jdGlvbjJjb2RlIChoYXNoZl90IGZ1bmMpCitzdGF0aWMgaW50IGZ1bmN0aW9uMmNvZGUoaGFzaGZfdCBmdW5jKQogewotICAgIGlmIChmdW5jID09IGtleWVkX2hhc2gpCi0JcmV0dXJuIFRFQV9IQVNIOwotICAgIGlmIChmdW5jID09IHl1cmFfaGFzaCkKLQlyZXR1cm4gWVVSQV9IQVNIOwotICAgIGlmIChmdW5jID09IHI1X2hhc2gpCi0JcmV0dXJuIFI1X0hBU0g7CisJaWYgKGZ1bmMgPT0ga2V5ZWRfaGFzaCkKKwkJcmV0dXJuIFRFQV9IQVNIOworCWlmIChmdW5jID09IHl1cmFfaGFzaCkKKwkJcmV0dXJuIFlVUkFfSEFTSDsKKwlpZiAoZnVuYyA9PSByNV9oYXNoKQorCQlyZXR1cm4gUjVfSEFTSDsKIAotICAgIEJVRygpIDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCUJVRygpOwkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjZGVmaW5lIFNXQVJOKHNpbGVudCwgcywgLi4uKQkJCVwKIAlpZiAoIShzaWxlbnQpKQkJCQlcCiAJCXJlaXNlcmZzX3dhcm5pbmcgKHMsIF9fVkFfQVJHU19fKQogCi1zdGF0aWMgaW50IHJlaXNlcmZzX2ZpbGxfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQorc3RhdGljIGludCByZWlzZXJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7Ci0gICAgaW50IGo7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IG9sZF9mb3JtYXQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzOwotICAgIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9IDA7Ci0gICAgaW50IGppbml0X2RvbmUgPSAwIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3MgOwotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICAgIGNoYXIgKmpkZXZfbmFtZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JpOwotICAgIGludCBlcnJ2YWwgPSAtRUlOVkFMOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwlpbnQgajsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBvbGRfZm9ybWF0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAwOworCWludCBqaW5pdF9kb25lID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3M7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwljaGFyICpqZGV2X25hbWU7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiaTsKKwlpbnQgZXJydmFsID0gLUVJTlZBTDsKIAotICAgIHNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFzYmkpIHsKLQllcnJ2YWwgPSAtRU5PTUVNOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHMtPnNfZnNfaW5mbyA9IHNiaTsKLSAgICBtZW1zZXQgKHNiaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbykpOwotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uczogbm9uLWFnZ3Jlc3NpdmUgdGFpbHMsIFJPIG9uIGVycm9ycyAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyk7Ci0gICAgLyogbm8gcHJlYWxsb2NhdGlvbiBtaW5pbXVtLCBiZSBzbWFydCBpbgotICAgICAgIHJlaXNlcmZzX2ZpbGVfd3JpdGUgaW5zdGVhZCAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPSAwOwotICAgIC8qIFByZWFsbG9jYXRlIGJ5IDE2IGJsb2NrcyAoMTctMSkgYXQgb25jZSAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0gMTc7Ci0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcndzZW0gZm9yIHhhdHRyIGRpciAqLwotICAgIGluaXRfcndzZW0oJlJFSVNFUkZTX1NCKHMpLT54YXR0cl9kaXJfc2VtKTsKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKSB7CisJCWVycnZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pKTsKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKTsKKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pOworCS8qIG5vIHByZWFsbG9jYXRpb24gbWluaW11bSwgYmUgc21hcnQgaW4KKwkgICByZWlzZXJmc19maWxlX3dyaXRlIGluc3RlYWQgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jbWluID0gMDsKKwkvKiBQcmVhbGxvY2F0ZSBieSAxNiBibG9ja3MgKDE3LTEpIGF0IG9uY2UgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSA9IDE3OworCS8qIEluaXRpYWxpemUgdGhlIHJ3c2VtIGZvciB4YXR0ciBkaXIgKi8KKwlpbml0X3J3c2VtKCZSRUlTRVJGU19TQihzKS0+eGF0dHJfZGlyX3NlbSk7CiAKLSAgICAvKiBzZXR1cCBkZWZhdWx0IGJsb2NrIGFsbG9jYXRvciBvcHRpb25zICovCi0gICAgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zKHMpOworCS8qIHNldHVwIGRlZmF1bHQgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKwlyZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMocyk7CiAKLSAgICBqZGV2X25hbWUgPSBOVUxMOwotICAgIGlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zIChzLCAoY2hhciAqKSBkYXRhLCAmKHNiaS0+c19tb3VudF9vcHQpLCAmYmxvY2tzLCAmamRldl9uYW1lLCAmY29tbWl0X21heF9hZ2UpID09IDApIHsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlqZGV2X25hbWUgPSBOVUxMOworCWlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zCisJICAgIChzLCAoY2hhciAqKWRhdGEsICYoc2JpLT5zX21vdW50X29wdCksICZibG9ja3MsICZqZGV2X25hbWUsCisJICAgICAmY29tbWl0X21heF9hZ2UpID09IDApIHsKKwkJZ290byBlcnJvcjsKKwl9CiAKLSAgICBpZiAoYmxvY2tzKSB7Ci0JU1dBUk4gKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgotCSAgICAgICAiZm9yIHJlbW91bnQgb25seSIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQkKKwlpZiAoYmxvY2tzKSB7CisJCVNXQVJOKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgorCQkgICAgICAiZm9yIHJlbW91bnQgb25seSIpOworCQlnb3RvIGVycm9yOworCX0KIAotICAgIC8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KLSAgICBpZiAoIXJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUykpCi0gICAgICBvbGRfZm9ybWF0ID0gMTsKLSAgICAvKiB0cnkgbmV3IGZvcm1hdCAoNjQtdGggMWsgYmxvY2spLCB3aGljaCBjYW4gY29udGFpbiByZWlzZXJmcyBzdXBlciBibG9jayAqLwotICAgIGVsc2UgaWYgKHJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgewotICAgICAgU1dBUk4oc2lsZW50LCBzLCAic2gtMjAyMTogcmVpc2VyZnNfZmlsbF9zdXBlcjogY2FuIG5vdCBmaW5kIHJlaXNlcmZzIG9uICVzIiwgcmVpc2VyZnNfYmRldm5hbWUgKHMpKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQorCS8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KKwlpZiAoIXJlYWRfc3VwZXJfYmxvY2socywgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkKKwkJb2xkX2Zvcm1hdCA9IDE7CisJLyogdHJ5IG5ldyBmb3JtYXQgKDY0LXRoIDFrIGJsb2NrKSwgd2hpY2ggY2FuIGNvbnRhaW4gcmVpc2VyZnMgc3VwZXIgYmxvY2sgKi8KKwllbHNlIGlmIChyZWFkX3N1cGVyX2Jsb2NrKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJzaC0yMDIxOiByZWlzZXJmc19maWxsX3N1cGVyOiBjYW4gbm90IGZpbmQgcmVpc2VyZnMgb24gJXMiLAorCQkgICAgICByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICAvKiBMZXQncyBkbyBiYXNpYyBzYW5pdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdW5kZXJseWluZyBkZXZpY2UgaXMgbm90Ci0gICAgICAgc21hbGxlciB0aGFuIHRoZSBmaWxlc3lzdGVtLiBJZiB0aGUgY2hlY2sgZmFpbHMgdGhlbiBhYm9ydCBhbmQgc2NyZWFtLAotICAgICAgIGJlY2F1c2UgYmFkIHN0dWZmIHdpbGwgaGFwcGVuIG90aGVyd2lzZS4gKi8KLSAgICBpZiAoIHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwgc2JfYmxvY2tfY291bnQocnMpKnNiX2Jsb2Nrc2l6ZShycykpIHsKLQlTV0FSTiAoc2lsZW50LCBzLCAiRmlsZXN5c3RlbSBvbiAlcyBjYW5ub3QgYmUgbW91bnRlZCBiZWNhdXNlIGl0IGlzIGJpZ2dlciB0aGFuIHRoZSBkZXZpY2UiLCByZWlzZXJmc19iZGV2bmFtZShzKSk7Ci0JU1dBUk4oc2lsZW50LCBzLCAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7Ci0JU1dBUk4oc2lsZW50LCBzLCAiT3IgbWF5IGJlIHlvdSBmb3Jnb3QgdG8gcmVib290IGFmdGVyIGZkaXNrIHdoZW4gaXQgdG9sZCB5b3UgdG8iKTsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJLyogTGV0J3MgZG8gYmFzaWMgc2FuaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHVuZGVybHlpbmcgZGV2aWNlIGlzIG5vdAorCSAgIHNtYWxsZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4gSWYgdGhlIGNoZWNrIGZhaWxzIHRoZW4gYWJvcnQgYW5kIHNjcmVhbSwKKwkgICBiZWNhdXNlIGJhZCBzdHVmZiB3aWxsIGhhcHBlbiBvdGhlcndpc2UuICovCisJaWYgKHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlCisJICAgICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwKKwkgICAgc2JfYmxvY2tfY291bnQocnMpICogc2JfYmxvY2tzaXplKHJzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJGaWxlc3lzdGVtIG9uICVzIGNhbm5vdCBiZSBtb3VudGVkIGJlY2F1c2UgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGRldmljZSIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKKwkJU1dBUk4oc2lsZW50LCBzLAorCQkgICAgICAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgIk9yIG1heSBiZSB5b3UgZm9yZ290IHRvIHJlYm9vdCBhZnRlciBmZGlzayB3aGVuIGl0IHRvbGQgeW91IHRvIik7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gU0JfUkVJU0VSRlNfU1RBVEUocyk7Ci0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gUkVJU0VSRlNfVkFMSURfRlMgOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFNCX1JFSVNFUkZTX1NUQVRFKHMpOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOwogCi0gICAgaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtODogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlYWQgYml0bWFwIik7Ci0JZ290byBlcnJvcjsKLSAgICB9CisJaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgImptYWNkLTg6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byByZWFkIGJpdG1hcCIpOworCQlnb3RvIGVycm9yOworCX0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBTV0FSTiAoc2lsZW50LCBzLCAiQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIHNldCBPTiIpOwotICAgIFNXQVJOIChzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOworCVNXQVJOKHNpbGVudCwgcywgIkNPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBzZXQgT04iKTsKKwlTV0FSTihzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOwogI2VuZGlmCiAKLSAgICAvKiBtYWtlIGRhdGE9b3JkZXJlZCB0aGUgZGVmYXVsdCAqLwotICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykgJiYgIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSAmJgotICAgICAgICAhcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpCi0gICAgewotICAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7Ci0gICAgfQotCi0gICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKLSAgICB9IGVsc2UgaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgewotICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKLSAgICB9Ci0gICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocykpIHsKLSAgICAJcHJpbnRrKCJyZWlzZXJmczogdXNpbmcgZmx1c2ggYmFycmllcnNcbiIpOwotICAgIH0KLQotICAgIC8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKLSAgICBpZiggam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpICkgewotCVNXQVJOKHNpbGVudCwgcywgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfSBlbHNlIHsKLQlqaW5pdF9kb25lID0gMSA7IC8qIG9uY2UgdGhpcyBpcyBzZXQsIGpvdXJuYWxfcmVsZWFzZSBtdXN0IGJlIGNhbGxlZAotCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKLQkJCSAqLwotICAgIH0KLSAgICBpZiAocmVyZWFkX21ldGFfYmxvY2tzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtOTogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlcmVhZCBtZXRhIGJsb2NrcyBhZnRlciBqb3VybmFsIGluaXQiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKHJlcGxheV9vbmx5IChzKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgICAgICBTV0FSTihzaWxlbnQsIHMsICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5IikgOwotCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIDsKLSAgICB9Ci0gICAgYXJncy5vYmplY3RpZCA9IFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgOwotICAgIGFyZ3MuZGlyaWQgPSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCA7Ci0gICAgcm9vdF9pbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCwgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7Ci0gICAgaWYgKCFyb290X2lub2RlKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtMTA6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHJvb3RfaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHJvb3RfaW5vZGUsICZhcmdzKTsKLQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwotICAgIH0KLQotICAgIHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsgIAotICAgIGlmICghcy0+c19yb290KSB7Ci0JaXB1dChyb290X2lub2RlKTsKLQlnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCi0gICAgc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uIChzKTsKLSAgICBpZiAoc2JpLT5zX2hhc2hfZnVuY3Rpb24gPT0gTlVMTCkgewotICAgICAgZHB1dChzLT5zX3Jvb3QpIDsKLSAgICAgIHMtPnNfcm9vdCA9IE5VTEwgOwotICAgICAgZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IChpc19yZWlzZXJmc19qciAocnMpICYmIFNCX1ZFUlNJT04gKHMpID09IFJFSVNFUkZTX1ZFUlNJT05fMSkpCi0Jc2V0X2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICBlbHNlCi0Jc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICAKLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCi0JZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpIDsKLSAgICAgICAgaWYgKGVycnZhbCkgewotCSAgICBkcHV0IChzLT5zX3Jvb3QpOwotCSAgICBzLT5zX3Jvb3QgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0JcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotCi0gICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotCXNldF9zYl9mc19zdGF0ZSAocnMsIDApOwotCQotCWlmIChvbGRfZm9ybWF0X29ubHkocykpIHsKLQkgIC8qIGZpbGVzeXN0ZW0gb2YgZm9ybWF0IDMuNSBlaXRoZXIgd2l0aCBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQKLQkgICAgIGpvdXJuYWwgKi8KLQkgIGlmIChjb252ZXJ0X3JlaXNlcmZzIChzKSkgewotCSAgICAvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLwotCSAgICBpZighc2lsZW50KQotCSAgICAgIHJlaXNlcmZzX2luZm8gKHMsImNvbnZlcnRpbmcgMy41IGZpbGVzeXN0ZW0gdG8gdGhlIDMuNiBmb3JtYXQiKSA7Ci0KLQkgICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpKQotCSAgICAgIC8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KLQkJIG1vdW50IHRoaXMgZmlsZXN5c3RlbSBhbnltb3JlICovCi0JICAgICAgbWVtY3B5IChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAotCQkgICAgICBzaXplb2YgKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKLQotCSAgICBzZXRfc2JfdmVyc2lvbihycyxSRUlTRVJGU19WRVJTSU9OXzIpOwotCSAgICByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzKSA7Ci0JICAgIHNldF9iaXQoUkVJU0VSRlNfM182LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7Ci0JICAgIGNsZWFyX2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLQkgIH0gZWxzZSBpZiAoIXNpbGVudCl7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOwotCSAgfQorCS8qIG1ha2UgZGF0YT1vcmRlcmVkIHRoZSBkZWZhdWx0ICovCisJaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSAmJiAhcmVpc2VyZnNfZGF0YV9vcmRlcmVkKHMpICYmCisJICAgICFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgeworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKIAl9CiAKLQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOwotCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSkgOwotCWlmIChlcnJ2YWwpIHsKLQkgICAgZHB1dCAocy0+c19yb290KTsKLQkgICAgcy0+c19yb290ID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJfSBlbHNlIGlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIHdyaXRlYmFjayBkYXRhIG1vZGVcbiIpOworCX0KKwlpZiAocmVpc2VyZnNfYmFycmllcl9mbHVzaChzKSkgeworCQlwcmludGsoInJlaXNlcmZzOiB1c2luZyBmbHVzaCBiYXJyaWVyc1xuIik7CisJfQorCS8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKKwlpZiAoam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQlqaW5pdF9kb25lID0gMTsJLyogb25jZSB0aGlzIGlzIHNldCwgam91cm5hbF9yZWxlYXNlIG11c3QgYmUgY2FsbGVkCisJCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKKwkJCQkgKi8KKwl9CisJaWYgKHJlcmVhZF9tZXRhX2Jsb2NrcyhzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC05OiByZWlzZXJmc19maWxsX3N1cGVyOiB1bmFibGUgdG8gcmVyZWFkIG1ldGEgYmxvY2tzIGFmdGVyIGpvdXJuYWwgaW5pdCIpOworCQlnb3RvIGVycm9yOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJaWYgKHJlcGxheV9vbmx5KHMpKQorCQlnb3RvIGVycm9yOworCisJaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5Iik7CisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlhcmdzLm9iamVjdGlkID0gUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRDsKKwlhcmdzLmRpcmlkID0gUkVJU0VSRlNfUk9PVF9QQVJFTlRfT0JKRUNUSUQ7CisJcm9vdF9pbm9kZSA9CisJICAgIGlnZXQ1X2xvY2tlZChzLCBSRUlTRVJGU19ST09UX09CSkVDVElELCByZWlzZXJmc19maW5kX2FjdG9yLAorCQkJIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOworCWlmICghcm9vdF9pbm9kZSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC0xMDogcmVpc2VyZnNfZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogbG9vayBmb3IgZmlsZXMgd2hpY2ggd2VyZSB0byBiZSByZW1vdmVkIGluIHByZXZpb3VzIHNlc3Npb24gKi8KLQlmaW5pc2hfdW5maW5pc2hlZCAocyk7Ci0gICAgfSBlbHNlIHsKLQlpZiAoIG9sZF9mb3JtYXRfb25seShzKSAmJiAhc2lsZW50KSB7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOworCWlmIChyb290X2lub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUocm9vdF9pbm9kZSwgJmFyZ3MpOworCQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KSB7CisJCWlwdXQocm9vdF9pbm9kZSk7CisJCWdvdG8gZXJyb3I7CiAJfQotICAgIH0KLSAgICAvLyBtYXJrIGhhc2ggaW4gc3VwZXIgYmxvY2s6IGl0IGNvdWxkIGJlIHVuc2V0LiBvdmVyd3JpdGUgc2hvdWxkIGJlIG9rCi0gICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZSggcnMsIGZ1bmN0aW9uMmNvZGUoc2JpLT5zX2hhc2hfZnVuY3Rpb24gKSApOwotCi0gICAgaGFuZGxlX2F0dHJzKCBzICk7Ci0KLSAgICByZWlzZXJmc19wcm9jX2luZm9faW5pdCggcyApOwotCi0gICAgaW5pdF93YWl0cXVldWVfaGVhZCAoJihzYmktPnNfd2FpdCkpOwotICAgIHNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKLQotICAgIHJldHVybiAoMCk7Ci0KLSBlcnJvcjoKLSAgICBpZiAoamluaXRfZG9uZSkgeyAvKiBraWxsIHRoZSBjb21taXQgdGhyZWFkLCBmcmVlIGpvdXJuYWwgcmFtICovCi0Jam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpIDsKLSAgICB9Ci0gICAgaWYgKFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpKSB7Ci0JZm9yIChqID0gMDsgaiA8IFNCX0JNQVBfTlIgKHMpOyBqICsrKSB7Ci0JICAgIGlmIChTQl9BUF9CSVRNQVAgKHMpKQotCQlicmVsc2UgKFNCX0FQX0JJVE1BUCAocylbal0uYmgpOworCS8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCisJc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uKHMpOworCWlmIChzYmktPnNfaGFzaF9mdW5jdGlvbiA9PSBOVUxMKSB7CisJCWRwdXQocy0+c19yb290KTsKKwkJcy0+c19yb290ID0gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9Ci0JaWYgKFNCX0FQX0JJVE1BUCAocykpCi0JICAgIHZmcmVlIChTQl9BUF9CSVRNQVAgKHMpKTsKLSAgICB9Ci0gICAgaWYgKFNCX0JVRkZFUl9XSVRIX1NCIChzKSkKLQlicmVsc2UoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKworCWlmIChpc19yZWlzZXJmc18zXzUocnMpCisJICAgIHx8IChpc19yZWlzZXJmc19qcihycykgJiYgU0JfVkVSU0lPTihzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzEpKQorCQlzZXRfYml0KFJFSVNFUkZTXzNfNSwgJihzYmktPnNfcHJvcGVydGllcykpOworCWVsc2UKKwkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisKKwkJZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpOworCQlpZiAoZXJydmFsKSB7CisJCQlkcHV0KHMtPnNfcm9vdCk7CisJCQlzLT5zX3Jvb3QgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKworCQlzZXRfc2JfdW1vdW50X3N0YXRlKHJzLCBSRUlTRVJGU19FUlJPUl9GUyk7CisJCXNldF9zYl9mc19zdGF0ZShycywgMCk7CisKKwkJaWYgKG9sZF9mb3JtYXRfb25seShzKSkgeworCQkJLyogZmlsZXN5c3RlbSBvZiBmb3JtYXQgMy41IGVpdGhlciB3aXRoIHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZAorCQkJICAgam91cm5hbCAqLworCQkJaWYgKGNvbnZlcnRfcmVpc2VyZnMocykpIHsKKwkJCQkvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLworCQkJCWlmICghc2lsZW50KQorCQkJCQlyZWlzZXJmc19pbmZvKHMsCisJCQkJCQkgICAgICAiY29udmVydGluZyAzLjUgZmlsZXN5c3RlbSB0byB0aGUgMy42IGZvcm1hdCIpOworCisJCQkJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpCisJCQkJCS8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KKwkJCQkJICAgbW91bnQgdGhpcyBmaWxlc3lzdGVtIGFueW1vcmUgKi8KKwkJCQkJbWVtY3B5KHJzLT5zX3YxLnNfbWFnaWMsCisJCQkJCSAgICAgICByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworCisJCQkJc2V0X3NiX3ZlcnNpb24ocnMsIFJFSVNFUkZTX1ZFUlNJT05fMik7CisJCQkJcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEocyk7CisJCQkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKwkJCQljbGVhcl9iaXQoUkVJU0VSRlNfM181LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisJCQl9IGVsc2UgaWYgKCFzaWxlbnQpIHsKKwkJCQlyZWlzZXJmc19pbmZvKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIik7CisJCQl9CisJCX0KKworCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSk7CisJCWlmIChlcnJ2YWwpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKChlcnJ2YWwgPSByZWlzZXJmc194YXR0cl9pbml0KHMsIHMtPnNfZmxhZ3MpKSkgeworCQkJZHB1dChzLT5zX3Jvb3QpOworCQkJcy0+c19yb290ID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBsb29rIGZvciBmaWxlcyB3aGljaCB3ZXJlIHRvIGJlIHJlbW92ZWQgaW4gcHJldmlvdXMgc2Vzc2lvbiAqLworCQlmaW5pc2hfdW5maW5pc2hlZChzKTsKKwl9IGVsc2UgeworCQlpZiAob2xkX2Zvcm1hdF9vbmx5KHMpICYmICFzaWxlbnQpIHsKKwkJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIDMuNS54IGRpc2sgZm9ybWF0XG4iKTsKKwkJfQorCisJCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdChzLCBzLT5zX2ZsYWdzKSkpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCS8vIG1hcmsgaGFzaCBpbiBzdXBlciBibG9jazogaXQgY291bGQgYmUgdW5zZXQuIG92ZXJ3cml0ZSBzaG91bGQgYmUgb2sKKwlzZXRfc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHJzLCBmdW5jdGlvbjJjb2RlKHNiaS0+c19oYXNoX2Z1bmN0aW9uKSk7CisKKwloYW5kbGVfYXR0cnMocyk7CisKKwlyZWlzZXJmc19wcm9jX2luZm9faW5pdChzKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzYmktPnNfd2FpdCkpOworCXNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKKworCXJldHVybiAoMCk7CisKKyAgICAgIGVycm9yOgorCWlmIChqaW5pdF9kb25lKSB7CS8qIGtpbGwgdGhlIGNvbW1pdCB0aHJlYWQsIGZyZWUgam91cm5hbCByYW0gKi8KKwkJam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpOworCX0KKwlpZiAoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkgeworCQlmb3IgKGogPSAwOyBqIDwgU0JfQk1BUF9OUihzKTsgaisrKSB7CisJCQlpZiAoU0JfQVBfQklUTUFQKHMpKQorCQkJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbal0uYmgpOworCQl9CisJCWlmIChTQl9BUF9CSVRNQVAocykpCisJCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCX0KKwlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocykpCisJCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7Ci0JaWYgKHNiaS0+c19xZl9uYW1lc1tqXSkKLQkgICAga2ZyZWUoc2JpLT5zX3FmX25hbWVzW2pdKTsKLSAgICB9CisJZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7CisJCWlmIChzYmktPnNfcWZfbmFtZXNbal0pCisJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbal0pOworCX0KICNlbmRpZgotICAgIGlmIChzYmkgIT0gTlVMTCkgewotCWtmcmVlKHNiaSk7Ci0gICAgfQorCWlmIChzYmkgIT0gTlVMTCkgeworCQlrZnJlZShzYmkpOworCX0KIAotICAgIHMtPnNfZnNfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIGVycnZhbDsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiBlcnJ2YWw7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKQorc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAKLSAgYnVmLT5mX25hbWVsZW4gPSAoUkVJU0VSRlNfTUFYX05BTUUgKHMtPnNfYmxvY2tzaXplKSk7Ci0gIGJ1Zi0+Zl9iZnJlZSAgID0gc2JfZnJlZV9ibG9ja3MocnMpOwotICBidWYtPmZfYmF2YWlsICA9IGJ1Zi0+Zl9iZnJlZTsKLSAgYnVmLT5mX2Jsb2NrcyAgPSBzYl9ibG9ja19jb3VudChycykgLSBzYl9ibWFwX25yKHJzKSAtIDE7Ci0gIGJ1Zi0+Zl9ic2l6ZSAgID0gcy0+c19ibG9ja3NpemU7Ci0gIC8qIGNoYW5nZWQgdG8gYWNjb21tb2RhdGUgZ2NjIGZvbGtzLiovCi0gIGJ1Zi0+Zl90eXBlICAgID0gIFJFSVNFUkZTX1NVUEVSX01BR0lDOwotICByZXR1cm4gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKworCWJ1Zi0+Zl9uYW1lbGVuID0gKFJFSVNFUkZTX01BWF9OQU1FKHMtPnNfYmxvY2tzaXplKSk7CisJYnVmLT5mX2JmcmVlID0gc2JfZnJlZV9ibG9ja3MocnMpOworCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNiX2JtYXBfbnIocnMpIC0gMTsKKwlidWYtPmZfYnNpemUgPSBzLT5zX2Jsb2Nrc2l6ZTsKKwkvKiBjaGFuZ2VkIHRvIGFjY29tbW9kYXRlIGdjYyBmb2xrcy4gKi8KKwlidWYtPmZfdHlwZSA9IFJFSVNFUkZTX1NVUEVSX01BR0lDOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1FVT1RBCiBzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICAvKiBXZSBtYXkgY3JlYXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikpOwotICAgIGlmIChyZXQpCi0JZ290byBvdXQ7Ci0gICAgcmV0ID0gZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0gICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikpOwotICAgIGlmICghcmV0ICYmIGVycikKLQlyZXQgPSBlcnI7Ci1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0OworCS8qIFdlIG1heSBjcmVhdGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJcmV0ID0KKwkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLAorCQkJICAyICogUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLAorCQkJMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKCFyZXQgJiYgZXJyKQorCQlyZXQgPSBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIC8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLSAgICBpZiAocmV0KQotIAlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldDsKKwkvKiBXZSBtYXkgZGVsZXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCSAgMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLAorCQkJMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7Ci0gICAgaWYgKHJldCkKLQlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7Ci0gICAgaWYgKCFyZXQgJiYgZXJyKQotCXJldCA9IGVycjsKLW91dDoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXR1cm4gcmV0OworCXJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXQgPQorCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJICBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfY29tbWl0KGRxdW90KTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwKKwkJCVJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX2FjcXVpcmVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAocmV0KQotCWdvdG8gb3V0OwotICAgIHJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOwotICAgIHJldHVybiByZXQ7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQkgIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCWVyciA9CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKCFyZXQgJiYgZXJyKQorCQlyZXQgPSBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRxdW90LT5kcV9zYik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCByZWlzZXJmc19yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAocmV0KQotIAlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9yZWxlYXNlKGRxdW90KTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOwotICAgIHJldHVybiByZXQ7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQkgIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfcmVsZWFzZShkcXVvdCk7CisJZXJyID0KKwkgICAgam91cm5hbF9lbmQoJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQlSRUlTRVJGU19RVU9UQV9ERUxfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotICAgIC8qIEFyZSB3ZSBqb3VybmFsbGluZyBxdW90YXM/ICovCi0gICAgaWYgKFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8Ci0gICAgICAgIFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7Ci0JZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7Ci0JcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2RxdW90KGRxdW90KTsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkvKiBBcmUgd2Ugam91cm5hbGxpbmcgcXVvdGFzPyAqLworCWlmIChSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fAorCSAgICBSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkJcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2RxdW90KGRxdW90KTsKKwl9IGVsc2UKKwkJcmV0dXJuIGRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICAvKiBEYXRhIGJsb2NrICsgaW5vZGUgYmxvY2sgKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDIpOwotICAgIGlmIChyZXQpCi0JZ290byBvdXQ7Ci0gICAgcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOwotICAgIGlmICghcmV0ICYmIGVycikKLQlyZXQgPSBlcnI7Ci1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKLSAgICByZXR1cm4gcmV0OworCS8qIERhdGEgYmxvY2sgKyBpbm9kZSBibG9jayAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCXJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzYiwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTE5NzYsNDUgKzIxMTYsNDggQEAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7CiAJcmV0dXJuIHZmc19xdW90YV9vbl9tb3VudChzYiwgUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdLAotCQkJUkVJU0VSRlNfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIHR5cGUpOworCQkJCSAgUkVJU0VSRlNfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIHR5cGUpOwogfQogCiAvKgogICogU3RhbmRhcmQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHF1b3RhX29uCiAgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKnBhdGgpCitzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCQkJICAgICBjaGFyICpwYXRoKQogewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAKLSAgICBpZiAoIShSRUlTRVJGU19TQihzYiktPnNfbW91bnRfb3B0ICYgKDE8PFJFSVNFUkZTX1FVT1RBKSkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKLSAgICBpZiAoZXJyKQotICAgICAgICByZXR1cm4gZXJyOwotICAgIC8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KLSAgICBpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwlpZiAoIShSRUlTRVJGU19TQihzYiktPnNfbW91bnRfb3B0ICYgKDEgPDwgUkVJU0VSRlNfUVVPVEEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFdlIG11c3Qgbm90IHBhY2sgdGFpbHMgZm9yIHF1b3RhIGZpbGVzIG9uIHJlaXNlcmZzIGZvciBxdW90YSBJTyB0byB3b3JrICovCisJaWYgKCFSRUlTRVJGU19JKG5kLmRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIE5vdCBqb3VybmFsbGluZyBxdW90YT8gTm8gbW9yZSB0ZXN0cyBuZWVkZWQuLi4gKi8KKwlpZiAoIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gJiYKKwkgICAgIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlyZWlzZXJmc193YXJuaW5nKHNiLAorCQkJCSAicmVpc2VyZnM6IFF1b3RhIGZpbGUgbm90IG9uIGZpbGVzeXN0ZW0gcm9vdC4gIgorCQkJCSAiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLiIpOwogCXBhdGhfcmVsZWFzZSgmbmQpOwotICAgICAgICByZXR1cm4gLUVYREVWOwotICAgIH0KLSAgICAvKiBXZSBtdXN0IG5vdCBwYWNrIHRhaWxzIGZvciBxdW90YSBmaWxlcyBvbiByZWlzZXJmcyBmb3IgcXVvdGEgSU8gdG8gd29yayAqLwotICAgIGlmICghUkVJU0VSRlNfSShuZC5kZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykgewotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOwotCXBhdGhfcmVsZWFzZSgmbmQpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICAvKiBOb3Qgam91cm5hbGxpbmcgcXVvdGE/IE5vIG1vcmUgdGVzdHMgbmVlZGVkLi4uICovCi0gICAgaWYgKCFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCi0gICAgICAgICFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7Ci0JcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgICAgIHJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7Ci0gICAgfQotICAgIC8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KLSAgICBpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKb3VybmFsbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuIik7Ci0gICAgcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKKwlyZXR1cm4gdmZzX3F1b3RhX29uKHNiLCB0eXBlLCBmb3JtYXRfaWQsIHBhdGgpOwogfQogCiAvKiBSZWFkIGRhdGEgZnJvbSBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QgYWZmb3JkCkBAIC0yMDI0LDQyICsyMTY3LDQ0IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAogCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07Ci0gICAgdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0gICAgaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OwotICAgIHNpemVfdCB0b3JlYWQ7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwotICAgIGxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCXNpemVfdCB0b3JlYWQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAKLSAgICBpZiAob2ZmID4gaV9zaXplKQotCXJldHVybiAwOwotICAgIGlmIChvZmYrbGVuID4gaV9zaXplKQotCWxlbiA9IGlfc2l6ZS1vZmY7Ci0gICAgdG9yZWFkID0gbGVuOwotICAgIHdoaWxlICh0b3JlYWQgPiAwKSB7Ci0JdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG9yZWFkID8gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG9yZWFkOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQkvKiBRdW90YSBmaWxlcyBhcmUgd2l0aG91dCB0YWlscyBzbyB3ZSBjYW4gc2FmZWx5IHVzZSB0aGlzIGZ1bmN0aW9uICovCi0JcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7Ci0JZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7Ci0JaWYgKGVycikKLQkgICAgcmV0dXJuIGVycjsKLQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJnRtcF9iaCkpICAgIC8qIEEgaG9sZT8gKi8KLQkgICAgbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7Ci0JZWxzZSB7Ci0JICAgIGJoID0gc2JfYnJlYWQoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOwotCSAgICBpZiAoIWJoKQotCQlyZXR1cm4gLUVJTzsKLQkgICAgbWVtY3B5KGRhdGEsIGJoLT5iX2RhdGErb2Zmc2V0LCB0b2NvcHkpOwotCSAgICBicmVsc2UoYmgpOworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBsZW4gPiBpX3NpemUpCisJCWxlbiA9IGlfc2l6ZSAtIG9mZjsKKwl0b3JlYWQgPSBsZW47CisJd2hpbGUgKHRvcmVhZCA+IDApIHsKKwkJdG9jb3B5ID0KKwkJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8CisJCSAgICB0b3JlYWQgPyBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3JlYWQ7CisJCXRtcF9iaC5iX3N0YXRlID0gMDsKKwkJLyogUXVvdGEgZmlsZXMgYXJlIHdpdGhvdXQgdGFpbHMgc28gd2UgY2FuIHNhZmVseSB1c2UgdGhpcyBmdW5jdGlvbiAqLworCQlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwkJZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSArIG9mZnNldCwgdG9jb3B5KTsKKwkJCWJyZWxzZShiaCk7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlvZmZzZXQgPSAwOwotCXRvcmVhZCAtPSB0b2NvcHk7Ci0JZGF0YSArPSB0b2NvcHk7Ci0JYmxrKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogLyogV3JpdGUgdG8gcXVvdGFmaWxlICh3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIGhhcwpAQCAtMjA2NywxMTcgKzIyMTIsMTE2IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKIAkJCQkgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKLSAgICB1bnNpZ25lZCBsb25nIGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLSAgICBpbnQgZXJyID0gMCwgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpLCB0b2NvcHk7Ci0gICAgaW50IGpvdXJuYWxfcXVvdGEgPSBSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0gIT0gTlVMTDsKLSAgICBzaXplX3QgdG93cml0ZSA9IGxlbjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoLCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCWludCBqb3VybmFsX3F1b3RhID0gUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwogCi0gICAgZG93bigmaW5vZGUtPmlfc2VtKTsKLSAgICB3aGlsZSAodG93cml0ZSA+IDApIHsKLQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3dyaXRlID8KLQkgICAgICAgICBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3dyaXRlOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7Ci0JaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQotCSAgICBiaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQllbHNlCi0JICAgIGJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQlpZiAoIWJoKSB7Ci0JICAgIGVyciA9IC1FSU87Ci0JICAgIGdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CisJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPworCQkgICAgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJdG1wX2JoLmJfc3RhdGUgPSAwOworCQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQorCQkJYmggPSBzYl9icmVhZChzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJCWVsc2UKKwkJCWJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJaWYgKCFiaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KGN1cnJlbnQtPmpvdXJuYWxfaW5mbywgc2IsIGJoKTsKKwkJaWYgKCFqb3VybmFsX3F1b3RhKQorCQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOworCQlicmVsc2UoYmgpOworCQlvZmZzZXQgPSAwOworCQl0b3dyaXRlIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlsb2NrX2J1ZmZlcihiaCk7Ci0JbWVtY3B5KGJoLT5iX2RhdGErb2Zmc2V0LCBkYXRhLCB0b2NvcHkpOwotCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOwotCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCXVubG9ja19idWZmZXIoYmgpOwotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKLQlqb3VybmFsX21hcmtfZGlydHkoY3VycmVudC0+am91cm5hbF9pbmZvLCBzYiwgYmgpOwotCWlmICgham91cm5hbF9xdW90YSkKLQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOwotCWJyZWxzZShiaCk7Ci0Jb2Zmc2V0ID0gMDsKLQl0b3dyaXRlIC09IHRvY29weTsKLQlkYXRhICs9IHRvY29weTsKLQlibGsrKzsKLSAgICB9Ci1vdXQ6Ci0gICAgaWYgKGxlbiA9PSB0b3dyaXRlKQotCXJldHVybiBlcnI7Ci0gICAgaWYgKGlub2RlLT5pX3NpemUgPCBvZmYrbGVuLXRvd3JpdGUpCi0JaV9zaXplX3dyaXRlKGlub2RlLCBvZmYrbGVuLXRvd3JpdGUpOwotICAgIGlub2RlLT5pX3ZlcnNpb24rKzsKLSAgICBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotICAgIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotICAgIHVwKCZpbm9kZS0+aV9zZW0pOwotICAgIHJldHVybiBsZW4gLSB0b3dyaXRlOworICAgICAgb3V0OgorCWlmIChsZW4gPT0gdG93cml0ZSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZiArIGxlbiAtIHRvd3JpdGUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmICsgbGVuIC0gdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxlbiAtIHRvd3JpdGU7CiB9CiAKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrKgotZ2V0X3N1cGVyX2Jsb2NrIChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAotCQkgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc3VwZXJfYmxvY2soc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgcmVpc2VyZnNfZmlsbF9zdXBlcik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1pbml0X3JlaXNlcmZzX2ZzICggdm9pZCApCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JlaXNlcmZzX2ZzKHZvaWQpCiB7CiAJaW50IHJldDsKIAotCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlICgpKSkgeworCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlKCkpKSB7CiAJCXJldHVybiByZXQ7CiAJfQogCi0gICAgICAgIGlmICgocmV0ID0gcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMgKCkpKQotICAgICAgICAgICAgZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CisJaWYgKChyZXQgPSByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycygpKSkKKwkJZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CiAKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQgKCk7Ci0JcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIiwgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyk7CisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCk7CisJcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iLAorCQkJCSAgICAgIHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MpOwogCi0gICAgICAgIHJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0gKCYgcmVpc2VyZnNfZnNfdHlwZSk7CisJcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycygpOwogCi1mYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM6Ci0JcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCAoInZlcnNpb24iKTsKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUgKCk7Ci0JZGVzdHJveV9pbm9kZWNhY2hlICgpOworICAgICAgZmFpbGVkX3JlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzOgorCXJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iKTsKKwlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotZXhpdF9yZWlzZXJmc19mcyAoIHZvaWQgKQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmVpc2VyZnNfZnModm9pZCkKIHsKLSAgICAgICAgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLQlyZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIpOwotCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSAoKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9maWxlc3lzdGVtICgmIHJlaXNlcmZzX2ZzX3R5cGUpOwotCWRlc3Ryb3lfaW5vZGVjYWNoZSAoKTsKKwlyZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCgidmVyc2lvbiIpOworCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSgpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJlaXNlcmZzX2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJyZWlzZXJmcyIsCi0JLmdldF9zYgkJPSBnZXRfc3VwZXJfYmxvY2ssCi0JLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAotCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJyZWlzZXJmcyIsCisJLmdldF9zYiA9IGdldF9zdXBlcl9ibG9jaywKKwkua2lsbF9zYiA9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzID0gRlNfUkVRVUlSRVNfREVWLAogfTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OICgiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKLU1PRFVMRV9BVVRIT1IgICAgICAoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSAgICAgKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9pbml0IChpbml0X3JlaXNlcmZzX2ZzKTsKLW1vZHVsZV9leGl0IChleGl0X3JlaXNlcmZzX2ZzKTsKK21vZHVsZV9pbml0KGluaXRfcmVpc2VyZnNfZnMpOworbW9kdWxlX2V4aXQoZXhpdF9yZWlzZXJmc19mcyk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCmluZGV4IDYxOTE5MDkuLmM5MmUxMjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCisrKyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCkBAIC0xMSwxNTYgKzExLDE1OSBAQAogLyogYWNjZXNzIHRvIHRhaWwgOiB3aGVuIG9uZSBpcyBnb2luZyB0byByZWFkIHRhaWwgaXQgbXVzdCBtYWtlIHN1cmUsIHRoYXQgaXMgbm90IHJ1bm5pbmcuCiAgZGlyZWN0MmluZGlyZWN0IGFuZCBpbmRpcmVjdDJkaXJlY3QgY2FuIG5vdCBydW4gY29uY3VycmVudGx5ICovCiAKLQogLyogQ29udmVydHMgZGlyZWN0IGl0ZW1zIHRvIGFuIHVuZm9ybWF0dGVkIG5vZGUuIFBhbmljcyBpZiBmaWxlIGhhcyBubwogICAgdGFpbC4gLUVOT1NQQyBpZiBubyBkaXNrIHNwYWNlIGZvciBjb252ZXJzaW9uICovCiAvKiBwYXRoIHBvaW50cyB0byBmaXJzdCBkaXJlY3QgaXRlbSBvZiB0aGUgZmlsZSByZWdhcmxlc3Mgb2YgaG93IG1hbnkgb2YKICAgIHRoZW0gYXJlIHRoZXJlICovCi1pbnQgZGlyZWN0MmluZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUsIAotCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IGJ1ZmZlcl9oZWFkICogdW5iaCwKLQkJICAgICBsb2ZmX3QgdGFpbF9vZmZzZXQpCitpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBidWZmZXJfaGVhZCAqdW5iaCwKKwkJICAgIGxvZmZfdCB0YWlsX29mZnNldCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdXBfdG9fZGF0ZV9iaCA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfdGFpbCA9IDAgOwotICAgIHN0cnVjdCBjcHVfa2V5IGVuZF9rZXk7ICAvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQotCQkJCWNvbnZlcnRlZCBpdGVtLiAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOyAvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLwotICAgIGludAluX2Jsa19zaXplLAotICAgICAgbl9yZXR2YWw7CSAgLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KLSAgICB1bnBfdCB1bmZtX3B0cjsgIC8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCi0JCQkJICAgICAgIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUKLQkJCQkgICAgICAgdHJlZS4gKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp1cF90b19kYXRlX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CisJdW5zaWduZWQgbG9uZyB0b3RhbF90YWlsID0gMDsKKwlzdHJ1Y3QgY3B1X2tleSBlbmRfa2V5OwkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQorCQkJCSAgIGNvbnZlcnRlZCBpdGVtLiAqLworCXN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOwkvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgorCQkJCQkgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLworCWludCBuX2Jsa19zaXplLCBuX3JldHZhbDsJLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KKwl1bnBfdCB1bmZtX3B0cjsJCS8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCisJCQkJICAgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluIHRoZQorCQkJCSAgIHRyZWUuICovCiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihzYiktPnNfZGlyZWN0MmluZGlyZWN0ICsrOworCVJFSVNFUkZTX1NCKHNiKS0+c19kaXJlY3QyaW5kaXJlY3QrKzsKIAotICAgIG5fYmxrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJbl9ibGtfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAotICAgIC8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldwotICAgICAgIHVuZm9ybWF0dGVkIG5vZGUuICovCi0gICAgY29weV9pdGVtX2hlYWQgKCZpbmRfaWgsIHBfbGVfaWgpOwotICAgIHNldF9sZV9paF9rX29mZnNldCAoJmluZF9paCwgdGFpbF9vZmZzZXQpOwotICAgIHNldF9sZV9paF9rX3R5cGUgKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOworCS8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldworCSAgIHVuZm9ybWF0dGVkIG5vZGUuICovCisJY29weV9pdGVtX2hlYWQoJmluZF9paCwgcF9sZV9paCk7CisJc2V0X2xlX2loX2tfb2Zmc2V0KCZpbmRfaWgsIHRhaWxfb2Zmc2V0KTsKKwlzZXRfbGVfaWhfa190eXBlKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOwogCi0gICAgLyogU2V0IHRoZSBrZXkgdG8gc2VhcmNoIGZvciB0aGUgcGxhY2UgZm9yIG5ldyB1bmZtIHBvaW50ZXIgKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIHBsYWNlIGZvciBuZXcgdW5mbSBwb2ludGVyICovCisJbWFrZV9jcHVfa2V5KCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOwogCi0gICAgLy8gRklYTUU6IHdlIGNvdWxkIGF2b2lkIHRoaXMgCi0gICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc2IsICZlbmRfa2V5LCBwYXRoKSA9PSBQT1NJVElPTl9GT1VORCApIHsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgIlBBUC0xNDAzMDogZGlyZWN0MmluZGlyZWN0OiAiCi0JCQkicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCi0JCQkiVXNlIGZzY2sgdG8gcmVwYWlyLiIsICZlbmRfa2V5KTsKLQlwYXRocmVsc2UocGF0aCk7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIAotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotCi0gICAgdW5mbV9wdHIgPSBjcHVfdG9fbGUzMiAodW5iaC0+Yl9ibG9ja25yKTsKLSAgICAKLSAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApICB7Ci0JLyogSW5zZXJ0IG5ldyBpbmRpcmVjdCBpdGVtLiAqLwotCXNldF9paF9mcmVlX3NwYWNlICgmaW5kX2loLCAwKTsgLyogZGVsZXRlIGF0IG5lYXJlc3QgZnV0dXJlICovCi0gICAgICAgIHB1dF9paF9pdGVtX2xlbiggJmluZF9paCwgVU5GTV9QX1NJWkUgKTsKLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpKys7Ci0Jbl9yZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKLQkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKLSAgICB9IGVsc2UgewotCS8qIFBhc3RlIGludG8gbGFzdCBpbmRpcmVjdCBpdGVtIG9mIGFuIG9iamVjdC4gKi8KLQluX3JldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLAotCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsIFVORk1fUF9TSVpFKTsKLSAgICB9Ci0gICAgaWYgKCBuX3JldHZhbCApIHsKLQlyZXR1cm4gbl9yZXR2YWw7Ci0gICAgfQotCi0gICAgLy8gbm90ZTogZnJvbSBoZXJlIHRoZXJlIGFyZSB0d28ga2V5cyB3aGljaCBoYXZlIG1hdGNoaW5nIGZpcnN0Ci0gICAgLy8gdGhyZWUga2V5IGNvbXBvbmVudHMuIFRoZXkgb25seSBkaWZmZXIgYnkgdGhlIGZvdXJ0aCBvbmUuCi0KLQotICAgIC8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVuZF9rZXksIGlub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSksIFRZUEVfRElSRUNULCA0KTsKLQotICAgIC8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQotICAgICAgIGFuZCBkZWxldGUgdGhlbS4gKi8KLSAgICB3aGlsZSAoMSkgIHsKLQlpbnQgdGFpbF9zaXplOwotCi0JLyogZW5kX2tleS5rX29mZnNldCBpcyBzZXQgc28sIHRoYXQgd2Ugd2lsbCBhbHdheXMgaGF2ZSBmb3VuZAotICAgICAgICAgICBsYXN0IGl0ZW0gb2YgdGhlIGZpbGUgKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EICkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKLQkJCSAgICAiZGlyZWN0IGl0ZW0gKCVLKSBub3QgZm91bmQiLCAmZW5kX2tleSk7Ci0JcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7Ci0JUkZBTFNFKCAhaXNfZGlyZWN0X2xlX2loIChwX2xlX2loKSwKLQkgICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCi0gICAgICAgICAgICAgICAgJmVuZF9rZXksIHBfbGVfaWgpOwotICAgICAgICB0YWlsX3NpemUgPSAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKG5fYmxrX3NpemUgLSAxKSkKLSAgICAgICAgICAgICsgaWhfaXRlbV9sZW4ocF9sZV9paCkgLSAxOwotCi0JLyogd2Ugb25seSBzZW5kIHRoZSB1bmJoIHBvaW50ZXIgaWYgdGhlIGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZS4KLQkqKiB0aGlzIGF2b2lkcyBvdmVyd3JpdGluZyBnb29kIGRhdGEgZnJvbSB3cml0ZXBhZ2UoKSB3aXRoIG9sZCBkYXRhCi0JKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKLQkqKiBTcGVjaWFsIGNhc2U6IHVuYmgtPmJfcGFnZSB3aWxsIGJlIE5VTEwgaWYgd2UgYXJlIGNvbWluZyB0aHJvdWdoCi0JKiogRElSRUNUX0lPIGhhbmRsZXIgaGVyZS4KLQkqLwotCWlmICghdW5iaC0+Yl9wYWdlIHx8IGJ1ZmZlcl91cHRvZGF0ZSh1bmJoKSB8fCBQYWdlVXB0b2RhdGUodW5iaC0+Yl9wYWdlKSkgewotCSAgICB1cF90b19kYXRlX2JoID0gTlVMTCA7Ci0JfSBlbHNlIHsKLQkgICAgdXBfdG9fZGF0ZV9iaCA9IHVuYmggOworCS8vIEZJWE1FOiB3ZSBjb3VsZCBhdm9pZCB0aGlzIAorCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJQQVAtMTQwMzA6IGRpcmVjdDJpbmRpcmVjdDogIgorCQkJCSAicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCisJCQkJICJVc2UgZnNjayB0byByZXBhaXIuIiwgJmVuZF9rZXkpOworCQlwYXRocmVsc2UocGF0aCk7CisJCXJldHVybiAtRUlPOwogCX0KLQluX3JldHZhbCA9IHJlaXNlcmZzX2RlbGV0ZV9pdGVtICh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF90b19kYXRlX2JoKSA7CiAKLQl0b3RhbF90YWlsICs9IG5fcmV0dmFsIDsKLQlpZiAodGFpbF9zaXplID09IG5fcmV0dmFsKQotCSAgICAvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKLQkgICAgYnJlYWs7CisJcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwYXRoKTsKIAotICAgIH0KLSAgICAvKiBpZiB3ZSd2ZSBjb3BpZWQgYnl0ZXMgZnJvbSBkaXNrIGludG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gemVybwotICAgICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQotICAgICovCi0gICAgaWYgKHVwX3RvX2RhdGVfYmgpIHsKLSAgICAgICAgdW5zaWduZWQgcGdvZmYgPSAodGFpbF9vZmZzZXQgKyB0b3RhbF90YWlsIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JY2hhciAqa2FkZHI9a21hcF9hdG9taWModXBfdG9fZGF0ZV9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKSA7Ci0Ja3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotICAgIH0KKwl1bmZtX3B0ciA9IGNwdV90b19sZTMyKHVuYmgtPmJfYmxvY2tucik7CiAKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKSB7CisJCS8qIEluc2VydCBuZXcgaW5kaXJlY3QgaXRlbS4gKi8KKwkJc2V0X2loX2ZyZWVfc3BhY2UoJmluZF9paCwgMCk7CS8qIGRlbGV0ZSBhdCBuZWFyZXN0IGZ1dHVyZSAqLworCQlwdXRfaWhfaXRlbV9sZW4oJmluZF9paCwgVU5GTV9QX1NJWkUpOworCQlQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCkrKzsKKwkJbl9yZXR2YWwgPQorCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKKwkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKKwl9IGVsc2UgeworCQkvKiBQYXN0ZSBpbnRvIGxhc3QgaW5kaXJlY3QgaXRlbSBvZiBhbiBvYmplY3QuICovCisJCW5fcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCBwYXRoLCAmZW5kX2tleSwgaW5vZGUsCisJCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsCisJCQkJCQkgICAgVU5GTV9QX1NJWkUpOworCX0KKwlpZiAobl9yZXR2YWwpIHsKKwkJcmV0dXJuIG5fcmV0dmFsOworCX0KKwkvLyBub3RlOiBmcm9tIGhlcmUgdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QKKwkvLyB0aHJlZSBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91cnRoIG9uZS4KIAotICAgIHJldHVybiAwOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLworCW1ha2VfY3B1X2tleSgmZW5kX2tleSwgaW5vZGUsIG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpLCBUWVBFX0RJUkVDVCwKKwkJICAgICA0KTsKKworCS8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQorCSAgIGFuZCBkZWxldGUgdGhlbS4gKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgdGFpbF9zaXplOworCisJCS8qIGVuZF9rZXkua19vZmZzZXQgaXMgc2V0IHNvLCB0aGF0IHdlIHdpbGwgYWx3YXlzIGhhdmUgZm91bmQKKwkJICAgbGFzdCBpdGVtIG9mIHRoZSBmaWxlICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09CisJCSAgICBQT1NJVElPTl9GT1VORCkKKwkJCXJlaXNlcmZzX3BhbmljKHNiLAorCQkJCSAgICAgICAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKKwkJCQkgICAgICAgImRpcmVjdCBpdGVtICglSykgbm90IGZvdW5kIiwgJmVuZF9rZXkpOworCQlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBhdGgpOworCQlSRkFMU0UoIWlzX2RpcmVjdF9sZV9paChwX2xlX2loKSwKKwkJICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCisJCSAgICAgICAmZW5kX2tleSwgcF9sZV9paCk7CisJCXRhaWxfc2l6ZSA9IChsZV9paF9rX29mZnNldChwX2xlX2loKSAmIChuX2Jsa19zaXplIC0gMSkpCisJCSAgICArIGloX2l0ZW1fbGVuKHBfbGVfaWgpIC0gMTsKKworCQkvKiB3ZSBvbmx5IHNlbmQgdGhlIHVuYmggcG9pbnRlciBpZiB0aGUgYnVmZmVyIGlzIG5vdCB1cCB0byBkYXRlLgorCQkgKiogdGhpcyBhdm9pZHMgb3ZlcndyaXRpbmcgZ29vZCBkYXRhIGZyb20gd3JpdGVwYWdlKCkgd2l0aCBvbGQgZGF0YQorCQkgKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKKwkJICoqIFNwZWNpYWwgY2FzZTogdW5iaC0+Yl9wYWdlIHdpbGwgYmUgTlVMTCBpZiB3ZSBhcmUgY29taW5nIHRocm91Z2gKKwkJICoqIERJUkVDVF9JTyBoYW5kbGVyIGhlcmUuCisJCSAqLworCQlpZiAoIXVuYmgtPmJfcGFnZSB8fCBidWZmZXJfdXB0b2RhdGUodW5iaCkKKwkJICAgIHx8IFBhZ2VVcHRvZGF0ZSh1bmJoLT5iX3BhZ2UpKSB7CisJCQl1cF90b19kYXRlX2JoID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXVwX3RvX2RhdGVfYmggPSB1bmJoOworCQl9CisJCW5fcmV0dmFsID0gcmVpc2VyZnNfZGVsZXRlX2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCBpbm9kZSwKKwkJCQkJCXVwX3RvX2RhdGVfYmgpOworCisJCXRvdGFsX3RhaWwgKz0gbl9yZXR2YWw7CisJCWlmICh0YWlsX3NpemUgPT0gbl9yZXR2YWwpCisJCQkvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKKwkJCWJyZWFrOworCisJfQorCS8qIGlmIHdlJ3ZlIGNvcGllZCBieXRlcyBmcm9tIGRpc2sgaW50byB0aGUgcGFnZSwgd2UgbmVlZCB0byB6ZXJvCisJICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQorCSAqLworCWlmICh1cF90b19kYXRlX2JoKSB7CisJCXVuc2lnbmVkIHBnb2ZmID0KKwkJICAgICh0YWlsX29mZnNldCArIHRvdGFsX3RhaWwgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyh1cF90b19kYXRlX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKKworCXJldHVybiAwOwogfQogCi0KIC8qIHN0b2xlbiBmcm9tIGZzL2J1ZmZlci5jICovCi12b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgbG9ja19idWZmZXIoYmgpIDsKLSAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7Ci0gICAgICBCVUcoKSA7Ci0gICAgfQotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOwotICAgIC8qIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gd2hhdGV2ZXIgbGlzdCBpdCBiZWxvbmdzIHRvLiBXZSBhcmUgbW9zdGx5Ci0gICAgICAgaW50ZXJlc3RlZCBpbiByZW1vdmluZyBpdCBmcm9tIHBlci1zYiBqX2RpcnR5X2J1ZmZlcnMgbGlzdCwgdG8gYXZvaWQKLSAgICAgICAgQlVHKCkgb24gYXR0ZW1wdCB0byB3cml0ZSBub3QgbWFwcGVkIGJ1ZmZlciAqLwotICAgIGlmICggKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGJoLT5iX3BhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKTsKLQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKLQlyZWlzZXJmc19mcmVlX2poKGJoKTsKLQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfbWFwcGVkKGJoKSA7Ci0gICAgY2xlYXJfYnVmZmVyX3JlcShiaCkgOwotICAgIGNsZWFyX2J1ZmZlcl9uZXcoYmgpOwotICAgIGJoLT5iX2JkZXYgPSBOVUxMOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKK3ZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbG9ja19idWZmZXIoYmgpOworCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJQlVHKCk7CisJfQorCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJLyogUmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB3aGF0ZXZlciBsaXN0IGl0IGJlbG9uZ3MgdG8uIFdlIGFyZSBtb3N0bHkKKwkgICBpbnRlcmVzdGVkIGluIHJlbW92aW5nIGl0IGZyb20gcGVyLXNiIGpfZGlydHlfYnVmZmVycyBsaXN0LCB0byBhdm9pZAorCSAgIEJVRygpIG9uIGF0dGVtcHQgdG8gd3JpdGUgbm90IG1hcHBlZCBidWZmZXIgKi8KKwlpZiAoKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nLT5ob3N0OworCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOworCQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CisJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCX0KKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwliaC0+Yl9iZGV2ID0gTlVMTDsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKIH0KIAogLyogdGhpcyBmaXJzdCBsb2NrcyBpbm9kZSAobmVpdGhlciByZWFkcyBub3Igc3luYyBhcmUgcGVybWl0dGVkKSwKQEAgLTE2OSwxMDggKzE3MiwxMDggQEAKICAgIHdoYXQgd2UgZXhwZWN0IGZyb20gaXQgKG51bWJlciBvZiBjdXQgYnl0ZXMpLiBCdXQgd2hlbiB0YWlsIHJlbWFpbnMKICAgIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3ZSBzZXQgbW9kZSB0byBTS0lQX0JBTEFOQ0lORyBhbmQgdW5sb2NrCiAgICBpbm9kZSAqLwotaW50IGluZGlyZWN0MmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkgICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKLQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCSAgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KLQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIGxvb2sgZm9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0byBiZSBjdXQuICovCi0JCSAgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwgLyogTmV3IGZpbGUgc2l6ZS4gKi8KLQkJICAgICBjaGFyICogcF9jX21vZGUpCitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KKwkJICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCS8qIEtleSB0byBsb29rIGZvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdG8gYmUgY3V0LiAqLworCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwJLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwkJICAgIGNoYXIgKnBfY19tb2RlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsKLSAgICB1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgY2hhciAqIHRhaWw7Ci0gICAgaW50IHRhaWxfbGVuLCByb3VuZF90YWlsX2xlbjsKLSAgICBsb2ZmX3QgcG9zLCBwb3MxOyAvKiBwb3NpdGlvbiBvZiBmaXJzdCBieXRlIG9mIHRoZSB0YWlsICovCi0gICAgc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworCXN0cnVjdCBpdGVtX2hlYWQgc19paDsKKwl1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisJY2hhciAqdGFpbDsKKwlpbnQgdGFpbF9sZW4sIHJvdW5kX3RhaWxfbGVuOworCWxvZmZfdCBwb3MsIHBvczE7CS8qIHBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCArKzsKKwlSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCsrOwogCi0gICAgKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwkqcF9jX21vZGUgPSBNX1NLSVBfQkFMQU5DSU5HOwogCi0gICAgLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwotICAgIGNvcHlfaXRlbV9oZWFkICgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7Ci0KLSAgICB0YWlsX2xlbiA9IChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOwotICAgIGlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbiAocF9zX2lub2RlKSA9PSBTVEFUX0RBVEFfVjIpCi0Jcm91bmRfdGFpbF9sZW4gPSBST1VORF9VUCAodGFpbF9sZW4pOwotICAgIGVsc2UKLQlyb3VuZF90YWlsX2xlbiA9IHRhaWxfbGVuOwotCi0gICAgcG9zID0gbGVfaWhfa19vZmZzZXQgKCZzX2loKSAtIDEgKyAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgcG9zMSA9IHBvczsKLQotICAgIC8vIHdlIGFyZSBwcm90ZWN0ZWQgYnkgaV9zZW0uIFRoZSB0YWlsIGNhbiBub3QgZGlzYXBwZXIsIG5vdAotICAgIC8vIGFwcGVuZCBjYW4gYmUgZG9uZSBlaXRoZXIKLSAgICAvLyB3ZSBhcmUgaW4gdHJ1bmNhdGUgb3IgcGFja2luZyB0YWlsIGluIGZpbGVfcmVsZWFzZQotCi0gICAgdGFpbCA9IChjaGFyICopa21hcChwYWdlKSA7IC8qIHRoaXMgY2FuIHNjaGVkdWxlICovCi0KLSAgICBpZiAocGF0aF9jaGFuZ2VkICgmc19paCwgcF9zX3BhdGgpKSB7Ci0JLyogcmUtc2VhcmNoIGluZGlyZWN0IGl0ZW0gKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCApCi0JICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgIlBBUC01NTIwOiBpbmRpcmVjdDJkaXJlY3Q6ICIKLQkJCSAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsIHBfc19pdGVtX2tleSk7CisJLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwogCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKworCXRhaWxfbGVuID0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKHBfc19pbm9kZSkgPT0gU1RBVF9EQVRBX1YyKQorCQlyb3VuZF90YWlsX2xlbiA9IFJPVU5EX1VQKHRhaWxfbGVuKTsKKwllbHNlCisJCXJvdW5kX3RhaWxfbGVuID0gdGFpbF9sZW47CisKKwlwb3MgPQorCSAgICBsZV9paF9rX29mZnNldCgmc19paCkgLSAxICsgKGloX2l0ZW1fbGVuKCZzX2loKSAvIFVORk1fUF9TSVpFIC0KKwkJCQkJIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlwb3MxID0gcG9zOworCisJLy8gd2UgYXJlIHByb3RlY3RlZCBieSBpX3NlbS4gVGhlIHRhaWwgY2FuIG5vdCBkaXNhcHBlciwgbm90CisJLy8gYXBwZW5kIGNhbiBiZSBkb25lIGVpdGhlcgorCS8vIHdlIGFyZSBpbiB0cnVuY2F0ZSBvciBwYWNraW5nIHRhaWwgaW4gZmlsZV9yZWxlYXNlCisKKwl0YWlsID0gKGNoYXIgKilrbWFwKHBhZ2UpOwkvKiB0aGlzIGNhbiBzY2hlZHVsZSAqLworCisJaWYgKHBhdGhfY2hhbmdlZCgmc19paCwgcF9zX3BhdGgpKSB7CisJCS8qIHJlLXNlYXJjaCBpbmRpcmVjdCBpdGVtICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpCisJCSAgICA9PSBQT1NJVElPTl9OT1RfRk9VTkQpCisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJQQVAtNTUyMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsCisJCQkJICAgICAgIHBfc19pdGVtX2tleSk7CisJCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlwb3MgPSBsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSArIAotCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0JaWYgKHBvcyAhPSBwb3MxKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCi0JCQkgICAgInRhaWwgcG9zaXRpb24gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHJlYWRpbmcgaXQiKTsKKwkJcG9zID0gbGVfaWhfa19vZmZzZXQoJnNfaWgpIC0gMSArCisJCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLQorCQkgICAgIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKHBvcyAhPSBwb3MxKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJ0YWlsIHBvc2l0aW9uIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIGl0Iik7CiAjZW5kaWYKLSAgICB9CisJfQogCisJLyogU2V0IGRpcmVjdCBpdGVtIGhlYWRlciB0byBpbnNlcnQuICovCisJbWFrZV9sZV9pdGVtX2hlYWQoJnNfaWgsIE5VTEwsIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKHBfc19pbm9kZSksCisJCQkgIHBvczEgKyAxLCBUWVBFX0RJUkVDVCwgcm91bmRfdGFpbF9sZW4sCisJCQkgIDB4ZmZmZiAvKmloX2ZyZWVfc3BhY2UgKi8gKTsKIAotICAgIC8qIFNldCBkaXJlY3QgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLwotICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmc19paCwgTlVMTCwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKHBfc19pbm9kZSksIHBvczEgKyAxLAotCQkgICAgICAgVFlQRV9ESVJFQ1QsIHJvdW5kX3RhaWxfbGVuLCAweGZmZmYvKmloX2ZyZWVfc3BhY2UqLyk7CisJLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCisJICoqIHRoZSBwYWdlIHdhcyBsb2NrZWQgYW5kIHRoaXMgcGFydCBvZiB0aGUgcGFnZSB3YXMgdXAgdG8gZGF0ZSB3aGVuCisJICoqIGluZGlyZWN0MmRpcmVjdCB3YXMgY2FsbGVkLCBzbyB3ZSBrbm93IHRoZSBieXRlcyBhcmUgc3RpbGwgdmFsaWQKKwkgKi8KKwl0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwogCi0gICAgLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCi0gICAgKiogdGhlIHBhZ2Ugd2FzIGxvY2tlZCBhbmQgdGhpcyBwYXJ0IG9mIHRoZSBwYWdlIHdhcyB1cCB0byBkYXRlIHdoZW4KLSAgICAqKiBpbmRpcmVjdDJkaXJlY3Qgd2FzIGNhbGxlZCwgc28gd2Uga25vdyB0aGUgYnl0ZXMgYXJlIHN0aWxsIHZhbGlkCi0gICAgKi8KLSAgICB0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpIDsKKwlQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CiAKLSAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CisJa2V5ID0gKnBfc19pdGVtX2tleTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoJmtleSwgVFlQRV9ESVJFQ1QpOworCWtleS5rZXlfbGVuZ3RoID0gNDsKKwkvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KKwlpZiAocmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBfc19wYXRoLCAma2V5LCAmc19paCwgcF9zX2lub2RlLAorCQkJCSB0YWlsID8gdGFpbCA6IE5VTEwpIDwgMCkgeworCQkvKiBObyBkaXNrIG1lbW9yeS4gU28gd2UgY2FuIG5vdCBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZQorCQkgICB0byB0aGUgZGlyZWN0IGl0ZW0uICBJbiB0aGlzIGNhc2Ugd2UgdXNlZCB0byBhZGp1c3QKKwkJICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKKwkJICAgdXNlZCwgaXQgd291bGQgYmUgaWRlYWwgdG8gd3JpdGUgemVyb3MgdG8gY29ycmVzcG9uZGluZworCQkgICB1bmZvcm1hdHRlZCBub2RlLiBGb3Igbm93IGlfc2l6ZSBpcyBjb25zaWRlcmVkIGFzIGd1YXJkIGZvcgorCQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCisJCWt1bm1hcChwYWdlKTsKKwkJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOworCX0KKwlrdW5tYXAocGFnZSk7CiAKLSAgICBrZXkgPSAqcF9zX2l0ZW1fa2V5OwotICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9ESVJFQ1QpOwotICAgIGtleS5rZXlfbGVuZ3RoID0gNDsKLSAgICAvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KLSAgICBpZiAoIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwX3NfcGF0aCwgJmtleSwgJnNfaWgsIHBfc19pbm9kZSwKLQkJCSAgICAgIHRhaWwgPyB0YWlsIDogTlVMTCkgPCAwICkgewotCS8qIE5vIGRpc2sgbWVtb3J5LiBTbyB3ZSBjYW4gbm90IGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlCi0JICAgdG8gdGhlIGRpcmVjdCBpdGVtLiAgSW4gdGhpcyBjYXNlIHdlIHVzZWQgdG8gYWRqdXN0Ci0JICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKLQkgICB1c2VkLCBpdCB3b3VsZCBiZSBpZGVhbCB0byB3cml0ZSB6ZXJvcyB0byBjb3JyZXNwb25kaW5nCi0JICAgdW5mb3JtYXR0ZWQgbm9kZS4gRm9yIG5vdyBpX3NpemUgaXMgY29uc2lkZXJlZCBhcyBndWFyZCBmb3IKLQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCi0Ja3VubWFwKHBhZ2UpIDsKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBpX2Jsb2NrcyBjaGFuZ2VzIGZyb20gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKi8KKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKwkvLyBub3RlOiB3ZSBoYXZlIG5vdyB0aGUgc2FtZSBhcyBpbiBhYm92ZSBkaXJlY3QyaW5kaXJlY3QKKwkvLyBjb252ZXJzaW9uOiB0aGVyZSBhcmUgdHdvIGtleXMgd2hpY2ggaGF2ZSBtYXRjaGluZyBmaXJzdCB0aHJlZQorCS8vIGtleSBjb21wb25lbnRzLiBUaGV5IG9ubHkgZGlmZmVyIGJ5IHRoZSBmb3VodGggb25lLgorCisJLyogV2UgaGF2ZSBpbnNlcnRlZCBuZXcgZGlyZWN0IGl0ZW0gYW5kIG11c3QgcmVtb3ZlIGxhc3QKKwkgICB1bmZvcm1hdHRlZCBub2RlLiAqLworCSpwX2NfbW9kZSA9IE1fQ1VUOworCisJLyogd2Ugc3RvcmUgcG9zaXRpb24gb2YgZmlyc3QgZGlyZWN0IGl0ZW0gaW4gdGhlIGluLWNvcmUgaW5vZGUgKi8KKwkvL21hcmtfZmlsZV93aXRoX3RhaWwgKHBfc19pbm9kZSwgcG9zMSArIDEpOworCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IHBvczEgKyAxOworCiAJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOwotICAgIH0KLSAgICBrdW5tYXAocGFnZSkgOwotCi0gICAgLyogbWFrZSBzdXJlIHRvIGdldCB0aGUgaV9ibG9ja3MgY2hhbmdlcyBmcm9tIHJlaXNlcmZzX2luc2VydF9pdGVtICovCi0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOwotCi0gICAgLy8gbm90ZTogd2UgaGF2ZSBub3cgdGhlIHNhbWUgYXMgaW4gYWJvdmUgZGlyZWN0MmluZGlyZWN0Ci0gICAgLy8gY29udmVyc2lvbjogdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QgdGhyZWUKLSAgICAvLyBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91aHRoIG9uZS4KLQotICAgIC8qIFdlIGhhdmUgaW5zZXJ0ZWQgbmV3IGRpcmVjdCBpdGVtIGFuZCBtdXN0IHJlbW92ZSBsYXN0Ci0gICAgICAgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLSAgICAqcF9jX21vZGUgPSBNX0NVVDsKLQotICAgIC8qIHdlIHN0b3JlIHBvc2l0aW9uIG9mIGZpcnN0IGRpcmVjdCBpdGVtIGluIHRoZSBpbi1jb3JlIGlub2RlICovCi0gICAgLy9tYXJrX2ZpbGVfd2l0aF90YWlsIChwX3NfaW5vZGUsIHBvczEgKyAxKTsKLSAgICBSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBwb3MxICsgMTsKLQotICAgIHJldHVybiBuX2Jsb2NrX3NpemUgLSByb3VuZF90YWlsX2xlbjsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IDQ1NTgyZmUuLmUzODZkM2QgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtNTEsNjcgKzUxLDY4IEBACiAjZGVmaW5lIFBSSVZST09UX05BTUUgIi5yZWlzZXJmc19wcml2IgogI2RlZmluZSBYQVJPT1RfTkFNRSAgICJ4YXR0cnMiCiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAoY29uc3QgY2hhciAqcHJlZml4KTsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpOwogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqCi1jcmVhdGVfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjcmVhdGVfeGFfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIHN0cnVjdCBkZW50cnkgKnByaXZyb290ID0gZGdldCAoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdDsKIAotICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCi0gICAgaWYgKCFwcml2cm9vdCkKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCS8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCisJaWYgKCFwcml2cm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCi0gICAgeGFyb290ID0gbG9va3VwX29uZV9sZW4gKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuIChYQVJPT1RfTkFNRSkpOwotICAgIGlmIChJU19FUlIgKHhhcm9vdCkpIHsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGRvd24gKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwotICAgICAgICBlcnIgPSBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIgKHByaXZyb290LT5kX2lub2RlLCB4YXJvb3QsIDA3MDApOwotICAgICAgICB1cCAoJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJeGFyb290ID0gbG9va3VwX29uZV9sZW4oWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4oWEFST09UX05BTUUpKTsKKwlpZiAoSVNfRVJSKHhhcm9vdCkpIHsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7CisJCWludCBlcnI7CisJCWRvd24oJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCWVyciA9CisJCSAgICBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIocHJpdnJvb3QtPmRfaW5vZGUsIHhhcm9vdCwKKwkJCQkJCSAgIDA3MDApOworCQl1cCgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICAgICAgZHB1dCAocHJpdnJvb3QpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgUkVJU0VSRlNfU0Ioc2IpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFyb290KTsKKwkJCWRwdXQocHJpdnJvb3QpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QgPSBkZ2V0KHhhcm9vdCk7CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAocHJpdnJvb3QpOwotICAgIHJldHVybiB4YXJvb3Q7CisgICAgICBvdXQ6CisJZHB1dChwcml2cm9vdCk7CisJcmV0dXJuIHhhcm9vdDsKIH0KIAogLyogVGhpcyB3aWxsIHJldHVybiBhIGRlbnRyeSwgb3IgZXJyb3IsIHJlZmVyaW5nIHRvIHRoZSB4YSByb290IGRpcmVjdG9yeS4KICAqIElmIHRoZSB4YSByb290IGRvZXNuJ3QgZXhpc3QgeWV0LCB0aGUgZGVudHJ5IHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dAogICogYW4gYXNzb2NpYXRlZCBpbm9kZS4gVGhpcyBkZW50cnkgY2FuIGJlIHVzZWQgd2l0aCAtPm1rZGlyIHRvIGNyZWF0ZQogICogdGhlIHhhIGRpcmVjdG9yeS4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLV9fZ2V0X3hhX3Jvb3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpfX2dldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqcHJpdnJvb3QgPSBkZ2V0KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CiAKLSAgICBpZiAoSVNfRVJSIChwcml2cm9vdCkgfHwgIXByaXZyb290KQotICAgICAgICByZXR1cm4gcHJpdnJvb3Q7CisJaWYgKElTX0VSUihwcml2cm9vdCkgfHwgIXByaXZyb290KQorCQlyZXR1cm4gcHJpdnJvb3Q7CiAKLSAgICB4YXJvb3QgPSBsb29rdXBfb25lX2xlbiAoWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4gKFhBUk9PVF9OQU1FKSk7Ci0gICAgaWYgKElTX0VSUiAoeGFyb290KSkgewotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCF4YXJvb3QtPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgeGFyb290ID0gTlVMTDsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXhhcm9vdCA9IGxvb2t1cF9vbmVfbGVuKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuKFhBUk9PVF9OQU1FKSk7CisJaWYgKElTX0VSUih4YXJvb3QpKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgeworCQlkcHV0KHhhcm9vdCk7CisJCXhhcm9vdCA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KIAotICAgIFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKKwlSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCA9IGRnZXQoeGFyb290KTsKIAotb3V0OgotICAgIGRwdXQgKHByaXZyb290KTsKLSAgICByZXR1cm4geGFyb290OworICAgICAgb3V0OgorCWRwdXQocHJpdnJvb3QpOworCXJldHVybiB4YXJvb3Q7CiB9CiAKIC8qIFJldHVybnMgdGhlIGRlbnRyeSAob3IgTlVMTCkgcmVmZXJyaW5nIHRvIHRoZSByb290IG9mIHRoZSBleHRlbmRlZApAQCAtMTE5LDE0NyArMTIwLDE0NSBAQAogICogT3RoZXJ3aXNlLCB3ZSBhdHRlbXB0IHRvIHJldHJlaXZlIGl0IGZyb20gZGlzay4gSXQgbWF5IGFsc28gcmV0dXJuCiAgKiBhIHBvaW50ZXItZW5jb2RlZCBlcnJvci4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9yb290IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmdldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZ2V0IChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CiAKLSAgICBpZiAoIWRlbnRyeSkKLSAgICAgICAgZGVudHJ5ID0gX19nZXRfeGFfcm9vdCAocyk7CisJaWYgKCFkZW50cnkpCisJCWRlbnRyeSA9IF9fZ2V0X3hhX3Jvb3Qocyk7CiAKLSAgICByZXR1cm4gZGVudHJ5OworCXJldHVybiBkZW50cnk7CiB9CiAKIC8qIE9wZW5zIHRoZSBkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgaW5vZGUncyBleHRlbmRlZCBhdHRyaWJ1dGUgc3RvcmUuCiAgKiBJZiBmbGFncyBhbGxvdywgdGhlIHRyZWUgdG8gdGhlIGRpcmVjdG9yeSBtYXkgYmUgY3JlYXRlZC4gSWYgY3JlYXRpb24gaXMKICAqIHByb2hpYml0ZWQsIC1FTk9EQVRBIGlzIHJldHVybmVkLiAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKgotb3Blbl94YV9kaXIgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVuX3hhX2Rpcihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqeGFyb290LCAqeGFkaXI7Ci0gICAgY2hhciBuYW1lYnVmWzE3XTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YXJvb3QsICp4YWRpcjsKKwljaGFyIG5hbWVidWZbMTddOwogCi0gICAgeGFyb290ID0gZ2V0X3hhX3Jvb3QgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7Ci0gICAgICAgIHJldHVybiB4YXJvb3Q7Ci0gICAgfSBlbHNlIGlmICgheGFyb290KSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSAwIHx8IGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7Ci0gICAgICAgICAgICB4YXJvb3QgPSBjcmVhdGVfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgaWYgKElTX0VSUiAoeGFyb290KSkKLSAgICAgICAgICAgICAgICByZXR1cm4geGFyb290OwotICAgICAgICB9Ci0gICAgICAgIGlmICgheGFyb290KQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJeGFyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoeGFyb290KSkgeworCQlyZXR1cm4geGFyb290OworCX0gZWxzZSBpZiAoIXhhcm9vdCkgeworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJeGFyb290ID0gY3JlYXRlX3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQkJaWYgKElTX0VSUih4YXJvb3QpKQorCQkJCXJldHVybiB4YXJvb3Q7CisJCX0KKwkJaWYgKCF4YXJvb3QpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgLyogb2ssIHdlIGhhdmUgeGFyb290IG9wZW4gKi8KKwkvKiBvaywgd2UgaGF2ZSB4YXJvb3Qgb3BlbiAqLwogCi0gICAgc25wcmludGYgKG5hbWVidWYsIHNpemVvZiAobmFtZWJ1ZiksICIlWC4lWCIsCi0gICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQpLAotICAgICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKLSAgICB4YWRpciA9IGxvb2t1cF9vbmVfbGVuIChuYW1lYnVmLCB4YXJvb3QsIHN0cmxlbiAobmFtZWJ1ZikpOwotICAgIGlmIChJU19FUlIgKHhhZGlyKSkgewotICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICByZXR1cm4geGFkaXI7Ci0gICAgfQorCXNucHJpbnRmKG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwgIiVYLiVYIiwKKwkJIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkKSwKKwkJIGlub2RlLT5pX2dlbmVyYXRpb24pOworCXhhZGlyID0gbG9va3VwX29uZV9sZW4obmFtZWJ1ZiwgeGFyb290LCBzdHJsZW4obmFtZWJ1ZikpOworCWlmIChJU19FUlIoeGFkaXIpKSB7CisJCWRwdXQoeGFyb290KTsKKwkJcmV0dXJuIHhhZGlyOworCX0KIAotICAgIGlmICgheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgaWYgKGZsYWdzID09IDAgfHwgZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIC8qIEFsdGhvdWdoIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0cnlpbmcgdG8gY3JlYXRlIHRoaXMgZGlyZWN0b3J5LAotICAgICAgICAgICAgICogYW5vdGhlciBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBoYXNoIG1heSBiZSBjcmVhdGVkLCBzbyB3ZSBuZWVkCi0gICAgICAgICAgICAgKiB0byBwcm90ZWN0IGFnYWluc3QgdGhhdCAqLwotICAgICAgICAgICAgZXJyID0geGFyb290LT5kX2lub2RlLT5pX29wLT5ta2RpciAoeGFyb290LT5kX2lub2RlLCB4YWRpciwgMDcwMCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgICAgICBkcHV0ICh4YWRpcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF4YWRpci0+ZF9pbm9kZSkgewotICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQlpbnQgZXJyOworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJLyogQWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBlbHNlIHRyeWluZyB0byBjcmVhdGUgdGhpcyBkaXJlY3RvcnksCisJCQkgKiBhbm90aGVyIGRpcmVjdG9yeSB3aXRoIHRoZSBzYW1lIGhhc2ggbWF5IGJlIGNyZWF0ZWQsIHNvIHdlIG5lZWQKKwkJCSAqIHRvIHByb3RlY3QgYWdhaW5zdCB0aGF0ICovCisJCQllcnIgPQorCQkJICAgIHhhcm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIoeGFyb290LT5kX2lub2RlLCB4YWRpciwKKwkJCQkJCQkgMDcwMCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dCh4YXJvb3QpOworCQkJCWRwdXQoeGFkaXIpOworCQkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCQl9CisJCX0KKwkJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQkJZHB1dCh4YXJvb3QpOworCQkJZHB1dCh4YWRpcik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJCX0KKwl9CiAKLSAgICBkcHV0ICh4YXJvb3QpOwotICAgIHJldHVybiB4YWRpcjsKKwlkcHV0KHhhcm9vdCk7CisJcmV0dXJuIHhhZGlyOwogfQogCiAvKiBSZXR1cm5zIGEgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBleHRlbmRlZCBhdHRyaWJ1dGUgZmlsZQogICogZm9yIHRoZSBpbm9kZS4gSWYgZmxhZ3MgYWxsb3csIHRoZSBmaWxlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYQogICogdmFsaWQgb3IgbmVnYXRpdmUgZGVudHJ5LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9maWxlX2RlbnRyeSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF94YV9maWxlX2RlbnRyeShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOwotICAgIGludCBlcnIgPSAwOworCXN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOworCWludCBlcnIgPSAwOwogCi0gICAgeGFkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWRpcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZGlyKSk7Ci0gICAgfSBlbHNlIGlmICh4YWRpciAmJiAheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFkaXIpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBmbGFncyk7CisJaWYgKElTX0VSUih4YWRpcikpIHsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUih4YWRpcikpOworCX0gZWxzZSBpZiAoeGFkaXIgJiYgIXhhZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoeGFkaXIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBzdHJsZW4gKG5hbWUpKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKSB7Ci0gICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZmlsZSkpOwotICAgIH0KKwl4YWZpbGUgPSBsb29rdXBfb25lX2xlbihuYW1lLCB4YWRpciwgc3RybGVuKG5hbWUpKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpIHsKKwkJZHB1dCh4YWRpcik7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJfQogCi0gICAgaWYgKHhhZmlsZS0+ZF9pbm9kZSkgeyAvKiBmaWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIGVyciA9IC1FRVhJU1Q7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSB8fCBmbGFncyAmIEZMX1JFQURPTkxZKSB7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGlub2RlLT5pX3NlbSBpcyBkb3duLCBzbyBub3RoaW5nIGVsc2UgY2FuIHRyeSB0byBjcmVhdGUKLSAgICAgICAgICogdGhlIHNhbWUgeGF0dHIgKi8KLSAgICAgICAgZXJyID0geGFkaXItPmRfaW5vZGUtPmlfb3AtPmNyZWF0ZSAoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDcwMHxTX0lGUkVHLCBOVUxMKTsKKwlpZiAoeGFmaWxlLT5kX2lub2RlKSB7CS8qIGZpbGUgZXhpc3RzICovCisJCWlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJZXJyID0gLUVFWElTVDsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UgfHwgZmxhZ3MgJiBGTF9SRUFET05MWSkgeworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBpbm9kZS0+aV9zZW0gaXMgZG93biwgc28gbm90aGluZyBlbHNlIGNhbiB0cnkgdG8gY3JlYXRlCisJCSAqIHRoZSBzYW1lIHhhdHRyICovCisJCWVyciA9IHhhZGlyLT5kX2lub2RlLT5pX29wLT5jcmVhdGUoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKKwkJCQkJCSAgIDA3MDAgfCBTX0lGUkVHLCBOVUxMKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAoeGFkaXIpOwotICAgIGlmIChlcnIpCi0gICAgICAgIHhhZmlsZSA9IEVSUl9QVFIgKGVycik7Ci0gICAgcmV0dXJuIHhhZmlsZTsKKyAgICAgIG91dDoKKwlkcHV0KHhhZGlyKTsKKwlpZiAoZXJyKQorCQl4YWZpbGUgPSBFUlJfUFRSKGVycik7CisJcmV0dXJuIHhhZmlsZTsKIH0KIAotCiAvKiBPcGVucyBhIGZpbGUgcG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBpbm9kZSAqLwotc3RhdGljIHN0cnVjdCBmaWxlICoKLW9wZW5feGFfZmlsZSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBmaWxlICpvcGVuX3hhX2ZpbGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZmlsZTsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlOworCXN0cnVjdCBmaWxlICpmcDsKIAotICAgIHhhZmlsZSA9IGdldF94YV9maWxlX2RlbnRyeSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gRVJSX1BUUiAoUFRSX0VSUiAoeGFmaWxlKSk7Ci0gICAgZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgewotICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWZpbGUgPSBnZXRfeGFfZmlsZV9kZW50cnkoaW5vZGUsIG5hbWUsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgeworCQlkcHV0KHhhZmlsZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CiAKLSAgICBmcCA9IGRlbnRyeV9vcGVuICh4YWZpbGUsIE5VTEwsIE9fUkRXUik7Ci0gICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCWZwID0gZGVudHJ5X29wZW4oeGFmaWxlLCBOVUxMLCBPX1JEV1IpOworCS8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KIAotICAgIHJldHVybiBmcDsKKwlyZXR1cm4gZnA7CiB9CiAKLQogLyoKICAqIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGZzL3JlaXNlcmZzL2Rpci5jOnJlaXNlcmZzX3JlYWRkaXIsIGJ1dAogICogd2UgbmVlZCB0byBkcm9wIHRoZSBwYXRoIGJlZm9yZSBjYWxsaW5nIHRoZSBmaWxsZGlyIHN0cnVjdC4gIFRoYXQKQEAgLTI3MywxMzkgKzI3MiwxNDYgQEAKICAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfc2VtIGhlbGQsIHNvIHRoZXJlIGFyZSBubyB3b3JyaWVzIGFib3V0IHRoZSBkaXJlY3RvcnkKICAqIGNoYW5naW5nIHVuZGVybmVhdGggdXMuCiAgKi8KLXN0YXRpYyBpbnQgX194YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCitzdGF0aWMgaW50IF9feGF0dHJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBlbnRyeV9udW07Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgaW50IHNlYXJjaF9yZXM7Ci0gICAgY2hhciAqIGxvY2FsX2J1ZjsKLSAgICBsb2ZmX3QgbmV4dF9wb3M7Ci0gICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwotICAgIGludCBkX3JlY2xlbjsKLSAgICBjaGFyICogZF9uYW1lOwotICAgIG9mZl90IGRfb2ZmOwotICAgIGlub190IGRfaW5vOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCisJSU5JVElBTElaRV9QQVRIKHBhdGhfdG9fZW50cnkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVudHJ5X251bTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCWludCBzZWFyY2hfcmVzOworCWNoYXIgKmxvY2FsX2J1ZjsKKwlsb2ZmX3QgbmV4dF9wb3M7CisJY2hhciBzbWFsbF9idWZbMzJdOwkvKiBhdm9pZCBrbWFsbG9jIGlmIHdlIGNhbiAqLworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJaW50IGRfcmVjbGVuOworCWNoYXIgKmRfbmFtZTsKKwlvZmZfdCBkX29mZjsKKwlpbm9fdCBkX2lubzsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwogCisJLyogZm9ybSBrZXkgZm9yIHNlYXJjaCB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgdXNpbmcgZl9wb3MgZmllbGQgb2YKKwkgICBmaWxlIHN0cnVjdHVyZSAqLworCW5leHRfcG9zID0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSk7CiAKLSAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgotICAgICAgIGZpbGUgc3RydWN0dXJlICovCi0gICAgbmV4dF9wb3MgPSBtYXhfcmVpc2VyZnNfb2Zmc2V0KGlub2RlKTsKKwl3aGlsZSAoMSkgeworCSAgICAgIHJlc2VhcmNoOgorCQlpZiAobmV4dF9wb3MgPD0gRE9UX0RPVF9PRkZTRVQpCisJCQlicmVhazsKKwkJbWFrZV9jcHVfa2V5KCZwb3Nfa2V5LCBpbm9kZSwgbmV4dF9wb3MsIFRZUEVfRElSRU5UUlksIDMpOwogCi0gICAgd2hpbGUgKDEpIHsKLXJlc2VhcmNoOgotCWlmIChuZXh0X3BvcyA8PSBET1RfRE9UX09GRlNFVCkKLQkgICAgYnJlYWs7Ci0JbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIG5leHRfcG9zLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJc2VhcmNoX3JlcyA9CisJCSAgICBzZWFyY2hfYnlfZW50cnlfa2V5KGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksCisJCQkJCSZkZSk7CisJCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJCQkvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCisJCQkvLyBub3QgYmUgcmVhZAorCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAKLQlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleShpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7Ci0JICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKLQkgICAgLy8gbm90IGJlIHJlYWQKLQkgICAgcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQorCQlpZiAoc2VhcmNoX3JlcyA9PSBOQU1FX05PVF9GT1VORCkKKwkJCWRlLmRlX2VudHJ5X251bS0tOwogCi0JaWYgKHNlYXJjaF9yZXMgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bS0tOworCQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmZGUpOworCQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJCWRlaCA9ICYoZGUuZGVfZGVoW2VudHJ5X251bV0pOwogCi0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKLQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07Ci0JZGVoID0gJihkZS5kZV9kZWhbZW50cnlfbnVtXSk7CisJCWJoID0gZGUuZGVfYmg7CisJCWloID0gZGUuZGVfaWg7CiAKLQliaCA9IGRlLmRlX2JoOwotCWloID0gZGUuZGVfaWg7CisJCWlmICghaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAibm90IGRpcmVudHJ5ICVoIiwgaWgpOworCQkJYnJlYWs7CisJCX0KKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCi0JaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJub3QgZGlyZW50cnkgJWgiLCBpaCk7Ci0JICAgIGJyZWFrOwotICAgICAgICB9Ci0JY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCQlSRkFMU0UoQ09NUF9TSE9SVF9LRVlTKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKKwkJICAgICAgICJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJICAgICAgIGloLCAmcG9zX2tleSk7CiAKLQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLwotCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCi0JCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKLQkJaWgsICZwb3Nfa2V5KTsKKwkJaWYgKGRlaF9vZmZzZXQoZGVoKSA8PSBET1RfRE9UX09GRlNFVCkgeworCQkJYnJlYWs7CisJCX0KIAotCWlmIChkZWhfb2Zmc2V0KGRlaCkgPD0gRE9UX0RPVF9PRkZTRVQpIHsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLworCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQoZGVoKSAtIDE7CiAKLQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLwotCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSAtIDE7CisJCWlmICghZGVfdmlzaWJsZShkZWgpKQorCQkJLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCisJCQljb250aW51ZTsKIAotCWlmICghZGVfdmlzaWJsZSAoZGVoKSkKLQkgICAgLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCi0JICAgIGNvbnRpbnVlOworCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7CisJCWRfbmFtZSA9IEJfSV9ERUhfRU5UUllfRklMRV9OQU1FKGJoLCBpaCwgZGVoKTsKKwkJZF9vZmYgPSBkZWhfb2Zmc2V0KGRlaCk7CisJCWRfaW5vID0gZGVoX29iamVjdGlkKGRlaCk7CiAKLQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7Ci0JZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKLQlkX29mZiA9IGRlaF9vZmZzZXQgKGRlaCk7Ci0JZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7CisJCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCisJCQlkX3JlY2xlbiA9IHN0cmxlbihkX25hbWUpOwogCi0JaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKLQkgICAgZF9yZWNsZW4gPSBzdHJsZW4gKGRfbmFtZSk7CisJCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJCS8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCQkJY29udGludWU7CisJCX0KIAotCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpewotCSAgICAvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KLQkgICAgY29udGludWUgOwotCX0KKwkJLyogSWdub3JlIHRoZSAucmVpc2VyZnNfcHJpdiBlbnRyeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSAmJgorCQkgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKwkJICAgIGRlaF9vYmplY3RpZChkZWgpID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+CisJCQkJa19vYmplY3RpZCkpCisJCQljb250aW51ZTsKIAotICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCi0gICAgICAgIGlmIChyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKLSAgICAgICAgICAgIGRlaF9vYmplY3RpZCAoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKQotICAgICAgICAgIGNvbnRpbnVlOworCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkJCWxvY2FsX2J1ZiA9IHNtYWxsX2J1ZjsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2J1ZiA9CisJCQkgICAgcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKTsKKwkJCWlmICghbG9jYWxfYnVmKSB7CisJCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWlmIChpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sCisJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CiAKLQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKLQkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7Ci0JfSBlbHNlIHsKLQkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7Ci0JICAgIGlmICghbG9jYWxfYnVmKSB7Ci0JCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotCQlyZXR1cm4gLUVOT01FTSA7Ci0JICAgIH0KLQkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgewotCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQkJCS8qIHNpZ2gsIG11c3QgcmV0cnkuICBEbyB0aGlzIHNhbWUgb2Zmc2V0IGFnYWluICovCisJCQkJbmV4dF9wb3MgPSBkX29mZjsKKwkJCQlnb3RvIHJlc2VhcmNoOworCQkJfQorCQl9CiAKLQkJLyogc2lnaCwgbXVzdCByZXRyeS4gIERvIHRoaXMgc2FtZSBvZmZzZXQgYWdhaW4gKi8KLQkJbmV4dF9wb3MgPSBkX29mZjsKLQkJZ290byByZXNlYXJjaDsKLQkgICAgfQotCX0KKwkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgorCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJCW1lbWNweShsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOwogCi0JLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5Ci0JLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCi0JLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQotCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCi0JbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCQkvKiB0aGUgZmlsbGRpciBmdW5jdGlvbiBtaWdodCBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9ucywKKwkJICogb3IgZG8gd2hvIGtub3dzIHdoYXQuICBSZWxlYXNlIHRoZSBwYXRoIG5vdyB0aGF0IHdlJ3ZlCisJCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAorCQkgKi8KKwkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKIAotCS8qIHRoZSBmaWxsZGlyIGZ1bmN0aW9uIG1pZ2h0IG5lZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb25zLAotCSAqIG9yIGRvIHdobyBrbm93cyB3aGF0LiAgUmVsZWFzZSB0aGUgcGF0aCBub3cgdGhhdCB3ZSd2ZQotCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAotCSAqLwotCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKKwkJCSAgICBEVF9VTktOT1dOKSA8IDApIHsKKwkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwKKwkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCX0KKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYik7CisJCX0KKwl9CQkJLyogd2hpbGUgKi8KIAotCWlmIChmaWxsZGlyIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKLQkJICAgICBEVF9VTktOT1dOKSA8IDApIHsKLQkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQkgICAgfQotCSAgICBnb3RvIGVuZDsKLQl9Ci0JaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQl9Ci0gICAgfSAvKiB3aGlsZSAqLwotCi1lbmQ6Ci0gICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7Ci0gICAgcmV0dXJuIDA7CisgICAgICBlbmQ6CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQxNyw2MyArNDIzLDU5IEBACiBzdGF0aWMKIGludCB4YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBmaWxsZGlyX3QgZmlsbGVyLCB2b2lkICpidWYpCiB7Ci0gICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICAgICAgaW50IHJlcyA9IC1FTk9URElSOwotICAgICAgICBpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIGRvd24oJmlub2RlLT5pX3NlbSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXMgPSAtRU5PVERJUjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCisJCWdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CiAvLyAgICAgICAgZG93bigmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgcmVzID0gLUVOT0VOVDsKLSAgICAgICAgaWYgKCFJU19ERUFERElSKGlub2RlKSkgewotICAgICAgICAgICAgICAgIGxvY2tfa2VybmVsKCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKLSAgICAgICAgICAgICAgICB1bmxvY2tfa2VybmVsKCk7Ci0gICAgICAgIH0KKwlyZXMgPSAtRU5PRU5UOworCWlmICghSVNfREVBRERJUihpbm9kZSkpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KIC8vICAgICAgICB1cCgmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgdXAoJmlub2RlLT5pX3NlbSk7Ci1vdXQ6Ci0gICAgICAgIHJldHVybiByZXM7CisJdXAoJmlub2RlLT5pX3NlbSk7CisgICAgICBvdXQ6CisJcmV0dXJuIHJlczsKIH0KIAotCiAvKiBJbnRlcm5hbCBvcGVyYXRpb25zIG9uIGZpbGUgZGF0YSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLSAgICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICoKLXJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgc3RydWN0IHBhZ2UgKnJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0gICAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7Ci0gICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgICAgICAvKiBXZSBjYW4gZGVhZGxvY2sgaWYgd2UgdHJ5IHRvIGZyZWUgZGVudHJpZXMsCi0gICAgICAgICAgIGFuZCBhbiB1bmxpbmsvcm1kaXIgaGFzIGp1c3Qgb2NjdXJlZCAtIEdGUF9OT0ZTIGF2b2lkcyB0aGlzICovCi0gICAgICAgIG1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKLSAgICAgICAgcGFnZSA9IHJlYWRfY2FjaGVfcGFnZSAobWFwcGluZywgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOwotICAgICAgICBpZiAoIUlTX0VSUihwYWdlKSkgewotICAgICAgICAgICAgICAgIHdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0gICAgICAgICAgICAgICAga21hcChwYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCS8qIFdlIGNhbiBkZWFkbG9jayBpZiB3ZSB0cnkgdG8gZnJlZSBkZW50cmllcywKKwkgICBhbmQgYW4gdW5saW5rL3JtZGlyIGhhcyBqdXN0IG9jY3VyZWQgLSBHRlBfTk9GUyBhdm9pZHMgdGhpcyAqLworCW1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkgICAgICAgKGZpbGxlcl90ICopIG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CiAKLSAgICAgICAgICAgICAgICBpZiAoUGFnZUVycm9yKHBhZ2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gcGFnZTsKIAotZmFpbDoKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7Ci0gICAgICAgIHJldHVybiBFUlJfUFRSKC1FSU8pOworICAgICAgZmFpbDoKKwlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAotc3RhdGljIGlubGluZSBfX3UzMgoteGF0dHJfaGFzaCAoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3UzMiB4YXR0cl9oYXNoKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKIHsKLSAgICByZXR1cm4gY3N1bV9wYXJ0aWFsIChtc2csIGxlbiwgMCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbChtc2csIGxlbiwgMCk7CiB9CiAKIC8qIEdlbmVyaWMgZXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSB4YSBwbHVnaW5zICovCkBAIC00ODIsMjk0ICs0ODQsMzAwIEBACiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGludCBmbGFncykKIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLSAgICBzaXplX3QgZmlsZV9wb3MgPSAwOwotICAgIHNpemVfdCBidWZmZXJfcG9zID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKLSAgICBzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7Ci0gICAgX191MzIgeGFoYXNoID0gMDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzaXplX3QgZmlsZV9wb3MgPSAwOworCXNpemVfdCBidWZmZXJfcG9zID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisJX191MzIgeGFoYXNoID0gMDsKIAotICAgIGlmIChJU19SRE9OTFkgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGlub2RlKSB8fCBJU19BUFBFTkQgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIC8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLwotICAgIGlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCi0gICAgICAgIHhhaGFzaCA9IHhhdHRyX2hhc2ggKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCS8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLworCWlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCisJCXhhaGFzaCA9IHhhdHRyX2hhc2goYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKLW9wZW5fZmlsZToKLSAgICBmcCA9IG9wZW5feGFfZmlsZSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICB4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOwotCi0gICAgLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCi0gICAgaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKLQlmcHV0KGZwKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChpbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIC8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KLSAgICAgICAgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKLSAgICAgICAgICAgIGZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOwotICAgICAgICBnb3RvIG9wZW5fZmlsZTsKLSAgICB9Ci0KLSAgICAvKiBSZXNpemUgaXQgc28gd2UncmUgb2sgdG8gd3JpdGUgdGhlcmUgKi8KLSAgICBuZXdhdHRycy5pYV9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX1NJWkUgfCBBVFRSX0NUSU1FOwotICAgIGRvd24gKCZ4aW5vZGUtPmlfc2VtKTsKLSAgICBlcnIgPSBub3RpZnlfY2hhbmdlKGZwLT5mX2RlbnRyeSwgJm5ld2F0dHJzKTsKLSAgICBpZiAoZXJyKQotICAgICAgICBnb3RvIG91dF9maWxwOwotCi0gICAgbWFwcGluZyA9IHhpbm9kZS0+aV9tYXBwaW5nOwotICAgIHdoaWxlIChidWZmZXJfcG9zIDwgYnVmZmVyX3NpemUgfHwgYnVmZmVyX3BvcyA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBjaHVuazsKLSAgICAgICAgc2l6ZV90IHNraXAgPSAwOwotICAgICAgICBzaXplX3QgcGFnZV9vZmZzZXQgPSAoZmlsZV9wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotICAgICAgICBpZiAoYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zOwotCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZmlscDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2tfcGFnZSAocGFnZSk7Ci0gICAgICAgIGRhdGEgPSBwYWdlX2FkZHJlc3MgKHBhZ2UpOwotCi0gICAgICAgIGlmIChmaWxlX3BvcyA9PSAwKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGg7Ci0gICAgICAgICAgICBza2lwID0gZmlsZV9wb3MgPSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICAgICAgaWYgKGNodW5rICsgc2tpcCA+IFBBR0VfQ0FDSEVfU0laRSkKLSAgICAgICAgICAgICAgICBjaHVuayA9IFBBR0VfQ0FDSEVfU0laRSAtIHNraXA7Ci0gICAgICAgICAgICByeGggPSAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciAqKWRhdGE7Ci0gICAgICAgICAgICByeGgtPmhfbWFnaWMgPSBjcHVfdG9fbGUzMiAoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOwotICAgICAgICAgICAgcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMiAoeGFoYXNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlIChmcCwgcGFnZSwgcGFnZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX29mZnNldCArIGNodW5rICsgc2tpcCk7Ci0gICAgICAgIGlmICghZXJyKSB7Ci0JICAgIGlmIChidWZmZXIpCi0JCW1lbWNweSAoZGF0YSArIHNraXAsIGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGNodW5rKTsKLSAgICAgICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUgKGZwLCBwYWdlLCBwYWdlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKyAgICAgIG9wZW5fZmlsZToKKwlmcCA9IG9wZW5feGFfZmlsZShpbm9kZSwgbmFtZSwgZmxhZ3MpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQlnb3RvIG91dDsKIAl9Ci0gICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UgKHBhZ2UpOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBmaWxlX3BvcyArPSBjaHVuazsKLSAgICAgICAgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQogCi0gICAgLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCi0gICAgICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQotICAgICAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAotICAgICAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCi0gICAgaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKLSAgICAgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgICAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7Ci0gICAgfQorCXhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLW91dF9maWxwOgotICAgIHVwICgmeGlub2RlLT5pX3NlbSk7Ci0gICAgZnB1dChmcCk7CisJLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCisJaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKKwkJZnB1dChmcCk7CisJCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChpbm9kZSwgbmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOworCQlnb3RvIG9wZW5fZmlsZTsKKwl9CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworCS8qIFJlc2l6ZSBpdCBzbyB3ZSdyZSBvayB0byB3cml0ZSB0aGVyZSAqLworCW5ld2F0dHJzLmlhX3NpemUgPSBidWZmZXJfc2l6ZTsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJZG93bigmeGlub2RlLT5pX3NlbSk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShmcC0+Zl9kZW50cnksICZuZXdhdHRycyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmlscDsKKworCW1hcHBpbmcgPSB4aW5vZGUtPmlfbWFwcGluZzsKKwl3aGlsZSAoYnVmZmVyX3BvcyA8IGJ1ZmZlcl9zaXplIHx8IGJ1ZmZlcl9wb3MgPT0gMCkgeworCQlzaXplX3QgY2h1bms7CisJCXNpemVfdCBza2lwID0gMDsKKwkJc2l6ZV90IHBhZ2Vfb2Zmc2V0ID0gKGZpbGVfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwkJaWYgKGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvcyA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJCWNodW5rID0gUEFHRV9DQUNIRV9TSVpFOworCQllbHNlCisJCQljaHVuayA9IGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvczsKKworCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2ZpbHA7CisJCX0KKworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJaWYgKGZpbGVfcG9zID09IDApIHsKKwkJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aDsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWlmIChjaHVuayArIHNraXAgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkUgLSBza2lwOworCQkJcnhoID0gKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOworCQkJcnhoLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOworCQkJcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMih4YWhhc2gpOworCQl9CisKKwkJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWlmIChidWZmZXIpCisJCQkJbWVtY3B5KGRhdGEgKyBza2lwLCBidWZmZXIgKyBidWZmZXJfcG9zLCBjaHVuayk7CisJCQllcnIgPQorCQkJICAgIG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJCSBwYWdlX29mZnNldCArIGNodW5rICsKKwkJCQkJCQkgc2tpcCk7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJlaXNlcmZzX3B1dF9wYWdlKHBhZ2UpOworCQlidWZmZXJfcG9zICs9IGNodW5rOworCQlmaWxlX3BvcyArPSBjaHVuazsKKwkJc2tpcCA9IDA7CisJCWlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQorCQkJYnJlYWs7CisJfQorCisJLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCisJICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQorCSAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAorCSAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCisJaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisKKyAgICAgIG91dF9maWxwOgorCXVwKCZ4aW5vZGUtPmlfc2VtKTsKKwlmcHV0KGZwKTsKKworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIC8qCiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQorcmVpc2VyZnNfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQogewotICAgIHNzaXplX3QgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc2l6ZV90IGlzaXplOwotICAgIHNpemVfdCBmaWxlX3BvcyA9IDA7Ci0gICAgc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOwotICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgIHN0cnVjdCBpbm9kZSAqeGlub2RlOwotICAgIF9fdTMyIGhhc2ggPSAwOworCXNzaXplX3QgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc2l6ZV90IGlzaXplOworCXNpemVfdCBmaWxlX3BvcyA9IDA7CisJc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBpbm9kZSAqeGlub2RlOworCV9fdTMyIGhhc2ggPSAwOwogCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKLSAgICAgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KLSAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKKwkgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZnAgPSBvcGVuX3hhX2ZpbGUgKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7Ci0gICAgaWYgKElTX0VSUiAoZnApKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gb3Blbl94YV9maWxlKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7CisJaWYgKElTX0VSUihmcCkpIHsKKwkJZXJyID0gUFRSX0VSUihmcCk7CisJCWdvdG8gb3V0OworCX0KIAotICAgIHhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBpc2l6ZSA9IHhpbm9kZS0+aV9zaXplOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKwl4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaXNpemUgPSB4aW5vZGUtPmlfc2l6ZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICAvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICBnb3RvIG91dF9kcHV0OwotICAgIH0KKwkvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJZXJyID0gaXNpemUgLSBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgaWYgKGJ1ZmZlcl9zaXplIDwgaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7Ci0gICAgICAgIGVyciA9IC1FUkFOR0U7Ci0gICAgICAgIGdvdG8gb3V0X2RwdXQ7Ci0gICAgfQorCWlmIChidWZmZXJfc2l6ZSA8IGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7CisJCWVyciA9IC1FUkFOR0U7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgd2hpbGUgKGZpbGVfcG9zIDwgaXNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNodW5rOwotICAgICAgICBjaGFyICpkYXRhOwotICAgICAgICBzaXplX3Qgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChpc2l6ZSAtIGZpbGVfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gaXNpemUgLSBmaWxlX3BvczsKKwl3aGlsZSAoZmlsZV9wb3MgPCBpc2l6ZSkgeworCQlzaXplX3QgY2h1bms7CisJCWNoYXIgKmRhdGE7CisJCXNpemVfdCBza2lwID0gMDsKKwkJaWYgKGlzaXplIC0gZmlsZV9wb3MgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQljaHVuayA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJZWxzZQorCQkJY2h1bmsgPSBpc2l6ZSAtIGZpbGVfcG9zOwogCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgfQorCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2RwdXQ7CisJCX0KIAotICAgICAgICBsb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICBkYXRhID0gcGFnZV9hZGRyZXNzIChwYWdlKTsKLSAgICAgICAgaWYgKGZpbGVfcG9zID09IDApIHsKLSAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOwotICAgICAgICAgICAgc2tpcCA9IGZpbGVfcG9zID0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKLSAgICAgICAgICAgIGNodW5rIC09IHNraXA7Ci0gICAgICAgICAgICAvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KLSAgICAgICAgICAgIGlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIgKFJFSVNFUkZTX1hBVFRSX01BR0lDKSkgewotICAgICAgICAgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJJbnZhbGlkIG1hZ2ljIGZvciB4YXR0ciAoJXMpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NpYXRlZCB3aXRoICVrIiwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhc2ggPSBsZTMyX3RvX2NwdSAocnhoLT5oX2hhc2gpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSAoYnVmZmVyICsgYnVmZmVyX3BvcywgZGF0YSArIHNraXAsIGNodW5rKTsKLSAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgIGZpbGVfcG9zICs9IGNodW5rOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBza2lwID0gMDsKLSAgICB9Ci0gICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmIChmaWxlX3BvcyA9PSAwKSB7CisJCQlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGggPQorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICopZGF0YTsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWNodW5rIC09IHNraXA7CisJCQkvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KKwkJCWlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAiSW52YWxpZCBtYWdpYyBmb3IgeGF0dHIgKCVzKSAiCisJCQkJCQkgImFzc29jaWF0ZWQgd2l0aCAlayIsIG5hbWUsCisJCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXRfZHB1dDsKKwkJCX0KKwkJCWhhc2ggPSBsZTMyX3RvX2NwdShyeGgtPmhfaGFzaCk7CisJCX0KKwkJbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGRhdGEgKyBza2lwLCBjaHVuayk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwkJZmlsZV9wb3MgKz0gY2h1bms7CisJCWJ1ZmZlcl9wb3MgKz0gY2h1bms7CisJCXNraXAgPSAwOworCX0KKwllcnIgPSBpc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKIAotICAgIGlmICh4YXR0cl9oYXNoIChidWZmZXIsIGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKSkgIT0gaGFzaCkgewotICAgICAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkludmFsaWQgaGFzaCBmb3IgeGF0dHIgKCVzKSBhc3NvY2lhdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggJWsiLCBuYW1lLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICBlcnIgPSAtRUlPOwotICAgIH0KKwlpZiAoeGF0dHJfaGFzaChidWZmZXIsIGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSAhPQorCSAgICBoYXNoKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJJbnZhbGlkIGhhc2ggZm9yIHhhdHRyICglcykgYXNzb2NpYXRlZCAiCisJCQkJICJ3aXRoICVrIiwgbmFtZSwgSU5PREVfUEtFWShpbm9kZSkpOworCQllcnIgPSAtRUlPOworCX0KIAotb3V0X2RwdXQ6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZHB1dDoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK19fcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0gICAgc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gMDsKIAotICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChuYW1lLCB4YWRpciwgbmFtZWxlbik7Ci0gICAgaWYgKElTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkZW50cnkpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKLSAgICAgICAgZXJyID0gLUVOT0RBVEE7Ci0gICAgICAgIGdvdG8gb3V0X2ZpbGU7Ci0gICAgfQorCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJZXJyID0gLUVOT0RBVEE7CisJCWdvdG8gb3V0X2ZpbGU7CisJfQogCi0gICAgLyogU2tpcCBkaXJlY3Rvcmllcy4uICovCi0gICAgaWYgKFNfSVNESVIgKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKLSAgICAgICAgZ290byBvdXRfZmlsZTsKKwkvKiBTa2lwIGRpcmVjdG9yaWVzLi4gKi8KKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X2ZpbGU7CiAKLSAgICBpZiAoIWlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkZW50cnktPmRfaW5vZGUpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgIk9JRCAlMDh4IFslLipzLyUuKnNdIGRvZXNuJ3QgaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkZW50cnktPmRfaW5vZGUpLT5rX29iamVjdGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhhZGlyLT5kX25hbWUubGVuLCB4YWRpci0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc19yZWlzZXJmc19wcml2X29iamVjdCAoeGFkaXItPmRfaW5vZGUpID8gIiIgOiAibm90ICIpOwotICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9CisJaWYgKCFpc19yZWlzZXJmc19wcml2X29iamVjdChkZW50cnktPmRfaW5vZGUpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLCAiT0lEICUwOHggWyUuKnMvJS4qc10gZG9lc24ndCBoYXZlICIKKwkJCQkgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKKwkJCQkgbGUzMl90b19jcHUoSU5PREVfUEtFWShkZW50cnktPmRfaW5vZGUpLT4KKwkJCQkJICAgICBrX29iamVjdGlkKSwgeGFkaXItPmRfbmFtZS5sZW4sCisJCQkJIHhhZGlyLT5kX25hbWUubmFtZSwgbmFtZWxlbiwgbmFtZSwKKwkJCQkgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoeGFkaXItPgorCQkJCQkJCSBkX2lub2RlKSA/ICIiIDoKKwkJCQkgIm5vdCAiKTsKKwkJZHB1dChkZW50cnkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKLSAgICBlcnIgPSBkaXItPmlfb3AtPnVubGluayAoZGlyLCBkZW50cnkpOwotICAgIGlmICghZXJyKQotICAgICAgICBkX2RlbGV0ZSAoZGVudHJ5KTsKKwllcnIgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWRfZGVsZXRlKGRlbnRyeSk7CiAKLW91dF9maWxlOgotICAgIGRwdXQgKGRlbnRyeSk7CisgICAgICBvdXRfZmlsZToKKwlkcHV0KGRlbnRyeSk7CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKLQotaW50Ci1yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnI7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChpbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CiAKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlkaXIgPSBvcGVuX3hhX2Rpcihpbm9kZSwgRkxfUkVBRE9OTFkpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0KIAotICAgIGVyciA9IF9fcmVpc2VyZnNfeGF0dHJfZGVsIChkaXIsIG5hbWUsIHN0cmxlbiAobmFtZSkpOwotICAgIGRwdXQgKGRpcik7CisJZXJyID0gX19yZWlzZXJmc194YXR0cl9kZWwoZGlyLCBuYW1lLCBzdHJsZW4obmFtZSkpOworCWRwdXQoZGlyKTsKIAotICAgIGlmICghZXJyKSB7Ci0gICAgICAgIGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICAgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOwotICAgIH0KKwlpZiAoIWVycikgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhlIGZvbGxvd2luZyBhcmUgc2lkZSBlZmZlY3RzIG9mIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseQpAQCAtNzc3LDE2OCArNzg1LDE2NCBAQAogICogb3Igb3duZXJzaGlwIGNoYW5nZXMsIG9iamVjdCBkZWxldGlvbnMsIGV0Yy4gKi8KIAogc3RhdGljIGludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIgKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWRpciA9IChzdHJ1Y3QgZGVudHJ5ICopYnVmOworCXN0cnVjdCBkZW50cnkgKnhhZGlyID0gKHN0cnVjdCBkZW50cnkgKilidWY7CiAKLSAgICByZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwgKHhhZGlyLCBuYW1lLCBuYW1lbGVuKTsKKwlyZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwoeGFkaXIsIG5hbWUsIG5hbWVsZW4pOwogCiB9CiAKIC8qIFRoaXMgaXMgY2FsbGVkIHcvIGlub2RlLT5pX3NlbSBkb3duZWQgKi8KLWludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSkKK2ludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IGZpbGUgKmZwOwotICAgIHN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IGZpbGUgKmZwOworCXN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAotICAgICAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGlub2RlLCBGTF9SRUFET05MWSk7Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgaWYgKElTX0VSUiAoZGlyKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkaXIpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoZGlyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCS8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAorCSAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJZGlyID0gb3Blbl94YV9kaXIoaW5vZGUsIEZMX1JFQURPTkxZKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIWRpci0+ZF9pbm9kZSkgeworCQlkcHV0KGRpcik7CisJCXJldHVybiAwOworCX0KIAotICAgIGZwID0gZGVudHJ5X29wZW4gKGRpciwgTlVMTCwgT19SRFdSKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICAvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCi0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlmcCA9IGRlbnRyeV9vcGVuKGRpciwgTlVMTCwgT19SRFdSKTsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQllcnIgPSBQVFJfRVJSKGZwKTsKKwkJLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBsb2NrX2tlcm5lbCAoKTsKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7Ci0gICAgaWYgKGVycikgewotICAgICAgICB1bmxvY2tfa2VybmVsICgpOwotICAgICAgICBnb3RvIG91dF9kaXI7Ci0gICAgfQorCWxvY2tfa2VybmVsKCk7CisJZXJyID0geGF0dHJfcmVhZGRpcihmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7CisJaWYgKGVycikgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWdvdG8gb3V0X2RpcjsKKwl9CiAKLSAgICAvKiBMZWZ0b3ZlcnMgYmVzaWRlcyAuIGFuZCAuLiAtLSB0aGF0J3Mgbm90IGdvb2QuICovCi0gICAgaWYgKGRpci0+ZF9pbm9kZS0+aV9ubGluayA8PSAyKSB7Ci0gICAgICAgIHJvb3QgPSBnZXRfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBlcnIgPSB2ZnNfcm1kaXIgKHJvb3QtPmRfaW5vZGUsIGRpcik7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgZHB1dCAocm9vdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZW1vdmUgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5Iik7Ci0gICAgfQotICAgIHVubG9ja19rZXJuZWwgKCk7CisJLyogTGVmdG92ZXJzIGJlc2lkZXMgLiBhbmQgLi4gLS0gdGhhdCdzIG5vdCBnb29kLiAqLworCWlmIChkaXItPmRfaW5vZGUtPmlfbmxpbmsgPD0gMikgeworCQlyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVyciA9IHZmc19ybWRpcihyb290LT5kX2lub2RlLCBkaXIpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZHB1dChyb290KTsKKwl9IGVsc2UgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiQ291bGRuJ3QgcmVtb3ZlIGFsbCBlbnRyaWVzIGluIGRpcmVjdG9yeSIpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgaWYgKCFlcnIpCi0gICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiB+aV9oYXNfeGF0dHJfZGlyOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJaWYgKCFlcnIpCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0KKwkJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgfmlfaGFzX3hhdHRyX2RpcjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOwotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyOwotICAgIHN0cnVjdCBpYXR0ciAqYXR0cnM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YWRpcjsKKwlzdHJ1Y3QgaWF0dHIgKmF0dHJzOwogfTsKIAogLyogWFhYOiBJZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgSSdkIGxvdmUgdG8gaGVhciBhYm91dCBpdCAqLwogc3RhdGljIGludAotcmVpc2VyZnNfY2hvd25feGF0dHJzX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCityZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmICpjaG93bl9idWYgPSAoc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqKWJ1ZjsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWZpbGUsICp4YWRpciA9IGNob3duX2J1Zi0+eGFkaXI7Ci0gICAgc3RydWN0IGlhdHRyICphdHRycyA9IGNob3duX2J1Zi0+YXR0cnM7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqY2hvd25fYnVmID0gKHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgKilidWY7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlLCAqeGFkaXIgPSBjaG93bl9idWYtPnhhZGlyOworCXN0cnVjdCBpYXR0ciAqYXR0cnMgPSBjaG93bl9idWYtPmF0dHJzOworCWludCBlcnIgPSAwOwogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gUFRSX0VSUiAoeGFmaWxlKTsKLSAgICBlbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKHhhZmlsZSk7Ci0gICAgICAgIHJldHVybiAtRU5PREFUQTsKLSAgICB9CisJeGFmaWxlID0gbG9va3VwX29uZV9sZW4obmFtZSwgeGFkaXIsIG5hbWVsZW4pOworCWlmIChJU19FUlIoeGFmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGFmaWxlKTsKKwllbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7CisJCWRwdXQoeGFmaWxlKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KIAotICAgIGlmICghU19JU0RJUiAoeGFmaWxlLT5kX2lub2RlLT5pX21vZGUpKQotICAgICAgICBlcnIgPSBub3RpZnlfY2hhbmdlICh4YWZpbGUsIGF0dHJzKTsKLSAgICBkcHV0ICh4YWZpbGUpOworCWlmICghU19JU0RJUih4YWZpbGUtPmRfaW5vZGUtPmlfbW9kZSkpCisJCWVyciA9IG5vdGlmeV9jaGFuZ2UoeGFmaWxlLCBhdHRycyk7CisJZHB1dCh4YWZpbGUpOwogCi0gICAgcmV0dXJuIGVycjsKKwlyZXR1cm4gZXJyOwogfQogCi1pbnQKLXJlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKK2ludCByZWlzZXJmc19jaG93bl94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOwotICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKIAotICAgIC8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0gICAgICAgICFyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGlmIChQVFJfRVJSIChkaXIpICE9IC1FTk9EQVRBKQotICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwkvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKwkgICAgIXJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBGTF9SRUFET05MWSk7CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGRpcikpIHsKKwkJaWYgKFBUUl9FUlIoZGlyKSAhPSAtRU5PREFUQSkKKwkJCWVyciA9IFBUUl9FUlIoZGlyKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoZGlyKTsKKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGxvY2tfa2VybmVsICgpOworCWxvY2tfa2VybmVsKCk7CiAKLSAgICBhdHRycy0+aWFfdmFsaWQgJj0gKEFUVFJfVUlEIHwgQVRUUl9HSUQgfCBBVFRSX0NUSU1FKTsKLSAgICBidWYueGFkaXIgPSBkaXI7Ci0gICAgYnVmLmF0dHJzID0gYXR0cnM7Ci0gICAgYnVmLmlub2RlID0gaW5vZGU7CisJYXR0cnMtPmlhX3ZhbGlkICY9IChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9DVElNRSk7CisJYnVmLnhhZGlyID0gZGlyOworCWJ1Zi5hdHRycyA9IGF0dHJzOworCWJ1Zi5pbm9kZSA9IGlub2RlOwogCi0gICAgZXJyID0geGF0dHJfcmVhZGRpciAoZnAsIHJlaXNlcmZzX2Nob3duX3hhdHRyc19maWxsZXIsICZidWYpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgdW5sb2NrX2tlcm5lbCAoKTsKLSAgICAgICAgZ290byBvdXRfZGlyOwotICAgIH0KKwllcnIgPSB4YXR0cl9yZWFkZGlyKGZwLCByZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyLCAmYnVmKTsKKwlpZiAoZXJyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJZ290byBvdXRfZGlyOworCX0KIAotICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UgKGRpciwgYXR0cnMpOwotICAgIHVubG9ja19rZXJuZWwgKCk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShkaXIsIGF0dHJzKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgYXR0cnMtPmlhX3ZhbGlkID0gaWFfdmFsaWQ7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlhdHRycy0+aWFfdmFsaWQgPSBpYV92YWxpZDsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIEFjdHVhbCBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cG9ydGVkIHRvIFZGUy1sYW5kICovCiAKIC8qCkBAIC05NDYsNjEgKzk1MCw2MCBAQAogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KIHNzaXplX3QKLXJlaXNlcmZzX2dldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3JlaXNlcmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwlpbnQgZXJyOwogCi0gICAgaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorCSAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbihkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBlcnIgPSB4YWgtPmdldCAoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJZXJyID0geGFoLT5nZXQoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gc2V0eGF0dHIoKQogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCiBpbnQKLXJlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOwotICAgIGludCBlcnI7Ci0gICAgaW50IGxvY2s7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CisJaW50IGVycjsKKwlpbnQgbG9jazsKIAotICAgIGlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIGlmIChJU19SRE9OTFkgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgaWYgKElTX0lNTVVUQUJMRSAoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX0lNTVVUQUJMRShkZW50cnktPmRfaW5vZGUpIHx8IElTX0FQUEVORChkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIGxvY2sgPSAhaGFzX3hhdHRyX2RpciAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICBpZiAobG9jaykKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIGVyciA9IHhhaC0+c2V0IChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7Ci0gICAgaWYgKGxvY2spCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKwlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlsb2NrID0gIWhhc194YXR0cl9kaXIoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAobG9jaykKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllcnIgPSB4YWgtPnNldChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKGxvY2spCisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTEwMDgsMzQ0ICsxMDExLDM0MyBAQAogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCi1pbnQKLXJlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworCWludCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CiAKLSAgICBpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKLSAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVST0ZTOworCWlmIChJU19SRE9OTFkoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGRlbnRyeS0+ZF9pbm9kZSkgfHwgSVNfQVBQRU5EIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChJU19JTU1VVEFCTEUoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShkZW50cnktPmRfaW5vZGUpOworCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKIAotICAgIC8qIERlbGV0aW9uIHByZS1vcGVyYXRpb24gKi8KLSAgICBpZiAoeGFoLT5kZWwpIHsKLSAgICAgICAgZXJyID0geGFoLT5kZWwgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICB9CisJLyogRGVsZXRpb24gcHJlLW9wZXJhdGlvbiAqLworCWlmICh4YWgtPmRlbCkgeworCQllcnIgPSB4YWgtPmRlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQogCi0gICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOwogCi0gICAgZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICBtYXJrX2lub2RlX2RpcnR5IChkZW50cnktPmRfaW5vZGUpOworCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkZW50cnktPmRfaW5vZGUpOwogCi1vdXQ6Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIFRoaXMgaXMgd2hhdCBmaWxsZGlyIHdpbGwgdXNlOgogICogcl9wb3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgYW1vdW50IG9mIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgZW50aXJlCiAgKiBsaXN0LiBJZiByX3BvcyBiZWNvbWVzIGxhcmdlciB0aGFuIHJfc2l6ZSwgd2UgbmVlZCBtb3JlIHNwYWNlIGFuZCB3ZQogICogcmV0dXJuIGFuIGVycm9yIGluZGljYXRpbmcgdGhpcy4gSWYgcl9wb3MgaXMgbGVzcyB0aGFuIHJfc2l6ZSwgdGhlbiB3ZSd2ZQogICogZmlsbGVkIHRoZSBidWZmZXIgc3VjY2Vzc2Z1bGx5IGFuZCB3ZSByZXR1cm4gc3VjY2VzcyAqLwogc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgewotICAgIGludCByX3BvczsKLSAgICBpbnQgcl9zaXplOwotICAgIGNoYXIgKnJfYnVmOwotICAgIHN0cnVjdCBpbm9kZSAqcl9pbm9kZTsKKwlpbnQgcl9wb3M7CisJaW50IHJfc2l6ZTsKKwljaGFyICpyX2J1ZjsKKwlzdHJ1Y3QgaW5vZGUgKnJfaW5vZGU7CiB9OwogCiBzdGF0aWMgaW50Ci1yZWlzZXJmc19saXN0eGF0dHJfZmlsbGVyICh2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlcih2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaWYgKG5hbWVbMF0gIT0gJy4nIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPSBmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChuYW1lKTsKLSAgICAgICAgaWYgKCF4YWgpIHJldHVybiAwOyAvKiBVbnN1cHBvcnRlZCB4YXR0ciBuYW1lLCBza2lwIGl0ICovCisJc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7CisJaW50IGxlbiA9IDA7CisJaWYgKG5hbWVbMF0gIT0gJy4nCisJICAgIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7CisJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPQorCQkgICAgZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwkJaWYgKCF4YWgpCisJCQlyZXR1cm4gMDsJLyogVW5zdXBwb3J0ZWQgeGF0dHIgbmFtZSwgc2tpcCBpdCAqLwogCi0gICAgICAgIC8qIFdlIGNhbGwgLT5saXN0KCkgdHdpY2UgYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGlzbid0IHJlcXVpcmVkIHRvIGp1c3QKLSAgICAgICAgICogcmV0dXJuIHRoZSBuYW1lIGJhY2sgLSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLwotICAgICAgICBsZW4gKz0geGFoLT5saXN0IChiLT5yX2lub2RlLCBuYW1lLCBuYW1lbGVuLCBOVUxMKTsKKwkJLyogV2UgY2FsbCAtPmxpc3QoKSB0d2ljZSBiZWNhdXNlIHRoZSBvcGVyYXRpb24gaXNuJ3QgcmVxdWlyZWQgdG8ganVzdAorCQkgKiByZXR1cm4gdGhlIG5hbWUgYmFjayAtIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlICovCisJCWxlbiArPSB4YWgtPmxpc3QoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgTlVMTCk7CiAKLSAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgaWYgKGItPnJfcG9zICsgbGVuICsgMSA8PSBiLT5yX3NpemUpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwID0gYi0+cl9idWYgKyBiLT5yX3BvczsKLSAgICAgICAgICAgICAgICBwICs9IHhhaC0+bGlzdCAoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgcCk7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5yX3BvcyArPSBsZW4gKyAxOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAobGVuKSB7CisJCQlpZiAoYi0+cl9wb3MgKyBsZW4gKyAxIDw9IGItPnJfc2l6ZSkgeworCQkJCWNoYXIgKnAgPSBiLT5yX2J1ZiArIGItPnJfcG9zOworCQkJCXAgKz0geGFoLT5saXN0KGItPnJfaW5vZGUsIG5hbWUsIG5hbWVsZW4sIHApOworCQkJCSpwKysgPSAnXDAnOworCQkJfQorCQkJYi0+cl9wb3MgKz0gbGVuICsgMTsKKwkJfQorCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQorCiAvKgogICogSW5vZGUgb3BlcmF0aW9uIGxpc3R4YXR0cigpCiAgKgogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KLXNzaXplX3QKLXJlaXNlcmZzX2xpc3R4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3NpemVfdCByZWlzZXJmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKIAotICAgIGlmICghZGVudHJ5LT5kX2lub2RlKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGlmIChlcnIgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICBlcnIgPSAwOyAvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWlmIChlcnIgPT0gLUVOT0RBVEEpCisJCQllcnIgPSAwOwkvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGJ1Zi5yX2J1ZiA9IGJ1ZmZlcjsKLSAgICBidWYucl9zaXplID0gYnVmZmVyID8gc2l6ZSA6IDA7Ci0gICAgYnVmLnJfcG9zID0gMDsKLSAgICBidWYucl9pbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlidWYucl9idWYgPSBidWZmZXI7CisJYnVmLnJfc2l6ZSA9IGJ1ZmZlciA/IHNpemUgOiAwOworCWJ1Zi5yX3BvcyA9IDA7CisJYnVmLnJfaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKLSAgICBSRUlTRVJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOworCVJFSVNFUkZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlciwgJmJ1Zik7Ci0gICAgaWYgKGVycikKLSAgICAgICAgZ290byBvdXRfZGlyOworCWVyciA9IHhhdHRyX3JlYWRkaXIoZnAsIHJlaXNlcmZzX2xpc3R4YXR0cl9maWxsZXIsICZidWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2RpcjsKIAotICAgIGlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQotICAgICAgICBlcnIgPSAtRVJBTkdFOwotICAgIGVsc2UKLSAgICAgICAgZXJyID0gYnVmLnJfcG9zOworCWlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQorCQllcnIgPSAtRVJBTkdFOworCWVsc2UKKwkJZXJyID0gYnVmLnJfcG9zOwogCi1vdXRfZGlyOgotICAgIGZwdXQoZnApOworICAgICAgb3V0X2RpcjoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB4YXR0ciBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQgKHhhdHRyX2hhbmRsZXJzKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQoeGF0dHJfaGFuZGxlcnMpOwogc3RhdGljIERFRklORV9SV0xPQ0soaGFuZGxlcl9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICoKLWZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKGNvbnN0IGNoYXIgKnByZWZpeCkKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0gICAgcmVhZF9sb2NrICgmaGFuZGxlcl9sb2NrKTsKLSAgICBsaXN0X2Zvcl9lYWNoIChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHN0cm5jbXAgKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbiAoeGFoLT5wcmVmaXgpKSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHhhaCA9IE5VTEw7Ci0gICAgfQorCXJlYWRfbG9jaygmaGFuZGxlcl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmIChzdHJuY21wKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbih4YWgtPnByZWZpeCkpID09IDApCisJCQlicmVhazsKKwkJeGFoID0gTlVMTDsKKwl9CiAKLSAgICByZWFkX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIHhhaDsKKwlyZWFkX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwlyZXR1cm4geGFoOwogfQogCi1zdGF0aWMgdm9pZAotX191bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQorc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX2hhbmRsZXJzKHZvaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnRtcDsKIAotICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAocCwgdG1wLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHhhaC0+ZXhpdCkKLSAgICAgICAgICAgIHhhaC0+ZXhpdCgpOworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCB0bXAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmICh4YWgtPmV4aXQpCisJCQl4YWgtPmV4aXQoKTsKIAotICAgICAgICBsaXN0X2RlbF9pbml0IChwKTsKLSAgICB9Ci0gICAgSU5JVF9MSVNUX0hFQUQgKCZ4YXR0cl9oYW5kbGVycyk7CisJCWxpc3RfZGVsX2luaXQocCk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZ4YXR0cl9oYW5kbGVycyk7CiB9CiAKLWludCBfX2luaXQKLXJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQoraW50IF9faW5pdCByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLSAgICB3cml0ZV9sb2NrICgmaGFuZGxlcl9sb2NrKTsKKwl3cml0ZV9sb2NrKCZoYW5kbGVyX2xvY2spOwogCi0gICAgLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLwotICAgIGlmICghbGlzdF9lbXB0eSAoJnhhdHRyX2hhbmRsZXJzKSkgewotICAgICAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLworCWlmICghbGlzdF9lbXB0eSgmeGF0dHJfaGFuZGxlcnMpKSB7CisJCXdyaXRlX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgLyogQWRkIHRoZSBoYW5kbGVycyAqLwotICAgIGxpc3RfYWRkX3RhaWwgKCZ1c2VyX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwkvKiBBZGQgdGhlIGhhbmRsZXJzICovCisJbGlzdF9hZGRfdGFpbCgmdXNlcl9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFkKLSAgICBsaXN0X2FkZF90YWlsICgmc2VjdXJpdHlfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwlsaXN0X2FkZF90YWlsKCZzZWN1cml0eV9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAotICAgIGxpc3RfYWRkX3RhaWwgKCZwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisJbGlzdF9hZGRfdGFpbCgmcG9zaXhfYWNsX2FjY2Vzc19oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CiAjZW5kaWYKIAotICAgIC8qIFJ1biBpbml0aWFsaXplcnMsIGlmIGF2YWlsYWJsZSAqLwotICAgIGxpc3RfZm9yX2VhY2ggKHAsICZ4YXR0cl9oYW5kbGVycykgewotICAgICAgICB4YWggPSBsaXN0X2VudHJ5IChwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOwotICAgICAgICBpZiAoeGFoLT5pbml0KSB7Ci0gICAgICAgICAgICBlcnIgPSB4YWgtPmluaXQgKCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCAocCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJLyogUnVuIGluaXRpYWxpemVycywgaWYgYXZhaWxhYmxlICovCisJbGlzdF9mb3JfZWFjaChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKKwkJeGFoID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOworCQlpZiAoeGFoLT5pbml0KSB7CisJCQllcnIgPSB4YWgtPmluaXQoKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlsaXN0X2RlbF9pbml0KHApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCi0gICAgLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KLSAgICBpZiAoZXJyKQotICAgICAgICBfX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KKwlpZiAoZXJyKQorCQlfX3VucmVnaXN0ZXJfaGFuZGxlcnMoKTsKIAotICAgIHdyaXRlX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIGVycjsKKwl3cml0ZV91bmxvY2soJmhhbmRsZXJfbG9jayk7CisJcmV0dXJuIGVycjsKIH0KIAotdm9pZAotcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAodm9pZCkKK3ZvaWQgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIHdyaXRlX2xvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgIF9fdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLSAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworCXdyaXRlX2xvY2soJmhhbmRsZXJfbG9jayk7CisJX191bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJd3JpdGVfdW5sb2NrKCZoYW5kbGVyX2xvY2spOwogfQogCiAvKiBUaGlzIHdpbGwgY2F0Y2ggbG9va3VwcyBmcm9tIHRoZSBmcyByb290IHRvIC5yZWlzZXJmc19wcml2ICovCiBzdGF0aWMgaW50Ci14YXR0cl9sb29rdXBfcG9pc29uIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxMSwgc3RydWN0IHFzdHIgKm5hbWUpCit4YXR0cl9sb29rdXBfcG9pc29uKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnExLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3QgPSBSRUlTRVJGU19TQihkZW50cnktPmRfc2IpLT5wcml2X3Jvb3Q7Ci0gICAgaWYgKG5hbWUtPmxlbiA9PSBwcml2X3Jvb3QtPmRfbmFtZS5sZW4gJiYKLSAgICAgICAgbmFtZS0+aGFzaCA9PSBwcml2X3Jvb3QtPmRfbmFtZS5oYXNoICYmCi0gICAgICAgICFtZW1jbXAgKG5hbWUtPm5hbWUsIHByaXZfcm9vdC0+ZF9uYW1lLm5hbWUsIG5hbWUtPmxlbikpIHsKLSAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKLSAgICAgICAgICAgICAgICFtZW1jbXAocTEtPm5hbWUsIG5hbWUtPm5hbWUsIG5hbWUtPmxlbikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAxOworCXN0cnVjdCBkZW50cnkgKnByaXZfcm9vdCA9IFJFSVNFUkZTX1NCKGRlbnRyeS0+ZF9zYiktPnByaXZfcm9vdDsKKwlpZiAobmFtZS0+bGVuID09IHByaXZfcm9vdC0+ZF9uYW1lLmxlbiAmJgorCSAgICBuYW1lLT5oYXNoID09IHByaXZfcm9vdC0+ZF9uYW1lLmhhc2ggJiYKKwkgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBwcml2X3Jvb3QtPmRfbmFtZS5uYW1lLCBuYW1lLT5sZW4pKSB7CisJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKwkJICAgIW1lbWNtcChxMS0+bmFtZSwgbmFtZS0+bmFtZSwgbmFtZS0+bGVuKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgeGF0dHJfbG9va3VwX3BvaXNvbl9vcHMgPSB7Ci0gICAgLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCisJLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCiB9OwogCi0KIC8qIFdlIG5lZWQgdG8gdGFrZSBhIGNvcHkgb2YgdGhlIG1vdW50IGZsYWdzIHNpbmNlIHRoaW5ncyBsaWtlCiAgKiBNU19SRE9OTFkgZG9uJ3QgZ2V0IHNldCB1bnRpbCAqYWZ0ZXIqIHdlJ3JlIGNhbGxlZC4KICAqIG1vdW50X2ZsYWdzICE9IG1vdW50X29wdGlvbnMgKi8KLWludAotcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbW91bnRfZmxhZ3MpCitpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtb3VudF9mbGFncykKIHsKLSAgaW50IGVyciA9IDA7CisJaW50IGVyciA9IDA7CiAKLSAgLyogV2UgbmVlZCBnZW5lcmF0aW9uIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgdGhlIG9pZCBtYXBwaW5nIGlzIGNvcnJlY3QKLSAgICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCi0gIGlmICghb2xkX2Zvcm1hdF9vbmx5IChzKSkgewotICAgIHNldF9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwgKHMpKSB7Ci0gICAgLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCi0gICAgICogYXQgbW91bnQgdGltZS4gRXJyb3Igb3V0LiAqLwotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ4YXR0cnMvQUNMcyBub3Qgc3VwcG9ydGVkIG9uIHByZSB2My42ICIKLSAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGZpbGVzeXN0ZW0uIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIHsKLSAgICAvKiBPbGQgZm9ybWF0IGZpbGVzeXN0ZW0sIGJ1dCBubyBvcHRpb25hbCB4YXR0cnMgaGF2ZSBiZWVuIGVuYWJsZWQuIFRoaXMKLSAgICAgKiBtZWFucyB3ZSBzaWxlbnRseSBkaXNhYmxlIHhhdHRycyBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KLSAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfQorCS8qIFdlIG5lZWQgZ2VuZXJhdGlvbiBudW1iZXJzIHRvIGVuc3VyZSB0aGF0IHRoZSBvaWQgbWFwcGluZyBpcyBjb3JyZWN0CisJICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCisJaWYgKCFvbGRfZm9ybWF0X29ubHkocykpIHsKKwkJc2V0X2JpdChSRUlTRVJGU19YQVRUUlMsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwocykpIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCisJCSAqIGF0IG1vdW50IHRpbWUuIEVycm9yIG91dC4gKi8KKwkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgbm90IHN1cHBvcnRlZCBvbiBwcmUgdjMuNiAiCisJCQkJICJmb3JtYXQgZmlsZXN5c3RlbS4gRmFpbGluZyBtb3VudC4iKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgbm8gb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkLiBUaGlzCisJCSAqIG1lYW5zIHdlIHNpbGVudGx5IGRpc2FibGUgeGF0dHJzIG9uIHRoZSBmaWxlc3lzdGVtLiAqLworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCX0KIAotICAvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSBwcml2cm9vdCBsb2NhdGVkIHlldCAtIGdvIGZpbmQgaXQgKi8KLSAgaWYgKHJlaXNlcmZzX3hhdHRycyAocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKLSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSAgICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChQUklWUk9PVF9OQU1FKSk7Ci0gICAgICBpZiAoIUlTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkgewotICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0gICAgICAgICAgICBkb3duICgmaW5vZGUtPmlfc2VtKTsKLSAgICAgICAgICAgIGVyciA9IGlub2RlLT5pX29wLT5ta2RpciAoaW5vZGUsIGRlbnRyeSwgMDcwMCk7Ci0gICAgICAgICAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoZGVudHJ5KTsKLSAgICAgICAgICAgICAgICBkZW50cnkgPSBOVUxMOwotICAgICAgICAgICAgfQorCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHByaXZyb290IGxvY2F0ZWQgeWV0IC0gZ28gZmluZCBpdCAqLworCWlmIChyZWlzZXJmc194YXR0cnMocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCisJCQkJCXN0cmxlbihQUklWUk9PVF9OQU1FKSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhZGVudHJ5LT5kX2lub2RlKSB7CisJCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJCQllcnIgPSBpbm9kZS0+aV9vcC0+bWtkaXIoaW5vZGUsIGRlbnRyeSwgMDcwMCk7CisJCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQkJaWYgKGVycikgeworCQkJCQlkcHV0KGRlbnRyeSk7CisJCQkJCWRlbnRyeSA9IE5VTEw7CisJCQkJfQogCi0gICAgICAgICAgICBpZiAoZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSkKLSAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiQ3JlYXRlZCAlcyBvbiAlcyAtIHJlc2VydmVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhhdHRyIHN0b3JhZ2UuIiwgUFJJVlJPT1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKTsKLSAgICAgICAgfSBlbHNlIGlmICghZGVudHJ5LT5kX2lub2RlKSB7Ci0gICAgICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICAgICAgZGVudHJ5ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRlbnRyeSk7CisJCQkJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgIkNyZWF0ZWQgJXMgb24gJXMgLSByZXNlcnZlZCBmb3IgIgorCQkJCQkJCSAieGF0dHIgc3RvcmFnZS4iLAorCQkJCQkJCSBQUklWUk9PVF9OQU1FLAorCQkJCQkJCSByZWlzZXJmc19iZGV2bmFtZQorCQkJCQkJCSAoaW5vZGUtPmlfc2IpKTsKKwkJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlkZW50cnkgPSBOVUxMOworCQkJfQorCQl9IGVsc2UKKwkJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAotICAgICAgaWYgKCFlcnIgJiYgZGVudHJ5KSB7Ci0gICAgICAgICAgcy0+c19yb290LT5kX29wID0gJnhhdHRyX2xvb2t1cF9wb2lzb25fb3BzOwotICAgICAgICAgIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICAgICAgICBSRUlTRVJGU19TQihzKS0+cHJpdl9yb290ID0gZGVudHJ5OwotICAgICAgfSBlbHNlIGlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSkgeyAvKiB4YXR0cnMgYXJlIHVuYXZhaWxhYmxlICovCi0gICAgICAgICAgLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCi0gICAgICAgICAgICogY3JlYXRlZC4gTm90IGFuIGVycm9yIC0tIGp1c3Qgbm8geGF0dHJzIG9uIHRoZSBmcy4gV2UnbGwKLSAgICAgICAgICAgKiBjaGVjayBhZ2FpbiBpZiB3ZSBnbyByZWFkLXdyaXRlICovCi0gICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInhhdHRycy9BQ0xzIGVuYWJsZWQgYW5kIGNvdWxkbid0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZC9jcmVhdGUgLnJlaXNlcmZzX3ByaXYuIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgICB9Ci0gIH0KKwkJaWYgKCFlcnIgJiYgZGVudHJ5KSB7CisJCQlzLT5zX3Jvb3QtPmRfb3AgPSAmeGF0dHJfbG9va3VwX3BvaXNvbl9vcHM7CisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKTsKKwkJCVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QgPSBkZW50cnk7CisJCX0gZWxzZSBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsJLyogeGF0dHJzIGFyZSB1bmF2YWlsYWJsZSAqLworCQkJLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCisJCQkgKiBjcmVhdGVkLiBOb3QgYW4gZXJyb3IgLS0ganVzdCBubyB4YXR0cnMgb24gdGhlIGZzLiBXZSdsbAorCQkJICogY2hlY2sgYWdhaW4gaWYgd2UgZ28gcmVhZC13cml0ZSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgZW5hYmxlZCBhbmQgY291bGRuJ3QgIgorCQkJCQkgImZpbmQvY3JlYXRlIC5yZWlzZXJmc19wcml2LiBGYWlsaW5nIG1vdW50LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCX0KKwl9CiAKLWVycm9yOgotICAgLyogVGhpcyBpcyBvbmx5IG5vbnplcm8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluaXRpYWxpemluZyB0aGUgeGF0dHIKLSAgICAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCi0gICAgaWYgKGVycikgewotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOwotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7Ci0gICAgICAgICAgY2xlYXJfYml0IChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgICB9CisgICAgICBlcnJvcjoKKwkvKiBUaGlzIGlzIG9ubHkgbm9uemVybyBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB4YXR0cgorCSAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCisJaWYgKGVycikgeworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJCWNsZWFyX2JpdChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKwl9CiAKLSAgICAvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLwotICAgIHMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOwotICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAocykpCi0Jcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLworCXMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOworCWlmIChyZWlzZXJmc19wb3NpeGFjbChzKSkKKwkJcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuZWVkX2xvY2spCitfX3JlaXNlcmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkgICAgICBpbnQgbmVlZF9sb2NrKQogewotCXVtb2RlX3QJCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCiAJaWYgKG1hc2sgJiBNQVlfV1JJVEUpIHsKIAkJLyoKQEAgLTEzNjMsNTAgKzEzNjUsNTAgQEAKIAl9CiAKIAkvKiBXZSBkb24ndCBkbyBwZXJtaXNzaW9uIGNoZWNrcyBvbiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4KLQkqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCi0gICAgICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpKQorCSAqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCisJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY3VycmVudC0+ZnN1aWQgPT0gaW5vZGUtPmlfdWlkKSB7CiAJCW1vZGUgPj49IDY7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCX0gZWxzZSBpZiAocmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpICYmCi0gICAgICAgICAgICAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJCSAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCiAJCS8qIEFDTCBjYW4ndCBjb250YWluIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaWYKIAkJICAgdGhlIEFDTF9NQVNLIGVudHJ5IGlzIDAgKi8KIAkJaWYgKCEobW9kZSAmIFNfSVJXWEcpKQogCQkJZ290byBjaGVja19ncm91cHM7CiAKLSAgICAgICAgICAgICAgICBpZiAobmVlZF9sb2NrKSB7Ci0JCSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisJCWlmIChuZWVkX2xvY2spIHsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGlub2RlKTsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOwogCQl9Ci0gICAgICAgICAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRfbG9jaykgewotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLQkJICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwkJaWYgKG5lZWRfbG9jaykgeworCQkJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOwogCQl9Ci0gICAgICAgICAgICAgICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUiAoYWNsKTsKLSAgICAgICAgICAgICAgICB9CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJaWYgKFBUUl9FUlIoYWNsKSA9PSAtRU5PREFUQSkKKwkJCQlnb3RvIGNoZWNrX2dyb3VwczsKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmIChhY2wpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uIChpbm9kZSwgYWNsLCBtYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBQ0NFUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19jYXBhYmlsaXRpZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkJaWYgKGFjbCkgeworCQkJaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJCWlmIChlcnIgPT0gLUVBQ0NFUykgeworCQkJCWdvdG8gY2hlY2tfY2FwYWJpbGl0aWVzOworCQkJfQorCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKIAkJCWdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgIH0KKwkJfQogI2VuZGlmCiAJfSBlbHNlIHsKLWNoZWNrX2dyb3VwczoKKwkgICAgICBjaGVja19ncm91cHM6CiAJCWlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCiAJCQltb2RlID4+PSAzOwogCX0KQEAgLTE0MTQsMTAgKzE0MTYsMTAgQEAKIAkvKgogCSAqIElmIHRoZSBEQUNzIGFyZSBvayB3ZSBkb24ndCBuZWVkIGFueSBjYXBhYmlsaXR5IGNoZWNrLgogCSAqLwotCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEfE1BWV9XUklURXxNQVlfRVhFQykpID09IG1hc2spKQorCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpKSA9PSBtYXNrKSkKIAkJcmV0dXJuIDA7CiAKLWNoZWNrX2NhcGFiaWxpdGllczoKKyAgICAgIGNoZWNrX2NhcGFiaWxpdGllczoKIAkvKgogCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgogCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KQEAgLTE0MzcsMTQgKzE0MzksMTMgQEAKIAlyZXR1cm4gLUVBQ0NFUzsKIH0KIAotaW50Ci1yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0gICAgcmV0dXJuIF9fcmVpc2VyZnNfcGVybWlzc2lvbiAoaW5vZGUsIG1hc2ssIG5kLCAxKTsKKwlyZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBuZCwgMSk7CiB9CiAKIGludAotcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3JlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLSAgICByZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uIChpbm9kZSwgbWFzaywgbmQsIDApOworCXJldHVybiBfX3JlaXNlcmZzX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIG5kLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKaW5kZXggYzMxMjg4MS4uNjcwM2VmYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKQEAgLTksNyArOSw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpOworc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAorCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCk7CiAKIHN0YXRpYyBpbnQKIHhhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKQEAgLTM0LDE0ICszNSwxMyBAQAogCX0gZWxzZQogCQlhY2wgPSBOVUxMOwogCi0JZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgdHlwZSwgYWNsKTsKKwllcnJvciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAKLXJlbGVhc2VfYW5kX291dDoKKyAgICAgIHJlbGVhc2VfYW5kX291dDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBlcnJvcjsKIH0KIAotCiBzdGF0aWMgaW50CiB4YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewpAQCAtNTEsNyArNTEsNyBAQAogCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlhY2wgPSByZWlzZXJmc19nZXRfYWNsIChpbm9kZSwgdHlwZSk7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgdHlwZSk7CiAJaWYgKElTX0VSUihhY2wpKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCWlmIChhY2wgPT0gTlVMTCkKQEAgLTYyLDEyICs2MiwxMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCiAvKgogICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgogICovCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCi1wb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKIAljb25zdCBjaGFyICplbmQgPSAoY2hhciAqKXZhbHVlICsgc2l6ZTsKIAlpbnQgbiwgY291bnQ7CkBAIC03Niw4ICs3NCw4IEBACiAJaWYgKCF2YWx1ZSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKHNpemUgPCBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikpCi0JCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlpZiAoKChyZWlzZXJmc19hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgocmVpc2VyZnNfYWNsX2hlYWRlciAqKSB2YWx1ZSktPmFfdmVyc2lvbiAhPQogCSAgICBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKQEAgLTg5LDQxICs4NywzOSBAQAogCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX05PRlMpOwogCWlmICghYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlmb3IgKG49MDsgbiA8IGNvdW50OyBuKyspIHsKLQkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9Ci0JCQkocmVpc2VyZnNfYWNsX2VudHJ5ICopdmFsdWU7CisJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgdmFsdWU7CiAJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCkgPiBlbmQpCiAJCQlnb3RvIGZhaWw7Ci0JCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnICA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3RhZyk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKIAkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7Ci0JCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgewotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKLQkJCQkJc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCk7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJICAgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUjoKLQkJCWNhc2UgQUNMX0dST1VQOgotCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9Ci0JCQkJCWxlMzJfdG9fY3B1KGVudHJ5LT5lX2lkKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKyBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KTsKKwkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQogCQkJCWdvdG8gZmFpbDsKKwkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCWlmICh2YWx1ZSAhPSBlbmQpCiAJCWdvdG8gZmFpbDsKIAlyZXR1cm4gYWNsOwogCi1mYWlsOgorICAgICAgZmFpbDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTMxLDQ2ICsxMjcsNDYgQEAKIC8qCiAgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkICoKLXBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQorc3RhdGljIHZvaWQgKnBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICogc2l6ZSkKIHsKIAlyZWlzZXJmc19hY2xfaGVhZGVyICpleHRfYWNsOwogCWNoYXIgKmU7CiAJaW50IG47CiAKIAkqc2l6ZSA9IHJlaXNlcmZzX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7Ci0JZXh0X2FjbCA9IChyZWlzZXJmc19hY2xfaGVhZGVyICopa21hbGxvYyhzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKwotCQlhY2wtPmFfY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KSwgR0ZQX05PRlMpOworCWV4dF9hY2wgPSAocmVpc2VyZnNfYWNsX2hlYWRlciAqKSBrbWFsbG9jKHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCisJCQkJCQkgIGFjbC0+YV9jb3VudCAqCisJCQkJCQkgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpLAorCQkJCQkJICBHRlBfTk9GUyk7CiAJaWYgKCFleHRfYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTik7CiAJZSA9IChjaGFyICopZXh0X2FjbCArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKLQlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrKSB7Ci0JCXJlaXNlcmZzX2FjbF9lbnRyeSAqZW50cnkgPSAocmVpc2VyZnNfYWNsX2VudHJ5ICopZTsKLQkJZW50cnktPmVfdGFnICA9IGNwdV90b19sZTE2KGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKTsKKwlmb3IgKG4gPSAwOyBuIDwgYWNsLT5hX2NvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgZTsKKwkJZW50cnktPmVfdGFnID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOwogCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKLQkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7Ci0JCQljYXNlIEFDTF9VU0VSOgotCQkJY2FzZSBBQ0xfR1JPVVA6Ci0JCQkJZW50cnktPmVfaWQgPQotCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKLQkJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWJyZWFrOworCQlzd2l0Y2ggKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZW50cnktPmVfaWQgPSBjcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCWUgKz0gc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJZSArPSBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKLQkJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byBmYWlsOworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCXJldHVybiAoY2hhciAqKWV4dF9hY2w7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCWtmcmVlKGV4dF9hY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTgxLDU5ICsxNzcsNTggQEAKICAqIGlub2RlLT5pX3NlbTogZG93bgogICogQktMIGhlbGQgW2JlZm9yZSAyLjUueF0KICAqLwotc3RydWN0IHBvc2l4X2FjbCAqCi1yZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RydWN0IHBvc2l4X2FjbCAqcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAljaGFyICpuYW1lLCAqdmFsdWU7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCByZXR2YWw7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLSAgICAgICAgICAgICAgICBuYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfZGVmYXVsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FSU5WQUwpOwotICAgICAgICB9CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9hY2Nlc3M7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CiAKLSAgICAgICAgaWYgKElTX0VSUiAoKnBfYWNsKSkgewotICAgICAgICAgICAgaWYgKFBUUl9FUlIgKCpwX2FjbCkgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gcG9zaXhfYWNsX2R1cCAoKnBfYWNsKTsKKwlpZiAoSVNfRVJSKCpwX2FjbCkpIHsKKwkJaWYgKFBUUl9FUlIoKnBfYWNsKSA9PSAtRU5PREFUQSkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCisJCXJldHVybiBwb3NpeF9hY2xfZHVwKCpwX2FjbCk7CiAKLSAgICAgICAgc2l6ZSA9IHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIE5VTEwsIDApOwotICAgICAgICBpZiAoKGludClzaXplIDwgMCkgewotICAgICAgICAgICAgaWYgKHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAtRU5PU1lTKSB7Ci0JCSpwX2FjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoc2l6ZSk7Ci0gICAgICAgIH0KKwlzaXplID0gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBOVUxMLCAwKTsKKwlpZiAoKGludClzaXplIDwgMCkgeworCQlpZiAoc2l6ZSA9PSAtRU5PREFUQSB8fCBzaXplID09IC1FTk9TWVMpIHsKKwkJCSpwX2FjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIEVSUl9QVFIoc2l6ZSk7CisJfQogCi0gICAgICAgIHZhbHVlID0ga21hbGxvYyAoc2l6ZSwgR0ZQX05PRlMpOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9NRU0pOworCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXR2YWwgPSByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKIAlpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAtRU5PU1lTKSB7CiAJCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbiBhcyBpdCBzaG91bGQgaGF2ZQogCQkgICBiZWVuIGNhdWdodCBhYm92ZS4uIGJ1dCBqdXN0IGluIGNhc2UgKi8KIAkJYWNsID0gTlVMTDsKLQkJKnBfYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA8IDApIHsKKwkJKnBfYWNsID0gRVJSX1BUUigtRU5PREFUQSk7CisJfSBlbHNlIGlmIChyZXR2YWwgPCAwKSB7CiAJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKIAl9IGVsc2UgewogCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV9kaXNrKHZhbHVlLCByZXR2YWwpOwotCQkqcF9hY2wgPSBwb3NpeF9hY2xfZHVwIChhY2wpOwotICAgICAgICB9CisJCSpwX2FjbCA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKKwl9CiAKIAlrZnJlZSh2YWx1ZSk7CiAJcmV0dXJuIGFjbDsKQEAgLTI0OCw3MiArMjQzLDcyIEBACiBzdGF0aWMgaW50CiByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7Ci0gICAgICAgIGNoYXIgKm5hbWU7CisJY2hhciAqbmFtZTsKIAl2b2lkICp2YWx1ZSA9IE5VTEw7CiAJc3RydWN0IHBvc2l4X2FjbCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCBlcnJvcjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBpZiAoYWNsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZSAoYWNsLCAmbW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2wgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKLSAgICAgICAgICAgICAgICBwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgICAgICAgICAgICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKwkJaWYgKGFjbCkgeworCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJcmV0dXJuIGVycm9yOworCQkJZWxzZSB7CisJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJaWYgKGVycm9yID09IDApCisJCQkJCWFjbCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gCWlmIChhY2wpIHsKLSAgICAgICAgICAgIHZhbHVlID0gcG9zaXhfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoSVNfRVJSKHZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKLSAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CisJaWYgKGFjbCkgeworCQl2YWx1ZSA9IHBvc2l4X2FjbF90b19kaXNrKGFjbCwgJnNpemUpOworCQlpZiAoSVNfRVJSKHZhbHVlKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIodmFsdWUpOworCQllcnJvciA9IHJlaXNlcmZzX3hhdHRyX3NldChpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOwogCX0gZWxzZSB7Ci0gICAgICAgICAgICBlcnJvciA9IHJlaXNlcmZzX3hhdHRyX2RlbCAoaW5vZGUsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGVycm9yID09IC1FTk9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgc2VlbSBvZGQgaGVyZSwgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIEFDTCB3YXMgc2V0Ci0gICAgICAgICAgICAgICAgICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcwotICAgICAgICAgICAgICAgICAqIGFuIEFDTCBiZWZvcmUsIHJlaXNlcmZzX3hhdHRyX2RlbCBhbHJlYWR5IGRpcnRpZWQgdGhlIGlub2RlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKLSAgICAgICAgICAgICAgICBlcnJvciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJZXJyb3IgPSByZWlzZXJmc194YXR0cl9kZWwoaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyb3IgPT0gLUVOT0RBVEEpIHsKKwkJCS8qIFRoaXMgbWF5IHNlZW0gb2RkIGhlcmUsIGJ1dCBpdCBtZWFucyB0aGF0IHRoZSBBQ0wgd2FzIHNldAorCQkJICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcworCQkJICogYW4gQUNMIGJlZm9yZSwgcmVpc2VyZnNfeGF0dHJfZGVsIGFscmVhZHkgZGlydGllZCB0aGUgaW5vZGUuCisJCQkgKi8KKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQogCiAJaWYgKHZhbHVlKQogCQlrZnJlZSh2YWx1ZSk7CiAKLSAgICAgICAgaWYgKCFlcnJvcikgewotICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLwotICAgICAgICAgICAgaWYgKCFJU19FUlIgKCpwX2FjbCkgJiYgKnBfYWNsKQotICAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqcF9hY2wpOworCWlmICghZXJyb3IpIHsKKwkJLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLworCQlpZiAoIUlTX0VSUigqcF9hY2wpICYmICpwX2FjbCkKKwkJCXBvc2l4X2FjbF9yZWxlYXNlKCpwX2FjbCk7CiAKLSAgICAgICAgICAgIGlmIChhY2wgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfYWNsID0gcG9zaXhfYWNsX2R1cCAoYWNsKTsKLSAgICAgICAgfQorCQlpZiAoYWNsID09IE5VTEwpCisJCQkqcF9hY2wgPSBFUlJfUFRSKC1FTk9EQVRBKTsKKwkJZWxzZQorCQkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCX0KIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTMyMSwxOTIgKzMxNiwxOTAgQEAKIC8qIGRpci0+aV9zZW06IGRvd24sCiAgKiBpbm9kZSBpcyBuZXcgYW5kIG5vdCByZWxlYXNlZCBpbnRvIHRoZSB3aWxkIHlldCAqLwogaW50Ci1yZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQorcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCi0gICAgaWYgKFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQotICAgICAgICByZXR1cm4gMDsKKwkvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogQUNMcyBjYW4gb25seSBiZSB1c2VkIG9uICJuZXciIG9iamVjdHMsIHNvIGlmIGl0J3MgYW4gb2xkIG9iamVjdAotICAgICAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5oZXJpdCBmcm9tICovCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChkaXIpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKKwkvKiBBQ0xzIGNhbiBvbmx5IGJlIHVzZWQgb24gIm5ldyIgb2JqZWN0cywgc28gaWYgaXQncyBhbiBvbGQgb2JqZWN0CisJICogdGhlcmUgaXMgbm90aGluZyB0byBpbmhlcml0IGZyb20gKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PSBTVEFUX0RBVEFfVjEpCisJCWdvdG8gYXBwbHlfdW1hc2s7CiAKLSAgICAvKiBEb24ndCBhcHBseSBBQ0xzIHRvIG9iamVjdHMgaW4gdGhlIC5yZWlzZXJmc19wcml2IHRyZWUuLiBUaGlzCi0gICAgICogd291bGQgYmUgdXNlbGVzcyBzaW5jZSBwZXJtaXNzaW9ucyBhcmUgaWdub3JlZCwgYW5kIGEgcGFpbiBiZWNhdXNlCi0gICAgICogaXQgaW50cm9kdWNlcyBsb2NraW5nIGN5Y2xlcyAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgewotICAgICAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKLSAgICB9CisJLyogRG9uJ3QgYXBwbHkgQUNMcyB0byBvYmplY3RzIGluIHRoZSAucmVpc2VyZnNfcHJpdiB0cmVlLi4gVGhpcworCSAqIHdvdWxkIGJlIHVzZWxlc3Mgc2luY2UgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQsIGFuZCBhIHBhaW4gYmVjYXVzZQorCSAqIGl0IGludHJvZHVjZXMgbG9ja2luZyBjeWNsZXMgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoZGlyKSkgeworCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCQlnb3RvIGFwcGx5X3VtYXNrOworCX0KIAotICAgIGFjbCA9IHJlaXNlcmZzX2dldF9hY2wgKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7Ci0gICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgIGdvdG8gYXBwbHlfdW1hc2s7Ci0gICAgICAgIHJldHVybiBQVFJfRVJSIChhY2wpOwotICAgIH0KKwlhY2wgPSByZWlzZXJmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJaWYgKElTX0VSUihhY2wpKSB7CisJCWlmIChQVFJfRVJSKGFjbCkgPT0gLUVOT0RBVEEpCisJCQlnb3RvIGFwcGx5X3VtYXNrOworCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCX0KIAotICAgIGlmIChhY2wpIHsKLSAgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7Ci0gICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgaW50IG5lZWRfYWNsOworCWlmIChhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7CisJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJaW50IG5lZWRfYWNsOwogCi0gICAgICAgIC8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7Ci0gICAgICAgICAgICBlcnIgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKLSAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisJCS8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWVyciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJfQogCi0gICAgICAgIC8qIE5vdyB3ZSByZWNvbmNpbGUgdGhlIG5ldyBBQ0wgYW5kIHRoZSBtb2RlLAotICAgICAgICAgICBwb3RlbnRpYWxseSBtb2RpZnlpbmcgYm90aCAqLwotICAgICAgICBhY2xfY29weSA9IHBvc2l4X2FjbF9jbG9uZSAoYWNsLCBHRlBfTk9GUyk7Ci0gICAgICAgIGlmICghYWNsX2NvcHkpIHsKLSAgICAgICAgICAgIGVyciA9IC1FTk9NRU07Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KKwkJLyogTm93IHdlIHJlY29uY2lsZSB0aGUgbmV3IEFDTCBhbmQgdGhlIG1vZGUsCisJCSAgIHBvdGVudGlhbGx5IG1vZGlmeWluZyBib3RoICovCisJCWFjbF9jb3B5ID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOworCQlpZiAoIWFjbF9jb3B5KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CiAKKwkJbmVlZF9hY2wgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoYWNsX2NvcHksICZtb2RlKTsKKwkJaWYgKG5lZWRfYWNsID49IDApIHsKKwkJCWlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKKwkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCX0KIAotICAgICAgICBuZWVkX2FjbCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcSAoYWNsX2NvcHksICZtb2RlKTsKLSAgICAgICAgaWYgKG5lZWRfYWNsID49IDApIHsKLSAgICAgICAgICAgIGlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKLSAgICAgICAgICAgICAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKLSAgICAgICAgICAgIH0KKwkJCS8qIElmIHdlIG5lZWQgYW4gQUNMLi4gKi8KKwkJCWlmIChuZWVkX2FjbCA+IDApIHsKKwkJCQllcnIgPQorCQkJCSAgICByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJCQkgICAgIGFjbF9jb3B5KTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGNsZWFudXBfY29weTsKKwkJCX0KKwkJfQorCSAgICAgIGNsZWFudXBfY29weToKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsX2NvcHkpOworCSAgICAgIGNsZWFudXA6CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfSBlbHNlIHsKKwkgICAgICBhcHBseV91bWFzazoKKwkJLyogbm8gQUNMLCBhcHBseSB1bWFzayAqLworCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQogCi0gICAgICAgICAgICAvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCi0gICAgICAgICAgICBpZiAobmVlZF9hY2wgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsX2NvcHkpOwotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9jb3B5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci1jbGVhbnVwX2NvcHk6Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2xfY29weSk7Ci1jbGVhbnVwOgotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKLSAgICB9IGVsc2UgewotYXBwbHlfdW1hc2s6Ci0gICAgICAgIC8qIG5vIEFDTCwgYXBwbHkgdW1hc2sgKi8KLSAgICAgICAgaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogLyogTG9va3MgdXAgYW5kIGNhY2hlcyB0aGUgcmVzdWx0IG9mIHRoZSBkZWZhdWx0IEFDTC4KICAqIFdlIGRvIHRoaXMgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IHRoZSB4YXR0cl9zZW0gaW50bwogICogcmVpc2VyZnNfbmV3X2lub2RlIGlmIHdlIGRvbid0IG5lZWQgdG8gKi8KLWludAotcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitpbnQgcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSkgewotICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICByZXQgPSBhY2wgPyAxIDogMDsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50Ci1yZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0gICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOwotICAgICAgICBpbnQgZXJyb3I7Ci0KLSAgICAgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0JICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCi0gICAgICAgIHsKLQkgICAgcmV0dXJuIDA7CisJaW50IHJldCA9IDA7CisJaWYgKHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSAmJiAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSB7CisJCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCk7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZXQgPSBhY2wgPyAxIDogMDsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAl9CiAKLSAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgaWYgKCFhY2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChJU19FUlIoYWNsKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihhY2wpOwotICAgICAgICBjbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9OT0ZTKTsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLSAgICAgICAgaWYgKCFjbG9uZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0gICAgICAgIGlmICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpbnQgbG9jayA9ICFoYXNfeGF0dHJfZGlyIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2spCi0gICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jaykKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVpc2VyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisJICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmICghYWNsKQorCQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlpZiAoIWNsb25lKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoIWVycm9yKSB7CisJCWludCBsb2NrID0gIWhhc194YXR0cl9kaXIoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlpZiAobG9jaykKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZWxzZQorCQkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWlmIChsb2NrKQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVsc2UKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGlub2RlKTsKKwl9CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludAogcG9zaXhfYWNsX2FjY2Vzc19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKKwkJICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUykgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfYWNjZXNzX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKKwkJICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHhhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgcG9zaXhfYWNsX2FjY2Vzc19kZWwoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwotICAgIHN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKCFJU19FUlIgKCphY2wpICYmICphY2wpIHsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKCphY2wpOwotICAgICAgICAqYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCitwb3NpeF9hY2xfYWNjZXNzX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CkBAIC01MTgsNDggKzUxMSw0OCBAQAogfTsKIAogc3RhdGljIGludAotcG9zaXhfYWNsX2RlZmF1bHRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3Bvc2l4X2FjbF9kZWZhdWx0X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSAtIDEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiB4YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfZGVmYXVsdF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCktMSkKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IHBvc2l4X2FjbF9kZWZhdWx0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7Ci0gICAgc3RydWN0IHBvc2l4X2FjbCAqKmFjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQotCXJldHVybiAtRUlOVkFMOwotICAgIGlmICghSVNfRVJSICgqYWNsKSAmJiAqYWNsKSB7Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqYWNsKTsKLSAgICAgICAgKmFjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQorcG9zaXhfYWNsX2RlZmF1bHRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJICAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyID0gewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMKaW5kZXggZTA0NGQ1MS4uNWU5MGE5NSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl9zZWN1cml0eS5jCkBAIC05LDU3ICs5LDU1IEBACiAjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCAic2VjdXJpdHkuIgogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiByZWlzZXJmc194YXR0cl9zZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNlY3VyaXR5X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXNlY3VyaXR5X2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci1zZWN1cml0eV9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQotewotICAgIGludCBsZW4gPSBuYW1lbGVuOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4ID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5nZXQgPSBzZWN1cml0eV9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKaW5kZXggNDM3NjIxOS4uMjUwMWY3ZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3RydXN0ZWQuYwpAQCAtOSw2OSArOSw2NyBAQAogI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQordHJ1c3RlZF9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJldHVybiByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCi0gICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cnVzdGVkX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQordHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCi0gICAgICAgIHJldHVybiAtRVBFUk07CisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci10cnVzdGVkX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0KLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdHJ1c3RlZF9oYW5kbGVyID0gewogCS5wcmVmaXggPSBYQVRUUl9UUlVTVEVEX1BSRUZJWCwKIAkuZ2V0ID0gdHJ1c3RlZF9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMgYi9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKaW5kZXggMDc3MjgwNi4uNTE0NTgwNCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYwpAQCAtMTMsODEgKzEzLDgwIEBACiAjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKIAogc3RhdGljIGludAotdXNlcl9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit1c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewogCi0gICAgaW50IGVycm9yOworCWludCBlcnJvcjsKIAotICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKKwllcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci11c2VyX3NldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit1c2VyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAKLSAgICBpbnQgZXJyb3I7CisJaW50IGVycm9yOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpICYmCi0gICAgICAgICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICByZXR1cm4gZXJyb3I7CisJZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB1c2VyX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBlcnJvcjsKKworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdXNlcl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit1c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgZXJyb3I7CisJaW50IGxlbiA9IG5hbWVsZW47CisJaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlcihpbm9kZS0+aV9zYikpCisJCXJldHVybiAwOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLQotICAgIGlmICghU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkgJiYKLSAgICAgICAgKCFTX0lTRElSIChpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICBlcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci11c2VyX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0gICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOwotCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciB1c2VyX2hhbmRsZXIgPSB7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAyNWJjMWVjLi42ZTU3ZWUyIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTg0MCw3ICs4NDAsNiBAQAogCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOwogCW1udC0+bW50X21vdW50cG9pbnQgPSBzYi0+c19yb290OwogCW1udC0+bW50X3BhcmVudCA9IG1udDsKLQltbnQtPm1udF9uYW1lc3BhY2UgPSBjdXJyZW50LT5uYW1lc3BhY2U7CiAJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CiAJZnJlZV9zZWNkYXRhKHNlY2RhdGEpOwogCXB1dF9maWxlc3lzdGVtKHR5cGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IGQ3MmMxY2UuLjMzNTI4OGI5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0zLDcgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzkxLDkgKzM5MSw2IEBACiAgKiBzeXNmc191cGRhdGVfZmlsZSAtIHVwZGF0ZSB0aGUgbW9kaWZpZWQgdGltZXN0YW1wIG9uIGFuIG9iamVjdCBhdHRyaWJ1dGUuCiAgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IuCiAgKiBAYXR0cjogYXR0cmlidXRlIGRlc2NyaXB0b3IuCi0gKgotICogQWxzbyBjYWxsIGRub3RpZnkgZm9yIHRoZSBkZW50cnksIHdoaWNoIGxvdHMgb2YgdXNlcnNwYWNlIHByb2dyYW1zCi0gKiB1c2UuCiAgKi8KIGludCBzeXNmc191cGRhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQogewpAQCAtNDA4LDcgKzQwNSw3IEBACiAJCWlmICh2aWN0aW0tPmRfaW5vZGUgJiYgCiAJCSAgICAodmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSA9PSBkaXItPmRfaW5vZGUpKSB7CiAJCQl2aWN0aW0tPmRfaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlkbm90aWZ5X3BhcmVudCh2aWN0aW0sIEROX01PRElGWSk7CisJCQlmc25vdGlmeV9tb2RpZnkodmljdGltKTsKIAogCQkJLyoqCiAJCQkgKiBEcm9wIHJlZmVyZW5jZSBmcm9tIGluaXRpYWwgc3lzZnNfZ2V0X2RlbnRyeSgpLgpkaWZmIC0tZ2l0IGEvZnMvdWRmL25hbWVpLmMgYi9mcy91ZGYvbmFtZWkuYwppbmRleCAzZjZkYzcxLi5hYzE5MWVkIDEwMDY0NAotLS0gYS9mcy91ZGYvbmFtZWkuYworKysgYi9mcy91ZGYvbmFtZWkuYwpAQCAtMTU5LDE0ICsxNTksMTIgQEAKIAljaGFyICpuYW1lcHRyOwogCXVpbnQ4X3QgbGZpOwogCXVpbnQxNl90IGxpdTsKLQlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWxvZmZfdCBzaXplOwogCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CiAJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAKLQlpZiAoIWRpcikKLQkJcmV0dXJuIE5VTEw7Ci0KKwlzaXplID0gKHVkZl9leHQwX29mZnNldChkaXIpICsgZGlyLT5pX3NpemUpID4+IDI7CiAJZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CiAKIAlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IChmX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOwpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggOTNkZWU3MC4uNmFjZDVjNiAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoKQEAgLTU3LDggKzU4LDEwIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKLQkJaWYgKCFlcnJvcikKKwkJaWYgKCFlcnJvcikgeworCQkJZnNub3RpZnlfeGF0dHIoZCk7CiAJCQlzZWN1cml0eV9pbm9kZV9wb3N0X3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKKwkJfQogb3V0OgogCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOwogCX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKaW5kZXggMmI0MWU0Ny4uMmY2YWIxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAogLyogVmVyc2lvbiBzdHJpbmcgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNTAzMDkKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDUwNDA4CiAKIC8qCiAgKiBPUyBuYW1lLCB1c2VkIGZvciB0aGUgX09TIG9iamVjdC4gIFRoZSBfT1Mgb2JqZWN0IGlzIGVzc2VudGlhbGx5IG9ic29sZXRlLApAQCAtMTMwLDkgKzEzMCw4IEBACiAjZGVmaW5lIEFDUElfTUFYX0dQRV9CTE9DS1MgICAgICAgICAgICAgMgogI2RlZmluZSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCAgICAgICAgIDgKIAotLyoKLSAqIE1ldGhvZCBpbmZvIChpbiBXQUxLX1NUQVRFKSwgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZXMgYW5kIGFyZ3VtZXRucwotICovCisvKiBNZXRob2QgaW5mbyAoaW4gV0FMS19TVEFURSksIGNvbnRhaW5pbmcgbG9jYWwgdmFyaWFibGVzIGFuZCBhcmd1bWV0bnMgKi8KKwogI2RlZmluZSBBQ1BJX01FVEhPRF9OVU1fTE9DQUxTICAgICAgICAgIDgKICNkZWZpbmUgQUNQSV9NRVRIT0RfTUFYX0xPQ0FMICAgICAgICAgICA3CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmggYi9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCmluZGV4IDIyM2IyYTUuLjhiYTM3MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaApAQCAtNjEsOSArNjEsNyBAQAogCiAKICNkZWZpbmUgUEFSQU1fTElTVChwbCkgICAgICAgICAgICAgICAgICBwbAotCiAjZGVmaW5lIERCVEVTVF9PVVRQVVRfTEVWRUwobHZsKSAgICAgICAgaWYgKGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlKQotCiAjZGVmaW5lIFZFUkJPU0VfUFJJTlQoZnApICAgICAgICAgICAgICAgREJURVNUX09VVFBVVF9MRVZFTChsdmwpIHtcCiAJCQkgIGFjcGlfb3NfcHJpbnRmIFBBUkFNX0xJU1QoZnApO30KIApAQCAtNzEsMTMgKzY5LDkgQEAKICNkZWZpbmUgRVhfU0lOR0xFX1NURVAgICAgICAgICAgICAgICAgICAyCiAKIAotLyogUHJvdG90eXBlcyAqLwotCi0KIC8qCiAgKiBkYnhmYWNlIC0gZXh0ZXJuYWwgZGVidWdnZXIgaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RiX2luaXRpYWxpemUgKAogCXZvaWQpOwpAQCAtOTIsMjAgKzg2LDEwIEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF90eXBlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfc3RhcnRfY29tbWFuZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLXZvaWQKLWFjcGlfZGJfbWV0aG9kX2VuZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KIAogLyoKICAqIGRiY21kcyAtIGRlYnVnIGNvbW1hbmRzIGFuZCBvdXRwdXQgcm91dGluZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwpAQCAtMTc3LDU3ICsxNjEsMzAgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfYXJnKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X2xvY2tzICh2b2lkKTsKLQorYWNwaV9kYl9kaXNwbGF5X2xvY2tzICgKKwl2b2lkKTsKIAogdm9pZAogYWNwaV9kYl9kaXNwbGF5X3Jlc291cmNlcyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0X2FyZyk7CiAKIHZvaWQKLWFjcGlfZGJfZGlzcGxheV9ncGVzICh2b2lkKTsKK2FjcGlfZGJfZGlzcGxheV9ncGVzICgKKwl2b2lkKTsKIAogdm9pZAogYWNwaV9kYl9jaGVja19pbnRlZ3JpdHkgKAogCXZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9pbnRlZ3JpdHlfd2FsayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kYl93YWxrX2FuZF9tYXRjaF9uYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3dhbGtfZm9yX3JlZmVyZW5jZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGJfd2Fsa19mb3Jfc3BlY2lmaWNfb2JqZWN0cyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCiB2b2lkCiBhY3BpX2RiX2dlbmVyYXRlX2dwZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ3BlX2FyZywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19hcmcpOwogCisKIC8qCiAgKiBkYmRpc3BseSAtIGRlYnVnIGRpc3BsYXkgY29tbWFuZHMKICAqLwotCiB2b2lkCiBhY3BpX2RiX2Rpc3BsYXlfbWV0aG9kX2luZm8gKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKQEAgLTI3MSwxOSArMjI4LDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLXZvaWQKLWFjcGlfZGJfZHVtcF9wYXJzZXJfZGVzY3JpcHRvciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCi12b2lkICoKLWFjcGlfZGJfZ2V0X3BvaW50ZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldCk7Ci0KIAogLyoKICAqIGRiZXhlYyAtIGRlYnVnZ2VyIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbgogICovCi0KIHZvaWQKIGFjcGlfZGJfZXhlY3V0ZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKQEAgLTI5Niw0NCArMjQ0LDE1IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbnVtX2xvb3BzX2FyZywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXRob2RfbmFtZV9hcmcpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9leGVjdXRlX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfZGJfbWV0aG9kX2luZm8gICAgICAqaW5mbywKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXR1cm5fb2JqKTsKLQotdm9pZAotYWNwaV9kYl9leGVjdXRlX3NldHVwICgKLQlzdHJ1Y3QgYWNwaV9kYl9tZXRob2RfaW5mbyAgICAgICppbmZvKTsKLQotdTMyCi1hY3BpX2RiX2dldF9vdXRzdGFuZGluZ19hbGxvY2F0aW9ucyAoCi0Jdm9pZCk7Ci0KLXZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZGJfbWV0aG9kX3RocmVhZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2V4ZWN1dGlvbl93YWxrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KIAogLyoKICAqIGRiZmlsZWlvIC0gRGVidWdnZXIgZmlsZSBJL08gY29tbWFuZHMKICAqLwotCiBhY3BpX29iamVjdF90eXBlCiBhY3BpX2RiX21hdGNoX2FyZ3VtZW50ICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2FyZ3VtZW50LAogCXN0cnVjdCBhcmd1bWVudF9pbmZvICAgICAgICAgICAgKmFyZ3VtZW50cyk7CiAKLWFjcGlfc3RhdHVzCi1hZV9sb2NhbF9sb2FkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOwotCiB2b2lkCiBhY3BpX2RiX2Nsb3NlX2RlYnVnX2ZpbGUgKAogCXZvaWQpOwpAQCAtMzU2LDE2ICsyNzUsMTcgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGUpOwogCisKIC8qCiAgKiBkYmhpc3RyeSAtIGRlYnVnZ2VyIEhJU1RPUlkgY29tbWFuZAogICovCi0KIHZvaWQKIGFjcGlfZGJfYWRkX3RvX2hpc3RvcnkgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbW1hbmRfbGluZSk7CiAKIHZvaWQKLWFjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICh2b2lkKTsKK2FjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICgKKwl2b2lkKTsKIAogY2hhciAqCiBhY3BpX2RiX2dldF9mcm9tX2hpc3RvcnkgKApAQCAtMzc1LDcgKzI5NSw2IEBACiAvKgogICogZGJpbnB1dCAtIHVzZXIgZnJvbnQtZW5kIHRvIHRoZSBBTUwgZGVidWdnZXIKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9kYl9jb21tYW5kX2Rpc3BhdGNoICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dF9idWZmZXIsCkBAIC0zODYsNzEgKzMwNSwyOCBAQAogYWNwaV9kYl9leGVjdXRlX3RocmVhZCAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9oZWxwICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoZWxwX3R5cGUpOwotCi1jaGFyICoKLWFjcGlfZGJfZ2V0X25leHRfdG9rZW4gKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqbmV4dCk7Ci0KLXUzMgotYWNwaV9kYl9nZXRfbGluZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXRfYnVmZmVyKTsKLQotdTMyCi1hY3BpX2RiX21hdGNoX2NvbW1hbmQgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfY29tbWFuZCk7Ci0KLXZvaWQKLWFjcGlfZGJfc2luZ2xlX3RocmVhZCAoCi0Jdm9pZCk7Ci0KIAogLyoKICAqIGRic3RhdHMgLSBHZW5lcmF0aW9uIGFuZCBkaXNwbGF5IG9mIEFDUEkgdGFibGUgc3RhdGlzdGljcwogICovCi0KIHZvaWQKIGFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCwKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21ldGhvZCk7CiAKLQogYWNwaV9zdGF0dXMKIGFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eXBlX2FyZyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2NsYXNzaWZ5X29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotdm9pZAotYWNwaV9kYl9jb3VudF9uYW1lc3BhY2Vfb2JqZWN0cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZW51bWVyYXRlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCiAKIC8qCiAgKiBkYnV0aWxzIC0gQU1MIGRlYnVnZ2VyIHV0aWxpdGllcwogICovCi0KIHZvaWQKIGFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CiAKIHZvaWQKLWFjcGlfZGJfZHVtcF9idWZmZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7Ci0KLXZvaWQKIGFjcGlfZGJfZHVtcF9vYmplY3QgKAogCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwpAQCAtNDU5LDE0ICszMzUsOCBAQAogYWNwaV9kYl9wcmVwX25hbWVzdHJpbmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3NlY29uZF9wYXNzX3BhcnNlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290KTsKLQogc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgogYWNwaV9kYl9sb2NhbF9uc19sb29rdXAgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCi0KICNlbmRpZiAgLyogX19BQ0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAppbmRleCAyNmQ5MDdlLi5kYmZhODc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApAQCAtMTAyLDU4ICsxMDIsMTYgQEAKIC8qCiAgKiBkbXdhbGsKICAqLwotCi12b2lkCi1hY3BpX2RtX3dhbGtfcGFyc2VfdHJlZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYXNsX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgICBkZXNjZW5kaW5nX2NhbGxiYWNrLAotCWFzbF93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICAgYXNjZW5kaW5nX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kbV9kZXNjZW5kaW5nX29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kbV9hc2NlbmRpbmdfb3AgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLQotLyoKLSAqIGRtb3Bjb2RlCi0gKi8KLQotdm9pZAotYWNwaV9kbV92YWxpZGF0ZV9uYW1lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotdTMyCi1hY3BpX2RtX2R1bXBfbmFtZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7Ci0KLXZvaWQKLWFjcGlfZG1fdW5pY29kZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCiB2b2lkCiBhY3BpX2RtX2Rpc2Fzc2VtYmxlICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vcGNvZGVzKTsKIAotdm9pZAotYWNwaV9kbV9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKIAotdm9pZAotYWNwaV9kbV9kaXNwbGF5X3BhdGggKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQorLyoKKyAqIGRtb3Bjb2RlCisgKi8KIHZvaWQKIGFjcGlfZG1fZGlzYXNzZW1ibGVfb25lX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMTY1LDE4ICsxMjMsOSBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKIAogdTMyCi1hY3BpX2RtX2Jsb2NrX3R5cGUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotdTMyCiBhY3BpX2RtX2xpc3RfdHlwZSAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwogCi1hY3BpX3N0YXR1cwotYWNwaV9wc19kaXNwbGF5X29iamVjdF9wYXRobmFtZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHZvaWQKIGFjcGlfZG1fbWV0aG9kX2ZsYWdzICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CkBAIC0xOTcsMTAgKzE0Niw2IEBACiBhY3BpX2RtX21hdGNoX29wICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fbWF0Y2hfa2V5d29yZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCiB1OAogYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlciAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwpAQCAtMjExLDEzICsxNTYsMjUgQEAKIAogCiAvKgotICogZG1vYmplY3QKKyAqIGRtbmFtZXMKICAqLwordTMyCithY3BpX2RtX2R1bXBfbmFtZSAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX3BzX2Rpc3BsYXlfb2JqZWN0X3BhdGhuYW1lICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogdm9pZAotYWNwaV9kbV9kZWNvZGVfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CithY3BpX2RtX25hbWVzdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCisKKy8qCisgKiBkbW9iamVjdAorICovCiB2b2lkCiBhY3BpX2RtX2Rpc3BsYXlfaW50ZXJuYWxfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTI0MSw2ICsxOTgsMTYgQEAKIC8qCiAgKiBkbWJ1ZmZlcgogICovCit2b2lkCithY3BpX2RtX2Rpc2FzbV9ieXRlX2xpc3QgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9kYXRhLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9jb3VudCk7CisKK3ZvaWQKK2FjcGlfZG1fYnl0ZV9saXN0ICgKKwlzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gICAgICAgICppbmZvLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogdm9pZAogYWNwaV9pc19laXNhX2lkICgKQEAgLTI2MiwxOCArMjI5LDYgQEAKIC8qCiAgKiBkbXJlc3JjCiAgKi8KLQotdm9pZAotYWNwaV9kbV9kaXNhc21fYnl0ZV9saXN0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfZGF0YSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfY291bnQpOwotCi12b2lkCi1hY3BpX2RtX2J5dGVfbGlzdCAoCi0Jc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHZvaWQKIGFjcGlfZG1fcmVzb3VyY2VfZGVzY3JpcHRvciAoCiAJc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKQEAgLTI5NiwxOSArMjUxLDEwIEBACiBhY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKTsKIAorCiAvKgogICogZG1yZXNyY2wKICAqLwotCi12b2lkCi1hY3BpX2RtX2lvX2ZsYWdzICgKLQkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotdm9pZAotYWNwaV9kbV9tZW1vcnlfZmxhZ3MgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY19mbGFncyk7Ci0KIHZvaWQKIGFjcGlfZG1fd29yZF9kZXNjcmlwdG9yICgKIAlzdHJ1Y3QgYXNsX3dvcmRfYWRkcmVzc19kZXNjICAgICpyZXNvdXJjZSwKQEAgLTM3Myw3ICszMTksNiBAQAogLyoKICAqIGRtcmVzcmNzCiAgKi8KLQogdm9pZAogYWNwaV9kbV9pcnFfZGVzY3JpcHRvciAoCiAJc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MgICAgICAqcmVzb3VyY2UsCkBAIC00MjAsNyArMzY1LDYgQEAKIC8qCiAgKiBkbXV0aWxzCiAgKi8KLQogdm9pZAogYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCmluZGV4IDIzN2Q2MzQuLjhmNWYyZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCkBAIC01MCw0MCArNTAsOSBAQAogI2RlZmluZSBOQU1FT0ZfQVJHX05URSAgICAgICJfX0EwIgogCiAKLS8qIENvbW1vbiBpbnRlcmZhY2VzICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3AgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wX2NvdW50LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQgKgotYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotI2VuZGlmCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi0KLS8qIGRzb3Bjb2RlIC0gc3VwcG9ydCBmb3IgbGF0ZSBldmFsdWF0aW9uICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCk7Ci0KKy8qCisgKiBkc29wY29kZSAtIHN1cHBvcnQgZm9yIGxhdGUgZXZhbHVhdGlvbgorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwpAQCAtMTAxLDE1ICs3MCw2IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ1ZmZlcl9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9mZnNldF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxlbmd0aF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9kZXNjKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwpAQCAtMTMwLDkgKzkwLDkgQEAKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOwogCiAKLS8qIGRzY3RybCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIGNvbnRyb2wgc3RhY2sgcm91dGluZXMgKi8KLQotCisvKgorICogZHNjdHJsIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgY29udHJvbCBzdGFjayByb3V0aW5lcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCkBAIC0xNDQsOSArMTA0LDkgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKIAotLyogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MgKi8KLQotCisvKgorICogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTE2MiwxNCArMTIyLDkgQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICpzdGF0ZSk7CiAKIAotLyogZHNmaWVsZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgZm9yIEFNTCBmaWVsZHMgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKTsKLQorLyoKKyAqIGRzZmllbGQgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIGZvciBBTUwgZmllbGRzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2NyZWF0ZV9maWVsZCAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCkBAIC0xOTksOCArMTU0LDkgQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogCi0vKiBkc2xvYWQgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlLCBuYW1lc3BhY2UgbG9hZCBjYWxsYmFja3MgKi8KLQorLyoKKyAqIGRzbG9hZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIG5hbWVzcGFjZSBsb2FkIGNhbGxiYWNrcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19sb2FkMV9iZWdpbl9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTIyNSw5ICsxODEsOSBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIpOwogCiAKLS8qIGRzbXRoZGF0IC0gbWV0aG9kIGRhdGEgKGxvY2Fscy9hcmdzKSAqLwotCi0KKy8qCisgKiBkc210aGRhdCAtIG1ldGhvZCBkYXRhIChsb2NhbHMvYXJncykKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKQEAgLTI1MCwxNCArMjA2LDYgQEAKIGFjcGlfZHNfaXNfbWV0aG9kX3ZhbHVlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLSNlbmRpZgotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLApAQCAtMjY1LDEyICsyMTMsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYyk7CiAKLXZvaWQKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCkBAIC0yODgsMTYgKzIzMCwxMCBAQAogYWNwaV9kc19tZXRob2RfZGF0YV9pbml0ICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotCi0vKiBkc21ldGhvZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgLSBjb250cm9sIG1ldGhvZCBwYXJzaW5nICovCi0KKy8qCisgKiBkc21ldGhvZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgLSBjb250cm9sIG1ldGhvZCBwYXJzaW5nCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX3BhcnNlX21ldGhvZCAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlKTsKQEAgLTMyNCwyMCArMjYwLDE4IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2FsbGluZ19tZXRob2Rfbm9kZSk7CiAKIAotLyogZHNvYmogLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIC0gb2JqZWN0IGluaXRpYWxpemF0aW9uIGFuZCBjb252ZXJzaW9uICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQorLyoKKyAqIGRzaW5pdAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSk7CiAKKworLyoKKyAqIGRzb2JqZWN0IC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIG9iamVjdCBpbml0aWFsaXphdGlvbiBhbmQgY29udmVyc2lvbgorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMzUzLDEyICsyODcsNiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTM3Miw4ICszMDAsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogCi0vKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzICovCi0KKy8qCisgKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzCisgKi8KIHZvaWQKIGFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKQEAgLTQxOCw3ICszNDcsNiBAQAogLyoKICAqIGRzd3Njb3BlIC0gU2NvcGUgU3RhY2sgbWFuaXB1bGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKQEAgLTQzNSw3ICszNjMsMTggQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogCi0vKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KKy8qCisgKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcCAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgogYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAoCkBAIC00NTQsMTIgKzM5Myw2IEBACiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0jZW5kaWYKLQogYWNwaV9zdGF0dXMKIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKQEAgLTQ5NCwyMCArNDI3LDggQEAKIGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSAoCiAJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKIAotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZV9jYWNoZSAoCi0Jdm9pZCk7Ci0jZW5kaWYKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfaW5zZXJ0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfcmVzdWx0X3JlbW92ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LApAQCAtNTI5LDQgKzQ1MCwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKKyNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKK3ZvaWQKK2FjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUgKAorCXZvaWQpOworI2VuZGlmCisKICNlbmRpZiAvKiBfQUNESVNQQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggMmRlYzA4My4uNjFhMjdjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKQEAgLTQ1LDYgKzQ1LDkgQEAKICNkZWZpbmUgX19BQ0VWRU5UU19IX18KIAogCisvKgorICogZXZldmVudAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyAoCiAJdm9pZCk7CkBAIC01MywyOCArNTYsMTQgQEAKIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoCiAJdm9pZCk7CiAKLQotLyoKLSAqIEV2Zml4ZWQgLSBGaXhlZCBldmVudCBoYW5kbGluZwotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKAotCXZvaWQpOwotCiB1MzIKIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0ICgKIAl2b2lkKTsKIAotdTMyCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLQogCiAvKgotICogRXZtaXNjCisgKiBldm1pc2MKICAqLwotCiB1OAogYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKQEAgLTEwMCwyNCArODksMTAgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3ZhbHVlKTsKIAotdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiAKIC8qCi0gKiBFdmdwZSAtIEdQRSBoYW5kbGluZyBhbmQgZGlzcGF0Y2gKKyAqIGV2Z3BlIC0gR1BFIGhhbmRsaW5nIGFuZCBkaXNwYXRjaAogICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKAotCUFDUElfR1BFX0NBTExCQUNLICAgICAgIGdwZV93YWxrX2NhbGxiYWNrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi11OAotYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLApAQCAtMTM3LDkgKzExMiwyMyBAQAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOwogCisKKy8qCisgKiBldmdwZWJsaworICovCit1OAorYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKAorCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKKwogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZ3BlX2luaXRpYWxpemUgKAotCXZvaWQpOworYWNwaV9ldl93YWxrX2dwZV9saXN0ICgKKwlBQ1BJX0dQRV9DQUxMQkFDSyAgICAgICBncGVfd2Fsa19jYWxsYmFjaywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyAoCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoCkBAIC0xNTQsMTEgKzE0Myw2IEBACiBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sgKAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7Ci0KIHUzMgogYWNwaV9ldl9ncGVfZGlzcGF0Y2ggKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLApAQCAtMTc3LDEwICsxNjEsMTQgQEAKIGFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKIAotLyoKLSAqIEV2cmVnaW9uIC0gQWRkcmVzcyBTcGFjZSBoYW5kbGluZwotICovCithY3BpX3N0YXR1cworYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CiAKKworLyoKKyAqIGV2cmVnaW9uIC0gQWRkcmVzcyBTcGFjZSBoYW5kbGluZworICovCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoCiAJdm9pZCk7CkBAIC0xOTgsMTMgKzE4Niw2IEBACiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX2V2X2F0dGFjaF9yZWdpb24gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCkBAIC0yMzMsMTcgKzIxNCwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVnX3J1biAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKIAogLyoKLSAqIEV2cmVnaW5pIC0gUmVnaW9uIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cAorICogZXZyZWdpbmkgLSBSZWdpb24gaW5pdGlhbGl6YXRpb24gYW5kIHNldHVwCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLApAQCAtMjkzLDkgKzI2Nyw4IEBACiAKIAogLyoKLSAqIEV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCisgKiBldnNjaSAtIFNDSSAoU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0KSBoYW5kbGluZy9kaXNwYXRjaAogICovCi0KIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRQogYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oIGIvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAppbmRleCA1M2Y4YjUwLi42MGQ3MzdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKIC8qCiAgKiBFeGNlcHRpb25zIHJldHVybmVkIGJ5IGV4dGVybmFsIEFDUEkgaW50ZXJmYWNlcwogICovCi0KICNkZWZpbmUgQUVfQ09ERV9FTlZJUk9OTUVOVEFMICAgICAgICAgICAweDAwMDAKICNkZWZpbmUgQUVfQ09ERV9QUk9HUkFNTUVSICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgQUVfQ09ERV9BQ1BJX1RBQkxFUyAgICAgICAgICAgICAweDIwMDAKQEAgLTk5LDYgKzk4LDcgQEAKIAogI2RlZmluZSBBRV9DT0RFX0VOVl9NQVggICAgICAgICAgICAgICAgIDB4MDAxRQogCisKIC8qCiAgKiBQcm9ncmFtbWVyIGV4Y2VwdGlvbnMKICAqLwpAQCAtMTY4LDYgKzE2OCw3IEBACiAKICNkZWZpbmUgQUVfQ09ERV9BTUxfTUFYICAgICAgICAgICAgICAgICAweDAwMjEKIAorCiAvKgogICogSW50ZXJuYWwgZXhjZXB0aW9ucyB1c2VkIGZvciBjb250cm9sCiAgKi8KQEAgLTE4OCw2ICsxODksNyBAQAogCiAjaWZkZWYgREVGSU5FX0FDUElfR0xPQkFMUwogCisKIC8qCiAgKiBTdHJpbmcgdmVyc2lvbnMgb2YgdGhlIGV4Y2VwdGlvbiBjb2RlcyBhYm92ZQogICogVGhlc2Ugc3RyaW5ncyBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluZXMgZXhhY3RseQpAQCAtMzA0LDUgKzMwNiw0IEBACiAKICNlbmRpZiAvKiBBQ1BJIEdMT0JBTFMgKi8KIAotCiAjZW5kaWYgLyogX19BQ0VYQ0VQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmggYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAppbmRleCBjN2YzODdhLi40OTQ2Njk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaApAQCAtMTQ2LDE1ICsxNDYsMTUgQEAKIEFDUElfRVhURVJOIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQUNTOwogQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgICAgICAgICAgICAgYWNwaV9nYmxfY29tbW9uX2ZBQ1M7CiAvKgotICogU2luY2UgdGhlcmUgbWF5IGJlIG11bHRpcGxlIFNTRFRzIGFuZCBQU0RUUywgYSBzaW5nbGUgcG9pbnRlciBpcyBub3QKKyAqIFNpbmNlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBTU0RUcyBhbmQgUFNEVHMsIGEgc2luZ2xlIHBvaW50ZXIgaXMgbm90CiAgKiBzdWZmaWNpZW50OyBUaGVyZWZvcmUsIHRoZXJlIGlzbid0IG9uZSEKICAqLwogCiAKIC8qCi0gKiBIYW5kbGUgYm90aCBBQ1BJIDEuMCBhbmQgQUNQSSAyLjAgSW50ZWdlciB3aWR0aHMKLSAqIElmIHdlIGFyZSBydW5uaW5nIGEgbWV0aG9kIHRoYXQgZXhpc3RzIGluIGEgMzItYml0IEFDUEkgdGFibGUuCi0gKiBVc2Ugb25seSAzMiBiaXRzIG9mIHRoZSBJbnRlZ2VyIGZvciBjb252ZXJzaW9uLgorICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzOgorICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCB0aGF0IGV4aXN0cyBpbiBhIDMyLWJpdCBBQ1BJIHRhYmxlLAorICogdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIChpbnRlcm5hbCkgNjQtYml0IEludGVnZXIuCiAgKi8KIEFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoOwogQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwpAQCAtMjQ2LDYgKzI0Niw3IEBACiBBQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZWVwZXN0X25lc3Rpbmc7CiAjZW5kaWYKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlcnByZXRlciBnbG9iYWxzCkBAIC0yNjgsNiArMjY5LDcgQEAKIAogQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhhcmR3YXJlIGdsb2JhbHMKQEAgLTI5OCw3ICszMDAsNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIEFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX291dHB1dF9mbGFnczsKIAogI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCkBAIC0zNTMsNSArMzU0LDQgQEAKIAogI2VuZGlmIC8qIEFDUElfREVCVUdHRVIgKi8KIAotCiAjZW5kaWYgLyogX19BQ0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmggYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCmluZGV4IDI4YWQxMzkuLjlkNjM2NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaApAQCAtNDYsMjUgKzQ2LDI5IEBACiAKIAogLyogUE0gVGltZXIgdGlja3MgcGVyIHNlY29uZCAoSFopICovCisKICNkZWZpbmUgUE1fVElNRVJfRlJFUVVFTkNZICAzNTc5NTQ1CiAKKy8qIFZhbHVlcyBmb3IgdGhlIF9TU1QgcmVzZXJ2ZWQgbWV0aG9kICovCisKKyNkZWZpbmUgQUNQSV9TU1RfSU5ESUNBVE9SX09GRiAgMAorI2RlZmluZSBBQ1BJX1NTVF9XT1JLSU5HICAgICAgICAxCisjZGVmaW5lIEFDUElfU1NUX1dBS0lORyAgICAgICAgIDIKKyNkZWZpbmUgQUNQSV9TU1RfU0xFRVBJTkcgICAgICAgMworI2RlZmluZSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUICA0CisKIAogLyogUHJvdG90eXBlcyAqLwogCiAKKy8qCisgKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucworICovCiBhY3BpX3N0YXR1cwogYWNwaV9od19pbml0aWFsaXplICgKIAl2b2lkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfc2h1dGRvd24gKAotCXZvaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19pbml0aWFsaXplX3N5c3RlbV9pbmZvICgKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfaHdfc2V0X21vZGUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CiAKQEAgLTcyLDEyICs3NiwxMCBAQAogYWNwaV9od19nZXRfbW9kZSAoCiAJdm9pZCk7CiAKLXUzMgotYWNwaV9od19nZXRfbW9kZV9jYXBhYmlsaXRpZXMgKAotCXZvaWQpOwogCi0vKiBSZWdpc3RlciBJL08gUHJvdG90eXBlcyAqLwotCisvKgorICogaHdyZWdzIC0gQUNQSSBSZWdpc3RlciBJL08KKyAqLwogc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKgogYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQpOwpAQCAtMTExLDggKzExMyw5IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CiAKIAotLyogR1BFIHN1cHBvcnQgKi8KLQorLyoKKyAqIGh3Z3BlIC0gR1BFIHN1cHBvcnQKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKQEAgLTEzMSwxMiArMTM0LDEyIEBACiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2dldF9ncGVfc3RhdHVzICgKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKIAlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcyAoCkBAIC0xNTUsMTUgKzE1OCwxMSBAQAogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwogCi0KLS8qIEFDUEkgVGltZXIgcHJvdG90eXBlcyAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQorLyoKKyAqIGh3dGltZXIgLSBBQ1BJIFRpbWVyIHByb3RvdHlwZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlc29sdXRpb24pOwpAQCAtMTc3LDYgKzE3Niw3IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aWNrcywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF90aWNrcywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lX2VsYXBzZWQpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKwogCiAjZW5kaWYgLyogX19BQ0hXQVJFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmggYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAppbmRleCBjNTMwMWY1Li41YzcxNzI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaApAQCAtNDgsMzcgKzQ4LDkgQEAKICNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKIAogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jaGVja19vYmplY3RfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRoaXNfdHlwZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOwotCi0vKgotICogZXh4ZmFjZSAtIEV4dGVybmFsIGludGVycHJldGVyIGludGVyZmFjZXMKLSAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX3RhYmxlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZXhlY3V0ZV9tZXRob2QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm1ldGhvZF9ub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmpfZGVzYyk7Ci0KLQogLyoKICAqIGV4Y29udnJ0IC0gb2JqZWN0IGNvbnZlcnNpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMTEwLDE3ICs4MiwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotdTMyCi1hY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7CiAKIC8qCiAgKiBleGZpZWxkIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgbWFuaXB1bGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY29tbW9uX2J1ZmZlcl9zZXR1cCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC0xMjgsNDIgKzkzLDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXR1bV9jb3VudCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc2V0dXBfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfd3JpdGUpOwotCi11OAotYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2ZpZWxkX2RhdHVtX2lvICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWFzaywKQEAgLTE5OCwyOCArMTI3LDMzIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKIAorCiAvKgotICogZXhtaXNjIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gc3BlY2lmaWMgb3Bjb2RlcworICogZXhmbGRpbyAtIGxvdyBsZXZlbCBmaWVsZCBJL08KICAqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9hY2Nlc3NfcmVnaW9uICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLXU4Ci1hY3BpX2V4X2RvX21hdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1hdGNoX29iaik7Ci0KKy8qCisgKiBleG1pc2MgLSBtaXNjIHN1cHBvcnQgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMjI3LDEzICsxNjEsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAqcmV0dXJuX3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzIsCkBAIC0zMDgsMTMgKzIzNSw2IEBACiAvKgogICogZXhjb25maWcgLSBkeW5hbWljIHRhYmxlIGxvYWQvdW5sb2FkCiAgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWRkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGRiX2hhbmRsZSk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2xvYWRfb3AgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMzM0LDcgKzI1NCw2IEBACiAvKgogICogZXhtdXRleCAtIG11dGV4IHN1cHBvcnQKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9hY3F1aXJlX211dGV4ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCkBAIC0zNTQsMTUgKzI3MywxMCBAQAogYWNwaV9leF91bmxpbmtfbXV0ZXggKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKIAotdm9pZAotYWNwaV9leF9saW5rX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOwogCiAvKgotICogZXhwcmVwIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gcHJlcCB1dGlsaXRpZXMKKyAqIGV4cHJlcCAtIEFDUEkgQU1MIGV4ZWN1dGlvbiAtIHByZXAgdXRpbGl0aWVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTM3NSwxMCArMjg5LDEwIEBACiBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUgKAogCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8pOwogCisKIC8qCiAgKiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3N5c3RlbV9kb19ub3RpZnlfb3AgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbHVlLApAQCAtNDIxLDkgKzMzNSw4IEBACiAKIAogLyoKLSAqIGV4bW9uYWRpYyAtIEFDUEkgQU1MIChwLWNvZGUpIGV4ZWN1dGlvbiwgbW9uYWRpYyBvcGVyYXRvcnMKKyAqIGV4b3BhcmcxIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAxIG9wZXJhbmQKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwpAQCAtNDQ1LDkgKzM1OCw4IEBACiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIC8qCi0gKiBleGR5YWRpYyAtIEFDUEkgQU1MIChwLWNvZGUpIGV4ZWN1dGlvbiwgZHlhZGljIG9wZXJhdG9ycworICogZXhvcGFyZzIgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDIgb3BlcmFuZHMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwpAQCAtNDY2LDIxICszNzgsNTYgQEAKIAogCiAvKgotICogZXhyZXNvbHYgIC0gT2JqZWN0IHJlc29sdXRpb24gYW5kIGdldCB2YWx1ZSBmdW5jdGlvbnMKKyAqIGV4b3BhcmczIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAzIG9wZXJhbmRzCiAgKi8KK2FjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV8zQV8wVF8wUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV8zQV8xVF8xUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKworLyoKKyAqIGV4b3Bhcmc2IC0gQUNQSSBBTUwgZXhlY3V0aW9uLCA2IG9wZXJhbmRzCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKworLyoKKyAqIGV4cmVzb2x2IC0gT2JqZWN0IHJlc29sdXRpb24gYW5kIGdldCB2YWx1ZSBmdW5jdGlvbnMKKyAqLworYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvcGVyYW5kLAorCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgKnJldHVybl90eXBlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYyk7CisKKworLyoKKyAqIGV4cmVzbnRlIC0gcmVzb2x2ZSBuYW1lc3BhY2Ugbm9kZQorICovCithY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipzdGFja19wdHIsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKKworLyoKKyAqIGV4cmVzb3AgLSByZXNvbHZlIG9wZXJhbmQgdG8gdmFsdWUKKyAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKAorYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCkBAIC00ODgsNyArNDM1LDYgQEAKIC8qCiAgKiBleGR1bXAgLSBJbnRlcnByZXRlciBkZWJ1ZyBvdXRwdXQgcm91dGluZXMKICAqLwotCiB2b2lkCiBhY3BpX2V4X2R1bXBfb3BlcmFuZCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC01MDQsNyArNDUwLDcgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LApAQCAtNTE0LDQ2ICs0NjAsMTIgQEAKIGFjcGlfZXhfZHVtcF9ub2RlICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKLXZvaWQKLWFjcGlfZXhfb3V0X3N0cmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwotCi12b2lkCi1hY3BpX2V4X291dF9wb2ludGVyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfZXhfb3V0X2ludGVnZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCi12b2lkCi1hY3BpX2V4X291dF9hZGRyZXNzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIHZhbHVlKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKgotICogZXhuYW1lcyAtIGludGVycHJldGVyL3NjYW5uZXIgbmFtZSBsb2FkL2V4ZWN1dGUKKyAqIGV4bmFtZXMgLSBBTUwgbmFtZXN0cmluZyBzdXBwb3J0CiAgKi8KLQotY2hhciAqCi1hY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MpOwotCi11MzIKLWFjcGlfZXhfZ29vZF9jaGFyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlcik7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X25hbWVfc2VnbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmluX2FtbF9hZGRyZXNzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nICgKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGRhdGFfdHlwZSwKQEAgLTU2MSwxNiArNDczLDEwIEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dF9uYW1lX3N0cmluZywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfbmFtZV9sZW5ndGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9kb19uYW1lICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGRhdGFfdHlwZSwKLQlhY3BpX2ludGVycHJldGVyX21vZGUgICAgICAgICAgIGxvYWRfZXhlY19tb2RlKTsKLQogCiAvKgogICogZXhzdG9yZSAtIE9iamVjdCBzdG9yZSBzdXBwb3J0CiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLApAQCAtNTc4LDEyICs0ODQsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCkBAIC01OTMsMTAgKzQ5MywxMCBAQAogI2RlZmluZSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04gICAgICAgIFRSVUUKICNkZWZpbmUgQUNQSV9OT19JTVBMSUNJVF9DT05WRVJTSU9OICAgICBGQUxTRQogCi0vKgotICogZXhzdG9yZW4KLSAqLwogCisvKgorICogZXhzdG9yZW4gLSByZXNvbHZlL3N0b3JlIG9iamVjdAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX29iamVjdCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnNvdXJjZV9kZXNjX3B0ciwKQEAgLTYxMiw5ICs1MTIsOCBAQAogCiAKIC8qCi0gKiBleGNvcHkgLSBvYmplY3QgY29weQorICogZXhzdG9yb2IgLSBzdG9yZSBvYmplY3QgLSBidWZmZXIvc3RyaW5nCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCkBAIC02MjUsNiArNTI0LDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOwogCisKKy8qCisgKiBleGNvcHkgLSBvYmplY3QgY29weQorICovCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jb3B5X2ludGVnZXJfdG9faW5kZXhfZmllbGQgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLApAQCAtNjQ1LDEwICs1NDgsMTAgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7CiAKKwogLyoKICAqIGV4dXRpbHMgLSBpbnRlcnByZXRlci9zY2FubmVyIHV0aWxpdGllcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgKIAl2b2lkKTsKQEAgLTY2OSwxMSArNTcyLDYgQEAKIGFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQpOwogCi11MzIKLWFjcGlfZXhfZGlnaXRzX25lZWRlZCAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOwotCiB2b2lkCiBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNfaWQsCkBAIC02ODgsNyArNTg2LDYgQEAKIC8qCiAgKiBleHJlZ2lvbiAtIGRlZmF1bHQgb3BfcmVnaW9uIGhhbmRsZXJzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggMDFkM2I0Yi4uMDMwZTY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC03Miw3ICs3Miw2IEBACiAgKgogICogTk9URTogYW55IGNoYW5nZXMgaGVyZSBtdXN0IGJlIHJlZmxlY3RlZCBpbiB0aGUgYWNwaV9nYmxfbXV0ZXhfbmFtZXMgdGFibGUgYWxzbyEKICAqLwotCiAjZGVmaW5lIEFDUElfTVRYX0VYRUNVVEUgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBQ1BJX01UWF9JTlRFUlBSRVRFUiAgICAgICAgICAgIDEKICNkZWZpbmUgQUNQSV9NVFhfUEFSU0VSICAgICAgICAgICAgICAgICAyCkBAIC0xNTEsMTMgKzE1MCwxMyBAQAogI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKICNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTmFtZXNwYWNlIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogT3BlcmF0aW9uYWwgbW9kZXMgb2YgdGhlIEFNTCBpbnRlcnByZXRlci9zY2FubmVyICovCiAKIHR5cGVkZWYgZW51bQpAQCAtMTc2LDcgKzE3NSw2IEBACiAgKiBkYXRhX3R5cGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW50ZXJuYWwgZGVzY3JpcHRvcnMsIGFuZCBNVVNUCiAgKiBiZSB0aGUgZmlyc3QgYnl0ZSBpbiB0aGlzIHN0cnVjdHVyZS4KICAqLwotCiB1bmlvbiBhY3BpX25hbWVfdW5pb24KIHsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOwpAQCAtNDE1LDcgKzQxMyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogI2RlZmluZSBBQ1BJX0NPTlRST0xfTk9STUFMICAgICAgICAgICAgICAgICAgMHhDMAogI2RlZmluZSBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HICAgMHhDMQogI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORyAgICAgMHhDMgpAQCAtNDI0LDYgKzQyMSw3IEBACiAKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKwogc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgOwogc3RydWN0IGFjcGlfb2JqX211dGV4OwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgIDsKQEAgLTYwMSw3ICs1OTksNiBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgICAgICAgICAvKiBPcGNvZGUgdHlwZSAqLwogfTsKIAotCiB1bmlvbiBhY3BpX3BhcnNlX3ZhbHVlCiB7CiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjsgICAgICAgIC8qIEludGVnZXIgY29uc3RhbnQgKFVwIHRvIDY0IGJpdHMpICovCkBAIC02MTMsNyArNjEwLDYgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqYXJnOyAgICAgICAgICAgLyogYXJndW1lbnRzIGFuZCBjb250YWluZWQgb3BzICovCiB9OwogCi0KICNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsgICAgICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKQEAgLTY5MSw3ICs2ODcsNiBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX29wX25hbWVbMTJdOwogfTsKIAotCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdAogewogCXN0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24gICAgICAgIGNvbW1vbjsKQEAgLTgzNCw3ICs4MjksNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIHJlc291cmNlX3R5cGUgdmFsdWVzICovCiAKICNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWV9SQU5HRSAgICAgICAgIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKaW5kZXggZmNhY2VkMS4uMDliZTkzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKQEAgLTUzOSwxMSArNTM5LDYgQEAKIAogCiAjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLGIpICAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLGIpCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotI2RlZmluZSBBQ1BJX0RVTVBfVEFCTEVTKGEsYikgICAgICAgICAgIGFjcGlfbnNfZHVtcF90YWJsZXMoYSxiKQotI2VuZGlmCi0KICNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsYixjLGQpICAgICBhY3BpX25zX2R1bXBfcGF0aG5hbWUoYSxiLGMsZCkKICNkZWZpbmUgQUNQSV9EVU1QX1JFU09VUkNFX0xJU1QoYSkgICAgICBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChhKQogI2RlZmluZSBBQ1BJX0RVTVBfQlVGRkVSKGEsYikgICAgICAgICAgIGFjcGlfdXRfZHVtcF9idWZmZXIoKHU4ICopYSxiLERCX0JZVEVfRElTUExBWSxfQ09NUE9ORU5UKQpAQCAtNTk2LDExICs1OTEsNiBAQAogI2RlZmluZSBBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoYSkKICNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsYixjLGQsZSkKICNkZWZpbmUgQUNQSV9EVU1QX0VOVFJZKGEsYikKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0jZGVmaW5lIEFDUElfRFVNUF9UQUJMRVMoYSxiKQotI2VuZGlmCi0KICNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsYixjLGQpCiAjZGVmaW5lIEFDUElfRFVNUF9SRVNPVVJDRV9MSVNUKGEpCiAjZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSxiKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViN2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjbmFtZXMuaCAtIEdsb2JhbCBuYW1lcyBhbmQgc3RyaW5ncworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfX0FDTkFNRVNfSF9fCisjZGVmaW5lIF9fQUNOQU1FU19IX18KKworLyogTWV0aG9kIG5hbWVzIC0gdGhlc2UgbWV0aG9kcyBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBuYW1lc3BhY2UgKi8KKworI2RlZmluZSBNRVRIT0RfTkFNRV9fSElEICAgICAgICAiX0hJRCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0NJRCAgICAgICAgIl9DSUQiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19VSUQgICAgICAgICJfVUlEIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fQURSICAgICAgICAiX0FEUiIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0lOSSAgICAgICAgIl9JTkkiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19TVEEgICAgICAgICJfU1RBIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUkVHICAgICAgICAiX1JFRyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NFRyAgICAgICAgIl9TRUciCisjZGVmaW5lIE1FVEhPRF9OQU1FX19CQk4gICAgICAgICJfQkJOIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJUICAgICAgICAiX1BSVCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0NSUyAgICAgICAgIl9DUlMiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19QUlMgICAgICAgICJfUFJTIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJXICAgICAgICAiX1BSVyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NSUyAgICAgICAgIl9TUlMiCisKKy8qIE1ldGhvZCBuYW1lcyAtIHRoZXNlIG1ldGhvZHMgbXVzdCBhcHBlYXIgYXQgdGhlIG5hbWVzcGFjZSByb290ICovCisKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0JGUyAgICAgICAgIlxcX0JGUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0dUUyAgICAgICAgIlxcX0dUUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1BUUyAgICAgICAgIlxcX1BUUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NTVCAgICAgICAgIlxcX1NJLl9TU1QiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19XQUsgICAgICAgICJcXF9XQUsiCisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KKworI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGICAgICAvKiBVbmtub3duIG5hbWUgaXMgICI/Pz8/IiAqLworI2RlZmluZSBBQ1BJX1JPT1RfTkFNRSAgICAgICAgICAodTMyKSAweDVGNUY1RjVDICAgICAvKiBSb290IG5hbWUgaXMgICAgICJcX19fIiAqLworI2RlZmluZSBBQ1BJX1NZU19CVVNfTkFNRSAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLworCisjZGVmaW5lIEFDUElfTlNfUk9PVF9QQVRIICAgICAgICJcXCIKKyNkZWZpbmUgQUNQSV9OU19TWVNURU1fQlVTICAgICAgIl9TQl8iCisKKworI2VuZGlmICAvKiBfX0FDTkFNRVNfSF9fICAqLworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKaW5kZXggOGIzY2RjMy4uZDFiM2NlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKQEAgLTU3LDE3ICs1Nyw2IEBACiAjZGVmaW5lIEFDUElfTlNfTkVXU0NPUEUgICAgICAgICAgICAxICAgLyogYSBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSBvcGVucyBhIG5hbWUgc2NvcGUgKi8KICNkZWZpbmUgQUNQSV9OU19MT0NBTCAgICAgICAgICAgICAgIDIgICAvKiBzdXBwcmVzcyBzZWFyY2ggb2YgZW5jbG9zaW5nIHNjb3BlcyAqLwogCi0KLS8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KLQotI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAgICAgKHUzMikgMHgzRjNGM0YzRiAgICAgLyogVW5rbm93biBuYW1lIGlzICAiPz8/PyIgKi8KLSNkZWZpbmUgQUNQSV9ST09UX05BTUUgICAgICAgICAgICAgICh1MzIpIDB4NUY1RjVGNUMgICAgIC8qIFJvb3QgbmFtZSBpcyAgICAgIlxfX18iICovCi0jZGVmaW5lIEFDUElfU1lTX0JVU19OQU1FICAgICAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLwotCi0jZGVmaW5lIEFDUElfTlNfUk9PVF9QQVRIICAgICAgICAgICAiXFwiCi0jZGVmaW5lIEFDUElfTlNfU1lTVEVNX0JVUyAgICAgICAgICAiX1NCXyIKLQotCiAvKiBGbGFncyBmb3IgYWNwaV9uc19sb29rdXAsIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAqLwogCiAjZGVmaW5lIEFDUElfTlNfTk9fVVBTRUFSQ0ggICAgICAgICAwCkBAIC04MCwxMCArNjksOSBAQAogI2RlZmluZSBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLICAgICAgRkFMU0UKIAogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19sb2FkX25hbWVzcGFjZSAoCi0Jdm9pZCk7Ci0KKy8qCisgKiBuc2luaXQgLSBOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24KKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzICgKIAl2b2lkKTsKQEAgLTkzLDIzICs4MSwyMiBAQAogCXZvaWQpOwogCiAKLS8qIE5hbWVzcGFjZSBpbml0IC0gbnN4ZmluaXQgKi8KKy8qCisgKiBuc2xvYWQgLSAgTmFtZXNwYWNlIGxvYWRpbmcKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfbnNfbG9hZF9uYW1lc3BhY2UgKAorCXZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9kZXZpY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworYWNwaV9uc19sb2FkX3RhYmxlICgKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwogCiAKKy8qCisgKiBuc3dhbGsgLSB3YWxrIHRoZSBuYW1lc3BhY2UKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKQEAgLTEyNiwzNyArMTEzLDI0IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50LAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkKTsKIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKIAotCi0vKiBOYW1lc3BhY2UgbG9hZGluZyAtIG5zbG9hZCAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Ci0KKy8qCisgKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZworICovCiBhY3BpX3N0YXR1cwogYWNwaV9uc19wYXJzZV90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKTsKK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpOwogCiAKIC8qCi0gKiBUb3AtbGV2ZWwgbmFtZXNwYWNlIGFjY2VzcyAtIG5zYWNjZXNzCisgKiBuc2FjY2VzcyAtIFRvcC1sZXZlbCBuYW1lc3BhY2UgYWNjZXNzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKIAl2b2lkKTsKQEAgLTE3Myw5ICsxNDcsOCBAQAogCiAKIC8qCi0gKiBOYW1lZCBvYmplY3QgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gLSBuc2FsbG9jCisgKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCiAgKi8KLQogc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgogYWNwaV9uc19jcmVhdGVfbm9kZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKQEAgLTE4OSw2ICsxNjIsMTAgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfaGFuZGxlKTsKIAogdm9pZAorYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKKwordm9pZAogYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKIApAQCAtMjAxLDM2ICsxNzgsMTYgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMik7CiAKLXZvaWQKLWFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KIAogLyoKLSAqIE5hbWVzcGFjZSBtb2RpZmljYXRpb24gLSBuc21vZGlmeQorICogbnNkdW1wIC0gTmFtZXNwYWNlIGR1bXAvcHJpbnQgdXRpbGl0aWVzCiAgKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2RlbGV0ZV9zdWJ0cmVlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSk7Ci0jZW5kaWYKLQotCi0vKgotICogTmFtZXNwYWNlIGR1bXAvcHJpbnQgdXRpbGl0aWVzIC0gbnNkdW1wCi0gKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfbnNfZHVtcF90YWJsZXMgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX2Jhc2UsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVwdGgpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogdm9pZAogYWNwaV9uc19kdW1wX2VudHJ5ICgKQEAgLTI0OSwxOSArMjA2LDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50cywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi12b2lkCi1hY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKLQl2b2lkKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKQEAgLTI2OSw3ICsyMTMsNyBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX25zX2R1bXBfb2JqZWN0cyAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLApAQCAtMjc3LDEzICsyMjEsMTIgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmRlcl9pZCwKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAKIC8qCi0gKiBOYW1lc3BhY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMgLSBuc2V2YWwKKyAqIG5zZXZhbCAtIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoCiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CkBAIC0yOTgsNDAgKzI0MSwxNCBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7Ci0KIAogLyoKLSAqIFBhcmVudC9DaGlsZC9QZWVyIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBuc25hbWVzIC0gTmFtZSBhbmQgU2NvcGUgbWFuaXB1bGF0aW9uCiAgKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX25hbWUKLWFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZV90b19zZWFyY2gpOwotI2VuZGlmCi0KLQotLyoKLSAqIE5hbWUgYW5kIFNjb3BlIG1hbmlwdWxhdGlvbiAtIG5zbmFtZXMKLSAqLwotCiB1MzIKIGFjcGlfbnNfb3BlbnNfc2NvcGUgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSk7CiAKLXZvaWQKLWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9idWZmZXIpOwotCiBjaGFyICoKIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKQEAgLTM2Myw5ICsyODAsOCBAQAogCiAKIC8qCi0gKiBPYmplY3QgbWFuYWdlbWVudCBmb3IgbmFtZXNwYWNlIG5vZGVzIC0gbnNvYmplY3QKKyAqIG5zb2JqZWN0IC0gT2JqZWN0IG1hbmFnZW1lbnQgZm9yIG5hbWVzcGFjZSBub2RlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX2F0dGFjaF9vYmplY3QgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCkBAIC0zOTksOSArMzE1LDggQEAKIAogCiAvKgotICogTmFtZXNwYWNlIHNlYXJjaGluZyBhbmQgZW50cnkgLSBuc3NlYXJjaAorICogbnNzZWFyY2ggLSBOYW1lc3BhY2Ugc2VhcmNoaW5nIGFuZCBlbnRyeQogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKQEAgLTQyOCwxNyArMzQzLDEyIEBACiAKIAogLyoKLSAqIFV0aWxpdHkgZnVuY3Rpb25zIC0gbnN1dGlscworICogbnN1dGlscyAtIFV0aWxpdHkgZnVuY3Rpb25zCiAgKi8KLQogdTgKIGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKIAotdTgKLWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwKTsKLQogYWNwaV9vYmplY3RfdHlwZQogYWNwaV9uc19nZXRfdHlwZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CkBAIC01MTEsNSArNDIxLDQgQEAKIGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CiAKLQogI2VuZGlmIC8qIF9fQUNOQU1FU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaCBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCmluZGV4IDAzNjAyM2EuLmUwNzliOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCkBAIC0xMzMsNiArMTMzLDcgQEAKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiB9OwogCisKIC8qCiAgKiBOb3RlOiBUaGUgU3RyaW5nIGFuZCBCdWZmZXIgb2JqZWN0IG11c3QgYmUgaWRlbnRpY2FsIHRocm91Z2ggdGhlIFBvaW50ZXIKICAqIGVsZW1lbnQuICBUaGVyZSBpcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgpAQCAtNDY4LDcgKzQ2OSw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIE9iamVjdCBkZXNjcmlwdG9yIHR5cGVzICovCiAKICNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEICAgICAgICAgICAweDAxICAgICAgICAvKiBVc2VkIG9ubHkgd2hlbiBvYmplY3QgaXMgY2FjaGVkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGVjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaApAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjb3Bjb2RlLmggLSBBTUwgb3Bjb2RlIGluZm9ybWF0aW9uIGZvciB0aGUgQU1MIHBhcnNlciBhbmQgaW50ZXJwcmV0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ09QQ09ERV9IX18KKyNkZWZpbmUgX19BQ09QQ09ERV9IX18KKworI2RlZmluZSBNQVhfRVhURU5ERURfT1BDT0RFICAgICAgICAgMHg4OAorI2RlZmluZSBOVU1fRVhURU5ERURfT1BDT0RFICAgICAgICAgKE1BWF9FWFRFTkRFRF9PUENPREUgKyAxKQorI2RlZmluZSBNQVhfSU5URVJOQUxfT1BDT0RFCisjZGVmaW5lIE5VTV9JTlRFUk5BTF9PUENPREUgICAgICAgICAoTUFYX0lOVEVSTkFMX09QQ09ERSArIDEpCisKKy8qIFVzZWQgZm9yIG5vbi1hc3NpZ25lZCBvcGNvZGVzICovCisKKyNkZWZpbmUgX1VOSyAgICAgICAgICAgICAgICAgICAgICAgIDB4NkIKKworLyoKKyAqIFJlc2VydmVkIEFTQ0lJIGNoYXJhY3RlcnMuICBEbyBub3QgdXNlIGFueSBvZiB0aGVzZSBmb3IKKyAqIGludGVybmFsIG9wY29kZXMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZQorICogbmFtZSBzdHJpbmdzIGZyb20gQU1MIG9wY29kZXMKKyAqLworI2RlZmluZSBfQVNDICAgICAgICAgICAgICAgICAgICAgICAgMHg2QworI2RlZmluZSBfTkFNICAgICAgICAgICAgICAgICAgICAgICAgMHg2QworI2RlZmluZSBfUEZYICAgICAgICAgICAgICAgICAgICAgICAgMHg2RAorCisKKy8qCisgKiBBbGwgQU1MIG9wY29kZXMgYW5kIHRoZSBwYXJzZS10aW1lIGFyZ3VtZW50cyBmb3IgZWFjaC4gIFVzZWQgYnkgdGhlIEFNTAorICogcGFyc2VyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZCBpbnRvIGEgMzItYml0IG51bWJlciBhbmQgc3RvcmVkIGluIHRoZQorICogbWFzdGVyIG9wY29kZSB0YWJsZSAoaW4gcHNvcGNvZGUuYykuCisgKi8KKyNkZWZpbmUgQVJHUF9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1dPUkREQVRBKQorI2RlZmluZSBBUkdQX0FERF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9BTElBU19PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX05BTUVTVFJJTkcsQVJHUF9URVJNQVJHLCAgIEFSR1BfQllURURBVEEsICBBUkdQX0ZJRUxETElTVCkKKyNkZWZpbmUgQVJHUF9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0JZVEVMSVNUKQorI2RlZmluZSBBUkdQX0JZVEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQllURURBVEEpCisjZGVmaW5lIEFSR1BfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0NPUFlfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9TSU1QTEVOQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX0JZVEVfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9GSUVMRF9PUCAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9EQVRBX1JFR0lPTl9PUCAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX0RFUkVGX09GX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9ERVZJQ0VfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9PQkpMSVNUKQorI2RlZmluZSBBUkdQX0RJVklERV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCwgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfRFdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9EV09SRERBVEEpCisjZGVmaW5lIEFSR1BfRUxTRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1MSVNUKQorI2RlZmluZSBBUkdQX0VWRU5UX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9GQVRBTF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX0JZVEVEQVRBLCAgIEFSR1BfRFdPUkREQVRBLCAgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0ZJRUxEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCisjZGVmaW5lIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfSU5DUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHUF9MSVNUNSAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUVTVFJJTkcsICAgIEFSR1BfTkFNRVNUUklORyxBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCisjZGVmaW5lIEFSR1BfSU5ERVhfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0xBTkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xFUVVBTF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xMRVNTX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xOT1RfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MTk9URVFVQUxfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MT0FEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUwyICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDMgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMNCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUw1ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDYgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMNyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9SX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTUFUQ0hfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9NRVRIT0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfTUVUSE9EQ0FMTF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX01JRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfTU9EX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX01VTFRJUExZX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9NVVRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEpCisjZGVmaW5lIEFSR1BfTkFNRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0RBVEFPQkopCisjZGVmaW5lIEFSR1BfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9EQVRBT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9QT1dFUl9SRVNfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1Q1IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfV09SRERBVEEsICBBUkdQX09CSkxJU1QpCisjZGVmaW5lIEFSR1BfUFJPQ0VTU09SX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX0RXT1JEREFUQSwgQVJHUF9CWVRFREFUQSwgIEFSR1BfT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1FXT1JEREFUQSkKKyNkZWZpbmUgQVJHUF9SRUZfT0ZfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9SRUdJT05fT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9SRUxFQVNFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9SRVNFUlZFREZJRUxEX09QICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfUkVTRVRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfU0hJRlRfTEVGVF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1NISUZUX1JJR0hUX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9TSUdOQUxfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9TTEVFUF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfU1RBTExfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1NUQVRJQ1NUUklOR19PUCAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9TVE9SRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1NUUklOR19PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQ0hBUkxJU1QpCisjZGVmaW5lIEFSR1BfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX09CSkxJU1QpCisjZGVmaW5lIEFSR1BfVElNRVJfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9UT19CQ0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RPX0JVRkZFUl9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fREVDX1NUUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9UT19IRVhfU1RSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RPX0lOVEVHRVJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fU1RSSU5HX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RZUEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0RBVEFPQkpMSVNUKQorI2RlZmluZSBBUkdQX1dBSVRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1dISUxFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1MSVNUKQorI2RlZmluZSBBUkdQX1dPUkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfV09SRERBVEEpCisjZGVmaW5lIEFSR1BfWkVST19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKworCisvKgorICogQWxsIEFNTCBvcGNvZGVzIGFuZCB0aGUgcnVudGltZSBhcmd1bWVudHMgZm9yIGVhY2guICBVc2VkIGJ5IHRoZSBBTUwKKyAqIGludGVycHJldGVyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZCBpbnRvIGEgMzItYml0IG51bWJlciBhbmQgc3RvcmVkCisgKiBpbiB0aGUgbWFzdGVyIG9wY29kZSB0YWJsZSAoaW4gcHNvcGNvZGUuYykuCisgKgorICogKFVzZWQgYnkgcHJlcF9vcGVyYW5kcyBwcm9jZWR1cmUgYW5kIHRoZSBBU0wgQ29tcGlsZXIpCisgKi8KKyNkZWZpbmUgQVJHSV9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9NVVRFWCwgICAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfQUREX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0FMSUFTX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSwgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfQlVGRkVSLCAgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9PQkpFQ1RfUkVGLCBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9BTllUWVBFLCAgICBBUkdJX1NJTVBMRV9UQVJHRVQpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX0ZJRUxEX09QICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0RBVEFfUkVHSU9OX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORykKKyNkZWZpbmUgQVJHSV9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCisjZGVmaW5lIEFSR0lfREVSRUZfT0ZfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9SRUZfT1JfU1RSSU5HKQorI2RlZmluZSBBUkdJX0RFVklDRV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9FTFNFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfRVZFTlRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0ZBVEFMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9JTkNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVJfUkVGKQorI2RlZmluZSBBUkdJX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9JTkRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0NPTVBMRVhPQkosIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTEFORF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTEVRVUFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQorI2RlZmluZSBBUkdJX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSkKKyNkZWZpbmUgQVJHSV9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTExFU1NfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQorI2RlZmluZSBBUkdJX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0xPQURfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfUkVHSU9OX09SX0ZJRUxELEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORywgICAgICAgQVJHSV9TVFJJTkcsICAgIEFSR0lfU1RSSU5HLCBBUkdJX0FOWVRZUEUpCisjZGVmaW5lIEFSR0lfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfUEFDS0FHRSwgICAgQVJHSV9JTlRFR0VSLCAgIEFSR0lfQ09NUFVURURBVEEsICAgICAgQVJHSV9JTlRFR0VSLEFSR0lfQ09NUFVURURBVEEsQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX01FVEhPRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9NRVRIT0RDQUxMX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTUlEX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVJfT1JfU1RSSU5HLEFSR0lfSU5URUdFUiwgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9NT0RfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTVVMVElQTFlfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX01VVEVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9OQU1FX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfREVWSUNFX1JFRiwgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9PQkpFQ1RfUkVGKQorI2RlZmluZSBBUkdJX1JFR0lPTl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1JFTEVBU0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfTVVURVgpCisjZGVmaW5lIEFSR0lfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRVZFTlQpCisjZGVmaW5lIEFSR0lfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKKyNkZWZpbmUgQVJHSV9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0RBVEFPQkpFQ1QpCisjZGVmaW5lIEFSR0lfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9EQVRBUkVGT0JKLCBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9USU1FUl9PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX1RPX0JDRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVE9fQlVGRkVSX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19ERUNfU1RSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQorI2RlZmluZSBBUkdJX1RPX0hFWF9TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVE9fSU5URUdFUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19TVFJJTkdfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVFlQRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9BTllUWVBFKQorI2RlZmluZSBBUkdJX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRERCSEFORExFKQorI2RlZmluZSBBUkdJX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0VWRU5ULCAgICAgIEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisKKyNlbmRpZiAvKiBfX0FDT1BDT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAppbmRleCBjMDM5NWVmLi42OTgyNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaApAQCAtNjQsOCArNjQsMTcgQEAKIAogI2RlZmluZSBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QICAgICAgICAgIDB4MDEwMAogCi0vKiBQYXJzZXIgZXh0ZXJuYWwgaW50ZXJmYWNlcyAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUGFyc2VyIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIHBzeGZhY2UgLSBQYXJzZXIgZXh0ZXJuYWwgaW50ZXJmYWNlcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9wc3hfbG9hZF90YWJsZSAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGNvZGVfYWRkciwKQEAgLTc2LDIzICs4NSwxMyBAQAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzZXIgaW50ZXJmYWNlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBwc2FyZ3MgLSBQYXJzZSBBTUwgb3Bjb2RlIGFyZ3VtZW50cyAqLwotCisvKgorICogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKKyAqLwogdTggKgogYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKIAotdTMyCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwotCiBjaGFyICoKIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKQEAgLTExMCwxMCArMTA5LDYgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcsCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCk7CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X25leHRfZmllbGQgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX3BzX2dldF9uZXh0X2FyZyAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTEyMiw4ICsxMTcsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipyZXR1cm5fYXJnKTsKIAogCi0vKiBwc2ZpbmQgKi8KLQorLyoKKyAqIHBzZmluZAorICovCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCiBhY3BpX3BzX2ZpbmRfbmFtZSAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqc2NvcGUsCkBAIC0xMzUsOCArMTMxLDkgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKIAotLyogcHNvcGNvZGUgLSBBTUwgT3Bjb2RlIGluZm9ybWF0aW9uICovCi0KKy8qCisgKiBwc29wY29kZSAtIEFNTCBPcGNvZGUgaW5mb3JtYXRpb24KKyAqLwogY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKgogYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKQEAgLTE0Niw1NiArMTQzLDI1IEBACiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwogCiAKLS8qIHBzcGFyc2UgLSB0b3AgbGV2ZWwgcGFyc2luZyByb3V0aW5lcyAqLwotCi11MzIKLWFjcGlfcHNfZ2V0X29wY29kZV9zaXplICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0KLXZvaWQKLWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9wc19maW5kX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKLQotdm9pZAotYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX2xvb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCisvKgorICogcHNwYXJzZSAtIHRvcCBsZXZlbCBwYXJzaW5nIHJvdXRpbmVzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3BzX3BhcnNlX2FtbCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX3RhYmxlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfc2l6ZSwKLQlhY3BpX3BhcnNlX2Rvd253YXJkcyAgICAgICAgICAgIGRlc2NlbmRpbmdfY2FsbGJhY2ssCi0JYWNwaV9wYXJzZV91cHdhcmRzICAgICAgICAgICAgICBhc2NlbmRpbmdfY2FsbGJhY2ssCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKnJvb3Rfb2JqZWN0KTsKK3UzMgorYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKIAogdTE2CiBhY3BpX3BzX3BlZWtfb3Bjb2RlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpzdGF0ZSk7CiAKIAotLyogcHNzY29wZSAtIFNjb3BlIHN0YWNrIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotCisvKgorICogcHNzY29wZSAtIFNjb3BlIHN0YWNrIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcHNfaW5pdF9zY29wZSAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLApAQCAtMjI4LDggKzE5NCw5IEBACiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqc3RhdGUpOwogCiAKLS8qIHBzdHJlZSAtIHBhcnNlIHRyZWUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzICovCi0KKy8qCisgKiBwc3RyZWUgLSBwYXJzZSB0cmVlIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICovCiB2b2lkCiBhY3BpX3BzX2FwcGVuZF9hcmcoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCkBAIC0yNDcsMjAgKzIxNCwxNyBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ24pOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2NoaWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19nZXRfZGVwdGhfbmV4dCAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3JpZ2luLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIAotLyogcHN3YWxrIC0gcGFyc2UgdHJlZSB3YWxrIHJvdXRpbmVzICovCi0KKy8qCisgKiBwc3dhbGsgLSBwYXJzZSB0cmVlIHdhbGsgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcHNfd2Fsa19wYXJzZWRfYW1sICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzdGFydF9vcCwKQEAgLTI4Myw5ICsyNDcsMTQgQEAKIGFjcGlfcHNfZGVsZXRlX2NvbXBsZXRlZF9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKK3ZvaWQKK2FjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnJvb3QpOwogCi0vKiBwc3V0aWxzIC0gcGFyc2VyIHV0aWxpdGllcyAqLwogCisvKgorICogcHN1dGlscyAtIHBhcnNlciB1dGlsaXRpZXMKKyAqLwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AgKAogCXZvaWQpOwpAQCAtMzAzLDEyICsyNzIsNiBAQAogYWNwaV9wc19mcmVlX29wICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgKLQl2b2lkKTsKLSNlbmRpZgotCiB1OAogYWNwaV9wc19pc19sZWFkaW5nX2NoYXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CkBAIC0zMTcsMjAgKzI4MCwyNyBAQAogYWNwaV9wc19pc19wcmVmaXhfY2hhciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHUzMgogYWNwaV9wc19nZXRfbmFtZSgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB2b2lkCiBhY3BpX3BzX3NldF9uYW1lKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAKKyNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKK3ZvaWQKK2FjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgKKwl2b2lkKTsKKyNlbmRpZgogCi0vKiBwc2R1bXAgLSBkaXNwbGF5IHBhcnNlciB0cmVlICovCiAKKy8qCisgKiBwc2R1bXAgLSBkaXNwbGF5IHBhcnNlciB0cmVlCisgKi8KIHUzMgogYWNwaV9wc19zcHJpbnRfcGF0aCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3N0YXJ0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGkuaCBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKaW5kZXggYWQ1MzI1Mi4uYTY5ZDc4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGkuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaS5oCkBAIC00OSw2ICs0OSw3IEBACiAgKiBXZSBwdXQgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUgdGhlbQogICogaW4gdGhlIHJlc3Qgb2YgdGhlIHNvdXJjZSBjb2RlIGFnYWluIGFuZCBhZ2Fpbi4KICAqLworI2luY2x1ZGUgImFjbmFtZXMuaCIgICAgICAgICAgICAvKiBHbG9iYWwgQUNQSSBuYW1lcyBhbmQgc3RyaW5ncyAqLwogI2luY2x1ZGUgImFjY29uZmlnLmgiICAgICAgICAgICAvKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLwogI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiICAgICAvKiBUYXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaXRlbXMgKi8KICNpbmNsdWRlICJhY3R5cGVzLmgiICAgICAgICAgICAgLyogRnVuZGFtZW50YWwgY29tbW9uIGRhdGEgdHlwZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggYzYyN2JjNC4uOGQwZTEyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTEwOCw2ICsxMDgsMjEgQEAKIHR5cGVkZWYgaW50ICgqYWNwaV9vcF9tYXRjaCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkJCSBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CiAKK3N0cnVjdCBhY3BpX2J1c19vcHMgeworCXUzMiAJCQlhY3BpX29wX2FkZDoxOworCXUzMgkJCWFjcGlfb3BfcmVtb3ZlOjE7CisJdTMyCQkJYWNwaV9vcF9sb2NrOjE7CisJdTMyCQkJYWNwaV9vcF9zdGFydDoxOworCXUzMgkJCWFjcGlfb3Bfc3RvcDoxOworCXUzMgkJCWFjcGlfb3Bfc3VzcGVuZDoxOworCXUzMgkJCWFjcGlfb3BfcmVzdW1lOjE7CisJdTMyCQkJYWNwaV9vcF9zY2FuOjE7CisJdTMyCQkJYWNwaV9vcF9iaW5kOjE7CisJdTMyCQkJYWNwaV9vcF91bmJpbmQ6MTsKKwl1MzIJCQlhY3BpX29wX21hdGNoOjE7CisJdTMyCQkJcmVzZXJ2ZWQ6MjE7Cit9OworCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfb3BzIHsKIAlhY3BpX29wX2FkZAkJYWRkOwogCWFjcGlfb3BfcmVtb3ZlCQlyZW1vdmU7CkBAIC0zMjcsMTUgKzM0MiwzNiBAQAogaW50IGFjcGlfYnVzX3JlY2VpdmVfZXZlbnQgKHN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQpOwogaW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciAoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwogaW50IGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7Ci1pbnQgYWNwaV9idXNfc2NhbiAoc3RydWN0IGFjcGlfZGV2aWNlICpzdGFydCk7CiBpbnQgYWNwaV9idXNfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsCiAJCWFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOworaW50IGFjcGlfYnVzX3N0YXJ0IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIAogaW50IGFjcGlfbWF0Y2hfaWRzIChzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwgY2hhcgkqaWRzKTsKIGludCBhY3BpX2NyZWF0ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogdm9pZCBhY3BpX3JlbW92ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogCisKKy8qCisgKiBCaW5kIHBoeXNpY2FsIGRldmljZXMgd2l0aCBBQ1BJIGRldmljZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorc3RydWN0IGFjcGlfYnVzX3R5cGUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgYnVzX3R5cGUJCSpidXM7CisJLyogRm9yIGdlbmVyYWwgZGV2aWNlcyB1bmRlciB0aGUgYnVzKi8KKwlpbnQgKCpmaW5kX2RldmljZSkoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSopOworCS8qIEZvciBicmlkZ2VzLCBzdWNoIGFzIFBDSSByb290IGJyaWRnZSwgSURFIGNvbnRyb2xsZXIgKi8KKwlpbnQgKCpmaW5kX2JyaWRnZSkoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSAqKTsKK307CitpbnQgcmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqKTsKK2ludCB1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoc3RydWN0IGFjcGlfYnVzX3R5cGUgKik7CitzdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9waHlzaWNhbF9kZXZpY2UoYWNwaV9oYW5kbGUpOworLyogaGVscGVyICovCithY3BpX2hhbmRsZSBhY3BpX2dldF9jaGlsZChhY3BpX2hhbmRsZSwgYWNwaV9pbnRlZ2VyKTsKK2FjcGlfaGFuZGxlIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisjZGVmaW5lIERFVklDRV9BQ1BJX0hBTkRMRShkZXYpICgoYWNwaV9oYW5kbGUpKChkZXYpLT5maXJtd2FyZV9kYXRhKSkKKwogI2VuZGlmIC8qQ09ORklHX0FDUElfQlVTKi8KIAogI2VuZGlmIC8qX19BQ1BJX0JVU19IX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IGM2MmU5MmUuLmNhZWFhNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTY4LDYgKzY4LDcgQEAKIAogc3RydWN0IHBjaV9idXM7CiAKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3BjaV9pZCAoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkKTsKIGludCBhY3BpX3BjaV9iaW5kIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgYWNwaV9wY2lfdW5iaW5kIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgYWNwaV9wY2lfYmluZF9yb290IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CkBAIC0xMDgsNSArMTA5LDEwIEBACiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKTsKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvdCBLZXlzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gaW50IGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQ7CiAKICNlbmRpZiAvKl9fQUNQSV9EUklWRVJTX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDg1N2M4MDcuLmVhNDg5ZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC03OSw3ICs3OSw2IEBACiAvKgogICogT1NMIEluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93biBwcmltaXRpdmVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfaW5pdGlhbGl6ZSAoCiAJdm9pZCk7CkBAIC05Miw3ICs5MSw2IEBACiAvKgogICogQUNQSSBUYWJsZSBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKQEAgLTExMiw3ICsxMTAsNiBAQAogLyoKICAqIFN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdW5pdHMsCkBAIC0xNTYsNyArMTUzLDYgQEAKIC8qCiAgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgbWFwcGluZwogICovCi0KIHZvaWQgKgogYWNwaV9vc19hbGxvY2F0ZSAoCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKQEAgLTE4Nyw3ICsxODMsNiBAQAogLyoKICAqIEludGVycnVwdCBoYW5kbGVycwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpLApAQCAtMjAzLDcgKzE5OCw2IEBACiAvKgogICogVGhyZWFkcyBhbmQgU2NoZWR1bGluZwogICovCi0KIHUzMgogYWNwaV9vc19nZXRfdGhyZWFkX2lkICgKIAl2b2lkKTsKQEAgLTIzNCw3ICsyMjgsNiBAQAogLyoKICAqIFBsYXRmb3JtIGFuZCBoYXJkd2FyZS1pbmRlcGVuZGVudCBJL08gaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX29zX3JlYWRfcG9ydCAoCiAJYWNwaV9pb19hZGRyZXNzICAgICAgICAgICAgICAgICBhZGRyZXNzLApAQCAtMjUxLDcgKzI0NCw2IEBACiAvKgogICogUGxhdGZvcm0gYW5kIGhhcmR3YXJlLWluZGVwZW5kZW50IHBoeXNpY2FsIG1lbW9yeSBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfcmVhZF9tZW1vcnkgKAogCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKQEAgLTI3MCw3ICsyNjIsNiBAQAogICogTm90ZTogQ2FuJ3QgdXNlICJSZWdpc3RlciIgYXMgYSBwYXJhbWV0ZXIsIGNoYW5nZWQgdG8gIlJlZyIgLS0KICAqIGNlcnRhaW4gY29tcGlsZXJzIGNvbXBsYWluLgogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKAogCXN0cnVjdCBhY3BpX3BjaV9pZCAgICAgICAgICAgICAgKnBjaV9pZCwKQEAgLTI4OCw3ICsyNzksNiBAQAogLyoKICAqIEludGVyaW0gZnVuY3Rpb24gbmVlZGVkIGZvciBQQ0kgSVJRIHJvdXRpbmcKICAqLwotCiB2b2lkCiBhY3BpX29zX2Rlcml2ZV9wY2lfaWQoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICByaGFuZGxlLApAQCAtMjk4LDcgKzI4OCw2IEBACiAvKgogICogTWlzY2VsbGFuZW91cwogICovCi0KIHU4CiBhY3BpX29zX3JlYWRhYmxlICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyLApAQCAtMzIzLDcgKzMxMiw2IEBACiAvKgogICogRGVidWcgcHJpbnQgcm91dGluZXMKICAqLwotCiB2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCiBhY3BpX29zX3ByaW50ZiAoCiAJY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LApAQCAtMzM5LDExICszMjcsMTAgQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbik7CiAKIAorI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKgogICogRGVidWcgaW5wdXQKICAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIHUzMgogYWNwaV9vc19nZXRfbGluZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyKTsKQEAgLTM1Myw3ICszNDAsNiBAQAogLyoKICAqIERpcmVjdG9yeSBtYW5pcHVsYXRpb24KICAqLwotCiB2b2lkICoKIGFjcGlfb3Nfb3Blbl9kaXJlY3RvcnkgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLApAQCAtMzc3LDcgKzM2Myw2IEBACiAvKgogICogRGVidWcKICAqLwotCiB2b2lkCiBhY3BpX29zX2RiZ19hc3NlcnQoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmFpbGVkX2Fzc2VydGlvbiwKQEAgLTM4NSw1ICszNzAsNCBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CiAKLQogI2VuZGlmIC8qIF9fQUNQSU9TWEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggMDBkNzhiNy4uZjhmNjE5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNTAsMTAgKzUwLDkgQEAKICNpbmNsdWRlICJhY3RibC5oIgogCiAKLSAvKgorLyoKICAqIEdsb2JhbCBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0gKAogCXZvaWQpOwpAQCAtMTA2LDkgKzEwNSw4IEBACiAjZW5kaWYKIAogLyoKLSAqIEFDUEkgTWVtb3J5IG1hbmFnZXIKKyAqIEFDUEkgTWVtb3J5IG1hbmFnbWVudAogICovCi0KIHZvaWQgKgogYWNwaV9hbGxvY2F0ZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKQEAgLTEyNSw3ICsxMjMsNiBAQAogLyoKICAqIEFDUEkgdGFibGUgbWFuaXB1bGF0aW9uIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9maW5kX3Jvb3RfcG9pbnRlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKQEAgLTE2OCw3ICsxNjUsNiBAQAogLyoKICAqIE5hbWVzcGFjZSBhbmQgbmFtZSBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfd2Fsa19uYW1lc3BhY2UgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKQEAgLTIxOCw3ICsyMTQsNiBAQAogLyoKICAqIE9iamVjdCBtYW5pcHVsYXRpb24gYW5kIGVudW1lcmF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZhbHVhdGVfb2JqZWN0ICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKQEAgLTI2Miw3ICsyNTcsNiBAQAogLyoKICAqIEV2ZW50IGhhbmRsZXIgaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2V2ZW50LApAQCAtMzE5LDcgKzMxMyw2IEBACiAvKgogICogRXZlbnQgaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKQEAgLTQwNCw3ICszOTcsNiBAQAogLyoKICAqIFJlc291cmNlIGludGVyZmFjZXMKICAqLwotCiB0eXBlZGVmCiBhY3BpX3N0YXR1cyAoKkFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSykgKAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKnJlc291cmNlLApAQCAtNDQ4LDcgKzQ0MCw2IEBACiAvKgogICogSGFyZHdhcmUgKEFDUEkgZGV2aWNlKSBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X3JlZ2lzdGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaCBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKaW5kZXggOTNjNTVmZi4uZWQ2NzkyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCkBAIC00OCw3ICs0OCw2IEBACiAvKgogICogIEZ1bmN0aW9uIHByb3RvdHlwZXMgY2FsbGVkIGZyb20gQWNwaSogQVBJcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLApAQCAtNjAsMTIgKzU5LDEyIEBACiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCiAJc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKLSNlbmRpZgorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2dldF9tZXRob2RfZGF0YSAoCkBAIC05NSw2MSArOTQsOSBAQAogCiAKIC8qCi0gKiBGdW5jdGlvbiBwcm90b3R5cGVzIGNhbGxlZCBmcm9tIGFjcGlfcnNfY3JlYXRlKgorICogcnNkdW1wCiAgKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZAotYWNwaV9yc19kdW1wX2lycSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzMTYgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3M2NCAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9kbWEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2ZpeGVkX2lvICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX21lbW9yeTI0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX21lbW9yeTMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdCAoCiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqcmVzb3VyY2UpOwpAQCAtMTU3LDggKzEwNCwxMiBAQAogdm9pZAogYWNwaV9yc19kdW1wX2lycV9saXN0ICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyb3V0ZV90YWJsZSk7Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCisKKy8qCisgKiByc2NhbGMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX3N0YXJ0ICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaCBiL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCmluZGV4IGM5Nzg0M2YuLmU2YjllMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCkBAIC01Niw3ICs1Niw2IEBACiAgKiBXYWxrIHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiBhIHBhcnNlIHRyZWUgd2Fsay4gIFVzZWQgZm9yIGJvdGggYSBsZWlzdXJlbHkgc3Ryb2xsIHRocm91Z2gKICAqIHRoZSB0cmVlIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgYW5kIGZvciBjb250cm9sIG1ldGhvZCBleGVjdXRpb24uCiAgKi8KLQogI2RlZmluZSBBQ1BJX05FWFRfT1BfRE9XTldBUkQgICAgICAgMQogI2RlZmluZSBBQ1BJX05FWFRfT1BfVVBXQVJEICAgICAgICAgMgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCmluZGV4IGU4ZjVkNGYuLjM5ZGY5MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCkBAIC01MCwxNyArNTAsOSBAQAogI2RlZmluZSBTSVpFX0lOX0hFQURFUiAgICAgICAgICAwCiAKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0ICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKip0YWJsZV9kZXNjKTsKLSNlbmRpZgotCiAvKgogICogdGJjb252cnQgLSBUYWJsZSBjb252ZXJzaW9uIHJvdXRpbmVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdGJfY29udmVydF90b194c2R0ICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKQEAgLTc4LDEwICs3MCwxMCBAQAogCXN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgICAgICAgICAgKlJTRFAsCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqUlNEVCk7CiAKKwogLyoKICAqIHRiZ2V0IC0gVGFibGUgImdldCIgcm91dGluZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9nZXRfdGFibGUgKAogCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCkBAIC05OSwxNyArOTEsNiBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3RhYmxlX292ZXJyaWRlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF90YWJsZV9wdHIgKAogCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLApAQCAtMTI3LDM2ICsxMDgsMjMgQEAKIGFjcGlfdGJfdmFsaWRhdGVfcnNkdCAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfcHRyKTsKIAorCisvKgorICogdGJnZXRhbGwgLSBnZXQgbXVsdGlwbGUgcmVxdWlyZWQgdGFibGVzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMgKAogCXZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKIAogLyoKICAqIHRiaW5zdGFsbCAtIFRhYmxlIGluc3RhbGxhdGlvbgogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2luc3RhbGxfdGFibGUgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3R5cGUpOwotCi1hY3BpX3N0YXR1cwogYWNwaV90Yl9yZWNvZ25pemVfdGFibGUgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSk7CkBAIC0xNzAsNyArMTM4LDYgQEAKIC8qCiAgKiB0YnJlbW92ZSAtIFRhYmxlIHJlbW92YWwgYW5kIGRlbGV0aW9uCiAgKi8KLQogdm9pZAogYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAoCiAJdm9pZCk7CkBAIC0xODksMjggKzE1Niw4IEBACiAKIAogLyoKLSAqIHRicnNkIC0gUlNEUCwgUlNEVCB1dGlsaXRpZXMKKyAqIHRieGZyb290IC0gUlNEUCwgUlNEVCB1dGlsaXRpZXMKICAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfcnNkdCAoCi0Jdm9pZCk7Ci0KLXU4ICoKLWFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3JzZHAgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KLQotLyoKLSAqIHRidXRpbHMgLSBjb21tb24gdGFibGUgdXRpbGl0aWVzCi0gKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdGJfZmluZF90YWJsZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLApAQCAtMjE5LDYgKzE2NiwxNCBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZV9wdHIpOwogCiBhY3BpX3N0YXR1cworYWNwaV90Yl9nZXRfdGFibGVfcnNkdCAoCisJdm9pZCk7CisKKworLyoKKyAqIHRidXRpbHMgLSBjb21tb24gdGFibGUgdXRpbGl0aWVzCisgKi8KK2FjcGlfc3RhdHVzCiBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKTsKIApAQCAtMjMxLDUgKzE4Niw0IEBACiBhY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKTsKIAotCiAjZW5kaWYgLyogX19BQ1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibC5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKaW5kZXggN2VlZTczMS4uYjVjZGNjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKQEAgLTEzMyw3ICsxMzMsNiBAQAogI2RlZmluZSBEVUFMX1BJQyAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1VTFRJUExFX0FQSUMgICAgICAgICAgIDEKIAotCiAvKiBNYXN0ZXIgTUFEVCAqLwogCiBzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZQpAQCAtMTQ0LDcgKzE0Myw2IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgOiAzMTsKIH07CiAKLQogLyogVmFsdWVzIGZvciBUeXBlIGluIEFQSUNfSEVBREVSX0RFRiAqLwogCiAjZGVmaW5lIEFQSUNfUFJPQ0VTU09SICAgICAgICAgIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDdhY2I1NTAuLjNhNDUxZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNDc4LDcgKzQ3OCw2IEBACiAjZGVmaW5lIEFDUElfVFlQRV9JTlZBTElEICAgICAgICAgICAgICAgMHgxRQogI2RlZmluZSBBQ1BJX1RZUEVfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKIAotCiAvKgogICogQml0bWFwcGVkIEFDUEkgdHlwZXMuICBVc2VkIGludGVybmFsbHkgb25seQogICovCkBAIC04MDMsNyArODAyLDYgQEAKIC8qCiAgKiBUeXBlcyBzcGVjaWZpYyB0byB0aGUgT1Mgc2VydmljZSBpbnRlcmZhY2VzCiAgKi8KLQogdHlwZWRlZiB1MzIKIChBQ1BJX1NZU1RFTV9YRkFDRSAqYWNwaV9vc2RfaGFuZGxlcikgKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaCBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKaW5kZXggMGRlMjZiOC4uMTkyZDBiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCkBAIC01MiwxMyArNTIsNiBAQAogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YXJnZXRfb2JqZWN0LAotCWFjcGlfcGtnX2NhbGxiYWNrICAgICAgICAgICAgICAgd2Fsa19jYWxsYmFjaywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQogc3RydWN0IGFjcGlfcGtnX2luZm8KIHsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmcmVlX3NwYWNlOwpAQCAtNzksMzcgKzcyLDEzIEBACiAjZGVmaW5lIERCX1FXT1JEX0RJU1BMQVkgICAgOAogCiAKLS8qIEdsb2JhbCBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2VzICovCi0KKy8qCisgKiB1dGdsb2JhbCAtIEdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb2NlZHVyZXMKKyAqLwogdm9pZAogYWNwaV91dF9pbml0X2dsb2JhbHMgKAogCXZvaWQpOwogCi12b2lkCi1hY3BpX3V0X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KLQotLyoKLSAqIHV0X2luaXQgLSBtaXNjZWxsYW5lb3VzIGluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93bgotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2hhcmR3YXJlX2luaXRpYWxpemUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAoCi0Jdm9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3ZhbGlkYXRlX2ZhZHQgKAotCXZvaWQpOwotCi0vKgotICogdXRfZ2xvYmFsIC0gR2xvYmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcwotICovCi0KICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAKIGNoYXIgKgpAQCAtMTU3LDkgKzEyNiwyNCBAQAogCiAKIC8qCi0gKiB1dF9jbGliIC0gTG9jYWwgaW1wbGVtZW50YXRpb25zIG9mIEMgbGlicmFyeSBmdW5jdGlvbnMKKyAqIHV0aW5pdCAtIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCiAgKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X2hhcmR3YXJlX2luaXRpYWxpemUgKAorCXZvaWQpOwogCit2b2lkCithY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAoCisJdm9pZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3ZhbGlkYXRlX2ZhZHQgKAorCXZvaWQpOworCisKKy8qCisgKiB1dGNsaWIgLSBMb2NhbCBpbXBsZW1lbnRhdGlvbnMgb2YgQyBsaWJyYXJ5IGZ1bmN0aW9ucworICovCiAjaWZuZGVmIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQogCiBhY3BpX3NpemUKQEAgLTI2MCwxMCArMjQ0LDEwIEBACiAKICNlbmRpZiAvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KIAotLyoKLSAqIHV0X2NvcHkgLSBPYmplY3QgY29uc3RydWN0aW9uIGFuZCBjb252ZXJzaW9uIGludGVyZmFjZXMKLSAqLwogCisvKgorICogdXRjb3B5IC0gT2JqZWN0IGNvbnN0cnVjdGlvbiBhbmQgY29udmVyc2lvbiBpbnRlcmZhY2VzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2J1aWxkX3NpbXBsZV9vYmplY3QoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLApAQCAtMjc4LDMwICsyNjIsMTEgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCiAJc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKAotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnVzZXJfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fb2JqKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QgKAogCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKm9iaiwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqaW50ZXJuYWxfb2JqKTsKQEAgLTMxMiwxNyArMjc3LDYgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9vYmosCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipkZXN0X2Rlc2MsCkBAIC0zMzAsOSArMjg0LDggQEAKIAogCiAvKgotICogdXRfY3JlYXRlIC0gT2JqZWN0IGNyZWF0aW9uCisgKiB1dGNyZWF0ZSAtIE9iamVjdCBjcmVhdGlvbgogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCkBAIC0zNDAsOSArMjkzLDggQEAKIAogCiAvKgotICogdXRfZGVidWcgLSBEZWJ1ZyBpbnRlcmZhY2VzCisgKiB1dGRlYnVnIC0gRGVidWcgaW50ZXJmYWNlcwogICovCi0KIHZvaWQKIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UgKAogCXZvaWQpOwpAQCAtNDQwLDExICszOTIsMTQgQEAKIAogCiAvKgotICogdXRfZGVsZXRlIC0gT2JqZWN0IGRlbGV0aW9uCisgKiB1dGRlbGV0ZSAtIE9iamVjdCBkZWxldGlvbiBhbmQgcmVmZXJlbmNlIGNvdW50cwogICovCit2b2lkCithY3BpX3V0X2FkZF9yZWZlcmVuY2UgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7CiAKIHZvaWQKLWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaiAoCithY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7CiAKIHZvaWQKQEAgLTQ2MSwyNSArNDE2LDggQEAKIAogCiAvKgotICogdXRfZXZhbCAtIG9iamVjdCBldmFsdWF0aW9uCisgKiB1dGV2YWwgLSBvYmplY3QgZXZhbHVhdGlvbgogICovCi0KLS8qIE1ldGhvZCBuYW1lIHN0cmluZ3MgKi8KLQotI2RlZmluZSBNRVRIT0RfTkFNRV9fSElEICAgICAgICAiX0hJRCIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX0NJRCAgICAgICAgIl9DSUQiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19VSUQgICAgICAgICJfVUlEIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQURSICAgICAgICAiX0FEUiIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1NUQSAgICAgICAgIl9TVEEiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19SRUcgICAgICAgICJfUkVHIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fU0VHICAgICAgICAiX1NFRyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX0JCTiAgICAgICAgIl9CQk4iCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19QUlQgICAgICAgICJfUFJUIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQ1JTICAgICAgICAiX0NSUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BSUyAgICAgICAgIl9QUlMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19QUlcgICAgICAgICJfUFJXIgotCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbiAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CkBAIC01MjIsMzkgKzQ2MCwxMCBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRldmljZV9ub2RlLAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhpZ2hlc3QpOwogCi0vKgotICogdXRfbXV0ZXggLSBtdXR1YWwgZXhjbHVzaW9uIGludGVyZmFjZXMKLSAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9tdXRleF9pbml0aWFsaXplICgKLQl2b2lkKTsKLQotdm9pZAotYWNwaV91dF9tdXRleF90ZXJtaW5hdGUgKAotCXZvaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jcmVhdGVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9kZWxldGVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9hY3F1aXJlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfcmVsZWFzZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KIAogLyoKLSAqIHV0X29iamVjdCAtIGludGVybmFsIG9iamVjdCBjcmVhdGUvZGVsZXRlL2NhY2hlIHJvdXRpbmVzCisgKiB1dG9iamVjdCAtIGludGVybmFsIG9iamVjdCBjcmVhdGUvZGVsZXRlL2NhY2hlIHJvdXRpbmVzCiAgKi8KLQogdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqCiBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKQEAgLTU4Nyw1MCArNDk2LDE1IEBACiBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zaXplKTsKIAotCi0vKgotICogdXRfcmVmX2NudCAtIE9iamVjdCByZWZlcmVuY2UgY291bnQgbWFuYWdlbWVudAotICovCi0KLXZvaWQKLWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKLQotdm9pZAotYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwotCi0vKgotICogdXRfc2l6ZSAtIE9iamVjdCBzaXplIHJvdXRpbmVzCi0gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOwotCiBhY3BpX3N0YXR1cwogYWNwaV91dF9nZXRfb2JqZWN0X3NpemUoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQogCiAvKgotICogdXRfc3RhdGUgLSBHZW5lcmljIHN0YXRlIGNyZWF0aW9uL2NhY2hlIHJvdXRpbmVzCisgKiB1dHN0YXRlIC0gR2VuZXJpYyBzdGF0ZSBjcmVhdGlvbi9jYWNoZSByb3V0aW5lcwogICovCi0KIHZvaWQKIGFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlICgKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqbGlzdF9oZWFkLApAQCAtNjY2LDE0ICs1NDAsMTQgQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqc3RhdGVfbGlzdCk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKnN0YXRlX2xpc3QpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKIGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUgKApAQCAtNjkzLDE1ICs1NjcsMTAgQEAKIAl2b2lkKTsKICNlbmRpZgogCisKIC8qCi0gKiB1dG1pc2MKKyAqIHV0bWF0aAogICovCi0KLXZvaWQKLWFjcGlfdXRfcHJpbnRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfZGl2aWRlICgKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2RpdmlkZW5kLApAQCAtNzE2LDYgKzU4NSwyNSBAQAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9xdW90aWVudCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfcmVtYWluZGVyKTsKIAorLyoKKyAqIHV0bWlzYworICovCithY3BpX3N0YXR1cworYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YXJnZXRfb2JqZWN0LAorCWFjcGlfcGtnX2NhbGxiYWNrICAgICAgICAgICAgICAgd2Fsa19jYWxsYmFjaywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKworY2hhciAqCithY3BpX3V0X3N0cnVwciAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZyk7CisKK3ZvaWQKK2FjcGlfdXRfcHJpbnRfc3RyaW5nICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKKwogdTgKIGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwpAQCAtNzM0LDExICs2MjIsMjEgQEAKIAogI2RlZmluZSBBQ1BJX0FOWV9CQVNFICAgICAgICAwCiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotY2hhciAqCi1hY3BpX3V0X3N0cnVwciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZyk7Ci0jZW5kaWYKK2FjcGlfc3RhdHVzCithY3BpX3V0X211dGV4X2luaXRpYWxpemUgKAorCXZvaWQpOworCit2b2lkCithY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoCisJdm9pZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2FjcXVpcmVfbXV0ZXggKAorCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOworCithY3BpX3N0YXR1cworYWNwaV91dF9yZWxlYXNlX211dGV4ICgKKwlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKIAogdTggKgogYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyAoCkBAIC03NjgsOSArNjY2LDggQEAKIAogCiAvKgotICogVXRhbGxvYyAtIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBvYmplY3QgY2FjaGluZworICogdXRhbGxvYyAtIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBvYmplY3QgY2FjaGluZwogICovCi0KIHZvaWQgKgogYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCk7CkBAIC03OTUsOSArNjkyLDYgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGgpOwogCi0KLS8qIE1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyAqLwotCiB2b2lkICoKIGFjcGlfdXRfYWxsb2NhdGUgKAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKQEAgLTgxMiw5ICs3MDYsNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwogCi0KICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotCiB2b2lkICoKIGFjcGlfdXRfYWxsb2NhdGVfYW5kX3RyYWNrICgKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCkBAIC04MzYsMzQgKzcyOCwxMSBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgotYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICphZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdm9pZAogYWNwaV91dF9kdW1wX2FsbG9jYXRpb25faW5mbyAoCiAJdm9pZCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB2b2lkCiBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnMgKApAQCAtODcxLDUgKzc0MCw0IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlKTsKICNlbmRpZgogCi0KICNlbmRpZiAvKiBfQUNVVElMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAppbmRleCAyZWM1MzhlLi41NWU5N2VkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKQEAgLTE0Niw4ICsxNDYsNyBAQAogCiAvKiBwcmVmaXhlZCBvcGNvZGVzICovCiAKLSNkZWZpbmUgQU1MX0VYVE9QICAgICAgICAgICAgICAgICAgICh1MTYpIDB4MDA1YgotCisjZGVmaW5lIEFNTF9FWFRPUCAgICAgICAgICAgICAgICAgICAodTE2KSAweDAwNWIgICAgIC8qIHByZWZpeCBmb3IgMi1ieXRlIG9wY29kZXMgKi8KIAogI2RlZmluZSBBTUxfTVVURVhfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjAxCiAjZGVmaW5lIEFNTF9FVkVOVF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMDIKQEAgLTE5NCw3ICsxOTMsNiBAQAogICogVXNlIG9ubHkgIlVua25vd24iIEFNTCBvcGNvZGVzLCBkb24ndCBhdHRlbXB0IHRvIHVzZQogICogYW55IHZhbGlkIEFDUEkgQVNDSUkgdmFsdWVzIChBLVosIDAtOSwgJy0nKQogICovCi0KICNkZWZpbmUgQU1MX0lOVF9OQU1FUEFUSF9PUCAgICAgICAgICh1MTYpIDB4MDAyZAogI2RlZmluZSBBTUxfSU5UX05BTUVERklFTERfT1AgICAgICAgKHUxNikgMHgwMDMwCiAjZGVmaW5lIEFNTF9JTlRfUkVTRVJWRURGSUVMRF9PUCAgICAodTE2KSAweDAwMzEKQEAgLTIxNCw3ICsyMTIsNiBAQAogICogVGhlcmUgY2FuIGJlIHVwIHRvIDMxIHVuaXF1ZSBhcmd1bWVudCB0eXBlcwogICogWmVybyBpcyByZXNlcnZlZCBhcyBlbmQtb2YtbGlzdCBpbmRpY2F0b3IKICAqLwotCiAjZGVmaW5lIEFSR1BfQllURURBVEEgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIEFSR1BfQllURUxJU1QgICAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIEFSR1BfQ0hBUkxJU1QgICAgICAgICAgICAgICAweDAzCkBAIC0yOTUsNyArMjkyLDYgQEAKIC8qCiAgKiBvcGNvZGUgZ3JvdXBzIGFuZCB0eXBlcwogICovCi0KICNkZWZpbmUgT1BHUlBfTkFNRUQgICAgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgT1BHUlBfRklFTEQgICAgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgT1BHUlBfQllURUxJU1QgICAgICAgICAgICAgIDB4MDQKQEAgLTM4MSw2ICszNzcsMTIgQEAKICNkZWZpbmUgQU1MX1RZUEVfVU5ERUZJTkVEICAgICAgICAgIDB4MTkKICNkZWZpbmUgQU1MX1RZUEVfQk9HVVMgICAgICAgICAgICAgIDB4MUEKIAorLyogQU1MIFBhY2thZ2UgTGVuZ3RoIGVuY29kaW5ncyAqLworCisjZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTEgICAgICAweDQwCisjZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTIgICAgICAweDQwMDAKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMyAgICAgIDB4NDAwMDAwCisjZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTQgICAgICAweDQwMDAwMDAwCiAKIC8qCiAgKiBPcGNvZGUgY2xhc3NlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjczMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKQEAgLTAsMCArMSwyOSBAQAorCisvKiBfUERDIGJpdCBkZWZpbml0aW9uIGZvciBJbnRlbCBwcm9jZXNzb3JzICovCisKKyNpZm5kZWYgX19QRENfSU5URUxfSF9fCisjZGVmaW5lIF9fUERDX0lOVEVMX0hfXworCisjZGVmaW5lIEFDUElfUERDX1BfRkZICQkJKDB4MDAwMSkKKyNkZWZpbmUgQUNQSV9QRENfQ19DMV9IQUxUCQkoMHgwMDAyKQorI2RlZmluZSBBQ1BJX1BEQ19UX0ZGSAkJCSgweDAwMDQpCisjZGVmaW5lIEFDUElfUERDX1NNUF9DMVBUCQkoMHgwMDA4KQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfQzJDMwkJKDB4MDAxMCkKKyNkZWZpbmUgQUNQSV9QRENfU01QX1BfU1dDT09SRAkJKDB4MDAyMCkKKyNkZWZpbmUgQUNQSV9QRENfU01QX0NfU1dDT09SRAkJKDB4MDA0MCkKKyNkZWZpbmUgQUNQSV9QRENfU01QX1RfU1dDT09SRAkJKDB4MDA4MCkKKyNkZWZpbmUgQUNQSV9QRENfQ19DMV9GRkgJCSgweDAxMDApCisKKworI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMVBUIHwgXAorCQkJCQkgQUNQSV9QRENfQ19DMV9IQUxUKQorCisjZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUF9NU1IJKEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCB8IFwKKwkJCQkJIEFDUElfUERDX1BfRkZIKQorCisjZGVmaW5lIEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMkMzIHwgXAorCQkJCQkgQUNQSV9QRENfU01QX0MxUFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQpCisKKyNlbmRpZiAvKiBfX1BEQ19JTlRFTF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAppbmRleCA1N2JmOTM2Li5hZGY5NjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaApAQCAtMTk4LDYgKzE5OCw3IEBACiAjZW5kaWYKICNlbmRpZiAvKiAhREVCVUdHRVJfVEhSRUFESU5HICovCiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEMgbGlicmFyeSBjb25maWd1cmF0aW9uCkBAIC0yMDksNyArMjEwLDYgQEAKICAqIFVzZSB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGhlYWRlcnMuCiAgKiBXZSB3YW50IHRvIGtlZXAgdGhlc2UgdG8gYSBtaW5pbXVtLgogICovCi0KICNpZmRlZiBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTCiAvKgogICogVXNlIHRoZSBzdGFuZGFyZCBoZWFkZXJzIGZyb20gdGhlIHN0YW5kYXJkIGxvY2F0aW9ucwpAQCAtMjI0LDE0ICsyMjQsOCBAQAogLyoKICAqIFdlIHdpbGwgYmUgbGlua2luZyB0byB0aGUgc3RhbmRhcmQgQ2xpYiBmdW5jdGlvbnMKICAqLwotCiAjZGVmaW5lIEFDUElfU1RSU1RSKHMxLHMyKSAgICAgIHN0cnN0cigoczEpLCAoczIpKQogI2RlZmluZSBBQ1BJX1NUUkNIUihzMSxjKSAgICAgICBzdHJjaHIoKHMxKSwgKGMpKQotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLSNkZWZpbmUgQUNQSV9TVFJVUFIocykgICAgICAgICAgKHZvaWQpIGFjcGlfdXRfc3RydXByICgocykpCi0jZW5kaWYKLQogI2RlZmluZSBBQ1BJX1NUUkxFTihzKSAgICAgICAgICAoYWNwaV9zaXplKSBzdHJsZW4oKHMpKQogI2RlZmluZSBBQ1BJX1NUUkNQWShkLHMpICAgICAgICAodm9pZCkgc3RyY3B5KChkKSwgKHMpKQogI2RlZmluZSBBQ1BJX1NUUk5DUFkoZCxzLG4pICAgICAodm9pZCkgc3RybmNweSgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCkBAIC0yNTQsMTQgKzI0OCwxNSBAQAogI2RlZmluZSBBQ1BJX0lTX0FMUEhBICAgICAgICAgICBpc2FscGhhCiAjZGVmaW5lIEFDUElfSVNfQVNDSUkgICAgICAgICAgIGlzYXNjaWkKIAorI2Vsc2UKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5vdCB1c2luZyBuYXRpdmUgQyBsaWJyYXJ5LCB1c2UgbG9jYWwgaW1wbGVtZW50YXRpb25zCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2Vsc2UKIAotLyoKKyAvKgogICogVXNlIGxvY2FsIGRlZmluaXRpb25zIG9mIEMgbGlicmFyeSBtYWNyb3MgYW5kIGZ1bmN0aW9ucwogICogTk9URTogVGhlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGJlIGFzIGVmZmljaWVudAogICogYXMgYW4gaW5saW5lIG9yIGFzc2VtYmx5IGNvZGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgYQpAQCAtMjc4LDE0ICsyNzMsMTIgQEAKIC8qCiAgKiBTdG9yYWdlIGFsaWdubWVudCBwcm9wZXJ0aWVzCiAgKi8KLQogI2RlZmluZSAgX0FVUEJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKICNkZWZpbmUgIF9BRE5CTkQgICAgICAgICAgICAgICAgKHNpemVvZiAoYWNwaV9uYXRpdmVfaW50KSAtIDEpCiAKIC8qCiAgKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0IG1hY3JvIGRlZmluaXRpb25zCiAgKi8KLQogI2RlZmluZSBfYm5kKFgsIGJuZCkgICAgICAgICAgICAoKChzaXplb2YgKFgpKSArIChibmQpKSAmICh+KGJuZCkpKQogI2RlZmluZSB2YV9hcmcoYXAsIFQpICAgICAgICAgICAoKihUICopKCgoYXApICs9IChfYm5kIChULCBfQVVQQk5EKSkpIC0gKF9ibmQgKFQsX0FETkJORCkpKSkKICNkZWZpbmUgdmFfZW5kKGFwKSAgICAgICAgICAgICAgKHZvaWQpIDAKQEAgLTI5NiwxMSArMjg5LDYgQEAKIAogI2RlZmluZSBBQ1BJX1NUUlNUUihzMSxzMikgICAgICBhY3BpX3V0X3N0cnN0ciAoKHMxKSwgKHMyKSkKICNkZWZpbmUgQUNQSV9TVFJDSFIoczEsYykgICAgICAgYWNwaV91dF9zdHJjaHIgKChzMSksIChjKSkKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0jZGVmaW5lIEFDUElfU1RSVVBSKHMpICAgICAgICAgICh2b2lkKSBhY3BpX3V0X3N0cnVwciAoKHMpKQotI2VuZGlmCi0KICNkZWZpbmUgQUNQSV9TVFJMRU4ocykgICAgICAgICAgKGFjcGlfc2l6ZSkgYWNwaV91dF9zdHJsZW4gKChzKSkKICNkZWZpbmUgQUNQSV9TVFJDUFkoZCxzKSAgICAgICAgKHZvaWQpIGFjcGlfdXRfc3RyY3B5ICgoZCksIChzKSkKICNkZWZpbmUgQUNQSV9TVFJOQ1BZKGQscyxuKSAgICAgKHZvaWQpIGFjcGlfdXRfc3RybmNweSAoKGQpLCAocyksIChhY3BpX3NpemUpKG4pKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDJmNTBhNWIuLjUwY2ZlYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTQsNiArNCw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0JVU1lfTUVUUklDCTEwCiAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSCTgKQEAgLTE0LDYgKzE2LDggQEAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfTUFYX1RIUk9UVExFCTI1MAkvKiAyNSUgKi8KICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfTUFYX0RVVFlfV0lEVEgJNAogCisjZGVmaW5lIEFDUElfUERDX1JFVklTSU9OX0lECQkweDEKKwogLyogUG93ZXIgTWFuYWdlbWVudCAqLwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3g7CkBAIC01OSw2ICs2Myw5IEBACiAJdTMyCQkJYm1fYWN0aXZpdHk7CiAJaW50CQkJY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4IHN0YXRlc1tBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVJdOworCisJLyogdGhlIF9QREMgb2JqZWN0cyBwYXNzZWQgYnkgdGhlIGRyaXZlciwgaWYgYW55ICovCisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkYzsKIH07CiAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KQEAgLTgyLDggKzg5LDYgQEAKIAlhY3BpX2ludGVnZXIJCXN0YXR1czsJCQkvKiBzdWNjZXNzIGluZGljYXRvciAqLwogfTsKIAotI2RlZmluZSBBQ1BJX1BEQ19SRVZJU0lPTl9JRCAgICAgICAgICAgICAgICAgICAweDEKLQogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIHsKIAl1bnNpZ25lZCBpbnQJCSBzdGF0ZTsKIAl1bnNpZ25lZCBpbnQJCSBwbGF0Zm9ybV9saW1pdDsKQEAgLTE3OSw3ICsxODQsMzIgQEAKIGV4dGVybiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByb2Nlc3NvcnNbTlJfQ1BVU107CiBleHRlcm4gc3RydWN0IGFjcGlfcHJvY2Vzc29yX2VycmF0YSBlcnJhdGE7CiAKK2ludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pOworCisjaWZkZWYgQVJDSF9IQVNfUE9XRVJfUERDX0lOSVQKK3ZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csCisJCXVuc2lnbmVkIGludCBjcHUpOwordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsCisJCXVuc2lnbmVkIGludCBjcHUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYygKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csIHVuc2lnbmVkIGludCBjcHUpCit7CisJcG93LT5wZGMgPSBOVUxMOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soCisJCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsIHVuc2lnbmVkIGludCBjcHUpCit7CisJZmxhZ3MtPmJtX2NoZWNrID0gMTsKKwlyZXR1cm47Cit9CisjZW5kaWYKKwogLyogaW4gcHJvY2Vzc29yX3BlcmZsaWIuYyAqLworCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpOwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BjaS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmgKaW5kZXggMGM3YjU3Yi4uMjg5NTc2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmgKQEAgLTU4LDcgKzU4LDcgQEAKIAogZXh0ZXJuIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitleHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTIyMyw2ICsyMjMsMjUgQEAKIAkvKiBOb3RoaW5nIHRvIGRvLiAqLwogfQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZWxpbmVfc2l6ZTsKKwl1OCBieXRlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCWlmIChieXRlID09IDApCisJCWNhY2hlbGluZV9zaXplID0gMTAyNDsKKwllbHNlCisJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0JPVU5EQVJZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKK30KKyNlbmRpZgorCiAvKiBUT0RPOiBpbnRlZ3JhdGUgd2l0aCBpbmNsdWRlL2FzbS1nZW5lcmljL3BjaS5oID8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9nZXRfbGVnYWN5X2lkZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGNoYW5uZWwpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKaW5kZXggNDA4YWVhNS4uMjJiNTNlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaApAQCAtMTMzLDYgKzEzMywxMiBAQAogI2RlZmluZSBfX1MxMTEJX1BBR0VfUygwKQogCiAvKgorICogcGdwcm90X25vbmNhY2hlZCgpIGlzIG9ubHkgZm9yIGluZmluaWJhbmQgcGNpIHN1cHBvcnQsIGFuZCBhIHJlYWwKKyAqIGltcGxlbWVudGF0aW9uIGZvciBSQU0gd291bGQgYmUgbW9yZSBjb21wbGljYXRlZC4KKyAqLworI2RlZmluZSBwZ3Byb3Rfbm9uY2FjaGVkKHByb3QpCShwcm90KQorCisvKgogICogQkFEX1BBR0VUQUJMRSBpcyB1c2VkIHdoZW4gd2UgbmVlZCBhIGJvZ3VzIHBhZ2UtdGFibGUsIHdoaWxlCiAgKiBCQURfUEFHRSBpcyB1c2VkIGZvciBhIGJvZ3VzIHBhZ2UuCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9zZXJpYWwuaAppbmRleCA3YjJkOWVlLi43ZTRiMjk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9zZXJpYWwuaApAQCAtMjIsNTQgKzIyLDkgQEAKICNkZWZpbmUgU1REX0NPTTRfRkxBR1MgQVNZTkNfQk9PVF9BVVRPQ09ORgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRk9VUlBPUlRfRkxBR1MgQVNZTkNfRk9VUlBPUlQKLSNkZWZpbmUgQUNDRU5UX0ZMQUdTIDAKLSNkZWZpbmUgQk9DQV9GTEFHUyAwCi0jZW5kaWYKLQkKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMSAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXhmYi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteGZiLmgKaW5kZXggMjM0NmQ0NS4uN2RiYzdiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteGZiLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteGZiLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAl1X2ludAkJcGNyOwogCXVfaW50CQlwd21yOwogCXVfaW50CQlsc2NyMTsKKwl1X2ludAkJZG1hY3I7CiAKIAl1X2NoYXIgKiBmaXhlZF9zY3JlZW5fY3B1OwogCWRtYV9hZGRyX3QgZml4ZWRfc2NyZWVuX2RtYTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDAuaAppbmRleCAzYTM5OGRmLi4yMjkzODFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4ZHAyeDAwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMC5oCkBAIC0yMSw4ICsyMSw4IEBACiAgKiBPbiBib2FyZCBDUExEIG1lbW9yeSBtYXAKICAqLwogI2RlZmluZSBJWERQMlgwMF9QSFlTX0NQTERfQkFTRQkJMHhjNzAwMDAwMAotI2RlZmluZSBJWERQMlgwMF9WSVJUX0NQTERfQkFTRQkJMHhmYWZmZjAwMAotI2RlZmluZSBJWERQMlgwMF9DUExEX1NJWkUJCTB4MDAwMDEwMDAKKyNkZWZpbmUgSVhEUDJYMDBfVklSVF9DUExEX0JBU0UJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgSVhEUDJYMDBfQ1BMRF9TSVpFCQkweDAwMTAwMDAwCiAKIAogI2RlZmluZSBJWERQMlgwMF9DUExEX1JFRyh4KSAgCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDEuaAppbmRleCBiM2ExYmNkLi5iNzY4MDA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4ZHAyeDAxLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMS5oCkBAIC0xOCw4ICsxOCw4IEBACiAjZGVmaW5lIF9fSVhEUDJYMDFfSF9fCiAKICNkZWZpbmUJSVhEUDJYMDFfUEhZU19DUExEX0JBU0UJCTB4YzYwMjQwMDAKLSNkZWZpbmUJSVhEUDJYMDFfVklSVF9DUExEX0JBU0UJCTB4ZmFmZmYwMDAKLSNkZWZpbmUJSVhEUDJYMDFfQ1BMRF9SRUdJT05fU0laRQkweDAwMDAxMDAwCisjZGVmaW5lCUlYRFAyWDAxX1ZJUlRfQ1BMRF9CQVNFCQkweGZlMDAwMDAwCisjZGVmaW5lCUlYRFAyWDAxX0NQTERfUkVHSU9OX1NJWkUJMHgwMDEwMDAwMAogCiAjZGVmaW5lIElYRFAyWDAxX0NQTERfVklSVF9SRUcocmVnKSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKElYRFAyWDAxX1ZJUlRfQ1BMRF9CQVNFIHwgcmVnKQogI2RlZmluZSBJWERQMlgwMV9DUExEX1BIWVNfUkVHKHJlZykgKHZvbGF0aWxlIHUzMiopKElYRFAyWDAxX1BIWVNfQ1BMRF9CQVNFIHwgcmVnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peHAyMDAwLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhwMjAwMC1yZWdzLmgKaW5kZXggNWViNDdkNC4uNzU2MjNmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peHAyMDAwLXJlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4cDIwMDAtcmVncy5oCkBAIC0xOCw2ICsxOCwyMSBAQAogI2lmbmRlZiBfSVhQMjAwMF9SRUdTX0hfCiAjZGVmaW5lIF9JWFAyMDAwX1JFR1NfSF8KIAorLyoKKyAqIElYUDIwMDAgbGludXggbWVtb3J5IG1hcDoKKyAqCisgKiB2aXJ0CQlwaHlzCQlzaXplCisgKiBmYjAwMDAwMAlkYjAwMDAwMAkxNk0JCVBDSSBDRkcxCisgKiBmYzAwMDAwMAlkYTAwMDAwMAkxNk0JCVBDSSBDRkcwCisgKiBmZDAwMDAwMAlkODAwMDAwMAkxNk0JCVBDSSBJL08KKyAqIGZlWzAtN10wMDAwMAkJCThNCQlwZXItcGxhdGZvcm0gbWFwcGluZ3MKKyAqIGZlYjAwMDAwCWM4MDAwMDAwCTFNCQlNU0YKKyAqIGZlYzAwMDAwCWRmMDAwMDAwCTFNCQlQQ0kgQ1NScworICogZmVkMDAwMDAJZGUwMDAwMDAJMU0JCVBDSSBDUkVHCisgKiBmZWUwMDAwMAlkNjAwMDAwMAkxTQkJSU5UQ1RMCisgKiBmZWYwMDAwMAljMDAwMDAwMAkxTQkJQ0FQCisgKi8KKwogLyogCiAgKiBTdGF0aWMgSS9PIHJlZ2lvbnMuCiAgKgpAQCAtNzEsNiArODYsMTAgQEAKICNkZWZpbmUJSVhQMjAwMF9QQ0lfQ1NSX1ZJUlRfQkFTRQkweGZlYzAwMDAwCiAjZGVmaW5lCUlYUDIwMDBfUENJX0NTUl9TSVpFCQkweDAwMTAwMDAwCiAKKyNkZWZpbmUgSVhQMjAwMF9NU0ZfUEhZU19CQVNFCQkweGM4MDAwMDAwCisjZGVmaW5lIElYUDIwMDBfTVNGX1ZJUlRfQkFTRQkJMHhmZWIwMDAwMAorI2RlZmluZSBJWFAyMDAwX01TRl9TSVpFCQkweDAwMTAwMDAwCisKICNkZWZpbmUgSVhQMjAwMF9QQ0lfSU9fUEhZU19CQVNFCTB4ZDgwMDAwMDAKICNkZWZpbmUJSVhQMjAwMF9QQ0lfSU9fVklSVF9CQVNFCTB4ZmQwMDAwMDAKICNkZWZpbmUgSVhQMjAwMF9QQ0lfSU9fU0laRSAgICAgCTB4MDEwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaAppbmRleCA1MmRlZDUxLi5jMGNhZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9wbGF0Zm9ybS5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIH0KIAogdm9pZCBpeHAyMDAwX21hcF9pbyh2b2lkKTsKK3ZvaWQgaXhwMjAwMF91YXJ0X2luaXQodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF9pcnEodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcpOwogdW5zaWduZWQgbG9uZyBpeHAyMDAwX2dldHRpbWVvZmZzZXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL3ZtYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCmluZGV4IDQ3M2RmZjQuLjI3NTEzNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCkBAIC0xNyw0ICsxNyw0IEBACiAgKiBUaGUgdm1hbGxvYygpIHJvdXRpbmVzIGxlYXZlcyBhIGhvbGUgb2YgNGtCIGJldHdlZW4gZWFjaCB2bWFsbG9jZWQKICAqIGFyZWEgZm9yIHRoZSBzYW1lIHJlYXNvbi4gOykKICAqLwotI2RlZmluZSBWTUFMTE9DX0VORAkgICAgMHhmYWZmZWZmZgorI2RlZmluZSBWTUFMTE9DX0VORAkgICAgMHhmYjAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUwppbmRleCA0NWE2YzZjLi4yZTIzNjUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUwpAQCAtMTQsOCArMTQsOCBAQAogICAgICAgICAgICAgICAgIG1yYyAgICAgcDE1LCAwLCBccngsIGMxLCBjMAogICAgICAgICAgICAgICAgIHRzdCAgICAgXHJ4LCAjMSAgICAgICAgICAgICAgICAgQCBNTVUgZW5hYmxlZD8KICAgICAgICAgICAgICAgICBtb3ZlcSAgIFxyeCwgIzB4YzgwMDAwMDAKLQkJb3JybmUJXHJ4LCBccngsICMweDAwYjAwMDAwCiAgICAgICAgICAgICAgICAgbW92bmUgICBccngsICMweGZmMDAwMDAwCisJCW9ycm5lCVxyeCwgXHJ4LCAjMHgwMGIwMDAwMAogICAgICAgICAgICAgICAgIGFkZCAgICAgXHJ4LFxyeCwjMyAgICAgICAgICAgICAgQCBVYXJ0IHJlZ3MgYXJlIGF0IG9mZiBzZXQgb2YgMyBpZgogCQkJCQkJQCBieXRlIHdyaXRlcyB1c2VkIC0gQmlnIEVuZGlhbi4KICAgICAgICAgICAgICAgICAuZW5kbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaAppbmRleCBjMjdiOWQzLi43NDk1MDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBBdXRob3I6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1ICBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0zODMsNiArMzgzLDE4MCBAQAogCQkqdmFkZHIrKyA9IGlubChpb19hZGRyKTsKIH0KIAorI2RlZmluZQlfX2lzX2lvX2FkZHJlc3MocCkJKCgodW5zaWduZWQgbG9uZylwID49IDB4MCkgJiYgXAorCQkJCQkoKHVuc2lnbmVkIGxvbmcpcCA8PSAweDAwMDBmZmZmKSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitfX2l4cDR4eF9pb3JlYWQ4KHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbmIoKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlCisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCXJldHVybiAodW5zaWduZWQgaW50KV9fcmF3X3JlYWRiKCh1MzIpcG9ydCk7CisjZWxzZQorCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX2l4cDR4eF9yZWFkYigodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW9yZWFkOF9yZXAodTMyIHBvcnQsIHU4ICp2YWRkciwgdTMyIGNvdW50KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X2luc2IocG9ydCwgdmFkZHIsIGNvdW50KTsKKwllbHNlCisjaWZuZGVmCUNPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3JlYWRzYigodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3JlYWRzYihwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitfX2l4cDR4eF9pb3JlYWQxNih2b2lkIF9faW9tZW0gKnBvcnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJcmV0dXJuCSh1bnNpZ25lZCBpbnQpX19peHA0eHhfaW53KCh1bnNpZ25lZCBpbnQpcG9ydCk7CisJZWxzZQorI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlyZXR1cm4gbGUxNl90b19jcHUoX19yYXdfcmVhZHcoKHUzMilwb3J0KSk7CisjZWxzZQorCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX2l4cDR4eF9yZWFkdygodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW9yZWFkMTZfcmVwKHUzMiBwb3J0LCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfaW5zdyhwb3J0LCB2YWRkciwgY291bnQpOworCWVsc2UKKyNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfcmVhZHN3KCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfcmVhZHN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19faXhwNHh4X2lvcmVhZDMyKHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbmwoKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlIHsKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKCh1MzIpcG9ydCkpOworI2Vsc2UKKwkJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19peHA0eHhfcmVhZGwoKHUzMilwb3J0KTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3JlYWQzMl9yZXAodTMyIHBvcnQsIHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9pbnNsKHBvcnQsIHZhZGRyLCBjb3VudCk7CisJZWxzZQorI2lmbmRlZglDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc2woKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF9yZWFkc2wocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGU4KHU4IHZhbHVlLCB2b2lkIF9faW9tZW0gKnBvcnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfb3V0Yih2YWx1ZSwgKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlCisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3dyaXRlYih2YWx1ZSwgKHUzMilwb3J0KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlYih2YWx1ZSwgKHUzMilwb3J0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGU4X3JlcCh1MzIgcG9ydCwgdTggKnZhZGRyLCB1MzIgY291bnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfb3V0c2IocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGVzYigodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlc2IocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUxNih1MTYgdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXR3KHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHZhbHVlKSwgKHUzMilwb3J0KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRldyh2YWx1ZSwgKHUzMilwb3J0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUxNl9yZXAodTMyIHBvcnQsIHUxNiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRzdyhwb3J0LCB2YWRkciwgY291bnQpOworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc3coKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF93cml0ZXN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3dyaXRlMzIodTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKnBvcnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfb3V0bCh2YWx1ZSwgKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlCisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3dyaXRlbChjcHVfdG9fbGUzMih2YWx1ZSksICh1MzIpcG9ydCk7CisjZWxzZQorCQlfX2l4cDR4eF93cml0ZWwodmFsdWUsICh1MzIpcG9ydCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3dyaXRlMzJfcmVwKHUzMiBwb3J0LCB1MzIgKnZhZGRyLCB1MzIgY291bnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfb3V0c2wocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfcmVhZHNsKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfb3V0c2wocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCisjZGVmaW5lCWlvcmVhZDgocCkJCQlfX2l4cDR4eF9pb3JlYWQ4KHApCisjZGVmaW5lCWlvcmVhZDE2KHApCQkJX19peHA0eHhfaW9yZWFkMTYocCkKKyNkZWZpbmUJaW9yZWFkMzIocCkJCQlfX2l4cDR4eF9pb3JlYWQzMihwKQorCisjZGVmaW5lCWlvcmVhZDhfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3JlYWQ4X3JlcChwLCB2LCBjKQorI2RlZmluZQlpb3JlYWQxNl9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvcmVhZDE2X3JlcChwLCB2LCBjKQorI2RlZmluZQlpb3JlYWQzMl9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvcmVhZDMyX3JlcChwLCB2LCBjKQorCisjZGVmaW5lCWlvd3JpdGU4KHYscCkJCQlfX2l4cDR4eF9pb3dyaXRlOCh2LHApCisjZGVmaW5lCWlvd3JpdGUxNih2LHApCQkJX19peHA0eHhfaW93cml0ZTE2KHYscCkKKyNkZWZpbmUJaW93cml0ZTMyKHYscCkJCQlfX2l4cDR4eF9pb3dyaXRlMzIodixwKQorCisjZGVmaW5lCWlvd3JpdGU4X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZThfcmVwKHAsIHYsIGMpCisjZGVmaW5lCWlvd3JpdGUxNl9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvd3JpdGUxNl9yZXAocCwgdiwgYykKKyNkZWZpbmUJaW93cml0ZTMyX3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZTMyX3JlcChwLCB2LCBjKQorCisjZGVmaW5lCWlvcG9ydF9tYXAocG9ydCwgbnIpCQkoKHZvaWQgX19pb21lbSopcG9ydCkKKyNkZWZpbmUJaW9wb3J0X3VubWFwKGFkZHIpCiAKICNlbmRpZgkvLyAgX19BU01fQVJNX0FSQ0hfSU9fSAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgyLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgyLmgKaW5kZXggNjBmMDAyYi4uMzljYTVhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDIuaApAQCAtMzQsMTEgKzM0LDYgQEAKIC8qIEF0IE9NQVAxNjEwIElubm92YXRvciB0aGUgRXRoZXJuZXQgaXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIENTMSAqLwogI2RlZmluZSBPTUFQMTYxMF9FVEhSX1NUQVJUCQkweDA0MDAwMzAwCiAKLS8qIEludGVsIFNUUkFUQSBOT1IgZmxhc2ggYXQgQ1MzIG9yIENTMkIoTkFORCBCb290KSAqLwotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TSVpFICAgICAgICAgICAgIFNaXzMyTQotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TVEFSVDEgICAgICAgICAgIDB4MEMwMDAwMDAgLyogQ1MzICovCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NUQVJUMiAgICAgICAgICAgMHgwQTAwMDAwMCAvKiBDUzJCICovCi0KIC8qIFNhbXN1bmcgTkFORCBmbGFzaCBhdCBDUzJCIG9yIENTMyhOQU5EIEJvb3QpICovCiAjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDEgICAgICAgICAgIDB4MEEwMDAwMDAgLyogQ1MyQiAqLwogI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQyICAgICAgICAgICAweDBDMDAwMDAwIC8qIENTMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMy5oCmluZGV4IGU0ZDFjZDIuLjFiMTJjMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgzLmgKQEAgLTMwLDExICszMCw2IEBACiAvKiBJbiBPTUFQMTcxMCBIMyB0aGUgRXRoZXJuZXQgaXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIENTMSAqLwogI2RlZmluZSBPTUFQMTcxMF9FVEhSX1NUQVJUCQkweDA0MDAwMzAwCiAKLS8qIEludGVsIFNUUkFUQSBOT1IgZmxhc2ggYXQgQ1MzIG9yIENTMkIoTkFORCBCb290KSAqLwotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TSVpFICAgICAgICAgICAgIFNaXzMyTQotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TVEFSVDEgCQkweDBDMDAwMDAwIC8qIENTMyAqLwotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TVEFSVDIgCQkweDBBMDAwMDAwIC8qIENTMkIgKi8KLQogLyogU2Ftc3VuZyBOQU5EIGZsYXNoIGF0IENTMkIgb3IgQ1MzKE5BTkQgQm9vdCkgKi8KICNkZWZpbmUgT01BUF9OQU5EX0ZMQVNIX1NUQVJUMSAgICAgICAgICAgMHgwQTAwMDAwMCAvKiBDUzJCICovCiAjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDIgICAgICAgICAgIDB4MEMwMDAwMDAgLyogQ1MzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLW9zay5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1vc2suaAppbmRleCBhYWE0OWEwLi4yYjFhOGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLW9zay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtb3NrLmgKQEAgLTMyLDEwICszMiw1IEBACiAvKiBBdCBPTUFQNTkxMiBPU0sgdGhlIEV0aGVybmV0IGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBDUzEgKi8KICNkZWZpbmUgT01BUF9PU0tfRVRIUl9TVEFSVAkJMHgwNDgwMDMwMAogCi0vKiBNaWNyb24gTk9SIGZsYXNoIGF0IENTMyBtYXBwZWQgdG8gYWRkcmVzcyAweDAgaWYgQk0gYml0IGlzIDEgKi8KLSNkZWZpbmUgT01BUF9PU0tfTk9SX0ZMQVNIX0JBU0UJCTB4RDgwMDAwMDAKLSNkZWZpbmUgT01BUF9PU0tfTk9SX0ZMQVNIX1NJWkUJCVNaXzMyTQotI2RlZmluZSBPTUFQX09TS19OT1JfRkxBU0hfU1RBUlQJMHgwMDAwMDAwMAotCiAjZW5kaWYgLyogIF9fQVNNX0FSQ0hfT01BUF9PU0tfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmgKaW5kZXggMWNlZmQ2MC4uOTViZDYyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaApAQCAtMTYsMTAgKzE2LDExIEBACiAvKiBEaWZmZXJlbnQgcGVyaXBoZXJhbCBpZHMgKi8KICNkZWZpbmUgT01BUF9UQUdfQ0xPQ0sJCTB4NGYwMQogI2RlZmluZSBPTUFQX1RBR19NTUMJCTB4NGYwMgotI2RlZmluZSBPTUFQX1RBR19VQVJUCQkweDRmMDMKKyNkZWZpbmUgT01BUF9UQUdfU0VSSUFMX0NPTlNPTEUgMHg0ZjAzCiAjZGVmaW5lIE9NQVBfVEFHX1VTQgkJMHg0ZjA0CiAjZGVmaW5lIE9NQVBfVEFHX0xDRAkJMHg0ZjA1CiAjZGVmaW5lIE9NQVBfVEFHX0dQSU9fU1dJVENICTB4NGYwNgorI2RlZmluZSBPTUFQX1RBR19VQVJUCQkweDRmMDcKIAogI2RlZmluZSBPTUFQX1RBR19CT09UX1JFQVNPTiAgICAweDRmODAKICNkZWZpbmUgT01BUF9UQUdfRkxBU0hfUEFSVAkweDRmODEKQEAgLTM1LDcgKzM2LDcgQEAKIAlzMTYgbW1jMV9zd2l0Y2hfcGluLCBtbWMyX3N3aXRjaF9waW47CiB9OwogCi1zdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyB7CitzdHJ1Y3Qgb21hcF9zZXJpYWxfY29uc29sZV9jb25maWcgewogCXU4IGNvbnNvbGVfdWFydDsKIAl1MzIgY29uc29sZV9zcGVlZDsKIH07CkBAIC04Miw3ICs4Myw4IEBACiAgKi8KICNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9UWVBFX0NPVkVSCQkweDAwMDAKICNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9UWVBFX0NPTk5FQ1RJT04JMHgwMDAxCi0jZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19JTlZFUlRFRCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX0lOVkVSVEVECQkweDAwMDEKKyNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX09VVFBVVAkJMHgwMDAyCiBzdHJ1Y3Qgb21hcF9ncGlvX3N3aXRjaF9jb25maWcgewogCWNoYXIgbmFtZVsxMl07CiAJdTE2IGdwaW87CkBAIC05OSw2ICsxMDEsMTAgQEAKIAljaGFyIHJlYXNvbl9zdHJbMTJdOwogfTsKIAorc3RydWN0IG9tYXBfdWFydF9jb25maWcgeworCS8qIEJpdCBmaWVsZCBvZiBVQVJUcyBwcmVzZW50OyBiaXQgMCAtLT4gVUFSVDEgKi8KKwl1bnNpZ25lZCBpbnQgZW5hYmxlZF91YXJ0czsKK307CiAKIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSB7CiAJdTE2IHRhZzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY29tbW9uLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NvbW1vbi5oCmluZGV4IDlmNjI4NTguLjJhNjc2YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NvbW1vbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaAorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jb21tb24uaAogICoKICAqIEhlYWRlciBmb3IgY29kZSBjb21tb24gdG8gYWxsIE9NQVAgbWFjaGluZXMuCiAgKgpAQCAtMjksNyArMjksNyBAQAogCiBzdHJ1Y3Qgc3lzX3RpbWVyOwogCi1leHRlcm4gdm9pZCBvbWFwX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXI7CiBleHRlcm4gdm9pZCBvbWFwX3NlcmlhbF9pbml0KGludCBwb3J0c1tdKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKaW5kZXggZDc4NTI0OC4uY2UxMTRjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCkBAIC0yNDEsNiArMjQxLDcgQEAKIGV4dGVybiBkbWFfYWRkcl90IG9tYXBfZ2V0X2RtYV9zcmNfcG9zKGludCBsY2gpOwogZXh0ZXJuIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX2RzdF9wb3MoaW50IGxjaCk7CiBleHRlcm4gdm9pZCBvbWFwX2NsZWFyX2RtYShpbnQgbGNoKTsKK2V4dGVybiBpbnQgb21hcF9kbWFfcnVubmluZyh2b2lkKTsKIAogLyogUmV0dXJucyAxIGlmIHRoZSBETUEgbW9kdWxlIGlzIGluIE9NQVAxNTEwLWNvbXBhdGlibGUgbW9kZSwgMCBvdGhlcndpc2UgKi8KIGV4dGVybiBpbnQgb21hcF9kbWFfaW5fMTUxMF9tb2RlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oCmluZGV4IDM3ZTA2YzcuLjQ4MjU4YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmgKQEAgLTU0LDYgKzU0LDE5IEBACiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaW1lcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBPTUFQX01QVV9USU1FUjFfQkFTRQkoMHhmZmZlYzUwMCkKKyNkZWZpbmUgT01BUF9NUFVfVElNRVIyX0JBU0UJKDB4ZmZmZWM2MDApCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSM19CQVNFCSgweGZmZmVjNzAwKQorI2RlZmluZSBNUFVfVElNRVJfRlJFRQkJKDEgPDwgNikKKyNkZWZpbmUgTVBVX1RJTUVSX0NMT0NLX0VOQUJMRQkoMSA8PCA1KQorI2RlZmluZSBNUFVfVElNRVJfQVIJCSgxIDw8IDEpCisjZGVmaW5lIE1QVV9USU1FUl9TVAkJKDEgPDwgMCkKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCkBAIC03OCw2ICs5MSw3IEBACiAKIC8qIERTUCBjbG9jayBjb250cm9sICovCiAjZGVmaW5lIERTUF9DT05GSUdfUkVHX0JBU0UgICAgICgweGUxMDA4MDAwKQorI2RlZmluZSBEU1BfQ0tDVEwJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHgwKQogI2RlZmluZSBEU1BfSURMRUNUMQkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDQpCiAjZGVmaW5lIERTUF9JRExFQ1QyCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4OCkKIApAQCAtODgsNiArMTAyLDcgQEAKICAqLwogI2RlZmluZSBVTFBEX1JFR19CQVNFCQkoMHhmZmZlMDgwMCkKICNkZWZpbmUgVUxQRF9JVF9TVEFUVVMJCShVTFBEX1JFR19CQVNFICsgMHgxNCkKKyNkZWZpbmUgVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zCShVTFBEX1JFR19CQVNFICsgMHgyNCkKICNkZWZpbmUgVUxQRF9DTE9DS19DVFJMCQkoVUxQRF9SRUdfQkFTRSArIDB4MzApCiAjCWRlZmluZSBESVNfVVNCX1BWQ0lfQ0xLCQkoMSA8PCA1KQkvKiBubyBVU0IvRkFDIHN5bmNoICovCiAjCWRlZmluZSBVU0JfTUNMS19FTgkJKDEgPDwgNCkJLyogZW5hYmxlIFc0X1VTQl9DTEtPICovCkBAIC0yNjgsMTcgKzI4MywxMCBAQAogICogUHJvY2Vzc29yIHNwZWNpZmljIGRlZmluZXMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCiAjaW5jbHVkZSAib21hcDczMC5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAogI2luY2x1ZGUgIm9tYXAxNTEwLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCiAjaW5jbHVkZSAib21hcDE2eHguaCIKLSNlbmRpZgogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lycXMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCmluZGV4IDY3MDFmZDkuLjBkMDVhN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCkBAIC0xNTksNiArMTU5LDcgQEAKICNkZWZpbmUgSU5UXzE2MTBfR1BJT19CQU5LMwkoNDEgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfTU1DMgkJKDQyICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNjEwX0NGCQkoNDMgKyBJSDJfQkFTRSkKKyNkZWZpbmUgSU5UXzE2MTBfV0FLRV9VUF9SRVEJKDQ2ICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNjEwX0dQSU9fQkFOSzQJKDQ4ICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNjEwX1NQSQkJKDQ5ICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNjEwX0RNQV9DSDYJKDUzICsgSUgyX0JBU0UpCkBAIC0yMzgsNiArMjM5LDggQEAKICNkZWZpbmUgSUhfTVBVSU9fQkFTRQkJKE9NQVBfTUFYX0dQSU9fTElORVMgKyBJSF9HUElPX0JBU0UpCiAjZGVmaW5lIElIX0JPQVJEX0JBU0UJCSgxNiArIElIX01QVUlPX0JBU0UpCiAKKyNkZWZpbmUgT01BUF9JUlFfQklUKGlycSkJKDEgPDwgKChpcnEpICUgMzIpKQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogZXh0ZXJuIHZvaWQgb21hcF9pbml0X2lycSh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmgKaW5kZXggMzlmOTlkZS4uNWJkM2YwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oCkBAIC0yMzEsNyArMjMxLDcgQEAKIAlKMTlfMTYxMF9FVE1fRDYsCiAJSjE4XzE2MTBfRVRNX0Q3LAogCi0JLyogT01BUC0xNjEwIEdQSU8gKi8KKwkvKiBPTUFQMTZYWCBHUElPICovCiAJUDIwXzE2MTBfR1BJTzQsCiAJVjlfMTYxMF9HUElPNywKIAlXOF8xNjEwX0dQSU85LApAQCAtMjQxLDYgKzI0MSw5IEBACiAJQUEyMF8xNjEwX0dQSU9fNDEsCiAJVzE5XzE2MTBfR1BJTzQ4LAogCU03XzE2MTBfR1BJTzYyLAorCVYxNF8xNlhYX0dQSU8zNywKKwlSOV8xNlhYX0dQSU8xOCwKKwlMMTRfMTZYWF9HUElPNDksCiAKIAkvKiBPTUFQLTE2MTAgdVdpcmUgKi8KIAlWMTlfMTYxMF9VV0lSRV9TQ0xLLApAQCAtMjg1LDEyICsyODgsMTMgQEAKIAlWNl9VU0IyX1RYRCwKIAlXNV9VU0IyX1NFMCwKIAotCS8qIFVBUlQxIDE2MTAgKi8KLQorCS8qIDE2WFggVUFSVCAqLwogCVIxM18xNjEwX1VBUlQxX1RYLAotCVYxNF8xNjEwX1VBUlQxX1JYLAorCVYxNF8xNlhYX1VBUlQxX1JYLAogCVIxNF8xNjEwX1VBUlQxX0NUUywKIAlBQTE1XzE2MTBfVUFSVDFfUlRTLAorCVI5XzE2WFhfVUFSVDJfUlgsCisJTDE0XzE2WFhfVUFSVDNfUlgsCiAKIAkvKiBJMkMgT01BUC0xNjEwICovCiAJSTJDX1NDTCwKQEAgLTMzMiw3ICszMzYsNyBAQAogICogVGFibGUgb2YgdmFyaW91cyBGVU5DX01VWCBhbmQgUFVMTF9EV04gY29tYmluYXRpb25zIGZvciBlYWNoIGRldmljZS4KICAqIFNlZSBhbHNvIHJlZ19jZmdfdCBhYm92ZSBmb3IgdGhlIGxvb2t1cCB0YWJsZS4KICAqLwotc3RhdGljIHJlZ19jZmdfc2V0IF9faW5pdGRhdGFfb3JfbW9kdWxlCitzdGF0aWMgY29uc3QgcmVnX2NmZ19zZXQgX19pbml0ZGF0YV9vcl9tb2R1bGUKIHJlZ19jZmdfdGFibGVbXSA9IHsKIC8qCiAgKgkgZGVzY3JpcHRpb24JCW11eCAgbW9kZSAgIG11eAkgcHVsbCBwdWxsICBwdWxsICBwdV9wZAkgcHUgIGRiZwpAQCAtNDU1LDcgKzQ1OSw3IEBACiBNVVhfQ0ZHKCJKMTlfMTYxMF9FVE1fRDYiLAkgNSwgICAgMCwgICAgMSwJICAwLCAgMjAsICAgMCwJICAwLAkgMCwgIDEpCiBNVVhfQ0ZHKCJKMThfMTYxMF9FVE1fRDciLAkgNSwgICAyNywgICAgMSwJICAwLCAgMTksICAgMCwJICAwLAkgMCwgIDEpCiAKLS8qIE9NQVAtMTYxMCBHUElPICovCisvKiBPTUFQMTZYWCBHUElPICovCiBNVVhfQ0ZHKCJQMjBfMTYxMF9HUElPNCIsCSA2LCAgIDI3LCAgICAwLAkgIDEsICAgNywgICAwLAkgIDEsCSAxLCAgMSkKIE1VWF9DRkcoIlY5XzE2MTBfR1BJTzciLAkgQiwgICAxMiwgICAgMSwJICAyLCAgMjAsICAgMCwJICAyLAkgMSwgIDEpCiBNVVhfQ0ZHKCJXOF8xNjEwX0dQSU85IiwJIEIsICAgMjEsICAgIDAsCSAgMiwgIDIzLCAgIDAsCSAgMiwJIDEsICAxKQpAQCAtNDY1LDYgKzQ2OSw5IEBACiBNVVhfQ0ZHKCJBQTIwXzE2MTBfR1BJT180MSIsCSA5LCAgICA5LCAgICA3LAkgIDEsICAzMSwgICAwLAkgIDEsCSAxLCAgMSkKIE1VWF9DRkcoIlcxOV8xNjEwX0dQSU80OCIsCSA4LCAgIDE1LCAgICA3LCAgIDEsICAyMywgICAxLCAgICAxLCAgICAgMCwgIDEpCiBNVVhfQ0ZHKCJNN18xNjEwX0dQSU82MiIsCTEwLCAgICAwLCAgICAwLCAgIDQsICAyNCwgICAwLCAgICA0LCAgICAgMCwgIDEpCitNVVhfQ0ZHKCJWMTRfMTZYWF9HUElPMzciLAkgOSwgICAxOCwgICAgNywJICAyLCAgIDIsICAgMCwJICAyLAkgMiwgIDApCitNVVhfQ0ZHKCJSOV8xNlhYX0dQSU8xOCIsCSBDLCAgIDE4LCAgICA3LCAgIDMsICAgMCwgICAwLCAgICAzLCAgICAgMCwgIDApCitNVVhfQ0ZHKCJMMTRfMTZYWF9HUElPNDkiLAkgNiwgICAgMywgICAgNywgICAwLCAgMzEsICAgMCwgICAgMCwgICAgMzEsICAwKQogCiAvKiBPTUFQLTE2MTAgdVdpcmUgKi8KIE1VWF9DRkcoIlYxOV8xNjEwX1VXSVJFX1NDTEsiLAkgOCwgICAgNiwgICAgMCwJICAxLCAgMjAsICAgMCwJICAxLAkgMSwgIDEpCkBAIC01MDMsMTYgKzUxMCwxNyBAQAogTVVYX0NGRygiVzlfVVNCMl9UWEVOIiwJCSBCLCAgIDksICAgICAxLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIkFBOV9VU0IyX1ZQIiwJCSBCLCAgIDYsICAgICAxLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIlk1X1VTQjJfUkNWIiwJCSBDLCAgMjEsICAgICAxLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKLU1VWF9DRkcoIlI4X1VTQjJfVk0iLAkJIEMsICAxOCwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQorTVVYX0NGRygiUjlfVVNCMl9WTSIsCQkgQywgIDE4LCAgICAgMSwJIE5BLCAgIDAsICAgMCwJIE5BLAkgMCwgIDEpCiBNVVhfQ0ZHKCJWNl9VU0IyX1RYRCIsCQkgQywgIDI3LCAgICAgMiwJIE5BLCAgIDAsICAgMCwJIE5BLAkgMCwgIDEpCiBNVVhfQ0ZHKCJXNV9VU0IyX1NFMCIsCQkgQywgIDI0LCAgICAgMiwJIE5BLCAgIDAsICAgMCwJIE5BLAkgMCwgIDEpCiAKLQotLyogVUFSVDEgKi8KKy8qIDE2WFggVUFSVCAqLwogTVVYX0NGRygiUjEzXzE2MTBfVUFSVDFfVFgiLAkgQSwgIDEyLCAgICAgNiwJICAyLCAgMTAsICAgMCwJICAyLAkxMCwgIDEpCi1NVVhfQ0ZHKCJWMTRfMTYxMF9VQVJUMV9SWCIsCSA5LCAgMTgsICAgICAwLAkgIDIsICAgMiwgICAwLAkgIDIsCSAyLCAgMSkKK01VWF9DRkcoIlYxNF8xNlhYX1VBUlQxX1JYIiwJIDksICAxOCwgICAgIDAsCSAgMiwgICAyLCAgIDAsCSAgMiwJIDIsICAxKQogTVVYX0NGRygiUjE0XzE2MTBfVUFSVDFfQ1RTIiwJIDksICAxNSwgICAgIDAsCSAgMiwgICAxLCAgIDAsCSAgMiwJIDEsICAxKQogTVVYX0NGRygiQUExNV8xNjEwX1VBUlQxX1JUUyIsCSA5LCAgMTIsICAgICAxLAkgIDIsICAgMCwgICAwLAkgIDIsCSAwLCAgMSkKK01VWF9DRkcoIlI5XzE2WFhfVUFSVDJfUlgiLAkgQywgIDE4LCAgICAgMCwgICAzLCAgIDAsICAgMCwgICAgMywgICAgIDAsICAxKQorTVVYX0NGRygiTDE0XzE2WFhfVUFSVDNfUlgiLAkgNiwgICAzLCAgICAgMCwgICAwLCAgMzEsICAgMCwgICAgMCwgICAgMzEsICAxKQogCiAvKiBJMkMgaW50ZXJmYWNlICovCiBNVVhfQ0ZHKCJJMkNfU0NMIiwJCSA3LCAgMjQsICAgICAwLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaAppbmRleCA4OGIxZmU0Li4zOGE5Yjk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oCkBAIC0xODMsNSArMTgzLDM3IEBACiAjZGVmaW5lIE9NQVAxNlhYX1BXTF9FTkFCTEUJKE9NQVAxNlhYX1BXTF9CQVNFICsgMHgwMCkKICNkZWZpbmUgT01BUDE2WFhfUFdMX0NMS19FTkFCTEUJKE9NQVAxNlhYX1BXTF9CQVNFICsgMHgwNCkKIAorLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2F0Y2hkb2cgdGltZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIDMyLWJpdCBXYXRjaGRvZyB0aW1lciBpbiBPTUFQIDE2WFggKi8KKyNkZWZpbmUgT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgICAgICAgICgweGZmZmViMDAwKQorI2RlZmluZSBPTUFQXzE2WFhfV0lEUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MDApCisjZGVmaW5lIE9NQVBfMTZYWF9XRF9TWVNDT05GSUcgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgxMCkKKyNkZWZpbmUgT01BUF8xNlhYX1dEX1NZU1NUQVRVUyAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDE0KQorI2RlZmluZSBPTUFQXzE2WFhfV0NMUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MjQpCisjZGVmaW5lIE9NQVBfMTZYWF9XQ1JSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgyOCkKKyNkZWZpbmUgT01BUF8xNlhYX1dMRFIgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDJjKQorI2RlZmluZSBPTUFQXzE2WFhfV1RHUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MzApCisjZGVmaW5lIE9NQVBfMTZYWF9XV1BTICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgzNCkKKyNkZWZpbmUgT01BUF8xNlhYX1dTUFIgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDQ4KQorCisjZGVmaW5lIFdDTFJfUFJFX1NISUZUICAgICAgICAgNQorI2RlZmluZSBXQ0xSX1BUVl9TSElGVCAgICAgICAgIDIKKworI2RlZmluZSBXV1BTX1dfUEVORF9XU1BSICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFdXUFNfV19QRU5EX1dUR1IgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgV1dQU19XX1BFTkRfV0xEUiAgICAgICAoMSA8PCAyKQorI2RlZmluZSBXV1BTX1dfUEVORF9XQ1JSICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFdXUFNfV19QRU5EX1dDTFIgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBXU1BSX0VOQUJMRV8wICAgICAgICAgICgweDAwMDBiYmJiKQorI2RlZmluZSBXU1BSX0VOQUJMRV8xICAgICAgICAgICgweDAwMDA0NDQ0KQorI2RlZmluZSBXU1BSX0RJU0FCTEVfMCAgICAgICAgICgweDAwMDBhYWFhKQorI2RlZmluZSBXU1BSX0RJU0FCTEVfMSAgICAgICAgICgweDAwMDA1NTU1KQorCiAjZW5kaWYgLyogIF9fQVNNX0FSQ0hfT01BUDE2WFhfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zeXN0ZW0uaAppbmRleCAxN2EyYzQ4Li5mZjM3YmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmgKQEAgLTUsNyArNSw5IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKICNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCiB7CkBAIC0xNCw3ICsxNiwyNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUpCiB7Ci0Jb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMSk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCS8qCisJICogV29ya2Fyb3VuZCBmb3IgNTkxMi8xNjExYiBidWcgbWVudGlvbmVkIGluIHNwcnoyMDlkLnBkZiBwLiAyOAorCSAqICJHbG9iYWwgU29mdHdhcmUgUmVzZXQgQWZmZWN0cyBUcmFmZmljIENvbnRyb2xsZXIgRnJlcXVlbmN5Ii4KKwkgKi8KKwlpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhEUExMX0NUTCkgJiB+KDEgPDwgNCksCisJCQkJIERQTExfQ1RMKTsKKwkJb21hcF93cml0ZXcoMHg4LCBBUk1fUlNUQ1QxKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDSF9WT0lDRUJMVUUKKwlpZiAobWFjaGluZV9pc192b2ljZWJsdWUoKSkKKwkJdm9pY2VibHVlX3Jlc2V0KCk7CisJZWxzZQorI2VuZGlmCisJCW9tYXBfd3JpdGV3KDEsIEFSTV9SU1RDVDEpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvdXNiLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3VzYi5oCmluZGV4IDE0MzhjNmMuLjA1NGZiOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvdXNiLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91c2IuaApAQCAtNDcsNiArNDcsMTUgQEAKICMJZGVmaW5lCSBITUNfVExMQVRUQUNICQkoMSA8PCA2KQogIwlkZWZpbmUJIE9UR19ITUModykJCSgoKHcpPj4wKSYweDNmKQogI2RlZmluZSBPVEdfQ1RSTF9SRUcJCQlPVEdfUkVHMzIoMHgwYykKKyMJZGVmaW5lCSBPVEdfVVNCMl9FTgkJKDEgPDwgMjkpCisjCWRlZmluZQkgT1RHX1VTQjJfRFAJCSgxIDw8IDI4KQorIwlkZWZpbmUJIE9UR19VU0IyX0RNCQkoMSA8PCAyNykKKyMJZGVmaW5lCSBPVEdfVVNCMV9FTgkJKDEgPDwgMjYpCisjCWRlZmluZQkgT1RHX1VTQjFfRFAJCSgxIDw8IDI1KQorIwlkZWZpbmUJIE9UR19VU0IxX0RNCQkoMSA8PCAyNCkKKyMJZGVmaW5lCSBPVEdfVVNCMF9FTgkJKDEgPDwgMjMpCisjCWRlZmluZQkgT1RHX1VTQjBfRFAJCSgxIDw8IDIyKQorIwlkZWZpbmUJIE9UR19VU0IwX0RNCQkoMSA8PCAyMSkKICMJZGVmaW5lCSBPVEdfQVNFU1NWTEQJCSgxIDw8IDIwKQogIwlkZWZpbmUJIE9UR19CU0VTU0VORAkJKDEgPDwgMTkpCiAjCWRlZmluZQkgT1RHX0JTRVNTVkxECQkoMSA8PCAxOCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2RlYnVnLW1hY3JvLlMKaW5kZXggZjI4OGU3NC4uYjZlYzY4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2RlYnVnLW1hY3JvLlMKQEAgLTExLDYgKzExLDggQEAKICAqCiAqLwogCisjaW5jbHVkZSAiaGFyZHdhcmUuaCIKKwogCQkubWFjcm8JYWRkcnVhcnQscngKIAkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKIAkJdHN0CVxyeCwgIzEJCQlAIE1NVSBlbmFibGVkPwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL210ZC14aXAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tdGQteGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tdGQteGlwLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSXQncyBpbmNsdWRlZCBmcm9tIGxpbnV4L210ZC94aXAuaAorICogCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CU5vdiAyLCAyMDA0CisgKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICRJZDogeGlwLmgsdiAxLjIgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfUFhBX01URF9YSVBfSF9fCisjZGVmaW5lIF9fQVJDSF9QWEFfTVREX1hJUF9IX18KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKyNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQkoSUNJUCAmIElDTVIpCisKKy8qIHdlIHNhbXBsZSBPU0NSIGFuZCBjb252ZXJ0IGRlc2lyZWQgZGVsdGEgdG8gdXNlYyAoMS80IH49IDEwMDAwMDAvMzY4NjQwMCkgKi8KKyNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCShPU0NSKQorI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoc2lnbmVkKSgoT1NDUiAtICh4KSkgLyA0KQorCisvKgorICogeGlwX2NwdV9pZGxlKCkgaXMgdXNlZCB3aGVuIHdhaXRpbmcgZm9yIGEgZGVsYXkgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKyAqIHRoZSBzeXN0ZW0gdGltZXIgdGljayBwZXJpb2QuICBUaGlzIHNob3VsZCBwdXQgdGhlIENQVSBpbnRvIGlkbGUgbW9kZQorICogdG8gc2F2ZSBwb3dlciBhbmQgdG8gYmUgd29rZW4gdXAgb25seSB3aGVuIHNvbWUgaW50ZXJydXB0cyBhcmUgcGVuZGluZy4KKyAqIEFzIGFib3ZlLCB0aGlzIHNob3VsZCBub3QgcmVseSB1cG9uIHN0YW5kYXJkIGtlcm5lbCBjb2RlLgorICovCisKKyNkZWZpbmUgeGlwX2NwdV9pZGxlKCkgIGFzbSB2b2xhdGlsZSAoIm1jciBwMTQsIDAsICUwLCBjNywgYzAsIDAiIDo6ICJyIiAoMSkpCisKKyNlbmRpZiAvKiBfX0FSQ0hfUFhBX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCmluZGV4IGI1ZTU0YTllLi41MWYwZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaApAQCAtMTUwNSw2ICsxNTA1LDcgQEAKICNkZWZpbmUgUFNTUl9PVEdQSAkoMSA8PCA2KQkvKiBPVEcgUGVyaXBoZXJhbCBjb250cm9sIEhvbGQgKi8KICNkZWZpbmUgUFNTUl9SREgJKDEgPDwgNSkJLyogUmVhZCBEaXNhYmxlIEhvbGQgKi8KICNkZWZpbmUgUFNTUl9QSAkJKDEgPDwgNCkJLyogUGVyaXBoZXJhbCBDb250cm9sIEhvbGQgKi8KKyNkZWZpbmUgUFNTUl9TVFMJKDEgPDwgMykJLyogU3RhbmRieSBNb2RlIFN0YXR1cyAqLwogI2RlZmluZSBQU1NSX1ZGUwkoMSA8PCAyKQkvKiBWREQgRmF1bHQgU3RhdHVzICovCiAjZGVmaW5lIFBTU1JfQkZTCSgxIDw8IDEpCS8qIEJhdHRlcnkgRmF1bHQgU3RhdHVzICovCiAjZGVmaW5lIFBTU1JfU1NTCSgxIDw8IDApCS8qIFNvZnR3YXJlIFNsZWVwIFN0YXR1cyAqLwpAQCAtMTk2NSw2ICsxOTY2LDcgQEAKICNkZWZpbmUgTUVDUl9OT1MJKDEgPDwgMCkJLyogTnVtYmVyIE9mIFNvY2tldHM6IDAgLT4gMSBzb2NrLCAxIC0+IDIgc29jayAqLwogI2RlZmluZSBNRUNSX0NJVAkoMSA8PCAxKQkvKiBDYXJkIElzIFRoZXJlOiAwIC0+IG5vIGNhcmQsIDEgLT4gY2FyZCBpbnNlcnRlZCAqLwogCisjZGVmaW5lIE1EUkVGUl9LMERCNAkoMSA8PCAyOSkJLyogU0RDTEswIERpdmlkZSBieSA0IENvbnRyb2wvU3RhdHVzICovCiAjZGVmaW5lIE1EUkVGUl9LMkZSRUUJKDEgPDwgMjUpCS8qIFNEUkFNIEZyZWUtUnVubmluZyBDb250cm9sICovCiAjZGVmaW5lIE1EUkVGUl9LMUZSRUUJKDEgPDwgMjQpCS8qIFNEUkFNIEZyZWUtUnVubmluZyBDb250cm9sICovCiAjZGVmaW5lIE1EUkVGUl9LMEZSRUUJKDEgPDwgMjMpCS8qIFNEUkFNIEZyZWUtUnVubmluZyBDb250cm9sICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2F1ZGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyNzZlNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYXVkaW8uaApAQCAtMCwwICsxLDQ5IEBACisvKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2F1ZGlvLmgKKyAqCisgKiAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNFhYIC0gQXVkaW8gcGxhdGZyb21fZGV2aWNlIGluZm8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENoYW5nZWxvZzoKKyAqCTIwLU5vdi0yMDA0IEJKRCAgQ3JlYXRlZCBmaWxlCisgKgkwNy1NYXItMjAwNSBCSkQgIEFkZGVkIHN1c3BlbmQvcmVzdW1lIGNhbGxzCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQVVESU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0FVRElPX0ggX19GSUxFX18KKworLyogc3RydWN0IHMzYzI0eHhfaWlzX29wcworICoKKyAqIGNhbGxlZCBmcm9tIHRoZSBzM2MyNHh4IGF1ZGlvIGNvcmUgdG8gZGVhbCB3aXRoIHRoZSBhcmNoaXRlY3R1cmUKKyAqIG9yIHRoZSBjb2RlYydzIHNldHVwIGFuZCBjb250cm9sLgorICoKKyAqIHRoZSBwb2ludGVyIHRvIGl0c2VsZiBpcyBwYXNzZWQgdGhyb3VnaCBpbiBjYXNlIHRoZSBjYWxsZXIgd2FudHMgdG8KKyAqIGVtYmVkIHRoaXMgaW4gYW4gbGFyZ2VyIHN0cnVjdHVyZSBmb3IgZWFzeSByZWZlcmVuY2UgdG8gaXQncyBjb250ZXh0LgorKi8KKworc3RydWN0IHMzYzI0eHhfaWlzX29wcyB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwlpbnQJKCpzdGFydHVwKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSk7CisJdm9pZAkoKnNodXRkb3duKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSk7CisJaW50CSgqc3VzcGVuZCkoc3RydWN0IHMzYzI0eHhfaWlzX29wcyAqbWUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IHMzYzI0eHhfaWlzX29wcyAqbWUpOworCisJaW50CSgqb3Blbikoc3RydWN0IHMzYzI0eHhfaWlzX29wcyAqbWUsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN0cm0pOworCWludAkoKmNsb3NlKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3RybSk7CisJaW50CSgqcHJlcGFyZSkoc3RydWN0IHMzYzI0eHhfaWlzX29wcyAqbWUsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN0cm0sIHNuZF9wY21fcnVudGltZV90ICpydCk7Cit9OworCitzdHJ1Y3QgczNjMjR4eF9wbGF0ZGF0YV9paXMgeworCWNvbnN0IGNoYXIJCSpjb2RlY19jbGs7CisJc3RydWN0IHMzYzI0eHhfaWlzX29wcwkqb3BzOworCWludAkJCSgqbWF0Y2hfZGV2KShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL210ZC14aXAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9tdGQteGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjZmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9tdGQteGlwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSXQncyBpbmNsdWRlZCBmcm9tIGxpbnV4L210ZC94aXAuaAorICogCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CU5vdiAyLCAyMDA0CisgKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICRJZDogeGlwLmgsdiAxLjIgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfU0ExMTAwX01URF9YSVBfSF9fCisjZGVmaW5lIF9fQVJDSF9TQTExMDBfTVREX1hJUF9IX18KKworI2RlZmluZSB4aXBfaXJxcGVuZGluZygpCShJQ0lQICYgSUNNUikKKworLyogd2Ugc2FtcGxlIE9TQ1IgYW5kIGNvbnZlcnQgZGVzaXJlZCBkZWx0YSB0byB1c2VjICgxLzQgfj0gMTAwMDAwMC8zNjg2NDAwKSAqLworI2RlZmluZSB4aXBfY3VycnRpbWUoKQkJKE9TQ1IpCisjZGVmaW5lIHhpcF9lbGFwc2VkX3NpbmNlKHgpCShzaWduZWQpKChPU0NSIC0gKHgpKSAvIDQpCisKKyNlbmRpZiAvKiBfX0FSQ0hfU0ExMTAwX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zaGFyay9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2hhcmsvaW8uaAppbmRleCAxZTdmMjZiLi41ZTZlZDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zaGFyay9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNoYXJrL2lvLmgKQEAgLTIxLDM4ICsyMSw4IEBACiAgKi8KICNkZWZpbmUgX19QT1JUX1BDSU8oeCkJKCEoKHgpICYgMHg4MDAwMDAwMCkpCiAKLS8qCi0gKiBEeW5hbWljIElPIGZ1bmN0aW9ucyAtIGxldCB0aGUgY29tcGlsZXIKLSAqIG9wdGltaXplIHRoZSBleHByZXNzaW9ucwotICovCi0jZGVmaW5lIERFQ0xBUkVfRFlOX09VVChmbnN1ZmZpeCxpbnN0cikJCQkJCQlcCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXQjI2Zuc3VmZml4ICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBwb3J0KQlcCi17CQkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIHRlbXA7CQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkJXAotCSJ0c3QJJTIsICMweDgwMDAwMDAwXG5cdCIJCQkJCQlcCi0JIm1vdgklMCwgJTRcblx0IgkJCQkJCQlcCi0JImFkZGVxCSUwLCAlMCwgJTNcblx0IgkJCQkJCQlcCi0JInN0ciIgaW5zdHIgIgklMSwgWyUwLCAlMl0JQCBvdXQiICNmbnN1ZmZpeAkJCVwKLQk6ICI9JnIiICh0ZW1wKQkJCQkJCQkJXAotCTogInIiICh2YWx1ZSksICJyIiAocG9ydCksICJJciIgKFBDSU9fQkFTRSAtIElPX0JBU0UpLCAiSXIiIChJT19CQVNFKQlcCi0JOiAiY2MiKTsJCQkJCQkJCVwKLX0KKyNkZWZpbmUgX19pbyhhKSAgICAgICAgICAgICAgICAgKCh2b2lkIF9faW9tZW0gKikoUENJT19CQVNFICsgKGEpKSkKIAotI2RlZmluZSBERUNMQVJFX0RZTl9JTihzeixmbnN1ZmZpeCxpbnN0cikJCQkJCVwKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc3ogX19pbiMjZm5zdWZmaXggKHVuc2lnbmVkIGludCBwb3J0KQkJXAotewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyB0ZW1wLCB2YWx1ZTsJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJCVwKLQkidHN0CSUyLCAjMHg4MDAwMDAwMFxuXHQiCQkJCQkJXAotCSJtb3YJJTAsICU0XG5cdCIJCQkJCQkJXAotCSJhZGRlcQklMCwgJTAsICUzXG5cdCIJCQkJCQkJXAotCSJsZHIiIGluc3RyICIJJTEsIFslMCwgJTJdCUAgaW4iICNmbnN1ZmZpeAkJCQlcCi0JOiAiPSZyIiAodGVtcCksICI9ciIgKHZhbHVlKQkJCQkJCVwKLQk6ICJyIiAocG9ydCksICJJciIgKFBDSU9fQkFTRSAtIElPX0JBU0UpLCAiSXIiIChJT19CQVNFKQkJXAotCTogImNjIik7CQkJCQkJCQlcCi0JcmV0dXJuICh1bnNpZ25lZCBzeil2YWx1ZTsJCQkJCQlcCi19CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9faW9hZGRyICh1bnNpZ25lZCBpbnQgcG9ydCkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTYyLDEyMyArMzIsOCBAQAogCQlyZXR1cm4gKHVuc2lnbmVkIGludCkoSU9fQkFTRSArIChwb3J0KSk7CQkJXAogfQogCi0jZGVmaW5lIERFQ0xBUkVfSU8oc3osZm5zdWZmaXgsaW5zdHIpCVwKLQlERUNMQVJFX0RZTl9PVVQoZm5zdWZmaXgsaW5zdHIpCVwKLQlERUNMQVJFX0RZTl9JTihzeixmbnN1ZmZpeCxpbnN0cikKLQotREVDTEFSRV9JTyhjaGFyLGIsImIiKQotREVDTEFSRV9JTyhzaG9ydCx3LCJoIikKLURFQ0xBUkVfSU8obG9uZyxsLCIiKQotCi0jdW5kZWYgREVDTEFSRV9JTwotI3VuZGVmIERFQ0xBUkVfRFlOX09VVAotI3VuZGVmIERFQ0xBUkVfRFlOX0lOCi0KLS8qCi0gKiBDb25zdGFudCBhZGRyZXNzIElPIGZ1bmN0aW9ucwotICoKLSAqIFRoZXNlIGhhdmUgdG8gYmUgbWFjcm9zIGZvciB0aGUgJ0onIGNvbnN0cmFpbnQgdG8gd29yayAtCi0gKiArLy00MDk2IGltbWVkaWF0ZSBvcGVyYW5kLgotICovCi0jZGVmaW5lIF9fb3V0YmModmFsdWUscG9ydCkJCQkJCQkJXAotKHsJCQkJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkic3RyYgklMCwgWyUxLCAlMl0JCUAgb3V0YmMiCQkJXAotCQk6IDogInIiICh2YWx1ZSksICJyIiAoUENJT19CQVNFKSwgIkpyIiAocG9ydCkpOwkJXAotCWVsc2UJCQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJInN0cmIJJTAsIFslMSwgJTJdCQlAIG91dGJjIgkJCVwKLQkJOiA6ICJyIiAodmFsdWUpLCAiciIgKElPX0JBU0UpLCAiciIgKHBvcnQpKTsJCVwKLX0pCi0KLSNkZWZpbmUgX19pbmJjKHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgY2hhciByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkibGRyYgklMCwgWyUxLCAlMl0JCUAgaW5iYyIJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKFBDSU9fQkFTRSksICJKciIgKHBvcnQpKTsJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJsZHJiCSUwLCBbJTEsICUyXQkJQCBpbmJjIgkJCQlcCi0JCTogIj1yIiAocmVzdWx0KSA6ICJyIiAoSU9fQkFTRSksICJyIiAocG9ydCkpOwkJXAotCXJlc3VsdDsJCQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fb3V0d2ModmFsdWUscG9ydCkJCQkJCQkJXAotKHsJCQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgdiA9IHZhbHVlOwkJCQkJCVwKLQlpZiAoX19QT1JUX1BDSU8oKHBvcnQpKSkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJInN0cmgJJTAsIFslMSwgJTJdCQlAIG91dHdjIgkJCVwKLQkJOiA6ICJyIiAodnx2PDwxNiksICJyIiAoUENJT19CQVNFKSwgIkpyIiAocG9ydCkpOwlcCi0JZWxzZQkJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkic3RyaAklMCwgWyUxLCAlMl0JCUAgb3V0d2MiCQkJXAotCQk6IDogInIiICh2fHY8PDE2KSwgInIiIChJT19CQVNFKSwgInIiIChwb3J0KSk7CQlcCi19KQotCi0jZGVmaW5lIF9faW53Yyhwb3J0KQkJCQkJCQkJXAotKHsJCQkJCQkJCQkJXAotCXVuc2lnbmVkIHNob3J0IHJlc3VsdDsJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkibGRyaAklMCwgWyUxLCAlMl0JCUAgaW53YyIJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKFBDSU9fQkFTRSksICJKciIgKHBvcnQpKTsJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJsZHJoCSUwLCBbJTEsICUyXQkJQCBpbndjIgkJCQlcCi0JCTogIj1yIiAocmVzdWx0KSA6ICJyIiAoSU9fQkFTRSksICJyIiAocG9ydCkpOwkJXAotCXJlc3VsdCAmIDB4ZmZmZjsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX291dGxjKHZhbHVlLHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyB2ID0gdmFsdWU7CQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkic3RyCSUwLCBbJTEsICUyXQkJQCBvdXRsYyIJCQlcCi0JCTogOiAiciIgKHYpLCAiciIgKFBDSU9fQkFTRSksICJKciIgKHBvcnQpKTsJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJzdHIJJTAsIFslMSwgJTJdCQlAIG91dGxjIgkJCVwKLQkJOiA6ICJyIiAodiksICJyIiAoSU9fQkFTRSksICJyIiAocG9ydCkpOwkJCVwKLX0pCi0KLSNkZWZpbmUgX19pbmxjKHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyByZXN1bHQ7CQkJCQkJCVwKLQlpZiAoX19QT1JUX1BDSU8oKHBvcnQpKSkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJImxkcgklMCwgWyUxLCAlMl0JCUAgaW5sYyIJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKFBDSU9fQkFTRSksICJKciIgKHBvcnQpKTsJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJsZHIJJTAsIFslMSwgJTJdCQlAIGlubGMiCQkJCVwKLQkJOiAiPXIiIChyZXN1bHQpIDogInIiIChJT19CQVNFKSwgInIiIChwb3J0KSk7CQlcCi0JcmVzdWx0OwkJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19pb2FkZHJjKHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBhZGRyOwkJCQkJCQlcCi0JaWYgKF9fUE9SVF9QQ0lPKChwb3J0KSkpCQkJCQkJXAotCQlhZGRyID0gUENJT19CQVNFICsgKHBvcnQpOwkJCQlcCi0JZWxzZQkJCQkJCQkJCVwKLQkJYWRkciA9IElPX0JBU0UgKyAocG9ydCk7CQkJCQlcCi0JYWRkcjsJCQkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fbWVtX3BjaShhZGRyKSAoYWRkcikKIAotI2RlZmluZSBpbmIocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW5iYyhwKSAgICA6IF9faW5iKHApKQotI2RlZmluZSBpbncocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW53YyhwKSAgICA6IF9faW53KHApKQotI2RlZmluZSBpbmwocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW5sYyhwKSAgICA6IF9faW5sKHApKQotI2RlZmluZSBvdXRiKHYscCkJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX291dGJjKHYscCkgOiBfX291dGIodixwKSkKLSNkZWZpbmUgb3V0dyh2LHApCShfX2J1aWx0aW5fY29uc3RhbnRfcCgocCkpID8gX19vdXR3Yyh2LHApIDogX19vdXR3KHYscCkpCi0jZGVmaW5lIG91dGwodixwKQkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9fb3V0bGModixwKSA6IF9fb3V0bCh2LHApKQotCiAvKgogICogVHJhbnNsYXRlZCBhZGRyZXNzIElPIGZ1bmN0aW9ucwogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9hcm1fdGltZXIuaCBiL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9hcm1fdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJlM2JkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2FybV90aW1lci5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19BU01fQVJNX0hBUkRXQVJFX0FSTV9USU1FUl9ICisjZGVmaW5lIF9fQVNNX0FSTV9IQVJEV0FSRV9BUk1fVElNRVJfSAorCisjZGVmaW5lIFRJTUVSX0xPQUQJMHgwMAorI2RlZmluZSBUSU1FUl9WQUxVRQkweDA0CisjZGVmaW5lIFRJTUVSX0NUUkwJMHgwOAorI2RlZmluZSBUSU1FUl9DVFJMX09ORVNIT1QJKDEgPDwgMCkKKyNkZWZpbmUgVElNRVJfQ1RSTF8zMkJJVAkoMSA8PCAxKQorI2RlZmluZSBUSU1FUl9DVFJMX0RJVjEJCSgwIDw8IDIpCisjZGVmaW5lIFRJTUVSX0NUUkxfRElWMTYJKDEgPDwgMikKKyNkZWZpbmUgVElNRVJfQ1RSTF9ESVYyNTYJKDIgPDwgMikKKyNkZWZpbmUgVElNRVJfQ1RSTF9JRQkJKDEgPDwgNSkJLyogSW50ZXJydXB0IEVuYWJsZSAodmVyc2F0aWxlIG9ubHkpICovCisjZGVmaW5lIFRJTUVSX0NUUkxfUEVSSU9ESUMJKDEgPDwgNikKKyNkZWZpbmUgVElNRVJfQ1RSTF9FTkFCTEUJKDEgPDwgNykKKworI2RlZmluZSBUSU1FUl9JTlRDTFIJMHgwYworI2RlZmluZSBUSU1FUl9SSVMJMHgxMAorI2RlZmluZSBUSU1FUl9NSVMJMHgxNAorI2RlZmluZSBUSU1FUl9CR0xPQUQJMHgxOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9pZGUuaCBiL2luY2x1ZGUvYXNtLWFybS9pZGUuaAppbmRleCAyMTE0YWNiLi40ZjY4YzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaWRlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2lkZS5oCkBAIC01LDcgKzUsNyBAQAogICovCiAKIC8qCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpMzg2IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBJREUgY29kZS4KKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFSTSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgSURFIGNvZGUuCiAgKi8KIAogI2lmbmRlZiBfX0FTTUFSTV9JREVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vaW8uaAppbmRleCBjYzRiNWY1Li5jZmE3MWEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW8uaApAQCAtODIsNyArODIsNyBAQAogICogb25seS4gIFRoZWlyIHByaW1hcnkgcHVycG9zZSBpcyB0byBhY2Nlc3MgUENJIGFuZCBJU0EgcGVyaXBoZXJhbHMuCiAgKgogICogTm90ZSB0aGF0IGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZwotICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZSwgYXMgZGVzY3JpYmVkIGJ5IG51bWVyaW91cworICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZSwgYXMgZGVzY3JpYmVkIGJ5IG51bWVyb3VzCiAgKiBBUk0gZG9jdW1lbnRzOgogICoKICAqICAgIFBDSTogIEQwLUQ3ICAgRDgtRDE1IEQxNi1EMjMgRDI0LUQzMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2xvY2tzLmggYi9pbmNsdWRlL2FzbS1hcm0vbG9ja3MuaAppbmRleCBjMjYyOThmLi45Y2IzM2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbG9ja3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbG9ja3MuaApAQCAtNjEsNyArNjEsNyBAQAogIglzdHJleAlpcCwgbHIsIFslMF1cbiIJCQlcCiAiCXRlcQlpcCwgIzBcbiIJCQlcCiAiCWJuZQkxYlxuIgkJCQlcCi0iCXRlcQlsciwgIzBcbiIJCQlcCisiCWNtcAlsciwgIzBcbiIJCQlcCiAiCW1vdmxlCWlwLCAlMFxuIgkJCVwKICIJYmxsZQkiICN3YWtlCQkJCVwKIAk6CQkJCQlcCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCiAJIkAgdXBfb3BfcmVhZFxuIgkJCVwKICIxOglsZHJleAlsciwgWyUwXVxuIgkJCVwKLSIJYWRkCWxyLCBsciwgJTFcbiIJCQlcCisiCWFkZHMJbHIsIGxyLCAlMVxuIgkJCVwKICIJc3RyZXgJaXAsIGxyLCBbJTBdXG4iCQkJXAogIgl0ZXEJaXAsICMwXG4iCQkJXAogIglibmUJMWJcbiIJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21hY2gvYXJjaC5oIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvYXJjaC5oCmluZGV4IDNhMzJlOTIuLjU2YzZiZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL2FyY2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAkJCQkJCSAqIHBhZ2UgdGFiZSBlbnRyeQkqLwogCiAJY29uc3QgY2hhcgkJKm5hbWU7CQkvKiBhcmNoaXRlY3R1cmUgbmFtZQkqLwotCXVuc2lnbmVkIGludAkJcGFyYW1fb2Zmc2V0OwkvKiBwYXJhbWV0ZXIgcGFnZQkqLworCXVuc2lnbmVkIGxvbmcJCWJvb3RfcGFyYW1zOwkvKiB0YWdnZWQgbGlzdAkJKi8KIAogCXVuc2lnbmVkIGludAkJdmlkZW9fc3RhcnQ7CS8qIHN0YXJ0IG9mIHZpZGVvIFJBTQkqLwogCXVuc2lnbmVkIGludAkJdmlkZW9fZW5kOwkvKiBlbmQgb2YgdmlkZW8gUkFNCSovCkBAIC01NCwzOCArNTQsNiBAQAogCS5ucgkJPSBNQUNIX1RZUEVfIyNfdHlwZSwJXAogCS5uYW1lCQk9IF9uYW1lLAogCi0jZGVmaW5lIE1BSU5UQUlORVIobikKLQotI2RlZmluZSBCT09UX01FTShfcHJhbSxfcGlvLF92aW8pCQlcCi0JLnBoeXNfcmFtCT0gX3ByYW0sCQlcCi0JLnBoeXNfaW8JPSBfcGlvLAkJCVwKLQkuaW9fcGdfb2Zmc3QJPSAoKF92aW8pPj4xOCkmMHhmZmZjLAotCi0jZGVmaW5lIEJPT1RfUEFSQU1TKF9wYXJhbXMpCQkJXAotCS5wYXJhbV9vZmZzZXQJPSBfcGFyYW1zLAotCi0jZGVmaW5lIFZJREVPKF9zdGFydCxfZW5kKQkJCVwKLQkudmlkZW9fc3RhcnQJPSBfc3RhcnQsCQlcCi0JLnZpZGVvX2VuZAk9IF9lbmQsCi0KLSNkZWZpbmUgRElTQUJMRV9QQVJQT1JUKF9uKQkJCVwKLQkucmVzZXJ2ZV9scCMjX24JPSAxLAotCi0jZGVmaW5lIFNPRlRfUkVCT09UCQkJCVwKLQkuc29mdF9yZWJvb3QJPSAxLAotCi0jZGVmaW5lIEZJWFVQKF9mdW5jKQkJCQlcCi0JLmZpeHVwCQk9IF9mdW5jLAotCi0jZGVmaW5lIE1BUElPKF9mdW5jKQkJCQlcCi0JLm1hcF9pbwkJPSBfZnVuYywKLQotI2RlZmluZSBJTklUSVJRKF9mdW5jKQkJCQlcCi0JLmluaXRfaXJxCT0gX2Z1bmMsCi0KLSNkZWZpbmUgSU5JVF9NQUNISU5FKF9mdW5jKQkJCVwKLQkuaW5pdF9tYWNoaW5lCT0gX2Z1bmMsCi0KICNkZWZpbmUgTUFDSElORV9FTkQJCQkJXAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21hY2gvdGltZS5oIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvdGltZS5oCmluZGV4IDA0Nzk4MGEuLjJjZjI3OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL3RpbWUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC90aW1lLmgKQEAgLTYwLDYgKzYwLDggQEAKIH07CiAKIHZvaWQgdGltZXJfZHluX3JlcHJvZ3JhbSh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHRpbWVyX2R5bl9yZXByb2dyYW0oKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgKnN5c3RlbV90aW1lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tdGQteGlwLmggYi9pbmNsdWRlL2FzbS1hcm0vbXRkLXhpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjEyN2NjNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tdGQteGlwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSXQncyBpbmNsdWRlZCBmcm9tIGxpbnV4L210ZC94aXAuaAorICogCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CU5vdiAyLCAyMDA0CisgKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICRJZDogeGlwLmgsdiAxLjIgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FSTV9NVERfWElQX0hfXworI2RlZmluZSBfX0FSTV9NVERfWElQX0hfXworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXRkLXhpcC5oPgorCisvKiBmaWxsIGluc3RydWN0aW9uIHByZWZldGNoICovCisjZGVmaW5lIHhpcF9pcHJlZmV0Y2goKSAJZG8geyBhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fQVJNX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGNpLmggYi9pbmNsdWRlL2FzbS1hcm0vcGNpLmgKaW5kZXggNDBmZmFlZi4uYjI4ZjFjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wY2kuaApAQCAtMTQsNyArMTQsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTQyLDYgKzQyLDE2IEBACiAjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgoUFRSKS0+TEVOX05BTUUpCiAjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJKCgoUFRSKS0+TEVOX05BTUUpID0gKFZBTCkpCiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKICNkZWZpbmUgSEFWRV9QQ0lfTU1BUAogZXh0ZXJuIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NtcC5oIGIvaW5jbHVkZS9hc20tYXJtL3NtcC5oCmluZGV4IDZjNmM2MGEuLmRiYjRkODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc21wLmgKQEAgLTIzLDkgKzIzLDYgQEAKIAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKIAotZXh0ZXJuIGNwdW1hc2tfdCBjcHVfcHJlc2VudF9tYXNrOwotI2RlZmluZSBjcHVfcG9zc2libGVfbWFwIGNwdV9wcmVzZW50X21hc2sKLQogLyoKICAqIGF0IHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90IGEgYmlnIHBlbmFsdHkgZm9yIGNoYW5naW5nIENQVXMKICAqICh0aGUgPmJpZzwgcGVuYWx0eSBpcyBydW5uaW5nIFNNUCBpbiB0aGUgZmlyc3QgcGxhY2UpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCmluZGV4IDE4MjMyMzYuLjk3MDVkNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCkBAIC03OSw3ICs3OSw4IEBACiB9IHJ3bG9ja190OwogCiAjZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KSB7IDAgfQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQkJZG8geyAqKHgpICsgUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJ3bG9ja19pc19sb2NrZWQoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh4KSkgIT0gMCkKIAogLyoKICAqIFdyaXRlIGxvY2tzIGFyZSBlYXN5IC0gd2UganVzdCBzZXQgYml0IDMxLiAgV2hlbiB1bmxvY2tpbmcsIHdlIGNhbgpAQCAtMTAwLDYgKzEwMSwyMSBAQAogCTogImNjIiwgIm1lbW9yeSIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbGRyZXgJJTAsIFslMV1cbiIKKyIJdGVxCSUwLCAjMFxuIgorIglzdHJleGVxCSUwLCAlMiwgWyUxXSIKKwk6ICI9JnIiICh0bXApCisJOiAiciIgKCZydy0+bG9jayksICJyIiAoMHg4MDAwMDAwMCkKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0bXAgPT0gMDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTEzOCw2ICsxNTQsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCiB7CisJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7CisKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIxOglsZHJleAklMCwgWyUyXVxuIgogIglzdWIJJTAsICUwLCAjMVxuIgpAQCAtMTUxLDE5ICsxNjksNCBAQAogCiAjZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbGRyZXgJJTAsIFslMV1cbiIKLSIJdGVxCSUwLCAjMFxuIgotIglzdHJleGVxCSUwLCAlMiwgWyUxXSIKLQk6ICI9JnIiICh0bXApCi0JOiAiciIgKCZydy0+bG9jayksICJyIiAoMHg4MDAwMDAwMCkKLQk6ICJjYyIsICJtZW1vcnkiKTsKLQotCXJldHVybiB0bXAgPT0gMDsKLX0KLQogI2VuZGlmIC8qIF9fQVNNX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zdGF0LmggYi9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oCmluZGV4IGNhOGU3YTguLmVjNGUyYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zdGF0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3N0YXQuaApAQCAtODksNiArODksNiBAQAogCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWVfbnNlYzsKIAogCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKaW5kZXggM2QwZDI4Ni4uMmY0NGIyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaApAQCAtODUsNyArODUsOSBAQAogdm9pZCBkaWUoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVycikKIAkJX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKIAotdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlcnIpOworc3RydWN0IHNpZ2luZm87Cit2b2lkIG5vdGlmeV9kaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2luZm8gKmluZm8sCisJCXVuc2lnbmVkIGxvbmcgZXJyLCB1bnNpZ25lZCBsb25nIHRyYXApOwogCiB2b2lkIGhvb2tfZmF1bHRfY29kZShpbnQgbnIsIGludCAoKmZuKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQsCiAJCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICopLApAQCAtMjkwLDcgKzI5Miw2IEBACiB9KQogCiAjaWZkZWYgQ09ORklHX1NNUAotI2Vycm9yIFNNUCBub3Qgc3VwcG9ydGVkCiAKICNkZWZpbmUgc21wX21iKCkJCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCQlybWIoKQpAQCAtMzA0LDYgKzMwNSw4IEBACiAjZGVmaW5lIHNtcF93bWIoKQkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCQlkbyB7IH0gd2hpbGUoMCkKIAorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TQTExMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TQTExMCkKIC8qCiAgKiBPbiB0aGUgU3Ryb25nQVJNLCAic3dwIiBpcyB0ZXJtaW5hbGx5IGJyb2tlbiBzaW5jZSBpdCBieXBhc3NlcyB0aGUKQEAgLTMxNiw5ICszMTksMTYgQEAKICAqCiAgKiBXZSBjaG9vc2UgKDEpIHNpbmNlIGl0cyB0aGUgImVhc2llc3QiIHRvIGFjaGlldmUgaGVyZSBhbmQgaXMgbm90CiAgKiBkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvciB0eXBlLgorICoKKyAqIE5PVEUgdGhhdCB0aGlzIHNvbHV0aW9uIHdvbid0IHdvcmsgb24gYW4gU01QIHN5c3RlbSwgc28gZXhwbGNpdGx5CisgKiBmb3JiaWQgaXQgaGVyZS4KICAqLworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciBTTVAgaXMgbm90IHN1cHBvcnRlZCBvbiBTQTExMDAvU0ExMTAKKyNlbHNlCiAjZGVmaW5lIHN3cF9pc19idWdneQogI2VuZGlmCisjZW5kaWYKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKnB0ciwgaW50IHNpemUpCiB7CkBAIC0zNjEsOCArMzcxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKaW5kZXggOGE4NjRiMS4uOTM4N2E1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiAjZGVmaW5lIHRsYl9mbGFnKGYpCSgoYWx3YXlzX3RsYl9mbGFncyAmIChmKSkgfHwgKF9fdGxiX2ZsYWcgJiBwb3NzaWJsZV90bGJfZmxhZ3MgJiAoZikpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAljb25zdCBpbnQgemVybyA9IDA7CiAJY29uc3QgdW5zaWduZWQgaW50IF9fdGxiX2ZsYWcgPSBfX2NwdV90bGJfZmxhZ3M7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAkJYXNtKCJtY3IlPyBwMTUsIDAsICUwLCBjOCwgYzUsIDAiIDogOiAiciIgKHplcm8pKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9mbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJY29uc3QgaW50IHplcm8gPSAwOwogCWNvbnN0IGludCBhc2lkID0gQVNJRChtbSk7CkBAIC0yODIsNyArMjgyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1mbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB1YWRkcikKK2xvY2FsX2ZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVhZGRyKQogewogCWNvbnN0IGludCB6ZXJvID0gMDsKIAljb25zdCB1bnNpZ25lZCBpbnQgX190bGJfZmxhZyA9IF9fY3B1X3RsYl9mbGFnczsKQEAgLTMxMyw3ICszMTMsNyBAQAogCQlhc20oIm1jciU/IHAxNSwgMCwgJTAsIGM4LCBjNSwgMSIgOiA6ICJyIiAodWFkZHIpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQogewogCWNvbnN0IGludCB6ZXJvID0gMDsKIAljb25zdCB1bnNpZ25lZCBpbnQgX190bGJfZmxhZyA9IF9fY3B1X3RsYl9mbGFnczsKQEAgLTM4NCw4ICszODQsMjQgQEAKIC8qCiAgKiBDb252ZXJ0IGNhbGxzIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb24uCiAgKi8KLSNkZWZpbmUgZmx1c2hfdGxiX3JhbmdlKHZtYSxzdGFydCxlbmQpCV9fY3B1X2ZsdXNoX3VzZXJfdGxiX3JhbmdlKHN0YXJ0LGVuZCx2bWEpCi0jZGVmaW5lIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UocyxlKQlfX2NwdV9mbHVzaF9rZXJuX3RsYl9yYW5nZShzLGUpCisjZGVmaW5lIGxvY2FsX2ZsdXNoX3RsYl9yYW5nZSh2bWEsc3RhcnQsZW5kKQlfX2NwdV9mbHVzaF91c2VyX3RsYl9yYW5nZShzdGFydCxlbmQsdm1hKQorI2RlZmluZSBsb2NhbF9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHMsZSkJX19jcHVfZmx1c2hfa2Vybl90bGJfcmFuZ2UocyxlKQorCisjaWZuZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgZmx1c2hfdGxiX2FsbAkJbG9jYWxfZmx1c2hfdGxiX2FsbAorI2RlZmluZSBmbHVzaF90bGJfbW0JCWxvY2FsX2ZsdXNoX3RsYl9tbQorI2RlZmluZSBmbHVzaF90bGJfcGFnZQkJbG9jYWxfZmx1c2hfdGxiX3BhZ2UKKyNkZWZpbmUgZmx1c2hfdGxiX2tlcm5lbF9wYWdlCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZQorI2RlZmluZSBmbHVzaF90bGJfcmFuZ2UJCWxvY2FsX2ZsdXNoX3RsYl9yYW5nZQorI2RlZmluZSBmbHVzaF90bGJfa2VybmVsX3JhbmdlCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UKKyNlbHNlCitleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVhZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CisjZW5kaWYKIAogLyoKICAqIGlmIFBHX2RjYWNoZV9kaXJ0eSBpcyBzZXQgZm9yIHRoZSBwYWdlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaAppbmRleCAyMWUxZGYzLi41ZmM3NDdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaApAQCAtMzAsMzQgKzMwLDE2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BNUspCiAgICAgIC8qIFVBUlQgQ0xLICAgICAgICBQT1JUICBJUlEgICAgIEZMQUdTICAgICAgICAqLwogCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDNGOCwgMTAsIFNURF9DT01fRkxBR1MgfSwgICAgIC8qIHR0eVMwICovICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDJGOCwgMTAsIFNURF9DT01fRkxBR1MgfSwgICAgIC8qIHR0eVMxICovCiAKICNlbHNlCiAKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDAgICAgLCAgMCwgU1REX0NPTV9GTEFHUyB9LCAgICAgLyogdHR5UzAgKi8gICAgIFwKICAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDAgICAgLCAgMCwgU1REX0NPTV9GTEFHUyB9LCAgICAgLyogdHR5UzEgKi8KIAogI2VuZGlmCiAKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMiAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMyAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNCAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNSAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNiAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNyAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTOCAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTOSAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTAgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTEgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTIgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTMgKi8KLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcGNpLmggYi9pbmNsdWRlL2FzbS1mcnYvcGNpLmgKaW5kZXggYTZhNDY5Mi4uYjRlZmU1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wY2kuaApAQCAtNTcsNiArNTcsMTYgQEAKICAqLwogI2RlZmluZSBQQ0lfRE1BX0JVU19JU19QSFlTCSgxKQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiAvKgogICoJVGhlc2UgYXJlIHByZXR0eSBtdWNoIGFyYml0YXJ5IHdpdGggdGhlIENvTUVNIGltcGxlbWVudGF0aW9uLgogICoJV2UgaGF2ZSB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZSB0byBvdXJzZWx2ZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCmluZGV4IGQwMzI3MjkuLjVlZGFkNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCkBAIC0xNSw3ICsxNSw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCBjOTc2YzFkLi5jZjgyOGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMjgsNiArMjgsOCBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YWNwaS9wZGNfaW50ZWwuaD4KKwogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIGRlZmluZXMgY21weGNoZyAqLwogCiAjZGVmaW5lIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCAgIGxvbmcgbG9uZwpAQCAtMTAxLDEyICsxMDMsNiBAQAogICAgICAgICA6Ij1yIihuX2hpKSwgIj1yIihuX2xvKSAgICAgXAogICAgICAgICA6IjAiKG5faGkpLCAiMSIobl9sbykpCiAKLS8qCi0gKiBSZWZlciBJbnRlbCBBQ1BJIF9QREMgc3VwcG9ydCBkb2N1bWVudCBmb3IgYml0IGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QIAkweGEKLSNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfTVNSCTB4MQotCiAjaWZkZWYgQ09ORklHX0FDUElfQk9PVCAKIGV4dGVybiBpbnQgYWNwaV9sYXBpYzsKIGV4dGVybiBpbnQgYWNwaV9pb2FwaWM7CkBAIC0xODUsNiArMTgxLDggQEAKIAogZXh0ZXJuIHU4IHg4Nl9hY3BpaWRfdG9fYXBpY2lkW107CiAKKyNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfUERDX0lOSVQJMQorCiAjZW5kaWYgLypfX0tFUk5FTF9fKi8KIAogI2VuZGlmIC8qX0FTTV9BQ1BJX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAppbmRleCAwZmVkNWUzLi5hOTZhOGY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaApAQCAtMTA5LDExICsxMDksNyBAQAogCiAjZGVmaW5lIEFQSUNfQkFTRSAoZml4X3RvX3ZpcnQoRklYX0FQSUNfQkFTRSkpCiAKLSNpZmRlZiBDT05GSUdfTlVNQQotICNkZWZpbmUgTUFYX0lPX0FQSUNTIDMyCi0jZWxzZQotICNkZWZpbmUgTUFYX0lPX0FQSUNTIDgKLSNlbmRpZgorI2RlZmluZSBNQVhfSU9fQVBJQ1MgNjQKIAogLyoKICAqIHRoZSBsb2NhbCBBUElDIHJlZ2lzdGVyIHN0cnVjdHVyZSwgbWVtb3J5IG1hcHBlZC4gTm90IHRlcnJpYmx5IHdlbGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oIGIvaW5jbHVkZS9hc20taTM4Ni9pMzg3LmgKaW5kZXggZjZmZWI5OC4uNjc0NzAwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pMzg3LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pMzg3LmgKQEAgLTE5LDEwICsxOSwyMSBAQAogCiBleHRlcm4gdm9pZCBteGNzcl9mZWF0dXJlX21hc2tfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKwogLyoKICAqIEZQVSBsYXp5IHN0YXRlIHNhdmUgaGFuZGxpbmcuLi4KICAqLwotZXh0ZXJuIHZvaWQgcmVzdG9yZV9mcHUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICk7CisKKy8qCisgKiBUaGUgIm5vcCIgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGluc3RydWN0aW9ucyB0aGUgc2FtZQorICogbGVuZ3RoLgorICovCisjZGVmaW5lIHJlc3RvcmVfZnB1KHRzaykJCQlcCisJYWx0ZXJuYXRpdmVfaW5wdXQoCQkJXAorCQkibm9wIDsgZnJzdG9yICUxIiwJCVwKKwkJImZ4cnN0b3IgJTEiLAkJCVwKKwkJWDg2X0ZFQVRVUkVfRlhTUiwJCVwKKwkJIm0iICgodHNrKS0+dGhyZWFkLmkzODcuZnhzYXZlKSkKIAogZXh0ZXJuIHZvaWQga2VybmVsX2ZwdV9iZWdpbih2b2lkKTsKICNkZWZpbmUga2VybmVsX2ZwdV9lbmQoKSBkbyB7IHN0dHMoKTsgcHJlZW1wdF9lbmFibGUoKTsgfSB3aGlsZSgwKQpAQCAtMzIsMTMgKzQzLDEyIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NhdmVfaW5pdF9mcHUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKIHsKLQlpZiAoIGNwdV9oYXNfZnhzciApIHsKLQkJYXNtIHZvbGF0aWxlKCAiZnhzYXZlICUwIDsgZm5jbGV4IgotCQkJICAgICAgOiAiPW0iICh0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkgKTsKLQl9IGVsc2UgewotCQlhc20gdm9sYXRpbGUoICJmbnNhdmUgJTAgOyBmd2FpdCIKLQkJCSAgICAgIDogIj1tIiAodHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSkgKTsKLQl9CisJYWx0ZXJuYXRpdmVfaW5wdXQoCisJCSJmbnNhdmUgJTEgOyBmd2FpdCA7IiBHRU5FUklDX05PUDIsCisJCSJmeHNhdmUgJTEgOyBmbmNsZXgiLAorCQlYODZfRkVBVFVSRV9GWFNSLAorCQkibSIgKHRzay0+dGhyZWFkLmkzODcuZnhzYXZlKQorCQk6Im1lbW9yeSIpOwogCXRzay0+dGhyZWFkX2luZm8tPnN0YXR1cyAmPSB+VFNfVVNFREZQVTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oIGIvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNWQ4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9fQVNNX0k4MjUzX0hfXworI2RlZmluZSBfX0FTTV9JODI1M19IX18KKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworI2VuZGlmCS8qIF9fQVNNX0k4MjUzX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKaW5kZXggODU5ZWJmNC4uNzlkZmFiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCkBAIC00MSwxMyArNDEsMTcgQEAKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBpZGVfZGVmYXVsdF9pb19iYXNlKGludCBpbmRleCkKIHsKKwlpZiAocGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpID09IE5VTEwpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDI6IHJldHVybiAweDFlODsKKwkJCWNhc2UgMzogcmV0dXJuIDB4MTY4OworCQkJY2FzZSA0OiByZXR1cm4gMHgxZTA7CisJCQljYXNlIDU6IHJldHVybiAweDE2MDsKKwkJfQorCX0KIAlzd2l0Y2ggKGluZGV4KSB7CiAJCWNhc2UgMDoJcmV0dXJuIDB4MWYwOwogCQljYXNlIDE6CXJldHVybiAweDE3MDsKLQkJY2FzZSAyOiByZXR1cm4gMHgxZTg7Ci0JCWNhc2UgMzogcmV0dXJuIDB4MTY4OwotCQljYXNlIDQ6IHJldHVybiAweDFlMDsKLQkJY2FzZSA1OiByZXR1cm4gMHgxNjA7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaAppbmRleCAwM2RkMTNhLi41NjIxMTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmgKQEAgLTEsNiArMSw3IEBACiAvKiBkZWZpbmVzIGZvciBpbmxpbmUgYXJjaCBzZXR1cCBmdW5jdGlvbnMgKi8KIAogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAKIC8qKgogICogZG9fdGltZXJfaW50ZXJydXB0X2hvb2sgLSBob29rIGludG8gdGltZXIgdGljawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKaW5kZXggMzNjZTVkMy4uNTE2NDIxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCkBAIC04LDIwICs4LDE1IEBACiAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAKLSNpZiBDT05GSUdfTlVNQQorI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJKG5vZGVfZGF0YVtuaWRdKQogCi0jaWZkZWYgQ09ORklHX05VTUEKLQkjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQotCQkjaW5jbHVkZSA8YXNtL251bWFxLmg+Ci0JI2Vsc2UJLyogc3VtbWl0IG9yIGdlbmVyaWMgYXJjaCAqLwotCQkjaW5jbHVkZSA8YXNtL3NyYXQuaD4KLQkjZW5kaWYKLSNlbHNlIC8qICFDT05GSUdfTlVNQSAqLwotCSNkZWZpbmUgZ2V0X21lbWNmZ19udW1hIGdldF9tZW1jZmdfbnVtYV9mbGF0Ci0JI2RlZmluZSBnZXRfemhvbGVzX3NpemUobikgKDApCi0jZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCisJI2luY2x1ZGUgPGFzbS9udW1hcS5oPgorI2Vsc2UJLyogc3VtbWl0IG9yIGdlbmVyaWMgYXJjaCAqLworCSNpbmNsdWRlIDxhc20vc3JhdC5oPgorI2VuZGlmCiAKIGV4dGVybiBpbnQgZ2V0X21lbWNmZ19udW1hX2ZsYXQodm9pZCApOwogLyoKQEAgLTQyLDYgKzM3LDExIEBACiAJZ2V0X21lbWNmZ19udW1hX2ZsYXQoKTsKIH0KIAorZXh0ZXJuIGludCBlYXJseV9wZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKTsKKworI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCisjZGVmaW5lIGdldF9tZW1jZmdfbnVtYSBnZXRfbWVtY2ZnX251bWFfZmxhdAorI2RlZmluZSBnZXRfemhvbGVzX3NpemUobikgKDApCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KQEAgLTE1MSw2ICsxNTEsNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgKi8KIAotZXh0ZXJuIGludCBlYXJseV9wZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKTsKLQogI2VuZGlmIC8qIF9BU01fTU1aT05FX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BjaS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wY2kuaAppbmRleCBmYjc0OWI4Li43OGM4NTk4NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wY2kuaApAQCAtMjcsNyArMjcsNyBAQAogc3RydWN0IHBjaV9idXMgKiBwY2liaW9zX3NjYW5fcm9vdChpbnQgYnVzKTsKIAogdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7Ci12b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKTsKK3ZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpOwogc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpwY2liaW9zX2dldF9pcnFfcm91dGluZ190YWJsZSh2b2lkKTsKIGludCBwY2liaW9zX3NldF9pcnFfcm91dGluZyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGluLCBpbnQgaXJxKTsKIApAQCAtOTksNiArOTksMTYgQEAKIHsKIH0KIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfSU5GSU5JVFk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IH4wVUw7Cit9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyogaW1wbGVtZW50IHRoZSBwY2lfIERNQSBBUEkgaW4gdGVybXMgb2YgdGhlIGdlbmVyaWMgZGV2aWNlIGRtYV8gb25lICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAppbmRleCA2ZjBmOTNkLi41ZDA2ZTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKQEAgLTY5NCw0ICs2OTQsMTIgQEAKIGV4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQpOwogZXh0ZXJuIGludCBzeXNlbnRlcl9zZXR1cCh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19NVFJSCitleHRlcm4gdm9pZCBtdHJyX2FwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtdHJyX2JwX2luaXQodm9pZCk7CisjZWxzZQorI2RlZmluZSBtdHJyX2FwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXRycl9icF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNNX0kzODZfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCmluZGV4IDIxZGRlY2MuLmUxZWNmY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zZXJpYWwuaApAQCAtMjIsMTA5ICsyMiw5IEBACiAjZGVmaW5lIFNURF9DT000X0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEZPVVJQT1JUX0ZMQUdTIEFTWU5DX0ZPVVJQT1JUCi0jZGVmaW5lIEFDQ0VOVF9GTEFHUyAwCi0jZGVmaW5lIEJPQ0FfRkxBR1MgMAotI2RlZmluZSBIVUI2X0ZMQUdTIDAKLSNlbmRpZgotCi0jZGVmaW5lIE1DQV9DT01fRkxBR1MJKFNURF9DT01fRkxBR1N8QVNZTkNfQk9PVF9PTkxZTUNBKQotCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGFjY2VzcyBtZXRob2RzIGZvciB0aGUgSFVCNiBjYXJkLiBBbGwKLSAqIGFjY2VzcyBpcyB0aHJvdWdoIHR3byBwb3J0cyBmb3IgYWxsIDI0IHBvc3NpYmxlIGNoaXBzLiBUaGUgY2FyZCBpcwotICogc2VsZWN0ZWQgdGhyb3VnaCB0aGUgaGlnaCAyIGJpdHMsIHRoZSBwb3J0IG9uIHRoYXQgY2FyZCB3aXRoIHRoZQotICogIm1pZGRsZSIgMyBiaXRzLCBhbmQgdGhlIHJlZ2lzdGVyIG9uIHRoYXQgcG9ydCB3aXRoIHRoZSBib3R0b20KLSAqIDMgYml0cy4KLSAqCi0gKiBXaGlsZSB0aGUgYWNjZXNzIHBvcnQgYW5kIGludGVycnVwdCBpcyBjb25maWd1cmFibGUsIHRoZSBkZWZhdWx0Ci0gKiBwb3J0IGxvY2F0aW9ucyBhcmUgMHgzMDIgZm9yIHRoZSBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIsIGFuZCAweDMwMwotICogZm9yIHRoZSBkYXRhIHJlYWQvd3JpdGUgcmVnaXN0ZXIuIE5vcm1hbGx5LCB0aGUgaW50ZXJydXB0IGlzIGF0IGlycTMKLSAqIGJ1dCBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIHRvIDcgaW5jbHVzaXZlLiBOb3RlIHRoYXQgdXNpbmcgMyB3aWxsCi0gKiByZXF1aXJlIGRpc2FibGluZyBjb20yLgotICovCi0KLSNkZWZpbmUgQ19QKGNhcmQscG9ydCkgKCgoY2FyZCk8PDZ8KHBvcnQpPDwzKSArIDEpCi0KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMSAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotLyogWW91IGNhbiBoYXZlIHVwIHRvIGZvdXIgSFVCNidzIGluIHRoZSBzeXN0ZW0sIGJ1dCBJJ3ZlIG9ubHkKLSAqIGluY2x1ZGVkIHR3byBjYXJkcyBoZXJlIGZvciBhIHRvdGFsIG9mIHR3ZWx2ZSBwb3J0cy4KLSAqLwotI2lmIChkZWZpbmVkKENPTkZJR19IVUI2KSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUykpCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMCkgfSwgIC8qIHR0eVMzMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwxKSB9LCAgLyogdHR5UzMzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDIpIH0sICAvKiB0dHlTMzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMykgfSwgIC8qIHR0eVMzNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw0KSB9LCAgLyogdHR5UzM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDUpIH0sICAvKiB0dHlTMzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMCkgfSwgIC8qIHR0eVMzOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwxKSB9LCAgLyogdHR5UzM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDIpIH0sICAvKiB0dHlTNDAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMykgfSwgIC8qIHR0eVM0MSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw0KSB9LCAgLyogdHR5UzQyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDUpIH0sICAvKiB0dHlTNDMgKi8KLSNlbHNlCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUNBCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwKLSNlbHNlCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCi0jZW5kaWYKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCVwKLQlIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQlNQ0FfU0VSSUFMX1BPUlRfREZOUwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmgKaW5kZXggZjIyZmFiMC4uYWIyMTZlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGxiZmx1c2guaApAQCAtMjIsMTYgKzIyLDE4IEBACiAgKi8KICNkZWZpbmUgX19mbHVzaF90bGJfZ2xvYmFsKCkJCQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgdG1wcmVnOwkJCQkJXAorCQl1bnNpZ25lZCBpbnQgdG1wcmVnLCBjcjQsIGNyNF9vcmlnOwkJCVwKIAkJCQkJCQkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkibW92bCAlMSwgJSVjcjQ7ICAjIHR1cm4gb2ZmIFBHRSAgICAgXG4iCVwKKwkJCSJtb3ZsICUlY3I0LCAlMjsgICMgdHVybiBvZmYgUEdFICAgICBcbiIJXAorCQkJIm1vdmwgJTIsICUxOyAgICAgICAgICAgICAgICAgICAgICAgIFxuIglcCisJCQkiYW5kbCAlMywgJTE7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCVwKKwkJCSJtb3ZsICUxLCAlJWNyNDsgICAgICAgICAgICAgICAgICAgICBcbiIJXAogCQkJIm1vdmwgJSVjcjMsICUwOyAgICAgICAgICAgICAgICAgICAgIFxuIglcCiAJCQkibW92bCAlMCwgJSVjcjM7ICAjIGZsdXNoIFRMQiAgICAgICAgXG4iCVwKIAkJCSJtb3ZsICUyLCAlJWNyNDsgICMgdHVybiBQR0UgYmFjayBvbiBcbiIJXAotCQkJOiAiPSZyIiAodG1wcmVnKQkJCQlcCi0JCQk6ICJyIiAobW11X2NyNF9mZWF0dXJlcyAmIH5YODZfQ1I0X1BHRSksCVwKLQkJCSAgInIiIChtbXVfY3I0X2ZlYXR1cmVzKQkJCVwKKwkJCTogIj0mciIgKHRtcHJlZyksICI9JnIiIChjcjQpLCAiPSZyIiAoY3I0X29yaWcpCVwKKwkJCTogImkiICh+WDg2X0NSNF9QR0UpCQkJCVwKIAkJCTogIm1lbW9yeSIpOwkJCQkJXAogCX0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IDE3NjQxM2YuLmE3Y2IzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMjk0LDggKzI5NCwxMyBAQAogI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NgogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NwogI2RlZmluZSBfX05SX2tleWN0bAkJMjg4CisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg5CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkwCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MgorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkzCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMjg5CisjZGVmaW5lIE5SX3N5c2NhbGxzIDI5NAogCiAvKgogICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjg6IHNlZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAppbmRleCA2YTI2YTk3Li40YzA2ZDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaApAQCAtOTgsNiArOTgsMTUgQEAKIGludCBhY3BpX3JlcXVlc3RfdmVjdG9yICh1MzIgaW50X3R5cGUpOwogaW50IGFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwogCisvKgorICogUmVjb3JkIHRoZSBjcGVpIG92ZXJyaWRlIGZsYWcgYW5kIGN1cnJlbnQgbG9naWNhbCBjcHUuIFRoaXMgaXMKKyAqIHVzZWZ1bCBmb3IgQ1BVIHJlbW92YWwuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IGlzX2NwdV9jcGVpX3RhcmdldCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHNldF9jcGVpX3RhcmdldF9jcHUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdW5zaWduZWQgaW50IGdldF9jcGVpX3RhcmdldF9jcHUodm9pZCk7CisKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAvKiBQcm94aW1pdHkgYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAoOCBiaXQpKi8KICNkZWZpbmUgTUFYX1BYTV9ET01BSU5TICgyNTYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaAppbmRleCBjZDRlMDZiLi4wNDFhYjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKQEAgLTgxLDcgKzgxLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9pYTY0X2xzYXBpYzsJLyogQ1BVLWludGVybmFsIGludGVycnVwdCBjb250cm9sbGVyICovCiAKLWV4dGVybiBpbnQgYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyAoaW50IGlycSk7IC8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3Igd2l0aG91dCBwYW5pYyAqLwogZXh0ZXJuIGludCBhc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSk7CS8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3IgKi8KIGV4dGVybiB2b2lkIGZyZWVfaXJxX3ZlY3RvciAoaW50IHZlY3Rvcik7CiBleHRlcm4gdm9pZCBpYTY0X3NlbmRfaXBpIChpbnQgY3B1LCBpbnQgdmVjdG9yLCBpbnQgZGVsaXZlcnlfbW9kZSwgaW50IHJlZGlyZWN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9zYXBpYy5oIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKaW5kZXggMzhhN2E3Mi4uMTA5M2YzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKQEAgLTcxLDggKzcxLDExIEBACiB9CiAKIGV4dGVybiB2b2lkIF9faW5pdCBpb3NhcGljX3N5c3RlbV9pbml0IChpbnQgcGNhdF9jb21wYXQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGlvc2FwaWNfaW5pdCAodW5zaWduZWQgbG9uZyBhZGRyZXNzLAorZXh0ZXJuIGludCBfX2RldmluaXQgaW9zYXBpY19pbml0ICh1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBnc2lfYmFzZSk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK2V4dGVybiBpbnQgaW9zYXBpY19yZW1vdmUgKHVuc2lnbmVkIGludCBnc2lfYmFzZSk7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUcgKi8KIGV4dGVybiBpbnQgZ3NpX3RvX3ZlY3RvciAodW5zaWduZWQgaW50IGdzaSk7CiBleHRlcm4gaW50IGdzaV90b19pcnEgKHVuc2lnbmVkIGludCBnc2kpOwogZXh0ZXJuIHZvaWQgaW9zYXBpY19lbmFibGVfaW50ciAodW5zaWduZWQgaW50IHZlY3Rvcik7CkBAIC05NCwxMSArOTcsMTQgQEAKIAogZXh0ZXJuIHZvaWQgaW9zYXBpY19wY2lfZml4dXAgKGludCk7CiAjaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiB2b2lkIF9faW5pdCBtYXBfaW9zYXBpY190b19ub2RlICh1bnNpZ25lZCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBfX2RldmluaXQgbWFwX2lvc2FwaWNfdG9fbm9kZSAodW5zaWduZWQgaW50LCBpbnQpOwogI2VuZGlmCiAjZWxzZQogI2RlZmluZSBpb3NhcGljX3N5c3RlbV9pbml0KHBjYXRfY29tcGF0KQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgaW9zYXBpY19pbml0KGFkZHJlc3MsZ3NpX2Jhc2UpCQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9zYXBpY19pbml0KGFkZHJlc3MsZ3NpX2Jhc2UpCQkJCSgtRUlOVkFMKQorI2lmZGVmIENPTkZJR19IT1RQTFVHCisjZGVmaW5lIGlvc2FwaWNfcmVtb3ZlKGdzaV9iYXNlKQkJCQkoLUVOT0RFVikKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLwogI2RlZmluZSBpb3NhcGljX3JlZ2lzdGVyX2ludHIoZ3NpLHBvbGFyaXR5LHRyaWdnZXIpCQkoZ3NpKQogI2RlZmluZSBpb3NhcGljX3VucmVnaXN0ZXJfaW50cihpcnEpCQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgaW9zYXBpY19vdmVycmlkZV9pc2FfaXJxKGlzYV9pcnEsZ3NpLHBvbGFyaXR5LHRyaWdnZXIpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKaW5kZXggN2I3MDAwMy4uYmYzNmEzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vYnJlYWsuaD4KIAorI2RlZmluZSBNQVhfSU5TTl9TSVpFICAgMTYKICNkZWZpbmUgQlJFQUtfSU5TVAkobG9uZykoX19JQTY0X0JSRUFLX0tQUk9CRSA8PCA2KQogCiB0eXBlZGVmIHVuaW9uIGNtcF9pbnN0IHsKQEAgLTYzLDYgKzY0LDggQEAKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopcGVudHJ5CiAKKyNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCisKICNkZWZpbmUgU0xPVDBfT1BDT0RFX1NISUZUCSgzNykKICNkZWZpbmUgU0xPVDFfcDFfT1BDT0RFX1NISUZUCSgzNyAtICg2NC00NikpCiAjZGVmaW5lIFNMT1QyX09QQ09ERV9TSElGVCAJKDM3KQpAQCAtOTQsMTEgKzk3LDYgQEAKIH07CiAKIC8qIGlhNjQgZG9lcyBub3QgbmVlZCB0aGlzICovCi1zdGF0aWMgaW5saW5lIHZvaWQganByb2JlX3JldHVybih2b2lkKQotewotfQotCi0vKiBpYTY0IGRvZXMgbm90IG5lZWQgdGhpcyAqLwogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIH0KQEAgLTEwNiw2ICsxMDQsMTIgQEAKICNpZmRlZiBDT05GSUdfS1BST0JFUwogZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CisKKy8qIGlhNjQgZG9lcyBub3QgbmVlZCB0aGlzICovCitzdGF0aWMgaW5saW5lIHZvaWQganByb2JlX3JldHVybih2b2lkKQoreworfQorCiAjZWxzZQkJCQkvKiAhQ09ORklHX0tQUk9CRVMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20taWE2NC9tbXVfY29udGV4dC5oCmluZGV4IDAwOTZlN2UuLmUzZTVmZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21tdV9jb250ZXh0LmgKQEAgLTEzMiw2ICsxMzIsOSBAQAogCWlhNjRfc3Jsel9pKCk7CQkJLyogc3Jsei5pIGltcGxpZXMgc3Jsei5kICovCiB9CiAKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gb2ZmCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogYWN0aXZhdGVfY29udGV4dCAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaAppbmRleCBhODMxNGVlLi5kYmE5ZjIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1wY2liaW9zX3BlbmFsaXplX2lzYV9pcnEgKGludCBpcnEpCitwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEgKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTgyLDYgKzgyLDI1IEBACiAjZGVmaW5lIHNnX2RtYV9sZW4oc2cpCQkoKHNnKS0+ZG1hX2xlbmd0aCkKICNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpCSgoc2cpLT5kbWFfYWRkcmVzcykKIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCXVuc2lnbmVkIGxvbmcgY2FjaGVsaW5lX3NpemU7CisJdTggYnl0ZTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKKwlpZiAoYnl0ZSA9PSAwKQorCQljYWNoZWxpbmVfc2l6ZSA9IDEwMjQ7CisJZWxzZQorCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OworCisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9NVUxUSVBMRTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gY2FjaGVsaW5lX3NpemU7Cit9CisjZW5kaWYKKwogI2RlZmluZSBIQVZFX1BDSV9NTUFQCiBleHRlcm4gaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpOwpAQCAtMTA5LDYgKzEyOCw3IEBACiAJdm9pZCAqYWNwaV9oYW5kbGU7CiAJdm9pZCAqaW9tbXU7CiAJaW50IHNlZ21lbnQ7CisJaW50IG5vZGU7CQkvKiBuZWFyZXN0IG5vZGUgd2l0aCBtZW1vcnkgb3IgLTEgZm9yIGdsb2JhbCBhbGxvY2F0aW9uICovCiAKIAl1bnNpZ25lZCBpbnQgd2luZG93czsKIAlzdHJ1Y3QgcGNpX3dpbmRvdyAqd2luZG93OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zZWN0aW9ucy5oIGIvaW5jbHVkZS9hc20taWE2NC9zZWN0aW9ucy5oCmluZGV4IDhlM2RiZGUuLmU5ZWI3ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc2VjdGlvbnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NlY3Rpb25zLmgKQEAgLTE3LDYgKzE3LDcgQEAKIGV4dGVybiBjaGFyIF9fc3RhcnRfZ2F0ZV9mc3lzY2FsbF9wYXRjaGxpc3RbXSwgX19lbmRfZ2F0ZV9mc3lzY2FsbF9wYXRjaGxpc3RbXTsKIGV4dGVybiBjaGFyIF9fc3RhcnRfZ2F0ZV9icmxfZnN5c19idWJibGVfZG93bl9wYXRjaGxpc3RbXSwgX19lbmRfZ2F0ZV9icmxfZnN5c19idWJibGVfZG93bl9wYXRjaGxpc3RbXTsKIGV4dGVybiBjaGFyIF9fc3RhcnRfdW53aW5kW10sIF9fZW5kX3Vud2luZFtdOworZXh0ZXJuIGNoYXIgX19zdGFydF9pdnRfdGV4dFtdLCBfX2VuZF9pdnRfdGV4dFtdOwogCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NFQ1RJT05TX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oCmluZGV4IDFiZmRmYjQuLjEwM2Q3NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmgKQEAgLTIxNiw2ICsyMTYsMTAgQEAKICNkZWZpbmUgVElPX1NXSU5fV0lER0VUTlVNKHgpCQkoKCh4KSAgPj4gVElPX1NXSU5fU0laRV9CSVRTKSAmIFRJT19TV0lOX1dJREdFVF9NQVNLKQogCiAKKyNkZWZpbmUgVElPX0lPU1BBQ0VfQUREUihuLHgpCQkJCQlcCisJLyogTW92ZSBpbiB0aGUgQ2hpcGxldCBJRCBmb3IgVElPIExvY2FsIEJsb2NrIE1NUiAqLwlcCisJKFJFTU9URV9BRERSKG4seCkgfCAxVUwgPDwgKE5BU0lEX1NISUZUIC0gMikpCisKIC8qCiAgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBwcm9kdWNlIHRoZSBjb3JyZWN0IGJhc2UgdmlydHVhbCBhZGRyZXNzIGZvcgogICogdGhlIGh1YiByZWdpc3RlcnMuIFRoZSBSRU1PVEVfSFVCXyogbWFjcm8gcHJvZHVjZQpAQCAtMjMzLDEzICsyMzcsMTYgQEAKICNkZWZpbmUgUkVNT1RFX0hVQl9BRERSKG4seCkJCQkJCQlcCiAJKChuICYgMSkgPwkJCQkJCQlcCiAJLyogVElPOiAqLwkJCQkJCQlcCi0JKCh2b2xhdGlsZSB1NjQgKikoR0xPQkFMX01NUl9BRERSKG4seCkpKQkJCVwKLQk6IC8qIFNIVUI6ICovCQkJCQkJCVwKLQkoKCh4KSAmIEJXSU5fVE9QKSA/ICgodm9sYXRpbGUgdTY0ICopKEdMT0JBTF9NTVJfQUREUihuLHgpKSlcCisJKGlzX3NodWIyKCkgPwkJCQkJCQlcCisJLyogVElPIG9uIFNodWIyICovCQkJCQkJXAorCSh2b2xhdGlsZSB1NjQgKikoVElPX0lPU1BBQ0VfQUREUihuLHgpKQkJCQlcCisJOiAvKiBUSU8gb24gc2h1YjEgKi8JCQkJCQlcCisJKHZvbGF0aWxlIHU2NCAqKShHTE9CQUxfTU1SX0FERFIobix4KSkpCQkJCVwKKwkJCQkJCQkJCVwKKwk6IC8qIFNIVUIxIGFuZCBTSFVCMiBNTVJzOiAqLwkJCQkJXAorCSgoKHgpICYgQldJTl9UT1ApID8gKCh2b2xhdGlsZSB1NjQgKikoR0xPQkFMX01NUl9BRERSKG4seCkpKQlcCiAJOiAoKHZvbGF0aWxlIHU2NCAqKShOT0RFX1NXSU5fQkFTRShuLDEpICsgMHg4MDAwMDAgKyAoeCkpKSkpCiAKLQotCiAjZGVmaW5lIEhVQl9MKHgpCQkJKCooKHZvbGF0aWxlIHR5cGVvZigqeCkgKil4KSkKICNkZWZpbmUJSFVCX1MoeCxkKQkJCSgqKCh2b2xhdGlsZSB0eXBlb2YoKngpICopeCkgPSAoZCkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYXJjaC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hcmNoLmgKaW5kZXggNjM1ZmRjZS4uYWI4MjdkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9hcmNoLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hcmNoLmgKQEAgLTExLDYgKzExLDcgQEAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX0FSQ0hfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fQVJDSF9ICiAKKyNpbmNsdWRlIDxsaW51eC9udW1hLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3BlcmNwdS5oPgogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9pbnRyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaAppbmRleCBlNTE0NzFmLi5lMTkwZGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaApAQCAtOSw2ICs5LDggQEAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX0lOVFJfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fSU5UUl9ICiAKKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCiAjZGVmaW5lIFNHSV9VQVJUX1ZFQ1RPUgkJKDB4ZTkpCiAjZGVmaW5lIFNHSV9QQ0lCUl9FUlJPUgkJKDB4MzMpCiAKQEAgLTMzLDcgKzM1LDcgQEAKIAogLy8gVGhlIFNOIFBST00gaXJxIHN0cnVjdAogc3RydWN0IHNuX2lycV9pbmZvIHsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKmlycV9uZXh0OwkvKiBzaGFyaW5nIGlycSBsaXN0CSAgICAgKi8KKwlzdHJ1Y3Qgc25faXJxX2luZm8gKmlycV9uZXh0OwkvKiBkZXByZWNhdGVkIERPIE5PVCBVU0UgICAgICovCiAJc2hvcnQJCWlycV9uYXNpZDsJLyogTmFzaWQgSVJRIGlzIGFzc2lnbmVkIHRvICAqLwogCWludAkJaXJxX3NsaWNlOwkvKiBzbGljZSBJUlEgaXMgYXNzaWduZWQgdG8gICovCiAJaW50CQlpcnFfY3B1aWQ7CS8qIGtlcm5lbCBsb2dpY2FsIGNwdWlkCSAgICAgKi8KQEAgLTQ3LDYgKzQ5LDggQEAKIAlpbnQJCWlycV9jb29raWU7CS8qIHVuaXF1ZSBjb29raWUgCSAgICAgKi8KIAlpbnQJCWlycV9mbGFnczsJLyogZmxhZ3MgKi8KIAlpbnQJCWlycV9zaGFyZV9jbnQ7CS8qIG51bSBkZXZpY2VzIHNoYXJpbmcgSVJRICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CS8qIGxpc3Qgb2Ygc25faXJxX2luZm8gc3RydWN0cyAqLworCXN0cnVjdCByY3VfaGVhZAkJcmN1OwkvKiByY3UgY2FsbGJhY2sgbGlzdCAqLwogfTsKIAogZXh0ZXJuIHZvaWQgc25fc2VuZF9JUElfcGh5cyhpbnQsIGxvbmcsIGludCwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vbDEuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vbDEuaAppbmRleCAwODA1MGQzLi4yZTVmMGFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2wxLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9sMS5oCkBAIC0zMyw1ICszMyw2IEBACiAjZGVmaW5lIEwxX0JSSUNLVFlQRV9QQQkJMHg2YSAgICAgICAgICAgIC8qIGogKi8KICNkZWZpbmUgTDFfQlJJQ0tUWVBFX0lBCQkweDZiICAgICAgICAgICAgLyogayAqLwogI2RlZmluZSBMMV9CUklDS1RZUEVfQVRIRU5BCTB4MmIgICAgICAgICAgICAvKiArICovCisjZGVmaW5lIEwxX0JSSUNLVFlQRV9EQVlUT05BCTB4N2EgICAgICAgICAgICAvKiB6ICovCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU05fTDFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaAppbmRleCAxY2QyOTFkLi4yYjQyZDllIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvcGNpYnJfcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKQEAgLTgsNiArOCw5IEBACiAjaWZuZGVmIF9BU01fSUE2NF9TTl9QQ0lfUENJQlJfUFJPVklERVJfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fUENJX1BDSUJSX1BST1ZJREVSX0gKIAorI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisKIC8qIFdvcmthcm91bmRzICovCiAjZGVmaW5lIFBWOTA3NTE2ICgxIDw8IDEpIC8qIFRJT0NQOiBEb24ndCB3cml0ZSB0aGUgd3JpdGUgYnVmZmVyIGZsdXNoIHJlZyAqLwogCkBAIC0yMCw3ICsyMyw3IEBACiAjZGVmaW5lIElTX1BJQ19TT0ZUKHBzKSAgICAgKHBzLT5wYmlfYnJpZGdlX3R5cGUgPT0gUENJQlJfQlJJREdFVFlQRV9QSUMpCiAKIAotLyogCisvKgogICogVGhlIGRpZmZlcmVudCBQQ0kgQnJpZGdlIHR5cGVzIHN1cHBvcnRlZCBvbiB0aGUgU0dJIEFsdGl4IHBsYXRmb3JtcwogICovCiAjZGVmaW5lIFBDSUJSX0JSSURHRVRZUEVfVU5LTk9XTiAgICAgICAtMQpAQCAtMTAwLDE1ICsxMDMsMTYgQEAKIAogCXN0cnVjdCBhdGVfcmVzb3VyY2UgICAgIHBiaV9pbnRfYXRlX3Jlc291cmNlOwogCXVpbnQ2NF90ICAgICAgICAgICAgICAgIHBiaV9pbnRfYXRlX3NpemU7Ci0JCisKIAl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfZGlyX3hiYXNlOwogCWNoYXIgICAgICAgICAgICAgICAgICAgIHBiaV9odWJfeGlkOwogCiAJdWludDY0X3QgICAgICAgICAgICAgICAgcGJpX2RldnJlZ1s4XTsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBwYmlfbG9jazsKIAogCXVpbnQzMl90CQlwYmlfdmFsaWRfZGV2aWNlczsKIAl1aW50MzJfdAkJcGJpX2VuYWJsZWRfZGV2aWNlczsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIHBiaV9sb2NrOwogfTsKIAogLyoKQEAgLTEyNCw3ICsxMjgsNyBAQAogI2RlZmluZSBwY2licl91bmxvY2socGNpYnVzX2luZm8sIGZsYWcpICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lidXNfaW5mby0+cGJpX2xvY2ssIGZsYWcpCiAKIGV4dGVybiBpbnQgIHBjaWJyX2luaXRfcHJvdmlkZXIodm9pZCk7Ci1leHRlcm4gdm9pZCAqcGNpYnJfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKK2V4dGVybiB2b2lkICpwY2licl9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICosIHN0cnVjdCBwY2lfY29udHJvbGxlciAqKTsKIGV4dGVybiBkbWFfYWRkcl90IHBjaWJyX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKIGV4dGVybiBkbWFfYWRkcl90IHBjaWJyX2RtYV9tYXBfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgcGNpYnJfZG1hX3VubWFwKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsIGludCk7CkBAIC0xNDgsNCArMTUyLDggQEAKIGV4dGVybiBpbnQgCQlwY2licl9hdGVfYWxsb2Moc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7CiBleHRlcm4gdm9pZCAJCXBjaWJyX2F0ZV9mcmVlKHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgCQlhdGVfd3JpdGUoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gaW50IHNhbF9wY2licl9zbG90X2VuYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsCisJCQkJIHZvaWQgKnJlc3ApOworZXh0ZXJuIGludCBzYWxfcGNpYnJfc2xvdF9kaXNhYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwKKwkJCQkgIGludCBhY3Rpb24sIHZvaWQgKnJlc3ApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmgKaW5kZXggMDRlMjdkNS4uOTc2ZjVlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaApAQCAtMzcsNiArMzcsNyBAQAogCXN0cnVjdCB4d2lkZ2V0X2luZm8JKmJzX3h3aWRnZXRfaW5mbzsKIH07CiAKK3N0cnVjdCBwY2lfY29udHJvbGxlcjsKIC8qCiAgKiBTTiBwY2kgYnVzIGluZGlyZWN0aW9uCiAgKi8KQEAgLTQ1LDcgKzQ2LDcgQEAKIAlkbWFfYWRkcl90CSgqZG1hX21hcCkoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKIAlkbWFfYWRkcl90CSgqZG1hX21hcF9jb25zaXN0ZW50KShzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOwogCXZvaWQJCSgqZG1hX3VubWFwKShzdHJ1Y3QgcGNpX2RldiAqLCBkbWFfYWRkcl90LCBpbnQpOwotCXZvaWQgKgkJKCpidXNfZml4dXApKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKKwl2b2lkICoJCSgqYnVzX2ZpeHVwKShzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKiwgc3RydWN0IHBjaV9jb250cm9sbGVyICopOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnNuX3BjaV9wcm92aWRlcltdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKaW5kZXggZWQ0MDMxZC4uNDk3MTFkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCkBAIC0xMCwxMSArMTAsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi1leHRlcm4gc3RydWN0IHNuX2lycV9pbmZvICoqc25faXJxOwotCiAjZGVmaW5lIFNOX1BDSURFVl9JTkZPKHBjaV9kZXYpIFwKICAgICAgICAgKChzdHJ1Y3QgcGNpZGV2X2luZm8gKikocGNpX2RldiktPnN5c2RhdGEpCiAKKyNkZWZpbmUgU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKSBcCisJKHN0cnVjdCBwY2lidXNfaW5mbyAqKSgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFBDSV9DT05UUk9MTEVSKChwY2lfYnVzKSktPnBsYXRmb3JtX2RhdGEpKQogLyoKICAqIEdpdmVuIGEgcGNpX2J1cywgcmV0dXJuIHRoZSBzbiBwY2lidXNfYnVzc29mdCBzdHJ1Y3QuICBOb3RlIHRoYXQKICAqIHRoaXMgb25seSB3b3JrcyBmb3Igcm9vdCBidXNzZXMsIG5vdCBmb3IgYnVzc2VzIHJlcHJlc2VudGVkIGJ5IFBQQidzLgpAQCAtMjMsNiArMjMsOCBAQAogI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVChwY2lfYnVzKSBcCiAgICAgICAgICgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFBDSV9DT05UUk9MTEVSKChwY2lfYnVzKSktPnBsYXRmb3JtX2RhdGEpKQogCisjZGVmaW5lIFNOX1BDSUJVU19CVVNTT0ZUX0lORk8ocGNpX2J1cykgXAorCShzdHJ1Y3QgcGNpYnVzX2luZm8gKikoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShQQ0lfQ09OVFJPTExFUigocGNpX2J1cykpLT5wbGF0Zm9ybV9kYXRhKSkKIC8qCiAgKiBHaXZlbiBhIHN0cnVjdCBwY2lfZGV2LCByZXR1cm4gdGhlIHNuIHBjaWJ1c19idXNzb2Z0IHN0cnVjdC4gIE5vdGUKICAqIHRoYXQgdGhpcyBpcyBub3QgZXF1aXZhbGVudCB0byBTTl9QQ0lCVVNfQlVTU09GVChwY2lfZGV2LT5idXMpIGR1ZQpAQCAtNTAsOSArNTIsMTcgQEAKIAogCXN0cnVjdCBzbl9pcnFfaW5mbwkqcGRpX3NuX2lycV9pbmZvOwogCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnBkaV9wcm92aWRlcjsJLyogc24gcGNpIG9wcyAqLworCXN0cnVjdCBwY2lfZGV2IAkJKmhvc3RfcGNpX2RldjsJCS8qIGhvc3QgYnVzIGxpbmsgKi8KIH07CiAKIGV4dGVybiB2b2lkIHNuX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKIAkJCSBzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKLQorZXh0ZXJuIHZvaWQgc25faXJxX3VuZml4dXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworZXh0ZXJuIHZvaWQgc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0sCisgCQkJCSAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK2V4dGVybiB2b2lkIHNuX2J1c19zdG9yZV9zeXNkYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgc25fYnVzX2ZyZWVfc3lzZGF0YSh2b2lkKTsKK2V4dGVybiB2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgc25fcGNpX3VuZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIHNuX2lycV9saF9pbml0KHZvaWQpOwogI2VuZGlmCQkJCS8qIF9BU01fSUE2NF9TTl9QQ0lfUENJREVWX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS9waWMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGljLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BpYy5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1pYTY0L3NuL3BpYy5oCmluZGV4IGZkMThhY2UuLjBkZTgyZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS9waWMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BpYy5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKiBQSUMgaGFuZGxlcyBQQ0kvWCBidXNzZXMuICBQQ0kvWCByZXF1aXJlcyB0aGF0IHRoZSAnYnJpZGdlJyAoaS5lLiBQSUMpCiAgKiBiZSBkZXNpZ25hdGVkIGFzICdkZXZpY2UgMCcuICAgVGhhdCBpcyBhIGRlcGFydHVyZSBmcm9tIGVhcmxpZXIgU0dJCiAgKiBQQ0kgYnJpZGdlcy4gIEJlY2F1c2Ugb2YgdGhhdCB3ZSB1c2UgY29uZmlnIHNwYWNlIDEgdG8gYWNjZXNzIHRoZQotICogY29uZmlnIHNwYWNlIG9mIHRoZSBmaXJzdCBhY3R1YWwgUENJIGRldmljZSBvbiB0aGUgYnVzLiAKKyAqIGNvbmZpZyBzcGFjZSBvZiB0aGUgZmlyc3QgYWN0dWFsIFBDSSBkZXZpY2Ugb24gdGhlIGJ1cy4KICAqIEhlcmUncyB3aGF0IHRoZSBQSUMgbWFudWFsIHNheXM6CiAgKgogICogICAgIFRoZSBjdXJyZW50IFBDSS1YIGJ1cyBzcGVjaWZpY2F0aW9uIG5vdyBkZWZpbmVzIHRoYXQgdGhlIHBhcmVudApAQCAtMjksMTQgKzI5LDE0IEBACiAgKiAgICAgY29ycmVsYXRlZCBDb25maWdzIHBhY2UgYW5kIG91ciBkZXZpY2Ugc3BhY2UgMCA8LT4gMCwgMSA8LT4gMSwgZXRjLgogICogICAgIFBDSS1YIHJlcXVpcmVzIHdlIHN0YXJ0IGEgMSwgbm90IDAgYW5kIGN1cnJlbnRseSB0aGUgUFggYnJpY2sKICAqICAgICBkb2VzIGFzc29jaWF0ZSBvdXI6Ci0gKiAKKyAqCiAgKiAgICAgICAgIGRldmljZSAwIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMSwKLSAqICAgICAgICAgZGV2aWNlIDEgd2l0aCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvdyAyLCAKKyAqICAgICAgICAgZGV2aWNlIDEgd2l0aCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvdyAyLAogICogICAgICAgICBkZXZpY2UgMiB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDMsCiAgKiAgICAgICAgIGRldmljZSAzIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgNC4KICAqCi0gKiBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IGFsbCBjb25maWcgc3BhY2UgYWNjZXNzIGFyZSBvZmYtYnktb25lIHdpdGggCi0gKiByZWxhdGlvbiB0byBvdGhlciBwZXItc2xvdCBhY2Nlc3NlcyBvbiB0aGUgUElDLiAgIAorICogVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBhbGwgY29uZmlnIHNwYWNlIGFjY2VzcyBhcmUgb2ZmLWJ5LW9uZSB3aXRoCisgKiByZWxhdGlvbiB0byBvdGhlciBwZXItc2xvdCBhY2Nlc3NlcyBvbiB0aGUgUElDLgogICogSGVyZSBpcyBhIHRhYmxlIHRoYXQgc2hvd3Mgc29tZSBvZiB0aGF0OgogICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsIFNsb3QjCkBAIC02NSw3ICs2NSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE5PVEU6IFBJQyBXQVIuIFBWIzg1NDY5Ny4gIFBJQyBkb2VzIG5vdCBhbGxvdyB3cml0ZXMganVzdCB0byBbMzE6MF0KLSAqIG9mIGEgNjQtYml0IHJlZ2lzdGVyLiAgV2hlbiB3cml0aW5nIFBJQyByZWdpc3RlcnMsIGFsd2F5cyB3cml0ZSB0aGUgCisgKiBvZiBhIDY0LWJpdCByZWdpc3Rlci4gIFdoZW4gd3JpdGluZyBQSUMgcmVnaXN0ZXJzLCBhbHdheXMgd3JpdGUgdGhlCiAgKiBlbnRpcmUgNjQgYml0cy4KICAqLwogCkBAIC0xNjQsNyArMTY0LDcgQEAKIAl1aW50NjRfdAljbGVhcl9hbGw7CQkJLyogMHgwMDB7NDM4LCwsNUY4fSAqLwogICAgIH0gcF9idWZfY291bnRbOF07CiAKLSAgICAKKwogICAgIC8qIDB4MDAwNjAwLTB4MDAwOUZGIC0tIFBDSS9YIHJlZ2lzdGVycyAqLwogICAgIHVpbnQ2NF90CQlwX3BjaXhfYnVzX2Vycl9hZGRyOwkJLyogMHgwMDA2MDAgKi8KICAgICB1aW50NjRfdAkJcF9wY2l4X2J1c19lcnJfYXR0cjsJCS8qIDB4MDAwNjA4ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NodWJfbW1yLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NodWJfbW1yLmgKaW5kZXggMzIzZmEwYy4uN2RlMWQxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zaHViX21tci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc2h1Yl9tbXIuaApAQCAtMTQsOTYgKzE0LDk4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9JUElfSU5UIiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICBTSHViIEludGVyLVByb2Nlc3NvciBJbnRlcnJ1cHQgUmVnaXN0ZXJzICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9JUElfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAwMDM4MAotI2RlZmluZSBTSDJfSVBJX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMDAzODAKKyNkZWZpbmUgU0gxX0lQSV9JTlQJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDAwMzgwKQorI2RlZmluZSBTSDJfSVBJX0lOVAkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDAzODApCiAKIC8qICAgU0hfSVBJX0lOVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVHlwZSBvZiBJbnRlcnJ1cHQ6IDA9SU5ULCAyPVBNSSwgND1OTUksIDU9SU5JVCAgICAgICAqLwotI2RlZmluZSBTSF9JUElfSU5UX1RZUEVfU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0hfSVBJX0lOVF9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDcKKyNkZWZpbmUgU0hfSVBJX0lOVF9UWVBFX1NIRlQJCQkJMAorI2RlZmluZSBTSF9JUElfSU5UX1RZUEVfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNykKIAogLyogICBTSF9JUElfSU5UX0FHVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBBZ2VudCwgbXVzdCBiZSAwIGZvciBTSHViICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX0lQSV9JTlRfQUdUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTSF9JUElfSU5UX0FHVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBTSF9JUElfSU5UX0FHVF9TSEZUCQkJCTMKKyNkZWZpbmUgU0hfSVBJX0lOVF9BR1RfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKIAogLyogICBTSF9JUElfSU5UX1BJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQcm9jZXNzb3IgSUQsIHNhbWUgc2V0dGluZyBhcyBvbiB0YXJnZXRlZCBNY0tpbmxleSAgKi8KLSNkZWZpbmUgU0hfSVBJX0lOVF9QSURfU0hGVCAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNIX0lQSV9JTlRfUElEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMGZmZmYwCisjZGVmaW5lIFNIX0lQSV9JTlRfUElEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgCTQKKyNkZWZpbmUgU0hfSVBJX0lOVF9QSURfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDBmZmZmMCkKIAogLyogICBTSF9JUElfSU5UX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBPcHRpb25hbCBpbnRlcnJ1cHQgdmVjdG9yIGFyZWEsIDJNQiBhbGlnbmVkICAgICAgICAgICovCi0jZGVmaW5lIFNIX0lQSV9JTlRfQkFTRV9TSEZUICAgICAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgU0hfSVBJX0lOVF9CQVNFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDNmZmZmZmZlMDAwMDAKKyNkZWZpbmUgU0hfSVBJX0lOVF9CQVNFX1NIRlQJCQkJMjEKKyNkZWZpbmUgU0hfSVBJX0lOVF9CQVNFX01BU0sgCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAzZmZmZmZmZTAwMDAwKQogCiAvKiAgIFNIX0lQSV9JTlRfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFRhcmdldGVkIE1jS2lubGV5IGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSVBJX0lOVF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICA1MgotI2RlZmluZSBTSF9JUElfSU5UX0lEWF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MGZmMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSF9JUElfSU5UX0lEWF9TSEZUCQkJCTUyCisjZGVmaW5lIFNIX0lQSV9JTlRfSURYX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDBmZjAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfSVBJX0lOVF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgU2VuZCBJbnRlcnJ1cHQgTWVzc2FnZSB0byBQSSwgVGhpcyBnZW5lcmF0ZXMgYSBwdWxzICAqLwotI2RlZmluZSBTSF9JUElfSU5UX1NFTkRfU0hGVCAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIFNIX0lQSV9JTlRfU0VORF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIX0lQSV9JTlRfU0VORF9TSEZUCQkJCTYzCisjZGVmaW5lIFNIX0lQSV9JTlRfU0VORF9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHg4MDAwMDAwMDAwMDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfRVZFTlRfT0NDVVJSRUQiICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICBTSHViIEludGVycnVwdCBFdmVudCBPY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDFfRVZFTlRfT0NDVVJSRUQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMTAwMDAKLSNkZWZpbmUgU0gxX0VWRU5UX09DQ1VSUkVEX0FMSUFTICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDEwMDA4Ci0jZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAxMDAwMAotI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfQUxJQVMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMTAwMDgKKyNkZWZpbmUgU0gxX0VWRU5UX09DQ1VSUkVECQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDEwMDAwKQorI2RlZmluZSBTSDFfRVZFTlRfT0NDVVJSRURfQUxJQVMJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDAxMDAwOCkKKyNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVECQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDEwMDAwKQorI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfQUxJQVMgCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMTAwMDgpCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9QSV9DQU1fQ09OVFJPTCIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgQ1JCIENBTSBNTVIgQWNjZXNzIENvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9QSV9DQU1fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEyMDA1MDMwMAorI2RlZmluZSBTSDFfUElfQ0FNX0NPTlRST0wJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMjAwNTAzMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9TSFVCX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0h1YiBJRCBOdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9TSFVCX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDA2MDU4MAotI2RlZmluZSBTSDFfU0hVQl9JRF9SRVZJU0lPTl9TSEZUICAgICAgICAgICAgICAgICAyOAotI2RlZmluZSBTSDFfU0hVQl9JRF9SRVZJU0lPTl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDAwZjAwMDAwMDAKKyNkZWZpbmUgU0gxX1NIVUJfSUQJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDYwNTgwKQorI2RlZmluZSBTSDFfU0hVQl9JRF9SRVZJU0lPTl9TSEZUCQkJMjgKKyNkZWZpbmUgU0gxX1NIVUJfSURfUkVWSVNJT05fTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMGYwMDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9SVEMiICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIENsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDFfUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAxYzAwMDAKLSNkZWZpbmUgU0gyX1JUQwkJCQkJICAweDAwMDAwMDAyMTAxYzAwMDAKLSNkZWZpbmUgU0hfUlRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCisjZGVmaW5lIFNIMV9SVEMJCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDFjMDAwMCkKKyNkZWZpbmUgU0gyX1JUQwkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMjEwMWMwMDAwKQorI2RlZmluZSBTSF9SVENfTUFTSwkJCV9fSUE2NF9VTF9DT05TVCgweDAwN2ZmZmZmZmZmZmZmZmYpCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfUElPX1dSSVRFX1NUQVRVU18wfDEiICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgUElPIFdyaXRlIFN0YXR1cyBmb3IgQ1BVIDAgJiAxICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEyMDA3MDIwMAotI2RlZmluZSBTSDFfUElPX1dSSVRFX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMjAwNzAyODAKLSNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDIwMDcwMjAwCi0jZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAyMDA3MDI4MAotI2RlZmluZSBTSDJfUElPX1dSSVRFX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMjAwNzAzMDAKLSNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDIwMDcwMzgwCisjZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzAJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMjAwNzAyMDApCisjZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzEJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMjAwNzAyODApCisjZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzAJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwNzAyMDApCisjZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzEJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwNzAyODApCisjZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzIJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwNzAzMDApCisjZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzMJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwNzAzODApCiAKIC8qICAgU0hfUElPX1dSSVRFX1NUQVRVU18wX1dSSVRFX0RFQURMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgRGVhZGxvY2sgcmVzcG9uc2UgZGV0ZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9QSU9fV1JJVEVfU1RBVFVTX1dSSVRFX0RFQURMT0NLX1NIRlQgMQotI2RlZmluZSBTSF9QSU9fV1JJVEVfU1RBVFVTX1dSSVRFX0RFQURMT0NLX01BU0sgMHgwMDAwMDAwMDAwMDAwMDAyCisjZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfU0hGVAkJMQorI2RlZmluZSBTSF9QSU9fV1JJVEVfU1RBVFVTX1dSSVRFX0RFQURMT0NLX01BU0sgXAorCQkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAyKQogCiAvKiAgIFNIX1BJT19XUklURV9TVEFUVVNfMF9QRU5ESU5HX1dSSVRFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIENvdW50IG9mIGN1cnJlbnRseSBwZW5kaW5nIFBJTyB3cml0ZXMgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUElPX1dSSVRFX1NUQVRVU19QRU5ESU5HX1dSSVRFX0NPVU5UX1NIRlQgNTYKLSNkZWZpbmUgU0hfUElPX1dSSVRFX1NUQVRVU19QRU5ESU5HX1dSSVRFX0NPVU5UX01BU0sgMHgzZjAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfUEVORElOR19XUklURV9DT1VOVF9TSEZUCTU2CisjZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfUEVORElOR19XUklURV9DT1VOVF9NQVNLIFwKKwkJCQkJX19JQTY0X1VMX0NPTlNUKDB4M2YwMDAwMDAwMDAwMDAwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9QSU9fV1JJVEVfU1RBVFVTXzBfQUxJQVMiICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDFfUElPX1dSSVRFX1NUQVRVU18wX0FMSUFTICAgICAgICAgICAgICAweDAwMDAwMDAxMjAwNzAyMDgKLSNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMF9BTElBUyAgICAgICAgICAgICAgMHgwMDAwMDAwMDIwMDcwMjA4CisjZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzBfQUxJQVMJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEyMDA3MDIwOCkKKyNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMF9BTElBUwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDIwMDcwMjA4KQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfRVZFTlRfT0NDVVJSRUQiICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTExMSwzMyArMTEzLDMzIEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICBTSF9FVkVOVF9PQ0NVUlJFRF9VQVJUX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQZW5kaW5nIEp1bmsgQnVzIFVBUlQgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1VBUlRfSU5UX1NIRlQgICAgICAgICAgMjAKLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfVUFSVF9JTlRfTUFTSyAgICAgICAgICAweDAwMDAwMDAwMDAxMDAwMDAKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfVUFSVF9JTlRfU0hGVAkJCTIwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1VBUlRfSU5UX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDEwMDAwMCkKIAogLyogICBTSF9FVkVOVF9PQ0NVUlJFRF9JUElfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQZW5kaW5nIElQSSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lQSV9JTlRfU0hGVCAgICAgICAgICAgMjgKLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSVBJX0lOVF9NQVNLICAgICAgICAgICAweDAwMDAwMDAwMTAwMDAwMDAKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSVBJX0lOVF9TSEZUCQkJMjgKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSVBJX0lOVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDAwMDApCiAKIC8qICAgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBJSSAwIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQwX1NIRlQgICAgICAgICAgIDI5Ci0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDBfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMDIwMDAwMDAwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDBfU0hGVAkJCTI5CisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDBfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDIwMDAwMDAwKQogCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgSUkgMSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMV9TSEZUICAgICAgICAgICAzMAotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQxX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDA0MDAwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQxX1NIRlQJCQkzMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQxX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDA0MDAwMDAwMCkKIAogLyogICBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQZW5kaW5nIFNIVUIgMiBFWFQgSU8gSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQyX1NIRlQgICAgICAgMzMKLSNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDJfTUFTSyAgICAgICAweDAwMDAwMDAyMDAwMDAwMDAKKyNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDJfU0hGVAkJMzMKKyNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDJfTUFTSyBfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMjAwMDAwMDAwKQogCiAvKiAgIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgU0hVQiAyIEVYVCBJTyBJTlQzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDNfU0hGVCAgICAgICAzNAotI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UM19NQVNLICAgICAgIDB4MDAwMDAwMDQwMDAwMDAwMAorI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UM19TSEZUCQkzNAorI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UM19NQVNLIF9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDA0MDAwMDAwMDApCiAKICNkZWZpbmUgU0hfQUxMX0lOVF9NQVNLIFwKIAkoU0hfRVZFTlRfT0NDVVJSRURfVUFSVF9JTlRfTUFTSyB8IFNIX0VWRU5UX09DQ1VSUkVEX0lQSV9JTlRfTUFTSyB8IFwKQEAgLTE0OSwzMTAgKzE1MSwzMTAgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBMRURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMAkJCSAweDdmZWQwMDAwMFVMCi0jZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDEJCQkgMHg3ZmVkMTAwMDBVTAotI2RlZmluZSBTSDFfUkVBTF9KVU5LX0JVU19MRUQyCQkJIDB4N2ZlZDIwMDAwVUwKLSNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMwkJCSAweDdmZWQzMDAwMFVMCisjZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDAJCQkweDdmZWQwMDAwMFVMCisjZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDEJCQkweDdmZWQxMDAwMFVMCisjZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDIJCQkweDdmZWQyMDAwMFVMCisjZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDMJCQkweDdmZWQzMDAwMFVMCiAKLSNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMAkJCSAweGYwMDAwMDAwVUwKLSNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMQkJCSAweGYwMDEwMDAwVUwKLSNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMgkJCSAweGYwMDIwMDAwVUwKLSNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMwkJCSAweGYwMDMwMDAwVUwKKyNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMAkJCTB4ZjAwMDAwMDBVTAorI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQxCQkJMHhmMDAxMDAwMFVMCisjZGVmaW5lIFNIMl9SRUFMX0pVTktfQlVTX0xFRDIJCQkweGYwMDIwMDAwVUwKKyNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMwkJCTB4ZjAwMzAwMDBVTAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIMV9QVENfMCIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgIFB1Z2UgVHJhbnNsYXRpb24gQ2FjaGUgTWVzc2FnZSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDFfUFRDXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAxYTAwMDAKKyNkZWZpbmUgU0gxX1BUQ18wCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDFhMDAwMCkKIAogLyogICBTSDFfUFRDXzBfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMV9QVENfMF9BX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0gxX1BUQ18wX0FfU0hGVAkJCQkwCiAKIC8qICAgU0gxX1BUQ18wX1BTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGFnZSBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDFfUFRDXzBfUFNfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNIMV9QVENfMF9QU19TSEZUCQkJCTIKIAogLyogICBTSDFfUFRDXzBfUklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBSZWdpb24gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMV9QVENfMF9SSURfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU0gxX1BUQ18wX1JJRF9TSEZUCQkJCTgKIAogLyogICBTSDFfUFRDXzBfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBTdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMV9QVENfMF9TVEFSVF9TSEZUICAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFNIMV9QVENfMF9TVEFSVF9TSEZUCQkJCTYzCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0gxX1BUQ18xIiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgUHVnZSBUcmFuc2xhdGlvbiBDYWNoZSBNZXNzYWdlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9QVENfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFhMDA4MAorI2RlZmluZSBTSDFfUFRDXzEJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWEwMDgwKQogCiAvKiAgIFNIMV9QVENfMV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBUQ18xIFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gxX1BUQ18xX1NUQVJUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgNjMKLQorI2RlZmluZSBTSDFfUFRDXzFfU1RBUlRfU0hGVAkJCQk2MwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIMl9QVEMiICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgIFB1Z2UgVHJhbnNsYXRpb24gQ2FjaGUgTWVzc2FnZSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDJfUFRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxNzAwMDAwMDAKKyNkZWZpbmUgU0gyX1BUQwkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTcwMDAwMDAwKQogCiAvKiAgIFNIMl9QVENfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gyX1BUQ19BX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSDJfUFRDX0FfU0hGVAkJCQkJMAogCiAvKiAgIFNIMl9QVENfUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBhZ2UgU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gyX1BUQ19QU19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTSDJfUFRDX1BTX1NIRlQJCQkJCTIKIAogLyogICBTSDJfUFRDX1JJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUmVnaW9uIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfUFRDX1JJRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNIMl9QVENfUklEX1NIRlQJCQkJNAogCiAvKiAgIFNIMl9QVENfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gyX1BUQ19TVEFSVF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgU0gyX1BUQ19TVEFSVF9TSEZUCQkJCTYzCiAKIC8qICAgU0gyX1BUQ19BRERSX1JJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUmVnaW9uIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfUFRDX0FERFJfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNIMl9QVENfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWZmZmZmZmZmZmZmZjAwMAorI2RlZmluZSBTSDJfUFRDX0FERFJfU0hGVAkJCQk0CisjZGVmaW5lIFNIMl9QVENfQUREUl9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgxZmZmZmZmZmZmZmZmMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9SVEMxX0lOVF9DT05GSUciICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgIFNIdWIgUlRDIDEgSW50ZXJydXB0IENvbmZpZyBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9SVEMxX0lOVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDAxNDgwCi0jZGVmaW5lIFNIMl9SVEMxX0lOVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDAxNDgwCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgICAgMHgwZmYzZmZmZmZmZWZmZmZmCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JTklUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9SVEMxX0lOVF9DT05GSUcJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMDE0ODApCisjZGVmaW5lIFNIMl9SVEMxX0lOVF9DT05GSUcJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDE0ODApCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwZmYzZmZmZmZmZWZmZmZmKQorI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfSU5JVAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMCkKIAogLyogICBTSF9SVEMxX0lOVF9DT05GSUdfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUeXBlIG9mIEludGVycnVwdDogMD1JTlQsIDI9UE1JLCA0PU5NSSwgNT1JTklUICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19UWVBFX1NIRlQgICAgICAgICAgICAgMAotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfVFlQRV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwNworI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfVFlQRV9TSEZUCQkJMAorI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfVFlQRV9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDcpCiAKIC8qICAgU0hfUlRDMV9JTlRfQ09ORklHX0FHVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgQWdlbnQsIG11c3QgYmUgMCBmb3IgU0h1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQUdUX1NIRlQgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0FHVF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDgKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0FHVF9TSEZUCQkJMworI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQUdUX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKIAogLyogICBTSF9SVEMxX0lOVF9DT05GSUdfUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQcm9jZXNzb3IgSUQsIHNhbWUgc2V0dGluZyBhcyBvbiB0YXJnZXRlZCBNY0tpbmxleSAgKi8KLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX1BJRF9TSEZUICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19QSURfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMGZmZmYwCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19QSURfU0hGVAkJCTQKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX1BJRF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwZmZmZjApCiAKIC8qICAgU0hfUlRDMV9JTlRfQ09ORklHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgT3B0aW9uYWwgaW50ZXJydXB0IHZlY3RvciBhcmVhLCAyTUIgYWxpZ25lZCAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQkFTRV9TSEZUICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19CQVNFX01BU0sgICAgICAgICAgICAgMHgwMDAzZmZmZmZmZTAwMDAwCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19CQVNFX1NIRlQJCQkyMQorI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQkFTRV9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDNmZmZmZmZlMDAwMDApCiAKIC8qICAgU0hfUlRDMV9JTlRfQ09ORklHX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVGFyZ2V0ZWQgTWNLaW5sZXkgaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfSURYX1NIRlQgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JRFhfTUFTSyAgICAgICAgICAgICAgMHgwZmYwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JRFhfU0hGVAkJCTUyCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JRFhfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwZmYwMDAwMDAwMDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9SVEMxX0lOVF9FTkFCTEUiICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgIFNIdWIgUlRDIDEgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9SVEMxX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDAxNTAwCi0jZGVmaW5lIFNIMl9SVEMxX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDAxNTAwCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9JTklUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9SVEMxX0lOVF9FTkFCTEUJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMDE1MDApCisjZGVmaW5lIFNIMl9SVEMxX0lOVF9FTkFCTEUJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDE1MDApCisjZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBTSF9SVEMxX0lOVF9FTkFCTEVfSU5JVAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMCkKIAogLyogICBTSF9SVEMxX0lOVF9FTkFCTEVfUlRDMV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBFbmFibGUgUlRDIDEgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9SVEMxX0VOQUJMRV9TSEZUICAgICAgMAotI2RlZmluZSBTSF9SVEMxX0lOVF9FTkFCTEVfUlRDMV9FTkFCTEVfTUFTSyAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBTSF9SVEMxX0lOVF9FTkFCTEVfUlRDMV9FTkFCTEVfU0hGVAkJMAorI2RlZmluZSBTSF9SVEMxX0lOVF9FTkFCTEVfUlRDMV9FTkFCTEVfTUFTSyBcCisJCQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1JUQzJfSU5UX0NPTkZJRyIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgU0h1YiBSVEMgMiBJbnRlcnJ1cHQgQ29uZmlnIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gxX1JUQzJfSU5UX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMDE1ODAKLSNkZWZpbmUgU0gyX1JUQzJfSU5UX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMDE1ODAKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX01BU0sgICAgICAgICAgICAgICAgICAweDBmZjNmZmZmZmZlZmZmZmYKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lOSVQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0gxX1JUQzJfSU5UX0NPTkZJRwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDAwMTU4MCkKKyNkZWZpbmUgU0gyX1JUQzJfSU5UX0NPTkZJRwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMTU4MCkKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDBmZjNmZmZmZmZlZmZmZmYpCisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX1JUQzJfSU5UX0NPTkZJR19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFR5cGUgb2YgSW50ZXJydXB0OiAwPUlOVCwgMj1QTUksIDQ9Tk1JLCA1PUlOSVQgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1RZUEVfU0hGVCAgICAgICAgICAgICAwCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19UWVBFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA3CisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19UWVBFX1NIRlQJCQkwCisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19UWVBFX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNykKIAogLyogICBTSF9SVEMyX0lOVF9DT05GSUdfQUdUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBBZ2VudCwgbXVzdCBiZSAwIGZvciBTSHViICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19BR1RfU0hGVCAgICAgICAgICAgICAgMwotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfQUdUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfQUdUX1NIRlQJCQkzCisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19BR1RfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA4KQogCiAvKiAgIFNIX1JUQzJfSU5UX0NPTkZJR19QSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFByb2Nlc3NvciBJRCwgc2FtZSBzZXR0aW5nIGFzIG9uIHRhcmdldGVkIE1jS2lubGV5ICAqLwotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfUElEX1NIRlQgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1BJRF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwZmZmZjAKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1BJRF9TSEZUCQkJNAorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfUElEX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDBmZmZmMCkKIAogLyogICBTSF9SVEMyX0lOVF9DT05GSUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBPcHRpb25hbCBpbnRlcnJ1cHQgdmVjdG9yIGFyZWEsIDJNQiBhbGlnbmVkICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19CQVNFX1NIRlQgICAgICAgICAgICAgMjEKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0JBU0VfTUFTSyAgICAgICAgICAgICAweDAwMDNmZmZmZmZlMDAwMDAKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0JBU0VfU0hGVAkJCTIxCisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19CQVNFX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwM2ZmZmZmZmUwMDAwMCkKIAogLyogICBTSF9SVEMyX0lOVF9DT05GSUdfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUYXJnZXRlZCBNY0tpbmxleSBpbnRlcnJ1cHQgdmVjdG9yICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19JRFhfU0hGVCAgICAgICAgICAgICAgNTIKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lEWF9NQVNLICAgICAgICAgICAgICAweDBmZjAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lEWF9TSEZUCQkJNTIKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lEWF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDBmZjAwMDAwMDAwMDAwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1JUQzJfSU5UX0VOQUJMRSIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgU0h1YiBSVEMgMiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gxX1JUQzJfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMDE2MDAKLSNkZWZpbmUgU0gyX1JUQzJfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMDE2MDAKLSNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKLSNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX0lOSVQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0gxX1JUQzJfSU5UX0VOQUJMRQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDAwMTYwMCkKKyNkZWZpbmUgU0gyX1JUQzJfSU5UX0VOQUJMRQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMTYwMCkKKyNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCisjZGVmaW5lIFNIX1JUQzJfSU5UX0VOQUJMRV9JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX1JUQzJfSU5UX0VOQUJMRV9SVEMyX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIEVuYWJsZSBSVEMgMiBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX1JUQzJfRU5BQkxFX1NIRlQgICAgICAwCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0VOQUJMRV9SVEMyX0VOQUJMRV9NQVNLICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIFNIX1JUQzJfSU5UX0VOQUJMRV9SVEMyX0VOQUJMRV9TSEZUCQkwCisjZGVmaW5lIFNIX1JUQzJfSU5UX0VOQUJMRV9SVEMyX0VOQUJMRV9NQVNLIFwKKwkJCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfUlRDM19JTlRfQ09ORklHIiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICBTSHViIFJUQyAzIEludGVycnVwdCBDb25maWcgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfUlRDM19JTlRfQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAwMTY4MAotI2RlZmluZSBTSDJfUlRDM19JTlRfQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMTY4MAotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MGZmM2ZmZmZmZmVmZmZmZgotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfUlRDM19JTlRfQ09ORklHCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDAxNjgwKQorI2RlZmluZSBTSDJfUlRDM19JTlRfQ09ORklHCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDAxNjgwKQorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MGZmM2ZmZmZmZmVmZmZmZikKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfUlRDM19JTlRfQ09ORklHX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVHlwZSBvZiBJbnRlcnJ1cHQ6IDA9SU5ULCAyPVBNSSwgND1OTUksIDU9SU5JVCAgICAgICAqLwotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfVFlQRV9TSEZUICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX1RZUEVfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDcKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX1RZUEVfU0hGVAkJCTAKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX1RZUEVfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA3KQogCiAvKiAgIFNIX1JUQzNfSU5UX0NPTkZJR19BR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIEFnZW50LCBtdXN0IGJlIDAgZm9yIFNIdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0FHVF9TSEZUICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19BR1RfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19BR1RfU0hGVAkJCTMKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0FHVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCiAKIC8qICAgU0hfUlRDM19JTlRfQ09ORklHX1BJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUHJvY2Vzc29yIElELCBzYW1lIHNldHRpbmcgYXMgb24gdGFyZ2V0ZWQgTWNLaW5sZXkgICovCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19QSURfU0hGVCAgICAgICAgICAgICAgNAotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfUElEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDBmZmZmMAorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfUElEX1NIRlQJCQk0CisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19QSURfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMGZmZmYwKQogCiAvKiAgIFNIX1JUQzNfSU5UX0NPTkZJR19CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIE9wdGlvbmFsIGludGVycnVwdCB2ZWN0b3IgYXJlYSwgMk1CIGFsaWduZWQgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0JBU0VfU0hGVCAgICAgICAgICAgICAyMQotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQkFTRV9NQVNLICAgICAgICAgICAgIDB4MDAwM2ZmZmZmZmUwMDAwMAorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQkFTRV9TSEZUCQkJMjEKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0JBU0VfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAzZmZmZmZmZTAwMDAwKQogCiAvKiAgIFNIX1JUQzNfSU5UX0NPTkZJR19JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFRhcmdldGVkIE1jS2lubGV5IGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0lEWF9TSEZUICAgICAgICAgICAgICA1MgotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSURYX01BU0sgICAgICAgICAgICAgIDB4MGZmMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSURYX1NIRlQJCQk1MgorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSURYX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MGZmMDAwMDAwMDAwMDAwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfUlRDM19JTlRfRU5BQkxFIiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICBTSHViIFJUQyAzIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfUlRDM19JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAwMTcwMAotI2RlZmluZSBTSDJfUlRDM19JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMTcwMAotI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQotI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfUlRDM19JTlRfRU5BQkxFCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDAxNzAwKQorI2RlZmluZSBTSDJfUlRDM19JTlRfRU5BQkxFCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDAxNzAwKQorI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKyNkZWZpbmUgU0hfUlRDM19JTlRfRU5BQkxFX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfUlRDM19JTlRfRU5BQkxFX1JUQzNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgRW5hYmxlIFJUQyAzIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfUlRDM19FTkFCTEVfU0hGVCAgICAgIDAKLSNkZWZpbmUgU0hfUlRDM19JTlRfRU5BQkxFX1JUQzNfRU5BQkxFX01BU0sgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKKyNkZWZpbmUgU0hfUlRDM19JTlRfRU5BQkxFX1JUQzNfRU5BQkxFX1NIRlQJCTAKKyNkZWZpbmUgU0hfUlRDM19JTlRfRU5BQkxFX1JUQzNfRU5BQkxFX01BU0sgXAorCQkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQogCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgUlRDIDEgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDMV9JTlRfU0hGVCAgICAgICAgICAyNAotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDAwMTAwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9TSEZUCQkJMjQKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDMV9JTlRfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAxMDAwMDAwKQogCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgUlRDIDIgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDMl9JTlRfU0hGVCAgICAgICAgICAyNQotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMyX0lOVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDAwMjAwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMyX0lOVF9TSEZUCQkJMjUKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDMl9JTlRfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAyMDAwMDAwKQogCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzNfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgUlRDIDMgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDM19JTlRfU0hGVCAgICAgICAgICAyNgotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMzX0lOVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDAwNDAwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMzX0lOVF9TSEZUCQkJMjYKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfUlRDM19JTlRfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDA0MDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9JUElfQUNDRVNTIiAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICBDUFUgaW50ZXJydXB0IEFjY2VzcyBQZXJtaXNzaW9uIEJpdHMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9JUElfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDYwNDgwCi0jZGVmaW5lIFNIMl9JUElfQUNDRVNTMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDYwYzAwCi0jZGVmaW5lIFNIMl9JUElfQUNDRVNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDYwYzgwCi0jZGVmaW5lIFNIMl9JUElfQUNDRVNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDYwZDAwCi0jZGVmaW5lIFNIMl9JUElfQUNDRVNTMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDYwZDgwCisjZGVmaW5lIFNIMV9JUElfQUNDRVNTCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDA2MDQ4MCkKKyNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MwCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDA2MGMwMCkKKyNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MxCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDA2MGM4MCkKKyNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MyCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDA2MGQwMCkKKyNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MzCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDA2MGQ4MCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX0lOVF9DTVBCIiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgIFJUQyBDb21wYXJlIFZhbHVlIGZvciBQcm9jZXNzb3IgQiAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfSU5UX0NNUEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFiMDA4MAotI2RlZmluZSBTSDJfSU5UX0NNUEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDFiMDA4MAotI2RlZmluZSBTSF9JTlRfQ01QQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3ZmZmZmZmZmZmZmZmZgotI2RlZmluZSBTSF9JTlRfQ01QQl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfSU5UX0NNUEIJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWIwMDgwKQorI2RlZmluZSBTSDJfSU5UX0NNUEIJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMWIwMDgwKQorI2RlZmluZSBTSF9JTlRfQ01QQl9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBTSF9JTlRfQ01QQl9JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX0lOVF9DTVBCX1JFQUxfVElNRV9DTVBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFJlYWwgVGltZSBDbG9jayBDb21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfU0hGVCAgICAgICAgICAwCi0jZGVmaW5lIFNIX0lOVF9DTVBCX1JFQUxfVElNRV9DTVBCX01BU0sgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCisjZGVmaW5lIFNIX0lOVF9DTVBCX1JFQUxfVElNRV9DTVBCX1NIRlQJCQkwCisjZGVmaW5lIFNIX0lOVF9DTVBCX1JFQUxfVElNRV9DTVBCX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDA3ZmZmZmZmZmZmZmZmZikKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX0lOVF9DTVBDIiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgIFJUQyBDb21wYXJlIFZhbHVlIGZvciBQcm9jZXNzb3IgQyAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfSU5UX0NNUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFiMDEwMAotI2RlZmluZSBTSDJfSU5UX0NNUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDFiMDEwMAotI2RlZmluZSBTSF9JTlRfQ01QQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3ZmZmZmZmZmZmZmZmZgotI2RlZmluZSBTSF9JTlRfQ01QQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfSU5UX0NNUEMJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWIwMTAwKQorI2RlZmluZSBTSDJfSU5UX0NNUEMJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMWIwMTAwKQorI2RlZmluZSBTSF9JTlRfQ01QQ19NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBTSF9JTlRfQ01QQ19JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFJlYWwgVGltZSBDbG9jayBDb21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVCAgICAgICAgICAwCi0jZGVmaW5lIFNIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX01BU0sgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCisjZGVmaW5lIFNIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX1NIRlQJCQkwCisjZGVmaW5lIFNIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDA3ZmZmZmZmZmZmZmZmZikKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX0lOVF9DTVBEIiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgIFJUQyBDb21wYXJlIFZhbHVlIGZvciBQcm9jZXNzb3IgRCAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfSU5UX0NNUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFiMDE4MAotI2RlZmluZSBTSDJfSU5UX0NNUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDFiMDE4MAotI2RlZmluZSBTSF9JTlRfQ01QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3ZmZmZmZmZmZmZmZmZgotI2RlZmluZSBTSF9JTlRfQ01QRF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfSU5UX0NNUEQJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWIwMTgwKQorI2RlZmluZSBTSDJfSU5UX0NNUEQJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMWIwMTgwKQorI2RlZmluZSBTSF9JTlRfQ01QRF9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBTSF9JTlRfQ01QRF9JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFJlYWwgVGltZSBDbG9jayBDb21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfU0hGVCAgICAgICAgICAwCi0jZGVmaW5lIFNIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX01BU0sgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCisjZGVmaW5lIFNIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX1NIRlQJCQkwCisjZGVmaW5lIFNIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDA3ZmZmZmZmZmZmZmZmZikKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9NRF9EUUxQX01NUl9ESVJfUFJJVkVDMCIgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBwcml2aWxlZ2UgdmVjdG9yIGZvciBhY2M9MCAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2RlZmluZSBTSDFfTURfRFFMUF9NTVJfRElSX1BSSVZFQzAgICAgICAgICAgICAgIDB4MDAwMDAwMDEwMDAzMDMwMAorI2RlZmluZSBTSDFfTURfRFFMUF9NTVJfRElSX1BSSVZFQzAJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEwMDAzMDMwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9NRF9EUVJQX01NUl9ESVJfUFJJVkVDMCIgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBwcml2aWxlZ2UgdmVjdG9yIGZvciBhY2M9MCAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2RlZmluZSBTSDFfTURfRFFSUF9NTVJfRElSX1BSSVZFQzAgICAgICAgICAgICAgIDB4MDAwMDAwMDEwMDA1MDMwMAorI2RlZmluZSBTSDFfTURfRFFSUF9NTVJfRElSX1BSSVZFQzAJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEwMDA1MDMwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qIFNvbWUgTU1ScyBhcmUgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCAob3IgY2xvc2UgZW5vdWdoKSBvbiBib3RoIFNIVUIxICovCkBAIC00ODQsMTcgKzQ4NiwxNyBAQAogLyogICAgICAgICAgICAgICAgICAgIEVuZ2luZSAwIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNDAwMDAKLSNkZWZpbmUgU0gyX0JUX0VOR19TUkNfQUREUl8wICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNDAwODAKLSNkZWZpbmUgU0gyX0JUX0VOR19ERVNUX0FERFJfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNDAxMDAKLSNkZWZpbmUgU0gyX0JUX0VOR19OT1RJRl9BRERSXzAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNDAxODAKKyNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAzMDA0MDAwMCkKKyNkZWZpbmUgU0gyX0JUX0VOR19TUkNfQUREUl8wCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDMwMDQwMDgwKQorI2RlZmluZSBTSDJfQlRfRU5HX0RFU1RfQUREUl8wCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDMwMDQwMTAwKQorI2RlZmluZSBTSDJfQlRfRU5HX05PVElGX0FERFJfMAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAzMDA0MDE4MCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICBCVEUgaW50ZXJmYWNlcyAxLTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDMwMDUwMDAwCi0jZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDMwMDYwMDAwCi0jZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDMwMDcwMDAwCisjZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzEJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMzAwNTAwMDApCisjZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzIJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMzAwNjAwMDApCisjZGVmaW5lIFNIMl9CVF9FTkdfQ1NSXzMJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMzAwNzAwMDApCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU05fU0hVQl9NTVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zaW11bGF0b3IuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc2ltdWxhdG9yLmgKaW5kZXggNzhlYjRmOC4uMTZhNDhiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zaW11bGF0b3IuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NpbXVsYXRvci5oCkBAIC0xMCwxOCArMTAsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi0jaWZkZWYgQ09ORklHX0lBNjRfU0dJX1NOX1NJTQotCiAjZGVmaW5lIFNOTUFHSUMgMHhhZWVlZWVlZThiYWRiZWVmTAotI2RlZmluZSBJU19SVU5OSU5HX09OX1NJTVVMQVRPUigpICh7bG9uZyBzbjsgYXNtKCJtb3YgJTA9Y3B1aWRbJTFdIiA6ICI9ciIoc24pIDogInIiKDIpKTsgc24gPT0gU05NQUdJQzt9KQorI2RlZmluZSBJU19NRURVU0EoKQkJCSh7bG9uZyBzbjsgYXNtKCJtb3YgJTA9Y3B1aWRbJTFdIiA6ICI9ciIoc24pIDogInIiKDIpKTsgc24gPT0gU05NQUdJQzt9KQogCi0jZGVmaW5lIFNJTVVMQVRPUl9TTEVFUCgpCWFzbSgibm9wLmkgMHg4YmVlZiIpCi0KLSNlbHNlCi0KLSNkZWZpbmUgSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKQkoMCkKLSNkZWZpbmUgU0lNVUxBVE9SX1NMRUVQKCkKLQotI2VuZGlmCisjZGVmaW5lIFNJTVVMQVRPUl9TTEVFUCgpCQlhc20oIm5vcC5pIDB4OGJlZWYiKQorI2RlZmluZSBJU19SVU5OSU5HX09OX1NJTVVMQVRPUigpCShzbl9wcm9tX3R5cGUpCisjZGVmaW5lIElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkJKHNuX3Byb21fdHlwZSA9PSAyKQorZXh0ZXJuIGludCBzbl9wcm9tX3R5cGU7CQkvKiAwPWhhcmR3YXJlLCAxPW1lZHVzYS9yZWFscHJvbSwgMj1tZWR1c2EvZmFrZXByb20gKi8KIAogI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9TSU1VTEFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbjIvc25faHdwZXJmLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuMi9zbl9od3BlcmYuaAppbmRleCBiMGM0ZDZkLi5kZjc1ZjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuMi9zbl9od3BlcmYuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuMi9zbl9od3BlcmYuaApAQCAtMjIzLDQgKzIyMyw2IEBACiAjZGVmaW5lIFNOX0hXUEVSRl9PUF9SRUNPTkZJR1VSRQkyNTMKICNkZWZpbmUgU05fSFdQRVJGX09QX0lOVkFMCQkyNTQKIAoraW50IHNuX3RvcG9sb2d5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IHNuX3RvcG9sb2d5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogI2VuZGlmCQkJCS8qIFNOX0hXUEVSRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2NwdWlkLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2NwdWlkLmgKaW5kZXggMjBiMzAwMS4uZDJjMWQzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9jcHVpZC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fY3B1aWQuaApAQCAtODEsMTEgKzgxLDYgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIGNwdV9waHlzaWNhbF9pZChjcHVpZCkJCQkoKGlhNjRfZ2V0cmVnKF9JQTY0X1JFR19DUl9MSUQpID4+IDE2KSAmIDB4ZmZmZikKLSNlbmRpZgotCi0KICNkZWZpbmUgZ2V0X25vZGVfbnVtYmVyKGFkZHIpCQkJTkFTSURfR0VUKGFkZHIpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAppbmRleCBlYjAzOTVhLi4yNzk3NmQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKQEAgLTEzMiw0MyArMTMyLDMwIEBACiAjZGVmaW5lIFNBTFJFVF9JTlZBTElEX0FSRwkoLTIpCiAjZGVmaW5lIFNBTFJFVF9FUlJPUgkJKC0zKQogCisjZGVmaW5lIFNOX1NBTF9GQUtFX1BST00JCQkgICAweDAyMDA5OTk5CiAKIC8qKgotICogc25fc2FsX3Jldl9tYWpvciAtIGdldCB0aGUgbWFqb3IgU0dJIFNBTCByZXZpc2lvbiBudW1iZXIKLSAqCi0gKiBUaGUgU0dJIFBST00gc3RvcmVzIGl0cyB2ZXJzaW9uIGluIHNhbF9bYWJdX3Jldl8obWFqb3J8bWlub3IpLgotICogVGhpcyByb3V0aW5lIHNpbXBseSBleHRyYWN0cyB0aGUgbWFqb3IgdmFsdWUgZnJvbSB0aGUKLSAqIEBpYTY0X3NhbF9zeXN0YWIgc3RydWN0dXJlIGNvbnN0cnVjdGVkIGJ5IGlhNjRfc2FsX2luaXQoKS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXNuX3NhbF9yZXZfbWFqb3Iodm9pZCkKKyAgKiBzbl9zYWxfcmV2aXNpb24gLSBnZXQgdGhlIFNHSSBTQUwgcmV2aXNpb24gbnVtYmVyCisgICoKKyAgKiBUaGUgU0dJIFBST00gc3RvcmVzIGl0cyB2ZXJzaW9uIGluIHRoZSBzYWxfW2FiXV9yZXZfKG1ham9yfG1pbm9yKS4KKyAgKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGV4dHJhY3RzIHRoZSBtYWpvciBhbmQgbWlub3IgdmFsdWVzIGFuZAorICAqIHByZXNlbnRzIHRoZW0gaW4gYSB1MzIgZm9ybWF0LgorICAqCisgICogRm9yIGV4YW1wbGUsIHZlcnNpb24gNC4wNSB3b3VsZCBiZSByZXByZXNlbnRlZCBhdCAweDA0MDUuCisgICovCitzdGF0aWMgaW5saW5lIHUzMgorc25fc2FsX3Jldih2b2lkKQogewogCXN0cnVjdCBpYTY0X3NhbF9zeXN0YWIgKnN5c3RhYiA9IGVmaS5zYWxfc3lzdGFiOwogCi0JcmV0dXJuIChpbnQpc3lzdGFiLT5zYWxfYl9yZXZfbWFqb3I7Ci19Ci0KLS8qKgotICogc25fc2FsX3Jldl9taW5vciAtIGdldCB0aGUgbWlub3IgU0dJIFNBTCByZXZpc2lvbiBudW1iZXIKLSAqCi0gKiBUaGUgU0dJIFBST00gc3RvcmVzIGl0cyB2ZXJzaW9uIGluIHNhbF9bYWJdX3Jldl8obWFqb3J8bWlub3IpLgotICogVGhpcyByb3V0aW5lIHNpbXBseSBleHRyYWN0cyB0aGUgbWlub3IgdmFsdWUgZnJvbSB0aGUKLSAqIEBpYTY0X3NhbF9zeXN0YWIgc3RydWN0dXJlIGNvbnN0cnVjdGVkIGJ5IGlhNjRfc2FsX2luaXQoKS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXNuX3NhbF9yZXZfbWlub3Iodm9pZCkKLXsKLQlzdHJ1Y3QgaWE2NF9zYWxfc3lzdGFiICpzeXN0YWIgPSBlZmkuc2FsX3N5c3RhYjsKLQkKLQlyZXR1cm4gKGludClzeXN0YWItPnNhbF9iX3Jldl9taW5vcjsKKwlyZXR1cm4gKHUzMikoc3lzdGFiLT5zYWxfYl9yZXZfbWFqb3IgPDwgOCB8IHN5c3RhYi0+c2FsX2JfcmV2X21pbm9yKTsKIH0KIAogLyoKICAqIFNwZWNpZnkgdGhlIG1pbmltdW0gUFJPTSByZXZzaW9uIHJlcXVpcmVkIGZvciB0aGlzIGtlcm5lbC4KICAqIE5vdGUgdGhhdCB0aGV5J3JlIHN0b3JlZCBpbiBoZXggZm9ybWF0Li4uCiAgKi8KLSNkZWZpbmUgU05fU0FMX01JTl9NQUpPUgkweDQgIC8qIFNOMiBrZXJuZWxzIG5lZWQgYXQgbGVhc3QgUFJPTSA0LjAgKi8KLSNkZWZpbmUgU05fU0FMX01JTl9NSU5PUgkweDAKKyNkZWZpbmUgU05fU0FMX01JTl9WRVJTSU9OCTB4MDQwNAogCiAvKgogICogUmV0dXJucyB0aGUgbWFzdGVyIGNvbnNvbGUgbmFzaWQsIGlmIHRoZSBjYWxsIGZhaWxzLCByZXR1cm4gYW4gaWxsZWdhbApAQCAtMTEwNSw0ICsxMDkyLDEyIEBACiAJcmV0dXJuIChpbnQpIHJ2LnN0YXR1czsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2lhNjRfc25faXNfZmFrZV9wcm9tKHZvaWQpCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBydjsKKwlTQUxfQ0FMTF9OT0xPQ0socnYsIFNOX1NBTF9GQUtFX1BST00sIDAsIDAsIDAsIDAsIDAsIDAsIDApOworCXJldHVybiAocnYuc3RhdHVzID09IDApOworfQorCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NOX1NOX1NBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhX3Byb3ZpZGVyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhX3Byb3ZpZGVyLmgKaW5kZXggYjZhY2MyMi4uNWNjZWM2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jYV9wcm92aWRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2FfcHJvdmlkZXIuaApAQCAtMjAxLDYgKzIwMSw3IEBACiB9CiAKIGV4dGVybiB1aW50MzJfdAl0aW9jYV9nYXJ0X2ZvdW5kOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdGlvY2FfbGlzdDsKIGV4dGVybiBpbnQgdGlvY2FfaW5pdF9wcm92aWRlcih2b2lkKTsKIGV4dGVybiB2b2lkIHRpb2NhX2Zhc3R3cml0ZV9lbmFibGUoc3RydWN0IHRpb2NhX2tlcm5lbCAqdGlvY2Ffa2Vybik7CiAjZW5kaWYgLyogX0FTTV9JQTY0X1NOX1RJT19DQV9BR1BfUFJPVklERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3Rpb2NwLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3Rpb2NwLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaAppbmRleCBmMDdjODNiLi41ZjI0ODljIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvdGlvY3AuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogCXVpbnQ2NF90CWNsZWFyX2FsbDsJCQkvKiAweDAwMHs0MzgsLCw1Rjh9ICovCiAgICAgfSBjcF9idWZfY291bnRbOF07CiAKLSAgICAKKwogICAgIC8qIDB4MDAwNjAwLTB4MDAwOUZGIC0tIFBDSS9YIHJlZ2lzdGVycyAqLwogICAgIHVpbnQ2NF90CQljcF9wY2l4X2J1c19lcnJfYWRkcjsJCS8qIDB4MDAwNjAwICovCiAgICAgdWludDY0X3QJCWNwX3BjaXhfYnVzX2Vycl9hdHRyOwkJLyogMHgwMDA2MDggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAppbmRleCA5OTAyMTg1Li4xZGYxYzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCkBAIC0xNiw3ICsxNiw2IEBACiAjZGVmaW5lIF9BU01fSUE2NF9TTl9YUF9ICiAKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaAppbmRleCA0ZTY0YzJhLi4zOTliYzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCkBAIC00MCw2ICs0MCwxMSBAQAogICovCiAjZGVmaW5lIG5vZGVfdG9fZmlyc3RfY3B1KG5vZGUpIChfX2Zmcyhub2RlX3RvX2NwdW1hc2sobm9kZSkpKQogCisvKgorICogRGV0ZXJtaW5lcyB0aGUgbm9kZSBmb3IgYSBnaXZlbiBwY2kgYnVzCisgKi8KKyNkZWZpbmUgcGNpYnVzX3RvX25vZGUoYnVzKSBQQ0lfQ09OVFJPTExFUihidXMpLT5ub2RlCisKIHZvaWQgYnVpbGRfY3B1X3RvX25vZGVfbWFwKHZvaWQpOwogCiAjZGVmaW5lIFNEX0NQVV9JTklUIChzdHJ1Y3Qgc2NoZWRfZG9tYWluKSB7CQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaAppbmRleCBmN2Y0M2VjLi41MTdmMTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKQEAgLTI2Myw2ICsyNjMsOCBAQAogI2RlZmluZSBfX05SX2FkZF9rZXkJCQkxMjcxCiAjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJCTEyNzIKICNkZWZpbmUgX19OUl9rZXljdGwJCQkxMjczCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJCTEyNzQKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkJMTI3NQogI2RlZmluZSBfX05SX3NldF96b25lX3JlY2xhaW0JCTEyNzYKIAogI2lmZGVmIF9fS0VSTkVMX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdmdhLmggYi9pbmNsdWRlL2FzbS1pYTY0L3ZnYS5oCmluZGV4IDFmNDQ2ZDYuLmJjMzM0OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC92Z2EuaApAQCAtMTQsNyArMTQsMTAgQEAKICAqIHZpZGVvcmFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IGJsYWNrIG1hZ2ljLgogICovCiAKLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkJKCh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKCh4KSwgMCkpCitleHRlcm4gdW5zaWduZWQgbG9uZyB2Z2FfY29uc29sZV9pb2Jhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2Z2FfY29uc29sZV9tZW1iYXNlOworCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgpCSgodW5zaWduZWQgbG9uZykgaW9yZW1hcCh2Z2FfY29uc29sZV9tZW1iYXNlICsgKHgpLCAwKSkKIAogI2RlZmluZSB2Z2FfcmVhZGIoeCkJKCooeCkpCiAjZGVmaW5lIHZnYV93cml0ZWIoeCx5KQkoKih5KSA9ICh4KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvczFkMTM4MDYuaCBiL2luY2x1ZGUvYXNtLW0zMnIvczFkMTM4MDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhkMzZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9zMWQxMzgwNi5oCkBAIC0wLDAgKzEsMTk5IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgRmlsZSBnZW5lcmF0ZWQgYnkgUzFEMTM4MDZDRkcuRVhFCisvLworLy8gIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEVwc29uIFJlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCwgSW5jLgorLy8gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBhbmVsOiAgKGFjdGl2ZSkgIDY0MHg0ODAgNzdIeiBTVE4gU2luZ2xlIDgtYml0IChQQ0xLPUNMS0k9MjUuMTc1TUh6KQorLy8gTWVtb3J5OiBFbWJlZGRlZCBTRFJBTSAoTUNMSz1DTEtJMz01MC4wMDBNSHopIChCVVNDTEs9MzMuMzMzTUh6KQorCisjZGVmaW5lIFNXSVZFTF9WSUVXCQkwCS8qIDA6bm9uZSwgMTo5MCBub3QgY29tcGxldGVkICovCisKK3N0YXRpYyBzdHJ1Y3QgczFkMTN4eHhmYl9yZWd2YWwgczFkMTN4eHhmYl9pbml0cmVnc1tdID0geworCisgICAgezB4MDAwMSwweDAwfSwgICAvLyBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyCisgICAgezB4MDFGQywweDAwfSwgICAvLyBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJKQorICAgIHsweDAwMDQsMHgwMH0sICAgLy8gR2VuZXJhbCBJTyBQaW5zIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMAorICAgIHsweDAwMDUsMHgwMH0sICAgLy8gR2VuZXJhbCBJTyBQaW5zIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQorICAgIHsweDAwMDgsMHgwMH0sICAgLy8gR2VuZXJhbCBJTyBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgMAorICAgIHsweDAwMDksMHgwMH0sICAgLy8gR2VuZXJhbCBJTyBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgMQorICAgIHsweDAwMTAsMHgwMH0sICAgLy8gTWVtb3J5IENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDE0LDB4MDB9LCAgIC8vIExDRCBQaXhlbCBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAxOCwweDAwfSwgICAvLyBDUlQvVFYgUGl4ZWwgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMUMsMHgwMH0sICAgLy8gTWVkaWFQbHVnIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKy8qCisgKiAuLiAxME1IejogMHgwMAorICogLi4gMzBNSHo6IDB4MDEKKyAqIDMwTUh6IC4uOiAweDAyCisgKi8KKyAgICB7MHgwMDFFLDB4MDJ9LCAgIC8vIENQVSBUbyBNZW1vcnkgV2FpdCBTdGF0ZSBTZWxlY3QgUmVnaXN0ZXIKKyAgICB7MHgwMDIxLDB4MDJ9LCAgIC8vIERSQU0gUmVmcmVzaCBSYXRlIFJlZ2lzdGVyCisgICAgezB4MDAyQSwweDExfSwgICAvLyBEUkFNIFRpbWluZ3MgQ29udHJvbCBSZWdpc3RlciAwCisgICAgezB4MDAyQiwweDEzfSwgICAvLyBEUkFNIFRpbWluZ3MgQ29udHJvbCBSZWdpc3RlciAxCisgICAgezB4MDAyMCwweDgwfSwgICAvLyBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMzAsMHgyNX0sICAgLy8gUGFuZWwgVHlwZSBSZWdpc3RlcgorICAgIHsweDAwMzEsMHgwMH0sICAgLy8gTU9EIFJhdGUgUmVnaXN0ZXIKKyAgICB7MHgwMDMyLDB4NEZ9LCAgIC8vIExDRCBIb3Jpem9udGFsIERpc3BsYXkgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDM0LDB4MTJ9LCAgIC8vIExDRCBIb3Jpem9udGFsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwMzUsMHgwMX0sICAgLy8gVEZUIEZQTElORSBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMzYsMHgwQn0sICAgLy8gVEZUIEZQTElORSBQdWxzZSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwMzgsMHhERn0sICAgLy8gTENEIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDM5LDB4MDF9LCAgIC8vIExDRCBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAxCisgICAgezB4MDAzQSwweDJDfSwgICAvLyBMQ0QgVmVydGljYWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDAzQiwweDBBfSwgICAvLyBURlQgRlBGUkFNRSBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwM0MsMHgwMX0sICAgLy8gVEZUIEZQRlJBTUUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKworICAgIHsweDAwNDEsMHgwMH0sICAgLy8gTENEIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIKKyAgICB7MHgwMDQyLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAwNDMsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDA0NCwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKworI2VsaWYgZGVmaW5lZChDT05GSUdfUExBVF9NMzI3MDBVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkzKQorICAgIHsweDAwMDQsMHgwN30sICAgLy8gR1BJT1swOjddIGRpcmVjdGlvbgorICAgIHsweDAwMDUsMHgwMH0sICAgLy8gR1BJT1s4OjEyXSBkaXJlY3Rpb24KKyAgICB7MHgwMDA4LDB4MDB9LCAgIC8vIEdQSU9bMDo3XSBkYXRhCisgICAgezB4MDAwOSwweDAwfSwgICAvLyBHUElPWzg6MTJdIGRhdGEKKyAgICB7MHgwMDA4LDB4MDR9LCAgIC8vIExDRCBwYW5lbCBWY2Mgb24KKyAgICB7MHgwMDA4LDB4MDV9LCAgIC8vIExDRCBwYW5lbCByZXNldAorICAgIHsweDAwMTAsMHgwMX0sICAgLy8gTWVtb3J5IENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDE0LDB4MzB9LCAgIC8vIExDRCBQaXhlbCBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChDTEtJIDIyTUh6LzQpCisgICAgezB4MDAxOCwweDAwfSwgICAvLyBDUlQvVFYgUGl4ZWwgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMUMsMHgwMH0sICAgLy8gTWVkaWFQbHVnIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIoMTBNSHopCisgICAgezB4MDAxRSwweDAwfSwgICAvLyBDUFUgVG8gTWVtb3J5IFdhaXQgU3RhdGUgU2VsZWN0IFJlZ2lzdGVyCisgICAgezB4MDAyMCwweDgwfSwgICAvLyBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMjEsMHgwM30sICAgLy8gRFJBTSBSZWZyZXNoIFJhdGUgUmVnaXN0ZXIKKyAgICB7MHgwMDJBLDB4MDB9LCAgIC8vIERSQU0gVGltaW5ncyBDb250cm9sIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDJCLDB4MDF9LCAgIC8vIERSQU0gVGltaW5ncyBDb250cm9sIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDMwLDB4MjV9LCAgIC8vIFBhbmVsIFR5cGUgUmVnaXN0ZXIKKyAgICB7MHgwMDMxLDB4MDB9LCAgIC8vIE1PRCBSYXRlIFJlZ2lzdGVyCisgICAgezB4MDAzMiwweDFkfSwgICAvLyBMQ0QgSG9yaXpvbnRhbCBEaXNwbGF5IFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDAzNCwweDA1fSwgICAvLyBMQ0QgSG9yaXpvbnRhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDM1LDB4MDF9LCAgIC8vIFRGVCBGUExJTkUgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDM2LDB4MDF9LCAgIC8vIFRGVCBGUExJTkUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDM4LDB4M0Z9LCAgIC8vIExDRCBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAwCisgICAgezB4MDAzOSwweDAxfSwgICAvLyBMQ0QgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMQorICAgIHsweDAwM0EsMHgwYn0sICAgLy8gTENEIFZlcnRpY2FsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwM0IsMHgwN30sICAgLy8gVEZUIEZQRlJBTUUgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDNDLDB4MDJ9LCAgIC8vIFRGVCBGUEZSQU1FIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisKKyAgICB7MHgwMDQxLDB4MDB9LCAgIC8vIExDRCBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyCisjaWYgKFNXSVZFTF9WSUVXID09IDApCisgICAgezB4MDA0MiwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQzLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAwNDQsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisKKyNlbGlmIChTV0lWRUxfVklFVyA9PSAxKQorICAgIC8vIDEwMjQgLSBXKDMyMCkgPSAweDJDMAorICAgIHsweDAwNDIsMHhDMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDA0MywweDAyfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDQ0LDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorICAgIC8vIDEwMjQKKyAgICB7MHgwMDQ2LDB4MDB9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAorICAgIHsweDAwNDcsMHgwMn0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAxCisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIFNXSVZFTF9WSUVXIG1vZGUKKyNlbmRpZgorI2Vsc2UKKyNlcnJvciBubyBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCisjZW5kaWYgIC8qIENPTkZJR19QTEFUX1hYWCAqLworCisgICAgezB4MDA0OCwweDAwfSwgICAvLyBMQ0QgUGl4ZWwgUGFubmluZyBSZWdpc3RlcgorICAgIHsweDAwNEEsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgRklGTyBIaWdoIFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA0QiwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBGSUZPIExvdyBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwNTAsMHg0Rn0sICAgLy8gQ1JUL1RWIEhvcml6b250YWwgRGlzcGxheSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwNTIsMHgxM30sICAgLy8gQ1JUL1RWIEhvcml6b250YWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDA1MywweDAxfSwgICAvLyBDUlQvVFYgSFJUQyBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwNTQsMHgwQn0sICAgLy8gQ1JUL1RWIEhSVEMgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDU2LDB4REZ9LCAgIC8vIENSVC9UViBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAwCisgICAgezB4MDA1NywweDAxfSwgICAvLyBDUlQvVFYgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMQorICAgIHsweDAwNTgsMHgyQn0sICAgLy8gQ1JUL1RWIFZlcnRpY2FsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwNTksMHgwOX0sICAgLy8gQ1JUL1RWIFZSVEMgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDVBLDB4MDF9LCAgIC8vIENSVC9UViBWUlRDIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDA1QiwweDEwfSwgICAvLyBUViBPdXRwdXQgQ29udHJvbCBSZWdpc3RlcgorCisgICAgezB4MDA2MiwweDAwfSwgICAvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDYzLDB4MDB9LCAgIC8vIENSVC9UViBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAwNjQsMHgwMH0sICAgLy8gQ1JUL1RWIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisKKyAgICB7MHgwMDY4LDB4MDB9LCAgIC8vIENSVC9UViBQaXhlbCBQYW5uaW5nIFJlZ2lzdGVyCisgICAgezB4MDA2QSwweDAwfSwgICAvLyBDUlQvVFYgRGlzcGxheSBGSUZPIEhpZ2ggVGhyZXNob2xkIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDZCLDB4MDB9LCAgIC8vIENSVC9UViBEaXNwbGF5IEZJRk8gTG93IFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA3MCwweDAwfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA3MSwweDAxfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCisgICAgezB4MDA3MiwweDAwfSwgICAvLyBMQ0QgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMAorICAgIHsweDAwNzMsMHgwMH0sICAgLy8gTENEIEN1cnNvciBYIFBvc2l0aW9uIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDc0LDB4MDB9LCAgIC8vIExDRCBDdXJzb3IgWSBQb3NpdGlvbiBSZWdpc3RlciAwCisgICAgezB4MDA3NSwweDAwfSwgICAvLyBMQ0QgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMQorICAgIHsweDAwNzYsMHgwMH0sICAgLy8gTENEIEluay9DdXJzb3IgQmx1ZSBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA3NywweDAwfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBHcmVlbiBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA3OCwweDAwfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBSZWQgQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwN0EsMHgxRn0sICAgLy8gTENEIEluay9DdXJzb3IgQmx1ZSBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA3QiwweDNGfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBHcmVlbiBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA3QywweDFGfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBSZWQgQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwN0UsMHgwMH0sICAgLy8gTENEIEluay9DdXJzb3IgRklGTyBUaHJlc2hvbGQgUmVnaXN0ZXIKKyAgICB7MHgwMDgwLDB4MDB9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDgxLDB4MDF9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIKKyAgICB7MHgwMDgyLDB4MDB9LCAgIC8vIENSVC9UViBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAwCisgICAgezB4MDA4MywweDAwfSwgICAvLyBDUlQvVFYgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMQorICAgIHsweDAwODQsMHgwMH0sICAgLy8gQ1JUL1RWIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDg1LDB4MDB9LCAgIC8vIENSVC9UViBDdXJzb3IgWSBQb3NpdGlvbiBSZWdpc3RlciAxCisgICAgezB4MDA4NiwweDAwfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBCbHVlIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDg3LDB4MDB9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDg4LDB4MDB9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIFJlZCBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA4QSwweDFGfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBCbHVlIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDhCLDB4M0Z9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDhDLDB4MUZ9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIFJlZCBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA4RSwweDAwfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBGSUZPIFRocmVzaG9sZCBSZWdpc3RlcgorICAgIHsweDAxMDAsMHgwMH0sICAgLy8gQml0Qmx0IENvbnRyb2wgUmVnaXN0ZXIgMAorICAgIHsweDAxMDEsMHgwMH0sICAgLy8gQml0Qmx0IENvbnRyb2wgUmVnaXN0ZXIgMQorICAgIHsweDAxMDIsMHgwMH0sICAgLy8gQml0Qmx0IFJPUCBDb2RlL0NvbG9yIEV4cGFuc2lvbiBSZWdpc3RlcgorICAgIHsweDAxMDMsMHgwMH0sICAgLy8gQml0Qmx0IE9wZXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAxMDQsMHgwMH0sICAgLy8gQml0Qmx0IFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTA1LDB4MDB9LCAgIC8vIEJpdEJsdCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDEwNiwweDAwfSwgICAvLyBCaXRCbHQgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorICAgIHsweDAxMDgsMHgwMH0sICAgLy8gQml0Qmx0IERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAxMDksMHgwMH0sICAgLy8gQml0Qmx0IERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAxMEEsMHgwMH0sICAgLy8gQml0Qmx0IERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorICAgIHsweDAxMEMsMHgwMH0sICAgLy8gQml0Qmx0IE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAwCisgICAgezB4MDEwRCwweDAwfSwgICAvLyBCaXRCbHQgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKyAgICB7MHgwMTEwLDB4MDB9LCAgIC8vIEJpdEJsdCBXaWR0aCBSZWdpc3RlciAwCisgICAgezB4MDExMSwweDAwfSwgICAvLyBCaXRCbHQgV2lkdGggUmVnaXN0ZXIgMQorICAgIHsweDAxMTIsMHgwMH0sICAgLy8gQml0Qmx0IEhlaWdodCBSZWdpc3RlciAwCisgICAgezB4MDExMywweDAwfSwgICAvLyBCaXRCbHQgSGVpZ2h0IFJlZ2lzdGVyIDEKKyAgICB7MHgwMTE0LDB4MDB9LCAgIC8vIEJpdEJsdCBCYWNrZ3JvdW5kIENvbG9yIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTE1LDB4MDB9LCAgIC8vIEJpdEJsdCBCYWNrZ3JvdW5kIENvbG9yIFJlZ2lzdGVyIDEKKyAgICB7MHgwMTE4LDB4MDB9LCAgIC8vIEJpdEJsdCBGb3JlZ3JvdW5kIENvbG9yIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTE5LDB4MDB9LCAgIC8vIEJpdEJsdCBGb3JlZ3JvdW5kIENvbG9yIFJlZ2lzdGVyIDEKKyAgICB7MHgwMUUwLDB4MDB9LCAgIC8vIExvb2stVXAgVGFibGUgTW9kZSBSZWdpc3RlcgorICAgIHsweDAxRTIsMHgwMH0sICAgLy8gTG9vay1VcCBUYWJsZSBBZGRyZXNzIFJlZ2lzdGVyCisgICAgezB4MDFGMCwweDEwfSwgICAvLyBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMUYxLDB4MDB9LCAgIC8vIFBvd2VyIFNhdmUgU3RhdHVzIFJlZ2lzdGVyCisgICAgezB4MDFGNCwweDAwfSwgICAvLyBDUFUtdG8tTWVtb3J5IEFjY2VzcyBXYXRjaGRvZyBUaW1lciBSZWdpc3RlcgorI2lmIChTV0lWRUxfVklFVyA9PSAwKQorICAgIHsweDAxRkMsMHgwMX0sICAgLy8gRGlzcGxheSBNb2RlIFJlZ2lzdGVyKDB4MDE6TENELCAweDAyOkNSVCwgMHgwMzpMQ0QmQ1JUKQorI2VsaWYgKFNXSVZFTF9WSUVXID09IDEpCisgICAgezB4MDFGQywweDQxfSwgICAvLyBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIoMHgwMTpMQ0QsIDB4MDI6Q1JULCAweDAzOkxDRCZDUlQpCisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIFNXSVZFTF9WSUVXIG1vZGUKKyNlbmRpZiAgLyogU1dJVkVMX1ZJRVcgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfT1BTUFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJMykKKyAgICB7MHgwMDA4LDB4MDd9LCAgIC8vIExDRCBwYW5lbCBWZGQgJiBWZyBvbgorI2VuZGlmCisKKyAgICB7MHgwMDQwLDB4MDV9LCAgIC8vIExDRCBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIgKDI6NGJwcCwzOjhicHAsNToxNmJwcCkKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJKQorICAgIHsweDAwNDYsMHg4MH0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAwCisgICAgezB4MDA0NywweDAyfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfT1BTUFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJMykKKyAgICB7MHgwMDQ2LDB4ZjB9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAorICAgIHsweDAwNDcsMHgwMH0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAxCisjZW5kaWYKKyAgICB7MHgwMDYwLDB4MDV9LCAgIC8vIENSVC9UViBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIgKDI6NGJwcCwzOjhicHAsNToxNmJwcCkKKyAgICB7MHgwMDY2LDB4ODB9LCAgIC8vIENSVC9UViBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAkvLyB0YWtlbworICAgIHsweDAwNjcsMHgwMn0sICAgLy8gQ1JUL1RWIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAxCit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9wY2kuaCBiL2luY2x1ZGUvYXNtLW02OGsvcGNpLmgKaW5kZXggOWU3ZDc5YS4uOWQyYzA3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oCkBAIC00Myw3ICs0Myw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLW02OGsvc2VyaWFsLmgKaW5kZXggOWY1YmNkYy4uM2ZlMjlmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NlcmlhbC5oCkBAIC0yNiw1NCArMjYsOSBAQAogI2RlZmluZSBTVERfQ09NNF9GTEFHUyBBU1lOQ19CT09UX0FVVE9DT05GCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBGT1VSUE9SVF9GTEFHUyBBU1lOQ19GT1VSUE9SVAotI2RlZmluZSBBQ0NFTlRfRkxBR1MgMAotI2RlZmluZSBCT0NBX0ZMQUdTIDAKLSNlbmRpZgotCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMwICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRjgsIDMsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzEgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDNFOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMiAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkU4LCAzLCBTVERfQ09NNF9GTEFHUyB9LAkvKiB0dHlTMyAqLwotCi0KLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUEwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmggYi9pbmNsdWRlL2FzbS1taXBzL3BjaS5oCmluZGV4IGM5YzU3NmIuLmQ3MGRjMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wY2kuaApAQCAtNjksNyArNjksNyBAQAogCiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtMTMwLDYgKzEzMCwxNiBAQAogZXh0ZXJuIHZvaWQgcGNpX2RhY19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAlkbWE2NF9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBsZW4sIGludCBkaXJlY3Rpb24pOwogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCmluZGV4IDhhNzBmZjUuLjRlZWQ4ZTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmgKQEAgLTI5LDMyICsyOSw2IEBACiAjZGVmaW5lIFNURF9DT000X0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEZPVVJQT1JUX0ZMQUdTIEFTWU5DX0ZPVVJQT1JUCi0jZGVmaW5lIEFDQ0VOVF9GTEFHUyAwCi0jZGVmaW5lIEJPQ0FfRkxBR1MgMAotI2RlZmluZSBIVUI2X0ZMQUdTIDAKLSNkZWZpbmUgUlNfVEFCTEVfU0laRQk2NAotI2Vsc2UKLSNkZWZpbmUgUlNfVEFCTEVfU0laRQotI2VuZGlmCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgYWNjZXNzIG1ldGhvZHMgZm9yIHRoZSBIVUI2IGNhcmQuIEFsbAotICogYWNjZXNzIGlzIHRocm91Z2ggdHdvIHBvcnRzIGZvciBhbGwgMjQgcG9zc2libGUgY2hpcHMuIFRoZSBjYXJkIGlzCi0gKiBzZWxlY3RlZCB0aHJvdWdoIHRoZSBoaWdoIDIgYml0cywgdGhlIHBvcnQgb24gdGhhdCBjYXJkIHdpdGggdGhlCi0gKiAibWlkZGxlIiAzIGJpdHMsIGFuZCB0aGUgcmVnaXN0ZXIgb24gdGhhdCBwb3J0IHdpdGggdGhlIGJvdHRvbQotICogMyBiaXRzLgotICoKLSAqIFdoaWxlIHRoZSBhY2Nlc3MgcG9ydCBhbmQgaW50ZXJydXB0IGlzIGNvbmZpZ3VyYWJsZSwgdGhlIGRlZmF1bHQKLSAqIHBvcnQgbG9jYXRpb25zIGFyZSAweDMwMiBmb3IgdGhlIHBvcnQgY29udHJvbCByZWdpc3RlciwgYW5kIDB4MzAzCi0gKiBmb3IgdGhlIGRhdGEgcmVhZC93cml0ZSByZWdpc3Rlci4gTm9ybWFsbHksIHRoZSBpbnRlcnJ1cHQgaXMgYXQgaXJxMwotICogYnV0IGNhbiBiZSBhbnl0aGluZyBmcm9tIDMgdG8gNyBpbmNsdXNpdmUuIE5vdGUgdGhhdCB1c2luZyAzIHdpbGwKLSAqIHJlcXVpcmUgZGlzYWJsaW5nIGNvbTIuCi0gKi8KLQotI2RlZmluZSBDX1AoY2FyZCxwb3J0KSAoKChjYXJkKTw8NnwocG9ydCk8PDMpICsgMSkKLQogI2lmZGVmIENPTkZJR19NQUNIX0pBWloKICNpbmNsdWRlIDxhc20vamF6ei5oPgogCkBAIC0yNDAsNjYgKzIxNCwxMCBAQAogCXsgMCwgQkFTRV9CQVVELCAweDNFOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMiAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkU4LCAzLCBTVERfQ09NNF9GTEFHUyB9LAkvKiB0dHlTMyAqLwogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDFBMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwgCS8qIHR0eVM0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTgsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQjAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQjgsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQTAsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQTgsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQjAsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVMxMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkI4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzMCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzM4LCA0LCBBQ0NFTlRfRkxBR1MgfSwJLyogdHR5UzEzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgwMDAsIDAsIDAgfSwJCQkvKiB0dHlTMTQgKHNwYXJlKSAqLyBcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCQkJLyogdHR5UzE1IChzcGFyZSkgKi8gXAotCXsgMCwgQkFTRV9CQVVELCAweDEwMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTEwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTI4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTU4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTcwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMxICovCi0jZWxzZSAvKiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMgKi8KLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKLSNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMgKi8KLQogI2Vsc2UgLyogQ09ORklHX0hBVkVfU1REX1BDX1NFUklBTF9QT1JUUyAqLwogI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKICNlbmRpZiAvKiBDT05GSUdfSEFWRV9TVERfUENfU0VSSUFMX1BPUlRTICovCiAKLS8qIFlvdSBjYW4gaGF2ZSB1cCB0byBmb3VyIEhVQjYncyBpbiB0aGUgc3lzdGVtLCBidXQgSSd2ZSBvbmx5Ci0gKiBpbmNsdWRlZCB0d28gY2FyZHMgaGVyZSBmb3IgYSB0b3RhbCBvZiB0d2VsdmUgcG9ydHMuCi0gKi8KLSNpZiAoZGVmaW5lZChDT05GSUdfSFVCNikgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01BTllfUE9SVFMpKQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDApIH0sICAvKiB0dHlTMzIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMSkgfSwgIC8qIHR0eVMzMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwyKSB9LCAgLyogdHR5UzM0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDMpIH0sICAvKiB0dHlTMzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsNCkgfSwgIC8qIHR0eVMzNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw1KSB9LCAgLyogdHR5UzM3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDApIH0sICAvKiB0dHlTMzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMSkgfSwgIC8qIHR0eVMzOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwyKSB9LCAgLyogdHR5UzQwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDMpIH0sICAvKiB0dHlTNDEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsNCkgfSwgIC8qIHR0eVM0MiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw1KSB9LCAgLyogdHR5UzQzICovCi0jZWxzZQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX01PTUVOQ09fSkFHVUFSX0FUWAogLyogT3JkaW5hcnkgTlMxNjU1MiBkdWFydCB3aXRoIGEgMjBNSHogY3J5c3RhbC4gICovCiAjZGVmaW5lIEpBR1VBUl9BVFhfVUFSVF9DTEsJMjAwMDAwMDAKQEAgLTQyNyw4ICszNDUsNiBAQAogCUNPQkFMVF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKIAlEREI1NDc3X1NFUklBTF9QT1JUX0RFRk5TCQkJXAogCUVWOTYxMDBfU0VSSUFMX1BPUlRfREVGTlMJCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCQkJXAotCUhVQjZfU0VSSUFMX1BPUlRfREZOUwkJCQlcCiAJSVAzMl9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCUlURV9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgCQlcCiAJSVZSX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaAppbmRleCAwNzYzYzI5Li5lZTc0MWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCkBAIC0yMzAsNiArMjMwLDI1IEBACiAvKiBleHBvcnQgdGhlIHBjaV8gRE1BIEFQSSBpbiB0ZXJtcyBvZiB0aGUgZG1hXyBvbmUgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wY2ktZG1hLWNvbXBhdC5oPgogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZWxpbmVfc2l6ZTsKKwl1OCBieXRlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCWlmIChieXRlID09IDApCisJCWNhY2hlbGluZV9zaXplID0gMTAyNDsKKwllbHNlCisJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX01VTFRJUExFOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZAogcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCiAJCQkgc3RydWN0IHJlc291cmNlICpyZXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NlcmlhbC5oCmluZGV4IDIzOWM1ZGMuLjgyZmQ4MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc2VyaWFsLmgKQEAgLTE5LDE4ICsxOSw0IEBACiAgKiBBNTAwIHcvIFBDSSBzZXJpYWwgY2FyZHM6IDUgKyA0ICogY2FyZCB+PSAxNwogICovCiAgCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIH0sCQkvKiB0dHlTMCAqLwlcCi0JeyAwLCB9LAkJLyogdHR5UzEgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVMyICovCVwKLQl7IDAsIH0sCQkvKiB0dHlTMyAqLwlcCi0JeyAwLCB9LAkJLyogdHR5UzQgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVM1ICovCVwKLQl7IDAsIH0sCQkvKiB0dHlTNiAqLwlcCi0JeyAwLCB9LAkJLyogdHR5UzcgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVM4ICovCi0KLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCi0KKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2tleGVjLmggYi9pbmNsdWRlL2FzbS1wcGMva2V4ZWMuaAppbmRleCA3MzE5MTMxLi42ZDJhYTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMva2V4ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMva2V4ZWMuaApAQCAtMjcsNiArMjcsOCBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCitleHRlcm4gdm9pZCAqY3Jhc2hfbm90ZXM7CisKIHN0cnVjdCBraW1hZ2U7CiAKIGV4dGVybiB2b2lkIG1hY2hpbmVfa2V4ZWNfc2ltcGxlKHN0cnVjdCBraW1hZ2UgKmltYWdlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tYWNpby5oIGIvaW5jbHVkZS9hc20tcHBjL21hY2lvLmgKaW5kZXggMmNhZmM5OS4uYTQ4MWI3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21hY2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21hY2lvLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fTUFDSU9fQVNJQ19IX18KICNkZWZpbmUgX19NQUNJT19BU0lDX0hfXwogCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIG1hY2lvX2J1c190eXBlOwpAQCAtMTIwLDEwICsxMjEsMTAgQEAKIHN0cnVjdCBtYWNpb19kcml2ZXIKIHsKIAljaGFyCQkJKm5hbWU7Ci0Jc3RydWN0IG9mX21hdGNoCQkqbWF0Y2hfdGFibGU7CisJc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2hfdGFibGU7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwogCi0JaW50CSgqcHJvYmUpKHN0cnVjdCBtYWNpb19kZXYqIGRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCk7CisJaW50CSgqcHJvYmUpKHN0cnVjdCBtYWNpb19kZXYqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpOwogCWludAkoKnJlbW92ZSkoc3RydWN0IG1hY2lvX2RldiogZGV2KTsKIAogCWludAkoKnN1c3BlbmQpKHN0cnVjdCBtYWNpb19kZXYqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tcHBjL21tdV9jb250ZXh0LmgKaW5kZXggY2NhYmJjZS4uYWZlMjZmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21tdV9jb250ZXh0LmgKQEAgLTE0OSw2ICsxNDksNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXByZWVtcHRfZGlzYWJsZSgpOwogCWlmIChtbS0+Y29udGV4dCAhPSBOT19DT05URVhUKSB7CiAJCWNsZWFyX2JpdChtbS0+Y29udGV4dCwgY29udGV4dF9tYXApOwogCQltbS0+Y29udGV4dCA9IE5PX0NPTlRFWFQ7CkBAIC0xNTYsNiArMTU3LDcgQEAKIAkJYXRvbWljX2luYygmbnJfZnJlZV9jb250ZXh0cyk7CiAjZW5kaWYKIAl9CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21wYzh4eC5oIGIvaW5jbHVkZS9hc20tcHBjL21wYzh4eC5oCmluZGV4IDcxNGQ2OWMuLjdjMzFmMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4eHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmgKQEAgLTY4LDYgKzY4LDEwIEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zL2xhbnRlYy5oPgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4ODVBRFMpCisjaW5jbHVkZSA8cGxhdGZvcm1zL21wYzg4NWFkcy5oPgorI2VuZGlmCisKIC8qIEN1cnJlbnRseSwgYWxsIDh4eCBib2FyZHMgdGhhdCBzdXBwb3J0IGEgcHJvY2Vzc29yIHRvIFBDSS9JU0EgYnJpZGdlCiAgKiB1c2UgdGhlIHNhbWUgbWVtb3J5IG1hcC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL29mX2RldmljZS5oIGIvaW5jbHVkZS9hc20tcHBjL29mX2RldmljZS5oCmluZGV4IDcyMjk3MzUuLjRiMjY0Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9vZl9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvb2ZfZGV2aWNlLmgKQEAgLTI0LDIwICsyNCw4IEBACiB9OwogI2RlZmluZQl0b19vZl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBvZl9kZXZpY2UsIGRldikKIAotLyoKLSAqIFN0cnVjdCB1c2VkIGZvciBtYXRjaGluZyBhIGRldmljZQotICovCi1zdHJ1Y3Qgb2ZfbWF0Y2gKLXsKLQljaGFyCSpuYW1lOwotCWNoYXIJKnR5cGU7Ci0JY2hhcgkqY29tcGF0aWJsZTsKLQl2b2lkCSpkYXRhOwotfTsKLSNkZWZpbmUgT0ZfQU5ZX01BVENICQkoKGNoYXIgKiktMUwpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm9mX21hdGNoX2RldmljZSgKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoZXMsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CitleHRlcm4gY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZfZ2V0KHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBvZl9kZXZfcHV0KHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CkBAIC00OSwxMCArMzcsMTAgQEAKIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIKIHsKIAljaGFyCQkJKm5hbWU7Ci0Jc3RydWN0IG9mX21hdGNoCQkqbWF0Y2hfdGFibGU7CisJc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2hfdGFibGU7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwogCi0JaW50CSgqcHJvYmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCk7CisJaW50CSgqcHJvYmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpOwogCWludAkoKnJlbW92ZSkoc3RydWN0IG9mX2RldmljZSogZGV2KTsKIAogCWludAkoKnN1c3BlbmQpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9vcGVuX3BpYy5oIGIvaW5jbHVkZS9hc20tcHBjL29wZW5fcGljLmgKaW5kZXggZGJlODUzMy4uNzg0OGFhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL29wZW5fcGljLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL29wZW5fcGljLmgKQEAgLTI1LDYgKzI1LDExIEBACiAjZGVmaW5lIE9QRU5QSUNfVkVDX0lQSQkJMTE4CS8qIGFuZCB1cCAqLwogI2RlZmluZSBPUEVOUElDX1ZFQ19TUFVSSU9VUwkyNTUKIAorLyogUHJpb3JpdGllcyAqLworI2RlZmluZSBPUEVOUElDX1BSSU9SSVRZX0lQSV9CQVNFCTEwCisjZGVmaW5lIE9QRU5QSUNfUFJJT1JJVFlfREVGQVVMVAk0CisjZGVmaW5lIE9QRU5QSUNfUFJJT1JJVFlfTk1JCQk5CisKIC8qIE9wZW5QSUMgSVJRIGNvbnRyb2xsZXIgc3RydWN0dXJlICovCiBleHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG9wZW5fcGljOwogCkBAIC00Miw2ICs0Nyw3IEBACiBleHRlcm4gdm9pZCBvcGVucGljX3NldF9zb3VyY2VzKGludCBmaXJzdF9pcnEsIGludCBudW1faXJxcywgdm9pZCBfX2lvbWVtICppc3IpOwogZXh0ZXJuIHZvaWQgb3BlbnBpY19pbml0KGludCBsaW51eF9pcnFfb2Zmc2V0KTsKIGV4dGVybiB2b2lkIG9wZW5waWNfaW5pdF9ubWlfaXJxKHVfaW50IGlycSk7CitleHRlcm4gdm9pZCBvcGVucGljX3NldF9pcnFfcHJpb3JpdHkodV9pbnQgaXJxLCB1X2ludCBwcmkpOwogZXh0ZXJuIHZvaWQgb3BlbnBpY19ob29rdXBfY2FzY2FkZSh1X2ludCBpcnEsIGNoYXIgKm5hbWUsCiAJCQkJICAgaW50ICgqY2FzY2FkZV9mbikoc3RydWN0IHB0X3JlZ3MgKikpOwogZXh0ZXJuIHVfaW50IG9wZW5waWNfaXJxKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BjX3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tcHBjL3BjX3NlcmlhbC5oCmluZGV4IGZhOWNiYjYuLjhmOTk0ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wY19zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGNfc2VyaWFsLmgKQEAgLTM1LDkzICszNSw5IEBACiAjZGVmaW5lIFNURF9DT000X0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEZPVVJQT1JUX0ZMQUdTIEFTWU5DX0ZPVVJQT1JUCi0jZGVmaW5lIEFDQ0VOVF9GTEFHUyAwCi0jZGVmaW5lIEJPQ0FfRkxBR1MgMAotI2RlZmluZSBIVUI2X0ZMQUdTIDAKLSNlbmRpZgotCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBhY2Nlc3MgbWV0aG9kcyBmb3IgdGhlIEhVQjYgY2FyZC4gQWxsCi0gKiBhY2Nlc3MgaXMgdGhyb3VnaCB0d28gcG9ydHMgZm9yIGFsbCAyNCBwb3NzaWJsZSBjaGlwcy4gVGhlIGNhcmQgaXMKLSAqIHNlbGVjdGVkIHRocm91Z2ggdGhlIGhpZ2ggMiBiaXRzLCB0aGUgcG9ydCBvbiB0aGF0IGNhcmQgd2l0aCB0aGUKLSAqICJtaWRkbGUiIDMgYml0cywgYW5kIHRoZSByZWdpc3RlciBvbiB0aGF0IHBvcnQgd2l0aCB0aGUgYm90dG9tCi0gKiAzIGJpdHMuCi0gKgotICogV2hpbGUgdGhlIGFjY2VzcyBwb3J0IGFuZCBpbnRlcnJ1cHQgaXMgY29uZmlndXJhYmxlLCB0aGUgZGVmYXVsdAotICogcG9ydCBsb2NhdGlvbnMgYXJlIDB4MzAyIGZvciB0aGUgcG9ydCBjb250cm9sIHJlZ2lzdGVyLCBhbmQgMHgzMDMKLSAqIGZvciB0aGUgZGF0YSByZWFkL3dyaXRlIHJlZ2lzdGVyLiBOb3JtYWxseSwgdGhlIGludGVycnVwdCBpcyBhdCBpcnEzCi0gKiBidXQgY2FuIGJlIGFueXRoaW5nIGZyb20gMyB0byA3IGluY2x1c2l2ZS4gTm90ZSB0aGF0IHVzaW5nIDMgd2lsbAotICogcmVxdWlyZSBkaXNhYmxpbmcgY29tMi4KLSAqLwotCi0jZGVmaW5lIENfUChjYXJkLHBvcnQpICgoKGNhcmQpPDw2fChwb3J0KTw8MykgKyAxKQotCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMwICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRjgsIDMsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzEgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDNFOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMiAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkU4LCAzLCBTVERfQ09NNF9GTEFHUyB9LAkvKiB0dHlTMyAqLwotCi0KLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUEwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LCAJLyogdHR5UzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFBOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzEwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQjgsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVMxMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzMwLCA0LCBBQ0NFTlRfRkxBR1MgfSwJLyogdHR5UzEyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzgsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTQgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTUgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDEwMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTEwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTI4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTU4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTcwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMxICovCi0jZWxzZQotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwotI2VuZGlmCi0KLS8qIFlvdSBjYW4gaGF2ZSB1cCB0byBmb3VyIEhVQjYncyBpbiB0aGUgc3lzdGVtLCBidXQgSSd2ZSBvbmx5Ci0gKiBpbmNsdWRlZCB0d28gY2FyZHMgaGVyZSBmb3IgYSB0b3RhbCBvZiB0d2VsdmUgcG9ydHMuCi0gKi8KLSNpZiAoZGVmaW5lZChDT05GSUdfSFVCNikgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01BTllfUE9SVFMpKQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDApIH0sICAvKiB0dHlTMzIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMSkgfSwgIC8qIHR0eVMzMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwyKSB9LCAgLyogdHR5UzM0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDMpIH0sICAvKiB0dHlTMzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsNCkgfSwgIC8qIHR0eVMzNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw1KSB9LCAgLyogdHR5UzM3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDApIH0sICAvKiB0dHlTMzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMSkgfSwgIC8qIHR0eVMzOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwyKSB9LCAgLyogdHR5UzQwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDMpIH0sICAvKiB0dHlTNDEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsNCkgfSwgIC8qIHR0eVM0MiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw1KSB9LCAgLyogdHR5UzQzICovCi0jZWxzZQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMKLSNlbmRpZgotCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCVwKLQlTVERfU0VSSUFMX1BPUlRfREVGTlMJCVwKLQlFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJXAotCUhVQjZfU0VSSUFMX1BPUlRfREZOUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BjaS5oIGIvaW5jbHVkZS9hc20tcHBjL3BjaS5oCmluZGV4IGNlNWFlNmQuLmExM2Q1NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CkBAIC02OSw2ICs2OSwxNiBAQAogI2RlZmluZSBwY2lfdW5tYXBfbGVuKFBUUiwgTEVOX05BTUUpCQkoMCkKICNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQlkbyB7IH0gd2hpbGUgKDApCiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKIC8qCiAgKiBBdCBwcmVzZW50IHRoZXJlIGFyZSB2ZXJ5IGZldyAzMi1iaXQgUFBDIG1hY2hpbmVzIHRoYXQgY2FuIGhhdmUKICAqIG1lbW9yeSBhYm92ZSB0aGUgNEdCIHBvaW50LCBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0LgpAQCAtMTAzLDYgKzExMywxMiBAQAogCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkgcGdwcm90X3QgcHJvdCk7CiAKKyNkZWZpbmUgSEFWRV9BUkNIX1BDSV9SRVNPVVJDRV9UT19VU0VSCitleHRlcm4gdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAorCQkJCSBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCisJCQkJIHU2NCAqc3RhcnQsIHU2NCAqZW5kKTsKKworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19QUENfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXBwYy91bmlzdGQuaAppbmRleCBjYzUxZTVjLi5hNzg5NGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3VuaXN0ZC5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICNkZWZpbmUgX19OUl9ydGFzCQkyNTUKICNkZWZpbmUgX19OUl9zeXNfZGVidWdfc2V0Y29udGV4dCAyNTYKIC8qIE51bWJlciAyNTcgaXMgcmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLS8qIE51bWJlciAyNTggaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfcmVtYXBfZmlsZV9wYWdlcyAqLworLyogMjU4IGN1cnJlbnRseSB1bnVzZWQgKi8KIC8qIE51bWJlciAyNTkgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfbWJpbmQgKi8KIC8qIE51bWJlciAyNjAgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfZ2V0X21lbXBvbGljeSAqLwogLyogTnVtYmVyIDI2MSBpcyByZXNlcnZlZCBmb3IgbmV3IHN5c19zZXRfbWVtcG9saWN5ICovCkBAIC0yNzcsOCArMjc3LDEwIEBACiAjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjcwCiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyNzEKICNkZWZpbmUgX19OUl93YWl0aWQJCTI3MgorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI3MworI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI3NAogCi0jZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTI3MworI2RlZmluZSBfX05SX3N5c2NhbGxzCQkyNzUKIAogI2RlZmluZSBfX05SKG4pCSNuCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20tcHBjNjQvYnl0ZW9yZGVyLmgKaW5kZXggODAzMjc1My4uOGI1N2RhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvYnl0ZW9yZGVyLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvYnl0ZW9yZGVyLmgKQEAgLTQwLDcgKzQwLDYgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0d2JyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7CiB9CiAKLSNpZiAwCiBzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX2FyY2hfX3N3YWIxNihfX3UxNiB2YWx1ZSkKIHsKIAlfX3UxNiByZXN1bHQ7CkBAIC02MywxNyArNjIsOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19fYXJjaF9fc3dhYjY0KF9fdTY0IHZhbHVlKQotewotCV9fdTY0IHJlc3VsdDsKLSNlcnJvciBpbXBsZW1lbnQgbWUKLX0KLQogI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKICNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX2FyY2hfX3N3YWI2NCh4KQotCi0jZW5kaWYKIAogLyogVGhlIHNhbWUsIGJ1dCByZXR1cm5zIGNvbnZlcnRlZCB2YWx1ZSBmcm9tIHRoZSBsb2NhdGlvbiBwb2ludGVyIGJ5IGFkZHIuICovCiAjZGVmaW5lIF9fYXJjaF9fc3dhYjE2cChhZGRyKSBsZF9sZTE2KGFkZHIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvY3B1dGFibGUuaAppbmRleCBjYmJmYmVjLi5kNjdmYTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2NwdXRhYmxlLmgKQEAgLTEzOCw2ICsxMzgsNyBAQAogI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSAgCUFTTV9DT05TVCgweDAwMDAwMjAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTE9DS0xFU1NfVExCSUUJCUFTTV9DT05TVCgweDAwMDAwNDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTU1DUkFfU0lIVgkJQVNNX0NPTlNUKDB4MDAwMDA4MDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9DVFJMCQkJQVNNX0NPTlNUKDB4MDAwMDEwMDAwMDAwMDAwMCkKIAogLyogUGxhdGZvcm0gZmlybXdhcmUgZmVhdHVyZXMgKi8KICNkZWZpbmUgRldfRlRSXwkJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAKICNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgKENQVV9GVFJfU0xCIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX0ZUUl9UTEJJRUwgfCBDUFVfRlRSX05PRVhFQ1VURSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04gfCBDUFVfRlRSX0NUUkwpCiAKIC8qIGlTZXJpZXMgZG9lc24ndCBzdXBwb3J0IGxhcmdlIHBhZ2VzICovCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9odmNvbnNvbGUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCmluZGV4IGQ4OWQ5NGMuLjZkYTkzY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCkBAIC0yOSwxMiArMjksMjEgQEAKICAqLwogI2RlZmluZSBNQVhfTlJfSFZDX0NPTlNPTEVTCTE2CiAKKy8qIGltcGxlbWVudGVkIGJ5IGEgbG93IGxldmVsIGRyaXZlciAqLworc3RydWN0IGh2X29wcyB7CisJaW50ICgqZ2V0X2NoYXJzKSh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CisJaW50ICgqcHV0X2NoYXJzKSh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCk7Cit9OwogZXh0ZXJuIGludCBodmNfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIGV4dGVybiBpbnQgaHZjX3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCk7CiAKLS8qIEVhcmx5IGRpc2NvdmVyeSBvZiBjb25zb2xlIGFkYXB0ZXJzLiAqLwotZXh0ZXJuIGludCBodmNfZmluZF92dHlzKHZvaWQpOworc3RydWN0IGh2Y19zdHJ1Y3Q7CiAKLS8qIEltcGxlbWVudGVkIGJ5IGEgY29uc29sZSBkcml2ZXIgKi8KLWV4dGVybiBpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCk7CisvKiBSZWdpc3RlciBhIHZ0ZXJtIGFuZCBhIHNsb3QgaW5kZXggZm9yIHVzZSBhcyBhIGNvbnNvbGUgKGNvbnNvbGVfaW5pdCkgKi8KK2V4dGVybiBpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCwgc3RydWN0IGh2X29wcyAqb3BzKTsKKy8qIHJlZ2lzdGVyIGEgdnRlcm0gZm9yIGh2YyB0dHkgb3BlcmF0aW9uIChtb2R1bGVfaW5pdCBvciBob3RwbHVnIGFkZCkgKi8KK2V4dGVybiBzdHJ1Y3QgaHZjX3N0cnVjdCAqIF9fZGV2aW5pdCBodmNfYWxsb2ModWludDMyX3QgdnRlcm1ubywgaW50IGlycSwKKwkJCQkJCSBzdHJ1Y3QgaHZfb3BzICpvcHMpOworLyogcmVtb3ZlIGEgdnRlcm0gZnJvbSBodmMgdHR5IG9wZXJhdGlvbiAobW9kZWxlX2V4aXQgb3IgaG90cGx1ZyByZW1vdmUpICovCitleHRlcm4gaW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCBodmNfc3RydWN0ICpocCk7CiAjZW5kaWYgLyogX1BQQzY0X0hWQ09OU09MRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0h2Q2FsbEhwdC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9IdkNhbGxIcHQuaAppbmRleCA2NmYzODIyLi40M2ExOTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0h2Q2FsbEhwdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2lTZXJpZXMvSHZDYWxsSHB0LmgKQEAgLTc3LDI3ICs3NywyNiBAQAogCXJldHVybiBjb21wcmVzc2VkU3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKEhQVEUgKmhwdGUsIHU2NCB2cG4pCitzdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTY0IHZwbikKIHsKIAlyZXR1cm4gSHZDYWxsM1JldDE2KEh2Q2FsbEhwdEZpbmRWYWxpZCwgaHB0ZSwgdnBuLCAwLCAwKTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgSHZDYWxsSHB0X2ZpbmROZXh0VmFsaWQoSFBURSAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKIAkJdTggYml0c29uLCB1OCBiaXRzb2ZmKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZE5leHRWYWxpZCwgaHB0ZSwgaHB0ZUluZGV4LAogCQkJYml0c29uLCBiaXRzb2ZmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoSFBURSAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKIHsKIAlIdkNhbGwyUmV0MTYoSHZDYWxsSHB0R2V0LCBocHRlLCBocHRlSW5kZXgsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LCBIUFRFICpocHRlKQorc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9hZGRWYWxpZGF0ZSh1MzIgaHB0ZUluZGV4LCB1MzIgaEJpdCwgaHB0ZV90ICpocHRlKQogewotCUh2Q2FsbDQoSHZDYWxsSHB0QWRkVmFsaWRhdGUsIGhwdGVJbmRleCwgaEJpdCwgKCooKHU2NCAqKWhwdGUpKSwKLQkJCSgqKCgodTY0ICopaHB0ZSkrMSkpKTsKKwlIdkNhbGw0KEh2Q2FsbEhwdEFkZFZhbGlkYXRlLCBocHRlSW5kZXgsIGhCaXQsIGhwdGUtPnYsIGhwdGUtPnIpOwogfQogCiAjZW5kaWYgLyogX0hWQ0FMTEhQVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0l0THBRdWV1ZS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9JdExwUXVldWUuaAppbmRleCAzOTMyOTllLi42OWIyNmFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0l0THBRdWV1ZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2lTZXJpZXMvSXRMcFF1ZXVlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgTHBFdmVudE1heFNpemUJCTI1NgogI2RlZmluZSBMcEV2ZW50QWxpZ24JCTY0CiAKLXN0cnVjdCBJdExwUXVldWUgeworc3RydWN0IGh2bHBldmVudF9xdWV1ZSB7CiAvKgogICogVGhlIHhTbGljQ3VyRXZlbnRQdHIgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgZXZlbnQgc3RhY2sgZW50cnkKICAqIHRoYXQgd2lsbCBiZWNvbWUgdmFsaWQuICBUaGUgT1MgbXVzdCBwZWVrIGF0IHRoaXMgZW50cnkgdG8gZGV0ZXJtaW5lCkBAIC02OSwxNiArNjksMTMgQEAKIAljaGFyCSp4U2xpY0V2ZW50U3RhY2tQdHI7CS8vIDB4MjAKIAl1OAl4SW5kZXg7CQkJLy8gMHgyOCB1bmlxdWUgc2VxdWVudGlhbCBpbmRleC4KIAl1OAl4U2xpY1JzdmRbM107CQkvLyAweDI5LTJiCi0JdTMyCXhJblVzZVdvcmQ7CQkvLyAweDJDCi0JdTY0CXhMcEludENvdW50OwkJLy8gMHgzMCBUb3RhbCBMcCBJbnQgbXNncyBwcm9jZXNzZWQKLQl1NjQJeExwSW50Q291bnRCeVR5cGVbOV07CS8vIDB4MzgtMHg3RiBFdmVudCBjb3VudHMgYnkgdHlwZQorCXNwaW5sb2NrX3QJbG9jazsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgSXRMcFF1ZXVlIHhJdExwUXVldWU7CitleHRlcm4gc3RydWN0IGh2bHBldmVudF9xdWV1ZSBodmxwZXZlbnRfcXVldWU7CiAKLWV4dGVybiBzdHJ1Y3QgSHZMcEV2ZW50ICpJdExwUXVldWVfZ2V0TmV4dExwRXZlbnQoc3RydWN0IEl0THBRdWV1ZSAqKTsKLWV4dGVybiBpbnQgSXRMcFF1ZXVlX2lzTHBJbnRQZW5kaW5nKHN0cnVjdCBJdExwUXVldWUgKik7Ci1leHRlcm4gdW5zaWduZWQgSXRMcFF1ZXVlX3Byb2Nlc3Moc3RydWN0IEl0THBRdWV1ZSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiB2b2lkIEl0THBRdWV1ZV9jbGVhclZhbGlkKHN0cnVjdCBIdkxwRXZlbnQgKik7CitleHRlcm4gaW50IGh2bHBldmVudF9pc19wZW5kaW5nKHZvaWQpOworZXh0ZXJuIHZvaWQgcHJvY2Vzc19odmxwZXZlbnRzKHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgc2V0dXBfaHZscGV2ZW50X3F1ZXVlKHZvaWQpOwogCiAjZW5kaWYgLyogX0lUTFBRVUVVRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmgKaW5kZXggMTliNDY4Yi4uMDgwMjkxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2twcm9iZXMuaApAQCAtNDIsMTAgKzQyLDEzIEBACiAKICNkZWZpbmUgSlBST0JFX0VOVFJZKHBlbnRyeSkJKGtwcm9iZV9vcGNvZGVfdCAqKSgoZnVuY19kZXNjcl90ICopcGVudHJ5KQogCisjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUwordm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKKwogLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvcHkgb2Ygb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gewogCS8qIGNvcHkgb2Ygb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbltNQVhfSU5TTl9TSVpFXTsKKwlrcHJvYmVfb3Bjb2RlX3QgKmluc247CiB9OwogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L21hY2hkZXAuaAppbmRleCA5Y2RhZDNlLi5mMGMxZDJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvbWFjaGRlcC5oCkBAIC01MywxMCArNTMsOCBAQAogCWxvbmcJCSgqaHB0ZV9pbnNlcnQpKHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwcnBuLAotCQkJCSAgICAgICBpbnQgc2Vjb25kYXJ5LCAKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsIAotCQkJCSAgICAgICBpbnQgYm9sdGVkLAotCQkJCSAgICAgICBpbnQgbGFyZ2UpOworCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZmbGFncywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyByZmxhZ3MpOwogCWxvbmcJCSgqaHB0ZV9yZW1vdmUpKHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCk7CiAJdm9pZAkJKCpmbHVzaF9oYXNoX3JhbmdlKSh1bnNpZ25lZCBsb25nIGNvbnRleHQsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIG51bWJlciwKQEAgLTE0MCw4ICsxMzgsMTMgQEAKIAkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJCXBncHJvdF90IHZtYV9wcm90KTsKIAorCS8qIElkbGUgbG9vcCBmb3IgdGhpcyBwbGF0Zm9ybSwgbGVhdmUgZW1wdHkgZm9yIGRlZmF1bHQgaWRsZSBsb29wICovCisJaW50CQkoKmlkbGVfbG9vcCkodm9pZCk7CiB9OwogCitleHRlcm4gaW50IGRlZmF1bHRfaWRsZSh2b2lkKTsKK2V4dGVybiBpbnQgbmF0aXZlX2lkbGUodm9pZCk7CisKIGV4dGVybiBzdHJ1Y3QgbWFjaGRlcF9jYWxscyBwcGNfbWQ7CiBleHRlcm4gY2hhciBjbWRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21tdS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKaW5kZXggZjM3M2RlNS4uM2QwN2RkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKQEAgLTYwLDYgKzYwLDIyIEBACiAKICNkZWZpbmUgSFBURVNfUEVSX0dST1VQIDgKIAorI2RlZmluZSBIUFRFX1ZfQVZQTl9TSElGVAk3CisjZGVmaW5lIEhQVEVfVl9BVlBOCQlBU01fQ09OU1QoMHhmZmZmZmZmZmZmZmZmZjgwKQorI2RlZmluZSBIUFRFX1ZfQVZQTl9WQUwoeCkJKCgoeCkgJiBIUFRFX1ZfQVZQTikgPj4gSFBURV9WX0FWUE5fU0hJRlQpCisjZGVmaW5lIEhQVEVfVl9CT0xURUQJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMTApCisjZGVmaW5lIEhQVEVfVl9MT0NLCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA4KQorI2RlZmluZSBIUFRFX1ZfTEFSR0UJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDQpCisjZGVmaW5lIEhQVEVfVl9TRUNPTkRBUlkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMikKKyNkZWZpbmUgSFBURV9WX1ZBTElECQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorCisjZGVmaW5lIEhQVEVfUl9QUDAJCUFTTV9DT05TVCgweDgwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIEhQVEVfUl9UUwkJQVNNX0NPTlNUKDB4NDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgSFBURV9SX1JQTl9TSElGVAkxMgorI2RlZmluZSBIUFRFX1JfUlBOCQlBU01fQ09OU1QoMHgzZmZmZmZmZmZmZmZmMDAwKQorI2RlZmluZSBIUFRFX1JfRkxBR1MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAzZmYpCisjZGVmaW5lIEhQVEVfUl9QUAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMykKKwogLyogVmFsdWVzIGZvciBQUCAoYXNzdW1lcyBLcz0wLCBLcD0xKSAqLwogLyogcHAwIHdpbGwgYWx3YXlzIGJlIDAgZm9yIGxpbnV4ICAgICAqLwogI2RlZmluZSBQUF9SV1hYCTAJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIG5vbmUgKi8KQEAgLTY5LDU0ICs4NSwxMyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0vKiBIYXJkd2FyZSBQYWdlIFRhYmxlIEVudHJ5ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBhdnBuOjU3OyAvKiB2c2lkIHwgYXBpID09IGF2cG4gICovCi0JdW5zaWduZWQgbG9uZyA6ICAgICAyOyAvKiBTb2Z0d2FyZSB1c2UgKi8KLQl1bnNpZ25lZCBsb25nIGJvbHRlZDogMTsgLyogSFBURSBpcyAiYm9sdGVkIiAqLwotCXVuc2lnbmVkIGxvbmcgbG9jazogMTsgLyogbG9jayBvbiBwU2VyaWVzIFNNUCAqLwotCXVuc2lnbmVkIGxvbmcgbDogICAgMTsgLyogVmlydHVhbCBwYWdlIGlzIGxhcmdlIChMPTEpIG9yIDQgS0IgKEw9MCkgKi8KLQl1bnNpZ25lZCBsb25nIGg6ICAgIDE7IC8qIEhhc2ggZnVuY3Rpb24gaWRlbnRpZmllciAqLwotCXVuc2lnbmVkIGxvbmcgdjogICAgMTsgLyogVmFsaWQgKHY9MSkgb3IgaW52YWxpZCAodj0wKSAqLwotfSBIcHRlX2R3b3JkMDsKKwl1bnNpZ25lZCBsb25nIHY7CisJdW5zaWduZWQgbG9uZyByOworfSBocHRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIHBwMDogIDE7IC8qIFBhZ2UgcHJvdGVjdGlvbiBiaXQgMCAqLwotCXVuc2lnbmVkIGxvbmcgdHM6ICAgMTsgLyogVGFnIHNldCBiaXQgKi8KLQl1bnNpZ25lZCBsb25nIHJwbjogNTA7IC8qIFJlYWwgcGFnZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBsb25nIDogICAgIDI7IC8qIFJlc2VydmVkICovCi0JdW5zaWduZWQgbG9uZyBhYzogICAxOyAvKiBBZGRyZXNzIGNvbXBhcmUgKi8gCi0JdW5zaWduZWQgbG9uZyByOiAgICAxOyAvKiBSZWZlcmVuY2VkICovCi0JdW5zaWduZWQgbG9uZyBjOiAgICAxOyAvKiBDaGFuZ2VkICovCi0JdW5zaWduZWQgbG9uZyB3OiAgICAxOyAvKiBXcml0ZS10aHJ1IGNhY2hlIG1vZGUgKi8KLQl1bnNpZ25lZCBsb25nIGk6ICAgIDE7IC8qIENhY2hlIGluaGliaXRlZCAqLwotCXVuc2lnbmVkIGxvbmcgbTogICAgMTsgLyogTWVtb3J5IGNvaGVyZW5jZSByZXF1aXJlZCAqLwotCXVuc2lnbmVkIGxvbmcgZzogICAgMTsgLyogR3VhcmRlZCAqLwotCXVuc2lnbmVkIGxvbmcgbjogICAgMTsgLyogTm8tZXhlY3V0ZSAqLwotCXVuc2lnbmVkIGxvbmcgcHA6ICAgMjsgLyogUGFnZSBwcm90ZWN0aW9uIGJpdHMgMToyICovCi19IEhwdGVfZHdvcmQxOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciBwYWRkaW5nWzZdOwkgICAJLyogcGFkZGluZyAqLwotCXVuc2lnbmVkIGxvbmcgOiAgICAgICA2OwkvKiBwYWRkaW5nICovIAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M6IDEwOwkvKiBIUFRFIGZsYWdzICovCi19IEhwdGVfZHdvcmQxX2ZsYWdzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5pb24gewotCQl1bnNpZ25lZCBsb25nIGR3b3JkMDsKLQkJSHB0ZV9kd29yZDAgICBkdzA7Ci0JfSBkdzA7Ci0KLQl1bmlvbiB7Ci0JCXVuc2lnbmVkIGxvbmcgZHdvcmQxOwotCQlIcHRlX2R3b3JkMSBkdzE7Ci0JCUhwdGVfZHdvcmQxX2ZsYWdzIGZsYWdzOwotCX0gZHcxOwotfSBIUFRFOyAKLQotZXh0ZXJuIEhQVEUgKgkJaHRhYl9hZGRyZXNzOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcJaHRhYl9oYXNoX21hc2s7CitleHRlcm4gaHB0ZV90ICpodGFiX2FkZHJlc3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwdF9oYXNoKHVuc2lnbmVkIGxvbmcgdnBuLCBpbnQgbGFyZ2UpCiB7CkBAIC0xODEsMTggKzE1NiwxOCBAQAogCWFzbSB2b2xhdGlsZSgicHRlc3luYyI6IDogOiJtZW1vcnkiKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNsb3QydmEodW5zaWduZWQgbG9uZyBhdnBuLCB1bnNpZ25lZCBsb25nIGxhcmdlLAotCQl1bnNpZ25lZCBsb25nIHNlY29uZGFyeSwgdW5zaWduZWQgbG9uZyBzbG90KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNsb3QydmEodW5zaWduZWQgbG9uZyBocHRlX3YsIHVuc2lnbmVkIGxvbmcgc2xvdCkKIHsKKwl1bnNpZ25lZCBsb25nIGF2cG4gPSBIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KTsKIAl1bnNpZ25lZCBsb25nIHZhOwogCiAJdmEgPSBhdnBuIDw8IDIzOwogCi0JaWYgKCFsYXJnZSkgeworCWlmICghIChocHRlX3YgJiBIUFRFX1ZfTEFSR0UpKSB7CiAJCXVuc2lnbmVkIGxvbmcgdnBpLCBwdGVnOwogCiAJCXB0ZWcgPSBzbG90IC8gSFBURVNfUEVSX0dST1VQOwotCQlpZiAoc2Vjb25kYXJ5KQorCQlpZiAoaHB0ZV92ICYgSFBURV9WX1NFQ09OREFSWSkKIAkJCXB0ZWcgPSB+cHRlZzsKIAogCQl2cGkgPSAoKHZhID4+IDI4KSBeIHB0ZWcpICYgaHRhYl9oYXNoX21hc2s7CkBAIC0yMTksMTEgKzE5NCwxMSBAQAogCiBleHRlcm4gbG9uZyBwU2VyaWVzX2xwYXJfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YSwgdW5zaWduZWQgbG9uZyBwcnBuLAotCQkJCSAgICAgaW50IHNlY29uZGFyeSwgdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsCi0JCQkJICAgICBpbnQgYm9sdGVkLCBpbnQgbGFyZ2UpOworCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHJmbGFncyk7CiBleHRlcm4gbG9uZyBuYXRpdmVfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLCB1bnNpZ25lZCBsb25nIHZhLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHJwbiwgaW50IHNlY29uZGFyeSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhwdGVmbGFncywgaW50IGJvbHRlZCwgaW50IGxhcmdlKTsKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBycG4sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcmZsYWdzKTsKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9wYWNhLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wYWNhLmgKaW5kZXggYWU3NmNhZS4uMmYwZjM2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvcGFjYS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3BhY2EuaApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUJPGFzbS90eXBlcy5oPgogI2luY2x1ZGUJPGFzbS9scHBhY2EuaD4KICNpbmNsdWRlCTxhc20vaVNlcmllcy9JdExwUmVnU2F2ZS5oPgotI2luY2x1ZGUJPGFzbS9pU2VyaWVzL0l0THBRdWV1ZS5oPgogI2luY2x1ZGUJPGFzbS9tbXUuaD4KIAogcmVnaXN0ZXIgc3RydWN0IHBhY2Ffc3RydWN0ICpsb2NhbF9wYWNhIGFzbSgicjEzIik7CkBAIC02Miw3ICs2MSw2IEBACiAJdTE2IHBhY2FfaW5kZXg7CQkJLyogTG9naWNhbCBwcm9jZXNzb3IgbnVtYmVyICovCiAKIAl1MzIgZGVmYXVsdF9kZWNyOwkJLyogRGVmYXVsdCBkZWNyZW1lbnRlciB2YWx1ZSAqLwotCXN0cnVjdCBJdExwUXVldWUgKmxwcXVldWVfcHRyOwkvKiBMcFF1ZXVlIGhhbmRsZWQgYnkgdGhpcyBDUFUgKi8KIAl1NjQga2VybmVsX3RvYzsJCQkvKiBLZXJuZWwgVE9DIGFkZHJlc3MgKi8KIAl1NjQgc3RhYl9yZWFsOwkJCS8qIEFic29sdXRlIGFkZHJlc3Mgb2Ygc2VnbWVudCB0YWJsZSAqLwogCXU2NCBzdGFiX2FkZHI7CQkJLyogVmlydHVhbCBhZGRyZXNzIG9mIHNlZ21lbnQgdGFibGUgKi8KQEAgLTkxLDcgKzg5LDYgQEAKIAl1NjQgbmV4dF9qaWZmeV91cGRhdGVfdGI7CS8qIFRCIHZhbHVlIGZvciBuZXh0IGppZmZ5IHVwZGF0ZSAqLwogCXU2NCBzYXZlZF9yMTsJCQkvKiByMSBzYXZlIGZvciBSVEFTIGNhbGxzICovCiAJdTY0IHNhdmVkX21zcjsJCQkvKiBNU1Igc2F2ZWQgaGVyZSBieSBlbnRlcl9ydGFzICovCi0JdTMyIGxwZXZlbnRfY291bnQ7CQkvKiBscGV2ZW50cyBwcm9jZXNzZWQgICovCiAJdTggcHJvY19lbmFibGVkOwkJLyogaXJxIHNvZnQtZW5hYmxlIGZsYWcgKi8KIAogCS8qIG5vdCB5ZXQgdXNlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAppbmRleCA2Y2Q1OTNmLi5mYWE3NzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaApAQCAtMzcsNyArMzcsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTc4LDYgKzc4LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlbGluZV9zaXplOworCXU4IGJ5dGU7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmYnl0ZSk7CisJaWYgKGJ5dGUgPT0gMCkKKwkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OworCWVsc2UKKwkJY2FjaGVsaW5lX3NpemUgPSAoaW50KSBieXRlICogNDsKKworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfTVVMVElQTEU7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IGNhY2hlbGluZV9zaXplOworfQorI2VuZGlmCisKIGV4dGVybiBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogLyogRGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9tYWluIG51bWJlciBpbiAvcHJvYyAqLwpAQCAtMTM2LDYgKzE1NSwxMyBAQAogCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkgcGdwcm90X3QgcHJvdCk7CiAKKyNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKyNkZWZpbmUgSEFWRV9BUkNIX1BDSV9SRVNPVVJDRV9UT19VU0VSCitleHRlcm4gdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAorCQkJCSBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCisJCQkJIHU2NCAqc3RhcnQsIHU2NCAqZW5kKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KKwogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCmluZGV4IGFmMjhhYTUuLjM1MjMwNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW1jZmcuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAogLyogTWFjaGluZSBTdGF0ZSBSZWdpc3RlciAoTVNSKSBGaWVsZHMgKi8KICNkZWZpbmUgTVNSX1NGX0xHCTYzICAgICAgICAgICAgICAvKiBFbmFibGUgNjQgYml0IG1vZGUgKi8KQEAgLTUwMSwyNCArNTAyLDM3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBjdHJsOwogCi0JY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOwotCWN0cmwgfD0gQ1RSTF9SVU5MQVRDSDsKLQltdHNwcihTUFJOX0NUUkxULCBjdHJsKTsKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ1RSTCkpIHsKKwkJY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOworCQljdHJsIHw9IENUUkxfUlVOTEFUQ0g7CisJCW10c3ByKFNQUk5fQ1RSTFQsIGN0cmwpOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBwYzY0X3J1bmxhdGNoX29mZih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAotCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKLQljdHJsICY9IH5DVFJMX1JVTkxBVENIOwotCW10c3ByKFNQUk5fQ1RSTFQsIGN0cmwpOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9DVFJMKSkgeworCQljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7CisJCWN0cmwgJj0gfkNUUkxfUlVOTEFUQ0g7CisJCW10c3ByKFNQUk5fQ1RSTFQsIGN0cmwpOworCX0KIH0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBSVU5MQVRDSF9PTihSRUcpCQkJXAorQkVHSU5fRlRSX1NFQ1RJT04JCQkJXAorCW1mc3ByCShSRUcpLFNQUk5fQ1RSTEY7CQlcCisJb3JpCShSRUcpLChSRUcpLENUUkxfUlVOTEFUQ0g7CVwKKwltdHNwcglTUFJOX0NUUkxULChSRUcpOwkJXAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ1RSTCkKKyNlbmRpZgorCiAvKgogICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFNMQi4gSWYgdGhpcyBldmVyIGNoYW5nZXMgd2Ugc2hvdWxkIGhhbmRsZQogICogaXQgd2l0aCBhIHVzZSBhIGNwdSBmZWF0dXJlIGZpeHVwLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1wcGM2NC91bmlzdGQuaAppbmRleCA2MDVkOTFlLi40YTk0YWNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC91bmlzdGQuaApAQCAtMjY4LDcgKzI2OCw3IEBACiAjZGVmaW5lIF9fTlJfcnRhcwkJMjU1CiAvKiBOdW1iZXIgMjU2IGlzIHJlc2VydmVkIGZvciBzeXNfZGVidWdfc2V0Y29udGV4dCAqLwogLyogTnVtYmVyIDI1NyBpcyByZXNlcnZlZCBmb3IgdnNlcnZlciAqLwotLyogTnVtYmVyIDI1OCBpcyByZXNlcnZlZCBmb3IgbmV3IHN5c19yZW1hcF9maWxlX3BhZ2VzICovCisvKiAyNTggY3VycmVudGx5IHVudXNlZCAqLwogI2RlZmluZSBfX05SX21iaW5kCQkyNTkKICNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTI2MAogI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMjYxCkBAIC0yODMsOCArMjgzLDEwIEBACiAjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjcwCiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyNzEKICNkZWZpbmUgX19OUl93YWl0aWQJCTI3MgorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI3MworI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI3NAogCi0jZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTI3MworI2RlZmluZSBfX05SX3N5c2NhbGxzCQkyNzUKICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIE5SX3N5c2NhbGxzCV9fTlJfc3lzY2FsbHMKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKaW5kZXggYjRhOWYwNS4uODY0Y2FlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCkBAIC0xMDcsMTEgKzEwNyw5IEBACiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIGV4dGVybiB2b2lkIGFjY291bnRfdXNlcl92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci0jZWxzZQotI2RlZmluZSBhY2NvdW50X3N5c3RlbV92dGltZShwcmV2KSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocnEsIHByZXYpIGRvIHsJCQkJICAgICBcCisjZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KSBkbyB7CQkJCQkgICAgIFwKIAlzZXRfZnMoY3VycmVudC0+dGhyZWFkLm1tX3NlZ21lbnQpOwkJCQkgICAgIFwKIAlhY2NvdW50X3N5c3RlbV92dGltZShwcmV2KTsJCQkJCSAgICAgXAogfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaAppbmRleCA1NDBmMTIyLi43MjMzYWY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYmlnc3VyL3NlcmlhbC5oCkBAIC0xNCwxMyArMTQsMTAgQEAKICNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKIAogCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIEhENjQ0NjVfSVJRX1VBUlQsIFNURF9DT01fRkxBR1MgfSAvKiB0dHlTMCAqLyAKIAotCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgU1REX1NFUklBTF9QT1JUX0RFRk5TCi0KIC8qIFhYWDogVGhpcyBzaG91bGQgYmUgbW92ZWQgaW5vIGlycS5oICovCiAjZGVmaW5lIGlycV9jYW5ub25pY2FsaXplKHgpICh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmgKaW5kZXggZjhlYjE2My4uY2ZlNGQ3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9zZXJpYWwuaApAQCAtMTAsMTMgKzEwLDExIEBACiAgKiBpdCdzIGdvdCB0aGUga2V5Ym9hcmQgY29udHJvbGxlciBiZWhpbmQgaXQgc28gd2UgY2FuJ3QgcmVhbGx5IHVzZSBpdAogICogKHdpdGhvdXQgbW92aW5nIHRoZSBrZXlib2FyZCBkcml2ZXIgdG8gdXNlcnNwYWNlLCB3aGljaCBkb2Vzbid0IHNvdW5kCiAgKiBsaWtlIGEgdmVyeSBnb29kIGlkZWEpICovCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MTFDMDAsIEVDMzEwNF9JUlFCQVNFKzcsIFNURF9DT01fRkxBR1MgfSwgLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDEyMDAwLCBFQzMxMDRfSVJRQkFTRSs4LCBTVERfQ09NX0ZMQUdTIH0sIC8qIHR0eVMxICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgxMjQwMCwgRUMzMTA0X0lSUUJBU0UrOSwgU1REX0NPTV9GTEFHUyB9LCAvKiB0dHlTMiAqLwogCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgU1REX1NFUklBTF9QT1JUX0RFRk5TCi0KIC8qIFhYWDogVGhpcyBzaG91bGQgYmUgbW92ZWQgaW5vIGlycS5oICovCiAjZGVmaW5lIGlycV9jYW5ub25pY2FsaXplKHgpICh4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGNpLmggYi9pbmNsdWRlL2FzbS1zaC9wY2kuaAppbmRleCA5YzNiNjNkLi4wYTUyM2M4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wY2kuaApAQCAtMzYsNyArMzYsNyBAQAogCiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtOTYsNiArOTYsMTYgQEAKICNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpCSh2aXJ0X3RvX2J1cygoc2cpLT5kbWFfYWRkcmVzcykpCiAjZGVmaW5lIHNnX2RtYV9sZW4oc2cpCQkoKHNnKS0+bGVuZ3RoKQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiAvKiBCb2FyZC1zcGVjaWZpYyBmaXh1cCByb3V0aW5lcy4gKi8KIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXAodm9pZCk7CiBleHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwX2lycXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCmluZGV4IDU0NzRkYmQuLmY1MWUyMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCkBAIC0yOSwyMCArMjksMTggQEAKICNpZmRlZiBDT05GSUdfSEQ2NDQ2NQogI2luY2x1ZGUgPGFzbS9oZDY0NDY1Lmg+CiAKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDNGOCwgSEQ2NDQ2NV9JUlFfVUFSVCwgU1REX0NPTV9GTEFHUyB9ICAvKiB0dHlTMCAqLwogCiAjZWxzZQogCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMwICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRjgsIDMsIFNURF9DT01fRkxBR1MgfQkvKiB0dHlTMSAqLwogCiAjZW5kaWYKIAotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TIFNURF9TRVJJQUxfUE9SVF9ERUZOUwotCiAjZW5kaWYKICNlbmRpZiAvKiBfQVNNX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc2g2NC9wY2kuaAppbmRleCA4Y2MxNGUxMzkuLmFhODA0MzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wY2kuaApAQCAtMjYsNyArMjYsNyBAQAogLyoKICAqIFNldCBwZW5hbGl6ZSBpc2EgaXJxIGZ1bmN0aW9uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtODYsNiArODYsMTYgQEAKICNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpCSgoc2cpLT5kbWFfYWRkcmVzcykKICNkZWZpbmUgc2dfZG1hX2xlbihzZykJCSgoc2cpLT5sZW5ndGgpCiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKIC8qIEJvYXJkLXNwZWNpZmljIGZpeHVwIHJvdXRpbmVzLiAqLwogZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cCh2b2lkKTsKIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXBfaXJxcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1zaDY0L3NlcmlhbC5oCmluZGV4IDhlMzliNGUuLjI5YzliZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9zZXJpYWwuaApAQCAtMjAsMTMgKzIwLDExIEBACiAKICNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKIAotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMJCQlcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQlcCiAJLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovCQkJXAogCXsgMCwgQkFTRV9CQVVELCAweDNGOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMCAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkY4LCAzLCBTVERfQ09NX0ZMQUdTIH0JLyogdHR5UzEgKi8KIAotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TIFNURF9TRVJJQUxfUE9SVF9ERUZOUwotCiAvKiBYWFg6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIGlubyBpcnEuaCAqLwogI2RlZmluZSBpcnFfY2Fubm9uaWNhbGl6ZSh4KSAoeCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcGNpLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wY2kuaAppbmRleCBkMjAwYTI1Li45NzA1MmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wY2kuaApAQCAtMjAsNyArMjAsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitleHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTE0NCw2ICsxNDQsMTYgQEAKIAogI2RlZmluZSBwY2lfZGFjX2RtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKQkoMCkKIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfSU5GSU5JVFk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IH4wVUw7Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKaW5kZXggODQ2NzA4NC4uYWVlMTdkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKQEAgLTIxMiw3ICsyMTIsNyBAQAogI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAgICAgICAxOTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAgICAgICAgICAxOTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQgICAgICAgICAxOTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX3VsaW1pdCAgICAgICAgICAxOTYgICAgTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19zZXQgICAgICAgICAxOTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2dldHBwaWQgICAgICAgICAgICAxOTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ2FjdGlvbiAgICAgICAgICAxOTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NnZXRtYXNrICAgICAgICAgICAxOTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAjZGVmaW5lIF9fTlJfaXBjICAgICAgICAgICAgICAgIDIxNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncmV0dXJuICAgICAgICAgIDIxNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY2xvbmUgICAgICAgICAgICAgIDIxNyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdCAgICAgIDIxOCAgICBMaW51eCBTcGVjaWZpYyAtIGkzODYgc3BlY2lmaWMsIHVudXNlZCAgICAgICovCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldCAgICAgICAgIDIxOCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfYWRqdGltZXggICAgICAgICAgIDIxOSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sgICAgICAgIDIyMCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZSAgICAgIDIyMSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eGlvLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eGlvLmgKaW5kZXggNWViMDFkZC4uODFhNTkwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9hdXhpby5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXV4aW8uaApAQCAtNzUsNiArNzUsOCBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCitleHRlcm4gdm9pZCBfX2lvbWVtICphdXhpb19yZWdpc3RlcjsKKwogI2RlZmluZSBBVVhJT19MVEVfT04JMQogI2RlZmluZSBBVVhJT19MVEVfT0ZGCTAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYml0b3BzLmgKaW5kZXggOWQ3MjJkYy4uOWM1ZTcxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2JpdG9wcy5oCkBAIC0yMCw1MiArMjAsNTIgQEAKIAogLyogIm5vbi1hdG9taWMiIHZlcnNpb25zLi4uICovCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKIAogCSptIHw9ICgxVUwgPDwgKG5yICYgNjMpKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKIAogCSptICY9IH4oMVVMIDw8IChuciAmIDYzKSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKIAogCSptIF49ICgxVUwgPDwgKG5yICYgNjMpKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOwotCWxvbmcgb2xkID0gKm07Ci0JbG9uZyBtYXNrID0gKDFVTCA8PCAobnIgJiA2MykpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKKwl1bnNpZ25lZCBsb25nIG9sZCA9ICptOworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICgxVUwgPDwgKG5yICYgNjMpKTsKIAogCSptID0gKG9sZCB8IG1hc2spOwogCXJldHVybiAoKG9sZCAmIG1hc2spICE9IDApOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOwotCWxvbmcgb2xkID0gKm07Ci0JbG9uZyBtYXNrID0gKDFVTCA8PCAobnIgJiA2MykpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKKwl1bnNpZ25lZCBsb25nIG9sZCA9ICptOworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICgxVUwgPDwgKG5yICYgNjMpKTsKIAogCSptID0gKG9sZCAmIH5tYXNrKTsKIAlyZXR1cm4gKChvbGQgJiBtYXNrKSAhPSAwKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0gPSBhZGRyICsgKG5yID4+IDYpOwotCWxvbmcgb2xkID0gKm07Ci0JbG9uZyBtYXNrID0gKDFVTCA8PCAobnIgJiA2MykpOworCXVuc2lnbmVkIGxvbmcgKm0gPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA2KTsKKwl1bnNpZ25lZCBsb25nIG9sZCA9ICptOworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICgxVUwgPDwgKG5yICYgNjMpKTsKIAogCSptID0gKG9sZCBeIG1hc2spOwogCXJldHVybiAoKG9sZCAmIG1hc2spICE9IDApOwpAQCAtNzksMTMgKzc5LDEzIEBACiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJYmFycmllcigpCiAjZW5kaWYKIAotc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYml0KGludCBuciwgX19jb25zdF9fIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2JpdChpbnQgbnIsIF9fY29uc3RfXyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXJldHVybiAoMVVMICYgKChhZGRyKVtuciA+PiA2XSA+PiAobnIgJiA2MykpKSAhPSAwVUw7CisJcmV0dXJuICgxVUwgJiAoYWRkcltuciA+PiA2XSA+PiAobnIgJiA2MykpKSAhPSAwVUw7CiB9CiAKIC8qIFRoZSBlYXN5L2NoZWVzZSB2ZXJzaW9uIGZvciBub3cuICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGZmeih1bnNpZ25lZCBsb25nIHdvcmQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmZ6KHVuc2lnbmVkIGxvbmcgd29yZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIApAQCAtMTAzLDcgKzEwMyw3IEBACiAgKgogICogVW5kZWZpbmVkIGlmIG5vIGJpdCBleGlzdHMsIHNvIGNvZGUgc2hvdWxkIGNoZWNrIGFnYWluc3QgMCBmaXJzdC4KICAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX2Zmcyh1bnNpZ25lZCBsb25nIHdvcmQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB3b3JkKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKIApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgKiB0aGUgbGliYyBhbmQgY29tcGlsZXIgYnVpbHRpbiBmZnMgcm91dGluZXMsIHRoZXJlZm9yZQogICogZGlmZmVycyBpbiBzcGlyaXQgZnJvbSB0aGUgYWJvdmUgZmZ6IChtYW4gZmZzKS4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IGZmcyhpbnQgeCkKK3N0YXRpYyBpbmxpbmUgaW50IGZmcyhpbnQgeCkKIHsKIAlpZiAoIXgpCiAJCXJldHVybiAwOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAKICNpZmRlZiBVTFRSQV9IQVNfUE9QVUxBVElPTl9DT1VOVAogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgaHdlaWdodDY0KHVuc2lnbmVkIGxvbmcgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQ2NCh1bnNpZ25lZCBsb25nIHcpCiB7CiAJdW5zaWduZWQgaW50IHJlczsKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGh3ZWlnaHQzMih1bnNpZ25lZCBpbnQgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQzMih1bnNpZ25lZCBpbnQgdykKIHsKIAl1bnNpZ25lZCBpbnQgcmVzOwogCkBAIC0xNzQsNyArMTc0LDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgaHdlaWdodDE2KHVuc2lnbmVkIGludCB3KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDE2KHVuc2lnbmVkIGludCB3KQogewogCXVuc2lnbmVkIGludCByZXM7CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBod2VpZ2h0OCh1bnNpZ25lZCBpbnQgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KQogewogCXVuc2lnbmVkIGludCByZXM7CiAKQEAgLTIzNiw3ICsyMzYsNyBAQAogI2RlZmluZSB0ZXN0X2FuZF9jbGVhcl9sZV9iaXQobnIsYWRkcikJXAogCXRlc3RfYW5kX2NsZWFyX2JpdCgobnIpIF4gMHgzOCwgKGFkZHIpKQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9sZV9iaXQoaW50IG5yLCBfX2NvbnN0X18gdW5zaWduZWQgbG9uZyAqIGFkZHIpCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2xlX2JpdChpbnQgbnIsIF9fY29uc3RfXyB1bnNpZ25lZCBsb25nICogYWRkcikKIHsKIAlpbnQJCQltYXNrOwogCV9fY29uc3RfXyB1bnNpZ25lZCBjaGFyCSpBRERSID0gKF9fY29uc3RfXyB1bnNpZ25lZCBjaGFyICopIGFkZHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAppbmRleCBlMDcxYjRiLi40OWQ0OWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKQEAgLTE1OSw3ICsxNTksNyBAQAogICogdW5kZXJydW5zLiAgSWYgbm9uLXplcm8sIGRvaW5nX3BkbWEgZW5jb2RlcyB0aGUgZGlyZWN0aW9uIG9mCiAgKiB0aGUgdHJhbnNmZXIgZm9yIGRlYnVnZ2luZy4gIDE9cmVhZCAyPXdyaXRlCiAgKi8KLWNoYXIgKnBkbWFfdmFkZHI7Cit1bnNpZ25lZCBjaGFyICpwZG1hX3ZhZGRyOwogdW5zaWduZWQgbG9uZyBwZG1hX3NpemU7CiB2b2xhdGlsZSBpbnQgZG9pbmdfcGRtYSA9IDA7CiAKQEAgLTIwOSw4ICsyMDksNyBAQAogCXBkbWFfYXJlYXNpemUgPSBwZG1hX3NpemU7CiB9CiAKLS8qIE91ciBsb3ctbGV2ZWwgZW50cnkgcG9pbnQgaW4gYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUyAqLwotZXh0ZXJuIGlycXJldHVybl90IGZsb3BweV9oYXJkaW50KGludCBpcnEsIHZvaWQgKnVudXNlZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGlycXJldHVybl90IHNwYXJjX2Zsb3BweV9pcnEoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCiBzdGF0aWMgaW50IHN1bl9mZF9yZXF1ZXN0X2lycSh2b2lkKQogewpAQCAtMjIwLDggKzIxOSw4IEBACiAJaWYoIW9uY2UpIHsKIAkJb25jZSA9IDE7CiAKLQkJZXJyb3IgPSByZXF1ZXN0X2Zhc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LCAKLQkJCQkJIFNBX0lOVEVSUlVQVCwgImZsb3BweSIsIE5VTEwpOworCQllcnJvciA9IHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIHNwYXJjX2Zsb3BweV9pcnEsIAorCQkJCSAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKTsKIAogCQlyZXR1cm4gKChlcnJvciA9PSAwKSA/IDAgOiAtMSk7CiAJfQpAQCAtNjE1LDcgKzYxNCw3IEBACiAJCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOwogCQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSBOVUxMOwogCQl1bnNpZ25lZCBsb25nIGNvbmZpZyA9IDA7Ci0JCXVuc2lnbmVkIGxvbmcgYXV4aW9fcmVnOworCQl2b2lkIF9faW9tZW0gKmF1eGlvX3JlZzsKIAogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewpAQCAtNjQyLDcgKzY0MSw3IEBACiAJCS8qIE1ha2Ugc3VyZSB0aGUgaGlnaCBkZW5zaXR5IGJpdCBpcyBzZXQsIHNvbWUgc3lzdGVtcwogCQkgKiAobW9zdCBub3RhYmx5IFVsdHJhNS9VbHRyYTEwKSBjb21lIHVwIHdpdGggaXQgY2xlYXIuCiAJCSAqLwotCQlhdXhpb19yZWcgPSBlZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKKwkJYXV4aW9fcmVnID0gKHZvaWQgX19pb21lbSAqKSBlZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKIAkJd3JpdGVsKHJlYWRsKGF1eGlvX3JlZyl8MHgyLCBhdXhpb19yZWcpOwogCiAJCXN1bl9wY2lfZWJ1c19kZXYgPSBlYnVzLT5zZWxmOwpAQCAtNjUwLDcgKzY0OSw4IEBACiAJCXNwaW5fbG9ja19pbml0KCZzdW5fcGNpX2ZkX2VidXNfZG1hLmxvY2spOwogCiAJCS8qIFhYWCBpb3JlbWFwICovCi0JCXN1bl9wY2lfZmRfZWJ1c19kbWEucmVncyA9IGVkZXYtPnJlc291cmNlWzFdLnN0YXJ0OworCQlzdW5fcGNpX2ZkX2VidXNfZG1hLnJlZ3MgPSAodm9pZCBfX2lvbWVtICopCisJCQllZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKIAkJaWYgKCFzdW5fcGNpX2ZkX2VidXNfZG1hLnJlZ3MpCiAJCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKaW5kZXggM2FlZjBjYS4uOGI3MGVkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCkBAIC0xNiwxMCArMTYsMjIgQEAKICNpbmNsdWRlIDxhc20vcGlsLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCitzdHJ1Y3QgaW5vX2J1Y2tldDsKKworI2RlZmluZSBNQVhfSVJRX0RFU0NfQUNUSU9OCTQKKworc3RydWN0IGlycV9kZXNjIHsKKwl2b2lkCQkJKCpwcmVfaGFuZGxlcikoc3RydWN0IGlub19idWNrZXQgKiwgdm9pZCAqLCB2b2lkICopOworCXZvaWQJCQkqcHJlX2hhbmRsZXJfYXJnMTsKKwl2b2lkCQkJKnByZV9oYW5kbGVyX2FyZzI7CisJdTMyCQkJYWN0aW9uX2FjdGl2ZV9tYXNrOworCXN0cnVjdCBpcnFhY3Rpb24JYWN0aW9uW01BWF9JUlFfREVTQ19BQ1RJT05dOworfTsKKwogLyogWW91IHNob3VsZCBub3QgbWVzcyB3aXRoIHRoaXMgZGlyZWN0bHkuIFRoYXQncyB0aGUgam9iIG9mIGlycS5jLgogICoKICAqIElmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZSwgcGxlYXNlIHVwZGF0ZSBoYW5kIGNvZGVkIGFzc2VtYmxlciBvZgotICogU0JVUy9mbG9wcHkgaW50ZXJydXB0IGhhbmRsZXIgaW4gZW50cnkuUyAtRGF2ZU0KKyAqIHRoZSB2ZWN0b3JlZCBpbnRlcnJ1cHQgdHJhcCBoYW5kbGVyIGluIGVudHJ5LlMgLURhdmVNCiAgKgogICogVGhpcyBpcyBjdXJyZW50bHkgb25lIERDQUNIRSBsaW5lLCB0d28gYnVja2V0cyBwZXIgTDIgY2FjaGUKICAqIGxpbmUuICBLZWVwIHRoaXMgaW4gbWluZCBwbGVhc2UuCkBAIC00MiwyNCArNTQsMTEgQEAKIAkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLiAqLwogLyoweDA2Ki91bnNpZ25lZCBjaGFyIGZsYWdzOwogCi0JLyogVGhpcyBpcyB1c2VkIHRvIGRlYWwgd2l0aCBJQkZfRE1BX1NZTkMgb24KLQkgKiBTYWJyZSBzeXN0ZW1zLgotCSAqLwotLyoweDA3Ki91bnNpZ25lZCBjaGFyIHN5bmN0YWJfZW50OworCS8qIEN1cnJlbnRseSB1bnVzZWQuICAqLworLyoweDA3Ki91bnNpZ25lZCBjaGFyIF9fcGFkOwogCi0JLyogUmVmZXJlbmNlIHRvIGhhbmRsZXIgZm9yIHRoaXMgSVJRLiAgSWYgdGhpcyBpcwotCSAqIG5vbi1OVUxMIHRoaXMgbWVhbnMgaXQgaXMgYWN0aXZlIGFuZCBzaG91bGQgYmUKLQkgKiBzZXJ2aWNlZC4gIEVsc2UgdGhlIHBlbmRpbmcgbWVtYmVyIGlzIHNldCB0byBvbmUKLQkgKiBhbmQgbGF0ZXIgcmVnaXN0cnkgb2YgdGhlIGludGVycnVwdCBjaGVja3MgZm9yCi0JICogdGhpcyBjb25kaXRpb24uCi0JICoKLQkgKiBOb3JtYWxseSB0aGlzIGlzIGp1c3QgYW4gaXJxX2FjdGlvbiBzdHJ1Y3R1cmUuCi0JICogQnV0LCBvbiBQQ0ksIGlmIG11bHRpcGxlIGludGVycnVwdCBzb3VyY2VzIGJlaGluZAotCSAqIGEgYnJpZGdlIGhhdmUgbXVsdGlwbGUgaW50ZXJydXB0IHNvdXJjZXMgdGhhdCBzaGFyZQotCSAqIHRoZSBzYW1lIElOTyBidWNrZXQsIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mCi0JICogcG9pbnRlcnMgdG8gZm91ciBJUlEgYWN0aW9uIHN0cnVjdHVyZXMuCi0JICovCi0vKjB4MDgqL3ZvaWQgKmlycV9pbmZvOworCS8qIFJlZmVyZW5jZSB0byBJUlEgZGVzY3JpcHRvciBmb3IgdGhpcyBidWNrZXQuICovCisvKjB4MDgqL3N0cnVjdCBpcnFfZGVzYyAqaXJxX2luZm87CiAKIAkvKiBTdW41IEludGVycnVwdCBDbGVhciBSZWdpc3Rlci4gKi8KIC8qMHgxMCovdW5zaWduZWQgbG9uZyBpY2xyOwpAQCAtNjksMTIgKzY4LDYgQEAKIAogfTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9kbWFfd3N5bmM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfc3luY19yZWdfdGFibGVbMjU2XTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGRtYV9zeW5jX3JlZ190YWJsZV9lbnRyeTsKLSNlbmRpZgotCiAvKiBJTUFQL0lDTFIgcmVnaXN0ZXIgZGVmaW5lcyAqLwogI2RlZmluZSBJTUFQX1ZBTElECQkweDgwMDAwMDAwCS8qIElSUSBFbmFibGVkCQkqLwogI2RlZmluZSBJTUFQX1RJRF9VUEEJCTB4N2MwMDAwMDAJLyogVVBBIFRhcmdldElECQkqLwpAQCAtOTAsMTEgKzgzLDkgQEAKICNkZWZpbmUgSUNMUl9QRU5ESU5HCQkweDAwMDAwMDAzCS8qIFBlbmRpbmcgc3RhdGUJKi8KIAogLyogT25seSA4LWJpdHMgYXJlIGF2YWlsYWJsZSwgYmUgY2FyZWZ1bC4gIC1EYXZlTSAqLwotI2RlZmluZSBJQkZfRE1BX1NZTkMJMHgwMQkvKiBETUEgc3luY2hyb25pemF0aW9uIGJlaGluZCBQQ0kgYnJpZGdlIG5lZWRlZC4gKi8KLSNkZWZpbmUgSUJGX1BDSQkJMHgwMgkvKiBJbmRpY2F0ZXMgUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KLSNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIFRoaXMgaW50ZXJydXB0IGlzIGFjdGl2ZSBhbmQgaGFzIGEgaGFuZGxlci4JICovCi0jZGVmaW5lIElCRl9NVUxUSQkweDA4CS8qIE9uIFBDSSwgaW5kaWNhdGVzIHNoYXJlZCBidWNrZXQuCQkgKi8KLSNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkJICovCisjZGVmaW5lIElCRl9QQ0kJCTB4MDIJLyogUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KKyNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIEludGVycnVwdCBpcyBhY3RpdmUgYW5kIGhhcyBhIGhhbmRsZXIuKi8KKyNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkgKi8KIAogI2RlZmluZSBOVU1fSVZFQ1MJKElNQVBfSU5SICsgMSkKIGV4dGVybiBzdHJ1Y3QgaW5vX2J1Y2tldCBpdmVjdG9yX3RhYmxlW05VTV9JVkVDU107CkBAIC0xMjIsMTEgKzExMyw2IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGJ1aWxkX2lycShpbnQgcGlsLCBpbnQgaW5vZml4dXAsIHVuc2lnbmVkIGxvbmcgaWNsciwgdW5zaWduZWQgbG9uZyBpbWFwKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqc2J1cywgdW5zaWduZWQgaW50IGlubyk7CiAKLWV4dGVybiBpbnQgcmVxdWVzdF9mYXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQkJICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIF9fY29uc3RfXyBjaGFyICpkZXZuYW1lLAotCQkJICAgIHZvaWQgKmRldl9pZCk7Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3NvZnRpbnQodW5zaWduZWQgbG9uZyBiaXRzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cgklMCwgMHgwLCAlJXNldF9zb2Z0aW50IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJhbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJhbS5oCmluZGV4IDZhMTJmM2EuLmExY2Q0OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcmFtLmgKQEAgLTEsOSArMSwxMCBAQAotLyogJElkOiBwYXJhbS5oLHYgMS4yIDIwMDAvMTAvMzAgMjE6MDE6NDEgZGF2ZW0gRXhwICQgKi8KICNpZm5kZWYgX0FTTVNQQVJDNjRfUEFSQU1fSAogI2RlZmluZSBfQVNNU1BBUkM2NF9QQVJBTV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKwogI2lmZGVmIF9fS0VSTkVMX18KLSMgZGVmaW5lIEhaCQkxMDAwCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KKyMgZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogIyBkZWZpbmUgVVNFUl9IWgkxMDAJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDIChVU0VSX0haKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCmluZGV4IGI3ZTYzNTUuLjU2YjUxOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCkBAIC0yNywxMiArMjcsMTIgQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKIHsKKwllYnVzX2RtYV9lbmFibGUoJnNwYXJjX2VidXNfZG1hc1tkbWFucl0uaW5mbywgMSk7CisKIAlpZiAoZWJ1c19kbWFfcmVxdWVzdCgmc3BhcmNfZWJ1c19kbWFzW2RtYW5yXS5pbmZvLAogCQkJICAgICBzcGFyY19lYnVzX2RtYXNbZG1hbnJdLmFkZHIsCiAJCQkgICAgIHNwYXJjX2VidXNfZG1hc1tkbWFucl0uY291bnQpKQogCQlCVUcoKTsKLQotCWVidXNfZG1hX2VuYWJsZSgmc3BhcmNfZWJ1c19kbWFzW2RtYW5yXS5pbmZvLCAxKTsKIH0KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaAppbmRleCA0YzE1NjEwLi4zOGJiYmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKQEAgLTE0NSw2ICsxNDUsOSBAQAogCS8qIFBoeXNpY2FsIGFkZHJlc3MgYmFzZSBvZiBQQk0gcmVnaXN0ZXJzLiAqLwogCXVuc2lnbmVkIGxvbmcJCQlwYm1fcmVnczsKIAorCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRE1BIHN5bmMgcmVnaXN0ZXIsIGlmIGFueS4gICovCisJdW5zaWduZWQgbG9uZwkJCXN5bmNfcmVnOworCiAJLyogT3BhcXVlIDMyLWJpdCBzeXN0ZW0gYnVzIFBvcnQgSUQuICovCiAJdTMyCQkJCXBvcnRpZDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKaW5kZXggMmEwYzg1Yy4uYTRhYjBlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCkBAIC0yMyw3ICsyMyw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtMjIwLDYgKzIyMCwyNSBAQAogCXJldHVybiAoZG1hX2FkZHIgPT0gUENJX0RNQV9FUlJPUl9DT0RFKTsKIH0KIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCXVuc2lnbmVkIGxvbmcgY2FjaGVsaW5lX3NpemU7CisJdTggYnl0ZTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKKwlpZiAoYnl0ZSA9PSAwKQorCQljYWNoZWxpbmVfc2l6ZSA9IDEwMjQ7CisJZWxzZQorCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OworCisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9CT1VOREFSWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gY2FjaGVsaW5lX3NpemU7Cit9CisjZW5kaWYKKwogLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgUENJIGNvbnRyb2xsZXIgZm9yIGRldmljZSBQREVWLiAqLwogCiBleHRlcm4gaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wdHJhY2UuaAppbmRleCAyZDJiNWExLi42MTk0Zjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHRyYWNlLmgKQEAgLTk0LDggKzk0LDkgQEAKICNkZWZpbmUgU1RBQ0tGUkFNRTMyX1NaCXNpemVvZihzdHJ1Y3Qgc3BhcmNfc3RhY2tmMzIpCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQlcCi0Jc2V0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1NVQ0NFU1MpCisjZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQkgICAgXAorZG8gewljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2NhbGxfbm9lcnJvciA9IDE7IFwKK30gd2hpbGUgKDApCiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoISgocmVncyktPnRzdGF0ZSAmIFRTVEFURV9QUklWKSkKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT50cGMpCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9yd3NlbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9yd3NlbS5oCmluZGV4IGJmMmFlOTAuLjQ1NjhlZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcndzZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3J3c2VtLmgKQEAgLTQ2LDUzICs0NiwxNCBAQAogZXh0ZXJuIHZvaWQgX191cF93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pOwogZXh0ZXJuIHZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKIAotc3RhdGljIF9faW5saW5lX18gaW50IHJ3c2VtX2F0b21pY191cGRhdGUoaW50IGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCitzdGF0aWMgaW5saW5lIGludCByd3NlbV9hdG9taWNfdXBkYXRlKGludCBkZWx0YSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWludCB0bXAgPSBkZWx0YTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiMTpcdGxkdXcJWyUyXSwgJSVnMVxuXHQiCi0JCSJhZGQJCSUlZzEsICUxLCAlJWc3XG5cdCIKLQkJImNhcwkJWyUyXSwgJSVnMSwgJSVnN1xuXHQiCi0JCSJjbXAJCSUlZzEsICUlZzdcblx0IgotCQkiYm5lLHBuCQklJWljYywgMWJcblx0IgotCQkiIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcblx0IgotCQkibW92CQklJWc3LCAlMFxuXHQiCi0JCTogIj0mciIgKHRtcCkKLQkJOiAiMCIgKHRtcCksICJyIiAoc2VtKQotCQk6ICJnMSIsICJnNyIsICJtZW1vcnkiLCAiY2MiKTsKLQotCXJldHVybiB0bXAgKyBkZWx0YTsKKwlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4oZGVsdGEsIChhdG9taWNfdCAqKSgmc2VtLT5jb3VudCkpOwogfQogCi0jZGVmaW5lIHJ3c2VtX2F0b21pY19hZGQgcndzZW1fYXRvbWljX3VwZGF0ZQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3UxNiByd3NlbV9jbXB4Y2hndyhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sIF9fdTE2IF9fb2xkLCBfX3UxNiBfX25ldykKK3N0YXRpYyBpbmxpbmUgdm9pZCByd3NlbV9hdG9taWNfYWRkKGludCBkZWx0YSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCXUzMiBvbGQgPSAoc2VtLT5jb3VudCAmIDB4ZmZmZjAwMDApIHwgKHUzMikgX19vbGQ7Ci0JdTMyIG5ldyA9IChvbGQgJiAweGZmZmYwMDAwKSB8ICh1MzIpIF9fbmV3OwotCXUzMiBwcmV2OwotCi1hZ2FpbjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FzCVslMl0sICUzLCAlMFxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgotCQkJICAgICA6ICI9JnIiIChwcmV2KQotCQkJICAgICA6ICIwIiAobmV3KSwgInIiIChzZW0pLCAiciIgKG9sZCkKLQkJCSAgICAgOiAibWVtb3J5Iik7Ci0KLQkvKiBUbyBnaXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyB4ODYgY21weGNoZ3csIGtlZXAgdHJ5aW5nCi0JICogaWYgb25seSB0aGUgdXBwZXIgMTYtYml0cyBjaGFuZ2VkLgotCSAqLwotCWlmIChwcmV2ICE9IG9sZCAmJgotCSAgICAoKHByZXYgJiAweGZmZmYpID09IChvbGQgJiAweGZmZmYpKSkKLQkJZ290byBhZ2FpbjsKLQotCXJldHVybiBwcmV2ICYgMHhmZmZmOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBzaWduZWQgbG9uZyByd3NlbV9jbXB4Y2hnKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgc2lnbmVkIGxvbmcgb2xkLCBzaWduZWQgbG9uZyBuZXcpCi17Ci0JcmV0dXJuIGNtcHhjaGcoJnNlbS0+Y291bnQsb2xkLG5ldyk7CisJYXRvbWljX2FkZChkZWx0YSwgKGF0b21pY190ICopKCZzZW0tPmNvdW50KSk7CiB9CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NlY2NvbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2VjY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2Q5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NlY2NvbXAuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9BU01fU0VDQ09NUF9ICisKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPiAvKiBhbHJlYWR5IGRlZmluZXMgVElGXzMyQklUICovCisKKyNpZm5kZWYgVElGXzMyQklUCisjZXJyb3IgInVuZXhwZWN0ZWQgVElGXzMyQklUIG9uIHNwYXJjNjQiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorCisjZGVmaW5lIF9fTlJfc2VjY29tcF9yZWFkIF9fTlJfcmVhZAorI2RlZmluZSBfX05SX3NlY2NvbXBfd3JpdGUgX19OUl93cml0ZQorI2RlZmluZSBfX05SX3NlY2NvbXBfZXhpdCBfX05SX2V4aXQKKyNkZWZpbmUgX19OUl9zZWNjb21wX3NpZ3JldHVybiBfX05SX3J0X3NpZ3JldHVybgorCisjZGVmaW5lIF9fTlJfc2VjY29tcF9yZWFkXzMyIF9fTlJfcmVhZAorI2RlZmluZSBfX05SX3NlY2NvbXBfd3JpdGVfMzIgX19OUl93cml0ZQorI2RlZmluZSBfX05SX3NlY2NvbXBfZXhpdF8zMiBfX05SX2V4aXQKKyNkZWZpbmUgX19OUl9zZWNjb21wX3NpZ3JldHVybl8zMiBfX05SX3NpZ3JldHVybgorCisjZW5kaWYgLyogX0FTTV9TRUNDT01QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2lnbmFsLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NpZ25hbC5oCmluZGV4IGJlY2RmMWIuLmUzMDU5YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zaWduYWwuaApAQCAtMTYyLDIxICsxNjIsNiBAQAogI2RlZmluZSBNSU5TSUdTVEtTWgk0MDk2CiAjZGVmaW5lIFNJR1NUS1NaCTE2Mzg0CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0vKgotICogREpIUgotICogU0FfU1RBVElDX0FMTE9DIGlzIHVzZWQgZm9yIHRoZSBTUEFSQyBzeXN0ZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGlzCi0gKiBpbnRlcnJ1cHQgaGFuZGxlcidzIGlycSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkCi0gKiBieSB0aGUgcmVxdWVzdF9pcnEgcm91dGluZS4KLSAqIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IGFyY2gvc3BhcmMva2VybmVsL2lycS5jIGhhcyBjYXJuYWwga25vd2xlZGdlCi0gKiBvZiBpbnRlcnJ1cHQgdXNhZ2UgYW5kIHRoYXQgc3Vja3MuIEFsc28gd2l0aG91dCBhIGZsYWcgbGlrZSB0aGlzCi0gKiBpdCBtYXkgYmUgcG9zc2libGUgZm9yIHRoZSBmcmVlX2lycSByb3V0aW5lIHRvIGF0dGVtcHQgdG8gZnJlZQotICogc3RhdGljYWxseSBhbGxvY2F0ZWQgZGF0YS4uIHdoaWNoIGlzIE5PVCBHT09ELgotICoKLSAqLwotI2RlZmluZSBTQV9TVEFUSUNfQUxMT0MJCTB4ODAKLSNlbmRpZgotCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CiAKIHN0cnVjdCBfX25ld19zaWdhY3Rpb24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oCmluZGV4IGRiNzU4MWIuLjljYjkzYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmgKQEAgLTUyLDEyICs1MiwxNCBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAiMToJbGRzdHViCQlbJTFdLCAlMFxuIgorIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglicm56LHBuCQklMCwgMmZcbiIKLSIJIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKICIJLnN1YnNlY3Rpb24JMlxuIgogIjI6CWxkdWIJCVslMV0sICUwXG4iCisiCW1lbWJhcgkJI0xvYWRMb2FkXG4iCiAiCWJybnoscHQJCSUwLCAyYlxuIgotIgkgbWVtYmFyCQkjTG9hZExvYWRcbiIKKyIJIG5vcFxuIgogIgliYSxhLHB0CQklJXhjYywgMWJcbiIKICIJLnByZXZpb3VzIgogCTogIj0mciIgKHRtcCkKQEAgLTk1LDE2ICs5NywxOCBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAiMToJbGRzdHViCQlbJTJdLCAlMFxuIgotIglicm56LHBuCQklMCwgMmZcbiIKICIJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJYnJueixwbgkJJTAsIDJmXG4iCisiCSBub3BcbiIKICIJLnN1YnNlY3Rpb24JMlxuIgogIjI6CXJkcHIJCSUlcGlsLCAlMVxuIgogIgl3cnByCQklMywgJSVwaWxcbiIKICIzOglsZHViCQlbJTJdLCAlMFxuIgotIglicm56LHB0CQklMCwgM2JcbiIKICIJbWVtYmFyCQkjTG9hZExvYWRcbiIKKyIJYnJueixwdAkJJTAsIDNiXG4iCisiCSBub3BcbiIKICIJYmEscHQJCSUleGNjLCAxYlxuIgotIgl3cnByCQklMSwgJSVwaWxcbiIKKyIJIHdycHIJCSUxLCAlJXBpbFxuIgogIgkucHJldmlvdXMiCiAJOiAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKQogCTogInIiKGxvY2spLCAiciIoZmxhZ3MpCkBAIC0xNjIsMTIgKzE2NiwxNCBAQAogIjQ6CSBhZGQJCSUwLCAxLCAlMVxuIgogIgljYXMJCVslMl0sICUwLCAlMVxuIgogIgljbXAJCSUwLCAlMVxuIgorIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JCSUlaWNjLCAxYlxuIgotIgkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIgkuc3Vic2VjdGlvbgkyXG4iCiAiMjoJbGRzdwkJWyUyXSwgJTBcbiIKKyIJbWVtYmFyCQkjTG9hZExvYWRcbiIKICIJYnJseixwdAkJJTAsIDJiXG4iCi0iCSBtZW1iYXIJCSNMb2FkTG9hZFxuIgorIgkgbm9wXG4iCiAiCWJhLGEscHQJCSUleGNjLCA0YlxuIgogIgkucHJldmlvdXMiCiAJOiAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKQpAQCAtMjA0LDEyICsyMTAsMTQgQEAKICI0Ogkgb3IJCSUwLCAlMywgJTFcbiIKICIJY2FzCQlbJTJdLCAlMCwgJTFcbiIKICIJY21wCQklMCwgJTFcbiIKKyIJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJYm5lLHBuCQklJWljYywgMWJcbiIKLSIJIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKICIJLnN1YnNlY3Rpb24JMlxuIgogIjI6CWxkdXcJCVslMl0sICUwXG4iCisiCW1lbWJhcgkJI0xvYWRMb2FkXG4iCiAiCWJybnoscHQJCSUwLCAyYlxuIgotIgkgbWVtYmFyCQkjTG9hZExvYWRcbiIKKyIJIG5vcFxuIgogIgliYSxhLHB0CQklJXhjYywgNGJcbiIKICIJLnByZXZpb3VzIgogCTogIj0mciIgKHRtcDEpLCAiPSZyIiAodG1wMikKQEAgLTI0MCw4ICsyNDgsOSBAQAogIgkgb3IJCSUwLCAlNCwgJTFcbiIKICIJY2FzCQlbJTNdLCAlMCwgJTFcbiIKICIJY21wCQklMCwgJTFcbiIKKyIJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJYm5lLHBuCQklJWljYywgMWJcbiIKLSIJIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKICIJbW92CQkxLCAlMlxuIgogIjI6IgogCTogIj0mciIgKHRtcDEpLCAiPSZyIiAodG1wMiksICI9JnIiIChyZXN1bHQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaXRmaXJlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaXRmaXJlLmgKaW5kZXggOWQ3NjEzZS4uOTYyNjM4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGl0ZmlyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpdGZpcmUuaApAQCAtNTYsNTIgKzU2LDYgQEAKIAkgU1BJVEZJUkVfSElHSEVTVF9MT0NLRURfVExCRU5UIDogXAogCSBDSEVFVEFIX0hJR0hFU1RfTE9DS0VEX1RMQkVOVCkKIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBzcGl0ZmlyZV9nZXRfaXNmc3Iodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHhhCVslMV0gJTIsICUwIgotCQkJICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgOiAiciIgKFRMQl9TRlNSKSwgImkiIChBU0lfSU1NVSkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgc3BpdGZpcmVfZ2V0X2RzZnNyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YQlbJTFdICUyLCAlMCIKLQkJCSAgICAgOiAiPXIiIChyZXQpCi0JCQkgICAgIDogInIiIChUTEJfU0ZTUiksICJpIiAoQVNJX0RNTVUpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHNwaXRmaXJlX2dldF9zZmFyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YQlbJTFdICUyLCAlMCIKLQkJCSAgICAgOiAiPXIiIChyZXQpCi0JCQkgICAgIDogInIiIChETU1VX1NGQVIpLCAiaSIgKEFTSV9ETU1VKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9wdXRfaXNmc3IodW5zaWduZWQgbG9uZyBzZnNyKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhCSUwLCBbJTFdICUyXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3luYyIKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiIChzZnNyKSwgInIiIChUTEJfU0ZTUiksICJpIiAoQVNJX0lNTVUpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9wdXRfZHNmc3IodW5zaWduZWQgbG9uZyBzZnNyKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhCSUwLCBbJTFdICUyXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3luYyIKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiIChzZnNyKSwgInIiIChUTEJfU0ZTUiksICJpIiAoQVNJX0RNTVUpKTsKLX0KLQogLyogVGhlIGRhdGEgY2FjaGUgaXMgd3JpdGUgdGhyb3VnaCwgc28gdGhpcyBqdXN0IGludmFsaWRhdGVzIHRoZQogICogc3BlY2lmaWVkIGxpbmUuCiAgKi8KQEAgLTExMSw3ICs2NSw2IEBACiAJCQkgICAgICJtZW1iYXIJI1N5bmMiCiAJCQkgICAgIDogLyogTm8gb3V0cHV0cyAqLwogCQkJICAgICA6ICJyIiAodGFnKSwgInIiIChhZGRyKSwgImkiIChBU0lfRENBQ0hFX1RBRykpOwotCV9fYXNtX18gX192b2xhdGlsZV9fICgibWVtYmFyICNTeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiAKIC8qIFRoZSBpbnN0cnVjdGlvbiBjYWNoZSBsaW5lcyBhcmUgZmx1c2hlZCB3aXRoIHRoaXMsIGJ1dCBub3RlIHRoYXQKQEAgLTE5NCw5MCArMTQ3LDYgQEAKIAkJCSAgICAgICAiaSIgKEFTSV9JVExCX0RBVEFfQUNDRVNTKSk7CiB9CiAKLS8qIFNwaXRmaXJlIGhhcmR3YXJlIGFzc2lzdGVkIFRMQiBmbHVzaGVzLiAqLwotCi0vKiBDb250ZXh0IGxldmVsIGZsdXNoZXMuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNwaXRmaXJlX2ZsdXNoX2R0bGJfcHJpbWFyeV9jb250ZXh0KHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJSVnMCwgWyUwXSAlMVxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N5bmMiCi0JCQkgICAgIDogLyogTm8gb3V0cHV0cyAqLwotCQkJICAgICA6ICJyIiAoMHg0MCksICJpIiAoQVNJX0RNTVVfREVNQVApKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9pdGxiX3ByaW1hcnlfY29udGV4dCh2b2lkKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhCSUlZzAsIFslMF0gJTFcblx0IgotCQkJICAgICAibWVtYmFyCSNTeW5jIgotCQkJICAgICA6IC8qIE5vIG91dHB1dHMgKi8KLQkJCSAgICAgOiAiciIgKDB4NDApLCAiaSIgKEFTSV9JTU1VX0RFTUFQKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3BpdGZpcmVfZmx1c2hfZHRsYl9zZWNvbmRhcnlfY29udGV4dCh2b2lkKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhCSUlZzAsIFslMF0gJTFcblx0IgotCQkJICAgICAibWVtYmFyCSNTeW5jIgotCQkJICAgICA6IC8qIE5vIG91dHB1dHMgKi8KLQkJCSAgICAgOiAiciIgKDB4NTApLCAiaSIgKEFTSV9ETU1VX0RFTUFQKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3BpdGZpcmVfZmx1c2hfaXRsYl9zZWNvbmRhcnlfY29udGV4dCh2b2lkKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhCSUlZzAsIFslMF0gJTFcblx0IgotCQkJICAgICAibWVtYmFyCSNTeW5jIgotCQkJICAgICA6IC8qIE5vIG91dHB1dHMgKi8KLQkJCSAgICAgOiAiciIgKDB4NTApLCAiaSIgKEFTSV9JTU1VX0RFTUFQKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3BpdGZpcmVfZmx1c2hfZHRsYl9udWNsZXVzX2NvbnRleHQodm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YQklJWcwLCBbJTBdICUxXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3luYyIKLQkJCSAgICAgOiAvKiBObyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiICgweDYwKSwgImkiIChBU0lfRE1NVV9ERU1BUCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNwaXRmaXJlX2ZsdXNoX2l0bGJfbnVjbGV1c19jb250ZXh0KHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJSVnMCwgWyUwXSAlMVxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N5bmMiCi0JCQkgICAgIDogLyogTm8gb3V0cHV0cyAqLwotCQkJICAgICA6ICJyIiAoMHg2MCksICJpIiAoQVNJX0lNTVVfREVNQVApKTsKLX0KLQotLyogUGFnZSBsZXZlbCBmbHVzaGVzLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9kdGxiX3ByaW1hcnlfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJSVnMCwgWyUwXSAlMVxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N5bmMiCi0JCQkgICAgIDogLyogTm8gb3V0cHV0cyAqLwotCQkJICAgICA6ICJyIiAocGFnZSksICJpIiAoQVNJX0RNTVVfREVNQVApKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9pdGxiX3ByaW1hcnlfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJSVnMCwgWyUwXSAlMVxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N5bmMiCi0JCQkgICAgIDogLyogTm8gb3V0cHV0cyAqLwotCQkJICAgICA6ICJyIiAocGFnZSksICJpIiAoQVNJX0lNTVVfREVNQVApKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9kdGxiX3NlY29uZGFyeV9wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZSkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YQklJWcwLCBbJTBdICUxXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3luYyIKLQkJCSAgICAgOiAvKiBObyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiIChwYWdlIHwgMHgxMCksICJpIiAoQVNJX0RNTVVfREVNQVApKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9pdGxiX3NlY29uZGFyeV9wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZSkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YQklJWcwLCBbJTBdICUxXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3luYyIKLQkJCSAgICAgOiAvKiBObyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiIChwYWdlIHwgMHgxMCksICJpIiAoQVNJX0lNTVVfREVNQVApKTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCBzcGl0ZmlyZV9mbHVzaF9kdGxiX251Y2xldXNfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJSVnMCwgWyUwXSAlMVxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaAppbmRleCBmOWJlMmM1Li5lZTRiZGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKQEAgLTE5MCwyNCArMTkwLDIzIEBACiAJIndycHIJJSVnMSwgJSVjd3Bcblx0IgkJCQkJXAogCSJsZHgJWyUlZzYgKyAlM10sICUlbzZcblx0IgkJCQkJXAogCSJsZHViCVslJWc2ICsgJTJdLCAlJW81XG5cdCIJCQkJCVwKLQkibGR4CVslJWc2ICsgJTRdLCAlJW83XG5cdCIJCQkJCVwKKwkibGR1YglbJSVnNiArICU0XSwgJSVvN1xuXHQiCQkJCQlcCiAJIm1vdgklJWc2LCAlJWwyXG5cdCIJCQkJCQlcCiAJIndycHIJJSVvNSwgMHgwLCAlJXdzdGF0ZVxuXHQiCQkJCVwKIAkibGR4CVslJXNwICsgMjA0NyArIDB4NzBdLCAlJWk2XG5cdCIJCQkJXAogCSJsZHgJWyUlc3AgKyAyMDQ3ICsgMHg3OF0sICUlaTdcblx0IgkJCQlcCiAJIndycHIJJSVnMCwgMHg5NCwgJSVwc3RhdGVcblx0IgkJCQlcCiAJIm1vdgklJWwyLCAlJWc2XG5cdCIJCQkJCQlcCi0JImxkeAlbJSVnNiArICU3XSwgJSVnNFxuXHQiCQkJCQlcCisJImxkeAlbJSVnNiArICU2XSwgJSVnNFxuXHQiCQkJCQlcCiAJIndycHIJJSVnMCwgMHg5NiwgJSVwc3RhdGVcblx0IgkJCQlcCi0JImFuZGNjCSUlbzcsICU2LCAlJWcwXG5cdCIJCQkJCVwKLQkiYmVxLHB0ICUlaWNjLCAxZlxuXHQiCQkJCQkJXAorCSJicnoscHQgJSVvNywgMWZcblx0IgkJCQkJCVwKIAkiIG1vdgklJWc3LCAlMFxuXHQiCQkJCQkJXAogCSJiLGEgcmV0X2Zyb21fc3lzY2FsbFxuXHQiCQkJCQlcCiAJIjE6XG5cdCIJCQkJCQkJXAogCTogIj0mciIgKGxhc3QpCQkJCQkJCVwKIAk6ICIwIiAobmV4dC0+dGhyZWFkX2luZm8pLAkJCQkJXAotCSAgImkiIChUSV9XU1RBVEUpLCAiaSIgKFRJX0tTUCksICJpIiAoVElfRkxBR1MpLCAiaSIgKFRJX0NXUCksCVwKLQkgICJpIiAoX1RJRl9ORVdDSElMRCksICJpIiAoVElfVEFTSykJCQkJXAorCSAgImkiIChUSV9XU1RBVEUpLCAiaSIgKFRJX0tTUCksICJpIiAoVElfTkVXX0NISUxEKSwgICAgICAgICAgICBcCisJICAiaSIgKFRJX0NXUCksICJpIiAoVElfVEFTSykJCQkJCVwKIAk6ICJjYyIsCQkJCQkJCQlcCiAJICAgICAgICAiZzEiLCAiZzIiLCAiZzMiLCAgICAgICAgICAgICAgICAgICAiZzciLAkJXAogCSAgICAgICAgICAgICAgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaAppbmRleCAwY2Q2NTI5Li4zNTJkOTk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aHJlYWRfaW5mby5oCkBAIC00Nyw3ICs0Nyw5IEBACiAJc3RydWN0IHB0X3JlZ3MJCSprcmVnczsKIAlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwogCWludAkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwotCWludAkJCV9fcGFkOworCV9fdTgJCQluZXdfY2hpbGQ7CisJX191OAkJCXN5c2NhbGxfbm9lcnJvcjsKKwlfX3UxNgkJCV9fcGFkOwogCiAJdW5zaWduZWQgbG9uZwkJKnV0cmFwczsKIApAQCAtODcsNiArODksOCBAQAogI2RlZmluZSBUSV9LUkVHUwkweDAwMDAwMDI4CiAjZGVmaW5lIFRJX0VYRUNfRE9NQUlOCTB4MDAwMDAwMzAKICNkZWZpbmUgVElfUFJFX0NPVU5UCTB4MDAwMDAwMzgKKyNkZWZpbmUgVElfTkVXX0NISUxECTB4MDAwMDAwM2MKKyNkZWZpbmUgVElfU1lTX05PRVJST1IJMHgwMDAwMDAzZAogI2RlZmluZSBUSV9VVFJBUFMJMHgwMDAwMDA0MAogI2RlZmluZSBUSV9SRUdfV0lORE9XCTB4MDAwMDAwNDgKICNkZWZpbmUgVElfUldJTl9TUFRSUwkweDAwMDAwM2M4CQpAQCAtMjE5LDE2ICsyMjMsMTcgQEAKICNkZWZpbmUgVElGX1VOQUxJR05FRAkJNQkvKiBhbGxvd2VkIHRvIGRvIHVuYWxpZ25lZCBhY2Nlc3NlcyAqLwogI2RlZmluZSBUSUZfTkVXU0lHTkFMUwkJNgkvKiB3YW50cyBuZXctc3R5bGUgc2lnbmFscyAqLwogI2RlZmluZSBUSUZfMzJCSVQJCTcJLyogMzItYml0IGJpbmFyeSAqLwotI2RlZmluZSBUSUZfTkVXQ0hJTEQJCTgJLyoganVzdC1zcGF3bmVkIGNoaWxkIHByb2Nlc3MgKi8KLS8qIFRJRl8qIHZhbHVlIDkgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxMAotI2RlZmluZSBUSUZfU1lTQ0FMTF9TVUNDRVNTCTExCisvKiBmbGFnIGJpdCA4IGlzIGF2YWlsYWJsZSAqLworI2RlZmluZSBUSUZfU0VDQ09NUAkJOQkvKiBzZWN1cmUgY29tcHV0aW5nICovCisjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTEwCS8qIHN5c2NhbGwgYXVkaXRpbmcgYWN0aXZlICovCisvKiBmbGFnIGJpdCAxMSBpcyBhdmFpbGFibGUgKi8KIC8qIE5PVEU6IFRocmVhZCBmbGFncyA+PSAxMiBzaG91bGQgYmUgb25lcyB3ZSBoYXZlIG5vIGludGVyZXN0CiAgKiAgICAgICBpbiB1c2luZyBpbiBhc3NlbWJseSwgZWxzZSB3ZSBjYW4ndCB1c2UgdGhlIG1hc2sgYXMKICAqICAgICAgIGFuIGltbWVkaWF0ZSB2YWx1ZSBpbiBpbnN0cnVjdGlvbnMgc3VjaCBhcyBhbmRjYy4KICAqLwogI2RlZmluZSBUSUZfQUJJX1BFTkRJTkcJCTEyCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTEzCisjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNAogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0yMzgsMTAgKzI0MywxMCBAQAogI2RlZmluZSBfVElGX1VOQUxJR05FRAkJKDE8PFRJRl9VTkFMSUdORUQpCiAjZGVmaW5lIF9USUZfTkVXU0lHTkFMUwkJKDE8PFRJRl9ORVdTSUdOQUxTKQogI2RlZmluZSBfVElGXzMyQklUCQkoMTw8VElGXzMyQklUKQotI2RlZmluZSBfVElGX05FV0NISUxECQkoMTw8VElGX05FV0NISUxEKQotI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisjZGVmaW5lIF9USUZfU0VDQ09NUAkJKDE8PFRJRl9TRUNDT01QKQorI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDE8PFRJRl9TWVNDQUxMX0FVRElUKQogI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCi0jZGVmaW5lIF9USUZfU1lTQ0FMTF9TVUNDRVNTCSgxPDxUSUZfU1lTQ0FMTF9TVUNDRVNTKQorI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAKICNkZWZpbmUgX1RJRl9VU0VSX1dPUktfTUFTSwkoKDB4ZmYgPDwgVElfRkxBR19XU0FWRURfU0hJRlQpIHwgXAogCQkJCSAoX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9TSUdQRU5ESU5HIHwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC90aW1lci5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aW1lci5oCmluZGV4IGJhMzNhMmIuLmVkYzhlMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3RpbWVyLmgKQEAgLTksNDkgKzksOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotLyogSG93IHRpbWVycyB3b3JrOgotICoKLSAqIE9uIHVuaXByb2Nlc3NvcnMgd2UganVzdCB1c2UgY291bnRlciB6ZXJvIGZvciB0aGUgc3lzdGVtIHdpZGUKLSAqIHRpY2tlciwgdGhpcyBwZXJmb3JtcyB0aHJlYWQgc2NoZWR1bGluZywgY2xvY2sgYm9vayBrZWVwaW5nLAotICogYW5kIHJ1bnMgdGltZXIgYmFzZWQgZXZlbnRzLiAgUHJldmlvdXNseSB3ZSB1c2VkIHRoZSBVbHRyYQotICogJXRpY2sgaW50ZXJydXB0IGZvciB0aGlzIHB1cnBvc2UuCi0gKgotICogT24gbXVsdGlwcm9jZXNzb3JzIHdlIHBpY2sgb25lIGNwdSBhcyB0aGUgbWFzdGVyIGxldmVsIDEwIHRpY2sKLSAqIHByb2Nlc3Nvci4gIEhlcmUgdGhpcyBjb3VudGVyIHplcm8gdGljayBoYW5kbGVzIGNsb2NrIGJvb2sKLSAqIGtlZXBpbmcgYW5kIHRpbWVyIGV2ZW50cyBvbmx5LiAgRWFjaCBVbHRyYSBoYXMgaXQncyBsZXZlbAotICogMTQgJXRpY2sgaW50ZXJydXB0IHNldCB0byBmaXJlIG9mZiBhcyB3ZWxsLCBldmVuIHRoZSBtYXN0ZXIKLSAqIHRpY2sgY3B1IHJ1bnMgdGhpcyBsb2NhbGx5LiAgVGhpcyB0aWNrZXIgcGVyZm9ybXMgdGhyZWFkCi0gKiBzY2hlZHVsaW5nLCBzeXN0ZW0vdXNlciB0aWNrIGNvdW50aW5nIGZvciB0aGUgY3VycmVudCB0aHJlYWQsCi0gKiBhbmQgYWxzbyBwcm9maWxpbmcgaWYgZW5hYmxlZC4KLSAqLwotCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLS8qIFR3byB0aW1lcnMsIHRyYWRpdGlvbmFsbHkgc3RlZXJlZCB0byBQSUwncyAxMCBhbmQgMTQgcmVzcGVjdGl2ZWx5LgotICogQnV0IHNpbmNlIElOTyBwYWNrZXRzIGFyZSB1c2VkIG9uIHN1bjUsIHdlIGNvdWxkIHVzZSBhbnkgUElMIGxldmVsCi0gKiB3ZSBsaWtlLCBob3dldmVyIGZvciBub3cgd2UgdXNlIHRoZSBub3JtYWwgb25lcy4KLSAqCi0gKiBUaGUgJ3JlZycgYW5kICdpbnRlcnJ1cHRzJyBwcm9wZXJ0aWVzIGZvciB0aGVzZSBsaXZlIGluIG5vZGVzIG5hbWVkCi0gKiAnY291bnRlci10aW1lcicuICBUaGUgZmlyc3Qgb2YgdGhyZWUgJ3JlZycgcHJvcGVydGllcyBkZXNjcmliZSB3aGVyZQotICogdGhlIHN1bjVfdGltZXIgcmVnaXN0ZXJzIGFyZS4gIFRoZSBvdGhlciB0d28gSSBoYXZlIG5vIGlkZWEuIChYWFgpCi0gKi8KLXN0cnVjdCBzdW41X3RpbWVyIHsKLQl1NjQJY291bnQwOwotCXU2NAlsaW1pdDA7Ci0JdTY0CWNvdW50MTsKLQl1NjQJbGltaXQxOwotfTsKLQotI2RlZmluZSBTVU41X0xJTUlUX0VOQUJMRQkweDgwMDAwMDAwCi0jZGVmaW5lIFNVTjVfTElNSVRfVE9aRVJPCTB4NDAwMDAwMDAKLSNkZWZpbmUgU1VONV9MSU1JVF9aUkVTVEFSVAkweDIwMDAwMDAwCi0jZGVmaW5lIFNVTjVfTElNSVRfQ01BU0sJMHgxZmZmZmZmZgotCi0vKiBHaXZlbiBhIEhaIHZhbHVlLCBzZXQgdGhlIGxpbWl0IHJlZ2lzdGVyIHRvIHNvIHRoYXQgdGhlIHRpbWVyIElSUQotICogZ2V0cyBkZWxpdmVyZWQgdGhhdCBvZnRlbi4KLSAqLwotI2RlZmluZSBTVU41X0haX1RPX0xJTUlUKF9faHopICAoMTAwMDAwMC8oX19oeikpCi0KIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHsKIAl2b2lkICgqaW5pdF90aWNrKSh1bnNpZ25lZCBsb25nKTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X3RpY2spKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKaW5kZXggNWI4ZGNmNS4uZjU5MTQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCkBAIC0yMTIsNyArMjEyLDcgQEAKICNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUgICAgICAgMTkzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9lcG9sbF9jdGwgICAgICAgICAgMTk0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9lcG9sbF93YWl0ICAgICAgICAgMTk1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl91bGltaXQgICAgICAgICAgMTk2ICAgIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0ICAgICAgICAgMTk2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9nZXRwcGlkICAgICAgICAgICAgMTk3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zaWdhY3Rpb24gICAgICAgICAgMTk4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zZ2V0bWFzayAgICAgICAgICAgMTk5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzNCw3ICsyMzQsNyBAQAogI2RlZmluZSBfX05SX2lwYyAgICAgICAgICAgICAgICAyMTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ3JldHVybiAgICAgICAgICAyMTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Nsb25lICAgICAgICAgICAgICAyMTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX21vZGlmeV9sZHQgICAgICAyMTggICAgTGludXggU3BlY2lmaWMgLSBpMzg2IHNwZWNpZmljLCB1bnVzZWQgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19nZXQgICAgICAgICAyMTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2FkanRpbWV4ICAgICAgICAgICAyMTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrICAgICAgICAyMjAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUgICAgICAyMjEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vbGR0LmggYi9pbmNsdWRlL2FzbS11bS9sZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA4NDM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vbGR0LmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIF9fVU1fTERUX0gKKyNkZWZpbmUgX19VTV9MRFRfSAorCisjaW5jbHVkZSAiYXNtL2FyY2gvbGR0LmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oCmluZGV4IDg5YmZmMzEuLjA5NWJiNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tdW0vbW11X2NvbnRleHQuaApAQCAtNywxOSArNywyMyBAQAogI2RlZmluZSBfX1VNX01NVV9DT05URVhUX0gKIAogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCisjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKKyNpbmNsdWRlICJ1bV9tbXUuaCIKIAogI2RlZmluZSBnZXRfbW11X2NvbnRleHQodGFzaykgZG8gOyB3aGlsZSgwKQogI2RlZmluZSBhY3RpdmF0ZV9jb250ZXh0KHRzaykgZG8gOyB3aGlsZSgwKQogCiAjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLG1tKQlkbyB7IH0gd2hpbGUgKDApCiAKK2V4dGVybiB2b2lkIGZvcmNlX2ZsdXNoX2FsbCh2b2lkKTsKKwogc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZCwgc3RydWN0IG1tX3N0cnVjdCAqbmV3KQogeworCWlmIChvbGQgIT0gbmV3KQorCQlmb3JjZV9mbHVzaF9hbGwoKTsKIH0KIAotZXh0ZXJuIHZvaWQgc3dpdGNoX21tX3NrYXMoaW50IG1tX2ZkKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LCAKIAkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CkBAIC0zMCw3ICszNCw3IEBACiAJCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CiAJCWlmKG5leHQgIT0gJmluaXRfbW0pCiAJCQlDSE9PU0VfTU9ERSgodm9pZCkgMCwgCi0JCQkJICAgIHN3aXRjaF9tbV9za2FzKG5leHQtPmNvbnRleHQuc2thcy5tbV9mZCkpOworCQkJCSAgICBzd2l0Y2hfbW1fc2thcygmbmV4dC0+Y29udGV4dC5za2FzLmlkKSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmgKaW5kZXggZDNhZWRiNy4uNGRmNWU3MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmgKQEAgLTEsOCArMSw4IEBACiAvKgogICogaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oIC0tIENoZWNrc3VtIG9wcwogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIE5FQyBDb3Jwb3JhdGlvbgotICogIENvcHlyaWdodCAoQykgMjAwMSAgTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDUgIE5FQyBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoQykgMjAwMSwyMDA1ICBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCiAgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCkBAIC0zNiw4ICszNiw4IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weSAoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJICAgdW5zaWduZWQgc3VtKTsKK2V4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weSAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgc3VtKTsKIAogCiAvKgpAQCAtNDYsNyArNDYsOCBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKK2V4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKKwkJCQkJICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCiAJCQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgc3VtLAogCQkJCQkgICAgIGludCAqY3N1bV9lcnIpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL21tdS5oIGIvaW5jbHVkZS9hc20tdjg1MC9tbXUuaAppbmRleCBlMzBhNTJiLi4yNjc3NjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvbW11LmgKQEAgLTEsMjIgKzEsMTEgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4gKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSwgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4gKi8KIAogI2lmbmRlZiBfX1Y4NTBfTU1VX0hfXwogI2RlZmluZSBfX1Y4NTBfTU1VX0hfXwogCi1zdHJ1Y3QgbW1fcmJsb2NrX3N0cnVjdCB7Ci0JaW50CQlzaXplOwotCWludAkJcmVmY291bnQ7Ci0Jdm9pZAkqa2Jsb2NrOwotfTsKLQotc3RydWN0IG1tX3RibG9ja19zdHJ1Y3QgewotCXN0cnVjdCBtbV9yYmxvY2tfc3RydWN0CSpyYmxvY2s7Ci0Jc3RydWN0IG1tX3RibG9ja19zdHJ1Y3QJKm5leHQ7Ci19OwotCiB0eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IG1tX3RibG9ja19zdHJ1Y3QJdGJsb2NrOwotCXVuc2lnbmVkIGxvbmcJCQllbmRfYnJrOworCXN0cnVjdCB2bV9saXN0X3N0cnVjdAkqdm1saXN0OworCXVuc2lnbmVkIGxvbmcJCWVuZF9icms7CiB9IG1tX2NvbnRleHRfdDsKIAogI2VuZGlmIC8qIF9fVjg1MF9NTVVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3BjaS5oIGIvaW5jbHVkZS9hc20tdjg1MC9wY2kuaAppbmRleCBlNDE5NDE0Li44ZTc5YmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvcGNpLmgKQEAgLTgxLDYgKzgxLDE2IEBACiBwY2lfZnJlZV9jb25zaXN0ZW50IChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAogCQkgICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggYTZiNDFiOC4uZGM4Yzk4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0yOCw2ICsyOCw4IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhY3BpL3BkY19pbnRlbC5oPgorCiAjZGVmaW5lIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCAgIGxvbmcgbG9uZwogI2RlZmluZSBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcKIApAQCAtOTksMTIgKzEwMSw2IEBACiAgICAgICAgIDoiPXIiKG5faGkpLCAiPXIiKG5fbG8pICAgICBcCiAgICAgICAgIDoiMCIobl9oaSksICIxIihuX2xvKSkKIAotLyoKLSAqIFJlZmVyIEludGVsIEFDUEkgX1BEQyBzdXBwb3J0IGRvY3VtZW50IGZvciBiaXQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAgCTB4YQotI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9NU1IJMHgxCi0KICNpZmRlZiBDT05GSUdfQUNQSV9CT09UCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKaW5kZXggMzI1NzM3NC4uYThiYWJkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCkBAIC0yMTcsNCArMjE3LDYgQEAKIAogdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KTsKIAorZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oCmluZGV4IDg3MTI1MjAuLmVlYjMwODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLmgKQEAgLTMzLDcgKzMzLDcgQEAKIGV4dGVybiBpbnQgKCpwY2lfY29uZmlnX3dyaXRlKShpbnQgc2VnLCBpbnQgYnVzLCBpbnQgZGV2LCBpbnQgZm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSk7CiAKIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUodm9pZCk7CiBpbnQgcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbiwgaW50IGlycSk7CiAKQEAgLTEyMyw2ICsxMjMsMTYgQEAKIAlmbHVzaF93cml0ZV9idWZmZXJzKCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKICNkZWZpbmUgSEFWRV9QQ0lfTU1BUAogZXh0ZXJuIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAppbmRleCBmMmYwNzM2Li42YzgxM2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtMTUsNiArMTUsMTMgQEAKIGV4dGVybiB2b2lkIGVhcmx5X2lkdF9oYW5kbGVyKHZvaWQpOwogCiBleHRlcm4gdm9pZCBtY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworI2lmZGVmIENPTkZJR19NVFJSCitleHRlcm4gdm9pZCBtdHJyX2FwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtdHJyX2JwX2luaXQodm9pZCk7CisjZWxzZQorI2RlZmluZSBtdHJyX2FwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXRycl9icF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKIGV4dGVybiB2b2lkIGluaXRfbWVtb3J5X21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCiBleHRlcm4gdm9pZCBzeXN0ZW1fY2FsbCh2b2lkKTsgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc2VyaWFsLmgKaW5kZXggZGJhYjIzMi4uZGM3NTJlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zZXJpYWwuaApAQCAtMjIsMTA5ICsyMiw5IEBACiAjZGVmaW5lIFNURF9DT000X0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEZPVVJQT1JUX0ZMQUdTIEFTWU5DX0ZPVVJQT1JUCi0jZGVmaW5lIEFDQ0VOVF9GTEFHUyAwCi0jZGVmaW5lIEJPQ0FfRkxBR1MgMAotI2RlZmluZSBIVUI2X0ZMQUdTIDAKLSNlbmRpZgotCi0jZGVmaW5lIE1DQV9DT01fRkxBR1MJKFNURF9DT01fRkxBR1N8QVNZTkNfQk9PVF9PTkxZTUNBKQotCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGFjY2VzcyBtZXRob2RzIGZvciB0aGUgSFVCNiBjYXJkLiBBbGwKLSAqIGFjY2VzcyBpcyB0aHJvdWdoIHR3byBwb3J0cyBmb3IgYWxsIDI0IHBvc3NpYmxlIGNoaXBzLiBUaGUgY2FyZCBpcwotICogc2VsZWN0ZWQgdGhyb3VnaCB0aGUgaGlnaCAyIGJpdHMsIHRoZSBwb3J0IG9uIHRoYXQgY2FyZCB3aXRoIHRoZQotICogIm1pZGRsZSIgMyBiaXRzLCBhbmQgdGhlIHJlZ2lzdGVyIG9uIHRoYXQgcG9ydCB3aXRoIHRoZSBib3R0b20KLSAqIDMgYml0cy4KLSAqCi0gKiBXaGlsZSB0aGUgYWNjZXNzIHBvcnQgYW5kIGludGVycnVwdCBpcyBjb25maWd1cmFibGUsIHRoZSBkZWZhdWx0Ci0gKiBwb3J0IGxvY2F0aW9ucyBhcmUgMHgzMDIgZm9yIHRoZSBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIsIGFuZCAweDMwMwotICogZm9yIHRoZSBkYXRhIHJlYWQvd3JpdGUgcmVnaXN0ZXIuIE5vcm1hbGx5LCB0aGUgaW50ZXJydXB0IGlzIGF0IGlycTMKLSAqIGJ1dCBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIHRvIDcgaW5jbHVzaXZlLiBOb3RlIHRoYXQgdXNpbmcgMyB3aWxsCi0gKiByZXF1aXJlIGRpc2FibGluZyBjb20yLgotICovCi0KLSNkZWZpbmUgQ19QKGNhcmQscG9ydCkgKCgoY2FyZCk8PDZ8KHBvcnQpPDwzKSArIDEpCi0KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMSAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotLyogWW91IGNhbiBoYXZlIHVwIHRvIGZvdXIgSFVCNidzIGluIHRoZSBzeXN0ZW0sIGJ1dCBJJ3ZlIG9ubHkKLSAqIGluY2x1ZGVkIHR3byBjYXJkcyBoZXJlIGZvciBhIHRvdGFsIG9mIHR3ZWx2ZSBwb3J0cy4KLSAqLwotI2lmIChkZWZpbmVkKENPTkZJR19IVUI2KSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUykpCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMCkgfSwgIC8qIHR0eVMzMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwxKSB9LCAgLyogdHR5UzMzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDIpIH0sICAvKiB0dHlTMzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMykgfSwgIC8qIHR0eVMzNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw0KSB9LCAgLyogdHR5UzM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDUpIH0sICAvKiB0dHlTMzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMCkgfSwgIC8qIHR0eVMzOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwxKSB9LCAgLyogdHR5UzM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDIpIH0sICAvKiB0dHlTNDAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMykgfSwgIC8qIHR0eVM0MSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw0KSB9LCAgLyogdHR5UzQyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDUpIH0sICAvKiB0dHlTNDMgKi8KLSNlbHNlCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUNBCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwKLSNlbHNlCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCi0jZW5kaWYKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCVwKLQlIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQlNQ0FfU0VSSUFMX1BPUlRfREZOUwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCmluZGV4IDJlODExYWMuLjA2MTc0MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCkBAIC0yMiwxNiArMjIsMTggQEAKICAqLwogI2RlZmluZSBfX2ZsdXNoX3RsYl9nbG9iYWwoKQkJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgdG1wcmVnOwkJCQkJXAorCQl1bnNpZ25lZCBsb25nIHRtcHJlZywgY3I0LCBjcjRfb3JpZzsJCQlcCiAJCQkJCQkJCQlcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIm1vdnEgJTEsICUlY3I0OyAgIyB0dXJuIG9mZiBQR0UgICAgIFxuIglcCisJCQkibW92cSAlJWNyNCwgJTI7ICAjIHR1cm4gb2ZmIFBHRSAgICAgXG4iCVwKKwkJCSJtb3ZxICUyLCAlMTsgICAgICAgICAgICAgICAgICAgICAgICBcbiIJXAorCQkJImFuZHEgJTMsICUxOyAgICAgICAgICAgICAgICAgICAgICAgIFxuIglcCisJCQkibW92cSAlMSwgJSVjcjQ7ICAgICAgICAgICAgICAgICAgICAgXG4iCVwKIAkJCSJtb3ZxICUlY3IzLCAlMDsgICMgZmx1c2ggVExCICAgICAgICBcbiIJXAogCQkJIm1vdnEgJTAsICUlY3IzOyAgICAgICAgICAgICAgICAgICAgIFxuIglcCiAJCQkibW92cSAlMiwgJSVjcjQ7ICAjIHR1cm4gUEdFIGJhY2sgb24gXG4iCVwKLQkJCTogIj0mciIgKHRtcHJlZykJCQkJXAotCQkJOiAiciIgKG1tdV9jcjRfZmVhdHVyZXMgJiB+WDg2X0NSNF9QR0UpLAlcCi0JCQkgICJyIiAobW11X2NyNF9mZWF0dXJlcykJCQlcCisJCQk6ICI9JnIiICh0bXByZWcpLCAiPSZyIiAoY3I0KSwgIj0mciIgKGNyNF9vcmlnKQlcCisJCQk6ICJpIiAoflg4Nl9DUjRfUEdFKQkJCQlcCiAJCQk6ICJtZW1vcnkiKTsJCQkJCVwKIAl9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKaW5kZXggZDc2N2FkYy4uNjU2MDQzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaApAQCAtNTYxLDggKzU2MSwxMiBAQAogX19TWVNDQUxMKF9fTlJfcmVxdWVzdF9rZXksIHN5c19yZXF1ZXN0X2tleSkKICNkZWZpbmUgX19OUl9rZXljdGwJCTI1MAogX19TWVNDQUxMKF9fTlJfa2V5Y3RsLCBzeXNfa2V5Y3RsKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI1MQorX19TWVNDQUxMKF9fTlJfaW9wcmlvX3NldCwgc3lzX2lvcHJpb19zZXQpCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjUyCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCkKIAotI2RlZmluZSBfX05SX3N5c2NhbGxfbWF4IF9fTlJfa2V5Y3RsCisjZGVmaW5lIF9fTlJfc3lzY2FsbF9tYXggX19OUl9pb3ByaW9fZ2V0CiAjaWZuZGVmIF9fTk9fU1RVQlMKIAogLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC00MDk1ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCmluZGV4IDYzNTljNTUuLjBhMTIzZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCkBAIC0yMSw3ICsyMSw3IEBACiBleHRlcm4gX19pbmxpbmVfXyB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKIHsKICAgLyogMiBjeWNsZXMgcGVyIGxvb3AuICovCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgiMTogYWRkaSAlMCwgJTAsIC0yOyBiZ2V1aSAlMCwgMSwgMWIiCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiMTogYWRkaSAlMCwgJTAsIC0yOyBiZ2V1aSAlMCwgMiwgMWIiCiAJCQk6ICI9ciIgKGxvb3BzKSA6ICIwIiAobG9vcHMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Vycm5vLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaAppbmRleCBjZWQ1MTk0Li5hMGYzYjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaApAQCAtMTEsMTMyICsxMSw2IEBACiAjaWZuZGVmIF9YVEVOU0FfRVJSTk9fSAogI2RlZmluZSBfWFRFTlNBX0VSUk5PX0gKIAotI2RlZmluZQlFUEVSTQkJIDEJLyogT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgKi8KLSNkZWZpbmUJRU5PRU5UCQkgMgkvKiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCi0jZGVmaW5lCUVTUkNICQkgMwkvKiBObyBzdWNoIHByb2Nlc3MgKi8KLSNkZWZpbmUJRUlOVFIJCSA0CS8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lCUVJTwkJIDUJLyogSS9PIGVycm9yICovCi0jZGVmaW5lCUVOWElPCQkgNgkvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCi0jZGVmaW5lCUUyQklHCQkgNwkvKiBBcmcgbGlzdCB0b28gbG9uZyAqLwotI2RlZmluZQlFTk9FWEVDCQkgOAkvKiBFeGVjIGZvcm1hdCBlcnJvciAqLwotI2RlZmluZQlFQkFERgkJIDkJLyogQmFkIGZpbGUgbnVtYmVyICovCi0jZGVmaW5lCUVDSElMRAkJMTAJLyogTm8gY2hpbGQgcHJvY2Vzc2VzICovCi0jZGVmaW5lCUVBR0FJTgkJMTEJLyogVHJ5IGFnYWluICovCi0jZGVmaW5lCUVOT01FTQkJMTIJLyogT3V0IG9mIG1lbW9yeSAqLwotI2RlZmluZQlFQUNDRVMJCTEzCS8qIFBlcm1pc3Npb24gZGVuaWVkICovCi0jZGVmaW5lCUVGQVVMVAkJMTQJLyogQmFkIGFkZHJlc3MgKi8KLSNkZWZpbmUJRU5PVEJMSwkJMTUJLyogQmxvY2sgZGV2aWNlIHJlcXVpcmVkICovCi0jZGVmaW5lCUVCVVNZCQkxNgkvKiBEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeSAqLwotI2RlZmluZQlFRVhJU1QJCTE3CS8qIEZpbGUgZXhpc3RzICovCi0jZGVmaW5lCUVYREVWCQkxOAkvKiBDcm9zcy1kZXZpY2UgbGluayAqLwotI2RlZmluZQlFTk9ERVYJCTE5CS8qIE5vIHN1Y2ggZGV2aWNlICovCi0jZGVmaW5lCUVOT1RESVIJCTIwCS8qIE5vdCBhIGRpcmVjdG9yeSAqLwotI2RlZmluZQlFSVNESVIJCTIxCS8qIElzIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lCUVJTlZBTAkJMjIJLyogSW52YWxpZCBhcmd1bWVudCAqLwotI2RlZmluZQlFTkZJTEUJCTIzCS8qIEZpbGUgdGFibGUgb3ZlcmZsb3cgKi8KLSNkZWZpbmUJRU1GSUxFCQkyNAkvKiBUb28gbWFueSBvcGVuIGZpbGVzICovCi0jZGVmaW5lCUVOT1RUWQkJMjUJLyogTm90IGEgdHlwZXdyaXRlciAqLwotI2RlZmluZQlFVFhUQlNZCQkyNgkvKiBUZXh0IGZpbGUgYnVzeSAqLwotI2RlZmluZQlFRkJJRwkJMjcJLyogRmlsZSB0b28gbGFyZ2UgKi8KLSNkZWZpbmUJRU5PU1BDCQkyOAkvKiBObyBzcGFjZSBsZWZ0IG9uIGRldmljZSAqLwotI2RlZmluZQlFU1BJUEUJCTI5CS8qIElsbGVnYWwgc2VlayAqLwotI2RlZmluZQlFUk9GUwkJMzAJLyogUmVhZC1vbmx5IGZpbGUgc3lzdGVtICovCi0jZGVmaW5lCUVNTElOSwkJMzEJLyogVG9vIG1hbnkgbGlua3MgKi8KLSNkZWZpbmUJRVBJUEUJCTMyCS8qIEJyb2tlbiBwaXBlICovCi0jZGVmaW5lCUVET00JCTMzCS8qIE1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jICovCi0jZGVmaW5lCUVSQU5HRQkJMzQJLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUgKi8KLSNkZWZpbmUJRURFQURMSwkJMzUJLyogUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIgKi8KLSNkZWZpbmUJRU5BTUVUT09MT05HCTM2CS8qIEZpbGUgbmFtZSB0b28gbG9uZyAqLwotI2RlZmluZQlFTk9MQ0sJCTM3CS8qIE5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUJRU5PU1lTCQkzOAkvKiBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KLSNkZWZpbmUJRU5PVEVNUFRZCTM5CS8qIERpcmVjdG9yeSBub3QgZW1wdHkgKi8KLSNkZWZpbmUJRUxPT1AJCTQwCS8qIFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkICovCi0jZGVmaW5lCUVXT1VMREJMT0NLCUVBR0FJTgkvKiBPcGVyYXRpb24gd291bGQgYmxvY2sgKi8KLSNkZWZpbmUJRU5PTVNHCQk0MgkvKiBObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSAqLwotI2RlZmluZQlFSURSTQkJNDMJLyogSWRlbnRpZmllciByZW1vdmVkICovCi0jZGVmaW5lCUVDSFJORwkJNDQJLyogQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlICovCi0jZGVmaW5lCUVMMk5TWU5DCTQ1CS8qIExldmVsIDIgbm90IHN5bmNocm9uaXplZCAqLwotI2RlZmluZQlFTDNITFQJCTQ2CS8qIExldmVsIDMgaGFsdGVkICovCi0jZGVmaW5lCUVMM1JTVAkJNDcJLyogTGV2ZWwgMyByZXNldCAqLwotI2RlZmluZQlFTE5STkcJCTQ4CS8qIExpbmsgbnVtYmVyIG91dCBvZiByYW5nZSAqLwotI2RlZmluZQlFVU5BVENICQk0OQkvKiBQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkICovCi0jZGVmaW5lCUVOT0NTSQkJNTAJLyogTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUJRUwySExUCQk1MQkvKiBMZXZlbCAyIGhhbHRlZCAqLwotI2RlZmluZQlFQkFERQkJNTIJLyogSW52YWxpZCBleGNoYW5nZSAqLwotI2RlZmluZQlFQkFEUgkJNTMJLyogSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IgKi8KLSNkZWZpbmUJRVhGVUxMCQk1NAkvKiBFeGNoYW5nZSBmdWxsICovCi0jZGVmaW5lCUVOT0FOTwkJNTUJLyogTm8gYW5vZGUgKi8KLSNkZWZpbmUJRUJBRFJRQwkJNTYJLyogSW52YWxpZCByZXF1ZXN0IGNvZGUgKi8KLSNkZWZpbmUJRUJBRFNMVAkJNTcJLyogSW52YWxpZCBzbG90ICovCi0KLSNkZWZpbmUJRURFQURMT0NLCUVERUFETEsKLQotI2RlZmluZQlFQkZPTlQJCTU5CS8qIEJhZCBmb250IGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lCUVOT1NUUgkJNjAJLyogRGV2aWNlIG5vdCBhIHN0cmVhbSAqLwotI2RlZmluZQlFTk9EQVRBCQk2MQkvKiBObyBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZQlFVElNRQkJNjIJLyogVGltZXIgZXhwaXJlZCAqLwotI2RlZmluZQlFTk9TUgkJNjMJLyogT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzICovCi0jZGVmaW5lCUVOT05FVAkJNjQJLyogTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsgKi8KLSNkZWZpbmUJRU5PUEtHCQk2NQkvKiBQYWNrYWdlIG5vdCBpbnN0YWxsZWQgKi8KLSNkZWZpbmUJRVJFTU9URQkJNjYJLyogT2JqZWN0IGlzIHJlbW90ZSAqLwotI2RlZmluZQlFTk9MSU5LCQk2NwkvKiBMaW5rIGhhcyBiZWVuIHNldmVyZWQgKi8KLSNkZWZpbmUJRUFEVgkJNjgJLyogQWR2ZXJ0aXNlIGVycm9yICovCi0jZGVmaW5lCUVTUk1OVAkJNjkJLyogU3Jtb3VudCBlcnJvciAqLwotI2RlZmluZQlFQ09NTQkJNzAJLyogQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kICovCi0jZGVmaW5lCUVQUk9UTwkJNzEJLyogUHJvdG9jb2wgZXJyb3IgKi8KLSNkZWZpbmUJRU1VTFRJSE9QCTcyCS8qIE11bHRpaG9wIGF0dGVtcHRlZCAqLwotI2RlZmluZQlFRE9URE9UCQk3MwkvKiBSRlMgc3BlY2lmaWMgZXJyb3IgKi8KLSNkZWZpbmUJRUJBRE1TRwkJNzQJLyogTm90IGEgZGF0YSBtZXNzYWdlICovCi0jZGVmaW5lCUVPVkVSRkxPVwk3NQkvKiBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlICovCi0jZGVmaW5lCUVOT1RVTklRCTc2CS8qIE5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrICovCi0jZGVmaW5lCUVCQURGRAkJNzcJLyogRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSAqLwotI2RlZmluZQlFUkVNQ0hHCQk3OAkvKiBSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkICovCi0jZGVmaW5lCUVMSUJBQ0MJCTc5CS8qIENhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5ICovCi0jZGVmaW5lCUVMSUJCQUQJCTgwCS8qIEFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSAqLwotI2RlZmluZQlFTElCU0NOCQk4MQkvKiAubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkICovCi0jZGVmaW5lCUVMSUJNQVgJCTgyCS8qIEF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzICovCi0jZGVmaW5lCUVMSUJFWEVDCTgzCS8qIENhbm5vdCBleGVjIGEgc2hhcmVkIGxpYnJhcnkgZGlyZWN0bHkgKi8KLSNkZWZpbmUJRUlMU0VRCQk4NAkvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KLSNkZWZpbmUJRVJFU1RBUlQJODUJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCAqLwotI2RlZmluZQlFU1RSUElQRQk4NgkvKiBTdHJlYW1zIHBpcGUgZXJyb3IgKi8KLSNkZWZpbmUJRVVTRVJTCQk4NwkvKiBUb28gbWFueSB1c2VycyAqLwotI2RlZmluZQlFTk9UU09DSwk4OAkvKiBTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQgKi8KLSNkZWZpbmUJRURFU1RBRERSUkVRCTg5CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgKi8KLSNkZWZpbmUJRU1TR1NJWkUJOTAJLyogTWVzc2FnZSB0b28gbG9uZyAqLwotI2RlZmluZQlFUFJPVE9UWVBFCTkxCS8qIFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCAqLwotI2RlZmluZQlFTk9QUk9UT09QVAk5MgkvKiBQcm90b2NvbCBub3QgYXZhaWxhYmxlICovCi0jZGVmaW5lCUVQUk9UT05PU1VQUE9SVAk5MwkvKiBQcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVTT0NLVE5PU1VQUE9SVAk5NAkvKiBTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVPUE5PVFNVUFAJOTUJLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50ICovCi0jZGVmaW5lCUVQRk5PU1VQUE9SVAk5NgkvKiBQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUZOT1NVUFBPUlQJOTcJLyogQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCAqLwotI2RlZmluZQlFQUREUklOVVNFCTk4CS8qIEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgKi8KLSNkZWZpbmUJRUFERFJOT1RBVkFJTAk5OQkvKiBDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzICovCi0jZGVmaW5lCUVORVRET1dOCTEwMAkvKiBOZXR3b3JrIGlzIGRvd24gKi8KLSNkZWZpbmUJRU5FVFVOUkVBQ0gJMTAxCS8qIE5ldHdvcmsgaXMgdW5yZWFjaGFibGUgKi8KLSNkZWZpbmUJRU5FVFJFU0VUCTEwMgkvKiBOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0ICovCi0jZGVmaW5lCUVDT05OQUJPUlRFRAkxMDMJLyogU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQgKi8KLSNkZWZpbmUJRUNPTk5SRVNFVAkxMDQJLyogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyICovCi0jZGVmaW5lCUVOT0JVRlMJCTEwNQkvKiBObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlICovCi0jZGVmaW5lCUVJU0NPTk4JCTEwNgkvKiBUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKi8KLSNkZWZpbmUJRU5PVENPTk4JMTA3CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkICovCi0jZGVmaW5lCUVTSFVURE9XTgkxMDgJLyogQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duICovCi0jZGVmaW5lCUVUT09NQU5ZUkVGUwkxMDkJLyogVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSAqLwotI2RlZmluZQlFVElNRURPVVQJMTEwCS8qIENvbm5lY3Rpb24gdGltZWQgb3V0ICovCi0jZGVmaW5lCUVDT05OUkVGVVNFRAkxMTEJLyogQ29ubmVjdGlvbiByZWZ1c2VkICovCi0jZGVmaW5lCUVIT1NURE9XTgkxMTIJLyogSG9zdCBpcyBkb3duICovCi0jZGVmaW5lCUVIT1NUVU5SRUFDSAkxMTMJLyogTm8gcm91dGUgdG8gaG9zdCAqLwotI2RlZmluZQlFQUxSRUFEWQkxMTQJLyogT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUJRUlOUFJPR1JFU1MJMTE1CS8qIE9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUJRVNUQUxFCQkxMTYJLyogU3RhbGUgTkZTIGZpbGUgaGFuZGxlICovCi0jZGVmaW5lCUVVQ0xFQU4JCTExNwkvKiBTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmcgKi8KLSNkZWZpbmUJRU5PVE5BTQkJMTE4CS8qIE5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSAqLwotI2RlZmluZQlFTkFWQUlMCQkxMTkJLyogTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUJRUlTTkFNCQkxMjAJLyogSXMgYSBuYW1lZCB0eXBlIGZpbGUgKi8KLSNkZWZpbmUJRVJFTU9URUlPCTEyMQkvKiBSZW1vdGUgSS9PIGVycm9yICovCi0jZGVmaW5lCUVEUVVPVAkJMTIyCS8qIFF1b3RhIGV4Y2VlZGVkICovCi0KLSNkZWZpbmUJRU5PTUVESVVNCTEyMwkvKiBObyBtZWRpdW0gZm91bmQgKi8KLSNkZWZpbmUJRU1FRElVTVRZUEUJMTI0CS8qIFdyb25nIG1lZGl1bSB0eXBlICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8uaD4KIAogI2VuZGlmCS8qIF9YVEVOU0FfRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lwYy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2lwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdiZGI0ZDRjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvaXBjLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0lQQ19ICi0jZGVmaW5lIF9YVEVOU0FfSVBDX0gKLQotc3RydWN0IGlwY19rbHVkZ2UgewotCXN0cnVjdCBtc2didWYgX191c2VyICptc2dwOwotCWxvbmcgbXNndHlwOwotfTsKLQotI2RlZmluZSBTRU1PUAkJIDEKLSNkZWZpbmUgU0VNR0VUCQkgMgotI2RlZmluZSBTRU1DVEwJCSAzCi0jZGVmaW5lIFNFTVRJTUVET1AJIDQKLSNkZWZpbmUgTVNHU05ECQkxMQotI2RlZmluZSBNU0dSQ1YJCTEyCi0jZGVmaW5lIE1TR0dFVAkJMTMKLSNkZWZpbmUgTVNHQ1RMCQkxNAotI2RlZmluZSBTSE1BVAkJMjEKLSNkZWZpbmUgU0hNRFQJCTIyCi0jZGVmaW5lIFNITUdFVAkJMjMKLSNkZWZpbmUgU0hNQ1RMCQkyNAotCi0jZGVmaW5lIElQQ0NBTEwodmVyc2lvbixvcCkJKCh2ZXJzaW9uKTw8MTYgfCAob3ApKQotCi0jZW5kaWYJLyogX1hURU5TQV9JUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCmluZGV4IDY0YzY0ZGQuLjZiMzlkNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmgKQEAgLTEzLDQyICsxMywzMSBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCi0vLyNkZWZpbmUgX19OUl9zZXR1cAkJICAwIC8qIHVzZWQgb25seSBieSBpbml0LCB0byBnZXQgc3lzdGVtIGdvaW5nICovCiAjZGVmaW5lIF9fTlJfc3BpbGwJCSAgMAogI2RlZmluZSBfX05SX2V4aXQJCSAgMQotI2RlZmluZSBfX05SX2ZvcmsJCSAgMgogI2RlZmluZSBfX05SX3JlYWQJCSAgMwogI2RlZmluZSBfX05SX3dyaXRlCQkgIDQKICNkZWZpbmUgX19OUl9vcGVuCQkgIDUKICNkZWZpbmUgX19OUl9jbG9zZQkJICA2Ci0jZGVmaW5lIF9fTlJfd2FpdHBpZAkJICA3CiAjZGVmaW5lIF9fTlJfY3JlYXQJCSAgOAogI2RlZmluZSBfX05SX2xpbmsJCSAgOQogI2RlZmluZSBfX05SX3VubGluawkJIDEwCiAjZGVmaW5lIF9fTlJfZXhlY3ZlCQkgMTEKICNkZWZpbmUgX19OUl9jaGRpcgkJIDEyCi0jZGVmaW5lIF9fTlJfdGltZQkJIDEzCiAjZGVmaW5lIF9fTlJfbWtub2QJCSAxNAogI2RlZmluZSBfX05SX2NobW9kCQkgMTUKICNkZWZpbmUgX19OUl9sY2hvd24JCSAxNgogI2RlZmluZSBfX05SX2JyZWFrCQkgMTcKLSNkZWZpbmUgX19OUl9vbGRzdGF0CQkgMTgKICNkZWZpbmUgX19OUl9sc2VlawkJIDE5CiAjZGVmaW5lIF9fTlJfZ2V0cGlkCQkgMjAKICNkZWZpbmUgX19OUl9tb3VudAkJIDIxCi0jZGVmaW5lIF9fTlJfb2xkdW1vdW50CQkgMjIKICNkZWZpbmUgX19OUl9zZXR1aWQJCSAyMwogI2RlZmluZSBfX05SX2dldHVpZAkJIDI0Ci0jZGVmaW5lIF9fTlJfc3RpbWUJCSAyNQogI2RlZmluZSBfX05SX3B0cmFjZQkJIDI2Ci0jZGVmaW5lIF9fTlJfYWxhcm0JCSAyNwotI2RlZmluZSBfX05SX29sZGZzdGF0CQkgMjgKLSNkZWZpbmUgX19OUl9wYXVzZQkJIDI5CiAjZGVmaW5lIF9fTlJfdXRpbWUJCSAzMAogI2RlZmluZSBfX05SX3N0dHkJCSAzMQogI2RlZmluZSBfX05SX2d0dHkJCSAzMgogI2RlZmluZSBfX05SX2FjY2VzcwkJIDMzCi0jZGVmaW5lIF9fTlJfbmljZQkJIDM0CiAjZGVmaW5lIF9fTlJfZnRpbWUJCSAzNQogI2RlZmluZSBfX05SX3N5bmMJCSAzNgogI2RlZmluZSBfX05SX2tpbGwJCSAzNwpAQCAtNjYsMjQgKzU1LDE4IEBACiAjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CiAjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCiAjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCi0jZGVmaW5lIF9fTlJfdW1vdW50CQkgNTIKICNkZWZpbmUgX19OUl9sb2NrCQkgNTMKICNkZWZpbmUgX19OUl9pb2N0bAkJIDU0CiAjZGVmaW5lIF9fTlJfZmNudGwJCSA1NQotI2RlZmluZSBfX05SX21weAkJIDU2CiAjZGVmaW5lIF9fTlJfc2V0cGdpZAkJIDU3CiAjZGVmaW5lIF9fTlJfdWxpbWl0CQkgNTgKLSNkZWZpbmUgX19OUl9vbGRvbGR1bmFtZQkgNTkKICNkZWZpbmUgX19OUl91bWFzawkJIDYwCiAjZGVmaW5lIF9fTlJfY2hyb290CQkgNjEKICNkZWZpbmUgX19OUl91c3RhdAkJIDYyCiAjZGVmaW5lIF9fTlJfZHVwMgkJIDYzCiAjZGVmaW5lIF9fTlJfZ2V0cHBpZAkJIDY0Ci0jZGVmaW5lIF9fTlJfZ2V0cGdycAkJIDY1CiAjZGVmaW5lIF9fTlJfc2V0c2lkCQkgNjYKICNkZWZpbmUgX19OUl9zaWdhY3Rpb24JCSA2NwotI2RlZmluZSBfX05SX3NnZXRtYXNrCQkgNjgKLSNkZWZpbmUgX19OUl9zc2V0bWFzawkJIDY5CiAjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCSA3MAogI2RlZmluZSBfX05SX3NldHJlZ2lkCQkgNzEKICNkZWZpbmUgX19OUl9zaWdzdXNwZW5kCQkgNzIKQEAgLTk4LDEzICs4MSwxMCBAQAogI2RlZmluZSBfX05SX3NldGdyb3VwcwkJIDgxCiAjZGVmaW5lIF9fTlJfc2VsZWN0CQkgODIKICNkZWZpbmUgX19OUl9zeW1saW5rCQkgODMKLSNkZWZpbmUgX19OUl9vbGRsc3RhdAkJIDg0CiAjZGVmaW5lIF9fTlJfcmVhZGxpbmsJCSA4NQogI2RlZmluZSBfX05SX3VzZWxpYgkJIDg2CiAjZGVmaW5lIF9fTlJfc3dhcG9uCQkgODcKICNkZWZpbmUgX19OUl9yZWJvb3QJCSA4OAotI2RlZmluZSBfX05SX3JlYWRkaXIJCSA4OQotI2RlZmluZSBfX05SX21tYXAJCSA5MAogI2RlZmluZSBfX05SX211bm1hcAkJIDkxCiAjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCSA5MgogI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJIDkzCkBAIC0xMTYsMjIgKzk2LDE4IEBACiAjZGVmaW5lIF9fTlJfc3RhdGZzCQkgOTkKICNkZWZpbmUgX19OUl9mc3RhdGZzCQkxMDAKICNkZWZpbmUgX19OUl9pb3Blcm0JCTEwMQotI2RlZmluZSBfX05SX3NvY2tldGNhbGwJCTEwMgogI2RlZmluZSBfX05SX3N5c2xvZwkJMTAzCiAjZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkxMDQKICNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQogI2RlZmluZSBfX05SX3N0YXQJCTEwNgogI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKICNkZWZpbmUgX19OUl9mc3RhdAkJMTA4Ci0jZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQogI2RlZmluZSBfX05SX2lvcGwJCTExMAogI2RlZmluZSBfX05SX3ZoYW5ndXAJCTExMQogI2RlZmluZSBfX05SX2lkbGUJCTExMgotI2RlZmluZSBfX05SX3ZtODYJCTExMwogI2RlZmluZSBfX05SX3dhaXQ0CQkxMTQKICNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkxMTUKICNkZWZpbmUgX19OUl9zeXNpbmZvCQkxMTYKLSNkZWZpbmUgX19OUl9pcGMJCTExNwogI2RlZmluZSBfX05SX2ZzeW5jCQkxMTgKICNkZWZpbmUgX19OUl9zaWdyZXR1cm4JCTExOQogI2RlZmluZSBfX05SX2Nsb25lCQkxMjAKQEAgLTE0MCwxOCArMTE2LDE1IEBACiAjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdAkJMTIzCiAjZGVmaW5lIF9fTlJfYWRqdGltZXgJCTEyNAogI2RlZmluZSBfX05SX21wcm90ZWN0CQkxMjUKLSNkZWZpbmUgX19OUl9zaWdwcm9jbWFzawkxMjYKICNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlCTEyNwogI2RlZmluZSBfX05SX2luaXRfbW9kdWxlCTEyOAogI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUJMTI5Ci0jZGVmaW5lIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCTEzMAogI2RlZmluZSBfX05SX3F1b3RhY3RsCQkxMzEKICNkZWZpbmUgX19OUl9nZXRwZ2lkCQkxMzIKICNkZWZpbmUgX19OUl9mY2hkaXIJCTEzMwogI2RlZmluZSBfX05SX2JkZmx1c2gJCTEzNAogI2RlZmluZSBfX05SX3N5c2ZzCQkxMzUKICNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkxMzYKLSNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkxMzcgLyogU3lzY2FsbCBmb3IgQW5kcmV3IEZpbGUgU3lzdGVtICovCiAjZGVmaW5lIF9fTlJfc2V0ZnN1aWQJCTEzOAogI2RlZmluZSBfX05SX3NldGZzZ2lkCQkxMzkKICNkZWZpbmUgX19OUl9fbGxzZWVrCQkxNDAKQEAgLTIyMiw4ICsxOTUsNiBAQAogI2RlZmluZSBfX05SX2NhcHNldAkJMjA1CiAjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMjA2CiAjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTIwNwotI2RlZmluZSBfX05SX3N0cmVhbXMxCQkyMDgJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBpdCAqLwotI2RlZmluZSBfX05SX3N0cmVhbXMyCQkyMDkJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBpdCAqLwogI2RlZmluZSBfX05SX21tYXAyCQkyMTAKICNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkyMTEKICNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkyMTIKQEAgLTIzNCw3ICsyMDUsNiBAQAogI2RlZmluZSBfX05SX21pbmNvcmUJCTIxNwogI2RlZmluZSBfX05SX21hZHZpc2UJCTIxOAogI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIxOQotI2RlZmluZSBfX05SX3Zmb3JrCQkyMjAKIAogLyogS2VlcCB0aGlzIGxhc3Q7IHNob3VsZCBhbHdheXMgZXF1YWwgdGhlIGxhc3QgdmFsaWQgY2FsbCBudW1iZXIuICovCiAjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMgICAgIDIyMApAQCAtNDQ4LDU1ICs0MTgsNyBAQAogCiAKICNpZmRlZiBfX0tFUk5FTF9TWVNDQUxMU19fCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotLyoKLSAqIHdlIG5lZWQgdGhpcyBpbmxpbmUgLSBmb3JraW5nIGZyb20ga2VybmVsIHNwYWNlIHdpbGwgcmVzdWx0Ci0gKiBpbiBOTyBDT1BZIE9OIFdSSVRFICghISEpLCB1bnRpbCBhbiBleGVjdmUgaXMgZXhlY3V0ZWQuIFRoaXMKLSAqIGlzIG5vIHByb2JsZW0sIGJ1dCBmb3IgdGhlIHN0YWNrLiBUaGlzIGlzIGhhbmRsZWQgYnkgbm90IGxldHRpbmcKLSAqIG1haW4oKSB1c2UgdGhlIHN0YWNrIGF0IGFsbCBhZnRlciBmb3JrKCkuIFRodXMsIG5vIGZ1bmN0aW9uCi0gKiBjYWxscyAtIHdoaWNoIG1lYW5zIGlubGluZSBjb2RlIGZvciBmb3JrIHRvbywgYXMgb3RoZXJ3aXNlIHdlCi0gKiB3b3VsZCB1c2UgdGhlIHN0YWNrIHVwb24gZXhpdCBmcm9tICdmb3JrKCknLgotICoKLSAqIEFjdHVhbGx5IG9ubHkgcGF1c2UgYW5kIGZvcmsgYXJlIG5lZWRlZCBpbmxpbmUsIHNvIHRoYXQgdGhlcmUKLSAqIHdvbid0IGJlIGFueSBtZXNzaW5nIHdpdGggdGhlIHN0YWNrIGZyb20gbWFpbigpLCBidXQgd2UgZGVmaW5lCi0gKiBzb21lIG90aGVycyB0b28uCi0gKi8KLQotI2RlZmluZSBfX05SX19leGl0IF9fTlJfZXhpdAotCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDAoaW50LHBhdXNlKQotLy9zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDEoaW50LHNldHVwLGludCxtYWdpYykgRklYTUUKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMChpbnQsc3luYykKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMChwaWRfdCxzZXRzaWQpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDMoaW50LHdyaXRlLGludCxmZCxjb25zdCBjaGFyICosYnVmLG9mZl90LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKGludCxyZWFkLGludCxmZCxjaGFyICosYnVmLG9mZl90LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKG9mZl90LGxzZWVrLGludCxmZCxvZmZfdCxvZmZzZXQsaW50LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxkdXAsaW50LGZkKQogc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKGludCxleGVjdmUsY29uc3QgY2hhciosZmlsZSxjaGFyKiosYXJndixjaGFyKiosZW52cCkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMyhpbnQsb3Blbixjb25zdCBjaGFyICosZmlsZSxpbnQsZmxhZyxpbnQsbW9kZSkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMShpbnQsY2xvc2UsaW50LGZkKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxfZXhpdCxpbnQsZXhpdGNvZGUpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDMocGlkX3Qsd2FpdHBpZCxwaWRfdCxwaWQsaW50ICosd2FpdF9zdGF0LGludCxvcHRpb25zKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxkZWxldGVfbW9kdWxlLGNvbnN0IGNoYXIgKixuYW1lKQotCi1zdHJ1Y3Qgc3RhdDsKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMihpbnQsZnN0YXQsaW50LGZkLHN0cnVjdCBzdGF0ICosYnVmKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwwKHBpZF90LGdldHBpZCkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMihpbnQsa2lsbCxpbnQscGlkLGludCxzaWcpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDIoaW50LHN0YXQsY29uc3QgY2hhciAqLCBwYXRoLHN0cnVjdCBzdGF0ICosYnVmKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCx1bmxpbmssY2hhciAqLHBhdGhuYW1lKQotCi0KLQotZXh0ZXJuIHBpZF90IHdhaXRwaWQoaW50LCBpbnQqLCBpbnQgKTsKLXN0YXRpYyBfX2lubGluZV9fIHBpZF90IHdhaXQoaW50ICogd2FpdF9zdGF0KQotewotCXJldHVybiB3YWl0cGlkKC0xLHdhaXRfc3RhdCwwKTsKLX0KICNlbmRpZgogCiAvKgpAQCAtNTA4LDMwICs0MzAsMTAgQEAKICNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKTsKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1NUQVQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSwotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfV0FJVFBJRAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19MTFNFRUsKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05JQ0UKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRF9HRVRSTElNSVQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORwotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgogI2VuZGlmCiAKLQotCiAjZW5kaWYJLyogX1hURU5TQV9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCBiMTIzY2MwLi5mODVjYmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtMjA2LDcgKzIwNiwxMCBAQAogCXU4CQkJZWlkOwogCXU4CQkJaW9zYXBpY192ZWN0b3I7CiAJdTMyCQkJZ2xvYmFsX2lycTsKLQl1MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgeworCQl1MzIJCQljcGVpX292ZXJyaWRlX2ZsYWc6MTsKKwkJdTMyCQkJcmVzZXJ2ZWQ6MzE7CisJfQkJCXBsaW50X2ZsYWdzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIGVudW0gYWNwaV9pbnRlcnJ1cHRfaWQgewpAQCAtMzQyLDExICszNDUsMTkgQEAKIAogLyogUENJIE1NQ09ORklHICovCiAKKy8qIERlZmluZWQgaW4gUENJIEZpcm13YXJlIFNwZWNpZmljYXRpb24gMy4wICovCitzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnX2NvbmZpZyB7CisJdTMyCQkJCWJhc2VfYWRkcmVzczsKKwl1MzIJCQkJYmFzZV9yZXNlcnZlZDsKKwl1MTYJCQkJcGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyOworCXU4CQkJCXN0YXJ0X2J1c19udW1iZXI7CisJdTgJCQkJZW5kX2J1c19udW1iZXI7CisJdTgJCQkJcmVzZXJ2ZWRbNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgewogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcgloZWFkZXI7CiAJdTgJCQkJcmVzZXJ2ZWRbOF07Ci0JdTMyCQkJCWJhc2VfYWRkcmVzczsKLQl1MzIJCQkJYmFzZV9yZXNlcnZlZDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnX2NvbmZpZwljb25maWdbMF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogVGFibGUgSGFuZGxlcnMgKi8KQEAgLTM5MSw2ICs0MDIsNyBAQAogaW50IGFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseSAoZW51bSBhY3BpX3RhYmxlX2lkIGlkLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipoZWFkZXIpOwogaW50IGFjcGlfdGFibGVfcGFyc2VfbWFkdCAoZW51bSBhY3BpX21hZHRfZW50cnlfaWQgaWQsIGFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7CiBpbnQgYWNwaV90YWJsZV9wYXJzZV9zcmF0IChlbnVtIGFjcGlfc3JhdF9lbnRyeV9pZCBpZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2ludCBhY3BpX3BhcnNlX21jZmcgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogdm9pZCBhY3BpX3RhYmxlX3ByaW50IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOwogdm9pZCBhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICptYWR0KTsKIHZvaWQgYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5IChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqc3JhdCk7CkBAIC00MDcsOSArNDE5LDEzIEBACiBpbnQgYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSk7CiAjZW5kaWYgLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KIAoraW50IGFjcGlfcmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTY0IHBoeXNfYWRkciwgdTMyIGdzaV9iYXNlKTsKK2ludCBhY3BpX3VucmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGdzaV9iYXNlKTsKKwogZXh0ZXJuIGludCBhY3BpX21wX2NvbmZpZzsKIAotZXh0ZXJuIHUzMiBwY2lfbW1jZmdfYmFzZV9hZGRyOworZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpwY2lfbW1jZmdfY29uZmlnOworZXh0ZXJuIGludCBwY2lfbW1jZmdfY29uZmlnX251bTsKIAogZXh0ZXJuIGludCBzYmZfcG9ydCA7CiAKQEAgLTQ2Miw3ICs0NzgsNyBAQAogc3RydWN0IHBjaV9kZXY7CiAKIGludCBhY3BpX3BjaV9pcnFfZW5hYmxlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXZvaWQgYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpOwordm9pZCBhY3BpX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSk7CiAKICNpZmRlZiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUQogdm9pZCBhY3BpX3BjaV9pcnFfZGlzYWJsZSAoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YWxrLmggYi9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKaW5kZXggMDlhMTQ1MS4uOTExYzA5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGFsay5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhbGsuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19MSU5VWF9BVEFMS19IX18KICNkZWZpbmUgX19MSU5VWF9BVEFMS19IX18KIAorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKwogLyoKICAqIEFwcGxlVGFsayBuZXR3b3JraW5nIHN0cnVjdHVyZXMKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggYmYyYWQzYi4uNjhhYmEwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtMTY1LDcgKzE2NSw3IEBACiAjZGVmaW5lIEFVRElUX0FSQ0hfU0g2NAkJKEVNX1NIfF9fQVVESVRfQVJDSF82NEJJVCkKICNkZWZpbmUgQVVESVRfQVJDSF9TSEVMNjQJKEVNX1NIfF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCiAjZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkMJKEVNX1NQQVJDKQotI2RlZmluZSBBVURJVF9BUkNIX1NQQVJDNjQJKEVNX1NQQVJDNjR8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1NQQVJDNjQJKEVNX1NQQVJDVjl8X19BVURJVF9BUkNIXzY0QklUKQogI2RlZmluZSBBVURJVF9BUkNIX1Y4NTAJCShFTV9WODUwfF9fQVVESVRfQVJDSF9MRSkKICNkZWZpbmUgQVVESVRfQVJDSF9YODZfNjQJKEVNX1g4Nl82NHxfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCAwMzgwMjI3Li4zNmVmMjlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvaW9wcmlvLmg+CiAKIC8qIFBsYXRmb3JtcyBtYXkgc2V0IHRoaXMgdG8gdGVhY2ggdGhlIEJJTyBsYXllciBhYm91dCBJT01NVSBoYXJkd2FyZS4gKi8KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE1MCw2ICsxNTEsMTkgQEAKICNkZWZpbmUgQklPX1JXX1NZTkMJNAogCiAvKgorICogdXBwZXIgMTYgYml0cyBvZiBiaV9ydyBkZWZpbmUgdGhlIGlvIHByaW9yaXR5IG9mIHRoaXMgYmlvCisgKi8KKyNkZWZpbmUgQklPX1BSSU9fU0hJRlQJKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykgLSBJT1BSSU9fQklUUykKKyNkZWZpbmUgYmlvX3ByaW8oYmlvKQkoKGJpbyktPmJpX3J3ID4+IEJJT19QUklPX1NISUZUKQorI2RlZmluZSBiaW9fcHJpb192YWxpZChiaW8pCWlvcHJpb192YWxpZChiaW9fcHJpbyhiaW8pKQorCisjZGVmaW5lIGJpb19zZXRfcHJpbyhiaW8sIHByaW8pCQlkbyB7CQkJXAorCVdBUk5fT04ocHJpbyA+PSAoMSA8PCBJT1BSSU9fQklUUykpOwkJCVwKKwkoYmlvKS0+YmlfcncgJj0gKCgxVUwgPDwgQklPX1BSSU9fU0hJRlQpIC0gMSk7CQlcCisJKGJpbyktPmJpX3J3IHw9ICgodW5zaWduZWQgbG9uZykgKHByaW8pIDw8IEJJT19QUklPX1NISUZUKTsJXAorfSB3aGlsZSAoMCkKKworLyoKICAqIHZhcmlvdXMgbWVtYmVyIGFjY2Vzcywgbm90ZSB0aGF0IGJpb19kYXRhIHNob3VsZCBvZiBjb3Vyc2Ugbm90IGJlIHVzZWQKICAqIG9uIGhpZ2htZW0gcGFnZSB2ZWN0b3JzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGI1NGEwMzQuLjA4ODFiNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtNTQsMTYgKzU0LDIzIEBACiAKIHN0cnVjdCBjZnFfcXVldWU7CiBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgewotCXZvaWQgKCpkdG9yKShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKik7Ci0Jdm9pZCAoKmV4aXQpKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqKTsKLQotCXN0cnVjdCBpb19jb250ZXh0ICppb2M7Ci0KIAkvKgogCSAqIGNpcmN1bGFyIGxpc3Qgb2YgY2ZxX2lvX2NvbnRleHRzIGJlbG9uZ2luZyB0byBhIHByb2Nlc3MgaW8gY29udGV4dAogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCXZvaWQgKmtleTsKKworCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CisKKwl1bnNpZ25lZCBsb25nIGxhc3RfZW5kX3JlcXVlc3Q7CisJdW5zaWduZWQgbG9uZyBsYXN0X3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgdHRpbWVfdG90YWw7CisJdW5zaWduZWQgbG9uZyB0dGltZV9zYW1wbGVzOworCXVuc2lnbmVkIGxvbmcgdHRpbWVfbWVhbjsKKworCXZvaWQgKCpkdG9yKShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKik7CisJdm9pZCAoKmV4aXQpKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqKTsKIH07CiAKIC8qCkBAIC03Myw3ICs4MCw5IEBACiAgKi8KIHN0cnVjdCBpb19jb250ZXh0IHsKIAlhdG9taWNfdCByZWZjb3VudDsKLQlwaWRfdCBwaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCisJaW50ICgqc2V0X2lvcHJpbykoc3RydWN0IGlvX2NvbnRleHQgKiwgdW5zaWduZWQgaW50KTsKIAogCS8qCiAJICogRm9yIHJlcXVlc3QgYmF0Y2hpbmcKQEAgLTgxLDE0ICs5MCwxMyBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF93YWl0ZWQ7IC8qIFRpbWUgbGFzdCB3b2tlbiBhZnRlciB3YWl0IGZvciByZXF1ZXN0ICovCiAJaW50IG5yX2JhdGNoX3JlcXVlc3RzOyAgICAgLyogTnVtYmVyIG9mIHJlcXVlc3RzIGxlZnQgaW4gdGhlIGJhdGNoICovCiAKLQlzcGlubG9ja190IGxvY2s7Ci0KIAlzdHJ1Y3QgYXNfaW9fY29udGV4dCAqYWljOwogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogfTsKIAogdm9pZCBwdXRfaW9fY29udGV4dChzdHJ1Y3QgaW9fY29udGV4dCAqaW9jKTsKIHZvaWQgZXhpdF9pb19jb250ZXh0KHZvaWQpOworc3RydWN0IGlvX2NvbnRleHQgKmN1cnJlbnRfaW9fY29udGV4dChpbnQgZ2ZwX2ZsYWdzKTsKIHN0cnVjdCBpb19jb250ZXh0ICpnZXRfaW9fY29udGV4dChpbnQgZ2ZwX2ZsYWdzKTsKIHZvaWQgY29weV9pb19jb250ZXh0KHN0cnVjdCBpb19jb250ZXh0ICoqcGRzdCwgc3RydWN0IGlvX2NvbnRleHQgKipwc3JjKTsKIHZvaWQgc3dhcF9pb19jb250ZXh0KHN0cnVjdCBpb19jb250ZXh0ICoqaW9jMSwgc3RydWN0IGlvX2NvbnRleHQgKippb2MyKTsKQEAgLTEzNCw2ICsxNDIsOCBAQAogCiAJdm9pZCAqZWxldmF0b3JfcHJpdmF0ZTsKIAorCXVuc2lnbmVkIHNob3J0IGlvcHJpbzsKKwogCWludCBycV9zdGF0dXM7CS8qIHNob3VsZCBzcGxpdCB0aGlzIGludG8gYSBmZXcgc3RhdHVzIGJpdHMgKi8KIAlzdHJ1Y3QgZ2VuZGlzayAqcnFfZGlzazsKIAlpbnQgZXJyb3JzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oIGIvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCmluZGV4IDgwMmM5MWUuLjkwODI4NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKQEAgLTE5LDYgKzE5LDkgQEAKIAlCSF9EaXJ0eSwJLyogSXMgZGlydHkgKi8KIAlCSF9Mb2NrLAkvKiBJcyBsb2NrZWQgKi8KIAlCSF9SZXEsCQkvKiBIYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIEkvTyAqLworCUJIX1VwdG9kYXRlX0xvY2ssLyogVXNlZCBieSB0aGUgZmlyc3QgYmggaW4gYSBwYWdlLCB0byBzZXJpYWxpc2UKKwkJCSAgKiBJTyBjb21wbGV0aW9uIG9mIG90aGVyIGJ1ZmZlcnMgaW4gdGhlIHBhZ2UKKwkJCSAgKi8KIAogCUJIX01hcHBlZCwJLyogSGFzIGEgZGlzayBtYXBwaW5nICovCiAJQkhfTmV3LAkJLyogRGlzayBtYXBwaW5nIHdhcyBuZXdseSBjcmVhdGVkIGJ5IGdldF9ibG9jayAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKaW5kZXggZDI4ZDlhOC4uZDVmMmEzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oCkBAIC05MiwyOSArOTIsMzIgQEAKICNlbmRpZiAvKiBPUFRJTUlaRSAqLwogCiAKLXN0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UzMiBfX2Zzd2FodzMyKF9fdTMyIHgpCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fZnN3YWh3MzIoX191MzIgeCkKIHsKIAlyZXR1cm4gX19hcmNoX19zd2FodzMyKHgpOwogfQotc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FodzMycChfX3UzMiAqeCkKKworc3RhdGljIGlubGluZSBfX3UzMiBfX3N3YWh3MzJwKF9fdTMyICp4KQogewogCXJldHVybiBfX2FyY2hfX3N3YWh3MzJwKHgpOwogfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWh3MzJzKF9fdTMyICphZGRyKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FodzMycyhfX3UzMiAqYWRkcikKIHsKIAlfX2FyY2hfX3N3YWh3MzJzKGFkZHIpOwogfQogCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHgpCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fZnN3YWhiMzIoX191MzIgeCkKIHsKIAlyZXR1cm4gX19hcmNoX19zd2FoYjMyKHgpOwogfQotc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FoYjMycChfX3UzMiAqeCkKKworc3RhdGljIGlubGluZSBfX3UzMiBfX3N3YWhiMzJwKF9fdTMyICp4KQogewogCXJldHVybiBfX2FyY2hfX3N3YWhiMzJwKHgpOwogfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWhiMzJzKF9fdTMyICphZGRyKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FoYjMycyhfX3UzMiAqYWRkcikKIHsKIAlfX2FyY2hfX3N3YWhiMzJzKGFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYWNoZS5oIGIvaW5jbHVkZS9saW51eC9jYWNoZS5oCmluZGV4IDRkNzY3YjkuLmY2YjVhNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhY2hlLmgKQEAgLTEzLDYgKzEzLDEyIEBACiAjZGVmaW5lIFNNUF9DQUNIRV9CWVRFUyBMMV9DQUNIRV9CWVRFUwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDNjQpCisjZGVmaW5lIF9fcmVhZF9tb3N0bHkgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLnJlYWRfbW9zdGx5IikpKQorI2Vsc2UKKyNkZWZpbmUgX19yZWFkX21vc3RseQorI2VuZGlmCisKICNpZm5kZWYgX19fX2NhY2hlbGluZV9hbGlnbmVkCiAjZGVmaW5lIF9fX19jYWNoZWxpbmVfYWxpZ25lZCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhTTVBfQ0FDSEVfQllURVMpKSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCmluZGV4IGVlMGM2ZTguLjQyNGQ1ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKQEAgLTEwLDYgKzEwLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9jY2lzc19wY2lfaW5mb19zdHJ1Y3QKIHsKIAl1bnNpZ25lZCBjaGFyIAlidXM7CisJdW5zaWduZWQgc2hvcnQJZG9tYWluOwogCXVuc2lnbmVkIGNoYXIgCWRldl9mbjsKIAlfX3UzMiAJCWJvYXJkX2lkOwogfSBjY2lzc19wY2lfaW5mb19zdHJ1Y3Q7IApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKaW5kZXggNzBhNGViYi4uZWNiMGQzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCkBAIC0zNDYsMTAgKzM0NiwyNyBAQAogLyogTFAgKi8KIENPTVBBVElCTEVfSU9DVEwoTFBHRVRTVEFUVVMpCiAvKiBwcGRldiAqLworQ09NUEFUSUJMRV9JT0NUTChQUFNFVE1PREUpCitDT01QQVRJQkxFX0lPQ1RMKFBQUlNUQVRVUykKK0NPTVBBVElCTEVfSU9DVEwoUFBSQ09OVFJPTCkKK0NPTVBBVElCTEVfSU9DVEwoUFBXQ09OVFJPTCkKK0NPTVBBVElCTEVfSU9DVEwoUFBGQ09OVFJPTCkKK0NPTVBBVElCTEVfSU9DVEwoUFBSREFUQSkKK0NPTVBBVElCTEVfSU9DVEwoUFBXREFUQSkKIENPTVBBVElCTEVfSU9DVEwoUFBDTEFJTSkKIENPTVBBVElCTEVfSU9DVEwoUFBSRUxFQVNFKQotQ09NUEFUSUJMRV9JT0NUTChQUEVYQ0wpCiBDT01QQVRJQkxFX0lPQ1RMKFBQWUlFTEQpCitDT01QQVRJQkxFX0lPQ1RMKFBQRVhDTCkKK0NPTVBBVElCTEVfSU9DVEwoUFBEQVRBRElSKQorQ09NUEFUSUJMRV9JT0NUTChQUE5FR09UKQorQ09NUEFUSUJMRV9JT0NUTChQUFdDVExPTklSUSkKK0NPTVBBVElCTEVfSU9DVEwoUFBDTFJJUlEpCitDT01QQVRJQkxFX0lPQ1RMKFBQU0VUUEhBU0UpCitDT01QQVRJQkxFX0lPQ1RMKFBQR0VUTU9ERVMpCitDT01QQVRJQkxFX0lPQ1RMKFBQR0VUTU9ERSkKK0NPTVBBVElCTEVfSU9DVEwoUFBHRVRQSEFTRSkKK0NPTVBBVElCTEVfSU9DVEwoUFBHRVRGTEFHUykKK0NPTVBBVElCTEVfSU9DVEwoUFBTRVRGTEFHUykKIC8qIENEUk9NIHN0dWZmICovCiBDT01QQVRJQkxFX0lPQ1RMKENEUk9NUEFVU0UpCiBDT01QQVRJQkxFX0lPQ1RMKENEUk9NUkVTVU1FKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCA5MjdkYWE4Li5mZjdmODBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtMjAxLDcgKzIwMSw3IEBACiAKIAkvKiBvcHRpb25hbCAqLwogCWludAkoKmV4aXQpCQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwotCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdTMyIHN0YXRlKTsKKwlpbnQJKCpzdXNwZW5kKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHBtX21lc3NhZ2VfdCBwbXNnKTsKIAlpbnQJKCpyZXN1bWUpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CiAJc3RydWN0IGZyZXFfYXR0cgkqKmF0dHI7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKaW5kZXggMzg3ZGE2YS4uNWUyYmNjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCkBAIC02MSw2ICs2MSwxNSBAQAogI2RlZmluZSBDUllQVE9fRElSX0RFQ1JZUFQJCTAKIAogc3RydWN0IHNjYXR0ZXJsaXN0Oworc3RydWN0IGNyeXB0b190Zm07CisKK3N0cnVjdCBjaXBoZXJfZGVzYyB7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwl2b2lkICgqY3Jmbikodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKwl1bnNpZ25lZCBpbnQgKCpwcmZuKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpkc3QsCisJCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCXZvaWQgKmluZm87Cit9OwogCiAvKgogICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZApAQCAtNzMsNiArODIsMTkgQEAKIAkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKIAl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CiAJdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworCisJdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfZWNiKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOworCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwl1bnNpZ25lZCBpbnQgKCpjaWFfZW5jcnlwdF9jYmMpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7CisJdW5zaWduZWQgaW50ICgqY2lhX2RlY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOwogfTsKIAogc3RydWN0IGRpZ2VzdF9hbGcgewpAQCAtMTAyLDYgKzEyNCw3IEBACiAJdTMyIGNyYV9mbGFnczsKIAl1bnNpZ25lZCBpbnQgY3JhX2Jsb2Nrc2l6ZTsKIAl1bnNpZ25lZCBpbnQgY3JhX2N0eHNpemU7CisJdW5zaWduZWQgaW50IGNyYV9hbGlnbm1hc2s7CiAJY29uc3QgY2hhciBjcmFfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKIAogCXVuaW9uIHsKQEAgLTEzNiw3ICsxNTksNiBAQAogICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKICAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCiAgKi8KLXN0cnVjdCBjcnlwdG9fdGZtOwogCiBzdHJ1Y3QgY2lwaGVyX3RmbSB7CiAJdm9pZCAqY2l0X2l2OwpAQCAtMjY2LDYgKzI4OCwxNiBAQAogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYWxpZ25tYXNrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuICh2b2lkICopJnRmbVsxXTsKK30KKwogLyoKICAqIEFQSSB3cmFwcGVycy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggN2I3ODFhNy4uMDZlNWQ0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC02OSw3ICs2OSw3IEBACiBleHRlcm4gaW50IGJ1c19yZWdpc3RlcihzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogZXh0ZXJuIHZvaWQgYnVzX3VucmVnaXN0ZXIoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIAotZXh0ZXJuIGludCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKK2V4dGVybiB2b2lkIGJ1c19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlICogZ2V0X2J1cyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogZXh0ZXJuIHZvaWQgcHV0X2J1cyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwpAQCAtODAsNiArODAsOCBAQAogCiBpbnQgYnVzX2Zvcl9lYWNoX2RldihzdHJ1Y3QgYnVzX3R5cGUgKiBidXMsIHN0cnVjdCBkZXZpY2UgKiBzdGFydCwgdm9pZCAqIGRhdGEsCiAJCSAgICAgaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CitzdHJ1Y3QgZGV2aWNlICogYnVzX2ZpbmRfZGV2aWNlKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgZGV2aWNlICpzdGFydCwKKwkJCQl2b2lkICpkYXRhLCBpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIAogaW50IGJ1c19mb3JfZWFjaF9kcnYoc3RydWN0IGJ1c190eXBlICogYnVzLCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIHN0YXJ0LCAKIAkJICAgICB2b2lkICogZGF0YSwgaW50ICgqZm4pKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHZvaWQgKikpOwpAQCAtMTQyLDYgKzE0NCw5IEBACiAKIGV4dGVybiBpbnQgZHJpdmVyX2Zvcl9lYWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydiwgc3RydWN0IGRldmljZSAqIHN0YXJ0LAogCQkJCSAgdm9pZCAqIGRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOworc3RydWN0IGRldmljZSAqIGRyaXZlcl9maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnN0YXJ0LCB2b2lkICpkYXRhLAorCQkJCSAgIGludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogCiAKIC8qCkBAIC0yNzksOCArMjg0LDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcjsJLyogd2hpY2ggZHJpdmVyIGhhcyBhbGxvY2F0ZWQgdGhpcwogCQkJCQkgICBkZXZpY2UgKi8KIAl2b2lkCQkqZHJpdmVyX2RhdGE7CS8qIGRhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCi0Jdm9pZAkJKnBsYXRmb3JtX2RhdGE7CS8qIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEgKGUuZy4gQUNQSSwKLQkJCQkJICAgQklPUyBkYXRhIHJlbGV2YW50IHRvIGRldmljZSkgKi8KKwl2b2lkCQkqcGxhdGZvcm1fZGF0YTsJLyogUGxhdGZvcm0gc3BlY2lmaWMgZGF0YSwgZGV2aWNlCisJCQkJCSAgIGNvcmUgZG9lc24ndCB0b3VjaCBpdCAqLworCXZvaWQJCSpmaXJtd2FyZV9kYXRhOyAvKiBGaXJtd2FyZSBzcGVjaWZpYyBkYXRhIChlLmcuIEFDUEksCisJCQkJCSAgIEJJT1MgZGF0YSkscmVzZXJ2ZWQgZm9yIGRldmljZSBjb3JlKi8KIAlzdHJ1Y3QgZGV2X3BtX2luZm8JcG93ZXI7CiAKIAl1NjQJCSpkbWFfbWFzazsJLyogZG1hIG1hc2sgKGlmIGRtYSdhYmxlIGRldmljZSkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCBlZTU0ZjgxLi5lYTZiYmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC0xNiw5ICsxNiw5IEBACiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX3JlcXVldWVfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiBzdHJ1Y3QgcmVxdWVzdCAqKGVsZXZhdG9yX3JlcXVlc3RfbGlzdF9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIHR5cGVkZWYgdm9pZCAoZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLXR5cGVkZWYgaW50IChlbGV2YXRvcl9tYXlfcXVldWVfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKK3R5cGVkZWYgaW50IChlbGV2YXRvcl9tYXlfcXVldWVfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50LCBzdHJ1Y3QgYmlvICopOwogCi10eXBlZGVmIGludCAoZWxldmF0b3Jfc2V0X3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwordHlwZWRlZiBpbnQgKGVsZXZhdG9yX3NldF9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqLCBpbnQpOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9wdXRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9kZWFjdGl2YXRlX3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIApAQCAtOTYsOSArOTYsOSBAQAogZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICplbHZfbGF0dGVyX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIGludCBlbHZfcmVnaXN0ZXJfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKIGV4dGVybiB2b2lkIGVsdl91bnJlZ2lzdGVyX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSk7Ci1leHRlcm4gaW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICosIGludCk7CitleHRlcm4gaW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICosIGludCwgc3RydWN0IGJpbyAqKTsKIGV4dGVybiB2b2lkIGVsdl9jb21wbGV0ZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci1leHRlcm4gaW50IGVsdl9zZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKK2V4dGVybiBpbnQgZWx2X3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgYmlvICosIGludCk7CiBleHRlcm4gdm9pZCBlbHZfcHV0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oIGIvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCmluZGV4IGExNDc4MjUuLmNlODUxOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNkZWZpbmUgX0xJTlVYX0VUSEVSREVWSUNFX0gKIAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0zMiw3ICszMyw3IEBACiAJCQkJICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsCiAJCQkJICAgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbik7CiBleHRlcm4gaW50CQlldGhfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQJZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gX19iZTE2CQlldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlldGhfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJdW5zaWduZWQgY2hhciAqIGhhZGRyKTsKIGV4dGVybiBpbnQJCWV0aF9oZWFkZXJfY2FjaGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCkBAIC02NSw3ICs2Niw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQogewotCXJldHVybiBhZGRyWzBdICYgMHgwMTsKKwlyZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggNGI2ZTFhYi4uYzE2NjYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTIzOSw2ICsyMzksMjAgQEAKICNkZWZpbmUgRVhUM19JT0NfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBsb25nKQogCiAvKgorICogIE1vdW50IG9wdGlvbnMKKyAqLworc3RydWN0IGV4dDNfbW91bnRfb3B0aW9ucyB7CisJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKKwl1aWRfdCBzX3Jlc3VpZDsKKwlnaWRfdCBzX3Jlc2dpZDsKKwl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworI2lmZGVmIENPTkZJR19RVU9UQQorCWludCBzX2pxdW90YV9mbXQ7CisJY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOworI2VuZGlmCit9OworCisvKgogICogU3RydWN0dXJlIG9mIGFuIGlub2RlIG9uIHRoZSBkaXNrCiAgKi8KIHN0cnVjdCBleHQzX2lub2RlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmFkdmlzZS5oIGIvaW5jbHVkZS9saW51eC9mYWR2aXNlLmgKaW5kZXggNmZjNjU2ZC4uZThlNzQ3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYWR2aXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mYWR2aXNlLmgKQEAgLTUsNyArNSwxNyBAQAogI2RlZmluZSBQT1NJWF9GQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KICNkZWZpbmUgUE9TSVhfRkFEVl9TRVFVRU5USUFMCTIgLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLiAgKi8KICNkZWZpbmUgUE9TSVhfRkFEVl9XSUxMTkVFRAkzIC8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisKKy8qCisgKiBUaGUgYWR2aXNlIHZhbHVlcyBmb3IgUE9TSVhfRkFEVl9ET05UTkVFRCBhbmQgUE9TSVhfQURWX05PUkVVU0UKKyAqIGZvciBzMzkwLTY0IGRpZmZlciBmcm9tIHRoZSB2YWx1ZXMgZm9yIHRoZSByZXN0IG9mIHRoZSB3b3JsZC4KKyAqLworI2lmIGRlZmluZWQoX19zMzkweF9fKQorI2RlZmluZSBQT1NJWF9GQURWX0RPTlRORUVECTYgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk3IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbHNlCiAjZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KICNkZWZpbmUgUE9TSVhfRkFEVl9OT1JFVVNFCTUgLyogRGF0YSB3aWxsIGJlIGFjY2Vzc2VkIG9uY2UuICAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBGQURWSVNFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmRkaWRldmljZS5oIGIvaW5jbHVkZS9saW51eC9mZGRpZGV2aWNlLmgKaW5kZXggMDAyZjYzNi4uZTYxZTQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mZGRpZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mZGRpZGV2aWNlLmgKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9mZGRpLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCi1leHRlcm4gdW5zaWduZWQgc2hvcnQJZmRkaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCitleHRlcm4gX19iZTE2CWZkZGlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19mZGRpZGV2KGludCBzaXplb2ZfcHJpdik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAzYWU4ZTM3Li4wZjUzZTAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yMTMsNiArMjEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpb190cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtNDczLDYgKzQ3NCwxMSBAQAogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdAkqaV9kbm90aWZ5OyAvKiBmb3IgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgKi8KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlzdHJ1Y3QgbGlzdF9oZWFkCWlub3RpZnlfd2F0Y2hlczsgLyogd2F0Y2hlcyBvbiB0aGlzIGlub2RlICovCisJc3RydWN0IHNlbWFwaG9yZQlpbm90aWZ5X3NlbTsJLyogcHJvdGVjdHMgdGhlIHdhdGNoZXMgbGlzdCAqLworI2VuZGlmCisKIAl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcJCWRpcnRpZWRfd2hlbjsJLyogamlmZmllcyBvZiBmaXJzdCBkaXJ0eWluZyAqLwogCkBAIC04MjIsMTYgKzgyOCwzNCBAQAogI2RlZmluZSB2ZnNfY2hlY2tfZnJvemVuKHNiLCBsZXZlbCkgXAogCXdhaXRfZXZlbnQoKHNiKS0+c193YWl0X3VuZnJvemVuLCAoKHNiKS0+c19mcm96ZW4gPCAobGV2ZWwpKSkKIAorc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19leGNsKHZvaWQpCit7CisJYXRvbWljX2luYygmY3VycmVudC0+ZnNfZXhjbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZnNfZXhjbCh2b2lkKQoreworCWF0b21pY19kZWMoJmN1cnJlbnQtPmZzX2V4Y2wpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYXNfZnNfZXhjbCh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmY3VycmVudC0+ZnNfZXhjbCk7Cit9CisKKwogLyoKICAqIFN1cGVyYmxvY2sgbG9ja2luZy4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCiB7CisJZ2V0X2ZzX2V4Y2woKTsKIAlkb3duKCZzYi0+c19sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKKwlwdXRfZnNfZXhjbCgpOwogCXVwKCZzYi0+c19sb2NrKTsKIH0KIApAQCAtMTM3NCw3ICsxMzk4LDYgQEAKIGV4dGVybiBpbnQgZG9fcmVtb3VudF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZ3MsCiAJCQkgdm9pZCAqZGF0YSwgaW50IGZvcmNlKTsKIGV4dGVybiBzZWN0b3JfdCBibWFwKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCk7Ci1leHRlcm4gaW50IHNldGF0dHJfbWFzayh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIGludCBwZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IGdlbmVyaWNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LApAQCAtMTQxNiw3ICsxNDM5LDExIEBACiBleHRlcm4gaW5vX3QgaXVuaXF1ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpOwogZXh0ZXJuIGludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1X25vd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQl1bnNpZ25lZCBsb25nIGhhc2h2YWwsIGludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLAorCQl2b2lkICpkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKIAkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqaWxvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3YTkyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaApAQCAtMCwwICsxLDI0OCBAQAorI2lmbmRlZiBfTElOVVhfRlNfTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0ZTX05PVElGWV9ICisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggLSBnZW5lcmljIGhvb2tzIGZvciBmaWxlc3lzdGVtIG5vdGlmaWNhdGlvbiwgdG8KKyAqIHJlZHVjZSBpbi1zb3VyY2UgZHVwbGljYXRpb24gZnJvbSBib3RoIGRub3RpZnkgYW5kIGlub3RpZnkuCisgKgorICogV2UgZG9uJ3QgY29tcGlsZSBhbnkgb2YgdGhpcyBhd2F5IGluIHNvbWUgY29tcGxpY2F0ZWQgbWVuYWdlcmllIG9mIGlmZGVmcy4KKyAqIEluc3RlYWQsIHdlIHJlbHkgb24gdGhlIGNvZGUgaW5zaWRlIHRvIG9wdGltaXplIGF3YXkgYXMgbmVlZGVkLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSBSb2JlcnQgTG92ZQorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorCisvKgorICogZnNub3RpZnlfbW92ZSAtIGZpbGUgb2xkX25hbWUgYXQgb2xkX2RpciB3YXMgbW92ZWQgdG8gbmV3X25hbWUgYXQgbmV3X2RpcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfbW92ZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwKKwkJCQkgY29uc3QgY2hhciAqb2xkX25hbWUsIGNvbnN0IGNoYXIgKm5ld19uYW1lLAorCQkJCSBpbnQgaXNkaXIpCit7CisJdTMyIGNvb2tpZSA9IGlub3RpZnlfZ2V0X2Nvb2tpZSgpOworCisJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKKwkJaW5vZGVfZGlyX25vdGlmeShvbGRfZGlyLCBETl9SRU5BTUUpOworCWVsc2UgeworCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7CisJCWlub2RlX2Rpcl9ub3RpZnkobmV3X2RpciwgRE5fQ1JFQVRFKTsKKwl9CisKKwlpZiAoaXNkaXIpCisJCWlzZGlyID0gSU5fSVNESVI7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChvbGRfZGlyLCBJTl9NT1ZFRF9GUk9NfGlzZGlyLGNvb2tpZSxvbGRfbmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChuZXdfZGlyLCBJTl9NT1ZFRF9UT3xpc2RpciwgY29va2llLCBuZXdfbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV91bmxpbmsgLSBmaWxlIHdhcyB1bmxpbmtlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfdW5saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9ERUxFVEUsIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0RFTEVURV9TRUxGLCAwLCBOVUxMKTsKKworCWlub3RpZnlfaW5vZGVfaXNfZGVhZChpbm9kZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9ybWRpciAtIGRpcmVjdG9yeSB3YXMgcmVtb3ZlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfcm1kaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0RFTEVURSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkaXIsSU5fREVMRVRFfElOX0lTRElSLDAsZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fREVMRVRFX1NFTEYgfCBJTl9JU0RJUiwgMCwgTlVMTCk7CisJaW5vdGlmeV9pbm9kZV9pc19kZWFkKGlub2RlKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X2NyZWF0ZSAtICduYW1lJyB3YXMgbGlua2VkIGluCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9jcmVhdGUoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbm9kZV9kaXJfbm90aWZ5KGlub2RlLCBETl9DUkVBVEUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0NSRUFURSwgMCwgbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9ta2RpciAtIGRpcmVjdG9yeSAnbmFtZScgd2FzIGNyZWF0ZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X21rZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW5vZGVfZGlyX25vdGlmeShpbm9kZSwgRE5fQ1JFQVRFKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9DUkVBVEUgfCBJTl9JU0RJUiwgMCwgbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9hY2Nlc3MgLSBmaWxlIHdhcyByZWFkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9hY2Nlc3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9BQ0NFU1M7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayB8PSBJTl9JU0RJUjsKKworCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgRE5fQUNDRVNTKTsKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X21vZGlmeSAtIGZpbGUgd2FzIG1vZGlmaWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9tb2RpZnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9NT0RJRlk7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayB8PSBJTl9JU0RJUjsKKworCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgRE5fTU9ESUZZKTsKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X29wZW4gLSBmaWxlIHdhcyBvcGVuZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X29wZW4oc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9PUEVOOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsJCit9CisKKy8qCisgKiBmc25vdGlmeV9jbG9zZSAtIGZpbGUgd2FzIGNsb3NlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwltb2RlX3QgbW9kZSA9IGZpbGUtPmZfbW9kZTsKKwl1MzIgbWFzayA9IChtb2RlICYgRk1PREVfV1JJVEUpID8gSU5fQ0xPU0VfV1JJVEUgOiBJTl9DTE9TRV9OT1dSSVRFOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBuYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X3hhdHRyIC0gZXh0ZW5kZWQgYXR0cmlidXRlcyB3ZXJlIGNoYW5nZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X3hhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXUzMiBtYXNrID0gSU5fQVRUUklCOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X2NoYW5nZSAtIG5vdGlmeV9jaGFuZ2UgZXZlbnQuICBmaWxlIHdhcyBtb2RpZmllZCBhbmQvb3IgbWV0YWRhdGEKKyAqIHdhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGlhX3ZhbGlkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGRuX21hc2sgPSAwOworCXUzMiBpbl9tYXNrID0gMDsKKworCWlmIChpYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCWluX21hc2sgfD0gSU5fQVRUUklCOworCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJaW5fbWFzayB8PSBJTl9BVFRSSUI7CisJCWRuX21hc2sgfD0gRE5fQVRUUklCOworCX0KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaW5fbWFzayB8PSBJTl9NT0RJRlk7CisJCWRuX21hc2sgfD0gRE5fTU9ESUZZOworCX0KKwkvKiBib3RoIHRpbWVzIGltcGxpZXMgYSB1dGltZShzKSBjYWxsICovCisJaWYgKChpYV92YWxpZCAmIChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSkpCisJeworCQlpbl9tYXNrIHw9IElOX0FUVFJJQjsKKwkJZG5fbWFzayB8PSBETl9BVFRSSUI7CisJfSBlbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJaW5fbWFzayB8PSBJTl9BQ0NFU1M7CisJCWRuX21hc2sgfD0gRE5fQUNDRVNTOworCX0gZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCWluX21hc2sgfD0gSU5fTU9ESUZZOworCQlkbl9tYXNrIHw9IEROX01PRElGWTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWluX21hc2sgfD0gSU5fQVRUUklCOworCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwl9CisKKwlpZiAoZG5fbWFzaykKKwkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNrKTsKKwlpZiAoaW5fbWFzaykgeworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCWluX21hc2sgfD0gSU5fSVNESVI7CisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIGluX21hc2ssIDAsIE5VTEwpOworCQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBpbl9tYXNrLCAwLAorCQkJCQkJICBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfSU5PVElGWQkvKiBpbm90aWZ5IGhlbHBlcnMgKi8KKworLyoKKyAqIGZzbm90aWZ5X29sZG5hbWVfaW5pdCAtIHNhdmUgb2ZmIHRoZSBvbGQgZmlsZW5hbWUgYmVmb3JlIHdlIGNoYW5nZSBpdAorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworfQorCisvKgorICogZnNub3RpZnlfb2xkbmFtZV9mcmVlIC0gZnJlZSB0aGUgbmFtZSB3ZSBnb3QgZnJvbSBmc25vdGlmeV9vbGRuYW1lX2luaXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X29sZG5hbWVfZnJlZShjb25zdCBjaGFyICpvbGRfbmFtZSkKK3sKKwlrZnJlZShvbGRfbmFtZSk7Cit9CisKKyNlbHNlCS8qIENPTkZJR19JTk9USUZZICovCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZnNub3RpZnlfb2xkbmFtZV9pbml0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9vbGRuYW1lX2ZyZWUoY29uc3QgY2hhciAqb2xkX25hbWUpCit7Cit9CisKKyNlbmRpZgkvKiAhIENPTkZJR19JTk9USUZZICovCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfTElOVVhfRlNfTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IDhkNmJmNjAuLjdjNzQwMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtMTIsOCArMTIsOCBAQAogICogR0ZQIGJpdG1hc2tzLi4KICAqLwogLyogWm9uZSBtb2RpZmllcnMgaW4gR0ZQX1pPTkVNQVNLIChzZWUgbGludXgvbW16b25lLmggLSBsb3cgdHdvIGJpdHMpICovCi0jZGVmaW5lIF9fR0ZQX0RNQQkweDAxCi0jZGVmaW5lIF9fR0ZQX0hJR0hNRU0JMHgwMgorI2RlZmluZSBfX0dGUF9ETUEJMHgwMXUKKyNkZWZpbmUgX19HRlBfSElHSE1FTQkweDAydQogCiAvKgogICogQWN0aW9uIG1vZGlmaWVycyAtIGRvZXNuJ3QgY2hhbmdlIHRoZSB6b25pbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKaW5kZXggODMzNmRiYS4uNTkxMjg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIExJTlVYX0hBUkRJUlFfSAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hkbGMuaCBiL2luY2x1ZGUvbGludXgvaGRsYy5oCmluZGV4IGVkMjkyN2UuLmRmNjk1ZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hkbGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hkbGMuaApAQCAtMjQyLDggKzI0Miw4IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaGRsY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2lubGluZV9fIF9fYmUxNiBoZGxjX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaCBiL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCmluZGV4IGQyMjgyMzAuLjU0MTY5NTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIF9MSU5VWF9JMkNfREVWX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogLyogU29tZSBJT0NUTCBjb21tYW5kcyBhcmUgZGVmaW5lZCBpbiA8bGludXgvaTJjLmg+ICovCiAvKiBOb3RlOiAxMC1iaXQgYWRkcmVzc2VzIGFyZSBOT1Qgc3VwcG9ydGVkISAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaAppbmRleCA1NzAyNGNlLi44NDU5OGZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaApAQCAtMzUsNiArMzUsOSBAQAogICoKICAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KICAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKgorICogMjAwNS8wNS8wNSAtIEphc29uIEdhYmxlciA8anlnYWJsZXIgYXQgbGJsIGRvdCBnb3Y+CisgKiAgICAgIC0gYWRkZWQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgWE9SIGhhc2hpbmcgcG9saWNpZXMKICAqLwogCiAjaWZuZGVmIF9MSU5VWF9JRl9CT05ESU5HX0gKQEAgLTgwLDYgKzgzLDEwIEBACiAKICNkZWZpbmUgQk9ORF9ERUZBVUxUX01BWF9CT05EUyAgMSAgIC8qIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyB0byBzdXBwb3J0ICovCiAKKy8qIGhhc2hpbmcgdHlwZXMgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIJCTAgLyogbGF5ZXIgMiAoTUFDIG9ubHkpLCBkZWZhdWx0ICovCisjZGVmaW5lIEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNAkxIC8qIGxheWVyIDMrNCAoSVAgXiBNQUMpICovCisKIHR5cGVkZWYgc3RydWN0IGlmYm9uZCB7CiAJX19zMzIgYm9uZF9tb2RlOwogCV9fczMyIG51bV9zbGF2ZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oIGIvaW5jbHVkZS9saW51eC9pZl9zaGFwZXIuaAppbmRleCAwMDRlNmYwLi42OGM4OTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfc2hhcGVyLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAlfX3UzMiBzaGFwZWNsb2NrOwogCXVuc2lnbmVkIGxvbmcgcmVjb3Zlcnk7CS8qIFRpbWUgd2UgY2FuIG5leHQgY2xvY2sgYSBwYWNrZXQgb3V0IG9uCiAJCQkJICAgYW4gZW1wdHkgcXVldWUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwlzcGlubG9ja190IGxvY2s7CiAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50ICAoKmhhcmRfc3RhcnRfeG1pdCkgKHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDM5MGU3NjAuLjBjMzFlZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0xNDgsNyArMTQ4LDYgQEAKIHN0cnVjdCBpcF9tY19zb2NrbGlzdAogewogCXN0cnVjdCBpcF9tY19zb2NrbGlzdAkqbmV4dDsKLQlpbnQJCQljb3VudDsKIAlzdHJ1Y3QgaXBfbXJlcW4JCW11bHRpOwogCXVuc2lnbmVkIGludAkJc2Ztb2RlOwkJLyogTUNBU1Rfe0lOQ0xVREUsRVhDTFVERX0gKi8KIAlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QJKnNmbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW42LmggYi9pbmNsdWRlL2xpbnV4L2luNi5oCmluZGV4IGY4MjU2YzUuLmRjZjU3MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW42LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbjYuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAjZGVmaW5lIElQVjZfQ0hFQ0tTVU0JCTcKICNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJOAogI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKLSNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAorI2RlZmluZSBJUFY2X0FVVEhIRFIJCTEwCS8qIG9ic29sZXRlICovCiAjZGVmaW5lIElQVjZfRkxPV0lORk8JCTExCiAKICNkZWZpbmUgSVBWNl9VTklDQVNUX0hPUFMJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IDAzMjA2YTQuLmM3MjdjMTk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTgxLDYgKzgxLDcgQEAKIAkubW0JCT0gTlVMTCwJCQkJCQlcCiAJLmFjdGl2ZV9tbQk9ICZpbml0X21tLAkJCQkJXAogCS5ydW5fbGlzdAk9IExJU1RfSEVBRF9JTklUKHRzay5ydW5fbGlzdCksCQkJXAorCS5pb3ByaW8JCT0gMCwJCQkJCQlcCiAJLnRpbWVfc2xpY2UJPSBIWiwJCQkJCQlcCiAJLnRhc2tzCQk9IExJU1RfSEVBRF9JTklUKHRzay50YXNrcyksCQkJXAogCS5wdHJhY2VfY2hpbGRyZW49IExJU1RfSEVBRF9JTklUKHRzay5wdHJhY2VfY2hpbGRyZW4pLAkJXApAQCAtMTEwLDYgKzExMSw3IEBACiAJLnByb2NfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwJCQkJXAogCS5qb3VybmFsX2luZm8JPSBOVUxMLAkJCQkJCVwKIAkuY3B1X3RpbWVycwk9IElOSVRfQ1BVX1RJTUVSUyh0c2suY3B1X3RpbWVycyksCQlcCisJLmZzX2V4Y2wJPSBBVE9NSUNfSU5JVCgwKSwJCQkJXAogfQogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oIGIvaW5jbHVkZS9saW51eC9pbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwYzJiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0lOT1RJRllfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2V2ZW50IC0gc3RydWN0dXJlIHJlYWQgZnJvbSB0aGUgaW5vdGlmeSBkZXZpY2UgZm9yIGVhY2ggZXZlbnQKKyAqCisgKiBXaGVuIHlvdSBhcmUgd2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBldmVudHMKKyAqIHN1Y2ggYXMgSU5fQ1JFQVRFLCBJTl9ERUxFVEUsIElOX09QRU4sIElOX0NMT1NFLCAuLi4sIHJlbGF0aXZlIHRvIHRoZSB3ZC4KKyAqLworc3RydWN0IGlub3RpZnlfZXZlbnQgeworCV9fczMyCQl3ZDsJCS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwlfX3UzMgkJbWFzazsJCS8qIHdhdGNoIG1hc2sgKi8KKwlfX3UzMgkJY29va2llOwkJLyogY29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMgKi8KKwlfX3UzMgkJbGVuOwkJLyogbGVuZ3RoIChpbmNsdWRpbmcgbnVsbHMpIG9mIG5hbWUgKi8KKwljaGFyCQluYW1lWzBdOwkvKiBzdHViIGZvciBwb3NzaWJsZSBuYW1lICovCit9OworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCwgaW1wbGVtZW50ZWQgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gd2F0Y2ggZm9yICovCisjZGVmaW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLworI2RlZmluZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgSU5fQVRUUklCCQkweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZCAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYICovCisjZGVmaW5lIElOX01PVkVEX1RPCQkweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCQkweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFCQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCBldmVudHMuICB0aGV5IGFyZSBzZW50IGFzIG5lZWRlZCB0byBhbnkgd2F0Y2ggKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgSU5fUV9PVkVSRkxPVwkJMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQgKi8KKworLyogaGVscGVyIGV2ZW50cyAqLworI2RlZmluZSBJTl9DTE9TRQkJKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogY2xvc2UgKi8KKyNkZWZpbmUgSU5fTU9WRQkJCShJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIG1vdmVzICovCisKKy8qIHNwZWNpYWwgZmxhZ3MgKi8KKyNkZWZpbmUgSU5fSVNESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKyNkZWZpbmUgSU5fT05FU0hPVAkJMHg4MDAwMDAwMAkvKiBvbmx5IHNlbmQgZXZlbnQgb25jZSAqLworCisvKgorICogQWxsIG9mIHRoZSBldmVudHMgLSB3ZSBidWlsZCB0aGUgbGlzdCBieSBoYW5kIHNvIHRoYXQgd2UgY2FuIGFkZCBmbGFncyBpbgorICogdGhlIGZ1dHVyZSBhbmQgbm90IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBBcHBzIHdpbGwgZ2V0IG9ubHkgdGhlCisgKiBldmVudHMgdGhhdCB0aGV5IG9yaWdpbmFsbHkgd2FudGVkLiAgQmUgc3VyZSB0byBhZGQgbmV3IGV2ZW50cyBoZXJlIQorICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJKElOX0FDQ0VTUyB8IElOX01PRElGWSB8IElOX0FUVFJJQiB8IElOX0NMT1NFX1dSSVRFIHwgXAorCQkJIElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTSB8IFwKKwkJCSBJTl9NT1ZFRF9UTyB8IElOX0RFTEVURSB8IElOX0NSRUFURSB8IElOX0RFTEVURV9TRUxGKQorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19JTk9USUZZCisKK2V4dGVybiB2b2lkIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoc3RydWN0IGlub2RlICosIF9fdTMyLCBfX3UzMiwKKwkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KHN0cnVjdCBkZW50cnkgKiwgX191MzIsIF9fdTMyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9pbm9kZV9pc19kZWFkKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJCSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X3VubW91bnRfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X2lub2RlX2lzX2RlYWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSU5PVElGWSAqLworCisjZW5kaWYJLyogX19LRVJORUwgX18gKi8KKworI2VuZGlmCS8qIF9MSU5VWF9JTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCA5ZDk1OThlLi5iOWNjMGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC04NTksNiArODU5LDEwIEBACiAJaW50ICgqZXJhc2VfZWZmZWN0KShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBlZmZlY3RfaWQpOwogCiAJc3RydWN0IGlucHV0X2hhbmRsZSAqZ3JhYjsKKworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwkvKiBzZXJpYWxpemVzIG9wZW4gYW5kIGNsb3NlIG9wZXJhdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDU5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgSU9QUklPX0gKKyNkZWZpbmUgSU9QUklPX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKy8qCisgKiBHaXZlcyB1cyA4IHByaW8gY2xhc3NlcyB3aXRoIDEzLWJpdHMgb2YgZGF0YSBmb3IgZWFjaCBjbGFzcworICovCisjZGVmaW5lIElPUFJJT19CSVRTCQkoMTYpCisjZGVmaW5lIElPUFJJT19DTEFTU19TSElGVAkoMTMpCisjZGVmaW5lIElPUFJJT19QUklPX01BU0sJKCgxVUwgPDwgSU9QUklPX0NMQVNTX1NISUZUKSAtIDEpCisKKyNkZWZpbmUgSU9QUklPX1BSSU9fQ0xBU1MobWFzaykJKChtYXNrKSA+PiBJT1BSSU9fQ0xBU1NfU0hJRlQpCisjZGVmaW5lIElPUFJJT19QUklPX0RBVEEobWFzaykJKChtYXNrKSAmIElPUFJJT19QUklPX01BU0spCisjZGVmaW5lIElPUFJJT19QUklPX1ZBTFVFKGNsYXNzLCBkYXRhKQkoKChjbGFzcykgPDwgSU9QUklPX0NMQVNTX1NISUZUKSB8IGRhdGEpCisKKyNkZWZpbmUgaW9wcmlvX3ZhbGlkKG1hc2spCShJT1BSSU9fUFJJT19DTEFTUygobWFzaykpICE9IElPUFJJT19DTEFTU19OT05FKQorCisvKgorICogVGhlc2UgYXJlIHRoZSBpbyBwcmlvcml0eSBncm91cHMgYXMgaW1wbGVtZW50ZWQgYnkgQ0ZRLiBSVCBpcyB0aGUgcmVhbHRpbWUKKyAqIGNsYXNzLCBpdCBhbHdheXMgZ2V0cyBwcmVtaXVtIHNlcnZpY2UuIEJFIGlzIHRoZSBiZXN0LWVmZm9ydCBzY2hlZHVsaW5nCisgKiBjbGFzcywgdGhlIGRlZmF1bHQgZm9yIGFueSBwcm9jZXNzLiBJRExFIGlzIHRoZSBpZGxlIHNjaGVkdWxpbmcgY2xhc3MsIGl0CisgKiBpcyBvbmx5IHNlcnZlZCB3aGVuIG5vIG9uZSBlbHNlIGlzIHVzaW5nIHRoZSBkaXNrLgorICovCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFLAorfTsKKworLyoKKyAqIDggYmVzdCBlZmZvcnQgcHJpb3JpdHkgbGV2ZWxzIGFyZSBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBJT1BSSU9fQkVfTlIJKDgpCisKK2VudW0geworCUlPUFJJT19XSE9fUFJPQ0VTUyA9IDEsCisJSU9QUklPX1dIT19QR1JQLAorCUlPUFJJT19XSE9fVVNFUiwKK307CisKKy8qCisgKiBpZiBwcm9jZXNzIGhhcyBzZXQgaW8gcHJpb3JpdHkgZXhwbGljaXRseSwgdXNlIHRoYXQuIGlmIG5vdCwgY29udmVydAorICogdGhlIGNwdSBzY2hlZHVsZXIgbmljZSB2YWx1ZSB0byBhbiBpbyBwcmlvcml0eQorICovCisjZGVmaW5lIElPUFJJT19OT1JNCSg0KQorc3RhdGljIGlubGluZSBpbnQgdGFza19pb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCVdBUk5fT04oIWlvcHJpb192YWxpZCh0YXNrLT5pb3ByaW8pKTsKKwlyZXR1cm4gSU9QUklPX1BSSU9fREFUQSh0YXNrLT5pb3ByaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YXNrX25pY2VfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gKHRhc2tfbmljZSh0YXNrKSArIDIwKSAvIDU7Cit9CisKKy8qCisgKiBGb3IgaW5oZXJpdGFuY2UsIHJldHVybiB0aGUgaGlnaGVzdCBvZiB0aGUgdHdvIGdpdmVuIHByaW9yaXRpZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW9wcmlvX2Jlc3QodW5zaWduZWQgc2hvcnQgYXByaW8sIHVuc2lnbmVkIHNob3J0IGJwcmlvKQoreworCXVuc2lnbmVkIHNob3J0IGFjbGFzcyA9IElPUFJJT19QUklPX0NMQVNTKGFwcmlvKTsKKwl1bnNpZ25lZCBzaG9ydCBiY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyhicHJpbyk7CisKKwlpZiAoIWlvcHJpb192YWxpZChhcHJpbykpCisJCXJldHVybiBicHJpbzsKKwlpZiAoIWlvcHJpb192YWxpZChicHJpbykpCisJCXJldHVybiBhcHJpbzsKKworCWlmIChhY2xhc3MgPT0gSU9QUklPX0NMQVNTX05PTkUpCisJCWFjbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwlpZiAoYmNsYXNzID09IElPUFJJT19DTEFTU19OT05FKQorCQliY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisKKwlpZiAoYWNsYXNzID09IGJjbGFzcykKKwkJcmV0dXJuIG1pbihhcHJpbywgYnByaW8pOworCWlmIChhY2xhc3MgPiBiY2xhc3MpCisJCXJldHVybiBicHJpbzsKKwllbHNlCisJCXJldHVybiBhcHJpbzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCAxMjI3Nzc5Li4wNjlkM2I4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTg1LDkgKzg1LDEwIEBACiBleHRlcm4gaW50IG5vaXJxZGVidWdfc2V0dXAoY2hhciAqc3RyKTsKIAogZXh0ZXJuIGZhc3RjYWxsIGludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSAgICAgICBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOworCQkJCQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwogZXh0ZXJuIGZhc3RjYWxsIHVuc2lnbmVkIGludCBfX2RvX0lSUSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpbnQgYWN0aW9uX3JldCk7CitleHRlcm4gdm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLAorCQkJCQlpbnQgYWN0aW9uX3JldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBjYW5fcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgbG9uZyBpcnFmbGFncyk7CiAKIGV4dGVybiB2b2lkIGluaXRfaXJxX3Byb2Modm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2pmZnMyX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L2pmZnMyX2ZzX3NiLmgKaW5kZXggNGFmYzhkOC4uMWUyMTU0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qZmZzMl9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvamZmczJfZnNfc2IuaApAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogamZmczJfZnNfc2IuaCx2IDEuNDggMjAwNC8xMS8yMCAxMDo0MToxMiBkd213MiBFeHAgJCAqLworLyogJElkOiBqZmZzMl9mc19zYi5oLHYgMS41MiAyMDA1LzA1LzE5IDE2OjEyOjE3IGdsZWl4bmVyIEV4cCAkICovCiAKICNpZm5kZWYgX0pGRlMyX0ZTX1NCCiAjZGVmaW5lIF9KRkZTMl9GU19TQgpAQCAtMTQsNyArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAKICNkZWZpbmUgSkZGUzJfU0JfRkxBR19STyAxCi0jZGVmaW5lIEpGRlMyX1NCX0ZMQUdfTU9VTlRJTkcgMgorI2RlZmluZSBKRkZTMl9TQl9GTEFHX1NDQU5OSU5HIDIgLyogRmxhc2ggc2Nhbm5pbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgSkZGUzJfU0JfRkxBR19CVUlMRElORyA0IC8qIEZpbGUgc3lzdGVtIGJ1aWxkaW5nIGlzIGluIHByb2dyZXNzICovCiAKIHN0cnVjdCBqZmZzMl9pbm9kaXJ0eTsKIApAQCAtMzEsNyArMzIsNyBAQAogCXVuc2lnbmVkIGludCBmbGFnczsKIAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZ2NfdGFzazsJLyogR0MgdGFzayBzdHJ1Y3QgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIGdjX3RocmVhZF9zdGFydDsgLyogR0MgdGhyZWFkIHN0YXJ0IG11dGV4ICovCisJc3RydWN0IGNvbXBsZXRpb24gZ2NfdGhyZWFkX3N0YXJ0OyAvKiBHQyB0aHJlYWQgc3RhcnQgY29tcGxldGlvbiAqLwogCXN0cnVjdCBjb21wbGV0aW9uIGdjX3RocmVhZF9leGl0OyAvKiBHQyB0aHJlYWQgZXhpdCBjb21wbGV0aW9uIHBvcnQgKi8KIAogCXN0cnVjdCBzZW1hcGhvcmUgYWxsb2Nfc2VtOwkvKiBVc2VkIHRvIHByb3RlY3QgYWxsIHRoZSBmb2xsb3dpbmcgCkBAIC05NCw3ICs5NSw3IEBACiAJICAgdG8gYW4gb2Jzb2xldGVkIG5vZGUuIEkgZG9uJ3QgbGlrZSB0aGlzLiBBbHRlcm5hdGl2ZXMgd2VsY29tZWQuICovCiAJc3RydWN0IHNlbWFwaG9yZSBlcmFzZV9mcmVlX3NlbTsKIAotI2lmIGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgfHwgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCS8qIFdyaXRlLWJlaGluZCBidWZmZXIgZm9yIE5BTkQgZmxhc2ggKi8KIAl1bnNpZ25lZCBjaGFyICp3YnVmOwogCXVpbnQzMl90IHdidWZfb2ZzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qb3lzdGljay5oIGIvaW5jbHVkZS9saW51eC9qb3lzdGljay5oCmluZGV4IGI3ZTBhYjYuLjA2YjlhZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvam95c3RpY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmgKQEAgLTExMSwxOCArMTExLDM1IEBACiAjZGVmaW5lIEpTX1NFVF9BTEwJCTgKIAogc3RydWN0IEpTX0RBVEFfVFlQRSB7Ci0JaW50IGJ1dHRvbnM7Ci0JaW50IHg7Ci0JaW50IHk7CisJX19zMzIgYnV0dG9uczsKKwlfX3MzMiB4OworCV9fczMyIHk7CiB9OwogCi1zdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEUgewotCWludCBKU19USU1FT1VUOwotCWludCBCVVNZOwotCWxvbmcgSlNfRVhQSVJFVElNRTsKLQlsb25nIEpTX1RJTUVMSU1JVDsKK3N0cnVjdCBKU19EQVRBX1NBVkVfVFlQRV8zMiB7CisJX19zMzIgSlNfVElNRU9VVDsKKwlfX3MzMiBCVVNZOworCV9fczMyIEpTX0VYUElSRVRJTUU7CisJX19zMzIgSlNfVElNRUxJTUlUOwogCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfU0FWRTsKIAlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX0NPUlI7CiB9OwogCitzdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEVfNjQgeworCV9fczMyIEpTX1RJTUVPVVQ7CisJX19zMzIgQlVTWTsKKwlfX3M2NCBKU19FWFBJUkVUSU1FOworCV9fczY0IEpTX1RJTUVMSU1JVDsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX1NBVkU7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19DT1JSOworfTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNkZWZpbmUgSlNfREFUQV9TQVZFX1RZUEUgSlNfREFUQV9TQVZFX1RZUEVfNjQKKyNlbGlmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKyNkZWZpbmUgSlNfREFUQV9TQVZFX1RZUEUgSlNfREFUQV9TQVZFX1RZUEVfMzIKKyNlbHNlCisjZXJyb3IgVW5leHBlY3RlZCBCSVRTX1BFUl9MT05HCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9KT1lTVElDS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaCBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCmluZGV4IDVlMWE3YjAuLmUwNTBmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCkBAIC0xMDQsMzMgKzEwNCwxMiBAQAogfTsKIAogI2lmZGVmIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUwotZXh0ZXJuIGludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICphcmNoX2dldF9rcHJvYmVfdGFzayh2b2lkICpwdHIpOwogZXh0ZXJuIHZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgYXJjaF9rcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKTsKICNlbHNlIC8qIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUyAqLwotc3RhdGljIGlubGluZSB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpCi17Ci19Ci1zdGF0aWMgaW5saW5lIGludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwKLQkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIHRyYW1wb2xpbmVfcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsCi0JCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci19CiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwKIAkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9rcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQotewotfQotI2RlZmluZSBhcmNoX2dldF9rcHJvYmVfdGFzayhwdHIpICgoc3RydWN0IHRhc2tfc3RydWN0ICopTlVMTCkKICNlbmRpZiAvKiBBUkNIX1NVUFBPUlRTX0tSRVRQUk9CRVMgKi8KIC8qCiAgKiBGdW5jdGlvbi1yZXR1cm4gcHJvYmUgLQpAQCAtMTU1LDggKzEzNCw4IEBACiAJc3RydWN0IGhsaXN0X25vZGUgdWZsaXN0OyAvKiBlaXRoZXIgb24gZnJlZSBsaXN0IG9yIHVzZWQgbGlzdCAqLwogCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OwogCXN0cnVjdCBrcmV0cHJvYmUgKnJwOwotCXZvaWQgKnJldF9hZGRyOwotCXZvaWQgKnN0YWNrX2FkZHI7CisJa3Byb2JlX29wY29kZV90ICpyZXRfYWRkcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiB9OwogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKQEAgLTE3Niw3ICsxNTUsMTAgQEAKIGV4dGVybiB2b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKK2V4dGVybiBpbnQgYXJjaF9pbml0X2twcm9iZXModm9pZCk7CiBleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4ga3Byb2JlX29wY29kZV90ICpnZXRfaW5zbl9zbG90KHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9pbnNuX3Nsb3Qoa3Byb2JlX29wY29kZV90ICpzbG90KTsKIAogLyogR2V0IHRoZSBrcHJvYmUgYXQgdGhpcyBhZGRyIChpZiBhbnkpLiAgTXVzdCBoYXZlIGNhbGxlZCBsb2NrX2twcm9iZXMgKi8KIHN0cnVjdCBrcHJvYmUgKmdldF9rcHJvYmUodm9pZCAqYWRkcik7CkBAIC0xOTQsOCArMTc2LDYgQEAKIHZvaWQgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApOwogCiBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfZnJlZV9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKTsKLXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF9ycF9pbnN0KHZvaWQgKnNhcmEpOwotc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqZ2V0X3JwX2luc3RfdHNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspOwogdm9pZCBhZGRfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSk7CiB2b2lkIGtwcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspOwogdm9pZCByZWN5Y2xlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJwczIuaCBiL2luY2x1ZGUvbGludXgvbGlicHMyLmgKaW5kZXggOTIzYmRiYy4uYTcxMGJkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJwczIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCkBAIC00MSw2ICs0MSw3IEBACiAKIHZvaWQgcHMyX2luaXQoc3RydWN0IHBzMmRldiAqcHMyZGV2LCBzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIGludCBwczJfc2VuZGJ5dGUoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyIGJ5dGUsIGludCB0aW1lb3V0KTsKK3ZvaWQgcHMyX2RyYWluKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgaW50IG1heGJ5dGVzLCBpbnQgdGltZW91dCk7CiBpbnQgcHMyX2NvbW1hbmQoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyICpwYXJhbSwgaW50IGNvbW1hbmQpOwogaW50IHBzMl9zY2hlZHVsZV9jb21tYW5kKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciAqcGFyYW0sIGludCBjb21tYW5kKTsKIGludCBwczJfaGFuZGxlX2FjayhzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAppbmRleCBkNmViN2IyLi5kY2U1M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKQEAgLTE3NCw1ICsxNzQsNjIgQEAKIAlfX3U4IHByb3RvOwogfTsKIAorLyoKKyAqIFN0cnVjdCB1c2VkIGZvciBtYXRjaGluZyBhIGRldmljZQorICovCitzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCit7CisJY2hhcgluYW1lWzMyXTsKKwljaGFyCXR5cGVbMzJdOworCWNoYXIJY29tcGF0aWJsZVsxMjhdOworCXZvaWQJKmRhdGE7Cit9OworCisKKy8qIFBDTUNJQSAqLworCitzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB7CisJX191MTYJCW1hdGNoX2ZsYWdzOworCisJX191MTYJCW1hbmZfaWQ7CisJX191MTYgCQljYXJkX2lkOworCisJX191OCAgCQlmdW5jX2lkOworCisJLyogZm9yIHJlYWwgbXVsdGktZnVuY3Rpb24gZGV2aWNlcyAqLworCV9fdTggIAkJZnVuY3Rpb247CisKKwkvKiBmb3IgcHNldWRlIG11bHRpLWZ1bmN0aW9uIGRldmljZXMgKi8KKwlfX3U4ICAJCWRldmljZV9ubzsKKworCV9fdTMyIAkJcHJvZF9pZF9oYXNoWzRdOworCisJLyogbm90IG1hdGNoZWQgYWdhaW5zdCBpbiBrZXJuZWxzcGFjZSovCisjaWZkZWYgX19LRVJORUxfXworCWNvbnN0IGNoYXIgKglwcm9kX2lkWzRdOworI2Vsc2UKKwlrZXJuZWxfdWxvbmdfdAlwcm9kX2lkWzRdOworI2VuZGlmCisKKwkvKiBub3QgbWF0Y2hlZCBhZ2FpbnN0ICovCisJa2VybmVsX3Vsb25nX3QJZHJpdmVyX2luZm87CisjaWZkZWYgX19LRVJORUxfXworCWNoYXIgKgkJY2lzZmlsZTsKKyNlbHNlCisJa2VybmVsX3Vsb25nX3QJY2lzZmlsZTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUQJMHgwMDAxCisjZGVmaW5lIFBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRAkweDAwMDIKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DX0lECTB4MDAwNAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OCTB4MDAwOAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxCTB4MDAxMAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyCTB4MDAyMAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzCTB4MDA0MAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQ0CTB4MDA4MAorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTwkweDAxMDAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUwkweDAyMDAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9BTk9OWU1PVVMJMHgwNDAwCiAKICNlbmRpZiAvKiBMSU5VWF9NT0RfREVWSUNFVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb3VudC5oIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCmluZGV4IDhiOGQzYjkuLmY4ZjM5OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW91bnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNkZWZpbmUgX0xJTlVYX01PVU5UX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTM0LDcgKzM1LDcgQEAKIAlpbnQgbW50X2V4cGlyeV9tYXJrOwkJLyogdHJ1ZSBpZiBtYXJrZWQgZm9yIGV4cGlyeSAqLwogCWNoYXIgKm1udF9kZXZuYW1lOwkJLyogTmFtZSBvZiBkZXZpY2UgZS5nLiAvZGV2L2Rzay9oZGExICovCiAJc3RydWN0IGxpc3RfaGVhZCBtbnRfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG1udF9mc2xpbms7CS8qIGxpbmsgaW4gZnMtc3BlY2lmaWMgZXhwaXJ5IGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1udF9leHBpcmU7CS8qIGxpbmsgaW4gZnMtc3BlY2lmaWMgZXhwaXJ5IGxpc3QgKi8KIAlzdHJ1Y3QgbmFtZXNwYWNlICptbnRfbmFtZXNwYWNlOyAvKiBjb250YWluaW5nIG5hbWVzcGFjZSAqLwogfTsKIApAQCAtNDcsNyArNDgsNyBAQAogCiBleHRlcm4gdm9pZCBfX21udHB1dChzdHJ1Y3QgdmZzbW91bnQgKm1udCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfbW50cHV0KHN0cnVjdCB2ZnNtb3VudCAqbW50KQorc3RhdGljIGlubGluZSB2b2lkIG1udHB1dF9ub19leHBpcmUoc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJaWYgKG1udCkgewogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbW50LT5tbnRfY291bnQpKQpAQCAtNTksNyArNjAsNyBAQAogewogCWlmIChtbnQpIHsKIAkJbW50LT5tbnRfZXhwaXJ5X21hcmsgPSAwOwotCQlfbW50cHV0KG1udCk7CisJCW1udHB1dF9ub19leHBpcmUobW50KTsKIAl9CiB9CiAKQEAgLTc2LDYgKzc3LDcgQEAKIGV4dGVybiB2b2lkIG1hcmtfbW91bnRzX2Zvcl9leHBpcnkoc3RydWN0IGxpc3RfaGVhZCAqbW91bnRzKTsKIAogZXh0ZXJuIHNwaW5sb2NrX3QgdmZzbW91bnRfbG9jazsKK2V4dGVybiBkZXZfdCBuYW1lX3RvX2Rldl90KGNoYXIgKm5hbWUpOwogCiAjZW5kaWYKICNlbmRpZiAvKiBfTElOVVhfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvY2ZpLmggYi9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaAppbmRleCAyZWQ4YzU4Li5lNmI2YTFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaApAQCAtMSw3ICsxLDcgQEAKIAogLyogQ29tbW9uIEZsYXNoIEludGVyZmFjZSBzdHJ1Y3R1cmVzIAogICogU2VlIGh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbS9kZXNpZ24vZmxhc2gvdGVjaG5vdGUvaW5kZXguaHRtCi0gKiAkSWQ6IGNmaS5oLHYgMS41MCAyMDA0LzExLzIwIDEyOjQ2OjUxIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGNmaS5oLHYgMS41NCAyMDA1LzA2LzA2IDIzOjA0OjM2IHRwb3lub3IgRXhwICQKICAqLwogCiAjaWZuZGVmIF9fTVREX0NGSV9IX18KQEAgLTE0OCw2ICsxNDgsMTQgQEAKIAl1aW50OF90ICBleHRyYVswXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBjZmlfaW50ZWxleHRfb3RwaW5mbyB7CisJdWludDMyX3QgUHJvdFJlZ0FkZHI7CisJdWludDE2X3QgRmFjdEdyb3VwczsKKwl1aW50OF90ICBGYWN0UHJvdFJlZ1NpemU7CisJdWludDE2X3QgVXNlckdyb3VwczsKKwl1aW50OF90ICBVc2VyUHJvdFJlZ1NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCiBzdHJ1Y3QgY2ZpX2ludGVsZXh0X2Jsb2NraW5mbyB7CiAJdWludDE2X3QgTnVtSWRlbnRCbG9ja3M7CiAJdWludDE2X3QgQmxvY2tTaXplOwpAQCAtMjQ0LDcgKzI1Miw3IEBACiAgKiBJdCBsb29rcyB0b28gbG9uZyB0byBiZSBpbmxpbmUsIGJ1dCBpbiB0aGUgY29tbW9uIGNhc2UgaXQgc2hvdWxkIGFsbW9zdCBhbGwKICAqIGdldCBvcHRpbWlzZWQgYXdheS4gCiAgKi8KLXN0YXRpYyBpbmxpbmUgbWFwX3dvcmQgY2ZpX2J1aWxkX2NtZCh1X2NoYXIgY21kLCBzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGNmaV9wcml2YXRlICpjZmkpCitzdGF0aWMgaW5saW5lIG1hcF93b3JkIGNmaV9idWlsZF9jbWQodV9sb25nIGNtZCwgc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKQogewogCW1hcF93b3JkIHZhbCA9IHsgezB9IH07CiAJaW50IHdvcmR3aWR0aCwgd29yZHNfcGVyX2J1cywgY2hpcF9tb2RlLCBjaGlwc19wZXJfd29yZDsKQEAgLTMwNyw2ICszMTUsNjkgQEAKIH0KICNkZWZpbmUgQ01EKHgpICBjZmlfYnVpbGRfY21kKCh4KSwgbWFwLCBjZmkpCiAKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGNmaV9tZXJnZV9zdGF0dXMobWFwX3dvcmQgdmFsLCBzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgCisJCQkJCSAgIHN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKQoreworCWludCB3b3Jkd2lkdGgsIHdvcmRzX3Blcl9idXMsIGNoaXBfbW9kZSwgY2hpcHNfcGVyX3dvcmQ7CisJdW5zaWduZWQgbG9uZyBvbmVzdGF0LCByZXMgPSAwOworCWludCBpOworCisJLyogV2UgZG8gaXQgdGhpcyB3YXkgdG8gZ2l2ZSB0aGUgY29tcGlsZXIgYSBmaWdodGluZyBjaGFuY2UgCisJICAgb2Ygb3B0aW1pc2luZyBhd2F5IGFsbCB0aGUgY3JhcCBmb3IgJ2Jhbmt3aWR0aCcgbGFyZ2VyIHRoYW4KKwkgICBhbiB1bnNpZ25lZCBsb25nLCBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhhdCBzdXBwb3J0IGlzCisJICAgZGlzYWJsZWQgKi8KKwlpZiAobWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApKSB7CisJCXdvcmR3aWR0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJd29yZHNfcGVyX2J1cyA9IChtYXBfYmFua3dpZHRoKG1hcCkpIC8gd29yZHdpZHRoOyAvLyBpLmUuIG5vcm1hbGx5IDEKKwl9IGVsc2UgeworCQl3b3Jkd2lkdGggPSBtYXBfYmFua3dpZHRoKG1hcCk7CisJCXdvcmRzX3Blcl9idXMgPSAxOworCX0KKwkKKwljaGlwX21vZGUgPSBtYXBfYmFua3dpZHRoKG1hcCkgLyBjZmlfaW50ZXJsZWF2ZShjZmkpOworCWNoaXBzX3Blcl93b3JkID0gd29yZHdpZHRoICogY2ZpX2ludGVybGVhdmUoY2ZpKSAvIG1hcF9iYW5rd2lkdGgobWFwKTsKKworCW9uZXN0YXQgPSB2YWwueFswXTsKKwkvKiBPciBhbGwgc3RhdHVzIHdvcmRzIHRvZ2V0aGVyICovCisJZm9yIChpPTE7IGkgPCB3b3Jkc19wZXJfYnVzOyBpKyspIHsKKwkJb25lc3RhdCB8PSB2YWwueFtpXTsKKwl9CisKKwlyZXMgPSBvbmVzdGF0OworCXN3aXRjaChjaGlwc19wZXJfd29yZCkgeworCWRlZmF1bHQ6IEJVRygpOworI2lmIEJJVFNfUEVSX0xPTkcgPj0gNjQKKwljYXNlIDg6CisJCXJlcyB8PSAob25lc3RhdCA+PiAoY2hpcF9tb2RlICogMzIpKTsKKyNlbmRpZgorCWNhc2UgNDoKKwkJcmVzIHw9IChvbmVzdGF0ID4+IChjaGlwX21vZGUgKiAxNikpOworCWNhc2UgMjoKKwkJcmVzIHw9IChvbmVzdGF0ID4+IChjaGlwX21vZGUgKiA4KSk7CisJY2FzZSAxOgorCQk7CisJfQorCisJLyogTGFzdCwgZGV0ZXJtaW5lIHdoYXQgdGhlIGJpdC1wYXR0ZXJuIHNob3VsZCBiZSBmb3IgYSBzaW5nbGUKKwkgICBkZXZpY2UsIGFjY29yZGluZyB0byBjaGlwIG1vZGUgYW5kIGVuZGlhbm5lc3MuLi4gKi8KKwlzd2l0Y2ggKGNoaXBfbW9kZSkgeworCWNhc2UgMToKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXMgPSBjZmkxNl90b19jcHUocmVzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyZXMgPSBjZmkzMl90b19jcHUocmVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogQlVHKCk7CisJfQorCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgTUVSR0VTVEFUVVMoeCkgY2ZpX21lcmdlX3N0YXR1cygoeCksIG1hcCwgY2ZpKQorCisKIC8qCiAgKiBTZW5kcyBhIENGSSBjb21tYW5kIHRvIGEgYmFuayBvZiBmbGFzaCBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LgogICoKQEAgLTM1NywxNiArNDI4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjZmlfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKm11dGV4KQotewotCXNwaW5fbG9ja19iaChtdXRleCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjZmlfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbXV0ZXgpCi17Ci0Jc3Bpbl91bmxvY2tfYmgobXV0ZXgpOwotfQotCiBzdHJ1Y3QgY2ZpX2V4dHF1ZXJ5ICpjZmlfcmVhZF9wcmkoc3RydWN0IG1hcF9pbmZvICptYXAsIHVpbnQxNl90IGFkciwgdWludDE2X3Qgc2l6ZSwKIAkJCSAgICAgY29uc3QgY2hhciogbmFtZSk7CiBzdHJ1Y3QgY2ZpX2ZpeHVwIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2ZsYXNoY2hpcC5oIGIvaW5jbHVkZS9saW51eC9tdGQvZmxhc2hjaGlwLmgKaW5kZXggYzY2YmE4MS4uNjc1Nzc2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvZmxhc2hjaGlwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvZmxhc2hjaGlwLmgKQEAgLTYsNyArNiw3IEBACiAgKgogICogKEMpIDIwMDAgUmVkIEhhdC4gR1BMZC4KICAqCi0gKiAkSWQ6IGZsYXNoY2hpcC5oLHYgMS4xNSAyMDA0LzExLzA1IDIyOjQxOjA2IG5pY28gRXhwICQKKyAqICRJZDogZmxhc2hjaGlwLmgsdiAxLjE3IDIwMDUvMDMvMTQgMTg6Mjc6MTUgYmpkIEV4cCAkCiAgKgogICovCiAKQEAgLTI5LDYgKzI5LDcgQEAKIAlGTF9FUkFTRV9TVVNQRU5ERUQsCiAJRkxfV1JJVElORywKIAlGTF9XUklUSU5HX1RPX0JVRkZFUiwKKwlGTF9PVFBfV1JJVEUsCiAJRkxfV1JJVEVfU1VTUEVORElORywKIAlGTF9XUklURV9TVVNQRU5ERUQsCiAJRkxfUE1fU1VTUEVOREVELApAQCAtNjIsOCArNjMsOCBAQAogCWZsc3RhdGVfdCBzdGF0ZTsKIAlmbHN0YXRlX3Qgb2xkc3RhdGU7CiAKLQlpbnQgd3JpdGVfc3VzcGVuZGVkOjE7Ci0JaW50IGVyYXNlX3N1c3BlbmRlZDoxOworCXVuc2lnbmVkIGludCB3cml0ZV9zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZCBpbnQgZXJhc2Vfc3VzcGVuZGVkOjE7CiAJdW5zaWduZWQgbG9uZyBpbl9wcm9ncmVzc19ibG9ja19hZGRyOwogCiAJc3BpbmxvY2tfdCAqbXV0ZXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvaW5mdGwuaAppbmRleCBiNTJjOGNiLi4wMjY4MTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmgKQEAgLTMsNyArMyw3IEBACiAgKgogICoJKEMpIENvcHlyaWdodCAyMDAyLCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQogICoKLSAqCSRJZDogaW5mdGwuaCx2IDEuNiAyMDA0LzA2LzMwIDE0OjQ5OjAwIGRicm93biBFeHAgJAorICoJJElkOiBpbmZ0bC5oLHYgMS43IDIwMDUvMDYvMTMgMTM6MDg6NDUgc2VhbiBFeHAgJAogICovCiAKICNpZm5kZWYgX19NVERfSU5GVExfSF9fCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bXRkL2luZnRsLXVzZXIuaD4KIAogI2lmbmRlZiBJTkZUTF9NQUpPUgotI2RlZmluZSBJTkZUTF9NQUpPUiA5NAorI2RlZmluZSBJTkZUTF9NQUpPUiA5NgogI2VuZGlmCiAjZGVmaW5lIElORlRMX1BBUlROX0JJVFMgNAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL21hcC5oCmluZGV4IGYwMjY4YjkuLjE0Mjk2M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL21hcC5oCkBAIC0xLDYgKzEsNiBAQAogCiAvKiBPdmVyaGF1bGVkIHJvdXRpbmVzIGZvciBkZWFsaW5nIHdpdGggZGlmZmVyZW50IG1tYXAgcmVnaW9ucyBvZiBmbGFzaCAqLwotLyogJElkOiBtYXAuaCx2IDEuNDYgMjAwNS8wMS8wNSAxNzowOTo0NCBkd213MiBFeHAgJCAqLworLyogJElkOiBtYXAuaCx2IDEuNTIgMjAwNS8wNS8yNSAxMDoyOTo0MSBnbGVpeG5lciBFeHAgJCAqLwogCiAjaWZuZGVmIF9fTElOVVhfTVREX01BUF9IX18KICNkZWZpbmUgX19MSU5VWF9NVERfTUFQX0hfXwpAQCAtMjYzLDYgKzI2MywxNyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgaW5saW5lIG1hcF93b3JkIG1hcF93b3JkX2NscihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgdmFsMSwgbWFwX3dvcmQgdmFsMikKK3sKKwltYXBfd29yZCByOworCWludCBpOworCisJZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykgeworCQlyLnhbaV0gPSB2YWwxLnhbaV0gJiB+dmFsMi54W2ldOworCX0KKwlyZXR1cm4gcjsKK30KKwogc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9vcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgdmFsMSwgbWFwX3dvcmQgdmFsMikKIHsKIAltYXBfd29yZCByOwpAQCAtMjczLDYgKzI4NCw3IEBACiAJfQogCXJldHVybiByOwogfQorCiAjZGVmaW5lIG1hcF93b3JkX2FuZGVxdWFsKG0sIGEsIGIsIHopIG1hcF93b3JkX2VxdWFsKG0sIHosIG1hcF93b3JkX2FuZChtLCBhLCBiKSkKIAogc3RhdGljIGlubGluZSBpbnQgbWFwX3dvcmRfYml0c3NldChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgdmFsMSwgbWFwX3dvcmQgdmFsMikKQEAgLTMyOCwxNiArMzQwLDI3IEBACiAJcmV0dXJuIG9yaWc7CiB9CiAKKyNpZiBCSVRTX1BFUl9MT05HIDwgNjQKKyNkZWZpbmUgTUFQX0ZGX0xJTUlUIDQKKyNlbHNlCisjZGVmaW5lIE1BUF9GRl9MSU1JVCA4CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9mZihzdHJ1Y3QgbWFwX2luZm8gKm1hcCkKIHsKIAltYXBfd29yZCByOwogCWludCBpOwotCi0JZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykgewotCQlyLnhbaV0gPSB+MFVMOworCQorCWlmIChtYXBfYmFua3dpZHRoKG1hcCkgPCBNQVBfRkZfTElNSVQpIHsKKwkJaW50IGJ3ID0gOCAqIG1hcF9iYW5rd2lkdGgobWFwKTsKKwkJci54WzBdID0gKDEgPDwgYncpIC0gMTsKKwl9IGVsc2UgeworCQlmb3IgKGk9MDsgaTxtYXBfd29yZHMobWFwKTsgaSsrKQorCQkJci54W2ldID0gfjBVTDsKIAl9CiAJcmV0dXJuIHI7CiB9CisKIHN0YXRpYyBpbmxpbmUgbWFwX3dvcmQgaW5saW5lX21hcF9yZWFkKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKIHsKIAltYXBfd29yZCByOwpAQCAtNDA1LDcgKzQyOCw3IEBACiAKIAogI2RlZmluZSBzaW1wbGVfbWFwX2luaXQobWFwKSBCVUdfT04oIW1hcF9iYW5rd2lkdGhfc3VwcG9ydGVkKChtYXApLT5iYW5rd2lkdGgpKQotI2RlZmluZSBtYXBfaXNfbGluZWFyKG1hcCkgKDEpCisjZGVmaW5lIG1hcF9pc19saW5lYXIobWFwKSAoeyAodm9pZCkobWFwKTsgMTsgfSkKIAogI2VuZGlmIC8qICFDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLmggYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaAppbmRleCBiM2QxMzQzLi5jNTBjM2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaApAQCAtMSw1ICsxLDUgQEAKIC8qIAotICogJElkOiBtdGQuaCx2IDEuNTYgMjAwNC8wOC8wOSAxODo0NjowNCBkbWFybGluIEV4cCAkCisgKiAkSWQ6IG10ZC5oLHYgMS41OSAyMDA1LzA0LzExIDEwOjE5OjAyIGdsZWl4bmVyIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiBldCBhbC4KICAqCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgogI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CkBAIC02OSw3ICs3MCw2IEBACiAKIAl1X2ludDMyX3Qgb29iYmxvY2s7ICAvLyBTaXplIG9mIE9PQiBibG9ja3MgKGUuZy4gNTEyKQogCXVfaW50MzJfdCBvb2JzaXplOyAgIC8vIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpCi0JdV9pbnQzMl90IG9vYmF2YWlsOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIE9PQiBhcmVhIGF2YWlsYWJsZSBmb3IgZnMgCiAJdV9pbnQzMl90IGVjY3R5cGU7CiAJdV9pbnQzMl90IGVjY3NpemU7CiAJCkBAIC04MCw2ICs4MCw3IEBACiAKIAkvLyBvb2JpbmZvIGlzIGEgbmFuZF9vb2JpbmZvIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHNldCBieSBpb3RjbCAoTUVNU0VUT09CSU5GTykKIAlzdHJ1Y3QgbmFuZF9vb2JpbmZvIG9vYmluZm87CisJdV9pbnQzMl90IG9vYmF2YWlsOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIE9PQiBhcmVhIGF2YWlsYWJsZSBmb3IgZnMgCiAKIAkvKiBEYXRhIGZvciB2YXJpYWJsZSBlcmFzZSByZWdpb25zLiBJZiBudW1lcmFzZXJlZ2lvbnMgaXMgemVybywKIAkgKiBpdCBtZWFucyB0aGF0IHRoZSB3aG9sZSBkZXZpY2UgaGFzIGVyYXNlc2l6ZSBhcyBnaXZlbiBhYm92ZS4gCkBAIC0xMTMsMTIgKzExNCwxMiBAQAogCSAqIGZsYXNoIGRldmljZXMuIFRoZSB1c2VyIGRhdGEgaXMgb25lIHRpbWUgcHJvZ3JhbW1hYmxlIGJ1dCB0aGUKIAkgKiBmYWN0b3J5IGRhdGEgaXMgcmVhZCBvbmx5LiAKIAkgKi8KLQlpbnQgKCpyZWFkX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7Ci0KKwlpbnQgKCpnZXRfZmFjdF9wcm90X2luZm8pIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG90cF9pbmZvICpidWYsIHNpemVfdCBsZW4pOwogCWludCAoKnJlYWRfZmFjdF9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKLQotCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCAqLworCWludCAoKmdldF91c2VyX3Byb3RfaW5mbykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbik7CisJaW50ICgqcmVhZF91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwogCWludCAoKndyaXRlX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CisJaW50ICgqbG9ja191c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuKTsKIAogCS8qIGt2ZWMtYmFzZWQgcmVhZC93cml0ZSBtZXRob2RzLiBXZSBuZWVkIHRoZXNlIGVzcGVjaWFsbHkgZm9yIE5BTkQgZmxhc2gsCiAJICAgd2l0aCBpdHMgbGltaXRlZCBudW1iZXIgb2Ygd3JpdGUgY3ljbGVzIHBlciBlcmFzZS4KQEAgLTE0Nyw2ICsxNDgsOCBAQAogCWludCAoKmJsb2NrX2lzYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwogCWludCAoKmJsb2NrX21hcmtiYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CiAKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmVib290X25vdGlmaWVyOyAgLyogZGVmYXVsdCBtb2RlIGJlZm9yZSByZWJvb3QgKi8KKwogCXZvaWQgKnByaXY7CiAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAppbmRleCA5YTE5YzY1Li45YjViNzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbT4KICAqCQkgICAgICAgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CiAgKgotICogJElkOiBuYW5kLmgsdiAxLjY4IDIwMDQvMTEvMTIgMTA6NDA6MzcgZ2xlaXhuZXIgRXhwICQKKyAqICRJZDogbmFuZC5oLHYgMS43MyAyMDA1LzA1LzMxIDE5OjM5OjE3IGdsZWl4bmVyIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC00OCw2ICs0OCwxMCBAQAogICogIDAyLTA4LTIwMDQgdGdseCAJYWRkZWQgb3B0aW9uIGZpZWxkIHRvIG5hbmQgc3RydWN0dXJlIGZvciBjaGlwIGFub21hbGl0aWVzCiAgKiAgMDUtMjUtMjAwNCB0Z2x4IAlhZGRlZCBiYWQgYmxvY2sgdGFibGUgc3VwcG9ydCwgU1QtTUlDUk8gbWFudWZhY3R1cmVyIGlkCiAgKgkJCXVwZGF0ZSBvZiBuYW5kX2NoaXAgc3RydWN0dXJlIGRlc2NyaXB0aW9uCisgKiAgMDEtMTctMjAwNSBkbWFybGluCWFkZGVkIGV4dGVuZGVkIGNvbW1hbmRzIGZvciBBRy1BTkQgZGV2aWNlIGFuZCBhZGRlZCBvcHRpb24gCisgKiAJCQlmb3IgQkJUX0FVVE9fUkVGUkVTSC4KKyAqICAwMS0yMC0yMDA1IGRtYXJsaW4JYWRkZWQgb3B0aW9uYWwgcG9pbnRlciB0byBoYXJkd2FyZSBzcGVjaWZpYyBjYWxsYmFjayBmb3IgCisgKgkJCWV4dHJhIGVycm9yIHN0YXR1cyBjaGVja3MuCiAgKi8KICNpZm5kZWYgX19MSU5VWF9NVERfTkFORF9ICiAjZGVmaW5lIF9fTElOVVhfTVREX05BTkRfSApAQCAtMTE1LDYgKzExOSwyNSBAQAogI2RlZmluZSBOQU5EX0NNRF9SRUFEU1RBUlQJMHgzMAogI2RlZmluZSBOQU5EX0NNRF9DQUNIRURQUk9HCTB4MTUKIAorLyogRXh0ZW5kZWQgY29tbWFuZHMgZm9yIEFHLUFORCBkZXZpY2UgKi8KKy8qIAorICogTm90ZTogdGhlIGNvbW1hbmQgZm9yIE5BTkRfQ01EX0RFUExFVEUxIGlzIHJlYWxseSAweDAwIGJ1dCAKKyAqICAgICAgIHRoZXJlIGlzIG5vIHdheSB0byBkaXN0aW5ndWlzaCB0aGF0IGZyb20gTkFORF9DTURfUkVBRDAKKyAqICAgICAgIHVudGlsIHRoZSByZW1haW5pbmcgc2VxdWVuY2Ugb2YgY29tbWFuZHMgaGFzIGJlZW4gY29tcGxldGVkCisgKiAgICAgICBzbyBhZGQgYSBoaWdoIG9yZGVyIGJpdCBhbmQgbWFzayBpdCBvZmYgaW4gdGhlIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgTkFORF9DTURfREVQTEVURTEJMHgxMDAKKyNkZWZpbmUgTkFORF9DTURfREVQTEVURTIJMHgzOAorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfTVVMVEkJMHg3MQorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IJMHg3MgorLyogbXVsdGktYmFuayBlcnJvciBzdGF0dXMgKGJhbmtzIDAtMykgKi8KKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0VSUk9SMAkweDczCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19FUlJPUjEJMHg3NAorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IyCTB4NzUKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0VSUk9SMwkweDc2CisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19SRVNFVAkweDdmCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19DTEVBUgkweGZmCisKIC8qIFN0YXR1cyBiaXRzICovCiAjZGVmaW5lIE5BTkRfU1RBVFVTX0ZBSUwJMHgwMQogI2RlZmluZSBOQU5EX1NUQVRVU19GQUlMX04xCTB4MDIKQEAgLTE0Myw3ICsxNjYsNyBAQAogCiAvKgogICogQ29uc3RhbnRzIGZvciBIYXJkd2FyZSBFQ0MKLSovCisgKi8KIC8qIFJlc2V0IEhhcmR3YXJlIEVDQyBmb3IgcmVhZCAqLwogI2RlZmluZSBOQU5EX0VDQ19SRUFECQkwCiAvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHdyaXRlICovCkBAIC0xNTEsNiArMTc0LDEwIEBACiAvKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tIGlzIHJlYWQgYmFjayBmcm9tIGZsYXNoICovCiAjZGVmaW5lIE5BTkRfRUNDX1JFQURTWU4JMgogCisvKiBCaXQgbWFzayBmb3IgZmxhZ3MgcGFzc2VkIHRvIGRvX25hbmRfcmVhZF9lY2MgKi8KKyNkZWZpbmUgTkFORF9HRVRfREVWSUNFCQkweDgwCisKKwogLyogT3B0aW9uIGNvbnN0YW50cyBmb3IgYml6YXJyZSBkaXNmdW5jdGlvbmFsaXR5IGFuZCByZWFsCiAqICBmZWF0dXJlcwogKi8KQEAgLTE3MCw2ICsxOTcsMTAgQEAKIC8qIENoaXAgaGFzIGEgYXJyYXkgb2YgNCBwYWdlcyB3aGljaCBjYW4gYmUgcmVhZCB3aXRob3V0CiAgKiBhZGRpdGlvbmFsIHJlYWR5IC9idXN5IHdhaXRzICovCiAjZGVmaW5lIE5BTkRfNFBBR0VfQVJSQVkJMHgwMDAwMDA0MCAKKy8qIENoaXAgcmVxdWlyZXMgdGhhdCBCQlQgaXMgcGVyaW9kaWNhbGx5IHJld3JpdHRlbiB0byBwcmV2ZW50CisgKiBiaXRzIGZyb20gYWRqYWNlbnQgYmxvY2tzIGZyb20gJ2xlYWtpbmcnIGluIGFsdGVyaW5nIGRhdGEuCisgKiBUaGlzIGhhcHBlbnMgd2l0aCB0aGUgUmVuZXNhcyBBRy1BTkQgY2hpcHMsIHBvc3NpYmx5IG90aGVycy4gICovCisjZGVmaW5lIEJCVF9BVVRPX1JFRlJFU0gJMHgwMDAwMDA4MAogCiAvKiBPcHRpb25zIHZhbGlkIGZvciBTYW1zdW5nIGxhcmdlIHBhZ2UgZGV2aWNlcyAqLwogI2RlZmluZSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyBcCkBAIC0xOTIsNyArMjIzLDggQEAKICAqIFRoaXMgY2FuIG9ubHkgd29yayBpZiB3ZSBoYXZlIHRoZSBlY2MgYnl0ZXMgZGlyZWN0bHkgYmVoaW5kIHRoZSAKICAqIGRhdGEgYnl0ZXMuIEFwcGxpZXMgZm9yIERPQyBhbmQgQUctQU5EIFJlbmVzYXMgSFcgUmVlZCBTb2xvbW9uIGdlbmVyYXRvcnMgKi8KICNkZWZpbmUgTkFORF9IV0VDQ19TWU5EUk9NRQkweDAwMDIwMDAwCi0KKy8qIFRoaXMgb3B0aW9uIHNraXBzIHRoZSBiYnQgc2NhbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICovCisjZGVmaW5lIE5BTkRfU0tJUF9CQlRTQ0FOCTB4MDAwNDAwMDAKIAogLyogT3B0aW9ucyBzZXQgYnkgbmFuZCBzY2FuICovCiAvKiBOYW5kIHNjYW4gaGFzIGFsbG9jYXRlZCBvb2JfYnVmICovCkBAIC0yMjEsMTAgKzI1MywxMyBAQAogICogc3RydWN0IG5hbmRfaHdfY29udHJvbCAtIENvbnRyb2wgc3RydWN0dXJlIGZvciBoYXJkd2FyZSBjb250cm9sbGVyIChlLmcgRUNDIGdlbmVyYXRvcikgc2hhcmVkIGFtb25nIGluZGVwZW5kZW5kIGRldmljZXMKICAqIEBsb2NrOiAgICAgICAgICAgICAgIHByb3RlY3Rpb24gbG9jayAgCiAgKiBAYWN0aXZlOgkJdGhlIG10ZCBkZXZpY2Ugd2hpY2ggaG9sZHMgdGhlIGNvbnRyb2xsZXIgY3VycmVudGx5CisgKiBAd3E6CQkJd2FpdCBxdWV1ZSB0byBzbGVlcCBvbiBpZiBhIE5BTkQgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluc3RlYWQgb2YgdGhlIHBlciBjaGlwIHdhaXQgcXVldWUgd2hlbiBhIGh3IGNvbnRyb2xsZXIgaXMgYXZhaWxhYmxlCiAgKi8KIHN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgewogCXNwaW5sb2NrX3QJIGxvY2s7CiAJc3RydWN0IG5hbmRfY2hpcCAqYWN0aXZlOworCXdhaXRfcXVldWVfaGVhZF90IHdxOwogfTsKIAogLyoqCkBAIC0yODMsNiArMzE4LDggQEAKICAqIEBiYWRibG9ja19wYXR0ZXJuOglbUkVQTEFDRUFCTEVdIGJhZCBibG9jayBzY2FuIHBhdHRlcm4gdXNlZCBmb3IgaW5pdGlhbCBiYWQgYmxvY2sgc2NhbiAKICAqIEBjb250cm9sbGVyOgkJW09QVElPTkFMXSBhIHBvaW50ZXIgdG8gYSBoYXJkd2FyZSBjb250cm9sbGVyIHN0cnVjdHVyZSB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5kZXBlbmRlbmQgZGV2aWNlcwogICogQHByaXY6CQlbT1BUSU9OQUxdIHBvaW50ZXIgdG8gcHJpdmF0ZSBjaGlwIGRhdGUKKyAqIEBlcnJzdGF0OgkJW09QVElPTkFMXSBoYXJkd2FyZSBzcGVjaWZpYyBmdW5jdGlvbiB0byBwZXJmb3JtIGFkZGl0aW9uYWwgZXJyb3Igc3RhdHVzIGNoZWNrcyAKKyAqCQkJKGRldGVybWluZSBpZiBlcnJvcnMgYXJlIGNvcnJlY3RhYmxlKQogICovCiAgCiBzdHJ1Y3QgbmFuZF9jaGlwIHsKQEAgLTMzOCw2ICszNzUsNyBAQAogCXN0cnVjdCBuYW5kX2JidF9kZXNjcgkqYmFkYmxvY2tfcGF0dGVybjsKIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sICAqY29udHJvbGxlcjsKIAl2b2lkCQkqcHJpdjsKKwlpbnQJCSgqZXJyc3RhdCkoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBzdGF0ZSwgaW50IHN0YXR1cywgaW50IHBhZ2UpOwogfTsKIAogLyoKQEAgLTM0OSw2ICszODcsNyBAQAogI2RlZmluZSBOQU5EX01GUl9OQVRJT05BTAkweDhmCiAjZGVmaW5lIE5BTkRfTUZSX1JFTkVTQVMJMHgwNwogI2RlZmluZSBOQU5EX01GUl9TVE1JQ1JPCTB4MjAKKyNkZWZpbmUgTkFORF9NRlJfSFlOSVggICAgICAgICAgMHhhZAogCiAvKioKICAqIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAtIE5BTkQgRmxhc2ggRGV2aWNlIElEIFN0cnVjdHVyZQpAQCAtNDU5LDYgKzQ5OCw5IEBACiBleHRlcm4gaW50IG5hbmRfZGVmYXVsdF9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIGV4dGVybiBpbnQgbmFuZF9pc2JhZF9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZmcywgaW50IGFsbG93YmJ0KTsKIGV4dGVybiBpbnQgbmFuZF9lcmFzZV9uYW5kIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyLCBpbnQgYWxsb3diYnQpOworZXh0ZXJuIGludCBuYW5kX2RvX3JlYWRfZWNjIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBvb2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwsIGludCBmbGFncyk7CiAKIC8qCiAqIENvbnN0YW50cyBmb3Igb29iIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BsYXQtcmFtLmggYi9pbmNsdWRlL2xpbnV4L210ZC9wbGF0LXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzJlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9wbGF0LXJhbS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGxpbnV4L2luY2x1ZGUvbXRkL3BsYXQtcmFtLmgKKyAqCisgKiAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogR2VuZXJpYyBwbGF0Zm9ybSBkZXZpY2UgYmFzZWQgUkFNIG1hcAorICoKKyAqICRJZDogcGxhdC1yYW0uaCx2IDEuMiAyMDA1LzAxLzI0IDAwOjM3OjQwIGJqZCBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NVERfUExBVFJBTV9ICisjZGVmaW5lIF9fTElOVVhfTVREX1BMQVRSQU1fSCBfX0ZJTEVfXworCisjZGVmaW5lIFBMQVRSQU1fUk8gKDApCisjZGVmaW5lIFBMQVRSQU1fUlcgKDEpCisKK3N0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtIHsKKwljaGFyCQkJKm1hcG5hbWU7CisJY2hhcgkJICAgICAgICoqcHJvYmVzOworCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0aXRpb25zOworCWludAkJCSBucl9wYXJ0aXRpb25zOworCWludAkJCSBiYW5rd2lkdGg7CisKKwkvKiBjb250cm9sIGNhbGxiYWNrcyAqLworCisJdm9pZAkoKnNldF9ydykoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdG8pOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTVREX1BMQVRSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQveGlwLmggYi9pbmNsdWRlL2xpbnV4L210ZC94aXAuaAppbmRleCBmYzA3MTEyLi43YjdkZWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC94aXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC94aXAuaApAQCAtNTgsMjIgKzU4LDE2IEBACiAgKiAJCXJldHVybmVkIHZhbHVlIGlzIDw9IHRoZSByZWFsIGVsYXBzZWQgdGltZS4KICAqIAlub3RlIDI6IHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIGEgZmV3IHNlY29uZHMgd2l0aG91dAogICogCQlvdmVyZmxvd2luZy4KKyAqCisgKiB4aXBfaXByZWZldGNoKCkKKyAqICAKKyAqICAgICAgTWFjcm8gdG8gZmlsbCBpbnN0cnVjdGlvbiBwcmVmZXRjaAorICoJZS5nLiBhIHNlcmllcyBvZiBub3BzOiAgYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7IAogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1NBMTEwMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9QWEEpCisjaW5jbHVkZSA8YXNtL210ZC14aXAuaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2lmZGVmIENPTkZJR19BUkNIX1BYQQotI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+Ci0jZW5kaWYKLQotI2RlZmluZSB4aXBfaXJxcGVuZGluZygpCShJQ0lQICYgSUNNUikKLQotLyogd2Ugc2FtcGxlIE9TQ1IgYW5kIGNvbnZlcnQgZGVzaXJlZCBkZWx0YSB0byB1c2VjICgxLzQgfj0gMTAwMDAwMC8zNjg2NDAwKSAqLwotI2RlZmluZSB4aXBfY3VycnRpbWUoKQkJKE9TQ1IpCi0jZGVmaW5lIHhpcF9lbGFwc2VkX3NpbmNlKHgpCShzaWduZWQpKChPU0NSIC0gKHgpKSAvIDQpCi0KLSNlbHNlCisjaWZuZGVmIHhpcF9pcnFwZW5kaW5nCiAKICN3YXJuaW5nICJtaXNzaW5nIElSUSBhbmQgdGltZXIgcHJpbWl0aXZlcyBmb3IgWElQIE1URCBzdXBwb3J0IgogI3dhcm5pbmcgInNvbWUgb2YgdGhlIFhJUCBNVEQgc3VwcG9ydCBjb2RlIHdpbGwgYmUgZGlzYWJsZWQiCkBAIC04NSwxNiArNzksMTcgQEAKIAogI2VuZGlmCiAKKyNpZm5kZWYgeGlwX2lwcmVmZXRjaAorI2RlZmluZSB4aXBfaXByZWZldGNoKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAvKgogICogeGlwX2NwdV9pZGxlKCkgaXMgdXNlZCB3aGVuIHdhaXRpbmcgZm9yIGEgZGVsYXkgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KICAqIHRoZSBzeXN0ZW0gdGltZXIgdGljayBwZXJpb2QuICBUaGlzIHNob3VsZCBwdXQgdGhlIENQVSBpbnRvIGlkbGUgbW9kZQogICogdG8gc2F2ZSBwb3dlciBhbmQgdG8gYmUgd29rZW4gdXAgb25seSB3aGVuIHNvbWUgaW50ZXJydXB0cyBhcmUgcGVuZGluZy4KLSAqIEFzIGFib3ZlLCB0aGlzIHNob3VsZCBub3QgcmVseSB1cG9uIHN0YW5kYXJkIGtlcm5lbCBjb2RlLgorICogVGhpcyBzaG91bGQgbm90IHJlbHkgdXBvbiBzdGFuZGFyZCBrZXJuZWwgY29kZS4KICAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1hTQ0FMRSkKLSNkZWZpbmUgeGlwX2NwdV9pZGxlKCkgIGFzbSB2b2xhdGlsZSAoIm1jciBwMTQsIDAsICUwLCBjNywgYzAsIDAiIDo6ICJyIiAoMSkpCi0jZWxzZQorI2lmbmRlZiB4aXBfY3B1X2lkbGUKICNkZWZpbmUgeGlwX2NwdV9pZGxlKCkgIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9uYW1lc3BhY2UuaAppbmRleCA2OTc5OTFiLi4wZTVhODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmFtZXNwYWNlLmgKQEAgLTE3LDcgKzE3LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuYW1lc3BhY2UtPmNvdW50KSkKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbmFtZXNwYWNlLT5jb3VudCwgJnZmc21vdW50X2xvY2spKQorCQkvKiByZWxlYXNlcyB2ZnNtb3VudF9sb2NrICovCiAJCV9fcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAppbmRleCAzNzgxMTkyLi5mOGRhN2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKQEAgLTE5Nyw2ICsxOTcsOSBAQAogCS8qIFRpbWVyIGZ1bmN0aW9uOyBkZWxldGVzIHRoZSBleHBlY3RhdGlvbi4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwogCisJLyogVXNhZ2UgY291bnQuICovCisJYXRvbWljX3QgdXNlOworCiAjaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKIAkvKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBwZXItcHJvdG8gcGFydCwgdXNlZCB0byBtYXAgdGhlCiAJICogZXhwZWN0ZWQgY29ubmVjdGlvbiB0aGUgd2F5IHRoZSByZWNpcGllbnQgZXhwZWN0cy4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmgKaW5kZXggYjFiYmJhMC4uMzY5MmRhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmgKQEAgLTMwLDkgKzMwLDEwIEBACiBleHRlcm4gdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKik7CiAKIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbiBleHBlY3RhdGlvbjogdGhpcyBpcyBtYW5kYXRvcnkgYmVmb3JlIGNhbGxpbmcgCi0gICBpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQuICovCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmlwX2Nvbm50cmFja19leHBlY3RfYWxsb2Modm9pZCk7Ci1leHRlcm4gdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CisgICBpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQuICBZb3Ugd2lsbCBoYXZlIHRvIGNhbGwgcHV0IGFmdGVyd2FyZHMuICovCitleHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgoraXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIpOworZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CiAKIC8qIEFkZCBhbiBleHBlY3RlZCBjb25uZWN0aW9uOiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBlciBjb25uZWN0aW9uICovCiBleHRlcm4gaW50IGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggMzAyOWNhZC4uNzBjMmE5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBORVRMSU5LX1JPVVRFCQkwCS8qIFJvdXRpbmcvZGV2aWNlIGhvb2sJCQkJKi8KLSNkZWZpbmUgTkVUTElOS19TS0lQCQkxCS8qIFJlc2VydmVkIGZvciBFTnNraXAgIAkJCSovCisjZGVmaW5lIE5FVExJTktfVzEJCTEJLyogMS13aXJlIHN1YnN5c3RlbQkJCQkqLwogI2RlZmluZSBORVRMSU5LX1VTRVJTT0NLCTIJLyogUmVzZXJ2ZWQgZm9yIHVzZXIgbW9kZSBzb2NrZXQgcHJvdG9jb2xzIAkqLwogI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMCTMJLyogRmlyZXdhbGxpbmcgaG9vawkJCQkqLwogI2RlZmluZSBORVRMSU5LX1RDUERJQUcJCTQJLyogVENQIHNvY2tldCBtb25pdG9yaW5nCQkJKi8KQEAgLTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgTkVUTElOS19BVURJVAkJOQkvKiBhdWRpdGluZyAqLwogI2RlZmluZSBORVRMSU5LX0ZJQl9MT09LVVAJMTAJCiAjZGVmaW5lIE5FVExJTktfUk9VVEU2CQkxMQkvKiBhZl9pbmV0NiByb3V0ZSBjb21tIGNoYW5uZWwgKi8KKyNkZWZpbmUgTkVUTElOS19ORVRGSUxURVIJMTIJLyogbmV0ZmlsdGVyIHN1YnN5c3RlbSAqLwogI2RlZmluZSBORVRMSU5LX0lQNl9GVwkJMTMKICNkZWZpbmUgTkVUTElOS19ETlJUTVNHCQkxNAkvKiBERUNuZXQgcm91dGluZyBtZXNzYWdlcyAqLwogI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UCTE1CS8qIEtlcm5lbCBtZXNzYWdlcyB0byB1c2Vyc3BhY2UgKi8KQEAgLTE2OCw2ICsxNjksNyBAQAogCW5saC0+bmxtc2dfZmxhZ3MgPSBmbGFnczsKIAlubGgtPm5sbXNnX3BpZCA9IHBpZDsKIAlubGgtPm5sbXNnX3NlcSA9IHNlcTsKKwltZW1zZXQoTkxNU0dfREFUQShubGgpICsgbGVuLCAwLCBOTE1TR19BTElHTihzaXplKSAtIHNpemUpOwogCXJldHVybiBubGg7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDU3OTFkZmQuLjZkNWEyNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMTI0LDYgKzEyNCw3IEBACiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBpbnQJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Cit2b2lkCQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKICNpZmRlZiBDT05GSUdfTkZTRF9WMl9BQ0wKQEAgLTIzMCw2ICsyMzEsNyBAQAogI2RlZmluZQluZnNlcnJfcmVjbGFpbV9iYWQJX19jb25zdGFudF9odG9ubChORlNFUlJfUkVDTEFJTV9CQUQpCiAjZGVmaW5lCW5mc2Vycl9iYWRuYW1lCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9CQUROQU1FKQogI2RlZmluZQluZnNlcnJfY2JfcGF0aF9kb3duCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0NCX1BBVEhfRE9XTikKKyNkZWZpbmUJbmZzZXJyX2xvY2tlZAkJX19jb25zdGFudF9odG9ubChORlNFUlJfTE9DS0VEKQogCiAvKiBlcnJvciBjb2RlcyBmb3IgaW50ZXJuYWwgdXNlICovCiAvKiBpZiBhIHJlcXVlc3QgZmFpbHMgZHVlIHRvIGttYWxsb2MgZmFpbHVyZSwgaXQgZ2V0cyBkcm9wcGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmggYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAppbmRleCBhODRhM2ZhLi44YmYyM2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaApAQCAtMjAzLDcgKzIwMyw5IEBACiAJaW50CQkJc29faXNfb3Blbl9vd25lcjsgLyogMT1vcGVub3duZXIsMD1sb2Nrb3duZXIgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICBzb19pZDsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKiAgICBzb19jbGllbnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgc29fc2VxaWQ7ICAgIAorCS8qIGFmdGVyIGluY3JlbWVudCBpbiBFTkNPREVfU0VRSURfT1BfVEFJTCwgcmVwcmVzZW50cyB0aGUgbmV4dAorCSAqIHNlcXVlbmNlIGlkIGV4cGVjdGVkIGZyb20gdGhlIGNsaWVudDogKi8KKwl1MzIgICAgICAgICAgICAgICAgICAgICBzb19zZXFpZDsKIAlzdHJ1Y3QgeGRyX25ldG9iaiAgICAgICBzb19vd25lcjsgICAgIC8qIG9wZW4gb3duZXIgbmFtZSAqLwogCWludCAgICAgICAgICAgICAgICAgICAgIHNvX2NvbmZpcm1lZDsgLyogc3VjY2Vzc2Z1bCBPUEVOX0NPTkZJUk0/ICovCiAJc3RydWN0IG5mczRfcmVwbGF5CXNvX3JlcGxheTsKQEAgLTIzNSw2ICsyMzcsMTAgQEAKICogICAgICAgc3RfcGVybG9ja293bmVyOiAob3BlbiBzdGF0ZWlkKSBsaXN0IG9mIGxvY2sgbmZzNF9zdGF0ZW93bmVycwogKiAJc3RfYWNjZXNzX2JtYXA6IHVzZWQgb25seSBmb3Igb3BlbiBzdGF0ZWlkCiAqIAlzdF9kZW55X2JtYXA6IHVzZWQgb25seSBmb3Igb3BlbiBzdGF0ZWlkCisqCXN0X29wZW5zdHA6IG9wZW4gc3RhdGVpZCBsb2NrIHN0YXRlaWQgd2FzIGRlcml2ZWQgZnJvbQorKgorKiBYWFg6IG9wZW4gc3RhdGVpZHMgYW5kIGxvY2sgc3RhdGVpZHMgaGF2ZSBkaXZlcmdlZCBzdWZmaWNpZW50bHkgdGhhdAorKiB3ZSBzaG91bGQgY29uc2lkZXIgZGVmaW5pbmcgc2VwYXJhdGUgc3RydWN0cyBmb3IgdGhlIHR3byBjYXNlcy4KICovCiAKIHN0cnVjdCBuZnM0X3N0YXRlaWQgewpAQCAtMjQ4LDYgKzI1NCw3IEBACiAJc3RydWN0IGZpbGUgICAgICAgICAgICAgICAgICogc3RfdmZzX2ZpbGU7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgc3RfYWNjZXNzX2JtYXA7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgc3RfZGVueV9ibWFwOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgICAgICAgICAqIHN0X29wZW5zdHA7CiB9OwogCiAvKiBmbGFncyBmb3IgcHJlcHJvY2Vzc19zZXFpZF9vcCgpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1keW5pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpLWR5bmlkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNiNmIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWR5bmlkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqCVBDSSBkZWZpbmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKglDb3B5cmlnaHQgMjAwMyBEZWxsIEluYy4KLSAqICAgICAgICBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9QQ0lfRFlOSURTX0gKLSNkZWZpbmUgTElOVVhfUENJX0RZTklEU19ICi0KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+Ci0KLXN0cnVjdCBkeW5pZCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbm9kZTsKLQlzdHJ1Y3QgcGNpX2RldmljZV9pZCAgICBpZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggYjUyMzhiZC4uN2FjMTQ5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC01ODYsNyArNTg2LDcgQEAKICNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMgMTEKIAogI2lmbmRlZiBQQ0lfQlVTX05VTV9SRVNPVVJDRVMKLSNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDQKKyNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDgKICNlbmRpZgogICAKICNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sgMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCkBAIC03MzQsMTYgKzczNCwyMCBAQAogLyogR2VuZXJpYyBQQ0kgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSAqLwogCiBleHRlcm4gc3RydWN0IHBjaV9idXMgKnBjaV9maW5kX2J1cyhpbnQgZG9tYWluLCBpbnQgYnVzbnIpOwordm9pZCBwY2lfYnVzX2FkZF9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogc3RydWN0IHBjaV9idXMgKnBjaV9zY2FuX2J1c19wYXJlbnRlZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzKGludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpCiB7Ci0JcmV0dXJuIHBjaV9zY2FuX2J1c19wYXJlbnRlZChOVUxMLCBidXMsIG9wcywgc3lzZGF0YSk7CisJc3RydWN0IHBjaV9idXMgKnJvb3RfYnVzOworCXJvb3RfYnVzID0gcGNpX3NjYW5fYnVzX3BhcmVudGVkKE5VTEwsIGJ1cywgb3BzLCBzeXNkYXRhKTsKKwlpZiAocm9vdF9idXMpCisJCXBjaV9idXNfYWRkX2RldmljZXMocm9vdF9idXMpOworCXJldHVybiByb290X2J1czsKIH0KIGludCBwY2lfc2Nhbl9zbG90KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbik7CiBzdHJ1Y3QgcGNpX2RldiAqIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKTsKIHVuc2lnbmVkIGludCBwY2lfc2Nhbl9jaGlsZF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiB2b2lkIHBjaV9idXNfYWRkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXZvaWQgcGNpX2J1c19hZGRfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHZvaWQgcGNpX25hbWVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogY2hhciAqcGNpX2NsYXNzX25hbWUodTMyIGNsYXNzKTsKIHZvaWQgcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKHN0cnVjdCBwY2lfYnVzICpjaGlsZCk7CkBAIC04NTYsNyArODYwLDggQEAKIHZvaWQgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICopOwogdm9pZCBwY2lfcmVtb3ZlX2JlaGluZF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKik7CiBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2Rldl9kcml2ZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKik7Ci1jb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLCBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2NvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfZGV2aWNlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYpOworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9pZChjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfc2Nhbl9icmlkZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9kZXYgKiBkZXYsIGludCBtYXgsIGludCBwYXNzKTsKIAogLyoga21lbV9jYWNoZSBzdHlsZSB3cmFwcGVyIGFyb3VuZCBwY2lfYWxsb2NfY29uc2lzdGVudCgpICovCkBAIC04NzAsNiArODc1LDE1IEBACiAjZGVmaW5lCXBjaV9wb29sX2FsbG9jKHBvb2wsIGZsYWdzLCBoYW5kbGUpIGRtYV9wb29sX2FsbG9jKHBvb2wsIGZsYWdzLCBoYW5kbGUpCiAjZGVmaW5lCXBjaV9wb29sX2ZyZWUocG9vbCwgdmFkZHIsIGFkZHIpIGRtYV9wb29sX2ZyZWUocG9vbCwgdmFkZHIsIGFkZHIpCiAKK2VudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSB7CisJUENJX0RNQV9CVVJTVF9JTkZJTklUWSwJLyogbWFrZSBidXJzdHMgYXMgbGFyZ2UgYXMgcG9zc2libGUsCisJCQkJICAgc3RyYXRlZ3lfcGFyYW1ldGVyIGlzIE4vQSAqLworCVBDSV9ETUFfQlVSU1RfQk9VTkRBUlksIC8qIGRpc2Nvbm5lY3QgYXQgZXZlcnkgc3RyYXRlZ3lfcGFyYW1ldGVyCisJCQkJICAgYnl0ZSBib3VuZGFyaWVzICovCisJUENJX0RNQV9CVVJTVF9NVUxUSVBMRSwgLyogZGlzY29ubmVjdCBhdCBzb21lIG11bHRpcGxlIG9mCisJCQkJICAgc3RyYXRlZ3lfcGFyYW1ldGVyIGJ5dGUgYm91bmRhcmllcyAqLworfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgZGVmaW5lZChDT05GSUdfRUlTQSkKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZTsKICNlbmRpZgpAQCAtOTcyLDYgKzk4Niw4IEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBwY2lfZG1hX2J1cnN0X2FkdmljZShwZGV2LCBzdHJhdCwgc3RyYXRlZ3lfcGFyYW1ldGVyKSBkbyB7IH0gd2hpbGUgKDApCisKICNlbmRpZiAvKiAhQ09ORklHX1BDSSAqLwogCiAvKiB0aGVzZSBoZWxwZXJzIHByb3ZpZGUgZnV0dXJlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQpAQCAtMTAxNiw2ICsxMDMyLDIwIEBACiAjZGVmaW5lIHBjaV9wcmV0dHlfbmFtZShkZXYpICIiCiAjZW5kaWYKIAorCisvKiBTb21lIGFyY2hzIGRvbid0IHdhbnQgdG8gZXhwb3NlIHN0cnVjdCByZXNvdXJjZSB0byB1c2VybGFuZCBhcy1pcworICogaW4gc3lzZnMgYW5kIC9wcm9jCisgKi8KKyNpZm5kZWYgSEFWRV9BUkNIX1BDSV9SRVNPVVJDRV9UT19VU0VSCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsIHU2NCAqc3RhcnQsIHU2NCAqZW5kKQoreworCSpzdGFydCA9IHJzcmMtPnN0YXJ0OworCSplbmQgPSByc3JjLT5lbmQ7Cit9CisjZW5kaWYgLyogSEFWRV9BUkNIX1BDSV9SRVNPVVJDRV9UT19VU0VSICovCisKKwogLyoKICAqICBUaGUgd29ybGQgaXMgbm90IHBlcmZlY3QgYW5kIHN1cHBsaWVzIHVzIHdpdGggYnJva2VuIFBDSSBkZXZpY2VzLgogICogIEZvciBhdCBsZWFzdCBhIHBhcnQgb2YgdGhlc2UgYnVncyB3ZSBuZWVkIGEgd29yay1hcm91bmQsIHNvIGJvdGgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggZjRjMmMzOS4uNDFhYTMyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTYyLDYgKzYyLDggQEAKIAogI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19TWVNURU0JCTB4MDgKICNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9QSUMJCTB4MDgwMAorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT0FQSUMJMHgwODAwMTAKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQwkweDA4MDAyMAogI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX0RNQQkJMHgwODAxCiAjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fVElNRVIJCTB4MDgwMgogI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1JUQwkJMHgwODAzCkBAIC03MTIsOCArNzE0LDkgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9ESVZBX0FVWAkweDEyOTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9ESVZBX1JNUDMJMHgxMzAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0EJCTB4MzIyMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0NJU1NCCQkweDMyMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9DSVNTQgkJMHgzMjIyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfWlgyX0lPQwkweDQwMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9DSVNTQwkJMHgzMjMwCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QQ1RFQ0gJCTB4MTA0MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDAJMHgxMDAwCkBAIC0xMjQ0LDYgKzEyNDcsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfSURFCTB4MDI2NQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfU0FUQQkweDAyNjYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX1NBVEEyCTB4MDI2NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfSURFCTB4MDM2RQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTIJCTB4MDI2OAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTMJCTB4MDI2OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1A1MV9BVURJTwkweDAyNkIKQEAgLTEyOTMsNiArMTI5Nyw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfR081NzAwXzIgICAgMHgwMzQ4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF9HTzEwMDAgICAgICAgMHgwMzRDCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF8xMTAwICAgICAgICAgMHgwMzRFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xNCAgICAgICAgICAgICAgMHgwMzcyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xNSAgICAgICAgICAgICAgMHgwMzczCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTVMJCTB4MTBlMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lNU184ODQ5CQkweDg4NDkKQEAgLTE4MjEsNiArMTgyNyw4IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSVRFCQkweDEyODMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfSVQ4MTcyRwkweDgxNzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfSVQ4MTcyR19BVURJTyAweDA4MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMQkJMHg4MjExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTIJCTB4ODIxMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84ODcyCQkweDg4NzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfSVQ4MzMwR18wCTB4ZTg4NgogCkBAIC0xODczLDYgKzE4ODEsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NCT0FSRFNfREFTMTYwMl8xNiAweDAwMDEKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJSUcJCTB4MTMxZgorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX1NJSUcJCTB4MTMxZgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4XzU1MAkweDEwMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF82NTAJMHgxMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18xU18xMHhfODUwCTB4MTAwMgpAQCAtMTkxMCw2ICsxOTE5LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4XzU1MAkweDIwNjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4XzY1MAkweDIwNjEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4Xzg1MAkweDIwNjIKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9TSUlHX1FVQVJURVRfU0VSSUFMCTB4MjA1MAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUkFESVNZUwkJMHgxMzMxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkFESVNZU19FTlAyNjExCTB4MDAzMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wa3RfY2xzLmggYi9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaAppbmRleCAyNWQyZDY3Li5iZDJjNWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaApAQCAtMjc2LDYgKzI3Niw3IEBACiAJX191OAlwcm90b2NvbDsKIAlfX3U4CXR1bm5lbGlkOwogCV9fdTgJdHVubmVsaGRyOworCV9fdTgJcGFkOwogfTsKIAogLyogUk9VVEUgZmlsdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAppbmRleCAxZDlkYTM2Li42MGZmY2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKQEAgLTIyMSw5ICsyMjEsMTEgQEAKIC8qIGdyZWQgc2V0dXAgKi8KIHN0cnVjdCB0Y19ncmVkX3NvcHQKIHsKLSAgICAgICBfX3UzMiAgICAgICAgICAgRFBzOwotICAgICAgIF9fdTMyICAgICAgICAgICBkZWZfRFA7Ci0gICAgICAgX191OCAgICAgICAgICAgIGdyaW87CisgICAgICAgX191MzIJCURQczsKKyAgICAgICBfX3UzMgkJZGVmX0RQOworICAgICAgIF9fdTgJCWdyaW87CisgICAgICAgX191OAkJcGFkMTsKKyAgICAgICBfX3UxNgkJcGFkMjsKIH07CiAKIC8qIEhUQiBzZWN0aW9uICovCkBAIC0zNTEsNiArMzUzLDcgQEAKICNkZWZpbmUJVENfQ0JRX09WTF9EUk9QCQkzCiAjZGVmaW5lCVRDX0NCUV9PVkxfUkNMQVNTSUMJNAogCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHkyOworCV9fdTE2CQlwYWQ7CiAJX191MzIJCXBlbmFsdHk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggMTQ0NzkzMi4uN2FlYjIwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtMTc2LDcgKzE3Niw3IEBACiB9OwogCiBleHRlcm4gdm9pZCBwbV9zZXRfb3BzKHN0cnVjdCBwbV9vcHMgKik7Ci0KK2V4dGVybiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiBleHRlcm4gaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtdS5oIGIvaW5jbHVkZS9saW51eC9wbXUuaAppbmRleCA2ZDczZWFkLi4zNzNiZDNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG11LmgKQEAgLTE2Niw3ICsxNjYsNyBAQAogZXh0ZXJuIGludCBwbXVfaTJjX3NpbXBsZV93cml0ZShpbnQgYnVzLCBpbnQgYWRkciwgIHU4KiBkYXRhLCBpbnQgbGVuKTsKIAogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIC8qCiAgKiBTdHVmZiBmb3IgcHV0dGluZyB0aGUgcG93ZXJib29rIHRvIHNsZWVwIGFuZCB3YWtpbmcgaXQgYWdhaW4uCiAgKgpAQCAtMjA4LDYgKzIwOCw4IEBACiBpbnQgcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIqIG5vdGlmaWVyKTsKIGludCBwbXVfdW5yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcihzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyKiBub3RpZmllcik7CiAKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwogI2RlZmluZSBQTVVfTUFYX0JBVFRFUklFUwkyCiAKIC8qIHZhbHVlcyBmb3IgcG11X3Bvd2VyX2ZsYWdzICovCkBAIC0yMzUsNiArMjM3LDQgQEAKIGV4dGVybiBzdHJ1Y3QgcG11X2JhdHRlcnlfaW5mbyBwbXVfYmF0dGVyaWVzW1BNVV9NQVhfQkFUVEVSSUVTXTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcG11X3Bvd2VyX2ZsYWdzOwogCi0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KLQogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAppbmRleCBlMjRiNzRiLi42MjEzZTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCkBAIC0yNjIsNyArMjYyLDcgQEAKIGludCBiaXRtYXBfc3RhcnR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzZWN0b3JzKTsKIHZvaWQgYml0bWFwX2VuZHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNlY3RvcnMsCiAJCSAgICAgaW50IHN1Y2Nlc3MpOwotaW50IGJpdG1hcF9zdGFydF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2Nrcyk7CitpbnQgYml0bWFwX3N0YXJ0X3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLCBpbnQgZGVncmFkZWQpOwogdm9pZCBiaXRtYXBfZW5kX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLCBpbnQgYWJvcnRlZCk7CiB2b2lkIGJpdG1hcF9jbG9zZV9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oCmluZGV4IDA3NjA1MDcuLjBhMzYwNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19hY2wuaApAQCAtNCwyOSArNCwyOSBAQAogI2RlZmluZSBSRUlTRVJGU19BQ0xfVkVSU0lPTgkweDAwMDEKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9fbGUxNgkJZV90YWc7Ci0JX19sZTE2CQllX3Blcm07Ci0JX19sZTMyCQllX2lkOworCV9fbGUxNiBlX3RhZzsKKwlfX2xlMTYgZV9wZXJtOworCV9fbGUzMiBlX2lkOwogfSByZWlzZXJmc19hY2xfZW50cnk7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMTYJCWVfdGFnOwotCV9fbGUxNgkJZV9wZXJtOworCV9fbGUxNiBlX3RhZzsKKwlfX2xlMTYgZV9wZXJtOwogfSByZWlzZXJmc19hY2xfZW50cnlfc2hvcnQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMzIJCWFfdmVyc2lvbjsKKwlfX2xlMzIgYV92ZXJzaW9uOwogfSByZWlzZXJmc19hY2xfaGVhZGVyOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdCByZWlzZXJmc19hY2xfc2l6ZShpbnQgY291bnQpCiB7CiAJaWYgKGNvdW50IDw9IDQpIHsKIAkJcmV0dXJuIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCi0JCSAgICAgICBjb3VudCAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkgICAgY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKIAl9IGVsc2UgewogCQlyZXR1cm4gc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpICsKLQkJICAgICAgIDQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KSArCi0JCSAgICAgICAoY291bnQgLSA0KSAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOworCQkgICAgNCAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpICsKKwkJICAgIChjb3VudCAtIDQpICogc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CiAJfQogfQogCkBAIC00NiwxNCArNDYsMTQgQEAKIAl9CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wKLXN0cnVjdCBwb3NpeF9hY2wgKiByZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKLWludCByZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2luaGVyaXRfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpcik7Ci1leHRlcm4gaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9pbml0ICh2b2lkKSBfX2luaXQ7Ci1leHRlcm4gaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9leGl0ICh2b2lkKTsKK3N0cnVjdCBwb3NpeF9hY2wgKnJlaXNlcmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOworaW50IHJlaXNlcmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyKTsKK2V4dGVybiBpbnQgcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2luaXQodm9pZCkgX19pbml0OworZXh0ZXJuIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfZXhpdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHBvc2l4X2FjbF9hY2Nlc3NfaGFuZGxlcjsKICNlbHNlCkBAIC02MSwyOCArNjEsMjYgQEAKICNkZWZpbmUgcmVpc2VyZnNfZ2V0X2FjbCBOVUxMCiAjZGVmaW5lIHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKGlub2RlKSAwCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfaW5pdCAodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9pbml0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9leGl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2V4aXQgKHZvaWQpCityZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsKGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAppbmRleCA0YzdjNTY4Li4xN2U0NThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC0zLDExICszLDEwIEBACiAgKi8KIAogCQkJCS8qIHRoaXMgZmlsZSBoYXMgYW4gYW1hemluZ2x5IHN0dXBpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB5dXJhIHBsZWFzZSBmaXggaXQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnMuaCwgYW5kIG1lcmdlIGFsbCB0aGUgcmVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBvdXIgLmggZmlsZXMgdGhhdCBhcmUgaW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgaW50byBpdC4gICovCi0KKwkJCQkgICBuYW1lLCB5dXJhIHBsZWFzZSBmaXggaXQgdG8gYmUKKwkJCQkgICByZWlzZXJmcy5oLCBhbmQgbWVyZ2UgYWxsIHRoZSByZXN0CisJCQkJICAgb2Ygb3VyIC5oIGZpbGVzIHRoYXQgYXJlIGluIHRoaXMKKwkJCQkgICBkaXJlY3RvcnkgaW50byBpdC4gICovCiAKICNpZm5kZWYgX0xJTlVYX1JFSVNFUl9GU19ICiAjZGVmaW5lIF9MSU5VWF9SRUlTRVJfRlNfSApAQCAtNzQsOSArNzMsOSBAQAogLyogZGVidWcgbGV2ZWxzLiAgUmlnaHQgbm93LCBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgbWVhbnMgcHJpbnQgYWxsIGRlYnVnCiAqKiBtZXNzYWdlcy4KICovCi0jZGVmaW5lIFJFSVNFUkZTX0RFQlVHX0NPREUgNSAvKiBleHRyYSBtZXNzYWdlcyB0byBoZWxwIGZpbmQvZGVidWcgZXJyb3JzICovIAorI2RlZmluZSBSRUlTRVJGU19ERUJVR19DT0RFIDUJLyogZXh0cmEgbWVzc2FnZXMgdG8gaGVscCBmaW5kL2RlYnVnIGVycm9ycyAqLwogCi12b2lkIHJlaXNlcmZzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqIGZtdCwgLi4uKTsKK3ZvaWQgcmVpc2VyZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIC8qIGFzc2VydGlvbnMgaGFuZGxpbmcgKi8KIAogLyoqIGFsd2F5cyBjaGVjayBhIGNvbmRpdGlvbiBhbmQgcGFuaWMgaWYgaXQncyBmYWxzZS4gKi8KQEAgLTEwNSw4MiArMTA0LDc4IEBACiAgKiBTdHJ1Y3R1cmUgb2Ygc3VwZXIgYmxvY2sgb24gZGlzaywgYSB2ZXJzaW9uIG9mIHdoaWNoIGluIFJBTSBpcyBvZnRlbiBhY2Nlc3NlZCBhcyBSRUlTRVJGU19TQihzKS0+c19ycwogICogdGhlIHZlcnNpb24gaW4gUkFNIGlzIHBhcnQgb2YgYSBsYXJnZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgZmllbGRzIG5ldmVyIHdyaXR0ZW4gdG8gZGlzay4KICAqLwotI2RlZmluZSBVTlNFVF9IQVNIIDAgLy8gcmVhZF9zdXBlciB3aWxsIGd1ZXNzIGFib3V0LCB3aGF0IGhhc2ggbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgIC8vIGluIGRpcmVjdG9yaWVzIHdlcmUgc29ydGVkIHdpdGgKKyNkZWZpbmUgVU5TRVRfSEFTSCAwCQkvLyByZWFkX3N1cGVyIHdpbGwgZ3Vlc3MgYWJvdXQsIHdoYXQgaGFzaCBuYW1lcworCQkgICAgIC8vIGluIGRpcmVjdG9yaWVzIHdlcmUgc29ydGVkIHdpdGgKICNkZWZpbmUgVEVBX0hBU0ggIDEKICNkZWZpbmUgWVVSQV9IQVNIIDIKICNkZWZpbmUgUjVfSEFTSCAgIDMKICNkZWZpbmUgREVGQVVMVF9IQVNIIFI1X0hBU0gKIAotCiBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgewotICAgIF9fbGUzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJICAgICAgLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCi0JCQkJICAgICAgICogZGV2aWNlICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfZGV2OwkgICAgICAvKiBqb3VybmFsIGRldmljZSBzdF9yZGV2ICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfc2l6ZTsJICAgICAgLyogc2l6ZSBvZiB0aGUgam91cm5hbCAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX3RyYW5zX21heDsJICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gKi8KLSAgICBfX2xlMzIganBfam91cm5hbF9tYWdpYzsgCSAgICAgIC8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzCi0JCQkJICAgICAgICogd2FzIHNiX2pvdXJuYWxfYmxvY2tfY291bnQpICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfbWF4X2JhdGNoOwkgICAgICAvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBpbnRvIGEKLQkJCQkgICAgICAgKiB0cmFucyAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX21heF9jb21taXRfYWdlOyAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMKLQkJCQkgICAgICAgKiBjb21taXQgYmUgKi8KLSAgICBfX2xlMzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOyAgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGEgdHJhbnNhY3Rpb24KLQkJCQkgICAgICAgKiBiZSAqLworCV9fbGUzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCisJCQkJCSAqIGRldmljZSAqLworCV9fbGUzMiBqcF9qb3VybmFsX2RldjsJLyogam91cm5hbCBkZXZpY2Ugc3RfcmRldiAqLworCV9fbGUzMiBqcF9qb3VybmFsX3NpemU7CS8qIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KKwlfX2xlMzIganBfam91cm5hbF90cmFuc19tYXg7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWFnaWM7CS8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzCisJCQkJCSAqIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLworCV9fbGUzMiBqcF9qb3VybmFsX21heF9iYXRjaDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhCisJCQkJCSAqIHRyYW5zICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U7CS8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jCisJCQkJCQkgKiBjb21taXQgYmUgKi8KKwlfX2xlMzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uCisJCQkJCQkgKiBiZSAqLwogfTsKIAogLyogdGhpcyBpcyB0aGUgc3VwZXIgZnJvbSAzLjUuWCwgd2hlcmUgWCA+PSAxMCAqLwotc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxCi17Ci0gICAgX19sZTMyIHNfYmxvY2tfY291bnQ7CSAgIC8qIGJsb2NrcyBjb3VudCAgICAgICAgICovCi0gICAgX19sZTMyIHNfZnJlZV9ibG9ja3M7ICAgICAgICAgICAvKiBmcmVlIGJsb2NrcyBjb3VudCAgICAqLwotICAgIF9fbGUzMiBzX3Jvb3RfYmxvY2s7ICAgICAgICAgICAgLyogcm9vdCBibG9jayBudW1iZXIgICAgKi8KLSAgICBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgc19qb3VybmFsOwotICAgIF9fbGUxNiBzX2Jsb2Nrc2l6ZTsgICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSAqLwotICAgIF9fbGUxNiBzX29pZF9tYXhzaXplOwkgICAvKiBtYXggc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXksIHNlZQotCQkJCSAgICAqIGdldF9vYmplY3RpZCgpIGNvbW1lbnRhcnkgICovCi0gICAgX19sZTE2IHNfb2lkX2N1cnNpemU7CSAgIC8qIGN1cnJlbnQgc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXkgKi8KLSAgICBfX2xlMTYgc191bW91bnRfc3RhdGU7ICAgICAgICAgIC8qIHRoaXMgaXMgc2V0IHRvIDEgd2hlbiBmaWxlc3lzdGVtIHdhcwotCQkJCSAgICAqIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8gICAgCi0gICAgY2hhciBzX21hZ2ljWzEwXTsgICAgICAgICAgICAgIC8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdAotCQkJCSAgICAqIGZpbGUgc3lzdGVtIGlzIHJlaXNlcmZzOgotCQkJCSAgICAqICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KLSAgICBfX2xlMTYgc19mc19zdGF0ZTsJICAgICAgICAgICAvKiBpdCBpcyBzZXQgdG8gdXNlZCBieSBmc2NrIHRvIG1hcmsgd2hpY2gKLQkJCQkgICAgKiBwaGFzZSBvZiByZWJ1aWxkaW5nIGlzIGRvbmUgKi8KLSAgICBfX2xlMzIgc19oYXNoX2Z1bmN0aW9uX2NvZGU7ICAgIC8qIGluZGljYXRlLCB3aGF0IGhhc2ggZnVuY3Rpb24gaXMgYmVpbmcgdXNlCi0JCQkJICAgICogdG8gc29ydCBuYW1lcyBpbiBhIGRpcmVjdG9yeSovCi0gICAgX19sZTE2IHNfdHJlZV9oZWlnaHQ7ICAgICAgICAgICAvKiBoZWlnaHQgb2YgZGlzayB0cmVlICovCi0gICAgX19sZTE2IHNfYm1hcF9ucjsgICAgICAgICAgICAgICAvKiBhbW91bnQgb2YgYml0bWFwIGJsb2NrcyBuZWVkZWQgdG8gYWRkcmVzcwotCQkJCSAgICAqIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KLSAgICBfX2xlMTYgc192ZXJzaW9uOyAgICAgICAgICAgICAgIC8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCi0JCQkJICAgICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLwotICAgIF9fbGUxNiBzX3Jlc2VydmVkX2Zvcl9qb3VybmFsOyAgLyogc2l6ZSBpbiBibG9ja3Mgb2Ygam91cm5hbCBhcmVhIG9uIG1haW4KLQkJCQkgICAgKiBkZXZpY2UsIHdlIG5lZWQgdG8ga2VlcCBhZnRlcgotCQkJCSAgICAqIG1ha2luZyBmcyB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsICovCQorc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHsKKwlfX2xlMzIgc19ibG9ja19jb3VudDsJLyogYmxvY2tzIGNvdW50ICAgICAgICAgKi8KKwlfX2xlMzIgc19mcmVlX2Jsb2NrczsJLyogZnJlZSBibG9ja3MgY291bnQgICAgKi8KKwlfX2xlMzIgc19yb290X2Jsb2NrOwkvKiByb290IGJsb2NrIG51bWJlciAgICAqLworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBzX2pvdXJuYWw7CisJX19sZTE2IHNfYmxvY2tzaXplOwkvKiBibG9jayBzaXplICovCisJX19sZTE2IHNfb2lkX21heHNpemU7CS8qIG1heCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSwgc2VlCisJCQkJICogZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAgKi8KKwlfX2xlMTYgc19vaWRfY3Vyc2l6ZTsJLyogY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCV9fbGUxNiBzX3Vtb3VudF9zdGF0ZTsJLyogdGhpcyBpcyBzZXQgdG8gMSB3aGVuIGZpbGVzeXN0ZW0gd2FzCisJCQkJICogdW1vdW50ZWQsIHRvIDIgLSB3aGVuIG5vdCAqLworCWNoYXIgc19tYWdpY1sxMF07CS8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdAorCQkJCSAqIGZpbGUgc3lzdGVtIGlzIHJlaXNlcmZzOgorCQkJCSAqICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KKwlfX2xlMTYgc19mc19zdGF0ZTsJLyogaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoCisJCQkJICogcGhhc2Ugb2YgcmVidWlsZGluZyBpcyBkb25lICovCisJX19sZTMyIHNfaGFzaF9mdW5jdGlvbl9jb2RlOwkvKiBpbmRpY2F0ZSwgd2hhdCBoYXNoIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZQorCQkJCQkgKiB0byBzb3J0IG5hbWVzIGluIGEgZGlyZWN0b3J5Ki8KKwlfX2xlMTYgc190cmVlX2hlaWdodDsJLyogaGVpZ2h0IG9mIGRpc2sgdHJlZSAqLworCV9fbGUxNiBzX2JtYXBfbnI7CS8qIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzCisJCQkJICogZWFjaCBibG9jayBvZiBmaWxlIHN5c3RlbSAqLworCV9fbGUxNiBzX3ZlcnNpb247CS8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCisJCQkJICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworCV9fbGUxNiBzX3Jlc2VydmVkX2Zvcl9qb3VybmFsOwkvKiBzaXplIGluIGJsb2NrcyBvZiBqb3VybmFsIGFyZWEgb24gbWFpbgorCQkJCQkgKiBkZXZpY2UsIHdlIG5lZWQgdG8ga2VlcCBhZnRlcgorCQkJCQkgKiBtYWtpbmcgZnMgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiAjZGVmaW5lIFNCX1NJWkVfVjEgKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEpKQogCiAvKiB0aGlzIGlzIHRoZSBvbiBkaXNrIHN1cGVyIGJsb2NrICovCi1zdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sKLXsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgc192MTsKLSAgICBfX2xlMzIgc19pbm9kZV9nZW5lcmF0aW9uOwotICAgIF9fbGUzMiBzX2ZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IG5vdyB1c2VkIG9ubHkgYnkgaW5vZGUtYXR0cmlidXRlcywgaWYgZW5hYmxlZCAqLwotICAgIHVuc2lnbmVkIGNoYXIgc191dWlkWzE2XTsgICAgICAgLyogZmlsZXN5c3RlbSB1bmlxdWUgaWRlbnRpZmllciAqLwotICAgIHVuc2lnbmVkIGNoYXIgc19sYWJlbFsxNl07ICAgICAgLyogZmlsZXN5c3RlbSB2b2x1bWUgbGFiZWwgKi8KLSAgICBjaGFyIHNfdW51c2VkWzg4XSA7ICAgICAgICAgICAgIC8qIHplcm8gZmlsbGVkIGJ5IG1rcmVpc2VyZnMgYW5kCi0JCQkJICAgICAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKLQkJCQkgICAgICogc28gYW55IGFkZGl0aW9ucyBtdXN0IGJlIHVwZGF0ZWQKLQkJCQkgICAgICogdGhlcmUgYXMgd2VsbC4gKi8KLX0gIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSBzX3YxOworCV9fbGUzMiBzX2lub2RlX2dlbmVyYXRpb247CisJX19sZTMyIHNfZmxhZ3M7CQkvKiBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07CS8qIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOwkvKiBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCWNoYXIgc191bnVzZWRbODhdOwkvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZAorCQkJCSAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKKwkJCQkgKiBzbyBhbnkgYWRkaXRpb25zIG11c3QgYmUgdXBkYXRlZAorCQkJCSAqIHRoZXJlIGFzIHdlbGwuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKICNkZWZpbmUgU0JfU0laRSAoc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jaykpCiAKICNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8xIDAKICNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8yIDIKIAotCiAvLyBvbi1kaXNrIHN1cGVyIGJsb2NrIGZpZWxkcyBjb252ZXJ0ZWQgdG8gY3B1IGZvcm0KICNkZWZpbmUgU0JfRElTS19TVVBFUl9CTE9DSyhzKSAoUkVJU0VSRlNfU0IocyktPnNfcnMpCiAjZGVmaW5lIFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socykgKCYoU0JfRElTS19TVVBFUl9CTE9DSyhzKS0+c192MSkpCkBAIC0yMTAsMTMgKzIwNSwxMiBAQAogI2RlZmluZSBQVVRfU0JfVFJFRV9IRUlHSFQocywgdmFsKSBcCiAgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdHJlZV9oZWlnaHQgPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogI2RlZmluZSBQVVRfU0JfUkVJU0VSRlNfU1RBVEUocywgdmFsKSBcCi0gICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkgCisgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgUFVUX1NCX1ZFUlNJT04ocywgdmFsKSBcCiAgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdmVyc2lvbiA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFBVVF9TQl9CTUFQX05SKHMsIHZhbCkgXAogICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2JtYXBfbnIgPSBjcHVfdG9fbGUxNiAodmFsKTsgfSB3aGlsZSAoMCkKIAotCiAjZGVmaW5lIFNCX09ORElTS19KUChzKSAoJlNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfam91cm5hbCkKICNkZWZpbmUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSBcCiAgICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX09ORElTS19KUChzKS0+anBfam91cm5hbF9zaXplKSkKQEAgLTIzMSwyMSArMjI1LDE5IEBACiAgICAgICAgICBibG9jayA+PSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhzKSBcCiAgICAgICAgICAmJiBibG9jayA8IFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHMpICsgIFwKICAgICAgICAgICgoIWlzX3JlaXNlcmZzX2pyKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpID8gXAotICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSArIDEgOiBTQl9PTkRJU0tfUkVTRVJWRURfRk9SX0pPVVJOQUwocykpKSAKLQotCisgICAgICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpICsgMSA6IFNCX09ORElTS19SRVNFUlZFRF9GT1JfSk9VUk5BTChzKSkpCiAKIAkJCQkvKiB1c2VkIGJ5IGdjYyAqLwogI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQyAweDUyNjU0OTczCiAJCQkJLyogdXNlZCBieSBmaWxlIHN5c3RlbSB1dGlsaXRpZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rIGF0IHRoZSBzdXBlcmJsb2NrLCBldGMuICovCisJCQkJICAgbG9vayBhdCB0aGUgc3VwZXJibG9jaywgZXRjLiAqLwogI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFckZzIgogI2RlZmluZSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIyRnMiCiAjZGVmaW5lIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFcjNGcyIKIAotaW50IGlzX3JlaXNlcmZzXzNfNSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpOwotaW50IGlzX3JlaXNlcmZzXzNfNiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpOwotaW50IGlzX3JlaXNlcmZzX2pyIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyk7CitpbnQgaXNfcmVpc2VyZnNfM181KHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpOworaW50IGlzX3JlaXNlcmZzXzNfNihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKTsKK2ludCBpc19yZWlzZXJmc19qcihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKTsKIAogLyogUmVpc2VyRlMgbGVhdmVzIHRoZSBmaXJzdCA2NGsgdW51c2VkLCBzbyB0aGF0IHBhcnRpdGlvbiBsYWJlbHMgaGF2ZQogICAgZW5vdWdoIHNwYWNlLiAgSWYgc29tZW9uZSB3YW50cyB0byB3cml0ZSBhIGZhbmN5IGJvb3Rsb2FkZXIgdGhhdApAQCAtMjcyLDggKzI2NCw4IEBACiB0eXBlZGVmIF9fbGUzMiB1bnBfdDsKIAogc3RydWN0IHVuZm1fbm9kZWluZm8gewotICAgIHVucF90IHVuZm1fbm9kZW51bTsKLSAgICB1bnNpZ25lZCBzaG9ydCB1bmZtX2ZyZWVzcGFjZTsKKwl1bnBfdCB1bmZtX25vZGVudW07CisJdW5zaWduZWQgc2hvcnQgdW5mbV9mcmVlc3BhY2U7CiB9OwogCiAvKiB0aGVyZSBhcmUgdHdvIGZvcm1hdHMgb2Yga2V5czogMy41IGFuZCAzLjYKQEAgLTI4NSw3ICsyNzcsNiBAQAogI2RlZmluZSBTVEFUX0RBVEFfVjEgMAogI2RlZmluZSBTVEFUX0RBVEFfVjIgMQogCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKlJFSVNFUkZTX0koY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKQEAgLTM0MywxNSArMzM0LDEzIEBACiAgICBmaWxlIHdvdWxkIGZpdCBpbnRvIG9uZSBESVJFQ1QgaXRlbS4KICAgIFByaW1hcnkgaW50ZW50aW9uIGZvciB0aGlzIG9uZSBpcyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBkZWNyZWFzaW5nCiAgICBzZWVraW5nLgotKi8gICAKKyovCiAjZGVmaW5lIFNUT1JFX1RBSUxfSU5fVU5GTV9TMihuX2ZpbGVfc2l6ZSxuX3RhaWxfc2l6ZSxuX2Jsb2NrX3NpemUpIFwKIChcCiAgICghKG5fdGFpbF9zaXplKSkgfHwgXAogICAoKChuX2ZpbGVfc2l6ZSkgPiBNQVhfRElSRUNUX0lURU1fTEVOKG5fYmxvY2tfc2l6ZSkpICkgXAogKQogCi0KLQogLyoKICAqIHZhbHVlcyBmb3Igc191bW91bnRfc3RhdGUgZmllbGQKICAqLwpAQCAtMzY0LDkgKzM1Myw5IEBACiAjZGVmaW5lIFRZUEVfU1RBVF9EQVRBIDAKICNkZWZpbmUgVFlQRV9JTkRJUkVDVCAxCiAjZGVmaW5lIFRZUEVfRElSRUNUIDIKLSNkZWZpbmUgVFlQRV9ESVJFTlRSWSAzIAotI2RlZmluZSBUWVBFX01BWFRZUEUgMyAKLSNkZWZpbmUgVFlQRV9BTlkgMTUgLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKKyNkZWZpbmUgVFlQRV9ESVJFTlRSWSAzCisjZGVmaW5lIFRZUEVfTUFYVFlQRSAzCisjZGVmaW5lIFRZUEVfQU5ZIDE1CQkvLyBGSVhNRTogY29tbWVudCBpcyByZXF1aXJlZAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgIEtFWSAmIElURU0gSEVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3Niw2MCArMzY1LDYyIEBACiAvLyBkaXJlY3RvcmllcyB1c2UgdGhpcyBrZXkgYXMgd2VsbCBhcyBvbGQgZmlsZXMKIC8vCiBzdHJ1Y3Qgb2Zmc2V0X3YxIHsKLSAgICBfX2xlMzIga19vZmZzZXQ7Ci0gICAgX19sZTMyIGtfdW5pcXVlbmVzczsKKwlfX2xlMzIga19vZmZzZXQ7CisJX19sZTMyIGtfdW5pcXVlbmVzczsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IG9mZnNldF92MiB7CiAJX19sZTY0IHY7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKLXN0YXRpYyBpbmxpbmUgX191MTYgb2Zmc2V0X3YyX2tfdHlwZSggY29uc3Qgc3RydWN0IG9mZnNldF92MiAqdjIgKQorc3RhdGljIGlubGluZSBfX3UxNiBvZmZzZXRfdjJfa190eXBlKGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyKQogewogCV9fdTggdHlwZSA9IGxlNjRfdG9fY3B1KHYyLT52KSA+PiA2MDsKLQlyZXR1cm4gKHR5cGUgPD0gVFlQRV9NQVhUWVBFKT90eXBlOlRZUEVfQU5ZOwotfQotIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9vZmZzZXRfdjJfa190eXBlKCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MiwgaW50IHR5cGUgKQotewotCXYyLT52ID0gKHYyLT52ICYgY3B1X3RvX2xlNjQofjBVTEw+PjQpKSB8IGNwdV90b19sZTY0KChfX3U2NCl0eXBlPDw2MCk7Ci19Ci0gCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBvZmZzZXRfdjJfa19vZmZzZXQoIGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyICkKLXsKLQlyZXR1cm4gbGU2NF90b19jcHUodjItPnYpICYgKH4wVUxMPj40KTsKKwlyZXR1cm4gKHR5cGUgPD0gVFlQRV9NQVhUWVBFKSA/IHR5cGUgOiBUWVBFX0FOWTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9vZmZzZXRfdjJfa19vZmZzZXQoIHN0cnVjdCBvZmZzZXRfdjIgKnYyLCBsb2ZmX3Qgb2Zmc2V0ICl7Ci0Jb2Zmc2V0ICY9ICh+MFVMTD4+NCk7Ci0JdjItPnYgPSAodjItPnYgJiBjcHVfdG9fbGU2NCgxNVVMTDw8NjApKSB8IGNwdV90b19sZTY0KG9mZnNldCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29mZnNldF92Ml9rX3R5cGUoc3RydWN0IG9mZnNldF92MiAqdjIsIGludCB0eXBlKQoreworCXYyLT52ID0KKwkgICAgKHYyLT52ICYgY3B1X3RvX2xlNjQofjBVTEwgPj4gNCkpIHwgY3B1X3RvX2xlNjQoKF9fdTY0KSB0eXBlIDw8IDYwKTsKK30KKworc3RhdGljIGlubGluZSBsb2ZmX3Qgb2Zmc2V0X3YyX2tfb2Zmc2V0KGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyKQoreworCXJldHVybiBsZTY0X3RvX2NwdSh2Mi0+dikgJiAofjBVTEwgPj4gNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfb2Zmc2V0X3YyX2tfb2Zmc2V0KHN0cnVjdCBvZmZzZXRfdjIgKnYyLCBsb2ZmX3Qgb2Zmc2V0KQoreworCW9mZnNldCAmPSAofjBVTEwgPj4gNCk7CisJdjItPnYgPSAodjItPnYgJiBjcHVfdG9fbGU2NCgxNVVMTCA8PCA2MCkpIHwgY3B1X3RvX2xlNjQob2Zmc2V0KTsKIH0KIAogLyogS2V5IG9mIGFuIGl0ZW0gZGV0ZXJtaW5lcyBpdHMgbG9jYXRpb24gaW4gdGhlIFMrdHJlZSwgYW5kCiAgICBpcyBjb21wb3NlZCBvZiA0IGNvbXBvbmVudHMgKi8KIHN0cnVjdCByZWlzZXJmc19rZXkgewotICAgIF9fbGUzMiBrX2Rpcl9pZDsgICAgLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKLQkJCSAgZGlyZWN0b3J5IG9iamVjdCBpZCAqLwotICAgIF9fbGUzMiBrX29iamVjdGlkOyAgLyogb2JqZWN0IGlkZW50aWZpZXIgKi8KLSAgICB1bmlvbiB7Ci0Jc3RydWN0IG9mZnNldF92MSBrX29mZnNldF92MTsKLQlzdHJ1Y3Qgb2Zmc2V0X3YyIGtfb2Zmc2V0X3YyOwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUzMiBrX2Rpcl9pZDsJLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKKwkJCQkgICBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCisJX19sZTMyIGtfb2JqZWN0aWQ7CS8qIG9iamVjdCBpZGVudGlmaWVyICovCisJdW5pb24geworCQlzdHJ1Y3Qgb2Zmc2V0X3YxIGtfb2Zmc2V0X3YxOworCQlzdHJ1Y3Qgb2Zmc2V0X3YyIGtfb2Zmc2V0X3YyOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgaW5fY29yZV9rZXkgewotICAgIF9fdTMyIGtfZGlyX2lkOyAgICAvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAotCQkJICBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCi0gICAgX191MzIga19vYmplY3RpZDsgIC8qIG9iamVjdCBpZGVudGlmaWVyICovCi0gICAgX191NjQga19vZmZzZXQ7Ci0gICAgX191OCBrX3R5cGU7CisJX191MzIga19kaXJfaWQ7CQkvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAorCQkJCSAgIGRpcmVjdG9yeSBvYmplY3QgaWQgKi8KKwlfX3UzMiBrX29iamVjdGlkOwkvKiBvYmplY3QgaWRlbnRpZmllciAqLworCV9fdTY0IGtfb2Zmc2V0OworCV9fdTgga190eXBlOwogfTsKIAogc3RydWN0IGNwdV9rZXkgewotICAgIHN0cnVjdCBpbl9jb3JlX2tleSBvbl9kaXNrX2tleTsKLSAgICBpbnQgdmVyc2lvbjsKLSAgICBpbnQga2V5X2xlbmd0aDsgLyogMyBpbiBhbGwgY2FzZXMgYnV0IGRpcmVjdDJpbmRpcmVjdCBhbmQKLQkJICAgICAgIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uICovCisJc3RydWN0IGluX2NvcmVfa2V5IG9uX2Rpc2tfa2V5OworCWludCB2ZXJzaW9uOworCWludCBrZXlfbGVuZ3RoOwkJLyogMyBpbiBhbGwgY2FzZXMgYnV0IGRpcmVjdDJpbmRpcmVjdCBhbmQKKwkJCQkgICBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiAqLwogfTsKIAogLyogT3VyIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcga2V5cyBjYW4gY29tcGFyZSBrZXlzIG9mIGRpZmZlcmVudApAQCAtNDc1LDggKzQ2Niw3IEBACiAgICAgaW5kaXJlY3QgaXRlbXMpIGFuZCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpdGVtIGl0c2VsZgogICAgIHdpdGhpbiB0aGUgYmxvY2suICAqLwogCi1zdHJ1Y3QgaXRlbV9oZWFkCi17CitzdHJ1Y3QgaXRlbV9oZWFkIHsKIAkvKiBFdmVyeXRoaW5nIGluIHRoZSB0cmVlIGlzIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3IgaXQgYmFzZWQgb24KIAkgKiBpdHMga2V5LiovCiAJc3RydWN0IHJlaXNlcmZzX2tleSBpaF9rZXk7CkBAIC00OTIsMTMgKzQ4MiwxMyBAQAogCQkgICBudW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLwogCQlfX2xlMTYgaWhfZW50cnlfY291bnQ7CiAJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHU7Ci0JX19sZTE2IGloX2l0ZW1fbGVuOyAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiB0aGUgaXRlbSBib2R5ICovCi0JX19sZTE2IGloX2l0ZW1fbG9jYXRpb247ICAgICAgLyogYW4gb2Zmc2V0IHRvIHRoZSBpdGVtIGJvZHkKLQkJCQkgICAgICAqIHdpdGhpbiB0aGUgYmxvY2sgKi8KLQlfX2xlMTYgaWhfdmVyc2lvbjsJICAgICAvKiAwIGZvciBhbGwgb2xkIGl0ZW1zLCAyIGZvciBuZXcKLQkJCQkJb25lcy4gSGlnaGVzdCBiaXQgaXMgc2V0IGJ5IGZzY2sKLQkJCQkJdGVtcG9yYXJ5LCBjbGVhbmVkIGFmdGVyIGFsbAotCQkJCQlkb25lICovCisJX19sZTE2IGloX2l0ZW1fbGVuOwkvKiB0b3RhbCBzaXplIG9mIHRoZSBpdGVtIGJvZHkgKi8KKwlfX2xlMTYgaWhfaXRlbV9sb2NhdGlvbjsJLyogYW4gb2Zmc2V0IHRvIHRoZSBpdGVtIGJvZHkKKwkJCQkJICogd2l0aGluIHRoZSBibG9jayAqLworCV9fbGUxNiBpaF92ZXJzaW9uOwkvKiAwIGZvciBhbGwgb2xkIGl0ZW1zLCAyIGZvciBuZXcKKwkJCQkgICBvbmVzLiBIaWdoZXN0IGJpdCBpcyBzZXQgYnkgZnNjaworCQkJCSAgIHRlbXBvcmFyeSwgY2xlYW5lZCBhZnRlciBhbGwKKwkJCQkgICBkb25lICovCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAvKiBzaXplIG9mIGl0ZW0gaGVhZGVyICAgICAqLwogI2RlZmluZSBJSF9TSVpFIChzaXplb2Yoc3RydWN0IGl0ZW1faGVhZCkpCkBAIC01MTUsNyArNTA1LDYgQEAKICNkZWZpbmUgcHV0X2loX2xvY2F0aW9uKGloLCB2YWwpICAgICBkbyB7IChpaCktPmloX2l0ZW1fbG9jYXRpb24gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogI2RlZmluZSBwdXRfaWhfaXRlbV9sZW4oaWgsIHZhbCkgICAgIGRvIHsgKGloKS0+aWhfaXRlbV9sZW4gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogCi0KICNkZWZpbmUgdW5yZWFjaGFibGVfaXRlbShpaCkgKGloX3ZlcnNpb24oaWgpICYgKDEgPDwgMTUpKQogCiAjZGVmaW5lIGdldF9paF9mcmVlX3NwYWNlKGloKSAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182ID8gMCA6IGloX2ZyZWVfc3BhY2UgKGloKSkKQEAgLTUzNyw0MCArNTI2LDQ4IEBACiAjZGVmaW5lIFYxX0lORElSRUNUX1VOSVFVRU5FU1MgMHhmZmZmZmZmZQogI2RlZmluZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUyAweGZmZmZmZmZmCiAjZGVmaW5lIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1MgNTAwCi0jZGVmaW5lIFYxX0FOWV9VTklRVUVORVNTIDU1NSAvLyBGSVhNRTogY29tbWVudCBpcyByZXF1aXJlZAorI2RlZmluZSBWMV9BTllfVU5JUVVFTkVTUyA1NTUJLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKIAogLy8KIC8vIGhlcmUgYXJlIGNvbnZlcnNpb24gcm91dGluZXMKIC8vCi1zdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUgKF9fdTMyIHVuaXF1ZW5lc3MpIENPTlNURjsKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXF1ZW5lc3MydHlwZSAoX191MzIgdW5pcXVlbmVzcykKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXF1ZW5lc3MydHlwZShfX3UzMiB1bmlxdWVuZXNzKSBDT05TVEY7CitzdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUoX191MzIgdW5pcXVlbmVzcykKIHsKLSAgICBzd2l0Y2ggKChpbnQpdW5pcXVlbmVzcykgewotICAgIGNhc2UgVjFfU0RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfU1RBVF9EQVRBOwotICAgIGNhc2UgVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfSU5ESVJFQ1Q7Ci0gICAgY2FzZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfRElSRUNUOwotICAgIGNhc2UgVjFfRElSRU5UUllfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfRElSRU5UUlk7Ci0gICAgZGVmYXVsdDoKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTUwMDogdW5rbm93biB1bmlxdWVuZXNzICVkIiwKLQkJCSAgICAgIHVuaXF1ZW5lc3MpOworCXN3aXRjaCAoKGludCl1bmlxdWVuZXNzKSB7CisJY2FzZSBWMV9TRF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9TVEFUX0RBVEE7CisJY2FzZSBWMV9JTkRJUkVDVF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9JTkRJUkVDVDsKKwljYXNlIFYxX0RJUkVDVF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9ESVJFQ1Q7CisJY2FzZSBWMV9ESVJFTlRSWV9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9ESVJFTlRSWTsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJ2cy01MDA6IHVua25vd24gdW5pcXVlbmVzcyAlZCIsCisJCQkJIHVuaXF1ZW5lc3MpOwogCWNhc2UgVjFfQU5ZX1VOSVFVRU5FU1M6Ci0JICAgIHJldHVybiBUWVBFX0FOWTsKLSAgICB9CisJCXJldHVybiBUWVBFX0FOWTsKKwl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzIChpbnQgdHlwZSkgQ09OU1RGOwotc3RhdGljIGlubGluZSBfX3UzMiB0eXBlMnVuaXF1ZW5lc3MgKGludCB0eXBlKQorc3RhdGljIGlubGluZSBfX3UzMiB0eXBlMnVuaXF1ZW5lc3MoaW50IHR5cGUpIENPTlNURjsKK3N0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzKGludCB0eXBlKQogewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVFlQRV9TVEFUX0RBVEE6IHJldHVybiBWMV9TRF9VTklRVUVORVNTOwotICAgIGNhc2UgVFlQRV9JTkRJUkVDVDogcmV0dXJuIFYxX0lORElSRUNUX1VOSVFVRU5FU1M7Ci0gICAgY2FzZSBUWVBFX0RJUkVDVDogcmV0dXJuIFYxX0RJUkVDVF9VTklRVUVORVNTOwotICAgIGNhc2UgVFlQRV9ESVJFTlRSWTogcmV0dXJuIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1M7Ci0gICAgZGVmYXVsdDoKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTUwMTogdW5rbm93biB0eXBlICVkIiwgdHlwZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUWVBFX1NUQVRfREFUQToKKwkJcmV0dXJuIFYxX1NEX1VOSVFVRU5FU1M7CisJY2FzZSBUWVBFX0lORElSRUNUOgorCQlyZXR1cm4gVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzsKKwljYXNlIFRZUEVfRElSRUNUOgorCQlyZXR1cm4gVjFfRElSRUNUX1VOSVFVRU5FU1M7CisJY2FzZSBUWVBFX0RJUkVOVFJZOgorCQlyZXR1cm4gVjFfRElSRU5UUllfVU5JUVVFTkVTUzsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJ2cy01MDE6IHVua25vd24gdHlwZSAlZCIsIHR5cGUpOwogCWNhc2UgVFlQRV9BTlk6Ci0JICAgIHJldHVybiBWMV9BTllfVU5JUVVFTkVTUzsKLSAgICB9CisJCXJldHVybiBWMV9BTllfVU5JUVVFTkVTUzsKKwl9CiB9CiAKIC8vCkBAIC01NzgsNTcgKzU3NSw1NiBAQAogLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB2ZXJzaW9uIG9mIG9iamVjdCBmcm9tIGtleSwgc28sIHByb3ZpZGUKIC8vIHZlcnNpb24gdG8gdGhlc2UgZGVmaW5lcwogLy8KLXN0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2tleV9rX29mZnNldCAoaW50IHZlcnNpb24sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9rZXlfa19vZmZzZXQoaW50IHZlcnNpb24sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgIGxlMzJfdG9fY3B1KCBrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgKSA6Ci0Jb2Zmc2V0X3YyX2tfb2Zmc2V0KCAmKGtleS0+dS5rX29mZnNldF92MikgKTsKKwlyZXR1cm4gKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KKwkgICAgbGUzMl90b19jcHUoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0KSA6CisJICAgIG9mZnNldF92Ml9rX29mZnNldCgmKGtleS0+dS5rX29mZnNldF92MikpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9paF9rX29mZnNldCAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloKQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfaWhfa19vZmZzZXQoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqaWgpCiB7Ci0gICAgcmV0dXJuIGxlX2tleV9rX29mZnNldCAoaWhfdmVyc2lvbiAoaWgpLCAmKGloLT5paF9rZXkpKTsKKwlyZXR1cm4gbGVfa2V5X2tfb2Zmc2V0KGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpKTsKIH0KIAotc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfa2V5X2tfdHlwZSAoaW50IHZlcnNpb24sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9rZXlfa190eXBlKGludCB2ZXJzaW9uLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgIHVuaXF1ZW5lc3MydHlwZSggbGUzMl90b19jcHUoIGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MpKSA6Ci0Jb2Zmc2V0X3YyX2tfdHlwZSggJihrZXktPnUua19vZmZzZXRfdjIpICk7CisJcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/CisJICAgIHVuaXF1ZW5lc3MydHlwZShsZTMyX3RvX2NwdShrZXktPnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzKSkgOgorCSAgICBvZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2loX2tfdHlwZSAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloKQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfaWhfa190eXBlKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIHJldHVybiBsZV9rZXlfa190eXBlIChpaF92ZXJzaW9uIChpaCksICYoaWgtPmloX2tleSkpOworCXJldHVybiBsZV9rZXlfa190eXBlKGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX29mZnNldCAoaW50IHZlcnNpb24sIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX29mZnNldChpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KQogewotICAgICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgICh2b2lkKShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBjcHVfdG9fbGUzMiAob2Zmc2V0KSkgOiAvKiBqZG0gY2hlY2sgKi8KLQkodm9pZCkoc2V0X29mZnNldF92Ml9rX29mZnNldCggJihrZXktPnUua19vZmZzZXRfdjIpLCBvZmZzZXQgKSk7CisJKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8gKHZvaWQpKGtleS0+dS5rX29mZnNldF92MS5rX29mZnNldCA9IGNwdV90b19sZTMyKG9mZnNldCkpIDoJLyogamRtIGNoZWNrICovCisJICAgICh2b2lkKShzZXRfb2Zmc2V0X3YyX2tfb2Zmc2V0KCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgb2Zmc2V0KSk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX29mZnNldCAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBsb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX29mZnNldChzdHJ1Y3QgaXRlbV9oZWFkICppaCwgbG9mZl90IG9mZnNldCkKIHsKLSAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChpaF92ZXJzaW9uIChpaCksICYoaWgtPmloX2tleSksIG9mZnNldCk7CisJc2V0X2xlX2tleV9rX29mZnNldChpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSwgb2Zmc2V0KTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX3R5cGUgKGludCB2ZXJzaW9uLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVfa2V5X2tfdHlwZShpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgaW50IHR5cGUpCiB7Ci0gICAgKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KLSAgICAgICAgKHZvaWQpKGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MgPSBjcHVfdG9fbGUzMih0eXBlMnVuaXF1ZW5lc3ModHlwZSkpKToKLQkodm9pZCkoc2V0X29mZnNldF92Ml9rX3R5cGUoICYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgdHlwZSApKTsKKwkodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPworCSAgICAodm9pZCkoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9CisJCSAgIGNwdV90b19sZTMyKHR5cGUydW5pcXVlbmVzcyh0eXBlKSkpCisJICAgIDogKHZvaWQpKHNldF9vZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgdHlwZSkpOwogfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX3R5cGUgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2loX2tfdHlwZShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IHR5cGUpCiB7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKGloX3ZlcnNpb24gKGloKSwgJihpaC0+aWhfa2V5KSwgdHlwZSk7CisJc2V0X2xlX2tleV9rX3R5cGUoaWhfdmVyc2lvbihpaCksICYoaWgtPmloX2tleSksIHR5cGUpOwogfQogCi0KICNkZWZpbmUgaXNfZGlyZW50cnlfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVOVFJZKQogI2RlZmluZSBpc19kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVDVCkKICNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQpAQCAtNjQyLDM0ICs2MzgsMzIgQEAKICNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfaWgoaWgpIGlzX2luZGlyZWN0X2xlX2tleSAoaWhfdmVyc2lvbihpaCksICYoKGloKS0+aWhfa2V5KSkKICNkZWZpbmUgaXNfc3RhdGRhdGFfbGVfaWgoaWgpIGlzX3N0YXRkYXRhX2xlX2tleSAoaWhfdmVyc2lvbiAoaWgpLCAmKChpaCktPmloX2tleSkpCiAKLQotCiAvLwogLy8ga2V5IGlzIHBvaW50ZXIgdG8gY3B1IGtleSwgcmVzdWx0IGlzIGNwdQogLy8KLXN0YXRpYyBpbmxpbmUgbG9mZl90IGNwdV9rZXlfa19vZmZzZXQgKGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBsb2ZmX3QgY3B1X2tleV9rX29mZnNldChjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHJldHVybiBrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0OworCXJldHVybiBrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBjcHVfa2V5X2tfdHlwZSAoY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBjcHVfa2V5X2tfdHlwZShjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHJldHVybiBrZXktPm9uX2Rpc2tfa2V5LmtfdHlwZTsKKwlyZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX3R5cGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1X2tleV9rX29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXksIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa19vZmZzZXQoc3RydWN0IGNwdV9rZXkgKmtleSwgbG9mZl90IG9mZnNldCkKIHsKIAlrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gb2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa190eXBlIChzdHJ1Y3QgY3B1X2tleSAqIGtleSwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa190eXBlKHN0cnVjdCBjcHVfa2V5ICprZXksIGludCB0eXBlKQogewogCWtleS0+b25fZGlza19rZXkua190eXBlID0gdHlwZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNwdV9rZXlfa19vZmZzZXRfZGVjIChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfa2V5X2tfb2Zmc2V0X2RlYyhzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotCWtleS0+b25fZGlza19rZXkua19vZmZzZXQgLS07CisJa2V5LT5vbl9kaXNrX2tleS5rX29mZnNldC0tOwogfQogCiAjZGVmaW5lIGlzX2RpcmVudHJ5X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKQEAgLTY3NywzNCArNjcxLDI1IEBACiAjZGVmaW5lIGlzX2luZGlyZWN0X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKICNkZWZpbmUgaXNfc3RhdGRhdGFfY3B1X2tleShrZXkpIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX1NUQVRfREFUQSkKIAotCiAvKiBhcmUgdGhlc2UgdXNlZCA/ICovCiAjZGVmaW5lIGlzX2RpcmVudHJ5X2NwdV9paChpaCkgKGlzX2RpcmVudHJ5X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCiAjZGVmaW5lIGlzX2RpcmVjdF9jcHVfaWgoaWgpIChpc19kaXJlY3RfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKICNkZWZpbmUgaXNfaW5kaXJlY3RfY3B1X2loKGloKSAoaXNfaW5kaXJlY3RfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKICNkZWZpbmUgaXNfc3RhdGRhdGFfY3B1X2loKGloKSAoaXNfc3RhdGRhdGFfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKIAotCi0KLQotCiAjZGVmaW5lIElfS19LRVlfSU5fSVRFTShwX3NfaWgsIHBfc19rZXksIG5fYmxvY2tzaXplKSBcCiAgICAgKCAhIENPTVBfU0hPUlRfS0VZUyhwX3NfaWgsIHBfc19rZXkpICYmIFwKICAgICAgICAgICBJX09GRl9CWVRFX0lOX0lURU0ocF9zX2loLCBrX29mZnNldCAocF9zX2tleSksIG5fYmxvY2tzaXplKSApCiAKLS8qIG1heGltYWwgbGVuZ3RoIG9mIGl0ZW0gKi8gCisvKiBtYXhpbWFsIGxlbmd0aCBvZiBpdGVtICovCiAjZGVmaW5lIE1BWF9JVEVNX0xFTihibG9ja19zaXplKSAoYmxvY2tfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUpCiAjZGVmaW5lIE1JTl9JVEVNX0xFTiAxCiAKLQogLyogb2JqZWN0IGlkZW50aWZpZXIgZm9yIHJvb3QgZGlyICovCiAjZGVmaW5lIFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgMgogI2RlZmluZSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCAxCiBleHRlcm4gc3RydWN0IHJlaXNlcmZzX2tleSByb290X2tleTsKIAotCi0KLQogLyogCiAgKiBQaWN0dXJlIHJlcHJlc2VudHMgYSBsZWFmIG9mIHRoZSBTK3RyZWUKICAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQEAgLTcxNiwxMyArNzAxLDEzIEBACiAKIC8qIEhlYWRlciBvZiBhIGRpc2sgYmxvY2suICBNb3JlIHByZWNpc2VseSwgaGVhZGVyIG9mIGEgZm9ybWF0dGVkIGxlYWYKICAgIG9yIGludGVybmFsIG5vZGUsIGFuZCBub3QgdGhlIGhlYWRlciBvZiBhbiB1bmZvcm1hdHRlZCBub2RlLiAqLwotc3RydWN0IGJsb2NrX2hlYWQgeyAgICAgICAKLSAgX19sZTE2IGJsa19sZXZlbDsgICAgICAgIC8qIExldmVsIG9mIGEgYmxvY2sgaW4gdGhlIHRyZWUuICovCi0gIF9fbGUxNiBibGtfbnJfaXRlbTsgICAgICAvKiBOdW1iZXIgb2Yga2V5cy9pdGVtcyBpbiBhIGJsb2NrLiAqLwotICBfX2xlMTYgYmxrX2ZyZWVfc3BhY2U7ICAgLyogQmxvY2sgZnJlZSBzcGFjZSBpbiBieXRlcy4gKi8KLSAgX19sZTE2IGJsa19yZXNlcnZlZDsKLQkJCQkvKiBkdW1wIHRoaXMgaW4gdjQvcGxhbkEgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2tleSAgYmxrX3JpZ2h0X2RlbGltX2tleTsgLyoga2VwdCBvbmx5IGZvciBjb21wYXRpYmlsaXR5ICovCitzdHJ1Y3QgYmxvY2tfaGVhZCB7CisJX19sZTE2IGJsa19sZXZlbDsJLyogTGV2ZWwgb2YgYSBibG9jayBpbiB0aGUgdHJlZS4gKi8KKwlfX2xlMTYgYmxrX25yX2l0ZW07CS8qIE51bWJlciBvZiBrZXlzL2l0ZW1zIGluIGEgYmxvY2suICovCisJX19sZTE2IGJsa19mcmVlX3NwYWNlOwkvKiBCbG9jayBmcmVlIHNwYWNlIGluIGJ5dGVzLiAqLworCV9fbGUxNiBibGtfcmVzZXJ2ZWQ7CisJLyogZHVtcCB0aGlzIGluIHY0L3BsYW5BICovCisJc3RydWN0IHJlaXNlcmZzX2tleSBibGtfcmlnaHRfZGVsaW1fa2V5OwkvKiBrZXB0IG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgKi8KIH07CiAKICNkZWZpbmUgQkxLSF9TSVpFICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZCkpCkBAIC03NDEsMTIgKzcyNiwxMiBAQAogICogdmFsdWVzIGZvciBibGtfbGV2ZWwgZmllbGQgb2YgdGhlIHN0cnVjdCBibG9ja19oZWFkCiAgKi8KIAotI2RlZmluZSBGUkVFX0xFVkVMIDAgLyogd2hlbiBub2RlIGdldHMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGl0cwotCQkJYmxrX2xldmVsIGlzIHNldCB0byBGUkVFX0xFVkVMLiBJdCBpcyB0aGVuCi0JCQl1c2VkIHRvIHNlZSB3aGV0aGVyIHRoZSBub2RlIGlzIHN0aWxsIGluIHRoZQotCQkJdHJlZSAqLworI2RlZmluZSBGUkVFX0xFVkVMIDAJCS8qIHdoZW4gbm9kZSBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBpdHMKKwkJCQkgICBibGtfbGV2ZWwgaXMgc2V0IHRvIEZSRUVfTEVWRUwuIEl0IGlzIHRoZW4KKwkJCQkgICB1c2VkIHRvIHNlZSB3aGV0aGVyIHRoZSBub2RlIGlzIHN0aWxsIGluIHRoZQorCQkJCSAgIHRyZWUgKi8KIAotI2RlZmluZSBESVNLX0xFQUZfTk9ERV9MRVZFTCAgMSAvKiBMZWFmIG5vZGUgbGV2ZWwuKi8KKyNkZWZpbmUgRElTS19MRUFGX05PREVfTEVWRUwgIDEJLyogTGVhZiBub2RlIGxldmVsLiAqLwogCiAvKiBHaXZlbiB0aGUgYnVmZmVyIGhlYWQgb2YgYSBmb3JtYXR0ZWQgbm9kZSwgcmVzb2x2ZSB0byB0aGUgYmxvY2sgaGVhZCBvZiB0aGF0IG5vZGUuICovCiAjZGVmaW5lIEJfQkxLX0hFQUQocF9zX2JoKSAgICAgICAgICAgICgoc3RydWN0IGJsb2NrX2hlYWQgKikoKHBfc19iaCktPmJfZGF0YSkpCkBAIC03NTksNyArNzQ0LDYgQEAKICNkZWZpbmUgUFVUX0JfTEVWRUwocF9zX2JoLHZhbCkgICAgICAgZG8geyBzZXRfYmxraF9sZXZlbChCX0JMS19IRUFEKHBfc19iaCksdmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgUFVUX0JfRlJFRV9TUEFDRShwX3NfYmgsdmFsKSAgZG8geyBzZXRfYmxraF9mcmVlX3NwYWNlKEJfQkxLX0hFQUQocF9zX2JoKSx2YWwpOyB9IHdoaWxlICgwKQogCi0KIC8qIEdldCByaWdodCBkZWxpbWl0aW5nIGtleS4gLS0gbGl0dGxlIGVuZGlhbiAqLwogI2RlZmluZSBCX1BSSUdIVF9ERUxJTV9LRVkocF9zX2JoKSAgICgmKGJsa19yaWdodF9kZWxpbV9rZXkoQl9CTEtfSEVBRChwX3NfYmgpKQogCkBAIC03NzAsNDEgKzc1NCwzNiBAQAogI2RlZmluZSBCX0lTX0tFWVNfTEVWRUwocF9zX2JoKSAgICAgIChCX0xFVkVMKHBfc19iaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJfTEVWRUwocF9zX2JoKSA8PSBNQVhfSEVJR0hUKQogCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVQgREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLy8KIC8vIG9sZCBzdGF0IGRhdGEgaXMgMzIgYnl0ZXMgbG9uZy4gV2UgYXJlIGdvaW5nIHRvIGRpc3Rpbmd1aXNoIG5ldyBvbmUgYnkKIC8vIGRpZmZlcmVudCBzaXplCiAvLwotc3RydWN0IHN0YXRfZGF0YV92MQotewotICAgIF9fbGUxNiBzZF9tb2RlOwkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCi0gICAgX19sZTE2IHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLwotICAgIF9fbGUxNiBzZF91aWQ7CQkvKiBvd25lciAqLwotICAgIF9fbGUxNiBzZF9naWQ7CQkvKiBncm91cCAqLwotICAgIF9fbGUzMiBzZF9zaXplOwkvKiBmaWxlIHNpemUgKi8KLSAgICBfX2xlMzIgc2RfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgICBfX2xlMzIgc2RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAgKi8KLSAgICBfX2xlMzIgc2RfY3RpbWU7CS8qIHRpbWUgaW5vZGUgKHN0YXQgZGF0YSkgd2FzIGxhc3QgY2hhbmdlZCAoZXhjZXB0IGNoYW5nZXMgdG8gc2RfYXRpbWUgYW5kIHNkX210aW1lKSAqLwotICAgIHVuaW9uIHsKLQlfX2xlMzIgc2RfcmRldjsKLQlfX2xlMzIgc2RfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIGZpbGUgdXNlcyAqLwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OwotICAgIF9fbGUzMiBzZF9maXJzdF9kaXJlY3RfYnl0ZTsgLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZAotCQkJCSAgIGluIGEgZGlyZWN0IGl0ZW06IGV4Y2VwdCB0aGF0IGlmIGl0Ci0JCQkJICAgZXF1YWxzIDEgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdAotCQkJCSAgIGVxdWFscyB+KF9fdTMyKTAgdGhlcmUgaXMgbm8KLQkJCQkgICBkaXJlY3QgaXRlbS4gIFRoZSBleGlzdGVuY2Ugb2YgdGhpcwotCQkJCSAgIGZpZWxkIHJlYWxseSBncmF0ZXMgb24gbWUuIExldCdzCi0JCQkJICAgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8gYmFzZWQgb24KLQkJCQkgICBzZF9zaXplIGFuZCBvdXIgdGFpbCBzdXBwcmVzc2lvbgotCQkJCSAgIHBvbGljeS4gIFNvbWVkYXkuICAtSGFucyAqLworc3RydWN0IHN0YXRfZGF0YV92MSB7CisJX19sZTE2IHNkX21vZGU7CQkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCisJX19sZTE2IHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLworCV9fbGUxNiBzZF91aWQ7CQkvKiBvd25lciAqLworCV9fbGUxNiBzZF9naWQ7CQkvKiBncm91cCAqLworCV9fbGUzMiBzZF9zaXplOwkJLyogZmlsZSBzaXplICovCisJX19sZTMyIHNkX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJX19sZTMyIHNkX210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgICovCisJX19sZTMyIHNkX2N0aW1lOwkvKiB0aW1lIGlub2RlIChzdGF0IGRhdGEpIHdhcyBsYXN0IGNoYW5nZWQgKGV4Y2VwdCBjaGFuZ2VzIHRvIHNkX2F0aW1lIGFuZCBzZF9tdGltZSkgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBzZF9yZGV2OworCQlfX2xlMzIgc2RfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIGZpbGUgdXNlcyAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUzMiBzZF9maXJzdF9kaXJlY3RfYnl0ZTsJLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZAorCQkJCQkgICBpbiBhIGRpcmVjdCBpdGVtOiBleGNlcHQgdGhhdCBpZiBpdAorCQkJCQkgICBlcXVhbHMgMSBpdCBpcyBhIHN5bWxpbmsgYW5kIGlmIGl0CisJCQkJCSAgIGVxdWFscyB+KF9fdTMyKTAgdGhlcmUgaXMgbm8KKwkJCQkJICAgZGlyZWN0IGl0ZW0uICBUaGUgZXhpc3RlbmNlIG9mIHRoaXMKKwkJCQkJICAgZmllbGQgcmVhbGx5IGdyYXRlcyBvbiBtZS4gTGV0J3MKKwkJCQkJICAgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8gYmFzZWQgb24KKwkJCQkJICAgc2Rfc2l6ZSBhbmQgb3VyIHRhaWwgc3VwcHJlc3Npb24KKwkJCQkJICAgcG9saWN5LiAgU29tZWRheS4gIC1IYW5zICovCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKICNkZWZpbmUgU0RfVjFfU0laRSAgICAgICAgICAgICAgKHNpemVvZihzdHJ1Y3Qgc3RhdF9kYXRhX3YxKSkKQEAgLTg2MiwyOSArODQxLDI5IEBACiAvKiBTdGF0IERhdGEgb24gZGlzayAocmVpc2VyZnMgdmVyc2lvbiBvZiBVRlMgZGlzayBpbm9kZSBtaW51cyB0aGUKICAgIGFkZHJlc3MgYmxvY2tzKSAqLwogc3RydWN0IHN0YXRfZGF0YSB7Ci0gICAgX19sZTE2IHNkX21vZGU7CS8qIGZpbGUgdHlwZSwgcGVybWlzc2lvbnMgKi8KLSAgICBfX2xlMTYgc2RfYXR0cnM7ICAgICAvKiBwZXJzaXN0ZW50IGlub2RlIGZsYWdzICovCi0gICAgX19sZTMyIHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLwotICAgIF9fbGU2NCBzZF9zaXplOwkvKiBmaWxlIHNpemUgKi8KLSAgICBfX2xlMzIgc2RfdWlkOwkJLyogb3duZXIgKi8KLSAgICBfX2xlMzIgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KLSAgICBfX2xlMzIgc2RfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgICBfX2xlMzIgc2RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAgKi8KLSAgICBfX2xlMzIgc2RfY3RpbWU7CS8qIHRpbWUgaW5vZGUgKHN0YXQgZGF0YSkgd2FzIGxhc3QgY2hhbmdlZCAoZXhjZXB0IGNoYW5nZXMgdG8gc2RfYXRpbWUgYW5kIHNkX210aW1lKSAqLwotICAgIF9fbGUzMiBzZF9ibG9ja3M7Ci0gICAgdW5pb24gewotCV9fbGUzMiBzZF9yZGV2OwotCV9fbGUzMiBzZF9nZW5lcmF0aW9uOwotICAgICAgLy9fX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7Ci0gICAgICAvKiBmaXJzdCBieXRlIG9mIGZpbGUgd2hpY2ggaXMgc3RvcmVkIGluIGEKLQkJCQkgICAgICAgZGlyZWN0IGl0ZW06IGV4Y2VwdCB0aGF0IGlmIGl0IGVxdWFscyAxCi0JCQkJICAgICAgIGl0IGlzIGEgc3ltbGluayBhbmQgaWYgaXQgZXF1YWxzCi0JCQkJICAgICAgIH4oX191MzIpMCB0aGVyZSBpcyBubyBkaXJlY3QgaXRlbS4gIFRoZQotCQkJCSAgICAgICBleGlzdGVuY2Ugb2YgdGhpcyBmaWVsZCByZWFsbHkgZ3JhdGVzCi0JCQkJICAgICAgIG9uIG1lLiBMZXQncyByZXBsYWNlIGl0IHdpdGggYSBtYWNybwotCQkJCSAgICAgICBiYXNlZCBvbiBzZF9zaXplIGFuZCBvdXIgdGFpbAotCQkJCSAgICAgICBzdXBwcmVzc2lvbiBwb2xpY3k/ICovCi0gIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUxNiBzZF9tb2RlOwkJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLworCV9fbGUxNiBzZF9hdHRyczsJLyogcGVyc2lzdGVudCBpbm9kZSBmbGFncyAqLworCV9fbGUzMiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKwlfX2xlNjQgc2Rfc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCV9fbGUzMiBzZF91aWQ7CQkvKiBvd25lciAqLworCV9fbGUzMiBzZF9naWQ7CQkvKiBncm91cCAqLworCV9fbGUzMiBzZF9hdGltZTsJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLworCV9fbGUzMiBzZF9tdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICAqLworCV9fbGUzMiBzZF9jdGltZTsJLyogdGltZSBpbm9kZSAoc3RhdCBkYXRhKSB3YXMgbGFzdCBjaGFuZ2VkIChleGNlcHQgY2hhbmdlcyB0byBzZF9hdGltZSBhbmQgc2RfbXRpbWUpICovCisJX19sZTMyIHNkX2Jsb2NrczsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZF9yZGV2OworCQlfX2xlMzIgc2RfZ2VuZXJhdGlvbjsKKwkJLy9fX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7CisJCS8qIGZpcnN0IGJ5dGUgb2YgZmlsZSB3aGljaCBpcyBzdG9yZWQgaW4gYQorCQkgICBkaXJlY3QgaXRlbTogZXhjZXB0IHRoYXQgaWYgaXQgZXF1YWxzIDEKKwkJICAgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdCBlcXVhbHMKKwkJICAgfihfX3UzMikwIHRoZXJlIGlzIG5vIGRpcmVjdCBpdGVtLiAgVGhlCisJCSAgIGV4aXN0ZW5jZSBvZiB0aGlzIGZpZWxkIHJlYWxseSBncmF0ZXMKKwkJICAgb24gbWUuIExldCdzIHJlcGxhY2UgaXQgd2l0aCBhIG1hY3JvCisJCSAgIGJhc2VkIG9uIHNkX3NpemUgYW5kIG91ciB0YWlsCisJCSAgIHN1cHByZXNzaW9uIHBvbGljeT8gKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIC8vCiAvLyB0aGlzIGlzIDQ0IGJ5dGVzIGxvbmcKQEAgLTkxOSw3ICs4OTgsNiBAQAogI2RlZmluZSBzZF92Ml9hdHRycyhzZHApICAgICAgICAgKGxlMTZfdG9fY3B1KChzZHApLT5zZF9hdHRycykpCiAjZGVmaW5lIHNldF9zZF92Ml9hdHRycyhzZHAsdikgICAoKHNkcCktPnNkX2F0dHJzID0gY3B1X3RvX2xlMTYodikpCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWSBTVFJVQ1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTU0LDE3ICs5MzIsMTQgQEAKIC8qIE5PVCBJTVBMRU1FTlRFRDogICAKICAgIERpcmVjdG9yeSB3aWxsIHNvbWVkYXkgY29udGFpbiBzdGF0IGRhdGEgb2Ygb2JqZWN0ICovCiAKLQotCi1zdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZAotewotICBfX2xlMzIgZGVoX29mZnNldDsJCS8qIHRoaXJkIGNvbXBvbmVudCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGtleSAqLwotICBfX2xlMzIgZGVoX2Rpcl9pZDsJCS8qIG9iamVjdGlkIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBvYmplY3QsIHRoYXQgaXMgcmVmZXJlbmNlZAotCQkJCQkgICBieSBkaXJlY3RvcnkgZW50cnkgKi8KLSAgX19sZTMyIGRlaF9vYmplY3RpZDsJCS8qIG9iamVjdGlkIG9mIHRoZSBvYmplY3QsIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBkaXJlY3RvcnkgZW50cnkgKi8KLSAgX19sZTE2IGRlaF9sb2NhdGlvbjsJCS8qIG9mZnNldCBvZiBuYW1lIGluIHRoZSB3aG9sZSBpdGVtICovCi0gIF9fbGUxNiBkZWhfc3RhdGU7CQkvKiB3aGV0aGVyIDEpIGVudHJ5IGNvbnRhaW5zIHN0YXQgZGF0YSAoZm9yIGZ1dHVyZSksIGFuZCAyKSB3aGV0aGVyCi0JCQkJCSAgIGVudHJ5IGlzIGhpZGRlbiAodW5saW5rZWQpICovCitzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCB7CisJX19sZTMyIGRlaF9vZmZzZXQ7CS8qIHRoaXJkIGNvbXBvbmVudCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGtleSAqLworCV9fbGUzMiBkZWhfZGlyX2lkOwkvKiBvYmplY3RpZCBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkJCQkgICBieSBkaXJlY3RvcnkgZW50cnkgKi8KKwlfX2xlMzIgZGVoX29iamVjdGlkOwkvKiBvYmplY3RpZCBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZGlyZWN0b3J5IGVudHJ5ICovCisJX19sZTE2IGRlaF9sb2NhdGlvbjsJLyogb2Zmc2V0IG9mIG5hbWUgaW4gdGhlIHdob2xlIGl0ZW0gKi8KKwlfX2xlMTYgZGVoX3N0YXRlOwkvKiB3aGV0aGVyIDEpIGVudHJ5IGNvbnRhaW5zIHN0YXQgZGF0YSAoZm9yIGZ1dHVyZSksIGFuZCAyKSB3aGV0aGVyCisJCQkJICAgZW50cnkgaXMgaGlkZGVuICh1bmxpbmtlZCkgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKICNkZWZpbmUgREVIX1NJWkUgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQpCiAjZGVmaW5lIGRlaF9vZmZzZXQocF9kZWgpICAgICAgICAgKGxlMzJfdG9fY3B1KChwX2RlaCktPmRlaF9vZmZzZXQpKQpAQCAtOTg2LDcgKzk2MSw3IEBACiAvKiBvbGQgZm9ybWF0IGRpcmVjdG9yaWVzIGhhdmUgdGhpcyBzaXplIHdoZW4gZW1wdHkgKi8KICNkZWZpbmUgRU1QVFlfRElSX1NJWkVfVjEgKERFSF9TSVpFICogMiArIDMpCiAKLSNkZWZpbmUgREVIX1N0YXRkYXRhIDAJCQkvKiBub3QgdXNlZCBub3cgKi8KKyNkZWZpbmUgREVIX1N0YXRkYXRhIDAJCS8qIG5vdCB1c2VkIG5vdyAqLwogI2RlZmluZSBERUhfVmlzaWJsZSAyCiAKIC8qIDY0IGJpdCBzeXN0ZW1zIChhbmQgdGhlIFMvMzkwKSBuZWVkIHRvIGJlIGFsaWduZWQgZXhwbGljaXRseSAtamRtICovCkBAIC0xMDIzLDEwICs5OTgsMTAgQEAKICNkZWZpbmUgZGVfdmlzaWJsZShkZWgpCSAgICAJICAgIHRlc3RfYml0X3VuYWxpZ25lZCAoREVIX1Zpc2libGUsICYoKGRlaCktPmRlaF9zdGF0ZSkpCiAjZGVmaW5lIGRlX2hpZGRlbihkZWgpCSAgICAJICAgICF0ZXN0X2JpdF91bmFsaWduZWQgKERFSF9WaXNpYmxlLCAmKChkZWgpLT5kZWhfc3RhdGUpKQogCi1leHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChjaGFyICogYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCi0JCQkJICAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOwotZXh0ZXJuIHZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbSAoY2hhciAqIGJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAotCQkJCSBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKTsKK2V4dGVybiB2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEoY2hhciAqYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCisJCQkJICAgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCk7CitleHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJCV9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOwogCiAvKiBhcnJheSBvZiB0aGUgZW50cnkgaGVhZGVycyAqLwogIC8qIGdldCBpdGVtIGJvZHkgKi8KQEAgLTEwNDMsNTMgKzEwMTgsNDggQEAKICNkZWZpbmUgSV9ERUhfTl9FTlRSWV9MRU5HVEgoaWgsZGVoLGkpIFwKICgoaSkgPyAoZGVoX2xvY2F0aW9uKChkZWgpLTEpIC0gZGVoX2xvY2F0aW9uKChkZWgpKSkgOiAoaWhfaXRlbV9sZW4oKGloKSkgLSBkZWhfbG9jYXRpb24oKGRlaCkpKSkKICovCi1zdGF0aWMgaW5saW5lIGludCBlbnRyeV9sZW5ndGggKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAKLQkJCQkJCQkJY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgcG9zX2luX2l0ZW0pCitzdGF0aWMgaW5saW5lIGludCBlbnRyeV9sZW5ndGgoY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IHBvc19pbl9pdGVtKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CiAKLSAgICBkZWggPSBCX0lfREVIIChiaCwgaWgpICsgcG9zX2luX2l0ZW07Ci0gICAgaWYgKHBvc19pbl9pdGVtKQotCXJldHVybiBkZWhfbG9jYXRpb24oZGVoLTEpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisJZGVoID0gQl9JX0RFSChiaCwgaWgpICsgcG9zX2luX2l0ZW07CisJaWYgKHBvc19pbl9pdGVtKQorCQlyZXR1cm4gZGVoX2xvY2F0aW9uKGRlaCAtIDEpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CiAKLSAgICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisJcmV0dXJuIGloX2l0ZW1fbGVuKGloKSAtIGRlaF9sb2NhdGlvbihkZWgpOwogfQogCi0KLQogLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLCBkZXBlbmRzIG9uIEVOVFJZX0NPVU5UIGJlaW5nIGF0IHRoZSBzdGFydCBvZiBkaXJlY3RvcnkgZHluYW1pYyBkYXRhLiAqLwogI2RlZmluZSBJX0VOVFJZX0NPVU5UKGloKSAoaWhfZW50cnlfY291bnQoKGloKSkpCiAKLQogLyogbmFtZSBieSBiaCwgaWggYW5kIGVudHJ5X251bSAqLwogI2RlZmluZSBCX0lfRV9OQU1FKGJoLGloLGVudHJ5X251bSkgKChjaGFyICopKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBkZWhfbG9jYXRpb24oQl9JX0RFSChiaCxpaCkrKGVudHJ5X251bSkpKSkKIAogLy8gdHdvIGVudHJpZXMgcGVyIGJsb2NrIChhdCBsZWFzdCkKICNkZWZpbmUgUkVJU0VSRlNfTUFYX05BTUUoYmxvY2tfc2l6ZSkgMjU1CiAKLQogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3Igb3BlcmF0aW9ucyBvbiBkaXJlY3RvcnkgZW50cmllcy4gSXQgaXMKICAgIG5vdCBhIGRpc2sgc3RydWN0dXJlLiAqLwogLyogV2hlbiByZWlzZXJmc19maW5kX2VudHJ5IG9yIHNlYXJjaF9ieV9lbnRyeV9rZXkgZmluZCBkaXJlY3RvcnkKICAgIGVudHJ5LCB0aGV5IHJldHVybiBmaWxsZWQgcmVpc2VyZnNfZGlyX2VudHJ5IHN0cnVjdHVyZSAqLwotc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeQotewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZV9iaDsKLSAgaW50IGRlX2l0ZW1fbnVtOwotICBzdHJ1Y3QgaXRlbV9oZWFkICogZGVfaWg7Ci0gIGludCBkZV9lbnRyeV9udW07Ci0gIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVfZGVoOwotICBpbnQgZGVfZW50cnlsZW47Ci0gIGludCBkZV9uYW1lbGVuOwotICBjaGFyICogZGVfbmFtZTsKLSAgY2hhciAqIGRlX2dlbl9udW1iZXJfYml0X3N0cmluZzsKK3N0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgeworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVfYmg7CisJaW50IGRlX2l0ZW1fbnVtOworCXN0cnVjdCBpdGVtX2hlYWQgKmRlX2loOworCWludCBkZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlX2RlaDsKKwlpbnQgZGVfZW50cnlsZW47CisJaW50IGRlX25hbWVsZW47CisJY2hhciAqZGVfbmFtZTsKKwljaGFyICpkZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmc7CiAKLSAgX191MzIgZGVfZGlyX2lkOwotICBfX3UzMiBkZV9vYmplY3RpZDsKKwlfX3UzMiBkZV9kaXJfaWQ7CisJX191MzIgZGVfb2JqZWN0aWQ7CiAKLSAgc3RydWN0IGNwdV9rZXkgZGVfZW50cnlfa2V5OworCXN0cnVjdCBjcHVfa2V5IGRlX2VudHJ5X2tleTsKIH07Ci0gICAKKwogLyogdGhlc2UgZGVmaW5lcyBhcmUgdXNlZnVsIHdoZW4gYSBwYXJ0aWN1bGFyIG1lbWJlciBvZiBhIHJlaXNlcmZzX2Rpcl9lbnRyeSBpcyBuZWVkZWQgKi8KIAogLyogcG9pbnRlciB0byBmaWxlIG5hbWUsIHN0b3JlZCBpbiBlbnRyeSAqLwpAQCAtMTA5OSw4ICsxMDY5LDYgQEAKICNkZWZpbmUgSV9ERUhfTl9FTlRSWV9GSUxFX05BTUVfTEVOR1RIKGloLGRlaCxlbnRyeV9udW0pIFwKIChJX0RFSF9OX0VOVFJZX0xFTkdUSCAoaWgsIGRlaCwgZW50cnlfbnVtKSAtIChkZV93aXRoX3NkIChkZWgpID8gU0RfU0laRSA6IDApKQogCi0KLQogLyogaGFzaCB2YWx1ZSBvY2N1cGllcyBiaXRzIGZyb20gNyB1cCB0byAzMCAqLwogI2RlZmluZSBHRVRfSEFTSF9WQUxVRShvZmZzZXQpICgob2Zmc2V0KSAmIDB4N2ZmZmZmODBMTCkKIC8qIGdlbmVyYXRpb24gbnVtYmVyIG9jY3VwaWVzIDcgYml0cyBzdGFydGluZyBmcm9tIDAgdXAgdG8gNiAqLwpAQCAtMTEwOSw3ICsxMDc3LDYgQEAKIAogI2RlZmluZSBTRVRfR0VORVJBVElPTl9OVU1CRVIob2Zmc2V0LGdlbl9udW1iZXIpIChHRVRfSEFTSF9WQUxVRShvZmZzZXQpfChnZW5fbnVtYmVyKSkKIAotCiAvKgogICogUGljdHVyZSByZXByZXNlbnRzIGFuIGludGVybmFsIG5vZGUgb2YgdGhlIHJlaXNlcmZzIHRyZWUKICAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQEAgLTExMjUsOSArMTA5Miw5IEBACiAvKiBEaXNrIGNoaWxkIHBvaW50ZXI6IFRoZSBwb2ludGVyIGZyb20gYW4gaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZQogICAgdG8gYSBub2RlIHRoYXQgaXMgb24gZGlzay4gKi8KIHN0cnVjdCBkaXNrX2NoaWxkIHsKLSAgX19sZTMyICAgICAgIGRjX2Jsb2NrX251bWJlcjsgICAgICAgICAgICAgIC8qIERpc2sgY2hpbGQncyBibG9jayBudW1iZXIuICovCi0gIF9fbGUxNiAgICAgICBkY19zaXplOwkJICAgICAgICAgICAgLyogRGlzayBjaGlsZCdzIHVzZWQgc3BhY2UuICAgKi8KLSAgX19sZTE2ICAgICAgIGRjX3Jlc2VydmVkOworCV9fbGUzMiBkY19ibG9ja19udW1iZXI7CS8qIERpc2sgY2hpbGQncyBibG9jayBudW1iZXIuICovCisJX19sZTE2IGRjX3NpemU7CQkvKiBEaXNrIGNoaWxkJ3MgdXNlZCBzcGFjZS4gICAqLworCV9fbGUxNiBkY19yZXNlcnZlZDsKIH07CiAKICNkZWZpbmUgRENfU0laRSAoc2l6ZW9mKHN0cnVjdCBkaXNrX2NoaWxkKSkKQEAgLTExNDQsNyArMTExMSw3IEBACiAjZGVmaW5lIEJfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zKSAoZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpKSkKICNkZWZpbmUgUFVUX0JfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zLCB2YWwpIChwdXRfZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpLCB2YWwgKSkKIAotIC8qIG1heGltYWwgdmFsdWUgb2YgZmllbGQgY2hpbGRfc2l6ZSBpbiBzdHJ1Y3R1cmUgZGlza19jaGlsZCAqLyAKKyAvKiBtYXhpbWFsIHZhbHVlIG9mIGZpZWxkIGNoaWxkX3NpemUgaW4gc3RydWN0dXJlIGRpc2tfY2hpbGQgKi8KICAvKiBjaGlsZCBzaXplIGlzIHRoZSBjb21iaW5lZCBzaXplIG9mIGFsbCBpdGVtcyBhbmQgdGhlaXIgaGVhZGVycyAqLwogI2RlZmluZSBNQVhfQ0hJTERfU0laRShiaCkgKChpbnQpKCAoYmgpLT5iX3NpemUgLSBCTEtIX1NJWkUgKSkKIApAQCAtMTE1OSw3ICsxMTI2LDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgIFBBVEggU1RSVUNUVVJFUyBBTkQgREVGSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIFNlYXJjaF9ieV9rZXkgZmlsbHMgdXAgdGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgbGVhZiBhcyBpdCBkZXNjZW5kcyB0aGUgdHJlZSBsb29raW5nIGZvciB0aGUKICAgIGtleS4gIEl0IHVzZXMgcmVpc2VyZnNfYnJlYWQgdG8gdHJ5IHRvIGZpbmQgYnVmZmVycyBpbiB0aGUgY2FjaGUgZ2l2ZW4gdGhlaXIgYmxvY2sgbnVtYmVyLiAgSWYgaXQKICAgIGRvZXMgbm90IGZpbmQgdGhlbSBpbiB0aGUgY2FjaGUgaXQgcmVhZHMgdGhlbSBmcm9tIGRpc2suICBGb3IgZWFjaCBub2RlIHNlYXJjaF9ieV9rZXkgZmluZHMgdXNpbmcKQEAgLTExNjgsMjAgKzExMzQsMTggQEAKICAgIGlzIGxvb2tpbmcgdGhyb3VnaCBhIGxlYWYgbm9kZSBiaW5fc2VhcmNoIHdpbGwgZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gd2hpY2ggaGFzIGtleSBlaXRoZXIKICAgIGVxdWFsIHRvIGdpdmVuIGtleSwgb3Igd2hpY2ggaXMgdGhlIG1heGltYWwga2V5IGxlc3MgdGhhbiB0aGUgZ2l2ZW4ga2V5LiAqLwogCi1zdHJ1Y3QgIHBhdGhfZWxlbWVudCAgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKglwZV9idWZmZXI7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBpbiB0aGUgdHJlZS4gKi8KLSAgaW50ICAgICAgICAgCQlwZV9wb3NpdGlvbjsgIC8qIFBvc2l0aW9uIGluIHRoZSB0cmVlIG5vZGUgd2hpY2ggaXMgcGxhY2VkIGluIHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXIgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcGF0aF9lbGVtZW50IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBlX2J1ZmZlcjsJLyogUG9pbnRlciB0byB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoIGluIHRoZSB0cmVlLiAqLworCWludCBwZV9wb3NpdGlvbjsJLyogUG9zaXRpb24gaW4gdGhlIHRyZWUgbm9kZSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlICovCisJLyogYnVmZmVyIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotI2RlZmluZSBNQVhfSEVJR0hUIDUgLyogbWF4aW1hbCBoZWlnaHQgb2YgYSB0cmVlLiBkb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICovCi0jZGVmaW5lIEVYVEVOREVEX01BWF9IRUlHSFQgICAgICAgICA3IC8qIE11c3QgYmUgZXF1YWxzIE1BWF9IRUlHSFQgKyBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICovCi0jZGVmaW5lIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgICAyIC8qIE11c3QgYmUgZXF1YWwgdG8gYXQgbGVhc3QgMi4gKi8KKyNkZWZpbmUgTUFYX0hFSUdIVCA1CQkvKiBtYXhpbWFsIGhlaWdodCBvZiBhIHRyZWUuIGRvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgY2hhbmdpbmcgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKi8KKyNkZWZpbmUgRVhURU5ERURfTUFYX0hFSUdIVCAgICAgICAgIDcJLyogTXVzdCBiZSBlcXVhbHMgTUFYX0hFSUdIVCArIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKi8KKyNkZWZpbmUgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAgIDIJLyogTXVzdCBiZSBlcXVhbCB0byBhdCBsZWFzdCAyLiAqLwogCi0jZGVmaW5lIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCAxIC8qIE11c3QgYmUgZXF1YWwgdG8gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAtIDEgKi8KLSNkZWZpbmUgTUFYX0ZFQl9TSVpFIDYgICAvKiB0aGlzIE1VU1QgYmUgTUFYX0hFSUdIVCArIDEuIFNlZSBhYm91dCBGRUIgYmVsb3cgKi8KLQotCisjZGVmaW5lIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCAxCS8qIE11c3QgYmUgZXF1YWwgdG8gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAtIDEgKi8KKyNkZWZpbmUgTUFYX0ZFQl9TSVpFIDYJCS8qIHRoaXMgTVVTVCBiZSBNQVhfSEVJR0hUICsgMS4gU2VlIGFib3V0IEZFQiBiZWxvdyAqLwogCiAvKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hvIHRoZSBhbmNlc3RvcnMgb2Ygbm9kZXMgYXJlLiAgV2hlbiB3ZQogICAgcGVyZm9ybSBhIHNlYXJjaCB3ZSByZWNvcmQgd2hpY2ggbm9kZXMgd2VyZSB2aXNpdGVkIHdoaWxlCkBAIC0xMjAwLDE0ICsxMTY0LDE0IEBACiBnb2RzIG9ubHkga25vdyBob3cgd2UgYXJlIGdvaW5nIHRvIFNNUCB0aGUgY29kZSB0aGF0IHVzZXMgdGhlbS4KIHpub2RlcyBhcmUgdGhlIHdheSEgKi8KIAotI2RlZmluZSBQQVRIX1JFQURBCTB4MSAvKiBkbyByZWFkIGFoZWFkICovCi0jZGVmaW5lIFBBVEhfUkVBREFfQkFDSyAweDIgLyogcmVhZCBiYWNrd2FyZHMgKi8KKyNkZWZpbmUgUEFUSF9SRUFEQQkweDEJLyogZG8gcmVhZCBhaGVhZCAqLworI2RlZmluZSBQQVRIX1JFQURBX0JBQ0sgMHgyCS8qIHJlYWQgYmFja3dhcmRzICovCiAKLXN0cnVjdCAgcGF0aCB7Ci0gIGludCAgICAgICAgICAgICAgICAgICBwYXRoX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgCS8qIExlbmd0aCBvZiB0aGUgYXJyYXkgYWJvdmUuICAgKi8KLSAgaW50CQkJcmVhZGE7Ci0gIHN0cnVjdCAgcGF0aF9lbGVtZW50ICBwYXRoX2VsZW1lbnRzW0VYVEVOREVEX01BWF9IRUlHSFRdOwkvKiBBcnJheSBvZiB0aGUgcGF0aCBlbGVtZW50cy4gICovCi0gIGludAkJCXBvc19pbl9pdGVtOworc3RydWN0IHBhdGggeworCWludCBwYXRoX2xlbmd0aDsJLyogTGVuZ3RoIG9mIHRoZSBhcnJheSBhYm92ZS4gICAqLworCWludCByZWFkYTsKKwlzdHJ1Y3QgcGF0aF9lbGVtZW50IHBhdGhfZWxlbWVudHNbRVhURU5ERURfTUFYX0hFSUdIVF07CS8qIEFycmF5IG9mIHRoZSBwYXRoIGVsZW1lbnRzLiAgKi8KKwlpbnQgcG9zX2luX2l0ZW07CiB9OwogCiAjZGVmaW5lIHBvc19pbl9pdGVtKHBhdGgpICgocGF0aCktPnBvc19pbl9pdGVtKQpAQCAtMTIyNCwyNSArMTE4OCwyMyBAQAogLyogR2V0IHBvc2l0aW9uIGluIHRoZSBlbGVtZW50IGF0IHRoZSBwYXRoIGJ5IHBhdGggYW5kIHBhdGggcG9zaXRpb24uICovCiAjZGVmaW5lIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLG5fb2Zmc2V0KSAoUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3BhdGgsbl9vZmZzZXQpLT5wZV9wb3NpdGlvbikKIAotCiAjZGVmaW5lIFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSAoUEFUSF9PRkZTRVRfUEJVRkZFUigocF9zX3BhdGgpLCAocF9zX3BhdGgpLT5wYXRoX2xlbmd0aCkpCiAJCQkJLyogeW91IGtub3csIHRvIHRoZSBwZXJzb24gd2hvIGRpZG4ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0aGlzIHRoZSBtYWNybyBuYW1lIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGZpcnN0IHN1Z2dlc3Qgd2hhdCBpdCBkb2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZSBQT1NJVElPTl9GUk9NX1BBVEhfRU5EPyBPcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSB3ZSBzaG91bGQganVzdCBmb2N1cyBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1waW5nIHBhdGhzLi4uIC1IYW5zICovCisJCQkJICAgd3JpdGUgdGhpcyB0aGUgbWFjcm8gbmFtZSBkb2VzIG5vdAorCQkJCSAgIGF0IGZpcnN0IHN1Z2dlc3Qgd2hhdCBpdCBkb2VzLgorCQkJCSAgIE1heWJlIFBPU0lUSU9OX0ZST01fUEFUSF9FTkQ/IE9yCisJCQkJICAgbWF5YmUgd2Ugc2hvdWxkIGp1c3QgZm9jdXMgb24KKwkJCQkgICBkdW1waW5nIHBhdGhzLi4uIC1IYW5zICovCiAjZGVmaW5lIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgKFBBVEhfT0ZGU0VUX1BPU0lUSU9OKChwX3NfcGF0aCksIChwX3NfcGF0aCktPnBhdGhfbGVuZ3RoKSkKIAotCiAjZGVmaW5lIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpLFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkpCiAKIC8qIGluIGRvX2JhbGFuY2UgbGVhZiBoYXMgaCA9PSAwIGluIGNvbnRyYXN0IHdpdGggcGF0aCBzdHJ1Y3R1cmUsCiAgICB3aGVyZSByb290IGhhcyBsZXZlbCA9PSAwLiBUaGF0IGlzIHdoeSB3ZSBuZWVkIHRoZXNlIGRlZmluZXMgKi8KICNkZWZpbmUgUEFUSF9IX1BCVUZGRVIocF9zX3BhdGgsIGgpIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc19wYXRoLCBwX3NfcGF0aC0+cGF0aF9sZW5ndGggLSAoaCkpCS8qIHRiLT5TW2hdICovCi0jZGVmaW5lIFBBVEhfSF9QUEFSRU5UKHBhdGgsIGgpIFBBVEhfSF9QQlVGRkVSIChwYXRoLCAoaCkgKyAxKQkJCS8qIHRiLT5GW2hdIG9yIHRiLT5TWzBdLT5iX3BhcmVudCAqLwotI2RlZmluZSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCkgUEFUSF9PRkZTRVRfUE9TSVRJT04gKHBhdGgsIHBhdGgtPnBhdGhfbGVuZ3RoIC0gKGgpKQkKLSNkZWZpbmUgUEFUSF9IX0JfSVRFTV9PUkRFUihwYXRoLCBoKSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCArIDEpCQkvKiB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCisjZGVmaW5lIFBBVEhfSF9QUEFSRU5UKHBhdGgsIGgpIFBBVEhfSF9QQlVGRkVSIChwYXRoLCAoaCkgKyAxKQkvKiB0Yi0+RltoXSBvciB0Yi0+U1swXS0+Yl9wYXJlbnQgKi8KKyNkZWZpbmUgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGgpIFBBVEhfT0ZGU0VUX1BPU0lUSU9OIChwYXRoLCBwYXRoLT5wYXRoX2xlbmd0aCAtIChoKSkKKyNkZWZpbmUgUEFUSF9IX0JfSVRFTV9PUkRFUihwYXRoLCBoKSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCArIDEpCS8qIHRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIgKi8KIAogI2RlZmluZSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCkgKChwX3NfcGF0aCktPnBhdGhfbGVuZ3RoIC0gKG5faCkpCiAKQEAgLTEyNTMsNyArMTIxNSw2IEBACiAjZGVmaW5lIGl0ZW1fbW92ZWQoaWgscGF0aCkgY29tcF9pdGVtcyhpaCwgcGF0aCkKICNkZWZpbmUgcGF0aF9jaGFuZ2VkKGloLHBhdGgpIGNvbXBfaXRlbXMgKGloLCBwYXRoKQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNzIsMzAgKzEyMzMsMjYgQEAKIC8vIHJlaXNlcmZzIHZlcnNpb24gMiBoYXMgbWF4IG9mZnNldCA2MCBiaXRzLiBWZXJzaW9uIDEgLSAzMiBiaXQgb2Zmc2V0CiAjZGVmaW5lIFUzMl9NQVggKH4oX191MzIpMCkKIAotc3RhdGljIGlubGluZSBsb2ZmX3QgbWF4X3JlaXNlcmZzX29mZnNldCAoc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBtYXhfcmVpc2VyZnNfb2Zmc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNSkKLQlyZXR1cm4gKGxvZmZfdClVMzJfTUFYOworCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUpCisJCXJldHVybiAobG9mZl90KSBVMzJfTUFYOwogCi0gICAgcmV0dXJuIChsb2ZmX3QpKCh+KF9fdTY0KTApID4+IDQpOworCXJldHVybiAobG9mZl90KSAoKH4oX191NjQpIDApID4+IDQpOwogfQogCi0KIC8qI2RlZmluZSBNQVhfS0VZX1VOSVFVRU5FU1MJTUFYX1VMX0lOVCovCiAjZGVmaW5lIE1BWF9LRVlfT0JKRUNUSUQJTUFYX1VMX0lOVAogCi0KICNkZWZpbmUgTUFYX0JfTlVNICBNQVhfVUxfSU5UCiAjZGVmaW5lIE1BWF9GQ19OVU0gTUFYX1VTX0lOVAogCi0KIC8qIHRoZSBwdXJwb3NlIGlzIHRvIGRldGVjdCBvdmVyZmxvdyBvZiBhbiB1bnNpZ25lZCBzaG9ydCAqLwogI2RlZmluZSBSRUlTRVJGU19MSU5LX01BWCAoTUFYX1VTX0lOVCAtIDEwMDApCiAKLQogLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIGluIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCByZWlzZXJmc19hcHBlbmRfaXRlbSAgKi8KLSNkZWZpbmUgUkVJU0VSRlNfS0VSTkVMX01FTQkJMAkvKiByZWlzZXJmcyBrZXJuZWwgbWVtb3J5IG1vZGUJKi8KLSNkZWZpbmUgUkVJU0VSRlNfVVNFUl9NRU0JCTEJLyogcmVpc2VyZnMgdXNlciBtZW1vcnkgbW9kZQkJKi8KKyNkZWZpbmUgUkVJU0VSRlNfS0VSTkVMX01FTQkJMAkvKiByZWlzZXJmcyBrZXJuZWwgbWVtb3J5IG1vZGUgICovCisjZGVmaW5lIFJFSVNFUkZTX1VTRVJfTUVNCQkxCS8qIHJlaXNlcmZzIHVzZXIgbWVtb3J5IG1vZGUgICAgICAgICAgICAqLwogCiAjZGVmaW5lIGZzX2dlbmVyYXRpb24ocykgKFJFSVNFUkZTX1NCKHMpLT5zX2dlbmVyYXRpb25fY291bnRlcikKICNkZWZpbmUgZ2V0X2dlbmVyYXRpb24ocykgYXRvbWljX3JlYWQgKCZmc19nZW5lcmF0aW9uKHMpKQpAQCAtMTMwMyw3ICsxMjYwLDYgQEAKICNkZWZpbmUgX19mc19jaGFuZ2VkKGdlbixzKSAoZ2VuICE9IGdldF9nZW5lcmF0aW9uIChzKSkKICNkZWZpbmUgZnNfY2hhbmdlZChnZW4scykgKHtjb25kX3Jlc2NoZWQoKTsgX19mc19jaGFuZ2VkKGdlbiwgcyk7fSkKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICBGSVhBVEUgTk9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzI0LDM4ICsxMjgwLDM0IEBACiAgICBjYWxjdWxhdGluZyB3aGF0IHdlIGNhbiBzaGlmdCB0byBuZWlnaGJvcnMgYW5kIGhvdyBtYW55IG5vZGVzIHdlCiAgICBoYXZlIHRvIGhhdmUgaWYgd2UgZG8gbm90IGFueSBzaGlmdGluZ3MsIGlmIHdlIHNoaWZ0IHRvIGxlZnQvcmlnaHQKICAgIG5laWdoYm9yIG9yIHRvIGJvdGguICovCi1zdHJ1Y3QgdmlydHVhbF9pdGVtCi17Ci0gICAgaW50IHZpX2luZGV4OyAvLyBpbmRleCBpbiB0aGUgYXJyYXkgb2YgaXRlbSBvcGVyYXRpb25zCi0gICAgdW5zaWduZWQgc2hvcnQgdmlfdHlwZTsJLy8gbGVmdC9yaWdodCBtZXJnZWFiaWxpdHkKLSAgICB1bnNpZ25lZCBzaG9ydCB2aV9pdGVtX2xlbjsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBpdGVtIHRoYXQgaXQgd2lsbCBoYXZlIGFmdGVyIGJhbGFuY2luZyAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiB2aV9paDsKLSAgICBjb25zdCBjaGFyICogdmlfaXRlbTsgICAgIC8vIGJvZHkgb2YgaXRlbSAob2xkIG9yIG5ldykKLSAgICBjb25zdCB2b2lkICogdmlfbmV3X2RhdGE7IC8vIDAgYWx3YXlzIGJ1dCBwYXN0ZSBtb2RlCi0gICAgdm9pZCAqIHZpX3VhcmVhOyAgICAvLyBpdGVtIHNwZWNpZmljIGFyZWEKK3N0cnVjdCB2aXJ0dWFsX2l0ZW0geworCWludCB2aV9pbmRleDsJCS8vIGluZGV4IGluIHRoZSBhcnJheSBvZiBpdGVtIG9wZXJhdGlvbnMKKwl1bnNpZ25lZCBzaG9ydCB2aV90eXBlOwkvLyBsZWZ0L3JpZ2h0IG1lcmdlYWJpbGl0eQorCXVuc2lnbmVkIHNob3J0IHZpX2l0ZW1fbGVuOwkvKiBsZW5ndGggb2YgaXRlbSB0aGF0IGl0IHdpbGwgaGF2ZSBhZnRlciBiYWxhbmNpbmcgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICp2aV9paDsKKwljb25zdCBjaGFyICp2aV9pdGVtOwkvLyBib2R5IG9mIGl0ZW0gKG9sZCBvciBuZXcpCisJY29uc3Qgdm9pZCAqdmlfbmV3X2RhdGE7CS8vIDAgYWx3YXlzIGJ1dCBwYXN0ZSBtb2RlCisJdm9pZCAqdmlfdWFyZWE7CQkvLyBpdGVtIHNwZWNpZmljIGFyZWEKIH07CiAKLQotc3RydWN0IHZpcnR1YWxfbm9kZQotewotICBjaGFyICogdm5fZnJlZV9wdHI7CQkvKiB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCi0gIHVuc2lnbmVkIHNob3J0IHZuX25yX2l0ZW07CS8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgKi8KLSAgc2hvcnQgdm5fc2l6ZTsgICAgICAgIAkvKiBzaXplIG9mIG5vZGUgLCB0aGF0IG5vZGUgd291bGQgaGF2ZSBpZiBpdCBoYXMgdW5saW1pdGVkIHNpemUgYW5kIG5vIGJhbGFuY2luZyBpcyBwZXJmb3JtZWQgKi8KLSAgc2hvcnQgdm5fbW9kZTsJCS8qIG1vZGUgb2YgYmFsYW5jaW5nIChwYXN0ZSwgaW5zZXJ0LCBkZWxldGUsIGN1dCkgKi8KLSAgc2hvcnQgdm5fYWZmZWN0ZWRfaXRlbV9udW07IAotICBzaG9ydCB2bl9wb3NfaW5faXRlbTsKLSAgc3RydWN0IGl0ZW1faGVhZCAqIHZuX2luc19paDsJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSwgMCBmb3Igb3RoZXIgbW9kZXMgKi8KLSAgY29uc3Qgdm9pZCAqIHZuX2RhdGE7Ci0gIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2bl92aTsJLyogYXJyYXkgb2YgaXRlbXMgKGluY2x1ZGluZyBhIG5ldyBvbmUsIGV4Y2x1ZGluZyBpdGVtIHRvIGJlIGRlbGV0ZWQpICovCitzdHJ1Y3QgdmlydHVhbF9ub2RlIHsKKwljaGFyICp2bl9mcmVlX3B0cjsJLyogdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIHNob3J0IHZuX25yX2l0ZW07CS8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgKi8KKwlzaG9ydCB2bl9zaXplOwkJLyogc2l6ZSBvZiBub2RlICwgdGhhdCBub2RlIHdvdWxkIGhhdmUgaWYgaXQgaGFzIHVubGltaXRlZCBzaXplIGFuZCBubyBiYWxhbmNpbmcgaXMgcGVyZm9ybWVkICovCisJc2hvcnQgdm5fbW9kZTsJCS8qIG1vZGUgb2YgYmFsYW5jaW5nIChwYXN0ZSwgaW5zZXJ0LCBkZWxldGUsIGN1dCkgKi8KKwlzaG9ydCB2bl9hZmZlY3RlZF9pdGVtX251bTsKKwlzaG9ydCB2bl9wb3NfaW5faXRlbTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICp2bl9pbnNfaWg7CS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0sIDAgZm9yIG90aGVyIG1vZGVzICovCisJY29uc3Qgdm9pZCAqdm5fZGF0YTsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2bl92aTsJLyogYXJyYXkgb2YgaXRlbXMgKGluY2x1ZGluZyBhIG5ldyBvbmUsIGV4Y2x1ZGluZyBpdGVtIHRvIGJlIGRlbGV0ZWQpICovCiB9OwogCiAvKiB1c2VkIGJ5IGRpcmVjdG9yeSBpdGVtcyB3aGVuIGNyZWF0aW5nIHZpcnR1YWwgbm9kZXMgKi8KIHN0cnVjdCBkaXJlbnRyeV91YXJlYSB7Ci0gICAgaW50IGZsYWdzOwotICAgIF9fdTE2IGVudHJ5X2NvdW50OwotICAgIF9fdTE2IGVudHJ5X3NpemVzWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIDsKLQorCWludCBmbGFnczsKKwlfX3UxNiBlbnRyeV9jb3VudDsKKwlfX3UxNiBlbnRyeV9zaXplc1sxXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgVFJFRSBCQUxBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzc4LDczICsxMzMwLDcyIEBACiAjZGVmaW5lIE1BWF9BTU9VTlRfTkVFREVEIDIKIAogLyogc29tZWRheSBzb21lYm9keSB3aWxsIHByZWZpeCBldmVyeSBmaWVsZCBpbiB0aGlzIHN0cnVjdCB3aXRoIHRiXyAqLwotc3RydWN0IHRyZWVfYmFsYW5jZQotewotICBpbnQgdGJfbW9kZTsKLSAgaW50IG5lZWRfYmFsYW5jZV9kaXJ0eTsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICogdGJfc2I7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRyYW5zYWN0aW9uX2hhbmRsZSA7Ci0gIHN0cnVjdCBwYXRoICogdGJfcGF0aDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogTFtNQVhfSEVJR0hUXTsgICAgICAgIC8qIGFycmF5IG9mIGxlZnQgbmVpZ2hib3JzIG9mIG5vZGVzIGluIHRoZSBwYXRoICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIFJbTUFYX0hFSUdIVF07ICAgICAgICAvKiBhcnJheSBvZiByaWdodCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGgqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBGTFtNQVhfSEVJR0hUXTsgICAgICAgLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgbGVmdCAgbmVpZ2hib3JzICAgICAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogRlJbTUFYX0hFSUdIVF07ICAgICAgIC8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIHJpZ2h0IG5laWdoYm9ycyAgICAgICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIENGTFtNQVhfSEVJR0hUXTsgICAgICAvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIGxlZnQgbmVpZ2hib3IgICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIENGUltNQVhfSEVJR0hUXTsgICAgICAvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yICovCitzdHJ1Y3QgdHJlZV9iYWxhbmNlIHsKKwlpbnQgdGJfbW9kZTsKKwlpbnQgbmVlZF9iYWxhbmNlX2RpcnR5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqdGJfc2I7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdHJhbnNhY3Rpb25faGFuZGxlOworCXN0cnVjdCBwYXRoICp0Yl9wYXRoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbGVmdCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlJbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIHJpZ2h0IG5laWdoYm9ycyBvZiBub2RlcyBpbiB0aGUgcGF0aCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRkxbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIGxlZnQgIG5laWdoYm9ycyAgICAgICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpGUltNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgcmlnaHQgbmVpZ2hib3JzICAgICAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkNGTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyBsZWZ0IG5laWdoYm9yICAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqQ0ZSW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yICovCiAKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogRkVCW01BWF9GRUJfU0laRV07IC8qIGFycmF5IG9mIGVtcHR5IGJ1ZmZlcnMuIE51bWJlciBvZiBidWZmZXJzIGluIGFycmF5IGVxdWFscwotCQkJCQkgICAgIGN1cl9ibGtudW0uICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVzZWRbTUFYX0ZFQl9TSVpFXTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGhyb3duW01BWF9GRUJfU0laRV07Ci0gIGludCBsbnVtW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBudW1iZXIgb2YgaXRlbXMgd2hpY2ggbXVzdCBiZQotCQkJICAgc2hpZnRlZCB0byB0aGUgbGVmdCBpbiBvcmRlciB0byBiYWxhbmNlIHRoZQotCQkJICAgY3VycmVudCBub2RlOyBmb3IgbGVhdmVzIGluY2x1ZGVzIGl0ZW0gdGhhdAotCQkJICAgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZDsgZm9yIGludGVybmFsCi0JCQkgICBub2RlcywgaXQgaXMgdGhlIG51bWJlciBvZiBjaGlsZCBwb2ludGVycwotCQkJICAgcmF0aGVyIHRoYW4gaXRlbXMuIEl0IGluY2x1ZGVzIHRoZSBuZXcgaXRlbQotCQkJICAgYmVpbmcgY3JlYXRlZC4gVGhlIGNvZGUgc29tZXRpbWVzIHN1YnRyYWN0cwotCQkJICAgb25lIHRvIGdldCB0aGUgbnVtYmVyIG9mIHdob2xseSBzaGlmdGVkCi0JCQkgICBpdGVtcyBmb3Igb3RoZXIgcHVycG9zZXMuICovCi0gIGludCBybnVtW01BWF9IRUlHSFRdOwkvKiBzdWJzdGl0dXRlIHJpZ2h0IGZvciBsZWZ0IGluIGNvbW1lbnQgYWJvdmUgKi8KLSAgaW50IGxrZXlbTUFYX0hFSUdIVF07ICAgICAgICAgICAgICAgLyogYXJyYXkgaW5kZXhlZCBieSBoZWlnaHQgaCBtYXBwaW5nIHRoZSBrZXkgZGVsaW1pdGluZyBMW2hdIGFuZAotCQkJCQkgICAgICAgU1toXSB0byBpdHMgaXRlbSBudW1iZXIgd2l0aGluIHRoZSBub2RlIENGTFtoXSAqLwotICBpbnQgcmtleVtNQVhfSEVJR0hUXTsgICAgICAgICAgICAgICAvKiBzdWJzdGl0dXRlIHIgZm9yIGwgaW4gY29tbWVudCBhYm92ZSAqLwotICBpbnQgaW5zZXJ0X3NpemVbTUFYX0hFSUdIVF07ICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmcm9tCi0JCQkJCSAgICAgICBTW2hdLiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHJlbW92aW5nLiAgKi8KLSAgaW50IGJsa251bVtNQVhfSEVJR0hUXTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5vZGVzIHRoYXQgd2lsbCByZXBsYWNlIG5vZGUgU1toXSBhZnRlcgotCQkJCQkgICAgICAgYmFsYW5jaW5nIG9uIHRoZSBsZXZlbCBoIG9mIHRoZSB0cmVlLiAgSWYgMCB0aGVuIFMgaXMKLQkJCQkJICAgICAgIGJlaW5nIGRlbGV0ZWQsIGlmIDEgdGhlbiBTIGlzIHJlbWFpbmluZyBhbmQgbm8gbmV3IG5vZGVzCi0JCQkJCSAgICAgICBhcmUgYmVpbmcgY3JlYXRlZCwgaWYgMiBvciAzIHRoZW4gMSBvciAyIG5ldyBub2RlcyBpcwotCQkJCQkgICAgICAgYmVpbmcgY3JlYXRlZCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRkVCW01BWF9GRUJfU0laRV07CS8qIGFycmF5IG9mIGVtcHR5IGJ1ZmZlcnMuIE51bWJlciBvZiBidWZmZXJzIGluIGFycmF5IGVxdWFscworCQkJCQkJICAgY3VyX2Jsa251bS4gKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVzZWRbTUFYX0ZFQl9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRocm93bltNQVhfRkVCX1NJWkVdOworCWludCBsbnVtW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBudW1iZXIgb2YgaXRlbXMgd2hpY2ggbXVzdCBiZQorCQkJCSAgIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGUKKwkJCQkgICBjdXJyZW50IG5vZGU7IGZvciBsZWF2ZXMgaW5jbHVkZXMgaXRlbSB0aGF0CisJCQkJICAgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZDsgZm9yIGludGVybmFsCisJCQkJICAgbm9kZXMsIGl0IGlzIHRoZSBudW1iZXIgb2YgY2hpbGQgcG9pbnRlcnMKKwkJCQkgICByYXRoZXIgdGhhbiBpdGVtcy4gSXQgaW5jbHVkZXMgdGhlIG5ldyBpdGVtCisJCQkJICAgYmVpbmcgY3JlYXRlZC4gVGhlIGNvZGUgc29tZXRpbWVzIHN1YnRyYWN0cworCQkJCSAgIG9uZSB0byBnZXQgdGhlIG51bWJlciBvZiB3aG9sbHkgc2hpZnRlZAorCQkJCSAgIGl0ZW1zIGZvciBvdGhlciBwdXJwb3Nlcy4gKi8KKwlpbnQgcm51bVtNQVhfSEVJR0hUXTsJLyogc3Vic3RpdHV0ZSByaWdodCBmb3IgbGVmdCBpbiBjb21tZW50IGFib3ZlICovCisJaW50IGxrZXlbTUFYX0hFSUdIVF07CS8qIGFycmF5IGluZGV4ZWQgYnkgaGVpZ2h0IGggbWFwcGluZyB0aGUga2V5IGRlbGltaXRpbmcgTFtoXSBhbmQKKwkJCQkgICBTW2hdIHRvIGl0cyBpdGVtIG51bWJlciB3aXRoaW4gdGhlIG5vZGUgQ0ZMW2hdICovCisJaW50IHJrZXlbTUFYX0hFSUdIVF07CS8qIHN1YnN0aXR1dGUgciBmb3IgbCBpbiBjb21tZW50IGFib3ZlICovCisJaW50IGluc2VydF9zaXplW01BWF9IRUlHSFRdOwkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmcm9tCisJCQkJCSAgIFNbaF0uIEEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgcmVtb3ZpbmcuICAqLworCWludCBibGtudW1bTUFYX0hFSUdIVF07CS8qIG51bWJlciBvZiBub2RlcyB0aGF0IHdpbGwgcmVwbGFjZSBub2RlIFNbaF0gYWZ0ZXIKKwkJCQkgICBiYWxhbmNpbmcgb24gdGhlIGxldmVsIGggb2YgdGhlIHRyZWUuICBJZiAwIHRoZW4gUyBpcworCQkJCSAgIGJlaW5nIGRlbGV0ZWQsIGlmIDEgdGhlbiBTIGlzIHJlbWFpbmluZyBhbmQgbm8gbmV3IG5vZGVzCisJCQkJICAgYXJlIGJlaW5nIGNyZWF0ZWQsIGlmIDIgb3IgMyB0aGVuIDEgb3IgMiBuZXcgbm9kZXMgaXMKKwkJCQkgICBiZWluZyBjcmVhdGVkICovCiAKLSAgLyogZmllbGRzIHRoYXQgYXJlIHVzZWQgb25seSBmb3IgYmFsYW5jaW5nIGxlYXZlcyBvZiB0aGUgdHJlZSAqLwotICBpbnQgY3VyX2Jsa251bTsJLyogbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyBoYXZpbmcgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZAkJCSovCi0gIGludCBzMG51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGxlZnQgbW9zdCAgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBzMW51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBzMm51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIHNlY29uZCBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBsYnl0ZXM7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yIGZyb20gdGhlCWxlZnQJKi8KLSAgLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQkJKi8KLSAgLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgKi8KLSAgaW50IHJieXRlczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2lsbCBmbG93IHRvIHRoZSByaWdodCBuZWlnaGJvciBmcm9tIHRoZSByaWdodAkqLwotICAvKiBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5CQkqLwotICAvKiBpZiAtMSB0aGVuIG5vdGhpbmcgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIGludCBzMWJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gICAgICAgICAgICAJCQkvKiBub3RlOiBpZiBTWzBdIHNwbGl0cyBpbnRvIDMgbm9kZXMsIHRoZW4gaXRlbXMgZG8gbm90IG5lZWQgdG8gYmUgY3V0CSovCi0gIGludCBzMmJ5dGVzOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBidWZfdG9fZnJlZVtNQVhfRlJFRV9CTE9DS107IC8qIGJ1ZmZlcnMgd2hpY2ggYXJlIHRvIGJlIGZyZWVkIGFmdGVyIGRvX2JhbGFuY2UgZmluaXNoZXMgYnkgdW5maXhfbm9kZXMgKi8KLSAgY2hhciAqIHZuX2J1ZjsJCS8qIGttYWxsb2NlZCBtZW1vcnkuIFVzZWQgdG8gY3JlYXRlCisJLyogZmllbGRzIHRoYXQgYXJlIHVzZWQgb25seSBmb3IgYmFsYW5jaW5nIGxlYXZlcyBvZiB0aGUgdHJlZSAqLworCWludCBjdXJfYmxrbnVtOwkJLyogbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyBoYXZpbmcgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCAgICAgICAgICAgICAgICAgKi8KKwlpbnQgczBudW07CQkvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCBmYWxsIGludG8gbGVmdCBtb3N0ICBub2RlIHdoZW4gU1swXSBzcGxpdHMgICAgICovCisJaW50IHMxbnVtOwkJLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgICAqLworCWludCBzMm51bTsJCS8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBzZWNvbmQgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAgICAgKi8KKwlpbnQgbGJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yIGZyb20gdGhlICAgICAgICBsZWZ0ICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgKi8KKwlpbnQgcmJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IgZnJvbSB0aGUgcmlnaHQgICAgICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCBzMWJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgKi8KKwkvKiBub3RlOiBpZiBTWzBdIHNwbGl0cyBpbnRvIDMgbm9kZXMsIHRoZW4gaXRlbXMgZG8gbm90IG5lZWQgdG8gYmUgY3V0ICAqLworCWludCBzMmJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVmX3RvX2ZyZWVbTUFYX0ZSRUVfQkxPQ0tdOwkvKiBidWZmZXJzIHdoaWNoIGFyZSB0byBiZSBmcmVlZCBhZnRlciBkb19iYWxhbmNlIGZpbmlzaGVzIGJ5IHVuZml4X25vZGVzICovCisJY2hhciAqdm5fYnVmOwkJLyoga21hbGxvY2VkIG1lbW9yeS4gVXNlZCB0byBjcmVhdGUKIAkJCQkgICB2aXJ0dWFsIG5vZGUgYW5kIGtlZXAgbWFwIG9mCiAJCQkJICAgZGlydGllZCBiaXRtYXAgYmxvY2tzICovCi0gIGludCB2bl9idWZfc2l6ZTsJCS8qIHNpemUgb2YgdGhlIHZuX2J1ZiAqLwotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdGJfdm47CS8qIFZOIHN0YXJ0cyBhZnRlciBiaXRtYXAgb2YgYml0bWFwIGJsb2NrcyAqLworCWludCB2bl9idWZfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgdm5fYnVmICovCisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdGJfdm47CS8qIFZOIHN0YXJ0cyBhZnRlciBiaXRtYXAgb2YgYml0bWFwIGJsb2NrcyAqLwogCi0gIGludCBmc19nZW47ICAgICAgICAgICAgICAgICAgLyogc2F2ZWQgdmFsdWUgb2YgYHJlaXNlcmZzX2dlbmVyYXRpb24nIGNvdW50ZXIKLQkJCSAgICAgICAgICBzZWUgRklMRVNZU1RFTV9DSEFOR0VEKCkgbWFjcm8gaW4gcmVpc2VyZnNfZnMuaCAqLworCWludCBmc19nZW47CQkvKiBzYXZlZCB2YWx1ZSBvZiBgcmVpc2VyZnNfZ2VuZXJhdGlvbicgY291bnRlcgorCQkJCSAgIHNlZSBGSUxFU1lTVEVNX0NIQU5HRUQoKSBtYWNybyBpbiByZWlzZXJmc19mcy5oICovCiAjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICBzdHJ1Y3QgaW5fY29yZV9rZXkgIGtleTsJICAgICAgLyoga2V5IHBvaW50ZXIsIHRvIHBhc3MgdG8gYmxvY2sgYWxsb2NhdG9yIG9yCi0JCQkJIGFub3RoZXIgbG93LWxldmVsIHN1YnN5c3RlbSAqLworCXN0cnVjdCBpbl9jb3JlX2tleSBrZXk7CS8qIGtleSBwb2ludGVyLCB0byBwYXNzIHRvIGJsb2NrIGFsbG9jYXRvciBvcgorCQkJCSAgIGFub3RoZXIgbG93LWxldmVsIHN1YnN5c3RlbSAqLwogI2VuZGlmCi19IDsKK307CiAKIC8qIFRoZXNlIGFyZSBtb2RlcyBvZiBiYWxhbmNpbmcgKi8KIApAQCAtMTQ3OSwxMyArMTQzMCwxMiBAQAogLyogdXNlZCBpbiBkb19iYWxhbmNlIGZvciBwYXNzaW5nIHBhcmVudCBvZiBub2RlIGluZm9ybWF0aW9uIHRoYXQgaGFzCiAgICBiZWVuIGdvdHRlbiBmcm9tIHRiIHN0cnVjdCAqLwogc3RydWN0IGJ1ZmZlcl9pbmZvIHsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGI7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmlfYmg7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmlfcGFyZW50OwotICAgIGludCBiaV9wb3NpdGlvbjsKKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmlfcGFyZW50OworCWludCBiaV9wb3NpdGlvbjsKIH07CiAKLQogLyogdGhlcmUgYXJlIDQgdHlwZXMgb2YgaXRlbXM6IHN0YXQgZGF0YSwgZGlyZWN0b3J5IGl0ZW0sIGluZGlyZWN0LCBkaXJlY3QuCiArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwogfAkgICAgICAgICAgICB8ICBrX29mZnNldCAgfCBrX3VuaXF1ZW5lc3MgfCBtZXJnZWFibGU/IHwKQEAgLTE1MDMsMjQgKzE0NTMsMjQgQEAKICovCiAKIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgewotICAgIGludCAoKmJ5dGVzX251bWJlcikgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpOwotICAgIHZvaWQgKCpkZWNyZW1lbnRfa2V5KSAoc3RydWN0IGNwdV9rZXkgKik7Ci0gICAgaW50ICgqaXNfbGVmdF9tZXJnZWFibGUpIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogaWgsIHVuc2lnbmVkIGxvbmcgYnNpemUpOwotICAgIHZvaWQgKCpwcmludF9pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICogaXRlbSk7Ci0gICAgdm9pZCAoKmNoZWNrX2l0ZW0pIChzdHJ1Y3QgaXRlbV9oZWFkICosIGNoYXIgKiBpdGVtKTsKKwlpbnQgKCpieXRlc19udW1iZXIpIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKTsKKwl2b2lkICgqZGVjcmVtZW50X2tleSkgKHN0cnVjdCBjcHVfa2V5ICopOworCWludCAoKmlzX2xlZnRfbWVyZ2VhYmxlKSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGloLAorCQkJCSAgdW5zaWduZWQgbG9uZyBic2l6ZSk7CisJdm9pZCAoKnByaW50X2l0ZW0pIChzdHJ1Y3QgaXRlbV9oZWFkICosIGNoYXIgKml0ZW0pOworCXZvaWQgKCpjaGVja19pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICppdGVtKTsKIAotICAgIGludCAoKmNyZWF0ZV92aSkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJICAgICAgaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpOwotICAgIGludCAoKmNoZWNrX2xlZnQpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLCAKLQkJCSAgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKTsKLSAgICBpbnQgKCpjaGVja19yaWdodCkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpOwotICAgIGludCAoKnBhcnRfc2l6ZSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyb20sIGludCB0byk7Ci0gICAgaW50ICgqdW5pdF9udW0pIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpOwotICAgIHZvaWQgKCpwcmludF92aSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSk7CisJaW50ICgqY3JlYXRlX3ZpKSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLCBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksCisJCQkgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKTsKKwlpbnQgKCpjaGVja19sZWZ0KSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKKwkJCSAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApOworCWludCAoKmNoZWNrX3JpZ2h0KSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSk7CisJaW50ICgqcGFydF9zaXplKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJvbSwgaW50IHRvKTsKKwlpbnQgKCp1bml0X251bSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSk7CisJdm9pZCAoKnByaW50X3ZpKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKTsKIH07CiAKLQotZXh0ZXJuIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgKiBpdGVtX29wcyBbVFlQRV9BTlkgKyAxXTsKK2V4dGVybiBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICppdGVtX29wc1tUWVBFX0FOWSArIDFdOwogCiAjZGVmaW5lIG9wX2J5dGVzX251bWJlcihpaCxic2l6ZSkgICAgICAgICAgICAgICAgICAgIGl0ZW1fb3BzW2xlX2loX2tfdHlwZSAoaWgpXS0+Ynl0ZXNfbnVtYmVyIChpaCwgYnNpemUpCiAjZGVmaW5lIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKGtleSxic2l6ZSkgICAgICAgICAgICAgIGl0ZW1fb3BzW2xlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpXS0+aXNfbGVmdF9tZXJnZWFibGUgKGtleSwgYnNpemUpCkBAIC0xNTMzLDggKzE0ODMsNiBAQAogI2RlZmluZSBvcF91bml0X251bSh2aSkJCQkJICAgICBpdGVtX29wc1sodmkpLT52aV9pbmRleF0tPnVuaXRfbnVtICh2aSkKICNkZWZpbmUgb3BfcHJpbnRfdmkodmkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbKHZpKS0+dmlfaW5kZXhdLT5wcmludF92aSAodmkpCiAKLQotCiAjZGVmaW5lIENPTVBfU0hPUlRfS0VZUyBjb21wX3Nob3J0X2tleXMKIAogLyogbnVtYmVyIG9mIGJsb2NrcyBwb2ludGVkIHRvIGJ5IHRoZSBpbmRpcmVjdCBpdGVtICovCkBAIC0xNTQ1LDggKzE0OTMsNyBAQAogCiAvKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmVkIGJ5IHRoZSBkaXJlY3QgaXRlbSBvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgdGhlIGluZGlyZWN0IGl0ZW0gcG9pbnRzIHRvICovCiAKLQotLyogZ2V0IHRoZSBpdGVtIGhlYWRlciAqLyAKKy8qIGdldCB0aGUgaXRlbSBoZWFkZXIgKi8KICNkZWZpbmUgQl9OX1BJVEVNX0hFQUQoYmgsaXRlbV9udW0pICggKHN0cnVjdCBpdGVtX2hlYWQgKiApKChiaCktPmJfZGF0YSArIEJMS0hfU0laRSkgKyAoaXRlbV9udW0pICkKIAogLyogZ2V0IGtleSAqLwpAQCAtMTU3Nyw5ICsxNTI0LDkgQEAKICNkZWZpbmUgUFVUX0JfSV9QT1NfVU5GTV9QT0lOVEVSKGJoLGloLHBvcywgdmFsKSBkbyB7KigoKHVucF90ICopQl9JX1BJVEVNKGJoLGloKSkgKyAocG9zKSkgPSBjcHVfdG9fbGUzMih2YWwpOyB9IHdoaWxlICgwKQogCiBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIHsKLSAgICBfX3UzMiBvYmplY3RpZCA7Ci0gICAgX191MzIgZGlyaWQgOwotfSA7CisJX191MzIgb2JqZWN0aWQ7CisJX191MzIgZGlyaWQ7Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIERFQ0xBUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE1OTUsMTEgKzE1NDIsMTEgQEAKIAogLyogZmlyc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdC4gICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjIHsKLSAgX19sZTMyIGpfdHJhbnNfaWQgOwkJCS8qIGlkIG9mIGNvbW1pdCAqLwotICBfX2xlMzIgal9sZW4gOwkJCS8qIGxlbmd0aCBvZiBjb21taXQuIGxlbiArMSBpcyB0aGUgY29tbWl0IGJsb2NrICovCi0gIF9fbGUzMiBqX21vdW50X2lkIDsJCQkJLyogbW91bnQgaWQgb2YgdGhpcyB0cmFucyovCi0gIF9fbGUzMiBqX3JlYWxibG9ja1sxXSA7IC8qIHJlYWwgbG9jYXRpb25zIGZvciBlYWNoIGJsb2NrICovCi19IDsKKwlfX2xlMzIgal90cmFuc19pZDsJLyogaWQgb2YgY29tbWl0ICovCisJX19sZTMyIGpfbGVuOwkJLyogbGVuZ3RoIG9mIGNvbW1pdC4gbGVuICsxIGlzIHRoZSBjb21taXQgYmxvY2sgKi8KKwlfX2xlMzIgal9tb3VudF9pZDsJLyogbW91bnQgaWQgb2YgdGhpcyB0cmFucyAqLworCV9fbGUzMiBqX3JlYWxibG9ja1sxXTsJLyogcmVhbCBsb2NhdGlvbnMgZm9yIGVhY2ggYmxvY2sgKi8KK307CiAKICNkZWZpbmUgZ2V0X2Rlc2NfdHJhbnNfaWQoZCkgICBsZTMyX3RvX2NwdSgoZCktPmpfdHJhbnNfaWQpCiAjZGVmaW5lIGdldF9kZXNjX3RyYW5zX2xlbihkKSAgbGUzMl90b19jcHUoKGQpLT5qX2xlbikKQEAgLTE2MTEsMTAgKzE1NTgsMTAgQEAKIAogLyogbGFzdCBibG9jayB3cml0dGVuIGluIGEgY29tbWl0ICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgewotICBfX2xlMzIgal90cmFuc19pZCA7CQkJLyogbXVzdCBtYXRjaCBqX3RyYW5zX2lkIGZyb20gdGhlIGRlc2MgYmxvY2sgKi8KLSAgX19sZTMyIGpfbGVuIDsJCQkvKiBkaXR0byAqLwotICBfX2xlMzIgal9yZWFsYmxvY2tbMV0gOyAvKiByZWFsIGxvY2F0aW9ucyBmb3IgZWFjaCBibG9jayAqLwotfSA7CisJX19sZTMyIGpfdHJhbnNfaWQ7CS8qIG11c3QgbWF0Y2ggal90cmFuc19pZCBmcm9tIHRoZSBkZXNjIGJsb2NrICovCisJX19sZTMyIGpfbGVuOwkJLyogZGl0dG8gKi8KKwlfX2xlMzIgal9yZWFsYmxvY2tbMV07CS8qIHJlYWwgbG9jYXRpb25zIGZvciBlYWNoIGJsb2NrICovCit9OwogCiAjZGVmaW5lIGdldF9jb21taXRfdHJhbnNfaWQoYykgbGUzMl90b19jcHUoKGMpLT5qX3RyYW5zX2lkKQogI2RlZmluZSBnZXRfY29tbWl0X3RyYW5zX2xlbihjKSAgICAgICAgbGUzMl90b19jcHUoKGMpLT5qX2xlbikKQEAgLTE2MjgsMTkgKzE1NzUsMTkgQEAKICoqIGFuZCB0aGlzIHRyYW5zYWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVwbGF5ZWQuCiAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIHsKLSAgX19sZTMyIGpfbGFzdF9mbHVzaF90cmFuc19pZCA7CQkvKiBpZCBvZiBsYXN0IGZ1bGx5IGZsdXNoZWQgdHJhbnNhY3Rpb24gKi8KLSAgX19sZTMyIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA7ICAgICAgLyogb2Zmc2V0IGluIHRoZSBsb2cgb2Ygd2hlcmUgdG8gc3RhcnQgcmVwbGF5IGFmdGVyIGEgY3Jhc2ggKi8KLSAgX19sZTMyIGpfbW91bnRfaWQgOwotICAvKiAxMiAqLyBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgamhfam91cm5hbDsKLX0gOworCV9fbGUzMiBqX2xhc3RfZmx1c2hfdHJhbnNfaWQ7CS8qIGlkIG9mIGxhc3QgZnVsbHkgZmx1c2hlZCB0cmFuc2FjdGlvbiAqLworCV9fbGUzMiBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ7CS8qIG9mZnNldCBpbiB0aGUgbG9nIG9mIHdoZXJlIHRvIHN0YXJ0IHJlcGxheSBhZnRlciBhIGNyYXNoICovCisJX19sZTMyIGpfbW91bnRfaWQ7CisJLyogMTIgKi8gc3RydWN0IGpvdXJuYWxfcGFyYW1zIGpoX2pvdXJuYWw7Cit9OwogCiAvKiBiaWdnZXN0IHR1bmFibGUgZGVmaW5lcyBhcmUgcmlnaHQgaGVyZSAqLwotI2RlZmluZSBKT1VSTkFMX0JMT0NLX0NPVU5UIDgxOTIgLyogbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgam91cm5hbCAqLwotI2RlZmluZSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIDEwMjQgICAvKiBiaWdnZXN0IHBvc3NpYmxlIHNpbmdsZSB0cmFuc2FjdGlvbiwgZG9uJ3QgY2hhbmdlIGZvciBub3cgKDgvMy85OSkgKi8KKyNkZWZpbmUgSk9VUk5BTF9CTE9DS19DT1VOVCA4MTkyCS8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIGpvdXJuYWwgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAxMDI0CS8qIGJpZ2dlc3QgcG9zc2libGUgc2luZ2xlIHRyYW5zYWN0aW9uLCBkb24ndCBjaGFuZ2UgZm9yIG5vdyAoOC8zLzk5KSAqLwogI2RlZmluZSBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIDI1NgotI2RlZmluZSBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUICAgOTAwIC8qIG1heCBibG9ja3MgdG8gYmF0Y2ggaW50byBvbmUgdHJhbnNhY3Rpb24sIGRvbid0IG1ha2UgdGhpcyBhbnkgYmlnZ2VyIHRoYW4gOTAwICovCisjZGVmaW5lIEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQgICA5MDAJLyogbWF4IGJsb2NrcyB0byBiYXRjaCBpbnRvIG9uZSB0cmFuc2FjdGlvbiwgZG9uJ3QgbWFrZSB0aGlzIGFueSBiaWdnZXIgdGhhbiA5MDAgKi8KICNkZWZpbmUgSk9VUk5BTF9NSU5fUkFUSU8gMgotI2RlZmluZSBKT1VSTkFMX01BWF9DT01NSVRfQUdFIDMwIAorI2RlZmluZSBKT1VSTkFMX01BWF9DT01NSVRfQUdFIDMwCiAjZGVmaW5lIEpPVVJOQUxfTUFYX1RSQU5TX0FHRSAzMAogI2RlZmluZSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAoMyAqIChNQVhfSEVJR0hULTIpICsgOSkKICNpZmRlZiBDT05GSUdfUVVPVEEKQEAgLTE2NjQsMTAgKzE2MTEsMTAgQEAKICoqIHRoZSBjdXJyZW50IG51bWJlciBvZiBub2RlcyBpcyA+IG1heCwgdGhlIG5vZGUgaXMgZnJlZWQsIG90aGVyd2lzZSwgCiAqKiBpdCBpcyBwdXQgb24gYSBmcmVlIGxpc3QgZm9yIGZhc3RlciB1c2UgbGF0ZXIuCiAqLwotI2RlZmluZSBSRUlTRVJGU19NSU5fQklUTUFQX05PREVTIDEwIAotI2RlZmluZSBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTIDEwMCAKKyNkZWZpbmUgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUyAxMAorI2RlZmluZSBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTIDEwMAogCi0jZGVmaW5lIEpCSF9IQVNIX1NISUZUIDEzIC8qIHRoZXNlIGFyZSBiYXNlZCBvbiBqb3VybmFsIGhhc2ggc2l6ZSBvZiA4MTkyICovCisjZGVmaW5lIEpCSF9IQVNIX1NISUZUIDEzCS8qIHRoZXNlIGFyZSBiYXNlZCBvbiBqb3VybmFsIGhhc2ggc2l6ZSBvZiA4MTkyICovCiAjZGVmaW5lIEpCSF9IQVNIX01BU0sgODE5MQogCiAjZGVmaW5lIF9qaGFzaGZuKHNiLGJsb2NrKQlcCkBAIC0xNjgxLDE0ICsxNjI4LDE0IEBACiAjZGVmaW5lIGpvdXJuYWxfYnJlYWQocywgYmxvY2spIF9fYnJlYWQoU0JfSk9VUk5BTChzKS0+al9kZXZfYmQsIGJsb2NrLCBzLT5zX2Jsb2Nrc2l6ZSkKIAogZW51bSByZWlzZXJmc19iaF9zdGF0ZV9iaXRzIHsKLSAgICBCSF9KRGlydHkgPSBCSF9Qcml2YXRlU3RhcnQsIC8qIGJ1ZmZlciBpcyBpbiBjdXJyZW50IHRyYW5zYWN0aW9uICovCi0gICAgQkhfSkRpcnR5X3dhaXQsCi0gICAgQkhfSk5ldywgICAgICAgICAgICAgICAgICAgICAvKiBkaXNrIGJsb2NrIHdhcyB0YWtlbiBvZmYgZnJlZSBsaXN0IGJlZm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVpbmcgaW4gYSBmaW5pc2hlZCB0cmFuc2FjdGlvbiwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXR0ZW4gdG8gZGlzay4gQ2FuIGJlIHJldXNlZCBpbW1lZC4gKi8KLSAgICBCSF9KUHJlcGFyZWQsCi0gICAgQkhfSlJlc3RvcmVfZGlydHksCi0gICAgQkhfSlRlc3QsIC8vIGRlYnVnZ2luZyBvbmx5IHdpbGwgZ28gYXdheQorCUJIX0pEaXJ0eSA9IEJIX1ByaXZhdGVTdGFydCwJLyogYnVmZmVyIGlzIGluIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KKwlCSF9KRGlydHlfd2FpdCwKKwlCSF9KTmV3LAkJLyogZGlzayBibG9jayB3YXMgdGFrZW4gb2ZmIGZyZWUgbGlzdCBiZWZvcmUKKwkJCQkgKiBiZWluZyBpbiBhIGZpbmlzaGVkIHRyYW5zYWN0aW9uLCBvcgorCQkJCSAqIHdyaXR0ZW4gdG8gZGlzay4gQ2FuIGJlIHJldXNlZCBpbW1lZC4gKi8KKwlCSF9KUHJlcGFyZWQsCisJQkhfSlJlc3RvcmVfZGlydHksCisJQkhfSlRlc3QsCQkvLyBkZWJ1Z2dpbmcgb25seSB3aWxsIGdvIGF3YXkKIH07CiAKIEJVRkZFUl9GTlMoSkRpcnR5LCBqb3VybmFsZWQpOwpAQCAtMTcwOCwxNzUgKzE2NTUsMTkyIEBACiAqKiB0cmFuc2FjdGlvbiBoYW5kbGUgd2hpY2ggaXMgcGFzc2VkIGFyb3VuZCBmb3IgYWxsIGpvdXJuYWwgY2FsbHMKICovCiBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICp0X3N1cGVyIDsgLyogc3VwZXIgZm9yIHRoaXMgRlMgd2hlbiBqb3VybmFsX2JlZ2luIHdhcwotCQkJCSAgIGNhbGxlZC4gc2F2ZXMgY2FsbHMgdG8gcmVpc2VyZnNfZ2V0X3N1cGVyCi0JCQkJICAgYWxzbyB1c2VkIGJ5IG5lc3RlZCB0cmFuc2FjdGlvbnMgdG8gbWFrZQotCQkJCSAgIHN1cmUgdGhleSBhcmUgbmVzdGluZyBvbiB0aGUgcmlnaHQgRlMKLQkJCQkgICBfbXVzdF8gYmUgZmlyc3QgaW4gdGhlIGhhbmRsZQotCQkJCSovCi0gIGludCB0X3JlZmNvdW50OwotICBpbnQgdF9ibG9ja3NfbG9nZ2VkIDsgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIHRoaXMgd3JpdGVyIGhhcyBsb2dnZWQgKi8KLSAgaW50IHRfYmxvY2tzX2FsbG9jYXRlZCA7ICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBhbGxvY2F0ZWQgKi8KLSAgdW5zaWduZWQgbG9uZyB0X3RyYW5zX2lkIDsgICAgLyogc2FuaXR5IGNoZWNrLCBlcXVhbHMgdGhlIGN1cnJlbnQgdHJhbnMgaWQgKi8KLSAgdm9pZCAqdF9oYW5kbGVfc2F2ZSA7CQkvKiBzYXZlIGV4aXN0aW5nIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyAqLwotICB1bnNpZ25lZCBkaXNwbGFjZV9uZXdfYmxvY2tzOjE7IC8qIGlmIG5ldyBibG9jayBhbGxvY2F0aW9uIG9jY3VycmVzLCB0aGF0IGJsb2NrCi0JCQkJICAgc2hvdWxkIGJlIGRpc3BsYWNlZCBmcm9tIG90aGVycyAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIHRfbGlzdDsKLX0gOworCXN0cnVjdCBzdXBlcl9ibG9jayAqdF9zdXBlcjsJLyogc3VwZXIgZm9yIHRoaXMgRlMgd2hlbiBqb3VybmFsX2JlZ2luIHdhcworCQkJCQkgICBjYWxsZWQuIHNhdmVzIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9zdXBlcgorCQkJCQkgICBhbHNvIHVzZWQgYnkgbmVzdGVkIHRyYW5zYWN0aW9ucyB0byBtYWtlCisJCQkJCSAgIHN1cmUgdGhleSBhcmUgbmVzdGluZyBvbiB0aGUgcmlnaHQgRlMKKwkJCQkJICAgX211c3RfIGJlIGZpcnN0IGluIHRoZSBoYW5kbGUKKwkJCQkJICovCisJaW50IHRfcmVmY291bnQ7CisJaW50IHRfYmxvY2tzX2xvZ2dlZDsJLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBoYXMgbG9nZ2VkICovCisJaW50IHRfYmxvY2tzX2FsbG9jYXRlZDsJLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBsb25nIHRfdHJhbnNfaWQ7CS8qIHNhbml0eSBjaGVjaywgZXF1YWxzIHRoZSBjdXJyZW50IHRyYW5zIGlkICovCisJdm9pZCAqdF9oYW5kbGVfc2F2ZTsJLyogc2F2ZSBleGlzdGluZyBjdXJyZW50LT5qb3VybmFsX2luZm8gKi8KKwl1bnNpZ25lZCBkaXNwbGFjZV9uZXdfYmxvY2tzOjE7CS8qIGlmIG5ldyBibG9jayBhbGxvY2F0aW9uIG9jY3VycmVzLCB0aGF0IGJsb2NrCisJCQkJCSAgIHNob3VsZCBiZSBkaXNwbGFjZWQgZnJvbSBvdGhlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHRfbGlzdDsKK307CiAKIC8qIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBvcmRlcmVkIGFuZCB0YWlsIHdyaXRlcywgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcgogICogaGVhZCB0aHJvdWdoIGJfam91cm5hbF9oZWFkLgogICovCiBzdHJ1Y3QgcmVpc2VyZnNfamggewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogdm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLWludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgOworaW50IGpvdXJuYWxfbWFya19kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc19maWxlX2RhdGFfbG9nKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBpZiAocmVpc2VyZnNfZGF0YV9sb2coaW5vZGUtPmlfc2IpIHx8Ci0gICAgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9kYXRhX2xvZykpCi0gICAgICAgIHJldHVybiAxIDsKLSAgICByZXR1cm4gMCA7CitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19maWxlX2RhdGFfbG9nKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKHJlaXNlcmZzX2RhdGFfbG9nKGlub2RlLT5pX3NiKSB8fAorCSAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2RhdGFfbG9nKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotICAgIGlmICh0aCAmJiB0aC0+dF9zdXBlciA9PSBzKQotICAgICAgICByZXR1cm4gMSA7Ci0gICAgaWYgKHRoICYmIHRoLT50X3N1cGVyID09IE5VTEwpCi0gICAgICAgIEJVRygpOwotICAgIHJldHVybiAwIDsKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOworCWlmICh0aCAmJiB0aC0+dF9zdXBlciA9PSBzKQorCQlyZXR1cm4gMTsKKwlpZiAodGggJiYgdGgtPnRfc3VwZXIgPT0gTlVMTCkKKwkJQlVHKCk7CisJcmV0dXJuIDA7CiB9CiAKIGludCByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CiAKLXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKgotcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50IGNvdW50KTsKK3N0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0CisJCQkJCQkJCSAgICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICAgKiwKKwkJCQkJCQkJICAgIGludCBjb3VudCk7CiBpbnQgcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqKTsKIGludCByZWlzZXJmc19jb21taXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCQkJIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKIGludCByZWlzZXJmc19mbHVzaF9vbGRfY29tbWl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1pbnQgcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKikgOwotaW50ICByZWlzZXJmc19pbm9kZV9uZWVkc19jb21taXQoc3RydWN0IGlub2RlICopIDsKLXZvaWQgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqKSA7Ci12b2lkIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzKSA7Ci12b2lkIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkgOwotdm9pZCByZWlzZXJmc19hbGxvd193cml0ZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSA7Ci12b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjaGFyICpjYWxsZXIpIDsKLWludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgd2FpdCkgOwotdm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgOwotaW50IGpvdXJuYWxfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqIGpfZGV2X25hbWUsIGludCBvbGRfZm9ybWF0LCB1bnNpZ25lZCBpbnQpIDsKLWludCBqb3VybmFsX3JlbGVhc2Uoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSA7Ci1pbnQgam91cm5hbF9yZWxlYXNlX2Vycm9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgOwotaW50IGpvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpIDsKLWludCBqb3VybmFsX2VuZF9zeW5jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpIDsKLWludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgYl9ibG9ja25yX3QgYmxvY2tucikgOwotaW50IGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIGludCkgOwotaW50IHJlaXNlcmZzX2luX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGludCBibWFwX25yLCBpbnQgYml0X25yLCBpbnQgc2VhcmNoYWxsLCBiX2Jsb2NrbnJfdCAqbmV4dCkgOwotaW50IGpvdXJuYWxfYmVnaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZykgOwotaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nKSA7Ci12b2lkIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubyk7Ci12b2lkIHJlaXNlcmZzX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLWludCByZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKiwgaW50KSA7CitpbnQgcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitpbnQgcmVpc2VyZnNfaW5vZGVfbmVlZHNfY29tbWl0KHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpOwordm9pZCByZWlzZXJmc19hbGxvd193cml0ZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKmNhbGxlcik7CitpbnQgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgaW50IHdhaXQpOwordm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK2ludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKmpfZGV2X25hbWUsIGludCBvbGRfZm9ybWF0LAorCQkgdW5zaWduZWQgaW50KTsKK2ludCBqb3VybmFsX3JlbGVhc2Uoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitpbnQgam91cm5hbF9yZWxlYXNlX2Vycm9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IGpvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCXVuc2lnbmVkIGxvbmcpOworaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJICAgICB1bnNpZ25lZCBsb25nKTsKK2ludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICosIGJfYmxvY2tucl90IGJsb2NrbnIpOworaW50IGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIGludCk7CitpbnQgcmVpc2VyZnNfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGJtYXBfbnIsIGludCBiaXRfbnIsCisJCQlpbnQgc2VhcmNoYWxsLCBiX2Jsb2NrbnJfdCAqIG5leHQpOworaW50IGpvdXJuYWxfYmVnaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nKTsKK2ludCBqb3VybmFsX2pvaW5fYWJvcnQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcpOwordm9pZCByZWlzZXJmc19qb3VybmFsX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubyk7Cit2b2lkIHJlaXNlcmZzX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICosIGludCk7CiAKLXZvaWQgYWRkX3NhdmVfbGluayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqIHRoLAotCQkJCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHRydW5jYXRlKTsKLWludCByZW1vdmVfc2F2ZV9saW5rIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHRydW5jYXRlKTsKK3ZvaWQgYWRkX3NhdmVfbGluayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgc3RydWN0IGlub2RlICppbm9kZSwgaW50IHRydW5jYXRlKTsKK2ludCByZW1vdmVfc2F2ZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0cnVuY2F0ZSk7CiAKIC8qIG9iamVjdGlkLmMgKi8KLV9fdTMyIHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKLXZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIF9fdTMyIG9iamVjdGlkX3RvX3JlbGVhc2UpOwotaW50IHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKHN0cnVjdCBzdXBlcl9ibG9jayAqKSA7CitfX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKTsKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAKIC8qIHN0cmVlLmMgKi8KIGludCBCX0lTX0lOX1RSRUUoY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwotZXh0ZXJuIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqIHBfdl90bywKLQkJCQkJCQkJICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogcF92X2Zyb20pOworZXh0ZXJuIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqcF92X3RvLAorCQkJICAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqcF92X2Zyb20pOwogCiAvLyBmaXJzdCBrZXkgaXMgaW4gY3B1IGZvcm0sIHNlY29uZCAtIGxlCi1leHRlcm4gaW50ICBjb21wX3Nob3J0X2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBsZV9rZXksCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSk7Ci1leHRlcm4gdm9pZCBsZV9rZXkyY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiB0bywgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGZyb20pOworZXh0ZXJuIGludCBjb21wX3Nob3J0X2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqbGVfa2V5LAorCQkJICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpOworZXh0ZXJuIHZvaWQgbGVfa2V5MmNwdV9rZXkoc3RydWN0IGNwdV9rZXkgKnRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKTsKIAogLy8gYm90aCBhcmUgaW4gbGUgZm9ybQotZXh0ZXJuIGludCBjb21wX2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqKTsKLWV4dGVybiBpbnQgY29tcF9zaG9ydF9sZV9rZXlzIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICosIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKik7CitleHRlcm4gaW50IGNvbXBfbGVfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICosCisJCQljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopOworZXh0ZXJuIGludCBjb21wX3Nob3J0X2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqKTsKIAogLy8KIC8vIGdldCBrZXkgdmVyc2lvbiBmcm9tIG9uIGRpc2sga2V5IC0ga2x1ZGdlCiAvLwotc3RhdGljIGlubGluZSBpbnQgbGVfa2V5X3ZlcnNpb24gKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGludCBsZV9rZXlfdmVyc2lvbihjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgaW50IHR5cGU7Ci0gICAgCi0gICAgdHlwZSA9IG9mZnNldF92Ml9rX3R5cGUoICYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7Ci0gICAgaWYgKHR5cGUgIT0gVFlQRV9ESVJFQ1QgJiYgdHlwZSAhPSBUWVBFX0lORElSRUNUICYmIHR5cGUgIT0gVFlQRV9ESVJFTlRSWSkKLQlyZXR1cm4gS0VZX0ZPUk1BVF8zXzU7CisJaW50IHR5cGU7CiAKLSAgICByZXR1cm4gS0VZX0ZPUk1BVF8zXzY7Ci0JCisJdHlwZSA9IG9mZnNldF92Ml9rX3R5cGUoJihrZXktPnUua19vZmZzZXRfdjIpKTsKKwlpZiAodHlwZSAhPSBUWVBFX0RJUkVDVCAmJiB0eXBlICE9IFRZUEVfSU5ESVJFQ1QKKwkgICAgJiYgdHlwZSAhPSBUWVBFX0RJUkVOVFJZKQorCQlyZXR1cm4gS0VZX0ZPUk1BVF8zXzU7CisKKwlyZXR1cm4gS0VZX0ZPUk1BVF8zXzY7CisKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV9rZXkgKHN0cnVjdCByZWlzZXJmc19rZXkgKnRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfa2V5KHN0cnVjdCByZWlzZXJmc19rZXkgKnRvLAorCQkJICAgIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmZyb20pCiB7Ci0gICAgbWVtY3B5ICh0bywgZnJvbSwgS0VZX1NJWkUpOworCW1lbWNweSh0bywgZnJvbSwgS0VZX1NJWkUpOwogfQogCi0KLWludCBjb21wX2l0ZW1zIChjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoKTsKLWNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBnZXRfcmtleSAoY29uc3Qgc3RydWN0IHBhdGggKiBwX3NfY2hrX3BhdGgsCi0JCQkJCQkJIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IpOwotaW50IHNlYXJjaF9ieV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqLCAKLQkJCQkgICBzdHJ1Y3QgcGF0aCAqLCBpbnQpOworaW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgpOworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZ2V0X3JrZXkoY29uc3Qgc3RydWN0IHBhdGggKnBfc19jaGtfcGF0aCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpOworaW50IHNlYXJjaF9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosCisJCSAgc3RydWN0IHBhdGggKiwgaW50KTsKICNkZWZpbmUgc2VhcmNoX2l0ZW0ocyxrZXkscGF0aCkgc2VhcmNoX2J5X2tleSAocywga2V5LCBwYXRoLCBESVNLX0xFQUZfTk9ERV9MRVZFTCkKLWludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiLCAKLQkJCQkJCQkJY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBwX3NfY3B1X2tleSwgCi0JCQkJCQkJCXN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoKTsKLWV4dGVybiB2b2lkIGRlY3JlbWVudF9iY291bnQgKHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCk7Ci12b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoIChzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aCk7Ci12b2lkIHBhdGhyZWxzZSAoc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgpOwotaW50IHJlaXNlcmZzX2NoZWNrX3BhdGgoc3RydWN0IHBhdGggKnApIDsKLXZvaWQgcGF0aHJlbHNlX2FuZF9yZXN0b3JlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoKTsKK2ludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2NwdV9rZXksCisJCQkgICAgICAgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7CitleHRlcm4gdm9pZCBkZWNyZW1lbnRfYmNvdW50KHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKTsKK3ZvaWQgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7Cit2b2lkIHBhdGhyZWxzZShzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKK2ludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKTsKK3ZvaWQgcGF0aHJlbHNlX2FuZF9yZXN0b3JlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7CiAKLWludCByZWlzZXJmc19pbnNlcnRfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICBzdHJ1Y3QgcGF0aCAqIHBhdGgsIAotCQkJICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKLQkJCSAgc3RydWN0IGl0ZW1faGVhZCAqIGloLAotCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICogYm9keSk7CitpbnQgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSBzdHJ1Y3QgaXRlbV9oZWFkICppaCwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpib2R5KTsKIAotaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICAgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKLQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBjb25zdCBjaGFyICogYm9keSwgaW50IHBhc3RlX3NpemUpOworaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJvZHksIGludCBwYXN0ZV9zaXplKTsKIAotaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgIHN0cnVjdCBwYXRoICogcGF0aCwKLQkJCSAgICBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCSAgICBsb2ZmX3QgbmV3X2ZpbGVfc2l6ZSk7CitpbnQgcmVpc2VyZnNfY3V0X2Zyb21faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJICAgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IG5ld19maWxlX3NpemUpOwogCi1pbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICBzdHJ1Y3QgcGF0aCAqIHBhdGgsIAotCQkJICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKLQkJCSAgc3RydWN0IGlub2RlICogaW5vZGUsIAotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3VuX2JoKTsKK2ludCByZWlzZXJmc19kZWxldGVfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3VuX2JoKTsKIAotdm9pZCByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KTsKLWludCByZWlzZXJmc19kZWxldGVfb2JqZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogcF9zX2lub2RlKTsKLWludCByZWlzZXJmc19kb190cnVuY2F0ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICBzdHJ1Y3QgIGlub2RlICogcF9zX2lub2RlLCBzdHJ1Y3QgcGFnZSAqLCAKLQkJCSAgIGludCB1cGRhdGVfdGltZXN0YW1wcyk7Cit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSk7CitpbnQgcmVpc2VyZnNfZGVsZXRlX29iamVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlKTsKK2ludCByZWlzZXJmc19kb190cnVuY2F0ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKiwKKwkJCSBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpOwogCiAjZGVmaW5lIGlfYmxvY2tfc2l6ZShpbm9kZSkgKChpbm9kZSktPmlfc2ItPnNfYmxvY2tzaXplKQogI2RlZmluZSBmaWxlX3NpemUoaW5vZGUpICgoaW5vZGUpLT5pX3NpemUpCkBAIC0xODg1LDY2ICsxODQ5LDY3IEBACiAjZGVmaW5lIHRhaWxfaGFzX3RvX2JlX3BhY2tlZChpbm9kZSkgKGhhdmVfbGFyZ2VfdGFpbHMgKChpbm9kZSktPmlfc2IpP1wKICFTVE9SRV9UQUlMX0lOX1VORk1fUzEoZmlsZV9zaXplIChpbm9kZSksIHRhaWxfc2l6ZShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk6aGF2ZV9zbWFsbF90YWlscyAoKGlub2RlKS0+aV9zYik/IVNUT1JFX1RBSUxfSU5fVU5GTV9TMihmaWxlX3NpemUgKGlub2RlKSwgdGFpbF9zaXplKGlub2RlKSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTowICkKIAotdm9pZCBwYWRkX2l0ZW0gKGNoYXIgKiBpdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKTsKK3ZvaWQgcGFkZF9pdGVtKGNoYXIgKml0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpOwogCiAvKiBpbm9kZS5jICovCiAvKiBhcmdzIGZvciB0aGUgY3JlYXRlIHBhcmFtZXRlciBvZiByZWlzZXJmc19nZXRfYmxvY2sgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX05PX0NSRUFURSAwIC8qIGRvbid0IGNyZWF0ZSBuZXcgYmxvY2tzIG9yIGNvbnZlcnQgdGFpbHMgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX0NSRUFURSAxICAgIC8qIGFkZCBhbnl0aGluZyB5b3UgbmVlZCB0byBmaW5kIGJsb2NrICovCi0jZGVmaW5lIEdFVF9CTE9DS19OT19IT0xFIDIgICAvKiByZXR1cm4gLUVOT0VOVCBmb3IgZmlsZSBob2xlcyAqLwotI2RlZmluZSBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QgNCAgLyogcmVhZCB0aGUgdGFpbCBpZiBpbmRpcmVjdCBpdGVtIG5vdCBmb3VuZCAqLwotI2RlZmluZSBHRVRfQkxPQ0tfTk9fSVNFTSAgICAgOCAvKiBpX3NlbSBpcyBub3QgaGVsZCwgZG9uJ3QgcHJlYWxsb2NhdGUgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX05PX0RBTkdMRSAgIDE2IC8qIGRvbid0IGxlYXZlIGFueSB0cmFuc2FjdGlvbnMgcnVubmluZyAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fQ1JFQVRFIDAJLyogZG9uJ3QgY3JlYXRlIG5ldyBibG9ja3Mgb3IgY29udmVydCB0YWlscyAqLworI2RlZmluZSBHRVRfQkxPQ0tfQ1JFQVRFIDEJLyogYWRkIGFueXRoaW5nIHlvdSBuZWVkIHRvIGZpbmQgYmxvY2sgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX05PX0hPTEUgMgkvKiByZXR1cm4gLUVOT0VOVCBmb3IgZmlsZSBob2xlcyAqLworI2RlZmluZSBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QgNAkvKiByZWFkIHRoZSB0YWlsIGlmIGluZGlyZWN0IGl0ZW0gbm90IGZvdW5kICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19JU0VNICAgICA4CS8qIGlfc2VtIGlzIG5vdCBoZWxkLCBkb24ndCBwcmVhbGxvY2F0ZSAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fREFOR0xFICAgMTYJLyogZG9uJ3QgbGVhdmUgYW55IHRyYW5zYWN0aW9ucyBydW5uaW5nICovCiAKLWludCByZXN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCk7Ci12b2lkIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKSA7Ci1pbnQgcmVpc2VyZnNfZmluZF9hY3RvcihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdm9pZCAqcCkgOwotaW50IHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB2b2lkICpwKSA7Ci12b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpOwotaW50IHJlaXNlcmZzX3dyaXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50KSA7Ci1pbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7Ci1zdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICopIDsKLXN0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2RlY29kZV9maChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgZmh0eXBlLAotCQkJCSAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGVjdCwgc3RydWN0IGRlbnRyeSAqZGUpLAotCQkJCSAgdm9pZCAqY29udGV4dCkgOwotaW50IHJlaXNlcmZzX2VuY29kZV9maCggc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZGF0YSwgaW50ICpsZW5wLCAKLQkJCQkJCWludCBjb25uZWN0YWJsZSApOworaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCk7Cit2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncyk7CitpbnQgcmVpc2VyZnNfZmluZF9hY3RvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpwKTsKK2ludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpwKTsKK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IHJlaXNlcmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCk7CitpbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKTsKK3N0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2RlY29kZV9maChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqIGRhdGEsCisJCQkJICBpbnQgbGVuLCBpbnQgZmh0eXBlLAorCQkJCSAgaW50ICgqYWNjZXB0YWJsZSkgKHZvaWQgKmNvbnRlY3QsCisJCQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKiBkZSksCisJCQkJICB2b2lkICpjb250ZXh0KTsKK2ludCByZWlzZXJmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqIGRhdGEsIGludCAqbGVucCwKKwkJICAgICAgIGludCBjb25uZWN0YWJsZSk7CiAKLWludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpIDsKLXZvaWQgbWFrZV9jcHVfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGNwdV9rZXksIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAotCQkgICBpbnQgdHlwZSwgaW50IGtleV9sZW5ndGgpOwotdm9pZCBtYWtlX2xlX2l0ZW1faGVhZCAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwgCi0JCQlpbnQgdmVyc2lvbiwKLQkJCWxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLCBpbnQgZW50cnlfY291bnQpOwotc3RydWN0IGlub2RlICogcmVpc2VyZnNfaWdldCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSk7CitpbnQgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHVwZGF0ZV90aW1lc3RhbXBzKTsKK3ZvaWQgbWFrZV9jcHVfa2V5KHN0cnVjdCBjcHVfa2V5ICpjcHVfa2V5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCB0eXBlLCBpbnQga2V5X2xlbmd0aCk7Cit2b2lkIG1ha2VfbGVfaXRlbV9oZWFkKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkgICAgICAgaW50IHZlcnNpb24sCisJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCwgaW50IGVudHJ5X2NvdW50KTsKK3N0cnVjdCBpbm9kZSAqcmVpc2VyZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXkpOwogCitpbnQgcmVpc2VyZnNfbmV3X2lub2RlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlLAorCQkgICAgICAgY29uc3QgY2hhciAqc3ltbmFtZSwgbG9mZl90IGlfc2l6ZSwKKwkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSk7CiAKLWludCByZWlzZXJmc19uZXdfaW5vZGUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlLCAKLQkJCQkgICBjb25zdCBjaGFyICogc3ltbmFtZSwgbG9mZl90IGlfc2l6ZSwKLQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotCi12b2lkIHJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgc2l6ZSk7Cit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc191cGRhdGVfc2Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCisJCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZSh0aCwgaW5vZGUsIGlub2RlLT5pX3NpemUpIDsKKwlyZWlzZXJmc191cGRhdGVfc2Rfc2l6ZSh0aCwgaW5vZGUsIGlub2RlLT5pX3NpemUpOwogfQogCi12b2lkIHNkX2F0dHJzX3RvX2lfYXR0cnMoIF9fdTE2IHNkX2F0dHJzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlICk7Ci12b2lkIGlfYXR0cnNfdG9fc2RfYXR0cnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTE2ICpzZF9hdHRycyApOwordm9pZCBzZF9hdHRyc190b19pX2F0dHJzKF9fdTE2IHNkX2F0dHJzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgaV9hdHRyc190b19zZF9hdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UxNiAqIHNkX2F0dHJzKTsKIGludCByZWlzZXJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKIAogLyogbmFtZWkuYyAqLwotdm9pZCBzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKTsKLWludCBzZWFyY2hfYnlfZW50cnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksIAotCQkJIHN0cnVjdCBwYXRoICogcGF0aCwgCi0JCQkgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKTsKLXN0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKSA7Cit2b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKTsKK2ludCBzZWFyY2hfYnlfZW50cnlfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQlzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICopOwogLyogcHJvY2ZzLmMgKi8KIAogI2lmIGRlZmluZWQoIENPTkZJR19QUk9DX0ZTICkgJiYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyApCkBAIC0xOTUzLDE1ICsxOTE4LDE1IEBACiAjdW5kZWYgUkVJU0VSRlNfUFJPQ19JTkZPCiAjZW5kaWYKIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICk7Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgKTsKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoIGNoYXIgKm5hbWUsIAotCQkJCQkJCQkJCQkJCSAgcmVhZF9wcm9jX3QgKmZ1bmMgKTsKLXZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApOwotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCggdm9pZCApOwotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSggdm9pZCApOwotaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkJCQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApOworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbChjaGFyICpuYW1lLAorCQkJCQkJICAgICByZWFkX3Byb2NfdCAqIGZ1bmMpOwordm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKTsKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUodm9pZCk7CitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIAogI2lmIGRlZmluZWQoIFJFSVNFUkZTX1BST0NfSU5GTyApCiAKQEAgLTE5OTMsMTIzICsxOTU4LDEzMiBAQAogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX29wZXJhdGlvbnM7CiAKIC8qIHRhaWxfY29udmVyc2lvbi5jICovCi1pbnQgZGlyZWN0MmluZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgbG9mZl90KTsKLWludCBpbmRpcmVjdDJkaXJlY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICosIHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosIGxvZmZfdCwgY2hhciAqKTsKLXZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqKSA7Ci0KK2ludCBkaXJlY3QyaW5kaXJlY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgIHN0cnVjdCBwYXRoICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBsb2ZmX3QpOworaW50IGluZGlyZWN0MmRpcmVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBpbm9kZSAqLAorCQkgICAgc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwKKwkJICAgIGxvZmZfdCwgY2hhciAqKTsKK3ZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIAogLyogZmlsZS5jICovCiBleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zOwotZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKIAogLyogZml4X25vZGVzLmMgKi8KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLXZvaWQgKiByZWlzZXJmc19rbWFsbG9jIChzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKLXZvaWQgcmVpc2VyZnNfa2ZyZWUgKGNvbnN0IHZvaWQgKiB2cCwgc2l6ZV90IHNpemUsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpOwordm9pZCAqcmVpc2VyZnNfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCByZWlzZXJmc19rZnJlZShjb25zdCB2b2lkICp2cCwgc2l6ZV90IHNpemUsIHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkICpyZWlzZXJmc19rbWFsbG9jKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsCi0JCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqcykKKwkJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19rZnJlZShjb25zdCB2b2lkICp2cCwgc2l6ZV90IHNpemUsCi0JCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqcykKKwkJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlrZnJlZSh2cCk7CiB9CiAjZW5kaWYKIAotaW50IGZpeF9ub2RlcyAoaW50IG5fb3BfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwgCi0JICAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwX3NfaW5zX2loLCBjb25zdCB2b2lkICopOwotdm9pZCB1bmZpeF9ub2RlcyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqKTsKLQoraW50IGZpeF9ub2RlcyhpbnQgbl9vcF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsCisJICAgICAgc3RydWN0IGl0ZW1faGVhZCAqcF9zX2luc19paCwgY29uc3Qgdm9pZCAqKTsKK3ZvaWQgdW5maXhfbm9kZXMoc3RydWN0IHRyZWVfYmFsYW5jZSAqKTsKIAogLyogcHJpbnRzLmMgKi8KLXZvaWQgcmVpc2VyZnNfcGFuaWMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoICggbm9yZXR1cm4gKSApOwotdm9pZCByZWlzZXJmc19pbmZvIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Ci12b2lkIHJlaXNlcmZzX2RlYnVnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKTsKLXZvaWQgcHJpbnRfaW5kaXJlY3RfaXRlbSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBpdGVtX251bSk7Ci12b2lkIHN0b3JlX3ByaW50X3RiIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpOwotdm9pZCBwcmludF9jdXJfdGIgKGNoYXIgKiBtZXMpOwotdm9pZCBwcmludF9kZSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKTsKLXZvaWQgcHJpbnRfYmkgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBjaGFyICogbWVzKTsKLSNkZWZpbmUgUFJJTlRfTEVBRl9JVEVNUyAxICAgLyogcHJpbnQgYWxsIGl0ZW1zICovCi0jZGVmaW5lIFBSSU5UX0RJUkVDVE9SWV9JVEVNUyAyIC8qIHByaW50IGRpcmVjdG9yeSBpdGVtcyAqLwotI2RlZmluZSBQUklOVF9ESVJFQ1RfSVRFTVMgNCAvKiBwcmludCBjb250ZW50cyBvZiBkaXJlY3QgaXRlbXMgKi8KLXZvaWQgcHJpbnRfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAuLi4pOwotdm9pZCBwcmludF9ibWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgc2lsZW50KTsKLXZvaWQgcHJpbnRfYm1hcF9ibG9jayAoaW50IGksIGNoYXIgKiBkYXRhLCBpbnQgc2l6ZSwgaW50IHNpbGVudCk7Cit2b2lkIHJlaXNlcmZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Cit2b2lkIHJlaXNlcmZzX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIHJlaXNlcmZzX2RlYnVnKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIHByaW50X2luZGlyZWN0X2l0ZW0oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGl0ZW1fbnVtKTsKK3ZvaWQgc3RvcmVfcHJpbnRfdGIoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpOwordm9pZCBwcmludF9jdXJfdGIoY2hhciAqbWVzKTsKK3ZvaWQgcHJpbnRfZGUoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOwordm9pZCBwcmludF9iaShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLCBjaGFyICptZXMpOworI2RlZmluZSBQUklOVF9MRUFGX0lURU1TIDEJLyogcHJpbnQgYWxsIGl0ZW1zICovCisjZGVmaW5lIFBSSU5UX0RJUkVDVE9SWV9JVEVNUyAyCS8qIHByaW50IGRpcmVjdG9yeSBpdGVtcyAqLworI2RlZmluZSBQUklOVF9ESVJFQ1RfSVRFTVMgNAkvKiBwcmludCBjb250ZW50cyBvZiBkaXJlY3QgaXRlbXMgKi8KK3ZvaWQgcHJpbnRfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgLi4uKTsKK3ZvaWQgcHJpbnRfYm1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBzaWxlbnQpOwordm9pZCBwcmludF9ibWFwX2Jsb2NrKGludCBpLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSwgaW50IHNpbGVudCk7CiAvKnZvaWQgcHJpbnRfc3VwZXJfYmxvY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGNoYXIgKiBtZXMpOyovCi12b2lkIHByaW50X29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcyk7Ci12b2lkIHByaW50X2Jsb2NrX2hlYWQgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBjaGFyICogbWVzKTsKLXZvaWQgY2hlY2tfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpOwotdm9pZCBjaGVja19pbnRlcm5hbCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpOwotdm9pZCBwcmludF9zdGF0aXN0aWNzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKLWNoYXIgKiByZWlzZXJmc19oYXNobmFtZShpbnQgY29kZSk7Cit2b2lkIHByaW50X29iamVjdGlkX21hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCBwcmludF9ibG9ja19oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGNoYXIgKm1lcyk7Cit2b2lkIGNoZWNrX2xlYWYoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Cit2b2lkIGNoZWNrX2ludGVybmFsKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBwcmludF9zdGF0aXN0aWNzKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CitjaGFyICpyZWlzZXJmc19oYXNobmFtZShpbnQgY29kZSk7CiAKIC8qIGxiYWxhbmNlLmMgKi8KLWludCBsZWFmX21vdmVfaXRlbXMgKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBtb3ZfbnVtLCBpbnQgbW92X2J5dGVzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTbmV3KTsKLWludCBsZWFmX3NoaWZ0X2xlZnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKTsKLWludCBsZWFmX3NoaWZ0X3JpZ2h0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBzaGlmdF9udW0sIGludCBzaGlmdF9ieXRlcyk7Ci12b2lkIGxlYWZfZGVsZXRlX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIGludCBsYXN0X2ZpcnN0LCBpbnQgZmlyc3QsIGludCBkZWxfbnVtLCBpbnQgZGVsX2J5dGVzKTsKLXZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYmVmb3JlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRlZF9pdGVtX2loLCBjb25zdCBjaGFyICogaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKTsKLXZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgcGFzdGVkX2l0ZW1fbnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfaW5faXRlbSwgaW50IHBhc3RlX3NpemUsIGNvbnN0IGNoYXIgKiBib2R5LCBpbnQgemVyb3NfbnVtYmVyKTsKLXZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgY3V0X2l0ZW1fbnVtLCBpbnQgcG9zX2luX2l0ZW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1dF9zaXplKTsKLXZvaWQgbGVhZl9wYXN0ZV9lbnRyaWVzIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGl0ZW1fbnVtLCBpbnQgYmVmb3JlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2VudHJ5X2NvdW50LCBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIG5ld19kZWhzLCBjb25zdCBjaGFyICogcmVjb3JkcywgaW50IHBhc3RlX3NpemUpOworaW50IGxlYWZfbW92ZV9pdGVtcyhpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBtb3ZfbnVtLAorCQkgICAgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpTbmV3KTsKK2ludCBsZWFmX3NoaWZ0X2xlZnQoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBzaGlmdF9udW0sIGludCBzaGlmdF9ieXRlcyk7CitpbnQgbGVhZl9zaGlmdF9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKTsKK3ZvaWQgbGVhZl9kZWxldGVfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksIGludCBsYXN0X2ZpcnN0LCBpbnQgZmlyc3QsCisJCSAgICAgICBpbnQgZGVsX251bSwgaW50IGRlbF9ieXRlcyk7Cit2b2lkIGxlYWZfaW5zZXJ0X2ludG9fYnVmKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBiZWZvcmUsCisJCQkgIHN0cnVjdCBpdGVtX2hlYWQgKmluc2VydGVkX2l0ZW1faWgsCisJCQkgIGNvbnN0IGNoYXIgKmluc2VydGVkX2l0ZW1fYm9keSwgaW50IHplcm9zX251bWJlcik7Cit2b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBwYXN0ZWRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IHBhc3RlX3NpemUsIGNvbnN0IGNoYXIgKmJvZHksCisJCQkgIGludCB6ZXJvc19udW1iZXIpOwordm9pZCBsZWFmX2N1dF9mcm9tX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLCBpbnQgY3V0X2l0ZW1fbnVtLAorCQkJICBpbnQgcG9zX2luX2l0ZW0sIGludCBjdXRfc2l6ZSk7Cit2b2lkIGxlYWZfcGFzdGVfZW50cmllcyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgaXRlbV9udW0sIGludCBiZWZvcmUsCisJCQlpbnQgbmV3X2VudHJ5X2NvdW50LCBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqbmV3X2RlaHMsCisJCQljb25zdCBjaGFyICpyZWNvcmRzLCBpbnQgcGFzdGVfc2l6ZSk7CiAvKiBpYmFsYW5jZS5jICovCi1pbnQgYmFsYW5jZV9pbnRlcm5hbCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqICwgaW50LCBpbnQsIHN0cnVjdCBpdGVtX2hlYWQgKiAsIAotICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitpbnQgYmFsYW5jZV9pbnRlcm5hbChzdHJ1Y3QgdHJlZV9iYWxhbmNlICosIGludCwgaW50LCBzdHJ1Y3QgaXRlbV9oZWFkICosCisJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIAogLyogZG9fYmFsYW5jZS5jICovCi12b2lkIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgZmxhZyk7Cit2b2lkIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBmbGFnKTsKICNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CiAjZGVmaW5lIGRvX2JhbGFuY2VfbWFya19zYl9kaXJ0eSBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eQogCi12b2lkIGRvX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGl0ZW1faGVhZCAqIGloLCAKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJvZHksIGludCBmbGFnKTsKLXZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpOwordm9pZCBkb19iYWxhbmNlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgaXRlbV9oZWFkICppaCwKKwkJY29uc3QgY2hhciAqYm9keSwgaW50IGZsYWcpOwordm9pZCByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotaW50IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKTsKLWludCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpOwotdm9pZCByZXBsYWNlX2tleSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKLXZvaWQgbWFrZV9lbXB0eV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2luZm8gKik7Ci1zdHJ1Y3QgYnVmZmVyX2hlYWQgKiBnZXRfRkVCIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICopOworaW50IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCk7CitpbnQgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCk7Cit2b2lkIHJlcGxhY2Vfa2V5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50LAorCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Cit2b2lkIG1ha2VfZW1wdHlfbm9kZShzdHJ1Y3QgYnVmZmVyX2luZm8gKik7CitzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdldF9GRUIoc3RydWN0IHRyZWVfYmFsYW5jZSAqKTsKIAogLyogYml0bWFwLmMgKi8KIAogLyogc3RydWN0dXJlIGNvbnRhaW5zIGhpbnRzIGZvciBibG9jayBhbGxvY2F0b3IsIGFuZCBpdCBpcyBhIGNvbnRhaW5lciBmb3IKICAqIGFyZ3VtZW50cywgc3VjaCBhcyBub2RlLCBzZWFyY2ggcGF0aCwgdHJhbnNhY3Rpb25faGFuZGxlLCBldGMuICovCi0gc3RydWN0IF9fcmVpc2VyZnNfYmxvY2tucl9oaW50IHsKLSAgICAgc3RydWN0IGlub2RlICogaW5vZGU7CQkvKiBpbm9kZSBwYXNzZWQgdG8gYWxsb2NhdG9yLCBpZiB3ZSBhbGxvY2F0ZSB1bmYuIG5vZGVzICovCi0gICAgIGxvbmcgYmxvY2s7CQkJLyogZmlsZSBvZmZzZXQsIGluIGJsb2NrcyAqLwotICAgICBzdHJ1Y3QgaW5fY29yZV9rZXkga2V5OwotICAgICBzdHJ1Y3QgcGF0aCAqIHBhdGg7CQkvKiBzZWFyY2ggcGF0aCwgdXNlZCBieSBhbGxvY2F0b3IgdG8gZGV0ZXJuaW5lIHNlYXJjaF9zdGFydCBieQotCQkJCQkgKiB2YXJpb3VzIHdheXMgKi8KLSAgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqIHRoOyAvKiB0cmFuc2FjdGlvbiBoYW5kbGUgaXMgbmVlZGVkIHRvIGxvZyBzdXBlciBibG9ja3MgYW5kCi0JCQkJCSAgICAgICAqIGJpdG1hcCBibG9ja3MgY2hhbmdlcyAgKi8KLSAgICAgYl9ibG9ja25yX3QgYmVnLCBlbmQ7Ci0gICAgIGJfYmxvY2tucl90IHNlYXJjaF9zdGFydDsJCS8qIGEgZmllbGQgdXNlZCB0byB0cmFuc2ZlciBzZWFyY2ggc3RhcnQgdmFsdWUgKGJsb2NrIG51bWJlcikKK3N0cnVjdCBfX3JlaXNlcmZzX2Jsb2NrbnJfaGludCB7CisJc3RydWN0IGlub2RlICppbm9kZTsJLyogaW5vZGUgcGFzc2VkIHRvIGFsbG9jYXRvciwgaWYgd2UgYWxsb2NhdGUgdW5mLiBub2RlcyAqLworCWxvbmcgYmxvY2s7CQkvKiBmaWxlIG9mZnNldCwgaW4gYmxvY2tzICovCisJc3RydWN0IGluX2NvcmVfa2V5IGtleTsKKwlzdHJ1Y3QgcGF0aCAqcGF0aDsJLyogc2VhcmNoIHBhdGgsIHVzZWQgYnkgYWxsb2NhdG9yIHRvIGRldGVybmluZSBzZWFyY2hfc3RhcnQgYnkKKwkJCQkgKiB2YXJpb3VzIHdheXMgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsJLyogdHJhbnNhY3Rpb24gaGFuZGxlIGlzIG5lZWRlZCB0byBsb2cgc3VwZXIgYmxvY2tzIGFuZAorCQkJCQkJICogYml0bWFwIGJsb2NrcyBjaGFuZ2VzICAqLworCWJfYmxvY2tucl90IGJlZywgZW5kOworCWJfYmxvY2tucl90IHNlYXJjaF9zdGFydDsJLyogYSBmaWVsZCB1c2VkIHRvIHRyYW5zZmVyIHNlYXJjaCBzdGFydCB2YWx1ZSAoYmxvY2sgbnVtYmVyKQogCQkJCQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBibG9jayBhbGxvY2F0b3IgcHJvY2VkdXJlcwogCQkJCQkgKiAoZGV0ZXJtaW5lX3NlYXJjaF9zdGFydCgpIGFuZCBvdGhlcnMpICovCi0gICAgaW50IHByZWFsbG9jX3NpemU7CQkJLyogaXMgc2V0IGluIGRldGVybWluZV9wcmVhbGxvY19zaXplKCkgZnVuY3Rpb24sIHVzZWQgYnkgdW5kZXJsYXllZAotCQkJCQkgKiBmdW5jdGlvbiB0aGF0IGRvIGFjdHVhbCBhbGxvY2F0aW9uICovCisJaW50IHByZWFsbG9jX3NpemU7CS8qIGlzIHNldCBpbiBkZXRlcm1pbmVfcHJlYWxsb2Nfc2l6ZSgpIGZ1bmN0aW9uLCB1c2VkIGJ5IHVuZGVybGF5ZWQKKwkJCQkgKiBmdW5jdGlvbiB0aGF0IGRvIGFjdHVhbCBhbGxvY2F0aW9uICovCiAKLSAgICB1bnNpZ25lZCBmb3JtYXR0ZWRfbm9kZToxOwkJLyogdGhlIGFsbG9jYXRvciB1c2VzIGRpZmZlcmVudCBwb2xpY2VzIGZvciBnZXR0aW5nIGRpc2sgc3BhY2UgZm9yCisJdW5zaWduZWQgZm9ybWF0dGVkX25vZGU6MTsJLyogdGhlIGFsbG9jYXRvciB1c2VzIGRpZmZlcmVudCBwb2xpY2VzIGZvciBnZXR0aW5nIGRpc2sgc3BhY2UgZm9yCiAJCQkJCSAqIGZvcm1hdHRlZC91bmZvcm1hdHRlZCBibG9ja3Mgd2l0aC93aXRob3V0IHByZWFsbG9jYXRpb24gKi8KLSAgICB1bnNpZ25lZCBwcmVhbGxvY2F0ZToxOworCXVuc2lnbmVkIHByZWFsbG9jYXRlOjE7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfX3JlaXNlcmZzX2Jsb2NrbnJfaGludCByZWlzZXJmc19ibG9ja25yX2hpbnRfdDsKIAotaW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjaGFyICopOwotdm9pZCByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CitpbnQgcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqKTsKK3ZvaWQgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CiAKIC8qCiAgKiBnaXZlbiBhIGRpcmVjdG9yeSwgdGhpcyB3aWxsIHRlbGwgeW91IHdoYXQgcGFja2luZyBsb2NhbGl0eQpAQCAtMjExOCw2OCArMjA5Miw3MiBAQAogICovCiBfX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICpkaXIpOwogCi1pbnQgaXNfcmV1c2FibGUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgYml0X3ZhbHVlKTsKLXZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqLCBiX2Jsb2NrbnJfdCwgaW50IGZvcl91bmZvcm1hdHRlZCk7Ci1pbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiwgYl9ibG9ja25yX3QgKiAsIGludCwgaW50KTsKLWV4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCQkJCSAgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQoraW50IGlzX3JldXNhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpOwordm9pZCByZWlzZXJmc19mcmVlX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCSBiX2Jsb2NrbnJfdCwgaW50IGZvcl91bmZvcm1hdHRlZCk7CitpbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiwgYl9ibG9ja25yX3QgKiwgaW50LAorCQkJICAgICAgIGludCk7CitleHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkJICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKKwkJCQkJICAgICBpbnQgYW1vdW50X25lZWRlZCkKIHsKLSAgICByZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0gewotCS50aCA9IHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsCi0JLnBhdGggPSB0Yi0+dGJfcGF0aCwKLQkuaW5vZGUgPSBOVUxMLAotCS5rZXkgPSB0Yi0+a2V5LAotCS5ibG9jayA9IDAsCi0JLmZvcm1hdHRlZF9ub2RlID0gMQotICAgIH07Ci0gICAgcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQsIDApOworCXJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7CisJCS50aCA9IHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsCisJCS5wYXRoID0gdGItPnRiX3BhdGgsCisJCS5pbm9kZSA9IE5VTEwsCisJCS5rZXkgPSB0Yi0+a2V5LAorCQkuYmxvY2sgPSAwLAorCQkuZm9ybWF0dGVkX25vZGUgPSAxCisJfTsKKwlyZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCwKKwkJCQkJICAwKTsKIH0KIAotZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgICBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLAotCQkJCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgbG9uZyBibG9jaykKK2V4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQorCQkJCQkgICAgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKIHsKLSAgICByZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0gewotCS50aCA9IHRoLAotCS5wYXRoID0gcGF0aCwKLQkuaW5vZGUgPSBpbm9kZSwKLQkuYmxvY2sgPSBibG9jaywKLQkuZm9ybWF0dGVkX25vZGUgPSAwLAotCS5wcmVhbGxvY2F0ZSA9IDAKLSAgICB9OwotICAgIHJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCAxLCAwKTsKKwlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0geworCQkudGggPSB0aCwKKwkJLnBhdGggPSBwYXRoLAorCQkuaW5vZGUgPSBpbm9kZSwKKwkJLmJsb2NrID0gYmxvY2ssCisJCS5mb3JtYXR0ZWRfbm9kZSA9IDAsCisJCS5wcmVhbGxvY2F0ZSA9IDAKKwl9OworCXJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCAxLCAwKTsKIH0KIAogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi1leHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCQkJICAgICBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLAotCQkJCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgbG9uZyBibG9jaykKK2V4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKKwkJCQkJICAgICAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICAgc3RydWN0IHBhdGggKnBhdGgsIGxvbmcgYmxvY2spCiB7Ci0gICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKLQkudGggPSB0aCwKLQkucGF0aCA9IHBhdGgsCi0JLmlub2RlID0gaW5vZGUsCi0JLmJsb2NrID0gYmxvY2ssCi0JLmZvcm1hdHRlZF9ub2RlID0gMCwKLQkucHJlYWxsb2NhdGUgPSAxCi0gICAgfTsKLSAgICByZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgMSwgMCk7CisJcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKKwkJLnRoID0gdGgsCisJCS5wYXRoID0gcGF0aCwKKwkJLmlub2RlID0gaW5vZGUsCisJCS5ibG9jayA9IGJsb2NrLAorCQkuZm9ybWF0dGVkX25vZGUgPSAwLAorCQkucHJlYWxsb2NhdGUgPSAxCisJfTsKKwlyZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgMSwgMCk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCXN0cnVjdCBpbm9kZSAqIGlub2RlKTsKLXZvaWQgcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2Moc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpOwogI2VuZGlmCi12b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9ja3MpOwotdm9pZCByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2tzKTsKK3ZvaWQgcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2tzKTsKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2tzKTsKIGludCByZWlzZXJmc19jYW5fZml0X3BhZ2VzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogCiAvKiBoYXNoZXMuYyAqLwotX191MzIga2V5ZWRfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7Ci1fX3UzMiB5dXJhX2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOwotX191MzIgcjVfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CitfX3UzMiBrZXllZF9oYXNoKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOworX191MzIgeXVyYV9oYXNoKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOworX191MzIgcjVfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKIAogLyogdGhlIGV4dDIgYml0IHJvdXRpbmVzIGFkanVzdCBmb3IgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYXMKICoqIGFwcHJvcHJpYXRlIGZvciB0aGUgYXJjaCwgc28gaW4gb3VyIGxhemluZXNzIHdlIHVzZSB0aGVtIHJhdGhlcgpAQCAtMjE5OSwxMSArMjE3NywxMCBAQAogICAgYWJzb2x1dGVseSBzYWZlICovCiAjZGVmaW5lIFNQQVJFX1NQQUNFIDUwMAogCi0KIC8qIHByb3RvdHlwZXMgZnJvbSBpb2N0bC5jICovCi1pbnQgcmVpc2VyZnNfaW9jdGwgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAotIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLSAKK2ludCByZWlzZXJmc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCiAvKiBpb2N0bCdzIGNvbW1hbmQgKi8KICNkZWZpbmUgUkVJU0VSRlNfSU9DX1VOUEFDSwkJX0lPVygweENELDEsbG9uZykKIC8qIGRlZmluZSBmb2xsb3dpbmcgZmxhZ3MgdG8gYmUgdGhlIHNhbWUgYXMgaW4gZXh0Miwgc28gdGhhdCBjaGF0dHIoMSksCkBAIC0yMjE4LDEwICsyMTk1LDggQEAKICAgIHdvdWxkIGV2b2x2ZSBpbnRvIHJlYWwgcGVyLWZzIGxvY2tzICovCiAjZGVmaW5lIHJlaXNlcmZzX3dyaXRlX2xvY2soIHNiICkgbG9ja19rZXJuZWwoKQogI2RlZmluZSByZWlzZXJmc193cml0ZV91bmxvY2soIHNiICkgdW5sb2NrX2tlcm5lbCgpCi0gCQkJICAgICAgICAgCisKIC8qIHhhdHRyIHN0dWZmICovCiAjZGVmaW5lIFJFSVNFUkZTX1hBVFRSX0RJUl9TRU0ocykgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9kaXJfc2VtKQogCi0jZW5kaWYgLyogX0xJTlVYX1JFSVNFUl9GU19IICovCi0KLQorI2VuZGlmCQkJCS8qIF9MSU5VWF9SRUlTRVJfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19pLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX2kuaAppbmRleCBlMzIxZWIwLi4xNDliZThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX2kuaApAQCAtMTAsNTQgKzEwLDUzIEBACiAgICAgLyoqIHRoaXMgc2F5cyB3aGF0IGZvcm1hdCBvZiBrZXkgZG8gYWxsIGl0ZW1zIChidXQgc3RhdCBkYXRhKSBvZgogICAgICAgYW4gb2JqZWN0IGhhdmUuICBJZiB0aGlzIGlzIHNldCwgdGhhdCBmb3JtYXQgaXMgMy42IG90aGVyd2lzZQogICAgICAgLSAzLjUgKi8KLSAgICBpX2l0ZW1fa2V5X3ZlcnNpb25fbWFzayAgICA9ICAweDAwMDEsCisJaV9pdGVtX2tleV92ZXJzaW9uX21hc2sgPSAweDAwMDEsCiAgICAgLyoqIElmIHRoaXMgaXMgdW5zZXQsIG9iamVjdCBoYXMgMy41IHN0YXQgZGF0YSwgb3RoZXJ3aXNlLCBpdCBoYXMKICAgICAgIDMuNiBzdGF0IGRhdGEgd2l0aCA2NGJpdCBzaXplLCAzMmJpdCBubGluayBldGMuICovCi0gICAgaV9zdGF0X2RhdGFfdmVyc2lvbl9tYXNrICAgPSAgMHgwMDAyLAorCWlfc3RhdF9kYXRhX3ZlcnNpb25fbWFzayA9IDB4MDAwMiwKICAgICAvKiogZmlsZSBtaWdodCBuZWVkIHRhaWwgcGFja2luZyBvbiBjbG9zZSAqLwotICAgIGlfcGFja19vbl9jbG9zZV9tYXNrICAgICAgID0gIDB4MDAwNCwKKwlpX3BhY2tfb25fY2xvc2VfbWFzayA9IDB4MDAwNCwKICAgICAvKiogZG9uJ3QgcGFjayB0YWlsIG9mIGZpbGUgKi8KLSAgICBpX25vcGFja19tYXNrICAgICAgICAgICAgICA9ICAweDAwMDgsCisJaV9ub3BhY2tfbWFzayA9IDB4MDAwOCwKICAgICAvKiogSWYgdGhvc2UgaXMgc2V0LCAic2FmZSBsaW5rIiB3YXMgY3JlYXRlZCBmb3IgdGhpcyBmaWxlIGR1cmluZwogICAgICAgdHJ1bmNhdGUgb3IgdW5saW5rLiBTYWZlIGxpbmsgaXMgdXNlZCB0byBhdm9pZCBsZWFrYWdlIG9mIGRpc2sKICAgICAgIHNwYWNlIG9uIGNyYXNoIHdpdGggc29tZSBmaWxlcyBvcGVuLCBidXQgdW5saW5rZWQuICovCi0gICAgaV9saW5rX3NhdmVkX3VubGlua19tYXNrICAgPSAgMHgwMDEwLAotICAgIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrID0gIDB4MDAyMCwKLSAgICBpX2hhc194YXR0cl9kaXIgICAgICAgICAgICA9ICAweDAwNDAsCi0gICAgaV9kYXRhX2xvZwkgICAgICAgICAgICAgICA9ICAweDAwODAsCisJaV9saW5rX3NhdmVkX3VubGlua19tYXNrID0gMHgwMDEwLAorCWlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrID0gMHgwMDIwLAorCWlfaGFzX3hhdHRyX2RpciA9IDB4MDA0MCwKKwlpX2RhdGFfbG9nID0gMHgwMDgwLAogfSByZWlzZXJmc19pbm9kZV9mbGFnczsKIAotCiBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyB7Ci0gICAgX191MzIgaV9rZXkgWzRdOy8qIGtleSBpcyBzdGlsbCA0IDMyIGJpdCBpbnRlZ2VycyAqLworCV9fdTMyIGlfa2V5WzRdOwkJLyoga2V5IGlzIHN0aWxsIDQgMzIgYml0IGludGVnZXJzICovCiAgICAgLyoqIHRyYW5zaWVudCBpbm9kZSBmbGFncyB0aGF0IGFyZSBuZXZlciBzdG9yZWQgb24gZGlzay4gQml0bWFza3MKICAgICAgIGZvciB0aGlzIGZpZWxkIGFyZSBkZWZpbmVkIGFib3ZlLiAqLwotICAgIF9fdTMyIGlfZmxhZ3M7CisJX191MzIgaV9mbGFnczsKIAotICAgIF9fdTMyIGlfZmlyc3RfZGlyZWN0X2J5dGU7IC8vIG9mZnNldCBvZiBmaXJzdCBieXRlIHN0b3JlZCBpbiBkaXJlY3QgaXRlbS4KKwlfX3UzMiBpX2ZpcnN0X2RpcmVjdF9ieXRlOwkvLyBvZmZzZXQgb2YgZmlyc3QgYnl0ZSBzdG9yZWQgaW4gZGlyZWN0IGl0ZW0uCiAKLSAgICAvKiBjb3B5IG9mIHBlcnNpc3RlbnQgaW5vZGUgZmxhZ3MgcmVhZCBmcm9tIHNkX2F0dHJzLiAqLwotICAgIF9fdTMyIGlfYXR0cnM7CisJLyogY29weSBvZiBwZXJzaXN0ZW50IGlub2RlIGZsYWdzIHJlYWQgZnJvbSBzZF9hdHRycy4gKi8KKwlfX3UzMiBpX2F0dHJzOwogCi0gICAgaW50IGlfcHJlYWxsb2NfYmxvY2s7IC8qIGZpcnN0IHVudXNlZCBibG9jayBvZiBhIHNlcXVlbmNlIG9mIHVudXNlZCBibG9ja3MgKi8KLSAgICBpbnQgaV9wcmVhbGxvY19jb3VudDsgLyogbGVuZ3RoIG9mIHRoYXQgc2VxdWVuY2UgKi8KLSAgICBzdHJ1Y3QgbGlzdF9oZWFkIGlfcHJlYWxsb2NfbGlzdDsgLyogcGVyLXRyYW5zYWN0aW9uIGxpc3Qgb2YgaW5vZGVzIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhdmUgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLworCWludCBpX3ByZWFsbG9jX2Jsb2NrOwkvKiBmaXJzdCB1bnVzZWQgYmxvY2sgb2YgYSBzZXF1ZW5jZSBvZiB1bnVzZWQgYmxvY2tzICovCisJaW50IGlfcHJlYWxsb2NfY291bnQ7CS8qIGxlbmd0aCBvZiB0aGF0IHNlcXVlbmNlICovCisJc3RydWN0IGxpc3RfaGVhZCBpX3ByZWFsbG9jX2xpc3Q7CS8qIHBlci10cmFuc2FjdGlvbiBsaXN0IG9mIGlub2RlcyB3aGljaAorCQkJCQkJICogaGF2ZSBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCiAKLSAgICB1bnNpZ25lZCBuZXdfcGFja2luZ19sb2NhbGl0eToxOyAgLyogbmV3X3BhY2tpZ19sb2NhbGl0eSBpcyBjcmVhdGVkOyBuZXcgYmxvY2tzCi0JCQkJICAgICAgICogZm9yIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUKLQkJCQkgICAgICAgKiBkaXNwbGFjZWQgKi8KKwl1bnNpZ25lZCBuZXdfcGFja2luZ19sb2NhbGl0eToxOwkvKiBuZXdfcGFja2lnX2xvY2FsaXR5IGlzIGNyZWF0ZWQ7IG5ldyBibG9ja3MKKwkJCQkJCSAqIGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlCisJCQkJCQkgKiBkaXNwbGFjZWQgKi8KIAotICAgIC8qIHdlIHVzZSB0aGVzZSBmb3IgZnN5bmMgb3IgT19TWU5DIHRvIGRlY2lkZSB3aGljaCB0cmFuc2FjdGlvbgotICAgICoqIG5lZWRzIHRvIGJlIGNvbW1pdHRlZCBpbiBvcmRlciBmb3IgdGhpcyBpbm9kZSB0byBiZSBwcm9wZXJseQotICAgICoqIGZsdXNoZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGlfdHJhbnNfaWQgOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmlfamw7CisJLyogd2UgdXNlIHRoZXNlIGZvciBmc3luYyBvciBPX1NZTkMgdG8gZGVjaWRlIHdoaWNoIHRyYW5zYWN0aW9uCisJICoqIG5lZWRzIHRvIGJlIGNvbW1pdHRlZCBpbiBvcmRlciBmb3IgdGhpcyBpbm9kZSB0byBiZSBwcm9wZXJseQorCSAqKiBmbHVzaGVkICovCisJdW5zaWduZWQgbG9uZyBpX3RyYW5zX2lkOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmlfamw7CiAKLSAgICBzdHJ1Y3QgcG9zaXhfYWNsICppX2FjbF9hY2Nlc3M7Ci0gICAgc3RydWN0IHBvc2l4X2FjbCAqaV9hY2xfZGVmYXVsdDsKLSAgICBzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKLSAgICBzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworCXN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsX2FjY2VzczsKKwlzdHJ1Y3QgcG9zaXhfYWNsICppX2FjbF9kZWZhdWx0OworCXN0cnVjdCByd19zZW1hcGhvcmUgeGF0dHJfc2VtOworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaAppbmRleCAzMWM3MDlkLi4zZTY4NTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCkBAIC0xMCw3ICsxMCw3IEBACiAjZW5kaWYKIAogdHlwZWRlZiBlbnVtIHsKLSAgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZAk9IDB4MDAwMDAwMDEsCisJcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCA9IDB4MDAwMDAwMDEsCiB9IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX2ZsYWdzOwogCiAvKiBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgYWNjZXNzb3JzL211dGF0b3JzCkBAIC02MSw3ICs2MSw3IEBACiAjZGVmaW5lIHNiX3Vtb3VudF9zdGF0ZShzYnApICAgICAgIChsZTE2X3RvX2NwdSgoc2JwKS0+c192MS5zX3Vtb3VudF9zdGF0ZSkpCiAjZGVmaW5lIHNldF9zYl91bW91bnRfc3RhdGUoc2JwLHYpICgoc2JwKS0+c192MS5zX3Vtb3VudF9zdGF0ZSA9IGNwdV90b19sZTE2KHYpKQogI2RlZmluZSBzYl9mc19zdGF0ZShzYnApICAgICAgICAgICAobGUxNl90b19jcHUoKHNicCktPnNfdjEuc19mc19zdGF0ZSkpCi0jZGVmaW5lIHNldF9zYl9mc19zdGF0ZShzYnAsdikgICAgICgoc2JwKS0+c192MS5zX2ZzX3N0YXRlID0gY3B1X3RvX2xlMTYodikpIAorI2RlZmluZSBzZXRfc2JfZnNfc3RhdGUoc2JwLHYpICAgICAoKHNicCktPnNfdjEuc19mc19zdGF0ZSA9IGNwdV90b19sZTE2KHYpKQogI2RlZmluZSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoc2JwKSBcCiAgICAgICAgICAgICAgIChsZTMyX3RvX2NwdSgoc2JwKS0+c192MS5zX2hhc2hfZnVuY3Rpb25fY29kZSkpCiAjZGVmaW5lIHNldF9zYl9oYXNoX2Z1bmN0aW9uX2NvZGUoc2JwLHYpIFwKQEAgLTEwMywxMCArMTAzLDEwIEBACiAKIC8qIGRvbid0IG1lc3Mgd2l0aCB0aGVzZSBmb3IgYSB3aGlsZSAqLwogCQkJCS8qIHdlIGhhdmUgYSBub2RlIHNpemUgZGVmaW5lIHNvbWV3aGVyZSBpbiByZWlzZXJmc19mcy5oLiAtSGFucyAqLwotI2RlZmluZSBKT1VSTkFMX0JMT0NLX1NJWkUgIDQwOTYgLyogQlVHIGdvdHRhIGdldCByaWQgb2YgdGhpcyAqLwotI2RlZmluZSBKT1VSTkFMX01BWF9DTk9ERSAgIDE1MDAgLyogbWF4IGNub2RlcyB0byBhbGxvY2F0ZS4gKi8KLSNkZWZpbmUgSk9VUk5BTF9IQVNIX1NJWkUgODE5MiAgIAotI2RlZmluZSBKT1VSTkFMX05VTV9CSVRNQVBTIDUgLyogbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgYml0bWFwcyB0byBoYXZlIGZsb2F0aW5nLiAgTXVzdCBiZSA+PSAyICovCisjZGVmaW5lIEpPVVJOQUxfQkxPQ0tfU0laRSAgNDA5NgkvKiBCVUcgZ290dGEgZ2V0IHJpZCBvZiB0aGlzICovCisjZGVmaW5lIEpPVVJOQUxfTUFYX0NOT0RFICAgMTUwMAkvKiBtYXggY25vZGVzIHRvIGFsbG9jYXRlLiAqLworI2RlZmluZSBKT1VSTkFMX0hBU0hfU0laRSA4MTkyCisjZGVmaW5lIEpPVVJOQUxfTlVNX0JJVE1BUFMgNQkvKiBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBiaXRtYXBzIHRvIGhhdmUgZmxvYXRpbmcuICBNdXN0IGJlID49IDIgKi8KIAogLyogT25lIG9mIHRoZXNlIGZvciBldmVyeSBibG9jayBpbiBldmVyeSB0cmFuc2FjdGlvbgogKiogRWFjaCBvbmUgaXMgaW4gdHdvIGhhc2ggdGFibGVzLiAgRmlyc3QsIGEgaGFzaCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgYW5kIGFmdGVyIGpvdXJuYWxfZW5kLCBhCkBAIC0xMTcsMjcgKzExNywyNyBAQAogKiogdG8gYSBnaXZlbiB0cmFuc2FjdGlvbi4KICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwkJIC8qIHJlYWwgYnVmZmVyIGhlYWQgKi8KLSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA7CQkgLyogZGV2IG9mIHJlYWwgYnVmZmVyIGhlYWQgKi8KLSAgX191MzIgYmxvY2tuciA7CQkgLyogYmxvY2sgbnVtYmVyIG9mIHJlYWwgYnVmZmVyIGhlYWQsID09IDAgd2hlbiBidWZmZXIgb24gZGlzayAqLwotICBsb25nIHN0YXRlIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamxpc3QgOyAgLyogam91cm5hbCBsaXN0IHRoaXMgY25vZGUgbGl2ZXMgaW4gKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKm5leHQgOyAgLyogbmV4dCBpbiB0cmFuc2FjdGlvbiBsaXN0ICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpwcmV2IDsgIC8qIHByZXYgaW4gdHJhbnNhY3Rpb24gbGlzdCAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaHByZXYgOyAvKiBwcmV2IGluIGhhc2ggbGlzdCAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaG5leHQgOyAvKiBuZXh0IGluIGhhc2ggbGlzdCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CS8qIHJlYWwgYnVmZmVyIGhlYWQgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkvKiBkZXYgb2YgcmVhbCBidWZmZXIgaGVhZCAqLworCV9fdTMyIGJsb2NrbnI7CQkvKiBibG9jayBudW1iZXIgb2YgcmVhbCBidWZmZXIgaGVhZCwgPT0gMCB3aGVuIGJ1ZmZlciBvbiBkaXNrICovCisJbG9uZyBzdGF0ZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbGlzdDsJLyogam91cm5hbCBsaXN0IHRoaXMgY25vZGUgbGl2ZXMgaW4gKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqbmV4dDsJLyogbmV4dCBpbiB0cmFuc2FjdGlvbiBsaXN0ICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKnByZXY7CS8qIHByZXYgaW4gdHJhbnNhY3Rpb24gbGlzdCAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpocHJldjsJLyogcHJldiBpbiBoYXNoIGxpc3QgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaG5leHQ7CS8qIG5leHQgaW4gaGFzaCBsaXN0ICovCiB9OwogCiBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgewotICBpbnQgaWQgOwotICBjaGFyICpkYXRhIDsKLSAgc3RydWN0IGxpc3RfaGVhZCBsaXN0IDsKLX0gOworCWludCBpZDsKKwljaGFyICpkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CiAKIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpvdXJuYWxfbGlzdCA7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKmJpdG1hcHMgOwotfSA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqam91cm5hbF9saXN0OworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKmJpdG1hcHM7Cit9OwogCiAvKgogKiogb25lIG9mIHRoZXNlIGZvciBlYWNoIHRyYW5zYWN0aW9uLiAgVGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgaGVyZSBpcyB0aGUgal9yZWFsYmxvY2suCkBAIC0xNDYsMjczICsxNDYsMjY5IEBACiAqKiBhbmQgdG8gbWFrZSBzdXJlIGV2ZXJ5IHJlYWwgYmxvY2sgaW4gYSB0cmFuc2FjdGlvbiBpcyBvbiBkaXNrIGJlZm9yZSBhbGxvd2luZyB0aGUgbG9nIGFyZWEKICoqIHRvIGJlIG92ZXJ3cml0dGVuICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0IHsKLSAgdW5zaWduZWQgbG9uZyBqX3N0YXJ0IDsKLSAgdW5zaWduZWQgbG9uZyBqX3N0YXRlOwotICB1bnNpZ25lZCBsb25nIGpfbGVuIDsKLSAgYXRvbWljX3Qgal9ub256ZXJvbGVuIDsKLSAgYXRvbWljX3Qgal9jb21taXRfbGVmdCA7Ci0gIGF0b21pY190IGpfb2xkZXJfY29tbWl0c19kb25lIDsgICAgICAvKiBhbGwgY29tbWl0cyBvbGRlciB0aGFuIHRoaXMgb24gZGlzayovCi0gIHN0cnVjdCBzZW1hcGhvcmUgal9jb21taXRfbG9jazsKLSAgdW5zaWduZWQgbG9uZyBqX3RyYW5zX2lkIDsKLSAgdGltZV90IGpfdGltZXN0YW1wIDsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqX2xpc3RfYml0bWFwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpqX2NvbW1pdF9iaCA7IC8qIGNvbW1pdCBidWZmZXIgaGVhZCAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9yZWFsYmxvY2sgIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfZnJlZWRsaXN0IDsgLyogbGlzdCBvZiBidWZmZXJzIHRoYXQgd2VyZSBmcmVlZCBkdXJpbmcgdGhpcyB0cmFucy4gIGZyZWUgZWFjaCBvZiB0aGVzZSBvbiBmbHVzaCAqLwotICAvKiB0aW1lIG9yZGVyZWQgbGlzdCBvZiBhbGwgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfbGlzdDsKKwl1bnNpZ25lZCBsb25nIGpfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBqX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgal9sZW47CisJYXRvbWljX3Qgal9ub256ZXJvbGVuOworCWF0b21pY190IGpfY29tbWl0X2xlZnQ7CisJYXRvbWljX3Qgal9vbGRlcl9jb21taXRzX2RvbmU7CS8qIGFsbCBjb21taXRzIG9sZGVyIHRoYW4gdGhpcyBvbiBkaXNrICovCisJc3RydWN0IHNlbWFwaG9yZSBqX2NvbW1pdF9sb2NrOworCXVuc2lnbmVkIGxvbmcgal90cmFuc19pZDsKKwl0aW1lX3Qgal90aW1lc3RhbXA7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqX2xpc3RfYml0bWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqal9jb21taXRfYmg7CS8qIGNvbW1pdCBidWZmZXIgaGVhZCAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX3JlYWxibG9jazsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9mcmVlZGxpc3Q7CS8qIGxpc3Qgb2YgYnVmZmVycyB0aGF0IHdlcmUgZnJlZWQgZHVyaW5nIHRoaXMgdHJhbnMuICBmcmVlIGVhY2ggb2YgdGhlc2Ugb24gZmx1c2ggKi8KKwkvKiB0aW1lIG9yZGVyZWQgbGlzdCBvZiBhbGwgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgal9saXN0OwogCi0gIC8qIHRpbWUgb3JkZXJlZCBsaXN0IG9mIGFsbCB0cmFuc2FjdGlvbnMgd2UgaGF2ZW4ndCB0cmllZCB0byBmbHVzaCB5ZXQgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX3dvcmtpbmdfbGlzdDsKKwkvKiB0aW1lIG9yZGVyZWQgbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zIHdlIGhhdmVuJ3QgdHJpZWQgdG8gZmx1c2ggeWV0ICovCisJc3RydWN0IGxpc3RfaGVhZCBqX3dvcmtpbmdfbGlzdDsKIAotICAvKiBsaXN0IG9mIHRhaWwgY29udmVyc2lvbiB0YXJnZXRzIGluIG5lZWQgb2YgZmx1c2ggYmVmb3JlIGNvbW1pdCAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfdGFpbF9iaF9saXN0OwotICAvKiBsaXN0IG9mIGRhdGE9b3JkZXJlZCBidWZmZXJzIGluIG5lZWQgb2YgZmx1c2ggYmVmb3JlIGNvbW1pdCAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfYmhfbGlzdDsKLSAgaW50IGpfcmVmY291bnQ7Ci19IDsKKwkvKiBsaXN0IG9mIHRhaWwgY29udmVyc2lvbiB0YXJnZXRzIGluIG5lZWQgb2YgZmx1c2ggYmVmb3JlIGNvbW1pdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgal90YWlsX2JoX2xpc3Q7CisJLyogbGlzdCBvZiBkYXRhPW9yZGVyZWQgYnVmZmVycyBpbiBuZWVkIG9mIGZsdXNoIGJlZm9yZSBjb21taXQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfYmhfbGlzdDsKKwlpbnQgal9yZWZjb3VudDsKK307CiAKIHN0cnVjdCByZWlzZXJmc19qb3VybmFsIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGpfYXBfYmxvY2tzIDsgLyogam91cm5hbCBibG9ja3Mgb24gZGlzayAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9sYXN0IDsgLyogbmV3ZXN0IGpvdXJuYWwgYmxvY2sgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfZmlyc3QgOyAvKiAgb2xkZXN0IGpvdXJuYWwgYmxvY2suICBzdGFydCBoZXJlIGZvciB0cmF2ZXJzZSAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmpfYXBfYmxvY2tzOwkvKiBqb3VybmFsIGJsb2NrcyBvbiBkaXNrICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfbGFzdDsJLyogbmV3ZXN0IGpvdXJuYWwgYmxvY2sgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9maXJzdDsJLyogIG9sZGVzdCBqb3VybmFsIGJsb2NrLiAgc3RhcnQgaGVyZSBmb3IgdHJhdmVyc2UgKi8KIAotICBzdHJ1Y3QgZmlsZSAgICAgICAgICpqX2Rldl9maWxlOwotICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpqX2Rldl9iZDsgIAotICBpbnQgal8xc3RfcmVzZXJ2ZWRfYmxvY2s7ICAgICAvKiBmaXJzdCBibG9jayBvbiBzX2RldiBvZiByZXNlcnZlZCBhcmVhIGpvdXJuYWwgKi8gICAgICAgIAotCQotICBsb25nIGpfc3RhdGUgOwkJCQotICB1bnNpZ25lZCBsb25nIGpfdHJhbnNfaWQgOwotICB1bnNpZ25lZCBsb25nIGpfbW91bnRfaWQgOwotICB1bnNpZ25lZCBsb25nIGpfc3RhcnQgOyAgICAgICAgICAgICAvKiBzdGFydCBvZiBjdXJyZW50IHdhaXRpbmcgY29tbWl0IChpbmRleCBpbnRvIGpfYXBfYmxvY2tzKSAqLwotICB1bnNpZ25lZCBsb25nIGpfbGVuIDsgICAgICAgICAgICAgICAvKiBsZW5naHQgb2YgY3VycmVudCB3YWl0aW5nIGNvbW1pdCAqLwotICB1bnNpZ25lZCBsb25nIGpfbGVuX2FsbG9jIDsgICAgICAgICAvKiBudW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgYnkgam91cm5hbF9iZWdpbigpICovCi0gIGF0b21pY190IGpfd2NvdW50IDsgICAgICAgICAgICAvKiBjb3VudCBvZiB3cml0ZXJzIGZvciBjdXJyZW50IGNvbW1pdCAqLwotICB1bnNpZ25lZCBsb25nIGpfYmNvdW50IDsgICAgICAgICAgICAvKiBiYXRjaCBjb3VudC4gYWxsb3dzIHR1cm5pbmcgWCB0cmFuc2FjdGlvbnMgaW50byAxICovCi0gIHVuc2lnbmVkIGxvbmcgal9maXJzdF91bmZsdXNoZWRfb2Zmc2V0IDsgIC8qIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbnMgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcgal9sYXN0X2ZsdXNoX3RyYW5zX2lkIDsgICAgLyogbGFzdCBmdWxseSBmbHVzaGVkIGpvdXJuYWwgdGltZXN0YW1wICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqal9oZWFkZXJfYmggOyAgIAorCXN0cnVjdCBmaWxlICpqX2Rldl9maWxlOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmpfZGV2X2JkOworCWludCBqXzFzdF9yZXNlcnZlZF9ibG9jazsJLyogZmlyc3QgYmxvY2sgb24gc19kZXYgb2YgcmVzZXJ2ZWQgYXJlYSBqb3VybmFsICovCiAKLSAgdGltZV90IGpfdHJhbnNfc3RhcnRfdGltZSA7ICAgICAgICAgLyogdGltZSB0aGlzIHRyYW5zYWN0aW9uIHN0YXJ0ZWQgKi8KLSAgc3RydWN0IHNlbWFwaG9yZSBqX2xvY2s7Ci0gIHN0cnVjdCBzZW1hcGhvcmUgal9mbHVzaF9zZW07Ci0gIHdhaXRfcXVldWVfaGVhZF90IGpfam9pbl93YWl0IDsgICAgLyogd2FpdCBmb3IgY3VycmVudCB0cmFuc2FjdGlvbiB0byBmaW5pc2ggYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmUgKi8KLSAgYXRvbWljX3Qgal9qbG9jayA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2NrIGZvciBqX2pvaW5fd2FpdCAqLwotICBpbnQgal9saXN0X2JpdG1hcF9pbmRleCA7CSAgICAgIC8qIG51bWJlciBvZiBuZXh0IGxpc3QgYml0bWFwIHRvIHVzZSAqLwotICBpbnQgal9tdXN0X3dhaXQgOwkJICAgICAgIC8qIG5vIG1vcmUgam91cm5hbCBiZWdpbnMgYWxsb3dlZC4gTVVTVCBzbGVlcCBvbiBqX2pvaW5fd2FpdCAqLwotICBpbnQgal9uZXh0X2Z1bGxfZmx1c2ggOyAgICAgICAgICAgICAvKiBuZXh0IGpvdXJuYWxfZW5kIHdpbGwgZmx1c2ggYWxsIGpvdXJuYWwgbGlzdCAqLwotICBpbnQgal9uZXh0X2FzeW5jX2ZsdXNoIDsgICAgICAgICAgICAgLyogbmV4dCBqb3VybmFsX2VuZCB3aWxsIGZsdXNoIGFsbCBhc3luYyBjb21taXRzICovCisJbG9uZyBqX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgal90cmFuc19pZDsKKwl1bnNpZ25lZCBsb25nIGpfbW91bnRfaWQ7CisJdW5zaWduZWQgbG9uZyBqX3N0YXJ0OwkvKiBzdGFydCBvZiBjdXJyZW50IHdhaXRpbmcgY29tbWl0IChpbmRleCBpbnRvIGpfYXBfYmxvY2tzKSAqLworCXVuc2lnbmVkIGxvbmcgal9sZW47CS8qIGxlbmdodCBvZiBjdXJyZW50IHdhaXRpbmcgY29tbWl0ICovCisJdW5zaWduZWQgbG9uZyBqX2xlbl9hbGxvYzsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkIGJ5IGpvdXJuYWxfYmVnaW4oKSAqLworCWF0b21pY190IGpfd2NvdW50OwkvKiBjb3VudCBvZiB3cml0ZXJzIGZvciBjdXJyZW50IGNvbW1pdCAqLworCXVuc2lnbmVkIGxvbmcgal9iY291bnQ7CS8qIGJhdGNoIGNvdW50LiBhbGxvd3MgdHVybmluZyBYIHRyYW5zYWN0aW9ucyBpbnRvIDEgKi8KKwl1bnNpZ25lZCBsb25nIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDsJLyogZmlyc3QgdW5mbHVzaGVkIHRyYW5zYWN0aW9ucyBvZmZzZXQgKi8KKwl1bnNpZ25lZCBsb25nIGpfbGFzdF9mbHVzaF90cmFuc19pZDsJLyogbGFzdCBmdWxseSBmbHVzaGVkIGpvdXJuYWwgdGltZXN0YW1wICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpqX2hlYWRlcl9iaDsKIAotICBpbnQgal9jbm9kZV91c2VkIDsJICAgICAgLyogbnVtYmVyIG9mIGNub2RlcyBvbiB0aGUgdXNlZCBsaXN0ICovCi0gIGludCBqX2Nub2RlX2ZyZWUgOyAgICAgICAgICAvKiBudW1iZXIgb2YgY25vZGVzIG9uIHRoZSBmcmVlIGxpc3QgKi8KKwl0aW1lX3Qgal90cmFuc19zdGFydF90aW1lOwkvKiB0aW1lIHRoaXMgdHJhbnNhY3Rpb24gc3RhcnRlZCAqLworCXN0cnVjdCBzZW1hcGhvcmUgal9sb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgal9mbHVzaF9zZW07CisJd2FpdF9xdWV1ZV9oZWFkX3Qgal9qb2luX3dhaXQ7CS8qIHdhaXQgZm9yIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmluaXNoIGJlZm9yZSBzdGFydGluZyBuZXcgb25lICovCisJYXRvbWljX3Qgal9qbG9jazsJLyogbG9jayBmb3Igal9qb2luX3dhaXQgKi8KKwlpbnQgal9saXN0X2JpdG1hcF9pbmRleDsJLyogbnVtYmVyIG9mIG5leHQgbGlzdCBiaXRtYXAgdG8gdXNlICovCisJaW50IGpfbXVzdF93YWl0OwkvKiBubyBtb3JlIGpvdXJuYWwgYmVnaW5zIGFsbG93ZWQuIE1VU1Qgc2xlZXAgb24gal9qb2luX3dhaXQgKi8KKwlpbnQgal9uZXh0X2Z1bGxfZmx1c2g7CS8qIG5leHQgam91cm5hbF9lbmQgd2lsbCBmbHVzaCBhbGwgam91cm5hbCBsaXN0ICovCisJaW50IGpfbmV4dF9hc3luY19mbHVzaDsJLyogbmV4dCBqb3VybmFsX2VuZCB3aWxsIGZsdXNoIGFsbCBhc3luYyBjb21taXRzICovCiAKLSAgdW5zaWduZWQgaW50IGpfdHJhbnNfbWF4IDsgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgal9tYXhfYmF0Y2ggOyAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhIHRyYW5zICovCi0gIHVuc2lnbmVkIGludCBqX21heF9jb21taXRfYWdlIDsgICAgICAvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhbiBhc3luYyBjb21taXQgYmUgKi8KLSAgdW5zaWduZWQgaW50IGpfbWF4X3RyYW5zX2FnZSA7ICAgICAgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGEgdHJhbnNhY3Rpb24gYmUgKi8KLSAgdW5zaWduZWQgaW50IGpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZSA7IC8qIHRoZSBkZWZhdWx0IGZvciB0aGUgbWF4IGNvbW1pdCBhZ2UgKi8KKwlpbnQgal9jbm9kZV91c2VkOwkvKiBudW1iZXIgb2YgY25vZGVzIG9uIHRoZSB1c2VkIGxpc3QgKi8KKwlpbnQgal9jbm9kZV9mcmVlOwkvKiBudW1iZXIgb2YgY25vZGVzIG9uIHRoZSBmcmVlIGxpc3QgKi8KIAotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9jbm9kZV9mcmVlX2xpc3QgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9jbm9kZV9mcmVlX29yaWcgOyAvKiBvcmlnIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSB2bWFsbG9jICovCisJdW5zaWduZWQgaW50IGpfdHJhbnNfbWF4OwkvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHRyYW5zYWN0aW9uLiAgKi8KKwl1bnNpZ25lZCBpbnQgal9tYXhfYmF0Y2g7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIHRvIGJhdGNoIGludG8gYSB0cmFucyAqLworCXVuc2lnbmVkIGludCBqX21heF9jb21taXRfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhbiBhc3luYyBjb21taXQgYmUgKi8KKwl1bnNpZ25lZCBpbnQgal9tYXhfdHJhbnNfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uIGJlICovCisJdW5zaWduZWQgaW50IGpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZTsJLyogdGhlIGRlZmF1bHQgZm9yIHRoZSBtYXggY29tbWl0IGFnZSAqLwogCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpfY3VycmVudF9qbDsKLSAgaW50IGpfZnJlZV9iaXRtYXBfbm9kZXMgOwotICBpbnQgal91c2VkX2JpdG1hcF9ub2RlcyA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfY25vZGVfZnJlZV9saXN0OworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2Nub2RlX2ZyZWVfb3JpZzsJLyogb3JpZyBwb2ludGVyIHJldHVybmVkIGZyb20gdm1hbGxvYyAqLwogCi0gIGludCBqX251bV9saXN0czsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLwotICBpbnQgal9udW1fd29ya19saXN0czsgLyogbnVtYmVyIHRoYXQgbmVlZCBhdHRlbnRpb24gZnJvbSBrcmVpc2VyZnNkICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqal9jdXJyZW50X2psOworCWludCBqX2ZyZWVfYml0bWFwX25vZGVzOworCWludCBqX3VzZWRfYml0bWFwX25vZGVzOwogCi0gIC8qIGRlYnVnZ2luZyB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSBmbHVzaGVkIGluIG9yZGVyICovCi0gIGludCBqX2xhc3RfZmx1c2hfaWQ7CisJaW50IGpfbnVtX2xpc3RzOwkvKiB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLworCWludCBqX251bV93b3JrX2xpc3RzOwkvKiBudW1iZXIgdGhhdCBuZWVkIGF0dGVudGlvbiBmcm9tIGtyZWlzZXJmc2QgKi8KIAotICAvKiBkZWJ1Z2dpbmcgdG8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgY29tbWl0dGVkIGluIG9yZGVyICovCi0gIGludCBqX2xhc3RfY29tbWl0X2lkOworCS8qIGRlYnVnZ2luZyB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSBmbHVzaGVkIGluIG9yZGVyICovCisJaW50IGpfbGFzdF9mbHVzaF9pZDsKIAotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfYml0bWFwX25vZGVzIDsKLSAgc3RydWN0IGxpc3RfaGVhZCBqX2RpcnR5X2J1ZmZlcnMgOwotICBzcGlubG9ja190IGpfZGlydHlfYnVmZmVyc19sb2NrIDsgLyogcHJvdGVjdHMgal9kaXJ0eV9idWZmZXJzICovCisJLyogZGVidWdnaW5nIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGNvbW1pdHRlZCBpbiBvcmRlciAqLworCWludCBqX2xhc3RfY29tbWl0X2lkOwogCi0gIC8qIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX2pvdXJuYWxfbGlzdDsKLSAgLyogbGlzdHMgdGhhdCBoYXZlbid0IGJlZW4gdG91Y2hlZCBieSB3cml0ZWJhY2sgYXR0ZW1wdHMgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX3dvcmtpbmdfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfYml0bWFwX25vZGVzOworCXN0cnVjdCBsaXN0X2hlYWQgal9kaXJ0eV9idWZmZXJzOworCXNwaW5sb2NrX3Qgal9kaXJ0eV9idWZmZXJzX2xvY2s7CS8qIHByb3RlY3RzIGpfZGlydHlfYnVmZmVycyAqLwogCi0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCBqX2xpc3RfYml0bWFwW0pPVVJOQUxfTlVNX0JJVE1BUFNdIDsJLyogYXJyYXkgb2YgYml0bWFwcyB0byByZWNvcmQgdGhlIGRlbGV0ZWQgYmxvY2tzICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2hhc2hfdGFibGVbSk9VUk5BTF9IQVNIX1NJWkVdIDsgCSAgICAvKiBoYXNoIHRhYmxlIGZvciByZWFsIGJ1ZmZlciBoZWFkcyBpbiBjdXJyZW50IHRyYW5zICovIAotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9saXN0X2hhc2hfdGFibGVbSk9VUk5BTF9IQVNIX1NJWkVdIDsgLyogaGFzaCB0YWJsZSBmb3IgYWxsIHRoZSByZWFsIGJ1ZmZlciBoZWFkcyBpbiBhbGwgCi0gIAkJCQkJCQkJCQl0aGUgdHJhbnNhY3Rpb25zICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal9wcmVhbGxvY19saXN0OyAgICAgLyogbGlzdCBvZiBpbm9kZXMgd2hpY2ggaGF2ZSBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCi0gIGludCBqX3BlcnNpc3RlbnRfdHJhbnM7Ci0gIHVuc2lnbmVkIGxvbmcgal9tYXhfdHJhbnNfc2l6ZSA7Ci0gIHVuc2lnbmVkIGxvbmcgal9tYXhfYmF0Y2hfc2l6ZSA7CisJLyogbGlzdCBvZiBhbGwgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgal9qb3VybmFsX2xpc3Q7CisJLyogbGlzdHMgdGhhdCBoYXZlbid0IGJlZW4gdG91Y2hlZCBieSB3cml0ZWJhY2sgYXR0ZW1wdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfd29ya2luZ19saXN0OwogCi0gIGludCBqX2Vycm5vOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCBqX2xpc3RfYml0bWFwW0pPVVJOQUxfTlVNX0JJVE1BUFNdOwkvKiBhcnJheSBvZiBiaXRtYXBzIHRvIHJlY29yZCB0aGUgZGVsZXRlZCBibG9ja3MgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9oYXNoX3RhYmxlW0pPVVJOQUxfSEFTSF9TSVpFXTsJLyogaGFzaCB0YWJsZSBmb3IgcmVhbCBidWZmZXIgaGVhZHMgaW4gY3VycmVudCB0cmFucyAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2xpc3RfaGFzaF90YWJsZVtKT1VSTkFMX0hBU0hfU0laRV07CS8qIGhhc2ggdGFibGUgZm9yIGFsbCB0aGUgcmVhbCBidWZmZXIgaGVhZHMgaW4gYWxsIAorCQkJCQkJCQkJCSAgIHRoZSB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfcHJlYWxsb2NfbGlzdDsJLyogbGlzdCBvZiBpbm9kZXMgd2hpY2ggaGF2ZSBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisJaW50IGpfcGVyc2lzdGVudF90cmFuczsKKwl1bnNpZ25lZCBsb25nIGpfbWF4X3RyYW5zX3NpemU7CisJdW5zaWduZWQgbG9uZyBqX21heF9iYXRjaF9zaXplOwogCi0gIC8qIHdoZW4gZmx1c2hpbmcgb3JkZXJlZCBidWZmZXJzLCB0aHJvdHRsZSBuZXcgb3JkZXJlZCB3cml0ZXJzICovCi0gIHN0cnVjdCB3b3JrX3N0cnVjdCBqX3dvcms7Ci0gIGF0b21pY190IGpfYXN5bmNfdGhyb3R0bGU7CisJaW50IGpfZXJybm87CisKKwkvKiB3aGVuIGZsdXNoaW5nIG9yZGVyZWQgYnVmZmVycywgdGhyb3R0bGUgbmV3IG9yZGVyZWQgd3JpdGVycyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBqX3dvcms7CisJYXRvbWljX3Qgal9hc3luY190aHJvdHRsZTsKIH07CiAKIGVudW0gam91cm5hbF9zdGF0ZV9iaXRzIHsKLSAgICBKX1dSSVRFUlNfQkxPQ0tFRCA9IDEsICAgLyogc2V0IHdoZW4gbmV3IHdyaXRlcnMgbm90IGFsbG93ZWQgKi8KLSAgICBKX1dSSVRFUlNfUVVFVUVELCAgICAgICAgLyogc2V0IHdoZW4gbG9nIGlzIGZ1bGwgZHVlIHRvIHRvbyBtYW55IHdyaXRlcnMgKi8KLSAgICBKX0FCT1JURUQsICAgICAgICAgICAgICAgLyogc2V0IHdoZW4gbG9nIGlzIGFib3J0ZWQgKi8KKwlKX1dSSVRFUlNfQkxPQ0tFRCA9IDEsCS8qIHNldCB3aGVuIG5ldyB3cml0ZXJzIG5vdCBhbGxvd2VkICovCisJSl9XUklURVJTX1FVRVVFRCwJLyogc2V0IHdoZW4gbG9nIGlzIGZ1bGwgZHVlIHRvIHRvbyBtYW55IHdyaXRlcnMgKi8KKwlKX0FCT1JURUQsCQkvKiBzZXQgd2hlbiBsb2cgaXMgYWJvcnRlZCAqLwogfTsKIAorI2RlZmluZSBKT1VSTkFMX0RFU0NfTUFHSUMgIlJlSXNFckxCIgkvKiBpY2suICBtYWdpYyBzdHJpbmcgdG8gZmluZCBkZXNjIGJsb2NrcyBpbiB0aGUgam91cm5hbCAqLwogCi0jZGVmaW5lIEpPVVJOQUxfREVTQ19NQUdJQyAiUmVJc0VyTEIiIC8qIGljay4gIG1hZ2ljIHN0cmluZyB0byBmaW5kIGRlc2MgYmxvY2tzIGluIHRoZSBqb3VybmFsICovCit0eXBlZGVmIF9fdTMyKCpoYXNoZl90KSAoY29uc3Qgc2lnbmVkIGNoYXIgKiwgaW50KTsKIAotdHlwZWRlZiBfX3UzMiAoKmhhc2hmX3QpIChjb25zdCBzaWduZWQgY2hhciAqLCBpbnQpOwotCi1zdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8KLXsKLSAgICAvLyBGSVhNRTogV29uJ3Qgd29yayB3aXRoIGJsb2NrIHNpemVzID4gOEsKLSAgICBfX3UxNiAgZmlyc3RfemVyb19oaW50OwotICAgIF9fdTE2ICBmcmVlX2NvdW50OwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7IC8qIHRoZSBhY3R1YWwgYml0bWFwICovCitzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8geworCS8vIEZJWE1FOiBXb24ndCB3b3JrIHdpdGggYmxvY2sgc2l6ZXMgPiA4SworCV9fdTE2IGZpcnN0X3plcm9faGludDsKKwlfX3UxNiBmcmVlX2NvdW50OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CS8qIHRoZSBhY3R1YWwgYml0bWFwICovCiB9OwogCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnk7CiAKICNpZiBkZWZpbmVkKCBDT05GSUdfUFJPQ19GUyApICYmIGRlZmluZWQoIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gKQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzdGF0X2NudF90OwotdHlwZWRlZiBzdHJ1Y3QgcmVpc2VyZnNfcHJvY19pbmZvX2RhdGEKLXsKLSAgc3BpbmxvY2tfdCBsb2NrOwotICBpbnQgZXhpdGluZzsKLSAgaW50IG1heF9oYXNoX2NvbGxpc2lvbnM7Cit0eXBlZGVmIHN0cnVjdCByZWlzZXJmc19wcm9jX2luZm9fZGF0YSB7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBleGl0aW5nOworCWludCBtYXhfaGFzaF9jb2xsaXNpb25zOwogCi0gIHN0YXRfY250X3QgYnJlYWRzOwotICBzdGF0X2NudF90IGJyZWFkX21pc3M7Ci0gIHN0YXRfY250X3Qgc2VhcmNoX2J5X2tleTsKLSAgc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ7Ci0gIHN0YXRfY250X3Qgc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBicmVhZHM7CisJc3RhdF9jbnRfdCBicmVhZF9taXNzOworCXN0YXRfY250X3Qgc2VhcmNoX2J5X2tleTsKKwlzdGF0X2NudF90IHNlYXJjaF9ieV9rZXlfZnNfY2hhbmdlZDsKKwlzdGF0X2NudF90IHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkOwogCi0gIHN0YXRfY250X3QgaW5zZXJ0X2l0ZW1fcmVzdGFydGVkOwotICBzdGF0X2NudF90IHBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ7Ci0gIHN0YXRfY250X3QgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQ7Ci0gIHN0YXRfY250X3QgZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkOwotICBzdGF0X2NudF90IGRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IGluc2VydF9pdGVtX3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IHBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IGRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDsKIAotICBzdGF0X2NudF90IGxlYWtlZF9vaWQ7Ci0gIHN0YXRfY250X3QgbGVhdmVzX3JlbW92YWJsZTsKKwlzdGF0X2NudF90IGxlYWtlZF9vaWQ7CisJc3RhdF9jbnRfdCBsZWF2ZXNfcmVtb3ZhYmxlOwogCi0gIC8qIGJhbGFuY2VzIHBlciBsZXZlbC4gVXNlIGV4cGxpY2l0IDUgYXMgTUFYX0hFSUdIVCBpcyBub3QgdmlzaWJsZSB5ZXQuICovCi0gIHN0YXRfY250X3QgYmFsYW5jZV9hdFsgNSBdOyAvKiBYWFggKi8KLSAgLyogc2JrID09IHNlYXJjaF9ieV9rZXkgKi8KLSAgc3RhdF9jbnRfdCBzYmtfcmVhZF9hdFsgNSBdOyAvKiBYWFggKi8KLSAgc3RhdF9jbnRfdCBzYmtfZnNfY2hhbmdlZFsgNSBdOwotICBzdGF0X2NudF90IHNia19yZXN0YXJ0ZWRbIDUgXTsKLSAgc3RhdF9jbnRfdCBpdGVtc19hdFsgNSBdOyAvKiBYWFggKi8KLSAgc3RhdF9jbnRfdCBmcmVlX2F0WyA1IF07IC8qIFhYWCAqLwotICBzdGF0X2NudF90IGNhbl9ub2RlX2JlX3JlbW92ZWRbIDUgXTsgLyogWFhYICovCi0gIGxvbmcgaW50IGxudW1bIDUgXTsgLyogWFhYICovCi0gIGxvbmcgaW50IHJudW1bIDUgXTsgLyogWFhYICovCi0gIGxvbmcgaW50IGxieXRlc1sgNSBdOyAvKiBYWFggKi8KLSAgbG9uZyBpbnQgcmJ5dGVzWyA1IF07IC8qIFhYWCAqLwotICBzdGF0X2NudF90IGdldF9uZWlnaGJvcnNbIDUgXTsKLSAgc3RhdF9jbnRfdCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIDUgXTsKLSAgc3RhdF9jbnRfdCBuZWVkX2xfbmVpZ2hib3JbIDUgXTsKLSAgc3RhdF9jbnRfdCBuZWVkX3JfbmVpZ2hib3JbIDUgXTsKKwkvKiBiYWxhbmNlcyBwZXIgbGV2ZWwuIFVzZSBleHBsaWNpdCA1IGFzIE1BWF9IRUlHSFQgaXMgbm90IHZpc2libGUgeWV0LiAqLworCXN0YXRfY250X3QgYmFsYW5jZV9hdFs1XTsJLyogWFhYICovCisJLyogc2JrID09IHNlYXJjaF9ieV9rZXkgKi8KKwlzdGF0X2NudF90IHNia19yZWFkX2F0WzVdOwkvKiBYWFggKi8KKwlzdGF0X2NudF90IHNia19mc19jaGFuZ2VkWzVdOworCXN0YXRfY250X3Qgc2JrX3Jlc3RhcnRlZFs1XTsKKwlzdGF0X2NudF90IGl0ZW1zX2F0WzVdOwkvKiBYWFggKi8KKwlzdGF0X2NudF90IGZyZWVfYXRbNV07CS8qIFhYWCAqLworCXN0YXRfY250X3QgY2FuX25vZGVfYmVfcmVtb3ZlZFs1XTsJLyogWFhYICovCisJbG9uZyBpbnQgbG51bVs1XTsJLyogWFhYICovCisJbG9uZyBpbnQgcm51bVs1XTsJLyogWFhYICovCisJbG9uZyBpbnQgbGJ5dGVzWzVdOwkvKiBYWFggKi8KKwlsb25nIGludCByYnl0ZXNbNV07CS8qIFhYWCAqLworCXN0YXRfY250X3QgZ2V0X25laWdoYm9yc1s1XTsKKwlzdGF0X2NudF90IGdldF9uZWlnaGJvcnNfcmVzdGFydFs1XTsKKwlzdGF0X2NudF90IG5lZWRfbF9uZWlnaGJvcls1XTsKKwlzdGF0X2NudF90IG5lZWRfcl9uZWlnaGJvcls1XTsKIAotICBzdGF0X2NudF90IGZyZWVfYmxvY2s7Ci0gIHN0cnVjdCBfX3NjYW5fYml0bWFwX3N0YXRzIHsKLQlzdGF0X2NudF90IGNhbGw7Ci0Jc3RhdF9jbnRfdCB3YWl0OwotCXN0YXRfY250X3QgYm1hcDsKLQlzdGF0X2NudF90IHJldHJ5OwotCXN0YXRfY250X3QgaW5fam91cm5hbF9oaW50OwotCXN0YXRfY250X3QgaW5fam91cm5hbF9ub2hpbnQ7Ci0Jc3RhdF9jbnRfdCBzdG9sZW47Ci0gIH0gc2Nhbl9iaXRtYXA7Ci0gIHN0cnVjdCBfX2pvdXJuYWxfc3RhdHMgewotCXN0YXRfY250X3QgaW5fam91cm5hbDsKLQlzdGF0X2NudF90IGluX2pvdXJuYWxfYml0bWFwOwotCXN0YXRfY250X3QgaW5fam91cm5hbF9yZXVzYWJsZTsKLQlzdGF0X2NudF90IGxvY2tfam91cm5hbDsKLQlzdGF0X2NudF90IGxvY2tfam91cm5hbF93YWl0OwotCXN0YXRfY250X3Qgam91cm5hbF9iZWluZzsKLQlzdGF0X2NudF90IGpvdXJuYWxfcmVsb2NrX3dyaXRlcnM7Ci0Jc3RhdF9jbnRfdCBqb3VybmFsX3JlbG9ja193Y291bnQ7Ci0Jc3RhdF9jbnRfdCBtYXJrX2RpcnR5OwotCXN0YXRfY250X3QgbWFya19kaXJ0eV9hbHJlYWR5OwotCXN0YXRfY250X3QgbWFya19kaXJ0eV9ub3Rqb3VybmFsOwotCXN0YXRfY250X3QgcmVzdG9yZV9wcmVwYXJlZDsKLQlzdGF0X2NudF90IHByZXBhcmU7Ci0Jc3RhdF9jbnRfdCBwcmVwYXJlX3JldHJ5OwotICB9IGpvdXJuYWw7CisJc3RhdF9jbnRfdCBmcmVlX2Jsb2NrOworCXN0cnVjdCBfX3NjYW5fYml0bWFwX3N0YXRzIHsKKwkJc3RhdF9jbnRfdCBjYWxsOworCQlzdGF0X2NudF90IHdhaXQ7CisJCXN0YXRfY250X3QgYm1hcDsKKwkJc3RhdF9jbnRfdCByZXRyeTsKKwkJc3RhdF9jbnRfdCBpbl9qb3VybmFsX2hpbnQ7CisJCXN0YXRfY250X3QgaW5fam91cm5hbF9ub2hpbnQ7CisJCXN0YXRfY250X3Qgc3RvbGVuOworCX0gc2Nhbl9iaXRtYXA7CisJc3RydWN0IF9fam91cm5hbF9zdGF0cyB7CisJCXN0YXRfY250X3QgaW5fam91cm5hbDsKKwkJc3RhdF9jbnRfdCBpbl9qb3VybmFsX2JpdG1hcDsKKwkJc3RhdF9jbnRfdCBpbl9qb3VybmFsX3JldXNhYmxlOworCQlzdGF0X2NudF90IGxvY2tfam91cm5hbDsKKwkJc3RhdF9jbnRfdCBsb2NrX2pvdXJuYWxfd2FpdDsKKwkJc3RhdF9jbnRfdCBqb3VybmFsX2JlaW5nOworCQlzdGF0X2NudF90IGpvdXJuYWxfcmVsb2NrX3dyaXRlcnM7CisJCXN0YXRfY250X3Qgam91cm5hbF9yZWxvY2tfd2NvdW50OworCQlzdGF0X2NudF90IG1hcmtfZGlydHk7CisJCXN0YXRfY250X3QgbWFya19kaXJ0eV9hbHJlYWR5OworCQlzdGF0X2NudF90IG1hcmtfZGlydHlfbm90am91cm5hbDsKKwkJc3RhdF9jbnRfdCByZXN0b3JlX3ByZXBhcmVkOworCQlzdGF0X2NudF90IHByZXBhcmU7CisJCXN0YXRfY250X3QgcHJlcGFyZV9yZXRyeTsKKwl9IGpvdXJuYWw7CiB9IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Q7CiAjZWxzZQotdHlwZWRlZiBzdHJ1Y3QgcmVpc2VyZnNfcHJvY19pbmZvX2RhdGEKLXt9IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCByZWlzZXJmc19wcm9jX2luZm9fZGF0YSB7Cit9IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Q7CiAjZW5kaWYKIAogLyogcmVpc2VyZnMgdW5pb24gb2YgaW4tY29yZSBzdXBlciBibG9jayBkYXRhICovCi1zdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbwotewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOyAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KLQkJCQkvKiBib3RoIHRoZSBjb21tZW50IGFuZCB0aGUgY2hvaWNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgYXJlIHVuY2xlYXIgZm9yIHNfcnMgLUhhbnMgKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBzX3JzOyAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwotICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqIHNfYXBfYml0bWFwOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpzX2pvdXJuYWwgOwkJLyogcG9pbnRlciB0byBqb3VybmFsIGluZm9ybWF0aW9uICovCi0gICAgdW5zaWduZWQgc2hvcnQgc19tb3VudF9zdGF0ZTsgICAgICAgICAgICAgICAgIC8qIHJlaXNlcmZzIHN0YXRlICh2YWxpZCwgaW52YWxpZCkgKi8KLSAgCi0JCQkJLyogQ29tbWVudD8gLUhhbnMgKi8KLSAgICB2b2lkICgqZW5kX2lvX2hhbmRsZXIpKHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwotICAgIGhhc2hmX3Qgc19oYXNoX2Z1bmN0aW9uOwkvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc29ydCBuYW1lcyBpbiBkaXJlY3RvcnkuIFNldCBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudCAqLwotICAgIHVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQ7CS8qIHJlaXNlcmZzJ3MgbW91bnQgb3B0aW9ucyBhcmUgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKGN1cnJlbnRseSAtIE5PVEFJTCwgTk9MT0csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUExBWU9OTFkpICovCitzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCisJLyogYm90aCB0aGUgY29tbWVudCBhbmQgdGhlIGNob2ljZSBvZgorCSAgIG5hbWUgYXJlIHVuY2xlYXIgZm9yIHNfcnMgLUhhbnMgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnNfcnM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKnNfYXBfYml0bWFwOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpzX2pvdXJuYWw7CS8qIHBvaW50ZXIgdG8gam91cm5hbCBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7CS8qIHJlaXNlcmZzIHN0YXRlICh2YWxpZCwgaW52YWxpZCkgKi8KIAotICAgIHN0cnVjdCB7CQkJLyogVGhpcyBpcyBhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBibG9jayBhbGxvY2F0b3Igb3B0aW9ucyAqLwotCXVuc2lnbmVkIGxvbmcgYml0czsJLyogQml0ZmllbGQgZm9yIGVuYWJsZS9kaXNhYmxlIGtpbmQgb2Ygb3B0aW9ucyAqLwotCXVuc2lnbmVkIGxvbmcgbGFyZ2VfZmlsZV9zaXplOyAvKiBzaXplIHN0YXJ0ZWQgZnJvbSB3aGljaCB3ZSBjb25zaWRlciBmaWxlIHRvIGJlIGEgbGFyZ2Ugb25lKGluIGJsb2NrcykgKi8KLQlpbnQgYm9yZGVyOwkJLyogcGVyY2VudGFnZSBvZiBkaXNrLCBib3JkZXIgdGFrZXMgKi8KLQlpbnQgcHJlYWxsb2NtaW47CS8qIE1pbmltYWwgZmlsZSBzaXplIChpbiBibG9ja3MpIHN0YXJ0aW5nIGZyb20gd2hpY2ggd2UgZG8gcHJlYWxsb2NhdGlvbnMgKi8KLQlpbnQgcHJlYWxsb2NzaXplOwkvKiBOdW1iZXIgb2YgYmxvY2tzIHdlIHRyeSB0byBwcmVhbGxvYyB3aGVuIGZpbGUKLQkJCQkgICByZWFjaGVzIHByZWFsbG9jbWluIHNpemUgKGluIGJsb2Nrcykgb3IKLQkJCQkgICBwcmVhbGxvY19saXN0IGlzIGVtcHR5LiAqLwotICAgIH0gc19hbGxvY19vcHRpb25zOworCS8qIENvbW1lbnQ/IC1IYW5zICovCisJdm9pZCAoKmVuZF9pb19oYW5kbGVyKSAoc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CisJaGFzaGZfdCBzX2hhc2hfZnVuY3Rpb247CS8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gd2hpY2ggaXMgdXNlZAorCQkJCQkgICB0byBzb3J0IG5hbWVzIGluIGRpcmVjdG9yeS4gU2V0IG9uCisJCQkJCSAgIG1vdW50ICovCisJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsJLyogcmVpc2VyZnMncyBtb3VudCBvcHRpb25zIGFyZSBzZXQKKwkJCQkJICAgaGVyZSAoY3VycmVudGx5IC0gTk9UQUlMLCBOT0xPRywKKwkJCQkJICAgUkVQTEFZT05MWSkgKi8KIAotCQkJCS8qIENvbW1lbnQ/IC1IYW5zICovCi0gICAgd2FpdF9xdWV1ZV9oZWFkX3Qgc193YWl0OwotCQkJCS8qIFRvIGJlIG9ic29sZXRlZCBzb29uIGJ5IHBlciBidWZmZXIgc2VhbHMuLiAtSGFucyAqLwotICAgIGF0b21pY190IHNfZ2VuZXJhdGlvbl9jb3VudGVyOyAvLyBpbmNyZWFzZWQgYnkgb25lIGV2ZXJ5IHRpbWUgdGhlCi0gICAgLy8gdHJlZSBnZXRzIHJlLWJhbGFuY2VkCi0gICAgdW5zaWduZWQgbG9uZyBzX3Byb3BlcnRpZXM7ICAgIC8qIEZpbGUgc3lzdGVtIHByb3BlcnRpZXMuIEN1cnJlbnRseSBob2xkcwotCQkJCSAgICAgb24tZGlzayBGUyBmb3JtYXQgKi8KLSAgICAKLSAgICAvKiBzZXNzaW9uIHN0YXRpc3RpY3MgKi8KLSAgICBpbnQgc19rbWFsbG9jczsKLSAgICBpbnQgc19kaXNrX3JlYWRzOwotICAgIGludCBzX2Rpc2tfd3JpdGVzOwotICAgIGludCBzX2ZpeF9ub2RlczsKLSAgICBpbnQgc19kb19iYWxhbmNlOwotICAgIGludCBzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3I7Ci0gICAgaW50IHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhOwotICAgIGludCBzX2JtYXBzOwotICAgIGludCBzX2JtYXBzX3dpdGhvdXRfc2VhcmNoOwotICAgIGludCBzX2RpcmVjdDJpbmRpcmVjdDsKLSAgICBpbnQgc19pbmRpcmVjdDJkaXJlY3Q7CisJc3RydWN0IHsJCS8qIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKwkJdW5zaWduZWQgbG9uZyBiaXRzOwkvKiBCaXRmaWVsZCBmb3IgZW5hYmxlL2Rpc2FibGUga2luZCBvZiBvcHRpb25zICovCisJCXVuc2lnbmVkIGxvbmcgbGFyZ2VfZmlsZV9zaXplOwkvKiBzaXplIHN0YXJ0ZWQgZnJvbSB3aGljaCB3ZSBjb25zaWRlciBmaWxlIHRvIGJlIGEgbGFyZ2Ugb25lKGluIGJsb2NrcykgKi8KKwkJaW50IGJvcmRlcjsJLyogcGVyY2VudGFnZSBvZiBkaXNrLCBib3JkZXIgdGFrZXMgKi8KKwkJaW50IHByZWFsbG9jbWluOwkvKiBNaW5pbWFsIGZpbGUgc2l6ZSAoaW4gYmxvY2tzKSBzdGFydGluZyBmcm9tIHdoaWNoIHdlIGRvIHByZWFsbG9jYXRpb25zICovCisJCWludCBwcmVhbGxvY3NpemU7CS8qIE51bWJlciBvZiBibG9ja3Mgd2UgdHJ5IHRvIHByZWFsbG9jIHdoZW4gZmlsZQorCQkJCQkgICByZWFjaGVzIHByZWFsbG9jbWluIHNpemUgKGluIGJsb2Nrcykgb3IKKwkJCQkJICAgcHJlYWxsb2NfbGlzdCBpcyBlbXB0eS4gKi8KKwl9IHNfYWxsb2Nfb3B0aW9uczsKKworCS8qIENvbW1lbnQ/IC1IYW5zICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc193YWl0OworCS8qIFRvIGJlIG9ic29sZXRlZCBzb29uIGJ5IHBlciBidWZmZXIgc2VhbHMuLiAtSGFucyAqLworCWF0b21pY190IHNfZ2VuZXJhdGlvbl9jb3VudGVyOwkvLyBpbmNyZWFzZWQgYnkgb25lIGV2ZXJ5IHRpbWUgdGhlCisJLy8gdHJlZSBnZXRzIHJlLWJhbGFuY2VkCisJdW5zaWduZWQgbG9uZyBzX3Byb3BlcnRpZXM7CS8qIEZpbGUgc3lzdGVtIHByb3BlcnRpZXMuIEN1cnJlbnRseSBob2xkcworCQkJCQkgICBvbi1kaXNrIEZTIGZvcm1hdCAqLworCisJLyogc2Vzc2lvbiBzdGF0aXN0aWNzICovCisJaW50IHNfa21hbGxvY3M7CisJaW50IHNfZGlza19yZWFkczsKKwlpbnQgc19kaXNrX3dyaXRlczsKKwlpbnQgc19maXhfbm9kZXM7CisJaW50IHNfZG9fYmFsYW5jZTsKKwlpbnQgc191bm5lZWRlZF9sZWZ0X25laWdoYm9yOworCWludCBzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYTsKKwlpbnQgc19ibWFwczsKKwlpbnQgc19ibWFwc193aXRob3V0X3NlYXJjaDsKKwlpbnQgc19kaXJlY3QyaW5kaXJlY3Q7CisJaW50IHNfaW5kaXJlY3QyZGlyZWN0OwogCS8qIHNldCB1cCB3aGVuIGl0J3Mgb2sgZm9yIHJlaXNlcmZzX3JlYWRfaW5vZGUyKCkgdG8gcmVhZCBmcm9tCiAJICAgZGlzayBpbm9kZSB3aXRoIG5saW5rPT0wLiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgZHVyaW5nCiAJICAgZmluaXNoX3VuZmluaXNoZWQoKSBwcm9jZXNzaW5nIGF0IG1vdW50IHRpbWUgKi8KLSAgICBpbnQgc19pc191bmxpbmtlZF9vazsKLSAgICByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90IHNfcHJvY19pbmZvX2RhdGE7Ci0gICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jZGlyOwotICAgIGludCByZXNlcnZlZF9ibG9ja3M7IC8qIGFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgZm9yIGZ1cnRoZXIgYWxsb2NhdGlvbnMgKi8KLSAgICBzcGlubG9ja190IGJpdG1hcF9sb2NrOyAvKiB0aGlzIGxvY2sgb24gbm93IG9ubHkgdXNlZCB0byBwcm90ZWN0IHJlc2VydmVkX2Jsb2NrcyB2YXJpYWJsZSAqLwotICAgIHN0cnVjdCBkZW50cnkgKnByaXZfcm9vdDsgLyogcm9vdCBvZiAvLnJlaXNlcmZzX3ByaXYgKi8KLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YXR0cl9yb290OyAvKiByb290IG9mIC8ucmVpc2VyZnNfcHJpdi8ueGEgKi8KLSAgICBzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX2Rpcl9zZW07CisJaW50IHNfaXNfdW5saW5rZWRfb2s7CisJcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdCBzX3Byb2NfaW5mb19kYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY2RpcjsKKwlpbnQgcmVzZXJ2ZWRfYmxvY2tzOwkvKiBhbW91bnQgb2YgYmxvY2tzIHJlc2VydmVkIGZvciBmdXJ0aGVyIGFsbG9jYXRpb25zICovCisJc3BpbmxvY2tfdCBiaXRtYXBfbG9jazsJLyogdGhpcyBsb2NrIG9uIG5vdyBvbmx5IHVzZWQgdG8gcHJvdGVjdCByZXNlcnZlZF9ibG9ja3MgdmFyaWFibGUgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3Q7CS8qIHJvb3Qgb2YgLy5yZWlzZXJmc19wcml2ICovCisJc3RydWN0IGRlbnRyeSAqeGF0dHJfcm9vdDsJLyogcm9vdCBvZiAvLnJlaXNlcmZzX3ByaXYvLnhhICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9kaXJfc2VtOwogCi0gICAgaW50IGpfZXJybm87CisJaW50IGpfZXJybm87CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwotICAgIGludCBzX2pxdW90YV9mbXQ7CisJY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOworCWludCBzX2pxdW90YV9mbXQ7CiAjZW5kaWYKIH07CiAKQEAgLTQyMiwxNCArNDE4LDE0IEBACiAKIGVudW0gcmVpc2VyZnNfbW91bnRfb3B0aW9ucyB7CiAvKiBNb3VudCBvcHRpb25zICovCi0gICAgUkVJU0VSRlNfTEFSR0VUQUlMLCAgLyogbGFyZ2UgdGFpbHMgd2lsbCBiZSBjcmVhdGVkIGluIGEgc2Vzc2lvbiAqLwotICAgIFJFSVNFUkZTX1NNQUxMVEFJTCwgIC8qIHNtYWxsIChmb3IgZmlsZXMgbGVzcyB0aGFuIGJsb2NrIHNpemUpIHRhaWxzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNlc3Npb24gKi8KLSAgICBSRVBMQVlPTkxZLCAvKiByZXBsYXkgam91cm5hbCBhbmQgcmV0dXJuIDAuIFVzZSBieSBmc2NrICovCi0gICAgUkVJU0VSRlNfQ09OVkVSVCwgICAgLyogLW8gY29udjogY2F1c2VzIGNvbnZlcnNpb24gb2Ygb2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3VwZXIgYmxvY2sgdG8gdGhlIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LiBJZiBub3Qgc3BlY2lmaWVkIC0gb2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gd2lsbCBiZSBkZWFsdCB3aXRoIGluIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbm5lciBvZiAzLjUueCAqLworCVJFSVNFUkZTX0xBUkdFVEFJTCwJLyogbGFyZ2UgdGFpbHMgd2lsbCBiZSBjcmVhdGVkIGluIGEgc2Vzc2lvbiAqLworCVJFSVNFUkZTX1NNQUxMVEFJTCwJLyogc21hbGwgKGZvciBmaWxlcyBsZXNzIHRoYW4gYmxvY2sgc2l6ZSkgdGFpbHMgd2lsbCBiZSBjcmVhdGVkIGluIGEgc2Vzc2lvbiAqLworCVJFUExBWU9OTFksCQkvKiByZXBsYXkgam91cm5hbCBhbmQgcmV0dXJuIDAuIFVzZSBieSBmc2NrICovCisJUkVJU0VSRlNfQ09OVkVSVCwJLyogLW8gY29udjogY2F1c2VzIGNvbnZlcnNpb24gb2Ygb2xkCisJCQkJICAgZm9ybWF0IHN1cGVyIGJsb2NrIHRvIHRoZSBuZXcKKwkJCQkgICBmb3JtYXQuIElmIG5vdCBzcGVjaWZpZWQgLSBvbGQKKwkJCQkgICBwYXJ0aXRpb24gd2lsbCBiZSBkZWFsdCB3aXRoIGluIGEKKwkJCQkgICBtYW5uZXIgb2YgMy41LnggKi8KIAogLyogLW8gaGFzaD17dGVhLCBydXBhc292LCByNSwgZGV0ZWN0fSBpcyBtZWFudCBmb3IgcHJvcGVybHkgbW91bnRpbmcgCiAqKiByZWlzZXJmcyBkaXNrcyBmcm9tIDMuNS4xOSBvciBlYXJsaWVyLiAgOTklIG9mIHRoZSB0aW1lLCB0aGlzIG9wdGlvbgpAQCAtNDM5LDQxICs0MzUsNDEgQEAKICoqIHRoZSBleGlzdGluZyBoYXNoIG9uIHRoZSBGUywgc28gaWYgeW91IGhhdmUgYSB0ZWEgaGFzaCBkaXNrLCBhbmQgbW91bnQKICoqIHdpdGggLW8gaGFzaD1ydXBhc292LCB0aGUgbW91bnQgd2lsbCBmYWlsLgogKi8KLSAgICBGT1JDRV9URUFfSEFTSCwgICAgICAvKiB0cnkgdG8gZm9yY2UgdGVhIGhhc2ggb24gbW91bnQgKi8KLSAgICBGT1JDRV9SVVBBU09WX0hBU0gsICAvKiB0cnkgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIG9uIG1vdW50ICovCi0gICAgRk9SQ0VfUjVfSEFTSCwgICAgICAgLyogdHJ5IHRvIGZvcmNlIHJ1cGFzb3YgaGFzaCBvbiBtb3VudCAqLwotICAgIEZPUkNFX0hBU0hfREVURUNULCAgIC8qIHRyeSB0byBkZXRlY3QgaGFzaCBmdW5jdGlvbiBvbiBtb3VudCAqLworCUZPUkNFX1RFQV9IQVNILAkJLyogdHJ5IHRvIGZvcmNlIHRlYSBoYXNoIG9uIG1vdW50ICovCisJRk9SQ0VfUlVQQVNPVl9IQVNILAkvKiB0cnkgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIG9uIG1vdW50ICovCisJRk9SQ0VfUjVfSEFTSCwJCS8qIHRyeSB0byBmb3JjZSBydXBhc292IGhhc2ggb24gbW91bnQgKi8KKwlGT1JDRV9IQVNIX0RFVEVDVCwJLyogdHJ5IHRvIGRldGVjdCBoYXNoIGZ1bmN0aW9uIG9uIG1vdW50ICovCiAKLSAgICBSRUlTRVJGU19EQVRBX0xPRywKLSAgICBSRUlTRVJGU19EQVRBX09SREVSRUQsCi0gICAgUkVJU0VSRlNfREFUQV9XUklURUJBQ0ssCisJUkVJU0VSRlNfREFUQV9MT0csCisJUkVJU0VSRlNfREFUQV9PUkRFUkVELAorCVJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLLAogCiAvKiB1c2VkIGZvciB0ZXN0aW5nIGV4cGVyaW1lbnRhbCBmZWF0dXJlcywgbWFrZXMgYmVuY2htYXJraW5nIG5ldwogICAgZmVhdHVyZXMgd2l0aCBhbmQgd2l0aG91dCBtb3JlIGNvbnZlbmllbnQsIHNob3VsZCBuZXZlciBiZSB1c2VkIGJ5CiAgICB1c2VycyBpbiBhbnkgY29kZSBzaGlwcGVkIHRvIHVzZXJzIChpZGVhbGx5KSAqLwogCi0gICAgUkVJU0VSRlNfTk9fQk9SREVSLAotICAgIFJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT04sCi0gICAgUkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT04sCi0gICAgUkVJU0VSRlNfQVRUUlMsCi0gICAgUkVJU0VSRlNfWEFUVFJTLAotICAgIFJFSVNFUkZTX1hBVFRSU19VU0VSLAotICAgIFJFSVNFUkZTX1BPU0lYQUNMLAotICAgIFJFSVNFUkZTX0JBUlJJRVJfTk9ORSwKLSAgICBSRUlTRVJGU19CQVJSSUVSX0ZMVVNILAorCVJFSVNFUkZTX05PX0JPUkRFUiwKKwlSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLAorCVJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OLAorCVJFSVNFUkZTX0FUVFJTLAorCVJFSVNFUkZTX1hBVFRSUywKKwlSRUlTRVJGU19YQVRUUlNfVVNFUiwKKwlSRUlTRVJGU19QT1NJWEFDTCwKKwlSRUlTRVJGU19CQVJSSUVSX05PTkUsCisJUkVJU0VSRlNfQkFSUklFUl9GTFVTSCwKIAotICAgIC8qIEFjdGlvbnMgb24gZXJyb3IgKi8KLSAgICBSRUlTRVJGU19FUlJPUl9QQU5JQywKLSAgICBSRUlTRVJGU19FUlJPUl9STywKLSAgICBSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKKwkvKiBBY3Rpb25zIG9uIGVycm9yICovCisJUkVJU0VSRlNfRVJST1JfUEFOSUMsCisJUkVJU0VSRlNfRVJST1JfUk8sCisJUkVJU0VSRlNfRVJST1JfQ09OVElOVUUsCiAKLSAgICBSRUlTRVJGU19RVU9UQSwJCS8qIFNvbWUgcXVvdGEgb3B0aW9uIHNwZWNpZmllZCAqLworCVJFSVNFUkZTX1FVT1RBLAkJLyogU29tZSBxdW90YSBvcHRpb24gc3BlY2lmaWVkICovCiAKLSAgICBSRUlTRVJGU19URVNUMSwKLSAgICBSRUlTRVJGU19URVNUMiwKLSAgICBSRUlTRVJGU19URVNUMywKLSAgICBSRUlTRVJGU19URVNUNCwKLSAgICBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQsCisJUkVJU0VSRlNfVEVTVDEsCisJUkVJU0VSRlNfVEVTVDIsCisJUkVJU0VSRlNfVEVTVDMsCisJUkVJU0VSRlNfVEVTVDQsCisJUkVJU0VSRlNfVU5TVVBQT1JURURfT1BULAogfTsKIAogI2RlZmluZSByZWlzZXJmc19yNV9oYXNoKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBGT1JDRV9SNV9IQVNIKSkKQEAgLTUwNCwxOCArNTAwLDE3IEBACiAjZGVmaW5lIHJlaXNlcmZzX2Vycm9yX3BhbmljKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQykpCiAjZGVmaW5lIHJlaXNlcmZzX2Vycm9yX3JvKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBSRUlTRVJGU19FUlJPUl9STykpCiAKLXZvaWQgcmVpc2VyZnNfZmlsZV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgbGlzdCk7Cit2b2lkIHJlaXNlcmZzX2ZpbGVfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBsaXN0KTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByZWlzZXJmc19mc190eXBlOwotaW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZykgOworaW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiAKICNkZWZpbmUgQ0FSUllfT04gICAgICAgICAgICAgICAgMAogI2RlZmluZSBTQ0hFRFVMRV9PQ0NVUlJFRCAgICAgICAxCiAKLQogI2RlZmluZSBTQl9CVUZGRVJfV0lUSF9TQihzKSAoUkVJU0VSRlNfU0IocyktPnNfc2JoKQogI2RlZmluZSBTQl9KT1VSTkFMKHMpIChSRUlTRVJGU19TQihzKS0+c19qb3VybmFsKQogI2RlZmluZSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhzKSAoU0JfSk9VUk5BTChzKS0+al8xc3RfcmVzZXJ2ZWRfYmxvY2spCi0jZGVmaW5lIFNCX0pPVVJOQUxfTEVOX0ZSRUUocykgKFNCX0pPVVJOQUwocyktPmpfam91cm5hbF9sZW5fZnJlZSkgCisjZGVmaW5lIFNCX0pPVVJOQUxfTEVOX0ZSRUUocykgKFNCX0pPVVJOQUwocyktPmpfam91cm5hbF9sZW5fZnJlZSkKICNkZWZpbmUgU0JfQVBfQklUTUFQKHMpIChSRUlTRVJGU19TQihzKS0+c19hcF9iaXRtYXApCiAKICNkZWZpbmUgU0JfRElTS19KT1VSTkFMX0hFQUQocykgKFNCX0pPVVJOQUwocyktPmpfaGVhZGVyX2JoLT4pCkBAIC01MjUsMTMgKzUyMCwxNCBAQAogICovCiBzdGF0aWMgaW5saW5lIGNoYXIgKnJlaXNlcmZzX2JkZXZuYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICAgICAgcmV0dXJuIChzID09IE5VTEwpID8gIk51bGwgc3VwZXJibG9jayIgOiBzIC0+IHNfaWQ7CisJcmV0dXJuIChzID09IE5VTEwpID8gIk51bGwgc3VwZXJibG9jayIgOiBzLT5zX2lkOwogfQogCiAjZGVmaW5lIHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSAodW5saWtlbHkgKF9fcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkpCi1zdGF0aWMgaW5saW5lIGludCBfX3JlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwpCitzdGF0aWMgaW5saW5lIGludCBfX3JlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbAorCQkJCQkJKmpvdXJuYWwpCiB7Ci0gICAgcmV0dXJuIHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKwlyZXR1cm4gdGVzdF9iaXQoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSk7CiB9CiAKLSNlbmRpZgkvKiBfTElOVVhfUkVJU0VSX0ZTX1NCICovCisjZW5kaWYJCQkJLyogX0xJTlVYX1JFSVNFUl9GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCmluZGV4IDkyNDRjNTcuLmM4NDM1NGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX3hhdHRyLmgKQEAgLTcsNDggKzcsNDggQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogCiAvKiBNYWdpYyB2YWx1ZSBpbiBoZWFkZXIgKi8KLSNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfTUFHSUMgMHg1MjQ2NTg0MSAvKiAiUkZYQSIgKi8KKyNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfTUFHSUMgMHg1MjQ2NTg0MQkvKiAiUkZYQSIgKi8KIAogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciB7Ci0gICAgX19sZTMyIGhfbWFnaWM7ICAgICAgICAgICAgICAvKiBtYWdpYyBudW1iZXIgZm9yIGlkZW50aWZpY2F0aW9uICovCi0gICAgX19sZTMyIGhfaGFzaDsgICAgICAgICAgICAgICAvKiBoYXNoIG9mIHRoZSB2YWx1ZSAqLworCV9fbGUzMiBoX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLworCV9fbGUzMiBoX2hhc2g7CQkvKiBoYXNoIG9mIHRoZSB2YWx1ZSAqLwogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgewogCWNoYXIgKnByZWZpeDsKLSAgICAgICAgaW50ICgqaW5pdCkodm9pZCk7Ci0gICAgICAgIHZvaWQgKCpleGl0KSh2b2lkKTsKLQlpbnQgKCpnZXQpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLQkJICAgc2l6ZV90IHNpemUpOwotCWludCAoKnNldCkoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAotCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLQlpbnQgKCpkZWwpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOwotICAgICAgICBpbnQgKCpsaXN0KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KTsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBoYW5kbGVyczsKKwlpbnQgKCppbml0KSAodm9pZCk7CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKwlpbnQgKCpnZXQpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLAorCQkgICAgc2l6ZV90IHNpemUpOworCWludCAoKnNldCkgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisJCSAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKKwlpbnQgKCpkZWwpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CisJaW50ICgqbGlzdCkgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJICAgICBjaGFyICpvdXQpOworCXN0cnVjdCBsaXN0X2hlYWQgaGFuZGxlcnM7CiB9OwogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIKICNkZWZpbmUgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpIElTX1BSSVZBVEUoaW5vZGUpCiAjZGVmaW5lIGhhc194YXR0cl9kaXIoaW5vZGUpIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfaGFzX3hhdHRyX2RpcikKLXNzaXplX3QgcmVpc2VyZnNfZ2V0eGF0dHIgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IHJlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLXNzaXplX3QgcmVpc2VyZnNfbGlzdHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IHJlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOwotaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycyk7Ci1pbnQgcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKTsKLWludCByZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwotaW50IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3NpemVfdCByZWlzZXJmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworaW50IHJlaXNlcmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCByZWlzZXJmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2ludCByZWlzZXJmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgcmVpc2VyZnNfY2hvd25feGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMpOworaW50IHJlaXNlcmZzX3hhdHRyX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKTsKK2ludCByZWlzZXJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssCisJCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCi1pbnQgcmVpc2VyZnNfeGF0dHJfZGVsIChzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqKTsKLWludCByZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKLWludCByZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGludCk7CitpbnQgcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICopOworaW50IHJlaXNlcmZzX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitpbnQgcmVpc2VyZnNfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOwogCiBleHRlcm4gc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdXNlcl9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHRydXN0ZWRfaGFuZGxlcjsKQEAgLTU2LDU3ICs1Niw0OCBAQAogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHNlY3VyaXR5X2hhbmRsZXI7CiAjZW5kaWYKIAotaW50IHJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKSBfX2luaXQ7Ci12b2lkIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKHZvaWQpOworaW50IHJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzKHZvaWQpIF9faW5pdDsKK3ZvaWQgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKTsKIAotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgZG93bl93cml0ZSAoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKKwlkb3duX3dyaXRlKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgdXBfd3JpdGUgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJdXBfd3JpdGUoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLSAgICBkb3duX3JlYWQgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJZG93bl9yZWFkKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgdXBfcmVhZCAoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKKwl1cF9yZWFkKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgZG93bl93cml0ZSAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWRvd25fd3JpdGUoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgdXBfd3JpdGUgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwl1cF93cml0ZSgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBkb3duX3JlYWQgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlkb3duX3JlYWQoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgdXBfcmVhZCAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXVwX3JlYWQoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfUFJJVkFURTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX1BSSVZBVEU7CiB9CiAKICNlbHNlCkBAIC0xMjcsMTMgKzExOCwyMCBAQAogI2RlZmluZSByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycygpIDAKICNkZWZpbmUgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycygpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsgcmV0dXJuIDA7IH07Ci1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19jaG93bl94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMpIHsgcmV0dXJuIDA7IH07Ci1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc194YXR0cl9pbml0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW91bnRfZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpOyAvKiB0byBiZSBzdXJlICovCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfY2hvd25feGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBpYXR0ciAqYXR0cnMpCit7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW91bnRfZmxhZ3MpCit7CisJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpOwkvKiB0byBiZSBzdXJlICovCisJcmV0dXJuIDA7CiB9OwogI2VuZGlmCiAKLSNlbmRpZiAgLyogX19LRVJORUxfXyAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmluZGV4IGQwMjE4ODguLjY1N2MwNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtMzYzLDYgKzM2Myw4IEBACiBzdHJ1Y3QgcnRhX3Nlc3Npb24KIHsKIAlfX3U4CXByb3RvOworCV9fdTgJcGFkMTsKKwlfX3UxNglwYWQyOwogCiAJdW5pb24gewogCQlzdHJ1Y3QgewpAQCAtNjM1LDEwICs2MzcsMTMgQEAKIHN0cnVjdCBwcmVmaXhtc2cKIHsKIAl1bnNpZ25lZCBjaGFyCXByZWZpeF9mYW1pbHk7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAlwcmVmaXhfcGFkMjsKIAlpbnQJCXByZWZpeF9pZmluZGV4OwogCXVuc2lnbmVkIGNoYXIJcHJlZml4X3R5cGU7CiAJdW5zaWduZWQgY2hhcglwcmVmaXhfbGVuOwogCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3BhZDM7CiB9OwogCiBlbnVtIApAQCAtODk4LDcgKzkwMyw5IEBACiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBhdHRybGVuKSwgZGF0YSwgYXR0cmxlbik7IH0pCiAKICNkZWZpbmUgUlRBX1BVVF9OT0hEUihza2IsIGF0dHJsZW4sIGRhdGEpIFwKLQlSVEFfQVBQRU5EKHNrYiwgUlRBX0FMSUdOKGF0dHJsZW4pLCBkYXRhKQorKHsJUlRBX0FQUEVORChza2IsIFJUQV9BTElHTihhdHRybGVuKSwgZGF0YSk7IFwKKwltZW1zZXQoc2tiLT50YWlsIC0gKFJUQV9BTElHTihhdHRybGVuKSAtIGF0dHJsZW4pLCAwLCBcCisJICAgICAgIFJUQV9BTElHTihhdHRybGVuKSAtIGF0dHJsZW4pOyB9KQogCiAjZGVmaW5lIFJUQV9QVVRfVTgoc2tiLCBhdHRydHlwZSwgdmFsdWUpIFwKICh7CXU4IF90bXAgPSAodmFsdWUpOyBcCkBAIC05NzgsNiArOTg1LDcgQEAKIAlydGEgPSAoc3RydWN0IHJ0YXR0ciopc2tiX3B1dChza2IsIFJUQV9BTElHTihzaXplKSk7CiAJcnRhLT5ydGFfdHlwZSA9IGF0dHJ0eXBlOwogCXJ0YS0+cnRhX2xlbiA9IHNpemU7CisJbWVtc2V0KFJUQV9EQVRBKHJ0YSkgKyBhdHRybGVuLCAwLCBSVEFfQUxJR04oc2l6ZSkgLSBzaXplKTsKIAlyZXR1cm4gcnRhOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggOTUzMGIxOS4uZGVjNTgyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNDEwLDYgKzQxMCwxMCBAQAogCWF0b21pY190IHByb2Nlc3NlczsJLyogSG93IG1hbnkgcHJvY2Vzc2VzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCiAJYXRvbWljX3QgZmlsZXM7CQkvKiBIb3cgbWFueSBvcGVuIGZpbGVzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCiAJYXRvbWljX3Qgc2lncGVuZGluZzsJLyogSG93IG1hbnkgcGVuZGluZyBzaWduYWxzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlhdG9taWNfdCBpbm90aWZ5X3dhdGNoZXM7IC8qIEhvdyBtYW55IGlub3RpZnkgd2F0Y2hlcyBkb2VzIHRoaXMgdXNlciBoYXZlPyAqLworCWF0b21pY190IGlub3RpZnlfZGV2czsJLyogSG93IG1hbnkgaW5vdGlmeSBkZXZzIGRvZXMgdGhpcyB1c2VyIGhhdmUgb3BlbmVkPyAqLworI2VuZGlmCiAJLyogcHJvdGVjdGVkIGJ5IG1xX2xvY2sJKi8KIAl1bnNpZ25lZCBsb25nIG1xX2J5dGVzOwkvKiBIb3cgbWFueSBieXRlcyBjYW4gYmUgYWxsb2NhdGVkIHRvIG1xdWV1ZT8gKi8KIAl1bnNpZ25lZCBsb25nIGxvY2tlZF9zaG07IC8qIEhvdyBtYW55IHBhZ2VzIG9mIG1sb2NrZWQgc2htID8gKi8KQEAgLTYwOCw2ICs2MTIsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcnVuX2xpc3Q7CiAJcHJpb19hcnJheV90ICphcnJheTsKIAorCXVuc2lnbmVkIHNob3J0IGlvcHJpbzsKKwogCXVuc2lnbmVkIGxvbmcgc2xlZXBfYXZnOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIGxhc3RfcmFuOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF90aW1lOyAvKiBzY2hlZF9jbG9jayB0aW1lIHNwZW50IHJ1bm5pbmcgKi8KQEAgLTc2Myw2ICs3NjksNyBAQAogCW5vZGVtYXNrX3QgbWVtc19hbGxvd2VkOwogCWludCBjcHVzZXRfbWVtc19nZW5lcmF0aW9uOwogI2VuZGlmCisJYXRvbWljX3QgZnNfZXhjbDsJLyogaG9sZGluZyBmcyBleGNsdXNpdmUgcmVzb3VyY2VzICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHBpZF90IHByb2Nlc3NfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCkBAIC0xMTEyLDcgKzExMTksOCBAQAogCiAvKgogICogUHJvdGVjdHMgLT5mcywgLT5maWxlcywgLT5tbSwgLT5wdHJhY2UsIC0+Z3JvdXBfaW5mbywgLT5jb21tLCBrZXlyaW5nCi0gKiBzdWJzY3JpcHRpb25zIGFuZCBzeW5jaHJvbmlzZXMgd2l0aCB3YWl0NCgpLiAgQWxzbyB1c2VkIGluIHByb2Nmcy4KKyAqIHN1YnNjcmlwdGlvbnMgYW5kIHN5bmNocm9uaXNlcyB3aXRoIHdhaXQ0KCkuICBBbHNvIHVzZWQgaW4gcHJvY2ZzLiAgQWxzbworICogcGlucyB0aGUgZmluYWwgcmVsZWFzZSBvZiB0YXNrLmlvX2NvbnRleHQuCiAgKgogICogTmVzdHMgYm90aCBpbnNpZGUgYW5kIG91dHNpZGUgb2YgcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKS4KICAqIEl0IG11c3Qgbm90IGJlIG5lc3RlZCB3aXRoIHdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKaW5kZXggM2EyNzAyYi4uZGM4OTExNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKQEAgLTE5LDYgKzE5LDExIEBACiAJCV9fc2VjdXJlX2NvbXB1dGluZyh0aGlzX3N5c2NhbGwpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQoreworCXJldHVybiB1bmxpa2VseSh0ZXN0X3RpX3RocmVhZF9mbGFnKHRpLCBUSUZfU0VDQ09NUCkpOworfQorCiAjZWxzZSAvKiBDT05GSUdfU0VDQ09NUCAqLwogCiAjaWYgKF9fR05VQ19fID4gMikKQEAgLTI4LDYgKzMzLDExIEBACiAjZW5kaWYKIAogI2RlZmluZSBzZWN1cmVfY29tcHV0aW5nKHgpIGRvIHsgfSB3aGlsZSAoMCkKKy8qIHN0YXRpYyBpbmxpbmUgdG8gcHJlc2VydmUgdHlwZWNoZWNraW5nICovCitzdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQoreworCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKaW5kZXggMDAxNDU4Mi4uOWYyZDg1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCkBAIC0xNzQsOSArMTc0LDExIEBACiAKIAogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAvKiBFeHBvcnQgdG8gYWxsb3cgUENNQ0lBIHRvIHVzZSB0aGlzIC0gRGF2ZSBIaW5kcyAqLwotZXh0ZXJuIGludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSk7Ci1leHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3NlcmlhbChpbnQgbGluZSk7CitleHRlcm4gaW50IF9fZGVwcmVjYXRlZCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSk7CitleHRlcm4gdm9pZCBfX2RlcHJlY2F0ZWQgdW5yZWdpc3Rlcl9zZXJpYWwoaW50IGxpbmUpOwogCiAvKiBBbGxvdyBhcmNoaXRlY3R1cmVzIHRvIG92ZXJyaWRlIGVudHJpZXMgaW4gc2VyaWFsODI1MF9wb3J0c1tdIGF0IHJ1biB0aW1lOiAqLwogc3RydWN0IHVhcnRfcG9ydDsJLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxQLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbFAuaAppbmRleCAyMzA3ZjExLi4yYjJmMzVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbFAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbFAuaApAQCAtMTksNyArMTksNiBAQAogICogRm9yIGRlZmluaXRpb25zIG9mIHRoZSBmbGFncyBmaWVsZCwgc2VlIHR0eS5oCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKaW5kZXggODIzMTgxYS4uM2UzYzFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaApAQCAtMjIsNiArMjIsNyBAQAogCXVuc2lnbmVkIGludAl1YXJ0Y2xrOwkvKiBVQVJUIGNsb2NrIHJhdGUgKi8KIAl1bnNpZ25lZCBjaGFyCXJlZ3NoaWZ0OwkvKiByZWdpc3RlciBzaGlmdCAqLwogCXVuc2lnbmVkIGNoYXIJaW90eXBlOwkJLyogVVBJT18qICovCisJdW5zaWduZWQgY2hhcglodWI2OwogCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIFVQRl8qIGZsYWdzICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggZDYwMjVhZi4uMzBiNjRmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0zNTksOCArMzYwLDggQEAKICAqLwogaW50IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqdWFydCk7CiB2b2lkIHVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICp1YXJ0KTsKLXZvaWQgdWFydF91bnJlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpyZWcsIGludCBsaW5lKTsKLWludCB1YXJ0X3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpyZWcsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwordm9pZCBfX2RlcHJlY2F0ZWQgdWFydF91bnJlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpyZWcsIGludCBsaW5lKTsKK2ludCBfX2RlcHJlY2F0ZWQgdWFydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqcmVnLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIGludCB1YXJ0X2FkZF9vbmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKnJlZywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiBpbnQgdWFydF9yZW1vdmVfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpyZWcsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogaW50IHVhcnRfbWF0Y2hfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0MSwgc3RydWN0IHVhcnRfcG9ydCAqcG9ydDIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IGEyZDNiOWEuLmFhNGQ2NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTgzLDYgKzgzLDcgQEAKIH0KIAogdm9pZCBzZXJpb191bnJlZ2lzdGVyX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7Cit2b2lkIHNlcmlvX3VucmVnaXN0ZXJfY2hpbGRfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHZvaWQgX19zZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CiBzdGF0aWMgaW5saW5lIHZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9wb3J0X2RlbGF5ZWQoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKQEAgLTE1Myw2ICsxNTQsMTEgQEAKIAlyZXR1cm4gZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJpby0+ZHJ2X3NlbSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXJpb19waW5fZHJpdmVyX3VuaW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCWRvd24oJnNlcmlvLT5kcnZfc2VtKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNlcmlvX3VucGluX2RyaXZlcihzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQogewogCXVwKCZzZXJpby0+ZHJ2X3NlbSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA0MTZhMmU0Li4wMDYxYzk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTE4Myw3ICsxODMsNiBAQAogICoJQHByaW9yaXR5OiBQYWNrZXQgcXVldWVpbmcgcHJpb3JpdHkKICAqCUB1c2VyczogVXNlciBjb3VudCAtIHNlZSB7ZGF0YWdyYW0sdGNwfS5jCiAgKglAcHJvdG9jb2w6IFBhY2tldCBwcm90b2NvbCBmcm9tIGRyaXZlcgotICoJQHNlY3VyaXR5OiBTZWN1cml0eSBsZXZlbCBvZiBwYWNrZXQKICAqCUB0cnVlc2l6ZTogQnVmZmVyIHNpemUgCiAgKglAaGVhZDogSGVhZCBvZiBidWZmZXIKICAqCUBkYXRhOiBEYXRhIGhlYWQgcG9pbnRlcgpAQCAtMjQ5LDE4ICsyNDgsMTggQEAKIAkJCQlkYXRhX2xlbiwKIAkJCQltYWNfbGVuLAogCQkJCWNzdW07Ci0JdW5zaWduZWQgY2hhcgkJbG9jYWxfZGYsCi0JCQkJY2xvbmVkOjEsCi0JCQkJbm9oZHI6MSwKLQkJCQlwa3RfdHlwZSwKLQkJCQlpcF9zdW1tZWQ7CiAJX191MzIJCQlwcmlvcml0eTsKLQl1bnNpZ25lZCBzaG9ydAkJcHJvdG9jb2wsCi0JCQkJc2VjdXJpdHk7CisJX191OAkJCWxvY2FsX2RmOjEsCisJCQkJY2xvbmVkOjEsCisJCQkJaXBfc3VtbWVkOjIsCisJCQkJbm9oZHI6MTsKKwkJCQkvKiAzIGJpdHMgc3BhcmUgKi8KKwlfX3U4CQkJcGt0X3R5cGU7CisJX191MTYJCQlwcm90b2NvbDsKIAogCXZvaWQJCQkoKmRlc3RydWN0b3IpKHN0cnVjdCBza19idWZmICpza2IpOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLSAgICAgICAgdW5zaWduZWQgbG9uZwkJbmZtYXJrOworCXVuc2lnbmVkIGxvbmcJCW5mbWFyazsKIAlfX3UzMgkJCW5mY2FjaGU7CiAJX191MzIJCQluZmN0aW5mbzsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrCSpuZmN0OwpAQCAtMzAxLDIwICszMDAsMjYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIGV4dGVybiB2b2lkCSAgICAgICBfX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpb3JpdHkpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICphbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsCisJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYl9mcm9tX2NhY2hlKGttZW1fY2FjaGVfdCAqY3AsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHByaW9yaXR5KTsKKwkJCQkJICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCQkgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkCSAgICAgICBrZnJlZV9za2JtZW0oc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJpb3JpdHkpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfY29weShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJpb3JpdHkpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICpwc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzayk7CiBleHRlcm4gaW50CSAgICAgICBwc2tiX2V4cGFuZF9oZWFkKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWludCBuaGVhZCwgaW50IG50YWlsLCBpbnQgZ2ZwX21hc2spOworCQkJCQlpbnQgbmhlYWQsIGludCBudGFpbCwKKwkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3JlYWxsb2NfaGVhZHJvb20oc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgIHVuc2lnbmVkIGludCBoZWFkcm9vbSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5X2V4cGFuZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICBpbnQgbmV3aGVhZHJvb20sIGludCBuZXd0YWlscm9vbSwKLQkJCQkgICAgICAgaW50IHByaW9yaXR5KTsKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqCQlza2JfcGFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBwYWQpOwogI2RlZmluZSBkZXZfa2ZyZWVfc2tiKGEpCWtmcmVlX3NrYihhKQogZXh0ZXJuIHZvaWQJICAgICAgc2tiX292ZXJfcGFuaWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbiwKQEAgLTQ2NSw3ICs0NzAsOCBAQAogICoKICAqCU5VTEwgaXMgcmV0dXJuZWQgb24gYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza2Jfc2hhcmVfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByaSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNrYl9zaGFyZV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpKQogewogCW1pZ2h0X3NsZWVwX2lmKHByaSAmIF9fR0ZQX1dBSVQpOwogCWlmIChza2Jfc2hhcmVkKHNrYikpIHsKQEAgLTQ5Niw3ICs1MDIsOCBAQAogICoKICAqCSVOVUxMIGlzIHJldHVybmVkIG9uIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3Vuc2hhcmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByaSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNrYl91bnNoYXJlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaSkKIHsKIAltaWdodF9zbGVlcF9pZihwcmkgJiBfX0dGUF9XQUlUKTsKIAlpZiAoc2tiX2Nsb25lZChza2IpKSB7CkBAIC0xMDAyLDcgKzEwMDksNyBAQAogICoJJU5VTEwgaXMgcmV0dXJuZWQgaW4gdGhlcmUgaXMgbm8gZnJlZSBtZW1vcnkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fZGV2X2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgbGVuZ3RoLAotCQkJCQkgICAgICBpbnQgZ2ZwX21hc2spCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIDE2LCBnZnBfbWFzayk7CiAJaWYgKGxpa2VseShza2IpKQpAQCAtMTExNSw4ICsxMTIyLDggQEAKICAqCUlmIHRoZXJlIGlzIG5vIGZyZWUgbWVtb3J5IC1FTk9NRU0gaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB6ZXJvCiAgKglpcyByZXR1cm5lZCBhbmQgdGhlIG9sZCBza2IgZGF0YSByZWxlYXNlZC4KICAqLwotZXh0ZXJuIGludCBfX3NrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcCk7Ci1zdGF0aWMgaW5saW5lIGludCBza2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnApCitleHRlcm4gaW50IF9fc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlyZXR1cm4gX19za2JfbGluZWFyaXplKHNrYiwgZ2ZwKTsKIH0KQEAgLTEyMTEsNyArMTIxOCw3IEBACiB7CiAJaW50IGhsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCi0JaWYgKG9mZnNldCArIGxlbiA8PSBobGVuKQorCWlmIChobGVuIC0gb2Zmc2V0ID49IGxlbikKIAkJcmV0dXJuIHNrYi0+ZGF0YSArIG9mZnNldDsKIAogCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCBidWZmZXIsIGxlbikgPCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCA3NmNmN2U2Li40YzhlNTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtNjUsNyArNjUsNyBAQAogZXh0ZXJuIHZvaWQga21lbV9jYWNoZV9mcmVlKGttZW1fY2FjaGVfdCAqLCB2b2lkICopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBrbWVtX2NhY2hlX3NpemUoa21lbV9jYWNoZV90ICopOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmttZW1fY2FjaGVfbmFtZShrbWVtX2NhY2hlX3QgKik7Ci1leHRlcm4ga21lbV9jYWNoZV90ICprbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZV90IHNpemUsIGludCBnZnBmbGFncyk7CitleHRlcm4ga21lbV9jYWNoZV90ICprbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBmbGFncyk7CiAKIC8qIFNpemUgZGVzY3JpcHRpb24gc3RydWN0IGZvciBnZW5lcmFsIGNhY2hlcy4gKi8KIHN0cnVjdCBjYWNoZV9zaXplcyB7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqLCBpbnQgZmxhZ3MsIGludCBub2RlKTsKLWV4dGVybiB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGludCBmbGFncywgaW50IG5vZGUpOworZXh0ZXJuIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzLCBpbnQgbm9kZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBmbGFncywgaW50IG5vZGUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaAppbmRleCA5Mzk5NGM2Li5kYWIyNjUyYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtODgsNyArODgsNyBAQAogZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOwogI2VuZGlmCiAKLWV4dGVybiBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGludCBnZnApOworZXh0ZXJuIGNoYXIgKmtzdHJkdXAoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCAyMzQzZjk5Li4yMzlmNTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApAQCAtMTQ4LDcgKzE1MCw3IEBACiAjZGVmaW5lIHZtX3N3YXBfZnVsbCgpIChucl9zd2FwX3BhZ2VzKjIgPCB0b3RhbF9zd2FwX3BhZ2VzKQogCiAvKiBsaW51eC9tbS9vb21fa2lsbC5jICovCi1leHRlcm4gdm9pZCBvdXRfb2ZfbWVtb3J5KHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzayk7CitleHRlcm4gdm9pZCBvdXRfb2ZfbWVtb3J5KHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaywgaW50IG9yZGVyKTsKIAogLyogbGludXgvbW0vbWVtb3J5LmMgKi8KIGV4dGVybiB2b2lkIHN3YXBpbl9yZWFkYWhlYWQoc3dwX2VudHJ5X3QsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCA1MjgzMGI2Li40MjVmNThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01MDYsNCArNTA2LDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfa2V5Y3RsKGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczLAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmc0LCB1bnNpZ25lZCBsb25nIGFyZzUpOwogCithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wcmlvX2dldChpbnQgd2hpY2gsIGludCB3aG8pOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCmluZGV4IGViZmUxMjUuLmJmYmJlOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNzAsNiArNzAsMTQgQEAKIAlDVExfQlVTX0lTQT0xCQkvKiBJU0EgKi8KIH07CiAKKy8qIC9wcm9jL3N5cy9mcy9pbm90aWZ5LyAqLworZW51bQoreworCUlOT1RJRllfTUFYX1VTRVJfSU5TVEFOQ0VTPTEsCS8qIG1heCBpbnN0YW5jZXMgcGVyIHVzZXIgKi8KKwlJTk9USUZZX01BWF9VU0VSX1dBVENIRVM9MiwJLyogbWF4IHdhdGNoZXMgcGVyIHVzZXIgKi8KKwlJTk9USUZZX01BWF9RVUVVRURfRVZFTlRTPTMJLyogbWF4IHF1ZXVlZCBldmVudHMgcGVyIGluc3RhbmNlICovCit9OworCiAvKiBDVExfS0VSTiBuYW1lczogKi8KIGVudW0KIHsKQEAgLTY0MSw2ICs2NDksNyBAQAogCU5FVF9TQ1RQX0FERElQX0VOQUJMRQkJID0gMTMsCiAJTkVUX1NDVFBfUFJTQ1RQX0VOQUJMRQkJID0gMTQsCiAJTkVUX1NDVFBfU05EQlVGX1BPTElDWQkJID0gMTUsCisJTkVUX1NDVFBfU0FDS19USU1FT1VUCQkgPSAxNiwKIH07CiAKIC8qIC9wcm9jL3N5cy9uZXQvYnJpZGdlICovCkBAIC02NzUsNiArNjg0LDcgQEAKIAlGU19YRlM9MTcsCS8qIHN0cnVjdDogY29udHJvbCB4ZnMgcGFyYW1ldGVycyAqLwogCUZTX0FJT19OUj0xOCwJLyogY3VycmVudCBzeXN0ZW0td2lkZSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCiAJRlNfQUlPX01BWF9OUj0xOSwJLyogc3lzdGVtLXdpZGUgbWF4aW11bSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCisJRlNfSU5PVElGWT0yMCwJLyogaW5vdGlmeSBzdWJtZW51ICovCiB9OwogCiAvKiAvcHJvYy9zeXMvZnMvcXVvdGEvICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmggYi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKaW5kZXggYTZiMmNjNS4uMDgxYjFlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaApAQCAtNDEsMTkgKzQxLDE0IEBACiAJVENGX01FVEFfSURfTE9BREFWR18xLAogCVRDRl9NRVRBX0lEX0xPQURBVkdfMiwKIAlUQ0ZfTUVUQV9JRF9ERVYsCi0JVENGX01FVEFfSURfSU5ERVYsCi0JVENGX01FVEFfSURfUkVBTERFViwKIAlUQ0ZfTUVUQV9JRF9QUklPUklUWSwKIAlUQ0ZfTUVUQV9JRF9QUk9UT0NPTCwKLQlUQ0ZfTUVUQV9JRF9TRUNVUklUWSwKIAlUQ0ZfTUVUQV9JRF9QS1RUWVBFLAogCVRDRl9NRVRBX0lEX1BLVExFTiwKIAlUQ0ZfTUVUQV9JRF9EQVRBTEVOLAogCVRDRl9NRVRBX0lEX01BQ0xFTiwKIAlUQ0ZfTUVUQV9JRF9ORk1BUkssCiAJVENGX01FVEFfSURfVENJTkRFWCwKLQlUQ0ZfTUVUQV9JRF9UQ1ZFUkRJQ1QsCi0JVENGX01FVEFfSURfVENDTEFTU0lELAogCVRDRl9NRVRBX0lEX1JUQ0xBU1NJRCwKIAlUQ0ZfTUVUQV9JRF9SVElJRiwKIAlUQ0ZfTUVUQV9JRF9TS19GQU1JTFksCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCBkZmQ5M2QwLi5lNGZkODJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTI4Niw3ICsyODYsNyBAQAogCV9fdTMyCW1heF93aW5kb3c7CS8qIE1heGltYWwgd2luZG93IGV2ZXIgc2VlbiBmcm9tIHBlZXIJKi8KIAlfX3UzMglwbXR1X2Nvb2tpZTsJLyogTGFzdCBwbXR1IHNlZW4gYnkgc29ja2V0CQkqLwogCV9fdTMyCW1zc19jYWNoZTsJLyogQ2FjaGVkIGVmZmVjdGl2ZSBtc3MsIG5vdCBpbmNsdWRpbmcgU0FDS1MgKi8KLQlfX3UxNgltc3NfY2FjaGVfc3RkOwkvKiBMaWtlIG1zc19jYWNoZSwgYnV0IHdpdGhvdXQgVFNPICovCisJX191MTYJeG1pdF9zaXplX2dvYWw7CS8qIEdvYWwgZm9yIHNlZ21lbnRpbmcgb3V0cHV0IHBhY2tldHMJKi8KIAlfX3UxNglleHRfaGVhZGVyX2xlbjsJLyogTmV0d29yayBwcm90b2NvbCBvdmVyaGVhZCAoSVAvSVB2NiBvcHRpb25zKSAqLwogCV9fdTgJY2Ffc3RhdGU7CS8qIFN0YXRlIG9mIGZhc3QtcmV0cmFuc21pdCBtYWNoaW5lIAkqLwogCV9fdTgJcmV0cmFuc21pdHM7CS8qIE51bWJlciBvZiB1bnJlY292ZXJlZCBSVE8gdGltZW91dHMuCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCBlYjI4MmI1Li43MjQ2Mzc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTkzOCwxNyArOTM4LDE3IEBACiB9CiAKIGV4dGVybiB2b2lkIHVzYl9pbml0X3VyYihzdHJ1Y3QgdXJiICp1cmIpOwotZXh0ZXJuIHN0cnVjdCB1cmIgKnVzYl9hbGxvY191cmIoaW50IGlzb19wYWNrZXRzLCBpbnQgbWVtX2ZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgdXJiICp1c2JfYWxsb2NfdXJiKGludCBpc29fcGFja2V0cywgdW5zaWduZWQgbWVtX2ZsYWdzKTsKIGV4dGVybiB2b2lkIHVzYl9mcmVlX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogI2RlZmluZSB1c2JfcHV0X3VyYiB1c2JfZnJlZV91cmIKIGV4dGVybiBzdHJ1Y3QgdXJiICp1c2JfZ2V0X3VyYihzdHJ1Y3QgdXJiICp1cmIpOwotZXh0ZXJuIGludCB1c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpOworZXh0ZXJuIGludCB1c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncyk7CiBleHRlcm4gaW50IHVzYl91bmxpbmtfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiBleHRlcm4gdm9pZCB1c2Jfa2lsbF91cmIoc3RydWN0IHVyYiAqdXJiKTsKIAogI2RlZmluZSBIQVZFX1VTQl9CVUZGRVJTCiB2b2lkICp1c2JfYnVmZmVyX2FsbG9jIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQlpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOworCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKIHZvaWQgdXNiX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAl2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7CiAKQEAgLTEwNTUsNyArMTA1NSw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZywKIAlpbnQJCQluZW50cywKIAlzaXplX3QJCQlsZW5ndGgsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKTsKIHZvaWQgdXNiX3NnX2NhbmNlbCAoc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICppbyk7CiB2b2lkIHVzYl9zZ193YWl0IChzdHJ1Y3QgdXNiX3NnX3JlcXVlc3QgKmlvKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiX2NkYy5oIGIvaW5jbHVkZS9saW51eC91c2JfY2RjLmgKaW5kZXggZjIyZDZiZS4uYmE2MTdjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfY2RjLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JfY2RjLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgVVNCX0NEQ19BQ01fVFlQRQkJMHgwMgkJLyogYWNtX2Rlc2NyaXB0b3IgKi8KICNkZWZpbmUgVVNCX0NEQ19VTklPTl9UWVBFCQkweDA2CQkvKiB1bmlvbl9kZXNjICovCiAjZGVmaW5lIFVTQl9DRENfQ09VTlRSWV9UWVBFCQkweDA3CisjZGVmaW5lIFVTQl9DRENfTkVUV09SS19URVJNSU5BTF9UWVBFCTB4MGEJCS8qIG5ldHdvcmtfdGVybWluYWxfZGVzYyAqLwogI2RlZmluZSBVU0JfQ0RDX0VUSEVSTkVUX1RZUEUJCTB4MGYJCS8qIGV0aGVyX2Rlc2MgKi8KICNkZWZpbmUgVVNCX0NEQ19XSENNX1RZUEUJCTB4MTEKICNkZWZpbmUgVVNCX0NEQ19NRExNX1RZUEUJCTB4MTIJCS8qIG1kbG1fZGVzYyAqLwpAQCAtODMsNiArODQsMTggQEAKIAkvKiAuLi4gYW5kIHRoZXJlIGNvdWxkIGJlIG90aGVyIHNsYXZlIGludGVyZmFjZXMgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiAiTmV0d29yayBDaGFubmVsIFRlcm1pbmFsIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy4xMSAqLworc3RydWN0IHVzYl9jZGNfbmV0d29ya190ZXJtaW5hbF9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJFbnRpdHlJZDsKKwlfX3U4CWlOYW1lOworCV9fdTgJYkNoYW5uZWxJbmRleDsKKwlfX3U4CWJQaHlzaWNhbEludGVyZmFjZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiAvKiAiRXRoZXJuZXQgTmV0d29ya2luZyBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgNS4yLjMuMTYgKi8KIHN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MgewogCV9fdTgJYkxlbmd0aDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiX2NoOS5oIGIvaW5jbHVkZS9saW51eC91c2JfY2g5LmgKaW5kZXggZjVmZTk0ZS4uZWUyMWU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfY2g5LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JfY2g5LmgKQEAgLTYsMTcgKzYsMjAgQEAKICAqCiAgKiAtIHRoZSBtYXN0ZXIvaG9zdCBzaWRlIExpbnV4LVVTQiBrZXJuZWwgZHJpdmVyIEFQSTsKICAqIC0gdGhlICJ1c2JmcyIgdXNlciBzcGFjZSBBUEk7IGFuZAotICogLSAoZXZlbnR1YWxseSkgYSBMaW51eCAiZ2FkZ2V0IiBzbGF2ZS9kZXZpY2Ugc2lkZSBkcml2ZXIgQVBJLgorICogLSB0aGUgTGludXggImdhZGdldCIgc2xhdmUvZGV2aWNlL3BlcmlwaGVyYWwgc2lkZSBkcml2ZXIgQVBJLgogICoKICAqIFVTQiAyLjAgYWRkcyBhbiBhZGRpdGlvbmFsICJPbiBUaGUgR28iIChPVEcpIG1vZGUsIHdoaWNoIGxldHMgc3lzdGVtcwogICogYWN0IGVpdGhlciBhcyBhIFVTQiBtYXN0ZXIvaG9zdCBvciBhcyBhIFVTQiBzbGF2ZS9kZXZpY2UuICBUaGF0IG1lYW5zCi0gKiB0aGUgbWFzdGVyIGFuZCBzbGF2ZSBzaWRlIEFQSXMgd2lsbCBiZW5lZml0IGZyb20gd29ya2luZyB3ZWxsIHRvZ2V0aGVyLgorICogdGhlIG1hc3RlciBhbmQgc2xhdmUgc2lkZSBBUElzIGJlbmVmaXQgZnJvbSB3b3JraW5nIHdlbGwgdG9nZXRoZXIuCisgKgorICogVGhlcmUncyBhbHNvICJXaXJlbGVzcyBVU0IiLCB1c2luZyBsb3cgcG93ZXIgc2hvcnQgcmFuZ2UgcmFkaW9zIGZvcgorICogcGVyaXBoZXJhbCBpbnRlcmNvbm5lY3Rpb24gYnV0IG90aGVyd2lzZSBidWlsZGluZyBvbiB0aGUgVVNCIGZyYW1ld29yay4KICAqLwogCiAjaWZuZGVmIF9fTElOVVhfVVNCX0NIOV9ICiAjZGVmaW5lIF9fTElOVVhfVVNCX0NIOV9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4JCS8qIF9fdTggZXRjICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogX191OCBldGMgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNjgsNiArNzEsMTggQEAKICNkZWZpbmUgVVNCX1JFUV9TRVRfSU5URVJGQUNFCQkweDBCCiAjZGVmaW5lIFVTQl9SRVFfU1lOQ0hfRlJBTUUJCTB4MEMKIAorI2RlZmluZSBVU0JfUkVRX1NFVF9FTkNSWVBUSU9OCQkweDBECS8qIFdpcmVsZXNzIFVTQiAqLworI2RlZmluZSBVU0JfUkVRX0dFVF9FTkNSWVBUSU9OCQkweDBFCisjZGVmaW5lIFVTQl9SRVFfU0VUX0hBTkRTSEFLRQkJMHgwRgorI2RlZmluZSBVU0JfUkVRX0dFVF9IQU5EU0hBS0UJCTB4MTAKKyNkZWZpbmUgVVNCX1JFUV9TRVRfQ09OTkVDVElPTgkJMHgxMQorI2RlZmluZSBVU0JfUkVRX1NFVF9TRUNVUklUWV9EQVRBCTB4MTIKKyNkZWZpbmUgVVNCX1JFUV9HRVRfU0VDVVJJVFlfREFUQQkweDEzCisjZGVmaW5lIFVTQl9SRVFfU0VUX1dVU0JfREFUQQkJMHgxNAorI2RlZmluZSBVU0JfUkVRX0xPT1BCQUNLX0RBVEFfV1JJVEUJMHgxNQorI2RlZmluZSBVU0JfUkVRX0xPT1BCQUNLX0RBVEFfUkVBRAkweDE2CisjZGVmaW5lIFVTQl9SRVFfU0VUX0lOVEVSRkFDRV9EUwkweDE3CisKIC8qCiAgKiBVU0IgZmVhdHVyZSBmbGFncyBhcmUgd3JpdHRlbiB1c2luZyBVU0JfUkVRX3tDTEVBUixTRVR9X0ZFQVRVUkUsIGFuZAogICogYXJlIHJlYWQgYXMgYSBiaXQgYXJyYXkgcmV0dXJuZWQgYnkgVVNCX1JFUV9HRVRfU1RBVFVTLiAgKFNvIHRoZXJlCkBAIC03NSwxMCArOTAsMTIgQEAKICAqLwogI2RlZmluZSBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRAkJMAkvKiAocmVhZCBvbmx5KSAqLwogI2RlZmluZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAJMQkvKiBkZXYgbWF5IGluaXRpYXRlIHdha2V1cCAqLwotI2RlZmluZSBVU0JfREVWSUNFX1RFU1RfTU9ERQkJMgkvKiAoaGlnaCBzcGVlZCBvbmx5KSAqLwotI2RlZmluZSBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRQkJMwkvKiBkZXYgbWF5IGluaXRpYXRlIEhOUCAqLwotI2RlZmluZSBVU0JfREVWSUNFX0FfSE5QX1NVUFBPUlQJNAkvKiBSSCBwb3J0IHN1cHBvcnRzIEhOUCAqLwotI2RlZmluZSBVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUCTUJLyogb3RoZXIgUkggcG9ydCBkb2VzICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfVEVTVF9NT0RFCQkyCS8qICh3aXJlZCBoaWdoIHNwZWVkIG9ubHkpICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQkFUVEVSWQkJMgkvKiAod2lyZWxlc3MpICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQl9ITlBfRU5BQkxFCQkzCS8qIChvdGcpIGRldiBtYXkgaW5pdGlhdGUgSE5QICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfV1VTQl9ERVZJQ0UJCTMJLyogKHdpcmVsZXNzKSovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQV9ITlBfU1VQUE9SVAk0CS8qIChvdGcpIFJIIHBvcnQgc3VwcG9ydHMgSE5QICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQV9BTFRfSE5QX1NVUFBPUlQJNQkvKiAob3RnKSBvdGhlciBSSCBwb3J0IGRvZXMgKi8KICNkZWZpbmUgVVNCX0RFVklDRV9ERUJVR19NT0RFCQk2CS8qIChzcGVjaWFsIGRldmljZXMgb25seSkgKi8KIAogI2RlZmluZSBVU0JfRU5EUE9JTlRfSEFMVAkJMAkvKiBJTi9PVVQgd2lsbCBTVEFMTCAqLwpAQCAtMTM1LDYgKzE1MiwxMyBAQAogI2RlZmluZSBVU0JfRFRfT1RHCQkJMHgwOQogI2RlZmluZSBVU0JfRFRfREVCVUcJCQkweDBhCiAjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0VfQVNTT0NJQVRJT04JMHgwYgorLyogdGhlc2UgYXJlIGZyb20gdGhlIFdpcmVsZXNzIFVTQiBzcGVjICovCisjZGVmaW5lIFVTQl9EVF9TRUNVUklUWQkJCTB4MGMKKyNkZWZpbmUgVVNCX0RUX0tFWQkJCTB4MGQKKyNkZWZpbmUgVVNCX0RUX0VOQ1JZUFRJT05fVFlQRQkJMHgwZQorI2RlZmluZSBVU0JfRFRfQk9TCQkJMHgwZgorI2RlZmluZSBVU0JfRFRfREVWSUNFX0NBUEFCSUxJVFkJMHgxMAorI2RlZmluZSBVU0JfRFRfV0lSRUxFU1NfRU5EUE9JTlRfQ09NUAkweDExCiAKIC8qIGNvbnZlbnRpb25hbCBjb2RlcyBmb3IgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvcnMgKi8KICNkZWZpbmUgVVNCX0RUX0NTX0RFVklDRQkJMHgyMQpAQCAtMTkyLDYgKzIxNiw3IEBACiAjZGVmaW5lIFVTQl9DTEFTU19DU0NJRAkJCTB4MGIJLyogY2hpcCsgc21hcnQgY2FyZCAqLwogI2RlZmluZSBVU0JfQ0xBU1NfQ09OVEVOVF9TRUMJCTB4MGQJLyogY29udGVudCBzZWN1cml0eSAqLwogI2RlZmluZSBVU0JfQ0xBU1NfVklERU8JCQkweDBlCisjZGVmaW5lIFVTQl9DTEFTU19XSVJFTEVTU19DT05UUk9MTEVSCTB4ZTAKICNkZWZpbmUgVVNCX0NMQVNTX0FQUF9TUEVDCQkweGZlCiAjZGVmaW5lIFVTQl9DTEFTU19WRU5ET1JfU1BFQwkJMHhmZgogCkBAIC0yMjMsNiArMjQ4LDcgQEAKICNkZWZpbmUgVVNCX0NPTkZJR19BVFRfT05FCQkoMSA8PCA3KQkvKiBtdXN0IGJlIHNldCAqLwogI2RlZmluZSBVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIJKDEgPDwgNikJLyogc2VsZiBwb3dlcmVkICovCiAjZGVmaW5lIFVTQl9DT05GSUdfQVRUX1dBS0VVUAkJKDEgPDwgNSkJLyogY2FuIHdha2V1cCAqLworI2RlZmluZSBVU0JfQ09ORklHX0FUVF9CQVRURVJZCQkoMSA8PCA0KQkvKiBiYXR0ZXJ5IHBvd2VyZWQgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMjY4LDggKzI5NCw4IEBACiAJX19sZTE2IHdNYXhQYWNrZXRTaXplOwogCV9fdTggIGJJbnRlcnZhbDsKIAotCS8vIE5PVEU6ICB0aGVzZSB0d28gYXJlIF9vbmx5XyBpbiBhdWRpbyBlbmRwb2ludHMuCi0JLy8gdXNlIFVTQl9EVF9FTkRQT0lOVCpfU0laRSBpbiBiTGVuZ3RoLCBub3Qgc2l6ZW9mLgorCS8qIE5PVEU6ICB0aGVzZSB0d28gYXJlIF9vbmx5XyBpbiBhdWRpbyBlbmRwb2ludHMuICovCisJLyogdXNlIFVTQl9EVF9FTkRQT0lOVCpfU0laRSBpbiBiTGVuZ3RoLCBub3Qgc2l6ZW9mLiAqLwogCV9fdTggIGJSZWZyZXNoOwogCV9fdTggIGJTeW5jaEFkZHJlc3M7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTI4OSw2ICszMTUsNyBAQAogI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DCQkxCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsJCTIKICNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfSU5UCQkzCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9NQVhfQURKVVNUQUJMRQkweDgwCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM1MiwxMiArMzc5LDE1NCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKiBVU0JfRFRfU0VDVVJJVFk6ICBncm91cCBvZiB3aXJlbGVzcyBzZWN1cml0eSBkZXNjcmlwdG9ycywgaW5jbHVkaW5nCisgKiBlbmNyeXB0aW9uIHR5cGVzIGF2YWlsYWJsZSBmb3Igc2V0dGluZyB1cCBhIENDL2Fzc29jaWF0aW9uLgorICovCitzdHJ1Y3QgdXNiX3NlY3VyaXR5X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX19sZTE2IHdUb3RhbExlbmd0aDsKKwlfX3U4ICBiTnVtRW5jcnlwdGlvblR5cGVzOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0tFWTogIHVzZWQgd2l0aCB7R0VULFNFVH1fU0VDVVJJVFlfREFUQTsgb25seSBwdWJsaWMga2V5cworICogbWF5IGJlIHJldHJpZXZlZC4KKyAqLworc3RydWN0IHVzYl9rZXlfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICB0VEtJRFszXTsKKwlfX3U4ICBiUmVzZXJ2ZWQ7CisJX191OCAgYktleURhdGFbMF07Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfRU5DUllQVElPTl9UWVBFOiAgYnVuZGxlZCBpbiBEVF9TRUNVUklUWSBncm91cHMgKi8KK3N0cnVjdCB1c2JfZW5jcnlwdGlvbl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJFbmNyeXB0aW9uVHlwZTsKKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1VOU0VDVVJFCQkwCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9XSVJFRAkJMQkvKiBub24td2lyZWxlc3MgbW9kZSAqLworI2RlZmluZQlVU0JfRU5DX1RZUEVfQ0NNXzEJCTIJLyogYWVzMTI4L2NiYyBzZXNzaW9uICovCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9SU0FfMQkJMwkvKiByc2EzMDcyL3NoYTEgYXV0aCAqLworCV9fdTggIGJFbmNyeXB0aW9uVmFsdWU7CQkvKiB1c2UgaW4gU0VUX0VOQ1JZUFRJT04gKi8KKwlfX3U4ICBiQXV0aEtleUluZGV4OworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfQk9TOiAgZ3JvdXAgb2Ygd2lyZWxlc3MgY2FwYWJpbGl0aWVzICovCitzdHJ1Y3QgdXNiX2Jvc19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYk51bURldmljZUNhcHM7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfREVWSUNFX0NBUEFCSUxJVFk6ICBncm91cGVkIHdpdGggQk9TICovCitzdHJ1Y3QgdXNiX2Rldl9jYXBfaGVhZGVyIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGV2Q2FwYWJpbGl0eVR5cGU7Cit9OworCisjZGVmaW5lCVVTQl9DQVBfVFlQRV9XSVJFTEVTU19VU0IJMQorCitzdHJ1Y3QgdXNiX3dpcmVsZXNzX2NhcF9kZXNjcmlwdG9yIHsJLyogVWx0cmEgV2lkZSBCYW5kICovCisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworCisJX191OCAgYm1BdHRyaWJ1dGVzOworI2RlZmluZQlVU0JfV0lSRUxFU1NfUDJQX0RSRAkJKDEgPDwgMSkKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9NQVNLCSgzIDw8IDIpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fU0VMRgkoMSA8PCAyKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX0RJUkVDVEVECSgyIDw8IDIpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fTk9ORQkoMyA8PCAyKQorCV9fbGUxNiB3UEhZUmF0ZXM7CS8qIGJpdCByYXRlcywgTWJwcyAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzUzCQkoMSA8PCAwKQkvKiBhbHdheXMgc2V0ICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfODAJCSgxIDw8IDEpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMTA3CQkoMSA8PCAyKQkvKiBhbHdheXMgc2V0ICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMTYwCQkoMSA8PCAzKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzIwMAkJKDEgPDwgNCkJLyogYWx3YXlzIHNldCAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzMyMAkJKDEgPDwgNSkKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV80MDAJCSgxIDw8IDYpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfNDgwCQkoMSA8PCA3KQorCV9fdTggIGJtVEZJVFhQb3dlckluZm87CS8qIFRGSSBwb3dlciBsZXZlbHMgKi8KKwlfX3U4ICBibUZGSVRYUG93ZXJJbmZvOwkvKiBGRkkgcG93ZXIgbGV2ZWxzICovCisJX19sZTE2IGJtQmFuZEdyb3VwOworCV9fdTggIGJSZXNlcnZlZDsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9XSVJFTEVTU19FTkRQT0lOVF9DT01QOiAgY29tcGFuaW9uIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoCisgKiBlYWNoIGVuZHBvaW50IGRlc2NyaXB0b3IgZm9yIGEgd2lyZWxlc3MgZGV2aWNlCisgKi8KK3N0cnVjdCB1c2Jfd2lyZWxlc3NfZXBfY29tcF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJNYXhCdXJzdDsKKwlfX3U4ICBiTWF4U2VxdWVuY2U7CisJX19sZTE2IHdNYXhTdHJlYW1EZWxheTsKKwlfX2xlMTYgd092ZXJUaGVBaXJQYWNrZXRTaXplOworCV9fdTggIGJPdmVyVGhlQWlySW50ZXJ2YWw7CisJX191OCAgYm1Db21wQXR0cmlidXRlczsKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9NQVNLCTB4MDMJLyogaW4gYm1Db21wQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX05PCQkwCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfU1dJVENICTEKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9TQ0FMRQkyCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfUkVRX1NFVF9IQU5EU0hBS0UgaXMgYSBmb3VyLXdheSBoYW5kc2hha2UgdXNlZCBiZXR3ZWVuIGEgd2lyZWxlc3MKKyAqIGhvc3QgYW5kIGEgZGV2aWNlIGZvciBjb25uZWN0aW9uIHNldCB1cCwgbXV0dWFsIGF1dGhlbnRpY2F0aW9uLCBhbmQKKyAqIGV4Y2hhbmdpbmcgc2hvcnQgbGl2ZWQgc2Vzc2lvbiBrZXlzLiAgVGhlIGhhbmRzaGFrZSBkZXBlbmRzIG9uIGEgQ0MuCisgKi8KK3N0cnVjdCB1c2JfaGFuZHNoYWtlIHsKKwlfX3U4IGJNZXNzYWdlTnVtYmVyOworCV9fdTggYlN0YXR1czsKKwlfX3U4IHRUS0lEWzNdOworCV9fdTggYlJlc2VydmVkOworCV9fdTggQ0RJRFsxNl07CisJX191OCBub25jZVsxNl07CisJX191OCBNSUNbOF07Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfUkVRX1NFVF9DT05ORUNUSU9OIG1vZGlmaWVzIG9yIHJldm9rZXMgYSBjb25uZWN0aW9uIGNvbnRleHQgKENDKS4KKyAqIEEgQ0MgbWF5IGFsc28gYmUgc2V0IHVwIHVzaW5nIG5vbi13aXJlbGVzcyBzZWN1cmUgY2hhbm5lbHMgKGluY2x1ZGluZworICogd2lyZWQgVVNCISksIGFuZCBzb21lIGRldmljZXMgbWF5IHN1cHBvcnQgQ0NzIHdpdGggbXVsdGlwbGUgaG9zdHMuCisgKi8KK3N0cnVjdCB1c2JfY29ubmVjdGlvbl9jb250ZXh0IHsKKwlfX3U4IENISURbMTZdOwkJLyogcGVyc2lzdGVudCBob3N0IGlkICovCisJX191OCBDRElEWzE2XTsJCS8qIGRldmljZSBpZCAodW5pcXVlIHcvaW4gaG9zdCBjb250ZXh0KSAqLworCV9fdTggQ0tbMTZdOwkJLyogY29ubmVjdGlvbiBrZXkgKi8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIC8qIFVTQiAyLjAgZGVmaW5lcyB0aHJlZSBzcGVlZHMsIGhlcmUncyBob3cgTGludXggaWRlbnRpZmllcyB0aGVtICovCiAKIGVudW0gdXNiX2RldmljZV9zcGVlZCB7CiAJVVNCX1NQRUVEX1VOS05PV04gPSAwLAkJCS8qIGVudW1lcmF0aW5nICovCiAJVVNCX1NQRUVEX0xPVywgVVNCX1NQRUVEX0ZVTEwsCQkvKiB1c2IgMS4xICovCi0JVVNCX1NQRUVEX0hJR0gJCQkJLyogdXNiIDIuMCAqLworCVVTQl9TUEVFRF9ISUdILAkJCQkvKiB1c2IgMi4wICovCisJVVNCX1NQRUVEX1ZBUklBQkxFLAkJCS8qIHdpcmVsZXNzICh1c2IgMi41KSAqLwogfTsKIAogZW51bSB1c2JfZGV2aWNlX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiX2dhZGdldC5oIGIvaW5jbHVkZS9saW51eC91c2JfZ2FkZ2V0LmgKaW5kZXggOWJiYTk5OS4uNzFlNjA4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfZ2FkZ2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JfZ2FkZ2V0LmgKQEAgLTEwNywxOCArMTA3LDE4IEBACiAJaW50ICgqZGlzYWJsZSkgKHN0cnVjdCB1c2JfZXAgKmVwKTsKIAogCXN0cnVjdCB1c2JfcmVxdWVzdCAqKCphbGxvY19yZXF1ZXN0KSAoc3RydWN0IHVzYl9lcCAqZXAsCi0JCWludCBnZnBfZmxhZ3MpOworCQl1bnNpZ25lZCBnZnBfZmxhZ3MpOwogCXZvaWQgKCpmcmVlX3JlcXVlc3QpIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOwogCiAJdm9pZCAqKCphbGxvY19idWZmZXIpIChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgYnl0ZXMsCi0JCWRtYV9hZGRyX3QgKmRtYSwgaW50IGdmcF9mbGFncyk7CisJCWRtYV9hZGRyX3QgKmRtYSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKIAl2b2lkICgqZnJlZV9idWZmZXIpIChzdHJ1Y3QgdXNiX2VwICplcCwgdm9pZCAqYnVmLCBkbWFfYWRkcl90IGRtYSwKIAkJdW5zaWduZWQgYnl0ZXMpOwogCS8vIE5PVEU6ICBvbiAyLjYsIGRyaXZlcnMgbWF5IGFsc28gdXNlIGRtYV9tYXAoKSBhbmQKIAkvLyBkbWFfc3luY19zaW5nbGVfKigpIHRvIGRpcmVjdGx5IG1hbmFnZSBkbWEgb3ZlcmhlYWQuIAogCiAJaW50ICgqcXVldWUpIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsCi0JCWludCBnZnBfZmxhZ3MpOworCQl1bnNpZ25lZCBnZnBfZmxhZ3MpOwogCWludCAoKmRlcXVldWUpIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOwogCiAJaW50ICgqc2V0X2hhbHQpIChzdHJ1Y3QgdXNiX2VwICplcCwgaW50IHZhbHVlKTsKQEAgLTIxNCw3ICsyMTQsNyBAQAogICogUmV0dXJucyB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotdXNiX2VwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgZ2ZwX2ZsYWdzKQordXNiX2VwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJcmV0dXJuIGVwLT5vcHMtPmFsbG9jX3JlcXVlc3QgKGVwLCBnZnBfZmxhZ3MpOwogfQpAQCAtMjU0LDcgKzI1NCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqCiB1c2JfZXBfYWxsb2NfYnVmZmVyIChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90ICpkbWEsCi0JaW50IGdmcF9mbGFncykKKwl1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJcmV0dXJuIGVwLT5vcHMtPmFsbG9jX2J1ZmZlciAoZXAsIGxlbiwgZG1hLCBnZnBfZmxhZ3MpOwogfQpAQCAtMzMwLDcgKzMzMCw3IEBACiAgKiByZXBvcnRlZCB3aGVuIHRoZSB1c2IgcGVyaXBoZXJhbCBpcyBkaXNjb25uZWN0ZWQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50Ci11c2JfZXBfcXVldWUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgaW50IGdmcF9mbGFncykKK3VzYl9lcF9xdWV1ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJcmV0dXJuIGVwLT5vcHMtPnF1ZXVlIChlcCwgcmVxLCBnZnBfZmxhZ3MpOwogfQpAQCAtNzExLDcgKzcxMSw3IEBACiAgKiAJdGhlIGhhcmR3YXJlIGxldmVsIGRyaXZlci4gTW9zdCBjYWxscyBtdXN0IGJlIGhhbmRsZWQgYnkKICAqIAl0aGUgZ2FkZ2V0IGRyaXZlciwgaW5jbHVkaW5nIGRlc2NyaXB0b3IgYW5kIGNvbmZpZ3VyYXRpb24KICAqIAltYW5hZ2VtZW50LiAgVGhlIDE2IGJpdCBtZW1iZXJzIG9mIHRoZSBzZXR1cCBkYXRhIGFyZSBpbgotICogCWNwdSBvcmRlci4gQ2FsbGVkIGluX2ludGVycnVwdDsgdGhpcyBtYXkgbm90IHNsZWVwLiAgRHJpdmVyCisgKiAJVVNCIGJ5dGUgb3JkZXIuIENhbGxlZCBpbl9pbnRlcnJ1cHQ7IHRoaXMgbWF5IG5vdCBzbGVlcC4gIERyaXZlcgogICoJcXVldWVzIGEgcmVzcG9uc2UgdG8gZXAwLCBvciByZXR1cm5zIG5lZ2F0aXZlIHRvIHN0YWxsLgogICogQGRpc2Nvbm5lY3Q6IEludm9rZWQgYWZ0ZXIgYWxsIHRyYW5zZmVycyBoYXZlIGJlZW4gc3RvcHBlZCwKICAqIAl3aGVuIHRoZSBob3N0IGlzIGRpc2Nvbm5lY3RlZC4gIE1heSBiZSBjYWxsZWQgaW5faW50ZXJydXB0OyB0aGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmggYi9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1YTlkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2lzcDExNnguaApAQCAtMCwwICsxLDQ3IEBACisKKy8qCisgKiBCb2FyZCBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBwdXQgb25lIG9mIHRoZXNlIGludG8gZGV2LT5wbGF0Zm9ybV9kYXRhCisgKiBhbmQgcGxhY2UgdGhlIGlzcDExNnggb250byBwbGF0Zm9ybV9idXMuCisgKi8KKworc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSB7CisJLyogRW5hYmxlIGludGVybmFsIHJlc2lzdG9ycyBvbiBkb3duc3RyZWFtIHBvcnRzICovCisJdW5zaWduZWQgc2VsMTVLcmVzOjE7CisJLyogQ2hpcCdzIGludGVybmFsIGNsb2NrIHdvbid0IGJlIHN0b3BwZWQgaW4gc3VzcGVuZGVkIHN0YXRlLgorCSAgIFNldHRpbmcvdW5zZXR0aW5nIHRoaXMgYml0IHRha2VzIGVmZmVjdCBvbmx5IGlmCisJICAgJ3JlbW90ZV93YWtldXBfZW5hYmxlJyBiZWxvdyBpcyBub3Qgc2V0LiAqLworCXVuc2lnbmVkIGNsa25vdHN0b3A6MTsKKwkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IHByb3RlY3Rpb24gKi8KKwl1bnNpZ25lZCBvY19lbmFibGU6MTsKKwkvKiBJTlQgb3V0cHV0IHBvbGFyaXR5ICovCisJdW5zaWduZWQgaW50X2FjdF9oaWdoOjE7CisJLyogSU5UIGVkZ2Ugb3IgbGV2ZWwgdHJpZ2dlcmVkICovCisJdW5zaWduZWQgaW50X2VkZ2VfdHJpZ2dlcmVkOjE7CisJLyogV0FLRVVQIHBpbiBjb25uZWN0ZWQgLSBOT1QgU1VQUE9SVEVEICAqLworCS8qIHVuc2lnbmVkIHJlbW90ZV93YWtldXBfY29ubmVjdGVkOjE7ICovCisJLyogV2FrZXVwIGJ5IGRldmljZXMgb24gdXNiIGJ1cyBlbmFibGVkICovCisJdW5zaWduZWQgcmVtb3RlX3dha2V1cF9lbmFibGU6MTsKKwkvKiBTd2l0Y2ggb3Igbm90IHRvIHN3aXRjaCAoa2VlcCBhbHdheXMgcG93ZXJlZCkgKi8KKwl1bnNpZ25lZCBub19wb3dlcl9zd2l0Y2hpbmc6MTsKKwkvKiBHYW5nZWQgcG9ydCBwb3dlciBzd2l0Y2hpbmcgKDApIG9yIGluZGl2aWR1YWwgcG9ydAorCSAgIHBvd2VyIHN3aXRjaGluZyAoMSkgKi8KKwl1bnNpZ25lZCBwb3dlcl9zd2l0Y2hpbmdfbW9kZToxOworCS8qIEdpdmVuIHBvcnRfcG93ZXIsIG1zZWMvMiBhZnRlciBwb3dlciBvbiB0aWxsIHBvd2VyIGdvb2QgKi8KKwl1OCBwb3RwZzsKKwkvKiBIYXJkd2FyZSByZXNldCBzZXQvY2xlYXIuIElmIGltcGxlbWVudGVkLCB0aGlzIGZ1bmN0aW9uIG11c3Q6CisJICAgaWYgc2V0ID09IDAsICAgZGVhc3NlcnQgY2hpcCdzIEhXIHJlc2V0IHBpbgorCSAgIG90aGVyd2lzZSwgICAgIGFzc2VydCBjaGlwJ3MgSFcgcmVzZXQgcGluICAgICAgICovCisJdm9pZCAoKnJlc2V0KSAoc3RydWN0IGRldmljZSAqIGRldiwgaW50IHNldCk7CisJLyogSGFyZHdhcmUgY2xvY2sgc3RhcnQvc3RvcC4gSWYgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24gbXVzdDoKKwkgICBpZiBzdGFydCA9PSAwLCAgICBzdG9wIHRoZSBleHRlcm5hbCBjbG9jaworCSAgIG90aGVyd2lzZSwgICAgICAgIHN0YXJ0IHRoZSBleHRlcm5hbCBjbG9jaworCSAqLworCXZvaWQgKCpjbG9jaykgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIGludCBzdGFydCk7CisJLyogSW50ZXItaW8gZGVsYXkgKG5zKS4gVGhlIGNoaXAgaXMgcGlja3kgYWJvdXQgYWNjZXNzIHRpbWluZ3M7IGl0CisJICAgZXhwZWN0cyBhdCBsZWFzdDoKKwkgICAxNTBucyBkZWxheSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGFjY2Vzc2VzIHRvIERBVEFfUkVHLAorCSAgIDMwMG5zIGRlbGF5IGJldHdlZW4gYWNjZXNzIHRvIEFERFJfUkVHIGFuZCBEQVRBX1JFRworCSAgIE9FLCBXRSBNVVNUIE5PVCBiZSBjaGFuZ2VkIGR1cmluZyB0aGVzZSBpbnRlcnZhbHMKKwkgKi8KKwl2b2lkICgqZGVsYXkpIChzdHJ1Y3QgZGV2aWNlICogZGV2LCBpbnQgZGVsYXkpOworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IDRlMGVkY2UuLmFjYmZjNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMjIxLDYgKzIyMSw4IEBACiAvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfV05WQSAgICAgdjRsMl9mb3VyY2MoJ1cnLCdOJywnVicsJ0EnKSAvKiBXaW5ub3YgaHcgY29tcHJlc3MgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMxMFggIHY0bDJfZm91cmNjKCdTJywnOScsJzEnLCcwJykgLyogU045QzEweCBjb21wcmVzc2lvbiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMSAgICAgdjRsMl9mb3VyY2MoJ1AnLCdXJywnQycsJzEnKSAvKiBwd2Mgb2xkZXIgd2ViY2FtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MyICAgICB2NGwyX2ZvdXJjYygnUCcsJ1cnLCdDJywnMicpIC8qIHB3YyBuZXdlciB3ZWJjYW0gKi8KIAogLyoKICAqCUYgTyBSIE0gQSBUICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oIGIvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaAppbmRleCAzZTg5ZjBmLi4xYjZiNzZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKQEAgLTUxNiw4ICs1MTYsNyBAQAogLyogUHVibGljIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIGRldmljZSBkcml2ZXJzICovCiBleHRlcm4gaW50IHJlZ2lzdGVyX3dhbl9kZXZpY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfd2FuX2RldmljZShjaGFyICpuYW1lKTsKLXVuc2lnbmVkIHNob3J0IHdhbnJvdXRlcl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworX19iZTE2IHdhbnJvdXRlcl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHdhbnJvdXRlcl9lbmNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICB1bnNpZ25lZCBzaG9ydCB0eXBlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaCBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKaW5kZXggMTI2MmNiNC4uNTQyZGJhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC0xNCwxMSArMTQsMTMgQEAKICAqIFllcywgd3JpdGViYWNrLmggcmVxdWlyZXMgc2NoZWQuaAogICogTm8sIHNjaGVkLmggaXMgbm90IGluY2x1ZGVkIGZyb20gaGVyZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgY3VycmVudF9pc19wZGZsdXNoKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCB0YXNrX2lzX3BkZmx1c2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXJldHVybiBjdXJyZW50LT5mbGFncyAmIFBGX0ZMVVNIRVI7CisJcmV0dXJuIHRhc2stPmZsYWdzICYgUEZfRkxVU0hFUjsKIH0KIAorI2RlZmluZSBjdXJyZW50X2lzX3BkZmx1c2goKQl0YXNrX2lzX3BkZmx1c2goY3VycmVudCkKKwogLyoKICAqIGZzL2ZzLXdyaXRlYmFjay5jCiAgKi8KQEAgLTgzLDcgKzg1LDcgQEAKIC8qCiAgKiBtbS9wYWdlLXdyaXRlYmFjay5jCiAgKi8KLWludCB3YWtldXBfYmRmbHVzaChsb25nIG5yX3BhZ2VzKTsKK2ludCB3YWtldXBfcGRmbHVzaChsb25nIG5yX3BhZ2VzKTsKIHZvaWQgbGFwdG9wX2lvX2NvbXBsZXRpb24odm9pZCk7CiB2b2lkIGxhcHRvcF9zeW5jX2NvbXBsZXRpb24odm9pZCk7CiB2b2lkIHRocm90dGxlX3ZtX3dyaXRlb3V0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94YXR0cl9hY2wuaCBiL2luY2x1ZGUvbGludXgveGF0dHJfYWNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMWY5YjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC94YXR0cl9hY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gIEZpbGU6IGxpbnV4L3hhdHRyX2FjbC5oCi0KLSAgKGV4dGVuZGVkIGF0dHJpYnV0ZSByZXByZXNlbnRhdGlvbiBvZiBhY2Nlc3MgY29udHJvbCBsaXN0cykKLQotICAoQykgMjAwMCBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+Ci0qLwotCi0jaWZuZGVmIF9MSU5VWF9YQVRUUl9BQ0xfSAotI2RlZmluZSBfTElOVVhfWEFUVFJfQUNMX0gKLQotI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgotCi0jZGVmaW5lIFhBVFRSX05BTUVfQUNMX0FDQ0VTUwkic3lzdGVtLnBvc2l4X2FjbF9hY2Nlc3MiCi0jZGVmaW5lIFhBVFRSX05BTUVfQUNMX0RFRkFVTFQJInN5c3RlbS5wb3NpeF9hY2xfZGVmYXVsdCIKLQotI2RlZmluZSBYQVRUUl9BQ0xfVkVSU0lPTgkweDAwMDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2CQllX3RhZzsKLQlfX3UxNgkJZV9wZXJtOwotCV9fdTMyCQllX2lkOwotfSB4YXR0cl9hY2xfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3UzMgkJYV92ZXJzaW9uOwotCXhhdHRyX2FjbF9lbnRyeQlhX2VudHJpZXNbMF07Ci19IHhhdHRyX2FjbF9oZWFkZXI7Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHhhdHRyX2FjbF9zaXplKGludCBjb3VudCkKLXsKLQlyZXR1cm4gc2l6ZW9mKHhhdHRyX2FjbF9oZWFkZXIpICsgY291bnQgKiBzaXplb2YoeGF0dHJfYWNsX2VudHJ5KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgeGF0dHJfYWNsX2NvdW50KHNpemVfdCBzaXplKQotewotCWlmIChzaXplIDwgc2l6ZW9mKHhhdHRyX2FjbF9oZWFkZXIpKQotCQlyZXR1cm4gLTE7Ci0Jc2l6ZSAtPSBzaXplb2YoeGF0dHJfYWNsX2hlYWRlcik7Ci0JaWYgKHNpemUgJSBzaXplb2YoeGF0dHJfYWNsX2VudHJ5KSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBzaXplIC8gc2l6ZW9mKHhhdHRyX2FjbF9lbnRyeSk7Ci19Ci0KLXN0cnVjdCBwb3NpeF9hY2wgKiBwb3NpeF9hY2xfZnJvbV94YXR0cihjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOwotaW50IHBvc2l4X2FjbF90b194YXR0cihjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi0KLQotI2VuZGlmIC8qIF9MSU5VWF9YQVRUUl9BQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKaW5kZXggZjM0NWE2MS4uY2Q4MzExNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogYXVkaW9jaGlwLmgsdiAxLjMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGF1ZGlvY2hpcC5oLHYgMS41IDIwMDUvMDYvMTYgMjI6NTk6MTYgaGhhY2ttYW5uIEV4cCAkCiAgKi8KIAogI2lmbmRlZiBBVURJT0NISVBfSApAQCAtMzUsNSArMzUsNCBAQAogCiAvKiBtaXNjIHN0dWZmIHRvIHBhc3MgYXJvdW5kIGNvbmZpZyBpbmZvIHRvIGkyYyBjaGlwcyAqLwogI2RlZmluZSBBVURDX0NPTkZJR19QSU5OQUNMRSAgX0lPVygnbScsMzIsaW50KQotCiAjZW5kaWYgLyogQVVESU9DSElQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmggYi9pbmNsdWRlL21lZGlhL3NhYTY3NTJocy5oCmluZGV4IDc5MWJhZDIuLjNiODY4NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE2NzUyaHMuaApAQCAtMTgsNTUgKzE4LDYgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKLSNpZiAwIC8qIG5kZWYgX1NBQTY3NTJIU19IICovCi0jZGVmaW5lIF9TQUE2NzUySFNfSAotCi1lbnVtIG1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHsKLQlNUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIgPSAwLCAvKiBWYXJpYWJsZSBiaXRyYXRlICovCi0JTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSID0gMSwgLyogQ29uc3RhbnQgYml0cmF0ZSAqLwotCi0JTVBFR19WSURFT19CSVRSQVRFX01PREVfTUFYCi19OwotCi1lbnVtIG1wZWdfYXVkaW9fYml0cmF0ZSB7Ci0JTVBFR19BVURJT19CSVRSQVRFXzI1NiA9IDAsIC8qIDI1NiBrQml0L3NlYyAqLwotCU1QRUdfQVVESU9fQklUUkFURV8zODQgPSAxLCAvKiAzODQga0JpdC9zZWMgKi8KLQotCU1QRUdfQVVESU9fQklUUkFURV9NQVgKLX07Ci0KLWVudW0gbXBlZ192aWRlb19mb3JtYXQgewotCU1QRUdfVklERU9fRk9STUFUX0QxID0gMCwKLQlNUEVHX1ZJREVPX0ZPUk1BVF8yXzNfRDEgPSAxLAotCU1QRUdfVklERU9fRk9STUFUXzFfMl9EMSA9IDIsCi0JTVBFR19WSURFT19GT1JNQVRfU0lGID0gMywKLQotCU1QRUdfVklERU9fRk9STUFUX01BWAotfTsKLQotI2RlZmluZSBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAyNzAwMAotI2RlZmluZSBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWCAyNzAwMAotI2RlZmluZSBNUEVHX1RPVEFMX0JJVFJBVEVfTUFYIDI3MDAwCi0jZGVmaW5lIE1QRUdfUElEX01BWCAoKDEgPDwgMTQpIC0gMSkKLQotc3RydWN0IG1wZWdfcGFyYW1zIHsKLQllbnVtIG1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHZpZGVvX2JpdHJhdGVfbW9kZTsKLQl1bnNpZ25lZCBpbnQgdmlkZW9fdGFyZ2V0X2JpdHJhdGU7Ci0JdW5zaWduZWQgaW50IHZpZGVvX21heF9iaXRyYXRlOyAvLyBvbmx5IHVzZWQgZm9yIFZCUgotCWVudW0gbXBlZ19hdWRpb19iaXRyYXRlIGF1ZGlvX2JpdHJhdGU7Ci0JdW5zaWduZWQgaW50IHRvdGFsX2JpdHJhdGU7Ci0KLSAgIAl1bnNpZ25lZCBpbnQgcG10X3BpZDsKLQl1bnNpZ25lZCBpbnQgdmlkZW9fcGlkOwotCXVuc2lnbmVkIGludCBhdWRpb19waWQ7Ci0JdW5zaWduZWQgaW50IHBjcl9waWQ7Ci0KLQllbnVtIG1wZWdfdmlkZW9fZm9ybWF0IHZpZGVvX2Zvcm1hdDsKLX07Ci0KLSNkZWZpbmUgTVBFR19TRVRQQVJBTVMgICAgICAgICAgICAgX0lPVygnNicsMTAwLHN0cnVjdCBtcGVnX3BhcmFtcykKLQotI2VuZGlmIC8vIF9TQUE2NzUySFNfSAogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dW5lci5oIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCmluZGV4IDJkZDgzMTAuLmQ4YzBhNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKQEAgLTEsNSArMSw2IEBACiAKLS8qCisvKiAkSWQ6IHR1bmVyLmgsdiAxLjQyIDIwMDUvMDcvMDYgMDk6NDI6MTkgbWNoZWhhYiBFeHAgJAorICoKICAgICB0dW5lci5oIC0gZGVmaW5pdGlvbiBmb3IgZGlmZmVyZW50IHR1bmVycwogCiAgICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcmt1cyBTY2hyb2VkZXIgKHNjaHJvZWRtQHVuaS1kdWVzc2VsZG9yZi5kZSkKQEAgLTIzLDcgKzI0LDcgQEAKICNpZm5kZWYgX1RVTkVSX0gKICNkZWZpbmUgX1RVTkVSX0gKIAotI2luY2x1ZGUgImlkLmgiCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKICNkZWZpbmUgQUREUl9VTlNFVCAoMjU1KQogCkBAIC04OCw3ICs4OSw3IEBACiAjZGVmaW5lIFRVTkVSX0xHX05UU0NfVEFQRSAgICAgICA0NwogCiAjZGVmaW5lIFRVTkVSX1RORl84ODMxQkdGRiAgICAgICA0OAotI2RlZmluZSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNSAgNDkJLyogRnVzaW9uSERUViAzIEdvbGQgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KKyNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTUgIDQ5CS8qIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KICNkZWZpbmUgVFVORVJfVENMXzIwMDJOICAgICAgICAgIDUwCiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMyAgIDUxCiAKQEAgLTk4LDE3ICs5OSwxNSBAQAogI2RlZmluZSBUVU5FUl9MR19QQUxfVEFQRSAgICAgICAgNTUgICAgLyogSGF1cHBhdWdlIFBWUi0xNTAgUEFMICovCiAKICNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0IDU2IC8qIEhhdXBwYXVnZSBQVlItMTUwIFBBTCAqLwotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0IDU3ICAgLyogSGF1cHBhdWdlIFBWUi01MDBNQ0UgTlRTQyAqLworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0ICAgNTcgICAvKiBIYXVwcGF1Z2UgUFZSLTUwME1DRSBOVFNDICovCiAKICNkZWZpbmUgVFVORVJfWU1FQ19UVkZfODUzMU1GIDU4CiAjZGVmaW5lIFRVTkVSX1lNRUNfVFZGXzU1MzNNRiA1OQkvKiBQaXhlbHZpZXcgUHJvIFVsdHJhIE5UU0MgKi8KLSNkZWZpbmUgVFVORVJfVEhPTVNPTl9EVFQ3NjExIDYwCisjZGVmaW5lIFRVTkVSX1RIT01TT05fRFRUNzYxMSA2MAkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UICovCiAjZGVmaW5lIFRVTkVSX1RFTkFfOTUzM19ESSAgICA2MQorCiAjZGVmaW5lIFRVTkVSX1RFQTU3NjcgICAgICAgICA2MgkvKiBPbmx5IEZNIFJhZGlvIFR1bmVyICovCi0KLSNkZWZpbmUgVEVBNTc2N19UVU5FUl9OQU1FICJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyIKLQotI2RlZmluZSBUVU5FUl9USE9NU09OX0RUVDc2MTEgICAgNjAKKyNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszIDYzCiAKICNkZWZpbmUgTk9UVU5FUiAwCiAjZGVmaW5lIFBBTCAgICAgMQkvKiBQQUxfQkcgKi8KQEAgLTEzMiwxOSArMTMxLDggQEAKICNkZWZpbmUgVENMICAgICAxMQogI2RlZmluZSBUSE9NU09OIDEyCiAKLWVudW0gdjRsX3JhZGlvX3R1bmVyIHsKLSAgICAgICAgVEVBNTc2N19MT1dfTE9fMzI3NjggICAgPSAwLAotICAgICAgICBURUE1NzY3X0hJR0hfTE9fMzI3NjggICA9IDEsCi0gICAgICAgIFRFQTU3NjdfTE9XX0xPXzEzTUh6ICAgID0gMiwKLSAgICAgICAgVEVBNTc2N19ISUdIX0xPXzEzTUh6ICAgPSAzLAotfTsKLQotCi0jZGVmaW5lIFRVTkVSX1NFVF9UWVBFICAgICAgICAgICAgICAgX0lPVygndCcsMSxpbnQpICAgIC8qIHNldCB0dW5lciB0eXBlICovCi0jZGVmaW5lIFRVTkVSX1NFVF9UVkZSRVEgICAgICAgICAgICAgX0lPVygndCcsMixpbnQpICAgIC8qIHNldCB0diBmcmVxICovCi0jZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnVCcsMyxpbnQpCS8qIHNldCB0dW5lciB0eXBlIGFuZCBJMkMgYWRkciAqLwotCi0jZGVmaW5lICBUREE5ODg3X1NFVF9DT05GSUcgICAgICAgICAgX0lPVygndCcsNSxpbnQpCisjZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnVCcsMyxpbnQpCisjZGVmaW5lIFREQTk4ODdfU0VUX0NPTkZJRyAgICAgICAgICAgX0lPVygndCcsNSxpbnQpCiAKIC8qIHR2IGNhcmQgc3BlY2lmaWMgKi8KICMgZGVmaW5lIFREQTk4ODdfUFJFU0VOVCAgICAgICAgICAgICAoMTw8MCkKQEAgLTE2NiwyNSArMTU0LDM0IEBACiAjZGVmaW5lIEkyQ19BRERSX1REQTgyOTAgICAgICAgIDB4NGIKICNkZWZpbmUgSTJDX0FERFJfVERBODI3NSAgICAgICAgMHg2MQogCi1zdHJ1Y3QgdHVuZXJfYWRkciB7Ci0JZW51bSB2NGwyX3R1bmVyX3R5cGUJdjRsMl90dW5lcjsKLQl1bnNpZ25lZCBpbnQJCXR5cGU7CitlbnVtIHR1bmVyX21vZGUgeworCVRfVU5JTklUSUFMSVpFRCA9IDAsCisJVF9SQURJTwkJPSAxIDw8IFY0TDJfVFVORVJfUkFESU8sCisJVF9BTkFMT0dfVFYgICAgID0gMSA8PCBWNEwyX1RVTkVSX0FOQUxPR19UViwKKwlUX0RJR0lUQUxfVFYgICAgPSAxIDw8IFY0TDJfVFVORVJfRElHSVRBTF9UViwKKwlUX1NUQU5EQlkJPSAxIDw8IDMxCit9OworCitzdHJ1Y3QgdHVuZXJfc2V0dXAgewogCXVuc2lnbmVkIHNob3J0CQlhZGRyOworCXVuc2lnbmVkIGludAkJdHlwZTsKKwl1bnNpZ25lZCBpbnQJCW1vZGVfbWFzazsKIH07CiAKIHN0cnVjdCB0dW5lciB7CiAJLyogZGV2aWNlICovCiAJc3RydWN0IGkyY19jbGllbnQgaTJjOwogCi0JLyogc3RhdGUgKyBjb25maWcgKi8KLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ7CiAJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAgLyogY2hpcCB0eXBlICovCi0JdW5zaWduZWQgaW50IGZyZXE7ICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotCXY0bDJfc3RkX2lkICBzdGQ7Ci0JaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKLQllbnVtIHY0bDJfdHVuZXJfdHlwZSBtb2RlOwotCXVuc2lnbmVkIGludCBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZV9tYXNrOyAvKiBDb21iaW5hdGlvbiBvZiBhbGxvd2FibGUgbW9kZXMgKi8KKworCXVuc2lnbmVkIGludCBmcmVxOyAgICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgYXVkbW9kZTsKKwl2NGwyX3N0ZF9pZCAgc3RkOworCisJaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKIAkvKiB1c2VkIGJ5IE1UMjAzMiAqLwogCXVuc2lnbmVkIGludCB4b2djOwpAQCAtMjA2LDcgKzIwMyw5IEBACiAKIGV4dGVybiBpbnQgbWljcm90dW5lX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCB0ZGE4MjkwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOworZXh0ZXJuIGludCB0ZWE1NzY3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCBkZWZhdWx0X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOworZXh0ZXJuIGludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpOwogCiAjZGVmaW5lIHR1bmVyX3dhcm4oZm10LCBhcmcuLi4pIFwKIAlkZXZfcHJpbnRrKEtFUk5fV0FSTklORyAsICZ0LT5pMmMuZGV2ICwgZm10ICwgIyMgYXJnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvbXRkLWFiaS5oIGIvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCmluZGV4IGE3NmFiODkuLjQyOGQ5MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL210ZC1hYmkuaAorKysgYi9pbmNsdWRlL210ZC9tdGQtYWJpLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBtdGQtYWJpLmgsdiAxLjcgMjAwNC8xMS8yMyAxNTozNzozMiBnbGVpeG5lciBFeHAgJAorICogJElkOiBtdGQtYWJpLmgsdiAxLjExIDIwMDUvMDUvMTkgMTY6MDg6NTggZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBQb3J0aW9ucyBvZiBNVEQgQUJJIGRlZmluaXRpb24gd2hpY2ggYXJlIHNoYXJlZCBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UgCiAgKi8KQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgTVREX05PUkZMQVNICQkzCiAjZGVmaW5lIE1URF9OQU5ERkxBU0gJCTQKICNkZWZpbmUgTVREX1BFUk9NCQk1CisjZGVmaW5lIE1URF9EQVRBRkxBU0gJCTYKICNkZWZpbmUgTVREX09USEVSCQkxNAogI2RlZmluZSBNVERfVU5LTk9XTgkJMTUKIApAQCAtNjAsNiArNjEsMTIgQEAKICNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0UJMQkvLyBVc2UgdGhlIGdpdmVuIHBsYWNlbWVudCBpbiB0aGUgc3RydWN0dXJlIChZQUZGUzEgbGVnYWN5IG1vZGUpCiAjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTEFDRQkyCS8vIFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lCiAjZGVmaW5lIE1URF9OQU5ERUNDX1BMQUNFT05MWQkzCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKERvIG5vdCBzdG9yZSBlY2MgcmVzdWx0IG9uIHJlYWQpCisjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTF9VU1IgCTQJLy8gVXNlIHRoZSBnaXZlbiBhdXRvcGxhY2VtZW50IHNjaGVtZSByYXRoZXIgdGhhbiB1c2luZyB0aGUgZGVmYXVsdAorCisvKiBPVFAgbW9kZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTVREX09UUF9PRkYJCTAKKyNkZWZpbmUgTVREX09UUF9GQUNUT1JZCQkxCisjZGVmaW5lIE1URF9PVFBfVVNFUgkJMgogCiBzdHJ1Y3QgbXRkX2luZm9fdXNlciB7CiAJdWludDhfdCB0eXBlOwpAQCAtODAsNiArODcsMTIgQEAKIAl1aW50MzJfdCByZWdpb25pbmRleDsKIH07CiAKK3N0cnVjdCBvdHBfaW5mbyB7CisJdWludDMyX3Qgc3RhcnQ7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQzMl90IGxvY2tlZDsKK307CisKICNkZWZpbmUgTUVNR0VUSU5GTyAgICAgICAgICAgICAgX0lPUignTScsIDEsIHN0cnVjdCBtdGRfaW5mb191c2VyKQogI2RlZmluZSBNRU1FUkFTRSAgICAgICAgICAgICAgICBfSU9XKCdNJywgMiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKICNkZWZpbmUgTUVNV1JJVEVPT0IgICAgICAgICAgICAgX0lPV1IoJ00nLCAzLCBzdHJ1Y3QgbXRkX29vYl9idWYpCkBAIC05Miw2ICsxMDUsMTAgQEAKICNkZWZpbmUgTUVNR0VUT09CU0VMCQlfSU9SKCdNJywgMTAsIHN0cnVjdCBuYW5kX29vYmluZm8pCiAjZGVmaW5lIE1FTUdFVEJBREJMT0NLCQlfSU9XKCdNJywgMTEsIGxvZmZfdCkKICNkZWZpbmUgTUVNU0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMiwgbG9mZl90KQorI2RlZmluZSBPVFBTRUxFQ1QJCV9JT1IoJ00nLCAxMywgaW50KQorI2RlZmluZSBPVFBHRVRSRUdJT05DT1VOVAlfSU9XKCdNJywgMTQsIGludCkKKyNkZWZpbmUgT1RQR0VUUkVHSU9OSU5GTwlfSU9XKCdNJywgMTUsIHN0cnVjdCBvdHBfaW5mbykKKyNkZWZpbmUgT1RQTE9DSwkJX0lPUignTScsIDE2LCBzdHJ1Y3Qgb3RwX2luZm8pCiAKIHN0cnVjdCBuYW5kX29vYmluZm8gewogCXVpbnQzMl90IHVzZWVjYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogTWVyZ2VkIHdpdGggbWFpbmxpbmUgaWVlZTgwMjExLmggaW4gQXVnIDIwMDQuICBPcmlnaW5hbCBpZWVlODAyXzExCisgKiByZW1haW5zIGNvcHlyaWdodCBieSB0aGUgb3JpZ2luYWwgYXV0aG9ycworICoKKyAqIFBvcnRpb25zIG9mIHRoZSBtZXJnZWQgY29kZSBhcmUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MKKyAqIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKworCisjZGVmaW5lIElFRUU4MDIxMV9ITEVOCQkJMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTgkJKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIGVhcF90eXBlIHsKKwlFQVBfUEFDS0VUID0gMCwKKwlFQVBPTF9TVEFSVCwKKwlFQVBPTF9MT0dPRkYsCisJRUFQT0xfS0VZLAorCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0geworCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCisJW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAorCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAorCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAorCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorCitzdHJ1Y3QgZWFwb2wgeworCXU4IHNuYXBbNl07CisJdTE2IGV0aGVydHlwZTsKKwl1OCB2ZXJzaW9uOworCXU4IHR5cGU7CisJdTE2IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElFRUU4MDIxMV8xQUREUl9MRU4gMTAKKyNkZWZpbmUgSUVFRTgwMjExXzJBRERSX0xFTiAxNgorI2RlZmluZSBJRUVFODAyMTFfM0FERFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDU19MRU4gICAgNAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCisKKworLyogZGVidWcgbWFjcm9zICovCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJWMgJXMgIiBmbXQsIFwKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9FUlJPUihmLCBhLi4uKSBwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfV0FSTklORyhmLCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0lORk8oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lORk8sIGYsICMjIGEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1dYKGYsIGEuLi4pICAgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1dYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU0NBTihmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU0NBTiwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NUQVRFKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NUQVRFLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfTUdNVChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9NR01ULCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRlJBRyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9GUkFHLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRUFQKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VBUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0RST1AoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRFJPUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1RYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUlgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlgsIGYsICMjIGEpCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworICAgICAgICB1OCAgICBkc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisgICAgICAgIHU4ICAgIHNzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworICAgICAgICB1OCAgICBvdWlbUDgwMjExX09VSV9MRU5dOyAgICAvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQorCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgV0xBTl9BVVRIX09QRU4gMAorI2RlZmluZSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAxCisKKyNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CisKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBXTEFOX1NUQVRVU19TVUNDRVNTIDAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSAxCisjZGVmaW5lIFdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQgMTAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyAxMQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDIDEyCisjZGVmaW5lIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEcgMTMKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OIDE0CisjZGVmaW5lIFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMIDE1CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FVVEhfVElNRU9VVCAxNgorI2RlZmluZSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgMTcKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIDE4CisvKiA4MDIuMTFiICovCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUIDE5CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgMjAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSAyMQorCisvKiBSZWFzb24gY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgMQorI2RlZmluZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDIKKyNkZWZpbmUgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgMworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA0CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgNQorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA2CisjZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA3CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA4CisjZGVmaW5lIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIIDkKKworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQgkJICAgICAgICAweDAyCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUIJCSAgICAgICAgMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkgICAgICAgIDB4MEIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUIJCSAgICAgICAgMHgxNgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWU7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2lmIDAgLyogZm9yIGxhdGVyICovCisjaW5jbHVkZSAiaWVlZTgwMjExX2NyeXB0LmgiCisjZW5kaWYKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorCisjZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCisjZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KKworI2RlZmluZSBXRVBfS0VZUyA0CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisKK3N0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgeworCXUxNiBhY3RpdmVfa2V5OjIsCisgICAgICAgICAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorICAgICAgICAgICAgYXV0aF9hbGdvOjQsCisgICAgICAgICAgICB1bmljYXN0X3VzZXNfZ3JvdXA6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorCisgODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisKKyovCisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCisjZGVmaW5lIE1GSUVfVFlQRV9TU0lEICAgICAgIDAKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTICAgICAgMQorI2RlZmluZSBNRklFX1RZUEVfRkhfU0VUICAgICAyCisjZGVmaW5lIE1GSUVfVFlQRV9EU19TRVQgICAgIDMKKyNkZWZpbmUgTUZJRV9UWVBFX0NGX1NFVCAgICAgNAorI2RlZmluZSBNRklFX1RZUEVfVElNICAgICAgICA1CisjZGVmaW5lIE1GSUVfVFlQRV9JQlNTX1NFVCAgIDYKKyNkZWZpbmUgTUZJRV9UWVBFX0NIQUxMRU5HRSAgMTYKKyNkZWZpbmUgTUZJRV9UWVBFX1JTTgkgICAgIDQ4CisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFU19FWCAgIDUwCisjZGVmaW5lIE1GSUVfVFlQRV9HRU5FUklDICAgIDIyMQorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGFsZ29yaXRobTsKKwl1MTYgdHJhbnNhY3Rpb247CisJdTE2IHN0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IHN0YXR1czsKKwl1MTYgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsgLyogc3VwcG9ydGVkIHJhdGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiB7CisJdTggbnJfZnJhZ3M7CisJdTggZW5jcnlwdGVkOworCXUxNiByZXNlcnZlZDsKKwl1MTYgZnJhZ19zaXplOworCXUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggcmF0ZXNfbGVuOworCXU4IHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4IHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCBtb2RlOworCXU4IGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisJSUVFRTgwMjExX1VOSU5JVElBTElaRUQgPSAwLAorCUlFRUU4MDIxMV9JTklUSUFMSVpFRCwKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkcsCisJSUVFRTgwMjExX0FTU09DSUFURUQsCisJSUVFRTgwMjExX0FVVEhFTlRJQ0FUSU5HLAorCUlFRUU4MDIxMV9BVVRIRU5USUNBVEVELAorCUlFRUU4MDIxMV9TSFVURE9XTgorfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKKyNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgorI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfZGVpbml0X2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdFtXRVBfS0VZU107CisJaW50IHR4X2tleWlkeDsgLyogZGVmYXVsdCBUWCBrZXkgaW5kZXggKGNyeXB0W3R4X2tleWlkeF0pICovCisJc3RydWN0IHRpbWVyX2xpc3QgY3J5cHRfZGVpbml0X3RpbWVyOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHg7CisJdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KKworCS8qIEFzc29jaWF0aW9uIGluZm8gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKKworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3R1cmU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KKwl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpOworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKK2V4dGVybiBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSBJRUVFODAyMTFfNEFERFJfTEVOOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgorCQkJaGRybGVuID0gSUVFRTgwMjExXzFBRERSX0xFTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gSUVFRTgwMjExXzJBRERSX0xFTjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKKworCitleHRlcm4gaW5saW5lIHZvaWQgaWVlZTgwMjExX2luY3JlbWVudF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zY2FucysrOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXJldHVybiBpZWVlLT5zY2FuczsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikgeworCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CisJY29uc3QgY2hhciAqcyA9IGVzc2lkOworCWNoYXIgKmQgPSBlc2NhcGVkOworCisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgeworCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKKwkJcmV0dXJuIGVzY2FwZWQ7CisJfQorCisJZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKKwkJaWYgKCpzID09ICdcMCcpIHsKKwkJCSpkKysgPSAnXFwnOworCQkJKmQrKyA9ICcwJzsKKwkJCXMrKzsKKwkJfSBlbHNlIHsKKwkJCSpkKysgPSAqcysrOworCQl9CisJfQorCSpkID0gJ1wwJzsKKwlyZXR1cm4gZXNjYXBlZDsKK30KKworI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggNzcxYjQ3ZS4uNjkzMjQ0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtMTgzLDcgKzE4Myw2IEBACiAJc3RydWN0IGlwdjZfb3B0X2hkcgkqaG9wb3B0OwogCXN0cnVjdCBpcHY2X29wdF9oZHIJKmRzdDBvcHQ7CiAJc3RydWN0IGlwdjZfcnRfaGRyCSpzcmNydDsJLyogUm91dGluZyBIZWFkZXIgKi8KLQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyCSphdXRoOwogCXN0cnVjdCBpcHY2X29wdF9oZHIJKmRzdDFvcHQ7CiAKIAkvKiBPcHRpb24gYnVmZmVyLCBhcyByZWFkIGJ5IElQVjZfUEtUT1BUSU9OUywgc3RhcnRzIGhlcmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL2lyZGFfZGV2aWNlLmggYi9pbmNsdWRlL25ldC9pcmRhL2lyZGFfZGV2aWNlLmgKaW5kZXggNzFkNmFmOC4uOTJjODI4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS9pcmRhX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvaXJkYV9kZXZpY2UuaApAQCAtMjI0LDcgKzIyNCw3IEBACiAvKiBJbnRlcmZhY2UgZm9yIGludGVybmFsIHVzZSAqLwogc3RhdGljIGlubGluZSBpbnQgaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiAoc2tiX3F1ZXVlX2xlbigmZGV2LT5xZGlzYy0+cSkgPT0gMCk7CisJcmV0dXJuIHNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5xZGlzYy0+cSk7CiB9CiBpbnQgIGlyZGFfZGV2aWNlX3NldF9yYXdfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSogc2VsZiwgaW50IHN0YXR1cyk7CiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaXJkYWRldihpbnQgc2l6ZW9mX3ByaXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCBmY2IwNWEzLi42NDkyZTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtMTMsMTMgKzEzLDEyIEBACiAKIGV4dGVybiByd2xvY2tfdCBxZGlzY190cmVlX2xvY2s7CiAKLSNkZWZpbmUJUURJU0NfQUxJR04JCTMyCi0jZGVmaW5lCVFESVNDX0FMSUdOX0NPTlNUCShRRElTQ19BTElHTiAtIDEpCisjZGVmaW5lIFFESVNDX0FMSUdOVE8JCTMyCisjZGVmaW5lIFFESVNDX0FMSUdOKGxlbikJKCgobGVuKSArIFFESVNDX0FMSUdOVE8tMSkgJiB+KFFESVNDX0FMSUdOVE8tMSkpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqcWRpc2NfcHJpdihzdHJ1Y3QgUWRpc2MgKnEpCiB7Ci0JcmV0dXJuIChjaGFyICopcSArICgoc2l6ZW9mKHN0cnVjdCBRZGlzYykgKyBRRElTQ19BTElHTl9DT05TVCkKLQkJCSAgICAgICYgflFESVNDX0FMSUdOX0NPTlNUKTsKKwlyZXR1cm4gKGNoYXIgKikgcSArIFFESVNDX0FMSUdOKHNpemVvZihzdHJ1Y3QgUWRpc2MpKTsKIH0KIAogLyogCkBAIC0yMDcsOCArMjA2LDYgQEAKIAogI2VuZGlmIC8qICFDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZICovCiAKLWV4dGVybiBzdHJ1Y3QgUWRpc2Mgbm9vcF9xZGlzYzsKLWV4dGVybiBzdHJ1Y3QgUWRpc2Nfb3BzIG5vb3BfcWRpc2Nfb3BzOwogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgcGZpZm9fcWRpc2Nfb3BzOwogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgYmZpZm9fcWRpc2Nfb3BzOwogCkBAIC0yMTYsMTQgKzIxMyw2IEBACiBleHRlcm4gaW50IHVucmVnaXN0ZXJfcWRpc2Moc3RydWN0IFFkaXNjX29wcyAqcW9wcyk7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXBfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBkZXZfaW5pdF9zY2hlZHVsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHFkaXNjX3Jlc2V0KHN0cnVjdCBRZGlzYyAqcWRpc2MpOwotZXh0ZXJuIHZvaWQgcWRpc2NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKLWV4dGVybiBzdHJ1Y3QgUWRpc2MgKiBxZGlzY19jcmVhdGVfZGZsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBRZGlzY19vcHMgKm9wcyk7CiBleHRlcm4gc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnFkaXNjX2dldF9ydGFiKHN0cnVjdCB0Y19yYXRlc3BlYyAqciwKIAkJc3RydWN0IHJ0YXR0ciAqdGFiKTsKIGV4dGVybiB2b2lkIHFkaXNjX3B1dF9ydGFiKHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICp0YWIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggN2I5NzQwNS4uN2I2ZWM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC0xNjQsNiArMTY0LDE5IEBACiAjZGVmaW5lIHRjZl90cmVlX2xvY2sodHApCXFkaXNjX2xvY2tfdHJlZSgodHApLT5xLT5kZXYpCiAjZGVmaW5lIHRjZl90cmVlX3VubG9jayh0cCkJcWRpc2NfdW5sb2NrX3RyZWUoKHRwKS0+cS0+ZGV2KQogCitleHRlcm4gc3RydWN0IFFkaXNjIG5vb3BfcWRpc2M7CitleHRlcm4gc3RydWN0IFFkaXNjX29wcyBub29wX3FkaXNjX29wczsKKworZXh0ZXJuIHZvaWQgZGV2X2luaXRfc2NoZWR1bGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X2FjdGl2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBxZGlzY19yZXNldChzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKK2V4dGVybiB2b2lkIHFkaXNjX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpxZGlzYyk7CitleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOworZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKKwogc3RhdGljIGlubGluZSB2b2lkCiB0Y2ZfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCmluZGV4IDQ4NjhjN2YuLjU5OTllNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaApAQCAtMjYzLDIzICsyNjMsMTEgQEAKIGVudW0geyBTQ1RQX01BWF9EVVBfVFNOUyA9IDE2IH07CiBlbnVtIHsgU0NUUF9NQVhfR0FCUyA9IDE2IH07CiAKLS8qIEhlcmUgd2UgZGVmaW5lIHRoZSBkZWZhdWx0IHRpbWVycy4gICovCisvKiBIZWFydGJlYXQgaW50ZXJ2YWwgLSAzMCBzZWNzICovCisjZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVAkoMzAgKiBIWikKIAotLyogY29va2llIHRpbWVyIGRlZiA9ID8gc2Vjb25kcyAqLwotI2RlZmluZSBTQ1RQX0RFRkFVTFRfVElNRU9VVF9UMV9DT09LSUUJKDMgKiBIWikKLQotLyogaW5pdCB0aW1lciBkZWYgPSAzIHNlY29uZHMgICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1QxX0lOSVQJKDMgKiBIWikKLQotLyogc2h1dGRvd24gdGltZXIgZGVmID0gMzAwIG1zICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1QyX1NIVVRET1dOICgoMzAwICogSFopIC8gMTAwMCkKLQotLyogMCBzZWNvbmRzICsgUlRPICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVAkoMTAgKiBIWikKLQotLyogcmVjdiB0aW1lciBkZWYgPSAyMDBtcyAoaW4gdXNlYykgKi8KKy8qIERlbGF5ZWQgc2FjayB0aW1lciAtIDIwMG1zICovCiAjZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1NBQ0sJKCgyMDAgKiBIWikgLyAxMDAwKQotI2RlZmluZSBTQ1RQX0RFRkFVTFRfVElNRU9VVF9TQUNLX01BWAkoKDUwMCAqIEhaKSAvIDEwMDApIC8qIDUwMCBtcyAqLwogCiAvKiBSVE8uSW5pdGlhbCAgICAgICAgICAgICAgLSAzICBzZWNvbmRzCiAgKiBSVE8uTWluICAgICAgICAgICAgICAgICAgLSAxICBzZWNvbmQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKaW5kZXggZWYyNzM4MS4uZTFkNWVjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKQEAgLTEyNSw3ICsxMjUsOCBAQAogICovCiBleHRlcm4gc3RydWN0IHNvY2sgKnNjdHBfZ2V0X2N0bF9zb2NrKHZvaWQpOwogZXh0ZXJuIGludCBzY3RwX2NvcHlfbG9jYWxfYWRkcl9saXN0KHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLAotCQkJCSAgICAgc2N0cF9zY29wZV90LCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpOworCQkJCSAgICAgc2N0cF9zY29wZV90LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAorCQkJCSAgICAgaW50IGZsYWdzKTsKIGV4dGVybiBzdHJ1Y3Qgc2N0cF9wZiAqc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2FfZmFtaWx5X3QgZmFtaWx5KTsKIGV4dGVybiBpbnQgc2N0cF9yZWdpc3Rlcl9wZihzdHJ1Y3Qgc2N0cF9wZiAqLCBzYV9mYW1pbHlfdCk7CiAKQEAgLTE2NiwxNSArMTY3LDEyIEBACiB2b2lkIHNjdHBfaGFzaF9lbmRwb2ludChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKTsKIHZvaWQgc2N0cF91bmhhc2hfZW5kcG9pbnQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiBzdHJ1Y3Qgc29jayAqc2N0cF9lcnJfbG9va3VwKGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICosCi0JCQkgICAgIHN0cnVjdCBzY3RwaGRyICosIHN0cnVjdCBzY3RwX2VuZHBvaW50ICoqLAotCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKiwKKwkJCSAgICAgc3RydWN0IHNjdHBoZHIgKiwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiosCiAJCQkgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKik7Ci12b2lkIHNjdHBfZXJyX2ZpbmlzaChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqLAotCQkJICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopOwordm9pZCBzY3RwX2Vycl9maW5pc2goc3RydWN0IHNvY2sgKiwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CiB2b2lkIHNjdHBfaWNtcF9mcmFnX25lZWRlZChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0LCBfX3UzMiBwbXR1KTsKIHZvaWQgc2N0cF9pY21wX3Byb3RvX3VucmVhY2hhYmxlKHN0cnVjdCBzb2NrICpzaywKLQkJCQkgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCSBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCmluZGV4IDg4ZDlmZTUuLjU4NDYyMTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NtLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCkBAIC0xODEsMTcgKzE4MSwxNyBAQAogaW50IHNjdHBfY2h1bmtfaWlmKGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfbWFrZV90ZW1wX2Fzb2MoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKiwKIAkJCQkJICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAotCQkJCQkgICAgIGludCBnZnApOworCQkJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogX191MzIgc2N0cF9nZW5lcmF0ZV92ZXJpZmljYXRpb25fdGFnKHZvaWQpOwogdm9pZCBzY3RwX3BvcHVsYXRlX3RpZV90YWdzKF9fdTggKmNvb2tpZSwgX191MzIgY3VyVGFnLCBfX3UzMiBoaXNUYWcpOwogCiAvKiBQcm90b3R5cGVzIGZvciBjaHVuay1idWlsZGluZyBmdW5jdGlvbnMuICAqLwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLAotCQkJICAgICBpbnQgZ2ZwLCBpbnQgdnBhcmFtX2xlbik7CisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCB2cGFyYW1fbGVuKTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaW5pdF9hY2soY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKiwKLQkJCQkgY29uc3QgaW50IGdmcCwKKwkJCQkgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKIAkJCQkgY29uc3QgaW50IHVua3BhcmFtX2xlbik7CiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2Nvb2tpZV9lY2hvKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqLAogICAgICAgICAgICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAgICAgICAgICAgICAgICB2b2lkICpldmVudF9hcmcsCi0gICAgICAgICAgICAgICBpbnQgZ2ZwKTsKKwkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIC8qIDJuZCBsZXZlbCBwcm90b3R5cGVzICovCiB2b2lkIHNjdHBfZ2VuZXJhdGVfdDNfcnR4X2V2ZW50KHVuc2lnbmVkIGxvbmcgcGVlcik7CkBAIC0yNzUsNyArMjc1LDggQEAKIAogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfdW5wYWNrX2Nvb2tpZShjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQgZ2ZwLCBpbnQgKmVyciwKKwkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgaW50ICplcnIsCiAJCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICoqZXJyX2Noa19wKTsKIGludCBzY3RwX2FkZGlwX2FkZHJfY29uZmlnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIHNjdHBfcGFyYW1fdCwKIAkJCSAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggZGZhZDRkMy4uOTk0MDA5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTE2MSw2ICsxNjEsOSBAQAogCSAqLwogCWludCBzbmRidWZfcG9saWN5OwogCisJLyogRGVsYXllZCBTQUNLIHRpbWVvdXQgIDIwMG1zIGRlZmF1bHQqLworCWludCBzYWNrX3RpbWVvdXQ7CisKIAkvKiBIQi5pbnRlcnZhbAkJICAgIC0gMzAgc2Vjb25kcyAgKi8KIAlpbnQgaGJfaW50ZXJ2YWw7CiAKQEAgLTIxNyw2ICsyMjAsNyBAQAogI2RlZmluZSBzY3RwX3NuZGJ1Zl9wb2xpY3kJIAkoc2N0cF9nbG9iYWxzLnNuZGJ1Zl9wb2xpY3kpCiAjZGVmaW5lIHNjdHBfbWF4X3JldHJhbnNfcGF0aAkJKHNjdHBfZ2xvYmFscy5tYXhfcmV0cmFuc19wYXRoKQogI2RlZmluZSBzY3RwX21heF9yZXRyYW5zX2luaXQJCShzY3RwX2dsb2JhbHMubWF4X3JldHJhbnNfaW5pdCkKKyNkZWZpbmUgc2N0cF9zYWNrX3RpbWVvdXQJCShzY3RwX2dsb2JhbHMuc2Fja190aW1lb3V0KQogI2RlZmluZSBzY3RwX2hiX2ludGVydmFsCQkoc2N0cF9nbG9iYWxzLmhiX2ludGVydmFsKQogI2RlZmluZSBzY3RwX21heF9pbnN0cmVhbXMJCShzY3RwX2dsb2JhbHMubWF4X2luc3RyZWFtcykKICNkZWZpbmUgc2N0cF9tYXhfb3V0c3RyZWFtcwkJKHNjdHBfZ2xvYmFscy5tYXhfb3V0c3RyZWFtcykKQEAgLTQ0MSw3ICs0NDUsOCBAQAogCWludCBtYWxsb2NlZDsKIH07CiAKLXN0cnVjdCBzY3RwX3Nzbm1hcCAqc2N0cF9zc25tYXBfbmV3KF9fdTE2IGluLCBfX3UxNiBvdXQsIGludCBnZnApOworc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9uZXcoX191MTYgaW4sIF9fdTE2IG91dCwKKwkJCQkgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiB2b2lkIHNjdHBfc3NubWFwX2ZyZWUoc3RydWN0IHNjdHBfc3NubWFwICptYXApOwogdm9pZCBzY3RwX3Nzbm1hcF9jbGVhcihzdHJ1Y3Qgc2N0cF9zc25tYXAgKm1hcCk7CiAKQEAgLTU3OCw3ICs1ODMsNiBAQAogdm9pZCBzY3RwX2NodW5rX2ZhaWwoc3RydWN0IHNjdHBfY2h1bmsgKiwgaW50IGVycm9yKTsKIGludCBzY3RwX2NodW5rX2FiYW5kb25lZChzdHJ1Y3Qgc2N0cF9jaHVuayAqKTsKIAotCiAvKiBSRkMyOTYwIDEuNCBLZXkgVGVybXMKICAqCiAgKiBvIENodW5rOiBBIHVuaXQgb2YgaW5mb3JtYXRpb24gd2l0aGluIGFuIFNDVFAgcGFja2V0LCBjb25zaXN0aW5nIG9mCkBAIC01ODgsMTMgKzU5Miw4IEBACiAgKiBlYWNoIGNodW5rIGFzIHdlbGwgYXMgYSBmZXcgb3RoZXIgaGVhZGVyIHBvaW50ZXJzLi4uCiAgKi8KIHN0cnVjdCBzY3RwX2NodW5rIHsKLQkvKiBUaGVzZSBmaXJzdCB0aHJlZSBlbGVtZW50cyBNVVNUIFBSRUNJU0VMWSBtYXRjaCB0aGUgZmlyc3QKLQkgKiB0aHJlZSBlbGVtZW50cyBvZiBzdHJ1Y3Qgc2tfYnVmZi4gIFRoaXMgYWxsb3dzIHVzIHRvIHJldXNlCi0JICogYWxsIHRoZSBza2JfKiBxdWV1ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KLQkgKi8KLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqbmV4dDsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqcHJldjsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwogCWF0b21pY190IHJlZmNudDsKIAogCS8qIFRoaXMgaXMgb3VyIGxpbmsgdG8gdGhlIHBlci10cmFuc3BvcnQgdHJhbnNtaXR0ZWQgbGlzdC4gICovCkBAIC03MTMsNyArNzEyLDcgQEAKIAlfX3UzMiB2dGFnOwogCiAJLyogVGhpcyBjb250YWlucyB0aGUgcGF5bG9hZCBjaHVua3MuICAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgY2h1bmtzOworCXN0cnVjdCBsaXN0X2hlYWQgY2h1bmtfbGlzdDsKIAogCS8qIFRoaXMgaXMgdGhlIG92ZXJoZWFkIG9mIHRoZSBzY3RwIGFuZCBpcCBoZWFkZXJzLiAqLwogCXNpemVfdCBvdmVyaGVhZDsKQEAgLTk0Nyw3ICs5NDYsOCBAQAogCX0gY2FjYzsKIH07CiAKLXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF90cmFuc3BvcnRfbmV3KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqLCBpbnQpOworc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9uZXcoY29uc3QgdW5pb24gc2N0cF9hZGRyICosCisJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIHZvaWQgc2N0cF90cmFuc3BvcnRfc2V0X293bmVyKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqLAogCQkJICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CiB2b2lkIHNjdHBfdHJhbnNwb3J0X3JvdXRlKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqLCB1bmlvbiBzY3RwX2FkZHIgKiwKQEAgLTk3MCw3ICs5NzAsNyBAQAogCS8qIFRoaXMgaXMgYWN0dWFsbHkgYSBxdWV1ZSBvZiBzY3RwX2NodW5rIGVhY2gKIAkgKiBjb250YWluaW5nIGEgcGFydGlhbGx5IGRlY29kZWQgcGFja2V0LgogCSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgaW47CisJc3RydWN0IGxpc3RfaGVhZCBpbl9jaHVua19saXN0OwogCS8qIFRoaXMgaXMgdGhlIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgb2ZmIHRoZSBpbiBxdWV1ZSBhbmQgaXMKIAkgKiBiZWluZyB3b3JrZWQgb24gdGhyb3VnaCB0aGUgaW5ib3VuZCBjaHVuayBwcm9jZXNzaW5nLgogCSAqLwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAogCS8qIERhdGEgcGVuZGluZyB0aGF0IGhhcyBuZXZlciBiZWVuIHRyYW5zbWl0dGVkLiAgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIG91dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG91dF9jaHVua19saXN0OwogCiAJdW5zaWduZWQgb3V0X3FsZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBxdWV1ZWQgZGF0YSBjaHVua3MuICovCiAKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAJdW5zaWduZWQgZXJyb3I7CiAKIAkvKiBUaGVzZSBhcmUgY29udHJvbCBjaHVua3Mgd2Ugd2FudCB0byBzZW5kLiAgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvbnRyb2w7CisJc3RydWN0IGxpc3RfaGVhZCBjb250cm9sX2NodW5rX2xpc3Q7CiAKIAkvKiBUaGVzZSBhcmUgY2h1bmtzIHRoYXQgaGF2ZSBiZWVuIHNhY2tlZCBidXQgYXJlIGFib3ZlIHRoZQogCSAqIENUU04sIG9yIGN1bXVsYXRpdmUgdHNuIGFjayBwb2ludC4KQEAgLTEwOTUsOSArMTA5NSwxMCBAQAogdm9pZCBzY3RwX2JpbmRfYWRkcl9mcmVlKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqKTsKIGludCBzY3RwX2JpbmRfYWRkcl9jb3B5KHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqZGVzdCwKIAkJCWNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqc3JjLAotCQkJc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLGludCBmbGFncyk7CisJCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCisJCQlpbnQgZmxhZ3MpOwogaW50IHNjdHBfYWRkX2JpbmRfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKiwgdW5pb24gc2N0cF9hZGRyICosCi0JCSAgICAgICBpbnQgZ2ZwKTsKKwkJICAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogaW50IHNjdHBfZGVsX2JpbmRfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKiwgdW5pb24gc2N0cF9hZGRyICopOwogaW50IHNjdHBfYmluZF9hZGRyX21hdGNoKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKiwKIAkJCSBzdHJ1Y3Qgc2N0cF9zb2NrICopOwpAQCAtMTEwNiw5ICsxMTA3LDEwIEBACiAJCQkJCWludAkJCWFkZHJjbnQsCiAJCQkJCXN0cnVjdCBzY3RwX3NvY2sJKm9wdCk7CiB1bmlvbiBzY3RwX3BhcmFtcyBzY3RwX2JpbmRfYWRkcnNfdG9fcmF3KGNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsCi0JCQkJCSBpbnQgKmFkZHJzX2xlbiwgaW50IGdmcCk7CisJCQkJCSBpbnQgKmFkZHJzX2xlbiwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogaW50IHNjdHBfcmF3X3RvX2JpbmRfYWRkcnMoc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwgX191OCAqcmF3LCBpbnQgbGVuLAotCQkJICAgX191MTYgcG9ydCwgaW50IGdmcCk7CisJCQkgICBfX3UxNiBwb3J0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc2N0cF9zY29wZV90IHNjdHBfc2NvcGUoY29uc3QgdW5pb24gc2N0cF9hZGRyICopOwogaW50IHNjdHBfaW5fc2NvcGUoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLCBjb25zdCBzY3RwX3Njb3BlX3Qgc2NvcGUpOwpAQCAtMTIzNyw3ICsxMjM5LDcgQEAKIH0KIAogLyogVGhlc2UgYXJlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIG1hbmlwdWxhdGluZyBlbmRwb2ludHMuICAqLwotc3RydWN0IHNjdHBfZW5kcG9pbnQgKnNjdHBfZW5kcG9pbnRfbmV3KHN0cnVjdCBzb2NrICosIGludCk7CitzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIHZvaWQgc2N0cF9lbmRwb2ludF9mcmVlKHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogdm9pZCBzY3RwX2VuZHBvaW50X3B1dChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKTsKIHZvaWQgc2N0cF9lbmRwb2ludF9ob2xkKHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwpAQCAtMTI1OCw3ICsxMjYwLDcgQEAKIAkJICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqKmVycl9jaHVuayk7CiBpbnQgc2N0cF9wcm9jZXNzX2luaXQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc2N0cF9jaWRfdCBjaWQsCiAJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlciwKLQkJICAgICAgc2N0cF9pbml0X2NodW5rX3QgKmluaXQsIGludCBnZnApOworCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqaW5pdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBfX3UzMiBzY3RwX2dlbmVyYXRlX3RhZyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKTsKIF9fdTMyIHNjdHBfZ2VuZXJhdGVfdHNuKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogCkBAIC0xNjY4LDcgKzE2NzAsNyBAQAogCSAqICB3aGljaCBhbHJlYWR5IHJlc2lkZXMgaW4gc2N0cF9vdXRxLgkgUGxlYXNlIG1vdmUgdGhpcwogCSAqICBxdWV1ZSBhbmQgaXRzIHN1cHBvcnRpbmcgbG9naWMgZG93biB0aGVyZS4JLS1waWdneV0KIAkgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGFkZGlwX2NodW5rczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFkZGlwX2NodW5rX2xpc3Q7CiAKIAkvKiBBRERJUCBTZWN0aW9uIDQuMSBBU0NPTkYgQ2h1bmsgUHJvY2VkdXJlcwogCSAqCkBAIC0xNzIxLDcgKzE3MjMsNyBAQAogCiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqCiBzY3RwX2Fzc29jaWF0aW9uX25ldyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqLCBjb25zdCBzdHJ1Y3Qgc29jayAqLAotCQkgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCk7CisJCSAgICAgc2N0cF9zY29wZV90IHNjb3BlLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHZvaWQgc2N0cF9hc3NvY2lhdGlvbl9mcmVlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopOwogdm9pZCBzY3RwX2Fzc29jaWF0aW9uX3B1dChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKTsKIHZvaWQgc2N0cF9hc3NvY2lhdGlvbl9ob2xkKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopOwpAQCAtMTczNyw3ICsxNzM5LDcgQEAKIAkJCSAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyKTsKIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF9hc3NvY19hZGRfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJCSAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyZXNzLAotCQkJCSAgICAgY29uc3QgaW50IGdmcCwKKwkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCiAJCQkJICAgICBjb25zdCBpbnQgcGVlcl9zdGF0ZSk7CiB2b2lkIHNjdHBfYXNzb2NfZGVsX3BlZXIoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyKTsKQEAgLTE3NjEsOSArMTc2MywxMSBAQAogdm9pZCBzY3RwX2Fzc29jX3J3bmRfZGVjcmVhc2Uoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgdW5zaWduZWQpOwogdm9pZCBzY3RwX2Fzc29jX3NldF9wcmltYXJ5KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopOwotaW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIGludCk7CitpbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fZXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiBpbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fY29va2llKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCi0JCQkJCSBzdHJ1Y3Qgc2N0cF9jb29raWUqLCBpbnQgZ2ZwKTsKKwkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSosCisJCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogaW50IHNjdHBfY21wX2FkZHJfZXhhY3QoY29uc3QgdW5pb24gc2N0cF9hZGRyICpzczEsCiAJCQljb25zdCB1bmlvbiBzY3RwX2FkZHIgKnNzMik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmggYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKaW5kZXggMTAxOWQ4My4uOTBmZTRiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaApAQCAtODgsNyArODgsNyBAQAogCV9fdTE2IGVycm9yLAogCV9fdTE2IG91dGJvdW5kLAogCV9fdTE2IGluYm91bmQsCi0JaW50IGdmcCk7CisJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcGVlcl9hZGRyX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKQEAgLTk2LDM1ICs5NiwzNSBAQAogCWludCBmbGFncywKIAlpbnQgc3RhdGUsCiAJaW50IGVycm9yLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3JlbW90ZV9lcnJvcigKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCiAJX191MTYgZmxhZ3MsCi0JaW50IGdmcCk7CisJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3NlbmRfZmFpbGVkKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAlfX3UxNiBmbGFncywKIAlfX3UzMiBlcnJvciwKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9zaHV0ZG93bl9ldmVudCgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAlfX3UxNiBmbGFncywKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZGFwaSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKLQlfX3UzMiBpbmRpY2F0aW9uLCBpbnQgZ2ZwKTsKKwlfX3UzMiBpbmRpY2F0aW9uLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9hZGFwdGlvbl9pbmRpY2F0aW9uKAotCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKTsKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmN2bXNnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogdm9pZCBzY3RwX3VscGV2ZW50X3JlYWRfc25kcmN2aW5mbyhjb25zdCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsCiAJc3RydWN0IG1zZ2hkciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaAppbmRleCA5NjE3MzZkLi4xYTYwYzZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oCkBAIC02MiwxOSArNjIsMjIgQEAKIHZvaWQgc2N0cF91bHBxX2ZyZWUoc3RydWN0IHNjdHBfdWxwcSAqKTsKIAogLyogQWRkIGEgbmV3IERBVEEgY2h1bmsgZm9yIHByb2Nlc3NpbmcuICovCi1pbnQgc2N0cF91bHBxX3RhaWxfZGF0YShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosIGludCk7CitpbnQgc2N0cF91bHBxX3RhaWxfZGF0YShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosCisJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogCiAvKiBBZGQgYSBuZXcgZXZlbnQgZm9yIHByb3BhZ2F0aW9uIHRvIHRoZSBVTFAuICovCiBpbnQgc2N0cF91bHBxX3RhaWxfZXZlbnQoc3RydWN0IHNjdHBfdWxwcSAqLCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXYpOwogCiAvKiBSZW5lZ2UgcHJldmlvdXNseSByZWNlaXZlZCBjaHVua3MuICAqLwotdm9pZCBzY3RwX3VscHFfcmVuZWdlKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwgaW50KTsKK3ZvaWQgc2N0cF91bHBxX3JlbmVnZShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosCisJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKIC8qIFBlcmZvcm0gcGFydGlhbCBkZWxpdmVyeS4gKi8KLXZvaWQgc2N0cF91bHBxX3BhcnRpYWxfZGVsaXZlcnkoc3RydWN0IHNjdHBfdWxwcSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQpOwordm9pZCBzY3RwX3VscHFfcGFydGlhbF9kZWxpdmVyeShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosCisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIAogLyogQWJvcnQgdGhlIHBhcnRpYWwgZGVsaXZlcnkuICovCi12b2lkIHNjdHBfdWxwcV9hYm9ydF9wZChzdHJ1Y3Qgc2N0cF91bHBxICosIGludCk7Cit2b2lkIHNjdHBfdWxwcV9hYm9ydF9wZChzdHJ1Y3Qgc2N0cF91bHBxICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKIC8qIENsZWFyIHRoZSBwYXJ0aWFsIGRhdGEgZGVsaXZlcnkgY29uZGl0aW9uIG9uIHRoaXMgc29ja2V0LiAqLwogaW50IHNjdHBfY2xlYXJfcGQoc3RydWN0IHNvY2sgKnNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NsaGNfdmouaCBiL2luY2x1ZGUvbmV0L3NsaGNfdmouaAppbmRleCAwYjJjMjc4Li44NzE2ZDU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zbGhjX3ZqLmgKKysrIGIvaW5jbHVkZS9uZXQvc2xoY192ai5oCkBAIC0xNzAsMTkgKzE3MCwxNCBAQAogfTsKICNkZWZpbmUgTlVMTFNMQ09NUFIJKHN0cnVjdCBzbGNvbXByZXNzICopMAogCi0jZGVmaW5lIF9fQVJHUyh4KSB4Ci0KIC8qIEluIHNsaGMuYzogKi8KLXN0cnVjdCBzbGNvbXByZXNzICpzbGhjX2luaXQgX19BUkdTKChpbnQgcnNsb3RzLCBpbnQgdHNsb3RzKSk7Ci12b2lkIHNsaGNfZnJlZSBfX0FSR1MoKHN0cnVjdCBzbGNvbXByZXNzICpjb21wKSk7CitzdHJ1Y3Qgc2xjb21wcmVzcyAqc2xoY19pbml0KGludCByc2xvdHMsIGludCB0c2xvdHMpOwordm9pZCBzbGhjX2ZyZWUoc3RydWN0IHNsY29tcHJlc3MgKmNvbXApOwogCi1pbnQgc2xoY19jb21wcmVzcyBfX0FSR1MoKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsCi0JCQkgIGludCBpc2l6ZSwgdW5zaWduZWQgY2hhciAqb2NwLCB1bnNpZ25lZCBjaGFyICoqY3BwLAotCQkJICBpbnQgY29tcHJlc3NfY2lkKSk7Ci1pbnQgc2xoY191bmNvbXByZXNzIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwKLQkJCSAgICBpbnQgaXNpemUpKTsKLWludCBzbGhjX3JlbWVtYmVyIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwKLQkJCSAgaW50IGlzaXplKSk7Ci1pbnQgc2xoY190b3NzIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXApKTsKK2ludCBzbGhjX2NvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSwKKwkJICB1bnNpZ25lZCBjaGFyICpvY3AsIHVuc2lnbmVkIGNoYXIgKipjcHAsIGludCBjb21wcmVzc19jaWQpOworaW50IHNsaGNfdW5jb21wcmVzcyhzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgaXNpemUpOworaW50IHNsaGNfcmVtZW1iZXIoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplKTsKK2ludCBzbGhjX3Rvc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXApOwogCiAjZW5kaWYJLyogX1NMSENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IGU1OTNhZjUuLmExMDQyZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTY4NCwxNiArNjg0LDE3IEBACiAjZGVmaW5lIGJoX2xvY2tfc29jayhfX3NrKQlzcGluX2xvY2soJigoX19zayktPnNrX2xvY2suc2xvY2spKQogI2RlZmluZSBiaF91bmxvY2tfc29jayhfX3NrKQlzcGluX3VubG9jaygmKChfX3NrKS0+c2tfbG9jay5zbG9jaykpCiAKLWV4dGVybiBzdHJ1Y3Qgc29jawkJKnNrX2FsbG9jKGludCBmYW1pbHksIGludCBwcmlvcml0eSwKK2V4dGVybiBzdHJ1Y3Qgc29jawkJKnNrX2FsbG9jKGludCBmYW1pbHksCisJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5LAogCQkJCQkgIHN0cnVjdCBwcm90byAqcHJvdCwgaW50IHplcm9faXQpOwogZXh0ZXJuIHZvaWQJCQlza19mcmVlKHN0cnVjdCBzb2NrICpzayk7CiAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZgkJKnNvY2tfd21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLAotCQkJCQkgICAgICBpbnQgcHJpb3JpdHkpOworCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmCQkqc29ja19ybWFsbG9jKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCi0JCQkJCSAgICAgIGludCBwcmlvcml0eSk7CisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZAkJCXNvY2tfd2ZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gdm9pZAkJCXNvY2tfcmZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKQEAgLTcwOCw3ICs3MDksOCBAQAogCQkJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCQkgICAgIGludCBub2Jsb2NrLAogCQkJCQkJICAgICBpbnQgKmVycmNvZGUpOwotZXh0ZXJuIHZvaWQgKnNvY2tfa21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplLCBpbnQgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgKnNvY2tfa21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplLAorCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHZvaWQgc29ja19rZnJlZV9zKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqbWVtLCBpbnQgc2l6ZSk7CiBleHRlcm4gdm9pZCBza19zZW5kX3NpZ3VyZyhzdHJ1Y3Qgc29jayAqc2spOwogCkBAIC0xMTMyLDE1ICsxMTM0LDE5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNrX3N0cmVhbV9hbGxvY19wc2tiKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgIGludCBzaXplLCBpbnQgbWVtLCBpbnQgZ2ZwKQorCQkJCQkJICAgaW50IHNpemUsIGludCBtZW0sCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSArIHNrLT5za19wcm90LT5tYXhfaGVhZGVyLCBnZnApOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGhkcl9sZW47CiAKKwloZHJfbGVuID0gU0tCX0RBVEFfQUxJR04oc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOworCXNrYiA9IGFsbG9jX3NrYihzaXplICsgaGRyX2xlbiwgZ2ZwKTsKIAlpZiAoc2tiKSB7CiAJCXNrYi0+dHJ1ZXNpemUgKz0gbWVtOwogCQlpZiAoc2stPnNrX2ZvcndhcmRfYWxsb2MgPj0gKGludClza2ItPnRydWVzaXplIHx8CiAJCSAgICBza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBza2ItPnRydWVzaXplLCAwKSkgewotCQkJc2tiX3Jlc2VydmUoc2tiLCBzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CisJCQlza2JfcmVzZXJ2ZShza2IsIGhkcl9sZW4pOwogCQkJcmV0dXJuIHNrYjsKIAkJfQogCQlfX2tmcmVlX3NrYihza2IpOwpAQCAtMTE1Miw3ICsxMTU4LDggQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tfc3RyZWFtX2FsbG9jX3NrYihzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQkgIGludCBzaXplLCBpbnQgZ2ZwKQorCQkJCQkJICBpbnQgc2l6ZSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlyZXR1cm4gc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc2ssIHNpemUsIDAsIGdmcCk7CiB9CkBAIC0xMTg1LDcgKzExOTIsNyBAQAogCXJldHVybiBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIDwgKHNrLT5za19zbmRidWYgLyAyKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZ2ZwX2FueSh2b2lkKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX2FueSh2b2lkKQogewogCXJldHVybiBpbl9zb2Z0aXJxKCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggZWM5ZTIwYy4uZjRmOWFiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTcyMSwxMSArNzIxLDE2IEBACiAJcmV0dXJuIHRwLT5hY2sucGVuZGluZyZUQ1BfQUNLX1NDSEVEOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9kZWNfcXVpY2thY2tfbW9kZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZGVjX3F1aWNrYWNrX21vZGUoc3RydWN0IHRjcF9zb2NrICp0cCwgdW5zaWduZWQgaW50IHBrdHMpCiB7Ci0JaWYgKHRwLT5hY2sucXVpY2sgJiYgLS10cC0+YWNrLnF1aWNrID09IDApIHsKLQkJLyogTGVhdmluZyBxdWlja2FjayBtb2RlIHdlIGRlZmxhdGUgQVRPLiAqLwotCQl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworCWlmICh0cC0+YWNrLnF1aWNrKSB7CisJCWlmIChwa3RzID49IHRwLT5hY2sucXVpY2spIHsKKwkJCXRwLT5hY2sucXVpY2sgPSAwOworCisJCQkvKiBMZWF2aW5nIHF1aWNrYWNrIG1vZGUgd2UgZGVmbGF0ZSBBVE8uICovCisJCQl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworCQl9IGVsc2UKKwkJCXRwLT5hY2sucXVpY2sgLT0gcGt0czsKIAl9CiB9CiAKQEAgLTg0Myw3ICs4NDgsOSBAQAogCiAvKiB0Y3Bfb3V0cHV0LmMgKi8KIAotZXh0ZXJuIGludCB0Y3Bfd3JpdGVfeG1pdChzdHJ1Y3Qgc29jayAqLCBpbnQgbm9uYWdsZSk7CitleHRlcm4gdm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3VyX21zcywgaW50IG5vbmFnbGUpOworZXh0ZXJuIGludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCk7CiBleHRlcm4gaW50IHRjcF9yZXRyYW5zbWl0X3NrYihzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiB2b2lkIHRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc3RydWN0IHNvY2sgKik7CiBleHRlcm4gdm9pZCB0Y3Bfc2ltcGxlX3JldHJhbnNtaXQoc3RydWN0IHNvY2sgKik7CkBAIC04NTMsMTIgKzg2MCwxNiBAQAogZXh0ZXJuIHZvaWQgdGNwX3NlbmRfcGFydGlhbChzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiBpbnQgIHRjcF93cml0ZV93YWtldXAoc3RydWN0IHNvY2sgKik7CiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9maW4oc3RydWN0IHNvY2sgKnNrKTsKLWV4dGVybiB2b2lkIHRjcF9zZW5kX2FjdGl2ZV9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIGludCBwcmlvcml0eSk7CitleHRlcm4gdm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gaW50ICB0Y3Bfc2VuZF9zeW5hY2soc3RydWN0IHNvY2sgKik7Ci1leHRlcm4gdm9pZCB0Y3BfcHVzaF9vbmUoc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgbXNzX25vdyk7CitleHRlcm4gdm9pZCB0Y3BfcHVzaF9vbmUoc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgaW50IG1zc19ub3cpOwogZXh0ZXJuIHZvaWQgdGNwX3NlbmRfYWNrKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2spOwogCisvKiB0Y3BfaW5wdXQuYyAqLworZXh0ZXJuIHZvaWQgdGNwX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzdHJ1Y3Qgc29jayAqc2spOworCiAvKiB0Y3BfdGltZXIuYyAqLwogZXh0ZXJuIHZvaWQgdGNwX2luaXRfeG1pdF90aW1lcnMoc3RydWN0IHNvY2sgKik7CiBleHRlcm4gdm9pZCB0Y3BfY2xlYXJfeG1pdF90aW1lcnMoc3RydWN0IHNvY2sgKik7CkBAIC05NTgsNyArOTY5LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfaW5pdGlhbGl6ZV9yY3ZfbXNzKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQl1bnNpZ25lZCBpbnQgaGludCA9IG1pbih0cC0+YWR2bXNzLCB0cC0+bXNzX2NhY2hlX3N0ZCk7CisJdW5zaWduZWQgaW50IGhpbnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHRwLT5hZHZtc3MsIHRwLT5tc3NfY2FjaGUpOwogCiAJaGludCA9IG1pbihoaW50LCB0cC0+cmN2X3duZC8yKTsKIAloaW50ID0gbWluKGhpbnQsIFRDUF9NSU5fUkNWTVNTKTsKQEAgLTk4MSw3ICs5OTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2Zhc3RfcGF0aF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpID09IDAgJiYKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgogCSAgICB0cC0+cmN2X3duZCAmJgogCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwgc2stPnNrX3JjdmJ1ZiAmJgogCSAgICAhdHAtPnVyZ19kYXRhKQpAQCAtMTIyNSwyOCArMTIzNiw2IEBACiAJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQgKyB0cC0+bG9zdF9vdXQ7CiB9CiAKLWV4dGVybiB2b2lkIHRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKTsKLQotLyogQ29uZ2VzdGlvbiB3aW5kb3cgdmFsaWRhdGlvbi4gKFJGQzI4NjEpICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY3duZF92YWxpZGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JX191MzIgcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7Ci0KLQlpZiAocGFja2V0c19vdXQgPj0gdHAtPnNuZF9jd25kKSB7Ci0JCS8qIE5ldHdvcmsgaXMgZmVlZCBmdWxseS4gKi8KLQkJdHAtPnNuZF9jd25kX3VzZWQgPSAwOwotCQl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKLQl9IGVsc2UgewotCQkvKiBOZXR3b3JrIHN0YXJ2ZXMuICovCi0JCWlmICh0cC0+cGFja2V0c19vdXQgPiB0cC0+c25kX2N3bmRfdXNlZCkKLQkJCXRwLT5zbmRfY3duZF91c2VkID0gdHAtPnBhY2tldHNfb3V0OwotCi0JCWlmICgoczMyKSh0Y3BfdGltZV9zdGFtcCAtIHRwLT5zbmRfY3duZF9zdGFtcCkgPj0gdHAtPnJ0bykKLQkJCXRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc2spOwotCX0KLX0KLQogLyogU2V0IHNsb3cgc3RhcnQgdGhyZXNob3VsZCBhbmQgY3duZCBub3QgZmFsbGluZyB0byBzbG93IHN0YXJ0ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX190Y3BfZW50ZXJfY3dyKHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7CkBAIC0xMjc5LDEyICsxMjY4LDYgQEAKIAlyZXR1cm4gMzsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHRjcF9taW5zaGFsbF9jaGVjayhjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXJldHVybiBhZnRlcih0cC0+c25kX3NtbCx0cC0+c25kX3VuYSkgJiYKLQkJIWFmdGVyKHRwLT5zbmRfc21sLCB0cC0+c25kX254dCk7Ci19Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX21pbnNoYWxsX3VwZGF0ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgbXNzLCAKIAkJCQkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTEyOTIsMTIyICsxMjc1LDE4IEBACiAJCXRwLT5zbmRfc21sID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogfQogCi0vKiBSZXR1cm4gMCwgaWYgcGFja2V0IGNhbiBiZSBzZW50IG5vdyB3aXRob3V0IHZpb2xhdGlvbiBOYWdsZSdzIHJ1bGVzOgotICAgMS4gSXQgaXMgZnVsbCBzaXplZC4KLSAgIDIuIE9yIGl0IGNvbnRhaW5zIEZJTi4KLSAgIDMuIE9yIFRDUF9OT0RFTEFZIHdhcyBzZXQuCi0gICA0LiBPciBUQ1BfQ09SSyBpcyBub3Qgc2V0LCBhbmQgYWxsIHNlbnQgcGFja2V0cyBhcmUgQUNLZWQuCi0gICAgICBXaXRoIE1pbnNoYWxsJ3MgbW9kaWZpY2F0aW9uOiBhbGwgc2VudCBzbWFsbCBwYWNrZXRzIGFyZSBBQ0tlZC4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLXRjcF9uYWdsZV9jaGVjayhjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKLQkJdW5zaWduZWQgbXNzX25vdywgaW50IG5vbmFnbGUpCi17Ci0JcmV0dXJuIChza2ItPmxlbiA8IG1zc19ub3cgJiYKLQkJIShUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCi0JCSgobm9uYWdsZSZUQ1BfTkFHTEVfQ09SSykgfHwKLQkJICghbm9uYWdsZSAmJgotCQkgIHRwLT5wYWNrZXRzX291dCAmJgotCQkgIHRjcF9taW5zaGFsbF9jaGVjayh0cCkpKSk7Ci19Ci0KLWV4dGVybiB2b2lkIHRjcF9zZXRfc2tiX3Rzb19zZWdzKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwotCi0vKiBUaGlzIGNoZWNrcyBpZiB0aGUgZGF0YSBiZWFyaW5nIHBhY2tldCBTS0IgKHVzdWFsbHkgc2stPnNrX3NlbmRfaGVhZCkKLSAqIHNob3VsZCBiZSBwdXQgb24gdGhlIHdpcmUgcmlnaHQgbm93LgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX3NuZF90ZXN0KHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIHVuc2lnbmVkIGN1cl9tc3MsIGludCBub25hZ2xlKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCWludCBwa3RzID0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQotCWlmICghcGt0cykgewotCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiKTsKLQkJcGt0cyA9IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JfQotCi0JLyoJUkZDIDExMjIgLSBzZWN0aW9uIDQuMi4zLjQKLQkgKgotCSAqCVdlIG11c3QgcXVldWUgaWYKLQkgKgotCSAqCWEpIFRoZSByaWdodCBlZGdlIG9mIHRoaXMgZnJhbWUgZXhjZWVkcyB0aGUgd2luZG93Ci0JICoJYikgVGhlcmUgYXJlIHBhY2tldHMgaW4gZmxpZ2h0IGFuZCB3ZSBoYXZlIGEgc21hbGwgc2VnbWVudAotCSAqCSAgIFtTV1MgYXZvaWRhbmNlIGFuZCBOYWdsZSBhbGdvcml0aG1dCi0JICoJICAgKHBhcnQgb2YgU1dTIGlzIGRvbmUgb24gcGFja2V0aXphdGlvbikKLQkgKgkgICBNaW5zaGFsbCB2ZXJzaW9uIHNvdW5kczogdGhlcmUgYXJlIG5vIF9zbWFsbF8KLQkgKgkgICBzZWdtZW50cyBpbiBmbGlnaHQuICh0Y3BfbmFnbGVfY2hlY2spCi0JICoJYykgV2UgaGF2ZSB0b28gbWFueSBwYWNrZXRzICdpbiBmbGlnaHQnCi0JICoKLQkgKiAJRG9uJ3QgdXNlIHRoZSBuYWdsZSBydWxlIGZvciB1cmdlbnQgZGF0YSAob3IKLQkgKglmb3IgdGhlIGZpbmFsIEZJTiAtRGF2ZU0pLgotCSAqCi0JICoJQWxzbywgTmFnbGUgcnVsZSBkb2VzIG5vdCBhcHBseSB0byBmcmFtZXMsIHdoaWNoCi0JICoJc2l0IGluIHRoZSBtaWRkbGUgb2YgcXVldWUgKHRoZXkgaGF2ZSBubyBjaGFuY2VzCi0JICoJdG8gZ2V0IG5ldyBkYXRhKSBhbmQgaWYgcm9vbSBhdCB0YWlsIG9mIHNrYiBpcwotCSAqCW5vdCBlbm91Z2ggdG8gc2F2ZSBzb21ldGhpbmcgc2VyaW91c2x5ICg8MzIgZm9yIG5vdykuCi0JICovCi0KLQkvKiBEb24ndCBiZSBzdHJpY3QgYWJvdXQgdGhlIGNvbmdlc3Rpb24gd2luZG93IGZvciB0aGUKLQkgKiBmaW5hbCBGSU4gZnJhbWUuICAtRGF2ZU0KLQkgKi8KLQlyZXR1cm4gKCgobm9uYWdsZSZUQ1BfTkFHTEVfUFVTSCkgfHwgdHAtPnVyZ19tb2RlCi0JCSB8fCAhdGNwX25hZ2xlX2NoZWNrKHRwLCBza2IsIGN1cl9tc3MsIG5vbmFnbGUpKSAmJgotCQkoKCh0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgKHBrdHMtMSkpIDwgdHAtPnNuZF9jd25kKSB8fAotCQkgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikpICYmCi0JCSFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQpKTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewogCWlmICghdHAtPnBhY2tldHNfb3V0ICYmICF0cC0+cGVuZGluZykKIAkJdGNwX3Jlc2V0X3htaXRfdGltZXIoc2ssIFRDUF9USU1FX1BST0JFMCwgdHAtPnJ0byk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0Y3Bfc2tiX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCAKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiBza2ItPm5leHQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZTsKLX0KLQotLyogUHVzaCBvdXQgYW55IHBlbmRpbmcgZnJhbWVzIHdoaWNoIHdlcmUgaGVsZCBiYWNrIGR1ZSB0bwotICogVENQX0NPUksgb3IgYXR0ZW1wdCBhdCBjb2FsZXNjaW5nIHRpbnkgcGFja2V0cy4KLSAqIFRoZSBzb2NrZXQgbXVzdCBiZSBsb2NrZWQgYnkgdGhlIGNhbGxlci4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCQkJIHVuc2lnbmVkIGN1cl9tc3MsCi0JCQkJCQkgaW50IG5vbmFnbGUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7Ci0KLQlpZiAoc2tiKSB7Ci0JCWlmICghdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpKQotCQkJbm9uYWdsZSA9IFRDUF9OQUdMRV9QVVNIOwotCQlpZiAoIXRjcF9zbmRfdGVzdChzaywgc2tiLCBjdXJfbXNzLCBub25hZ2xlKSB8fAotCQkgICAgdGNwX3dyaXRlX3htaXQoc2ssIG5vbmFnbGUpKQotCQkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7Ci0JfQotCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7Ci19Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICAgICAgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKIAlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwgdHAtPm5vbmFnbGUpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7Ci0KLQlyZXR1cm4gKHNrYiAmJgotCQl0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwKLQkJCSAgICAgdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpID8gVENQX05BR0xFX1BVU0ggOiB0cC0+bm9uYWdsZSkpOwotfQotCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9pbml0X3dsKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssIHUzMiBzZXEpCiB7CiAJdHAtPnNuZF93bDEgPSBzZXE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC94MjVkZXZpY2UuaCBiL2luY2x1ZGUvbmV0L3gyNWRldmljZS5oCmluZGV4IGNmMzZhMjAuLmQ0NWFlODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3gyNWRldmljZS5oCisrKyBiL2luY2x1ZGUvbmV0L3gyNWRldmljZS5oCkBAIC01LDggKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHgyNV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBfX2JlMTYgeDI1X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CiAJc2tiLT5pbnB1dF9kZXYgPSBza2ItPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCAwMjk1MjJhLi44NjhlZjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC04MDMsNyArODAzLDcgQEAKIC8qIFhGUk0gdHVubmVsIGhhbmRsZXJzLiAgKi8KIHN0cnVjdCB4ZnJtX3R1bm5lbCB7CiAJaW50ICgqaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0Jdm9pZCAoKmVycl9oYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICppbmZvKTsKKwl2b2lkICgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsIF9fdTMyIGluZm8pOwogfTsKIAogc3RydWN0IHhmcm02X3R1bm5lbCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmggYi9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmgKaW5kZXggMjAwMGI0My4uZGExOWMyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY2lzY29kZS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2Npc2NvZGUuaApAQCAtMTEyLDYgKzExMiw4IEBACiAKICNkZWZpbmUgTUFORklEX1RESwkJCTB4MDEwNQogI2RlZmluZSBQUk9ESURfVERLX0NGMDEwCQkweDA5MDAKKyNkZWZpbmUgUFJPRElEX1RES19OUDk2MTAJCTB4MGQwYQorI2RlZmluZSBQUk9ESURfVERLX01OMzIwMAkJMHgwZTBhCiAjZGVmaW5lIFBST0RJRF9UREtfR04zNDEwCQkweDQ4MTUKIAogI2RlZmluZSBNQU5GSURfVE9TSElCQQkJCTB4MDA5OApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3MuaCBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKaW5kZXggOGQ4NjQzYWRjLi4yY2FiMzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9jcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKQEAgLTY4LDIxICs2OCw5IEBACiAjZGVmaW5lIFJFU19BTExPQ0FURUQJCQkweDIwCiAjZGVmaW5lIFJFU19SRU1PVkVECQkJMHg0MAogCi10eXBlZGVmIHN0cnVjdCBzZXJ2aW5mb190IHsKLSAgICBjaGFyCVNpZ25hdHVyZVsyXTsKLSAgICB1X2ludAlDb3VudDsKLSAgICB1X2ludAlSZXZpc2lvbjsKLSAgICB1X2ludAlDU0xldmVsOwotICAgIGNoYXIJKlZlbmRvclN0cmluZzsKLX0gc2VydmluZm9fdDsKLQogdHlwZWRlZiBzdHJ1Y3QgZXZlbnRfY2FsbGJhY2tfYXJnc190IHsKLSAgICBjbGllbnRfaGFuZGxlX3QgY2xpZW50X2hhbmRsZTsKLSAgICB2b2lkCSppbmZvOwotICAgIHZvaWQJKm10ZHJlcXVlc3Q7Ci0gICAgdm9pZAkqYnVmZmVyOwotICAgIHZvaWQJKm1pc2M7Ci0gICAgdm9pZAkqY2xpZW50X2RhdGE7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UJKmNsaWVudF9oYW5kbGU7CisJdm9pZAkJCSpjbGllbnRfZGF0YTsKIH0gZXZlbnRfY2FsbGJhY2tfYXJnc190OwogCiAvKiBmb3IgR2V0Q29uZmlndXJhdGlvbkluZm8gKi8KQEAgLTM5MywzMSArMzgxLDI5IEBACiAKIHN0cnVjdCBwY21jaWFfc29ja2V0OwogCi1pbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNvbmZfcmVnX3QgKnJlZyk7Ci1pbnQgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGNsaWVudF9oYW5kbGVfdCBoYW5kbGUpOwotaW50IHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNvbmZpZ19pbmZvX3QgKmNvbmZpZyk7Ci1pbnQgcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oc2VydmluZm9fdCAqaW5mbyk7CitpbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY29uZl9yZWdfdCAqcmVnKTsKK2ludCBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKK2ludCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNvbmZpZ19pbmZvX3QgKmNvbmZpZyk7CiBpbnQgcGNtY2lhX2dldF9maXJzdF93aW5kb3cod2luZG93X2hhbmRsZV90ICp3aW4sIHdpbl9yZXFfdCAqcmVxKTsKIGludCBwY21jaWFfZ2V0X25leHRfd2luZG93KHdpbmRvd19oYW5kbGVfdCAqd2luLCB3aW5fcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX2dldF9zdGF0dXMoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY3Nfc3RhdHVzX3QgKnN0YXR1cyk7CitpbnQgcGNtY2lhX2dldF9zdGF0dXMoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjc19zdGF0dXNfdCAqc3RhdHVzKTsKIGludCBwY21jaWFfZ2V0X21lbV9wYWdlKHdpbmRvd19oYW5kbGVfdCB3aW4sIG1lbXJlcV90ICpyZXEpOwogaW50IHBjbWNpYV9tYXBfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIG1vZGNvbmZfdCAqbW9kKTsKK2ludCBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBtb2Rjb25mX3QgKm1vZCk7CiBpbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpOwotaW50IHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSk7Ci1pbnQgcGNtY2lhX3JlbGVhc2VfaW8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW9fcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlbGVhc2VfaXJxKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlycV9yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CitpbnQgcGNtY2lhX3JlbGVhc2VfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVsZWFzZV9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSk7CiBpbnQgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHdpbmRvd19oYW5kbGVfdCB3aW4pOwotaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY29uZmlnX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZXF1ZXN0X2lvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlvX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZXF1ZXN0X2lycShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpcnFfcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KGNsaWVudF9oYW5kbGVfdCAqaGFuZGxlLCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCk7Ci1pbnQgcGNtY2lhX3Jlc2V0X2NhcmQoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY2xpZW50X3JlcV90ICpyZXEpOworaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjb25maWdfcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVxdWVzdF9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KHN0cnVjdCBwY21jaWFfZGV2aWNlICoqcF9kZXYsIHdpbl9yZXFfdCAqcmVxLCB3aW5kb3dfaGFuZGxlX3QgKndoKTsKK2ludCBwY21jaWFfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNsaWVudF9yZXFfdCAqcmVxKTsKIGludCBwY21jaWFfc3VzcGVuZF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwogaW50IHBjbWNpYV9yZXN1bWVfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIGludCBwY21jaWFfZWplY3RfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIGludCBwY21jaWFfaW5zZXJ0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7Ci1pbnQgcGNtY2lhX3JlcG9ydF9lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBlcnJvcl9pbmZvX3QgKmVycik7CiAKIHN0cnVjdCBwY21jaWFfc29ja2V0ICogcGNtY2lhX2dldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiB2b2lkIHBjbWNpYV9wdXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaCBiL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmgKaW5kZXggNzg4MWQ0MC4uYzFkMTYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9jc190eXBlcy5oCkBAIC0zNCw4ICszNCw4IEBACiB0eXBlZGVmIHVfY2hhcgljaXNkYXRhX3Q7CiB0eXBlZGVmIHVfc2hvcnQJcGFnZV90OwogCi1zdHJ1Y3QgY2xpZW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBjbGllbnRfdCAqY2xpZW50X2hhbmRsZV90Oworc3RydWN0IHBjbWNpYV9kZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBwY21jaWFfZGV2aWNlICpjbGllbnRfaGFuZGxlX3Q7CiAKIHN0cnVjdCB3aW5kb3dfdDsKIHR5cGVkZWYgc3RydWN0IHdpbmRvd190ICp3aW5kb3dfaGFuZGxlX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaCBiL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmQ4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoMjAwMy0yMDA0KSAJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoJCQkJRGF2aWQgV29vZGhvdXNlCisgKgorICogTGljZW5zZTogR1BMIHYyCisgKi8KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRChtYW5mLCBjYXJkKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwgXAorCS5tYW5mX2lkID0gKG1hbmYpLCBcCisJLmNhcmRfaWQgPSAoY2FyZCksIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0ZVTkNfSUQoZnVuYykgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DX0lELCBcCisJLmZ1bmNfaWQgPSAoZnVuYyksIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX1BST0RfSUQxKHYxLCB2aDEpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDEsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDIodjIsIHZoMikgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMiwgXAorCS5wcm9kX2lkID0geyBOVUxMLCAodjIpLCBOVUxMLCBOVUxMIH0sICBcCisJLnByb2RfaWRfaGFzaCA9IHsgMCwgKHZoMiksIDAsIDAgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKHYxLCB2MiwgdmgxLCB2aDIpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDIsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgKHYyKSwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAwLCAwIH0sIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX1BST0RfSUQxMyh2MSwgdjMsIHZoMSwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTQodjEsIHY0LCB2aDEsIHZoNCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENCwgXAorCS5wcm9kX2lkID0geyAodjEpLCBOVUxMLCBOVUxMLCAodjQpIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgMCwgMCwgKHZoNCkgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMyh2MSwgdjIsIHYzLCB2aDEsIHZoMiwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksIE5VTEwgfSxcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAodmgzKSwgMCB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTI0KHYxLCB2MiwgdjQsIHZoMSwgdmgyLCB2aDQpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDQsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgKHYyKSwgTlVMTCwgKHY0KSB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAwLCAodmg0KSB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTM0KHYxLCB2MywgdjQsIHZoMSwgdmgzLCB2aDQpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDQsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgKHYzKSwgKHY0KSB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsICh2aDMpLCAodmg0KSB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCh2MSwgdjIsIHYzLCB2NCwgdmgxLCB2aDIsIHZoMywgdmg0KSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQ0LCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksICh2NCkgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksICh2aDQpIH0sIH0KKworCisvKiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKG1mYywgbWFuZiwgY2FyZCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ1RJT04sIFwKKwkubWFuZl9pZCA9IChtYW5mKSwgXAorCS5jYXJkX2lkID0gKGNhcmQpLCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMShtZmMsIHYxLCB2aDEpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ1RJT04sIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCB9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDIobWZjLCB2MiwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7IE5VTEwsICh2MiksIE5VTEwsIE5VTEwgfSwgIFwKKwkucHJvZF9pZF9oYXNoID0geyAwLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTMobWZjLCB2MSwgdjMsIHZoMSwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIzKG1mYywgdjEsIHYyLCB2MywgdmgxLCB2aDIsIHZoMykgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEM3wgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTiwgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCAodjMpLCBOVUxMIH0sXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksIDAgfSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCB9CisKKy8qIHBzZXVkbyBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKG1mYywgbWFuZiwgY2FyZCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLm1hbmZfaWQgPSAobWFuZiksIFwKKwkuY2FyZF9pZCA9IChjYXJkKSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxKG1mYywgdjEsIHZoMSkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8sIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQyKG1mYywgdjIsIHZoMikgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8sIFwKKwkucHJvZF9pZCA9IHsgTlVMTCwgKHYyKSwgTlVMTCwgTlVMTCB9LCAgXAorCS5wcm9kX2lkX2hhc2ggPSB7IDAsICh2aDIpLCAwLCAwIH0sIFwKKwkuZGV2aWNlX25vID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTywgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCBOVUxMLCBOVUxMIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgKHZoMiksIDAsIDAgfSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMyhtZmMsIHYxLCB2MywgdmgxLCB2aDMpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCBcCisJLmRldmljZV9ubyA9IChtZmMpLCB9CisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMyhtZmMsIHYxLCB2MiwgdjMsIHZoMSwgdmgyLCB2aDMpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksIE5VTEwgfSxcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAodmgzKSwgMCB9LCBcCisJLmRldmljZV9ubyA9IChtZmMpLCB9CisKKy8qIGNhcmRzIG5lZWRpbmcgYSBDSVMgb3ZlcnJpZGUgKi8KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQobWFuZiwgY2FyZCwgX2Npc2ZpbGUpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMgfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwgXAorCS5tYW5mX2lkID0gKG1hbmYpLCBcCisJLmNhcmRfaWQgPSAoY2FyZCksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKHYxLCB2MiwgdmgxLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMiwgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCBOVUxMLCBOVUxMIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgKHZoMiksIDAsIDAgfSwgXAorCS5jaXNmaWxlID0gKF9jaXNmaWxlKX0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIzKHYxLCB2MiwgdjMsIHZoMSwgdmgyLCB2aDMsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMywgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCAodjMpLCBOVUxMIH0sXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksIDAgfSwgXAorCS5jaXNmaWxlID0gKF9jaXNmaWxlKX0KKworCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQyKHYyLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDIsIFwKKwkucHJvZF9pZCA9IHsgTlVMTCwgKHYyKSwgTlVMTCwgTlVMTCB9LCAgXAorCS5wcm9kX2lkX2hhc2ggPSB7IDAsICh2aDIpLCAwLCAwIH0sIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMihtZmMsIHYxLCB2MiwgdmgxLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LFwKKwkuZGV2aWNlX25vID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRChtZmMsIG1hbmYsIGNhcmQsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfTUFORl9JRHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9DQVJEX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLm1hbmZfaWQgPSAobWFuZiksIFwKKwkuY2FyZF9pZCA9IChjYXJkKSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCBcCisJLmNpc2ZpbGUgPSAoX2Npc2ZpbGUpfQorCisjZGVmaW5lIFBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyLCBfY2lzZmlsZSkgeyBcCisJLm1hdGNoX2ZsYWdzID0gIFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMgfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQ0KG1mYywgdjQsIHZoNCwgX2Npc2ZpbGUpIHsgXAorCS5tYXRjaF9mbGFncyA9ICBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTiwgXAorCS5wcm9kX2lkID0geyBOVUxMLCBOVUxMLCBOVUxMLCAodjQpIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAwLCAwLCAwLCAodmg0KSB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKworI2RlZmluZSBQQ01DSUFfREVWSUNFX05VTEwgeyAubWF0Y2hfZmxhZ3MgPSAwLCB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kcy5oIGIvaW5jbHVkZS9wY21jaWEvZHMuaAppbmRleCAzMTJmZDk1Li5iNzA3YTYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2RzLmgKQEAgLTE2LDggKzE2LDEzIEBACiAjaWZuZGVmIF9MSU5VWF9EU19ICiAjZGVmaW5lIF9MSU5VWF9EU19ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RldmljZV9pZC5oPgogCiB0eXBlZGVmIHN0cnVjdCB0dXBsZV9wYXJzZV90IHsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTQ3LDcgKzUyLDYgQEAKIH0gbXRkX2luZm9fdDsKIAogdHlwZWRlZiB1bmlvbiBkc19pb2N0bF9hcmdfdCB7Ci0gICAgc2VydmluZm9fdAkJc2VydmluZm87CiAgICAgYWRqdXN0X3QJCWFkanVzdDsKICAgICBjb25maWdfaW5mb190CWNvbmZpZzsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTYzLDcgKzY3LDYgQEAKICAgICBjaXNkdW1wX3QJCWNpc2R1bXA7CiB9IGRzX2lvY3RsX2FyZ190OwogCi0jZGVmaW5lIERTX0dFVF9DQVJEX1NFUlZJQ0VTX0lORk8JX0lPUiAoJ2QnLCAxLCBzZXJ2aW5mb190KQogI2RlZmluZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTwkJX0lPV1IoJ2QnLCAyLCBhZGp1c3RfdCkKICNkZWZpbmUgRFNfR0VUX0NPTkZJR1VSQVRJT05fSU5GTwlfSU9XUignZCcsIDMsIGNvbmZpZ19pbmZvX3QpCiAjZGVmaW5lIERTX0dFVF9GSVJTVF9UVVBMRQkJX0lPV1IoJ2QnLCA0LCB0dXBsZV90KQpAQCAtMTI5LDEyICsxMzIsMTMgQEAKIAogc3RydWN0IHBjbWNpYV9zb2NrZXQ7CiAKLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlOwotCiBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB7CiAJZGV2X2xpbmtfdAkJKigqYXR0YWNoKSh2b2lkKTsKKwlpbnQgKCpldmVudCkJCShldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqKTsKIAl2b2lkCQkJKCpkZXRhY2gpKGRldl9saW5rX3QgKik7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkCSppZF90YWJsZTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcnY7CiB9OwogCkBAIC0xNTgsMjIgKzE2MiwxNiBAQAogCS8qIGRlcHJlY2F0ZWQsIGEgY2xlYW5lZCB1cCB2ZXJzaW9uIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzCiAJICAgc3RydWN0IHNvb24gKi8KIAlkZXZfbGlua190CQkqaW5zdGFuY2U7Ci0Jc3RydWN0IGNsaWVudF90IHsKLQkJdV9zaG9ydAkJCWNsaWVudF9tYWdpYzsKLQkJc3RydWN0IHBjbWNpYV9zb2NrZXQJKlNvY2tldDsKLQkJdV9jaGFyCQkJRnVuY3Rpb247Ci0JCXVfaW50CQkJc3RhdGU7Ci0JCWV2ZW50X3QJCQlFdmVudE1hc2s7Ci0JCWludCAoKmV2ZW50X2hhbmRsZXIpCShldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCi0JCQkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKik7Ci0JCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKLQl9CQkJY2xpZW50OworCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKKwl1X2ludAkJCXN0YXRlOwogCiAJLyogaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXZpY2UgKi8KIAl1OAkJCWhhc19tYW5mX2lkOjE7CiAJdTgJCQloYXNfY2FyZF9pZDoxOwogCXU4CQkJaGFzX2Z1bmNfaWQ6MTsKLQl1OAkJCXJlc2VydmVkOjU7CisKKwl1OAkJCWFsbG93X2Z1bmNfaWRfbWF0Y2g6MTsKKwl1OAkJCXJlc2VydmVkOjQ7CiAKIAl1OAkJCWZ1bmNfaWQ7CiAJdTE2CQkJbWFuZl9pZDsKQEAgLTE5MCw4ICsxODgsOCBAQAogI2RlZmluZSB0b19wY21jaWFfZGV2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgZGV2KQogI2RlZmluZSB0b19wY21jaWFfZHJ2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KQogCi0jZGVmaW5lIGhhbmRsZV90b19wZGV2KGhhbmRsZSkgY29udGFpbmVyX29mKGhhbmRsZSwgc3RydWN0IHBjbWNpYV9kZXZpY2UsIGNsaWVudCk7Ci0jZGVmaW5lIGhhbmRsZV90b19kZXYoaGFuZGxlKSAoKGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBwY21jaWFfZGV2aWNlLCBjbGllbnQpKS0+ZGV2KQorI2RlZmluZSBoYW5kbGVfdG9fcGRldihoYW5kbGUpIChoYW5kbGUpCisjZGVmaW5lIGhhbmRsZV90b19kZXYoaGFuZGxlKSAoaGFuZGxlLT5kZXYpCiAKIC8qIGVycm9yIHJlcG9ydGluZyAqLwogdm9pZCBjc19lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpbnQgZnVuYywgaW50IHJldCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9zcy5oIGIvaW5jbHVkZS9wY21jaWEvc3MuaAppbmRleCA2N2I4NjdmMy4uMGY3YWFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvc3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9zcy5oCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpZm5kZWYgX0xJTlVYX1NTX0gKICNkZWZpbmUgX0xJTlVYX1NTX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2J1bGttZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogLyogRGVmaW5pdGlvbnMgZm9yIGNhcmQgc3RhdHVzIGZsYWdzIGZvciBHZXRTdGF0dXMgKi8KICNkZWZpbmUgU1NfV1JQUk9UCTB4MDAwMQpAQCAtMTcxLDcgKzE3Myw3IEBACiAKIHN0cnVjdCBjb25maWdfdDsKIHN0cnVjdCBwY21jaWFfY2FsbGJhY2s7Ci0KK3N0cnVjdCB1c2VyX2luZm9fdDsKIAogc3RydWN0IHBjbWNpYV9zb2NrZXQgewogCXN0cnVjdCBtb2R1bGUJCQkqb3duZXI7CkBAIC0yMTYsOCArMjE4LDkgQEAKIAogCS8qIGlzIHNldCB0byBvbmUgaWYgcmVzb3VyY2Ugc2V0dXAgaXMgZG9uZSB1c2luZyBhZGp1c3RfcmVzb3VyY2VfaW5mbygpICovCiAJdTgJCQkJcmVzb3VyY2Vfc2V0dXBfb2xkOjE7CisJdTgJCQkJcmVzb3VyY2Vfc2V0dXBfbmV3OjE7CiAKLQl1OAkJCQlyZXNlcnZlZDo2OworCXU4CQkJCXJlc2VydmVkOjU7CiAKIAkvKiBzb2NrZXQgb3BlcmF0aW9ucyAqLwogCXN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucyAqCW9wczsKQEAgLTI0MSw5ICsyNDQsMzIgQEAKIAl1bnNpZ25lZCBpbnQJCQl0aHJlYWRfZXZlbnRzOwogCiAJLyogcGNtY2lhICgxNi1iaXQpICovCi0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0CSpwY21jaWE7CiAJc3RydWN0IHBjbWNpYV9jYWxsYmFjawkJKmNhbGxiYWNrOwogCisjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19QQ01DSUFfTU9EVUxFKQorCXN0cnVjdCBsaXN0X2hlYWQJCWRldmljZXNfbGlzdDsJLyogIFBDTUNJQSBkZXZpY2VzICovCisJdTgJCQkJZGV2aWNlX2NvdW50OwkvKiB0aGUgbnVtYmVyIG9mIGRldmljZXMsIHVzZWQKKwkJCQkJCQkgKiBvbmx5IGludGVybmFsbHkgYW5kIHN1YmplY3QKKwkJCQkJCQkgKiB0byBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KKworCXN0cnVjdCB7CisJCXU4CQkJcHJlc2VudDoxLAkvKiBQQ01DSUEgY2FyZCBpcyBwcmVzZW50IGluIHNvY2tldCAqLworCQkJCQlidXN5OjEsCQkvKiAibWFzdGVyIiBpb2N0bCBpcyB1c2VkICovCisJCQkJCWRlYWQ6MSwJCS8qIHBjbWNpYSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQgKi8KKwkJCQkJZGV2aWNlX2FkZF9wZW5kaW5nOjEsIC8qIGEgcHNldWRvLW11bHRpZnVuY3Rpb24tZGV2aWNlCisJCQkJCQkJICAgICAgICogYWRkIGV2ZW50IGlzIHBlbmRpbmcgKi8KKwkJCQkJcmVzZXJ2ZWQ6NDsKKwl9IAkJCQlwY21jaWFfc3RhdGU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWRldmljZV9hZGQ7CS8qIGZvciBhZGRpbmcgZnVydGhlciBwc2V1ZG8tbXVsdGlmdW5jdGlvbgorCQkJCQkJCSAqIGRldmljZXMgKi8KKworI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKKwlzdHJ1Y3QgdXNlcl9pbmZvX3QJCSp1c2VyOworCXdhaXRfcXVldWVfaGVhZF90CQlxdWV1ZTsKKyNlbmRpZgorI2VuZGlmCisKIAkvKiBjYXJkYnVzICgzMi1iaXQpICovCiAjaWZkZWYgQ09ORklHX0NBUkRCVVMKIAlzdHJ1Y3QgcmVzb3VyY2UgKgkJY2JfY2lzX3JlczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL3ZlcnNpb24uaCBiL2luY2x1ZGUvcGNtY2lhL3ZlcnNpb24uaAppbmRleCBlYjg4MjYzLi41YWQ5YzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvdmVyc2lvbi5oCkBAIC0xLDQgKzEsMyBAQAogLyogdmVyc2lvbi5oIDEuOTQgMjAwMC8xMC8wMyAxNzo1NTo0OCAoRGF2aWQgSGluZHMpICovCiAKLSNkZWZpbmUgQ1NfUkVMRUFTRSAiMy4xLjIyIgotI2RlZmluZSBDU19SRUxFQVNFX0NPREUgMHgzMTE2CisvKiBUaGlzIGZpbGUgd2lsbCBiZSByZW1vdmVkLCBwbGVhc2UgZG9uJ3QgaW5jbHVkZSBpdCAqLwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGIxMDkxZDcuLjc1NzU1ZWYgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiBjb25maWcgQVVESVRTWVNDQUxMCiAJYm9vbCAiRW5hYmxlIHN5c3RlbS1jYWxsIGF1ZGl0aW5nIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVURJVCAmJiAoWDg2IHx8IFBQQyB8fCBQUEM2NCB8fCBBUkNIX1MzOTAgfHwgSUE2NCB8fCBVTUwpCisJZGVwZW5kcyBvbiBBVURJVCAmJiAoWDg2IHx8IFBQQyB8fCBQUEM2NCB8fCBBUkNIX1MzOTAgfHwgSUE2NCB8fCBVTUwgfHwgU1BBUkM2NCkKIAlkZWZhdWx0IHkgaWYgU0VDVVJJVFlfU0VMSU5VWAogCWhlbHAKIAkgIEVuYWJsZSBsb3ctb3ZlcmhlYWQgc3lzdGVtLWNhbGwgYXVkaXRpbmcgaW5mcmFzdHJ1Y3R1cmUgdGhhdApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggYjc1NzBjMC4uNGUxMWE5YSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KQEAgLTI1LDggKzI2LDYgQEAKIC8qIHRoaXMgaXMgaW5pdGlhbGl6ZWQgaW4gaW5pdC9tYWluLmMgKi8KIGRldl90IFJPT1RfREVWOwogCi1FWFBPUlRfU1lNQk9MKFJPT1RfREVWKTsKLQogc3RhdGljIGludCBfX2luaXQgbG9hZF9yYW1kaXNrKGNoYXIgKnN0cikKIHsKIAlyZF9kb2xvYWQgPSBzaW1wbGVfc3RydG9sKHN0cixOVUxMLDApICYgMzsKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmggYi9pbml0L2RvX21vdW50cy5oCmluZGV4IGRlOTJiZWUuLmUwYTdhYzkgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzLmgKKysrIGIvaW5pdC9kb19tb3VudHMuaApAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAKLWRldl90IG5hbWVfdG9fZGV2X3QoY2hhciAqbmFtZSk7CiB2b2lkICBjaGFuZ2VfZmxvcHB5KGNoYXIgKmZtdCwgLi4uKTsKIHZvaWQgIG1vdW50X2Jsb2NrX3Jvb3QoY2hhciAqbmFtZSwgaW50IGZsYWdzKTsKIHZvaWQgIG1vdW50X3Jvb3Qodm9pZCk7CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19pbml0cmQuYyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCmluZGV4IDRkZWY4ODIuLmEwNWNhYmQgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCkBAIC04Niw3ICs4NiwxMCBAQAogCQlwcmludGsoIm9rYXlcbiIpOwogCWVsc2UgewogCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9yb290Lm9sZCIsIE9fUkRXUiwgMCk7Ci0JCXByaW50aygiZmFpbGVkXG4iKTsKKwkJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCQlwcmludGsoIi9pbml0cmQgZG9lcyBub3QgZXhpc3QuIElnbm9yZWQuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJmYWlsZWRcbiIpOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVubW91bnRpbmcgb2xkIHJvb3RcbiIpOwogCQlzeXNfdW1vdW50KCIvb2xkIiwgTU5UX0RFVEFDSCk7CiAJCXByaW50ayhLRVJOX05PVElDRSAiVHJ5aW5nIHRvIGZyZWUgcmFtZGlzayBtZW1vcnkgLi4uICIpOwpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBkMzI0ODAxLi5iNWU0MjFlIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMzgzLDYgKzM4MywxMyBAQAogCW51bWFfZGVmYXVsdF9wb2xpY3koKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisJLyoKKwkgKiBUaGUgYm9vdCBpZGxlIHRocmVhZCBtdXN0IGV4ZWN1dGUgc2NoZWR1bGUoKQorCSAqIGF0IGxlYXN0IG9uZSB0byBnZXQgdGhpbmdzIG1vdmluZzoKKwkgKi8KKwlzY2hlZHVsZSgpOworCiAJY3B1X2lkbGUoKTsKIH0gCiAKZGlmZiAtLWdpdCBhL2lwYy9jb21wYXQuYyBiL2lwYy9jb21wYXQuYwppbmRleCA3MGU0ZTRlLi4zODgxZDU2IDEwMDY0NAotLS0gYS9pcGMvY29tcGF0LmMKKysrIGIvaXBjL2NvbXBhdC5jCkBAIC01NzIsNiArNTcyLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihzbWktPnNobW1uaSwgJnVwLT5zaG1tbmkpOwogCWVyciB8PSBfX3B1dF91c2VyKHNtaS0+c2htc2VnLCAmdXAtPnNobXNlZyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc21pLT5zaG1hbGwsICZ1cC0+c2htYWxsKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwdXRfY29tcGF0X3NobV9pbmZvKHN0cnVjdCBzaG1faW5mbyBfX3VzZXIgKmlwLApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggMDdkNjg5NC4uNDQzNDhjYSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC02Nyw3ICs2Nyw3IEBACiB2b2lkIGtlcm5lbF90b19pcGM2NF9wZXJtKHN0cnVjdCBrZXJuX2lwY19wZXJtICppbiwgc3RydWN0IGlwYzY0X3Blcm0gKm91dCk7CiB2b2lkIGlwYzY0X3Blcm1fdG9faXBjX3Blcm0oc3RydWN0IGlwYzY0X3Blcm0gKmluLCBzdHJ1Y3QgaXBjX3Blcm0gKm91dCk7CiAKLSNpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19ocHBhX18pCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKF9fWFRFTlNBX18pCiAgIC8qIE9uIElBLTY0LCB3ZSBhbHdheXMgdXNlIHRoZSAiNjQtYml0IHZlcnNpb24iIG9mIHRoZSBJUEMgc3RydWN0dXJlcy4gICovIAogIyBkZWZpbmUgaXBjX3BhcnNlX3ZlcnNpb24oY21kKQlJUENfNjQKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAzZWJjZDYwLi45ZDFiMTBlIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTc4NCw2ICs3ODQsOCBAQAogCiAJcHJvZmlsZV90YXNrX2V4aXQodHNrKTsKIAorCVdBUk5fT04oYXRvbWljX3JlYWQoJnRzay0+ZnNfZXhjbCkpOworCiAJaWYgKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKIAkJcGFuaWMoIkFpZWUsIGtpbGxpbmcgaW50ZXJydXB0IGhhbmRsZXIhIik7CiAJaWYgKHVubGlrZWx5KCF0c2stPnBpZCkpCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCAyYzc4MDY4Li5iNjUxODdmIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTIwOCw4ICsyMDgsMTAgQEAKIAkJc3RydWN0IGZpbGUgKmZpbGU7CiAKIAkJaWYgKG1wbnQtPnZtX2ZsYWdzICYgVk1fRE9OVENPUFkpIHsKKwkJCWxvbmcgcGFnZXMgPSB2bWFfcGFnZXMobXBudCk7CisJCQltbS0+dG90YWxfdm0gLT0gcGFnZXM7CiAJCQlfX3ZtX3N0YXRfYWNjb3VudChtbSwgbXBudC0+dm1fZmxhZ3MsIG1wbnQtPnZtX2ZpbGUsCi0JCQkJCQkJLXZtYV9wYWdlcyhtcG50KSk7CisJCQkJCQkJCS1wYWdlcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQljaGFyZ2UgPSAwOwpAQCAtMTA5MCw2ICsxMDkyLDExIEBACiAJCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAl9CiAKKwkvKgorCSAqIGluaGVyaXQgaW9wcmlvCisJICovCisJcC0+aW9wcmlvID0gY3VycmVudC0+aW9wcmlvOworCiAJU0VUX0xJTktTKHApOwogCWlmICh1bmxpa2VseShwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKIAkJX19wdHJhY2VfbGluayhwLCBjdXJyZW50LT5wYXJlbnQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9hdXRvcHJvYmUuYyBiL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKaW5kZXggOThkNjJkOC4uMzQ2NzA5NyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9hdXRvcHJvYmUuYworKysgYi9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKIC8qCiAgKiBBdXRvZGV0ZWN0aW9uIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBhbnkgaW50ZXJydXB0IHRoYXQKQEAgLTI2LDcgKzI3LDcgQEAKICAqLwogdW5zaWduZWQgbG9uZyBwcm9iZV9pcnFfb24odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCwgZGVsYXk7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAJaXJxX2Rlc2NfdCAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNDUsOCArNDYsNyBAQAogCX0KIAogCS8qIFdhaXQgZm9yIGxvbmdzdGFuZGluZyBpbnRlcnJ1cHRzIHRvIHRyaWdnZXIuICovCi0JZm9yIChkZWxheSA9IGppZmZpZXMgKyBIWi81MDsgdGltZV9hZnRlcihkZWxheSwgamlmZmllcyk7ICkKLQkJLyogYWJvdXQgMjBtcyBkZWxheSAqLyBiYXJyaWVyKCk7CisJbXNsZWVwKDIwKTsKIAogCS8qCiAJICogZW5hYmxlIGFueSB1bmFzc2lnbmVkIGlycXMKQEAgLTY4LDggKzY4LDcgQEAKIAkvKgogCSAqIFdhaXQgZm9yIHNwdXJpb3VzIGludGVycnVwdHMgdG8gdHJpZ2dlcgogCSAqLwotCWZvciAoZGVsYXkgPSBqaWZmaWVzICsgSFovMTA7IHRpbWVfYWZ0ZXIoZGVsYXksIGppZmZpZXMpOyApCi0JCS8qIGFib3V0IDEwMG1zIGRlbGF5ICovIGJhcnJpZXIoKTsKKwltc2xlZXAoMTAwKTsKIAogCS8qCiAJICogTm93IGZpbHRlciBvdXQgYW55IG9idmlvdXNseSBzcHVyaW91cyBpbnRlcnJ1cHRzCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCA0MzZjN2Q5Li5jMjlmODNjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAJCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJCWlmICghbm9pcnFkZWJ1ZykKLQkJCW5vdGVfaW50ZXJydXB0KGlycSwgZGVzYywgYWN0aW9uX3JldCk7CisJCQlub3RlX2ludGVycnVwdChpcnEsIGRlc2MsIGFjdGlvbl9yZXQsIHJlZ3MpOwogCQlpZiAobGlrZWx5KCEoZGVzYy0+c3RhdHVzICYgSVJRX1BFTkRJTkcpKSkKIAkJCWJyZWFrOwogCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9QRU5ESU5HOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGJhMDM5ZTguLjdkZjlhYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTExLDYgKzExLDgzIEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorc3RhdGljIGludCBpcnFmaXh1cDsKKworLyoKKyAqIFJlY292ZXJ5IGhhbmRsZXIgZm9yIG1pc3JvdXRlZCBpbnRlcnJ1cHRzLgorICovCisKK3N0YXRpYyBpbnQgbWlzcm91dGVkX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlpcnFfZGVzY190ICpkZXNjOworCWludCBvayA9IDA7CisJaW50IHdvcmsgPSAwOwkvKiBEaWQgd2UgZG8gd29yayBmb3IgYSByZWFsIElSUSAqLworCisJZm9yKGkgPSAxOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKworCQlpZiAoaSA9PSBpcnEpCS8qIEFscmVhZHkgdHJpZWQgKi8KKwkJCWNvbnRpbnVlOworCQlkZXNjID0gJmlycV9kZXNjW2ldOworCQlzcGluX2xvY2soJmRlc2MtPmxvY2spOworCQlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJCS8qIEFscmVhZHkgcnVubmluZyBvbiBhbm90aGVyIHByb2Nlc3NvciAqLworCQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX0lOUFJPR1JFU1MpIHsKKwkJCS8qCisJCQkgKiBBbHJlYWR5IHJ1bm5pbmc6IElmIGl0IGlzIHNoYXJlZCBnZXQgdGhlIG90aGVyCisJCQkgKiBDUFUgdG8gZ28gbG9va2luZyBmb3Igb3VyIG15c3RlcnkgaW50ZXJydXB0IHRvbworCQkJICovCisJCQlpZiAoZGVzYy0+YWN0aW9uICYmIChkZXNjLT5hY3Rpb24tPmZsYWdzICYgU0FfU0hJUlEpKQorCQkJCWRlc2MtPnN0YXR1cyB8PSBJUlFfUEVORElORzsKKwkJCXNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEhvbm91ciB0aGUgbm9ybWFsIElSUSBsb2NraW5nICovCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCQl3aGlsZSAoYWN0aW9uKSB7CisJCQkvKiBPbmx5IHNoYXJlZCBJUlEgaGFuZGxlcnMgYXJlIHNhZmUgdG8gY2FsbCAqLworCQkJaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkgeworCQkJCWlmIChhY3Rpb24tPmhhbmRsZXIoaSwgYWN0aW9uLT5kZXZfaWQsIHJlZ3MpID09CisJCQkJCQlJUlFfSEFORExFRCkKKwkJCQkJb2sgPSAxOworCQkJfQorCQkJYWN0aW9uID0gYWN0aW9uLT5uZXh0OworCQl9CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCS8qIE5vdyBjbGVhbiB1cCB0aGUgZmxhZ3MgKi8KKwkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKKwkJYWN0aW9uID0gZGVzYy0+YWN0aW9uOworCisJCS8qCisJCSAqIFdoaWxlIHdlIHdlcmUgbG9va2luZyBmb3IgYSBmaXh1cCBzb21lb25lIHF1ZXVlZCBhIHJlYWwKKwkJICogSVJRIGNsYXNoaW5nIHdpdGggb3VyIHdhbGsKKwkJICovCisKKwkJd2hpbGUgKChkZXNjLT5zdGF0dXMgJiBJUlFfUEVORElORykgJiYgYWN0aW9uKSB7CisJCQkvKgorCQkJICogUGVyZm9ybSByZWFsIElSUSBwcm9jZXNzaW5nIGZvciB0aGUgSVJRIHdlIGRlZmVycmVkCisJCQkgKi8KKwkJCXdvcmsgPSAxOworCQkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCQkJaGFuZGxlX0lSUV9ldmVudChpLCByZWdzLCBhY3Rpb24pOworCQkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKKwkJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1BFTkRJTkc7CisJCX0KKwkJZGVzYy0+c3RhdHVzICY9IH5JUlFfSU5QUk9HUkVTUzsKKwkJLyoKKwkJICogSWYgd2UgZGlkIGFjdHVhbCB3b3JrIGZvciB0aGUgcmVhbCBJUlEgbGluZSB3ZSBtdXN0IGxldCB0aGUKKwkJICogSVJRIGNvbnRyb2xsZXIgY2xlYW4gdXAgdG9vCisJCSAqLworCQlpZih3b3JrKQorCQkJZGVzYy0+aGFuZGxlci0+ZW5kKGkpOworCQlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CisJfQorCS8qIFNvIHRoZSBjYWxsZXIgY2FuIGFkanVzdCB0aGUgaXJxIGVycm9yIGNvdW50cyAqLworCXJldHVybiBvazsKK30KKwogLyoKICAqIElmIDk5LDkwMCBvZiB0aGUgcHJldmlvdXMgMTAwLDAwMCBpbnRlcnJ1cHRzIGhhdmUgbm90IGJlZW4gaGFuZGxlZAogICogdGhlbiBhc3N1bWUgdGhhdCB0aGUgSVJRIGlzIHN0dWNrIGluIHNvbWUgbWFubmVyLiBEcm9wIGEgZGlhZ25vc3RpYwpAQCAtMzEsNyArMTA4LDggQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnEgZXZlbnQgJWQ6IGJvZ3VzIHJldHVybiB2YWx1ZSAleFxuIiwKIAkJCQlpcnEsIGFjdGlvbl9yZXQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXJxICVkOiBub2JvZHkgY2FyZWQhXG4iLCBpcnEpOworCQlwcmludGsoS0VSTl9FUlIgImlycSAlZDogbm9ib2R5IGNhcmVkICh0cnkgYm9vdGluZyB3aXRoICIKKwkJCQkidGhlIFwiaXJxcG9sbFwiIG9wdGlvbilcbiIsIGlycSk7CiAJfQogCWR1bXBfc3RhY2soKTsKIAlwcmludGsoS0VSTl9FUlIgImhhbmRsZXJzOlxuIik7CkBAIC01NSw3ICsxMzMsOCBAQAogCX0KIH0KIAotdm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQordm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0LAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQpIHsKIAkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKQEAgLTYzLDYgKzE0MiwxNSBAQAogCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAl9CiAKKwlpZiAodW5saWtlbHkoaXJxZml4dXApKSB7CisJCS8qIERvbid0IHB1bmlzaCB3b3JraW5nIGNvbXB1dGVycyAqLworCQlpZiAoKGlycWZpeHVwID09IDIgJiYgaXJxID09IDApIHx8IGFjdGlvbl9yZXQgPT0gSVJRX05PTkUpIHsKKwkJCWludCBvayA9IG1pc3JvdXRlZF9pcnEoaXJxLCByZWdzKTsKKwkJCWlmIChhY3Rpb25fcmV0ID09IElSUV9OT05FKQorCQkJCWRlc2MtPmlycXNfdW5oYW5kbGVkIC09IG9rOworCQl9CisJfQorCiAJZGVzYy0+aXJxX2NvdW50Kys7CiAJaWYgKGRlc2MtPmlycV9jb3VudCA8IDEwMDAwMCkKIAkJcmV0dXJuOwpAQCAtOTQsMyArMTgyLDI0IEBACiAKIF9fc2V0dXAoIm5vaXJxZGVidWciLCBub2lycWRlYnVnX3NldHVwKTsKIAorc3RhdGljIGludCBfX2luaXQgaXJxZml4dXBfc2V0dXAoY2hhciAqc3RyKQoreworCWlycWZpeHVwID0gMTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJNaXNyb3V0ZWQgSVJRIGZpeHVwIHN1cHBvcnQgZW5hYmxlZC5cbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoaXMgbWF5IGltcGFjdCBzeXN0ZW0gcGVyZm9ybWFuY2UuXG4iKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiaXJxZml4dXAiLCBpcnFmaXh1cF9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlycXBvbGxfc2V0dXAoY2hhciAqc3RyKQoreworCWlycWZpeHVwID0gMjsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJNaXNyb3V0ZWQgSVJRIGZpeHVwIGFuZCBwb2xsaW5nIHN1cHBvcnQgIgorCQkJCSJlbmFibGVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJUaGlzIG1heSBzaWduaWZpY2FudGx5IGltcGFjdCBzeXN0ZW0gIgorCQkJCSJwZXJmb3JtYW5jZVxuIik7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlycXBvbGwiLCBpcnFwb2xsX3NldHVwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pdGltZXIuYyBiL2tlcm5lbC9pdGltZXIuYwppbmRleCAxZGM5ODhlLi5hNzJjYjBlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXRpbWVyLmMKKysrIGIva2VybmVsL2l0aW1lci5jCkBAIC0xNTMsMTEgKzE1MywxNSBAQAogCiAJc3dpdGNoICh3aGljaCkgewogCWNhc2UgSVRJTUVSX1JFQUw6CithZ2FpbjoKIAkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJaW50ZXJ2YWwgPSB0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyOwogCQl2YWwgPSBpdF9yZWFsX3ZhbHVlKHRzay0+c2lnbmFsKTsKLQkJaWYgKHZhbCkKLQkJCWRlbF90aW1lcl9zeW5jKCZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcik7CisJCS8qIFdlIGFyZSBzaGFyaW5nIC0+c2lnbG9jayB3aXRoIGl0X3JlYWxfZm4oKSAqLworCQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcikgPCAwKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQlnb3RvIGFnYWluOworCQl9CiAJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQogCQkJdGltZXZhbF90b19qaWZmaWVzKCZ2YWx1ZS0+aXRfaW50ZXJ2YWwpOwogCQlpdF9yZWFsX2FybSh0c2ssIHRpbWV2YWxfdG9famlmZmllcygmdmFsdWUtPml0X3ZhbHVlKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwva2V4ZWMuYyBiL2tlcm5lbC9rZXhlYy5jCmluZGV4IDc4NDM1NDguLmNkZDRkY2QgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZXhlYy5jCisrKyBiL2tlcm5lbC9rZXhlYy5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIAogc3RhdGljIGludCBraW1hZ2VfY3Jhc2hfYWxsb2Moc3RydWN0IGtpbWFnZSAqKnJpbWFnZSwgdW5zaWduZWQgbG9uZyBlbnRyeSwKIAkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAotCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50ICpzZWdtZW50cykKKwkJCQlzdHJ1Y3Qga2V4ZWNfc2VnbWVudCBfX3VzZXIgKnNlZ21lbnRzKQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IGtpbWFnZSAqaW1hZ2U7CkBAIC02NTAsNyArNjUwLDcgQEAKIAkJfQogCX0KIAotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmtpbWFnZV9hbGxvY19wYWdlKHN0cnVjdCBraW1hZ2UgKmltYWdlLApAQCAtNjk2LDcgKzY5Niw3IEBACiAJCS8qIEFsbG9jYXRlIGEgcGFnZSwgaWYgd2UgcnVuIG91dCBvZiBtZW1vcnkgZ2l2ZSB1cCAqLwogCQlwYWdlID0ga2ltYWdlX2FsbG9jX3BhZ2VzKGdmcF9tYXNrLCAwKTsKIAkJaWYgKCFwYWdlKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gTlVMTDsKIAkJLyogSWYgdGhlIHBhZ2UgY2Fubm90IGJlIHVzZWQgZmlsZSBpdCBhd2F5ICovCiAJCWlmIChwYWdlX3RvX3BmbihwYWdlKSA+CiAJCQkJKEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgPj4gUEFHRV9TSElGVCkpIHsKQEAgLTc1NCw3ICs3NTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbWFkZHI7CiAJdW5zaWduZWQgbG9uZyB1Ynl0ZXMsIG1ieXRlczsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmOwogCiAJcmVzdWx0ID0gMDsKIAlidWYgPSBzZWdtZW50LT5idWY7CkBAIC04MTgsNyArODE4LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1hZGRyOwogCXVuc2lnbmVkIGxvbmcgdWJ5dGVzLCBtYnl0ZXM7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1ZjsKIAogCXJlc3VsdCA9IDA7CiAJYnVmID0gc2VnbWVudC0+YnVmOwpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMzM0ZjM3NC4uYjAyMzcxMiAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KQEAgLTUwLDYgKzUxLDEwNiBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhrcHJvYmVfbG9jayk7CiBzdGF0aWMgc3RydWN0IGtwcm9iZSAqY3Vycl9rcHJvYmU7CiAKKy8qCisgKiBrcHJvYmUtPmFpbnNuLmluc24gcG9pbnRzIHRvIHRoZSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZQorICogc2luZ2xlLXN0ZXBwZWQuIHg4Nl82NCwgUE9XRVI0IGFuZCBhYm92ZSBoYXZlIG5vLWV4ZWMgc3VwcG9ydCBhbmQKKyAqIHN0ZXBwaW5nIG9uIHRoZSBpbnN0cnVjdGlvbiBvbiBhIHZtYWxsb2NlZC9rbWFsbG9jZWQvZGF0YSBwYWdlCisgKiBpcyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIKKyAqLworI2RlZmluZSBJTlNOU19QRVJfUEFHRQkoUEFHRV9TSVpFLyhNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKQorCitzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSB7CisJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CisJa3Byb2JlX29wY29kZV90ICppbnNuczsJCS8qIFBhZ2Ugb2YgaW5zdHJ1Y3Rpb24gc2xvdHMgKi8KKwljaGFyIHNsb3RfdXNlZFtJTlNOU19QRVJfUEFHRV07CisJaW50IG51c2VkOworfTsKKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGtwcm9iZV9pbnNuX3BhZ2VzOworCisvKioKKyAqIGdldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCisgKiBXZSBhbGxvY2F0ZSBhbiBleGVjdXRhYmxlIHBhZ2UgaWYgdGhlcmUncyBubyByb29tIG9uIGV4aXN0aW5nIG9uZXMuCisgKi8KK2twcm9iZV9vcGNvZGVfdCAqZ2V0X2luc25fc2xvdCh2b2lkKQoreworCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKworCWhsaXN0X2Zvcl9lYWNoKHBvcywgJmtwcm9iZV9pbnNuX3BhZ2VzKSB7CisJCWtpcCA9IGhsaXN0X2VudHJ5KHBvcywgc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UsIGhsaXN0KTsKKwkJaWYgKGtpcC0+bnVzZWQgPCBJTlNOU19QRVJfUEFHRSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgSU5TTlNfUEVSX1BBR0U7IGkrKykgeworCQkJCWlmICgha2lwLT5zbG90X3VzZWRbaV0pIHsKKwkJCQkJa2lwLT5zbG90X3VzZWRbaV0gPSAxOworCQkJCQlraXAtPm51c2VkKys7CisJCQkJCXJldHVybiBraXAtPmluc25zICsgKGkgKiBNQVhfSU5TTl9TSVpFKTsKKwkJCQl9CisJCQl9CisJCQkvKiBTdXJwcmlzZSEgIE5vIHVudXNlZCBzbG90cy4gIEZpeCBraXAtPm51c2VkLiAqLworCQkJa2lwLT5udXNlZCA9IElOU05TX1BFUl9QQUdFOworCQl9CisJfQorCisJLyogQWxsIG91dCBvZiBzcGFjZS4gIE5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcGFnZS4gVXNlIHNsb3QgMC4qLworCWtpcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFraXApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBVc2UgbW9kdWxlX2FsbG9jIHNvIHRoaXMgcGFnZSBpcyB3aXRoaW4gKy8tIDJHQiBvZiB3aGVyZSB0aGUKKwkgKiBrZXJuZWwgaW1hZ2UgYW5kIGxvYWRlZCBtb2R1bGUgaW1hZ2VzIHJlc2lkZS4gVGhpcyBpcyByZXF1aXJlZAorCSAqIHNvIHg4Nl82NCBjYW4gY29ycmVjdGx5IGhhbmRsZSB0aGUgJXJpcC1yZWxhdGl2ZSBmaXh1cHMuCisJICovCisJa2lwLT5pbnNucyA9IG1vZHVsZV9hbGxvYyhQQUdFX1NJWkUpOworCWlmICgha2lwLT5pbnNucykgeworCQlrZnJlZShraXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJSU5JVF9ITElTVF9OT0RFKCZraXAtPmhsaXN0KTsKKwlobGlzdF9hZGRfaGVhZCgma2lwLT5obGlzdCwgJmtwcm9iZV9pbnNuX3BhZ2VzKTsKKwltZW1zZXQoa2lwLT5zbG90X3VzZWQsIDAsIElOU05TX1BFUl9QQUdFKTsKKwlraXAtPnNsb3RfdXNlZFswXSA9IDE7CisJa2lwLT5udXNlZCA9IDE7CisJcmV0dXJuIGtpcC0+aW5zbnM7Cit9CisKK3ZvaWQgZnJlZV9pbnNuX3Nsb3Qoa3Byb2JlX29wY29kZV90ICpzbG90KQoreworCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKworCWhsaXN0X2Zvcl9lYWNoKHBvcywgJmtwcm9iZV9pbnNuX3BhZ2VzKSB7CisJCWtpcCA9IGhsaXN0X2VudHJ5KHBvcywgc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UsIGhsaXN0KTsKKwkJaWYgKGtpcC0+aW5zbnMgPD0gc2xvdCAmJgorCQkgICAgc2xvdCA8IGtpcC0+aW5zbnMgKyAoSU5TTlNfUEVSX1BBR0UgKiBNQVhfSU5TTl9TSVpFKSkgeworCQkJaW50IGkgPSAoc2xvdCAtIGtpcC0+aW5zbnMpIC8gTUFYX0lOU05fU0laRTsKKwkJCWtpcC0+c2xvdF91c2VkW2ldID0gMDsKKwkJCWtpcC0+bnVzZWQtLTsKKwkJCWlmIChraXAtPm51c2VkID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFBhZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIEZyZWUgaXQgdW5sZXNzCisJCQkJICogaXQncyB0aGUgbGFzdCBvbmUuICBXZSBrZWVwIHRoZSBsYXN0IG9uZQorCQkJCSAqIHNvIGFzIG5vdCB0byBoYXZlIHRvIHNldCBpdCB1cCBhZ2FpbiB0aGUKKwkJCQkgKiBuZXh0IHRpbWUgc29tZWJvZHkgaW5zZXJ0cyBhIHByb2JlLgorCQkJCSAqLworCQkJCWhsaXN0X2RlbCgma2lwLT5obGlzdCk7CisJCQkJaWYgKGhsaXN0X2VtcHR5KCZrcHJvYmVfaW5zbl9wYWdlcykpIHsKKwkJCQkJSU5JVF9ITElTVF9OT0RFKCZraXAtPmhsaXN0KTsKKwkJCQkJaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsCisJCQkJCQkma3Byb2JlX2luc25fcGFnZXMpOworCQkJCX0gZWxzZSB7CisJCQkJCW1vZHVsZV9mcmVlKE5VTEwsIGtpcC0+aW5zbnMpOworCQkJCQlrZnJlZShraXApOworCQkJCX0KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KK30KKwogLyogTG9ja3Mga3Byb2JlOiBpcnFzIG11c3QgYmUgZGlzYWJsZWQgKi8KIHZvaWQgbG9ja19rcHJvYmVzKHZvaWQpCiB7CkBAIC0xMzksMTIgKzI0MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBrcHJvYmUgdHJhbXBvbGluZV9wID0gewotCQkuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgJmtyZXRwcm9iZV90cmFtcG9saW5lLAotCQkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIsCi0JCS5wb3N0X2hhbmRsZXIgPSB0cmFtcG9saW5lX3Bvc3RfaGFuZGxlcgotfTsKLQogc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqZ2V0X2ZyZWVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKQEAgLTE2MywzNSArMjU4LDE4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF9ycF9pbnN0KHZvaWQgKnNhcmEpCi17Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0KLQl0c2sgPSBhcmNoX2dldF9rcHJvYmVfdGFzayhzYXJhKTsKLQloZWFkID0gJmtyZXRwcm9iZV9pbnN0X3RhYmxlW2hhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyldOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJpLCBub2RlLCBoZWFkLCBobGlzdCkgewotCQlpZiAocmktPnN0YWNrX2FkZHIgPT0gc2FyYSkKLQkJCXJldHVybiByaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHZvaWQgYWRkX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJLyoKIAkgKiBSZW1vdmUgcnAgaW5zdCBvZmYgdGhlIGZyZWUgbGlzdCAtCiAJICogQWRkIGl0IGJhY2sgd2hlbiBwcm9iZWQgZnVuY3Rpb24gcmV0dXJucwogCSAqLwogCWhsaXN0X2RlbCgmcmktPnVmbGlzdCk7Ci0JdHNrID0gYXJjaF9nZXRfa3Byb2JlX3Rhc2socmktPnN0YWNrX2FkZHIpOworCiAJLyogQWRkIHJwIGluc3Qgb250byB0YWJsZSAqLwogCUlOSVRfSExJU1RfTk9ERSgmcmktPmhsaXN0KTsKIAlobGlzdF9hZGRfaGVhZCgmcmktPmhsaXN0LAotCQkJJmtyZXRwcm9iZV9pbnN0X3RhYmxlW2hhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyldKTsKKwkJCSZrcmV0cHJvYmVfaW5zdF90YWJsZVtoYXNoX3B0cihyaS0+dGFzaywgS1BST0JFX0hBU0hfQklUUyldKTsKIAogCS8qIEFsc28gYWRkIHRoaXMgcnAgaW5zdCB0byB0aGUgdXNlZCBsaXN0LiAqLwogCUlOSVRfSExJU1RfTk9ERSgmcmktPnVmbGlzdCk7CkBAIC0yMTgsMzQgKzI5NiwyNSBAQAogCXJldHVybiAma3JldHByb2JlX2luc3RfdGFibGVbaGFzaF9wdHIodHNrLCBLUFJPQkVfSEFTSF9CSVRTKV07CiB9CiAKLXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF9ycF9pbnN0X3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCi0JaGVhZCA9ICZrcmV0cHJvYmVfaW5zdF90YWJsZVtoYXNoX3B0cih0aywgS1BST0JFX0hBU0hfQklUUyldOwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmksIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHJpLT5zdGFja19hZGRyKTsKLQkJaWYgKHRzayA9PSB0aykKLQkJCXJldHVybiByaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGRvX2V4aXQgb3IgZG9fZXhlY3Ygd2hlbiB0YXNrIHRrJ3Mgc3RhY2sgaXMKLSAqIGFib3V0IHRvIGJlIHJlY3ljbGVkLiBSZWN5Y2xlIGFueSBmdW5jdGlvbi1yZXR1cm4gcHJvYmUgaW5zdGFuY2VzCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrLiBUaGVzZSByZXByZXNlbnQgcHJvYmVkIGZ1bmN0aW9ucyB0aGF0IGhhdmUKLSAqIGJlZW4gY2FsbGVkIGJ1dCBtYXkgbmV2ZXIgcmV0dXJuLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBleGl0X3RocmVhZCBvciBmbHVzaF90aHJlYWQgd2hlbiB0YXNrIHRrJ3MKKyAqIHN0YWNrIGlzIGJlaW5nIHJlY3ljbGVkIHNvIHRoYXQgd2UgY2FuIHJlY3ljbGUgYW55IGZ1bmN0aW9uLXJldHVybiBwcm9iZQorICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2suIFRoZXNlIGxlZnQgb3ZlciBpbnN0YW5jZXMgcmVwcmVzZW50CisgKiBwcm9iZWQgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGNhbGxlZCBidXQgd2lsbCBuZXZlciByZXR1cm4uCiAgKi8KIHZvaWQga3Byb2JlX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0aykKIHsKKyAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CisgICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7Ci0JYXJjaF9rcHJvYmVfZmx1c2hfdGFzayh0ayk7CisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOworICAgICAgICBobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJpLCBub2RlLCB0bXAsIGhlYWQsIGhsaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJpLT50YXNrID09IHRrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVjeWNsZV9ycF9pbnN0KHJpKTsKKyAgICAgICAgfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTUwNSw5ICs1NzQsMTAgQEAKIAkJSU5JVF9ITElTVF9IRUFEKCZrcmV0cHJvYmVfaW5zdF90YWJsZVtpXSk7CiAJfQogCi0JZXJyID0gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZrcHJvYmVfZXhjZXB0aW9uc19uYik7Ci0JLyogUmVnaXN0ZXIgdGhlIHRyYW1wb2xpbmUgcHJvYmUgZm9yIHJldHVybiBwcm9iZSAqLwotCXJlZ2lzdGVyX2twcm9iZSgmdHJhbXBvbGluZV9wKTsKKwllcnIgPSBhcmNoX2luaXRfa3Byb2JlcygpOworCWlmICghZXJyKQorCQllcnIgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtwcm9iZV9leGNlcHRpb25zX25iKTsKKwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IGZiOGRlNjMuLjNlYzc4OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCiAjaW5jbHVkZSAicG93ZXIuaCIKIAogCkBAIC0yMzQsNiArMjM2LDE2IEBACiB7CiAJaW50IGVycm9yOwogCisJaWYgKCFzd3N1c3BfcmVzdW1lX2RldmljZSkgeworCQlpZiAoIXN0cmxlbihyZXN1bWVfZmlsZSkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJc3dzdXNwX3Jlc3VtZV9kZXZpY2UgPSBuYW1lX3RvX2Rldl90KHJlc3VtZV9maWxlKTsKKwkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVzXG4iLCByZXN1bWVfZmlsZSk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVkOiVkXG4iLAorCQkJIE1BSk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSwgTUlOT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpKTsKKwl9CisKIAlpZiAobm9yZXN1bWUpIHsKIAkJLyoqCiAJCSAqIEZJWE1FOiBJZiBub3Jlc3VtZSBpcyBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFydGl0aW9uCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvbWFpbi5jIGIva2VybmVsL3Bvd2VyL21haW4uYwppbmRleCBjOTRjYjllLi43MWFhMGZkIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvbWFpbi5jCisrKyBiL2tlcm5lbC9wb3dlci9tYWluLmMKQEAgLTE5LDYgKzE5LDkgQEAKIAogI2luY2x1ZGUgInBvd2VyLmgiCiAKKy8qVGhpcyBpcyBqdXN0IGFuIGFyYml0cmFyeSBudW1iZXIgKi8KKyNkZWZpbmUgRlJFRV9QQUdFX05VTUJFUiAoMTAwKQorCiBERUNMQVJFX01VVEVYKHBtX3NlbSk7CiAKIHN0cnVjdCBwbV9vcHMgKiBwbV9vcHMgPSBOVUxMOwpAQCAtNDksNiArNTIsNyBAQAogc3RhdGljIGludCBzdXNwZW5kX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewogCWludCBlcnJvciA9IDA7CisJdW5zaWduZWQgaW50IGZyZWVfcGFnZXM7CiAKIAlpZiAoIXBtX29wcyB8fCAhcG1fb3BzLT5lbnRlcikKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTY3LDYgKzcxLDE2IEBACiAJCWdvdG8gVGhhdzsKIAl9CiAKKwlpZiAoKGZyZWVfcGFnZXMgPSBucl9mcmVlX3BhZ2VzKCkpIDwgRlJFRV9QQUdFX05VTUJFUikgeworCQlwcl9kZWJ1ZygiUE06IGZyZWUgc29tZSBtZW1vcnlcbiIpOworCQlzaHJpbmtfYWxsX21lbW9yeShGUkVFX1BBR0VfTlVNQkVSIC0gZnJlZV9wYWdlcyk7CisJCWlmIChucl9mcmVlX3BhZ2VzKCkgPCBGUkVFX1BBR0VfTlVNQkVSKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlwcmludGsoS0VSTl9FUlIgIlBNOiBObyBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJCWdvdG8gVGhhdzsKKwkJfQorCX0KKwogCWlmIChwbV9vcHMtPnByZXBhcmUpIHsKIAkJaWYgKChlcnJvciA9IHBtX29wcy0+cHJlcGFyZShzdGF0ZSkpKQogCQkJZ290byBUaGF3OwpAQCAtMTk0LDcgKzIwOCw3IEBACiAKIGludCBwbV9zdXNwZW5kKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKLQlpZiAoc3RhdGUgPiBQTV9TVVNQRU5EX09OICYmIHN0YXRlIDwgUE1fU1VTUEVORF9NQVgpCisJaWYgKHN0YXRlID4gUE1fU1VTUEVORF9PTiAmJiBzdGF0ZSA8PSBQTV9TVVNQRU5EX01BWCkKIAkJcmV0dXJuIGVudGVyX3N0YXRlKHN0YXRlKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCmluZGV4IDBhMDg2NjQuLjNiZDBkMjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtNTksNiArNTksNyBAQAogCWludCB0b2RvOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcmludGsoICJTdG9wcGluZyB0YXNrczogIiApOwogCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtNjYsMTIgKzY3LDkgQEAKIAkJdG9kbyA9IDA7CiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlpZiAoIWZyZWV6ZWFibGUocCkpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoKGZyb3plbihwKSkgfHwKLQkJCSAgICAocC0+c3RhdGUgPT0gVEFTS19UUkFDRUQpIHx8Ci0JCQkgICAgKHAtPnN0YXRlID09IFRBU0tfU1RPUFBFRCkpCisJCQlpZiAoZnJvemVuKHApKQogCQkJCWNvbnRpbnVlOwogCiAJCQlmcmVlemUocCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKaW5kZXggYzI4NWZjNS4uZjJiYzcxYiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwpAQCAtNjMsNiArNjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC04NjksMTMgKzg3MCw2IEBACiAKIGFzbWxpbmthZ2UgaW50IHN3c3VzcF9zYXZlKHZvaWQpCiB7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmICgoZXJyb3IgPSBzd3N1c3Bfc3dhcF9jaGVjaygpKSkgewotCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogRkFUQUw6IGNhbm5vdCBmaW5kIHN3YXAgZGV2aWNlLCB0cnkgIgotCQkJCSJzd2Fwb24gLWEhXG4iKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KIAlyZXR1cm4gc3VzcGVuZF9wcmVwYXJlX2ltYWdlKCk7CiB9CiAKQEAgLTg5MiwxNCArODg2LDIwIEBACiAJICogYXQgcmVzdW1lIHRpbWUsIGFuZCBldmlsIHdlaXJkbmVzcyBlbnN1ZXMuCiAJICovCiAJaWYgKChlcnJvciA9IGRldmljZV9wb3dlcl9kb3duKFBNU0dfRlJFRVpFKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTb21lIGRldmljZXMgZmFpbGVkIHRvIHBvd2VyIGRvd24sIGFib3J0aW5nIHN1c3BlbmRcbiIpOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXN3c3VzcF9mcmVlKCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CisKKwlpZiAoKGVycm9yID0gc3dzdXNwX3N3YXBfY2hlY2soKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IEZBVEFMOiBjYW5ub3QgZmluZCBzd2FwIGRldmljZSwgdHJ5ICIKKwkJCQkic3dhcG9uIC1hIVxuIik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7CiAJaWYgKChlcnJvciA9IHN3c3VzcF9hcmNoX3N1c3BlbmQoKSkpCi0JCXN3c3VzcF9mcmVlKCk7CisJCXByaW50aygiRXJyb3IgJWQgc3VzcGVuZGluZ1xuIiwgZXJyb3IpOwogCS8qIFJlc3RvcmUgY29udHJvbCBmbG93IG1hZ2ljYWxseSBhcHBlYXJzIGhlcmUgKi8KIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCUJVR19PTiAobnJfY29weV9wYWdlc19jaGVjayAhPSBucl9jb3B5X3BhZ2VzKTsKQEAgLTExNjYsOSArMTE2Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIHNhbml0eV9jaGVjayh2b2lkKQogewogCWR1bXBfaW5mbygpOwotCWlmKHN3c3VzcF9pbmZvLnZlcnNpb25fY29kZSAhPSBMSU5VWF9WRVJTSU9OX0NPREUpCisJaWYgKHN3c3VzcF9pbmZvLnZlcnNpb25fY29kZSAhPSBMSU5VWF9WRVJTSU9OX0NPREUpCiAJCXJldHVybiAia2VybmVsIHZlcnNpb24iOwotCWlmKHN3c3VzcF9pbmZvLm51bV9waHlzcGFnZXMgIT0gbnVtX3BoeXNwYWdlcykKKwlpZiAoc3dzdXNwX2luZm8ubnVtX3BoeXNwYWdlcyAhPSBudW1fcGh5c3BhZ2VzKQogCQlyZXR1cm4gIm1lbW9yeSBzaXplIjsKIAlpZiAoc3RyY21wKHN3c3VzcF9pbmZvLnV0cy5zeXNuYW1lLHN5c3RlbV91dHNuYW1lLnN5c25hbWUpKQogCQlyZXR1cm4gInN5c3RlbSB0eXBlIjsKQEAgLTEyNjEsOCArMTI2MSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1leHRlcm4gZGV2X3QgbmFtZV90b19kZXZfdChjb25zdCBjaGFyICpsaW5lKTsKLQogLyoqCiAgKglyZWFkX3BhZ2VkaXIgLSBSZWFkIHBhZ2UgYmFja3VwIGxpc3QgcGFnZXMgZnJvbSBzd2FwCiAgKi8KQEAgLTEzNTYsMTYgKzEzNTQsNiBAQAogewogCWludCBlcnJvcjsKIAotCWlmICghc3dzdXNwX3Jlc3VtZV9kZXZpY2UpIHsKLQkJaWYgKCFzdHJsZW4ocmVzdW1lX2ZpbGUpKQotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gbmFtZV90b19kZXZfdChyZXN1bWVfZmlsZSk7Ci0JCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlc1xuIiwgcmVzdW1lX2ZpbGUpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlZDolZFxuIiwKLQkJCSBNQUpPUihzd3N1c3BfcmVzdW1lX2RldmljZSksIE1JTk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSk7Ci0JfQotCiAJcmVzdW1lX2JkZXYgPSBvcGVuX2J5X2Rldm51bShzd3N1c3BfcmVzdW1lX2RldmljZSwgRk1PREVfUkVBRCk7CiAJaWYgKCFJU19FUlIocmVzdW1lX2JkZXYpKSB7CiAJCXNldF9ibG9ja3NpemUocmVzdW1lX2JkZXYsIFBBR0VfU0laRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBhZDhjYmI3Li5mODkyNDhlIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTM1LDExICszNSwxMSBAQAogI2RlZmluZSBOUl9QUk9GSUxFX0dSUAkJKE5SX1BST0ZJTEVfSElUL1BST0ZJTEVfR1JQU1opCiAKIC8qIE9wcm9maWxlIHRpbWVyIHRpY2sgaG9vayAqLwotaW50ICgqdGltZXJfaG9vaykoc3RydWN0IHB0X3JlZ3MgKik7CitpbnQgKCp0aW1lcl9ob29rKShzdHJ1Y3QgcHRfcmVncyAqKSBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgYXRvbWljX3QgKnByb2ZfYnVmZmVyOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvZl9sZW4sIHByb2Zfc2hpZnQ7Ci1zdGF0aWMgaW50IHByb2Zfb247CitzdGF0aWMgaW50IHByb2Zfb24gX19yZWFkX21vc3RseTsKIHN0YXRpYyBjcHVtYXNrX3QgcHJvZl9jcHVfbWFzayA9IENQVV9NQVNLX0FMTDsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHByb2ZpbGVfaGl0ICpbMl0sIGNwdV9wcm9maWxlX2hpdHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBhMDdjZmY5Li40MTA3ZGIwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMzQ0OCwxNSArMzQ0OCw3IEBACiB7CiAJcmV0dXJuIFRBU0tfTklDRShwKTsKIH0KLQotLyoKLSAqIFRoZSBvbmx5IHVzZXJzIG9mIHRhc2tfbmljZSBhcmUgYmluZm10X2VsZiBhbmQgYmluZm10X2VsZjMyLgotICogYmluZm10X2VsZiBpcyBubyBsb25nZXIgbW9kdWxhciwgYnV0IGJpbmZtdF9lbGYzMiBzdGlsbCBpcy4KLSAqIFRoZXJlZm9yZSwgdGFza19uaWNlIGlzIG5lZWRlZCBpZiB0aGVyZSBpcyBhIGNvbXBhdF9tb2RlLgotICovCi0jaWZkZWYgQ09ORklHX0NPTVBBVAogRVhQT1JUX1NZTUJPTF9HUEwodGFza19uaWNlKTsKLSNlbmRpZgogCiAvKioKICAqIGlkbGVfY3B1IC0gaXMgYSBnaXZlbiBjcHUgaWRsZSBjdXJyZW50bHk/CkBAIC0zODg1LDYgKzM4NzcsMTMgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fY29uZF9yZXNjaGVkKHZvaWQpCiB7CisJLyoKKwkgKiBUaGUgQktTIG1pZ2h0IGJlIHJlYWNxdWlyZWQgYmVmb3JlIHdlIGhhdmUgZHJvcHBlZAorCSAqIFBSRUVNUFRfQUNUSVZFLCB3aGljaCBjb3VsZCB0cmlnZ2VyIGEgc2Vjb25kCisJICogY29uZF9yZXNjaGVkKCkgY2FsbC4KKwkgKi8KKwlpZiAodW5saWtlbHkocHJlZW1wdF9jb3VudCgpKSkKKwkJcmV0dXJuOwogCWRvIHsKIAkJYWRkX3ByZWVtcHRfY291bnQoUFJFRU1QVF9BQ1RJVkUpOwogCQlzY2hlZHVsZSgpOwpAQCAtNDE3NCw2ICs0MTczLDE0IEBACiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogfQogCisvKioKKyAqIGluaXRfaWRsZSAtIHNldCB1cCBhbiBpZGxlIHRocmVhZCBmb3IgYSBnaXZlbiBDUFUKKyAqIEBpZGxlOiB0YXNrIGluIHF1ZXN0aW9uCisgKiBAY3B1OiBjcHUgdGhlIGlkbGUgdGFzayBiZWxvbmdzIHRvCisgKgorICogTk9URTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzZXQgdGhlIGlkbGUgdGhyZWFkJ3MgTkVFRF9SRVNDSEVECisgKiBmbGFnLCB0byBtYWtlIGJvb3RpbmcgbW9yZSByb2J1c3QuCisgKi8KIHZvaWQgX19kZXZpbml0IGluaXRfaWRsZSh0YXNrX3QgKmlkbGUsIGludCBjcHUpCiB7CiAJcnVucXVldWVfdCAqcnEgPSBjcHVfcnEoY3B1KTsKQEAgLTQxOTEsNyArNDE5OCw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXKQogCWlkbGUtPm9uY3B1ID0gMTsKICNlbmRpZgotCXNldF90c2tfbmVlZF9yZXNjaGVkKGlkbGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBTZXQgdGhlIHByZWVtcHQgY291bnQgX291dHNpZGVfIHRoZSBzcGlubG9ja3MhICovCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggMjkxOTZjZS4uNDJiNDBhZSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtODAsNiArODAsOSBAQAogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfa2V5Y3RsKTsKIGNvbmRfc3lzY2FsbChjb21wYXRfc3lzX3NvY2tldGNhbGwpOwogY29uZF9zeXNjYWxsKHN5c19zZXRfem9uZV9yZWNsYWltKTsKK2NvbmRfc3lzY2FsbChzeXNfaW5vdGlmeV9pbml0KTsKK2NvbmRfc3lzY2FsbChzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpOworY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X3JtX3dhdGNoKTsKIAogLyogYXJjaC1zcGVjaWZpYyB3ZWFrIHN5c2NhbGwgZW50cmllcyAqLwogY29uZF9zeXNjYWxsKHN5c19wY2ljb25maWdfcmVhZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggMjcwZWU3Zi4uZTYwYjljMyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMTQ2LDYgKzE0Niw5IEBACiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCiBleHRlcm4gY3RsX3RhYmxlIHB0eV90YWJsZVtdOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKK2V4dGVybiBjdGxfdGFibGUgaW5vdGlmeV90YWJsZVtdOworI2VuZGlmCiAKICNpZmRlZiBIQVZFX0FSQ0hfUElDS19NTUFQX0xBWU9VVAogaW50IHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OwpAQCAtMjE4LDYgKzIyMSw3IEBACiAJCS5tb2RlCQk9IDA1NTUsCiAJCS5jaGlsZAkJPSBkZXZfdGFibGUsCiAJfSwKKwogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCkBAIC05NTAsNiArOTU0LDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAorI2lmZGVmIENPTkZJR19JTk9USUZZCisJeworCQkuY3RsX25hbWUJPSBGU19JTk9USUZZLAorCQkucHJvY25hbWUJPSAiaW5vdGlmeSIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpbm90aWZ5X3RhYmxlLAorCX0sCisjZW5kaWYJCiAjZW5kaWYKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU0VUVUlEX0RVTVBBQkxFLApAQCAtOTY4LDcgKzk4MCw3IEBACiAKIHN0YXRpYyBjdGxfdGFibGUgZGV2X3RhYmxlW10gPSB7CiAJeyAuY3RsX25hbWUgPSAwIH0KLX07ICAKK307CiAKIGV4dGVybiB2b2lkIGluaXRfaXJxX3Byb2MgKHZvaWQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuYwppbmRleCA3MzQ1NzVkLi44OWU1NjJmIDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCisrKyBiL2tlcm5lbC91c2VyLmMKQEAgLTEyMCw2ICsxMjAsMTAgQEAKIAkJYXRvbWljX3NldCgmbmV3LT5wcm9jZXNzZXMsIDApOwogCQlhdG9taWNfc2V0KCZuZXctPmZpbGVzLCAwKTsKIAkJYXRvbWljX3NldCgmbmV3LT5zaWdwZW5kaW5nLCAwKTsKKyNpZmRlZiBDT05GSUdfSU5PVElGWQorCQlhdG9taWNfc2V0KCZuZXctPmlub3RpZnlfd2F0Y2hlcywgMCk7CisJCWF0b21pY19zZXQoJm5ldy0+aW5vdGlmeV9kZXZzLCAwKTsKKyNlbmRpZgogCiAJCW5ldy0+bXFfYnl0ZXMgPSAwOwogCQluZXctPmxvY2tlZF9zaG0gPSAwOwpkaWZmIC0tZ2l0IGEvbGliL3JhZGl4LXRyZWUuYyBiL2xpYi9yYWRpeC10cmVlLmMKaW5kZXggMDRkNjY0My4uMTBiZWQxYyAxMDA2NDQKLS0tIGEvbGliL3JhZGl4LXRyZWUuYworKysgYi9saWIvcmFkaXgtdHJlZS5jCkBAIC01OCw3ICs1OCw3IEBACiAjZGVmaW5lIFJBRElYX1RSRUVfSU5ERVhfQklUUyAgKDggLyogQ0hBUl9CSVQgKi8gKiBzaXplb2YodW5zaWduZWQgbG9uZykpCiAjZGVmaW5lIFJBRElYX1RSRUVfTUFYX1BBVEggKFJBRElYX1RSRUVfSU5ERVhfQklUUy9SQURJWF9UUkVFX01BUF9TSElGVCArIDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhlaWdodF90b19tYXhpbmRleFtSQURJWF9UUkVFX01BWF9QQVRIXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhlaWdodF90b19tYXhpbmRleFtSQURJWF9UUkVFX01BWF9QQVRIXSBfX3JlYWRfbW9zdGx5OwogCiAvKgogICogUmFkaXggdHJlZSBub2RlIGNhY2hlLgpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggM2I2ZTM4NC4uOGMxOTlmNSAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC02OCwxMyArNjgsMTIgQEAKIAkJaWYgKHVubGlrZWx5KElTX0VSUihwYWdlKSkpIHsKIAkJCWlmIChQVFJfRVJSKHBhZ2UpID09IC1FTk9EQVRBKSB7CiAJCQkJLyogc3BhcnNlICovCi0JCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpOworCQkJCXBhZ2UgPSBaRVJPX1BBR0UoMCk7CiAJCQl9IGVsc2UgewogCQkJCWRlc2MtPmVycm9yID0gUFRSX0VSUihwYWdlKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlCi0JCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJCX0KIAogCQkvKiBJZiB1c2VycyBjYW4gYmUgd3JpdGluZyB0byB0aGlzIHBhZ2UgdXNpbmcgYXJiaXRyYXJ5CiAJCSAqIHZpcnR1YWwgYWRkcmVzc2VzLCB0YWtlIGNhcmUgYWJvdXQgcG90ZW50aWFsIGFsaWFzaW5nCkBAIC04NCw4ICs4Myw3IEBACiAJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAogCQkvKgotCQkgKiBPaywgd2UgaGF2ZSB0aGUgcGFnZSwgYW5kIGl0J3MgdXAtdG8tZGF0ZSwgc28KLQkJICogbm93IHdlIGNhbiBjb3B5IGl0IHRvIHVzZXIgc3BhY2UuLi4KKwkJICogT2ssIHdlIGhhdmUgdGhlIHBhZ2UsIHNvIG5vdyB3ZSBjYW4gY29weSBpdCB0byB1c2VyIHNwYWNlLi4uCiAJCSAqCiAJCSAqIFRoZSBhY3RvciByb3V0aW5lIHJldHVybnMgaG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSB1c2VkLi4KIAkJICogTk9URSEgVGhpcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIGhvdyBtdWNoIG9mIGEgdXNlciBidWZmZXIKQEAgLTE2NCw3ICsxNjIsNyBAQAogICogeGlwX3dyaXRlCiAgKgogICogVGhpcyBmdW5jdGlvbiB3YWxrcyBhbGwgdm1hcyBvZiB0aGUgYWRkcmVzc19zcGFjZSBhbmQgdW5tYXBzIHRoZQotICogZW1wdHlfemVyb19wYWdlIHdoZW4gZm91bmQgYXQgcGdvZmYuIFNob3VsZCBpdCBnbyBpbiBybWFwLmM/CisgKiBaRVJPX1BBR0Ugd2hlbiBmb3VuZCBhdCBwZ29mZi4gU2hvdWxkIGl0IGdvIGluIHJtYXAuYz8KICAqLwogc3RhdGljIHZvaWQKIF9feGlwX3VubWFwIChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcsCkBAIC0xODcsMTEgKzE4NSwxMSBAQAogCQkgKiBXZSBuZWVkIHRoZSBwYWdlX3RhYmxlX2xvY2sgdG8gcHJvdGVjdCB1cyBmcm9tIHBhZ2UgZmF1bHRzLAogCQkgKiBtdW5tYXAsIGZvcmssIGV0Yy4uLgogCQkgKi8KLQkJcHRlID0gcGFnZV9jaGVja19hZGRyZXNzKHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpLCBtbSwKKwkJcHRlID0gcGFnZV9jaGVja19hZGRyZXNzKFpFUk9fUEFHRShhZGRyZXNzKSwgbW0sCiAJCQkJCSBhZGRyZXNzKTsKIAkJaWYgKCFJU19FUlIocHRlKSkgewogCQkJLyogTnVrZSB0aGUgcGFnZSB0YWJsZSBlbnRyeS4gKi8KLQkJCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwdGVfcGZuKHB0ZSkpOworCQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4oKnB0ZSkpOwogCQkJcHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB0ZSk7CiAJCQlCVUdfT04ocHRlX2RpcnR5KHB0ZXZhbCkpOwogCQkJcHRlX3VubWFwKHB0ZSk7CkBAIC0yMzAsNyArMjI4LDYgQEAKIAogCXBhZ2UgPSBtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKG1hcHBpbmcsIHBnb2ZmKihQQUdFX1NJWkUvNTEyKSwgMCk7CiAJaWYgKCFJU19FUlIocGFnZSkpIHsKLQkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOwogCQlyZXR1cm4gcGFnZTsKIAl9CiAJaWYgKFBUUl9FUlIocGFnZSkgIT0gLUVOT0RBVEEpCkBAIC0yNDUsMTIgKzI0MiwxMSBAQAogCQkJcGdvZmYqKFBBR0VfU0laRS81MTIpLCAxKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCXJldHVybiBOVUxMOwotCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJCS8qIHVubWFwIHBhZ2UgYXQgcGdvZmYgZnJvbSBhbGwgb3RoZXIgdm1hcyAqLwogCQlfX3hpcF91bm1hcChtYXBwaW5nLCBwZ29mZik7CiAJfSBlbHNlIHsKLQkJLyogbm90IHNoYXJlZCBhbmQgd3JpdGFibGUsIHVzZSBlbXB0eV96ZXJvX3BhZ2UgKi8KLQkJcGFnZSA9IHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpOworCQkvKiBub3Qgc2hhcmVkIGFuZCB3cml0YWJsZSwgdXNlIFpFUk9fUEFHRSgpICovCisJCXBhZ2UgPSBaRVJPX1BBR0UoYWRkcmVzcyk7CiAJfQogCiAJcmV0dXJuIHBhZ2U7CkBAIC0zMTksOCArMzE1LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOwotCiAJCWNvcGllZCA9IGZpbGVtYXBfY29weV9mcm9tX3VzZXIocGFnZSwgb2Zmc2V0LCBidWYsIGJ5dGVzKTsKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCWlmIChsaWtlbHkoY29waWVkID4gMCkpIHsKQEAgLTQzNSw4ICs0MjksNyBAQAogCQkJcmV0dXJuIDA7CiAJCWVsc2UKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOwotCX0gZWxzZQotCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJfQogCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgbGVuZ3RoKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CmRpZmYgLS1naXQgYS9tbS9tZW1wb29sLmMgYi9tbS9tZW1wb29sLmMKaW5kZXggOWE3MmY3ZC4uNjVmMjk1NyAxMDA2NDQKLS0tIGEvbW0vbWVtcG9vbC5jCisrKyBiL21tL21lbXBvb2wuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJdm9pZCAqZWxlbWVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXdhaXRfcXVldWVfdCB3YWl0OwotCWludCBnZnBfdGVtcDsKKwl1bnNpZ25lZCBpbnQgZ2ZwX3RlbXA7CiAKIAltaWdodF9zbGVlcF9pZihnZnBfbWFzayAmIF9fR0ZQX1dBSVQpOwogCmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCA1OTY2NmQ5Li4xZTU2MDc2IDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTI1MywxNCArMjUzLDE2IEBACiAgKiBPUiB0cnkgdG8gYmUgc21hcnQgYWJvdXQgd2hpY2ggcHJvY2VzcyB0byBraWxsLiBOb3RlIHRoYXQgd2UKICAqIGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdCBoZXJlLCB3ZSBqdXN0IGhhdmUgdG8gYmUgZ29vZC4KICAqLwotdm9pZCBvdXRfb2ZfbWVtb3J5KHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKK3ZvaWQgb3V0X29mX21lbW9yeSh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBvcmRlcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7CiAJdGFza190ICogcDsKIAotCXByaW50aygib29tLWtpbGxlcjogZ2ZwX21hc2s9MHgleFxuIiwgZ2ZwX21hc2spOwotCS8qIHByaW50IG1lbW9yeSBzdGF0cyAqLwotCXNob3dfbWVtKCk7CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQlwcmludGsoIm9vbS1raWxsZXI6IGdmcF9tYXNrPTB4JXgsIG9yZGVyPSVkXG4iLAorCQkJZ2ZwX21hc2ssIG9yZGVyKTsKKwkJc2hvd19tZW0oKTsKKwl9CiAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogcmV0cnk6CmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCA2MTNiOTlhLi5hNjMyOWZhIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogICogdGhlIHdob2xlIHdvcmxkLiAgUmV0dXJucyAwIGlmIGEgcGRmbHVzaCB0aHJlYWQgd2FzIGRpc3BhdGNoZWQuICBSZXR1cm5zCiAgKiAtMSBpZiBhbGwgcGRmbHVzaCB0aHJlYWRzIHdlcmUgYnVzeS4KICAqLwotaW50IHdha2V1cF9iZGZsdXNoKGxvbmcgbnJfcGFnZXMpCitpbnQgd2FrZXVwX3BkZmx1c2gobG9uZyBucl9wYWdlcykKIHsKIAlpZiAobnJfcGFnZXMgPT0gMCkgewogCQlzdHJ1Y3Qgd3JpdGViYWNrX3N0YXRlIHdiczsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCA3ZWU2NzVhLi4xZDZiYTZhIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC04OTcsMTIgKzg5Nyw2IEBACiAJY29uZF9yZXNjaGVkKCk7CiAKIAlpZiAobGlrZWx5KGRpZF9zb21lX3Byb2dyZXNzKSkgewotCQkvKgotCQkgKiBHbyB0aHJvdWdoIHRoZSB6b25lbGlzdCB5ZXQgb25lIG1vcmUgdGltZSwga2VlcAotCQkgKiB2ZXJ5IGhpZ2ggd2F0ZXJtYXJrIGhlcmUsIHRoaXMgaXMgb25seSB0byBjYXRjaAotCQkgKiBhIHBhcmFsbGVsIG9vbSBraWxsaW5nLCB3ZSBtdXN0IGZhaWwgaWYgd2UncmUgc3RpbGwKLQkJICogdW5kZXIgaGVhdnkgcHJlc3N1cmUuCi0JCSAqLwogCQlmb3IgKGkgPSAwOyAoeiA9IHpvbmVzW2ldKSAhPSBOVUxMOyBpKyspIHsKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2soeiwgb3JkZXIsIHotPnBhZ2VzX21pbiwKIAkJCQkJICAgICAgIGNsYXNzem9uZV9pZHgsIGNhbl90cnlfaGFyZGVyLApAQCAtOTM2LDcgKzkzMCw3IEBACiAJCQkJZ290byBnb3RfcGc7CiAJCX0KIAotCQlvdXRfb2ZfbWVtb3J5KGdmcF9tYXNrKTsKKwkJb3V0X29mX21lbW9yeShnZnBfbWFzaywgb3JkZXIpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCkBAIC0xNjY3LDkgKzE2NjEsOCBAQAogI2lmZGVmIFdBTlRfUEFHRV9WSVJUVUFMCiAJCS8qIFRoZSBzaGlmdCB3b24ndCBvdmVyZmxvdyBiZWNhdXNlIFpPTkVfTk9STUFMIGlzIGJlbG93IDRHLiAqLwogCQlpZiAoIWlzX2hpZ2htZW1faWR4KHpvbmUpKQotCQkJc2V0X3BhZ2VfYWRkcmVzcyhwYWdlLCBfX3ZhKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKSk7CisJCQlzZXRfcGFnZV9hZGRyZXNzKHBhZ2UsIF9fdmEocGZuIDw8IFBBR0VfU0hJRlQpKTsKICNlbmRpZgotCQlzdGFydF9wZm4rKzsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCAxMjJkMDMxLi5jOWU3MDZkIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC01ODQsNyArNTg0LDggQEAKIAlyZXR1cm4gY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQogCi1zdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitzdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLAorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXN0cnVjdCBjYWNoZV9zaXplcyAqY3NpemVwID0gbWFsbG9jX3NpemVzOwogCkBAIC02MDgsNyArNjA5LDggQEAKIAlyZXR1cm4gY3NpemVwLT5jc19jYWNoZXA7CiB9CiAKLWttZW1fY2FjaGVfdCAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitrbWVtX2NhY2hlX3QgKmttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplX3Qgc2l6ZSwKKwkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXJldHVybiBfX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZ2ZwZmxhZ3MpOwogfQpAQCAtMjEwMCw3ICsyMTAyLDcgQEAKICNpZiBERUJVRwogc3RhdGljIHZvaWQgKgogY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihrbWVtX2NhY2hlX3QgKmNhY2hlcCwKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKm9ianAsIHZvaWQgKmNhbGxlcikKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgdm9pZCAqb2JqcCwgdm9pZCAqY2FsbGVyKQogewogCWlmICghb2JqcCkJCiAJCXJldHVybiBvYmpwOwpAQCAtMjM3Miw2ICsyMzc0LDkgQEAKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJa21lbV9idWZjdGxfdCBuZXh0OwogCisJaWYgKG5vZGVpZCA9PSAtMSkKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisKIAlmb3IgKGxvb3AgPSAwOztsb29wKyspIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcTsKIApAQCAtMjQzOSw3ICsyNDQ0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAotdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIGludCBub2RlKQordm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKQogewogCWttZW1fY2FjaGVfdCAqY2FjaGVwOwogCkBAIC0zMDkxLDcgKzMwOTYsNyBAQAogICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCiAgKiBAZ2ZwOiB0aGUgR0ZQIG1hc2sgdXNlZCBpbiB0aGUga21hbGxvYygpIGNhbGwgd2hlbiBhbGxvY2F0aW5nIG1lbW9yeQogICovCi1jaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGludCBnZnApCitjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc2l6ZV90IGxlbjsKIAljaGFyICpidWY7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDFmYTMxMmEuLmNmZmZlNTAgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC05NzIsNyArOTcyLDcgQEAKIAkJICogd3JpdGVvdXQuICBTbyBpbiBsYXB0b3AgbW9kZSwgd3JpdGUgb3V0IHRoZSB3aG9sZSB3b3JsZC4KIAkJICovCiAJCWlmICh0b3RhbF9zY2FubmVkID4gc2Muc3dhcF9jbHVzdGVyX21heCArIHNjLnN3YXBfY2x1c3Rlcl9tYXgvMikgewotCQkJd2FrZXVwX2JkZmx1c2gobGFwdG9wX21vZGUgPyAwIDogdG90YWxfc2Nhbm5lZCk7CisJCQl3YWtldXBfcGRmbHVzaChsYXB0b3BfbW9kZSA/IDAgOiB0b3RhbF9zY2FubmVkKTsKIAkJCXNjLm1heV93cml0ZXBhZ2UgPSAxOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC84MDIvZmRkaS5jIGIvbmV0LzgwMi9mZGRpLmMKaW5kZXggZWJjZjQ4My4uNWNlMjRjNCAxMDA2NDQKLS0tIGEvbmV0LzgwMi9mZGRpLmMKKysrIGIvbmV0LzgwMi9mZGRpLmMKQEAgLTEyMiwxMCArMTIyLDEwIEBACiAgKiB0aGUgcHJvcGVyIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHBhY2tldCBkYXRhIChza2ItPmRhdGEpLgogICovCiAgCi11bnNpZ25lZCBzaG9ydCBmZGRpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK19fYmUxNiBmZGRpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmRkaWhkciAqZmRkaSA9IChzdHJ1Y3QgZmRkaWhkciAqKXNrYi0+ZGF0YTsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlOworCV9fYmUxNiB0eXBlOwogCQogCS8qCiAJICogU2V0IG1hYy5yYXcgZmllbGQgdG8gcG9pbnQgdG8gRkMgYnl0ZSwgc2V0IGRhdGEgZmllbGQgdG8gcG9pbnQKZGlmZiAtLWdpdCBhL25ldC84MDIxcS9LY29uZmlnIGIvbmV0LzgwMjFxL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhMzgyZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIxcS9LY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKKyMKKyMgQ29uZmlndXJhdGlvbiBmb3IgODAyLjFRIFZMQU4gc3VwcG9ydAorIworCitjb25maWcgVkxBTl84MDIxUQorCXRyaXN0YXRlICI4MDIuMVEgVkxBTiBTdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNyZWF0ZSA4MDIuMVEgVkxBTiBpbnRlcmZhY2VzCisJICBvbiB5b3VyIGV0aGVybmV0IGludGVyZmFjZXMuICA4MDIuMVEgVkxBTiBzdXBwb3J0cyBhbG1vc3QKKwkgIGV2ZXJ5dGhpbmcgYSByZWd1bGFyIGV0aGVybmV0IGludGVyZmFjZSBkb2VzLCBpbmNsdWRpbmcKKwkgIGZpcmV3YWxsaW5nLCBicmlkZ2luZywgYW5kIG9mIGNvdXJzZSBJUCB0cmFmZmljLiAgWW91IHdpbGwgbmVlZAorCSAgdGhlICd2Y29uZmlnJyB0b29sIGZyb20gdGhlIFZMQU4gcHJvamVjdCBpbiBvcmRlciB0byBlZmZlY3RpdmVseQorCSAgdXNlIFZMQU5zLiAgU2VlIHRoZSBWTEFOIHdlYiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uOgorCSAgPGh0dHA6Ly93d3cuY2FuZGVsYXRlY2guY29tL35ncmVlYXIvdmxhbi5odG1sPgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODAyMXEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5jIGIvbmV0LzgwMjFxL3ZsYW4uYwppbmRleCAxZjZkMzE2Li45MWU0MTJiIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5jCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTU3OCw2ICs1NzgsMTQgQEAKIAkJCWlmICghdmxhbmRldikKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJCWlmICghbmV0aWZfY2Fycmllcl9vayh2bGFuZGV2KSkKKwkJCQkJbmV0aWZfY2Fycmllcl9vbih2bGFuZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sodmxhbmRldikpCisJCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHZsYW5kZXYpOworCQkJfQorCiAJCQlpZiAoKHZsYW5kZXYtPnN0YXRlICYgVkxBTl9MSU5LX1NUQVRFX01BU0spICE9IGZsZ3MpIHsKIAkJCQl2bGFuZGV2LT5zdGF0ZSA9ICh2bGFuZGV2LT5zdGF0ZSAmfiBWTEFOX0xJTktfU1RBVEVfTUFTSykgCiAJCQkJCXwgZmxnczsKZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKaW5kZXggOTI1MWIyOC4uNDBhMzFiYTggMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0yLDcgKzIsNyBAQAogIyBOZXR3b3JrIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiTmV0d29ya2luZyBzdXBwb3J0IgorbWVudSAiTmV0d29ya2luZyIKIAogY29uZmlnIE5FVAogCWJvb2wgIk5ldHdvcmtpbmcgc3VwcG9ydCIKQEAgLTEwLDcgKzEwLDkgQEAKIAkgIFVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUuCiAJICBUaGUgcmVhc29uIGlzIHRoYXQgc29tZSBwcm9ncmFtcyBuZWVkIGtlcm5lbCBuZXR3b3JraW5nIHN1cHBvcnQgZXZlbgogCSAgd2hlbiBydW5uaW5nIG9uIGEgc3RhbmQtYWxvbmUgbWFjaGluZSB0aGF0IGlzbid0IGNvbm5lY3RlZCB0byBhbnkKLQkgIG90aGVyIGNvbXB1dGVyLiBJZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIG9sZGVyIGtlcm5lbCwgeW91CisJICBvdGhlciBjb21wdXRlci4KKwkgIAorCSAgSWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBvbGRlciBrZXJuZWwsIHlvdQogCSAgc2hvdWxkIGNvbnNpZGVyIHVwZGF0aW5nIHlvdXIgbmV0d29ya2luZyB0b29scyB0b28gYmVjYXVzZSBjaGFuZ2VzCiAJICBpbiB0aGUga2VybmVsIGFuZCB0aGUgdG9vbHMgb2Z0ZW4gZ28gaGFuZCBpbiBoYW5kLiBUaGUgdG9vbHMgYXJlCiAJICBjb250YWluZWQgaW4gdGhlIHBhY2thZ2UgbmV0LXRvb2xzLCB0aGUgbG9jYXRpb24gYW5kIHZlcnNpb24gbnVtYmVyCkBAIC0yMCw1NyArMjIsMTQgQEAKIAkgIHJlY29tbWVuZGVkIHRvIHJlYWQgdGhlIE5FVC1IT1dUTywgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCiAKKyMgTWFrZSBzdXJlIHRoYXQgYWxsIGNvbmZpZyBzeW1ib2xzIGFyZSBkZXBlbmRlbnQgb24gTkVUCitpZiBORVQKKwogbWVudSAiTmV0d29ya2luZyBvcHRpb25zIgotCWRlcGVuZHMgb24gTkVUCiAKLWNvbmZpZyBQQUNLRVQKLQl0cmlzdGF0ZSAiUGFja2V0IHNvY2tldCIKLQktLS1oZWxwLS0tCi0JICBUaGUgUGFja2V0IHByb3RvY29sIGlzIHVzZWQgYnkgYXBwbGljYXRpb25zIHdoaWNoIGNvbW11bmljYXRlCi0JICBkaXJlY3RseSB3aXRoIG5ldHdvcmsgZGV2aWNlcyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBuZXR3b3JrCi0JICBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCBlLmcuIHRjcGR1bXAuICBJZiB5b3Ugd2FudCB0aGVtCi0JICB0byB3b3JrLCBjaG9vc2UgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYWZfcGFja2V0LgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgUEFDS0VUX01NQVAKLQlib29sICJQYWNrZXQgc29ja2V0OiBtbWFwcGVkIElPIgotCWRlcGVuZHMgb24gUEFDS0VUCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBQYWNrZXQgcHJvdG9jb2wgZHJpdmVyIHdpbGwgdXNlIGFuIElPCi0JICBtZWNoYW5pc20gdGhhdCByZXN1bHRzIGluIGZhc3RlciBjb21tdW5pY2F0aW9uLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgVU5JWAotCXRyaXN0YXRlICJVbml4IGRvbWFpbiBzb2NrZXRzIgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIFVuaXggZG9tYWluIHNvY2tldHM7Ci0JICBzb2NrZXRzIGFyZSB0aGUgc3RhbmRhcmQgVW5peCBtZWNoYW5pc20gZm9yIGVzdGFibGlzaGluZyBhbmQKLQkgIGFjY2Vzc2luZyBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgTWFueSBjb21tb25seSB1c2VkIHByb2dyYW1zIHN1Y2ggYXMKLQkgIHRoZSBYIFdpbmRvdyBzeXN0ZW0gYW5kIHN5c2xvZyB1c2UgdGhlc2Ugc29ja2V0cyBldmVuIGlmIHlvdXIKLQkgIG1hY2hpbmUgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgbmV0d29yay4gIFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgb24KLQkgIGFuIGVtYmVkZGVkIHN5c3RlbSBvciBzb21ldGhpbmcgc2ltaWxhciwgeW91IHRoZXJlZm9yZSBkZWZpbml0ZWx5Ci0JICB3YW50IHRvIHNheSBZIGhlcmUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHVuaXguICBOb3RlIHRoYXQgc2V2ZXJhbCBpbXBvcnRhbnQgc2VydmljZXMgd29uJ3Qgd29yawotCSAgY29ycmVjdGx5IGlmIHlvdSBzYXkgTSBoZXJlIGFuZCB0aGVuIG5lZ2xlY3QgdG8gbG9hZCB0aGUgbW9kdWxlLgotCi0JICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotCi1jb25maWcgTkVUX0tFWQotCXRyaXN0YXRlICJQRl9LRVkgc29ja2V0cyIKLQlzZWxlY3QgWEZSTQotCS0tLWhlbHAtLS0KLQkgIFBGX0tFWXYyIHNvY2tldCBmYW1pbHksIGNvbXBhdGlibGUgdG8gS0FNRSBvbmVzLgotCSAgVGhleSBhcmUgcmVxdWlyZWQgaWYgeW91IGFyZSBnb2luZyB0byB1c2UgSVBzZWMgdG9vbHMgcG9ydGVkCi0JICBmcm9tIEtBTUUuCi0KLQkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCitzb3VyY2UgIm5ldC9wYWNrZXQvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3VuaXgvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3hmcm0vS2NvbmZpZyIKIAogY29uZmlnIElORVQKIAlib29sICJUQ1AvSVAgbmV0d29ya2luZyIKQEAgLTk0LDMwICs1MywxMiBAQAogCiAJICBTaG9ydCBhbnN3ZXI6IHNheSBZLgogCitpZiBJTkVUCiBzb3VyY2UgIm5ldC9pcHY0L0tjb25maWciCi0KLSMgICBJUHY2IGFzIG1vZHVsZSB3aWxsIGNhdXNlIGEgQ1JBU0ggaWYgeW91IHRyeSB0byB1bmxvYWQgaXQKLWNvbmZpZyBJUFY2Ci0JdHJpc3RhdGUgIlRoZSBJUHY2IHByb3RvY29sIgotCWRlcGVuZHMgb24gSU5FVAotCWRlZmF1bHQgbQotCXNlbGVjdCBDUllQVE8gaWYgSVBWNl9QUklWQUNZCi0Jc2VsZWN0IENSWVBUT19NRDUgaWYgSVBWNl9QUklWQUNZCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBjb21wbGVtZW50YWwgc3VwcG9ydCBmb3IgdGhlIElQIHZlcnNpb24gNi4KLQkgIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZG8gdHJhZGl0aW9uYWwgSVB2NCBuZXR3b3JraW5nIGFzIHdlbGwuCi0KLQkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IElQdjYsIHNlZQotCSAgPGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vcHViL2lwbmcvaHRtbC9pcG5nLW1haW4uaHRtbD4uCi0JICBGb3IgTGludXggSVB2NiBkZXZlbG9wbWVudCBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPi4KLQkgIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBJUHY2IHVuZGVyIExpbnV4LCByZWFkIHRoZSBIT1dUTyBhdAotCSAgPGh0dHA6Ly93d3cuYmllcmluZ2VyLmRlL2xpbnV4L0lQdjYvPi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIHByb3RvY29sIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSAKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHY2LgotCiBzb3VyY2UgIm5ldC9pcHY2L0tjb25maWciCiAKK2VuZGlmICMgaWYgSU5FVAorCiBtZW51Y29uZmlnIE5FVEZJTFRFUgogCWJvb2wgIk5ldHdvcmsgcGFja2V0IGZpbHRlcmluZyAocmVwbGFjZXMgaXBjaGFpbnMpIgogCS0tLWhlbHAtLS0KQEAgLTIwNiwyNjkgKzE0NywxNiBAQAogCiBlbmRpZgogCi1jb25maWcgWEZSTQotICAgICAgIGJvb2wKLSAgICAgICBkZXBlbmRzIG9uIE5FVAotCi1zb3VyY2UgIm5ldC94ZnJtL0tjb25maWciCi0KIHNvdXJjZSAibmV0L3NjdHAvS2NvbmZpZyIKLQotY29uZmlnIEFUTQotCXRyaXN0YXRlICJBc3luY2hyb25vdXMgVHJhbnNmZXIgTW9kZSAoQVRNKSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIEFUTSBpcyBhIGhpZ2gtc3BlZWQgbmV0d29ya2luZyB0ZWNobm9sb2d5IGZvciBMb2NhbCBBcmVhIE5ldHdvcmtzCi0JICBhbmQgV2lkZSBBcmVhIE5ldHdvcmtzLiAgSXQgdXNlcyBhIGZpeGVkIHBhY2tldCBzaXplIGFuZCBpcwotCSAgY29ubmVjdGlvbiBvcmllbnRlZCwgYWxsb3dpbmcgZm9yIHRoZSBuZWdvdGlhdGlvbiBvZiBtaW5pbXVtCi0JICBiYW5kd2lkdGggcmVxdWlyZW1lbnRzLgotCi0JICBJbiBvcmRlciB0byBwYXJ0aWNpcGF0ZSBpbiBhbiBBVE0gbmV0d29yaywgeW91ciBMaW51eCBib3ggbmVlZHMgYW4KLQkgIEFUTSBuZXR3b3JraW5nIGNhcmQuIElmIHlvdSBoYXZlIHRoYXQsIHNheSBZIGhlcmUgYW5kIHRvIHRoZSBkcml2ZXIKLQkgIG9mIHlvdXIgQVRNIGNhcmQgYmVsb3cuCi0KLQkgIE5vdGUgdGhhdCB5b3UgbmVlZCBhIHNldCBvZiB1c2VyLXNwYWNlIHByb2dyYW1zIHRvIGFjdHVhbGx5IG1ha2UgdXNlCi0JICBvZiBBVE0uICBTZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2F0bS50eHQ+IGZvcgotCSAgZnVydGhlciBkZXRhaWxzLgotCi1jb25maWcgQVRNX0NMSVAKLQl0cmlzdGF0ZSAiQ2xhc3NpY2FsIElQIG92ZXIgQVRNIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQVRNICYmIElORVQKLQloZWxwCi0JICBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gZm9yIFBWQ3MgYW5kIFNWQ3MsIHN1cHBvcnRpbmcgSW5BUlAgYW5kCi0JICBBVE1BUlAuIElmIHlvdSB3YW50IHRvIGNvbW11bmljYXRpb24gd2l0aCBvdGhlciBJUCBob3N0cyBvbiB5b3VyIEFUTQotCSAgbmV0d29yaywgeW91IHdpbGwgdHlwaWNhbGx5IGVpdGhlciBzYXkgWSBoZXJlIG9yIHRvICJMQU4gRW11bGF0aW9uCi0JICAoTEFORSkiIGJlbG93LgotCi1jb25maWcgQVRNX0NMSVBfTk9fSUNNUAotCWJvb2wgIkRvIE5PVCBzZW5kIElDTVAgaWYgbm8gbmVpZ2hib3VyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQVRNX0NMSVAKLQloZWxwCi0JICBOb3JtYWxseSwgYW4gIklDTVAgaG9zdCB1bnJlYWNoYWJsZSIgbWVzc2FnZSBpcyBzZW50IGlmIGEgbmVpZ2hib3VyCi0JICBjYW5ub3QgYmUgcmVhY2hlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIFZDIHRvIGl0IGluIHRoZSBrZXJuZWwncwotCSAgQVRNQVJQIHRhYmxlLiBUaGlzIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIEFUTUFSUCB0YWJsZSBlbnRyaWVzIGFyZQotCSAgYnJpZWZseSByZW1vdmVkIGR1cmluZyByZXZhbGlkYXRpb24uIElmIHlvdSBzYXkgWSBoZXJlLCBwYWNrZXRzIHRvCi0JICBzdWNoIG5laWdoYm91cnMgYXJlIHNpbGVudGx5IGRpc2NhcmRlZCBpbnN0ZWFkLgotCi1jb25maWcgQVRNX0xBTkUKLQl0cmlzdGF0ZSAiTEFOIEVtdWxhdGlvbiAoTEFORSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEFUTQotCWhlbHAKLQkgIExBTiBFbXVsYXRpb24gZW11bGF0ZXMgc2VydmljZXMgb2YgZXhpc3RpbmcgTEFOcyBhY3Jvc3MgYW4gQVRNCi0JICBuZXR3b3JrLiBCZXNpZGVzIG9wZXJhdGluZyBhcyBhIG5vcm1hbCBBVE0gZW5kIHN0YXRpb24gY2xpZW50LCBMaW51eAotCSAgTEFORSBjbGllbnQgY2FuIGFsc28gYWN0IGFzIGFuIHByb3h5IGNsaWVudCBicmlkZ2luZyBwYWNrZXRzIGJldHdlZW4KLQkgIEVMQU4gYW5kIEV0aGVybmV0IHNlZ21lbnRzLiBZb3UgbmVlZCBMQU5FIGlmIHlvdSB3YW50IHRvIHRyeSBNUE9BLgotCi1jb25maWcgQVRNX01QT0EKLQl0cmlzdGF0ZSAiTXVsdGktUHJvdG9jb2wgT3ZlciBBVE0gKE1QT0EpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBBVE0gJiYgSU5FVCAmJiBBVE1fTEFORSE9bgotCWhlbHAKLQkgIE11bHRpLVByb3RvY29sIE92ZXIgQVRNIGFsbG93cyBBVE0gZWRnZSBkZXZpY2VzIHN1Y2ggYXMgcm91dGVycywKLQkgIGJyaWRnZXMgYW5kIEFUTSBhdHRhY2hlZCBob3N0cyBlc3RhYmxpc2ggZGlyZWN0IEFUTSBWQ3MgYWNyb3NzCi0JICBzdWJuZXR3b3JrIGJvdW5kYXJpZXMuIFRoZXNlIHNob3J0Y3V0IGNvbm5lY3Rpb25zIGJ5cGFzcyByb3V0ZXJzCi0JICBlbmhhbmNpbmcgb3ZlcmFsbCBuZXR3b3JrIHBlcmZvcm1hbmNlLgotCi1jb25maWcgQVRNX0JSMjY4NAotCXRyaXN0YXRlICJSRkMxNDgzLzI2ODQgQnJpZGdlZCBwcm90b2NvbHMiCi0JZGVwZW5kcyBvbiBBVE0gJiYgSU5FVAotCWhlbHAKLQkgIEFUTSBQVkNzIGNhbiBjYXJyeSBldGhlcm5ldCBQRFVzIGFjY29yZGluZyB0byByZmMyNjg0IChmb3JtZXJseSAxNDgzKQotCSAgVGhpcyBkZXZpY2Ugd2lsbCBhY3QgbGlrZSBhbiBldGhlcm5ldCBmcm9tIHRoZSBrZXJuZWxzIHBvaW50IG9mIHZpZXcsCi0JICB3aXRoIHRoZSB0cmFmZmljIGJlaW5nIGNhcnJpZWQgYnkgQVRNIFBWQ3MgKGN1cnJlbnRseSAxIFBWQy9kZXZpY2UpLgotCSAgVGhpcyBpcyBzb21ldGltZXMgdXNlZCBvdmVyIERTTCBsaW5lcy4gIElmIGluIGRvdWJ0LCBzYXkgTi4KLQotY29uZmlnIEFUTV9CUjI2ODRfSVBGSUxURVIKLQlib29sICJQZXItVkMgSVAgZmlsdGVyIGtsdWRnZSIKLQlkZXBlbmRzIG9uIEFUTV9CUjI2ODQKLQloZWxwCi0JICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBtZWNoYW5pc20gZm9yIHVzZXJzIHdobyBuZWVkIHRvIHRlcm1pbmF0aW5nIGEKLQkgIGxhcmdlIG51bWJlciBvZiBJUC1vbmx5IHZjYydzLiAgRG8gbm90IGVuYWJsZSB0aGlzIHVubGVzcyB5b3UgYXJlIHN1cmUKLQkgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQotY29uZmlnIEJSSURHRQotCXRyaXN0YXRlICI4MDIuMWQgRXRoZXJuZXQgQnJpZGdpbmciCi0JLS0taGVscC0tLQotCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4geW91ciBMaW51eCBib3ggd2lsbCBiZSBhYmxlIHRvIGFjdCBhcyBhbgotCSAgRXRoZXJuZXQgYnJpZGdlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBkaWZmZXJlbnQgRXRoZXJuZXQgc2VnbWVudHMgaXQKLQkgIGlzIGNvbm5lY3RlZCB0byB3aWxsIGFwcGVhciBhcyBvbmUgRXRoZXJuZXQgdG8gdGhlIHBhcnRpY2lwYW50cy4KLQkgIFNldmVyYWwgc3VjaCBicmlkZ2VzIGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGNyZWF0ZSBldmVuIGxhcmdlcgotCSAgbmV0d29ya3Mgb2YgRXRoZXJuZXRzIHVzaW5nIHRoZSBJRUVFIDgwMi4xIHNwYW5uaW5nIHRyZWUgYWxnb3JpdGhtLgotCSAgQXMgdGhpcyBpcyBhIHN0YW5kYXJkLCBMaW51eCBicmlkZ2VzIHdpbGwgY29vcGVyYXRlIHByb3Blcmx5IHdpdGgKLQkgIG90aGVyIHRoaXJkIHBhcnR5IGJyaWRnZSBwcm9kdWN0cy4KLQotCSAgSW4gb3JkZXIgdG8gdXNlIHRoZSBFdGhlcm5ldCBicmlkZ2UsIHlvdSdsbCBuZWVkIHRoZSBicmlkZ2UKLQkgIGNvbmZpZ3VyYXRpb24gdG9vbHM7IHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYnJpZGdlLnR4dD4KLQkgIGZvciBsb2NhdGlvbi4gUGxlYXNlIHJlYWQgdGhlIEJyaWRnZSBtaW5pLUhPV1RPIGZvciBtb3JlCi0JICBpbmZvcm1hdGlvbi4KLQotCSAgSWYgeW91IGVuYWJsZSBpcHRhYmxlcyBzdXBwb3J0IGFsb25nIHdpdGggdGhlIGJyaWRnZSBzdXBwb3J0IHRoZW4geW91Ci0JICB0dXJuIHlvdXIgYnJpZGdlIGludG8gYSBicmlkZ2luZyBJUCBmaXJld2FsbC4KLQkgIGlwdGFibGVzIHdpbGwgdGhlbiBzZWUgdGhlIElQIHBhY2tldHMgYmVpbmcgYnJpZGdlZCwgc28geW91IG5lZWQgdG8KLQkgIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nIHVwIHlvdXIgZmlyZXdhbGwgcnVsZXMuCi0JICBFbmFibGluZyBhcnB0YWJsZXMgc3VwcG9ydCB3aGVuIGJyaWRnaW5nIHdpbGwgbGV0IGFycHRhYmxlcyBzZWUKLQkgIGJyaWRnZWQgQVJQIHRyYWZmaWMgaW4gdGhlIGFycHRhYmxlcyBGT1JXQVJEIGNoYWluLgotCi0JICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYnJpZGdlLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgVkxBTl84MDIxUQotCXRyaXN0YXRlICI4MDIuMVEgVkxBTiBTdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIFNlbGVjdCB0aGlzIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNyZWF0ZSA4MDIuMVEgVkxBTiBpbnRlcmZhY2VzCi0JICBvbiB5b3VyIGV0aGVybmV0IGludGVyZmFjZXMuICA4MDIuMVEgVkxBTiBzdXBwb3J0cyBhbG1vc3QKLQkgIGV2ZXJ5dGhpbmcgYSByZWd1bGFyIGV0aGVybmV0IGludGVyZmFjZSBkb2VzLCBpbmNsdWRpbmcKLQkgIGZpcmV3YWxsaW5nLCBicmlkZ2luZywgYW5kIG9mIGNvdXJzZSBJUCB0cmFmZmljLiAgWW91IHdpbGwgbmVlZAotCSAgdGhlICd2Y29uZmlnJyB0b29sIGZyb20gdGhlIFZMQU4gcHJvamVjdCBpbiBvcmRlciB0byBlZmZlY3RpdmVseQotCSAgdXNlIFZMQU5zLiAgU2VlIHRoZSBWTEFOIHdlYiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uOgotCSAgPGh0dHA6Ly93d3cuY2FuZGVsYXRlY2guY29tL35ncmVlYXIvdmxhbi5odG1sPgotCi0JICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgODAyMXEuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBERUNORVQKLQl0cmlzdGF0ZSAiREVDbmV0IFN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhlIERFQ25ldCBuZXR3b3JraW5nIHByb3RvY29sIHdhcyB1c2VkIGluIG1hbnkgcHJvZHVjdHMgbWFkZSBieQotCSAgRGlnaXRhbCAobm93IENvbXBhcSkuICBJdCBwcm92aWRlcyByZWxpYWJsZSBzdHJlYW0gYW5kIHNlcXVlbmNlZAotCSAgcGFja2V0IGNvbW11bmljYXRpb25zIG92ZXIgd2hpY2ggcnVuIGEgdmFyaWV0eSBvZiBzZXJ2aWNlcyBzaW1pbGFyCi0JICB0byB0aG9zZSB3aGljaCBydW4gb3ZlciBUQ1AvSVAuCi0KLQkgIFRvIGZpbmQgc29tZSB0b29scyB0byB1c2Ugd2l0aCB0aGUga2VybmVsIGxheWVyIHN1cHBvcnQsIHBsZWFzZQotCSAgbG9vayBhdCBQYXRyaWNrIENhdWxmaWVsZCdzIHdlYiBzaXRlOgotCSAgPGh0dHA6Ly9saW51eC1kZWNuZXQuc291cmNlZm9yZ2UubmV0Lz4uCi0KLQkgIE1vcmUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4KLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0Pi4KLQotCSAgQmUgc3VyZSB0byBzYXkgWSB0byAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgYW5kICJTeXNjdGwgc3VwcG9ydCIKLQkgIGJlbG93IHdoZW4gdXNpbmcgREVDbmV0LCBzaW5jZSB5b3Ugd2lsbCBuZWVkIHN5c2N0bCBzdXBwb3J0IHRvIGFpZAotCSAgaW4gY29uZmlndXJhdGlvbiBhdCBydW4gdGltZS4KLQotCSAgVGhlIERFQ25ldCBjb2RlIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQotCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgotCSAgVGhlIG1vZHVsZSBpcyBjYWxsZWQgZGVjbmV0LgotCitzb3VyY2UgIm5ldC9hdG0vS2NvbmZpZyIKK3NvdXJjZSAibmV0L2JyaWRnZS9LY29uZmlnIgorc291cmNlICJuZXQvODAyMXEvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2RlY25ldC9LY29uZmlnIgotCiBzb3VyY2UgIm5ldC9sbGMvS2NvbmZpZyIKLQotY29uZmlnIElQWAotCXRyaXN0YXRlICJUaGUgSVBYIHByb3RvY29sIgotCXNlbGVjdCBMTEMKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBOb3ZlbGwgbmV0d29ya2luZyBwcm90b2NvbCwgSVBYLCBjb21tb25seQotCSAgdXNlZCBmb3IgbG9jYWwgbmV0d29ya3Mgb2YgV2luZG93cyBtYWNoaW5lcy4gIFlvdSBuZWVkIGl0IGlmIHlvdQotCSAgd2FudCB0byBhY2Nlc3MgTm92ZWxsIE5ldFdhcmUgZmlsZSBvciBwcmludCBzZXJ2ZXJzIHVzaW5nIHRoZSBMaW51eAotCSAgTm92ZWxsIGNsaWVudCBuY3BmcyAoYXZhaWxhYmxlIGZyb20KLQkgIDxmdHA6Ly9wbGF0YW4udmMuY3Z1dC5jei9wdWIvbGludXgvbmNwZnMvPikgb3IgZnJvbQotCSAgd2l0aGluIHRoZSBMaW51eCBET1MgZW11bGF0b3IgRE9TRU1VIChyZWFkIHRoZSBET1NFTVUtSE9XVE8sCi0JICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+KS4gIEluIG9yZGVyCi0JICB0byBkbyB0aGUgZm9ybWVyLCB5b3UnbGwgYWxzbyBoYXZlIHRvIHNheSBZIHRvICJOQ1AgZmlsZSBzeXN0ZW0KLQkgIHN1cHBvcnQiLCBiZWxvdy4KLQotCSAgSVBYIGlzIHNpbWlsYXIgaW4gc2NvcGUgdG8gSVAsIHdoaWxlIFNQWCwgd2hpY2ggcnVucyBvbiB0b3Agb2YgSVBYLAotCSAgaXMgc2ltaWxhciB0byBUQ1AuIFRoZXJlIGlzIGFsc28gZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFNQWCBpbgotCSAgTGludXggKHNlZSAiU1BYIG5ldHdvcmtpbmciLCBiZWxvdykuCi0KLQkgIFRvIHR1cm4geW91ciBMaW51eCBib3ggaW50byBhIGZ1bGx5IGZlYXR1cmVkIE5ldFdhcmUgZmlsZSBzZXJ2ZXIgYW5kCi0JICBJUFggcm91dGVyLCBzYXkgWSBoZXJlIGFuZCBmZXRjaCBlaXRoZXIgbHdhcmVkIGZyb20KLQkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL25ldHdvcmsvZGFlbW9ucy8+IG9yCi0JICBtYXJzX253ZSBmcm9tIDxmdHA6Ly93d3cuY29tcHUtYXJ0LmRlL21hcnNfbndlLz4uIEZvciBtb3JlCi0JICBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgSVBYLUhPV1RPIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25uZWN0IExpbnV4LCBXaW5kb3dzIG1hY2hpbmVzIGFuZAotCSAgTWFjcyBpcyBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmVhdHMuY29tL2xpbnV4X21hY193aW4uaHRtbD4uCi0KLQkgIFRoZSBJUFggZHJpdmVyIHdvdWxkIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTYgS0IuIFRvIGNvbXBpbGUKLQkgIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlweC4KLQkgIFVubGVzcyB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgeW91ciBMaW51eCBib3ggd2l0aCBhIGxvY2FsIE5vdmVsbAotCSAgbmV0d29yaywgc2F5IE4uCi0KIHNvdXJjZSAibmV0L2lweC9LY29uZmlnIgotCi1jb25maWcgQVRBTEsKLQl0cmlzdGF0ZSAiQXBwbGV0YWxrIHByb3RvY29sIHN1cHBvcnQiCi0Jc2VsZWN0IExMQwotCS0tLWhlbHAtLS0KLQkgIEFwcGxlVGFsayBpcyB0aGUgcHJvdG9jb2wgdGhhdCBBcHBsZSBjb21wdXRlcnMgY2FuIHVzZSB0byBjb21tdW5pY2F0ZQotCSAgb24gYSBuZXR3b3JrLiAgSWYgeW91ciBMaW51eCBib3ggaXMgY29ubmVjdGVkIHRvIHN1Y2ggYSBuZXR3b3JrIGFuZCB5b3UKLQkgIHdpc2ggdG8gY29ubmVjdCB0byBpdCwgc2F5IFkuICBZb3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgbmV0YXRhbGsgcGFja2FnZQotCSAgc28gdGhhdCB5b3VyIExpbnV4IGJveCBjYW4gYWN0IGFzIGEgcHJpbnQgYW5kIGZpbGUgc2VydmVyIGZvciBNYWNzIGFzCi0JICB3ZWxsIGFzIGFjY2VzcyBBcHBsZVRhbGsgcHJpbnRlcnMuICBDaGVjayBvdXQKLQkgIDxodHRwOi8vd3d3LnpldHRhYnl0ZS5uZXQvbmV0YXRhbGsvPiBvbiB0aGUgV1dXIGZvciBkZXRhaWxzLgotCSAgRXRoZXJUYWxrIGlzIHRoZSBuYW1lIHVzZWQgZm9yIEFwcGxlVGFsayBvdmVyIEV0aGVybmV0IGFuZCB0aGUKLQkgIGNoZWFwZXIgYW5kIHNsb3dlciBMb2NhbFRhbGsgaXMgQXBwbGVUYWxrIG92ZXIgYSBwcm9wcmlldGFyeSBBcHBsZQotCSAgbmV0d29yayB1c2luZyBzZXJpYWwgbGlua3MuICBFdGhlclRhbGsgYW5kIExvY2FsVGFsayBhcmUgZnVsbHkKLQkgIHN1cHBvcnRlZCBieSBMaW51eC4KLQotCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKLQkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LiAgVGhlCi0JICBORVQtMy1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGNvbnRhaW5zIHZhbHVhYmxlCi0JICBpbmZvcm1hdGlvbiBhcyB3ZWxsLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBhcHBsZXRhbGsuIFlvdSBhbG1vc3QgY2VydGFpbmx5IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUgc28geW91IGNhbiByZXN0YXJ0IHlvdXIgQXBwbGVUYWxrIHN0YWNrIHdpdGhvdXQgcmVib290aW5nCi0JICB5b3VyIG1hY2hpbmUuIEkgaGVhciB0aGF0IHRoZSBHTlUgYm95Y290dCBvZiBBcHBsZSBpcyBvdmVyLCBzbwotCSAgZXZlbiBwb2xpdGljYWxseSBjb3JyZWN0IHBlb3BsZSBhcmUgYWxsb3dlZCB0byBzYXkgWSBoZXJlLgotCiBzb3VyY2UgImRyaXZlcnMvbmV0L2FwcGxldGFsay9LY29uZmlnIgotCi1jb25maWcgWDI1Ci0JdHJpc3RhdGUgIkNDSVRUIFguMjUgUGFja2V0IExheWVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JLS0taGVscC0tLQotCSAgWC4yNSBpcyBhIHNldCBvZiBzdGFuZGFyZGl6ZWQgbmV0d29yayBwcm90b2NvbHMsIHNpbWlsYXIgaW4gc2NvcGUgdG8KLQkgIGZyYW1lIHJlbGF5OyB0aGUgb25lIHBoeXNpY2FsIGxpbmUgZnJvbSB5b3VyIGJveCB0byB0aGUgWC4yNSBuZXR3b3JrCi0JICBlbnRyeSBwb2ludCBjYW4gY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zCi0JICAoY2FsbGVkICJ2aXJ0dWFsIGNpcmN1aXRzIikgdG8gb3RoZXIgY29tcHV0ZXJzIGNvbm5lY3RlZCB0byB0aGUgWC4yNQotCSAgbmV0d29yay4gR292ZXJubWVudHMsIGJhbmtzLCBhbmQgb3RoZXIgb3JnYW5pemF0aW9ucyB0ZW5kIHRvIHVzZSBpdAotCSAgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIG9yIHRvIGZvcm0gV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKS4gTWFueQotCSAgY291bnRyaWVzIGhhdmUgcHVibGljIFguMjUgbmV0d29ya3MuIFguMjUgY29uc2lzdHMgb2YgdHdvCi0JICBwcm90b2NvbHM6IHRoZSBoaWdoZXIgbGV2ZWwgUGFja2V0IExheWVyIFByb3RvY29sIChQTFApIChzYXkgWSBoZXJlCi0JICBpZiB5b3Ugd2FudCB0aGF0KSBhbmQgdGhlIGxvd2VyIGxldmVsIGRhdGEgbGluayBsYXllciBwcm90b2NvbCBMQVBCCi0JICAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rIERyaXZlciIgYmVsb3cgaWYgeW91IHdhbnQgdGhhdCkuCi0KLQkgIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFguMjUgYXQgPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20veDI1Lmh0bT4gYW5kCi0JICA8aHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvc29mdHdhcmUvaW9zMTEvY2Jvb2svY3gyNS5odG0+LgotCSAgSW5mb3JtYXRpb24gYWJvdXQgWC4yNSBmb3IgTGludXggaXMgY29udGFpbmVkIGluIHRoZSBmaWxlcwotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS50eHQ+IGFuZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQ+LgotCi0JICBPbmUgY29ubmVjdHMgdG8gYW4gWC4yNSBuZXR3b3JrIGVpdGhlciB3aXRoIGEgZGVkaWNhdGVkIG5ldHdvcmsgY2FyZAotCSAgdXNpbmcgdGhlIFguMjEgcHJvdG9jb2wgKG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IExpbnV4KSBvciBvbmUgY2FuIGRvCi0JICBYLjI1IG92ZXIgYSBzdGFuZGFyZCB0ZWxlcGhvbmUgbGluZSB1c2luZyBhbiBvcmRpbmFyeSBtb2RlbSAoc2F5IFkKLQkgIHRvICJYLjI1IGFzeW5jIGRyaXZlciIgYmVsb3cpIG9yIG92ZXIgRXRoZXJuZXQgdXNpbmcgYW4gb3JkaW5hcnkKLQkgIEV0aGVybmV0IGNhcmQgYW5kIHRoZSBMQVBCIG92ZXIgRXRoZXJuZXQgKHNheSBZIHRvICJMQVBCIERhdGEgTGluawotCSAgRHJpdmVyIiBhbmQgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIiIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgeDI1LiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgTEFQQgotCXRyaXN0YXRlICJMQVBCIERhdGEgTGluayBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBMaW5rIEFjY2VzcyBQcm9jZWR1cmUsIEJhbGFuY2VkIChMQVBCKSBpcyB0aGUgZGF0YSBsaW5rIGxheWVyIChpLmUuCi0JICB0aGUgbG93ZXIpIHBhcnQgb2YgdGhlIFguMjUgcHJvdG9jb2wuIEl0IG9mZmVycyBhIHJlbGlhYmxlCi0JICBjb25uZWN0aW9uIHNlcnZpY2UgdG8gZXhjaGFuZ2UgZGF0YSBmcmFtZXMgd2l0aCBvbmUgb3RoZXIgaG9zdCwgYW5kCi0JICBpdCBpcyB1c2VkIHRvIHRyYW5zcG9ydCBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzIChtb3N0bHkgWC4yNSBQYWNrZXQKLQkgIExheWVyLCB0aGUgaGlnaGVyIHBhcnQgb2YgWC4yNSwgYnV0IG90aGVycyBhcmUgcG9zc2libGUgYXMgd2VsbCkuCi0JICBVc3VhbGx5LCBMQVBCIGlzIHVzZWQgd2l0aCBzcGVjaWFsaXplZCBYLjIxIG5ldHdvcmsgY2FyZHMsIGJ1dCBMaW51eAotCSAgY3VycmVudGx5IHN1cHBvcnRzIExBUEIgb25seSBvdmVyIEV0aGVybmV0IGNvbm5lY3Rpb25zLiBJZiB5b3Ugd2FudAotCSAgdG8gdXNlIExBUEIgY29ubmVjdGlvbnMgb3ZlciBFdGhlcm5ldCwgc2F5IFkgaGVyZSBhbmQgdG8gIkxBUEIgb3ZlcgotCSAgRXRoZXJuZXQgZHJpdmVyIiBiZWxvdy4gUmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2xhcGItbW9kdWxlLnR4dD4gZm9yIHRlY2huaWNhbAotCSAgZGV0YWlscy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGFwYi4gIElmIHVuc3VyZSwgc2F5IE4uCitzb3VyY2UgIm5ldC94MjUvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2xhcGIvS2NvbmZpZyIKIAogY29uZmlnIE5FVF9ESVZFUlQKIAlib29sICJGcmFtZSBEaXZlcnRlciAoRVhQRVJJTUVOVEFMKSIKQEAgLTQ5NiwxMDcgKzE4NCwxMCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgRUNPTkVUCi0JdHJpc3RhdGUgIkFjb3JuIEVjb25ldC9BVU4gcHJvdG9jb2xzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElORVQKLQktLS1oZWxwLS0tCi0JICBFY29uZXQgaXMgYSBmYWlybHkgb2xkIGFuZCBzbG93IG5ldHdvcmtpbmcgcHJvdG9jb2wgbWFpbmx5IHVzZWQgYnkKLQkgIEFjb3JuIGNvbXB1dGVycyB0byBhY2Nlc3MgZmlsZSBhbmQgcHJpbnQgc2VydmVycy4gSXQgdXNlcyBuYXRpdmUKLQkgIEVjb25ldCBuZXR3b3JrIGNhcmRzLiBBVU4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGhpZ2hlciBsZXZlbAotCSAgcGFydHMgb2YgRWNvbmV0IHRoYXQgcnVucyBvdmVyIG9yZGluYXJ5IEV0aGVybmV0IGNvbm5lY3Rpb25zLCBvbgotCSAgdG9wIG9mIHRoZSBVRFAgcGFja2V0IHByb3RvY29sLCB3aGljaCBpbiB0dXJuIHJ1bnMgb24gdG9wIG9mIHRoZQotCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVAuCi0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgY2FuIGNob29zZSB3aXRoIHRoZSBuZXh0IHR3byBvcHRpb25zIHdoZXRoZXIKLQkgIHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAgRXRoZXJuZXQgY29ubmVjdGlvbiBvciBvdmVyCi0JICBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBlY29uZXQuCi0KLWNvbmZpZyBFQ09ORVRfQVVOVURQCi0JYm9vbCAiQVVOIG92ZXIgVURQIgotCWRlcGVuZHMgb24gRUNPTkVUCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzZW5kIEVjb25ldC9BVU4gdHJhZmZpYyBvdmVyIGEgVURQCi0JICBjb25uZWN0aW9uIChVRFAgaXMgYSBwYWNrZXQgYmFzZWQgcHJvdG9jb2wgdGhhdCBydW5zIG9uIHRvcCBvZiB0aGUKLQkgIEludGVybmV0IHByb3RvY29sIElQKSB1c2luZyBhbiBvcmRpbmFyeSBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCi0KLWNvbmZpZyBFQ09ORVRfTkFUSVZFCi0JYm9vbCAiTmF0aXZlIEVjb25ldCIKLQlkZXBlbmRzIG9uIEVDT05FVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBuYXRpdmUgRWNvbmV0IG5ldHdvcmsgY2FyZCBpbnN0YWxsZWQgaW4KLQkgIHlvdXIgY29tcHV0ZXIuCi0KLWNvbmZpZyBXQU5fUk9VVEVSCi0JdHJpc3RhdGUgIldBTiByb3V0ZXIiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBXaWRlIEFyZWEgTmV0d29ya3MgKFdBTnMpLCBzdWNoIGFzIFguMjUsIGZyYW1lIHJlbGF5IGFuZCBsZWFzZWQKLQkgIGxpbmVzLCBhcmUgdXNlZCB0byBpbnRlcmNvbm5lY3QgTG9jYWwgQXJlYSBOZXR3b3JrcyAoTEFOcykgb3ZlciB2YXN0Ci0JICBkaXN0YW5jZXMgd2l0aCBkYXRhIHRyYW5zZmVyIHJhdGVzIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gdGhvc2UKLQkgIGFjaGlldmFibGUgd2l0aCBjb21tb25seSB1c2VkIGFzeW5jaHJvbm91cyBtb2RlbSBjb25uZWN0aW9ucy4KLQkgIFVzdWFsbHksIGEgcXVpdGUgZXhwZW5zaXZlIGV4dGVybmFsIGRldmljZSBjYWxsZWQgYSBgV0FOIHJvdXRlcicgaXMKLQkgIG5lZWRlZCB0byBjb25uZWN0IHRvIGEgV0FOLgotCi0JICBBcyBhbiBhbHRlcm5hdGl2ZSwgV0FOIHJvdXRpbmcgY2FuIGJlIGJ1aWx0IGludG8gdGhlIExpbnV4IGtlcm5lbC4KLQkgIFdpdGggcmVsYXRpdmVseSBpbmV4cGVuc2l2ZSBXQU4gaW50ZXJmYWNlIGNhcmRzIGF2YWlsYWJsZSBvbiB0aGUKLQkgIG1hcmtldCwgYSBwZXJmZWN0bHkgdXNhYmxlIHJvdXRlciBjYW4gYmUgYnVpbHQgZm9yIGxlc3MgdGhhbiBoYWxmCi0JICB0aGUgcHJpY2Ugb2YgYW4gZXh0ZXJuYWwgcm91dGVyLiAgSWYgeW91IGhhdmUgb25lIG9mIHRob3NlIGNhcmRzIGFuZAotCSAgd2lzaCB0byB1c2UgeW91ciBMaW51eCBib3ggYXMgYSBXQU4gcm91dGVyLCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvCi0JICB0aGUgV0FOIGRyaXZlciBmb3IgeW91ciBjYXJkLCBiZWxvdy4gIFlvdSB3aWxsIHRoZW4gbmVlZCB0aGUKLQkgIHdhbi10b29scyBwYWNrYWdlIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tIDxmdHA6Ly9mdHAuc2FuZ29tYS5jb20vPi4KLQkgIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0PiBmb3IgbW9yZQotCSAgaW5mb3JtYXRpb24uCi0KLQkgIFRvIGNvbXBpbGUgV0FOIHJvdXRpbmcgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fucm91dGVyLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1tZW51ICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCi0KLWNvbmZpZyBORVRfU0NIRUQKLQlib29sICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCi0JLS0taGVscC0tLQotCSAgV2hlbiB0aGUga2VybmVsIGhhcyBzZXZlcmFsIHBhY2tldHMgdG8gc2VuZCBvdXQgb3ZlciBhIG5ldHdvcmsKLQkgIGRldmljZSwgaXQgaGFzIHRvIGRlY2lkZSB3aGljaCBvbmVzIHRvIHNlbmQgZmlyc3QsIHdoaWNoIG9uZXMgdG8KLQkgIGRlbGF5LCBhbmQgd2hpY2ggb25lcyB0byBkcm9wLiBUaGlzIGlzIHRoZSBqb2Igb2YgdGhlIHBhY2tldAotCSAgc2NoZWR1bGVyLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgaG93IHRvIGRvIHRoaXMKLQkgICJmYWlybHkiIGhhdmUgYmVlbiBwcm9wb3NlZC4KLQotCSAgSWYgeW91IHNheSBOIGhlcmUsIHlvdSB3aWxsIGdldCB0aGUgc3RhbmRhcmQgcGFja2V0IHNjaGVkdWxlciwgd2hpY2gKLQkgIGlzIGEgRklGTyAoZmlyc3QgY29tZSwgZmlyc3Qgc2VydmVkKS4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlCi0JICBhYmxlIHRvIGNob29zZSBmcm9tIGFtb25nIHNldmVyYWwgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtcyB3aGljaCBjYW4KLQkgIHRoZW4gYmUgYXR0YWNoZWQgdG8gZGlmZmVyZW50IG5ldHdvcmsgZGV2aWNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yCi0JICBleGFtcGxlIGlmIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgYXJlIHJlYWwgdGltZSBkZXZpY2VzIHRoYXQKLQkgIG5lZWQgYSBjZXJ0YWluIG1pbmltdW0gZGF0YSBmbG93IHJhdGUsIG9yIGlmIHlvdSBuZWVkIHRvIGxpbWl0IHRoZQotCSAgbWF4aW11bSBkYXRhIGZsb3cgcmF0ZSBmb3IgdHJhZmZpYyB3aGljaCBtYXRjaGVzIHNwZWNpZmllZCBjcml0ZXJpYS4KLQkgIFRoaXMgY29kZSBpcyBjb25zaWRlcmVkIHRvIGJlIGV4cGVyaW1lbnRhbC4KLQotCSAgVG8gYWRtaW5pc3RlciB0aGVzZSBzY2hlZHVsZXJzLCB5b3UnbGwgbmVlZCB0aGUgdXNlci1sZXZlbCB1dGlsaXRpZXMKLQkgIGZyb20gdGhlIHBhY2thZ2UgaXByb3V0ZTIrdGMgYXQgPGZ0cDovL2Z0cC50dXgub3JnL3B1Yi9uZXQvaXAtcm91dGluZy8+LgotCSAgVGhhdCBwYWNrYWdlIGFsc28gY29udGFpbnMgc29tZSBkb2N1bWVudGF0aW9uOyBmb3IgbW9yZSwgY2hlY2sgb3V0Ci0JICA8aHR0cDovL3NuYWZ1LmZyZWVkb20ub3JnL2xpbnV4Mi4yL2lwcm91dGUtbm90ZXMuaHRtbD4uCi0KLQkgIFRoaXMgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIHN1cHBvcnQgd2lsbCBlbmFibGUgeW91IHRvIHVzZQotCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKGRpZmZzZXJ2KSBhbmQgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wKLQkgIChSU1ZQKSBvbiB5b3VyIExpbnV4IHJvdXRlciBpZiB5b3UgYWxzbyBzYXkgWSB0byAiUW9TIHN1cHBvcnQiLAotCSAgIlBhY2tldCBjbGFzc2lmaWVyIEFQSSIgYW5kIHRvIHNvbWUgY2xhc3NpZmllcnMgYmVsb3cuIERvY3VtZW50YXRpb24KLQkgIGFuZCBzb2Z0d2FyZSBpcyBhdCA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgotCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIiBiZWxvdywgeW91IHdpbGwgYmUgYWJsZQotCSAgdG8gcmVhZCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgcGFja2V0IHNjaGVkdWxlcnMgZnJvbSB0aGUgZmlsZQotCSAgL3Byb2MvbmV0L3BzY2hlZC4KLQotCSAgVGhlIGF2YWlsYWJsZSBzY2hlZHVsZXJzIGFyZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM7IHlvdQotCSAgY2FuIHNheSBZIHRvIGFzIG1hbnkgYXMgeW91IGxpa2UuIElmIHVuc3VyZSwgc2F5IE4gbm93LgotCitzb3VyY2UgIm5ldC9lY29uZXQvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3dhbnJvdXRlci9LY29uZmlnIgogc291cmNlICJuZXQvc2NoZWQvS2NvbmZpZyIKIAotZW5kbWVudQotCiBtZW51ICJOZXR3b3JrIHRlc3RpbmciCiAKIGNvbmZpZyBORVRfUEtUR0VOCkBAIC02MTgsMjkgKzIwOSwxMCBAQAogCiBlbmRtZW51CiAKLWNvbmZpZyBORVRQT0xMCi0JZGVmX2Jvb2wgTkVUQ09OU09MRQotCi1jb25maWcgTkVUUE9MTF9SWAotCWJvb2wgIk5ldHBvbGwgc3VwcG9ydCBmb3IgdHJhcHBpbmcgaW5jb21pbmcgcGFja2V0cyIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIE5FVFBPTEwKLQotY29uZmlnIE5FVFBPTExfVFJBUAotCWJvb2wgIk5ldHBvbGwgdHJhZmZpYyB0cmFwcGluZyIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIE5FVFBPTEwKLQotY29uZmlnIE5FVF9QT0xMX0NPTlRST0xMRVIKLQlkZWZfYm9vbCBORVRQT0xMCi0KIHNvdXJjZSAibmV0L2F4MjUvS2NvbmZpZyIKLQogc291cmNlICJuZXQvaXJkYS9LY29uZmlnIgotCiBzb3VyY2UgIm5ldC9ibHVldG9vdGgvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgotCi1lbmRtZW51CitlbmRpZiAgICMgaWYgTkVUCitlbmRtZW51ICMgTmV0d29ya2luZwogCmRpZmYgLS1naXQgYS9uZXQvYXRtL0tjb25maWcgYi9uZXQvYXRtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmZjI3NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vS2NvbmZpZwpAQCAtMCwwICsxLDc0IEBACisjCisjIEFzeW5jaHJvbm91cyBUcmFuc2ZlciBNb2RlIChBVE0pIChFWFBFUklNRU5UQUwpCisjCisKK2NvbmZpZyBBVE0KKwl0cmlzdGF0ZSAiQXN5bmNocm9ub3VzIFRyYW5zZmVyIE1vZGUgKEFUTSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBBVE0gaXMgYSBoaWdoLXNwZWVkIG5ldHdvcmtpbmcgdGVjaG5vbG9neSBmb3IgTG9jYWwgQXJlYSBOZXR3b3JrcworCSAgYW5kIFdpZGUgQXJlYSBOZXR3b3Jrcy4gIEl0IHVzZXMgYSBmaXhlZCBwYWNrZXQgc2l6ZSBhbmQgaXMKKwkgIGNvbm5lY3Rpb24gb3JpZW50ZWQsIGFsbG93aW5nIGZvciB0aGUgbmVnb3RpYXRpb24gb2YgbWluaW11bQorCSAgYmFuZHdpZHRoIHJlcXVpcmVtZW50cy4KKworCSAgSW4gb3JkZXIgdG8gcGFydGljaXBhdGUgaW4gYW4gQVRNIG5ldHdvcmssIHlvdXIgTGludXggYm94IG5lZWRzIGFuCisJICBBVE0gbmV0d29ya2luZyBjYXJkLiBJZiB5b3UgaGF2ZSB0aGF0LCBzYXkgWSBoZXJlIGFuZCB0byB0aGUgZHJpdmVyCisJICBvZiB5b3VyIEFUTSBjYXJkIGJlbG93LgorCisJICBOb3RlIHRoYXQgeW91IG5lZWQgYSBzZXQgb2YgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBhY3R1YWxseSBtYWtlIHVzZQorCSAgb2YgQVRNLiAgU2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hdG0udHh0PiBmb3IKKwkgIGZ1cnRoZXIgZGV0YWlscy4KKworY29uZmlnIEFUTV9DTElQCisJdHJpc3RhdGUgIkNsYXNzaWNhbCBJUCBvdmVyIEFUTSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTSAmJiBJTkVUCisJaGVscAorCSAgQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGZvciBQVkNzIGFuZCBTVkNzLCBzdXBwb3J0aW5nIEluQVJQIGFuZAorCSAgQVRNQVJQLiBJZiB5b3Ugd2FudCB0byBjb21tdW5pY2F0aW9uIHdpdGggb3RoZXIgSVAgaG9zdHMgb24geW91ciBBVE0KKwkgIG5ldHdvcmssIHlvdSB3aWxsIHR5cGljYWxseSBlaXRoZXIgc2F5IFkgaGVyZSBvciB0byAiTEFOIEVtdWxhdGlvbgorCSAgKExBTkUpIiBiZWxvdy4KKworY29uZmlnIEFUTV9DTElQX05PX0lDTVAKKwlib29sICJEbyBOT1Qgc2VuZCBJQ01QIGlmIG5vIG5laWdoYm91ciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTV9DTElQCisJaGVscAorCSAgTm9ybWFsbHksIGFuICJJQ01QIGhvc3QgdW5yZWFjaGFibGUiIG1lc3NhZ2UgaXMgc2VudCBpZiBhIG5laWdoYm91cgorCSAgY2Fubm90IGJlIHJlYWNoZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBWQyB0byBpdCBpbiB0aGUga2VybmVsJ3MKKwkgIEFUTUFSUCB0YWJsZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBBVE1BUlAgdGFibGUgZW50cmllcyBhcmUKKwkgIGJyaWVmbHkgcmVtb3ZlZCBkdXJpbmcgcmV2YWxpZGF0aW9uLiBJZiB5b3Ugc2F5IFkgaGVyZSwgcGFja2V0cyB0bworCSAgc3VjaCBuZWlnaGJvdXJzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgaW5zdGVhZC4KKworY29uZmlnIEFUTV9MQU5FCisJdHJpc3RhdGUgIkxBTiBFbXVsYXRpb24gKExBTkUpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBVE0KKwloZWxwCisJICBMQU4gRW11bGF0aW9uIGVtdWxhdGVzIHNlcnZpY2VzIG9mIGV4aXN0aW5nIExBTnMgYWNyb3NzIGFuIEFUTQorCSAgbmV0d29yay4gQmVzaWRlcyBvcGVyYXRpbmcgYXMgYSBub3JtYWwgQVRNIGVuZCBzdGF0aW9uIGNsaWVudCwgTGludXgKKwkgIExBTkUgY2xpZW50IGNhbiBhbHNvIGFjdCBhcyBhbiBwcm94eSBjbGllbnQgYnJpZGdpbmcgcGFja2V0cyBiZXR3ZWVuCisJICBFTEFOIGFuZCBFdGhlcm5ldCBzZWdtZW50cy4gWW91IG5lZWQgTEFORSBpZiB5b3Ugd2FudCB0byB0cnkgTVBPQS4KKworY29uZmlnIEFUTV9NUE9BCisJdHJpc3RhdGUgIk11bHRpLVByb3RvY29sIE92ZXIgQVRNIChNUE9BKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVRNICYmIElORVQgJiYgQVRNX0xBTkUhPW4KKwloZWxwCisJICBNdWx0aS1Qcm90b2NvbCBPdmVyIEFUTSBhbGxvd3MgQVRNIGVkZ2UgZGV2aWNlcyBzdWNoIGFzIHJvdXRlcnMsCisJICBicmlkZ2VzIGFuZCBBVE0gYXR0YWNoZWQgaG9zdHMgZXN0YWJsaXNoIGRpcmVjdCBBVE0gVkNzIGFjcm9zcworCSAgc3VibmV0d29yayBib3VuZGFyaWVzLiBUaGVzZSBzaG9ydGN1dCBjb25uZWN0aW9ucyBieXBhc3Mgcm91dGVycworCSAgZW5oYW5jaW5nIG92ZXJhbGwgbmV0d29yayBwZXJmb3JtYW5jZS4KKworY29uZmlnIEFUTV9CUjI2ODQKKwl0cmlzdGF0ZSAiUkZDMTQ4My8yNjg0IEJyaWRnZWQgcHJvdG9jb2xzIgorCWRlcGVuZHMgb24gQVRNICYmIElORVQKKwloZWxwCisJICBBVE0gUFZDcyBjYW4gY2FycnkgZXRoZXJuZXQgUERVcyBhY2NvcmRpbmcgdG8gUkZDMjY4NCAoZm9ybWVybHkgMTQ4MykKKwkgIFRoaXMgZGV2aWNlIHdpbGwgYWN0IGxpa2UgYW4gZXRoZXJuZXQgZnJvbSB0aGUga2VybmVscyBwb2ludCBvZiB2aWV3LAorCSAgd2l0aCB0aGUgdHJhZmZpYyBiZWluZyBjYXJyaWVkIGJ5IEFUTSBQVkNzIChjdXJyZW50bHkgMSBQVkMvZGV2aWNlKS4KKwkgIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgb3ZlciBEU0wgbGluZXMuICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBBVE1fQlIyNjg0X0lQRklMVEVSCisJYm9vbCAiUGVyLVZDIElQIGZpbHRlciBrbHVkZ2UiCisJZGVwZW5kcyBvbiBBVE1fQlIyNjg0CisJaGVscAorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgbWVjaGFuaXNtIGZvciB1c2VycyB3aG8gbmVlZCB0byB0ZXJtaW5hdGUgYQorCSAgbGFyZ2UgbnVtYmVyIG9mIElQLW9ubHkgdmNjJ3MuICBEbyBub3QgZW5hYmxlIHRoaXMgdW5sZXNzIHlvdSBhcmUgc3VyZQorCSAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggZTY5NTRjZi4uMjg5OTU2YyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC0yODksOCArMjg5LDcgQEAKICAqIFRoaXMgaXMgc2ltaWxhciB0byBldGhfdHlwZV90cmFucywgd2hpY2ggY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBvZgogICogb3VyIGRldi0+aGFyZF9oZWFkZXJfbGVuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgYnJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgX19iZTE2IGJyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKZGlmZiAtLWdpdCBhL25ldC9hdG0vc3ZjLmMgYi9uZXQvYXRtL3N2Yy5jCmluZGV4IDAyZjUzNzQuLjA4ZTQ2MDUgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vc3ZjLmMKKysrIGIvbmV0L2F0bS9zdmMuYwpAQCAtMTE4LDEwICsxMTgsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAJdmNjID0gQVRNX1NEKHNvY2spOwotCWlmICh0ZXN0X2JpdChBVE1fVkZfU0VTU0lPTiwgJnZjYy0+ZmxhZ3MpKSB7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSBzb2NrYWRkcjsKIAlpZiAoYWRkci0+c2FzX2ZhbWlseSAhPSBBRl9BVE1TVkMpIHsKIAkJZXJyb3IgPSAtRUFGTk9TVVBQT1JUOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKaW5kZXggMmUzNDFkZS4uOTAxZWZmNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIAlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOwogfQogCi1zdGF0aWMgaW50IGNtdHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgY210cF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5za2I7CiAJdW5zaWduZWQgY2hhciAqaGRyOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIAlpZiAoIShuc2tiID0gYWxsb2Nfc2tiKHNlc3Npb24tPm10dSwgR0ZQX0FUT01JQykpKSB7CiAJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZnJhbWUiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybjsKIAl9CiAKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZXNzaW9uLT50cmFuc21pdCkpKSB7CkBAIC0yNzUsOCArMjc1LDYgQEAKIAljbXRwX3NlbmRfZnJhbWUoc2Vzc2lvbiwgbnNrYi0+ZGF0YSwgbnNrYi0+bGVuKTsKIAogCWtmcmVlX3NrYihuc2tiKTsKLQotCXJldHVybiBza2JfcXVldWVfbGVuKCZzZXNzaW9uLT50cmFuc21pdCk7CiB9CiAKIHN0YXRpYyBpbnQgY210cF9zZXNzaW9uKHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IGFmZmJjNTUuLmRlOGFmNWYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpdiwgMSwgbGVuKTsKIH0KIAotc3RhdGljIGludCBoaWRwX3Byb2Nlc3NfdHJhbnNtaXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyB2b2lkIGhpZHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTQ1Myw5ICs0NTMsNiBAQAogCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi0JcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpICsKLQkJCQlza2JfcXVldWVfbGVuKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKIH0KIAogc3RhdGljIGludCBoaWRwX3Nlc3Npb24odm9pZCAqYXJnKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCmluZGV4IGYzZjYzNTUuLjYzYTEyM2MgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKQEAgLTU5MCw4ICs1OTAsMTEgQEAKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fCBzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHx8Ci0JCQkJc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwgIXRpbWVvKQorCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8CisJCSAgICBzay0+c2tfZXJyIHx8CisJCSAgICAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKKwkJICAgICF0aW1lbykKIAkJCWJyZWFrOwogCiAJCXNldF9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKaW5kZXggNmQ2ODkyMC4uNjMwNDU5MCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKQEAgLTc4MSw3ICs3ODEsNyBAQAogCiAJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOwogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJmRsYy0+dHhfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZkbGMtPnR4X3F1ZXVlKSkKIAkJcmV0dXJuIGRsYy0+bXR1OwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL0tjb25maWcgYi9uZXQvYnJpZGdlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyM2Q1OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvS2NvbmZpZwpAQCAtMCwwICsxLDMxIEBACisjCisjIDgwMi4xZCBFdGhlcm5ldCBCcmlkZ2luZworIworCitjb25maWcgQlJJREdFCisJdHJpc3RhdGUgIjgwMi4xZCBFdGhlcm5ldCBCcmlkZ2luZyIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlbiB5b3VyIExpbnV4IGJveCB3aWxsIGJlIGFibGUgdG8gYWN0IGFzIGFuCisJICBFdGhlcm5ldCBicmlkZ2UsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGRpZmZlcmVudCBFdGhlcm5ldCBzZWdtZW50cyBpdAorCSAgaXMgY29ubmVjdGVkIHRvIHdpbGwgYXBwZWFyIGFzIG9uZSBFdGhlcm5ldCB0byB0aGUgcGFydGljaXBhbnRzLgorCSAgU2V2ZXJhbCBzdWNoIGJyaWRnZXMgY2FuIHdvcmsgdG9nZXRoZXIgdG8gY3JlYXRlIGV2ZW4gbGFyZ2VyCisJICBuZXR3b3JrcyBvZiBFdGhlcm5ldHMgdXNpbmcgdGhlIElFRUUgODAyLjEgc3Bhbm5pbmcgdHJlZSBhbGdvcml0aG0uCisJICBBcyB0aGlzIGlzIGEgc3RhbmRhcmQsIExpbnV4IGJyaWRnZXMgd2lsbCBjb29wZXJhdGUgcHJvcGVybHkgd2l0aAorCSAgb3RoZXIgdGhpcmQgcGFydHkgYnJpZGdlIHByb2R1Y3RzLgorCisJICBJbiBvcmRlciB0byB1c2UgdGhlIEV0aGVybmV0IGJyaWRnZSwgeW91J2xsIG5lZWQgdGhlIGJyaWRnZQorCSAgY29uZmlndXJhdGlvbiB0b29sczsgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9icmlkZ2UudHh0PgorCSAgZm9yIGxvY2F0aW9uLiBQbGVhc2UgcmVhZCB0aGUgQnJpZGdlIG1pbmktSE9XVE8gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLgorCisJICBJZiB5b3UgZW5hYmxlIGlwdGFibGVzIHN1cHBvcnQgYWxvbmcgd2l0aCB0aGUgYnJpZGdlIHN1cHBvcnQgdGhlbiB5b3UKKwkgIHR1cm4geW91ciBicmlkZ2UgaW50byBhIGJyaWRnaW5nIElQIGZpcmV3YWxsLgorCSAgaXB0YWJsZXMgd2lsbCB0aGVuIHNlZSB0aGUgSVAgcGFja2V0cyBiZWluZyBicmlkZ2VkLCBzbyB5b3UgbmVlZCB0bworCSAgdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuIHNldHRpbmcgdXAgeW91ciBmaXJld2FsbCBydWxlcy4KKwkgIEVuYWJsaW5nIGFycHRhYmxlcyBzdXBwb3J0IHdoZW4gYnJpZGdpbmcgd2lsbCBsZXQgYXJwdGFibGVzIHNlZQorCSAgYnJpZGdlZCBBUlAgdHJhZmZpYyBpbiB0aGUgYXJwdGFibGVzIEZPUldBUkQgY2hhaW4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBicmlkZ2UuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCAwM2FlNGVkLi4yZDUyZmVlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTg0NCw3ICs4NDQsNyBAQAogCQkgKiBkb2Vzbid0IHVzZSB0aGUgYnJpZGdlIHBhcmVudCBvZiB0aGUgaW5kZXYgYnkgdXNpbmcKIAkJICogdGhlIEJSTkZfRE9OVF9UQUtFX1BBUkVOVCBtYXNrLiAqLwogCQlpZiAoaG9vayA9PSBORl9JUF9GT1JXQVJEICYmIG5mX2JyaWRnZS0+cGh5c2luZGV2ID09IE5VTEwpIHsKLQkJCW5mX2JyaWRnZS0+bWFzayAmPSBCUk5GX0RPTlRfVEFLRV9QQVJFTlQ7CisJCQluZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9ET05UX1RBS0VfUEFSRU5UOwogCQkJbmZfYnJpZGdlLT5waHlzaW5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbjsKIAkJfQogI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggNjhjY2VmNS4uYzcwYjNiZSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9LY29uZmlnCkBAIC0xMzgsNyArMTM4LDcgQEAKICMKIGNvbmZpZyBCUklER0VfRUJUX0FSUFJFUExZCiAJdHJpc3RhdGUgImVidDogYXJwIHJlcGx5IHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMgJiYgSU5FVAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGFycCByZXBseSB0YXJnZXQsIHdoaWNoIGFsbG93cwogCSAgYXV0b21hdGljYWxseSBzZW5kaW5nIGFycCByZXBsaWVzIHRvIGFycCByZXF1ZXN0cy4KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCBlNGFlMzRiLi42NjI5NzViIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC02MSw4ICs2MSw2IEBACiB7CiAJc3RydWN0IGVidF9sb2dfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X2xvZ19pbmZvICopZGF0YTsKIAljaGFyIGxldmVsX3N0cmluZ1s0XSA9ICI8ID4iOwotCXVuaW9uIHtzdHJ1Y3QgaXBoZHIgaXBoOyBzdHJ1Y3QgdGNwdWRwaGRyIHBvcnRzOwotCSAgICAgICBzdHJ1Y3QgYXJwaGRyIGFycGg7IHN0cnVjdCBhcnBwYXlsb2FkIGFycHA7fSB1OwogCiAJbGV2ZWxfc3RyaW5nWzFdID0gJzAnICsgaW5mby0+bG9nbGV2ZWw7CiAJc3Bpbl9sb2NrX2JoKCZlYnRfbG9nX2xvY2spOwpAQCAtODgsNyArODYsNyBAQAogCQl9CiAJCXByaW50aygiIElQIFNSQz0ldS4ldS4ldS4ldSBJUCBEU1Q9JXUuJXUuJXUuJXUsIiwKIAkJICAgTklQUVVBRChpaC0+c2FkZHIpLCBOSVBRVUFEKGloLT5kYWRkcikpOwotCQlwcmludGsoIiBJUCB0b3M9MHglMDJYLCBJUCBwcm90bz0lZCIsIHUuaXBoLnRvcywKKwkJcHJpbnRrKCIgSVAgdG9zPTB4JTAyWCwgSVAgcHJvdG89JWQiLCBpaC0+dG9zLAogCQkgICAgICAgaWgtPnByb3RvY29sKTsKIAkJaWYgKGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CkBAIC0xMjcsNyArMTI1LDcgQEAKIAkJICAgIGFoLT5hcl9wbG4gPT0gc2l6ZW9mKHVpbnQzMl90KSkgewogCQkJc3RydWN0IGFycHBheWxvYWQgX2FycHAsICphcDsKIAotCQkJYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2YodS5hcnBoKSwKKwkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKF9hcnBoKSwKIAkJCQkJCXNpemVvZihfYXJwcCksICZfYXJwcCk7CiAJCQlpZiAoYXAgPT0gTlVMTCkgewogCQkJCXByaW50aygiIElOQ09NUExFVEUgQVJQIHBheWxvYWQiKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKaW5kZXggNWUwYzU2Yi4uZjVmNWU1OCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvTWFrZWZpbGUKKysrIGIvbmV0L2NvcmUvTWFrZWZpbGUKQEAgLTcsOSArNywxMCBAQAogCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGxfbmV0X2NvcmUubwogCi1vYmoteQkJICAgICArPSBmbG93Lm8gZGV2Lm8gZXRodG9vbC5vIGRldl9tY2FzdC5vIGRzdC5vIFwKK29iai15CQkgICAgICs9IGRldi5vIGV0aHRvb2wubyBkZXZfbWNhc3QubyBkc3QubyBcCiAJCQluZWlnaGJvdXIubyBydG5ldGxpbmsubyB1dGlscy5vIGxpbmtfd2F0Y2gubyBmaWx0ZXIubwogCitvYmotJChDT05GSUdfWEZSTSkgKz0gZmxvdy5vCiBvYmotJChDT05GSUdfU1lTRlMpICs9IG5ldC1zeXNmcy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSKSArPSBuZXRmaWx0ZXIubwogb2JqLSQoQ09ORklHX05FVF9ESVZFUlQpICs9IGR2Lm8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNzAxNmUwYy4uZmY5ZGMwMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTExMjcsNyArMTEyNyw3IEBACiBleHRlcm4gdm9pZCBza2JfcmVsZWFzZV9kYXRhKHN0cnVjdCBza19idWZmICopOwogCiAvKiBLZWVwIGhlYWQgdGhlIHNhbWU6IHJlcGxhY2UgZGF0YSAqLwotaW50IF9fc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCitpbnQgX19za2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAl1OCAqZGF0YTsKQEAgLTIwODksMTAgKzIwODksMTEgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwogCi0JZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKIAlpZiAoKGRldi0+cHJvbWlzY3VpdHkgKz0gaW5jKSA9PSAwKQogCQlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKLQlpZiAoZGV2LT5mbGFncyBeIG9sZF9mbGFncykgeworCWVsc2UKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwlpZiAoZGV2LT5mbGFncyAhPSBvbGRfZmxhZ3MpIHsKIAkJZGV2X21jX3VwbG9hZChkZXYpOwogCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgJXMgJXMgcHJvbWlzY3VvdXMgbW9kZVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAiZW50ZXJlZCIgOgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCBmM2I4ODIwLi5jZDkxYTI0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogCiAvKiBObyBodXJyeSBpbiB0aGlzIGJyYW5jaCAqLwotc3RhdGljIHU4ICpsb2FkX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGspCitzdGF0aWMgdm9pZCAqX19sb2FkX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGspCiB7CiAJdTggKnB0ciA9IE5VTEw7CiAKQEAgLTUwLDYgKzUwLDE4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbG9hZF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIGludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmJ1ZmZlcikKK3sKKwlpZiAoayA+PSAwKQorCQlyZXR1cm4gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaywgc2l6ZSwgYnVmZmVyKTsKKwllbHNlIHsKKwkJaWYgKGsgPj0gU0tGX0FEX09GRikKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gX19sb2FkX3BvaW50ZXIoc2tiLCBrKTsKKwl9Cit9CisKIC8qKgogICoJc2tfcnVuX2ZpbHRlcgktIAlydW4gYSBmaWx0ZXIgb24gYSBzb2NrZXQKICAqCUBza2I6IGJ1ZmZlciB0byBydW4gdGhlIGZpbHRlciBvbgpAQCAtNjQsMTUgKzc2LDEyIEBACiAgCiBpbnQgc2tfcnVuX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciwgaW50IGZsZW4pCiB7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHNrYi0+ZGF0YTsKLQkvKiBsZW4gaXMgVU5TSUdORUQuIEJ5dGUgd2lkZSBpbnNucyByZWxpZXMgb25seSBvbiBpbXBsaWNpdAotCSAgIHR5cGUgY2FzdHMgdG8gcHJldmVudCByZWFkaW5nIGFyYml0cmFyeSBtZW1vcnkgbG9jYXRpb25zLgotCSAqLwotCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbi1za2ItPmRhdGFfbGVuOwogCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmVudHJ5OwkvKiBXZSB3YWxrIGRvd24gdGhlc2UgKi8KKwl2b2lkICpwdHI7CiAJdTMyIEEgPSAwOwkgICAJCS8qIEFjY3VtdWxhdG9yICovCiAJdTMyIFggPSAwOyAgIAkJCS8qIEluZGV4IFJlZ2lzdGVyICovCiAJdTMyIG1lbVtCUEZfTUVNV09SRFNdOwkJLyogU2NyYXRjaCBNZW1vcnkgU3RvcmUgKi8KKwl1MzIgdG1wOwogCWludCBrOwogCWludCBwYzsKIApAQCAtMTY4LDg2ICsxNzcsMzUgQEAKIAkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKIAkJCWsgPSBmZW50cnktPms7CiAgbG9hZF93OgotCQkJaWYgKGsgPj0gMCAmJiAodW5zaWduZWQgaW50KShrK3NpemVvZih1MzIpKSA8PSBsZW4pIHsKLQkJCQlBID0gbnRvaGwoKih1MzIqKSZkYXRhW2tdKTsKKwkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDQsICZ0bXApOworCQkJaWYgKHB0ciAhPSBOVUxMKSB7CisJCQkJQSA9IG50b2hsKCoodTMyICopcHRyKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChrIDwgMCkgewotCQkJCXU4ICpwdHI7Ci0KLQkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQotCQkJCQlicmVhazsKLQkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKLQkJCQlpZiAocHRyKSB7Ci0JCQkJCUEgPSBudG9obCgqKHUzMiopcHRyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl1MzIgX3RtcCwgKnA7Ci0JCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDQsICZfdG1wKTsKLQkJCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJCUEgPSBudG9obCgqcCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KIAkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfSHxCUEZfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKICBsb2FkX2g6Ci0JCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpKGsgKyBzaXplb2YodTE2KSkgPD0gbGVuKSB7Ci0JCQkJQSA9IG50b2hzKCoodTE2KikmZGF0YVtrXSk7CisJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCAyLCAmdG1wKTsKKwkJCWlmIChwdHIgIT0gTlVMTCkgeworCQkJCUEgPSBudG9ocygqKHUxNiAqKXB0cik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoayA8IDApIHsKLQkJCQl1OCAqcHRyOwotCi0JCQkJaWYgKGsgPj0gU0tGX0FEX09GRikKLQkJCQkJYnJlYWs7Ci0JCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgayk7Ci0JCQkJaWYgKHB0cikgewotCQkJCQlBID0gbnRvaHMoKih1MTYqKXB0cik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdTE2IF90bXAsICpwOwotCQkJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCAyLCAmX3RtcCk7Ci0JCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCQlBID0gbnRvaHMoKnApOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBCUEZfTER8QlBGX0J8QlBGX0FCUzoKIAkJCWsgPSBmZW50cnktPms7CiBsb2FkX2I6Ci0JCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpayA8IGxlbikgewotCQkJCUEgPSBkYXRhW2tdOworCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgaywgMSwgJnRtcCk7CisJCQlpZiAocHRyICE9IE5VTEwpIHsKKwkJCQlBID0gKih1OCAqKXB0cjsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChrIDwgMCkgewotCQkJCXU4ICpwdHI7Ci0KLQkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQotCQkJCQlicmVhazsKLQkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKLQkJCQlpZiAocHRyKSB7Ci0JCQkJCUEgPSAqcHRyOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXU4IF90bXAsICpwOwotCQkJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCAxLCAmX3RtcCk7Ci0JCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCQlBID0gKnA7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KIAkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfTEVOOgotCQkJQSA9IGxlbjsKKwkJCUEgPSBza2ItPmxlbjsKIAkJCWNvbnRpbnVlOwogCQljYXNlIEJQRl9MRFh8QlBGX1d8QlBGX0xFTjoKLQkJCVggPSBsZW47CisJCQlYID0gc2tiLT5sZW47CiAJCQljb250aW51ZTsKIAkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0lORDoKIAkJCWsgPSBYICsgZmVudHJ5LT5rOwpAQCAtMjU5LDEwICsyMTcsMTIgQEAKIAkJCWsgPSBYICsgZmVudHJ5LT5rOwogCQkJZ290byBsb2FkX2I7CiAJCWNhc2UgQlBGX0xEWHxCUEZfQnxCUEZfTVNIOgotCQkJaWYgKGZlbnRyeS0+ayA+PSBsZW4pCi0JCQkJcmV0dXJuIDA7Ci0JCQlYID0gKGRhdGFbZmVudHJ5LT5rXSAmIDB4ZikgPDwgMjsKLQkJCWNvbnRpbnVlOworCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgZmVudHJ5LT5rLCAxLCAmdG1wKTsKKwkJCWlmIChwdHIgIT0gTlVMTCkgeworCQkJCVggPSAoKih1OCAqKXB0ciAmIDB4ZikgPDwgMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfSU1NOgogCQkJQSA9IGZlbnRyeS0+azsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCA4NTFlYjkyLi4xYmViNzgyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMTU5OCw2ICsxNTk4LDggQEAKIAogCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKIAluZHRtc2ctPm5kdG1fZmFtaWx5ID0gdGJsLT5mYW1pbHk7CisJbmR0bXNnLT5uZHRtX3BhZDEgICA9IDA7CisJbmR0bXNnLT5uZHRtX3BhZDIgICA9IDA7CiAKIAlSVEFfUFVUX1NUUklORyhza2IsIE5EVEFfTkFNRSwgdGJsLT5pZCk7CiAJUlRBX1BVVF9NU0VDUyhza2IsIE5EVEFfR0NfSU5URVJWQUwsIHRibC0+Z2NfaW50ZXJ2YWwpOwpAQCAtMTY4Myw2ICsxNjg1LDggQEAKIAogCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKIAluZHRtc2ctPm5kdG1fZmFtaWx5ID0gdGJsLT5mYW1pbHk7CisJbmR0bXNnLT5uZHRtX3BhZDEgICA9IDA7CisJbmR0bXNnLT5uZHRtX3BhZDIgICA9IDA7CiAJUlRBX1BVVF9TVFJJTkcoc2tiLCBORFRBX05BTUUsIHRibC0+aWQpOwogCiAJaWYgKG5laWdodGJsX2ZpbGxfcGFybXMoc2tiLCBwYXJtcykgPCAwKQpAQCAtMTg3Miw2ICsxODc2LDggQEAKIAlzdHJ1Y3QgbmRtc2cgKm5kbSA9IE5MTVNHX0RBVEEobmxoKTsKIAogCW5kbS0+bmRtX2ZhbWlseQkgPSBuLT5vcHMtPmZhbWlseTsKKwluZG0tPm5kbV9wYWQxICAgID0gMDsKKwluZG0tPm5kbV9wYWQyICAgID0gMDsKIAluZG0tPm5kbV9mbGFncwkgPSBuLT5mbGFnczsKIAluZG0tPm5kbV90eXBlCSA9IG4tPnR5cGU7CiAJbmRtLT5uZG1faWZpbmRleCA9IG4tPmRldi0+aWZpbmRleDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggYzU3YjA2Yi4uOTc1ZDY1MSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1leC5oPgogCiAKLSNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MTogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCisjZGVmaW5lIFZFUlNJT04gICJwa3RnZW4gdjIuNjI6IFBhY2tldCBHZW5lcmF0b3IgZm9yIHBhY2tldCBwZXJmb3JtYW5jZSB0ZXN0aW5nLlxuIgogCiAvKiAjZGVmaW5lIFBHX0RFQlVHKGEpIGEgKi8KICNkZWZpbmUgUEdfREVCVUcoYSkgCkBAIC0xOTIxLDYgKzE5MjEsMTEgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKICAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CiAgICAgICAgIAorCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCisJICogZmllbGRzLgorCSAqLworCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKKwogCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewogCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwpAQCAtMTkzNCwxMSArMTkzOSw2IEBACiAJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKLSAgICAgICAgLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKLSAgICAgICAgICogZmllbGRzLgotICAgICAgICAgKi8KLSAgICAgICAgbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwotCiAJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKIAkqKHUxNiopJmV0aFsxMl0gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKIApAQCAtMjE5Miw3ICsyMTkyLDEyIEBACiAJaW50IGRhdGFsZW47CiAJc3RydWN0IGlwdjZoZHIgKmlwaDsKICAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7Ci0gICAgICAgIAorCisJLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKKwkgKiBmaWVsZHMuCisJICovCisJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOworCiAJc2tiID0gYWxsb2Nfc2tiKHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgMTYsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7CiAJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gbWVtb3J5Iik7CkBAIC0yMjA2LDE3ICsyMjExLDkgQEAKIAlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKLQotICAgICAgICAvKiBVcGRhdGUgYW55IG9mIHRoZSB2YWx1ZXMsIHVzZWQgd2hlbiB3ZSdyZSBpbmNyZW1lbnRpbmcgdmFyaW91cwotICAgICAgICAgKiBmaWVsZHMuCi0gICAgICAgICAqLwotCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKLQotCQogCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CiAJKih1MTYqKSZldGhbMTJdID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKLQkKLSAgICAgICAgCisKIAlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplLTE0LSAKIAkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKS1zaXplb2Yoc3RydWN0IHVkcGhkcik7IC8qIEV0aCArIElQaCArIFVEUGggKi8KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCBlMDEzZDgzLi40YjFiYjMwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtMTI2LDYgKzEyNiw3IEBACiAJcnRhLT5ydGFfdHlwZSA9IGF0dHJ0eXBlOwogCXJ0YS0+cnRhX2xlbiA9IHNpemU7CiAJbWVtY3B5KFJUQV9EQVRBKHJ0YSksIGRhdGEsIGF0dHJsZW4pOworCW1lbXNldChSVEFfREFUQShydGEpICsgYXR0cmxlbiwgMCwgUlRBX0FMSUdOKHNpemUpIC0gc2l6ZSk7CiB9CiAKIHNpemVfdCBydGF0dHJfc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBzdHJ1Y3QgcnRhdHRyICpydGEsIHNpemVfdCBzaXplKQpAQCAtMTg4LDYgKzE4OSw3IEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqciksIGZsYWdzKTsKIAlyID0gTkxNU0dfREFUQShubGgpOwogCXItPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJci0+X19pZmlfcGFkID0gMDsKIAlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKIAlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCBiYjczYjIxLi43ZWFiODY3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgKglCdWZmZXJzIG1heSBvbmx5IGJlIGFsbG9jYXRlZCBmcm9tIGludGVycnVwdHMgdXNpbmcgYSBAZ2ZwX21hc2sgb2YKICAqCSVHRlBfQVRPTUlDLgogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1OCAqZGF0YTsKQEAgLTE4Miw3ICsxODIsOCBAQAogICoJJUdGUF9BVE9NSUMuCiAgKi8KIHN0cnVjdCBza19idWZmICphbGxvY19za2JfZnJvbV9jYWNoZShrbWVtX2NhY2hlX3QgKmNwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBnZnBfbWFzaykKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTggKmRhdGE7CkBAIC0zMjIsNyArMzIzLDcgQEAKICAqCSVHRlBfQVRPTUlDLgogICovCiAKLXN0cnVjdCBza19idWZmICpza2JfY2xvbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQorc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm4gPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hlLCBnZnBfbWFzayk7CiAKQEAgLTM1Nyw3ICszNTgsNiBAQAogCUMoaXBfc3VtbWVkKTsKIAlDKHByaW9yaXR5KTsKIAlDKHByb3RvY29sKTsKLQlDKHNlY3VyaXR5KTsKIAluLT5kZXN0cnVjdG9yID0gTlVMTDsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJQyhuZm1hcmspOwpAQCAtMzc3LDggKzM3Nyw4IEBACiAJQyh0Y19pbmRleCk7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJbi0+dGNfdmVyZCA9IFNFVF9UQ19WRVJEKHNrYi0+dGNfdmVyZCwwKTsKLQluLT50Y192ZXJkID0gQ0xSX1RDX09LMk1VTkdFKHNrYi0+dGNfdmVyZCk7Ci0Jbi0+dGNfdmVyZCA9IENMUl9UQ19NVU5HRUQoc2tiLT50Y192ZXJkKTsKKwluLT50Y192ZXJkID0gQ0xSX1RDX09LMk1VTkdFKG4tPnRjX3ZlcmQpOworCW4tPnRjX3ZlcmQgPSBDTFJfVENfTVVOR0VEKG4tPnRjX3ZlcmQpOwogCUMoaW5wdXRfZGV2KTsKIAlDKHRjX2NsYXNzaWQpOwogI2VuZGlmCkBAIC00MjIsNyArNDIyLDYgQEAKIAluZXctPnBrdF90eXBlCT0gb2xkLT5wa3RfdHlwZTsKIAluZXctPnN0YW1wCT0gb2xkLT5zdGFtcDsKIAluZXctPmRlc3RydWN0b3IgPSBOVUxMOwotCW5ldy0+c2VjdXJpdHkJPSBvbGQtPnNlY3VyaXR5OwogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIAluZXctPm5mbWFyawk9IG9sZC0+bmZtYXJrOwogCW5ldy0+bmZjYWNoZQk9IG9sZC0+bmZjYWNoZTsKQEAgLTQ2Miw3ICs0NjEsNyBAQAogICoJaGVhZGVyIGlzIGdvaW5nIHRvIGJlIG1vZGlmaWVkLiBVc2UgcHNrYl9jb3B5KCkgaW5zdGVhZC4KICAqLwogCi1zdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQorc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlpbnQgaGVhZGVybGVuID0gc2tiLT5kYXRhIC0gc2tiLT5oZWFkOwogCS8qCkBAIC01MDEsNyArNTAwLDcgQEAKICAqCVRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAkvKgogCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgpAQCAtNTU5LDcgKzU1OCw4IEBACiAgKglyZWxvYWRlZCBhZnRlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCiAgKi8KIAotaW50IHBza2JfZXhwYW5kX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5oZWFkLCBpbnQgbnRhaWwsIGludCBnZnBfbWFzaykKK2ludCBwc2tiX2V4cGFuZF9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBuaGVhZCwgaW50IG50YWlsLAorCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlpbnQgaTsKIAl1OCAqZGF0YTsKQEAgLTY0OSw3ICs2NDksOCBAQAogICoJb25seSBieSBuZXRmaWx0ZXIgaW4gdGhlIGNhc2VzIHdoZW4gY2hlY2tzdW0gaXMgcmVjYWxjdWxhdGVkPyAtLUFOSwogICovCiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHlfZXhwYW5kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJaW50IG5ld2hlYWRyb29tLCBpbnQgbmV3dGFpbHJvb20sIGludCBnZnBfbWFzaykKKwkJCQlpbnQgbmV3aGVhZHJvb20sIGludCBuZXd0YWlscm9vbSwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJLyoKIAkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCBhNmVjM2FkLi44YjM1Y2NkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC02MjIsNyArNjIyLDggQEAKICAqCUBwcm90OiBzdHJ1Y3QgcHJvdG8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IHNvY2sgaW5zdGFuY2UKICAqCUB6ZXJvX2l0OiBpZiB3ZSBzaG91bGQgemVybyB0aGUgbmV3bHkgYWxsb2NhdGVkIHNvY2sKICAqLwotc3RydWN0IHNvY2sgKnNrX2FsbG9jKGludCBmYW1pbHksIGludCBwcmlvcml0eSwgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCkKK3N0cnVjdCBzb2NrICpza19hbGxvYyhpbnQgZmFtaWx5LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHksCisJCSAgICAgIHN0cnVjdCBwcm90byAqcHJvdCwgaW50IHplcm9faXQpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKIAlrbWVtX2NhY2hlX3QgKnNsYWIgPSBwcm90LT5zbGFiOwpAQCAtNzUwLDcgKzc1MSw4IEBACiAvKgogICogQWxsb2NhdGUgYSBza2IgZnJvbSB0aGUgc29ja2V0J3Mgc2VuZCBidWZmZXIuCiAgKi8KLXN0cnVjdCBza19idWZmICpzb2NrX3dtYWxsb2Moc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmb3JjZSwgaW50IHByaW9yaXR5KQorc3RydWN0IHNrX2J1ZmYgKnNvY2tfd21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpCiB7CiAJaWYgKGZvcmNlIHx8IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCBzay0+c2tfc25kYnVmKSB7CiAJCXN0cnVjdCBza19idWZmICogc2tiID0gYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5KTsKQEAgLTc2NSw3ICs3NjcsOCBAQAogLyoKICAqIEFsbG9jYXRlIGEgc2tiIGZyb20gdGhlIHNvY2tldCdzIHJlY2VpdmUgYnVmZmVyLgogICovIAotc3RydWN0IHNrX2J1ZmYgKnNvY2tfcm1hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLCBpbnQgcHJpb3JpdHkpCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja19ybWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlpZiAoZm9yY2UgfHwgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8IHNrLT5za19yY3ZidWYpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplLCBwcmlvcml0eSk7CkBAIC03ODAsNyArNzgzLDcgQEAKIC8qIAogICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSB0aGUgc29ja2V0J3Mgb3B0aW9uIG1lbW9yeSBidWZmZXIuCiAgKi8gCi12b2lkICpzb2NrX2ttYWxsb2Moc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSwgaW50IHByaW9yaXR5KQordm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlpZiAoKHVuc2lnbmVkKXNpemUgPD0gc3lzY3RsX29wdG1lbV9tYXggJiYKIAkgICAgYXRvbWljX3JlYWQoJnNrLT5za19vbWVtX2FsbG9jKSArIHNpemUgPCBzeXNjdGxfb3B0bWVtX21heCkgewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvd2lyZWxlc3MuYyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKaW5kZXggYjJmZTM3OC4uM2ZmNTYzOSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvd2lyZWxlc3MuYworKysgYi9uZXQvY29yZS93aXJlbGVzcy5jCkBAIC0xMTAyLDYgKzExMDIsNyBAQAogCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIHR5cGUsIHNpemVvZigqcikpOwogCXIgPSBOTE1TR19EQVRBKG5saCk7CiAJci0+aWZpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlyLT5fX2lmaV9wYWQgPSAwOwogCXItPmlmaV90eXBlID0gZGV2LT50eXBlOwogCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKIAlyLT5pZmlfZmxhZ3MgPSBkZXYtPmZsYWdzOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9LY29uZmlnIGIvbmV0L2RlY25ldC9LY29uZmlnCmluZGV4IDIxMDFkYTUuLjkyZjJlYzQgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvS2NvbmZpZworKysgYi9uZXQvZGVjbmV0L0tjb25maWcKQEAgLTEsNiArMSwyOSBAQAogIwogIyBERUNuZXQgY29uZmlndXJhdGlvbgogIworY29uZmlnIERFQ05FVAorCXRyaXN0YXRlICJERUNuZXQgU3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGUgREVDbmV0IG5ldHdvcmtpbmcgcHJvdG9jb2wgd2FzIHVzZWQgaW4gbWFueSBwcm9kdWN0cyBtYWRlIGJ5CisJICBEaWdpdGFsIChub3cgQ29tcGFxKS4gIEl0IHByb3ZpZGVzIHJlbGlhYmxlIHN0cmVhbSBhbmQgc2VxdWVuY2VkCisJICBwYWNrZXQgY29tbXVuaWNhdGlvbnMgb3ZlciB3aGljaCBydW4gYSB2YXJpZXR5IG9mIHNlcnZpY2VzIHNpbWlsYXIKKwkgIHRvIHRob3NlIHdoaWNoIHJ1biBvdmVyIFRDUC9JUC4KKworCSAgVG8gZmluZCBzb21lIHRvb2xzIHRvIHVzZSB3aXRoIHRoZSBrZXJuZWwgbGF5ZXIgc3VwcG9ydCwgcGxlYXNlCisJICBsb29rIGF0IFBhdHJpY2sgQ2F1bGZpZWxkJ3Mgd2ViIHNpdGU6CisJICA8aHR0cDovL2xpbnV4LWRlY25ldC5zb3VyY2Vmb3JnZS5uZXQvPi4KKworCSAgTW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RlY25ldC50eHQ+LgorCisJICBCZSBzdXJlIHRvIHNheSBZIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBhbmQgIlN5c2N0bCBzdXBwb3J0IgorCSAgYmVsb3cgd2hlbiB1c2luZyBERUNuZXQsIHNpbmNlIHlvdSB3aWxsIG5lZWQgc3lzY3RsIHN1cHBvcnQgdG8gYWlkCisJICBpbiBjb25maWd1cmF0aW9uIGF0IHJ1biB0aW1lLgorCisJICBUaGUgREVDbmV0IGNvZGUgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCisJICBUaGUgbW9kdWxlIGlzIGNhbGxlZCBkZWNuZXQuCisKIGNvbmZpZyBERUNORVRfUk9VVEVSCiAJYm9vbCAiREVDbmV0OiByb3V0ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIERFQ05FVCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCmluZGV4IDI5YmIzY2QuLjk2YTAyODAgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKKysrIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJICogd2UgYXJlIGRvdWJsZSBjaGVja2luZyB0aGF0IHdlIGFyZSBub3Qgc2VuZGluZyB0b28KIAkgKiBtYW55IG9mIHRoZXNlIGtlZXBhbGl2ZSBmcmFtZXMuCiAJICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkgPT0gMCkKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3htaXRfcXVldWUpKQogCQlkbl9uc3Bfc2VuZF9saW5rKHNrLCBETl9OT0NIQU5HRSwgMCk7CiB9CiAKQEAgLTExOTEsNyArMTE5MSw3IEBACiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwogCWludCBtYXNrID0gZGF0YWdyYW1fcG9sbChmaWxlLCBzb2NrLCB3YWl0KTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKQogCQltYXNrIHw9IFBPTExSREJBTkQ7CiAKIAlyZXR1cm4gbWFzazsKQEAgLTEyMTQsNyArMTIxNCw3IEBACiAKIAljYXNlIFNJT0NBVE1BUks6CiAJCWxvY2tfc29jayhzayk7Ci0JCXZhbCA9IChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpICE9IDApOworCQl2YWwgPSAhc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpOwogCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9SVU4pCiAJCQl2YWwgPSAtRU5PVENPTk47CiAJCXJlbGVhc2Vfc29jayhzayk7CkBAIC0xNjMwLDcgKzE2MzAsNyBAQAogCWludCBsZW4gPSAwOwogCiAJaWYgKGZsYWdzICYgTVNHX09PQikKLQkJcmV0dXJuIHNrYl9xdWV1ZV9sZW4ocSkgPyAxIDogMDsKKwkJcmV0dXJuICFza2JfcXVldWVfZW1wdHkocSkgPyAxIDogMDsKIAogCXdoaWxlKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKilxKSB7CiAJCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CkBAIC0xNzA3LDcgKzE3MDcsNyBAQAogCQlpZiAoc2stPnNrX2VycikKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKSB7CisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKSB7CiAJCQlpZiAoIShmbGFncyAmIE1TR19PT0IpKSB7CiAJCQkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX09PQjsKIAkJCQlpZiAoIXNjcC0+b3RoZXJfcmVwb3J0KSB7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2ZpYi5jIGIvbmV0L2RlY25ldC9kbl9maWIuYwppbmRleCA5OTM0YjI1Li45OWJjMDYxIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2ZpYi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZmliLmMKQEAgLTU1MSw3ICs1NTEsOCBAQAogCQlpZiAodCA8IHNfdCkKIAkJCWNvbnRpbnVlOwogCQlpZiAodCA+IHNfdCkKLQkJCW1lbXNldCgmY2ItPmFyZ3NbMV0sIDAsIHNpemVvZihjYi0+YXJncyktc2l6ZW9mKGludCkpOworCQkJbWVtc2V0KCZjYi0+YXJnc1sxXSwgMCwKKwkJCSAgICAgICBzaXplb2YoY2ItPmFyZ3MpIC0gc2l6ZW9mKGNiLT5hcmdzWzBdKSk7CiAJCXRiID0gZG5fZmliX2dldF90YWJsZSh0LCAwKTsKIAkJaWYgKHRiID09IE5VTEwpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKaW5kZXggNDJhYmJmMy4uOGNjZTFmZCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKKysrIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKQEAgLTM0Miw3ICszNDIsOCBAQAogCiAJZG5fbnNwX291dHB1dChzayk7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5kYXRhX3htaXRfcXVldWUpIHx8IHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNjcC0+ZGF0YV94bWl0X3F1ZXVlKSB8fAorCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3htaXRfcXVldWUpKQogCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvS2NvbmZpZyBiL25ldC9lY29uZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEyZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2Vjb25ldC9LY29uZmlnCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgQWNvcm4gRWNvbmV0L0FVTiBwcm90b2NvbHMgCisjCisKK2NvbmZpZyBFQ09ORVQKKwl0cmlzdGF0ZSAiQWNvcm4gRWNvbmV0L0FVTiBwcm90b2NvbHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSU5FVAorCS0tLWhlbHAtLS0KKwkgIEVjb25ldCBpcyBhIGZhaXJseSBvbGQgYW5kIHNsb3cgbmV0d29ya2luZyBwcm90b2NvbCBtYWlubHkgdXNlZCBieQorCSAgQWNvcm4gY29tcHV0ZXJzIHRvIGFjY2VzcyBmaWxlIGFuZCBwcmludCBzZXJ2ZXJzLiBJdCB1c2VzIG5hdGl2ZQorCSAgRWNvbmV0IG5ldHdvcmsgY2FyZHMuIEFVTiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGlnaGVyIGxldmVsCisJICBwYXJ0cyBvZiBFY29uZXQgdGhhdCBydW5zIG92ZXIgb3JkaW5hcnkgRXRoZXJuZXQgY29ubmVjdGlvbnMsIG9uCisJICB0b3Agb2YgdGhlIFVEUCBwYWNrZXQgcHJvdG9jb2wsIHdoaWNoIGluIHR1cm4gcnVucyBvbiB0b3Agb2YgdGhlCisJICBJbnRlcm5ldCBwcm90b2NvbCBJUC4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSBjYW4gY2hvb3NlIHdpdGggdGhlIG5leHQgdHdvIG9wdGlvbnMgd2hldGhlcgorCSAgdG8gc2VuZCBFY29uZXQvQVVOIHRyYWZmaWMgb3ZlciBhIFVEUCBFdGhlcm5ldCBjb25uZWN0aW9uIG9yIG92ZXIKKwkgIGEgbmF0aXZlIEVjb25ldCBuZXR3b3JrIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVjb25ldC4KKworY29uZmlnIEVDT05FVF9BVU5VRFAKKwlib29sICJBVU4gb3ZlciBVRFAiCisJZGVwZW5kcyBvbiBFQ09ORVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAKKwkgIGNvbm5lY3Rpb24gKFVEUCBpcyBhIHBhY2tldCBiYXNlZCBwcm90b2NvbCB0aGF0IHJ1bnMgb24gdG9wIG9mIHRoZQorCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVApIHVzaW5nIGFuIG9yZGluYXJ5IEV0aGVybmV0IG5ldHdvcmsgY2FyZC4KKworY29uZmlnIEVDT05FVF9OQVRJVkUKKwlib29sICJOYXRpdmUgRWNvbmV0IgorCWRlcGVuZHMgb24gRUNPTkVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkIGluc3RhbGxlZCBpbgorCSAgeW91ciBjb21wdXRlci4KZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguYwppbmRleCA2NjE3ZWE0Li5mNmRiZmI5IDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmMKKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jCkBAIC05MiwxMCArOTIsOSBAQAogCSAqCVNldCB0aGUgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuIAogCSAqLwogCSAKLQlpZihzYWRkcikKLQkJbWVtY3B5KGV0aC0+aF9zb3VyY2Usc2FkZHIsZGV2LT5hZGRyX2xlbik7Ci0JZWxzZQotCQltZW1jcHkoZXRoLT5oX3NvdXJjZSxkZXYtPmRldl9hZGRyLGRldi0+YWRkcl9sZW4pOworCWlmKCFzYWRkcikKKwkJc2FkZHIgPSBkZXYtPmRldl9hZGRyOworCW1lbWNweShldGgtPmhfc291cmNlLHNhZGRyLGRldi0+YWRkcl9sZW4pOwogCiAJLyoKIAkgKglBbnl3YXksIHRoZSBsb29wYmFjay1kZXZpY2Ugc2hvdWxkIG5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLi4uIApAQCAtMTU2LDcgKzE1NSw3IEBACiAgKglUaGlzIGlzIG5vcm1hbCBwcmFjdGljZSBhbmQgd29ya3MgZm9yIGFueSAnbm93IGluIHVzZScgcHJvdG9jb2wuCiAgKi8KICAKLXVuc2lnbmVkIHNob3J0IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L0tjb25maWcgYi9uZXQvaXB2NC9LY29uZmlnCmluZGV4IDM0NzA4MzQuLmZjNTYxYzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L0tjb25maWcKKysrIGIvbmV0L2lwdjQvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKICMKIGNvbmZpZyBJUF9NVUxUSUNBU1QKIAlib29sICJJUDogbXVsdGljYXN0aW5nIgotCWRlcGVuZHMgb24gSU5FVAogCWhlbHAKIAkgIFRoaXMgaXMgY29kZSBmb3IgYWRkcmVzc2luZyBzZXZlcmFsIG5ldHdvcmtlZCBjb21wdXRlcnMgYXQgb25jZSwKIAkgIGVubGFyZ2luZyB5b3VyIGtlcm5lbCBieSBhYm91dCAyIEtCLiBZb3UgbmVlZCBtdWx0aWNhc3RpbmcgaWYgeW91CkBAIC0xNyw3ICsxNiw2IEBACiAKIGNvbmZpZyBJUF9BRFZBTkNFRF9ST1VURVIKIAlib29sICJJUDogYWR2YW5jZWQgcm91dGVyIgotCWRlcGVuZHMgb24gSU5FVAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBpbnRlbmQgdG8gcnVuIHlvdXIgTGludXggYm94IG1vc3RseSBhcyBhIHJvdXRlciwgaS5lLiBhcyBhCiAJICBjb21wdXRlciB0aGF0IGZvcndhcmRzIGFuZCByZWRpc3RyaWJ1dGVzIG5ldHdvcmsgcGFja2V0cywgc2F5IFk7IHlvdQpAQCAtNTYsOSArNTQsOSBAQAogY2hvaWNlIAogCXByb21wdCAiQ2hvb3NlIElQOiBGSUIgbG9va3VwIGFsZ29yaXRobSAoY2hvb3NlIEZJQl9IQVNIIGlmIHVuc3VyZSkiCiAJZGVwZW5kcyBvbiBJUF9BRFZBTkNFRF9ST1VURVIKLQlkZWZhdWx0IElQX0ZJQl9IQVNICisJZGVmYXVsdCBBU0tfSVBfRklCX0hBU0gKIAotY29uZmlnIElQX0ZJQl9IQVNICitjb25maWcgQVNLX0lQX0ZJQl9IQVNICiAJYm9vbCAiRklCX0hBU0giCiAJLS0taGVscC0tLQogCUN1cnJlbnQgRklCIGlzIHZlcnkgcHJvdmVuIGFuZCBnb29kIGVub3VnaCBmb3IgbW9zdCB1c2Vycy4KQEAgLTg0LDEyICs4Miw4IEBACiAgICAgICAgCiBlbmRjaG9pY2UKIAotIyBJZiB0aGUgdXNlciBkb2VzIG5vdCBlbmFibGUgYWR2YW5jZWQgcm91dGluZywgaGUgZ2V0cyB0aGUgc2FmZQotIyBkZWZhdWx0IG9mIHRoZSBmaWItaGFzaCBhbGdvcml0aG0uCiBjb25maWcgSVBfRklCX0hBU0gKLQlib29sCi0JZGVwZW5kcyBvbiAhSVBfQURWQU5DRURfUk9VVEVSCi0JZGVmYXVsdCB5CisJZGVmX2Jvb2wgQVNLX0lQX0ZJQl9IQVNIIHx8ICFJUF9BRFZBTkNFRF9ST1VURVIKIAogY29uZmlnIElQX01VTFRJUExFX1RBQkxFUwogCWJvb2wgIklQOiBwb2xpY3kgcm91dGluZyIKQEAgLTE4Myw3ICsxNzcsNiBAQAogCiBjb25maWcgSVBfUE5QCiAJYm9vbCAiSVA6IGtlcm5lbCBsZXZlbCBhdXRvY29uZmlndXJhdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24gb2YgSVAgYWRkcmVzc2VzIG9mIGRldmljZXMgYW5kCiAJICBvZiB0aGUgcm91dGluZyB0YWJsZSBkdXJpbmcga2VybmVsIGJvb3QsIGJhc2VkIG9uIGVpdGhlciBpbmZvcm1hdGlvbgpAQCAtMjQyLDggKzIzNSw2IEBACiAjICAgYm9vbCAnICAgIElQOiBBUlAgc3VwcG9ydCcgQ09ORklHX0lQX1BOUF9BUlAJCQogY29uZmlnIE5FVF9JUElQCiAJdHJpc3RhdGUgIklQOiB0dW5uZWxpbmciCi0JZGVwZW5kcyBvbiBJTkVUCi0Jc2VsZWN0IElORVRfVFVOTkVMCiAJLS0taGVscC0tLQogCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KIAkgIGFub3RoZXIgcHJvdG9jb2wgYW5kIHNlbmRpbmcgaXQgb3ZlciBhIGNoYW5uZWwgdGhhdCB1bmRlcnN0YW5kcyB0aGUKQEAgLTI2MCw4ICsyNTEsNiBAQAogCiBjb25maWcgTkVUX0lQR1JFCiAJdHJpc3RhdGUgIklQOiBHUkUgdHVubmVscyBvdmVyIElQIgotCWRlcGVuZHMgb24gSU5FVAotCXNlbGVjdCBYRlJNCiAJaGVscAogCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KIAkgIGFub3RoZXIgcHJvdG9jb2wgYW5kIHNlbmRpbmcgaXQgb3ZlciBhIGNoYW5uZWwgdGhhdCB1bmRlcnN0YW5kcyB0aGUKQEAgLTMxOSw3ICszMDgsNyBAQAogCiBjb25maWcgQVJQRAogCWJvb2wgIklQOiBBUlAgZGFlbW9uIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgTm9ybWFsbHksIHRoZSBrZXJuZWwgbWFpbnRhaW5zIGFuIGludGVybmFsIGNhY2hlIHdoaWNoIG1hcHMgSVAKIAkgIGFkZHJlc3NlcyB0byBoYXJkd2FyZSBhZGRyZXNzZXMgb24gdGhlIGxvY2FsIG5ldHdvcmssIHNvIHRoYXQKQEAgLTM0NCw3ICszMzMsNiBAQAogCiBjb25maWcgU1lOX0NPT0tJRVMKIAlib29sICJJUDogVENQIHN5bmNvb2tpZSBzdXBwb3J0IChkaXNhYmxlZCBwZXIgZGVmYXVsdCkiCi0JZGVwZW5kcyBvbiBJTkVUCiAJLS0taGVscC0tLQogCSAgTm9ybWFsIFRDUC9JUCBuZXR3b3JraW5nIGlzIG9wZW4gdG8gYW4gYXR0YWNrIGtub3duIGFzICJTWU4KIAkgIGZsb29kaW5nIi4gVGhpcyBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2sgcHJldmVudHMgbGVnaXRpbWF0ZSByZW1vdGUKQEAgLTM4MSw3ICszNjksNiBAQAogCiBjb25maWcgSU5FVF9BSAogCXRyaXN0YXRlICJJUDogQUggdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19ITUFDCkBAIC0zOTQsNyArMzgxLDYgQEAKIAogY29uZmlnIElORVRfRVNQCiAJdHJpc3RhdGUgIklQOiBFU1AgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19ITUFDCkBAIC00MDgsNyArMzk0LDYgQEAKIAogY29uZmlnIElORVRfSVBDT01QCiAJdHJpc3RhdGUgIklQOiBJUENvbXAgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgSU5FVF9UVU5ORUwKIAlzZWxlY3QgQ1JZUFRPCkBAIC00MjEsNyArNDA2LDYgQEAKIAogY29uZmlnIElORVRfVFVOTkVMCiAJdHJpc3RhdGUgIklQOiB0dW5uZWwgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBnZW5lcmljIElQIHR1bm5lbCB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggaXMgcmVxdWlyZWQgYnkKQEAgLTQzMSw3ICs0MTUsNiBAQAogCiBjb25maWcgSVBfVENQRElBRwogCXRyaXN0YXRlICJJUDogVENQIHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZSIKLQlkZXBlbmRzIG9uIElORVQKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBUQ1Agc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkgbmF0aXZlIExpbnV4CkBAIC00NDcsOCArNDMwLDYgQEAKIAogY29uZmlnIFRDUF9DT05HX0FEVkFOQ0VECiAJYm9vbCAiVENQOiBhZHZhbmNlZCBjb25nZXN0aW9uIGNvbnRyb2wiCi0JZGVwZW5kcyBvbiBJTkVUCi0JZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3Igc2VsZWN0aW9uIG9mIHZhcmlvdXMgVENQIGNvbmdlc3Rpb24gY29udHJvbAogCSAgbW9kdWxlcy4KQEAgLTQ2NCw3ICs0NDUsNiBAQAogCiBjb25maWcgVENQX0NPTkdfQklDCiAJdHJpc3RhdGUgIkJpbmFyeSBJbmNyZWFzZSBDb25nZXN0aW9uIChCSUMpIGNvbnRyb2wiCi0JZGVwZW5kcyBvbiBJTkVUCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCUJJQy1UQ1AgaXMgYSBzZW5kZXItc2lkZSBvbmx5IGNoYW5nZSB0aGF0IGVuc3VyZXMgYSBsaW5lYXIgUlRUCkBAIC00NzksNyArNDU5LDYgQEAKIAogY29uZmlnIFRDUF9DT05HX1dFU1RXT09ECiAJdHJpc3RhdGUgIlRDUCBXZXN0d29vZCsiCi0JZGVwZW5kcyBvbiBJTkVUCiAJZGVmYXVsdCBtCiAJLS0taGVscC0tLQogCVRDUCBXZXN0d29vZCsgaXMgYSBzZW5kZXItc2lkZSBvbmx5IG1vZGlmaWNhdGlvbiBvZiB0aGUgVENQIFJlbm8KQEAgLTQ5NCw3ICs0NzMsNiBAQAogCiBjb25maWcgVENQX0NPTkdfSFRDUAogICAgICAgICB0cmlzdGF0ZSAiSC1UQ1AiCi0JZGVwZW5kcyBvbiBJTkVUCiAgICAgICAgIGRlZmF1bHQgbQogCS0tLWhlbHAtLS0KIAlILVRDUCBpcyBhIHNlbmQtc2lkZSBvbmx5IG1vZGlmaWNhdGlvbnMgb2YgdGhlIFRDUCBSZW5vCkBAIC01MDYsNyArNDg0LDcgQEAKIAogY29uZmlnIFRDUF9DT05HX0hTVENQCiAJdHJpc3RhdGUgIkhpZ2ggU3BlZWQgVENQIgotCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAlTYWxseSBGbG95ZCdzIEhpZ2ggU3BlZWQgVENQIChSRkMgMzY0OSkgY29uZ2VzdGlvbiBjb250cm9sLgpAQCAtNTE3LDcgKzQ5NSw3IEBACiAKIGNvbmZpZyBUQ1BfQ09OR19IWUJMQQogCXRyaXN0YXRlICJUQ1AtSHlibGEgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobSIKLQlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVENQLUh5YmxhIGlzIGEgc2VuZGVyLXNpZGUgb25seSBjaGFuZ2UgdGhhdCBlbGltaW5hdGVzIHBlbmFsaXphdGlvbiBvZgpAQCAtNTI3LDcgKzUwNSw3IEBACiAKIGNvbmZpZyBUQ1BfQ09OR19WRUdBUwogCXRyaXN0YXRlICJUQ1AgVmVnYXMiCi0JZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCVRDUCBWZWdhcyBpcyBhIHNlbmRlci1zaWRlIG9ubHkgY2hhbmdlIHRvIFRDUCB0aGF0IGFudGljaXBhdGVzCkBAIC01MzgsNyArNTE2LDcgQEAKIAogY29uZmlnIFRDUF9DT05HX1NDQUxBQkxFCiAJdHJpc3RhdGUgIlNjYWxhYmxlIFRDUCIKLQlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJU2NhbGFibGUgVENQIGlzIGEgc2VuZGVyLXNpZGUgb25seSBjaGFuZ2UgdG8gVENQIHdoaWNoIHVzZXMgYQpAQCAtNTQ5LDcgKzUyNyw3IEBACiBlbmRtZW51CiAKIGNvbmZpZyBUQ1BfQ09OR19CSUMKLQlib29sZWFuCisJdHJpc3RhdGUKIAlkZXBlbmRzIG9uICFUQ1BfQ09OR19BRFZBTkNFRAogCWRlZmF1bHQgeQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggNjU4ZTc5Ny4uMTYzYWU0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMTAwOSw2ICsxMDA5LDE1IEBACiBzdGF0aWMgaW50IGlwdjRfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBmcmFnX2luaXQodm9pZCk7CiAKKy8qCisgKglJUCBwcm90b2NvbCBsYXllciBpbml0aWFsaXNlcgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgaXBfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKKwkuZnVuYyA9IGlwX3JjdiwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGluZXRfaW5pdCh2b2lkKQogewogCXN0cnVjdCBza19idWZmICpkdW1teV9za2I7CkBAIC0xMTAyLDYgKzExMTEsOCBAQAogCiAJaXBmcmFnX2luaXQoKTsKIAorCWRldl9hZGRfcGFjaygmaXBfcGFja2V0X3R5cGUpOworCiAJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKQEAgLTExNDYsNyArMTE1Nyw3IEBACiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFCiAgICAgICAgICBpZiAoZmliX3N0YXRfcHJvY19pbml0KCkpCiAgICAgICAgICAgICAgICAgIGdvdG8gb3V0X2ZpYl9zdGF0OwotICNlbmRpZgorI2VuZGlmCiAJaWYgKGlwX21pc2NfcHJvY19pbml0KCkpCiAJCWdvdG8gb3V0X21pc2M7CiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCAwNjcxNTY5Li5hNzAxNDA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC4zMjMiCisjZGVmaW5lIFZFUlNJT04gIjAuMzI1IgogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTkwLDE0ICs5MCwxNCBAQAogI2RlZmluZSBUX0xFQUYgIDEKICNkZWZpbmUgTk9ERV9UWVBFX01BU0sJMHgxVUwKICNkZWZpbmUgTk9ERV9QQVJFTlQoX25vZGUpIFwKLSgoc3RydWN0IHRub2RlICopKChfbm9kZSktPl9wYXJlbnQgJiB+Tk9ERV9UWVBFX01BU0spKQorCSgoc3RydWN0IHRub2RlICopKChfbm9kZSktPl9wYXJlbnQgJiB+Tk9ERV9UWVBFX01BU0spKQogI2RlZmluZSBOT0RFX1NFVF9QQVJFTlQoX25vZGUsIF9wdHIpIFwKLSgoX25vZGUpLT5fcGFyZW50ID0gKCgodW5zaWduZWQgbG9uZykoX3B0cikpIHwgXAorCSgoX25vZGUpLT5fcGFyZW50ID0gKCgodW5zaWduZWQgbG9uZykoX3B0cikpIHwgXAogICAgICAgICAgICAgICAgICAgICAgKChfbm9kZSktPl9wYXJlbnQgJiBOT0RFX1RZUEVfTUFTSykpKQogI2RlZmluZSBOT0RFX0lOSVRfUEFSRU5UKF9ub2RlLCBfdHlwZSkgXAotKChfbm9kZSktPl9wYXJlbnQgPSAoX3R5cGUpKQorCSgoX25vZGUpLT5fcGFyZW50ID0gKF90eXBlKSkKICNkZWZpbmUgTk9ERV9UWVBFKF9ub2RlKSBcCi0oKF9ub2RlKS0+X3BhcmVudCAmIE5PREVfVFlQRV9NQVNLKQorCSgoX25vZGUpLT5fcGFyZW50ICYgTk9ERV9UWVBFX01BU0spCiAKICNkZWZpbmUgSVNfVE5PREUobikgKCEobi0+X3BhcmVudCAmIFRfTEVBRikpCiAjZGVmaW5lIElTX0xFQUYobikgKG4tPl9wYXJlbnQgJiBUX0xFQUYpCkBAIC0xMzYsNiArMTM2LDcgQEAKIAl1bnNpZ25lZCBpbnQgc2VtYW50aWNfbWF0Y2hfcGFzc2VkOwogCXVuc2lnbmVkIGludCBzZW1hbnRpY19tYXRjaF9taXNzOwogCXVuc2lnbmVkIGludCBudWxsX25vZGVfaGl0OworCXVuc2lnbmVkIGludCByZXNpemVfbm9kZV9za2lwcGVkOwogfTsKICNlbmRpZgogCkBAIC0xNDYsNyArMTQ3LDcgQEAKIAl1bnNpZ25lZCBpbnQgbGVhdmVzOwogCXVuc2lnbmVkIGludCBudWxscG9pbnRlcnM7CiAJdW5zaWduZWQgaW50IG5vZGVzaXplc1tNQVhfQ0hJTERTXTsKLX07ICAgIAorfTsKIAogc3RydWN0IHRyaWUgewogICAgICAgICBzdHJ1Y3Qgbm9kZSAqdHJpZTsKQEAgLTE2NCw4ICsxNjUsOCBAQAogc3RhdGljIHZvaWQgdG5vZGVfcHV0X2NoaWxkX3Jlb3JnKHN0cnVjdCB0bm9kZSAqdG4sIGludCBpLCBzdHJ1Y3Qgbm9kZSAqbiwgaW50IHdhc2Z1bGwpOwogc3RhdGljIGludCB0bm9kZV9jaGlsZF9sZW5ndGgoc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgc3RydWN0IG5vZGUgKnJlc2l6ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bik7Ci1zdGF0aWMgc3RydWN0IHRub2RlICppbmZsYXRlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKLXN0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmluZmxhdGUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4sIGludCAqZXJyKTsKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgKmVycik7CiBzdGF0aWMgdm9pZCB0bm9kZV9mcmVlKHN0cnVjdCB0bm9kZSAqdG4pOwogc3RhdGljIHZvaWQgdHJpZV9kdW1wX3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHRyaWUgKnQpOwogZXh0ZXJuIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl9maW5kX2FsaWFzKHN0cnVjdCBsaXN0X2hlYWQgKmZhaCwgdTggdG9zLCB1MzIgcHJpbyk7CkBAIC0xODQsOSArMTg1LDkgQEAKIAlCVUcoKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm9kZSAqdG5vZGVfZ2V0X2NoaWxkKHN0cnVjdCB0bm9kZSAqdG4sIGludCBpKSAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vZGUgKnRub2RlX2dldF9jaGlsZChzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgaSkKIHsKLSAgICAgICAgaWYgKGkgPj0gIDE8PHRuLT5iaXRzKSAKKyAgICAgICAgaWYgKGkgPj0gMTw8dG4tPmJpdHMpCiAgICAgICAgICAgICAgICAgdHJpZV9idWcoInRub2RlX2dldF9jaGlsZCIpOwogCiAgICAgICAgIHJldHVybiB0bi0+Y2hpbGRbaV07CkBAIC0yMDEsNyArMjAyLDcgQEAKICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICAgfCBpIHwgaSB8IGkgfCBpIHwgaSB8IGkgfCBpIHwgTiB8IE4gfCBOIHwgUyB8IFMgfCBTIHwgUyB8IFMgfCBDIHwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUgCisgICAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQogCiAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAgIHwgQyB8IEMgfCBDIHwgdSB8IHUgfCB1IHwgdSB8IHUgfCB1IHwgdSB8IHUgfCB1IHwgdSB8IHUgfCB1IHwgdSB8CkBAIC0yMjUsMjUgKzIyNiwyNSBAQAogCiBzdGF0aWMgaW5saW5lIGludCB0a2V5X2VxdWFscyh0X2tleSBhLCB0X2tleSBiKQogewotICByZXR1cm4gYSA9PSBiOworCXJldHVybiBhID09IGI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRrZXlfc3ViX2VxdWFscyh0X2tleSBhLCBpbnQgb2Zmc2V0LCBpbnQgYml0cywgdF9rZXkgYikKIHsKLSAgICAgaWYgKGJpdHMgPT0gMCB8fCBvZmZzZXQgPj0gS0VZTEVOR1RIKQotICAgICAgICAgICAgcmV0dXJuIDE7CisJaWYgKGJpdHMgPT0gMCB8fCBvZmZzZXQgPj0gS0VZTEVOR1RIKQorCQlyZXR1cm4gMTsKICAgICAgICAgYml0cyA9IGJpdHMgPiBLRVlMRU5HVEggPyBLRVlMRU5HVEggOiBiaXRzOwogICAgICAgICByZXR1cm4gKChhIF4gYikgPDwgb2Zmc2V0KSA+PiAoS0VZTEVOR1RIIC0gYml0cykgPT0gMDsKLX0JCit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRrZXlfbWlzbWF0Y2godF9rZXkgYSwgaW50IG9mZnNldCwgdF9rZXkgYikKIHsKIAl0X2tleSBkaWZmID0gYSBeIGI7CiAJaW50IGkgPSBvZmZzZXQ7CiAKLQlpZighZGlmZikgCi0JICByZXR1cm4gMDsKLQl3aGlsZSgoZGlmZiA8PCBpKSA+PiAoS0VZTEVOR1RILTEpID09IDApCisJaWYgKCFkaWZmKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoKGRpZmYgPDwgaSkgPj4gKEtFWUxFTkdUSC0xKSA9PSAwKQogCQlpKys7CiAJcmV0dXJuIGk7CiB9CkBAIC0zMTMsNiArMzE0LDcgQEAKICAgVGhlIGJpdHMgZnJvbSAobi0+cG9zKSB0byAobi0+cG9zICsgbi0+Yml0cyAtIDEpIC0gIkMiIC0gYXJlIHRoZSBpbmRleCBpbnRvIAogICBuJ3MgY2hpbGQgYXJyYXksIGFuZCB3aWxsIG9mIGNvdXJzZSBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggY2hpbGQuCiAgIAorCiAgIFRoZSByZXN0IG9mIHRoZSBiaXRzLCBmcm9tIChuLT5wb3MgKyBuLT5iaXRzKSBvbndhcmQsIGFyZSBjb21wbGV0ZWx5IHVua25vd24KICAgYXQgdGhpcyBwb2ludC4KIApAQCAtMzIwLDcgKzMyMiw3IEBACiAKIHN0YXRpYyB2b2lkIGNoZWNrX3Rub2RlKHN0cnVjdCB0bm9kZSAqdG4pCiB7Ci0JaWYodG4gJiYgdG4tPnBvcyt0bi0+Yml0cyA+IDMyKSB7CisJaWYgKHRuICYmIHRuLT5wb3MrdG4tPmJpdHMgPiAzMikgewogCQlwcmludGsoIlROT0RFIEVSUk9SIHRuPSVwLCBwb3M9JWQsIGJpdHM9JWRcbiIsIHRuLCB0bi0+cG9zLCB0bi0+Yml0cyk7CiAJfQogfQpAQCAtMzMxLDcgKzMzMyw3IEBACiBzdGF0aWMgc3RydWN0IGxlYWYgKmxlYWZfbmV3KHZvaWQpCiB7CiAJc3RydWN0IGxlYWYgKmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGVhZiksICBHRlBfS0VSTkVMKTsKLQlpZihsKSB7CisJaWYgKGwpIHsKIAkJTk9ERV9JTklUX1BBUkVOVChsLCBUX0xFQUYpOwogCQlJTklUX0hMSVNUX0hFQUQoJmwtPmxpc3QpOwogCX0KQEAgLTM0MSw4ICszNDMsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgbGVhZl9pbmZvICpsZWFmX2luZm9fbmV3KGludCBwbGVuKQogewogCXN0cnVjdCBsZWFmX2luZm8gKmxpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxlYWZfaW5mbyksICBHRlBfS0VSTkVMKTsKLQlsaS0+cGxlbiA9IHBsZW47Ci0JSU5JVF9MSVNUX0hFQUQoJmxpLT5mYWxoKTsKKwlpZiAobGkpIHsKKwkJbGktPnBsZW4gPSBwbGVuOworCQlJTklUX0xJU1RfSEVBRCgmbGktPmZhbGgpOworCX0KIAlyZXR1cm4gbGk7CiB9CiAKQEAgLTM1NiwxMyArMzYwLDM0IEBACiAJa2ZyZWUobGkpOwogfQogCitzdGF0aWMgc3RydWN0IHRub2RlICp0bm9kZV9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpIHsKKwkJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChzdHJ1Y3QgdG5vZGUgKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fdG5vZGVfZnJlZShzdHJ1Y3QgdG5vZGUgKnRuKQoreworCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKworCSAgICAgICAgICAgICAgICAgICAgKDE8PHRuLT5iaXRzKSAqIHNpemVvZihzdHJ1Y3Qgbm9kZSAqKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUodG4pOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl0biwgZ2V0X29yZGVyKHNpemUpKTsKK30KKwogc3RhdGljIHN0cnVjdCB0bm9kZSogdG5vZGVfbmV3KHRfa2V5IGtleSwgaW50IHBvcywgaW50IGJpdHMpCiB7CiAJaW50IG5jaGlsZHJlbiA9IDE8PGJpdHM7CiAJaW50IHN6ID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKyBuY2hpbGRyZW4gKiBzaXplb2Yoc3RydWN0IG5vZGUgKik7Ci0Jc3RydWN0IHRub2RlICp0biA9IGttYWxsb2Moc3osICBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgdG5vZGUgKnRuID0gdG5vZGVfYWxsb2Moc3opOwogCi0JaWYodG4pICB7CisJaWYgKHRuKSAgewogCQltZW1zZXQodG4sIDAsIHN6KTsKIAkJTk9ERV9JTklUX1BBUkVOVCh0biwgVF9UTk9ERSk7CiAJCXRuLT5wb3MgPSBwb3M7CkBAIC0zNzEsNyArMzk2LDggQEAKIAkJdG4tPmZ1bGxfY2hpbGRyZW4gPSAwOwogCQl0bi0+ZW1wdHlfY2hpbGRyZW4gPSAxPDxiaXRzOwogCX0KLQlpZih0cmllX2RlYnVnID4gMCkgCisKKwlpZiAodHJpZV9kZWJ1ZyA+IDApCiAJCXByaW50aygiQVQgJXAgcz0ldSAldVxuIiwgdG4sICh1bnNpZ25lZCBpbnQpIHNpemVvZihzdHJ1Y3QgdG5vZGUpLAogCQkgICAgICAgKHVuc2lnbmVkIGludCkgKHNpemVvZihzdHJ1Y3Qgbm9kZSkgKiAxPDxiaXRzKSk7CiAJcmV0dXJuIHRuOwpAQCAtMzc5LDE3ICs0MDUsMTcgQEAKIAogc3RhdGljIHZvaWQgdG5vZGVfZnJlZShzdHJ1Y3QgdG5vZGUgKnRuKQogewotCWlmKCF0bikgeworCWlmICghdG4pIHsKIAkJdHJpZV9idWcoInRub2RlX2ZyZWVcbiIpOwogCX0KLQlpZihJU19MRUFGKHRuKSkgeworCWlmIChJU19MRUFGKHRuKSkgewogCQlmcmVlX2xlYWYoKHN0cnVjdCBsZWFmICopdG4pOwotCQlpZih0cmllX2RlYnVnID4gMCApIAorCQlpZiAodHJpZV9kZWJ1ZyA+IDAgKQogCQkJcHJpbnRrKCJGTCAlcCBcbiIsIHRuKTsKIAl9Ci0JZWxzZSBpZihJU19UTk9ERSh0bikpIHsgCi0JCWtmcmVlKHRuKTsKLQkJaWYodHJpZV9kZWJ1ZyA+IDAgKSAKKwllbHNlIGlmIChJU19UTk9ERSh0bikpIHsKKwkJX190bm9kZV9mcmVlKHRuKTsKKwkJaWYgKHRyaWVfZGVidWcgPiAwICkKIAkJCXByaW50aygiRlQgJXAgXG4iLCB0bik7CiAJfQogCWVsc2UgewpAQCAtNDA0LDY2ICs0MzAsNjcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgdG5vZGVfZnVsbChzdHJ1Y3QgdG5vZGUgKnRuLCBzdHJ1Y3Qgbm9kZSAqbikKIHsKLQlpZihuID09IE5VTEwgfHwgSVNfTEVBRihuKSkKKwlpZiAobiA9PSBOVUxMIHx8IElTX0xFQUYobikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuICgoc3RydWN0IHRub2RlICopIG4pLT5wb3MgPT0gdG4tPnBvcyArIHRuLT5iaXRzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2NoaWxkKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgaSwgc3RydWN0IG5vZGUgKm4pIAorc3RhdGljIGlubGluZSB2b2lkIHB1dF9jaGlsZChzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0biwgaW50IGksIHN0cnVjdCBub2RlICpuKQogewogCXRub2RlX3B1dF9jaGlsZF9yZW9yZyh0biwgaSwgbiwgLTEpOwogfQogCi0gLyogCisgLyoKICAgKiBBZGQgYSBjaGlsZCBhdCBwb3NpdGlvbiBpIG92ZXJ3cml0aW5nIHRoZSBvbGQgdmFsdWUuCiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiBmdWxsX2NoaWxkcmVuIGFuZCBlbXB0eV9jaGlsZHJlbi4KICAgKi8KIAotc3RhdGljIHZvaWQgdG5vZGVfcHV0X2NoaWxkX3Jlb3JnKHN0cnVjdCB0bm9kZSAqdG4sIGludCBpLCBzdHJ1Y3Qgbm9kZSAqbiwgaW50IHdhc2Z1bGwpIAorc3RhdGljIHZvaWQgdG5vZGVfcHV0X2NoaWxkX3Jlb3JnKHN0cnVjdCB0bm9kZSAqdG4sIGludCBpLCBzdHJ1Y3Qgbm9kZSAqbiwgaW50IHdhc2Z1bGwpCiB7CiAJc3RydWN0IG5vZGUgKmNoaTsKIAlpbnQgaXNmdWxsOwogCi0JaWYoaSA+PSAgMTw8dG4tPmJpdHMpIHsKKwlpZiAoaSA+PSAxPDx0bi0+Yml0cykgewogCQlwcmludGsoImJpdHM9JWQsIGk9JWRcbiIsIHRuLT5iaXRzLCBpKTsKIAkJdHJpZV9idWcoInRub2RlX3B1dF9jaGlsZF9yZW9yZyBiaXRzIik7CiAJfQogCXdyaXRlX2xvY2tfYmgoJmZpYl9sb2NrKTsKLQljaGkgPSB0bi0+Y2hpbGRbaV07CQorCWNoaSA9IHRuLT5jaGlsZFtpXTsKIAogCS8qIHVwZGF0ZSBlbXB0eUNoaWxkcmVuICovCiAJaWYgKG4gPT0gTlVMTCAmJiBjaGkgIT0gTlVMTCkKIAkJdG4tPmVtcHR5X2NoaWxkcmVuKys7CiAJZWxzZSBpZiAobiAhPSBOVUxMICYmIGNoaSA9PSBOVUxMKQogCQl0bi0+ZW1wdHlfY2hpbGRyZW4tLTsKLSAgCisKIAkvKiB1cGRhdGUgZnVsbENoaWxkcmVuICovCiAgICAgICAgIGlmICh3YXNmdWxsID09IC0xKQogCQl3YXNmdWxsID0gdG5vZGVfZnVsbCh0biwgY2hpKTsKIAogCWlzZnVsbCA9IHRub2RlX2Z1bGwodG4sIG4pOwotCWlmICh3YXNmdWxsICYmICFpc2Z1bGwpIAorCWlmICh3YXNmdWxsICYmICFpc2Z1bGwpCiAJCXRuLT5mdWxsX2NoaWxkcmVuLS07Ci0JCi0JZWxzZSBpZiAoIXdhc2Z1bGwgJiYgaXNmdWxsKSAKKworCWVsc2UgaWYgKCF3YXNmdWxsICYmIGlzZnVsbCkKIAkJdG4tPmZ1bGxfY2hpbGRyZW4rKzsKLQlpZihuKSAKLQkJTk9ERV9TRVRfUEFSRU5UKG4sIHRuKTsJCisJaWYgKG4pCisJCU5PREVfU0VUX1BBUkVOVChuLCB0bik7CiAKIAl0bi0+Y2hpbGRbaV0gPSBuOwogCXdyaXRlX3VubG9ja19iaCgmZmliX2xvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IG5vZGUgKnJlc2l6ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bikgCitzdGF0aWMgc3RydWN0IG5vZGUgKnJlc2l6ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bikKIHsKIAlpbnQgaTsKKwlpbnQgZXJyID0gMDsKIAogIAlpZiAoIXRuKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmKHRyaWVfZGVidWcpIAotCQlwcmludGsoIkluIHRub2RlX3Jlc2l6ZSAlcCBpbmZsYXRlX3RocmVzaG9sZD0lZCB0aHJlc2hvbGQ9JWRcbiIsIAorCWlmICh0cmllX2RlYnVnKQorCQlwcmludGsoIkluIHRub2RlX3Jlc2l6ZSAlcCBpbmZsYXRlX3RocmVzaG9sZD0lZCB0aHJlc2hvbGQ9JWRcbiIsCiAJCSAgICAgIHRuLCBpbmZsYXRlX3RocmVzaG9sZCwgaGFsdmVfdGhyZXNob2xkKTsKIAogCS8qIE5vIGNoaWxkcmVuICovCkBAIC00ODAsNyArNTA3LDcgQEAKIAogCQkJCS8qIGNvbXByZXNzIG9uZSBsZXZlbCAqLwogCQkJCXN0cnVjdCBub2RlICpuID0gdG4tPmNoaWxkW2ldOwotCQkJCWlmKG4pCisJCQkJaWYgKG4pCiAJCQkJCU5PREVfSU5JVF9QQVJFTlQobiwgTk9ERV9UWVBFKG4pKTsKIAogCQkJCXdyaXRlX3VubG9ja19iaCgmZmliX2xvY2spOwpAQCAtNDg5LDc3ICs1MTYsODUgQEAKIAkJCX0KIAkJCXdyaXRlX3VubG9ja19iaCgmZmliX2xvY2spOwogCQl9Ci0JLyogCisJLyoKIAkgKiBEb3VibGUgYXMgbG9uZyBhcyB0aGUgcmVzdWx0aW5nIG5vZGUgaGFzIGEgbnVtYmVyIG9mCiAJICogbm9uZW1wdHkgbm9kZXMgdGhhdCBhcmUgYWJvdmUgdGhlIHRocmVzaG9sZC4KIAkgKi8KIAogCS8qCi0JICogRnJvbSAiSW1wbGVtZW50aW5nIGEgZHluYW1pYyBjb21wcmVzc2VkIHRyaWUiIGJ5IFN0ZWZhbiBOaWxzc29uIG9mIAotCSAqIHRoZSBIZWxzaW5raSBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kgYW5kIE1hdHRpIFRpa2thbmVuIG9mIE5va2lhIAorCSAqIEZyb20gIkltcGxlbWVudGluZyBhIGR5bmFtaWMgY29tcHJlc3NlZCB0cmllIiBieSBTdGVmYW4gTmlsc3NvbiBvZgorCSAqIHRoZSBIZWxzaW5raSBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kgYW5kIE1hdHRpIFRpa2thbmVuIG9mIE5va2lhCiAJICogVGVsZWNvbW11bmljYXRpb25zLCBwYWdlIDY6Ci0JICogIkEgbm9kZSBpcyBkb3VibGVkIGlmIHRoZSByYXRpbyBvZiBub24tZW1wdHkgY2hpbGRyZW4gdG8gYWxsIAorCSAqICJBIG5vZGUgaXMgZG91YmxlZCBpZiB0aGUgcmF0aW8gb2Ygbm9uLWVtcHR5IGNoaWxkcmVuIHRvIGFsbAogCSAqIGNoaWxkcmVuIGluIHRoZSAqZG91YmxlZCogbm9kZSBpcyBhdCBsZWFzdCAnaGlnaCcuIgogCSAqCi0JICogJ2hpZ2gnIGluIHRoaXMgaW5zdGFuY2UgaXMgdGhlIHZhcmlhYmxlICdpbmZsYXRlX3RocmVzaG9sZCcuIEl0IAotCSAqIGlzIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIHNvIHdlIG11bHRpcGx5IGl0IHdpdGggCi0JICogdG5vZGVfY2hpbGRfbGVuZ3RoKCkgYW5kIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgYnkgMiAoc2luY2UgdGhlIAotCSAqIGNoaWxkIGFycmF5IHdpbGwgYmUgZG91YmxlZCBieSBpbmZsYXRlKCkpIGFuZCBtdWx0aXBseWluZyAKLQkgKiB0aGUgbGVmdC1oYW5kIHNpZGUgYnkgMTAwICh0byBoYW5kbGUgdGhlIHBlcmNlbnRhZ2UgdGhpbmcpIHdlIAorCSAqICdoaWdoJyBpbiB0aGlzIGluc3RhbmNlIGlzIHRoZSB2YXJpYWJsZSAnaW5mbGF0ZV90aHJlc2hvbGQnLiBJdAorCSAqIGlzIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIHNvIHdlIG11bHRpcGx5IGl0IHdpdGgKKwkgKiB0bm9kZV9jaGlsZF9sZW5ndGgoKSBhbmQgaW5zdGVhZCBvZiBtdWx0aXBseWluZyBieSAyIChzaW5jZSB0aGUKKwkgKiBjaGlsZCBhcnJheSB3aWxsIGJlIGRvdWJsZWQgYnkgaW5mbGF0ZSgpKSBhbmQgbXVsdGlwbHlpbmcKKwkgKiB0aGUgbGVmdC1oYW5kIHNpZGUgYnkgMTAwICh0byBoYW5kbGUgdGhlIHBlcmNlbnRhZ2UgdGhpbmcpIHdlCiAJICogbXVsdGlwbHkgdGhlIGxlZnQtaGFuZCBzaWRlIGJ5IDUwLgotCSAqIAotCSAqIFRoZSBsZWZ0LWhhbmQgc2lkZSBtYXkgbG9vayBhIGJpdCB3ZWlyZDogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAKLQkgKiAtIHRuLT5lbXB0eV9jaGlsZHJlbiBpcyBvZiBjb3Vyc2UgdGhlIG51bWJlciBvZiBub24tbnVsbCBjaGlsZHJlbiAKLQkgKiBpbiB0aGUgY3VycmVudCBub2RlLiB0bi0+ZnVsbF9jaGlsZHJlbiBpcyB0aGUgbnVtYmVyIG9mICJmdWxsIiAKKwkgKgorCSAqIFRoZSBsZWZ0LWhhbmQgc2lkZSBtYXkgbG9vayBhIGJpdCB3ZWlyZDogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKQorCSAqIC0gdG4tPmVtcHR5X2NoaWxkcmVuIGlzIG9mIGNvdXJzZSB0aGUgbnVtYmVyIG9mIG5vbi1udWxsIGNoaWxkcmVuCisJICogaW4gdGhlIGN1cnJlbnQgbm9kZS4gdG4tPmZ1bGxfY2hpbGRyZW4gaXMgdGhlIG51bWJlciBvZiAiZnVsbCIKIAkgKiBjaGlsZHJlbiwgdGhhdCBpcyBub24tbnVsbCB0bm9kZXMgd2l0aCBhIHNraXAgdmFsdWUgb2YgMC4KLQkgKiBBbGwgb2YgdGhvc2Ugd2lsbCBiZSBkb3VibGVkIGluIHRoZSByZXN1bHRpbmcgaW5mbGF0ZWQgdG5vZGUsIHNvIAorCSAqIEFsbCBvZiB0aG9zZSB3aWxsIGJlIGRvdWJsZWQgaW4gdGhlIHJlc3VsdGluZyBpbmZsYXRlZCB0bm9kZSwgc28KIAkgKiB3ZSBqdXN0IGNvdW50IHRoZW0gb25lIGV4dHJhIHRpbWUgaGVyZS4KLQkgKiAKKwkgKgogCSAqIEEgY2xlYXJlciB3YXkgdG8gd3JpdGUgdGhpcyB3b3VsZCBiZToKLQkgKiAKKwkgKgogCSAqIHRvX2JlX2RvdWJsZWQgPSB0bi0+ZnVsbF9jaGlsZHJlbjsKLQkgKiBub3RfdG9fYmVfZG91YmxlZCA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4gLSAKKwkgKiBub3RfdG9fYmVfZG91YmxlZCA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4gLQogCSAqICAgICB0bi0+ZnVsbF9jaGlsZHJlbjsKIAkgKgogCSAqIG5ld19jaGlsZF9sZW5ndGggPSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pICogMjsKIAkgKgotCSAqIG5ld19maWxsX2ZhY3RvciA9IDEwMCAqIChub3RfdG9fYmVfZG91YmxlZCArIDIqdG9fYmVfZG91YmxlZCkgLyAKKwkgKiBuZXdfZmlsbF9mYWN0b3IgPSAxMDAgKiAobm90X3RvX2JlX2RvdWJsZWQgKyAyKnRvX2JlX2RvdWJsZWQpIC8KIAkgKiAgICAgIG5ld19jaGlsZF9sZW5ndGg7CiAJICogaWYgKG5ld19maWxsX2ZhY3RvciA+PSBpbmZsYXRlX3RocmVzaG9sZCkKLQkgKiAKLQkgKiAuLi5hbmQgc28gb24sIHRobyBpdCB3b3VsZCBtZXNzIHVwIHRoZSB3aGlsZSgpIGxvb3AuCi0JICogCisJICoKKwkgKiAuLi5hbmQgc28gb24sIHRobyBpdCB3b3VsZCBtZXNzIHVwIHRoZSB3aGlsZSAoKSBsb29wLgorCSAqCiAJICogYW55d2F5LAogCSAqIDEwMCAqIChub3RfdG9fYmVfZG91YmxlZCArIDIqdG9fYmVfZG91YmxlZCkgLyBuZXdfY2hpbGRfbGVuZ3RoID49CiAJICogICAgICBpbmZsYXRlX3RocmVzaG9sZAotCSAqIAorCSAqCiAJICogYXZvaWQgYSBkaXZpc2lvbjoKIAkgKiAxMDAgKiAobm90X3RvX2JlX2RvdWJsZWQgKyAyKnRvX2JlX2RvdWJsZWQpID49CiAJICogICAgICBpbmZsYXRlX3RocmVzaG9sZCAqIG5ld19jaGlsZF9sZW5ndGgKLQkgKiAKKwkgKgogCSAqIGV4cGFuZCBub3RfdG9fYmVfZG91YmxlZCBhbmQgdG9fYmVfZG91YmxlZCwgYW5kIHNob3J0ZW46Ci0JICogMTAwICogKHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4gKyAKKwkgKiAxMDAgKiAodG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiArCiAJICogICAgdG4tPmZ1bGxfY2hpbGRyZW4gKSA+PSBpbmZsYXRlX3RocmVzaG9sZCAqIG5ld19jaGlsZF9sZW5ndGgKLQkgKiAKKwkgKgogCSAqIGV4cGFuZCBuZXdfY2hpbGRfbGVuZ3RoOgotCSAqIDEwMCAqICh0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gdG4tPmVtcHR5X2NoaWxkcmVuICsgCisJICogMTAwICogKHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4gKwogCSAqICAgIHRuLT5mdWxsX2NoaWxkcmVuICkgPj0KIAkgKiAgICAgIGluZmxhdGVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAqIDIKLQkgKiAKKwkgKgogCSAqIHNob3J0ZW4gYWdhaW46Ci0JICogNTAgKiAodG4tPmZ1bGxfY2hpbGRyZW4gKyB0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gCi0JICogICAgdG4tPmVtcHR5X2NoaWxkcmVuICkgPj0gaW5mbGF0ZV90aHJlc2hvbGQgKiAKKwkgKiA1MCAqICh0bi0+ZnVsbF9jaGlsZHJlbiArIHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLQorCSAqICAgIHRuLT5lbXB0eV9jaGlsZHJlbiApID49IGluZmxhdGVfdGhyZXNob2xkICoKIAkgKiAgICB0bm9kZV9jaGlsZF9sZW5ndGgodG4pCi0JICogCisJICoKIAkgKi8KIAogCWNoZWNrX3Rub2RlKHRuKTsKIAorCWVyciA9IDA7CiAJd2hpbGUgKCh0bi0+ZnVsbF9jaGlsZHJlbiA+IDAgJiYKIAkgICAgICAgNTAgKiAodG4tPmZ1bGxfY2hpbGRyZW4gKyB0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gdG4tPmVtcHR5X2NoaWxkcmVuKSA+PQogCQkJCWluZmxhdGVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkpIHsKIAotCQl0biA9IGluZmxhdGUodCwgdG4pOworCQl0biA9IGluZmxhdGUodCwgdG4sICZlcnIpOworCisJCWlmIChlcnIpIHsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwkJCXQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KIAl9CiAKIAljaGVja190bm9kZSh0bik7CkBAIC01NjgsMjMgKzYwMywzNCBAQAogCSAqIEhhbHZlIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBlbXB0eSBjaGlsZHJlbiBpbiB0aGlzCiAJICogbm9kZSBpcyBhYm92ZSB0aHJlc2hvbGQuCiAJICovCisKKwllcnIgPSAwOwogCXdoaWxlICh0bi0+Yml0cyA+IDEgJiYKIAkgICAgICAgMTAwICogKHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4pIDwKLQkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkKKwkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkgewogCi0JCXRuID0gaGFsdmUodCwgdG4pOwotICAKKwkJdG4gPSBoYWx2ZSh0LCB0biwgJmVycik7CisKKwkJaWYgKGVycikgeworI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUworCQkJdC0+c3RhdHMucmVzaXplX25vZGVfc2tpcHBlZCsrOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCX0KKworCiAJLyogT25seSBvbmUgY2hpbGQgcmVtYWlucyAqLwogCiAJaWYgKHRuLT5lbXB0eV9jaGlsZHJlbiA9PSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gMSkKIAkJZm9yIChpID0gMDsgaSA8IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7IGkrKykgewotCQkJCisJCQogCQkJd3JpdGVfbG9ja19iaCgmZmliX2xvY2spOwogCQkJaWYgKHRuLT5jaGlsZFtpXSAhPSBOVUxMKSB7CiAJCQkJLyogY29tcHJlc3Mgb25lIGxldmVsICovCiAJCQkJc3RydWN0IG5vZGUgKm4gPSB0bi0+Y2hpbGRbaV07CiAKLQkJCQlpZihuKQorCQkJCWlmIChuKQogCQkJCQlOT0RFX0lOSVRfUEFSRU5UKG4sIE5PREVfVFlQRShuKSk7CiAKIAkJCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9sb2NrKTsKQEAgLTU5NywzMyArNjQzLDg4IEBACiAJcmV0dXJuIChzdHJ1Y3Qgbm9kZSAqKSB0bjsKIH0KIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqaW5mbGF0ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bikKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmluZmxhdGUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4sIGludCAqZXJyKQogewogCXN0cnVjdCB0bm9kZSAqaW5vZGU7CiAJc3RydWN0IHRub2RlICpvbGR0bm9kZSA9IHRuOwogCWludCBvbGVuID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKTsKIAlpbnQgaTsKIAotICAJaWYodHJpZV9kZWJ1ZykgCisgIAlpZiAodHJpZV9kZWJ1ZykKIAkJcHJpbnRrKCJJbiBpbmZsYXRlXG4iKTsKIAogCXRuID0gdG5vZGVfbmV3KG9sZHRub2RlLT5rZXksIG9sZHRub2RlLT5wb3MsIG9sZHRub2RlLT5iaXRzICsgMSk7CiAKLQlpZiAoIXRuKQotCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOworCWlmICghdG4pIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBvbGR0bm9kZTsKKwl9CisKKwkvKgorCSAqIFByZWFsbG9jYXRlIGFuZCBzdG9yZSB0bm9kZXMgYmVmb3JlIHRoZSBhY3R1YWwgd29yayBzbyB3ZQorCSAqIGRvbid0IGdldCBpbnRvIGFuIGluY29uc2lzdGVudCBzdGF0ZSBpZiBtZW1vcnkgYWxsb2NhdGlvbgorCSAqIGZhaWxzLiBJbiBjYXNlIG9mIGZhaWx1cmUgd2UgcmV0dXJuIHRoZSBvbGRub2RlIGFuZCAgaW5mbGF0ZQorCSAqIG9mIHRub2RlIGlzIGlnbm9yZWQuCisJICovCisJCQorCWZvcihpID0gMDsgaSA8IG9sZW47IGkrKykgeworCQlzdHJ1Y3QgdG5vZGUgKmlub2RlID0gKHN0cnVjdCB0bm9kZSAqKSB0bm9kZV9nZXRfY2hpbGQob2xkdG5vZGUsIGkpOworCisJCWlmIChpbm9kZSAmJgorCQkgICAgSVNfVE5PREUoaW5vZGUpICYmCisJCSAgICBpbm9kZS0+cG9zID09IG9sZHRub2RlLT5wb3MgKyBvbGR0bm9kZS0+Yml0cyAmJgorCQkgICAgaW5vZGUtPmJpdHMgPiAxKSB7CisJCQlzdHJ1Y3QgdG5vZGUgKmxlZnQsICpyaWdodDsKKworCQkJdF9rZXkgbSA9IFRLRVlfR0VUX01BU0soaW5vZGUtPnBvcywgMSk7CisKKwkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKKwkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CisKKwkJCWlmICghbGVmdCkgeworCQkJCSplcnIgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQorCQkKKwkJCXJpZ2h0ID0gdG5vZGVfbmV3KGlub2RlLT5rZXl8bSwgaW5vZGUtPnBvcyArIDEsCisJCQkJCSAgaW5vZGUtPmJpdHMgLSAxKTsKKworCQkJaWYgKCFyaWdodCkgeworCQkJCSplcnIgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwdXRfY2hpbGQodCwgdG4sIDIqaSwgKHN0cnVjdCBub2RlICopIGxlZnQpOworCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmkrMSwgKHN0cnVjdCBub2RlICopIHJpZ2h0KTsKKwkJfQorCX0KKworCWlmICgqZXJyKSB7CisJCWludCBzaXplID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKTsKKwkJaW50IGo7CisKKwkJZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKQorCQkJaWYgKHRuLT5jaGlsZFtqXSkKKwkJCQl0bm9kZV9mcmVlKChzdHJ1Y3QgdG5vZGUgKil0bi0+Y2hpbGRbal0pOworCisJCXRub2RlX2ZyZWUodG4pOworCQorCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIG9sZHRub2RlOworCX0KIAogCWZvcihpID0gMDsgaSA8IG9sZW47IGkrKykgewogCQlzdHJ1Y3Qgbm9kZSAqbm9kZSA9IHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7Ci0gICAgICAKKwogCQkvKiBBbiBlbXB0eSBjaGlsZCAqLwogCQlpZiAobm9kZSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKIAkJLyogQSBsZWFmIG9yIGFuIGludGVybmFsIG5vZGUgd2l0aCBza2lwcGVkIGJpdHMgKi8KIAotCQlpZihJU19MRUFGKG5vZGUpIHx8ICgoc3RydWN0IHRub2RlICopIG5vZGUpLT5wb3MgPgorCQlpZiAoSVNfTEVBRihub2RlKSB8fCAoKHN0cnVjdCB0bm9kZSAqKSBub2RlKS0+cG9zID4KIAkJICAgdG4tPnBvcyArIHRuLT5iaXRzIC0gMSkgewotCQkJaWYodGtleV9leHRyYWN0X2JpdHMobm9kZS0+a2V5LCB0bi0+cG9zICsgdG4tPmJpdHMgLSAxLAorCQkJaWYgKHRrZXlfZXh0cmFjdF9iaXRzKG5vZGUtPmtleSwgb2xkdG5vZGUtPnBvcyArIG9sZHRub2RlLT5iaXRzLAogCQkJCQkgICAgIDEpID09IDApCiAJCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmksIG5vZGUpOwogCQkJZWxzZQpAQCAtNjQ2LDQ0ICs3NDcsMzkgQEAKIAkJCXN0cnVjdCB0bm9kZSAqbGVmdCwgKnJpZ2h0OwogCQkJaW50IHNpemUsIGo7CiAKLQkJCS8qIFdlIHdpbGwgcmVwbGFjZSB0aGlzIG5vZGUgJ2lub2RlJyB3aXRoIHR3byBuZXcgCi0JCQkgKiBvbmVzLCAnbGVmdCcgYW5kICdyaWdodCcsIGVhY2ggd2l0aCBoYWxmIG9mIHRoZSAKLQkJCSAqIG9yaWdpbmFsIGNoaWxkcmVuLiBUaGUgdHdvIG5ldyBub2RlcyB3aWxsIGhhdmUgCi0JCQkgKiBhIHBvc2l0aW9uIG9uZSBiaXQgZnVydGhlciBkb3duIHRoZSBrZXkgYW5kIHRoaXMgCi0JCQkgKiBtZWFucyB0aGF0IHRoZSAic2lnbmlmaWNhbnQiIHBhcnQgb2YgdGhlaXIga2V5cyAKLQkJCSAqIChzZWUgdGhlIGRpc2N1c3Npb24gbmVhciB0aGUgdG9wIG9mIHRoaXMgZmlsZSkgCi0JCQkgKiB3aWxsIGRpZmZlciBieSBvbmUgYml0LCB3aGljaCB3aWxsIGJlICIwIiBpbiAKLQkJCSAqIGxlZnQncyBrZXkgYW5kICIxIiBpbiByaWdodCdzIGtleS4gU2luY2Ugd2UgYXJlIAotCQkJICogbW92aW5nIHRoZSBrZXkgcG9zaXRpb24gYnkgb25lIHN0ZXAsIHRoZSBiaXQgdGhhdCAKLQkJCSAqIHdlIGFyZSBtb3ZpbmcgYXdheSBmcm9tIC0gdGhlIGJpdCBhdCBwb3NpdGlvbiAKLQkJCSAqIChpbm9kZS0+cG9zKSAtIGlzIHRoZSBvbmUgdGhhdCB3aWxsIGRpZmZlciBiZXR3ZWVuIAorCQkJLyogV2Ugd2lsbCByZXBsYWNlIHRoaXMgbm9kZSAnaW5vZGUnIHdpdGggdHdvIG5ldworCQkJICogb25lcywgJ2xlZnQnIGFuZCAncmlnaHQnLCBlYWNoIHdpdGggaGFsZiBvZiB0aGUKKwkJCSAqIG9yaWdpbmFsIGNoaWxkcmVuLiBUaGUgdHdvIG5ldyBub2RlcyB3aWxsIGhhdmUKKwkJCSAqIGEgcG9zaXRpb24gb25lIGJpdCBmdXJ0aGVyIGRvd24gdGhlIGtleSBhbmQgdGhpcworCQkJICogbWVhbnMgdGhhdCB0aGUgInNpZ25pZmljYW50IiBwYXJ0IG9mIHRoZWlyIGtleXMKKwkJCSAqIChzZWUgdGhlIGRpc2N1c3Npb24gbmVhciB0aGUgdG9wIG9mIHRoaXMgZmlsZSkKKwkJCSAqIHdpbGwgZGlmZmVyIGJ5IG9uZSBiaXQsIHdoaWNoIHdpbGwgYmUgIjAiIGluCisJCQkgKiBsZWZ0J3Mga2V5IGFuZCAiMSIgaW4gcmlnaHQncyBrZXkuIFNpbmNlIHdlIGFyZQorCQkJICogbW92aW5nIHRoZSBrZXkgcG9zaXRpb24gYnkgb25lIHN0ZXAsIHRoZSBiaXQgdGhhdAorCQkJICogd2UgYXJlIG1vdmluZyBhd2F5IGZyb20gLSB0aGUgYml0IGF0IHBvc2l0aW9uCisJCQkgKiAoaW5vZGUtPnBvcykgLSBpcyB0aGUgb25lIHRoYXQgd2lsbCBkaWZmZXIgYmV0d2VlbgogCQkJICogbGVmdCBhbmQgcmlnaHQuIFNvLi4uIHdlIHN5bnRoZXNpemUgdGhhdCBiaXQgaW4gdGhlCiAJCQkgKiB0d28gIG5ldyBrZXlzLgotCQkJICogVGhlIG1hc2sgJ20nIGJlbG93IHdpbGwgYmUgYSBzaW5nbGUgIm9uZSIgYml0IGF0IAorCQkJICogVGhlIG1hc2sgJ20nIGJlbG93IHdpbGwgYmUgYSBzaW5nbGUgIm9uZSIgYml0IGF0CiAJCQkgKiB0aGUgcG9zaXRpb24gKGlub2RlLT5wb3MpCiAJCQkgKi8KIAotCQkJdF9rZXkgbSA9IFRLRVlfR0VUX01BU0soaW5vZGUtPnBvcywgMSk7Ci0gCi0JCQkvKiBVc2UgdGhlIG9sZCBrZXksIGJ1dCBzZXQgdGhlIG5ldyBzaWduaWZpY2FudCAKLQkJCSAqICAgYml0IHRvIHplcm8uIAorCQkJLyogVXNlIHRoZSBvbGQga2V5LCBidXQgc2V0IHRoZSBuZXcgc2lnbmlmaWNhbnQKKwkJCSAqICAgYml0IHRvIHplcm8uCiAJCQkgKi8KLQkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKLQkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CiAKLQkJCWlmKCFsZWZ0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCi0JCQkKLQkJCS8qIFVzZSB0aGUgb2xkIGtleSwgYnV0IHNldCB0aGUgbmV3IHNpZ25pZmljYW50IAotCQkJICogYml0IHRvIG9uZS4gCi0JCQkgKi8KLQkJCXJpZ2h0ID0gdG5vZGVfbmV3KGlub2RlLT5rZXl8bSwgaW5vZGUtPnBvcyArIDEsCi0JCQkJCSAgaW5vZGUtPmJpdHMgLSAxKTsKKwkJCWxlZnQgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgMippKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippLCBOVUxMKTsKIAotCQkJaWYoIXJpZ2h0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCisJCQlpZiAoIWxlZnQpCisJCQkJQlVHKCk7CisKKwkJCXJpZ2h0ID0gKHN0cnVjdCB0bm9kZSAqKSB0bm9kZV9nZXRfY2hpbGQodG4sIDIqaSsxKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippKzEsIE5VTEwpOworCisJCQlpZiAoIXJpZ2h0KQorCQkJCUJVRygpOworCiAJCQlzaXplID0gdG5vZGVfY2hpbGRfbGVuZ3RoKGxlZnQpOwogCQkJZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAJCQkJcHV0X2NoaWxkKHQsIGxlZnQsIGosIGlub2RlLT5jaGlsZFtqXSk7CkBAIC02OTksMjQgKzc5NSw2NCBAQAogCXJldHVybiB0bjsKIH0KIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqaGFsdmUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pCitzdGF0aWMgc3RydWN0IHRub2RlICpoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0biwgaW50ICplcnIpCiB7CiAJc3RydWN0IHRub2RlICpvbGR0bm9kZSA9IHRuOwogCXN0cnVjdCBub2RlICpsZWZ0LCAqcmlnaHQ7CiAJaW50IGk7CiAJaW50IG9sZW4gPSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pOwogCi0JaWYodHJpZV9kZWJ1ZykgcHJpbnRrKCJJbiBoYWx2ZVxuIik7Ci0gIAotCXRuPXRub2RlX25ldyhvbGR0bm9kZS0+a2V5LCBvbGR0bm9kZS0+cG9zLCBvbGR0bm9kZS0+Yml0cyAtIDEpOworCWlmICh0cmllX2RlYnVnKSBwcmludGsoIkluIGhhbHZlXG4iKTsKIAotCWlmKCF0bikgCi0JCXRyaWVfYnVnKCJ0bm9kZV9uZXcgZmFpbGVkIik7CisJdG4gPSB0bm9kZV9uZXcob2xkdG5vZGUtPmtleSwgb2xkdG5vZGUtPnBvcywgb2xkdG5vZGUtPmJpdHMgLSAxKTsKKworCWlmICghdG4pIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBvbGR0bm9kZTsKKwl9CisKKwkvKgorCSAqIFByZWFsbG9jYXRlIGFuZCBzdG9yZSB0bm9kZXMgYmVmb3JlIHRoZSBhY3R1YWwgd29yayBzbyB3ZQorCSAqIGRvbid0IGdldCBpbnRvIGFuIGluY29uc2lzdGVudCBzdGF0ZSBpZiBtZW1vcnkgYWxsb2NhdGlvbgorCSAqIGZhaWxzLiBJbiBjYXNlIG9mIGZhaWx1cmUgd2UgcmV0dXJuIHRoZSBvbGRub2RlIGFuZCBoYWx2ZQorCSAqIG9mIHRub2RlIGlzIGlnbm9yZWQuCisJICovCiAKIAlmb3IoaSA9IDA7IGkgPCBvbGVuOyBpICs9IDIpIHsKIAkJbGVmdCA9IHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CiAJCXJpZ2h0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKzEpOwotICAgIAorCisJCS8qIFR3byBub25lbXB0eSBjaGlsZHJlbiAqLworCQlpZiAobGVmdCAmJiByaWdodCkgIHsKKwkJCXN0cnVjdCB0bm9kZSAqbmV3QmluTm9kZSA9CisJCQkJdG5vZGVfbmV3KGxlZnQtPmtleSwgdG4tPnBvcyArIHRuLT5iaXRzLCAxKTsKKworCQkJaWYgKCFuZXdCaW5Ob2RlKSB7CisJCQkJKmVyciA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdXRfY2hpbGQodCwgdG4sIGkvMiwgKHN0cnVjdCBub2RlICopbmV3QmluTm9kZSk7CisJCX0KKwl9CisKKwlpZiAoKmVycikgeworCQlpbnQgc2l6ZSA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7CisJCWludCBqOworCisJCWZvcihqID0gMDsgaiA8IHNpemU7IGorKykKKwkJCWlmICh0bi0+Y2hpbGRbal0pCisJCQkJdG5vZGVfZnJlZSgoc3RydWN0IHRub2RlICopdG4tPmNoaWxkW2pdKTsKKworCQl0bm9kZV9mcmVlKHRuKTsKKwkKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBvbGR0bm9kZTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBvbGVuOyBpICs9IDIpIHsKKwkJbGVmdCA9IHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CisJCXJpZ2h0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKzEpOworCiAJCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgY2hpbGRyZW4gaXMgZW1wdHkgKi8KIAkJaWYgKGxlZnQgPT0gTlVMTCkgewogCQkJaWYgKHJpZ2h0ID09IE5VTEwpICAgIC8qIEJvdGggYXJlIGVtcHR5ICovCkBAIC03MjQsMTQgKzg2MCwxNSBAQAogCQkJcHV0X2NoaWxkKHQsIHRuLCBpLzIsIHJpZ2h0KTsKIAkJfSBlbHNlIGlmIChyaWdodCA9PSBOVUxMKQogCQkJcHV0X2NoaWxkKHQsIHRuLCBpLzIsIGxlZnQpOwotICAgICAKKwogCQkvKiBUd28gbm9uZW1wdHkgY2hpbGRyZW4gKi8KIAkJZWxzZSB7CiAJCQlzdHJ1Y3QgdG5vZGUgKm5ld0Jpbk5vZGUgPQotCQkJCXRub2RlX25ldyhsZWZ0LT5rZXksIHRuLT5wb3MgKyB0bi0+Yml0cywgMSk7CisJCQkJKHN0cnVjdCB0bm9kZSAqKSB0bm9kZV9nZXRfY2hpbGQodG4sIGkvMik7CisJCQlwdXRfY2hpbGQodCwgdG4sIGkvMiwgTlVMTCk7CiAKLQkJCWlmKCFuZXdCaW5Ob2RlKSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOworCQkJaWYgKCFuZXdCaW5Ob2RlKQorCQkJCUJVRygpOwogCiAJCQlwdXRfY2hpbGQodCwgbmV3QmluTm9kZSwgMCwgbGVmdCk7CiAJCQlwdXRfY2hpbGQodCwgbmV3QmluTm9kZSwgMSwgcmlnaHQpOwpAQCAtNzQ0LDcgKzg4MSw3IEBACiAKIHN0YXRpYyB2b2lkICp0cmllX2luaXQoc3RydWN0IHRyaWUgKnQpCiB7Ci0JaWYodCkgeworCWlmICh0KSB7CiAJCXQtPnNpemUgPSAwOwogCQl0LT50cmllID0gTlVMTDsKIAkJdC0+cmV2aXNpb24gPSAwOwpAQCAtNzYxLDggKzg5OCw3IEBACiAJc3RydWN0IGxlYWZfaW5mbyAqbGk7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShsaSwgbm9kZSwgaGVhZCwgaGxpc3QpIHsKLQkJICAKLQkJaWYgKCBsaS0+cGxlbiA9PSBwbGVuICkKKwkJaWYgKGxpLT5wbGVuID09IHBsZW4pCiAJCQlyZXR1cm4gbGk7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNzcwLDM1ICs5MDYsMzUgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICogZ2V0X2ZhX2hlYWQoc3RydWN0IGxlYWYgKmwsIGludCBwbGVuKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmZhX2hlYWQ9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkID0gTlVMTDsKIAlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IGZpbmRfbGVhZl9pbmZvKCZsLT5saXN0LCBwbGVuKTsKLQkKLQlpZihsaSkgCisKKwlpZiAobGkpCiAJCWZhX2hlYWQgPSAmbGktPmZhbGg7Ci0JCisKIAlyZXR1cm4gZmFfaGVhZDsKIH0KIAogc3RhdGljIHZvaWQgaW5zZXJ0X2xlYWZfaW5mbyhzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGxlYWZfaW5mbyAqbmV3KQogewotCXN0cnVjdCBsZWFmX2luZm8gKmxpPU5VTEwsICpsYXN0PU5VTEw7CisJc3RydWN0IGxlYWZfaW5mbyAqbGkgPSBOVUxMLCAqbGFzdCA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CiAKIAl3cml0ZV9sb2NrX2JoKCZmaWJfbG9jayk7Ci0JCi0JaWYoaGxpc3RfZW1wdHkoaGVhZCkpCisKKwlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpCiAJCWhsaXN0X2FkZF9oZWFkKCZuZXctPmhsaXN0LCBoZWFkKTsKIAllbHNlIHsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgbm9kZSwgdG1wLCBoZWFkLCBobGlzdCkgewotCQkJCi0JCQlpZiAobmV3LT5wbGVuID4gbGktPnBsZW4pIAorCQkKKwkJCWlmIChuZXctPnBsZW4gPiBsaS0+cGxlbikKIAkJCQlicmVhazsKLQkJCQorCQkKIAkJCWxhc3QgPSBsaTsKIAkJfQotCQlpZihsYXN0KSAKKwkJaWYgKGxhc3QpCiAJCQlobGlzdF9hZGRfYWZ0ZXIoJmxhc3QtPmhsaXN0LCAmbmV3LT5obGlzdCk7Ci0JCWVsc2UgCisJCWVsc2UKIAkJCWhsaXN0X2FkZF9iZWZvcmUoJm5ldy0+aGxpc3QsICZsaS0+aGxpc3QpOwogCX0KIAl3cml0ZV91bmxvY2tfYmgoJmZpYl9sb2NrKTsKQEAgLTgxMiwxNCArOTQ4LDE0IEBACiAJc3RydWN0IG5vZGUgKm47CiAKIAlwb3MgPSAwOwotCW49dC0+dHJpZTsKKwluID0gdC0+dHJpZTsKIAogCXdoaWxlIChuICE9IE5VTEwgJiYgIE5PREVfVFlQRShuKSA9PSBUX1ROT0RFKSB7CiAJCXRuID0gKHN0cnVjdCB0bm9kZSAqKSBuOwotCQkJCisJCQogCQljaGVja190bm9kZSh0bik7Ci0JCQkKLQkJaWYodGtleV9zdWJfZXF1YWxzKHRuLT5rZXksIHBvcywgdG4tPnBvcy1wb3MsIGtleSkpIHsKKwkJCisJCWlmICh0a2V5X3N1Yl9lcXVhbHModG4tPmtleSwgcG9zLCB0bi0+cG9zLXBvcywga2V5KSkgewogCQkJcG9zPXRuLT5wb3MgKyB0bi0+Yml0czsKIAkJCW4gPSB0bm9kZV9nZXRfY2hpbGQodG4sIHRrZXlfZXh0cmFjdF9iaXRzKGtleSwgdG4tPnBvcywgdG4tPmJpdHMpKTsKIAkJfQpAQCAtODQyLDIzICs5NzgsMjMgQEAKIAl0X2tleSBjaW5kZXgsIGtleTsKIAlzdHJ1Y3QgdG5vZGUgKnRwID0gTlVMTDsKIAotCWlmKCF0bikgCisJaWYgKCF0bikKIAkJQlVHKCk7Ci0JCisKIAlrZXkgPSB0bi0+a2V5OwogCWkgPSAwOwogCiAJd2hpbGUgKHRuICE9IE5VTEwgJiYgTk9ERV9QQVJFTlQodG4pICE9IE5VTEwpIHsKIAotCQlpZiggaSA+IDEwICkgeworCQlpZiAoaSA+IDEwKSB7CiAJCQlwcmludGsoIlJlYmFsYW5jZSB0bj0lcCBcbiIsIHRuKTsKLQkJCWlmKHRuKSAJCXByaW50aygidG4tPnBhcmVudD0lcCBcbiIsIE5PREVfUEFSRU5UKHRuKSk7Ci0JCQkKKwkJCWlmICh0bikgCQlwcmludGsoInRuLT5wYXJlbnQ9JXAgXG4iLCBOT0RFX1BBUkVOVCh0bikpOworCQkKIAkJCXByaW50aygiUmViYWxhbmNlIHRwPSVwIFxuIiwgdHApOwotCQkJaWYodHApIAkJcHJpbnRrKCJ0cC0+cGFyZW50PSVwIFxuIiwgTk9ERV9QQVJFTlQodHApKTsKKwkJCWlmICh0cCkgCQlwcmludGsoInRwLT5wYXJlbnQ9JXAgXG4iLCBOT0RFX1BBUkVOVCh0cCkpOwogCQl9CiAKLQkJaWYoIGkgPiAxMiApIEJVRygpOworCQlpZiAoaSA+IDEyKSBCVUcoKTsKIAkJaSsrOwogCiAJCXRwID0gTk9ERV9QQVJFTlQodG4pOwpAQCAtODY2LDYzICsxMDAyLDYzIEBACiAJCXdhc2Z1bGwgPSB0bm9kZV9mdWxsKHRwLCB0bm9kZV9nZXRfY2hpbGQodHAsIGNpbmRleCkpOwogCQl0biA9IChzdHJ1Y3QgdG5vZGUgKikgcmVzaXplICh0LCAoc3RydWN0IHRub2RlICopdG4pOwogCQl0bm9kZV9wdXRfY2hpbGRfcmVvcmcoKHN0cnVjdCB0bm9kZSAqKXRwLCBjaW5kZXgsKHN0cnVjdCBub2RlKil0biwgd2FzZnVsbCk7Ci0JCQotCQlpZighTk9ERV9QQVJFTlQodG4pKQorCQorCQlpZiAoIU5PREVfUEFSRU5UKHRuKSkKIAkJCWJyZWFrOwogCiAJCXRuID0gTk9ERV9QQVJFTlQodG4pOwogCX0KIAkvKiBIYW5kbGUgbGFzdCAodG9wKSB0bm9kZSAqLwotCWlmIChJU19UTk9ERSh0bikpIAorCWlmIChJU19UTk9ERSh0bikpCiAJCXRuID0gKHN0cnVjdCB0bm9kZSopIHJlc2l6ZSh0LCAoc3RydWN0IHRub2RlICopdG4pOwogCiAJcmV0dXJuIChzdHJ1Y3Qgbm9kZSopIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqCi1maWJfaW5zZXJ0X25vZGUoc3RydWN0IHRyaWUgKnQsIHUzMiBrZXksIGludCBwbGVuKQorc3RhdGljICBzdHJ1Y3QgbGlzdF9oZWFkICoKK2ZpYl9pbnNlcnRfbm9kZShzdHJ1Y3QgdHJpZSAqdCwgaW50ICplcnIsIHUzMiBrZXksIGludCBwbGVuKQogewogCWludCBwb3MsIG5ld3BvczsKIAlzdHJ1Y3QgdG5vZGUgKnRwID0gTlVMTCwgKnRuID0gTlVMTDsKIAlzdHJ1Y3Qgbm9kZSAqbjsKIAlzdHJ1Y3QgbGVhZiAqbDsKIAlpbnQgbWlzc2JpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkPU5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZmFfaGVhZCA9IE5VTEw7CiAJc3RydWN0IGxlYWZfaW5mbyAqbGk7CiAJdF9rZXkgY2luZGV4OwogCiAJcG9zID0gMDsKLQluPXQtPnRyaWU7CisJbiA9IHQtPnRyaWU7CiAKLQkvKiBJZiB3ZSBwb2ludCB0byBOVUxMLCBzdG9wLiBFaXRoZXIgdGhlIHRyZWUgaXMgZW1wdHkgYW5kIHdlIHNob3VsZCAKLQkgKiBqdXN0IHB1dCBhIG5ldyBsZWFmIGluIGlmLCBvciB3ZSBoYXZlIHJlYWNoZWQgYW4gZW1wdHkgY2hpbGQgc2xvdCwgCisJLyogSWYgd2UgcG9pbnQgdG8gTlVMTCwgc3RvcC4gRWl0aGVyIHRoZSB0cmVlIGlzIGVtcHR5IGFuZCB3ZSBzaG91bGQKKwkgKiBqdXN0IHB1dCBhIG5ldyBsZWFmIGluIGlmLCBvciB3ZSBoYXZlIHJlYWNoZWQgYW4gZW1wdHkgY2hpbGQgc2xvdCwKIAkgKiBhbmQgd2Ugc2hvdWxkIGp1c3QgcHV0IG91ciBuZXcgbGVhZiBpbiB0aGF0LgotCSAqIElmIHdlIHBvaW50IHRvIGEgVF9UTk9ERSwgY2hlY2sgaWYgaXQgbWF0Y2hlcyBvdXIga2V5LiBOb3RlIHRoYXQgCi0JICogYSBUX1ROT0RFIG1pZ2h0IGJlIHNraXBwaW5nIGFueSBudW1iZXIgb2YgYml0cyAtIGl0cyAncG9zJyBuZWVkIAorCSAqIElmIHdlIHBvaW50IHRvIGEgVF9UTk9ERSwgY2hlY2sgaWYgaXQgbWF0Y2hlcyBvdXIga2V5LiBOb3RlIHRoYXQKKwkgKiBhIFRfVE5PREUgbWlnaHQgYmUgc2tpcHBpbmcgYW55IG51bWJlciBvZiBiaXRzIC0gaXRzICdwb3MnIG5lZWQKIAkgKiBub3QgYmUgdGhlIHBhcmVudCdzICdwb3MnKydiaXRzJyEKIAkgKgotCSAqIElmIGl0IGRvZXMgbWF0Y2ggdGhlIGN1cnJlbnQga2V5LCBnZXQgcG9zL2JpdHMgZnJvbSBpdCwgZXh0cmFjdCAKKwkgKiBJZiBpdCBkb2VzIG1hdGNoIHRoZSBjdXJyZW50IGtleSwgZ2V0IHBvcy9iaXRzIGZyb20gaXQsIGV4dHJhY3QKIAkgKiB0aGUgaW5kZXggZnJvbSBvdXIga2V5LCBwdXNoIHRoZSBUX1ROT0RFIGFuZCB3YWxrIHRoZSB0cmVlLgogCSAqCiAJICogSWYgaXQgZG9lc24ndCwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggYSBuZXcgVF9UTk9ERS4KIAkgKgotCSAqIElmIHdlIHBvaW50IHRvIGEgVF9MRUFGLCBpdCBtaWdodCBvciBtaWdodCBub3QgaGF2ZSB0aGUgc2FtZSBrZXkgCi0JICogYXMgd2UgZG8uIElmIGl0IGRvZXMsIGp1c3QgY2hhbmdlIHRoZSB2YWx1ZSwgdXBkYXRlIHRoZSBUX0xFQUYncyAKLQkgKiB2YWx1ZSwgYW5kIHJldHVybiBpdC4gCisJICogSWYgd2UgcG9pbnQgdG8gYSBUX0xFQUYsIGl0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIHRoZSBzYW1lIGtleQorCSAqIGFzIHdlIGRvLiBJZiBpdCBkb2VzLCBqdXN0IGNoYW5nZSB0aGUgdmFsdWUsIHVwZGF0ZSB0aGUgVF9MRUFGJ3MKKwkgKiB2YWx1ZSwgYW5kIHJldHVybiBpdC4KIAkgKiBJZiBpdCBkb2Vzbid0LCB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQgd2l0aCBhIFRfVE5PREUuCiAJICovCiAKIAl3aGlsZSAobiAhPSBOVUxMICYmICBOT0RFX1RZUEUobikgPT0gVF9UTk9ERSkgewogCQl0biA9IChzdHJ1Y3QgdG5vZGUgKikgbjsKLQkJCQotCQljaGVja190bm9kZSh0bik7CiAJCQotCQlpZih0a2V5X3N1Yl9lcXVhbHModG4tPmtleSwgcG9zLCB0bi0+cG9zLXBvcywga2V5KSkgeworCQljaGVja190bm9kZSh0bik7CisJCisJCWlmICh0a2V5X3N1Yl9lcXVhbHModG4tPmtleSwgcG9zLCB0bi0+cG9zLXBvcywga2V5KSkgewogCQkJdHAgPSB0bjsKIAkJCXBvcz10bi0+cG9zICsgdG4tPmJpdHM7CiAJCQluID0gdG5vZGVfZ2V0X2NoaWxkKHRuLCB0a2V5X2V4dHJhY3RfYml0cyhrZXksIHRuLT5wb3MsIHRuLT5iaXRzKSk7CiAKLQkJCWlmKG4gJiYgTk9ERV9QQVJFTlQobikgIT0gdG4pIHsKKwkJCWlmIChuICYmIE5PREVfUEFSRU5UKG4pICE9IHRuKSB7CiAJCQkJcHJpbnRrKCJCVUcgdG49JXAsIG4tPnBhcmVudD0lcFxuIiwgdG4sIE5PREVfUEFSRU5UKG4pKTsKIAkJCQlCVUcoKTsKIAkJCX0KQEAgLTkzNCwyMyArMTA3MCwyNCBAQAogCS8qCiAJICogbiAgLS0tLT4gTlVMTCwgTEVBRiBvciBUTk9ERQogCSAqCi0JICogdHAgaXMgbidzIChwYXJlbnQpIC0tLS0+IE5VTEwgb3IgVE5PREUgIAorCSAqIHRwIGlzIG4ncyAocGFyZW50KSAtLS0tPiBOVUxMIG9yIFROT0RFCiAJICovCiAKLQlpZih0cCAmJiBJU19MRUFGKHRwKSkKKwlpZiAodHAgJiYgSVNfTEVBRih0cCkpCiAJCUJVRygpOwogCi0JdC0+cmV2aXNpb24rKzsKIAogCS8qIENhc2UgMTogbiBpcyBhIGxlYWYuIENvbXBhcmUgcHJlZml4ZXMgKi8KIAotCWlmIChuICE9IE5VTEwgJiYgSVNfTEVBRihuKSAmJiB0a2V5X2VxdWFscyhrZXksIG4tPmtleSkpIHsgCisJaWYgKG4gIT0gTlVMTCAmJiBJU19MRUFGKG4pICYmIHRrZXlfZXF1YWxzKGtleSwgbi0+a2V5KSkgewogCQlzdHJ1Y3QgbGVhZiAqbCA9ICggc3RydWN0IGxlYWYgKikgIG47Ci0JCQorCQogCQlsaSA9IGxlYWZfaW5mb19uZXcocGxlbik7Ci0JCQotCQlpZighIGxpKSAKLQkJCUJVRygpOworCQorCQlpZiAoIWxpKSB7CisJCQkqZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CiAKIAkJZmFfaGVhZCA9ICZsaS0+ZmFsaDsKIAkJaW5zZXJ0X2xlYWZfaW5mbygmbC0+bGlzdCwgbGkpOwpAQCAtOTU5LDE0ICsxMDk2LDE5IEBACiAJdC0+c2l6ZSsrOwogCWwgPSBsZWFmX25ldygpOwogCi0JaWYoISBsKSAKLQkJQlVHKCk7CisJaWYgKCFsKSB7CisJCSplcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CiAKIAlsLT5rZXkgPSBrZXk7CiAJbGkgPSBsZWFmX2luZm9fbmV3KHBsZW4pOwogCi0JaWYoISBsaSkgCi0JCUJVRygpOworCWlmICghbGkpIHsKKwkJdG5vZGVfZnJlZSgoc3RydWN0IHRub2RlICopIGwpOworCQkqZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCiAJZmFfaGVhZCA9ICZsaS0+ZmFsaDsKIAlpbnNlcnRfbGVhZl9pbmZvKCZsLT5saXN0LCBsaSk7CkBAIC05NzUsOCArMTExNyw4IEBACiAJaWYgKHQtPnRyaWUgJiYgbiA9PSBOVUxMKSB7CiAKIAkJTk9ERV9TRVRfUEFSRU5UKGwsIHRwKTsKLQkJCi0JCWlmICghdHApIAorCQorCQlpZiAoIXRwKQogCQkJQlVHKCk7CiAKIAkJZWxzZSB7CkBAIC05ODYsOCArMTEyOCw4IEBACiAJfQogCS8qIENhc2UgMzogbiBpcyBhIExFQUYgb3IgYSBUTk9ERSBhbmQgdGhlIGtleSBkb2Vzbid0IG1hdGNoLiAqLwogCWVsc2UgewotCQkvKiAKLQkJICogIEFkZCBhIG5ldyB0bm9kZSBoZXJlIAorCQkvKgorCQkgKiAgQWRkIGEgbmV3IHRub2RlIGhlcmUKIAkJICogIGZpcnN0IHRub2RlIG5lZWQgc29tZSBzcGVjaWFsIGhhbmRsaW5nCiAJCSAqLwogCkBAIC05OTUsMzkgKzExMzcsNDYgQEAKIAkJCXBvcz10cC0+cG9zK3RwLT5iaXRzOwogCQllbHNlCiAJCQlwb3M9MDsKLQkJaWYobikgeworCQlpZiAobikgewogCQkJbmV3cG9zID0gdGtleV9taXNtYXRjaChrZXksIHBvcywgbi0+a2V5KTsKIAkJCXRuID0gdG5vZGVfbmV3KG4tPmtleSwgbmV3cG9zLCAxKTsKIAkJfQogCQllbHNlIHsKIAkJCW5ld3BvcyA9IDA7Ci0JCQl0biA9IHRub2RlX25ldyhrZXksIG5ld3BvcywgMSk7IC8qIEZpcnN0IHRub2RlICovIAorCQkJdG4gPSB0bm9kZV9uZXcoa2V5LCBuZXdwb3MsIDEpOyAvKiBGaXJzdCB0bm9kZSAqLwogCQl9Ci0JCWlmKCF0bikgCi0JCQl0cmllX2J1ZygidG5vZGVfcGZ4X25ldyBmYWlsZWQiKTsKIAorCQlpZiAoIXRuKSB7CisJCQlmcmVlX2xlYWZfaW5mbyhsaSk7CisJCQl0bm9kZV9mcmVlKChzdHJ1Y3QgdG5vZGUgKikgbCk7CisJCQkqZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CQkKKwkJCiAJCU5PREVfU0VUX1BBUkVOVCh0biwgdHApOwogCiAJCW1pc3NiaXQ9dGtleV9leHRyYWN0X2JpdHMoa2V5LCBuZXdwb3MsIDEpOwogCQlwdXRfY2hpbGQodCwgdG4sIG1pc3NiaXQsIChzdHJ1Y3Qgbm9kZSAqKWwpOwogCQlwdXRfY2hpbGQodCwgdG4sIDEtbWlzc2JpdCwgbik7CiAKLQkJaWYodHApIHsKKwkJaWYgKHRwKSB7CiAJCQljaW5kZXggPSB0a2V5X2V4dHJhY3RfYml0cyhrZXksIHRwLT5wb3MsIHRwLT5iaXRzKTsKIAkJCXB1dF9jaGlsZCh0LCAoc3RydWN0IHRub2RlICopdHAsIGNpbmRleCwgKHN0cnVjdCBub2RlICopdG4pOwogCQl9Ci0JCWVsc2UgeyAKKwkJZWxzZSB7CiAJCQl0LT50cmllID0gKHN0cnVjdCBub2RlKikgdG47IC8qIEZpcnN0IHRub2RlICovCiAJCQl0cCA9IHRuOwogCQl9CiAJfQotCWlmKHRwICYmIHRwLT5wb3MrdHAtPmJpdHMgPiAzMikgewotCQlwcmludGsoIkVSUk9SIHRwPSVwIHBvcz0lZCwgYml0cz0lZCwga2V5PSUweCBwbGVuPSVkXG4iLCAKKwlpZiAodHAgJiYgdHAtPnBvcyt0cC0+Yml0cyA+IDMyKSB7CisJCXByaW50aygiRVJST1IgdHA9JXAgcG9zPSVkLCBiaXRzPSVkLCBrZXk9JTB4IHBsZW49JWRcbiIsCiAJCSAgICAgICB0cCwgdHAtPnBvcywgdHAtPmJpdHMsIGtleSwgcGxlbik7CiAJfQogCS8qIFJlYmFsYW5jZSB0aGUgdHJpZSAqLwogCXQtPnRyaWUgPSB0cmllX3JlYmFsYW5jZSh0LCB0cCk7Ci1kb25lOjsKK2RvbmU6CisJdC0+cmV2aXNpb24rKzsKK2Vycjo7CiAJcmV0dXJuIGZhX2hlYWQ7CiB9CiAKQEAgLTEwMzcsNyArMTE4Niw3IEBACiB7CiAJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKikgdGItPnRiX2RhdGE7CiAJc3RydWN0IGZpYl9hbGlhcyAqZmEsICpuZXdfZmE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZmFfaGVhZD1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmZhX2hlYWQgPSBOVUxMOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAJaW50IHBsZW4gPSByLT5ydG1fZHN0X2xlbjsKIAlpbnQgdHlwZSA9IHItPnJ0bV90eXBlOwpAQCAtMTA1MCwxNyArMTE5OSwxNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtleSA9IDA7Ci0JaWYgKHJ0YS0+cnRhX2RzdCkgCisJaWYgKHJ0YS0+cnRhX2RzdCkKIAkJbWVtY3B5KCZrZXksIHJ0YS0+cnRhX2RzdCwgNCk7CiAKIAlrZXkgPSBudG9obChrZXkpOwogCi0JaWYodHJpZV9kZWJ1ZykKKwlpZiAodHJpZV9kZWJ1ZykKIAkJcHJpbnRrKCJJbnNlcnQgdGFibGU9JWQgJTA4eC8lZFxuIiwgdGItPnRiX2lkLCBrZXksIHBsZW4pOwogCi0JbWFzayA9ICBudG9obCggaW5ldF9tYWtlX21hc2socGxlbikgKTsKKwltYXNrID0gbnRvaGwoIGluZXRfbWFrZV9tYXNrKHBsZW4pICk7CiAKLQlpZihrZXkgJiB+bWFzaykKKwlpZiAoa2V5ICYgfm1hc2spCiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2V5ID0ga2V5ICYgbWFzazsKQEAgLTEwNjksOSArMTIxOCw5IEBACiAJCWdvdG8gZXJyOwogCiAJbCA9IGZpYl9maW5kX25vZGUodCwga2V5KTsKLQlmYSA9IE5VTEw7CQorCWZhID0gTlVMTDsKIAotCWlmKGwpIHsKKwlpZiAobCkgewogCQlmYV9oZWFkID0gZ2V0X2ZhX2hlYWQobCwgcGxlbik7CiAJCWZhID0gZmliX2ZpbmRfYWxpYXMoZmFfaGVhZCwgdG9zLCBmaS0+ZmliX3ByaW9yaXR5KTsKIAl9CkBAIC0xMTUwLDE0ICsxMjk5LDE4IEBACiAJbmV3X2ZhLT5mYV9zY29wZSA9IHItPnJ0bV9zY29wZTsKIAluZXdfZmEtPmZhX3N0YXRlID0gMDsKICNpZiAwCi0JbmV3X2ZhLT5kc3QgID0gTlVMTDsKKwluZXdfZmEtPmRzdCA9IE5VTEw7CiAjZW5kaWYKIAkvKgogCSAqIEluc2VydCBuZXcgZW50cnkgdG8gdGhlIGxpc3QuCiAJICovCiAKLQlpZighZmFfaGVhZCkKLQkJZmFfaGVhZCA9IGZpYl9pbnNlcnRfbm9kZSh0LCBrZXksIHBsZW4pOworCWlmICghZmFfaGVhZCkgeworCQlmYV9oZWFkID0gZmliX2luc2VydF9ub2RlKHQsICZlcnIsIGtleSwgcGxlbik7CisJCWVyciA9IDA7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mcmVlX25ld19mYTsKKwl9CiAKIAl3cml0ZV9sb2NrX2JoKCZmaWJfbG9jayk7CiAKQEAgLTExNzAsMTMgKzEzMjMsMTYgQEAKIAlydG1zZ19maWIoUlRNX05FV1JPVVRFLCBodG9ubChrZXkpLCBuZXdfZmEsIHBsZW4sIHRiLT50Yl9pZCwgbmxoZHIsIHJlcSk7CiBzdWNjZWVkZWQ6CiAJcmV0dXJuIDA7CisKK291dF9mcmVlX25ld19mYToKKwlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKIG91dDoKIAlmaWJfcmVsZWFzZV9pbmZvKGZpKTsKLWVycjo7CQorZXJyOjsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19sZWFmKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgbGVhZiAqbCwgIHRfa2V5IGtleSwgaW50ICpwbGVuLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwgCitzdGF0aWMgaW5saW5lIGludCBjaGVja19sZWFmKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgbGVhZiAqbCwgIHRfa2V5IGtleSwgaW50ICpwbGVuLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwKIAkJCSAgICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywgaW50ICplcnIpCiB7CiAJaW50IGk7CkBAIC0xMTg0LDEyICsxMzQwLDEyIEBACiAJc3RydWN0IGxlYWZfaW5mbyAqbGk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhoZWFkID0gJmwtPmxpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JCisKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShsaSwgbm9kZSwgaGhlYWQsIGhsaXN0KSB7CiAKIAkJaSA9IGxpLT5wbGVuOwogCQltYXNrID0gbnRvaGwoaW5ldF9tYWtlX21hc2soaSkpOwotCQlpZiAobC0+a2V5ICE9IChrZXkgJiBtYXNrKSkgCisJCWlmIChsLT5rZXkgIT0gKGtleSAmIG1hc2spKQogCQkJY29udGludWU7CiAKIAkJaWYgKCgoKmVycikgPSBmaWJfc2VtYW50aWNfbWF0Y2goJmxpLT5mYWxoLCBmbHAsIHJlcywgbC0+a2V5LCBtYXNrLCBpKSkgPT0gMCkgewpAQCAtMTIyMSw3ICsxMzc3LDcgQEAKIAluID0gdC0+dHJpZTsKIAogCXJlYWRfbG9jaygmZmliX2xvY2spOwotCWlmKCFuKQorCWlmICghbikKIAkJZ290byBmYWlsZWQ7CiAKICNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKQEAgLTEyMzAsMTkgKzEzODYsMTkgQEAKIAogCS8qIEp1c3QgYSBsZWFmPyAqLwogCWlmIChJU19MRUFGKG4pKSB7Ci0JCWlmKCBjaGVja19sZWFmKHQsIChzdHJ1Y3QgbGVhZiAqKW4sIGtleSwgJnBsZW4sIGZscCwgcmVzLCAmcmV0KSApCisJCWlmIChjaGVja19sZWFmKHQsIChzdHJ1Y3QgbGVhZiAqKW4sIGtleSwgJnBsZW4sIGZscCwgcmVzLCAmcmV0KSkKIAkJCWdvdG8gZm91bmQ7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAlwbiA9IChzdHJ1Y3QgdG5vZGUgKikgbjsKIAljaG9wcGVkX29mZiA9IDA7Ci0JCisKICAgICAgICAgd2hpbGUgKHBuKSB7CiAKIAkJcG9zID0gcG4tPnBvczsKIAkJYml0cyA9IHBuLT5iaXRzOwogCi0JCWlmKCFjaG9wcGVkX29mZikgCisJCWlmICghY2hvcHBlZF9vZmYpCiAJCQljaW5kZXggPSB0a2V5X2V4dHJhY3RfYml0cyhNQVNLX1BGWChrZXksIGN1cnJlbnRfcHJlZml4X2xlbmd0aCksIHBvcywgYml0cyk7CiAKIAkJbiA9IHRub2RlX2dldF9jaGlsZChwbiwgY2luZGV4KTsKQEAgLTEyNjIsMzMgKzE0MTgsMzMgQEAKIAkJCWludCBtcDsKIAogCQkJLyoKLQkJCSAqIEl0J3MgYSB0bm9kZSwgYW5kIHdlIGNhbiBkbyBzb21lIGV4dHJhIGNoZWNrcyBoZXJlIGlmIHdlIAorCQkJICogSXQncyBhIHRub2RlLCBhbmQgd2UgY2FuIGRvIHNvbWUgZXh0cmEgY2hlY2tzIGhlcmUgaWYgd2UKIAkJCSAqIGxpa2UsIHRvIGF2b2lkIGRlc2NlbmRpbmcgaW50byBhIGRlYWQtZW5kIGJyYW5jaC4KLQkJCSAqIFRoaXMgdG5vZGUgaXMgaW4gdGhlIHBhcmVudCdzIGNoaWxkIGFycmF5IGF0IGluZGV4IAotCQkJICoga2V5W3BfcG9zLi5wX3BvcytwX2JpdHNdIGJ1dCBwb3RlbnRpYWxseSB3aXRoIHNvbWUgYml0cyAKLQkJCSAqIGNob3BwZWQgb2ZmLCBzbyBpbiByZWFsaXR5IHRoZSBpbmRleCBtYXkgYmUganVzdCBhIAorCQkJICogVGhpcyB0bm9kZSBpcyBpbiB0aGUgcGFyZW50J3MgY2hpbGQgYXJyYXkgYXQgaW5kZXgKKwkJCSAqIGtleVtwX3Bvcy4ucF9wb3MrcF9iaXRzXSBidXQgcG90ZW50aWFsbHkgd2l0aCBzb21lIGJpdHMKKwkJCSAqIGNob3BwZWQgb2ZmLCBzbyBpbiByZWFsaXR5IHRoZSBpbmRleCBtYXkgYmUganVzdCBhCiAJCQkgKiBzdWJwcmVmaXgsIHBhZGRlZCB3aXRoIHplcm8gYXQgdGhlIGVuZC4KLQkJCSAqIFdlIGNhbiBhbHNvIHRha2UgYSBsb29rIGF0IGFueSBza2lwcGVkIGJpdHMgaW4gdGhpcyAKLQkJCSAqIHRub2RlIC0gZXZlcnl0aGluZyB1cCB0byBwX3BvcyBpcyBzdXBwb3NlZCB0byBiZSBvaywgCisJCQkgKiBXZSBjYW4gYWxzbyB0YWtlIGEgbG9vayBhdCBhbnkgc2tpcHBlZCBiaXRzIGluIHRoaXMKKwkJCSAqIHRub2RlIC0gZXZlcnl0aGluZyB1cCB0byBwX3BvcyBpcyBzdXBwb3NlZCB0byBiZSBvaywKIAkJCSAqIGFuZCB0aGUgbm9uLWNob3BwZWQgYml0cyBvZiB0aGUgaW5kZXggKHNlIHByZXZpb3VzCi0JCQkgKiBwYXJhZ3JhcGgpIGFyZSBhbHNvIGd1YXJhbnRlZWQgb2ssIGJ1dCB0aGUgcmVzdCBpcyAKKwkJCSAqIHBhcmFncmFwaCkgYXJlIGFsc28gZ3VhcmFudGVlZCBvaywgYnV0IHRoZSByZXN0IGlzCiAJCQkgKiBjb25zaWRlcmVkIHVua25vd24uCiAJCQkgKgogCQkJICogVGhlIHNraXBwZWQgYml0cyBhcmUga2V5W3BvcytiaXRzLi5jbi0+cG9zXS4KIAkJCSAqLwotCQkJCi0JCQkvKiBJZiBjdXJyZW50X3ByZWZpeF9sZW5ndGggPCBwb3MrYml0cywgd2UgYXJlIGFscmVhZHkgZG9pbmcgCi0JCQkgKiBhY3R1YWwgcHJlZml4ICBtYXRjaGluZywgd2hpY2ggbWVhbnMgZXZlcnl0aGluZyBmcm9tIAotCQkJICogcG9zKyhiaXRzLWNob3BwZWRfb2ZmKSBvbndhcmQgbXVzdCBiZSB6ZXJvIGFsb25nIHNvbWUgCi0JCQkgKiBicmFuY2ggb2YgdGhpcyBzdWJ0cmVlIC0gb3RoZXJ3aXNlIHRoZXJlIGlzICpubyogdmFsaWQgCisJCQorCQkJLyogSWYgY3VycmVudF9wcmVmaXhfbGVuZ3RoIDwgcG9zK2JpdHMsIHdlIGFyZSBhbHJlYWR5IGRvaW5nCisJCQkgKiBhY3R1YWwgcHJlZml4ICBtYXRjaGluZywgd2hpY2ggbWVhbnMgZXZlcnl0aGluZyBmcm9tCisJCQkgKiBwb3MrKGJpdHMtY2hvcHBlZF9vZmYpIG9ud2FyZCBtdXN0IGJlIHplcm8gYWxvbmcgc29tZQorCQkJICogYnJhbmNoIG9mIHRoaXMgc3VidHJlZSAtIG90aGVyd2lzZSB0aGVyZSBpcyAqbm8qIHZhbGlkCiAJCQkgKiBwcmVmaXggcHJlc2VudC4gSGVyZSB3ZSBjYW4gb25seSBjaGVjayB0aGUgc2tpcHBlZAotCQkJICogYml0cy4gUmVtZW1iZXIsIHNpbmNlIHdlIGhhdmUgYWxyZWFkeSBpbmRleGVkIGludG8gdGhlIAotCQkJICogcGFyZW50J3MgY2hpbGQgYXJyYXksIHdlIGtub3cgdGhhdCB0aGUgYml0cyB3ZSBjaG9wcGVkIG9mIAorCQkJICogYml0cy4gUmVtZW1iZXIsIHNpbmNlIHdlIGhhdmUgYWxyZWFkeSBpbmRleGVkIGludG8gdGhlCisJCQkgKiBwYXJlbnQncyBjaGlsZCBhcnJheSwgd2Uga25vdyB0aGF0IHRoZSBiaXRzIHdlIGNob3BwZWQgb2YKIAkJCSAqICphcmUqIHplcm8uCiAJCQkgKi8KIAogCQkJLyogTk9UQSBCRU5FOiBDSEVDS0lORyBPTkxZIFNLSVBQRUQgQklUUyBGT1IgVEhFIE5FVyBOT0RFIEhFUkUgKi8KLQkJCQorCQkKIAkJCWlmIChjdXJyZW50X3ByZWZpeF9sZW5ndGggPCBwb3MrYml0cykgewogCQkJCWlmICh0a2V5X2V4dHJhY3RfYml0cyhjbi0+a2V5LCBjdXJyZW50X3ByZWZpeF9sZW5ndGgsCiAJCQkJCQkgICAgICBjbi0+cG9zIC0gY3VycmVudF9wcmVmaXhfbGVuZ3RoKSAhPSAwIHx8CkBAIC0xMjk3LDEzICsxNDUzLDEzIEBACiAJCQl9CiAKIAkJCS8qCi0JCQkgKiBJZiBjaG9wcGVkX29mZj0wLCB0aGUgaW5kZXggaXMgZnVsbHkgdmFsaWRhdGVkIGFuZCB3ZSAKLQkJCSAqIG9ubHkgbmVlZCB0byBsb29rIGF0IHRoZSBza2lwcGVkIGJpdHMgZm9yIHRoaXMsIHRoZSBuZXcsIAorCQkJICogSWYgY2hvcHBlZF9vZmY9MCwgdGhlIGluZGV4IGlzIGZ1bGx5IHZhbGlkYXRlZCBhbmQgd2UKKwkJCSAqIG9ubHkgbmVlZCB0byBsb29rIGF0IHRoZSBza2lwcGVkIGJpdHMgZm9yIHRoaXMsIHRoZSBuZXcsCiAJCQkgKiB0bm9kZS4gV2hhdCB3ZSBhY3R1YWxseSB3YW50IHRvIGRvIGlzIHRvIGZpbmQgb3V0IGlmCiAJCQkgKiB0aGVzZSBza2lwcGVkIGJpdHMgbWF0Y2ggb3VyIGtleSBwZXJmZWN0bHksIG9yIGlmIHdlIHdpbGwKLQkJCSAqIGhhdmUgdG8gY291bnQgb24gZmluZGluZyBhIG1hdGNoaW5nIHByZWZpeCBmdXJ0aGVyIGRvd24sIAotCQkJICogYmVjYXVzZSBpZiB3ZSBkbywgd2Ugd291bGQgbGlrZSB0byBoYXZlIHNvbWUgd2F5IG9mIAotCQkJICogdmVyaWZ5aW5nIHRoZSBleGlzdGVuY2Ugb2Ygc3VjaCBhIHByZWZpeCBhdCB0aGlzIHBvaW50LiAKKwkJCSAqIGhhdmUgdG8gY291bnQgb24gZmluZGluZyBhIG1hdGNoaW5nIHByZWZpeCBmdXJ0aGVyIGRvd24sCisJCQkgKiBiZWNhdXNlIGlmIHdlIGRvLCB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUgc29tZSB3YXkgb2YKKwkJCSAqIHZlcmlmeWluZyB0aGUgZXhpc3RlbmNlIG9mIHN1Y2ggYSBwcmVmaXggYXQgdGhpcyBwb2ludC4KIAkJCSAqLwogCiAJCQkvKiBUaGUgb25seSB0aGluZyB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCBpcyB0byB2ZXJpZnkgdGhhdApAQCAtMTMxNSwyMiArMTQ3MSwyMiBAQAogCQkJICogbmV3IHRub2RlJ3Mga2V5LgogCQkJICovCiAKLQkJCS8qIE5vdGU6IFdlIGFyZW4ndCB2ZXJ5IGNvbmNlcm5lZCBhYm91dCB0aGUgcGllY2Ugb2YgdGhlIGtleSAKLQkJCSAqIHRoYXQgcHJlY2VkZSBwbi0+cG9zK3BuLT5iaXRzLCBzaW5jZSB0aGVzZSBoYXZlIGFscmVhZHkgYmVlbiAKLQkJCSAqIGNoZWNrZWQuIFRoZSBiaXRzIGFmdGVyIGNuLT5wb3MgYXJlbid0IGNoZWNrZWQgc2luY2UgdGhlc2UgYXJlIAotCQkJICogYnkgZGVmaW5pdGlvbiAidW5rbm93biIgYXQgdGhpcyBwb2ludC4gVGh1cywgd2hhdCB3ZSB3YW50IHRvIAotCQkJICogc2VlIGlzIGlmIHdlIGFyZSBhYm91dCB0byBlbnRlciB0aGUgInByZWZpeCBtYXRjaGluZyIgc3RhdGUsIAotCQkJICogYW5kIGluIHRoYXQgY2FzZSB2ZXJpZnkgdGhhdCB0aGUgc2tpcHBlZCBiaXRzIHRoYXQgd2lsbCBwcmV2YWlsIAotCQkJICogdGhyb3VnaG91dCB0aGlzIHN1YnRyZWUgYXJlIHplcm8sIGFzIHRoZXkgaGF2ZSB0byBiZSBpZiB3ZSBhcmUgCisJCQkvKiBOb3RlOiBXZSBhcmVuJ3QgdmVyeSBjb25jZXJuZWQgYWJvdXQgdGhlIHBpZWNlIG9mIHRoZSBrZXkKKwkJCSAqIHRoYXQgcHJlY2VkZSBwbi0+cG9zK3BuLT5iaXRzLCBzaW5jZSB0aGVzZSBoYXZlIGFscmVhZHkgYmVlbgorCQkJICogY2hlY2tlZC4gVGhlIGJpdHMgYWZ0ZXIgY24tPnBvcyBhcmVuJ3QgY2hlY2tlZCBzaW5jZSB0aGVzZSBhcmUKKwkJCSAqIGJ5IGRlZmluaXRpb24gInVua25vd24iIGF0IHRoaXMgcG9pbnQuIFRodXMsIHdoYXQgd2Ugd2FudCB0bworCQkJICogc2VlIGlzIGlmIHdlIGFyZSBhYm91dCB0byBlbnRlciB0aGUgInByZWZpeCBtYXRjaGluZyIgc3RhdGUsCisJCQkgKiBhbmQgaW4gdGhhdCBjYXNlIHZlcmlmeSB0aGF0IHRoZSBza2lwcGVkIGJpdHMgdGhhdCB3aWxsIHByZXZhaWwKKwkJCSAqIHRocm91Z2hvdXQgdGhpcyBzdWJ0cmVlIGFyZSB6ZXJvLCBhcyB0aGV5IGhhdmUgdG8gYmUgaWYgd2UgYXJlCiAJCQkgKiB0byBmaW5kIGEgbWF0Y2hpbmcgcHJlZml4LgogCQkJICovCiAKIAkJCW5vZGVfcHJlZml4ID0gTUFTS19QRlgoY24tPmtleSwgY24tPnBvcyk7Ci0JCQlrZXlfcHJlZml4ID0gIE1BU0tfUEZYKGtleSwgY24tPnBvcyk7CisJCQlrZXlfcHJlZml4ID0gTUFTS19QRlgoa2V5LCBjbi0+cG9zKTsKIAkJCXByZWZfbWlzbWF0Y2ggPSBrZXlfcHJlZml4Xm5vZGVfcHJlZml4OwogCQkJbXAgPSAwOwogCi0JCQkvKiBJbiBzaG9ydDogSWYgc2tpcHBlZCBiaXRzIGluIHRoaXMgbm9kZSBkbyBub3QgbWF0Y2ggdGhlIHNlYXJjaCAKKwkJCS8qIEluIHNob3J0OiBJZiBza2lwcGVkIGJpdHMgaW4gdGhpcyBub2RlIGRvIG5vdCBtYXRjaCB0aGUgc2VhcmNoCiAJCQkgKiBrZXksIGVudGVyIHRoZSAicHJlZml4IG1hdGNoaW5nIiBzdGF0ZS5kaXJlY3RseS4KIAkJCSAqLwogCQkJaWYgKHByZWZfbWlzbWF0Y2gpIHsKQEAgLTEzMzksNyArMTQ5NSw3IEBACiAJCQkJCXByZWZfbWlzbWF0Y2ggPSBwcmVmX21pc21hdGNoIDw8MTsKIAkJCQl9CiAJCQkJa2V5X3ByZWZpeCA9IHRrZXlfZXh0cmFjdF9iaXRzKGNuLT5rZXksIG1wLCBjbi0+cG9zLW1wKTsKLQkJCQkKKwkJCQogCQkJCWlmIChrZXlfcHJlZml4ICE9IDApCiAJCQkJCWdvdG8gYmFja3RyYWNlOwogCkBAIC0xMzUwLDkgKzE1MDYsOSBAQAogCQkgICAgICAgcG4gPSAoc3RydWN0IHRub2RlICopbjsgLyogRGVzY2VuZCAqLwogCQkgICAgICAgY2hvcHBlZF9vZmYgPSAwOwogCQkgICAgICAgY29udGludWU7Ci0JCX0gCi0JCWlmIChJU19MRUFGKG4pKSB7CQotCQkJaWYoIGNoZWNrX2xlYWYodCwgKHN0cnVjdCBsZWFmICopbiwga2V5LCAmcGxlbiwgZmxwLCByZXMsICZyZXQpKQorCQl9CisJCWlmIChJU19MRUFGKG4pKSB7CisJCQlpZiAoY2hlY2tfbGVhZih0LCAoc3RydWN0IGxlYWYgKiluLCBrZXksICZwbGVuLCBmbHAsIHJlcywgJnJldCkpCiAJCQkJZ290byBmb3VuZDsKIAkgICAgICAgfQogYmFja3RyYWNlOgpAQCAtMTM2NiwxOCArMTUyMiwxOCBAQAogCQkvKiBEZWNyZWFzZSBjdXJyZW50Xy4uLiB3aXRoIGJpdHMgY2hvcHBlZCBvZmYgKi8KIAkJaWYgKGN1cnJlbnRfcHJlZml4X2xlbmd0aCA+IHBuLT5wb3MgKyBwbi0+Yml0cyAtIGNob3BwZWRfb2ZmKQogCQkJY3VycmVudF9wcmVmaXhfbGVuZ3RoID0gcG4tPnBvcyArIHBuLT5iaXRzIC0gY2hvcHBlZF9vZmY7Ci0JCQorCQogCQkvKgotCQkgKiBFaXRoZXIgd2UgZG8gdGhlIGFjdHVhbCBjaG9wIG9mZiBhY2NvcmRpbmcgb3IgaWYgd2UgaGF2ZSAKKwkJICogRWl0aGVyIHdlIGRvIHRoZSBhY3R1YWwgY2hvcCBvZmYgYWNjb3JkaW5nIG9yIGlmIHdlIGhhdmUKIAkJICogY2hvcHBlZCBvZmYgYWxsIGJpdHMgaW4gdGhpcyB0bm9kZSB3YWxrIHVwIHRvIG91ciBwYXJlbnQuCiAJCSAqLwogCi0JCWlmKGNob3BwZWRfb2ZmIDw9IHBuLT5iaXRzKQorCQlpZiAoY2hvcHBlZF9vZmYgPD0gcG4tPmJpdHMpCiAJCQljaW5kZXggJj0gfigxIDw8IChjaG9wcGVkX29mZi0xKSk7CiAJCWVsc2UgewotCQkJaWYoIE5PREVfUEFSRU5UKHBuKSA9PSBOVUxMKQorCQkJaWYgKE5PREVfUEFSRU5UKHBuKSA9PSBOVUxMKQogCQkJCWdvdG8gZmFpbGVkOwotCQkJCisJCQogCQkJLyogR2V0IENoaWxkJ3MgaW5kZXggKi8KIAkJCWNpbmRleCA9IHRrZXlfZXh0cmFjdF9iaXRzKHBuLT5rZXksIE5PREVfUEFSRU5UKHBuKS0+cG9zLCBOT0RFX1BBUkVOVChwbiktPmJpdHMpOwogCQkJcG4gPSBOT0RFX1BBUkVOVChwbik7CkBAIC0xMzg3LDEwICsxNTQzLDEwIEBACiAJCQl0LT5zdGF0cy5iYWNrdHJhY2srKzsKICNlbmRpZgogCQkJZ290byBiYWNrdHJhY2U7Ci0JCX0gCisJCX0KIAl9CiBmYWlsZWQ6Ci0JcmV0ID0gIDE7CisJcmV0ID0gMTsKIGZvdW5kOgogCXJlYWRfdW5sb2NrKCZmaWJfbG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTE0MDMsMTEgKzE1NTksMTEgQEAKIAlzdHJ1Y3Qgbm9kZSAqbiA9IHQtPnRyaWU7CiAJc3RydWN0IGxlYWYgKmw7CiAKLQlpZih0cmllX2RlYnVnKSAKKwlpZiAodHJpZV9kZWJ1ZykKIAkJcHJpbnRrKCJlbnRlcmluZyB0cmllX2xlYWZfcmVtb3ZlKCVwKVxuIiwgbik7CiAKIAkvKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugc2tpcHBlZCBiaXRzLCB0aG9zZSBiaXRzIGFyZSAqbm90KiBjaGVja2VkIQotCSAqIFdoZW4gd2UgZmluaXNoIHRoaXMsIHdlIHdpbGwgaGF2ZSBOVUxMIG9yIGEgVF9MRUFGLCBhbmQgdGhlIAorCSAqIFdoZW4gd2UgZmluaXNoIHRoaXMsIHdlIHdpbGwgaGF2ZSBOVUxMIG9yIGEgVF9MRUFGLCBhbmQgdGhlCiAJICogVF9MRUFGIG1heSBvciBtYXkgbm90IG1hdGNoIG91ciBrZXkuCiAJICovCiAKQEAgLTE0MTYsMTkgKzE1NzIsMTkgQEAKIAkJY2hlY2tfdG5vZGUodG4pOwogCQluID0gdG5vZGVfZ2V0X2NoaWxkKHRuICx0a2V5X2V4dHJhY3RfYml0cyhrZXksIHRuLT5wb3MsIHRuLT5iaXRzKSk7CiAKLQkJCWlmKG4gJiYgTk9ERV9QQVJFTlQobikgIT0gdG4pIHsKKwkJCWlmIChuICYmIE5PREVfUEFSRU5UKG4pICE9IHRuKSB7CiAJCQkJcHJpbnRrKCJCVUcgdG49JXAsIG4tPnBhcmVudD0lcFxuIiwgdG4sIE5PREVfUEFSRU5UKG4pKTsKIAkJCQlCVUcoKTsKIAkJCX0KICAgICAgICAgfQogCWwgPSAoc3RydWN0IGxlYWYgKikgbjsKIAotCWlmKCFuIHx8ICF0a2V5X2VxdWFscyhsLT5rZXksIGtleSkpIAorCWlmICghbiB8fCAhdGtleV9lcXVhbHMobC0+a2V5LCBrZXkpKQogCQlyZXR1cm4gMDsKLSAgICAKLQkvKiAKLQkgKiBLZXkgZm91bmQuIAotCSAqIFJlbW92ZSB0aGUgbGVhZiBhbmQgcmViYWxhbmNlIHRoZSB0cmVlIAorCisJLyoKKwkgKiBLZXkgZm91bmQuCisJICogUmVtb3ZlIHRoZSBsZWFmIGFuZCByZWJhbGFuY2UgdGhlIHRyZWUKIAkgKi8KIAogCXQtPnJldmlzaW9uKys7CkBAIC0xNDM3LDcgKzE1OTMsNyBAQAogCXRwID0gTk9ERV9QQVJFTlQobik7CiAJdG5vZGVfZnJlZSgoc3RydWN0IHRub2RlICopIG4pOwogCi0JaWYodHApIHsKKwlpZiAodHApIHsKIAkJY2luZGV4ID0gdGtleV9leHRyYWN0X2JpdHMoa2V5LCB0cC0+cG9zLCB0cC0+Yml0cyk7CiAJCXB1dF9jaGlsZCh0LCAoc3RydWN0IHRub2RlICopdHAsIGNpbmRleCwgTlVMTCk7CiAJCXQtPnRyaWUgPSB0cmllX3JlYmFsYW5jZSh0LCB0cCk7CkBAIC0xNDYwLDIzICsxNjE2LDIzIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZmFfaGVhZDsKIAlzdHJ1Y3QgbGVhZiAqbDsKIAotCWlmIChwbGVuID4gMzIpIAorCWlmIChwbGVuID4gMzIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2V5ID0gMDsKLQlpZiAocnRhLT5ydGFfZHN0KSAKKwlpZiAocnRhLT5ydGFfZHN0KQogCQltZW1jcHkoJmtleSwgcnRhLT5ydGFfZHN0LCA0KTsKIAogCWtleSA9IG50b2hsKGtleSk7Ci0JbWFzayA9ICBudG9obCggaW5ldF9tYWtlX21hc2socGxlbikgKTsKKwltYXNrID0gbnRvaGwoIGluZXRfbWFrZV9tYXNrKHBsZW4pICk7CiAKLQlpZihrZXkgJiB+bWFzaykKKwlpZiAoa2V5ICYgfm1hc2spCiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2V5ID0ga2V5ICYgbWFzazsKIAlsID0gZmliX2ZpbmRfbm9kZSh0LCBrZXkpOwogCi0JaWYoIWwpCisJaWYgKCFsKQogCQlyZXR1cm4gLUVTUkNIOwogCiAJZmFfaGVhZCA9IGdldF9mYV9oZWFkKGwsIHBsZW4pOwpAQCAtMTUyMiwxNiArMTY3OCwxNiBAQAogCiAJCWxpc3RfZGVsKCZmYS0+ZmFfbGlzdCk7CiAKLQkJaWYobGlzdF9lbXB0eShmYV9oZWFkKSkgeworCQlpZiAobGlzdF9lbXB0eShmYV9oZWFkKSkgewogCQkJaGxpc3RfZGVsKCZsaS0+aGxpc3QpOwogCQkJa2lsbF9saSA9IDE7CiAJCX0KIAkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfbG9jayk7Ci0JCQotCQlpZihraWxsX2xpKQorCQorCQlpZiAoa2lsbF9saSkKIAkJCWZyZWVfbGVhZl9pbmZvKGxpKTsKIAotCQlpZihobGlzdF9lbXB0eSgmbC0+bGlzdCkpCisJCWlmIChobGlzdF9lbXB0eSgmbC0+bGlzdCkpCiAJCQl0cmllX2xlYWZfcmVtb3ZlKHQsIGtleSk7CiAKIAkJaWYgKGZhLT5mYV9zdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCkBAIC0xNTUwLDEyICsxNzA2LDEyIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIGZhX25vZGUsIGhlYWQsIGZhX2xpc3QpIHsKIAkJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOwotCQkKKwkKIAkJaWYgKGZpICYmIChmaS0+ZmliX2ZsYWdzJlJUTkhfRl9ERUFEKSkgewogCi0gCQkJd3JpdGVfbG9ja19iaCgmZmliX2xvY2spOwkKKyAJCQl3cml0ZV9sb2NrX2JoKCZmaWJfbG9jayk7CiAJCQlsaXN0X2RlbCgmZmEtPmZhX2xpc3QpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfbG9jayk7IAorCQkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfbG9jayk7CiAKIAkJCWZuX2ZyZWVfYWxpYXMoZmEpOwogCQkJZm91bmQrKzsKQEAgLTE1NzIsMTQgKzE3MjgsMTQgQEAKIAlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IE5VTEw7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpLCBub2RlLCB0bXAsIGxpaCwgaGxpc3QpIHsKLQkJCQorCQkKIAkJZm91bmQgKz0gdHJpZV9mbHVzaF9saXN0KHQsICZsaS0+ZmFsaCk7CiAKIAkJaWYgKGxpc3RfZW1wdHkoJmxpLT5mYWxoKSkgewogCi0gCQkJd3JpdGVfbG9ja19iaCgmZmliX2xvY2spOyAKKyAJCQl3cml0ZV9sb2NrX2JoKCZmaWJfbG9jayk7CiAJCQlobGlzdF9kZWwoJmxpLT5obGlzdCk7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9sb2NrKTsgCisJCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9sb2NrKTsKIAogCQkJZnJlZV9sZWFmX2luZm8obGkpOwogCQl9CkBAIC0xNTkzLDggKzE3NDksOCBAQAogCXN0cnVjdCB0bm9kZSAqcDsKIAlpbnQgaWR4OwogCi0JaWYoYyA9PSBOVUxMKSB7Ci0JCWlmKHQtPnRyaWUgPT0gTlVMTCkKKwlpZiAoYyA9PSBOVUxMKSB7CisJCWlmICh0LT50cmllID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAogCQlpZiAoSVNfTEVBRih0LT50cmllKSkgICAgICAgICAgLyogdHJpZSB3LiBqdXN0IGEgbGVhZiAqLwpAQCAtMTYwMiwzMyArMTc1OCwzNCBAQAogCiAJCXAgPSAoc3RydWN0IHRub2RlKikgdC0+dHJpZTsgIC8qIFN0YXJ0ICovCiAJfQotCWVsc2UgCisJZWxzZQogCQlwID0gKHN0cnVjdCB0bm9kZSAqKSBOT0RFX1BBUkVOVChjKTsKKwogCXdoaWxlIChwKSB7CiAJCWludCBwb3MsIGxhc3Q7CiAKIAkJLyogIEZpbmQgdGhlIG5leHQgY2hpbGQgb2YgdGhlIHBhcmVudCAqLwotCQlpZihjKQotCQkJcG9zICA9IDEgKyB0a2V5X2V4dHJhY3RfYml0cyhjLT5rZXksIHAtPnBvcywgcC0+Yml0cyk7Ci0JCWVsc2UgCisJCWlmIChjKQorCQkJcG9zID0gMSArIHRrZXlfZXh0cmFjdF9iaXRzKGMtPmtleSwgcC0+cG9zLCBwLT5iaXRzKTsKKwkJZWxzZQogCQkJcG9zID0gMDsKIAogCQlsYXN0ID0gMSA8PCBwLT5iaXRzOwogCQlmb3IoaWR4ID0gcG9zOyBpZHggPCBsYXN0IDsgaWR4KyspIHsKLQkJCWlmKCBwLT5jaGlsZFtpZHhdKSB7CisJCQlpZiAocC0+Y2hpbGRbaWR4XSkgewogCiAJCQkJLyogRGVjZW5kIGlmIHRub2RlICovCiAKIAkJCQl3aGlsZSAoSVNfVE5PREUocC0+Y2hpbGRbaWR4XSkpIHsKIAkJCQkJcCA9IChzdHJ1Y3QgdG5vZGUqKSBwLT5jaGlsZFtpZHhdOwogCQkJCQlpZHggPSAwOwotCQkJCQkKKwkJCQkKIAkJCQkJLyogUmlnaHRtb3N0IG5vbi1OVUxMIGJyYW5jaCAqLwotCQkJCQlpZiggcCAmJiBJU19UTk9ERShwKSApCi0JCQkJCQl3aGlsZSAoIHAtPmNoaWxkW2lkeF0gPT0gTlVMTCAmJiBpZHggPCAoMSA8PCBwLT5iaXRzKSApIGlkeCsrOworCQkJCQlpZiAocCAmJiBJU19UTk9ERShwKSkKKwkJCQkJCXdoaWxlIChwLT5jaGlsZFtpZHhdID09IE5VTEwgJiYgaWR4IDwgKDEgPDwgcC0+Yml0cykpIGlkeCsrOwogCiAJCQkJCS8qIERvbmUgd2l0aCB0aGlzIHRub2RlPyAqLwotCQkJCQlpZiggaWR4ID49ICgxIDw8IHAtPmJpdHMpIHx8IHAtPmNoaWxkW2lkeF0gPT0gTlVMTCApIAorCQkJCQlpZiAoaWR4ID49ICgxIDw8IHAtPmJpdHMpIHx8IHAtPmNoaWxkW2lkeF0gPT0gTlVMTCApCiAJCQkJCQlnb3RvIHVwOwogCQkJCX0KIAkJCQlyZXR1cm4gKHN0cnVjdCBsZWFmKikgcC0+Y2hpbGRbaWR4XTsKQEAgLTE2NjEsNyArMTgxOCw3IEBACiAJaWYgKGxsICYmIGhsaXN0X2VtcHR5KCZsbC0+bGlzdCkpCiAJCXRyaWVfbGVhZl9yZW1vdmUodCwgbGwtPmtleSk7CiAKLQlpZih0cmllX2RlYnVnKSAKKwlpZiAodHJpZV9kZWJ1ZykKIAkJcHJpbnRrKCJ0cmllX2ZsdXNoIGZvdW5kPSVkXG4iLCBmb3VuZCk7CiAJcmV0dXJuIGZvdW5kOwogfQpAQCAtMTY4NCwzMiArMTg0MSwzMiBAQAogCW9yZGVyID0gLTE7CiAKIAlyZWFkX2xvY2soJmZpYl9sb2NrKTsKLQkKKwogCWwgPSBmaWJfZmluZF9ub2RlKHQsIDApOwotCWlmKCFsKSAKKwlpZiAoIWwpCiAJCWdvdG8gb3V0OwogCiAJZmFfaGVhZCA9IGdldF9mYV9oZWFkKGwsIDApOwotCWlmKCFmYV9oZWFkKQorCWlmICghZmFfaGVhZCkKIAkJZ290byBvdXQ7CiAKLQlpZiAobGlzdF9lbXB0eShmYV9oZWFkKSkgCisJaWYgKGxpc3RfZW1wdHkoZmFfaGVhZCkpCiAJCWdvdG8gb3V0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmYSwgZmFfaGVhZCwgZmFfbGlzdCkgewogCQlzdHJ1Y3QgZmliX2luZm8gKm5leHRfZmkgPSBmYS0+ZmFfaW5mbzsKLQkJCisJCiAJCWlmIChmYS0+ZmFfc2NvcGUgIT0gcmVzLT5zY29wZSB8fAogCQkgICAgZmEtPmZhX3R5cGUgIT0gUlROX1VOSUNBU1QpCiAJCQljb250aW51ZTsKLQkJCisJCiAJCWlmIChuZXh0X2ZpLT5maWJfcHJpb3JpdHkgPiByZXMtPmZpLT5maWJfcHJpb3JpdHkpCiAJCQlicmVhazsKIAkJaWYgKCFuZXh0X2ZpLT5maWJfbmhbMF0ubmhfZ3cgfHwKIAkJICAgIG5leHRfZmktPmZpYl9uaFswXS5uaF9zY29wZSAhPSBSVF9TQ09QRV9MSU5LKQogCQkJY29udGludWU7CiAJCWZhLT5mYV9zdGF0ZSB8PSBGQV9TX0FDQ0VTU0VEOwotCQkKKwkKIAkJaWYgKGZpID09IE5VTEwpIHsKIAkJCWlmIChuZXh0X2ZpICE9IHJlcy0+ZmkpCiAJCQkJYnJlYWs7CkBAIC0xNzQ3LDEwICsxOTA0LDEwIEBACiAJfQogCXRyaWVfbGFzdF9kZmx0ID0gbGFzdF9pZHg7CiAgb3V0OjsKLQlyZWFkX3VubG9jaygmZmliX2xvY2spOwkKKwlyZWFkX3VubG9jaygmZmliX2xvY2spOwogfQogCi1zdGF0aWMgaW50IGZuX3RyaWVfZHVtcF9mYSh0X2tleSBrZXksIGludCBwbGVuLCBzdHJ1Y3QgbGlzdF9oZWFkICpmYWgsIHN0cnVjdCBmaWJfdGFibGUgKnRiLCAKK3N0YXRpYyBpbnQgZm5fdHJpZV9kdW1wX2ZhKHRfa2V5IGtleSwgaW50IHBsZW4sIHN0cnVjdCBsaXN0X2hlYWQgKmZhaCwgc3RydWN0IGZpYl90YWJsZSAqdGIsCiAJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJaW50IGksIHNfaTsKQEAgLTE3OTYsNyArMTk1Myw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCi1zdGF0aWMgaW50IGZuX3RyaWVfZHVtcF9wbGVuKHN0cnVjdCB0cmllICp0LCBpbnQgcGxlbiwgc3RydWN0IGZpYl90YWJsZSAqdGIsIHN0cnVjdCBza19idWZmICpza2IsIAorc3RhdGljIGludCBmbl90cmllX2R1bXBfcGxlbihzdHJ1Y3QgdHJpZSAqdCwgaW50IHBsZW4sIHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJaW50IGgsIHNfaDsKQEAgLTE4MTMsMTEgKzE5NzAsMTEgQEAKIAkJCSAgICAgICBzaXplb2YoY2ItPmFyZ3MpIC0gMypzaXplb2YoY2ItPmFyZ3NbMF0pKTsKIAogCQlmYV9oZWFkID0gZ2V0X2ZhX2hlYWQobCwgcGxlbik7Ci0JCQotCQlpZighZmFfaGVhZCkKKwkKKwkJaWYgKCFmYV9oZWFkKQogCQkJY29udGludWU7CiAKLQkJaWYobGlzdF9lbXB0eShmYV9oZWFkKSkKKwkJaWYgKGxpc3RfZW1wdHkoZmFfaGVhZCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZm5fdHJpZV9kdW1wX2ZhKGwtPmtleSwgcGxlbiwgZmFfaGVhZCwgdGIsIHNrYiwgY2IpPDApIHsKQEAgLTE4OTMsMTAgKzIwNTAsMTAgQEAKIAogCXRyaWVfaW5pdCh0KTsKIAotCWlmIChpZCA9PSBSVF9UQUJMRV9MT0NBTCkgCi0gICAgICAgICAgICAgICAgdHJpZV9sb2NhbD10OwotCSAgZWxzZSBpZiAoaWQgPT0gUlRfVEFCTEVfTUFJTikgCi0gICAgICAgICAgICAgICAgdHJpZV9tYWluPXQ7CisJaWYgKGlkID09IFJUX1RBQkxFX0xPQ0FMKQorICAgICAgICAgICAgICAgIHRyaWVfbG9jYWwgPSB0OworCWVsc2UgaWYgKGlkID09IFJUX1RBQkxFX01BSU4pCisgICAgICAgICAgICAgICAgdHJpZV9tYWluID0gdDsKIAogCWlmIChpZCA9PSBSVF9UQUJMRV9MT0NBTCkKIAkJcHJpbnRrKCJJUHY0IEZJQjogVXNpbmcgTEMtdHJpZSB2ZXJzaW9uICVzXG4iLCBWRVJTSU9OKTsKQEAgLTE5MTcsNyArMjA3NCw3IEBACiAJCXNlcV9wcmludGYoc2VxLCAiJXMiLCAodiAmICgxPDxiaXRzKSk/IjEiOiIwIik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50bm9kZV9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBpbmRlbnQsIHN0cnVjdCBub2RlICpuLCAKK3N0YXRpYyB2b2lkIHByaW50bm9kZV9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBpbmRlbnQsIHN0cnVjdCBub2RlICpuLAogCQkgICBpbnQgcGVuZCwgaW50IGNpbmRleCwgaW50IGJpdHMpCiB7CiAJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsKQEAgLTE5MzUsMTIgKzIwOTIsMTIgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIiVzOiVwICIsIElTX0xFQUYobik/IkxlYWYiOiJJbnRlcm5hbCBub2RlIiwgbik7CiAKIAlpZiAoSVNfTEVBRihuKSkKLQkJc2VxX3ByaW50ZihzZXEsICJrZXk9JWQuJWQuJWQuJWRcbiIsIAorCQlzZXFfcHJpbnRmKHNlcSwgImtleT0lZC4lZC4lZC4lZFxuIiwKIAkJCSAgIG4tPmtleSA+PiAyNCwgKG4tPmtleSA+PiAxNikgJSAyNTYsIChuLT5rZXkgPj4gOCkgJSAyNTYsIG4tPmtleSAlIDI1Nik7CiAJZWxzZSB7Ci0JCWludCBwbGVuPSgoc3RydWN0IHRub2RlICopbiktPnBvczsKKwkJaW50IHBsZW4gPSAoKHN0cnVjdCB0bm9kZSAqKW4pLT5wb3M7CiAJCXRfa2V5IHByZj1NQVNLX1BGWChuLT5rZXksIHBsZW4pOwotCQlzZXFfcHJpbnRmKHNlcSwgImtleT0lZC4lZC4lZC4lZC8lZFxuIiwgCisJCXNlcV9wcmludGYoc2VxLCAia2V5PSVkLiVkLiVkLiVkLyVkXG4iLAogCQkJICAgcHJmID4+IDI0LCAocHJmID4+IDE2KSAlIDI1NiwgKHByZiA+PiA4KSAlIDI1NiwgcHJmICUgMjU2LCBwbGVuKTsKIAl9CiAJaWYgKElTX0xFQUYobikpIHsKQEAgLTE5NDgsMTQgKzIxMDUsMTQgQEAKIAkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CiAJCWludCBpOwogCQlmb3IgKGk9MzI7IGk+PTA7IGktLSkKLQkJICBpZihmaW5kX2xlYWZfaW5mbygmbC0+bGlzdCwgaSkpIHsKLQkJCQorCQkgIGlmIChmaW5kX2xlYWZfaW5mbygmbC0+bGlzdCwgaSkpIHsKKwkJCiAJCQkJc3RydWN0IGxpc3RfaGVhZCAqZmFfaGVhZCA9IGdldF9mYV9oZWFkKGwsIGkpOwotCQkJCQotCQkJCWlmKCFmYV9oZWFkKQorCQkJCisJCQkJaWYgKCFmYV9oZWFkKQogCQkJCQljb250aW51ZTsKIAotCQkJCWlmKGxpc3RfZW1wdHkoZmFfaGVhZCkpCisJCQkJaWYgKGxpc3RfZW1wdHkoZmFfaGVhZCkpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KzIpOwpAQCAtMTk4MSw3ICsyMTM4LDcgQEAKIAkJCX0KIAl9CiAJZWxzZSBpZiAoSVNfVE5PREUobikpIHsKLQkJc3RydWN0IHRub2RlICp0bj0oc3RydWN0IHRub2RlICopbjsKKwkJc3RydWN0IHRub2RlICp0biA9IChzdHJ1Y3QgdG5vZGUgKiluOwogCQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOyBzZXFfcHJpbnRmKHNlcSwgInwgICAgIik7CiAJCXNlcV9wcmludGYoc2VxLCAie2tleSBwcmVmaXg9JTA4eC8iLCB0bi0+a2V5JlRLRVlfR0VUX01BU0soMCwgdG4tPnBvcykpOwogCQlwcmludGJpbl9zZXEoc2VxLCB0a2V5X2V4dHJhY3RfYml0cyh0bi0+a2V5LCAwLCB0bi0+cG9zKSwgdG4tPnBvcyk7CkBAIC0xOTk3LDcgKzIxNTQsNyBAQAogCiBzdGF0aWMgdm9pZCB0cmllX2R1bXBfc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdHJpZSAqdCkKIHsKLQlzdHJ1Y3Qgbm9kZSAqbj10LT50cmllOworCXN0cnVjdCBub2RlICpuID0gdC0+dHJpZTsKIAlpbnQgY2luZGV4PTA7CiAJaW50IGluZGVudD0xOwogCWludCBwZW5kPTA7CkBAIC0yMDA5LDcgKzIxNjYsNyBAQAogCWlmIChuKSB7CiAJCXByaW50bm9kZV9zZXEoc2VxLCBpbmRlbnQsIG4sIHBlbmQsIGNpbmRleCwgMCk7CiAJCWlmIChJU19UTk9ERShuKSkgewotCQkJc3RydWN0IHRub2RlICp0bj0oc3RydWN0IHRub2RlICopbjsKKwkJCXN0cnVjdCB0bm9kZSAqdG4gPSAoc3RydWN0IHRub2RlICopbjsKIAkJCXBlbmQgPSB0bi0+cG9zK3RuLT5iaXRzOwogCQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsgc2VxX3ByaW50ZihzZXEsICJcXC0tXG4iKTsKIAkJCWluZGVudCArPSAzOwpAQCAtMjAxNyw0MiArMjE3NCw0MiBAQAogCiAJCQl3aGlsZSAodG4gJiYgY2luZGV4IDwgKDEgPDwgdG4tPmJpdHMpKSB7CiAJCQkJaWYgKHRuLT5jaGlsZFtjaW5kZXhdKSB7Ci0JCQkJCQorCQkJCQogCQkJCQkvKiBHb3QgYSBjaGlsZCAqLwotCQkJCQkKKwkJCQkKIAkJCQkJcHJpbnRub2RlX3NlcShzZXEsIGluZGVudCwgdG4tPmNoaWxkW2NpbmRleF0sIHBlbmQsIGNpbmRleCwgdG4tPmJpdHMpOwotCQkJCQlpZiAoSVNfTEVBRih0bi0+Y2hpbGRbY2luZGV4XSkpIHsgCisJCQkJCWlmIChJU19MRUFGKHRuLT5jaGlsZFtjaW5kZXhdKSkgewogCQkJCQkJY2luZGV4Kys7Ci0JCQkJCQkKKwkJCQkJCiAJCQkJCX0KIAkJCQkJZWxzZSB7Ci0JCQkJCQkvKiAKLQkJCQkJCSAqIE5ldyB0bm9kZS4gRGVjZW5kIG9uZSBsZXZlbCAKKwkJCQkJCS8qCisJCQkJCQkgKiBOZXcgdG5vZGUuIERlY2VuZCBvbmUgbGV2ZWwKIAkJCQkJCSAqLwotCQkJCQkJCisJCQkJCQogCQkJCQkJZGVwdGgrKzsKLQkJCQkJCW49dG4tPmNoaWxkW2NpbmRleF07Ci0JCQkJCQl0bj0oc3RydWN0IHRub2RlICopbjsKLQkJCQkJCXBlbmQ9dG4tPnBvcyt0bi0+Yml0czsKKwkJCQkJCW4gPSB0bi0+Y2hpbGRbY2luZGV4XTsKKwkJCQkJCXRuID0gKHN0cnVjdCB0bm9kZSAqKW47CisJCQkJCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKIAkJCQkJCXB1dHNwYWNlX3NlcShzZXEsIGluZGVudCk7IHNlcV9wcmludGYoc2VxLCAiXFwtLVxuIik7CiAJCQkJCQlpbmRlbnQrPTM7CiAJCQkJCQljaW5kZXg9MDsKIAkJCQkJfQogCQkJCX0KLQkJCQllbHNlIAorCQkJCWVsc2UKIAkJCQkJY2luZGV4Kys7CiAKIAkJCQkvKgotCQkJCSAqIFRlc3QgaWYgd2UgYXJlIGRvbmUgCisJCQkJICogVGVzdCBpZiB3ZSBhcmUgZG9uZQogCQkJCSAqLwotCQkJCQorCQkJCiAJCQkJd2hpbGUgKGNpbmRleCA+PSAoMSA8PCB0bi0+Yml0cykpIHsKIAogCQkJCQkvKgogCQkJCQkgKiBNb3ZlIHVwd2FyZHMgYW5kIHRlc3QgZm9yIHJvb3QKIAkJCQkJICogcG9wIG9mZiBhbGwgdHJhdmVyc2VkICBub2RlcwogCQkJCQkgKi8KLQkJCQkJCisJCQkJCiAJCQkJCWlmIChOT0RFX1BBUkVOVCh0bikgPT0gTlVMTCkgewogCQkJCQkJdG4gPSBOVUxMOwogCQkJCQkJbiA9IE5VTEw7CkBAIC0yMDYyLDggKzIyMTksOCBAQAogCQkJCQkJY2luZGV4ID0gdGtleV9leHRyYWN0X2JpdHModG4tPmtleSwgTk9ERV9QQVJFTlQodG4pLT5wb3MsIE5PREVfUEFSRU5UKHRuKS0+Yml0cyk7CiAJCQkJCQl0biA9IE5PREVfUEFSRU5UKHRuKTsKIAkJCQkJCWNpbmRleCsrOwotCQkJCQkJbj0oc3RydWN0IG5vZGUgKil0bjsKLQkJCQkJCXBlbmQ9dG4tPnBvcyt0bi0+Yml0czsKKwkJCQkJCW4gPSAoc3RydWN0IG5vZGUgKil0bjsKKwkJCQkJCXBlbmQgPSB0bi0+cG9zK3RuLT5iaXRzOwogCQkJCQkJaW5kZW50LT0zOwogCQkJCQkJZGVwdGgtLTsKIAkJCQkJfQpAQCAtMjA4MSwzNiArMjIzOCwzNiBAQAogewogCXN0cnVjdCB0cmllX3N0YXQgKnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJpZV9zdGF0KSwgR0ZQX0tFUk5FTCk7CiAJaW50IGk7Ci0JCi0JaWYocykgeworCisJaWYgKHMpIHsKIAkJcy0+dG90ZGVwdGggPSAwOwogCQlzLT5tYXhkZXB0aCA9IDA7CiAJCXMtPnRub2RlcyA9IDA7CiAJCXMtPmxlYXZlcyA9IDA7CiAJCXMtPm51bGxwb2ludGVycyA9IDA7Ci0JCQorCQogCQlmb3IoaT0wOyBpPCBNQVhfQ0hJTERTOyBpKyspCiAJCQlzLT5ub2Rlc2l6ZXNbaV0gPSAwOwogCX0KIAlyZXR1cm4gczsKLX0gICAgCit9CiAKIHN0YXRpYyBzdHJ1Y3QgdHJpZV9zdGF0ICp0cmllX2NvbGxlY3Rfc3RhdHMoc3RydWN0IHRyaWUgKnQpCiB7Ci0Jc3RydWN0IG5vZGUgKm49dC0+dHJpZTsKKwlzdHJ1Y3Qgbm9kZSAqbiA9IHQtPnRyaWU7CiAJc3RydWN0IHRyaWVfc3RhdCAqcyA9IHRyaWVfc3RhdF9uZXcoKTsKIAlpbnQgY2luZGV4ID0gMDsKIAlpbnQgaW5kZW50ID0gMTsKIAlpbnQgcGVuZCA9IDA7CiAJaW50IGRlcHRoID0gMDsKIAotCXJlYWRfbG9jaygmZmliX2xvY2spOwkJCisJcmVhZF9sb2NrKCZmaWJfbG9jayk7CQogCiAJaWYgKHMpIHsKIAkJaWYgKG4pIHsKIAkJCWlmIChJU19UTk9ERShuKSkgewogCQkJCXN0cnVjdCB0bm9kZSAqdG4gPSAoc3RydWN0IHRub2RlICopbjsKLQkJCQlwZW5kPXRuLT5wb3MrdG4tPmJpdHM7CisJCQkJcGVuZCA9IHRuLT5wb3MrdG4tPmJpdHM7CiAJCQkJaW5kZW50ICs9IDM7CiAJCQkJcy0+bm9kZXNpemVzW3RuLT5iaXRzXSsrOwogCQkJCWRlcHRoKys7CkBAIC0yMTE4LDI2ICsyMjc1LDI2IEBACiAJCQkJd2hpbGUgKHRuICYmIGNpbmRleCA8ICgxIDw8IHRuLT5iaXRzKSkgewogCQkJCQlpZiAodG4tPmNoaWxkW2NpbmRleF0pIHsKIAkJCQkJCS8qIEdvdCBhIGNoaWxkICovCi0JCQkJCQotCQkJCQkJaWYgKElTX0xFQUYodG4tPmNoaWxkW2NpbmRleF0pKSB7IAorCQkJCQorCQkJCQkJaWYgKElTX0xFQUYodG4tPmNoaWxkW2NpbmRleF0pKSB7CiAJCQkJCQkJY2luZGV4Kys7Ci0JCQkJCQkKKwkJCQkJCiAJCQkJCQkJLyogc3RhdHMgKi8KIAkJCQkJCQlpZiAoZGVwdGggPiBzLT5tYXhkZXB0aCkKIAkJCQkJCQkJcy0+bWF4ZGVwdGggPSBkZXB0aDsKIAkJCQkJCQlzLT50b3RkZXB0aCArPSBkZXB0aDsKIAkJCQkJCQlzLT5sZWF2ZXMrKzsKIAkJCQkJCX0KLQkJCQkJCisJCQkJCiAJCQkJCQllbHNlIHsKLQkJCQkJCQkvKiAKLQkJCQkJCQkgKiBOZXcgdG5vZGUuIERlY2VuZCBvbmUgbGV2ZWwgCisJCQkJCQkJLyoKKwkJCQkJCQkgKiBOZXcgdG5vZGUuIERlY2VuZCBvbmUgbGV2ZWwKIAkJCQkJCQkgKi8KLQkJCQkJCQorCQkJCQkKIAkJCQkJCQlzLT50bm9kZXMrKzsKIAkJCQkJCQlzLT5ub2Rlc2l6ZXNbdG4tPmJpdHNdKys7CiAJCQkJCQkJZGVwdGgrKzsKLQkJCQkJCQorCQkJCQkKIAkJCQkJCQluID0gdG4tPmNoaWxkW2NpbmRleF07CiAJCQkJCQkJdG4gPSAoc3RydWN0IHRub2RlICopbjsKIAkJCQkJCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKQEAgLTIxNDgsMTMgKzIzMDUsMTMgQEAKIAkJCQkJfQogCQkJCQllbHNlIHsKIAkJCQkJCWNpbmRleCsrOwotCQkJCQkJcy0+bnVsbHBvaW50ZXJzKys7IAorCQkJCQkJcy0+bnVsbHBvaW50ZXJzKys7CiAJCQkJCX0KIAogCQkJCQkvKgotCQkJCQkgKiBUZXN0IGlmIHdlIGFyZSBkb25lIAorCQkJCQkgKiBUZXN0IGlmIHdlIGFyZSBkb25lCiAJCQkJCSAqLwotCQkJCQorCQkJCiAJCQkJCXdoaWxlIChjaW5kZXggPj0gKDEgPDwgdG4tPmJpdHMpKSB7CiAKIAkJCQkJCS8qCkBAIC0yMTYyLDcgKzIzMTksNyBAQAogCQkJCQkJICogcG9wIG9mZiBhbGwgdHJhdmVyc2VkICBub2RlcwogCQkJCQkJICovCiAKLQkJCQkJCQorCQkJCQkKIAkJCQkJCWlmIChOT0RFX1BBUkVOVCh0bikgPT0gTlVMTCkgewogCQkJCQkJCXRuID0gTlVMTDsKIAkJCQkJCQluID0gTlVMTDsKQEAgLTIxNzEsOSArMjMyOCw5IEBACiAJCQkJCQllbHNlIHsKIAkJCQkJCQljaW5kZXggPSB0a2V5X2V4dHJhY3RfYml0cyh0bi0+a2V5LCBOT0RFX1BBUkVOVCh0biktPnBvcywgTk9ERV9QQVJFTlQodG4pLT5iaXRzKTsKIAkJCQkJCQl0biA9IE5PREVfUEFSRU5UKHRuKTsKLQkJCQkJCQljaW5kZXgrKzsgCisJCQkJCQkJY2luZGV4Kys7CiAJCQkJCQkJbiA9IChzdHJ1Y3Qgbm9kZSAqKXRuOwotCQkJCQkJCXBlbmQ9dG4tPnBvcyt0bi0+Yml0czsKKwkJCQkJCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKIAkJCQkJCQlpbmRlbnQgLT0gMzsKIAkJCQkJCQlkZXB0aC0tOwogCQkJCQkJfQpAQCAtMjE4NCw3ICsyMzQxLDcgQEAKIAkJfQogCX0KIAotCXJlYWRfdW5sb2NrKCZmaWJfbG9jayk7CQkKKwlyZWFkX3VubG9jaygmZmliX2xvY2spOwkKIAlyZXR1cm4gczsKIH0KIApAQCAtMjIyMCw3ICsyMzc3LDcgQEAKIAogfQogCi0vKiAKKy8qCiAgKglUaGlzIG91dHB1dHMgL3Byb2MvbmV0L2ZpYl90cmllc3RhdHMKICAqCiAgKglJdCBhbHdheXMgd29ya3MgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLgpAQCAtMjI0Niw3ICsyNDAzLDcgQEAKIAkJCWF2ZGVwdGg9MDsKIAkJc2VxX3ByaW50ZihzZXEsICJBdmVyIGRlcHRoOiAlZC4lMDJkXG4iLCBhdmRlcHRoIC8gMTAwLCBhdmRlcHRoICUgMTAwICk7CiAJCXNlcV9wcmludGYoc2VxLCAiTWF4IGRlcHRoOiAlNGRcbiIsIHN0YXQtPm1heGRlcHRoKTsKLQkJCQkKKwkJCQogCQlzZXFfcHJpbnRmKHNlcSwgIkxlYXZlczogJWRcbiIsIHN0YXQtPmxlYXZlcyk7CiAJCWJ5dGVzICs9IHNpemVvZihzdHJ1Y3QgbGVhZikgKiBzdGF0LT5sZWF2ZXM7CiAJCXNlcV9wcmludGYoc2VxLCAiSW50ZXJuYWwgbm9kZXM6ICVkXG4iLCBzdGF0LT50bm9kZXMpOwpAQCAtMjI1OCw3ICsyNDE1LDcgQEAKIAkJCW1heC0tOwogCQlwb2ludGVycyA9IDA7CiAKLQkJZm9yIChpID0gMTsgaSA8PSBtYXg7IGkrKykgCisJCWZvciAoaSA9IDE7IGkgPD0gbWF4OyBpKyspCiAJCQlpZiAoc3RhdC0+bm9kZXNpemVzW2ldICE9IDApIHsKIAkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgJWQ6ICVkIiwgIGksIHN0YXQtPm5vZGVzaXplc1tpXSk7CiAJCQkJcG9pbnRlcnMgKz0gKDE8PGkpICogc3RhdC0+bm9kZXNpemVzW2ldOwpAQCAtMjI3OSw2ICsyNDM2LDcgQEAKIAlzZXFfcHJpbnRmKHNlcSwic2VtYW50aWMgbWF0Y2ggcGFzc2VkID0gJWRcbiIsIHQtPnN0YXRzLnNlbWFudGljX21hdGNoX3Bhc3NlZCk7CiAJc2VxX3ByaW50ZihzZXEsInNlbWFudGljIG1hdGNoIG1pc3MgPSAlZFxuIiwgdC0+c3RhdHMuc2VtYW50aWNfbWF0Y2hfbWlzcyk7CiAJc2VxX3ByaW50ZihzZXEsIm51bGwgbm9kZSBoaXQ9ICVkXG4iLCB0LT5zdGF0cy5udWxsX25vZGVfaGl0KTsKKwlzZXFfcHJpbnRmKHNlcSwic2tpcHBlZCBub2RlIHJlc2l6ZSA9ICVkXG4iLCB0LT5zdGF0cy5yZXNpemVfbm9kZV9za2lwcGVkKTsKICNpZmRlZiBDTEVBUl9TVEFUUwogCW1lbXNldCgmKHQtPnN0YXRzKSwgMCwgc2l6ZW9mKHQtPnN0YXRzKSk7CiAjZW5kaWYKQEAgLTIyODgsMzAgKzI0NDYsMzAgQEAKIHN0YXRpYyBpbnQgZmliX3RyaWVzdGF0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCWNoYXIgYmZbMTI4XTsKLSAgICAKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHJpbnRmKHNlcSwgIkJhc2ljIGluZm86IHNpemUgb2YgbGVhZjogJVpkIGJ5dGVzLCBzaXplIG9mIHRub2RlOiAlWmQgYnl0ZXMuXG4iLCAKKwkJc2VxX3ByaW50ZihzZXEsICJCYXNpYyBpbmZvOiBzaXplIG9mIGxlYWY6ICVaZCBieXRlcywgc2l6ZSBvZiB0bm9kZTogJVpkIGJ5dGVzLlxuIiwKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbGVhZiksIHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKLQkJaWYgKHRyaWVfbG9jYWwpIAorCQlpZiAodHJpZV9sb2NhbCkKIAkJCWNvbGxlY3RfYW5kX3Nob3codHJpZV9sb2NhbCwgc2VxKTsKIAotCQlpZiAodHJpZV9tYWluKSAKKwkJaWYgKHRyaWVfbWFpbikKIAkJCWNvbGxlY3RfYW5kX3Nob3codHJpZV9tYWluLCBzZXEpOwogCX0KIAllbHNlIHsKIAkJc25wcmludGYoYmYsIHNpemVvZihiZiksCiAJCQkgIipcdCUwOFhcdCUwOFgiLCAyMDAsIDQwMCk7Ci0JCQorCQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwgYmYpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfdHJpZXN0YXRfc2VxX29wcyA9IHsKLQkuc3RhcnQgID0gZmliX3RyaWVzdGF0X3NlcV9zdGFydCwKLQkubmV4dCAgID0gZmliX3RyaWVzdGF0X3NlcV9uZXh0LAotCS5zdG9wICAgPSBmaWJfdHJpZXN0YXRfc2VxX3N0b3AsCi0JLnNob3cgICA9IGZpYl90cmllc3RhdF9zZXFfc2hvdywKKwkuc3RhcnQgPSBmaWJfdHJpZXN0YXRfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGZpYl90cmllc3RhdF9zZXFfbmV4dCwKKwkuc3RvcCAgPSBmaWJfdHJpZXN0YXRfc2VxX3N0b3AsCisJLnNob3cgID0gZmliX3RyaWVzdGF0X3NlcV9zaG93LAogfTsKIAogc3RhdGljIGludCBmaWJfdHJpZXN0YXRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0yMzIzLDcgKzI0ODEsNyBAQAogCWlmIChyYykKIAkJZ290byBvdXRfa2ZyZWU7CiAKLQlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBvdXQ6CiAJcmV0dXJuIHJjOwogb3V0X2tmcmVlOgpAQCAtMjMzMSwxMSArMjQ4OSwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWJfdHJpZXN0YXRfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IGZpYl90cmllc3RhdF9zZXFfb3BlbiwKLQkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5vcGVuCT0gZmliX3RyaWVzdGF0X3NlcV9vcGVuLAorCS5yZWFkCT0gc2VxX3JlYWQsCisJLmxsc2Vlawk9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCiB9OwogCiBpbnQgX19pbml0IGZpYl9zdGF0X3Byb2NfaW5pdCh2b2lkKQpAQCAtMjM4MCw3ICsyNTM4LDcgQEAKIAogfQogCi0vKiAKKy8qCiAgKglUaGlzIG91dHB1dHMgL3Byb2MvbmV0L2ZpYl90cmllLgogICoKICAqCUl0IGFsd2F5cyB3b3JrcyBpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuCkBAIC0yMzkyLDEwICsyNTUwLDEwIEBACiAJY2hhciBiZlsxMjhdOwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCWlmICh0cmllX2xvY2FsKSAKKwkJaWYgKHRyaWVfbG9jYWwpCiAJCQl0cmllX2R1bXBfc2VxKHNlcSwgdHJpZV9sb2NhbCk7CiAKLQkJaWYgKHRyaWVfbWFpbikgCisJCWlmICh0cmllX21haW4pCiAJCQl0cmllX2R1bXBfc2VxKHNlcSwgdHJpZV9tYWluKTsKIAl9CiAKQEAgLTI0MDksMTAgKzI1NjcsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfdHJpZV9zZXFfb3BzID0gewotCS5zdGFydCAgPSBmaWJfdHJpZV9zZXFfc3RhcnQsCi0JLm5leHQgICA9IGZpYl90cmllX3NlcV9uZXh0LAotCS5zdG9wICAgPSBmaWJfdHJpZV9zZXFfc3RvcCwKLQkuc2hvdyAgID0gZmliX3RyaWVfc2VxX3Nob3csCisJLnN0YXJ0ID0gZmliX3RyaWVfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGZpYl90cmllX3NlcV9uZXh0LAorCS5zdG9wICA9IGZpYl90cmllX3NlcV9zdG9wLAorCS5zaG93ICA9IGZpYl90cmllX3NlcV9zaG93LAogfTsKIAogc3RhdGljIGludCBmaWJfdHJpZV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI0MjQsNyArMjU4Miw3IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9rZnJlZTsKIAotCXNlcQkgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIG91dDoKIAlyZXR1cm4gcmM7CiBvdXRfa2ZyZWU6CkBAIC0yNDMyLDExICsyNTkwLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSBmaWJfdHJpZV9zZXFfb3BlbiwKLQkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5vcGVuCT0gZmliX3RyaWVfc2VxX29wZW4sCisJLnJlYWQJPSBzZXFfcmVhZCwKKwkubGxzZWVrCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIAogaW50IF9faW5pdCBmaWJfcHJvY19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggY2I3NTk0OC4uMjc5ZjU3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWNtcC5jCisrKyBiL25ldC9pcHY0L2ljbXAuYwpAQCAtOTcwLDcgKzk3MCw4IEBACiAJCSAqCVJGQyAxMTIyOiAzLjIuMi44IEFuIElDTVBfVElNRVNUQU1QIE1BWSBiZSBzaWxlbnRseQogCQkgKgkgIGRpc2NhcmRlZCBpZiB0byBicm9hZGNhc3QvbXVsdGljYXN0LgogCQkgKi8KLQkJaWYgKGljbXBoLT50eXBlID09IElDTVBfRUNITyAmJgorCQlpZiAoKGljbXBoLT50eXBlID09IElDTVBfRUNITyB8fAorCQkgICAgIGljbXBoLT50eXBlID09IElDTVBfVElNRVNUQU1QKSAmJgogCQkgICAgc3lzY3RsX2ljbXBfZWNob19pZ25vcmVfYnJvYWRjYXN0cykgewogCQkJZ290byBlcnJvcjsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDFmMzE4MzEuLjUwODhmOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTE2MTUsOSArMTYxNSwxMCBAQAogewogCWludCBlcnI7CiAJdTMyIGFkZHIgPSBpbXItPmltcl9tdWx0aWFkZHIuc19hZGRyOwotCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLCAqaTsKKwlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKmltbD1OVUxMLCAqaTsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCWludCBpZmluZGV4OwogCWludCBjb3VudCA9IDA7CiAKIAlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKQEAgLTE2MzMsMzcgKzE2MzQsMzAgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWltbCA9IChzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssIHNpemVvZigqaW1sKSwgR0ZQX0tFUk5FTCk7Ci0KIAllcnIgPSAtRUFERFJJTlVTRTsKKwlpZmluZGV4ID0gaW1yLT5pbXJfaWZpbmRleDsKIAlmb3IgKGkgPSBpbmV0LT5tY19saXN0OyBpOyBpID0gaS0+bmV4dCkgewotCQlpZiAobWVtY21wKCZpLT5tdWx0aSwgaW1yLCBzaXplb2YoKmltcikpID09IDApIHsKLQkJCS8qIE5ldyBzdHlsZSBhZGRpdGlvbnMgYXJlIHJlZmVyZW5jZSBjb3VudGVkICovCi0JCQlpZiAoaW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIgPT0gMCkgewotCQkJCWktPmNvdW50Kys7Ci0JCQkJZXJyID0gMDsKLQkJCX0KKwkJaWYgKGktPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGFkZHIgJiYKKwkJICAgIGktPm11bHRpLmltcl9pZmluZGV4ID09IGlmaW5kZXgpCiAJCQlnb3RvIGRvbmU7Ci0JCX0KIAkJY291bnQrKzsKIAl9CiAJZXJyID0gLUVOT0JVRlM7Ci0JaWYgKGltbCA9PSBOVUxMIHx8IGNvdW50ID49IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwcykKKwlpZiAoY291bnQgPj0gc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzKQogCQlnb3RvIGRvbmU7CisJaW1sID0gKHN0cnVjdCBpcF9tY19zb2NrbGlzdCAqKXNvY2tfa21hbGxvYyhzayxzaXplb2YoKmltbCksR0ZQX0tFUk5FTCk7CisJaWYgKGltbCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKIAltZW1jcHkoJmltbC0+bXVsdGksIGltciwgc2l6ZW9mKCppbXIpKTsKIAlpbWwtPm5leHQgPSBpbmV0LT5tY19saXN0OwotCWltbC0+Y291bnQgPSAxOwogCWltbC0+c2ZsaXN0ID0gTlVMTDsKIAlpbWwtPnNmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CiAJaW5ldC0+bWNfbGlzdCA9IGltbDsKIAlpcF9tY19pbmNfZ3JvdXAoaW5fZGV2LCBhZGRyKTsKLQlpbWwgPSBOVUxMOwogCWVyciA9IDA7Ci0KIGRvbmU6CiAJcnRubF9zaHVubG9jaygpOwotCWlmIChpbWwpCi0JCXNvY2tfa2ZyZWVfcyhzaywgaW1sLCBzaXplb2YoKmltbCkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2OTMsMzAgKzE2ODcsMjUgQEAKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwX21jX3NvY2tsaXN0ICppbWwsICoqaW1scDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJdTMyIGdyb3VwID0gaW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkcjsKKwl1MzIgaWZpbmRleDsKIAogCXJ0bmxfbG9jaygpOworCWluX2RldiA9IGlwX21jX2ZpbmRfZGV2KGltcik7CisJaWYgKCFpbl9kZXYpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmaW5kZXggPSBpbXItPmltcl9pZmluZGV4OwogCWZvciAoaW1scCA9ICZpbmV0LT5tY19saXN0OyAoaW1sID0gKmltbHApICE9IE5VTEw7IGltbHAgPSAmaW1sLT5uZXh0KSB7Ci0JCWlmIChpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyPT1pbXItPmltcl9tdWx0aWFkZHIuc19hZGRyICYmCi0JCSAgICBpbWwtPm11bHRpLmltcl9hZGRyZXNzLnNfYWRkcj09aW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIgJiYKLQkJICAgICghaW1yLT5pbXJfaWZpbmRleCB8fCBpbWwtPm11bHRpLmltcl9pZmluZGV4PT1pbXItPmltcl9pZmluZGV4KSkgewotCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwotCi0JCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KGltbC0+bXVsdGkuaW1yX2lmaW5kZXgpOwotCQkJaWYgKGluX2RldikKLQkJCQkodm9pZCkgaXBfbWNfbGVhdmVfc3JjKHNrLCBpbWwsIGluX2Rldik7Ci0JCQlpZiAoLS1pbWwtPmNvdW50KSB7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQlpZiAoaW5fZGV2KQotCQkJCQlpbl9kZXZfcHV0KGluX2Rldik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJCWlmIChpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGdyb3VwICYmCisJCSAgICBpbWwtPm11bHRpLmltcl9pZmluZGV4ID09IGlmaW5kZXgpIHsKKwkJCSh2b2lkKSBpcF9tY19sZWF2ZV9zcmMoc2ssIGltbCwgaW5fZGV2KTsKIAogCQkJKmltbHAgPSBpbWwtPm5leHQ7CiAKLQkJCWlmIChpbl9kZXYpIHsKLQkJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBpbXItPmltcl9tdWx0aWFkZHIuc19hZGRyKTsKLQkJCQlpbl9kZXZfcHV0KGluX2Rldik7Ci0JCQl9CisJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBncm91cCk7CiAJCQlydG5sX3VubG9jaygpOwogCQkJc29ja19rZnJlZV9zKHNrLCBpbWwsIHNpemVvZigqaW1sKSk7CiAJCQlyZXR1cm4gMDsKQEAgLTE3MzYsNiArMTcyNSw3IEBACiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpwc2w7CisJaW50IGxlYXZlZ3JvdXAgPSAwOwogCWludCBpLCBqLCBydjsKIAogCWlmICghTVVMVElDQVNUKGFkZHIpKQpAQCAtMTc1NSwxNSArMTc0NSwyMCBAQAogCWVyciA9IC1FQUREUk5PVEFWQUlMOwogCiAJZm9yIChwbWM9aW5ldC0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7Ci0JCWlmIChtZW1jbXAoJnBtYy0+bXVsdGksIG1yZXFzLCAyKnNpemVvZihfX3UzMikpID09IDApCisJCWlmIChwbWMtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGltci5pbXJfbXVsdGlhZGRyLnNfYWRkcgorCQkgICAgJiYgcG1jLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpbXIuaW1yX2lmaW5kZXgpCiAJCQlicmVhazsKIAl9Ci0JaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJaWYgKCFwbWMpIHsJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAkvKiBpZiBhIHNvdXJjZSBmaWx0ZXIgd2FzIHNldCwgbXVzdCBiZSB0aGUgc2FtZSBtb2RlIGFzIGJlZm9yZSAqLwogCWlmIChwbWMtPnNmbGlzdCkgewotCQlpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpCisJCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkgeworCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCX0gZWxzZSBpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpIHsKIAkJLyogYWxsb3cgbW9kZSBzd2l0Y2hlcyBmb3IgZW1wdHktc2V0IGZpbHRlcnMgKi8KIAkJaXBfbWNfYWRkX3NyYyhpbl9kZXYsICZtcmVxcy0+aW1yX211bHRpYWRkciwgb21vZGUsIDAsIE5VTEwsIDApOwpAQCAtMTc3NSw3ICsxNzcwLDcgQEAKIAlwc2wgPSBwbWMtPnNmbGlzdDsKIAlpZiAoIWFkZCkgewogCQlpZiAoIXBzbCkKLQkJCWdvdG8gZG9uZTsKKwkJCWdvdG8gZG9uZTsJLyogZXJyID0gLUVBRERSTk9UQVZBSUwgKi8KIAkJcnYgPSAhMDsKIAkJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CiAJCQlydiA9IG1lbWNtcCgmcHNsLT5zbF9hZGRyW2ldLCAmbXJlcXMtPmltcl9zb3VyY2VhZGRyLApAQCAtMTc4NCw3ICsxNzc5LDEzIEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHJ2KQkJLyogc291cmNlIG5vdCBmb3VuZCAqLworCQkJZ290byBkb25lOwkvKiBlcnIgPSAtRUFERFJOT1RBVkFJTCAqLworCisJCS8qIHNwZWNpYWwgY2FzZSAtIChJTkNMVURFLCBlbXB0eSkgPT0gTEVBVkVfR1JPVVAgKi8KKwkJaWYgKHBzbC0+c2xfY291bnQgPT0gMSAmJiBvbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSB7CisJCQlsZWF2ZWdyb3VwID0gMTsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCiAJCS8qIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGZpbHRlciAqLwogCQlpcF9tY19kZWxfc3JjKGluX2RldiwgJm1yZXFzLT5pbXJfbXVsdGlhZGRyLCBvbW9kZSwgMSwgCkBAIC0xODQyLDE4ICsxODQzLDIxIEBACiAJCSZtcmVxcy0+aW1yX3NvdXJjZWFkZHIsIDEpOwogZG9uZToKIAlydG5sX3NodW5sb2NrKCk7CisJaWYgKGxlYXZlZ3JvdXApCisJCXJldHVybiBpcF9tY19sZWF2ZV9ncm91cChzaywgJmltcik7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IGlwX21jX21zZmlsdGVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21zZmlsdGVyICptc2YsIGludCBpZmluZGV4KQogewotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAJc3RydWN0IGlwX21yZXFuCWltcjsKIAl1MzIgYWRkciA9IG1zZi0+aW1zZl9tdWx0aWFkZHI7CiAJc3RydWN0IGlwX21jX3NvY2tsaXN0ICpwbWM7CiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKm5ld3BzbCwgKnBzbDsKKwlpbnQgbGVhdmVncm91cCA9IDA7CiAKIAlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODcyLDE1ICsxODc2LDIyIEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwkvKiBzcGVjaWFsIGNhc2UgLSAoSU5DTFVERSwgZW1wdHkpID09IExFQVZFX0dST1VQICovCisJaWYgKG1zZi0+aW1zZl9mbW9kZSA9PSBNQ0FTVF9JTkNMVURFICYmIG1zZi0+aW1zZl9udW1zcmMgPT0gMCkgeworCQlsZWF2ZWdyb3VwID0gMTsKKwkJZ290byBkb25lOworCX0KIAogCWZvciAocG1jPWluZXQtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgewogCQlpZiAocG1jLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBtc2YtPmltc2ZfbXVsdGlhZGRyICYmCiAJCSAgICBwbWMtPm11bHRpLmltcl9pZmluZGV4ID09IGltci5pbXJfaWZpbmRleCkKIAkJCWJyZWFrOwogCX0KLQlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwlpZiAoIXBtYykgewkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CisJfQogCWlmIChtc2YtPmltc2ZfbnVtc3JjKSB7CiAJCW5ld3BzbCA9IChzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCiAJCQkJSVBfU0ZMU0laRShtc2YtPmltc2ZfbnVtc3JjKSwgR0ZQX0tFUk5FTCk7CkBAIC0xOTA5LDggKzE5MjAsMTEgQEAKIAkJCTAsIE5VTEwsIDApOwogCXBtYy0+c2ZsaXN0ID0gbmV3cHNsOwogCXBtYy0+c2Ztb2RlID0gbXNmLT5pbXNmX2Ztb2RlOworCWVyciA9IDA7CiBkb25lOgogCXJ0bmxfc2h1bmxvY2soKTsKKwlpZiAobGVhdmVncm91cCkKKwkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZpbXIpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IGFmMmVjODguLmM3MDM1MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMjgzLDE0ICsyODMsMTggQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKglJbml0aWFsaXNlIHRoZSB2aXJ0dWFsIHBhdGggY2FjaGUgZm9yIHRoZSBwYWNrZXQuIEl0IGRlc2NyaWJlcwogCSAqCWhvdyB0aGUgcGFja2V0IHRyYXZlbHMgaW5zaWRlIExpbnV4IG5ldHdvcmtpbmcuCiAJICovIAogCWlmIChza2ItPmRzdCA9PSBOVUxMKSB7Ci0JCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLCBkZXYpKQorCQlpZiAoKGVyciA9IGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgaXBoLT50b3MsIGRldikpKSB7CisJCQlpZiAoZXJyID09IC1FSE9TVFVOUkVBQ0gpCisJCQkJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCQlnb3RvIGRyb3A7IAorCQl9CiAJfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZWUwN2FlYy4uODBkMTMxMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTEwNyw3ICsxMDcsNiBAQAogCW5ld3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTE9PUEJBQ0s7CiAJbmV3c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlCVUdfVFJBUChuZXdza2ItPmRzdCk7Ci0JbmZfcmVzZXQobmV3c2tiKTsKIAluZXRpZl9yeChuZXdza2IpOwogCXJldHVybiAwOwogfQpAQCAtMTg4LDggKzE4Nyw2IEBACiAJCXNrYiA9IHNrYjI7CiAJfQogCi0JbmZfcmVzZXQoc2tiKTsKLQogCWlmIChoaCkgewogCQlpbnQgaGhfYWxlbjsKIApAQCAtMzgzLDcgKzM4MCw2IEBACiAJdG8tPnBrdF90eXBlID0gZnJvbS0+cGt0X3R5cGU7CiAJdG8tPnByaW9yaXR5ID0gZnJvbS0+cHJpb3JpdHk7CiAJdG8tPnByb3RvY29sID0gZnJvbS0+cHJvdG9jb2w7Ci0JdG8tPnNlY3VyaXR5ID0gZnJvbS0+c2VjdXJpdHk7CiAJZHN0X3JlbGVhc2UodG8tPmRzdCk7CiAJdG8tPmRzdCA9IGRzdF9jbG9uZShmcm9tLT5kc3QpOwogCXRvLT5kZXYgPSBmcm9tLT5kZXY7CkBAIC0xMzIzLDIzICsxMzE5LDggQEAKIAlpcF9ydF9wdXQocnQpOwogfQogCi0vKgotICoJSVAgcHJvdG9jb2wgbGF5ZXIgaW5pdGlhbGlzZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwX3BhY2tldF90eXBlID0gewotCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksCi0JLmZ1bmMgPSBpcF9yY3YsCi19OwotCi0vKgotICoJSVAgcmVnaXN0ZXJzIHRoZSBwYWNrZXQgdHlwZSBhbmQgdGhlbiBjYWxscyB0aGUgc3VicHJvdG9jb2wgaW5pdGlhbGlzZXJzCi0gKi8KLQogdm9pZCBfX2luaXQgaXBfaW5pdCh2b2lkKQogewotCWRldl9hZGRfcGFjaygmaXBfcGFja2V0X3R5cGUpOwotCiAJaXBfcnRfaW5pdCgpOwogCWluZXRfaW5pdHBlZXJzKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCmluZGV4IGY4YjE3MmYuLmZjN2M0ODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtNjc3LDExICs2NzcsMTEgQEAKIAkJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IG1yZXFzLmltcl9pbnRlcmZhY2U7CiAJCQkJbXJlcS5pbXJfaWZpbmRleCA9IDA7CiAJCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJCWlmIChlcnIpCisJCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCiAJCQkJCWJyZWFrOwogCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKIAkJCQlhZGQgPSAxOwotCQkJfSBlbHNlIC8qSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CisJCQl9IGVsc2UgLyogSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CiAJCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOwogCQkJCWFkZCA9IDA7CiAJCQl9CkBAIC03NTQsNyArNzU0LDcgQEAKIAkJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IDA7CiAJCQkJbXJlcS5pbXJfaWZpbmRleCA9IGdyZXFzLmdzcl9pbnRlcmZhY2U7CiAJCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJCWlmIChlcnIpCisJCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCiAJCQkJCWJyZWFrOwogCQkJCWdyZXFzLmdzcl9pbnRlcmZhY2UgPSBtcmVxLmltcl9pZmluZGV4OwogCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IGYyNTA5MDMuLmQyYmY4ZTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtMTE0OSw4ICsxMTQ5LDEwIEBACiAJCWljX3JhcnBfY2xlYW51cCgpOwogI2VuZGlmCiAKLQlpZiAoIWljX2dvdF9yZXBseSkKKwlpZiAoIWljX2dvdF9yZXBseSkgeworCQlpY19teWFkZHIgPSBJTkFERFJfTk9ORTsKIAkJcmV0dXJuIC0xOworCX0KIAogCXByaW50aygiSVAtQ29uZmlnOiBHb3QgJXMgYW5zd2VyIGZyb20gJXUuJXUuJXUuJXUsICIsCiAJCSgoaWNfZ290X3JlcGx5ICYgSUNfUkFSUCkgPyAiUkFSUCIgCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGlwLmMgYi9uZXQvaXB2NC9pcGlwLmMKaW5kZXggNjhhNzg3My4uYzM5NDdjZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBpcC5jCisrKyBiL25ldC9pcHY0L2lwaXAuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJZGV2X3B1dChkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBpcGlwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpfX3VudXNlZCkKK3N0YXRpYyB2b2lkIGlwaXBfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQogewogI2lmbmRlZiBJX1dJU0hfV09STERfV0VSRV9QRVJGRUNUCiAKQEAgLTg1MiwxMSArODUyLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfSU5FVF9UVU5ORUwKIHN0YXRpYyBzdHJ1Y3QgeGZybV90dW5uZWwgaXBpcF9oYW5kbGVyID0gewogCS5oYW5kbGVyCT0JaXBpcF9yY3YsCiAJLmVycl9oYW5kbGVyCT0JaXBpcF9lcnIsCiB9OwogCitzdGF0aWMgaW5saW5lIGludCBpcGlwX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHhmcm00X3R1bm5lbF9yZWdpc3RlcigmaXBpcF9oYW5kbGVyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBpcF91bnJlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHhmcm00X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcGlwX2hhbmRsZXIpOworfQorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIGlwaXBfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQlpcGlwX3JjdiwKKwkuZXJyX2hhbmRsZXIJPQlpcGlwX2VyciwKKwkubm9fcG9saWN5CT0JMSwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwaXBfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaW5ldF9hZGRfcHJvdG9jb2woJmlwaXBfcHJvdG9jb2wsIElQUFJPVE9fSVBJUCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwaXBfdW5yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBpbmV0X2RlbF9wcm90b2NvbCgmaXBpcF9wcm90b2NvbCwgSVBQUk9UT19JUElQKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KIAlLRVJOX0lORk8gIklQdjQgb3ZlciBJUHY0IHR1bm5lbGluZyBkcml2ZXJcbiI7CiAKQEAgLTg2Niw3ICs4OTQsNyBAQAogCiAJcHJpbnRrKGJhbm5lcik7CiAKLQlpZiAoeGZybTRfdHVubmVsX3JlZ2lzdGVyKCZpcGlwX2hhbmRsZXIpIDwgMCkgeworCWlmIChpcGlwX3JlZ2lzdGVyKCkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImlwaXAgaW5pdDogY2FuJ3QgcmVnaXN0ZXIgdHVubmVsXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtODg4LDEzICs5MTYsMTMgQEAKICBlcnIyOgogCWZyZWVfbmV0ZGV2KGlwaXBfZmJfdHVubmVsX2Rldik7CiAgZXJyMToKLQl4ZnJtNF90dW5uZWxfZGVyZWdpc3RlcigmaXBpcF9oYW5kbGVyKTsKKwlpcGlwX3VucmVnaXN0ZXIoKTsKIAlnb3RvIG91dDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwaXBfZmluaSh2b2lkKQogewotCWlmICh4ZnJtNF90dW5uZWxfZGVyZWdpc3RlcigmaXBpcF9oYW5kbGVyKSA8IDApCisJaWYgKGlwaXBfdW5yZWdpc3RlcigpIDwgMCkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaXBpcCBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciB0dW5uZWxcbiIpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYoaXBpcF9mYl90dW5uZWxfZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCBlNGY4MDlhLi43ODMzZDkyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0yOTcsNiArMjk3LDcgQEAKIHN0YXRpYyB2b2lkIGlwbXJfZGVzdHJveV91bnJlcyhzdHJ1Y3QgbWZjX2NhY2hlICpjKQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnZXJyICplOwogCiAJYXRvbWljX2RlYygmY2FjaGVfcmVzb2x2ZV9xdWV1ZV9sZW4pOwogCkBAIC0zMDYsNyArMzA3LDkgQEAKIAkJCW5saC0+bmxtc2dfdHlwZSA9IE5MTVNHX0VSUk9SOwogCQkJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpOwogCQkJc2tiX3RyaW0oc2tiLCBubGgtPm5sbXNnX2xlbik7Ci0JCQkoKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShubGgpKS0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQkJZSA9IE5MTVNHX0RBVEEobmxoKTsKKwkJCWUtPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJCW1lbXNldCgmZS0+bXNnLCAwLCBzaXplb2YoZS0+bXNnKSk7CiAJCQluZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBORVRMSU5LX0NCKHNrYikuZHN0X3BpZCwgTVNHX0RPTlRXQUlUKTsKIAkJfSBlbHNlCiAJCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTQ5OSw2ICs1MDIsNyBAQAogc3RhdGljIHZvaWQgaXBtcl9jYWNoZV9yZXNvbHZlKHN0cnVjdCBtZmNfY2FjaGUgKnVjLCBzdHJ1Y3QgbWZjX2NhY2hlICpjKQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnZXJyICplOwogCiAJLyoKIAkgKglQbGF5IHRoZSBwZW5kaW5nIGVudHJpZXMgdGhyb3VnaCBvdXIgcm91dGVyCkBAIC01MTUsNyArNTE5LDkgQEAKIAkJCQlubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19FUlJPUjsKIAkJCQlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSk7CiAJCQkJc2tiX3RyaW0oc2tiLCBubGgtPm5sbXNnX2xlbik7Ci0JCQkJKChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEobmxoKSktPmVycm9yID0gLUVNU0dTSVpFOworCQkJCWUgPSBOTE1TR19EQVRBKG5saCk7CisJCQkJZS0+ZXJyb3IgPSAtRU1TR1NJWkU7CisJCQkJbWVtc2V0KCZlLT5tc2csIDAsIHNpemVvZihlLT5tc2cpKTsKIAkJCX0KIAkJCWVyciA9IG5ldGxpbmtfdW5pY2FzdChydG5sLCBza2IsIE5FVExJTktfQ0Ioc2tiKS5kc3RfcGlkLCBNU0dfRE9OVFdBSVQpOwogCQl9IGVsc2UKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvS2NvbmZpZyBiL25ldC9pcHY0L2lwdnMvS2NvbmZpZwppbmRleCA2M2E4MmI0Li5jOTgyMGJmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL0tjb25maWcKKysrIGIvbmV0L2lwdjQvaXB2cy9LY29uZmlnCkBAIC0yLDExICsyLDExIEBACiAjIElQIFZpcnR1YWwgU2VydmVyIGNvbmZpZ3VyYXRpb24KICMKIG1lbnUJIklQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gSU5FVCAmJiBORVRGSUxURVIKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUgogCiBjb25maWcJSVBfVlMKIAl0cmlzdGF0ZSAiSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIElORVQgJiYgTkVURklMVEVSCisJZGVwZW5kcyBvbiBORVRGSUxURVIKIAktLS1oZWxwLS0tCiAJICBJUCBWaXJ0dWFsIFNlcnZlciBzdXBwb3J0IHdpbGwgbGV0IHlvdSBidWlsZCBhIGhpZ2gtcGVyZm9ybWFuY2UKIAkgIHZpcnR1YWwgc2VydmVyIGJhc2VkIG9uIGNsdXN0ZXIgb2YgdHdvIG9yIG1vcmUgcmVhbCBzZXJ2ZXJzLiBUaGlzCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCmluZGV4IGZkNmZlYjUuLmQwMTQ1YTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCkBAIC01NDgsNyArNTQ4LDYgQEAKIHsKIAlpZiAoZGVsX3RpbWVyKCZjcC0+dGltZXIpKQogCQltb2RfdGltZXIoJmNwLT50aW1lciwgamlmZmllcyk7Ci0JX19pcF92c19jb25uX3B1dChjcCk7CiB9CiAKIApAQCAtNzU5LDEyICs3NTgsMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotCisvKiBDYWxsZWQgZnJvbSBrZXZlbnRkIGFuZCBtdXN0IHByb3RlY3QgaXRzZWxmIGZyb20gc29mdGlycXMgKi8KIHZvaWQgaXBfdnNfcmFuZG9tX2Ryb3BlbnRyeSh2b2lkKQogewogCWludCBpZHg7CiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwotCXN0cnVjdCBpcF92c19jb25uICpjdDsKIAogCS8qCiAJICogUmFuZG9tbHkgc2NhbiAxLzMyIG9mIHRoZSB3aG9sZSB0YWJsZSBldmVyeSBzZWNvbmQKQEAgLTc3NSw3ICs3NzMsNyBAQAogCQkvKgogCQkgKiAgTG9jayBpcyBhY3R1YWxseSBuZWVkZWQgaW4gdGhpcyBsb29wLgogCQkgKi8KLQkJY3Rfd3JpdGVfbG9jayhoYXNoKTsKKwkJY3Rfd3JpdGVfbG9ja19iaChoYXNoKTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaGFzaF0sIGNfbGlzdCkgewogCQkJaWYgKCFjcC0+Y3BvcnQgJiYgIShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpKQpAQCAtODAxLDIzICs3OTksMTQgQEAKIAkJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qCi0JCQkgKiBEcm9wIHRoZSBlbnRyeSwgYW5kIGRyb3AgaXRzIGN0IGlmIG5vdCByZWZlcmVuY2VkCi0JCQkgKi8KLQkJCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOwotCQkJY3Rfd3JpdGVfdW5sb2NrKGhhc2gpOwotCi0JCQlpZiAoKGN0ID0gY3AtPmNvbnRyb2wpKQotCQkJCWF0b21pY19pbmMoJmN0LT5yZWZjbnQpOwogCQkJSVBfVlNfREJHKDQsICJkZWwgY29ubmVjdGlvblxuIik7CiAJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3ApOwotCQkJaWYgKGN0KSB7CisJCQlpZiAoY3AtPmNvbnRyb2wpIHsKIAkJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uIHRlbXBsYXRlXG4iKTsKLQkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3QpOworCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcC0+Y29udHJvbCk7CiAJCQl9Ci0JCQljdF93cml0ZV9sb2NrKGhhc2gpOwogCQl9Ci0JCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKwkJY3Rfd3JpdGVfdW5sb2NrX2JoKGhhc2gpOwogCX0KIH0KIApAQCAtODI5LDcgKzgxOCw2IEBACiB7CiAJaW50IGlkeDsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKmN0OwogCiAgIGZsdXNoX2FnYWluOgogCWZvciAoaWR4PTA7IGlkeDxJUF9WU19DT05OX1RBQl9TSVpFOyBpZHgrKykgewpAQCAtODM5LDE4ICs4MjcsMTMgQEAKIAkJY3Rfd3JpdGVfbG9ja19iaChpZHgpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltpZHhdLCBjX2xpc3QpIHsKLQkJCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOwotCQkJY3Rfd3JpdGVfdW5sb2NrKGlkeCk7CiAKLQkJCWlmICgoY3QgPSBjcC0+Y29udHJvbCkpCi0JCQkJYXRvbWljX2luYygmY3QtPnJlZmNudCk7CiAJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uZWN0aW9uXG4iKTsKIAkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcCk7Ci0JCQlpZiAoY3QpIHsKKwkJCWlmIChjcC0+Y29udHJvbCkgewogCQkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm4gdGVtcGxhdGVcbiIpOwotCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjdCk7CisJCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwLT5jb250cm9sKTsKIAkJCX0KLQkJCWN0X3dyaXRlX2xvY2soaWR4KTsKIAkJfQogCQljdF93cml0ZV91bmxvY2tfYmgoaWR4KTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYwppbmRleCAyMThkOTcwLi43ZDk5ZWRlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKQEAgLTkwLDcgKzkwLDggQEAKICNlbmRpZgogCiAvKgotICoJdXBkYXRlX2RlZmVuc2VfbGV2ZWwgaXMgY2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgZnJvbSBzeXNjdGwuCisgKgl1cGRhdGVfZGVmZW5zZV9sZXZlbCBpcyBjYWxsZWQgZnJvbSBrZXZlbnRkIGFuZCBmcm9tIHN5c2N0bCwKKyAqCXNvIGl0IG5lZWRzIHRvIHByb3RlY3QgaXRzZWxmIGZyb20gc29mdGlycXMKICAqLwogc3RhdGljIHZvaWQgdXBkYXRlX2RlZmVuc2VfbGV2ZWwodm9pZCkKIHsKQEAgLTExMCw2ICsxMTEsOCBAQAogCiAJbm9tZW0gPSAoYXZhaWxtZW0gPCBzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCk7CiAKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisKIAkvKiBkcm9wX2VudHJ5ICovCiAJc3Bpbl9sb2NrKCZfX2lwX3ZzX2Ryb3BlbnRyeV9sb2NrKTsKIAlzd2l0Y2ggKHN5c2N0bF9pcF92c19kcm9wX2VudHJ5KSB7CkBAIC0yMDYsNiArMjA5LDggQEAKIAlpZiAodG9fY2hhbmdlID49IDApCiAJCWlwX3ZzX3Byb3RvY29sX3RpbWVvdXRfY2hhbmdlKHN5c2N0bF9pcF92c19zZWN1cmVfdGNwPjEpOwogCXdyaXRlX3VubG9jaygmX19pcF92c19zZWN1cmV0Y3BfbG9jayk7CisKKwlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAogCkBAIC0xMzYwLDkgKzEzNjUsNyBAQAogCQkJLyogUmVzdG9yZSB0aGUgY29ycmVjdCB2YWx1ZSAqLwogCQkJKnZhbHAgPSB2YWw7CiAJCX0gZWxzZSB7Ci0JCQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJCQl1cGRhdGVfZGVmZW5zZV9sZXZlbCgpOwotCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCX0KIAl9CiAJcmV0dXJuIHJjOwpAQCAtMjA1OSw3ICsyMDYyLDcgQEAKIAlkc3QtPmFkZHIgPSBzcmMtPmFkZHI7CiAJZHN0LT5wb3J0ID0gc3JjLT5wb3J0OwogCWRzdC0+ZndtYXJrID0gc3JjLT5md21hcms7Ci0Jc3RyY3B5KGRzdC0+c2NoZWRfbmFtZSwgc3JjLT5zY2hlZHVsZXItPm5hbWUpOworCXN0cmxjcHkoZHN0LT5zY2hlZF9uYW1lLCBzcmMtPnNjaGVkdWxlci0+bmFtZSwgc2l6ZW9mKGRzdC0+c2NoZWRfbmFtZSkpOwogCWRzdC0+ZmxhZ3MgPSBzcmMtPmZsYWdzOwogCWRzdC0+dGltZW91dCA9IHNyYy0+dGltZW91dCAvIEhaOwogCWRzdC0+bmV0bWFzayA9IHNyYy0+bmV0bWFzazsKQEAgLTIwODAsNiArMjA4Myw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgewogCQkJaWYgKGNvdW50ID49IGdldC0+bnVtX3NlcnZpY2VzKQogCQkJCWdvdG8gb3V0OworCQkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CiAJCQlpcF92c19jb3B5X3NlcnZpY2UoJmVudHJ5LCBzdmMpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigmdXB0ci0+ZW50cnl0YWJsZVtjb3VudF0sCiAJCQkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CkBAIC0yMDk0LDYgKzIwOTgsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CiAJCQlpZiAoY291bnQgPj0gZ2V0LT5udW1fc2VydmljZXMpCiAJCQkJZ290byBvdXQ7CisJCQltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKIAkJCWlwX3ZzX2NvcHlfc2VydmljZSgmZW50cnksIHN2Yyk7CiAJCQlpZiAoY29weV90b191c2VyKCZ1cHRyLT5lbnRyeXRhYmxlW2NvdW50XSwKIAkJCQkJICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKQEAgLTIzMDQsMTIgKzIzMDksMTIgQEAKIAkJbWVtc2V0KCZkLCAwLCBzaXplb2YoZCkpOwogCQlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikgewogCQkJZFswXS5zdGF0ZSA9IElQX1ZTX1NUQVRFX01BU1RFUjsKLQkJCXN0cmNweShkWzBdLm1jYXN0X2lmbiwgaXBfdnNfbWFzdGVyX21jYXN0X2lmbik7CisJCQlzdHJsY3B5KGRbMF0ubWNhc3RfaWZuLCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBzaXplb2YoZFswXS5tY2FzdF9pZm4pKTsKIAkJCWRbMF0uc3luY2lkID0gaXBfdnNfbWFzdGVyX3N5bmNpZDsKIAkJfQogCQlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX0JBQ0tVUCkgewogCQkJZFsxXS5zdGF0ZSA9IElQX1ZTX1NUQVRFX0JBQ0tVUDsKLQkJCXN0cmNweShkWzFdLm1jYXN0X2lmbiwgaXBfdnNfYmFja3VwX21jYXN0X2lmbik7CisJCQlzdHJsY3B5KGRbMV0ubWNhc3RfaWZuLCBpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBzaXplb2YoZFsxXS5tY2FzdF9pZm4pKTsKIAkJCWRbMV0uc3luY2lkID0gaXBfdnNfYmFja3VwX3N5bmNpZDsKIAkJfQogCQlpZiAoY29weV90b191c2VyKHVzZXIsICZkLCBzaXplb2YoZCkpICE9IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCmluZGV4IDI1YzQ3OTUuLjU3NGQxZjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCkBAIC04MzksMTAgKzgzOSwxMCBAQAogCiAJaXBfdnNfc3luY19zdGF0ZSB8PSBzdGF0ZTsKIAlpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKSB7Ci0JCXN0cmNweShpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBtY2FzdF9pZm4pOworCQlzdHJsY3B5KGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4sIG1jYXN0X2lmbiwgc2l6ZW9mKGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4pKTsKIAkJaXBfdnNfbWFzdGVyX3N5bmNpZCA9IHN5bmNpZDsKIAl9IGVsc2UgewotCQlzdHJjcHkoaXBfdnNfYmFja3VwX21jYXN0X2lmbiwgbWNhc3RfaWZuKTsKKwkJc3RybGNweShpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBtY2FzdF9pZm4sIHNpemVvZihpcF92c19iYWNrdXBfbWNhc3RfaWZuKSk7CiAJCWlwX3ZzX2JhY2t1cF9zeW5jaWQgPSBzeW5jaWQ7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwppbmRleCBhNzhhMzIwLi4wMWUxYjU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKQEAgLTEwMSwxNCArMTAxLDEzIEBACiAJCWlmIChwb3J0ID09IDAgfHwgbGVuID4gNSkKIAkJCWJyZWFrOwogCi0JCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoKTsKKwkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CiAJCWlmIChleHAgPT0gTlVMTCkgewogCQkJcmV0ID0gTkZfRFJPUDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCWV4cC0+bWFzdGVyID0gY3Q7CiAKIAkJZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwOwogCQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKQEAgLTEyNiwxMCArMTI1LDkgQEAKIAkJCXJldCA9IGlwX25hdF9hbWFuZGFfaG9vayhwc2tiLCBjdGluZm8sCiAJCQkJCQkgdG1wIC0gYW1hbmRhX2J1ZmZlciwKIAkJCQkJCSBsZW4sIGV4cCk7Ci0JCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApIHsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfZnJlZShleHApOworCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQogCQkJcmV0ID0gTkZfRFJPUDsKLQkJfQorCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwppbmRleCA0Yjc4ZWJlLi42M2JmODgyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwpAQCAtMTM3LDE5ICsxMzcsMTIgQEAKIAogCiAvKiBpcF9jb25udHJhY2tfZXhwZWN0IGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JaXBfY29ubnRyYWNrX3B1dChleHAtPm1hc3Rlcik7Ci0JSVBfTkZfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZleHAtPnRpbWVvdXQpKTsKLQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cCk7Ci0JQ09OTlRSQUNLX1NUQVRfSU5DKGV4cGVjdF9kZWxldGUpOwotfQotCiBzdGF0aWMgdm9pZCB1bmxpbmtfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7CiAJQVNTRVJUX1dSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlJUF9ORl9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwogCWxpc3RfZGVsKCZleHAtPmxpc3QpOwotCS8qIExvZ2ljYWxseSBpbiBkZXN0cm95X2V4cGVjdCwgYnV0IHdlIGhvbGQgdGhlIGxvY2sgaGVyZS4gKi8KKwlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7CiAJZXhwLT5tYXN0ZXItPmV4cGVjdGluZy0tOwogfQogCkBAIC0xNjAsNyArMTUzLDcgQEAKIAl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJdW5saW5rX2V4cGVjdChleHApOwogCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWRlc3Ryb3lfZXhwZWN0KGV4cCk7CisJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKIH0KIAogLyogSWYgYW4gZXhwZWN0YXRpb24gZm9yIHRoaXMgY29ubmVjdGlvbiBpcyBmb3VuZCwgaXQgZ2V0cyBkZWxldGUgZnJvbQpAQCAtMTk4LDcgKzE5MSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewogCQlpZiAoaS0+bWFzdGVyID09IGN0ICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKIAkJCXVubGlua19leHBlY3QoaSk7Ci0JCQlkZXN0cm95X2V4cGVjdChpKTsKKwkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwogCQl9CiAJfQogfQpAQCAtNTM3LDcgKzUzMCw3IEBACiAJaWYgKGV4cCkgewogCQlpZiAoZXhwLT5leHBlY3RmbikKIAkJCWV4cC0+ZXhwZWN0Zm4oY29ubnRyYWNrLCBleHApOwotCQlkZXN0cm95X2V4cGVjdChleHApOworCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogCX0KIAogCXJldHVybiAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXTsKQEAgLTcyOSwxNCArNzIyLDE0IEBACiAJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHApICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKIAkJCXVubGlua19leHBlY3QoaSk7CiAJCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJCWRlc3Ryb3lfZXhwZWN0KGkpOworCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiB9CiAKLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKHZvaWQpCitzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptZSkKIHsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqbmV3OwogCkBAIC03NDUsMTggKzczOCwyMyBAQAogCQlERUJVR1AoImV4cGVjdF9yZWxhdGVkOiBPT00gYWxsb2NhdGluZyBleHBlY3RcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbmV3LT5tYXN0ZXIgPSBOVUxMOworCW5ldy0+bWFzdGVyID0gbWU7CisJYXRvbWljX2luYygmbmV3LT5tYXN0ZXItPmN0X2dlbmVyYWwudXNlKTsKKwlhdG9taWNfc2V0KCZuZXctPnVzZSwgMSk7CiAJcmV0dXJuIG5ldzsKIH0KIAotdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCkKK3ZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKLQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cGVjdCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV4cC0+dXNlKSkgeworCQlpcF9jb25udHJhY2tfcHV0KGV4cC0+bWFzdGVyKTsKKwkJa21lbV9jYWNoZV9mcmVlKGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBleHApOworCX0KIH0KIAogc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9pbnNlcnQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKLQlhdG9taWNfaW5jKCZleHAtPm1hc3Rlci0+Y3RfZ2VuZXJhbC51c2UpOworCWF0b21pY19pbmMoJmV4cC0+dXNlKTsKIAlleHAtPm1hc3Rlci0+ZXhwZWN0aW5nKys7CiAJbGlzdF9hZGQoJmV4cC0+bGlzdCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCk7CiAKQEAgLTc3OCw3ICs3NzYsNyBAQAogCQlpZiAoaS0+bWFzdGVyID09IG1hc3RlcikgewogCQkJaWYgKGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKIAkJCQl1bmxpbmtfZXhwZWN0KGkpOwotCQkJCWRlc3Ryb3lfZXhwZWN0KGkpOworCQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTgxMCw4ICs4MDgsNiBAQAogCQkJLyogUmVmcmVzaCB0aW1lcjogaWYgaXQncyBkeWluZywgaWdub3JlLi4gKi8KIAkJCWlmIChyZWZyZXNoX3RpbWVyKGkpKSB7CiAJCQkJcmV0ID0gMDsKLQkJCQkvKiBXZSBkb24ndCBuZWVkIHRoZSBvbmUgdGhleSd2ZSBnaXZlbiB1cy4gKi8KLQkJCQlpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoZXhwZWN0KTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfSBlbHNlIGlmIChleHBlY3RfY2xhc2goaSwgZXhwZWN0KSkgewpAQCAtODgxLDcgKzg3Nyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CiAJCWlmIChleHAtPm1hc3Rlci0+aGVscGVyID09IG1lICYmIGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgewogCQkJdW5saW5rX2V4cGVjdChleHApOwotCQkJZGVzdHJveV9leHBlY3QoZXhwKTsKKwkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CiAJCX0KIAl9CiAJLyogR2V0IHJpZCBvZiBleHBlY3RlZHMsIHNldCBoZWxwZXJzIHRvIE5VTEwuICovCkBAIC0xMTExLDYgKzExMDcsOSBAQAogCQlzY2hlZHVsZSgpOwogCQlnb3RvIGlfc2VlX2RlYWRfcGVvcGxlOwogCX0KKwkvKiB3YWl0IHVudGlsIGFsbCByZWZlcmVuY2VzIHRvIGlwX2Nvbm50cmFja191bnRyYWNrZWQgYXJlIGRyb3BwZWQgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UpID4gMSkKKwkJc2NoZWR1bGUoKTsKIAogCWttZW1fY2FjaGVfZGVzdHJveShpcF9jb25udHJhY2tfY2FjaGVwKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKaW5kZXggZmVhNmRkMi4uN2EzYjc3MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCkBAIC0zNzYsNyArMzc2LDcgQEAKIAkgICAgICAgZmJfcHRyICsgbWF0Y2hvZmYsIG1hdGNobGVuLCBudG9obCh0aC0+c2VxKSArIG1hdGNob2ZmKTsKIAkJCSAKIAkvKiBBbGxvY2F0ZSBleHBlY3RhdGlvbiB3aGljaCB3aWxsIGJlIGluc2VydGVkICovCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYygpOworCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwogCWlmIChleHAgPT0gTlVMTCkgewogCQlyZXQgPSBORl9EUk9QOwogCQlnb3RvIG91dDsKQEAgLTQwMyw4ICs0MDMsNyBAQAogCQkgICBuZXR3b3Jrcywgb3IgdGhlIHBhY2tldCBmaWx0ZXIgaXRzZWxmKS4gKi8KIAkJaWYgKCFsb29zZSkgewogCQkJcmV0ID0gTkZfQUNDRVBUOwotCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7Ci0JCQlnb3RvIG91dF91cGRhdGVfbmw7CisJCQlnb3RvIG91dF9wdXRfZXhwZWN0OwogCQl9CiAJCWV4cC0+dHVwbGUuZHN0LmlwID0gaHRvbmwoKGFycmF5WzBdIDw8IDI0KSB8IChhcnJheVsxXSA8PCAxNikKIAkJCQkJIHwgKGFycmF5WzJdIDw8IDgpIHwgYXJyYXlbM10pOwpAQCAtNDE5LDcgKzQxOCw2IEBACiAJCSAgeyAweEZGRkZGRkZGLCB7IC50Y3AgPSB7IDB4RkZGRiB9IH0sIDB4RkYgfX0pOwogCiAJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JZXhwLT5tYXN0ZXIgPSBjdDsKIAogCS8qIE5vdywgTkFUIG1pZ2h0IHdhbnQgdG8gbWFuZ2xlIHRoZSBwYWNrZXQsIGFuZCByZWdpc3RlciB0aGUKIAkgKiAocG9zc2libHkgY2hhbmdlZCkgZXhwZWN0YXRpb24gaXRzZWxmLiAqLwpAQCAtNDI4LDEzICs0MjYsMTUgQEAKIAkJCQkgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGV4cCwgJnNlcSk7CiAJZWxzZSB7CiAJCS8qIENhbid0IGV4cGVjdCB0aGlzPyAgQmVzdCB0byBkcm9wIHBhY2tldCBub3cuICovCi0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKSB7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoZXhwKTsKKwkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCQlyZXQgPSBORl9EUk9QOwotCQl9IGVsc2UKKwkJZWxzZQogCQkJcmV0ID0gTkZfQUNDRVBUOwogCX0KIAorb3V0X3B1dF9leHBlY3Q6CisJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwogb3V0X3VwZGF0ZV9ubDoKIAkvKiBOb3cgaWYgdGhpcyBlbmRzIGluIFxuLCB1cGRhdGUgZnRwIGluZm8uICBTZXEgbWF5IGhhdmUgYmVlbgogCSAqIGFkanVzdGVkIGJ5IE5BVCBjb2RlLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKaW5kZXggY2Q5ODc3Mi4uNGEyOGYyOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYygpOworCQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CiAJCQlpZiAoZXhwID09IE5VTEwpIHsKIAkJCQlyZXQgPSBORl9EUk9QOwogCQkJCWdvdG8gb3V0OwpAQCAtMjIxLDE2ICsyMjEsMTQgQEAKIAkJCQl7IHsgMCwgeyAwIH0gfSwKIAkJCQkgIHsgMHhGRkZGRkZGRiwgeyAudGNwID0geyAweEZGRkYgfSB9LCAweEZGIH19KTsKIAkJCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCQkJZXhwLT5tYXN0ZXIgPSBjdDsKIAkJCWlmIChpcF9uYXRfaXJjX2hvb2spCiAJCQkJcmV0ID0gaXBfbmF0X2lyY19ob29rKHBza2IsIGN0aW5mbywgCiAJCQkJCQkgICAgICBhZGRyX2JlZ19wIC0gaWJfcHRyLAogCQkJCQkJICAgICAgYWRkcl9lbmRfcCAtIGFkZHJfYmVnX3AsCiAJCQkJCQkgICAgICBleHApOwotCQkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkgewotCQkJCWlwX2Nvbm50cmFja19leHBlY3RfZnJlZShleHApOworCQkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKIAkJCQlyZXQgPSBORl9EUk9QOwotCQkJfQorCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKIAkJCWdvdG8gb3V0OwogCQl9IC8qIGZvciAuLiBOVU1fRENDUFJPVE8gKi8KIAl9IC8qIHdoaWxlIGRhdGEgPCAuLi4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggNDJkYzk1MS4uNjE3OThjNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTQzMiw2ICs0MzIsMTMgQEAKIAkJCQkgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCQkJICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUX01PRFVMRSkKKwkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gIElnbm9yZS4gIERvIHRoaXMgYmVmb3JlCisgICAgICAgICAgIGZyYWdtZW50IGNoZWNrLiAqLworCWlmICgoKnBza2IpLT5uZmN0KQorCQlyZXR1cm4gTkZfQUNDRVBUOworI2VuZGlmCisKIAkvKiBHYXRoZXIgZnJhZ21lbnRzLiAqLwogCWlmICgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgewogCQkqcHNrYiA9IGlwX2N0X2dhdGhlcl9mcmFncygqcHNrYiwKQEAgLTk3OCw3ICs5ODUsNyBAQAogRVhQT1JUX1NZTUJPTChpcF9jdF9wcm90b3MpOwogRVhQT1JUX1NZTUJPTChpcF9jdF9maW5kX3Byb3RvKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfcHV0KTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdHVwbGVfdGFrZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYwppbmRleCA5OTJmYWMzLi5mOGZmMTcwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYwpAQCAtNjUsNyArNjUsNyBAQAogCQlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOwogCQlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwogCi0JCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoKTsKKwkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CiAJCWlmIChleHAgPT0gTlVMTCkKIAkJCXJldHVybiBORl9EUk9QOwogCkBAIC03NSwxNyArNzUsMTUgQEAKIAkJZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ID0gMHhmZmZmOwogCQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhmZjsKIAkJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCWV4cC0+bWFzdGVyID0gY3Q7CiAKIAkJREVCVUdQKCJleHBlY3Q6ICIpOwogCQlEVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKIAkJRFVNUF9UVVBMRSgmZXhwLT5tYXNrKTsKIAkJaWYgKGlwX25hdF90ZnRwX2hvb2spCiAJCQlyZXQgPSBpcF9uYXRfdGZ0cF9ob29rKHBza2IsIGN0aW5mbywgZXhwKTsKLQkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkgewotCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCQlyZXQgPSBORl9EUk9QOwotCQl9CisJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CiAJCWJyZWFrOwogCWNhc2UgVEZUUF9PUENPREVfREFUQToKIAljYXNlIFRGVFBfT1BDT0RFX0FDSzoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCmluZGV4IGRhMWY0MTIuLjcwNmM4MDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYwpAQCAtNTYsMTAgKzU2LDggQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChwb3J0ID09IDApIHsKLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJaWYgKHBvcnQgPT0gMCkKIAkJcmV0dXJuIE5GX0RST1A7Ci0JfQogCiAJc3ByaW50ZihidWZmZXIsICIldSIsIHBvcnQpOwogCXJldCA9IGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBleHAtPm1hc3RlciwgY3RpbmZvLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKaW5kZXggYzYwMDBlNy4uZDgzNzU3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jCkBAIC0xNDMsMTAgKzE0Myw4IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAocG9ydCA9PSAwKSB7Ci0JCWlwX2Nvbm50cmFja19leHBlY3RfZnJlZShleHApOworCWlmIChwb3J0ID09IDApCiAJCXJldHVybiBORl9EUk9QOwotCX0KIAogCWlmICghbWFuZ2xlW3R5cGVdKHBza2IsIG5ld2lwLCBwb3J0LCBtYXRjaG9mZiwgbWF0Y2hsZW4sIGN0LCBjdGluZm8sCiAJCQkgIHNlcSkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCmluZGV4IDljMWNhMzMuLmRlMzE5NDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYwpAQCAtNjUsMTAgKzY1LDggQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChwb3J0ID09IDApIHsKLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJaWYgKHBvcnQgPT0gMCkKIAkJcmV0dXJuIE5GX0RST1A7Ci0JfQogCiAJLyogICAgICBzdHJsZW4oIlwxRENDIENIQVQgY2hhdCBBQUFBQUFBQSBQXDFcbiIpPTI3CiAJICogICAgICBzdHJsZW4oIlwxRENDIFNDSEFUIGNoYXQgQUFBQUFBQUEgUFwxXG4iKT0yOApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwppbmRleCBhNTU4Y2YwLi42NTk2YzllIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwpAQCAtMzUsMTYgKzM1LDE3IEBACiAJCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQogewogCXN0YXRpYyB1X2ludDE2X3QgaWQ7Ci0JdW5zaWduZWQgaW50IHJhbmdlX3NpemUKLQkJPSAodW5zaWduZWQgaW50KXJhbmdlLT5tYXguaWNtcC5pZCAtIHJhbmdlLT5taW4uaWNtcC5pZCArIDE7CisJdW5zaWduZWQgaW50IHJhbmdlX3NpemU7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC5pY21wLmlkKSAtIG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKyAxOwogCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLwogCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKQogCQlyYW5nZV9zaXplID0gMHhGRkZGOwogCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgaWQrKykgewotCQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IHJhbmdlLT5taW4uaWNtcC5pZCArIChpZCAlIHJhbmdlX3NpemUpOworCQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IGh0b25zKG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZCAlIHJhbmdlX3NpemUpKTsKIAkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKIAkJCXJldHVybiAxOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCmluZGV4IGE5MWNmY2UuLmE5OGUzNmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpAQCAtNDAsNyArNDAsOCBAQAogCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCiB7Ci0Jc3RhdGljIHVfaW50MTZfdCBwb3J0LCAqcG9ydHB0cjsKKwlzdGF0aWMgdV9pbnQxNl90IHBvcnQ7CisJdV9pbnQxNl90ICpwb3J0cHRyOwogCXVuc2lnbmVkIGludCByYW5nZV9zaXplLCBtaW4sIGk7CiAKIAlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYwppbmRleCBjNjY5ZTNiLi45ZjY2ZTU2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKQEAgLTQxLDcgKzQxLDggQEAKIAkJIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQogewotCXN0YXRpYyB1X2ludDE2X3QgcG9ydCwgKnBvcnRwdHI7CisJc3RhdGljIHVfaW50MTZfdCBwb3J0OworCXVfaW50MTZfdCAqcG9ydHB0cjsKIAl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZSwgbWluLCBpOwogCiAJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYwppbmRleCAwMzQzZTBkLi4yMjE1MzE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYwpAQCAtNDUsMTAgKzQ1LDggQEAKIAlleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKIAlleHAtPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKIAlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApIHsKLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCXJldHVybiBORl9EUk9QOwotCX0KIAlyZXR1cm4gTkZfQUNDRVBUOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwppbmRleCA5Y2RlOGM2Li42NzA2ZDNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CiAKLSNkZWZpbmUgQ0xVU1RFUklQX1ZFUlNJT04gIjAuNiIKKyNkZWZpbmUgQ0xVU1RFUklQX1ZFUlNJT04gIjAuNyIKIAogI2RlZmluZSBERUJVR19DTFVTVEVSSVAKIApAQCAtNTI0LDggKzUyNCw5IEBACiAJICAgIHx8IGFycC0+YXJfcGxuICE9IDQgfHwgYXJwLT5hcl9obG4gIT0gRVRIX0FMRU4pCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQkvKiB3ZSBvbmx5IHdhbnQgdG8gbWFuZ2xlIGFycCByZXBsaWVzICovCi0JaWYgKGFycC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVQTFkpKQorCS8qIHdlIG9ubHkgd2FudCB0byBtYW5nbGUgYXJwIHJlcXVlc3RzIGFuZCByZXBsaWVzICovCisJaWYgKGFycC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVQTFkpCisJICAgICYmIGFycC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlwYXlsb2FkID0gKHZvaWQgKikoYXJwKzEpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggODBjZjYzMy4uZDY3NWZmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC01NCw2ICs1NCw3IEBACiAgKgkJTWFyYyBCb3VjaGVyCToJcm91dGluZyBieSBmd21hcmsKICAqCVJvYmVydCBPbHNzb24JCToJQWRkZWQgcnRfY2FjaGUgc3RhdGlzdGljcwogICoJQXJuYWxkbyBDLiBNZWxvCQk6CUNvbnZlcnQgcHJvYyBzdHVmZiB0byBzZXFfZmlsZQorICoJRXJpYyBEdW1hemV0CQk6CWhhc2hlZCBzcGlubG9ja3MgYW5kIHJ0X2NoZWNrX2V4cGlyZSgpIGZpeGVzLgogICoKICAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTcwLDYgKzcxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KQEAgLTIwMSw4ICsyMDMsMzcgQEAKIAogc3RydWN0IHJ0X2hhc2hfYnVja2V0IHsKIAlzdHJ1Y3QgcnRhYmxlCSpjaGFpbjsKLQlzcGlubG9ja190CWxvY2s7Ci19IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSk7Cit9OworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisvKgorICogSW5zdGVhZCBvZiB1c2luZyBvbmUgc3BpbmxvY2sgZm9yIGVhY2ggcnRfaGFzaF9idWNrZXQsIHdlIHVzZSBhIHRhYmxlIG9mIHNwaW5sb2NrcworICogVGhlIHNpemUgb2YgdGhpcyB0YWJsZSBpcyBhIHBvd2VyIG9mIHR3byBhbmQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIENQVVMuCisgKi8KKyNpZiBOUl9DUFVTID49IDMyCisjZGVmaW5lIFJUX0hBU0hfTE9DS19TWgk0MDk2CisjZWxpZiBOUl9DUFVTID49IDE2CisjZGVmaW5lIFJUX0hBU0hfTE9DS19TWgkyMDQ4CisjZWxpZiBOUl9DUFVTID49IDgKKyNkZWZpbmUgUlRfSEFTSF9MT0NLX1NaCTEwMjQKKyNlbGlmIE5SX0NQVVMgPj0gNAorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJNTEyCisjZWxzZQorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJMjU2CisjZW5kaWYKKworc3RhdGljIHNwaW5sb2NrX3QJKnJ0X2hhc2hfbG9ja3M7CisjIGRlZmluZSBydF9oYXNoX2xvY2tfYWRkcihzbG90KSAmcnRfaGFzaF9sb2Nrc1soc2xvdCkgJiAoUlRfSEFTSF9MT0NLX1NaIC0gMSldCisjIGRlZmluZSBydF9oYXNoX2xvY2tfaW5pdCgpCXsgXAorCQlpbnQgaTsgXAorCQlydF9oYXNoX2xvY2tzID0ga21hbGxvYyhzaXplb2Yoc3BpbmxvY2tfdCkgKiBSVF9IQVNIX0xPQ0tfU1osIEdGUF9LRVJORUwpOyBcCisJCWlmICghcnRfaGFzaF9sb2NrcykgcGFuaWMoIklQOiBmYWlsZWQgdG8gYWxsb2NhdGUgcnRfaGFzaF9sb2Nrc1xuIik7IFwKKwkJZm9yIChpID0gMDsgaSA8IFJUX0hBU0hfTE9DS19TWjsgaSsrKSBcCisJCQlzcGluX2xvY2tfaW5pdCgmcnRfaGFzaF9sb2Nrc1tpXSk7IFwKKwkJfQorI2Vsc2UKKyMgZGVmaW5lIHJ0X2hhc2hfbG9ja19hZGRyKHNsb3QpIE5VTEwKKyMgZGVmaW5lIHJ0X2hhc2hfbG9ja19pbml0KCkKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHJ0X2hhc2hfYnVja2V0IAkqcnRfaGFzaF90YWJsZTsKIHN0YXRpYyB1bnNpZ25lZAkJCXJ0X2hhc2hfbWFzazsKQEAgLTU3NSwxOSArNjA2LDI2IEBACiAvKiBUaGlzIHJ1bnMgdmlhIGEgdGltZXIgYW5kIHRodXMgaXMgYWx3YXlzIGluIEJIIGNvbnRleHQuICovCiBzdGF0aWMgdm9pZCBydF9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSkKIHsKLQlzdGF0aWMgaW50IHJvdmVyOwotCWludCBpID0gcm92ZXIsIHQ7CisJc3RhdGljIHVuc2lnbmVkIGludCByb3ZlcjsKKwl1bnNpZ25lZCBpbnQgaSA9IHJvdmVyLCBnb2FsOwogCXN0cnVjdCBydGFibGUgKnJ0aCwgKipydGhwOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1NjQgbXVsdDsKIAotCWZvciAodCA9IGlwX3J0X2djX2ludGVydmFsIDw8IHJ0X2hhc2hfbG9nOyB0ID49IDA7Ci0JICAgICB0IC09IGlwX3J0X2djX3RpbWVvdXQpIHsKKwltdWx0ID0gKCh1NjQpaXBfcnRfZ2NfaW50ZXJ2YWwpIDw8IHJ0X2hhc2hfbG9nOworCWlmIChpcF9ydF9nY190aW1lb3V0ID4gMSkKKwkJZG9fZGl2KG11bHQsIGlwX3J0X2djX3RpbWVvdXQpOworCWdvYWwgPSAodW5zaWduZWQgaW50KW11bHQ7CisJaWYgKGdvYWwgPiBydF9oYXNoX21hc2spIGdvYWwgPSBydF9oYXNoX21hc2sgKyAxOworCWZvciAoOyBnb2FsID4gMDsgZ29hbC0tKSB7CiAJCXVuc2lnbmVkIGxvbmcgdG1vID0gaXBfcnRfZ2NfdGltZW91dDsKIAogCQlpID0gKGkgKyAxKSAmIHJ0X2hhc2hfbWFzazsKIAkJcnRocCA9ICZydF9oYXNoX3RhYmxlW2ldLmNoYWluOwogCi0JCXNwaW5fbG9jaygmcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwkJaWYgKCpydGhwID09IDApCisJCQljb250aW51ZTsKKwkJc3Bpbl9sb2NrKHJ0X2hhc2hfbG9ja19hZGRyKGkpKTsKIAkJd2hpbGUgKChydGggPSAqcnRocCkgIT0gTlVMTCkgewogCQkJaWYgKHJ0aC0+dS5kc3QuZXhwaXJlcykgewogCQkJCS8qIEVudHJ5IGlzIGV4cGlyZWQgZXZlbiBpZiBpdCBpcyBpbiB1c2UgKi8KQEAgLTYyMCwxNCArNjU4LDE0IEBACiAgCQkJcnRfZnJlZShydGgpOwogI2VuZGlmIC8qIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEICovCiAJCX0KLQkJc3Bpbl91bmxvY2soJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisJCXNwaW5fdW5sb2NrKHJ0X2hhc2hfbG9ja19hZGRyKGkpKTsKIAogCQkvKiBGYWxsYmFjayBsb29wIGJyZWFrZXIuICovCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5vdykpCiAJCQlicmVhazsKIAl9CiAJcm92ZXIgPSBpOwotCW1vZF90aW1lcigmcnRfcGVyaW9kaWNfdGltZXIsIG5vdyArIGlwX3J0X2djX2ludGVydmFsKTsKKwltb2RfdGltZXIoJnJ0X3BlcmlvZGljX3RpbWVyLCBqaWZmaWVzICsgaXBfcnRfZ2NfaW50ZXJ2YWwpOwogfQogCiAvKiBUaGlzIGNhbiBydW4gZnJvbSBib3RoIEJIIGFuZCBub24tQkggY29udGV4dHMsIHRoZSBsYXR0ZXIKQEAgLTY0MywxMSArNjgxLDExIEBACiAJZ2V0X3JhbmRvbV9ieXRlcygmcnRfaGFzaF9ybmQsIDQpOwogCiAJZm9yIChpID0gcnRfaGFzaF9tYXNrOyBpID49IDA7IGktLSkgewotCQlzcGluX2xvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisJCXNwaW5fbG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAJCXJ0aCA9IHJ0X2hhc2hfdGFibGVbaV0uY2hhaW47CiAJCWlmIChydGgpCiAJCQlydF9oYXNoX3RhYmxlW2ldLmNoYWluID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGkpKTsKIAogCQlmb3IgKDsgcnRoOyBydGggPSBuZXh0KSB7CiAJCQluZXh0ID0gcnRoLT51LnJ0X25leHQ7CkBAIC03ODAsNyArODE4LDcgQEAKIAogCQkJayA9IChrICsgMSkgJiBydF9oYXNoX21hc2s7CiAJCQlydGhwID0gJnJ0X2hhc2hfdGFibGVba10uY2hhaW47Ci0JCQlzcGluX2xvY2tfYmgoJnJ0X2hhc2hfdGFibGVba10ubG9jayk7CisJCQlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaykpOwogCQkJd2hpbGUgKChydGggPSAqcnRocCkgIT0gTlVMTCkgewogCQkJCWlmICghcnRfbWF5X2V4cGlyZShydGgsIHRtbywgZXhwaXJlKSkgewogCQkJCQl0bW8gPj49IDE7CkBAIC04MTIsNyArODUwLDcgQEAKIAkJCQlnb2FsLS07CiAjZW5kaWYgLyogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgKi8KIAkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2tdLmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaykpOwogCQkJaWYgKGdvYWwgPD0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtODgyLDcgKzkyMCw3IEBACiAKIAlydGhwID0gJnJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW47CiAKLQlzcGluX2xvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJc3Bpbl9sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGhhc2gpKTsKIAl3aGlsZSAoKHJ0aCA9ICpydGhwKSAhPSBOVUxMKSB7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKIAkJaWYgKCEocnRoLT51LmRzdC5mbGFncyAmIERTVF9CQUxBTkNFRCkgJiYKQEAgLTkwOCw3ICs5NDYsNyBAQAogCQkJcnRoLT51LmRzdC5fX3VzZSsrOwogCQkJZHN0X2hvbGQoJnJ0aC0+dS5kc3QpOwogCQkJcnRoLT51LmRzdC5sYXN0dXNlID0gbm93OwotCQkJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAKIAkJCXJ0X2Ryb3AocnQpOwogCQkJKnJwID0gcnRoOwpAQCAtOTQ5LDcgKzk4Nyw3IEBACiAJaWYgKHJ0LT5ydF90eXBlID09IFJUTl9VTklDQVNUIHx8IHJ0LT5mbC5paWYgPT0gMCkgewogCQlpbnQgZXJyID0gYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+dS5kc3QpOwogCQlpZiAoZXJyKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmcnRfaGFzaF90YWJsZVtoYXNoXS5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGhhc2gpKTsKIAogCQkJaWYgKGVyciAhPSAtRU5PQlVGUykgewogCQkJCXJ0X2Ryb3AocnQpOwpAQCAtOTkwLDcgKzEwMjgsNyBAQAogCX0KICNlbmRpZgogCXJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW4gPSBydDsKLQlzcGluX3VubG9ja19iaCgmcnRfaGFzaF90YWJsZVtoYXNoXS5sb2NrKTsKKwlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAJKnJwID0gcnQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDU4LDcgKzEwOTYsNyBAQAogewogCXN0cnVjdCBydGFibGUgKipydGhwOwogCi0Jc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXNwaW5fbG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAJaXBfcnRfcHV0KHJ0KTsKIAlmb3IgKHJ0aHAgPSAmcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbjsgKnJ0aHA7CiAJICAgICBydGhwID0gJigqcnRocCktPnUucnRfbmV4dCkKQEAgLTEwNjcsNyArMTEwNSw3IEBACiAJCQlydF9mcmVlKHJ0KTsKIAkJCWJyZWFrOwogCQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogfQogCiB2b2lkIGlwX3J0X3JlZGlyZWN0KHUzMiBvbGRfZ3csIHUzMiBkYWRkciwgdTMyIG5ld19ndywKQEAgLTE2NDcsNyArMTY4NSw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hcnRpYW4gc291cmNlICV1LiV1LiV1LiV1IGZyb20gIgogCQkJIiV1LiV1LiV1LiV1LCBvbiBkZXYgJXNcbiIsCiAJCQlOSVBRVUFEKGRhZGRyKSwgTklQUVVBRChzYWRkciksIGRldi0+bmFtZSk7Ci0JCWlmIChkZXYtPmhhcmRfaGVhZGVyX2xlbikgeworCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4gJiYgc2tiLT5tYWMucmF3KSB7CiAJCQlpbnQgaTsKIAkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsbCBoZWFkZXI6ICIpOwpAQCAtMTkwOSw3ICsxOTQ3LDcgQEAKIAkgKi8KIAlpZiAoKGVyciA9IGZpYl9sb29rdXAoJmZsLCAmcmVzKSkgIT0gMCkgewogCQlpZiAoIUlOX0RFVl9GT1JXQVJEKGluX2RldikpCi0JCQlnb3RvIGVfaW52YWw7CisJCQlnb3RvIGVfaG9zdHVucmVhY2g7CiAJCWdvdG8gbm9fcm91dGU7CiAJfQogCWZyZWVfcmVzID0gMTsKQEAgLTE5MzMsNyArMTk3MSw3IEBACiAJfQogCiAJaWYgKCFJTl9ERVZfRk9SV0FSRChpbl9kZXYpKQotCQlnb3RvIGVfaW52YWw7CisJCWdvdG8gZV9ob3N0dW5yZWFjaDsKIAlpZiAocmVzLnR5cGUgIT0gUlROX1VOSUNBU1QpCiAJCWdvdG8gbWFydGlhbl9kZXN0aW5hdGlvbjsKIApAQCAtMjAyNSw2ICsyMDYzLDExIEBACiAJCQkiJXUuJXUuJXUuJXUsIGRldiAlc1xuIiwKIAkJCU5JUFFVQUQoZGFkZHIpLCBOSVBRVUFEKHNhZGRyKSwgZGV2LT5uYW1lKTsKICNlbmRpZgorCitlX2hvc3R1bnJlYWNoOgorICAgICAgICBlcnIgPSAtRUhPU1RVTlJFQUNIOworICAgICAgICBnb3RvIGRvbmU7CisKIGVfaW52YWw6CiAJZXJyID0gLUVJTlZBTDsKIAlnb3RvIGRvbmU7CkBAIC0zMDY4LDEyICszMTExLDE0IEBACiAKIGludCBfX2luaXQgaXBfcnRfaW5pdCh2b2lkKQogewotCWludCBpLCBvcmRlciwgZ29hbCwgcmMgPSAwOworCWludCByYyA9IDA7CiAKIAlydF9oYXNoX3JuZCA9IChpbnQpICgobnVtX3BoeXNwYWdlcyBeIChudW1fcGh5c3BhZ2VzPj44KSkgXgogCQkJICAgICAoamlmZmllcyBeIChqaWZmaWVzID4+IDcpKSk7CiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorCXsKKwlpbnQgb3JkZXI7CiAJZm9yIChvcmRlciA9IDA7CiAJICAgICAoUEFHRV9TSVpFIDw8IG9yZGVyKSA8IDI1NiAqIHNpemVvZihzdHJ1Y3QgaXBfcnRfYWNjdCkgKiBOUl9DUFVTOyBvcmRlcisrKQogCQkvKiBOT1RISU5HICovOwpAQCAtMzA4MSw2ICszMTI2LDcgQEAKIAlpZiAoIWlwX3J0X2FjY3QpCiAJCXBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIGlwX3J0X2FjY3RcbiIpOwogCW1lbXNldChpcF9ydF9hY2N0LCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCX0KICNlbmRpZgogCiAJaXB2NF9kc3Rfb3BzLmttZW1fY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlwX2RzdF9jYWNoZSIsCkBAIC0zMDkxLDM2ICszMTM3LDE5IEBACiAJaWYgKCFpcHY0X2RzdF9vcHMua21lbV9jYWNoZXApCiAJCXBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIGlwX2RzdF9jYWNoZVxuIik7CiAKLQlnb2FsID0gbnVtX3BoeXNwYWdlcyA+PiAoMjYgLSBQQUdFX1NISUZUKTsKLQlpZiAocmhhc2hfZW50cmllcykKLQkJZ29hbCA9IChyaGFzaF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCkpID4+IFBBR0VfU0hJRlQ7Ci0JZm9yIChvcmRlciA9IDA7ICgxVUwgPDwgb3JkZXIpIDwgZ29hbDsgb3JkZXIrKykKLQkJLyogTk9USElORyAqLzsKLQotCWRvIHsKLQkJcnRfaGFzaF9tYXNrID0gKDFVTCA8PCBvcmRlcikgKiBQQUdFX1NJWkUgLwotCQkJc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCk7Ci0JCXdoaWxlIChydF9oYXNoX21hc2sgJiAocnRfaGFzaF9tYXNrIC0gMSkpCi0JCQlydF9oYXNoX21hc2stLTsKLQkJcnRfaGFzaF90YWJsZSA9IChzdHJ1Y3QgcnRfaGFzaF9idWNrZXQgKikKLQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOwotCX0gd2hpbGUgKHJ0X2hhc2hfdGFibGUgPT0gTlVMTCAmJiAtLW9yZGVyID4gMCk7Ci0KLQlpZiAoIXJ0X2hhc2hfdGFibGUpCi0JCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgSVAgcm91dGUgY2FjaGUgaGFzaCB0YWJsZVxuIik7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJJUDogcm91dGluZyBjYWNoZSBoYXNoIHRhYmxlIG9mICV1IGJ1Y2tldHMsICVsZEtieXRlc1xuIiwKLQkgICAgICAgcnRfaGFzaF9tYXNrLAotCSAgICAgICAobG9uZykgKHJ0X2hhc2hfbWFzayAqIHNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpKSAvIDEwMjQpOwotCi0JZm9yIChydF9oYXNoX2xvZyA9IDA7ICgxIDw8IHJ0X2hhc2hfbG9nKSAhPSBydF9oYXNoX21hc2s7IHJ0X2hhc2hfbG9nKyspCi0JCS8qIE5PVEhJTkcgKi87Ci0KLQlydF9oYXNoX21hc2stLTsKLQlmb3IgKGkgPSAwOyBpIDw9IHJ0X2hhc2hfbWFzazsgaSsrKSB7Ci0JCXNwaW5fbG9ja19pbml0KCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOwotCQlydF9oYXNoX3RhYmxlW2ldLmNoYWluID0gTlVMTDsKLQl9CisJcnRfaGFzaF90YWJsZSA9IChzdHJ1Y3QgcnRfaGFzaF9idWNrZXQgKikKKwkJYWxsb2NfbGFyZ2Vfc3lzdGVtX2hhc2goIklQIHJvdXRlIGNhY2hlIiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCksCisJCQkJCXJoYXNoX2VudHJpZXMsCisJCQkJCShudW1fcGh5c3BhZ2VzID49IDEyOCAqIDEwMjQpID8KKwkJCQkJCSgyNyAtIFBBR0VfU0hJRlQpIDoKKwkJCQkJCSgyOSAtIFBBR0VfU0hJRlQpLAorCQkJCQlIQVNIX0hJR0hNRU0sCisJCQkJCSZydF9oYXNoX2xvZywKKwkJCQkJJnJ0X2hhc2hfbWFzaywKKwkJCQkJMCk7CisJbWVtc2V0KHJ0X2hhc2hfdGFibGUsIDAsIChydF9oYXNoX21hc2sgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpKTsKKwlydF9oYXNoX2xvY2tfaW5pdCgpOwogCiAJaXB2NF9kc3Rfb3BzLmdjX3RocmVzaCA9IChydF9oYXNoX21hc2sgKyAxKTsKIAlpcF9ydF9tYXhfc2l6ZSA9IChydF9oYXNoX21hc2sgKyAxKSAqIDE2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCA4ODI0MzZkLi5kZGI2Y2U0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJCQkgc2l6ZV90IHBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JaW50IG1zc19ub3c7CisJaW50IG1zc19ub3csIHNpemVfZ29hbDsKIAlpbnQgZXJyOwogCXNzaXplX3QgY29waWVkOwogCWxvbmcgdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CkBAIC02MjgsNiArNjI4LDcgQEAKIAljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJc2l6ZV9nb2FsID0gdHAtPnhtaXRfc2l6ZV9nb2FsOwogCWNvcGllZCA9IDA7CiAKIAllcnIgPSAtRVBJUEU7CkBAIC02NDEsNyArNjQyLDcgQEAKIAkJaW50IG9mZnNldCA9IHBvZmZzZXQgJSBQQUdFX1NJWkU7CiAJCWludCBzaXplID0gbWluX3Qoc2l6ZV90LCBwc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKIAotCQlpZiAoIXNrLT5za19zZW5kX2hlYWQgfHwgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKKwkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8IChjb3B5ID0gc2l6ZV9nb2FsIC0gc2tiLT5sZW4pIDw9IDApIHsKIG5ld19zZWdtZW50OgogCQkJaWYgKCFza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spKQogCQkJCWdvdG8gd2FpdF9mb3Jfc25kYnVmOwpAQCAtNjUyLDcgKzY1Myw3IEBACiAJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CiAKIAkJCXNrYl9lbnRhaWwoc2ssIHRwLCBza2IpOwotCQkJY29weSA9IG1zc19ub3c7CisJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQl9CiAKIAkJaWYgKGNvcHkgPiBzaXplKQpAQCAtNjkzLDcgKzY5NCw3IEBACiAJCWlmICghKHBzaXplIC09IGNvcHkpKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHNrYi0+bGVuICE9IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCisJCWlmIChza2ItPmxlbiA8IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CkBAIC03MTMsNiArNzE0LDcgQEAKIAkJCWdvdG8gZG9fZXJyb3I7CiAKIAkJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAl9CiAKIG91dDoKQEAgLTc1NCwxNSArNzU2LDIwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlbGVjdF9zaXplKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlpbnQgdG1wID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJaW50IHRtcCA9IHRwLT5tc3NfY2FjaGU7CiAKIAlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHKSB7Ci0JCWludCBwZ2JyZWFrID0gU0tCX01BWF9IRUFEKE1BWF9UQ1BfSEVBREVSKTsKKwkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pCisJCQl0bXAgPSAwOworCQllbHNlIHsKKwkJCWludCBwZ2JyZWFrID0gU0tCX01BWF9IRUFEKE1BWF9UQ1BfSEVBREVSKTsKIAotCQlpZiAodG1wID49IHBnYnJlYWsgJiYKLQkJICAgIHRtcCA8PSBwZ2JyZWFrICsgKE1BWF9TS0JfRlJBR1MgLSAxKSAqIFBBR0VfU0laRSkKLQkJCXRtcCA9IHBnYnJlYWs7CisJCQlpZiAodG1wID49IHBnYnJlYWsgJiYKKwkJCSAgICB0bXAgPD0gcGdicmVhayArIChNQVhfU0tCX0ZSQUdTIC0gMSkgKiBQQUdFX1NJWkUpCisJCQkJdG1wID0gcGdicmVhazsKKwkJfQogCX0KKwogCXJldHVybiB0bXA7CiB9CiAKQEAgLTc3Myw3ICs3ODAsNyBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGlvdmxlbiwgZmxhZ3M7Ci0JaW50IG1zc19ub3c7CisJaW50IG1zc19ub3csIHNpemVfZ29hbDsKIAlpbnQgZXJyLCBjb3BpZWQ7CiAJbG9uZyB0aW1lbzsKIApAQCAtNzkyLDYgKzc5OSw3IEBACiAJY2xlYXJfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKIAogCW1zc19ub3cgPSB0Y3BfY3VycmVudF9tc3Moc2ssICEoZmxhZ3MmTVNHX09PQikpOworCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAogCS8qIE9rIGNvbW1lbmNlIHNlbmRpbmcuICovCiAJaW92bGVuID0gbXNnLT5tc2dfaW92bGVuOwpAQCAtODE0LDcgKzgyMiw3IEBACiAJCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKIAogCQkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8Ci0JCQkgICAgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKKwkJCSAgICAoY29weSA9IHNpemVfZ29hbCAtIHNrYi0+bGVuKSA8PSAwKSB7CiAKIG5ld19zZWdtZW50OgogCQkJCS8qIEFsbG9jYXRlIG5ldyBzZWdtZW50LiBJZiB0aGUgaW50ZXJmYWNlIGlzIFNHLApAQCAtODM3LDcgKzg0NSw3IEBACiAJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CiAKIAkJCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKLQkJCQljb3B5ID0gbXNzX25vdzsKKwkJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQkJfQogCiAJCQkvKiBUcnkgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiBza2IuICovCkBAIC04NzIsMTEgKzg4MCw2IEBACiAJCQkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CiAJCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAJCQkJfSBlbHNlIGlmIChwYWdlKSB7Ci0JCQkJCS8qIElmIHBhZ2UgaXMgY2FjaGVkLCBhbGlnbgotCQkJCQkgKiBvZmZzZXQgdG8gTDEgY2FjaGUgYm91bmRhcnkKLQkJCQkJICovCi0JCQkJCW9mZiA9IChvZmYgKyBMMV9DQUNIRV9CWVRFUyAtIDEpICYKLQkJCQkJICAgICAgfihMMV9DQUNIRV9CWVRFUyAtIDEpOwogCQkJCQlpZiAob2ZmID09IFBBR0VfU0laRSkgewogCQkJCQkJcHV0X3BhZ2UocGFnZSk7CiAJCQkJCQlUQ1BfUEFHRShzaykgPSBwYWdlID0gTlVMTDsKQEAgLTkzNyw3ICs5NDAsNyBAQAogCQkJaWYgKChzZWdsZW4gLT0gY29weSkgPT0gMCAmJiBpb3ZsZW4gPT0gMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJaWYgKHNrYi0+bGVuICE9IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCisJCQlpZiAoc2tiLT5sZW4gPCBtc3Nfbm93IHx8IChmbGFncyAmIE1TR19PT0IpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CkBAIC05NTcsNiArOTYwLDcgQEAKIAkJCQlnb3RvIGRvX2Vycm9yOwogCiAJCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwkJCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAkJfQogCX0KIApAQCAtMTEwMSw3ICsxMTA1LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JTkVUX0FERF9TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BQUkVRVUVVRUQsIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpOworCU5FVF9JTkNfU1RBVFNfVVNFUihMSU5VWF9NSUJfVENQUFJFUVVFVUVEKTsKIAogCS8qIFJYIHByb2Nlc3Mgd2FudHMgdG8gcnVuIHdpdGggZGlzYWJsZWQgQkhzLCB0aG91Z2ggaXQgaXMgbm90CiAJICogbmVjZXNzYXJ5ICovCkBAIC0xMzY1LDcgKzEzNjksNyBAQAogCQkJICogaXMgbm90IGVtcHR5LiBJdCBpcyBtb3JlIGVsZWdhbnQsIGJ1dCBlYXRzIGN5Y2xlcywKIAkJCSAqIHVuZm9ydHVuYXRlbHkuCiAJCQkgKi8KLQkJCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKQorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT51Y29weS5wcmVxdWV1ZSkpCiAJCQkJZ290byBkb19wcmVxdWV1ZTsKIAogCQkJLyogX18gU2V0IHJlYWx0aW1lIHBvbGljeSBpbiBzY2hlZHVsZXIgX18gKi8KQEAgLTEzOTAsNyArMTM5NCw3IEBACiAJCQl9CiAKIAkJCWlmICh0cC0+cmN2X254dCA9PSB0cC0+Y29waWVkX3NlcSAmJgotCQkJICAgIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKKwkJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CiBkb19wcmVxdWV1ZToKIAkJCQl0Y3BfcHJlcXVldWVfcHJvY2Vzcyhzayk7CiAKQEAgLTE0NzIsNyArMTQ3Niw3IEBACiAJfSB3aGlsZSAobGVuID4gMCk7CiAKIAlpZiAodXNlcl9yZWN2KSB7Ci0JCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CiAJCQlpbnQgY2h1bms7CiAKIAkJCXRwLT51Y29weS5sZW4gPSBjb3BpZWQgPiAwID8gbGVuIDogMDsKQEAgLTIxMjgsNyArMjEzMiw3IEBACiAKIAlpbmZvLT50Y3BpX3J0byA9IGppZmZpZXNfdG9fdXNlY3ModHAtPnJ0byk7CiAJaW5mby0+dGNwaV9hdG8gPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT5hY2suYXRvKTsKLQlpbmZvLT50Y3BpX3NuZF9tc3MgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwlpbmZvLT50Y3BpX3NuZF9tc3MgPSB0cC0+bXNzX2NhY2hlOwogCWluZm8tPnRjcGlfcmN2X21zcyA9IHRwLT5hY2sucmN2X21zczsKIAogCWluZm8tPnRjcGlfdW5hY2tlZCA9IHRwLT5wYWNrZXRzX291dDsKQEAgLTIxNzgsNyArMjE4Miw3IEBACiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIFRDUF9NQVhTRUc6Ci0JCXZhbCA9IHRwLT5tc3NfY2FjaGVfc3RkOworCQl2YWwgPSB0cC0+bXNzX2NhY2hlOwogCQlpZiAoIXZhbCAmJiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9MSVNURU4pKSkKIAkJCXZhbCA9IHRwLT5yeF9vcHQudXNlcl9tc3M7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCA3YmJiYmMzLi41M2E4YTUzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtNzQwLDEwICs3NDAsMTAgQEAKIAlfX3UzMiBjd25kID0gKGRzdCA/IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0lOSVRDV05EKSA6IDApOwogCiAJaWYgKCFjd25kKSB7Ci0JCWlmICh0cC0+bXNzX2NhY2hlX3N0ZCA+IDE0NjApCisJCWlmICh0cC0+bXNzX2NhY2hlID4gMTQ2MCkKIAkJCWN3bmQgPSAyOwogCQllbHNlCi0JCQljd25kID0gKHRwLT5tc3NfY2FjaGVfc3RkID4gMTA5NSkgPyAzIDogNDsKKwkJCWN3bmQgPSAodHAtPm1zc19jYWNoZSA+IDEwOTUpID8gMyA6IDQ7CiAJfQogCXJldHVybiBtaW5fdChfX3UzMiwgY3duZCwgdHAtPnNuZF9jd25kX2NsYW1wKTsKIH0KQEAgLTkxNCw3ICs5MTQsNyBAQAogCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSB7CiAJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKIAkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOwotCQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlOwogCX0KIAogCWlmICghdHAtPnNhY2tlZF9vdXQpCkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogCQkJICAgIChJc0ZhY2sodHApIHx8CiAJCQkgICAgICFiZWZvcmUobG9zdF9yZXRyYW5zLAogCQkJCSAgICAgVENQX1NLQl9DQihza2IpLT5hY2tfc2VxICsgdHAtPnJlb3JkZXJpbmcgKgotCQkJCSAgICAgdHAtPm1zc19jYWNoZV9zdGQpKSkgeworCQkJCSAgICAgdHAtPm1zc19jYWNoZSkpKSB7CiAJCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1NBQ0tFRF9SRVRSQU5TOwogCQkJCXRwLT5yZXRyYW5zX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCkBAIC0xOTU3LDE1ICsxOTU3LDYgQEAKIAl9CiB9CiAKLS8qIFRoZXJlIGlzIG9uZSBkb3duc2lkZSB0byB0aGlzIHNjaGVtZS4gIEFsdGhvdWdoIHdlIGtlZXAgdGhlCi0gKiBBQ0sgY2xvY2sgdGlja2luZywgYWRqdXN0aW5nIHBhY2tldCBjb3VudGVycyBhbmQgYWR2YW5jaW5nCi0gKiBjb25nZXN0aW9uIHdpbmRvdywgd2UgZG8gbm90IGxpYmVyYXRlIHNvY2tldCBzZW5kIGJ1ZmZlcgotICogc3BhY2UuCi0gKgotICogTXVja2luZyB3aXRoIHNrYi0+dHJ1ZXNpemUgYW5kIHNrLT5za193bWVtX2FsbG9jIGV0IGFsLgotICogdGhlbiBtYWtpbmcgYSB3cml0ZSBzcGFjZSB3YWtldXAgY2FsbGJhY2sgaXMgYSBwb3NzaWJsZQotICogZnV0dXJlIGVuaGFuY2VtZW50LiAgV0FSTklORzogaXQgaXMgbm90IHRyaXZpYWwgdG8gbWFrZS4KLSAqLwogc3RhdGljIGludCB0Y3BfdHNvX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSBfX3UzMiBub3csIF9fczMyICpzZXFfcnR0KQogewpAQCAtMjA0Nyw3ICsyMDM4LDggQEAKIAkJICogdGhlIG90aGVyIGVuZC4KIAkJICovCiAJCWlmIChhZnRlcihzY2ItPmVuZF9zZXEsIHRwLT5zbmRfdW5hKSkgewotCQkJaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxKQorCQkJaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxICYmCisJCQkgICAgYWZ0ZXIodHAtPnNuZF91bmEsIHNjYi0+c2VxKSkKIAkJCQlhY2tlZCB8PSB0Y3BfdHNvX2Fja2VkKHNrLCBza2IsCiAJCQkJCQkgICAgICAgbm93LCAmc2VxX3J0dCk7CiAJCQlicmVhazsKQEAgLTI4MTAsNyArMjgwMiw3IEBACiAJaW50IHRoaXNfc2FjazsKIAogCS8qIEVtcHR5IG9mbyBxdWV1ZSwgaGVuY2UsIGFsbCB0aGUgU0FDS3MgYXJlIGVhdGVuLiBDbGVhci4gKi8KLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkgPT0gMCkgeworCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMDsKIAkJdHAtPnJ4X29wdC5lZmZfc2Fja3MgPSB0cC0+cnhfb3B0LmRzYWNrOwogCQlyZXR1cm47CkBAIC0yOTQzLDEzICsyOTM1LDEzIEBACiAJCWlmKHRoLT5maW4pCiAJCQl0Y3BfZmluKHNrYiwgc2ssIHRoKTsKIAotCQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCQl0Y3Bfb2ZvX3F1ZXVlKHNrKTsKIAogCQkJLyogUkZDMjU4MS4gNC4yLiBTSE9VTEQgc2VuZCBpbW1lZGlhdGUgQUNLLCB3aGVuCiAJCQkgKiBnYXAgaW4gcXVldWUgaXMgZmlsbGVkLgogCQkJICovCi0JCQlpZiAoIXNrYl9xdWV1ZV9sZW4oJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKQorCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCiAJCQkJdHAtPmFjay5waW5ncG9uZyA9IDA7CiAJCX0KIApAQCAtMzI1Nyw5ICszMjQ5LDggQEAKIAkgKiBUaGlzIG11c3Qgbm90IGV2ZXIgb2NjdXIuICovCiAKIAkvKiBGaXJzdCwgcHVyZ2UgdGhlIG91dF9vZl9vcmRlciBxdWV1ZS4gKi8KLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKLQkJTkVUX0FERF9TVEFUU19CSChMSU5VWF9NSUJfT0ZPUFJVTkVELCAKLQkJCQkgc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpOworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PRk9QUlVORUQpOwogCQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKIAkJLyogUmVzZXQgU0FDSyBzdGF0ZS4gIEEgY29uZm9ybWluZyBTQUNLIGltcGxlbWVudGF0aW9uIHdpbGwKQEAgLTMzMDgsNiArMzI5OSwyOCBAQAogCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2hvdWxkX2V4cGFuZF9zbmRidWYoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHNwZWNpZmljIHNlbmQgYnVmZmVyIHNldHRpbmcsIGRvCisJICogbm90IG1vZGlmeSBpdC4KKwkgKi8KKwlpZiAoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfU05EQlVGX0xPQ0spCisJCXJldHVybiAwOworCisJLyogSWYgd2UgYXJlIHVuZGVyIGdsb2JhbCBUQ1AgbWVtb3J5IHByZXNzdXJlLCBkbyBub3QgZXhwYW5kLiAgKi8KKwlpZiAodGNwX21lbW9yeV9wcmVzc3VyZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBhcmUgdW5kZXIgc29mdCBnbG9iYWwgVENQIG1lbW9yeSBwcmVzc3VyZSwgZG8gbm90IGV4cGFuZC4gICovCisJaWYgKGF0b21pY19yZWFkKCZ0Y3BfbWVtb3J5X2FsbG9jYXRlZCkgPj0gc3lzY3RsX3RjcF9tZW1bMF0pCisJCXJldHVybiAwOworCisJLyogSWYgd2UgZmlsbGVkIHRoZSBjb25nZXN0aW9uIHdpbmRvdywgZG8gbm90IGV4cGFuZC4gICovCisJaWYgKHRwLT5wYWNrZXRzX291dCA+PSB0cC0+c25kX2N3bmQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CiAKIC8qIFdoZW4gaW5jb21pbmcgQUNLIGFsbG93ZWQgdG8gZnJlZSBzb21lIHNrYiBmcm9tIHdyaXRlX3F1ZXVlLAogICogd2UgcmVtZW1iZXIgdGhpcyBldmVudCBpbiBmbGFnIFNPQ0tfUVVFVUVfU0hSVU5LIGFuZCB3YWtlIHVwIHNvY2tldApAQCAtMzMxOSwxMSArMzMzMiw4IEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAodHAtPnBhY2tldHNfb3V0IDwgdHAtPnNuZF9jd25kICYmCi0JICAgICEoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfU05EQlVGX0xPQ0spICYmCi0JICAgICF0Y3BfbWVtb3J5X3ByZXNzdXJlICYmCi0JICAgIGF0b21pY19yZWFkKCZ0Y3BfbWVtb3J5X2FsbG9jYXRlZCkgPCBzeXNjdGxfdGNwX21lbVswXSkgewotIAkJaW50IHNuZG1lbSA9IG1heF90KHUzMiwgdHAtPnJ4X29wdC5tc3NfY2xhbXAsIHRwLT5tc3NfY2FjaGVfc3RkKSArCisJaWYgKHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzaywgdHApKSB7CisgCQlpbnQgc25kbWVtID0gbWF4X3QodTMyLCB0cC0+cnhfb3B0Lm1zc19jbGFtcCwgdHAtPm1zc19jYWNoZSkgKwogCQkJTUFYX1RDUF9IRUFERVIgKyAxNiArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiksCiAJCSAgICBkZW1hbmRlZCA9IG1heF90KHVuc2lnbmVkIGludCwgdHAtPnNuZF9jd25kLAogCQkJCQkJICAgdHAtPnJlb3JkZXJpbmcgKyAxKTsKQEAgLTMzNDYsMjIgKzMzNTYsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX190Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCi0JaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkgfHwKLQkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA+PSB0cC0+c25kX2N3bmQgfHwKLQkgICAgdGNwX3dyaXRlX3htaXQoc2ssIHRwLT5ub25hZ2xlKSkKLQkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2RhdGFfc25kX2NoZWNrKHN0cnVjdCBzb2NrICpzaykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCWlmIChza2IgIT0gTlVMTCkKLQkJX190Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHNrYik7CisJdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwKTsKIAl0Y3BfY2hlY2tfc3BhY2Uoc2spOwogfQogCkBAIC0zNjU1LDcgKzM2NTIsNyBAQAogCQkJCSAqLwogCQkJCXRjcF9hY2soc2ssIHNrYiwgMCk7CiAJCQkJX19rZnJlZV9za2Ioc2tiKTsgCi0JCQkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKKwkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0gZWxzZSB7IC8qIEhlYWRlciB0b28gc21hbGwgKi8KIAkJCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKQEAgLTM3MjEsNyArMzcxOCw3IEBACiAJCQlpZiAoVENQX1NLQl9DQihza2IpLT5hY2tfc2VxICE9IHRwLT5zbmRfdW5hKSB7CiAJCQkJLyogV2VsbCwgb25seSBvbmUgc21hbGwganVtcGxldCBpbiBmYXN0IHBhdGguLi4gKi8KIAkJCQl0Y3BfYWNrKHNrLCBza2IsIEZMQUdfREFUQSk7Ci0JCQkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKKwkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKIAkJCQlpZiAoIXRjcF9hY2tfc2NoZWR1bGVkKHRwKSkKIAkJCQkJZ290byBub19hY2s7CiAJCQl9CkBAIC0zNzk5LDcgKzM3OTYsNyBAQAogCS8qIHN0ZXAgNzogcHJvY2VzcyB0aGUgc2VnbWVudCB0ZXh0ICovCiAJdGNwX2RhdGFfcXVldWUoc2ssIHNrYik7CiAKLQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCXRjcF9hY2tfc25kX2NoZWNrKHNrKTsKIAlyZXR1cm4gMDsKIApAQCAtNDEwOSw3ICs0MTA2LDcgQEAKIAkJLyogRG8gc3RlcDYgb253YXJkIGJ5IGhhbmQuICovCiAJCXRjcF91cmcoc2ssIHNrYiwgdGgpOwogCQlfX2tmcmVlX3NrYihza2IpOwotCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00MzAwLDcgKzQyOTcsNyBAQAogCiAJLyogdGNwX2RhdGEgY291bGQgbW92ZSBzb2NrZXQgdG8gVElNRS1XQUlUICovCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKLQkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKKwkJdGNwX2RhdGFfc25kX2NoZWNrKHNrLCB0cCk7CiAJCXRjcF9hY2tfc25kX2NoZWNrKHNrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCmluZGV4IGViZjExMjMuLjYyZjYyYmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwpAQCAtMjA0NSw3ICsyMDQ1LDcgQEAKIAkgKi8KIAl0cC0+c25kX3NzdGhyZXNoID0gMHg3ZmZmZmZmZjsJLyogSW5maW5pdHkgKi8KIAl0cC0+c25kX2N3bmRfY2xhbXAgPSB+MDsKLQl0cC0+bXNzX2NhY2hlX3N0ZCA9IHRwLT5tc3NfY2FjaGUgPSA1MzY7CisJdHAtPm1zc19jYWNoZSA9IDUzNjsKIAogCXRwLT5yZW9yZGVyaW5nID0gc3lzY3RsX3RjcF9yZW9yZGVyaW5nOwogCXRwLT5jYV9vcHMgPSAmdGNwX2luaXRfY29uZ2VzdGlvbl9vcHM7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggMGUxN2MyNC4uZTNmOGVhMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNDksNyArNDksNyBAQAogICogd2lsbCBhbGxvdyBhIHNpbmdsZSBUU08gZnJhbWUgdG8gY29uc3VtZS4gIEJ1aWxkaW5nIFRTTyBmcmFtZXMKICAqIHdoaWNoIGFyZSB0b28gbGFyZ2UgY2FuIGNhdXNlIFRDUCBzdHJlYW1zIHRvIGJlIGJ1cnN0eS4KICAqLwotaW50IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yID0gODsKK2ludCBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvciA9IDM7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE0MCwxMSArMTQwLDExIEBACiAJCXRwLT5hY2sucGluZ3BvbmcgPSAxOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9ldmVudF9hY2tfc2VudChzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9ldmVudF9hY2tfc2VudChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBwa3RzKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JdGNwX2RlY19xdWlja2Fja19tb2RlKHRwKTsKKwl0Y3BfZGVjX3F1aWNrYWNrX21vZGUodHAsIHBrdHMpOwogCXRjcF9jbGVhcl94bWl0X3RpbWVyKHNrLCBUQ1BfVElNRV9EQUNLKTsKIH0KIApAQCAtMzU1LDcgKzM1NSw3IEBACiAJCXRwLT5hZl9zcGVjaWZpYy0+c2VuZF9jaGVjayhzaywgdGgsIHNrYi0+bGVuLCBza2IpOwogCiAJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19BQ0spCi0JCQl0Y3BfZXZlbnRfYWNrX3NlbnQoc2spOworCQkJdGNwX2V2ZW50X2Fja19zZW50KHNrLCB0Y3Bfc2tiX3Bjb3VudChza2IpKTsKIAogCQlpZiAoc2tiLT5sZW4gIT0gdGNwX2hlYWRlcl9zaXplKQogCQkJdGNwX2V2ZW50X2RhdGFfc2VudCh0cCwgc2tiLCBzayk7CkBAIC00MDMsNDIgKzQwMywxMSBAQAogCQlzay0+c2tfc2VuZF9oZWFkID0gc2tiOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3Rzb19zZXRfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qIEZvcmNlIHB1c2ggdG8gYmUgb24gZm9yIGFueSBUU08gZnJhbWVzIHRvIHdvcmthcm91bmQKLQkgKiBwcm9ibGVtcyB3aXRoIGJ1c3RlZCBpbXBsZW1lbnRhdGlvbnMgbGlrZSBNYWMgT1MtWCB0aGF0Ci0JICogaG9sZCBvZmYgc29ja2V0IHJlY2VpdmUgd2FrZXVwcyB1bnRpbCBwdXNoIGlzIHNlZW4uCi0JICovCi0JaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxKQotCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUENCX0ZMQUdfUFNIOwotfQotCi0vKiBTZW5kIF9zaW5nbGVfIHNrYiBzaXR0aW5nIGF0IHRoZSBzZW5kIGhlYWQuIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMKLSAqIHRydWUgcHVzaCBwZW5kaW5nIGZyYW1lcyB0byBzZXR1cCBwcm9iZSB0aW1lciBldGMuCi0gKi8KLXZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY3VyX21zcykKLXsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCWlmICh0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgY3VyX21zcywgVENQX05BR0xFX1BVU0gpKSB7Ci0JCS8qIFNlbmQgaXQgb3V0IG5vdy4gKi8KLQkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7Ci0JCXRjcF90c29fc2V0X3B1c2goc2tiKTsKLQkJaWYgKCF0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBzay0+c2tfYWxsb2NhdGlvbikpKSB7Ci0JCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKLQkJCXRwLT5zbmRfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCQkJdGNwX3BhY2tldHNfb3V0X2luYyhzaywgdHAsIHNrYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JaWYgKHNrYi0+bGVuIDw9IHRwLT5tc3NfY2FjaGVfc3RkIHx8CisJaWYgKHNrYi0+bGVuIDw9IHRwLT5tc3NfY2FjaGUgfHwKIAkgICAgIShzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSkgewogCQkvKiBBdm9pZCB0aGUgY29zdGx5IGRpdmlkZSBpbiB0aGUgbm9ybWFsCiAJCSAqIG5vbi1UU08gY2FzZS4KQEAgLTQ0OCwxMCArNDE3LDEwIEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgaW50IGZhY3RvcjsKIAotCQlmYWN0b3IgPSBza2ItPmxlbiArICh0cC0+bXNzX2NhY2hlX3N0ZCAtIDEpOwotCQlmYWN0b3IgLz0gdHAtPm1zc19jYWNoZV9zdGQ7CisJCWZhY3RvciA9IHNrYi0+bGVuICsgKHRwLT5tc3NfY2FjaGUgLSAxKTsKKwkJZmFjdG9yIC89IHRwLT5tc3NfY2FjaGU7CiAJCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgPSBmYWN0b3I7Ci0JCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IHRwLT5tc3NfY2FjaGU7CiAJfQogfQogCkBAIC01MzcsNiArNTA2LDcgQEAKIAl9CiAKIAkvKiBMaW5rIEJVRkYgaW50byB0aGUgc2VuZCBxdWV1ZS4gKi8KKwlza2JfaGVhZGVyX3JlbGVhc2UoYnVmZik7CiAJX19za2JfYXBwZW5kKHNrYiwgYnVmZik7CiAKIAlyZXR1cm4gMDsKQEAgLTY1Nyw3ICs2MjcsNyBAQAogCiAJLyogQW5kIHN0b3JlIGNhY2hlZCByZXN1bHRzICovCiAJdHAtPnBtdHVfY29va2llID0gcG10dTsKLQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQgPSBtc3Nfbm93OworCXRwLT5tc3NfY2FjaGUgPSBtc3Nfbm93OwogCiAJcmV0dXJuIG1zc19ub3c7CiB9CkBAIC02NjksNTkgKzYzOSwzMTggQEAKICAqIGNhbm5vdCBiZSBsYXJnZS4gSG93ZXZlciwgdGFraW5nIGludG8gYWNjb3VudCByYXJlIHVzZSBvZiBVUkcsIHRoaXMKICAqIGlzIG5vdCBhIGJpZyBmbGF3LgogICovCi0KLXVuc2lnbmVkIGludCB0Y3BfY3VycmVudF9tc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgbGFyZ2UpCit1bnNpZ25lZCBpbnQgdGNwX2N1cnJlbnRfbXNzKHN0cnVjdCBzb2NrICpzaywgaW50IGxhcmdlX2FsbG93ZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gX19za19kc3RfZ2V0KHNrKTsKLQl1bnNpZ25lZCBpbnQgZG9fbGFyZ2UsIG1zc19ub3c7CisJdTMyIG1zc19ub3c7CisJdTE2IHhtaXRfc2l6ZV9nb2FsOworCWludCBkb2luZ190c28gPSAwOwogCi0JbXNzX25vdyA9IHRwLT5tc3NfY2FjaGVfc3RkOworCW1zc19ub3cgPSB0cC0+bXNzX2NhY2hlOworCisJaWYgKGxhcmdlX2FsbG93ZWQgJiYKKwkgICAgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pICYmCisJICAgICF0cC0+dXJnX21vZGUpCisJCWRvaW5nX3RzbyA9IDE7CisKIAlpZiAoZHN0KSB7CiAJCXUzMiBtdHUgPSBkc3RfbXR1KGRzdCk7CiAJCWlmIChtdHUgIT0gdHAtPnBtdHVfY29va2llKQogCQkJbXNzX25vdyA9IHRjcF9zeW5jX21zcyhzaywgbXR1KTsKIAl9CiAKLQlkb19sYXJnZSA9IChsYXJnZSAmJgotCQkgICAgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pICYmCi0JCSAgICAhdHAtPnVyZ19tb2RlKTsKLQotCWlmIChkb19sYXJnZSkgewotCQl1bnNpZ25lZCBpbnQgbGFyZ2VfbXNzLCBmYWN0b3IsIGxpbWl0OwotCi0JCWxhcmdlX21zcyA9IDY1NTM1IC0gdHAtPmFmX3NwZWNpZmljLT5uZXRfaGVhZGVyX2xlbiAtCi0JCQl0cC0+ZXh0X2hlYWRlcl9sZW4gLSB0cC0+dGNwX2hlYWRlcl9sZW47Ci0KLQkJaWYgKHRwLT5tYXhfd2luZG93ICYmIGxhcmdlX21zcyA+ICh0cC0+bWF4X3dpbmRvdz4+MSkpCi0JCQlsYXJnZV9tc3MgPSBtYXgoKHRwLT5tYXhfd2luZG93Pj4xKSwKLQkJCQkJNjhVIC0gdHAtPnRjcF9oZWFkZXJfbGVuKTsKLQotCQlmYWN0b3IgPSBsYXJnZV9tc3MgLyBtc3Nfbm93OwotCi0JCS8qIEFsd2F5cyBrZWVwIGxhcmdlIG1zcyBtdWx0aXBsZSBvZiByZWFsIG1zcywgYnV0Ci0JCSAqIGRvIG5vdCBleGNlZWQgMS90c29fd2luX2Rpdmlzb3Igb2YgdGhlIGNvbmdlc3Rpb24gd2luZG93Ci0JCSAqIHNvIHdlIGNhbiBrZWVwIHRoZSBBQ0sgY2xvY2sgdGlja2luZyBhbmQgbWluaW1pemUKLQkJICogYnVyc3RpbmcuCi0JCSAqLwotCQlsaW1pdCA9IHRwLT5zbmRfY3duZDsKLQkJaWYgKHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yKQotCQkJbGltaXQgLz0gc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3I7Ci0JCWxpbWl0ID0gbWF4KDFVLCBsaW1pdCk7Ci0JCWlmIChmYWN0b3IgPiBsaW1pdCkKLQkJCWZhY3RvciA9IGxpbWl0OwotCi0JCXRwLT5tc3NfY2FjaGUgPSBtc3Nfbm93ICogZmFjdG9yOwotCi0JCW1zc19ub3cgPSB0cC0+bXNzX2NhY2hlOwotCX0KLQogCWlmICh0cC0+cnhfb3B0LmVmZl9zYWNrcykKIAkJbXNzX25vdyAtPSAoVENQT0xFTl9TQUNLX0JBU0VfQUxJR05FRCArCiAJCQkgICAgKHRwLT5yeF9vcHQuZWZmX3NhY2tzICogVENQT0xFTl9TQUNLX1BFUkJMT0NLKSk7CisKKwl4bWl0X3NpemVfZ29hbCA9IG1zc19ub3c7CisKKwlpZiAoZG9pbmdfdHNvKSB7CisJCXhtaXRfc2l6ZV9nb2FsID0gNjU1MzUgLQorCQkJdHAtPmFmX3NwZWNpZmljLT5uZXRfaGVhZGVyX2xlbiAtCisJCQl0cC0+ZXh0X2hlYWRlcl9sZW4gLSB0cC0+dGNwX2hlYWRlcl9sZW47CisKKwkJaWYgKHRwLT5tYXhfd2luZG93ICYmCisJCSAgICAoeG1pdF9zaXplX2dvYWwgPiAodHAtPm1heF93aW5kb3cgPj4gMSkpKQorCQkJeG1pdF9zaXplX2dvYWwgPSBtYXgoKHRwLT5tYXhfd2luZG93ID4+IDEpLAorCQkJCQkgICAgIDY4VSAtIHRwLT50Y3BfaGVhZGVyX2xlbik7CisKKwkJeG1pdF9zaXplX2dvYWwgLT0gKHhtaXRfc2l6ZV9nb2FsICUgbXNzX25vdyk7CisJfQorCXRwLT54bWl0X3NpemVfZ29hbCA9IHhtaXRfc2l6ZV9nb2FsOworCiAJcmV0dXJuIG1zc19ub3c7CiB9CiAKKy8qIENvbmdlc3Rpb24gd2luZG93IHZhbGlkYXRpb24uIChSRkMyODYxKSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2N3bmRfdmFsaWRhdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCV9fdTMyIHBhY2tldHNfb3V0ID0gdHAtPnBhY2tldHNfb3V0OworCisJaWYgKHBhY2tldHNfb3V0ID49IHRwLT5zbmRfY3duZCkgeworCQkvKiBOZXR3b3JrIGlzIGZlZWQgZnVsbHkuICovCisJCXRwLT5zbmRfY3duZF91c2VkID0gMDsKKwkJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJfSBlbHNlIHsKKwkJLyogTmV0d29yayBzdGFydmVzLiAqLworCQlpZiAodHAtPnBhY2tldHNfb3V0ID4gdHAtPnNuZF9jd25kX3VzZWQpCisJCQl0cC0+c25kX2N3bmRfdXNlZCA9IHRwLT5wYWNrZXRzX291dDsKKworCQlpZiAoKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+c25kX2N3bmRfc3RhbXApID49IHRwLT5ydG8pCisJCQl0Y3BfY3duZF9hcHBsaWNhdGlvbl9saW1pdGVkKHNrKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNwX3dpbmRvd19hbGxvd3Moc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG1zc19ub3csIHVuc2lnbmVkIGludCBjd25kKQoreworCXUzMiB3aW5kb3csIGN3bmRfbGVuOworCisJd2luZG93ID0gKHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7CisJY3duZF9sZW4gPSBtc3Nfbm93ICogY3duZDsKKwlyZXR1cm4gbWluKHdpbmRvdywgY3duZF9sZW4pOworfQorCisvKiBDYW4gYXQgbGVhc3Qgb25lIHNlZ21lbnQgb2YgU0tCIGJlIHNlbnQgcmlnaHQgbm93LCBhY2NvcmRpbmcgdG8gdGhlCisgKiBjb25nZXN0aW9uIHdpbmRvdyBydWxlcz8gIElmIHNvLCByZXR1cm4gaG93IG1hbnkgc2VnbWVudHMgYXJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRjcF9jd25kX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgaW5fZmxpZ2h0LCBjd25kOworCisJLyogRG9uJ3QgYmUgc3RyaWN0IGFib3V0IHRoZSBjb25nZXN0aW9uIHdpbmRvdyBmb3IgdGhlIGZpbmFsIEZJTi4gICovCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKKwkJcmV0dXJuIDE7CisKKwlpbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOworCWN3bmQgPSB0cC0+c25kX2N3bmQ7CisJaWYgKGluX2ZsaWdodCA8IGN3bmQpCisJCXJldHVybiAoY3duZCAtIGluX2ZsaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBtdXN0IGJlIGludm9rZWQgdGhlIGZpcnN0IHRpbWUgd2UgY29uc2lkZXIgdHJhbnNtaXR0aW5nCisgKiBTS0Igb250byB0aGUgd2lyZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX2luaXRfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0c29fc2VncyA9IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwlpZiAoIXRzb19zZWdzKSB7CisJCXRjcF9zZXRfc2tiX3Rzb19zZWdzKHNrLCBza2IpOworCQl0c29fc2VncyA9IHRjcF9za2JfcGNvdW50KHNrYik7CisJfQorCXJldHVybiB0c29fc2VnczsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX21pbnNoYWxsX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIGFmdGVyKHRwLT5zbmRfc21sLHRwLT5zbmRfdW5hKSAmJgorCQkhYWZ0ZXIodHAtPnNuZF9zbWwsIHRwLT5zbmRfbnh0KTsKK30KKworLyogUmV0dXJuIDAsIGlmIHBhY2tldCBjYW4gYmUgc2VudCBub3cgd2l0aG91dCB2aW9sYXRpb24gTmFnbGUncyBydWxlczoKKyAqIDEuIEl0IGlzIGZ1bGwgc2l6ZWQuCisgKiAyLiBPciBpdCBjb250YWlucyBGSU4uIChhbHJlYWR5IGNoZWNrZWQgYnkgY2FsbGVyKQorICogMy4gT3IgVENQX05PREVMQVkgd2FzIHNldC4KKyAqIDQuIE9yIFRDUF9DT1JLIGlzIG5vdCBzZXQsIGFuZCBhbGwgc2VudCBwYWNrZXRzIGFyZSBBQ0tlZC4KKyAqICAgIFdpdGggTWluc2hhbGwncyBtb2RpZmljYXRpb246IGFsbCBzZW50IHNtYWxsIHBhY2tldHMgYXJlIEFDS2VkLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9uYWdsZV9jaGVjayhjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICB1bnNpZ25lZCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKK3sKKwlyZXR1cm4gKHNrYi0+bGVuIDwgbXNzX25vdyAmJgorCQkoKG5vbmFnbGUmVENQX05BR0xFX0NPUkspIHx8CisJCSAoIW5vbmFnbGUgJiYKKwkJICB0cC0+cGFja2V0c19vdXQgJiYKKwkJICB0Y3BfbWluc2hhbGxfY2hlY2sodHApKSkpOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIE5hZ2xlIHRlc3QgYWxsb3dzIHRoaXMgcGFja2V0IHRvIGJlCisgKiBzZW50IG5vdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX25hZ2xlX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQoreworCS8qIE5hZ2xlIHJ1bGUgZG9lcyBub3QgYXBwbHkgdG8gZnJhbWVzLCB3aGljaCBzaXQgaW4gdGhlIG1pZGRsZSBvZiB0aGUKKwkgKiB3cml0ZV9xdWV1ZSAodGhleSBoYXZlIG5vIGNoYW5jZXMgdG8gZ2V0IG5ldyBkYXRhKS4KKwkgKgorCSAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGNhbGxlcnMsIHdoZXJlIHRoZXkgbW9kaWZ5IHRoZSAnbm9uYWdsZScKKwkgKiBhcmd1bWVudCBiYXNlZCB1cG9uIHRoZSBsb2NhdGlvbiBvZiBTS0IgaW4gdGhlIHNlbmQgcXVldWUuCisJICovCisJaWYgKG5vbmFnbGUgJiBUQ1BfTkFHTEVfUFVTSCkKKwkJcmV0dXJuIDE7CisKKwkvKiBEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvciBmb3IgdGhlIGZpbmFsIEZJTikuICAqLworCWlmICh0cC0+dXJnX21vZGUgfHwKKwkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikpCisJCXJldHVybiAxOworCisJaWYgKCF0Y3BfbmFnbGVfY2hlY2sodHAsIHNrYiwgY3VyX21zcywgbm9uYWdsZSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERvZXMgYXQgbGVhc3QgdGhlIGZpcnN0IHNlZ21lbnQgb2YgU0tCIGZpdCBpbnRvIHRoZSBzZW5kIHdpbmRvdz8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zbmRfd25kX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGN1cl9tc3MpCit7CisJdTMyIGVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisKKwlpZiAoc2tiLT5sZW4gPiBjdXJfbXNzKQorCQllbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyBjdXJfbXNzOworCisJcmV0dXJuICFhZnRlcihlbmRfc2VxLCB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKTsKK30KKworLyogVGhpcyBjaGVja3MgaWYgdGhlIGRhdGEgYmVhcmluZyBwYWNrZXQgU0tCICh1c3VhbGx5IHNrLT5za19zZW5kX2hlYWQpCisgKiBzaG91bGQgYmUgcHV0IG9uIHRoZSB3aXJlIHJpZ2h0IG5vdy4gIElmIHNvLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAqIHBhY2tldHMgYWxsb3dlZCBieSB0aGUgY29uZ2VzdGlvbiB3aW5kb3cuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNwX3NuZF90ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXVuc2lnbmVkIGludCBjd25kX3F1b3RhOworCisJdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CisKKwlpZiAoIXRjcF9uYWdsZV90ZXN0KHRwLCBza2IsIGN1cl9tc3MsIG5vbmFnbGUpKQorCQlyZXR1cm4gMDsKKworCWN3bmRfcXVvdGEgPSB0Y3BfY3duZF90ZXN0KHRwLCBza2IpOworCWlmIChjd25kX3F1b3RhICYmCisJICAgICF0Y3Bfc25kX3duZF90ZXN0KHRwLCBza2IsIGN1cl9tc3MpKQorCQljd25kX3F1b3RhID0gMDsKKworCXJldHVybiBjd25kX3F1b3RhOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2tiX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCAKKwkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOworfQorCitpbnQgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisKKwlyZXR1cm4gKHNrYiAmJgorCQl0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwKKwkJCSAgICAgKHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSA/CisJCQkgICAgICBUQ1BfTkFHTEVfUFVTSCA6CisJCQkgICAgICB0cC0+bm9uYWdsZSkpKTsKK30KKworLyogVHJpbSBUU08gU0tCIHRvIExFTiBieXRlcywgcHV0IHRoZSByZW1haW5pbmcgZGF0YSBpbnRvIGEgbmV3IHBhY2tldAorICogd2hpY2ggaXMgcHV0IGFmdGVyIFNLQiBvbiB0aGUgbGlzdC4gIEl0IGlzIHZlcnkgbXVjaCBsaWtlCisgKiB0Y3BfZnJhZ21lbnQoKSBleGNlcHQgdGhhdCBpdCBtYXkgbWFrZSBzZXZlcmFsIGtpbmRzIG9mIGFzc3VtcHRpb25zCisgKiBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgc3BsaXR0aW5nIG9wZXJhdGlvbi4gIEluIHBhcnRpY3VsYXIsIHdlCisgKiBrbm93IHRoYXQgYWxsIHRoZSBkYXRhIGlzIGluIHNjYXR0ZXItZ2F0aGVyIHBhZ2VzLCBhbmQgdGhhdCB0aGUKKyAqIHBhY2tldCBoYXMgbmV2ZXIgYmVlbiBzZW50IG91dCBiZWZvcmUgKGFuZCB0aHVzIGlzIG5vdCBjbG9uZWQpLgorICovCitzdGF0aWMgaW50IHRzb19mcmFnbWVudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisJaW50IG5sZW4gPSBza2ItPmxlbiAtIGxlbjsKKwl1MTYgZmxhZ3M7CisKKwkvKiBBbGwgb2YgYSBUU08gZnJhbWUgbXVzdCBiZSBjb21wb3NlZCBvZiBwYWdlZCBkYXRhLiAgKi8KKwlCVUdfT04oc2tiLT5sZW4gIT0gc2tiLT5kYXRhX2xlbik7CisKKwlidWZmID0gc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc2ssIDAsIDAsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShidWZmID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1ZmYtPnRydWVzaXplID0gbmxlbjsKKwlza2ItPnRydWVzaXplIC09IG5sZW47CisKKwkvKiBDb3JyZWN0IHRoZSBzZXF1ZW5jZSBudW1iZXJzLiAqLworCVRDUF9TS0JfQ0IoYnVmZiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgbGVuOworCVRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihidWZmKS0+c2VxOworCisJLyogUFNIIGFuZCBGSU4gc2hvdWxkIG9ubHkgYmUgc2V0IGluIHRoZSBzZWNvbmQgcGFja2V0LiAqLworCWZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3MgJiB+KFRDUENCX0ZMQUdfRklOfFRDUENCX0ZMQUdfUFNIKTsKKwlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IGZsYWdzOworCisJLyogVGhpcyBwYWNrZXQgd2FzIG5ldmVyIHNlbnQgb3V0IHlldCwgc28gbm8gU0FDSyBiaXRzLiAqLworCVRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCA9IDA7CisKKwlidWZmLT5pcF9zdW1tZWQgPSBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCXNrYl9zcGxpdChza2IsIGJ1ZmYsIGxlbik7CisKKwkvKiBGaXggdXAgdHNvX2ZhY3RvciBmb3IgYm90aCBvcmlnaW5hbCBhbmQgbmV3IFNLQi4gICovCisJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYik7CisJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIGJ1ZmYpOworCisJLyogTGluayBCVUZGIGludG8gdGhlIHNlbmQgcXVldWUuICovCisJc2tiX2hlYWRlcl9yZWxlYXNlKGJ1ZmYpOworCV9fc2tiX2FwcGVuZChza2IsIGJ1ZmYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBkZWZlciBzZW5kaW5nLCBpZiBwb3NzaWJsZSwgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGFtb3VudAorICogb2YgVFNPIHNwbGl0dGluZyB3ZSBkby4gIFZpZXcgaXQgYXMgYSBraW5kIG9mIFRTTyBOYWdsZSB0ZXN0LgorICoKKyAqIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gSm9obiBIZWZmbmVyLgorICovCitzdGF0aWMgaW50IHRjcF90c29fc2hvdWxkX2RlZmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OworCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKKwkJcmV0dXJuIDA7CisKKwlpZiAodHAtPmNhX3N0YXRlICE9IFRDUF9DQV9PcGVuKQorCQlyZXR1cm4gMDsKKworCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CisKKwlCVUdfT04odGNwX3NrYl9wY291bnQoc2tiKSA8PSAxIHx8CisJICAgICAgICh0cC0+c25kX2N3bmQgPD0gaW5fZmxpZ2h0KSk7CisKKwlzZW5kX3dpbiA9ICh0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCisJLyogRnJvbSBpbl9mbGlnaHQgdGVzdCBhYm92ZSwgd2Uga25vdyB0aGF0IGN3bmQgPiBpbl9mbGlnaHQuICAqLworCWNvbmdfd2luID0gKHRwLT5zbmRfY3duZCAtIGluX2ZsaWdodCkgKiB0cC0+bXNzX2NhY2hlOworCisJbGltaXQgPSBtaW4oc2VuZF93aW4sIGNvbmdfd2luKTsKKworCS8qIElmIHNrX3NlbmRfaGVhZCBjYW4gYmUgc2VudCBmdWxseSBub3csIGp1c3QgZG8gaXQuICAqLworCWlmIChza2ItPmxlbiA8PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IpIHsKKwkJdTMyIGNodW5rID0gbWluKHRwLT5zbmRfd25kLCB0cC0+c25kX2N3bmQgKiB0cC0+bXNzX2NhY2hlKTsKKworCQkvKiBJZiBhdCBsZWFzdCBzb21lIGZyYWN0aW9uIG9mIGEgd2luZG93IGlzIGF2YWlsYWJsZSwKKwkJICoganVzdCB1c2UgaXQuCisJCSAqLworCQljaHVuayAvPSBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcjsKKwkJaWYgKGxpbWl0ID49IGNodW5rKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogRGlmZmVyZW50IGFwcHJvYWNoLCB0cnkgbm90IHRvIGRlZmVyIHBhc3QgYSBzaW5nbGUKKwkJICogQUNLLiAgUmVjZWl2ZXIgc2hvdWxkIEFDSyBldmVyeSBvdGhlciBmdWxsIHNpemVkCisJCSAqIGZyYW1lLCBzbyBpZiB3ZSBoYXZlIHNwYWNlIGZvciBtb3JlIHRoYW4gMyBmcmFtZXMKKwkJICogdGhlbiBzZW5kIG5vdy4KKwkJICovCisJCWlmIChsaW1pdCA+IHRjcF9tYXhfYnVyc3QodHApICogdHAtPm1zc19jYWNoZSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIE9rLCBpdCBsb29rcyBsaWtlIGl0IGlzIGFkdmlzYWJsZSB0byBkZWZlci4gICovCisJcmV0dXJuIDE7Cit9CisKIC8qIFRoaXMgcm91dGluZSB3cml0ZXMgcGFja2V0cyB0byB0aGUgbmV0d29yay4gIEl0IGFkdmFuY2VzIHRoZQogICogc2VuZF9oZWFkLiAgVGhpcyBoYXBwZW5zIGFzIGluY29taW5nIGFja3Mgb3BlbiB1cCB0aGUgcmVtb3RlCiAgKiB3aW5kb3cgZm9yIHVzLgpAQCAtNzI5LDU3ICs5NTgsMTU4IEBACiAgKiBSZXR1cm5zIDEsIGlmIG5vIHNlZ21lbnRzIGFyZSBpbiBmbGlnaHQgYW5kIHdlIGhhdmUgcXVldWVkIHNlZ21lbnRzLCBidXQKICAqIGNhbm5vdCBzZW5kIGFueXRoaW5nIG5vdyBiZWNhdXNlIG9mIFNXUyBvciBhbm90aGVyIHByb2JsZW0uCiAgKi8KLWludCB0Y3Bfd3JpdGVfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIGludCBub25hZ2xlKQorc3RhdGljIGludCB0Y3Bfd3JpdGVfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQl1bnNpZ25lZCBpbnQgbXNzX25vdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCB0c29fc2Vncywgc2VudF9wa3RzOworCWludCBjd25kX3F1b3RhOwogCiAJLyogSWYgd2UgYXJlIGNsb3NlZCwgdGhlIGJ5dGVzIHdpbGwgaGF2ZSB0byByZW1haW4gaGVyZS4KIAkgKiBJbiB0aW1lIGNsb3NlZG93biB3aWxsIGZpbmlzaCwgd2UgZW1wdHkgdGhlIHdyaXRlIHF1ZXVlIGFuZCBhbGwKIAkgKiB3aWxsIGJlIGhhcHB5LgogCSAqLwotCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCWludCBzZW50X3BrdHMgPSAwOworCWlmICh1bmxpa2VseShzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKSkKKwkJcmV0dXJuIDA7CiAKLQkJLyogQWNjb3VudCBmb3IgU0FDS1MsIHdlIG1heSBuZWVkIHRvIGZyYWdtZW50IGR1ZSB0byB0aGlzLgotCQkgKiBJdCBpcyBqdXN0IGxpa2UgdGhlIHJlYWwgTVNTIGNoYW5naW5nIG9uIHVzIG1pZHN0cmVhbS4KLQkJICogV2UgYWxzbyBoYW5kbGUgdGhpbmdzIGNvcnJlY3RseSB3aGVuIHRoZSB1c2VyIGFkZHMgc29tZQotCQkgKiBJUCBvcHRpb25zIG1pZC1zdHJlYW0uICBTaWxseSB0byBkbywgYnV0IGNvdmVyIGl0LgotCQkgKi8KLQkJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgMSk7CisJc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOwogCi0JCXdoaWxlICgoc2tiID0gc2stPnNrX3NlbmRfaGVhZCkgJiYKLQkJICAgICAgIHRjcF9zbmRfdGVzdChzaywgc2tiLCBtc3Nfbm93LAotCQkJICAgICAgIAkgICAgdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpID8gbm9uYWdsZSA6Ci0JCQkJICAgIAkJCSAgICAgICBUQ1BfTkFHTEVfUFVTSCkpIHsKLQkJCWlmIChza2ItPmxlbiA+IG1zc19ub3cpIHsKLQkJCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIG1zc19ub3cpKQorCXRzb19zZWdzID0gdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CisJY3duZF9xdW90YSA9IHRjcF9jd25kX3Rlc3QodHAsIHNrYik7CisJaWYgKHVubGlrZWx5KCFjd25kX3F1b3RhKSkKKwkJZ290byBvdXQ7CisKKwlzZW50X3BrdHMgPSAwOworCXdoaWxlIChsaWtlbHkodGNwX3NuZF93bmRfdGVzdCh0cCwgc2tiLCBtc3Nfbm93KSkpIHsKKwkJQlVHX09OKCF0c29fc2Vncyk7CisKKwkJaWYgKHRzb19zZWdzID09IDEpIHsKKwkJCWlmICh1bmxpa2VseSghdGNwX25hZ2xlX3Rlc3QodHAsIHNrYiwgbXNzX25vdywKKwkJCQkJCSAgICAgKHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSA/CisJCQkJCQkgICAgICBub25hZ2xlIDogVENQX05BR0xFX1BVU0gpKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAodGNwX3Rzb19zaG91bGRfZGVmZXIoc2ssIHRwLCBza2IpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRzb19zZWdzID4gMSkgeworCQkJdTMyIGxpbWl0ID0gdGNwX3dpbmRvd19hbGxvd3ModHAsIHNrYiwKKwkJCQkJCSAgICAgIG1zc19ub3csIGN3bmRfcXVvdGEpOworCisJCQlpZiAoc2tiLT5sZW4gPCBsaW1pdCkgeworCQkJCXVuc2lnbmVkIGludCB0cmltID0gc2tiLT5sZW4gJSBtc3Nfbm93OworCisJCQkJaWYgKHRyaW0pCisJCQkJCWxpbWl0ID0gc2tiLT5sZW4gLSB0cmltOworCQkJfQorCQkJaWYgKHNrYi0+bGVuID4gbGltaXQpIHsKKwkJCQlpZiAodHNvX2ZyYWdtZW50KHNrLCBza2IsIGxpbWl0KSkKIAkJCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwotCQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOwotCQkJaWYgKHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSkKKwkJfSBlbHNlIGlmICh1bmxpa2VseShza2ItPmxlbiA+IG1zc19ub3cpKSB7CisJCQlpZiAodW5saWtlbHkodGNwX2ZyYWdtZW50KHNrLCBza2IsICBtc3Nfbm93KSkpCiAJCQkJYnJlYWs7Ci0KLQkJCS8qIEFkdmFuY2UgdGhlIHNlbmRfaGVhZC4gIFRoaXMgb25lIGlzIHNlbnQgb3V0LgotCQkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgotCQkJICovCi0JCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCB0cCwgc2tiKTsKLQotCQkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKLQkJCXNlbnRfcGt0cyA9IDE7CiAJCX0KIAotCQlpZiAoc2VudF9wa3RzKSB7Ci0JCQl0Y3BfY3duZF92YWxpZGF0ZShzaywgdHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CiAKLQkJcmV0dXJuICF0cC0+cGFja2V0c19vdXQgJiYgc2stPnNrX3NlbmRfaGVhZDsKKwkJaWYgKHVubGlrZWx5KHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSkpCisJCQlicmVhazsKKworCQkvKiBBZHZhbmNlIHRoZSBzZW5kX2hlYWQuICBUaGlzIG9uZSBpcyBzZW50IG91dC4KKwkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgorCQkgKi8KKwkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisKKwkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKKwkJc2VudF9wa3RzKys7CisKKwkJLyogRG8gbm90IG9wdGltaXplIHRoaXMgdG8gdXNlIHRzb19zZWdzLiBJZiB3ZSBjaG9wcGVkIHVwCisJCSAqIHRoZSBwYWNrZXQgYWJvdmUsIHRzb19zZWdzIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkLgorCQkgKi8KKwkJY3duZF9xdW90YSAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCisJCUJVR19PTihjd25kX3F1b3RhIDwgMCk7CisJCWlmICghY3duZF9xdW90YSkKKwkJCWJyZWFrOworCisJCXNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCXRzb19zZWdzID0gdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CiAJfQotCXJldHVybiAwOworCisJaWYgKGxpa2VseShzZW50X3BrdHMpKSB7CisJCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7CisJCXJldHVybiAwOworCX0KK291dDoKKwlyZXR1cm4gIXRwLT5wYWNrZXRzX291dCAmJiBzay0+c2tfc2VuZF9oZWFkOworfQorCisvKiBQdXNoIG91dCBhbnkgcGVuZGluZyBmcmFtZXMgd2hpY2ggd2VyZSBoZWxkIGJhY2sgZHVlIHRvCisgKiBUQ1BfQ09SSyBvciBhdHRlbXB0IGF0IGNvYWxlc2NpbmcgdGlueSBwYWNrZXRzLgorICogVGhlIHNvY2tldCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLgorICovCit2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjdXJfbXNzLCBpbnQgbm9uYWdsZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKworCWlmIChza2IpIHsKKwkJaWYgKHRjcF93cml0ZV94bWl0KHNrLCBjdXJfbXNzLCBub25hZ2xlKSkKKwkJCXRjcF9jaGVja19wcm9iZV90aW1lcihzaywgdHApOworCX0KK30KKworLyogU2VuZCBfc2luZ2xlXyBza2Igc2l0dGluZyBhdCB0aGUgc2VuZCBoZWFkLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzCisgKiB0cnVlIHB1c2ggcGVuZGluZyBmcmFtZXMgdG8gc2V0dXAgcHJvYmUgdGltZXIgZXRjLgorICovCit2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCXVuc2lnbmVkIGludCB0c29fc2VncywgY3duZF9xdW90YTsKKworCUJVR19PTighc2tiIHx8IHNrYi0+bGVuIDwgbXNzX25vdyk7CisKKwl0c29fc2VncyA9IHRjcF9pbml0X3Rzb19zZWdzKHNrLCBza2IpOworCWN3bmRfcXVvdGEgPSB0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCisJaWYgKGxpa2VseShjd25kX3F1b3RhKSkgeworCQlCVUdfT04oIXRzb19zZWdzKTsKKworCQlpZiAodHNvX3NlZ3MgPiAxKSB7CisJCQl1MzIgbGltaXQgPSB0Y3Bfd2luZG93X2FsbG93cyh0cCwgc2tiLAorCQkJCQkJICAgICAgbXNzX25vdywgY3duZF9xdW90YSk7CisKKwkJCWlmIChza2ItPmxlbiA8IGxpbWl0KSB7CisJCQkJdW5zaWduZWQgaW50IHRyaW0gPSBza2ItPmxlbiAlIG1zc19ub3c7CisKKwkJCQlpZiAodHJpbSkKKwkJCQkJbGltaXQgPSBza2ItPmxlbiAtIHRyaW07CisJCQl9CisJCQlpZiAoc2tiLT5sZW4gPiBsaW1pdCkgeworCQkJCWlmICh1bmxpa2VseSh0c29fZnJhZ21lbnQoc2ssIHNrYiwgbGltaXQpKSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gbXNzX25vdykpIHsKKwkJCWlmICh1bmxpa2VseSh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgbXNzX25vdykpKQorCQkJCXJldHVybjsKKwkJfQorCisJCS8qIFNlbmQgaXQgb3V0IG5vdy4gKi8KKwkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CisKKwkJaWYgKGxpa2VseSghdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgc2stPnNrX2FsbG9jYXRpb24pKSkpIHsKKwkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOworCQkJdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgdGhhdCB3ZSBjYW4gcmFpc2UgdGhlCkBAIC0xMDM5LDcgKzEzNjksNiBAQAogCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgewogCQkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOwogCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOwotCQkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGVfc3RkOwogCQl9CiAKIAkJaWYgKHRjcF90cmltX2hlYWQoc2ssIHNrYiwgdHAtPnNuZF91bmEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSkpCkBAIC0xMTAxLDcgKzE0MzAsNiBAQAogCSAqIGlzIHN0aWxsIGluIHNvbWVib2R5J3MgaGFuZHMsIGVsc2UgbWFrZSBhIGNsb25lLgogCSAqLwogCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwotCXRjcF90c29fc2V0X3B1c2goc2tiKTsKIAogCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIChza2JfY2xvbmVkKHNrYikgPwogCQkJCSAgICBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKToKQEAgLTEyODUsNyArMTYxMyw3IEBACiAgKiB3YXMgdW5yZWFkIGRhdGEgaW4gdGhlIHJlY2VpdmUgcXVldWUuICBUaGlzIGJlaGF2aW9yIGlzIHJlY29tbWVuZGVkCiAgKiBieSBkcmFmdC1pZXRmLXRjcGltcGwtcHJvYi0wMy50eHQgc2VjdGlvbiAzLjEwLiAgLURhdmVNCiAgKi8KLXZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgaW50IHByaW9yaXR5KQordm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE2NzAsMTQgKzE5OTgsMTIgQEAKIAkJCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgewogCQkJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7CiAJCQkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKLQkJCQkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGVfc3RkOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoIXRjcF9za2JfcGNvdW50KHNrYikpCiAJCQkJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYik7CiAKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19QU0g7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKLQkJCXRjcF90c29fc2V0X3B1c2goc2tiKTsKIAkJCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKTsKIAkJCWlmICghZXJyKSB7CiAJCQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IGIxMjdiNDQuLjAwODQyMjcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC0yMzEsMTEgKzIzMSwxMCBAQAogCX0KIAl0cC0+YWNrLnBlbmRpbmcgJj0gflRDUF9BQ0tfVElNRVI7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAKLQkJTkVUX0FERF9TVEFUU19CSChMSU5VWF9NSUJfVENQU0NIRURVTEVSRkFJTEVELCAKLQkJCQkgc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSk7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFNDSEVEVUxFUkZBSUxFRCk7CiAKIAkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0cC0+dWNvcHkucHJlcXVldWUpKSAhPSBOVUxMKQogCQkJc2stPnNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfdHVubmVsLmMgYi9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYwppbmRleCBlMWZlMzYwLi5hZmJiMGQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYworKysgYi9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYwpAQCAtNzgsMTAgKzc4LDkgQEAKIHN0YXRpYyB2b2lkIGlwaXBfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQogewogCXN0cnVjdCB4ZnJtX3R1bm5lbCAqaGFuZGxlciA9IGlwaXBfaGFuZGxlcjsKLQl1MzIgYXJnID0gaW5mbzsKIAogCWlmIChoYW5kbGVyKQotCQloYW5kbGVyLT5lcnJfaGFuZGxlcihza2IsICZhcmcpOworCQloYW5kbGVyLT5lcnJfaGFuZGxlcihza2IsIGluZm8pOwogfQogCiBzdGF0aWMgaW50IGlwaXBfaW5pdF9zdGF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L0tjb25maWcgYi9uZXQvaXB2Ni9LY29uZmlnCmluZGV4IGU2NmNhOTMuLmFiN2E5MTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L0tjb25maWcKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtMSw2ICsxLDI2IEBACiAjCiAjIElQdjYgY29uZmlndXJhdGlvbgotIyAKKyMKKworIyAgIElQdjYgYXMgbW9kdWxlIHdpbGwgY2F1c2UgYSBDUkFTSCBpZiB5b3UgdHJ5IHRvIHVubG9hZCBpdAorY29uZmlnIElQVjYKKwl0cmlzdGF0ZSAiVGhlIElQdjYgcHJvdG9jb2wiCisJZGVmYXVsdCBtCisJc2VsZWN0IENSWVBUTyBpZiBJUFY2X1BSSVZBQ1kKKwlzZWxlY3QgQ1JZUFRPX01ENSBpZiBJUFY2X1BSSVZBQ1kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGNvbXBsZW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgSVAgdmVyc2lvbiA2LgorCSAgWW91IHdpbGwgc3RpbGwgYmUgYWJsZSB0byBkbyB0cmFkaXRpb25hbCBJUHY0IG5ldHdvcmtpbmcgYXMgd2VsbC4KKworCSAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgSVB2Niwgc2VlCisJICA8aHR0cDovL3BsYXlncm91bmQuc3VuLmNvbS9wdWIvaXBuZy9odG1sL2lwbmctbWFpbi5odG1sPi4KKwkgIEZvciBMaW51eCBJUHY2IGRldmVsb3BtZW50IGluZm9ybWF0aW9uLCBzZWUgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+LgorCSAgRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IElQdjYgdW5kZXIgTGludXgsIHJlYWQgdGhlIEhPV1RPIGF0CisJICA8aHR0cDovL3d3dy5iaWVyaW5nZXIuZGUvbGludXgvSVB2Ni8+LgorCisJICBUbyBjb21waWxlIHRoaXMgcHJvdG9jb2wgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIAorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwdjYuCisKIGNvbmZpZyBJUFY2X1BSSVZBQ1kKIAlib29sICJJUHY2OiBQcml2YWN5IEV4dGVuc2lvbnMgKFJGQyAzMDQxKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBWNgpAQCAtNzEsNyArOTEsNiBAQAogY29uZmlnIElQVjZfVFVOTkVMCiAJdHJpc3RhdGUgIklQdjY6IElQdjYtaW4tSVB2NiB0dW5uZWwiCiAJZGVwZW5kcyBvbiBJUFY2Ci0Jc2VsZWN0IElORVQ2X1RVTk5FTAogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIElQdjYtaW4tSVB2NiB0dW5uZWxzIGRlc2NyaWJlZCBpbiBSRkMgMjQ3My4KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYTU0ZDRlZi4uNzcwMDRiOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0yNzc3LDcgKzI3NzcsNyBAQAogCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBVTklDQVNUX0FERFI6Ci0JCQkvKiB1bmljYXN0IGFkZHJlc3MgKi8KKwkJCS8qIHVuaWNhc3QgYWRkcmVzcyBpbmNsLiB0ZW1wIGFkZHIgKi8KIAkJCWZvciAoaWZhID0gaWRldi0+YWRkcl9saXN0OyBpZmE7CiAJCQkgICAgIGlmYSA9IGlmYS0+aWZfbmV4dCwgaXBfaWR4KyspIHsKIAkJCQlpZiAoaXBfaWR4IDwgc19pcF9pZHgpCkBAIC0yNzg4LDE5ICsyNzg4LDYgQEAKIAkJCQkgICAgTkxNX0ZfTVVMVEkpKSA8PSAwKQogCQkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQkvKiB0ZW1wIGFkZHIgKi8KLSNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCi0JCQlmb3IgKGlmYSA9IGlkZXYtPnRlbXBhZGRyX2xpc3Q7IGlmYTsgCi0JCQkgICAgIGlmYSA9IGlmYS0+dG1wX25leHQsIGlwX2lkeCsrKSB7Ci0JCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoKGVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCAKLQkJCQkgICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIAotCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSLAotCQkJCSAgICBOTE1fRl9NVUxUSSkpIDw9IDApIAotCQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIE1VTFRJQ0FTVF9BRERSOgogCQkJLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KQEAgLTI5MjMsNiArMjkxMCw3IEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnIpLCBmbGFncyk7CiAJciA9IE5MTVNHX0RBVEEobmxoKTsKIAlyLT5pZmlfZmFtaWx5ID0gQUZfSU5FVDY7CisJci0+X19pZmlfcGFkID0gMDsKIAlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKIAlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwpAQCAtMzAzMCw5ICszMDE4LDEyIEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnBtc2cpLCBmbGFncyk7CiAJcG1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CisJcG1zZy0+cHJlZml4X3BhZDEgPSAwOworCXBtc2ctPnByZWZpeF9wYWQyID0gMDsKIAlwbXNnLT5wcmVmaXhfaWZpbmRleCA9IGlkZXYtPmRldi0+aWZpbmRleDsKIAlwbXNnLT5wcmVmaXhfbGVuID0gcGluZm8tPnByZWZpeF9sZW47CiAJcG1zZy0+cHJlZml4X3R5cGUgPSBwaW5mby0+dHlwZTsKKwlwbXNnLT5wcmVmaXhfcGFkMyA9IDA7CiAJCiAJcG1zZy0+cHJlZml4X2ZsYWdzID0gMDsKIAlpZiAocGluZm8tPm9ubGluaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IDJiMTkzZTMuLjI4ZDliY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtNzc0LDcgKzc3NCw2IEBACiAJaWYgKGlmNl9wcm9jX2luaXQoKSkKIAkJZ290byBwcm9jX2lmNl9mYWlsOwogI2VuZGlmCi0JaXB2Nl9wYWNrZXRfaW5pdCgpOwogCWlwNl9yb3V0ZV9pbml0KCk7CiAJaXA2X2Zsb3dsYWJlbF9pbml0KCk7CiAJZXJyID0gYWRkcmNvbmZfaW5pdCgpOwpAQCAtNzkxLDYgKzc5MCw4IEBACiAJLyogSW5pdCB2NiB0cmFuc3BvcnQgcHJvdG9jb2xzLiAqLwogCXVkcHY2X2luaXQoKTsKIAl0Y3B2Nl9pbml0KCk7CisKKwlpcHY2X3BhY2tldF9pbml0KCk7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtNzk4LDcgKzc5OSw2IEBACiBhZGRyY29uZl9mYWlsOgogCWlwNl9mbG93bGFiZWxfY2xlYW51cCgpOwogCWlwNl9yb3V0ZV9jbGVhbnVwKCk7Ci0JaXB2Nl9wYWNrZXRfY2xlYW51cCgpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWY2X3Byb2NfZXhpdCgpOwogcHJvY19pZjZfZmFpbDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCAwZTVmNzQ5Li5iNmM3M2RhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC0yNDQsNyArMjQ0LDYgQEAKIAkJb3B0X3NwYWNlLT5vcHRfbmZsZW4gPSAwOwogCX0KIAlvcHRfc3BhY2UtPmRzdDFvcHQgPSBmb3B0LT5kc3Qxb3B0OwotCW9wdF9zcGFjZS0+YXV0aCA9IGZvcHQtPmF1dGg7CiAJb3B0X3NwYWNlLT5vcHRfZmxlbiA9IGZvcHQtPm9wdF9mbGVuOwogCXJldHVybiBvcHRfc3BhY2U7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMDZlN2NkYWUuLjFmMmMyZjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTQ2NSw3ICs0NjUsNiBAQAogCXRvLT5wa3RfdHlwZSA9IGZyb20tPnBrdF90eXBlOwogCXRvLT5wcmlvcml0eSA9IGZyb20tPnByaW9yaXR5OwogCXRvLT5wcm90b2NvbCA9IGZyb20tPnByb3RvY29sOwotCXRvLT5zZWN1cml0eSA9IGZyb20tPnNlY3VyaXR5OwogCWRzdF9yZWxlYXNlKHRvLT5kc3QpOwogCXRvLT5kc3QgPSBkc3RfY2xvbmUoZnJvbS0+ZHN0KTsKIAl0by0+ZGV2ID0gZnJvbS0+ZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IGJhM2IwYzIuLjA5NjEzNzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTExMTAsMTEgKzExMTAsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19JTkVUNl9UVU5ORUwKIHN0YXRpYyBzdHJ1Y3QgeGZybTZfdHVubmVsIGlwNmlwNl9oYW5kbGVyID0gewotCS5oYW5kbGVyID0gaXA2aXA2X3JjdiwKLQkuZXJyX2hhbmRsZXIgPSBpcDZpcDZfZXJyLAorCS5oYW5kbGVyCT0gaXA2aXA2X3JjdiwKKwkuZXJyX2hhbmRsZXIJPSBpcDZpcDZfZXJyLAogfTsKIAorc3RhdGljIGlubGluZSBpbnQgaXA2aXA2X3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHhmcm02X3R1bm5lbF9yZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcDZpcDZfdW5yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiB4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIpOworfQorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgeGZybTZfdHVubmVsX3Byb3RvY29sID0geworCS5oYW5kbGVyCT0gaXA2aXA2X3JjdiwKKwkuZXJyX2hhbmRsZXIJPSBpcDZpcDZfZXJyLAorCS5mbGFncwkJPSBJTkVUNl9QUk9UT19OT1BPTElDWXxJTkVUNl9QUk9UT19GSU5BTCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwNmlwNl9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBpbmV0Nl9hZGRfcHJvdG9jb2woJnhmcm02X3R1bm5lbF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXA2aXA2X3VucmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaW5ldDZfZGVsX3Byb3RvY29sKCZ4ZnJtNl90dW5uZWxfcHJvdG9jb2wsIElQUFJPVE9fSVBWNik7Cit9CisjZW5kaWYKKwogLyoqCiAgKiBpcDZfdHVubmVsX2luaXQgLSByZWdpc3RlciBwcm90b2NvbCBhbmQgcmVzZXJ2ZSBuZWVkZWQgcmVzb3VyY2VzCiAgKgpAQCAtMTEyNSw3ICsxMTUzLDcgQEAKIHsKIAlpbnQgIGVycjsKIAotCWlmICh4ZnJtNl90dW5uZWxfcmVnaXN0ZXIoJmlwNmlwNl9oYW5kbGVyKSA8IDApIHsKKwlpZiAoaXA2aXA2X3JlZ2lzdGVyKCkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXA2aXA2IGluaXQ6IGNhbid0IHJlZ2lzdGVyIHR1bm5lbFxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTExNDQsNyArMTE3Miw3IEBACiAJfQogCXJldHVybiAwOwogZmFpbDoKLQl4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIpOworCWlwNmlwNl91bnJlZ2lzdGVyKCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTE1NCw3ICsxMTgyLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlwNl90dW5uZWxfY2xlYW51cCh2b2lkKQogewotCWlmICh4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIpIDwgMCkKKwlpZiAoaXA2aXA2X3VucmVnaXN0ZXIoKSA8IDApCiAJCXByaW50ayhLRVJOX0lORk8gImlwNmlwNiBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciB0dW5uZWxcbiIpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYoaXA2aXA2X2ZiX3RubF9kZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKaW5kZXggNTYyZmNkMS4uMjlmZWQ2ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWNhc3QuYworKysgYi9uZXQvaXB2Ni9tY2FzdC5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZpcHY2X3NrX21jX2xvY2spOwogCi0JcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogfQogCiBzdGF0aWMgc3RydWN0IGluZXQ2X2RldiAqaXA2X21jX2ZpbmRfZGV2KHN0cnVjdCBpbjZfYWRkciAqZ3JvdXAsIGludCBpZmluZGV4KQpAQCAtMzg2LDEyICszODYsMTYgQEAKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmcG1jLT5hZGRyLCBncm91cCkpCiAJCQlicmVhazsKIAl9Ci0JaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJaWYgKCFwbWMpIHsJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAkvKiBpZiBhIHNvdXJjZSBmaWx0ZXIgd2FzIHNldCwgbXVzdCBiZSB0aGUgc2FtZSBtb2RlIGFzIGJlZm9yZSAqLwogCWlmIChwbWMtPnNmbGlzdCkgewotCQlpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpCisJCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkgeworCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCX0gZWxzZSBpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpIHsKIAkJLyogYWxsb3cgbW9kZSBzd2l0Y2hlcyBmb3IgZW1wdHktc2V0IGZpbHRlcnMgKi8KIAkJaXA2X21jX2FkZF9zcmMoaWRldiwgZ3JvdXAsIG9tb2RlLCAwLCBOVUxMLCAwKTsKQEAgLTQwMiw3ICs0MDYsNyBAQAogCXBzbCA9IHBtYy0+c2ZsaXN0OwogCWlmICghYWRkKSB7CiAJCWlmICghcHNsKQotCQkJZ290byBkb25lOworCQkJZ290byBkb25lOwkvKiBlcnIgPSAtRUFERFJOT1RBVkFJTCAqLwogCQlydiA9ICEwOwogCQlmb3IgKGk9MDsgaTxwc2wtPnNsX2NvdW50OyBpKyspIHsKIAkJCXJ2ID0gbWVtY21wKCZwc2wtPnNsX2FkZHJbaV0sIHNvdXJjZSwKQEAgLTQxMSw3ICs0MTUsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChydikJCS8qIHNvdXJjZSBub3QgZm91bmQgKi8KLQkJCWdvdG8gZG9uZTsKKwkJCWdvdG8gZG9uZTsJLyogZXJyID0gLUVBRERSTk9UQVZBSUwgKi8KIAogCQkvKiBzcGVjaWFsIGNhc2UgLSAoSU5DTFVERSwgZW1wdHkpID09IExFQVZFX0dST1VQICovCiAJCWlmIChwc2wtPnNsX2NvdW50ID09IDEgJiYgb21vZGUgPT0gTUNBU1RfSU5DTFVERSkgewpAQCAtNDg4LDYgKzQ5Miw3IEBACiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqaW5ldDYgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGlwNl9zZl9zb2NrbGlzdCAqbmV3cHNsLCAqcHNsOworCWludCBsZWF2ZWdyb3VwID0gMDsKIAlpbnQgaSwgZXJyOwogCiAJZ3JvdXAgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmdzZi0+Z2ZfZ3JvdXApLT5zaW42X2FkZHI7CkBAIC01MDMsNyArNTA4LDEyIEBACiAJaWYgKCFpZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAlkZXYgPSBpZGV2LT5kZXY7Ci0JZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwllcnIgPSAwOworCWlmIChnc2YtPmdmX2Ztb2RlID09IE1DQVNUX0lOQ0xVREUgJiYgZ3NmLT5nZl9udW1zcmMgPT0gMCkgeworCQlsZWF2ZWdyb3VwID0gMTsKKwkJZ290byBkb25lOworCX0KIAogCWZvciAocG1jPWluZXQ2LT5pcHY2X21jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgewogCQlpZiAocG1jLT5pZmluZGV4ICE9IGdzZi0+Z2ZfaW50ZXJmYWNlKQpAQCAtNTExLDggKzUyMSwxMCBAQAogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZwbWMtPmFkZHIsIGdyb3VwKSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwlpZiAoIXBtYykgewkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CisJfQogCWlmIChnc2YtPmdmX251bXNyYykgewogCQluZXdwc2wgPSAoc3RydWN0IGlwNl9zZl9zb2NrbGlzdCAqKXNvY2tfa21hbGxvYyhzaywKIAkJCQlJUDZfU0ZMU0laRShnc2YtPmdmX251bXNyYyksIEdGUF9BVE9NSUMpOwpAQCAtNTQ0LDEwICs1NTYsMTMgQEAKIAkJKHZvaWQpIGlwNl9tY19kZWxfc3JjKGlkZXYsIGdyb3VwLCBwbWMtPnNmbW9kZSwgMCwgTlVMTCwgMCk7CiAJcG1jLT5zZmxpc3QgPSBuZXdwc2w7CiAJcG1jLT5zZm1vZGUgPSBnc2YtPmdmX2Ztb2RlOworCWVyciA9IDA7CiBkb25lOgogCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAlpbjZfZGV2X3B1dChpZGV2KTsKIAlkZXZfcHV0KGRldik7CisJaWYgKGxlYXZlZ3JvdXApCisJCWVyciA9IGlwdjZfc29ja19tY19kcm9wKHNrLCBnc2YtPmdmX2ludGVyZmFjZSwgZ3JvdXApOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwppbmRleCA3NTA5NDNlLi41NDkzMTgwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCkBAIC03Niw3ICs3Niw5IEBACiBzdGF0aWMgdm9pZAogaXBxX2lzc3VlX3ZlcmRpY3Qoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnksIGludCB2ZXJkaWN0KQogeworCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAluZl9yZWluamVjdChlbnRyeS0+c2tiLCBlbnRyeS0+aW5mbywgdmVyZGljdCk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CiAJa2ZyZWUoZW50cnkpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCmluZGV4IGM0NDY4NWUuLmE2OTJlMjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCkBAIC0zNzMsOSArMzczLDEwIEBACiAJCWluID8gaW4tPm5hbWUgOiAiIiwKIAkJb3V0ID8gb3V0LT5uYW1lIDogIiIpOwogCWlmIChpbiAmJiAhb3V0KSB7CisJCXVuc2lnbmVkIGludCBsZW47CiAJCS8qIE1BQyBsb2dnaW5nIGZvciBpbnB1dCBjaGFpbiBvbmx5LiAqLwogCQlwcmludGsoIk1BQz0iKTsKLQkJaWYgKHNrYi0+ZGV2ICYmIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gJiYKKwkJaWYgKHNrYi0+ZGV2ICYmIChsZW4gPSBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuKSAmJgogCQkgICAgc2tiLT5tYWMucmF3ICE9IHNrYi0+bmgucmF3KSB7CiAJCQl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OwogCQkJaW50IGk7CkBAIC0zODQsOSArMzg1LDExIEBACiAJCQkgICAgKHAgLT0gRVRIX0hMRU4pIDwgc2tiLT5oZWFkKQogCQkJCXAgPSBOVUxMOwogCi0JCQlpZiAocCAhPSBOVUxMKQotCQkJCWZvciAoaSA9IDA7IGkgPCBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKyspCi0JCQkJCXByaW50aygiJTAyeCIsIHBbaV0pOworCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQkJcHJpbnRrKCIlMDJ4JXMiLCBwW2ldLAorCQkJCQkgICAgICAgaSA9PSBsZW4gLSAxID8gIiIgOiAiOiIpOworCQkJfQogCQkJcHJpbnRrKCIgIik7CiAKIAkJCWlmIChza2ItPmRldi0+dHlwZSA9PSBBUlBIUkRfU0lUKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCA5ZGFjN2ZkLi5mNmUyODhkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTIwMTgsNyArMjAxOCw3IEBACiAJICovCiAJdHAtPnNuZF9zc3RocmVzaCA9IDB4N2ZmZmZmZmY7CiAJdHAtPnNuZF9jd25kX2NsYW1wID0gfjA7Ci0JdHAtPm1zc19jYWNoZV9zdGQgPSB0cC0+bXNzX2NhY2hlID0gNTM2OworCXRwLT5tc3NfY2FjaGUgPSA1MzY7CiAKIAl0cC0+cmVvcmRlcmluZyA9IHN5c2N0bF90Y3BfcmVvcmRlcmluZzsKIApkaWZmIC0tZ2l0IGEvbmV0L2lweC9LY29uZmlnIGIvbmV0L2lweC9LY29uZmlnCmluZGV4IGExNjIzN2MuLjk4MGE4MjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvS2NvbmZpZworKysgYi9uZXQvaXB4L0tjb25maWcKQEAgLTEsNiArMSwzOSBAQAogIwogIyBJUFggY29uZmlndXJhdGlvbgogIworY29uZmlnIElQWAorCXRyaXN0YXRlICJUaGUgSVBYIHByb3RvY29sIgorCXNlbGVjdCBMTEMKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBOb3ZlbGwgbmV0d29ya2luZyBwcm90b2NvbCwgSVBYLCBjb21tb25seQorCSAgdXNlZCBmb3IgbG9jYWwgbmV0d29ya3Mgb2YgV2luZG93cyBtYWNoaW5lcy4gIFlvdSBuZWVkIGl0IGlmIHlvdQorCSAgd2FudCB0byBhY2Nlc3MgTm92ZWxsIE5ldFdhcmUgZmlsZSBvciBwcmludCBzZXJ2ZXJzIHVzaW5nIHRoZSBMaW51eAorCSAgTm92ZWxsIGNsaWVudCBuY3BmcyAoYXZhaWxhYmxlIGZyb20KKwkgIDxmdHA6Ly9wbGF0YW4udmMuY3Z1dC5jei9wdWIvbGludXgvbmNwZnMvPikgb3IgZnJvbQorCSAgd2l0aGluIHRoZSBMaW51eCBET1MgZW11bGF0b3IgRE9TRU1VIChyZWFkIHRoZSBET1NFTVUtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+KS4gIEluIG9yZGVyCisJICB0byBkbyB0aGUgZm9ybWVyLCB5b3UnbGwgYWxzbyBoYXZlIHRvIHNheSBZIHRvICJOQ1AgZmlsZSBzeXN0ZW0KKwkgIHN1cHBvcnQiLCBiZWxvdy4KKworCSAgSVBYIGlzIHNpbWlsYXIgaW4gc2NvcGUgdG8gSVAsIHdoaWxlIFNQWCwgd2hpY2ggcnVucyBvbiB0b3Agb2YgSVBYLAorCSAgaXMgc2ltaWxhciB0byBUQ1AuIFRoZXJlIGlzIGFsc28gZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFNQWCBpbgorCSAgTGludXggKHNlZSAiU1BYIG5ldHdvcmtpbmciLCBiZWxvdykuCisKKwkgIFRvIHR1cm4geW91ciBMaW51eCBib3ggaW50byBhIGZ1bGx5IGZlYXR1cmVkIE5ldFdhcmUgZmlsZSBzZXJ2ZXIgYW5kCisJICBJUFggcm91dGVyLCBzYXkgWSBoZXJlIGFuZCBmZXRjaCBlaXRoZXIgbHdhcmVkIGZyb20KKwkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL25ldHdvcmsvZGFlbW9ucy8+IG9yCisJICBtYXJzX253ZSBmcm9tIDxmdHA6Ly93d3cuY29tcHUtYXJ0LmRlL21hcnNfbndlLz4uIEZvciBtb3JlCisJICBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgSVBYLUhPV1RPIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25uZWN0IExpbnV4LCBXaW5kb3dzIG1hY2hpbmVzIGFuZAorCSAgTWFjcyBpcyBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmVhdHMuY29tL2xpbnV4X21hY193aW4uaHRtbD4uCisKKwkgIFRoZSBJUFggZHJpdmVyIHdvdWxkIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTYgS0IuIFRvIGNvbXBpbGUKKwkgIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlweC4KKwkgIFVubGVzcyB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgeW91ciBMaW51eCBib3ggd2l0aCBhIGxvY2FsIE5vdmVsbAorCSAgbmV0d29yaywgc2F5IE4uCisKIGNvbmZpZyBJUFhfSU5URVJOCiAJYm9vbCAiSVBYOiBGdWxsIGludGVybmFsIElQWCBuZXR3b3JrIgogCWRlcGVuZHMgb24gSVBYCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcC5jIGIvbmV0L2lyZGEvaXJsYXAuYwppbmRleCAwNDZhZDA3Li43MDI5NjE4IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcC5jCisrKyBiL25ldC9pcmRhL2lybGFwLmMKQEAgLTQ0NSw5ICs0NDUsOCBAQAogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CiAKIAkvKiBEb24ndCBkaXNjb25uZWN0IHVudGlsIGFsbCBkYXRhIGZyYW1lcyBhcmUgc3VjY2Vzc2Z1bGx5IHNlbnQgKi8KLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSkgewogCQlzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcgPSBUUlVFOwotCiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFwX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCmluZGV4IDFjZDg5ZjUuLmE1MDViNTQgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKKysrIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJICogU2VuZCBvdXQgdGhlIFJSIGZyYW1lcyBmYXN0ZXIgaWYgb3VyIG93biB0cmFuc21pdCBxdWV1ZSBpcyBlbXB0eSwgb3IKIAkgKiBpZiB0aGUgcGVlciBpcyBidXN5LiBUaGUgZWZmZWN0IGlzIGEgbXVjaCBmYXN0ZXIgY29udmVyc2F0aW9uCiAJICovCi0JaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID09IDApIHx8IChzZWxmLT5yZW1vdGVfYnVzeSkpIHsKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpIHx8IHNlbGYtPnJlbW90ZV9idXN5KSB7CiAJCWlmIChzZWxmLT5mYXN0X1JSID09IFRSVUUpIHsKIAkJCS8qCiAJCQkgKiAgQXNzZXJ0IHRoYXQgdGhlIGZhc3QgcG9sbCB0aW1lciBoYXMgbm90IHJlYWNoZWQgdGhlCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJSVJEQV9ERUJVRygyLCAiJXMoKSA6IHF1ZXVlIGxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCQkgICBza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpKTsKIAotCQlpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSkgeworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSkgewogCQkJLyogUHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBpcmxhcF9kYXRhX3JlcXVlc3QoKSAqLwogCQkJc2VsZi0+bG9jYWxfYnVzeSA9IFRSVUU7CiAKQEAgLTEwNzQsNyArMTA3NCw3IEBACiAjZWxzZQkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyogV2luZG93IGhhcyBiZWVuIGFkanVzdGVkIGZvciB0aGUgbWF4IHBhY2tldAogCQkJICogc2l6ZSwgc28gbXVjaCBzaW1wbGVyLi4uIC0gSmVhbiBJSSAqLwotCQkJbmV4dGZpdCA9IChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCk7CisJCQluZXh0Zml0ID0gIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKTsKICNlbmRpZgkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyoKIAkJCSAqICBTZW5kIGRhdGEgd2l0aCBwb2xsIGJpdCBjbGVhcmVkIG9ubHkgaWYgd2luZG93ID4gMQpAQCAtMTgxNCw3ICsxODE0LDcgQEAKICNlbHNlCS8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCiAJCQkvKiBXaW5kb3cgaGFzIGJlZW4gYWRqdXN0ZWQgZm9yIHRoZSBtYXggcGFja2V0CiAJCQkgKiBzaXplLCBzbyBtdWNoIHNpbXBsZXIuLi4gLSBKZWFuIElJICovCi0JCQluZXh0Zml0ID0gKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKTsKKwkJCW5leHRmaXQgPSAhc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpOwogI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCiAJCQkvKgogCQkJICogIFNlbmQgZGF0YSB3aXRoIGZpbmFsIGJpdCBjbGVhcmVkIG9ubHkgaWYgd2luZG93ID4gMQpAQCAtMTkzNyw3ICsxOTM3LDcgQEAKIAkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CiAKIAkJCQkvKiBBbnkgcGVuZGluZyBkYXRhIHJlcXVlc3RzPyAgKi8KLQkJCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpICYmCiAJCQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSkKIAkJCQl7CiAJCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IFRSVUU7CkBAIC0yMDM4LDcgKzIwMzgsNyBAQAogCQkJLyoKIAkJCSAqICBBbnkgcGVuZGluZyBkYXRhIHJlcXVlc3RzPwogCQkJICovCi0JCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkgJiYKIAkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkgJiYgIXNlbGYtPnJlbW90ZV9idXN5KQogCQkJewogCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIFRSVUUpOwpAQCAtMjA2OSw3ICsyMDY5LDcgQEAKIAkJICovCiAJCW5yX3N0YXR1cyA9IGlybGFwX3ZhbGlkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKIAkJaWYgKG5yX3N0YXR1cyA9PSBOUl9FWFBFQ1RFRCkgewotCQkJaWYgKChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApICYmCisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSAmJgogCQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSkgewogCQkJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CiAKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMgYi9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jCmluZGV4IDA0MGFiZTcuLjZkYWZiYjQgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKKysrIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwpAQCAtMTAxOCwxMSArMTAxOCwxMCBAQAogCS8qCiAJICogIFdlIGNhbiBub3cgZmlsbCB0aGUgd2luZG93IHdpdGggYWRkaXRpb25hbCBkYXRhIGZyYW1lcwogCSAqLwotCXdoaWxlIChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApIHsKKwl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSkgewogCiAJCUlSREFfREVCVUcoMCwgIiVzKCksIHNlbmRpbmcgYWRkaXRpb25hbCBmcmFtZXMhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlpZiAoKHNrYl9xdWV1ZV9sZW4oICZzZWxmLT50eHEpID4gMCkgJiYKLQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSkgeworCQlpZiAoc2VsZi0+d2luZG93ID4gMCkgewogCQkJc2tiID0gc2tiX2RlcXVldWUoICZzZWxmLT50eHEpOwogCQkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwogCkBAIC0xMDMxLDggKzEwMzAsNyBAQAogCQkJICogIGJpdCBjbGVhcmVkCiAJCQkgKi8KIAkJCWlmICgoc2VsZi0+d2luZG93ID4gMSkgJiYKLQkJCSAgICBza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkKLQkJCXsKKwkJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpKSB7CiAJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnkoc2VsZiwgc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbChzZWxmLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggZDA5MWNjZi4uNjYwMmQ5MCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0xNTEzLDcgKzE1MTMsNyBAQAogCS8qCiAJICogIENoZWNrIGlmIHRoZXJlIGlzIHN0aWxsIGRhdGEgc2VnbWVudHMgaW4gdGhlIHRyYW5zbWl0IHF1ZXVlCiAJICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSA+IDApIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhfcXVldWUpKSB7CiAJCWlmIChwcmlvcml0eSA9PSBQX0hJR0gpIHsKIAkJCS8qCiAJCQkgKiAgTm8gbmVlZCB0byBzZW5kIHRoZSBxdWV1ZWQgZGF0YSwgaWYgd2UgYXJlCmRpZmYgLS1naXQgYS9uZXQvbGFwYi9LY29uZmlnIGIvbmV0L2xhcGIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI1ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xhcGIvS2NvbmZpZwpAQCAtMCwwICsxLDIyIEBACisjCisjIExBUEIgRGF0YSBMaW5rIERyaXZlCisjCisKK2NvbmZpZyBMQVBCCisJdHJpc3RhdGUgIkxBUEIgRGF0YSBMaW5rIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIExpbmsgQWNjZXNzIFByb2NlZHVyZSwgQmFsYW5jZWQgKExBUEIpIGlzIHRoZSBkYXRhIGxpbmsgbGF5ZXIgKGkuZS4KKwkgIHRoZSBsb3dlcikgcGFydCBvZiB0aGUgWC4yNSBwcm90b2NvbC4gSXQgb2ZmZXJzIGEgcmVsaWFibGUKKwkgIGNvbm5lY3Rpb24gc2VydmljZSB0byBleGNoYW5nZSBkYXRhIGZyYW1lcyB3aXRoIG9uZSBvdGhlciBob3N0LCBhbmQKKwkgIGl0IGlzIHVzZWQgdG8gdHJhbnNwb3J0IGhpZ2hlciBsZXZlbCBwcm90b2NvbHMgKG1vc3RseSBYLjI1IFBhY2tldAorCSAgTGF5ZXIsIHRoZSBoaWdoZXIgcGFydCBvZiBYLjI1LCBidXQgb3RoZXJzIGFyZSBwb3NzaWJsZSBhcyB3ZWxsKS4KKwkgIFVzdWFsbHksIExBUEIgaXMgdXNlZCB3aXRoIHNwZWNpYWxpemVkIFguMjEgbmV0d29yayBjYXJkcywgYnV0IExpbnV4CisJICBjdXJyZW50bHkgc3VwcG9ydHMgTEFQQiBvbmx5IG92ZXIgRXRoZXJuZXQgY29ubmVjdGlvbnMuIElmIHlvdSB3YW50CisJICB0byB1c2UgTEFQQiBjb25uZWN0aW9ucyBvdmVyIEV0aGVybmV0LCBzYXkgWSBoZXJlIGFuZCB0byAiTEFQQiBvdmVyCisJICBFdGhlcm5ldCBkcml2ZXIiIGJlbG93LiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbGFwYi1tb2R1bGUudHh0PiBmb3IgdGVjaG5pY2FsCisJICBkZXRhaWxzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsYXBiLiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX2NfZXYuYyBiL25ldC9sbGMvbGxjX2NfZXYuYwppbmRleCBjZDEzMGMzLi5kNWJkYjUzIDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19jX2V2LmMKKysrIGIvbmV0L2xsYy9sbGNfY19ldi5jCkBAIC04NCw3ICs4NCw3IEBACiAJaWYgKGxsYy0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykKIAkJZ290byBvdXQ7CiAJcmMgPSAxOwotCWlmICghc2tiX3F1ZXVlX2xlbigmbGxjLT5wZHVfdW5hY2tfcSkpCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmbGxjLT5wZHVfdW5hY2tfcSkpCiAJCWdvdG8gb3V0OwogCXNrYiA9IHNrYl9wZWVrKCZsbGMtPnBkdV91bmFja19xKTsKIAlwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IDcwYmNkNDcuLmZmNzc0YTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTMxNSw4ICszMTUsOCBAQAogc3RhdGljIHZvaWQgbmV0bGlua19yZW1vdmUoc3RydWN0IHNvY2sgKnNrKQogewogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwotCW5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0uaGFzaC5lbnRyaWVzLS07Ci0Jc2tfZGVsX25vZGVfaW5pdChzayk7CisJaWYgKHNrX2RlbF9ub2RlX2luaXQoc2spKQorCQlubF90YWJsZVtzay0+c2tfcHJvdG9jb2xdLmhhc2guZW50cmllcy0tOwogCWlmIChubGtfc2soc2spLT5ncm91cHMpCiAJCV9fc2tfZGVsX2JpbmRfbm9kZShzayk7CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKQEAgLTQyOSw3ICs0MjksMTIgQEAKIAllcnIgPSBuZXRsaW5rX2luc2VydChzaywgcGlkKTsKIAlpZiAoZXJyID09IC1FQUREUklOVVNFKQogCQlnb3RvIHJldHJ5OwotCXJldHVybiAwOworCisJLyogSWYgMiB0aHJlYWRzIHJhY2UgdG8gYXV0b2JpbmQsIHRoYXQgaXMgZmluZS4gICovCisJaWYgKGVyciA9PSAtRUJVU1kpCisJCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBuZXRsaW5rX2NhcGFibGUoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGZsYWcpIApAQCAtNjQzLDcgKzY0OCw4IEBACiAJc29ja19wdXQoc2spOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuZXRsaW5rX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGFsbG9jYXRpb24pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuZXRsaW5rX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGFsbG9jYXRpb24pCiB7CiAJaW50IGRlbHRhOwogCkBAIC03MTIsNyArNzE4LDcgQEAKIAlpbnQgZmFpbHVyZTsKIAlpbnQgY29uZ2VzdGVkOwogCWludCBkZWxpdmVyZWQ7Ci0JaW50IGFsbG9jYXRpb247CisJdW5zaWduZWQgaW50IGFsbG9jYXRpb247CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjI7CiB9OwogCkBAIC04NTMsNyArODU5LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCi0JaWYgKCFza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQogCQljbGVhcl9iaXQoMCwgJm5say0+c3RhdGUpOwogCWlmICghdGVzdF9iaXQoMCwgJm5say0+c3RhdGUpKQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5say0+d2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L0tjb25maWcgYi9uZXQvcGFja2V0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZjkzZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9wYWNrZXQvS2NvbmZpZwpAQCAtMCwwICsxLDI2IEBACisjCisjIFBhY2tldCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBQQUNLRVQKKwl0cmlzdGF0ZSAiUGFja2V0IHNvY2tldCIKKwktLS1oZWxwLS0tCisJICBUaGUgUGFja2V0IHByb3RvY29sIGlzIHVzZWQgYnkgYXBwbGljYXRpb25zIHdoaWNoIGNvbW11bmljYXRlCisJICBkaXJlY3RseSB3aXRoIG5ldHdvcmsgZGV2aWNlcyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBuZXR3b3JrCisJICBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCBlLmcuIHRjcGR1bXAuICBJZiB5b3Ugd2FudCB0aGVtCisJICB0byB3b3JrLCBjaG9vc2UgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWZfcGFja2V0LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUEFDS0VUX01NQVAKKwlib29sICJQYWNrZXQgc29ja2V0OiBtbWFwcGVkIElPIgorCWRlcGVuZHMgb24gUEFDS0VUCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBQYWNrZXQgcHJvdG9jb2wgZHJpdmVyIHdpbGwgdXNlIGFuIElPCisJICBtZWNoYW5pc20gdGhhdCByZXN1bHRzIGluIGZhc3RlciBjb21tdW5pY2F0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwppbmRleCAwMjY5NjE2Li5jOWQ1OTgwIDEwMDY0NAotLS0gYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTI3NCw2ICsyNzQsOSBAQAogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAlza2ItPmRzdCA9IE5VTEw7CiAKKwkvKiBkcm9wIGNvbm50cmFjayByZWZlcmVuY2UgKi8KKwluZl9yZXNldChza2IpOworCiAJc3BrdCA9IChzdHJ1Y3Qgc29ja2FkZHJfcGt0Kilza2ItPmNiOwogCiAJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEtc2tiLT5tYWMucmF3KTsKQEAgLTUxNyw2ICs1MjAsOSBAQAogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAlza2ItPmRzdCA9IE5VTEw7CiAKKwkvKiBkcm9wIGNvbm50cmFjayByZWZlcmVuY2UgKi8KKwluZl9yZXNldChza2IpOworCiAJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAlwby0+c3RhdHMudHBfcGFja2V0cysrOwogCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCA3YmFjMjQ5Li41OWQzZTcxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtMSw2ICsxLDQzIEBACiAjCiAjIFRyYWZmaWMgY29udHJvbCBjb25maWd1cmF0aW9uLgogIyAKKworbWVudWNvbmZpZyBORVRfU0NIRUQKKwlib29sICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCisJLS0taGVscC0tLQorCSAgV2hlbiB0aGUga2VybmVsIGhhcyBzZXZlcmFsIHBhY2tldHMgdG8gc2VuZCBvdXQgb3ZlciBhIG5ldHdvcmsKKwkgIGRldmljZSwgaXQgaGFzIHRvIGRlY2lkZSB3aGljaCBvbmVzIHRvIHNlbmQgZmlyc3QsIHdoaWNoIG9uZXMgdG8KKwkgIGRlbGF5LCBhbmQgd2hpY2ggb25lcyB0byBkcm9wLiBUaGlzIGlzIHRoZSBqb2Igb2YgdGhlIHBhY2tldAorCSAgc2NoZWR1bGVyLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgaG93IHRvIGRvIHRoaXMKKwkgICJmYWlybHkiIGhhdmUgYmVlbiBwcm9wb3NlZC4KKworCSAgSWYgeW91IHNheSBOIGhlcmUsIHlvdSB3aWxsIGdldCB0aGUgc3RhbmRhcmQgcGFja2V0IHNjaGVkdWxlciwgd2hpY2gKKwkgIGlzIGEgRklGTyAoZmlyc3QgY29tZSwgZmlyc3Qgc2VydmVkKS4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlCisJICBhYmxlIHRvIGNob29zZSBmcm9tIGFtb25nIHNldmVyYWwgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtcyB3aGljaCBjYW4KKwkgIHRoZW4gYmUgYXR0YWNoZWQgdG8gZGlmZmVyZW50IG5ldHdvcmsgZGV2aWNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yCisJICBleGFtcGxlIGlmIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgYXJlIHJlYWwgdGltZSBkZXZpY2VzIHRoYXQKKwkgIG5lZWQgYSBjZXJ0YWluIG1pbmltdW0gZGF0YSBmbG93IHJhdGUsIG9yIGlmIHlvdSBuZWVkIHRvIGxpbWl0IHRoZQorCSAgbWF4aW11bSBkYXRhIGZsb3cgcmF0ZSBmb3IgdHJhZmZpYyB3aGljaCBtYXRjaGVzIHNwZWNpZmllZCBjcml0ZXJpYS4KKwkgIFRoaXMgY29kZSBpcyBjb25zaWRlcmVkIHRvIGJlIGV4cGVyaW1lbnRhbC4KKworCSAgVG8gYWRtaW5pc3RlciB0aGVzZSBzY2hlZHVsZXJzLCB5b3UnbGwgbmVlZCB0aGUgdXNlci1sZXZlbCB1dGlsaXRpZXMKKwkgIGZyb20gdGhlIHBhY2thZ2UgaXByb3V0ZTIrdGMgYXQgPGZ0cDovL2Z0cC50dXgub3JnL3B1Yi9uZXQvaXAtcm91dGluZy8+LgorCSAgVGhhdCBwYWNrYWdlIGFsc28gY29udGFpbnMgc29tZSBkb2N1bWVudGF0aW9uOyBmb3IgbW9yZSwgY2hlY2sgb3V0CisJICA8aHR0cDovL3NuYWZ1LmZyZWVkb20ub3JnL2xpbnV4Mi4yL2lwcm91dGUtbm90ZXMuaHRtbD4uCisKKwkgIFRoaXMgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIHN1cHBvcnQgd2lsbCBlbmFibGUgeW91IHRvIHVzZQorCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKGRpZmZzZXJ2KSBhbmQgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wKKwkgIChSU1ZQKSBvbiB5b3VyIExpbnV4IHJvdXRlciBpZiB5b3UgYWxzbyBzYXkgWSB0byAiUW9TIHN1cHBvcnQiLAorCSAgIlBhY2tldCBjbGFzc2lmaWVyIEFQSSIgYW5kIHRvIHNvbWUgY2xhc3NpZmllcnMgYmVsb3cuIERvY3VtZW50YXRpb24KKwkgIGFuZCBzb2Z0d2FyZSBpcyBhdCA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIiBiZWxvdywgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcmVhZCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgcGFja2V0IHNjaGVkdWxlcnMgZnJvbSB0aGUgZmlsZQorCSAgL3Byb2MvbmV0L3BzY2hlZC4KKworCSAgVGhlIGF2YWlsYWJsZSBzY2hlZHVsZXJzIGFyZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM7IHlvdQorCSAgY2FuIHNheSBZIHRvIGFzIG1hbnkgYXMgeW91IGxpa2UuIElmIHVuc3VyZSwgc2F5IE4gbm93LgorCiBjaG9pY2UKIAlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgogCWRlcGVuZHMgb24gTkVUX1NDSEVECmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvTWFrZWZpbGUgYi9uZXQvc2NoZWQvTWFrZWZpbGUKaW5kZXggOGY1OGNlYy4uZTQ4ZDBkNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL01ha2VmaWxlCisrKyBiL25ldC9zY2hlZC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLXkJOj0gc2NoX2dlbmVyaWMubwogCi1vYmotJChDT05GSUdfTkVUX1NDSEVEKQkJKz0gc2NoX2FwaS5vIHNjaF9maWZvLm8KK29iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2ZpZm8ubyBzY2hfYmxhY2tob2xlLm8KIG9iai0kKENPTkZJR19ORVRfQ0xTKQkJKz0gY2xzX2FwaS5vCiBvYmotJChDT05GSUdfTkVUX0NMU19BQ1QpCSs9IGFjdF9hcGkubwogb2JqLSQoQ09ORklHX05FVF9BQ1RfUE9MSUNFKQkrPSBwb2xpY2UubwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9hcGkuYyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKaW5kZXggOTU5NDIwNi4uMjQ5YzYxOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9hcGkuYworKysgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCkBAIC00MzksNiArNDM5LDggQEAKIAogCXQgPSBOTE1TR19EQVRBKG5saCk7CiAJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwl0LT50Y2FfX3BhZDEgPSAwOworCXQtPnRjYV9fcGFkMiA9IDA7CiAJCiAJeCA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CkBAIC01ODAsNiArNTgyLDggQEAKIAlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIG4tPm5sbXNnX3NlcSwgUlRNX0RFTEFDVElPTiwgc2l6ZW9mKCp0KSk7CiAJdCA9IE5MTVNHX0RBVEEobmxoKTsKIAl0LT50Y2FfZmFtaWx5ID0gQUZfVU5TUEVDOworCXQtPnRjYV9fcGFkMSA9IDA7CisJdC0+dGNhX19wYWQyID0gMDsKIAogCXggPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CiAJUlRBX1BVVChza2IsIFRDQV9BQ1RfVEFCLCAwLCBOVUxMKTsKQEAgLTY4Nyw3ICs2OTEsOSBAQAogCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCp0KSwgZmxhZ3MpOwogCXQgPSBOTE1TR19EQVRBKG5saCk7CiAJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQkKKwl0LT50Y2FfX3BhZDEgPSAwOworCXQtPnRjYV9fcGFkMiA9IDA7CisKIAl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CiAJUlRBX1BVVChza2IsIFRDQV9BQ1RfVEFCLCAwLCBOVUxMKTsKIApAQCAtODQyLDYgKzg0OCw4IEBACiAJICAgICAgICAgICAgICAgIGNiLT5ubGgtPm5sbXNnX3R5cGUsIHNpemVvZigqdCkpOwogCXQgPSBOTE1TR19EQVRBKG5saCk7CiAJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwl0LT50Y2FfX3BhZDEgPSAwOworCXQtPnRjYV9fcGFkMiA9IDA7CiAKIAl4ID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2FwaS5jIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwppbmRleCAxNjE2YmY1Li4zYjU3MTRlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2FwaS5jCisrKyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKQEAgLTMzMSw2ICszMzEsOCBAQAogCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCp0Y20pLCBmbGFncyk7CiAJdGNtID0gTkxNU0dfREFUQShubGgpOwogCXRjbS0+dGNtX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwl0Y20tPnRjbV9fcGFkMSA9IDA7CisJdGNtLT50Y21fX3BhZDEgPSAwOwogCXRjbS0+dGNtX2lmaW5kZXggPSB0cC0+cS0+ZGV2LT5pZmluZGV4OwogCXRjbS0+dGNtX3BhcmVudCA9IHRwLT5jbGFzc2lkOwogCXRjbS0+dGNtX2luZm8gPSBUQ19IX01BS0UodHAtPnByaW8sIHRwLT5wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuaCBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCmluZGV4IDIzMmZiOTEuLjAwNjE2OGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cC5oCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCkBAIC02MTgsNiArNjE4LDcgQEAKIAlwaW5mby5wcm90b2NvbCA9IHMtPnByb3RvY29sOwogCXBpbmZvLnR1bm5lbGlkID0gcy0+dHVubmVsaWQ7CiAJcGluZm8udHVubmVsaGRyID0gZi0+dHVubmVsaGRyOworCXBpbmZvLnBhZCA9IDA7CiAJUlRBX1BVVChza2IsIFRDQV9SU1ZQX1BJTkZPLCBzaXplb2YocGluZm8pLCAmcGluZm8pOwogCWlmIChmLT5yZXMuY2xhc3NpZCkKIAkJUlRBX1BVVChza2IsIFRDQV9SU1ZQX0NMQVNTSUQsIDQsICZmLT5yZXMuY2xhc3NpZCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvZW1fbWV0YS5jIGIvbmV0L3NjaGVkL2VtX21ldGEuYwppbmRleCA0OGJiMjNjLi4wMGVhZTVmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvZW1fbWV0YS5jCisrKyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKQEAgLTI3LDE3ICsyNywxNyBAQAogICogCSAgICAgICAgIGx2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZhbHVlCiAgKiAJICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKICAqIAkgICAgICB8IHR5cGU6IElOVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eXBlOiBJTlQgfAotICogCSBkZWYgIHwgaWQ6IElOREVWIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlkOiBWQUxVRSB8CisgKiAJIGRlZiAgfCBpZDogREVWICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWQ6IFZBTFVFIHwKICAqIAkgICAgICB8IGRhdGE6ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRhOiAzICAgfAogICogCSAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCiAgKiAJICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIAkgICAgICAgICAgICAtLS0+IG1ldGFfb3BzW0lOVF1bSU5ERVZdKC4uLikgICAgICAgICAgfAorICogCSAgICAgICAgICAgIC0tLT4gbWV0YV9vcHNbSU5UXVtERVZdKC4uLikgICAgICAgICAgICB8CiAgKgkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICogCSAgICAgICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgKiAJICAgICAgICAgICAgViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKICAqIAkgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKwogICogCSAgICAgIHwgdHlwZTogSU5UIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR5cGU6IElOVCB8Ci0gKiAJIG9iaiAgfCBpZDogSU5ERVYgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWQ6IFZBTFVFIHwKKyAqIAkgb2JqICB8IGlkOiBERVYgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZDogVkFMVUUgfAogICogCSAgICAgIHwgZGF0YTogMiAgIHw8LS1kYXRhIGdvdCBmaWxsZWQgb3V0ICAgICB8IGRhdGE6IDMgICB8CiAgKiAJICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKICAqIAkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CkBAIC0xNzAsMjYgKzE3MCw2IEBACiAJKmVyciA9IHZhcl9kZXYoc2tiLT5kZXYsIGRzdCk7CiB9CiAKLU1FVEFfQ09MTEVDVE9SKGludF9pbmRldikKLXsKLQkqZXJyID0gaW50X2Rldihza2ItPmlucHV0X2RldiwgZHN0KTsKLX0KLQotTUVUQV9DT0xMRUNUT1IodmFyX2luZGV2KQotewotCSplcnIgPSB2YXJfZGV2KHNrYi0+aW5wdXRfZGV2LCBkc3QpOwotfQotCi1NRVRBX0NPTExFQ1RPUihpbnRfcmVhbGRldikKLXsKLQkqZXJyID0gaW50X2Rldihza2ItPnJlYWxfZGV2LCBkc3QpOwotfQotCi1NRVRBX0NPTExFQ1RPUih2YXJfcmVhbGRldikKLXsKLQkqZXJyID0gdmFyX2Rldihza2ItPnJlYWxfZGV2LCBkc3QpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHNrYiBhdHRyaWJ1dGVzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDUsMTEgKzE4NSw2IEBACiAJZHN0LT52YWx1ZSA9IHNrYi0+cHJvdG9jb2w7CiB9CiAKLU1FVEFfQ09MTEVDVE9SKGludF9zZWN1cml0eSkKLXsKLQlkc3QtPnZhbHVlID0gc2tiLT5zZWN1cml0eTsKLX0KLQogTUVUQV9DT0xMRUNUT1IoaW50X3BrdHR5cGUpCiB7CiAJZHN0LT52YWx1ZSA9IHNrYi0+cGt0X3R5cGU7CkBAIC0yMzQsMTIgKzIwOSwxNCBAQAogICogTmV0ZmlsdGVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCiBNRVRBX0NPTExFQ1RPUihpbnRfbmZtYXJrKQogeworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIAlkc3QtPnZhbHVlID0gc2tiLT5uZm1hcms7Ci19CisjZWxzZQorCWRzdC0+dmFsdWUgPSAwOwogI2VuZGlmCit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVHJhZmZpYyBDb250cm9sCkBAIC0yNTAsMzEgKzIyNywyMSBAQAogCWRzdC0+dmFsdWUgPSBza2ItPnRjX2luZGV4OwogfQogCi0jaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi1NRVRBX0NPTExFQ1RPUihpbnRfdGN2ZXJkKQotewotCWRzdC0+dmFsdWUgPSBza2ItPnRjX3ZlcmQ7Ci19Ci0KLU1FVEFfQ09MTEVDVE9SKGludF90Y2NsYXNzaWQpCi17Ci0JZHN0LT52YWx1ZSA9IHNrYi0+dGNfY2xhc3NpZDsKLX0KLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJvdXRpbmcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCiBNRVRBX0NPTExFQ1RPUihpbnRfcnRjbGFzc2lkKQogewogCWlmICh1bmxpa2VseShza2ItPmRzdCA9PSBOVUxMKSkKIAkJKmVyciA9IC0xOwogCWVsc2UKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQogCQlkc3QtPnZhbHVlID0gc2tiLT5kc3QtPnRjbGFzc2lkOwotfQorI2Vsc2UKKwkJZHN0LT52YWx1ZSA9IDA7CiAjZW5kaWYKK30KIAogTUVUQV9DT0xMRUNUT1IoaW50X3J0aWlmKQogewpAQCAtNTEwLDggKzQ3Nyw2IEBACiBzdGF0aWMgc3RydWN0IG1ldGFfb3BzIF9fbWV0YV9vcHNbVENGX01FVEFfVFlQRV9NQVgrMV1bVENGX01FVEFfSURfTUFYKzFdID0gewogCVtUQ0ZfTUVUQV9UWVBFX1ZBUl0gPSB7CiAJCVtNRVRBX0lEKERFVildCQkJPSBNRVRBX0ZVTkModmFyX2RldiksCi0JCVtNRVRBX0lEKElOREVWKV0JCT0gTUVUQV9GVU5DKHZhcl9pbmRldiksCi0JCVtNRVRBX0lEKFJFQUxERVYpXQkJPSBNRVRBX0ZVTkModmFyX3JlYWxkZXYpLAogCQlbTUVUQV9JRChTS19CT1VORF9JRildIAkJPSBNRVRBX0ZVTkModmFyX3NrX2JvdW5kX2lmKSwKIAl9LAogCVtUQ0ZfTUVUQV9UWVBFX0lOVF0gPSB7CkBAIC01MjAsMjYgKzQ4NSwxNSBAQAogCQlbTUVUQV9JRChMT0FEQVZHXzEpXQkJPSBNRVRBX0ZVTkMoaW50X2xvYWRhdmdfMSksCiAJCVtNRVRBX0lEKExPQURBVkdfMildCQk9IE1FVEFfRlVOQyhpbnRfbG9hZGF2Z18yKSwKIAkJW01FVEFfSUQoREVWKV0JCQk9IE1FVEFfRlVOQyhpbnRfZGV2KSwKLQkJW01FVEFfSUQoSU5ERVYpXQkJPSBNRVRBX0ZVTkMoaW50X2luZGV2KSwKLQkJW01FVEFfSUQoUkVBTERFVildCQk9IE1FVEFfRlVOQyhpbnRfcmVhbGRldiksCiAJCVtNRVRBX0lEKFBSSU9SSVRZKV0JCT0gTUVUQV9GVU5DKGludF9wcmlvcml0eSksCiAJCVtNRVRBX0lEKFBST1RPQ09MKV0JCT0gTUVUQV9GVU5DKGludF9wcm90b2NvbCksCi0JCVtNRVRBX0lEKFNFQ1VSSVRZKV0JCT0gTUVUQV9GVU5DKGludF9zZWN1cml0eSksCiAJCVtNRVRBX0lEKFBLVFRZUEUpXQkJPSBNRVRBX0ZVTkMoaW50X3BrdHR5cGUpLAogCQlbTUVUQV9JRChQS1RMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X3BrdGxlbiksCiAJCVtNRVRBX0lEKERBVEFMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X2RhdGFsZW4pLAogCQlbTUVUQV9JRChNQUNMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X21hY2xlbiksCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgogCQlbTUVUQV9JRChORk1BUkspXQkJPSBNRVRBX0ZVTkMoaW50X25mbWFyayksCi0jZW5kaWYKIAkJW01FVEFfSUQoVENJTkRFWCldCQk9IE1FVEFfRlVOQyhpbnRfdGNpbmRleCksCi0jaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi0JCVtNRVRBX0lEKFRDVkVSRElDVCldCQk9IE1FVEFfRlVOQyhpbnRfdGN2ZXJkKSwKLQkJW01FVEFfSUQoVENDTEFTU0lEKV0JCT0gTUVUQV9GVU5DKGludF90Y2NsYXNzaWQpLAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKIAkJW01FVEFfSUQoUlRDTEFTU0lEKV0JCT0gTUVUQV9GVU5DKGludF9ydGNsYXNzaWQpLAotI2VuZGlmCiAJCVtNRVRBX0lEKFJUSUlGKV0JCT0gTUVUQV9GVU5DKGludF9ydGlpZiksCiAJCVtNRVRBX0lEKFNLX0ZBTUlMWSldCQk9IE1FVEFfRlVOQyhpbnRfc2tfZmFtaWx5KSwKIAkJW01FVEFfSUQoU0tfU1RBVEUpXQkJPSBNRVRBX0ZVTkMoaW50X3NrX3N0YXRlKSwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV90ZXh0LmMgYi9uZXQvc2NoZWQvZW1fdGV4dC5jCmluZGV4IDg3Mzg0MGQuLjc3YmVhYmMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbV90ZXh0LmMKKysrIGIvbmV0L3NjaGVkL2VtX3RleHQuYwpAQCAtNTUsOSArNTUsNiBAQAogCXN0cnVjdCB0c19jb25maWcgKnRzX2NvbmY7CiAJaW50IGZsYWdzID0gMDsKIAotCXByaW50aygiQ29uZmlndXJpbmcgdGV4dDogJXMgZnJvbSAlZDolZCB0byAlZDolZCBsZW4gJWRcbiIsIGNvbmYtPmFsZ28sIGNvbmYtPmZyb21fb2Zmc2V0LAotCSAgICBjb25mLT5mcm9tX2xheWVyLCBjb25mLT50b19vZmZzZXQsIGNvbmYtPnRvX2xheWVyLCBjb25mLT5wYXR0ZXJuX2xlbik7Ci0KIAlpZiAobGVuIDwgc2l6ZW9mKCpjb25mKSB8fCBsZW4gPCAoc2l6ZW9mKCpjb25mKSArIGNvbmYtPnBhdHRlcm5fbGVuKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IDk3YzFjNzUuLmI5YTA2OWEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMzk5LDEwICszOTksOCBAQAogewogCWludCBlcnI7CiAJc3RydWN0IHJ0YXR0ciAqa2luZCA9IHRjYVtUQ0FfS0lORC0xXTsKLQl2b2lkICpwID0gTlVMTDsKIAlzdHJ1Y3QgUWRpc2MgKnNjaDsKIAlzdHJ1Y3QgUWRpc2Nfb3BzICpvcHM7Ci0JaW50IHNpemU7CiAKIAlvcHMgPSBxZGlzY19sb29rdXBfb3BzKGtpbmQpOwogI2lmZGVmIENPTkZJR19LTU9ECkBAIC00MzcsNjQgKzQzNSw1NSBAQAogCWlmIChvcHMgPT0gTlVMTCkKIAkJZ290byBlcnJfb3V0OwogCi0JLyogZW5zdXJlIHRoYXQgdGhlIFFkaXNjIGFuZCB0aGUgcHJpdmF0ZSBkYXRhIGFyZSAzMi1ieXRlIGFsaWduZWQgKi8KLQlzaXplID0gKChzaXplb2YoKnNjaCkgKyBRRElTQ19BTElHTl9DT05TVCkgJiB+UURJU0NfQUxJR05fQ09OU1QpOwotCXNpemUgKz0gb3BzLT5wcml2X3NpemUgKyBRRElTQ19BTElHTl9DT05TVDsKLQotCXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWVyciA9IC1FTk9CVUZTOwotCWlmICghcCkKKwlzY2ggPSBxZGlzY19hbGxvYyhkZXYsIG9wcyk7CisJaWYgKElTX0VSUihzY2gpKSB7CisJCWVyciA9IFBUUl9FUlIoc2NoKTsKIAkJZ290byBlcnJfb3V0MjsKLQltZW1zZXQocCwgMCwgc2l6ZSk7Ci0Jc2NoID0gKHN0cnVjdCBRZGlzYyAqKSgoKHVuc2lnbmVkIGxvbmcpcCArIFFESVNDX0FMSUdOX0NPTlNUKQotCSAgICAgICAgICAgICAgICAgICAgICAgJiB+UURJU0NfQUxJR05fQ09OU1QpOwotCXNjaC0+cGFkZGVkID0gKGNoYXIgKilzY2ggLSAoY2hhciAqKXA7CisJfQogCi0JSU5JVF9MSVNUX0hFQUQoJnNjaC0+bGlzdCk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NoLT5xKTsKLQotCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKQorCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKSB7CiAJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfSU5HUkVTUzsKLQotCXNjaC0+b3BzID0gb3BzOwotCXNjaC0+ZW5xdWV1ZSA9IG9wcy0+ZW5xdWV1ZTsKLQlzY2gtPmRlcXVldWUgPSBvcHMtPmRlcXVldWU7Ci0Jc2NoLT5kZXYgPSBkZXY7Ci0JZGV2X2hvbGQoZGV2KTsKLQlhdG9taWNfc2V0KCZzY2gtPnJlZmNudCwgMSk7Ci0Jc2NoLT5zdGF0c19sb2NrID0gJmRldi0+cXVldWVfbG9jazsKLQlpZiAoaGFuZGxlID09IDApIHsKKwkJaGFuZGxlID0gVENfSF9NQUtFKFRDX0hfSU5HUkVTUywgMCk7CisJfSBlbHNlIGlmIChoYW5kbGUgPT0gMCkgewogCQloYW5kbGUgPSBxZGlzY19hbGxvY19oYW5kbGUoZGV2KTsKIAkJZXJyID0gLUVOT01FTTsKIAkJaWYgKGhhbmRsZSA9PSAwKQogCQkJZ290byBlcnJfb3V0MzsKIAl9CiAKLQlpZiAoaGFuZGxlID09IFRDX0hfSU5HUkVTUykKLSAgICAgICAgICAgICAgICBzY2gtPmhhbmRsZSA9VENfSF9NQUtFKFRDX0hfSU5HUkVTUywgMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzY2gtPmhhbmRsZSA9IGhhbmRsZTsKKwlzY2gtPmhhbmRsZSA9IGhhbmRsZTsKIAogCWlmICghb3BzLT5pbml0IHx8IChlcnIgPSBvcHMtPmluaXQoc2NoLCB0Y2FbVENBX09QVElPTlMtMV0pKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwkJaWYgKHRjYVtUQ0FfUkFURS0xXSkgeworCQkJZXJyID0gZ2VuX25ld19lc3RpbWF0b3IoJnNjaC0+YnN0YXRzLCAmc2NoLT5yYXRlX2VzdCwKKwkJCQkJCXNjaC0+c3RhdHNfbG9jaywKKwkJCQkJCXRjYVtUQ0FfUkFURS0xXSk7CisJCQlpZiAoZXJyKSB7CisJCQkJLyoKKwkJCQkgKiBBbnkgYnJva2VuIHFkaXNjcyB0aGF0IHdvdWxkIHJlcXVpcmUKKwkJCQkgKiBhIG9wcy0+cmVzZXQoKSBoZXJlPyBUaGUgcWRpc2Mgd2FzIG5ldmVyCisJCQkJICogaW4gYWN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuCisJCQkJICovCisJCQkJaWYgKG9wcy0+ZGVzdHJveSkKKwkJCQkJb3BzLT5kZXN0cm95KHNjaCk7CisJCQkJZ290byBlcnJfb3V0MzsKKwkJCX0KKwkJfQorI2VuZGlmCiAJCXFkaXNjX2xvY2tfdHJlZShkZXYpOwogCQlsaXN0X2FkZF90YWlsKCZzY2gtPmxpc3QsICZkZXYtPnFkaXNjX2xpc3QpOwogCQlxZGlzY191bmxvY2tfdHJlZShkZXYpOwogCi0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQkJaWYgKHRjYVtUQ0FfUkFURS0xXSkKLQkJCWdlbl9uZXdfZXN0aW1hdG9yKCZzY2gtPmJzdGF0cywgJnNjaC0+cmF0ZV9lc3QsCi0JCQkJc2NoLT5zdGF0c19sb2NrLCB0Y2FbVENBX1JBVEUtMV0pOwotI2VuZGlmCiAJCXJldHVybiBzY2g7CiAJfQogZXJyX291dDM6CiAJZGV2X3B1dChkZXYpOworCWtmcmVlKChjaGFyICopIHNjaCAtIHNjaC0+cGFkZGVkKTsKIGVycl9vdXQyOgogCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CiBlcnJfb3V0OgogCSplcnJwID0gZXJyOwotCWlmIChwKQotCQlrZnJlZShwKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNzcwLDYgKzc1OSw4IEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnRjbSksIGZsYWdzKTsKIAl0Y20gPSBOTE1TR19EQVRBKG5saCk7CiAJdGNtLT50Y21fZmFtaWx5ID0gQUZfVU5TUEVDOworCXRjbS0+dGNtX19wYWQxID0gMDsKKwl0Y20tPnRjbV9fcGFkMiA9IDA7CiAJdGNtLT50Y21faWZpbmRleCA9IHEtPmRldi0+aWZpbmRleDsKIAl0Y20tPnRjbV9wYXJlbnQgPSBjbGlkOwogCXRjbS0+dGNtX2hhbmRsZSA9IHEtPmhhbmRsZTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYmxhY2tob2xlLmMgYi9uZXQvc2NoZWQvc2NoX2JsYWNraG9sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjBiODMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX2JsYWNraG9sZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBuZXQvc2NoZWQvc2NoX2JsYWNraG9sZS5jCUJsYWNrIGhvbGUgcXVldWUKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqCisgKiBOb3RlOiBRdWFudHVtIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworc3RhdGljIGludCBibGFja2hvbGVfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlxZGlzY19kcm9wKHNrYiwgc2NoKTsKKwlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpibGFja2hvbGVfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgYmxhY2tob2xlX3FkaXNjX29wcyA9IHsKKwkuaWQJCT0gImJsYWNraG9sZSIsCisJLnByaXZfc2l6ZQk9IDAsCisJLmVucXVldWUJPSBibGFja2hvbGVfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9IGJsYWNraG9sZV9kZXF1ZXVlLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJsYWNraG9sZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xZGlzYygmYmxhY2tob2xlX3FkaXNjX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBibGFja2hvbGVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3FkaXNjKCZibGFja2hvbGVfcWRpc2Nfb3BzKTsKK30KKworbW9kdWxlX2luaXQoYmxhY2tob2xlX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoYmxhY2tob2xlX21vZHVsZV9leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2NicS5jIGIvbmV0L3NjaGVkL3NjaF9jYnEuYwppbmRleCBkNDNlM2I4Li4wOTQ1M2Y5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2NicS5jCisrKyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKQEAgLTE1MjgsNiArMTUyOCw3IEBACiAKIAlvcHQuc3RyYXRlZ3kgPSBjbC0+b3ZsX3N0cmF0ZWd5OwogCW9wdC5wcmlvcml0eTIgPSBjbC0+cHJpb3JpdHkyKzE7CisJb3B0LnBhZCA9IDA7CiAJb3B0LnBlbmFsdHkgPSAoY2wtPnBlbmFsdHkqMTAwMCkvSFo7CiAJUlRBX1BVVChza2IsIFRDQV9DQlFfT1ZMX1NUUkFURUdZLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAJcmV0dXJuIHNrYi0+bGVuOwpAQCAtMTU2Myw2ICsxNTY0LDggQEAKIAogCWlmIChjbC0+cG9saWNlKSB7CiAJCW9wdC5wb2xpY2UgPSBjbC0+cG9saWNlOworCQlvcHQuX19yZXMxID0gMDsKKwkJb3B0Ll9fcmVzMiA9IDA7CiAJCVJUQV9QVVQoc2tiLCBUQ0FfQ0JRX1BPTElDRSwgc2l6ZW9mKG9wdCksICZvcHQpOwogCX0KIAlyZXR1cm4gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IDc2ODNiMzQuLjhlZGVmZDVkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMzMxLDExICszMzEsMTAgQEAKIAlpbnQgcHJpbzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gcWRpc2NfcHJpdihxZGlzYyk7CiAKLQlmb3IgKHByaW8gPSAwOyBwcmlvIDwgUEZJRk9fRkFTVF9CQU5EUzsgcHJpbysrLCBsaXN0KyspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHFkaXNjLCBsaXN0KTsKLQkJaWYgKHNrYikgeworCWZvciAocHJpbyA9IDA7IHByaW8gPCBQRklGT19GQVNUX0JBTkRTOyBwcmlvKyspIHsKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkobGlzdCArIHByaW8pKSB7CiAJCQlxZGlzYy0+cS5xbGVuLS07Ci0JCQlyZXR1cm4gc2tiOworCQkJcmV0dXJuIF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHFkaXNjLCBsaXN0ICsgcHJpbyk7CiAJCX0KIAl9CiAKQEAgLTM5NSwyNCArMzk0LDIzIEBACiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLAogfTsKIAotc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQorc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpCiB7CiAJdm9pZCAqcDsKIAlzdHJ1Y3QgUWRpc2MgKnNjaDsKLQlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgZXJyID0gLUVOT0JVRlM7CiAKIAkvKiBlbnN1cmUgdGhhdCB0aGUgUWRpc2MgYW5kIHRoZSBwcml2YXRlIGRhdGEgYXJlIDMyLWJ5dGUgYWxpZ25lZCAqLwotCXNpemUgPSAoKHNpemVvZigqc2NoKSArIFFESVNDX0FMSUdOX0NPTlNUKSAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIFFESVNDX0FMSUdOX0NPTlNUOworCXNpemUgPSBRRElTQ19BTElHTihzaXplb2YoKnNjaCkpOworCXNpemUgKz0gb3BzLT5wcml2X3NpemUgKyAoUURJU0NfQUxJR05UTyAtIDEpOwogCiAJcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKQotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnJvdXQ7CiAJbWVtc2V0KHAsIDAsIHNpemUpOwotCi0Jc2NoID0gKHN0cnVjdCBRZGlzYyAqKSgoKHVuc2lnbmVkIGxvbmcpcCArIFFESVNDX0FMSUdOX0NPTlNUKSAKLQkJCSAgICAgICAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2NoLT5wYWRkZWQgPSAoY2hhciAqKXNjaCAtIChjaGFyICopcDsKKwlzY2ggPSAoc3RydWN0IFFkaXNjICopIFFESVNDX0FMSUdOKCh1bnNpZ25lZCBsb25nKSBwKTsKKwlzY2gtPnBhZGRlZCA9IChjaGFyICopIHNjaCAtIChjaGFyICopIHA7CiAKIAlJTklUX0xJU1RfSEVBRCgmc2NoLT5saXN0KTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOwpAQCAtNDIzLDExICs0MjEsMjQgQEAKIAlkZXZfaG9sZChkZXYpOwogCXNjaC0+c3RhdHNfbG9jayA9ICZkZXYtPnF1ZXVlX2xvY2s7CiAJYXRvbWljX3NldCgmc2NoLT5yZWZjbnQsIDEpOworCisJcmV0dXJuIHNjaDsKK2Vycm91dDoKKwlyZXR1cm4gRVJSX1BUUigtZXJyKTsKK30KKworc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQoreworCXN0cnVjdCBRZGlzYyAqc2NoOworCQorCXNjaCA9IHFkaXNjX2FsbG9jKGRldiwgb3BzKTsKKwlpZiAoSVNfRVJSKHNjaCkpCisJCWdvdG8gZXJyb3V0OworCiAJaWYgKCFvcHMtPmluaXQgfHwgb3BzLT5pbml0KHNjaCwgTlVMTCkgPT0gMCkKIAkJcmV0dXJuIHNjaDsKIAotCWRldl9wdXQoZGV2KTsKLQlrZnJlZShwKTsKK2Vycm91dDoKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNTkxLDYgKzYwMiw3IEBACiBFWFBPUlRfU1lNQk9MKG5vb3BfcWRpc2MpOwogRVhQT1JUX1NZTUJPTChub29wX3FkaXNjX29wcyk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NyZWF0ZV9kZmx0KTsKK0VYUE9SVF9TWU1CT0wocWRpc2NfYWxsb2MpOwogRVhQT1JUX1NZTUJPTChxZGlzY19kZXN0cm95KTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfcmVzZXQpOwogRVhQT1JUX1NZTUJPTChxZGlzY19yZXN0YXJ0KTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcmVkLmMgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCmluZGV4IDY2NGQwZTQuLjc4NDVkMDQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcmVkLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9yZWQuYwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJbWVtY3B5KHEtPlN0YWIsIFJUQV9EQVRBKHRiW1RDQV9SRURfU1RBQi0xXSksIDI1Nik7CiAKIAlxLT5xY291bnQgPSAtMTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA9PSAwKQorCWlmIChza2JfcXVldWVfZW1wdHkoJnNjaC0+cSkpCiAJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDdhZTZhYTcuLjViMjRhZTAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC03MSw3ICs3MSw3IEBACiAJCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICBzY3RwX3Njb3BlX3Qgc2NvcGUsCi0JCQkJCSAgaW50IGdmcCkKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwOwogCWludCBpOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJICovCiAJYXNvYy0+YWRkaXBfc2VyaWFsID0gYXNvYy0+Yy5pbml0aWFsX3RzbjsKIAotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFzb2MtPmFkZGlwX2NodW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJmFzb2MtPmFkZGlwX2NodW5rX2xpc3QpOwogCiAJLyogTWFrZSBhbiBlbXB0eSBsaXN0IG9mIHJlbW90ZSB0cmFuc3BvcnQgYWRkcmVzc2VzLiAgKi8KIAlJTklUX0xJU1RfSEVBRCgmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KTsKQEAgLTI3Miw3ICsyNzIsOCBAQAogLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgYXNzb2NpYXRpb24gKi8KIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX2Fzc29jaWF0aW9uX25ldyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAJCQkJCSBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSBzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnApCisJCQkJCSBzY3RwX3Njb3BlX3Qgc2NvcGUsCisJCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCkBAIC00NzgsNyArNDc5LDcgQEAKIC8qIEFkZCBhIHRyYW5zcG9ydCBhZGRyZXNzIHRvIGFuIGFzc29jaWF0aW9uLiAgKi8KIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF9hc3NvY19hZGRfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkJICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLAotCQkJCQkgICBjb25zdCBpbnQgZ2ZwLAorCQkJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAogCQkJCQkgICBjb25zdCBpbnQgcGVlcl9zdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnBlZXI7CkBAIC0xMjI5LDcgKzEyMzAsOCBAQAogLyogQnVpbGQgdGhlIGJpbmQgYWRkcmVzcyBsaXN0IGZvciB0aGUgYXNzb2NpYXRpb24gYmFzZWQgb24gaW5mbyBmcm9tIHRoZQogICogbG9jYWwgZW5kcG9pbnQgYW5kIHRoZSByZW1vdGUgcGVlci4KICAqLwotaW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKQoraW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzY3RwX3Njb3BlX3Qgc2NvcGU7CiAJaW50IGZsYWdzOwpAQCAtMTI1MSw3ICsxMjUzLDggQEAKIAogLyogQnVpbGQgdGhlIGFzc29jaWF0aW9uJ3MgYmluZCBhZGRyZXNzIGxpc3QgZnJvbSB0aGUgY29va2llLiAgKi8KIGludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9jb29raWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCi0JCQkJCSBzdHJ1Y3Qgc2N0cF9jb29raWUgKmNvb2tpZSwgaW50IGdmcCkKKwkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSAqY29va2llLAorCQkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlpbnQgdmFyX3NpemUyID0gbnRvaHMoY29va2llLT5wZWVyX2luaXQtPmNodW5rX2hkci5sZW5ndGgpOwogCWludCB2YXJfc2l6ZTMgPSBjb29raWUtPnJhd19hZGRyX2xpc3RfbGVuOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYmluZF9hZGRyLmMgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwppbmRleCBmOTBlYWRmLi5mNzE1NDk3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9iaW5kX2FkZHIuYworKysgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwpAQCAtNTMsNyArNTMsOCBAQAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgaGVscGVycy4gKi8KIHN0YXRpYyBpbnQgc2N0cF9jb3B5X29uZV9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKiwKLQkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCwgaW50IGZsYWdzKTsKKwkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCSAgICAgIGludCBmbGFncyk7CiBzdGF0aWMgdm9pZCBzY3RwX2JpbmRfYWRkcl9jbGVhbihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKik7CiAKIC8qIEZpcnN0IExldmVsIEFic3RyYWN0aW9ucy4gKi8KQEAgLTYzLDcgKzY0LDggQEAKICAqLwogaW50IHNjdHBfYmluZF9hZGRyX2NvcHkoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LCAKIAkJCWNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqc3JjLAotCQkJc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpCisJCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCisJCQlpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwpAQCAtMTQ0LDcgKzE0Niw3IEBACiAKIC8qIEFkZCBhbiBhZGRyZXNzIHRvIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBpbiB0aGUgU0NUUF9iaW5kX2FkZHIgc3RydWN0dXJlLiAqLwogaW50IHNjdHBfYWRkX2JpbmRfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCB1bmlvbiBzY3RwX2FkZHIgKm5ldywKLQkJICAgICAgIGludCBnZnApCisJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOwogCkBAIC0xOTcsNyArMTk5LDggQEAKICAqIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGxlbmd0aC4KICAqLwogdW5pb24gc2N0cF9wYXJhbXMgc2N0cF9iaW5kX2FkZHJzX3RvX3Jhdyhjb25zdCBzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLAotCQkJCQkgaW50ICphZGRyc19sZW4sIGludCBnZnApCisJCQkJCSBpbnQgKmFkZHJzX2xlbiwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJdW5pb24gc2N0cF9wYXJhbXMgYWRkcnBhcm1zOwogCXVuaW9uIHNjdHBfcGFyYW1zIHJldHZhbDsKQEAgLTI0OSw3ICsyNTIsNyBAQAogICogYWRkcmVzcyBwYXJhbWV0ZXJzKS4KICAqLwogaW50IHNjdHBfcmF3X3RvX2JpbmRfYWRkcnMoc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwgX191OCAqcmF3X2FkZHJfbGlzdCwKLQkJCSAgIGludCBhZGRyc19sZW4sIF9fdTE2IHBvcnQsIGludCBnZnApCisJCQkgICBpbnQgYWRkcnNfbGVuLCBfX3UxNiBwb3J0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqcmF3YWRkcjsKIAlzdHJ1Y3Qgc2N0cF9wYXJhbWhkciAqcGFyYW07CkBAIC0zNDcsNyArMzUwLDggQEAKIC8qIENvcHkgb3V0IGFkZHJlc3NlcyBmcm9tIHRoZSBnbG9iYWwgbG9jYWwgYWRkcmVzcyBsaXN0LiAqLwogc3RhdGljIGludCBzY3RwX2NvcHlfb25lX2FkZHIoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LCAKIAkJCSAgICAgIHVuaW9uIHNjdHBfYWRkciAqYWRkciwKLQkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCwgaW50IGZsYWdzKQorCQkJICAgICAgc2N0cF9zY29wZV90IHNjb3BlLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAorCQkJICAgICAgaW50IGZsYWdzKQogewogCWludCBlcnJvciA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2NodW5rLmMgYi9uZXQvc2N0cC9jaHVuay5jCmluZGV4IDBjMmFiNzguLjYxZGEyOTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2NodW5rLmMKKysrIGIvbmV0L3NjdHAvY2h1bmsuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhbXNnLiAqLwotU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfZGF0YW1zZyAqc2N0cF9kYXRhbXNnX25ldyhpbnQgZ2ZwKQorU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfZGF0YW1zZyAqc2N0cF9kYXRhbXNnX25ldyh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZzsKIAltc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhbXNnKSwgZ2ZwKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCmluZGV4IDJlYzAzMjAuLmU0N2FjMGQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKKysrIGIvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYwpAQCAtNjcsNyArNjcsOCBAQAogICogSW5pdGlhbGl6ZSB0aGUgYmFzZSBmaWVsZHMgb2YgdGhlIGVuZHBvaW50IHN0cnVjdHVyZS4KICAqLwogc3RhdGljIHN0cnVjdCBzY3RwX2VuZHBvaW50ICpzY3RwX2VuZHBvaW50X2luaXQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAotCQkJCQkJc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQorCQkJCQkJc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOwogCW1lbXNldChlcCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2VuZHBvaW50KSk7CkBAIC0xMDIsOSArMTAzLDkgQEAKIAkvKiBTZXQgdXAgdGhlIGJhc2UgdGltZW91dCBpbmZvcm1hdGlvbi4gICovCiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9OT05FXSA9IDA7CiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUVdID0KLQkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfVDFfQ09PS0lFOworCQltc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9faW5pdGlhbCk7CiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUXSA9Ci0JCVNDVFBfREVGQVVMVF9USU1FT1VUX1QxX0lOSVQ7CisJCW1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsKTsKIAllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOXSA9CiAJCW1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsKTsKIAllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QzX1JUWF0gPSAwOwpAQCAtMTE3LDEyICsxMTgsOSBAQAogICAgICAgICBlcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEXQogCQk9IDUgKiBtc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9fbWF4KTsKIAotCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfSEVBUlRCRUFUXSA9Ci0JCVNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKLQllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdID0KLQkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfU0FDSzsKLQllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRV0gPQotCQlzcC0+YXV0b2Nsb3NlICogSFo7CisJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9IRUFSVEJFQVRdID0gMDsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdID0gc2N0cF9zYWNrX3RpbWVvdXQ7CisJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0VdID0gc3AtPmF1dG9jbG9zZSAqIEhaOwogCiAJLyogVXNlIFNDVFAgc3BlY2lmaWMgc2VuZCBidWZmZXIgc3BhY2UgcXVldWVzLiAgKi8KIAllcC0+c25kYnVmX3BvbGljeSA9IHNjdHBfc25kYnVmX3BvbGljeTsKQEAgLTE0MCw3ICsxMzgsOCBAQAogLyogQ3JlYXRlIGEgc2N0cF9lbmRwb2ludCB3aXRoIGFsbCB0aGF0IGJvcmluZyBzdHVmZiBpbml0aWFsaXplZC4KICAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggbWVtb3J5LgogICovCi1zdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQorc3RydWN0IHNjdHBfZW5kcG9pbnQgKnNjdHBfZW5kcG9pbnRfbmV3KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IDMzOWY3YWMuLjc0MmJlOTEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtMTE1LDYgKzExNSwxNyBAQAogCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBzY3RwX2NodW5rKSwmc2stPnNrX3JtZW1fYWxsb2MpOwogfQogCitzdHJ1Y3Qgc2N0cF9pbnB1dF9jYiB7CisJdW5pb24geworCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJCXN0cnVjdCBpbmV0Nl9za2JfcGFybQloNjsKKyNlbmRpZgorCX0gaGVhZGVyOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKK307CisjZGVmaW5lIFNDVFBfSU5QVVRfQ0IoX19za2IpCSgoc3RydWN0IHNjdHBfaW5wdXRfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKwogLyoKICAqIFRoaXMgaXMgdGhlIHJvdXRpbmUgd2hpY2ggSVAgY2FsbHMgd2hlbiByZWNlaXZpbmcgYW4gU0NUUCBwYWNrZXQuCiAgKi8KQEAgLTI0Myw2ICsyNTQsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKIAl9CisJU0NUUF9JTlBVVF9DQihza2IpLT5jaHVuayA9IGNodW5rOwogCiAJc2N0cF9yY3Zfc2V0X293bmVyX3Ioc2tiLHNrKTsKIApAQCAtMjY1LDkgKzI3Nyw5IEBACiAJc2N0cF9iaF9sb2NrX3NvY2soc2spOwogCiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCi0JCXNrX2FkZF9iYWNrbG9nKHNrLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlza19hZGRfYmFja2xvZyhzaywgc2tiKTsKIAllbHNlCi0JCXNjdHBfYmFja2xvZ19yY3Yoc2ssIChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJCXNjdHBfYmFja2xvZ19yY3Yoc2ssIHNrYik7CiAKIAkvKiBSZWxlYXNlIHRoZSBzb2NrIGFuZCBhbnkgcmVmZXJlbmNlIGNvdW50cyB3ZSB0b29rIGluIHRoZQogCSAqIGxvb2t1cCBjYWxscy4KQEAgLTMwMiwxNCArMzE0LDggQEAKICAqLwogaW50IHNjdHBfYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKLQlzdHJ1Y3Qgc2N0cF9pbnEgKmlucXVldWU7Ci0KLQkvKiBPbmUgZGF5IGNodW5rIHdpbGwgbGl2ZSBpbnNpZGUgdGhlIHNrYiwgYnV0IGZvcgotCSAqIG5vdyB0aGlzIHdvcmtzLgotCSAqLwotCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYjsKLQlpbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IFNDVFBfSU5QVVRfQ0Ioc2tiKS0+Y2h1bms7CisJc3RydWN0IHNjdHBfaW5xICppbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOwogCiAJc2N0cF9pbnFfcHVzaChpbnF1ZXVlLCBjaHVuayk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzQ1LDcgKzM1MSw2IEBACiAgKgogICovCiB2b2lkIHNjdHBfaWNtcF9wcm90b191bnJlYWNoYWJsZShzdHJ1Y3Qgc29jayAqc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCkKIHsKQEAgLTM2MSw3ICszNjYsNiBAQAogLyogQ29tbW9uIGxvb2t1cCBjb2RlIGZvciBpY21wL2ljbXB2NiBlcnJvciBoYW5kbGVyLiAqLwogc3RydWN0IHNvY2sgKnNjdHBfZXJyX2xvb2t1cChpbnQgZmFtaWx5LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3Qgc2N0cGhkciAqc2N0cGhkciwKLQkJCSAgICAgc3RydWN0IHNjdHBfZW5kcG9pbnQgKiplcHAsCiAJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICoqYXBwLAogCQkJICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKip0cHApCiB7CkBAIC0zNjksMTEgKzM3MywxMCBAQAogCXVuaW9uIHNjdHBfYWRkciBkYWRkcjsKIAlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKLQlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAgPSBOVUxMOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gTlVMTDsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAKLQkqYXBwID0gTlVMTDsgKmVwcCA9IE5VTEw7ICp0cHAgPSBOVUxMOworCSphcHAgPSBOVUxMOyAqdHBwID0gTlVMTDsKIAogCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoZmFtaWx5KTsKIAlpZiAodW5saWtlbHkoIWFmKSkgewpAQCAtMzg4LDI3ICszOTEsMTYgQEAKIAkgKiBwYWNrZXQuCiAJICovCiAJYXNvYyA9IF9fc2N0cF9sb29rdXBfYXNzb2NpYXRpb24oJnNhZGRyLCAmZGFkZHIsICZ0cmFuc3BvcnQpOwotCWlmICghYXNvYykgewotCQkvKiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBhc3NvY2lhdGlvbiwgc2VlIGlmIGl0IG1hdGNoZXMgYW55Ci0JCSAqIGVuZHBvaW50LiBUaGlzIG1heSBoYXBwZW4gZm9yIGFuIElDTVAgZXJyb3IgZ2VuZXJhdGVkIGluCi0JCSAqIHJlc3BvbnNlIHRvIGFuIElOSVRfQUNLLgotCQkgKi8KLQkJZXAgPSBfX3NjdHBfcmN2X2xvb2t1cF9lbmRwb2ludCgmZGFkZHIpOwotCQlpZiAoIWVwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorCWlmICghYXNvYykKKwkJcmV0dXJuIE5VTEw7CisKKwlzayA9IGFzb2MtPmJhc2Uuc2s7CisKKwlpZiAobnRvaGwoc2N0cGhkci0+dnRhZykgIT0gYXNvYy0+Yy5wZWVyX3Z0YWcpIHsKKwkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOworCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoYXNvYykgewotCQlzayA9IGFzb2MtPmJhc2Uuc2s7Ci0KLQkJaWYgKG50b2hsKHNjdHBoZHItPnZ0YWcpICE9IGFzb2MtPmMucGVlcl92dGFnKSB7Ci0JCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0gZWxzZQotCQlzayA9IGVwLT5iYXNlLnNrOwotCiAJc2N0cF9iaF9sb2NrX3NvY2soc2spOwogCiAJLyogSWYgdG9vIG1hbnkgSUNNUHMgZ2V0IGRyb3BwZWQgb24gYnVzeQpAQCAtNDE3LDcgKzQwOSw2IEBACiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMpOwogCi0JKmVwcCA9IGVwOwogCSphcHAgPSBhc29jOwogCSp0cHAgPSB0cmFuc3BvcnQ7CiAJcmV0dXJuIHNrOwpAQCAtNDI2LDIxICs0MTcsMTYgQEAKIAlzb2NrX3B1dChzayk7CiAJaWYgKGFzb2MpCiAJCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOwotCWlmIChlcCkKLQkJc2N0cF9lbmRwb2ludF9wdXQoZXApOwogCXJldHVybiBOVUxMOwogfQogCiAvKiBDb21tb24gY2xlYW51cCBjb2RlIGZvciBpY21wL2ljbXB2NiBlcnJvciBoYW5kbGVyLiAqLwotdm9pZCBzY3RwX2Vycl9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCi0JCSAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit2b2lkIHNjdHBfZXJyX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogewogCXNjdHBfYmhfdW5sb2NrX3NvY2soc2spOwogCXNvY2tfcHV0KHNrKTsKIAlpZiAoYXNvYykKIAkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7Ci0JaWYgKGVwKQotCQlzY3RwX2VuZHBvaW50X3B1dChlcCk7CiB9CiAKIC8qCkBAIC00NjUsNyArNDUxLDYgQEAKIAlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKIAlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0Jc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CkBAIC00ODIsNyArNDY3LDcgQEAKIAlzYXZlc2N0cCAgPSBza2ItPmgucmF3OwogCXNrYi0+bmguaXBoID0gaXBoOwogCXNrYi0+aC5yYXcgPSAoY2hhciAqKXNoOwotCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQsIHNrYiwgc2gsICZlcCwgJmFzb2MsICZ0cmFuc3BvcnQpOworCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQsIHNrYiwgc2gsICZhc29jLCAmdHJhbnNwb3J0KTsKIAkvKiBQdXQgYmFjaywgdGhlIG9yaWdpbmFsIHBvaW50ZXJzLiAqLwogCXNrYi0+bmgucmF3ID0gc2F2ZWlwOwogCXNrYi0+aC5yYXcgPSBzYXZlc2N0cDsKQEAgLTUwOSw3ICs0OTQsNyBAQAogCQl9CiAJCWVsc2UgewogCQkJaWYgKElDTVBfUFJPVF9VTlJFQUNIID09IGNvZGUpIHsKLQkJCQlzY3RwX2ljbXBfcHJvdG9fdW5yZWFjaGFibGUoc2ssIGVwLCBhc29jLAorCQkJCXNjdHBfaWNtcF9wcm90b191bnJlYWNoYWJsZShzaywgYXNvYywKIAkJCQkJCQkgICAgdHJhbnNwb3J0KTsKIAkJCQlnb3RvIG91dF91bmxvY2s7CiAJCQl9CkBAIC01MzgsNyArNTIzLDcgQEAKIAl9CiAKIG91dF91bmxvY2s6Ci0Jc2N0cF9lcnJfZmluaXNoKHNrLCBlcCwgYXNvYyk7CisJc2N0cF9lcnJfZmluaXNoKHNrLCBhc29jKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucXVldWUuYyBiL25ldC9zY3RwL2lucXVldWUuYwppbmRleCBjZWRmNDM1Li4yZDMzOTIyIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCkBAIC01MCw3ICs1MCw3IEBACiAvKiBJbml0aWFsaXplIGFuIFNDVFAgaW5xdWV1ZS4gICovCiB2b2lkIHNjdHBfaW5xX2luaXQoc3RydWN0IHNjdHBfaW5xICpxdWV1ZSkKIHsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZxdWV1ZS0+aW4pOworCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+aW5fY2h1bmtfbGlzdCk7CiAJcXVldWUtPmluX3Byb2dyZXNzID0gTlVMTDsKIAogCS8qIENyZWF0ZSBhIHRhc2sgZm9yIGRlbGl2ZXJpbmcgZGF0YS4gICovCkBAIC02MiwxMSArNjIsMTMgQEAKIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gU0NUUCBpbnF1ZXVlLiAgKi8KIHZvaWQgc2N0cF9pbnFfZnJlZShzdHJ1Y3Qgc2N0cF9pbnEgKnF1ZXVlKQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAKIAkvKiBFbXB0eSB0aGUgcXVldWUuICAqLwotCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiX2RlcXVldWUoJnF1ZXVlLT5pbikpICE9IE5VTEwpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZxdWV1ZS0+aW5fY2h1bmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CisJfQogCiAJLyogSWYgdGhlcmUgaXMgYSBwYWNrZXQgd2hpY2ggaXMgY3VycmVudGx5IGJlaW5nIHdvcmtlZCBvbiwKIAkgKiBmcmVlIGl0IGFzIHdlbGwuCkBAIC05Miw3ICs5NCw3IEBACiAJICogRXZlbnR1YWxseSwgd2Ugc2hvdWxkIGNsZWFuIHVwIGlucXVldWUgdG8gbm90IHJlbHkKIAkgKiBvbiB0aGUgQkggcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMuCiAJICovCi0Jc2tiX3F1ZXVlX3RhaWwoJihxLT5pbiksIChzdHJ1Y3Qgc2tfYnVmZiAqKSBwYWNrZXQpOworCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdCwgJnEtPmluX2NodW5rX2xpc3QpOwogCXEtPmltbWVkaWF0ZS5mdW5jKHEtPmltbWVkaWF0ZS5kYXRhKTsKIH0KIApAQCAtMTMxLDEyICsxMzMsMTYgQEAKIAogCS8qIERvIHdlIG5lZWQgdG8gdGFrZSB0aGUgbmV4dCBwYWNrZXQgb3V0IG9mIHRoZSBxdWV1ZSB0byBwcm9jZXNzPyAqLwogCWlmICghY2h1bmspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKIAkJLyogSXMgdGhlIHF1ZXVlIGVtcHR5PyAgKi8KLSAgICAgICAgCWlmIChza2JfcXVldWVfZW1wdHkoJnF1ZXVlLT5pbikpCisJCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+aW5fY2h1bmtfbGlzdCkpCiAJCQlyZXR1cm4gTlVMTDsKIAorCQllbnRyeSA9IHF1ZXVlLT5pbl9jaHVua19saXN0Lm5leHQ7CiAJCWNodW5rID0gcXVldWUtPmluX3Byb2dyZXNzID0KLQkJCShzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBza2JfZGVxdWV1ZSgmcXVldWUtPmluKTsKKwkJCWxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBzY3RwX2NodW5rLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdChlbnRyeSk7CiAKIAkJLyogVGhpcyBpcyB0aGUgZmlyc3QgY2h1bmsgaW4gdGhlIHBhY2tldC4gICovCiAJCWNodW5rLT5zaW5nbGV0b24gPSAxOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaXB2Ni5jIGIvbmV0L3NjdHAvaXB2Ni5jCmluZGV4IGM3ZTQyZDEuLmU5YjJmZDQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lwdjYuYworKysgYi9uZXQvc2N0cC9pcHY2LmMKQEAgLTkxLDcgKzkxLDYgQEAKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBzY3RwaGRyICpzaCA9IChzdHJ1Y3Qgc2N0cGhkciAqKShza2ItPmRhdGEgKyBvZmZzZXQpOwogCXN0cnVjdCBzb2NrICpzazsKLQlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wOwpAQCAtMTA1LDcgKzEwNCw3IEBACiAJc2F2ZXNjdHAgID0gc2tiLT5oLnJhdzsKIAlza2ItPm5oLmlwdjZoID0gaXBoOwogCXNrYi0+aC5yYXcgPSAoY2hhciAqKXNoOwotCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQ2LCBza2IsIHNoLCAmZXAsICZhc29jLCAmdHJhbnNwb3J0KTsKKwlzayA9IHNjdHBfZXJyX2xvb2t1cChBRl9JTkVUNiwgc2tiLCBzaCwgJmFzb2MsICZ0cmFuc3BvcnQpOwogCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgcG9pbnRlcnMuICovCiAJc2tiLT5uaC5yYXcgPSBzYXZlaXA7CiAJc2tiLT5oLnJhdyA9IHNhdmVzY3RwOwpAQCAtMTI0LDcgKzEyMyw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAljYXNlIElDTVBWNl9QQVJBTVBST0I6CiAJCWlmIChJQ01QVjZfVU5LX05FWFRIRFIgPT0gY29kZSkgewotCQkJc2N0cF9pY21wX3Byb3RvX3VucmVhY2hhYmxlKHNrLCBlcCwgYXNvYywgdHJhbnNwb3J0KTsKKwkJCXNjdHBfaWNtcF9wcm90b191bnJlYWNoYWJsZShzaywgYXNvYywgdHJhbnNwb3J0KTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCQlicmVhazsKQEAgLTE0Miw3ICsxNDEsNyBAQAogCX0KIAogb3V0X3VubG9jazoKLQlzY3RwX2Vycl9maW5pc2goc2ssIGVwLCBhc29jKTsKKwlzY3RwX2Vycl9maW5pc2goc2ssIGFzb2MpOwogb3V0OgogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKIAkJaW42X2Rldl9wdXQoaWRldik7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vYmpjbnQuYyBiL25ldC9zY3RwL29iamNudC5jCmluZGV4IDA3ODFlNWQuLjhmZjU4OGYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL29iamNudC5jCisrKyBiL25ldC9zY3RwL29iamNudC5jCkBAIC0xMjcsOCArMTI3LDEyIEBACiAvKiBJbml0aWFsaXplIHRoZSBvYmpjb3VudCBpbiB0aGUgcHJvYyBmaWxlc3lzdGVtLiAgKi8KIHZvaWQgc2N0cF9kYmdfb2JqY250X2luaXQodm9pZCkKIHsKLQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzY3RwX2RiZ19vYmpjbnQiLCAwLCBwcm9jX25ldF9zY3RwLAorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCWVudCA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInNjdHBfZGJnX29iamNudCIsIDAsIHByb2NfbmV0X3NjdHAsCiAJCQkgICAgICAgc2N0cF9kYmdfb2JqY250X3JlYWQsIE5VTEwpOworCWlmICghZW50KQorCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJInNjdHBfZGJnX29iamNudDogVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeS5cbiIpOwogfQogCiAvKiBDbGVhbnVwIHRoZSBvYmpjb3VudCBlbnRyeSBpbiB0aGUgcHJvYyBmaWxlc3lzdGVtLiAgKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggODRiNWIzNy4uOTMxMzcxNiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXBhY2tldC0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogCXBhY2tldC0+c291cmNlX3BvcnQgPSBzcG9ydDsKIAlwYWNrZXQtPmRlc3RpbmF0aW9uX3BvcnQgPSBkcG9ydDsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZwYWNrZXQtPmNodW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJnBhY2tldC0+Y2h1bmtfbGlzdCk7CiAJaWYgKGFzb2MpIHsKIAkJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spOwkKIAkJb3ZlcmhlYWQgPSBzcC0+cGYtPmFmLT5uZXRfaGVhZGVyX2xlbjsgCkBAIC0xMjksMTIgKzEyOSwxNCBAQAogLyogRnJlZSBhIHBhY2tldC4gICovCiB2b2lkIHNjdHBfcGFja2V0X2ZyZWUoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQpCiB7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldCk7CiAKLSAgICAgICAgd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJnBhY2tldC0+Y2h1bmtzKSkgIT0gTlVMTCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnBhY2tldC0+Y2h1bmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CisJfQogCiAJaWYgKHBhY2tldC0+bWFsbG9jZWQpCiAJCWtmcmVlKHBhY2tldCk7CkBAIC0yNzYsNyArMjc4LDcgQEAKIAkJcGFja2V0LT5oYXNfc2FjayA9IDE7CiAKIAkvKiBJdCBpcyBPSyB0byBzZW5kIHRoaXMgY2h1bmsuICAqLwotCV9fc2tiX3F1ZXVlX3RhaWwoJnBhY2tldC0+Y2h1bmtzLCAoc3RydWN0IHNrX2J1ZmYgKiljaHVuayk7CisJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZwYWNrZXQtPmNodW5rX2xpc3QpOwogCXBhY2tldC0+c2l6ZSArPSBjaHVua19sZW47CiAJY2h1bmstPnRyYW5zcG9ydCA9IHBhY2tldC0+dHJhbnNwb3J0OwogZmluaXNoOgpAQCAtMjk1LDcgKzI5Nyw3IEBACiAJc3RydWN0IHNjdHBoZHIgKnNoOwogCV9fdTMyIGNyYzMyOwogCXN0cnVjdCBza19idWZmICpuc2tiOwotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAJc3RydWN0IHNvY2sgKnNrOwogCWludCBlcnIgPSAwOwogCWludCBwYWRkaW5nOwkJLyogSG93IG11Y2ggcGFkZGluZyBkbyB3ZSBuZWVkPyAgKi8KQEAgLTMwNSwxMSArMzA3LDExIEBACiAJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBwYWNrZXQ6JXBcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0KTsKIAogCS8qIERvIE5PVCBnZW5lcmF0ZSBhIGNodW5rbGVzcyBwYWNrZXQuICovCi0JY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilza2JfcGVlaygmcGFja2V0LT5jaHVua3MpOwotCWlmICh1bmxpa2VseSghY2h1bmspKQorCWlmIChsaXN0X2VtcHR5KCZwYWNrZXQtPmNodW5rX2xpc3QpKQogCQlyZXR1cm4gZXJyOwogCiAJLyogU2V0IHVwIGNvbnZlbmllbmNlIHZhcmlhYmxlcy4uLiAqLworCWNodW5rID0gbGlzdF9lbnRyeShwYWNrZXQtPmNodW5rX2xpc3QubmV4dCwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOwogCXNrID0gY2h1bmstPnNrYi0+c2s7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgbmV3IHNrYi4gICovCkBAIC0zNzAsNyArMzcyLDggQEAKIAkgKiBbVGhpcyB3aG9sZSBjb21tZW50IGV4cGxhaW5zIFdPUkRfUk9VTkQoKSBiZWxvdy5dCiAJICovCiAJU0NUUF9ERUJVR19QUklOVEsoIioqKnNjdHBfdHJhbnNtaXRfcGFja2V0KioqXG4iKTsKLQl3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmcGFja2V0LT5jaHVua3MpKSAhPSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlpZiAoc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkgewogCiAJCQlpZiAoIWNodW5rLT5oYXNfdHNuKSB7CkBAIC01MTEsNyArNTE0LDggQEAKIAkgKiB3aWxsIGdldCByZXNlbnQgb3IgZHJvcHBlZCBsYXRlci4KIAkgKi8KIAotCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZwYWNrZXQtPmNodW5rcykpICE9IE5VTEwpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnBhY2tldC0+Y2h1bmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAJCWlmICghc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkKICAgICAJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwogCX0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHF1ZXVlLmMgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCmluZGV4IDRlYjgxYTEuLmVmYjcyZmEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtNzUsNyArNzUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNjdHBfb3V0cV9oZWFkX2RhdGEoc3RydWN0IHNjdHBfb3V0cSAqcSwKIAkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNoKQogewotCV9fc2tiX3F1ZXVlX2hlYWQoJnEtPm91dCwgKHN0cnVjdCBza19idWZmICopY2gpOworCWxpc3RfYWRkKCZjaC0+bGlzdCwgJnEtPm91dF9jaHVua19saXN0KTsKIAlxLT5vdXRfcWxlbiArPSBjaC0+c2tiLT5sZW47CiAJcmV0dXJuOwogfQpAQCAtODMsMTcgKzgzLDIyIEBACiAvKiBUYWtlIGRhdGEgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9vdXRxX2RlcXVldWVfZGF0YShzdHJ1Y3Qgc2N0cF9vdXRxICpxKQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaDsKLQljaCA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJnEtPm91dCk7Ci0JaWYgKGNoKQorCXN0cnVjdCBzY3RwX2NodW5rICpjaCA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPm91dF9jaHVua19saXN0KSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9IHEtPm91dF9jaHVua19saXN0Lm5leHQ7CisKKwkJY2ggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc2N0cF9jaHVuaywgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoZW50cnkpOwogCQlxLT5vdXRfcWxlbiAtPSBjaC0+c2tiLT5sZW47CisJfQogCXJldHVybiBjaDsKIH0KIC8qIEFkZCBkYXRhIGNodW5rIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiAqLwogc3RhdGljIGlubGluZSB2b2lkIHNjdHBfb3V0cV90YWlsX2RhdGEoc3RydWN0IHNjdHBfb3V0cSAqcSwKIAkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNoKQogewotCV9fc2tiX3F1ZXVlX3RhaWwoJnEtPm91dCwgKHN0cnVjdCBza19idWZmICopY2gpOworCWxpc3RfYWRkX3RhaWwoJmNoLT5saXN0LCAmcS0+b3V0X2NodW5rX2xpc3QpOwogCXEtPm91dF9xbGVuICs9IGNoLT5za2ItPmxlbjsKIAlyZXR1cm47CiB9CkBAIC0xOTcsOCArMjAyLDggQEAKIHZvaWQgc2N0cF9vdXRxX2luaXQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHN0cnVjdCBzY3RwX291dHEgKnEpCiB7CiAJcS0+YXNvYyA9IGFzb2M7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+b3V0KTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5jb250cm9sKTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+b3V0X2NodW5rX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZxLT5yZXRyYW5zbWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmcS0+c2Fja2VkKTsKIAlJTklUX0xJU1RfSEVBRCgmcS0+YWJhbmRvbmVkKTsKQEAgLTIxNyw3ICsyMjIsNyBAQAogewogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmxjaHVuaywgKnBvcywgKnRlbXA7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAogCS8qIFRocm93IGF3YXkgdW5hY2tub3dsZWRnZWQgY2h1bmtzLiAqLwogCWxpc3RfZm9yX2VhY2gocG9zLCAmcS0+YXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CkBAIC0yNjksOCArMjc0LDEwIEBACiAJcS0+ZXJyb3IgPSAwOwogCiAJLyogVGhyb3cgYXdheSBhbnkgbGVmdG92ZXIgY29udHJvbCBjaHVua3MuICovCi0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBza2JfZGVxdWV1ZSgmcS0+Y29udHJvbCkpICE9IE5VTEwpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZxLT5jb250cm9sX2NodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KIH0KIAogLyogRnJlZSB0aGUgb3V0cXVldWUgc3RydWN0dXJlIGFuZCBhbnkgcmVsYXRlZCBwZW5kaW5nIGNodW5rcy4gICovCkBAIC0zMzMsNyArMzQwLDcgQEAKIAkJCWJyZWFrOwogCQl9OwogCX0gZWxzZSB7Ci0JCV9fc2tiX3F1ZXVlX3RhaWwoJnEtPmNvbnRyb2wsIChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5saXN0LCAmcS0+Y29udHJvbF9jaHVua19saXN0KTsKIAkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyk7CiAJfQogCkBAIC02NTAsMTAgKzY1Nyw5IEBACiAJX191MTYgc3BvcnQgPSBhc29jLT5iYXNlLmJpbmRfYWRkci5wb3J0OwogCV9fdTE2IGRwb3J0ID0gYXNvYy0+cGVlci5wb3J0OwogCV9fdTMyIHZ0YWcgPSBhc29jLT5wZWVyLmkuaW5pdF90YWc7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqbmV3X3RyYW5zcG9ydDsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCAqdG1wOwogCXNjdHBfeG1pdF90IHN0YXR1czsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBzdGFydF90aW1lciA9IDA7CkBAIC02NzUsOCArNjgxLDkgQEAKIAkgKiAgIC4uLgogCSAqLwogCi0JcXVldWUgPSAmcS0+Y29udHJvbDsKLQl3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopc2tiX2RlcXVldWUocXVldWUpKSAhPSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZxLT5jb250cm9sX2NodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOworCiAJCS8qIFBpY2sgdGhlIHJpZ2h0IHRyYW5zcG9ydCB0byB1c2UuICovCiAJCW5ld190cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OwogCkBAIC04MTQsOCArODIxLDYgQEAKIAogCQkvKiBGaW5hbGx5LCB0cmFuc21pdCBuZXcgcGFja2V0cy4gICovCiAJCXN0YXJ0X3RpbWVyID0gMDsKLQkJcXVldWUgPSAmcS0+b3V0OwotCiAJCXdoaWxlICgoY2h1bmsgPSBzY3RwX291dHFfZGVxdWV1ZV9kYXRhKHEpKSAhPSBOVUxMKSB7CiAJCQkvKiBSRkMgMjk2MCA2LjUgRXZlcnkgREFUQSBjaHVuayBNVVNUIGNhcnJ5IGEgdmFsaWQKIAkJCSAqIHN0cmVhbSBpZGVudGlmaWVyLgpAQCAtMTE0OSw4ICsxMTU0LDkgQEAKIAkvKiBTZWUgaWYgYWxsIGNodW5rcyBhcmUgYWNrZWQuCiAJICogTWFrZSBzdXJlIHRoZSBlbXB0eSBxdWV1ZSBoYW5kbGVyIHdpbGwgZ2V0IHJ1biBsYXRlci4KIAkgKi8KLQlxLT5lbXB0eSA9IHNrYl9xdWV1ZV9lbXB0eSgmcS0+b3V0KSAmJiBza2JfcXVldWVfZW1wdHkoJnEtPmNvbnRyb2wpICYmCi0JCQlsaXN0X2VtcHR5KCZxLT5yZXRyYW5zbWl0KTsKKwlxLT5lbXB0eSA9IChsaXN0X2VtcHR5KCZxLT5vdXRfY2h1bmtfbGlzdCkgJiYKKwkJICAgIGxpc3RfZW1wdHkoJnEtPmNvbnRyb2xfY2h1bmtfbGlzdCkgJiYKKwkJICAgIGxpc3RfZW1wdHkoJnEtPnJldHJhbnNtaXQpKTsKIAlpZiAoIXEtPmVtcHR5KQogCQlnb3RvIGZpbmlzaDsKIApAQCAtMTY3OSw5ICsxNjg1LDkgQEAKIAkJaWYgKFRTTl9sdGUodHNuLCBjdHNuKSkgewogCQkJbGlzdF9kZWxfaW5pdChsY2h1bmspOwogCQkJaWYgKCFjaHVuay0+dHNuX2dhcF9hY2tlZCkgewotCQkJY2h1bmstPnRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgLT0KLQkJCQkJCSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7Ci0JCQlxLT5vdXRzdGFuZGluZ19ieXRlcyAtPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CisJCQkJY2h1bmstPnRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgLT0KKwkJCQkJc2N0cF9kYXRhX3NpemUoY2h1bmspOworCQkJCXEtPm91dHN0YW5kaW5nX2J5dGVzIC09IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKIAkJCX0KIAkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CiAJCX0gZWxzZSB7CkBAIC0xNzI5LDcgKzE3MzUsNyBAQAogCQkJCQkgICAgICBuc2tpcHMsICZmdHNuX3NraXBfYXJyWzBdKTsgCiAKIAlpZiAoZnRzbl9jaHVuaykgewotCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5jb250cm9sLCAoc3RydWN0IHNrX2J1ZmYgKilmdHNuX2NodW5rKTsKKwkJbGlzdF9hZGRfdGFpbCgmZnRzbl9jaHVuay0+bGlzdCwgJnEtPmNvbnRyb2xfY2h1bmtfbGlzdCk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb3RvY29sLmMgYi9uZXQvc2N0cC9wcm90b2NvbC5jCmluZGV4IDUxMzVlMWEuLmNlOTI0NWUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb3RvY29sLmMKKysrIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAKIC8qIENvcHkgdGhlIGxvY2FsIGFkZHJlc3NlcyB3aGljaCBhcmUgdmFsaWQgZm9yICdzY29wZScgaW50byAnYnAnLiAgKi8KIGludCBzY3RwX2NvcHlfbG9jYWxfYWRkcl9saXN0KHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsIHNjdHBfc2NvcGVfdCBzY29wZSwKLQkJCSAgICAgIGludCBnZnAsIGludCBjb3B5X2ZsYWdzKQorCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgaW50IGNvcHlfZmxhZ3MpCiB7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CiAJaW50IGVycm9yID0gMDsKQEAgLTEwNTAsNyArMTA1MCwxMCBAQAogCXNjdHBfc25kYnVmX3BvbGljeQkJPSAwOwogCiAJLyogSEIuaW50ZXJ2YWwgICAgICAgICAgICAgIC0gMzAgc2Vjb25kcyAqLwotCXNjdHBfaGJfaW50ZXJ2YWwJCT0gMzAgKiBIWjsKKwlzY3RwX2hiX2ludGVydmFsCQk9IFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKKworCS8qIGRlbGF5ZWQgU0FDSyB0aW1lb3V0ICovCisJc2N0cF9zYWNrX3RpbWVvdXQJCT0gU0NUUF9ERUZBVUxUX1RJTUVPVVRfU0FDSzsKIAogCS8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIHZhcmlhYmxlcy4gKi8KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IDViYWVkOWIuLjAwZDMyYjcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTc4LDcgKzc4LDcgQEAKIHN0YXRpYyBpbnQgc2N0cF9wcm9jZXNzX3BhcmFtKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJICAgICAgdW5pb24gc2N0cF9wYXJhbXMgcGFyYW0sCiAJCQkgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBlZXJfYWRkciwKLQkJCSAgICAgIGludCBnZnApOworCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIC8qIFdoYXQgd2FzIHRoZSBpbmJvdW5kIGludGVyZmFjZSBmb3IgdGhpcyBjaHVuaz8gKi8KIGludCBzY3RwX2NodW5rX2lpZihjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCkBAIC0xNzQsNyArMTc0LDcgQEAKICAqLwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLAotCQkJICAgICBpbnQgZ2ZwLCBpbnQgdnBhcmFtX2xlbikKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgaW50IHZwYXJhbV9sZW4pCiB7CiAJc2N0cF9pbml0aGRyX3QgaW5pdDsKIAl1bmlvbiBzY3RwX3BhcmFtcyBhZGRyczsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2luaXRfYWNrKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJIGludCBnZnAsIGludCB1bmtwYXJhbV9sZW4pCisJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCB1bmtwYXJhbV9sZW4pCiB7CiAJc2N0cF9pbml0aGRyX3QgaW5pdGFjazsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOwpAQCAtMTAwMyw2ICsxMDAzLDcgQEAKIAkJU0NUUF9ERUJVR19QUklOVEsoImNodW5raWZ5aW5nIHNrYiAlcCB3L28gYW4gc2tcbiIsIHNrYik7CiAJfQogCisJSU5JVF9MSVNUX0hFQUQoJnJldHZhbC0+bGlzdCk7CiAJcmV0dmFsLT5za2IJCT0gc2tiOwogCXJldHZhbC0+YXNvYwkJPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jOwogCXJldHZhbC0+cmVzZW50ICAJPSAwOwpAQCAtMTExNiw4ICsxMTE3LDcgQEAKIC8qIFBvc3NpYmx5LCBmcmVlIHRoZSBjaHVuay4gICovCiB2b2lkIHNjdHBfY2h1bmtfZnJlZShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCiB7Ci0JLyogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBvbiBhbnkgbGlzdC4gICovCi0Jc2tiX3VubGluaygoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCUJVR19PTighbGlzdF9lbXB0eSgmY2h1bmstPmxpc3QpKTsKIAlsaXN0X2RlbF9pbml0KCZjaHVuay0+dHJhbnNtaXR0ZWRfbGlzdCk7CiAKIAkvKiBSZWxlYXNlIG91ciByZWZlcmVuY2Ugb24gdGhlIG1lc3NhZ2UgdHJhY2tlci4gKi8KQEAgLTEyMzMsNyArMTIzMyw4IEBACiAKIC8qIENyZWF0ZSBhIENMT1NFRCBhc3NvY2lhdGlvbiB0byB1c2Ugd2l0aCBhbiBpbmNvbWluZyBwYWNrZXQuICAqLwogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfbWFrZV90ZW1wX2Fzb2MoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAotCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGludCBnZnApCisJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTM0OCw3ICsxMzQ5LDcgQEAKIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX3VucGFja19jb29raWUoCiAJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgaW50IGdmcCwKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCiAJaW50ICplcnJvciwgc3RydWN0IHNjdHBfY2h1bmsgKiplcnJwKQogewogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpyZXR2YWwgPSBOVUxMOwpAQCAtMTgxMiw3ICsxODEzLDcgQEAKICAqLwogaW50IHNjdHBfcHJvY2Vzc19pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBzY3RwX2NpZF90IGNpZCwKIAkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyX2FkZHIsCi0JCSAgICAgIHNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQsIGludCBnZnApCisJCSAgICAgIHNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJdW5pb24gc2N0cF9wYXJhbXMgcGFyYW07CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CkBAIC0xOTgzLDcgKzE5ODQsNyBAQAogc3RhdGljIGludCBzY3RwX3Byb2Nlc3NfcGFyYW0oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkgICAgICB1bmlvbiBzY3RwX3BhcmFtcyBwYXJhbSwKIAkJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlcl9hZGRyLAotCQkJICAgICAgaW50IGdmcCkKKwkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJdW5pb24gc2N0cF9hZGRyIGFkZHI7CiAJaW50IGk7CkBAIC0yNzM5LDggKzI3NDAsMTIgQEAKIAlhc29jLT5hZGRpcF9sYXN0X2FzY29uZiA9IE5VTEw7CiAKIAkvKiBTZW5kIHRoZSBuZXh0IGFzY29uZiBjaHVuayBmcm9tIHRoZSBhZGRpcCBjaHVuayBxdWV1ZS4gKi8KLQlhc2NvbmYgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZhc29jLT5hZGRpcF9jaHVua3MpOwotCWlmIChhc2NvbmYpIHsKKwlpZiAoIWxpc3RfZW1wdHkoJmFzb2MtPmFkZGlwX2NodW5rX2xpc3QpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gYXNvYy0+YWRkaXBfY2h1bmtfbGlzdC5uZXh0OworCQlhc2NvbmYgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc2N0cF9jaHVuaywgbGlzdCk7CisKKwkJbGlzdF9kZWxfaW5pdChlbnRyeSk7CisKIAkJLyogSG9sZCB0aGUgY2h1bmsgdW50aWwgYW4gQVNDT05GX0FDSyBpcyByZWNlaXZlZC4gKi8KIAkJc2N0cF9jaHVua19ob2xkKGFzY29uZik7CiAJCWlmIChzY3RwX3ByaW1pdGl2ZV9BU0NPTkYoYXNvYywgYXNjb25mKSkKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCA3Nzg2MzlkLi4zOWM5NzBiIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC02Myw3ICs2Myw3IEBACiAJCQkJdm9pZCAqZXZlbnRfYXJnLAogCQkJIAlzY3RwX2Rpc3Bvc2l0aW9uX3Qgc3RhdHVzLAogCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKLQkJCQlpbnQgZ2ZwKTsKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHN0YXRpYyBpbnQgc2N0cF9zaWRlX2VmZmVjdHMoc2N0cF9ldmVudF90IGV2ZW50X3R5cGUsIHNjdHBfc3VidHlwZV90IHN1YnR5cGUsCiAJCQkgICAgIHNjdHBfc3RhdGVfdCBzdGF0ZSwKIAkJCSAgICAgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLApAQCAtNzEsNyArNzEsNyBAQAogCQkJICAgICB2b2lkICpldmVudF9hcmcsCiAJCQkgICAgIHNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCiAJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKLQkJCSAgICAgaW50IGdmcCk7CisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEhlbHBlciBmdW5jdGlvbnMKQEAgLTQ5Nyw3ICs0OTcsOCBAQAogc3RhdGljIGludCBzY3RwX2NtZF9wcm9jZXNzX2luaXQoc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAogCQkJCSBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkJCSBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LCBpbnQgZ2ZwKQorCQkJCSBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LAorCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCWludCBlcnJvcjsKIApAQCAtODUyLDcgKzg1Myw3IEBACiAJICAgICAgIHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKIAkgICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJICAgICAgIHZvaWQgKmV2ZW50X2FyZywKLQkgICAgICAgaW50IGdmcCkKKwkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzY3RwX2NtZF9zZXFfdCBjb21tYW5kczsKIAljb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgKnN0YXRlX2ZuOwpAQCAtODk3LDcgKzg5OCw3IEBACiAJCQkgICAgIHZvaWQgKmV2ZW50X2FyZywKIAkJCSAgICAgc2N0cF9kaXNwb3NpdGlvbl90IHN0YXR1cywKIAkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAotCQkJICAgICBpbnQgZ2ZwKQorCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCWludCBlcnJvcjsKIApAQCAtOTg1LDcgKzk4Niw3IEBACiAJCQkJdm9pZCAqZXZlbnRfYXJnLAogCQkJIAlzY3RwX2Rpc3Bvc2l0aW9uX3Qgc3RhdHVzLAogCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKLQkJCQlpbnQgZ2ZwKQorCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgZm9yY2U7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IGFhZDU1ZGMuLjA5MWE2NmYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC00MDYsNyArNDA2LDcgQEAKIAkgKiB0cmFuc21pc3Npb24uCiAJICovCQogCWlmIChhc29jLT5hZGRpcF9sYXN0X2FzY29uZikgewotCQlfX3NrYl9xdWV1ZV90YWlsKCZhc29jLT5hZGRpcF9jaHVua3MsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNodW5rKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZhc29jLT5hZGRpcF9jaHVua19saXN0KTsKIAkJZ290byBvdXQ7CQogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc3NubWFwLmMgYi9uZXQvc2N0cC9zc25tYXAuYwppbmRleCBlNjI3ZDJiLi4yNTAzN2RhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zc25tYXAuYworKysgYi9uZXQvc2N0cC9zc25tYXAuYwpAQCAtNTcsNyArNTcsOCBAQAogLyogQ3JlYXRlIGEgbmV3IHNjdHBfc3NubWFwLgogICogQWxsb2NhdGUgcm9vbSB0byBzdG9yZSBhdCBsZWFzdCAnbGVuJyBjb250aWd1b3VzIFRTTnMuCiAgKi8KLXN0cnVjdCBzY3RwX3Nzbm1hcCAqc2N0cF9zc25tYXBfbmV3KF9fdTE2IGluLCBfX3UxNiBvdXQsIGludCBnZnApCitzdHJ1Y3Qgc2N0cF9zc25tYXAgKnNjdHBfc3NubWFwX25ldyhfX3UxNiBpbiwgX191MTYgb3V0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3Nzbm1hcCAqcmV0dmFsOwogCWludCBzaXplOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc3lzY3RsLmMgYi9uZXQvc2N0cC9zeXNjdGwuYwppbmRleCA3ZmMzMTg0Li5kYzQ4OTM0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zeXNjdGwuYworKysgYi9uZXQvc2N0cC9zeXNjdGwuYwpAQCAtNDcsNiArNDcsOCBAQAogc3RhdGljIGN0bF9oYW5kbGVyIHNjdHBfc3lzY3RsX2ppZmZpZXNfbXM7CiBzdGF0aWMgbG9uZyBydG9fdGltZXJfbWluID0gMTsKIHN0YXRpYyBsb25nIHJ0b190aW1lcl9tYXggPSA4NjQwMDAwMDsgLyogT25lIGRheSAqLworc3RhdGljIGxvbmcgc2Fja190aW1lcl9taW4gPSAxOworc3RhdGljIGxvbmcgc2Fja190aW1lcl9tYXggPSA1MDA7CiAKIHN0YXRpYyBjdGxfdGFibGUgc2N0cF90YWJsZVtdID0gewogCXsKQEAgLTE4Nyw2ICsxODksMTcgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1NBQ0tfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gInNhY2tfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzY3RwX3NhY2tfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YobG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc2N0cF9zeXNjdGxfamlmZmllc19tcywKKwkJLmV4dHJhMSAgICAgICAgID0gJnNhY2tfdGltZXJfbWluLAorCQkuZXh0cmEyICAgICAgICAgPSAmc2Fja190aW1lcl9tYXgsCisJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwppbmRleCAwZWMwZmRlLi5kMmYwNGViIDEwMDY0NAotLS0gYS9uZXQvc2N0cC90cmFuc3BvcnQuYworKysgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwpAQCAtNTcsNyArNTcsNyBAQAogLyogSW5pdGlhbGl6ZSBhIG5ldyB0cmFuc3BvcnQgZnJvbSBwcm92aWRlZCBtZW1vcnkuICAqLwogc3RhdGljIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF90cmFuc3BvcnRfaW5pdChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnBlZXIsCiAJCQkJCQkgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwKLQkJCQkJCSAgaW50IGdmcCkKKwkJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAkvKiBDb3B5IGluIHRoZSBhZGRyZXNzLiAgKi8KIAlwZWVyLT5pcGFkZHIgPSAqYWRkcjsKQEAgLTEwMyw3ICsxMDMsNiBAQAogCiAJLyogU2V0IHVwIHRoZSBoZWFydGJlYXQgdGltZXIuICovCiAJaW5pdF90aW1lcigmcGVlci0+aGJfdGltZXIpOwotCXBlZXItPmhiX2ludGVydmFsID0gU0NUUF9ERUZBVUxUX1RJTUVPVVRfSEVBUlRCRUFUOwogCXBlZXItPmhiX3RpbWVyLmZ1bmN0aW9uID0gc2N0cF9nZW5lcmF0ZV9oZWFydGJlYXRfZXZlbnQ7CiAJcGVlci0+aGJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBlZXI7CiAKQEAgLTEyMiw3ICsxMjEsOCBAQAogfQogCiAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB0cmFuc3BvcnQuICAqLwotc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9uZXcoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLCBpbnQgZ2ZwKQorc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9uZXcoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLAorCQkJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAgICAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCAxN2QwZmY1Li4wYWJkNTEwIDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogLyogQ3JlYXRlIGEgbmV3IHNjdHBfdWxwZXZlbnQuICAqLwogU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbmV3KGludCBzaXplLCBpbnQgbXNnX2ZsYWdzLAotCQkJCQkJICAgIGludCBnZnApCisJCQkJCQkgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEzNiw3ICsxMzYsNyBAQAogc3RydWN0IHNjdHBfdWxwZXZlbnQgICpzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCV9fdTE2IGZsYWdzLCBfX3UxNiBzdGF0ZSwgX191MTYgZXJyb3IsIF9fdTE2IG91dGJvdW5kLAotCV9fdTE2IGluYm91bmQsIGludCBnZnApCisJX191MTYgaW5ib3VuZCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CkBAIC0yMzcsNyArMjM3LDcgQEAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcGVlcl9hZGRyX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWFkZHIsCi0JaW50IGZsYWdzLCBpbnQgc3RhdGUsIGludCBlcnJvciwgaW50IGdmcCkKKwlpbnQgZmxhZ3MsIGludCBzdGF0ZSwgaW50IGVycm9yLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9wYWRkcl9jaGFuZ2UgICpzcGM7CkBAIC0zNTAsNyArMzUwLDcgQEAKICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9yZW1vdGVfZXJyb3IoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQlfX3UxNiBmbGFncywgaW50IGdmcCkKKwlfX3UxNiBmbGFncywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfcmVtb3RlX2Vycm9yICpzcmU7CkBAIC00NDgsNyArNDQ4LDcgQEAKICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9zZW5kX2ZhaWxlZCgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCV9fdTE2IGZsYWdzLCBfX3UzMiBlcnJvciwgaW50IGdmcCkKKwlfX3UxNiBmbGFncywgX191MzIgZXJyb3IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkICpzc2Y7CkBAIC01NTcsNyArNTU3LDcgQEAKICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9zaHV0ZG93bl9ldmVudCgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKLQlfX3UxNiBmbGFncywgaW50IGdmcCkKKwlfX3UxNiBmbGFncywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfc2h1dGRvd25fZXZlbnQgKnNzZTsKQEAgLTYyMCw3ICs2MjAsNyBAQAogICogNS4zLjEuNiBTQ1RQX0FEQVBUSU9OX0lORElDQVRJT04KICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9hZGFwdGlvbl9pbmRpY2F0aW9uKAotCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKQorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9hZGFwdGlvbl9ldmVudCAqc2FpOwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmN2bXNnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkJCQkJaW50IGdmcCkKKwkJCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50ID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNzE4LDcgKzcxOCw4IEBACiAgKiAgIHZhcmlvdXMgZXZlbnRzLgogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3BkYXBpKAotCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBfX3UzMiBpbmRpY2F0aW9uLCBpbnQgZ2ZwKQorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBfX3UzMiBpbmRpY2F0aW9uLAorCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX3BkYXBpX2V2ZW50ICpwZDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IGQ1ZGQyY2YuLjhiYmMyNzkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvdWxwcXVldWUuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIC8qIFByb2Nlc3MgYW4gaW5jb21pbmcgREFUQSBjaHVuay4gICovCiBpbnQgc2N0cF91bHBxX3RhaWxfZGF0YShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQlpbnQgZ2ZwKQorCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHRlbXA7CiAJc2N0cF9kYXRhX2NodW5rX3QgKmhkcjsKQEAgLTc3OCw3ICs3NzgsOCBAQAogCiAvKiBQYXJ0aWFsIGRlbGl2ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgYXMgdGhlcmUgaXMgcHJlc3N1cmUgb24gcnduZC4gKi8KIHZvaWQgc2N0cF91bHBxX3BhcnRpYWxfZGVsaXZlcnkoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwKLQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGludCBnZnApCisJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwpAQCAtODAyLDcgKzgwMyw3IEBACiAKIC8qIFJlbmVnZSBzb21lIHBhY2tldHMgdG8gbWFrZSByb29tIGZvciBhbiBpbmNvbWluZyBjaHVuay4gICovCiB2b2lkIHNjdHBfdWxwcV9yZW5lZ2Uoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkgICAgICBpbnQgZ2ZwKQorCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCV9fdTE2IG5lZWRlZCwgZnJlZWQ7CkBAIC04NDEsNyArODQyLDcgQEAKIC8qIE5vdGlmeSB0aGUgYXBwbGljYXRpb24gaWYgYW4gYXNzb2NpYXRpb24gaXMgYWJvcnRlZCBhbmQgaW4KICAqIHBhcnRpYWwgZGVsaXZlcnkgbW9kZS4gIFNlbmQgdXAgYW55IHBlbmRpbmcgcmVjZWl2ZWQgbWVzc2FnZXMuCiAgKi8KLXZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIGludCBnZnApCit2b2lkIHNjdHBfdWxwcV9hYm9ydF9wZChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldiA9IE5VTEw7CiAJc3RydWN0IHNvY2sgKnNrOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYwppbmRleCAyNjlmMjE3Li4zYzY1NGUwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnQuYworKysgYi9uZXQvc3VucnBjL3hwcnQuYwpAQCAtMTQ1LDggKzE0NSw2IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoWFBSVF9MT0NLRUQsICZ4cHJ0LT5zb2Nrc3RhdGUpKSB7CiAJCWlmICh0YXNrID09IHhwcnQtPnNuZF90YXNrKQogCQkJcmV0dXJuIDE7Ci0JCWlmICh0YXNrID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKIAkJZ290byBvdXRfc2xlZXA7CiAJfQogCWlmICh4cHJ0LT5ub2NvbmcgfHwgX194cHJ0X2dldF9jb25nKHhwcnQsIHRhc2spKSB7CmRpZmYgLS1naXQgYS9uZXQvdW5peC9LY29uZmlnIGIvbmV0L3VuaXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY5NzMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3VuaXgvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACisjCisjIFVuaXggRG9tYWluIFNvY2tldHMKKyMKKworY29uZmlnIFVOSVgKKwl0cmlzdGF0ZSAiVW5peCBkb21haW4gc29ja2V0cyIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgaW5jbHVkZSBzdXBwb3J0IGZvciBVbml4IGRvbWFpbiBzb2NrZXRzOworCSAgc29ja2V0cyBhcmUgdGhlIHN0YW5kYXJkIFVuaXggbWVjaGFuaXNtIGZvciBlc3RhYmxpc2hpbmcgYW5kCisJICBhY2Nlc3NpbmcgbmV0d29yayBjb25uZWN0aW9ucy4gIE1hbnkgY29tbW9ubHkgdXNlZCBwcm9ncmFtcyBzdWNoIGFzCisJICB0aGUgWCBXaW5kb3cgc3lzdGVtIGFuZCBzeXNsb2cgdXNlIHRoZXNlIHNvY2tldHMgZXZlbiBpZiB5b3VyCisJICBtYWNoaW5lIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IG5ldHdvcmsuICBVbmxlc3MgeW91IGFyZSB3b3JraW5nIG9uCisJICBhbiBlbWJlZGRlZCBzeXN0ZW0gb3Igc29tZXRoaW5nIHNpbWlsYXIsIHlvdSB0aGVyZWZvcmUgZGVmaW5pdGVseQorCSAgd2FudCB0byBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB1bml4LiAgTm90ZSB0aGF0IHNldmVyYWwgaW1wb3J0YW50IHNlcnZpY2VzIHdvbid0IHdvcmsKKwkgIGNvcnJlY3RseSBpZiB5b3Ugc2F5IE0gaGVyZSBhbmQgdGhlbiBuZWdsZWN0IHRvIGxvYWQgdGhlIG1vZHVsZS4KKworCSAgU2F5IFkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGM0MjBlYmEuLmQ0MDNlMzQgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTMwMiw3ICszMDIsNyBAQAogICogbWF5IHJlY2VpdmUgbWVzc2FnZXMgb25seSBmcm9tIHRoYXQgcGVlci4gKi8KIHN0YXRpYyB2b2lkIHVuaXhfZGdyYW1fZGlzY29ubmVjdGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKm90aGVyKQogewotCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CiAJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZ1bml4X3NrKHNrKS0+cGVlcl93YWl0KTsKIApAQCAtMTYxOSw3ICsxNjE5LDcgQEAKIAlmb3IgKDs7KSB7CiAJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAogCQkgICAgc2stPnNrX2VyciB8fAogCQkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKIAkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL0tjb25maWcgYi9uZXQvd2Fucm91dGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlYmUxYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC93YW5yb3V0ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDI5IEBACisjCisjIENvbmZpZ3VyYXRpb24gZm9yIFdBTiByb3V0ZXIKKyMKKworY29uZmlnIFdBTl9ST1VURVIKKwl0cmlzdGF0ZSAiV0FOIHJvdXRlciIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFdpZGUgQXJlYSBOZXR3b3JrcyAoV0FOcyksIHN1Y2ggYXMgWC4yNSwgZnJhbWUgcmVsYXkgYW5kIGxlYXNlZAorCSAgbGluZXMsIGFyZSB1c2VkIHRvIGludGVyY29ubmVjdCBMb2NhbCBBcmVhIE5ldHdvcmtzIChMQU5zKSBvdmVyIHZhc3QKKwkgIGRpc3RhbmNlcyB3aXRoIGRhdGEgdHJhbnNmZXIgcmF0ZXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aG9zZQorCSAgYWNoaWV2YWJsZSB3aXRoIGNvbW1vbmx5IHVzZWQgYXN5bmNocm9ub3VzIG1vZGVtIGNvbm5lY3Rpb25zLgorCSAgVXN1YWxseSwgYSBxdWl0ZSBleHBlbnNpdmUgZXh0ZXJuYWwgZGV2aWNlIGNhbGxlZCBhIGBXQU4gcm91dGVyJyBpcworCSAgbmVlZGVkIHRvIGNvbm5lY3QgdG8gYSBXQU4uCisKKwkgIEFzIGFuIGFsdGVybmF0aXZlLCBXQU4gcm91dGluZyBjYW4gYmUgYnVpbHQgaW50byB0aGUgTGludXgga2VybmVsLgorCSAgV2l0aCByZWxhdGl2ZWx5IGluZXhwZW5zaXZlIFdBTiBpbnRlcmZhY2UgY2FyZHMgYXZhaWxhYmxlIG9uIHRoZQorCSAgbWFya2V0LCBhIHBlcmZlY3RseSB1c2FibGUgcm91dGVyIGNhbiBiZSBidWlsdCBmb3IgbGVzcyB0aGFuIGhhbGYKKwkgIHRoZSBwcmljZSBvZiBhbiBleHRlcm5hbCByb3V0ZXIuICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UgY2FyZHMgYW5kCisJICB3aXNoIHRvIHVzZSB5b3VyIExpbnV4IGJveCBhcyBhIFdBTiByb3V0ZXIsIHNheSBZIGhlcmUgYW5kIGFsc28gdG8KKwkgIHRoZSBXQU4gZHJpdmVyIGZvciB5b3VyIGNhcmQsIGJlbG93LiAgWW91IHdpbGwgdGhlbiBuZWVkIHRoZQorCSAgd2FuLXRvb2xzIHBhY2thZ2Ugd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20gPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+LgorCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSBXQU4gcm91dGluZyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5yb3V0ZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCmluZGV4IGQ2ODQ0YWMuLjEzYjY1MGEgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCisrKyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCkBAIC0zNTgsMTAgKzM1OCwxMCBAQAogICovCiAKIAotdW5zaWduZWQgc2hvcnQgd2Fucm91dGVyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK19fYmUxNiB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBjbnQgPSBza2ItPmRhdGFbMF0gPyAwIDogMTsJLyogdGhlcmUgbWF5IGJlIGEgcGFkIHByZXNlbnQgKi8KLQl1bnNpZ25lZCBzaG9ydCBldGhlcnR5cGU7CisJX19iZTE2IGV0aGVydHlwZTsKIAogCXN3aXRjaCAoc2tiLT5kYXRhW2NudF0pIHsKIAljYXNlIE5MUElEX0lQOgkJLyogSVAgZGF0YWdyYW1tICovCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJCQlza2ItPmRhdGFbY250KzNdLCBkZXYtPm5hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJZXRoZXJ0eXBlID0gKigodW5zaWduZWQgc2hvcnQqKSZza2ItPmRhdGFbY250KzRdKTsKKwkJZXRoZXJ0eXBlID0gKigoX19iZTE2Kikmc2tiLT5kYXRhW2NudCs0XSk7CiAJCWNudCArPSA2OwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbmV0L3gyNS9LY29uZmlnIGIvbmV0L3gyNS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L0tjb25maWcKQEAgLTAsMCArMSwzNiBAQAorIworIyBDQ0lUVCBYLjI1IFBhY2tldCBMYXllcgorIworCitjb25maWcgWDI1CisJdHJpc3RhdGUgIkNDSVRUIFguMjUgUGFja2V0IExheWVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgWC4yNSBpcyBhIHNldCBvZiBzdGFuZGFyZGl6ZWQgbmV0d29yayBwcm90b2NvbHMsIHNpbWlsYXIgaW4gc2NvcGUgdG8KKwkgIGZyYW1lIHJlbGF5OyB0aGUgb25lIHBoeXNpY2FsIGxpbmUgZnJvbSB5b3VyIGJveCB0byB0aGUgWC4yNSBuZXR3b3JrCisJICBlbnRyeSBwb2ludCBjYW4gY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zCisJICAoY2FsbGVkICJ2aXJ0dWFsIGNpcmN1aXRzIikgdG8gb3RoZXIgY29tcHV0ZXJzIGNvbm5lY3RlZCB0byB0aGUgWC4yNQorCSAgbmV0d29yay4gR292ZXJubWVudHMsIGJhbmtzLCBhbmQgb3RoZXIgb3JnYW5pemF0aW9ucyB0ZW5kIHRvIHVzZSBpdAorCSAgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIG9yIHRvIGZvcm0gV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKS4gTWFueQorCSAgY291bnRyaWVzIGhhdmUgcHVibGljIFguMjUgbmV0d29ya3MuIFguMjUgY29uc2lzdHMgb2YgdHdvCisJICBwcm90b2NvbHM6IHRoZSBoaWdoZXIgbGV2ZWwgUGFja2V0IExheWVyIFByb3RvY29sIChQTFApIChzYXkgWSBoZXJlCisJICBpZiB5b3Ugd2FudCB0aGF0KSBhbmQgdGhlIGxvd2VyIGxldmVsIGRhdGEgbGluayBsYXllciBwcm90b2NvbCBMQVBCCisJICAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rIERyaXZlciIgYmVsb3cgaWYgeW91IHdhbnQgdGhhdCkuCisKKwkgIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFguMjUgYXQgPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20veDI1Lmh0bT4gYW5kCisJICA8aHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvc29mdHdhcmUvaW9zMTEvY2Jvb2svY3gyNS5odG0+LgorCSAgSW5mb3JtYXRpb24gYWJvdXQgWC4yNSBmb3IgTGludXggaXMgY29udGFpbmVkIGluIHRoZSBmaWxlcworCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS50eHQ+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQ+LgorCisJICBPbmUgY29ubmVjdHMgdG8gYW4gWC4yNSBuZXR3b3JrIGVpdGhlciB3aXRoIGEgZGVkaWNhdGVkIG5ldHdvcmsgY2FyZAorCSAgdXNpbmcgdGhlIFguMjEgcHJvdG9jb2wgKG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IExpbnV4KSBvciBvbmUgY2FuIGRvCisJICBYLjI1IG92ZXIgYSBzdGFuZGFyZCB0ZWxlcGhvbmUgbGluZSB1c2luZyBhbiBvcmRpbmFyeSBtb2RlbSAoc2F5IFkKKwkgIHRvICJYLjI1IGFzeW5jIGRyaXZlciIgYmVsb3cpIG9yIG92ZXIgRXRoZXJuZXQgdXNpbmcgYW4gb3JkaW5hcnkKKwkgIEV0aGVybmV0IGNhcmQgYW5kIHRoZSBMQVBCIG92ZXIgRXRoZXJuZXQgKHNheSBZIHRvICJMQVBCIERhdGEgTGluaworCSAgRHJpdmVyIiBhbmQgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIiIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgeDI1LiBJZiB1bnN1cmUsIHNheSBOLgorCisKZGlmZiAtLWdpdCBhL25ldC94ZnJtL0tjb25maWcgYi9uZXQveGZybS9LY29uZmlnCmluZGV4IDU4Y2E2YTkuLjBjMWMwNDMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL0tjb25maWcKKysrIGIvbmV0L3hmcm0vS2NvbmZpZwpAQCAtMSw2ICsxLDEwIEBACiAjCiAjIFhGUk0gY29uZmlndXJhdGlvbgogIworY29uZmlnIFhGUk0KKyAgICAgICBib29sCisgICAgICAgZGVwZW5kcyBvbiBORVQKKwogY29uZmlnIFhGUk1fVVNFUgogCXRyaXN0YXRlICJJUHNlYyB1c2VyIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIgogCWRlcGVuZHMgb24gSU5FVCAmJiBYRlJNCkBAIC0xMCwzICsxNCwxNCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgTkVUX0tFWQorCXRyaXN0YXRlICJQRl9LRVkgc29ja2V0cyIKKwlzZWxlY3QgWEZSTQorCS0tLWhlbHAtLS0KKwkgIFBGX0tFWXYyIHNvY2tldCBmYW1pbHksIGNvbXBhdGlibGUgdG8gS0FNRSBvbmVzLgorCSAgVGhleSBhcmUgcmVxdWlyZWQgaWYgeW91IGFyZSBnb2luZyB0byB1c2UgSVBzZWMgdG9vbHMgcG9ydGVkCisJICBmcm9tIEtBTUUuCisKKwkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9MaW5kZW50IGIvc2NyaXB0cy9MaW5kZW50CmluZGV4IDM0ZWQ3ODUuLjdkOGQ4ODkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvTGluZGVudAorKysgYi9zY3JpcHRzL0xpbmRlbnQKQEAgLTEsMiArMSwyIEBACiAjIS9iaW4vc2gKLWluZGVudCAta3IgLWk4IC10czggLXNvYiAtbDgwIC1zcyAtbmNzICIkQCIKK2luZGVudCAtbnBybyAta3IgLWk4IC10czggLXNvYiAtbDgwIC1zcyAtbmNzICIkQCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCAzMjE5N2VmLi41MTgwNDA1IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPGN0eXBlLmg+CisKIHR5cGVkZWYgdWludDMyX3QJX191MzI7CiB0eXBlZGVmIHVpbnQxNl90CV9fdTE2OwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyCV9fdTg7CkBAIC0yODcsNiArMjg5LDU4IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qIExvb2tzIGxpa2U6IHBjbWNpYTptTmNOZk5mbk5wZm5OdmFOdmJOdmNOdmROLiAqLworc3RhdGljIGludCBkb19wY21jaWFfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkgICBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWQtPm1hbmZfaWQgPSBUT19OQVRJVkUoaWQtPm1hbmZfaWQpOworCWlkLT5jYXJkX2lkID0gVE9fTkFUSVZFKGlkLT5jYXJkX2lkKTsKKwlpZC0+ZnVuY19pZCA9IFRPX05BVElWRShpZC0+ZnVuY19pZCk7CisJaWQtPmZ1bmN0aW9uID0gVE9fTkFUSVZFKGlkLT5mdW5jdGlvbik7CisJaWQtPmRldmljZV9ubyA9IFRPX05BVElWRShpZC0+ZGV2aWNlX25vKTsKKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJaWQtPnByb2RfaWRfaGFzaFtpXSA9IFRPX05BVElWRShpZC0+cHJvZF9pZF9oYXNoW2ldKTsKKyAgICAgICB9CisKKyAgICAgICBzdHJjcHkoYWxpYXMsICJwY21jaWE6Iik7CisgICAgICAgQUREKGFsaWFzLCAibSIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfTUFORl9JRCwKKwkgICBpZC0+bWFuZl9pZCk7CisgICAgICAgQUREKGFsaWFzLCAiYyIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwKKwkgICBpZC0+Y2FyZF9pZCk7CisgICAgICAgQUREKGFsaWFzLCAiZiIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ19JRCwKKwkgICBpZC0+ZnVuY19pZCk7CisgICAgICAgQUREKGFsaWFzLCAiZm4iLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLAorCSAgIGlkLT5mdW5jdGlvbik7CisgICAgICAgQUREKGFsaWFzLCAicGZuIiwgaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8sCisJICAgaWQtPmRldmljZV9ubyk7CisgICAgICAgQUREKGFsaWFzLCAicGEiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxLCBpZC0+cHJvZF9pZF9oYXNoWzBdKTsKKyAgICAgICBBREQoYWxpYXMsICJwYiIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDIsIGlkLT5wcm9kX2lkX2hhc2hbMV0pOworICAgICAgIEFERChhbGlhcywgInBjIiwgaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMywgaWQtPnByb2RfaWRfaGFzaFsyXSk7CisgICAgICAgQUREKGFsaWFzLCAicGQiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQ0LCBpZC0+cHJvZF9pZF9oYXNoWzNdKTsKKworICAgICAgIHJldHVybiAxOworfQorCisKKworc3RhdGljIGludCBkb19vZl9lbnRyeSAoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mLCBjaGFyICphbGlhcykKK3sKKyAgICBjaGFyICp0bXA7CisgICAgc3ByaW50ZiAoYWxpYXMsICJvZjpOJXNUJXNDJXMiLAorICAgICAgICAgICAgICAgICAgICBvZi0+bmFtZVswXSA/IG9mLT5uYW1lIDogIioiLAorICAgICAgICAgICAgICAgICAgICBvZi0+dHlwZVswXSA/IG9mLT50eXBlIDogIioiLAorICAgICAgICAgICAgICAgICAgICBvZi0+Y29tcGF0aWJsZVswXSA/IG9mLT5jb21wYXRpYmxlIDogIioiKTsKKworICAgIC8qIFJlcGxhY2UgYWxsIHdoaXRlc3BhY2Ugd2l0aCB1bmRlcnNjb3JlcyAqLworICAgIGZvciAodG1wID0gYWxpYXM7IHRtcCAmJiAqdG1wOyB0bXArKykKKyAgICAgICAgaWYgKGlzc3BhY2UgKCp0bXApKQorICAgICAgICAgICAgKnRtcCA9ICdfJzsKKworICAgIHJldHVybiAxOworfQorCiAvKiBJZ25vcmUgYW55IHByZWZpeCwgZWcuIHY4NTAgcHJlcGVuZHMgXyAqLwogc3RhdGljIGlubGluZSBpbnQgc3ltX2lzKGNvbnN0IGNoYXIgKnN5bWJvbCwgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTM2Miw2ICs0MTYsMTMgQEAKIAllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3BucF9jYXJkX2RldmljZV90YWJsZSIpKQogCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQpLAogCQkJIGRvX3BucF9jYXJkX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfcGNtY2lhX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkKSwKKwkJCSBkb19wY21jaWFfZW50cnksIG1vZCk7CisgICAgICAgIGVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2Rfb2ZfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IG9mX2RldmljZV9pZCksCisJCQkgZG9fb2ZfZW50cnksIG1vZCk7CisKIH0KIAogLyogTm93IGFkZCBvdXQgYnVmZmVyZWQgaW5mb3JtYXRpb24gdG8gdGhlIGdlbmVyYXRlZCBDIHNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwppbmRleCA5MGE1NTFlLi5hMWY2YmFjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYworKysgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJaW50IGxvb3AsIHJldDsKIAogCWNvbnN0IHVuc2lnbmVkIGxpbWl0ID0KLQkJKFBBR0VfU0laRSAtIHNpemVvZigqa2xpc3QpKSAvIHNpemVvZihzdHJ1Y3Qga2V5KTsKKwkJKFBBR0VfU0laRSAtIHNpemVvZigqa2xpc3QpKSAvIHNpemVvZihzdHJ1Y3Qga2V5ICopOwogCiAJcmV0ID0gMDsKIApAQCAtMTUwLDcgKzE1MCw3IEBACiAJCQltYXggPSBsaW1pdDsKIAogCQlyZXQgPSAtRU5PTUVNOwotCQlzaXplID0gc2l6ZW9mKCprbGlzdCkgKyBzaXplb2Yoc3RydWN0IGtleSkgKiBtYXg7CisJCXNpemUgPSBzaXplb2YoKmtsaXN0KSArIHNpemVvZihzdHJ1Y3Qga2V5ICopICogbWF4OwogCQlrbGlzdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICgha2xpc3QpCiAJCQlnb3RvIGVycm9yOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCWtsaXN0LT5ua2V5cyA9IHNrbGlzdC0+bmtleXM7CiAJCW1lbWNweShrbGlzdC0+a2V5cywKIAkJICAgICAgIHNrbGlzdC0+a2V5cywKLQkJICAgICAgIHNrbGlzdC0+bmtleXMgKiBzaXplb2Yoc3RydWN0IGtleSkpOworCQkgICAgICAgc2tsaXN0LT5ua2V5cyAqIHNpemVvZihzdHJ1Y3Qga2V5ICopKTsKIAogCQlmb3IgKGxvb3AgPSBrbGlzdC0+bmtleXMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKIAkJCWF0b21pY19pbmMoJmtsaXN0LT5rZXlzW2xvb3BdLT51c2FnZSk7CkBAIC03ODMsNyArNzgzLDcgQEAKIAkJcmV0ID0gLUVORklMRTsKIAkJaWYgKG1heCA+IDY1NTM1KQogCQkJZ290byBlcnJvcjM7Ci0JCXNpemUgPSBzaXplb2YoKmtsaXN0KSArIHNpemVvZigqa2V5KSAqIG1heDsKKwkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKHN0cnVjdCBrZXkgKikgKiBtYXg7CiAJCWlmIChzaXplID4gUEFHRV9TSVpFKQogCQkJZ290byBlcnJvcjM7CiAKQEAgLTg5NSw3ICs4OTUsOCBAQAogCiBrZXlfaXNfcHJlc2VudDoKIAkvKiB3ZSBuZWVkIHRvIGNvcHkgdGhlIGtleSBsaXN0IGZvciBSQ1UgcHVycG9zZXMgKi8KLQlua2xpc3QgPSBrbWFsbG9jKHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKCprZXkpICoga2xpc3QtPm1heGtleXMsCisJbmtsaXN0ID0ga21hbGxvYyhzaXplb2YoKmtsaXN0KSArCisJCQkgc2l6ZW9mKHN0cnVjdCBrZXkgKikgKiBrbGlzdC0+bWF4a2V5cywKIAkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIW5rbGlzdCkKIAkJZ290byBub21lbTsKQEAgLTkwNSwxMiArOTA2LDEyIEBACiAJaWYgKGxvb3AgPiAwKQogCQltZW1jcHkoJm5rbGlzdC0+a2V5c1swXSwKIAkJICAgICAgICZrbGlzdC0+a2V5c1swXSwKLQkJICAgICAgIGxvb3AgKiBzaXplb2Yoa2xpc3QtPmtleXNbMF0pKTsKKwkJICAgICAgIGxvb3AgKiBzaXplb2Yoc3RydWN0IGtleSAqKSk7CiAKIAlpZiAobG9vcCA8IG5rbGlzdC0+bmtleXMpCiAJCW1lbWNweSgmbmtsaXN0LT5rZXlzW2xvb3BdLAogCQkgICAgICAgJmtsaXN0LT5rZXlzW2xvb3AgKyAxXSwKLQkJICAgICAgIChua2xpc3QtPm5rZXlzIC0gbG9vcCkgKiBzaXplb2Yoa2xpc3QtPmtleXNbMF0pKTsKKwkJICAgICAgIChua2xpc3QtPm5rZXlzIC0gbG9vcCkgKiBzaXplb2Yoc3RydWN0IGtleSAqKSk7CiAKIAkvKiBhZGp1c3QgdGhlIHVzZXIncyBxdW90YSAqLwogCWtleV9wYXlsb2FkX3Jlc2VydmUoa2V5cmluZywKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCAxN2ExMTg5Li42YmUyNzM4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSAiYXZjLmgiCiAjaW5jbHVkZSAib2Jqc2VjLmgiCkBAIC0xOTQzLDcgKzE5NDQsNyBAQAogCQl9CiAJfSB3aGlsZSAoKmluX2VuZCsrKTsKIAotCWNvcHlfcGFnZShpbl9zYXZlLCBub3NlY19zYXZlKTsKKwlzdHJjcHkoaW5fc2F2ZSwgbm9zZWNfc2F2ZSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vc2VjX3NhdmUpOwogb3V0OgogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKaW5kZXggM2IxZmFmYy4uN2JkOTVjZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL0tjb25maWcKKysrIGIvc291bmQvb3NzL0tjb25maWcKQEAgLTUyLDcgKzUyLDcgQEAKIAogY29uZmlnIFNPVU5EX0NNUENJX0pPWVNUSUNLCiAJYm9vbCAiRW5hYmxlIGpveXN0aWNrIgotCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJZGVwZW5kcyBvbiBTT1VORF9DTVBDSSAmJiBYODYgJiYgKEdBTUVQT1JUPXkgfHwgU09VTkRfQ01QQ0k9R0FNRVBPUlQpCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGpveXN0aWNrIHBvcnQgb24gYSBzb3VuZCBjYXJkIHVzaW5nCiAJICB0aGUgQ01JODMzOCBvciB0aGUgQ01JODczOCBjaGlwc2V0LiAgWW91IG5lZWQgdG8gY29uZmlnIHRoZQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eC5jIGIvc291bmQvb3NzL2NzNDZ4eC5jCmluZGV4IDllNDJhMWEuLmNiOTk4ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jczQ2eHguYworKysgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKQEAgLTQxNzQsNyArNDE3NCw3IEBACiAJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQogCQkJCXsKIAkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJCQkJY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCk7CisJCQkJCWNzNDZ4eF9zdXNwZW5kKGNhcmQsIFBNU0dfT04pOwogCQkJCX0KIAogCQkJfQpAQCAtNTc0OSw3ICs1NzQ5LDcgQEAKIAkJCWNhc2UgUE1fU1VTUEVORDoKIAkJCQlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8KIAkJCQkJImNzNDZ4eDogUE0gc3VzcGVuZCByZXF1ZXN0XG4iKSk7Ci0JCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCkpCisJCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgUE1TR19TVVNQRU5EKSkKIAkJCQl7CiAJCQkJICAgIENTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkiY3M0Nnh4OiBQTSBzdXNwZW5kIHJlcXVlc3QgcmVmdXNlZFxuIikpOwpAQCAtNTc3OSw3ICs1Nzc5LDcgQEAKIAlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKIAlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCiAJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKLQljczQ2eHhfc3VzcGVuZChzLCAwKTsKKwljczQ2eHhfc3VzcGVuZChzLCBzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKaW5kZXggMzMxMDg2Ni4uMjcwNGUxNSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCiBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqZW1lcmdlbmN5X2RiZG1hX2NtZDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAvKgogICogU3R1ZmYgZm9yIHJlc3RvcmluZyBhZnRlciBhIHNsZWVwLgogICovCkBAIC0yNjMsNyArMjYzLDcgQEAKIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgYXdhY3Nfc2xlZXBfbm90aWZpZXIgPSB7CiAJYXdhY3Nfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9TT1VORCwKIH07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogLyogZm9yIChzb2Z0KSBzYW1wbGUgcmF0ZSB0cmFuc2xhdGlvbnMgKi8KIGludCBleHBhbmRfYmFsOwkJLyogQmFsYW5jZSBmYWN0b3IgZm9yIGV4cGFuZGluZyAobm90IHZvbHVtZSEpICovCkBAIC02NzUsNyArNjc1LDcgQEAKIAlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOwogCWtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKTsKIAlrZnJlZShiZWVwX2J1Zik7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAlwbXVfdW5yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcigmYXdhY3Nfc2xlZXBfbm90aWZpZXIpOwogI2VuZGlmCiB9CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAvKgogICogU2F2ZSBzdGF0ZSB3aGVuIGdvaW5nIHRvIHNsZWVwLCByZXN0b3JlIGl0IGFmdGVyd2FyZHMuCiAgKi8KQEAgLTE1NTEsNyArMTU1MSw3IEBACiAJfQogCXJldHVybiBQQk9PS19TTEVFUF9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAKIC8qIEFsbCB0aGUgYnVyZ3VuZHkgZnVuY3Rpb25zOiAqLwpAQCAtMzA1Myw5ICszMDUzLDkgQEAKIAlpZiAoKHJlcz1zZXR1cF9iZWVwKCkpKQogCQlyZXR1cm4gcmVzIDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhd2Fjc19zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCS8qIFBvd2VyYm9va3MgaGF2ZSBvZGQgd2F5cyBvZiBlbmFibGluZyBpbnB1dHMgc3VjaCBhcwogCSAgIGFuIGV4cGFuc2lvbi1iYXkgQ0Qgb3Igc291bmQgZnJvbSBhbiBpbnRlcm5hbCBtb2RlbQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VzMTM3MC5jIGIvc291bmQvb3NzL2VzMTM3MC5jCmluZGV4IDg4NmY2MWMuLjg1MzgwODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lczEzNzAuYworKysgYi9zb3VuZC9vc3MvZXMxMzcwLmMKQEAgLTE2Miw2ICsxNjIsMTAgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQorI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLCisjZW5kaWYKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKQEAgLTM4NSw3ICszODksMTAgQEAKIAkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOwogCX0gbWlkaTsKIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCisKIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIH07CiAKQEAgLTI1NTQsMTAgKzI1NjEsNTUgQEAKIAl7IFNPVU5EX01JWEVSX1dSSVRFX09HQUlOLCAweDQwNDAgfQogfTsKIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKworc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcwX3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oMHgyMDAsIEpPWV9FWFRFTlQsICJlczEzNzAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTM3MDogam95c3RpY2sgaW8gcG9ydCAweDIwMCBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTM3MDogY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oMHgyMDAsIEpPWV9FWFRFTlQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzAiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKHMtPmRldikpOworCWdwLT5kZXYucGFyZW50ID0gJnMtPmRldi0+ZGV2OworCWdwLT5pbyA9IDB4MjAwOworCisJcy0+Y3RybCB8PSBDVFJMX0pZU1RLX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8gKyBFUzEzNzBfUkVHX0NPTlRST0wpOworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVzMTM3MF91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKKworCX0KK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGVzMTM3MF9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZXMxMzcwX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykgeyB9CisjZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBlczEzNzBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQogewogCXN0cnVjdCBlczEzNzBfc3RhdGUgKnM7Ci0Jc3RydWN0IGdhbWVwb3J0ICpncCA9IE5VTEw7CiAJbW1fc2VnbWVudF90IGZzOwogCWludCBpLCB2YWwsIHJldDsKIApAQCAtMjYwNiwyOCArMjY1OCwxNCBAQAogCS8qIG5vdGU6IHNldHRpbmcgQ1RSTF9TRVJSX0RJUyBpcyByZXBvcnRlZCB0byBicmVhawogCSAqIG1pYyBiaWFzIHNldHRpbmcgKGJ5IEtpbS5CZXJ0c0BmaXN1Yi5tYWlsLmFiYi5jb20pICovCiAJcy0+Y3RybCA9IENUUkxfQ0RDX0VOIHwgKERBQzJfU1JUT0RJVig4MDAwKSA8PCBDVFJMX1NIX1BDTEtESVYpIHwgKDEgPDwgQ1RSTF9TSF9XVFNSU0VMKTsKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5ULCAiZXMxMzcwIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGpveXN0aWNrIGlvIHBvcnQgMHgyMDAgaW4gdXNlXG4iKTsKLQl9IGVsc2UgaWYgKCEocy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7Ci0JCXJlbGVhc2VfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5UKTsKLQl9IGVsc2UgewotCQlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzAiKTsKLQkJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShzLT5kZXYpKTsKLQkJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7Ci0JCWdwLT5pbyA9IDB4MjAwOwotCQlzLT5jdHJsIHw9IENUUkxfSllTVEtfRU47Ci0JfQogCWlmIChsaW5lb3V0W2RldmluZGV4XSkKIAkJcy0+Y3RybCB8PSBDVFJMX1hDVEwwOwogCWlmIChtaWNiaWFzW2RldmluZGV4XSkKIAkJcy0+Y3RybCB8PSBDVFJMX1hDVEwxOwogCXMtPnNjdHJsID0gMDsKLQlwcmludGsoS0VSTl9JTkZPICJlczEzNzA6IGZvdW5kIGFkYXB0ZXIgYXQgaW8gJSNseCBpcnEgJXVcbiIKLQkgICAgICAgS0VSTl9JTkZPICJlczEzNzA6IGZlYXR1cmVzOiBqb3lzdGljayAlcywgbGluZSAlcywgbWljIGltcGVkYW5jZSAlc1xuIiwKLQkgICAgICAgcy0+aW8sIHMtPmlycSwgKHMtPmN0cmwgJiBDVFJMX0pZU1RLX0VOKSA/ICJvbiIgOiAib2ZmIiwKLQkgICAgICAgKHMtPmN0cmwgJiBDVFJMX1hDVEwwKSA/ICJvdXQiIDogImluIiwKLQkJICAgICAgIChzLT5jdHJsICYgQ1RSTF9YQ1RMMSkgPyAiMSIgOiAiMCIpOworCXByaW50ayhLRVJOX0lORk8gImVzMTM3MDogYWRhcHRlciBhdCBpbyAlI2x4IGlycSAldSwgbGluZSAlcywgbWljIGltcGVkYW5jZSAlc1xuIiwKKwkgICAgICAgcy0+aW8sIHMtPmlycSwgKHMtPmN0cmwgJiBDVFJMX1hDVEwwKSA/ICJvdXQiIDogImluIiwKKwkgICAgICAgKHMtPmN0cmwgJiBDVFJMX1hDVEwxKSA/ICIxIiA6ICIwIik7CiAJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLwogCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzBfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKIAkJcmV0ID0gcy0+ZGV2X2F1ZGlvOwpAQCAtMjY3Myw5ICsyNzExLDcgQEAKIAl9CiAJc2V0X2ZzKGZzKTsKIAotCS8qIHJlZ2lzdGVyIGdhbWVwb3J0ICovCi0JaWYgKGdwKQotCQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKwllczEzNzBfcmVnaXN0ZXJfZ2FtZXBvcnQocyk7CiAKIAkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCiAJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CkBAIC0yNjk3LDEwICsyNzMzLDYgQEAKICBlcnJfZGV2MToKIAlwcmludGsoS0VSTl9FUlIgImVzMTM3MDogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlyZWxlYXNlX3JlZ2lvbihzLT5nYW1lcG9ydC0+aW8sIEpPWV9FWFRFTlQpOwotCQlnYW1lcG9ydF9mcmVlX3BvcnQocy0+Z2FtZXBvcnQpOwotCX0KICBlcnJfaXJxOgogCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5UKTsKICBlcnJfcmVnaW9uOgpAQCAtMjcxOSwxMSArMjc1MSw3IEBACiAJb3V0bCgwLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsgLyogY2xlYXIgc2VyaWFsIGludGVycnVwdHMgKi8KIAlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKLQkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKLQkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7Ci0JfQorCWVzMTM3MF91bnJlZ2lzdGVyX2dhbWVwb3J0KHMpOwogCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5UKTsKIAl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOwogCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+ZGV2X21peGVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzEuYyBiL3NvdW5kL29zcy9lczEzNzEuYwppbmRleCA5MjY2Yjc3Li4xMmE1NmQ1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcxLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MS5jCkBAIC0xMzQsNiArMTM0LDEwIEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSworI2VuZGlmCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCkBAIC00NTQsNyArNDU4LDEwIEBACiAJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKIAl9IG1pZGk7CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiAJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKyNlbmRpZgorCiAJc3RydWN0IHNlbWFwaG9yZSBzZW07CiB9OwogCkBAIC0yNzg3LDEyICsyNzk0LDYzIEBACiAJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0KIH07CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzMTM3MV9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisJaW50IGdwaW87CisKKwlmb3IgKGdwaW8gPSAweDIxODsgZ3BpbyA+PSAweDIwMDsgZ3BpbyAtPSAweDA4KQorCQlpZiAocmVxdWVzdF9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCwgImVzMTM3MSIpKQorCQkJYnJlYWs7CisKKwlpZiAoZ3BpbyA8IDB4MjAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGZyZWUgam95c3RpY2sgYWRkcmVzcyBmb3VuZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzEgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgImlzYSUwNHgvZ2FtZXBvcnQwIiwgZ3Bpbyk7CisJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJZ3AtPmlvID0gZ3BpbzsKKworCXMtPmN0cmwgfD0gQ1RSTF9KWVNUS19FTiB8ICgoKGdwaW8gPj4gMykgJiBDVFJMX0pPWV9NQVNLKSA8PCBDVFJMX0pPWV9TSElGVCk7CisJb3V0bChzLT5jdHJsLCBzLT5pbyArIEVTMTM3MV9SRUdfQ09OVFJPTCk7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXMxMzcxX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCisJfQorfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZXMxMzcxX3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBlczEzNzFfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKKwogc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKIHsKIAlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOwotCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CiAJbW1fc2VnbWVudF90IGZzOwotCWludCBpLCBncGlvLCB2YWwsIHJlcyA9IC0xOworCWludCBpLCB2YWwsIHJlcyA9IC0xOwogCWludCBpZHg7CiAJdW5zaWduZWQgbG9uZyB0bW87CiAJc2lnbmVkIGxvbmcgdG1vMjsKQEAgLTI4ODMsMjMgKzI5NDEsNiBAQAogCQl9CiAJfQogCi0JZm9yIChncGlvID0gMHgyMTg7IGdwaW8gPj0gMHgyMDA7IGdwaW8gLT0gMHgwOCkKLQkJaWYgKHJlcXVlc3RfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQsICJlczEzNzEiKSkKLQkJCWJyZWFrOwotCi0JaWYgKGdwaW8gPCAweDIwMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBmcmVlIGpveXN0aWNrIGFkZHJlc3MgZm91bmRcbiIpOwotCX0gZWxzZSBpZiAoIShzLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwotCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKLQl9IGVsc2UgewotCQlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzEgR2FtZXBvcnQiKTsKLQkJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJpc2ElMDR4L2dhbWVwb3J0MCIsIGdwaW8pOwotCQlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKLQkJZ3AtPmlvID0gZ3BpbzsKLQkJcy0+Y3RybCB8PSBDVFJMX0pZU1RLX0VOIHwgKCgoZ3BpbyA+PiAzKSAmIENUUkxfSk9ZX01BU0spIDw8IENUUkxfSk9ZX1NISUZUKTsKLQl9Ci0KIAlzLT5zY3RybCA9IDA7CiAJY3NzciA9IDA7CiAJcy0+c3BkaWZfdm9sdW1lID0gLTE7CkBAIC0yOTY5LDkgKzMwMTAsNyBAQAogCS8qIHR1cm4gb24gUy9QRElGIG91dHB1dCBkcml2ZXIgaWYgcmVxdWVzdGVkICovCiAJb3V0bChjc3NyLCBzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CiAKLQkvKiByZWdpc3RlciBnYW1lcG9ydCAqLwotCWlmIChzLT5nYW1lcG9ydCkKLQkJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJZXMxMzcxX3JlZ2lzdGVyX2dhbWVwb3J0KHMpOwogCiAJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOwpAQCAtMjk4MCwxMyArMzAxOSw5IEBACiAJLyogaW5jcmVtZW50IGRldmluZGV4ICovCiAJaWYgKGRldmluZGV4IDwgTlJfREVWSUNFLTEpCiAJCWRldmluZGV4Kys7Ci0gICAgICAgCXJldHVybiAwOworCXJldHVybiAwOwogCiAgZXJyX2dwOgotCWlmIChzLT5nYW1lcG9ydCkgewotCQlyZWxlYXNlX3JlZ2lvbihzLT5nYW1lcG9ydC0+aW8sIEpPWV9FWFRFTlQpOwotCQlnYW1lcG9ydF9mcmVlX3BvcnQocy0+Z2FtZXBvcnQpOwotCX0KICNpZmRlZiBFUzEzNzFfREVCVUcKIAlpZiAocy0+cHMpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJlczEzNzEiLCBOVUxMKTsKQEAgLTMwMjUsMTEgKzMwNjAsNyBAQAogCW91dGwoMCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7IC8qIGNsZWFyIHNlcmlhbCBpbnRlcnJ1cHRzICovCiAJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CiAJZnJlZV9pcnEocy0+aXJxLCBzKTsKLQlpZiAocy0+Z2FtZXBvcnQpIHsKLQkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87Ci0JCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7Ci0JCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOwotCX0KKwllczEzNzFfdW5yZWdpc3Rlcl9nYW1lcG9ydChzKTsKIAlyZWxlYXNlX3JlZ2lvbihzLT5pbywgRVMxMzcxX0VYVEVOVCk7CiAJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKIAl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Vzc3NvbG8xLmMgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwppbmRleCBmYjA5MDY1Li5hNGVjYWIyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXNzc29sbzEuYworKysgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwpAQCAtMTUwLDYgKzE1MCwxMCBAQAogCiAjZGVmaW5lIEZNT0RFX0RNRk0gMHgxMAogCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNvbG8xX2RyaXZlcjsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjcsNyArMjMxLDkgQEAKIAkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOwogCX0gbWlkaTsKIAorI2lmIFNVUFBPUlRfSk9ZU1RJQ0sKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyODEsNiArMjI4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzb2xvMV9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIGludCBpb19wb3J0KQogewogCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CkBAIC0yMzA3LDYgKzIzMTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNvbG8xX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgR0FNRVBPUlRfRVhURU5UKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc29sbzFfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzLCBpbnQgaW9fcG9ydCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNvbG8xX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNvbG8xX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKIHsKIAlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnM7CkBAIC0yNDM4LDExICsyNDU4LDcgQEAKIAlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQocy0+ZGV2LCAweDYwLCAwKTsgLyogdHVybiBvZmYgRERNQSBjb250cm9sbGVyIGFkZHJlc3Mgc3BhY2UgKi8KIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKLQkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKLQkJcmVsZWFzZV9yZWdpb24oZ3BpbywgR0FNRVBPUlRfRVhURU5UKTsKLQl9CisJc29sbzFfdW5yZWdpc3Rlcl9nYW1lcG9ydChzKTsKIAlyZWxlYXNlX3JlZ2lvbihzLT5pb2Jhc2UsIElPQkFTRV9FWFRFTlQpOwogCXJlbGVhc2VfcmVnaW9uKHMtPnNiYmFzZStGTVNZTlRIX0VYVEVOVCwgU0JCQVNFX0VYVEVOVC1GTVNZTlRIX0VYVEVOVCk7CiAJcmVsZWFzZV9yZWdpb24ocy0+ZGRtYWJhc2UsIERETUFCQVNFX0VYVEVOVCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWFkMTYuYyBiL3NvdW5kL29zcy9tYWQxNi5jCmluZGV4IGE3MDY3ZjEuLmFhM2M1MGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9tYWQxNi5jCisrKyBiL3NvdW5kL29zcy9tYWQxNi5jCkBAIC01MCw5ICs1MCwxMiBAQAogI2luY2x1ZGUgInNiLmgiCiAjaW5jbHVkZSAibXB1NDAxLmgiCiAKKyNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQorI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLIDEKKyNlbmRpZgorCiBzdGF0aWMgaW50ICAgICAgbWFkMTZfY29uZjsKIHN0YXRpYyBpbnQgICAgICBtYWQxNl9jZHNlbDsKLXN0YXRpYyBzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0Owogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIAogI2RlZmluZSBDOTI4CTEKQEAgLTkwMiw2ICs5MDUsMTAgQEAKIAktMSwgLTEsIC0xLCAtMQogfTsKIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKworc3RhdGljIHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IG1hZDE2X3JlZ2lzdGVyX2dhbWVwb3J0KGludCBpb19wb3J0KQogewogCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgMSwgIm1hZDE2IGdhbWVwb3J0IikpIHsKQEAgLTkyNSw2ICs5MzIsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG1hZDE2X3VucmVnaXN0ZXJfZ2FtZXBvcnQodm9pZCkKK3sKKwlpZiAoZ2FtZXBvcnQpIHsKKwkJLyogdGhlIGdhbWVwb3J0IHdhcyBpbml0aWFsaXplZCBzbyB3ZSBtdXN0IGZyZWUgaXQgdXAgKi8KKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGdhbWVwb3J0KTsKKwkJZ2FtZXBvcnQgPSBOVUxMOworCQlyZWxlYXNlX3JlZ2lvbigweDIwMSwgMSk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1hZDE2X3JlZ2lzdGVyX2dhbWVwb3J0KGludCBpb19wb3J0KSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbWFkMTZfdW5yZWdpc3Rlcl9nYW1lcG9ydCh2b2lkKSB7IH0KKyNlbmRpZgorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X21hZDE2KHZvaWQpCiB7CiAJaW50IGRtYXR5cGUgPSAwOwpAQCAtMTA2MCwxMiArMTA4MSw3IEBACiB7CiAJaWYgKGZvdW5kX21wdSkKIAkJdW5sb2FkX21hZDE2X21wdSgmY2ZnX21wdSk7Ci0JaWYgKGdhbWVwb3J0KSB7Ci0JCS8qIHRoZSBnYW1lcG9ydCB3YXMgaW5pdGlhbGl6ZWQgc28gd2UgbXVzdCBmcmVlIGl0IHVwICovCi0JCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChnYW1lcG9ydCk7Ci0JCWdhbWVwb3J0ID0gTlVMTDsKLQkJcmVsZWFzZV9yZWdpb24oMHgyMDEsIDEpOwotCX0KKwltYWQxNl91bnJlZ2lzdGVyX2dhbWVwb3J0KCk7CiAJdW5sb2FkX21hZDE2KCZjZmcpOwogCXJlbGVhc2VfcmVnaW9uKE1DMF9QT1JULCAxMik7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jIGIvc291bmQvb3NzL3NvbmljdmliZXMuYwppbmRleCAwNjA0N2U3Li4xN2QwZTQ2IDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCisrKyBiL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMKQEAgLTEyMiw2ICsxMjIsOSBAQAogCiAjaW5jbHVkZSAiZG0uaCIKIAorI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zNjUsNyArMzY4LDkgQEAKIAkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOwogCX0gbWlkaTsKIAorI2lmIFNVUFBPUlRfSk9ZU1RJQ0sKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI0ODUsNiArMjQ5MCw3IEBACiAjZGVmaW5lIFJTUkNJU0lPUkVHSU9OKGRldixudW0pIChwY2lfcmVzb3VyY2Vfc3RhcnQoKGRldiksIChudW0pKSAhPSAwICYmIFwKIAkJCQkgKHBjaV9yZXNvdXJjZV9mbGFncygoZGV2KSwgKG51bSkpICYgSU9SRVNPVVJDRV9JTykpCiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdl9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBpb19wb3J0KQogewogCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CkBAIC0yNTExLDYgKzI1MTcsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHN2X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHN2X3N0YXRlICpzKQoreworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgU1ZfRVhURU5UX0dBTUUpOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzdl9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBpb19wb3J0KSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3ZfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMpIHsgfQorI2VuZGlmIC8qIFNVUFBPUlRfSk9ZU1RJQ0sgKi8KKwogc3RhdGljIGludCBfX2RldmluaXQgc3ZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQogewogCXN0YXRpYyBjaGFyIF9fZGV2aW5pdGRhdGEgc3ZfZGRtYV9uYW1lW10gPSAiUzMgSW5jLiBTb25pY1ZpYmVzIERETUEgQ29udHJvbGxlciI7CkBAIC0yNzExLDExICsyNzMwLDcgQEAKIAkvKm91dGIoMCwgcy0+aW9kbWFhICsgU1ZfRE1BX1JFU0VUKTsqLwogCS8qb3V0YigwLCBzLT5pb2RtYWMgKyBTVl9ETUFfUkVTRVQpOyovCiAJZnJlZV9pcnEocy0+aXJxLCBzKTsKLQlpZiAocy0+Z2FtZXBvcnQpIHsKLQkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87Ci0JCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7Ci0JCXJlbGVhc2VfcmVnaW9uKGdwaW8sIFNWX0VYVEVOVF9HQU1FKTsKLQl9CisJc3ZfdW5yZWdpc3Rlcl9nYW1lcG9ydChzKTsKIAlyZWxlYXNlX3JlZ2lvbihzLT5pb2RtYWMsIFNWX0VYVEVOVF9ETUEpOwogCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSk7CiAJcmVsZWFzZV9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKaW5kZXggNDc1MzdmMC4uNWYwYWQ2YiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3RyaWRlbnQuYworKysgYi9zb3VuZC9vc3MvdHJpZGVudC5jCkBAIC0yMjgsNiArMjI4LDEwIEBACiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKIAorI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCisKIC8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIFRSSURFTlRfQ0FSRF9NQUdJQwkweDUwNzI2OTZFCS8qICJQcmluIiAqLwogI2RlZmluZSBUUklERU5UX1NUQVRFX01BR0lDCTB4NjM2NTczNzMJLyogImNlc3MiICovCkBAIC00MjUyLDI0ICs0MjU2LDI1IEBACiAJcmV0dXJuIG51bV9hYzk3ICsgMTsKIH0KIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIC8qIEdhbWVwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIGNhcmRzIEFEQyBnYW1lcG9ydCAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotdHJpZGVudF9nYW1lX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCiB7CiAJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKIAlyZXR1cm4gaW5iKFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwogfQogCi1zdGF0aWMgdm9pZAotdHJpZGVudF9nYW1lX3RyaWdnZXIoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKK3N0YXRpYyB2b2lkIHRyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCiB7CiAJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKIAlvdXRiKDB4ZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwogfQogCi1zdGF0aWMgaW50Ci10cmlkZW50X2dhbWVfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCitzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LAorCQkJCSAgICBpbnQgKmF4ZXMsIGludCAqYnV0dG9ucykKIHsKIAlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKIAlpbnQgaTsKQEAgLTQyODUsOCArNDI5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXRyaWRlbnRfZ2FtZV9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCBtb2RlKQorc3RhdGljIGludCB0cmlkZW50X2dhbWVfb3BlbihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKIApAQCAtNDMwNSw4ICs0MzA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKLXRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOwogCkBAIC00MzMwLDYgKzQzMzMsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWlmIChjYXJkLT5nYW1lcG9ydCkKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNhcmQtPmdhbWVwb3J0KTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKIC8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgKi8gCiAvKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAogLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCkBAIC00NTY5LDggKzQ1ODMsNyBAQAogCX0KIAogCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KLQlpZiAoY2FyZC0+Z2FtZXBvcnQpCi0JCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7CisJdHJpZGVudF91bnJlZ2lzdGVyX2dhbWVwb3J0KGNhcmQpOwogCiAJLyogS2lsbCBpbnRlcnJ1cHRzLCBhbmQgU1AvRElGICovCiAJdHJpZGVudF9kaXNhYmxlX2xvb3BfaW50ZXJydXB0cyhjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwppbmRleCBiMzg3ZTFlNS4uODNlZGRhOSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3ZpYTgyY3h4eF9hdWRpby5jCisrKyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtMzM5MSwxMCArMzM5MiwxMCBAQAogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X2Rpc2FibGU7CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX291dF9yZXM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X3JlczsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2J0ODd4LmMgYi9zb3VuZC9wY2kvYnQ4N3guYwppbmRleCBkZWZkYzVhLi5jNTU1N2VhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYnQ4N3guYworKysgYi9zb3VuZC9wY2kvYnQ4N3guYwpAQCAtNzk4LDEzICs3OTgsMTUgQEAKIAl7MHgyNzBmLCAweGZjMDB9LCAvKiBDaGFpbnRlY2ggRGlnaXRvcCBEU1QtMTAwMCBEVkItUyAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcjsKKwogLyogcmV0dXJuIHRoZSByYXRlIG9mIHRoZSBjYXJkLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGl0J3MgYmxhY2tsaXN0ZWQgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9idDg3eF9kZXRlY3RfY2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewogCWludCBpOwogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpzdXBwb3J0ZWQ7CiAKLQlzdXBwb3J0ZWQgPSBwY2lfbWF0Y2hfZGV2aWNlKHNuZF9idDg3eF9pZHMsIHBjaSk7CisJc3VwcG9ydGVkID0gcGNpX21hdGNoX2RldmljZSgmZHJpdmVyLCBwY2kpOwogCWlmIChzdXBwb3J0ZWQpCiAJCXJldHVybiBzdXBwb3J0ZWQtPmRyaXZlcl9kYXRhOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKaW5kZXggYjZlMTg1NC4uZWIzYzUyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDI4MS5jCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtMTMzOCwxMSArMTMzOCw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX2NzNDI4MV9mcmVlX2dhbWVwb3J0KGNzNDI4MV90ICpjaGlwKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfR0FNRVBPUlQgfHwgKE1PRFVMRSAmJiBDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSAqLwogCi0KLS8qCi0KLSAqLwotCiBzdGF0aWMgaW50IHNuZF9jczQyODFfZnJlZShjczQyODFfdCAqY2hpcCkKIHsKIAlzbmRfY3M0MjgxX2ZyZWVfZ2FtZXBvcnQoY2hpcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYwppbmRleCBmNzJjODFjLi5kNjkxOGI0IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KICNpbmNsdWRlICJwZGF1ZGlvY2YuaCIKQEAgLTE3MSwxNCArMTcwLDYgQEAKIAogCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPSAKLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwKLSNpZmRlZiBDT05GSUdfUE0KLQkJfCBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQKLQkJfCBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FCi0jZW5kaWYKLQkJOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwZGFjZl9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIApAQCAtMzgwLDEzICszNzEsMjEgQEAKIC8qCiAgKiBNb2R1bGUgZW50cnkgcG9pbnRzCiAgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBzbmRfcGRhY2ZfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTVkLCAweDRjNDUpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzbmRfcGRhY2ZfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHBkYWNmX2NzX2RyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJ2ICAgICAgICAgICAgPSB7Ci0JCS5uYW1lICAgPSAic25kLXBkYXVkaW9jZiIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJzbmQtcGRhdWRpb2NmIiwKIAl9LAotCS5hdHRhY2ggICAgICAgICA9IHNuZF9wZGFjZl9hdHRhY2gsCi0JLmRldGFjaCAgICAgICAgID0gc25kX3BkYWNmX2RldGFjaAorCS5hdHRhY2gJCT0gc25kX3BkYWNmX2F0dGFjaCwKKwkuZXZlbnQJCT0gcGRhY2ZfZXZlbnQsCisJLmRldGFjaAkJPSBzbmRfcGRhY2ZfZGV0YWNoLAorCS5pZF90YWJsZQk9IHNuZF9wZGFjZl9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BkYWNmKHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhfZW50cnkuYyBiL3NvdW5kL3BjbWNpYS92eC92eF9lbnRyeS5jCmluZGV4IDMzMmJiY2EuLmRmN2EzOWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eF9lbnRyeS5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eF9lbnRyeS5jCkBAIC0zNSw3ICszNSw2IEBACiAgKiBwcm90b3R5cGVzCiAgKi8KIHN0YXRpYyB2b2lkIHZ4cG9ja2V0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKLXN0YXRpYyBpbnQgdnhwb2NrZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOwogCiAKIHN0YXRpYyB2b2lkIHZ4cG9ja2V0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKQEAgLTE2OSwxNCArMTY4LDYgQEAKIAkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KIAltZW1zZXQoJmNsaWVudF9yZWcsIDAsIHNpemVvZihjbGllbnRfcmVnKSk7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9IGh3LT5kZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9IAotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTAotI2lmZGVmIENPTkZJR19QTQotCQl8IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVAotCQl8IENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUUKLSNlbmRpZgotCQk7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnZ4cG9ja2V0X2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC0zMjEsNyArMzEyLDcgQEAKIC8qCiAgKiBldmVudCBjYWxsYmFjawogICovCi1zdGF0aWMgaW50IHZ4cG9ja2V0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoraW50IHZ4cG9ja2V0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQogewogCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKIAl2eF9jb3JlX3QgKmNoaXAgPSBsaW5rLT5wcml2OwpAQCAtMzgwLDQgKzM3MSw1IEBACiAgKi8KIEVYUE9SVF9TWU1CT0woc25kX3Z4cG9ja2V0X29wcyk7CiBFWFBPUlRfU1lNQk9MKHNuZF92eHBvY2tldF9hdHRhY2gpOworRVhQT1JUX1NZTUJPTCh2eHBvY2tldF9ldmVudCk7CiBFWFBPUlRfU1lNQk9MKHNuZF92eHBvY2tldF9kZXRhY2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBmY2UyYWQwLi42MmQ2ZmExIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMTgsMjMgKzE4LDExIEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKLS8qCi0gcGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIGFzIC9ldGMvcGNtY2lhL3Z4cG9ja2V0LmNvbmY6Ci0gCi0gIGRldmljZSAic25kLXZ4cG9ja2V0IgotICAgICBjbGFzcyAiYXVkaW8iIG1vZHVsZSAic25kLXZ4cG9ja2V0IgotCi0gIGNhcmQgIkRpZ2lncmFtIFZYLVBPQ0tFVCIKLSAgICBtYW5maWQgMHgwMWYxLCAweDAxMDAKLSAgICBiaW5kICJzbmQtdnhwb2NrZXQiCi0KLSAqLwogCiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSAidnhwb2NrZXQuaCIKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTE0MCwxMyArMTI4LDIwIEBACiAgKiBNb2R1bGUgZW50cnkgcG9pbnRzCiAgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHZ4cF9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxZjEsIDB4MDEwMCksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHZ4cF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdnhwX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gREVWX0lORk8sCiAJfSwKIAkuYXR0YWNoCQk9IHZ4cF9hdHRhY2gsCi0JLmRldGFjaAkJPSB2eHBfZGV0YWNoCisJLmRldGFjaAkJPSB2eHBfZGV0YWNoLAorCS5pZF90YWJsZQk9IHZ4cF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3Z4cG9ja2V0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvYXdhY3MuYyBiL3NvdW5kL3BwYy9hd2Fjcy5jCmluZGV4IGUwNTJiZDAuLjA2MWU1MmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9hd2Fjcy5jCisrKyBiL3NvdW5kL3BwYy9hd2Fjcy5jCkBAIC05MCw3ICs5MCw3IEBACiAJc25kX3BtYWNfYXdhY3Nfd3JpdGUoY2hpcCwgdmFsIHwgKHJlZyA8PCAxMikpOwogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIC8qIFJlY2FsaWJyYXRlIGNoaXAgKi8KIHN0YXRpYyB2b2lkIHNjcmVhbWVyX3JlY2FsaWJyYXRlKHBtYWNfdCAqY2hpcCkKIHsKQEAgLTY0Miw3ICs2NDIsNyBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdm9pZCBzbmRfcG1hY19hd2Fjc19zdXNwZW5kKHBtYWNfdCAqY2hpcCkKIHsKIAlzbmRfcG1hY19hd2Fjc193cml0ZV9ub3JlZyhjaGlwLCAxLCAoY2hpcC0+YXdhY3NfcmVnWzFdCkBAIC02NzYsNyArNjc2LDcgQEAKIAl9CiAjZW5kaWYKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAjaWZkZWYgUE1BQ19TVVBQT1JUX0FVVE9NVVRFCiAvKgpAQCAtODgzLDcgKzg4Myw3IEBACiAJICogc2V0IGxvd2xldmVsIGNhbGxiYWNrcwogCSAqLwogCWNoaXAtPnNldF9mb3JtYXQgPSBzbmRfcG1hY19hd2Fjc19zZXRfZm9ybWF0OwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJY2hpcC0+c3VzcGVuZCA9IHNuZF9wbWFjX2F3YWNzX3N1c3BlbmQ7CiAJY2hpcC0+cmVzdW1lID0gc25kX3BtYWNfYXdhY3NfcmVzdW1lOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvZGFjYS5jIGIvc291bmQvcHBjL2RhY2EuYwppbmRleCBmMjRhOTE2Li5hNzM3ZjI5IDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvZGFjYS5jCisrKyBiL3NvdW5kL3BwYy9kYWNhLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogfTsKIAogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIGRhY2FfcmVzdW1lKHBtYWNfdCAqY2hpcCkKIHsKIAlwbWFjX2RhY2FfdCAqbWl4ID0gY2hpcC0+bWl4ZXJfZGF0YTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQkJCSAgbWl4LT5hbXBfb24gPyAweDA1IDogMHgwNCk7CiAJZGFjYV9zZXRfdm9sdW1lKG1peCk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCiBzdGF0aWMgdm9pZCBkYWNhX2NsZWFudXAocG1hY190ICpjaGlwKQpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJY2hpcC0+cmVzdW1lID0gZGFjYV9yZXN1bWU7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3BtYWMuYyBiL3NvdW5kL3BwYy9wbWFjLmMKaW5kZXggMDgwZWYzOS4uNzViOGI3NCAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3BtYWMuYworKysgYi9zb3VuZC9wcGMvcG1hYy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BNQUNfUEJPT0spCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHNuZF9wbWFjX3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKHBtYWNfdCAqY2hpcCk7CiBzdGF0aWMgaW50IHNuZF9wbWFjX3VucmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIocG1hY190ICpjaGlwKTsKIHN0YXRpYyBpbnQgc25kX3BtYWNfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpAQCAtNzgyLDcgKzc4Miw3IEBACiAJfQogCiAJc25kX3BtYWNfc291bmRfZmVhdHVyZShjaGlwLCAwKTsKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUE1BQ19QQk9PSykKKyNpZmRlZiBDT05GSUdfUE0KIAlzbmRfcG1hY191bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKGNoaXApOwogI2VuZGlmCiAKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAJLyogUmVzZXQgZGJkbWEgY2hhbm5lbHMgKi8KIAlzbmRfcG1hY19kYmRtYV9yZXNldChjaGlwKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDX1BCT09LKQorI2lmZGVmIENPTkZJR19QTQogCS8qIGFkZCBzbGVlcCBub3RpZmllciAqLwogCWlmICghIHNuZF9wbWFjX3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKGNoaXApKQogCQlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2hpcC0+Y2FyZCwgc25kX3BtYWNfc3VzcGVuZCwgc25kX3BtYWNfcmVzdW1lLCBjaGlwKTsKQEAgLTEzMTYsNyArMTMxNiw3IEBACiAgKiBzbGVlcCBub3RpZnkgZm9yIHBvd2VyYm9vawogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUE1BQ19QQk9PSykKKyNpZmRlZiBDT05GSUdfUE0KIAogLyoKICAqIFNhdmUgc3RhdGUgd2hlbiBnb2luZyB0byBzbGVlcCwgcmVzdG9yZSBpdCBhZnRlcndhcmRzLgpAQCAtMTQxNCw0ICsxNDE0LDUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvcG1hYy5oIGIvc291bmQvcHBjL3BtYWMuaAppbmRleCAwYTg0YzA1Li41ODJkYjUyIDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvcG1hYy5oCisrKyBiL3NvdW5kL3BwYy9wbWFjLmgKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXZvaWQgKCpzZXRfZm9ybWF0KShwbWFjX3QgKmNoaXApOwogCXZvaWQgKCp1cGRhdGVfYXV0b211dGUpKHBtYWNfdCAqY2hpcCwgaW50IGRvX25vdGlmeSk7CiAJaW50ICgqZGV0ZWN0X2hlYWRwaG9uZSkocG1hY190ICpjaGlwKTsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogCXZvaWQgKCpzdXNwZW5kKShwbWFjX3QgKmNoaXApOwogCXZvaWQgKCpyZXN1bWUpKHBtYWNfdCAqY2hpcCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy90dW1ibGVyLmMgYi9zb3VuZC9wcGMvdHVtYmxlci5jCmluZGV4IDkzMzIyMzcuLjM2YzVkNWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy90dW1ibGVyLmMKKysrIGIvc291bmQvcHBjL3R1bWJsZXIuYwpAQCAtMTEyOCw3ICsxMTI4LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyogc3VzcGVuZCBtaXhlciAqLwogc3RhdGljIHZvaWQgdHVtYmxlcl9zdXNwZW5kKHBtYWNfdCAqY2hpcCkKIHsKQEAgLTEzNzAsNyArMTM3MCw3IEBACiAJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBjaGlwLT5kcmNfc3dfY3RsKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAljaGlwLT5zdXNwZW5kID0gdHVtYmxlcl9zdXNwZW5kOwogCWNoaXAtPnJlc3VtZSA9IHR1bWJsZXJfcmVzdW1lOwogI2VuZGlmCg==